diff --git a/.github/workflows/common_check.yaml b/.github/workflows/common_check.yaml new file mode 100644 index 0000000..7568ffd --- /dev/null +++ b/.github/workflows/common_check.yaml @@ -0,0 +1,57 @@ +name: Code Quality +# Controls when the action will run. +on: + # Triggers the workflow on push or pull request events but only for the master branch + push: + branches: [ master, main ] + pull_request: + branches: [ master, main ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + check: + strategy: + fail-fast: false + matrix: + python-version: ["3.11",] + poetry-version: ["1.3.2"] + os: [ubuntu-20.04,] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + - name: Install and configure Poetry + uses: snok/install-poetry@v1 + with: + version: ${{ matrix.poetry-version }} + virtualenvs-create: true + installer-parallel: true + - name: Install + run: | + poetry install + + - name: Format + run: | + make fmt + + - name: Lint + run: | + make lint + + - name: Tests + run: | + make test + + - name: Lock + run: | + poetry lock + + - name: Ensure lockfile is up to date + run: | + git diff --exit-code + diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..14762ea --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,66 @@ +# Publish package on main branch if it's tagged with 'v*' + +name: release & publish workflow + +# Controls when the action will run. +on: + # Triggers the workflow on push events but only for the master branch + push: + tags: + - 'v*' + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "release" + release: + name: Create Release + runs-on: ubuntu-20.04 + + strategy: + matrix: + python-versions: ["3.11"] + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + - name: Get version from tag + id: tag_name + run: | + echo ::set-output name=current_version::${GITHUB_REF#refs/tags/v} + shell: bash + + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + + - uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-versions }} + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install poetry + + - name: Build wheels and source tarball + run: >- + poetry build + + - name: create github release + id: create_release + uses: softprops/action-gh-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} + with: + body: ${{ steps.changelog_reader.outputs.changes }} + files: dist/*.whl + draft: false + prerelease: false + + - name: publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + user: __token__ + password: ${{ secrets.PYPI_API_TOKEN }} + skip_existing: true diff --git a/.gitignore b/.gitignore index e8cef0a..ebe7d44 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.nix-venv # Taken from https://github.com/github/gitignore/blob/dd9c41b6088bb200e53d4c4ba4d72f8218b2e898/Python.gitignore # Byte-compiled / optimized / DLL files @@ -154,4 +155,4 @@ cython_debug/ #.idea/ # MacOS -.DS_Store \ No newline at end of file +.DS_Store diff --git a/README.md b/README.md index 2e05f74..b6692c5 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,9 @@ See release on PyPI: https://pypi.org/project/balpy/ ```bash # Install in virtual environment using poetry git clone https://github.com/balancer-labs/balpy.git +# checkout submodules +git submodule update --init --recursive + cd balpy poetry install # Install dependencies and package # You can enter the virtual environment using @@ -62,3 +65,32 @@ You also must set AT LEAST one of these environment variables to connect to the ## Samples See README.md in samples/ for more information. + +## DEV + +# Formatting + +```bash +make fmt +``` + +## Linting + +```bash +make lint +``` + +Check all linters and formaters and tests. + +## Tests + +A small number of tests are included for functionaly demonstration. + +```bash +make test +``` + + + +```bash +make all diff --git a/balpy/__init__.py b/balpy/__init__.py index e7f8991..e69de29 100644 --- a/balpy/__init__.py +++ b/balpy/__init__.py @@ -1,3 +0,0 @@ -from .balancerErrors import handleException -from balpy import balpy - diff --git a/balpy/balancer-deployments b/balpy/balancer-deployments deleted file mode 160000 index 3269cdf..0000000 --- a/balpy/balancer-deployments +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3269cdf9e1eee30f807ca208133e5ff7e58b365a diff --git a/balpy/balancer-deployments/.eslintignore b/balpy/balancer-deployments/.eslintignore new file mode 100644 index 0000000..f06235c --- /dev/null +++ b/balpy/balancer-deployments/.eslintignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/balpy/balancer-deployments/.eslintrc.js b/balpy/balancer-deployments/.eslintrc.js new file mode 100644 index 0000000..44a3e36 --- /dev/null +++ b/balpy/balancer-deployments/.eslintrc.js @@ -0,0 +1,11 @@ +module.exports = { + root: true, + parser: "@typescript-eslint/parser", + plugins: ["@typescript-eslint", "prettier", "mocha-no-only"], + extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"], + rules: { + "comma-spacing": ["error", {before: false, after: true}], + "prettier/prettier": "error", + "mocha-no-only/mocha-no-only": ["error"], + }, +}; diff --git a/balpy/balancer-deployments/.github/PULL_REQUEST_TEMPLATE/deployment-preparation-template.md b/balpy/balancer-deployments/.github/PULL_REQUEST_TEMPLATE/deployment-preparation-template.md new file mode 100644 index 0000000..b9d95ca --- /dev/null +++ b/balpy/balancer-deployments/.github/PULL_REQUEST_TEMPLATE/deployment-preparation-template.md @@ -0,0 +1,29 @@ +# Deployment preparation: + + + +## Deployment preparation tasks checklist: + +- [ ] Deployments `README` is updated with the new task name and link +- [ ] Task `README` has a description and links to the artifacts +- [ ] `build-info` is updated with artifacts compiled at the specified commit +- [ ] Artifacts are generated from `build-info` +- [ ] New task has a working fork test + +## Deprecating old tasks checklist: + +- [ ] Old task was moved to `deprecated/` directory +- [ ] Deployments `README` is updated: old task is moved to the 'deprecated' section, and links are updated with the `deprecated/` prefix +- [ ] Old task imports in `index.ts`, `input.ts` and fork tests are updated +- [ ] Old task `README` is updated with a warning sign, a link to the replacement task and a short description + +## Code checklist: + +- [ ] The diff is legible and has no extraneous changes +- [ ] Complex code has been commented in tests and scripts +- [ ] Fork test block number and test cases are appropriate for this deployment +- [ ] The base branch is either `master`, or there's a description of how to merge + +## Issue Resolution + + diff --git a/balpy/balancer-deployments/.github/PULL_REQUEST_TEMPLATE/deployment-template.md b/balpy/balancer-deployments/.github/PULL_REQUEST_TEMPLATE/deployment-template.md new file mode 100644 index 0000000..c2ab585 --- /dev/null +++ b/balpy/balancer-deployments/.github/PULL_REQUEST_TEMPLATE/deployment-template.md @@ -0,0 +1,16 @@ +# Deployment: + +## Deployment tasks checklist: + +- [ ] Contract(s) deployed to all target networks / testnets +- [ ] TX IDs are properly generated +- [ ] Action IDs are generated after deployment (if applicable) +- [ ] Outputs for all target networks are generated, and linked in the task `readme` +- [ ] Addresses files are up to date with the new deployment +- [ ] Contracts are verified in every network +- [ ] Deployments `CHANGELOG` is updated +- [ ] There are no code changes of any kind + +## Issue Resolution + + diff --git a/balpy/balancer-deployments/.github/actions/check-network-action-ids/action.yml b/balpy/balancer-deployments/.github/actions/check-network-action-ids/action.yml new file mode 100644 index 0000000..583e753 --- /dev/null +++ b/balpy/balancer-deployments/.github/actions/check-network-action-ids/action.yml @@ -0,0 +1,16 @@ +name: 'Check Action IDs' +inputs: + network-name: + required: true +runs: + using: "composite" + steps: + - uses: actions/checkout@v3 + - name: Set up environment + uses: ./.github/actions/setup + - name: Prepare Config + run: yarn ci:prepare-config + shell: bash + - name: Check Action IDs + run: yarn check-network-action-ids ${{ inputs.network-name }} + shell: bash diff --git a/balpy/balancer-deployments/.github/actions/check-network-deployments/action.yml b/balpy/balancer-deployments/.github/actions/check-network-deployments/action.yml new file mode 100644 index 0000000..281b710 --- /dev/null +++ b/balpy/balancer-deployments/.github/actions/check-network-deployments/action.yml @@ -0,0 +1,16 @@ +name: 'Check Deployment Addresses' +inputs: + network-name: + required: true +runs: + using: "composite" + steps: + - uses: actions/checkout@v3 + - name: Set up environment + uses: ./.github/actions/setup + - name: Prepare Config + run: yarn ci:prepare-config + shell: bash + - name: Check Deployment Addresses + run: yarn check-network-deployments ${{ inputs.network-name }} + shell: bash diff --git a/balpy/balancer-deployments/.github/actions/setup/action.yml b/balpy/balancer-deployments/.github/actions/setup/action.yml new file mode 100644 index 0000000..cc96960 --- /dev/null +++ b/balpy/balancer-deployments/.github/actions/setup/action.yml @@ -0,0 +1,19 @@ +name: Setup + +runs: + using: composite + steps: + - name: Install node + uses: actions/setup-node@v3 + with: + node-version: 18.15 + - name: Cache + uses: actions/cache@v3 + id: cache + with: + path: '**/node_modules' + key: yarn-v1-${{ hashFiles('**/yarn.lock') }} + - name: Install + run: yarn --immutable + shell: bash + if: steps.cache.outputs.cache-hit != 'true' diff --git a/balpy/balancer-deployments/.github/pull_request_template.md b/balpy/balancer-deployments/.github/pull_request_template.md new file mode 100644 index 0000000..7bcbcce --- /dev/null +++ b/balpy/balancer-deployments/.github/pull_request_template.md @@ -0,0 +1,31 @@ + + + +* [Deployment preparation template](?expand=1&template=deployment-preparation-template.md) +* [Deployment template](?expand=1&template=deployment-template.md) + +# Description + + + + +## Type of change + +- [ ] Bug fix +- [ ] New feature +- [ ] Breaking change +- [ ] Dependency changes +- [ ] Code refactor / cleanup +- [ ] Documentation or wording changes +- [ ] Other + +## Checklist: + +- [ ] The diff is legible and has no extraneous changes +- [ ] Complex code has been commented, including external interfaces +- [ ] Tests are included for all code paths +- [ ] The base branch is either `master`, or there's a description of how to merge + +## Issue Resolution + + diff --git a/balpy/balancer-deployments/.github/workflows/ci.yml b/balpy/balancer-deployments/.github/workflows/ci.yml new file mode 100644 index 0000000..2e787b2 --- /dev/null +++ b/balpy/balancer-deployments/.github/workflows/ci.yml @@ -0,0 +1,67 @@ +name: CI + +env: + CI: true + +on: + push: + branches: + - master + pull_request: + branches: ['*', '**/*'] + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up environment + uses: ./.github/actions/setup + - name: Lint + run: yarn lint + + test-fork: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Install node + uses: actions/setup-node@v3 + with: + node-version: 18.15 + - name: Cache + uses: actions/cache@v3 + id: cache + with: + path: '**/node_modules' + key: yarn-v1-${{ hashFiles('**/yarn.lock') }} + - name: Install + run: yarn --immutable + if: steps.cache.outputs.cache-hit != 'true' + - name: Forked Network Cache + # Hardhat caches node requests when working with forked networks (e.g. when querying contract code, storage, + # etc.) to save time in future runs. We cache this directory across runs. + # This cache action is special for a couple reasons, which originate from a) it not occupying much disk size, + # and b) the cache never being invalid (as past blockchain data is immutable). We therefore: + # - save the cache even on action failure (which may be caused due to a timeout), even if this could result in + # some wasted space. For this we use the always-upload-cache fork of the basic action. + # - use a different key on every single run, causing for the cache to always be saved. + # - use a wildcard as a restore key, which will cause all stored keys to match and the most recent one to be + # selected. + uses: pat-s/always-upload-cache@v3 + id: cache-forked-network + with: + path: 'src/helpers/.hardhat/cache/hardhat-network-fork/**' + key: hardhat-network-fork-${{ github.run_number }}-${{ github.run_attempt }} + restore-keys: | + hardhat-network-fork- + - name: Prepare Config + run: yarn ci:prepare-config + env: + MAINNET_RPC_ENDPOINT: ${{ secrets.MAINNET_RPC_ENDPOINT }} + POLYGON_RPC_ENDPOINT: ${{ secrets.POLYGON_RPC_ENDPOINT }} + ARBITRUM_RPC_ENDPOINT: ${{ secrets.ARBITRUM_RPC_ENDPOINT }} + OPTIMISM_RPC_ENDPOINT: ${{ secrets.OPTIMISM_RPC_ENDPOINT }} + GOERLI_RPC_ENDPOINT: ${{ secrets.GOERLI_RPC_ENDPOINT }} + SEPOLIA_RPC_ENDPOINT: ${{ secrets.SEPOLIA_RPC_ENDPOINT }} + - name: Test + run: yarn test diff --git a/balpy/balancer-deployments/.github/workflows/deployment-checks.yml b/balpy/balancer-deployments/.github/workflows/deployment-checks.yml new file mode 100644 index 0000000..9ba8a88 --- /dev/null +++ b/balpy/balancer-deployments/.github/workflows/deployment-checks.yml @@ -0,0 +1,293 @@ +name: Deployment + +on: + push: + branches: + - master + pull_request: + branches: ['*', '**/*'] + +jobs: + check-artifacts: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up environment + uses: ./.github/actions/setup + - name: Check Deployment Artifacts + run: yarn check-artifacts + + check-mainnet-deployments: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Mainnet Deployment Addresses + uses: ./.github/actions/check-network-deployments + env: + MAINNET_RPC_ENDPOINT: ${{ secrets.MAINNET_RPC_ENDPOINT }} + with: + network-name: mainnet + check-polygon-deployments: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Polygon Deployment Addresses + uses: ./.github/actions/check-network-deployments + env: + POLYGON_RPC_ENDPOINT: ${{ secrets.POLYGON_RPC_ENDPOINT }} + with: + network-name: polygon + check-arbitrum-deployments: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Arbitrum Deployment Addresses + uses: ./.github/actions/check-network-deployments + env: + ARBITRUM_RPC_ENDPOINT: ${{ secrets.ARBITRUM_RPC_ENDPOINT }} + with: + network-name: arbitrum + check-optimism-deployments: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Optimism Deployment Addresses + uses: ./.github/actions/check-network-deployments + env: + OPTIMISM_RPC_ENDPOINT: ${{ secrets.OPTIMISM_RPC_ENDPOINT }} + with: + network-name: optimism + check-bsc-deployments: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Binance Deployment Addresses + uses: ./.github/actions/check-network-deployments + env: + BINANCE_RPC_ENDPOINT: ${{ secrets.BINANCE_RPC_ENDPOINT }} + with: + network-name: bsc + check-gnosis-deployments: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Gnosis Deployment Addresses + uses: ./.github/actions/check-network-deployments + env: + GNOSIS_RPC_ENDPOINT: ${{ secrets.GNOSIS_RPC_ENDPOINT }} + with: + network-name: gnosis + check-avalanche-deployments: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Avalanche Deployment Addresses + uses: ./.github/actions/check-network-deployments + env: + AVALANCHE_RPC_ENDPOINT: ${{ secrets.AVALANCHE_RPC_ENDPOINT }} + with: + network-name: avalanche + check-zkevm-deployments: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Polygon-ZkEvm Deployment Addresses + uses: ./.github/actions/check-network-deployments + env: + ZKEVM_RPC_ENDPOINT: ${{ secrets.ZKEVM_RPC_ENDPOINT }} + with: + network-name: zkevm + check-base-deployments: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Base Deployment Addresses + uses: ./.github/actions/check-network-deployments + env: + BASE_RPC_ENDPOINT: ${{ secrets.BASE_RPC_ENDPOINT }} + with: + network-name: base + check-fantom-deployments: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Fantom Deployment Addresses + uses: ./.github/actions/check-network-deployments + env: + FANTOM_RPC_ENDPOINT: ${{ secrets.FANTOM_RPC_ENDPOINT }} + with: + network-name: fantom + check-goerli-deployments: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Goerli Deployment Addresses + uses: ./.github/actions/check-network-deployments + env: + GOERLI_RPC_ENDPOINT: ${{ secrets.GOERLI_RPC_ENDPOINT }} + with: + network-name: goerli + check-sepolia-deployments: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Sepolia Deployment Addresses + uses: ./.github/actions/check-network-deployments + env: + SEPOLIA_RPC_ENDPOINT: ${{ secrets.SEPOLIA_RPC_ENDPOINT }} + with: + network-name: sepolia + + check-mainnet-action-ids: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Mainnet Action IDs + uses: ./.github/actions/check-network-action-ids + env: + MAINNET_RPC_ENDPOINT: ${{ secrets.MAINNET_RPC_ENDPOINT }} + with: + network-name: mainnet + check-polygon-action-ids: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Polygon Action IDs + uses: ./.github/actions/check-network-action-ids + env: + POLYGON_RPC_ENDPOINT: ${{ secrets.POLYGON_RPC_ENDPOINT }} + with: + network-name: polygon + check-arbitrum-action-ids: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Arbitrum Action IDs + uses: ./.github/actions/check-network-action-ids + env: + ARBITRUM_RPC_ENDPOINT: ${{ secrets.ARBITRUM_RPC_ENDPOINT }} + with: + network-name: arbitrum + check-optimism-action-ids: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Optimism Action IDs + uses: ./.github/actions/check-network-action-ids + env: + OPTIMISM_RPC_ENDPOINT: ${{ secrets.OPTIMISM_RPC_ENDPOINT }} + with: + network-name: optimism + check-bsc-action-ids: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Binance Action IDs + uses: ./.github/actions/check-network-action-ids + env: + BINANCE_RPC_ENDPOINT: ${{ secrets.BINANCE_RPC_ENDPOINT }} + with: + network-name: bsc + check-gnosis-action-ids: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Gnosis Action IDs + uses: ./.github/actions/check-network-action-ids + env: + GNOSIS_RPC_ENDPOINT: ${{ secrets.GNOSIS_RPC_ENDPOINT }} + with: + network-name: gnosis + check-avalanche-action-ids: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Avalanche Action IDs + uses: ./.github/actions/check-network-action-ids + env: + AVALANCHE_RPC_ENDPOINT: ${{ secrets.AVALANCHE_RPC_ENDPOINT }} + with: + network-name: avalanche + check-zkevm-action-ids: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Polygon-ZkEvm Action IDs + uses: ./.github/actions/check-network-action-ids + env: + ZKEVM_RPC_ENDPOINT: ${{ secrets.ZKEVM_RPC_ENDPOINT }} + with: + network-name: zkevm + check-base-action-ids: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Base Action IDs + uses: ./.github/actions/check-network-action-ids + env: + BASE_RPC_ENDPOINT: ${{ secrets.BASE_RPC_ENDPOINT }} + with: + network-name: base + check-fantom-action-ids: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Fantom Action IDs + uses: ./.github/actions/check-network-action-ids + env: + FANTOM_RPC_ENDPOINT: ${{ secrets.FANTOM_RPC_ENDPOINT }} + with: + network-name: fantom + check-goerli-action-ids: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Goerli Action IDs + uses: ./.github/actions/check-network-action-ids + env: + GOERLI_RPC_ENDPOINT: ${{ secrets.GOERLI_RPC_ENDPOINT }} + with: + network-name: goerli + check-sepolia-action-ids: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Sepolia Action IDs + uses: ./.github/actions/check-network-action-ids + env: + SEPOLIA_RPC_ENDPOINT: ${{ secrets.SEPOLIA_RPC_ENDPOINT }} + with: + network-name: sepolia + + check-address-lookup: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up environment + uses: ./.github/actions/setup + - name: Prepare Config + run: yarn ci:prepare-config + env: + MAINNET_RPC_ENDPOINT: ${{ secrets.MAINNET_RPC_ENDPOINT }} + POLYGON_RPC_ENDPOINT: ${{ secrets.POLYGON_RPC_ENDPOINT }} + ARBITRUM_RPC_ENDPOINT: ${{ secrets.ARBITRUM_RPC_ENDPOINT }} + OPTIMISM_RPC_ENDPOINT: ${{ secrets.OPTIMISM_RPC_ENDPOINT }} + BINANCE_RPC_ENDPOINT: ${{ secrets.BINANCE_RPC_ENDPOINT }} + GNOSIS_RPC_ENDPOINT: ${{ secrets.GNOSIS_RPC_ENDPOINT }} + AVALANCHE_RPC_ENDPOINT: ${{ secrets.AVALANCHE_RPC_ENDPOINT }} + ZKEVM_RPC_ENDPOINT: ${{ secrets.ZKEVM_RPC_ENDPOINT }} + GOERLI_RPC_ENDPOINT: ${{ secrets.GOERLI_RPC_ENDPOINT }} + SEPOLIA_RPC_ENDPOINT: ${{ secrets.SEPOLIA_RPC_ENDPOINT }} + - name: Check Deployment Address Lookup File + run: yarn check-address-lookup + + markdown-link-check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: gaurav-nelson/github-action-markdown-link-check@v1 + with: + use-quiet-mode: 'yes' + config-file: 'mlc_config.json' +env: + CI: true diff --git a/balpy/balancer-deployments/.gitignore b/balpy/balancer-deployments/.gitignore new file mode 100644 index 0000000..ec014cb --- /dev/null +++ b/balpy/balancer-deployments/.gitignore @@ -0,0 +1,25 @@ +# Logs +yarn-debug.log* +yarn-error.log* + +# Dependency directories +node_modules/ + +# Yarn +.yarn/* +!.yarn/patches +!.yarn/releases +!.yarn/plugins +!.yarn/sdks +!.yarn/versions +.pnp.* + +# Hardhat artifacts +artifacts/ +cache/ + +# Build artifacts +dist/ +pkg/balancer-js/src/typechain/* + +test.json diff --git a/balpy/balancer-deployments/.gitmodules b/balpy/balancer-deployments/.gitmodules new file mode 100644 index 0000000..7a13087 --- /dev/null +++ b/balpy/balancer-deployments/.gitmodules @@ -0,0 +1,3 @@ +[submodule "pvt/lib/forge-std"] + path = pvt/lib/forge-std + url = https://github.com/foundry-rs/forge-std diff --git a/balpy/balancer-deployments/.mocharc.json b/balpy/balancer-deployments/.mocharc.json new file mode 100644 index 0000000..f7c00a4 --- /dev/null +++ b/balpy/balancer-deployments/.mocharc.json @@ -0,0 +1,6 @@ +{ + "extension": ["ts"], + "timeout": 50000, + "recursive": "test", + "slow": 500 +} diff --git a/balpy/balancer-deployments/.nvmrc b/balpy/balancer-deployments/.nvmrc new file mode 100644 index 0000000..e048c8c --- /dev/null +++ b/balpy/balancer-deployments/.nvmrc @@ -0,0 +1 @@ +v18.15.0 diff --git a/balpy/balancer-deployments/.prettierrc.json b/balpy/balancer-deployments/.prettierrc.json new file mode 100644 index 0000000..5198ec0 --- /dev/null +++ b/balpy/balancer-deployments/.prettierrc.json @@ -0,0 +1,29 @@ +{ + "bracketSpacing": true, + "explicitTypes": "always", + "newline-before-return": true, + "no-duplicate-variable": [true, "check-parameters"], + "no-var-keyword": true, + "printWidth": 120, + "semi": true, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "es5", + "useTabs": false, + + "overrides": [ + { + "files": "*.sol", + "options": { + "singleQuote": false, + "tabWidth": 4 + } + }, + { + "files": "*.md", + "options": { + "printWidth": 80 + } + } + ] +} diff --git a/balpy/balancer-deployments/.solhint.json b/balpy/balancer-deployments/.solhint.json new file mode 100644 index 0000000..2e9a44a --- /dev/null +++ b/balpy/balancer-deployments/.solhint.json @@ -0,0 +1,15 @@ +{ + "extends": "solhint:recommended", + "plugins": ["prettier"], + "rules": { + "prettier/prettier": "error", + "max-line-length": ["error", 120], + "func-param-name-mixedcase": "error", + "modifier-name-mixedcase": "error", + "private-vars-leading-underscore": "error", + "reason-string": ["error", {"maxLength": 64}], + "func-visibility": ["error", {"ignoreConstructors": true}], + "compiler-version": ["off"], + "no-global-import": ["off"] + } +} diff --git a/balpy/balancer-deployments/.yarn/plugins/@yarnpkg/plugin-typescript.cjs b/balpy/balancer-deployments/.yarn/plugins/@yarnpkg/plugin-typescript.cjs new file mode 100644 index 0000000..5c1859e --- /dev/null +++ b/balpy/balancer-deployments/.yarn/plugins/@yarnpkg/plugin-typescript.cjs @@ -0,0 +1,9 @@ +/* eslint-disable */ +//prettier-ignore +module.exports = { +name: "@yarnpkg/plugin-typescript", +factory: function (require) { +var plugin=(()=>{var Ft=Object.create,H=Object.defineProperty,Bt=Object.defineProperties,Kt=Object.getOwnPropertyDescriptor,zt=Object.getOwnPropertyDescriptors,Gt=Object.getOwnPropertyNames,Q=Object.getOwnPropertySymbols,$t=Object.getPrototypeOf,ne=Object.prototype.hasOwnProperty,De=Object.prototype.propertyIsEnumerable;var Re=(e,t,r)=>t in e?H(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,u=(e,t)=>{for(var r in t||(t={}))ne.call(t,r)&&Re(e,r,t[r]);if(Q)for(var r of Q(t))De.call(t,r)&&Re(e,r,t[r]);return e},g=(e,t)=>Bt(e,zt(t)),Lt=e=>H(e,"__esModule",{value:!0});var R=(e,t)=>{var r={};for(var s in e)ne.call(e,s)&&t.indexOf(s)<0&&(r[s]=e[s]);if(e!=null&&Q)for(var s of Q(e))t.indexOf(s)<0&&De.call(e,s)&&(r[s]=e[s]);return r};var I=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Vt=(e,t)=>{for(var r in t)H(e,r,{get:t[r],enumerable:!0})},Qt=(e,t,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Gt(t))!ne.call(e,s)&&s!=="default"&&H(e,s,{get:()=>t[s],enumerable:!(r=Kt(t,s))||r.enumerable});return e},C=e=>Qt(Lt(H(e!=null?Ft($t(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e);var xe=I(J=>{"use strict";Object.defineProperty(J,"__esModule",{value:!0});function _(e){let t=[...e.caches],r=t.shift();return r===void 0?ve():{get(s,n,a={miss:()=>Promise.resolve()}){return r.get(s,n,a).catch(()=>_({caches:t}).get(s,n,a))},set(s,n){return r.set(s,n).catch(()=>_({caches:t}).set(s,n))},delete(s){return r.delete(s).catch(()=>_({caches:t}).delete(s))},clear(){return r.clear().catch(()=>_({caches:t}).clear())}}}function ve(){return{get(e,t,r={miss:()=>Promise.resolve()}){return t().then(n=>Promise.all([n,r.miss(n)])).then(([n])=>n)},set(e,t){return Promise.resolve(t)},delete(e){return Promise.resolve()},clear(){return Promise.resolve()}}}J.createFallbackableCache=_;J.createNullCache=ve});var Ee=I(($s,qe)=>{qe.exports=xe()});var Te=I(ae=>{"use strict";Object.defineProperty(ae,"__esModule",{value:!0});function Jt(e={serializable:!0}){let t={};return{get(r,s,n={miss:()=>Promise.resolve()}){let a=JSON.stringify(r);if(a in t)return Promise.resolve(e.serializable?JSON.parse(t[a]):t[a]);let o=s(),d=n&&n.miss||(()=>Promise.resolve());return o.then(y=>d(y)).then(()=>o)},set(r,s){return t[JSON.stringify(r)]=e.serializable?JSON.stringify(s):s,Promise.resolve(s)},delete(r){return delete t[JSON.stringify(r)],Promise.resolve()},clear(){return t={},Promise.resolve()}}}ae.createInMemoryCache=Jt});var we=I((Vs,Me)=>{Me.exports=Te()});var Ce=I(M=>{"use strict";Object.defineProperty(M,"__esModule",{value:!0});function Xt(e,t,r){let s={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers(){return e===oe.WithinHeaders?s:{}},queryParameters(){return e===oe.WithinQueryParameters?s:{}}}}function Yt(e){let t=0,r=()=>(t++,new Promise(s=>{setTimeout(()=>{s(e(r))},Math.min(100*t,1e3))}));return e(r)}function ke(e,t=(r,s)=>Promise.resolve()){return Object.assign(e,{wait(r){return ke(e.then(s=>Promise.all([t(s,r),s])).then(s=>s[1]))}})}function Zt(e){let t=e.length-1;for(t;t>0;t--){let r=Math.floor(Math.random()*(t+1)),s=e[t];e[t]=e[r],e[r]=s}return e}function er(e,t){return Object.keys(t!==void 0?t:{}).forEach(r=>{e[r]=t[r](e)}),e}function tr(e,...t){let r=0;return e.replace(/%s/g,()=>encodeURIComponent(t[r++]))}var rr="4.2.0",sr=e=>()=>e.transporter.requester.destroy(),oe={WithinQueryParameters:0,WithinHeaders:1};M.AuthMode=oe;M.addMethods=er;M.createAuth=Xt;M.createRetryablePromise=Yt;M.createWaitablePromise=ke;M.destroy=sr;M.encode=tr;M.shuffle=Zt;M.version=rr});var F=I((Js,Ue)=>{Ue.exports=Ce()});var Ne=I(ie=>{"use strict";Object.defineProperty(ie,"__esModule",{value:!0});var nr={Delete:"DELETE",Get:"GET",Post:"POST",Put:"PUT"};ie.MethodEnum=nr});var B=I((Ys,We)=>{We.exports=Ne()});var Ze=I(A=>{"use strict";Object.defineProperty(A,"__esModule",{value:!0});var He=B();function ce(e,t){let r=e||{},s=r.data||{};return Object.keys(r).forEach(n=>{["timeout","headers","queryParameters","data","cacheable"].indexOf(n)===-1&&(s[n]=r[n])}),{data:Object.entries(s).length>0?s:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var X={Read:1,Write:2,Any:3},U={Up:1,Down:2,Timeouted:3},_e=2*60*1e3;function ue(e,t=U.Up){return g(u({},e),{status:t,lastUpdate:Date.now()})}function Fe(e){return e.status===U.Up||Date.now()-e.lastUpdate>_e}function Be(e){return e.status===U.Timeouted&&Date.now()-e.lastUpdate<=_e}function le(e){return{protocol:e.protocol||"https",url:e.url,accept:e.accept||X.Any}}function ar(e,t){return Promise.all(t.map(r=>e.get(r,()=>Promise.resolve(ue(r))))).then(r=>{let s=r.filter(d=>Fe(d)),n=r.filter(d=>Be(d)),a=[...s,...n],o=a.length>0?a.map(d=>le(d)):t;return{getTimeout(d,y){return(n.length===0&&d===0?1:n.length+3+d)*y},statelessHosts:o}})}var or=({isTimedOut:e,status:t})=>!e&&~~t==0,ir=e=>{let t=e.status;return e.isTimedOut||or(e)||~~(t/100)!=2&&~~(t/100)!=4},cr=({status:e})=>~~(e/100)==2,ur=(e,t)=>ir(e)?t.onRetry(e):cr(e)?t.onSucess(e):t.onFail(e);function Qe(e,t,r,s){let n=[],a=$e(r,s),o=Le(e,s),d=r.method,y=r.method!==He.MethodEnum.Get?{}:u(u({},r.data),s.data),b=u(u(u({"x-algolia-agent":e.userAgent.value},e.queryParameters),y),s.queryParameters),f=0,p=(h,S)=>{let O=h.pop();if(O===void 0)throw Ve(de(n));let P={data:a,headers:o,method:d,url:Ge(O,r.path,b),connectTimeout:S(f,e.timeouts.connect),responseTimeout:S(f,s.timeout)},x=j=>{let T={request:P,response:j,host:O,triesLeft:h.length};return n.push(T),T},v={onSucess:j=>Ke(j),onRetry(j){let T=x(j);return j.isTimedOut&&f++,Promise.all([e.logger.info("Retryable failure",pe(T)),e.hostsCache.set(O,ue(O,j.isTimedOut?U.Timeouted:U.Down))]).then(()=>p(h,S))},onFail(j){throw x(j),ze(j,de(n))}};return e.requester.send(P).then(j=>ur(j,v))};return ar(e.hostsCache,t).then(h=>p([...h.statelessHosts].reverse(),h.getTimeout))}function lr(e){let{hostsCache:t,logger:r,requester:s,requestsCache:n,responsesCache:a,timeouts:o,userAgent:d,hosts:y,queryParameters:b,headers:f}=e,p={hostsCache:t,logger:r,requester:s,requestsCache:n,responsesCache:a,timeouts:o,userAgent:d,headers:f,queryParameters:b,hosts:y.map(h=>le(h)),read(h,S){let O=ce(S,p.timeouts.read),P=()=>Qe(p,p.hosts.filter(j=>(j.accept&X.Read)!=0),h,O);if((O.cacheable!==void 0?O.cacheable:h.cacheable)!==!0)return P();let v={request:h,mappedRequestOptions:O,transporter:{queryParameters:p.queryParameters,headers:p.headers}};return p.responsesCache.get(v,()=>p.requestsCache.get(v,()=>p.requestsCache.set(v,P()).then(j=>Promise.all([p.requestsCache.delete(v),j]),j=>Promise.all([p.requestsCache.delete(v),Promise.reject(j)])).then(([j,T])=>T)),{miss:j=>p.responsesCache.set(v,j)})},write(h,S){return Qe(p,p.hosts.filter(O=>(O.accept&X.Write)!=0),h,ce(S,p.timeouts.write))}};return p}function dr(e){let t={value:`Algolia for JavaScript (${e})`,add(r){let s=`; ${r.segment}${r.version!==void 0?` (${r.version})`:""}`;return t.value.indexOf(s)===-1&&(t.value=`${t.value}${s}`),t}};return t}function Ke(e){try{return JSON.parse(e.content)}catch(t){throw Je(t.message,e)}}function ze({content:e,status:t},r){let s=e;try{s=JSON.parse(e).message}catch(n){}return Xe(s,t,r)}function pr(e,...t){let r=0;return e.replace(/%s/g,()=>encodeURIComponent(t[r++]))}function Ge(e,t,r){let s=Ye(r),n=`${e.protocol}://${e.url}/${t.charAt(0)==="/"?t.substr(1):t}`;return s.length&&(n+=`?${s}`),n}function Ye(e){let t=r=>Object.prototype.toString.call(r)==="[object Object]"||Object.prototype.toString.call(r)==="[object Array]";return Object.keys(e).map(r=>pr("%s=%s",r,t(e[r])?JSON.stringify(e[r]):e[r])).join("&")}function $e(e,t){if(e.method===He.MethodEnum.Get||e.data===void 0&&t.data===void 0)return;let r=Array.isArray(e.data)?e.data:u(u({},e.data),t.data);return JSON.stringify(r)}function Le(e,t){let r=u(u({},e.headers),t.headers),s={};return Object.keys(r).forEach(n=>{let a=r[n];s[n.toLowerCase()]=a}),s}function de(e){return e.map(t=>pe(t))}function pe(e){let t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return g(u({},e),{request:g(u({},e.request),{headers:u(u({},e.request.headers),t)})})}function Xe(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}function Je(e,t){return{name:"DeserializationError",message:e,response:t}}function Ve(e){return{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:e}}A.CallEnum=X;A.HostStatusEnum=U;A.createApiError=Xe;A.createDeserializationError=Je;A.createMappedRequestOptions=ce;A.createRetryError=Ve;A.createStatefulHost=ue;A.createStatelessHost=le;A.createTransporter=lr;A.createUserAgent=dr;A.deserializeFailure=ze;A.deserializeSuccess=Ke;A.isStatefulHostTimeouted=Be;A.isStatefulHostUp=Fe;A.serializeData=$e;A.serializeHeaders=Le;A.serializeQueryParameters=Ye;A.serializeUrl=Ge;A.stackFrameWithoutCredentials=pe;A.stackTraceWithoutCredentials=de});var K=I((en,et)=>{et.exports=Ze()});var tt=I(w=>{"use strict";Object.defineProperty(w,"__esModule",{value:!0});var N=F(),mr=K(),z=B(),hr=e=>{let t=e.region||"us",r=N.createAuth(N.AuthMode.WithinHeaders,e.appId,e.apiKey),s=mr.createTransporter(g(u({hosts:[{url:`analytics.${t}.algolia.com`}]},e),{headers:u(g(u({},r.headers()),{"content-type":"application/json"}),e.headers),queryParameters:u(u({},r.queryParameters()),e.queryParameters)})),n=e.appId;return N.addMethods({appId:n,transporter:s},e.methods)},yr=e=>(t,r)=>e.transporter.write({method:z.MethodEnum.Post,path:"2/abtests",data:t},r),gr=e=>(t,r)=>e.transporter.write({method:z.MethodEnum.Delete,path:N.encode("2/abtests/%s",t)},r),fr=e=>(t,r)=>e.transporter.read({method:z.MethodEnum.Get,path:N.encode("2/abtests/%s",t)},r),br=e=>t=>e.transporter.read({method:z.MethodEnum.Get,path:"2/abtests"},t),Pr=e=>(t,r)=>e.transporter.write({method:z.MethodEnum.Post,path:N.encode("2/abtests/%s/stop",t)},r);w.addABTest=yr;w.createAnalyticsClient=hr;w.deleteABTest=gr;w.getABTest=fr;w.getABTests=br;w.stopABTest=Pr});var st=I((rn,rt)=>{rt.exports=tt()});var at=I(G=>{"use strict";Object.defineProperty(G,"__esModule",{value:!0});var me=F(),jr=K(),nt=B(),Or=e=>{let t=e.region||"us",r=me.createAuth(me.AuthMode.WithinHeaders,e.appId,e.apiKey),s=jr.createTransporter(g(u({hosts:[{url:`recommendation.${t}.algolia.com`}]},e),{headers:u(g(u({},r.headers()),{"content-type":"application/json"}),e.headers),queryParameters:u(u({},r.queryParameters()),e.queryParameters)}));return me.addMethods({appId:e.appId,transporter:s},e.methods)},Ir=e=>t=>e.transporter.read({method:nt.MethodEnum.Get,path:"1/strategies/personalization"},t),Ar=e=>(t,r)=>e.transporter.write({method:nt.MethodEnum.Post,path:"1/strategies/personalization",data:t},r);G.createRecommendationClient=Or;G.getPersonalizationStrategy=Ir;G.setPersonalizationStrategy=Ar});var it=I((nn,ot)=>{ot.exports=at()});var jt=I(i=>{"use strict";Object.defineProperty(i,"__esModule",{value:!0});var l=F(),q=K(),m=B(),Sr=require("crypto");function Y(e){let t=r=>e.request(r).then(s=>{if(e.batch!==void 0&&e.batch(s.hits),!e.shouldStop(s))return s.cursor?t({cursor:s.cursor}):t({page:(r.page||0)+1})});return t({})}var Dr=e=>{let t=e.appId,r=l.createAuth(e.authMode!==void 0?e.authMode:l.AuthMode.WithinHeaders,t,e.apiKey),s=q.createTransporter(g(u({hosts:[{url:`${t}-dsn.algolia.net`,accept:q.CallEnum.Read},{url:`${t}.algolia.net`,accept:q.CallEnum.Write}].concat(l.shuffle([{url:`${t}-1.algolianet.com`},{url:`${t}-2.algolianet.com`},{url:`${t}-3.algolianet.com`}]))},e),{headers:u(g(u({},r.headers()),{"content-type":"application/x-www-form-urlencoded"}),e.headers),queryParameters:u(u({},r.queryParameters()),e.queryParameters)})),n={transporter:s,appId:t,addAlgoliaAgent(a,o){s.userAgent.add({segment:a,version:o})},clearCache(){return Promise.all([s.requestsCache.clear(),s.responsesCache.clear()]).then(()=>{})}};return l.addMethods(n,e.methods)};function ct(){return{name:"MissingObjectIDError",message:"All objects must have an unique objectID (like a primary key) to be valid. Algolia is also able to generate objectIDs automatically but *it's not recommended*. To do it, use the `{'autoGenerateObjectIDIfNotExist': true}` option."}}function ut(){return{name:"ObjectNotFoundError",message:"Object not found."}}function lt(){return{name:"ValidUntilNotFoundError",message:"ValidUntil not found in given secured api key."}}var Rr=e=>(t,r)=>{let d=r||{},{queryParameters:s}=d,n=R(d,["queryParameters"]),a=u({acl:t},s!==void 0?{queryParameters:s}:{}),o=(y,b)=>l.createRetryablePromise(f=>$(e)(y.key,b).catch(p=>{if(p.status!==404)throw p;return f()}));return l.createWaitablePromise(e.transporter.write({method:m.MethodEnum.Post,path:"1/keys",data:a},n),o)},vr=e=>(t,r,s)=>{let n=q.createMappedRequestOptions(s);return n.queryParameters["X-Algolia-User-ID"]=t,e.transporter.write({method:m.MethodEnum.Post,path:"1/clusters/mapping",data:{cluster:r}},n)},xr=e=>(t,r,s)=>e.transporter.write({method:m.MethodEnum.Post,path:"1/clusters/mapping/batch",data:{users:t,cluster:r}},s),Z=e=>(t,r,s)=>{let n=(a,o)=>L(e)(t,{methods:{waitTask:D}}).waitTask(a.taskID,o);return l.createWaitablePromise(e.transporter.write({method:m.MethodEnum.Post,path:l.encode("1/indexes/%s/operation",t),data:{operation:"copy",destination:r}},s),n)},qr=e=>(t,r,s)=>Z(e)(t,r,g(u({},s),{scope:[ee.Rules]})),Er=e=>(t,r,s)=>Z(e)(t,r,g(u({},s),{scope:[ee.Settings]})),Tr=e=>(t,r,s)=>Z(e)(t,r,g(u({},s),{scope:[ee.Synonyms]})),Mr=e=>(t,r)=>{let s=(n,a)=>l.createRetryablePromise(o=>$(e)(t,a).then(o).catch(d=>{if(d.status!==404)throw d}));return l.createWaitablePromise(e.transporter.write({method:m.MethodEnum.Delete,path:l.encode("1/keys/%s",t)},r),s)},wr=()=>(e,t)=>{let r=q.serializeQueryParameters(t),s=Sr.createHmac("sha256",e).update(r).digest("hex");return Buffer.from(s+r).toString("base64")},$=e=>(t,r)=>e.transporter.read({method:m.MethodEnum.Get,path:l.encode("1/keys/%s",t)},r),kr=e=>t=>e.transporter.read({method:m.MethodEnum.Get,path:"1/logs"},t),Cr=()=>e=>{let t=Buffer.from(e,"base64").toString("ascii"),r=/validUntil=(\d+)/,s=t.match(r);if(s===null)throw lt();return parseInt(s[1],10)-Math.round(new Date().getTime()/1e3)},Ur=e=>t=>e.transporter.read({method:m.MethodEnum.Get,path:"1/clusters/mapping/top"},t),Nr=e=>(t,r)=>e.transporter.read({method:m.MethodEnum.Get,path:l.encode("1/clusters/mapping/%s",t)},r),Wr=e=>t=>{let n=t||{},{retrieveMappings:r}=n,s=R(n,["retrieveMappings"]);return r===!0&&(s.getClusters=!0),e.transporter.read({method:m.MethodEnum.Get,path:"1/clusters/mapping/pending"},s)},L=e=>(t,r={})=>{let s={transporter:e.transporter,appId:e.appId,indexName:t};return l.addMethods(s,r.methods)},Hr=e=>t=>e.transporter.read({method:m.MethodEnum.Get,path:"1/keys"},t),_r=e=>t=>e.transporter.read({method:m.MethodEnum.Get,path:"1/clusters"},t),Fr=e=>t=>e.transporter.read({method:m.MethodEnum.Get,path:"1/indexes"},t),Br=e=>t=>e.transporter.read({method:m.MethodEnum.Get,path:"1/clusters/mapping"},t),Kr=e=>(t,r,s)=>{let n=(a,o)=>L(e)(t,{methods:{waitTask:D}}).waitTask(a.taskID,o);return l.createWaitablePromise(e.transporter.write({method:m.MethodEnum.Post,path:l.encode("1/indexes/%s/operation",t),data:{operation:"move",destination:r}},s),n)},zr=e=>(t,r)=>{let s=(n,a)=>Promise.all(Object.keys(n.taskID).map(o=>L(e)(o,{methods:{waitTask:D}}).waitTask(n.taskID[o],a)));return l.createWaitablePromise(e.transporter.write({method:m.MethodEnum.Post,path:"1/indexes/*/batch",data:{requests:t}},r),s)},Gr=e=>(t,r)=>e.transporter.read({method:m.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:t}},r),$r=e=>(t,r)=>{let s=t.map(n=>g(u({},n),{params:q.serializeQueryParameters(n.params||{})}));return e.transporter.read({method:m.MethodEnum.Post,path:"1/indexes/*/queries",data:{requests:s},cacheable:!0},r)},Lr=e=>(t,r)=>Promise.all(t.map(s=>{let d=s.params,{facetName:n,facetQuery:a}=d,o=R(d,["facetName","facetQuery"]);return L(e)(s.indexName,{methods:{searchForFacetValues:dt}}).searchForFacetValues(n,a,u(u({},r),o))})),Vr=e=>(t,r)=>{let s=q.createMappedRequestOptions(r);return s.queryParameters["X-Algolia-User-ID"]=t,e.transporter.write({method:m.MethodEnum.Delete,path:"1/clusters/mapping"},s)},Qr=e=>(t,r)=>{let s=(n,a)=>l.createRetryablePromise(o=>$(e)(t,a).catch(d=>{if(d.status!==404)throw d;return o()}));return l.createWaitablePromise(e.transporter.write({method:m.MethodEnum.Post,path:l.encode("1/keys/%s/restore",t)},r),s)},Jr=e=>(t,r)=>e.transporter.read({method:m.MethodEnum.Post,path:"1/clusters/mapping/search",data:{query:t}},r),Xr=e=>(t,r)=>{let s=Object.assign({},r),f=r||{},{queryParameters:n}=f,a=R(f,["queryParameters"]),o=n?{queryParameters:n}:{},d=["acl","indexes","referers","restrictSources","queryParameters","description","maxQueriesPerIPPerHour","maxHitsPerQuery"],y=p=>Object.keys(s).filter(h=>d.indexOf(h)!==-1).every(h=>p[h]===s[h]),b=(p,h)=>l.createRetryablePromise(S=>$(e)(t,h).then(O=>y(O)?Promise.resolve():S()));return l.createWaitablePromise(e.transporter.write({method:m.MethodEnum.Put,path:l.encode("1/keys/%s",t),data:o},a),b)},pt=e=>(t,r)=>{let s=(n,a)=>D(e)(n.taskID,a);return l.createWaitablePromise(e.transporter.write({method:m.MethodEnum.Post,path:l.encode("1/indexes/%s/batch",e.indexName),data:{requests:t}},r),s)},Yr=e=>t=>Y(g(u({},t),{shouldStop:r=>r.cursor===void 0,request:r=>e.transporter.read({method:m.MethodEnum.Post,path:l.encode("1/indexes/%s/browse",e.indexName),data:r},t)})),Zr=e=>t=>{let r=u({hitsPerPage:1e3},t);return Y(g(u({},r),{shouldStop:s=>s.hits.lengthg(u({},n),{hits:n.hits.map(a=>(delete a._highlightResult,a))}))}}))},es=e=>t=>{let r=u({hitsPerPage:1e3},t);return Y(g(u({},r),{shouldStop:s=>s.hits.lengthg(u({},n),{hits:n.hits.map(a=>(delete a._highlightResult,a))}))}}))},te=e=>(t,r,s)=>{let y=s||{},{batchSize:n}=y,a=R(y,["batchSize"]),o={taskIDs:[],objectIDs:[]},d=(b=0)=>{let f=[],p;for(p=b;p({action:r,body:h})),a).then(h=>(o.objectIDs=o.objectIDs.concat(h.objectIDs),o.taskIDs.push(h.taskID),p++,d(p)))};return l.createWaitablePromise(d(),(b,f)=>Promise.all(b.taskIDs.map(p=>D(e)(p,f))))},ts=e=>t=>l.createWaitablePromise(e.transporter.write({method:m.MethodEnum.Post,path:l.encode("1/indexes/%s/clear",e.indexName)},t),(r,s)=>D(e)(r.taskID,s)),rs=e=>t=>{let a=t||{},{forwardToReplicas:r}=a,s=R(a,["forwardToReplicas"]),n=q.createMappedRequestOptions(s);return r&&(n.queryParameters.forwardToReplicas=1),l.createWaitablePromise(e.transporter.write({method:m.MethodEnum.Post,path:l.encode("1/indexes/%s/rules/clear",e.indexName)},n),(o,d)=>D(e)(o.taskID,d))},ss=e=>t=>{let a=t||{},{forwardToReplicas:r}=a,s=R(a,["forwardToReplicas"]),n=q.createMappedRequestOptions(s);return r&&(n.queryParameters.forwardToReplicas=1),l.createWaitablePromise(e.transporter.write({method:m.MethodEnum.Post,path:l.encode("1/indexes/%s/synonyms/clear",e.indexName)},n),(o,d)=>D(e)(o.taskID,d))},ns=e=>(t,r)=>l.createWaitablePromise(e.transporter.write({method:m.MethodEnum.Post,path:l.encode("1/indexes/%s/deleteByQuery",e.indexName),data:t},r),(s,n)=>D(e)(s.taskID,n)),as=e=>t=>l.createWaitablePromise(e.transporter.write({method:m.MethodEnum.Delete,path:l.encode("1/indexes/%s",e.indexName)},t),(r,s)=>D(e)(r.taskID,s)),os=e=>(t,r)=>l.createWaitablePromise(yt(e)([t],r).then(s=>({taskID:s.taskIDs[0]})),(s,n)=>D(e)(s.taskID,n)),yt=e=>(t,r)=>{let s=t.map(n=>({objectID:n}));return te(e)(s,k.DeleteObject,r)},is=e=>(t,r)=>{let o=r||{},{forwardToReplicas:s}=o,n=R(o,["forwardToReplicas"]),a=q.createMappedRequestOptions(n);return s&&(a.queryParameters.forwardToReplicas=1),l.createWaitablePromise(e.transporter.write({method:m.MethodEnum.Delete,path:l.encode("1/indexes/%s/rules/%s",e.indexName,t)},a),(d,y)=>D(e)(d.taskID,y))},cs=e=>(t,r)=>{let o=r||{},{forwardToReplicas:s}=o,n=R(o,["forwardToReplicas"]),a=q.createMappedRequestOptions(n);return s&&(a.queryParameters.forwardToReplicas=1),l.createWaitablePromise(e.transporter.write({method:m.MethodEnum.Delete,path:l.encode("1/indexes/%s/synonyms/%s",e.indexName,t)},a),(d,y)=>D(e)(d.taskID,y))},us=e=>t=>gt(e)(t).then(()=>!0).catch(r=>{if(r.status!==404)throw r;return!1}),ls=e=>(t,r)=>{let y=r||{},{query:s,paginate:n}=y,a=R(y,["query","paginate"]),o=0,d=()=>ft(e)(s||"",g(u({},a),{page:o})).then(b=>{for(let[f,p]of Object.entries(b.hits))if(t(p))return{object:p,position:parseInt(f,10),page:o};if(o++,n===!1||o>=b.nbPages)throw ut();return d()});return d()},ds=e=>(t,r)=>e.transporter.read({method:m.MethodEnum.Get,path:l.encode("1/indexes/%s/%s",e.indexName,t)},r),ps=()=>(e,t)=>{for(let[r,s]of Object.entries(e.hits))if(s.objectID===t)return parseInt(r,10);return-1},ms=e=>(t,r)=>{let o=r||{},{attributesToRetrieve:s}=o,n=R(o,["attributesToRetrieve"]),a=t.map(d=>u({indexName:e.indexName,objectID:d},s?{attributesToRetrieve:s}:{}));return e.transporter.read({method:m.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:a}},n)},hs=e=>(t,r)=>e.transporter.read({method:m.MethodEnum.Get,path:l.encode("1/indexes/%s/rules/%s",e.indexName,t)},r),gt=e=>t=>e.transporter.read({method:m.MethodEnum.Get,path:l.encode("1/indexes/%s/settings",e.indexName),data:{getVersion:2}},t),ys=e=>(t,r)=>e.transporter.read({method:m.MethodEnum.Get,path:l.encode("1/indexes/%s/synonyms/%s",e.indexName,t)},r),bt=e=>(t,r)=>e.transporter.read({method:m.MethodEnum.Get,path:l.encode("1/indexes/%s/task/%s",e.indexName,t.toString())},r),gs=e=>(t,r)=>l.createWaitablePromise(Pt(e)([t],r).then(s=>({objectID:s.objectIDs[0],taskID:s.taskIDs[0]})),(s,n)=>D(e)(s.taskID,n)),Pt=e=>(t,r)=>{let o=r||{},{createIfNotExists:s}=o,n=R(o,["createIfNotExists"]),a=s?k.PartialUpdateObject:k.PartialUpdateObjectNoCreate;return te(e)(t,a,n)},fs=e=>(t,r)=>{let O=r||{},{safe:s,autoGenerateObjectIDIfNotExist:n,batchSize:a}=O,o=R(O,["safe","autoGenerateObjectIDIfNotExist","batchSize"]),d=(P,x,v,j)=>l.createWaitablePromise(e.transporter.write({method:m.MethodEnum.Post,path:l.encode("1/indexes/%s/operation",P),data:{operation:v,destination:x}},j),(T,V)=>D(e)(T.taskID,V)),y=Math.random().toString(36).substring(7),b=`${e.indexName}_tmp_${y}`,f=he({appId:e.appId,transporter:e.transporter,indexName:b}),p=[],h=d(e.indexName,b,"copy",g(u({},o),{scope:["settings","synonyms","rules"]}));p.push(h);let S=(s?h.wait(o):h).then(()=>{let P=f(t,g(u({},o),{autoGenerateObjectIDIfNotExist:n,batchSize:a}));return p.push(P),s?P.wait(o):P}).then(()=>{let P=d(b,e.indexName,"move",o);return p.push(P),s?P.wait(o):P}).then(()=>Promise.all(p)).then(([P,x,v])=>({objectIDs:x.objectIDs,taskIDs:[P.taskID,...x.taskIDs,v.taskID]}));return l.createWaitablePromise(S,(P,x)=>Promise.all(p.map(v=>v.wait(x))))},bs=e=>(t,r)=>ye(e)(t,g(u({},r),{clearExistingRules:!0})),Ps=e=>(t,r)=>ge(e)(t,g(u({},r),{replaceExistingSynonyms:!0})),js=e=>(t,r)=>l.createWaitablePromise(he(e)([t],r).then(s=>({objectID:s.objectIDs[0],taskID:s.taskIDs[0]})),(s,n)=>D(e)(s.taskID,n)),he=e=>(t,r)=>{let o=r||{},{autoGenerateObjectIDIfNotExist:s}=o,n=R(o,["autoGenerateObjectIDIfNotExist"]),a=s?k.AddObject:k.UpdateObject;if(a===k.UpdateObject){for(let d of t)if(d.objectID===void 0)return l.createWaitablePromise(Promise.reject(ct()))}return te(e)(t,a,n)},Os=e=>(t,r)=>ye(e)([t],r),ye=e=>(t,r)=>{let d=r||{},{forwardToReplicas:s,clearExistingRules:n}=d,a=R(d,["forwardToReplicas","clearExistingRules"]),o=q.createMappedRequestOptions(a);return s&&(o.queryParameters.forwardToReplicas=1),n&&(o.queryParameters.clearExistingRules=1),l.createWaitablePromise(e.transporter.write({method:m.MethodEnum.Post,path:l.encode("1/indexes/%s/rules/batch",e.indexName),data:t},o),(y,b)=>D(e)(y.taskID,b))},Is=e=>(t,r)=>ge(e)([t],r),ge=e=>(t,r)=>{let d=r||{},{forwardToReplicas:s,replaceExistingSynonyms:n}=d,a=R(d,["forwardToReplicas","replaceExistingSynonyms"]),o=q.createMappedRequestOptions(a);return s&&(o.queryParameters.forwardToReplicas=1),n&&(o.queryParameters.replaceExistingSynonyms=1),l.createWaitablePromise(e.transporter.write({method:m.MethodEnum.Post,path:l.encode("1/indexes/%s/synonyms/batch",e.indexName),data:t},o),(y,b)=>D(e)(y.taskID,b))},ft=e=>(t,r)=>e.transporter.read({method:m.MethodEnum.Post,path:l.encode("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r),dt=e=>(t,r,s)=>e.transporter.read({method:m.MethodEnum.Post,path:l.encode("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},s),mt=e=>(t,r)=>e.transporter.read({method:m.MethodEnum.Post,path:l.encode("1/indexes/%s/rules/search",e.indexName),data:{query:t}},r),ht=e=>(t,r)=>e.transporter.read({method:m.MethodEnum.Post,path:l.encode("1/indexes/%s/synonyms/search",e.indexName),data:{query:t}},r),As=e=>(t,r)=>{let o=r||{},{forwardToReplicas:s}=o,n=R(o,["forwardToReplicas"]),a=q.createMappedRequestOptions(n);return s&&(a.queryParameters.forwardToReplicas=1),l.createWaitablePromise(e.transporter.write({method:m.MethodEnum.Put,path:l.encode("1/indexes/%s/settings",e.indexName),data:t},a),(d,y)=>D(e)(d.taskID,y))},D=e=>(t,r)=>l.createRetryablePromise(s=>bt(e)(t,r).then(n=>n.status!=="published"?s():void 0)),Ss={AddObject:"addObject",Analytics:"analytics",Browser:"browse",DeleteIndex:"deleteIndex",DeleteObject:"deleteObject",EditSettings:"editSettings",ListIndexes:"listIndexes",Logs:"logs",Recommendation:"recommendation",Search:"search",SeeUnretrievableAttributes:"seeUnretrievableAttributes",Settings:"settings",Usage:"usage"},k={AddObject:"addObject",UpdateObject:"updateObject",PartialUpdateObject:"partialUpdateObject",PartialUpdateObjectNoCreate:"partialUpdateObjectNoCreate",DeleteObject:"deleteObject"},ee={Settings:"settings",Synonyms:"synonyms",Rules:"rules"},Ds={None:"none",StopIfEnoughMatches:"stopIfEnoughMatches"},Rs={Synonym:"synonym",OneWaySynonym:"oneWaySynonym",AltCorrection1:"altCorrection1",AltCorrection2:"altCorrection2",Placeholder:"placeholder"};i.ApiKeyACLEnum=Ss;i.BatchActionEnum=k;i.ScopeEnum=ee;i.StrategyEnum=Ds;i.SynonymEnum=Rs;i.addApiKey=Rr;i.assignUserID=vr;i.assignUserIDs=xr;i.batch=pt;i.browseObjects=Yr;i.browseRules=Zr;i.browseSynonyms=es;i.chunkedBatch=te;i.clearObjects=ts;i.clearRules=rs;i.clearSynonyms=ss;i.copyIndex=Z;i.copyRules=qr;i.copySettings=Er;i.copySynonyms=Tr;i.createBrowsablePromise=Y;i.createMissingObjectIDError=ct;i.createObjectNotFoundError=ut;i.createSearchClient=Dr;i.createValidUntilNotFoundError=lt;i.deleteApiKey=Mr;i.deleteBy=ns;i.deleteIndex=as;i.deleteObject=os;i.deleteObjects=yt;i.deleteRule=is;i.deleteSynonym=cs;i.exists=us;i.findObject=ls;i.generateSecuredApiKey=wr;i.getApiKey=$;i.getLogs=kr;i.getObject=ds;i.getObjectPosition=ps;i.getObjects=ms;i.getRule=hs;i.getSecuredApiKeyRemainingValidity=Cr;i.getSettings=gt;i.getSynonym=ys;i.getTask=bt;i.getTopUserIDs=Ur;i.getUserID=Nr;i.hasPendingMappings=Wr;i.initIndex=L;i.listApiKeys=Hr;i.listClusters=_r;i.listIndices=Fr;i.listUserIDs=Br;i.moveIndex=Kr;i.multipleBatch=zr;i.multipleGetObjects=Gr;i.multipleQueries=$r;i.multipleSearchForFacetValues=Lr;i.partialUpdateObject=gs;i.partialUpdateObjects=Pt;i.removeUserID=Vr;i.replaceAllObjects=fs;i.replaceAllRules=bs;i.replaceAllSynonyms=Ps;i.restoreApiKey=Qr;i.saveObject=js;i.saveObjects=he;i.saveRule=Os;i.saveRules=ye;i.saveSynonym=Is;i.saveSynonyms=ge;i.search=ft;i.searchForFacetValues=dt;i.searchRules=mt;i.searchSynonyms=ht;i.searchUserIDs=Jr;i.setSettings=As;i.updateApiKey=Xr;i.waitTask=D});var It=I((on,Ot)=>{Ot.exports=jt()});var At=I(re=>{"use strict";Object.defineProperty(re,"__esModule",{value:!0});function vs(){return{debug(e,t){return Promise.resolve()},info(e,t){return Promise.resolve()},error(e,t){return Promise.resolve()}}}var xs={Debug:1,Info:2,Error:3};re.LogLevelEnum=xs;re.createNullLogger=vs});var Dt=I((un,St)=>{St.exports=At()});var xt=I(fe=>{"use strict";Object.defineProperty(fe,"__esModule",{value:!0});var Rt=require("http"),vt=require("https"),qs=require("url");function Es(){let e={keepAlive:!0},t=new Rt.Agent(e),r=new vt.Agent(e);return{send(s){return new Promise(n=>{let a=qs.parse(s.url),o=a.query===null?a.pathname:`${a.pathname}?${a.query}`,d=u({agent:a.protocol==="https:"?r:t,hostname:a.hostname,path:o,method:s.method,headers:s.headers},a.port!==void 0?{port:a.port||""}:{}),y=(a.protocol==="https:"?vt:Rt).request(d,h=>{let S="";h.on("data",O=>S+=O),h.on("end",()=>{clearTimeout(f),clearTimeout(p),n({status:h.statusCode||0,content:S,isTimedOut:!1})})}),b=(h,S)=>setTimeout(()=>{y.abort(),n({status:0,content:S,isTimedOut:!0})},h*1e3),f=b(s.connectTimeout,"Connection timeout"),p;y.on("error",h=>{clearTimeout(f),clearTimeout(p),n({status:0,content:h.message,isTimedOut:!1})}),y.once("response",()=>{clearTimeout(f),p=b(s.responseTimeout,"Socket timeout")}),s.data!==void 0&&y.write(s.data),y.end()})},destroy(){return t.destroy(),r.destroy(),Promise.resolve()}}}fe.createNodeHttpRequester=Es});var Et=I((dn,qt)=>{qt.exports=xt()});var kt=I((pn,Tt)=>{"use strict";var Mt=Ee(),Ts=we(),W=st(),be=F(),Pe=it(),c=It(),Ms=Dt(),ws=Et(),ks=K();function wt(e,t,r){let s={appId:e,apiKey:t,timeouts:{connect:2,read:5,write:30},requester:ws.createNodeHttpRequester(),logger:Ms.createNullLogger(),responsesCache:Mt.createNullCache(),requestsCache:Mt.createNullCache(),hostsCache:Ts.createInMemoryCache(),userAgent:ks.createUserAgent(be.version).add({segment:"Node.js",version:process.versions.node})};return c.createSearchClient(g(u(u({},s),r),{methods:{search:c.multipleQueries,searchForFacetValues:c.multipleSearchForFacetValues,multipleBatch:c.multipleBatch,multipleGetObjects:c.multipleGetObjects,multipleQueries:c.multipleQueries,copyIndex:c.copyIndex,copySettings:c.copySettings,copyRules:c.copyRules,copySynonyms:c.copySynonyms,moveIndex:c.moveIndex,listIndices:c.listIndices,getLogs:c.getLogs,listClusters:c.listClusters,multipleSearchForFacetValues:c.multipleSearchForFacetValues,getApiKey:c.getApiKey,addApiKey:c.addApiKey,listApiKeys:c.listApiKeys,updateApiKey:c.updateApiKey,deleteApiKey:c.deleteApiKey,restoreApiKey:c.restoreApiKey,assignUserID:c.assignUserID,assignUserIDs:c.assignUserIDs,getUserID:c.getUserID,searchUserIDs:c.searchUserIDs,listUserIDs:c.listUserIDs,getTopUserIDs:c.getTopUserIDs,removeUserID:c.removeUserID,hasPendingMappings:c.hasPendingMappings,generateSecuredApiKey:c.generateSecuredApiKey,getSecuredApiKeyRemainingValidity:c.getSecuredApiKeyRemainingValidity,destroy:be.destroy,initIndex:n=>a=>c.initIndex(n)(a,{methods:{batch:c.batch,delete:c.deleteIndex,getObject:c.getObject,getObjects:c.getObjects,saveObject:c.saveObject,saveObjects:c.saveObjects,search:c.search,searchForFacetValues:c.searchForFacetValues,waitTask:c.waitTask,setSettings:c.setSettings,getSettings:c.getSettings,partialUpdateObject:c.partialUpdateObject,partialUpdateObjects:c.partialUpdateObjects,deleteObject:c.deleteObject,deleteObjects:c.deleteObjects,deleteBy:c.deleteBy,clearObjects:c.clearObjects,browseObjects:c.browseObjects,getObjectPosition:c.getObjectPosition,findObject:c.findObject,exists:c.exists,saveSynonym:c.saveSynonym,saveSynonyms:c.saveSynonyms,getSynonym:c.getSynonym,searchSynonyms:c.searchSynonyms,browseSynonyms:c.browseSynonyms,deleteSynonym:c.deleteSynonym,clearSynonyms:c.clearSynonyms,replaceAllObjects:c.replaceAllObjects,replaceAllSynonyms:c.replaceAllSynonyms,searchRules:c.searchRules,getRule:c.getRule,deleteRule:c.deleteRule,saveRule:c.saveRule,saveRules:c.saveRules,replaceAllRules:c.replaceAllRules,browseRules:c.browseRules,clearRules:c.clearRules}}),initAnalytics:()=>n=>W.createAnalyticsClient(g(u(u({},s),n),{methods:{addABTest:W.addABTest,getABTest:W.getABTest,getABTests:W.getABTests,stopABTest:W.stopABTest,deleteABTest:W.deleteABTest}})),initRecommendation:()=>n=>Pe.createRecommendationClient(g(u(u({},s),n),{methods:{getPersonalizationStrategy:Pe.getPersonalizationStrategy,setPersonalizationStrategy:Pe.setPersonalizationStrategy}}))}}))}wt.version=be.version;Tt.exports=wt});var Ut=I((mn,je)=>{var Ct=kt();je.exports=Ct;je.exports.default=Ct});var Ws={};Vt(Ws,{default:()=>Ks});var Oe=C(require("@yarnpkg/core")),E=C(require("@yarnpkg/core")),Ie=C(require("@yarnpkg/plugin-essentials")),Ht=C(require("semver"));var se=C(require("@yarnpkg/core")),Nt=C(Ut()),Cs="e8e1bd300d860104bb8c58453ffa1eb4",Us="OFCNCOG2CU",Wt=async(e,t)=>{var a;let r=se.structUtils.stringifyIdent(e),n=Ns(t).initIndex("npm-search");try{return((a=(await n.getObject(r,{attributesToRetrieve:["types"]})).types)==null?void 0:a.ts)==="definitely-typed"}catch(o){return!1}},Ns=e=>(0,Nt.default)(Us,Cs,{requester:{async send(r){try{let s=await se.httpUtils.request(r.url,r.data||null,{configuration:e,headers:r.headers});return{content:s.body,isTimedOut:!1,status:s.statusCode}}catch(s){return{content:s.response.body,isTimedOut:!1,status:s.response.statusCode}}}}});var _t=e=>e.scope?`${e.scope}__${e.name}`:`${e.name}`,Hs=async(e,t,r,s)=>{if(r.scope==="types")return;let{project:n}=e,{configuration:a}=n,o=a.makeResolver(),d={project:n,resolver:o,report:new E.ThrowReport};if(!await Wt(r,a))return;let b=_t(r),f=E.structUtils.parseRange(r.range).selector;if(!E.semverUtils.validRange(f)){let P=await o.getCandidates(r,new Map,d);f=E.structUtils.parseRange(P[0].reference).selector}let p=Ht.default.coerce(f);if(p===null)return;let h=`${Ie.suggestUtils.Modifier.CARET}${p.major}`,S=E.structUtils.makeDescriptor(E.structUtils.makeIdent("types",b),h),O=E.miscUtils.mapAndFind(n.workspaces,P=>{var T,V;let x=(T=P.manifest.dependencies.get(r.identHash))==null?void 0:T.descriptorHash,v=(V=P.manifest.devDependencies.get(r.identHash))==null?void 0:V.descriptorHash;if(x!==r.descriptorHash&&v!==r.descriptorHash)return E.miscUtils.mapAndFind.skip;let j=[];for(let Ae of Oe.Manifest.allDependencies){let Se=P.manifest[Ae].get(S.identHash);typeof Se!="undefined"&&j.push([Ae,Se])}return j.length===0?E.miscUtils.mapAndFind.skip:j});if(typeof O!="undefined")for(let[P,x]of O)e.manifest[P].set(x.identHash,x);else{try{if((await o.getCandidates(S,new Map,d)).length===0)return}catch{return}e.manifest[Ie.suggestUtils.Target.DEVELOPMENT].set(S.identHash,S)}},_s=async(e,t,r)=>{if(r.scope==="types")return;let s=_t(r),n=E.structUtils.makeIdent("types",s);for(let a of Oe.Manifest.allDependencies)typeof e.manifest[a].get(n.identHash)!="undefined"&&e.manifest[a].delete(n.identHash)},Fs=(e,t)=>{t.publishConfig&&t.publishConfig.typings&&(t.typings=t.publishConfig.typings),t.publishConfig&&t.publishConfig.types&&(t.types=t.publishConfig.types)},Bs={hooks:{afterWorkspaceDependencyAddition:Hs,afterWorkspaceDependencyRemoval:_s,beforeWorkspacePacking:Fs}},Ks=Bs;return Ws;})(); +return plugin; +} +}; diff --git a/balpy/balancer-deployments/.yarn/plugins/@yarnpkg/plugin-version.cjs b/balpy/balancer-deployments/.yarn/plugins/@yarnpkg/plugin-version.cjs new file mode 100644 index 0000000..87de4f4 --- /dev/null +++ b/balpy/balancer-deployments/.yarn/plugins/@yarnpkg/plugin-version.cjs @@ -0,0 +1,550 @@ +/* eslint-disable */ +//prettier-ignore +module.exports = { +name: "@yarnpkg/plugin-version", +factory: function (require) { +var plugin=(()=>{var ZB=Object.create,zy=Object.defineProperty,$B=Object.defineProperties,eU=Object.getOwnPropertyDescriptor,tU=Object.getOwnPropertyDescriptors,nU=Object.getOwnPropertyNames,uS=Object.getOwnPropertySymbols,rU=Object.getPrototypeOf,oS=Object.prototype.hasOwnProperty,iU=Object.prototype.propertyIsEnumerable;var lS=(i,o,f)=>o in i?zy(i,o,{enumerable:!0,configurable:!0,writable:!0,value:f}):i[o]=f,E0=(i,o)=>{for(var f in o||(o={}))oS.call(o,f)&&lS(i,f,o[f]);if(uS)for(var f of uS(o))iU.call(o,f)&&lS(i,f,o[f]);return i},Gf=(i,o)=>$B(i,tU(o)),uU=i=>zy(i,"__esModule",{value:!0});var ce=(i,o)=>()=>(o||i((o={exports:{}}).exports,o),o.exports),sS=(i,o)=>{for(var f in o)zy(i,f,{get:o[f],enumerable:!0})},oU=(i,o,f)=>{if(o&&typeof o=="object"||typeof o=="function")for(let p of nU(o))!oS.call(i,p)&&p!=="default"&&zy(i,p,{get:()=>o[p],enumerable:!(f=eU(o,p))||f.enumerable});return i},Mi=i=>oU(uU(zy(i!=null?ZB(rU(i)):{},"default",i&&i.__esModule&&"default"in i?{get:()=>i.default,enumerable:!0}:{value:i,enumerable:!0})),i);var eD=ce((F$,aS)=>{function lU(i,o){for(var f=-1,p=i==null?0:i.length,E=Array(p);++f{function sU(){this.__data__=[],this.size=0}fS.exports=sU});var tD=ce((P$,dS)=>{function aU(i,o){return i===o||i!==i&&o!==o}dS.exports=aU});var qy=ce((I$,pS)=>{var fU=tD();function cU(i,o){for(var f=i.length;f--;)if(fU(i[f][0],o))return f;return-1}pS.exports=cU});var vS=ce((B$,hS)=>{var dU=qy(),pU=Array.prototype,hU=pU.splice;function vU(i){var o=this.__data__,f=dU(o,i);if(f<0)return!1;var p=o.length-1;return f==p?o.pop():hU.call(o,f,1),--this.size,!0}hS.exports=vU});var yS=ce((U$,mS)=>{var mU=qy();function yU(i){var o=this.__data__,f=mU(o,i);return f<0?void 0:o[f][1]}mS.exports=yU});var _S=ce((j$,gS)=>{var gU=qy();function _U(i){return gU(this.__data__,i)>-1}gS.exports=_U});var DS=ce((z$,ES)=>{var EU=qy();function DU(i,o){var f=this.__data__,p=EU(f,i);return p<0?(++this.size,f.push([i,o])):f[p][1]=o,this}ES.exports=DU});var Hy=ce((q$,wS)=>{var wU=cS(),SU=vS(),TU=yS(),CU=_S(),xU=DS();function jv(i){var o=-1,f=i==null?0:i.length;for(this.clear();++o{var AU=Hy();function RU(){this.__data__=new AU,this.size=0}SS.exports=RU});var xS=ce((W$,CS)=>{function OU(i){var o=this.__data__,f=o.delete(i);return this.size=o.size,f}CS.exports=OU});var RS=ce((V$,AS)=>{function kU(i){return this.__data__.get(i)}AS.exports=kU});var kS=ce((G$,OS)=>{function MU(i){return this.__data__.has(i)}OS.exports=MU});var nD=ce((Y$,MS)=>{var NU=typeof global=="object"&&global&&global.Object===Object&&global;MS.exports=NU});var Yf=ce((K$,NS)=>{var LU=nD(),FU=typeof self=="object"&&self&&self.Object===Object&&self,bU=LU||FU||Function("return this")();NS.exports=bU});var zv=ce((X$,LS)=>{var PU=Yf(),IU=PU.Symbol;LS.exports=IU});var BS=ce((Q$,bS)=>{var PS=zv(),IS=Object.prototype,BU=IS.hasOwnProperty,UU=IS.toString,Wy=PS?PS.toStringTag:void 0;function jU(i){var o=BU.call(i,Wy),f=i[Wy];try{i[Wy]=void 0;var p=!0}catch(t){}var E=UU.call(i);return p&&(o?i[Wy]=f:delete i[Wy]),E}bS.exports=jU});var jS=ce((J$,US)=>{var zU=Object.prototype,qU=zU.toString;function HU(i){return qU.call(i)}US.exports=HU});var Qp=ce((Z$,zS)=>{var qS=zv(),WU=BS(),VU=jS(),GU="[object Null]",YU="[object Undefined]",HS=qS?qS.toStringTag:void 0;function KU(i){return i==null?i===void 0?YU:GU:HS&&HS in Object(i)?WU(i):VU(i)}zS.exports=KU});var qv=ce(($$,WS)=>{function XU(i){var o=typeof i;return i!=null&&(o=="object"||o=="function")}WS.exports=XU});var rD=ce((eee,VS)=>{var QU=Qp(),JU=qv(),ZU="[object AsyncFunction]",$U="[object Function]",ej="[object GeneratorFunction]",tj="[object Proxy]";function nj(i){if(!JU(i))return!1;var o=QU(i);return o==$U||o==ej||o==ZU||o==tj}VS.exports=nj});var YS=ce((tee,GS)=>{var rj=Yf(),ij=rj["__core-js_shared__"];GS.exports=ij});var QS=ce((nee,KS)=>{var iD=YS(),XS=function(){var i=/[^.]+$/.exec(iD&&iD.keys&&iD.keys.IE_PROTO||"");return i?"Symbol(src)_1."+i:""}();function uj(i){return!!XS&&XS in i}KS.exports=uj});var uD=ce((ree,JS)=>{var oj=Function.prototype,lj=oj.toString;function sj(i){if(i!=null){try{return lj.call(i)}catch(o){}try{return i+""}catch(o){}}return""}JS.exports=sj});var $S=ce((iee,ZS)=>{var aj=rD(),fj=QS(),cj=qv(),dj=uD(),pj=/[\\^$.*+?()[\]{}|]/g,hj=/^\[object .+?Constructor\]$/,vj=Function.prototype,mj=Object.prototype,yj=vj.toString,gj=mj.hasOwnProperty,_j=RegExp("^"+yj.call(gj).replace(pj,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function Ej(i){if(!cj(i)||fj(i))return!1;var o=aj(i)?_j:hj;return o.test(dj(i))}ZS.exports=Ej});var tT=ce((uee,eT)=>{function Dj(i,o){return i==null?void 0:i[o]}eT.exports=Dj});var sd=ce((oee,nT)=>{var wj=$S(),Sj=tT();function Tj(i,o){var f=Sj(i,o);return wj(f)?f:void 0}nT.exports=Tj});var L_=ce((lee,rT)=>{var Cj=sd(),xj=Yf(),Aj=Cj(xj,"Map");rT.exports=Aj});var Vy=ce((see,iT)=>{var Rj=sd(),Oj=Rj(Object,"create");iT.exports=Oj});var lT=ce((aee,uT)=>{var oT=Vy();function kj(){this.__data__=oT?oT(null):{},this.size=0}uT.exports=kj});var aT=ce((fee,sT)=>{function Mj(i){var o=this.has(i)&&delete this.__data__[i];return this.size-=o?1:0,o}sT.exports=Mj});var cT=ce((cee,fT)=>{var Nj=Vy(),Lj="__lodash_hash_undefined__",Fj=Object.prototype,bj=Fj.hasOwnProperty;function Pj(i){var o=this.__data__;if(Nj){var f=o[i];return f===Lj?void 0:f}return bj.call(o,i)?o[i]:void 0}fT.exports=Pj});var pT=ce((dee,dT)=>{var Ij=Vy(),Bj=Object.prototype,Uj=Bj.hasOwnProperty;function jj(i){var o=this.__data__;return Ij?o[i]!==void 0:Uj.call(o,i)}dT.exports=jj});var vT=ce((pee,hT)=>{var zj=Vy(),qj="__lodash_hash_undefined__";function Hj(i,o){var f=this.__data__;return this.size+=this.has(i)?0:1,f[i]=zj&&o===void 0?qj:o,this}hT.exports=Hj});var yT=ce((hee,mT)=>{var Wj=lT(),Vj=aT(),Gj=cT(),Yj=pT(),Kj=vT();function Hv(i){var o=-1,f=i==null?0:i.length;for(this.clear();++o{var _T=yT(),Xj=Hy(),Qj=L_();function Jj(){this.size=0,this.__data__={hash:new _T,map:new(Qj||Xj),string:new _T}}gT.exports=Jj});var wT=ce((mee,DT)=>{function Zj(i){var o=typeof i;return o=="string"||o=="number"||o=="symbol"||o=="boolean"?i!=="__proto__":i===null}DT.exports=Zj});var Gy=ce((yee,ST)=>{var $j=wT();function ez(i,o){var f=i.__data__;return $j(o)?f[typeof o=="string"?"string":"hash"]:f.map}ST.exports=ez});var CT=ce((gee,TT)=>{var tz=Gy();function nz(i){var o=tz(this,i).delete(i);return this.size-=o?1:0,o}TT.exports=nz});var AT=ce((_ee,xT)=>{var rz=Gy();function iz(i){return rz(this,i).get(i)}xT.exports=iz});var OT=ce((Eee,RT)=>{var uz=Gy();function oz(i){return uz(this,i).has(i)}RT.exports=oz});var MT=ce((Dee,kT)=>{var lz=Gy();function sz(i,o){var f=lz(this,i),p=f.size;return f.set(i,o),this.size+=f.size==p?0:1,this}kT.exports=sz});var oD=ce((wee,NT)=>{var az=ET(),fz=CT(),cz=AT(),dz=OT(),pz=MT();function Wv(i){var o=-1,f=i==null?0:i.length;for(this.clear();++o{var hz=Hy(),vz=L_(),mz=oD(),yz=200;function gz(i,o){var f=this.__data__;if(f instanceof hz){var p=f.__data__;if(!vz||p.length{var _z=Hy(),Ez=TS(),Dz=xS(),wz=RS(),Sz=kS(),Tz=FT();function Vv(i){var o=this.__data__=new _z(i);this.size=o.size}Vv.prototype.clear=Ez;Vv.prototype.delete=Dz;Vv.prototype.get=wz;Vv.prototype.has=Sz;Vv.prototype.set=Tz;bT.exports=Vv});var BT=ce((Cee,IT)=>{function Cz(i,o){for(var f=-1,p=i==null?0:i.length;++f{var xz=sd(),Az=function(){try{var i=xz(Object,"defineProperty");return i({},"",{}),i}catch(o){}}();UT.exports=Az});var sD=ce((Aee,jT)=>{var zT=lD();function Rz(i,o,f){o=="__proto__"&&zT?zT(i,o,{configurable:!0,enumerable:!0,value:f,writable:!0}):i[o]=f}jT.exports=Rz});var aD=ce((Ree,qT)=>{var Oz=sD(),kz=tD(),Mz=Object.prototype,Nz=Mz.hasOwnProperty;function Lz(i,o,f){var p=i[o];(!(Nz.call(i,o)&&kz(p,f))||f===void 0&&!(o in i))&&Oz(i,o,f)}qT.exports=Lz});var Gv=ce((Oee,HT)=>{var Fz=aD(),bz=sD();function Pz(i,o,f,p){var E=!f;f||(f={});for(var t=-1,k=o.length;++t{function Iz(i,o){for(var f=-1,p=Array(i);++f{function Bz(i){return i!=null&&typeof i=="object"}GT.exports=Bz});var KT=ce((Nee,YT)=>{var Uz=Qp(),jz=ad(),zz="[object Arguments]";function qz(i){return jz(i)&&Uz(i)==zz}YT.exports=qz});var fD=ce((Lee,XT)=>{var QT=KT(),Hz=ad(),JT=Object.prototype,Wz=JT.hasOwnProperty,Vz=JT.propertyIsEnumerable,Gz=QT(function(){return arguments}())?QT:function(i){return Hz(i)&&Wz.call(i,"callee")&&!Vz.call(i,"callee")};XT.exports=Gz});var fd=ce((Fee,ZT)=>{var Yz=Array.isArray;ZT.exports=Yz});var eC=ce((bee,$T)=>{function Kz(){return!1}$T.exports=Kz});var cD=ce((Yy,Yv)=>{var Xz=Yf(),Qz=eC(),tC=typeof Yy=="object"&&Yy&&!Yy.nodeType&&Yy,nC=tC&&typeof Yv=="object"&&Yv&&!Yv.nodeType&&Yv,Jz=nC&&nC.exports===tC,rC=Jz?Xz.Buffer:void 0,Zz=rC?rC.isBuffer:void 0,$z=Zz||Qz;Yv.exports=$z});var uC=ce((Pee,iC)=>{var eq=9007199254740991,tq=/^(?:0|[1-9]\d*)$/;function nq(i,o){var f=typeof i;return o=o==null?eq:o,!!o&&(f=="number"||f!="symbol"&&tq.test(i))&&i>-1&&i%1==0&&i{var rq=9007199254740991;function iq(i){return typeof i=="number"&&i>-1&&i%1==0&&i<=rq}oC.exports=iq});var sC=ce((Bee,lC)=>{var uq=Qp(),oq=dD(),lq=ad(),sq="[object Arguments]",aq="[object Array]",fq="[object Boolean]",cq="[object Date]",dq="[object Error]",pq="[object Function]",hq="[object Map]",vq="[object Number]",mq="[object Object]",yq="[object RegExp]",gq="[object Set]",_q="[object String]",Eq="[object WeakMap]",Dq="[object ArrayBuffer]",wq="[object DataView]",Sq="[object Float32Array]",Tq="[object Float64Array]",Cq="[object Int8Array]",xq="[object Int16Array]",Aq="[object Int32Array]",Rq="[object Uint8Array]",Oq="[object Uint8ClampedArray]",kq="[object Uint16Array]",Mq="[object Uint32Array]",o0={};o0[Sq]=o0[Tq]=o0[Cq]=o0[xq]=o0[Aq]=o0[Rq]=o0[Oq]=o0[kq]=o0[Mq]=!0;o0[sq]=o0[aq]=o0[Dq]=o0[fq]=o0[wq]=o0[cq]=o0[dq]=o0[pq]=o0[hq]=o0[vq]=o0[mq]=o0[yq]=o0[gq]=o0[_q]=o0[Eq]=!1;function Nq(i){return lq(i)&&oq(i.length)&&!!o0[uq(i)]}lC.exports=Nq});var F_=ce((Uee,aC)=>{function Lq(i){return function(o){return i(o)}}aC.exports=Lq});var b_=ce((Ky,Kv)=>{var Fq=nD(),fC=typeof Ky=="object"&&Ky&&!Ky.nodeType&&Ky,Xy=fC&&typeof Kv=="object"&&Kv&&!Kv.nodeType&&Kv,bq=Xy&&Xy.exports===fC,pD=bq&&Fq.process,Pq=function(){try{var i=Xy&&Xy.require&&Xy.require("util").types;return i||pD&&pD.binding&&pD.binding("util")}catch(o){}}();Kv.exports=Pq});var hC=ce((jee,cC)=>{var Iq=sC(),Bq=F_(),dC=b_(),pC=dC&&dC.isTypedArray,Uq=pC?Bq(pC):Iq;cC.exports=Uq});var hD=ce((zee,vC)=>{var jq=VT(),zq=fD(),qq=fd(),Hq=cD(),Wq=uC(),Vq=hC(),Gq=Object.prototype,Yq=Gq.hasOwnProperty;function Kq(i,o){var f=qq(i),p=!f&&zq(i),E=!f&&!p&&Hq(i),t=!f&&!p&&!E&&Vq(i),k=f||p||E||t,L=k?jq(i.length,String):[],N=L.length;for(var C in i)(o||Yq.call(i,C))&&!(k&&(C=="length"||E&&(C=="offset"||C=="parent")||t&&(C=="buffer"||C=="byteLength"||C=="byteOffset")||Wq(C,N)))&&L.push(C);return L}vC.exports=Kq});var P_=ce((qee,mC)=>{var Xq=Object.prototype;function Qq(i){var o=i&&i.constructor,f=typeof o=="function"&&o.prototype||Xq;return i===f}mC.exports=Qq});var vD=ce((Hee,yC)=>{function Jq(i,o){return function(f){return i(o(f))}}yC.exports=Jq});var _C=ce((Wee,gC)=>{var Zq=vD(),$q=Zq(Object.keys,Object);gC.exports=$q});var DC=ce((Vee,EC)=>{var eH=P_(),tH=_C(),nH=Object.prototype,rH=nH.hasOwnProperty;function iH(i){if(!eH(i))return tH(i);var o=[];for(var f in Object(i))rH.call(i,f)&&f!="constructor"&&o.push(f);return o}EC.exports=iH});var mD=ce((Gee,wC)=>{var uH=rD(),oH=dD();function lH(i){return i!=null&&oH(i.length)&&!uH(i)}wC.exports=lH});var I_=ce((Yee,SC)=>{var sH=hD(),aH=DC(),fH=mD();function cH(i){return fH(i)?sH(i):aH(i)}SC.exports=cH});var CC=ce((Kee,TC)=>{var dH=Gv(),pH=I_();function hH(i,o){return i&&dH(o,pH(o),i)}TC.exports=hH});var AC=ce((Xee,xC)=>{function vH(i){var o=[];if(i!=null)for(var f in Object(i))o.push(f);return o}xC.exports=vH});var OC=ce((Qee,RC)=>{var mH=qv(),yH=P_(),gH=AC(),_H=Object.prototype,EH=_H.hasOwnProperty;function DH(i){if(!mH(i))return gH(i);var o=yH(i),f=[];for(var p in i)p=="constructor"&&(o||!EH.call(i,p))||f.push(p);return f}RC.exports=DH});var B_=ce((Jee,kC)=>{var wH=hD(),SH=OC(),TH=mD();function CH(i){return TH(i)?wH(i,!0):SH(i)}kC.exports=CH});var NC=ce((Zee,MC)=>{var xH=Gv(),AH=B_();function RH(i,o){return i&&xH(o,AH(o),i)}MC.exports=RH});var IC=ce((Qy,Xv)=>{var OH=Yf(),LC=typeof Qy=="object"&&Qy&&!Qy.nodeType&&Qy,FC=LC&&typeof Xv=="object"&&Xv&&!Xv.nodeType&&Xv,kH=FC&&FC.exports===LC,bC=kH?OH.Buffer:void 0,PC=bC?bC.allocUnsafe:void 0;function MH(i,o){if(o)return i.slice();var f=i.length,p=PC?PC(f):new i.constructor(f);return i.copy(p),p}Xv.exports=MH});var UC=ce(($ee,BC)=>{function NH(i,o){var f=-1,p=i.length;for(o||(o=Array(p));++f{function LH(i,o){for(var f=-1,p=i==null?0:i.length,E=0,t=[];++f{function FH(){return[]}qC.exports=FH});var U_=ce((nte,HC)=>{var bH=zC(),PH=yD(),IH=Object.prototype,BH=IH.propertyIsEnumerable,WC=Object.getOwnPropertySymbols,UH=WC?function(i){return i==null?[]:(i=Object(i),bH(WC(i),function(o){return BH.call(i,o)}))}:PH;HC.exports=UH});var GC=ce((rte,VC)=>{var jH=Gv(),zH=U_();function qH(i,o){return jH(i,zH(i),o)}VC.exports=qH});var j_=ce((ite,YC)=>{function HH(i,o){for(var f=-1,p=o.length,E=i.length;++f{var WH=vD(),VH=WH(Object.getPrototypeOf,Object);KC.exports=VH});var gD=ce((ote,XC)=>{var GH=j_(),YH=z_(),KH=U_(),XH=yD(),QH=Object.getOwnPropertySymbols,JH=QH?function(i){for(var o=[];i;)GH(o,KH(i)),i=YH(i);return o}:XH;XC.exports=JH});var JC=ce((lte,QC)=>{var ZH=Gv(),$H=gD();function eW(i,o){return ZH(i,$H(i),o)}QC.exports=eW});var _D=ce((ste,ZC)=>{var tW=j_(),nW=fd();function rW(i,o,f){var p=o(i);return nW(i)?p:tW(p,f(i))}ZC.exports=rW});var e6=ce((ate,$C)=>{var iW=_D(),uW=U_(),oW=I_();function lW(i){return iW(i,oW,uW)}$C.exports=lW});var ED=ce((fte,t6)=>{var sW=_D(),aW=gD(),fW=B_();function cW(i){return sW(i,fW,aW)}t6.exports=cW});var r6=ce((cte,n6)=>{var dW=sd(),pW=Yf(),hW=dW(pW,"DataView");n6.exports=hW});var u6=ce((dte,i6)=>{var vW=sd(),mW=Yf(),yW=vW(mW,"Promise");i6.exports=yW});var l6=ce((pte,o6)=>{var gW=sd(),_W=Yf(),EW=gW(_W,"Set");o6.exports=EW});var a6=ce((hte,s6)=>{var DW=sd(),wW=Yf(),SW=DW(wW,"WeakMap");s6.exports=SW});var q_=ce((vte,f6)=>{var DD=r6(),wD=L_(),SD=u6(),TD=l6(),CD=a6(),c6=Qp(),Qv=uD(),d6="[object Map]",TW="[object Object]",p6="[object Promise]",h6="[object Set]",v6="[object WeakMap]",m6="[object DataView]",CW=Qv(DD),xW=Qv(wD),AW=Qv(SD),RW=Qv(TD),OW=Qv(CD),Jp=c6;(DD&&Jp(new DD(new ArrayBuffer(1)))!=m6||wD&&Jp(new wD)!=d6||SD&&Jp(SD.resolve())!=p6||TD&&Jp(new TD)!=h6||CD&&Jp(new CD)!=v6)&&(Jp=function(i){var o=c6(i),f=o==TW?i.constructor:void 0,p=f?Qv(f):"";if(p)switch(p){case CW:return m6;case xW:return d6;case AW:return p6;case RW:return h6;case OW:return v6}return o});f6.exports=Jp});var g6=ce((mte,y6)=>{var kW=Object.prototype,MW=kW.hasOwnProperty;function NW(i){var o=i.length,f=new i.constructor(o);return o&&typeof i[0]=="string"&&MW.call(i,"index")&&(f.index=i.index,f.input=i.input),f}y6.exports=NW});var E6=ce((yte,_6)=>{var LW=Yf(),FW=LW.Uint8Array;_6.exports=FW});var H_=ce((gte,D6)=>{var w6=E6();function bW(i){var o=new i.constructor(i.byteLength);return new w6(o).set(new w6(i)),o}D6.exports=bW});var T6=ce((_te,S6)=>{var PW=H_();function IW(i,o){var f=o?PW(i.buffer):i.buffer;return new i.constructor(f,i.byteOffset,i.byteLength)}S6.exports=IW});var x6=ce((Ete,C6)=>{var BW=/\w*$/;function UW(i){var o=new i.constructor(i.source,BW.exec(i));return o.lastIndex=i.lastIndex,o}C6.exports=UW});var M6=ce((Dte,A6)=>{var R6=zv(),O6=R6?R6.prototype:void 0,k6=O6?O6.valueOf:void 0;function jW(i){return k6?Object(k6.call(i)):{}}A6.exports=jW});var L6=ce((wte,N6)=>{var zW=H_();function qW(i,o){var f=o?zW(i.buffer):i.buffer;return new i.constructor(f,i.byteOffset,i.length)}N6.exports=qW});var b6=ce((Ste,F6)=>{var HW=H_(),WW=T6(),VW=x6(),GW=M6(),YW=L6(),KW="[object Boolean]",XW="[object Date]",QW="[object Map]",JW="[object Number]",ZW="[object RegExp]",$W="[object Set]",eV="[object String]",tV="[object Symbol]",nV="[object ArrayBuffer]",rV="[object DataView]",iV="[object Float32Array]",uV="[object Float64Array]",oV="[object Int8Array]",lV="[object Int16Array]",sV="[object Int32Array]",aV="[object Uint8Array]",fV="[object Uint8ClampedArray]",cV="[object Uint16Array]",dV="[object Uint32Array]";function pV(i,o,f){var p=i.constructor;switch(o){case nV:return HW(i);case KW:case XW:return new p(+i);case rV:return WW(i,f);case iV:case uV:case oV:case lV:case sV:case aV:case fV:case cV:case dV:return YW(i,f);case QW:return new p;case JW:case eV:return new p(i);case ZW:return VW(i);case $W:return new p;case tV:return GW(i)}}F6.exports=pV});var B6=ce((Tte,P6)=>{var hV=qv(),I6=Object.create,vV=function(){function i(){}return function(o){if(!hV(o))return{};if(I6)return I6(o);i.prototype=o;var f=new i;return i.prototype=void 0,f}}();P6.exports=vV});var j6=ce((Cte,U6)=>{var mV=B6(),yV=z_(),gV=P_();function _V(i){return typeof i.constructor=="function"&&!gV(i)?mV(yV(i)):{}}U6.exports=_V});var q6=ce((xte,z6)=>{var EV=q_(),DV=ad(),wV="[object Map]";function SV(i){return DV(i)&&EV(i)==wV}z6.exports=SV});var G6=ce((Ate,H6)=>{var TV=q6(),CV=F_(),W6=b_(),V6=W6&&W6.isMap,xV=V6?CV(V6):TV;H6.exports=xV});var K6=ce((Rte,Y6)=>{var AV=q_(),RV=ad(),OV="[object Set]";function kV(i){return RV(i)&&AV(i)==OV}Y6.exports=kV});var Z6=ce((Ote,X6)=>{var MV=K6(),NV=F_(),Q6=b_(),J6=Q6&&Q6.isSet,LV=J6?NV(J6):MV;X6.exports=LV});var rx=ce((kte,$6)=>{var FV=PT(),bV=BT(),PV=aD(),IV=CC(),BV=NC(),UV=IC(),jV=UC(),zV=GC(),qV=JC(),HV=e6(),WV=ED(),VV=q_(),GV=g6(),YV=b6(),KV=j6(),XV=fd(),QV=cD(),JV=G6(),ZV=qv(),$V=Z6(),eG=I_(),tG=B_(),nG=1,rG=2,iG=4,ex="[object Arguments]",uG="[object Array]",oG="[object Boolean]",lG="[object Date]",sG="[object Error]",tx="[object Function]",aG="[object GeneratorFunction]",fG="[object Map]",cG="[object Number]",nx="[object Object]",dG="[object RegExp]",pG="[object Set]",hG="[object String]",vG="[object Symbol]",mG="[object WeakMap]",yG="[object ArrayBuffer]",gG="[object DataView]",_G="[object Float32Array]",EG="[object Float64Array]",DG="[object Int8Array]",wG="[object Int16Array]",SG="[object Int32Array]",TG="[object Uint8Array]",CG="[object Uint8ClampedArray]",xG="[object Uint16Array]",AG="[object Uint32Array]",Wu={};Wu[ex]=Wu[uG]=Wu[yG]=Wu[gG]=Wu[oG]=Wu[lG]=Wu[_G]=Wu[EG]=Wu[DG]=Wu[wG]=Wu[SG]=Wu[fG]=Wu[cG]=Wu[nx]=Wu[dG]=Wu[pG]=Wu[hG]=Wu[vG]=Wu[TG]=Wu[CG]=Wu[xG]=Wu[AG]=!0;Wu[sG]=Wu[tx]=Wu[mG]=!1;function W_(i,o,f,p,E,t){var k,L=o&nG,N=o&rG,C=o&iG;if(f&&(k=E?f(i,p,E,t):f(i)),k!==void 0)return k;if(!ZV(i))return i;var U=XV(i);if(U){if(k=GV(i),!L)return jV(i,k)}else{var q=VV(i),W=q==tx||q==aG;if(QV(i))return UV(i,L);if(q==nx||q==ex||W&&!E){if(k=N||W?{}:KV(i),!L)return N?qV(i,BV(k,i)):zV(i,IV(k,i))}else{if(!Wu[q])return E?i:{};k=YV(i,q,L)}}t||(t=new FV);var ne=t.get(i);if(ne)return ne;t.set(i,k),$V(i)?i.forEach(function(Se){k.add(W_(Se,o,f,Se,i,t))}):JV(i)&&i.forEach(function(Se,he){k.set(he,W_(Se,o,f,he,i,t))});var m=C?N?WV:HV:N?tG:eG,we=U?void 0:m(i);return bV(we||i,function(Se,he){we&&(he=Se,Se=i[he]),PV(k,he,W_(Se,o,f,he,i,t))}),k}$6.exports=W_});var V_=ce((Mte,ix)=>{var RG=Qp(),OG=ad(),kG="[object Symbol]";function MG(i){return typeof i=="symbol"||OG(i)&&RG(i)==kG}ix.exports=MG});var ox=ce((Nte,ux)=>{var NG=fd(),LG=V_(),FG=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,bG=/^\w*$/;function PG(i,o){if(NG(i))return!1;var f=typeof i;return f=="number"||f=="symbol"||f=="boolean"||i==null||LG(i)?!0:bG.test(i)||!FG.test(i)||o!=null&&i in Object(o)}ux.exports=PG});var ax=ce((Lte,lx)=>{var sx=oD(),IG="Expected a function";function xD(i,o){if(typeof i!="function"||o!=null&&typeof o!="function")throw new TypeError(IG);var f=function(){var p=arguments,E=o?o.apply(this,p):p[0],t=f.cache;if(t.has(E))return t.get(E);var k=i.apply(this,p);return f.cache=t.set(E,k)||t,k};return f.cache=new(xD.Cache||sx),f}xD.Cache=sx;lx.exports=xD});var cx=ce((Fte,fx)=>{var BG=ax(),UG=500;function jG(i){var o=BG(i,function(p){return f.size===UG&&f.clear(),p}),f=o.cache;return o}fx.exports=jG});var px=ce((bte,dx)=>{var zG=cx(),qG=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,HG=/\\(\\)?/g,WG=zG(function(i){var o=[];return i.charCodeAt(0)===46&&o.push(""),i.replace(qG,function(f,p,E,t){o.push(E?t.replace(HG,"$1"):p||f)}),o});dx.exports=WG});var _x=ce((Pte,hx)=>{var vx=zv(),VG=eD(),GG=fd(),YG=V_(),KG=1/0,mx=vx?vx.prototype:void 0,yx=mx?mx.toString:void 0;function gx(i){if(typeof i=="string")return i;if(GG(i))return VG(i,gx)+"";if(YG(i))return yx?yx.call(i):"";var o=i+"";return o=="0"&&1/i==-KG?"-0":o}hx.exports=gx});var Dx=ce((Ite,Ex)=>{var XG=_x();function QG(i){return i==null?"":XG(i)}Ex.exports=QG});var G_=ce((Bte,wx)=>{var JG=fd(),ZG=ox(),$G=px(),eY=Dx();function tY(i,o){return JG(i)?i:ZG(i,o)?[i]:$G(eY(i))}wx.exports=tY});var Tx=ce((Ute,Sx)=>{function nY(i){var o=i==null?0:i.length;return o?i[o-1]:void 0}Sx.exports=nY});var AD=ce((jte,Cx)=>{var rY=V_(),iY=1/0;function uY(i){if(typeof i=="string"||rY(i))return i;var o=i+"";return o=="0"&&1/i==-iY?"-0":o}Cx.exports=uY});var Ax=ce((zte,xx)=>{var oY=G_(),lY=AD();function sY(i,o){o=oY(o,i);for(var f=0,p=o.length;i!=null&&f{function aY(i,o,f){var p=-1,E=i.length;o<0&&(o=-o>E?0:E+o),f=f>E?E:f,f<0&&(f+=E),E=o>f?0:f-o>>>0,o>>>=0;for(var t=Array(E);++p{var fY=Ax(),cY=Ox();function dY(i,o){return o.length<2?i:fY(i,cY(o,0,-1))}kx.exports=dY});var Lx=ce((Wte,Nx)=>{var pY=G_(),hY=Tx(),vY=Mx(),mY=AD();function yY(i,o){return o=pY(o,i),i=vY(i,o),i==null||delete i[mY(hY(o))]}Nx.exports=yY});var Px=ce((Vte,Fx)=>{var gY=Qp(),_Y=z_(),EY=ad(),DY="[object Object]",wY=Function.prototype,SY=Object.prototype,bx=wY.toString,TY=SY.hasOwnProperty,CY=bx.call(Object);function xY(i){if(!EY(i)||gY(i)!=DY)return!1;var o=_Y(i);if(o===null)return!0;var f=TY.call(o,"constructor")&&o.constructor;return typeof f=="function"&&f instanceof f&&bx.call(f)==CY}Fx.exports=xY});var Bx=ce((Gte,Ix)=>{var AY=Px();function RY(i){return AY(i)?void 0:i}Ix.exports=RY});var qx=ce((Yte,Ux)=>{var jx=zv(),OY=fD(),kY=fd(),zx=jx?jx.isConcatSpreadable:void 0;function MY(i){return kY(i)||OY(i)||!!(zx&&i&&i[zx])}Ux.exports=MY});var Vx=ce((Kte,Hx)=>{var NY=j_(),LY=qx();function Wx(i,o,f,p,E){var t=-1,k=i.length;for(f||(f=LY),E||(E=[]);++t0&&f(L)?o>1?Wx(L,o-1,f,p,E):NY(E,L):p||(E[E.length]=L)}return E}Hx.exports=Wx});var Yx=ce((Xte,Gx)=>{var FY=Vx();function bY(i){var o=i==null?0:i.length;return o?FY(i,1):[]}Gx.exports=bY});var Xx=ce((Qte,Kx)=>{function PY(i,o,f){switch(f.length){case 0:return i.call(o);case 1:return i.call(o,f[0]);case 2:return i.call(o,f[0],f[1]);case 3:return i.call(o,f[0],f[1],f[2])}return i.apply(o,f)}Kx.exports=PY});var Zx=ce((Jte,Qx)=>{var IY=Xx(),Jx=Math.max;function BY(i,o,f){return o=Jx(o===void 0?i.length-1:o,0),function(){for(var p=arguments,E=-1,t=Jx(p.length-o,0),k=Array(t);++E{function UY(i){return function(){return i}}$x.exports=UY});var n5=ce(($te,t5)=>{function jY(i){return i}t5.exports=jY});var u5=ce((ene,r5)=>{var zY=e5(),i5=lD(),qY=n5(),HY=i5?function(i,o){return i5(i,"toString",{configurable:!0,enumerable:!1,value:zY(o),writable:!0})}:qY;r5.exports=HY});var l5=ce((tne,o5)=>{var WY=800,VY=16,GY=Date.now;function YY(i){var o=0,f=0;return function(){var p=GY(),E=VY-(p-f);if(f=p,E>0){if(++o>=WY)return arguments[0]}else o=0;return i.apply(void 0,arguments)}}o5.exports=YY});var a5=ce((nne,s5)=>{var KY=u5(),XY=l5(),QY=XY(KY);s5.exports=QY});var c5=ce((rne,f5)=>{var JY=Yx(),ZY=Zx(),$Y=a5();function eK(i){return $Y(ZY(i,void 0,JY),i+"")}f5.exports=eK});var p5=ce((ine,d5)=>{var tK=eD(),nK=rx(),rK=Lx(),iK=G_(),uK=Gv(),oK=Bx(),lK=c5(),sK=ED(),aK=1,fK=2,cK=4,dK=lK(function(i,o){var f={};if(i==null)return f;var p=!1;o=tK(o,function(t){return t=iK(t,i),p||(p=t.length>1),t}),uK(i,sK(i),f),p&&(f=nK(f,aK|fK|cK,oK));for(var E=o.length;E--;)rK(f,o[E]);return f});d5.exports=dK});var eg=ce((vne,y5)=>{"use strict";var g5=Object.getOwnPropertySymbols,_K=Object.prototype.hasOwnProperty,EK=Object.prototype.propertyIsEnumerable;function DK(i){if(i==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(i)}function wK(){try{if(!Object.assign)return!1;var i=new String("abc");if(i[5]="de",Object.getOwnPropertyNames(i)[0]==="5")return!1;for(var o={},f=0;f<10;f++)o["_"+String.fromCharCode(f)]=f;var p=Object.getOwnPropertyNames(o).map(function(t){return o[t]});if(p.join("")!=="0123456789")return!1;var E={};return"abcdefghijklmnopqrst".split("").forEach(function(t){E[t]=t}),Object.keys(Object.assign({},E)).join("")==="abcdefghijklmnopqrst"}catch(t){return!1}}y5.exports=wK()?Object.assign:function(i,o){for(var f,p=DK(i),E,t=1;t{"use strict";var LD=eg(),Kf=typeof Symbol=="function"&&Symbol.for,tg=Kf?Symbol.for("react.element"):60103,SK=Kf?Symbol.for("react.portal"):60106,TK=Kf?Symbol.for("react.fragment"):60107,CK=Kf?Symbol.for("react.strict_mode"):60108,xK=Kf?Symbol.for("react.profiler"):60114,AK=Kf?Symbol.for("react.provider"):60109,RK=Kf?Symbol.for("react.context"):60110,OK=Kf?Symbol.for("react.forward_ref"):60112,kK=Kf?Symbol.for("react.suspense"):60113,MK=Kf?Symbol.for("react.memo"):60115,NK=Kf?Symbol.for("react.lazy"):60116,_5=typeof Symbol=="function"&&Symbol.iterator;function ng(i){for(var o="https://reactjs.org/docs/error-decoder.html?invariant="+i,f=1;fJ_.length&&J_.push(i)}function BD(i,o,f,p){var E=typeof i;(E==="undefined"||E==="boolean")&&(i=null);var t=!1;if(i===null)t=!0;else switch(E){case"string":case"number":t=!0;break;case"object":switch(i.$$typeof){case tg:case SK:t=!0}}if(t)return f(p,i,o===""?"."+UD(i,0):o),1;if(t=0,o=o===""?".":o+":",Array.isArray(i))for(var k=0;k{"use strict";var BK="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";M5.exports=BK});var HD=ce((gne,L5)=>{"use strict";var qD=function(){};process.env.NODE_ENV!=="production"&&(F5=N5(),Z_={},b5=Function.call.bind(Object.prototype.hasOwnProperty),qD=function(i){var o="Warning: "+i;typeof console!="undefined"&&console.error(o);try{throw new Error(o)}catch(f){}});var F5,Z_,b5;function P5(i,o,f,p,E){if(process.env.NODE_ENV!=="production"){for(var t in i)if(b5(i,t)){var k;try{if(typeof i[t]!="function"){var L=Error((p||"React class")+": "+f+" type `"+t+"` is invalid; it must be a function, usually from the `prop-types` package, but received `"+typeof i[t]+"`.");throw L.name="Invariant Violation",L}k=i[t](o,t,p,f,null,F5)}catch(C){k=C}if(k&&!(k instanceof Error)&&qD((p||"React class")+": type specification of "+f+" `"+t+"` is invalid; the type checker function must return `null` or an `Error` but returned a "+typeof k+". You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument)."),k instanceof Error&&!(k.message in Z_)){Z_[k.message]=!0;var N=E?E():"";qD("Failed "+f+" type: "+k.message+(N!=null?N:""))}}}}P5.resetWarningCache=function(){process.env.NODE_ENV!=="production"&&(Z_={})};L5.exports=P5});var I5=ce(pu=>{"use strict";process.env.NODE_ENV!=="production"&&function(){"use strict";var i=eg(),o=HD(),f="16.13.1",p=typeof Symbol=="function"&&Symbol.for,E=p?Symbol.for("react.element"):60103,t=p?Symbol.for("react.portal"):60106,k=p?Symbol.for("react.fragment"):60107,L=p?Symbol.for("react.strict_mode"):60108,N=p?Symbol.for("react.profiler"):60114,C=p?Symbol.for("react.provider"):60109,U=p?Symbol.for("react.context"):60110,q=p?Symbol.for("react.concurrent_mode"):60111,W=p?Symbol.for("react.forward_ref"):60112,ne=p?Symbol.for("react.suspense"):60113,m=p?Symbol.for("react.suspense_list"):60120,we=p?Symbol.for("react.memo"):60115,Se=p?Symbol.for("react.lazy"):60116,he=p?Symbol.for("react.block"):60121,ge=p?Symbol.for("react.fundamental"):60117,ze=p?Symbol.for("react.responder"):60118,pe=p?Symbol.for("react.scope"):60119,Oe=typeof Symbol=="function"&&Symbol.iterator,le="@@iterator";function Ue(X){if(X===null||typeof X!="object")return null;var _e=Oe&&X[Oe]||X[le];return typeof _e=="function"?_e:null}var Ge={current:null},rt={suspense:null},wt={current:null},xt=/^(.*)[\\\/]/;function $e(X,_e,Ne){var Me="";if(_e){var dt=_e.fileName,Hn=dt.replace(xt,"");if(/^index\./.test(Hn)){var Dn=dt.match(xt);if(Dn){var or=Dn[1];if(or){var mi=or.replace(xt,"");Hn=mi+"/"+Hn}}}Me=" (at "+Hn+":"+_e.lineNumber+")"}else Ne&&(Me=" (created by "+Ne+")");return` + in `+(X||"Unknown")+Me}var ft=1;function Ke(X){return X._status===ft?X._result:null}function jt(X,_e,Ne){var Me=_e.displayName||_e.name||"";return X.displayName||(Me!==""?Ne+"("+Me+")":Ne)}function $t(X){if(X==null)return null;if(typeof X.tag=="number"&&ct("Received an unexpected object in getComponentName(). This is likely a bug in React. Please file an issue."),typeof X=="function")return X.displayName||X.name||null;if(typeof X=="string")return X;switch(X){case k:return"Fragment";case t:return"Portal";case N:return"Profiler";case L:return"StrictMode";case ne:return"Suspense";case m:return"SuspenseList"}if(typeof X=="object")switch(X.$$typeof){case U:return"Context.Consumer";case C:return"Context.Provider";case W:return jt(X,X.render,"ForwardRef");case we:return $t(X.type);case he:return $t(X.render);case Se:{var _e=X,Ne=Ke(_e);if(Ne)return $t(Ne);break}}return null}var at={},Q=null;function ae(X){Q=X}at.getCurrentStack=null,at.getStackAddendum=function(){var X="";if(Q){var _e=$t(Q.type),Ne=Q._owner;X+=$e(_e,Q._source,Ne&&$t(Ne.type))}var Me=at.getCurrentStack;return Me&&(X+=Me()||""),X};var Ce={current:!1},ue={ReactCurrentDispatcher:Ge,ReactCurrentBatchConfig:rt,ReactCurrentOwner:wt,IsSomeRendererActing:Ce,assign:i};i(ue,{ReactDebugCurrentFrame:at,ReactComponentTreeHook:{}});function je(X){{for(var _e=arguments.length,Ne=new Array(_e>1?_e-1:0),Me=1;Me<_e;Me++)Ne[Me-1]=arguments[Me];At("warn",X,Ne)}}function ct(X){{for(var _e=arguments.length,Ne=new Array(_e>1?_e-1:0),Me=1;Me<_e;Me++)Ne[Me-1]=arguments[Me];At("error",X,Ne)}}function At(X,_e,Ne){{var Me=Ne.length>0&&typeof Ne[Ne.length-1]=="string"&&Ne[Ne.length-1].indexOf(` + in`)===0;if(!Me){var dt=ue.ReactDebugCurrentFrame,Hn=dt.getStackAddendum();Hn!==""&&(_e+="%s",Ne=Ne.concat([Hn]))}var Dn=Ne.map(function(Su){return""+Su});Dn.unshift("Warning: "+_e),Function.prototype.apply.call(console[X],console,Dn);try{var or=0,mi="Warning: "+_e.replace(/%s/g,function(){return Ne[or++]});throw new Error(mi)}catch(Su){}}}var en={};function ln(X,_e){{var Ne=X.constructor,Me=Ne&&(Ne.displayName||Ne.name)||"ReactClass",dt=Me+"."+_e;if(en[dt])return;ct("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",_e,Me),en[dt]=!0}}var An={isMounted:function(X){return!1},enqueueForceUpdate:function(X,_e,Ne){ln(X,"forceUpdate")},enqueueReplaceState:function(X,_e,Ne,Me){ln(X,"replaceState")},enqueueSetState:function(X,_e,Ne,Me){ln(X,"setState")}},nr={};Object.freeze(nr);function un(X,_e,Ne){this.props=X,this.context=_e,this.refs=nr,this.updater=Ne||An}un.prototype.isReactComponent={},un.prototype.setState=function(X,_e){if(!(typeof X=="object"||typeof X=="function"||X==null))throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,X,_e,"setState")},un.prototype.forceUpdate=function(X){this.updater.enqueueForceUpdate(this,X,"forceUpdate")};{var Wt={isMounted:["isMounted","Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks."],replaceState:["replaceState","Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236)."]},vr=function(X,_e){Object.defineProperty(un.prototype,X,{get:function(){je("%s(...) is deprecated in plain JavaScript React classes. %s",_e[0],_e[1])}})};for(var w in Wt)Wt.hasOwnProperty(w)&&vr(w,Wt[w])}function Ut(){}Ut.prototype=un.prototype;function Vn(X,_e,Ne){this.props=X,this.context=_e,this.refs=nr,this.updater=Ne||An}var fr=Vn.prototype=new Ut;fr.constructor=Vn,i(fr,un.prototype),fr.isPureReactComponent=!0;function Fr(){var X={current:null};return Object.seal(X),X}var ur=Object.prototype.hasOwnProperty,br={key:!0,ref:!0,__self:!0,__source:!0},Kt,vu,a0;a0={};function So(X){if(ur.call(X,"ref")){var _e=Object.getOwnPropertyDescriptor(X,"ref").get;if(_e&&_e.isReactWarning)return!1}return X.ref!==void 0}function Go(X){if(ur.call(X,"key")){var _e=Object.getOwnPropertyDescriptor(X,"key").get;if(_e&&_e.isReactWarning)return!1}return X.key!==void 0}function Os(X,_e){var Ne=function(){Kt||(Kt=!0,ct("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://fb.me/react-special-props)",_e))};Ne.isReactWarning=!0,Object.defineProperty(X,"key",{get:Ne,configurable:!0})}function Yo(X,_e){var Ne=function(){vu||(vu=!0,ct("%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://fb.me/react-special-props)",_e))};Ne.isReactWarning=!0,Object.defineProperty(X,"ref",{get:Ne,configurable:!0})}function Ko(X){if(typeof X.ref=="string"&&wt.current&&X.__self&&wt.current.stateNode!==X.__self){var _e=$t(wt.current.type);a0[_e]||(ct('Component "%s" contains the string ref "%s". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://fb.me/react-strict-mode-string-ref',$t(wt.current.type),X.ref),a0[_e]=!0)}}var qt=function(X,_e,Ne,Me,dt,Hn,Dn){var or={$$typeof:E,type:X,key:_e,ref:Ne,props:Dn,_owner:Hn};return or._store={},Object.defineProperty(or._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(or,"_self",{configurable:!1,enumerable:!1,writable:!1,value:Me}),Object.defineProperty(or,"_source",{configurable:!1,enumerable:!1,writable:!1,value:dt}),Object.freeze&&(Object.freeze(or.props),Object.freeze(or)),or};function _i(X,_e,Ne){var Me,dt={},Hn=null,Dn=null,or=null,mi=null;if(_e!=null){So(_e)&&(Dn=_e.ref,Ko(_e)),Go(_e)&&(Hn=""+_e.key),or=_e.__self===void 0?null:_e.__self,mi=_e.__source===void 0?null:_e.__source;for(Me in _e)ur.call(_e,Me)&&!br.hasOwnProperty(Me)&&(dt[Me]=_e[Me])}var Su=arguments.length-2;if(Su===1)dt.children=Ne;else if(Su>1){for(var bu=Array(Su),Pu=0;Pu1){for(var mu=Array(Pu),yi=0;yi is not supported and will be removed in a future major release. Did you mean to render instead?")),Ne.Provider},set:function(Dn){Ne.Provider=Dn}},_currentValue:{get:function(){return Ne._currentValue},set:function(Dn){Ne._currentValue=Dn}},_currentValue2:{get:function(){return Ne._currentValue2},set:function(Dn){Ne._currentValue2=Dn}},_threadCount:{get:function(){return Ne._threadCount},set:function(Dn){Ne._threadCount=Dn}},Consumer:{get:function(){return Me||(Me=!0,ct("Rendering is not supported and will be removed in a future major release. Did you mean to render instead?")),Ne.Consumer}}}),Ne.Consumer=Hn}return Ne._currentRenderer=null,Ne._currentRenderer2=null,Ne}function Ht(X){var _e={$$typeof:Se,_ctor:X,_status:-1,_result:null};{var Ne,Me;Object.defineProperties(_e,{defaultProps:{configurable:!0,get:function(){return Ne},set:function(dt){ct("React.lazy(...): It is not supported to assign `defaultProps` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it."),Ne=dt,Object.defineProperty(_e,"defaultProps",{enumerable:!0})}},propTypes:{configurable:!0,get:function(){return Me},set:function(dt){ct("React.lazy(...): It is not supported to assign `propTypes` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it."),Me=dt,Object.defineProperty(_e,"propTypes",{enumerable:!0})}}})}return _e}function Du(X){return X!=null&&X.$$typeof===we?ct("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."):typeof X!="function"?ct("forwardRef requires a render function but was given %s.",X===null?"null":typeof X):X.length!==0&&X.length!==2&&ct("forwardRef render functions accept exactly two parameters: props and ref. %s",X.length===1?"Did you forget to use the ref parameter?":"Any additional parameter will be undefined."),X!=null&&(X.defaultProps!=null||X.propTypes!=null)&&ct("forwardRef render functions do not support propTypes or defaultProps. Did you accidentally pass a React component?"),{$$typeof:W,render:X}}function Yi(X){return typeof X=="string"||typeof X=="function"||X===k||X===q||X===N||X===L||X===ne||X===m||typeof X=="object"&&X!==null&&(X.$$typeof===Se||X.$$typeof===we||X.$$typeof===C||X.$$typeof===U||X.$$typeof===W||X.$$typeof===ge||X.$$typeof===ze||X.$$typeof===pe||X.$$typeof===he)}function Y0(X,_e){return Yi(X)||ct("memo: The first argument must be a component. Instead received: %s",X===null?"null":typeof X),{$$typeof:we,type:X,compare:_e===void 0?null:_e}}function Ui(){var X=Ge.current;if(X===null)throw Error(`Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons: +1. You might have mismatching versions of React and the renderer (such as React DOM) +2. You might be breaking the Rules of Hooks +3. You might have more than one copy of React in the same app +See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.`);return X}function Wl(X,_e){var Ne=Ui();if(_e!==void 0&&ct("useContext() second argument is reserved for future use in React. Passing it is not supported. You passed: %s.%s",_e,typeof _e=="number"&&Array.isArray(arguments[2])?` + +Did you call array.map(useContext)? Calling Hooks inside a loop is not supported. Learn more at https://fb.me/rules-of-hooks`:""),X._context!==void 0){var Me=X._context;Me.Consumer===X?ct("Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be removed in a future major release. Did you mean to call useContext(Context) instead?"):Me.Provider===X&&ct("Calling useContext(Context.Provider) is not supported. Did you mean to call useContext(Context) instead?")}return Ne.useContext(X,_e)}function xo(X){var _e=Ui();return _e.useState(X)}function ni(X,_e,Ne){var Me=Ui();return Me.useReducer(X,_e,Ne)}function oo(X){var _e=Ui();return _e.useRef(X)}function Vl(X,_e){var Ne=Ui();return Ne.useEffect(X,_e)}function Ao(X,_e){var Ne=Ui();return Ne.useLayoutEffect(X,_e)}function Ms(X,_e){var Ne=Ui();return Ne.useCallback(X,_e)}function Xn(X,_e){var Ne=Ui();return Ne.useMemo(X,_e)}function Qo(X,_e,Ne){var Me=Ui();return Me.useImperativeHandle(X,_e,Ne)}function lo(X,_e){{var Ne=Ui();return Ne.useDebugValue(X,_e)}}var b0;b0=!1;function yl(){if(wt.current){var X=$t(wt.current.type);if(X)return` + +Check the render method of \``+X+"`."}return""}function Ro(X){if(X!==void 0){var _e=X.fileName.replace(/^.*[\\\/]/,""),Ne=X.lineNumber;return` + +Check your code at `+_e+":"+Ne+"."}return""}function Et(X){return X!=null?Ro(X.__source):""}var Pt={};function Bn(X){var _e=yl();if(!_e){var Ne=typeof X=="string"?X:X.displayName||X.name;Ne&&(_e=` + +Check the top-level render call using <`+Ne+">.")}return _e}function Ir(X,_e){if(!(!X._store||X._store.validated||X.key!=null)){X._store.validated=!0;var Ne=Bn(_e);if(!Pt[Ne]){Pt[Ne]=!0;var Me="";X&&X._owner&&X._owner!==wt.current&&(Me=" It was passed a child from "+$t(X._owner.type)+"."),ae(X),ct('Each child in a list should have a unique "key" prop.%s%s See https://fb.me/react-warning-keys for more information.',Ne,Me),ae(null)}}}function ji(X,_e){if(typeof X=="object"){if(Array.isArray(X))for(var Ne=0;Ne",dt=" Did you accidentally export a JSX literal instead of a component?"):Dn=typeof X,ct("React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",Dn,dt)}var or=_i.apply(this,arguments);if(or==null)return or;if(Me)for(var mi=2;mi{"use strict";process.env.NODE_ENV==="production"?WD.exports=k5():WD.exports=I5()});var B5=ce((nm,rg)=>{(function(){var i,o="4.17.21",f=200,p="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",E="Expected a function",t="Invalid `variable` option passed into `_.template`",k="__lodash_hash_undefined__",L=500,N="__lodash_placeholder__",C=1,U=2,q=4,W=1,ne=2,m=1,we=2,Se=4,he=8,ge=16,ze=32,pe=64,Oe=128,le=256,Ue=512,Ge=30,rt="...",wt=800,xt=16,$e=1,ft=2,Ke=3,jt=1/0,$t=9007199254740991,at=17976931348623157e292,Q=0/0,ae=4294967295,Ce=ae-1,ue=ae>>>1,je=[["ary",Oe],["bind",m],["bindKey",we],["curry",he],["curryRight",ge],["flip",Ue],["partial",ze],["partialRight",pe],["rearg",le]],ct="[object Arguments]",At="[object Array]",en="[object AsyncFunction]",ln="[object Boolean]",An="[object Date]",nr="[object DOMException]",un="[object Error]",Wt="[object Function]",vr="[object GeneratorFunction]",w="[object Map]",Ut="[object Number]",Vn="[object Null]",fr="[object Object]",Fr="[object Promise]",ur="[object Proxy]",br="[object RegExp]",Kt="[object Set]",vu="[object String]",a0="[object Symbol]",So="[object Undefined]",Go="[object WeakMap]",Os="[object WeakSet]",Yo="[object ArrayBuffer]",Ko="[object DataView]",qt="[object Float32Array]",_i="[object Float64Array]",eu="[object Int8Array]",ai="[object Int16Array]",mr="[object Int32Array]",Xo="[object Uint8Array]",W0="[object Uint8ClampedArray]",Lu="[object Uint16Array]",V0="[object Uint32Array]",Hr=/\b__p \+= '';/g,To=/\b(__p \+=) '' \+/g,Co=/(__e\(.*?\)|\b__t\)) \+\n'';/g,L0=/&(?:amp|lt|gt|quot|#39);/g,tu=/[&<>"']/g,Si=RegExp(L0.source),ks=RegExp(tu.source),Hl=/<%-([\s\S]+?)%>/g,F0=/<%([\s\S]+?)%>/g,f0=/<%=([\s\S]+?)%>/g,Pr=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Ei=/^\w*$/,G0=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,fi=/[\\^$.*+?()[\]{}|]/g,Zt=RegExp(fi.source),Ln=/^\s+/,Di=/\s/,ci=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Ht=/\{\n\/\* \[wrapped with (.+)\] \*/,Du=/,? & /,Yi=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Y0=/[()=,{}\[\]\/\s]/,Ui=/\\(\\)?/g,Wl=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,xo=/\w*$/,ni=/^[-+]0x[0-9a-f]+$/i,oo=/^0b[01]+$/i,Vl=/^\[object .+?Constructor\]$/,Ao=/^0o[0-7]+$/i,Ms=/^(?:0|[1-9]\d*)$/,Xn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Qo=/($^)/,lo=/['\n\r\u2028\u2029\\]/g,b0="\\ud800-\\udfff",yl="\\u0300-\\u036f",Ro="\\ufe20-\\ufe2f",Et="\\u20d0-\\u20ff",Pt=yl+Ro+Et,Bn="\\u2700-\\u27bf",Ir="a-z\\xdf-\\xf6\\xf8-\\xff",ji="\\xac\\xb1\\xd7\\xf7",Wr="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",wu="\\u2000-\\u206f",c0=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Ti="A-Z\\xc0-\\xd6\\xd8-\\xde",d0="\\ufe0e\\ufe0f",as=ji+Wr+wu+c0,St="['\u2019]",so="["+b0+"]",Jo="["+as+"]",Gl="["+Pt+"]",Fu="\\d+",fs="["+Bn+"]",P0="["+Ir+"]",X="[^"+b0+as+Fu+Bn+Ir+Ti+"]",_e="\\ud83c[\\udffb-\\udfff]",Ne="(?:"+Gl+"|"+_e+")",Me="[^"+b0+"]",dt="(?:\\ud83c[\\udde6-\\uddff]){2}",Hn="[\\ud800-\\udbff][\\udc00-\\udfff]",Dn="["+Ti+"]",or="\\u200d",mi="(?:"+P0+"|"+X+")",Su="(?:"+Dn+"|"+X+")",bu="(?:"+St+"(?:d|ll|m|re|s|t|ve))?",Pu="(?:"+St+"(?:D|LL|M|RE|S|T|VE))?",mu=Ne+"?",yi="["+d0+"]?",Oo="(?:"+or+"(?:"+[Me,dt,Hn].join("|")+")"+yi+mu+")*",Tu="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",ao="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",Iu=yi+mu+Oo,Oa="(?:"+[fs,dt,Hn].join("|")+")"+Iu,p0="(?:"+[Me+Gl+"?",Gl,dt,Hn,so].join("|")+")",Zs=RegExp(St,"g"),K0=RegExp(Gl,"g"),$s=RegExp(_e+"(?="+_e+")|"+p0+Iu,"g"),ka=RegExp([Dn+"?"+P0+"+"+bu+"(?="+[Jo,Dn,"$"].join("|")+")",Su+"+"+Pu+"(?="+[Jo,Dn+mi,"$"].join("|")+")",Dn+"?"+mi+"+"+bu,Dn+"+"+Pu,ao,Tu,Fu,Oa].join("|"),"g"),cs=RegExp("["+or+b0+Pt+d0+"]"),w0=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Gn=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],ic=-1,ri={};ri[qt]=ri[_i]=ri[eu]=ri[ai]=ri[mr]=ri[Xo]=ri[W0]=ri[Lu]=ri[V0]=!0,ri[ct]=ri[At]=ri[Yo]=ri[ln]=ri[Ko]=ri[An]=ri[un]=ri[Wt]=ri[w]=ri[Ut]=ri[fr]=ri[br]=ri[Kt]=ri[vu]=ri[Go]=!1;var Gr={};Gr[ct]=Gr[At]=Gr[Yo]=Gr[Ko]=Gr[ln]=Gr[An]=Gr[qt]=Gr[_i]=Gr[eu]=Gr[ai]=Gr[mr]=Gr[w]=Gr[Ut]=Gr[fr]=Gr[br]=Gr[Kt]=Gr[vu]=Gr[a0]=Gr[Xo]=Gr[W0]=Gr[Lu]=Gr[V0]=!0,Gr[un]=Gr[Wt]=Gr[Go]=!1;var Yl={\u00C0:"A",\u00C1:"A",\u00C2:"A",\u00C3:"A",\u00C4:"A",\u00C5:"A",\u00E0:"a",\u00E1:"a",\u00E2:"a",\u00E3:"a",\u00E4:"a",\u00E5:"a",\u00C7:"C",\u00E7:"c",\u00D0:"D",\u00F0:"d",\u00C8:"E",\u00C9:"E",\u00CA:"E",\u00CB:"E",\u00E8:"e",\u00E9:"e",\u00EA:"e",\u00EB:"e",\u00CC:"I",\u00CD:"I",\u00CE:"I",\u00CF:"I",\u00EC:"i",\u00ED:"i",\u00EE:"i",\u00EF:"i",\u00D1:"N",\u00F1:"n",\u00D2:"O",\u00D3:"O",\u00D4:"O",\u00D5:"O",\u00D6:"O",\u00D8:"O",\u00F2:"o",\u00F3:"o",\u00F4:"o",\u00F5:"o",\u00F6:"o",\u00F8:"o",\u00D9:"U",\u00DA:"U",\u00DB:"U",\u00DC:"U",\u00F9:"u",\u00FA:"u",\u00FB:"u",\u00FC:"u",\u00DD:"Y",\u00FD:"y",\u00FF:"y",\u00C6:"Ae",\u00E6:"ae",\u00DE:"Th",\u00FE:"th",\u00DF:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010A:"C",\u010C:"C",\u0107:"c",\u0109:"c",\u010B:"c",\u010D:"c",\u010E:"D",\u0110:"D",\u010F:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011A:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011B:"e",\u011C:"G",\u011E:"G",\u0120:"G",\u0122:"G",\u011D:"g",\u011F:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012A:"I",\u012C:"I",\u012E:"I",\u0130:"I",\u0129:"i",\u012B:"i",\u012D:"i",\u012F:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013B:"L",\u013D:"L",\u013F:"L",\u0141:"L",\u013A:"l",\u013C:"l",\u013E:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014A:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014B:"n",\u014C:"O",\u014E:"O",\u0150:"O",\u014D:"o",\u014F:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015A:"S",\u015C:"S",\u015E:"S",\u0160:"S",\u015B:"s",\u015D:"s",\u015F:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016A:"U",\u016C:"U",\u016E:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016B:"u",\u016D:"u",\u016F:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017B:"Z",\u017D:"Z",\u017A:"z",\u017C:"z",\u017E:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017F:"s"},ea={"&":"&","<":"<",">":">",'"':""","'":"'"},lf={"&":"&","<":"<",">":">",""":'"',"'":"'"},Ns={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Ma=parseFloat,Ls=parseInt,h0=typeof global=="object"&&global&&global.Object===Object&&global,Fs=typeof self=="object"&&self&&self.Object===Object&&self,Ni=h0||Fs||Function("return this")(),B=typeof nm=="object"&&nm&&!nm.nodeType&&nm,z=B&&typeof rg=="object"&&rg&&!rg.nodeType&&rg,G=z&&z.exports===B,$=G&&h0.process,De=function(){try{var Te=z&&z.require&&z.require("util").types;return Te||$&&$.binding&&$.binding("util")}catch(et){}}(),me=De&&De.isArrayBuffer,xe=De&&De.isDate,Z=De&&De.isMap,ke=De&&De.isRegExp,Xe=De&&De.isSet,ht=De&&De.isTypedArray;function ie(Te,et,Ve){switch(Ve.length){case 0:return Te.call(et);case 1:return Te.call(et,Ve[0]);case 2:return Te.call(et,Ve[0],Ve[1]);case 3:return Te.call(et,Ve[0],Ve[1],Ve[2])}return Te.apply(et,Ve)}function qe(Te,et,Ve,Gt){for(var Yt=-1,sr=Te==null?0:Te.length;++Yt-1}function tn(Te,et,Ve){for(var Gt=-1,Yt=Te==null?0:Te.length;++Gt-1;);return Ve}function gl(Te,et){for(var Ve=Te.length;Ve--&&_t(et,Te[Ve],0)>-1;);return Ve}function af(Te,et){for(var Ve=Te.length,Gt=0;Ve--;)Te[Ve]===et&&++Gt;return Gt}var Mo=Yn(Yl),ds=Yn(ea);function bs(Te){return"\\"+Ns[Te]}function No(Te,et){return Te==null?i:Te[et]}function Lo(Te){return cs.test(Te)}function ps(Te){return w0.test(Te)}function Vu(Te){for(var et,Ve=[];!(et=Te.next()).done;)Ve.push(et.value);return Ve}function yu(Te){var et=-1,Ve=Array(Te.size);return Te.forEach(function(Gt,Yt){Ve[++et]=[Yt,Gt]}),Ve}function pi(Te,et){return function(Ve){return Te(et(Ve))}}function T0(Te,et){for(var Ve=-1,Gt=Te.length,Yt=0,sr=[];++Ve-1}function ia(d,v){var x=this.__data__,b=Ql(x,d);return b<0?(++this.size,x.push([d,v])):x[b][1]=v,this}to.prototype.clear=Na,to.prototype.delete=pf,to.prototype.get=uc,to.prototype.has=ms,to.prototype.set=ia;function B0(d){var v=-1,x=d==null?0:d.length;for(this.clear();++v=v?d:v)),d}function U0(d,v,x,b,H,ee){var de,ye=v&C,be=v&U,gt=v&q;if(x&&(de=H?x(d,b,H,ee):x(d)),de!==i)return de;if(!ku(d))return d;var Dt=Jn(d);if(Dt){if(de=Es(d),!ye)return Ji(d,de)}else{var Rt=Ou(d),rn=Rt==Wt||Rt==vr;if(Gs(d))return fc(d,ye);if(Rt==fr||Rt==ct||rn&&!H){if(de=be||rn?{}:vc(d),!ye)return be?Jl(d,tl(de,d)):t0(d,hf(de,d))}else{if(!Gr[Rt])return H?d:{};de=Dh(d,Rt,ye)}}ee||(ee=new el);var Rn=ee.get(d);if(Rn)return Rn;ee.set(d,de),L2(d)?d.forEach(function(ir){de.add(U0(ir,v,x,ir,d,ee))}):gp(d)&&d.forEach(function(ir,Zr){de.set(Zr,U0(ir,v,x,Zr,d,ee))});var $n=gt?be?rr:$c:be?fn:M0,Nr=Dt?i:$n(d);return tt(Nr||d,function(ir,Zr){Nr&&(Zr=ir,ir=d[Zr]),gs(de,Zr,U0(ir,v,x,Zr,d,ee))}),de}function vf(d){var v=M0(d);return function(x){return jc(x,d,v)}}function jc(d,v,x){var b=x.length;if(d==null)return!b;for(d=wn(d);b--;){var H=x[b],ee=v[H],de=d[H];if(de===i&&!(H in d)||!ee(de))return!1}return!0}function lc(d,v,x){if(typeof d!="function")throw new Kr(E);return Wa(function(){d.apply(i,x)},v)}function Sl(d,v,x,b){var H=-1,ee=on,de=!0,ye=d.length,be=[],gt=v.length;if(!ye)return be;x&&(v=Lt(v,di(x))),b?(ee=tn,de=!1):v.length>=f&&(ee=Zo,de=!1,v=new ho(v));e:for(;++HH?0:H+x),b=b===i||b>H?H:Cr(b),b<0&&(b+=H),b=x>b?0:Ep(b);x0&&x(ye)?v>1?bi(ye,v-1,x,b,H):gn(H,ye):b||(H[H.length]=ye)}return H}var g=dc(),y=dc(!0);function A(d,v){return d&&g(d,v,M0)}function F(d,v){return d&&y(d,v,M0)}function I(d,v){return bt(v,function(x){return Ea(d[x])})}function J(d,v){v=Us(v,d);for(var x=0,b=v.length;d!=null&&xv}function Mt(d,v){return d!=null&&ei.call(d,v)}function Er(d,v){return d!=null&&v in wn(d)}function $u(d,v,x){return d>=Wn(v,x)&&d=120&&Dt.length>=120)?new ho(de&&Dt):i}Dt=d[0];var Rt=-1,rn=ye[0];e:for(;++Rt-1;)ye!==d&&R0.call(ye,be,1),R0.call(d,be,1);return d}function u2(d,v){for(var x=d?v.length:0,b=x-1;x--;){var H=v[x];if(x==b||H!==ee){var ee=H;go(H)?R0.call(d,H,1):Cd(d,H)}}return d}function o2(d,v){return d+vs(y0()*(v-d+1))}function wd(d,v,x,b){for(var H=-1,ee=Xr(Ku((v-d)/(x||1)),0),de=Ve(ee);ee--;)de[b?ee:++H]=d,d+=x;return de}function Hc(d,v){var x="";if(!d||v<1||v>$t)return x;do v%2&&(x+=d),v=vs(v/2),v&&(d+=d);while(v);return x}function Mr(d,v){return r1(Nd(d,v,r0),d+"")}function l2(d){return ba(Ac(d))}function s2(d,v){var x=Ac(d);return yc(x,Zu(v,0,x.length))}function ja(d,v,x,b){if(!ku(d))return d;v=Us(v,d);for(var H=-1,ee=v.length,de=ee-1,ye=d;ye!=null&&++HH?0:H+v),x=x>H?H:x,x<0&&(x+=H),H=v>x?0:x-v>>>0,v>>>=0;for(var ee=Ve(H);++b>>1,de=d[ee];de!==null&&!Nl(de)&&(x?de<=v:de=f){var gt=v?null:mm(d);if(gt)return Q0(gt);de=!1,H=Zo,be=new ho}else be=v?[]:ye;e:for(;++b=b?d:rl(d,v,x)}var Kc=hs||function(d){return Ni.clearTimeout(d)};function fc(d,v){if(v)return d.slice();var x=d.length,b=Fi?Fi(x):new d.constructor(x);return d.copy(b),b}function cc(d){var v=new d.constructor(d.byteLength);return new A0(v).set(new A0(d)),v}function f2(d,v){var x=v?cc(d.buffer):d.buffer;return new d.constructor(x,d.byteOffset,d.byteLength)}function yh(d){var v=new d.constructor(d.source,xo.exec(d));return v.lastIndex=d.lastIndex,v}function gf(d){return Sr?wn(Sr.call(d)):{}}function Xc(d,v){var x=v?cc(d.buffer):d.buffer;return new d.constructor(x,d.byteOffset,d.length)}function gh(d,v){if(d!==v){var x=d!==i,b=d===null,H=d===d,ee=Nl(d),de=v!==i,ye=v===null,be=v===v,gt=Nl(v);if(!ye&&!gt&&!ee&&d>v||ee&&de&&be&&!ye&&!gt||b&&de&&be||!x&&be||!H)return 1;if(!b&&!ee&&!gt&&d=ye)return be;var gt=x[b];return be*(gt=="desc"?-1:1)}}return d.index-v.index}function js(d,v,x,b){for(var H=-1,ee=d.length,de=x.length,ye=-1,be=v.length,gt=Xr(ee-de,0),Dt=Ve(be+gt),Rt=!b;++ye1?x[H-1]:i,de=H>2?x[2]:i;for(ee=d.length>3&&typeof ee=="function"?(H--,ee):i,de&&io(x[0],x[1],de)&&(ee=H<3?i:ee,H=1),v=wn(v);++b-1?H[ee?v[de]:de]:i}}function Jc(d){return ol(function(v){var x=v.length,b=x,H=Ur.prototype.thru;for(d&&v.reverse();b--;){var ee=v[b];if(typeof ee!="function")throw new Kr(E);if(H&&!de&&Bo(ee)=="wrapper")var de=new Ur([],!0)}for(b=de?b:x;++b1&&ui.reverse(),Dt&&beye))return!1;var gt=ee.get(d),Dt=ee.get(v);if(gt&&Dt)return gt==v&&Dt==d;var Rt=-1,rn=!0,Rn=x&ne?new ho:i;for(ee.set(d,v),ee.set(v,d);++Rt1?"& ":"")+v[b],v=v.join(x>2?", ":" "),d.replace(ci,`{ +/* [wrapped with `+v+`] */ +`)}function $l(d){return Jn(d)||sl(d)||!!(co&&d&&d[co])}function go(d,v){var x=typeof d;return v=v==null?$t:v,!!v&&(x=="number"||x!="symbol"&&Ms.test(d))&&d>-1&&d%1==0&&d0){if(++v>=wt)return arguments[0]}else v=0;return d.apply(i,arguments)}}function yc(d,v){var x=-1,b=d.length,H=b-1;for(v=v===i?b:v;++x1?d[v-1]:i;return x=typeof x=="function"?(d.pop(),x):i,E2(d,x)});function Bh(d){var v=Y(d);return v.__chain__=!0,v}function Uh(d,v){return v(d),d}function h1(d,v){return v(d)}var Qd=ol(function(d){var v=d.length,x=v?d[0]:0,b=this.__wrapped__,H=function(ee){return Ia(ee,d)};return v>1||this.__actions__.length||!(b instanceof lt)||!go(x)?this.thru(H):(b=b.slice(x,+x+(v?1:0)),b.__actions__.push({func:h1,args:[H],thisArg:i}),new Ur(b,this.__chain__).thru(function(ee){return v&&!ee.length&&ee.push(i),ee}))});function jh(){return Bh(this)}function Jd(){return new Ur(this.value(),this.__chain__)}function zh(){this.__values__===i&&(this.__values__=lv(this.value()));var d=this.__index__>=this.__values__.length,v=d?i:this.__values__[this.__index__++];return{done:d,value:v}}function Cm(){return this}function xm(d){for(var v,x=this;x instanceof Jr;){var b=Fd(x);b.__index__=0,b.__values__=i,v?H.__wrapped__=b:v=b;var H=b;x=x.__wrapped__}return H.__wrapped__=d,v}function Of(){var d=this.__wrapped__;if(d instanceof lt){var v=d;return this.__actions__.length&&(v=new lt(this)),v=v.reverse(),v.__actions__.push({func:h1,args:[Hd],thisArg:i}),new Ur(v,this.__chain__)}return this.thru(Hd)}function kf(){return mh(this.__wrapped__,this.__actions__)}var D2=za(function(d,v,x){ei.call(d,x)?++d[x]:ju(d,x,1)});function Am(d,v,x){var b=Jn(d)?kt:n2;return x&&io(d,v,x)&&(v=i),b(d,zn(v,3))}function Zd(d,v){var x=Jn(d)?bt:zc;return x(d,zn(v,3))}var w2=xl(Bd),$d=xl(u1);function qh(d,v){return bi(v1(d,v),1)}function ep(d,v){return bi(v1(d,v),jt)}function Hh(d,v,x){return x=x===i?1:Cr(x),bi(v1(d,v),x)}function Wh(d,v){var x=Jn(d)?tt:_s;return x(d,zn(v,3))}function tp(d,v){var x=Jn(d)?Tt:oa;return x(d,zn(v,3))}var Rm=za(function(d,v,x){ei.call(d,x)?d[x].push(v):ju(d,x,[v])});function Om(d,v,x,b){d=al(d)?d:Ac(d),x=x&&!b?Cr(x):0;var H=d.length;return x<0&&(x=Xr(H+x,0)),_1(d)?x<=H&&d.indexOf(v,x)>-1:!!H&&_t(d,v,x)>-1}var km=Mr(function(d,v,x){var b=-1,H=typeof v=="function",ee=al(d)?Ve(d.length):[];return _s(d,function(de){ee[++b]=H?ie(v,de,x):Tl(de,v,x)}),ee}),Vh=za(function(d,v,x){ju(d,x,v)});function v1(d,v){var x=Jn(d)?Lt:Ed;return x(d,zn(v,3))}function Mm(d,v,x,b){return d==null?[]:(Jn(v)||(v=v==null?[]:[v]),x=b?i:x,Jn(x)||(x=x==null?[]:[x]),vo(d,v,x))}var np=za(function(d,v,x){d[x?0:1].push(v)},function(){return[[],[]]});function rp(d,v,x){var b=Jn(d)?lr:yr,H=arguments.length<3;return b(d,zn(v,4),x,H,_s)}function Nm(d,v,x){var b=Jn(d)?Qn:yr,H=arguments.length<3;return b(d,zn(v,4),x,H,oa)}function Lm(d,v){var x=Jn(d)?bt:zc;return x(d,C2(zn(v,3)))}function Gh(d){var v=Jn(d)?ba:l2;return v(d)}function Fm(d,v,x){(x?io(d,v,x):v===i)?v=1:v=Cr(v);var b=Jn(d)?Pa:s2;return b(d,v)}function bm(d){var v=Jn(d)?ua:nl;return v(d)}function ip(d){if(d==null)return 0;if(al(d))return _1(d)?Ki(d):d.length;var v=Ou(d);return v==w||v==Kt?d.size:Ba(d).length}function up(d,v,x){var b=Jn(d)?_r:hh;return x&&io(d,v,x)&&(v=i),b(d,zn(v,3))}var ya=Mr(function(d,v){if(d==null)return[];var x=v.length;return x>1&&io(d,v[0],v[1])?v=[]:x>2&&io(v[0],v[1],v[2])&&(v=[v[0]]),vo(d,bi(v,1),[])}),m1=ra||function(){return Ni.Date.now()};function op(d,v){if(typeof v!="function")throw new Kr(E);return d=Cr(d),function(){if(--d<1)return v.apply(this,arguments)}}function Yh(d,v,x){return v=x?i:v,v=d&&v==null?d.length:v,dn(d,Oe,i,i,i,i,v)}function S2(d,v){var x;if(typeof v!="function")throw new Kr(E);return d=Cr(d),function(){return--d>0&&(x=v.apply(this,arguments)),d<=1&&(v=i),x}}var y1=Mr(function(d,v,x){var b=m;if(x.length){var H=T0(x,dr(y1));b|=ze}return dn(d,b,v,x,H)}),Kh=Mr(function(d,v,x){var b=m|we;if(x.length){var H=T0(x,dr(Kh));b|=ze}return dn(v,b,d,x,H)});function lp(d,v,x){v=x?i:v;var b=dn(d,he,i,i,i,i,i,v);return b.placeholder=lp.placeholder,b}function Xh(d,v,x){v=x?i:v;var b=dn(d,ge,i,i,i,i,i,v);return b.placeholder=Xh.placeholder,b}function sp(d,v,x){var b,H,ee,de,ye,be,gt=0,Dt=!1,Rt=!1,rn=!0;if(typeof d!="function")throw new Kr(E);v=fl(v)||0,ku(x)&&(Dt=!!x.leading,Rt="maxWait"in x,ee=Rt?Xr(fl(x.maxWait)||0,v):ee,rn="trailing"in x?!!x.trailing:rn);function Rn(i0){var Ts=b,wo=H;return b=H=i,gt=i0,de=d.apply(wo,Ts),de}function $n(i0){return gt=i0,ye=Wa(Zr,v),Dt?Rn(i0):de}function Nr(i0){var Ts=i0-be,wo=i0-gt,Rv=v-Ts;return Rt?Wn(Rv,ee-wo):Rv}function ir(i0){var Ts=i0-be,wo=i0-gt;return be===i||Ts>=v||Ts<0||Rt&&wo>=ee}function Zr(){var i0=m1();if(ir(i0))return ui(i0);ye=Wa(Zr,Nr(i0))}function ui(i0){return ye=i,rn&&b?Rn(i0):(b=H=i,de)}function bl(){ye!==i&&Kc(ye),gt=0,b=be=H=ye=i}function Wi(){return ye===i?de:ui(m1())}function uo(){var i0=m1(),Ts=ir(i0);if(b=arguments,H=this,be=i0,Ts){if(ye===i)return $n(be);if(Rt)return Kc(ye),ye=Wa(Zr,v),Rn(be)}return ye===i&&(ye=Wa(Zr,v)),de}return uo.cancel=bl,uo.flush=Wi,uo}var Qh=Mr(function(d,v){return lc(d,1,v)}),Jh=Mr(function(d,v,x){return lc(d,fl(v)||0,x)});function ap(d){return dn(d,Ue)}function T2(d,v){if(typeof d!="function"||v!=null&&typeof v!="function")throw new Kr(E);var x=function(){var b=arguments,H=v?v.apply(this,b):b[0],ee=x.cache;if(ee.has(H))return ee.get(H);var de=d.apply(this,b);return x.cache=ee.set(H,de)||ee,de};return x.cache=new(T2.Cache||B0),x}T2.Cache=B0;function C2(d){if(typeof d!="function")throw new Kr(E);return function(){var v=arguments;switch(v.length){case 0:return!d.call(this);case 1:return!d.call(this,v[0]);case 2:return!d.call(this,v[0],v[1]);case 3:return!d.call(this,v[0],v[1],v[2])}return!d.apply(this,v)}}function z0(d){return S2(2,d)}var x2=Rd(function(d,v){v=v.length==1&&Jn(v[0])?Lt(v[0],di(zn())):Lt(bi(v,1),di(zn()));var x=v.length;return Mr(function(b){for(var H=-1,ee=Wn(b.length,x);++H=v}),sl=e0(function(){return arguments}())?e0:function(d){return zu(d)&&ei.call(d,"callee")&&!I0.call(d,"callee")},Jn=Ve.isArray,Vs=me?di(me):He;function al(d){return d!=null&&M2(d.length)&&!Ea(d)}function n0(d){return zu(d)&&al(d)}function ev(d){return d===!0||d===!1||zu(d)&&mt(d)==ln}var Gs=$0||Ip,hp=xe?di(xe):Be;function jm(d){return zu(d)&&d.nodeType===1&&!Ec(d)}function tv(d){if(d==null)return!0;if(al(d)&&(Jn(d)||typeof d=="string"||typeof d.splice=="function"||Gs(d)||Da(d)||sl(d)))return!d.length;var v=Ou(d);if(v==w||v==Kt)return!d.size;if(xf(d))return!Ba(d).length;for(var x in d)if(ei.call(d,x))return!1;return!0}function vp(d,v){return ut(d,v)}function zm(d,v,x){x=typeof x=="function"?x:i;var b=x?x(d,v):i;return b===i?ut(d,v,i,x):!!b}function mp(d){if(!zu(d))return!1;var v=mt(d);return v==un||v==nr||typeof d.message=="string"&&typeof d.name=="string"&&!Ec(d)}function _c(d){return typeof d=="number"&&Xi(d)}function Ea(d){if(!ku(d))return!1;var v=mt(d);return v==Wt||v==vr||v==en||v==ur}function yp(d){return typeof d=="number"&&d==Cr(d)}function M2(d){return typeof d=="number"&&d>-1&&d%1==0&&d<=$t}function ku(d){var v=typeof d;return d!=null&&(v=="object"||v=="function")}function zu(d){return d!=null&&typeof d=="object"}var gp=Z?di(Z):jn;function _p(d,v){return d===v||ti(d,v,Pn(v))}function nv(d,v,x){return x=typeof x=="function"?x:i,ti(d,v,Pn(v),x)}function qm(d){return rv(d)&&d!=+d}function Hm(d){if(Al(d))throw new Yt(p);return tr(d)}function Wm(d){return d===null}function N2(d){return d==null}function rv(d){return typeof d=="number"||zu(d)&&mt(d)==Ut}function Ec(d){if(!zu(d)||mt(d)!=fr)return!1;var v=$o(d);if(v===null)return!0;var x=ei.call(v,"constructor")&&v.constructor;return typeof x=="function"&&x instanceof x&&Au.call(x)==na}var g1=ke?di(ke):ii;function Vm(d){return yp(d)&&d>=-$t&&d<=$t}var L2=Xe?di(Xe):qi;function _1(d){return typeof d=="string"||!Jn(d)&&zu(d)&&mt(d)==vu}function Nl(d){return typeof d=="symbol"||zu(d)&&mt(d)==a0}var Da=ht?di(ht):jr;function iv(d){return d===i}function Gm(d){return zu(d)&&Ou(d)==Go}function uv(d){return zu(d)&&mt(d)==Os}var ov=p2(r2),Ym=p2(function(d,v){return d<=v});function lv(d){if(!d)return[];if(al(d))return _1(d)?Yr(d):Ji(d);if(Ru&&d[Ru])return Vu(d[Ru]());var v=Ou(d),x=v==w?yu:v==Kt?Q0:Ac;return x(d)}function wa(d){if(!d)return d===0?d:0;if(d=fl(d),d===jt||d===-jt){var v=d<0?-1:1;return v*at}return d===d?d:0}function Cr(d){var v=wa(d),x=v%1;return v===v?x?v-x:v:0}function Ep(d){return d?Zu(Cr(d),0,ae):0}function fl(d){if(typeof d=="number")return d;if(Nl(d))return Q;if(ku(d)){var v=typeof d.valueOf=="function"?d.valueOf():d;d=ku(v)?v+"":v}if(typeof d!="string")return d===0?d:+d;d=xu(d);var x=oo.test(d);return x||Ao.test(d)?Ls(d.slice(2),x?2:8):ni.test(d)?Q:+d}function cu(d){return O0(d,fn(d))}function E1(d){return d?Zu(Cr(d),-$t,$t):d===0?d:0}function ki(d){return d==null?"":il(d)}var Dp=no(function(d,v){if(xf(v)||al(v)){O0(v,M0(v),d);return}for(var x in v)ei.call(v,x)&&gs(d,x,v[x])}),F2=no(function(d,v){O0(v,fn(v),d)}),Do=no(function(d,v,x,b){O0(v,fn(v),d,b)}),Ss=no(function(d,v,x,b){O0(v,M0(v),d,b)}),Mf=ol(Ia);function b2(d,v){var x=Qr(d);return v==null?x:hf(x,v)}var wp=Mr(function(d,v){d=wn(d);var x=-1,b=v.length,H=b>2?v[2]:i;for(H&&io(v[0],v[1],H)&&(b=1);++x1),ee}),O0(d,rr(d),x),b&&(x=U0(x,C|U|q,ym));for(var H=v.length;H--;)Cd(x,v[H]);return x});function T1(d,v){return Ka(d,C2(zn(v)))}var Cp=ol(function(d,v){return d==null?{}:dh(d,v)});function Ka(d,v){if(d==null)return{};var x=Lt(rr(d),function(b){return[b]});return v=zn(v),ph(d,x,function(b,H){return v(b,H[0])})}function Km(d,v,x){v=Us(v,d);var b=-1,H=v.length;for(H||(H=1,d=i);++bv){var b=d;d=v,v=b}if(x||d%1||v%1){var H=y0();return Wn(d+H*(v-d+Ma("1e-"+((H+"").length-1))),v)}return o2(d,v)}var q2=_f(function(d,v,x){return v=v.toLowerCase(),d+(x?Uo(v):v)});function Uo(d){return Rp(ki(d).toLowerCase())}function H2(d){return d=ki(d),d&&d.replace(Xn,Mo).replace(K0,"")}function Qm(d,v,x){d=ki(d),v=il(v);var b=d.length;x=x===i?b:Zu(Cr(x),0,b);var H=x;return x-=v.length,x>=0&&d.slice(x,H)==v}function A1(d){return d=ki(d),d&&ks.test(d)?d.replace(tu,ds):d}function Jm(d){return d=ki(d),d&&Zt.test(d)?d.replace(fi,"\\$&"):d}var Zm=_f(function(d,v,x){return d+(x?"-":"")+v.toLowerCase()}),av=_f(function(d,v,x){return d+(x?" ":"")+v.toLowerCase()}),$m=_h("toLowerCase");function fv(d,v,x){d=ki(d),v=Cr(v);var b=v?Ki(d):0;if(!v||b>=v)return d;var H=(v-b)/2;return da(vs(H),x)+d+da(Ku(H),x)}function ey(d,v,x){d=ki(d),v=Cr(v);var b=v?Ki(d):0;return v&&b>>0,x?(d=ki(d),d&&(typeof v=="string"||v!=null&&!g1(v))&&(v=il(v),!v&&Lo(d))?aa(Yr(d),0,x):d.split(v,x)):[]}var bf=_f(function(d,v,x){return d+(x?" ":"")+Rp(v)});function dv(d,v,x){return d=ki(d),x=x==null?0:Zu(Cr(x),0,d.length),v=il(v),d.slice(x,x+v.length)==v}function pv(d,v,x){var b=Y.templateSettings;x&&io(d,v,x)&&(v=i),d=ki(d),v=Do({},v,b,Df);var H=Do({},v.imports,b.imports,Df),ee=M0(H),de=ko(H,ee),ye,be,gt=0,Dt=v.interpolate||Qo,Rt="__p += '",rn=fu((v.escape||Qo).source+"|"+Dt.source+"|"+(Dt===f0?Wl:Qo).source+"|"+(v.evaluate||Qo).source+"|$","g"),Rn="//# sourceURL="+(ei.call(v,"sourceURL")?(v.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++ic+"]")+` +`;d.replace(rn,function(ir,Zr,ui,bl,Wi,uo){return ui||(ui=bl),Rt+=d.slice(gt,uo).replace(lo,bs),Zr&&(ye=!0,Rt+=`' + +__e(`+Zr+`) + +'`),Wi&&(be=!0,Rt+=`'; +`+Wi+`; +__p += '`),ui&&(Rt+=`' + +((__t = (`+ui+`)) == null ? '' : __t) + +'`),gt=uo+ir.length,ir}),Rt+=`'; +`;var $n=ei.call(v,"variable")&&v.variable;if(!$n)Rt=`with (obj) { +`+Rt+` +} +`;else if(Y0.test($n))throw new Yt(t);Rt=(be?Rt.replace(Hr,""):Rt).replace(To,"$1").replace(Co,"$1;"),Rt="function("+($n||"obj")+`) { +`+($n?"":`obj || (obj = {}); +`)+"var __t, __p = ''"+(ye?", __e = _.escape":"")+(be?`, __j = Array.prototype.join; +function print() { __p += __j.call(arguments, '') } +`:`; +`)+Rt+`return __p +}`;var Nr=_v(function(){return sr(ee,Rn+"return "+Rt).apply(i,de)});if(Nr.source=Rt,mp(Nr))throw Nr;return Nr}function hv(d){return ki(d).toLowerCase()}function W2(d){return ki(d).toUpperCase()}function V2(d,v,x){if(d=ki(d),d&&(x||v===i))return xu(d);if(!d||!(v=il(v)))return d;var b=Yr(d),H=Yr(v),ee=sf(b,H),de=gl(b,H)+1;return aa(b,ee,de).join("")}function Ap(d,v,x){if(d=ki(d),d&&(x||v===i))return d.slice(0,fo(d)+1);if(!d||!(v=il(v)))return d;var b=Yr(d),H=gl(b,Yr(v))+1;return aa(b,0,H).join("")}function vv(d,v,x){if(d=ki(d),d&&(x||v===i))return d.replace(Ln,"");if(!d||!(v=il(v)))return d;var b=Yr(d),H=sf(b,Yr(v));return aa(b,H).join("")}function G2(d,v){var x=Ge,b=rt;if(ku(v)){var H="separator"in v?v.separator:H;x="length"in v?Cr(v.length):x,b="omission"in v?il(v.omission):b}d=ki(d);var ee=d.length;if(Lo(d)){var de=Yr(d);ee=de.length}if(x>=ee)return d;var ye=x-Ki(b);if(ye<1)return b;var be=de?aa(de,0,ye).join(""):d.slice(0,ye);if(H===i)return be+b;if(de&&(ye+=be.length-ye),g1(H)){if(d.slice(ye).search(H)){var gt,Dt=be;for(H.global||(H=fu(H.source,ki(xo.exec(H))+"g")),H.lastIndex=0;gt=H.exec(Dt);)var Rt=gt.index;be=be.slice(0,Rt===i?ye:Rt)}}else if(d.indexOf(il(H),ye)!=ye){var rn=be.lastIndexOf(H);rn>-1&&(be=be.slice(0,rn))}return be+b}function mv(d){return d=ki(d),d&&Si.test(d)?d.replace(L0,Oi):d}var yv=_f(function(d,v,x){return d+(x?" ":"")+v.toUpperCase()}),Rp=_h("toUpperCase");function gv(d,v,x){return d=ki(d),v=x?i:v,v===i?ps(d)?cf(d):v0(d):d.match(v)||[]}var _v=Mr(function(d,v){try{return ie(d,i,v)}catch(x){return mp(x)?x:new Yt(x)}}),uy=ol(function(d,v){return tt(v,function(x){x=Rl(x),ju(d,x,y1(d[x],d))}),d});function Ev(d){var v=d==null?0:d.length,x=zn();return d=v?Lt(d,function(b){if(typeof b[1]!="function")throw new Kr(E);return[x(b[0]),b[1]]}):[],Mr(function(b){for(var H=-1;++H$t)return[];var x=ae,b=Wn(d,ae);v=zn(v),d-=ae;for(var H=S0(b,v);++x0||v<0)?new lt(x):(d<0?x=x.takeRight(-d):d&&(x=x.drop(d)),v!==i&&(v=Cr(v),x=v<0?x.dropRight(-v):x.take(v-d)),x)},lt.prototype.takeRightWhile=function(d){return this.reverse().takeWhile(d).reverse()},lt.prototype.toArray=function(){return this.take(ae)},A(lt.prototype,function(d,v){var x=/^(?:filter|find|map|reject)|While$/.test(v),b=/^(?:head|last)$/.test(v),H=Y[b?"take"+(v=="last"?"Right":""):v],ee=b||/^find/.test(v);!H||(Y.prototype[v]=function(){var de=this.__wrapped__,ye=b?[1]:arguments,be=de instanceof lt,gt=ye[0],Dt=be||Jn(de),Rt=function(Zr){var ui=H.apply(Y,gn([Zr],ye));return b&&rn?ui[0]:ui};Dt&&x&&typeof gt=="function"&>.length!=1&&(be=Dt=!1);var rn=this.__chain__,Rn=!!this.__actions__.length,$n=ee&&!rn,Nr=be&&!Rn;if(!ee&&Dt){de=Nr?de:new lt(this);var ir=d.apply(de,ye);return ir.__actions__.push({func:h1,args:[Rt],thisArg:i}),new Ur(ir,rn)}return $n&&Nr?d.apply(this,ye):(ir=this.thru(Rt),$n?b?ir.value()[0]:ir.value():ir)})}),tt(["pop","push","shift","sort","splice","unshift"],function(d){var v=Vr[d],x=/^(?:push|sort|unshift)$/.test(d)?"tap":"thru",b=/^(?:pop|shift)$/.test(d);Y.prototype[d]=function(){var H=arguments;if(b&&!this.__chain__){var ee=this.value();return v.apply(Jn(ee)?ee:[],H)}return this[x](function(de){return v.apply(Jn(de)?de:[],H)})}}),A(lt.prototype,function(d,v){var x=Y[v];if(x){var b=x.name+"";ei.call(xn,b)||(xn[b]=[]),xn[b].push({name:v,func:x})}}),xn[ca(i,we).name]=[{name:"wrapper",func:i}],lt.prototype.clone=hi,lt.prototype.reverse=Qi,lt.prototype.value=g0,Y.prototype.at=Qd,Y.prototype.chain=jh,Y.prototype.commit=Jd,Y.prototype.next=zh,Y.prototype.plant=xm,Y.prototype.reverse=Of,Y.prototype.toJSON=Y.prototype.valueOf=Y.prototype.value=kf,Y.prototype.first=Y.prototype.head,Ru&&(Y.prototype[Ru]=Cm),Y},Z0=J0();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(Ni._=Z0,define(function(){return Z0})):z?((z.exports=Z0)._=Z0,B._=Z0):Ni._=Z0}).call(nm)});var GD=ce((Dne,VD)=>{"use strict";var Ai=VD.exports;VD.exports.default=Ai;var hu="[",ig="]",rm="\x07",$_=";",U5=process.env.TERM_PROGRAM==="Apple_Terminal";Ai.cursorTo=(i,o)=>{if(typeof i!="number")throw new TypeError("The `x` argument is required");return typeof o!="number"?hu+(i+1)+"G":hu+(o+1)+";"+(i+1)+"H"};Ai.cursorMove=(i,o)=>{if(typeof i!="number")throw new TypeError("The `x` argument is required");let f="";return i<0?f+=hu+-i+"D":i>0&&(f+=hu+i+"C"),o<0?f+=hu+-o+"A":o>0&&(f+=hu+o+"B"),f};Ai.cursorUp=(i=1)=>hu+i+"A";Ai.cursorDown=(i=1)=>hu+i+"B";Ai.cursorForward=(i=1)=>hu+i+"C";Ai.cursorBackward=(i=1)=>hu+i+"D";Ai.cursorLeft=hu+"G";Ai.cursorSavePosition=U5?"7":hu+"s";Ai.cursorRestorePosition=U5?"8":hu+"u";Ai.cursorGetPosition=hu+"6n";Ai.cursorNextLine=hu+"E";Ai.cursorPrevLine=hu+"F";Ai.cursorHide=hu+"?25l";Ai.cursorShow=hu+"?25h";Ai.eraseLines=i=>{let o="";for(let f=0;f[ig,"8",$_,$_,o,rm,i,ig,"8",$_,$_,rm].join("");Ai.image=(i,o={})=>{let f=`${ig}1337;File=inline=1`;return o.width&&(f+=`;width=${o.width}`),o.height&&(f+=`;height=${o.height}`),o.preserveAspectRatio===!1&&(f+=";preserveAspectRatio=0"),f+":"+i.toString("base64")+rm};Ai.iTerm={setCwd:(i=process.cwd())=>`${ig}50;CurrentDir=${i}${rm}`,annotation:(i,o={})=>{let f=`${ig}1337;`,p=typeof o.x!="undefined",E=typeof o.y!="undefined";if((p||E)&&!(p&&E&&typeof o.length!="undefined"))throw new Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");return i=i.replace(/\|/g,""),f+=o.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",o.length>0?f+=(p?[i,o.length,o.x,o.y]:[o.length,i]).join("|"):f+=i,f+rm}}});var z5=ce((wne,YD)=>{"use strict";var j5=(i,o)=>{for(let f of Reflect.ownKeys(o))Object.defineProperty(i,f,Object.getOwnPropertyDescriptor(o,f));return i};YD.exports=j5;YD.exports.default=j5});var H5=ce((Sne,e4)=>{"use strict";var UK=z5(),t4=new WeakMap,q5=(i,o={})=>{if(typeof i!="function")throw new TypeError("Expected a function");let f,p=0,E=i.displayName||i.name||"",t=function(...k){if(t4.set(t,++p),p===1)f=i.apply(this,k),i=null;else if(o.throw===!0)throw new Error(`Function \`${E}\` can only be called once`);return f};return UK(t,i),t4.set(t,p),t};e4.exports=q5;e4.exports.default=q5;e4.exports.callCount=i=>{if(!t4.has(i))throw new Error(`The given function \`${i.name}\` is not wrapped by the \`onetime\` package`);return t4.get(i)}});var W5=ce((Tne,n4)=>{n4.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"];process.platform!=="win32"&&n4.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT");process.platform==="linux"&&n4.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")});var JD=ce((Cne,ug)=>{var jK=require("assert"),og=W5(),zK=/^win/i.test(process.platform),r4=require("events");typeof r4!="function"&&(r4=r4.EventEmitter);var zl;process.__signal_exit_emitter__?zl=process.__signal_exit_emitter__:(zl=process.__signal_exit_emitter__=new r4,zl.count=0,zl.emitted={});zl.infinite||(zl.setMaxListeners(Infinity),zl.infinite=!0);ug.exports=function(i,o){jK.equal(typeof i,"function","a callback must be provided for exit handler"),lg===!1&&V5();var f="exit";o&&o.alwaysLast&&(f="afterexit");var p=function(){zl.removeListener(f,i),zl.listeners("exit").length===0&&zl.listeners("afterexit").length===0&&KD()};return zl.on(f,i),p};ug.exports.unload=KD;function KD(){!lg||(lg=!1,og.forEach(function(i){try{process.removeListener(i,XD[i])}catch(o){}}),process.emit=QD,process.reallyExit=G5,zl.count-=1)}function im(i,o,f){zl.emitted[i]||(zl.emitted[i]=!0,zl.emit(i,o,f))}var XD={};og.forEach(function(i){XD[i]=function(){var f=process.listeners(i);f.length===zl.count&&(KD(),im("exit",null,i),im("afterexit",null,i),zK&&i==="SIGHUP"&&(i="SIGINT"),process.kill(process.pid,i))}});ug.exports.signals=function(){return og};ug.exports.load=V5;var lg=!1;function V5(){lg||(lg=!0,zl.count+=1,og=og.filter(function(i){try{return process.on(i,XD[i]),!0}catch(o){return!1}}),process.emit=HK,process.reallyExit=qK)}var G5=process.reallyExit;function qK(i){process.exitCode=i||0,im("exit",process.exitCode,null),im("afterexit",process.exitCode,null),G5.call(process,process.exitCode)}var QD=process.emit;function HK(i,o){if(i==="exit"){o!==void 0&&(process.exitCode=o);var f=QD.apply(this,arguments);return im("exit",process.exitCode,null),im("afterexit",process.exitCode,null),f}else return QD.apply(this,arguments)}});var K5=ce((xne,Y5)=>{"use strict";var WK=H5(),VK=JD();Y5.exports=WK(()=>{VK(()=>{process.stderr.write("[?25h")},{alwaysLast:!0})})});var ZD=ce(um=>{"use strict";var GK=K5(),i4=!1;um.show=(i=process.stderr)=>{!i.isTTY||(i4=!1,i.write("[?25h"))};um.hide=(i=process.stderr)=>{!i.isTTY||(GK(),i4=!0,i.write("[?25l"))};um.toggle=(i,o)=>{i!==void 0&&(i4=i),i4?um.show(o):um.hide(o)}});var Z5=ce(sg=>{"use strict";var X5=sg&&sg.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(sg,"__esModule",{value:!0});var Q5=X5(GD()),J5=X5(ZD()),YK=(i,{showCursor:o=!1}={})=>{let f=0,p="",E=!1,t=k=>{!o&&!E&&(J5.default.hide(),E=!0);let L=k+` +`;L!==p&&(p=L,i.write(Q5.default.eraseLines(f)+L),f=L.split(` +`).length)};return t.clear=()=>{i.write(Q5.default.eraseLines(f)),p="",f=0},t.done=()=>{p="",f=0,o||(J5.default.show(),E=!1)},t};sg.default={create:YK}});var e9=ce((One,$5)=>{$5.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY_BUILD_BASE",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}}]});var r9=ce(Ra=>{"use strict";var t9=e9(),bc=process.env;Object.defineProperty(Ra,"_vendors",{value:t9.map(function(i){return i.constant})});Ra.name=null;Ra.isPR=null;t9.forEach(function(i){var o=Array.isArray(i.env)?i.env:[i.env],f=o.every(function(p){return n9(p)});if(Ra[i.constant]=f,f)switch(Ra.name=i.name,typeof i.pr){case"string":Ra.isPR=!!bc[i.pr];break;case"object":"env"in i.pr?Ra.isPR=i.pr.env in bc&&bc[i.pr.env]!==i.pr.ne:"any"in i.pr?Ra.isPR=i.pr.any.some(function(p){return!!bc[p]}):Ra.isPR=n9(i.pr);break;default:Ra.isPR=null}});Ra.isCI=!!(bc.CI||bc.CONTINUOUS_INTEGRATION||bc.BUILD_NUMBER||bc.RUN_ID||Ra.name);function n9(i){return typeof i=="string"?!!bc[i]:Object.keys(i).every(function(o){return bc[o]===i[o]})}});var u9=ce((Mne,i9)=>{"use strict";i9.exports=r9().isCI});var l9=ce((Nne,o9)=>{"use strict";var KK=i=>{let o=new Set;do for(let f of Reflect.ownKeys(i))o.add([i,f]);while((i=Reflect.getPrototypeOf(i))&&i!==Object.prototype);return o};o9.exports=(i,{include:o,exclude:f}={})=>{let p=E=>{let t=k=>typeof k=="string"?E===k:k.test(E);return o?o.some(t):f?!f.some(t):!0};for(let[E,t]of KK(i.constructor.prototype)){if(t==="constructor"||!p(t))continue;let k=Reflect.getOwnPropertyDescriptor(E,t);k&&typeof k.value=="function"&&(i[t]=i[t].bind(i))}return i}});var h9=ce($i=>{"use strict";Object.defineProperty($i,"__esModule",{value:!0});var om,ag,u4,o4,$D;typeof window=="undefined"||typeof MessageChannel!="function"?(lm=null,ew=null,tw=function(){if(lm!==null)try{var i=$i.unstable_now();lm(!0,i),lm=null}catch(o){throw setTimeout(tw,0),o}},s9=Date.now(),$i.unstable_now=function(){return Date.now()-s9},om=function(i){lm!==null?setTimeout(om,0,i):(lm=i,setTimeout(tw,0))},ag=function(i,o){ew=setTimeout(i,o)},u4=function(){clearTimeout(ew)},o4=function(){return!1},$D=$i.unstable_forceFrameRate=function(){}):(l4=window.performance,nw=window.Date,a9=window.setTimeout,f9=window.clearTimeout,typeof console!="undefined"&&(c9=window.cancelAnimationFrame,typeof window.requestAnimationFrame!="function"&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),typeof c9!="function"&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills")),typeof l4=="object"&&typeof l4.now=="function"?$i.unstable_now=function(){return l4.now()}:(d9=nw.now(),$i.unstable_now=function(){return nw.now()-d9}),fg=!1,cg=null,s4=-1,rw=5,iw=0,o4=function(){return $i.unstable_now()>=iw},$D=function(){},$i.unstable_forceFrameRate=function(i){0>i||125f4(k,f))N!==void 0&&0>f4(N,k)?(i[p]=N,i[L]=f,p=L):(i[p]=k,i[t]=f,p=t);else if(N!==void 0&&0>f4(N,f))i[p]=N,i[L]=f,p=L;else break e}}return o}return null}function f4(i,o){var f=i.sortIndex-o.sortIndex;return f!==0?f:i.id-o.id}var Xf=[],dd=[],XK=1,Rs=null,ls=3,d4=!1,$p=!1,dg=!1;function p4(i){for(var o=uf(dd);o!==null;){if(o.callback===null)c4(dd);else if(o.startTime<=i)c4(dd),o.sortIndex=o.expirationTime,ow(Xf,o);else break;o=uf(dd)}}function lw(i){if(dg=!1,p4(i),!$p)if(uf(Xf)!==null)$p=!0,om(sw);else{var o=uf(dd);o!==null&&ag(lw,o.startTime-i)}}function sw(i,o){$p=!1,dg&&(dg=!1,u4()),d4=!0;var f=ls;try{for(p4(o),Rs=uf(Xf);Rs!==null&&(!(Rs.expirationTime>o)||i&&!o4());){var p=Rs.callback;if(p!==null){Rs.callback=null,ls=Rs.priorityLevel;var E=p(Rs.expirationTime<=o);o=$i.unstable_now(),typeof E=="function"?Rs.callback=E:Rs===uf(Xf)&&c4(Xf),p4(o)}else c4(Xf);Rs=uf(Xf)}if(Rs!==null)var t=!0;else{var k=uf(dd);k!==null&&ag(lw,k.startTime-o),t=!1}return t}finally{Rs=null,ls=f,d4=!1}}function p9(i){switch(i){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1e4;default:return 5e3}}var QK=$D;$i.unstable_ImmediatePriority=1;$i.unstable_UserBlockingPriority=2;$i.unstable_NormalPriority=3;$i.unstable_IdlePriority=5;$i.unstable_LowPriority=4;$i.unstable_runWithPriority=function(i,o){switch(i){case 1:case 2:case 3:case 4:case 5:break;default:i=3}var f=ls;ls=i;try{return o()}finally{ls=f}};$i.unstable_next=function(i){switch(ls){case 1:case 2:case 3:var o=3;break;default:o=ls}var f=ls;ls=o;try{return i()}finally{ls=f}};$i.unstable_scheduleCallback=function(i,o,f){var p=$i.unstable_now();if(typeof f=="object"&&f!==null){var E=f.delay;E=typeof E=="number"&&0p?(i.sortIndex=E,ow(dd,i),uf(Xf)===null&&i===uf(dd)&&(dg?u4():dg=!0,ag(lw,E-p))):(i.sortIndex=f,ow(Xf,i),$p||d4||($p=!0,om(sw))),i};$i.unstable_cancelCallback=function(i){i.callback=null};$i.unstable_wrapCallback=function(i){var o=ls;return function(){var f=ls;ls=o;try{return i.apply(this,arguments)}finally{ls=f}}};$i.unstable_getCurrentPriorityLevel=function(){return ls};$i.unstable_shouldYield=function(){var i=$i.unstable_now();p4(i);var o=uf(Xf);return o!==Rs&&Rs!==null&&o!==null&&o.callback!==null&&o.startTime<=i&&o.expirationTime{"use strict";process.env.NODE_ENV!=="production"&&function(){"use strict";Object.defineProperty(Ri,"__esModule",{value:!0});var i=!1,o=!1,f=!0,p,E,t,k,L;if(typeof window=="undefined"||typeof MessageChannel!="function"){var N=null,C=null,U=function(){if(N!==null)try{var Et=Ri.unstable_now(),Pt=!0;N(Pt,Et),N=null}catch(Bn){throw setTimeout(U,0),Bn}},q=Date.now();Ri.unstable_now=function(){return Date.now()-q},p=function(Et){N!==null?setTimeout(p,0,Et):(N=Et,setTimeout(U,0))},E=function(Et,Pt){C=setTimeout(Et,Pt)},t=function(){clearTimeout(C)},k=function(){return!1},L=Ri.unstable_forceFrameRate=function(){}}else{var W=window.performance,ne=window.Date,m=window.setTimeout,we=window.clearTimeout;if(typeof console!="undefined"){var Se=window.requestAnimationFrame,he=window.cancelAnimationFrame;typeof Se!="function"&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),typeof he!="function"&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills")}if(typeof W=="object"&&typeof W.now=="function")Ri.unstable_now=function(){return W.now()};else{var ge=ne.now();Ri.unstable_now=function(){return ne.now()-ge}}var ze=!1,pe=null,Oe=-1,le=5,Ue=0,Ge=300,rt=!1;if(o&&navigator!==void 0&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0){var wt=navigator.scheduling;k=function(){var Et=Ri.unstable_now();return Et>=Ue?rt||wt.isInputPending()?!0:Et>=Ge:!1},L=function(){rt=!0}}else k=function(){return Ri.unstable_now()>=Ue},L=function(){};Ri.unstable_forceFrameRate=function(Et){if(Et<0||Et>125){console.error("forceFrameRate takes a positive int between 0 and 125, forcing framerates higher than 125 fps is not unsupported");return}Et>0?le=Math.floor(1e3/Et):le=5};var xt=function(){if(pe!==null){var Et=Ri.unstable_now();Ue=Et+le;var Pt=!0;try{var Bn=pe(Pt,Et);Bn?ft.postMessage(null):(ze=!1,pe=null)}catch(Ir){throw ft.postMessage(null),Ir}}else ze=!1;rt=!1},$e=new MessageChannel,ft=$e.port2;$e.port1.onmessage=xt,p=function(Et){pe=Et,ze||(ze=!0,ft.postMessage(null))},E=function(Et,Pt){Oe=m(function(){Et(Ri.unstable_now())},Pt)},t=function(){we(Oe),Oe=-1}}function Ke(Et,Pt){var Bn=Et.length;Et.push(Pt),at(Et,Pt,Bn)}function jt(Et){var Pt=Et[0];return Pt===void 0?null:Pt}function $t(Et){var Pt=Et[0];if(Pt!==void 0){var Bn=Et.pop();return Bn!==Pt&&(Et[0]=Bn,Q(Et,Bn,0)),Pt}else return null}function at(Et,Pt,Bn){for(var Ir=Bn;;){var ji=Math.floor((Ir-1)/2),Wr=Et[ji];if(Wr!==void 0&&ae(Wr,Pt)>0)Et[ji]=Pt,Et[Ir]=Wr,Ir=ji;else return}}function Q(Et,Pt,Bn){for(var Ir=Bn,ji=Et.length;Irur){if(ur*=2,ur>Fr){console.error("Scheduler Profiling: Event log exceeded maximum size. Don't forget to call `stopLoggingProfilingEvents()`."),mr();return}var Bn=new Int32Array(ur*4);Bn.set(Kt),br=Bn.buffer,Kt=Bn}Kt.set(Et,Pt)}}function ai(){ur=fr,br=new ArrayBuffer(ur*4),Kt=new Int32Array(br),vu=0}function mr(){var Et=br;return ur=0,br=null,Kt=null,vu=0,Et}function Xo(Et,Pt){f&&(Wt[Vn]++,Kt!==null&&eu([a0,Pt*1e3,Et.id,Et.priorityLevel]))}function W0(Et,Pt){f&&(Wt[vr]=Ce,Wt[w]=0,Wt[Vn]--,Kt!==null&&eu([So,Pt*1e3,Et.id]))}function Lu(Et,Pt){f&&(Wt[Vn]--,Kt!==null&&eu([Os,Pt*1e3,Et.id]))}function V0(Et,Pt){f&&(Wt[vr]=Ce,Wt[w]=0,Wt[Vn]--,Kt!==null&&eu([Go,Pt*1e3,Et.id]))}function Hr(Et,Pt){f&&(ln++,Wt[vr]=Et.priorityLevel,Wt[w]=Et.id,Wt[Ut]=ln,Kt!==null&&eu([Yo,Pt*1e3,Et.id,ln]))}function To(Et,Pt){f&&(Wt[vr]=Ce,Wt[w]=0,Wt[Ut]=0,Kt!==null&&eu([Ko,Pt*1e3,Et.id,ln]))}function Co(Et){f&&(An++,Kt!==null&&eu([qt,Et*1e3,An]))}function L0(Et){f&&Kt!==null&&eu([_i,Et*1e3,An])}var tu=1073741823,Si=-1,ks=250,Hl=5e3,F0=1e4,f0=tu,Pr=[],Ei=[],G0=1,fi=!1,Zt=null,Ln=ct,Di=!1,ci=!1,Ht=!1;function Du(Et){for(var Pt=jt(Ei);Pt!==null;){if(Pt.callback===null)$t(Ei);else if(Pt.startTime<=Et)$t(Ei),Pt.sortIndex=Pt.expirationTime,Ke(Pr,Pt),f&&(Xo(Pt,Et),Pt.isQueued=!0);else return;Pt=jt(Ei)}}function Yi(Et){if(Ht=!1,Du(Et),!ci)if(jt(Pr)!==null)ci=!0,p(Y0);else{var Pt=jt(Ei);Pt!==null&&E(Yi,Pt.startTime-Et)}}function Y0(Et,Pt){f&&L0(Pt),ci=!1,Ht&&(Ht=!1,t()),Di=!0;var Bn=Ln;try{if(f)try{return Ui(Et,Pt)}catch(Wr){if(Zt!==null){var Ir=Ri.unstable_now();V0(Zt,Ir),Zt.isQueued=!1}throw Wr}else return Ui(Et,Pt)}finally{if(Zt=null,Ln=Bn,Di=!1,f){var ji=Ri.unstable_now();Co(ji)}}}function Ui(Et,Pt){var Bn=Pt;for(Du(Bn),Zt=jt(Pr);Zt!==null&&!(i&&fi)&&!(Zt.expirationTime>Bn&&(!Et||k()));){var Ir=Zt.callback;if(Ir!==null){Zt.callback=null,Ln=Zt.priorityLevel;var ji=Zt.expirationTime<=Bn;Hr(Zt,Bn);var Wr=Ir(ji);Bn=Ri.unstable_now(),typeof Wr=="function"?(Zt.callback=Wr,To(Zt,Bn)):(f&&(W0(Zt,Bn),Zt.isQueued=!1),Zt===jt(Pr)&&$t(Pr)),Du(Bn)}else $t(Pr);Zt=jt(Pr)}if(Zt!==null)return!0;var wu=jt(Ei);return wu!==null&&E(Yi,wu.startTime-Bn),!1}function Wl(Et,Pt){switch(Et){case ue:case je:case ct:case At:case en:break;default:Et=ct}var Bn=Ln;Ln=Et;try{return Pt()}finally{Ln=Bn}}function xo(Et){var Pt;switch(Ln){case ue:case je:case ct:Pt=ct;break;default:Pt=Ln;break}var Bn=Ln;Ln=Pt;try{return Et()}finally{Ln=Bn}}function ni(Et){var Pt=Ln;return function(){var Bn=Ln;Ln=Pt;try{return Et.apply(this,arguments)}finally{Ln=Bn}}}function oo(Et){switch(Et){case ue:return Si;case je:return ks;case en:return f0;case At:return F0;case ct:default:return Hl}}function Vl(Et,Pt,Bn){var Ir=Ri.unstable_now(),ji,Wr;if(typeof Bn=="object"&&Bn!==null){var wu=Bn.delay;typeof wu=="number"&&wu>0?ji=Ir+wu:ji=Ir,Wr=typeof Bn.timeout=="number"?Bn.timeout:oo(Et)}else Wr=oo(Et),ji=Ir;var c0=ji+Wr,Ti={id:G0++,callback:Pt,priorityLevel:Et,startTime:ji,expirationTime:c0,sortIndex:-1};return f&&(Ti.isQueued=!1),ji>Ir?(Ti.sortIndex=ji,Ke(Ei,Ti),jt(Pr)===null&&Ti===jt(Ei)&&(Ht?t():Ht=!0,E(Yi,ji-Ir))):(Ti.sortIndex=c0,Ke(Pr,Ti),f&&(Xo(Ti,Ir),Ti.isQueued=!0),!ci&&!Di&&(ci=!0,p(Y0))),Ti}function Ao(){fi=!0}function Ms(){fi=!1,!ci&&!Di&&(ci=!0,p(Y0))}function Xn(){return jt(Pr)}function Qo(Et){if(f&&Et.isQueued){var Pt=Ri.unstable_now();Lu(Et,Pt),Et.isQueued=!1}Et.callback=null}function lo(){return Ln}function b0(){var Et=Ri.unstable_now();Du(Et);var Pt=jt(Pr);return Pt!==Zt&&Zt!==null&&Pt!==null&&Pt.callback!==null&&Pt.startTime<=Et&&Pt.expirationTime{"use strict";process.env.NODE_ENV==="production"?aw.exports=h9():aw.exports=v9()});var m9=ce((Pne,pg)=>{pg.exports=function i(o){"use strict";var f=eg(),p=su(),E=h4();function t(g){for(var y="https://reactjs.org/docs/error-decoder.html?invariant="+g,A=1;AG0||(g.current=Ei[G0],Ei[G0]=null,G0--)}function Zt(g,y){G0++,Ei[G0]=g.current,g.current=y}var Ln={},Di={current:Ln},ci={current:!1},Ht=Ln;function Du(g,y){var A=g.type.contextTypes;if(!A)return Ln;var F=g.stateNode;if(F&&F.__reactInternalMemoizedUnmaskedChildContext===y)return F.__reactInternalMemoizedMaskedChildContext;var I={},J;for(J in A)I[J]=y[J];return F&&(g=g.stateNode,g.__reactInternalMemoizedUnmaskedChildContext=y,g.__reactInternalMemoizedMaskedChildContext=I),I}function Yi(g){return g=g.childContextTypes,g!=null}function Y0(g){fi(ci,g),fi(Di,g)}function Ui(g){fi(ci,g),fi(Di,g)}function Wl(g,y,A){if(Di.current!==Ln)throw Error(t(168));Zt(Di,y,g),Zt(ci,A,g)}function xo(g,y,A){var F=g.stateNode;if(g=y.childContextTypes,typeof F.getChildContext!="function")return A;F=F.getChildContext();for(var I in F)if(!(I in g))throw Error(t(108,Ge(y)||"Unknown",I));return f({},A,{},F)}function ni(g){var y=g.stateNode;return y=y&&y.__reactInternalMemoizedMergedChildContext||Ln,Ht=Di.current,Zt(Di,y,g),Zt(ci,ci.current,g),!0}function oo(g,y,A){var F=g.stateNode;if(!F)throw Error(t(169));A?(y=xo(g,y,Ht),F.__reactInternalMemoizedMergedChildContext=y,fi(ci,g),fi(Di,g),Zt(Di,y,g)):fi(ci,g),Zt(ci,A,g)}var Vl=E.unstable_runWithPriority,Ao=E.unstable_scheduleCallback,Ms=E.unstable_cancelCallback,Xn=E.unstable_shouldYield,Qo=E.unstable_requestPaint,lo=E.unstable_now,b0=E.unstable_getCurrentPriorityLevel,yl=E.unstable_ImmediatePriority,Ro=E.unstable_UserBlockingPriority,Et=E.unstable_NormalPriority,Pt=E.unstable_LowPriority,Bn=E.unstable_IdlePriority,Ir={},ji=Qo!==void 0?Qo:function(){},Wr=null,wu=null,c0=!1,Ti=lo(),d0=1e4>Ti?lo:function(){return lo()-Ti};function as(){switch(b0()){case yl:return 99;case Ro:return 98;case Et:return 97;case Pt:return 96;case Bn:return 95;default:throw Error(t(332))}}function St(g){switch(g){case 99:return yl;case 98:return Ro;case 97:return Et;case 96:return Pt;case 95:return Bn;default:throw Error(t(332))}}function so(g,y){return g=St(g),Vl(g,y)}function Jo(g,y,A){return g=St(g),Ao(g,y,A)}function Gl(g){return Wr===null?(Wr=[g],wu=Ao(yl,fs)):Wr.push(g),Ir}function Fu(){if(wu!==null){var g=wu;wu=null,Ms(g)}fs()}function fs(){if(!c0&&Wr!==null){c0=!0;var g=0;try{var y=Wr;so(99,function(){for(;g=y&&(fo=!0),g.firstContext=null)}function Tu(g,y){if(Su!==g&&y!==!1&&y!==0)if((typeof y!="number"||y===1073741823)&&(Su=g,y=1073741823),y={context:g,observedBits:y,next:null},mi===null){if(or===null)throw Error(t(308));mi=y,or.dependencies={expirationTime:0,firstContext:y,responders:null}}else mi=mi.next=y;return un?g._currentValue:g._currentValue2}var ao=!1;function Iu(g){return{baseState:g,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function Oa(g){return{baseState:g.baseState,firstUpdate:g.firstUpdate,lastUpdate:g.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function p0(g,y){return{expirationTime:g,suspenseConfig:y,tag:0,payload:null,callback:null,next:null,nextEffect:null}}function Zs(g,y){g.lastUpdate===null?g.firstUpdate=g.lastUpdate=y:(g.lastUpdate.next=y,g.lastUpdate=y)}function K0(g,y){var A=g.alternate;if(A===null){var F=g.updateQueue,I=null;F===null&&(F=g.updateQueue=Iu(g.memoizedState))}else F=g.updateQueue,I=A.updateQueue,F===null?I===null?(F=g.updateQueue=Iu(g.memoizedState),I=A.updateQueue=Iu(A.memoizedState)):F=g.updateQueue=Oa(I):I===null&&(I=A.updateQueue=Oa(F));I===null||F===I?Zs(F,y):F.lastUpdate===null||I.lastUpdate===null?(Zs(F,y),Zs(I,y)):(Zs(F,y),I.lastUpdate=y)}function $s(g,y){var A=g.updateQueue;A=A===null?g.updateQueue=Iu(g.memoizedState):ka(g,A),A.lastCapturedUpdate===null?A.firstCapturedUpdate=A.lastCapturedUpdate=y:(A.lastCapturedUpdate.next=y,A.lastCapturedUpdate=y)}function ka(g,y){var A=g.alternate;return A!==null&&y===A.updateQueue&&(y=g.updateQueue=Oa(y)),y}function cs(g,y,A,F,I,J){switch(A.tag){case 1:return g=A.payload,typeof g=="function"?g.call(J,F,I):g;case 3:g.effectTag=g.effectTag&-4097|64;case 0:if(g=A.payload,I=typeof g=="function"?g.call(J,F,I):g,I==null)break;return f({},F,I);case 2:ao=!0}return F}function w0(g,y,A,F,I){ao=!1,y=ka(g,y);for(var J=y.baseState,fe=null,mt=0,Ct=y.firstUpdate,Mt=J;Ct!==null;){var Er=Ct.expirationTime;Erii?(qi=tr,tr=null):qi=tr.sibling;var jr=iu(He,tr,ut[ii],Jt);if(jr===null){tr===null&&(tr=qi);break}g&&tr&&jr.alternate===null&&y(He,tr),Be=J(jr,Be,ii),ti===null?jn=jr:ti.sibling=jr,ti=jr,tr=qi}if(ii===ut.length)return A(He,tr),jn;if(tr===null){for(;iiii?(qi=tr,tr=null):qi=tr.sibling;var gu=iu(He,tr,jr.value,Jt);if(gu===null){tr===null&&(tr=qi);break}g&&tr&&gu.alternate===null&&y(He,tr),Be=J(gu,Be,ii),ti===null?jn=gu:ti.sibling=gu,ti=gu,tr=qi}if(jr.done)return A(He,tr),jn;if(tr===null){for(;!jr.done;ii++,jr=ut.next())jr=$u(He,jr.value,Jt),jr!==null&&(Be=J(jr,Be,ii),ti===null?jn=jr:ti.sibling=jr,ti=jr);return jn}for(tr=F(He,tr);!jr.done;ii++,jr=ut.next())jr=j0(tr,He,ii,jr.value,Jt),jr!==null&&(g&&jr.alternate!==null&&tr.delete(jr.key===null?ii:jr.key),Be=J(jr,Be,ii),ti===null?jn=jr:ti.sibling=jr,ti=jr);return g&&tr.forEach(function(Ba){return y(He,Ba)}),jn}return function(He,Be,ut,Jt){var jn=typeof ut=="object"&&ut!==null&&ut.type===U&&ut.key===null;jn&&(ut=ut.props.children);var ti=typeof ut=="object"&&ut!==null;if(ti)switch(ut.$$typeof){case N:e:{for(ti=ut.key,jn=Be;jn!==null;){if(jn.key===ti)if(jn.tag===7?ut.type===U:jn.elementType===ut.type){A(He,jn.sibling),Be=I(jn,ut.type===U?ut.props.children:ut.props,Jt),Be.ref=Fs(He,jn,ut),Be.return=He,He=Be;break e}else{A(He,jn);break}else y(He,jn);jn=jn.sibling}ut.type===U?(Be=Zu(ut.props.children,He.mode,Jt,ut.key),Be.return=He,He=Be):(Jt=Ia(ut.type,ut.key,ut.props,null,He.mode,Jt),Jt.ref=Fs(He,Be,ut),Jt.return=He,He=Jt)}return fe(He);case C:e:{for(jn=ut.key;Be!==null;){if(Be.key===jn)if(Be.tag===4&&Be.stateNode.containerInfo===ut.containerInfo&&Be.stateNode.implementation===ut.implementation){A(He,Be.sibling),Be=I(Be,ut.children||[],Jt),Be.return=He,He=Be;break e}else{A(He,Be);break}else y(He,Be);Be=Be.sibling}Be=vf(ut,He.mode,Jt),Be.return=He,He=Be}return fe(He)}if(typeof ut=="string"||typeof ut=="number")return ut=""+ut,Be!==null&&Be.tag===6?(A(He,Be.sibling),Be=I(Be,ut,Jt),Be.return=He,He=Be):(A(He,Be),Be=U0(ut,He.mode,Jt),Be.return=He,He=Be),fe(He);if(h0(ut))return Tl(He,Be,ut,Jt);if(le(ut))return e0(He,Be,ut,Jt);if(ti&&Ni(He,ut),typeof ut=="undefined"&&!jn)switch(He.tag){case 1:case 0:throw He=He.type,Error(t(152,He.displayName||He.name||"Component"))}return A(He,Be)}}var z=B(!0),G=B(!1),$={},De={current:$},me={current:$},xe={current:$};function Z(g){if(g===$)throw Error(t(174));return g}function ke(g,y){Zt(xe,y,g),Zt(me,g,g),Zt(De,$,g),y=jt(y),fi(De,g),Zt(De,y,g)}function Xe(g){fi(De,g),fi(me,g),fi(xe,g)}function ht(g){var y=Z(xe.current),A=Z(De.current);y=$t(A,g.type,y),A!==y&&(Zt(me,g,g),Zt(De,y,g))}function ie(g){me.current===g&&(fi(De,g),fi(me,g))}var qe={current:0};function tt(g){for(var y=g;y!==null;){if(y.tag===13){var A=y.memoizedState;if(A!==null&&(A=A.dehydrated,A===null||Hr(A)||To(A)))return y}else if(y.tag===19&&y.memoizedProps.revealOrder!==void 0){if((y.effectTag&64)!=0)return y}else if(y.child!==null){y.child.return=y,y=y.child;continue}if(y===g)break;for(;y.sibling===null;){if(y.return===null||y.return===g)return null;y=y.return}y.sibling.return=y.return,y=y.sibling}return null}function Tt(g,y){return{responder:g,props:y}}var kt=k.ReactCurrentDispatcher,bt=k.ReactCurrentBatchConfig,on=0,tn=null,Lt=null,gn=null,lr=null,Qn=null,_r=null,Cn=0,Ar=null,v0=0,Rr=!1,nt=null,_t=0;function Ze(){throw Error(t(321))}function Ft(g,y){if(y===null)return!1;for(var A=0;ACn&&(Cn=Er,La(Cn))):(oc(Er,Ct.suspenseConfig),J=Ct.eagerReducer===g?Ct.eagerState:g(J,Ct.action)),fe=Ct,Ct=Ct.next}while(Ct!==null&&Ct!==F);Mt||(mt=fe,I=J),Ne(J,y.memoizedState)||(fo=!0),y.memoizedState=J,y.baseUpdate=mt,y.baseState=I,A.lastRenderedState=J}return[y.memoizedState,A.dispatch]}function S0(g){var y=Yn();return typeof g=="function"&&(g=g()),y.memoizedState=y.baseState=g,g=y.queue={last:null,dispatch:null,lastRenderedReducer:nu,lastRenderedState:g},g=g.dispatch=bs.bind(null,tn,g),[y.memoizedState,g]}function X0(g){return Cu(nu,g)}function xu(g,y,A,F){return g={tag:g,create:y,destroy:A,deps:F,next:null},Ar===null?(Ar={lastEffect:null},Ar.lastEffect=g.next=g):(y=Ar.lastEffect,y===null?Ar.lastEffect=g.next=g:(A=y.next,y.next=g,g.next=A,Ar.lastEffect=g)),g}function di(g,y,A,F){var I=Yn();v0|=g,I.memoizedState=xu(y,A,void 0,F===void 0?null:F)}function ko(g,y,A,F){var I=yr();F=F===void 0?null:F;var J=void 0;if(Lt!==null){var fe=Lt.memoizedState;if(J=fe.destroy,F!==null&&Ft(F,fe.deps)){xu(0,A,J,F);return}}v0|=g,I.memoizedState=xu(y,A,J,F)}function Zo(g,y){return di(516,192,g,y)}function sf(g,y){return ko(516,192,g,y)}function gl(g,y){if(typeof y=="function")return g=g(),y(g),function(){y(null)};if(y!=null)return g=g(),y.current=g,function(){y.current=null}}function af(){}function Mo(g,y){return Yn().memoizedState=[g,y===void 0?null:y],g}function ds(g,y){var A=yr();y=y===void 0?null:y;var F=A.memoizedState;return F!==null&&y!==null&&Ft(y,F[1])?F[0]:(A.memoizedState=[g,y],g)}function bs(g,y,A){if(!(25>_t))throw Error(t(301));var F=g.alternate;if(g===tn||F!==null&&F===tn)if(Rr=!0,g={expirationTime:on,suspenseConfig:null,action:A,eagerReducer:null,eagerState:null,next:null},nt===null&&(nt=new Map),A=nt.get(y),A===void 0)nt.set(y,g);else{for(y=A;y.next!==null;)y=y.next;y.next=g}else{var I=g0(),J=ri.suspense;I=bn(I,g,J),J={expirationTime:I,suspenseConfig:J,action:A,eagerReducer:null,eagerState:null,next:null};var fe=y.last;if(fe===null)J.next=J;else{var mt=fe.next;mt!==null&&(J.next=mt),fe.next=J}if(y.last=J,g.expirationTime===0&&(F===null||F.expirationTime===0)&&(F=y.lastRenderedReducer,F!==null))try{var Ct=y.lastRenderedState,Mt=F(Ct,A);if(J.eagerReducer=F,J.eagerState=Mt,Ne(Mt,Ct))return}catch(Er){}finally{}Qu(g,I)}}var No={readContext:Tu,useCallback:Ze,useContext:Ze,useEffect:Ze,useImperativeHandle:Ze,useLayoutEffect:Ze,useMemo:Ze,useReducer:Ze,useRef:Ze,useState:Ze,useDebugValue:Ze,useResponder:Ze,useDeferredValue:Ze,useTransition:Ze},Lo={readContext:Tu,useCallback:Mo,useContext:Tu,useEffect:Zo,useImperativeHandle:function(g,y,A){return A=A!=null?A.concat([g]):null,di(4,36,gl.bind(null,y,g),A)},useLayoutEffect:function(g,y){return di(4,36,g,y)},useMemo:function(g,y){var A=Yn();return y=y===void 0?null:y,g=g(),A.memoizedState=[g,y],g},useReducer:function(g,y,A){var F=Yn();return y=A!==void 0?A(y):y,F.memoizedState=F.baseState=y,g=F.queue={last:null,dispatch:null,lastRenderedReducer:g,lastRenderedState:y},g=g.dispatch=bs.bind(null,tn,g),[F.memoizedState,g]},useRef:function(g){var y=Yn();return g={current:g},y.memoizedState=g},useState:S0,useDebugValue:af,useResponder:Tt,useDeferredValue:function(g,y){var A=S0(g),F=A[0],I=A[1];return Zo(function(){E.unstable_next(function(){var J=bt.suspense;bt.suspense=y===void 0?null:y;try{I(g)}finally{bt.suspense=J}})},[g,y]),F},useTransition:function(g){var y=S0(!1),A=y[0],F=y[1];return[Mo(function(I){F(!0),E.unstable_next(function(){var J=bt.suspense;bt.suspense=g===void 0?null:g;try{F(!1),I()}finally{bt.suspense=J}})},[g,A]),A]}},ps={readContext:Tu,useCallback:ds,useContext:Tu,useEffect:sf,useImperativeHandle:function(g,y,A){return A=A!=null?A.concat([g]):null,ko(4,36,gl.bind(null,y,g),A)},useLayoutEffect:function(g,y){return ko(4,36,g,y)},useMemo:function(g,y){var A=yr();y=y===void 0?null:y;var F=A.memoizedState;return F!==null&&y!==null&&Ft(y,F[1])?F[0]:(g=g(),A.memoizedState=[g,y],g)},useReducer:Cu,useRef:function(){return yr().memoizedState},useState:X0,useDebugValue:af,useResponder:Tt,useDeferredValue:function(g,y){var A=X0(g),F=A[0],I=A[1];return sf(function(){E.unstable_next(function(){var J=bt.suspense;bt.suspense=y===void 0?null:y;try{I(g)}finally{bt.suspense=J}})},[g,y]),F},useTransition:function(g){var y=X0(!1),A=y[0],F=y[1];return[ds(function(I){F(!0),E.unstable_next(function(){var J=bt.suspense;bt.suspense=g===void 0?null:g;try{F(!1),I()}finally{bt.suspense=J}})},[g,A]),A]}},Vu=null,yu=null,pi=!1;function T0(g,y){var A=Io(5,null,null,0);A.elementType="DELETED",A.type="DELETED",A.stateNode=y,A.return=g,A.effectTag=8,g.lastEffect!==null?(g.lastEffect.nextEffect=A,g.lastEffect=A):g.firstEffect=g.lastEffect=A}function Q0(g,y){switch(g.tag){case 5:return y=Lu(y,g.type,g.pendingProps),y!==null?(g.stateNode=y,!0):!1;case 6:return y=V0(y,g.pendingProps),y!==null?(g.stateNode=y,!0):!1;case 13:return!1;default:return!1}}function Fo(g){if(pi){var y=yu;if(y){var A=y;if(!Q0(g,y)){if(y=Co(A),!y||!Q0(g,y)){g.effectTag=g.effectTag&-1025|2,pi=!1,Vu=g;return}T0(Vu,A)}Vu=g,yu=L0(y)}else g.effectTag=g.effectTag&-1025|2,pi=!1,Vu=g}}function ta(g){for(g=g.return;g!==null&&g.tag!==5&&g.tag!==3&&g.tag!==13;)g=g.return;Vu=g}function Kl(g){if(!w||g!==Vu)return!1;if(!pi)return ta(g),pi=!0,!1;var y=g.type;if(g.tag!==5||y!=="head"&&y!=="body"&&!ct(y,g.memoizedProps))for(y=yu;y;)T0(g,y),y=Co(y);if(ta(g),g.tag===13){if(!w)throw Error(t(316));if(g=g.memoizedState,g=g!==null?g.dehydrated:null,!g)throw Error(t(317));yu=ks(g)}else yu=Vu?Co(g.stateNode):null;return!0}function Ki(){w&&(yu=Vu=null,pi=!1)}var Yr=k.ReactCurrentOwner,fo=!1;function Oi(g,y,A,F){y.child=g===null?G(y,null,A,F):z(y,g.child,A,F)}function gi(g,y,A,F,I){A=A.render;var J=y.ref;return Oo(y,I),F=nn(g,y,A,F,J,I),g!==null&&!fo?(y.updateQueue=g.updateQueue,y.effectTag&=-517,g.expirationTime<=I&&(g.expirationTime=0),fu(g,y,I)):(y.effectTag|=1,Oi(g,y,F,I),y.child)}function ff(g,y,A,F,I,J){if(g===null){var fe=A.type;return typeof fe=="function"&&!hf(fe)&&fe.defaultProps===void 0&&A.compare===null&&A.defaultProps===void 0?(y.tag=15,y.type=fe,cf(g,y,fe,F,I,J)):(g=Ia(A.type,null,F,null,y.mode,J),g.ref=y.ref,g.return=y,y.child=g)}return fe=g.child,Iy)&&Ur.set(g,y)))}}function eo(g,y){g.expirationTimeg?y:g)}function Ju(g){if(g.lastExpiredTime!==0)g.callbackExpirationTime=1073741823,g.callbackPriority=99,g.callbackNode=Gl(to.bind(null,g));else{var y=po(g),A=g.callbackNode;if(y===0)A!==null&&(g.callbackNode=null,g.callbackExpirationTime=0,g.callbackPriority=90);else{var F=g0();if(y===1073741823?F=99:y===1||y===2?F=95:(F=10*(1073741821-y)-10*(1073741821-F),F=0>=F?99:250>=F?98:5250>=F?97:95),A!==null){var I=g.callbackPriority;if(g.callbackExpirationTime===y&&I>=F)return;A!==Ir&&Ms(A)}g.callbackExpirationTime=y,g.callbackPriority=F,y=y===1073741823?Gl(to.bind(null,g)):Jo(F,bo.bind(null,g),{timeout:10*(1073741821-y)-d0()}),g.callbackNode=y}}}function bo(g,y){if(Qi=0,y)return y=g0(),oa(g,y),Ju(g),null;var A=po(g);if(A!==0){if(y=g.callbackNode,(kn&(Xi|ru))!==wr)throw Error(t(327));if(Bs(),g===se&&A===Le||ms(g,A),re!==null){var F=kn;kn|=Xi;var I=B0(g);do try{$1();break}catch(mt){ia(g,mt)}while(1);if(bu(),kn=F,Ku.current=I,Ae===Xr)throw y=ot,ms(g,A),Sl(g,A),Ju(g),y;if(re===null)switch(I=g.finishedWork=g.current.alternate,g.finishedExpirationTime=A,F=Ae,se=null,F){case Ci:case Xr:throw Error(t(345));case Wn:oa(g,2=A){g.lastPingedTime=A,ms(g,A);break}}if(J=po(g),J!==0&&J!==A)break;if(F!==0&&F!==A){g.lastPingedTime=F;break}g.timeoutHandle=ln(Dl.bind(null,g),I);break}Dl(g);break;case m0:if(Sl(g,A),F=g.lastSuspendedTime,A===F&&(g.nextKnownPendingLevel=Uc(I)),yn&&(I=g.lastPingedTime,I===0||I>=A)){g.lastPingedTime=A,ms(g,A);break}if(I=po(g),I!==0&&I!==A)break;if(F!==0&&F!==A){g.lastPingedTime=F;break}if(Xt!==1073741823?F=10*(1073741821-Xt)-d0():vt===1073741823?F=0:(F=10*(1073741821-vt)-5e3,I=d0(),A=10*(1073741821-A)-I,F=I-F,0>F&&(F=0),F=(120>F?120:480>F?480:1080>F?1080:1920>F?1920:3e3>F?3e3:4320>F?4320:1960*df(F/1960))-F,A=F?F=0:(I=fe.busyDelayMs|0,J=d0()-(10*(1073741821-J)-(fe.timeoutMs|0||5e3)),F=J<=I?0:I+F-J),10 component higher in the tree to provide a loading indicator or placeholder to display.`+Pr(I))}Ae!==y0&&(Ae=Wn),J=_l(J,I),Ct=F;do{switch(Ct.tag){case 3:fe=J,Ct.effectTag|=4096,Ct.expirationTime=y;var Be=hs(Ct,fe,y);$s(Ct,Be);break e;case 1:fe=J;var ut=Ct.type,Jt=Ct.stateNode;if((Ct.effectTag&64)==0&&(typeof ut.getDerivedStateFromError=="function"||Jt!==null&&typeof Jt.componentDidCatch=="function"&&(cr===null||!cr.has(Jt)))){Ct.effectTag|=4096,Ct.expirationTime=y;var jn=ra(Ct,fe,y);$s(Ct,jn);break e}}Ct=Ct.return}while(Ct!==null)}re=ho(re)}catch(ti){y=ti;continue}break}while(1)}function B0(){var g=Ku.current;return Ku.current=No,g===null?No:g}function oc(g,y){g_n&&(_n=g)}function gd(){for(;re!==null;)re=e2(re)}function $1(){for(;re!==null&&!Xn();)re=e2(re)}function e2(g){var y=Pa(g.alternate,g,Le);return g.memoizedProps=g.pendingProps,y===null&&(y=ho(g)),vs.current=null,y}function ho(g){re=g;do{var y=re.alternate;if(g=re.return,(re.effectTag&2048)==0){e:{var A=y;y=re;var F=Le,I=y.pendingProps;switch(y.tag){case 2:break;case 16:break;case 15:case 0:break;case 1:Yi(y.type)&&Y0(y);break;case 3:Xe(y),Ui(y),I=y.stateNode,I.pendingContext&&(I.context=I.pendingContext,I.pendingContext=null),(A===null||A.child===null)&&Kl(y)&&Gu(y),Vr(y);break;case 5:ie(y);var J=Z(xe.current);if(F=y.type,A!==null&&y.stateNode!=null)Bu(A,y,F,I,J),A.ref!==y.ref&&(y.effectTag|=128);else if(I){if(A=Z(De.current),Kl(y)){if(I=y,!w)throw Error(t(175));A=tu(I.stateNode,I.type,I.memoizedProps,J,A,I),I.updateQueue=A,A=A!==null,A&&Gu(y)}else{var fe=ae(F,I,J,A,y);Kr(fe,y,!1,!1),y.stateNode=fe,ue(fe,F,I,J,A)&&Gu(y)}y.ref!==null&&(y.effectTag|=128)}else if(y.stateNode===null)throw Error(t(166));break;case 6:if(A&&y.stateNode!=null)Sn(A,y,A.memoizedProps,I);else{if(typeof I!="string"&&y.stateNode===null)throw Error(t(166));if(A=Z(xe.current),J=Z(De.current),Kl(y)){if(A=y,!w)throw Error(t(176));(A=Si(A.stateNode,A.memoizedProps,A))&&Gu(y)}else y.stateNode=en(I,A,J,y)}break;case 11:break;case 13:if(fi(qe,y),I=y.memoizedState,(y.effectTag&64)!=0){y.expirationTime=F;break e}I=I!==null,J=!1,A===null?y.memoizedProps.fallback!==void 0&&Kl(y):(F=A.memoizedState,J=F!==null,I||F===null||(F=A.child.sibling,F!==null&&(fe=y.firstEffect,fe!==null?(y.firstEffect=F,F.nextEffect=fe):(y.firstEffect=y.lastEffect=F,F.nextEffect=null),F.effectTag=8))),I&&!J&&(y.mode&2)!=0&&(A===null&&y.memoizedProps.unstable_avoidThisFallback!==!0||(qe.current&1)!=0?Ae===Ci&&(Ae=Xu):((Ae===Ci||Ae===Xu)&&(Ae=m0),_n!==0&&se!==null&&(Sl(se,Le),_s(se,_n)))),vr&&I&&(y.effectTag|=4),Wt&&(I||J)&&(y.effectTag|=4);break;case 7:break;case 8:break;case 12:break;case 4:Xe(y),Vr(y);break;case 10:mu(y);break;case 9:break;case 14:break;case 17:Yi(y.type)&&Y0(y);break;case 19:if(fi(qe,y),I=y.memoizedState,I===null)break;if(J=(y.effectTag&64)!=0,fe=I.rendering,fe===null){if(J)Au(I,!1);else if(Ae!==Ci||A!==null&&(A.effectTag&64)!=0)for(A=y.child;A!==null;){if(fe=tt(A),fe!==null){for(y.effectTag|=64,Au(I,!1),A=fe.updateQueue,A!==null&&(y.updateQueue=A,y.effectTag|=4),I.lastEffect===null&&(y.firstEffect=null),y.lastEffect=I.lastEffect,A=F,I=y.child;I!==null;)J=I,F=A,J.effectTag&=2,J.nextEffect=null,J.firstEffect=null,J.lastEffect=null,fe=J.alternate,fe===null?(J.childExpirationTime=0,J.expirationTime=F,J.child=null,J.memoizedProps=null,J.memoizedState=null,J.updateQueue=null,J.dependencies=null):(J.childExpirationTime=fe.childExpirationTime,J.expirationTime=fe.expirationTime,J.child=fe.child,J.memoizedProps=fe.memoizedProps,J.memoizedState=fe.memoizedState,J.updateQueue=fe.updateQueue,F=fe.dependencies,J.dependencies=F===null?null:{expirationTime:F.expirationTime,firstContext:F.firstContext,responders:F.responders}),I=I.sibling;Zt(qe,qe.current&1|2,y),y=y.child;break e}A=A.sibling}}else{if(!J)if(A=tt(fe),A!==null){if(y.effectTag|=64,J=!0,A=A.updateQueue,A!==null&&(y.updateQueue=A,y.effectTag|=4),Au(I,!0),I.tail===null&&I.tailMode==="hidden"&&!fe.alternate){y=y.lastEffect=I.lastEffect,y!==null&&(y.nextEffect=null);break}}else d0()>I.tailExpiration&&1I&&(I=F),fe>I&&(I=fe),J=J.sibling;A.childExpirationTime=I}if(y!==null)return y;g!==null&&(g.effectTag&2048)==0&&(g.firstEffect===null&&(g.firstEffect=re.firstEffect),re.lastEffect!==null&&(g.lastEffect!==null&&(g.lastEffect.nextEffect=re.firstEffect),g.lastEffect=re.lastEffect),1g?y:g}function Dl(g){var y=as();return so(99,el.bind(null,g,y)),null}function el(g,y){do Bs();while(Qr!==null);if((kn&(Xi|ru))!==wr)throw Error(t(327));var A=g.finishedWork,F=g.finishedExpirationTime;if(A===null)return null;if(g.finishedWork=null,g.finishedExpirationTime=0,A===g.current)throw Error(t(177));g.callbackNode=null,g.callbackExpirationTime=0,g.callbackPriority=90,g.nextKnownPendingLevel=0;var I=Uc(A);if(g.firstPendingTime=I,F<=g.lastSuspendedTime?g.firstSuspendedTime=g.lastSuspendedTime=g.nextKnownPendingLevel=0:F<=g.firstSuspendedTime&&(g.firstSuspendedTime=F-1),F<=g.lastPingedTime&&(g.lastPingedTime=0),F<=g.lastExpiredTime&&(g.lastExpiredTime=0),g===se&&(re=se=null,Le=0),1=A?Yt(g,y,A):(Zt(qe,qe.current&1,y),y=fu(g,y,A),y!==null?y.sibling:null);Zt(qe,qe.current&1,y);break;case 19:if(F=y.childExpirationTime>=A,(g.effectTag&64)!=0){if(F)return wn(g,y,A);y.effectTag|=64}if(I=y.memoizedState,I!==null&&(I.rendering=null,I.tail=null),Zt(qe,qe.current,y),!F)return null}return fu(g,y,A)}fo=!1}}else fo=!1;switch(y.expirationTime=0,y.tag){case 2:if(F=y.type,g!==null&&(g.alternate=null,y.alternate=null,y.effectTag|=2),g=y.pendingProps,I=Du(y,Di.current),Oo(y,A),I=nn(null,y,F,g,I,A),y.effectTag|=1,typeof I=="object"&&I!==null&&typeof I.render=="function"&&I.$$typeof===void 0){if(y.tag=1,sn(),Yi(F)){var J=!0;ni(y)}else J=!1;y.memoizedState=I.state!==null&&I.state!==void 0?I.state:null;var fe=F.getDerivedStateFromProps;typeof fe=="function"&&Yl(y,F,fe,g),I.updater=ea,y.stateNode=I,I._reactInternalFiber=y,Ls(y,F,g,A),y=et(null,y,F,!0,J,A)}else y.tag=0,Oi(null,y,I,A),y=y.child;return y;case 16:if(I=y.elementType,g!==null&&(g.alternate=null,y.alternate=null,y.effectTag|=2),g=y.pendingProps,Ue(I),I._status!==1)throw I._result;switch(I=I._result,y.type=I,J=y.tag=tl(I),g=Hn(I,g),J){case 0:y=Z0(null,y,I,g,A);break;case 1:y=Te(null,y,I,g,A);break;case 11:y=gi(null,y,I,g,A);break;case 14:y=ff(null,y,I,Hn(I.type,g),F,A);break;default:throw Error(t(306,I,""))}return y;case 0:return F=y.type,I=y.pendingProps,I=y.elementType===F?I:Hn(F,I),Z0(g,y,F,I,A);case 1:return F=y.type,I=y.pendingProps,I=y.elementType===F?I:Hn(F,I),Te(g,y,F,I,A);case 3:if(Ve(y),F=y.updateQueue,F===null)throw Error(t(282));if(I=y.memoizedState,I=I!==null?I.element:null,w0(y,F,y.pendingProps,null,A),F=y.memoizedState.element,F===I)Ki(),y=fu(g,y,A);else{if((I=y.stateNode.hydrate)&&(w?(yu=L0(y.stateNode.containerInfo),Vu=y,I=pi=!0):I=!1),I)for(A=G(y,null,F,A),y.child=A;A;)A.effectTag=A.effectTag&-3|1024,A=A.sibling;else Oi(g,y,F,A),Ki();y=y.child}return y;case 5:return ht(y),g===null&&Fo(y),F=y.type,I=y.pendingProps,J=g!==null?g.memoizedProps:null,fe=I.children,ct(F,I)?fe=null:J!==null&&ct(F,J)&&(y.effectTag|=16),J0(g,y),y.mode&4&&A!==1&&At(F,I)?(y.expirationTime=y.childExpirationTime=1,y=null):(Oi(g,y,fe,A),y=y.child),y;case 6:return g===null&&Fo(y),null;case 13:return Yt(g,y,A);case 4:return ke(y,y.stateNode.containerInfo),F=y.pendingProps,g===null?y.child=z(y,null,F,A):Oi(g,y,F,A),y.child;case 11:return F=y.type,I=y.pendingProps,I=y.elementType===F?I:Hn(F,I),gi(g,y,F,I,A);case 7:return Oi(g,y,y.pendingProps,A),y.child;case 8:return Oi(g,y,y.pendingProps.children,A),y.child;case 12:return Oi(g,y,y.pendingProps.children,A),y.child;case 10:e:{if(F=y.type._context,I=y.pendingProps,fe=y.memoizedProps,J=I.value,Pu(y,J),fe!==null){var mt=fe.value;if(J=Ne(mt,J)?0:(typeof F._calculateChangedBits=="function"?F._calculateChangedBits(mt,J):1073741823)|0,J===0){if(fe.children===I.children&&!ci.current){y=fu(g,y,A);break e}}else for(mt=y.child,mt!==null&&(mt.return=y);mt!==null;){var Ct=mt.dependencies;if(Ct!==null){fe=mt.child;for(var Mt=Ct.firstContext;Mt!==null;){if(Mt.context===F&&(Mt.observedBits&J)!=0){mt.tag===1&&(Mt=p0(A,null),Mt.tag=2,K0(mt,Mt)),mt.expirationTime=y&&g<=y}function Sl(g,y){var A=g.firstSuspendedTime,F=g.lastSuspendedTime;Ay||A===0)&&(g.lastSuspendedTime=y),y<=g.lastPingedTime&&(g.lastPingedTime=0),y<=g.lastExpiredTime&&(g.lastExpiredTime=0)}function _s(g,y){y>g.firstPendingTime&&(g.firstPendingTime=y);var A=g.firstSuspendedTime;A!==0&&(y>=A?g.firstSuspendedTime=g.lastSuspendedTime=g.nextKnownPendingLevel=0:y>=g.lastSuspendedTime&&(g.lastSuspendedTime=y+1),y>g.nextKnownPendingLevel&&(g.nextKnownPendingLevel=y))}function oa(g,y){var A=g.lastExpiredTime;(A===0||A>y)&&(g.lastExpiredTime=y)}function n2(g){var y=g._reactInternalFiber;if(y===void 0)throw typeof g.render=="function"?Error(t(188)):Error(t(268,Object.keys(g)));return g=$e(y),g===null?null:g.stateNode}function la(g,y){g=g.memoizedState,g!==null&&g.dehydrated!==null&&g.retryTime{"use strict";Object.defineProperty(Qf,"__esModule",{value:!0});var JK=0;Qf.__interactionsRef=null;Qf.__subscriberRef=null;Qf.unstable_clear=function(i){return i()};Qf.unstable_getCurrent=function(){return null};Qf.unstable_getThreadID=function(){return++JK};Qf.unstable_trace=function(i,o,f){return f()};Qf.unstable_wrap=function(i){return i};Qf.unstable_subscribe=function(){};Qf.unstable_unsubscribe=function(){}});var g9=ce(au=>{"use strict";process.env.NODE_ENV!=="production"&&function(){"use strict";Object.defineProperty(au,"__esModule",{value:!0});var i=!0,o=0,f=0,p=0;au.__interactionsRef=null,au.__subscriberRef=null,i&&(au.__interactionsRef={current:new Set},au.__subscriberRef={current:null});function E(ge){if(!i)return ge();var ze=au.__interactionsRef.current;au.__interactionsRef.current=new Set;try{return ge()}finally{au.__interactionsRef.current=ze}}function t(){return i?au.__interactionsRef.current:null}function k(){return++p}function L(ge,ze,pe){var Oe=arguments.length>3&&arguments[3]!==void 0?arguments[3]:o;if(!i)return pe();var le={__count:1,id:f++,name:ge,timestamp:ze},Ue=au.__interactionsRef.current,Ge=new Set(Ue);Ge.add(le),au.__interactionsRef.current=Ge;var rt=au.__subscriberRef.current,wt;try{rt!==null&&rt.onInteractionTraced(le)}finally{try{rt!==null&&rt.onWorkStarted(Ge,Oe)}finally{try{wt=pe()}finally{au.__interactionsRef.current=Ue;try{rt!==null&&rt.onWorkStopped(Ge,Oe)}finally{le.__count--,rt!==null&&le.__count===0&&rt.onInteractionScheduledWorkCompleted(le)}}}}return wt}function N(ge){var ze=arguments.length>1&&arguments[1]!==void 0?arguments[1]:o;if(!i)return ge;var pe=au.__interactionsRef.current,Oe=au.__subscriberRef.current;Oe!==null&&Oe.onWorkScheduled(pe,ze),pe.forEach(function(Ge){Ge.__count++});var le=!1;function Ue(){var Ge=au.__interactionsRef.current;au.__interactionsRef.current=pe,Oe=au.__subscriberRef.current;try{var rt;try{Oe!==null&&Oe.onWorkStarted(pe,ze)}finally{try{rt=ge.apply(void 0,arguments)}finally{au.__interactionsRef.current=Ge,Oe!==null&&Oe.onWorkStopped(pe,ze)}}return rt}finally{le||(le=!0,pe.forEach(function(wt){wt.__count--,Oe!==null&&wt.__count===0&&Oe.onInteractionScheduledWorkCompleted(wt)}))}}return Ue.cancel=function(){Oe=au.__subscriberRef.current;try{Oe!==null&&Oe.onWorkCanceled(pe,ze)}finally{pe.forEach(function(rt){rt.__count--,Oe&&rt.__count===0&&Oe.onInteractionScheduledWorkCompleted(rt)})}},Ue}var C=null;i&&(C=new Set);function U(ge){i&&(C.add(ge),C.size===1&&(au.__subscriberRef.current={onInteractionScheduledWorkCompleted:ne,onInteractionTraced:W,onWorkCanceled:he,onWorkScheduled:m,onWorkStarted:we,onWorkStopped:Se}))}function q(ge){i&&(C.delete(ge),C.size===0&&(au.__subscriberRef.current=null))}function W(ge){var ze=!1,pe=null;if(C.forEach(function(Oe){try{Oe.onInteractionTraced(ge)}catch(le){ze||(ze=!0,pe=le)}}),ze)throw pe}function ne(ge){var ze=!1,pe=null;if(C.forEach(function(Oe){try{Oe.onInteractionScheduledWorkCompleted(ge)}catch(le){ze||(ze=!0,pe=le)}}),ze)throw pe}function m(ge,ze){var pe=!1,Oe=null;if(C.forEach(function(le){try{le.onWorkScheduled(ge,ze)}catch(Ue){pe||(pe=!0,Oe=Ue)}}),pe)throw Oe}function we(ge,ze){var pe=!1,Oe=null;if(C.forEach(function(le){try{le.onWorkStarted(ge,ze)}catch(Ue){pe||(pe=!0,Oe=Ue)}}),pe)throw Oe}function Se(ge,ze){var pe=!1,Oe=null;if(C.forEach(function(le){try{le.onWorkStopped(ge,ze)}catch(Ue){pe||(pe=!0,Oe=Ue)}}),pe)throw Oe}function he(ge,ze){var pe=!1,Oe=null;if(C.forEach(function(le){try{le.onWorkCanceled(ge,ze)}catch(Ue){pe||(pe=!0,Oe=Ue)}}),pe)throw Oe}au.unstable_clear=E,au.unstable_getCurrent=t,au.unstable_getThreadID=k,au.unstable_trace=L,au.unstable_wrap=N,au.unstable_subscribe=U,au.unstable_unsubscribe=q}()});var _9=ce((Une,fw)=>{"use strict";process.env.NODE_ENV==="production"?fw.exports=y9():fw.exports=g9()});var E9=ce((jne,hg)=>{"use strict";process.env.NODE_ENV!=="production"&&(hg.exports=function i(o){"use strict";var f=eg(),p=su(),E=HD(),t=h4(),k=_9(),L=0,N=1,C=2,U=3,q=4,W=5,ne=6,m=7,we=8,Se=9,he=10,ge=11,ze=12,pe=13,Oe=14,le=15,Ue=16,Ge=17,rt=18,wt=19,xt=20,$e=21,ft=function(){};ft=function(a,c){for(var _=arguments.length,T=new Array(_>2?_-2:0),R=2;R<_;R++)T[R-2]=arguments[R];if(c===void 0)throw new Error("`warningWithoutStack(condition, format, ...args)` requires a warning message argument");if(T.length>8)throw new Error("warningWithoutStack() currently supports at most 8 arguments.");if(!a){if(typeof console!="undefined"){var j=T.map(function(oe){return""+oe});j.unshift("Warning: "+c),Function.prototype.apply.call(console.error,console,j)}try{var V=0,te="Warning: "+c.replace(/%s/g,function(){return T[V++]});throw new Error(te)}catch(oe){}}};var Ke=ft;function jt(a){return a._reactInternalFiber}function $t(a,c){a._reactInternalFiber=c}var at=p.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;at.hasOwnProperty("ReactCurrentDispatcher")||(at.ReactCurrentDispatcher={current:null}),at.hasOwnProperty("ReactCurrentBatchConfig")||(at.ReactCurrentBatchConfig={suspense:null});var Q=typeof Symbol=="function"&&Symbol.for,ae=Q?Symbol.for("react.element"):60103,Ce=Q?Symbol.for("react.portal"):60106,ue=Q?Symbol.for("react.fragment"):60107,je=Q?Symbol.for("react.strict_mode"):60108,ct=Q?Symbol.for("react.profiler"):60114,At=Q?Symbol.for("react.provider"):60109,en=Q?Symbol.for("react.context"):60110,ln=Q?Symbol.for("react.concurrent_mode"):60111,An=Q?Symbol.for("react.forward_ref"):60112,nr=Q?Symbol.for("react.suspense"):60113,un=Q?Symbol.for("react.suspense_list"):60120,Wt=Q?Symbol.for("react.memo"):60115,vr=Q?Symbol.for("react.lazy"):60116,w=Q?Symbol.for("react.fundamental"):60117,Ut=Q?Symbol.for("react.responder"):60118,Vn=Q?Symbol.for("react.scope"):60119,fr=typeof Symbol=="function"&&Symbol.iterator,Fr="@@iterator";function ur(a){if(a===null||typeof a!="object")return null;var c=fr&&a[fr]||a[Fr];return typeof c=="function"?c:null}var br=Ke;br=function(a,c){if(!a){for(var _=at.ReactDebugCurrentFrame,T=_.getStackAddendum(),R=arguments.length,j=new Array(R>2?R-2:0),V=2;V import('./MyComponent'))`,T),a._status=So,a._result=R}},function(T){a._status===a0&&(a._status=Go,a._result=T)})}}function Ko(a,c,_){var T=c.displayName||c.name||"";return a.displayName||(T!==""?_+"("+T+")":_)}function qt(a){if(a==null)return null;if(typeof a.tag=="number"&&Ke(!1,"Received an unexpected object in getComponentName(). This is likely a bug in React. Please file an issue."),typeof a=="function")return a.displayName||a.name||null;if(typeof a=="string")return a;switch(a){case ue:return"Fragment";case Ce:return"Portal";case ct:return"Profiler";case je:return"StrictMode";case nr:return"Suspense";case un:return"SuspenseList"}if(typeof a=="object")switch(a.$$typeof){case en:return"Context.Consumer";case At:return"Context.Provider";case An:return Ko(a,a.render,"ForwardRef");case Wt:return qt(a.type);case vr:{var c=a,_=Os(c);if(_)return qt(_);break}}return null}var _i=0,eu=1,ai=2,mr=4,Xo=6,W0=8,Lu=16,V0=32,Hr=64,To=128,Co=256,L0=512,tu=1024,Si=1028,ks=932,Hl=2047,F0=2048,f0=4096,Pr=!0,Ei=!0,G0=!0,fi=!0,Zt=!0,Ln=!0,Di=!1,ci=!1,Ht=!1,Du=!1,Yi=!1,Y0=!0,Ui=!1,Wl=!1,xo=!1,ni=!1,oo=!1,Vl=at.ReactCurrentOwner;function Ao(a){var c=a,_=a;if(a.alternate)for(;c.return;)c=c.return;else{var T=c;do c=T,(c.effectTag&(ai|tu))!==_i&&(_=c.return),T=c.return;while(T)}return c.tag===U?_:null}function Ms(a){return Ao(a)===a}function Xn(a){{var c=Vl.current;if(c!==null&&c.tag===N){var _=c,T=_.stateNode;T._warnedAboutRefsInRender||Ke(!1,"%s is accessing isMounted inside its render() function. render() should be a pure function of props and state. It should never access something that requires stale data from the previous render, such as refs. Move this logic to componentDidMount and componentDidUpdate instead.",qt(_.type)||"A component"),T._warnedAboutRefsInRender=!0}}var R=jt(a);return R?Ao(R)===R:!1}function Qo(a){if(Ao(a)!==a)throw Error("Unable to find node on an unmounted component.")}function lo(a){var c=a.alternate;if(!c){var _=Ao(a);if(_===null)throw Error("Unable to find node on an unmounted component.");return _!==a?null:a}for(var T=a,R=c;;){var j=T.return;if(j===null)break;var V=j.alternate;if(V===null){var te=j.return;if(te!==null){T=R=te;continue}break}if(j.child===V.child){for(var oe=j.child;oe;){if(oe===T)return Qo(j),a;if(oe===R)return Qo(j),c;oe=oe.sibling}throw Error("Unable to find node on an unmounted component.")}if(T.return!==R.return)T=j,R=V;else{for(var Ie=!1,Ye=j.child;Ye;){if(Ye===T){Ie=!0,T=j,R=V;break}if(Ye===R){Ie=!0,R=j,T=V;break}Ye=Ye.sibling}if(!Ie){for(Ye=V.child;Ye;){if(Ye===T){Ie=!0,T=V,R=j;break}if(Ye===R){Ie=!0,R=V,T=j;break}Ye=Ye.sibling}if(!Ie)throw Error("Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue.")}}if(T.alternate!==R)throw Error("Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue.")}if(T.tag!==U)throw Error("Unable to find node on an unmounted component.");return T.stateNode.current===T?a:c}function b0(a){var c=lo(a);if(!c)return null;for(var _=c;;){if(_.tag===W||_.tag===ne)return _;if(_.child){_.child.return=_,_=_.child;continue}if(_===c)return null;for(;!_.sibling;){if(!_.return||_.return===c)return null;_=_.return}_.sibling.return=_.return,_=_.sibling}return null}function yl(a){var c=lo(a);if(!c)return null;for(var _=c;;){if(_.tag===W||_.tag===ne||Ht&&_.tag===xt)return _;if(_.child&&_.tag!==q){_.child.return=_,_=_.child;continue}if(_===c)return null;for(;!_.sibling;){if(!_.return||_.return===c)return null;_=_.return}_.sibling.return=_.return,_=_.sibling}return null}var Ro=o.getPublicInstance,Et=o.getRootHostContext,Pt=o.getChildHostContext,Bn=o.prepareForCommit,Ir=o.resetAfterCommit,ji=o.createInstance,Wr=o.appendInitialChild,wu=o.finalizeInitialChildren,c0=o.prepareUpdate,Ti=o.shouldSetTextContent,d0=o.shouldDeprioritizeSubtree,as=o.createTextInstance,St=o.setTimeout,so=o.clearTimeout,Jo=o.noTimeout,Gl=o.now,Fu=o.isPrimaryRenderer,fs=o.warnsIfNotActing,P0=o.supportsMutation,X=o.supportsPersistence,_e=o.supportsHydration,Ne=o.mountResponderInstance,Me=o.unmountResponderInstance,dt=o.getFundamentalComponentInstance,Hn=o.mountFundamentalComponent,Dn=o.shouldUpdateFundamentalComponent,or=o.getInstanceFromNode,mi=o.appendChild,Su=o.appendChildToContainer,bu=o.commitTextUpdate,Pu=o.commitMount,mu=o.commitUpdate,yi=o.insertBefore,Oo=o.insertInContainerBefore,Tu=o.removeChild,ao=o.removeChildFromContainer,Iu=o.resetTextContent,Oa=o.hideInstance,p0=o.hideTextInstance,Zs=o.unhideInstance,K0=o.unhideTextInstance,$s=o.updateFundamentalComponent,ka=o.unmountFundamentalComponent,cs=o.cloneInstance,w0=o.createContainerChildSet,Gn=o.appendChildToContainerChildSet,ic=o.finalizeContainerChildren,ri=o.replaceContainerChildren,Gr=o.cloneHiddenInstance,Yl=o.cloneHiddenTextInstance,ea=o.cloneInstance,lf=o.canHydrateInstance,Ns=o.canHydrateTextInstance,Ma=o.canHydrateSuspenseInstance,Ls=o.isSuspenseInstancePending,h0=o.isSuspenseInstanceFallback,Fs=o.registerSuspenseInstanceRetry,Ni=o.getNextHydratableSibling,B=o.getFirstHydratableChild,z=o.hydrateInstance,G=o.hydrateTextInstance,$=o.hydrateSuspenseInstance,De=o.getNextHydratableInstanceAfterSuspenseInstance,me=o.commitHydratedContainer,xe=o.commitHydratedSuspenseInstance,Z=o.clearSuspenseBoundary,ke=o.clearSuspenseBoundaryFromContainer,Xe=o.didNotMatchHydratedContainerTextInstance,ht=o.didNotMatchHydratedTextInstance,ie=o.didNotHydrateContainerInstance,qe=o.didNotHydrateInstance,tt=o.didNotFindHydratableContainerInstance,Tt=o.didNotFindHydratableContainerTextInstance,kt=o.didNotFindHydratableContainerSuspenseInstance,bt=o.didNotFindHydratableInstance,on=o.didNotFindHydratableTextInstance,tn=o.didNotFindHydratableSuspenseInstance,Lt=/^(.*)[\\\/]/,gn=function(a,c,_){var T="";if(c){var R=c.fileName,j=R.replace(Lt,"");if(/^index\./.test(j)){var V=R.match(Lt);if(V){var te=V[1];if(te){var oe=te.replace(Lt,"");j=oe+"/"+j}}}T=" (at "+j+":"+c.lineNumber+")"}else _&&(T=" (created by "+_+")");return` + in `+(a||"Unknown")+T},lr=at.ReactDebugCurrentFrame;function Qn(a){switch(a.tag){case U:case q:case ne:case m:case he:case Se:return"";default:var c=a._debugOwner,_=a._debugSource,T=qt(a.type),R=null;return c&&(R=qt(c.type)),gn(T,_,R)}}function _r(a){var c="",_=a;do c+=Qn(_),_=_.return;while(_);return c}var Cn=null,Ar=null;function v0(){{if(Cn===null)return null;var a=Cn._debugOwner;if(a!==null&&typeof a!="undefined")return qt(a.type)}return null}function Rr(){return Cn===null?"":_r(Cn)}function nt(){lr.getCurrentStack=null,Cn=null,Ar=null}function _t(a){lr.getCurrentStack=Rr,Cn=a,Ar=null}function Ze(a){Ar=a}var Ft="\u269B",nn="\u26D4",sn=typeof performance!="undefined"&&typeof performance.mark=="function"&&typeof performance.clearMarks=="function"&&typeof performance.measure=="function"&&typeof performance.clearMeasures=="function",Yn=null,yr=null,nu=null,Cu=!1,S0=!1,X0=!1,xu=0,di=0,ko=new Set,Zo=function(a){return Ft+" "+a},sf=function(a,c){var _=c?nn+" ":Ft+" ",T=c?" Warning: "+c:"";return""+_+a+T},gl=function(a){performance.mark(Zo(a))},af=function(a){performance.clearMarks(Zo(a))},Mo=function(a,c,_){var T=Zo(c),R=sf(a,_);try{performance.measure(R,T)}catch(j){}performance.clearMarks(T),performance.clearMeasures(R)},ds=function(a,c){return a+" (#"+c+")"},bs=function(a,c,_){return _===null?a+" ["+(c?"update":"mount")+"]":a+"."+_},No=function(a,c){var _=qt(a.type)||"Unknown",T=a._debugID,R=a.alternate!==null,j=bs(_,R,c);if(Cu&&ko.has(j))return!1;ko.add(j);var V=ds(j,T);return gl(V),!0},Lo=function(a,c){var _=qt(a.type)||"Unknown",T=a._debugID,R=a.alternate!==null,j=bs(_,R,c),V=ds(j,T);af(V)},ps=function(a,c,_){var T=qt(a.type)||"Unknown",R=a._debugID,j=a.alternate!==null,V=bs(T,j,c),te=ds(V,R);Mo(V,te,_)},Vu=function(a){switch(a.tag){case U:case W:case ne:case q:case m:case he:case Se:case we:return!0;default:return!1}},yu=function(){yr!==null&&nu!==null&&Lo(nu,yr),nu=null,yr=null,X0=!1},pi=function(){for(var a=Yn;a;)a._debugIsCurrentlyTiming&&ps(a,null,null),a=a.return},T0=function(a){a.return!==null&&T0(a.return),a._debugIsCurrentlyTiming&&No(a,null)},Q0=function(){Yn!==null&&T0(Yn)};function Fo(){Pr&&di++}function ta(){Pr&&(Cu&&(S0=!0),yr!==null&&yr!=="componentWillMount"&&yr!=="componentWillReceiveProps"&&(X0=!0))}function Kl(a){if(Pr){if(!sn||Vu(a)||(Yn=a,!No(a,null)))return;a._debugIsCurrentlyTiming=!0}}function Ki(a){if(Pr){if(!sn||Vu(a))return;a._debugIsCurrentlyTiming=!1,Lo(a,null)}}function Yr(a){if(Pr){if(!sn||Vu(a)||(Yn=a.return,!a._debugIsCurrentlyTiming))return;a._debugIsCurrentlyTiming=!1,ps(a,null,null)}}function fo(a){if(Pr){if(!sn||Vu(a)||(Yn=a.return,!a._debugIsCurrentlyTiming))return;a._debugIsCurrentlyTiming=!1;var c=a.tag===pe?"Rendering was suspended":"An error was thrown inside this error boundary";ps(a,null,c)}}function Oi(a,c){if(Pr){if(!sn||(yu(),!No(a,c)))return;nu=a,yr=c}}function gi(){if(Pr){if(!sn)return;if(yr!==null&&nu!==null){var a=X0?"Scheduled a cascading update":null;ps(nu,yr,a)}yr=null,nu=null}}function ff(a){if(Pr){if(Yn=a,!sn)return;xu=0,gl("(React Tree Reconciliation)"),Q0()}}function cf(a,c){if(Pr){if(!sn)return;var _=null;if(a!==null)if(a.tag===U)_="A top-level update interrupted the previous render";else{var T=qt(a.type)||"Unknown";_="An update to "+T+" interrupted the previous render"}else xu>1&&(_="There were cascading updates");xu=0;var R=c?"(React Tree Reconciliation: Completed Root)":"(React Tree Reconciliation: Yielded)";pi(),Mo(R,"(React Tree Reconciliation)",_)}}function J0(){if(Pr){if(!sn)return;Cu=!0,S0=!1,ko.clear(),gl("(Committing Changes)")}}function Z0(){if(Pr){if(!sn)return;var a=null;S0?a="Lifecycle hook scheduled a cascading update":xu>0&&(a="Caused by a cascading update in earlier commit"),S0=!1,xu++,Cu=!1,ko.clear(),Mo("(Committing Changes)","(Committing Changes)",a)}}function Te(){if(Pr){if(!sn)return;di=0,gl("(Committing Snapshot Effects)")}}function et(){if(Pr){if(!sn)return;var a=di;di=0,Mo("(Committing Snapshot Effects: "+a+" Total)","(Committing Snapshot Effects)",null)}}function Ve(){if(Pr){if(!sn)return;di=0,gl("(Committing Host Effects)")}}function Gt(){if(Pr){if(!sn)return;var a=di;di=0,Mo("(Committing Host Effects: "+a+" Total)","(Committing Host Effects)",null)}}function Yt(){if(Pr){if(!sn)return;di=0,gl("(Calling Lifecycle Methods)")}}function sr(){if(Pr){if(!sn)return;var a=di;di=0,Mo("(Calling Lifecycle Methods: "+a+" Total)","(Calling Lifecycle Methods)",null)}}var Br=[],wn;wn=[];var fu=-1;function Gu(a){return{current:a}}function Kr(a,c){if(fu<0){Ke(!1,"Unexpected pop.");return}c!==wn[fu]&&Ke(!1,"Unexpected Fiber popped."),a.current=Br[fu],Br[fu]=null,wn[fu]=null,fu--}function Vr(a,c,_){fu++,Br[fu]=a.current,wn[fu]=_,a.current=c}var Bu;Bu={};var Sn={};Object.freeze(Sn);var C0=Gu(Sn),Au=Gu(!1),ei=Sn;function _l(a,c,_){return ni?Sn:_&&zi(c)?ei:C0.current}function Ps(a,c,_){if(!ni){var T=a.stateNode;T.__reactInternalMemoizedUnmaskedChildContext=c,T.__reactInternalMemoizedMaskedChildContext=_}}function Uu(a,c){if(ni)return Sn;var _=a.type,T=_.contextTypes;if(!T)return Sn;var R=a.stateNode;if(R&&R.__reactInternalMemoizedUnmaskedChildContext===c)return R.__reactInternalMemoizedMaskedChildContext;var j={};for(var V in T)j[V]=c[V];{var te=qt(_)||"Unknown";E(T,j,"context",te,Rr)}return R&&Ps(a,c,j),j}function na(){return ni?!1:Au.current}function zi(a){if(ni)return!1;var c=a.childContextTypes;return c!=null}function Is(a){ni||(Kr(Au,a),Kr(C0,a))}function x0(a){ni||(Kr(Au,a),Kr(C0,a))}function Li(a,c,_){if(!ni){if(C0.current!==Sn)throw Error("Unexpected context found on stack. This error is likely caused by a bug in React. Please file an issue.");Vr(C0,c,a),Vr(Au,_,a)}}function A0(a,c,_){if(ni)return _;var T=a.stateNode,R=c.childContextTypes;if(typeof T.getChildContext!="function"){{var j=qt(c)||"Unknown";Bu[j]||(Bu[j]=!0,Ke(!1,"%s.childContextTypes is specified but there is no getChildContext() method on the instance. You can either define getChildContext() on %s or remove childContextTypes from it.",j,j))}return _}var V;Ze("getChildContext"),Oi(a,"getChildContext"),V=T.getChildContext(),gi(),Ze(null);for(var te in V)if(!(te in R))throw Error((qt(c)||"Unknown")+'.getChildContext(): key "'+te+'" is not defined in childContextTypes.');{var oe=qt(c)||"Unknown";E(R,V,"child context",oe,Rr)}return f({},_,{},V)}function Fi(a){if(ni)return!1;var c=a.stateNode,_=c&&c.__reactInternalMemoizedMergedChildContext||Sn;return ei=C0.current,Vr(C0,_,a),Vr(Au,Au.current,a),!0}function $o(a,c,_){if(!ni){var T=a.stateNode;if(!T)throw Error("Expected to have an instance by this point. This error is likely caused by a bug in React. Please file an issue.");if(_){var R=A0(a,c,ei);T.__reactInternalMemoizedMergedChildContext=R,Kr(Au,a),Kr(C0,a),Vr(C0,R,a),Vr(Au,_,a)}else Kr(Au,a),Vr(Au,_,a)}}function El(a){if(ni)return Sn;if(!(Ms(a)&&a.tag===N))throw Error("Expected subtree parent to be a mounted class component. This error is likely caused by a bug in React. Please file an issue.");var c=a;do{switch(c.tag){case U:return c.stateNode.context;case N:{var _=c.type;if(zi(_))return c.stateNode.__reactInternalMemoizedMergedChildContext;break}}c=c.return}while(c!==null);throw Error("Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue.")}var I0=1,R0=2,co=t.unstable_runWithPriority,Ru=t.unstable_scheduleCallback,Yu=t.unstable_cancelCallback,Xl=t.unstable_shouldYield,hs=t.unstable_requestPaint,ra=t.unstable_now,df=t.unstable_getCurrentPriorityLevel,Ku=t.unstable_ImmediatePriority,vs=t.unstable_UserBlockingPriority,wr=t.unstable_NormalPriority,$0=t.unstable_LowPriority,Xi=t.unstable_IdlePriority;if(Ln&&!(k.__interactionsRef!=null&&k.__interactionsRef.current!=null))throw Error("It is not supported to run the profiling version of a renderer (for example, `react-dom/profiling`) without also replacing the `scheduler/tracing` module with `scheduler/tracing-profiling`. Your bundler might have a setting for aliasing both modules. Learn more at http://fb.me/react-profiling");var ru={},Ci=99,Xr=98,Wn=97,Xu=96,m0=95,y0=90,kn=Xl,se=hs!==void 0?hs:function(){},re=null,Le=null,Ae=!1,ot=ra(),vt=ot<1e4?ra:function(){return ra()-ot};function Xt(){switch(df()){case Ku:return Ci;case vs:return Xr;case wr:return Wn;case $0:return Xu;case Xi:return m0;default:throw Error("Unknown priority level.")}}function xn(a){switch(a){case Ci:return Ku;case Xr:return vs;case Wn:return wr;case Xu:return $0;case m0:return Xi;default:throw Error("Unknown priority level.")}}function _n(a,c){var _=xn(a);return co(_,c)}function yn(a,c,_){var T=xn(a);return Ru(T,c,_)}function En(a){return re===null?(re=[a],Le=Ru(Ku,xi)):re.push(a),ru}function er(a){a!==ru&&Yu(a)}function It(){if(Le!==null){var a=Le;Le=null,Yu(a)}xi()}function xi(){if(!Ae&&re!==null){Ae=!0;var a=0;try{var c=!0,_=re;_n(Ci,function(){for(;a<_.length;a++){var T=_[a];do T=T(c);while(T!==null)}}),re=null}catch(T){throw re!==null&&(re=re.slice(a+1)),Ru(Ku,It),T}finally{Ae=!1}}}var Sr=0,cr=1,Y=2,Qr=4,Jr=8,Ur=1073741823,lt=0,hi=1,Qi=2,g0=3,bn=Ur,Qu=bn-1,eo=10,po=Qu-1;function Ju(a){return po-(a/eo|0)}function bo(a){return(po-a)*eo}function to(a,c){return((a/c|0)+1)*c}function Na(a,c,_){return po-to(po-a+c/eo,_/eo)}var pf=5e3,uc=250;function ms(a){return Na(a,pf,uc)}function ia(a,c){return Na(a,c,uc)}var B0=500,oc=100;function La(a){return Na(a,B0,oc)}function gd(a){return g0++}function $1(a,c){if(c===bn)return Ci;if(c===hi||c===Qi)return m0;var _=bo(c)-bo(a);return _<=0?Ci:_<=B0+oc?Xr:_<=pf+uc?Wn:m0}function e2(a,c){return a===c&&(a!==0||1/a==1/c)||a!==a&&c!==c}var ho=typeof Object.is=="function"?Object.is:e2,Uc=Object.prototype.hasOwnProperty;function Dl(a,c){if(ho(a,c))return!0;if(typeof a!="object"||a===null||typeof c!="object"||c===null)return!1;var _=Object.keys(a),T=Object.keys(c);if(_.length!==T.length)return!1;for(var R=0;R<_.length;R++)if(!Uc.call(c,_[R])||!ho(a[_[R]],c[_[R]]))return!1;return!0}var el=function(){};{var _d=function(a){for(var c=arguments.length,_=new Array(c>1?c-1:0),T=1;T2?_-2:0),R=2;R<_;R++)T[R-2]=arguments[R];_d.apply(void 0,[c].concat(T))}}}var Bs=el,wl={recordUnsafeLifecycleWarnings:function(a,c){},flushPendingUnsafeLifecycleWarnings:function(){},recordLegacyContextWarning:function(a,c){},flushLegacyContextWarning:function(){},discardPendingWarnings:function(){}};{var t2=function(a){for(var c=null,_=a;_!==null;)_.mode&cr&&(c=_),_=_.return;return c},Po=function(a){var c=[];return a.forEach(function(_){c.push(_)}),c.sort().join(", ")},Fa=[],ba=[],Pa=[],ua=[],ys=[],gs=[],Ql=new Set;wl.recordUnsafeLifecycleWarnings=function(a,c){Ql.has(a.type)||(typeof c.componentWillMount=="function"&&c.componentWillMount.__suppressDeprecationWarning!==!0&&Fa.push(a),a.mode&cr&&typeof c.UNSAFE_componentWillMount=="function"&&ba.push(a),typeof c.componentWillReceiveProps=="function"&&c.componentWillReceiveProps.__suppressDeprecationWarning!==!0&&Pa.push(a),a.mode&cr&&typeof c.UNSAFE_componentWillReceiveProps=="function"&&ua.push(a),typeof c.componentWillUpdate=="function"&&c.componentWillUpdate.__suppressDeprecationWarning!==!0&&ys.push(a),a.mode&cr&&typeof c.UNSAFE_componentWillUpdate=="function"&&gs.push(a))},wl.flushPendingUnsafeLifecycleWarnings=function(){var a=new Set;Fa.length>0&&(Fa.forEach(function(Nt){a.add(qt(Nt.type)||"Component"),Ql.add(Nt.type)}),Fa=[]);var c=new Set;ba.length>0&&(ba.forEach(function(Nt){c.add(qt(Nt.type)||"Component"),Ql.add(Nt.type)}),ba=[]);var _=new Set;Pa.length>0&&(Pa.forEach(function(Nt){_.add(qt(Nt.type)||"Component"),Ql.add(Nt.type)}),Pa=[]);var T=new Set;ua.length>0&&(ua.forEach(function(Nt){T.add(qt(Nt.type)||"Component"),Ql.add(Nt.type)}),ua=[]);var R=new Set;ys.length>0&&(ys.forEach(function(Nt){R.add(qt(Nt.type)||"Component"),Ql.add(Nt.type)}),ys=[]);var j=new Set;if(gs.length>0&&(gs.forEach(function(Nt){j.add(qt(Nt.type)||"Component"),Ql.add(Nt.type)}),gs=[]),c.size>0){var V=Po(c);Ke(!1,`Using UNSAFE_componentWillMount in strict mode is not recommended and may indicate bugs in your code. See https://fb.me/react-unsafe-component-lifecycles for details. + +* Move code with side effects to componentDidMount, and set initial state in the constructor. + +Please update the following components: %s`,V)}if(T.size>0){var te=Po(T);Ke(!1,`Using UNSAFE_componentWillReceiveProps in strict mode is not recommended and may indicate bugs in your code. See https://fb.me/react-unsafe-component-lifecycles for details. + +* Move data fetching code or side effects to componentDidUpdate. +* If you're updating state whenever props change, refactor your code to use memoization techniques or move it to static getDerivedStateFromProps. Learn more at: https://fb.me/react-derived-state + +Please update the following components: %s`,te)}if(j.size>0){var oe=Po(j);Ke(!1,`Using UNSAFE_componentWillUpdate in strict mode is not recommended and may indicate bugs in your code. See https://fb.me/react-unsafe-component-lifecycles for details. + +* Move data fetching code or side effects to componentDidUpdate. + +Please update the following components: %s`,oe)}if(a.size>0){var Ie=Po(a);Bs(!1,`componentWillMount has been renamed, and is not recommended for use. See https://fb.me/react-unsafe-component-lifecycles for details. + +* Move code with side effects to componentDidMount, and set initial state in the constructor. +* Rename componentWillMount to UNSAFE_componentWillMount to suppress this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. To rename all deprecated lifecycles to their new names, you can run \`npx react-codemod rename-unsafe-lifecycles\` in your project source folder. + +Please update the following components: %s`,Ie)}if(_.size>0){var Ye=Po(_);Bs(!1,`componentWillReceiveProps has been renamed, and is not recommended for use. See https://fb.me/react-unsafe-component-lifecycles for details. + +* Move data fetching code or side effects to componentDidUpdate. +* If you're updating state whenever props change, refactor your code to use memoization techniques or move it to static getDerivedStateFromProps. Learn more at: https://fb.me/react-derived-state +* Rename componentWillReceiveProps to UNSAFE_componentWillReceiveProps to suppress this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. To rename all deprecated lifecycles to their new names, you can run \`npx react-codemod rename-unsafe-lifecycles\` in your project source folder. + +Please update the following components: %s`,Ye)}if(R.size>0){var pt=Po(R);Bs(!1,`componentWillUpdate has been renamed, and is not recommended for use. See https://fb.me/react-unsafe-component-lifecycles for details. + +* Move data fetching code or side effects to componentDidUpdate. +* Rename componentWillUpdate to UNSAFE_componentWillUpdate to suppress this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. To rename all deprecated lifecycles to their new names, you can run \`npx react-codemod rename-unsafe-lifecycles\` in your project source folder. + +Please update the following components: %s`,pt)}};var Io=new Map,hf=new Set;wl.recordLegacyContextWarning=function(a,c){var _=t2(a);if(_===null){Ke(!1,"Expected to find a StrictMode component in a strict mode tree. This error is likely caused by a bug in React. Please file an issue.");return}if(!hf.has(a.type)){var T=Io.get(_);(a.type.contextTypes!=null||a.type.childContextTypes!=null||c!==null&&typeof c.getChildContext=="function")&&(T===void 0&&(T=[],Io.set(_,T)),T.push(a))}},wl.flushLegacyContextWarning=function(){Io.forEach(function(a,c){var _=new Set;a.forEach(function(j){_.add(qt(j.type)||"Component"),hf.add(j.type)});var T=Po(_),R=_r(c);Ke(!1,`Legacy context API has been detected within a strict-mode tree. + +The old API will be supported in all 16.x releases, but applications using it should migrate to the new version. + +Please update the following components: %s + +Learn more about this warning here: https://fb.me/react-legacy-context%s`,T,R)})},wl.discardPendingWarnings=function(){Fa=[],ba=[],Pa=[],ua=[],ys=[],gs=[],Io=new Map}}var tl=null,ju=null,Ia=function(a){tl=a};function Zu(a){{if(tl===null)return a;var c=tl(a);return c===void 0?a:c.current}}function U0(a){return Zu(a)}function vf(a){{if(tl===null)return a;var c=tl(a);if(c===void 0){if(a!=null&&typeof a.render=="function"){var _=Zu(a.render);if(a.render!==_){var T={$$typeof:An,render:_};return a.displayName!==void 0&&(T.displayName=a.displayName),T}}return a}return c.current}}function jc(a,c){{if(tl===null)return!1;var _=a.elementType,T=c.type,R=!1,j=typeof T=="object"&&T!==null?T.$$typeof:null;switch(a.tag){case N:{typeof T=="function"&&(R=!0);break}case L:{(typeof T=="function"||j===vr)&&(R=!0);break}case ge:{(j===An||j===vr)&&(R=!0);break}case Oe:case le:{(j===Wt||j===vr)&&(R=!0);break}default:return!1}if(R){var V=tl(_);if(V!==void 0&&V===tl(T))return!0}return!1}}function lc(a){{if(tl===null||typeof WeakSet!="function")return;ju===null&&(ju=new WeakSet),ju.add(a)}}var Sl=function(a,c){{if(tl===null)return;var _=c.staleFamilies,T=c.updatedFamilies;Xa(),xp(function(){oa(a.current,T,_)})}},_s=function(a,c){{if(a.context!==Sn)return;Xa(),fv(function(){l_(c,a,null,null)})}};function oa(a,c,_){{var T=a.alternate,R=a.child,j=a.sibling,V=a.tag,te=a.type,oe=null;switch(V){case L:case le:case N:oe=te;break;case ge:oe=te.render;break;default:break}if(tl===null)throw new Error("Expected resolveFamily to be set during hot reload.");var Ie=!1,Ye=!1;if(oe!==null){var pt=tl(oe);pt!==void 0&&(_.has(pt)?Ye=!0:c.has(pt)&&(V===N?Ye=!0:Ie=!0))}ju!==null&&(ju.has(a)||T!==null&&ju.has(T))&&(Ye=!0),Ye&&(a._debugNeedsRemount=!0),(Ye||Ie)&&dl(a,bn),R!==null&&!Ye&&oa(R,c,_),j!==null&&oa(j,c,_)}}var n2=function(a,c){{var _=new Set,T=new Set(c.map(function(R){return R.current}));return la(a.current,T,_),_}};function la(a,c,_){{var T=a.child,R=a.sibling,j=a.tag,V=a.type,te=null;switch(j){case L:case le:case N:te=V;break;case ge:te=V.render;break;default:break}var oe=!1;te!==null&&c.has(te)&&(oe=!0),oe?sc(a,_):T!==null&&la(T,c,_),R!==null&&la(R,c,_)}}function sc(a,c){{var _=zc(a,c);if(_)return;for(var T=a;;){switch(T.tag){case W:c.add(T.stateNode);return;case q:c.add(T.stateNode.containerInfo);return;case U:c.add(T.stateNode.containerInfo);return}if(T.return===null)throw new Error("Expected to reach root first.");T=T.return}}}function zc(a,c){for(var _=a,T=!1;;){if(_.tag===W)T=!0,c.add(_.stateNode);else if(_.child!==null){_.child.return=_,_=_.child;continue}if(_===a)return T;for(;_.sibling===null;){if(_.return===null||_.return===a)return T;_=_.return}_.sibling.return=_.return,_=_.sibling}return!1}function bi(a,c){if(a&&a.defaultProps){var _=f({},c),T=a.defaultProps;for(var R in T)_[R]===void 0&&(_[R]=T[R]);return _}return c}function g(a){if(Yo(a),a._status!==So)throw a._result;return a._result}var y=Gu(null),A;A={};var F=null,I=null,J=null,fe=!1;function mt(){F=null,I=null,J=null,fe=!1}function Ct(){fe=!0}function Mt(){fe=!1}function Er(a,c){var _=a.type._context;Fu?(Vr(y,_._currentValue,a),_._currentValue=c,_._currentRenderer===void 0||_._currentRenderer===null||_._currentRenderer===A||Ke(!1,"Detected multiple renderers concurrently rendering the same context provider. This is currently unsupported."),_._currentRenderer=A):(Vr(y,_._currentValue2,a),_._currentValue2=c,_._currentRenderer2===void 0||_._currentRenderer2===null||_._currentRenderer2===A||Ke(!1,"Detected multiple renderers concurrently rendering the same context provider. This is currently unsupported."),_._currentRenderer2=A)}function $u(a){var c=y.current;Kr(y,a);var _=a.type._context;Fu?_._currentValue=c:_._currentValue2=c}function iu(a,c,_){if(ho(_,c))return 0;var T=typeof a._calculateChangedBits=="function"?a._calculateChangedBits(_,c):Ur;return(T&Ur)!==T&&Kt(!1,"calculateChangedBits: Expected the return value to be a 31-bit integer. Instead received: %s",T),T|0}function j0(a,c){for(var _=a;_!==null;){var T=_.alternate;if(_.childExpirationTime=c&&up(),_.firstContext=null)}}function He(a,c){if(fe&&Kt(!1,"Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo()."),J!==a){if(!(c===!1||c===0)){var _;typeof c!="number"||c===Ur?(J=a,_=Ur):_=c;var T={context:a,observedBits:_,next:null};if(I===null){if(F===null)throw Error("Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo().");I=T,F.dependencies={expirationTime:lt,firstContext:T,responders:null}}else I=I.next=T}}return Fu?a._currentValue:a._currentValue2}var Be=0,ut=1,Jt=2,jn=3,ti=!1,tr,ii;tr=!1,ii=null;function qi(a){var c={baseState:a,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null};return c}function jr(a){var c={baseState:a.baseState,firstUpdate:a.firstUpdate,lastUpdate:a.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null};return c}function gu(a,c){var _={expirationTime:a,suspenseConfig:c,tag:Be,payload:null,callback:null,next:null,nextEffect:null};return _.priority=Xt(),_}function Ba(a,c){a.lastUpdate===null?a.firstUpdate=a.lastUpdate=c:(a.lastUpdate.next=c,a.lastUpdate=c)}function Ua(a,c){var _=a.alternate,T,R;_===null?(T=a.updateQueue,R=null,T===null&&(T=a.updateQueue=qi(a.memoizedState))):(T=a.updateQueue,R=_.updateQueue,T===null?R===null?(T=a.updateQueue=qi(a.memoizedState),R=_.updateQueue=qi(_.memoizedState)):T=a.updateQueue=jr(R):R===null&&(R=_.updateQueue=jr(T))),R===null||T===R?Ba(T,c):T.lastUpdate===null||R.lastUpdate===null?(Ba(T,c),Ba(R,c)):(Ba(T,c),R.lastUpdate=c),a.tag===N&&(ii===T||R!==null&&ii===R)&&!tr&&(Ke(!1,"An update (setState, replaceState, or forceUpdate) was scheduled from inside an update function. Update functions should be pure, with zero side-effects. Consider using componentDidUpdate or a callback."),tr=!0)}function r2(a,c){var _=a.updateQueue;_===null?_=a.updateQueue=qi(a.memoizedState):_=Ed(a,_),_.lastCapturedUpdate===null?_.firstCapturedUpdate=_.lastCapturedUpdate=c:(_.lastCapturedUpdate.next=c,_.lastCapturedUpdate=c)}function Ed(a,c){var _=a.alternate;return _!==null&&c===_.updateQueue&&(c=a.updateQueue=jr(c)),c}function Dd(a,c,_,T,R,j){switch(_.tag){case ut:{var V=_.payload;if(typeof V=="function"){Ct(),Ei&&a.mode&cr&&V.call(j,T,R);var te=V.call(j,T,R);return Mt(),te}return V}case jn:a.effectTag=a.effectTag&~f0|Hr;case Be:{var oe=_.payload,Ie;return typeof oe=="function"?(Ct(),Ei&&a.mode&cr&&oe.call(j,T,R),Ie=oe.call(j,T,R),Mt()):Ie=oe,Ie==null?T:f({},T,Ie)}case Jt:return ti=!0,T}return T}function mf(a,c,_,T,R){ti=!1,c=Ed(a,c),ii=c;for(var j=c.baseState,V=null,te=lt,oe=c.firstUpdate,Ie=j;oe!==null;){var Ye=oe.expirationTime;if(Ye from render. Or maybe you meant to call this function rather than return it."))}function yh(a){function c(it,Ot){if(!!a){var Je=it.lastEffect;Je!==null?(Je.nextEffect=Ot,it.lastEffect=Ot):it.firstEffect=it.lastEffect=Ot,Ot.nextEffect=null,Ot.effectTag=W0}}function _(it,Ot){if(!a)return null;for(var Je=Ot;Je!==null;)c(it,Je),Je=Je.sibling;return null}function T(it,Ot){for(var Je=new Map,Bt=Ot;Bt!==null;)Bt.key!==null?Je.set(Bt.key,Bt):Je.set(Bt.index,Bt),Bt=Bt.sibling;return Je}function R(it,Ot,Je){var Bt=wo(it,Ot,Je);return Bt.index=0,Bt.sibling=null,Bt}function j(it,Ot,Je){if(it.index=Je,!a)return Ot;var Bt=it.alternate;if(Bt!==null){var Mn=Bt.index;return Mnqr?(_u=ar,ar=null):_u=ar.sibling;var _0=Nt(it,ar,Je[qr],Bt);if(_0===null){ar===null&&(ar=_u);break}a&&ar&&_0.alternate===null&&c(it,ar),ou=j(_0,ou,qr),qu===null?oi=_0:qu.sibling=_0,qu=_0,ar=_u}if(qr===Je.length)return _(it,ar),oi;if(ar===null){for(;qrH0?(Cs=_u,_u=null):Cs=_u.sibling;var pl=Nt(it,_u,Hu.value,Bt);if(pl===null){_u===null&&(_u=Cs);break}a&&_u&&pl.alternate===null&&c(it,_u),_0=j(pl,_0,H0),qr===null?ou=pl:qr.sibling=pl,qr=pl,_u=Cs}if(Hu.done)return _(it,_u),ou;if(_u===null){for(;!Hu.done;H0++,Hu=ar.next()){var Ja=pt(it,Hu.value,Bt);Ja!==null&&(_0=j(Ja,_0,H0),qr===null?ou=Ja:qr.sibling=Ja,qr=Ja)}return ou}for(var jo=T(it,_u);!Hu.done;H0++,Hu=ar.next()){var xs=Vt(jo,it,H0,Hu.value,Bt);xs!==null&&(a&&xs.alternate!==null&&jo.delete(xs.key===null?H0:xs.key),_0=j(xs,_0,H0),qr===null?ou=xs:qr.sibling=xs,qr=xs)}return a&&jo.forEach(function(X2){return c(it,X2)}),ou}function $r(it,Ot,Je,Bt){if(Ot!==null&&Ot.tag===ne){_(it,Ot.sibling);var Mn=R(Ot,Je,Bt);return Mn.return=it,Mn}_(it,Ot);var pn=Cy(Je,it.mode,Bt);return pn.return=it,pn}function wi(it,Ot,Je,Bt){for(var Mn=Je.key,pn=Ot;pn!==null;){if(pn.key===Mn)if(pn.tag===m?Je.type===ue:pn.elementType===Je.type||jc(pn,Je)){_(it,pn.sibling);var Pi=R(pn,Je.type===ue?Je.props.children:Je.props,Bt);return Pi.ref=fc(it,pn,Je),Pi.return=it,Pi._debugSource=Je._source,Pi._debugOwner=Je._owner,Pi}else{_(it,pn);break}else c(it,pn);pn=pn.sibling}if(Je.type===ue){var oi=Qa(Je.props.children,it.mode,Bt,Je.key);return oi.return=it,oi}else{var qu=Ty(Je,it.mode,Bt);return qu.ref=fc(it,Ot,Je),qu.return=it,qu}}function N0(it,Ot,Je,Bt){for(var Mn=Je.key,pn=Ot;pn!==null;){if(pn.key===Mn)if(pn.tag===q&&pn.stateNode.containerInfo===Je.containerInfo&&pn.stateNode.implementation===Je.implementation){_(it,pn.sibling);var Pi=R(pn,Je.children||[],Bt);return Pi.return=it,Pi}else{_(it,pn);break}else c(it,pn);pn=pn.sibling}var oi=xy(Je,it.mode,Bt);return oi.return=it,oi}function Vi(it,Ot,Je,Bt){var Mn=typeof Je=="object"&&Je!==null&&Je.type===ue&&Je.key===null;Mn&&(Je=Je.props.children);var pn=typeof Je=="object"&&Je!==null;if(pn)switch(Je.$$typeof){case ae:return V(wi(it,Ot,Je,Bt));case Ce:return V(N0(it,Ot,Je,Bt))}if(typeof Je=="string"||typeof Je=="number")return V($r(it,Ot,""+Je,Bt));if(Kc(Je))return vn(it,Ot,Je,Bt);if(ur(Je))return xr(it,Ot,Je,Bt);if(pn&&cc(it,Je),typeof Je=="function"&&f2(),typeof Je=="undefined"&&!Mn)switch(it.tag){case N:{var Pi=it.stateNode;if(Pi.render._isMockFunction)break}case L:{var oi=it.type;throw Error((oi.displayName||oi.name||"Component")+"(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null.")}}return _(it,Ot)}return Vi}var gf=yh(!0),Xc=yh(!1);function gh(a,c){if(!(a===null||c.child===a.child))throw Error("Resuming work not yet implemented.");if(c.child!==null){var _=c.child,T=wo(_,_.pendingProps,_.expirationTime);for(c.child=T,T.return=c;_.sibling!==null;)_=_.sibling,T=T.sibling=wo(_,_.pendingProps,_.expirationTime),T.return=c;T.sibling=null}}function vm(a,c){for(var _=a.child;_!==null;)Rv(_,c),_=_.sibling}var js={},fa=Gu(js),Ji=Gu(js),O0=Gu(js);function t0(a){if(a===js)throw Error("Expected host context to exist. This error is likely caused by a bug in React. Please file an issue.");return a}function Jl(){var a=t0(O0.current);return a}function za(a,c){Vr(O0,c,a),Vr(Ji,a,a),Vr(fa,js,a);var _=Et(c);Kr(fa,a),Vr(fa,_,a)}function no(a){Kr(fa,a),Kr(Ji,a),Kr(O0,a)}function ul(){var a=t0(fa.current);return a}function dc(a){var c=t0(O0.current),_=t0(fa.current),T=Pt(_,a.type,c);_!==T&&(Vr(Ji,a,a),Vr(fa,T,a))}function Od(a){Ji.current===a&&(Kr(fa,a),Kr(Ji,a))}var _h=0,_f=1,Ef=1,Qc=2,xl=Gu(_h);function Jc(a,c){return(a&c)!=0}function ca(a){return a&_f}function c2(a,c){return a&_f|c}function d2(a,c){return a|c}function Or(a,c){Vr(xl,c,a)}function da(a){Kr(xl,a)}function kd(a,c){var _=a.memoizedState;if(_!==null)return _.dehydrated!==null;var T=a.memoizedProps;return T.fallback===void 0?!1:T.unstable_avoidThisFallback!==!0?!0:!c}function Zc(a){for(var c=a;c!==null;){if(c.tag===pe){var _=c.memoizedState;if(_!==null){var T=_.dehydrated;if(T===null||Ls(T)||h0(T))return c}}else if(c.tag===wt&&c.memoizedProps.revealOrder!==void 0){var R=(c.effectTag&Hr)!==_i;if(R)return c}else if(c.child!==null){c.child.return=c,c=c.child;continue}if(c===a)return null;for(;c.sibling===null;){if(c.return===null||c.return===a)return null;c=c.return}c.sibling.return=c.return,c=c.sibling}return null}var p2={},vi=Array.isArray;function Md(a,c,_,T){return{fiber:T,props:c,responder:a,rootEventTypes:null,state:_}}function mm(a,c,_,T,R){var j=p2,V=a.getInitialState;V!==null&&(j=V(c));var te=Md(a,c,j,_);if(!R)for(var oe=_;oe!==null;){var Ie=oe.tag;if(Ie===W){R=oe.stateNode;break}else if(Ie===U){R=oe.stateNode.containerInfo;break}oe=oe.return}Ne(a,te,c,j,R),T.set(a,te)}function h2(a,c,_,T,R){var j,V;if(a&&(j=a.responder,V=a.props),!(j&&j.$$typeof===Ut))throw Error("An invalid value was used as an event listener. Expect one or many event listeners created via React.unstable_useResponder().");var te=V;if(_.has(j)){Kt(!1,'Duplicate event responder "%s" found in event listeners. Event listeners passed to elements cannot use the same event responder more than once.',j.displayName);return}_.add(j);var oe=T.get(j);oe===void 0?mm(j,te,c,T,R):(oe.props=te,oe.fiber=c)}function dn(a,c,_){var T=new Set,R=c.dependencies;if(a!=null){R===null&&(R=c.dependencies={expirationTime:lt,firstContext:null,responders:new Map});var j=R.responders;if(j===null&&(j=new Map),vi(a))for(var V=0,te=a.length;V0){var j=R.dispatch;if(Es!==null){var V=Es.get(R);if(V!==void 0){Es.delete(R);var te=T.memoizedState,oe=V;do{var Ie=oe.action;te=a(te,Ie),oe=oe.next}while(oe!==null);return ho(te,T.memoizedState)||up(),T.memoizedState=te,T.baseUpdate===R.last&&(T.baseState=te),R.lastRenderedState=te,[te,j]}}return[T.memoizedState,j]}var Ye=R.last,pt=T.baseUpdate,Nt=T.baseState,Vt;if(pt!==null?(Ye!==null&&(Ye.next=null),Vt=pt.next):Vt=Ye!==null?Ye.next:null,Vt!==null){var zt=Nt,vn=null,xr=null,$r=pt,wi=Vt,N0=!1;do{var Vi=wi.expirationTime;if(ViOu&&(Ou=Vi,G2(Ou));else if(vv(Vi,wi.suspenseConfig),wi.eagerReducer===a)zt=wi.eagerState;else{var it=wi.action;zt=a(zt,it)}$r=wi,wi=wi.next}while(wi!==null&&wi!==Vt);N0||(xr=$r,vn=zt),ho(zt,T.memoizedState)||up(),T.memoizedState=zt,T.baseUpdate=xr,T.baseState=vn,R.lastRenderedState=zt}var Ot=R.dispatch;return[T.memoizedState,Ot]}function Rf(a){var c=mc();typeof a=="function"&&(a=a()),c.memoizedState=c.baseState=a;var _=c.queue={last:null,dispatch:null,lastRenderedReducer:Nd,lastRenderedState:a},T=_.dispatch=u1.bind(null,ll,_);return[c.memoizedState,T]}function n1(a){return t1(Nd,a)}function Wa(a,c,_,T){var R={tag:a,create:c,destroy:_,deps:T,next:null};if(Zl===null)Zl=Ha(),Zl.lastEffect=R.next=R;else{var j=Zl.lastEffect;if(j===null)Zl.lastEffect=R.next=R;else{var V=j.next;j.next=R,R.next=V,Zl.lastEffect=R}}return R}function r1(a){var c=mc(),_={current:a};return Object.seal(_),c.memoizedState=_,_}function Ld(a){var c=e1();return c.memoizedState}function g2(a,c,_,T){var R=mc(),j=T===void 0?null:T;Tf|=a,R.memoizedState=Wa(c,_,void 0,j)}function yc(a,c,_,T){var R=e1(),j=T===void 0?null:T,V=void 0;if(Pn!==null){var te=Pn.memoizedState;if(V=te.destroy,j!==null){var oe=te.deps;if(xf(j,oe)){Wa(wf,_,V,j);return}}}Tf|=a,R.memoizedState=Wa(c,_,V,j)}function i1(a,c){return typeof jest!="undefined"&&Av(ll),g2(mr|L0,rr|$c,a,c)}function Rl(a,c){return typeof jest!="undefined"&&Av(ll),yc(mr|L0,rr|$c,a,c)}function pa(a,c){return g2(mr,Sf|ol,a,c)}function wh(a,c){return yc(mr,Sf|ol,a,c)}function Fd(a,c){if(typeof c=="function"){var _=c,T=a();return _(T),function(){_(null)}}else if(c!=null){var R=c;R.hasOwnProperty("current")||Kt(!1,"Expected useImperativeHandle() first argument to either be a ref callback or React.createRef() object. Instead received: %s.","an object with keys {"+Object.keys(R).join(", ")+"}");var j=a();return R.current=j,function(){R.current=null}}}function bd(a,c,_){typeof c!="function"&&Kt(!1,"Expected useImperativeHandle() second argument to be a function that creates a handle. Instead received: %s.",c!==null?typeof c:"null");var T=_!=null?_.concat([a]):null;return g2(mr,Sf|ol,Fd.bind(null,c,a),T)}function Sh(a,c,_){typeof c!="function"&&Kt(!1,"Expected useImperativeHandle() second argument to be a function that creates a handle. Instead received: %s.",c!==null?typeof c:"null");var T=_!=null?_.concat([a]):null;return yc(mr,Sf|ol,Fd.bind(null,c,a),T)}function _2(a,c){}var Th=_2;function Ol(a,c){var _=mc(),T=c===void 0?null:c;return _.memoizedState=[a,T],a}function es(a,c){var _=e1(),T=c===void 0?null:c,R=_.memoizedState;if(R!==null&&T!==null){var j=R[1];if(xf(T,j))return R[0]}return _.memoizedState=[a,T],a}function Ds(a,c){var _=mc(),T=c===void 0?null:c,R=a();return _.memoizedState=[R,T],R}function zs(a,c){var _=e1(),T=c===void 0?null:c,R=_.memoizedState;if(R!==null&&T!==null){var j=R[1];if(xf(T,j))return R[0]}var V=a();return _.memoizedState=[V,T],V}function Pd(a,c){var _=Rf(a),T=_[0],R=_[1];return i1(function(){t.unstable_next(function(){var j=Bo.suspense;Bo.suspense=c===void 0?null:c;try{R(a)}finally{Bo.suspense=j}})},[a,c]),T}function Ch(a,c){var _=n1(a),T=_[0],R=_[1];return Rl(function(){t.unstable_next(function(){var j=Bo.suspense;Bo.suspense=c===void 0?null:c;try{R(a)}finally{Bo.suspense=j}})},[a,c]),T}function Id(a){var c=Rf(!1),_=c[0],T=c[1],R=Ol(function(j){T(!0),t.unstable_next(function(){var V=Bo.suspense;Bo.suspense=a===void 0?null:a;try{T(!1),j()}finally{Bo.suspense=V}})},[a,_]);return[R,_]}function Bd(a){var c=n1(!1),_=c[0],T=c[1],R=es(function(j){T(!0),t.unstable_next(function(){var V=Bo.suspense;Bo.suspense=a===void 0?null:a;try{T(!1),j()}finally{Bo.suspense=V}})},[a,_]);return[R,_]}function u1(a,c,_){if(!(vc=0){var _=l1()-s1;a.actualDuration+=_,c&&(a.selfBaseDuration=_),s1=-1}}var Ml=null,Ga=null,ha=!1;function qd(){ha&&Kt(!1,"We should not be hydrating here. This is a bug in React. Please file a bug.")}function Hd(a){if(!_e)return!1;var c=a.stateNode.containerInfo;return Ga=B(c),Ml=a,ha=!0,!0}function Em(a,c){return _e?(Ga=Ni(c),Gd(a),ha=!0,!0):!1}function Wd(a,c){switch(a.tag){case U:ie(a.stateNode.containerInfo,c);break;case W:qe(a.type,a.memoizedProps,a.stateNode,c);break}var _=eE();_.stateNode=c,_.return=a,_.effectTag=W0,a.lastEffect!==null?(a.lastEffect.nextEffect=_,a.lastEffect=_):a.firstEffect=a.lastEffect=_}function Mh(a,c){switch(c.effectTag=c.effectTag&~tu|ai,a.tag){case U:{var _=a.stateNode.containerInfo;switch(c.tag){case W:var T=c.type,R=c.pendingProps;tt(_,T,R);break;case ne:var j=c.pendingProps;Tt(_,j);break;case pe:kt(_);break}break}case W:{var V=a.type,te=a.memoizedProps,oe=a.stateNode;switch(c.tag){case W:var Ie=c.type,Ye=c.pendingProps;bt(V,te,oe,Ie,Ye);break;case ne:var pt=c.pendingProps;on(V,te,oe,pt);break;case pe:tn(V,te,oe);break}break}default:return}}function Nh(a,c){switch(a.tag){case W:{var _=a.type,T=a.pendingProps,R=lf(c,_,T);return R!==null?(a.stateNode=R,!0):!1}case ne:{var j=a.pendingProps,V=Ns(c,j);return V!==null?(a.stateNode=V,!0):!1}case pe:{if(Di){var te=Ma(c);if(te!==null){var oe={dehydrated:te,retryTime:hi};a.memoizedState=oe;var Ie=tE(te);return Ie.return=a,a.child=Ie,!0}}return!1}default:return!1}}function Vd(a){if(!!ha){var c=Ga;if(!c){Mh(Ml,a),ha=!1,Ml=a;return}var _=c;if(!Nh(a,c)){if(c=Ni(_),!c||!Nh(a,c)){Mh(Ml,a),ha=!1,Ml=a;return}Wd(Ml,_)}Ml=a,Ga=B(c)}}function Dm(a,c,_){if(!_e)throw Error("Expected prepareToHydrateHostInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.");var T=a.stateNode,R=z(T,a.type,a.memoizedProps,c,_,a);return a.updateQueue=R,R!==null}function wm(a){if(!_e)throw Error("Expected prepareToHydrateHostTextInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.");var c=a.stateNode,_=a.memoizedProps,T=G(c,_,a);if(T){var R=Ml;if(R!==null)switch(R.tag){case U:{var j=R.stateNode.containerInfo;Xe(j,c,_);break}case W:{var V=R.type,te=R.memoizedProps,oe=R.stateNode;ht(V,te,oe,c,_);break}}}return T}function Lh(a){if(!_e)throw Error("Expected prepareToHydrateHostSuspenseInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.");var c=a.memoizedState,_=c!==null?c.dehydrated:null;if(!_)throw Error("Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue.");$(_,a)}function Sm(a){if(!_e)throw Error("Expected skipPastDehydratedSuspenseInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.");var c=a.memoizedState,_=c!==null?c.dehydrated:null;if(!_)throw Error("Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue.");return De(_)}function Gd(a){for(var c=a.return;c!==null&&c.tag!==W&&c.tag!==U&&c.tag!==pe;)c=c.return;Ml=c}function f1(a){if(!_e||a!==Ml)return!1;if(!ha)return Gd(a),ha=!0,!1;var c=a.type;if(a.tag!==W||c!=="head"&&c!=="body"&&!Ti(c,a.memoizedProps))for(var _=Ga;_;)Wd(a,_),_=Ni(_);return Gd(a),a.tag===pe?Ga=Sm(a):Ga=Ml?Ni(a.stateNode):null,!0}function c1(){!_e||(Ml=null,Ga=null,ha=!1)}var d1=at.ReactCurrentOwner,va=!1,Yd,qs,Hs,Ws,Kd,ma,p1,E2,gc,Xd;Yd={},qs={},Hs={},Ws={},Kd={},ma=!1,p1=!1,E2={},gc={},Xd={};function _o(a,c,_,T){a===null?c.child=Xc(c,null,_,T):c.child=gf(c,a.child,_,T)}function Fh(a,c,_,T){c.child=gf(c,a.child,null,T),c.child=gf(c,null,_,T)}function bh(a,c,_,T,R){if(c.type!==c.elementType){var j=_.propTypes;j&&E(j,T,"prop",qt(_),Rr)}var V=_.render,te=c.ref,oe;return e0(c,R),d1.current=c,Ze("render"),oe=Af(a,c,V,T,te,R),Ei&&c.mode&cr&&c.memoizedState!==null&&(oe=Af(a,c,V,T,te,R)),Ze(null),a!==null&&!va?(v2(a,c,R),ya(a,c,R)):(c.effectTag|=eu,_o(a,c,oe,R),c.child)}function Ph(a,c,_,T,R,j){if(a===null){var V=_.type;if(i0(V)&&_.compare===null&&_.defaultProps===void 0){var te=V;return te=Zu(V),c.tag=le,c.type=te,Zd(c,V),Ih(a,c,te,T,R,j)}{var oe=V.propTypes;oe&&E(oe,T,"prop",qt(V),Rr)}var Ie=Sy(_.type,null,T,null,c.mode,j);return Ie.ref=c.ref,Ie.return=c,c.child=Ie,Ie}{var Ye=_.type,pt=Ye.propTypes;pt&&E(pt,T,"prop",qt(Ye),Rr)}var Nt=a.child;if(R component appears to have a render method, but doesn't extend React.Component. This is likely to cause errors. Change %s to extend React.Component instead.",oe,oe),Yd[oe]=!0)}c.mode&cr&&wl.recordLegacyContextWarning(c,null),d1.current=c,te=Af(null,c,_,R,j,T)}if(c.effectTag|=eu,typeof te=="object"&&te!==null&&typeof te.render=="function"&&te.$$typeof===void 0){{var Ie=qt(_)||"Unknown";qs[Ie]||(Ke(!1,"The <%s /> component appears to be a function component that returns a class instance. Change %s to a class that extends React.Component instead. If you can't use a class try assigning the prototype on the function as a workaround. `%s.prototype = React.Component.prototype`. Don't use an arrow function since it cannot be called with `new` by React.",Ie,Ie,Ie),qs[Ie]=!0)}c.tag=N,m2();var Ye=!1;zi(_)?(Ye=!0,Fi(c)):Ye=!1,c.memoizedState=te.state!==null&&te.state!==void 0?te.state:null;var pt=_.getDerivedStateFromProps;return typeof pt=="function"&&yf(c,_,pt,R),il(c,te),ac(c,_,R,T),Jd(null,c,_,!0,Ye,T)}else return c.tag=L,ni&&_.contextTypes&&Ke(!1,"%s uses the legacy contextTypes API which is no longer supported. Use React.createContext() with React.useContext() instead.",qt(_)||"Unknown"),Ei&&c.mode&cr&&c.memoizedState!==null&&(te=Af(null,c,_,R,j,T)),_o(null,c,te,T),Zd(c,_),c.child}function Zd(a,c){if(c&&c.childContextTypes&&Ke(!1,"%s(...): childContextTypes cannot be defined on a function component.",c.displayName||c.name||"Component"),a.ref!==null){var _="",T=v0();T&&(_+=` + +Check the render method of \``+T+"`.");var R=T||a._debugID||"",j=a._debugSource;j&&(R=j.fileName+":"+j.lineNumber),Kd[R]||(Kd[R]=!0,Kt(!1,"Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?%s",_))}if(Wl&&c.defaultProps!==void 0){var V=qt(c)||"Unknown";Xd[V]||(Ke(!1,"%s: Support for defaultProps will be removed from function components in a future major release. Use JavaScript default parameters instead.",V),Xd[V]=!0)}if(typeof c.getDerivedStateFromProps=="function"){var te=qt(c)||"Unknown";Ws[te]||(Ke(!1,"%s: Function components do not support getDerivedStateFromProps.",te),Ws[te]=!0)}if(typeof c.contextType=="object"&&c.contextType!==null){var oe=qt(c)||"Unknown";Hs[oe]||(Ke(!1,"%s: Function components do not support contextType.",oe),Hs[oe]=!0)}}var w2={dehydrated:null,retryTime:lt};function $d(a,c,_){return Jc(a,Qc)&&(c===null||c.memoizedState!==null)}function qh(a,c,_){var T=c.mode,R=c.pendingProps;a_(c)&&(c.effectTag|=Hr);var j=xl.current,V=!1,te=(c.effectTag&Hr)!==_i;if(te||$d(j,a,c)?(V=!0,c.effectTag&=~Hr):(a===null||a.memoizedState!==null)&&R.fallback!==void 0&&R.unstable_avoidThisFallback!==!0&&(j=d2(j,Ef)),j=ca(j),Or(c,j),"maxDuration"in R&&(p1||(p1=!0,Kt(!1,"maxDuration has been removed from React. Remove the maxDuration prop."))),a===null){if(R.fallback!==void 0&&(Vd(c),Di)){var oe=c.memoizedState;if(oe!==null){var Ie=oe.dehydrated;if(Ie!==null)return Hh(c,Ie,_)}}if(V){var Ye=R.fallback,pt=Qa(null,T,lt,null);if(pt.return=c,(c.mode&Y)===Sr){var Nt=c.memoizedState,Vt=Nt!==null?c.child.child:c.child;pt.child=Vt;for(var zt=Vt;zt!==null;)zt.return=pt,zt=zt.sibling}var vn=Qa(Ye,T,_,null);return vn.return=c,pt.sibling=vn,c.memoizedState=w2,c.child=pt,vn}else{var xr=R.children;return c.memoizedState=null,c.child=Xc(c,null,xr,_)}}else{var $r=a.memoizedState;if($r!==null){if(Di){var wi=$r.dehydrated;if(wi!==null)if(te){if(c.memoizedState!==null)return c.child=a.child,c.effectTag|=Hr,null;var N0=R.fallback,Vi=Qa(null,T,lt,null);if(Vi.return=c,Vi.child=null,(c.mode&Y)===Sr)for(var it=Vi.child=c.child;it!==null;)it.return=Vi,it=it.sibling;else gf(c,a.child,null,_);if(Zt&&c.mode&Jr){for(var Ot=0,Je=Vi.child;Je!==null;)Ot+=Je.treeBaseDuration,Je=Je.sibling;Vi.treeBaseDuration=Ot}var Bt=Qa(N0,T,_,null);return Bt.return=c,Vi.sibling=Bt,Bt.effectTag|=ai,Vi.childExpirationTime=lt,c.memoizedState=w2,c.child=Vi,Bt}else return Wh(a,c,wi,$r,_)}var Mn=a.child,pn=Mn.sibling;if(V){var Pi=R.fallback,oi=wo(Mn,Mn.pendingProps,lt);if(oi.return=c,(c.mode&Y)===Sr){var qu=c.memoizedState,ar=qu!==null?c.child.child:c.child;if(ar!==Mn.child){oi.child=ar;for(var ou=ar;ou!==null;)ou.return=oi,ou=ou.sibling}}if(Zt&&c.mode&Jr){for(var qr=0,_u=oi.child;_u!==null;)qr+=_u.treeBaseDuration,_u=_u.sibling;oi.treeBaseDuration=qr}var _0=wo(pn,Pi,pn.expirationTime);return _0.return=c,oi.sibling=_0,oi.childExpirationTime=lt,c.memoizedState=w2,c.child=oi,_0}else{var H0=R.children,Cs=Mn.child,Hu=gf(c,Cs,H0,_);return c.memoizedState=null,c.child=Hu}}else{var pl=a.child;if(V){var Ja=R.fallback,jo=Qa(null,T,lt,null);if(jo.return=c,jo.child=pl,pl!==null&&(pl.return=jo),(c.mode&Y)===Sr){var xs=c.memoizedState,X2=xs!==null?c.child.child:c.child;jo.child=X2;for(var Uf=X2;Uf!==null;)Uf.return=jo,Uf=Uf.sibling}if(Zt&&c.mode&Jr){for(var Rc=0,Pl=jo.child;Pl!==null;)Rc+=Pl.treeBaseDuration,Pl=Pl.sibling;jo.treeBaseDuration=Rc}var zo=Qa(Ja,T,_,null);return zo.return=c,jo.sibling=zo,zo.effectTag|=ai,jo.childExpirationTime=lt,c.memoizedState=w2,c.child=jo,zo}else{c.memoizedState=null;var O1=R.children;return c.child=gf(c,pl,O1,_)}}}}function ep(a,c,_){c.memoizedState=null;var T=c.pendingProps,R=T.children;return _o(a,c,R,_),c.child}function Hh(a,c,_){if((a.mode&Y)===Sr)Kt(!1,"Cannot hydrate Suspense in legacy mode. Switch from ReactDOM.hydrate(element, container) to ReactDOM.createBlockingRoot(container, { hydrate: true }).render(element) or remove the Suspense components from the server rendered components."),a.expirationTime=bn;else if(h0(c)){var T=Fl(),R=ms(T);Ln&&x(R),a.expirationTime=R}else a.expirationTime=hi,Ln&&x(hi);return null}function Wh(a,c,_,T,R){if(qd(),(c.mode&Y)===Sr||h0(_))return ep(a,c,R);var j=a.childExpirationTime>=R;if(va||j){if(R. Use lowercase "%s" instead.',a,a.toLowerCase());break}case"forward":case"backward":{Kt(!1,'"%s" is not a valid value for revealOrder on . React uses the -s suffix in the spelling. Use "%ss" instead.',a,a.toLowerCase());break}default:Kt(!1,'"%s" is not a supported revealOrder on . Did you mean "together", "forwards" or "backwards"?',a);break}else Kt(!1,'%s is not a supported value for revealOrder on . Did you mean "together", "forwards" or "backwards"?',a)}function Vh(a,c){a!==void 0&&!gc[a]&&(a!=="collapsed"&&a!=="hidden"?(gc[a]=!0,Kt(!1,'"%s" is not a supported value for tail on . Did you mean "collapsed" or "hidden"?',a)):c!=="forwards"&&c!=="backwards"&&(gc[a]=!0,Kt(!1,' is only valid if revealOrder is "forwards" or "backwards". Did you mean to specify revealOrder="forwards"?',a)))}function v1(a,c){{var _=Array.isArray(a),T=!_&&typeof ur(a)=="function";if(_||T){var R=_?"array":"iterable";return Kt(!1,"A nested %s was passed to row #%s in . Wrap it in an additional SuspenseList to configure its revealOrder: ... {%s} ... ",R,c,R),!1}}return!0}function Mm(a,c){if((c==="forwards"||c==="backwards")&&a!==void 0&&a!==null&&a!==!1)if(Array.isArray(a)){for(var _=0;_. This is not useful since it needs multiple rows. Did you mean to pass multiple children or an array?',c)}}function np(a,c,_,T,R,j){var V=a.memoizedState;V===null?a.memoizedState={isBackwards:c,rendering:null,last:T,tail:_,tailExpiration:0,tailMode:R,lastEffect:j}:(V.isBackwards=c,V.rendering=null,V.last=T,V.tail=_,V.tailExpiration=0,V.tailMode=R,V.lastEffect=j)}function rp(a,c,_){var T=c.pendingProps,R=T.revealOrder,j=T.tail,V=T.children;km(R),Vh(j,R),Mm(V,R),_o(a,c,V,_);var te=xl.current,oe=Jc(te,Qc);if(oe)te=c2(te,Qc),c.effectTag|=Hr;else{var Ie=a!==null&&(a.effectTag&Hr)!==_i;Ie&&Rm(c,c.child,_),te=ca(te)}if(Or(c,te),(c.mode&Y)===Sr)c.memoizedState=null;else switch(R){case"forwards":{var Ye=Om(c.child),pt;Ye===null?(pt=c.child,c.child=null):(pt=Ye.sibling,Ye.sibling=null),np(c,!1,pt,Ye,j,c.lastEffect);break}case"backwards":{var Nt=null,Vt=c.child;for(c.child=null;Vt!==null;){var zt=Vt.alternate;if(zt!==null&&Zc(zt)===null){c.child=Vt;break}var vn=Vt.sibling;Vt.sibling=Nt,Nt=Vt,Vt=vn}np(c,!0,Nt,null,j,c.lastEffect);break}case"together":{np(c,!1,null,null,void 0,c.lastEffect);break}default:c.memoizedState=null}return c.child}function Nm(a,c,_){za(c,c.stateNode.containerInfo);var T=c.pendingProps;return a===null?c.child=gf(c,null,T,_):_o(a,c,T,_),c.child}function Lm(a,c,_){var T=c.type,R=T._context,j=c.pendingProps,V=c.memoizedProps,te=j.value;{var oe=c.type.propTypes;oe&&E(oe,j,"prop","Context.Provider",Rr)}if(Er(c,te),V!==null){var Ie=V.value,Ye=iu(R,te,Ie);if(Ye===0){if(V.children===j.children&&!na())return ya(a,c,_)}else Tl(c,R,Ye,_)}var pt=j.children;return _o(a,c,pt,_),c.child}var Gh=!1;function Fm(a,c,_){var T=c.type;T._context===void 0?T!==T.Consumer&&(Gh||(Gh=!0,Kt(!1,"Rendering directly is not supported and will be removed in a future major release. Did you mean to render instead?"))):T=T._context;var R=c.pendingProps,j=R.children;typeof j!="function"&&Ke(!1,"A context consumer was rendered with multiple children, or a child that isn't a function. A context consumer expects a single child that is a function. If you did pass a function, make sure there is no trailing or leading whitespace around it."),e0(c,_);var V=He(T,R.unstable_observedBits),te;return d1.current=c,Ze("render"),te=j(V),Ze(null),c.effectTag|=eu,_o(a,c,te,_),c.child}function bm(a,c,_){var T=c.type.impl;if(T.reconcileChildren===!1)return null;var R=c.pendingProps,j=R.children;return _o(a,c,j,_),c.child}function ip(a,c,_){var T=c.pendingProps,R=T.children;return _o(a,c,R,_),c.child}function up(){va=!0}function ya(a,c,_){Ki(c),a!==null&&(c.dependencies=a.dependencies),Zt&&kh(c);var T=c.expirationTime;T!==lt&&G2(T);var R=c.childExpirationTime;return R<_?null:(gh(a,c),c.child)}function m1(a,c,_){{var T=c.return;if(T===null)throw new Error("Cannot swap the root fiber.");if(a.alternate=null,c.alternate=null,_.index=c.index,_.sibling=c.sibling,_.return=c.return,_.ref=c.ref,c===T.child)T.child=_;else{var R=T.child;if(R===null)throw new Error("Expected parent to have a child.");for(;R.sibling!==c;)if(R=R.sibling,R===null)throw new Error("Expected to find the previous sibling.");R.sibling=_}var j=T.lastEffect;return j!==null?(j.nextEffect=a,T.lastEffect=a):T.firstEffect=T.lastEffect=a,a.nextEffect=null,a.effectTag=W0,_.effectTag|=ai,_}}function op(a,c,_){var T=c.expirationTime;if(c._debugNeedsRemount&&a!==null)return m1(a,c,Sy(c.type,c.key,c.pendingProps,c._debugOwner||null,c.mode,c.expirationTime));if(a!==null){var R=a.memoizedProps,j=c.pendingProps;if(R!==j||na()||c.type!==a.type)va=!0;else if(T<_){switch(va=!1,c.tag){case U:zh(c),c1();break;case W:if(dc(c),c.mode&Qr&&_!==hi&&d0(c.type,j))return Ln&&x(hi),c.expirationTime=c.childExpirationTime=hi,null;break;case N:{var V=c.type;zi(V)&&Fi(c);break}case q:za(c,c.stateNode.containerInfo);break;case he:{var te=c.memoizedProps.value;Er(c,te);break}case ze:if(Zt){var oe=c.childExpirationTime>=_;oe&&(c.effectTag|=mr)}break;case pe:{var Ie=c.memoizedState;if(Ie!==null){if(Di&&Ie.dehydrated!==null){Or(c,ca(xl.current)),c.effectTag|=Hr;break}var Ye=c.child,pt=Ye.childExpirationTime;if(pt!==lt&&pt>=_)return qh(a,c,_);Or(c,ca(xl.current));var Nt=ya(a,c,_);return Nt!==null?Nt.sibling:null}else Or(c,ca(xl.current));break}case wt:{var Vt=(a.effectTag&Hr)!==_i,zt=c.childExpirationTime>=_;if(Vt){if(zt)return rp(a,c,_);c.effectTag|=Hr}var vn=c.memoizedState;if(vn!==null&&(vn.rendering=null,vn.tail=null),Or(c,xl.current),zt)break;return null}}return ya(a,c,_)}else va=!1}else va=!1;switch(c.expirationTime=lt,c.tag){case C:return Am(a,c,c.type,_);case Ue:{var xr=c.elementType;return kf(a,c,xr,T,_)}case L:{var $r=c.type,wi=c.pendingProps,N0=c.elementType===$r?wi:bi($r,wi);return Qd(a,c,$r,N0,_)}case N:{var Vi=c.type,it=c.pendingProps,Ot=c.elementType===Vi?it:bi(Vi,it);return jh(a,c,Vi,Ot,_)}case U:return Cm(a,c,_);case W:return xm(a,c,_);case ne:return Of(a,c);case pe:return qh(a,c,_);case q:return Nm(a,c,_);case ge:{var Je=c.type,Bt=c.pendingProps,Mn=c.elementType===Je?Bt:bi(Je,Bt);return bh(a,c,Je,Mn,_)}case m:return Tm(a,c,_);case we:return Bh(a,c,_);case ze:return Uh(a,c,_);case he:return Lm(a,c,_);case Se:return Fm(a,c,_);case Oe:{var pn=c.type,Pi=c.pendingProps,oi=bi(pn,Pi);if(c.type!==c.elementType){var qu=pn.propTypes;qu&&E(qu,oi,"prop",qt(pn),Rr)}return oi=bi(pn.type,oi),Ph(a,c,pn,oi,T,_)}case le:return Ih(a,c,c.type,c.pendingProps,T,_);case Ge:{var ar=c.type,ou=c.pendingProps,qr=c.elementType===ar?ou:bi(ar,ou);return D2(a,c,ar,qr,_)}case wt:return rp(a,c,_);case xt:{if(Ht)return bm(a,c,_);break}case $e:{if(Du)return ip(a,c,_);break}}throw Error("Unknown unit of work tag ("+c.tag+"). This error is likely caused by a bug in React. Please file an issue.")}function Yh(a,c,_,T){return{currentFiber:a,impl:_,instance:null,prevProps:null,props:c,state:T}}function S2(a){return a.tag===pe&&a.memoizedState!==null}function y1(a){return a.child.sibling.child}var Kh={};function lp(a,c,_){if(Du){if(a.tag===W){var T=a.type,R=a.memoizedProps,j=a.stateNode,V=Ro(j);V!==null&&c(T,R||Kh,V)===!0&&_.push(V)}var te=a.child;S2(a)&&(te=y1(a)),te!==null&&sp(te,c,_)}}function Xh(a,c){if(Du){if(a.tag===W){var _=a.type,T=a.memoizedProps,R=a.stateNode,j=Ro(R);if(j!==null&&c(_,T,j)===!0)return j}var V=a.child;if(S2(a)&&(V=y1(a)),V!==null)return Qh(V,c)}return null}function sp(a,c,_){for(var T=a;T!==null;)lp(T,c,_),T=T.sibling}function Qh(a,c){for(var _=a;_!==null;){var T=Xh(_,c);if(T!==null)return T;_=_.sibling}return null}function Jh(a,c,_){if(T2(a,c))_.push(a.stateNode.methods);else{var T=a.child;S2(a)&&(T=y1(a)),T!==null&&ap(T,c,_)}}function ap(a,c,_){for(var T=a;T!==null;)Jh(T,c,_),T=T.sibling}function T2(a,c){return a.tag===$e&&a.type===c&&a.stateNode!==null}function C2(a,c){return{getChildren:function(){var _=c.fiber,T=_.child,R=[];return T!==null&&ap(T,a,R),R.length===0?null:R},getChildrenFromRoot:function(){for(var _=c.fiber,T=_;T!==null;){var R=T.return;if(R===null||(T=R,T.tag===$e&&T.type===a))break}var j=[];return ap(T.child,a,j),j.length===0?null:j},getParent:function(){for(var _=c.fiber.return;_!==null;){if(_.tag===$e&&_.type===a)return _.stateNode.methods;_=_.return}return null},getProps:function(){var _=c.fiber;return _.memoizedProps},queryAllNodes:function(_){var T=c.fiber,R=T.child,j=[];return R!==null&&sp(R,_,j),j.length===0?null:j},queryFirstNode:function(_){var T=c.fiber,R=T.child;return R!==null?Qh(R,_):null},containsNode:function(_){for(var T=or(_);T!==null;){if(T.tag===$e&&T.type===a&&T.stateNode===c)return!0;T=T.return}return!1}}}function z0(a){a.effectTag|=mr}function x2(a){a.effectTag|=To}var ga,Ya,A2,R2;if(P0)ga=function(a,c,_,T){for(var R=c.child;R!==null;){if(R.tag===W||R.tag===ne)Wr(a,R.stateNode);else if(Ht&&R.tag===xt)Wr(a,R.stateNode.instance);else if(R.tag!==q){if(R.child!==null){R.child.return=R,R=R.child;continue}}if(R===c)return;for(;R.sibling===null;){if(R.return===null||R.return===c)return;R=R.return}R.sibling.return=R.return,R=R.sibling}},Ya=function(a){},A2=function(a,c,_,T,R){var j=a.memoizedProps;if(j!==T){var V=c.stateNode,te=ul(),oe=c0(V,_,j,T,R,te);c.updateQueue=oe,oe&&z0(c)}},R2=function(a,c,_,T){_!==T&&z0(c)};else if(X){ga=function(a,c,_,T){for(var R=c.child;R!==null;){e:if(R.tag===W){var j=R.stateNode;if(_&&T){var V=R.memoizedProps,te=R.type;j=Gr(j,te,V,R)}Wr(a,j)}else if(R.tag===ne){var oe=R.stateNode;if(_&&T){var Ie=R.memoizedProps;oe=Yl(oe,Ie,R)}Wr(a,oe)}else if(Ht&&R.tag===xt){var Ye=R.stateNode.instance;if(_&&T){var pt=R.memoizedProps,Nt=R.type;Ye=Gr(Ye,Nt,pt,R)}Wr(a,Ye)}else if(R.tag!==q){if(R.tag===pe){if((R.effectTag&mr)!==_i){var Vt=R.memoizedState!==null;if(Vt){var zt=R.child;if(zt!==null){zt.child!==null&&(zt.child.return=zt,ga(a,zt,!0,Vt));var vn=zt.sibling;if(vn!==null){vn.return=R,R=vn;continue}}}}if(R.child!==null){R.child.return=R,R=R.child;continue}}else if(R.child!==null){R.child.return=R,R=R.child;continue}}if(R=R,R===c)return;for(;R.sibling===null;){if(R.return===null||R.return===c)return;R=R.return}R.sibling.return=R.return,R=R.sibling}};var fp=function(a,c,_,T){for(var R=c.child;R!==null;){e:if(R.tag===W){var j=R.stateNode;if(_&&T){var V=R.memoizedProps,te=R.type;j=Gr(j,te,V,R)}Gn(a,j)}else if(R.tag===ne){var oe=R.stateNode;if(_&&T){var Ie=R.memoizedProps;oe=Yl(oe,Ie,R)}Gn(a,oe)}else if(Ht&&R.tag===xt){var Ye=R.stateNode.instance;if(_&&T){var pt=R.memoizedProps,Nt=R.type;Ye=Gr(Ye,Nt,pt,R)}Gn(a,Ye)}else if(R.tag!==q){if(R.tag===pe){if((R.effectTag&mr)!==_i){var Vt=R.memoizedState!==null;if(Vt){var zt=R.child;if(zt!==null){zt.child!==null&&(zt.child.return=zt,fp(a,zt,!0,Vt));var vn=zt.sibling;if(vn!==null){vn.return=R,R=vn;continue}}}}if(R.child!==null){R.child.return=R,R=R.child;continue}}else if(R.child!==null){R.child.return=R,R=R.child;continue}}if(R=R,R===c)return;for(;R.sibling===null;){if(R.return===null||R.return===c)return;R=R.return}R.sibling.return=R.return,R=R.sibling}};Ya=function(a){var c=a.stateNode,_=a.firstEffect===null;if(!_){var T=c.containerInfo,R=w0(T);fp(R,a,!1,!1),c.pendingChildren=R,z0(a),ic(T,R)}},A2=function(a,c,_,T,R){var j=a.stateNode,V=a.memoizedProps,te=c.firstEffect===null;if(te&&V===T){c.stateNode=j;return}var oe=c.stateNode,Ie=ul(),Ye=null;if(V!==T&&(Ye=c0(oe,_,V,T,R,Ie)),te&&Ye===null){c.stateNode=j;return}var pt=cs(j,Ye,_,V,T,c,te,oe);wu(pt,_,T,R,Ie)&&z0(c),c.stateNode=pt,te?z0(c):ga(pt,c,!1,!1)},R2=function(a,c,_,T){if(_!==T){var R=Jl(),j=ul();c.stateNode=as(T,R,j,c),z0(c)}}}else Ya=function(a){},A2=function(a,c,_,T,R){},R2=function(a,c,_,T){};function O2(a,c){switch(a.tailMode){case"hidden":{for(var _=a.tail,T=null;_!==null;)_.alternate!==null&&(T=_),_=_.sibling;T===null?a.tail=null:T.sibling=null;break}case"collapsed":{for(var R=a.tail,j=null;R!==null;)R.alternate!==null&&(j=R),R=R.sibling;j===null?!c&&a.tail!==null?a.tail.sibling=null:a.tail=null:j.sibling=null;break}}}function Zh(a,c,_){var T=c.pendingProps;switch(c.tag){case C:break;case Ue:break;case le:case L:break;case N:{var R=c.type;zi(R)&&Is(c);break}case U:{no(c),x0(c);var j=c.stateNode;if(j.pendingContext&&(j.context=j.pendingContext,j.pendingContext=null),a===null||a.child===null){var V=f1(c);V&&z0(c)}Ya(c);break}case W:{Od(c);var te=Jl(),oe=c.type;if(a!==null&&c.stateNode!=null){if(A2(a,c,oe,T,te),ci){var Ie=a.memoizedProps.listeners,Ye=T.listeners;Ie!==Ye&&z0(c)}a.ref!==c.ref&&x2(c)}else{if(!T){if(c.stateNode===null)throw Error("We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.");break}var pt=ul(),Nt=f1(c);if(Nt){if(Dm(c,te,pt)&&z0(c),ci){var Vt=T.listeners;Vt!=null&&dn(Vt,c,te)}}else{var zt=ji(oe,T,te,pt,c);if(ga(zt,c,!1,!1),c.stateNode=zt,ci){var vn=T.listeners;vn!=null&&dn(vn,c,te)}wu(zt,oe,T,te,pt)&&z0(c)}c.ref!==null&&x2(c)}break}case ne:{var xr=T;if(a&&c.stateNode!=null){var $r=a.memoizedProps;R2(a,c,$r,xr)}else{if(typeof xr!="string"&&c.stateNode===null)throw Error("We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.");var wi=Jl(),N0=ul(),Vi=f1(c);Vi?wm(c)&&z0(c):c.stateNode=as(xr,wi,N0,c)}break}case ge:break;case pe:{da(c);var it=c.memoizedState;if(Di&&it!==null&&it.dehydrated!==null)if(a===null){var Ot=f1(c);if(!Ot)throw Error("A dehydrated suspense component was completed without a hydrated node. This is probably a bug in React.");return Lh(c),Ln&&x(hi),null}else return c1(),(c.effectTag&Hr)===_i&&(c.memoizedState=null),c.effectTag|=mr,null;if((c.effectTag&Hr)!==_i)return c.expirationTime=_,c;var Je=it!==null,Bt=!1;if(a===null)c.memoizedProps.fallback!==void 0&&f1(c);else{var Mn=a.memoizedState;if(Bt=Mn!==null,!Je&&Mn!==null){var pn=a.child.sibling;if(pn!==null){var Pi=c.firstEffect;Pi!==null?(c.firstEffect=pn,pn.nextEffect=Pi):(c.firstEffect=c.lastEffect=pn,pn.nextEffect=null),pn.effectTag=W0}}}if(Je&&!Bt&&(c.mode&Y)!==Sr){var oi=a===null&&c.memoizedProps.unstable_avoidThisFallback!==!0;oi||Jc(xl.current,Ef)?mv():yv()}X&&Je&&(c.effectTag|=mr),P0&&(Je||Bt)&&(c.effectTag|=mr),Ui&&c.updateQueue!==null&&c.memoizedProps.suspenseCallback!=null&&(c.effectTag|=mr);break}case m:break;case we:break;case ze:break;case q:no(c),Ya(c);break;case he:$u(c);break;case Se:break;case Oe:break;case Ge:{var qu=c.type;zi(qu)&&Is(c);break}case wt:{da(c);var ar=c.memoizedState;if(ar===null)break;var ou=(c.effectTag&Hr)!==_i,qr=ar.rendering;if(qr===null)if(ou)O2(ar,!1);else{var _u=gv()&&(a===null||(a.effectTag&Hr)===_i);if(!_u)for(var _0=c.child;_0!==null;){var H0=Zc(_0);if(H0!==null){ou=!0,c.effectTag|=Hr,O2(ar,!1);var Cs=H0.updateQueue;return Cs!==null&&(c.updateQueue=Cs,c.effectTag|=mr),ar.lastEffect===null&&(c.firstEffect=null),c.lastEffect=ar.lastEffect,vm(c,_),Or(c,c2(xl.current,Qc)),c.child}_0=_0.sibling}}else{if(!ou){var Hu=Zc(qr);if(Hu!==null){c.effectTag|=Hr,ou=!0;var pl=Hu.updateQueue;if(pl!==null&&(c.updateQueue=pl,c.effectTag|=mr),O2(ar,!0),ar.tail===null&&ar.tailMode==="hidden"&&!qr.alternate){var Ja=c.lastEffect=ar.lastEffect;return Ja!==null&&(Ja.nextEffect=null),null}}else if(vt()>ar.tailExpiration&&_>hi){c.effectTag|=Hr,ou=!0,O2(ar,!1);var jo=_-1;c.expirationTime=c.childExpirationTime=jo,Ln&&x(jo)}}if(ar.isBackwards)qr.sibling=c.child,c.child=qr;else{var xs=ar.last;xs!==null?xs.sibling=qr:c.child=qr,ar.last=qr}}if(ar.tail!==null){if(ar.tailExpiration===0){var X2=500;ar.tailExpiration=vt()+X2}var Uf=ar.tail;ar.rendering=Uf,ar.tail=Uf.sibling,ar.lastEffect=c.lastEffect,Uf.sibling=null;var Rc=xl.current;return ou?Rc=c2(Rc,Qc):Rc=ca(Rc),Or(c,Rc),Uf}break}case xt:{if(Ht){var Pl=c.type.impl,zo=c.stateNode;if(zo===null){var O1=Pl.getInitialState,m_;O1!==void 0&&(m_=O1(T)),zo=c.stateNode=Yh(c,T,Pl,m_||{});var y_=dt(zo);if(zo.instance=y_,Pl.reconcileChildren===!1)return null;ga(y_,c,!1,!1),Hn(zo)}else{var yE=zo.props;if(zo.prevProps=yE,zo.props=T,zo.currentFiber=c,X){var g_=ea(zo);zo.instance=g_,ga(g_,c,!1,!1)}var gE=Dn(zo);gE&&z0(c)}}break}case $e:{if(Du)if(a===null){var _E=c.type,Ly={fiber:c,methods:null};if(c.stateNode=Ly,Ly.methods=C2(_E,Ly),ci){var __=T.listeners;if(__!=null){var EE=Jl();dn(__,c,EE)}}c.ref!==null&&(x2(c),z0(c))}else{if(ci){var DE=a.memoizedProps.listeners,wE=T.listeners;(DE!==wE||c.ref!==null)&&z0(c)}else c.ref!==null&&z0(c);a.ref!==c.ref&&x2(c)}break}default:throw Error("Unknown unit of work tag ("+c.tag+"). This error is likely caused by a bug in React. Please file an issue.")}return null}function Pm(a,c){switch(a.tag){case N:{var _=a.type;zi(_)&&Is(a);var T=a.effectTag;return T&f0?(a.effectTag=T&~f0|Hr,a):null}case U:{no(a),x0(a);var R=a.effectTag;if((R&Hr)!==_i)throw Error("The root failed to unmount after an error. This is likely a bug in React. Please file an issue.");return a.effectTag=R&~f0|Hr,a}case W:return Od(a),null;case pe:{if(da(a),Di){var j=a.memoizedState;if(j!==null&&j.dehydrated!==null){if(a.alternate===null)throw Error("Threw in newly mounted dehydrated component. This is likely a bug in React. Please file an issue.");c1()}}var V=a.effectTag;return V&f0?(a.effectTag=V&~f0|Hr,a):null}case wt:return da(a),null;case q:return no(a),null;case he:return $u(a),null;default:return null}}function $h(a){switch(a.tag){case N:{var c=a.type.childContextTypes;c!=null&&Is(a);break}case U:{no(a),x0(a);break}case W:{Od(a);break}case q:no(a);break;case pe:da(a);break;case wt:da(a);break;case he:$u(a);break;default:break}}function cp(a,c){return{value:a,source:c,stack:_r(c)}}var dp=function(a,c,_,T,R,j,V,te,oe){var Ie=Array.prototype.slice.call(arguments,3);try{c.apply(_,Ie)}catch(Ye){this.onError(Ye)}};if(typeof window!="undefined"&&typeof window.dispatchEvent=="function"&&typeof document!="undefined"&&typeof document.createEvent=="function"){var pp=document.createElement("react"),Im=function(a,c,_,T,R,j,V,te,oe){if(typeof document=="undefined")throw Error("The `document` global was defined when React was initialized, but is not defined anymore. This can happen in a test environment if a component schedules an update from an asynchronous callback, but the test has already finished running. To solve this, you can either unmount the component at the end of your test (and ensure that any asynchronous operations get canceled in `componentWillUnmount`), or you can change the test itself to be asynchronous.");var Ie=document.createEvent("Event"),Ye=!0,pt=window.event,Nt=Object.getOwnPropertyDescriptor(window,"event"),Vt=Array.prototype.slice.call(arguments,3);function zt(){pp.removeEventListener(N0,zt,!1),typeof window.event!="undefined"&&window.hasOwnProperty("event")&&(window.event=pt),c.apply(_,Vt),Ye=!1}var vn,xr=!1,$r=!1;function wi(Vi){if(vn=Vi.error,xr=!0,vn===null&&Vi.colno===0&&Vi.lineno===0&&($r=!0),Vi.defaultPrevented&&vn!=null&&typeof vn=="object")try{vn._suppressLogging=!0}catch(it){}}var N0="react-"+(a||"invokeguardedcallback");window.addEventListener("error",wi),pp.addEventListener(N0,zt,!1),Ie.initEvent(N0,!1,!1),pp.dispatchEvent(Ie),Nt&&Object.defineProperty(window,"event",Nt),Ye&&(xr?$r&&(vn=new Error("A cross-origin error was thrown. React doesn't have access to the actual error object in development. See https://fb.me/react-crossorigin-error for more information.")):vn=new Error(`An error was thrown inside one of your components, but React doesn't know what it was. This is likely due to browser flakiness. React does its best to preserve the "Pause on exceptions" behavior of the DevTools, which requires some DEV-mode only tricks. It's possible that these don't work in your browser. Try triggering the error in production mode, or switching to a modern browser. If you suspect that this is actually an issue with React, please file an issue.`),this.onError(vn)),window.removeEventListener("error",wi)};dp=Im}var Bm=dp,Eo=!1,k2=null,Um={onError:function(a){Eo=!0,k2=a}};function sl(a,c,_,T,R,j,V,te,oe){Eo=!1,k2=null,Bm.apply(Um,arguments)}function Jn(){return Eo}function Vs(){if(Eo){var a=k2;return Eo=!1,k2=null,a}else throw Error("clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue.")}function al(a){return!0}function n0(a){var c=al(a);if(c!==!1){var _=a.error;{var T=a.componentName,R=a.componentStack,j=a.errorBoundaryName,V=a.errorBoundaryFound,te=a.willRetry;if(_!=null&&_._suppressLogging){if(V&&te)return;console.error(_)}var oe=T?"The above error occurred in the <"+T+"> component:":"The above error occurred in one of your React components:",Ie;V&&j?te?Ie="React will try to recreate this component tree from scratch "+("using the error boundary you provided, "+j+"."):Ie="This error was initially handled by the error boundary "+j+`. +Recreating the tree from scratch failed so React will unmount the tree.`:Ie=`Consider adding an error boundary to your tree to customize error handling behavior. +Visit https://fb.me/react-error-boundaries to learn more about error boundaries.`;var Ye=""+oe+R+` + +`+(""+Ie);console.error(Ye)}}}var ev=null;ev=new Set;var Gs=typeof WeakSet=="function"?WeakSet:Set;function hp(a,c){var _=c.source,T=c.stack;T===null&&_!==null&&(T=_r(_));var R={componentName:_!==null?qt(_.type):null,componentStack:T!==null?T:"",error:c.value,errorBoundary:null,errorBoundaryName:null,errorBoundaryFound:!1,willRetry:!1};a!==null&&a.tag===N&&(R.errorBoundary=a.stateNode,R.errorBoundaryName=qt(a.type),R.errorBoundaryFound=!0,R.willRetry=!0);try{n0(R)}catch(j){setTimeout(function(){throw j})}}var jm=function(a,c){Oi(a,"componentWillUnmount"),c.props=a.memoizedProps,c.state=a.memoizedState,c.componentWillUnmount(),gi()};function tv(a,c){if(sl(null,jm,null,a,c),Jn()){var _=Vs();Pf(a,_)}}function vp(a){var c=a.ref;if(c!==null)if(typeof c=="function"){if(sl(null,c,null,null),Jn()){var _=Vs();Pf(a,_)}}else c.current=null}function zm(a,c){if(sl(null,c,null),Jn()){var _=Vs();Pf(a,_)}}function mp(a,c){switch(c.tag){case L:case ge:case le:{_c(ym,wf,c);return}case N:{if(c.effectTag&Co&&a!==null){var _=a.memoizedProps,T=a.memoizedState;Oi(c,"getSnapshotBeforeUpdate");var R=c.stateNode;c.type===c.elementType&&!ma&&(R.props!==c.memoizedProps&&Kt(!1,"Expected %s props to match memoized props before getSnapshotBeforeUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.",qt(c.type)||"instance"),R.state!==c.memoizedState&&Kt(!1,"Expected %s state to match memoized state before getSnapshotBeforeUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.",qt(c.type)||"instance"));var j=R.getSnapshotBeforeUpdate(c.elementType===c.type?_:bi(c.type,_),T);{var V=ev;j===void 0&&!V.has(c.type)&&(V.add(c.type),Ke(!1,"%s.getSnapshotBeforeUpdate(): A snapshot value (or null) must be returned. You have returned undefined.",qt(c.type)))}R.__reactInternalSnapshotBeforeUpdate=j,gi()}return}case U:case W:case ne:case q:case Ge:return;default:throw Error("This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.")}}function _c(a,c,_){var T=_.updateQueue,R=T!==null?T.lastEffect:null;if(R!==null){var j=R.next,V=j;do{if((V.tag&a)!==wf){var te=V.destroy;V.destroy=void 0,te!==void 0&&te()}if((V.tag&c)!==wf){var oe=V.create;V.destroy=oe();{var Ie=V.destroy;if(Ie!==void 0&&typeof Ie!="function"){var Ye=void 0;Ie===null?Ye=" You returned null. If your effect does not require clean up, return undefined (or nothing).":typeof Ie.then=="function"?Ye=` + +It looks like you wrote useEffect(async () => ...) or returned a Promise. Instead, write the async function inside your effect and call it immediately: + +useEffect(() => { + async function fetchData() { + // You can await here + const response = await MyAPI.getData(someId); + // ... + } + fetchData(); +}, [someId]); // Or [] if effect doesn't need props or state + +Learn more about data fetching with Hooks: https://fb.me/react-hooks-data-fetching`:Ye=" You returned: "+Ie,Ke(!1,"An effect function must not return anything besides a function, which is used for clean-up.%s%s",Ye,_r(_))}}}V=V.next}while(V!==j)}}function Ea(a){if((a.effectTag&L0)!==_i)switch(a.tag){case L:case ge:case le:{_c(rr,wf,a),_c(wf,$c,a);break}default:break}}function yp(a,c,_,T){switch(_.tag){case L:case ge:case le:{_c(gm,ol,_);break}case N:{var R=_.stateNode;if(_.effectTag&mr)if(c===null)Oi(_,"componentDidMount"),_.type===_.elementType&&!ma&&(R.props!==_.memoizedProps&&Kt(!1,"Expected %s props to match memoized props before componentDidMount. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.",qt(_.type)||"instance"),R.state!==_.memoizedState&&Kt(!1,"Expected %s state to match memoized state before componentDidMount. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.",qt(_.type)||"instance")),R.componentDidMount(),gi();else{var j=_.elementType===_.type?c.memoizedProps:bi(_.type,c.memoizedProps),V=c.memoizedState;Oi(_,"componentDidUpdate"),_.type===_.elementType&&!ma&&(R.props!==_.memoizedProps&&Kt(!1,"Expected %s props to match memoized props before componentDidUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.",qt(_.type)||"instance"),R.state!==_.memoizedState&&Kt(!1,"Expected %s state to match memoized state before componentDidUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.",qt(_.type)||"instance")),R.componentDidUpdate(j,V,R.__reactInternalSnapshotBeforeUpdate),gi()}var te=_.updateQueue;te!==null&&(_.type===_.elementType&&!ma&&(R.props!==_.memoizedProps&&Kt(!1,"Expected %s props to match memoized props before processing the update queue. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.",qt(_.type)||"instance"),R.state!==_.memoizedState&&Kt(!1,"Expected %s state to match memoized state before processing the update queue. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.",qt(_.type)||"instance")),vo(_,te,R,T));return}case U:{var oe=_.updateQueue;if(oe!==null){var Ie=null;if(_.child!==null)switch(_.child.tag){case W:Ie=Ro(_.child.stateNode);break;case N:Ie=_.child.stateNode;break}vo(_,oe,Ie,T)}return}case W:{var Ye=_.stateNode;if(c===null&&_.effectTag&mr){var pt=_.type,Nt=_.memoizedProps;Pu(Ye,pt,Nt,_)}return}case ne:return;case q:return;case ze:{if(Zt){var Vt=_.memoizedProps.onRender;typeof Vt=="function"&&(Ln?Vt(_.memoizedProps.id,c===null?"mount":"update",_.actualDuration,_.treeBaseDuration,_.actualStartTime,kl(),a.memoizedInteractions):Vt(_.memoizedProps.id,c===null?"mount":"update",_.actualDuration,_.treeBaseDuration,_.actualStartTime,kl()))}return}case pe:{Nl(a,_);return}case wt:case Ge:case xt:case $e:return;default:throw Error("This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.")}}function M2(a,c){if(P0)for(var _=a;;){if(_.tag===W){var T=_.stateNode;c?Oa(T):Zs(_.stateNode,_.memoizedProps)}else if(_.tag===ne){var R=_.stateNode;c?p0(R):K0(R,_.memoizedProps)}else if(_.tag===pe&&_.memoizedState!==null&&_.memoizedState.dehydrated===null){var j=_.child.sibling;j.return=_,_=j;continue}else if(_.child!==null){_.child.return=_,_=_.child;continue}if(_===a)return;for(;_.sibling===null;){if(_.return===null||_.return===a)return;_=_.return}_.sibling.return=_.return,_=_.sibling}}function ku(a){var c=a.ref;if(c!==null){var _=a.stateNode,T;switch(a.tag){case W:T=Ro(_);break;default:T=_}Du&&a.tag===$e&&(T=_.methods),typeof c=="function"?c(T):(c.hasOwnProperty("current")||Ke(!1,"Unexpected ref object provided for %s. Use either a ref-setter function or React.createRef().%s",qt(a.type),_r(a)),c.current=T)}}function zu(a){var c=a.ref;c!==null&&(typeof c=="function"?c(null):c.current=null)}function gp(a,c,_){switch(Rn(c),c.tag){case L:case ge:case Oe:case le:{var T=c.updateQueue;if(T!==null){var R=T.lastEffect;if(R!==null){var j=R.next,V=_>Wn?Wn:_;_n(V,function(){var $r=j;do{var wi=$r.destroy;wi!==void 0&&zm(c,wi),$r=$r.next}while($r!==j)})}}break}case N:{vp(c);var te=c.stateNode;typeof te.componentWillUnmount=="function"&&tv(c,te);return}case W:{if(ci){var oe=c.dependencies;if(oe!==null){var Ie=oe.responders;if(Ie!==null){for(var Ye=Array.from(Ie.values()),pt=0,Nt=Ye.length;pt component higher in the tree to provide a loading indicator or placeholder to display.`+_r(_))}Rp(),T=cp(T,_);var Nt=c;do{switch(Nt.tag){case U:{var Vt=T;Nt.effectTag|=f0,Nt.expirationTime=R;var zt=uv(Nt,Vt,R);r2(Nt,zt);return}case N:var vn=T,xr=Nt.type,$r=Nt.stateNode;if((Nt.effectTag&Hr)===_i&&(typeof xr.getDerivedStateFromError=="function"||$r!==null&&typeof $r.componentDidCatch=="function"&&!Lp($r))){Nt.effectTag|=f0,Nt.expirationTime=R;var wi=ov(Nt,vn,R);r2(Nt,wi);return}break;default:break}Nt=Nt.return}while(Nt!==null)}var wa=Math.ceil,Cr=at.ReactCurrentDispatcher,Ep=at.ReactCurrentOwner,fl=at.IsSomeRendererActing,cu=0,E1=1,ki=2,Dp=4,F2=8,Do=16,Ss=32,Mf=0,b2=1,wp=2,D1=3,w1=4,Sp=5,Zn=cu,cl=null,qn=null,q0=lt,k0=Mf,P2=null,Ll=bn,S1=bn,Dc=null,wc=lt,I2=!1,Tp=0,M0=500,fn=null,B2=!1,U2=null,Sc=null,Tc=!1,Cc=null,T1=y0,Cp=lt,Ka=null,Km=50,xc=0,j2=null,sv=50,C1=0,Nf=null,Lf=null,x1=lt;function Fl(){return(Zn&(Do|Ss))!==cu?Ju(vt()):(x1!==lt||(x1=Ju(vt())),x1)}function Ac(){return Ju(vt())}function Ff(a,c,_){var T=c.mode;if((T&Y)===Sr)return bn;var R=Xt();if((T&Qr)===Sr)return R===Ci?bn:Qu;if((Zn&Do)!==cu)return q0;var j;if(_!==null)j=ia(a,_.timeoutMs|0||pf);else switch(R){case Ci:j=bn;break;case Xr:j=La(a);break;case Wn:case Xu:j=ms(a);break;case m0:j=Qi;break;default:throw Error("Expected a valid priority level")}return cl!==null&&j===q0&&(j-=1),j}function Xm(a,c){hy(),gy(a);var _=z2(a,c);if(_===null){my(a);return}Up(a,c),ta();var T=Xt();if(c===bn?(Zn&F2)!==cu&&(Zn&(Do|Ss))===cu?(H(_,c),A1(_)):(Uo(_),H(_,c),Zn===cu&&It()):(Uo(_),H(_,c)),(Zn&Dp)!==cu&&(T===Xr||T===Ci))if(Ka===null)Ka=new Map([[_,c]]);else{var R=Ka.get(_);(R===void 0||R>c)&&Ka.set(_,c)}}var dl=Xm;function z2(a,c){a.expirationTimeR?T:R}function Uo(a){var c=a.lastExpiredTime;if(c!==lt){a.callbackExpirationTime=bn,a.callbackPriority=Ci,a.callbackNode=En(A1.bind(null,a));return}var _=q2(a),T=a.callbackNode;if(_===lt){T!==null&&(a.callbackNode=null,a.callbackExpirationTime=lt,a.callbackPriority=y0);return}var R=Fl(),j=$1(R,_);if(T!==null){var V=a.callbackPriority,te=a.callbackExpirationTime;if(te===_&&V>=j)return;er(T)}a.callbackExpirationTime=_,a.callbackPriority=j;var oe;_===bn?oe=En(A1.bind(null,a)):oo?oe=yn(j,H2.bind(null,a)):oe=yn(j,H2.bind(null,a),{timeout:bo(_)-vt()}),a.callbackNode=oe}function H2(a,c){if(x1=lt,c){var _=Fl();return qp(a,_),Uo(a),null}var T=q2(a);if(T!==lt){var R=a.callbackNode;if((Zn&(Do|Ss))!==cu)throw Error("Should not already be working.");if(Xa(),(a!==cl||T!==q0)&&(bf(a,T),ee(a,T)),qn!==null){var j=Zn;Zn|=Do;var V=pv(a),te=W2(a);ff(qn);do try{oy();break}catch(Ye){dv(a,Ye)}while(!0);if(mt(),Zn=j,hv(V),Ln&&V2(te),k0===b2){var oe=P2;throw Bp(),bf(a,T),Bf(a,T),Uo(a),oe}if(qn!==null)Bp();else{Tv();var Ie=a.finishedWork=a.current.alternate;a.finishedExpirationTime=T,Qm(a,Ie,k0,T)}if(Uo(a),a.callbackNode===R)return H2.bind(null,a)}}return null}function Qm(a,c,_,T){switch(cl=null,_){case Mf:case b2:throw Error("Root did not complete. This is a bug in React.");case wp:{qp(a,T>Qi?Qi:T);break}case D1:{Bf(a,T);var R=a.lastSuspendedTime;T===R&&(a.nextKnownPendingLevel=Op(c)),d();var j=Ll===bn;if(j&&!(Y0&&If.current)){var V=Tp+M0-vt();if(V>10){if(I2){var te=a.lastPingedTime;if(te===lt||te>=T){a.lastPingedTime=T,bf(a,T);break}}var oe=q2(a);if(oe!==lt&&oe!==T)break;if(R!==lt&&R!==T){a.lastPingedTime=R;break}a.timeoutHandle=St(r0.bind(null,a),V);break}}r0(a);break}case w1:{Bf(a,T);var Ie=a.lastSuspendedTime;if(T===Ie&&(a.nextKnownPendingLevel=Op(c)),d(),!(Y0&&If.current)){if(I2){var Ye=a.lastPingedTime;if(Ye===lt||Ye>=T){a.lastPingedTime=T,bf(a,T);break}}var pt=q2(a);if(pt!==lt&&pt!==T)break;if(Ie!==lt&&Ie!==T){a.lastPingedTime=Ie;break}var Nt;if(S1!==bn)Nt=bo(S1)-vt();else if(Ll===bn)Nt=0;else{var Vt=_v(Ll),zt=vt(),vn=bo(T)-zt,xr=zt-Vt;xr<0&&(xr=0),Nt=Pp(xr)-xr,vn10){a.timeoutHandle=St(r0.bind(null,a),Nt);break}}r0(a);break}case Sp:{if(!(Y0&&If.current)&&Ll!==bn&&Dc!==null){var $r=Ip(Ll,T,Dc);if($r>10){Bf(a,T),a.timeoutHandle=St(r0.bind(null,a),$r);break}}r0(a);break}default:throw Error("Unknown root exit status.")}}function A1(a){var c=a.lastExpiredTime,_=c!==lt?c:bn;if(a.finishedExpirationTime===_)r0(a);else{if((Zn&(Do|Ss))!==cu)throw Error("Should not already be working.");if(Xa(),(a!==cl||_!==q0)&&(bf(a,_),ee(a,_)),qn!==null){var T=Zn;Zn|=Do;var R=pv(a),j=W2(a);ff(qn);do try{Ev();break}catch(te){dv(a,te)}while(!0);if(mt(),Zn=T,hv(R),Ln&&V2(j),k0===b2){var V=P2;throw Bp(),bf(a,_),Bf(a,_),Uo(a),V}if(qn!==null)throw Error("Cannot commit an incomplete root. This error is likely caused by a bug in React. Please file an issue.");Tv(),a.finishedWork=a.current.alternate,a.finishedExpirationTime=_,Jm(a,k0,_),Uo(a)}}return null}function Jm(a,c,_){cl=null,(c===D1||c===w1)&&d(),r0(a)}function Zm(a,c){qp(a,c),Uo(a),(Zn&(Do|Ss))===cu&&It()}function av(){if((Zn&(E1|Do|Ss))!==cu){(Zn&Do)!==cu&&Kt(!1,"unstable_flushDiscreteUpdates: Cannot flush updates when React is already rendering.");return}ey(),Xa()}function $m(a){return _n(Wn,a)}function fv(a,c,_,T){return _n(Ci,a.bind(null,c,_,T))}function ey(){if(Ka!==null){var a=Ka;Ka=null,a.forEach(function(c,_){qp(_,c),Uo(_)}),It()}}function ty(a,c){var _=Zn;Zn|=E1;try{return a(c)}finally{Zn=_,Zn===cu&&It()}}function ny(a,c){var _=Zn;Zn|=ki;try{return a(c)}finally{Zn=_,Zn===cu&&It()}}function cv(a,c,_,T){var R=Zn;Zn|=Dp;try{return _n(Xr,a.bind(null,c,_,T))}finally{Zn=R,Zn===cu&&It()}}function ry(a,c){var _=Zn;Zn&=~E1,Zn|=F2;try{return a(c)}finally{Zn=_,Zn===cu&&It()}}function xp(a,c){if((Zn&(Do|Ss))!==cu)throw Error("flushSync was called from inside a lifecycle method. It cannot be called when React is already rendering.");var _=Zn;Zn|=E1;try{return _n(Ci,a.bind(null,c))}finally{Zn=_,It()}}function iy(a){var c=Zn;Zn|=E1;try{_n(Ci,a)}finally{Zn=c,Zn===cu&&It()}}function bf(a,c){a.finishedWork=null,a.finishedExpirationTime=lt;var _=a.timeoutHandle;if(_!==Jo&&(a.timeoutHandle=Jo,so(_)),qn!==null)for(var T=qn.return;T!==null;)$h(T),T=T.return;cl=a,qn=wo(a.current,null,c),q0=c,k0=Mf,P2=null,Ll=bn,S1=bn,Dc=null,wc=lt,I2=!1,Ln&&(Lf=null),wl.discardPendingWarnings(),Ys=null}function dv(a,c){do{try{if(mt(),m2(),nt(),qn===null||qn.return===null)return k0=b2,P2=c,null;Zt&&qn.mode&Jr&&a1(qn,!0),lv(a,qn.return,qn,c,q0),qn=Dv(qn)}catch(_){c=_;continue}return}while(!0)}function pv(a){var c=Cr.current;return Cr.current=o1,c===null?o1:c}function hv(a){Cr.current=a}function W2(a){if(Ln){var c=k.__interactionsRef.current;return k.__interactionsRef.current=a.memoizedInteractions,c}return null}function V2(a){Ln&&(k.__interactionsRef.current=a)}function Ap(){Tp=vt()}function vv(a,c){aQi&&(Ll=a),c!==null&&aQi&&(S1=a,Dc=c)}function G2(a){a>wc&&(wc=a)}function mv(){k0===Mf&&(k0=D1)}function yv(){(k0===Mf||k0===D1)&&(k0=w1),wc!==lt&&cl!==null&&(Bf(cl,q0),o_(cl,wc))}function Rp(){k0!==Sp&&(k0=wp)}function gv(){return k0===Mf}function _v(a){var c=bo(a);return c-pf}function uy(a,c){var _=bo(a);return _-(c.timeoutMs|0||pf)}function Ev(){for(;qn!==null;)qn=Y2(qn)}function oy(){for(;qn!==null&&!kn();)qn=Y2(qn)}function Y2(a){var c=a.alternate;Kl(a),_t(a);var _;return Zt&&(a.mode&Jr)!==Sr?(zd(a),_=R1(c,a,q0),a1(a,!0)):_=R1(c,a,q0),nt(),a.memoizedProps=a.pendingProps,_===null&&(_=Dv(a)),Ep.current=null,_}function Dv(a){qn=a;do{var c=qn.alternate,_=qn.return;if((qn.effectTag&F0)===_i){_t(qn);var T=void 0;if(!Zt||(qn.mode&Jr)===Sr?T=Zh(c,qn,q0):(zd(qn),T=Zh(c,qn,q0),a1(qn,!1)),Yr(qn),nt(),ly(qn),T!==null)return T;if(_!==null&&(_.effectTag&F0)===_i){_.firstEffect===null&&(_.firstEffect=qn.firstEffect),qn.lastEffect!==null&&(_.lastEffect!==null&&(_.lastEffect.nextEffect=qn.firstEffect),_.lastEffect=qn.lastEffect);var R=qn.effectTag;R>eu&&(_.lastEffect!==null?_.lastEffect.nextEffect=qn:_.firstEffect=qn,_.lastEffect=qn)}}else{var j=Pm(qn,q0);if(Zt&&(qn.mode&Jr)!==Sr){a1(qn,!1);for(var V=qn.actualDuration,te=qn.child;te!==null;)V+=te.actualDuration,te=te.sibling;qn.actualDuration=V}if(j!==null)return fo(qn),j.effectTag&=Hl,j;Yr(qn),_!==null&&(_.firstEffect=_.lastEffect=null,_.effectTag|=F0)}var oe=qn.sibling;if(oe!==null)return oe;qn=_}while(qn!==null);return k0===Mf&&(k0=Sp),null}function Op(a){var c=a.expirationTime,_=a.childExpirationTime;return c>_?c:_}function ly(a){if(!(q0!==hi&&a.childExpirationTime===hi)){var c=lt;if(Zt&&(a.mode&Jr)!==Sr){for(var _=a.actualDuration,T=a.selfBaseDuration,R=a.alternate===null||a.child!==a.alternate.child,j=a.child;j!==null;){var V=j.expirationTime,te=j.childExpirationTime;V>c&&(c=V),te>c&&(c=te),R&&(_+=j.actualDuration),T+=j.treeBaseDuration,j=j.sibling}a.actualDuration=_,a.treeBaseDuration=T}else for(var oe=a.child;oe!==null;){var Ie=oe.expirationTime,Ye=oe.childExpirationTime;Ie>c&&(c=Ie),Ye>c&&(c=Ye),oe=oe.sibling}a.childExpirationTime=c}}function r0(a){var c=Xt();return _n(Ci,kp.bind(null,a,c)),null}function kp(a,c){do Xa();while(Cc!==null);if(vy(),(Zn&(Do|Ss))!==cu)throw Error("Should not already be working.");var _=a.finishedWork,T=a.finishedExpirationTime;if(_===null)return null;if(a.finishedWork=null,a.finishedExpirationTime=lt,_===a.current)throw Error("Cannot commit the same tree as before. This error is likely caused by a bug in React. Please file an issue.");a.callbackNode=null,a.callbackExpirationTime=lt,a.callbackPriority=y0,a.nextKnownPendingLevel=lt,J0();var R=Op(_);iE(a,T,R),a===cl&&(cl=null,qn=null,q0=lt);var j;if(_.effectTag>eu?_.lastEffect!==null?(_.lastEffect.nextEffect=_,j=_.firstEffect):j=_:j=_.firstEffect,j!==null){var V=Zn;Zn|=Ss;var te=W2(a);Ep.current=null,Te(),Bn(a.containerInfo),fn=j;do if(sl(null,sy,null),Jn()){if(fn===null)throw Error("Should be working on an effect.");var oe=Vs();Pf(fn,oe),fn=fn.nextEffect}while(fn!==null);et(),Zt&&Oh(),Ve(),fn=j;do if(sl(null,ay,null,a,c),Jn()){if(fn===null)throw Error("Should be working on an effect.");var Ie=Vs();Pf(fn,Ie),fn=fn.nextEffect}while(fn!==null);Gt(),Ir(a.containerInfo),a.current=_,Yt(),fn=j;do if(sl(null,Mp,null,a,T),Jn()){if(fn===null)throw Error("Should be working on an effect.");var Ye=Vs();Pf(fn,Ye),fn=fn.nextEffect}while(fn!==null);sr(),fn=null,se(),Ln&&V2(te),Zn=V}else a.current=_,Te(),et(),Zt&&Oh(),Ve(),Gt(),Yt(),sr();Z0();var pt=Tc;if(Tc)Tc=!1,Cc=a,Cp=T,T1=c;else for(fn=j;fn!==null;){var Nt=fn.nextEffect;fn.nextEffect=null,fn=Nt}var Vt=a.firstPendingTime;if(Vt!==lt){if(Ln){if(Lf!==null){var zt=Lf;Lf=null;for(var vn=0;vnWn?Wn:T1;return T1=y0,_n(a,Np)}}function Np(){if(Cc===null)return!1;var a=Cc,c=Cp;if(Cc=null,Cp=lt,(Zn&(Do|Ss))!==cu)throw Error("Cannot flush passive effects while already rendering.");var _=Zn;Zn|=Ss;for(var T=W2(a),R=a.current.firstEffect;R!==null;){{if(_t(R),sl(null,Ea,null,R),Jn()){if(R===null)throw Error("Should be working on an effect.");var j=Vs();Pf(R,j)}nt()}var V=R.nextEffect;R.nextEffect=null,R=V}return Ln&&(V2(T),de(a,c)),Zn=_,It(),C1=Cc===null?0:C1+1,!0}function Lp(a){return Sc!==null&&Sc.has(a)}function Fp(a){Sc===null?Sc=new Set([a]):Sc.add(a)}function fy(a){B2||(B2=!0,U2=a)}var cy=fy;function wv(a,c,_){var T=cp(_,c),R=uv(a,T,bn);Ua(a,R);var j=z2(a,bn);j!==null&&(Uo(j),H(j,bn))}function Pf(a,c){if(a.tag===U){wv(a,a,c);return}for(var _=a.return;_!==null;){if(_.tag===U){wv(_,a,c);return}else if(_.tag===N){var T=_.type,R=_.stateNode;if(typeof T.getDerivedStateFromError=="function"||typeof R.componentDidCatch=="function"&&!Lp(R)){var j=cp(c,a),V=ov(_,j,bn);Ua(_,V);var te=z2(_,bn);te!==null&&(Uo(te),H(te,bn));return}}_=_.return}}function bp(a,c,_){var T=a.pingCache;if(T!==null&&T.delete(c),cl===a&&q0===_){k0===w1||k0===D1&&Ll===bn&&vt()-TpKm)throw xc=0,j2=null,Error("Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.");C1>sv&&(C1=0,Kt(!1,"Maximum update depth exceeded. This can happen when a component calls setState inside useEffect, but useEffect either doesn't have a dependency array, or one of the dependencies changes on every render."))}function vy(){wl.flushLegacyContextWarning(),fi&&wl.flushPendingUnsafeLifecycleWarnings()}function Tv(){var a=!0;cf(Nf,a),Nf=null}function Bp(){var a=!1;cf(Nf,a),Nf=null}function Up(a,c){Pr&&cl!==null&&c>q0&&(Nf=a)}var K2=null;function my(a){{var c=a.tag;if(c!==U&&c!==N&&c!==L&&c!==ge&&c!==Oe&&c!==le)return;var _=qt(a.type)||"ReactComponent";if(K2!==null){if(K2.has(_))return;K2.add(_)}else K2=new Set([_]);Ke(!1,"Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in %s.%s",c===N?"the componentWillUnmount method":"a useEffect cleanup function",_r(a))}}var R1;if(G0){var yy=null;R1=function(a,c,_){var T=i_(yy,c);try{return op(a,c,_)}catch(j){if(j!==null&&typeof j=="object"&&typeof j.then=="function")throw j;if(mt(),m2(),$h(c),i_(c,T),Zt&&c.mode&Jr&&zd(c),sl(null,op,null,a,c,_),Jn()){var R=Vs();throw R}else throw j}}}else R1=op;var Cv=!1,xv=!1;function gy(a){if(a.tag===N)switch(Ar){case"getChildContext":if(xv)return;Ke(!1,"setState(...): Cannot call setState() inside getChildContext()"),xv=!0;break;case"render":if(Cv)return;Ke(!1,"Cannot update during an existing state transition (such as within `render`). Render methods should be a pure function of props and state."),Cv=!0;break}}var If={current:!1};function jp(a){fs===!0&&fl.current===!0&&If.current!==!0&&Ke(!1,`It looks like you're using the wrong act() around your test interactions. +Be sure to use the matching version of act() corresponding to your renderer: + +// for react-dom: +import {act} from 'react-dom/test-utils'; +// ... +act(() => ...); + +// for react-test-renderer: +import TestRenderer from 'react-test-renderer'; +const {act} = TestRenderer; +// ... +act(() => ...);%s`,_r(a))}function Av(a){fs===!0&&(a.mode&cr)!==Sr&&fl.current===!1&&If.current===!1&&Ke(!1,`An update to %s ran an effect, but was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://fb.me/react-wrap-tests-with-act%s`,qt(a.type),_r(a))}function _y(a){fs===!0&&Zn===cu&&fl.current===!1&&If.current===!1&&Ke(!1,`An update to %s inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://fb.me/react-wrap-tests-with-act%s`,qt(a.type),_r(a))}var Ey=_y,zp=!1;function Dy(a){zp===!1&&t.unstable_flushAllWithoutAsserting===void 0&&(a.mode&Y||a.mode&Qr?(zp=!0,Ke(!1,`In Concurrent or Sync modes, the "scheduler" module needs to be mocked to guarantee consistent behaviour across tests and browsers. For example, with jest: +jest.mock('scheduler', () => require('scheduler/unstable_mock')); + +For more info, visit https://fb.me/react-mock-scheduler`)):Yi===!0&&(zp=!0,Ke(!1,`Starting from React v17, the "scheduler" module will need to be mocked to guarantee consistent behaviour across tests and browsers. For example, with jest: +jest.mock('scheduler', () => require('scheduler/unstable_mock')); + +For more info, visit https://fb.me/react-mock-scheduler`)))}var Ys=null;function wy(a){{var c=Xt();if((a.mode&Qr)!==_i&&(c===Xr||c===Ci))for(var _=a;_!==null;){var T=_.alternate;if(T!==null)switch(_.tag){case N:var R=T.updateQueue;if(R!==null)for(var j=R.firstUpdate;j!==null;){var V=j.priority;if(V===Xr||V===Ci){Ys===null?Ys=new Set([qt(_.type)]):Ys.add(qt(_.type));break}j=j.next}break;case L:case ge:case le:if(_.memoizedState!==null&&_.memoizedState.baseUpdate!==null)for(var te=_.memoizedState.baseUpdate;te!==null;){var oe=te.priority;if(oe===Xr||oe===Ci){Ys===null?Ys=new Set([qt(_.type)]):Ys.add(qt(_.type));break}if(te.next===_.memoizedState.baseUpdate)break;te=te.next}break;default:break}_=_.return}}}function d(){if(Ys!==null){var a=[];Ys.forEach(function(c){return a.push(c)}),Ys=null,a.length>0&&Ke(!1,`%s triggered a user-blocking update that suspended. + +The fix is to split the update into multiple parts: a user-blocking update to provide immediate feedback, and another update that triggers the bulk of the changes. + +Refer to the documentation for useTransition to learn how to implement this pattern.`,a.sort().join(", "))}}function v(a,c){return c*1e3+a.interactionThreadID}function x(a){!Ln||(Lf===null?Lf=[a]:Lf.push(a))}function b(a,c,_){if(!!Ln&&_.size>0){var T=a.pendingInteractionMap,R=T.get(c);R!=null?_.forEach(function(te){R.has(te)||te.__count++,R.add(te)}):(T.set(c,new Set(_)),_.forEach(function(te){te.__count++}));var j=k.__subscriberRef.current;if(j!==null){var V=v(a,c);j.onWorkScheduled(_,V)}}}function H(a,c){!Ln||b(a,c,k.__interactionsRef.current)}function ee(a,c){if(!!Ln){var _=new Set;if(a.pendingInteractionMap.forEach(function(j,V){V>=c&&j.forEach(function(te){return _.add(te)})}),a.memoizedInteractions=_,_.size>0){var T=k.__subscriberRef.current;if(T!==null){var R=v(a,c);try{T.onWorkStarted(_,R)}catch(j){yn(Ci,function(){throw j})}}}}}function de(a,c){if(!!Ln){var _=a.firstPendingTime,T;try{if(T=k.__subscriberRef.current,T!==null&&a.memoizedInteractions.size>0){var R=v(a,c);T.onWorkStopped(a.memoizedInteractions,R)}}catch(V){yn(Ci,function(){throw V})}finally{var j=a.pendingInteractionMap;j.forEach(function(V,te){te>_&&(j.delete(te),V.forEach(function(oe){if(oe.__count--,T!==null&&oe.__count===0)try{T.onInteractionScheduledWorkCompleted(oe)}catch(Ie){yn(Ci,function(){throw Ie})}}))})}}}var ye=null,be=null,gt=!1,Dt=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__!="undefined";function Rt(a){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__=="undefined")return!1;var c=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(c.isDisabled)return!0;if(!c.supportsFiber)return Ke(!1,"The installed version of React DevTools is too old and will not work with the current version of React. Please update React DevTools. https://fb.me/react-devtools"),!0;try{var _=c.inject(a);ye=function(T,R){try{var j=(T.current.effectTag&Hr)===Hr;if(Zt){var V=Ac(),te=$1(V,R);c.onCommitFiberRoot(_,T,te,j)}else c.onCommitFiberRoot(_,T,void 0,j)}catch(oe){gt||(gt=!0,Ke(!1,"React DevTools encountered an error: %s",oe))}},be=function(T){try{c.onCommitFiberUnmount(_,T)}catch(R){gt||(gt=!0,Ke(!1,"React DevTools encountered an error: %s",R))}}}catch(T){Ke(!1,"React DevTools encountered an error: %s.",T)}return!0}function rn(a,c){typeof ye=="function"&&ye(a,c)}function Rn(a){typeof be=="function"&&be(a)}var $n;{$n=!1;try{var Nr=Object.preventExtensions({}),ir=new Map([[Nr,null]]),Zr=new Set([Nr]);ir.set(0,0),Zr.add(0)}catch(a){$n=!0}}var ui=1;function bl(a,c,_,T){this.tag=a,this.key=_,this.elementType=null,this.type=null,this.stateNode=null,this.return=null,this.child=null,this.sibling=null,this.index=0,this.ref=null,this.pendingProps=c,this.memoizedProps=null,this.updateQueue=null,this.memoizedState=null,this.dependencies=null,this.mode=T,this.effectTag=_i,this.nextEffect=null,this.firstEffect=null,this.lastEffect=null,this.expirationTime=lt,this.childExpirationTime=lt,this.alternate=null,Zt&&(this.actualDuration=Number.NaN,this.actualStartTime=Number.NaN,this.selfBaseDuration=Number.NaN,this.treeBaseDuration=Number.NaN,this.actualDuration=0,this.actualStartTime=-1,this.selfBaseDuration=0,this.treeBaseDuration=0),Pr&&(this._debugID=ui++,this._debugIsCurrentlyTiming=!1),this._debugSource=null,this._debugOwner=null,this._debugNeedsRemount=!1,this._debugHookTypes=null,!$n&&typeof Object.preventExtensions=="function"&&Object.preventExtensions(this)}var Wi=function(a,c,_,T){return new bl(a,c,_,T)};function uo(a){var c=a.prototype;return!!(c&&c.isReactComponent)}function i0(a){return typeof a=="function"&&!uo(a)&&a.defaultProps===void 0}function Ts(a){if(typeof a=="function")return uo(a)?N:L;if(a!=null){var c=a.$$typeof;if(c===An)return ge;if(c===Wt)return Oe}return C}function wo(a,c,_){var T=a.alternate;T===null?(T=Wi(a.tag,c,a.key,a.mode),T.elementType=a.elementType,T.type=a.type,T.stateNode=a.stateNode,T._debugID=a._debugID,T._debugSource=a._debugSource,T._debugOwner=a._debugOwner,T._debugHookTypes=a._debugHookTypes,T.alternate=a,a.alternate=T):(T.pendingProps=c,T.effectTag=_i,T.nextEffect=null,T.firstEffect=null,T.lastEffect=null,Zt&&(T.actualDuration=0,T.actualStartTime=-1)),T.childExpirationTime=a.childExpirationTime,T.expirationTime=a.expirationTime,T.child=a.child,T.memoizedProps=a.memoizedProps,T.memoizedState=a.memoizedState,T.updateQueue=a.updateQueue;var R=a.dependencies;switch(T.dependencies=R===null?null:{expirationTime:R.expirationTime,firstContext:R.firstContext,responders:R.responders},T.sibling=a.sibling,T.index=a.index,T.ref=a.ref,Zt&&(T.selfBaseDuration=a.selfBaseDuration,T.treeBaseDuration=a.treeBaseDuration),T._debugNeedsRemount=a._debugNeedsRemount,T.tag){case C:case L:case le:T.type=Zu(a.type);break;case N:T.type=U0(a.type);break;case ge:T.type=vf(a.type);break;default:break}return T}function Rv(a,c){a.effectTag&=ai,a.nextEffect=null,a.firstEffect=null,a.lastEffect=null;var _=a.alternate;if(_===null)a.childExpirationTime=lt,a.expirationTime=c,a.child=null,a.memoizedProps=null,a.memoizedState=null,a.updateQueue=null,a.dependencies=null,Zt&&(a.selfBaseDuration=0,a.treeBaseDuration=0);else{a.childExpirationTime=_.childExpirationTime,a.expirationTime=_.expirationTime,a.child=_.child,a.memoizedProps=_.memoizedProps,a.memoizedState=_.memoizedState,a.updateQueue=_.updateQueue;var T=_.dependencies;a.dependencies=T===null?null:{expirationTime:T.expirationTime,firstContext:T.firstContext,responders:T.responders},Zt&&(a.selfBaseDuration=_.selfBaseDuration,a.treeBaseDuration=_.treeBaseDuration)}return a}function X4(a){var c;return a===R0?c=Qr|Y|cr:a===I0?c=Y|cr:c=Sr,Zt&&Dt&&(c|=Jr),Wi(U,null,null,c)}function Sy(a,c,_,T,R,j){var V,te=C,oe=a;if(typeof a=="function")uo(a)?(te=N,oe=U0(oe)):oe=Zu(oe);else if(typeof a=="string")te=W;else{e:switch(a){case ue:return Qa(_.children,R,j,c);case ln:te=we,R|=Qr|Y|cr;break;case je:te=we,R|=cr;break;case ct:return J4(_,R,j,c);case nr:return Z4(_,R,j,c);case un:return $4(_,R,j,c);default:{if(typeof a=="object"&&a!==null)switch(a.$$typeof){case At:te=he;break e;case en:te=Se;break e;case An:te=ge,oe=vf(oe);break e;case Wt:te=Oe;break e;case vr:te=Ue,oe=null;break e;case w:if(Ht)return r_(a,_,R,j,c);break;case Vn:if(Du)return Q4(a,_,R,j,c)}var Ie="";{(a===void 0||typeof a=="object"&&a!==null&&Object.keys(a).length===0)&&(Ie+=" You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.");var Ye=T?qt(T.type):null;Ye&&(Ie+=` + +Check the render method of \``+Ye+"`.")}throw Error("Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: "+(a==null?a:typeof a)+"."+Ie)}}}return V=Wi(te,_,c,R),V.elementType=a,V.type=oe,V.expirationTime=j,V}function Ty(a,c,_){var T=null;T=a._owner;var R=a.type,j=a.key,V=a.props,te=Sy(R,j,V,T,c,_);return te._debugSource=a._source,te._debugOwner=a._owner,te}function Qa(a,c,_,T){var R=Wi(m,a,T,c);return R.expirationTime=_,R}function r_(a,c,_,T,R){var j=Wi(xt,c,R,_);return j.elementType=a,j.type=a,j.expirationTime=T,j}function Q4(a,c,_,T,R){var j=Wi($e,c,R,_);return j.type=a,j.elementType=a,j.expirationTime=T,j}function J4(a,c,_,T){(typeof a.id!="string"||typeof a.onRender!="function")&&Ke(!1,'Profiler must specify an "id" string and "onRender" function as props');var R=Wi(ze,a,T,c|Jr);return R.elementType=ct,R.type=ct,R.expirationTime=_,R}function Z4(a,c,_,T){var R=Wi(pe,a,T,c);return R.type=nr,R.elementType=nr,R.expirationTime=_,R}function $4(a,c,_,T){var R=Wi(wt,a,T,c);return R.type=un,R.elementType=un,R.expirationTime=_,R}function Cy(a,c,_){var T=Wi(ne,a,null,c);return T.expirationTime=_,T}function eE(){var a=Wi(W,null,null,Sr);return a.elementType="DELETED",a.type="DELETED",a}function tE(a){var c=Wi(rt,null,null,Sr);return c.stateNode=a,c}function xy(a,c,_){var T=a.children!==null?a.children:[],R=Wi(q,T,a.key,c);return R.expirationTime=_,R.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation},R}function i_(a,c){return a===null&&(a=Wi(C,null,null,Sr)),a.tag=c.tag,a.key=c.key,a.elementType=c.elementType,a.type=c.type,a.stateNode=c.stateNode,a.return=c.return,a.child=c.child,a.sibling=c.sibling,a.index=c.index,a.ref=c.ref,a.pendingProps=c.pendingProps,a.memoizedProps=c.memoizedProps,a.updateQueue=c.updateQueue,a.memoizedState=c.memoizedState,a.dependencies=c.dependencies,a.mode=c.mode,a.effectTag=c.effectTag,a.nextEffect=c.nextEffect,a.firstEffect=c.firstEffect,a.lastEffect=c.lastEffect,a.expirationTime=c.expirationTime,a.childExpirationTime=c.childExpirationTime,a.alternate=c.alternate,Zt&&(a.actualDuration=c.actualDuration,a.actualStartTime=c.actualStartTime,a.selfBaseDuration=c.selfBaseDuration,a.treeBaseDuration=c.treeBaseDuration),a._debugID=c._debugID,a._debugSource=c._debugSource,a._debugOwner=c._debugOwner,a._debugIsCurrentlyTiming=c._debugIsCurrentlyTiming,a._debugNeedsRemount=c._debugNeedsRemount,a._debugHookTypes=c._debugHookTypes,a}function nE(a,c,_){this.tag=c,this.current=null,this.containerInfo=a,this.pendingChildren=null,this.pingCache=null,this.finishedExpirationTime=lt,this.finishedWork=null,this.timeoutHandle=Jo,this.context=null,this.pendingContext=null,this.hydrate=_,this.callbackNode=null,this.callbackPriority=y0,this.firstPendingTime=lt,this.firstSuspendedTime=lt,this.lastSuspendedTime=lt,this.nextKnownPendingLevel=lt,this.lastPingedTime=lt,this.lastExpiredTime=lt,Ln&&(this.interactionThreadID=k.unstable_getThreadID(),this.memoizedInteractions=new Set,this.pendingInteractionMap=new Map),Ui&&(this.hydrationCallbacks=null)}function rE(a,c,_,T){var R=new nE(a,c,_);Ui&&(R.hydrationCallbacks=T);var j=X4(c);return R.current=j,j.stateNode=R,R}function u_(a,c){var _=a.firstSuspendedTime,T=a.lastSuspendedTime;return _!==lt&&_>=c&&T<=c}function Bf(a,c){var _=a.firstSuspendedTime,T=a.lastSuspendedTime;_c||_===lt)&&(a.lastSuspendedTime=c),c<=a.lastPingedTime&&(a.lastPingedTime=lt),c<=a.lastExpiredTime&&(a.lastExpiredTime=lt)}function o_(a,c){var _=a.firstPendingTime;c>_&&(a.firstPendingTime=c);var T=a.firstSuspendedTime;T!==lt&&(c>=T?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=lt:c>=a.lastSuspendedTime&&(a.lastSuspendedTime=c+1),c>a.nextKnownPendingLevel&&(a.nextKnownPendingLevel=c))}function iE(a,c,_){a.firstPendingTime=_,c<=a.lastSuspendedTime?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=lt:c<=a.firstSuspendedTime&&(a.firstSuspendedTime=c-1),c<=a.lastPingedTime&&(a.lastPingedTime=lt),c<=a.lastExpiredTime&&(a.lastExpiredTime=lt)}function qp(a,c){var _=a.lastExpiredTime;(_===lt||_>c)&&(a.lastExpiredTime=c)}var uE={debugTool:null},Ov=uE,Ay,Ry;Ay=!1,Ry={};function oE(a){if(!a)return Sn;var c=jt(a),_=El(c);if(c.tag===N){var T=c.type;if(zi(T))return A0(c,T,_)}return _}function Oy(a){var c=jt(a);if(c===void 0)throw typeof a.render=="function"?Error("Unable to find node on an unmounted component."):Error("Argument appears to not be a ReactComponent. Keys: "+Object.keys(a));var _=b0(c);return _===null?null:_.stateNode}function lE(a,c){{var _=jt(a);if(_===void 0)throw typeof a.render=="function"?Error("Unable to find node on an unmounted component."):Error("Argument appears to not be a ReactComponent. Keys: "+Object.keys(a));var T=b0(_);if(T===null)return null;if(T.mode&cr){var R=qt(_.type)||"Component";Ry[R]||(Ry[R]=!0,_.mode&cr?Ke(!1,"%s is deprecated in StrictMode. %s was passed an instance of %s which is inside StrictMode. Instead, add a ref directly to the element you want to reference. Learn more about using refs safely here: https://fb.me/react-strict-mode-find-node%s",c,c,R,_r(T)):Ke(!1,"%s is deprecated in StrictMode. %s was passed an instance of %s which renders StrictMode children. Instead, add a ref directly to the element you want to reference. Learn more about using refs safely here: https://fb.me/react-strict-mode-find-node%s",c,c,R,_r(T)))}return T.stateNode}return Oy(a)}function sE(a,c,_,T){return rE(a,c,_,T)}function l_(a,c,_,T){var R=c.current,j=Fl();typeof jest!="undefined"&&(Dy(R),jp(R));var V=mo(),te=Ff(j,R,V);Ov.debugTool&&(R.alternate===null?Ov.debugTool.onMountContainer(c):a===null?Ov.debugTool.onUnmountContainer(c):Ov.debugTool.onUpdateContainer(c));var oe=oE(_);c.context===null?c.context=oe:c.pendingContext=oe,Ar==="render"&&Cn!==null&&!Ay&&(Ay=!0,Ke(!1,`Render methods should be a pure function of props and state; triggering nested component updates from render is not allowed. If necessary, trigger nested updates in componentDidUpdate. + +Check the render method of %s.`,qt(Cn.type)||"Unknown"));var Ie=gu(te,V);return Ie.payload={element:a},T=T===void 0?null:T,T!==null&&(typeof T!="function"&&Ke(!1,"render(...): Expected the last optional `callback` argument to be a function. Instead received: %s.",T),Ie.callback=T),Ua(R,Ie),dl(R,te),te}function aE(a){var c=a.current;if(!c.child)return null;switch(c.child.tag){case W:return Ro(c.child.stateNode);default:return c.child.stateNode}}function fE(a){switch(a.tag){case U:var c=a.stateNode;c.hydrate&&Zm(c,c.firstPendingTime);break;case pe:xp(function(){return dl(a,bn)});var _=La(Fl());kv(a,_);break}}function s_(a,c){var _=a.memoizedState;_!==null&&_.dehydrated!==null&&_.retryTime=c.length)return T;var R=c[_],j=Array.isArray(a)?a.slice():f({},a);return j[R]=Ny(a[R],c,_+1,T),j},h_=function(a,c,_){return Ny(a,c,0,_)};f_=function(a,c,_,T){for(var R=a.memoizedState;R!==null&&c>0;)R=R.next,c--;if(R!==null){var j=h_(R.memoizedState,_,T);R.memoizedState=j,R.baseState=j,a.memoizedProps=f({},a.memoizedProps),dl(a,bn)}},c_=function(a,c,_){a.pendingProps=h_(a.memoizedProps,c,_),a.alternate&&(a.alternate.pendingProps=a.pendingProps),dl(a,bn)},d_=function(a){dl(a,bn)},p_=function(a){My=a}}function hE(a){var c=a.findFiberByHostInstance,_=at.ReactCurrentDispatcher;return Rt(f({},a,{overrideHookState:f_,overrideProps:c_,setSuspenseHandler:p_,scheduleUpdate:d_,currentDispatcherRef:_,findHostInstanceByFiber:function(T){var R=b0(T);return R===null?null:R.stateNode},findFiberByHostInstance:function(T){return c?c(T):null},findHostInstancesForRefresh:n2,scheduleRefresh:Sl,scheduleRoot:_s,setRefreshHandler:Ia,getCurrentFiber:function(){return Cn}}))}var v_=Object.freeze({createContainer:sE,updateContainer:l_,batchedEventUpdates:ny,batchedUpdates:ty,unbatchedUpdates:ry,deferredUpdates:$m,syncUpdates:fv,discreteUpdates:cv,flushDiscreteUpdates:av,flushControlled:iy,flushSync:xp,flushPassiveEffects:Xa,IsThisRendererActing:If,getPublicRootInstance:aE,attemptSynchronousHydration:fE,attemptUserBlockingHydration:cE,attemptContinuousHydration:ky,attemptHydrationAtCurrentPriority:dE,findHostInstance:Oy,findHostInstanceWithWarning:lE,findHostInstanceWithNoPortals:pE,shouldSuspend:a_,injectIntoDevTools:hE}),vE=v_.default||v_;hg.exports=vE;var mE=hg.exports;return hg.exports=i,mE})});var D9=ce((zne,cw)=>{"use strict";process.env.NODE_ENV==="production"?cw.exports=m9():cw.exports=E9()});var S9=ce((qne,w9)=>{"use strict";var ZK={ALIGN_COUNT:8,ALIGN_AUTO:0,ALIGN_FLEX_START:1,ALIGN_CENTER:2,ALIGN_FLEX_END:3,ALIGN_STRETCH:4,ALIGN_BASELINE:5,ALIGN_SPACE_BETWEEN:6,ALIGN_SPACE_AROUND:7,DIMENSION_COUNT:2,DIMENSION_WIDTH:0,DIMENSION_HEIGHT:1,DIRECTION_COUNT:3,DIRECTION_INHERIT:0,DIRECTION_LTR:1,DIRECTION_RTL:2,DISPLAY_COUNT:2,DISPLAY_FLEX:0,DISPLAY_NONE:1,EDGE_COUNT:9,EDGE_LEFT:0,EDGE_TOP:1,EDGE_RIGHT:2,EDGE_BOTTOM:3,EDGE_START:4,EDGE_END:5,EDGE_HORIZONTAL:6,EDGE_VERTICAL:7,EDGE_ALL:8,EXPERIMENTAL_FEATURE_COUNT:1,EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS:0,FLEX_DIRECTION_COUNT:4,FLEX_DIRECTION_COLUMN:0,FLEX_DIRECTION_COLUMN_REVERSE:1,FLEX_DIRECTION_ROW:2,FLEX_DIRECTION_ROW_REVERSE:3,JUSTIFY_COUNT:6,JUSTIFY_FLEX_START:0,JUSTIFY_CENTER:1,JUSTIFY_FLEX_END:2,JUSTIFY_SPACE_BETWEEN:3,JUSTIFY_SPACE_AROUND:4,JUSTIFY_SPACE_EVENLY:5,LOG_LEVEL_COUNT:6,LOG_LEVEL_ERROR:0,LOG_LEVEL_WARN:1,LOG_LEVEL_INFO:2,LOG_LEVEL_DEBUG:3,LOG_LEVEL_VERBOSE:4,LOG_LEVEL_FATAL:5,MEASURE_MODE_COUNT:3,MEASURE_MODE_UNDEFINED:0,MEASURE_MODE_EXACTLY:1,MEASURE_MODE_AT_MOST:2,NODE_TYPE_COUNT:2,NODE_TYPE_DEFAULT:0,NODE_TYPE_TEXT:1,OVERFLOW_COUNT:3,OVERFLOW_VISIBLE:0,OVERFLOW_HIDDEN:1,OVERFLOW_SCROLL:2,POSITION_TYPE_COUNT:2,POSITION_TYPE_RELATIVE:0,POSITION_TYPE_ABSOLUTE:1,PRINT_OPTIONS_COUNT:3,PRINT_OPTIONS_LAYOUT:1,PRINT_OPTIONS_STYLE:2,PRINT_OPTIONS_CHILDREN:4,UNIT_COUNT:4,UNIT_UNDEFINED:0,UNIT_POINT:1,UNIT_PERCENT:2,UNIT_AUTO:3,WRAP_COUNT:3,WRAP_NO_WRAP:0,WRAP_WRAP:1,WRAP_WRAP_REVERSE:2};w9.exports=ZK});var A9=ce((Hne,T9)=>{"use strict";var $K=Object.assign||function(i){for(var o=1;o"}}]),i}(),C9=function(){v4(i,null,[{key:"fromJS",value:function(f){var p=f.width,E=f.height;return new i(p,E)}}]);function i(o,f){pw(this,i),this.width=o,this.height=f}return v4(i,[{key:"fromJS",value:function(f){f(this.width,this.height)}},{key:"toString",value:function(){return""}}]),i}(),x9=function(){function i(o,f){pw(this,i),this.unit=o,this.value=f}return v4(i,[{key:"fromJS",value:function(f){f(this.unit,this.value)}},{key:"toString",value:function(){switch(this.unit){case Jf.UNIT_POINT:return String(this.value);case Jf.UNIT_PERCENT:return this.value+"%";case Jf.UNIT_AUTO:return"auto";default:return this.value+"?"}}},{key:"valueOf",value:function(){return this.value}}]),i}();T9.exports=function(i,o){function f(k,L,N){var C=k[L];k[L]=function(){for(var U=arguments.length,q=Array(U),W=0;W1?q-1:0),ne=1;ne1&&arguments[1]!==void 0?arguments[1]:NaN,N=arguments.length>2&&arguments[2]!==void 0?arguments[2]:NaN,C=arguments.length>3&&arguments[3]!==void 0?arguments[3]:Jf.DIRECTION_LTR;return k.call(this,L,N,C)}),$K({Config:o.Config,Node:o.Node,Layout:i("Layout",eX),Size:i("Size",C9),Value:i("Value",x9),getInstanceCount:function(){return o.getInstanceCount.apply(o,arguments)}},Jf)}});var R9=ce((exports,module)=>{(function(i,o){typeof define=="function"&&define.amd?define([],function(){return o}):typeof module=="object"&&module.exports?module.exports=o:(i.nbind=i.nbind||{}).init=o})(exports,function(Module,cb){typeof Module=="function"&&(cb=Module,Module={}),Module.onRuntimeInitialized=function(i,o){return function(){i&&i.apply(this,arguments);try{Module.ccall("nbind_init")}catch(f){o(f);return}o(null,{bind:Module._nbind_value,reflect:Module.NBind.reflect,queryType:Module.NBind.queryType,toggleLightGC:Module.toggleLightGC,lib:Module})}}(Module.onRuntimeInitialized,cb);var Module;Module||(Module=(typeof Module!="undefined"?Module:null)||{});var moduleOverrides={};for(var key in Module)Module.hasOwnProperty(key)&&(moduleOverrides[key]=Module[key]);var ENVIRONMENT_IS_WEB=!1,ENVIRONMENT_IS_WORKER=!1,ENVIRONMENT_IS_NODE=!1,ENVIRONMENT_IS_SHELL=!1;if(Module.ENVIRONMENT)if(Module.ENVIRONMENT==="WEB")ENVIRONMENT_IS_WEB=!0;else if(Module.ENVIRONMENT==="WORKER")ENVIRONMENT_IS_WORKER=!0;else if(Module.ENVIRONMENT==="NODE")ENVIRONMENT_IS_NODE=!0;else if(Module.ENVIRONMENT==="SHELL")ENVIRONMENT_IS_SHELL=!0;else throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.");else ENVIRONMENT_IS_WEB=typeof window=="object",ENVIRONMENT_IS_WORKER=typeof importScripts=="function",ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof require=="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER,ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){Module.print||(Module.print=console.log),Module.printErr||(Module.printErr=console.warn);var nodeFS,nodePath;Module.read=function(o,f){nodeFS||(nodeFS={}("")),nodePath||(nodePath={}("")),o=nodePath.normalize(o);var p=nodeFS.readFileSync(o);return f?p:p.toString()},Module.readBinary=function(o){var f=Module.read(o,!0);return f.buffer||(f=new Uint8Array(f)),assert(f.buffer),f},Module.load=function(o){globalEval(read(o))},Module.thisProgram||(process.argv.length>1?Module.thisProgram=process.argv[1].replace(/\\/g,"/"):Module.thisProgram="unknown-program"),Module.arguments=process.argv.slice(2),typeof module!="undefined"&&(module.exports=Module),Module.inspect=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL)Module.print||(Module.print=print),typeof printErr!="undefined"&&(Module.printErr=printErr),typeof read!="undefined"?Module.read=read:Module.read=function(){throw"no read() available"},Module.readBinary=function(o){if(typeof readbuffer=="function")return new Uint8Array(readbuffer(o));var f=read(o,"binary");return assert(typeof f=="object"),f},typeof scriptArgs!="undefined"?Module.arguments=scriptArgs:typeof arguments!="undefined"&&(Module.arguments=arguments),typeof quit=="function"&&(Module.quit=function(i,o){quit(i)});else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(Module.read=function(o){var f=new XMLHttpRequest;return f.open("GET",o,!1),f.send(null),f.responseText},ENVIRONMENT_IS_WORKER&&(Module.readBinary=function(o){var f=new XMLHttpRequest;return f.open("GET",o,!1),f.responseType="arraybuffer",f.send(null),new Uint8Array(f.response)}),Module.readAsync=function(o,f,p){var E=new XMLHttpRequest;E.open("GET",o,!0),E.responseType="arraybuffer",E.onload=function(){E.status==200||E.status==0&&E.response?f(E.response):p()},E.onerror=p,E.send(null)},typeof arguments!="undefined"&&(Module.arguments=arguments),typeof console!="undefined")Module.print||(Module.print=function(o){console.log(o)}),Module.printErr||(Module.printErr=function(o){console.warn(o)});else{var TRY_USE_DUMP=!1;Module.print||(Module.print=TRY_USE_DUMP&&typeof dump!="undefined"?function(i){dump(i)}:function(i){})}ENVIRONMENT_IS_WORKER&&(Module.load=importScripts),typeof Module.setWindowTitle=="undefined"&&(Module.setWindowTitle=function(i){document.title=i})}else throw"Unknown runtime environment. Where are we?";function globalEval(i){eval.call(null,i)}!Module.load&&Module.read&&(Module.load=function(o){globalEval(Module.read(o))}),Module.print||(Module.print=function(){}),Module.printErr||(Module.printErr=Module.print),Module.arguments||(Module.arguments=[]),Module.thisProgram||(Module.thisProgram="./this.program"),Module.quit||(Module.quit=function(i,o){throw o}),Module.print=Module.print,Module.printErr=Module.printErr,Module.preRun=[],Module.postRun=[];for(var key in moduleOverrides)moduleOverrides.hasOwnProperty(key)&&(Module[key]=moduleOverrides[key]);moduleOverrides=void 0;var Runtime={setTempRet0:function(i){return tempRet0=i,i},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(i){STACKTOP=i},getNativeTypeSize:function(i){switch(i){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(i[i.length-1]==="*")return Runtime.QUANTUM_SIZE;if(i[0]==="i"){var o=parseInt(i.substr(1));return assert(o%8==0),o/8}else return 0}}},getNativeFieldSize:function(i){return Math.max(Runtime.getNativeTypeSize(i),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(i,o){return o==="double"||o==="i64"?i&7&&(assert((i&7)==4),i+=4):assert((i&3)==0),i},getAlignSize:function(i,o,f){return!f&&(i=="i64"||i=="double")?8:i?Math.min(o||(i?Runtime.getNativeFieldSize(i):0),Runtime.QUANTUM_SIZE):Math.min(o,8)},dynCall:function(i,o,f){return f&&f.length?Module["dynCall_"+i].apply(null,[o].concat(f)):Module["dynCall_"+i].call(null,o)},functionPointers:[],addFunction:function(i){for(var o=0;o>2],f=(o+i+15|0)&-16;if(HEAP32[DYNAMICTOP_PTR>>2]=f,f>=TOTAL_MEMORY){var p=enlargeMemory();if(!p)return HEAP32[DYNAMICTOP_PTR>>2]=o,0}return o},alignMemory:function(i,o){var f=i=Math.ceil(i/(o||16))*(o||16);return f},makeBigInt:function(i,o,f){var p=f?+(i>>>0)+ +(o>>>0)*4294967296:+(i>>>0)+ +(o|0)*4294967296;return p},GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module.Runtime=Runtime;var ABORT=0,EXITSTATUS=0;function assert(i,o){i||abort("Assertion failed: "+o)}function getCFunc(ident){var func=Module["_"+ident];if(!func)try{func=eval("_"+ident)}catch(i){}return assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)"),func}var cwrap,ccall;(function(){var JSfuncs={stackSave:function(){Runtime.stackSave()},stackRestore:function(){Runtime.stackRestore()},arrayToC:function(i){var o=Runtime.stackAlloc(i.length);return writeArrayToMemory(i,o),o},stringToC:function(i){var o=0;if(i!=null&&i!==0){var f=(i.length<<2)+1;o=Runtime.stackAlloc(f),stringToUTF8(i,o,f)}return o}},toC={string:JSfuncs.stringToC,array:JSfuncs.arrayToC};ccall=function(o,f,p,E,t){var k=getCFunc(o),L=[],N=0;if(E)for(var C=0;C>0]=o;break;case"i8":HEAP8[i>>0]=o;break;case"i16":HEAP16[i>>1]=o;break;case"i32":HEAP32[i>>2]=o;break;case"i64":tempI64=[o>>>0,(tempDouble=o,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[i>>2]=tempI64[0],HEAP32[i+4>>2]=tempI64[1];break;case"float":HEAPF32[i>>2]=o;break;case"double":HEAPF64[i>>3]=o;break;default:abort("invalid type for setValue: "+f)}}Module.setValue=setValue;function getValue(i,o,f){switch(o=o||"i8",o.charAt(o.length-1)==="*"&&(o="i32"),o){case"i1":return HEAP8[i>>0];case"i8":return HEAP8[i>>0];case"i16":return HEAP16[i>>1];case"i32":return HEAP32[i>>2];case"i64":return HEAP32[i>>2];case"float":return HEAPF32[i>>2];case"double":return HEAPF64[i>>3];default:abort("invalid type for setValue: "+o)}return null}Module.getValue=getValue;var ALLOC_NORMAL=0,ALLOC_STACK=1,ALLOC_STATIC=2,ALLOC_DYNAMIC=3,ALLOC_NONE=4;Module.ALLOC_NORMAL=ALLOC_NORMAL,Module.ALLOC_STACK=ALLOC_STACK,Module.ALLOC_STATIC=ALLOC_STATIC,Module.ALLOC_DYNAMIC=ALLOC_DYNAMIC,Module.ALLOC_NONE=ALLOC_NONE;function allocate(i,o,f,p){var E,t;typeof i=="number"?(E=!0,t=i):(E=!1,t=i.length);var k=typeof o=="string"?o:null,L;if(f==ALLOC_NONE?L=p:L=[typeof _malloc=="function"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][f===void 0?ALLOC_STATIC:f](Math.max(t,k?1:o.length)),E){var p=L,N;for(assert((L&3)==0),N=L+(t&~3);p>2]=0;for(N=L+t;p>0]=0;return L}if(k==="i8")return i.subarray||i.slice?HEAPU8.set(i,L):HEAPU8.set(new Uint8Array(i),L),L;for(var C=0,U,q,W;C>0],f|=p,!(p==0&&!o||(E++,o&&E==o)););o||(o=E);var t="";if(f<128){for(var k=1024,L;o>0;)L=String.fromCharCode.apply(String,HEAPU8.subarray(i,i+Math.min(o,k))),t=t?t+L:L,i+=k,o-=k;return t}return Module.UTF8ToString(i)}Module.Pointer_stringify=Pointer_stringify;function AsciiToString(i){for(var o="";;){var f=HEAP8[i++>>0];if(!f)return o;o+=String.fromCharCode(f)}}Module.AsciiToString=AsciiToString;function stringToAscii(i,o){return writeAsciiToMemory(i,o,!1)}Module.stringToAscii=stringToAscii;var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):void 0;function UTF8ArrayToString(i,o){for(var f=o;i[f];)++f;if(f-o>16&&i.subarray&&UTF8Decoder)return UTF8Decoder.decode(i.subarray(o,f));for(var p,E,t,k,L,N,C="";;){if(p=i[o++],!p)return C;if(!(p&128)){C+=String.fromCharCode(p);continue}if(E=i[o++]&63,(p&224)==192){C+=String.fromCharCode((p&31)<<6|E);continue}if(t=i[o++]&63,(p&240)==224?p=(p&15)<<12|E<<6|t:(k=i[o++]&63,(p&248)==240?p=(p&7)<<18|E<<12|t<<6|k:(L=i[o++]&63,(p&252)==248?p=(p&3)<<24|E<<18|t<<12|k<<6|L:(N=i[o++]&63,p=(p&1)<<30|E<<24|t<<18|k<<12|L<<6|N))),p<65536)C+=String.fromCharCode(p);else{var U=p-65536;C+=String.fromCharCode(55296|U>>10,56320|U&1023)}}}Module.UTF8ArrayToString=UTF8ArrayToString;function UTF8ToString(i){return UTF8ArrayToString(HEAPU8,i)}Module.UTF8ToString=UTF8ToString;function stringToUTF8Array(i,o,f,p){if(!(p>0))return 0;for(var E=f,t=f+p-1,k=0;k=55296&&L<=57343&&(L=65536+((L&1023)<<10)|i.charCodeAt(++k)&1023),L<=127){if(f>=t)break;o[f++]=L}else if(L<=2047){if(f+1>=t)break;o[f++]=192|L>>6,o[f++]=128|L&63}else if(L<=65535){if(f+2>=t)break;o[f++]=224|L>>12,o[f++]=128|L>>6&63,o[f++]=128|L&63}else if(L<=2097151){if(f+3>=t)break;o[f++]=240|L>>18,o[f++]=128|L>>12&63,o[f++]=128|L>>6&63,o[f++]=128|L&63}else if(L<=67108863){if(f+4>=t)break;o[f++]=248|L>>24,o[f++]=128|L>>18&63,o[f++]=128|L>>12&63,o[f++]=128|L>>6&63,o[f++]=128|L&63}else{if(f+5>=t)break;o[f++]=252|L>>30,o[f++]=128|L>>24&63,o[f++]=128|L>>18&63,o[f++]=128|L>>12&63,o[f++]=128|L>>6&63,o[f++]=128|L&63}}return o[f]=0,f-E}Module.stringToUTF8Array=stringToUTF8Array;function stringToUTF8(i,o,f){return stringToUTF8Array(i,HEAPU8,o,f)}Module.stringToUTF8=stringToUTF8;function lengthBytesUTF8(i){for(var o=0,f=0;f=55296&&p<=57343&&(p=65536+((p&1023)<<10)|i.charCodeAt(++f)&1023),p<=127?++o:p<=2047?o+=2:p<=65535?o+=3:p<=2097151?o+=4:p<=67108863?o+=5:o+=6}return o}Module.lengthBytesUTF8=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf-16le"):void 0;function demangle(i){var o=Module.___cxa_demangle||Module.__cxa_demangle;if(o){try{var f=i.substr(1),p=lengthBytesUTF8(f)+1,E=_malloc(p);stringToUTF8(f,E,p);var t=_malloc(4),k=o(E,0,0,t);if(getValue(t,"i32")===0&&k)return Pointer_stringify(k)}catch(L){}finally{E&&_free(E),t&&_free(t),k&&_free(k)}return i}return Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling"),i}function demangleAll(i){var o=/__Z[\w\d_]+/g;return i.replace(o,function(f){var p=demangle(f);return f===p?f:f+" ["+p+"]"})}function jsStackTrace(){var i=new Error;if(!i.stack){try{throw new Error(0)}catch(o){i=o}if(!i.stack)return"(no stack trace available)"}return i.stack.toString()}function stackTrace(){var i=jsStackTrace();return Module.extraStackTrace&&(i+=` +`+Module.extraStackTrace()),demangleAll(i)}Module.stackTrace=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module.HEAP8=HEAP8=new Int8Array(buffer),Module.HEAP16=HEAP16=new Int16Array(buffer),Module.HEAP32=HEAP32=new Int32Array(buffer),Module.HEAPU8=HEAPU8=new Uint8Array(buffer),Module.HEAPU16=HEAPU16=new Uint16Array(buffer),Module.HEAPU32=HEAPU32=new Uint32Array(buffer),Module.HEAPF32=HEAPF32=new Float32Array(buffer),Module.HEAPF64=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed,STACK_BASE,STACKTOP,STACK_MAX,DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0,staticSealed=!1;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module.TOTAL_STACK||5242880,TOTAL_MEMORY=Module.TOTAL_MEMORY||134217728;TOTAL_MEMORY0;){var o=i.shift();if(typeof o=="function"){o();continue}var f=o.func;typeof f=="number"?o.arg===void 0?Module.dynCall_v(f):Module.dynCall_vi(f,o.arg):f(o.arg===void 0?null:o.arg)}}var __ATPRERUN__=[],__ATINIT__=[],__ATMAIN__=[],__ATEXIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1,runtimeExited=!1;function preRun(){if(Module.preRun)for(typeof Module.preRun=="function"&&(Module.preRun=[Module.preRun]);Module.preRun.length;)addOnPreRun(Module.preRun.shift());callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){runtimeInitialized||(runtimeInitialized=!0,callRuntimeCallbacks(__ATINIT__))}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__),runtimeExited=!0}function postRun(){if(Module.postRun)for(typeof Module.postRun=="function"&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(i){__ATPRERUN__.unshift(i)}Module.addOnPreRun=addOnPreRun;function addOnInit(i){__ATINIT__.unshift(i)}Module.addOnInit=addOnInit;function addOnPreMain(i){__ATMAIN__.unshift(i)}Module.addOnPreMain=addOnPreMain;function addOnExit(i){__ATEXIT__.unshift(i)}Module.addOnExit=addOnExit;function addOnPostRun(i){__ATPOSTRUN__.unshift(i)}Module.addOnPostRun=addOnPostRun;function intArrayFromString(i,o,f){var p=f>0?f:lengthBytesUTF8(i)+1,E=new Array(p),t=stringToUTF8Array(i,E,0,E.length);return o&&(E.length=t),E}Module.intArrayFromString=intArrayFromString;function intArrayToString(i){for(var o=[],f=0;f255&&(p&=255),o.push(String.fromCharCode(p))}return o.join("")}Module.intArrayToString=intArrayToString;function writeStringToMemory(i,o,f){Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");var p,E;f&&(E=o+lengthBytesUTF8(i),p=HEAP8[E]),stringToUTF8(i,o,Infinity),f&&(HEAP8[E]=p)}Module.writeStringToMemory=writeStringToMemory;function writeArrayToMemory(i,o){HEAP8.set(i,o)}Module.writeArrayToMemory=writeArrayToMemory;function writeAsciiToMemory(i,o,f){for(var p=0;p>0]=i.charCodeAt(p);f||(HEAP8[o>>0]=0)}if(Module.writeAsciiToMemory=writeAsciiToMemory,(!Math.imul||Math.imul(4294967295,5)!==-5)&&(Math.imul=function(o,f){var p=o>>>16,E=o&65535,t=f>>>16,k=f&65535;return E*k+(p*k+E*t<<16)|0}),Math.imul=Math.imul,!Math.fround){var froundBuffer=new Float32Array(1);Math.fround=function(i){return froundBuffer[0]=i,froundBuffer[0]}}Math.fround=Math.fround,Math.clz32||(Math.clz32=function(i){i=i>>>0;for(var o=0;o<32;o++)if(i&1<<31-o)return o;return 32}),Math.clz32=Math.clz32,Math.trunc||(Math.trunc=function(i){return i<0?Math.ceil(i):Math.floor(i)}),Math.trunc=Math.trunc;var Math_abs=Math.abs,Math_cos=Math.cos,Math_sin=Math.sin,Math_tan=Math.tan,Math_acos=Math.acos,Math_asin=Math.asin,Math_atan=Math.atan,Math_atan2=Math.atan2,Math_exp=Math.exp,Math_log=Math.log,Math_sqrt=Math.sqrt,Math_ceil=Math.ceil,Math_floor=Math.floor,Math_pow=Math.pow,Math_imul=Math.imul,Math_fround=Math.fround,Math_round=Math.round,Math_min=Math.min,Math_clz32=Math.clz32,Math_trunc=Math.trunc,runDependencies=0,runDependencyWatcher=null,dependenciesFulfilled=null;function getUniqueRunDependency(i){return i}function addRunDependency(i){runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}Module.addRunDependency=addRunDependency;function removeRunDependency(i){if(runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),runDependencies==0&&(runDependencyWatcher!==null&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var o=dependenciesFulfilled;dependenciesFulfilled=null,o()}}Module.removeRunDependency=removeRunDependency,Module.preloadedImages={},Module.preloadedAudios={};var ASM_CONSTS=[function(i,o,f,p,E,t,k,L){return _nbind.callbackSignatureList[i].apply(this,arguments)}];function _emscripten_asm_const_iiiiiiii(i,o,f,p,E,t,k,L){return ASM_CONSTS[i](o,f,p,E,t,k,L)}function _emscripten_asm_const_iiiii(i,o,f,p,E){return ASM_CONSTS[i](o,f,p,E)}function _emscripten_asm_const_iiidddddd(i,o,f,p,E,t,k,L,N){return ASM_CONSTS[i](o,f,p,E,t,k,L,N)}function _emscripten_asm_const_iiididi(i,o,f,p,E,t,k){return ASM_CONSTS[i](o,f,p,E,t,k)}function _emscripten_asm_const_iiii(i,o,f,p){return ASM_CONSTS[i](o,f,p)}function _emscripten_asm_const_iiiid(i,o,f,p,E){return ASM_CONSTS[i](o,f,p,E)}function _emscripten_asm_const_iiiiii(i,o,f,p,E,t){return ASM_CONSTS[i](o,f,p,E,t)}STATIC_BASE=Runtime.GLOBAL_BASE,STATICTOP=STATIC_BASE+12800,__ATINIT__.push({func:function(){__GLOBAL__sub_I_Yoga_cpp()}},{func:function(){__GLOBAL__sub_I_nbind_cc()}},{func:function(){__GLOBAL__sub_I_common_cc()}},{func:function(){__GLOBAL__sub_I_Binding_cc()}}),allocate([0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,192,127,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,128,191,0,0,128,191,0,0,192,127,0,0,0,0,0,0,0,0,0,0,128,63,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,190,12,0,0,200,12,0,0,208,12,0,0,216,12,0,0,230,12,0,0,242,12,0,0,1,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,0,0,192,127,3,0,0,0,180,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,182,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,183,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,184,45,0,0,185,45,0,0,181,45,0,0,181,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,148,4,0,0,3,0,0,0,187,45,0,0,164,4,0,0,188,45,0,0,2,0,0,0,189,45,0,0,164,4,0,0,188,45,0,0,185,45,0,0,164,4,0,0,185,45,0,0,164,4,0,0,188,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,6,0,0,0,1,0,0,0,7,0,0,0,183,45,0,0,182,45,0,0,181,45,0,0,190,45,0,0,190,45,0,0,182,45,0,0,182,45,0,0,185,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,185,45,0,0,48,5,0,0,3,0,0,0,56,5,0,0,1,0,0,0,189,45,0,0,185,45,0,0,164,4,0,0,76,5,0,0,2,0,0,0,191,45,0,0,186,45,0,0,182,45,0,0,185,45,0,0,192,45,0,0,185,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,76,5,0,0,76,5,0,0,136,5,0,0,182,45,0,0,181,45,0,0,2,0,0,0,190,45,0,0,136,5,0,0,56,19,0,0,156,5,0,0,2,0,0,0,184,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,9,0,0,0,1,0,0,0,10,0,0,0,204,5,0,0,181,45,0,0,181,45,0,0,2,0,0,0,180,45,0,0,204,5,0,0,2,0,0,0,195,45,0,0,236,5,0,0,97,19,0,0,198,45,0,0,211,45,0,0,212,45,0,0,213,45,0,0,214,45,0,0,215,45,0,0,188,45,0,0,182,45,0,0,216,45,0,0,217,45,0,0,218,45,0,0,219,45,0,0,192,45,0,0,181,45,0,0,0,0,0,0,185,45,0,0,110,19,0,0,186,45,0,0,115,19,0,0,221,45,0,0,120,19,0,0,148,4,0,0,132,19,0,0,96,6,0,0,145,19,0,0,222,45,0,0,164,19,0,0,223,45,0,0,173,19,0,0,0,0,0,0,3,0,0,0,104,6,0,0,1,0,0,0,187,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,11,0,0,0,12,0,0,0,1,0,0,0,13,0,0,0,185,45,0,0,224,45,0,0,164,6,0,0,188,45,0,0,172,6,0,0,180,6,0,0,2,0,0,0,188,6,0,0,7,0,0,0,224,45,0,0,7,0,0,0,164,6,0,0,1,0,0,0,213,45,0,0,185,45,0,0,224,45,0,0,172,6,0,0,185,45,0,0,224,45,0,0,164,6,0,0,185,45,0,0,224,45,0,0,211,45,0,0,211,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,172,6,0,0,222,45,0,0,211,45,0,0,224,45,0,0,188,45,0,0,222,45,0,0,211,45,0,0,40,7,0,0,188,45,0,0,2,0,0,0,224,45,0,0,185,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,222,45,0,0,224,45,0,0,148,4,0,0,185,45,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,185,45,0,0,164,6,0,0,148,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,14,0,0,0,15,0,0,0,1,0,0,0,16,0,0,0,148,7,0,0,2,0,0,0,225,45,0,0,183,45,0,0,188,45,0,0,168,7,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,234,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,148,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,9,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,242,45,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,110,111,100,101,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,119,104,105,99,104,32,115,116,105,108,108,32,104,97,115,32,99,104,105,108,100,114,101,110,32,97,116,116,97,99,104,101,100,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,115,116,105,108,108,32,97,116,116,97,99,104,101,100,32,116,111,32,97,32,112,97,114,101,110,116,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,99,111,110,102,105,103,0,67,97,110,110,111,116,32,115,101,116,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,67,104,105,108,100,32,97,108,114,101,97,100,121,32,104,97,115,32,97,32,112,97,114,101,110,116,44,32,105,116,32,109,117,115,116,32,98,101,32,114,101,109,111,118,101,100,32,102,105,114,115,116,46,0,67,97,110,110,111,116,32,97,100,100,32,99,104,105,108,100,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,79,110,108,121,32,108,101,97,102,32,110,111,100,101,115,32,119,105,116,104,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,115,104,111,117,108,100,32,109,97,110,117,97,108,108,121,32,109,97,114,107,32,116,104,101,109,115,101,108,118,101,115,32,97,115,32,100,105,114,116,121,0,67,97,110,110,111,116,32,103,101,116,32,108,97,121,111,117,116,32,112,114,111,112,101,114,116,105,101,115,32,111,102,32,109,117,108,116,105,45,101,100,103,101,32,115,104,111,114,116,104,97,110,100,115,0,37,115,37,100,46,123,91,115,107,105,112,112,101,100,93,32,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,61,62,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,37,115,37,100,46,123,37,115,0,42,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,37,115,10,0,37,115,37,100,46,125,37,115,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,79,117,116,32,111,102,32,99,97,99,104,101,32,101,110,116,114,105,101,115,33,10,0,83,99,97,108,101,32,102,97,99,116,111,114,32,115,104,111,117,108,100,32,110,111,116,32,98,101,32,108,101,115,115,32,116,104,97,110,32,122,101,114,111,0,105,110,105,116,105,97,108,0,37,115,10,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,85,78,68,69,70,73,78,69,68,0,69,88,65,67,84,76,89,0,65,84,95,77,79,83,84,0,76,65,89,95,85,78,68,69,70,73,78,69,68,0,76,65,89,95,69,88,65,67,84,76,89,0,76,65,89,95,65,84,95,77,79,83,84,0,97,118,97,105,108,97,98,108,101,87,105,100,116,104,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,119,105,100,116,104,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,97,118,97,105,108,97,98,108,101,72,101,105,103,104,116,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,104,101,105,103,104,116,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,102,108,101,120,0,115,116,114,101,116,99,104,0,109,117,108,116,105,108,105,110,101,45,115,116,114,101,116,99,104,0,69,120,112,101,99,116,101,100,32,110,111,100,101,32,116,111,32,104,97,118,101,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,0,109,101,97,115,117,114,101,0,69,120,112,101,99,116,32,99,117,115,116,111,109,32,98,97,115,101,108,105,110,101,32,102,117,110,99,116,105,111,110,32,116,111,32,110,111,116,32,114,101,116,117,114,110,32,78,97,78,0,97,98,115,45,109,101,97,115,117,114,101,0,97,98,115,45,108,97,121,111,117,116,0,78,111,100,101,0,99,114,101,97,116,101,68,101,102,97,117,108,116,0,99,114,101,97,116,101,87,105,116,104,67,111,110,102,105,103,0,100,101,115,116,114,111,121,0,114,101,115,101,116,0,99,111,112,121,83,116,121,108,101,0,115,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,115,101,116,80,111,115,105,116,105,111,110,0,115,101,116,80,111,115,105,116,105,111,110,80,101,114,99,101,110,116,0,115,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,115,101,116,65,108,105,103,110,73,116,101,109,115,0,115,101,116,65,108,105,103,110,83,101,108,102,0,115,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,115,101,116,70,108,101,120,87,114,97,112,0,115,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,115,101,116,77,97,114,103,105,110,0,115,101,116,77,97,114,103,105,110,80,101,114,99,101,110,116,0,115,101,116,77,97,114,103,105,110,65,117,116,111,0,115,101,116,79,118,101,114,102,108,111,119,0,115,101,116,68,105,115,112,108,97,121,0,115,101,116,70,108,101,120,0,115,101,116,70,108,101,120,66,97,115,105,115,0,115,101,116,70,108,101,120,66,97,115,105,115,80,101,114,99,101,110,116,0,115,101,116,70,108,101,120,71,114,111,119,0,115,101,116,70,108,101,120,83,104,114,105,110,107,0,115,101,116,87,105,100,116,104,0,115,101,116,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,87,105,100,116,104,65,117,116,111,0,115,101,116,72,101,105,103,104,116,0,115,101,116,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,72,101,105,103,104,116,65,117,116,111,0,115,101,116,77,105,110,87,105,100,116,104,0,115,101,116,77,105,110,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,105,110,72,101,105,103,104,116,0,115,101,116,77,105,110,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,77,97,120,87,105,100,116,104,0,115,101,116,77,97,120,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,97,120,72,101,105,103,104,116,0,115,101,116,77,97,120,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,65,115,112,101,99,116,82,97,116,105,111,0,115,101,116,66,111,114,100,101,114,0,115,101,116,80,97,100,100,105,110,103,0,115,101,116,80,97,100,100,105,110,103,80,101,114,99,101,110,116,0,103,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,103,101,116,80,111,115,105,116,105,111,110,0,103,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,103,101,116,65,108,105,103,110,73,116,101,109,115,0,103,101,116,65,108,105,103,110,83,101,108,102,0,103,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,103,101,116,70,108,101,120,87,114,97,112,0,103,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,103,101,116,77,97,114,103,105,110,0,103,101,116,70,108,101,120,66,97,115,105,115,0,103,101,116,70,108,101,120,71,114,111,119,0,103,101,116,70,108,101,120,83,104,114,105,110,107,0,103,101,116,87,105,100,116,104,0,103,101,116,72,101,105,103,104,116,0,103,101,116,77,105,110,87,105,100,116,104,0,103,101,116,77,105,110,72,101,105,103,104,116,0,103,101,116,77,97,120,87,105,100,116,104,0,103,101,116,77,97,120,72,101,105,103,104,116,0,103,101,116,65,115,112,101,99,116,82,97,116,105,111,0,103,101,116,66,111,114,100,101,114,0,103,101,116,79,118,101,114,102,108,111,119,0,103,101,116,68,105,115,112,108,97,121,0,103,101,116,80,97,100,100,105,110,103,0,105,110,115,101,114,116,67,104,105,108,100,0,114,101,109,111,118,101,67,104,105,108,100,0,103,101,116,67,104,105,108,100,67,111,117,110,116,0,103,101,116,80,97,114,101,110,116,0,103,101,116,67,104,105,108,100,0,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,117,110,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,109,97,114,107,68,105,114,116,121,0,105,115,68,105,114,116,121,0,99,97,108,99,117,108,97,116,101,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,76,101,102,116,0,103,101,116,67,111,109,112,117,116,101,100,82,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,84,111,112,0,103,101,116,67,111,109,112,117,116,101,100,66,111,116,116,111,109,0,103,101,116,67,111,109,112,117,116,101,100,87,105,100,116,104,0,103,101,116,67,111,109,112,117,116,101,100,72,101,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,77,97,114,103,105,110,0,103,101,116,67,111,109,112,117,116,101,100,66,111,114,100,101,114,0,103,101,116,67,111,109,112,117,116,101,100,80,97,100,100,105,110,103,0,67,111,110,102,105,103,0,99,114,101,97,116,101,0,115,101,116,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,115,101,116,80,111,105,110,116,83,99,97,108,101,70,97,99,116,111,114,0,105,115,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,86,97,108,117,101,0,76,97,121,111,117,116,0,83,105,122,101,0,103,101,116,73,110,115,116,97,110,99,101,67,111,117,110,116,0,73,110,116,54,52,0,1,1,1,2,2,4,4,4,4,8,8,4,8,118,111,105,100,0,98,111,111,108,0,115,116,100,58,58,115,116,114,105,110,103,0,99,98,70,117,110,99,116,105,111,110,32,38,0,99,111,110,115,116,32,99,98,70,117,110,99,116,105,111,110,32,38,0,69,120,116,101,114,110,97,108,0,66,117,102,102,101,114,0,78,66,105,110,100,73,68,0,78,66,105,110,100,0,98,105,110,100,95,118,97,108,117,101,0,114,101,102,108,101,99,116,0,113,117,101,114,121,84,121,112,101,0,108,97,108,108,111,99,0,108,114,101,115,101,116,0,123,114,101,116,117,114,110,40,95,110,98,105,110,100,46,99,97,108,108,98,97,99,107,83,105,103,110,97,116,117,114,101,76,105,115,116,91,36,48,93,46,97,112,112,108,121,40,116,104,105,115,44,97,114,103,117,109,101,110,116,115,41,41,59,125,0,95,110,98,105,110,100,95,110,101,119,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;STATICTOP+=16;function _atexit(i,o){__ATEXIT__.unshift({func:i,arg:o})}function ___cxa_atexit(){return _atexit.apply(null,arguments)}function _abort(){Module.abort()}function __ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj(){Module.printErr("missing function: _ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj"),abort(-1)}function __decorate(i,o,f,p){var E=arguments.length,t=E<3?o:p===null?p=Object.getOwnPropertyDescriptor(o,f):p,k;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")t=Reflect.decorate(i,o,f,p);else for(var L=i.length-1;L>=0;L--)(k=i[L])&&(t=(E<3?k(t):E>3?k(o,f,t):k(o,f))||t);return E>3&&t&&Object.defineProperty(o,f,t),t}function _defineHidden(i){return function(o,f){Object.defineProperty(o,f,{configurable:!1,enumerable:!1,value:i,writable:!0})}}var _nbind={};function __nbind_free_external(i){_nbind.externalList[i].dereference(i)}function __nbind_reference_external(i){_nbind.externalList[i].reference()}function _llvm_stackrestore(i){var o=_llvm_stacksave,f=o.LLVM_SAVEDSTACKS[i];o.LLVM_SAVEDSTACKS.splice(i,1),Runtime.stackRestore(f)}function __nbind_register_pool(i,o,f,p){_nbind.Pool.pageSize=i,_nbind.Pool.usedPtr=o/4,_nbind.Pool.rootPtr=f,_nbind.Pool.pagePtr=p/4,HEAP32[o/4]=16909060,HEAP8[o]==1&&(_nbind.bigEndian=!0),HEAP32[o/4]=0,_nbind.makeTypeKindTbl=(t={},t[1024]=_nbind.PrimitiveType,t[64]=_nbind.Int64Type,t[2048]=_nbind.BindClass,t[3072]=_nbind.BindClassPtr,t[4096]=_nbind.SharedClassPtr,t[5120]=_nbind.ArrayType,t[6144]=_nbind.ArrayType,t[7168]=_nbind.CStringType,t[9216]=_nbind.CallbackType,t[10240]=_nbind.BindType,t),_nbind.makeTypeNameTbl={Buffer:_nbind.BufferType,External:_nbind.ExternalType,Int64:_nbind.Int64Type,_nbind_new:_nbind.CreateValueType,bool:_nbind.BooleanType,"cbFunction &":_nbind.CallbackType,"const cbFunction &":_nbind.CallbackType,"const std::string &":_nbind.StringType,"std::string":_nbind.StringType},Module.toggleLightGC=_nbind.toggleLightGC,_nbind.callUpcast=Module.dynCall_ii;var E=_nbind.makeType(_nbind.constructType,{flags:2048,id:0,name:""});E.proto=Module,_nbind.BindClass.list.push(E);var t}function _emscripten_set_main_loop_timing(i,o){if(Browser.mainLoop.timingMode=i,Browser.mainLoop.timingValue=o,!Browser.mainLoop.func)return 1;if(i==0)Browser.mainLoop.scheduler=function(){var k=Math.max(0,Browser.mainLoop.tickStartTime+o-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,k)},Browser.mainLoop.method="timeout";else if(i==1)Browser.mainLoop.scheduler=function(){Browser.requestAnimationFrame(Browser.mainLoop.runner)},Browser.mainLoop.method="rAF";else if(i==2){if(!window.setImmediate){let t=function(k){k.source===window&&k.data===p&&(k.stopPropagation(),f.shift()())};var E=t,f=[],p="setimmediate";window.addEventListener("message",t,!0),window.setImmediate=function(L){f.push(L),ENVIRONMENT_IS_WORKER?(Module.setImmediates===void 0&&(Module.setImmediates=[]),Module.setImmediates.push(L),window.postMessage({target:p})):window.postMessage(p,"*")}}Browser.mainLoop.scheduler=function(){window.setImmediate(Browser.mainLoop.runner)},Browser.mainLoop.method="immediate"}return 0}function _emscripten_get_now(){abort()}function _emscripten_set_main_loop(i,o,f,p,E){Module.noExitRuntime=!0,assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters."),Browser.mainLoop.func=i,Browser.mainLoop.arg=p;var t;typeof p!="undefined"?t=function(){Module.dynCall_vi(i,p)}:t=function(){Module.dynCall_v(i)};var k=Browser.mainLoop.currentlyRunningMainloop;if(Browser.mainLoop.runner=function(){if(!ABORT){if(Browser.mainLoop.queue.length>0){var N=Date.now(),C=Browser.mainLoop.queue.shift();if(C.func(C.arg),Browser.mainLoop.remainingBlockers){var U=Browser.mainLoop.remainingBlockers,q=U%1==0?U-1:Math.floor(U);C.counted?Browser.mainLoop.remainingBlockers=q:(q=q+.5,Browser.mainLoop.remainingBlockers=(8*U+q)/9)}if(console.log('main loop blocker "'+C.name+'" took '+(Date.now()-N)+" ms"),Browser.mainLoop.updateStatus(),k1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else Browser.mainLoop.timingMode==0&&(Browser.mainLoop.tickStartTime=_emscripten_get_now());Browser.mainLoop.method==="timeout"&&Module.ctx&&(Module.printErr("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!"),Browser.mainLoop.method=""),Browser.mainLoop.runIter(t),!(k0?_emscripten_set_main_loop_timing(0,1e3/o):_emscripten_set_main_loop_timing(1,1),Browser.mainLoop.scheduler()),f)throw"SimulateInfiniteLoop"}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null,Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var i=Browser.mainLoop.timingMode,o=Browser.mainLoop.timingValue,f=Browser.mainLoop.func;Browser.mainLoop.func=null,_emscripten_set_main_loop(f,0,!1,Browser.mainLoop.arg,!0),_emscripten_set_main_loop_timing(i,o),Browser.mainLoop.scheduler()},updateStatus:function(){if(Module.setStatus){var i=Module.statusMessage||"Please wait...",o=Browser.mainLoop.remainingBlockers,f=Browser.mainLoop.expectedBlockers;o?o=6;){var rt=le>>Ue-6&63;Ue-=6,Oe+=ze[rt]}return Ue==2?(Oe+=ze[(le&3)<<4],Oe+=pe+pe):Ue==4&&(Oe+=ze[(le&15)<<2],Oe+=pe),Oe}m.src="data:audio/x-"+k.substr(-3)+";base64,"+he(t),U(m)},m.src=ne,Browser.safeSetTimeout(function(){U(m)},1e4)}else return q()},Module.preloadPlugins.push(o);function f(){Browser.pointerLock=document.pointerLockElement===Module.canvas||document.mozPointerLockElement===Module.canvas||document.webkitPointerLockElement===Module.canvas||document.msPointerLockElement===Module.canvas}var p=Module.canvas;p&&(p.requestPointerLock=p.requestPointerLock||p.mozRequestPointerLock||p.webkitRequestPointerLock||p.msRequestPointerLock||function(){},p.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||document.msExitPointerLock||function(){},p.exitPointerLock=p.exitPointerLock.bind(document),document.addEventListener("pointerlockchange",f,!1),document.addEventListener("mozpointerlockchange",f,!1),document.addEventListener("webkitpointerlockchange",f,!1),document.addEventListener("mspointerlockchange",f,!1),Module.elementPointerLock&&p.addEventListener("click",function(E){!Browser.pointerLock&&Module.canvas.requestPointerLock&&(Module.canvas.requestPointerLock(),E.preventDefault())},!1))},createContext:function(i,o,f,p){if(o&&Module.ctx&&i==Module.canvas)return Module.ctx;var E,t;if(o){var k={antialias:!1,alpha:!1};if(p)for(var L in p)k[L]=p[L];t=GL.createContext(i,k),t&&(E=GL.getContext(t).GLctx)}else E=i.getContext("2d");return E?(f&&(o||assert(typeof GLctx=="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it"),Module.ctx=E,o&&GL.makeContextCurrent(t),Module.useWebGL=o,Browser.moduleContextCreatedCallbacks.forEach(function(N){N()}),Browser.init()),E):null},destroyContext:function(i,o,f){},fullscreenHandlersInstalled:!1,lockPointer:void 0,resizeCanvas:void 0,requestFullscreen:function(i,o,f){Browser.lockPointer=i,Browser.resizeCanvas=o,Browser.vrDevice=f,typeof Browser.lockPointer=="undefined"&&(Browser.lockPointer=!0),typeof Browser.resizeCanvas=="undefined"&&(Browser.resizeCanvas=!1),typeof Browser.vrDevice=="undefined"&&(Browser.vrDevice=null);var p=Module.canvas;function E(){Browser.isFullscreen=!1;var k=p.parentNode;(document.fullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.webkitFullscreenElement||document.webkitCurrentFullScreenElement)===k?(p.exitFullscreen=document.exitFullscreen||document.cancelFullScreen||document.mozCancelFullScreen||document.msExitFullscreen||document.webkitCancelFullScreen||function(){},p.exitFullscreen=p.exitFullscreen.bind(document),Browser.lockPointer&&p.requestPointerLock(),Browser.isFullscreen=!0,Browser.resizeCanvas&&Browser.setFullscreenCanvasSize()):(k.parentNode.insertBefore(p,k),k.parentNode.removeChild(k),Browser.resizeCanvas&&Browser.setWindowedCanvasSize()),Module.onFullScreen&&Module.onFullScreen(Browser.isFullscreen),Module.onFullscreen&&Module.onFullscreen(Browser.isFullscreen),Browser.updateCanvasDimensions(p)}Browser.fullscreenHandlersInstalled||(Browser.fullscreenHandlersInstalled=!0,document.addEventListener("fullscreenchange",E,!1),document.addEventListener("mozfullscreenchange",E,!1),document.addEventListener("webkitfullscreenchange",E,!1),document.addEventListener("MSFullscreenChange",E,!1));var t=document.createElement("div");p.parentNode.insertBefore(t,p),t.appendChild(p),t.requestFullscreen=t.requestFullscreen||t.mozRequestFullScreen||t.msRequestFullscreen||(t.webkitRequestFullscreen?function(){t.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}:null)||(t.webkitRequestFullScreen?function(){t.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:null),f?t.requestFullscreen({vrDisplay:f}):t.requestFullscreen()},requestFullScreen:function(i,o,f){return Module.printErr("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead."),Browser.requestFullScreen=function(p,E,t){return Browser.requestFullscreen(p,E,t)},Browser.requestFullscreen(i,o,f)},nextRAF:0,fakeRequestAnimationFrame:function(i){var o=Date.now();if(Browser.nextRAF===0)Browser.nextRAF=o+1e3/60;else for(;o+2>=Browser.nextRAF;)Browser.nextRAF+=1e3/60;var f=Math.max(Browser.nextRAF-o,0);setTimeout(i,f)},requestAnimationFrame:function(o){typeof window=="undefined"?Browser.fakeRequestAnimationFrame(o):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||Browser.fakeRequestAnimationFrame),window.requestAnimationFrame(o))},safeCallback:function(i){return function(){if(!ABORT)return i.apply(null,arguments)}},allowAsyncCallbacks:!0,queuedAsyncCallbacks:[],pauseAsyncCallbacks:function(){Browser.allowAsyncCallbacks=!1},resumeAsyncCallbacks:function(){if(Browser.allowAsyncCallbacks=!0,Browser.queuedAsyncCallbacks.length>0){var i=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[],i.forEach(function(o){o()})}},safeRequestAnimationFrame:function(i){return Browser.requestAnimationFrame(function(){ABORT||(Browser.allowAsyncCallbacks?i():Browser.queuedAsyncCallbacks.push(i))})},safeSetTimeout:function(i,o){return Module.noExitRuntime=!0,setTimeout(function(){ABORT||(Browser.allowAsyncCallbacks?i():Browser.queuedAsyncCallbacks.push(i))},o)},safeSetInterval:function(i,o){return Module.noExitRuntime=!0,setInterval(function(){ABORT||Browser.allowAsyncCallbacks&&i()},o)},getMimetype:function(i){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[i.substr(i.lastIndexOf(".")+1)]},getUserMedia:function(i){window.getUserMedia||(window.getUserMedia=navigator.getUserMedia||navigator.mozGetUserMedia),window.getUserMedia(i)},getMovementX:function(i){return i.movementX||i.mozMovementX||i.webkitMovementX||0},getMovementY:function(i){return i.movementY||i.mozMovementY||i.webkitMovementY||0},getMouseWheelDelta:function(i){var o=0;switch(i.type){case"DOMMouseScroll":o=i.detail;break;case"mousewheel":o=i.wheelDelta;break;case"wheel":o=i.deltaY;break;default:throw"unrecognized mouse wheel event: "+i.type}return o},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(i){if(Browser.pointerLock)i.type!="mousemove"&&"mozMovementX"in i?Browser.mouseMovementX=Browser.mouseMovementY=0:(Browser.mouseMovementX=Browser.getMovementX(i),Browser.mouseMovementY=Browser.getMovementY(i)),typeof SDL!="undefined"?(Browser.mouseX=SDL.mouseX+Browser.mouseMovementX,Browser.mouseY=SDL.mouseY+Browser.mouseMovementY):(Browser.mouseX+=Browser.mouseMovementX,Browser.mouseY+=Browser.mouseMovementY);else{var o=Module.canvas.getBoundingClientRect(),f=Module.canvas.width,p=Module.canvas.height,E=typeof window.scrollX!="undefined"?window.scrollX:window.pageXOffset,t=typeof window.scrollY!="undefined"?window.scrollY:window.pageYOffset;if(i.type==="touchstart"||i.type==="touchend"||i.type==="touchmove"){var k=i.touch;if(k===void 0)return;var L=k.pageX-(E+o.left),N=k.pageY-(t+o.top);L=L*(f/o.width),N=N*(p/o.height);var C={x:L,y:N};if(i.type==="touchstart")Browser.lastTouches[k.identifier]=C,Browser.touches[k.identifier]=C;else if(i.type==="touchend"||i.type==="touchmove"){var U=Browser.touches[k.identifier];U||(U=C),Browser.lastTouches[k.identifier]=U,Browser.touches[k.identifier]=C}return}var q=i.pageX-(E+o.left),W=i.pageY-(t+o.top);q=q*(f/o.width),W=W*(p/o.height),Browser.mouseMovementX=q-Browser.mouseX,Browser.mouseMovementY=W-Browser.mouseY,Browser.mouseX=q,Browser.mouseY=W}},asyncLoad:function(i,o,f,p){var E=p?"":getUniqueRunDependency("al "+i);Module.readAsync(i,function(t){assert(t,'Loading data file "'+i+'" failed (no arrayBuffer).'),o(new Uint8Array(t)),E&&removeRunDependency(E)},function(t){if(f)f();else throw'Loading data file "'+i+'" failed.'}),E&&addRunDependency(E)},resizeListeners:[],updateResizeListeners:function(){var i=Module.canvas;Browser.resizeListeners.forEach(function(o){o(i.width,i.height)})},setCanvasSize:function(i,o,f){var p=Module.canvas;Browser.updateCanvasDimensions(p,i,o),f||Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL!="undefined"){var i=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];i=i|8388608,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=i}Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL!="undefined"){var i=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];i=i&~8388608,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=i}Browser.updateResizeListeners()},updateCanvasDimensions:function(i,o,f){o&&f?(i.widthNative=o,i.heightNative=f):(o=i.widthNative,f=i.heightNative);var p=o,E=f;if(Module.forcedAspectRatio&&Module.forcedAspectRatio>0&&(p/E>2];return o},getStr:function(){var i=Pointer_stringify(SYSCALLS.get());return i},get64:function(){var i=SYSCALLS.get(),o=SYSCALLS.get();return i>=0?assert(o===0):assert(o===-1),i},getZero:function(){assert(SYSCALLS.get()===0)}};function ___syscall6(i,o){SYSCALLS.varargs=o;try{var f=SYSCALLS.getStreamFromFD();return FS.close(f),0}catch(p){return(typeof FS=="undefined"||!(p instanceof FS.ErrnoError))&&abort(p),-p.errno}}function ___syscall54(i,o){SYSCALLS.varargs=o;try{return 0}catch(f){return(typeof FS=="undefined"||!(f instanceof FS.ErrnoError))&&abort(f),-f.errno}}function _typeModule(i){var o=[[0,1,"X"],[1,1,"const X"],[128,1,"X *"],[256,1,"X &"],[384,1,"X &&"],[512,1,"std::shared_ptr"],[640,1,"std::unique_ptr"],[5120,1,"std::vector"],[6144,2,"std::array"],[9216,-1,"std::function"]];function f(N,C,U,q,W,ne){if(C==1){var m=q&896;(m==128||m==256||m==384)&&(N="X const")}var we;return ne?we=U.replace("X",N).replace("Y",W):we=N.replace("X",U).replace("Y",W),we.replace(/([*&]) (?=[*&])/g,"$1")}function p(N,C,U,q,W){throw new Error(N+" type "+U.replace("X",C+"?")+(q?" with flag "+q:"")+" in "+W)}function E(N,C,U,q,W,ne,m,we){ne===void 0&&(ne="X"),we===void 0&&(we=1);var Se=U(N);if(Se)return Se;var he=q(N),ge=he.placeholderFlag,ze=o[ge];m&&ze&&(ne=f(m[2],m[0],ne,ze[0],"?",!0));var pe;ge==0&&(pe="Unbound"),ge>=10&&(pe="Corrupt"),we>20&&(pe="Deeply nested"),pe&&p(pe,N,ne,ge,W||"?");var Oe=he.paramList[0],le=E(Oe,C,U,q,W,ne,ze,we+1),Ue,Ge={flags:ze[0],id:N,name:"",paramList:[le]},rt=[],wt="?";switch(he.placeholderFlag){case 1:Ue=le.spec;break;case 2:if((le.flags&15360)==1024&&le.spec.ptrSize==1){Ge.flags=7168;break}case 3:case 6:case 5:Ue=le.spec,(le.flags&15360)!=2048;break;case 8:wt=""+he.paramList[1],Ge.paramList.push(he.paramList[1]);break;case 9:for(var xt=0,$e=he.paramList[1];xt<$e.length;xt++){var ft=$e[xt],Ke=E(ft,C,U,q,W,ne,ze,we+1);rt.push(Ke.name),Ge.paramList.push(Ke)}wt=rt.join(", ");break;default:break}if(Ge.name=f(ze[2],ze[0],le.name,le.flags,wt),Ue){for(var jt=0,$t=Object.keys(Ue);jt<$t.length;jt++){var at=$t[jt];Ge[at]=Ge[at]||Ue[at]}Ge.flags|=Ue.flags}return t(C,Ge)}function t(N,C){var U=C.flags,q=U&896,W=U&15360;return!C.name&&W==1024&&(C.ptrSize==1?C.name=(U&16?"":(U&8?"un":"")+"signed ")+"char":C.name=(U&8?"u":"")+(U&32?"float":"int")+(C.ptrSize*8+"_t")),C.ptrSize==8&&!(U&32)&&(W=64),W==2048&&(q==512||q==640?W=4096:q&&(W=3072)),N(W,C)}var k=function(){function N(C){this.id=C.id,this.name=C.name,this.flags=C.flags,this.spec=C}return N.prototype.toString=function(){return this.name},N}(),L={Type:k,getComplexType:E,makeType:t,structureList:o};return i.output=L,i.output||L}function __nbind_register_type(i,o){var f=_nbind.readAsciiString(o),p={flags:10240,id:i,name:f};_nbind.makeType(_nbind.constructType,p)}function __nbind_register_callback_signature(i,o){var f=_nbind.readTypeIdList(i,o),p=_nbind.callbackSignatureList.length;return _nbind.callbackSignatureList[p]=_nbind.makeJSCaller(f),p}function __extends(i,o){for(var f in o)o.hasOwnProperty(f)&&(i[f]=o[f]);function p(){this.constructor=i}p.prototype=o.prototype,i.prototype=new p}function __nbind_register_class(i,o,f,p,E,t,k){var L=_nbind.readAsciiString(k),N=_nbind.readPolicyList(o),C=HEAPU32.subarray(i/4,i/4+2),U={flags:2048|(N.Value?2:0),id:C[0],name:L},q=_nbind.makeType(_nbind.constructType,U);q.ptrType=_nbind.getComplexType(C[1],_nbind.constructType,_nbind.getType,_nbind.queryType),q.destroy=_nbind.makeMethodCaller(q.ptrType,{boundID:U.id,flags:0,name:"destroy",num:0,ptr:t,title:q.name+".free",typeList:["void","uint32_t","uint32_t"]}),E&&(q.superIdList=Array.prototype.slice.call(HEAPU32.subarray(f/4,f/4+E)),q.upcastList=Array.prototype.slice.call(HEAPU32.subarray(p/4,p/4+E))),Module[q.name]=q.makeBound(N),_nbind.BindClass.list.push(q)}function _removeAccessorPrefix(i){var o=/^[Gg]et_?([A-Z]?([A-Z]?))/;return i.replace(o,function(f,p,E){return E?p:p.toLowerCase()})}function __nbind_register_function(i,o,f,p,E,t,k,L,N,C){var U=_nbind.getType(i),q=_nbind.readPolicyList(o),W=_nbind.readTypeIdList(f,p),ne;if(k==5)ne=[{direct:E,name:"__nbindConstructor",ptr:0,title:U.name+" constructor",typeList:["uint32_t"].concat(W.slice(1))},{direct:t,name:"__nbindValueConstructor",ptr:0,title:U.name+" value constructor",typeList:["void","uint32_t"].concat(W.slice(1))}];else{var m=_nbind.readAsciiString(L),we=(U.name&&U.name+".")+m;(k==3||k==4)&&(m=_removeAccessorPrefix(m)),ne=[{boundID:i,direct:t,name:m,ptr:E,title:we,typeList:W}]}for(var Se=0,he=ne;Se>2]=i),i}function _llvm_stacksave(){var i=_llvm_stacksave;return i.LLVM_SAVEDSTACKS||(i.LLVM_SAVEDSTACKS=[]),i.LLVM_SAVEDSTACKS.push(Runtime.stackSave()),i.LLVM_SAVEDSTACKS.length-1}function ___syscall140(i,o){SYSCALLS.varargs=o;try{var f=SYSCALLS.getStreamFromFD(),p=SYSCALLS.get(),E=SYSCALLS.get(),t=SYSCALLS.get(),k=SYSCALLS.get(),L=E;return FS.llseek(f,L,k),HEAP32[t>>2]=f.position,f.getdents&&L===0&&k===0&&(f.getdents=null),0}catch(N){return(typeof FS=="undefined"||!(N instanceof FS.ErrnoError))&&abort(N),-N.errno}}function ___syscall146(i,o){SYSCALLS.varargs=o;try{var f=SYSCALLS.get(),p=SYSCALLS.get(),E=SYSCALLS.get(),t=0;___syscall146.buffer||(___syscall146.buffers=[null,[],[]],___syscall146.printChar=function(U,q){var W=___syscall146.buffers[U];assert(W),q===0||q===10?((U===1?Module.print:Module.printErr)(UTF8ArrayToString(W,0)),W.length=0):W.push(q)});for(var k=0;k>2],N=HEAP32[p+(k*8+4)>>2],C=0;Ci.pageSize/2||o>i.pageSize-f){var p=_nbind.typeNameTbl.NBind.proto;return p.lalloc(o)}else return HEAPU32[i.usedPtr]=f+o,i.rootPtr+f},i.lreset=function(o,f){var p=HEAPU32[i.pagePtr];if(p){var E=_nbind.typeNameTbl.NBind.proto;E.lreset(o,f)}else HEAPU32[i.usedPtr]=o},i}();_nbind.Pool=Pool;function constructType(i,o){var f=i==10240?_nbind.makeTypeNameTbl[o.name]||_nbind.BindType:_nbind.makeTypeKindTbl[i],p=new f(o);return typeIdTbl[o.id]=p,_nbind.typeNameTbl[o.name]=p,p}_nbind.constructType=constructType;function getType(i){return typeIdTbl[i]}_nbind.getType=getType;function queryType(i){var o=HEAPU8[i],f=_nbind.structureList[o][1];i/=4,f<0&&(++i,f=HEAPU32[i]+1);var p=Array.prototype.slice.call(HEAPU32.subarray(i+1,i+1+f));return o==9&&(p=[p[0],p.slice(1)]),{paramList:p,placeholderFlag:o}}_nbind.queryType=queryType;function getTypes(i,o){return i.map(function(f){return typeof f=="number"?_nbind.getComplexType(f,constructType,getType,queryType,o):_nbind.typeNameTbl[f]})}_nbind.getTypes=getTypes;function readTypeIdList(i,o){return Array.prototype.slice.call(HEAPU32,i/4,i/4+o)}_nbind.readTypeIdList=readTypeIdList;function readAsciiString(i){for(var o=i;HEAPU8[o++];);return String.fromCharCode.apply("",HEAPU8.subarray(i,o-1))}_nbind.readAsciiString=readAsciiString;function readPolicyList(i){var o={};if(i)for(;;){var f=HEAPU32[i/4];if(!f)break;o[readAsciiString(f)]=!0,i+=4}return o}_nbind.readPolicyList=readPolicyList;function getDynCall(i,o){var f={float32_t:"d",float64_t:"d",int64_t:"d",uint64_t:"d",void:"v"},p=i.map(function(t){return f[t.name]||"i"}).join(""),E=Module["dynCall_"+p];if(!E)throw new Error("dynCall_"+p+" not found for "+o+"("+i.map(function(t){return t.name}).join(", ")+")");return E}_nbind.getDynCall=getDynCall;function addMethod(i,o,f,p){var E=i[o];i.hasOwnProperty(o)&&E?((E.arity||E.arity===0)&&(E=_nbind.makeOverloader(E,E.arity),i[o]=E),E.addMethod(f,p)):(f.arity=p,i[o]=f)}_nbind.addMethod=addMethod;function throwError(i){throw new Error(i)}_nbind.throwError=throwError,_nbind.bigEndian=!1,_a=_typeModule(_typeModule),_nbind.Type=_a.Type,_nbind.makeType=_a.makeType,_nbind.getComplexType=_a.getComplexType,_nbind.structureList=_a.structureList;var BindType=function(i){__extends(o,i);function o(){var f=i!==null&&i.apply(this,arguments)||this;return f.heap=HEAPU32,f.ptrSize=4,f}return o.prototype.needsWireRead=function(f){return!!this.wireRead||!!this.makeWireRead},o.prototype.needsWireWrite=function(f){return!!this.wireWrite||!!this.makeWireWrite},o}(_nbind.Type);_nbind.BindType=BindType;var PrimitiveType=function(i){__extends(o,i);function o(f){var p=i.call(this,f)||this,E=f.flags&32?{32:HEAPF32,64:HEAPF64}:f.flags&8?{8:HEAPU8,16:HEAPU16,32:HEAPU32}:{8:HEAP8,16:HEAP16,32:HEAP32};return p.heap=E[f.ptrSize*8],p.ptrSize=f.ptrSize,p}return o.prototype.needsWireWrite=function(f){return!!f&&!!f.Strict},o.prototype.makeWireWrite=function(f,p){return p&&p.Strict&&function(E){if(typeof E=="number")return E;throw new Error("Type mismatch")}},o}(BindType);_nbind.PrimitiveType=PrimitiveType;function pushCString(i,o){if(i==null){if(o&&o.Nullable)return 0;throw new Error("Type mismatch")}if(o&&o.Strict){if(typeof i!="string")throw new Error("Type mismatch")}else i=i.toString();var f=Module.lengthBytesUTF8(i)+1,p=_nbind.Pool.lalloc(f);return Module.stringToUTF8Array(i,HEAPU8,p,f),p}_nbind.pushCString=pushCString;function popCString(i){return i===0?null:Module.Pointer_stringify(i)}_nbind.popCString=popCString;var CStringType=function(i){__extends(o,i);function o(){var f=i!==null&&i.apply(this,arguments)||this;return f.wireRead=popCString,f.wireWrite=pushCString,f.readResources=[_nbind.resources.pool],f.writeResources=[_nbind.resources.pool],f}return o.prototype.makeWireWrite=function(f,p){return function(E){return pushCString(E,p)}},o}(BindType);_nbind.CStringType=CStringType;var BooleanType=function(i){__extends(o,i);function o(){var f=i!==null&&i.apply(this,arguments)||this;return f.wireRead=function(p){return!!p},f}return o.prototype.needsWireWrite=function(f){return!!f&&!!f.Strict},o.prototype.makeWireRead=function(f){return"!!("+f+")"},o.prototype.makeWireWrite=function(f,p){return p&&p.Strict&&function(E){if(typeof E=="boolean")return E;throw new Error("Type mismatch")}||f},o}(BindType);_nbind.BooleanType=BooleanType;var Wrapper=function(){function i(){}return i.prototype.persist=function(){this.__nbindState|=1},i}();_nbind.Wrapper=Wrapper;function makeBound(i,o){var f=function(p){__extends(E,p);function E(t,k,L,N){var C=p.call(this)||this;if(!(C instanceof E))return new(Function.prototype.bind.apply(E,Array.prototype.concat.apply([null],arguments)));var U=k,q=L,W=N;if(t!==_nbind.ptrMarker){var ne=C.__nbindConstructor.apply(C,arguments);U=4096|512,W=HEAPU32[ne/4],q=HEAPU32[ne/4+1]}var m={configurable:!0,enumerable:!1,value:null,writable:!1},we={__nbindFlags:U,__nbindPtr:q};W&&(we.__nbindShared=W,_nbind.mark(C));for(var Se=0,he=Object.keys(we);Se>=1;var f=_nbind.valueList[i];return _nbind.valueList[i]=firstFreeValue,firstFreeValue=i,f}else{if(o)return _nbind.popShared(i,o);throw new Error("Invalid value slot "+i)}}_nbind.popValue=popValue;var valueBase=18446744073709552e3;function push64(i){return typeof i=="number"?i:pushValue(i)*4096+valueBase}function pop64(i){return i=3?k=Buffer.from(t):k=new Buffer(t),k.copy(p)}else getBuffer(p).set(t)}}_nbind.commitBuffer=commitBuffer;var dirtyList=[],gcTimer=0;function sweep(){for(var i=0,o=dirtyList;i>2]=DYNAMIC_BASE,staticSealed=!0;function invoke_viiiii(i,o,f,p,E,t){try{Module.dynCall_viiiii(i,o,f,p,E,t)}catch(k){if(typeof k!="number"&&k!=="longjmp")throw k;Module.setThrew(1,0)}}function invoke_vif(i,o,f){try{Module.dynCall_vif(i,o,f)}catch(p){if(typeof p!="number"&&p!=="longjmp")throw p;Module.setThrew(1,0)}}function invoke_vid(i,o,f){try{Module.dynCall_vid(i,o,f)}catch(p){if(typeof p!="number"&&p!=="longjmp")throw p;Module.setThrew(1,0)}}function invoke_fiff(i,o,f,p){try{return Module.dynCall_fiff(i,o,f,p)}catch(E){if(typeof E!="number"&&E!=="longjmp")throw E;Module.setThrew(1,0)}}function invoke_vi(i,o){try{Module.dynCall_vi(i,o)}catch(f){if(typeof f!="number"&&f!=="longjmp")throw f;Module.setThrew(1,0)}}function invoke_vii(i,o,f){try{Module.dynCall_vii(i,o,f)}catch(p){if(typeof p!="number"&&p!=="longjmp")throw p;Module.setThrew(1,0)}}function invoke_ii(i,o){try{return Module.dynCall_ii(i,o)}catch(f){if(typeof f!="number"&&f!=="longjmp")throw f;Module.setThrew(1,0)}}function invoke_viddi(i,o,f,p,E){try{Module.dynCall_viddi(i,o,f,p,E)}catch(t){if(typeof t!="number"&&t!=="longjmp")throw t;Module.setThrew(1,0)}}function invoke_vidd(i,o,f,p){try{Module.dynCall_vidd(i,o,f,p)}catch(E){if(typeof E!="number"&&E!=="longjmp")throw E;Module.setThrew(1,0)}}function invoke_iiii(i,o,f,p){try{return Module.dynCall_iiii(i,o,f,p)}catch(E){if(typeof E!="number"&&E!=="longjmp")throw E;Module.setThrew(1,0)}}function invoke_diii(i,o,f,p){try{return Module.dynCall_diii(i,o,f,p)}catch(E){if(typeof E!="number"&&E!=="longjmp")throw E;Module.setThrew(1,0)}}function invoke_di(i,o){try{return Module.dynCall_di(i,o)}catch(f){if(typeof f!="number"&&f!=="longjmp")throw f;Module.setThrew(1,0)}}function invoke_iid(i,o,f){try{return Module.dynCall_iid(i,o,f)}catch(p){if(typeof p!="number"&&p!=="longjmp")throw p;Module.setThrew(1,0)}}function invoke_iii(i,o,f){try{return Module.dynCall_iii(i,o,f)}catch(p){if(typeof p!="number"&&p!=="longjmp")throw p;Module.setThrew(1,0)}}function invoke_viiddi(i,o,f,p,E,t){try{Module.dynCall_viiddi(i,o,f,p,E,t)}catch(k){if(typeof k!="number"&&k!=="longjmp")throw k;Module.setThrew(1,0)}}function invoke_viiiiii(i,o,f,p,E,t,k){try{Module.dynCall_viiiiii(i,o,f,p,E,t,k)}catch(L){if(typeof L!="number"&&L!=="longjmp")throw L;Module.setThrew(1,0)}}function invoke_dii(i,o,f){try{return Module.dynCall_dii(i,o,f)}catch(p){if(typeof p!="number"&&p!=="longjmp")throw p;Module.setThrew(1,0)}}function invoke_i(i){try{return Module.dynCall_i(i)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_iiiiii(i,o,f,p,E,t){try{return Module.dynCall_iiiiii(i,o,f,p,E,t)}catch(k){if(typeof k!="number"&&k!=="longjmp")throw k;Module.setThrew(1,0)}}function invoke_viiid(i,o,f,p,E){try{Module.dynCall_viiid(i,o,f,p,E)}catch(t){if(typeof t!="number"&&t!=="longjmp")throw t;Module.setThrew(1,0)}}function invoke_viififi(i,o,f,p,E,t,k){try{Module.dynCall_viififi(i,o,f,p,E,t,k)}catch(L){if(typeof L!="number"&&L!=="longjmp")throw L;Module.setThrew(1,0)}}function invoke_viii(i,o,f,p){try{Module.dynCall_viii(i,o,f,p)}catch(E){if(typeof E!="number"&&E!=="longjmp")throw E;Module.setThrew(1,0)}}function invoke_v(i){try{Module.dynCall_v(i)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_viid(i,o,f,p){try{Module.dynCall_viid(i,o,f,p)}catch(E){if(typeof E!="number"&&E!=="longjmp")throw E;Module.setThrew(1,0)}}function invoke_idd(i,o,f){try{return Module.dynCall_idd(i,o,f)}catch(p){if(typeof p!="number"&&p!=="longjmp")throw p;Module.setThrew(1,0)}}function invoke_viiii(i,o,f,p,E){try{Module.dynCall_viiii(i,o,f,p,E)}catch(t){if(typeof t!="number"&&t!=="longjmp")throw t;Module.setThrew(1,0)}}Module.asmGlobalArg={Math,Int8Array,Int16Array,Int32Array,Uint8Array,Uint16Array,Uint32Array,Float32Array,Float64Array,NaN:NaN,Infinity:Infinity},Module.asmLibraryArg={abort,assert,enlargeMemory,getTotalMemory,abortOnCannotGrowMemory,invoke_viiiii,invoke_vif,invoke_vid,invoke_fiff,invoke_vi,invoke_vii,invoke_ii,invoke_viddi,invoke_vidd,invoke_iiii,invoke_diii,invoke_di,invoke_iid,invoke_iii,invoke_viiddi,invoke_viiiiii,invoke_dii,invoke_i,invoke_iiiiii,invoke_viiid,invoke_viififi,invoke_viii,invoke_v,invoke_viid,invoke_idd,invoke_viiii,_emscripten_asm_const_iiiii,_emscripten_asm_const_iiidddddd,_emscripten_asm_const_iiiid,__nbind_reference_external,_emscripten_asm_const_iiiiiiii,_removeAccessorPrefix,_typeModule,__nbind_register_pool,__decorate,_llvm_stackrestore,___cxa_atexit,__extends,__nbind_get_value_object,__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,_emscripten_set_main_loop_timing,__nbind_register_primitive,__nbind_register_type,_emscripten_memcpy_big,__nbind_register_function,___setErrNo,__nbind_register_class,__nbind_finish,_abort,_nbind_value,_llvm_stacksave,___syscall54,_defineHidden,_emscripten_set_main_loop,_emscripten_get_now,__nbind_register_callback_signature,_emscripten_asm_const_iiiiii,__nbind_free_external,_emscripten_asm_const_iiii,_emscripten_asm_const_iiididi,___syscall6,_atexit,___syscall140,___syscall146,DYNAMICTOP_PTR,tempDoublePtr,ABORT,STACKTOP,STACK_MAX,cttz_i8,___dso_handle};var asm=function(i,o,f){var p=new i.Int8Array(f),E=new i.Int16Array(f),t=new i.Int32Array(f),k=new i.Uint8Array(f),L=new i.Uint16Array(f),N=new i.Uint32Array(f),C=new i.Float32Array(f),U=new i.Float64Array(f),q=o.DYNAMICTOP_PTR|0,W=o.tempDoublePtr|0,ne=o.ABORT|0,m=o.STACKTOP|0,we=o.STACK_MAX|0,Se=o.cttz_i8|0,he=o.___dso_handle|0,ge=0,ze=0,pe=0,Oe=0,le=i.NaN,Ue=i.Infinity,Ge=0,rt=0,wt=0,xt=0,$e=0,ft=0,Ke=i.Math.floor,jt=i.Math.abs,$t=i.Math.sqrt,at=i.Math.pow,Q=i.Math.cos,ae=i.Math.sin,Ce=i.Math.tan,ue=i.Math.acos,je=i.Math.asin,ct=i.Math.atan,At=i.Math.atan2,en=i.Math.exp,ln=i.Math.log,An=i.Math.ceil,nr=i.Math.imul,un=i.Math.min,Wt=i.Math.max,vr=i.Math.clz32,w=i.Math.fround,Ut=o.abort,Vn=o.assert,fr=o.enlargeMemory,Fr=o.getTotalMemory,ur=o.abortOnCannotGrowMemory,br=o.invoke_viiiii,Kt=o.invoke_vif,vu=o.invoke_vid,a0=o.invoke_fiff,So=o.invoke_vi,Go=o.invoke_vii,Os=o.invoke_ii,Yo=o.invoke_viddi,Ko=o.invoke_vidd,qt=o.invoke_iiii,_i=o.invoke_diii,eu=o.invoke_di,ai=o.invoke_iid,mr=o.invoke_iii,Xo=o.invoke_viiddi,W0=o.invoke_viiiiii,Lu=o.invoke_dii,V0=o.invoke_i,Hr=o.invoke_iiiiii,To=o.invoke_viiid,Co=o.invoke_viififi,L0=o.invoke_viii,tu=o.invoke_v,Si=o.invoke_viid,ks=o.invoke_idd,Hl=o.invoke_viiii,F0=o._emscripten_asm_const_iiiii,f0=o._emscripten_asm_const_iiidddddd,Pr=o._emscripten_asm_const_iiiid,Ei=o.__nbind_reference_external,G0=o._emscripten_asm_const_iiiiiiii,fi=o._removeAccessorPrefix,Zt=o._typeModule,Ln=o.__nbind_register_pool,Di=o.__decorate,ci=o._llvm_stackrestore,Ht=o.___cxa_atexit,Du=o.__extends,Yi=o.__nbind_get_value_object,Y0=o.__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,Ui=o._emscripten_set_main_loop_timing,Wl=o.__nbind_register_primitive,xo=o.__nbind_register_type,ni=o._emscripten_memcpy_big,oo=o.__nbind_register_function,Vl=o.___setErrNo,Ao=o.__nbind_register_class,Ms=o.__nbind_finish,Xn=o._abort,Qo=o._nbind_value,lo=o._llvm_stacksave,b0=o.___syscall54,yl=o._defineHidden,Ro=o._emscripten_set_main_loop,Et=o._emscripten_get_now,Pt=o.__nbind_register_callback_signature,Bn=o._emscripten_asm_const_iiiiii,Ir=o.__nbind_free_external,ji=o._emscripten_asm_const_iiii,Wr=o._emscripten_asm_const_iiididi,wu=o.___syscall6,c0=o._atexit,Ti=o.___syscall140,d0=o.___syscall146,as=w(0);let St=w(0);function so(e){e=e|0;var n=0;return n=m,m=m+e|0,m=m+15&-16,n|0}function Jo(){return m|0}function Gl(e){e=e|0,m=e}function Fu(e,n){e=e|0,n=n|0,m=e,we=n}function fs(e,n){e=e|0,n=n|0,ge||(ge=e,ze=n)}function P0(e){e=e|0,ft=e}function X(){return ft|0}function _e(){var e=0,n=0;pr(8104,8,400)|0,pr(8504,408,540)|0,e=9044,n=e+44|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));p[9088]=0,p[9089]=1,t[2273]=0,t[2274]=948,t[2275]=948,Ht(17,8104,he|0)|0}function Ne(e){e=e|0,ic(e+948|0)}function Me(e){return e=w(e),((cr(e)|0)&2147483647)>>>0>2139095040|0}function dt(e,n,r){e=e|0,n=n|0,r=r|0;e:do if(t[e+(n<<3)+4>>2]|0)e=e+(n<<3)|0;else{if((n|2|0)==3?t[e+60>>2]|0:0){e=e+56|0;break}switch(n|0){case 0:case 2:case 4:case 5:{if(t[e+52>>2]|0){e=e+48|0;break e}break}default:}if(t[e+68>>2]|0){e=e+64|0;break}else{e=(n|1|0)==5?948:r;break}}while(0);return e|0}function Hn(e){e=e|0;var n=0;return n=C_(1e3)|0,Dn(e,(n|0)!=0,2456),t[2276]=(t[2276]|0)+1,pr(n|0,8104,1e3)|0,p[e+2>>0]|0&&(t[n+4>>2]=2,t[n+12>>2]=4),t[n+976>>2]=e,n|0}function Dn(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0;l=m,m=m+16|0,u=l,n||(t[u>>2]=r,_l(e,5,3197,u)),m=l}function or(){return Hn(956)|0}function mi(e){e=e|0;var n=0;return n=cn(1e3)|0,Su(n,e),Dn(t[e+976>>2]|0,1,2456),t[2276]=(t[2276]|0)+1,t[n+944>>2]=0,n|0}function Su(e,n){e=e|0,n=n|0;var r=0;pr(e|0,n|0,948)|0,na(e+948|0,n+948|0),r=e+960|0,e=n+960|0,n=r+40|0;do t[r>>2]=t[e>>2],r=r+4|0,e=e+4|0;while((r|0)<(n|0))}function bu(e){e=e|0;var n=0,r=0,u=0,l=0;if(n=e+944|0,r=t[n>>2]|0,r|0&&(Pu(r+948|0,e)|0,t[n>>2]=0),r=mu(e)|0,r|0){n=0;do t[(yi(e,n)|0)+944>>2]=0,n=n+1|0;while((n|0)!=(r|0))}r=e+948|0,u=t[r>>2]|0,l=e+952|0,n=t[l>>2]|0,(n|0)!=(u|0)&&(t[l>>2]=n+(~((n+-4-u|0)>>>2)<<2)),Oo(r),x_(e),t[2276]=(t[2276]|0)+-1}function Pu(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0;u=t[e>>2]|0,D=e+4|0,r=t[D>>2]|0,s=r;e:do if((u|0)==(r|0))l=u,h=4;else for(e=u;;){if((t[e>>2]|0)==(n|0)){l=e,h=4;break e}if(e=e+4|0,(e|0)==(r|0)){e=0;break}}while(0);return(h|0)==4&&((l|0)!=(r|0)?(u=l+4|0,e=s-u|0,n=e>>2,n&&(Iy(l|0,u|0,e|0)|0,r=t[D>>2]|0),e=l+(n<<2)|0,(r|0)==(e|0)||(t[D>>2]=r+(~((r+-4-e|0)>>>2)<<2)),e=1):e=0),e|0}function mu(e){return e=e|0,(t[e+952>>2]|0)-(t[e+948>>2]|0)>>2|0}function yi(e,n){e=e|0,n=n|0;var r=0;return r=t[e+948>>2]|0,(t[e+952>>2]|0)-r>>2>>>0>n>>>0?e=t[r+(n<<2)>>2]|0:e=0,e|0}function Oo(e){e=e|0;var n=0,r=0,u=0,l=0;u=m,m=m+32|0,n=u,l=t[e>>2]|0,r=(t[e+4>>2]|0)-l|0,((t[e+8>>2]|0)-l|0)>>>0>r>>>0&&(l=r>>2,Y(n,l,l,e+8|0),Qr(e,n),Jr(n)),m=u}function Tu(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0;M=mu(e)|0;do if(M|0){if((t[(yi(e,0)|0)+944>>2]|0)==(e|0)){if(!(Pu(e+948|0,n)|0))break;pr(n+400|0,8504,540)|0,t[n+944>>2]=0,Gn(e);break}h=t[(t[e+976>>2]|0)+12>>2]|0,D=e+948|0,S=(h|0)==0,r=0,s=0;do u=t[(t[D>>2]|0)+(s<<2)>>2]|0,(u|0)==(n|0)?Gn(e):(l=mi(u)|0,t[(t[D>>2]|0)+(r<<2)>>2]=l,t[l+944>>2]=e,S||$E[h&15](u,l,e,r),r=r+1|0),s=s+1|0;while((s|0)!=(M|0));if(r>>>0>>0){S=e+948|0,D=e+952|0,h=r,r=t[D>>2]|0;do s=(t[S>>2]|0)+(h<<2)|0,u=s+4|0,l=r-u|0,n=l>>2,n&&(Iy(s|0,u|0,l|0)|0,r=t[D>>2]|0),l=r,u=s+(n<<2)|0,(l|0)!=(u|0)&&(r=l+(~((l+-4-u|0)>>>2)<<2)|0,t[D>>2]=r),h=h+1|0;while((h|0)!=(M|0))}}while(0)}function ao(e){e=e|0;var n=0,r=0,u=0,l=0;Iu(e,(mu(e)|0)==0,2491),Iu(e,(t[e+944>>2]|0)==0,2545),n=e+948|0,r=t[n>>2]|0,u=e+952|0,l=t[u>>2]|0,(l|0)!=(r|0)&&(t[u>>2]=l+(~((l+-4-r|0)>>>2)<<2)),Oo(n),n=e+976|0,r=t[n>>2]|0,pr(e|0,8104,1e3)|0,p[r+2>>0]|0&&(t[e+4>>2]=2,t[e+12>>2]=4),t[n>>2]=r}function Iu(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0;l=m,m=m+16|0,u=l,n||(t[u>>2]=r,sr(e,5,3197,u)),m=l}function Oa(){return t[2276]|0}function p0(){var e=0;return e=C_(20)|0,Zs((e|0)!=0,2592),t[2277]=(t[2277]|0)+1,t[e>>2]=t[239],t[e+4>>2]=t[240],t[e+8>>2]=t[241],t[e+12>>2]=t[242],t[e+16>>2]=t[243],e|0}function Zs(e,n){e=e|0,n=n|0;var r=0,u=0;u=m,m=m+16|0,r=u,e||(t[r>>2]=n,sr(0,5,3197,r)),m=u}function K0(e){e=e|0,x_(e),t[2277]=(t[2277]|0)+-1}function $s(e,n){e=e|0,n=n|0;var r=0;n?(Iu(e,(mu(e)|0)==0,2629),r=1):(r=0,n=0),t[e+964>>2]=n,t[e+988>>2]=r}function ka(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;u=m,m=m+16|0,s=u+8|0,l=u+4|0,h=u,t[l>>2]=n,Iu(e,(t[n+944>>2]|0)==0,2709),Iu(e,(t[e+964>>2]|0)==0,2763),cs(e),n=e+948|0,t[h>>2]=(t[n>>2]|0)+(r<<2),t[s>>2]=t[h>>2],w0(n,s,l)|0,t[(t[l>>2]|0)+944>>2]=e,Gn(e),m=u}function cs(e){e=e|0;var n=0,r=0,u=0,l=0,s=0,h=0,D=0;if(r=mu(e)|0,r|0?(t[(yi(e,0)|0)+944>>2]|0)!=(e|0):0){u=t[(t[e+976>>2]|0)+12>>2]|0,l=e+948|0,s=(u|0)==0,n=0;do h=t[(t[l>>2]|0)+(n<<2)>>2]|0,D=mi(h)|0,t[(t[l>>2]|0)+(n<<2)>>2]=D,t[D+944>>2]=e,s||$E[u&15](h,D,e,n),n=n+1|0;while((n|0)!=(r|0))}}function w0(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0,Pe=0,Ee=0,ve=0,Qe=0,We=0;Qe=m,m=m+64|0,P=Qe+52|0,D=Qe+48|0,K=Qe+28|0,Pe=Qe+24|0,Ee=Qe+20|0,ve=Qe,u=t[e>>2]|0,s=u,n=u+((t[n>>2]|0)-s>>2<<2)|0,u=e+4|0,l=t[u>>2]|0,h=e+8|0;do if(l>>>0<(t[h>>2]|0)>>>0){if((n|0)==(l|0)){t[n>>2]=t[r>>2],t[u>>2]=(t[u>>2]|0)+4;break}Ur(e,n,l,n+4|0),n>>>0<=r>>>0&&(r=(t[u>>2]|0)>>>0>r>>>0?r+4|0:r),t[n>>2]=t[r>>2]}else{u=(l-s>>2)+1|0,l=x0(e)|0,l>>>0>>0&&li(e),O=t[e>>2]|0,M=(t[h>>2]|0)-O|0,s=M>>1,Y(ve,M>>2>>>0>>1>>>0?s>>>0>>0?u:s:l,n-O>>2,e+8|0),O=ve+8|0,u=t[O>>2]|0,s=ve+12|0,M=t[s>>2]|0,h=M,S=u;do if((u|0)==(M|0)){if(M=ve+4|0,u=t[M>>2]|0,We=t[ve>>2]|0,l=We,u>>>0<=We>>>0){u=h-l>>1,u=(u|0)==0?1:u,Y(K,u,u>>>2,t[ve+16>>2]|0),t[Pe>>2]=t[M>>2],t[Ee>>2]=t[O>>2],t[D>>2]=t[Pe>>2],t[P>>2]=t[Ee>>2],hi(K,D,P),u=t[ve>>2]|0,t[ve>>2]=t[K>>2],t[K>>2]=u,u=K+4|0,We=t[M>>2]|0,t[M>>2]=t[u>>2],t[u>>2]=We,u=K+8|0,We=t[O>>2]|0,t[O>>2]=t[u>>2],t[u>>2]=We,u=K+12|0,We=t[s>>2]|0,t[s>>2]=t[u>>2],t[u>>2]=We,Jr(K),u=t[O>>2]|0;break}s=u,h=((s-l>>2)+1|0)/-2|0,D=u+(h<<2)|0,l=S-s|0,s=l>>2,s&&(Iy(D|0,u|0,l|0)|0,u=t[M>>2]|0),We=D+(s<<2)|0,t[O>>2]=We,t[M>>2]=u+(h<<2),u=We}while(0);t[u>>2]=t[r>>2],t[O>>2]=(t[O>>2]|0)+4,n=lt(e,ve,n)|0,Jr(ve)}while(0);return m=Qe,n|0}function Gn(e){e=e|0;var n=0;do{if(n=e+984|0,p[n>>0]|0)break;p[n>>0]=1,C[e+504>>2]=w(le),e=t[e+944>>2]|0}while((e|0)!=0)}function ic(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-4-u|0)>>>2)<<2)),yt(r))}function ri(e){return e=e|0,t[e+944>>2]|0}function Gr(e){e=e|0,Iu(e,(t[e+964>>2]|0)!=0,2832),Gn(e)}function Yl(e){return e=e|0,(p[e+984>>0]|0)!=0|0}function ea(e,n){e=e|0,n=n|0,MI(e,n,400)|0&&(pr(e|0,n|0,400)|0,Gn(e))}function lf(e){e=e|0;var n=St;return n=w(C[e+44>>2]),e=Me(n)|0,w(e?w(0):n)}function Ns(e){e=e|0;var n=St;return n=w(C[e+48>>2]),Me(n)|0&&(n=p[(t[e+976>>2]|0)+2>>0]|0?w(1):w(0)),w(n)}function Ma(e,n){e=e|0,n=n|0,t[e+980>>2]=n}function Ls(e){return e=e|0,t[e+980>>2]|0}function h0(e,n){e=e|0,n=n|0;var r=0;r=e+4|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,Gn(e))}function Fs(e){return e=e|0,t[e+4>>2]|0}function Ni(e,n){e=e|0,n=n|0;var r=0;r=e+8|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,Gn(e))}function B(e){return e=e|0,t[e+8>>2]|0}function z(e,n){e=e|0,n=n|0;var r=0;r=e+12|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,Gn(e))}function G(e){return e=e|0,t[e+12>>2]|0}function $(e,n){e=e|0,n=n|0;var r=0;r=e+16|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,Gn(e))}function De(e){return e=e|0,t[e+16>>2]|0}function me(e,n){e=e|0,n=n|0;var r=0;r=e+20|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,Gn(e))}function xe(e){return e=e|0,t[e+20>>2]|0}function Z(e,n){e=e|0,n=n|0;var r=0;r=e+24|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,Gn(e))}function ke(e){return e=e|0,t[e+24>>2]|0}function Xe(e,n){e=e|0,n=n|0;var r=0;r=e+28|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,Gn(e))}function ht(e){return e=e|0,t[e+28>>2]|0}function ie(e,n){e=e|0,n=n|0;var r=0;r=e+32|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,Gn(e))}function qe(e){return e=e|0,t[e+32>>2]|0}function tt(e,n){e=e|0,n=n|0;var r=0;r=e+36|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,Gn(e))}function Tt(e){return e=e|0,t[e+36>>2]|0}function kt(e,n){e=e|0,n=w(n);var r=0;r=e+40|0,w(C[r>>2])!=n&&(C[r>>2]=n,Gn(e))}function bt(e,n){e=e|0,n=w(n);var r=0;r=e+44|0,w(C[r>>2])!=n&&(C[r>>2]=n,Gn(e))}function on(e,n){e=e|0,n=w(n);var r=0;r=e+48|0,w(C[r>>2])!=n&&(C[r>>2]=n,Gn(e))}function tn(e,n){e=e|0,n=w(n);var r=0,u=0,l=0,s=0;s=Me(n)|0,r=(s^1)&1,u=e+52|0,l=e+56|0,(s|w(C[u>>2])==n?(t[l>>2]|0)==(r|0):0)||(C[u>>2]=n,t[l>>2]=r,Gn(e))}function Lt(e,n){e=e|0,n=w(n);var r=0,u=0;u=e+52|0,r=e+56|0,(w(C[u>>2])==n?(t[r>>2]|0)==2:0)||(C[u>>2]=n,u=Me(n)|0,t[r>>2]=u?3:2,Gn(e))}function gn(e,n){e=e|0,n=n|0;var r=0,u=0;u=n+52|0,r=t[u+4>>2]|0,n=e,t[n>>2]=t[u>>2],t[n+4>>2]=r}function lr(e,n,r){e=e|0,n=n|0,r=w(r);var u=0,l=0,s=0;s=Me(r)|0,u=(s^1)&1,l=e+132+(n<<3)|0,n=e+132+(n<<3)+4|0,(s|w(C[l>>2])==r?(t[n>>2]|0)==(u|0):0)||(C[l>>2]=r,t[n>>2]=u,Gn(e))}function Qn(e,n,r){e=e|0,n=n|0,r=w(r);var u=0,l=0,s=0;s=Me(r)|0,u=s?0:2,l=e+132+(n<<3)|0,n=e+132+(n<<3)+4|0,(s|w(C[l>>2])==r?(t[n>>2]|0)==(u|0):0)||(C[l>>2]=r,t[n>>2]=u,Gn(e))}function _r(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=n+132+(r<<3)|0,n=t[u+4>>2]|0,r=e,t[r>>2]=t[u>>2],t[r+4>>2]=n}function Cn(e,n,r){e=e|0,n=n|0,r=w(r);var u=0,l=0,s=0;s=Me(r)|0,u=(s^1)&1,l=e+60+(n<<3)|0,n=e+60+(n<<3)+4|0,(s|w(C[l>>2])==r?(t[n>>2]|0)==(u|0):0)||(C[l>>2]=r,t[n>>2]=u,Gn(e))}function Ar(e,n,r){e=e|0,n=n|0,r=w(r);var u=0,l=0,s=0;s=Me(r)|0,u=s?0:2,l=e+60+(n<<3)|0,n=e+60+(n<<3)+4|0,(s|w(C[l>>2])==r?(t[n>>2]|0)==(u|0):0)||(C[l>>2]=r,t[n>>2]=u,Gn(e))}function v0(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=n+60+(r<<3)|0,n=t[u+4>>2]|0,r=e,t[r>>2]=t[u>>2],t[r+4>>2]=n}function Rr(e,n){e=e|0,n=n|0;var r=0;r=e+60+(n<<3)+4|0,(t[r>>2]|0)!=3&&(C[e+60+(n<<3)>>2]=w(le),t[r>>2]=3,Gn(e))}function nt(e,n,r){e=e|0,n=n|0,r=w(r);var u=0,l=0,s=0;s=Me(r)|0,u=(s^1)&1,l=e+204+(n<<3)|0,n=e+204+(n<<3)+4|0,(s|w(C[l>>2])==r?(t[n>>2]|0)==(u|0):0)||(C[l>>2]=r,t[n>>2]=u,Gn(e))}function _t(e,n,r){e=e|0,n=n|0,r=w(r);var u=0,l=0,s=0;s=Me(r)|0,u=s?0:2,l=e+204+(n<<3)|0,n=e+204+(n<<3)+4|0,(s|w(C[l>>2])==r?(t[n>>2]|0)==(u|0):0)||(C[l>>2]=r,t[n>>2]=u,Gn(e))}function Ze(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=n+204+(r<<3)|0,n=t[u+4>>2]|0,r=e,t[r>>2]=t[u>>2],t[r+4>>2]=n}function Ft(e,n,r){e=e|0,n=n|0,r=w(r);var u=0,l=0,s=0;s=Me(r)|0,u=(s^1)&1,l=e+276+(n<<3)|0,n=e+276+(n<<3)+4|0,(s|w(C[l>>2])==r?(t[n>>2]|0)==(u|0):0)||(C[l>>2]=r,t[n>>2]=u,Gn(e))}function nn(e,n){return e=e|0,n=n|0,w(C[e+276+(n<<3)>>2])}function sn(e,n){e=e|0,n=w(n);var r=0,u=0,l=0,s=0;s=Me(n)|0,r=(s^1)&1,u=e+348|0,l=e+352|0,(s|w(C[u>>2])==n?(t[l>>2]|0)==(r|0):0)||(C[u>>2]=n,t[l>>2]=r,Gn(e))}function Yn(e,n){e=e|0,n=w(n);var r=0,u=0;u=e+348|0,r=e+352|0,(w(C[u>>2])==n?(t[r>>2]|0)==2:0)||(C[u>>2]=n,u=Me(n)|0,t[r>>2]=u?3:2,Gn(e))}function yr(e){e=e|0;var n=0;n=e+352|0,(t[n>>2]|0)!=3&&(C[e+348>>2]=w(le),t[n>>2]=3,Gn(e))}function nu(e,n){e=e|0,n=n|0;var r=0,u=0;u=n+348|0,r=t[u+4>>2]|0,n=e,t[n>>2]=t[u>>2],t[n+4>>2]=r}function Cu(e,n){e=e|0,n=w(n);var r=0,u=0,l=0,s=0;s=Me(n)|0,r=(s^1)&1,u=e+356|0,l=e+360|0,(s|w(C[u>>2])==n?(t[l>>2]|0)==(r|0):0)||(C[u>>2]=n,t[l>>2]=r,Gn(e))}function S0(e,n){e=e|0,n=w(n);var r=0,u=0;u=e+356|0,r=e+360|0,(w(C[u>>2])==n?(t[r>>2]|0)==2:0)||(C[u>>2]=n,u=Me(n)|0,t[r>>2]=u?3:2,Gn(e))}function X0(e){e=e|0;var n=0;n=e+360|0,(t[n>>2]|0)!=3&&(C[e+356>>2]=w(le),t[n>>2]=3,Gn(e))}function xu(e,n){e=e|0,n=n|0;var r=0,u=0;u=n+356|0,r=t[u+4>>2]|0,n=e,t[n>>2]=t[u>>2],t[n+4>>2]=r}function di(e,n){e=e|0,n=w(n);var r=0,u=0,l=0,s=0;s=Me(n)|0,r=(s^1)&1,u=e+364|0,l=e+368|0,(s|w(C[u>>2])==n?(t[l>>2]|0)==(r|0):0)||(C[u>>2]=n,t[l>>2]=r,Gn(e))}function ko(e,n){e=e|0,n=w(n);var r=0,u=0,l=0,s=0;s=Me(n)|0,r=s?0:2,u=e+364|0,l=e+368|0,(s|w(C[u>>2])==n?(t[l>>2]|0)==(r|0):0)||(C[u>>2]=n,t[l>>2]=r,Gn(e))}function Zo(e,n){e=e|0,n=n|0;var r=0,u=0;u=n+364|0,r=t[u+4>>2]|0,n=e,t[n>>2]=t[u>>2],t[n+4>>2]=r}function sf(e,n){e=e|0,n=w(n);var r=0,u=0,l=0,s=0;s=Me(n)|0,r=(s^1)&1,u=e+372|0,l=e+376|0,(s|w(C[u>>2])==n?(t[l>>2]|0)==(r|0):0)||(C[u>>2]=n,t[l>>2]=r,Gn(e))}function gl(e,n){e=e|0,n=w(n);var r=0,u=0,l=0,s=0;s=Me(n)|0,r=s?0:2,u=e+372|0,l=e+376|0,(s|w(C[u>>2])==n?(t[l>>2]|0)==(r|0):0)||(C[u>>2]=n,t[l>>2]=r,Gn(e))}function af(e,n){e=e|0,n=n|0;var r=0,u=0;u=n+372|0,r=t[u+4>>2]|0,n=e,t[n>>2]=t[u>>2],t[n+4>>2]=r}function Mo(e,n){e=e|0,n=w(n);var r=0,u=0,l=0,s=0;s=Me(n)|0,r=(s^1)&1,u=e+380|0,l=e+384|0,(s|w(C[u>>2])==n?(t[l>>2]|0)==(r|0):0)||(C[u>>2]=n,t[l>>2]=r,Gn(e))}function ds(e,n){e=e|0,n=w(n);var r=0,u=0,l=0,s=0;s=Me(n)|0,r=s?0:2,u=e+380|0,l=e+384|0,(s|w(C[u>>2])==n?(t[l>>2]|0)==(r|0):0)||(C[u>>2]=n,t[l>>2]=r,Gn(e))}function bs(e,n){e=e|0,n=n|0;var r=0,u=0;u=n+380|0,r=t[u+4>>2]|0,n=e,t[n>>2]=t[u>>2],t[n+4>>2]=r}function No(e,n){e=e|0,n=w(n);var r=0,u=0,l=0,s=0;s=Me(n)|0,r=(s^1)&1,u=e+388|0,l=e+392|0,(s|w(C[u>>2])==n?(t[l>>2]|0)==(r|0):0)||(C[u>>2]=n,t[l>>2]=r,Gn(e))}function Lo(e,n){e=e|0,n=w(n);var r=0,u=0,l=0,s=0;s=Me(n)|0,r=s?0:2,u=e+388|0,l=e+392|0,(s|w(C[u>>2])==n?(t[l>>2]|0)==(r|0):0)||(C[u>>2]=n,t[l>>2]=r,Gn(e))}function ps(e,n){e=e|0,n=n|0;var r=0,u=0;u=n+388|0,r=t[u+4>>2]|0,n=e,t[n>>2]=t[u>>2],t[n+4>>2]=r}function Vu(e,n){e=e|0,n=w(n);var r=0;r=e+396|0,w(C[r>>2])!=n&&(C[r>>2]=n,Gn(e))}function yu(e){return e=e|0,w(C[e+396>>2])}function pi(e){return e=e|0,w(C[e+400>>2])}function T0(e){return e=e|0,w(C[e+404>>2])}function Q0(e){return e=e|0,w(C[e+408>>2])}function Fo(e){return e=e|0,w(C[e+412>>2])}function ta(e){return e=e|0,w(C[e+416>>2])}function Kl(e){return e=e|0,w(C[e+420>>2])}function Ki(e,n){switch(e=e|0,n=n|0,Iu(e,(n|0)<6,2918),n|0){case 0:{n=(t[e+496>>2]|0)==2?5:4;break}case 2:{n=(t[e+496>>2]|0)==2?4:5;break}default:}return w(C[e+424+(n<<2)>>2])}function Yr(e,n){switch(e=e|0,n=n|0,Iu(e,(n|0)<6,2918),n|0){case 0:{n=(t[e+496>>2]|0)==2?5:4;break}case 2:{n=(t[e+496>>2]|0)==2?4:5;break}default:}return w(C[e+448+(n<<2)>>2])}function fo(e,n){switch(e=e|0,n=n|0,Iu(e,(n|0)<6,2918),n|0){case 0:{n=(t[e+496>>2]|0)==2?5:4;break}case 2:{n=(t[e+496>>2]|0)==2?4:5;break}default:}return w(C[e+472+(n<<2)>>2])}function Oi(e,n){e=e|0,n=n|0;var r=0,u=St;return r=t[e+4>>2]|0,(r|0)==(t[n+4>>2]|0)?r?(u=w(C[e>>2]),e=w(jt(w(u-w(C[n>>2]))))>2]=0,t[u+4>>2]=0,t[u+8>>2]=0,Y0(u|0,e|0,n|0,0),sr(e,3,(p[u+11>>0]|0)<0?t[u>>2]|0:u,r),eB(u),m=r}function J0(e,n,r,u){e=w(e),n=w(n),r=r|0,u=u|0;var l=St;e=w(e*n),l=w(YE(e,w(1)));do if(gi(l,w(0))|0)e=w(e-l);else{if(e=w(e-l),gi(l,w(1))|0){e=w(e+w(1));break}if(r){e=w(e+w(1));break}u||(l>w(.5)?l=w(1):(u=gi(l,w(.5))|0,l=w(u?1:0)),e=w(e+l))}while(0);return w(e/n)}function Z0(e,n,r,u,l,s,h,D,S,M,O,P,K){e=e|0,n=w(n),r=r|0,u=w(u),l=l|0,s=w(s),h=h|0,D=w(D),S=w(S),M=w(M),O=w(O),P=w(P),K=K|0;var Pe=0,Ee=St,ve=St,Qe=St,We=St,st=St,Re=St;return S>2]),Ee!=w(0)):0)?(Qe=w(J0(n,Ee,0,0)),We=w(J0(u,Ee,0,0)),ve=w(J0(s,Ee,0,0)),Ee=w(J0(D,Ee,0,0))):(ve=s,Qe=n,Ee=D,We=u),(l|0)==(e|0)?Pe=gi(ve,Qe)|0:Pe=0,(h|0)==(r|0)?K=gi(Ee,We)|0:K=0,((Pe?0:(st=w(n-O),!(Te(e,st,S)|0)))?!(et(e,st,l,S)|0):0)?Pe=Ve(e,st,l,s,S)|0:Pe=1,((K?0:(Re=w(u-P),!(Te(r,Re,M)|0)))?!(et(r,Re,h,M)|0):0)?K=Ve(r,Re,h,D,M)|0:K=1,K=Pe&K),K|0}function Te(e,n,r){return e=e|0,n=w(n),r=w(r),(e|0)==1?e=gi(n,r)|0:e=0,e|0}function et(e,n,r,u){return e=e|0,n=w(n),r=r|0,u=w(u),(e|0)==2&(r|0)==0?n>=u?e=1:e=gi(n,u)|0:e=0,e|0}function Ve(e,n,r,u,l){return e=e|0,n=w(n),r=r|0,u=w(u),l=w(l),(e|0)==2&(r|0)==2&u>n?l<=n?e=1:e=gi(n,l)|0:e=0,e|0}function Gt(e,n,r,u,l,s,h,D,S,M,O){e=e|0,n=w(n),r=w(r),u=u|0,l=l|0,s=s|0,h=w(h),D=w(D),S=S|0,M=M|0,O=O|0;var P=0,K=0,Pe=0,Ee=0,ve=St,Qe=St,We=0,st=0,Re=0,Fe=0,Qt=0,Lr=0,Nn=0,mn=0,hr=0,kr=0,On=0,Zi=St,ts=St,ns=St,rs=0,Xs=0;On=m,m=m+160|0,mn=On+152|0,Nn=On+120|0,Lr=On+104|0,Re=On+72|0,Ee=On+56|0,Qt=On+8|0,st=On,Fe=(t[2279]|0)+1|0,t[2279]=Fe,hr=e+984|0,((p[hr>>0]|0)!=0?(t[e+512>>2]|0)!=(t[2278]|0):0)?We=4:(t[e+516>>2]|0)==(u|0)?kr=0:We=4,(We|0)==4&&(t[e+520>>2]=0,t[e+924>>2]=-1,t[e+928>>2]=-1,C[e+932>>2]=w(-1),C[e+936>>2]=w(-1),kr=1);e:do if(t[e+964>>2]|0)if(ve=w(Yt(e,2,h)),Qe=w(Yt(e,0,h)),P=e+916|0,ns=w(C[P>>2]),ts=w(C[e+920>>2]),Zi=w(C[e+932>>2]),Z0(l,n,s,r,t[e+924>>2]|0,ns,t[e+928>>2]|0,ts,Zi,w(C[e+936>>2]),ve,Qe,O)|0)We=22;else if(Pe=t[e+520>>2]|0,!Pe)We=21;else for(K=0;;){if(P=e+524+(K*24|0)|0,Zi=w(C[P>>2]),ts=w(C[e+524+(K*24|0)+4>>2]),ns=w(C[e+524+(K*24|0)+16>>2]),Z0(l,n,s,r,t[e+524+(K*24|0)+8>>2]|0,Zi,t[e+524+(K*24|0)+12>>2]|0,ts,ns,w(C[e+524+(K*24|0)+20>>2]),ve,Qe,O)|0){We=22;break e}if(K=K+1|0,K>>>0>=Pe>>>0){We=21;break}}else{if(S){if(P=e+916|0,!(gi(w(C[P>>2]),n)|0)){We=21;break}if(!(gi(w(C[e+920>>2]),r)|0)){We=21;break}if((t[e+924>>2]|0)!=(l|0)){We=21;break}P=(t[e+928>>2]|0)==(s|0)?P:0,We=22;break}if(Pe=t[e+520>>2]|0,!Pe)We=21;else for(K=0;;){if(P=e+524+(K*24|0)|0,((gi(w(C[P>>2]),n)|0?gi(w(C[e+524+(K*24|0)+4>>2]),r)|0:0)?(t[e+524+(K*24|0)+8>>2]|0)==(l|0):0)?(t[e+524+(K*24|0)+12>>2]|0)==(s|0):0){We=22;break e}if(K=K+1|0,K>>>0>=Pe>>>0){We=21;break}}}while(0);do if((We|0)==21)p[11697]|0?(P=0,We=28):(P=0,We=31);else if((We|0)==22){if(K=(p[11697]|0)!=0,!((P|0)!=0&(kr^1)))if(K){We=28;break}else{We=31;break}Ee=P+16|0,t[e+908>>2]=t[Ee>>2],Pe=P+20|0,t[e+912>>2]=t[Pe>>2],(p[11698]|0)==0|K^1||(t[st>>2]=Br(Fe)|0,t[st+4>>2]=Fe,sr(e,4,2972,st),K=t[e+972>>2]|0,K|0&&M1[K&127](e),l=wn(l,S)|0,s=wn(s,S)|0,Xs=+w(C[Ee>>2]),rs=+w(C[Pe>>2]),t[Qt>>2]=l,t[Qt+4>>2]=s,U[Qt+8>>3]=+n,U[Qt+16>>3]=+r,U[Qt+24>>3]=Xs,U[Qt+32>>3]=rs,t[Qt+40>>2]=M,sr(e,4,2989,Qt))}while(0);return(We|0)==28&&(K=Br(Fe)|0,t[Ee>>2]=K,t[Ee+4>>2]=Fe,t[Ee+8>>2]=kr?3047:11699,sr(e,4,3038,Ee),K=t[e+972>>2]|0,K|0&&M1[K&127](e),Qt=wn(l,S)|0,We=wn(s,S)|0,t[Re>>2]=Qt,t[Re+4>>2]=We,U[Re+8>>3]=+n,U[Re+16>>3]=+r,t[Re+24>>2]=M,sr(e,4,3049,Re),We=31),(We|0)==31&&(fu(e,n,r,u,l,s,h,D,S,O),p[11697]|0&&(K=t[2279]|0,Qt=Br(K)|0,t[Lr>>2]=Qt,t[Lr+4>>2]=K,t[Lr+8>>2]=kr?3047:11699,sr(e,4,3083,Lr),K=t[e+972>>2]|0,K|0&&M1[K&127](e),Qt=wn(l,S)|0,Lr=wn(s,S)|0,rs=+w(C[e+908>>2]),Xs=+w(C[e+912>>2]),t[Nn>>2]=Qt,t[Nn+4>>2]=Lr,U[Nn+8>>3]=rs,U[Nn+16>>3]=Xs,t[Nn+24>>2]=M,sr(e,4,3092,Nn)),t[e+516>>2]=u,P||(K=e+520|0,P=t[K>>2]|0,(P|0)==16&&(p[11697]|0&&sr(e,4,3124,mn),t[K>>2]=0,P=0),S?P=e+916|0:(t[K>>2]=P+1,P=e+524+(P*24|0)|0),C[P>>2]=n,C[P+4>>2]=r,t[P+8>>2]=l,t[P+12>>2]=s,t[P+16>>2]=t[e+908>>2],t[P+20>>2]=t[e+912>>2],P=0)),S&&(t[e+416>>2]=t[e+908>>2],t[e+420>>2]=t[e+912>>2],p[e+985>>0]=1,p[hr>>0]=0),t[2279]=(t[2279]|0)+-1,t[e+512>>2]=t[2278],m=On,kr|(P|0)==0|0}function Yt(e,n,r){e=e|0,n=n|0,r=w(r);var u=St;return u=w(Li(e,n,r)),w(u+w(A0(e,n,r)))}function sr(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0;s=m,m=m+16|0,l=s,t[l>>2]=u,e?u=t[e+976>>2]|0:u=0,Ps(u,e,n,r,l),m=s}function Br(e){return e=e|0,(e>>>0>60?3201:3201+(60-e)|0)|0}function wn(e,n){e=e|0,n=n|0;var r=0,u=0,l=0;return l=m,m=m+32|0,r=l+12|0,u=l,t[r>>2]=t[254],t[r+4>>2]=t[255],t[r+8>>2]=t[256],t[u>>2]=t[257],t[u+4>>2]=t[258],t[u+8>>2]=t[259],(e|0)>2?e=11699:e=t[(n?u:r)+(e<<2)>>2]|0,m=l,e|0}function fu(e,n,r,u,l,s,h,D,S,M){e=e|0,n=w(n),r=w(r),u=u|0,l=l|0,s=s|0,h=w(h),D=w(D),S=S|0,M=M|0;var O=0,P=0,K=0,Pe=0,Ee=St,ve=St,Qe=St,We=St,st=St,Re=St,Fe=St,Qt=0,Lr=0,Nn=0,mn=St,hr=St,kr=0,On=St,Zi=0,ts=0,ns=0,rs=0,Xs=0,$2=0,ed=0,Za=0,td=0,Oc=0,kc=0,nd=0,rd=0,id=0,si=0,$a=0,ud=0,zf=0,od=St,ld=St,Mc=St,Nc=St,qf=St,Il=0,Aa=0,As=0,ef=0,L1=0,F1=St,Lc=St,b1=St,P1=St,Bl=St,vl=St,tf=0,lu=St,I1=St,is=St,Hf=St,us=St,Wf=St,B1=0,U1=0,Vf=St,Ul=St,nf=0,j1=0,z1=0,q1=0,gr=St,Mu=0,ml=0,os=0,jl=0,Tr=0,Fn=0,rf=0,hn=St,H1=0,u0=0;rf=m,m=m+16|0,Il=rf+12|0,Aa=rf+8|0,As=rf+4|0,ef=rf,Iu(e,(l|0)==0|(Me(n)|0)^1,3326),Iu(e,(s|0)==0|(Me(r)|0)^1,3406),ml=El(e,u)|0,t[e+496>>2]=ml,Tr=I0(2,ml)|0,Fn=I0(0,ml)|0,C[e+440>>2]=w(Li(e,Tr,h)),C[e+444>>2]=w(A0(e,Tr,h)),C[e+428>>2]=w(Li(e,Fn,h)),C[e+436>>2]=w(A0(e,Fn,h)),C[e+464>>2]=w(R0(e,Tr)),C[e+468>>2]=w(co(e,Tr)),C[e+452>>2]=w(R0(e,Fn)),C[e+460>>2]=w(co(e,Fn)),C[e+488>>2]=w(Ru(e,Tr,h)),C[e+492>>2]=w(Yu(e,Tr,h)),C[e+476>>2]=w(Ru(e,Fn,h)),C[e+484>>2]=w(Yu(e,Fn,h));do if(t[e+964>>2]|0)Xl(e,n,r,l,s,h,D);else{if(os=e+948|0,jl=(t[e+952>>2]|0)-(t[os>>2]|0)>>2,!jl){hs(e,n,r,l,s,h,D);break}if(S?0:ra(e,n,r,l,s,h,D)|0)break;cs(e),$a=e+508|0,p[$a>>0]=0,Tr=I0(t[e+4>>2]|0,ml)|0,Fn=df(Tr,ml)|0,Mu=Fi(Tr)|0,ud=t[e+8>>2]|0,j1=e+28|0,zf=(t[j1>>2]|0)!=0,us=Mu?h:D,Vf=Mu?D:h,od=w(Ku(e,Tr,h)),ld=w(vs(e,Tr,h)),Ee=w(Ku(e,Fn,h)),Wf=w(wr(e,Tr,h)),Ul=w(wr(e,Fn,h)),Nn=Mu?l:s,nf=Mu?s:l,gr=Mu?Wf:Ul,st=Mu?Ul:Wf,Hf=w(Yt(e,2,h)),We=w(Yt(e,0,h)),ve=w(w(Sn(e+364|0,h))-gr),Qe=w(w(Sn(e+380|0,h))-gr),Re=w(w(Sn(e+372|0,D))-st),Fe=w(w(Sn(e+388|0,D))-st),Mc=Mu?ve:Re,Nc=Mu?Qe:Fe,Hf=w(n-Hf),n=w(Hf-gr),Me(n)|0?gr=n:gr=w(Eu(w(Yp(n,Qe)),ve)),I1=w(r-We),n=w(I1-st),Me(n)|0?is=n:is=w(Eu(w(Yp(n,Fe)),Re)),ve=Mu?gr:is,lu=Mu?is:gr;e:do if((Nn|0)==1)for(u=0,P=0;;){if(O=yi(e,P)|0,!u)(w(Xi(O))>w(0)?w(ru(O))>w(0):0)?u=O:u=0;else if($0(O)|0){Pe=0;break e}if(P=P+1|0,P>>>0>=jl>>>0){Pe=u;break}}else Pe=0;while(0);Qt=Pe+500|0,Lr=Pe+504|0,u=0,O=0,n=w(0),K=0;do{if(P=t[(t[os>>2]|0)+(K<<2)>>2]|0,(t[P+36>>2]|0)==1)Ci(P),p[P+985>>0]=1,p[P+984>>0]=0;else{Vr(P),S&&C0(P,El(P,ml)|0,ve,lu,gr);do if((t[P+24>>2]|0)!=1)if((P|0)==(Pe|0)){t[Qt>>2]=t[2278],C[Lr>>2]=w(0);break}else{Xr(e,P,gr,l,is,gr,is,s,ml,M);break}else O|0&&(t[O+960>>2]=P),t[P+960>>2]=0,O=P,u=(u|0)==0?P:u;while(0);vl=w(C[P+504>>2]),n=w(n+w(vl+w(Yt(P,Tr,gr))))}K=K+1|0}while((K|0)!=(jl|0));for(ns=n>ve,tf=zf&((Nn|0)==2&ns)?1:Nn,Zi=(nf|0)==1,Xs=Zi&(S^1),$2=(tf|0)==1,ed=(tf|0)==2,Za=976+(Tr<<2)|0,td=(nf|2|0)==2,id=Zi&(zf^1),Oc=1040+(Fn<<2)|0,kc=1040+(Tr<<2)|0,nd=976+(Fn<<2)|0,rd=(nf|0)!=1,ns=zf&((Nn|0)!=0&ns),ts=e+976|0,Zi=Zi^1,n=ve,kr=0,rs=0,vl=w(0),qf=w(0);;){e:do if(kr>>>0>>0)for(Lr=t[os>>2]|0,K=0,Fe=w(0),Re=w(0),Qe=w(0),ve=w(0),P=0,O=0,Pe=kr;;){if(Qt=t[Lr+(Pe<<2)>>2]|0,(t[Qt+36>>2]|0)!=1?(t[Qt+940>>2]=rs,(t[Qt+24>>2]|0)!=1):0){if(We=w(Yt(Qt,Tr,gr)),si=t[Za>>2]|0,r=w(Sn(Qt+380+(si<<3)|0,us)),st=w(C[Qt+504>>2]),r=w(Yp(r,st)),r=w(Eu(w(Sn(Qt+364+(si<<3)|0,us)),r)),zf&(K|0)!=0&w(We+w(Re+r))>n){s=K,We=Fe,Nn=Pe;break e}We=w(We+r),r=w(Re+We),We=w(Fe+We),$0(Qt)|0&&(Qe=w(Qe+w(Xi(Qt))),ve=w(ve-w(st*w(ru(Qt))))),O|0&&(t[O+960>>2]=Qt),t[Qt+960>>2]=0,K=K+1|0,O=Qt,P=(P|0)==0?Qt:P}else We=Fe,r=Re;if(Pe=Pe+1|0,Pe>>>0>>0)Fe=We,Re=r;else{s=K,Nn=Pe;break}}else s=0,We=w(0),Qe=w(0),ve=w(0),P=0,Nn=kr;while(0);si=Qe>w(0)&Qew(0)&veNc&((Me(Nc)|0)^1))n=Nc,si=51;else if(p[(t[ts>>2]|0)+3>>0]|0)si=51;else{if(mn!=w(0)?w(Xi(e))!=w(0):0){si=53;break}n=We,si=53}while(0);if((si|0)==51&&(si=0,Me(n)|0?si=53:(hr=w(n-We),On=n)),(si|0)==53&&(si=0,We>2]|0,Pe=hrw(0),Re=w(hr/mn),Qe=w(0),We=w(0),n=w(0),O=P;do r=w(Sn(O+380+(K<<3)|0,us)),ve=w(Sn(O+364+(K<<3)|0,us)),ve=w(Yp(r,w(Eu(ve,w(C[O+504>>2]))))),Pe?(r=w(ve*w(ru(O))),(r!=w(-0)?(hn=w(ve-w(st*r)),F1=w(Wn(O,Tr,hn,On,gr)),hn!=F1):0)&&(Qe=w(Qe-w(F1-ve)),n=w(n+r))):((Qt?(Lc=w(Xi(O)),Lc!=w(0)):0)?(hn=w(ve+w(Re*Lc)),b1=w(Wn(O,Tr,hn,On,gr)),hn!=b1):0)&&(Qe=w(Qe-w(b1-ve)),We=w(We-Lc)),O=t[O+960>>2]|0;while((O|0)!=0);if(n=w(Fe+n),ve=w(hr+Qe),L1)n=w(0);else{st=w(mn+We),Pe=t[Za>>2]|0,Qt=vew(0),st=w(ve/st),n=w(0);do{hn=w(Sn(P+380+(Pe<<3)|0,us)),Qe=w(Sn(P+364+(Pe<<3)|0,us)),Qe=w(Yp(hn,w(Eu(Qe,w(C[P+504>>2]))))),Qt?(hn=w(Qe*w(ru(P))),ve=w(-hn),hn!=w(-0)?(hn=w(Re*ve),ve=w(Wn(P,Tr,w(Qe+(Lr?ve:hn)),On,gr))):ve=Qe):(K?(P1=w(Xi(P)),P1!=w(0)):0)?ve=w(Wn(P,Tr,w(Qe+w(st*P1)),On,gr)):ve=Qe,n=w(n-w(ve-Qe)),We=w(Yt(P,Tr,gr)),r=w(Yt(P,Fn,gr)),ve=w(ve+We),C[Aa>>2]=ve,t[ef>>2]=1,Qe=w(C[P+396>>2]);e:do if(Me(Qe)|0){O=Me(lu)|0;do if(!O){if(ns|(Bu(P,Fn,lu)|0|Zi)||(Xu(e,P)|0)!=4||(t[(m0(P,Fn)|0)+4>>2]|0)==3||(t[(y0(P,Fn)|0)+4>>2]|0)==3)break;C[Il>>2]=lu,t[As>>2]=1;break e}while(0);if(Bu(P,Fn,lu)|0){O=t[P+992+(t[nd>>2]<<2)>>2]|0,hn=w(r+w(Sn(O,lu))),C[Il>>2]=hn,O=rd&(t[O+4>>2]|0)==2,t[As>>2]=((Me(hn)|0|O)^1)&1;break}else{C[Il>>2]=lu,t[As>>2]=O?0:2;break}}else hn=w(ve-We),mn=w(hn/Qe),hn=w(Qe*hn),t[As>>2]=1,C[Il>>2]=w(r+(Mu?mn:hn));while(0);kn(P,Tr,On,gr,ef,Aa),kn(P,Fn,lu,gr,As,Il);do if(Bu(P,Fn,lu)|0?0:(Xu(e,P)|0)==4){if((t[(m0(P,Fn)|0)+4>>2]|0)==3){O=0;break}O=(t[(y0(P,Fn)|0)+4>>2]|0)!=3}else O=0;while(0);hn=w(C[Aa>>2]),mn=w(C[Il>>2]),H1=t[ef>>2]|0,u0=t[As>>2]|0,Gt(P,Mu?hn:mn,Mu?mn:hn,ml,Mu?H1:u0,Mu?u0:H1,gr,is,S&(O^1),3488,M)|0,p[$a>>0]=p[$a>>0]|p[P+508>>0],P=t[P+960>>2]|0}while((P|0)!=0)}}else n=w(0);if(n=w(hr+n),u0=n>0]=u0|k[$a>>0],ed&n>w(0)?(O=t[Za>>2]|0,((t[e+364+(O<<3)+4>>2]|0)!=0?(Bl=w(Sn(e+364+(O<<3)|0,us)),Bl>=w(0)):0)?ve=w(Eu(w(0),w(Bl-w(On-n)))):ve=w(0)):ve=n,Qt=kr>>>0>>0,Qt){Pe=t[os>>2]|0,K=kr,O=0;do P=t[Pe+(K<<2)>>2]|0,t[P+24>>2]|0||(O=((t[(m0(P,Tr)|0)+4>>2]|0)==3&1)+O|0,O=O+((t[(y0(P,Tr)|0)+4>>2]|0)==3&1)|0),K=K+1|0;while((K|0)!=(Nn|0));O?(We=w(0),r=w(0)):si=101}else si=101;e:do if((si|0)==101)switch(si=0,ud|0){case 1:{O=0,We=w(ve*w(.5)),r=w(0);break e}case 2:{O=0,We=ve,r=w(0);break e}case 3:{if(s>>>0<=1){O=0,We=w(0),r=w(0);break e}r=w((s+-1|0)>>>0),O=0,We=w(0),r=w(w(Eu(ve,w(0)))/r);break e}case 5:{r=w(ve/w((s+1|0)>>>0)),O=0,We=r;break e}case 4:{r=w(ve/w(s>>>0)),O=0,We=w(r*w(.5));break e}default:{O=0,We=w(0),r=w(0);break e}}while(0);if(n=w(od+We),Qt){Qe=w(ve/w(O|0)),K=t[os>>2]|0,P=kr,ve=w(0);do{O=t[K+(P<<2)>>2]|0;e:do if((t[O+36>>2]|0)!=1){switch(t[O+24>>2]|0){case 1:{if(se(O,Tr)|0){if(!S)break e;hn=w(re(O,Tr,On)),hn=w(hn+w(R0(e,Tr))),hn=w(hn+w(Li(O,Tr,gr))),C[O+400+(t[kc>>2]<<2)>>2]=hn;break e}break}case 0:if(u0=(t[(m0(O,Tr)|0)+4>>2]|0)==3,hn=w(Qe+n),n=u0?hn:n,S&&(u0=O+400+(t[kc>>2]<<2)|0,C[u0>>2]=w(n+w(C[u0>>2]))),u0=(t[(y0(O,Tr)|0)+4>>2]|0)==3,hn=w(Qe+n),n=u0?hn:n,Xs){hn=w(r+w(Yt(O,Tr,gr))),ve=lu,n=w(n+w(hn+w(C[O+504>>2])));break e}else{n=w(n+w(r+w(Le(O,Tr,gr)))),ve=w(Eu(ve,w(Le(O,Fn,gr))));break e}default:}S&&(hn=w(We+w(R0(e,Tr))),u0=O+400+(t[kc>>2]<<2)|0,C[u0>>2]=w(hn+w(C[u0>>2])))}while(0);P=P+1|0}while((P|0)!=(Nn|0))}else ve=w(0);if(r=w(ld+n),td?We=w(w(Wn(e,Fn,w(Ul+ve),Vf,h))-Ul):We=lu,Qe=w(w(Wn(e,Fn,w(Ul+(id?lu:ve)),Vf,h))-Ul),Qt&S){P=kr;do{K=t[(t[os>>2]|0)+(P<<2)>>2]|0;do if((t[K+36>>2]|0)!=1){if((t[K+24>>2]|0)==1){if(se(K,Fn)|0){if(hn=w(re(K,Fn,lu)),hn=w(hn+w(R0(e,Fn))),hn=w(hn+w(Li(K,Fn,gr))),O=t[Oc>>2]|0,C[K+400+(O<<2)>>2]=hn,!(Me(hn)|0))break}else O=t[Oc>>2]|0;hn=w(R0(e,Fn)),C[K+400+(O<<2)>>2]=w(hn+w(Li(K,Fn,gr)));break}O=Xu(e,K)|0;do if((O|0)==4){if((t[(m0(K,Fn)|0)+4>>2]|0)==3){si=139;break}if((t[(y0(K,Fn)|0)+4>>2]|0)==3){si=139;break}if(Bu(K,Fn,lu)|0){n=Ee;break}H1=t[K+908+(t[Za>>2]<<2)>>2]|0,t[Il>>2]=H1,n=w(C[K+396>>2]),u0=Me(n)|0,ve=(t[W>>2]=H1,w(C[W>>2])),u0?n=Qe:(hr=w(Yt(K,Fn,gr)),hn=w(ve/n),n=w(n*ve),n=w(hr+(Mu?hn:n))),C[Aa>>2]=n,C[Il>>2]=w(w(Yt(K,Tr,gr))+ve),t[As>>2]=1,t[ef>>2]=1,kn(K,Tr,On,gr,As,Il),kn(K,Fn,lu,gr,ef,Aa),n=w(C[Il>>2]),hr=w(C[Aa>>2]),hn=Mu?n:hr,n=Mu?hr:n,u0=((Me(hn)|0)^1)&1,Gt(K,hn,n,ml,u0,((Me(n)|0)^1)&1,gr,is,1,3493,M)|0,n=Ee}else si=139;while(0);e:do if((si|0)==139){si=0,n=w(We-w(Le(K,Fn,gr)));do if((t[(m0(K,Fn)|0)+4>>2]|0)==3){if((t[(y0(K,Fn)|0)+4>>2]|0)!=3)break;n=w(Ee+w(Eu(w(0),w(n*w(.5)))));break e}while(0);if((t[(y0(K,Fn)|0)+4>>2]|0)==3){n=Ee;break}if((t[(m0(K,Fn)|0)+4>>2]|0)==3){n=w(Ee+w(Eu(w(0),n)));break}switch(O|0){case 1:{n=Ee;break e}case 2:{n=w(Ee+w(n*w(.5)));break e}default:{n=w(Ee+n);break e}}}while(0);hn=w(vl+n),u0=K+400+(t[Oc>>2]<<2)|0,C[u0>>2]=w(hn+w(C[u0>>2]))}while(0);P=P+1|0}while((P|0)!=(Nn|0))}if(vl=w(vl+Qe),qf=w(Eu(qf,r)),s=rs+1|0,Nn>>>0>=jl>>>0)break;n=On,kr=Nn,rs=s}do if(S){if(O=s>>>0>1,O?0:!(Ae(e)|0))break;if(!(Me(lu)|0)){n=w(lu-vl);e:do switch(t[e+12>>2]|0){case 3:{Ee=w(Ee+n),Re=w(0);break}case 2:{Ee=w(Ee+w(n*w(.5))),Re=w(0);break}case 4:{lu>vl?Re=w(n/w(s>>>0)):Re=w(0);break}case 7:if(lu>vl){Ee=w(Ee+w(n/w(s<<1>>>0))),Re=w(n/w(s>>>0)),Re=O?Re:w(0);break e}else{Ee=w(Ee+w(n*w(.5))),Re=w(0);break e}case 6:{Re=w(n/w(rs>>>0)),Re=lu>vl&O?Re:w(0);break}default:Re=w(0)}while(0);if(s|0)for(Qt=1040+(Fn<<2)|0,Lr=976+(Fn<<2)|0,Pe=0,P=0;;){e:do if(P>>>0>>0)for(ve=w(0),Qe=w(0),n=w(0),K=P;;){O=t[(t[os>>2]|0)+(K<<2)>>2]|0;do if((t[O+36>>2]|0)!=1?(t[O+24>>2]|0)==0:0){if((t[O+940>>2]|0)!=(Pe|0))break e;if(ot(O,Fn)|0&&(hn=w(C[O+908+(t[Lr>>2]<<2)>>2]),n=w(Eu(n,w(hn+w(Yt(O,Fn,gr)))))),(Xu(e,O)|0)!=5)break;Bl=w(vt(O)),Bl=w(Bl+w(Li(O,0,gr))),hn=w(C[O+912>>2]),hn=w(w(hn+w(Yt(O,0,gr)))-Bl),Bl=w(Eu(Qe,Bl)),hn=w(Eu(ve,hn)),ve=hn,Qe=Bl,n=w(Eu(n,w(Bl+hn)))}while(0);if(O=K+1|0,O>>>0>>0)K=O;else{K=O;break}}else Qe=w(0),n=w(0),K=P;while(0);if(st=w(Re+n),r=Ee,Ee=w(Ee+st),P>>>0>>0){We=w(r+Qe),O=P;do{P=t[(t[os>>2]|0)+(O<<2)>>2]|0;e:do if((t[P+36>>2]|0)!=1?(t[P+24>>2]|0)==0:0)switch(Xu(e,P)|0){case 1:{hn=w(r+w(Li(P,Fn,gr))),C[P+400+(t[Qt>>2]<<2)>>2]=hn;break e}case 3:{hn=w(w(Ee-w(A0(P,Fn,gr)))-w(C[P+908+(t[Lr>>2]<<2)>>2])),C[P+400+(t[Qt>>2]<<2)>>2]=hn;break e}case 2:{hn=w(r+w(w(st-w(C[P+908+(t[Lr>>2]<<2)>>2]))*w(.5))),C[P+400+(t[Qt>>2]<<2)>>2]=hn;break e}case 4:{if(hn=w(r+w(Li(P,Fn,gr))),C[P+400+(t[Qt>>2]<<2)>>2]=hn,Bu(P,Fn,lu)|0||(Mu?(ve=w(C[P+908>>2]),n=w(ve+w(Yt(P,Tr,gr))),Qe=st):(Qe=w(C[P+912>>2]),Qe=w(Qe+w(Yt(P,Fn,gr))),n=st,ve=w(C[P+908>>2])),gi(n,ve)|0?gi(Qe,w(C[P+912>>2]))|0:0))break e;Gt(P,n,Qe,ml,1,1,gr,is,1,3501,M)|0;break e}case 5:{C[P+404>>2]=w(w(We-w(vt(P)))+w(re(P,0,lu)));break e}default:break e}while(0);O=O+1|0}while((O|0)!=(K|0))}if(Pe=Pe+1|0,(Pe|0)==(s|0))break;P=K}}}while(0);if(C[e+908>>2]=w(Wn(e,2,Hf,h,h)),C[e+912>>2]=w(Wn(e,0,I1,D,h)),((tf|0)!=0?(B1=t[e+32>>2]|0,U1=(tf|0)==2,!(U1&(B1|0)!=2)):0)?U1&(B1|0)==2&&(n=w(Wf+On),n=w(Eu(w(Yp(n,w(Xt(e,Tr,qf,us)))),Wf)),si=198):(n=w(Wn(e,Tr,qf,us,h)),si=198),(si|0)==198&&(C[e+908+(t[976+(Tr<<2)>>2]<<2)>>2]=n),((nf|0)!=0?(z1=t[e+32>>2]|0,q1=(nf|0)==2,!(q1&(z1|0)!=2)):0)?q1&(z1|0)==2&&(n=w(Ul+lu),n=w(Eu(w(Yp(n,w(Xt(e,Fn,w(Ul+vl),Vf)))),Ul)),si=204):(n=w(Wn(e,Fn,w(Ul+vl),Vf,h)),si=204),(si|0)==204&&(C[e+908+(t[976+(Fn<<2)>>2]<<2)>>2]=n),S){if((t[j1>>2]|0)==2){P=976+(Fn<<2)|0,K=1040+(Fn<<2)|0,O=0;do Pe=yi(e,O)|0,t[Pe+24>>2]|0||(H1=t[P>>2]|0,hn=w(C[e+908+(H1<<2)>>2]),u0=Pe+400+(t[K>>2]<<2)|0,hn=w(hn-w(C[u0>>2])),C[u0>>2]=w(hn-w(C[Pe+908+(H1<<2)>>2]))),O=O+1|0;while((O|0)!=(jl|0))}if(u|0){O=Mu?tf:l;do xn(e,u,gr,O,is,ml,M),u=t[u+960>>2]|0;while((u|0)!=0)}if(O=(Tr|2|0)==3,P=(Fn|2|0)==3,O|P){u=0;do K=t[(t[os>>2]|0)+(u<<2)>>2]|0,(t[K+36>>2]|0)!=1&&(O&&_n(e,K,Tr),P&&_n(e,K,Fn)),u=u+1|0;while((u|0)!=(jl|0))}}}while(0);m=rf}function Gu(e,n){e=e|0,n=w(n);var r=0;Dn(e,n>=w(0),3147),r=n==w(0),C[e+4>>2]=r?w(0):n}function Kr(e,n,r,u){e=e|0,n=w(n),r=w(r),u=u|0;var l=St,s=St,h=0,D=0,S=0;t[2278]=(t[2278]|0)+1,Vr(e),Bu(e,2,n)|0?(l=w(Sn(t[e+992>>2]|0,n)),S=1,l=w(l+w(Yt(e,2,n)))):(l=w(Sn(e+380|0,n)),l>=w(0)?S=2:(S=((Me(n)|0)^1)&1,l=n)),Bu(e,0,r)|0?(s=w(Sn(t[e+996>>2]|0,r)),D=1,s=w(s+w(Yt(e,0,n)))):(s=w(Sn(e+388|0,r)),s>=w(0)?D=2:(D=((Me(r)|0)^1)&1,s=r)),h=e+976|0,(Gt(e,l,s,u,S,D,n,r,1,3189,t[h>>2]|0)|0?(C0(e,t[e+496>>2]|0,n,r,n),Au(e,w(C[(t[h>>2]|0)+4>>2]),w(0),w(0)),p[11696]|0):0)&&ff(e,7)}function Vr(e){e=e|0;var n=0,r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0;D=m,m=m+32|0,h=D+24|0,s=D+16|0,u=D+8|0,l=D,r=0;do n=e+380+(r<<3)|0,((t[e+380+(r<<3)+4>>2]|0)!=0?(S=n,M=t[S+4>>2]|0,O=u,t[O>>2]=t[S>>2],t[O+4>>2]=M,O=e+364+(r<<3)|0,M=t[O+4>>2]|0,S=l,t[S>>2]=t[O>>2],t[S+4>>2]=M,t[s>>2]=t[u>>2],t[s+4>>2]=t[u+4>>2],t[h>>2]=t[l>>2],t[h+4>>2]=t[l+4>>2],Oi(s,h)|0):0)||(n=e+348+(r<<3)|0),t[e+992+(r<<2)>>2]=n,r=r+1|0;while((r|0)!=2);m=D}function Bu(e,n,r){e=e|0,n=n|0,r=w(r);var u=0;switch(e=t[e+992+(t[976+(n<<2)>>2]<<2)>>2]|0,t[e+4>>2]|0){case 0:case 3:{e=0;break}case 1:{w(C[e>>2])>2])>2]|0){case 2:{n=w(w(w(C[e>>2])*n)/w(100));break}case 1:{n=w(C[e>>2]);break}default:n=w(le)}return w(n)}function C0(e,n,r,u,l){e=e|0,n=n|0,r=w(r),u=w(u),l=w(l);var s=0,h=St;n=t[e+944>>2]|0?n:1,s=I0(t[e+4>>2]|0,n)|0,n=df(s,n)|0,r=w(Sr(e,s,r)),u=w(Sr(e,n,u)),h=w(r+w(Li(e,s,l))),C[e+400+(t[1040+(s<<2)>>2]<<2)>>2]=h,r=w(r+w(A0(e,s,l))),C[e+400+(t[1e3+(s<<2)>>2]<<2)>>2]=r,r=w(u+w(Li(e,n,l))),C[e+400+(t[1040+(n<<2)>>2]<<2)>>2]=r,l=w(u+w(A0(e,n,l))),C[e+400+(t[1e3+(n<<2)>>2]<<2)>>2]=l}function Au(e,n,r,u){e=e|0,n=w(n),r=w(r),u=w(u);var l=0,s=0,h=St,D=St,S=0,M=0,O=St,P=0,K=St,Pe=St,Ee=St,ve=St;if(n!=w(0)&&(l=e+400|0,ve=w(C[l>>2]),s=e+404|0,Ee=w(C[s>>2]),P=e+416|0,Pe=w(C[P>>2]),M=e+420|0,h=w(C[M>>2]),K=w(ve+r),O=w(Ee+u),u=w(K+Pe),D=w(O+h),S=(t[e+988>>2]|0)==1,C[l>>2]=w(J0(ve,n,0,S)),C[s>>2]=w(J0(Ee,n,0,S)),r=w(YE(w(Pe*n),w(1))),gi(r,w(0))|0?s=0:s=(gi(r,w(1))|0)^1,r=w(YE(w(h*n),w(1))),gi(r,w(0))|0?l=0:l=(gi(r,w(1))|0)^1,ve=w(J0(u,n,S&s,S&(s^1))),C[P>>2]=w(ve-w(J0(K,n,0,S))),ve=w(J0(D,n,S&l,S&(l^1))),C[M>>2]=w(ve-w(J0(O,n,0,S))),s=(t[e+952>>2]|0)-(t[e+948>>2]|0)>>2,s|0)){l=0;do Au(yi(e,l)|0,n,K,O),l=l+1|0;while((l|0)!=(s|0))}}function ei(e,n,r,u,l){switch(e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,r|0){case 5:case 0:{e=F8(t[489]|0,u,l)|0;break}default:e=QI(u,l)|0}return e|0}function _l(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0;l=m,m=m+16|0,s=l,t[s>>2]=u,Ps(e,0,n,r,s),m=l}function Ps(e,n,r,u,l){if(e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,e=e|0?e:956,tS[t[e+8>>2]&1](e,n,r,u,l)|0,(r|0)==5)Xn();else return}function Uu(e,n,r){e=e|0,n=n|0,r=r|0,p[e+n>>0]=r&1}function na(e,n){e=e|0,n=n|0;var r=0,u=0;t[e>>2]=0,t[e+4>>2]=0,t[e+8>>2]=0,r=n+4|0,u=(t[r>>2]|0)-(t[n>>2]|0)>>2,u|0&&(zi(e,u),Is(e,t[n>>2]|0,t[r>>2]|0,u))}function zi(e,n){e=e|0,n=n|0;var r=0;if((x0(e)|0)>>>0>>0&&li(e),n>>>0>1073741823)Xn();else{r=cn(n<<2)|0,t[e+4>>2]=r,t[e>>2]=r,t[e+8>>2]=r+(n<<2);return}}function Is(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0,u=e+4|0,e=r-n|0,(e|0)>0&&(pr(t[u>>2]|0,n|0,e|0)|0,t[u>>2]=(t[u>>2]|0)+(e>>>2<<2))}function x0(e){return e=e|0,1073741823}function Li(e,n,r){return e=e|0,n=n|0,r=w(r),(Fi(n)|0?(t[e+96>>2]|0)!=0:0)?e=e+92|0:e=dt(e+60|0,t[1040+(n<<2)>>2]|0,992)|0,w($o(e,r))}function A0(e,n,r){return e=e|0,n=n|0,r=w(r),(Fi(n)|0?(t[e+104>>2]|0)!=0:0)?e=e+100|0:e=dt(e+60|0,t[1e3+(n<<2)>>2]|0,992)|0,w($o(e,r))}function Fi(e){return e=e|0,(e|1|0)==3|0}function $o(e,n){return e=e|0,n=w(n),(t[e+4>>2]|0)==3?n=w(0):n=w(Sn(e,n)),w(n)}function El(e,n){return e=e|0,n=n|0,e=t[e>>2]|0,((e|0)==0?(n|0)>1?n:1:e)|0}function I0(e,n){e=e|0,n=n|0;var r=0;e:do if((n|0)==2){switch(e|0){case 2:{e=3;break e}case 3:break;default:{r=4;break e}}e=2}else r=4;while(0);return e|0}function R0(e,n){e=e|0,n=n|0;var r=St;return((Fi(n)|0?(t[e+312>>2]|0)!=0:0)?(r=w(C[e+308>>2]),r>=w(0)):0)||(r=w(Eu(w(C[(dt(e+276|0,t[1040+(n<<2)>>2]|0,992)|0)>>2]),w(0)))),w(r)}function co(e,n){e=e|0,n=n|0;var r=St;return((Fi(n)|0?(t[e+320>>2]|0)!=0:0)?(r=w(C[e+316>>2]),r>=w(0)):0)||(r=w(Eu(w(C[(dt(e+276|0,t[1e3+(n<<2)>>2]|0,992)|0)>>2]),w(0)))),w(r)}function Ru(e,n,r){e=e|0,n=n|0,r=w(r);var u=St;return((Fi(n)|0?(t[e+240>>2]|0)!=0:0)?(u=w(Sn(e+236|0,r)),u>=w(0)):0)||(u=w(Eu(w(Sn(dt(e+204|0,t[1040+(n<<2)>>2]|0,992)|0,r)),w(0)))),w(u)}function Yu(e,n,r){e=e|0,n=n|0,r=w(r);var u=St;return((Fi(n)|0?(t[e+248>>2]|0)!=0:0)?(u=w(Sn(e+244|0,r)),u>=w(0)):0)||(u=w(Eu(w(Sn(dt(e+204|0,t[1e3+(n<<2)>>2]|0,992)|0,r)),w(0)))),w(u)}function Xl(e,n,r,u,l,s,h){e=e|0,n=w(n),r=w(r),u=u|0,l=l|0,s=w(s),h=w(h);var D=St,S=St,M=St,O=St,P=St,K=St,Pe=0,Ee=0,ve=0;ve=m,m=m+16|0,Pe=ve,Ee=e+964|0,Iu(e,(t[Ee>>2]|0)!=0,3519),D=w(wr(e,2,n)),S=w(wr(e,0,n)),M=w(Yt(e,2,n)),O=w(Yt(e,0,n)),Me(n)|0?P=n:P=w(Eu(w(0),w(w(n-M)-D))),Me(r)|0?K=r:K=w(Eu(w(0),w(w(r-O)-S))),(u|0)==1&(l|0)==1?(C[e+908>>2]=w(Wn(e,2,w(n-M),s,s)),n=w(Wn(e,0,w(r-O),h,s))):(nS[t[Ee>>2]&1](Pe,e,P,u,K,l),P=w(D+w(C[Pe>>2])),K=w(n-M),C[e+908>>2]=w(Wn(e,2,(u|2|0)==2?P:K,s,s)),K=w(S+w(C[Pe+4>>2])),n=w(r-O),n=w(Wn(e,0,(l|2|0)==2?K:n,h,s))),C[e+912>>2]=n,m=ve}function hs(e,n,r,u,l,s,h){e=e|0,n=w(n),r=w(r),u=u|0,l=l|0,s=w(s),h=w(h);var D=St,S=St,M=St,O=St;M=w(wr(e,2,s)),D=w(wr(e,0,s)),O=w(Yt(e,2,s)),S=w(Yt(e,0,s)),n=w(n-O),C[e+908>>2]=w(Wn(e,2,(u|2|0)==2?M:n,s,s)),r=w(r-S),C[e+912>>2]=w(Wn(e,0,(l|2|0)==2?D:r,h,s))}function ra(e,n,r,u,l,s,h){e=e|0,n=w(n),r=w(r),u=u|0,l=l|0,s=w(s),h=w(h);var D=0,S=St,M=St;return D=(u|0)==2,((n<=w(0)&D?0:!(r<=w(0)&(l|0)==2))?!((u|0)==1&(l|0)==1):0)?e=0:(S=w(Yt(e,0,s)),M=w(Yt(e,2,s)),D=n>2]=w(Wn(e,2,D?w(0):n,s,s)),n=w(r-S),D=r>2]=w(Wn(e,0,D?w(0):n,h,s)),e=1),e|0}function df(e,n){return e=e|0,n=n|0,yn(e)|0?e=I0(2,n)|0:e=0,e|0}function Ku(e,n,r){return e=e|0,n=n|0,r=w(r),r=w(Ru(e,n,r)),w(r+w(R0(e,n)))}function vs(e,n,r){return e=e|0,n=n|0,r=w(r),r=w(Yu(e,n,r)),w(r+w(co(e,n)))}function wr(e,n,r){e=e|0,n=n|0,r=w(r);var u=St;return u=w(Ku(e,n,r)),w(u+w(vs(e,n,r)))}function $0(e){return e=e|0,t[e+24>>2]|0?e=0:w(Xi(e))!=w(0)?e=1:e=w(ru(e))!=w(0),e|0}function Xi(e){e=e|0;var n=St;if(t[e+944>>2]|0){if(n=w(C[e+44>>2]),Me(n)|0)return n=w(C[e+40>>2]),e=n>w(0)&((Me(n)|0)^1),w(e?n:w(0))}else n=w(0);return w(n)}function ru(e){e=e|0;var n=St,r=0,u=St;do if(t[e+944>>2]|0){if(n=w(C[e+48>>2]),Me(n)|0){if(r=p[(t[e+976>>2]|0)+2>>0]|0,r<<24>>24==0?(u=w(C[e+40>>2]),u>24?w(1):w(0)}}else n=w(0);while(0);return w(n)}function Ci(e){e=e|0;var n=0,r=0;if(Iv(e+400|0,0,540)|0,p[e+985>>0]=1,cs(e),r=mu(e)|0,r|0){n=e+948|0,e=0;do Ci(t[(t[n>>2]|0)+(e<<2)>>2]|0),e=e+1|0;while((e|0)!=(r|0))}}function Xr(e,n,r,u,l,s,h,D,S,M){e=e|0,n=n|0,r=w(r),u=u|0,l=w(l),s=w(s),h=w(h),D=D|0,S=S|0,M=M|0;var O=0,P=St,K=0,Pe=0,Ee=St,ve=St,Qe=0,We=St,st=0,Re=St,Fe=0,Qt=0,Lr=0,Nn=0,mn=0,hr=0,kr=0,On=0,Zi=0,ts=0;Zi=m,m=m+16|0,Lr=Zi+12|0,Nn=Zi+8|0,mn=Zi+4|0,hr=Zi,On=I0(t[e+4>>2]|0,S)|0,Fe=Fi(On)|0,P=w(Sn(En(n)|0,Fe?s:h)),Qt=Bu(n,2,s)|0,kr=Bu(n,0,h)|0;do if(Me(P)|0?0:!(Me(Fe?r:l)|0)){if(O=n+504|0,!(Me(w(C[O>>2]))|0)&&(!(er(t[n+976>>2]|0,0)|0)||(t[n+500>>2]|0)==(t[2278]|0)))break;C[O>>2]=w(Eu(P,w(wr(n,On,s))))}else K=7;while(0);do if((K|0)==7){if(st=Fe^1,!(st|Qt^1)){h=w(Sn(t[n+992>>2]|0,s)),C[n+504>>2]=w(Eu(h,w(wr(n,2,s))));break}if(!(Fe|kr^1)){h=w(Sn(t[n+996>>2]|0,h)),C[n+504>>2]=w(Eu(h,w(wr(n,0,s))));break}C[Lr>>2]=w(le),C[Nn>>2]=w(le),t[mn>>2]=0,t[hr>>2]=0,We=w(Yt(n,2,s)),Re=w(Yt(n,0,s)),Qt?(Ee=w(We+w(Sn(t[n+992>>2]|0,s))),C[Lr>>2]=Ee,t[mn>>2]=1,Pe=1):(Pe=0,Ee=w(le)),kr?(P=w(Re+w(Sn(t[n+996>>2]|0,h))),C[Nn>>2]=P,t[hr>>2]=1,O=1):(O=0,P=w(le)),K=t[e+32>>2]|0,Fe&(K|0)==2?K=2:(Me(Ee)|0?!(Me(r)|0):0)&&(C[Lr>>2]=r,t[mn>>2]=2,Pe=2,Ee=r),(((K|0)==2&st?0:Me(P)|0)?!(Me(l)|0):0)&&(C[Nn>>2]=l,t[hr>>2]=2,O=2,P=l),ve=w(C[n+396>>2]),Qe=Me(ve)|0;do if(Qe)K=Pe;else{if((Pe|0)==1&st){C[Nn>>2]=w(w(Ee-We)/ve),t[hr>>2]=1,O=1,K=1;break}Fe&(O|0)==1?(C[Lr>>2]=w(ve*w(P-Re)),t[mn>>2]=1,O=1,K=1):K=Pe}while(0);ts=Me(r)|0,Pe=(Xu(e,n)|0)!=4,(Fe|Qt|((u|0)!=1|ts)|(Pe|(K|0)==1)?0:(C[Lr>>2]=r,t[mn>>2]=1,!Qe))&&(C[Nn>>2]=w(w(r-We)/ve),t[hr>>2]=1,O=1),(kr|st|((D|0)!=1|(Me(l)|0))|(Pe|(O|0)==1)?0:(C[Nn>>2]=l,t[hr>>2]=1,!Qe))&&(C[Lr>>2]=w(ve*w(l-Re)),t[mn>>2]=1),kn(n,2,s,s,mn,Lr),kn(n,0,h,s,hr,Nn),r=w(C[Lr>>2]),l=w(C[Nn>>2]),Gt(n,r,l,S,t[mn>>2]|0,t[hr>>2]|0,s,h,0,3565,M)|0,h=w(C[n+908+(t[976+(On<<2)>>2]<<2)>>2]),C[n+504>>2]=w(Eu(h,w(wr(n,On,s))))}while(0);t[n+500>>2]=t[2278],m=Zi}function Wn(e,n,r,u,l){return e=e|0,n=n|0,r=w(r),u=w(u),l=w(l),u=w(Xt(e,n,r,u)),w(Eu(u,w(wr(e,n,l))))}function Xu(e,n){return e=e|0,n=n|0,n=n+20|0,n=t[((t[n>>2]|0)==0?e+16|0:n)>>2]|0,((n|0)==5?yn(t[e+4>>2]|0)|0:0)&&(n=1),n|0}function m0(e,n){return e=e|0,n=n|0,(Fi(n)|0?(t[e+96>>2]|0)!=0:0)?n=4:n=t[1040+(n<<2)>>2]|0,e+60+(n<<3)|0}function y0(e,n){return e=e|0,n=n|0,(Fi(n)|0?(t[e+104>>2]|0)!=0:0)?n=5:n=t[1e3+(n<<2)>>2]|0,e+60+(n<<3)|0}function kn(e,n,r,u,l,s){switch(e=e|0,n=n|0,r=w(r),u=w(u),l=l|0,s=s|0,r=w(Sn(e+380+(t[976+(n<<2)>>2]<<3)|0,r)),r=w(r+w(Yt(e,n,u))),t[l>>2]|0){case 2:case 1:{l=Me(r)|0,u=w(C[s>>2]),C[s>>2]=l|u>2]=2,C[s>>2]=r);break}default:}}function se(e,n){return e=e|0,n=n|0,e=e+132|0,(Fi(n)|0?(t[(dt(e,4,948)|0)+4>>2]|0)!=0:0)?e=1:e=(t[(dt(e,t[1040+(n<<2)>>2]|0,948)|0)+4>>2]|0)!=0,e|0}function re(e,n,r){e=e|0,n=n|0,r=w(r);var u=0,l=0;return e=e+132|0,(Fi(n)|0?(u=dt(e,4,948)|0,(t[u+4>>2]|0)!=0):0)?l=4:(u=dt(e,t[1040+(n<<2)>>2]|0,948)|0,t[u+4>>2]|0?l=4:r=w(0)),(l|0)==4&&(r=w(Sn(u,r))),w(r)}function Le(e,n,r){e=e|0,n=n|0,r=w(r);var u=St;return u=w(C[e+908+(t[976+(n<<2)>>2]<<2)>>2]),u=w(u+w(Li(e,n,r))),w(u+w(A0(e,n,r)))}function Ae(e){e=e|0;var n=0,r=0,u=0;e:do if(yn(t[e+4>>2]|0)|0)n=0;else if((t[e+16>>2]|0)!=5)if(r=mu(e)|0,!r)n=0;else for(n=0;;){if(u=yi(e,n)|0,(t[u+24>>2]|0)==0?(t[u+20>>2]|0)==5:0){n=1;break e}if(n=n+1|0,n>>>0>=r>>>0){n=0;break}}else n=1;while(0);return n|0}function ot(e,n){e=e|0,n=n|0;var r=St;return r=w(C[e+908+(t[976+(n<<2)>>2]<<2)>>2]),r>=w(0)&((Me(r)|0)^1)|0}function vt(e){e=e|0;var n=St,r=0,u=0,l=0,s=0,h=0,D=0,S=St;if(r=t[e+968>>2]|0,r)S=w(C[e+908>>2]),n=w(C[e+912>>2]),n=w(J8[r&0](e,S,n)),Iu(e,(Me(n)|0)^1,3573);else{s=mu(e)|0;do if(s|0){for(r=0,l=0;;){if(u=yi(e,l)|0,t[u+940>>2]|0){h=8;break}if((t[u+24>>2]|0)!=1)if(D=(Xu(e,u)|0)==5,D){r=u;break}else r=(r|0)==0?u:r;if(l=l+1|0,l>>>0>=s>>>0){h=8;break}}if((h|0)==8&&!r)break;return n=w(vt(r)),w(n+w(C[r+404>>2]))}while(0);n=w(C[e+912>>2])}return w(n)}function Xt(e,n,r,u){e=e|0,n=n|0,r=w(r),u=w(u);var l=St,s=0;return yn(n)|0?(n=1,s=3):Fi(n)|0?(n=0,s=3):(u=w(le),l=w(le)),(s|0)==3&&(l=w(Sn(e+364+(n<<3)|0,u)),u=w(Sn(e+380+(n<<3)|0,u))),s=u=w(0)&((Me(u)|0)^1)),r=s?u:r,s=l>=w(0)&((Me(l)|0)^1)&r>2]|0,s)|0,Ee=df(Qe,s)|0,ve=Fi(Qe)|0,P=w(Yt(n,2,r)),K=w(Yt(n,0,r)),Bu(n,2,r)|0?D=w(P+w(Sn(t[n+992>>2]|0,r))):(se(n,2)|0?It(n,2)|0:0)?(D=w(C[e+908>>2]),S=w(R0(e,2)),S=w(D-w(S+w(co(e,2)))),D=w(re(n,2,r)),D=w(Wn(n,2,w(S-w(D+w(xi(n,2,r)))),r,r))):D=w(le),Bu(n,0,l)|0?S=w(K+w(Sn(t[n+996>>2]|0,l))):(se(n,0)|0?It(n,0)|0:0)?(S=w(C[e+912>>2]),st=w(R0(e,0)),st=w(S-w(st+w(co(e,0)))),S=w(re(n,0,l)),S=w(Wn(n,0,w(st-w(S+w(xi(n,0,l)))),l,r))):S=w(le),M=Me(D)|0,O=Me(S)|0;do if(M^O?(Pe=w(C[n+396>>2]),!(Me(Pe)|0)):0)if(M){D=w(P+w(w(S-K)*Pe));break}else{st=w(K+w(w(D-P)/Pe)),S=O?st:S;break}while(0);O=Me(D)|0,M=Me(S)|0,O|M&&(Re=(O^1)&1,u=r>w(0)&((u|0)!=0&O),D=ve?D:u?r:D,Gt(n,D,S,s,ve?Re:u?2:Re,O&(M^1)&1,D,S,0,3623,h)|0,D=w(C[n+908>>2]),D=w(D+w(Yt(n,2,r))),S=w(C[n+912>>2]),S=w(S+w(Yt(n,0,r)))),Gt(n,D,S,s,1,1,D,S,1,3635,h)|0,(It(n,Qe)|0?!(se(n,Qe)|0):0)?(Re=t[976+(Qe<<2)>>2]|0,st=w(C[e+908+(Re<<2)>>2]),st=w(st-w(C[n+908+(Re<<2)>>2])),st=w(st-w(co(e,Qe))),st=w(st-w(A0(n,Qe,r))),st=w(st-w(xi(n,Qe,ve?r:l))),C[n+400+(t[1040+(Qe<<2)>>2]<<2)>>2]=st):We=21;do if((We|0)==21){if(se(n,Qe)|0?0:(t[e+8>>2]|0)==1){Re=t[976+(Qe<<2)>>2]|0,st=w(C[e+908+(Re<<2)>>2]),st=w(w(st-w(C[n+908+(Re<<2)>>2]))*w(.5)),C[n+400+(t[1040+(Qe<<2)>>2]<<2)>>2]=st;break}(se(n,Qe)|0?0:(t[e+8>>2]|0)==2)&&(Re=t[976+(Qe<<2)>>2]|0,st=w(C[e+908+(Re<<2)>>2]),st=w(st-w(C[n+908+(Re<<2)>>2])),C[n+400+(t[1040+(Qe<<2)>>2]<<2)>>2]=st)}while(0);(It(n,Ee)|0?!(se(n,Ee)|0):0)?(Re=t[976+(Ee<<2)>>2]|0,st=w(C[e+908+(Re<<2)>>2]),st=w(st-w(C[n+908+(Re<<2)>>2])),st=w(st-w(co(e,Ee))),st=w(st-w(A0(n,Ee,r))),st=w(st-w(xi(n,Ee,ve?l:r))),C[n+400+(t[1040+(Ee<<2)>>2]<<2)>>2]=st):We=30;do if((We|0)==30?!(se(n,Ee)|0):0){if((Xu(e,n)|0)==2){Re=t[976+(Ee<<2)>>2]|0,st=w(C[e+908+(Re<<2)>>2]),st=w(w(st-w(C[n+908+(Re<<2)>>2]))*w(.5)),C[n+400+(t[1040+(Ee<<2)>>2]<<2)>>2]=st;break}Re=(Xu(e,n)|0)==3,Re^(t[e+28>>2]|0)==2&&(Re=t[976+(Ee<<2)>>2]|0,st=w(C[e+908+(Re<<2)>>2]),st=w(st-w(C[n+908+(Re<<2)>>2])),C[n+400+(t[1040+(Ee<<2)>>2]<<2)>>2]=st)}while(0)}function _n(e,n,r){e=e|0,n=n|0,r=r|0;var u=St,l=0;l=t[976+(r<<2)>>2]|0,u=w(C[n+908+(l<<2)>>2]),u=w(w(C[e+908+(l<<2)>>2])-u),u=w(u-w(C[n+400+(t[1040+(r<<2)>>2]<<2)>>2])),C[n+400+(t[1e3+(r<<2)>>2]<<2)>>2]=u}function yn(e){return e=e|0,(e|1|0)==1|0}function En(e){e=e|0;var n=St;switch(t[e+56>>2]|0){case 0:case 3:{n=w(C[e+40>>2]),n>w(0)&((Me(n)|0)^1)?e=p[(t[e+976>>2]|0)+2>>0]|0?1056:992:e=1056;break}default:e=e+52|0}return e|0}function er(e,n){return e=e|0,n=n|0,(p[e+n>>0]|0)!=0|0}function It(e,n){return e=e|0,n=n|0,e=e+132|0,(Fi(n)|0?(t[(dt(e,5,948)|0)+4>>2]|0)!=0:0)?e=1:e=(t[(dt(e,t[1e3+(n<<2)>>2]|0,948)|0)+4>>2]|0)!=0,e|0}function xi(e,n,r){e=e|0,n=n|0,r=w(r);var u=0,l=0;return e=e+132|0,(Fi(n)|0?(u=dt(e,5,948)|0,(t[u+4>>2]|0)!=0):0)?l=4:(u=dt(e,t[1e3+(n<<2)>>2]|0,948)|0,t[u+4>>2]|0?l=4:r=w(0)),(l|0)==4&&(r=w(Sn(u,r))),w(r)}function Sr(e,n,r){return e=e|0,n=n|0,r=w(r),se(e,n)|0?r=w(re(e,n,r)):r=w(-w(xi(e,n,r))),w(r)}function cr(e){return e=w(e),C[W>>2]=e,t[W>>2]|0|0}function Y(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>1073741823)Xn();else{l=cn(n<<2)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r<<2)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n<<2)}function Qr(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(0-(l>>2)<<2)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function Jr(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~((u+-4-n|0)>>>2)<<2)),e=t[e>>2]|0,e|0&&yt(e)}function Ur(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0;if(h=e+4|0,D=t[h>>2]|0,l=D-u|0,s=l>>2,e=n+(s<<2)|0,e>>>0>>0){u=D;do t[u>>2]=t[e>>2],e=e+4|0,u=(t[h>>2]|0)+4|0,t[h>>2]=u;while(e>>>0>>0)}s|0&&Iy(D+(0-s<<2)|0,n|0,l|0)|0}function lt(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0;return D=n+4|0,S=t[D>>2]|0,l=t[e>>2]|0,h=r,s=h-l|0,u=S+(0-(s>>2)<<2)|0,t[D>>2]=u,(s|0)>0&&pr(u|0,l|0,s|0)|0,l=e+4|0,s=n+8|0,u=(t[l>>2]|0)-h|0,(u|0)>0&&(pr(t[s>>2]|0,r|0,u|0)|0,t[s>>2]=(t[s>>2]|0)+(u>>>2<<2)),h=t[e>>2]|0,t[e>>2]=t[D>>2],t[D>>2]=h,h=t[l>>2]|0,t[l>>2]=t[s>>2],t[s>>2]=h,h=e+8|0,r=n+12|0,e=t[h>>2]|0,t[h>>2]=t[r>>2],t[r>>2]=e,t[n>>2]=t[D>>2],S|0}function hi(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;if(h=t[n>>2]|0,s=t[r>>2]|0,(h|0)!=(s|0)){l=e+8|0,r=((s+-4-h|0)>>>2)+1|0,e=h,u=t[l>>2]|0;do t[u>>2]=t[e>>2],u=(t[l>>2]|0)+4|0,t[l>>2]=u,e=e+4|0;while((e|0)!=(s|0));t[n>>2]=h+(r<<2)}}function Qi(){_e()}function g0(){var e=0;return e=cn(4)|0,bn(e),e|0}function bn(e){e=e|0,t[e>>2]=p0()|0}function Qu(e){e=e|0,e|0&&(eo(e),yt(e))}function eo(e){e=e|0,K0(t[e>>2]|0)}function po(e,n,r){e=e|0,n=n|0,r=r|0,Uu(t[e>>2]|0,n,r)}function Ju(e,n){e=e|0,n=w(n),Gu(t[e>>2]|0,n)}function bo(e,n){return e=e|0,n=n|0,er(t[e>>2]|0,n)|0}function to(){var e=0;return e=cn(8)|0,Na(e,0),e|0}function Na(e,n){e=e|0,n=n|0,n?n=Hn(t[n>>2]|0)|0:n=or()|0,t[e>>2]=n,t[e+4>>2]=0,Ma(n,e)}function pf(e){e=e|0;var n=0;return n=cn(8)|0,Na(n,e),n|0}function uc(e){e=e|0,e|0&&(ms(e),yt(e))}function ms(e){e=e|0;var n=0;bu(t[e>>2]|0),n=e+4|0,e=t[n>>2]|0,t[n>>2]=0,e|0&&(ia(e),yt(e))}function ia(e){e=e|0,B0(e)}function B0(e){e=e|0,e=t[e>>2]|0,e|0&&Ir(e|0)}function oc(e){return e=e|0,Ls(e)|0}function La(e){e=e|0;var n=0,r=0;r=e+4|0,n=t[r>>2]|0,t[r>>2]=0,n|0&&(ia(n),yt(n)),ao(t[e>>2]|0)}function gd(e,n){e=e|0,n=n|0,ea(t[e>>2]|0,t[n>>2]|0)}function $1(e,n){e=e|0,n=n|0,Z(t[e>>2]|0,n)}function e2(e,n,r){e=e|0,n=n|0,r=+r,lr(t[e>>2]|0,n,w(r))}function ho(e,n,r){e=e|0,n=n|0,r=+r,Qn(t[e>>2]|0,n,w(r))}function Uc(e,n){e=e|0,n=n|0,z(t[e>>2]|0,n)}function Dl(e,n){e=e|0,n=n|0,$(t[e>>2]|0,n)}function el(e,n){e=e|0,n=n|0,me(t[e>>2]|0,n)}function _d(e,n){e=e|0,n=n|0,h0(t[e>>2]|0,n)}function Bs(e,n){e=e|0,n=n|0,Xe(t[e>>2]|0,n)}function wl(e,n){e=e|0,n=n|0,Ni(t[e>>2]|0,n)}function t2(e,n,r){e=e|0,n=n|0,r=+r,Cn(t[e>>2]|0,n,w(r))}function Po(e,n,r){e=e|0,n=n|0,r=+r,Ar(t[e>>2]|0,n,w(r))}function Fa(e,n){e=e|0,n=n|0,Rr(t[e>>2]|0,n)}function ba(e,n){e=e|0,n=n|0,ie(t[e>>2]|0,n)}function Pa(e,n){e=e|0,n=n|0,tt(t[e>>2]|0,n)}function ua(e,n){e=e|0,n=+n,kt(t[e>>2]|0,w(n))}function ys(e,n){e=e|0,n=+n,tn(t[e>>2]|0,w(n))}function gs(e,n){e=e|0,n=+n,Lt(t[e>>2]|0,w(n))}function Ql(e,n){e=e|0,n=+n,bt(t[e>>2]|0,w(n))}function Io(e,n){e=e|0,n=+n,on(t[e>>2]|0,w(n))}function hf(e,n){e=e|0,n=+n,sn(t[e>>2]|0,w(n))}function tl(e,n){e=e|0,n=+n,Yn(t[e>>2]|0,w(n))}function ju(e){e=e|0,yr(t[e>>2]|0)}function Ia(e,n){e=e|0,n=+n,Cu(t[e>>2]|0,w(n))}function Zu(e,n){e=e|0,n=+n,S0(t[e>>2]|0,w(n))}function U0(e){e=e|0,X0(t[e>>2]|0)}function vf(e,n){e=e|0,n=+n,di(t[e>>2]|0,w(n))}function jc(e,n){e=e|0,n=+n,ko(t[e>>2]|0,w(n))}function lc(e,n){e=e|0,n=+n,sf(t[e>>2]|0,w(n))}function Sl(e,n){e=e|0,n=+n,gl(t[e>>2]|0,w(n))}function _s(e,n){e=e|0,n=+n,Mo(t[e>>2]|0,w(n))}function oa(e,n){e=e|0,n=+n,ds(t[e>>2]|0,w(n))}function n2(e,n){e=e|0,n=+n,No(t[e>>2]|0,w(n))}function la(e,n){e=e|0,n=+n,Lo(t[e>>2]|0,w(n))}function sc(e,n){e=e|0,n=+n,Vu(t[e>>2]|0,w(n))}function zc(e,n,r){e=e|0,n=n|0,r=+r,Ft(t[e>>2]|0,n,w(r))}function bi(e,n,r){e=e|0,n=n|0,r=+r,nt(t[e>>2]|0,n,w(r))}function g(e,n,r){e=e|0,n=n|0,r=+r,_t(t[e>>2]|0,n,w(r))}function y(e){return e=e|0,ke(t[e>>2]|0)|0}function A(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0;u=m,m=m+16|0,l=u,_r(l,t[n>>2]|0,r),F(e,l),m=u}function F(e,n){e=e|0,n=n|0,I(e,t[n+4>>2]|0,+w(C[n>>2]))}function I(e,n,r){e=e|0,n=n|0,r=+r,t[e>>2]=n,U[e+8>>3]=r}function J(e){return e=e|0,G(t[e>>2]|0)|0}function fe(e){return e=e|0,De(t[e>>2]|0)|0}function mt(e){return e=e|0,xe(t[e>>2]|0)|0}function Ct(e){return e=e|0,Fs(t[e>>2]|0)|0}function Mt(e){return e=e|0,ht(t[e>>2]|0)|0}function Er(e){return e=e|0,B(t[e>>2]|0)|0}function $u(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0;u=m,m=m+16|0,l=u,v0(l,t[n>>2]|0,r),F(e,l),m=u}function iu(e){return e=e|0,qe(t[e>>2]|0)|0}function j0(e){return e=e|0,Tt(t[e>>2]|0)|0}function Tl(e,n){e=e|0,n=n|0;var r=0,u=0;r=m,m=m+16|0,u=r,gn(u,t[n>>2]|0),F(e,u),m=r}function e0(e){return e=e|0,+ +w(lf(t[e>>2]|0))}function He(e){return e=e|0,+ +w(Ns(t[e>>2]|0))}function Be(e,n){e=e|0,n=n|0;var r=0,u=0;r=m,m=m+16|0,u=r,nu(u,t[n>>2]|0),F(e,u),m=r}function ut(e,n){e=e|0,n=n|0;var r=0,u=0;r=m,m=m+16|0,u=r,xu(u,t[n>>2]|0),F(e,u),m=r}function Jt(e,n){e=e|0,n=n|0;var r=0,u=0;r=m,m=m+16|0,u=r,Zo(u,t[n>>2]|0),F(e,u),m=r}function jn(e,n){e=e|0,n=n|0;var r=0,u=0;r=m,m=m+16|0,u=r,af(u,t[n>>2]|0),F(e,u),m=r}function ti(e,n){e=e|0,n=n|0;var r=0,u=0;r=m,m=m+16|0,u=r,bs(u,t[n>>2]|0),F(e,u),m=r}function tr(e,n){e=e|0,n=n|0;var r=0,u=0;r=m,m=m+16|0,u=r,ps(u,t[n>>2]|0),F(e,u),m=r}function ii(e){return e=e|0,+ +w(yu(t[e>>2]|0))}function qi(e,n){return e=e|0,n=n|0,+ +w(nn(t[e>>2]|0,n))}function jr(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0;u=m,m=m+16|0,l=u,Ze(l,t[n>>2]|0,r),F(e,l),m=u}function gu(e,n,r){e=e|0,n=n|0,r=r|0,ka(t[e>>2]|0,t[n>>2]|0,r)}function Ba(e,n){e=e|0,n=n|0,Tu(t[e>>2]|0,t[n>>2]|0)}function Ua(e){return e=e|0,mu(t[e>>2]|0)|0}function r2(e){return e=e|0,e=ri(t[e>>2]|0)|0,e?e=oc(e)|0:e=0,e|0}function Ed(e,n){return e=e|0,n=n|0,e=yi(t[e>>2]|0,n)|0,e?e=oc(e)|0:e=0,e|0}function Dd(e,n){e=e|0,n=n|0;var r=0,u=0;u=cn(4)|0,mf(u,n),r=e+4|0,n=t[r>>2]|0,t[r>>2]=u,n|0&&(ia(n),yt(n)),$s(t[e>>2]|0,1)}function mf(e,n){e=e|0,n=n|0,rl(e,n)}function i2(e,n,r,u,l,s){e=e|0,n=n|0,r=w(r),u=u|0,l=w(l),s=s|0;var h=0,D=0;h=m,m=m+16|0,D=h,ch(D,Ls(n)|0,+r,u,+l,s),C[e>>2]=w(+U[D>>3]),C[e+4>>2]=w(+U[D+8>>3]),m=h}function ch(e,n,r,u,l,s){e=e|0,n=n|0,r=+r,u=u|0,l=+l,s=s|0;var h=0,D=0,S=0,M=0,O=0;h=m,m=m+32|0,O=h+8|0,M=h+20|0,S=h,D=h+16|0,U[O>>3]=r,t[M>>2]=u,U[S>>3]=l,t[D>>2]=s,qc(e,t[n+4>>2]|0,O,M,S,D),m=h}function qc(e,n,r,u,l,s){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,s=s|0;var h=0,D=0;h=m,m=m+16|0,D=h,Ta(D),n=vo(n)|0,dh(e,n,+U[r>>3],t[u>>2]|0,+U[l>>3],t[s>>2]|0),Ca(D),m=h}function vo(e){return e=e|0,t[e>>2]|0}function dh(e,n,r,u,l,s){e=e|0,n=n|0,r=+r,u=u|0,l=+l,s=s|0;var h=0;h=mo(ph()|0)|0,r=+Cl(r),u=u2(u)|0,l=+Cl(l),o2(e,Wr(0,h|0,n|0,+r,u|0,+l,u2(s)|0)|0)}function ph(){var e=0;return p[7608]|0||(Wc(9120),e=7608,t[e>>2]=1,t[e+4>>2]=0),9120}function mo(e){return e=e|0,t[e+8>>2]|0}function Cl(e){return e=+e,+ +ja(e)}function u2(e){return e=e|0,s2(e)|0}function o2(e,n){e=e|0,n=n|0;var r=0,u=0,l=0;l=m,m=m+32|0,r=l,u=n,u&1?(wd(r,0),Yi(u|0,r|0)|0,Hc(e,r),Mr(r)):(t[e>>2]=t[n>>2],t[e+4>>2]=t[n+4>>2],t[e+8>>2]=t[n+8>>2],t[e+12>>2]=t[n+12>>2]),m=l}function wd(e,n){e=e|0,n=n|0,l2(e,n),t[e+8>>2]=0,p[e+24>>0]=0}function Hc(e,n){e=e|0,n=n|0,n=n+8|0,t[e>>2]=t[n>>2],t[e+4>>2]=t[n+4>>2],t[e+8>>2]=t[n+8>>2],t[e+12>>2]=t[n+12>>2]}function Mr(e){e=e|0,p[e+24>>0]=0}function l2(e,n){e=e|0,n=n|0,t[e>>2]=n}function s2(e){return e=e|0,e|0}function ja(e){return e=+e,+e}function Wc(e){e=e|0,nl(e,Sd()|0,4)}function Sd(){return 1064}function nl(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r,t[e+8>>2]=Pt(n|0,r+1|0)|0}function rl(e,n){e=e|0,n=n|0,n=t[n>>2]|0,t[e>>2]=n,Ei(n|0)}function hh(e){e=e|0;var n=0,r=0;r=e+4|0,n=t[r>>2]|0,t[r>>2]=0,n|0&&(ia(n),yt(n)),$s(t[e>>2]|0,0)}function yf(e){e=e|0,Gr(t[e>>2]|0)}function Vc(e){return e=e|0,Yl(t[e>>2]|0)|0}function Td(e,n,r,u){e=e|0,n=+n,r=+r,u=u|0,Kr(t[e>>2]|0,w(n),w(r),u)}function vh(e){return e=e|0,+ +w(pi(t[e>>2]|0))}function il(e){return e=e|0,+ +w(Q0(t[e>>2]|0))}function sa(e){return e=e|0,+ +w(T0(t[e>>2]|0))}function Cd(e){return e=e|0,+ +w(Fo(t[e>>2]|0))}function xd(e){return e=e|0,+ +w(ta(t[e>>2]|0))}function ac(e){return e=e|0,+ +w(Kl(t[e>>2]|0))}function mh(e,n){e=e|0,n=n|0,U[e>>3]=+w(pi(t[n>>2]|0)),U[e+8>>3]=+w(Q0(t[n>>2]|0)),U[e+16>>3]=+w(T0(t[n>>2]|0)),U[e+24>>3]=+w(Fo(t[n>>2]|0)),U[e+32>>3]=+w(ta(t[n>>2]|0)),U[e+40>>3]=+w(Kl(t[n>>2]|0))}function Ad(e,n){return e=e|0,n=n|0,+ +w(Ki(t[e>>2]|0,n))}function a2(e,n){return e=e|0,n=n|0,+ +w(Yr(t[e>>2]|0,n))}function Gc(e,n){return e=e|0,n=n|0,+ +w(fo(t[e>>2]|0,n))}function Yc(){return Oa()|0}function Us(){Rd(),aa(),Kc(),fc(),cc(),f2()}function Rd(){bN(11713,4938,1)}function aa(){eN(10448)}function Kc(){bM(10408)}function fc(){iM(10324)}function cc(){yE(10096)}function f2(){yh(9132)}function yh(e){e=e|0;var n=0,r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0,Pe=0,Ee=0,ve=0,Qe=0,We=0,st=0,Re=0,Fe=0,Qt=0,Lr=0,Nn=0,mn=0,hr=0,kr=0,On=0,Zi=0,ts=0,ns=0,rs=0,Xs=0,$2=0,ed=0,Za=0,td=0,Oc=0,kc=0,nd=0,rd=0,id=0,si=0,$a=0,ud=0,zf=0,od=0,ld=0,Mc=0,Nc=0,qf=0,Il=0,Aa=0,As=0,ef=0,L1=0,F1=0,Lc=0,b1=0,P1=0,Bl=0,vl=0,tf=0,lu=0,I1=0,is=0,Hf=0,us=0,Wf=0,B1=0,U1=0,Vf=0,Ul=0,nf=0,j1=0,z1=0,q1=0,gr=0,Mu=0,ml=0,os=0,jl=0,Tr=0,Fn=0,rf=0;n=m,m=m+672|0,r=n+656|0,rf=n+648|0,Fn=n+640|0,Tr=n+632|0,jl=n+624|0,os=n+616|0,ml=n+608|0,Mu=n+600|0,gr=n+592|0,q1=n+584|0,z1=n+576|0,j1=n+568|0,nf=n+560|0,Ul=n+552|0,Vf=n+544|0,U1=n+536|0,B1=n+528|0,Wf=n+520|0,us=n+512|0,Hf=n+504|0,is=n+496|0,I1=n+488|0,lu=n+480|0,tf=n+472|0,vl=n+464|0,Bl=n+456|0,P1=n+448|0,b1=n+440|0,Lc=n+432|0,F1=n+424|0,L1=n+416|0,ef=n+408|0,As=n+400|0,Aa=n+392|0,Il=n+384|0,qf=n+376|0,Nc=n+368|0,Mc=n+360|0,ld=n+352|0,od=n+344|0,zf=n+336|0,ud=n+328|0,$a=n+320|0,si=n+312|0,id=n+304|0,rd=n+296|0,nd=n+288|0,kc=n+280|0,Oc=n+272|0,td=n+264|0,Za=n+256|0,ed=n+248|0,$2=n+240|0,Xs=n+232|0,rs=n+224|0,ns=n+216|0,ts=n+208|0,Zi=n+200|0,On=n+192|0,kr=n+184|0,hr=n+176|0,mn=n+168|0,Nn=n+160|0,Lr=n+152|0,Qt=n+144|0,Fe=n+136|0,Re=n+128|0,st=n+120|0,We=n+112|0,Qe=n+104|0,ve=n+96|0,Ee=n+88|0,Pe=n+80|0,K=n+72|0,P=n+64|0,O=n+56|0,M=n+48|0,S=n+40|0,D=n+32|0,h=n+24|0,s=n+16|0,l=n+8|0,u=n,gf(e,3646),Xc(e,3651,2)|0,gh(e,3665,2)|0,vm(e,3682,18)|0,t[rf>>2]=19,t[rf+4>>2]=0,t[r>>2]=t[rf>>2],t[r+4>>2]=t[rf+4>>2],js(e,3690,r)|0,t[Fn>>2]=1,t[Fn+4>>2]=0,t[r>>2]=t[Fn>>2],t[r+4>>2]=t[Fn+4>>2],fa(e,3696,r)|0,t[Tr>>2]=2,t[Tr+4>>2]=0,t[r>>2]=t[Tr>>2],t[r+4>>2]=t[Tr+4>>2],Ji(e,3706,r)|0,t[jl>>2]=1,t[jl+4>>2]=0,t[r>>2]=t[jl>>2],t[r+4>>2]=t[jl+4>>2],O0(e,3722,r)|0,t[os>>2]=2,t[os+4>>2]=0,t[r>>2]=t[os>>2],t[r+4>>2]=t[os+4>>2],O0(e,3734,r)|0,t[ml>>2]=3,t[ml+4>>2]=0,t[r>>2]=t[ml>>2],t[r+4>>2]=t[ml+4>>2],Ji(e,3753,r)|0,t[Mu>>2]=4,t[Mu+4>>2]=0,t[r>>2]=t[Mu>>2],t[r+4>>2]=t[Mu+4>>2],Ji(e,3769,r)|0,t[gr>>2]=5,t[gr+4>>2]=0,t[r>>2]=t[gr>>2],t[r+4>>2]=t[gr+4>>2],Ji(e,3783,r)|0,t[q1>>2]=6,t[q1+4>>2]=0,t[r>>2]=t[q1>>2],t[r+4>>2]=t[q1+4>>2],Ji(e,3796,r)|0,t[z1>>2]=7,t[z1+4>>2]=0,t[r>>2]=t[z1>>2],t[r+4>>2]=t[z1+4>>2],Ji(e,3813,r)|0,t[j1>>2]=8,t[j1+4>>2]=0,t[r>>2]=t[j1>>2],t[r+4>>2]=t[j1+4>>2],Ji(e,3825,r)|0,t[nf>>2]=3,t[nf+4>>2]=0,t[r>>2]=t[nf>>2],t[r+4>>2]=t[nf+4>>2],O0(e,3843,r)|0,t[Ul>>2]=4,t[Ul+4>>2]=0,t[r>>2]=t[Ul>>2],t[r+4>>2]=t[Ul+4>>2],O0(e,3853,r)|0,t[Vf>>2]=9,t[Vf+4>>2]=0,t[r>>2]=t[Vf>>2],t[r+4>>2]=t[Vf+4>>2],Ji(e,3870,r)|0,t[U1>>2]=10,t[U1+4>>2]=0,t[r>>2]=t[U1>>2],t[r+4>>2]=t[U1+4>>2],Ji(e,3884,r)|0,t[B1>>2]=11,t[B1+4>>2]=0,t[r>>2]=t[B1>>2],t[r+4>>2]=t[B1+4>>2],Ji(e,3896,r)|0,t[Wf>>2]=1,t[Wf+4>>2]=0,t[r>>2]=t[Wf>>2],t[r+4>>2]=t[Wf+4>>2],t0(e,3907,r)|0,t[us>>2]=2,t[us+4>>2]=0,t[r>>2]=t[us>>2],t[r+4>>2]=t[us+4>>2],t0(e,3915,r)|0,t[Hf>>2]=3,t[Hf+4>>2]=0,t[r>>2]=t[Hf>>2],t[r+4>>2]=t[Hf+4>>2],t0(e,3928,r)|0,t[is>>2]=4,t[is+4>>2]=0,t[r>>2]=t[is>>2],t[r+4>>2]=t[is+4>>2],t0(e,3948,r)|0,t[I1>>2]=5,t[I1+4>>2]=0,t[r>>2]=t[I1>>2],t[r+4>>2]=t[I1+4>>2],t0(e,3960,r)|0,t[lu>>2]=6,t[lu+4>>2]=0,t[r>>2]=t[lu>>2],t[r+4>>2]=t[lu+4>>2],t0(e,3974,r)|0,t[tf>>2]=7,t[tf+4>>2]=0,t[r>>2]=t[tf>>2],t[r+4>>2]=t[tf+4>>2],t0(e,3983,r)|0,t[vl>>2]=20,t[vl+4>>2]=0,t[r>>2]=t[vl>>2],t[r+4>>2]=t[vl+4>>2],js(e,3999,r)|0,t[Bl>>2]=8,t[Bl+4>>2]=0,t[r>>2]=t[Bl>>2],t[r+4>>2]=t[Bl+4>>2],t0(e,4012,r)|0,t[P1>>2]=9,t[P1+4>>2]=0,t[r>>2]=t[P1>>2],t[r+4>>2]=t[P1+4>>2],t0(e,4022,r)|0,t[b1>>2]=21,t[b1+4>>2]=0,t[r>>2]=t[b1>>2],t[r+4>>2]=t[b1+4>>2],js(e,4039,r)|0,t[Lc>>2]=10,t[Lc+4>>2]=0,t[r>>2]=t[Lc>>2],t[r+4>>2]=t[Lc+4>>2],t0(e,4053,r)|0,t[F1>>2]=11,t[F1+4>>2]=0,t[r>>2]=t[F1>>2],t[r+4>>2]=t[F1+4>>2],t0(e,4065,r)|0,t[L1>>2]=12,t[L1+4>>2]=0,t[r>>2]=t[L1>>2],t[r+4>>2]=t[L1+4>>2],t0(e,4084,r)|0,t[ef>>2]=13,t[ef+4>>2]=0,t[r>>2]=t[ef>>2],t[r+4>>2]=t[ef+4>>2],t0(e,4097,r)|0,t[As>>2]=14,t[As+4>>2]=0,t[r>>2]=t[As>>2],t[r+4>>2]=t[As+4>>2],t0(e,4117,r)|0,t[Aa>>2]=15,t[Aa+4>>2]=0,t[r>>2]=t[Aa>>2],t[r+4>>2]=t[Aa+4>>2],t0(e,4129,r)|0,t[Il>>2]=16,t[Il+4>>2]=0,t[r>>2]=t[Il>>2],t[r+4>>2]=t[Il+4>>2],t0(e,4148,r)|0,t[qf>>2]=17,t[qf+4>>2]=0,t[r>>2]=t[qf>>2],t[r+4>>2]=t[qf+4>>2],t0(e,4161,r)|0,t[Nc>>2]=18,t[Nc+4>>2]=0,t[r>>2]=t[Nc>>2],t[r+4>>2]=t[Nc+4>>2],t0(e,4181,r)|0,t[Mc>>2]=5,t[Mc+4>>2]=0,t[r>>2]=t[Mc>>2],t[r+4>>2]=t[Mc+4>>2],O0(e,4196,r)|0,t[ld>>2]=6,t[ld+4>>2]=0,t[r>>2]=t[ld>>2],t[r+4>>2]=t[ld+4>>2],O0(e,4206,r)|0,t[od>>2]=7,t[od+4>>2]=0,t[r>>2]=t[od>>2],t[r+4>>2]=t[od+4>>2],O0(e,4217,r)|0,t[zf>>2]=3,t[zf+4>>2]=0,t[r>>2]=t[zf>>2],t[r+4>>2]=t[zf+4>>2],Jl(e,4235,r)|0,t[ud>>2]=1,t[ud+4>>2]=0,t[r>>2]=t[ud>>2],t[r+4>>2]=t[ud+4>>2],za(e,4251,r)|0,t[$a>>2]=4,t[$a+4>>2]=0,t[r>>2]=t[$a>>2],t[r+4>>2]=t[$a+4>>2],Jl(e,4263,r)|0,t[si>>2]=5,t[si+4>>2]=0,t[r>>2]=t[si>>2],t[r+4>>2]=t[si+4>>2],Jl(e,4279,r)|0,t[id>>2]=6,t[id+4>>2]=0,t[r>>2]=t[id>>2],t[r+4>>2]=t[id+4>>2],Jl(e,4293,r)|0,t[rd>>2]=7,t[rd+4>>2]=0,t[r>>2]=t[rd>>2],t[r+4>>2]=t[rd+4>>2],Jl(e,4306,r)|0,t[nd>>2]=8,t[nd+4>>2]=0,t[r>>2]=t[nd>>2],t[r+4>>2]=t[nd+4>>2],Jl(e,4323,r)|0,t[kc>>2]=9,t[kc+4>>2]=0,t[r>>2]=t[kc>>2],t[r+4>>2]=t[kc+4>>2],Jl(e,4335,r)|0,t[Oc>>2]=2,t[Oc+4>>2]=0,t[r>>2]=t[Oc>>2],t[r+4>>2]=t[Oc+4>>2],za(e,4353,r)|0,t[td>>2]=12,t[td+4>>2]=0,t[r>>2]=t[td>>2],t[r+4>>2]=t[td+4>>2],no(e,4363,r)|0,t[Za>>2]=1,t[Za+4>>2]=0,t[r>>2]=t[Za>>2],t[r+4>>2]=t[Za+4>>2],ul(e,4376,r)|0,t[ed>>2]=2,t[ed+4>>2]=0,t[r>>2]=t[ed>>2],t[r+4>>2]=t[ed+4>>2],ul(e,4388,r)|0,t[$2>>2]=13,t[$2+4>>2]=0,t[r>>2]=t[$2>>2],t[r+4>>2]=t[$2+4>>2],no(e,4402,r)|0,t[Xs>>2]=14,t[Xs+4>>2]=0,t[r>>2]=t[Xs>>2],t[r+4>>2]=t[Xs+4>>2],no(e,4411,r)|0,t[rs>>2]=15,t[rs+4>>2]=0,t[r>>2]=t[rs>>2],t[r+4>>2]=t[rs+4>>2],no(e,4421,r)|0,t[ns>>2]=16,t[ns+4>>2]=0,t[r>>2]=t[ns>>2],t[r+4>>2]=t[ns+4>>2],no(e,4433,r)|0,t[ts>>2]=17,t[ts+4>>2]=0,t[r>>2]=t[ts>>2],t[r+4>>2]=t[ts+4>>2],no(e,4446,r)|0,t[Zi>>2]=18,t[Zi+4>>2]=0,t[r>>2]=t[Zi>>2],t[r+4>>2]=t[Zi+4>>2],no(e,4458,r)|0,t[On>>2]=3,t[On+4>>2]=0,t[r>>2]=t[On>>2],t[r+4>>2]=t[On+4>>2],ul(e,4471,r)|0,t[kr>>2]=1,t[kr+4>>2]=0,t[r>>2]=t[kr>>2],t[r+4>>2]=t[kr+4>>2],dc(e,4486,r)|0,t[hr>>2]=10,t[hr+4>>2]=0,t[r>>2]=t[hr>>2],t[r+4>>2]=t[hr+4>>2],Jl(e,4496,r)|0,t[mn>>2]=11,t[mn+4>>2]=0,t[r>>2]=t[mn>>2],t[r+4>>2]=t[mn+4>>2],Jl(e,4508,r)|0,t[Nn>>2]=3,t[Nn+4>>2]=0,t[r>>2]=t[Nn>>2],t[r+4>>2]=t[Nn+4>>2],za(e,4519,r)|0,t[Lr>>2]=4,t[Lr+4>>2]=0,t[r>>2]=t[Lr>>2],t[r+4>>2]=t[Lr+4>>2],Od(e,4530,r)|0,t[Qt>>2]=19,t[Qt+4>>2]=0,t[r>>2]=t[Qt>>2],t[r+4>>2]=t[Qt+4>>2],_h(e,4542,r)|0,t[Fe>>2]=12,t[Fe+4>>2]=0,t[r>>2]=t[Fe>>2],t[r+4>>2]=t[Fe+4>>2],_f(e,4554,r)|0,t[Re>>2]=13,t[Re+4>>2]=0,t[r>>2]=t[Re>>2],t[r+4>>2]=t[Re+4>>2],Ef(e,4568,r)|0,t[st>>2]=2,t[st+4>>2]=0,t[r>>2]=t[st>>2],t[r+4>>2]=t[st+4>>2],Qc(e,4578,r)|0,t[We>>2]=20,t[We+4>>2]=0,t[r>>2]=t[We>>2],t[r+4>>2]=t[We+4>>2],xl(e,4587,r)|0,t[Qe>>2]=22,t[Qe+4>>2]=0,t[r>>2]=t[Qe>>2],t[r+4>>2]=t[Qe+4>>2],js(e,4602,r)|0,t[ve>>2]=23,t[ve+4>>2]=0,t[r>>2]=t[ve>>2],t[r+4>>2]=t[ve+4>>2],js(e,4619,r)|0,t[Ee>>2]=14,t[Ee+4>>2]=0,t[r>>2]=t[Ee>>2],t[r+4>>2]=t[Ee+4>>2],Jc(e,4629,r)|0,t[Pe>>2]=1,t[Pe+4>>2]=0,t[r>>2]=t[Pe>>2],t[r+4>>2]=t[Pe+4>>2],ca(e,4637,r)|0,t[K>>2]=4,t[K+4>>2]=0,t[r>>2]=t[K>>2],t[r+4>>2]=t[K+4>>2],ul(e,4653,r)|0,t[P>>2]=5,t[P+4>>2]=0,t[r>>2]=t[P>>2],t[r+4>>2]=t[P+4>>2],ul(e,4669,r)|0,t[O>>2]=6,t[O+4>>2]=0,t[r>>2]=t[O>>2],t[r+4>>2]=t[O+4>>2],ul(e,4686,r)|0,t[M>>2]=7,t[M+4>>2]=0,t[r>>2]=t[M>>2],t[r+4>>2]=t[M+4>>2],ul(e,4701,r)|0,t[S>>2]=8,t[S+4>>2]=0,t[r>>2]=t[S>>2],t[r+4>>2]=t[S+4>>2],ul(e,4719,r)|0,t[D>>2]=9,t[D+4>>2]=0,t[r>>2]=t[D>>2],t[r+4>>2]=t[D+4>>2],ul(e,4736,r)|0,t[h>>2]=21,t[h+4>>2]=0,t[r>>2]=t[h>>2],t[r+4>>2]=t[h+4>>2],c2(e,4754,r)|0,t[s>>2]=2,t[s+4>>2]=0,t[r>>2]=t[s>>2],t[r+4>>2]=t[s+4>>2],dc(e,4772,r)|0,t[l>>2]=3,t[l+4>>2]=0,t[r>>2]=t[l>>2],t[r+4>>2]=t[l+4>>2],dc(e,4790,r)|0,t[u>>2]=4,t[u+4>>2]=0,t[r>>2]=t[u>>2],t[r+4>>2]=t[u+4>>2],dc(e,4808,r)|0,m=n}function gf(e,n){e=e|0,n=n|0;var r=0;r=Ja()|0,t[e>>2]=r,jo(r,n),Q2(t[e>>2]|0)}function Xc(e,n,r){return e=e|0,n=n|0,r=r|0,Ot(e,Or(n)|0,r,0),e|0}function gh(e,n,r){return e=e|0,n=n|0,r=r|0,c(e,Or(n)|0,r,0),e|0}function vm(e,n,r){return e=e|0,n=n|0,r=r|0,cE(e,Or(n)|0,r,0),e|0}function js(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],rE(e,n,l),m=u,e|0}function fa(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],bl(e,n,l),m=u,e|0}function Ji(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],d(e,n,l),m=u,e|0}function O0(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],Tv(e,n,l),m=u,e|0}function t0(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],sy(e,n,l),m=u,e|0}function Jl(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],W2(e,n,l),m=u,e|0}function za(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],H2(e,n,l),m=u,e|0}function no(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],k0(e,n,l),m=u,e|0}function ul(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],Ep(e,n,l),m=u,e|0}function dc(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],Hm(e,n,l),m=u,e|0}function Od(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],n0(e,n,l),m=u,e|0}function _h(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],x2(e,n,l),m=u,e|0}function _f(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],Fm(e,n,l),m=u,e|0}function Ef(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],Zd(e,n,l),m=u,e|0}function Qc(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],p1(e,n,l),m=u,e|0}function xl(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],Ga(e,n,l),m=u,e|0}function Jc(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],Id(e,n,l),m=u,e|0}function ca(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],Nd(e,n,l),m=u,e|0}function c2(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],d2(e,n,l),m=u,e|0}function d2(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],da(e,r,l,1),m=u}function Or(e){return e=e|0,e|0}function da(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=kd()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=Zc(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,p2(s,u)|0,u),m=l}function kd(){var e=0,n=0;if(p[7616]|0||(ol(9136),Ht(24,9136,he|0)|0,n=7616,t[n>>2]=1,t[n+4>>2]=0),!(rr(9136)|0)){e=9136,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));ol(9136)}return 9136}function Zc(e){return e=e|0,0}function p2(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=kd()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],Df(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(wf(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function vi(e,n,r,u,l,s){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,s=s|0;var h=0,D=0,S=0,M=0,O=0,P=0,K=0,Pe=0;h=m,m=m+32|0,K=h+24|0,P=h+20|0,S=h+16|0,O=h+12|0,M=h+8|0,D=h+4|0,Pe=h,t[P>>2]=n,t[S>>2]=r,t[O>>2]=u,t[M>>2]=l,t[D>>2]=s,s=e+28|0,t[Pe>>2]=t[s>>2],t[K>>2]=t[Pe>>2],Md(e+24|0,K,P,O,M,S,D)|0,t[s>>2]=t[t[s>>2]>>2],m=h}function Md(e,n,r,u,l,s,h){return e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,s=s|0,h=h|0,e=mm(n)|0,n=cn(24)|0,h2(n+4|0,t[r>>2]|0,t[u>>2]|0,t[l>>2]|0,t[s>>2]|0,t[h>>2]|0),t[n>>2]=t[e>>2],t[e>>2]=n,n|0}function mm(e){return e=e|0,t[e>>2]|0}function h2(e,n,r,u,l,s){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,s=s|0,t[e>>2]=n,t[e+4>>2]=r,t[e+8>>2]=u,t[e+12>>2]=l,t[e+16>>2]=s}function dn(e,n){return e=e|0,n=n|0,n|e|0}function Df(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function wf(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=ym(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,Sf(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],Df(s,u,r),t[S>>2]=(t[S>>2]|0)+12,Eh(e,D),gm(D),m=M;return}}function ym(e){return e=e|0,357913941}function Sf(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function Eh(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function gm(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function ol(e){e=e|0,Bo(e)}function $c(e){e=e|0,Un(e+24|0)}function rr(e){return e=e|0,t[e>>2]|0}function Un(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function Bo(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,3,n,zn()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function dr(){return 9228}function zn(){return 1140}function ll(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0;return r=m,m=m+16|0,u=r+8|0,l=r,s=yo(e)|0,e=t[s+4>>2]|0,t[l>>2]=t[s>>2],t[l+4>>2]=e,t[u>>2]=t[l>>2],t[u+4>>2]=t[l+4>>2],n=pc(n,u)|0,m=r,n|0}function Pn(e,n,r,u,l,s){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,s=s|0,t[e>>2]=n,t[e+4>>2]=r,t[e+8>>2]=u,t[e+12>>2]=l,t[e+16>>2]=s}function yo(e){return e=e|0,(t[(kd()|0)+24>>2]|0)+(e*12|0)|0}function pc(e,n){e=e|0,n=n|0;var r=0,u=0,l=0;return l=m,m=m+48|0,u=l,r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),N1[r&31](u,e),u=ro(u)|0,m=l,u|0}function ro(e){e=e|0;var n=0,r=0,u=0,l=0;return l=m,m=m+32|0,n=l+12|0,r=l,u=Ou(qa()|0)|0,u?(Zl(n,u),Tf(r,n),hc(e,r),e=Es(n)|0):e=vc(e)|0,m=l,e|0}function qa(){var e=0;return p[7632]|0||(xf(9184),Ht(25,9184,he|0)|0,e=7632,t[e>>2]=1,t[e+4>>2]=0),9184}function Ou(e){return e=e|0,t[e+36>>2]|0}function Zl(e,n){e=e|0,n=n|0,t[e>>2]=n,t[e+4>>2]=e,t[e+8>>2]=0}function Tf(e,n){e=e|0,n=n|0,t[e>>2]=t[n>>2],t[e+4>>2]=t[n+4>>2],t[e+8>>2]=0}function hc(e,n){e=e|0,n=n|0,io(n,e,e+8|0,e+16|0,e+24|0,e+32|0,e+40|0)|0}function Es(e){return e=e|0,t[(t[e+4>>2]|0)+8>>2]|0}function vc(e){e=e|0;var n=0,r=0,u=0,l=0,s=0,h=0,D=0,S=0;S=m,m=m+16|0,r=S+4|0,u=S,l=Sa(8)|0,s=l,h=cn(48)|0,D=h,n=D+48|0;do t[D>>2]=t[e>>2],D=D+4|0,e=e+4|0;while((D|0)<(n|0));return n=s+4|0,t[n>>2]=h,D=cn(8)|0,h=t[n>>2]|0,t[u>>2]=0,t[r>>2]=t[u>>2],Dh(D,h,r),t[l>>2]=D,m=S,s|0}function Dh(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=cn(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1092,t[r+12>>2]=n,t[e+4>>2]=r}function an(e){e=e|0,Pv(e),yt(e)}function $l(e){e=e|0,e=t[e+12>>2]|0,e|0&&yt(e)}function go(e){e=e|0,yt(e)}function io(e,n,r,u,l,s,h){return e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,s=s|0,h=h|0,s=Hi(t[e>>2]|0,n,r,u,l,s,h)|0,h=e+4|0,t[(t[h>>2]|0)+8>>2]=s,t[(t[h>>2]|0)+8>>2]|0}function Hi(e,n,r,u,l,s,h){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,s=s|0,h=h|0;var D=0,S=0;return D=m,m=m+16|0,S=D,Ta(S),e=vo(e)|0,h=zr(e,+U[n>>3],+U[r>>3],+U[u>>3],+U[l>>3],+U[s>>3],+U[h>>3])|0,Ca(S),m=D,h|0}function zr(e,n,r,u,l,s,h){e=e|0,n=+n,r=+r,u=+u,l=+l,s=+s,h=+h;var D=0;return D=mo(Cf()|0)|0,n=+Cl(n),r=+Cl(r),u=+Cl(u),l=+Cl(l),s=+Cl(s),f0(0,D|0,e|0,+n,+r,+u,+l,+s,+ +Cl(h))|0}function Cf(){var e=0;return p[7624]|0||(_m(9172),e=7624,t[e>>2]=1,t[e+4>>2]=0),9172}function _m(e){e=e|0,nl(e,Al()|0,6)}function Al(){return 1112}function xf(e){e=e|0,Ha(e)}function Af(e){e=e|0,v2(e+24|0),m2(e+16|0)}function v2(e){e=e|0,e1(e)}function m2(e){e=e|0,mc(e)}function mc(e){e=e|0;var n=0,r=0;if(n=t[e>>2]|0,n|0)do r=n,n=t[n>>2]|0,yt(r);while((n|0)!=0);t[e>>2]=0}function e1(e){e=e|0;var n=0,r=0;if(n=t[e>>2]|0,n|0)do r=n,n=t[n>>2]|0,yt(r);while((n|0)!=0);t[e>>2]=0}function Ha(e){e=e|0;var n=0;t[e+16>>2]=0,t[e+20>>2]=0,n=e+24|0,t[n>>2]=0,t[e+28>>2]=n,t[e+36>>2]=0,p[e+40>>0]=0,p[e+41>>0]=0}function Nd(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],y2(e,r,l,0),m=u}function y2(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=t1()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=Rf(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,n1(s,u)|0,u),m=l}function t1(){var e=0,n=0;if(p[7640]|0||(Rl(9232),Ht(26,9232,he|0)|0,n=7640,t[n>>2]=1,t[n+4>>2]=0),!(rr(9232)|0)){e=9232,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Rl(9232)}return 9232}function Rf(e){return e=e|0,0}function n1(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=t1()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],Wa(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(r1(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function Wa(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function r1(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=Ld(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,g2(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],Wa(s,u,r),t[S>>2]=(t[S>>2]|0)+12,yc(e,D),i1(D),m=M;return}}function Ld(e){return e=e|0,357913941}function g2(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function yc(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function i1(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function Rl(e){e=e|0,Fd(e)}function pa(e){e=e|0,wh(e+24|0)}function wh(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function Fd(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,1,n,bd()|0,3),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function bd(){return 1144}function Sh(e,n,r,u,l){e=e|0,n=n|0,r=+r,u=+u,l=l|0;var s=0,h=0,D=0,S=0;s=m,m=m+16|0,h=s+8|0,D=s,S=_2(e)|0,e=t[S+4>>2]|0,t[D>>2]=t[S>>2],t[D+4>>2]=e,t[h>>2]=t[D>>2],t[h+4>>2]=t[D+4>>2],Th(n,h,r,u,l),m=s}function _2(e){return e=e|0,(t[(t1()|0)+24>>2]|0)+(e*12|0)|0}function Th(e,n,r,u,l){e=e|0,n=n|0,r=+r,u=+u,l=l|0;var s=0,h=0,D=0,S=0,M=0;M=m,m=m+16|0,h=M+2|0,D=M+1|0,S=M,s=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(s=t[(t[e>>2]|0)+s>>2]|0),Ol(h,r),r=+es(h,r),Ol(D,u),u=+es(D,u),Ds(S,l),S=zs(S,l)|0,Z8[s&1](e,r,u,S),m=M}function Ol(e,n){e=e|0,n=+n}function es(e,n){return e=e|0,n=+n,+ +Ch(n)}function Ds(e,n){e=e|0,n=n|0}function zs(e,n){return e=e|0,n=n|0,Pd(n)|0}function Pd(e){return e=e|0,e|0}function Ch(e){return e=+e,+e}function Id(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],Bd(e,r,l,1),m=u}function Bd(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=u1()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=o1(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,xh(s,u)|0,u),m=l}function u1(){var e=0,n=0;if(p[7648]|0||(l1(9268),Ht(27,9268,he|0)|0,n=7648,t[n>>2]=1,t[n+4>>2]=0),!(rr(9268)|0)){e=9268,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));l1(9268)}return 9268}function o1(e){return e=e|0,0}function xh(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=u1()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],Ud(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(jd(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function Ud(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function jd(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=ws(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,Va(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],Ud(s,u,r),t[S>>2]=(t[S>>2]|0)+12,Ah(e,D),uu(D),m=M;return}}function ws(e){return e=e|0,357913941}function Va(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function Ah(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function uu(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function l1(e){e=e|0,kl(e)}function Rh(e){e=e|0,s1(e+24|0)}function s1(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function kl(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,4,n,Oh()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Oh(){return 1160}function zd(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0;return r=m,m=m+16|0,u=r+8|0,l=r,s=kh(e)|0,e=t[s+4>>2]|0,t[l>>2]=t[s>>2],t[l+4>>2]=e,t[u>>2]=t[l>>2],t[u+4>>2]=t[l+4>>2],n=a1(n,u)|0,m=r,n|0}function kh(e){return e=e|0,(t[(u1()|0)+24>>2]|0)+(e*12|0)|0}function a1(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),Ml(Xp[r&31](e)|0)|0}function Ml(e){return e=e|0,e&1|0}function Ga(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],ha(e,r,l,0),m=u}function ha(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=qd()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=Hd(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,Em(s,u)|0,u),m=l}function qd(){var e=0,n=0;if(p[7656]|0||(Lh(9304),Ht(28,9304,he|0)|0,n=7656,t[n>>2]=1,t[n+4>>2]=0),!(rr(9304)|0)){e=9304,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Lh(9304)}return 9304}function Hd(e){return e=e|0,0}function Em(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=qd()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],Wd(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(Mh(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function Wd(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function Mh(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=Nh(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,Vd(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],Wd(s,u,r),t[S>>2]=(t[S>>2]|0)+12,Dm(e,D),wm(D),m=M;return}}function Nh(e){return e=e|0,357913941}function Vd(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function Dm(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function wm(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function Lh(e){e=e|0,f1(e)}function Sm(e){e=e|0,Gd(e+24|0)}function Gd(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function f1(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,5,n,c1()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function c1(){return 1164}function d1(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;u=m,m=m+16|0,l=u+8|0,s=u,h=va(e)|0,e=t[h+4>>2]|0,t[s>>2]=t[h>>2],t[s+4>>2]=e,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],Yd(n,l,r),m=u}function va(e){return e=e|0,(t[(qd()|0)+24>>2]|0)+(e*12|0)|0}function Yd(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0;s=m,m=m+16|0,l=s,u=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(u=t[(t[e>>2]|0)+u>>2]|0),qs(l,r),r=Hs(l,r)|0,N1[u&31](e,r),Ws(l),m=s}function qs(e,n){e=e|0,n=n|0,Kd(e,n)}function Hs(e,n){return e=e|0,n=n|0,e|0}function Ws(e){e=e|0,ia(e)}function Kd(e,n){e=e|0,n=n|0,ma(e,n)}function ma(e,n){e=e|0,n=n|0,t[e>>2]=n}function p1(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],E2(e,r,l,0),m=u}function E2(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=gc()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=Xd(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,_o(s,u)|0,u),m=l}function gc(){var e=0,n=0;if(p[7664]|0||(Uh(9340),Ht(29,9340,he|0)|0,n=7664,t[n>>2]=1,t[n+4>>2]=0),!(rr(9340)|0)){e=9340,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Uh(9340)}return 9340}function Xd(e){return e=e|0,0}function _o(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=gc()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],Fh(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(bh(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function Fh(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function bh(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=Ph(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,Ih(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],Fh(s,u,r),t[S>>2]=(t[S>>2]|0)+12,Tm(e,D),Bh(D),m=M;return}}function Ph(e){return e=e|0,357913941}function Ih(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function Tm(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function Bh(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function Uh(e){e=e|0,jh(e)}function h1(e){e=e|0,Qd(e+24|0)}function Qd(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function jh(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,4,n,Jd()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Jd(){return 1180}function zh(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=Cm(e)|0,e=t[h+4>>2]|0,t[s>>2]=t[h>>2],t[s+4>>2]=e,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],r=xm(n,l,r)|0,m=u,r|0}function Cm(e){return e=e|0,(t[(gc()|0)+24>>2]|0)+(e*12|0)|0}function xm(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0;return s=m,m=m+16|0,l=s,u=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(u=t[(t[e>>2]|0)+u>>2]|0),Of(l,r),l=kf(l,r)|0,l=D2(ZE[u&15](e,l)|0)|0,m=s,l|0}function Of(e,n){e=e|0,n=n|0}function kf(e,n){return e=e|0,n=n|0,Am(n)|0}function D2(e){return e=e|0,e|0}function Am(e){return e=e|0,e|0}function Zd(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],w2(e,r,l,0),m=u}function w2(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=$d()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=qh(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,ep(s,u)|0,u),m=l}function $d(){var e=0,n=0;if(p[7672]|0||(Vh(9376),Ht(30,9376,he|0)|0,n=7672,t[n>>2]=1,t[n+4>>2]=0),!(rr(9376)|0)){e=9376,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Vh(9376)}return 9376}function qh(e){return e=e|0,0}function ep(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=$d()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],Hh(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(Wh(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function Hh(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function Wh(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=tp(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,Rm(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],Hh(s,u,r),t[S>>2]=(t[S>>2]|0)+12,Om(e,D),km(D),m=M;return}}function tp(e){return e=e|0,357913941}function Rm(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function Om(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function km(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function Vh(e){e=e|0,np(e)}function v1(e){e=e|0,Mm(e+24|0)}function Mm(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function np(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,5,n,rp()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function rp(){return 1196}function Nm(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0;return r=m,m=m+16|0,u=r+8|0,l=r,s=Lm(e)|0,e=t[s+4>>2]|0,t[l>>2]=t[s>>2],t[l+4>>2]=e,t[u>>2]=t[l>>2],t[u+4>>2]=t[l+4>>2],n=Gh(n,u)|0,m=r,n|0}function Lm(e){return e=e|0,(t[($d()|0)+24>>2]|0)+(e*12|0)|0}function Gh(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),D2(Xp[r&31](e)|0)|0}function Fm(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],bm(e,r,l,1),m=u}function bm(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=ip()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=up(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,ya(s,u)|0,u),m=l}function ip(){var e=0,n=0;if(p[7680]|0||(lp(9412),Ht(31,9412,he|0)|0,n=7680,t[n>>2]=1,t[n+4>>2]=0),!(rr(9412)|0)){e=9412,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));lp(9412)}return 9412}function up(e){return e=e|0,0}function ya(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=ip()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],m1(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(op(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function m1(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function op(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=Yh(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,S2(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],m1(s,u,r),t[S>>2]=(t[S>>2]|0)+12,y1(e,D),Kh(D),m=M;return}}function Yh(e){return e=e|0,357913941}function S2(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function y1(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function Kh(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function lp(e){e=e|0,Qh(e)}function Xh(e){e=e|0,sp(e+24|0)}function sp(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function Qh(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,6,n,Jh()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Jh(){return 1200}function ap(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0;return r=m,m=m+16|0,u=r+8|0,l=r,s=T2(e)|0,e=t[s+4>>2]|0,t[l>>2]=t[s>>2],t[l+4>>2]=e,t[u>>2]=t[l>>2],t[u+4>>2]=t[l+4>>2],n=C2(n,u)|0,m=r,n|0}function T2(e){return e=e|0,(t[(ip()|0)+24>>2]|0)+(e*12|0)|0}function C2(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),z0(Xp[r&31](e)|0)|0}function z0(e){return e=e|0,e|0}function x2(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],ga(e,r,l,0),m=u}function ga(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=Ya()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=A2(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,R2(s,u)|0,u),m=l}function Ya(){var e=0,n=0;if(p[7688]|0||(dp(9448),Ht(32,9448,he|0)|0,n=7688,t[n>>2]=1,t[n+4>>2]=0),!(rr(9448)|0)){e=9448,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));dp(9448)}return 9448}function A2(e){return e=e|0,0}function R2(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=Ya()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],fp(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(O2(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function fp(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function O2(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=Zh(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,Pm(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],fp(s,u,r),t[S>>2]=(t[S>>2]|0)+12,$h(e,D),cp(D),m=M;return}}function Zh(e){return e=e|0,357913941}function Pm(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function $h(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function cp(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function dp(e){e=e|0,Bm(e)}function pp(e){e=e|0,Im(e+24|0)}function Im(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function Bm(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,6,n,Eo()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Eo(){return 1204}function k2(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;u=m,m=m+16|0,l=u+8|0,s=u,h=Um(e)|0,e=t[h+4>>2]|0,t[s>>2]=t[h>>2],t[s+4>>2]=e,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],sl(n,l,r),m=u}function Um(e){return e=e|0,(t[(Ya()|0)+24>>2]|0)+(e*12|0)|0}function sl(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0;s=m,m=m+16|0,l=s,u=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(u=t[(t[e>>2]|0)+u>>2]|0),Jn(l,r),l=Vs(l,r)|0,N1[u&31](e,l),m=s}function Jn(e,n){e=e|0,n=n|0}function Vs(e,n){return e=e|0,n=n|0,al(n)|0}function al(e){return e=e|0,e|0}function n0(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],ev(e,r,l,0),m=u}function ev(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=Gs()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=hp(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,jm(s,u)|0,u),m=l}function Gs(){var e=0,n=0;if(p[7696]|0||(yp(9484),Ht(33,9484,he|0)|0,n=7696,t[n>>2]=1,t[n+4>>2]=0),!(rr(9484)|0)){e=9484,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));yp(9484)}return 9484}function hp(e){return e=e|0,0}function jm(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=Gs()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],tv(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(vp(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function tv(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function vp(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=zm(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,mp(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],tv(s,u,r),t[S>>2]=(t[S>>2]|0)+12,_c(e,D),Ea(D),m=M;return}}function zm(e){return e=e|0,357913941}function mp(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function _c(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function Ea(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function yp(e){e=e|0,zu(e)}function M2(e){e=e|0,ku(e+24|0)}function ku(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function zu(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,1,n,gp()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function gp(){return 1212}function _p(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0;l=m,m=m+16|0,s=l+8|0,h=l,D=nv(e)|0,e=t[D+4>>2]|0,t[h>>2]=t[D>>2],t[h+4>>2]=e,t[s>>2]=t[h>>2],t[s+4>>2]=t[h+4>>2],qm(n,s,r,u),m=l}function nv(e){return e=e|0,(t[(Gs()|0)+24>>2]|0)+(e*12|0)|0}function qm(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0;D=m,m=m+16|0,s=D+1|0,h=D,l=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(l=t[(t[e>>2]|0)+l>>2]|0),Jn(s,r),s=Vs(s,r)|0,Of(h,u),h=kf(h,u)|0,jy[l&15](e,s,h),m=D}function Hm(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],Wm(e,r,l,1),m=u}function Wm(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=N2()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=rv(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,Ec(s,u)|0,u),m=l}function N2(){var e=0,n=0;if(p[7704]|0||(iv(9520),Ht(34,9520,he|0)|0,n=7704,t[n>>2]=1,t[n+4>>2]=0),!(rr(9520)|0)){e=9520,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));iv(9520)}return 9520}function rv(e){return e=e|0,0}function Ec(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=N2()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],g1(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(Vm(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function g1(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function Vm(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=L2(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,_1(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],g1(s,u,r),t[S>>2]=(t[S>>2]|0)+12,Nl(e,D),Da(D),m=M;return}}function L2(e){return e=e|0,357913941}function _1(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function Nl(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function Da(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function iv(e){e=e|0,ov(e)}function Gm(e){e=e|0,uv(e+24|0)}function uv(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function ov(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,1,n,Ym()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Ym(){return 1224}function lv(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;return l=m,m=m+16|0,s=l+8|0,h=l,D=wa(e)|0,e=t[D+4>>2]|0,t[h>>2]=t[D>>2],t[h+4>>2]=e,t[s>>2]=t[h>>2],t[s+4>>2]=t[h+4>>2],u=+Cr(n,s,r),m=l,+u}function wa(e){return e=e|0,(t[(N2()|0)+24>>2]|0)+(e*12|0)|0}function Cr(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return s=m,m=m+16|0,l=s,u=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(u=t[(t[e>>2]|0)+u>>2]|0),Ds(l,r),l=zs(l,r)|0,h=+ja(+eS[u&7](e,l)),m=s,+h}function Ep(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],fl(e,r,l,1),m=u}function fl(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=cu()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=E1(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,ki(s,u)|0,u),m=l}function cu(){var e=0,n=0;if(p[7712]|0||(wp(9556),Ht(35,9556,he|0)|0,n=7712,t[n>>2]=1,t[n+4>>2]=0),!(rr(9556)|0)){e=9556,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));wp(9556)}return 9556}function E1(e){return e=e|0,0}function ki(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=cu()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],Dp(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(F2(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function Dp(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function F2(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=Do(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,Ss(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],Dp(s,u,r),t[S>>2]=(t[S>>2]|0)+12,Mf(e,D),b2(D),m=M;return}}function Do(e){return e=e|0,357913941}function Ss(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function Mf(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function b2(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function wp(e){e=e|0,Sp(e)}function D1(e){e=e|0,w1(e+24|0)}function w1(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function Sp(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,5,n,Zn()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Zn(){return 1232}function cl(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=qn(e)|0,e=t[h+4>>2]|0,t[s>>2]=t[h>>2],t[s+4>>2]=e,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],r=+q0(n,l),m=u,+r}function qn(e){return e=e|0,(t[(cu()|0)+24>>2]|0)+(e*12|0)|0}function q0(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),+ +ja(+$8[r&15](e))}function k0(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],P2(e,r,l,1),m=u}function P2(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=Ll()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=S1(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,Dc(s,u)|0,u),m=l}function Ll(){var e=0,n=0;if(p[7720]|0||(U2(9592),Ht(36,9592,he|0)|0,n=7720,t[n>>2]=1,t[n+4>>2]=0),!(rr(9592)|0)){e=9592,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));U2(9592)}return 9592}function S1(e){return e=e|0,0}function Dc(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=Ll()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],wc(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(I2(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function wc(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function I2(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=Tp(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,M0(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],wc(s,u,r),t[S>>2]=(t[S>>2]|0)+12,fn(e,D),B2(D),m=M;return}}function Tp(e){return e=e|0,357913941}function M0(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function fn(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function B2(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function U2(e){e=e|0,Cc(e)}function Sc(e){e=e|0,Tc(e+24|0)}function Tc(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function Cc(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,7,n,T1()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function T1(){return 1276}function Cp(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0;return r=m,m=m+16|0,u=r+8|0,l=r,s=Ka(e)|0,e=t[s+4>>2]|0,t[l>>2]=t[s>>2],t[l+4>>2]=e,t[u>>2]=t[l>>2],t[u+4>>2]=t[l+4>>2],n=Km(n,u)|0,m=r,n|0}function Ka(e){return e=e|0,(t[(Ll()|0)+24>>2]|0)+(e*12|0)|0}function Km(e,n){e=e|0,n=n|0;var r=0,u=0,l=0;return l=m,m=m+16|0,u=l,r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),N1[r&31](u,e),u=xc(u)|0,m=l,u|0}function xc(e){e=e|0;var n=0,r=0,u=0,l=0;return l=m,m=m+32|0,n=l+12|0,r=l,u=Ou(j2()|0)|0,u?(Zl(n,u),Tf(r,n),sv(e,r),e=Es(n)|0):e=C1(e)|0,m=l,e|0}function j2(){var e=0;return p[7736]|0||(Uo(9640),Ht(25,9640,he|0)|0,e=7736,t[e>>2]=1,t[e+4>>2]=0),9640}function sv(e,n){e=e|0,n=n|0,Ac(n,e,e+8|0)|0}function C1(e){e=e|0;var n=0,r=0,u=0,l=0,s=0,h=0,D=0;return r=m,m=m+16|0,l=r+4|0,h=r,u=Sa(8)|0,n=u,D=cn(16)|0,t[D>>2]=t[e>>2],t[D+4>>2]=t[e+4>>2],t[D+8>>2]=t[e+8>>2],t[D+12>>2]=t[e+12>>2],s=n+4|0,t[s>>2]=D,e=cn(8)|0,s=t[s>>2]|0,t[h>>2]=0,t[l>>2]=t[h>>2],Nf(e,s,l),t[u>>2]=e,m=r,n|0}function Nf(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=cn(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1244,t[r+12>>2]=n,t[e+4>>2]=r}function Lf(e){e=e|0,Pv(e),yt(e)}function x1(e){e=e|0,e=t[e+12>>2]|0,e|0&&yt(e)}function Fl(e){e=e|0,yt(e)}function Ac(e,n,r){return e=e|0,n=n|0,r=r|0,n=Ff(t[e>>2]|0,n,r)|0,r=e+4|0,t[(t[r>>2]|0)+8>>2]=n,t[(t[r>>2]|0)+8>>2]|0}function Ff(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0;return u=m,m=m+16|0,l=u,Ta(l),e=vo(e)|0,r=Xm(e,t[n>>2]|0,+U[r>>3])|0,Ca(l),m=u,r|0}function Xm(e,n,r){e=e|0,n=n|0,r=+r;var u=0;return u=mo(dl()|0)|0,n=u2(n)|0,Pr(0,u|0,e|0,n|0,+ +Cl(r))|0}function dl(){var e=0;return p[7728]|0||(z2(9628),e=7728,t[e>>2]=1,t[e+4>>2]=0),9628}function z2(e){e=e|0,nl(e,q2()|0,2)}function q2(){return 1264}function Uo(e){e=e|0,Ha(e)}function H2(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],Qm(e,r,l,1),m=u}function Qm(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=A1()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=Jm(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,Zm(s,u)|0,u),m=l}function A1(){var e=0,n=0;if(p[7744]|0||(cv(9684),Ht(37,9684,he|0)|0,n=7744,t[n>>2]=1,t[n+4>>2]=0),!(rr(9684)|0)){e=9684,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));cv(9684)}return 9684}function Jm(e){return e=e|0,0}function Zm(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=A1()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],av(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):($m(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function av(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function $m(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=fv(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,ey(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],av(s,u,r),t[S>>2]=(t[S>>2]|0)+12,ty(e,D),ny(D),m=M;return}}function fv(e){return e=e|0,357913941}function ey(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function ty(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function ny(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function cv(e){e=e|0,iy(e)}function ry(e){e=e|0,xp(e+24|0)}function xp(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function iy(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,5,n,bf()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function bf(){return 1280}function dv(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=pv(e)|0,e=t[h+4>>2]|0,t[s>>2]=t[h>>2],t[s+4>>2]=e,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],r=hv(n,l,r)|0,m=u,r|0}function pv(e){return e=e|0,(t[(A1()|0)+24>>2]|0)+(e*12|0)|0}function hv(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return h=m,m=m+32|0,l=h,s=h+16|0,u=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(u=t[(t[e>>2]|0)+u>>2]|0),Ds(s,r),s=zs(s,r)|0,jy[u&15](l,e,s),s=xc(l)|0,m=h,s|0}function W2(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],V2(e,r,l,1),m=u}function V2(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=Ap()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=vv(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,G2(s,u)|0,u),m=l}function Ap(){var e=0,n=0;if(p[7752]|0||(Ev(9720),Ht(38,9720,he|0)|0,n=7752,t[n>>2]=1,t[n+4>>2]=0),!(rr(9720)|0)){e=9720,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Ev(9720)}return 9720}function vv(e){return e=e|0,0}function G2(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=Ap()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],mv(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(yv(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function mv(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function yv(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=Rp(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,gv(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],mv(s,u,r),t[S>>2]=(t[S>>2]|0)+12,_v(e,D),uy(D),m=M;return}}function Rp(e){return e=e|0,357913941}function gv(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function _v(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function uy(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function Ev(e){e=e|0,Dv(e)}function oy(e){e=e|0,Y2(e+24|0)}function Y2(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function Dv(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,8,n,Op()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Op(){return 1288}function ly(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0;return r=m,m=m+16|0,u=r+8|0,l=r,s=r0(e)|0,e=t[s+4>>2]|0,t[l>>2]=t[s>>2],t[l+4>>2]=e,t[u>>2]=t[l>>2],t[u+4>>2]=t[l+4>>2],n=kp(n,u)|0,m=r,n|0}function r0(e){return e=e|0,(t[(Ap()|0)+24>>2]|0)+(e*12|0)|0}function kp(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),s2(Xp[r&31](e)|0)|0}function sy(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],ay(e,r,l,0),m=u}function ay(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=Mp()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=Xa(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,Np(s,u)|0,u),m=l}function Mp(){var e=0,n=0;if(p[7760]|0||(bp(9756),Ht(39,9756,he|0)|0,n=7760,t[n>>2]=1,t[n+4>>2]=0),!(rr(9756)|0)){e=9756,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));bp(9756)}return 9756}function Xa(e){return e=e|0,0}function Np(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=Mp()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],Lp(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(Fp(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function Lp(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function Fp(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=fy(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,cy(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],Lp(s,u,r),t[S>>2]=(t[S>>2]|0)+12,wv(e,D),Pf(D),m=M;return}}function fy(e){return e=e|0,357913941}function cy(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function wv(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function Pf(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function bp(e){e=e|0,py(e)}function Sv(e){e=e|0,dy(e+24|0)}function dy(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function py(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,8,n,Pp()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Pp(){return 1292}function Ip(e,n,r){e=e|0,n=n|0,r=+r;var u=0,l=0,s=0,h=0;u=m,m=m+16|0,l=u+8|0,s=u,h=hy(e)|0,e=t[h+4>>2]|0,t[s>>2]=t[h>>2],t[s+4>>2]=e,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],vy(n,l,r),m=u}function hy(e){return e=e|0,(t[(Mp()|0)+24>>2]|0)+(e*12|0)|0}function vy(e,n,r){e=e|0,n=n|0,r=+r;var u=0,l=0,s=0;s=m,m=m+16|0,l=s,u=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(u=t[(t[e>>2]|0)+u>>2]|0),Ol(l,r),r=+es(l,r),Q8[u&31](e,r),m=s}function Tv(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],Bp(e,r,l,0),m=u}function Bp(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=Up()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=K2(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,my(s,u)|0,u),m=l}function Up(){var e=0,n=0;if(p[7768]|0||(jp(9792),Ht(40,9792,he|0)|0,n=7768,t[n>>2]=1,t[n+4>>2]=0),!(rr(9792)|0)){e=9792,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));jp(9792)}return 9792}function K2(e){return e=e|0,0}function my(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=Up()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],R1(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(yy(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function R1(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function yy(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=Cv(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,xv(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],R1(s,u,r),t[S>>2]=(t[S>>2]|0)+12,gy(e,D),If(D),m=M;return}}function Cv(e){return e=e|0,357913941}function xv(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function gy(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function If(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function jp(e){e=e|0,Ey(e)}function Av(e){e=e|0,_y(e+24|0)}function _y(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function Ey(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,1,n,zp()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function zp(){return 1300}function Dy(e,n,r,u){e=e|0,n=n|0,r=r|0,u=+u;var l=0,s=0,h=0,D=0;l=m,m=m+16|0,s=l+8|0,h=l,D=Ys(e)|0,e=t[D+4>>2]|0,t[h>>2]=t[D>>2],t[h+4>>2]=e,t[s>>2]=t[h>>2],t[s+4>>2]=t[h+4>>2],wy(n,s,r,u),m=l}function Ys(e){return e=e|0,(t[(Up()|0)+24>>2]|0)+(e*12|0)|0}function wy(e,n,r,u){e=e|0,n=n|0,r=r|0,u=+u;var l=0,s=0,h=0,D=0;D=m,m=m+16|0,s=D+1|0,h=D,l=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(l=t[(t[e>>2]|0)+l>>2]|0),Ds(s,r),s=zs(s,r)|0,Ol(h,u),u=+es(h,u),iS[l&15](e,s,u),m=D}function d(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],v(e,r,l,0),m=u}function v(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=x()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=b(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,H(s,u)|0,u),m=l}function x(){var e=0,n=0;if(p[7776]|0||(Rt(9828),Ht(41,9828,he|0)|0,n=7776,t[n>>2]=1,t[n+4>>2]=0),!(rr(9828)|0)){e=9828,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Rt(9828)}return 9828}function b(e){return e=e|0,0}function H(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=x()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],ee(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(de(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function ee(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function de(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=ye(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,be(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],ee(s,u,r),t[S>>2]=(t[S>>2]|0)+12,gt(e,D),Dt(D),m=M;return}}function ye(e){return e=e|0,357913941}function be(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function gt(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function Dt(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function Rt(e){e=e|0,$n(e)}function rn(e){e=e|0,Rn(e+24|0)}function Rn(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function $n(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,7,n,Nr()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Nr(){return 1312}function ir(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;u=m,m=m+16|0,l=u+8|0,s=u,h=Zr(e)|0,e=t[h+4>>2]|0,t[s>>2]=t[h>>2],t[s+4>>2]=e,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],ui(n,l,r),m=u}function Zr(e){return e=e|0,(t[(x()|0)+24>>2]|0)+(e*12|0)|0}function ui(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0;s=m,m=m+16|0,l=s,u=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(u=t[(t[e>>2]|0)+u>>2]|0),Ds(l,r),l=zs(l,r)|0,N1[u&31](e,l),m=s}function bl(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],Wi(e,r,l,0),m=u}function Wi(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=uo()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=i0(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,Ts(s,u)|0,u),m=l}function uo(){var e=0,n=0;if(p[7784]|0||(r_(9864),Ht(42,9864,he|0)|0,n=7784,t[n>>2]=1,t[n+4>>2]=0),!(rr(9864)|0)){e=9864,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));r_(9864)}return 9864}function i0(e){return e=e|0,0}function Ts(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=uo()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],wo(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(Rv(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function wo(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function Rv(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=X4(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,Sy(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],wo(s,u,r),t[S>>2]=(t[S>>2]|0)+12,Ty(e,D),Qa(D),m=M;return}}function X4(e){return e=e|0,357913941}function Sy(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function Ty(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function Qa(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function r_(e){e=e|0,Z4(e)}function Q4(e){e=e|0,J4(e+24|0)}function J4(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function Z4(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,8,n,$4()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function $4(){return 1320}function Cy(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;u=m,m=m+16|0,l=u+8|0,s=u,h=eE(e)|0,e=t[h+4>>2]|0,t[s>>2]=t[h>>2],t[s+4>>2]=e,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],tE(n,l,r),m=u}function eE(e){return e=e|0,(t[(uo()|0)+24>>2]|0)+(e*12|0)|0}function tE(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0;s=m,m=m+16|0,l=s,u=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(u=t[(t[e>>2]|0)+u>>2]|0),xy(l,r),l=i_(l,r)|0,N1[u&31](e,l),m=s}function xy(e,n){e=e|0,n=n|0}function i_(e,n){return e=e|0,n=n|0,nE(n)|0}function nE(e){return e=e|0,e|0}function rE(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],u_(e,r,l,0),m=u}function u_(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=Bf()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=o_(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,iE(s,u)|0,u),m=l}function Bf(){var e=0,n=0;if(p[7792]|0||(Oy(9900),Ht(43,9900,he|0)|0,n=7792,t[n>>2]=1,t[n+4>>2]=0),!(rr(9900)|0)){e=9900,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Oy(9900)}return 9900}function o_(e){return e=e|0,0}function iE(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=Bf()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],qp(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(uE(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function qp(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function uE(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=Ov(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,Ay(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],qp(s,u,r),t[S>>2]=(t[S>>2]|0)+12,Ry(e,D),oE(D),m=M;return}}function Ov(e){return e=e|0,357913941}function Ay(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function Ry(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function oE(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function Oy(e){e=e|0,l_(e)}function lE(e){e=e|0,sE(e+24|0)}function sE(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function l_(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,22,n,aE()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function aE(){return 1344}function fE(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0;r=m,m=m+16|0,u=r+8|0,l=r,s=s_(e)|0,e=t[s+4>>2]|0,t[l>>2]=t[s>>2],t[l+4>>2]=e,t[u>>2]=t[l>>2],t[u+4>>2]=t[l+4>>2],kv(n,u),m=r}function s_(e){return e=e|0,(t[(Bf()|0)+24>>2]|0)+(e*12|0)|0}function kv(e,n){e=e|0,n=n|0;var r=0;r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),M1[r&127](e)}function cE(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0;s=t[e>>2]|0,l=ky()|0,e=dE(r)|0,vi(s,n,l,e,pE(r,u)|0,u)}function ky(){var e=0,n=0;if(p[7800]|0||(Ny(9936),Ht(44,9936,he|0)|0,n=7800,t[n>>2]=1,t[n+4>>2]=0),!(rr(9936)|0)){e=9936,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Ny(9936)}return 9936}function dE(e){return e=e|0,e|0}function pE(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0;return D=m,m=m+16|0,l=D,s=D+4|0,t[l>>2]=e,S=ky()|0,h=S+24|0,n=dn(n,4)|0,t[s>>2]=n,r=S+28|0,u=t[r>>2]|0,u>>>0<(t[S+32>>2]|0)>>>0?(My(u,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(a_(h,l,s),n=t[r>>2]|0),m=D,(n-(t[h>>2]|0)>>3)+-1|0}function My(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function a_(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0;if(D=m,m=m+32|0,l=D,s=e+4|0,h=((t[s>>2]|0)-(t[e>>2]|0)>>3)+1|0,u=f_(e)|0,u>>>0>>0)li(e);else{S=t[e>>2]|0,O=(t[e+8>>2]|0)-S|0,M=O>>2,c_(l,O>>3>>>0>>1>>>0?M>>>0>>0?h:M:u,(t[s>>2]|0)-S>>3,e+8|0),h=l+8|0,My(t[h>>2]|0,t[n>>2]|0,t[r>>2]|0),t[h>>2]=(t[h>>2]|0)+8,d_(e,l),p_(l),m=D;return}}function f_(e){return e=e|0,536870911}function c_(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>536870911)Xn();else{l=cn(n<<3)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r<<3)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n<<3)}function d_(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(0-(l>>3)<<3)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function p_(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~((u+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&yt(e)}function Ny(e){e=e|0,v_(e)}function h_(e){e=e|0,hE(e+24|0)}function hE(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-u|0)>>>3)<<3)),yt(r))}function v_(e){e=e|0;var n=0;n=dr()|0,Pn(e,1,23,n,Eo()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function vE(e,n){e=e|0,n=n|0,a(t[(mE(e)|0)>>2]|0,n)}function mE(e){return e=e|0,(t[(ky()|0)+24>>2]|0)+(e<<3)|0}function a(e,n){e=e|0,n=n|0;var r=0,u=0;r=m,m=m+16|0,u=r,Jn(u,n),n=Vs(u,n)|0,M1[e&127](n),m=r}function c(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0;s=t[e>>2]|0,l=_()|0,e=T(r)|0,vi(s,n,l,e,R(r,u)|0,u)}function _(){var e=0,n=0;if(p[7808]|0||(pt(9972),Ht(45,9972,he|0)|0,n=7808,t[n>>2]=1,t[n+4>>2]=0),!(rr(9972)|0)){e=9972,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));pt(9972)}return 9972}function T(e){return e=e|0,e|0}function R(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0;return D=m,m=m+16|0,l=D,s=D+4|0,t[l>>2]=e,S=_()|0,h=S+24|0,n=dn(n,4)|0,t[s>>2]=n,r=S+28|0,u=t[r>>2]|0,u>>>0<(t[S+32>>2]|0)>>>0?(j(u,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(V(h,l,s),n=t[r>>2]|0),m=D,(n-(t[h>>2]|0)>>3)+-1|0}function j(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function V(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0;if(D=m,m=m+32|0,l=D,s=e+4|0,h=((t[s>>2]|0)-(t[e>>2]|0)>>3)+1|0,u=te(e)|0,u>>>0>>0)li(e);else{S=t[e>>2]|0,O=(t[e+8>>2]|0)-S|0,M=O>>2,oe(l,O>>3>>>0>>1>>>0?M>>>0>>0?h:M:u,(t[s>>2]|0)-S>>3,e+8|0),h=l+8|0,j(t[h>>2]|0,t[n>>2]|0,t[r>>2]|0),t[h>>2]=(t[h>>2]|0)+8,Ie(e,l),Ye(l),m=D;return}}function te(e){return e=e|0,536870911}function oe(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>536870911)Xn();else{l=cn(n<<3)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r<<3)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n<<3)}function Ie(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(0-(l>>3)<<3)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function Ye(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~((u+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&yt(e)}function pt(e){e=e|0,zt(e)}function Nt(e){e=e|0,Vt(e+24|0)}function Vt(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-u|0)>>>3)<<3)),yt(r))}function zt(e){e=e|0;var n=0;n=dr()|0,Pn(e,1,9,n,vn()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function vn(){return 1348}function xr(e,n){return e=e|0,n=n|0,wi(t[($r(e)|0)>>2]|0,n)|0}function $r(e){return e=e|0,(t[(_()|0)+24>>2]|0)+(e<<3)|0}function wi(e,n){e=e|0,n=n|0;var r=0,u=0;return r=m,m=m+16|0,u=r,N0(u,n),n=Vi(u,n)|0,n=D2(Xp[e&31](n)|0)|0,m=r,n|0}function N0(e,n){e=e|0,n=n|0}function Vi(e,n){return e=e|0,n=n|0,it(n)|0}function it(e){return e=e|0,e|0}function Ot(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0;s=t[e>>2]|0,l=Je()|0,e=Bt(r)|0,vi(s,n,l,e,Mn(r,u)|0,u)}function Je(){var e=0,n=0;if(p[7816]|0||(qr(10008),Ht(46,10008,he|0)|0,n=7816,t[n>>2]=1,t[n+4>>2]=0),!(rr(10008)|0)){e=10008,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));qr(10008)}return 10008}function Bt(e){return e=e|0,e|0}function Mn(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0;return D=m,m=m+16|0,l=D,s=D+4|0,t[l>>2]=e,S=Je()|0,h=S+24|0,n=dn(n,4)|0,t[s>>2]=n,r=S+28|0,u=t[r>>2]|0,u>>>0<(t[S+32>>2]|0)>>>0?(pn(u,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(Pi(h,l,s),n=t[r>>2]|0),m=D,(n-(t[h>>2]|0)>>3)+-1|0}function pn(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function Pi(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0;if(D=m,m=m+32|0,l=D,s=e+4|0,h=((t[s>>2]|0)-(t[e>>2]|0)>>3)+1|0,u=oi(e)|0,u>>>0>>0)li(e);else{S=t[e>>2]|0,O=(t[e+8>>2]|0)-S|0,M=O>>2,qu(l,O>>3>>>0>>1>>>0?M>>>0>>0?h:M:u,(t[s>>2]|0)-S>>3,e+8|0),h=l+8|0,pn(t[h>>2]|0,t[n>>2]|0,t[r>>2]|0),t[h>>2]=(t[h>>2]|0)+8,ar(e,l),ou(l),m=D;return}}function oi(e){return e=e|0,536870911}function qu(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>536870911)Xn();else{l=cn(n<<3)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r<<3)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n<<3)}function ar(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(0-(l>>3)<<3)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function ou(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~((u+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&yt(e)}function qr(e){e=e|0,H0(e)}function _u(e){e=e|0,_0(e+24|0)}function _0(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-u|0)>>>3)<<3)),yt(r))}function H0(e){e=e|0;var n=0;n=dr()|0,Pn(e,1,15,n,rp()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Cs(e){return e=e|0,pl(t[(Hu(e)|0)>>2]|0)|0}function Hu(e){return e=e|0,(t[(Je()|0)+24>>2]|0)+(e<<3)|0}function pl(e){return e=e|0,D2(N_[e&7]()|0)|0}function Ja(){var e=0;return p[7832]|0||(y_(10052),Ht(25,10052,he|0)|0,e=7832,t[e>>2]=1,t[e+4>>2]=0),10052}function jo(e,n){e=e|0,n=n|0,t[e>>2]=xs()|0,t[e+4>>2]=X2()|0,t[e+12>>2]=n,t[e+8>>2]=Uf()|0,t[e+32>>2]=2}function xs(){return 11709}function X2(){return 1188}function Uf(){return O1()|0}function Rc(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0,(Pl(u,896)|0)==512?r|0&&(zo(r),yt(r)):n|0&&(ms(n),yt(n))}function Pl(e,n){return e=e|0,n=n|0,n&e|0}function zo(e){e=e|0,e=t[e+4>>2]|0,e|0&&J2(e)}function O1(){var e=0;return p[7824]|0||(t[2511]=m_()|0,t[2512]=0,e=7824,t[e>>2]=1,t[e+4>>2]=0),10044}function m_(){return 0}function y_(e){e=e|0,Ha(e)}function yE(e){e=e|0;var n=0,r=0,u=0,l=0,s=0;n=m,m=m+32|0,r=n+24|0,s=n+16|0,l=n+8|0,u=n,g_(e,4827),gE(e,4834,3)|0,_E(e,3682,47)|0,t[s>>2]=9,t[s+4>>2]=0,t[r>>2]=t[s>>2],t[r+4>>2]=t[s+4>>2],Ly(e,4841,r)|0,t[l>>2]=1,t[l+4>>2]=0,t[r>>2]=t[l>>2],t[r+4>>2]=t[l+4>>2],__(e,4871,r)|0,t[u>>2]=10,t[u+4>>2]=0,t[r>>2]=t[u>>2],t[r+4>>2]=t[u+4>>2],EE(e,4891,r)|0,m=n}function g_(e,n){e=e|0,n=n|0;var r=0;r=Qk()|0,t[e>>2]=r,Jk(r,n),Q2(t[e>>2]|0)}function gE(e,n,r){return e=e|0,n=n|0,r=r|0,Fk(e,Or(n)|0,r,0),e|0}function _E(e,n,r){return e=e|0,n=n|0,r=r|0,_k(e,Or(n)|0,r,0),e|0}function Ly(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],ek(e,n,l),m=u,e|0}function __(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],bO(e,n,l),m=u,e|0}function EE(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=t[r+4>>2]|0,t[s>>2]=t[r>>2],t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],DE(e,n,l),m=u,e|0}function DE(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],wE(e,r,l,1),m=u}function wE(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=SE()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=DO(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,wO(s,u)|0,u),m=l}function SE(){var e=0,n=0;if(p[7840]|0||(L3(10100),Ht(48,10100,he|0)|0,n=7840,t[n>>2]=1,t[n+4>>2]=0),!(rr(10100)|0)){e=10100,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));L3(10100)}return 10100}function DO(e){return e=e|0,0}function wO(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=SE()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],N3(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(SO(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function N3(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function SO(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=TO(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,CO(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],N3(s,u,r),t[S>>2]=(t[S>>2]|0)+12,xO(e,D),AO(D),m=M;return}}function TO(e){return e=e|0,357913941}function CO(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function xO(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function AO(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function L3(e){e=e|0,kO(e)}function RO(e){e=e|0,OO(e+24|0)}function OO(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function kO(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,6,n,MO()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function MO(){return 1364}function NO(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;return u=m,m=m+16|0,l=u+8|0,s=u,h=LO(e)|0,e=t[h+4>>2]|0,t[s>>2]=t[h>>2],t[s+4>>2]=e,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],r=FO(n,l,r)|0,m=u,r|0}function LO(e){return e=e|0,(t[(SE()|0)+24>>2]|0)+(e*12|0)|0}function FO(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0;return s=m,m=m+16|0,l=s,u=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(u=t[(t[e>>2]|0)+u>>2]|0),Ds(l,r),l=zs(l,r)|0,l=Ml(ZE[u&15](e,l)|0)|0,m=s,l|0}function bO(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],PO(e,r,l,0),m=u}function PO(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=TE()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=IO(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,BO(s,u)|0,u),m=l}function TE(){var e=0,n=0;if(p[7848]|0||(b3(10136),Ht(49,10136,he|0)|0,n=7848,t[n>>2]=1,t[n+4>>2]=0),!(rr(10136)|0)){e=10136,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));b3(10136)}return 10136}function IO(e){return e=e|0,0}function BO(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=TE()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],F3(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(UO(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function F3(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function UO(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=jO(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,zO(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],F3(s,u,r),t[S>>2]=(t[S>>2]|0)+12,qO(e,D),HO(D),m=M;return}}function jO(e){return e=e|0,357913941}function zO(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function qO(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function HO(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function b3(e){e=e|0,GO(e)}function WO(e){e=e|0,VO(e+24|0)}function VO(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function GO(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,9,n,YO()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function YO(){return 1372}function KO(e,n,r){e=e|0,n=n|0,r=+r;var u=0,l=0,s=0,h=0;u=m,m=m+16|0,l=u+8|0,s=u,h=XO(e)|0,e=t[h+4>>2]|0,t[s>>2]=t[h>>2],t[s+4>>2]=e,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],QO(n,l,r),m=u}function XO(e){return e=e|0,(t[(TE()|0)+24>>2]|0)+(e*12|0)|0}function QO(e,n,r){e=e|0,n=n|0,r=+r;var u=0,l=0,s=0,h=St;s=m,m=m+16|0,l=s,u=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(u=t[(t[e>>2]|0)+u>>2]|0),JO(l,r),h=w(ZO(l,r)),X8[u&1](e,h),m=s}function JO(e,n){e=e|0,n=+n}function ZO(e,n){return e=e|0,n=+n,w($O(n))}function $O(e){return e=+e,w(e)}function ek(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,l=u+8|0,s=u,D=t[r>>2]|0,h=t[r+4>>2]|0,r=Or(n)|0,t[s>>2]=D,t[s+4>>2]=h,t[l>>2]=t[s>>2],t[l+4>>2]=t[s+4>>2],tk(e,r,l,0),m=u}function tk(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0,S=0,M=0,O=0;l=m,m=m+32|0,s=l+16|0,O=l+8|0,D=l,M=t[r>>2]|0,S=t[r+4>>2]|0,h=t[e>>2]|0,e=CE()|0,t[O>>2]=M,t[O+4>>2]=S,t[s>>2]=t[O>>2],t[s+4>>2]=t[O+4>>2],r=nk(s)|0,t[D>>2]=M,t[D+4>>2]=S,t[s>>2]=t[D>>2],t[s+4>>2]=t[D+4>>2],vi(h,n,e,r,rk(s,u)|0,u),m=l}function CE(){var e=0,n=0;if(p[7856]|0||(I3(10172),Ht(50,10172,he|0)|0,n=7856,t[n>>2]=1,t[n+4>>2]=0),!(rr(10172)|0)){e=10172,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));I3(10172)}return 10172}function nk(e){return e=e|0,0}function rk(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0;return O=m,m=m+32|0,l=O+24|0,h=O+16|0,D=O,S=O+8|0,s=t[e>>2]|0,u=t[e+4>>2]|0,t[D>>2]=s,t[D+4>>2]=u,P=CE()|0,M=P+24|0,e=dn(n,4)|0,t[S>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[h>>2]=s,t[h+4>>2]=u,t[l>>2]=t[h>>2],t[l+4>>2]=t[h+4>>2],P3(r,l,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(ik(M,D,S),e=t[n>>2]|0),m=O,((e-(t[M>>2]|0)|0)/12|0)+-1|0}function P3(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=u,t[e+8>>2]=r}function ik(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;if(M=m,m=m+48|0,u=M+32|0,h=M+24|0,D=M,S=e+4|0,l=(((t[S>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,s=uk(e)|0,s>>>0>>0)li(e);else{O=t[e>>2]|0,K=((t[e+8>>2]|0)-O|0)/12|0,P=K<<1,ok(D,K>>>0>>1>>>0?P>>>0>>0?l:P:s,((t[S>>2]|0)-O|0)/12|0,e+8|0),S=D+8|0,s=t[S>>2]|0,l=t[n+4>>2]|0,r=t[r>>2]|0,t[h>>2]=t[n>>2],t[h+4>>2]=l,t[u>>2]=t[h>>2],t[u+4>>2]=t[h+4>>2],P3(s,u,r),t[S>>2]=(t[S>>2]|0)+12,lk(e,D),sk(D),m=M;return}}function uk(e){return e=e|0,357913941}function ok(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>357913941)Xn();else{l=cn(n*12|0)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r*12|0)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n*12|0)}function lk(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(((l|0)/-12|0)*12|0)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function sk(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~(((u+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&yt(e)}function I3(e){e=e|0,ck(e)}function ak(e){e=e|0,fk(e+24|0)}function fk(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-u|0)>>>0)/12|0)*12|0)),yt(r))}function ck(e){e=e|0;var n=0;n=dr()|0,Pn(e,2,3,n,dk()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function dk(){return 1380}function pk(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0;l=m,m=m+16|0,s=l+8|0,h=l,D=hk(e)|0,e=t[D+4>>2]|0,t[h>>2]=t[D>>2],t[h+4>>2]=e,t[s>>2]=t[h>>2],t[s+4>>2]=t[h+4>>2],vk(n,s,r,u),m=l}function hk(e){return e=e|0,(t[(CE()|0)+24>>2]|0)+(e*12|0)|0}function vk(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0;D=m,m=m+16|0,s=D+1|0,h=D,l=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(l=t[(t[e>>2]|0)+l>>2]|0),Ds(s,r),s=zs(s,r)|0,mk(h,u),h=yk(h,u)|0,jy[l&15](e,s,h),m=D}function mk(e,n){e=e|0,n=n|0}function yk(e,n){return e=e|0,n=n|0,gk(n)|0}function gk(e){return e=e|0,(e|0)!=0|0}function _k(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0;s=t[e>>2]|0,l=xE()|0,e=Ek(r)|0,vi(s,n,l,e,Dk(r,u)|0,u)}function xE(){var e=0,n=0;if(p[7864]|0||(U3(10208),Ht(51,10208,he|0)|0,n=7864,t[n>>2]=1,t[n+4>>2]=0),!(rr(10208)|0)){e=10208,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));U3(10208)}return 10208}function Ek(e){return e=e|0,e|0}function Dk(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0;return D=m,m=m+16|0,l=D,s=D+4|0,t[l>>2]=e,S=xE()|0,h=S+24|0,n=dn(n,4)|0,t[s>>2]=n,r=S+28|0,u=t[r>>2]|0,u>>>0<(t[S+32>>2]|0)>>>0?(B3(u,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(wk(h,l,s),n=t[r>>2]|0),m=D,(n-(t[h>>2]|0)>>3)+-1|0}function B3(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function wk(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0;if(D=m,m=m+32|0,l=D,s=e+4|0,h=((t[s>>2]|0)-(t[e>>2]|0)>>3)+1|0,u=Sk(e)|0,u>>>0>>0)li(e);else{S=t[e>>2]|0,O=(t[e+8>>2]|0)-S|0,M=O>>2,Tk(l,O>>3>>>0>>1>>>0?M>>>0>>0?h:M:u,(t[s>>2]|0)-S>>3,e+8|0),h=l+8|0,B3(t[h>>2]|0,t[n>>2]|0,t[r>>2]|0),t[h>>2]=(t[h>>2]|0)+8,Ck(e,l),xk(l),m=D;return}}function Sk(e){return e=e|0,536870911}function Tk(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>536870911)Xn();else{l=cn(n<<3)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r<<3)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n<<3)}function Ck(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(0-(l>>3)<<3)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function xk(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~((u+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&yt(e)}function U3(e){e=e|0,Ok(e)}function Ak(e){e=e|0,Rk(e+24|0)}function Rk(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-u|0)>>>3)<<3)),yt(r))}function Ok(e){e=e|0;var n=0;n=dr()|0,Pn(e,1,24,n,kk()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function kk(){return 1392}function Mk(e,n){e=e|0,n=n|0,Lk(t[(Nk(e)|0)>>2]|0,n)}function Nk(e){return e=e|0,(t[(xE()|0)+24>>2]|0)+(e<<3)|0}function Lk(e,n){e=e|0,n=n|0;var r=0,u=0;r=m,m=m+16|0,u=r,N0(u,n),n=Vi(u,n)|0,M1[e&127](n),m=r}function Fk(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0;s=t[e>>2]|0,l=AE()|0,e=bk(r)|0,vi(s,n,l,e,Pk(r,u)|0,u)}function AE(){var e=0,n=0;if(p[7872]|0||(z3(10244),Ht(52,10244,he|0)|0,n=7872,t[n>>2]=1,t[n+4>>2]=0),!(rr(10244)|0)){e=10244,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));z3(10244)}return 10244}function bk(e){return e=e|0,e|0}function Pk(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0;return D=m,m=m+16|0,l=D,s=D+4|0,t[l>>2]=e,S=AE()|0,h=S+24|0,n=dn(n,4)|0,t[s>>2]=n,r=S+28|0,u=t[r>>2]|0,u>>>0<(t[S+32>>2]|0)>>>0?(j3(u,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(Ik(h,l,s),n=t[r>>2]|0),m=D,(n-(t[h>>2]|0)>>3)+-1|0}function j3(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function Ik(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0;if(D=m,m=m+32|0,l=D,s=e+4|0,h=((t[s>>2]|0)-(t[e>>2]|0)>>3)+1|0,u=Bk(e)|0,u>>>0>>0)li(e);else{S=t[e>>2]|0,O=(t[e+8>>2]|0)-S|0,M=O>>2,Uk(l,O>>3>>>0>>1>>>0?M>>>0>>0?h:M:u,(t[s>>2]|0)-S>>3,e+8|0),h=l+8|0,j3(t[h>>2]|0,t[n>>2]|0,t[r>>2]|0),t[h>>2]=(t[h>>2]|0)+8,jk(e,l),zk(l),m=D;return}}function Bk(e){return e=e|0,536870911}function Uk(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>536870911)Xn();else{l=cn(n<<3)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r<<3)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n<<3)}function jk(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(0-(l>>3)<<3)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function zk(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~((u+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&yt(e)}function z3(e){e=e|0,Wk(e)}function qk(e){e=e|0,Hk(e+24|0)}function Hk(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-u|0)>>>3)<<3)),yt(r))}function Wk(e){e=e|0;var n=0;n=dr()|0,Pn(e,1,16,n,Vk()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Vk(){return 1400}function Gk(e){return e=e|0,Kk(t[(Yk(e)|0)>>2]|0)|0}function Yk(e){return e=e|0,(t[(AE()|0)+24>>2]|0)+(e<<3)|0}function Kk(e){return e=e|0,Xk(N_[e&7]()|0)|0}function Xk(e){return e=e|0,e|0}function Qk(){var e=0;return p[7880]|0||(rM(10280),Ht(25,10280,he|0)|0,e=7880,t[e>>2]=1,t[e+4>>2]=0),10280}function Jk(e,n){e=e|0,n=n|0,t[e>>2]=Zk()|0,t[e+4>>2]=$k()|0,t[e+12>>2]=n,t[e+8>>2]=eM()|0,t[e+32>>2]=4}function Zk(){return 11711}function $k(){return 1356}function eM(){return O1()|0}function tM(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0,(Pl(u,896)|0)==512?r|0&&(nM(r),yt(r)):n|0&&(eo(n),yt(n))}function nM(e){e=e|0,e=t[e+4>>2]|0,e|0&&J2(e)}function rM(e){e=e|0,Ha(e)}function iM(e){e=e|0,uM(e,4920),oM(e)|0,lM(e)|0}function uM(e,n){e=e|0,n=n|0;var r=0;r=j2()|0,t[e>>2]=r,RM(r,n),Q2(t[e>>2]|0)}function oM(e){e=e|0;var n=0;return n=t[e>>2]|0,Hp(n,gM()|0),e|0}function lM(e){e=e|0;var n=0;return n=t[e>>2]|0,Hp(n,sM()|0),e|0}function sM(){var e=0;return p[7888]|0||(q3(10328),Ht(53,10328,he|0)|0,e=7888,t[e>>2]=1,t[e+4>>2]=0),rr(10328)|0||q3(10328),10328}function Hp(e,n){e=e|0,n=n|0,vi(e,0,n,0,0,0)}function q3(e){e=e|0,cM(e),Wp(e,10)}function aM(e){e=e|0,fM(e+24|0)}function fM(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-u|0)>>>3)<<3)),yt(r))}function cM(e){e=e|0;var n=0;n=dr()|0,Pn(e,5,1,n,vM()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function dM(e,n,r){e=e|0,n=n|0,r=+r,pM(e,n,r)}function Wp(e,n){e=e|0,n=n|0,t[e+20>>2]=n}function pM(e,n,r){e=e|0,n=n|0,r=+r;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+16|0,s=u+8|0,D=u+13|0,l=u,h=u+12|0,Ds(D,n),t[s>>2]=zs(D,n)|0,Ol(h,r),U[l>>3]=+es(h,r),hM(e,s,l),m=u}function hM(e,n,r){e=e|0,n=n|0,r=r|0,I(e+8|0,t[n>>2]|0,+U[r>>3]),p[e+24>>0]=1}function vM(){return 1404}function mM(e,n){return e=e|0,n=+n,yM(e,n)|0}function yM(e,n){e=e|0,n=+n;var r=0,u=0,l=0,s=0,h=0,D=0,S=0;return u=m,m=m+16|0,s=u+4|0,h=u+8|0,D=u,l=Sa(8)|0,r=l,S=cn(16)|0,Ds(s,e),e=zs(s,e)|0,Ol(h,n),I(S,e,+es(h,n)),h=r+4|0,t[h>>2]=S,e=cn(8)|0,h=t[h>>2]|0,t[D>>2]=0,t[s>>2]=t[D>>2],Nf(e,h,s),t[l>>2]=e,m=u,r|0}function gM(){var e=0;return p[7896]|0||(H3(10364),Ht(54,10364,he|0)|0,e=7896,t[e>>2]=1,t[e+4>>2]=0),rr(10364)|0||H3(10364),10364}function H3(e){e=e|0,DM(e),Wp(e,55)}function _M(e){e=e|0,EM(e+24|0)}function EM(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-u|0)>>>3)<<3)),yt(r))}function DM(e){e=e|0;var n=0;n=dr()|0,Pn(e,5,4,n,CM()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function wM(e){e=e|0,SM(e)}function SM(e){e=e|0,TM(e)}function TM(e){e=e|0,W3(e+8|0),p[e+24>>0]=1}function W3(e){e=e|0,t[e>>2]=0,U[e+8>>3]=0}function CM(){return 1424}function xM(){return AM()|0}function AM(){var e=0,n=0,r=0,u=0,l=0,s=0,h=0;return n=m,m=m+16|0,l=n+4|0,h=n,r=Sa(8)|0,e=r,u=cn(16)|0,W3(u),s=e+4|0,t[s>>2]=u,u=cn(8)|0,s=t[s>>2]|0,t[h>>2]=0,t[l>>2]=t[h>>2],Nf(u,s,l),t[r>>2]=u,m=n,e|0}function RM(e,n){e=e|0,n=n|0,t[e>>2]=OM()|0,t[e+4>>2]=kM()|0,t[e+12>>2]=n,t[e+8>>2]=MM()|0,t[e+32>>2]=5}function OM(){return 11710}function kM(){return 1416}function MM(){return E_()|0}function NM(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0,(Pl(u,896)|0)==512?r|0&&(LM(r),yt(r)):n|0&&yt(n)}function LM(e){e=e|0,e=t[e+4>>2]|0,e|0&&J2(e)}function E_(){var e=0;return p[7904]|0||(t[2600]=FM()|0,t[2601]=0,e=7904,t[e>>2]=1,t[e+4>>2]=0),10400}function FM(){return t[357]|0}function bM(e){e=e|0,PM(e,4926),IM(e)|0}function PM(e,n){e=e|0,n=n|0;var r=0;r=qa()|0,t[e>>2]=r,KM(r,n),Q2(t[e>>2]|0)}function IM(e){e=e|0;var n=0;return n=t[e>>2]|0,Hp(n,BM()|0),e|0}function BM(){var e=0;return p[7912]|0||(V3(10412),Ht(56,10412,he|0)|0,e=7912,t[e>>2]=1,t[e+4>>2]=0),rr(10412)|0||V3(10412),10412}function V3(e){e=e|0,zM(e),Wp(e,57)}function UM(e){e=e|0,jM(e+24|0)}function jM(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-u|0)>>>3)<<3)),yt(r))}function zM(e){e=e|0;var n=0;n=dr()|0,Pn(e,5,5,n,VM()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function qM(e){e=e|0,HM(e)}function HM(e){e=e|0,WM(e)}function WM(e){e=e|0;var n=0,r=0;n=e+8|0,r=n+48|0;do t[n>>2]=0,n=n+4|0;while((n|0)<(r|0));p[e+56>>0]=1}function VM(){return 1432}function GM(){return YM()|0}function YM(){var e=0,n=0,r=0,u=0,l=0,s=0,h=0,D=0;h=m,m=m+16|0,e=h+4|0,n=h,r=Sa(8)|0,u=r,l=cn(48)|0,s=l,D=s+48|0;do t[s>>2]=0,s=s+4|0;while((s|0)<(D|0));return s=u+4|0,t[s>>2]=l,D=cn(8)|0,s=t[s>>2]|0,t[n>>2]=0,t[e>>2]=t[n>>2],Dh(D,s,e),t[r>>2]=D,m=h,u|0}function KM(e,n){e=e|0,n=n|0,t[e>>2]=XM()|0,t[e+4>>2]=QM()|0,t[e+12>>2]=n,t[e+8>>2]=JM()|0,t[e+32>>2]=6}function XM(){return 11704}function QM(){return 1436}function JM(){return E_()|0}function ZM(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0,(Pl(u,896)|0)==512?r|0&&($M(r),yt(r)):n|0&&yt(n)}function $M(e){e=e|0,e=t[e+4>>2]|0,e|0&&J2(e)}function eN(e){e=e|0,tN(e,4933),nN(e)|0,rN(e)|0}function tN(e,n){e=e|0,n=n|0;var r=0;r=AN()|0,t[e>>2]=r,RN(r,n),Q2(t[e>>2]|0)}function nN(e){e=e|0;var n=0;return n=t[e>>2]|0,Hp(n,yN()|0),e|0}function rN(e){e=e|0;var n=0;return n=t[e>>2]|0,Hp(n,iN()|0),e|0}function iN(){var e=0;return p[7920]|0||(G3(10452),Ht(58,10452,he|0)|0,e=7920,t[e>>2]=1,t[e+4>>2]=0),rr(10452)|0||G3(10452),10452}function G3(e){e=e|0,lN(e),Wp(e,1)}function uN(e){e=e|0,oN(e+24|0)}function oN(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-u|0)>>>3)<<3)),yt(r))}function lN(e){e=e|0;var n=0;n=dr()|0,Pn(e,5,1,n,cN()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function sN(e,n,r){e=e|0,n=+n,r=+r,aN(e,n,r)}function aN(e,n,r){e=e|0,n=+n,r=+r;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+32|0,s=u+8|0,D=u+17|0,l=u,h=u+16|0,Ol(D,n),U[s>>3]=+es(D,n),Ol(h,r),U[l>>3]=+es(h,r),fN(e,s,l),m=u}function fN(e,n,r){e=e|0,n=n|0,r=r|0,Y3(e+8|0,+U[n>>3],+U[r>>3]),p[e+24>>0]=1}function Y3(e,n,r){e=e|0,n=+n,r=+r,U[e>>3]=n,U[e+8>>3]=r}function cN(){return 1472}function dN(e,n){return e=+e,n=+n,pN(e,n)|0}function pN(e,n){e=+e,n=+n;var r=0,u=0,l=0,s=0,h=0,D=0,S=0;return u=m,m=m+16|0,h=u+4|0,D=u+8|0,S=u,l=Sa(8)|0,r=l,s=cn(16)|0,Ol(h,e),e=+es(h,e),Ol(D,n),Y3(s,e,+es(D,n)),D=r+4|0,t[D>>2]=s,s=cn(8)|0,D=t[D>>2]|0,t[S>>2]=0,t[h>>2]=t[S>>2],K3(s,D,h),t[l>>2]=s,m=u,r|0}function K3(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=cn(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1452,t[r+12>>2]=n,t[e+4>>2]=r}function hN(e){e=e|0,Pv(e),yt(e)}function vN(e){e=e|0,e=t[e+12>>2]|0,e|0&&yt(e)}function mN(e){e=e|0,yt(e)}function yN(){var e=0;return p[7928]|0||(X3(10488),Ht(59,10488,he|0)|0,e=7928,t[e>>2]=1,t[e+4>>2]=0),rr(10488)|0||X3(10488),10488}function X3(e){e=e|0,EN(e),Wp(e,60)}function gN(e){e=e|0,_N(e+24|0)}function _N(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-u|0)>>>3)<<3)),yt(r))}function EN(e){e=e|0;var n=0;n=dr()|0,Pn(e,5,6,n,TN()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function DN(e){e=e|0,wN(e)}function wN(e){e=e|0,SN(e)}function SN(e){e=e|0,Q3(e+8|0),p[e+24>>0]=1}function Q3(e){e=e|0,t[e>>2]=0,t[e+4>>2]=0,t[e+8>>2]=0,t[e+12>>2]=0}function TN(){return 1492}function CN(){return xN()|0}function xN(){var e=0,n=0,r=0,u=0,l=0,s=0,h=0;return n=m,m=m+16|0,l=n+4|0,h=n,r=Sa(8)|0,e=r,u=cn(16)|0,Q3(u),s=e+4|0,t[s>>2]=u,u=cn(8)|0,s=t[s>>2]|0,t[h>>2]=0,t[l>>2]=t[h>>2],K3(u,s,l),t[r>>2]=u,m=n,e|0}function AN(){var e=0;return p[7936]|0||(FN(10524),Ht(25,10524,he|0)|0,e=7936,t[e>>2]=1,t[e+4>>2]=0),10524}function RN(e,n){e=e|0,n=n|0,t[e>>2]=ON()|0,t[e+4>>2]=kN()|0,t[e+12>>2]=n,t[e+8>>2]=MN()|0,t[e+32>>2]=7}function ON(){return 11700}function kN(){return 1484}function MN(){return E_()|0}function NN(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0,(Pl(u,896)|0)==512?r|0&&(LN(r),yt(r)):n|0&&yt(n)}function LN(e){e=e|0,e=t[e+4>>2]|0,e|0&&J2(e)}function FN(e){e=e|0,Ha(e)}function bN(e,n,r){e=e|0,n=n|0,r=r|0,e=Or(n)|0,n=PN(r)|0,r=IN(r,0)|0,pL(e,n,r,RE()|0,0)}function PN(e){return e=e|0,e|0}function IN(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0;return D=m,m=m+16|0,l=D,s=D+4|0,t[l>>2]=e,S=RE()|0,h=S+24|0,n=dn(n,4)|0,t[s>>2]=n,r=S+28|0,u=t[r>>2]|0,u>>>0<(t[S+32>>2]|0)>>>0?(Z3(u,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(WN(h,l,s),n=t[r>>2]|0),m=D,(n-(t[h>>2]|0)>>3)+-1|0}function RE(){var e=0,n=0;if(p[7944]|0||(J3(10568),Ht(61,10568,he|0)|0,n=7944,t[n>>2]=1,t[n+4>>2]=0),!(rr(10568)|0)){e=10568,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));J3(10568)}return 10568}function J3(e){e=e|0,jN(e)}function BN(e){e=e|0,UN(e+24|0)}function UN(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-u|0)>>>3)<<3)),yt(r))}function jN(e){e=e|0;var n=0;n=dr()|0,Pn(e,1,17,n,Jh()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function zN(e){return e=e|0,HN(t[(qN(e)|0)>>2]|0)|0}function qN(e){return e=e|0,(t[(RE()|0)+24>>2]|0)+(e<<3)|0}function HN(e){return e=e|0,z0(N_[e&7]()|0)|0}function Z3(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function WN(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0;if(D=m,m=m+32|0,l=D,s=e+4|0,h=((t[s>>2]|0)-(t[e>>2]|0)>>3)+1|0,u=VN(e)|0,u>>>0>>0)li(e);else{S=t[e>>2]|0,O=(t[e+8>>2]|0)-S|0,M=O>>2,GN(l,O>>3>>>0>>1>>>0?M>>>0>>0?h:M:u,(t[s>>2]|0)-S>>3,e+8|0),h=l+8|0,Z3(t[h>>2]|0,t[n>>2]|0,t[r>>2]|0),t[h>>2]=(t[h>>2]|0)+8,YN(e,l),KN(l),m=D;return}}function VN(e){return e=e|0,536870911}function GN(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>536870911)Xn();else{l=cn(n<<3)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r<<3)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n<<3)}function YN(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(0-(l>>3)<<3)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function KN(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~((u+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&yt(e)}function XN(){QN()}function QN(){JN(10604)}function JN(e){e=e|0,ZN(e,4955)}function ZN(e,n){e=e|0,n=n|0;var r=0;r=$N()|0,t[e>>2]=r,eL(r,n),Q2(t[e>>2]|0)}function $N(){var e=0;return p[7952]|0||(aL(10612),Ht(25,10612,he|0)|0,e=7952,t[e>>2]=1,t[e+4>>2]=0),10612}function eL(e,n){e=e|0,n=n|0,t[e>>2]=iL()|0,t[e+4>>2]=uL()|0,t[e+12>>2]=n,t[e+8>>2]=oL()|0,t[e+32>>2]=8}function Q2(e){e=e|0;var n=0,r=0;n=m,m=m+16|0,r=n,Mv()|0,t[r>>2]=e,tL(10608,r),m=n}function Mv(){return p[11714]|0||(t[2652]=0,Ht(62,10608,he|0)|0,p[11714]=1),10608}function tL(e,n){e=e|0,n=n|0;var r=0;r=cn(8)|0,t[r+4>>2]=t[n>>2],t[r>>2]=t[e>>2],t[e>>2]=r}function nL(e){e=e|0,rL(e)}function rL(e){e=e|0;var n=0,r=0;if(n=t[e>>2]|0,n|0)do r=n,n=t[n>>2]|0,yt(r);while((n|0)!=0);t[e>>2]=0}function iL(){return 11715}function uL(){return 1496}function oL(){return O1()|0}function lL(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0,(Pl(u,896)|0)==512?r|0&&(sL(r),yt(r)):n|0&&yt(n)}function sL(e){e=e|0,e=t[e+4>>2]|0,e|0&&J2(e)}function aL(e){e=e|0,Ha(e)}function fL(e,n){e=e|0,n=n|0;var r=0,u=0;Mv()|0,r=t[2652]|0;e:do if(r|0){for(;u=t[r+4>>2]|0,!(u|0?(L8(OE(u)|0,e)|0)==0:0);)if(r=t[r>>2]|0,!r)break e;cL(u,n)}while(0)}function OE(e){return e=e|0,t[e+12>>2]|0}function cL(e,n){e=e|0,n=n|0;var r=0;e=e+36|0,r=t[e>>2]|0,r|0&&(ia(r),yt(r)),r=cn(4)|0,mf(r,n),t[e>>2]=r}function kE(){return p[11716]|0||(t[2664]=0,Ht(63,10656,he|0)|0,p[11716]=1),10656}function $3(){var e=0;return p[11717]|0?e=t[2665]|0:(dL(),t[2665]=1504,p[11717]=1,e=1504),e|0}function dL(){p[11740]|0||(p[11718]=dn(dn(8,0)|0,0)|0,p[11719]=dn(dn(0,0)|0,0)|0,p[11720]=dn(dn(0,16)|0,0)|0,p[11721]=dn(dn(8,0)|0,0)|0,p[11722]=dn(dn(0,0)|0,0)|0,p[11723]=dn(dn(8,0)|0,0)|0,p[11724]=dn(dn(0,0)|0,0)|0,p[11725]=dn(dn(8,0)|0,0)|0,p[11726]=dn(dn(0,0)|0,0)|0,p[11727]=dn(dn(8,0)|0,0)|0,p[11728]=dn(dn(0,0)|0,0)|0,p[11729]=dn(dn(0,0)|0,32)|0,p[11730]=dn(dn(0,0)|0,32)|0,p[11740]=1)}function e8(){return 1572}function pL(e,n,r,u,l){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0;var s=0,h=0,D=0,S=0,M=0,O=0;s=m,m=m+32|0,O=s+16|0,M=s+12|0,S=s+8|0,D=s+4|0,h=s,t[O>>2]=e,t[M>>2]=n,t[S>>2]=r,t[D>>2]=u,t[h>>2]=l,kE()|0,hL(10656,O,M,S,D,h),m=s}function hL(e,n,r,u,l,s){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,s=s|0;var h=0;h=cn(24)|0,h2(h+4|0,t[n>>2]|0,t[r>>2]|0,t[u>>2]|0,t[l>>2]|0,t[s>>2]|0),t[h>>2]=t[e>>2],t[e>>2]=h}function t8(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0,Pe=0,Ee=0,ve=0,Qe=0,We=0,st=0;if(st=m,m=m+32|0,Ee=st+20|0,ve=st+8|0,Qe=st+4|0,We=st,n=t[n>>2]|0,n|0){Pe=Ee+4|0,S=Ee+8|0,M=ve+4|0,O=ve+8|0,P=ve+8|0,K=Ee+8|0;do{if(h=n+4|0,D=ME(h)|0,D|0){if(l=Fy(D)|0,t[Ee>>2]=0,t[Pe>>2]=0,t[S>>2]=0,u=(by(D)|0)+1|0,vL(Ee,u),u|0)for(;u=u+-1|0,jf(ve,t[l>>2]|0),s=t[Pe>>2]|0,s>>>0<(t[K>>2]|0)>>>0?(t[s>>2]=t[ve>>2],t[Pe>>2]=(t[Pe>>2]|0)+4):NE(Ee,ve),u;)l=l+4|0;u=Py(D)|0,t[ve>>2]=0,t[M>>2]=0,t[O>>2]=0;e:do if(t[u>>2]|0)for(l=0,s=0;;){if((l|0)==(s|0)?mL(ve,u):(t[l>>2]=t[u>>2],t[M>>2]=(t[M>>2]|0)+4),u=u+4|0,!(t[u>>2]|0))break e;l=t[M>>2]|0,s=t[P>>2]|0}while(0);t[Qe>>2]=D_(h)|0,t[We>>2]=rr(D)|0,yL(r,e,Qe,We,Ee,ve),LE(ve),k1(Ee)}n=t[n>>2]|0}while((n|0)!=0)}m=st}function ME(e){return e=e|0,t[e+12>>2]|0}function Fy(e){return e=e|0,t[e+12>>2]|0}function by(e){return e=e|0,t[e+16>>2]|0}function vL(e,n){e=e|0,n=n|0;var r=0,u=0,l=0;l=m,m=m+32|0,r=l,u=t[e>>2]|0,(t[e+8>>2]|0)-u>>2>>>0>>0&&(a8(r,n,(t[e+4>>2]|0)-u>>2,e+8|0),f8(e,r),c8(r)),m=l}function NE(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0;if(h=m,m=m+32|0,r=h,u=e+4|0,l=((t[u>>2]|0)-(t[e>>2]|0)>>2)+1|0,s=s8(e)|0,s>>>0>>0)li(e);else{D=t[e>>2]|0,M=(t[e+8>>2]|0)-D|0,S=M>>1,a8(r,M>>2>>>0>>1>>>0?S>>>0>>0?l:S:s,(t[u>>2]|0)-D>>2,e+8|0),s=r+8|0,t[t[s>>2]>>2]=t[n>>2],t[s>>2]=(t[s>>2]|0)+4,f8(e,r),c8(r),m=h;return}}function Py(e){return e=e|0,t[e+8>>2]|0}function mL(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0;if(h=m,m=m+32|0,r=h,u=e+4|0,l=((t[u>>2]|0)-(t[e>>2]|0)>>2)+1|0,s=l8(e)|0,s>>>0>>0)li(e);else{D=t[e>>2]|0,M=(t[e+8>>2]|0)-D|0,S=M>>1,PL(r,M>>2>>>0>>1>>>0?S>>>0>>0?l:S:s,(t[u>>2]|0)-D>>2,e+8|0),s=r+8|0,t[t[s>>2]>>2]=t[n>>2],t[s>>2]=(t[s>>2]|0)+4,IL(e,r),BL(r),m=h;return}}function D_(e){return e=e|0,t[e>>2]|0}function yL(e,n,r,u,l,s){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,s=s|0,gL(e,n,r,u,l,s)}function LE(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-4-u|0)>>>2)<<2)),yt(r))}function k1(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-4-u|0)>>>2)<<2)),yt(r))}function gL(e,n,r,u,l,s){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,s=s|0;var h=0,D=0,S=0,M=0,O=0,P=0;h=m,m=m+48|0,O=h+40|0,D=h+32|0,P=h+24|0,S=h+12|0,M=h,Ta(D),e=vo(e)|0,t[P>>2]=t[n>>2],r=t[r>>2]|0,u=t[u>>2]|0,FE(S,l),_L(M,s),t[O>>2]=t[P>>2],EL(e,O,r,u,S,M),LE(M),k1(S),Ca(D),m=h}function FE(e,n){e=e|0,n=n|0;var r=0,u=0;t[e>>2]=0,t[e+4>>2]=0,t[e+8>>2]=0,r=n+4|0,u=(t[r>>2]|0)-(t[n>>2]|0)>>2,u|0&&(FL(e,u),bL(e,t[n>>2]|0,t[r>>2]|0,u))}function _L(e,n){e=e|0,n=n|0;var r=0,u=0;t[e>>2]=0,t[e+4>>2]=0,t[e+8>>2]=0,r=n+4|0,u=(t[r>>2]|0)-(t[n>>2]|0)>>2,u|0&&(NL(e,u),LL(e,t[n>>2]|0,t[r>>2]|0,u))}function EL(e,n,r,u,l,s){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,s=s|0;var h=0,D=0,S=0,M=0,O=0,P=0;h=m,m=m+32|0,O=h+28|0,P=h+24|0,D=h+12|0,S=h,M=mo(DL()|0)|0,t[P>>2]=t[n>>2],t[O>>2]=t[P>>2],n=Vp(O)|0,r=n8(r)|0,u=bE(u)|0,t[D>>2]=t[l>>2],O=l+4|0,t[D+4>>2]=t[O>>2],P=l+8|0,t[D+8>>2]=t[P>>2],t[P>>2]=0,t[O>>2]=0,t[l>>2]=0,l=PE(D)|0,t[S>>2]=t[s>>2],O=s+4|0,t[S+4>>2]=t[O>>2],P=s+8|0,t[S+8>>2]=t[P>>2],t[P>>2]=0,t[O>>2]=0,t[s>>2]=0,G0(0,M|0,e|0,n|0,r|0,u|0,l|0,wL(S)|0)|0,LE(S),k1(D),m=h}function DL(){var e=0;return p[7968]|0||(kL(10708),e=7968,t[e>>2]=1,t[e+4>>2]=0),10708}function Vp(e){return e=e|0,i8(e)|0}function n8(e){return e=e|0,r8(e)|0}function bE(e){return e=e|0,z0(e)|0}function PE(e){return e=e|0,TL(e)|0}function wL(e){return e=e|0,SL(e)|0}function SL(e){e=e|0;var n=0,r=0,u=0;if(u=(t[e+4>>2]|0)-(t[e>>2]|0)|0,r=u>>2,u=Sa(u+4|0)|0,t[u>>2]=r,r|0){n=0;do t[u+4+(n<<2)>>2]=r8(t[(t[e>>2]|0)+(n<<2)>>2]|0)|0,n=n+1|0;while((n|0)!=(r|0))}return u|0}function r8(e){return e=e|0,e|0}function TL(e){e=e|0;var n=0,r=0,u=0;if(u=(t[e+4>>2]|0)-(t[e>>2]|0)|0,r=u>>2,u=Sa(u+4|0)|0,t[u>>2]=r,r|0){n=0;do t[u+4+(n<<2)>>2]=i8((t[e>>2]|0)+(n<<2)|0)|0,n=n+1|0;while((n|0)!=(r|0))}return u|0}function i8(e){e=e|0;var n=0,r=0,u=0,l=0;return l=m,m=m+32|0,n=l+12|0,r=l,u=Ou(u8()|0)|0,u?(Zl(n,u),Tf(r,n),lI(e,r),e=Es(n)|0):e=CL(e)|0,m=l,e|0}function u8(){var e=0;return p[7960]|0||(OL(10664),Ht(25,10664,he|0)|0,e=7960,t[e>>2]=1,t[e+4>>2]=0),10664}function CL(e){e=e|0;var n=0,r=0,u=0,l=0,s=0,h=0,D=0;return r=m,m=m+16|0,l=r+4|0,h=r,u=Sa(8)|0,n=u,D=cn(4)|0,t[D>>2]=t[e>>2],s=n+4|0,t[s>>2]=D,e=cn(8)|0,s=t[s>>2]|0,t[h>>2]=0,t[l>>2]=t[h>>2],o8(e,s,l),t[u>>2]=e,m=r,n|0}function o8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=cn(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1656,t[r+12>>2]=n,t[e+4>>2]=r}function xL(e){e=e|0,Pv(e),yt(e)}function AL(e){e=e|0,e=t[e+12>>2]|0,e|0&&yt(e)}function RL(e){e=e|0,yt(e)}function OL(e){e=e|0,Ha(e)}function kL(e){e=e|0,nl(e,ML()|0,5)}function ML(){return 1676}function NL(e,n){e=e|0,n=n|0;var r=0;if((l8(e)|0)>>>0>>0&&li(e),n>>>0>1073741823)Xn();else{r=cn(n<<2)|0,t[e+4>>2]=r,t[e>>2]=r,t[e+8>>2]=r+(n<<2);return}}function LL(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0,u=e+4|0,e=r-n|0,(e|0)>0&&(pr(t[u>>2]|0,n|0,e|0)|0,t[u>>2]=(t[u>>2]|0)+(e>>>2<<2))}function l8(e){return e=e|0,1073741823}function FL(e,n){e=e|0,n=n|0;var r=0;if((s8(e)|0)>>>0>>0&&li(e),n>>>0>1073741823)Xn();else{r=cn(n<<2)|0,t[e+4>>2]=r,t[e>>2]=r,t[e+8>>2]=r+(n<<2);return}}function bL(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0,u=e+4|0,e=r-n|0,(e|0)>0&&(pr(t[u>>2]|0,n|0,e|0)|0,t[u>>2]=(t[u>>2]|0)+(e>>>2<<2))}function s8(e){return e=e|0,1073741823}function PL(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>1073741823)Xn();else{l=cn(n<<2)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r<<2)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n<<2)}function IL(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(0-(l>>2)<<2)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function BL(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~((u+-4-n|0)>>>2)<<2)),e=t[e>>2]|0,e|0&&yt(e)}function a8(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>1073741823)Xn();else{l=cn(n<<2)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r<<2)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n<<2)}function f8(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(0-(l>>2)<<2)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function c8(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~((u+-4-n|0)>>>2)<<2)),e=t[e>>2]|0,e|0&&yt(e)}function UL(e,n,r,u,l){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0;var s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0,Pe=0,Ee=0,ve=0;if(ve=m,m=m+32|0,O=ve+20|0,P=ve+12|0,M=ve+16|0,K=ve+4|0,Pe=ve,Ee=ve+8|0,D=$3()|0,s=t[D>>2]|0,h=t[s>>2]|0,h|0)for(S=t[D+8>>2]|0,D=t[D+4>>2]|0;jf(O,h),jL(e,O,D,S),s=s+4|0,h=t[s>>2]|0,h;)S=S+1|0,D=D+1|0;if(s=e8()|0,h=t[s>>2]|0,h|0)do jf(O,h),t[P>>2]=t[s+4>>2],zL(n,O,P),s=s+8|0,h=t[s>>2]|0;while((h|0)!=0);if(s=t[(Mv()|0)>>2]|0,s|0)do n=t[s+4>>2]|0,jf(O,t[(Nv(n)|0)>>2]|0),t[P>>2]=OE(n)|0,qL(r,O,P),s=t[s>>2]|0;while((s|0)!=0);if(jf(M,0),s=kE()|0,t[O>>2]=t[M>>2],t8(O,s,l),s=t[(Mv()|0)>>2]|0,s|0){e=O+4|0,n=O+8|0,r=O+8|0;do{if(S=t[s+4>>2]|0,jf(P,t[(Nv(S)|0)>>2]|0),HL(K,d8(S)|0),h=t[K>>2]|0,h|0){t[O>>2]=0,t[e>>2]=0,t[n>>2]=0;do jf(Pe,t[(Nv(t[h+4>>2]|0)|0)>>2]|0),D=t[e>>2]|0,D>>>0<(t[r>>2]|0)>>>0?(t[D>>2]=t[Pe>>2],t[e>>2]=(t[e>>2]|0)+4):NE(O,Pe),h=t[h>>2]|0;while((h|0)!=0);WL(u,P,O),k1(O)}t[Ee>>2]=t[P>>2],M=p8(S)|0,t[O>>2]=t[Ee>>2],t8(O,M,l),m2(K),s=t[s>>2]|0}while((s|0)!=0)}m=ve}function jL(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0,rF(e,n,r,u)}function zL(e,n,r){e=e|0,n=n|0,r=r|0,nF(e,n,r)}function Nv(e){return e=e|0,e|0}function qL(e,n,r){e=e|0,n=n|0,r=r|0,ZL(e,n,r)}function d8(e){return e=e|0,e+16|0}function HL(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0;if(s=m,m=m+16|0,l=s+8|0,r=s,t[e>>2]=0,u=t[n>>2]|0,t[l>>2]=u,t[r>>2]=e,r=JL(r)|0,u|0){if(u=cn(12)|0,h=(h8(l)|0)+4|0,e=t[h+4>>2]|0,n=u+4|0,t[n>>2]=t[h>>2],t[n+4>>2]=e,n=t[t[l>>2]>>2]|0,t[l>>2]=n,!n)e=u;else for(n=u;e=cn(12)|0,S=(h8(l)|0)+4|0,D=t[S+4>>2]|0,h=e+4|0,t[h>>2]=t[S>>2],t[h+4>>2]=D,t[n>>2]=e,h=t[t[l>>2]>>2]|0,t[l>>2]=h,h;)n=e;t[e>>2]=t[r>>2],t[r>>2]=u}m=s}function WL(e,n,r){e=e|0,n=n|0,r=r|0,VL(e,n,r)}function p8(e){return e=e|0,e+24|0}function VL(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+32|0,h=u+24|0,l=u+16|0,D=u+12|0,s=u,Ta(l),e=vo(e)|0,t[D>>2]=t[n>>2],FE(s,r),t[h>>2]=t[D>>2],YL(e,h,s),k1(s),Ca(l),m=u}function YL(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=m,m=m+32|0,h=u+16|0,D=u+12|0,l=u,s=mo(KL()|0)|0,t[D>>2]=t[n>>2],t[h>>2]=t[D>>2],n=Vp(h)|0,t[l>>2]=t[r>>2],h=r+4|0,t[l+4>>2]=t[h>>2],D=r+8|0,t[l+8>>2]=t[D>>2],t[D>>2]=0,t[h>>2]=0,t[r>>2]=0,F0(0,s|0,e|0,n|0,PE(l)|0)|0,k1(l),m=u}function KL(){var e=0;return p[7976]|0||(XL(10720),e=7976,t[e>>2]=1,t[e+4>>2]=0),10720}function XL(e){e=e|0,nl(e,QL()|0,2)}function QL(){return 1732}function JL(e){return e=e|0,t[e>>2]|0}function h8(e){return e=e|0,t[e>>2]|0}function ZL(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;u=m,m=m+32|0,s=u+16|0,l=u+8|0,h=u,Ta(l),e=vo(e)|0,t[h>>2]=t[n>>2],r=t[r>>2]|0,t[s>>2]=t[h>>2],v8(e,s,r),Ca(l),m=u}function v8(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;u=m,m=m+16|0,s=u+4|0,h=u,l=mo($L()|0)|0,t[h>>2]=t[n>>2],t[s>>2]=t[h>>2],n=Vp(s)|0,F0(0,l|0,e|0,n|0,n8(r)|0)|0,m=u}function $L(){var e=0;return p[7984]|0||(eF(10732),e=7984,t[e>>2]=1,t[e+4>>2]=0),10732}function eF(e){e=e|0,nl(e,tF()|0,2)}function tF(){return 1744}function nF(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;u=m,m=m+32|0,s=u+16|0,l=u+8|0,h=u,Ta(l),e=vo(e)|0,t[h>>2]=t[n>>2],r=t[r>>2]|0,t[s>>2]=t[h>>2],v8(e,s,r),Ca(l),m=u}function rF(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0;l=m,m=m+32|0,h=l+16|0,s=l+8|0,D=l,Ta(s),e=vo(e)|0,t[D>>2]=t[n>>2],r=p[r>>0]|0,u=p[u>>0]|0,t[h>>2]=t[D>>2],iF(e,h,r,u),Ca(s),m=l}function iF(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0;l=m,m=m+16|0,h=l+4|0,D=l,s=mo(uF()|0)|0,t[D>>2]=t[n>>2],t[h>>2]=t[D>>2],n=Vp(h)|0,r=Lv(r)|0,Bn(0,s|0,e|0,n|0,r|0,Lv(u)|0)|0,m=l}function uF(){var e=0;return p[7992]|0||(lF(10744),e=7992,t[e>>2]=1,t[e+4>>2]=0),10744}function Lv(e){return e=e|0,oF(e)|0}function oF(e){return e=e|0,e&255|0}function lF(e){e=e|0,nl(e,sF()|0,3)}function sF(){return 1756}function aF(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;switch(K=m,m=m+32|0,D=K+8|0,S=K+4|0,M=K+20|0,O=K,ma(e,0),u=oI(n)|0,t[D>>2]=0,P=D+4|0,t[P>>2]=0,t[D+8>>2]=0,u<<24>>24){case 0:{p[M>>0]=0,fF(S,r,M),w_(e,S)|0,B0(S);break}case 8:{P=qE(n)|0,p[M>>0]=8,jf(O,t[P+4>>2]|0),cF(S,r,M,O,P+8|0),w_(e,S)|0,B0(S);break}case 9:{if(s=qE(n)|0,n=t[s+4>>2]|0,n|0)for(h=D+8|0,l=s+12|0;n=n+-1|0,jf(S,t[l>>2]|0),u=t[P>>2]|0,u>>>0<(t[h>>2]|0)>>>0?(t[u>>2]=t[S>>2],t[P>>2]=(t[P>>2]|0)+4):NE(D,S),n;)l=l+4|0;p[M>>0]=9,jf(O,t[s+8>>2]|0),dF(S,r,M,O,D),w_(e,S)|0,B0(S);break}default:P=qE(n)|0,p[M>>0]=u,jf(O,t[P+4>>2]|0),pF(S,r,M,O),w_(e,S)|0,B0(S)}k1(D),m=K}function fF(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0;u=m,m=m+16|0,l=u,Ta(l),n=vo(n)|0,xF(e,n,p[r>>0]|0),Ca(l),m=u}function w_(e,n){e=e|0,n=n|0;var r=0;return r=t[e>>2]|0,r|0&&Ir(r|0),t[e>>2]=t[n>>2],t[n>>2]=0,e|0}function cF(e,n,r,u,l){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0;var s=0,h=0,D=0,S=0;s=m,m=m+32|0,D=s+16|0,h=s+8|0,S=s,Ta(h),n=vo(n)|0,r=p[r>>0]|0,t[S>>2]=t[u>>2],l=t[l>>2]|0,t[D>>2]=t[S>>2],wF(e,n,r,D,l),Ca(h),m=s}function dF(e,n,r,u,l){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0;var s=0,h=0,D=0,S=0,M=0;s=m,m=m+32|0,S=s+24|0,h=s+16|0,M=s+12|0,D=s,Ta(h),n=vo(n)|0,r=p[r>>0]|0,t[M>>2]=t[u>>2],FE(D,l),t[S>>2]=t[M>>2],gF(e,n,r,S,D),k1(D),Ca(h),m=s}function pF(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0;l=m,m=m+32|0,h=l+16|0,s=l+8|0,D=l,Ta(s),n=vo(n)|0,r=p[r>>0]|0,t[D>>2]=t[u>>2],t[h>>2]=t[D>>2],hF(e,n,r,h),Ca(s),m=l}function hF(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0,h=0,D=0;l=m,m=m+16|0,s=l+4|0,D=l,h=mo(vF()|0)|0,r=Lv(r)|0,t[D>>2]=t[u>>2],t[s>>2]=t[D>>2],S_(e,F0(0,h|0,n|0,r|0,Vp(s)|0)|0),m=l}function vF(){var e=0;return p[8e3]|0||(mF(10756),e=8e3,t[e>>2]=1,t[e+4>>2]=0),10756}function S_(e,n){e=e|0,n=n|0,ma(e,n)}function mF(e){e=e|0,nl(e,yF()|0,2)}function yF(){return 1772}function gF(e,n,r,u,l){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0;var s=0,h=0,D=0,S=0,M=0;s=m,m=m+32|0,S=s+16|0,M=s+12|0,h=s,D=mo(_F()|0)|0,r=Lv(r)|0,t[M>>2]=t[u>>2],t[S>>2]=t[M>>2],u=Vp(S)|0,t[h>>2]=t[l>>2],S=l+4|0,t[h+4>>2]=t[S>>2],M=l+8|0,t[h+8>>2]=t[M>>2],t[M>>2]=0,t[S>>2]=0,t[l>>2]=0,S_(e,Bn(0,D|0,n|0,r|0,u|0,PE(h)|0)|0),k1(h),m=s}function _F(){var e=0;return p[8008]|0||(EF(10768),e=8008,t[e>>2]=1,t[e+4>>2]=0),10768}function EF(e){e=e|0,nl(e,DF()|0,3)}function DF(){return 1784}function wF(e,n,r,u,l){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0;var s=0,h=0,D=0,S=0;s=m,m=m+16|0,D=s+4|0,S=s,h=mo(SF()|0)|0,r=Lv(r)|0,t[S>>2]=t[u>>2],t[D>>2]=t[S>>2],u=Vp(D)|0,S_(e,Bn(0,h|0,n|0,r|0,u|0,bE(l)|0)|0),m=s}function SF(){var e=0;return p[8016]|0||(TF(10780),e=8016,t[e>>2]=1,t[e+4>>2]=0),10780}function TF(e){e=e|0,nl(e,CF()|0,3)}function CF(){return 1800}function xF(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;u=mo(AF()|0)|0,S_(e,ji(0,u|0,n|0,Lv(r)|0)|0)}function AF(){var e=0;return p[8024]|0||(RF(10792),e=8024,t[e>>2]=1,t[e+4>>2]=0),10792}function RF(e){e=e|0,nl(e,OF()|0,1)}function OF(){return 1816}function kF(){MF(),NF(),LF()}function MF(){t[2702]=H8(65536)|0}function NF(){$F(10856)}function LF(){FF(10816)}function FF(e){e=e|0,bF(e,5044),PF(e)|0}function bF(e,n){e=e|0,n=n|0;var r=0;r=u8()|0,t[e>>2]=r,YF(r,n),Q2(t[e>>2]|0)}function PF(e){e=e|0;var n=0;return n=t[e>>2]|0,Hp(n,IF()|0),e|0}function IF(){var e=0;return p[8032]|0||(m8(10820),Ht(64,10820,he|0)|0,e=8032,t[e>>2]=1,t[e+4>>2]=0),rr(10820)|0||m8(10820),10820}function m8(e){e=e|0,jF(e),Wp(e,25)}function BF(e){e=e|0,UF(e+24|0)}function UF(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-u|0)>>>3)<<3)),yt(r))}function jF(e){e=e|0;var n=0;n=dr()|0,Pn(e,5,18,n,WF()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function zF(e,n){e=e|0,n=n|0,qF(e,n)}function qF(e,n){e=e|0,n=n|0;var r=0,u=0,l=0;r=m,m=m+16|0,u=r,l=r+4|0,Of(l,n),t[u>>2]=kf(l,n)|0,HF(e,u),m=r}function HF(e,n){e=e|0,n=n|0,y8(e+4|0,t[n>>2]|0),p[e+8>>0]=1}function y8(e,n){e=e|0,n=n|0,t[e>>2]=n}function WF(){return 1824}function VF(e){return e=e|0,GF(e)|0}function GF(e){e=e|0;var n=0,r=0,u=0,l=0,s=0,h=0,D=0;return r=m,m=m+16|0,l=r+4|0,h=r,u=Sa(8)|0,n=u,D=cn(4)|0,Of(l,e),y8(D,kf(l,e)|0),s=n+4|0,t[s>>2]=D,e=cn(8)|0,s=t[s>>2]|0,t[h>>2]=0,t[l>>2]=t[h>>2],o8(e,s,l),t[u>>2]=e,m=r,n|0}function Sa(e){e=e|0;var n=0,r=0;return e=e+7&-8,(e>>>0<=32768?(n=t[2701]|0,e>>>0<=(65536-n|0)>>>0):0)?(r=(t[2702]|0)+n|0,t[2701]=n+e,e=r):(e=H8(e+8|0)|0,t[e>>2]=t[2703],t[2703]=e,e=e+8|0),e|0}function YF(e,n){e=e|0,n=n|0,t[e>>2]=KF()|0,t[e+4>>2]=XF()|0,t[e+12>>2]=n,t[e+8>>2]=QF()|0,t[e+32>>2]=9}function KF(){return 11744}function XF(){return 1832}function QF(){return E_()|0}function JF(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0,(Pl(u,896)|0)==512?r|0&&(ZF(r),yt(r)):n|0&&yt(n)}function ZF(e){e=e|0,e=t[e+4>>2]|0,e|0&&J2(e)}function $F(e){e=e|0,eb(e,5052),tb(e)|0,nb(e,5058,26)|0,rb(e,5069,1)|0,ib(e,5077,10)|0,ub(e,5087,19)|0,ob(e,5094,27)|0}function eb(e,n){e=e|0,n=n|0;var r=0;r=ZP()|0,t[e>>2]=r,$P(r,n),Q2(t[e>>2]|0)}function tb(e){e=e|0;var n=0;return n=t[e>>2]|0,Hp(n,BP()|0),e|0}function nb(e,n,r){return e=e|0,n=n|0,r=r|0,EP(e,Or(n)|0,r,0),e|0}function rb(e,n,r){return e=e|0,n=n|0,r=r|0,uP(e,Or(n)|0,r,0),e|0}function ib(e,n,r){return e=e|0,n=n|0,r=r|0,Ib(e,Or(n)|0,r,0),e|0}function ub(e,n,r){return e=e|0,n=n|0,r=r|0,wb(e,Or(n)|0,r,0),e|0}function g8(e,n){e=e|0,n=n|0;var r=0,u=0;e:for(;;){for(r=t[2703]|0;;){if((r|0)==(n|0))break e;if(u=t[r>>2]|0,t[2703]=u,!r)r=u;else break}yt(r)}t[2701]=e}function ob(e,n,r){return e=e|0,n=n|0,r=r|0,lb(e,Or(n)|0,r,0),e|0}function lb(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0;s=t[e>>2]|0,l=IE()|0,e=sb(r)|0,vi(s,n,l,e,ab(r,u)|0,u)}function IE(){var e=0,n=0;if(p[8040]|0||(E8(10860),Ht(65,10860,he|0)|0,n=8040,t[n>>2]=1,t[n+4>>2]=0),!(rr(10860)|0)){e=10860,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));E8(10860)}return 10860}function sb(e){return e=e|0,e|0}function ab(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0;return D=m,m=m+16|0,l=D,s=D+4|0,t[l>>2]=e,S=IE()|0,h=S+24|0,n=dn(n,4)|0,t[s>>2]=n,r=S+28|0,u=t[r>>2]|0,u>>>0<(t[S+32>>2]|0)>>>0?(_8(u,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(fb(h,l,s),n=t[r>>2]|0),m=D,(n-(t[h>>2]|0)>>3)+-1|0}function _8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function fb(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0;if(D=m,m=m+32|0,l=D,s=e+4|0,h=((t[s>>2]|0)-(t[e>>2]|0)>>3)+1|0,u=cb(e)|0,u>>>0>>0)li(e);else{S=t[e>>2]|0,O=(t[e+8>>2]|0)-S|0,M=O>>2,db(l,O>>3>>>0>>1>>>0?M>>>0>>0?h:M:u,(t[s>>2]|0)-S>>3,e+8|0),h=l+8|0,_8(t[h>>2]|0,t[n>>2]|0,t[r>>2]|0),t[h>>2]=(t[h>>2]|0)+8,pb(e,l),hb(l),m=D;return}}function cb(e){return e=e|0,536870911}function db(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>536870911)Xn();else{l=cn(n<<3)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r<<3)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n<<3)}function pb(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(0-(l>>3)<<3)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function hb(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~((u+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&yt(e)}function E8(e){e=e|0,yb(e)}function vb(e){e=e|0,mb(e+24|0)}function mb(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-u|0)>>>3)<<3)),yt(r))}function yb(e){e=e|0;var n=0;n=dr()|0,Pn(e,1,11,n,gb()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function gb(){return 1840}function _b(e,n,r){e=e|0,n=n|0,r=r|0,Db(t[(Eb(e)|0)>>2]|0,n,r)}function Eb(e){return e=e|0,(t[(IE()|0)+24>>2]|0)+(e<<3)|0}function Db(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0;u=m,m=m+16|0,s=u+1|0,l=u,Of(s,n),n=kf(s,n)|0,Of(l,r),r=kf(l,r)|0,N1[e&31](n,r),m=u}function wb(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0;s=t[e>>2]|0,l=BE()|0,e=Sb(r)|0,vi(s,n,l,e,Tb(r,u)|0,u)}function BE(){var e=0,n=0;if(p[8048]|0||(w8(10896),Ht(66,10896,he|0)|0,n=8048,t[n>>2]=1,t[n+4>>2]=0),!(rr(10896)|0)){e=10896,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));w8(10896)}return 10896}function Sb(e){return e=e|0,e|0}function Tb(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0;return D=m,m=m+16|0,l=D,s=D+4|0,t[l>>2]=e,S=BE()|0,h=S+24|0,n=dn(n,4)|0,t[s>>2]=n,r=S+28|0,u=t[r>>2]|0,u>>>0<(t[S+32>>2]|0)>>>0?(D8(u,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(Cb(h,l,s),n=t[r>>2]|0),m=D,(n-(t[h>>2]|0)>>3)+-1|0}function D8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function Cb(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0;if(D=m,m=m+32|0,l=D,s=e+4|0,h=((t[s>>2]|0)-(t[e>>2]|0)>>3)+1|0,u=xb(e)|0,u>>>0>>0)li(e);else{S=t[e>>2]|0,O=(t[e+8>>2]|0)-S|0,M=O>>2,Ab(l,O>>3>>>0>>1>>>0?M>>>0>>0?h:M:u,(t[s>>2]|0)-S>>3,e+8|0),h=l+8|0,D8(t[h>>2]|0,t[n>>2]|0,t[r>>2]|0),t[h>>2]=(t[h>>2]|0)+8,Rb(e,l),Ob(l),m=D;return}}function xb(e){return e=e|0,536870911}function Ab(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>536870911)Xn();else{l=cn(n<<3)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r<<3)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n<<3)}function Rb(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(0-(l>>3)<<3)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function Ob(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~((u+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&yt(e)}function w8(e){e=e|0,Nb(e)}function kb(e){e=e|0,Mb(e+24|0)}function Mb(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-u|0)>>>3)<<3)),yt(r))}function Nb(e){e=e|0;var n=0;n=dr()|0,Pn(e,1,11,n,Lb()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Lb(){return 1852}function Fb(e,n){return e=e|0,n=n|0,Pb(t[(bb(e)|0)>>2]|0,n)|0}function bb(e){return e=e|0,(t[(BE()|0)+24>>2]|0)+(e<<3)|0}function Pb(e,n){e=e|0,n=n|0;var r=0,u=0;return r=m,m=m+16|0,u=r,Of(u,n),n=kf(u,n)|0,n=z0(Xp[e&31](n)|0)|0,m=r,n|0}function Ib(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0;s=t[e>>2]|0,l=UE()|0,e=Bb(r)|0,vi(s,n,l,e,Ub(r,u)|0,u)}function UE(){var e=0,n=0;if(p[8056]|0||(T8(10932),Ht(67,10932,he|0)|0,n=8056,t[n>>2]=1,t[n+4>>2]=0),!(rr(10932)|0)){e=10932,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));T8(10932)}return 10932}function Bb(e){return e=e|0,e|0}function Ub(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0;return D=m,m=m+16|0,l=D,s=D+4|0,t[l>>2]=e,S=UE()|0,h=S+24|0,n=dn(n,4)|0,t[s>>2]=n,r=S+28|0,u=t[r>>2]|0,u>>>0<(t[S+32>>2]|0)>>>0?(S8(u,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(jb(h,l,s),n=t[r>>2]|0),m=D,(n-(t[h>>2]|0)>>3)+-1|0}function S8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function jb(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0;if(D=m,m=m+32|0,l=D,s=e+4|0,h=((t[s>>2]|0)-(t[e>>2]|0)>>3)+1|0,u=zb(e)|0,u>>>0>>0)li(e);else{S=t[e>>2]|0,O=(t[e+8>>2]|0)-S|0,M=O>>2,qb(l,O>>3>>>0>>1>>>0?M>>>0>>0?h:M:u,(t[s>>2]|0)-S>>3,e+8|0),h=l+8|0,S8(t[h>>2]|0,t[n>>2]|0,t[r>>2]|0),t[h>>2]=(t[h>>2]|0)+8,Hb(e,l),Wb(l),m=D;return}}function zb(e){return e=e|0,536870911}function qb(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>536870911)Xn();else{l=cn(n<<3)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r<<3)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n<<3)}function Hb(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(0-(l>>3)<<3)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function Wb(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~((u+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&yt(e)}function T8(e){e=e|0,Yb(e)}function Vb(e){e=e|0,Gb(e+24|0)}function Gb(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-u|0)>>>3)<<3)),yt(r))}function Yb(e){e=e|0;var n=0;n=dr()|0,Pn(e,1,7,n,Kb()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Kb(){return 1860}function Xb(e,n,r){return e=e|0,n=n|0,r=r|0,Jb(t[(Qb(e)|0)>>2]|0,n,r)|0}function Qb(e){return e=e|0,(t[(UE()|0)+24>>2]|0)+(e<<3)|0}function Jb(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0;return u=m,m=m+32|0,h=u+12|0,s=u+8|0,D=u,S=u+16|0,l=u+4|0,Zb(S,n),$b(D,S,n),qs(l,r),r=Hs(l,r)|0,t[h>>2]=t[D>>2],jy[e&15](s,h,r),r=eP(s)|0,B0(s),Ws(l),m=u,r|0}function Zb(e,n){e=e|0,n=n|0}function $b(e,n,r){e=e|0,n=n|0,r=r|0,tP(e,r)}function eP(e){return e=e|0,vo(e)|0}function tP(e,n){e=e|0,n=n|0;var r=0,u=0,l=0;l=m,m=m+16|0,r=l,u=n,u&1?(nP(r,0),Yi(u|0,r|0)|0,rP(e,r),iP(r)):t[e>>2]=t[n>>2],m=l}function nP(e,n){e=e|0,n=n|0,l2(e,n),t[e+4>>2]=0,p[e+8>>0]=0}function rP(e,n){e=e|0,n=n|0,t[e>>2]=t[n+4>>2]}function iP(e){e=e|0,p[e+8>>0]=0}function uP(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0;s=t[e>>2]|0,l=jE()|0,e=oP(r)|0,vi(s,n,l,e,lP(r,u)|0,u)}function jE(){var e=0,n=0;if(p[8064]|0||(x8(10968),Ht(68,10968,he|0)|0,n=8064,t[n>>2]=1,t[n+4>>2]=0),!(rr(10968)|0)){e=10968,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));x8(10968)}return 10968}function oP(e){return e=e|0,e|0}function lP(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0;return D=m,m=m+16|0,l=D,s=D+4|0,t[l>>2]=e,S=jE()|0,h=S+24|0,n=dn(n,4)|0,t[s>>2]=n,r=S+28|0,u=t[r>>2]|0,u>>>0<(t[S+32>>2]|0)>>>0?(C8(u,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(sP(h,l,s),n=t[r>>2]|0),m=D,(n-(t[h>>2]|0)>>3)+-1|0}function C8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function sP(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0;if(D=m,m=m+32|0,l=D,s=e+4|0,h=((t[s>>2]|0)-(t[e>>2]|0)>>3)+1|0,u=aP(e)|0,u>>>0>>0)li(e);else{S=t[e>>2]|0,O=(t[e+8>>2]|0)-S|0,M=O>>2,fP(l,O>>3>>>0>>1>>>0?M>>>0>>0?h:M:u,(t[s>>2]|0)-S>>3,e+8|0),h=l+8|0,C8(t[h>>2]|0,t[n>>2]|0,t[r>>2]|0),t[h>>2]=(t[h>>2]|0)+8,cP(e,l),dP(l),m=D;return}}function aP(e){return e=e|0,536870911}function fP(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>536870911)Xn();else{l=cn(n<<3)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r<<3)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n<<3)}function cP(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(0-(l>>3)<<3)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function dP(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~((u+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&yt(e)}function x8(e){e=e|0,vP(e)}function pP(e){e=e|0,hP(e+24|0)}function hP(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-u|0)>>>3)<<3)),yt(r))}function vP(e){e=e|0;var n=0;n=dr()|0,Pn(e,1,1,n,mP()|0,5),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function mP(){return 1872}function yP(e,n,r,u,l,s){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,s=s|0,_P(t[(gP(e)|0)>>2]|0,n,r,u,l,s)}function gP(e){return e=e|0,(t[(jE()|0)+24>>2]|0)+(e<<3)|0}function _P(e,n,r,u,l,s){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,s=s|0;var h=0,D=0,S=0,M=0,O=0,P=0;h=m,m=m+32|0,D=h+16|0,S=h+12|0,M=h+8|0,O=h+4|0,P=h,qs(D,n),n=Hs(D,n)|0,qs(S,r),r=Hs(S,r)|0,qs(M,u),u=Hs(M,u)|0,qs(O,l),l=Hs(O,l)|0,qs(P,s),s=Hs(P,s)|0,K8[e&1](n,r,u,l,s),Ws(P),Ws(O),Ws(M),Ws(S),Ws(D),m=h}function EP(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0;s=t[e>>2]|0,l=zE()|0,e=DP(r)|0,vi(s,n,l,e,wP(r,u)|0,u)}function zE(){var e=0,n=0;if(p[8072]|0||(R8(11004),Ht(69,11004,he|0)|0,n=8072,t[n>>2]=1,t[n+4>>2]=0),!(rr(11004)|0)){e=11004,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));R8(11004)}return 11004}function DP(e){return e=e|0,e|0}function wP(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0,D=0,S=0;return D=m,m=m+16|0,l=D,s=D+4|0,t[l>>2]=e,S=zE()|0,h=S+24|0,n=dn(n,4)|0,t[s>>2]=n,r=S+28|0,u=t[r>>2]|0,u>>>0<(t[S+32>>2]|0)>>>0?(A8(u,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(SP(h,l,s),n=t[r>>2]|0),m=D,(n-(t[h>>2]|0)>>3)+-1|0}function A8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function SP(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0;if(D=m,m=m+32|0,l=D,s=e+4|0,h=((t[s>>2]|0)-(t[e>>2]|0)>>3)+1|0,u=TP(e)|0,u>>>0>>0)li(e);else{S=t[e>>2]|0,O=(t[e+8>>2]|0)-S|0,M=O>>2,CP(l,O>>3>>>0>>1>>>0?M>>>0>>0?h:M:u,(t[s>>2]|0)-S>>3,e+8|0),h=l+8|0,A8(t[h>>2]|0,t[n>>2]|0,t[r>>2]|0),t[h>>2]=(t[h>>2]|0)+8,xP(e,l),AP(l),m=D;return}}function TP(e){return e=e|0,536870911}function CP(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0;t[e+12>>2]=0,t[e+16>>2]=u;do if(n)if(n>>>0>536870911)Xn();else{l=cn(n<<3)|0;break}else l=0;while(0);t[e>>2]=l,u=l+(r<<3)|0,t[e+8>>2]=u,t[e+4>>2]=u,t[e+12>>2]=l+(n<<3)}function xP(e,n){e=e|0,n=n|0;var r=0,u=0,l=0,s=0,h=0;u=t[e>>2]|0,h=e+4|0,s=n+4|0,l=(t[h>>2]|0)-u|0,r=(t[s>>2]|0)+(0-(l>>3)<<3)|0,t[s>>2]=r,(l|0)>0?(pr(r|0,u|0,l|0)|0,u=s,r=t[s>>2]|0):u=s,s=t[e>>2]|0,t[e>>2]=r,t[u>>2]=s,s=n+8|0,l=t[h>>2]|0,t[h>>2]=t[s>>2],t[s>>2]=l,s=e+8|0,h=n+12|0,e=t[s>>2]|0,t[s>>2]=t[h>>2],t[h>>2]=e,t[n>>2]=t[u>>2]}function AP(e){e=e|0;var n=0,r=0,u=0;n=t[e+4>>2]|0,r=e+8|0,u=t[r>>2]|0,(u|0)!=(n|0)&&(t[r>>2]=u+(~((u+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&yt(e)}function R8(e){e=e|0,kP(e)}function RP(e){e=e|0,OP(e+24|0)}function OP(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-u|0)>>>3)<<3)),yt(r))}function kP(e){e=e|0;var n=0;n=dr()|0,Pn(e,1,12,n,MP()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function MP(){return 1896}function NP(e,n,r){e=e|0,n=n|0,r=r|0,FP(t[(LP(e)|0)>>2]|0,n,r)}function LP(e){return e=e|0,(t[(zE()|0)+24>>2]|0)+(e<<3)|0}function FP(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0;u=m,m=m+16|0,s=u+4|0,l=u,bP(s,n),n=PP(s,n)|0,qs(l,r),r=Hs(l,r)|0,N1[e&31](n,r),Ws(l),m=u}function bP(e,n){e=e|0,n=n|0}function PP(e,n){return e=e|0,n=n|0,IP(n)|0}function IP(e){return e=e|0,e|0}function BP(){var e=0;return p[8080]|0||(O8(11040),Ht(70,11040,he|0)|0,e=8080,t[e>>2]=1,t[e+4>>2]=0),rr(11040)|0||O8(11040),11040}function O8(e){e=e|0,zP(e),Wp(e,71)}function UP(e){e=e|0,jP(e+24|0)}function jP(e){e=e|0;var n=0,r=0,u=0;r=t[e>>2]|0,u=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-u|0)>>>3)<<3)),yt(r))}function zP(e){e=e|0;var n=0;n=dr()|0,Pn(e,5,7,n,VP()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function qP(e){e=e|0,HP(e)}function HP(e){e=e|0,WP(e)}function WP(e){e=e|0,p[e+8>>0]=1}function VP(){return 1936}function GP(){return YP()|0}function YP(){var e=0,n=0,r=0,u=0,l=0,s=0,h=0;return n=m,m=m+16|0,l=n+4|0,h=n,r=Sa(8)|0,e=r,s=e+4|0,t[s>>2]=cn(1)|0,u=cn(8)|0,s=t[s>>2]|0,t[h>>2]=0,t[l>>2]=t[h>>2],KP(u,s,l),t[r>>2]=u,m=n,e|0}function KP(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=cn(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1916,t[r+12>>2]=n,t[e+4>>2]=r}function XP(e){e=e|0,Pv(e),yt(e)}function QP(e){e=e|0,e=t[e+12>>2]|0,e|0&&yt(e)}function JP(e){e=e|0,yt(e)}function ZP(){var e=0;return p[8088]|0||(uI(11076),Ht(25,11076,he|0)|0,e=8088,t[e>>2]=1,t[e+4>>2]=0),11076}function $P(e,n){e=e|0,n=n|0,t[e>>2]=eI()|0,t[e+4>>2]=tI()|0,t[e+12>>2]=n,t[e+8>>2]=nI()|0,t[e+32>>2]=10}function eI(){return 11745}function tI(){return 1940}function nI(){return O1()|0}function rI(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0,(Pl(u,896)|0)==512?r|0&&(iI(r),yt(r)):n|0&&yt(n)}function iI(e){e=e|0,e=t[e+4>>2]|0,e|0&&J2(e)}function uI(e){e=e|0,Ha(e)}function jf(e,n){e=e|0,n=n|0,t[e>>2]=n}function qE(e){return e=e|0,t[e>>2]|0}function oI(e){return e=e|0,p[t[e>>2]>>0]|0}function lI(e,n){e=e|0,n=n|0;var r=0,u=0;r=m,m=m+16|0,u=r,t[u>>2]=t[e>>2],sI(n,u)|0,m=r}function sI(e,n){e=e|0,n=n|0;var r=0;return r=aI(t[e>>2]|0,n)|0,n=e+4|0,t[(t[n>>2]|0)+8>>2]=r,t[(t[n>>2]|0)+8>>2]|0}function aI(e,n){e=e|0,n=n|0;var r=0,u=0;return r=m,m=m+16|0,u=r,Ta(u),e=vo(e)|0,n=fI(e,t[n>>2]|0)|0,Ca(u),m=r,n|0}function Ta(e){e=e|0,t[e>>2]=t[2701],t[e+4>>2]=t[2703]}function fI(e,n){e=e|0,n=n|0;var r=0;return r=mo(cI()|0)|0,ji(0,r|0,e|0,bE(n)|0)|0}function Ca(e){e=e|0,g8(t[e>>2]|0,t[e+4>>2]|0)}function cI(){var e=0;return p[8096]|0||(dI(11120),e=8096,t[e>>2]=1,t[e+4>>2]=0),11120}function dI(e){e=e|0,nl(e,pI()|0,1)}function pI(){return 1948}function hI(){vI()}function vI(){var e=0,n=0,r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0,Pe=0,Ee=0,ve=0;if(Ee=m,m=m+16|0,O=Ee+4|0,P=Ee,Ln(65536,10804,t[2702]|0,10812),r=$3()|0,n=t[r>>2]|0,e=t[n>>2]|0,e|0)for(u=t[r+8>>2]|0,r=t[r+4>>2]|0;Wl(e|0,k[r>>0]|0|0,p[u>>0]|0),n=n+4|0,e=t[n>>2]|0,e;)u=u+1|0,r=r+1|0;if(e=e8()|0,n=t[e>>2]|0,n|0)do xo(n|0,t[e+4>>2]|0),e=e+8|0,n=t[e>>2]|0;while((n|0)!=0);xo(mI()|0,5167),M=Mv()|0,e=t[M>>2]|0;e:do if(e|0){do yI(t[e+4>>2]|0),e=t[e>>2]|0;while((e|0)!=0);if(e=t[M>>2]|0,e|0){S=M;do{for(;l=e,e=t[e>>2]|0,l=t[l+4>>2]|0,!!(gI(l)|0);)if(t[P>>2]=S,t[O>>2]=t[P>>2],_I(M,O)|0,!e)break e;if(EI(l),S=t[S>>2]|0,n=k8(l)|0,s=lo()|0,h=m,m=m+((1*(n<<2)|0)+15&-16)|0,D=m,m=m+((1*(n<<2)|0)+15&-16)|0,n=t[(d8(l)|0)>>2]|0,n|0)for(r=h,u=D;t[r>>2]=t[(Nv(t[n+4>>2]|0)|0)>>2],t[u>>2]=t[n+8>>2],n=t[n>>2]|0,n;)r=r+4|0,u=u+4|0;ve=Nv(l)|0,n=DI(l)|0,r=k8(l)|0,u=wI(l)|0,Ao(ve|0,n|0,h|0,D|0,r|0,u|0,OE(l)|0),ci(s|0)}while((e|0)!=0)}}while(0);if(e=t[(kE()|0)>>2]|0,e|0)do ve=e+4|0,M=ME(ve)|0,l=Py(M)|0,s=Fy(M)|0,h=(by(M)|0)+1|0,D=T_(M)|0,S=M8(ve)|0,M=rr(M)|0,O=D_(ve)|0,P=HE(ve)|0,oo(0,l|0,s|0,h|0,D|0,S|0,M|0,O|0,P|0,WE(ve)|0),e=t[e>>2]|0;while((e|0)!=0);e=t[(Mv()|0)>>2]|0;e:do if(e|0){t:for(;;){if(n=t[e+4>>2]|0,n|0?(K=t[(Nv(n)|0)>>2]|0,Pe=t[(p8(n)|0)>>2]|0,Pe|0):0){r=Pe;do{n=r+4|0,u=ME(n)|0;n:do if(u|0)switch(rr(u)|0){case 0:break t;case 4:case 3:case 2:{D=Py(u)|0,S=Fy(u)|0,M=(by(u)|0)+1|0,O=T_(u)|0,P=rr(u)|0,ve=D_(n)|0,oo(K|0,D|0,S|0,M|0,O|0,0,P|0,ve|0,HE(n)|0,WE(n)|0);break n}case 1:{h=Py(u)|0,D=Fy(u)|0,S=(by(u)|0)+1|0,M=T_(u)|0,O=M8(n)|0,P=rr(u)|0,ve=D_(n)|0,oo(K|0,h|0,D|0,S|0,M|0,O|0,P|0,ve|0,HE(n)|0,WE(n)|0);break n}case 5:{M=Py(u)|0,O=Fy(u)|0,P=(by(u)|0)+1|0,ve=T_(u)|0,oo(K|0,M|0,O|0,P|0,ve|0,SI(u)|0,rr(u)|0,0,0,0);break n}default:break n}while(0);r=t[r>>2]|0}while((r|0)!=0)}if(e=t[e>>2]|0,!e)break e}Xn()}while(0);Ms(),m=Ee}function mI(){return 11703}function yI(e){e=e|0,p[e+40>>0]=0}function gI(e){return e=e|0,(p[e+40>>0]|0)!=0|0}function _I(e,n){return e=e|0,n=n|0,n=TI(n)|0,e=t[n>>2]|0,t[n>>2]=t[e>>2],yt(e),t[n>>2]|0}function EI(e){e=e|0,p[e+40>>0]=1}function k8(e){return e=e|0,t[e+20>>2]|0}function DI(e){return e=e|0,t[e+8>>2]|0}function wI(e){return e=e|0,t[e+32>>2]|0}function T_(e){return e=e|0,t[e+4>>2]|0}function M8(e){return e=e|0,t[e+4>>2]|0}function HE(e){return e=e|0,t[e+8>>2]|0}function WE(e){return e=e|0,t[e+16>>2]|0}function SI(e){return e=e|0,t[e+20>>2]|0}function TI(e){return e=e|0,t[e>>2]|0}function C_(e){e=e|0;var n=0,r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0,Pe=0,Ee=0,ve=0,Qe=0,We=0,st=0,Re=0,Fe=0,Qt=0;Qt=m,m=m+16|0,K=Qt;do if(e>>>0<245){if(M=e>>>0<11?16:e+11&-8,e=M>>>3,P=t[2783]|0,r=P>>>e,r&3|0)return n=(r&1^1)+e|0,e=11172+(n<<1<<2)|0,r=e+8|0,u=t[r>>2]|0,l=u+8|0,s=t[l>>2]|0,(e|0)==(s|0)?t[2783]=P&~(1<>2]=e,t[r>>2]=s),Fe=n<<3,t[u+4>>2]=Fe|3,Fe=u+Fe+4|0,t[Fe>>2]=t[Fe>>2]|1,Fe=l,m=Qt,Fe|0;if(O=t[2785]|0,M>>>0>O>>>0){if(r|0)return n=2<>>12&16,n=n>>>h,r=n>>>5&8,n=n>>>r,l=n>>>2&4,n=n>>>l,e=n>>>1&2,n=n>>>e,u=n>>>1&1,u=(r|h|l|e|u)+(n>>>u)|0,n=11172+(u<<1<<2)|0,e=n+8|0,l=t[e>>2]|0,h=l+8|0,r=t[h>>2]|0,(n|0)==(r|0)?(e=P&~(1<>2]=n,t[e>>2]=r,e=P),s=(u<<3)-M|0,t[l+4>>2]=M|3,u=l+M|0,t[u+4>>2]=s|1,t[u+s>>2]=s,O|0&&(l=t[2788]|0,n=O>>>3,r=11172+(n<<1<<2)|0,n=1<>2]|0):(t[2783]=e|n,n=r,e=r+8|0),t[e>>2]=l,t[n+12>>2]=l,t[l+8>>2]=n,t[l+12>>2]=r),t[2785]=s,t[2788]=u,Fe=h,m=Qt,Fe|0;if(D=t[2784]|0,D){if(r=(D&0-D)+-1|0,h=r>>>12&16,r=r>>>h,s=r>>>5&8,r=r>>>s,S=r>>>2&4,r=r>>>S,u=r>>>1&2,r=r>>>u,e=r>>>1&1,e=t[11436+((s|h|S|u|e)+(r>>>e)<<2)>>2]|0,r=(t[e+4>>2]&-8)-M|0,u=t[e+16+(((t[e+16>>2]|0)==0&1)<<2)>>2]|0,!u)S=e,s=r;else{do h=(t[u+4>>2]&-8)-M|0,S=h>>>0>>0,r=S?h:r,e=S?u:e,u=t[u+16+(((t[u+16>>2]|0)==0&1)<<2)>>2]|0;while((u|0)!=0);S=e,s=r}if(h=S+M|0,S>>>0>>0){l=t[S+24>>2]|0,n=t[S+12>>2]|0;do if((n|0)==(S|0)){if(e=S+20|0,n=t[e>>2]|0,!n&&(e=S+16|0,n=t[e>>2]|0,!n)){r=0;break}for(;;){if(r=n+20|0,u=t[r>>2]|0,u|0){n=u,e=r;continue}if(r=n+16|0,u=t[r>>2]|0,u)n=u,e=r;else break}t[e>>2]=0,r=n}else r=t[S+8>>2]|0,t[r+12>>2]=n,t[n+8>>2]=r,r=n;while(0);do if(l|0){if(n=t[S+28>>2]|0,e=11436+(n<<2)|0,(S|0)==(t[e>>2]|0)){if(t[e>>2]=r,!r){t[2784]=D&~(1<>2]|0)!=(S|0)&1)<<2)>>2]=r,!r)break;t[r+24>>2]=l,n=t[S+16>>2]|0,n|0&&(t[r+16>>2]=n,t[n+24>>2]=r),n=t[S+20>>2]|0,n|0&&(t[r+20>>2]=n,t[n+24>>2]=r)}while(0);return s>>>0<16?(Fe=s+M|0,t[S+4>>2]=Fe|3,Fe=S+Fe+4|0,t[Fe>>2]=t[Fe>>2]|1):(t[S+4>>2]=M|3,t[h+4>>2]=s|1,t[h+s>>2]=s,O|0&&(u=t[2788]|0,n=O>>>3,r=11172+(n<<1<<2)|0,n=1<>2]|0):(t[2783]=P|n,n=r,e=r+8|0),t[e>>2]=u,t[n+12>>2]=u,t[u+8>>2]=n,t[u+12>>2]=r),t[2785]=s,t[2788]=h),Fe=S+8|0,m=Qt,Fe|0}else P=M}else P=M}else P=M}else if(e>>>0<=4294967231)if(e=e+11|0,M=e&-8,S=t[2784]|0,S){u=0-M|0,e=e>>>8,e?M>>>0>16777215?D=31:(P=(e+1048320|0)>>>16&8,Re=e<>>16&4,Re=Re<>>16&2,D=14-(O|P|D)+(Re<>>15)|0,D=M>>>(D+7|0)&1|D<<1):D=0,r=t[11436+(D<<2)>>2]|0;e:do if(!r)r=0,e=0,Re=57;else for(e=0,h=M<<((D|0)==31?0:25-(D>>>1)|0),s=0;;){if(l=(t[r+4>>2]&-8)-M|0,l>>>0>>0)if(l)e=r,u=l;else{e=r,u=0,l=r,Re=61;break e}if(l=t[r+20>>2]|0,r=t[r+16+(h>>>31<<2)>>2]|0,s=(l|0)==0|(l|0)==(r|0)?s:l,l=(r|0)==0,l){r=s,Re=57;break}else h=h<<((l^1)&1)}while(0);if((Re|0)==57){if((r|0)==0&(e|0)==0){if(e=2<>>12&16,P=P>>>h,s=P>>>5&8,P=P>>>s,D=P>>>2&4,P=P>>>D,O=P>>>1&2,P=P>>>O,r=P>>>1&1,e=0,r=t[11436+((s|h|D|O|r)+(P>>>r)<<2)>>2]|0}r?(l=r,Re=61):(D=e,h=u)}if((Re|0)==61)for(;;)if(Re=0,r=(t[l+4>>2]&-8)-M|0,P=r>>>0>>0,r=P?r:u,e=P?l:e,l=t[l+16+(((t[l+16>>2]|0)==0&1)<<2)>>2]|0,l)u=r,Re=61;else{D=e,h=r;break}if((D|0)!=0?h>>>0<((t[2785]|0)-M|0)>>>0:0){if(s=D+M|0,D>>>0>=s>>>0)return Fe=0,m=Qt,Fe|0;l=t[D+24>>2]|0,n=t[D+12>>2]|0;do if((n|0)==(D|0)){if(e=D+20|0,n=t[e>>2]|0,!n&&(e=D+16|0,n=t[e>>2]|0,!n)){n=0;break}for(;;){if(r=n+20|0,u=t[r>>2]|0,u|0){n=u,e=r;continue}if(r=n+16|0,u=t[r>>2]|0,u)n=u,e=r;else break}t[e>>2]=0}else Fe=t[D+8>>2]|0,t[Fe+12>>2]=n,t[n+8>>2]=Fe;while(0);do if(l){if(e=t[D+28>>2]|0,r=11436+(e<<2)|0,(D|0)==(t[r>>2]|0)){if(t[r>>2]=n,!n){u=S&~(1<>2]|0)!=(D|0)&1)<<2)>>2]=n,!n){u=S;break}t[n+24>>2]=l,e=t[D+16>>2]|0,e|0&&(t[n+16>>2]=e,t[e+24>>2]=n),e=t[D+20>>2]|0,e&&(t[n+20>>2]=e,t[e+24>>2]=n),u=S}else u=S;while(0);do if(h>>>0>=16){if(t[D+4>>2]=M|3,t[s+4>>2]=h|1,t[s+h>>2]=h,n=h>>>3,h>>>0<256){r=11172+(n<<1<<2)|0,e=t[2783]|0,n=1<>2]|0):(t[2783]=e|n,n=r,e=r+8|0),t[e>>2]=s,t[n+12>>2]=s,t[s+8>>2]=n,t[s+12>>2]=r;break}if(n=h>>>8,n?h>>>0>16777215?n=31:(Re=(n+1048320|0)>>>16&8,Fe=n<>>16&4,Fe=Fe<>>16&2,n=14-(st|Re|n)+(Fe<>>15)|0,n=h>>>(n+7|0)&1|n<<1):n=0,r=11436+(n<<2)|0,t[s+28>>2]=n,e=s+16|0,t[e+4>>2]=0,t[e>>2]=0,e=1<>2]=s,t[s+24>>2]=r,t[s+12>>2]=s,t[s+8>>2]=s;break}for(e=h<<((n|0)==31?0:25-(n>>>1)|0),r=t[r>>2]|0;;){if((t[r+4>>2]&-8|0)==(h|0)){Re=97;break}if(u=r+16+(e>>>31<<2)|0,n=t[u>>2]|0,n)e=e<<1,r=n;else{Re=96;break}}if((Re|0)==96){t[u>>2]=s,t[s+24>>2]=r,t[s+12>>2]=s,t[s+8>>2]=s;break}else if((Re|0)==97){Re=r+8|0,Fe=t[Re>>2]|0,t[Fe+12>>2]=s,t[Re>>2]=s,t[s+8>>2]=Fe,t[s+12>>2]=r,t[s+24>>2]=0;break}}else Fe=h+M|0,t[D+4>>2]=Fe|3,Fe=D+Fe+4|0,t[Fe>>2]=t[Fe>>2]|1;while(0);return Fe=D+8|0,m=Qt,Fe|0}else P=M}else P=M;else P=-1;while(0);if(r=t[2785]|0,r>>>0>=P>>>0)return n=r-P|0,e=t[2788]|0,n>>>0>15?(Fe=e+P|0,t[2788]=Fe,t[2785]=n,t[Fe+4>>2]=n|1,t[Fe+n>>2]=n,t[e+4>>2]=P|3):(t[2785]=0,t[2788]=0,t[e+4>>2]=r|3,Fe=e+r+4|0,t[Fe>>2]=t[Fe>>2]|1),Fe=e+8|0,m=Qt,Fe|0;if(h=t[2786]|0,h>>>0>P>>>0)return st=h-P|0,t[2786]=st,Fe=t[2789]|0,Re=Fe+P|0,t[2789]=Re,t[Re+4>>2]=st|1,t[Fe+4>>2]=P|3,Fe=Fe+8|0,m=Qt,Fe|0;if(t[2901]|0?e=t[2903]|0:(t[2903]=4096,t[2902]=4096,t[2904]=-1,t[2905]=-1,t[2906]=0,t[2894]=0,e=K&-16^1431655768,t[K>>2]=e,t[2901]=e,e=4096),D=P+48|0,S=P+47|0,s=e+S|0,l=0-e|0,M=s&l,M>>>0<=P>>>0||(e=t[2893]|0,e|0?(O=t[2891]|0,K=O+M|0,K>>>0<=O>>>0|K>>>0>e>>>0):0))return Fe=0,m=Qt,Fe|0;e:do if(t[2894]&4)n=0,Re=133;else{r=t[2789]|0;t:do if(r){for(u=11580;e=t[u>>2]|0,!(e>>>0<=r>>>0?(ve=u+4|0,(e+(t[ve>>2]|0)|0)>>>0>r>>>0):0);)if(e=t[u+8>>2]|0,e)u=e;else{Re=118;break t}if(n=s-h&l,n>>>0<2147483647)if(e=Z2(n|0)|0,(e|0)==((t[u>>2]|0)+(t[ve>>2]|0)|0)){if((e|0)!=(-1|0)){h=n,s=e,Re=135;break e}}else u=e,Re=126;else n=0}else Re=118;while(0);do if((Re|0)==118)if(r=Z2(0)|0,(r|0)!=(-1|0)?(n=r,Pe=t[2902]|0,Ee=Pe+-1|0,n=((Ee&n|0)==0?0:(Ee+n&0-Pe)-n|0)+M|0,Pe=t[2891]|0,Ee=n+Pe|0,n>>>0>P>>>0&n>>>0<2147483647):0){if(ve=t[2893]|0,ve|0?Ee>>>0<=Pe>>>0|Ee>>>0>ve>>>0:0){n=0;break}if(e=Z2(n|0)|0,(e|0)==(r|0)){h=n,s=r,Re=135;break e}else u=e,Re=126}else n=0;while(0);do if((Re|0)==126){if(r=0-n|0,!(D>>>0>n>>>0&(n>>>0<2147483647&(u|0)!=(-1|0))))if((u|0)==(-1|0)){n=0;break}else{h=n,s=u,Re=135;break e}if(e=t[2903]|0,e=S-n+e&0-e,e>>>0>=2147483647){h=n,s=u,Re=135;break e}if((Z2(e|0)|0)==(-1|0)){Z2(r|0)|0,n=0;break}else{h=e+n|0,s=u,Re=135;break e}}while(0);t[2894]=t[2894]|4,Re=133}while(0);if((((Re|0)==133?M>>>0<2147483647:0)?(st=Z2(M|0)|0,ve=Z2(0)|0,Qe=ve-st|0,We=Qe>>>0>(P+40|0)>>>0,!((st|0)==(-1|0)|We^1|st>>>0>>0&((st|0)!=(-1|0)&(ve|0)!=(-1|0))^1)):0)&&(h=We?Qe:n,s=st,Re=135),(Re|0)==135){n=(t[2891]|0)+h|0,t[2891]=n,n>>>0>(t[2892]|0)>>>0&&(t[2892]=n),S=t[2789]|0;do if(S){for(n=11580;;){if(e=t[n>>2]|0,r=n+4|0,u=t[r>>2]|0,(s|0)==(e+u|0)){Re=145;break}if(l=t[n+8>>2]|0,l)n=l;else break}if(((Re|0)==145?(t[n+12>>2]&8|0)==0:0)?S>>>0>>0&S>>>0>=e>>>0:0){t[r>>2]=u+h,Fe=S+8|0,Fe=(Fe&7|0)==0?0:0-Fe&7,Re=S+Fe|0,Fe=(t[2786]|0)+(h-Fe)|0,t[2789]=Re,t[2786]=Fe,t[Re+4>>2]=Fe|1,t[Re+Fe+4>>2]=40,t[2790]=t[2905];break}for(s>>>0<(t[2787]|0)>>>0&&(t[2787]=s),r=s+h|0,n=11580;;){if((t[n>>2]|0)==(r|0)){Re=153;break}if(e=t[n+8>>2]|0,e)n=e;else break}if((Re|0)==153?(t[n+12>>2]&8|0)==0:0){t[n>>2]=s,O=n+4|0,t[O>>2]=(t[O>>2]|0)+h,O=s+8|0,O=s+((O&7|0)==0?0:0-O&7)|0,n=r+8|0,n=r+((n&7|0)==0?0:0-n&7)|0,M=O+P|0,D=n-O-P|0,t[O+4>>2]=P|3;do if((n|0)!=(S|0)){if((n|0)==(t[2788]|0)){Fe=(t[2785]|0)+D|0,t[2785]=Fe,t[2788]=M,t[M+4>>2]=Fe|1,t[M+Fe>>2]=Fe;break}if(e=t[n+4>>2]|0,(e&3|0)==1){h=e&-8,u=e>>>3;e:do if(e>>>0<256)if(e=t[n+8>>2]|0,r=t[n+12>>2]|0,(r|0)==(e|0)){t[2783]=t[2783]&~(1<>2]=r,t[r+8>>2]=e;break}else{s=t[n+24>>2]|0,e=t[n+12>>2]|0;do if((e|0)==(n|0)){if(u=n+16|0,r=u+4|0,e=t[r>>2]|0,!e)if(e=t[u>>2]|0,e)r=u;else{e=0;break}for(;;){if(u=e+20|0,l=t[u>>2]|0,l|0){e=l,r=u;continue}if(u=e+16|0,l=t[u>>2]|0,l)e=l,r=u;else break}t[r>>2]=0}else Fe=t[n+8>>2]|0,t[Fe+12>>2]=e,t[e+8>>2]=Fe;while(0);if(!s)break;r=t[n+28>>2]|0,u=11436+(r<<2)|0;do if((n|0)!=(t[u>>2]|0)){if(t[s+16+(((t[s+16>>2]|0)!=(n|0)&1)<<2)>>2]=e,!e)break e}else{if(t[u>>2]=e,e|0)break;t[2784]=t[2784]&~(1<>2]=s,r=n+16|0,u=t[r>>2]|0,u|0&&(t[e+16>>2]=u,t[u+24>>2]=e),r=t[r+4>>2]|0,!r)break;t[e+20>>2]=r,t[r+24>>2]=e}while(0);n=n+h|0,l=h+D|0}else l=D;if(n=n+4|0,t[n>>2]=t[n>>2]&-2,t[M+4>>2]=l|1,t[M+l>>2]=l,n=l>>>3,l>>>0<256){r=11172+(n<<1<<2)|0,e=t[2783]|0,n=1<>2]|0):(t[2783]=e|n,n=r,e=r+8|0),t[e>>2]=M,t[n+12>>2]=M,t[M+8>>2]=n,t[M+12>>2]=r;break}n=l>>>8;do if(!n)n=0;else{if(l>>>0>16777215){n=31;break}Re=(n+1048320|0)>>>16&8,Fe=n<>>16&4,Fe=Fe<>>16&2,n=14-(st|Re|n)+(Fe<>>15)|0,n=l>>>(n+7|0)&1|n<<1}while(0);if(u=11436+(n<<2)|0,t[M+28>>2]=n,e=M+16|0,t[e+4>>2]=0,t[e>>2]=0,e=t[2784]|0,r=1<>2]=M,t[M+24>>2]=u,t[M+12>>2]=M,t[M+8>>2]=M;break}for(e=l<<((n|0)==31?0:25-(n>>>1)|0),r=t[u>>2]|0;;){if((t[r+4>>2]&-8|0)==(l|0)){Re=194;break}if(u=r+16+(e>>>31<<2)|0,n=t[u>>2]|0,n)e=e<<1,r=n;else{Re=193;break}}if((Re|0)==193){t[u>>2]=M,t[M+24>>2]=r,t[M+12>>2]=M,t[M+8>>2]=M;break}else if((Re|0)==194){Re=r+8|0,Fe=t[Re>>2]|0,t[Fe+12>>2]=M,t[Re>>2]=M,t[M+8>>2]=Fe,t[M+12>>2]=r,t[M+24>>2]=0;break}}else Fe=(t[2786]|0)+D|0,t[2786]=Fe,t[2789]=M,t[M+4>>2]=Fe|1;while(0);return Fe=O+8|0,m=Qt,Fe|0}for(n=11580;e=t[n>>2]|0,!(e>>>0<=S>>>0?(Fe=e+(t[n+4>>2]|0)|0,Fe>>>0>S>>>0):0);)n=t[n+8>>2]|0;l=Fe+-47|0,e=l+8|0,e=l+((e&7|0)==0?0:0-e&7)|0,l=S+16|0,e=e>>>0>>0?S:e,n=e+8|0,r=s+8|0,r=(r&7|0)==0?0:0-r&7,Re=s+r|0,r=h+-40-r|0,t[2789]=Re,t[2786]=r,t[Re+4>>2]=r|1,t[Re+r+4>>2]=40,t[2790]=t[2905],r=e+4|0,t[r>>2]=27,t[n>>2]=t[2895],t[n+4>>2]=t[2896],t[n+8>>2]=t[2897],t[n+12>>2]=t[2898],t[2895]=s,t[2896]=h,t[2898]=0,t[2897]=n,n=e+24|0;do Re=n,n=n+4|0,t[n>>2]=7;while((Re+8|0)>>>0>>0);if((e|0)!=(S|0)){if(s=e-S|0,t[r>>2]=t[r>>2]&-2,t[S+4>>2]=s|1,t[e>>2]=s,n=s>>>3,s>>>0<256){r=11172+(n<<1<<2)|0,e=t[2783]|0,n=1<>2]|0):(t[2783]=e|n,n=r,e=r+8|0),t[e>>2]=S,t[n+12>>2]=S,t[S+8>>2]=n,t[S+12>>2]=r;break}if(n=s>>>8,n?s>>>0>16777215?r=31:(Re=(n+1048320|0)>>>16&8,Fe=n<>>16&4,Fe=Fe<>>16&2,r=14-(st|Re|r)+(Fe<>>15)|0,r=s>>>(r+7|0)&1|r<<1):r=0,u=11436+(r<<2)|0,t[S+28>>2]=r,t[S+20>>2]=0,t[l>>2]=0,n=t[2784]|0,e=1<>2]=S,t[S+24>>2]=u,t[S+12>>2]=S,t[S+8>>2]=S;break}for(e=s<<((r|0)==31?0:25-(r>>>1)|0),r=t[u>>2]|0;;){if((t[r+4>>2]&-8|0)==(s|0)){Re=216;break}if(u=r+16+(e>>>31<<2)|0,n=t[u>>2]|0,n)e=e<<1,r=n;else{Re=215;break}}if((Re|0)==215){t[u>>2]=S,t[S+24>>2]=r,t[S+12>>2]=S,t[S+8>>2]=S;break}else if((Re|0)==216){Re=r+8|0,Fe=t[Re>>2]|0,t[Fe+12>>2]=S,t[Re>>2]=S,t[S+8>>2]=Fe,t[S+12>>2]=r,t[S+24>>2]=0;break}}}else{Fe=t[2787]|0,(Fe|0)==0|s>>>0>>0&&(t[2787]=s),t[2895]=s,t[2896]=h,t[2898]=0,t[2792]=t[2901],t[2791]=-1,n=0;do Fe=11172+(n<<1<<2)|0,t[Fe+12>>2]=Fe,t[Fe+8>>2]=Fe,n=n+1|0;while((n|0)!=32);Fe=s+8|0,Fe=(Fe&7|0)==0?0:0-Fe&7,Re=s+Fe|0,Fe=h+-40-Fe|0,t[2789]=Re,t[2786]=Fe,t[Re+4>>2]=Fe|1,t[Re+Fe+4>>2]=40,t[2790]=t[2905]}while(0);if(n=t[2786]|0,n>>>0>P>>>0)return st=n-P|0,t[2786]=st,Fe=t[2789]|0,Re=Fe+P|0,t[2789]=Re,t[Re+4>>2]=st|1,t[Fe+4>>2]=P|3,Fe=Fe+8|0,m=Qt,Fe|0}return t[(Fv()|0)>>2]=12,Fe=0,m=Qt,Fe|0}function x_(e){e=e|0;var n=0,r=0,u=0,l=0,s=0,h=0,D=0,S=0;if(!!e){r=e+-8|0,l=t[2787]|0,e=t[e+-4>>2]|0,n=e&-8,S=r+n|0;do if(e&1)D=r,h=r;else{if(u=t[r>>2]|0,!(e&3)||(h=r+(0-u)|0,s=u+n|0,h>>>0>>0))return;if((h|0)==(t[2788]|0)){if(e=S+4|0,n=t[e>>2]|0,(n&3|0)!=3){D=h,n=s;break}t[2785]=s,t[e>>2]=n&-2,t[h+4>>2]=s|1,t[h+s>>2]=s;return}if(r=u>>>3,u>>>0<256)if(e=t[h+8>>2]|0,n=t[h+12>>2]|0,(n|0)==(e|0)){t[2783]=t[2783]&~(1<>2]=n,t[n+8>>2]=e,D=h,n=s;break}l=t[h+24>>2]|0,e=t[h+12>>2]|0;do if((e|0)==(h|0)){if(r=h+16|0,n=r+4|0,e=t[n>>2]|0,!e)if(e=t[r>>2]|0,e)n=r;else{e=0;break}for(;;){if(r=e+20|0,u=t[r>>2]|0,u|0){e=u,n=r;continue}if(r=e+16|0,u=t[r>>2]|0,u)e=u,n=r;else break}t[n>>2]=0}else D=t[h+8>>2]|0,t[D+12>>2]=e,t[e+8>>2]=D;while(0);if(l){if(n=t[h+28>>2]|0,r=11436+(n<<2)|0,(h|0)==(t[r>>2]|0)){if(t[r>>2]=e,!e){t[2784]=t[2784]&~(1<>2]|0)!=(h|0)&1)<<2)>>2]=e,!e){D=h,n=s;break}t[e+24>>2]=l,n=h+16|0,r=t[n>>2]|0,r|0&&(t[e+16>>2]=r,t[r+24>>2]=e),n=t[n+4>>2]|0,n?(t[e+20>>2]=n,t[n+24>>2]=e,D=h,n=s):(D=h,n=s)}else D=h,n=s}while(0);if(!(h>>>0>=S>>>0)&&(e=S+4|0,u=t[e>>2]|0,!!(u&1))){if(u&2)t[e>>2]=u&-2,t[D+4>>2]=n|1,t[h+n>>2]=n,l=n;else{if(e=t[2788]|0,(S|0)==(t[2789]|0)){if(S=(t[2786]|0)+n|0,t[2786]=S,t[2789]=D,t[D+4>>2]=S|1,(D|0)!=(e|0))return;t[2788]=0,t[2785]=0;return}if((S|0)==(e|0)){S=(t[2785]|0)+n|0,t[2785]=S,t[2788]=h,t[D+4>>2]=S|1,t[h+S>>2]=S;return}l=(u&-8)+n|0,r=u>>>3;do if(u>>>0<256)if(n=t[S+8>>2]|0,e=t[S+12>>2]|0,(e|0)==(n|0)){t[2783]=t[2783]&~(1<>2]=e,t[e+8>>2]=n;break}else{s=t[S+24>>2]|0,e=t[S+12>>2]|0;do if((e|0)==(S|0)){if(r=S+16|0,n=r+4|0,e=t[n>>2]|0,!e)if(e=t[r>>2]|0,e)n=r;else{r=0;break}for(;;){if(r=e+20|0,u=t[r>>2]|0,u|0){e=u,n=r;continue}if(r=e+16|0,u=t[r>>2]|0,u)e=u,n=r;else break}t[n>>2]=0,r=e}else r=t[S+8>>2]|0,t[r+12>>2]=e,t[e+8>>2]=r,r=e;while(0);if(s|0){if(e=t[S+28>>2]|0,n=11436+(e<<2)|0,(S|0)==(t[n>>2]|0)){if(t[n>>2]=r,!r){t[2784]=t[2784]&~(1<>2]|0)!=(S|0)&1)<<2)>>2]=r,!r)break;t[r+24>>2]=s,e=S+16|0,n=t[e>>2]|0,n|0&&(t[r+16>>2]=n,t[n+24>>2]=r),e=t[e+4>>2]|0,e|0&&(t[r+20>>2]=e,t[e+24>>2]=r)}}while(0);if(t[D+4>>2]=l|1,t[h+l>>2]=l,(D|0)==(t[2788]|0)){t[2785]=l;return}}if(e=l>>>3,l>>>0<256){r=11172+(e<<1<<2)|0,n=t[2783]|0,e=1<>2]|0):(t[2783]=n|e,e=r,n=r+8|0),t[n>>2]=D,t[e+12>>2]=D,t[D+8>>2]=e,t[D+12>>2]=r;return}e=l>>>8,e?l>>>0>16777215?e=31:(h=(e+1048320|0)>>>16&8,S=e<>>16&4,S=S<>>16&2,e=14-(s|h|e)+(S<>>15)|0,e=l>>>(e+7|0)&1|e<<1):e=0,u=11436+(e<<2)|0,t[D+28>>2]=e,t[D+20>>2]=0,t[D+16>>2]=0,n=t[2784]|0,r=1<>>1)|0),r=t[u>>2]|0;;){if((t[r+4>>2]&-8|0)==(l|0)){e=73;break}if(u=r+16+(n>>>31<<2)|0,e=t[u>>2]|0,e)n=n<<1,r=e;else{e=72;break}}if((e|0)==72){t[u>>2]=D,t[D+24>>2]=r,t[D+12>>2]=D,t[D+8>>2]=D;break}else if((e|0)==73){h=r+8|0,S=t[h>>2]|0,t[S+12>>2]=D,t[h>>2]=D,t[D+8>>2]=S,t[D+12>>2]=r,t[D+24>>2]=0;break}}else t[2784]=n|r,t[u>>2]=D,t[D+24>>2]=u,t[D+12>>2]=D,t[D+8>>2]=D;while(0);if(S=(t[2791]|0)+-1|0,t[2791]=S,!S)e=11588;else return;for(;e=t[e>>2]|0,e;)e=e+8|0;t[2791]=-1}}}function CI(){return 11628}function xI(e){e=e|0;var n=0,r=0;return n=m,m=m+16|0,r=n,t[r>>2]=OI(t[e+60>>2]|0)|0,e=A_(wu(6,r|0)|0)|0,m=n,e|0}function N8(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0,Pe=0;P=m,m=m+48|0,M=P+16|0,s=P,l=P+32|0,D=e+28|0,u=t[D>>2]|0,t[l>>2]=u,S=e+20|0,u=(t[S>>2]|0)-u|0,t[l+4>>2]=u,t[l+8>>2]=n,t[l+12>>2]=r,u=u+r|0,h=e+60|0,t[s>>2]=t[h>>2],t[s+4>>2]=l,t[s+8>>2]=2,s=A_(d0(146,s|0)|0)|0;e:do if((u|0)!=(s|0)){for(n=2;!((s|0)<0);)if(u=u-s|0,Pe=t[l+4>>2]|0,K=s>>>0>Pe>>>0,l=K?l+8|0:l,n=(K<<31>>31)+n|0,Pe=s-(K?Pe:0)|0,t[l>>2]=(t[l>>2]|0)+Pe,K=l+4|0,t[K>>2]=(t[K>>2]|0)-Pe,t[M>>2]=t[h>>2],t[M+4>>2]=l,t[M+8>>2]=n,s=A_(d0(146,M|0)|0)|0,(u|0)==(s|0)){O=3;break e}t[e+16>>2]=0,t[D>>2]=0,t[S>>2]=0,t[e>>2]=t[e>>2]|32,(n|0)==2?r=0:r=r-(t[l+4>>2]|0)|0}else O=3;while(0);return(O|0)==3&&(Pe=t[e+44>>2]|0,t[e+16>>2]=Pe+(t[e+48>>2]|0),t[D>>2]=Pe,t[S>>2]=Pe),m=P,r|0}function AI(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0;return l=m,m=m+32|0,s=l,u=l+20|0,t[s>>2]=t[e+60>>2],t[s+4>>2]=0,t[s+8>>2]=n,t[s+12>>2]=u,t[s+16>>2]=r,(A_(Ti(140,s|0)|0)|0)<0?(t[u>>2]=-1,e=-1):e=t[u>>2]|0,m=l,e|0}function A_(e){return e=e|0,e>>>0>4294963200&&(t[(Fv()|0)>>2]=0-e,e=-1),e|0}function Fv(){return(RI()|0)+64|0}function RI(){return VE()|0}function VE(){return 2084}function OI(e){return e=e|0,e|0}function kI(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0;return l=m,m=m+32|0,u=l,t[e+36>>2]=1,((t[e>>2]&64|0)==0?(t[u>>2]=t[e+60>>2],t[u+4>>2]=21523,t[u+8>>2]=l+16,b0(54,u|0)|0):0)&&(p[e+75>>0]=-1),u=N8(e,n,r)|0,m=l,u|0}function L8(e,n){e=e|0,n=n|0;var r=0,u=0;if(r=p[e>>0]|0,u=p[n>>0]|0,r<<24>>24==0?1:r<<24>>24!=u<<24>>24)e=u;else{do e=e+1|0,n=n+1|0,r=p[e>>0]|0,u=p[n>>0]|0;while(!(r<<24>>24==0?1:r<<24>>24!=u<<24>>24));e=u}return(r&255)-(e&255)|0}function MI(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0;e:do if(!r)e=0;else{for(;u=p[e>>0]|0,l=p[n>>0]|0,u<<24>>24==l<<24>>24;)if(r=r+-1|0,r)e=e+1|0,n=n+1|0;else{e=0;break e}e=(u&255)-(l&255)|0}while(0);return e|0}function F8(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0,Pe=0,Ee=0,ve=0;ve=m,m=m+224|0,O=ve+120|0,P=ve+80|0,Pe=ve,Ee=ve+136|0,u=P,l=u+40|0;do t[u>>2]=0,u=u+4|0;while((u|0)<(l|0));return t[O>>2]=t[r>>2],(GE(0,n,O,Pe,P)|0)<0?r=-1:((t[e+76>>2]|0)>-1?K=NI(e)|0:K=0,r=t[e>>2]|0,M=r&32,(p[e+74>>0]|0)<1&&(t[e>>2]=r&-33),u=e+48|0,t[u>>2]|0?r=GE(e,n,O,Pe,P)|0:(l=e+44|0,s=t[l>>2]|0,t[l>>2]=Ee,h=e+28|0,t[h>>2]=Ee,D=e+20|0,t[D>>2]=Ee,t[u>>2]=80,S=e+16|0,t[S>>2]=Ee+80,r=GE(e,n,O,Pe,P)|0,s&&(M_[t[e+36>>2]&7](e,0,0)|0,r=(t[D>>2]|0)==0?-1:r,t[l>>2]=s,t[u>>2]=0,t[S>>2]=0,t[h>>2]=0,t[D>>2]=0)),u=t[e>>2]|0,t[e>>2]=u|M,K|0&&LI(e),r=(u&32|0)==0?r:-1),m=ve,r|0}function GE(e,n,r,u,l){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0;var s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0,Pe=0,Ee=0,ve=0,Qe=0,We=0,st=0,Re=0,Fe=0,Qt=0,Lr=0,Nn=0,mn=0,hr=0,kr=0,On=0;On=m,m=m+64|0,Nn=On+16|0,mn=On,Qt=On+24|0,hr=On+8|0,kr=On+20|0,t[Nn>>2]=n,st=(e|0)!=0,Re=Qt+40|0,Fe=Re,Qt=Qt+39|0,Lr=hr+4|0,h=0,s=0,O=0;e:for(;;){do if((s|0)>-1)if((h|0)>(2147483647-s|0)){t[(Fv()|0)>>2]=75,s=-1;break}else{s=h+s|0;break}while(0);if(h=p[n>>0]|0,h<<24>>24)D=n;else{We=87;break}t:for(;;){switch(h<<24>>24){case 37:{h=D,We=9;break t}case 0:{h=D;break t}default:}Qe=D+1|0,t[Nn>>2]=Qe,h=p[Qe>>0]|0,D=Qe}t:do if((We|0)==9)for(;;){if(We=0,(p[D+1>>0]|0)!=37)break t;if(h=h+1|0,D=D+2|0,t[Nn>>2]=D,(p[D>>0]|0)==37)We=9;else break}while(0);if(h=h-n|0,st&&qo(e,n,h),h|0){n=D;continue}S=D+1|0,h=(p[S>>0]|0)+-48|0,h>>>0<10?(Qe=(p[D+2>>0]|0)==36,ve=Qe?h:-1,O=Qe?1:O,S=Qe?D+3|0:S):ve=-1,t[Nn>>2]=S,h=p[S>>0]|0,D=(h<<24>>24)+-32|0;t:do if(D>>>0<32)for(M=0,P=h;;){if(h=1<>2]=S,h=p[S>>0]|0,D=(h<<24>>24)+-32|0,D>>>0>=32)break;P=h}else M=0;while(0);if(h<<24>>24==42){if(D=S+1|0,h=(p[D>>0]|0)+-48|0,h>>>0<10?(p[S+2>>0]|0)==36:0)t[l+(h<<2)>>2]=10,h=t[u+((p[D>>0]|0)+-48<<3)>>2]|0,O=1,S=S+3|0;else{if(O|0){s=-1;break}st?(O=(t[r>>2]|0)+(4-1)&~(4-1),h=t[O>>2]|0,t[r>>2]=O+4,O=0,S=D):(h=0,O=0,S=D)}t[Nn>>2]=S,Qe=(h|0)<0,h=Qe?0-h|0:h,M=Qe?M|8192:M}else{if(h=b8(Nn)|0,(h|0)<0){s=-1;break}S=t[Nn>>2]|0}do if((p[S>>0]|0)==46){if((p[S+1>>0]|0)!=42){t[Nn>>2]=S+1,D=b8(Nn)|0,S=t[Nn>>2]|0;break}if(P=S+2|0,D=(p[P>>0]|0)+-48|0,D>>>0<10?(p[S+3>>0]|0)==36:0){t[l+(D<<2)>>2]=10,D=t[u+((p[P>>0]|0)+-48<<3)>>2]|0,S=S+4|0,t[Nn>>2]=S;break}if(O|0){s=-1;break e}st?(Qe=(t[r>>2]|0)+(4-1)&~(4-1),D=t[Qe>>2]|0,t[r>>2]=Qe+4):D=0,t[Nn>>2]=P,S=P}else D=-1;while(0);for(Ee=0;;){if(((p[S>>0]|0)+-65|0)>>>0>57){s=-1;break e}if(Qe=S+1|0,t[Nn>>2]=Qe,P=p[(p[S>>0]|0)+-65+(5178+(Ee*58|0))>>0]|0,K=P&255,(K+-1|0)>>>0<8)Ee=K,S=Qe;else break}if(!(P<<24>>24)){s=-1;break}Pe=(ve|0)>-1;do if(P<<24>>24==19)if(Pe){s=-1;break e}else We=49;else{if(Pe){t[l+(ve<<2)>>2]=K,Pe=u+(ve<<3)|0,ve=t[Pe+4>>2]|0,We=mn,t[We>>2]=t[Pe>>2],t[We+4>>2]=ve,We=49;break}if(!st){s=0;break e}P8(mn,K,r)}while(0);if((We|0)==49?(We=0,!st):0){h=0,n=Qe;continue}S=p[S>>0]|0,S=(Ee|0)!=0&(S&15|0)==3?S&-33:S,Pe=M&-65537,ve=(M&8192|0)==0?M:Pe;t:do switch(S|0){case 110:switch((Ee&255)<<24>>24){case 0:{t[t[mn>>2]>>2]=s,h=0,n=Qe;continue e}case 1:{t[t[mn>>2]>>2]=s,h=0,n=Qe;continue e}case 2:{h=t[mn>>2]|0,t[h>>2]=s,t[h+4>>2]=((s|0)<0)<<31>>31,h=0,n=Qe;continue e}case 3:{E[t[mn>>2]>>1]=s,h=0,n=Qe;continue e}case 4:{p[t[mn>>2]>>0]=s,h=0,n=Qe;continue e}case 6:{t[t[mn>>2]>>2]=s,h=0,n=Qe;continue e}case 7:{h=t[mn>>2]|0,t[h>>2]=s,t[h+4>>2]=((s|0)<0)<<31>>31,h=0,n=Qe;continue e}default:{h=0,n=Qe;continue e}}case 112:{S=120,D=D>>>0>8?D:8,n=ve|8,We=61;break}case 88:case 120:{n=ve,We=61;break}case 111:{S=mn,n=t[S>>2]|0,S=t[S+4>>2]|0,K=bI(n,S,Re)|0,Pe=Fe-K|0,M=0,P=5642,D=(ve&8|0)==0|(D|0)>(Pe|0)?D:Pe+1|0,Pe=ve,We=67;break}case 105:case 100:if(S=mn,n=t[S>>2]|0,S=t[S+4>>2]|0,(S|0)<0){n=R_(0,0,n|0,S|0)|0,S=ft,M=mn,t[M>>2]=n,t[M+4>>2]=S,M=1,P=5642,We=66;break t}else{M=(ve&2049|0)!=0&1,P=(ve&2048|0)==0?(ve&1|0)==0?5642:5644:5643,We=66;break t}case 117:{S=mn,M=0,P=5642,n=t[S>>2]|0,S=t[S+4>>2]|0,We=66;break}case 99:{p[Qt>>0]=t[mn>>2],n=Qt,M=0,P=5642,K=Re,S=1,D=Pe;break}case 109:{S=PI(t[(Fv()|0)>>2]|0)|0,We=71;break}case 115:{S=t[mn>>2]|0,S=S|0?S:5652,We=71;break}case 67:{t[hr>>2]=t[mn>>2],t[Lr>>2]=0,t[mn>>2]=hr,K=-1,S=hr,We=75;break}case 83:{n=t[mn>>2]|0,D?(K=D,S=n,We=75):(hl(e,32,h,0,ve),n=0,We=84);break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{h=BI(e,+U[mn>>3],h,D,ve,S)|0,n=Qe;continue e}default:M=0,P=5642,K=Re,S=D,D=ve}while(0);t:do if((We|0)==61)ve=mn,Ee=t[ve>>2]|0,ve=t[ve+4>>2]|0,K=FI(Ee,ve,Re,S&32)|0,P=(n&8|0)==0|(Ee|0)==0&(ve|0)==0,M=P?0:2,P=P?5642:5642+(S>>4)|0,Pe=n,n=Ee,S=ve,We=67;else if((We|0)==66)K=bv(n,S,Re)|0,Pe=ve,We=67;else if((We|0)==71)We=0,ve=II(S,0,D)|0,Ee=(ve|0)==0,n=S,M=0,P=5642,K=Ee?S+D|0:ve,S=Ee?D:ve-S|0,D=Pe;else if((We|0)==75){for(We=0,P=S,n=0,D=0;M=t[P>>2]|0,!(!M||(D=I8(kr,M)|0,(D|0)<0|D>>>0>(K-n|0)>>>0));)if(n=D+n|0,K>>>0>n>>>0)P=P+4|0;else break;if((D|0)<0){s=-1;break e}if(hl(e,32,h,n,ve),!n)n=0,We=84;else for(M=0;;){if(D=t[S>>2]|0,!D){We=84;break t}if(D=I8(kr,D)|0,M=D+M|0,(M|0)>(n|0)){We=84;break t}if(qo(e,kr,D),M>>>0>=n>>>0){We=84;break}else S=S+4|0}}while(0);if((We|0)==67)We=0,S=(n|0)!=0|(S|0)!=0,ve=(D|0)!=0|S,S=((S^1)&1)+(Fe-K)|0,n=ve?K:Re,K=Re,S=ve?(D|0)>(S|0)?D:S:D,D=(D|0)>-1?Pe&-65537:Pe;else if((We|0)==84){We=0,hl(e,32,h,n,ve^8192),h=(h|0)>(n|0)?h:n,n=Qe;continue}Ee=K-n|0,Pe=(S|0)<(Ee|0)?Ee:S,ve=Pe+M|0,h=(h|0)<(ve|0)?ve:h,hl(e,32,h,ve,D),qo(e,P,M),hl(e,48,h,ve,D^65536),hl(e,48,Pe,Ee,0),qo(e,n,Ee),hl(e,32,h,ve,D^8192),n=Qe}e:do if((We|0)==87&&!e)if(!O)s=0;else{for(s=1;n=t[l+(s<<2)>>2]|0,!!n;)if(P8(u+(s<<3)|0,n,r),s=s+1|0,(s|0)>=10){s=1;break e}for(;;){if(t[l+(s<<2)>>2]|0){s=-1;break e}if(s=s+1|0,(s|0)>=10){s=1;break}}}while(0);return m=On,s|0}function NI(e){return e=e|0,0}function LI(e){e=e|0}function qo(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]&32||YI(n,r,e)|0}function b8(e){e=e|0;var n=0,r=0,u=0;if(r=t[e>>2]|0,u=(p[r>>0]|0)+-48|0,u>>>0<10){n=0;do n=u+(n*10|0)|0,r=r+1|0,t[e>>2]=r,u=(p[r>>0]|0)+-48|0;while(u>>>0<10)}else n=0;return n|0}function P8(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0;e:do if(n>>>0<=20)do switch(n|0){case 9:{u=(t[r>>2]|0)+(4-1)&~(4-1),n=t[u>>2]|0,t[r>>2]=u+4,t[e>>2]=n;break e}case 10:{u=(t[r>>2]|0)+(4-1)&~(4-1),n=t[u>>2]|0,t[r>>2]=u+4,u=e,t[u>>2]=n,t[u+4>>2]=((n|0)<0)<<31>>31;break e}case 11:{u=(t[r>>2]|0)+(4-1)&~(4-1),n=t[u>>2]|0,t[r>>2]=u+4,u=e,t[u>>2]=n,t[u+4>>2]=0;break e}case 12:{u=(t[r>>2]|0)+(8-1)&~(8-1),n=u,l=t[n>>2]|0,n=t[n+4>>2]|0,t[r>>2]=u+8,u=e,t[u>>2]=l,t[u+4>>2]=n;break e}case 13:{l=(t[r>>2]|0)+(4-1)&~(4-1),u=t[l>>2]|0,t[r>>2]=l+4,u=(u&65535)<<16>>16,l=e,t[l>>2]=u,t[l+4>>2]=((u|0)<0)<<31>>31;break e}case 14:{l=(t[r>>2]|0)+(4-1)&~(4-1),u=t[l>>2]|0,t[r>>2]=l+4,l=e,t[l>>2]=u&65535,t[l+4>>2]=0;break e}case 15:{l=(t[r>>2]|0)+(4-1)&~(4-1),u=t[l>>2]|0,t[r>>2]=l+4,u=(u&255)<<24>>24,l=e,t[l>>2]=u,t[l+4>>2]=((u|0)<0)<<31>>31;break e}case 16:{l=(t[r>>2]|0)+(4-1)&~(4-1),u=t[l>>2]|0,t[r>>2]=l+4,l=e,t[l>>2]=u&255,t[l+4>>2]=0;break e}case 17:{l=(t[r>>2]|0)+(8-1)&~(8-1),s=+U[l>>3],t[r>>2]=l+8,U[e>>3]=s;break e}case 18:{l=(t[r>>2]|0)+(8-1)&~(8-1),s=+U[l>>3],t[r>>2]=l+8,U[e>>3]=s;break e}default:break e}while(0);while(0)}function FI(e,n,r,u){if(e=e|0,n=n|0,r=r|0,u=u|0,!((e|0)==0&(n|0)==0))do r=r+-1|0,p[r>>0]=k[5694+(e&15)>>0]|0|u,e=O_(e|0,n|0,4)|0,n=ft;while(!((e|0)==0&(n|0)==0));return r|0}function bI(e,n,r){if(e=e|0,n=n|0,r=r|0,!((e|0)==0&(n|0)==0))do r=r+-1|0,p[r>>0]=e&7|48,e=O_(e|0,n|0,3)|0,n=ft;while(!((e|0)==0&(n|0)==0));return r|0}function bv(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;if(n>>>0>0|(n|0)==0&e>>>0>4294967295){for(;u=QE(e|0,n|0,10,0)|0,r=r+-1|0,p[r>>0]=u&255|48,u=e,e=XE(e|0,n|0,10,0)|0,n>>>0>9|(n|0)==9&u>>>0>4294967295;)n=ft;n=e}else n=e;if(n)for(;r=r+-1|0,p[r>>0]=(n>>>0)%10|0|48,!(n>>>0<10);)n=(n>>>0)/10|0;return r|0}function PI(e){return e=e|0,HI(e,t[(qI()|0)+188>>2]|0)|0}function II(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;s=n&255,u=(r|0)!=0;e:do if(u&(e&3|0)!=0)for(l=n&255;;){if((p[e>>0]|0)==l<<24>>24){h=6;break e}if(e=e+1|0,r=r+-1|0,u=(r|0)!=0,!(u&(e&3|0)!=0)){h=5;break}}else h=5;while(0);(h|0)==5&&(u?h=6:r=0);e:do if((h|0)==6&&(l=n&255,(p[e>>0]|0)!=l<<24>>24)){u=nr(s,16843009)|0;t:do if(r>>>0>3){for(;s=t[e>>2]^u,!((s&-2139062144^-2139062144)&s+-16843009|0);)if(e=e+4|0,r=r+-4|0,r>>>0<=3){h=11;break t}}else h=11;while(0);if((h|0)==11&&!r){r=0;break}for(;;){if((p[e>>0]|0)==l<<24>>24)break e;if(e=e+1|0,r=r+-1|0,!r){r=0;break}}}while(0);return(r|0?e:0)|0}function hl(e,n,r,u,l){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0;var s=0,h=0;if(h=m,m=m+256|0,s=h,(r|0)>(u|0)&(l&73728|0)==0){if(l=r-u|0,Iv(s|0,n|0,(l>>>0<256?l:256)|0)|0,l>>>0>255){n=r-u|0;do qo(e,s,256),l=l+-256|0;while(l>>>0>255);l=n&255}qo(e,s,l)}m=h}function I8(e,n){return e=e|0,n=n|0,e?e=jI(e,n,0)|0:e=0,e|0}function BI(e,n,r,u,l,s){e=e|0,n=+n,r=r|0,u=u|0,l=l|0,s=s|0;var h=0,D=0,S=0,M=0,O=0,P=0,K=0,Pe=0,Ee=0,ve=0,Qe=0,We=0,st=0,Re=0,Fe=0,Qt=0,Lr=0,Nn=0,mn=0,hr=0,kr=0,On=0,Zi=0;Zi=m,m=m+560|0,S=Zi+8|0,Qe=Zi,On=Zi+524|0,kr=On,M=Zi+512|0,t[Qe>>2]=0,hr=M+12|0,B8(n)|0,(ft|0)<0?(n=-n,Nn=1,Lr=5659):(Nn=(l&2049|0)!=0&1,Lr=(l&2048|0)==0?(l&1|0)==0?5660:5665:5662),B8(n)|0,mn=ft&2146435072;do if(mn>>>0<2146435072|(mn|0)==2146435072&0<0){if(Pe=+UI(n,Qe)*2,h=Pe!=0,h&&(t[Qe>>2]=(t[Qe>>2]|0)+-1),st=s|32,(st|0)==97){Ee=s&32,K=(Ee|0)==0?Lr:Lr+9|0,P=Nn|2,h=12-u|0;do if(u>>>0>11|(h|0)==0)n=Pe;else{n=8;do h=h+-1|0,n=n*16;while((h|0)!=0);if((p[K>>0]|0)==45){n=-(n+(-Pe-n));break}else{n=Pe+n-n;break}}while(0);D=t[Qe>>2]|0,h=(D|0)<0?0-D|0:D,h=bv(h,((h|0)<0)<<31>>31,hr)|0,(h|0)==(hr|0)&&(h=M+11|0,p[h>>0]=48),p[h+-1>>0]=(D>>31&2)+43,O=h+-2|0,p[O>>0]=s+15,M=(u|0)<1,S=(l&8|0)==0,h=On;do mn=~~n,D=h+1|0,p[h>>0]=k[5694+mn>>0]|Ee,n=(n-+(mn|0))*16,((D-kr|0)==1?!(S&(M&n==0)):0)?(p[D>>0]=46,h=h+2|0):h=D;while(n!=0);mn=h-kr|0,kr=hr-O|0,hr=(u|0)!=0&(mn+-2|0)<(u|0)?u+2|0:mn,h=kr+P+hr|0,hl(e,32,r,h,l),qo(e,K,P),hl(e,48,r,h,l^65536),qo(e,On,mn),hl(e,48,hr-mn|0,0,0),qo(e,O,kr),hl(e,32,r,h,l^8192);break}D=(u|0)<0?6:u,h?(h=(t[Qe>>2]|0)+-28|0,t[Qe>>2]=h,n=Pe*268435456):(n=Pe,h=t[Qe>>2]|0),mn=(h|0)<0?S:S+288|0,S=mn;do Fe=~~n>>>0,t[S>>2]=Fe,S=S+4|0,n=(n-+(Fe>>>0))*1e9;while(n!=0);if((h|0)>0)for(M=mn,P=S;;){if(O=(h|0)<29?h:29,h=P+-4|0,h>>>0>=M>>>0){S=0;do Re=W8(t[h>>2]|0,0,O|0)|0,Re=KE(Re|0,ft|0,S|0,0)|0,Fe=ft,We=QE(Re|0,Fe|0,1e9,0)|0,t[h>>2]=We,S=XE(Re|0,Fe|0,1e9,0)|0,h=h+-4|0;while(h>>>0>=M>>>0);S&&(M=M+-4|0,t[M>>2]=S)}for(S=P;!(S>>>0<=M>>>0);)if(h=S+-4|0,!(t[h>>2]|0))S=h;else break;if(h=(t[Qe>>2]|0)-O|0,t[Qe>>2]=h,(h|0)>0)P=S;else break}else M=mn;if((h|0)<0){u=((D+25|0)/9|0)+1|0,ve=(st|0)==102;do{if(Ee=0-h|0,Ee=(Ee|0)<9?Ee:9,M>>>0>>0){O=(1<>>Ee,K=0,h=M;do Fe=t[h>>2]|0,t[h>>2]=(Fe>>>Ee)+K,K=nr(Fe&O,P)|0,h=h+4|0;while(h>>>0>>0);h=(t[M>>2]|0)==0?M+4|0:M,K?(t[S>>2]=K,M=h,h=S+4|0):(M=h,h=S)}else M=(t[M>>2]|0)==0?M+4|0:M,h=S;S=ve?mn:M,S=(h-S>>2|0)>(u|0)?S+(u<<2)|0:h,h=(t[Qe>>2]|0)+Ee|0,t[Qe>>2]=h}while((h|0)<0);h=M,u=S}else h=M,u=S;if(Fe=mn,h>>>0>>0){if(S=(Fe-h>>2)*9|0,O=t[h>>2]|0,O>>>0>=10){M=10;do M=M*10|0,S=S+1|0;while(O>>>0>=M>>>0)}}else S=0;if(ve=(st|0)==103,We=(D|0)!=0,M=D-((st|0)!=102?S:0)+((We&ve)<<31>>31)|0,(M|0)<(((u-Fe>>2)*9|0)+-9|0)){if(M=M+9216|0,Ee=mn+4+(((M|0)/9|0)+-1024<<2)|0,M=((M|0)%9|0)+1|0,(M|0)<9){O=10;do O=O*10|0,M=M+1|0;while((M|0)!=9)}else O=10;if(P=t[Ee>>2]|0,K=(P>>>0)%(O>>>0)|0,M=(Ee+4|0)==(u|0),M&(K|0)==0)M=Ee;else if(Pe=(((P>>>0)/(O>>>0)|0)&1|0)==0?9007199254740992:9007199254740994,Re=(O|0)/2|0,n=K>>>0>>0?.5:M&(K|0)==(Re|0)?1:1.5,Nn&&(Re=(p[Lr>>0]|0)==45,n=Re?-n:n,Pe=Re?-Pe:Pe),M=P-K|0,t[Ee>>2]=M,Pe+n!=Pe){if(Re=M+O|0,t[Ee>>2]=Re,Re>>>0>999999999)for(S=Ee;M=S+-4|0,t[S>>2]=0,M>>>0>>0&&(h=h+-4|0,t[h>>2]=0),Re=(t[M>>2]|0)+1|0,t[M>>2]=Re,Re>>>0>999999999;)S=M;else M=Ee;if(S=(Fe-h>>2)*9|0,P=t[h>>2]|0,P>>>0>=10){O=10;do O=O*10|0,S=S+1|0;while(P>>>0>=O>>>0)}}else M=Ee;M=M+4|0,M=u>>>0>M>>>0?M:u,Re=h}else M=u,Re=h;for(st=M;;){if(st>>>0<=Re>>>0){Qe=0;break}if(h=st+-4|0,!(t[h>>2]|0))st=h;else{Qe=1;break}}u=0-S|0;do if(ve)if(h=((We^1)&1)+D|0,(h|0)>(S|0)&(S|0)>-5?(O=s+-1|0,D=h+-1-S|0):(O=s+-2|0,D=h+-1|0),h=l&8,h)Ee=h;else{if(Qe?(Qt=t[st+-4>>2]|0,(Qt|0)!=0):0)if((Qt>>>0)%10|0)M=0;else{M=0,h=10;do h=h*10|0,M=M+1|0;while(!((Qt>>>0)%(h>>>0)|0|0))}else M=9;if(h=((st-Fe>>2)*9|0)+-9|0,(O|32|0)==102){Ee=h-M|0,Ee=(Ee|0)>0?Ee:0,D=(D|0)<(Ee|0)?D:Ee,Ee=0;break}else{Ee=h+S-M|0,Ee=(Ee|0)>0?Ee:0,D=(D|0)<(Ee|0)?D:Ee,Ee=0;break}}else O=s,Ee=l&8;while(0);if(ve=D|Ee,P=(ve|0)!=0&1,K=(O|32|0)==102,K)We=0,h=(S|0)>0?S:0;else{if(h=(S|0)<0?u:S,h=bv(h,((h|0)<0)<<31>>31,hr)|0,M=hr,(M-h|0)<2)do h=h+-1|0,p[h>>0]=48;while((M-h|0)<2);p[h+-1>>0]=(S>>31&2)+43,h=h+-2|0,p[h>>0]=O,We=h,h=M-h|0}if(h=Nn+1+D+P+h|0,hl(e,32,r,h,l),qo(e,Lr,Nn),hl(e,48,r,h,l^65536),K){O=Re>>>0>mn>>>0?mn:Re,Ee=On+9|0,P=Ee,K=On+8|0,M=O;do{if(S=bv(t[M>>2]|0,0,Ee)|0,(M|0)==(O|0))(S|0)==(Ee|0)&&(p[K>>0]=48,S=K);else if(S>>>0>On>>>0){Iv(On|0,48,S-kr|0)|0;do S=S+-1|0;while(S>>>0>On>>>0)}qo(e,S,P-S|0),M=M+4|0}while(M>>>0<=mn>>>0);if(ve|0&&qo(e,5710,1),M>>>0>>0&(D|0)>0)for(;;){if(S=bv(t[M>>2]|0,0,Ee)|0,S>>>0>On>>>0){Iv(On|0,48,S-kr|0)|0;do S=S+-1|0;while(S>>>0>On>>>0)}if(qo(e,S,(D|0)<9?D:9),M=M+4|0,S=D+-9|0,M>>>0>>0&(D|0)>9)D=S;else{D=S;break}}hl(e,48,D+9|0,9,0)}else{if(ve=Qe?st:Re+4|0,(D|0)>-1){Qe=On+9|0,Ee=(Ee|0)==0,u=Qe,P=0-kr|0,K=On+8|0,O=Re;do{S=bv(t[O>>2]|0,0,Qe)|0,(S|0)==(Qe|0)&&(p[K>>0]=48,S=K);do if((O|0)==(Re|0)){if(M=S+1|0,qo(e,S,1),Ee&(D|0)<1){S=M;break}qo(e,5710,1),S=M}else{if(S>>>0<=On>>>0)break;Iv(On|0,48,S+P|0)|0;do S=S+-1|0;while(S>>>0>On>>>0)}while(0);kr=u-S|0,qo(e,S,(D|0)>(kr|0)?kr:D),D=D-kr|0,O=O+4|0}while(O>>>0>>0&(D|0)>-1)}hl(e,48,D+18|0,18,0),qo(e,We,hr-We|0)}hl(e,32,r,h,l^8192)}else On=(s&32|0)!=0,h=Nn+3|0,hl(e,32,r,h,l&-65537),qo(e,Lr,Nn),qo(e,n!=n|!1?On?5686:5690:On?5678:5682,3),hl(e,32,r,h,l^8192);while(0);return m=Zi,((h|0)<(r|0)?r:h)|0}function B8(e){e=+e;var n=0;return U[W>>3]=e,n=t[W>>2]|0,ft=t[W+4>>2]|0,n|0}function UI(e,n){return e=+e,n=n|0,+ +U8(e,n)}function U8(e,n){e=+e,n=n|0;var r=0,u=0,l=0;switch(U[W>>3]=e,r=t[W>>2]|0,u=t[W+4>>2]|0,l=O_(r|0,u|0,52)|0,l&2047){case 0:{e!=0?(e=+U8(e*18446744073709552e3,n),r=(t[n>>2]|0)+-64|0):r=0,t[n>>2]=r;break}case 2047:break;default:t[n>>2]=(l&2047)+-1022,t[W>>2]=r,t[W+4>>2]=u&-2146435073|1071644672,e=+U[W>>3]}return+e}function jI(e,n,r){e=e|0,n=n|0,r=r|0;do if(e){if(n>>>0<128){p[e>>0]=n,e=1;break}if(!(t[t[(zI()|0)+188>>2]>>2]|0))if((n&-128|0)==57216){p[e>>0]=n,e=1;break}else{t[(Fv()|0)>>2]=84,e=-1;break}if(n>>>0<2048){p[e>>0]=n>>>6|192,p[e+1>>0]=n&63|128,e=2;break}if(n>>>0<55296|(n&-8192|0)==57344){p[e>>0]=n>>>12|224,p[e+1>>0]=n>>>6&63|128,p[e+2>>0]=n&63|128,e=3;break}if((n+-65536|0)>>>0<1048576){p[e>>0]=n>>>18|240,p[e+1>>0]=n>>>12&63|128,p[e+2>>0]=n>>>6&63|128,p[e+3>>0]=n&63|128,e=4;break}else{t[(Fv()|0)>>2]=84,e=-1;break}}else e=1;while(0);return e|0}function zI(){return VE()|0}function qI(){return VE()|0}function HI(e,n){e=e|0,n=n|0;var r=0,u=0;for(u=0;;){if((k[5712+u>>0]|0)==(e|0)){e=2;break}if(r=u+1|0,(r|0)==87){r=5800,u=87,e=5;break}else u=r}if((e|0)==2&&(u?(r=5800,e=5):r=5800),(e|0)==5)for(;;){do e=r,r=r+1|0;while((p[e>>0]|0)!=0);if(u=u+-1|0,u)e=5;else break}return WI(r,t[n+20>>2]|0)|0}function WI(e,n){return e=e|0,n=n|0,VI(e,n)|0}function VI(e,n){return e=e|0,n=n|0,n?n=GI(t[n>>2]|0,t[n+4>>2]|0,e)|0:n=0,(n|0?n:e)|0}function GI(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0;K=(t[e>>2]|0)+1794895138|0,s=Gp(t[e+8>>2]|0,K)|0,u=Gp(t[e+12>>2]|0,K)|0,l=Gp(t[e+16>>2]|0,K)|0;e:do if((s>>>0>>2>>>0?(P=n-(s<<2)|0,u>>>0

>>0&l>>>0

>>0):0)?((l|u)&3|0)==0:0){for(P=u>>>2,O=l>>>2,M=0;;){if(D=s>>>1,S=M+D|0,h=S<<1,l=h+P|0,u=Gp(t[e+(l<<2)>>2]|0,K)|0,l=Gp(t[e+(l+1<<2)>>2]|0,K)|0,!(l>>>0>>0&u>>>0<(n-l|0)>>>0)){u=0;break e}if(p[e+(l+u)>>0]|0){u=0;break e}if(u=L8(r,e+l|0)|0,!u)break;if(u=(u|0)<0,(s|0)==1){u=0;break e}else M=u?M:S,s=u?D:s-D|0}u=h+O|0,l=Gp(t[e+(u<<2)>>2]|0,K)|0,u=Gp(t[e+(u+1<<2)>>2]|0,K)|0,u>>>0>>0&l>>>0<(n-u|0)>>>0?u=(p[e+(u+l)>>0]|0)==0?e+u|0:0:u=0}else u=0;while(0);return u|0}function Gp(e,n){e=e|0,n=n|0;var r=0;return r=Y8(e|0)|0,((n|0)==0?e:r)|0}function YI(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0,D=0;u=r+16|0,l=t[u>>2]|0,l?s=5:KI(r)|0?u=0:(l=t[u>>2]|0,s=5);e:do if((s|0)==5){if(D=r+20|0,h=t[D>>2]|0,u=h,(l-h|0)>>>0>>0){u=M_[t[r+36>>2]&7](r,e,n)|0;break}t:do if((p[r+75>>0]|0)>-1){for(h=n;;){if(!h){s=0,l=e;break t}if(l=h+-1|0,(p[e+l>>0]|0)==10)break;h=l}if(u=M_[t[r+36>>2]&7](r,e,h)|0,u>>>0>>0)break e;s=h,l=e+h|0,n=n-h|0,u=t[D>>2]|0}else s=0,l=e;while(0);pr(u|0,l|0,n|0)|0,t[D>>2]=(t[D>>2]|0)+n,u=s+n|0}while(0);return u|0}function KI(e){e=e|0;var n=0,r=0;return n=e+74|0,r=p[n>>0]|0,p[n>>0]=r+255|r,n=t[e>>2]|0,n&8?(t[e>>2]=n|32,e=-1):(t[e+8>>2]=0,t[e+4>>2]=0,r=t[e+44>>2]|0,t[e+28>>2]=r,t[e+20>>2]=r,t[e+16>>2]=r+(t[e+48>>2]|0),e=0),e|0}function Eu(e,n){e=w(e),n=w(n);var r=0,u=0;r=j8(e)|0;do if((r&2147483647)>>>0<=2139095040){if(u=j8(n)|0,(u&2147483647)>>>0<=2139095040)if((u^r|0)<0){e=(r|0)<0?n:e;break}else{e=e>2]=e,t[W>>2]|0|0}function Yp(e,n){e=w(e),n=w(n);var r=0,u=0;r=z8(e)|0;do if((r&2147483647)>>>0<=2139095040){if(u=z8(n)|0,(u&2147483647)>>>0<=2139095040)if((u^r|0)<0){e=(r|0)<0?e:n;break}else{e=e>2]=e,t[W>>2]|0|0}function YE(e,n){e=w(e),n=w(n);var r=0,u=0,l=0,s=0,h=0,D=0,S=0,M=0;s=(C[W>>2]=e,t[W>>2]|0),D=(C[W>>2]=n,t[W>>2]|0),r=s>>>23&255,h=D>>>23&255,S=s&-2147483648,l=D<<1;e:do if((l|0)!=0?!((r|0)==255|((XI(n)|0)&2147483647)>>>0>2139095040):0){if(u=s<<1,u>>>0<=l>>>0)return n=w(e*w(0)),w((u|0)==(l|0)?n:e);if(r)u=s&8388607|8388608;else{if(r=s<<9,(r|0)>-1){u=r,r=0;do r=r+-1|0,u=u<<1;while((u|0)>-1)}else r=0;u=s<<1-r}if(h)D=D&8388607|8388608;else{if(s=D<<9,(s|0)>-1){l=0;do l=l+-1|0,s=s<<1;while((s|0)>-1)}else l=0;h=l,D=D<<1-l}l=u-D|0,s=(l|0)>-1;t:do if((r|0)>(h|0)){for(;;){if(s)if(l)u=l;else break;if(u=u<<1,r=r+-1|0,l=u-D|0,s=(l|0)>-1,(r|0)<=(h|0))break t}n=w(e*w(0));break e}while(0);if(s)if(l)u=l;else{n=w(e*w(0));break}if(u>>>0<8388608)do u=u<<1,r=r+-1|0;while(u>>>0<8388608);(r|0)>0?r=u+-8388608|r<<23:r=u>>>(1-r|0),n=(t[W>>2]=r|S,w(C[W>>2]))}else M=3;while(0);return(M|0)==3&&(n=w(e*n),n=w(n/n)),w(n)}function XI(e){return e=w(e),C[W>>2]=e,t[W>>2]|0|0}function QI(e,n){return e=e|0,n=n|0,F8(t[582]|0,e,n)|0}function li(e){e=e|0,Xn()}function Pv(e){e=e|0}function JI(e,n){return e=e|0,n=n|0,0}function ZI(e){return e=e|0,(q8(e+4|0)|0)==-1?(M1[t[(t[e>>2]|0)+8>>2]&127](e),e=1):e=0,e|0}function q8(e){e=e|0;var n=0;return n=t[e>>2]|0,t[e>>2]=n+-1,n+-1|0}function J2(e){e=e|0,ZI(e)|0&&$I(e)}function $I(e){e=e|0;var n=0;n=e+8|0,((t[n>>2]|0)!=0?(q8(n)|0)!=-1:0)||M1[t[(t[e>>2]|0)+16>>2]&127](e)}function cn(e){e=e|0;var n=0;for(n=(e|0)==0?1:e;e=C_(n)|0,!(e|0);){if(e=tB()|0,!e){e=0;break}rS[e&0]()}return e|0}function H8(e){return e=e|0,cn(e)|0}function yt(e){e=e|0,x_(e)}function eB(e){e=e|0,(p[e+11>>0]|0)<0&&yt(t[e>>2]|0)}function tB(){var e=0;return e=t[2923]|0,t[2923]=e+0,e|0}function nB(){}function R_(e,n,r,u){return e=e|0,n=n|0,r=r|0,u=u|0,u=n-u-(r>>>0>e>>>0|0)>>>0,ft=u,e-r>>>0|0|0}function KE(e,n,r,u){return e=e|0,n=n|0,r=r|0,u=u|0,r=e+r>>>0,ft=n+u+(r>>>0>>0|0)>>>0,r|0|0}function Iv(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0,h=0;if(s=e+r|0,n=n&255,(r|0)>=67){for(;e&3;)p[e>>0]=n,e=e+1|0;for(u=s&-4|0,l=u-64|0,h=n|n<<8|n<<16|n<<24;(e|0)<=(l|0);)t[e>>2]=h,t[e+4>>2]=h,t[e+8>>2]=h,t[e+12>>2]=h,t[e+16>>2]=h,t[e+20>>2]=h,t[e+24>>2]=h,t[e+28>>2]=h,t[e+32>>2]=h,t[e+36>>2]=h,t[e+40>>2]=h,t[e+44>>2]=h,t[e+48>>2]=h,t[e+52>>2]=h,t[e+56>>2]=h,t[e+60>>2]=h,e=e+64|0;for(;(e|0)<(u|0);)t[e>>2]=h,e=e+4|0}for(;(e|0)<(s|0);)p[e>>0]=n,e=e+1|0;return s-r|0}function W8(e,n,r){return e=e|0,n=n|0,r=r|0,(r|0)<32?(ft=n<>>32-r,e<>>r,e>>>r|(n&(1<>>r-32|0)}function pr(e,n,r){e=e|0,n=n|0,r=r|0;var u=0,l=0,s=0;if((r|0)>=8192)return ni(e|0,n|0,r|0)|0;if(s=e|0,l=e+r|0,(e&3)==(n&3)){for(;e&3;){if(!r)return s|0;p[e>>0]=p[n>>0]|0,e=e+1|0,n=n+1|0,r=r-1|0}for(r=l&-4|0,u=r-64|0;(e|0)<=(u|0);)t[e>>2]=t[n>>2],t[e+4>>2]=t[n+4>>2],t[e+8>>2]=t[n+8>>2],t[e+12>>2]=t[n+12>>2],t[e+16>>2]=t[n+16>>2],t[e+20>>2]=t[n+20>>2],t[e+24>>2]=t[n+24>>2],t[e+28>>2]=t[n+28>>2],t[e+32>>2]=t[n+32>>2],t[e+36>>2]=t[n+36>>2],t[e+40>>2]=t[n+40>>2],t[e+44>>2]=t[n+44>>2],t[e+48>>2]=t[n+48>>2],t[e+52>>2]=t[n+52>>2],t[e+56>>2]=t[n+56>>2],t[e+60>>2]=t[n+60>>2],e=e+64|0,n=n+64|0;for(;(e|0)<(r|0);)t[e>>2]=t[n>>2],e=e+4|0,n=n+4|0}else for(r=l-4|0;(e|0)<(r|0);)p[e>>0]=p[n>>0]|0,p[e+1>>0]=p[n+1>>0]|0,p[e+2>>0]=p[n+2>>0]|0,p[e+3>>0]=p[n+3>>0]|0,e=e+4|0,n=n+4|0;for(;(e|0)<(l|0);)p[e>>0]=p[n>>0]|0,e=e+1|0,n=n+1|0;return s|0}function V8(e){e=e|0;var n=0;return n=p[Se+(e&255)>>0]|0,(n|0)<8?n|0:(n=p[Se+(e>>8&255)>>0]|0,(n|0)<8?n+8|0:(n=p[Se+(e>>16&255)>>0]|0,(n|0)<8?n+16|0:(p[Se+(e>>>24)>>0]|0)+24|0))}function G8(e,n,r,u,l){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0;var s=0,h=0,D=0,S=0,M=0,O=0,P=0,K=0,Pe=0,Ee=0;if(O=e,S=n,M=S,h=r,K=u,D=K,!M)return s=(l|0)!=0,D?s?(t[l>>2]=e|0,t[l+4>>2]=n&0,K=0,l=0,ft=K,l|0):(K=0,l=0,ft=K,l|0):(s&&(t[l>>2]=(O>>>0)%(h>>>0),t[l+4>>2]=0),K=0,l=(O>>>0)/(h>>>0)>>>0,ft=K,l|0);s=(D|0)==0;do if(h){if(!s){if(s=(vr(D|0)|0)-(vr(M|0)|0)|0,s>>>0<=31){P=s+1|0,D=31-s|0,n=s-31>>31,h=P,e=O>>>(P>>>0)&n|M<>>(P>>>0)&n,s=0,D=O<>2]=e|0,t[l+4>>2]=S|n&0,K=0,l=0,ft=K,l|0):(K=0,l=0,ft=K,l|0)}if(s=h-1|0,s&h|0){D=(vr(h|0)|0)+33-(vr(M|0)|0)|0,Ee=64-D|0,P=32-D|0,S=P>>31,Pe=D-32|0,n=Pe>>31,h=D,e=P-1>>31&M>>>(Pe>>>0)|(M<>>(D>>>0))&n,n=n&M>>>(D>>>0),s=O<>>(Pe>>>0))&S|O<>31;break}return l|0&&(t[l>>2]=s&O,t[l+4>>2]=0),(h|0)==1?(Pe=S|n&0,Ee=e|0|0,ft=Pe,Ee|0):(Ee=V8(h|0)|0,Pe=M>>>(Ee>>>0)|0,Ee=M<<32-Ee|O>>>(Ee>>>0)|0,ft=Pe,Ee|0)}else{if(s)return l|0&&(t[l>>2]=(M>>>0)%(h>>>0),t[l+4>>2]=0),Pe=0,Ee=(M>>>0)/(h>>>0)>>>0,ft=Pe,Ee|0;if(!O)return l|0&&(t[l>>2]=0,t[l+4>>2]=(M>>>0)%(D>>>0)),Pe=0,Ee=(M>>>0)/(D>>>0)>>>0,ft=Pe,Ee|0;if(s=D-1|0,!(s&D))return l|0&&(t[l>>2]=e|0,t[l+4>>2]=s&M|n&0),Pe=0,Ee=M>>>((V8(D|0)|0)>>>0),ft=Pe,Ee|0;if(s=(vr(D|0)|0)-(vr(M|0)|0)|0,s>>>0<=30){n=s+1|0,D=31-s|0,h=n,e=M<>>(n>>>0),n=M>>>(n>>>0),s=0,D=O<>2]=e|0,t[l+4>>2]=S|n&0,Pe=0,Ee=0,ft=Pe,Ee|0):(Pe=0,Ee=0,ft=Pe,Ee|0)}while(0);if(!h)M=D,S=0,D=0;else{P=r|0|0,O=K|u&0,M=KE(P|0,O|0,-1,-1)|0,r=ft,S=D,D=0;do u=S,S=s>>>31|S<<1,s=D|s<<1,u=e<<1|u>>>31|0,K=e>>>31|n<<1|0,R_(M|0,r|0,u|0,K|0)|0,Ee=ft,Pe=Ee>>31|((Ee|0)<0?-1:0)<<1,D=Pe&1,e=R_(u|0,K|0,Pe&P|0,(((Ee|0)<0?-1:0)>>31|((Ee|0)<0?-1:0)<<1)&O|0)|0,n=ft,h=h-1|0;while((h|0)!=0);M=S,S=0}return h=0,l|0&&(t[l>>2]=e,t[l+4>>2]=n),Pe=(s|0)>>>31|(M|h)<<1|(h<<1|s>>>31)&0|S,Ee=(s<<1|0>>>31)&-2|D,ft=Pe,Ee|0}function XE(e,n,r,u){return e=e|0,n=n|0,r=r|0,u=u|0,G8(e,n,r,u,0)|0}function Z2(e){e=e|0;var n=0,r=0;return r=e+15&-16|0,n=t[q>>2]|0,e=n+r|0,(r|0)>0&(e|0)<(n|0)|(e|0)<0?(ur()|0,Vl(12),-1):(t[q>>2]=e,((e|0)>(Fr()|0)?(fr()|0)==0:0)?(t[q>>2]=n,Vl(12),-1):n|0)}function Iy(e,n,r){e=e|0,n=n|0,r=r|0;var u=0;if((n|0)<(e|0)&(e|0)<(n+r|0)){for(u=e,n=n+r|0,e=e+r|0;(r|0)>0;)e=e-1|0,n=n-1|0,r=r-1|0,p[e>>0]=p[n>>0]|0;e=u}else pr(e,n,r)|0;return e|0}function QE(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0;var l=0,s=0;return s=m,m=m+16|0,l=s|0,G8(e,n,r,u,l)|0,m=s,ft=t[l+4>>2]|0,t[l>>2]|0|0}function Y8(e){return e=e|0,(e&255)<<24|(e>>8&255)<<16|(e>>16&255)<<8|e>>>24|0}function rB(e,n,r,u,l,s){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,s=s|0,K8[e&1](n|0,r|0,u|0,l|0,s|0)}function iB(e,n,r){e=e|0,n=n|0,r=w(r),X8[e&1](n|0,w(r))}function uB(e,n,r){e=e|0,n=n|0,r=+r,Q8[e&31](n|0,+r)}function oB(e,n,r,u){return e=e|0,n=n|0,r=w(r),u=w(u),w(J8[e&0](n|0,w(r),w(u)))}function lB(e,n){e=e|0,n=n|0,M1[e&127](n|0)}function sB(e,n,r){e=e|0,n=n|0,r=r|0,N1[e&31](n|0,r|0)}function aB(e,n){return e=e|0,n=n|0,Xp[e&31](n|0)|0}function fB(e,n,r,u,l){e=e|0,n=n|0,r=+r,u=+u,l=l|0,Z8[e&1](n|0,+r,+u,l|0)}function cB(e,n,r,u){e=e|0,n=n|0,r=+r,u=+u,VB[e&1](n|0,+r,+u)}function dB(e,n,r,u){return e=e|0,n=n|0,r=r|0,u=u|0,M_[e&7](n|0,r|0,u|0)|0}function pB(e,n,r,u){return e=e|0,n=n|0,r=r|0,u=u|0,+GB[e&1](n|0,r|0,u|0)}function hB(e,n){return e=e|0,n=n|0,+$8[e&15](n|0)}function vB(e,n,r){return e=e|0,n=n|0,r=+r,YB[e&1](n|0,+r)|0}function mB(e,n,r){return e=e|0,n=n|0,r=r|0,ZE[e&15](n|0,r|0)|0}function yB(e,n,r,u,l,s){e=e|0,n=n|0,r=r|0,u=+u,l=+l,s=s|0,KB[e&1](n|0,r|0,+u,+l,s|0)}function gB(e,n,r,u,l,s,h){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,s=s|0,h=h|0,XB[e&1](n|0,r|0,u|0,l|0,s|0,h|0)}function _B(e,n,r){return e=e|0,n=n|0,r=r|0,+eS[e&7](n|0,r|0)}function EB(e){return e=e|0,N_[e&7]()|0}function DB(e,n,r,u,l,s){return e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,s=s|0,tS[e&1](n|0,r|0,u|0,l|0,s|0)|0}function wB(e,n,r,u,l){e=e|0,n=n|0,r=r|0,u=u|0,l=+l,QB[e&1](n|0,r|0,u|0,+l)}function SB(e,n,r,u,l,s,h){e=e|0,n=n|0,r=r|0,u=w(u),l=l|0,s=w(s),h=h|0,nS[e&1](n|0,r|0,w(u),l|0,w(s),h|0)}function TB(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0,jy[e&15](n|0,r|0,u|0)}function CB(e){e=e|0,rS[e&0]()}function xB(e,n,r,u){e=e|0,n=n|0,r=r|0,u=+u,iS[e&15](n|0,r|0,+u)}function AB(e,n,r){return e=e|0,n=+n,r=+r,JB[e&1](+n,+r)|0}function RB(e,n,r,u,l){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,$E[e&15](n|0,r|0,u|0,l|0)}function OB(e,n,r,u,l){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,Ut(0)}function kB(e,n){e=e|0,n=w(n),Ut(1)}function Ks(e,n){e=e|0,n=+n,Ut(2)}function MB(e,n,r){return e=e|0,n=w(n),r=w(r),Ut(3),St}function Kn(e){e=e|0,Ut(4)}function By(e,n){e=e|0,n=n|0,Ut(5)}function xa(e){return e=e|0,Ut(6),0}function NB(e,n,r,u){e=e|0,n=+n,r=+r,u=u|0,Ut(7)}function LB(e,n,r){e=e|0,n=+n,r=+r,Ut(8)}function FB(e,n,r){return e=e|0,n=n|0,r=r|0,Ut(9),0}function bB(e,n,r){return e=e|0,n=n|0,r=r|0,Ut(10),0}function Kp(e){return e=e|0,Ut(11),0}function PB(e,n){return e=e|0,n=+n,Ut(12),0}function Uy(e,n){return e=e|0,n=n|0,Ut(13),0}function IB(e,n,r,u,l){e=e|0,n=n|0,r=+r,u=+u,l=l|0,Ut(14)}function BB(e,n,r,u,l,s){e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,s=s|0,Ut(15)}function JE(e,n){return e=e|0,n=n|0,Ut(16),0}function UB(){return Ut(17),0}function jB(e,n,r,u,l){return e=e|0,n=n|0,r=r|0,u=u|0,l=l|0,Ut(18),0}function zB(e,n,r,u){e=e|0,n=n|0,r=r|0,u=+u,Ut(19)}function qB(e,n,r,u,l,s){e=e|0,n=n|0,r=w(r),u=u|0,l=w(l),s=s|0,Ut(20)}function k_(e,n,r){e=e|0,n=n|0,r=r|0,Ut(21)}function HB(){Ut(22)}function Bv(e,n,r){e=e|0,n=n|0,r=+r,Ut(23)}function WB(e,n){return e=+e,n=+n,Ut(24),0}function Uv(e,n,r,u){e=e|0,n=n|0,r=r|0,u=u|0,Ut(25)}var K8=[OB,UL],X8=[kB,Ju],Q8=[Ks,ua,ys,gs,Ql,Io,hf,tl,Ia,Zu,vf,jc,lc,Sl,_s,oa,n2,la,sc,Ks,Ks,Ks,Ks,Ks,Ks,Ks,Ks,Ks,Ks,Ks,Ks,Ks],J8=[MB],M1=[Kn,Pv,an,$l,go,Lf,x1,Fl,hN,vN,mN,xL,AL,RL,XP,QP,JP,Ne,uc,La,ju,U0,hh,yf,$c,Af,pa,Rh,Sm,h1,v1,Xh,pp,M2,Gm,D1,Sc,ry,oy,Sv,Av,rn,Q4,lE,h_,Nt,_u,Qu,RO,WO,ak,Ak,qk,aM,_M,wM,UM,qM,uN,gN,DN,BN,nL,v2,BF,vb,kb,Vb,pP,RP,UP,qP,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn,Kn],N1=[By,gd,$1,Uc,Dl,el,_d,Bs,wl,Fa,ba,Pa,Tl,Be,ut,Jt,jn,ti,tr,Ba,Dd,mh,fE,vE,Mk,zF,fL,g8,By,By,By,By],Xp=[xa,xI,pf,y,J,fe,mt,Ct,Mt,Er,iu,j0,Ua,r2,Vc,Cs,Gk,zN,VF,Sa,xa,xa,xa,xa,xa,xa,xa,xa,xa,xa,xa,xa],Z8=[NB,Td],VB=[LB,sN],M_=[FB,N8,AI,kI,zh,dv,NO,Xb],GB=[bB,lv],$8=[Kp,e0,He,ii,vh,il,sa,Cd,xd,ac,Kp,Kp,Kp,Kp,Kp,Kp],YB=[PB,mM],ZE=[Uy,JI,Ed,ll,zd,Nm,ap,Cp,ly,xr,bo,Fb,Uy,Uy,Uy,Uy],KB=[IB,Sh],XB=[BB,yP],eS=[JE,qi,Ad,a2,Gc,cl,JE,JE],N_=[UB,Yc,to,g0,xM,GM,CN,GP],tS=[jB,ei],QB=[zB,Dy],nS=[qB,i2],jy=[k_,A,$u,jr,gu,d1,k2,ir,Cy,po,aF,_b,NP,k_,k_,k_],rS=[HB],iS=[Bv,e2,ho,t2,Po,zc,bi,g,Ip,KO,dM,Bv,Bv,Bv,Bv,Bv],JB=[WB,dN],$E=[Uv,_p,Rc,pk,tM,NM,ZM,NN,lL,JF,rI,Uv,Uv,Uv,Uv,Uv];return{_llvm_bswap_i32:Y8,dynCall_idd:AB,dynCall_i:EB,_i64Subtract:R_,___udivdi3:XE,dynCall_vif:iB,setThrew:fs,dynCall_viii:TB,_bitshift64Lshr:O_,_bitshift64Shl:W8,dynCall_vi:lB,dynCall_viiddi:yB,dynCall_diii:pB,dynCall_iii:mB,_memset:Iv,_sbrk:Z2,_memcpy:pr,__GLOBAL__sub_I_Yoga_cpp:Qi,dynCall_vii:sB,___uremdi3:QE,dynCall_vid:uB,stackAlloc:so,_nbind_init:hI,getTempRet0:X,dynCall_di:hB,dynCall_iid:vB,setTempRet0:P0,_i64Add:KE,dynCall_fiff:oB,dynCall_iiii:dB,_emscripten_get_global_libc:CI,dynCall_viid:xB,dynCall_viiid:wB,dynCall_viififi:SB,dynCall_ii:aB,__GLOBAL__sub_I_Binding_cc:kF,dynCall_viiii:RB,dynCall_iiiiii:DB,stackSave:Jo,dynCall_viiiii:rB,__GLOBAL__sub_I_nbind_cc:Us,dynCall_vidd:cB,_free:x_,runPostSets:nB,dynCall_viiiiii:gB,establishStackSpace:Fu,_memmove:Iy,stackRestore:Gl,_malloc:C_,__GLOBAL__sub_I_common_cc:XN,dynCall_viddi:fB,dynCall_dii:_B,dynCall_v:CB}}(Module.asmGlobalArg,Module.asmLibraryArg,buffer),_llvm_bswap_i32=Module._llvm_bswap_i32=asm._llvm_bswap_i32,getTempRet0=Module.getTempRet0=asm.getTempRet0,___udivdi3=Module.___udivdi3=asm.___udivdi3,setThrew=Module.setThrew=asm.setThrew,_bitshift64Lshr=Module._bitshift64Lshr=asm._bitshift64Lshr,_bitshift64Shl=Module._bitshift64Shl=asm._bitshift64Shl,_memset=Module._memset=asm._memset,_sbrk=Module._sbrk=asm._sbrk,_memcpy=Module._memcpy=asm._memcpy,stackAlloc=Module.stackAlloc=asm.stackAlloc,___uremdi3=Module.___uremdi3=asm.___uremdi3,_nbind_init=Module._nbind_init=asm._nbind_init,_i64Subtract=Module._i64Subtract=asm._i64Subtract,setTempRet0=Module.setTempRet0=asm.setTempRet0,_i64Add=Module._i64Add=asm._i64Add,_emscripten_get_global_libc=Module._emscripten_get_global_libc=asm._emscripten_get_global_libc,__GLOBAL__sub_I_Yoga_cpp=Module.__GLOBAL__sub_I_Yoga_cpp=asm.__GLOBAL__sub_I_Yoga_cpp,__GLOBAL__sub_I_Binding_cc=Module.__GLOBAL__sub_I_Binding_cc=asm.__GLOBAL__sub_I_Binding_cc,stackSave=Module.stackSave=asm.stackSave,__GLOBAL__sub_I_nbind_cc=Module.__GLOBAL__sub_I_nbind_cc=asm.__GLOBAL__sub_I_nbind_cc,_free=Module._free=asm._free,runPostSets=Module.runPostSets=asm.runPostSets,establishStackSpace=Module.establishStackSpace=asm.establishStackSpace,_memmove=Module._memmove=asm._memmove,stackRestore=Module.stackRestore=asm.stackRestore,_malloc=Module._malloc=asm._malloc,__GLOBAL__sub_I_common_cc=Module.__GLOBAL__sub_I_common_cc=asm.__GLOBAL__sub_I_common_cc,dynCall_viiiii=Module.dynCall_viiiii=asm.dynCall_viiiii,dynCall_vif=Module.dynCall_vif=asm.dynCall_vif,dynCall_vid=Module.dynCall_vid=asm.dynCall_vid,dynCall_fiff=Module.dynCall_fiff=asm.dynCall_fiff,dynCall_vi=Module.dynCall_vi=asm.dynCall_vi,dynCall_vii=Module.dynCall_vii=asm.dynCall_vii,dynCall_ii=Module.dynCall_ii=asm.dynCall_ii,dynCall_viddi=Module.dynCall_viddi=asm.dynCall_viddi,dynCall_vidd=Module.dynCall_vidd=asm.dynCall_vidd,dynCall_iiii=Module.dynCall_iiii=asm.dynCall_iiii,dynCall_diii=Module.dynCall_diii=asm.dynCall_diii,dynCall_di=Module.dynCall_di=asm.dynCall_di,dynCall_iid=Module.dynCall_iid=asm.dynCall_iid,dynCall_iii=Module.dynCall_iii=asm.dynCall_iii,dynCall_viiddi=Module.dynCall_viiddi=asm.dynCall_viiddi,dynCall_viiiiii=Module.dynCall_viiiiii=asm.dynCall_viiiiii,dynCall_dii=Module.dynCall_dii=asm.dynCall_dii,dynCall_i=Module.dynCall_i=asm.dynCall_i,dynCall_iiiiii=Module.dynCall_iiiiii=asm.dynCall_iiiiii,dynCall_viiid=Module.dynCall_viiid=asm.dynCall_viiid,dynCall_viififi=Module.dynCall_viififi=asm.dynCall_viififi,dynCall_viii=Module.dynCall_viii=asm.dynCall_viii,dynCall_v=Module.dynCall_v=asm.dynCall_v,dynCall_viid=Module.dynCall_viid=asm.dynCall_viid,dynCall_idd=Module.dynCall_idd=asm.dynCall_idd,dynCall_viiii=Module.dynCall_viiii=asm.dynCall_viiii;Runtime.stackAlloc=Module.stackAlloc,Runtime.stackSave=Module.stackSave,Runtime.stackRestore=Module.stackRestore,Runtime.establishStackSpace=Module.establishStackSpace,Runtime.setTempRet0=Module.setTempRet0,Runtime.getTempRet0=Module.getTempRet0,Module.asm=asm;function ExitStatus(i){this.name="ExitStatus",this.message="Program terminated with exit("+i+")",this.status=i}ExitStatus.prototype=new Error,ExitStatus.prototype.constructor=ExitStatus;var initialStackTop,preloadStartTime=null,calledMain=!1;dependenciesFulfilled=function i(){Module.calledRun||run(),Module.calledRun||(dependenciesFulfilled=i)},Module.callMain=Module.callMain=function(o){o=o||[],ensureInitRuntime();var f=o.length+1;function p(){for(var N=0;N<4-1;N++)E.push(0)}var E=[allocate(intArrayFromString(Module.thisProgram),"i8",ALLOC_NORMAL)];p();for(var t=0;t0||(preRun(),runDependencies>0)||Module.calledRun)return;function o(){Module.calledRun||(Module.calledRun=!0,!ABORT&&(ensureInitRuntime(),preMain(),Module.onRuntimeInitialized&&Module.onRuntimeInitialized(),Module._main&&shouldRunNow&&Module.callMain(i),postRun()))}Module.setStatus?(Module.setStatus("Running..."),setTimeout(function(){setTimeout(function(){Module.setStatus("")},1),o()},1)):o()}Module.run=Module.run=run;function exit(i,o){o&&Module.noExitRuntime||(Module.noExitRuntime||(ABORT=!0,EXITSTATUS=i,STACKTOP=initialStackTop,exitRuntime(),Module.onExit&&Module.onExit(i)),ENVIRONMENT_IS_NODE&&process.exit(i),Module.quit(i,new ExitStatus(i)))}Module.exit=Module.exit=exit;var abortDecorators=[];function abort(i){Module.onAbort&&Module.onAbort(i),i!==void 0?(Module.print(i),Module.printErr(i),i=JSON.stringify(i)):i="",ABORT=!0,EXITSTATUS=1;var o=` +If this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.`,f="abort("+i+") at "+stackTrace()+o;throw abortDecorators&&abortDecorators.forEach(function(p){f=p(f,i)}),f}if(Module.abort=Module.abort=abort,Module.preInit)for(typeof Module.preInit=="function"&&(Module.preInit=[Module.preInit]);Module.preInit.length>0;)Module.preInit.pop()();var shouldRunNow=!0;Module.noInitialRun&&(shouldRunNow=!1),run()})});var eh=ce((Wne,O9)=>{"use strict";var tX=A9(),nX=R9(),hw=!1,vw=null;nX({},function(i,o){if(!hw){if(hw=!0,i)throw i;vw=o}});if(!hw)throw new Error("Failed to load the yoga module - it needed to be loaded synchronously, but didn't");O9.exports=tX(vw.bind,vw.lib)});var M9=ce((Vne,k9)=>{"use strict";k9.exports=({onlyFirst:i=!1}={})=>{let o=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(o,i?void 0:"g")}});var mw=ce((Gne,N9)=>{"use strict";var rX=M9();N9.exports=i=>typeof i=="string"?i.replace(rX(),""):i});var gw=ce((Yne,yw)=>{"use strict";var L9=i=>Number.isNaN(i)?!1:i>=4352&&(i<=4447||i===9001||i===9002||11904<=i&&i<=12871&&i!==12351||12880<=i&&i<=19903||19968<=i&&i<=42182||43360<=i&&i<=43388||44032<=i&&i<=55203||63744<=i&&i<=64255||65040<=i&&i<=65049||65072<=i&&i<=65131||65281<=i&&i<=65376||65504<=i&&i<=65510||110592<=i&&i<=110593||127488<=i&&i<=127569||131072<=i&&i<=262141);yw.exports=L9;yw.exports.default=L9});var b9=ce((Kne,F9)=>{"use strict";F9.exports=function(){return/\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g}});var m4=ce((Xne,_w)=>{"use strict";var iX=mw(),uX=gw(),oX=b9(),P9=i=>{if(i=i.replace(oX()," "),typeof i!="string"||i.length===0)return 0;i=iX(i);let o=0;for(let f=0;f=127&&p<=159||p>=768&&p<=879||(p>65535&&f++,o+=uX(p)?2:1)}return o};_w.exports=P9;_w.exports.default=P9});var Dw=ce((Qne,Ew)=>{"use strict";var lX=m4(),I9=i=>{let o=0;for(let f of i.split(` +`))o=Math.max(o,lX(f));return o};Ew.exports=I9;Ew.exports.default=I9});var B9=ce(vg=>{"use strict";var sX=vg&&vg.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(vg,"__esModule",{value:!0});var aX=sX(Dw()),ww={};vg.default=i=>{if(i.length===0)return{width:0,height:0};if(ww[i])return ww[i];let o=aX.default(i),f=i.split(` +`).length;return ww[i]={width:o,height:f},{width:o,height:f}}});var U9=ce(mg=>{"use strict";var fX=mg&&mg.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(mg,"__esModule",{value:!0});var Ii=fX(eh()),cX=(i,o)=>{"position"in o&&i.setPositionType(o.position==="absolute"?Ii.default.POSITION_TYPE_ABSOLUTE:Ii.default.POSITION_TYPE_RELATIVE)},dX=(i,o)=>{"marginLeft"in o&&i.setMargin(Ii.default.EDGE_START,o.marginLeft||0),"marginRight"in o&&i.setMargin(Ii.default.EDGE_END,o.marginRight||0),"marginTop"in o&&i.setMargin(Ii.default.EDGE_TOP,o.marginTop||0),"marginBottom"in o&&i.setMargin(Ii.default.EDGE_BOTTOM,o.marginBottom||0)},pX=(i,o)=>{"paddingLeft"in o&&i.setPadding(Ii.default.EDGE_LEFT,o.paddingLeft||0),"paddingRight"in o&&i.setPadding(Ii.default.EDGE_RIGHT,o.paddingRight||0),"paddingTop"in o&&i.setPadding(Ii.default.EDGE_TOP,o.paddingTop||0),"paddingBottom"in o&&i.setPadding(Ii.default.EDGE_BOTTOM,o.paddingBottom||0)},hX=(i,o)=>{var f;"flexGrow"in o&&i.setFlexGrow((f=o.flexGrow)!==null&&f!==void 0?f:0),"flexShrink"in o&&i.setFlexShrink(typeof o.flexShrink=="number"?o.flexShrink:1),"flexDirection"in o&&(o.flexDirection==="row"&&i.setFlexDirection(Ii.default.FLEX_DIRECTION_ROW),o.flexDirection==="row-reverse"&&i.setFlexDirection(Ii.default.FLEX_DIRECTION_ROW_REVERSE),o.flexDirection==="column"&&i.setFlexDirection(Ii.default.FLEX_DIRECTION_COLUMN),o.flexDirection==="column-reverse"&&i.setFlexDirection(Ii.default.FLEX_DIRECTION_COLUMN_REVERSE)),"flexBasis"in o&&(typeof o.flexBasis=="number"?i.setFlexBasis(o.flexBasis):typeof o.flexBasis=="string"?i.setFlexBasisPercent(Number.parseInt(o.flexBasis,10)):i.setFlexBasis(NaN)),"alignItems"in o&&((o.alignItems==="stretch"||!o.alignItems)&&i.setAlignItems(Ii.default.ALIGN_STRETCH),o.alignItems==="flex-start"&&i.setAlignItems(Ii.default.ALIGN_FLEX_START),o.alignItems==="center"&&i.setAlignItems(Ii.default.ALIGN_CENTER),o.alignItems==="flex-end"&&i.setAlignItems(Ii.default.ALIGN_FLEX_END)),"alignSelf"in o&&((o.alignSelf==="auto"||!o.alignSelf)&&i.setAlignSelf(Ii.default.ALIGN_AUTO),o.alignSelf==="flex-start"&&i.setAlignSelf(Ii.default.ALIGN_FLEX_START),o.alignSelf==="center"&&i.setAlignSelf(Ii.default.ALIGN_CENTER),o.alignSelf==="flex-end"&&i.setAlignSelf(Ii.default.ALIGN_FLEX_END)),"justifyContent"in o&&((o.justifyContent==="flex-start"||!o.justifyContent)&&i.setJustifyContent(Ii.default.JUSTIFY_FLEX_START),o.justifyContent==="center"&&i.setJustifyContent(Ii.default.JUSTIFY_CENTER),o.justifyContent==="flex-end"&&i.setJustifyContent(Ii.default.JUSTIFY_FLEX_END),o.justifyContent==="space-between"&&i.setJustifyContent(Ii.default.JUSTIFY_SPACE_BETWEEN),o.justifyContent==="space-around"&&i.setJustifyContent(Ii.default.JUSTIFY_SPACE_AROUND))},vX=(i,o)=>{var f,p;"width"in o&&(typeof o.width=="number"?i.setWidth(o.width):typeof o.width=="string"?i.setWidthPercent(Number.parseInt(o.width,10)):i.setWidthAuto()),"height"in o&&(typeof o.height=="number"?i.setHeight(o.height):typeof o.height=="string"?i.setHeightPercent(Number.parseInt(o.height,10)):i.setHeightAuto()),"minWidth"in o&&(typeof o.minWidth=="string"?i.setMinWidthPercent(Number.parseInt(o.minWidth,10)):i.setMinWidth((f=o.minWidth)!==null&&f!==void 0?f:0)),"minHeight"in o&&(typeof o.minHeight=="string"?i.setMinHeightPercent(Number.parseInt(o.minHeight,10)):i.setMinHeight((p=o.minHeight)!==null&&p!==void 0?p:0))},mX=(i,o)=>{"display"in o&&i.setDisplay(o.display==="flex"?Ii.default.DISPLAY_FLEX:Ii.default.DISPLAY_NONE)},yX=(i,o)=>{if("borderStyle"in o){let f=typeof o.borderStyle=="string"?1:0;i.setBorder(Ii.default.EDGE_TOP,f),i.setBorder(Ii.default.EDGE_BOTTOM,f),i.setBorder(Ii.default.EDGE_LEFT,f),i.setBorder(Ii.default.EDGE_RIGHT,f)}};mg.default=(i,o={})=>{cX(i,o),dX(i,o),pX(i,o),hX(i,o),vX(i,o),mX(i,o),yX(i,o)}});var z9=ce(($ne,j9)=>{"use strict";j9.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var Sw=ce((ere,q9)=>{var yg=z9(),H9={};for(let i of Object.keys(yg))H9[yg[i]]=i;var In={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};q9.exports=In;for(let i of Object.keys(In)){if(!("channels"in In[i]))throw new Error("missing channels property: "+i);if(!("labels"in In[i]))throw new Error("missing channel labels property: "+i);if(In[i].labels.length!==In[i].channels)throw new Error("channel and label counts mismatch: "+i);let{channels:o,labels:f}=In[i];delete In[i].channels,delete In[i].labels,Object.defineProperty(In[i],"channels",{value:o}),Object.defineProperty(In[i],"labels",{value:f})}In.rgb.hsl=function(i){let o=i[0]/255,f=i[1]/255,p=i[2]/255,E=Math.min(o,f,p),t=Math.max(o,f,p),k=t-E,L,N;t===E?L=0:o===t?L=(f-p)/k:f===t?L=2+(p-o)/k:p===t&&(L=4+(o-f)/k),L=Math.min(L*60,360),L<0&&(L+=360);let C=(E+t)/2;return t===E?N=0:C<=.5?N=k/(t+E):N=k/(2-t-E),[L,N*100,C*100]};In.rgb.hsv=function(i){let o,f,p,E,t,k=i[0]/255,L=i[1]/255,N=i[2]/255,C=Math.max(k,L,N),U=C-Math.min(k,L,N),q=function(W){return(C-W)/6/U+1/2};return U===0?(E=0,t=0):(t=U/C,o=q(k),f=q(L),p=q(N),k===C?E=p-f:L===C?E=1/3+o-p:N===C&&(E=2/3+f-o),E<0?E+=1:E>1&&(E-=1)),[E*360,t*100,C*100]};In.rgb.hwb=function(i){let o=i[0],f=i[1],p=i[2],E=In.rgb.hsl(i)[0],t=1/255*Math.min(o,Math.min(f,p));return p=1-1/255*Math.max(o,Math.max(f,p)),[E,t*100,p*100]};In.rgb.cmyk=function(i){let o=i[0]/255,f=i[1]/255,p=i[2]/255,E=Math.min(1-o,1-f,1-p),t=(1-o-E)/(1-E)||0,k=(1-f-E)/(1-E)||0,L=(1-p-E)/(1-E)||0;return[t*100,k*100,L*100,E*100]};function gX(i,o){return(i[0]-o[0])**2+(i[1]-o[1])**2+(i[2]-o[2])**2}In.rgb.keyword=function(i){let o=H9[i];if(o)return o;let f=Infinity,p;for(let E of Object.keys(yg)){let t=yg[E],k=gX(i,t);k.04045?((o+.055)/1.055)**2.4:o/12.92,f=f>.04045?((f+.055)/1.055)**2.4:f/12.92,p=p>.04045?((p+.055)/1.055)**2.4:p/12.92;let E=o*.4124+f*.3576+p*.1805,t=o*.2126+f*.7152+p*.0722,k=o*.0193+f*.1192+p*.9505;return[E*100,t*100,k*100]};In.rgb.lab=function(i){let o=In.rgb.xyz(i),f=o[0],p=o[1],E=o[2];f/=95.047,p/=100,E/=108.883,f=f>.008856?f**(1/3):7.787*f+16/116,p=p>.008856?p**(1/3):7.787*p+16/116,E=E>.008856?E**(1/3):7.787*E+16/116;let t=116*p-16,k=500*(f-p),L=200*(p-E);return[t,k,L]};In.hsl.rgb=function(i){let o=i[0]/360,f=i[1]/100,p=i[2]/100,E,t,k;if(f===0)return k=p*255,[k,k,k];p<.5?E=p*(1+f):E=p+f-p*f;let L=2*p-E,N=[0,0,0];for(let C=0;C<3;C++)t=o+1/3*-(C-1),t<0&&t++,t>1&&t--,6*t<1?k=L+(E-L)*6*t:2*t<1?k=E:3*t<2?k=L+(E-L)*(2/3-t)*6:k=L,N[C]=k*255;return N};In.hsl.hsv=function(i){let o=i[0],f=i[1]/100,p=i[2]/100,E=f,t=Math.max(p,.01);p*=2,f*=p<=1?p:2-p,E*=t<=1?t:2-t;let k=(p+f)/2,L=p===0?2*E/(t+E):2*f/(p+f);return[o,L*100,k*100]};In.hsv.rgb=function(i){let o=i[0]/60,f=i[1]/100,p=i[2]/100,E=Math.floor(o)%6,t=o-Math.floor(o),k=255*p*(1-f),L=255*p*(1-f*t),N=255*p*(1-f*(1-t));switch(p*=255,E){case 0:return[p,N,k];case 1:return[L,p,k];case 2:return[k,p,N];case 3:return[k,L,p];case 4:return[N,k,p];case 5:return[p,k,L]}};In.hsv.hsl=function(i){let o=i[0],f=i[1]/100,p=i[2]/100,E=Math.max(p,.01),t,k;k=(2-f)*p;let L=(2-f)*E;return t=f*E,t/=L<=1?L:2-L,t=t||0,k/=2,[o,t*100,k*100]};In.hwb.rgb=function(i){let o=i[0]/360,f=i[1]/100,p=i[2]/100,E=f+p,t;E>1&&(f/=E,p/=E);let k=Math.floor(6*o),L=1-p;t=6*o-k,(k&1)!=0&&(t=1-t);let N=f+t*(L-f),C,U,q;switch(k){default:case 6:case 0:C=L,U=N,q=f;break;case 1:C=N,U=L,q=f;break;case 2:C=f,U=L,q=N;break;case 3:C=f,U=N,q=L;break;case 4:C=N,U=f,q=L;break;case 5:C=L,U=f,q=N;break}return[C*255,U*255,q*255]};In.cmyk.rgb=function(i){let o=i[0]/100,f=i[1]/100,p=i[2]/100,E=i[3]/100,t=1-Math.min(1,o*(1-E)+E),k=1-Math.min(1,f*(1-E)+E),L=1-Math.min(1,p*(1-E)+E);return[t*255,k*255,L*255]};In.xyz.rgb=function(i){let o=i[0]/100,f=i[1]/100,p=i[2]/100,E,t,k;return E=o*3.2406+f*-1.5372+p*-.4986,t=o*-.9689+f*1.8758+p*.0415,k=o*.0557+f*-.204+p*1.057,E=E>.0031308?1.055*E**(1/2.4)-.055:E*12.92,t=t>.0031308?1.055*t**(1/2.4)-.055:t*12.92,k=k>.0031308?1.055*k**(1/2.4)-.055:k*12.92,E=Math.min(Math.max(0,E),1),t=Math.min(Math.max(0,t),1),k=Math.min(Math.max(0,k),1),[E*255,t*255,k*255]};In.xyz.lab=function(i){let o=i[0],f=i[1],p=i[2];o/=95.047,f/=100,p/=108.883,o=o>.008856?o**(1/3):7.787*o+16/116,f=f>.008856?f**(1/3):7.787*f+16/116,p=p>.008856?p**(1/3):7.787*p+16/116;let E=116*f-16,t=500*(o-f),k=200*(f-p);return[E,t,k]};In.lab.xyz=function(i){let o=i[0],f=i[1],p=i[2],E,t,k;t=(o+16)/116,E=f/500+t,k=t-p/200;let L=t**3,N=E**3,C=k**3;return t=L>.008856?L:(t-16/116)/7.787,E=N>.008856?N:(E-16/116)/7.787,k=C>.008856?C:(k-16/116)/7.787,E*=95.047,t*=100,k*=108.883,[E,t,k]};In.lab.lch=function(i){let o=i[0],f=i[1],p=i[2],E;E=Math.atan2(p,f)*360/2/Math.PI,E<0&&(E+=360);let k=Math.sqrt(f*f+p*p);return[o,k,E]};In.lch.lab=function(i){let o=i[0],f=i[1],E=i[2]/360*2*Math.PI,t=f*Math.cos(E),k=f*Math.sin(E);return[o,t,k]};In.rgb.ansi16=function(i,o=null){let[f,p,E]=i,t=o===null?In.rgb.hsv(i)[2]:o;if(t=Math.round(t/50),t===0)return 30;let k=30+(Math.round(E/255)<<2|Math.round(p/255)<<1|Math.round(f/255));return t===2&&(k+=60),k};In.hsv.ansi16=function(i){return In.rgb.ansi16(In.hsv.rgb(i),i[2])};In.rgb.ansi256=function(i){let o=i[0],f=i[1],p=i[2];return o===f&&f===p?o<8?16:o>248?231:Math.round((o-8)/247*24)+232:16+36*Math.round(o/255*5)+6*Math.round(f/255*5)+Math.round(p/255*5)};In.ansi16.rgb=function(i){let o=i%10;if(o===0||o===7)return i>50&&(o+=3.5),o=o/10.5*255,[o,o,o];let f=(~~(i>50)+1)*.5,p=(o&1)*f*255,E=(o>>1&1)*f*255,t=(o>>2&1)*f*255;return[p,E,t]};In.ansi256.rgb=function(i){if(i>=232){let t=(i-232)*10+8;return[t,t,t]}i-=16;let o,f=Math.floor(i/36)/5*255,p=Math.floor((o=i%36)/6)/5*255,E=o%6/5*255;return[f,p,E]};In.rgb.hex=function(i){let f=(((Math.round(i[0])&255)<<16)+((Math.round(i[1])&255)<<8)+(Math.round(i[2])&255)).toString(16).toUpperCase();return"000000".substring(f.length)+f};In.hex.rgb=function(i){let o=i.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!o)return[0,0,0];let f=o[0];o[0].length===3&&(f=f.split("").map(L=>L+L).join(""));let p=parseInt(f,16),E=p>>16&255,t=p>>8&255,k=p&255;return[E,t,k]};In.rgb.hcg=function(i){let o=i[0]/255,f=i[1]/255,p=i[2]/255,E=Math.max(Math.max(o,f),p),t=Math.min(Math.min(o,f),p),k=E-t,L,N;return k<1?L=t/(1-k):L=0,k<=0?N=0:E===o?N=(f-p)/k%6:E===f?N=2+(p-o)/k:N=4+(o-f)/k,N/=6,N%=1,[N*360,k*100,L*100]};In.hsl.hcg=function(i){let o=i[1]/100,f=i[2]/100,p=f<.5?2*o*f:2*o*(1-f),E=0;return p<1&&(E=(f-.5*p)/(1-p)),[i[0],p*100,E*100]};In.hsv.hcg=function(i){let o=i[1]/100,f=i[2]/100,p=o*f,E=0;return p<1&&(E=(f-p)/(1-p)),[i[0],p*100,E*100]};In.hcg.rgb=function(i){let o=i[0]/360,f=i[1]/100,p=i[2]/100;if(f===0)return[p*255,p*255,p*255];let E=[0,0,0],t=o%1*6,k=t%1,L=1-k,N=0;switch(Math.floor(t)){case 0:E[0]=1,E[1]=k,E[2]=0;break;case 1:E[0]=L,E[1]=1,E[2]=0;break;case 2:E[0]=0,E[1]=1,E[2]=k;break;case 3:E[0]=0,E[1]=L,E[2]=1;break;case 4:E[0]=k,E[1]=0,E[2]=1;break;default:E[0]=1,E[1]=0,E[2]=L}return N=(1-f)*p,[(f*E[0]+N)*255,(f*E[1]+N)*255,(f*E[2]+N)*255]};In.hcg.hsv=function(i){let o=i[1]/100,f=i[2]/100,p=o+f*(1-o),E=0;return p>0&&(E=o/p),[i[0],E*100,p*100]};In.hcg.hsl=function(i){let o=i[1]/100,p=i[2]/100*(1-o)+.5*o,E=0;return p>0&&p<.5?E=o/(2*p):p>=.5&&p<1&&(E=o/(2*(1-p))),[i[0],E*100,p*100]};In.hcg.hwb=function(i){let o=i[1]/100,f=i[2]/100,p=o+f*(1-o);return[i[0],(p-o)*100,(1-p)*100]};In.hwb.hcg=function(i){let o=i[1]/100,f=i[2]/100,p=1-f,E=p-o,t=0;return E<1&&(t=(p-E)/(1-E)),[i[0],E*100,t*100]};In.apple.rgb=function(i){return[i[0]/65535*255,i[1]/65535*255,i[2]/65535*255]};In.rgb.apple=function(i){return[i[0]/255*65535,i[1]/255*65535,i[2]/255*65535]};In.gray.rgb=function(i){return[i[0]/100*255,i[0]/100*255,i[0]/100*255]};In.gray.hsl=function(i){return[0,0,i[0]]};In.gray.hsv=In.gray.hsl;In.gray.hwb=function(i){return[0,100,i[0]]};In.gray.cmyk=function(i){return[0,0,0,i[0]]};In.gray.lab=function(i){return[i[0],0,0]};In.gray.hex=function(i){let o=Math.round(i[0]/100*255)&255,p=((o<<16)+(o<<8)+o).toString(16).toUpperCase();return"000000".substring(p.length)+p};In.rgb.gray=function(i){return[(i[0]+i[1]+i[2])/3/255*100]}});var V9=ce((tre,W9)=>{var y4=Sw();function _X(){let i={},o=Object.keys(y4);for(let f=o.length,p=0;p{var Tw=Sw(),SX=V9(),sm={},TX=Object.keys(Tw);function CX(i){let o=function(...f){let p=f[0];return p==null?p:(p.length>1&&(f=p),i(f))};return"conversion"in i&&(o.conversion=i.conversion),o}function xX(i){let o=function(...f){let p=f[0];if(p==null)return p;p.length>1&&(f=p);let E=i(f);if(typeof E=="object")for(let t=E.length,k=0;k{sm[i]={},Object.defineProperty(sm[i],"channels",{value:Tw[i].channels}),Object.defineProperty(sm[i],"labels",{value:Tw[i].labels});let o=SX(i);Object.keys(o).forEach(p=>{let E=o[p];sm[i][p]=xX(E),sm[i][p].raw=CX(E)})});G9.exports=sm});var _4=ce((rre,K9)=>{"use strict";var X9=(i,o)=>(...f)=>`[${i(...f)+o}m`,Q9=(i,o)=>(...f)=>{let p=i(...f);return`[${38+o};5;${p}m`},J9=(i,o)=>(...f)=>{let p=i(...f);return`[${38+o};2;${p[0]};${p[1]};${p[2]}m`},g4=i=>i,Z9=(i,o,f)=>[i,o,f],am=(i,o,f)=>{Object.defineProperty(i,o,{get:()=>{let p=f();return Object.defineProperty(i,o,{value:p,enumerable:!0,configurable:!0}),p},enumerable:!0,configurable:!0})},Cw,fm=(i,o,f,p)=>{Cw===void 0&&(Cw=Y9());let E=p?10:0,t={};for(let[k,L]of Object.entries(Cw)){let N=k==="ansi16"?"ansi":k;k===o?t[N]=i(f,E):typeof L=="object"&&(t[N]=i(L[o],E))}return t};function AX(){let i=new Map,o={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};o.color.gray=o.color.blackBright,o.bgColor.bgGray=o.bgColor.bgBlackBright,o.color.grey=o.color.blackBright,o.bgColor.bgGrey=o.bgColor.bgBlackBright;for(let[f,p]of Object.entries(o)){for(let[E,t]of Object.entries(p))o[E]={open:`[${t[0]}m`,close:`[${t[1]}m`},p[E]=o[E],i.set(t[0],t[1]);Object.defineProperty(o,f,{value:p,enumerable:!1})}return Object.defineProperty(o,"codes",{value:i,enumerable:!1}),o.color.close="",o.bgColor.close="",am(o.color,"ansi",()=>fm(X9,"ansi16",g4,!1)),am(o.color,"ansi256",()=>fm(Q9,"ansi256",g4,!1)),am(o.color,"ansi16m",()=>fm(J9,"rgb",Z9,!1)),am(o.bgColor,"ansi",()=>fm(X9,"ansi16",g4,!0)),am(o.bgColor,"ansi256",()=>fm(Q9,"ansi256",g4,!0)),am(o.bgColor,"ansi16m",()=>fm(J9,"rgb",Z9,!0)),o}Object.defineProperty(K9,"exports",{enumerable:!0,get:AX})});var tA=ce((ire,$9)=>{"use strict";var gg=m4(),RX=mw(),OX=_4(),xw=new Set(["","\x9B"]),kX=39,eA=i=>`${xw.values().next().value}[${i}m`,MX=i=>i.split(" ").map(o=>gg(o)),Aw=(i,o,f)=>{let p=[...o],E=!1,t=gg(RX(i[i.length-1]));for(let[k,L]of p.entries()){let N=gg(L);if(t+N<=f?i[i.length-1]+=L:(i.push(L),t=0),xw.has(L))E=!0;else if(E&&L==="m"){E=!1;continue}E||(t+=N,t===f&&k0&&i.length>1&&(i[i.length-2]+=i.pop())},NX=i=>{let o=i.split(" "),f=o.length;for(;f>0&&!(gg(o[f-1])>0);)f--;return f===o.length?i:o.slice(0,f).join(" ")+o.slice(f).join("")},LX=(i,o,f={})=>{if(f.trim!==!1&&i.trim()==="")return"";let p="",E="",t,k=MX(i),L=[""];for(let[N,C]of i.split(" ").entries()){f.trim!==!1&&(L[L.length-1]=L[L.length-1].trimLeft());let U=gg(L[L.length-1]);if(N!==0&&(U>=o&&(f.wordWrap===!1||f.trim===!1)&&(L.push(""),U=0),(U>0||f.trim===!1)&&(L[L.length-1]+=" ",U++)),f.hard&&k[N]>o){let q=o-U,W=1+Math.floor((k[N]-q-1)/o);Math.floor((k[N]-1)/o)o&&U>0&&k[N]>0){if(f.wordWrap===!1&&Uo&&f.wordWrap===!1){Aw(L,C,o);continue}L[L.length-1]+=C}f.trim!==!1&&(L=L.map(NX)),p=L.join(` +`);for(let[N,C]of[...p].entries()){if(E+=C,xw.has(C)){let q=parseFloat(/\d[^m]*/.exec(p.slice(N,N+4)));t=q===kX?null:q}let U=OX.codes.get(Number(t));t&&U&&(p[N+1]===` +`?E+=eA(U):C===` +`&&(E+=eA(t)))}return E};$9.exports=(i,o,f)=>String(i).normalize().replace(/\r\n/g,` +`).split(` +`).map(p=>LX(p,o,f)).join(` +`)});var iA=ce((ure,nA)=>{"use strict";var rA="[\uD800-\uDBFF][\uDC00-\uDFFF]",FX=i=>i&&i.exact?new RegExp(`^${rA}$`):new RegExp(rA,"g");nA.exports=FX});var Rw=ce((ore,uA)=>{"use strict";var bX=gw(),PX=iA(),oA=_4(),lA=["","\x9B"],E4=i=>`${lA[0]}[${i}m`,sA=(i,o,f)=>{let p=[];i=[...i];for(let E of i){let t=E;E.match(";")&&(E=E.split(";")[0][0]+"0");let k=oA.codes.get(parseInt(E,10));if(k){let L=i.indexOf(k.toString());L>=0?i.splice(L,1):p.push(E4(o?k:t))}else if(o){p.push(E4(0));break}else p.push(E4(t))}if(o&&(p=p.filter((E,t)=>p.indexOf(E)===t),f!==void 0)){let E=E4(oA.codes.get(parseInt(f,10)));p=p.reduce((t,k)=>k===E?[k,...t]:[...t,k],[])}return p.join("")};uA.exports=(i,o,f)=>{let p=[...i.normalize()],E=[];f=typeof f=="number"?f:p.length;let t=!1,k,L=0,N="";for(let[C,U]of p.entries()){let q=!1;if(lA.includes(U)){let W=/\d[^m]*/.exec(i.slice(C,C+18));k=W&&W.length>0?W[0]:void 0,Lo&&L<=f)N+=U;else if(L===o&&!t&&k!==void 0)N=sA(E);else if(L>=f){N+=sA(E,!0,k);break}}return N}});var fA=ce((lre,aA)=>{"use strict";var pd=Rw(),IX=m4();function D4(i,o,f){if(i.charAt(o)===" ")return o;for(let p=1;p<=3;p++)if(f){if(i.charAt(o+p)===" ")return o+p}else if(i.charAt(o-p)===" ")return o-p;return o}aA.exports=(i,o,f)=>{f=E0({position:"end",preferTruncationOnSpace:!1},f);let{position:p,space:E,preferTruncationOnSpace:t}=f,k="\u2026",L=1;if(typeof i!="string")throw new TypeError(`Expected \`input\` to be a string, got ${typeof i}`);if(typeof o!="number")throw new TypeError(`Expected \`columns\` to be a number, got ${typeof o}`);if(o<1)return"";if(o===1)return k;let N=IX(i);if(N<=o)return i;if(p==="start"){if(t){let C=D4(i,N-o+1,!0);return k+pd(i,C,N).trim()}return E===!0&&(k+=" ",L=2),k+pd(i,N-o+L,N)}if(p==="middle"){E===!0&&(k=" "+k+" ",L=3);let C=Math.floor(o/2);if(t){let U=D4(i,C),q=D4(i,N-(o-C)+1,!0);return pd(i,0,U)+k+pd(i,q,N).trim()}return pd(i,0,C)+k+pd(i,N-(o-C)+L,N)}if(p==="end"){if(t){let C=D4(i,o-1);return pd(i,0,C)+k}return E===!0&&(k=" "+k,L=2),pd(i,0,o-L)+k}throw new Error(`Expected \`options.position\` to be either \`start\`, \`middle\` or \`end\`, got ${p}`)}});var kw=ce(_g=>{"use strict";var cA=_g&&_g.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(_g,"__esModule",{value:!0});var BX=cA(tA()),UX=cA(fA()),Ow={};_g.default=(i,o,f)=>{let p=i+String(o)+String(f);if(Ow[p])return Ow[p];let E=i;if(f==="wrap"&&(E=BX.default(i,o,{trim:!1,hard:!0})),f.startsWith("truncate")){let t="end";f==="truncate-middle"&&(t="middle"),f==="truncate-start"&&(t="start"),E=UX.default(i,o,{position:t})}return Ow[p]=E,E}});var Nw=ce(Mw=>{"use strict";Object.defineProperty(Mw,"__esModule",{value:!0});var dA=i=>{let o="";if(i.childNodes.length>0)for(let f of i.childNodes){let p="";f.nodeName==="#text"?p=f.nodeValue:((f.nodeName==="ink-text"||f.nodeName==="ink-virtual-text")&&(p=dA(f)),p.length>0&&typeof f.internal_transform=="function"&&(p=f.internal_transform(p))),o+=p}return o};Mw.default=dA});var Lw=ce(l0=>{"use strict";var Eg=l0&&l0.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(l0,"__esModule",{value:!0});l0.setTextNodeValue=l0.createTextNode=l0.setStyle=l0.setAttribute=l0.removeChildNode=l0.insertBeforeNode=l0.appendChildNode=l0.createNode=l0.TEXT_NAME=void 0;var jX=Eg(eh()),pA=Eg(B9()),zX=Eg(U9()),qX=Eg(kw()),HX=Eg(Nw());l0.TEXT_NAME="#text";l0.createNode=i=>{var o;let f={nodeName:i,style:{},attributes:{},childNodes:[],parentNode:null,yogaNode:i==="ink-virtual-text"?void 0:jX.default.Node.create()};return i==="ink-text"&&((o=f.yogaNode)===null||o===void 0||o.setMeasureFunc(WX.bind(null,f))),f};l0.appendChildNode=(i,o)=>{var f;o.parentNode&&l0.removeChildNode(o.parentNode,o),o.parentNode=i,i.childNodes.push(o),o.yogaNode&&((f=i.yogaNode)===null||f===void 0||f.insertChild(o.yogaNode,i.yogaNode.getChildCount())),(i.nodeName==="ink-text"||i.nodeName==="ink-virtual-text")&&w4(i)};l0.insertBeforeNode=(i,o,f)=>{var p,E;o.parentNode&&l0.removeChildNode(o.parentNode,o),o.parentNode=i;let t=i.childNodes.indexOf(f);if(t>=0){i.childNodes.splice(t,0,o),o.yogaNode&&((p=i.yogaNode)===null||p===void 0||p.insertChild(o.yogaNode,t));return}i.childNodes.push(o),o.yogaNode&&((E=i.yogaNode)===null||E===void 0||E.insertChild(o.yogaNode,i.yogaNode.getChildCount())),(i.nodeName==="ink-text"||i.nodeName==="ink-virtual-text")&&w4(i)};l0.removeChildNode=(i,o)=>{var f,p;o.yogaNode&&((p=(f=o.parentNode)===null||f===void 0?void 0:f.yogaNode)===null||p===void 0||p.removeChild(o.yogaNode)),o.parentNode=null;let E=i.childNodes.indexOf(o);E>=0&&i.childNodes.splice(E,1),(i.nodeName==="ink-text"||i.nodeName==="ink-virtual-text")&&w4(i)};l0.setAttribute=(i,o,f)=>{i.attributes[o]=f};l0.setStyle=(i,o)=>{i.style=o,i.yogaNode&&zX.default(i.yogaNode,o)};l0.createTextNode=i=>{let o={nodeName:"#text",nodeValue:i,yogaNode:void 0,parentNode:null,style:{}};return l0.setTextNodeValue(o,i),o};var WX=function(i,o){var f,p;let E=i.nodeName==="#text"?i.nodeValue:HX.default(i),t=pA.default(E);if(t.width<=o||t.width>=1&&o>0&&o<1)return t;let k=(p=(f=i.style)===null||f===void 0?void 0:f.textWrap)!==null&&p!==void 0?p:"wrap",L=qX.default(E,o,k);return pA.default(L)},hA=i=>{var o;if(!(!i||!i.parentNode))return(o=i.yogaNode)!==null&&o!==void 0?o:hA(i.parentNode)},w4=i=>{let o=hA(i);o==null||o.markDirty()};l0.setTextNodeValue=(i,o)=>{typeof o!="string"&&(o=String(o)),i.nodeValue=o,w4(i)}});var th=ce((cre,vA)=>{"use strict";vA.exports={BINARY_TYPES:["nodebuffer","arraybuffer","fragments"],GUID:"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",kStatusCode:Symbol("status-code"),kWebSocket:Symbol("websocket"),EMPTY_BUFFER:Buffer.alloc(0),NOOP:()=>{}}});var Dg=ce((dre,Fw)=>{"use strict";var{EMPTY_BUFFER:VX}=th();function mA(i,o){if(i.length===0)return VX;if(i.length===1)return i[0];let f=Buffer.allocUnsafe(o),p=0;for(let E=0;E{"use strict";var DA=Symbol("kDone"),bw=Symbol("kRun"),wA=class{constructor(o){this[DA]=()=>{this.pending--,this[bw]()},this.concurrency=o||Infinity,this.jobs=[],this.pending=0}add(o){this.jobs.push(o),this[bw]()}[bw](){if(this.pending!==this.concurrency&&this.jobs.length){let o=this.jobs.shift();this.pending++,o(this[DA])}}};EA.exports=wA});var Tg=ce((hre,TA)=>{"use strict";var wg=require("zlib"),CA=Dg(),GX=SA(),{kStatusCode:xA,NOOP:YX}=th(),KX=Buffer.from([0,0,255,255]),T4=Symbol("permessage-deflate"),G1=Symbol("total-length"),Sg=Symbol("callback"),hd=Symbol("buffers"),Pw=Symbol("error"),C4,AA=class{constructor(o,f,p){if(this._maxPayload=p|0,this._options=o||{},this._threshold=this._options.threshold!==void 0?this._options.threshold:1024,this._isServer=!!f,this._deflate=null,this._inflate=null,this.params=null,!C4){let E=this._options.concurrencyLimit!==void 0?this._options.concurrencyLimit:10;C4=new GX(E)}}static get extensionName(){return"permessage-deflate"}offer(){let o={};return this._options.serverNoContextTakeover&&(o.server_no_context_takeover=!0),this._options.clientNoContextTakeover&&(o.client_no_context_takeover=!0),this._options.serverMaxWindowBits&&(o.server_max_window_bits=this._options.serverMaxWindowBits),this._options.clientMaxWindowBits?o.client_max_window_bits=this._options.clientMaxWindowBits:this._options.clientMaxWindowBits==null&&(o.client_max_window_bits=!0),o}accept(o){return o=this.normalizeParams(o),this.params=this._isServer?this.acceptAsServer(o):this.acceptAsClient(o),this.params}cleanup(){if(this._inflate&&(this._inflate.close(),this._inflate=null),this._deflate){let o=this._deflate[Sg];this._deflate.close(),this._deflate=null,o&&o(new Error("The deflate stream was closed while data was being processed"))}}acceptAsServer(o){let f=this._options,p=o.find(E=>!(f.serverNoContextTakeover===!1&&E.server_no_context_takeover||E.server_max_window_bits&&(f.serverMaxWindowBits===!1||typeof f.serverMaxWindowBits=="number"&&f.serverMaxWindowBits>E.server_max_window_bits)||typeof f.clientMaxWindowBits=="number"&&!E.client_max_window_bits));if(!p)throw new Error("None of the extension offers can be accepted");return f.serverNoContextTakeover&&(p.server_no_context_takeover=!0),f.clientNoContextTakeover&&(p.client_no_context_takeover=!0),typeof f.serverMaxWindowBits=="number"&&(p.server_max_window_bits=f.serverMaxWindowBits),typeof f.clientMaxWindowBits=="number"?p.client_max_window_bits=f.clientMaxWindowBits:(p.client_max_window_bits===!0||f.clientMaxWindowBits===!1)&&delete p.client_max_window_bits,p}acceptAsClient(o){let f=o[0];if(this._options.clientNoContextTakeover===!1&&f.client_no_context_takeover)throw new Error('Unexpected parameter "client_no_context_takeover"');if(!f.client_max_window_bits)typeof this._options.clientMaxWindowBits=="number"&&(f.client_max_window_bits=this._options.clientMaxWindowBits);else if(this._options.clientMaxWindowBits===!1||typeof this._options.clientMaxWindowBits=="number"&&f.client_max_window_bits>this._options.clientMaxWindowBits)throw new Error('Unexpected or invalid parameter "client_max_window_bits"');return f}normalizeParams(o){return o.forEach(f=>{Object.keys(f).forEach(p=>{let E=f[p];if(E.length>1)throw new Error(`Parameter "${p}" must have only a single value`);if(E=E[0],p==="client_max_window_bits"){if(E!==!0){let t=+E;if(!Number.isInteger(t)||t<8||t>15)throw new TypeError(`Invalid value for parameter "${p}": ${E}`);E=t}else if(!this._isServer)throw new TypeError(`Invalid value for parameter "${p}": ${E}`)}else if(p==="server_max_window_bits"){let t=+E;if(!Number.isInteger(t)||t<8||t>15)throw new TypeError(`Invalid value for parameter "${p}": ${E}`);E=t}else if(p==="client_no_context_takeover"||p==="server_no_context_takeover"){if(E!==!0)throw new TypeError(`Invalid value for parameter "${p}": ${E}`)}else throw new Error(`Unknown parameter "${p}"`);f[p]=E})}),o}decompress(o,f,p){C4.add(E=>{this._decompress(o,f,(t,k)=>{E(),p(t,k)})})}compress(o,f,p){C4.add(E=>{this._compress(o,f,(t,k)=>{E(),p(t,k)})})}_decompress(o,f,p){let E=this._isServer?"client":"server";if(!this._inflate){let t=`${E}_max_window_bits`,k=typeof this.params[t]!="number"?wg.Z_DEFAULT_WINDOWBITS:this.params[t];this._inflate=wg.createInflateRaw(Gf(E0({},this._options.zlibInflateOptions),{windowBits:k})),this._inflate[T4]=this,this._inflate[G1]=0,this._inflate[hd]=[],this._inflate.on("error",QX),this._inflate.on("data",RA)}this._inflate[Sg]=p,this._inflate.write(o),f&&this._inflate.write(KX),this._inflate.flush(()=>{let t=this._inflate[Pw];if(t){this._inflate.close(),this._inflate=null,p(t);return}let k=CA.concat(this._inflate[hd],this._inflate[G1]);this._inflate._readableState.endEmitted?(this._inflate.close(),this._inflate=null):(this._inflate[G1]=0,this._inflate[hd]=[],f&&this.params[`${E}_no_context_takeover`]&&this._inflate.reset()),p(null,k)})}_compress(o,f,p){let E=this._isServer?"server":"client";if(!this._deflate){let t=`${E}_max_window_bits`,k=typeof this.params[t]!="number"?wg.Z_DEFAULT_WINDOWBITS:this.params[t];this._deflate=wg.createDeflateRaw(Gf(E0({},this._options.zlibDeflateOptions),{windowBits:k})),this._deflate[G1]=0,this._deflate[hd]=[],this._deflate.on("error",YX),this._deflate.on("data",XX)}this._deflate[Sg]=p,this._deflate.write(o),this._deflate.flush(wg.Z_SYNC_FLUSH,()=>{if(!this._deflate)return;let t=CA.concat(this._deflate[hd],this._deflate[G1]);f&&(t=t.slice(0,t.length-4)),this._deflate[Sg]=null,this._deflate[G1]=0,this._deflate[hd]=[],f&&this.params[`${E}_no_context_takeover`]&&this._deflate.reset(),p(null,t)})}};TA.exports=AA;function XX(i){this[hd].push(i),this[G1]+=i.length}function RA(i){if(this[G1]+=i.length,this[T4]._maxPayload<1||this[G1]<=this[T4]._maxPayload){this[hd].push(i);return}this[Pw]=new RangeError("Max payload size exceeded"),this[Pw][xA]=1009,this.removeListener("data",RA),this.reset()}function QX(i){this[T4]._inflate=null,i[xA]=1007,this[Sg](i)}});var Bw=ce((vre,Iw)=>{"use strict";function OA(i){return i>=1e3&&i<=1014&&i!==1004&&i!==1005&&i!==1006||i>=3e3&&i<=4999}function kA(i){let o=i.length,f=0;for(;f=o||(i[f+1]&192)!=128||(i[f+2]&192)!=128||i[f]===224&&(i[f+1]&224)==128||i[f]===237&&(i[f+1]&224)==160)return!1;f+=3}else if((i[f]&248)==240){if(f+3>=o||(i[f+1]&192)!=128||(i[f+2]&192)!=128||(i[f+3]&192)!=128||i[f]===240&&(i[f+1]&240)==128||i[f]===244&&i[f+1]>143||i[f]>244)return!1;f+=4}else return!1;return!0}try{let i=require("utf-8-validate");typeof i=="object"&&(i=i.Validation.isValidUTF8),Iw.exports={isValidStatusCode:OA,isValidUTF8(o){return o.length<150?kA(o):i(o)}}}catch(i){Iw.exports={isValidStatusCode:OA,isValidUTF8:kA}}});var zw=ce((mre,MA)=>{"use strict";var{Writable:JX}=require("stream"),NA=Tg(),{BINARY_TYPES:ZX,EMPTY_BUFFER:$X,kStatusCode:eQ,kWebSocket:tQ}=th(),{concat:Uw,toArrayBuffer:nQ,unmask:rQ}=Dg(),{isValidStatusCode:iQ,isValidUTF8:LA}=Bw(),Cg=0,FA=1,bA=2,PA=3,jw=4,uQ=5,IA=class extends JX{constructor(o,f,p,E){super();this._binaryType=o||ZX[0],this[tQ]=void 0,this._extensions=f||{},this._isServer=!!p,this._maxPayload=E|0,this._bufferedBytes=0,this._buffers=[],this._compressed=!1,this._payloadLength=0,this._mask=void 0,this._fragmented=0,this._masked=!1,this._fin=!1,this._opcode=0,this._totalPayloadLength=0,this._messageLength=0,this._fragments=[],this._state=Cg,this._loop=!1}_write(o,f,p){if(this._opcode===8&&this._state==Cg)return p();this._bufferedBytes+=o.length,this._buffers.push(o),this.startLoop(p)}consume(o){if(this._bufferedBytes-=o,o===this._buffers[0].length)return this._buffers.shift();if(o=p.length?f.set(this._buffers.shift(),E):(f.set(new Uint8Array(p.buffer,p.byteOffset,o),E),this._buffers[0]=p.slice(o)),o-=p.length}while(o>0);return f}startLoop(o){let f;this._loop=!0;do switch(this._state){case Cg:f=this.getInfo();break;case FA:f=this.getPayloadLength16();break;case bA:f=this.getPayloadLength64();break;case PA:this.getMask();break;case jw:f=this.getData(o);break;default:this._loop=!1;return}while(this._loop);o(f)}getInfo(){if(this._bufferedBytes<2){this._loop=!1;return}let o=this.consume(2);if((o[0]&48)!=0)return this._loop=!1,Ho(RangeError,"RSV2 and RSV3 must be clear",!0,1002);let f=(o[0]&64)==64;if(f&&!this._extensions[NA.extensionName])return this._loop=!1,Ho(RangeError,"RSV1 must be clear",!0,1002);if(this._fin=(o[0]&128)==128,this._opcode=o[0]&15,this._payloadLength=o[1]&127,this._opcode===0){if(f)return this._loop=!1,Ho(RangeError,"RSV1 must be clear",!0,1002);if(!this._fragmented)return this._loop=!1,Ho(RangeError,"invalid opcode 0",!0,1002);this._opcode=this._fragmented}else if(this._opcode===1||this._opcode===2){if(this._fragmented)return this._loop=!1,Ho(RangeError,`invalid opcode ${this._opcode}`,!0,1002);this._compressed=f}else if(this._opcode>7&&this._opcode<11){if(!this._fin)return this._loop=!1,Ho(RangeError,"FIN must be set",!0,1002);if(f)return this._loop=!1,Ho(RangeError,"RSV1 must be clear",!0,1002);if(this._payloadLength>125)return this._loop=!1,Ho(RangeError,`invalid payload length ${this._payloadLength}`,!0,1002)}else return this._loop=!1,Ho(RangeError,`invalid opcode ${this._opcode}`,!0,1002);if(!this._fin&&!this._fragmented&&(this._fragmented=this._opcode),this._masked=(o[1]&128)==128,this._isServer){if(!this._masked)return this._loop=!1,Ho(RangeError,"MASK must be set",!0,1002)}else if(this._masked)return this._loop=!1,Ho(RangeError,"MASK must be clear",!0,1002);if(this._payloadLength===126)this._state=FA;else if(this._payloadLength===127)this._state=bA;else return this.haveLength()}getPayloadLength16(){if(this._bufferedBytes<2){this._loop=!1;return}return this._payloadLength=this.consume(2).readUInt16BE(0),this.haveLength()}getPayloadLength64(){if(this._bufferedBytes<8){this._loop=!1;return}let o=this.consume(8),f=o.readUInt32BE(0);return f>Math.pow(2,53-32)-1?(this._loop=!1,Ho(RangeError,"Unsupported WebSocket frame: payload length > 2^53 - 1",!1,1009)):(this._payloadLength=f*Math.pow(2,32)+o.readUInt32BE(4),this.haveLength())}haveLength(){if(this._payloadLength&&this._opcode<8&&(this._totalPayloadLength+=this._payloadLength,this._totalPayloadLength>this._maxPayload&&this._maxPayload>0))return this._loop=!1,Ho(RangeError,"Max payload size exceeded",!1,1009);this._masked?this._state=PA:this._state=jw}getMask(){if(this._bufferedBytes<4){this._loop=!1;return}this._mask=this.consume(4),this._state=jw}getData(o){let f=$X;if(this._payloadLength){if(this._bufferedBytes7)return this.controlMessage(f);if(this._compressed){this._state=uQ,this.decompress(f,o);return}return f.length&&(this._messageLength=this._totalPayloadLength,this._fragments.push(f)),this.dataMessage()}decompress(o,f){this._extensions[NA.extensionName].decompress(o,this._fin,(E,t)=>{if(E)return f(E);if(t.length){if(this._messageLength+=t.length,this._messageLength>this._maxPayload&&this._maxPayload>0)return f(Ho(RangeError,"Max payload size exceeded",!1,1009));this._fragments.push(t)}let k=this.dataMessage();if(k)return f(k);this.startLoop(f)})}dataMessage(){if(this._fin){let o=this._messageLength,f=this._fragments;if(this._totalPayloadLength=0,this._messageLength=0,this._fragmented=0,this._fragments=[],this._opcode===2){let p;this._binaryType==="nodebuffer"?p=Uw(f,o):this._binaryType==="arraybuffer"?p=nQ(Uw(f,o)):p=f,this.emit("message",p)}else{let p=Uw(f,o);if(!LA(p))return this._loop=!1,Ho(Error,"invalid UTF-8 sequence",!0,1007);this.emit("message",p.toString())}}this._state=Cg}controlMessage(o){if(this._opcode===8)if(this._loop=!1,o.length===0)this.emit("conclude",1005,""),this.end();else{if(o.length===1)return Ho(RangeError,"invalid payload length 1",!0,1002);{let f=o.readUInt16BE(0);if(!iQ(f))return Ho(RangeError,`invalid status code ${f}`,!0,1002);let p=o.slice(2);if(!LA(p))return Ho(Error,"invalid UTF-8 sequence",!0,1007);this.emit("conclude",f,p.toString()),this.end()}}else this._opcode===9?this.emit("ping",o):this.emit("pong",o);this._state=Cg}};MA.exports=IA;function Ho(i,o,f,p){let E=new i(f?`Invalid WebSocket frame: ${o}`:o);return Error.captureStackTrace(E,Ho),E[eQ]=p,E}});var qw=ce((yre,BA)=>{"use strict";var{randomFillSync:oQ}=require("crypto"),UA=Tg(),{EMPTY_BUFFER:lQ}=th(),{isValidStatusCode:sQ}=Bw(),{mask:jA,toBuffer:Y1}=Dg(),nh=Buffer.alloc(4),K1=class{constructor(o,f){this._extensions=f||{},this._socket=o,this._firstFragment=!0,this._compress=!1,this._bufferedBytes=0,this._deflating=!1,this._queue=[]}static frame(o,f){let p=f.mask&&f.readOnly,E=f.mask?6:2,t=o.length;o.length>=65536?(E+=8,t=127):o.length>125&&(E+=2,t=126);let k=Buffer.allocUnsafe(p?o.length+E:E);return k[0]=f.fin?f.opcode|128:f.opcode,f.rsv1&&(k[0]|=64),k[1]=t,t===126?k.writeUInt16BE(o.length,2):t===127&&(k.writeUInt32BE(0,2),k.writeUInt32BE(o.length,6)),f.mask?(oQ(nh,0,4),k[1]|=128,k[E-4]=nh[0],k[E-3]=nh[1],k[E-2]=nh[2],k[E-1]=nh[3],p?(jA(o,nh,k,E,o.length),[k]):(jA(o,nh,o,0,o.length),[k,o])):[k,o]}close(o,f,p,E){let t;if(o===void 0)t=lQ;else{if(typeof o!="number"||!sQ(o))throw new TypeError("First argument must be a valid error code number");if(f===void 0||f==="")t=Buffer.allocUnsafe(2),t.writeUInt16BE(o,0);else{let k=Buffer.byteLength(f);if(k>123)throw new RangeError("The message must not be greater than 123 bytes");t=Buffer.allocUnsafe(2+k),t.writeUInt16BE(o,0),t.write(f,2)}}this._deflating?this.enqueue([this.doClose,t,p,E]):this.doClose(t,p,E)}doClose(o,f,p){this.sendFrame(K1.frame(o,{fin:!0,rsv1:!1,opcode:8,mask:f,readOnly:!1}),p)}ping(o,f,p){let E=Y1(o);if(E.length>125)throw new RangeError("The data size must not be greater than 125 bytes");this._deflating?this.enqueue([this.doPing,E,f,Y1.readOnly,p]):this.doPing(E,f,Y1.readOnly,p)}doPing(o,f,p,E){this.sendFrame(K1.frame(o,{fin:!0,rsv1:!1,opcode:9,mask:f,readOnly:p}),E)}pong(o,f,p){let E=Y1(o);if(E.length>125)throw new RangeError("The data size must not be greater than 125 bytes");this._deflating?this.enqueue([this.doPong,E,f,Y1.readOnly,p]):this.doPong(E,f,Y1.readOnly,p)}doPong(o,f,p,E){this.sendFrame(K1.frame(o,{fin:!0,rsv1:!1,opcode:10,mask:f,readOnly:p}),E)}send(o,f,p){let E=Y1(o),t=this._extensions[UA.extensionName],k=f.binary?2:1,L=f.compress;if(this._firstFragment?(this._firstFragment=!1,L&&t&&(L=E.length>=t._threshold),this._compress=L):(L=!1,k=0),f.fin&&(this._firstFragment=!0),t){let N={fin:f.fin,rsv1:L,opcode:k,mask:f.mask,readOnly:Y1.readOnly};this._deflating?this.enqueue([this.dispatch,E,this._compress,N,p]):this.dispatch(E,this._compress,N,p)}else this.sendFrame(K1.frame(E,{fin:f.fin,rsv1:!1,opcode:k,mask:f.mask,readOnly:Y1.readOnly}),p)}dispatch(o,f,p,E){if(!f){this.sendFrame(K1.frame(o,p),E);return}let t=this._extensions[UA.extensionName];this._bufferedBytes+=o.length,this._deflating=!0,t.compress(o,p.fin,(k,L)=>{if(this._socket.destroyed){let N=new Error("The socket was closed while data was being compressed");typeof E=="function"&&E(N);for(let C=0;C{"use strict";var xg=class{constructor(o,f){this.target=f,this.type=o}},qA=class extends xg{constructor(o,f){super("message",f);this.data=o}},HA=class extends xg{constructor(o,f,p){super("close",p);this.wasClean=p._closeFrameReceived&&p._closeFrameSent,this.reason=f,this.code=o}},WA=class extends xg{constructor(o){super("open",o)}},VA=class extends xg{constructor(o,f){super("error",f);this.message=o.message,this.error=o}},aQ={addEventListener(i,o,f){if(typeof o!="function")return;function p(N){o.call(this,new qA(N,this))}function E(N,C){o.call(this,new HA(N,C,this))}function t(N){o.call(this,new VA(N,this))}function k(){o.call(this,new WA(this))}let L=f&&f.once?"once":"on";i==="message"?(p._listener=o,this[L](i,p)):i==="close"?(E._listener=o,this[L](i,E)):i==="error"?(t._listener=o,this[L](i,t)):i==="open"?(k._listener=o,this[L](i,k)):this[L](i,o)},removeEventListener(i,o){let f=this.listeners(i);for(let p=0;p{"use strict";var Ag=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0];function Pc(i,o,f){i[o]===void 0?i[o]=[f]:i[o].push(f)}function fQ(i){let o=Object.create(null);if(i===void 0||i==="")return o;let f=Object.create(null),p=!1,E=!1,t=!1,k,L,N=-1,C=-1,U=0;for(;U{let f=i[o];return Array.isArray(f)||(f=[f]),f.map(p=>[o].concat(Object.keys(p).map(E=>{let t=p[E];return Array.isArray(t)||(t=[t]),t.map(k=>k===!0?E:`${E}=${k}`).join("; ")})).join("; ")).join(", ")}).join(", ")}YA.exports={format:cQ,parse:fQ}});var Kw=ce((Ere,KA)=>{"use strict";var dQ=require("events"),pQ=require("https"),hQ=require("http"),XA=require("net"),vQ=require("tls"),{randomBytes:mQ,createHash:yQ}=require("crypto"),{URL:Ww}=require("url"),vd=Tg(),gQ=zw(),_Q=qw(),{BINARY_TYPES:QA,EMPTY_BUFFER:Vw,GUID:EQ,kStatusCode:DQ,kWebSocket:Qs,NOOP:JA}=th(),{addEventListener:wQ,removeEventListener:SQ}=GA(),{format:TQ,parse:CQ}=Hw(),{toBuffer:xQ}=Dg(),ZA=["CONNECTING","OPEN","CLOSING","CLOSED"],Gw=[8,13],AQ=30*1e3,Bi=class extends dQ{constructor(o,f,p){super();this._binaryType=QA[0],this._closeCode=1006,this._closeFrameReceived=!1,this._closeFrameSent=!1,this._closeMessage="",this._closeTimer=null,this._extensions={},this._protocol="",this._readyState=Bi.CONNECTING,this._receiver=null,this._sender=null,this._socket=null,o!==null?(this._bufferedAmount=0,this._isServer=!1,this._redirects=0,Array.isArray(f)?f=f.join(", "):typeof f=="object"&&f!==null&&(p=f,f=void 0),$A(this,o,f,p)):this._isServer=!0}get binaryType(){return this._binaryType}set binaryType(o){!QA.includes(o)||(this._binaryType=o,this._receiver&&(this._receiver._binaryType=o))}get bufferedAmount(){return this._socket?this._socket._writableState.length+this._sender._bufferedBytes:this._bufferedAmount}get extensions(){return Object.keys(this._extensions).join()}get protocol(){return this._protocol}get readyState(){return this._readyState}get url(){return this._url}setSocket(o,f,p){let E=new gQ(this.binaryType,this._extensions,this._isServer,p);this._sender=new _Q(o,this._extensions),this._receiver=E,this._socket=o,E[Qs]=this,o[Qs]=this,E.on("conclude",RQ),E.on("drain",OQ),E.on("error",kQ),E.on("message",MQ),E.on("ping",NQ),E.on("pong",LQ),o.setTimeout(0),o.setNoDelay(),f.length>0&&o.unshift(f),o.on("close",eR),o.on("data",x4),o.on("end",tR),o.on("error",nR),this._readyState=Bi.OPEN,this.emit("open")}emitClose(){if(!this._socket){this._readyState=Bi.CLOSED,this.emit("close",this._closeCode,this._closeMessage);return}this._extensions[vd.extensionName]&&this._extensions[vd.extensionName].cleanup(),this._receiver.removeAllListeners(),this._readyState=Bi.CLOSED,this.emit("close",this._closeCode,this._closeMessage)}close(o,f){if(this.readyState!==Bi.CLOSED){if(this.readyState===Bi.CONNECTING){let p="WebSocket was closed before the connection was established";return X1(this,this._req,p)}if(this.readyState===Bi.CLOSING){this._closeFrameSent&&this._closeFrameReceived&&this._socket.end();return}this._readyState=Bi.CLOSING,this._sender.close(o,f,!this._isServer,p=>{p||(this._closeFrameSent=!0,this._closeFrameReceived&&this._socket.end())}),this._closeTimer=setTimeout(this._socket.destroy.bind(this._socket),AQ)}}ping(o,f,p){if(this.readyState===Bi.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof o=="function"?(p=o,o=f=void 0):typeof f=="function"&&(p=f,f=void 0),typeof o=="number"&&(o=o.toString()),this.readyState!==Bi.OPEN){Yw(this,o,p);return}f===void 0&&(f=!this._isServer),this._sender.ping(o||Vw,f,p)}pong(o,f,p){if(this.readyState===Bi.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof o=="function"?(p=o,o=f=void 0):typeof f=="function"&&(p=f,f=void 0),typeof o=="number"&&(o=o.toString()),this.readyState!==Bi.OPEN){Yw(this,o,p);return}f===void 0&&(f=!this._isServer),this._sender.pong(o||Vw,f,p)}send(o,f,p){if(this.readyState===Bi.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof f=="function"&&(p=f,f={}),typeof o=="number"&&(o=o.toString()),this.readyState!==Bi.OPEN){Yw(this,o,p);return}let E=E0({binary:typeof o!="string",mask:!this._isServer,compress:!0,fin:!0},f);this._extensions[vd.extensionName]||(E.compress=!1),this._sender.send(o||Vw,E,p)}terminate(){if(this.readyState!==Bi.CLOSED){if(this.readyState===Bi.CONNECTING){let o="WebSocket was closed before the connection was established";return X1(this,this._req,o)}this._socket&&(this._readyState=Bi.CLOSING,this._socket.destroy())}}};ZA.forEach((i,o)=>{let f={enumerable:!0,value:o};Object.defineProperty(Bi.prototype,i,f),Object.defineProperty(Bi,i,f)});["binaryType","bufferedAmount","extensions","protocol","readyState","url"].forEach(i=>{Object.defineProperty(Bi.prototype,i,{enumerable:!0})});["open","error","close","message"].forEach(i=>{Object.defineProperty(Bi.prototype,`on${i}`,{configurable:!0,enumerable:!0,get(){let o=this.listeners(i);for(let f=0;f{X1(i,W,"Opening handshake has timed out")}),W.on("error",ne=>{W===null||W.aborted||(W=i._req=null,i._readyState=Bi.CLOSING,i.emit("error",ne),i.emitClose())}),W.on("response",ne=>{let m=ne.headers.location,we=ne.statusCode;if(m&&E.followRedirects&&we>=300&&we<400){if(++i._redirects>E.maxRedirects){X1(i,W,"Maximum redirects exceeded");return}W.abort();let Se=new Ww(m,o);$A(i,Se,f,p)}else i.emit("unexpected-response",W,ne)||X1(i,W,`Unexpected server response: ${ne.statusCode}`)}),W.on("upgrade",(ne,m,we)=>{if(i.emit("upgrade",ne),i.readyState!==Bi.CONNECTING)return;W=i._req=null;let Se=yQ("sha1").update(C+EQ).digest("base64");if(ne.headers["sec-websocket-accept"]!==Se){X1(i,m,"Invalid Sec-WebSocket-Accept header");return}let he=ne.headers["sec-websocket-protocol"],ge=(f||"").split(/, */),ze;if(!f&&he?ze="Server sent a subprotocol but none was requested":f&&!he?ze="Server sent no subprotocol":he&&!ge.includes(he)&&(ze="Server sent an invalid subprotocol"),ze){X1(i,m,ze);return}if(he&&(i._protocol=he),q)try{let pe=CQ(ne.headers["sec-websocket-extensions"]);pe[vd.extensionName]&&(q.accept(pe[vd.extensionName]),i._extensions[vd.extensionName]=q)}catch(pe){X1(i,m,"Invalid Sec-WebSocket-Extensions header");return}i.setSocket(m,we,E.maxPayload)})}function FQ(i){return i.path=i.socketPath,XA.connect(i)}function bQ(i){return i.path=void 0,!i.servername&&i.servername!==""&&(i.servername=XA.isIP(i.host)?"":i.host),vQ.connect(i)}function X1(i,o,f){i._readyState=Bi.CLOSING;let p=new Error(f);Error.captureStackTrace(p,X1),o.setHeader?(o.abort(),o.socket&&!o.socket.destroyed&&o.socket.destroy(),o.once("abort",i.emitClose.bind(i)),i.emit("error",p)):(o.destroy(p),o.once("error",i.emit.bind(i,"error")),o.once("close",i.emitClose.bind(i)))}function Yw(i,o,f){if(o){let p=xQ(o).length;i._socket?i._sender._bufferedBytes+=p:i._bufferedAmount+=p}if(f){let p=new Error(`WebSocket is not open: readyState ${i.readyState} (${ZA[i.readyState]})`);f(p)}}function RQ(i,o){let f=this[Qs];f._socket.removeListener("data",x4),f._socket.resume(),f._closeFrameReceived=!0,f._closeMessage=o,f._closeCode=i,i===1005?f.close():f.close(i,o)}function OQ(){this[Qs]._socket.resume()}function kQ(i){let o=this[Qs];o._socket.removeListener("data",x4),o._readyState=Bi.CLOSING,o._closeCode=i[DQ],o.emit("error",i),o._socket.destroy()}function rR(){this[Qs].emitClose()}function MQ(i){this[Qs].emit("message",i)}function NQ(i){let o=this[Qs];o.pong(i,!o._isServer,JA),o.emit("ping",i)}function LQ(i){this[Qs].emit("pong",i)}function eR(){let i=this[Qs];this.removeListener("close",eR),this.removeListener("end",tR),i._readyState=Bi.CLOSING,i._socket.read(),i._receiver.end(),this.removeListener("data",x4),this[Qs]=void 0,clearTimeout(i._closeTimer),i._receiver._writableState.finished||i._receiver._writableState.errorEmitted?i.emitClose():(i._receiver.on("error",rR),i._receiver.on("finish",rR))}function x4(i){this[Qs]._receiver.write(i)||this.pause()}function tR(){let i=this[Qs];i._readyState=Bi.CLOSING,i._receiver.end(),this.end()}function nR(){let i=this[Qs];this.removeListener("error",nR),this.on("error",JA),i&&(i._readyState=Bi.CLOSING,this.destroy())}});var lR=ce((Dre,iR)=>{"use strict";var{Duplex:PQ}=require("stream");function uR(i){i.emit("close")}function IQ(){!this.destroyed&&this._writableState.finished&&this.destroy()}function oR(i){this.removeListener("error",oR),this.destroy(),this.listenerCount("error")===0&&this.emit("error",i)}function BQ(i,o){let f=!0;function p(){f&&i._socket.resume()}i.readyState===i.CONNECTING?i.once("open",function(){i._receiver.removeAllListeners("drain"),i._receiver.on("drain",p)}):(i._receiver.removeAllListeners("drain"),i._receiver.on("drain",p));let E=new PQ(Gf(E0({},o),{autoDestroy:!1,emitClose:!1,objectMode:!1,writableObjectMode:!1}));return i.on("message",function(k){E.push(k)||(f=!1,i._socket.pause())}),i.once("error",function(k){E.destroyed||E.destroy(k)}),i.once("close",function(){E.destroyed||E.push(null)}),E._destroy=function(t,k){if(i.readyState===i.CLOSED){k(t),process.nextTick(uR,E);return}let L=!1;i.once("error",function(C){L=!0,k(C)}),i.once("close",function(){L||k(t),process.nextTick(uR,E)}),i.terminate()},E._final=function(t){if(i.readyState===i.CONNECTING){i.once("open",function(){E._final(t)});return}i._socket!==null&&(i._socket._writableState.finished?(t(),E._readableState.endEmitted&&E.destroy()):(i._socket.once("finish",function(){t()}),i.close()))},E._read=function(){i.readyState===i.OPEN&&!f&&(f=!0,i._receiver._writableState.needDrain||i._socket.resume())},E._write=function(t,k,L){if(i.readyState===i.CONNECTING){i.once("open",function(){E._write(t,k,L)});return}i.send(t,L)},E.on("end",IQ),E.on("error",oR),E}iR.exports=BQ});var fR=ce((wre,sR)=>{"use strict";var UQ=require("events"),{createHash:jQ}=require("crypto"),{createServer:zQ,STATUS_CODES:Xw}=require("http"),rh=Tg(),qQ=Kw(),{format:HQ,parse:WQ}=Hw(),{GUID:VQ,kWebSocket:GQ}=th(),YQ=/^[+/0-9A-Za-z]{22}==$/,aR=class extends UQ{constructor(o,f){super();if(o=E0({maxPayload:100*1024*1024,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null},o),o.port==null&&!o.server&&!o.noServer)throw new TypeError('One of the "port", "server", or "noServer" options must be specified');if(o.port!=null?(this._server=zQ((p,E)=>{let t=Xw[426];E.writeHead(426,{"Content-Length":t.length,"Content-Type":"text/plain"}),E.end(t)}),this._server.listen(o.port,o.host,o.backlog,f)):o.server&&(this._server=o.server),this._server){let p=this.emit.bind(this,"connection");this._removeListeners=KQ(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:(E,t,k)=>{this.handleUpgrade(E,t,k,p)}})}o.perMessageDeflate===!0&&(o.perMessageDeflate={}),o.clientTracking&&(this.clients=new Set),this.options=o}address(){if(this.options.noServer)throw new Error('The server is operating in "noServer" mode');return this._server?this._server.address():null}close(o){if(o&&this.once("close",o),this.clients)for(let p of this.clients)p.terminate();let f=this._server;if(f&&(this._removeListeners(),this._removeListeners=this._server=null,this.options.port!=null)){f.close(()=>this.emit("close"));return}process.nextTick(XQ,this)}shouldHandle(o){if(this.options.path){let f=o.url.indexOf("?");if((f!==-1?o.url.slice(0,f):o.url)!==this.options.path)return!1}return!0}handleUpgrade(o,f,p,E){f.on("error",Qw);let t=o.headers["sec-websocket-key"]!==void 0?o.headers["sec-websocket-key"].trim():!1,k=+o.headers["sec-websocket-version"],L={};if(o.method!=="GET"||o.headers.upgrade.toLowerCase()!=="websocket"||!t||!YQ.test(t)||k!==8&&k!==13||!this.shouldHandle(o))return A4(f,400);if(this.options.perMessageDeflate){let N=new rh(this.options.perMessageDeflate,!0,this.options.maxPayload);try{let C=WQ(o.headers["sec-websocket-extensions"]);C[rh.extensionName]&&(N.accept(C[rh.extensionName]),L[rh.extensionName]=N)}catch(C){return A4(f,400)}}if(this.options.verifyClient){let N={origin:o.headers[`${k===8?"sec-websocket-origin":"origin"}`],secure:!!(o.socket.authorized||o.socket.encrypted),req:o};if(this.options.verifyClient.length===2){this.options.verifyClient(N,(C,U,q,W)=>{if(!C)return A4(f,U||401,q,W);this.completeUpgrade(t,L,o,f,p,E)});return}if(!this.options.verifyClient(N))return A4(f,401)}this.completeUpgrade(t,L,o,f,p,E)}completeUpgrade(o,f,p,E,t,k){if(!E.readable||!E.writable)return E.destroy();if(E[GQ])throw new Error("server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration");let L=jQ("sha1").update(o+VQ).digest("base64"),N=["HTTP/1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade",`Sec-WebSocket-Accept: ${L}`],C=new qQ(null),U=p.headers["sec-websocket-protocol"];if(U&&(U=U.split(",").map(QQ),this.options.handleProtocols?U=this.options.handleProtocols(U,p):U=U[0],U&&(N.push(`Sec-WebSocket-Protocol: ${U}`),C._protocol=U)),f[rh.extensionName]){let q=f[rh.extensionName].params,W=HQ({[rh.extensionName]:[q]});N.push(`Sec-WebSocket-Extensions: ${W}`),C._extensions=f}this.emit("headers",N,p),E.write(N.concat(`\r +`).join(`\r +`)),E.removeListener("error",Qw),C.setSocket(E,t,this.options.maxPayload),this.clients&&(this.clients.add(C),C.on("close",()=>this.clients.delete(C))),k(C,p)}};sR.exports=aR;function KQ(i,o){for(let f of Object.keys(o))i.on(f,o[f]);return function(){for(let p of Object.keys(o))i.removeListener(p,o[p])}}function XQ(i){i.emit("close")}function Qw(){this.destroy()}function A4(i,o,f,p){i.writable&&(f=f||Xw[o],p=E0({Connection:"close","Content-Type":"text/html","Content-Length":Buffer.byteLength(f)},p),i.write(`HTTP/1.1 ${o} ${Xw[o]}\r +`+Object.keys(p).map(E=>`${E}: ${p[E]}`).join(`\r +`)+`\r +\r +`+f)),i.removeListener("error",Qw),i.destroy()}function QQ(i){return i.trim()}});var dR=ce((Sre,cR)=>{"use strict";var Rg=Kw();Rg.createWebSocketStream=lR();Rg.Server=fR();Rg.Receiver=zw();Rg.Sender=qw();cR.exports=Rg});var pR=ce(R4=>{"use strict";var JQ=R4&&R4.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(R4,"__esModule",{value:!0});var ZQ=JQ(dR()),Og=global;Og.WebSocket||(Og.WebSocket=ZQ.default);Og.window||(Og.window=global);Og.window.__REACT_DEVTOOLS_COMPONENT_FILTERS__=[{type:1,value:7,isEnabled:!0},{type:2,value:"InternalApp",isEnabled:!0,isValid:!0},{type:2,value:"InternalAppContext",isEnabled:!0,isValid:!0},{type:2,value:"InternalStdoutContext",isEnabled:!0,isValid:!0},{type:2,value:"InternalStderrContext",isEnabled:!0,isValid:!0},{type:2,value:"InternalStdinContext",isEnabled:!0,isValid:!0},{type:2,value:"InternalFocusContext",isEnabled:!0,isValid:!0}]});var hR=ce((O4,Jw)=>{(function(i,o){typeof O4=="object"&&typeof Jw=="object"?Jw.exports=o():typeof define=="function"&&define.amd?define([],o):typeof O4=="object"?O4.ReactDevToolsBackend=o():i.ReactDevToolsBackend=o()})(window,function(){return function(i){var o={};function f(p){if(o[p])return o[p].exports;var E=o[p]={i:p,l:!1,exports:{}};return i[p].call(E.exports,E,E.exports,f),E.l=!0,E.exports}return f.m=i,f.c=o,f.d=function(p,E,t){f.o(p,E)||Object.defineProperty(p,E,{enumerable:!0,get:t})},f.r=function(p){typeof Symbol!="undefined"&&Symbol.toStringTag&&Object.defineProperty(p,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(p,"__esModule",{value:!0})},f.t=function(p,E){if(1&E&&(p=f(p)),8&E||4&E&&typeof p=="object"&&p&&p.__esModule)return p;var t=Object.create(null);if(f.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:p}),2&E&&typeof p!="string")for(var k in p)f.d(t,k,function(L){return p[L]}.bind(null,k));return t},f.n=function(p){var E=p&&p.__esModule?function(){return p.default}:function(){return p};return f.d(E,"a",E),E},f.o=function(p,E){return Object.prototype.hasOwnProperty.call(p,E)},f.p="",f(f.s=20)}([function(i,o,f){"use strict";i.exports=f(12)},function(i,o,f){"use strict";var p=Object.getOwnPropertySymbols,E=Object.prototype.hasOwnProperty,t=Object.prototype.propertyIsEnumerable;function k(L){if(L==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(L)}i.exports=function(){try{if(!Object.assign)return!1;var L=new String("abc");if(L[5]="de",Object.getOwnPropertyNames(L)[0]==="5")return!1;for(var N={},C=0;C<10;C++)N["_"+String.fromCharCode(C)]=C;if(Object.getOwnPropertyNames(N).map(function(q){return N[q]}).join("")!=="0123456789")return!1;var U={};return"abcdefghijklmnopqrst".split("").forEach(function(q){U[q]=q}),Object.keys(Object.assign({},U)).join("")==="abcdefghijklmnopqrst"}catch(q){return!1}}()?Object.assign:function(L,N){for(var C,U,q=k(L),W=1;W=le||en<0||$t&&At-Ke>=wt}function ue(){var At=Se();if(Ce(At))return je(At);$e=setTimeout(ue,function(en){var ln=le-(en-ft);return $t?we(ln,wt-(en-Ke)):ln}(At))}function je(At){return $e=void 0,at&&Ge?Q(At):(Ge=rt=void 0,xt)}function ct(){var At=Se(),en=Ce(At);if(Ge=arguments,rt=this,ft=At,en){if($e===void 0)return ae(ft);if($t)return $e=setTimeout(ue,le),Q(ft)}return $e===void 0&&($e=setTimeout(ue,le)),xt}return le=pe(le)||0,ge(Ue)&&(jt=!!Ue.leading,wt=($t="maxWait"in Ue)?m(pe(Ue.maxWait)||0,le):wt,at="trailing"in Ue?!!Ue.trailing:at),ct.cancel=function(){$e!==void 0&&clearTimeout($e),Ke=0,Ge=ft=rt=$e=void 0},ct.flush=function(){return $e===void 0?xt:je(Se())},ct}function ge(Oe){var le=E(Oe);return!!Oe&&(le=="object"||le=="function")}function ze(Oe){return E(Oe)=="symbol"||function(le){return!!le&&E(le)=="object"}(Oe)&&ne.call(Oe)=="[object Symbol]"}function pe(Oe){if(typeof Oe=="number")return Oe;if(ze(Oe))return NaN;if(ge(Oe)){var le=typeof Oe.valueOf=="function"?Oe.valueOf():Oe;Oe=ge(le)?le+"":le}if(typeof Oe!="string")return Oe===0?Oe:+Oe;Oe=Oe.replace(t,"");var Ue=L.test(Oe);return Ue||N.test(Oe)?C(Oe.slice(2),Ue?2:8):k.test(Oe)?NaN:+Oe}i.exports=function(Oe,le,Ue){var Ge=!0,rt=!0;if(typeof Oe!="function")throw new TypeError("Expected a function");return ge(Ue)&&(Ge="leading"in Ue?!!Ue.leading:Ge,rt="trailing"in Ue?!!Ue.trailing:rt),he(Oe,le,{leading:Ge,maxWait:le,trailing:rt})}}).call(this,f(4))},function(i,o,f){(function(p){function E(Q){return(E=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(ae){return typeof ae}:function(ae){return ae&&typeof Symbol=="function"&&ae.constructor===Symbol&&ae!==Symbol.prototype?"symbol":typeof ae})(Q)}var t;o=i.exports=m,t=(p===void 0?"undefined":E(p))==="object"&&p.env&&p.env.NODE_DEBUG&&/\bsemver\b/i.test(p.env.NODE_DEBUG)?function(){var Q=Array.prototype.slice.call(arguments,0);Q.unshift("SEMVER"),console.log.apply(console,Q)}:function(){},o.SEMVER_SPEC_VERSION="2.0.0";var k=Number.MAX_SAFE_INTEGER||9007199254740991,L=o.re=[],N=o.src=[],C=o.tokens={},U=0;function q(Q){C[Q]=U++}q("NUMERICIDENTIFIER"),N[C.NUMERICIDENTIFIER]="0|[1-9]\\d*",q("NUMERICIDENTIFIERLOOSE"),N[C.NUMERICIDENTIFIERLOOSE]="[0-9]+",q("NONNUMERICIDENTIFIER"),N[C.NONNUMERICIDENTIFIER]="\\d*[a-zA-Z-][a-zA-Z0-9-]*",q("MAINVERSION"),N[C.MAINVERSION]="("+N[C.NUMERICIDENTIFIER]+")\\.("+N[C.NUMERICIDENTIFIER]+")\\.("+N[C.NUMERICIDENTIFIER]+")",q("MAINVERSIONLOOSE"),N[C.MAINVERSIONLOOSE]="("+N[C.NUMERICIDENTIFIERLOOSE]+")\\.("+N[C.NUMERICIDENTIFIERLOOSE]+")\\.("+N[C.NUMERICIDENTIFIERLOOSE]+")",q("PRERELEASEIDENTIFIER"),N[C.PRERELEASEIDENTIFIER]="(?:"+N[C.NUMERICIDENTIFIER]+"|"+N[C.NONNUMERICIDENTIFIER]+")",q("PRERELEASEIDENTIFIERLOOSE"),N[C.PRERELEASEIDENTIFIERLOOSE]="(?:"+N[C.NUMERICIDENTIFIERLOOSE]+"|"+N[C.NONNUMERICIDENTIFIER]+")",q("PRERELEASE"),N[C.PRERELEASE]="(?:-("+N[C.PRERELEASEIDENTIFIER]+"(?:\\."+N[C.PRERELEASEIDENTIFIER]+")*))",q("PRERELEASELOOSE"),N[C.PRERELEASELOOSE]="(?:-?("+N[C.PRERELEASEIDENTIFIERLOOSE]+"(?:\\."+N[C.PRERELEASEIDENTIFIERLOOSE]+")*))",q("BUILDIDENTIFIER"),N[C.BUILDIDENTIFIER]="[0-9A-Za-z-]+",q("BUILD"),N[C.BUILD]="(?:\\+("+N[C.BUILDIDENTIFIER]+"(?:\\."+N[C.BUILDIDENTIFIER]+")*))",q("FULL"),q("FULLPLAIN"),N[C.FULLPLAIN]="v?"+N[C.MAINVERSION]+N[C.PRERELEASE]+"?"+N[C.BUILD]+"?",N[C.FULL]="^"+N[C.FULLPLAIN]+"$",q("LOOSEPLAIN"),N[C.LOOSEPLAIN]="[v=\\s]*"+N[C.MAINVERSIONLOOSE]+N[C.PRERELEASELOOSE]+"?"+N[C.BUILD]+"?",q("LOOSE"),N[C.LOOSE]="^"+N[C.LOOSEPLAIN]+"$",q("GTLT"),N[C.GTLT]="((?:<|>)?=?)",q("XRANGEIDENTIFIERLOOSE"),N[C.XRANGEIDENTIFIERLOOSE]=N[C.NUMERICIDENTIFIERLOOSE]+"|x|X|\\*",q("XRANGEIDENTIFIER"),N[C.XRANGEIDENTIFIER]=N[C.NUMERICIDENTIFIER]+"|x|X|\\*",q("XRANGEPLAIN"),N[C.XRANGEPLAIN]="[v=\\s]*("+N[C.XRANGEIDENTIFIER]+")(?:\\.("+N[C.XRANGEIDENTIFIER]+")(?:\\.("+N[C.XRANGEIDENTIFIER]+")(?:"+N[C.PRERELEASE]+")?"+N[C.BUILD]+"?)?)?",q("XRANGEPLAINLOOSE"),N[C.XRANGEPLAINLOOSE]="[v=\\s]*("+N[C.XRANGEIDENTIFIERLOOSE]+")(?:\\.("+N[C.XRANGEIDENTIFIERLOOSE]+")(?:\\.("+N[C.XRANGEIDENTIFIERLOOSE]+")(?:"+N[C.PRERELEASELOOSE]+")?"+N[C.BUILD]+"?)?)?",q("XRANGE"),N[C.XRANGE]="^"+N[C.GTLT]+"\\s*"+N[C.XRANGEPLAIN]+"$",q("XRANGELOOSE"),N[C.XRANGELOOSE]="^"+N[C.GTLT]+"\\s*"+N[C.XRANGEPLAINLOOSE]+"$",q("COERCE"),N[C.COERCE]="(^|[^\\d])(\\d{1,16})(?:\\.(\\d{1,16}))?(?:\\.(\\d{1,16}))?(?:$|[^\\d])",q("COERCERTL"),L[C.COERCERTL]=new RegExp(N[C.COERCE],"g"),q("LONETILDE"),N[C.LONETILDE]="(?:~>?)",q("TILDETRIM"),N[C.TILDETRIM]="(\\s*)"+N[C.LONETILDE]+"\\s+",L[C.TILDETRIM]=new RegExp(N[C.TILDETRIM],"g"),q("TILDE"),N[C.TILDE]="^"+N[C.LONETILDE]+N[C.XRANGEPLAIN]+"$",q("TILDELOOSE"),N[C.TILDELOOSE]="^"+N[C.LONETILDE]+N[C.XRANGEPLAINLOOSE]+"$",q("LONECARET"),N[C.LONECARET]="(?:\\^)",q("CARETTRIM"),N[C.CARETTRIM]="(\\s*)"+N[C.LONECARET]+"\\s+",L[C.CARETTRIM]=new RegExp(N[C.CARETTRIM],"g"),q("CARET"),N[C.CARET]="^"+N[C.LONECARET]+N[C.XRANGEPLAIN]+"$",q("CARETLOOSE"),N[C.CARETLOOSE]="^"+N[C.LONECARET]+N[C.XRANGEPLAINLOOSE]+"$",q("COMPARATORLOOSE"),N[C.COMPARATORLOOSE]="^"+N[C.GTLT]+"\\s*("+N[C.LOOSEPLAIN]+")$|^$",q("COMPARATOR"),N[C.COMPARATOR]="^"+N[C.GTLT]+"\\s*("+N[C.FULLPLAIN]+")$|^$",q("COMPARATORTRIM"),N[C.COMPARATORTRIM]="(\\s*)"+N[C.GTLT]+"\\s*("+N[C.LOOSEPLAIN]+"|"+N[C.XRANGEPLAIN]+")",L[C.COMPARATORTRIM]=new RegExp(N[C.COMPARATORTRIM],"g"),q("HYPHENRANGE"),N[C.HYPHENRANGE]="^\\s*("+N[C.XRANGEPLAIN]+")\\s+-\\s+("+N[C.XRANGEPLAIN]+")\\s*$",q("HYPHENRANGELOOSE"),N[C.HYPHENRANGELOOSE]="^\\s*("+N[C.XRANGEPLAINLOOSE]+")\\s+-\\s+("+N[C.XRANGEPLAINLOOSE]+")\\s*$",q("STAR"),N[C.STAR]="(<|>)?=?\\s*\\*";for(var W=0;W256||!(ae.loose?L[C.LOOSE]:L[C.FULL]).test(Q))return null;try{return new m(Q,ae)}catch(Ce){return null}}function m(Q,ae){if(ae&&E(ae)==="object"||(ae={loose:!!ae,includePrerelease:!1}),Q instanceof m){if(Q.loose===ae.loose)return Q;Q=Q.version}else if(typeof Q!="string")throw new TypeError("Invalid Version: "+Q);if(Q.length>256)throw new TypeError("version is longer than 256 characters");if(!(this instanceof m))return new m(Q,ae);t("SemVer",Q,ae),this.options=ae,this.loose=!!ae.loose;var Ce=Q.trim().match(ae.loose?L[C.LOOSE]:L[C.FULL]);if(!Ce)throw new TypeError("Invalid Version: "+Q);if(this.raw=Q,this.major=+Ce[1],this.minor=+Ce[2],this.patch=+Ce[3],this.major>k||this.major<0)throw new TypeError("Invalid major version");if(this.minor>k||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>k||this.patch<0)throw new TypeError("Invalid patch version");Ce[4]?this.prerelease=Ce[4].split(".").map(function(ue){if(/^[0-9]+$/.test(ue)){var je=+ue;if(je>=0&&je=0;)typeof this.prerelease[Ce]=="number"&&(this.prerelease[Ce]++,Ce=-2);Ce===-1&&this.prerelease.push(0)}ae&&(this.prerelease[0]===ae?isNaN(this.prerelease[1])&&(this.prerelease=[ae,0]):this.prerelease=[ae,0]);break;default:throw new Error("invalid increment argument: "+Q)}return this.format(),this.raw=this.version,this},o.inc=function(Q,ae,Ce,ue){typeof Ce=="string"&&(ue=Ce,Ce=void 0);try{return new m(Q,Ce).inc(ae,ue).version}catch(je){return null}},o.diff=function(Q,ae){if(pe(Q,ae))return null;var Ce=ne(Q),ue=ne(ae),je="";if(Ce.prerelease.length||ue.prerelease.length){je="pre";var ct="prerelease"}for(var At in Ce)if((At==="major"||At==="minor"||At==="patch")&&Ce[At]!==ue[At])return je+At;return ct},o.compareIdentifiers=Se;var we=/^[0-9]+$/;function Se(Q,ae){var Ce=we.test(Q),ue=we.test(ae);return Ce&&ue&&(Q=+Q,ae=+ae),Q===ae?0:Ce&&!ue?-1:ue&&!Ce?1:Q0}function ze(Q,ae,Ce){return he(Q,ae,Ce)<0}function pe(Q,ae,Ce){return he(Q,ae,Ce)===0}function Oe(Q,ae,Ce){return he(Q,ae,Ce)!==0}function le(Q,ae,Ce){return he(Q,ae,Ce)>=0}function Ue(Q,ae,Ce){return he(Q,ae,Ce)<=0}function Ge(Q,ae,Ce,ue){switch(ae){case"===":return E(Q)==="object"&&(Q=Q.version),E(Ce)==="object"&&(Ce=Ce.version),Q===Ce;case"!==":return E(Q)==="object"&&(Q=Q.version),E(Ce)==="object"&&(Ce=Ce.version),Q!==Ce;case"":case"=":case"==":return pe(Q,Ce,ue);case"!=":return Oe(Q,Ce,ue);case">":return ge(Q,Ce,ue);case">=":return le(Q,Ce,ue);case"<":return ze(Q,Ce,ue);case"<=":return Ue(Q,Ce,ue);default:throw new TypeError("Invalid operator: "+ae)}}function rt(Q,ae){if(ae&&E(ae)==="object"||(ae={loose:!!ae,includePrerelease:!1}),Q instanceof rt){if(Q.loose===!!ae.loose)return Q;Q=Q.value}if(!(this instanceof rt))return new rt(Q,ae);t("comparator",Q,ae),this.options=ae,this.loose=!!ae.loose,this.parse(Q),this.semver===wt?this.value="":this.value=this.operator+this.semver.version,t("comp",this)}o.rcompareIdentifiers=function(Q,ae){return Se(ae,Q)},o.major=function(Q,ae){return new m(Q,ae).major},o.minor=function(Q,ae){return new m(Q,ae).minor},o.patch=function(Q,ae){return new m(Q,ae).patch},o.compare=he,o.compareLoose=function(Q,ae){return he(Q,ae,!0)},o.compareBuild=function(Q,ae,Ce){var ue=new m(Q,Ce),je=new m(ae,Ce);return ue.compare(je)||ue.compareBuild(je)},o.rcompare=function(Q,ae,Ce){return he(ae,Q,Ce)},o.sort=function(Q,ae){return Q.sort(function(Ce,ue){return o.compareBuild(Ce,ue,ae)})},o.rsort=function(Q,ae){return Q.sort(function(Ce,ue){return o.compareBuild(ue,Ce,ae)})},o.gt=ge,o.lt=ze,o.eq=pe,o.neq=Oe,o.gte=le,o.lte=Ue,o.cmp=Ge,o.Comparator=rt;var wt={};function xt(Q,ae){if(ae&&E(ae)==="object"||(ae={loose:!!ae,includePrerelease:!1}),Q instanceof xt)return Q.loose===!!ae.loose&&Q.includePrerelease===!!ae.includePrerelease?Q:new xt(Q.raw,ae);if(Q instanceof rt)return new xt(Q.value,ae);if(!(this instanceof xt))return new xt(Q,ae);if(this.options=ae,this.loose=!!ae.loose,this.includePrerelease=!!ae.includePrerelease,this.raw=Q,this.set=Q.split(/\s*\|\|\s*/).map(function(Ce){return this.parseRange(Ce.trim())},this).filter(function(Ce){return Ce.length}),!this.set.length)throw new TypeError("Invalid SemVer Range: "+Q);this.format()}function $e(Q,ae){for(var Ce=!0,ue=Q.slice(),je=ue.pop();Ce&&ue.length;)Ce=ue.every(function(ct){return je.intersects(ct,ae)}),je=ue.pop();return Ce}function ft(Q){return!Q||Q.toLowerCase()==="x"||Q==="*"}function Ke(Q,ae,Ce,ue,je,ct,At,en,ln,An,nr,un,Wt){return((ae=ft(Ce)?"":ft(ue)?">="+Ce+".0.0":ft(je)?">="+Ce+"."+ue+".0":">="+ae)+" "+(en=ft(ln)?"":ft(An)?"<"+(+ln+1)+".0.0":ft(nr)?"<"+ln+"."+(+An+1)+".0":un?"<="+ln+"."+An+"."+nr+"-"+un:"<="+en)).trim()}function jt(Q,ae,Ce){for(var ue=0;ue0){var je=Q[ue].semver;if(je.major===ae.major&&je.minor===ae.minor&&je.patch===ae.patch)return!0}return!1}return!0}function $t(Q,ae,Ce){try{ae=new xt(ae,Ce)}catch(ue){return!1}return ae.test(Q)}function at(Q,ae,Ce,ue){var je,ct,At,en,ln;switch(Q=new m(Q,ue),ae=new xt(ae,ue),Ce){case">":je=ge,ct=Ue,At=ze,en=">",ln=">=";break;case"<":je=ze,ct=le,At=ge,en="<",ln="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if($t(Q,ae,ue))return!1;for(var An=0;An=0.0.0")),un=un||vr,Wt=Wt||vr,je(vr.semver,un.semver,ue)?un=vr:At(vr.semver,Wt.semver,ue)&&(Wt=vr)}),un.operator===en||un.operator===ln||(!Wt.operator||Wt.operator===en)&&ct(Q,Wt.semver)||Wt.operator===ln&&At(Q,Wt.semver))return!1}return!0}rt.prototype.parse=function(Q){var ae=this.options.loose?L[C.COMPARATORLOOSE]:L[C.COMPARATOR],Ce=Q.match(ae);if(!Ce)throw new TypeError("Invalid comparator: "+Q);this.operator=Ce[1]!==void 0?Ce[1]:"",this.operator==="="&&(this.operator=""),Ce[2]?this.semver=new m(Ce[2],this.options.loose):this.semver=wt},rt.prototype.toString=function(){return this.value},rt.prototype.test=function(Q){if(t("Comparator.test",Q,this.options.loose),this.semver===wt||Q===wt)return!0;if(typeof Q=="string")try{Q=new m(Q,this.options)}catch(ae){return!1}return Ge(Q,this.operator,this.semver,this.options)},rt.prototype.intersects=function(Q,ae){if(!(Q instanceof rt))throw new TypeError("a Comparator is required");var Ce;if(ae&&E(ae)==="object"||(ae={loose:!!ae,includePrerelease:!1}),this.operator==="")return this.value===""||(Ce=new xt(Q.value,ae),$t(this.value,Ce,ae));if(Q.operator==="")return Q.value===""||(Ce=new xt(this.value,ae),$t(Q.semver,Ce,ae));var ue=!(this.operator!==">="&&this.operator!==">"||Q.operator!==">="&&Q.operator!==">"),je=!(this.operator!=="<="&&this.operator!=="<"||Q.operator!=="<="&&Q.operator!=="<"),ct=this.semver.version===Q.semver.version,At=!(this.operator!==">="&&this.operator!=="<="||Q.operator!==">="&&Q.operator!=="<="),en=Ge(this.semver,"<",Q.semver,ae)&&(this.operator===">="||this.operator===">")&&(Q.operator==="<="||Q.operator==="<"),ln=Ge(this.semver,">",Q.semver,ae)&&(this.operator==="<="||this.operator==="<")&&(Q.operator===">="||Q.operator===">");return ue||je||ct&&At||en||ln},o.Range=xt,xt.prototype.format=function(){return this.range=this.set.map(function(Q){return Q.join(" ").trim()}).join("||").trim(),this.range},xt.prototype.toString=function(){return this.range},xt.prototype.parseRange=function(Q){var ae=this.options.loose;Q=Q.trim();var Ce=ae?L[C.HYPHENRANGELOOSE]:L[C.HYPHENRANGE];Q=Q.replace(Ce,Ke),t("hyphen replace",Q),Q=Q.replace(L[C.COMPARATORTRIM],"$1$2$3"),t("comparator trim",Q,L[C.COMPARATORTRIM]),Q=(Q=(Q=Q.replace(L[C.TILDETRIM],"$1~")).replace(L[C.CARETTRIM],"$1^")).split(/\s+/).join(" ");var ue=ae?L[C.COMPARATORLOOSE]:L[C.COMPARATOR],je=Q.split(" ").map(function(ct){return function(At,en){return t("comp",At,en),At=function(ln,An){return ln.trim().split(/\s+/).map(function(nr){return function(un,Wt){t("caret",un,Wt);var vr=Wt.loose?L[C.CARETLOOSE]:L[C.CARET];return un.replace(vr,function(w,Ut,Vn,fr,Fr){var ur;return t("caret",un,w,Ut,Vn,fr,Fr),ft(Ut)?ur="":ft(Vn)?ur=">="+Ut+".0.0 <"+(+Ut+1)+".0.0":ft(fr)?ur=Ut==="0"?">="+Ut+"."+Vn+".0 <"+Ut+"."+(+Vn+1)+".0":">="+Ut+"."+Vn+".0 <"+(+Ut+1)+".0.0":Fr?(t("replaceCaret pr",Fr),ur=Ut==="0"?Vn==="0"?">="+Ut+"."+Vn+"."+fr+"-"+Fr+" <"+Ut+"."+Vn+"."+(+fr+1):">="+Ut+"."+Vn+"."+fr+"-"+Fr+" <"+Ut+"."+(+Vn+1)+".0":">="+Ut+"."+Vn+"."+fr+"-"+Fr+" <"+(+Ut+1)+".0.0"):(t("no pr"),ur=Ut==="0"?Vn==="0"?">="+Ut+"."+Vn+"."+fr+" <"+Ut+"."+Vn+"."+(+fr+1):">="+Ut+"."+Vn+"."+fr+" <"+Ut+"."+(+Vn+1)+".0":">="+Ut+"."+Vn+"."+fr+" <"+(+Ut+1)+".0.0"),t("caret return",ur),ur})}(nr,An)}).join(" ")}(At,en),t("caret",At),At=function(ln,An){return ln.trim().split(/\s+/).map(function(nr){return function(un,Wt){var vr=Wt.loose?L[C.TILDELOOSE]:L[C.TILDE];return un.replace(vr,function(w,Ut,Vn,fr,Fr){var ur;return t("tilde",un,w,Ut,Vn,fr,Fr),ft(Ut)?ur="":ft(Vn)?ur=">="+Ut+".0.0 <"+(+Ut+1)+".0.0":ft(fr)?ur=">="+Ut+"."+Vn+".0 <"+Ut+"."+(+Vn+1)+".0":Fr?(t("replaceTilde pr",Fr),ur=">="+Ut+"."+Vn+"."+fr+"-"+Fr+" <"+Ut+"."+(+Vn+1)+".0"):ur=">="+Ut+"."+Vn+"."+fr+" <"+Ut+"."+(+Vn+1)+".0",t("tilde return",ur),ur})}(nr,An)}).join(" ")}(At,en),t("tildes",At),At=function(ln,An){return t("replaceXRanges",ln,An),ln.split(/\s+/).map(function(nr){return function(un,Wt){un=un.trim();var vr=Wt.loose?L[C.XRANGELOOSE]:L[C.XRANGE];return un.replace(vr,function(w,Ut,Vn,fr,Fr,ur){t("xRange",un,w,Ut,Vn,fr,Fr,ur);var br=ft(Vn),Kt=br||ft(fr),vu=Kt||ft(Fr),a0=vu;return Ut==="="&&a0&&(Ut=""),ur=Wt.includePrerelease?"-0":"",br?w=Ut===">"||Ut==="<"?"<0.0.0-0":"*":Ut&&a0?(Kt&&(fr=0),Fr=0,Ut===">"?(Ut=">=",Kt?(Vn=+Vn+1,fr=0,Fr=0):(fr=+fr+1,Fr=0)):Ut==="<="&&(Ut="<",Kt?Vn=+Vn+1:fr=+fr+1),w=Ut+Vn+"."+fr+"."+Fr+ur):Kt?w=">="+Vn+".0.0"+ur+" <"+(+Vn+1)+".0.0"+ur:vu&&(w=">="+Vn+"."+fr+".0"+ur+" <"+Vn+"."+(+fr+1)+".0"+ur),t("xRange return",w),w})}(nr,An)}).join(" ")}(At,en),t("xrange",At),At=function(ln,An){return t("replaceStars",ln,An),ln.trim().replace(L[C.STAR],"")}(At,en),t("stars",At),At}(ct,this.options)},this).join(" ").split(/\s+/);return this.options.loose&&(je=je.filter(function(ct){return!!ct.match(ue)})),je=je.map(function(ct){return new rt(ct,this.options)},this)},xt.prototype.intersects=function(Q,ae){if(!(Q instanceof xt))throw new TypeError("a Range is required");return this.set.some(function(Ce){return $e(Ce,ae)&&Q.set.some(function(ue){return $e(ue,ae)&&Ce.every(function(je){return ue.every(function(ct){return je.intersects(ct,ae)})})})})},o.toComparators=function(Q,ae){return new xt(Q,ae).set.map(function(Ce){return Ce.map(function(ue){return ue.value}).join(" ").trim().split(" ")})},xt.prototype.test=function(Q){if(!Q)return!1;if(typeof Q=="string")try{Q=new m(Q,this.options)}catch(Ce){return!1}for(var ae=0;ae":ct.prerelease.length===0?ct.patch++:ct.prerelease.push(0),ct.raw=ct.format();case"":case">=":Ce&&!ge(Ce,ct)||(Ce=ct);break;case"<":case"<=":break;default:throw new Error("Unexpected operation: "+je.operator)}});return Ce&&Q.test(Ce)?Ce:null},o.validRange=function(Q,ae){try{return new xt(Q,ae).range||"*"}catch(Ce){return null}},o.ltr=function(Q,ae,Ce){return at(Q,ae,"<",Ce)},o.gtr=function(Q,ae,Ce){return at(Q,ae,">",Ce)},o.outside=at,o.prerelease=function(Q,ae){var Ce=ne(Q,ae);return Ce&&Ce.prerelease.length?Ce.prerelease:null},o.intersects=function(Q,ae,Ce){return Q=new xt(Q,Ce),ae=new xt(ae,Ce),Q.intersects(ae)},o.coerce=function(Q,ae){if(Q instanceof m)return Q;if(typeof Q=="number"&&(Q=String(Q)),typeof Q!="string")return null;var Ce=null;if((ae=ae||{}).rtl){for(var ue;(ue=L[C.COERCERTL].exec(Q))&&(!Ce||Ce.index+Ce[0].length!==Q.length);)Ce&&ue.index+ue[0].length===Ce.index+Ce[0].length||(Ce=ue),L[C.COERCERTL].lastIndex=ue.index+ue[1].length+ue[2].length;L[C.COERCERTL].lastIndex=-1}else Ce=Q.match(L[C.COERCE]);return Ce===null?null:ne(Ce[2]+"."+(Ce[3]||"0")+"."+(Ce[4]||"0"),ae)}}).call(this,f(5))},function(i,o){function f(E){return(f=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(E)}var p;p=function(){return this}();try{p=p||new Function("return this")()}catch(E){(typeof window=="undefined"?"undefined":f(window))==="object"&&(p=window)}i.exports=p},function(i,o){var f,p,E=i.exports={};function t(){throw new Error("setTimeout has not been defined")}function k(){throw new Error("clearTimeout has not been defined")}function L(Se){if(f===setTimeout)return setTimeout(Se,0);if((f===t||!f)&&setTimeout)return f=setTimeout,setTimeout(Se,0);try{return f(Se,0)}catch(he){try{return f.call(null,Se,0)}catch(ge){return f.call(this,Se,0)}}}(function(){try{f=typeof setTimeout=="function"?setTimeout:t}catch(Se){f=t}try{p=typeof clearTimeout=="function"?clearTimeout:k}catch(Se){p=k}})();var N,C=[],U=!1,q=-1;function W(){U&&N&&(U=!1,N.length?C=N.concat(C):q=-1,C.length&&ne())}function ne(){if(!U){var Se=L(W);U=!0;for(var he=C.length;he;){for(N=C,C=[];++q1)for(var ge=1;gethis[k])return Oe(this,this[m].get($e)),!1;var at=this[m].get($e).value;return this[q]&&(this[W]||this[q]($e,at.value)),at.now=jt,at.maxAge=Ke,at.value=ft,this[L]+=$t-at.length,at.length=$t,this.get($e),pe(this),!0}var Q=new le($e,ft,$t,jt,Ke);return Q.length>this[k]?(this[q]&&this[q]($e,ft),!1):(this[L]+=Q.length,this[ne].unshift(Q),this[m].set($e,this[ne].head),pe(this),!0)}},{key:"has",value:function($e){if(!this[m].has($e))return!1;var ft=this[m].get($e).value;return!ze(this,ft)}},{key:"get",value:function($e){return ge(this,$e,!0)}},{key:"peek",value:function($e){return ge(this,$e,!1)}},{key:"pop",value:function(){var $e=this[ne].tail;return $e?(Oe(this,$e),$e.value):null}},{key:"del",value:function($e){Oe(this,this[m].get($e))}},{key:"load",value:function($e){this.reset();for(var ft=Date.now(),Ke=$e.length-1;Ke>=0;Ke--){var jt=$e[Ke],$t=jt.e||0;if($t===0)this.set(jt.k,jt.v);else{var at=$t-ft;at>0&&this.set(jt.k,jt.v,at)}}}},{key:"prune",value:function(){var $e=this;this[m].forEach(function(ft,Ke){return ge($e,Ke,!1)})}},{key:"max",set:function($e){if(typeof $e!="number"||$e<0)throw new TypeError("max must be a non-negative number");this[k]=$e||1/0,pe(this)},get:function(){return this[k]}},{key:"allowStale",set:function($e){this[C]=!!$e},get:function(){return this[C]}},{key:"maxAge",set:function($e){if(typeof $e!="number")throw new TypeError("maxAge must be a non-negative number");this[U]=$e,pe(this)},get:function(){return this[U]}},{key:"lengthCalculator",set:function($e){var ft=this;typeof $e!="function"&&($e=Se),$e!==this[N]&&(this[N]=$e,this[L]=0,this[ne].forEach(function(Ke){Ke.length=ft[N](Ke.value,Ke.key),ft[L]+=Ke.length})),pe(this)},get:function(){return this[N]}},{key:"length",get:function(){return this[L]}},{key:"itemCount",get:function(){return this[ne].length}}])&&E(rt.prototype,wt),xt&&E(rt,xt),Ge}(),ge=function(Ge,rt,wt){var xt=Ge[m].get(rt);if(xt){var $e=xt.value;if(ze(Ge,$e)){if(Oe(Ge,xt),!Ge[C])return}else wt&&(Ge[we]&&(xt.value.now=Date.now()),Ge[ne].unshiftNode(xt));return $e.value}},ze=function(Ge,rt){if(!rt||!rt.maxAge&&!Ge[U])return!1;var wt=Date.now()-rt.now;return rt.maxAge?wt>rt.maxAge:Ge[U]&&wt>Ge[U]},pe=function(Ge){if(Ge[L]>Ge[k])for(var rt=Ge[ne].tail;Ge[L]>Ge[k]&&rt!==null;){var wt=rt.prev;Oe(Ge,rt),rt=wt}},Oe=function(Ge,rt){if(rt){var wt=rt.value;Ge[q]&&Ge[q](wt.key,wt.value),Ge[L]-=wt.length,Ge[m].delete(wt.key),Ge[ne].removeNode(rt)}},le=function Ge(rt,wt,xt,$e,ft){p(this,Ge),this.key=rt,this.value=wt,this.length=xt,this.now=$e,this.maxAge=ft||0},Ue=function(Ge,rt,wt,xt){var $e=wt.value;ze(Ge,$e)&&(Oe(Ge,wt),Ge[C]||($e=void 0)),$e&&rt.call(xt,$e.value,$e.key,Ge)};i.exports=he},function(i,o,f){(function(p){function E(t){return(E=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(k){return typeof k}:function(k){return k&&typeof Symbol=="function"&&k.constructor===Symbol&&k!==Symbol.prototype?"symbol":typeof k})(t)}i.exports=function(){if(typeof document=="undefined"||!document.addEventListener)return null;var t,k,L,N={};return N.copy=function(){var C=!1,U=null,q=!1;function W(){C=!1,U=null,q&&window.getSelection().removeAllRanges(),q=!1}return document.addEventListener("copy",function(ne){if(C){for(var m in U)ne.clipboardData.setData(m,U[m]);ne.preventDefault()}}),function(ne){return new Promise(function(m,we){C=!0,typeof ne=="string"?U={"text/plain":ne}:ne instanceof Node?U={"text/html":new XMLSerializer().serializeToString(ne)}:ne instanceof Object?U=ne:we("Invalid data type. Must be string, DOM node, or an object mapping MIME types to strings."),function Se(he){try{if(document.execCommand("copy"))W(),m();else{if(he)throw W(),new Error("Unable to copy. Perhaps it's not available in your browser?");(function(){var ge=document.getSelection();if(!document.queryCommandEnabled("copy")&&ge.isCollapsed){var ze=document.createRange();ze.selectNodeContents(document.body),ge.removeAllRanges(),ge.addRange(ze),q=!0}})(),Se(!0)}}catch(ge){W(),we(ge)}}(!1)})}}(),N.paste=(L=!1,document.addEventListener("paste",function(C){if(L){L=!1,C.preventDefault();var U=t;t=null,U(C.clipboardData.getData(k))}}),function(C){return new Promise(function(U,q){L=!0,t=U,k=C||"text/plain";try{document.execCommand("paste")||(L=!1,q(new Error("Unable to paste. Pasting only works in Internet Explorer at the moment.")))}catch(W){L=!1,q(new Error(W))}})}),typeof ClipboardEvent=="undefined"&&window.clipboardData!==void 0&&window.clipboardData.setData!==void 0&&(function(C){function U(pe,Oe){return function(){pe.apply(Oe,arguments)}}function q(pe){if(E(this)!="object")throw new TypeError("Promises must be constructed via new");if(typeof pe!="function")throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],he(pe,U(ne,this),U(m,this))}function W(pe){var Oe=this;return this._state===null?void this._deferreds.push(pe):void ge(function(){var le=Oe._state?pe.onFulfilled:pe.onRejected;if(le!==null){var Ue;try{Ue=le(Oe._value)}catch(Ge){return void pe.reject(Ge)}pe.resolve(Ue)}else(Oe._state?pe.resolve:pe.reject)(Oe._value)})}function ne(pe){try{if(pe===this)throw new TypeError("A promise cannot be resolved with itself.");if(pe&&(E(pe)=="object"||typeof pe=="function")){var Oe=pe.then;if(typeof Oe=="function")return void he(U(Oe,pe),U(ne,this),U(m,this))}this._state=!0,this._value=pe,we.call(this)}catch(le){m.call(this,le)}}function m(pe){this._state=!1,this._value=pe,we.call(this)}function we(){for(var pe=0,Oe=this._deferreds.length;Oe>pe;pe++)W.call(this,this._deferreds[pe]);this._deferreds=null}function Se(pe,Oe,le,Ue){this.onFulfilled=typeof pe=="function"?pe:null,this.onRejected=typeof Oe=="function"?Oe:null,this.resolve=le,this.reject=Ue}function he(pe,Oe,le){var Ue=!1;try{pe(function(Ge){Ue||(Ue=!0,Oe(Ge))},function(Ge){Ue||(Ue=!0,le(Ge))})}catch(Ge){if(Ue)return;Ue=!0,le(Ge)}}var ge=q.immediateFn||typeof p=="function"&&p||function(pe){setTimeout(pe,1)},ze=Array.isArray||function(pe){return Object.prototype.toString.call(pe)==="[object Array]"};q.prototype.catch=function(pe){return this.then(null,pe)},q.prototype.then=function(pe,Oe){var le=this;return new q(function(Ue,Ge){W.call(le,new Se(pe,Oe,Ue,Ge))})},q.all=function(){var pe=Array.prototype.slice.call(arguments.length===1&&ze(arguments[0])?arguments[0]:arguments);return new q(function(Oe,le){function Ue(wt,xt){try{if(xt&&(E(xt)=="object"||typeof xt=="function")){var $e=xt.then;if(typeof $e=="function")return void $e.call(xt,function(ft){Ue(wt,ft)},le)}pe[wt]=xt,--Ge==0&&Oe(pe)}catch(ft){le(ft)}}if(pe.length===0)return Oe([]);for(var Ge=pe.length,rt=0;rtUe;Ue++)pe[Ue].then(Oe,le)})},i.exports?i.exports=q:C.Promise||(C.Promise=q)}(this),N.copy=function(C){return new Promise(function(U,q){if(typeof C!="string"&&!("text/plain"in C))throw new Error("You must provide a text/plain type.");var W=typeof C=="string"?C:C["text/plain"];window.clipboardData.setData("Text",W)?U():q(new Error("Copying was rejected."))})},N.paste=function(){return new Promise(function(C,U){var q=window.clipboardData.getData("Text");q?C(q):U(new Error("Pasting was rejected."))})}),N}()}).call(this,f(13).setImmediate)},function(i,o,f){"use strict";i.exports=f(15)},function(i,o,f){"use strict";f.r(o),o.default=`:root { + /** + * IMPORTANT: When new theme variables are added below\u2013 also add them to SettingsContext updateThemeVariables() + */ + + /* Light theme */ + --light-color-attribute-name: #ef6632; + --light-color-attribute-name-not-editable: #23272f; + --light-color-attribute-name-inverted: rgba(255, 255, 255, 0.7); + --light-color-attribute-value: #1a1aa6; + --light-color-attribute-value-inverted: #ffffff; + --light-color-attribute-editable-value: #1a1aa6; + --light-color-background: #ffffff; + --light-color-background-hover: rgba(0, 136, 250, 0.1); + --light-color-background-inactive: #e5e5e5; + --light-color-background-invalid: #fff0f0; + --light-color-background-selected: #0088fa; + --light-color-button-background: #ffffff; + --light-color-button-background-focus: #ededed; + --light-color-button: #5f6673; + --light-color-button-disabled: #cfd1d5; + --light-color-button-active: #0088fa; + --light-color-button-focus: #23272f; + --light-color-button-hover: #23272f; + --light-color-border: #eeeeee; + --light-color-commit-did-not-render-fill: #cfd1d5; + --light-color-commit-did-not-render-fill-text: #000000; + --light-color-commit-did-not-render-pattern: #cfd1d5; + --light-color-commit-did-not-render-pattern-text: #333333; + --light-color-commit-gradient-0: #37afa9; + --light-color-commit-gradient-1: #63b19e; + --light-color-commit-gradient-2: #80b393; + --light-color-commit-gradient-3: #97b488; + --light-color-commit-gradient-4: #abb67d; + --light-color-commit-gradient-5: #beb771; + --light-color-commit-gradient-6: #cfb965; + --light-color-commit-gradient-7: #dfba57; + --light-color-commit-gradient-8: #efbb49; + --light-color-commit-gradient-9: #febc38; + --light-color-commit-gradient-text: #000000; + --light-color-component-name: #6a51b2; + --light-color-component-name-inverted: #ffffff; + --light-color-component-badge-background: rgba(0, 0, 0, 0.1); + --light-color-component-badge-background-inverted: rgba(255, 255, 255, 0.25); + --light-color-component-badge-count: #777d88; + --light-color-component-badge-count-inverted: rgba(255, 255, 255, 0.7); + --light-color-context-background: rgba(0,0,0,.9); + --light-color-context-background-hover: rgba(255, 255, 255, 0.1); + --light-color-context-background-selected: #178fb9; + --light-color-context-border: #3d424a; + --light-color-context-text: #ffffff; + --light-color-context-text-selected: #ffffff; + --light-color-dim: #777d88; + --light-color-dimmer: #cfd1d5; + --light-color-dimmest: #eff0f1; + --light-color-error-background: hsl(0, 100%, 97%); + --light-color-error-border: hsl(0, 100%, 92%); + --light-color-error-text: #ff0000; + --light-color-expand-collapse-toggle: #777d88; + --light-color-link: #0000ff; + --light-color-modal-background: rgba(255, 255, 255, 0.75); + --light-color-record-active: #fc3a4b; + --light-color-record-hover: #3578e5; + --light-color-record-inactive: #0088fa; + --light-color-scroll-thumb: #c2c2c2; + --light-color-scroll-track: #fafafa; + --light-color-search-match: yellow; + --light-color-search-match-current: #f7923b; + --light-color-selected-tree-highlight-active: rgba(0, 136, 250, 0.1); + --light-color-selected-tree-highlight-inactive: rgba(0, 0, 0, 0.05); + --light-color-shadow: rgba(0, 0, 0, 0.25); + --light-color-tab-selected-border: #0088fa; + --light-color-text: #000000; + --light-color-text-invalid: #ff0000; + --light-color-text-selected: #ffffff; + --light-color-toggle-background-invalid: #fc3a4b; + --light-color-toggle-background-on: #0088fa; + --light-color-toggle-background-off: #cfd1d5; + --light-color-toggle-text: #ffffff; + --light-color-tooltip-background: rgba(0, 0, 0, 0.9); + --light-color-tooltip-text: #ffffff; + + /* Dark theme */ + --dark-color-attribute-name: #9d87d2; + --dark-color-attribute-name-not-editable: #ededed; + --dark-color-attribute-name-inverted: #282828; + --dark-color-attribute-value: #cedae0; + --dark-color-attribute-value-inverted: #ffffff; + --dark-color-attribute-editable-value: yellow; + --dark-color-background: #282c34; + --dark-color-background-hover: rgba(255, 255, 255, 0.1); + --dark-color-background-inactive: #3d424a; + --dark-color-background-invalid: #5c0000; + --dark-color-background-selected: #178fb9; + --dark-color-button-background: #282c34; + --dark-color-button-background-focus: #3d424a; + --dark-color-button: #afb3b9; + --dark-color-button-active: #61dafb; + --dark-color-button-disabled: #4f5766; + --dark-color-button-focus: #a2e9fc; + --dark-color-button-hover: #ededed; + --dark-color-border: #3d424a; + --dark-color-commit-did-not-render-fill: #777d88; + --dark-color-commit-did-not-render-fill-text: #000000; + --dark-color-commit-did-not-render-pattern: #666c77; + --dark-color-commit-did-not-render-pattern-text: #ffffff; + --dark-color-commit-gradient-0: #37afa9; + --dark-color-commit-gradient-1: #63b19e; + --dark-color-commit-gradient-2: #80b393; + --dark-color-commit-gradient-3: #97b488; + --dark-color-commit-gradient-4: #abb67d; + --dark-color-commit-gradient-5: #beb771; + --dark-color-commit-gradient-6: #cfb965; + --dark-color-commit-gradient-7: #dfba57; + --dark-color-commit-gradient-8: #efbb49; + --dark-color-commit-gradient-9: #febc38; + --dark-color-commit-gradient-text: #000000; + --dark-color-component-name: #61dafb; + --dark-color-component-name-inverted: #282828; + --dark-color-component-badge-background: rgba(255, 255, 255, 0.25); + --dark-color-component-badge-background-inverted: rgba(0, 0, 0, 0.25); + --dark-color-component-badge-count: #8f949d; + --dark-color-component-badge-count-inverted: rgba(255, 255, 255, 0.7); + --dark-color-context-background: rgba(255,255,255,.9); + --dark-color-context-background-hover: rgba(0, 136, 250, 0.1); + --dark-color-context-background-selected: #0088fa; + --dark-color-context-border: #eeeeee; + --dark-color-context-text: #000000; + --dark-color-context-text-selected: #ffffff; + --dark-color-dim: #8f949d; + --dark-color-dimmer: #777d88; + --dark-color-dimmest: #4f5766; + --dark-color-error-background: #200; + --dark-color-error-border: #900; + --dark-color-error-text: #f55; + --dark-color-expand-collapse-toggle: #8f949d; + --dark-color-link: #61dafb; + --dark-color-modal-background: rgba(0, 0, 0, 0.75); + --dark-color-record-active: #fc3a4b; + --dark-color-record-hover: #a2e9fc; + --dark-color-record-inactive: #61dafb; + --dark-color-scroll-thumb: #afb3b9; + --dark-color-scroll-track: #313640; + --dark-color-search-match: yellow; + --dark-color-search-match-current: #f7923b; + --dark-color-selected-tree-highlight-active: rgba(23, 143, 185, 0.15); + --dark-color-selected-tree-highlight-inactive: rgba(255, 255, 255, 0.05); + --dark-color-shadow: rgba(0, 0, 0, 0.5); + --dark-color-tab-selected-border: #178fb9; + --dark-color-text: #ffffff; + --dark-color-text-invalid: #ff8080; + --dark-color-text-selected: #ffffff; + --dark-color-toggle-background-invalid: #fc3a4b; + --dark-color-toggle-background-on: #178fb9; + --dark-color-toggle-background-off: #777d88; + --dark-color-toggle-text: #ffffff; + --dark-color-tooltip-background: rgba(255, 255, 255, 0.9); + --dark-color-tooltip-text: #000000; + + /* Font smoothing */ + --light-font-smoothing: auto; + --dark-font-smoothing: antialiased; + --font-smoothing: auto; + + /* Compact density */ + --compact-font-size-monospace-small: 9px; + --compact-font-size-monospace-normal: 11px; + --compact-font-size-monospace-large: 15px; + --compact-font-size-sans-small: 10px; + --compact-font-size-sans-normal: 12px; + --compact-font-size-sans-large: 14px; + --compact-line-height-data: 18px; + --compact-root-font-size: 16px; + + /* Comfortable density */ + --comfortable-font-size-monospace-small: 10px; + --comfortable-font-size-monospace-normal: 13px; + --comfortable-font-size-monospace-large: 17px; + --comfortable-font-size-sans-small: 12px; + --comfortable-font-size-sans-normal: 14px; + --comfortable-font-size-sans-large: 16px; + --comfortable-line-height-data: 22px; + --comfortable-root-font-size: 20px; + + /* GitHub.com system fonts */ + --font-family-monospace: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, + Courier, monospace; + --font-family-sans: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, + Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol; + + /* Constant values shared between JS and CSS */ + --interaction-commit-size: 10px; + --interaction-label-width: 200px; +} +`},function(i,o,f){"use strict";function p(N){var C=this;if(C instanceof p||(C=new p),C.tail=null,C.head=null,C.length=0,N&&typeof N.forEach=="function")N.forEach(function(W){C.push(W)});else if(arguments.length>0)for(var U=0,q=arguments.length;U1)U=C;else{if(!this.head)throw new TypeError("Reduce of empty list with no initial value");q=this.head.next,U=this.head.value}for(var W=0;q!==null;W++)U=N(U,q.value,W),q=q.next;return U},p.prototype.reduceReverse=function(N,C){var U,q=this.tail;if(arguments.length>1)U=C;else{if(!this.tail)throw new TypeError("Reduce of empty list with no initial value");q=this.tail.prev,U=this.tail.value}for(var W=this.length-1;q!==null;W--)U=N(U,q.value,W),q=q.prev;return U},p.prototype.toArray=function(){for(var N=new Array(this.length),C=0,U=this.head;U!==null;C++)N[C]=U.value,U=U.next;return N},p.prototype.toArrayReverse=function(){for(var N=new Array(this.length),C=0,U=this.tail;U!==null;C++)N[C]=U.value,U=U.prev;return N},p.prototype.slice=function(N,C){(C=C||this.length)<0&&(C+=this.length),(N=N||0)<0&&(N+=this.length);var U=new p;if(Cthis.length&&(C=this.length);for(var q=0,W=this.head;W!==null&&qthis.length&&(C=this.length);for(var q=this.length,W=this.tail;W!==null&&q>C;q--)W=W.prev;for(;W!==null&&q>N;q--,W=W.prev)U.push(W.value);return U},p.prototype.splice=function(N,C){N>this.length&&(N=this.length-1),N<0&&(N=this.length+N);for(var U=0,q=this.head;q!==null&&U=0&&(L._idleTimeoutId=setTimeout(function(){L._onTimeout&&L._onTimeout()},N))},f(14),o.setImmediate=typeof self!="undefined"&&self.setImmediate||p!==void 0&&p.setImmediate||this&&this.setImmediate,o.clearImmediate=typeof self!="undefined"&&self.clearImmediate||p!==void 0&&p.clearImmediate||this&&this.clearImmediate}).call(this,f(4))},function(i,o,f){(function(p,E){(function(t,k){"use strict";if(!t.setImmediate){var L,N,C,U,q,W=1,ne={},m=!1,we=t.document,Se=Object.getPrototypeOf&&Object.getPrototypeOf(t);Se=Se&&Se.setTimeout?Se:t,{}.toString.call(t.process)==="[object process]"?L=function(ze){E.nextTick(function(){ge(ze)})}:function(){if(t.postMessage&&!t.importScripts){var ze=!0,pe=t.onmessage;return t.onmessage=function(){ze=!1},t.postMessage("","*"),t.onmessage=pe,ze}}()?(U="setImmediate$"+Math.random()+"$",q=function(ze){ze.source===t&&typeof ze.data=="string"&&ze.data.indexOf(U)===0&&ge(+ze.data.slice(U.length))},t.addEventListener?t.addEventListener("message",q,!1):t.attachEvent("onmessage",q),L=function(ze){t.postMessage(U+ze,"*")}):t.MessageChannel?((C=new MessageChannel).port1.onmessage=function(ze){ge(ze.data)},L=function(ze){C.port2.postMessage(ze)}):we&&"onreadystatechange"in we.createElement("script")?(N=we.documentElement,L=function(ze){var pe=we.createElement("script");pe.onreadystatechange=function(){ge(ze),pe.onreadystatechange=null,N.removeChild(pe),pe=null},N.appendChild(pe)}):L=function(ze){setTimeout(ge,0,ze)},Se.setImmediate=function(ze){typeof ze!="function"&&(ze=new Function(""+ze));for(var pe=new Array(arguments.length-1),Oe=0;Oeae;ae++)if((Q=he(at,jt,ae))!==-1){Se=ae,jt=Q;break e}jt=-1}}e:{if(at=$t,(Q=W().get(Ke.primitive))!==void 0){for(ae=0;aejt-at?null:$t.slice(at,jt-1))!==null){if(jt=0,rt!==null){for(;jt<$t.length&&jtjt;rt--)wt=$e.pop()}for(rt=$t.length-jt-1;1<=rt;rt--)jt=[],wt.push({id:null,isStateEditable:!1,name:ze($t[rt-1].functionName),value:void 0,subHooks:jt}),$e.push(wt),wt=jt;rt=$t}jt=($t=Ke.primitive)==="Context"||$t==="DebugValue"?null:xt++,wt.push({id:jt,isStateEditable:$t==="Reducer"||$t==="State",name:$t,value:Ke.value,subHooks:[]})}return function Ce(ue,je){for(var ct=[],At=0;At-1&&(ne=ne.replace(/eval code/g,"eval").replace(/(\(eval at [^()]*)|(\),.*$)/g,""));var m=ne.replace(/^\s+/,"").replace(/\(eval code/g,"("),we=m.match(/ (\((.+):(\d+):(\d+)\)$)/),Se=(m=we?m.replace(we[0],""):m).split(/\s+/).slice(1),he=this.extractLocation(we?we[1]:Se.pop()),ge=Se.join(" ")||void 0,ze=["eval",""].indexOf(he[0])>-1?void 0:he[0];return new N({functionName:ge,fileName:ze,lineNumber:he[1],columnNumber:he[2],source:ne})},this)},parseFFOrSafari:function(W){return W.stack.split(` +`).filter(function(ne){return!ne.match(q)},this).map(function(ne){if(ne.indexOf(" > eval")>-1&&(ne=ne.replace(/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g,":$1")),ne.indexOf("@")===-1&&ne.indexOf(":")===-1)return new N({functionName:ne});var m=/((.*".+"[^@]*)?[^@]*)(?:@)/,we=ne.match(m),Se=we&&we[1]?we[1]:void 0,he=this.extractLocation(ne.replace(m,""));return new N({functionName:Se,fileName:he[0],lineNumber:he[1],columnNumber:he[2],source:ne})},this)},parseOpera:function(W){return!W.stacktrace||W.message.indexOf(` +`)>-1&&W.message.split(` +`).length>W.stacktrace.split(` +`).length?this.parseOpera9(W):W.stack?this.parseOpera11(W):this.parseOpera10(W)},parseOpera9:function(W){for(var ne=/Line (\d+).*script (?:in )?(\S+)/i,m=W.message.split(` +`),we=[],Se=2,he=m.length;Se/,"$2").replace(/\([^)]*\)/g,"")||void 0;he.match(/\(([^)]*)\)/)&&(m=he.replace(/^[^(]+\(([^)]*)\)$/,"$1"));var ze=m===void 0||m==="[arguments not available]"?void 0:m.split(",");return new N({functionName:ge,args:ze,fileName:Se[0],lineNumber:Se[1],columnNumber:Se[2],source:ne})},this)}}})=="function"?p.apply(o,E):p)===void 0||(i.exports=t)})()},function(i,o,f){var p,E,t;(function(k,L){"use strict";E=[],(t=typeof(p=function(){function N(ge){return ge.charAt(0).toUpperCase()+ge.substring(1)}function C(ge){return function(){return this[ge]}}var U=["isConstructor","isEval","isNative","isToplevel"],q=["columnNumber","lineNumber"],W=["fileName","functionName","source"],ne=U.concat(q,W,["args"]);function m(ge){if(ge)for(var ze=0;ze1?xe-1:0),ke=1;ke=0&&xe.splice(Z,1)}}}])&&p(z.prototype,G),$&&p(z,$),B}(),t=f(2),k=f.n(t);try{var L=f(9).default,N=function(B){var z=new RegExp("".concat(B,": ([0-9]+)")),G=L.match(z);return parseInt(G[1],10)};N("comfortable-line-height-data"),N("compact-line-height-data")}catch(B){}function C(B){try{return sessionStorage.getItem(B)}catch(z){return null}}function U(B){try{sessionStorage.removeItem(B)}catch(z){}}function q(B,z){try{return sessionStorage.setItem(B,z)}catch(G){}}var W=function(B,z){return B===z},ne=f(1),m=f.n(ne);function we(B){return B.ownerDocument?B.ownerDocument.defaultView:null}function Se(B){var z=we(B);return z?z.frameElement:null}function he(B){var z=pe(B);return ge([B.getBoundingClientRect(),{top:z.borderTop,left:z.borderLeft,bottom:z.borderBottom,right:z.borderRight,width:0,height:0}])}function ge(B){return B.reduce(function(z,G){return z==null?G:{top:z.top+G.top,left:z.left+G.left,width:z.width,height:z.height,bottom:z.bottom+G.bottom,right:z.right+G.right}})}function ze(B,z){var G=Se(B);if(G&&G!==z){for(var $=[B.getBoundingClientRect()],De=G,me=!1;De;){var xe=he(De);if($.push(xe),De=Se(De),me)break;De&&we(De)===z&&(me=!0)}return ge($)}return B.getBoundingClientRect()}function pe(B){var z=window.getComputedStyle(B);return{borderLeft:parseInt(z.borderLeftWidth,10),borderRight:parseInt(z.borderRightWidth,10),borderTop:parseInt(z.borderTopWidth,10),borderBottom:parseInt(z.borderBottomWidth,10),marginLeft:parseInt(z.marginLeft,10),marginRight:parseInt(z.marginRight,10),marginTop:parseInt(z.marginTop,10),marginBottom:parseInt(z.marginBottom,10),paddingLeft:parseInt(z.paddingLeft,10),paddingRight:parseInt(z.paddingRight,10),paddingTop:parseInt(z.paddingTop,10),paddingBottom:parseInt(z.paddingBottom,10)}}function Oe(B,z){var G;if(typeof Symbol=="undefined"||B[Symbol.iterator]==null){if(Array.isArray(B)||(G=function(ke,Xe){if(!!ke){if(typeof ke=="string")return le(ke,Xe);var ht=Object.prototype.toString.call(ke).slice(8,-1);if(ht==="Object"&&ke.constructor&&(ht=ke.constructor.name),ht==="Map"||ht==="Set")return Array.from(ke);if(ht==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(ht))return le(ke,Xe)}}(B))||z&&B&&typeof B.length=="number"){G&&(B=G);var $=0,De=function(){};return{s:De,n:function(){return $>=B.length?{done:!0}:{done:!1,value:B[$++]}},e:function(ke){throw ke},f:De}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var me,xe=!0,Z=!1;return{s:function(){G=B[Symbol.iterator]()},n:function(){var ke=G.next();return xe=ke.done,ke},e:function(ke){Z=!0,me=ke},f:function(){try{xe||G.return==null||G.return()}finally{if(Z)throw me}}}}function le(B,z){(z==null||z>B.length)&&(z=B.length);for(var G=0,$=new Array(z);Gxe.left+xe.width&&(ie=xe.left+xe.width-ht-5),{style:{top:ke+="px",left:ie+="px"}}}(z,G,{width:$.width,height:$.height});m()(this.tip.style,De.style)}}]),B}(),$e=function(){function B(){Ue(this,B);var z=window.__REACT_DEVTOOLS_TARGET_WINDOW__||window;this.window=z;var G=window.__REACT_DEVTOOLS_TARGET_WINDOW__||window;this.tipBoundsWindow=G;var $=z.document;this.container=$.createElement("div"),this.container.style.zIndex="10000000",this.tip=new xt($,this.container),this.rects=[],$.body.appendChild(this.container)}return rt(B,[{key:"remove",value:function(){this.tip.remove(),this.rects.forEach(function(z){z.remove()}),this.rects.length=0,this.container.parentNode&&this.container.parentNode.removeChild(this.container)}},{key:"inspect",value:function(z,G){for(var $=this,De=z.filter(function(Tt){return Tt.nodeType===Node.ELEMENT_NODE});this.rects.length>De.length;)this.rects.pop().remove();if(De.length!==0){for(;this.rects.length1&&arguments[1]!==void 0?arguments[1]:W,tt=void 0,Tt=[],kt=void 0,bt=!1,on=function(Lt,gn){return qe(Lt,Tt[gn])},tn=function(){for(var Lt=arguments.length,gn=Array(Lt),lr=0;lr5&&arguments[5]!==void 0?arguments[5]:0,Z=Co(B);switch(Z){case"html_element":return z.push($),{inspectable:!1,preview_short:Si(B,!1),preview_long:Si(B,!0),name:B.tagName,type:Z};case"function":return z.push($),{inspectable:!1,preview_short:Si(B,!1),preview_long:Si(B,!0),name:typeof B.name!="function"&&B.name?B.name:"function",type:Z};case"string":return B.length<=500?B:B.slice(0,500)+"...";case"bigint":case"symbol":return z.push($),{inspectable:!1,preview_short:Si(B,!1),preview_long:Si(B,!0),name:B.toString(),type:Z};case"react_element":return z.push($),{inspectable:!1,preview_short:Si(B,!1),preview_long:Si(B,!0),name:L0(B)||"Unknown",type:Z};case"array_buffer":case"data_view":return z.push($),{inspectable:!1,preview_short:Si(B,!1),preview_long:Si(B,!0),name:Z==="data_view"?"DataView":"ArrayBuffer",size:B.byteLength,type:Z};case"array":return me=De($),xe>=2&&!me?a0(Z,!0,B,z,$):B.map(function(ht,ie){return So(ht,z,G,$.concat([ie]),De,me?1:xe+1)});case"html_all_collection":case"typed_array":case"iterator":if(me=De($),xe>=2&&!me)return a0(Z,!0,B,z,$);var ke={unserializable:!0,type:Z,readonly:!0,size:Z==="typed_array"?B.length:void 0,preview_short:Si(B,!1),preview_long:Si(B,!0),name:B.constructor&&B.constructor.name!=="Object"?B.constructor.name:""};return Kt(B[Symbol.iterator])&&Array.from(B).forEach(function(ht,ie){return ke[ie]=So(ht,z,G,$.concat([ie]),De,me?1:xe+1)}),G.push($),ke;case"opaque_iterator":return z.push($),{inspectable:!1,preview_short:Si(B,!1),preview_long:Si(B,!0),name:B[Symbol.toStringTag],type:Z};case"date":case"regexp":return z.push($),{inspectable:!1,preview_short:Si(B,!1),preview_long:Si(B,!0),name:B.toString(),type:Z};case"object":if(me=De($),xe>=2&&!me)return a0(Z,!0,B,z,$);var Xe={};return eu(B).forEach(function(ht){var ie=ht.toString();Xe[ie]=So(B[ht],z,G,$.concat([ie]),De,me?1:xe+1)}),Xe;case"infinity":case"nan":case"undefined":return z.push($),{type:Z};default:return B}}function Go(B){return(Go=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(z){return typeof z}:function(z){return z&&typeof Symbol=="function"&&z.constructor===Symbol&&z!==Symbol.prototype?"symbol":typeof z})(B)}function Os(B){return function(z){if(Array.isArray(z))return Yo(z)}(B)||function(z){if(typeof Symbol!="undefined"&&Symbol.iterator in Object(z))return Array.from(z)}(B)||function(z,G){if(!!z){if(typeof z=="string")return Yo(z,G);var $=Object.prototype.toString.call(z).slice(8,-1);if($==="Object"&&z.constructor&&($=z.constructor.name),$==="Map"||$==="Set")return Array.from(z);if($==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test($))return Yo(z,G)}}(B)||function(){throw new TypeError(`Invalid attempt to spread non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}()}function Yo(B,z){(z==null||z>B.length)&&(z=B.length);for(var G=0,$=new Array(z);Gz.toString()?1:z.toString()>B.toString()?-1:0}function eu(B){for(var z=[],G=B,$=function(){var De=[].concat(Os(Object.keys(G)),Os(Object.getOwnPropertySymbols(G))),me=Object.getOwnPropertyDescriptors(G);De.forEach(function(xe){me[xe].enumerable&&z.push(xe)}),G=Object.getPrototypeOf(G)};G!=null;)$();return z}function ai(B){var z=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"Anonymous",G=Ko.get(B);if(G!=null)return G;var $=z;return typeof B.displayName=="string"?$=B.displayName:typeof B.name=="string"&&B.name!==""&&($=B.name),Ko.set(B,$),$}var mr=0;function Xo(){return++mr}function W0(B){var z=qt.get(B);if(z!==void 0)return z;for(var G=new Array(B.length),$=0;$1&&arguments[1]!==void 0?arguments[1]:50;return B.length>z?B.substr(0,z)+"\u2026":B}function Si(B,z){if(B!=null&&hasOwnProperty.call(B,vu.type))return z?B[vu.preview_long]:B[vu.preview_short];switch(Co(B)){case"html_element":return"<".concat(tu(B.tagName.toLowerCase())," />");case"function":return tu("\u0192 ".concat(typeof B.name=="function"?"":B.name,"() {}"));case"string":return'"'.concat(B,'"');case"bigint":return tu(B.toString()+"n");case"regexp":case"symbol":return tu(B.toString());case"react_element":return"<".concat(tu(L0(B)||"Unknown")," />");case"array_buffer":return"ArrayBuffer(".concat(B.byteLength,")");case"data_view":return"DataView(".concat(B.buffer.byteLength,")");case"array":if(z){for(var G="",$=0;$0&&(G+=", "),!((G+=Si(B[$],!1)).length>50));$++);return"[".concat(tu(G),"]")}var De=hasOwnProperty.call(B,vu.size)?B[vu.size]:B.length;return"Array(".concat(De,")");case"typed_array":var me="".concat(B.constructor.name,"(").concat(B.length,")");if(z){for(var xe="",Z=0;Z0&&(xe+=", "),!((xe+=B[Z]).length>50));Z++);return"".concat(me," [").concat(tu(xe),"]")}return me;case"iterator":var ke=B.constructor.name;if(z){for(var Xe=Array.from(B),ht="",ie=0;ie0&&(ht+=", "),Array.isArray(qe)){var tt=Si(qe[0],!0),Tt=Si(qe[1],!1);ht+="".concat(tt," => ").concat(Tt)}else ht+=Si(qe,!1);if(ht.length>50)break}return"".concat(ke,"(").concat(B.size,") {").concat(tu(ht),"}")}return"".concat(ke,"(").concat(B.size,")");case"opaque_iterator":return B[Symbol.toStringTag];case"date":return B.toString();case"object":if(z){for(var kt=eu(B).sort(_i),bt="",on=0;on0&&(bt+=", "),(bt+="".concat(tn.toString(),": ").concat(Si(B[tn],!1))).length>50)break}return"{".concat(tu(bt),"}")}return"{\u2026}";case"boolean":case"number":case"infinity":case"nan":case"null":case"undefined":return B;default:try{return tu(""+B)}catch(Lt){return"unserializable"}}}var ks=f(7);function Hl(B){return(Hl=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(z){return typeof z}:function(z){return z&&typeof Symbol=="function"&&z.constructor===Symbol&&z!==Symbol.prototype?"symbol":typeof z})(B)}function F0(B,z){var G=Object.keys(B);if(Object.getOwnPropertySymbols){var $=Object.getOwnPropertySymbols(B);z&&($=$.filter(function(De){return Object.getOwnPropertyDescriptor(B,De).enumerable})),G.push.apply(G,$)}return G}function f0(B){for(var z=1;z2&&arguments[2]!==void 0?arguments[2]:[];if(B!==null){var $=[],De=[],me=So(B,$,De,G,z);return{data:me,cleaned:$,unserializable:De}}return null}function G0(B){var z,G,$=(z=B,G=new Set,JSON.stringify(z,function(xe,Z){if(Hl(Z)==="object"&&Z!==null){if(G.has(Z))return;G.add(Z)}return typeof Z=="bigint"?Z.toString()+"n":Z})),De=$===void 0?"undefined":$,me=window.__REACT_DEVTOOLS_GLOBAL_HOOK__.clipboardCopyText;typeof me=="function"?me(De).catch(function(xe){}):Object(ks.copy)(De)}function fi(B,z){var G=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,$=z[G],De=Array.isArray(B)?B.slice():f0({},B);return G+1===z.length?Array.isArray(De)?De.splice($,1):delete De[$]:De[$]=fi(B[$],z,G+1),De}function Zt(B,z,G){var $=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0,De=z[$],me=Array.isArray(B)?B.slice():f0({},B);if($+1===z.length){var xe=G[$];me[xe]=me[De],Array.isArray(me)?me.splice(De,1):delete me[De]}else me[De]=Zt(B[De],z,G,$+1);return me}function Ln(B,z,G){var $=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0;if($>=z.length)return G;var De=z[$],me=Array.isArray(B)?B.slice():f0({},B);return me[De]=Ln(B[De],z,G,$+1),me}var Di=f(8);function ci(B,z){var G=Object.keys(B);if(Object.getOwnPropertySymbols){var $=Object.getOwnPropertySymbols(B);z&&($=$.filter(function(De){return Object.getOwnPropertyDescriptor(B,De).enumerable})),G.push.apply(G,$)}return G}function Ht(B){for(var z=1;z=B.length?{done:!0}:{done:!1,value:B[$++]}},e:function(ke){throw ke},f:De}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var me,xe=!0,Z=!1;return{s:function(){G=B[Symbol.iterator]()},n:function(){var ke=G.next();return xe=ke.done,ke},e:function(ke){Z=!0,me=ke},f:function(){try{xe||G.return==null||G.return()}finally{if(Z)throw me}}}}function Wl(B,z){if(B){if(typeof B=="string")return xo(B,z);var G=Object.prototype.toString.call(B).slice(8,-1);return G==="Object"&&B.constructor&&(G=B.constructor.name),G==="Map"||G==="Set"?Array.from(B):G==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(G)?xo(B,z):void 0}}function xo(B,z){(z==null||z>B.length)&&(z=B.length);for(var G=0,$=new Array(z);G0){var vt=me(se);if(vt!=null){var Xt,xn=Ui(Mo);try{for(xn.s();!(Xt=xn.n()).done;)if(Xt.value.test(vt))return!0}catch(er){xn.e(er)}finally{xn.f()}}}if(re!=null&&ds.size>0){var _n,yn=re.fileName,En=Ui(ds);try{for(En.s();!(_n=En.n()).done;)if(_n.value.test(yn))return!0}catch(er){En.e(er)}finally{En.f()}}return!1}function yu(se){var re=se.type;switch(se.tag){case Tt:case _r:return 1;case tt:case Cn:return 5;case tn:return 6;case Lt:return 11;case lr:return 7;case gn:case Qn:case on:return 9;case Ar:case Rr:return 8;case nt:return 12;case _t:return 13;default:switch(xe(re)){case 60111:case"Symbol(react.concurrent_mode)":case"Symbol(react.async_mode)":return 9;case 60109:case"Symbol(react.provider)":return 2;case 60110:case"Symbol(react.context)":return 2;case 60108:case"Symbol(react.strict_mode)":return 9;case 60114:case"Symbol(react.profiler)":return 10;default:return 9}}}function pi(se){if(Fo.has(se))return se;var re=se.alternate;return re!=null&&Fo.has(re)?re:(Fo.add(se),se)}window.__REACT_DEVTOOLS_COMPONENT_FILTERS__!=null?ps(window.__REACT_DEVTOOLS_COMPONENT_FILTERS__):ps([{type:1,value:7,isEnabled:!0}]);var T0=new Map,Q0=new Map,Fo=new Set,ta=new Map,Kl=new Map,Ki=-1;function Yr(se){if(!T0.has(se)){var re=Xo();T0.set(se,re),Q0.set(re,se)}return T0.get(se)}function fo(se){switch(yu(se)){case 1:if(I0!==null){var re=Yr(pi(se)),Le=gi(se);Le!==null&&I0.set(re,Le)}}}var Oi={};function gi(se){switch(yu(se)){case 1:var re=se.stateNode,Le=Oi,Ae=Oi;return re!=null&&(re.constructor&&re.constructor.contextType!=null?Ae=re.context:(Le=re.context)&&Object.keys(Le).length===0&&(Le=Oi)),[Le,Ae];default:return null}}function ff(se){switch(yu(se)){case 1:if(I0!==null){var re=Yr(pi(se)),Le=I0.has(re)?I0.get(re):null,Ae=gi(se);if(Le==null||Ae==null)return null;var ot=Y0(Le,2),vt=ot[0],Xt=ot[1],xn=Y0(Ae,2),_n=xn[0],yn=xn[1];if(_n!==Oi)return J0(vt,_n);if(yn!==Oi)return Xt!==yn}}return null}function cf(se,re){if(se==null||re==null)return!1;if(re.hasOwnProperty("baseState")&&re.hasOwnProperty("memoizedState")&&re.hasOwnProperty("next")&&re.hasOwnProperty("queue"))for(;re!==null;){if(re.memoizedState!==se.memoizedState)return!0;re=re.next,se=se.next}return!1}function J0(se,re){if(se==null||re==null||re.hasOwnProperty("baseState")&&re.hasOwnProperty("memoizedState")&&re.hasOwnProperty("next")&&re.hasOwnProperty("queue"))return null;var Le,Ae=[],ot=Ui(new Set([].concat(Yi(Object.keys(se)),Yi(Object.keys(re)))));try{for(ot.s();!(Le=ot.n()).done;){var vt=Le.value;se[vt]!==re[vt]&&Ae.push(vt)}}catch(Xt){ot.e(Xt)}finally{ot.f()}return Ae}function Z0(se,re){switch(re.tag){case Tt:case tt:case kt:case Ar:case Rr:return(oo(re)&ie)===ie;default:return se.memoizedProps!==re.memoizedProps||se.memoizedState!==re.memoizedState||se.ref!==re.ref}}var Te=[],et=[],Ve=[],Gt=[],Yt=new Map,sr=0,Br=null;function wn(se){Te.push(se)}function fu(se){if(Te.length!==0||et.length!==0||Ve.length!==0||Br!==null||Ru){var re=et.length+Ve.length+(Br===null?0:1),Le=new Array(3+sr+(re>0?2+re:0)+Te.length),Ae=0;if(Le[Ae++]=z,Le[Ae++]=Ki,Le[Ae++]=sr,Yt.forEach(function(xn,_n){Le[Ae++]=_n.length;for(var yn=W0(_n),En=0;En0){Le[Ae++]=2,Le[Ae++]=re;for(var ot=et.length-1;ot>=0;ot--)Le[Ae++]=et[ot];for(var vt=0;vt0?se.forEach(function(re){B.emit("operations",re)}):(wr!==null&&(ru=!0),B.getFiberRoots(z).forEach(function(re){Xu(Ki=Yr(pi(re.current)),re.current),Ru&&re.memoizedInteractions!=null&&($o={changeDescriptions:Xl?new Map:null,durations:[],commitTime:Vl()-Yu,interactions:Array.from(re.memoizedInteractions).map(function(Le){return Ht(Ht({},Le),{},{timestamp:Le.timestamp-Yu})}),maxActualDuration:0,priorityLevel:null}),Vr(re.current,null,!1,!1),fu(),Ki=-1}))},getBestMatchForTrackedPath:function(){if(wr===null||$0===null)return null;for(var se=$0;se!==null&&Vu(se);)se=se.return;return se===null?null:{id:Yr(pi(se)),isFullMatch:Xi===wr.length-1}},getDisplayNameForFiberID:function(se){var re=Q0.get(se);return re!=null?me(re):null},getFiberIDForNative:function(se){var re=arguments.length>1&&arguments[1]!==void 0&&arguments[1],Le=G.findFiberByHostInstance(se);if(Le!=null){if(re)for(;Le!==null&&Vu(Le);)Le=Le.return;return Yr(pi(Le))}return null},getInstanceAndStyle:function(se){var re=null,Le=null,Ae=Uu(se);return Ae!==null&&(re=Ae.stateNode,Ae.memoizedProps!==null&&(Le=Ae.memoizedProps.style)),{instance:re,style:Le}},getOwnersList:function(se){var re=Uu(se);if(re==null)return null;var Le=re._debugOwner,Ae=[{displayName:me(re)||"Anonymous",id:se,type:yu(re)}];if(Le)for(var ot=Le;ot!==null;)Ae.unshift({displayName:me(ot)||"Anonymous",id:Yr(pi(ot)),type:yu(ot)}),ot=ot._debugOwner||null;return Ae},getPathForElement:function(se){var re=Q0.get(se);if(re==null)return null;for(var Le=[];re!==null;)Le.push(y0(re)),re=re.return;return Le.reverse(),Le},getProfilingData:function(){var se=[];if(hs===null)throw Error("getProfilingData() called before any profiling data was recorded");return hs.forEach(function(re,Le){var Ae=[],ot=[],vt=new Map,Xt=new Map,xn=El!==null&&El.get(Le)||"Unknown";R0!=null&&R0.forEach(function(_n,yn){co!=null&&co.get(yn)===Le&&ot.push([yn,_n])}),re.forEach(function(_n,yn){var En=_n.changeDescriptions,er=_n.durations,It=_n.interactions,xi=_n.maxActualDuration,Sr=_n.priorityLevel,cr=_n.commitTime,Y=[];It.forEach(function(hi){vt.has(hi.id)||vt.set(hi.id,hi),Y.push(hi.id);var Qi=Xt.get(hi.id);Qi!=null?Qi.push(yn):Xt.set(hi.id,[yn])});for(var Qr=[],Jr=[],Ur=0;Ur1?Wn.set(En,er-1):Wn.delete(En),Xr.delete(_n)}(Ki),Kr(Le,!1))}else Xu(Ki,Le),Vr(Le,null,!1,!1);if(Ru&&ot){var xn=hs.get(Ki);xn!=null?xn.push($o):hs.set(Ki,[$o])}fu(),No&&B.emit("traceUpdates",Lo),Ki=-1},handleCommitFiberUnmount:function(se){Kr(se,!1)},inspectElement:function(se,re){if(Li(se)){if(re!=null){A0(re);var Le=null;return re[0]==="hooks"&&(Le="hooks"),{id:se,type:"hydrated-path",path:re,value:Ei(Lu(zi,re),Fi(null,Le),re)}}return{id:se,type:"no-change"}}if(Is=!1,zi!==null&&zi.id===se||(x0={}),(zi=na(se))===null)return{id:se,type:"not-found"};re!=null&&A0(re),function(ot){var vt=ot.hooks,Xt=ot.id,xn=ot.props,_n=Q0.get(Xt);if(_n!=null){var yn=_n.elementType,En=_n.stateNode,er=_n.tag,It=_n.type;switch(er){case Tt:case _r:case Cn:$.$r=En;break;case tt:$.$r={hooks:vt,props:xn,type:It};break;case tn:$.$r={props:xn,type:It.render};break;case Ar:case Rr:$.$r={props:xn,type:yn!=null&&yn.type!=null?yn.type:It};break;default:$.$r=null}}else console.warn('Could not find Fiber with id "'.concat(Xt,'"'))}(zi);var Ae=Ht({},zi);return Ae.context=Ei(Ae.context,Fi("context",null)),Ae.hooks=Ei(Ae.hooks,Fi("hooks","hooks")),Ae.props=Ei(Ae.props,Fi("props",null)),Ae.state=Ei(Ae.state,Fi("state",null)),{id:se,type:"full-data",value:Ae}},logElementToConsole:function(se){var re=Li(se)?zi:na(se);if(re!==null){var Le=typeof console.groupCollapsed=="function";Le&&console.groupCollapsed("[Click to expand] %c<".concat(re.displayName||"Component"," />"),"color: var(--dom-tag-name-color); font-weight: normal;"),re.props!==null&&console.log("Props:",re.props),re.state!==null&&console.log("State:",re.state),re.hooks!==null&&console.log("Hooks:",re.hooks);var Ae=_l(se);Ae!==null&&console.log("Nodes:",Ae),re.source!==null&&console.log("Location:",re.source),(window.chrome||/firefox/i.test(navigator.userAgent))&&console.log("Right-click any value to save it as a global variable for further inspection."),Le&&console.groupEnd()}else console.warn('Could not find Fiber with id "'.concat(se,'"'))},prepareViewAttributeSource:function(se,re){Li(se)&&(window.$attribute=Lu(zi,re))},prepareViewElementSource:function(se){var re=Q0.get(se);if(re!=null){var Le=re.elementType,Ae=re.tag,ot=re.type;switch(Ae){case Tt:case _r:case Cn:case tt:$.$type=ot;break;case tn:$.$type=ot.render;break;case Ar:case Rr:$.$type=Le!=null&&Le.type!=null?Le.type:ot;break;default:$.$type=null}}else console.warn('Could not find Fiber with id "'.concat(se,'"'))},overrideSuspense:function(se,re){if(typeof ko!="function"||typeof Zo!="function")throw new Error("Expected overrideSuspense() to not get called for earlier React versions.");re?(Ku.add(se),Ku.size===1&&ko(vs)):(Ku.delete(se),Ku.size===0&&ko(df));var Le=Q0.get(se);Le!=null&&Zo(Le)},overrideValueAtPath:function(se,re,Le,Ae,ot){var vt=Uu(re);if(vt!==null){var Xt=vt.stateNode;switch(se){case"context":switch(Ae=Ae.slice(1),vt.tag){case Tt:Ae.length===0?Xt.context=ot:To(Xt.context,Ae,ot),Xt.forceUpdate()}break;case"hooks":typeof nu=="function"&&nu(vt,Le,Ae,ot);break;case"props":switch(vt.tag){case Tt:vt.pendingProps=Ln(Xt.props,Ae,ot),Xt.forceUpdate();break;default:typeof X0=="function"&&X0(vt,Ae,ot)}break;case"state":switch(vt.tag){case Tt:To(Xt.state,Ae,ot),Xt.forceUpdate()}}}},renamePath:function(se,re,Le,Ae,ot){var vt=Uu(re);if(vt!==null){var Xt=vt.stateNode;switch(se){case"context":switch(Ae=Ae.slice(1),ot=ot.slice(1),vt.tag){case Tt:Ae.length===0||Hr(Xt.context,Ae,ot),Xt.forceUpdate()}break;case"hooks":typeof S0=="function"&&S0(vt,Le,Ae,ot);break;case"props":Xt===null?typeof di=="function"&&di(vt,Ae,ot):(vt.pendingProps=Zt(Xt.props,Ae,ot),Xt.forceUpdate());break;case"state":Hr(Xt.state,Ae,ot),Xt.forceUpdate()}}},renderer:G,setTraceUpdatesEnabled:function(se){No=se},setTrackedPath:Ci,startProfiling:ra,stopProfiling:function(){Ru=!1,Xl=!1},storeAsGlobal:function(se,re,Le){if(Li(se)){var Ae=Lu(zi,re),ot="$reactTemp".concat(Le);window[ot]=Ae,console.log(ot),console.log(Ae)}},updateComponentFilters:function(se){if(Ru)throw Error("Cannot modify filter preferences while profiling");B.getFiberRoots(z).forEach(function(re){Ki=Yr(pi(re.current)),Bu(re.current),Kr(re.current,!1),Ki=-1}),ps(se),Wn.clear(),B.getFiberRoots(z).forEach(function(re){Xu(Ki=Yr(pi(re.current)),re.current),Vr(re.current,null,!1,!1),fu(re),Ki=-1})}}}var Xn;function Qo(B){return(Qo=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(z){return typeof z}:function(z){return z&&typeof Symbol=="function"&&z.constructor===Symbol&&z!==Symbol.prototype?"symbol":typeof z})(B)}function lo(B,z,G){if(Xn===void 0)try{throw Error()}catch(De){var $=De.stack.trim().match(/\n( *(at )?)/);Xn=$&&$[1]||""}return` +`+Xn+B}var b0=!1;function yl(B,z,G){if(!B||b0)return"";var $,De=Error.prepareStackTrace;Error.prepareStackTrace=void 0,b0=!0;var me=G.current;G.current=null;try{if(z){var xe=function(){throw Error()};if(Object.defineProperty(xe.prototype,"props",{set:function(){throw Error()}}),(typeof Reflect=="undefined"?"undefined":Qo(Reflect))==="object"&&Reflect.construct){try{Reflect.construct(xe,[])}catch(qe){$=qe}Reflect.construct(B,[],xe)}else{try{xe.call()}catch(qe){$=qe}B.call(xe.prototype)}}else{try{throw Error()}catch(qe){$=qe}B()}}catch(qe){if(qe&&$&&typeof qe.stack=="string"){for(var Z=qe.stack.split(` +`),ke=$.stack.split(` +`),Xe=Z.length-1,ht=ke.length-1;Xe>=1&&ht>=0&&Z[Xe]!==ke[ht];)ht--;for(;Xe>=1&&ht>=0;Xe--,ht--)if(Z[Xe]!==ke[ht]){if(Xe!==1||ht!==1)do if(Xe--,--ht<0||Z[Xe]!==ke[ht])return` +`+Z[Xe].replace(" at new "," at ");while(Xe>=1&&ht>=0);break}}}finally{b0=!1,Error.prepareStackTrace=De,G.current=me}var ie=B?B.displayName||B.name:"";return ie?lo(ie):""}function Ro(B,z,G,$){return yl(B,!1,$)}function Et(B,z,G){var $=B.HostComponent,De=B.LazyComponent,me=B.SuspenseComponent,xe=B.SuspenseListComponent,Z=B.FunctionComponent,ke=B.IndeterminateComponent,Xe=B.SimpleMemoComponent,ht=B.ForwardRef,ie=B.Block,qe=B.ClassComponent;switch(z.tag){case $:return lo(z.type);case De:return lo("Lazy");case me:return lo("Suspense");case xe:return lo("SuspenseList");case Z:case ke:case Xe:return Ro(z.type,0,0,G);case ht:return Ro(z.type.render,0,0,G);case ie:return Ro(z.type._render,0,0,G);case qe:return function(tt,Tt,kt,bt){return yl(tt,!0,bt)}(z.type,0,0,G);default:return""}}function Pt(B,z,G){try{var $="",De=z;do $+=Et(B,De,G),De=De.return;while(De);return $}catch(me){return` +Error generating stack: `+me.message+` +`+me.stack}}function Bn(B,z){var G;if(typeof Symbol=="undefined"||B[Symbol.iterator]==null){if(Array.isArray(B)||(G=function(ke,Xe){if(!!ke){if(typeof ke=="string")return Ir(ke,Xe);var ht=Object.prototype.toString.call(ke).slice(8,-1);if(ht==="Object"&&ke.constructor&&(ht=ke.constructor.name),ht==="Map"||ht==="Set")return Array.from(ke);if(ht==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(ht))return Ir(ke,Xe)}}(B))||z&&B&&typeof B.length=="number"){G&&(B=G);var $=0,De=function(){};return{s:De,n:function(){return $>=B.length?{done:!0}:{done:!1,value:B[$++]}},e:function(ke){throw ke},f:De}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var me,xe=!0,Z=!1;return{s:function(){G=B[Symbol.iterator]()},n:function(){var ke=G.next();return xe=ke.done,ke},e:function(ke){Z=!0,me=ke},f:function(){try{xe||G.return==null||G.return()}finally{if(Z)throw me}}}}function Ir(B,z){(z==null||z>B.length)&&(z=B.length);for(var G=0,$=new Array(z);G0?Xe[Xe.length-1]:null,qe=ie!==null&&(Wr.test(ie)||wu.test(ie));if(!qe){var tt,Tt=Bn(c0.values());try{for(Tt.s();!(tt=Tt.n()).done;){var kt=tt.value,bt=kt.currentDispatcherRef,on=kt.getCurrentFiber,tn=kt.workTagMap,Lt=on();if(Lt!=null){var gn=Pt(tn,Lt,bt);gn!==""&&Xe.push(gn);break}}}catch(lr){Tt.e(lr)}finally{Tt.f()}}}catch(lr){}me.apply(void 0,Xe)};xe.__REACT_DEVTOOLS_ORIGINAL_METHOD__=me,Ti[De]=xe}catch(Z){}})}}function Fu(B){return(Fu=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(z){return typeof z}:function(z){return z&&typeof Symbol=="function"&&z.constructor===Symbol&&z!==Symbol.prototype?"symbol":typeof z})(B)}function fs(B,z){for(var G=0;GB.length)&&(z=B.length);for(var G=0,$=new Array(z);G1?Z-1:0),Xe=1;Xe0?ie[ie.length-1]:0),ie.push(nn),Z.set(Ze,Xe(Ft._topLevelWrapper));try{var sn=nt.apply(this,_t);return ie.pop(),sn}catch(yr){throw ie=[],yr}finally{if(ie.length===0){var Yn=Z.get(Ze);if(Yn===void 0)throw new Error("Expected to find root ID.");lr(Yn)}}},performUpdateIfNecessary:function(nt,_t){var Ze=_t[0];if(w0(Ze)===9)return nt.apply(this,_t);var Ft=Xe(Ze);ie.push(Ft);var nn=Gn(Ze);try{var sn=nt.apply(this,_t),Yn=Gn(Ze);return ht(nn,Yn)||Tt(Ze,Ft,Yn),ie.pop(),sn}catch(nu){throw ie=[],nu}finally{if(ie.length===0){var yr=Z.get(Ze);if(yr===void 0)throw new Error("Expected to find root ID.");lr(yr)}}},receiveComponent:function(nt,_t){var Ze=_t[0];if(w0(Ze)===9)return nt.apply(this,_t);var Ft=Xe(Ze);ie.push(Ft);var nn=Gn(Ze);try{var sn=nt.apply(this,_t),Yn=Gn(Ze);return ht(nn,Yn)||Tt(Ze,Ft,Yn),ie.pop(),sn}catch(nu){throw ie=[],nu}finally{if(ie.length===0){var yr=Z.get(Ze);if(yr===void 0)throw new Error("Expected to find root ID.");lr(yr)}}},unmountComponent:function(nt,_t){var Ze=_t[0];if(w0(Ze)===9)return nt.apply(this,_t);var Ft=Xe(Ze);ie.push(Ft);try{var nn=nt.apply(this,_t);return ie.pop(),function(Yn,yr){tn.push(yr),me.delete(yr)}(0,Ft),nn}catch(Yn){throw ie=[],Yn}finally{if(ie.length===0){var sn=Z.get(Ze);if(sn===void 0)throw new Error("Expected to find root ID.");lr(sn)}}}}));var bt=[],on=new Map,tn=[],Lt=0,gn=null;function lr(nt){if(bt.length!==0||tn.length!==0||gn!==null){var _t=tn.length+(gn===null?0:1),Ze=new Array(3+Lt+(_t>0?2+_t:0)+bt.length),Ft=0;if(Ze[Ft++]=z,Ze[Ft++]=nt,Ze[Ft++]=Lt,on.forEach(function(Yn,yr){Ze[Ft++]=yr.length;for(var nu=W0(yr),Cu=0;Cu0){Ze[Ft++]=2,Ze[Ft++]=_t;for(var nn=0;nn"),"color: var(--dom-tag-name-color); font-weight: normal;"),_t.props!==null&&console.log("Props:",_t.props),_t.state!==null&&console.log("State:",_t.state),_t.context!==null&&console.log("Context:",_t.context);var Ft=De(nt);Ft!==null&&console.log("Node:",Ft),(window.chrome||/firefox/i.test(navigator.userAgent))&&console.log("Right-click any value to save it as a global variable for further inspection."),Ze&&console.groupEnd()}else console.warn('Could not find element with id "'.concat(nt,'"'))},overrideSuspense:function(){throw new Error("overrideSuspense not supported by this renderer")},overrideValueAtPath:function(nt,_t,Ze,Ft,nn){var sn=me.get(_t);if(sn!=null){var Yn=sn._instance;if(Yn!=null)switch(nt){case"context":To(Yn.context,Ft,nn),p0(Yn);break;case"hooks":throw new Error("Hooks not supported by this renderer");case"props":var yr=sn._currentElement;sn._currentElement=K0(K0({},yr),{},{props:Ln(yr.props,Ft,nn)}),p0(Yn);break;case"state":To(Yn.state,Ft,nn),p0(Yn)}}},renamePath:function(nt,_t,Ze,Ft,nn){var sn=me.get(_t);if(sn!=null){var Yn=sn._instance;if(Yn!=null)switch(nt){case"context":Hr(Yn.context,Ft,nn),p0(Yn);break;case"hooks":throw new Error("Hooks not supported by this renderer");case"props":var yr=sn._currentElement;sn._currentElement=K0(K0({},yr),{},{props:Zt(yr.props,Ft,nn)}),p0(Yn);break;case"state":Hr(Yn.state,Ft,nn),p0(Yn)}}},prepareViewAttributeSource:function(nt,_t){var Ze=Rr(nt);Ze!==null&&(window.$attribute=Lu(Ze,_t))},prepareViewElementSource:function(nt){var _t=me.get(nt);if(_t!=null){var Ze=_t._currentElement;Ze!=null?$.$type=Ze.type:console.warn('Could not find element with id "'.concat(nt,'"'))}else console.warn('Could not find instance with id "'.concat(nt,'"'))},renderer:G,setTraceUpdatesEnabled:function(nt){},setTrackedPath:function(nt){},startProfiling:function(){},stopProfiling:function(){},storeAsGlobal:function(nt,_t,Ze){var Ft=Rr(nt);if(Ft!==null){var nn=Lu(Ft,_t),sn="$reactTemp".concat(Ze);window[sn]=nn,console.log(sn),console.log(nn)}},updateComponentFilters:function(nt){}}}function ri(B,z){var G=!1,$={bottom:0,left:0,right:0,top:0},De=z[B];if(De!=null){for(var me=0,xe=Object.keys($);me0?"development":"production";var bt=Function.prototype.toString;if(kt.Mount&&kt.Mount._renderNewRootComponent){var on=bt.call(kt.Mount._renderNewRootComponent);return on.indexOf("function")!==0?"production":on.indexOf("storedMeasure")!==-1?"development":on.indexOf("should be a pure function")!==-1?on.indexOf("NODE_ENV")!==-1||on.indexOf("development")!==-1||on.indexOf("true")!==-1?"development":on.indexOf("nextElement")!==-1||on.indexOf("nextComponent")!==-1?"unminified":"development":on.indexOf("nextElement")!==-1||on.indexOf("nextComponent")!==-1?"unminified":"outdated"}}catch(tn){}return"production"}(ke);try{var ie=window.__REACT_DEVTOOLS_APPEND_COMPONENT_STACK__!==!1,qe=window.__REACT_DEVTOOLS_BREAK_ON_CONSOLE_ERRORS__===!0;(ie||qe)&&(so(ke),Gl({appendComponentStack:ie,breakOnConsoleErrors:qe}))}catch(kt){}var tt=B.__REACT_DEVTOOLS_ATTACH__;if(typeof tt=="function"){var Tt=tt(Z,Xe,ke,B);Z.rendererInterfaces.set(Xe,Tt)}return Z.emit("renderer",{id:Xe,renderer:ke,reactBuildType:ht}),Xe},on:function(ke,Xe){me[ke]||(me[ke]=[]),me[ke].push(Xe)},off:function(ke,Xe){if(me[ke]){var ht=me[ke].indexOf(Xe);ht!==-1&&me[ke].splice(ht,1),me[ke].length||delete me[ke]}},sub:function(ke,Xe){return Z.on(ke,Xe),function(){return Z.off(ke,Xe)}},supportsFiber:!0,checkDCE:function(ke){try{Function.prototype.toString.call(ke).indexOf("^_^")>-1&&(G=!0,setTimeout(function(){throw new Error("React is running in production mode, but dead code elimination has not been applied. Read how to correctly configure React for production: https://reactjs.org/link/perf-use-production-build")}))}catch(Xe){}},onCommitFiberUnmount:function(ke,Xe){var ht=De.get(ke);ht!=null&&ht.handleCommitFiberUnmount(Xe)},onCommitFiberRoot:function(ke,Xe,ht){var ie=Z.getFiberRoots(ke),qe=Xe.current,tt=ie.has(Xe),Tt=qe.memoizedState==null||qe.memoizedState.element==null;tt||Tt?tt&&Tt&&ie.delete(Xe):ie.add(Xe);var kt=De.get(ke);kt!=null&&kt.handleCommitFiberRoot(Xe,ht)}};Object.defineProperty(B,"__REACT_DEVTOOLS_GLOBAL_HOOK__",{configurable:!1,enumerable:!1,get:function(){return Z}})})(window);var h0=window.__REACT_DEVTOOLS_GLOBAL_HOOK__,Fs=[{type:1,value:7,isEnabled:!0}];function Ni(B){if(h0!=null){var z=B||{},G=z.host,$=G===void 0?"localhost":G,De=z.nativeStyleEditorValidAttributes,me=z.useHttps,xe=me!==void 0&&me,Z=z.port,ke=Z===void 0?8097:Z,Xe=z.websocket,ht=z.resolveRNStyle,ie=ht===void 0?null:ht,qe=z.isAppActive,tt=xe?"wss":"ws",Tt=null;if((qe===void 0?function(){return!0}:qe)()){var kt=null,bt=[],on=tt+"://"+$+":"+ke,tn=Xe||new window.WebSocket(on);tn.onclose=function(){kt!==null&&kt.emit("shutdown"),Lt()},tn.onerror=function(){Lt()},tn.onmessage=function(gn){var lr;try{if(typeof gn.data!="string")throw Error();lr=JSON.parse(gn.data)}catch(Qn){return void console.error("[React DevTools] Failed to parse JSON: "+gn.data)}bt.forEach(function(Qn){try{Qn(lr)}catch(_r){throw console.log("[React DevTools] Error calling listener",lr),console.log("error:",_r),_r}})},tn.onopen=function(){(kt=new ao({listen:function(Cn){return bt.push(Cn),function(){var Ar=bt.indexOf(Cn);Ar>=0&&bt.splice(Ar,1)}},send:function(Cn,Ar,v0){tn.readyState===tn.OPEN?tn.send(JSON.stringify({event:Cn,payload:Ar})):(kt!==null&&kt.shutdown(),Lt())}})).addListener("inspectElement",function(Cn){var Ar=Cn.id,v0=Cn.rendererID,Rr=gn.rendererInterfaces[v0];if(Rr!=null){var nt=Rr.findNativeNodesForFiberID(Ar);nt!=null&&nt[0]!=null&&gn.emit("showNativeHighlight",nt[0])}}),kt.addListener("updateComponentFilters",function(Cn){Fs=Cn}),window.__REACT_DEVTOOLS_COMPONENT_FILTERS__==null&&kt.send("overrideComponentFilters",Fs);var gn=new Hn(kt);if(gn.addListener("shutdown",function(){h0.emit("shutdown")}),function(Cn,Ar,v0){if(Cn==null)return function(){};var Rr=[Cn.sub("renderer-attached",function(Ze){var Ft=Ze.id,nn=(Ze.renderer,Ze.rendererInterface);Ar.setRendererInterface(Ft,nn),nn.flushInitialOperations()}),Cn.sub("unsupported-renderer-version",function(Ze){Ar.onUnsupportedRenderer(Ze)}),Cn.sub("operations",Ar.onHookOperations),Cn.sub("traceUpdates",Ar.onTraceUpdates)],nt=function(Ze,Ft){var nn=Cn.rendererInterfaces.get(Ze);nn==null&&(typeof Ft.findFiberByHostInstance=="function"?nn=Ms(Cn,Ze,Ft,v0):Ft.ComponentTree&&(nn=ic(Cn,Ze,Ft,v0)),nn!=null&&Cn.rendererInterfaces.set(Ze,nn)),nn!=null?Cn.emit("renderer-attached",{id:Ze,renderer:Ft,rendererInterface:nn}):Cn.emit("unsupported-renderer-version",Ze)};Cn.renderers.forEach(function(Ze,Ft){nt(Ft,Ze)}),Rr.push(Cn.sub("renderer",function(Ze){var Ft=Ze.id,nn=Ze.renderer;nt(Ft,nn)})),Cn.emit("react-devtools",Ar),Cn.reactDevtoolsAgent=Ar;var _t=function(){Rr.forEach(function(Ze){return Ze()}),Cn.rendererInterfaces.forEach(function(Ze){Ze.cleanup()}),Cn.reactDevtoolsAgent=null};Ar.addListener("shutdown",_t),Rr.push(function(){Ar.removeListener("shutdown",_t)})}(h0,gn,window),ie!=null||h0.resolveRNStyle!=null)ea(kt,gn,ie||h0.resolveRNStyle,De||h0.nativeStyleEditorValidAttributes||null);else{var lr,Qn,_r=function(){kt!==null&&ea(kt,gn,lr,Qn)};h0.hasOwnProperty("resolveRNStyle")||Object.defineProperty(h0,"resolveRNStyle",{enumerable:!1,get:function(){return lr},set:function(Cn){lr=Cn,_r()}}),h0.hasOwnProperty("nativeStyleEditorValidAttributes")||Object.defineProperty(h0,"nativeStyleEditorValidAttributes",{enumerable:!1,get:function(){return Qn},set:function(Cn){Qn=Cn,_r()}})}}}else Lt()}function Lt(){Tt===null&&(Tt=setTimeout(function(){return Ni(B)},2e3))}}}])})});var mR=ce(vR=>{"use strict";Object.defineProperty(vR,"__esModule",{value:!0});pR();var $Q=hR();$Q.connectToDevTools()});var DR=ce(kg=>{"use strict";var yR=kg&&kg.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(kg,"__esModule",{value:!0});var gR=h4(),eJ=yR(D9()),_R=yR(eh()),ss=Lw();process.env.DEV==="true"&&mR();var ER=i=>{i==null||i.unsetMeasureFunc(),i==null||i.freeRecursive()};kg.default=eJ.default({schedulePassiveEffects:gR.unstable_scheduleCallback,cancelPassiveEffects:gR.unstable_cancelCallback,now:Date.now,getRootHostContext:()=>({isInsideText:!1}),prepareForCommit:()=>{},resetAfterCommit:i=>{if(i.isStaticDirty){i.isStaticDirty=!1,typeof i.onImmediateRender=="function"&&i.onImmediateRender();return}typeof i.onRender=="function"&&i.onRender()},getChildHostContext:(i,o)=>{let f=i.isInsideText,p=o==="ink-text"||o==="ink-virtual-text";return f===p?i:{isInsideText:p}},shouldSetTextContent:()=>!1,createInstance:(i,o,f,p)=>{if(p.isInsideText&&i==="ink-box")throw new Error(" can\u2019t be nested inside component");let E=i==="ink-text"&&p.isInsideText?"ink-virtual-text":i,t=ss.createNode(E);for(let[k,L]of Object.entries(o))k!=="children"&&(k==="style"?ss.setStyle(t,L):k==="internal_transform"?t.internal_transform=L:k==="internal_static"?t.internal_static=!0:ss.setAttribute(t,k,L));return t},createTextInstance:(i,o,f)=>{if(!f.isInsideText)throw new Error(`Text string "${i}" must be rendered inside component`);return ss.createTextNode(i)},resetTextContent:()=>{},hideTextInstance:i=>{ss.setTextNodeValue(i,"")},unhideTextInstance:(i,o)=>{ss.setTextNodeValue(i,o)},getPublicInstance:i=>i,hideInstance:i=>{var o;(o=i.yogaNode)===null||o===void 0||o.setDisplay(_R.default.DISPLAY_NONE)},unhideInstance:i=>{var o;(o=i.yogaNode)===null||o===void 0||o.setDisplay(_R.default.DISPLAY_FLEX)},appendInitialChild:ss.appendChildNode,appendChild:ss.appendChildNode,insertBefore:ss.insertBeforeNode,finalizeInitialChildren:(i,o,f,p)=>(i.internal_static&&(p.isStaticDirty=!0,p.staticNode=i),!1),supportsMutation:!0,appendChildToContainer:ss.appendChildNode,insertInContainerBefore:ss.insertBeforeNode,removeChildFromContainer:(i,o)=>{ss.removeChildNode(i,o),ER(o.yogaNode)},prepareUpdate:(i,o,f,p,E)=>{i.internal_static&&(E.isStaticDirty=!0);let t={},k=Object.keys(p);for(let L of k)if(p[L]!==f[L]){if(L==="style"&&typeof p.style=="object"&&typeof f.style=="object"){let C=p.style,U=f.style,q=Object.keys(C);for(let W of q){if(W==="borderStyle"||W==="borderColor"){if(typeof t.style!="object"){let ne={};t.style=ne}t.style.borderStyle=C.borderStyle,t.style.borderColor=C.borderColor}if(C[W]!==U[W]){if(typeof t.style!="object"){let ne={};t.style=ne}t.style[W]=C[W]}}continue}t[L]=p[L]}return t},commitUpdate:(i,o)=>{for(let[f,p]of Object.entries(o))f!=="children"&&(f==="style"?ss.setStyle(i,p):f==="internal_transform"?i.internal_transform=p:f==="internal_static"?i.internal_static=!0:ss.setAttribute(i,f,p))},commitTextUpdate:(i,o,f)=>{ss.setTextNodeValue(i,f)},removeChild:(i,o)=>{ss.removeChildNode(i,o),ER(o.yogaNode)}})});var SR=ce((Are,wR)=>{"use strict";wR.exports=(i,o=1,f)=>{if(f=E0({indent:" ",includeEmptyLines:!1},f),typeof i!="string")throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof i}\``);if(typeof o!="number")throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof o}\``);if(typeof f.indent!="string")throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof f.indent}\``);if(o===0)return i;let p=f.includeEmptyLines?/^/gm:/^(?!\s*$)/gm;return i.replace(p,f.indent.repeat(o))}});var TR=ce(Mg=>{"use strict";var tJ=Mg&&Mg.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(Mg,"__esModule",{value:!0});var k4=tJ(eh());Mg.default=i=>i.getComputedWidth()-i.getComputedPadding(k4.default.EDGE_LEFT)-i.getComputedPadding(k4.default.EDGE_RIGHT)-i.getComputedBorder(k4.default.EDGE_LEFT)-i.getComputedBorder(k4.default.EDGE_RIGHT)});var xR=ce((Ore,CR)=>{CR.exports={single:{topLeft:"\u250C",topRight:"\u2510",bottomRight:"\u2518",bottomLeft:"\u2514",vertical:"\u2502",horizontal:"\u2500"},double:{topLeft:"\u2554",topRight:"\u2557",bottomRight:"\u255D",bottomLeft:"\u255A",vertical:"\u2551",horizontal:"\u2550"},round:{topLeft:"\u256D",topRight:"\u256E",bottomRight:"\u256F",bottomLeft:"\u2570",vertical:"\u2502",horizontal:"\u2500"},bold:{topLeft:"\u250F",topRight:"\u2513",bottomRight:"\u251B",bottomLeft:"\u2517",vertical:"\u2503",horizontal:"\u2501"},singleDouble:{topLeft:"\u2553",topRight:"\u2556",bottomRight:"\u255C",bottomLeft:"\u2559",vertical:"\u2551",horizontal:"\u2500"},doubleSingle:{topLeft:"\u2552",topRight:"\u2555",bottomRight:"\u255B",bottomLeft:"\u2558",vertical:"\u2502",horizontal:"\u2550"},classic:{topLeft:"+",topRight:"+",bottomRight:"+",bottomLeft:"+",vertical:"|",horizontal:"-"}}});var RR=ce((kre,Zw)=>{"use strict";var AR=xR();Zw.exports=AR;Zw.exports.default=AR});var kR=ce((Mre,OR)=>{"use strict";OR.exports=(i,o=process.argv)=>{let f=i.startsWith("-")?"":i.length===1?"-":"--",p=o.indexOf(f+i),E=o.indexOf("--");return p!==-1&&(E===-1||p{"use strict";var nJ=require("os"),NR=require("tty"),of=kR(),{env:Wo}=process,md;of("no-color")||of("no-colors")||of("color=false")||of("color=never")?md=0:(of("color")||of("colors")||of("color=true")||of("color=always"))&&(md=1);"FORCE_COLOR"in Wo&&(Wo.FORCE_COLOR==="true"?md=1:Wo.FORCE_COLOR==="false"?md=0:md=Wo.FORCE_COLOR.length===0?1:Math.min(parseInt(Wo.FORCE_COLOR,10),3));function $w(i){return i===0?!1:{level:i,hasBasic:!0,has256:i>=2,has16m:i>=3}}function e3(i,o){if(md===0)return 0;if(of("color=16m")||of("color=full")||of("color=truecolor"))return 3;if(of("color=256"))return 2;if(i&&!o&&md===void 0)return 0;let f=md||0;if(Wo.TERM==="dumb")return f;if(process.platform==="win32"){let p=nJ.release().split(".");return Number(p[0])>=10&&Number(p[2])>=10586?Number(p[2])>=14931?3:2:1}if("CI"in Wo)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(p=>p in Wo)||Wo.CI_NAME==="codeship"?1:f;if("TEAMCITY_VERSION"in Wo)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(Wo.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in Wo)return 1;if(Wo.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in Wo){let p=parseInt((Wo.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(Wo.TERM_PROGRAM){case"iTerm.app":return p>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(Wo.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(Wo.TERM)||"COLORTERM"in Wo?1:f}function rJ(i){let o=e3(i,i&&i.isTTY);return $w(o)}MR.exports={supportsColor:rJ,stdout:$w(e3(!0,NR.isatty(1))),stderr:$w(e3(!0,NR.isatty(2)))}});var bR=ce((Lre,FR)=>{"use strict";var iJ=(i,o,f)=>{let p=i.indexOf(o);if(p===-1)return i;let E=o.length,t=0,k="";do k+=i.substr(t,p-t)+o+f,t=p+E,p=i.indexOf(o,t);while(p!==-1);return k+=i.substr(t),k},uJ=(i,o,f,p)=>{let E=0,t="";do{let k=i[p-1]==="\r";t+=i.substr(E,(k?p-1:p)-E)+o+(k?`\r +`:` +`)+f,E=p+1,p=i.indexOf(` +`,E)}while(p!==-1);return t+=i.substr(E),t};FR.exports={stringReplaceAll:iJ,stringEncaseCRLFWithFirstIndex:uJ}});var jR=ce((Fre,PR)=>{"use strict";var oJ=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,IR=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,lJ=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,sJ=/\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi,aJ=new Map([["n",` +`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e",""],["a","\x07"]]);function BR(i){let o=i[0]==="u",f=i[1]==="{";return o&&!f&&i.length===5||i[0]==="x"&&i.length===3?String.fromCharCode(parseInt(i.slice(1),16)):o&&f?String.fromCodePoint(parseInt(i.slice(2,-1),16)):aJ.get(i)||i}function fJ(i,o){let f=[],p=o.trim().split(/\s*,\s*/g),E;for(let t of p){let k=Number(t);if(!Number.isNaN(k))f.push(k);else if(E=t.match(lJ))f.push(E[2].replace(sJ,(L,N,C)=>N?BR(N):C));else throw new Error(`Invalid Chalk template style argument: ${t} (in style '${i}')`)}return f}function cJ(i){IR.lastIndex=0;let o=[],f;for(;(f=IR.exec(i))!==null;){let p=f[1];if(f[2]){let E=fJ(p,f[2]);o.push([p].concat(E))}else o.push([p])}return o}function UR(i,o){let f={};for(let E of o)for(let t of E.styles)f[t[0]]=E.inverse?null:t.slice(1);let p=i;for(let[E,t]of Object.entries(f))if(!!Array.isArray(t)){if(!(E in p))throw new Error(`Unknown Chalk style: ${E}`);p=t.length>0?p[E](...t):p[E]}return p}PR.exports=(i,o)=>{let f=[],p=[],E=[];if(o.replace(oJ,(t,k,L,N,C,U)=>{if(k)E.push(BR(k));else if(N){let q=E.join("");E=[],p.push(f.length===0?q:UR(i,f)(q)),f.push({inverse:L,styles:cJ(N)})}else if(C){if(f.length===0)throw new Error("Found extraneous } in Chalk template literal");p.push(UR(i,f)(E.join(""))),E=[],f.pop()}else E.push(U)}),p.push(E.join("")),f.length>0){let t=`Chalk template literal is missing ${f.length} closing bracket${f.length===1?"":"s"} (\`}\`)`;throw new Error(t)}return p.join("")}});var u3=ce((bre,zR)=>{"use strict";var Ng=_4(),{stdout:t3,stderr:n3}=LR(),{stringReplaceAll:dJ,stringEncaseCRLFWithFirstIndex:pJ}=bR(),{isArray:M4}=Array,qR=["ansi","ansi","ansi256","ansi16m"],cm=Object.create(null),hJ=(i,o={})=>{if(o.level&&!(Number.isInteger(o.level)&&o.level>=0&&o.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let f=t3?t3.level:0;i.level=o.level===void 0?f:o.level},HR=class{constructor(o){return WR(o)}},WR=i=>{let o={};return hJ(o,i),o.template=(...f)=>VR(o.template,...f),Object.setPrototypeOf(o,N4.prototype),Object.setPrototypeOf(o.template,o),o.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},o.template.Instance=HR,o.template};function N4(i){return WR(i)}for(let[i,o]of Object.entries(Ng))cm[i]={get(){let f=L4(this,r3(o.open,o.close,this._styler),this._isEmpty);return Object.defineProperty(this,i,{value:f}),f}};cm.visible={get(){let i=L4(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:i}),i}};var GR=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let i of GR)cm[i]={get(){let{level:o}=this;return function(...f){let p=r3(Ng.color[qR[o]][i](...f),Ng.color.close,this._styler);return L4(this,p,this._isEmpty)}}};for(let i of GR){let o="bg"+i[0].toUpperCase()+i.slice(1);cm[o]={get(){let{level:f}=this;return function(...p){let E=r3(Ng.bgColor[qR[f]][i](...p),Ng.bgColor.close,this._styler);return L4(this,E,this._isEmpty)}}}}var vJ=Object.defineProperties(()=>{},Gf(E0({},cm),{level:{enumerable:!0,get(){return this._generator.level},set(i){this._generator.level=i}}})),r3=(i,o,f)=>{let p,E;return f===void 0?(p=i,E=o):(p=f.openAll+i,E=o+f.closeAll),{open:i,close:o,openAll:p,closeAll:E,parent:f}},L4=(i,o,f)=>{let p=(...E)=>M4(E[0])&&M4(E[0].raw)?YR(p,VR(p,...E)):YR(p,E.length===1?""+E[0]:E.join(" "));return Object.setPrototypeOf(p,vJ),p._generator=i,p._styler=o,p._isEmpty=f,p},YR=(i,o)=>{if(i.level<=0||!o)return i._isEmpty?"":o;let f=i._styler;if(f===void 0)return o;let{openAll:p,closeAll:E}=f;if(o.indexOf("")!==-1)for(;f!==void 0;)o=dJ(o,f.close,f.open),f=f.parent;let t=o.indexOf(` +`);return t!==-1&&(o=pJ(o,E,p,t)),p+o+E},i3,VR=(i,...o)=>{let[f]=o;if(!M4(f)||!M4(f.raw))return o.join(" ");let p=o.slice(1),E=[f.raw[0]];for(let t=1;t{"use strict";var mJ=Lg&&Lg.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(Lg,"__esModule",{value:!0});var Fg=mJ(u3()),yJ=/^(rgb|hsl|hsv|hwb)\(\s?(\d+),\s?(\d+),\s?(\d+)\s?\)$/,gJ=/^(ansi|ansi256)\(\s?(\d+)\s?\)$/,b4=(i,o)=>o==="foreground"?i:"bg"+i[0].toUpperCase()+i.slice(1);Lg.default=(i,o,f)=>{if(!o)return i;if(o in Fg.default){let E=b4(o,f);return Fg.default[E](i)}if(o.startsWith("#")){let E=b4("hex",f);return Fg.default[E](o)(i)}if(o.startsWith("ansi")){let E=gJ.exec(o);if(!E)return i;let t=b4(E[1],f),k=Number(E[2]);return Fg.default[t](k)(i)}if(o.startsWith("rgb")||o.startsWith("hsl")||o.startsWith("hsv")||o.startsWith("hwb")){let E=yJ.exec(o);if(!E)return i;let t=b4(E[1],f),k=Number(E[2]),L=Number(E[3]),N=Number(E[4]);return Fg.default[t](k,L,N)(i)}return i}});var XR=ce(bg=>{"use strict";var KR=bg&&bg.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(bg,"__esModule",{value:!0});var _J=KR(RR()),l3=KR(o3());bg.default=(i,o,f,p)=>{if(typeof f.style.borderStyle=="string"){let E=f.yogaNode.getComputedWidth(),t=f.yogaNode.getComputedHeight(),k=f.style.borderColor,L=_J.default[f.style.borderStyle],N=l3.default(L.topLeft+L.horizontal.repeat(E-2)+L.topRight,k,"foreground"),C=(l3.default(L.vertical,k,"foreground")+` +`).repeat(t-2),U=l3.default(L.bottomLeft+L.horizontal.repeat(E-2)+L.bottomRight,k,"foreground");p.write(i,o,N,{transformers:[]}),p.write(i,o+1,C,{transformers:[]}),p.write(i+E-1,o+1,C,{transformers:[]}),p.write(i,o+t-1,U,{transformers:[]})}}});var JR=ce(Pg=>{"use strict";var ih=Pg&&Pg.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(Pg,"__esModule",{value:!0});var EJ=ih(eh()),DJ=ih(Dw()),wJ=ih(SR()),SJ=ih(kw()),TJ=ih(TR()),CJ=ih(Nw()),xJ=ih(XR()),AJ=(i,o)=>{var f;let p=(f=i.childNodes[0])===null||f===void 0?void 0:f.yogaNode;if(p){let E=p.getComputedLeft(),t=p.getComputedTop();o=` +`.repeat(t)+wJ.default(o,E)}return o},QR=(i,o,f)=>{var p;let{offsetX:E=0,offsetY:t=0,transformers:k=[],skipStaticElements:L}=f;if(L&&i.internal_static)return;let{yogaNode:N}=i;if(N){if(N.getDisplay()===EJ.default.DISPLAY_NONE)return;let C=E+N.getComputedLeft(),U=t+N.getComputedTop(),q=k;if(typeof i.internal_transform=="function"&&(q=[i.internal_transform,...k]),i.nodeName==="ink-text"){let W=CJ.default(i);if(W.length>0){let ne=DJ.default(W),m=TJ.default(N);if(ne>m){let we=(p=i.style.textWrap)!==null&&p!==void 0?p:"wrap";W=SJ.default(W,m,we)}W=AJ(i,W),o.write(C,U,W,{transformers:q})}return}if(i.nodeName==="ink-box"&&xJ.default(C,U,i,o),i.nodeName==="ink-root"||i.nodeName==="ink-box")for(let W of i.childNodes)QR(W,o,{offsetX:C,offsetY:U,transformers:q,skipStaticElements:L})}};Pg.default=QR});var $R=ce((Ure,ZR)=>{"use strict";ZR.exports=i=>{i=Object.assign({onlyFirst:!1},i);let o=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(o,i.onlyFirst?void 0:"g")}});var t7=ce((jre,s3)=>{"use strict";var RJ=$R(),e7=i=>typeof i=="string"?i.replace(RJ(),""):i;s3.exports=e7;s3.exports.default=e7});var i7=ce((zre,n7)=>{"use strict";var r7="[\uD800-\uDBFF][\uDC00-\uDFFF]";n7.exports=i=>i&&i.exact?new RegExp(`^${r7}$`):new RegExp(r7,"g")});var o7=ce((qre,a3)=>{"use strict";var OJ=t7(),kJ=i7(),u7=i=>OJ(i).replace(kJ()," ").length;a3.exports=u7;a3.exports.default=u7});var f7=ce(Ig=>{"use strict";var l7=Ig&&Ig.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(Ig,"__esModule",{value:!0});var s7=l7(Rw()),MJ=l7(o7()),a7=class{constructor(o){this.writes=[];let{width:f,height:p}=o;this.width=f,this.height=p}write(o,f,p,E){let{transformers:t}=E;!p||this.writes.push({x:o,y:f,text:p,transformers:t})}get(){let o=[];for(let p=0;pp.trimRight()).join(` +`),height:o.length}}};Ig.default=a7});var p7=ce(Bg=>{"use strict";var f3=Bg&&Bg.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(Bg,"__esModule",{value:!0});var NJ=f3(eh()),c7=f3(JR()),d7=f3(f7());Bg.default=(i,o)=>{var f;if(i.yogaNode.setWidth(o),i.yogaNode){i.yogaNode.calculateLayout(void 0,void 0,NJ.default.DIRECTION_LTR);let p=new d7.default({width:i.yogaNode.getComputedWidth(),height:i.yogaNode.getComputedHeight()});c7.default(i,p,{skipStaticElements:!0});let E;((f=i.staticNode)===null||f===void 0?void 0:f.yogaNode)&&(E=new d7.default({width:i.staticNode.yogaNode.getComputedWidth(),height:i.staticNode.yogaNode.getComputedHeight()}),c7.default(i.staticNode,E,{skipStaticElements:!1}));let{output:t,height:k}=p.get();return{output:t,outputHeight:k,staticOutput:E?`${E.get().output} +`:""}}return{output:"",outputHeight:0,staticOutput:""}}});var y7=ce((Vre,h7)=>{"use strict";var v7=require("stream"),m7=["assert","count","countReset","debug","dir","dirxml","error","group","groupCollapsed","groupEnd","info","log","table","time","timeEnd","timeLog","trace","warn"],c3={},LJ=i=>{let o=new v7.PassThrough,f=new v7.PassThrough;o.write=E=>i("stdout",E),f.write=E=>i("stderr",E);let p=new console.Console(o,f);for(let E of m7)c3[E]=console[E],console[E]=p[E];return()=>{for(let E of m7)console[E]=c3[E];c3={}}};h7.exports=LJ});var p3=ce(d3=>{"use strict";Object.defineProperty(d3,"__esModule",{value:!0});d3.default=new WeakMap});var v3=ce(h3=>{"use strict";Object.defineProperty(h3,"__esModule",{value:!0});var FJ=su(),g7=FJ.createContext({exit:()=>{}});g7.displayName="InternalAppContext";h3.default=g7});var y3=ce(m3=>{"use strict";Object.defineProperty(m3,"__esModule",{value:!0});var bJ=su(),_7=bJ.createContext({stdin:void 0,setRawMode:()=>{},isRawModeSupported:!1,internal_exitOnCtrlC:!0});_7.displayName="InternalStdinContext";m3.default=_7});var _3=ce(g3=>{"use strict";Object.defineProperty(g3,"__esModule",{value:!0});var PJ=su(),E7=PJ.createContext({stdout:void 0,write:()=>{}});E7.displayName="InternalStdoutContext";g3.default=E7});var D3=ce(E3=>{"use strict";Object.defineProperty(E3,"__esModule",{value:!0});var IJ=su(),D7=IJ.createContext({stderr:void 0,write:()=>{}});D7.displayName="InternalStderrContext";E3.default=D7});var P4=ce(w3=>{"use strict";Object.defineProperty(w3,"__esModule",{value:!0});var BJ=su(),w7=BJ.createContext({activeId:void 0,add:()=>{},remove:()=>{},activate:()=>{},deactivate:()=>{},enableFocus:()=>{},disableFocus:()=>{},focusNext:()=>{},focusPrevious:()=>{}});w7.displayName="InternalFocusContext";w3.default=w7});var T7=ce((Zre,S7)=>{"use strict";var UJ=/[|\\{}()[\]^$+*?.-]/g;S7.exports=i=>{if(typeof i!="string")throw new TypeError("Expected a string");return i.replace(UJ,"\\$&")}});var R7=ce(($re,C7)=>{"use strict";var jJ=T7(),x7=[].concat(require("module").builtinModules,"bootstrap_node","node").map(i=>new RegExp(`(?:\\(${i}\\.js:\\d+:\\d+\\)$|^\\s*at ${i}\\.js:\\d+:\\d+$)`));x7.push(/\(internal\/[^:]+:\d+:\d+\)$/,/\s*at internal\/[^:]+:\d+:\d+$/,/\/\.node-spawn-wrap-\w+-\w+\/node:\d+:\d+\)?$/);var I4=class{constructor(o){o=E0({ignoredPackages:[]},o),"internals"in o||(o.internals=I4.nodeInternals()),"cwd"in o||(o.cwd=process.cwd()),this._cwd=o.cwd.replace(/\\/g,"/"),this._internals=[].concat(o.internals,zJ(o.ignoredPackages)),this._wrapCallSite=o.wrapCallSite||!1}static nodeInternals(){return[...x7]}clean(o,f=0){f=" ".repeat(f),Array.isArray(o)||(o=o.split(` +`)),!/^\s*at /.test(o[0])&&/^\s*at /.test(o[1])&&(o=o.slice(1));let p=!1,E=null,t=[];return o.forEach(k=>{if(k=k.replace(/\\/g,"/"),this._internals.some(N=>N.test(k)))return;let L=/^\s*at /.test(k);p?k=k.trimEnd().replace(/^(\s+)at /,"$1"):(k=k.trim(),L&&(k=k.slice(3))),k=k.replace(`${this._cwd}/`,""),k&&(L?(E&&(t.push(E),E=null),t.push(k)):(p=!0,E=k))}),t.map(k=>`${f}${k} +`).join("")}captureString(o,f=this.captureString){typeof o=="function"&&(f=o,o=Infinity);let{stackTraceLimit:p}=Error;o&&(Error.stackTraceLimit=o);let E={};Error.captureStackTrace(E,f);let{stack:t}=E;return Error.stackTraceLimit=p,this.clean(t)}capture(o,f=this.capture){typeof o=="function"&&(f=o,o=Infinity);let{prepareStackTrace:p,stackTraceLimit:E}=Error;Error.prepareStackTrace=(L,N)=>this._wrapCallSite?N.map(this._wrapCallSite):N,o&&(Error.stackTraceLimit=o);let t={};Error.captureStackTrace(t,f);let{stack:k}=t;return Object.assign(Error,{prepareStackTrace:p,stackTraceLimit:E}),k}at(o=this.at){let[f]=this.capture(1,o);if(!f)return{};let p={line:f.getLineNumber(),column:f.getColumnNumber()};A7(p,f.getFileName(),this._cwd),f.isConstructor()&&(p.constructor=!0),f.isEval()&&(p.evalOrigin=f.getEvalOrigin()),f.isNative()&&(p.native=!0);let E;try{E=f.getTypeName()}catch(L){}E&&E!=="Object"&&E!=="[object Object]"&&(p.type=E);let t=f.getFunctionName();t&&(p.function=t);let k=f.getMethodName();return k&&t!==k&&(p.method=k),p}parseLine(o){let f=o&&o.match(qJ);if(!f)return null;let p=f[1]==="new",E=f[2],t=f[3],k=f[4],L=Number(f[5]),N=Number(f[6]),C=f[7],U=f[8],q=f[9],W=f[10]==="native",ne=f[11]===")",m,we={};if(U&&(we.line=Number(U)),q&&(we.column=Number(q)),ne&&C){let Se=0;for(let he=C.length-1;he>0;he--)if(C.charAt(he)===")")Se++;else if(C.charAt(he)==="("&&C.charAt(he-1)===" "&&(Se--,Se===-1&&C.charAt(he-1)===" ")){let ge=C.slice(0,he-1);C=C.slice(he+1),E+=` (${ge}`;break}}if(E){let Se=E.match(HJ);Se&&(E=Se[1],m=Se[2])}return A7(we,C,this._cwd),p&&(we.constructor=!0),t&&(we.evalOrigin=t,we.evalLine=L,we.evalColumn=N,we.evalFile=k&&k.replace(/\\/g,"/")),W&&(we.native=!0),E&&(we.function=E),m&&E!==m&&(we.method=m),we}};function A7(i,o,f){o&&(o=o.replace(/\\/g,"/"),o.startsWith(`${f}/`)&&(o=o.slice(f.length+1)),i.file=o)}function zJ(i){if(i.length===0)return[];let o=i.map(f=>jJ(f));return new RegExp(`[/\\\\]node_modules[/\\\\](?:${o.join("|")})[/\\\\][^:]+:\\d+:\\d+`)}var qJ=new RegExp("^(?:\\s*at )?(?:(new) )?(?:(.*?) \\()?(?:eval at ([^ ]+) \\((.+?):(\\d+):(\\d+)\\), )?(?:(.+?):(\\d+):(\\d+)|(native))(\\)?)$"),HJ=/^(.*?) \[as (.*?)\]$/;C7.exports=I4});var k7=ce((eie,O7)=>{"use strict";O7.exports=(i,o)=>i.replace(/^\t+/gm,f=>" ".repeat(f.length*(o||2)))});var N7=ce((tie,M7)=>{"use strict";var WJ=k7(),VJ=(i,o)=>{let f=[],p=i-o,E=i+o;for(let t=p;t<=E;t++)f.push(t);return f};M7.exports=(i,o,f)=>{if(typeof i!="string")throw new TypeError("Source code is missing.");if(!o||o<1)throw new TypeError("Line number must start from `1`.");if(i=WJ(i).split(/\r?\n/),!(o>i.length))return f=E0({around:3},f),VJ(o,f.around).filter(p=>i[p-1]!==void 0).map(p=>({line:p,value:i[p-1]}))}});var B4=ce(Zf=>{"use strict";var GJ=Zf&&Zf.__createBinding||(Object.create?function(i,o,f,p){p===void 0&&(p=f),Object.defineProperty(i,p,{enumerable:!0,get:function(){return o[f]}})}:function(i,o,f,p){p===void 0&&(p=f),i[p]=o[f]}),YJ=Zf&&Zf.__setModuleDefault||(Object.create?function(i,o){Object.defineProperty(i,"default",{enumerable:!0,value:o})}:function(i,o){i.default=o}),KJ=Zf&&Zf.__importStar||function(i){if(i&&i.__esModule)return i;var o={};if(i!=null)for(var f in i)f!=="default"&&Object.hasOwnProperty.call(i,f)&&GJ(o,i,f);return YJ(o,i),o},XJ=Zf&&Zf.__rest||function(i,o){var f={};for(var p in i)Object.prototype.hasOwnProperty.call(i,p)&&o.indexOf(p)<0&&(f[p]=i[p]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var E=0,p=Object.getOwnPropertySymbols(i);E{var{children:f}=i,p=XJ(i,["children"]);let E=Object.assign(Object.assign({},p),{marginLeft:p.marginLeft||p.marginX||p.margin||0,marginRight:p.marginRight||p.marginX||p.margin||0,marginTop:p.marginTop||p.marginY||p.margin||0,marginBottom:p.marginBottom||p.marginY||p.margin||0,paddingLeft:p.paddingLeft||p.paddingX||p.padding||0,paddingRight:p.paddingRight||p.paddingX||p.padding||0,paddingTop:p.paddingTop||p.paddingY||p.padding||0,paddingBottom:p.paddingBottom||p.paddingY||p.padding||0});return L7.default.createElement("ink-box",{ref:o,style:E},f)});S3.displayName="Box";S3.defaultProps={flexDirection:"row",flexGrow:0,flexShrink:1};Zf.default=S3});var x3=ce(Ug=>{"use strict";var T3=Ug&&Ug.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(Ug,"__esModule",{value:!0});var QJ=T3(su()),dm=T3(u3()),F7=T3(o3()),C3=({color:i,backgroundColor:o,dimColor:f,bold:p,italic:E,underline:t,strikethrough:k,inverse:L,wrap:N,children:C})=>{if(C==null)return null;let U=q=>(f&&(q=dm.default.dim(q)),i&&(q=F7.default(q,i,"foreground")),o&&(q=F7.default(q,o,"background")),p&&(q=dm.default.bold(q)),E&&(q=dm.default.italic(q)),t&&(q=dm.default.underline(q)),k&&(q=dm.default.strikethrough(q)),L&&(q=dm.default.inverse(q)),q);return QJ.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row",textWrap:N},internal_transform:U},C)};C3.displayName="Text";C3.defaultProps={dimColor:!1,bold:!1,italic:!1,underline:!1,strikethrough:!1,wrap:"wrap"};Ug.default=C3});var B7=ce($f=>{"use strict";var JJ=$f&&$f.__createBinding||(Object.create?function(i,o,f,p){p===void 0&&(p=f),Object.defineProperty(i,p,{enumerable:!0,get:function(){return o[f]}})}:function(i,o,f,p){p===void 0&&(p=f),i[p]=o[f]}),ZJ=$f&&$f.__setModuleDefault||(Object.create?function(i,o){Object.defineProperty(i,"default",{enumerable:!0,value:o})}:function(i,o){i.default=o}),$J=$f&&$f.__importStar||function(i){if(i&&i.__esModule)return i;var o={};if(i!=null)for(var f in i)f!=="default"&&Object.hasOwnProperty.call(i,f)&&JJ(o,i,f);return ZJ(o,i),o},jg=$f&&$f.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty($f,"__esModule",{value:!0});var b7=$J(require("fs")),Vo=jg(su()),P7=jg(R7()),eZ=jg(N7()),Q1=jg(B4()),Ic=jg(x3()),I7=new P7.default({cwd:process.cwd(),internals:P7.default.nodeInternals()}),tZ=({error:i})=>{let o=i.stack?i.stack.split(` +`).slice(1):void 0,f=o?I7.parseLine(o[0]):void 0,p,E=0;if((f==null?void 0:f.file)&&(f==null?void 0:f.line)&&b7.existsSync(f.file)){let t=b7.readFileSync(f.file,"utf8");if(p=eZ.default(t,f.line),p)for(let{line:k}of p)E=Math.max(E,String(k).length)}return Vo.default.createElement(Q1.default,{flexDirection:"column",padding:1},Vo.default.createElement(Q1.default,null,Vo.default.createElement(Ic.default,{backgroundColor:"red",color:"white"}," ","ERROR"," "),Vo.default.createElement(Ic.default,null," ",i.message)),f&&Vo.default.createElement(Q1.default,{marginTop:1},Vo.default.createElement(Ic.default,{dimColor:!0},f.file,":",f.line,":",f.column)),f&&p&&Vo.default.createElement(Q1.default,{marginTop:1,flexDirection:"column"},p.map(({line:t,value:k})=>Vo.default.createElement(Q1.default,{key:t},Vo.default.createElement(Q1.default,{width:E+1},Vo.default.createElement(Ic.default,{dimColor:t!==f.line,backgroundColor:t===f.line?"red":void 0,color:t===f.line?"white":void 0},String(t).padStart(E," "),":")),Vo.default.createElement(Ic.default,{key:t,backgroundColor:t===f.line?"red":void 0,color:t===f.line?"white":void 0}," "+k)))),i.stack&&Vo.default.createElement(Q1.default,{marginTop:1,flexDirection:"column"},i.stack.split(` +`).slice(1).map(t=>{let k=I7.parseLine(t);return k?Vo.default.createElement(Q1.default,{key:t},Vo.default.createElement(Ic.default,{dimColor:!0},"- "),Vo.default.createElement(Ic.default,{dimColor:!0,bold:!0},k.function),Vo.default.createElement(Ic.default,{dimColor:!0,color:"gray"}," ","(",k.file,":",k.line,":",k.column,")")):Vo.default.createElement(Q1.default,{key:t},Vo.default.createElement(Ic.default,{dimColor:!0},"- "),Vo.default.createElement(Ic.default,{dimColor:!0,bold:!0},t))})))};$f.default=tZ});var j7=ce(ec=>{"use strict";var nZ=ec&&ec.__createBinding||(Object.create?function(i,o,f,p){p===void 0&&(p=f),Object.defineProperty(i,p,{enumerable:!0,get:function(){return o[f]}})}:function(i,o,f,p){p===void 0&&(p=f),i[p]=o[f]}),rZ=ec&&ec.__setModuleDefault||(Object.create?function(i,o){Object.defineProperty(i,"default",{enumerable:!0,value:o})}:function(i,o){i.default=o}),iZ=ec&&ec.__importStar||function(i){if(i&&i.__esModule)return i;var o={};if(i!=null)for(var f in i)f!=="default"&&Object.hasOwnProperty.call(i,f)&&nZ(o,i,f);return rZ(o,i),o},uh=ec&&ec.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(ec,"__esModule",{value:!0});var oh=iZ(su()),U7=uh(ZD()),uZ=uh(v3()),oZ=uh(y3()),lZ=uh(_3()),sZ=uh(D3()),aZ=uh(P4()),fZ=uh(B7()),cZ=" ",dZ="",pZ="",A3=class extends oh.PureComponent{constructor(){super(...arguments);this.state={isFocusEnabled:!0,activeFocusId:void 0,focusables:[],error:void 0},this.rawModeEnabledCount=0,this.handleSetRawMode=o=>{let{stdin:f}=this.props;if(!this.isRawModeSupported())throw f===process.stdin?new Error(`Raw mode is not supported on the current process.stdin, which Ink uses as input stream by default. +Read about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`):new Error(`Raw mode is not supported on the stdin provided to Ink. +Read about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`);if(f.setEncoding("utf8"),o){this.rawModeEnabledCount===0&&(f.addListener("data",this.handleInput),f.resume(),f.setRawMode(!0)),this.rawModeEnabledCount++;return}--this.rawModeEnabledCount==0&&(f.setRawMode(!1),f.removeListener("data",this.handleInput),f.pause())},this.handleInput=o=>{o===""&&this.props.exitOnCtrlC&&this.handleExit(),o===pZ&&this.state.activeFocusId&&this.setState({activeFocusId:void 0}),this.state.isFocusEnabled&&this.state.focusables.length>0&&(o===cZ&&this.focusNext(),o===dZ&&this.focusPrevious())},this.handleExit=o=>{this.isRawModeSupported()&&this.handleSetRawMode(!1),this.props.onExit(o)},this.enableFocus=()=>{this.setState({isFocusEnabled:!0})},this.disableFocus=()=>{this.setState({isFocusEnabled:!1})},this.focusNext=()=>{this.setState(o=>{let f=o.focusables[0].id;return{activeFocusId:this.findNextFocusable(o)||f}})},this.focusPrevious=()=>{this.setState(o=>{let f=o.focusables[o.focusables.length-1].id;return{activeFocusId:this.findPreviousFocusable(o)||f}})},this.addFocusable=(o,{autoFocus:f})=>{this.setState(p=>{let E=p.activeFocusId;return!E&&f&&(E=o),{activeFocusId:E,focusables:[...p.focusables,{id:o,isActive:!0}]}})},this.removeFocusable=o=>{this.setState(f=>({activeFocusId:f.activeFocusId===o?void 0:f.activeFocusId,focusables:f.focusables.filter(p=>p.id!==o)}))},this.activateFocusable=o=>{this.setState(f=>({focusables:f.focusables.map(p=>p.id!==o?p:{id:o,isActive:!0})}))},this.deactivateFocusable=o=>{this.setState(f=>({activeFocusId:f.activeFocusId===o?void 0:f.activeFocusId,focusables:f.focusables.map(p=>p.id!==o?p:{id:o,isActive:!1})}))},this.findNextFocusable=o=>{let f=o.focusables.findIndex(p=>p.id===o.activeFocusId);for(let p=f+1;p{let f=o.focusables.findIndex(p=>p.id===o.activeFocusId);for(let p=f-1;p>=0;p--)if(o.focusables[p].isActive)return o.focusables[p].id}}static getDerivedStateFromError(o){return{error:o}}isRawModeSupported(){return this.props.stdin.isTTY}render(){return oh.default.createElement(uZ.default.Provider,{value:{exit:this.handleExit}},oh.default.createElement(oZ.default.Provider,{value:{stdin:this.props.stdin,setRawMode:this.handleSetRawMode,isRawModeSupported:this.isRawModeSupported(),internal_exitOnCtrlC:this.props.exitOnCtrlC}},oh.default.createElement(lZ.default.Provider,{value:{stdout:this.props.stdout,write:this.props.writeToStdout}},oh.default.createElement(sZ.default.Provider,{value:{stderr:this.props.stderr,write:this.props.writeToStderr}},oh.default.createElement(aZ.default.Provider,{value:{activeId:this.state.activeFocusId,add:this.addFocusable,remove:this.removeFocusable,activate:this.activateFocusable,deactivate:this.deactivateFocusable,enableFocus:this.enableFocus,disableFocus:this.disableFocus,focusNext:this.focusNext,focusPrevious:this.focusPrevious}},this.state.error?oh.default.createElement(fZ.default,{error:this.state.error}):this.props.children)))))}componentDidMount(){U7.default.hide(this.props.stdout)}componentWillUnmount(){U7.default.show(this.props.stdout),this.isRawModeSupported()&&this.handleSetRawMode(!1)}componentDidCatch(o){this.handleExit(o)}};ec.default=A3;A3.displayName="InternalApp"});var W7=ce(tc=>{"use strict";var hZ=tc&&tc.__createBinding||(Object.create?function(i,o,f,p){p===void 0&&(p=f),Object.defineProperty(i,p,{enumerable:!0,get:function(){return o[f]}})}:function(i,o,f,p){p===void 0&&(p=f),i[p]=o[f]}),vZ=tc&&tc.__setModuleDefault||(Object.create?function(i,o){Object.defineProperty(i,"default",{enumerable:!0,value:o})}:function(i,o){i.default=o}),mZ=tc&&tc.__importStar||function(i){if(i&&i.__esModule)return i;var o={};if(i!=null)for(var f in i)f!=="default"&&Object.hasOwnProperty.call(i,f)&&hZ(o,i,f);return vZ(o,i),o},nc=tc&&tc.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(tc,"__esModule",{value:!0});var yZ=nc(su()),z7=B5(),gZ=nc(Z5()),_Z=nc(GD()),EZ=nc(u9()),DZ=nc(l9()),U4=nc(DR()),wZ=nc(p7()),SZ=nc(JD()),TZ=nc(y7()),CZ=mZ(Lw()),xZ=nc(p3()),AZ=nc(j7()),pm=process.env.CI==="false"?!1:EZ.default,q7=()=>{},H7=class{constructor(o){this.resolveExitPromise=()=>{},this.rejectExitPromise=()=>{},this.unsubscribeExit=()=>{},this.onRender=()=>{if(this.isUnmounted)return;let{output:f,outputHeight:p,staticOutput:E}=wZ.default(this.rootNode,this.options.stdout.columns||80),t=E&&E!==` +`;if(this.options.debug){t&&(this.fullStaticOutput+=E),this.options.stdout.write(this.fullStaticOutput+f);return}if(pm){t&&this.options.stdout.write(E),this.lastOutput=f;return}if(t&&(this.fullStaticOutput+=E),p>=this.options.stdout.rows){this.options.stdout.write(_Z.default.clearTerminal+this.fullStaticOutput+f),this.lastOutput=f;return}t&&(this.log.clear(),this.options.stdout.write(E),this.log(f)),!t&&f!==this.lastOutput&&this.throttledLog(f),this.lastOutput=f},DZ.default(this),this.options=o,this.rootNode=CZ.createNode("ink-root"),this.rootNode.onRender=o.debug?this.onRender:z7.throttle(this.onRender,32,{leading:!0,trailing:!0}),this.rootNode.onImmediateRender=this.onRender,this.log=gZ.default.create(o.stdout),this.throttledLog=o.debug?this.log:z7.throttle(this.log,void 0,{leading:!0,trailing:!0}),this.isUnmounted=!1,this.lastOutput="",this.fullStaticOutput="",this.container=U4.default.createContainer(this.rootNode,!1,!1),this.unsubscribeExit=SZ.default(this.unmount,{alwaysLast:!1}),process.env.DEV==="true"&&U4.default.injectIntoDevTools({bundleType:0,version:"16.13.1",rendererPackageName:"ink"}),o.patchConsole&&this.patchConsole(),pm||(o.stdout.on("resize",this.onRender),this.unsubscribeResize=()=>{o.stdout.off("resize",this.onRender)})}render(o){let f=yZ.default.createElement(AZ.default,{stdin:this.options.stdin,stdout:this.options.stdout,stderr:this.options.stderr,writeToStdout:this.writeToStdout,writeToStderr:this.writeToStderr,exitOnCtrlC:this.options.exitOnCtrlC,onExit:this.unmount},o);U4.default.updateContainer(f,this.container,null,q7)}writeToStdout(o){if(!this.isUnmounted){if(this.options.debug){this.options.stdout.write(o+this.fullStaticOutput+this.lastOutput);return}if(pm){this.options.stdout.write(o);return}this.log.clear(),this.options.stdout.write(o),this.log(this.lastOutput)}}writeToStderr(o){if(!this.isUnmounted){if(this.options.debug){this.options.stderr.write(o),this.options.stdout.write(this.fullStaticOutput+this.lastOutput);return}if(pm){this.options.stderr.write(o);return}this.log.clear(),this.options.stderr.write(o),this.log(this.lastOutput)}}unmount(o){this.isUnmounted||(this.onRender(),this.unsubscribeExit(),typeof this.restoreConsole=="function"&&this.restoreConsole(),typeof this.unsubscribeResize=="function"&&this.unsubscribeResize(),pm?this.options.stdout.write(this.lastOutput+` +`):this.options.debug||this.log.done(),this.isUnmounted=!0,U4.default.updateContainer(null,this.container,null,q7),xZ.default.delete(this.options.stdout),o instanceof Error?this.rejectExitPromise(o):this.resolveExitPromise())}waitUntilExit(){return this.exitPromise||(this.exitPromise=new Promise((o,f)=>{this.resolveExitPromise=o,this.rejectExitPromise=f})),this.exitPromise}clear(){!pm&&!this.options.debug&&this.log.clear()}patchConsole(){this.options.debug||(this.restoreConsole=TZ.default((o,f)=>{o==="stdout"&&this.writeToStdout(f),o==="stderr"&&(f.startsWith("The above error occurred")||this.writeToStderr(f))}))}};tc.default=H7});var G7=ce(zg=>{"use strict";var V7=zg&&zg.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(zg,"__esModule",{value:!0});var RZ=V7(W7()),j4=V7(p3()),OZ=require("stream"),NZ=(i,o)=>{let f=Object.assign({stdout:process.stdout,stdin:process.stdin,stderr:process.stderr,debug:!1,exitOnCtrlC:!0,patchConsole:!0},kZ(o)),p=MZ(f.stdout,()=>new RZ.default(f));return p.render(i),{rerender:p.render,unmount:()=>p.unmount(),waitUntilExit:p.waitUntilExit,cleanup:()=>j4.default.delete(f.stdout),clear:p.clear}};zg.default=NZ;var kZ=(i={})=>i instanceof OZ.Stream?{stdout:i,stdin:process.stdin}:i,MZ=(i,o)=>{let f;return j4.default.has(i)?f=j4.default.get(i):(f=o(),j4.default.set(i,f)),f}});var K7=ce(J1=>{"use strict";var LZ=J1&&J1.__createBinding||(Object.create?function(i,o,f,p){p===void 0&&(p=f),Object.defineProperty(i,p,{enumerable:!0,get:function(){return o[f]}})}:function(i,o,f,p){p===void 0&&(p=f),i[p]=o[f]}),FZ=J1&&J1.__setModuleDefault||(Object.create?function(i,o){Object.defineProperty(i,"default",{enumerable:!0,value:o})}:function(i,o){i.default=o}),bZ=J1&&J1.__importStar||function(i){if(i&&i.__esModule)return i;var o={};if(i!=null)for(var f in i)f!=="default"&&Object.hasOwnProperty.call(i,f)&&LZ(o,i,f);return FZ(o,i),o};Object.defineProperty(J1,"__esModule",{value:!0});var qg=bZ(su()),Y7=i=>{let{items:o,children:f,style:p}=i,[E,t]=qg.useState(0),k=qg.useMemo(()=>o.slice(E),[o,E]);qg.useLayoutEffect(()=>{t(o.length)},[o.length]);let L=k.map((C,U)=>f(C,E+U)),N=qg.useMemo(()=>Object.assign({position:"absolute",flexDirection:"column"},p),[p]);return qg.default.createElement("ink-box",{internal_static:!0,style:N},L)};Y7.displayName="Static";J1.default=Y7});var Q7=ce(Hg=>{"use strict";var PZ=Hg&&Hg.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(Hg,"__esModule",{value:!0});var IZ=PZ(su()),X7=({children:i,transform:o})=>i==null?null:IZ.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row"},internal_transform:o},i);X7.displayName="Transform";Hg.default=X7});var Z7=ce(Wg=>{"use strict";var BZ=Wg&&Wg.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(Wg,"__esModule",{value:!0});var UZ=BZ(su()),J7=({count:i=1})=>UZ.default.createElement("ink-text",null,` +`.repeat(i));J7.displayName="Newline";Wg.default=J7});var tO=ce(Vg=>{"use strict";var $7=Vg&&Vg.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(Vg,"__esModule",{value:!0});var jZ=$7(su()),zZ=$7(B4()),eO=()=>jZ.default.createElement(zZ.default,{flexGrow:1});eO.displayName="Spacer";Vg.default=eO});var z4=ce(Gg=>{"use strict";var qZ=Gg&&Gg.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(Gg,"__esModule",{value:!0});var HZ=su(),WZ=qZ(y3()),VZ=()=>HZ.useContext(WZ.default);Gg.default=VZ});var rO=ce(Yg=>{"use strict";var GZ=Yg&&Yg.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(Yg,"__esModule",{value:!0});var nO=su(),YZ=GZ(z4()),KZ=(i,o={})=>{let{stdin:f,setRawMode:p,internal_exitOnCtrlC:E}=YZ.default();nO.useEffect(()=>{if(o.isActive!==!1)return p(!0),()=>{p(!1)}},[o.isActive,p]),nO.useEffect(()=>{if(o.isActive===!1)return;let t=k=>{let L=String(k),N={upArrow:L==="",downArrow:L==="",leftArrow:L==="",rightArrow:L==="",pageDown:L==="[6~",pageUp:L==="[5~",return:L==="\r",escape:L==="",ctrl:!1,shift:!1,tab:L===" "||L==="",backspace:L==="\b",delete:L==="\x7F"||L==="[3~",meta:!1};L<=""&&!N.return&&(L=String.fromCharCode(L.charCodeAt(0)+"a".charCodeAt(0)-1),N.ctrl=!0),L.startsWith("")&&(L=L.slice(1),N.meta=!0);let C=L>="A"&&L<="Z",U=L>="\u0410"&&L<="\u042F";L.length===1&&(C||U)&&(N.shift=!0),N.tab&&L==="[Z"&&(N.shift=!0),(N.tab||N.backspace||N.delete)&&(L=""),(!(L==="c"&&N.ctrl)||!E)&&i(L,N)};return f==null||f.on("data",t),()=>{f==null||f.off("data",t)}},[o.isActive,f,E,i])};Yg.default=KZ});var iO=ce(Kg=>{"use strict";var XZ=Kg&&Kg.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(Kg,"__esModule",{value:!0});var QZ=su(),JZ=XZ(v3()),ZZ=()=>QZ.useContext(JZ.default);Kg.default=ZZ});var uO=ce(Xg=>{"use strict";var $Z=Xg&&Xg.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(Xg,"__esModule",{value:!0});var e$=su(),t$=$Z(_3()),n$=()=>e$.useContext(t$.default);Xg.default=n$});var oO=ce(Qg=>{"use strict";var r$=Qg&&Qg.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(Qg,"__esModule",{value:!0});var i$=su(),u$=r$(D3()),o$=()=>i$.useContext(u$.default);Qg.default=o$});var sO=ce(Jg=>{"use strict";var lO=Jg&&Jg.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(Jg,"__esModule",{value:!0});var Zg=su(),l$=lO(P4()),s$=lO(z4()),a$=({isActive:i=!0,autoFocus:o=!1}={})=>{let{isRawModeSupported:f,setRawMode:p}=s$.default(),{activeId:E,add:t,remove:k,activate:L,deactivate:N}=Zg.useContext(l$.default),C=Zg.useMemo(()=>Math.random().toString().slice(2,7),[]);return Zg.useEffect(()=>(t(C,{autoFocus:o}),()=>{k(C)}),[C,o]),Zg.useEffect(()=>{i?L(C):N(C)},[i,C]),Zg.useEffect(()=>{if(!(!f||!i))return p(!0),()=>{p(!1)}},[i]),{isFocused:Boolean(C)&&E===C}};Jg.default=a$});var aO=ce($g=>{"use strict";var f$=$g&&$g.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty($g,"__esModule",{value:!0});var c$=su(),d$=f$(P4()),p$=()=>{let i=c$.useContext(d$.default);return{enableFocus:i.enableFocus,disableFocus:i.disableFocus,focusNext:i.focusNext,focusPrevious:i.focusPrevious}};$g.default=p$});var fO=ce(R3=>{"use strict";Object.defineProperty(R3,"__esModule",{value:!0});R3.default=i=>{var o,f,p,E;return{width:(f=(o=i.yogaNode)===null||o===void 0?void 0:o.getComputedWidth())!==null&&f!==void 0?f:0,height:(E=(p=i.yogaNode)===null||p===void 0?void 0:p.getComputedHeight())!==null&&E!==void 0?E:0}}});var lh=ce(ql=>{"use strict";Object.defineProperty(ql,"__esModule",{value:!0});var h$=G7();Object.defineProperty(ql,"render",{enumerable:!0,get:function(){return h$.default}});var v$=B4();Object.defineProperty(ql,"Box",{enumerable:!0,get:function(){return v$.default}});var m$=x3();Object.defineProperty(ql,"Text",{enumerable:!0,get:function(){return m$.default}});var y$=K7();Object.defineProperty(ql,"Static",{enumerable:!0,get:function(){return y$.default}});var g$=Q7();Object.defineProperty(ql,"Transform",{enumerable:!0,get:function(){return g$.default}});var _$=Z7();Object.defineProperty(ql,"Newline",{enumerable:!0,get:function(){return _$.default}});var E$=tO();Object.defineProperty(ql,"Spacer",{enumerable:!0,get:function(){return E$.default}});var D$=rO();Object.defineProperty(ql,"useInput",{enumerable:!0,get:function(){return D$.default}});var w$=iO();Object.defineProperty(ql,"useApp",{enumerable:!0,get:function(){return w$.default}});var S$=z4();Object.defineProperty(ql,"useStdin",{enumerable:!0,get:function(){return S$.default}});var T$=uO();Object.defineProperty(ql,"useStdout",{enumerable:!0,get:function(){return T$.default}});var C$=oO();Object.defineProperty(ql,"useStderr",{enumerable:!0,get:function(){return C$.default}});var x$=sO();Object.defineProperty(ql,"useFocus",{enumerable:!0,get:function(){return x$.default}});var A$=aO();Object.defineProperty(ql,"useFocusManager",{enumerable:!0,get:function(){return A$.default}});var R$=fO();Object.defineProperty(ql,"measureElement",{enumerable:!0,get:function(){return R$.default}})});var k$={};sS(k$,{default:()=>N$,versionUtils:()=>RD});var M3=Mi(require("@yarnpkg/core"));var X_=Mi(require("@yarnpkg/cli")),em=Mi(require("@yarnpkg/core")),Q_=Mi(require("@yarnpkg/core")),cd=Mi(require("clipanion"));var RD={};sS(RD,{Decision:()=>Nu,applyPrerelease:()=>v5,applyReleases:()=>ND,applyStrategy:()=>Y_,clearVersionFiles:()=>OD,fetchBase:()=>pK,fetchChangedFiles:()=>vK,fetchRoot:()=>hK,getUndecidedDependentWorkspaces:()=>Zy,getUndecidedWorkspaces:()=>K_,openVersionFile:()=>$v,requireMoreDecisions:()=>yK,resolveVersionFiles:()=>Jy,suggestStrategy:()=>MD,updateVersionFiles:()=>kD,validateReleaseDecision:()=>Zv});var Gi=Mi(require("@yarnpkg/core")),D0=Mi(require("@yarnpkg/fslib")),W1=Mi(require("@yarnpkg/parsers")),Zp=Mi(require("@yarnpkg/plugin-git")),Jv=Mi(require("clipanion")),h5=Mi(p5()),Fc=Mi(require("semver")),pK=Zp.gitUtils.fetchBase,hK=Zp.gitUtils.fetchRoot,vK=Zp.gitUtils.fetchChangedFiles,mK=/^(>=|[~^]|)(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/,Nu;(function(k){k.UNDECIDED="undecided",k.DECLINE="decline",k.MAJOR="major",k.MINOR="minor",k.PATCH="patch",k.PRERELEASE="prerelease"})(Nu||(Nu={}));function Zv(i){let o=Fc.default.valid(i);return o||Gi.miscUtils.validateEnum((0,h5.default)(Nu,"UNDECIDED"),i)}async function Jy(i,{prerelease:o=null}={}){var t;let f=new Map,p=i.configuration.get("deferredVersionFolder");if(!D0.xfs.existsSync(p))return new Map;let E=await D0.xfs.readdirPromise(p);for(let k of E){if(!k.endsWith(".yml"))continue;let L=D0.ppath.join(p,k),N=await D0.xfs.readFilePromise(L,"utf8"),C=(0,W1.parseSyml)(N);for(let[U,q]of Object.entries(C.releases||{})){if(q===Nu.DECLINE)continue;let W=Gi.structUtils.parseIdent(U),ne=i.tryWorkspaceByIdent(W);if(ne===null)throw new Error(`Assertion failed: Expected a release definition file to only reference existing workspaces (${D0.ppath.basename(L)} references ${U})`);if(ne.manifest.version===null)throw new Error(`Assertion failed: Expected the workspace to have a version (${Gi.structUtils.prettyLocator(i.configuration,ne.anchoredLocator)})`);let m=(t=ne.manifest.raw.stableVersion)!=null?t:ne.manifest.version,we=f.get(ne),Se=Y_(m,Zv(q));if(Se===null)throw new Error(`Assertion failed: Expected ${m} to support being bumped via strategy ${q}`);let he=typeof we!="undefined"?Fc.default.gt(Se,we)?Se:we:Se;f.set(ne,he)}}return o&&(f=new Map([...f].map(([k,L])=>[k,v5(L,{current:k.manifest.version,prerelease:o})]))),f}async function OD(i){let o=i.configuration.get("deferredVersionFolder");!D0.xfs.existsSync(o)||await D0.xfs.removePromise(o)}async function kD(i){let o=i.configuration.get("deferredVersionFolder");if(!D0.xfs.existsSync(o))return;let f=await D0.xfs.readdirPromise(o);for(let p of f){if(!p.endsWith(".yml"))continue;let E=D0.ppath.join(o,p),t=await D0.xfs.readFilePromise(E,"utf8"),k=(0,W1.parseSyml)(t),L=k==null?void 0:k.releases;if(!!L){for(let N of Object.keys(L)){let C=Gi.structUtils.parseLocator(N);i.tryWorkspaceByLocator(C)===null&&delete k.releases[N]}await D0.xfs.changeFilePromise(E,(0,W1.stringifySyml)(new W1.stringifySyml.PreserveOrdering(k)))}}}async function $v(i,{allowEmpty:o=!1}={}){let f=i.configuration;if(f.projectCwd===null)throw new Jv.UsageError("This command can only be run from within a Yarn project");let p=await Zp.gitUtils.fetchRoot(f.projectCwd),E=p!==null?await Zp.gitUtils.fetchBase(p,{baseRefs:f.get("changesetBaseRefs")}):null,t=p!==null?await Zp.gitUtils.fetchChangedFiles(p,{base:E.hash,project:i}):[],k=f.get("deferredVersionFolder"),L=t.filter(ne=>D0.ppath.contains(k,ne)!==null);if(L.length>1)throw new Jv.UsageError(`Your current branch contains multiple versioning files; this isn't supported: +- ${L.map(ne=>D0.npath.fromPortablePath(ne)).join(` +- `)}`);let N=new Set(Gi.miscUtils.mapAndFilter(t,ne=>{let m=i.tryWorkspaceByFilePath(ne);return m===null?Gi.miscUtils.mapAndFilter.skip:m}));if(L.length===0&&N.size===0&&!o)return null;let C=L.length===1?L[0]:D0.ppath.join(k,`${Gi.hashUtils.makeHash(Math.random().toString()).slice(0,8)}.yml`),U=D0.xfs.existsSync(C)?await D0.xfs.readFilePromise(C,"utf8"):"{}",q=(0,W1.parseSyml)(U),W=new Map;for(let ne of q.declined||[]){let m=Gi.structUtils.parseIdent(ne),we=i.getWorkspaceByIdent(m);W.set(we,Nu.DECLINE)}for(let[ne,m]of Object.entries(q.releases||{})){let we=Gi.structUtils.parseIdent(ne),Se=i.getWorkspaceByIdent(we);W.set(Se,Zv(m))}return{project:i,root:p,baseHash:E!==null?E.hash:null,baseTitle:E!==null?E.title:null,changedFiles:new Set(t),changedWorkspaces:N,releaseRoots:new Set([...N].filter(ne=>ne.manifest.version!==null)),releases:W,async saveAll(){let ne={},m=[],we=[];for(let Se of i.workspaces){if(Se.manifest.version===null)continue;let he=Gi.structUtils.stringifyIdent(Se.locator),ge=W.get(Se);ge===Nu.DECLINE?m.push(he):typeof ge!="undefined"?ne[he]=Zv(ge):N.has(Se)&&we.push(he)}await D0.xfs.mkdirPromise(D0.ppath.dirname(C),{recursive:!0}),await D0.xfs.changeFilePromise(C,(0,W1.stringifySyml)(new W1.stringifySyml.PreserveOrdering({releases:Object.keys(ne).length>0?ne:void 0,declined:m.length>0?m:void 0,undecided:we.length>0?we:void 0})))}}}function yK(i){return K_(i).size>0||Zy(i).length>0}function K_(i){let o=new Set;for(let f of i.changedWorkspaces)f.manifest.version!==null&&(i.releases.has(f)||o.add(f));return o}function Zy(i,{include:o=new Set}={}){let f=[],p=new Map(Gi.miscUtils.mapAndFilter([...i.releases],([t,k])=>k===Nu.DECLINE?Gi.miscUtils.mapAndFilter.skip:[t.anchoredLocator.locatorHash,t])),E=new Map(Gi.miscUtils.mapAndFilter([...i.releases],([t,k])=>k!==Nu.DECLINE?Gi.miscUtils.mapAndFilter.skip:[t.anchoredLocator.locatorHash,t]));for(let t of i.project.workspaces)if(!(!o.has(t)&&(E.has(t.anchoredLocator.locatorHash)||p.has(t.anchoredLocator.locatorHash)))&&t.manifest.version!==null)for(let k of Gi.Manifest.hardDependencies)for(let L of t.manifest.getForScope(k).values()){let N=i.project.tryWorkspaceByDescriptor(L);N!==null&&p.has(N.anchoredLocator.locatorHash)&&f.push([t,N])}return f}function MD(i,o){let f=Fc.default.clean(o);for(let p of Object.values(Nu))if(p!==Nu.UNDECIDED&&p!==Nu.DECLINE&&Fc.default.inc(i,p)===f)return p;return null}function Y_(i,o){if(Fc.default.valid(o))return o;if(i===null)throw new Jv.UsageError(`Cannot apply the release strategy "${o}" unless the workspace already has a valid version`);if(!Fc.default.valid(i))throw new Jv.UsageError(`Cannot apply the release strategy "${o}" on a non-semver version (${i})`);let f=Fc.default.inc(i,o);if(f===null)throw new Jv.UsageError(`Cannot apply the release strategy "${o}" on the specified version (${i})`);return f}function ND(i,o,{report:f}){let p=new Map;for(let E of i.workspaces)for(let t of Gi.Manifest.allDependencies)for(let k of E.manifest[t].values()){let L=i.tryWorkspaceByDescriptor(k);if(L===null||!o.has(L))continue;Gi.miscUtils.getArrayWithDefault(p,L).push([E,t,k.identHash])}for(let[E,t]of o){let k=E.manifest.version;E.manifest.version=t,Fc.default.prerelease(t)===null?delete E.manifest.raw.stableVersion:E.manifest.raw.stableVersion||(E.manifest.raw.stableVersion=k);let L=E.manifest.name!==null?Gi.structUtils.stringifyIdent(E.manifest.name):null;f.reportInfo(Gi.MessageName.UNNAMED,`${Gi.structUtils.prettyLocator(i.configuration,E.anchoredLocator)}: Bumped to ${t}`),f.reportJson({cwd:D0.npath.fromPortablePath(E.cwd),ident:L,oldVersion:k,newVersion:t});let N=p.get(E);if(typeof N!="undefined")for(let[C,U,q]of N){let W=C.manifest[U].get(q);if(typeof W=="undefined")throw new Error("Assertion failed: The dependency should have existed");let ne=W.range,m=!1;if(ne.startsWith(Gi.WorkspaceResolver.protocol)&&(ne=ne.slice(Gi.WorkspaceResolver.protocol.length),m=!0,ne===E.relativeCwd))continue;let we=ne.match(mK);if(!we){f.reportWarning(Gi.MessageName.UNNAMED,`Couldn't auto-upgrade range ${ne} (in ${Gi.structUtils.prettyLocator(i.configuration,C.anchoredLocator)})`);continue}let Se=`${we[1]}${t}`;m&&(Se=`${Gi.WorkspaceResolver.protocol}${Se}`);let he=Gi.structUtils.makeDescriptor(W,Se);C.manifest[U].set(q,he)}}}var gK=new Map([["%n",{extract:i=>i.length>=1?[i[0],i.slice(1)]:null,generate:(i=0)=>`${i+1}`}]]);function v5(i,{current:o,prerelease:f}){let p=new Fc.default.SemVer(o),E=p.prerelease.slice(),t=[];p.prerelease=[],p.format()!==i&&(E.length=0);let k=!0,L=f.split(/\./g);for(let N of L){let C=gK.get(N);if(typeof C=="undefined")t.push(N),E[0]===N?E.shift():k=!1;else{let U=k?C.extract(E):null;U!==null&&typeof U[0]=="number"?(t.push(C.generate(U[0])),E=U[1]):(t.push(C.generate()),k=!1)}}return p.prerelease&&(p.prerelease=[]),`${i}-${t.join(".")}`}var $y=class extends X_.BaseCommand{constructor(){super(...arguments);this.all=cd.Option.Boolean("--all",!1,{description:"Apply the deferred version changes on all workspaces"});this.dryRun=cd.Option.Boolean("--dry-run",!1,{description:"Print the versions without actually generating the package archive"});this.prerelease=cd.Option.String("--prerelease",{description:"Add a prerelease identifier to new versions",tolerateBoolean:!0});this.recursive=cd.Option.Boolean("-R,--recursive",{description:"Release the transitive workspaces as well"});this.json=cd.Option.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let o=await em.Configuration.find(this.context.cwd,this.context.plugins),{project:f,workspace:p}=await Q_.Project.find(o,this.context.cwd),E=await em.Cache.find(o);if(!p)throw new X_.WorkspaceRequiredError(f.cwd,this.context.cwd);return await f.restoreInstallState({restoreResolutions:!1}),(await Q_.StreamReport.start({configuration:o,json:this.json,stdout:this.context.stdout},async k=>{let L=this.prerelease?typeof this.prerelease!="boolean"?this.prerelease:"rc.%n":null,N=await Jy(f,{prerelease:L}),C=new Map;if(this.all)C=N;else{let U=this.recursive?p.getRecursiveWorkspaceDependencies():[p];for(let q of U){let W=N.get(q);typeof W!="undefined"&&C.set(q,W)}}if(C.size===0){let U=N.size>0?" Did you want to add --all?":"";k.reportWarning(em.MessageName.UNNAMED,`The current workspace doesn't seem to require a version bump.${U}`);return}ND(f,C,{report:k}),this.dryRun||(L||(this.all?await OD(f):await kD(f)),k.reportSeparator(),await f.install({cache:E,report:k}))})).exitCode()}};$y.paths=[["version","apply"]],$y.usage=cd.Command.Usage({category:"Release-related commands",description:"apply all the deferred version bumps at once",details:` + This command will apply the deferred version changes and remove their definitions from the repository. + + Note that if \`--prerelease\` is set, the given prerelease identifier (by default \`rc.%d\`) will be used on all new versions and the version definitions will be kept as-is. + + By default only the current workspace will be bumped, but you can configure this behavior by using one of: + + - \`--recursive\` to also apply the version bump on its dependencies + - \`--all\` to apply the version bump on all packages in the repository + + Note that this command will also update the \`workspace:\` references across all your local workspaces, thus ensuring that they keep referring to the same workspaces even after the version bump. + `,examples:[["Apply the version change to the local workspace","yarn version apply"],["Apply the version change to all the workspaces in the local workspace","yarn version apply --all"]]});var m5=$y;var e_=Mi(require("@yarnpkg/cli")),s0=Mi(require("@yarnpkg/core")),rc=Mi(require("@yarnpkg/fslib"));var cO=Mi(lh()),sh=Mi(su()),dO=(0,sh.memo)(({active:i})=>{let o=(0,sh.useMemo)(()=>i?"\u25C9":"\u25EF",[i]),f=(0,sh.useMemo)(()=>i?"green":"yellow",[i]);return sh.default.createElement(cO.Text,{color:f},o)});var yd=Mi(lh()),Js=Mi(su());var pO=Mi(lh()),q4=Mi(su());function hm({active:i},o,f){let{stdin:p}=(0,pO.useStdin)(),E=(0,q4.useCallback)((t,k)=>o(t,k),f);(0,q4.useEffect)(()=>{if(!(!i||!p))return p.on("keypress",E),()=>{p.off("keypress",E)}},[i,E,p])}var ah;(function(f){f.BEFORE="before",f.AFTER="after"})(ah||(ah={}));var hO=function({active:i},o,f){hm({active:i},(p,E)=>{E.name==="tab"&&(E.shift?o(ah.BEFORE):o(ah.AFTER))},f)};var H4=function(i,o,{active:f,minus:p,plus:E,set:t,loop:k=!0}){hm({active:f},(L,N)=>{let C=o.indexOf(i);switch(N.name){case p:{let U=C-1;if(k){t(o[(o.length+U)%o.length]);return}if(U<0)return;t(o[U])}break;case E:{let U=C+1;if(k){t(o[U%o.length]);return}if(U>=o.length)return;t(o[U])}break}},[o,i,E,t,k])};var O3=({active:i=!0,children:o=[],radius:f=10,size:p=1,loop:E=!0,onFocusRequest:t,willReachEnd:k})=>{let L=Se=>{if(Se.key===null)throw new Error("Expected all children to have a key");return Se.key},N=Js.default.Children.map(o,Se=>L(Se)),C=N[0],[U,q]=(0,Js.useState)(C),W=N.indexOf(U);(0,Js.useEffect)(()=>{N.includes(U)||q(C)},[o]),(0,Js.useEffect)(()=>{k&&W>=N.length-2&&k()},[W]),hO({active:i&&!!t},Se=>{t==null||t(Se)},[t]),H4(U,N,{active:i,minus:"up",plus:"down",set:q,loop:E});let ne=W-f,m=W+f;m>N.length&&(ne-=m-N.length,m=N.length),ne<0&&(m+=-ne,ne=0),m>=N.length&&(m=N.length-1);let we=[];for(let Se=ne;Se<=m;++Se){let he=N[Se],ge=i&&he===U;we.push(Js.default.createElement(yd.Box,{key:he,height:p},Js.default.createElement(yd.Box,{marginLeft:1,marginRight:1},Js.default.createElement(yd.Text,null,ge?Js.default.createElement(yd.Text,{color:"cyan",bold:!0},">"):" ")),Js.default.createElement(yd.Box,null,Js.default.cloneElement(o[Se],{active:ge}))))}return Js.default.createElement(yd.Box,{flexDirection:"column",width:"100%"},we)};var W4=Mi(lh()),k3=Mi(su());var vO=Mi(lh()),Z1=Mi(su()),mO=Mi(require("readline")),O$=Z1.default.createContext(null),yO=({children:i})=>{let{stdin:o,setRawMode:f}=(0,vO.useStdin)();(0,Z1.useEffect)(()=>{f&&f(!0),o&&(0,mO.emitKeypressEvents)(o)},[o,f]);let[p,E]=(0,Z1.useState)(new Map),t=(0,Z1.useMemo)(()=>({getAll:()=>p,get:k=>p.get(k),set:(k,L)=>E(new Map([...p,[k,L]]))}),[p,E]);return Z1.default.createElement(O$.Provider,{value:t,children:i})};async function gO(i,o,{stdin:f,stdout:p,stderr:E}={}){let t,k=N=>{let{exit:C}=(0,W4.useApp)();hm({active:!0},(U,q)=>{q.name==="return"&&(t=N,C())},[C,N])},{waitUntilExit:L}=(0,W4.render)(k3.default.createElement(yO,null,k3.default.createElement(i,Gf(E0({},o),{useSubmit:k}))),{stdin:f,stdout:p,stderr:E});return await L(),t}var fh=Mi(require("clipanion")),Dr=Mi(lh()),Tn=Mi(su()),V4=Mi(require("semver"));var t_=class extends e_.BaseCommand{constructor(){super(...arguments);this.interactive=fh.Option.Boolean("-i,--interactive",{description:"Open an interactive interface used to set version bumps"})}async execute(){return this.interactive?await this.executeInteractive():await this.executeStandard()}async executeInteractive(){let o=await s0.Configuration.find(this.context.cwd,this.context.plugins),{project:f,workspace:p}=await s0.Project.find(o,this.context.cwd);if(!p)throw new e_.WorkspaceRequiredError(f.cwd,this.context.cwd);await f.restoreInstallState();let E=await $v(f);if(E===null||E.releaseRoots.size===0)return 0;if(E.root===null)throw new fh.UsageError("This command can only be run on Git repositories");let t=()=>Tn.default.createElement(Dr.Box,{flexDirection:"row",paddingBottom:1},Tn.default.createElement(Dr.Box,{flexDirection:"column",width:60},Tn.default.createElement(Dr.Box,null,Tn.default.createElement(Dr.Text,null,"Press ",Tn.default.createElement(Dr.Text,{bold:!0,color:"cyanBright"},""),"/",Tn.default.createElement(Dr.Text,{bold:!0,color:"cyanBright"},"")," to select workspaces.")),Tn.default.createElement(Dr.Box,null,Tn.default.createElement(Dr.Text,null,"Press ",Tn.default.createElement(Dr.Text,{bold:!0,color:"cyanBright"},""),"/",Tn.default.createElement(Dr.Text,{bold:!0,color:"cyanBright"},"")," to select release strategies."))),Tn.default.createElement(Dr.Box,{flexDirection:"column"},Tn.default.createElement(Dr.Box,{marginLeft:1},Tn.default.createElement(Dr.Text,null,"Press ",Tn.default.createElement(Dr.Text,{bold:!0,color:"cyanBright"},"")," to save.")),Tn.default.createElement(Dr.Box,{marginLeft:1},Tn.default.createElement(Dr.Text,null,"Press ",Tn.default.createElement(Dr.Text,{bold:!0,color:"cyanBright"},"")," to abort.")))),k=({workspace:W,active:ne,decision:m,setDecision:we})=>{var ze;let Se=(ze=W.manifest.raw.stableVersion)!=null?ze:W.manifest.version;if(Se===null)throw new Error(`Assertion failed: The version should have been set (${s0.structUtils.prettyLocator(o,W.anchoredLocator)})`);if(V4.default.prerelease(Se)!==null)throw new Error(`Assertion failed: Prerelease identifiers shouldn't be found (${Se})`);let he=[Nu.UNDECIDED,Nu.DECLINE,Nu.PATCH,Nu.MINOR,Nu.MAJOR];H4(m,he,{active:ne,minus:"left",plus:"right",set:we});let ge=m===Nu.UNDECIDED?Tn.default.createElement(Dr.Text,{color:"yellow"},Se):m===Nu.DECLINE?Tn.default.createElement(Dr.Text,{color:"green"},Se):Tn.default.createElement(Dr.Text,null,Tn.default.createElement(Dr.Text,{color:"magenta"},Se)," \u2192 ",Tn.default.createElement(Dr.Text,{color:"green"},V4.default.valid(m)?m:V4.default.inc(Se,m)));return Tn.default.createElement(Dr.Box,{flexDirection:"column"},Tn.default.createElement(Dr.Box,null,Tn.default.createElement(Dr.Text,null,s0.structUtils.prettyLocator(o,W.anchoredLocator)," - ",ge)),Tn.default.createElement(Dr.Box,null,he.map(pe=>Tn.default.createElement(Dr.Box,{key:pe,paddingLeft:2},Tn.default.createElement(Dr.Text,null,Tn.default.createElement(dO,{active:pe===m})," ",pe)))))},L=W=>{let ne=new Set(E.releaseRoots),m=new Map([...W].filter(([we])=>ne.has(we)));for(;;){let we=Zy({project:E.project,releases:m}),Se=!1;if(we.length>0){for(let[he]of we)if(!ne.has(he)){ne.add(he),Se=!0;let ge=W.get(he);typeof ge!="undefined"&&m.set(he,ge)}}if(!Se)break}return{relevantWorkspaces:ne,relevantReleases:m}},N=()=>{let[W,ne]=(0,Tn.useState)(()=>new Map(E.releases)),m=(0,Tn.useCallback)((we,Se)=>{let he=new Map(W);Se!==Nu.UNDECIDED?he.set(we,Se):he.delete(we);let{relevantReleases:ge}=L(he);ne(ge)},[W,ne]);return[W,m]},C=({workspaces:W,releases:ne})=>{let m=[];m.push(`${W.size} total`);let we=0,Se=0;for(let he of W){let ge=ne.get(he);typeof ge=="undefined"?Se+=1:ge!==Nu.DECLINE&&(we+=1)}return m.push(`${we} release${we===1?"":"s"}`),m.push(`${Se} remaining`),Tn.default.createElement(Dr.Text,{color:"yellow"},m.join(", "))},q=await gO(({useSubmit:W})=>{let[ne,m]=N();W(ne);let{relevantWorkspaces:we}=L(ne),Se=new Set([...we].filter(pe=>!E.releaseRoots.has(pe))),[he,ge]=(0,Tn.useState)(0),ze=(0,Tn.useCallback)(pe=>{switch(pe){case ah.BEFORE:ge(he-1);break;case ah.AFTER:ge(he+1);break}},[he,ge]);return Tn.default.createElement(Dr.Box,{flexDirection:"column"},Tn.default.createElement(t,null),Tn.default.createElement(Dr.Box,null,Tn.default.createElement(Dr.Text,{wrap:"wrap"},"The following files have been modified in your local checkout.")),Tn.default.createElement(Dr.Box,{flexDirection:"column",marginTop:1,paddingLeft:2},[...E.changedFiles].map(pe=>Tn.default.createElement(Dr.Box,{key:pe},Tn.default.createElement(Dr.Text,null,Tn.default.createElement(Dr.Text,{color:"grey"},rc.npath.fromPortablePath(E.root)),rc.npath.sep,rc.npath.relative(rc.npath.fromPortablePath(E.root),rc.npath.fromPortablePath(pe)))))),E.releaseRoots.size>0&&Tn.default.createElement(Tn.default.Fragment,null,Tn.default.createElement(Dr.Box,{marginTop:1},Tn.default.createElement(Dr.Text,{wrap:"wrap"},"Because of those files having been modified, the following workspaces may need to be released again (note that private workspaces are also shown here, because even though they won't be published, releasing them will allow us to flag their dependents for potential re-release):")),Se.size>3?Tn.default.createElement(Dr.Box,{marginTop:1},Tn.default.createElement(C,{workspaces:E.releaseRoots,releases:ne})):null,Tn.default.createElement(Dr.Box,{marginTop:1,flexDirection:"column"},Tn.default.createElement(O3,{active:he%2==0,radius:1,size:2,onFocusRequest:ze},[...E.releaseRoots].map(pe=>Tn.default.createElement(k,{key:pe.cwd,workspace:pe,decision:ne.get(pe)||Nu.UNDECIDED,setDecision:Oe=>m(pe,Oe)}))))),Se.size>0?Tn.default.createElement(Tn.default.Fragment,null,Tn.default.createElement(Dr.Box,{marginTop:1},Tn.default.createElement(Dr.Text,{wrap:"wrap"},"The following workspaces depend on other workspaces that have been marked for release, and thus may need to be released as well:")),Tn.default.createElement(Dr.Box,null,Tn.default.createElement(Dr.Text,null,"(Press ",Tn.default.createElement(Dr.Text,{bold:!0,color:"cyanBright"},"")," to move the focus between the workspace groups.)")),Se.size>5?Tn.default.createElement(Dr.Box,{marginTop:1},Tn.default.createElement(C,{workspaces:Se,releases:ne})):null,Tn.default.createElement(Dr.Box,{marginTop:1,flexDirection:"column"},Tn.default.createElement(O3,{active:he%2==1,radius:2,size:2,onFocusRequest:ze},[...Se].map(pe=>Tn.default.createElement(k,{key:pe.cwd,workspace:pe,decision:ne.get(pe)||Nu.UNDECIDED,setDecision:Oe=>m(pe,Oe)}))))):null)},{versionFile:E},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof q=="undefined")return 1;E.releases.clear();for(let[W,ne]of q)E.releases.set(W,ne);await E.saveAll()}async executeStandard(){let o=await s0.Configuration.find(this.context.cwd,this.context.plugins),{project:f,workspace:p}=await s0.Project.find(o,this.context.cwd);if(!p)throw new e_.WorkspaceRequiredError(f.cwd,this.context.cwd);return await f.restoreInstallState(),(await s0.StreamReport.start({configuration:o,stdout:this.context.stdout},async t=>{let k=await $v(f);if(k===null||k.releaseRoots.size===0)return;if(k.root===null)throw new fh.UsageError("This command can only be run on Git repositories");if(t.reportInfo(s0.MessageName.UNNAMED,`Your PR was started right after ${s0.formatUtils.pretty(o,k.baseHash.slice(0,7),"yellow")} ${s0.formatUtils.pretty(o,k.baseTitle,"magenta")}`),k.changedFiles.size>0){t.reportInfo(s0.MessageName.UNNAMED,"You have changed the following files since then:"),t.reportSeparator();for(let q of k.changedFiles)t.reportInfo(null,`${s0.formatUtils.pretty(o,rc.npath.fromPortablePath(k.root),"gray")}${rc.npath.sep}${rc.npath.relative(rc.npath.fromPortablePath(k.root),rc.npath.fromPortablePath(q))}`)}let L=!1,N=!1,C=K_(k);if(C.size>0){L||t.reportSeparator();for(let q of C)t.reportError(s0.MessageName.UNNAMED,`${s0.structUtils.prettyLocator(o,q.anchoredLocator)} has been modified but doesn't have a release strategy attached`);L=!0}let U=Zy(k);for(let[q,W]of U)N||t.reportSeparator(),t.reportError(s0.MessageName.UNNAMED,`${s0.structUtils.prettyLocator(o,q.anchoredLocator)} doesn't have a release strategy attached, but depends on ${s0.structUtils.prettyWorkspace(o,W)} which is planned for release.`),N=!0;(L||N)&&(t.reportSeparator(),t.reportInfo(s0.MessageName.UNNAMED,"This command detected that at least some workspaces have received modifications without explicit instructions as to how they had to be released (if needed)."),t.reportInfo(s0.MessageName.UNNAMED,"To correct these errors, run `yarn version check --interactive` then follow the instructions."))})).exitCode()}};t_.paths=[["version","check"]],t_.usage=fh.Command.Usage({category:"Release-related commands",description:"check that all the relevant packages have been bumped",details:"\n **Warning:** This command currently requires Git.\n\n This command will check that all the packages covered by the files listed in argument have been properly bumped or declined to bump.\n\n In the case of a bump, the check will also cover transitive packages - meaning that should `Foo` be bumped, a package `Bar` depending on `Foo` will require a decision as to whether `Bar` will need to be bumped. This check doesn't cross packages that have declined to bump.\n\n In case no arguments are passed to the function, the list of modified files will be generated by comparing the HEAD against `master`.\n ",examples:[["Check whether the modified packages need a bump","yarn version check"]]});var _O=t_;var G4=Mi(require("@yarnpkg/cli")),Y4=Mi(require("@yarnpkg/core")),Bc=Mi(require("clipanion")),K4=Mi(require("semver"));var n_=class extends G4.BaseCommand{constructor(){super(...arguments);this.deferred=Bc.Option.Boolean("-d,--deferred",{description:"Prepare the version to be bumped during the next release cycle"});this.immediate=Bc.Option.Boolean("-i,--immediate",{description:"Bump the version immediately"});this.strategy=Bc.Option.String()}async execute(){let o=await Y4.Configuration.find(this.context.cwd,this.context.plugins),{project:f,workspace:p}=await Y4.Project.find(o,this.context.cwd);if(!p)throw new G4.WorkspaceRequiredError(f.cwd,this.context.cwd);let E=o.get("preferDeferredVersions");this.deferred&&(E=!0),this.immediate&&(E=!1);let t=K4.default.valid(this.strategy),k=this.strategy===Nu.DECLINE,L;if(t)if(p.manifest.version!==null){let C=MD(p.manifest.version,this.strategy);C!==null?L=C:L=this.strategy}else L=this.strategy;else{let C=p.manifest.version;if(!k){if(C===null)throw new Bc.UsageError("Can't bump the version if there wasn't a version to begin with - use 0.0.0 as initial version then run the command again.");if(typeof C!="string"||!K4.default.valid(C))throw new Bc.UsageError(`Can't bump the version (${C}) if it's not valid semver`)}L=Zv(this.strategy)}if(!E){let U=(await Jy(f)).get(p);if(typeof U!="undefined"&&L!==Nu.DECLINE){let q=Y_(p.manifest.version,L);if(K4.default.lt(q,U))throw new Bc.UsageError(`Can't bump the version to one that would be lower than the current deferred one (${U})`)}}let N=await $v(f,{allowEmpty:!0});return N.releases.set(p,L),await N.saveAll(),E?0:await this.cli.run(["version","apply"])}};n_.paths=[["version"]],n_.usage=Bc.Command.Usage({category:"Release-related commands",description:"apply a new version to the current package",details:"\n This command will bump the version number for the given package, following the specified strategy:\n\n - If `major`, the first number from the semver range will be increased (`X.0.0`).\n - If `minor`, the second number from the semver range will be increased (`0.X.0`).\n - If `patch`, the third number from the semver range will be increased (`0.0.X`).\n - If prefixed by `pre` (`premajor`, ...), a `-0` suffix will be set (`0.0.0-0`).\n - If `prerelease`, the suffix will be increased (`0.0.0-X`); the third number from the semver range will also be increased if there was no suffix in the previous version.\n - If `decline`, the nonce will be increased for `yarn version check` to pass without version bump.\n - If a valid semver range, it will be used as new version.\n - If unspecified, Yarn will ask you for guidance.\n\n For more information about the `--deferred` flag, consult our documentation (https://yarnpkg.com/features/release-workflow#deferred-versioning).\n ",examples:[["Immediately bump the version to the next major","yarn version major"],["Prepare the version to be bumped to the next major","yarn version major --deferred"]]});var EO=n_;var M$={configuration:{deferredVersionFolder:{description:"Folder where are stored the versioning files",type:M3.SettingsType.ABSOLUTE_PATH,default:"./.yarn/versions"},preferDeferredVersions:{description:"If true, running `yarn version` will assume the `--deferred` flag unless `--immediate` is set",type:M3.SettingsType.BOOLEAN,default:!1}},commands:[m5,_O,EO]},N$=M$;return k$;})(); +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ +/** + * @license + * Lodash + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ +/** @license React v0.0.0-experimental-51a3aa6af + * react-debug-tools.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +/** @license React v0.0.0-experimental-51a3aa6af + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +/** @license React v0.0.0-experimental-51a3aa6af + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +/** @license React v0.18.0 + * scheduler-tracing.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +/** @license React v0.18.0 + * scheduler-tracing.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +/** @license React v0.18.0 + * scheduler.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +/** @license React v0.18.0 + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +/** @license React v0.24.0 + * react-reconciler.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +/** @license React v0.24.0 + * react-reconciler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +/** @license React v16.13.1 + * react.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +/** @license React v16.13.1 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +return plugin; +} +}; diff --git a/balpy/balancer-deployments/.yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs b/balpy/balancer-deployments/.yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs new file mode 100644 index 0000000..911cd23 --- /dev/null +++ b/balpy/balancer-deployments/.yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs @@ -0,0 +1,28 @@ +/* eslint-disable */ +//prettier-ignore +module.exports = { +name: "@yarnpkg/plugin-workspace-tools", +factory: function (require) { +var plugin=(()=>{var wr=Object.create,me=Object.defineProperty,Sr=Object.defineProperties,vr=Object.getOwnPropertyDescriptor,Hr=Object.getOwnPropertyDescriptors,$r=Object.getOwnPropertyNames,et=Object.getOwnPropertySymbols,kr=Object.getPrototypeOf,tt=Object.prototype.hasOwnProperty,Tr=Object.prototype.propertyIsEnumerable;var rt=(e,t,r)=>t in e?me(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,B=(e,t)=>{for(var r in t||(t={}))tt.call(t,r)&&rt(e,r,t[r]);if(et)for(var r of et(t))Tr.call(t,r)&&rt(e,r,t[r]);return e},Q=(e,t)=>Sr(e,Hr(t)),Lr=e=>me(e,"__esModule",{value:!0});var K=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Or=(e,t)=>{for(var r in t)me(e,r,{get:t[r],enumerable:!0})},Nr=(e,t,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of $r(t))!tt.call(e,n)&&n!=="default"&&me(e,n,{get:()=>t[n],enumerable:!(r=vr(t,n))||r.enumerable});return e},X=e=>Nr(Lr(me(e!=null?wr(kr(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e);var $e=K(te=>{"use strict";te.isInteger=e=>typeof e=="number"?Number.isInteger(e):typeof e=="string"&&e.trim()!==""?Number.isInteger(Number(e)):!1;te.find=(e,t)=>e.nodes.find(r=>r.type===t);te.exceedsLimit=(e,t,r=1,n)=>n===!1||!te.isInteger(e)||!te.isInteger(t)?!1:(Number(t)-Number(e))/Number(r)>=n;te.escapeNode=(e,t=0,r)=>{let n=e.nodes[t];!n||(r&&n.type===r||n.type==="open"||n.type==="close")&&n.escaped!==!0&&(n.value="\\"+n.value,n.escaped=!0)};te.encloseBrace=e=>e.type!=="brace"?!1:e.commas>>0+e.ranges>>0==0?(e.invalid=!0,!0):!1;te.isInvalidBrace=e=>e.type!=="brace"?!1:e.invalid===!0||e.dollar?!0:e.commas>>0+e.ranges>>0==0||e.open!==!0||e.close!==!0?(e.invalid=!0,!0):!1;te.isOpenOrClose=e=>e.type==="open"||e.type==="close"?!0:e.open===!0||e.close===!0;te.reduce=e=>e.reduce((t,r)=>(r.type==="text"&&t.push(r.value),r.type==="range"&&(r.type="text"),t),[]);te.flatten=(...e)=>{let t=[],r=n=>{for(let s=0;s{"use strict";var it=$e();at.exports=(e,t={})=>{let r=(n,s={})=>{let a=t.escapeInvalid&&it.isInvalidBrace(s),i=n.invalid===!0&&t.escapeInvalid===!0,o="";if(n.value)return(a||i)&&it.isOpenOrClose(n)?"\\"+n.value:n.value;if(n.value)return n.value;if(n.nodes)for(let h of n.nodes)o+=r(h);return o};return r(e)}});var ct=K((os,ot)=>{"use strict";ot.exports=function(e){return typeof e=="number"?e-e==0:typeof e=="string"&&e.trim()!==""?Number.isFinite?Number.isFinite(+e):isFinite(+e):!1}});var At=K((cs,ut)=>{"use strict";var lt=ct(),pe=(e,t,r)=>{if(lt(e)===!1)throw new TypeError("toRegexRange: expected the first argument to be a number");if(t===void 0||e===t)return String(e);if(lt(t)===!1)throw new TypeError("toRegexRange: expected the second argument to be a number.");let n=B({relaxZeros:!0},r);typeof n.strictZeros=="boolean"&&(n.relaxZeros=n.strictZeros===!1);let s=String(n.relaxZeros),a=String(n.shorthand),i=String(n.capture),o=String(n.wrap),h=e+":"+t+"="+s+a+i+o;if(pe.cache.hasOwnProperty(h))return pe.cache[h].result;let g=Math.min(e,t),f=Math.max(e,t);if(Math.abs(g-f)===1){let R=e+"|"+t;return n.capture?`(${R})`:n.wrap===!1?R:`(?:${R})`}let A=ft(e)||ft(t),p={min:e,max:t,a:g,b:f},k=[],y=[];if(A&&(p.isPadded=A,p.maxLen=String(p.max).length),g<0){let R=f<0?Math.abs(f):1;y=pt(R,Math.abs(g),p,n),g=p.a=0}return f>=0&&(k=pt(g,f,p,n)),p.negatives=y,p.positives=k,p.result=Ir(y,k,n),n.capture===!0?p.result=`(${p.result})`:n.wrap!==!1&&k.length+y.length>1&&(p.result=`(?:${p.result})`),pe.cache[h]=p,p.result};function Ir(e,t,r){let n=Pe(e,t,"-",!1,r)||[],s=Pe(t,e,"",!1,r)||[],a=Pe(e,t,"-?",!0,r)||[];return n.concat(a).concat(s).join("|")}function Mr(e,t){let r=1,n=1,s=ht(e,r),a=new Set([t]);for(;e<=s&&s<=t;)a.add(s),r+=1,s=ht(e,r);for(s=dt(t+1,n)-1;e1&&o.count.pop(),o.count.push(f.count[0]),o.string=o.pattern+gt(o.count),i=g+1;continue}r.isPadded&&(A=Gr(g,r,n)),f.string=A+f.pattern+gt(f.count),a.push(f),i=g+1,o=f}return a}function Pe(e,t,r,n,s){let a=[];for(let i of e){let{string:o}=i;!n&&!mt(t,"string",o)&&a.push(r+o),n&&mt(t,"string",o)&&a.push(r+o)}return a}function Pr(e,t){let r=[];for(let n=0;nt?1:t>e?-1:0}function mt(e,t,r){return e.some(n=>n[t]===r)}function ht(e,t){return Number(String(e).slice(0,-t)+"9".repeat(t))}function dt(e,t){return e-e%Math.pow(10,t)}function gt(e){let[t=0,r=""]=e;return r||t>1?`{${t+(r?","+r:"")}}`:""}function Dr(e,t,r){return`[${e}${t-e==1?"":"-"}${t}]`}function ft(e){return/^-?(0+)\d/.test(e)}function Gr(e,t,r){if(!t.isPadded)return e;let n=Math.abs(t.maxLen-String(e).length),s=r.relaxZeros!==!1;switch(n){case 0:return"";case 1:return s?"0?":"0";case 2:return s?"0{0,2}":"00";default:return s?`0{0,${n}}`:`0{${n}}`}}pe.cache={};pe.clearCache=()=>pe.cache={};ut.exports=pe});var Ge=K((us,Rt)=>{"use strict";var qr=require("util"),yt=At(),bt=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),Kr=e=>t=>e===!0?Number(t):String(t),De=e=>typeof e=="number"||typeof e=="string"&&e!=="",Re=e=>Number.isInteger(+e),Ue=e=>{let t=`${e}`,r=-1;if(t[0]==="-"&&(t=t.slice(1)),t==="0")return!1;for(;t[++r]==="0";);return r>0},Wr=(e,t,r)=>typeof e=="string"||typeof t=="string"?!0:r.stringify===!0,jr=(e,t,r)=>{if(t>0){let n=e[0]==="-"?"-":"";n&&(e=e.slice(1)),e=n+e.padStart(n?t-1:t,"0")}return r===!1?String(e):e},_t=(e,t)=>{let r=e[0]==="-"?"-":"";for(r&&(e=e.slice(1),t--);e.length{e.negatives.sort((i,o)=>io?1:0),e.positives.sort((i,o)=>io?1:0);let r=t.capture?"":"?:",n="",s="",a;return e.positives.length&&(n=e.positives.join("|")),e.negatives.length&&(s=`-(${r}${e.negatives.join("|")})`),n&&s?a=`${n}|${s}`:a=n||s,t.wrap?`(${r}${a})`:a},Et=(e,t,r,n)=>{if(r)return yt(e,t,B({wrap:!1},n));let s=String.fromCharCode(e);if(e===t)return s;let a=String.fromCharCode(t);return`[${s}-${a}]`},xt=(e,t,r)=>{if(Array.isArray(e)){let n=r.wrap===!0,s=r.capture?"":"?:";return n?`(${s}${e.join("|")})`:e.join("|")}return yt(e,t,r)},Ct=(...e)=>new RangeError("Invalid range arguments: "+qr.inspect(...e)),wt=(e,t,r)=>{if(r.strictRanges===!0)throw Ct([e,t]);return[]},Qr=(e,t)=>{if(t.strictRanges===!0)throw new TypeError(`Expected step "${e}" to be a number`);return[]},Xr=(e,t,r=1,n={})=>{let s=Number(e),a=Number(t);if(!Number.isInteger(s)||!Number.isInteger(a)){if(n.strictRanges===!0)throw Ct([e,t]);return[]}s===0&&(s=0),a===0&&(a=0);let i=s>a,o=String(e),h=String(t),g=String(r);r=Math.max(Math.abs(r),1);let f=Ue(o)||Ue(h)||Ue(g),A=f?Math.max(o.length,h.length,g.length):0,p=f===!1&&Wr(e,t,n)===!1,k=n.transform||Kr(p);if(n.toRegex&&r===1)return Et(_t(e,A),_t(t,A),!0,n);let y={negatives:[],positives:[]},R=T=>y[T<0?"negatives":"positives"].push(Math.abs(T)),_=[],x=0;for(;i?s>=a:s<=a;)n.toRegex===!0&&r>1?R(s):_.push(jr(k(s,x),A,p)),s=i?s-r:s+r,x++;return n.toRegex===!0?r>1?Fr(y,n):xt(_,null,B({wrap:!1},n)):_},Zr=(e,t,r=1,n={})=>{if(!Re(e)&&e.length>1||!Re(t)&&t.length>1)return wt(e,t,n);let s=n.transform||(p=>String.fromCharCode(p)),a=`${e}`.charCodeAt(0),i=`${t}`.charCodeAt(0),o=a>i,h=Math.min(a,i),g=Math.max(a,i);if(n.toRegex&&r===1)return Et(h,g,!1,n);let f=[],A=0;for(;o?a>=i:a<=i;)f.push(s(a,A)),a=o?a-r:a+r,A++;return n.toRegex===!0?xt(f,null,{wrap:!1,options:n}):f},Te=(e,t,r,n={})=>{if(t==null&&De(e))return[e];if(!De(e)||!De(t))return wt(e,t,n);if(typeof r=="function")return Te(e,t,1,{transform:r});if(bt(r))return Te(e,t,0,r);let s=B({},n);return s.capture===!0&&(s.wrap=!0),r=r||s.step||1,Re(r)?Re(e)&&Re(t)?Xr(e,t,r,s):Zr(e,t,Math.max(Math.abs(r),1),s):r!=null&&!bt(r)?Qr(r,s):Te(e,t,1,r)};Rt.exports=Te});var Ht=K((ls,St)=>{"use strict";var Yr=Ge(),vt=$e(),zr=(e,t={})=>{let r=(n,s={})=>{let a=vt.isInvalidBrace(s),i=n.invalid===!0&&t.escapeInvalid===!0,o=a===!0||i===!0,h=t.escapeInvalid===!0?"\\":"",g="";if(n.isOpen===!0||n.isClose===!0)return h+n.value;if(n.type==="open")return o?h+n.value:"(";if(n.type==="close")return o?h+n.value:")";if(n.type==="comma")return n.prev.type==="comma"?"":o?n.value:"|";if(n.value)return n.value;if(n.nodes&&n.ranges>0){let f=vt.reduce(n.nodes),A=Yr(...f,Q(B({},t),{wrap:!1,toRegex:!0}));if(A.length!==0)return f.length>1&&A.length>1?`(${A})`:A}if(n.nodes)for(let f of n.nodes)g+=r(f,n);return g};return r(e)};St.exports=zr});var Tt=K((ps,$t)=>{"use strict";var Vr=Ge(),kt=ke(),he=$e(),fe=(e="",t="",r=!1)=>{let n=[];if(e=[].concat(e),t=[].concat(t),!t.length)return e;if(!e.length)return r?he.flatten(t).map(s=>`{${s}}`):t;for(let s of e)if(Array.isArray(s))for(let a of s)n.push(fe(a,t,r));else for(let a of t)r===!0&&typeof a=="string"&&(a=`{${a}}`),n.push(Array.isArray(a)?fe(s,a,r):s+a);return he.flatten(n)},Jr=(e,t={})=>{let r=t.rangeLimit===void 0?1e3:t.rangeLimit,n=(s,a={})=>{s.queue=[];let i=a,o=a.queue;for(;i.type!=="brace"&&i.type!=="root"&&i.parent;)i=i.parent,o=i.queue;if(s.invalid||s.dollar){o.push(fe(o.pop(),kt(s,t)));return}if(s.type==="brace"&&s.invalid!==!0&&s.nodes.length===2){o.push(fe(o.pop(),["{}"]));return}if(s.nodes&&s.ranges>0){let A=he.reduce(s.nodes);if(he.exceedsLimit(...A,t.step,r))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let p=Vr(...A,t);p.length===0&&(p=kt(s,t)),o.push(fe(o.pop(),p)),s.nodes=[];return}let h=he.encloseBrace(s),g=s.queue,f=s;for(;f.type!=="brace"&&f.type!=="root"&&f.parent;)f=f.parent,g=f.queue;for(let A=0;A{"use strict";Lt.exports={MAX_LENGTH:1024*64,CHAR_0:"0",CHAR_9:"9",CHAR_UPPERCASE_A:"A",CHAR_LOWERCASE_A:"a",CHAR_UPPERCASE_Z:"Z",CHAR_LOWERCASE_Z:"z",CHAR_LEFT_PARENTHESES:"(",CHAR_RIGHT_PARENTHESES:")",CHAR_ASTERISK:"*",CHAR_AMPERSAND:"&",CHAR_AT:"@",CHAR_BACKSLASH:"\\",CHAR_BACKTICK:"`",CHAR_CARRIAGE_RETURN:"\r",CHAR_CIRCUMFLEX_ACCENT:"^",CHAR_COLON:":",CHAR_COMMA:",",CHAR_DOLLAR:"$",CHAR_DOT:".",CHAR_DOUBLE_QUOTE:'"',CHAR_EQUAL:"=",CHAR_EXCLAMATION_MARK:"!",CHAR_FORM_FEED:"\f",CHAR_FORWARD_SLASH:"/",CHAR_HASH:"#",CHAR_HYPHEN_MINUS:"-",CHAR_LEFT_ANGLE_BRACKET:"<",CHAR_LEFT_CURLY_BRACE:"{",CHAR_LEFT_SQUARE_BRACKET:"[",CHAR_LINE_FEED:` +`,CHAR_NO_BREAK_SPACE:"\xA0",CHAR_PERCENT:"%",CHAR_PLUS:"+",CHAR_QUESTION_MARK:"?",CHAR_RIGHT_ANGLE_BRACKET:">",CHAR_RIGHT_CURLY_BRACE:"}",CHAR_RIGHT_SQUARE_BRACKET:"]",CHAR_SEMICOLON:";",CHAR_SINGLE_QUOTE:"'",CHAR_SPACE:" ",CHAR_TAB:" ",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\uFEFF"}});var Pt=K((hs,Nt)=>{"use strict";var en=ke(),{MAX_LENGTH:It,CHAR_BACKSLASH:qe,CHAR_BACKTICK:tn,CHAR_COMMA:rn,CHAR_DOT:nn,CHAR_LEFT_PARENTHESES:sn,CHAR_RIGHT_PARENTHESES:an,CHAR_LEFT_CURLY_BRACE:on,CHAR_RIGHT_CURLY_BRACE:cn,CHAR_LEFT_SQUARE_BRACKET:Bt,CHAR_RIGHT_SQUARE_BRACKET:Mt,CHAR_DOUBLE_QUOTE:un,CHAR_SINGLE_QUOTE:ln,CHAR_NO_BREAK_SPACE:pn,CHAR_ZERO_WIDTH_NOBREAK_SPACE:fn}=Ot(),hn=(e,t={})=>{if(typeof e!="string")throw new TypeError("Expected a string");let r=t||{},n=typeof r.maxLength=="number"?Math.min(It,r.maxLength):It;if(e.length>n)throw new SyntaxError(`Input length (${e.length}), exceeds max characters (${n})`);let s={type:"root",input:e,nodes:[]},a=[s],i=s,o=s,h=0,g=e.length,f=0,A=0,p,k={},y=()=>e[f++],R=_=>{if(_.type==="text"&&o.type==="dot"&&(o.type="text"),o&&o.type==="text"&&_.type==="text"){o.value+=_.value;return}return i.nodes.push(_),_.parent=i,_.prev=o,o=_,_};for(R({type:"bos"});f0){if(i.ranges>0){i.ranges=0;let _=i.nodes.shift();i.nodes=[_,{type:"text",value:en(i)}]}R({type:"comma",value:p}),i.commas++;continue}if(p===nn&&A>0&&i.commas===0){let _=i.nodes;if(A===0||_.length===0){R({type:"text",value:p});continue}if(o.type==="dot"){if(i.range=[],o.value+=p,o.type="range",i.nodes.length!==3&&i.nodes.length!==5){i.invalid=!0,i.ranges=0,o.type="text";continue}i.ranges++,i.args=[];continue}if(o.type==="range"){_.pop();let x=_[_.length-1];x.value+=o.value+p,o=x,i.ranges--;continue}R({type:"dot",value:p});continue}R({type:"text",value:p})}do if(i=a.pop(),i.type!=="root"){i.nodes.forEach(T=>{T.nodes||(T.type==="open"&&(T.isOpen=!0),T.type==="close"&&(T.isClose=!0),T.nodes||(T.type="text"),T.invalid=!0)});let _=a[a.length-1],x=_.nodes.indexOf(i);_.nodes.splice(x,1,...i.nodes)}while(a.length>0);return R({type:"eos"}),s};Nt.exports=hn});var Gt=K((ds,Dt)=>{"use strict";var Ut=ke(),dn=Ht(),gn=Tt(),mn=Pt(),V=(e,t={})=>{let r=[];if(Array.isArray(e))for(let n of e){let s=V.create(n,t);Array.isArray(s)?r.push(...s):r.push(s)}else r=[].concat(V.create(e,t));return t&&t.expand===!0&&t.nodupes===!0&&(r=[...new Set(r)]),r};V.parse=(e,t={})=>mn(e,t);V.stringify=(e,t={})=>typeof e=="string"?Ut(V.parse(e,t),t):Ut(e,t);V.compile=(e,t={})=>(typeof e=="string"&&(e=V.parse(e,t)),dn(e,t));V.expand=(e,t={})=>{typeof e=="string"&&(e=V.parse(e,t));let r=gn(e,t);return t.noempty===!0&&(r=r.filter(Boolean)),t.nodupes===!0&&(r=[...new Set(r)]),r};V.create=(e,t={})=>e===""||e.length<3?[e]:t.expand!==!0?V.compile(e,t):V.expand(e,t);Dt.exports=V});var ye=K((gs,qt)=>{"use strict";var An=require("path"),ie="\\\\/",Kt=`[^${ie}]`,ce="\\.",Rn="\\+",yn="\\?",Le="\\/",bn="(?=.)",Wt="[^/]",Ke=`(?:${Le}|$)`,jt=`(?:^|${Le})`,We=`${ce}{1,2}${Ke}`,_n=`(?!${ce})`,En=`(?!${jt}${We})`,xn=`(?!${ce}{0,1}${Ke})`,Cn=`(?!${We})`,wn=`[^.${Le}]`,Sn=`${Wt}*?`,Ft={DOT_LITERAL:ce,PLUS_LITERAL:Rn,QMARK_LITERAL:yn,SLASH_LITERAL:Le,ONE_CHAR:bn,QMARK:Wt,END_ANCHOR:Ke,DOTS_SLASH:We,NO_DOT:_n,NO_DOTS:En,NO_DOT_SLASH:xn,NO_DOTS_SLASH:Cn,QMARK_NO_DOT:wn,STAR:Sn,START_ANCHOR:jt},vn=Q(B({},Ft),{SLASH_LITERAL:`[${ie}]`,QMARK:Kt,STAR:`${Kt}*?`,DOTS_SLASH:`${ce}{1,2}(?:[${ie}]|$)`,NO_DOT:`(?!${ce})`,NO_DOTS:`(?!(?:^|[${ie}])${ce}{1,2}(?:[${ie}]|$))`,NO_DOT_SLASH:`(?!${ce}{0,1}(?:[${ie}]|$))`,NO_DOTS_SLASH:`(?!${ce}{1,2}(?:[${ie}]|$))`,QMARK_NO_DOT:`[^.${ie}]`,START_ANCHOR:`(?:^|[${ie}])`,END_ANCHOR:`(?:[${ie}]|$)`}),Hn={alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};qt.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:Hn,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:An.sep,extglobChars(e){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${e.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(e){return e===!0?vn:Ft}}});var be=K(Z=>{"use strict";var $n=require("path"),kn=process.platform==="win32",{REGEX_BACKSLASH:Tn,REGEX_REMOVE_BACKSLASH:Ln,REGEX_SPECIAL_CHARS:On,REGEX_SPECIAL_CHARS_GLOBAL:Nn}=ye();Z.isObject=e=>e!==null&&typeof e=="object"&&!Array.isArray(e);Z.hasRegexChars=e=>On.test(e);Z.isRegexChar=e=>e.length===1&&Z.hasRegexChars(e);Z.escapeRegex=e=>e.replace(Nn,"\\$1");Z.toPosixSlashes=e=>e.replace(Tn,"/");Z.removeBackslashes=e=>e.replace(Ln,t=>t==="\\"?"":t);Z.supportsLookbehinds=()=>{let e=process.version.slice(1).split(".").map(Number);return e.length===3&&e[0]>=9||e[0]===8&&e[1]>=10};Z.isWindows=e=>e&&typeof e.windows=="boolean"?e.windows:kn===!0||$n.sep==="\\";Z.escapeLast=(e,t,r)=>{let n=e.lastIndexOf(t,r);return n===-1?e:e[n-1]==="\\"?Z.escapeLast(e,t,n-1):`${e.slice(0,n)}\\${e.slice(n)}`};Z.removePrefix=(e,t={})=>{let r=e;return r.startsWith("./")&&(r=r.slice(2),t.prefix="./"),r};Z.wrapOutput=(e,t={},r={})=>{let n=r.contains?"":"^",s=r.contains?"":"$",a=`${n}(?:${e})${s}`;return t.negated===!0&&(a=`(?:^(?!${a}).*$)`),a}});var er=K((As,Qt)=>{"use strict";var Xt=be(),{CHAR_ASTERISK:je,CHAR_AT:In,CHAR_BACKWARD_SLASH:_e,CHAR_COMMA:Bn,CHAR_DOT:Fe,CHAR_EXCLAMATION_MARK:Qe,CHAR_FORWARD_SLASH:Zt,CHAR_LEFT_CURLY_BRACE:Xe,CHAR_LEFT_PARENTHESES:Ze,CHAR_LEFT_SQUARE_BRACKET:Mn,CHAR_PLUS:Pn,CHAR_QUESTION_MARK:Yt,CHAR_RIGHT_CURLY_BRACE:Dn,CHAR_RIGHT_PARENTHESES:zt,CHAR_RIGHT_SQUARE_BRACKET:Un}=ye(),Vt=e=>e===Zt||e===_e,Jt=e=>{e.isPrefix!==!0&&(e.depth=e.isGlobstar?Infinity:1)},Gn=(e,t)=>{let r=t||{},n=e.length-1,s=r.parts===!0||r.scanToEnd===!0,a=[],i=[],o=[],h=e,g=-1,f=0,A=0,p=!1,k=!1,y=!1,R=!1,_=!1,x=!1,T=!1,O=!1,W=!1,G=!1,ne=0,E,b,C={value:"",depth:0,isGlob:!1},M=()=>g>=n,l=()=>h.charCodeAt(g+1),H=()=>(E=b,h.charCodeAt(++g));for(;g0&&(j=h.slice(0,f),h=h.slice(f),A-=f),w&&y===!0&&A>0?(w=h.slice(0,A),c=h.slice(A)):y===!0?(w="",c=h):w=h,w&&w!==""&&w!=="/"&&w!==h&&Vt(w.charCodeAt(w.length-1))&&(w=w.slice(0,-1)),r.unescape===!0&&(c&&(c=Xt.removeBackslashes(c)),w&&T===!0&&(w=Xt.removeBackslashes(w)));let u={prefix:j,input:e,start:f,base:w,glob:c,isBrace:p,isBracket:k,isGlob:y,isExtglob:R,isGlobstar:_,negated:O,negatedExtglob:W};if(r.tokens===!0&&(u.maxDepth=0,Vt(b)||i.push(C),u.tokens=i),r.parts===!0||r.tokens===!0){let I;for(let $=0;${"use strict";var Oe=ye(),J=be(),{MAX_LENGTH:Ne,POSIX_REGEX_SOURCE:qn,REGEX_NON_SPECIAL_CHARS:Kn,REGEX_SPECIAL_CHARS_BACKREF:Wn,REPLACEMENTS:rr}=Oe,jn=(e,t)=>{if(typeof t.expandRange=="function")return t.expandRange(...e,t);e.sort();let r=`[${e.join("-")}]`;try{new RegExp(r)}catch(n){return e.map(s=>J.escapeRegex(s)).join("..")}return r},de=(e,t)=>`Missing ${e}: "${t}" - use "\\\\${t}" to match literal characters`,nr=(e,t)=>{if(typeof e!="string")throw new TypeError("Expected a string");e=rr[e]||e;let r=B({},t),n=typeof r.maxLength=="number"?Math.min(Ne,r.maxLength):Ne,s=e.length;if(s>n)throw new SyntaxError(`Input length: ${s}, exceeds maximum allowed length: ${n}`);let a={type:"bos",value:"",output:r.prepend||""},i=[a],o=r.capture?"":"?:",h=J.isWindows(t),g=Oe.globChars(h),f=Oe.extglobChars(g),{DOT_LITERAL:A,PLUS_LITERAL:p,SLASH_LITERAL:k,ONE_CHAR:y,DOTS_SLASH:R,NO_DOT:_,NO_DOT_SLASH:x,NO_DOTS_SLASH:T,QMARK:O,QMARK_NO_DOT:W,STAR:G,START_ANCHOR:ne}=g,E=m=>`(${o}(?:(?!${ne}${m.dot?R:A}).)*?)`,b=r.dot?"":_,C=r.dot?O:W,M=r.bash===!0?E(r):G;r.capture&&(M=`(${M})`),typeof r.noext=="boolean"&&(r.noextglob=r.noext);let l={input:e,index:-1,start:0,dot:r.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:i};e=J.removePrefix(e,l),s=e.length;let H=[],w=[],j=[],c=a,u,I=()=>l.index===s-1,$=l.peek=(m=1)=>e[l.index+m],ee=l.advance=()=>e[++l.index]||"",se=()=>e.slice(l.index+1),z=(m="",L=0)=>{l.consumed+=m,l.index+=L},Ce=m=>{l.output+=m.output!=null?m.output:m.value,z(m.value)},xr=()=>{let m=1;for(;$()==="!"&&($(2)!=="("||$(3)==="?");)ee(),l.start++,m++;return m%2==0?!1:(l.negated=!0,l.start++,!0)},we=m=>{l[m]++,j.push(m)},ue=m=>{l[m]--,j.pop()},v=m=>{if(c.type==="globstar"){let L=l.braces>0&&(m.type==="comma"||m.type==="brace"),d=m.extglob===!0||H.length&&(m.type==="pipe"||m.type==="paren");m.type!=="slash"&&m.type!=="paren"&&!L&&!d&&(l.output=l.output.slice(0,-c.output.length),c.type="star",c.value="*",c.output=M,l.output+=c.output)}if(H.length&&m.type!=="paren"&&(H[H.length-1].inner+=m.value),(m.value||m.output)&&Ce(m),c&&c.type==="text"&&m.type==="text"){c.value+=m.value,c.output=(c.output||"")+m.value;return}m.prev=c,i.push(m),c=m},Se=(m,L)=>{let d=Q(B({},f[L]),{conditions:1,inner:""});d.prev=c,d.parens=l.parens,d.output=l.output;let S=(r.capture?"(":"")+d.open;we("parens"),v({type:m,value:L,output:l.output?"":y}),v({type:"paren",extglob:!0,value:ee(),output:S}),H.push(d)},Cr=m=>{let L=m.close+(r.capture?")":""),d;if(m.type==="negate"){let S=M;m.inner&&m.inner.length>1&&m.inner.includes("/")&&(S=E(r)),(S!==M||I()||/^\)+$/.test(se()))&&(L=m.close=`)$))${S}`),m.inner.includes("*")&&(d=se())&&/^\.[^\\/.]+$/.test(d)&&(L=m.close=`)${d})${S})`),m.prev.type==="bos"&&(l.negatedExtglob=!0)}v({type:"paren",extglob:!0,value:u,output:L}),ue("parens")};if(r.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(e)){let m=!1,L=e.replace(Wn,(d,S,P,F,q,Me)=>F==="\\"?(m=!0,d):F==="?"?S?S+F+(q?O.repeat(q.length):""):Me===0?C+(q?O.repeat(q.length):""):O.repeat(P.length):F==="."?A.repeat(P.length):F==="*"?S?S+F+(q?M:""):M:S?d:`\\${d}`);return m===!0&&(r.unescape===!0?L=L.replace(/\\/g,""):L=L.replace(/\\+/g,d=>d.length%2==0?"\\\\":d?"\\":"")),L===e&&r.contains===!0?(l.output=e,l):(l.output=J.wrapOutput(L,l,t),l)}for(;!I();){if(u=ee(),u==="\0")continue;if(u==="\\"){let d=$();if(d==="/"&&r.bash!==!0||d==="."||d===";")continue;if(!d){u+="\\",v({type:"text",value:u});continue}let S=/^\\+/.exec(se()),P=0;if(S&&S[0].length>2&&(P=S[0].length,l.index+=P,P%2!=0&&(u+="\\")),r.unescape===!0?u=ee():u+=ee(),l.brackets===0){v({type:"text",value:u});continue}}if(l.brackets>0&&(u!=="]"||c.value==="["||c.value==="[^")){if(r.posix!==!1&&u===":"){let d=c.value.slice(1);if(d.includes("[")&&(c.posix=!0,d.includes(":"))){let S=c.value.lastIndexOf("["),P=c.value.slice(0,S),F=c.value.slice(S+2),q=qn[F];if(q){c.value=P+q,l.backtrack=!0,ee(),!a.output&&i.indexOf(c)===1&&(a.output=y);continue}}}(u==="["&&$()!==":"||u==="-"&&$()==="]")&&(u=`\\${u}`),u==="]"&&(c.value==="["||c.value==="[^")&&(u=`\\${u}`),r.posix===!0&&u==="!"&&c.value==="["&&(u="^"),c.value+=u,Ce({value:u});continue}if(l.quotes===1&&u!=='"'){u=J.escapeRegex(u),c.value+=u,Ce({value:u});continue}if(u==='"'){l.quotes=l.quotes===1?0:1,r.keepQuotes===!0&&v({type:"text",value:u});continue}if(u==="("){we("parens"),v({type:"paren",value:u});continue}if(u===")"){if(l.parens===0&&r.strictBrackets===!0)throw new SyntaxError(de("opening","("));let d=H[H.length-1];if(d&&l.parens===d.parens+1){Cr(H.pop());continue}v({type:"paren",value:u,output:l.parens?")":"\\)"}),ue("parens");continue}if(u==="["){if(r.nobracket===!0||!se().includes("]")){if(r.nobracket!==!0&&r.strictBrackets===!0)throw new SyntaxError(de("closing","]"));u=`\\${u}`}else we("brackets");v({type:"bracket",value:u});continue}if(u==="]"){if(r.nobracket===!0||c&&c.type==="bracket"&&c.value.length===1){v({type:"text",value:u,output:`\\${u}`});continue}if(l.brackets===0){if(r.strictBrackets===!0)throw new SyntaxError(de("opening","["));v({type:"text",value:u,output:`\\${u}`});continue}ue("brackets");let d=c.value.slice(1);if(c.posix!==!0&&d[0]==="^"&&!d.includes("/")&&(u=`/${u}`),c.value+=u,Ce({value:u}),r.literalBrackets===!1||J.hasRegexChars(d))continue;let S=J.escapeRegex(c.value);if(l.output=l.output.slice(0,-c.value.length),r.literalBrackets===!0){l.output+=S,c.value=S;continue}c.value=`(${o}${S}|${c.value})`,l.output+=c.value;continue}if(u==="{"&&r.nobrace!==!0){we("braces");let d={type:"brace",value:u,output:"(",outputIndex:l.output.length,tokensIndex:l.tokens.length};w.push(d),v(d);continue}if(u==="}"){let d=w[w.length-1];if(r.nobrace===!0||!d){v({type:"text",value:u,output:u});continue}let S=")";if(d.dots===!0){let P=i.slice(),F=[];for(let q=P.length-1;q>=0&&(i.pop(),P[q].type!=="brace");q--)P[q].type!=="dots"&&F.unshift(P[q].value);S=jn(F,r),l.backtrack=!0}if(d.comma!==!0&&d.dots!==!0){let P=l.output.slice(0,d.outputIndex),F=l.tokens.slice(d.tokensIndex);d.value=d.output="\\{",u=S="\\}",l.output=P;for(let q of F)l.output+=q.output||q.value}v({type:"brace",value:u,output:S}),ue("braces"),w.pop();continue}if(u==="|"){H.length>0&&H[H.length-1].conditions++,v({type:"text",value:u});continue}if(u===","){let d=u,S=w[w.length-1];S&&j[j.length-1]==="braces"&&(S.comma=!0,d="|"),v({type:"comma",value:u,output:d});continue}if(u==="/"){if(c.type==="dot"&&l.index===l.start+1){l.start=l.index+1,l.consumed="",l.output="",i.pop(),c=a;continue}v({type:"slash",value:u,output:k});continue}if(u==="."){if(l.braces>0&&c.type==="dot"){c.value==="."&&(c.output=A);let d=w[w.length-1];c.type="dots",c.output+=u,c.value+=u,d.dots=!0;continue}if(l.braces+l.parens===0&&c.type!=="bos"&&c.type!=="slash"){v({type:"text",value:u,output:A});continue}v({type:"dot",value:u,output:A});continue}if(u==="?"){if(!(c&&c.value==="(")&&r.noextglob!==!0&&$()==="("&&$(2)!=="?"){Se("qmark",u);continue}if(c&&c.type==="paren"){let S=$(),P=u;if(S==="<"&&!J.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");(c.value==="("&&!/[!=<:]/.test(S)||S==="<"&&!/<([!=]|\w+>)/.test(se()))&&(P=`\\${u}`),v({type:"text",value:u,output:P});continue}if(r.dot!==!0&&(c.type==="slash"||c.type==="bos")){v({type:"qmark",value:u,output:W});continue}v({type:"qmark",value:u,output:O});continue}if(u==="!"){if(r.noextglob!==!0&&$()==="("&&($(2)!=="?"||!/[!=<:]/.test($(3)))){Se("negate",u);continue}if(r.nonegate!==!0&&l.index===0){xr();continue}}if(u==="+"){if(r.noextglob!==!0&&$()==="("&&$(2)!=="?"){Se("plus",u);continue}if(c&&c.value==="("||r.regex===!1){v({type:"plus",value:u,output:p});continue}if(c&&(c.type==="bracket"||c.type==="paren"||c.type==="brace")||l.parens>0){v({type:"plus",value:u});continue}v({type:"plus",value:p});continue}if(u==="@"){if(r.noextglob!==!0&&$()==="("&&$(2)!=="?"){v({type:"at",extglob:!0,value:u,output:""});continue}v({type:"text",value:u});continue}if(u!=="*"){(u==="$"||u==="^")&&(u=`\\${u}`);let d=Kn.exec(se());d&&(u+=d[0],l.index+=d[0].length),v({type:"text",value:u});continue}if(c&&(c.type==="globstar"||c.star===!0)){c.type="star",c.star=!0,c.value+=u,c.output=M,l.backtrack=!0,l.globstar=!0,z(u);continue}let m=se();if(r.noextglob!==!0&&/^\([^?]/.test(m)){Se("star",u);continue}if(c.type==="star"){if(r.noglobstar===!0){z(u);continue}let d=c.prev,S=d.prev,P=d.type==="slash"||d.type==="bos",F=S&&(S.type==="star"||S.type==="globstar");if(r.bash===!0&&(!P||m[0]&&m[0]!=="/")){v({type:"star",value:u,output:""});continue}let q=l.braces>0&&(d.type==="comma"||d.type==="brace"),Me=H.length&&(d.type==="pipe"||d.type==="paren");if(!P&&d.type!=="paren"&&!q&&!Me){v({type:"star",value:u,output:""});continue}for(;m.slice(0,3)==="/**";){let ve=e[l.index+4];if(ve&&ve!=="/")break;m=m.slice(3),z("/**",3)}if(d.type==="bos"&&I()){c.type="globstar",c.value+=u,c.output=E(r),l.output=c.output,l.globstar=!0,z(u);continue}if(d.type==="slash"&&d.prev.type!=="bos"&&!F&&I()){l.output=l.output.slice(0,-(d.output+c.output).length),d.output=`(?:${d.output}`,c.type="globstar",c.output=E(r)+(r.strictSlashes?")":"|$)"),c.value+=u,l.globstar=!0,l.output+=d.output+c.output,z(u);continue}if(d.type==="slash"&&d.prev.type!=="bos"&&m[0]==="/"){let ve=m[1]!==void 0?"|$":"";l.output=l.output.slice(0,-(d.output+c.output).length),d.output=`(?:${d.output}`,c.type="globstar",c.output=`${E(r)}${k}|${k}${ve})`,c.value+=u,l.output+=d.output+c.output,l.globstar=!0,z(u+ee()),v({type:"slash",value:"/",output:""});continue}if(d.type==="bos"&&m[0]==="/"){c.type="globstar",c.value+=u,c.output=`(?:^|${k}|${E(r)}${k})`,l.output=c.output,l.globstar=!0,z(u+ee()),v({type:"slash",value:"/",output:""});continue}l.output=l.output.slice(0,-c.output.length),c.type="globstar",c.output=E(r),c.value+=u,l.output+=c.output,l.globstar=!0,z(u);continue}let L={type:"star",value:u,output:M};if(r.bash===!0){L.output=".*?",(c.type==="bos"||c.type==="slash")&&(L.output=b+L.output),v(L);continue}if(c&&(c.type==="bracket"||c.type==="paren")&&r.regex===!0){L.output=u,v(L);continue}(l.index===l.start||c.type==="slash"||c.type==="dot")&&(c.type==="dot"?(l.output+=x,c.output+=x):r.dot===!0?(l.output+=T,c.output+=T):(l.output+=b,c.output+=b),$()!=="*"&&(l.output+=y,c.output+=y)),v(L)}for(;l.brackets>0;){if(r.strictBrackets===!0)throw new SyntaxError(de("closing","]"));l.output=J.escapeLast(l.output,"["),ue("brackets")}for(;l.parens>0;){if(r.strictBrackets===!0)throw new SyntaxError(de("closing",")"));l.output=J.escapeLast(l.output,"("),ue("parens")}for(;l.braces>0;){if(r.strictBrackets===!0)throw new SyntaxError(de("closing","}"));l.output=J.escapeLast(l.output,"{"),ue("braces")}if(r.strictSlashes!==!0&&(c.type==="star"||c.type==="bracket")&&v({type:"maybe_slash",value:"",output:`${k}?`}),l.backtrack===!0){l.output="";for(let m of l.tokens)l.output+=m.output!=null?m.output:m.value,m.suffix&&(l.output+=m.suffix)}return l};nr.fastpaths=(e,t)=>{let r=B({},t),n=typeof r.maxLength=="number"?Math.min(Ne,r.maxLength):Ne,s=e.length;if(s>n)throw new SyntaxError(`Input length: ${s}, exceeds maximum allowed length: ${n}`);e=rr[e]||e;let a=J.isWindows(t),{DOT_LITERAL:i,SLASH_LITERAL:o,ONE_CHAR:h,DOTS_SLASH:g,NO_DOT:f,NO_DOTS:A,NO_DOTS_SLASH:p,STAR:k,START_ANCHOR:y}=Oe.globChars(a),R=r.dot?A:f,_=r.dot?p:f,x=r.capture?"":"?:",T={negated:!1,prefix:""},O=r.bash===!0?".*?":k;r.capture&&(O=`(${O})`);let W=b=>b.noglobstar===!0?O:`(${x}(?:(?!${y}${b.dot?g:i}).)*?)`,G=b=>{switch(b){case"*":return`${R}${h}${O}`;case".*":return`${i}${h}${O}`;case"*.*":return`${R}${O}${i}${h}${O}`;case"*/*":return`${R}${O}${o}${h}${_}${O}`;case"**":return R+W(r);case"**/*":return`(?:${R}${W(r)}${o})?${_}${h}${O}`;case"**/*.*":return`(?:${R}${W(r)}${o})?${_}${O}${i}${h}${O}`;case"**/.*":return`(?:${R}${W(r)}${o})?${i}${h}${O}`;default:{let C=/^(.*?)\.(\w+)$/.exec(b);if(!C)return;let M=G(C[1]);return M?M+i+C[2]:void 0}}},ne=J.removePrefix(e,T),E=G(ne);return E&&r.strictSlashes!==!0&&(E+=`${o}?`),E};tr.exports=nr});var ir=K((ys,ar)=>{"use strict";var Fn=require("path"),Qn=er(),Ye=sr(),ze=be(),Xn=ye(),Zn=e=>e&&typeof e=="object"&&!Array.isArray(e),D=(e,t,r=!1)=>{if(Array.isArray(e)){let f=e.map(p=>D(p,t,r));return p=>{for(let k of f){let y=k(p);if(y)return y}return!1}}let n=Zn(e)&&e.tokens&&e.input;if(e===""||typeof e!="string"&&!n)throw new TypeError("Expected pattern to be a non-empty string");let s=t||{},a=ze.isWindows(t),i=n?D.compileRe(e,t):D.makeRe(e,t,!1,!0),o=i.state;delete i.state;let h=()=>!1;if(s.ignore){let f=Q(B({},t),{ignore:null,onMatch:null,onResult:null});h=D(s.ignore,f,r)}let g=(f,A=!1)=>{let{isMatch:p,match:k,output:y}=D.test(f,i,t,{glob:e,posix:a}),R={glob:e,state:o,regex:i,posix:a,input:f,output:y,match:k,isMatch:p};return typeof s.onResult=="function"&&s.onResult(R),p===!1?(R.isMatch=!1,A?R:!1):h(f)?(typeof s.onIgnore=="function"&&s.onIgnore(R),R.isMatch=!1,A?R:!1):(typeof s.onMatch=="function"&&s.onMatch(R),A?R:!0)};return r&&(g.state=o),g};D.test=(e,t,r,{glob:n,posix:s}={})=>{if(typeof e!="string")throw new TypeError("Expected input to be a string");if(e==="")return{isMatch:!1,output:""};let a=r||{},i=a.format||(s?ze.toPosixSlashes:null),o=e===n,h=o&&i?i(e):e;return o===!1&&(h=i?i(e):e,o=h===n),(o===!1||a.capture===!0)&&(a.matchBase===!0||a.basename===!0?o=D.matchBase(e,t,r,s):o=t.exec(h)),{isMatch:Boolean(o),match:o,output:h}};D.matchBase=(e,t,r,n=ze.isWindows(r))=>(t instanceof RegExp?t:D.makeRe(t,r)).test(Fn.basename(e));D.isMatch=(e,t,r)=>D(t,r)(e);D.parse=(e,t)=>Array.isArray(e)?e.map(r=>D.parse(r,t)):Ye(e,Q(B({},t),{fastpaths:!1}));D.scan=(e,t)=>Qn(e,t);D.compileRe=(e,t,r=!1,n=!1)=>{if(r===!0)return e.output;let s=t||{},a=s.contains?"":"^",i=s.contains?"":"$",o=`${a}(?:${e.output})${i}`;e&&e.negated===!0&&(o=`^(?!${o}).*$`);let h=D.toRegex(o,t);return n===!0&&(h.state=e),h};D.makeRe=(e,t={},r=!1,n=!1)=>{if(!e||typeof e!="string")throw new TypeError("Expected a non-empty string");let s={negated:!1,fastpaths:!0};return t.fastpaths!==!1&&(e[0]==="."||e[0]==="*")&&(s.output=Ye.fastpaths(e,t)),s.output||(s=Ye(e,t)),D.compileRe(s,t,r,n)};D.toRegex=(e,t)=>{try{let r=t||{};return new RegExp(e,r.flags||(r.nocase?"i":""))}catch(r){if(t&&t.debug===!0)throw r;return/$^/}};D.constants=Xn;ar.exports=D});var cr=K((bs,or)=>{"use strict";or.exports=ir()});var hr=K((_s,ur)=>{"use strict";var lr=require("util"),pr=Gt(),oe=cr(),Ve=be(),fr=e=>e===""||e==="./",N=(e,t,r)=>{t=[].concat(t),e=[].concat(e);let n=new Set,s=new Set,a=new Set,i=0,o=f=>{a.add(f.output),r&&r.onResult&&r.onResult(f)};for(let f=0;f!n.has(f));if(r&&g.length===0){if(r.failglob===!0)throw new Error(`No matches found for "${t.join(", ")}"`);if(r.nonull===!0||r.nullglob===!0)return r.unescape?t.map(f=>f.replace(/\\/g,"")):t}return g};N.match=N;N.matcher=(e,t)=>oe(e,t);N.isMatch=(e,t,r)=>oe(t,r)(e);N.any=N.isMatch;N.not=(e,t,r={})=>{t=[].concat(t).map(String);let n=new Set,s=[],a=o=>{r.onResult&&r.onResult(o),s.push(o.output)},i=N(e,t,Q(B({},r),{onResult:a}));for(let o of s)i.includes(o)||n.add(o);return[...n]};N.contains=(e,t,r)=>{if(typeof e!="string")throw new TypeError(`Expected a string: "${lr.inspect(e)}"`);if(Array.isArray(t))return t.some(n=>N.contains(e,n,r));if(typeof t=="string"){if(fr(e)||fr(t))return!1;if(e.includes(t)||e.startsWith("./")&&e.slice(2).includes(t))return!0}return N.isMatch(e,t,Q(B({},r),{contains:!0}))};N.matchKeys=(e,t,r)=>{if(!Ve.isObject(e))throw new TypeError("Expected the first argument to be an object");let n=N(Object.keys(e),t,r),s={};for(let a of n)s[a]=e[a];return s};N.some=(e,t,r)=>{let n=[].concat(e);for(let s of[].concat(t)){let a=oe(String(s),r);if(n.some(i=>a(i)))return!0}return!1};N.every=(e,t,r)=>{let n=[].concat(e);for(let s of[].concat(t)){let a=oe(String(s),r);if(!n.every(i=>a(i)))return!1}return!0};N.all=(e,t,r)=>{if(typeof e!="string")throw new TypeError(`Expected a string: "${lr.inspect(e)}"`);return[].concat(t).every(n=>oe(n,r)(e))};N.capture=(e,t,r)=>{let n=Ve.isWindows(r),a=oe.makeRe(String(e),Q(B({},r),{capture:!0})).exec(n?Ve.toPosixSlashes(t):t);if(a)return a.slice(1).map(i=>i===void 0?"":i)};N.makeRe=(...e)=>oe.makeRe(...e);N.scan=(...e)=>oe.scan(...e);N.parse=(e,t)=>{let r=[];for(let n of[].concat(e||[]))for(let s of pr(String(n),t))r.push(oe.parse(s,t));return r};N.braces=(e,t)=>{if(typeof e!="string")throw new TypeError("Expected a string");return t&&t.nobrace===!0||!/\{.*\}/.test(e)?[e]:pr(e,t)};N.braceExpand=(e,t)=>{if(typeof e!="string")throw new TypeError("Expected a string");return N.braces(e,Q(B({},t),{expand:!0}))};ur.exports=N});var gr=K((Es,dr)=>{"use strict";dr.exports=(e,...t)=>new Promise(r=>{r(e(...t))})});var Ar=K((xs,Je)=>{"use strict";var Yn=gr(),mr=e=>{if(e<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let t=[],r=0,n=()=>{r--,t.length>0&&t.shift()()},s=(o,h,...g)=>{r++;let f=Yn(o,...g);h(f),f.then(n,n)},a=(o,h,...g)=>{rnew Promise(g=>a(o,g,...h));return Object.defineProperties(i,{activeCount:{get:()=>r},pendingCount:{get:()=>t.length}}),i};Je.exports=mr;Je.exports.default=mr});var Vn={};Or(Vn,{default:()=>es});var He=X(require("@yarnpkg/cli")),ae=X(require("@yarnpkg/core")),nt=X(require("@yarnpkg/core")),le=X(require("clipanion")),Ae=class extends He.BaseCommand{constructor(){super(...arguments);this.json=le.Option.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.production=le.Option.Boolean("--production",!1,{description:"Only install regular dependencies by omitting dev dependencies"});this.all=le.Option.Boolean("-A,--all",!1,{description:"Install the entire project"});this.workspaces=le.Option.Rest()}async execute(){let t=await ae.Configuration.find(this.context.cwd,this.context.plugins),{project:r,workspace:n}=await ae.Project.find(t,this.context.cwd),s=await ae.Cache.find(t);await r.restoreInstallState({restoreResolutions:!1});let a;if(this.all)a=new Set(r.workspaces);else if(this.workspaces.length===0){if(!n)throw new He.WorkspaceRequiredError(r.cwd,this.context.cwd);a=new Set([n])}else a=new Set(this.workspaces.map(o=>r.getWorkspaceByIdent(nt.structUtils.parseIdent(o))));for(let o of a)for(let h of this.production?["dependencies"]:ae.Manifest.hardDependencies)for(let g of o.manifest.getForScope(h).values()){let f=r.tryWorkspaceByDescriptor(g);f!==null&&a.add(f)}for(let o of r.workspaces)a.has(o)?this.production&&o.manifest.devDependencies.clear():(o.manifest.installConfig=o.manifest.installConfig||{},o.manifest.installConfig.selfReferences=!1,o.manifest.dependencies.clear(),o.manifest.devDependencies.clear(),o.manifest.peerDependencies.clear(),o.manifest.scripts.clear());return(await ae.StreamReport.start({configuration:t,json:this.json,stdout:this.context.stdout,includeLogs:!0},async o=>{await r.install({cache:s,report:o,persistProject:!1})})).exitCode()}};Ae.paths=[["workspaces","focus"]],Ae.usage=le.Command.Usage({category:"Workspace-related commands",description:"install a single workspace and its dependencies",details:"\n This command will run an install as if the specified workspaces (and all other workspaces they depend on) were the only ones in the project. If no workspaces are explicitly listed, the active one will be assumed.\n\n Note that this command is only very moderately useful when using zero-installs, since the cache will contain all the packages anyway - meaning that the only difference between a full install and a focused install would just be a few extra lines in the `.pnp.cjs` file, at the cost of introducing an extra complexity.\n\n If the `-A,--all` flag is set, the entire project will be installed. Combine with `--production` to replicate the old `yarn install --production`.\n "});var st=Ae;var Ie=X(require("@yarnpkg/cli")),ge=X(require("@yarnpkg/core")),Ee=X(require("@yarnpkg/core")),Y=X(require("@yarnpkg/core")),Rr=X(require("@yarnpkg/plugin-git")),U=X(require("clipanion")),Be=X(hr()),yr=X(require("os")),br=X(Ar()),re=X(require("typanion")),xe=class extends Ie.BaseCommand{constructor(){super(...arguments);this.recursive=U.Option.Boolean("-R,--recursive",!1,{description:"Find packages via dependencies/devDependencies instead of using the workspaces field"});this.from=U.Option.Array("--from",[],{description:"An array of glob pattern idents from which to base any recursion"});this.all=U.Option.Boolean("-A,--all",!1,{description:"Run the command on all workspaces of a project"});this.verbose=U.Option.Boolean("-v,--verbose",!1,{description:"Prefix each output line with the name of the originating workspace"});this.parallel=U.Option.Boolean("-p,--parallel",!1,{description:"Run the commands in parallel"});this.interlaced=U.Option.Boolean("-i,--interlaced",!1,{description:"Print the output of commands in real-time instead of buffering it"});this.jobs=U.Option.String("-j,--jobs",{description:"The maximum number of parallel tasks that the execution will be limited to; or `unlimited`",validator:re.isOneOf([re.isEnum(["unlimited"]),re.applyCascade(re.isNumber(),[re.isInteger(),re.isAtLeast(1)])])});this.topological=U.Option.Boolean("-t,--topological",!1,{description:"Run the command after all workspaces it depends on (regular) have finished"});this.topologicalDev=U.Option.Boolean("--topological-dev",!1,{description:"Run the command after all workspaces it depends on (regular + dev) have finished"});this.include=U.Option.Array("--include",[],{description:"An array of glob pattern idents; only matching workspaces will be traversed"});this.exclude=U.Option.Array("--exclude",[],{description:"An array of glob pattern idents; matching workspaces won't be traversed"});this.publicOnly=U.Option.Boolean("--no-private",{description:"Avoid running the command on private workspaces"});this.since=U.Option.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.commandName=U.Option.String();this.args=U.Option.Proxy()}async execute(){let t=await ge.Configuration.find(this.context.cwd,this.context.plugins),{project:r,workspace:n}=await ge.Project.find(t,this.context.cwd);if(!this.all&&!n)throw new Ie.WorkspaceRequiredError(r.cwd,this.context.cwd);await r.restoreInstallState();let s=this.cli.process([this.commandName,...this.args]),a=s.path.length===1&&s.path[0]==="run"&&typeof s.scriptName!="undefined"?s.scriptName:null;if(s.path.length===0)throw new U.UsageError("Invalid subcommand name for iteration - use the 'run' keyword if you wish to execute a script");let i=this.all?r.topLevelWorkspace:n,o=this.since?Array.from(await Rr.gitUtils.fetchChangedWorkspaces({ref:this.since,project:r})):[i,...this.from.length>0?i.getRecursiveWorkspaceChildren():[]],h=E=>Be.default.isMatch(Y.structUtils.stringifyIdent(E.locator),this.from),g=this.from.length>0?o.filter(h):o,f=new Set([...g,...g.map(E=>[...this.recursive?this.since?E.getRecursiveWorkspaceDependents():E.getRecursiveWorkspaceDependencies():E.getRecursiveWorkspaceChildren()]).flat()]),A=[],p=!1;if(a==null?void 0:a.includes(":")){for(let E of r.workspaces)if(E.manifest.scripts.has(a)&&(p=!p,p===!1))break}for(let E of f)a&&!E.manifest.scripts.has(a)&&!p&&!(await ge.scriptUtils.getWorkspaceAccessibleBinaries(E)).has(a)||a===process.env.npm_lifecycle_event&&E.cwd===n.cwd||this.include.length>0&&!Be.default.isMatch(Y.structUtils.stringifyIdent(E.locator),this.include)||this.exclude.length>0&&Be.default.isMatch(Y.structUtils.stringifyIdent(E.locator),this.exclude)||this.publicOnly&&E.manifest.private===!0||A.push(E);let k=this.parallel?this.jobs==="unlimited"?Infinity:Number(this.jobs)||Math.max(1,(0,yr.cpus)().length/2):1,y=k===1?!1:this.parallel,R=y?this.interlaced:!0,_=(0,br.default)(k),x=new Map,T=new Set,O=0,W=null,G=!1,ne=await Ee.StreamReport.start({configuration:t,stdout:this.context.stdout},async E=>{let b=async(C,{commandIndex:M})=>{if(G)return-1;!y&&this.verbose&&M>1&&E.reportSeparator();let l=zn(C,{configuration:t,verbose:this.verbose,commandIndex:M}),[H,w]=_r(E,{prefix:l,interlaced:R}),[j,c]=_r(E,{prefix:l,interlaced:R});try{this.verbose&&E.reportInfo(null,`${l} Process started`);let u=Date.now(),I=await this.cli.run([this.commandName,...this.args],{cwd:C.cwd,stdout:H,stderr:j})||0;H.end(),j.end(),await w,await c;let $=Date.now();if(this.verbose){let ee=t.get("enableTimers")?`, completed in ${Y.formatUtils.pretty(t,$-u,Y.formatUtils.Type.DURATION)}`:"";E.reportInfo(null,`${l} Process exited (exit code ${I})${ee}`)}return I===130&&(G=!0,W=I),I}catch(u){throw H.end(),j.end(),await w,await c,u}};for(let C of A)x.set(C.anchoredLocator.locatorHash,C);for(;x.size>0&&!E.hasErrors();){let C=[];for(let[H,w]of x){if(T.has(w.anchoredDescriptor.descriptorHash))continue;let j=!0;if(this.topological||this.topologicalDev){let c=this.topologicalDev?new Map([...w.manifest.dependencies,...w.manifest.devDependencies]):w.manifest.dependencies;for(let u of c.values()){let I=r.tryWorkspaceByDescriptor(u);if(j=I===null||!x.has(I.anchoredLocator.locatorHash),!j)break}}if(!!j&&(T.add(w.anchoredDescriptor.descriptorHash),C.push(_(async()=>{let c=await b(w,{commandIndex:++O});return x.delete(H),T.delete(w.anchoredDescriptor.descriptorHash),c})),!y))break}if(C.length===0){let H=Array.from(x.values()).map(w=>Y.structUtils.prettyLocator(t,w.anchoredLocator)).join(", ");E.reportError(Ee.MessageName.CYCLIC_DEPENDENCIES,`Dependency cycle detected (${H})`);return}let l=(await Promise.all(C)).find(H=>H!==0);W===null&&(W=typeof l!="undefined"?1:W),(this.topological||this.topologicalDev)&&typeof l!="undefined"&&E.reportError(Ee.MessageName.UNNAMED,"The command failed for workspaces that are depended upon by other workspaces; can't satisfy the dependency graph")}});return W!==null?W:ne.exitCode()}};xe.paths=[["workspaces","foreach"]],xe.usage=U.Command.Usage({category:"Workspace-related commands",description:"run a command on all workspaces",details:"\n This command will run a given sub-command on current and all its descendant workspaces. Various flags can alter the exact behavior of the command:\n\n - If `-p,--parallel` is set, the commands will be ran in parallel; they'll by default be limited to a number of parallel tasks roughly equal to half your core number, but that can be overridden via `-j,--jobs`, or disabled by setting `-j unlimited`.\n\n - If `-p,--parallel` and `-i,--interlaced` are both set, Yarn will print the lines from the output as it receives them. If `-i,--interlaced` wasn't set, it would instead buffer the output from each process and print the resulting buffers only after their source processes have exited.\n\n - If `-t,--topological` is set, Yarn will only run the command after all workspaces that it depends on through the `dependencies` field have successfully finished executing. If `--topological-dev` is set, both the `dependencies` and `devDependencies` fields will be considered when figuring out the wait points.\n\n - If `-A,--all` is set, Yarn will run the command on all the workspaces of a project. By default yarn runs the command only on current and all its descendant workspaces.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If `--from` is set, Yarn will use the packages matching the 'from' glob as the starting point for any recursive search.\n\n - If `--since` is set, Yarn will only run the command on workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - The command may apply to only some workspaces through the use of `--include` which acts as a whitelist. The `--exclude` flag will do the opposite and will be a list of packages that mustn't execute the script. Both flags accept glob patterns (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n Adding the `-v,--verbose` flag will cause Yarn to print more information; in particular the name of the workspace that generated the output will be printed at the front of each line.\n\n If the command is `run` and the script being run does not exist the child workspace will be skipped without error.\n ",examples:[["Publish current and all descendant packages","yarn workspaces foreach npm publish --tolerate-republish"],["Run build script on current and all descendant packages","yarn workspaces foreach run build"],["Run build script on current and all descendant packages in parallel, building package dependencies first","yarn workspaces foreach -pt run build"],["Run build script on several packages and all their dependencies, building dependencies first","yarn workspaces foreach -ptR --from '{workspace-a,workspace-b}' run build"]]});var Er=xe;function _r(e,{prefix:t,interlaced:r}){let n=e.createStreamReporter(t),s=new Y.miscUtils.DefaultStream;s.pipe(n,{end:!1}),s.on("finish",()=>{n.end()});let a=new Promise(o=>{n.on("finish",()=>{o(s.active)})});if(r)return[s,a];let i=new Y.miscUtils.BufferStream;return i.pipe(s,{end:!1}),i.on("finish",()=>{s.end()}),[i,a]}function zn(e,{configuration:t,commandIndex:r,verbose:n}){if(!n)return null;let s=Y.structUtils.convertToIdent(e.locator),i=`[${Y.structUtils.stringifyIdent(s)}]:`,o=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],h=o[r%o.length];return Y.formatUtils.pretty(t,i,h)}var Jn={commands:[st,Er]},es=Jn;return Vn;})(); +/*! + * fill-range + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Licensed under the MIT License. + */ +/*! + * is-number + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Released under the MIT License. + */ +/*! + * to-regex-range + * + * Copyright (c) 2015-present, Jon Schlinkert. + * Released under the MIT License. + */ +return plugin; +} +}; diff --git a/balpy/balancer-deployments/.yarn/releases/yarn-4.0.0-rc.42.cjs b/balpy/balancer-deployments/.yarn/releases/yarn-4.0.0-rc.42.cjs new file mode 100755 index 0000000..90459ca --- /dev/null +++ b/balpy/balancer-deployments/.yarn/releases/yarn-4.0.0-rc.42.cjs @@ -0,0 +1,876 @@ +#!/usr/bin/env node +/* eslint-disable */ +//prettier-ignore +(()=>{var C_e=Object.create;var xR=Object.defineProperty;var E_e=Object.getOwnPropertyDescriptor;var I_e=Object.getOwnPropertyNames;var w_e=Object.getPrototypeOf,B_e=Object.prototype.hasOwnProperty;var Ie=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+t+'" is not supported')});var dt=(t,e)=>()=>(t&&(e=t(t=0)),e);var U=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),Yt=(t,e)=>{for(var r in e)xR(t,r,{get:e[r],enumerable:!0})},v_e=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of I_e(e))!B_e.call(t,a)&&a!==r&&xR(t,a,{get:()=>e[a],enumerable:!(o=E_e(e,a))||o.enumerable});return t};var tt=(t,e,r)=>(r=t!=null?C_e(w_e(t)):{},v_e(e||!t||!t.__esModule?xR(r,"default",{value:t,enumerable:!0}):r,t));var Ii={};Yt(Ii,{SAFE_TIME:()=>D7,S_IFDIR:()=>aD,S_IFLNK:()=>lD,S_IFMT:()=>Hu,S_IFREG:()=>RI});var Hu,aD,RI,lD,D7,S7=dt(()=>{Hu=61440,aD=16384,RI=32768,lD=40960,D7=456789e3});var sr={};Yt(sr,{EBADF:()=>Eo,EBUSY:()=>D_e,EEXIST:()=>k_e,EINVAL:()=>P_e,EISDIR:()=>Q_e,ENOENT:()=>x_e,ENOSYS:()=>S_e,ENOTDIR:()=>b_e,ENOTEMPTY:()=>R_e,EOPNOTSUPP:()=>T_e,EROFS:()=>F_e,ERR_DIR_CLOSED:()=>bR});function Ol(t,e){return Object.assign(new Error(`${t}: ${e}`),{code:t})}function D_e(t){return Ol("EBUSY",t)}function S_e(t,e){return Ol("ENOSYS",`${t}, ${e}`)}function P_e(t){return Ol("EINVAL",`invalid argument, ${t}`)}function Eo(t){return Ol("EBADF",`bad file descriptor, ${t}`)}function x_e(t){return Ol("ENOENT",`no such file or directory, ${t}`)}function b_e(t){return Ol("ENOTDIR",`not a directory, ${t}`)}function Q_e(t){return Ol("EISDIR",`illegal operation on a directory, ${t}`)}function k_e(t){return Ol("EEXIST",`file already exists, ${t}`)}function F_e(t){return Ol("EROFS",`read-only filesystem, ${t}`)}function R_e(t){return Ol("ENOTEMPTY",`directory not empty, ${t}`)}function T_e(t){return Ol("EOPNOTSUPP",`operation not supported, ${t}`)}function bR(){return Ol("ERR_DIR_CLOSED","Directory handle was closed")}var cD=dt(()=>{});var Ml={};Yt(Ml,{BigIntStatsEntry:()=>ny,DEFAULT_MODE:()=>FR,DirEntry:()=>QR,StatEntry:()=>ry,areStatsEqual:()=>RR,clearStats:()=>uD,convertToBigIntStats:()=>L_e,makeDefaultStats:()=>P7,makeEmptyStats:()=>N_e});function P7(){return new ry}function N_e(){return uD(P7())}function uD(t){for(let e in t)if(Object.prototype.hasOwnProperty.call(t,e)){let r=t[e];typeof r=="number"?t[e]=0:typeof r=="bigint"?t[e]=BigInt(0):kR.types.isDate(r)&&(t[e]=new Date(0))}return t}function L_e(t){let e=new ny;for(let r in t)if(Object.prototype.hasOwnProperty.call(t,r)){let o=t[r];typeof o=="number"?e[r]=BigInt(o):kR.types.isDate(o)&&(e[r]=new Date(o))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function RR(t,e){if(t.atimeMs!==e.atimeMs||t.birthtimeMs!==e.birthtimeMs||t.blksize!==e.blksize||t.blocks!==e.blocks||t.ctimeMs!==e.ctimeMs||t.dev!==e.dev||t.gid!==e.gid||t.ino!==e.ino||t.isBlockDevice()!==e.isBlockDevice()||t.isCharacterDevice()!==e.isCharacterDevice()||t.isDirectory()!==e.isDirectory()||t.isFIFO()!==e.isFIFO()||t.isFile()!==e.isFile()||t.isSocket()!==e.isSocket()||t.isSymbolicLink()!==e.isSymbolicLink()||t.mode!==e.mode||t.mtimeMs!==e.mtimeMs||t.nlink!==e.nlink||t.rdev!==e.rdev||t.size!==e.size||t.uid!==e.uid)return!1;let r=t,o=e;return!(r.atimeNs!==o.atimeNs||r.mtimeNs!==o.mtimeNs||r.ctimeNs!==o.ctimeNs||r.birthtimeNs!==o.birthtimeNs)}var kR,FR,QR,ry,ny,TR=dt(()=>{kR=tt(Ie("util")),FR=33188,QR=class{constructor(){this.name="";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},ry=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=FR;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},ny=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(FR);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(61440))===BigInt(16384)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(61440))===BigInt(32768)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(61440))===BigInt(40960)}}});function b7(t){if(process.platform!=="win32")return t;let e,r;if(e=t.match(U_e))t=e[1];else if(r=t.match(__e))t=`\\\\${r[1]?".\\":""}${r[2]}`;else return t;return t.replace(/\//g,"\\")}function NR(t){if(process.platform!=="win32")return t;t=t.replace(/\\/g,"/");let e,r;return(e=t.match(O_e))?t=`/${e[1]}`:(r=t.match(M_e))&&(t=`/unc/${r[1]?".dot/":""}${r[2]}`),t}function AD(t,e){return t===ue?b7(e):NR(e)}function Li(t){if(ue.parse(t).dir!==""||z.parse(t).dir!=="")throw new Error(`Invalid filename: "${t}"`);return t}var TI,wt,Lr,ue,z,x7,O_e,M_e,U_e,__e,Ca=dt(()=>{TI=tt(Ie("path")),wt={root:"/",dot:".",parent:".."},Lr={home:"~",nodeModules:"node_modules",manifest:"package.json",lockfile:"yarn.lock",virtual:"__virtual__",pnpJs:".pnp.js",pnpCjs:".pnp.cjs",pnpData:".pnp.data.json",pnpEsmLoader:".pnp.loader.mjs",rc:".yarnrc.yml"},ue=Object.create(TI.default),z=Object.create(TI.default.posix);ue.cwd=()=>process.cwd();z.cwd=()=>NR(process.cwd());z.resolve=(...t)=>t.length>0&&z.isAbsolute(t[0])?TI.default.posix.resolve(...t):TI.default.posix.resolve(z.cwd(),...t);x7=function(t,e,r){return e=t.normalize(e),r=t.normalize(r),e===r?".":(e.endsWith(t.sep)||(e=e+t.sep),r.startsWith(e)?r.slice(e.length):null)};ue.fromPortablePath=b7;ue.toPortablePath=NR;ue.contains=(t,e)=>x7(ue,t,e);z.contains=(t,e)=>x7(z,t,e);O_e=/^([a-zA-Z]:.*)$/,M_e=/^\/\/(\.\/)?(.*)$/,U_e=/^\/([a-zA-Z]:.*)$/,__e=/^\/unc\/(\.dot\/)?(.*)$/});async function fD(t,e){let r="0123456789abcdef";await t.mkdirPromise(e.indexPath,{recursive:!0});let o=[];for(let a of r)for(let n of r)o.push(t.mkdirPromise(t.pathUtils.join(e.indexPath,`${a}${n}`),{recursive:!0}));return await Promise.all(o),e.indexPath}async function Q7(t,e,r,o,a){let n=t.pathUtils.normalize(e),u=r.pathUtils.normalize(o),A=[],p=[],{atime:h,mtime:E}=a.stableTime?{atime:Rg,mtime:Rg}:await r.lstatPromise(u);await t.mkdirpPromise(t.pathUtils.dirname(e),{utimes:[h,E]}),await LR(A,p,t,n,r,u,{...a,didParentExist:!0});for(let w of A)await w();await Promise.all(p.map(w=>w()))}async function LR(t,e,r,o,a,n,u){var v,b,C;let A=u.didParentExist?await k7(r,o):null,p=await a.lstatPromise(n),{atime:h,mtime:E}=u.stableTime?{atime:Rg,mtime:Rg}:p,w;switch(!0){case p.isDirectory():w=await q_e(t,e,r,o,A,a,n,p,u);break;case p.isFile():w=await W_e(t,e,r,o,A,a,n,p,u);break;case p.isSymbolicLink():w=await Y_e(t,e,r,o,A,a,n,p,u);break;default:throw new Error(`Unsupported file type (${p.mode})`)}return(((v=u.linkStrategy)==null?void 0:v.type)!=="HardlinkFromIndex"||!p.isFile())&&((w||((b=A==null?void 0:A.mtime)==null?void 0:b.getTime())!==E.getTime()||((C=A==null?void 0:A.atime)==null?void 0:C.getTime())!==h.getTime())&&(e.push(()=>r.lutimesPromise(o,h,E)),w=!0),(A===null||(A.mode&511)!==(p.mode&511))&&(e.push(()=>r.chmodPromise(o,p.mode&511)),w=!0)),w}async function k7(t,e){try{return await t.lstatPromise(e)}catch{return null}}async function q_e(t,e,r,o,a,n,u,A,p){if(a!==null&&!a.isDirectory())if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1;let h=!1;a===null&&(t.push(async()=>{try{await r.mkdirPromise(o,{mode:A.mode})}catch(v){if(v.code!=="EEXIST")throw v}}),h=!0);let E=await n.readdirPromise(u),w=p.didParentExist&&!a?{...p,didParentExist:!1}:p;if(p.stableSort)for(let v of E.sort())await LR(t,e,r,r.pathUtils.join(o,v),n,n.pathUtils.join(u,v),w)&&(h=!0);else(await Promise.all(E.map(async b=>{await LR(t,e,r,r.pathUtils.join(o,b),n,n.pathUtils.join(u,b),w)}))).some(b=>b)&&(h=!0);return h}async function j_e(t,e,r,o,a,n,u,A,p,h){let E=await n.checksumFilePromise(u,{algorithm:"sha1"}),w=r.pathUtils.join(h.indexPath,E.slice(0,2),`${E}.dat`),v;(re=>(re[re.Lock=0]="Lock",re[re.Rename=1]="Rename"))(v||(v={}));let b=1,C=await k7(r,w);if(a){let _=C&&a.dev===C.dev&&a.ino===C.ino,V=(C==null?void 0:C.mtimeMs)!==H_e;if(_&&V&&h.autoRepair&&(b=0,C=null),!_)if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1}let R=!C&&b===1?`${w}.${Math.floor(Math.random()*4294967296).toString(16).padStart(8,"0")}`:null,L=!1;return t.push(async()=>{if(!C&&(b===0&&await r.lockPromise(w,async()=>{let _=await n.readFilePromise(u);await r.writeFilePromise(w,_)}),b===1&&R)){let _=await n.readFilePromise(u);await r.writeFilePromise(R,_);try{await r.linkPromise(R,w)}catch(V){if(V.code==="EEXIST")L=!0,await r.unlinkPromise(R);else throw V}}a||await r.linkPromise(w,o)}),e.push(async()=>{C||await r.lutimesPromise(w,Rg,Rg),R&&!L&&await r.unlinkPromise(R)}),!1}async function G_e(t,e,r,o,a,n,u,A,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1;return t.push(async()=>{let h=await n.readFilePromise(u);await r.writeFilePromise(o,h)}),!0}async function W_e(t,e,r,o,a,n,u,A,p){var h;return((h=p.linkStrategy)==null?void 0:h.type)==="HardlinkFromIndex"?j_e(t,e,r,o,a,n,u,A,p,p.linkStrategy):G_e(t,e,r,o,a,n,u,A,p)}async function Y_e(t,e,r,o,a,n,u,A,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1;return t.push(async()=>{await r.symlinkPromise(AD(r.pathUtils,await n.readlinkPromise(u)),o)}),!0}var Rg,H_e,OR=dt(()=>{Ca();Rg=new Date(456789e3*1e3),H_e=Rg.getTime()});function pD(t,e,r,o){let a=()=>{let n=r.shift();return typeof n>"u"?null:Object.assign(t.statSync(t.pathUtils.join(e,n)),{name:n})};return new MR(e,a,o)}var MR,F7=dt(()=>{cD();MR=class{constructor(e,r,o={}){this.path=e;this.nextDirent=r;this.opts=o;this.closed=!1}throwIfClosed(){if(this.closed)throw bR()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let r=this.readSync();return typeof e<"u"?e(null,r):Promise.resolve(r)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e<"u"?e(null):Promise.resolve()}closeSync(){var e,r;this.throwIfClosed(),(r=(e=this.opts).onClose)==null||r.call(e),this.closed=!0}}});function R7(t,e){if(t!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${t}'`)}var T7,iy,N7=dt(()=>{T7=Ie("events");TR();iy=class extends T7.EventEmitter{constructor(r,o,{bigint:a=!1}={}){super();this.status="ready";this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=r,this.path=o,this.bigint=a,this.lastStats=this.stat()}static create(r,o,a){let n=new iy(r,o,a);return n.start(),n}start(){R7(this.status,"ready"),this.status="running",this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit("change",this.lastStats,this.lastStats)},3)}stop(){R7(this.status,"running"),this.status="stopped",this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit("stop")}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch{let o=this.bigint?new ny:new ry;return uD(o)}}makeInterval(r){let o=setInterval(()=>{let a=this.stat(),n=this.lastStats;RR(a,n)||(this.lastStats=a,this.emit("change",a,n))},r.interval);return r.persistent?o:o.unref()}registerChangeListener(r,o){this.addListener("change",r),this.changeListeners.set(r,this.makeInterval(o))}unregisterChangeListener(r){this.removeListener("change",r);let o=this.changeListeners.get(r);typeof o<"u"&&clearInterval(o),this.changeListeners.delete(r)}unregisterAllChangeListeners(){for(let r of this.changeListeners.keys())this.unregisterChangeListener(r)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let r of this.changeListeners.values())r.ref();return this}unref(){for(let r of this.changeListeners.values())r.unref();return this}}});function sy(t,e,r,o){let a,n,u,A;switch(typeof r){case"function":a=!1,n=!0,u=5007,A=r;break;default:({bigint:a=!1,persistent:n=!0,interval:u=5007}=r),A=o;break}let p=hD.get(t);typeof p>"u"&&hD.set(t,p=new Map);let h=p.get(e);return typeof h>"u"&&(h=iy.create(t,e,{bigint:a}),p.set(e,h)),h.registerChangeListener(A,{persistent:n,interval:u}),h}function Tg(t,e,r){let o=hD.get(t);if(typeof o>"u")return;let a=o.get(e);typeof a>"u"||(typeof r>"u"?a.unregisterAllChangeListeners():a.unregisterChangeListener(r),a.hasChangeListeners()||(a.stop(),o.delete(e)))}function Ng(t){let e=hD.get(t);if(!(typeof e>"u"))for(let r of e.keys())Tg(t,r)}var hD,UR=dt(()=>{N7();hD=new WeakMap});function K_e(t){let e=t.match(/\r?\n/g);if(e===null)return O7.EOL;let r=e.filter(a=>a===`\r +`).length,o=e.length-r;return r>o?`\r +`:` +`}function Lg(t,e){return e.replace(/\r?\n/g,K_e(t))}var L7,O7,gf,qu,Og=dt(()=>{L7=Ie("crypto"),O7=Ie("os");OR();Ca();gf=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:r=!1}={}){let o=[e];for(;o.length>0;){let a=o.shift();if((await this.lstatPromise(a)).isDirectory()){let u=await this.readdirPromise(a);if(r)for(let A of u.sort())o.push(this.pathUtils.join(a,A));else throw new Error("Not supported")}else yield a}}async checksumFilePromise(e,{algorithm:r="sha512"}={}){let o=await this.openPromise(e,"r");try{let n=Buffer.allocUnsafeSlow(65536),u=(0,L7.createHash)(r),A=0;for(;(A=await this.readPromise(o,n,0,65536))!==0;)u.update(A===65536?n:n.slice(0,A));return u.digest("hex")}finally{await this.closePromise(o)}}async removePromise(e,{recursive:r=!0,maxRetries:o=5}={}){let a;try{a=await this.lstatPromise(e)}catch(n){if(n.code==="ENOENT")return;throw n}if(a.isDirectory()){if(r){let n=await this.readdirPromise(e);await Promise.all(n.map(u=>this.removePromise(this.pathUtils.resolve(e,u))))}for(let n=0;n<=o;n++)try{await this.rmdirPromise(e);break}catch(u){if(u.code!=="EBUSY"&&u.code!=="ENOTEMPTY")throw u;nsetTimeout(A,n*100))}}else await this.unlinkPromise(e)}removeSync(e,{recursive:r=!0}={}){let o;try{o=this.lstatSync(e)}catch(a){if(a.code==="ENOENT")return;throw a}if(o.isDirectory()){if(r)for(let a of this.readdirSync(e))this.removeSync(this.pathUtils.resolve(e,a));this.rmdirSync(e)}else this.unlinkSync(e)}async mkdirpPromise(e,{chmod:r,utimes:o}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let u=2;u<=a.length;++u){let A=a.slice(0,u).join(this.pathUtils.sep);if(!this.existsSync(A)){try{await this.mkdirPromise(A)}catch(p){if(p.code==="EEXIST")continue;throw p}if(n??(n=A),r!=null&&await this.chmodPromise(A,r),o!=null)await this.utimesPromise(A,o[0],o[1]);else{let p=await this.statPromise(this.pathUtils.dirname(A));await this.utimesPromise(A,p.atime,p.mtime)}}}return n}mkdirpSync(e,{chmod:r,utimes:o}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let u=2;u<=a.length;++u){let A=a.slice(0,u).join(this.pathUtils.sep);if(!this.existsSync(A)){try{this.mkdirSync(A)}catch(p){if(p.code==="EEXIST")continue;throw p}if(n??(n=A),r!=null&&this.chmodSync(A,r),o!=null)this.utimesSync(A,o[0],o[1]);else{let p=this.statSync(this.pathUtils.dirname(A));this.utimesSync(A,p.atime,p.mtime)}}}return n}async copyPromise(e,r,{baseFs:o=this,overwrite:a=!0,stableSort:n=!1,stableTime:u=!1,linkStrategy:A=null}={}){return await Q7(this,e,o,r,{overwrite:a,stableSort:n,stableTime:u,linkStrategy:A})}copySync(e,r,{baseFs:o=this,overwrite:a=!0}={}){let n=o.lstatSync(r),u=this.existsSync(e);if(n.isDirectory()){this.mkdirpSync(e);let p=o.readdirSync(r);for(let h of p)this.copySync(this.pathUtils.join(e,h),o.pathUtils.join(r,h),{baseFs:o,overwrite:a})}else if(n.isFile()){if(!u||a){u&&this.removeSync(e);let p=o.readFileSync(r);this.writeFileSync(e,p)}}else if(n.isSymbolicLink()){if(!u||a){u&&this.removeSync(e);let p=o.readlinkSync(r);this.symlinkSync(AD(this.pathUtils,p),e)}}else throw new Error(`Unsupported file type (file: ${r}, mode: 0o${n.mode.toString(8).padStart(6,"0")})`);let A=n.mode&511;this.chmodSync(e,A)}async changeFilePromise(e,r,o={}){return Buffer.isBuffer(r)?this.changeFileBufferPromise(e,r,o):this.changeFileTextPromise(e,r,o)}async changeFileBufferPromise(e,r,{mode:o}={}){let a=Buffer.alloc(0);try{a=await this.readFilePromise(e)}catch{}Buffer.compare(a,r)!==0&&await this.writeFilePromise(e,r,{mode:o})}async changeFileTextPromise(e,r,{automaticNewlines:o,mode:a}={}){let n="";try{n=await this.readFilePromise(e,"utf8")}catch{}let u=o?Lg(n,r):r;n!==u&&await this.writeFilePromise(e,u,{mode:a})}changeFileSync(e,r,o={}){return Buffer.isBuffer(r)?this.changeFileBufferSync(e,r,o):this.changeFileTextSync(e,r,o)}changeFileBufferSync(e,r,{mode:o}={}){let a=Buffer.alloc(0);try{a=this.readFileSync(e)}catch{}Buffer.compare(a,r)!==0&&this.writeFileSync(e,r,{mode:o})}changeFileTextSync(e,r,{automaticNewlines:o=!1,mode:a}={}){let n="";try{n=this.readFileSync(e,"utf8")}catch{}let u=o?Lg(n,r):r;n!==u&&this.writeFileSync(e,u,{mode:a})}async movePromise(e,r){try{await this.renamePromise(e,r)}catch(o){if(o.code==="EXDEV")await this.copyPromise(r,e),await this.removePromise(e);else throw o}}moveSync(e,r){try{this.renameSync(e,r)}catch(o){if(o.code==="EXDEV")this.copySync(r,e),this.removeSync(e);else throw o}}async lockPromise(e,r){let o=`${e}.flock`,a=1e3/60,n=Date.now(),u=null,A=async()=>{let p;try{[p]=await this.readJsonPromise(o)}catch{return Date.now()-n<500}try{return process.kill(p,0),!0}catch{return!1}};for(;u===null;)try{u=await this.openPromise(o,"wx")}catch(p){if(p.code==="EEXIST"){if(!await A())try{await this.unlinkPromise(o);continue}catch{}if(Date.now()-n<60*1e3)await new Promise(h=>setTimeout(h,a));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${o})`)}else throw p}await this.writePromise(u,JSON.stringify([process.pid]));try{return await r()}finally{try{await this.closePromise(u),await this.unlinkPromise(o)}catch{}}}async readJsonPromise(e){let r=await this.readFilePromise(e,"utf8");try{return JSON.parse(r)}catch(o){throw o.message+=` (in ${e})`,o}}readJsonSync(e){let r=this.readFileSync(e,"utf8");try{return JSON.parse(r)}catch(o){throw o.message+=` (in ${e})`,o}}async writeJsonPromise(e,r){return await this.writeFilePromise(e,`${JSON.stringify(r,null,2)} +`)}writeJsonSync(e,r){return this.writeFileSync(e,`${JSON.stringify(r,null,2)} +`)}async preserveTimePromise(e,r){let o=await this.lstatPromise(e),a=await r();typeof a<"u"&&(e=a),await this.lutimesPromise(e,o.atime,o.mtime)}async preserveTimeSync(e,r){let o=this.lstatSync(e),a=r();typeof a<"u"&&(e=a),this.lutimesSync(e,o.atime,o.mtime)}},qu=class extends gf{constructor(){super(z)}}});var vs,df=dt(()=>{Og();vs=class extends gf{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(e,r,o){return this.baseFs.openPromise(this.mapToBase(e),r,o)}openSync(e,r,o){return this.baseFs.openSync(this.mapToBase(e),r,o)}async opendirPromise(e,r){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),r),{path:e})}opendirSync(e,r){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),r),{path:e})}async readPromise(e,r,o,a,n){return await this.baseFs.readPromise(e,r,o,a,n)}readSync(e,r,o,a,n){return this.baseFs.readSync(e,r,o,a,n)}async writePromise(e,r,o,a,n){return typeof r=="string"?await this.baseFs.writePromise(e,r,o):await this.baseFs.writePromise(e,r,o,a,n)}writeSync(e,r,o,a,n){return typeof r=="string"?this.baseFs.writeSync(e,r,o):this.baseFs.writeSync(e,r,o,a,n)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,r){return this.baseFs.createReadStream(e!==null?this.mapToBase(e):e,r)}createWriteStream(e,r){return this.baseFs.createWriteStream(e!==null?this.mapToBase(e):e,r)}async realpathPromise(e){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(e)))}realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(e)))}async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}accessSync(e,r){return this.baseFs.accessSync(this.mapToBase(e),r)}async accessPromise(e,r){return this.baseFs.accessPromise(this.mapToBase(e),r)}async statPromise(e,r){return this.baseFs.statPromise(this.mapToBase(e),r)}statSync(e,r){return this.baseFs.statSync(this.mapToBase(e),r)}async fstatPromise(e,r){return this.baseFs.fstatPromise(e,r)}fstatSync(e,r){return this.baseFs.fstatSync(e,r)}lstatPromise(e,r){return this.baseFs.lstatPromise(this.mapToBase(e),r)}lstatSync(e,r){return this.baseFs.lstatSync(this.mapToBase(e),r)}async fchmodPromise(e,r){return this.baseFs.fchmodPromise(e,r)}fchmodSync(e,r){return this.baseFs.fchmodSync(e,r)}async chmodPromise(e,r){return this.baseFs.chmodPromise(this.mapToBase(e),r)}chmodSync(e,r){return this.baseFs.chmodSync(this.mapToBase(e),r)}async fchownPromise(e,r,o){return this.baseFs.fchownPromise(e,r,o)}fchownSync(e,r,o){return this.baseFs.fchownSync(e,r,o)}async chownPromise(e,r,o){return this.baseFs.chownPromise(this.mapToBase(e),r,o)}chownSync(e,r,o){return this.baseFs.chownSync(this.mapToBase(e),r,o)}async renamePromise(e,r){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(r))}renameSync(e,r){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(r))}async copyFilePromise(e,r,o=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(r),o)}copyFileSync(e,r,o=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(r),o)}async appendFilePromise(e,r,o){return this.baseFs.appendFilePromise(this.fsMapToBase(e),r,o)}appendFileSync(e,r,o){return this.baseFs.appendFileSync(this.fsMapToBase(e),r,o)}async writeFilePromise(e,r,o){return this.baseFs.writeFilePromise(this.fsMapToBase(e),r,o)}writeFileSync(e,r,o){return this.baseFs.writeFileSync(this.fsMapToBase(e),r,o)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,r,o){return this.baseFs.utimesPromise(this.mapToBase(e),r,o)}utimesSync(e,r,o){return this.baseFs.utimesSync(this.mapToBase(e),r,o)}async lutimesPromise(e,r,o){return this.baseFs.lutimesPromise(this.mapToBase(e),r,o)}lutimesSync(e,r,o){return this.baseFs.lutimesSync(this.mapToBase(e),r,o)}async mkdirPromise(e,r){return this.baseFs.mkdirPromise(this.mapToBase(e),r)}mkdirSync(e,r){return this.baseFs.mkdirSync(this.mapToBase(e),r)}async rmdirPromise(e,r){return this.baseFs.rmdirPromise(this.mapToBase(e),r)}rmdirSync(e,r){return this.baseFs.rmdirSync(this.mapToBase(e),r)}async linkPromise(e,r){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(r))}linkSync(e,r){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(r))}async symlinkPromise(e,r,o){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkPromise(this.mapToBase(e),a,o);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),u=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkPromise(u,a,o)}symlinkSync(e,r,o){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkSync(this.mapToBase(e),a,o);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),u=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkSync(u,a,o)}async readFilePromise(e,r){return this.baseFs.readFilePromise(this.fsMapToBase(e),r)}readFileSync(e,r){return this.baseFs.readFileSync(this.fsMapToBase(e),r)}async readdirPromise(e,r){return this.baseFs.readdirPromise(this.mapToBase(e),r)}readdirSync(e,r){return this.baseFs.readdirSync(this.mapToBase(e),r)}async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(e)))}readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(e)))}async truncatePromise(e,r){return this.baseFs.truncatePromise(this.mapToBase(e),r)}truncateSync(e,r){return this.baseFs.truncateSync(this.mapToBase(e),r)}async ftruncatePromise(e,r){return this.baseFs.ftruncatePromise(e,r)}ftruncateSync(e,r){return this.baseFs.ftruncateSync(e,r)}watch(e,r,o){return this.baseFs.watch(this.mapToBase(e),r,o)}watchFile(e,r,o){return this.baseFs.watchFile(this.mapToBase(e),r,o)}unwatchFile(e,r){return this.baseFs.unwatchFile(this.mapToBase(e),r)}fsMapToBase(e){return typeof e=="number"?e:this.mapToBase(e)}}});var ju,M7=dt(()=>{df();ju=class extends vs{constructor(r,{baseFs:o,pathUtils:a}){super(a);this.target=r,this.baseFs=o}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(r){return r}mapToBase(r){return r}}});var U7,xn,Mg=dt(()=>{U7=tt(Ie("fs"));Og();Ca();xn=class extends qu{constructor(r=U7.default){super();this.realFs=r}getExtractHint(){return!1}getRealPath(){return wt.root}resolve(r){return z.resolve(r)}async openPromise(r,o,a){return await new Promise((n,u)=>{this.realFs.open(ue.fromPortablePath(r),o,a,this.makeCallback(n,u))})}openSync(r,o,a){return this.realFs.openSync(ue.fromPortablePath(r),o,a)}async opendirPromise(r,o){return await new Promise((a,n)=>{typeof o<"u"?this.realFs.opendir(ue.fromPortablePath(r),o,this.makeCallback(a,n)):this.realFs.opendir(ue.fromPortablePath(r),this.makeCallback(a,n))}).then(a=>Object.defineProperty(a,"path",{value:r,configurable:!0,writable:!0}))}opendirSync(r,o){let a=typeof o<"u"?this.realFs.opendirSync(ue.fromPortablePath(r),o):this.realFs.opendirSync(ue.fromPortablePath(r));return Object.defineProperty(a,"path",{value:r,configurable:!0,writable:!0})}async readPromise(r,o,a=0,n=0,u=-1){return await new Promise((A,p)=>{this.realFs.read(r,o,a,n,u,(h,E)=>{h?p(h):A(E)})})}readSync(r,o,a,n,u){return this.realFs.readSync(r,o,a,n,u)}async writePromise(r,o,a,n,u){return await new Promise((A,p)=>typeof o=="string"?this.realFs.write(r,o,a,this.makeCallback(A,p)):this.realFs.write(r,o,a,n,u,this.makeCallback(A,p)))}writeSync(r,o,a,n,u){return typeof o=="string"?this.realFs.writeSync(r,o,a):this.realFs.writeSync(r,o,a,n,u)}async closePromise(r){await new Promise((o,a)=>{this.realFs.close(r,this.makeCallback(o,a))})}closeSync(r){this.realFs.closeSync(r)}createReadStream(r,o){let a=r!==null?ue.fromPortablePath(r):r;return this.realFs.createReadStream(a,o)}createWriteStream(r,o){let a=r!==null?ue.fromPortablePath(r):r;return this.realFs.createWriteStream(a,o)}async realpathPromise(r){return await new Promise((o,a)=>{this.realFs.realpath(ue.fromPortablePath(r),{},this.makeCallback(o,a))}).then(o=>ue.toPortablePath(o))}realpathSync(r){return ue.toPortablePath(this.realFs.realpathSync(ue.fromPortablePath(r),{}))}async existsPromise(r){return await new Promise(o=>{this.realFs.exists(ue.fromPortablePath(r),o)})}accessSync(r,o){return this.realFs.accessSync(ue.fromPortablePath(r),o)}async accessPromise(r,o){return await new Promise((a,n)=>{this.realFs.access(ue.fromPortablePath(r),o,this.makeCallback(a,n))})}existsSync(r){return this.realFs.existsSync(ue.fromPortablePath(r))}async statPromise(r,o){return await new Promise((a,n)=>{o?this.realFs.stat(ue.fromPortablePath(r),o,this.makeCallback(a,n)):this.realFs.stat(ue.fromPortablePath(r),this.makeCallback(a,n))})}statSync(r,o){return o?this.realFs.statSync(ue.fromPortablePath(r),o):this.realFs.statSync(ue.fromPortablePath(r))}async fstatPromise(r,o){return await new Promise((a,n)=>{o?this.realFs.fstat(r,o,this.makeCallback(a,n)):this.realFs.fstat(r,this.makeCallback(a,n))})}fstatSync(r,o){return o?this.realFs.fstatSync(r,o):this.realFs.fstatSync(r)}async lstatPromise(r,o){return await new Promise((a,n)=>{o?this.realFs.lstat(ue.fromPortablePath(r),o,this.makeCallback(a,n)):this.realFs.lstat(ue.fromPortablePath(r),this.makeCallback(a,n))})}lstatSync(r,o){return o?this.realFs.lstatSync(ue.fromPortablePath(r),o):this.realFs.lstatSync(ue.fromPortablePath(r))}async fchmodPromise(r,o){return await new Promise((a,n)=>{this.realFs.fchmod(r,o,this.makeCallback(a,n))})}fchmodSync(r,o){return this.realFs.fchmodSync(r,o)}async chmodPromise(r,o){return await new Promise((a,n)=>{this.realFs.chmod(ue.fromPortablePath(r),o,this.makeCallback(a,n))})}chmodSync(r,o){return this.realFs.chmodSync(ue.fromPortablePath(r),o)}async fchownPromise(r,o,a){return await new Promise((n,u)=>{this.realFs.fchown(r,o,a,this.makeCallback(n,u))})}fchownSync(r,o,a){return this.realFs.fchownSync(r,o,a)}async chownPromise(r,o,a){return await new Promise((n,u)=>{this.realFs.chown(ue.fromPortablePath(r),o,a,this.makeCallback(n,u))})}chownSync(r,o,a){return this.realFs.chownSync(ue.fromPortablePath(r),o,a)}async renamePromise(r,o){return await new Promise((a,n)=>{this.realFs.rename(ue.fromPortablePath(r),ue.fromPortablePath(o),this.makeCallback(a,n))})}renameSync(r,o){return this.realFs.renameSync(ue.fromPortablePath(r),ue.fromPortablePath(o))}async copyFilePromise(r,o,a=0){return await new Promise((n,u)=>{this.realFs.copyFile(ue.fromPortablePath(r),ue.fromPortablePath(o),a,this.makeCallback(n,u))})}copyFileSync(r,o,a=0){return this.realFs.copyFileSync(ue.fromPortablePath(r),ue.fromPortablePath(o),a)}async appendFilePromise(r,o,a){return await new Promise((n,u)=>{let A=typeof r=="string"?ue.fromPortablePath(r):r;a?this.realFs.appendFile(A,o,a,this.makeCallback(n,u)):this.realFs.appendFile(A,o,this.makeCallback(n,u))})}appendFileSync(r,o,a){let n=typeof r=="string"?ue.fromPortablePath(r):r;a?this.realFs.appendFileSync(n,o,a):this.realFs.appendFileSync(n,o)}async writeFilePromise(r,o,a){return await new Promise((n,u)=>{let A=typeof r=="string"?ue.fromPortablePath(r):r;a?this.realFs.writeFile(A,o,a,this.makeCallback(n,u)):this.realFs.writeFile(A,o,this.makeCallback(n,u))})}writeFileSync(r,o,a){let n=typeof r=="string"?ue.fromPortablePath(r):r;a?this.realFs.writeFileSync(n,o,a):this.realFs.writeFileSync(n,o)}async unlinkPromise(r){return await new Promise((o,a)=>{this.realFs.unlink(ue.fromPortablePath(r),this.makeCallback(o,a))})}unlinkSync(r){return this.realFs.unlinkSync(ue.fromPortablePath(r))}async utimesPromise(r,o,a){return await new Promise((n,u)=>{this.realFs.utimes(ue.fromPortablePath(r),o,a,this.makeCallback(n,u))})}utimesSync(r,o,a){this.realFs.utimesSync(ue.fromPortablePath(r),o,a)}async lutimesPromise(r,o,a){return await new Promise((n,u)=>{this.realFs.lutimes(ue.fromPortablePath(r),o,a,this.makeCallback(n,u))})}lutimesSync(r,o,a){this.realFs.lutimesSync(ue.fromPortablePath(r),o,a)}async mkdirPromise(r,o){return await new Promise((a,n)=>{this.realFs.mkdir(ue.fromPortablePath(r),o,this.makeCallback(a,n))})}mkdirSync(r,o){return this.realFs.mkdirSync(ue.fromPortablePath(r),o)}async rmdirPromise(r,o){return await new Promise((a,n)=>{o?this.realFs.rmdir(ue.fromPortablePath(r),o,this.makeCallback(a,n)):this.realFs.rmdir(ue.fromPortablePath(r),this.makeCallback(a,n))})}rmdirSync(r,o){return this.realFs.rmdirSync(ue.fromPortablePath(r),o)}async linkPromise(r,o){return await new Promise((a,n)=>{this.realFs.link(ue.fromPortablePath(r),ue.fromPortablePath(o),this.makeCallback(a,n))})}linkSync(r,o){return this.realFs.linkSync(ue.fromPortablePath(r),ue.fromPortablePath(o))}async symlinkPromise(r,o,a){return await new Promise((n,u)=>{this.realFs.symlink(ue.fromPortablePath(r.replace(/\/+$/,"")),ue.fromPortablePath(o),a,this.makeCallback(n,u))})}symlinkSync(r,o,a){return this.realFs.symlinkSync(ue.fromPortablePath(r.replace(/\/+$/,"")),ue.fromPortablePath(o),a)}async readFilePromise(r,o){return await new Promise((a,n)=>{let u=typeof r=="string"?ue.fromPortablePath(r):r;this.realFs.readFile(u,o,this.makeCallback(a,n))})}readFileSync(r,o){let a=typeof r=="string"?ue.fromPortablePath(r):r;return this.realFs.readFileSync(a,o)}async readdirPromise(r,o){return await new Promise((a,n)=>{o!=null&&o.withFileTypes?this.realFs.readdir(ue.fromPortablePath(r),{withFileTypes:!0},this.makeCallback(a,n)):this.realFs.readdir(ue.fromPortablePath(r),this.makeCallback(u=>a(u),n))})}readdirSync(r,o){return o!=null&&o.withFileTypes?this.realFs.readdirSync(ue.fromPortablePath(r),{withFileTypes:!0}):this.realFs.readdirSync(ue.fromPortablePath(r))}async readlinkPromise(r){return await new Promise((o,a)=>{this.realFs.readlink(ue.fromPortablePath(r),this.makeCallback(o,a))}).then(o=>ue.toPortablePath(o))}readlinkSync(r){return ue.toPortablePath(this.realFs.readlinkSync(ue.fromPortablePath(r)))}async truncatePromise(r,o){return await new Promise((a,n)=>{this.realFs.truncate(ue.fromPortablePath(r),o,this.makeCallback(a,n))})}truncateSync(r,o){return this.realFs.truncateSync(ue.fromPortablePath(r),o)}async ftruncatePromise(r,o){return await new Promise((a,n)=>{this.realFs.ftruncate(r,o,this.makeCallback(a,n))})}ftruncateSync(r,o){return this.realFs.ftruncateSync(r,o)}watch(r,o,a){return this.realFs.watch(ue.fromPortablePath(r),o,a)}watchFile(r,o,a){return this.realFs.watchFile(ue.fromPortablePath(r),o,a)}unwatchFile(r,o){return this.realFs.unwatchFile(ue.fromPortablePath(r),o)}makeCallback(r,o){return(a,n)=>{a?o(a):r(n)}}}});var An,_7=dt(()=>{Mg();df();Ca();An=class extends vs{constructor(r,{baseFs:o=new xn}={}){super(z);this.target=this.pathUtils.normalize(r),this.baseFs=o}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(r){return this.pathUtils.isAbsolute(r)?z.normalize(r):this.baseFs.resolve(z.join(this.target,r))}mapFromBase(r){return r}mapToBase(r){return this.pathUtils.isAbsolute(r)?r:this.pathUtils.join(this.target,r)}}});var H7,Gu,q7=dt(()=>{Mg();df();Ca();H7=wt.root,Gu=class extends vs{constructor(r,{baseFs:o=new xn}={}){super(z);this.target=this.pathUtils.resolve(wt.root,r),this.baseFs=o}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(wt.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(r){let o=this.pathUtils.normalize(r);if(this.pathUtils.isAbsolute(r))return this.pathUtils.resolve(this.target,this.pathUtils.relative(H7,r));if(o.match(/^\.\.\/?/))throw new Error(`Resolving this path (${r}) would escape the jail`);return this.pathUtils.resolve(this.target,r)}mapFromBase(r){return this.pathUtils.resolve(H7,this.pathUtils.relative(this.target,r))}}});var oy,j7=dt(()=>{df();oy=class extends vs{constructor(r,o){super(o);this.instance=null;this.factory=r}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(r){this.instance=r}mapFromBase(r){return r}mapToBase(r){return r}}});var Ug,Ea,Up,G7=dt(()=>{Ug=Ie("fs");Og();Mg();UR();cD();Ca();Ea=4278190080,Up=class extends qu{constructor({baseFs:r=new xn,filter:o=null,magicByte:a=42,maxOpenFiles:n=1/0,useCache:u=!0,maxAge:A=5e3,typeCheck:p=Ug.constants.S_IFREG,getMountPoint:h,factoryPromise:E,factorySync:w}){if(Math.floor(a)!==a||!(a>1&&a<=127))throw new Error("The magic byte must be set to a round value between 1 and 127 included");super();this.fdMap=new Map;this.nextFd=3;this.isMount=new Set;this.notMount=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.baseFs=r,this.mountInstances=u?new Map:null,this.factoryPromise=E,this.factorySync=w,this.filter=o,this.getMountPoint=h,this.magic=a<<24,this.maxAge=A,this.maxOpenFiles=n,this.typeCheck=p}getExtractHint(r){return this.baseFs.getExtractHint(r)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){var r;if(Ng(this),this.mountInstances)for(let[o,{childFs:a}]of this.mountInstances.entries())(r=a.saveAndClose)==null||r.call(a),this.mountInstances.delete(o)}discardAndClose(){var r;if(Ng(this),this.mountInstances)for(let[o,{childFs:a}]of this.mountInstances.entries())(r=a.discardAndClose)==null||r.call(a),this.mountInstances.delete(o)}resolve(r){return this.baseFs.resolve(r)}remapFd(r,o){let a=this.nextFd++|this.magic;return this.fdMap.set(a,[r,o]),a}async openPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.openPromise(r,o,a),async(n,{subPath:u})=>this.remapFd(n,await n.openPromise(u,o,a)))}openSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.openSync(r,o,a),(n,{subPath:u})=>this.remapFd(n,n.openSync(u,o,a)))}async opendirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.opendirPromise(r,o),async(a,{subPath:n})=>await a.opendirPromise(n,o),{requireSubpath:!1})}opendirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.opendirSync(r,o),(a,{subPath:n})=>a.opendirSync(n,o),{requireSubpath:!1})}async readPromise(r,o,a,n,u){if((r&Ea)!==this.magic)return await this.baseFs.readPromise(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>"u")throw Eo("read");let[p,h]=A;return await p.readPromise(h,o,a,n,u)}readSync(r,o,a,n,u){if((r&Ea)!==this.magic)return this.baseFs.readSync(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>"u")throw Eo("readSync");let[p,h]=A;return p.readSync(h,o,a,n,u)}async writePromise(r,o,a,n,u){if((r&Ea)!==this.magic)return typeof o=="string"?await this.baseFs.writePromise(r,o,a):await this.baseFs.writePromise(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>"u")throw Eo("write");let[p,h]=A;return typeof o=="string"?await p.writePromise(h,o,a):await p.writePromise(h,o,a,n,u)}writeSync(r,o,a,n,u){if((r&Ea)!==this.magic)return typeof o=="string"?this.baseFs.writeSync(r,o,a):this.baseFs.writeSync(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>"u")throw Eo("writeSync");let[p,h]=A;return typeof o=="string"?p.writeSync(h,o,a):p.writeSync(h,o,a,n,u)}async closePromise(r){if((r&Ea)!==this.magic)return await this.baseFs.closePromise(r);let o=this.fdMap.get(r);if(typeof o>"u")throw Eo("close");this.fdMap.delete(r);let[a,n]=o;return await a.closePromise(n)}closeSync(r){if((r&Ea)!==this.magic)return this.baseFs.closeSync(r);let o=this.fdMap.get(r);if(typeof o>"u")throw Eo("closeSync");this.fdMap.delete(r);let[a,n]=o;return a.closeSync(n)}createReadStream(r,o){return r===null?this.baseFs.createReadStream(r,o):this.makeCallSync(r,()=>this.baseFs.createReadStream(r,o),(a,{archivePath:n,subPath:u})=>{let A=a.createReadStream(u,o);return A.path=ue.fromPortablePath(this.pathUtils.join(n,u)),A})}createWriteStream(r,o){return r===null?this.baseFs.createWriteStream(r,o):this.makeCallSync(r,()=>this.baseFs.createWriteStream(r,o),(a,{subPath:n})=>a.createWriteStream(n,o))}async realpathPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.realpathPromise(r),async(o,{archivePath:a,subPath:n})=>{let u=this.realPaths.get(a);return typeof u>"u"&&(u=await this.baseFs.realpathPromise(a),this.realPaths.set(a,u)),this.pathUtils.join(u,this.pathUtils.relative(wt.root,await o.realpathPromise(n)))})}realpathSync(r){return this.makeCallSync(r,()=>this.baseFs.realpathSync(r),(o,{archivePath:a,subPath:n})=>{let u=this.realPaths.get(a);return typeof u>"u"&&(u=this.baseFs.realpathSync(a),this.realPaths.set(a,u)),this.pathUtils.join(u,this.pathUtils.relative(wt.root,o.realpathSync(n)))})}async existsPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.existsPromise(r),async(o,{subPath:a})=>await o.existsPromise(a))}existsSync(r){return this.makeCallSync(r,()=>this.baseFs.existsSync(r),(o,{subPath:a})=>o.existsSync(a))}async accessPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.accessPromise(r,o),async(a,{subPath:n})=>await a.accessPromise(n,o))}accessSync(r,o){return this.makeCallSync(r,()=>this.baseFs.accessSync(r,o),(a,{subPath:n})=>a.accessSync(n,o))}async statPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.statPromise(r,o),async(a,{subPath:n})=>await a.statPromise(n,o))}statSync(r,o){return this.makeCallSync(r,()=>this.baseFs.statSync(r,o),(a,{subPath:n})=>a.statSync(n,o))}async fstatPromise(r,o){if((r&Ea)!==this.magic)return this.baseFs.fstatPromise(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw Eo("fstat");let[n,u]=a;return n.fstatPromise(u,o)}fstatSync(r,o){if((r&Ea)!==this.magic)return this.baseFs.fstatSync(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw Eo("fstatSync");let[n,u]=a;return n.fstatSync(u,o)}async lstatPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.lstatPromise(r,o),async(a,{subPath:n})=>await a.lstatPromise(n,o))}lstatSync(r,o){return this.makeCallSync(r,()=>this.baseFs.lstatSync(r,o),(a,{subPath:n})=>a.lstatSync(n,o))}async fchmodPromise(r,o){if((r&Ea)!==this.magic)return this.baseFs.fchmodPromise(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw Eo("fchmod");let[n,u]=a;return n.fchmodPromise(u,o)}fchmodSync(r,o){if((r&Ea)!==this.magic)return this.baseFs.fchmodSync(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw Eo("fchmodSync");let[n,u]=a;return n.fchmodSync(u,o)}async chmodPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.chmodPromise(r,o),async(a,{subPath:n})=>await a.chmodPromise(n,o))}chmodSync(r,o){return this.makeCallSync(r,()=>this.baseFs.chmodSync(r,o),(a,{subPath:n})=>a.chmodSync(n,o))}async fchownPromise(r,o,a){if((r&Ea)!==this.magic)return this.baseFs.fchownPromise(r,o,a);let n=this.fdMap.get(r);if(typeof n>"u")throw Eo("fchown");let[u,A]=n;return u.fchownPromise(A,o,a)}fchownSync(r,o,a){if((r&Ea)!==this.magic)return this.baseFs.fchownSync(r,o,a);let n=this.fdMap.get(r);if(typeof n>"u")throw Eo("fchownSync");let[u,A]=n;return u.fchownSync(A,o,a)}async chownPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.chownPromise(r,o,a),async(n,{subPath:u})=>await n.chownPromise(u,o,a))}chownSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.chownSync(r,o,a),(n,{subPath:u})=>n.chownSync(u,o,a))}async renamePromise(r,o){return await this.makeCallPromise(r,async()=>await this.makeCallPromise(o,async()=>await this.baseFs.renamePromise(r,o),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),async(a,{subPath:n})=>await this.makeCallPromise(o,async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},async(u,{subPath:A})=>{if(a!==u)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return await a.renamePromise(n,A)}))}renameSync(r,o){return this.makeCallSync(r,()=>this.makeCallSync(o,()=>this.baseFs.renameSync(r,o),()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),(a,{subPath:n})=>this.makeCallSync(o,()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},(u,{subPath:A})=>{if(a!==u)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return a.renameSync(n,A)}))}async copyFilePromise(r,o,a=0){let n=async(u,A,p,h)=>{if((a&Ug.constants.COPYFILE_FICLONE_FORCE)!==0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${A}' -> ${h}'`),{code:"EXDEV"});if(a&Ug.constants.COPYFILE_EXCL&&await this.existsPromise(A))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${A}' -> '${h}'`),{code:"EEXIST"});let E;try{E=await u.readFilePromise(A)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${A}' -> '${h}'`),{code:"EINVAL"})}await p.writeFilePromise(h,E)};return await this.makeCallPromise(r,async()=>await this.makeCallPromise(o,async()=>await this.baseFs.copyFilePromise(r,o,a),async(u,{subPath:A})=>await n(this.baseFs,r,u,A)),async(u,{subPath:A})=>await this.makeCallPromise(o,async()=>await n(u,A,this.baseFs,o),async(p,{subPath:h})=>u!==p?await n(u,A,p,h):await u.copyFilePromise(A,h,a)))}copyFileSync(r,o,a=0){let n=(u,A,p,h)=>{if((a&Ug.constants.COPYFILE_FICLONE_FORCE)!==0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${A}' -> ${h}'`),{code:"EXDEV"});if(a&Ug.constants.COPYFILE_EXCL&&this.existsSync(A))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${A}' -> '${h}'`),{code:"EEXIST"});let E;try{E=u.readFileSync(A)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${A}' -> '${h}'`),{code:"EINVAL"})}p.writeFileSync(h,E)};return this.makeCallSync(r,()=>this.makeCallSync(o,()=>this.baseFs.copyFileSync(r,o,a),(u,{subPath:A})=>n(this.baseFs,r,u,A)),(u,{subPath:A})=>this.makeCallSync(o,()=>n(u,A,this.baseFs,o),(p,{subPath:h})=>u!==p?n(u,A,p,h):u.copyFileSync(A,h,a)))}async appendFilePromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.appendFilePromise(r,o,a),async(n,{subPath:u})=>await n.appendFilePromise(u,o,a))}appendFileSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.appendFileSync(r,o,a),(n,{subPath:u})=>n.appendFileSync(u,o,a))}async writeFilePromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.writeFilePromise(r,o,a),async(n,{subPath:u})=>await n.writeFilePromise(u,o,a))}writeFileSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.writeFileSync(r,o,a),(n,{subPath:u})=>n.writeFileSync(u,o,a))}async unlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.unlinkPromise(r),async(o,{subPath:a})=>await o.unlinkPromise(a))}unlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.unlinkSync(r),(o,{subPath:a})=>o.unlinkSync(a))}async utimesPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.utimesPromise(r,o,a),async(n,{subPath:u})=>await n.utimesPromise(u,o,a))}utimesSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.utimesSync(r,o,a),(n,{subPath:u})=>n.utimesSync(u,o,a))}async lutimesPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.lutimesPromise(r,o,a),async(n,{subPath:u})=>await n.lutimesPromise(u,o,a))}lutimesSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.lutimesSync(r,o,a),(n,{subPath:u})=>n.lutimesSync(u,o,a))}async mkdirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.mkdirPromise(r,o),async(a,{subPath:n})=>await a.mkdirPromise(n,o))}mkdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.mkdirSync(r,o),(a,{subPath:n})=>a.mkdirSync(n,o))}async rmdirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.rmdirPromise(r,o),async(a,{subPath:n})=>await a.rmdirPromise(n,o))}rmdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.rmdirSync(r,o),(a,{subPath:n})=>a.rmdirSync(n,o))}async linkPromise(r,o){return await this.makeCallPromise(o,async()=>await this.baseFs.linkPromise(r,o),async(a,{subPath:n})=>await a.linkPromise(r,n))}linkSync(r,o){return this.makeCallSync(o,()=>this.baseFs.linkSync(r,o),(a,{subPath:n})=>a.linkSync(r,n))}async symlinkPromise(r,o,a){return await this.makeCallPromise(o,async()=>await this.baseFs.symlinkPromise(r,o,a),async(n,{subPath:u})=>await n.symlinkPromise(r,u))}symlinkSync(r,o,a){return this.makeCallSync(o,()=>this.baseFs.symlinkSync(r,o,a),(n,{subPath:u})=>n.symlinkSync(r,u))}async readFilePromise(r,o){return this.makeCallPromise(r,async()=>await this.baseFs.readFilePromise(r,o),async(a,{subPath:n})=>await a.readFilePromise(n,o))}readFileSync(r,o){return this.makeCallSync(r,()=>this.baseFs.readFileSync(r,o),(a,{subPath:n})=>a.readFileSync(n,o))}async readdirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.readdirPromise(r,o),async(a,{subPath:n})=>await a.readdirPromise(n,o),{requireSubpath:!1})}readdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.readdirSync(r,o),(a,{subPath:n})=>a.readdirSync(n,o),{requireSubpath:!1})}async readlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.readlinkPromise(r),async(o,{subPath:a})=>await o.readlinkPromise(a))}readlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.readlinkSync(r),(o,{subPath:a})=>o.readlinkSync(a))}async truncatePromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.truncatePromise(r,o),async(a,{subPath:n})=>await a.truncatePromise(n,o))}truncateSync(r,o){return this.makeCallSync(r,()=>this.baseFs.truncateSync(r,o),(a,{subPath:n})=>a.truncateSync(n,o))}async ftruncatePromise(r,o){if((r&Ea)!==this.magic)return this.baseFs.ftruncatePromise(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw Eo("ftruncate");let[n,u]=a;return n.ftruncatePromise(u,o)}ftruncateSync(r,o){if((r&Ea)!==this.magic)return this.baseFs.ftruncateSync(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw Eo("ftruncateSync");let[n,u]=a;return n.ftruncateSync(u,o)}watch(r,o,a){return this.makeCallSync(r,()=>this.baseFs.watch(r,o,a),(n,{subPath:u})=>n.watch(u,o,a))}watchFile(r,o,a){return this.makeCallSync(r,()=>this.baseFs.watchFile(r,o,a),()=>sy(this,r,o,a))}unwatchFile(r,o){return this.makeCallSync(r,()=>this.baseFs.unwatchFile(r,o),()=>Tg(this,r,o))}async makeCallPromise(r,o,a,{requireSubpath:n=!0}={}){if(typeof r!="string")return await o();let u=this.resolve(r),A=this.findMount(u);return A?n&&A.subPath==="/"?await o():await this.getMountPromise(A.archivePath,async p=>await a(p,A)):await o()}makeCallSync(r,o,a,{requireSubpath:n=!0}={}){if(typeof r!="string")return o();let u=this.resolve(r),A=this.findMount(u);return!A||n&&A.subPath==="/"?o():this.getMountSync(A.archivePath,p=>a(p,A))}findMount(r){if(this.filter&&!this.filter.test(r))return null;let o="";for(;;){let a=r.substring(o.length),n=this.getMountPoint(a,o);if(!n)return null;if(o=this.pathUtils.join(o,n),!this.isMount.has(o)){if(this.notMount.has(o))continue;try{if(this.typeCheck!==null&&(this.baseFs.lstatSync(o).mode&Ug.constants.S_IFMT)!==this.typeCheck){this.notMount.add(o);continue}}catch{return null}this.isMount.add(o)}return{archivePath:o,subPath:this.pathUtils.join(wt.root,r.substring(o.length))}}}limitOpenFiles(r){var u,A,p;if(this.mountInstances===null)return;let o=Date.now(),a=o+this.maxAge,n=r===null?0:this.mountInstances.size-r;for(let[h,{childFs:E,expiresAt:w,refCount:v}]of this.mountInstances.entries())if(!(v!==0||((u=E.hasOpenFileHandles)==null?void 0:u.call(E)))){if(o>=w){(A=E.saveAndClose)==null||A.call(E),this.mountInstances.delete(h),n-=1;continue}else if(r===null||n<=0){a=w;break}(p=E.saveAndClose)==null||p.call(E),this.mountInstances.delete(h),n-=1}this.limitOpenFilesTimeout===null&&(r===null&&this.mountInstances.size>0||r!==null)&&isFinite(a)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},a-o).unref())}async getMountPromise(r,o){var a;if(this.mountInstances){let n=this.mountInstances.get(r);if(!n){let u=await this.factoryPromise(this.baseFs,r);n=this.mountInstances.get(r),n||(n={childFs:u(),expiresAt:0,refCount:0})}this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,n),n.expiresAt=Date.now()+this.maxAge,n.refCount+=1;try{return await o(n.childFs)}finally{n.refCount-=1}}else{let n=(await this.factoryPromise(this.baseFs,r))();try{return await o(n)}finally{(a=n.saveAndClose)==null||a.call(n)}}}getMountSync(r,o){var a;if(this.mountInstances){let n=this.mountInstances.get(r);return n||(n={childFs:this.factorySync(this.baseFs,r),expiresAt:0,refCount:0}),this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,n),n.expiresAt=Date.now()+this.maxAge,o(n.childFs)}else{let n=this.factorySync(this.baseFs,r);try{return o(n)}finally{(a=n.saveAndClose)==null||a.call(n)}}}}});var zt,_R,NI,W7=dt(()=>{Og();Ca();zt=()=>Object.assign(new Error("ENOSYS: unsupported filesystem access"),{code:"ENOSYS"}),_R=class extends gf{constructor(){super(z)}getExtractHint(){throw zt()}getRealPath(){throw zt()}resolve(){throw zt()}async openPromise(){throw zt()}openSync(){throw zt()}async opendirPromise(){throw zt()}opendirSync(){throw zt()}async readPromise(){throw zt()}readSync(){throw zt()}async writePromise(){throw zt()}writeSync(){throw zt()}async closePromise(){throw zt()}closeSync(){throw zt()}createWriteStream(){throw zt()}createReadStream(){throw zt()}async realpathPromise(){throw zt()}realpathSync(){throw zt()}async readdirPromise(){throw zt()}readdirSync(){throw zt()}async existsPromise(e){throw zt()}existsSync(e){throw zt()}async accessPromise(){throw zt()}accessSync(){throw zt()}async statPromise(){throw zt()}statSync(){throw zt()}async fstatPromise(e){throw zt()}fstatSync(e){throw zt()}async lstatPromise(e){throw zt()}lstatSync(e){throw zt()}async fchmodPromise(){throw zt()}fchmodSync(){throw zt()}async chmodPromise(){throw zt()}chmodSync(){throw zt()}async fchownPromise(){throw zt()}fchownSync(){throw zt()}async chownPromise(){throw zt()}chownSync(){throw zt()}async mkdirPromise(){throw zt()}mkdirSync(){throw zt()}async rmdirPromise(){throw zt()}rmdirSync(){throw zt()}async linkPromise(){throw zt()}linkSync(){throw zt()}async symlinkPromise(){throw zt()}symlinkSync(){throw zt()}async renamePromise(){throw zt()}renameSync(){throw zt()}async copyFilePromise(){throw zt()}copyFileSync(){throw zt()}async appendFilePromise(){throw zt()}appendFileSync(){throw zt()}async writeFilePromise(){throw zt()}writeFileSync(){throw zt()}async unlinkPromise(){throw zt()}unlinkSync(){throw zt()}async utimesPromise(){throw zt()}utimesSync(){throw zt()}async lutimesPromise(){throw zt()}lutimesSync(){throw zt()}async readFilePromise(){throw zt()}readFileSync(){throw zt()}async readlinkPromise(){throw zt()}readlinkSync(){throw zt()}async truncatePromise(){throw zt()}truncateSync(){throw zt()}async ftruncatePromise(e,r){throw zt()}ftruncateSync(e,r){throw zt()}watch(){throw zt()}watchFile(){throw zt()}unwatchFile(){throw zt()}},NI=_R;NI.instance=new _R});var _p,Y7=dt(()=>{df();Ca();_p=class extends vs{constructor(r){super(ue);this.baseFs=r}mapFromBase(r){return ue.fromPortablePath(r)}mapToBase(r){return ue.toPortablePath(r)}}});var V_e,HR,J_e,pi,K7=dt(()=>{Mg();df();Ca();V_e=/^[0-9]+$/,HR=/^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/,J_e=/^([^/]+-)?[a-f0-9]+$/,pi=class extends vs{constructor({baseFs:r=new xn}={}){super(z);this.baseFs=r}static makeVirtualPath(r,o,a){if(z.basename(r)!=="__virtual__")throw new Error('Assertion failed: Virtual folders must be named "__virtual__"');if(!z.basename(o).match(J_e))throw new Error("Assertion failed: Virtual components must be ended by an hexadecimal hash");let u=z.relative(z.dirname(r),a).split("/"),A=0;for(;A{dD=Ie("url"),V7=Ie("util");df();Ca();gD=class extends vs{constructor(r){super(ue);this.baseFs=r}mapFromBase(r){return r}mapToBase(r){if(typeof r=="string")return r;if(r instanceof dD.URL)return(0,dD.fileURLToPath)(r);if(Buffer.isBuffer(r)){let o=r.toString();if(Buffer.byteLength(o)!==r.byteLength)throw new Error("Non-utf8 buffers are not supported at the moment. Please upvote the following issue if you encounter this error: https://github.com/yarnpkg/berry/issues/4942");return o}throw new Error(`Unsupported path type: ${(0,V7.inspect)(r)}`)}}});var z7,Io,mf,Hp,mD,yD,ay,Oc,Mc,z_e,X_e,Z_e,$_e,LI,X7=dt(()=>{z7=Ie("readline"),Io=Symbol("kBaseFs"),mf=Symbol("kFd"),Hp=Symbol("kClosePromise"),mD=Symbol("kCloseResolve"),yD=Symbol("kCloseReject"),ay=Symbol("kRefs"),Oc=Symbol("kRef"),Mc=Symbol("kUnref"),LI=class{constructor(e,r){this[z_e]=1;this[X_e]=void 0;this[Z_e]=void 0;this[$_e]=void 0;this[Io]=r,this[mf]=e}get fd(){return this[mf]}async appendFile(e,r){try{this[Oc](this.appendFile);let o=(typeof r=="string"?r:r==null?void 0:r.encoding)??void 0;return await this[Io].appendFilePromise(this.fd,e,o?{encoding:o}:void 0)}finally{this[Mc]()}}async chown(e,r){try{return this[Oc](this.chown),await this[Io].fchownPromise(this.fd,e,r)}finally{this[Mc]()}}async chmod(e){try{return this[Oc](this.chmod),await this[Io].fchmodPromise(this.fd,e)}finally{this[Mc]()}}createReadStream(e){return this[Io].createReadStream(null,{...e,fd:this.fd})}createWriteStream(e){return this[Io].createWriteStream(null,{...e,fd:this.fd})}datasync(){throw new Error("Method not implemented.")}sync(){throw new Error("Method not implemented.")}async read(e,r,o,a){try{this[Oc](this.read);let n;return Buffer.isBuffer(e)?n=e:(e??(e={}),n=e.buffer??Buffer.alloc(16384),r=e.offset||0,o=e.length??n.byteLength,a=e.position??null),r??(r=0),o??(o=0),o===0?{bytesRead:o,buffer:n}:{bytesRead:await this[Io].readPromise(this.fd,n,r,o,a),buffer:n}}finally{this[Mc]()}}async readFile(e){try{this[Oc](this.readFile);let r=(typeof e=="string"?e:e==null?void 0:e.encoding)??void 0;return await this[Io].readFilePromise(this.fd,r)}finally{this[Mc]()}}readLines(e){return(0,z7.createInterface)({input:this.createReadStream(e),crlfDelay:1/0})}async stat(e){try{return this[Oc](this.stat),await this[Io].fstatPromise(this.fd,e)}finally{this[Mc]()}}async truncate(e){try{return this[Oc](this.truncate),await this[Io].ftruncatePromise(this.fd,e)}finally{this[Mc]()}}utimes(e,r){throw new Error("Method not implemented.")}async writeFile(e,r){try{this[Oc](this.writeFile);let o=(typeof r=="string"?r:r==null?void 0:r.encoding)??void 0;await this[Io].writeFilePromise(this.fd,e,o)}finally{this[Mc]()}}async write(...e){try{if(this[Oc](this.write),ArrayBuffer.isView(e[0])){let[r,o,a,n]=e;return{bytesWritten:await this[Io].writePromise(this.fd,r,o??void 0,a??void 0,n??void 0),buffer:r}}else{let[r,o,a]=e;return{bytesWritten:await this[Io].writePromise(this.fd,r,o,a),buffer:r}}}finally{this[Mc]()}}async writev(e,r){try{this[Oc](this.writev);let o=0;if(typeof r<"u")for(let a of e){let n=await this.write(a,void 0,void 0,r);o+=n.bytesWritten,r+=n.bytesWritten}else for(let a of e){let n=await this.write(a);o+=n.bytesWritten}return{buffers:e,bytesWritten:o}}finally{this[Mc]()}}readv(e,r){throw new Error("Method not implemented.")}close(){if(this[mf]===-1)return Promise.resolve();if(this[Hp])return this[Hp];if(this[ay]--,this[ay]===0){let e=this[mf];this[mf]=-1,this[Hp]=this[Io].closePromise(e).finally(()=>{this[Hp]=void 0})}else this[Hp]=new Promise((e,r)=>{this[mD]=e,this[yD]=r}).finally(()=>{this[Hp]=void 0,this[yD]=void 0,this[mD]=void 0});return this[Hp]}[(Io,mf,z_e=ay,X_e=Hp,Z_e=mD,$_e=yD,Oc)](e){if(this[mf]===-1){let r=new Error("file closed");throw r.code="EBADF",r.syscall=e.name,r}this[ay]++}[Mc](){if(this[ay]--,this[ay]===0){let e=this[mf];this[mf]=-1,this[Io].closePromise(e).then(this[mD],this[yD])}}}});function OI(t,e){e=new gD(e);let r=(o,a,n)=>{let u=o[a];o[a]=n,typeof(u==null?void 0:u[ly.promisify.custom])<"u"&&(n[ly.promisify.custom]=u[ly.promisify.custom])};{r(t,"exists",(o,...a)=>{let u=typeof a[a.length-1]=="function"?a.pop():()=>{};process.nextTick(()=>{e.existsPromise(o).then(A=>{u(A)},()=>{u(!1)})})}),r(t,"read",(...o)=>{let[a,n,u,A,p,h]=o;if(o.length<=3){let E={};o.length<3?h=o[1]:(E=o[1],h=o[2]),{buffer:n=Buffer.alloc(16384),offset:u=0,length:A=n.byteLength,position:p}=E}if(u==null&&(u=0),A|=0,A===0){process.nextTick(()=>{h(null,0,n)});return}p==null&&(p=-1),process.nextTick(()=>{e.readPromise(a,n,u,A,p).then(E=>{h(null,E,n)},E=>{h(E,0,n)})})});for(let o of Z7){let a=o.replace(/Promise$/,"");if(typeof t[a]>"u")continue;let n=e[o];if(typeof n>"u")continue;r(t,a,(...A)=>{let h=typeof A[A.length-1]=="function"?A.pop():()=>{};process.nextTick(()=>{n.apply(e,A).then(E=>{h(null,E)},E=>{h(E)})})})}t.realpath.native=t.realpath}{r(t,"existsSync",o=>{try{return e.existsSync(o)}catch{return!1}}),r(t,"readSync",(...o)=>{let[a,n,u,A,p]=o;return o.length<=3&&({offset:u=0,length:A=n.byteLength,position:p}=o[2]||{}),u==null&&(u=0),A|=0,A===0?0:(p==null&&(p=-1),e.readSync(a,n,u,A,p))});for(let o of e8e){let a=o;if(typeof t[a]>"u")continue;let n=e[o];typeof n>"u"||r(t,a,n.bind(e))}t.realpathSync.native=t.realpathSync}{let o=t.promises;for(let a of Z7){let n=a.replace(/Promise$/,"");if(typeof o[n]>"u")continue;let u=e[a];typeof u>"u"||a!=="open"&&r(o,n,(A,...p)=>A instanceof LI?A[n].apply(A,p):u.call(e,A,...p))}r(o,"open",async(...a)=>{let n=await e.openPromise(...a);return new LI(n,e)})}t.read[ly.promisify.custom]=async(o,a,...n)=>({bytesRead:await e.readPromise(o,a,...n),buffer:a}),t.write[ly.promisify.custom]=async(o,a,...n)=>({bytesWritten:await e.writePromise(o,a,...n),buffer:a})}function CD(t,e){let r=Object.create(t);return OI(r,e),r}var ly,e8e,Z7,$7=dt(()=>{ly=Ie("util");J7();X7();e8e=new Set(["accessSync","appendFileSync","createReadStream","createWriteStream","chmodSync","fchmodSync","chownSync","fchownSync","closeSync","copyFileSync","linkSync","lstatSync","fstatSync","lutimesSync","mkdirSync","openSync","opendirSync","readlinkSync","readFileSync","readdirSync","readlinkSync","realpathSync","renameSync","rmdirSync","statSync","symlinkSync","truncateSync","ftruncateSync","unlinkSync","unwatchFile","utimesSync","watch","watchFile","writeFileSync","writeSync"]),Z7=new Set(["accessPromise","appendFilePromise","fchmodPromise","chmodPromise","fchownPromise","chownPromise","closePromise","copyFilePromise","linkPromise","fstatPromise","lstatPromise","lutimesPromise","mkdirPromise","openPromise","opendirPromise","readdirPromise","realpathPromise","readFilePromise","readdirPromise","readlinkPromise","renamePromise","rmdirPromise","statPromise","symlinkPromise","truncatePromise","ftruncatePromise","unlinkPromise","utimesPromise","writeFilePromise","writeSync"])});function eW(t){let e=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,"0");return`${t}${e}`}function tW(){if(qR)return qR;let t=ue.toPortablePath(rW.default.tmpdir()),e=ae.realpathSync(t);return process.once("exit",()=>{ae.rmtempSync()}),qR={tmpdir:t,realTmpdir:e}}var rW,Uc,qR,ae,nW=dt(()=>{rW=tt(Ie("os"));Mg();Ca();Uc=new Set,qR=null;ae=Object.assign(new xn,{detachTemp(t){Uc.delete(t)},mktempSync(t){let{tmpdir:e,realTmpdir:r}=tW();for(;;){let o=eW("xfs-");try{this.mkdirSync(z.join(e,o))}catch(n){if(n.code==="EEXIST")continue;throw n}let a=z.join(r,o);if(Uc.add(a),typeof t>"u")return a;try{return t(a)}finally{if(Uc.has(a)){Uc.delete(a);try{this.removeSync(a)}catch{}}}}},async mktempPromise(t){let{tmpdir:e,realTmpdir:r}=tW();for(;;){let o=eW("xfs-");try{await this.mkdirPromise(z.join(e,o))}catch(n){if(n.code==="EEXIST")continue;throw n}let a=z.join(r,o);if(Uc.add(a),typeof t>"u")return a;try{return await t(a)}finally{if(Uc.has(a)){Uc.delete(a);try{await this.removePromise(a)}catch{}}}}},async rmtempPromise(){await Promise.all(Array.from(Uc.values()).map(async t=>{try{await ae.removePromise(t,{maxRetries:0}),Uc.delete(t)}catch{}}))},rmtempSync(){for(let t of Uc)try{ae.removeSync(t),Uc.delete(t)}catch{}}})});var MI={};Yt(MI,{AliasFS:()=>ju,BasePortableFakeFS:()=>qu,CwdFS:()=>An,FakeFS:()=>gf,Filename:()=>Lr,JailFS:()=>Gu,LazyFS:()=>oy,MountFS:()=>Up,NoFS:()=>NI,NodeFS:()=>xn,PortablePath:()=>wt,PosixFS:()=>_p,ProxiedFS:()=>vs,VirtualFS:()=>pi,constants:()=>Ii,errors:()=>sr,extendFs:()=>CD,normalizeLineEndings:()=>Lg,npath:()=>ue,opendir:()=>pD,patchFs:()=>OI,ppath:()=>z,setupCopyIndex:()=>fD,statUtils:()=>Ml,toFilename:()=>Li,unwatchAllFiles:()=>Ng,unwatchFile:()=>Tg,watchFile:()=>sy,xfs:()=>ae});var bt=dt(()=>{S7();cD();TR();OR();F7();UR();Og();Ca();Ca();M7();Og();_7();q7();j7();G7();W7();Mg();Y7();df();K7();$7();nW()});var lW=U((cPt,aW)=>{aW.exports=oW;oW.sync=r8e;var iW=Ie("fs");function t8e(t,e){var r=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!r||(r=r.split(";"),r.indexOf("")!==-1))return!0;for(var o=0;o{fW.exports=uW;uW.sync=n8e;var cW=Ie("fs");function uW(t,e,r){cW.stat(t,function(o,a){r(o,o?!1:AW(a,e))})}function n8e(t,e){return AW(cW.statSync(t),e)}function AW(t,e){return t.isFile()&&i8e(t,e)}function i8e(t,e){var r=t.mode,o=t.uid,a=t.gid,n=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),u=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),A=parseInt("100",8),p=parseInt("010",8),h=parseInt("001",8),E=A|p,w=r&h||r&p&&a===u||r&A&&o===n||r&E&&n===0;return w}});var gW=U((fPt,hW)=>{var APt=Ie("fs"),ED;process.platform==="win32"||global.TESTING_WINDOWS?ED=lW():ED=pW();hW.exports=jR;jR.sync=s8e;function jR(t,e,r){if(typeof e=="function"&&(r=e,e={}),!r){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(o,a){jR(t,e||{},function(n,u){n?a(n):o(u)})})}ED(t,e||{},function(o,a){o&&(o.code==="EACCES"||e&&e.ignoreErrors)&&(o=null,a=!1),r(o,a)})}function s8e(t,e){try{return ED.sync(t,e||{})}catch(r){if(e&&e.ignoreErrors||r.code==="EACCES")return!1;throw r}}});var wW=U((pPt,IW)=>{var cy=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",dW=Ie("path"),o8e=cy?";":":",mW=gW(),yW=t=>Object.assign(new Error(`not found: ${t}`),{code:"ENOENT"}),CW=(t,e)=>{let r=e.colon||o8e,o=t.match(/\//)||cy&&t.match(/\\/)?[""]:[...cy?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(r)],a=cy?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",n=cy?a.split(r):[""];return cy&&t.indexOf(".")!==-1&&n[0]!==""&&n.unshift(""),{pathEnv:o,pathExt:n,pathExtExe:a}},EW=(t,e,r)=>{typeof e=="function"&&(r=e,e={}),e||(e={});let{pathEnv:o,pathExt:a,pathExtExe:n}=CW(t,e),u=[],A=h=>new Promise((E,w)=>{if(h===o.length)return e.all&&u.length?E(u):w(yW(t));let v=o[h],b=/^".*"$/.test(v)?v.slice(1,-1):v,C=dW.join(b,t),R=!b&&/^\.[\\\/]/.test(t)?t.slice(0,2)+C:C;E(p(R,h,0))}),p=(h,E,w)=>new Promise((v,b)=>{if(w===a.length)return v(A(E+1));let C=a[w];mW(h+C,{pathExt:n},(R,L)=>{if(!R&&L)if(e.all)u.push(h+C);else return v(h+C);return v(p(h,E,w+1))})});return r?A(0).then(h=>r(null,h),r):A(0)},a8e=(t,e)=>{e=e||{};let{pathEnv:r,pathExt:o,pathExtExe:a}=CW(t,e),n=[];for(let u=0;u{"use strict";var BW=(t={})=>{let e=t.env||process.env;return(t.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(o=>o.toUpperCase()==="PATH")||"Path"};GR.exports=BW;GR.exports.default=BW});var xW=U((gPt,PW)=>{"use strict";var DW=Ie("path"),l8e=wW(),c8e=vW();function SW(t,e){let r=t.options.env||process.env,o=process.cwd(),a=t.options.cwd!=null,n=a&&process.chdir!==void 0&&!process.chdir.disabled;if(n)try{process.chdir(t.options.cwd)}catch{}let u;try{u=l8e.sync(t.command,{path:r[c8e({env:r})],pathExt:e?DW.delimiter:void 0})}catch{}finally{n&&process.chdir(o)}return u&&(u=DW.resolve(a?t.options.cwd:"",u)),u}function u8e(t){return SW(t)||SW(t,!0)}PW.exports=u8e});var bW=U((dPt,YR)=>{"use strict";var WR=/([()\][%!^"`<>&|;, *?])/g;function A8e(t){return t=t.replace(WR,"^$1"),t}function f8e(t,e){return t=`${t}`,t=t.replace(/(\\*)"/g,'$1$1\\"'),t=t.replace(/(\\*)$/,"$1$1"),t=`"${t}"`,t=t.replace(WR,"^$1"),e&&(t=t.replace(WR,"^$1")),t}YR.exports.command=A8e;YR.exports.argument=f8e});var kW=U((mPt,QW)=>{"use strict";QW.exports=/^#!(.*)/});var RW=U((yPt,FW)=>{"use strict";var p8e=kW();FW.exports=(t="")=>{let e=t.match(p8e);if(!e)return null;let[r,o]=e[0].replace(/#! ?/,"").split(" "),a=r.split("/").pop();return a==="env"?o:o?`${a} ${o}`:a}});var NW=U((CPt,TW)=>{"use strict";var KR=Ie("fs"),h8e=RW();function g8e(t){let r=Buffer.alloc(150),o;try{o=KR.openSync(t,"r"),KR.readSync(o,r,0,150,0),KR.closeSync(o)}catch{}return h8e(r.toString())}TW.exports=g8e});var UW=U((EPt,MW)=>{"use strict";var d8e=Ie("path"),LW=xW(),OW=bW(),m8e=NW(),y8e=process.platform==="win32",C8e=/\.(?:com|exe)$/i,E8e=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function I8e(t){t.file=LW(t);let e=t.file&&m8e(t.file);return e?(t.args.unshift(t.file),t.command=e,LW(t)):t.file}function w8e(t){if(!y8e)return t;let e=I8e(t),r=!C8e.test(e);if(t.options.forceShell||r){let o=E8e.test(e);t.command=d8e.normalize(t.command),t.command=OW.command(t.command),t.args=t.args.map(n=>OW.argument(n,o));let a=[t.command].concat(t.args).join(" ");t.args=["/d","/s","/c",`"${a}"`],t.command=process.env.comspec||"cmd.exe",t.options.windowsVerbatimArguments=!0}return t}function B8e(t,e,r){e&&!Array.isArray(e)&&(r=e,e=null),e=e?e.slice(0):[],r=Object.assign({},r);let o={command:t,args:e,options:r,file:void 0,original:{command:t,args:e}};return r.shell?o:w8e(o)}MW.exports=B8e});var qW=U((IPt,HW)=>{"use strict";var VR=process.platform==="win32";function JR(t,e){return Object.assign(new Error(`${e} ${t.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${t.command}`,path:t.command,spawnargs:t.args})}function v8e(t,e){if(!VR)return;let r=t.emit;t.emit=function(o,a){if(o==="exit"){let n=_W(a,e,"spawn");if(n)return r.call(t,"error",n)}return r.apply(t,arguments)}}function _W(t,e){return VR&&t===1&&!e.file?JR(e.original,"spawn"):null}function D8e(t,e){return VR&&t===1&&!e.file?JR(e.original,"spawnSync"):null}HW.exports={hookChildProcess:v8e,verifyENOENT:_W,verifyENOENTSync:D8e,notFoundError:JR}});var ZR=U((wPt,uy)=>{"use strict";var jW=Ie("child_process"),zR=UW(),XR=qW();function GW(t,e,r){let o=zR(t,e,r),a=jW.spawn(o.command,o.args,o.options);return XR.hookChildProcess(a,o),a}function S8e(t,e,r){let o=zR(t,e,r),a=jW.spawnSync(o.command,o.args,o.options);return a.error=a.error||XR.verifyENOENTSync(a.status,o),a}uy.exports=GW;uy.exports.spawn=GW;uy.exports.sync=S8e;uy.exports._parse=zR;uy.exports._enoent=XR});function YW(t){WW=t}function UI(){return typeof $R>"u"&&($R=WW()),$R}var $R,WW,eT=dt(()=>{WW=()=>{throw new Error("Assertion failed: No libzip instance is available, and no factory was configured")}});var KW=U((ID,rT)=>{var P8e=Object.assign({},Ie("fs")),tT=function(){var t=typeof document<"u"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename<"u"&&(t=t||__filename),function(e){e=e||{};var r=typeof e<"u"?e:{},o,a;r.ready=new Promise(function(Be,xe){o=Be,a=xe});var n={},u;for(u in r)r.hasOwnProperty(u)&&(n[u]=r[u]);var A=[],p="./this.program",h=function(Be,xe){throw xe},E=!1,w=!0,v="";function b(Be){return r.locateFile?r.locateFile(Be,v):v+Be}var C,R,L,_;w&&(E?v=Ie("path").dirname(v)+"/":v=__dirname+"/",C=function(xe,Ve){var vt=$n(xe);return vt?Ve?vt:vt.toString():(L||(L=P8e),_||(_=Ie("path")),xe=_.normalize(xe),L.readFileSync(xe,Ve?null:"utf8"))},R=function(xe){var Ve=C(xe,!0);return Ve.buffer||(Ve=new Uint8Array(Ve)),De(Ve.buffer),Ve},process.argv.length>1&&(p=process.argv[1].replace(/\\/g,"/")),A=process.argv.slice(2),h=function(Be){process.exit(Be)},r.inspect=function(){return"[Emscripten Module object]"});var V=r.print||console.log.bind(console),re=r.printErr||console.warn.bind(console);for(u in n)n.hasOwnProperty(u)&&(r[u]=n[u]);n=null,r.arguments&&(A=r.arguments),r.thisProgram&&(p=r.thisProgram),r.quit&&(h=r.quit);var oe=0,pe=function(Be){oe=Be},he;r.wasmBinary&&(he=r.wasmBinary);var ve=r.noExitRuntime||!0;typeof WebAssembly!="object"&&ki("no native wasm support detected");function ge(Be,xe,Ve){switch(xe=xe||"i8",xe.charAt(xe.length-1)==="*"&&(xe="i32"),xe){case"i1":return _e[Be>>0];case"i8":return _e[Be>>0];case"i16":return lp((Be>>1)*2);case"i32":return ks((Be>>2)*4);case"i64":return ks((Be>>2)*4);case"float":return gu((Be>>2)*4);case"double":return ap((Be>>3)*8);default:ki("invalid type for getValue: "+xe)}return null}var le,Pe=!1,g;function De(Be,xe){Be||ki("Assertion failed: "+xe)}function Ce(Be){var xe=r["_"+Be];return De(xe,"Cannot call unknown function "+Be+", make sure it is exported"),xe}function de(Be,xe,Ve,vt,tr){var Zr={string:function(yi){var la=0;if(yi!=null&&yi!==0){var ja=(yi.length<<2)+1;la=ee(ja),ut(yi,la,ja)}return la},array:function(yi){var la=ee(yi.length);return Me(yi,la),la}};function Tn(yi){return xe==="string"?me(yi):xe==="boolean"?Boolean(yi):yi}var _r=Ce(Be),ei=[],Ti=0;if(vt)for(var Kn=0;Kn=Ve)&&qe[vt];)++vt;return Z.decode(qe.subarray(Be,vt))}function be(Be,xe,Ve,vt){if(!(vt>0))return 0;for(var tr=Ve,Zr=Ve+vt-1,Tn=0;Tn=55296&&_r<=57343){var ei=Be.charCodeAt(++Tn);_r=65536+((_r&1023)<<10)|ei&1023}if(_r<=127){if(Ve>=Zr)break;xe[Ve++]=_r}else if(_r<=2047){if(Ve+1>=Zr)break;xe[Ve++]=192|_r>>6,xe[Ve++]=128|_r&63}else if(_r<=65535){if(Ve+2>=Zr)break;xe[Ve++]=224|_r>>12,xe[Ve++]=128|_r>>6&63,xe[Ve++]=128|_r&63}else{if(Ve+3>=Zr)break;xe[Ve++]=240|_r>>18,xe[Ve++]=128|_r>>12&63,xe[Ve++]=128|_r>>6&63,xe[Ve++]=128|_r&63}}return xe[Ve]=0,Ve-tr}function ut(Be,xe,Ve){return be(Be,qe,xe,Ve)}function H(Be){for(var xe=0,Ve=0;Ve=55296&&vt<=57343&&(vt=65536+((vt&1023)<<10)|Be.charCodeAt(++Ve)&1023),vt<=127?++xe:vt<=2047?xe+=2:vt<=65535?xe+=3:xe+=4}return xe}function yt(Be){var xe=H(Be)+1,Ve=Bl(xe);return Ve&&be(Be,_e,Ve,xe),Ve}function Me(Be,xe){_e.set(Be,xe)}function Te(Be,xe){return Be%xe>0&&(Be+=xe-Be%xe),Be}var Qe,_e,qe,At,Oe,x,I,P,y,F;function J(Be){Qe=Be,r.HEAP_DATA_VIEW=F=new DataView(Be),r.HEAP8=_e=new Int8Array(Be),r.HEAP16=At=new Int16Array(Be),r.HEAP32=x=new Int32Array(Be),r.HEAPU8=qe=new Uint8Array(Be),r.HEAPU16=Oe=new Uint16Array(Be),r.HEAPU32=I=new Uint32Array(Be),r.HEAPF32=P=new Float32Array(Be),r.HEAPF64=y=new Float64Array(Be)}var X=r.INITIAL_MEMORY||16777216,$,ie=[],ke=[],Ne=[],st=!1;function ht(){if(r.preRun)for(typeof r.preRun=="function"&&(r.preRun=[r.preRun]);r.preRun.length;)Pt(r.preRun.shift());no(ie)}function Ut(){st=!0,no(ke)}function Xt(){if(r.postRun)for(typeof r.postRun=="function"&&(r.postRun=[r.postRun]);r.postRun.length;)Dr(r.postRun.shift());no(Ne)}function Pt(Be){ie.unshift(Be)}function tn(Be){ke.unshift(Be)}function Dr(Be){Ne.unshift(Be)}var fr=0,Br=null,jr=null;function Hn(Be){fr++,r.monitorRunDependencies&&r.monitorRunDependencies(fr)}function bs(Be){if(fr--,r.monitorRunDependencies&&r.monitorRunDependencies(fr),fr==0&&(Br!==null&&(clearInterval(Br),Br=null),jr)){var xe=jr;jr=null,xe()}}r.preloadedImages={},r.preloadedAudios={};function ki(Be){r.onAbort&&r.onAbort(Be),Be+="",re(Be),Pe=!0,g=1,Be="abort("+Be+"). Build with -s ASSERTIONS=1 for more info.";var xe=new WebAssembly.RuntimeError(Be);throw a(xe),xe}var gs="data:application/octet-stream;base64,";function to(Be){return Be.startsWith(gs)}var Di="data:application/octet-stream;base64,AGFzbQEAAAAB/wEkYAN/f38Bf2ACf38Bf2ABfwF/YAN/f34Bf2ABfwBgBH9/f38Bf2ACf38AYAN/f38AYAV/f39/fwF/YAABf2AFf39/fn8BfmAEf35/fwF/YAR/f35/AX5gAn9+AX9gA398fwBgAX8BfmAGf39/f39/AX9gBH9/f38AYAN/fn8Bf2ADf39/AX5gBH9/f38BfmAFf39+f38Bf2AEf39+fwF/YAN/f34BfmACf34AYAJ/fwF+YAV/f39/fwBgA39+fwF+YAV+fn9+fwF+YAZ/fH9/f38Bf2AAAGAHf35/f39+fwF/YAV/fn9/fwF/YAV/f39/fwF+YAJ+fwF/YAJ/fAACJQYBYQFhAAQBYQFiAAIBYQFjAAABYQFkAAIBYQFlAAEBYQFmAAID5AHiAQQEAgAEAgQGDBEEFwYNBBICBA0YBwIDBA8PBAECARkFCxoCBAQCBwsHBAECDwEGBQQAAQsEBgARBgYHBBsFBBwICAABEwIIBBQTFRAWCwsGAB4ABQAAAQYCBAMfAgEBAQIBCBYgACEAIgABAggBBgINCxQNBwIHAQAjBAALFQAACAsSAgcHBAQHAQEBBQkJAQEBAQIKBAICAgICCQgCCAgIAAUBBQUFCBAFBQAAEAAAAgQJCQUCAgAJCQkCAgIBCgoABgAEAwICAgQACggMAgYAAgEBAwUAAAUCAAkABAEHCQIEBQFwATQ0BQcBAYACgIACBgkBfwFB8KDBAgsHowI6AWcCAAFoAFcBaQDnAQFqALMBAWsAuQEBbAChAQFtAKABAW4AnwEBbwCdAQFwAJwBAXEAmQEBcgCUAQFzAOYBAXQA3wEBdQDXAQF2ANQBAXcAuwEBeACyAQF5ALEBAXoATQFBAMgBAUIAwgEBQwDBAQFEALwBAUUAwwEBRgCwAQFHAAYBSAAIAUkAngEBSgCvAQFLAK4BAUwArQEBTQC0AQFOAKwBAU8AqwEBUACqAQFRAKkBAVIAqAEBUwCnAQFUALUBAVUApgEBVgClAQFXAKQBAVgAGwFZAAoBWgCbAQFfADEBJAEAAmFhAEkCYmEAowECY2EAugECZGEAogECZWEAwAECZmEAvwECZ2EAvgECaGEAuAECaWEAtwECamEAtgEJYwEAQQELM5oB1gHVAVyYAZcBlgGVAY4BjwFfW5MBWllYVpIBYJEBkAHlAeQB4gHaAeMB2QHYAeEB4AHeAd0B3AHbAdMB0QHSAdABzwHOAc0BzAHLAcoByQHHAcYBxQHEATi9AQrh+QbiAcwMAQd/AkAgAEUNACAAQQhrIgMgAEEEaygCACIBQXhxIgBqIQUCQCABQQFxDQAgAUEDcUUNASADIAMoAgAiAWsiA0G4nAEoAgBJDQEgACABaiEAIANBvJwBKAIARwRAIAFB/wFNBEAgAygCCCICIAFBA3YiBEEDdEHQnAFqRhogAiADKAIMIgFGBEBBqJwBQaicASgCAEF+IAR3cTYCAAwDCyACIAE2AgwgASACNgIIDAILIAMoAhghBgJAIAMgAygCDCIBRwRAIAMoAggiAiABNgIMIAEgAjYCCAwBCwJAIANBFGoiAigCACIEDQAgA0EQaiICKAIAIgQNAEEAIQEMAQsDQCACIQcgBCIBQRRqIgIoAgAiBA0AIAFBEGohAiABKAIQIgQNAAsgB0EANgIACyAGRQ0BAkAgAyADKAIcIgJBAnRB2J4BaiIEKAIARgRAIAQgATYCACABDQFBrJwBQaycASgCAEF+IAJ3cTYCAAwDCyAGQRBBFCAGKAIQIANGG2ogATYCACABRQ0CCyABIAY2AhggAygCECICBEAgASACNgIQIAIgATYCGAsgAygCFCICRQ0BIAEgAjYCFCACIAE2AhgMAQsgBSgCBCIBQQNxQQNHDQBBsJwBIAA2AgAgBSABQX5xNgIEIAMgAEEBcjYCBCAAIANqIAA2AgAPCyADIAVPDQAgBSgCBCIBQQFxRQ0AAkAgAUECcUUEQCAFQcCcASgCAEYEQEHAnAEgAzYCAEG0nAFBtJwBKAIAIABqIgA2AgAgAyAAQQFyNgIEIANBvJwBKAIARw0DQbCcAUEANgIAQbycAUEANgIADwsgBUG8nAEoAgBGBEBBvJwBIAM2AgBBsJwBQbCcASgCACAAaiIANgIAIAMgAEEBcjYCBCAAIANqIAA2AgAPCyABQXhxIABqIQACQCABQf8BTQRAIAUoAggiAiABQQN2IgRBA3RB0JwBakYaIAIgBSgCDCIBRgRAQaicAUGonAEoAgBBfiAEd3E2AgAMAgsgAiABNgIMIAEgAjYCCAwBCyAFKAIYIQYCQCAFIAUoAgwiAUcEQCAFKAIIIgJBuJwBKAIASRogAiABNgIMIAEgAjYCCAwBCwJAIAVBFGoiAigCACIEDQAgBUEQaiICKAIAIgQNAEEAIQEMAQsDQCACIQcgBCIBQRRqIgIoAgAiBA0AIAFBEGohAiABKAIQIgQNAAsgB0EANgIACyAGRQ0AAkAgBSAFKAIcIgJBAnRB2J4BaiIEKAIARgRAIAQgATYCACABDQFBrJwBQaycASgCAEF+IAJ3cTYCAAwCCyAGQRBBFCAGKAIQIAVGG2ogATYCACABRQ0BCyABIAY2AhggBSgCECICBEAgASACNgIQIAIgATYCGAsgBSgCFCICRQ0AIAEgAjYCFCACIAE2AhgLIAMgAEEBcjYCBCAAIANqIAA2AgAgA0G8nAEoAgBHDQFBsJwBIAA2AgAPCyAFIAFBfnE2AgQgAyAAQQFyNgIEIAAgA2ogADYCAAsgAEH/AU0EQCAAQQN2IgFBA3RB0JwBaiEAAn9BqJwBKAIAIgJBASABdCIBcUUEQEGonAEgASACcjYCACAADAELIAAoAggLIQIgACADNgIIIAIgAzYCDCADIAA2AgwgAyACNgIIDwtBHyECIANCADcCECAAQf///wdNBEAgAEEIdiIBIAFBgP4/akEQdkEIcSIBdCICIAJBgOAfakEQdkEEcSICdCIEIARBgIAPakEQdkECcSIEdEEPdiABIAJyIARyayIBQQF0IAAgAUEVanZBAXFyQRxqIQILIAMgAjYCHCACQQJ0QdieAWohAQJAAkACQEGsnAEoAgAiBEEBIAJ0IgdxRQRAQaycASAEIAdyNgIAIAEgAzYCACADIAE2AhgMAQsgAEEAQRkgAkEBdmsgAkEfRht0IQIgASgCACEBA0AgASIEKAIEQXhxIABGDQIgAkEddiEBIAJBAXQhAiAEIAFBBHFqIgdBEGooAgAiAQ0ACyAHIAM2AhAgAyAENgIYCyADIAM2AgwgAyADNgIIDAELIAQoAggiACADNgIMIAQgAzYCCCADQQA2AhggAyAENgIMIAMgADYCCAtByJwBQcicASgCAEEBayIAQX8gABs2AgALCxoAIAAEQCAALQABBEAgACgCBBAGCyAAEAYLC6IuAQx/IwBBEGsiDCQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB9AFNBEBBqJwBKAIAIgVBECAAQQtqQXhxIABBC0kbIghBA3YiAnYiAUEDcQRAIAFBf3NBAXEgAmoiA0EDdCIBQdicAWooAgAiBEEIaiEAAkAgBCgCCCICIAFB0JwBaiIBRgRAQaicASAFQX4gA3dxNgIADAELIAIgATYCDCABIAI2AggLIAQgA0EDdCIBQQNyNgIEIAEgBGoiASABKAIEQQFyNgIEDA0LIAhBsJwBKAIAIgpNDQEgAQRAAkBBAiACdCIAQQAgAGtyIAEgAnRxIgBBACAAa3FBAWsiACAAQQx2QRBxIgJ2IgFBBXZBCHEiACACciABIAB2IgFBAnZBBHEiAHIgASAAdiIBQQF2QQJxIgByIAEgAHYiAUEBdkEBcSIAciABIAB2aiIDQQN0IgBB2JwBaigCACIEKAIIIgEgAEHQnAFqIgBGBEBBqJwBIAVBfiADd3EiBTYCAAwBCyABIAA2AgwgACABNgIICyAEQQhqIQAgBCAIQQNyNgIEIAQgCGoiAiADQQN0IgEgCGsiA0EBcjYCBCABIARqIAM2AgAgCgRAIApBA3YiAUEDdEHQnAFqIQdBvJwBKAIAIQQCfyAFQQEgAXQiAXFFBEBBqJwBIAEgBXI2AgAgBwwBCyAHKAIICyEBIAcgBDYCCCABIAQ2AgwgBCAHNgIMIAQgATYCCAtBvJwBIAI2AgBBsJwBIAM2AgAMDQtBrJwBKAIAIgZFDQEgBkEAIAZrcUEBayIAIABBDHZBEHEiAnYiAUEFdkEIcSIAIAJyIAEgAHYiAUECdkEEcSIAciABIAB2IgFBAXZBAnEiAHIgASAAdiIBQQF2QQFxIgByIAEgAHZqQQJ0QdieAWooAgAiASgCBEF4cSAIayEDIAEhAgNAAkAgAigCECIARQRAIAIoAhQiAEUNAQsgACgCBEF4cSAIayICIAMgAiADSSICGyEDIAAgASACGyEBIAAhAgwBCwsgASAIaiIJIAFNDQIgASgCGCELIAEgASgCDCIERwRAIAEoAggiAEG4nAEoAgBJGiAAIAQ2AgwgBCAANgIIDAwLIAFBFGoiAigCACIARQRAIAEoAhAiAEUNBCABQRBqIQILA0AgAiEHIAAiBEEUaiICKAIAIgANACAEQRBqIQIgBCgCECIADQALIAdBADYCAAwLC0F/IQggAEG/f0sNACAAQQtqIgBBeHEhCEGsnAEoAgAiCUUNAEEAIAhrIQMCQAJAAkACf0EAIAhBgAJJDQAaQR8gCEH///8HSw0AGiAAQQh2IgAgAEGA/j9qQRB2QQhxIgJ0IgAgAEGA4B9qQRB2QQRxIgF0IgAgAEGAgA9qQRB2QQJxIgB0QQ92IAEgAnIgAHJrIgBBAXQgCCAAQRVqdkEBcXJBHGoLIgVBAnRB2J4BaigCACICRQRAQQAhAAwBC0EAIQAgCEEAQRkgBUEBdmsgBUEfRht0IQEDQAJAIAIoAgRBeHEgCGsiByADTw0AIAIhBCAHIgMNAEEAIQMgAiEADAMLIAAgAigCFCIHIAcgAiABQR12QQRxaigCECICRhsgACAHGyEAIAFBAXQhASACDQALCyAAIARyRQRAQQIgBXQiAEEAIABrciAJcSIARQ0DIABBACAAa3FBAWsiACAAQQx2QRBxIgJ2IgFBBXZBCHEiACACciABIAB2IgFBAnZBBHEiAHIgASAAdiIBQQF2QQJxIgByIAEgAHYiAUEBdkEBcSIAciABIAB2akECdEHYngFqKAIAIQALIABFDQELA0AgACgCBEF4cSAIayIBIANJIQIgASADIAIbIQMgACAEIAIbIQQgACgCECIBBH8gAQUgACgCFAsiAA0ACwsgBEUNACADQbCcASgCACAIa08NACAEIAhqIgYgBE0NASAEKAIYIQUgBCAEKAIMIgFHBEAgBCgCCCIAQbicASgCAEkaIAAgATYCDCABIAA2AggMCgsgBEEUaiICKAIAIgBFBEAgBCgCECIARQ0EIARBEGohAgsDQCACIQcgACIBQRRqIgIoAgAiAA0AIAFBEGohAiABKAIQIgANAAsgB0EANgIADAkLIAhBsJwBKAIAIgJNBEBBvJwBKAIAIQMCQCACIAhrIgFBEE8EQEGwnAEgATYCAEG8nAEgAyAIaiIANgIAIAAgAUEBcjYCBCACIANqIAE2AgAgAyAIQQNyNgIEDAELQbycAUEANgIAQbCcAUEANgIAIAMgAkEDcjYCBCACIANqIgAgACgCBEEBcjYCBAsgA0EIaiEADAsLIAhBtJwBKAIAIgZJBEBBtJwBIAYgCGsiATYCAEHAnAFBwJwBKAIAIgIgCGoiADYCACAAIAFBAXI2AgQgAiAIQQNyNgIEIAJBCGohAAwLC0EAIQAgCEEvaiIJAn9BgKABKAIABEBBiKABKAIADAELQYygAUJ/NwIAQYSgAUKAoICAgIAENwIAQYCgASAMQQxqQXBxQdiq1aoFczYCAEGUoAFBADYCAEHknwFBADYCAEGAIAsiAWoiBUEAIAFrIgdxIgIgCE0NCkHgnwEoAgAiBARAQdifASgCACIDIAJqIgEgA00NCyABIARLDQsLQeSfAS0AAEEEcQ0FAkACQEHAnAEoAgAiAwRAQeifASEAA0AgAyAAKAIAIgFPBEAgASAAKAIEaiADSw0DCyAAKAIIIgANAAsLQQAQKCIBQX9GDQYgAiEFQYSgASgCACIDQQFrIgAgAXEEQCACIAFrIAAgAWpBACADa3FqIQULIAUgCE0NBiAFQf7///8HSw0GQeCfASgCACIEBEBB2J8BKAIAIgMgBWoiACADTQ0HIAAgBEsNBwsgBRAoIgAgAUcNAQwICyAFIAZrIAdxIgVB/v///wdLDQUgBRAoIgEgACgCACAAKAIEakYNBCABIQALAkAgAEF/Rg0AIAhBMGogBU0NAEGIoAEoAgAiASAJIAVrakEAIAFrcSIBQf7///8HSwRAIAAhAQwICyABEChBf0cEQCABIAVqIQUgACEBDAgLQQAgBWsQKBoMBQsgACIBQX9HDQYMBAsAC0EAIQQMBwtBACEBDAULIAFBf0cNAgtB5J8BQeSfASgCAEEEcjYCAAsgAkH+////B0sNASACECghAUEAECghACABQX9GDQEgAEF/Rg0BIAAgAU0NASAAIAFrIgUgCEEoak0NAQtB2J8BQdifASgCACAFaiIANgIAQdyfASgCACAASQRAQdyfASAANgIACwJAAkACQEHAnAEoAgAiBwRAQeifASEAA0AgASAAKAIAIgMgACgCBCICakYNAiAAKAIIIgANAAsMAgtBuJwBKAIAIgBBACAAIAFNG0UEQEG4nAEgATYCAAtBACEAQeyfASAFNgIAQeifASABNgIAQcicAUF/NgIAQcycAUGAoAEoAgA2AgBB9J8BQQA2AgADQCAAQQN0IgNB2JwBaiADQdCcAWoiAjYCACADQdycAWogAjYCACAAQQFqIgBBIEcNAAtBtJwBIAVBKGsiA0F4IAFrQQdxQQAgAUEIakEHcRsiAGsiAjYCAEHAnAEgACABaiIANgIAIAAgAkEBcjYCBCABIANqQSg2AgRBxJwBQZCgASgCADYCAAwCCyAALQAMQQhxDQAgAyAHSw0AIAEgB00NACAAIAIgBWo2AgRBwJwBIAdBeCAHa0EHcUEAIAdBCGpBB3EbIgBqIgI2AgBBtJwBQbScASgCACAFaiIBIABrIgA2AgAgAiAAQQFyNgIEIAEgB2pBKDYCBEHEnAFBkKABKAIANgIADAELQbicASgCACABSwRAQbicASABNgIACyABIAVqIQJB6J8BIQACQAJAAkACQAJAAkADQCACIAAoAgBHBEAgACgCCCIADQEMAgsLIAAtAAxBCHFFDQELQeifASEAA0AgByAAKAIAIgJPBEAgAiAAKAIEaiIEIAdLDQMLIAAoAgghAAwACwALIAAgATYCACAAIAAoAgQgBWo2AgQgAUF4IAFrQQdxQQAgAUEIakEHcRtqIgkgCEEDcjYCBCACQXggAmtBB3FBACACQQhqQQdxG2oiBSAIIAlqIgZrIQIgBSAHRgRAQcCcASAGNgIAQbScAUG0nAEoAgAgAmoiADYCACAGIABBAXI2AgQMAwsgBUG8nAEoAgBGBEBBvJwBIAY2AgBBsJwBQbCcASgCACACaiIANgIAIAYgAEEBcjYCBCAAIAZqIAA2AgAMAwsgBSgCBCIAQQNxQQFGBEAgAEF4cSEHAkAgAEH/AU0EQCAFKAIIIgMgAEEDdiIAQQN0QdCcAWpGGiADIAUoAgwiAUYEQEGonAFBqJwBKAIAQX4gAHdxNgIADAILIAMgATYCDCABIAM2AggMAQsgBSgCGCEIAkAgBSAFKAIMIgFHBEAgBSgCCCIAIAE2AgwgASAANgIIDAELAkAgBUEUaiIAKAIAIgMNACAFQRBqIgAoAgAiAw0AQQAhAQwBCwNAIAAhBCADIgFBFGoiACgCACIDDQAgAUEQaiEAIAEoAhAiAw0ACyAEQQA2AgALIAhFDQACQCAFIAUoAhwiA0ECdEHYngFqIgAoAgBGBEAgACABNgIAIAENAUGsnAFBrJwBKAIAQX4gA3dxNgIADAILIAhBEEEUIAgoAhAgBUYbaiABNgIAIAFFDQELIAEgCDYCGCAFKAIQIgAEQCABIAA2AhAgACABNgIYCyAFKAIUIgBFDQAgASAANgIUIAAgATYCGAsgBSAHaiEFIAIgB2ohAgsgBSAFKAIEQX5xNgIEIAYgAkEBcjYCBCACIAZqIAI2AgAgAkH/AU0EQCACQQN2IgBBA3RB0JwBaiECAn9BqJwBKAIAIgFBASAAdCIAcUUEQEGonAEgACABcjYCACACDAELIAIoAggLIQAgAiAGNgIIIAAgBjYCDCAGIAI2AgwgBiAANgIIDAMLQR8hACACQf///wdNBEAgAkEIdiIAIABBgP4/akEQdkEIcSIDdCIAIABBgOAfakEQdkEEcSIBdCIAIABBgIAPakEQdkECcSIAdEEPdiABIANyIAByayIAQQF0IAIgAEEVanZBAXFyQRxqIQALIAYgADYCHCAGQgA3AhAgAEECdEHYngFqIQQCQEGsnAEoAgAiA0EBIAB0IgFxRQRAQaycASABIANyNgIAIAQgBjYCACAGIAQ2AhgMAQsgAkEAQRkgAEEBdmsgAEEfRht0IQAgBCgCACEBA0AgASIDKAIEQXhxIAJGDQMgAEEddiEBIABBAXQhACADIAFBBHFqIgQoAhAiAQ0ACyAEIAY2AhAgBiADNgIYCyAGIAY2AgwgBiAGNgIIDAILQbScASAFQShrIgNBeCABa0EHcUEAIAFBCGpBB3EbIgBrIgI2AgBBwJwBIAAgAWoiADYCACAAIAJBAXI2AgQgASADakEoNgIEQcScAUGQoAEoAgA2AgAgByAEQScgBGtBB3FBACAEQSdrQQdxG2pBL2siACAAIAdBEGpJGyICQRs2AgQgAkHwnwEpAgA3AhAgAkHonwEpAgA3AghB8J8BIAJBCGo2AgBB7J8BIAU2AgBB6J8BIAE2AgBB9J8BQQA2AgAgAkEYaiEAA0AgAEEHNgIEIABBCGohASAAQQRqIQAgASAESQ0ACyACIAdGDQMgAiACKAIEQX5xNgIEIAcgAiAHayIEQQFyNgIEIAIgBDYCACAEQf8BTQRAIARBA3YiAEEDdEHQnAFqIQICf0GonAEoAgAiAUEBIAB0IgBxRQRAQaicASAAIAFyNgIAIAIMAQsgAigCCAshACACIAc2AgggACAHNgIMIAcgAjYCDCAHIAA2AggMBAtBHyEAIAdCADcCECAEQf///wdNBEAgBEEIdiIAIABBgP4/akEQdkEIcSICdCIAIABBgOAfakEQdkEEcSIBdCIAIABBgIAPakEQdkECcSIAdEEPdiABIAJyIAByayIAQQF0IAQgAEEVanZBAXFyQRxqIQALIAcgADYCHCAAQQJ0QdieAWohAwJAQaycASgCACICQQEgAHQiAXFFBEBBrJwBIAEgAnI2AgAgAyAHNgIAIAcgAzYCGAwBCyAEQQBBGSAAQQF2ayAAQR9GG3QhACADKAIAIQEDQCABIgIoAgRBeHEgBEYNBCAAQR12IQEgAEEBdCEAIAIgAUEEcWoiAygCECIBDQALIAMgBzYCECAHIAI2AhgLIAcgBzYCDCAHIAc2AggMAwsgAygCCCIAIAY2AgwgAyAGNgIIIAZBADYCGCAGIAM2AgwgBiAANgIICyAJQQhqIQAMBQsgAigCCCIAIAc2AgwgAiAHNgIIIAdBADYCGCAHIAI2AgwgByAANgIIC0G0nAEoAgAiACAITQ0AQbScASAAIAhrIgE2AgBBwJwBQcCcASgCACICIAhqIgA2AgAgACABQQFyNgIEIAIgCEEDcjYCBCACQQhqIQAMAwtB+JsBQTA2AgBBACEADAILAkAgBUUNAAJAIAQoAhwiAkECdEHYngFqIgAoAgAgBEYEQCAAIAE2AgAgAQ0BQaycASAJQX4gAndxIgk2AgAMAgsgBUEQQRQgBSgCECAERhtqIAE2AgAgAUUNAQsgASAFNgIYIAQoAhAiAARAIAEgADYCECAAIAE2AhgLIAQoAhQiAEUNACABIAA2AhQgACABNgIYCwJAIANBD00EQCAEIAMgCGoiAEEDcjYCBCAAIARqIgAgACgCBEEBcjYCBAwBCyAEIAhBA3I2AgQgBiADQQFyNgIEIAMgBmogAzYCACADQf8BTQRAIANBA3YiAEEDdEHQnAFqIQICf0GonAEoAgAiAUEBIAB0IgBxRQRAQaicASAAIAFyNgIAIAIMAQsgAigCCAshACACIAY2AgggACAGNgIMIAYgAjYCDCAGIAA2AggMAQtBHyEAIANB////B00EQCADQQh2IgAgAEGA/j9qQRB2QQhxIgJ0IgAgAEGA4B9qQRB2QQRxIgF0IgAgAEGAgA9qQRB2QQJxIgB0QQ92IAEgAnIgAHJrIgBBAXQgAyAAQRVqdkEBcXJBHGohAAsgBiAANgIcIAZCADcCECAAQQJ0QdieAWohAgJAAkAgCUEBIAB0IgFxRQRAQaycASABIAlyNgIAIAIgBjYCACAGIAI2AhgMAQsgA0EAQRkgAEEBdmsgAEEfRht0IQAgAigCACEIA0AgCCIBKAIEQXhxIANGDQIgAEEddiECIABBAXQhACABIAJBBHFqIgIoAhAiCA0ACyACIAY2AhAgBiABNgIYCyAGIAY2AgwgBiAGNgIIDAELIAEoAggiACAGNgIMIAEgBjYCCCAGQQA2AhggBiABNgIMIAYgADYCCAsgBEEIaiEADAELAkAgC0UNAAJAIAEoAhwiAkECdEHYngFqIgAoAgAgAUYEQCAAIAQ2AgAgBA0BQaycASAGQX4gAndxNgIADAILIAtBEEEUIAsoAhAgAUYbaiAENgIAIARFDQELIAQgCzYCGCABKAIQIgAEQCAEIAA2AhAgACAENgIYCyABKAIUIgBFDQAgBCAANgIUIAAgBDYCGAsCQCADQQ9NBEAgASADIAhqIgBBA3I2AgQgACABaiIAIAAoAgRBAXI2AgQMAQsgASAIQQNyNgIEIAkgA0EBcjYCBCADIAlqIAM2AgAgCgRAIApBA3YiAEEDdEHQnAFqIQRBvJwBKAIAIQICf0EBIAB0IgAgBXFFBEBBqJwBIAAgBXI2AgAgBAwBCyAEKAIICyEAIAQgAjYCCCAAIAI2AgwgAiAENgIMIAIgADYCCAtBvJwBIAk2AgBBsJwBIAM2AgALIAFBCGohAAsgDEEQaiQAIAALgwQBA38gAkGABE8EQCAAIAEgAhACGiAADwsgACACaiEDAkAgACABc0EDcUUEQAJAIABBA3FFBEAgACECDAELIAJBAUgEQCAAIQIMAQsgACECA0AgAiABLQAAOgAAIAFBAWohASACQQFqIgJBA3FFDQEgAiADSQ0ACwsCQCADQXxxIgRBwABJDQAgAiAEQUBqIgVLDQADQCACIAEoAgA2AgAgAiABKAIENgIEIAIgASgCCDYCCCACIAEoAgw2AgwgAiABKAIQNgIQIAIgASgCFDYCFCACIAEoAhg2AhggAiABKAIcNgIcIAIgASgCIDYCICACIAEoAiQ2AiQgAiABKAIoNgIoIAIgASgCLDYCLCACIAEoAjA2AjAgAiABKAI0NgI0IAIgASgCODYCOCACIAEoAjw2AjwgAUFAayEBIAJBQGsiAiAFTQ0ACwsgAiAETw0BA0AgAiABKAIANgIAIAFBBGohASACQQRqIgIgBEkNAAsMAQsgA0EESQRAIAAhAgwBCyAAIANBBGsiBEsEQCAAIQIMAQsgACECA0AgAiABLQAAOgAAIAIgAS0AAToAASACIAEtAAI6AAIgAiABLQADOgADIAFBBGohASACQQRqIgIgBE0NAAsLIAIgA0kEQANAIAIgAS0AADoAACABQQFqIQEgAkEBaiICIANHDQALCyAAC84BAQV/AkAgAEUNACAAKAIwIgEEQCAAIAFBAWsiATYCMCABDQELIAAoAiAEQCAAQQE2AiAgABAbGgsgACgCJEEBRgRAIAAQRAsCQCAAKAIsIgFFDQAgAC0AKA0AAkAgASgCRCIDRQ0AIAEoAkwhBANAIAAgBCACQQJ0aiIFKAIARwRAIAMgAkEBaiICRw0BDAILCyAFIAQgA0EBayICQQJ0aigCADYCACABIAI2AkQLCyAAQQBCAEEFEA4aIAAoAgAiAQRAIAEQCgsgABAGCwtaAgJ+AX8CfwJAAkAgAC0AAEUNACAAKQMQIgFCfVYNACABQgJ8IgIgACkDCFgNAQsgAEEAOgAAQQAMAQtBACAAKAIEIgNFDQAaIAAgAjcDECADIAGnai8AAAsLiQEBA38gACgCHCIBEBQCQCAAKAIQIgIgASgCECIDIAIgA0kbIgJFDQAgACgCDCABKAIIIAIQCRogACAAKAIMIAJqNgIMIAEgASgCCCACajYCCCAAIAAoAhQgAmo2AhQgACAAKAIQIAJrNgIQIAEgASgCECACayIANgIQIAANACABIAEoAgQ2AggLC2ECAn4BfwJAAkAgAC0AAEUNACAAKQMQIgJCfVYNACACQgJ8IgMgACkDCFgNAQsgAEEAOgAADwsgACgCBCIERQRADwsgACADNwMQIAQgAqdqIgAgAUEIdjoAASAAIAE6AAALzAIBAn8jAEEQayIEJAACQCAAKQMYIAOtiKdBAXFFBEAgAEEMaiIABEAgAEEANgIEIABBHDYCAAtCfyECDAELAn4gACgCACIFRQRAIAAoAgggASACIAMgACgCBBEMAAwBCyAFIAAoAgggASACIAMgACgCBBEKAAsiAkJ/VQ0AAkAgA0EEaw4LAQAAAAAAAAAAAAEACwJAAkAgAC0AGEEQcUUEQCAAQQxqIgEEQCABQQA2AgQgAUEcNgIACwwBCwJ+IAAoAgAiAUUEQCAAKAIIIARBCGpCCEEEIAAoAgQRDAAMAQsgASAAKAIIIARBCGpCCEEEIAAoAgQRCgALQn9VDQELIABBDGoiAARAIABBADYCBCAAQRQ2AgALDAELIAQoAgghASAEKAIMIQMgAEEMaiIABEAgACADNgIEIAAgATYCAAsLIARBEGokACACC9onAgN+C38CQCAAKAKULUUEQCAAQQc2AqAtDAELAkACQAJAIAAoAnhBAU4EQCAAKAIAIggoAixBAkcNAyAALwGIAQ0CIAAvAYwBDQIgAC8BkAENAiAALwGUAQ0CIAAvAZgBDQIgAC8BnAENAiAALwGgAQ0CIAAvAcABDQIgAC8BxAENAiAALwHIAQ0CIAAvAcwBDQIgAC8B0AENAiAALwHUAQ0CIAAvAdgBDQIgAC8B3AENAiAALwHgAQ0CIAAvAeQBDQIgAC8B6AENAiAALwHsAQ0CIAAvAfgBDQIgAC8B/AENAiAALwGAAg0CIAAvAYQCDQIgAC8BrAENASAALwGwAQ0BIAAvAbwBDQFBICEKA0AgACAKQQJ0IgdqLwGIAQ0CIAAgB0EEcmovAYgBDQIgACAHQQhyai8BiAENAiAAIAdBDHJqLwGIAQ0CIApBBGoiCkGAAkcNAAsMAgsgAkEFaiIIIQkMAwtBASEJCyAIIAk2AiwLIAAgAEGMFmoQVSAAIABBmBZqEFUgAC8BigEhCCAAIABBkBZqKAIAIg1BAnRqQf//AzsBjgFBACEHIA1BAE4EQEEHQYoBIAgbIQ5BBEEDIAgbIQxBfyELQQAhCgNAIAghCSAAIAoiEEEBaiIKQQJ0ai8BigEhCAJAAkAgB0EBaiIPQf//A3EiESAOQf//A3FPDQAgCCAJRw0AIA8hBwwBCwJAIAxB//8DcSARSwRAIAAgCUECdGpB8BRqIgcgBy8BACAPajsBAAwBCyAJBEAgCSALRwRAIAAgCUECdGpB8BRqIgcgBy8BAEEBajsBAAsgACAALwGwFUEBajsBsBUMAQsgB0H//wNxQQlNBEAgACAALwG0FUEBajsBtBUMAQsgACAALwG4FUEBajsBuBULQQAhBwJ/IAhFBEBBAyEMQYoBDAELQQNBBCAIIAlGIgsbIQxBBkEHIAsbCyEOIAkhCwsgDSAQRw0ACwsgAEH+EmovAQAhCCAAIABBnBZqKAIAIg1BAnRqQYITakH//wM7AQBBACEHIA1BAE4EQEEHQYoBIAgbIQ5BBEEDIAgbIQxBfyELQQAhCgNAIAghCSAAIAoiEEEBaiIKQQJ0akH+EmovAQAhCAJAAkAgB0EBaiIPQf//A3EiESAOQf//A3FPDQAgCCAJRw0AIA8hBwwBCwJAIAxB//8DcSARSwRAIAAgCUECdGpB8BRqIgcgBy8BACAPajsBAAwBCyAJBEAgCSALRwRAIAAgCUECdGpB8BRqIgcgBy8BAEEBajsBAAsgACAALwGwFUEBajsBsBUMAQsgB0H//wNxQQlNBEAgACAALwG0FUEBajsBtBUMAQsgACAALwG4FUEBajsBuBULQQAhBwJ/IAhFBEBBAyEMQYoBDAELQQNBBCAIIAlGIgsbIQxBBkEHIAsbCyEOIAkhCwsgDSAQRw0ACwsgACAAQaQWahBVIAAgACgCnC0Cf0ESIABBrhVqLwEADQAaQREgAEH2FGovAQANABpBECAAQaoVai8BAA0AGkEPIABB+hRqLwEADQAaQQ4gAEGmFWovAQANABpBDSAAQf4Uai8BAA0AGkEMIABBohVqLwEADQAaQQsgAEGCFWovAQANABpBCiAAQZ4Vai8BAA0AGkEJIABBhhVqLwEADQAaQQggAEGaFWovAQANABpBByAAQYoVai8BAA0AGkEGIABBlhVqLwEADQAaQQUgAEGOFWovAQANABpBBCAAQZIVai8BAA0AGkEDQQIgAEHyFGovAQAbCyIKQQNsaiIHQRFqNgKcLSAHQRtqQQN2IgcgACgCoC1BCmpBA3YiCSAHIAlJGyEICwJAAkAgAkEEaiAISw0AIAFFDQAgACABIAIgAxA9DAELIAApA7gtIQQgACgCwC0hASAAKAJ8QQRHQQAgCCAJRxtFBEAgA0ECaq0hBQJAIAFBA2oiCEE/TQRAIAUgAa2GIASEIQUMAQsgAUHAAEYEQCAAIAAoAhAiAUEBajYCECABIAAoAgRqIAQ8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAEQgiIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBEIQiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIARCGIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAEQiCIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBEIoiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIARCMIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAEQjiIPAAAQQMhCAwBCyAAIAAoAhAiAkEBajYCECACIAAoAgRqIAUgAa2GIASEIgQ8AAAgACAAKAIQIgJBAWo2AhAgAiAAKAIEaiAEQgiIPAAAIAAgACgCECICQQFqNgIQIAIgACgCBGogBEIQiDwAACAAIAAoAhAiAkEBajYCECACIAAoAgRqIARCGIg8AAAgACAAKAIQIgJBAWo2AhAgAiAAKAIEaiAEQiCIPAAAIAAgACgCECICQQFqNgIQIAIgACgCBGogBEIoiDwAACAAIAAoAhAiAkEBajYCECACIAAoAgRqIARCMIg8AAAgACAAKAIQIgJBAWo2AhAgAiAAKAIEaiAEQjiIPAAAIAFBPWshCCAFQcAAIAFrrYghBQsgACAFNwO4LSAAIAg2AsAtIABB0NsAQdDkABCLAQwBCyADQQRqrSEFAkAgAUEDaiIIQT9NBEAgBSABrYYgBIQhBQwBCyABQcAARgRAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIARCCIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAEQhCIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBEIYiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIARCIIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAEQiiIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBEIwiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIARCOIg8AABBAyEIDAELIAAgACgCECICQQFqNgIQIAIgACgCBGogBSABrYYgBIQiBDwAACAAIAAoAhAiAkEBajYCECACIAAoAgRqIARCCIg8AAAgACAAKAIQIgJBAWo2AhAgAiAAKAIEaiAEQhCIPAAAIAAgACgCECICQQFqNgIQIAIgACgCBGogBEIYiDwAACAAIAAoAhAiAkEBajYCECACIAAoAgRqIARCIIg8AAAgACAAKAIQIgJBAWo2AhAgAiAAKAIEaiAEQiiIPAAAIAAgACgCECICQQFqNgIQIAIgACgCBGogBEIwiDwAACAAIAAoAhAiAkEBajYCECACIAAoAgRqIARCOIg8AAAgAUE9ayEIIAVBwAAgAWutiCEFCyAAIAU3A7gtIAAgCDYCwC0gAEGQFmooAgAiC6xCgAJ9IQQgAEGcFmooAgAhAgJAAkACfwJ+AkACfwJ/IAhBOk0EQCAEIAithiAFhCEEIAhBBWoMAQsgCEHAAEYEQCAAIAAoAhAiAUEBajYCECABIAAoAgRqIAU8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAFQgiIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBUIQiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAVCGIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAFQiCIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBUIoiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAVCMIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAFQjiIPAAAIAKsIQVCBSEGQQoMAgsgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAEIAithiAFhCIFPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBUIIiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAVCEIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAFQhiIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBUIgiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAVCKIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAFQjCIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBUI4iDwAACAEQcAAIAhrrYghBCAIQTtrCyEHIAKsIQUgB0E6Sw0BIAetIQYgB0EFagshCSAFIAaGIASEDAELIAdBwABGBEAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAEPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBEIIiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIARCEIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAEQhiIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBEIgiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIARCKIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAEQjCIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBEI4iDwAACAKrUIDfSEEQgUhBkEJDAILIAAgACgCECIBQQFqNgIQIAEgACgCBGogBSAHrYYgBIQiBDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIARCCIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAEQhCIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBEIYiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIARCIIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAEQiiIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBEIwiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIARCOIg8AAAgB0E7ayEJIAVBwAAgB2utiAshBSAKrUIDfSEEIAlBO0sNASAJrSEGIAlBBGoLIQggBCAGhiAFhCEEDAELIAlBwABGBEAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAFPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBUIIiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAVCEIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAFQhiIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBUIgiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAVCKIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAFQjCIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBUI4iDwAAEEEIQgMAQsgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAEIAmthiAFhCIFPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBUIIiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAVCEIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAFQhiIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBUIgiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAVCKIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAFQjCIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBUI4iDwAACAJQTxrIQggBEHAACAJa62IIQQLQQAhBwNAIAAgByIBQeDwAGotAABBAnRqQfIUajMBACEFAn8gCEE8TQRAIAUgCK2GIASEIQQgCEEDagwBCyAIQcAARgRAIAAgACgCECIHQQFqNgIQIAcgACgCBGogBDwAACAAIAAoAhAiB0EBajYCECAHIAAoAgRqIARCCIg8AAAgACAAKAIQIgdBAWo2AhAgByAAKAIEaiAEQhCIPAAAIAAgACgCECIHQQFqNgIQIAcgACgCBGogBEIYiDwAACAAIAAoAhAiB0EBajYCECAHIAAoAgRqIARCIIg8AAAgACAAKAIQIgdBAWo2AhAgByAAKAIEaiAEQiiIPAAAIAAgACgCECIHQQFqNgIQIAcgACgCBGogBEIwiDwAACAAIAAoAhAiB0EBajYCECAHIAAoAgRqIARCOIg8AAAgBSEEQQMMAQsgACAAKAIQIgdBAWo2AhAgByAAKAIEaiAFIAithiAEhCIEPAAAIAAgACgCECIHQQFqNgIQIAcgACgCBGogBEIIiDwAACAAIAAoAhAiB0EBajYCECAHIAAoAgRqIARCEIg8AAAgACAAKAIQIgdBAWo2AhAgByAAKAIEaiAEQhiIPAAAIAAgACgCECIHQQFqNgIQIAcgACgCBGogBEIgiDwAACAAIAAoAhAiB0EBajYCECAHIAAoAgRqIARCKIg8AAAgACAAKAIQIgdBAWo2AhAgByAAKAIEaiAEQjCIPAAAIAAgACgCECIHQQFqNgIQIAcgACgCBGogBEI4iDwAACAFQcAAIAhrrYghBCAIQT1rCyEIIAFBAWohByABIApHDQALIAAgCDYCwC0gACAENwO4LSAAIABBiAFqIgEgCxCKASAAIABB/BJqIgcgAhCKASAAIAEgBxCLAQsgABCNASADBEAgABCMAQsLGQAgAARAIAAoAgAQBiAAKAIMEAYgABAGCwusAQECfkJ/IQMCQCAALQAoDQACQAJAIAAoAiBFDQAgAkIAUw0AIAJQDQEgAQ0BCyAAQQxqIgAEQCAAQQA2AgQgAEESNgIAC0J/DwsgAC0ANQ0AQgAhAyAALQA0DQAgAlANAANAIAAgASADp2ogAiADfUEBEA4iBEJ/VwRAIABBAToANUJ/IAMgA1AbDwsgBFBFBEAgAyAEfCIDIAJaDQIMAQsLIABBAToANAsgAwt1AgJ+AX8CQAJAIAAtAABFDQAgACkDECICQntWDQAgAkIEfCIDIAApAwhYDQELIABBADoAAA8LIAAoAgQiBEUEQA8LIAAgAzcDECAEIAKnaiIAIAFBGHY6AAMgACABQRB2OgACIAAgAUEIdjoAASAAIAE6AAALVAIBfgF/AkACQCAALQAARQ0AIAEgACkDECIBfCICIAFUDQAgAiAAKQMIWA0BCyAAQQA6AABBAA8LIAAoAgQiA0UEQEEADwsgACACNwMQIAMgAadqC/cEAgF/AX4CQCAAAn8gACgCwC0iAUHAAEYEQCAAIAAoAhAiAUEBajYCECABIAAoAgRqIAApA7gtIgI8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiACQgiIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogAkIQiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAJCGIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiACQiCIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogAkIoiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAJCMIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiACQjiIPAAAIABCADcDuC1BAAwBCyABQSBOBEAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAAKQO4LSICPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogAkIIiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAJCEIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiACQhiIPAAAIAAgAEG8LWo1AgA3A7gtIAAgACgCwC1BIGsiATYCwC0LIAFBEE4EQCAAIAAoAhAiAUEBajYCECABIAAoAgRqIAApA7gtIgI8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiACQgiIPAAAIAAgACkDuC1CEIg3A7gtIAAgACgCwC1BEGsiATYCwC0LIAFBCEgNASAAIAAoAhAiAUEBajYCECABIAAoAgRqIAApA7gtPAAAIAAgACkDuC1CCIg3A7gtIAAoAsAtQQhrCzYCwC0LC3cBAn8jAEEQayIDJABBfyEEAkAgAC0AKA0AIAAoAiBBACACQQNJG0UEQCAAQQxqIgAEQCAAQQA2AgQgAEESNgIACwwBCyADIAI2AgggAyABNwMAIAAgA0IQQQYQDkIAUw0AQQAhBCAAQQA6ADQLIANBEGokACAEC1cCAn4BfwJAAkAgAC0AAEUNACAAKQMQIgFCe1YNACABQgR8IgIgACkDCFgNAQsgAEEAOgAAQQAPCyAAKAIEIgNFBEBBAA8LIAAgAjcDECADIAGnaigAAAtVAgF+AX8gAARAAkAgACkDCFANAEIBIQEDQCAAKAIAIAJBBHRqEDogASAAKQMIWg0BIAGnIQIgAUIBfCEBDAALAAsgACgCABAGIAAoAigQECAAEAYLC2QBAn8CQAJAAkAgAEUEQCABpxAIIgNFDQJBGBAIIgJFDQEMAwsgACEDQRgQCCICDQJBAA8LIAMQBgtBAA8LIAJCADcDECACIAE3AwggAiADNgIEIAJBAToAACACIABFOgABIAILnQECAn4BfwJAAkAgAC0AAEUNACAAKQMQIgJCd1YNACACQgh8IgMgACkDCFgNAQsgAEEAOgAADwsgACgCBCIERQRADwsgACADNwMQIAQgAqdqIgAgAUI4iDwAByAAIAFCMIg8AAYgACABQiiIPAAFIAAgAUIgiDwABCAAIAFCGIg8AAMgACABQhCIPAACIAAgAUIIiDwAASAAIAE8AAAL8AICAn8BfgJAIAJFDQAgACACaiIDQQFrIAE6AAAgACABOgAAIAJBA0kNACADQQJrIAE6AAAgACABOgABIANBA2sgAToAACAAIAE6AAIgAkEHSQ0AIANBBGsgAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgA2AgAgAyACIARrQXxxIgJqIgFBBGsgADYCACACQQlJDQAgAyAANgIIIAMgADYCBCABQQhrIAA2AgAgAUEMayAANgIAIAJBGUkNACADIAA2AhggAyAANgIUIAMgADYCECADIAA2AgwgAUEQayAANgIAIAFBFGsgADYCACABQRhrIAA2AgAgAUEcayAANgIAIAIgA0EEcUEYciIBayICQSBJDQAgAK1CgYCAgBB+IQUgASADaiEBA0AgASAFNwMYIAEgBTcDECABIAU3AwggASAFNwMAIAFBIGohASACQSBrIgJBH0sNAAsLC28BA38gAEEMaiECAkACfyAAKAIgIgFFBEBBfyEBQRIMAQsgACABQQFrIgM2AiBBACEBIAMNASAAQQBCAEECEA4aIAAoAgAiAEUNASAAEBtBf0oNAUEUCyEAIAIEQCACQQA2AgQgAiAANgIACwsgAQufAQIBfwF+An8CQAJ+IAAoAgAiAygCJEEBRkEAIAJCf1UbRQRAIANBDGoiAQRAIAFBADYCBCABQRI2AgALQn8MAQsgAyABIAJBCxAOCyIEQn9XBEAgACgCACEBIABBCGoiAARAIAAgASgCDDYCACAAIAEoAhA2AgQLDAELQQAgAiAEUQ0BGiAAQQhqBEAgAEEbNgIMIABBBjYCCAsLQX8LCyQBAX8gAARAA0AgACgCACEBIAAoAgwQBiAAEAYgASIADQALCwuYAQICfgF/AkACQCAALQAARQ0AIAApAxAiAUJ3Vg0AIAFCCHwiAiAAKQMIWA0BCyAAQQA6AABCAA8LIAAoAgQiA0UEQEIADwsgACACNwMQIAMgAadqIgAxAAZCMIYgADEAB0I4hoQgADEABUIohoQgADEABEIghoQgADEAA0IYhoQgADEAAkIQhoQgADEAAUIIhoQgADEAAHwLMgAgACgCJEEBRwRAIABBDGoiAARAIABBADYCBCAAQRI2AgALQn8PCyAAQQBCAEENEA4LDwAgAARAIAAQNiAAEAYLC4ABAQF/IAAtACgEf0F/BSABRQRAIABBDGoEQCAAQQA2AhAgAEESNgIMC0F/DwsgARAqAkAgACgCACICRQ0AIAIgARAhQX9KDQAgACgCACEBIABBDGoiAARAIAAgASgCDDYCACAAIAEoAhA2AgQLQX8PCyAAIAFCOEEDEA5CP4enCwt/AQN/IAAhAQJAIABBA3EEQANAIAEtAABFDQIgAUEBaiIBQQNxDQALCwNAIAEiAkEEaiEBIAIoAgAiA0F/cyADQYGChAhrcUGAgYKEeHFFDQALIANB/wFxRQRAIAIgAGsPCwNAIAItAAEhAyACQQFqIgEhAiADDQALCyABIABrC98CAQh/IABFBEBBAQ8LAkAgACgCCCICDQBBASEEIAAvAQQiB0UEQEEBIQIMAQsgACgCACEIA0ACQCADIAhqIgUtAAAiAkEgTwRAIAJBGHRBGHVBf0oNAQsgAkENTUEAQQEgAnRBgMwAcRsNAAJ/An8gAkHgAXFBwAFGBEBBASEGIANBAWoMAQsgAkHwAXFB4AFGBEAgA0ECaiEDQQAhBkEBDAILIAJB+AFxQfABRwRAQQQhAgwFC0EAIQYgA0EDagshA0EACyEJQQQhAiADIAdPDQIgBS0AAUHAAXFBgAFHDQJBAyEEIAYNACAFLQACQcABcUGAAUcNAiAJDQAgBS0AA0HAAXFBgAFHDQILIAQhAiADQQFqIgMgB0kNAAsLIAAgAjYCCAJ/AkAgAUUNAAJAIAFBAkcNACACQQNHDQBBAiECIABBAjYCCAsgASACRg0AQQUgAkEBRw0BGgsgAgsLSAICfgJ/IwBBEGsiBCABNgIMQgEgAK2GIQIDQCAEIAFBBGoiADYCDCACIgNCASABKAIAIgWthoQhAiAAIQEgBUF/Sg0ACyADC4cFAQd/AkACQCAARQRAQcUUIQIgAUUNASABQQA2AgBBxRQPCyACQcAAcQ0BIAAoAghFBEAgAEEAECMaCyAAKAIIIQQCQCACQYABcQRAIARBAWtBAk8NAQwDCyAEQQRHDQILAkAgACgCDCICDQAgAAJ/IAAoAgAhCCAAQRBqIQlBACECAkACQAJAAkAgAC8BBCIFBEBBASEEIAVBAXEhByAFQQFHDQEMAgsgCUUNAiAJQQA2AgBBAAwECyAFQX5xIQYDQCAEQQFBAkEDIAIgCGotAABBAXRB0BRqLwEAIgpBgBBJGyAKQYABSRtqQQFBAkEDIAggAkEBcmotAABBAXRB0BRqLwEAIgRBgBBJGyAEQYABSRtqIQQgAkECaiECIAZBAmsiBg0ACwsCfyAHBEAgBEEBQQJBAyACIAhqLQAAQQF0QdAUai8BACICQYAQSRsgAkGAAUkbaiEECyAECxAIIgdFDQEgBUEBIAVBAUsbIQpBACEFQQAhBgNAIAUgB2ohAwJ/IAYgCGotAABBAXRB0BRqLwEAIgJB/wBNBEAgAyACOgAAIAVBAWoMAQsgAkH/D00EQCADIAJBP3FBgAFyOgABIAMgAkEGdkHAAXI6AAAgBUECagwBCyADIAJBP3FBgAFyOgACIAMgAkEMdkHgAXI6AAAgAyACQQZ2QT9xQYABcjoAASAFQQNqCyEFIAZBAWoiBiAKRw0ACyAHIARBAWsiAmpBADoAACAJRQ0AIAkgAjYCAAsgBwwBCyADBEAgA0EANgIEIANBDjYCAAtBAAsiAjYCDCACDQBBAA8LIAFFDQAgASAAKAIQNgIACyACDwsgAQRAIAEgAC8BBDYCAAsgACgCAAuDAQEEf0ESIQUCQAJAIAApAzAgAVgNACABpyEGIAAoAkAhBCACQQhxIgdFBEAgBCAGQQR0aigCBCICDQILIAQgBkEEdGoiBCgCACICRQ0AIAQtAAxFDQFBFyEFIAcNAQtBACECIAMgAEEIaiADGyIABEAgAEEANgIEIAAgBTYCAAsLIAILbgEBfyMAQYACayIFJAACQCAEQYDABHENACACIANMDQAgBSABQf8BcSACIANrIgJBgAIgAkGAAkkiARsQGiABRQRAA0AgACAFQYACEC4gAkGAAmsiAkH/AUsNAAsLIAAgBSACEC4LIAVBgAJqJAALUgECf0H0mAEoAgAiASAAQQNqQXxxIgJqIQACQCACQQAgACABTRsNACAAPwBBEHRLBEAgABADRQ0BC0H0mAEgADYCACABDwtB+JsBQTA2AgBBfwuGBQEGfyAAKAIwIgNBhgJrIQYgACgCPCECIAMhAQNAIAAoAkQgAiAAKAJkIgRqayECIAEgBmogBE0EQCAAKAJIIgEgASADaiADEAkaAkAgAyAAKAJoIgFNBEAgACABIANrNgJoDAELIABCADcDaAsgACAAKAJkIANrIgE2AmQgACAAKAJUIANrNgJUIAEgACgCqC1JBEAgACABNgKoLQsgAEHQmAEoAgARBAAgAiADaiECCwJAIAAoAgAiASgCBCIERQ0AIAAoAjwhBSAAIAIgBCACIARJGyICBH8gACgCSCAAKAJkaiAFaiEFIAEgBCACazYCBAJAIAEoAhwoAhRBAkYEQCABIAUgAhBADAELIAUgASgCACACEAkhBCABKAIcKAIUQQFHDQAgASABKAIwIAQgAkHImAEoAgARAAA2AjALIAEgASgCACACajYCACABIAEoAgggAmo2AgggACgCPAUgBQsgAmoiAjYCPAJAIAAoAqgtIgEgAmpBA0kNACAAKAJkIAFrIgEEQCAAIAFBAWtBxJgBKAIAEQEAGiAAKAI8IQILIAAoAqgtIAJBAUZrIgRFDQAgACABIARBwJgBKAIAEQcAIAAgACgCqC0gBGs2AqgtIAAoAjwhAgsgAkGFAksNACAAKAIAKAIERQ0AIAAoAjAhAQwBCwsCQCAAKAJEIgIgACgCQCIDTQ0AIAACfyAAKAI8IAAoAmRqIgEgA0sEQCAAKAJIIAFqQQAgAiABayIDQYICIANBggJJGyIDEBogASADagwBCyABQYICaiIBIANNDQEgACgCSCADakEAIAIgA2siAiABIANrIgMgAiADSRsiAxAaIAAoAkAgA2oLNgJACws3ACAAQn83AxAgAEEANgIIIABCADcDACAAQQA2AjAgAEL/////DzcDKCAAQgA3AxggAEIANwMgC6UBAQF/QdgAEAgiAUUEQEEADwsCQCAABEAgASAAQdgAEAkaDAELIAFCADcDICABQQA2AhggAUL/////DzcDECABQQA7AQwgAUG/hig2AgggAUEBOgAGIAFBADoABCABQgA3A0ggAUGAgNiNeDYCRCABQgA3AyggAUIANwMwIAFCADcDOCABQUBrQQA7AQAgAUIANwNQCyABQQE6AAUgAUEANgIAIAELWAICfgF/AkACQCAALQAARQ0AIAApAxAiAyACrXwiBCADVA0AIAQgACkDCFgNAQsgAEEAOgAADwsgACgCBCIFRQRADwsgACAENwMQIAUgA6dqIAEgAhAJGguWAQECfwJAAkAgAkUEQCABpxAIIgVFDQFBGBAIIgQNAiAFEAYMAQsgAiEFQRgQCCIEDQELIAMEQCADQQA2AgQgA0EONgIAC0EADwsgBEIANwMQIAQgATcDCCAEIAU2AgQgBEEBOgAAIAQgAkU6AAEgACAFIAEgAxBpQQBIBH8gBC0AAQRAIAQoAgQQBgsgBBAGQQAFIAQLC5sCAQN/IAAtAABBIHFFBEACQCABIQMCQCACIAAiASgCECIABH8gAAUCfyABIAEtAEoiAEEBayAAcjoASiABKAIAIgBBCHEEQCABIABBIHI2AgBBfwwBCyABQgA3AgQgASABKAIsIgA2AhwgASAANgIUIAEgACABKAIwajYCEEEACw0BIAEoAhALIAEoAhQiBWtLBEAgASADIAIgASgCJBEAABoMAgsCfyABLABLQX9KBEAgAiEAA0AgAiAAIgRFDQIaIAMgBEEBayIAai0AAEEKRw0ACyABIAMgBCABKAIkEQAAIARJDQIgAyAEaiEDIAEoAhQhBSACIARrDAELIAILIQAgBSADIAAQCRogASABKAIUIABqNgIUCwsLCxAAIAAoAggQBiAAQQA2AggLWQIBfwF+AkACf0EAIABFDQAaIACtIAGtfiIDpyICIAAgAXJBgIAESQ0AGkF/IAIgA0IgiKcbCyICEAgiAEUNACAAQQRrLQAAQQNxRQ0AIABBACACEBoLIAAL8AEBAn9BfyEBAkAgAC0AKA0AIAAoAiRBA0YEQCAAQQxqBEAgAEEANgIQIABBFzYCDAtBfw8LAkAgACgCIARAIAApAxhCwACDQgBSDQEgAEEMagRAIABBADYCECAAQR02AgwLQX8PCwJAIAAoAgAiAkUNACACEDFBf0oNACAAKAIAIQEgAEEMaiIABEAgACABKAIMNgIAIAAgASgCEDYCBAtBfw8LIABBAEIAQQAQDkJ/VQ0AIAAoAgAiAEUNASAAEBsaQX8PC0EAIQEgAEEAOwE0IABBDGoEQCAAQgA3AgwLIAAgACgCIEEBajYCIAsgAQs7ACAALQAoBH5CfwUgACgCIEUEQCAAQQxqIgAEQCAAQQA2AgQgAEESNgIAC0J/DwsgAEEAQgBBBxAOCwuaCAELfyAARQRAIAEQCA8LIAFBQE8EQEH4mwFBMDYCAEEADwsCf0EQIAFBC2pBeHEgAUELSRshBiAAQQhrIgUoAgQiCUF4cSEEAkAgCUEDcUUEQEEAIAZBgAJJDQIaIAZBBGogBE0EQCAFIQIgBCAGa0GIoAEoAgBBAXRNDQILQQAMAgsgBCAFaiEHAkAgBCAGTwRAIAQgBmsiA0EQSQ0BIAUgCUEBcSAGckECcjYCBCAFIAZqIgIgA0EDcjYCBCAHIAcoAgRBAXI2AgQgAiADEDsMAQsgB0HAnAEoAgBGBEBBtJwBKAIAIARqIgQgBk0NAiAFIAlBAXEgBnJBAnI2AgQgBSAGaiIDIAQgBmsiAkEBcjYCBEG0nAEgAjYCAEHAnAEgAzYCAAwBCyAHQbycASgCAEYEQEGwnAEoAgAgBGoiAyAGSQ0CAkAgAyAGayICQRBPBEAgBSAJQQFxIAZyQQJyNgIEIAUgBmoiBCACQQFyNgIEIAMgBWoiAyACNgIAIAMgAygCBEF+cTYCBAwBCyAFIAlBAXEgA3JBAnI2AgQgAyAFaiICIAIoAgRBAXI2AgRBACECQQAhBAtBvJwBIAQ2AgBBsJwBIAI2AgAMAQsgBygCBCIDQQJxDQEgA0F4cSAEaiIKIAZJDQEgCiAGayEMAkAgA0H/AU0EQCAHKAIIIgQgA0EDdiICQQN0QdCcAWpGGiAEIAcoAgwiA0YEQEGonAFBqJwBKAIAQX4gAndxNgIADAILIAQgAzYCDCADIAQ2AggMAQsgBygCGCELAkAgByAHKAIMIghHBEAgBygCCCICQbicASgCAEkaIAIgCDYCDCAIIAI2AggMAQsCQCAHQRRqIgQoAgAiAg0AIAdBEGoiBCgCACICDQBBACEIDAELA0AgBCEDIAIiCEEUaiIEKAIAIgINACAIQRBqIQQgCCgCECICDQALIANBADYCAAsgC0UNAAJAIAcgBygCHCIDQQJ0QdieAWoiAigCAEYEQCACIAg2AgAgCA0BQaycAUGsnAEoAgBBfiADd3E2AgAMAgsgC0EQQRQgCygCECAHRhtqIAg2AgAgCEUNAQsgCCALNgIYIAcoAhAiAgRAIAggAjYCECACIAg2AhgLIAcoAhQiAkUNACAIIAI2AhQgAiAINgIYCyAMQQ9NBEAgBSAJQQFxIApyQQJyNgIEIAUgCmoiAiACKAIEQQFyNgIEDAELIAUgCUEBcSAGckECcjYCBCAFIAZqIgMgDEEDcjYCBCAFIApqIgIgAigCBEEBcjYCBCADIAwQOwsgBSECCyACCyICBEAgAkEIag8LIAEQCCIFRQRAQQAPCyAFIABBfEF4IABBBGsoAgAiAkEDcRsgAkF4cWoiAiABIAEgAksbEAkaIAAQBiAFC30BAX8gACAAKAIQIgJBAWo2AhAgAiAAKAIEaiABOgAAIAAgACgCECICQQFqNgIQIAIgACgCBGogAUEIdjoAACAAIAAoAhAiAkEBajYCECACIAAoAgRqIAFBEHY6AAAgACAAKAIQIgJBAWo2AhAgAiAAKAIEaiABQRh2OgAAC+kBAQN/AkAgAUUNACACQYAwcSICBH8CfyACQYAgRwRAQQIgAkGAEEYNARogAwRAIANBADYCBCADQRI2AgALQQAPC0EECyECQQAFQQELIQZBFBAIIgRFBEAgAwRAIANBADYCBCADQQ42AgALQQAPCyAEIAFBAWoQCCIFNgIAIAVFBEAgBBAGQQAPCyAFIAAgARAJIAFqQQA6AAAgBEEANgIQIARCADcDCCAEIAE7AQQgBg0AIAQgAhAjQQVHDQAgBCgCABAGIAQoAgwQBiAEEAZBACEEIAMEQCADQQA2AgQgA0ESNgIACwsgBAu1AQECfwJAAkACQAJAAkACQAJAIAAtAAUEQCAALQAAQQJxRQ0BCyAAKAIwEBAgAEEANgIwIAAtAAVFDQELIAAtAABBCHFFDQELIAAoAjQQHSAAQQA2AjQgAC0ABUUNAQsgAC0AAEEEcUUNAQsgACgCOBAQIABBADYCOCAALQAFRQ0BCyAALQAAQYABcUUNAQsgACgCVCIBBH8gAUEAIAEQIhAaIAAoAlQFQQALEAYgAEEANgJUCwvcDAIJfwF+IwBBQGoiBiQAAkACQAJAAkACQCABKAIwQQAQIyIFQQJGQQAgASgCOEEAECMiBEEBRhsNACAFQQFGQQAgBEECRhsNACAFQQJHIgMNASAEQQJHDQELIAEgAS8BDEGAEHI7AQxBACEDDAELIAEgAS8BDEH/7wNxOwEMQQAhBSADRQRAQfXgASABKAIwIABBCGoQbSIFRQ0CCyACQYACcQRAIAUhAwwBCyAEQQJHBEAgBSEDDAELQfXGASABKAI4IABBCGoQbSIDRQRAIAUQHQwCCyADIAU2AgALIAEgAS8BDEH+/wNxIAEvAVIiBUEAR3I7AQwCQAJAAkACQAJ/AkACQCABKQMoQv7///8PVg0AIAEpAyBC/v///w9WDQAgAkGABHFFDQEgASkDSEL/////D1QNAQsgBUGBAmtB//8DcUEDSSEHQQEMAQsgBUGBAmtB//8DcSEEIAJBgApxQYAKRw0BIARBA0khB0EACyEJIAZCHBAYIgRFBEAgAEEIaiIABEAgAEEANgIEIABBDjYCAAsgAxAdDAULIAJBgAhxIQUCQAJAIAJBgAJxBEACQCAFDQAgASkDIEL/////D1YNACABKQMoQoCAgIAQVA0DCyAEIAEpAygQGSABKQMgIQwMAQsCQAJAAkAgBQ0AIAEpAyBC/////w9WDQAgASkDKCIMQv////8PVg0BIAEpA0hCgICAgBBUDQQLIAEpAygiDEL/////D1QNAQsgBCAMEBkLIAEpAyAiDEL/////D1oEQCAEIAwQGQsgASkDSCIMQv////8PVA0BCyAEIAwQGQsgBC0AAEUEQCAAQQhqIgAEQCAAQQA2AgQgAEEUNgIACyAEEAcgAxAdDAULQQEhCkEBIAQtAAAEfiAEKQMQBUIAC6dB//8DcSAGEEghBSAEEAcgBSADNgIAIAcNAQwCCyADIQUgBEECSw0BCyAGQgcQGCIERQRAIABBCGoiAARAIABBADYCBCAAQQ42AgALIAUQHQwDCyAEQQIQDSAEQYcSQQIQLCAEIAEtAFIQdCAEIAEvARAQDSAELQAARQRAIABBCGoiAARAIABBADYCBCAAQRQ2AgALIAQQBwwCC0GBsgJBByAGEEghAyAEEAcgAyAFNgIAQQEhCyADIQULIAZCLhAYIgNFBEAgAEEIaiIABEAgAEEANgIEIABBDjYCAAsgBRAdDAILIANBoxJBqBIgAkGAAnEiBxtBBBAsIAdFBEAgAyAJBH9BLQUgAS8BCAtB//8DcRANCyADIAkEf0EtBSABLwEKC0H//wNxEA0gAyABLwEMEA0gAyALBH9B4wAFIAEoAhALQf//A3EQDSAGIAEoAhQ2AjwCfyAGQTxqEIkBIghFBEBBACEJQSEMAQsCfyAIKAIUIgRB0ABOBEAgBEEJdAwBCyAIQdAANgIUQYDAAgshBCAIKAIEQQV0IAgoAghBC3RqIAgoAgBBAXZqIQkgCCgCDCAEIAgoAhBBBXRqakGgwAFqCyEEIAMgCUH//wNxEA0gAyAEQf//A3EQDSADAn8gCwRAQQAgASkDKEIUVA0BGgsgASgCGAsQEiABKQMgIQwgAwJ/IAMCfwJAIAcEQCAMQv7///8PWARAIAEpAyhC/////w9UDQILIANBfxASQX8MAwtBfyAMQv7///8PVg0BGgsgDKcLEBIgASkDKCIMQv////8PIAxC/////w9UG6cLEBIgAyABKAIwIgQEfyAELwEEBUEAC0H//wNxEA0gAyABKAI0IAIQcCAFQYAGEHBqQf//A3EQDSAHRQRAIAMgASgCOCIEBH8gBC8BBAVBAAtB//8DcRANIAMgAS8BPBANIAMgAS8BQBANIAMgASgCRBASIAMgASkDSCIMQv////8PIAxC/////w9UG6cQEgsgAy0AAEUEQCAAQQhqIgAEQCAAQQA2AgQgAEEUNgIACyADEAcgBRAdDAILIAAgBiADLQAABH4gAykDEAVCAAsQHCEEIAMQByAEQX9MDQAgASgCMCIDBEAgACADEGRBf0wNAQsgBQRAIAAgBUGABhBvQX9MDQELIAUQHSABKAI0IgUEQCAAIAUgAhBvQQBIDQILIAcNAiABKAI4IgFFDQIgACABEGRBAE4NAgwBCyAFEB0LQX8hCgsgBkFAayQAIAoLTQECfyABLQAAIQICQCAALQAAIgNFDQAgAiADRw0AA0AgAS0AASECIAAtAAEiA0UNASABQQFqIQEgAEEBaiEAIAIgA0YNAAsLIAMgAmsLrAQCAX8BfgJAIAANACABUA0AIAMEQCADQQA2AgQgA0ESNgIAC0EADwsCQAJAIAAgASACIAMQhwEiBEUNAEEYEAgiAkUEQCADBEAgA0EANgIEIANBDjYCAAsCQCAEKAIoIgBFBEAgBCkDGCEBDAELIABBADYCKCAEKAIoQgA3AyAgBCAEKQMYIgUgBCkDICIBIAEgBVQbIgE3AxgLIAQpAwggAVYEQANAIAQoAgAgAadBBHRqKAIAEAYgAUIBfCIBIAQpAwhUDQALCyAEKAIAEAYgBCgCBBAGIAQQBgwBCyACQQA2AhQgAiAENgIQIAJBABABNgIMIAJBADYCCCACQgA3AgACf0E4EAgiAEUEQCADBEAgA0EANgIEIANBDjYCAAtBAAwBCyAAQQA2AgggAEIANwMAIABCADcDICAAQoCAgIAQNwIsIABBADoAKCAAQQA2AhQgAEIANwIMIABBADsBNCAAIAI2AgggAEEjNgIEIABCPyACQQBCAEEOQSMRDAAiASABQgBTGzcDGCAACyIADQEgAigCECIDBEACQCADKAIoIgBFBEAgAykDGCEBDAELIABBADYCKCADKAIoQgA3AyAgAyADKQMYIgUgAykDICIBIAEgBVQbIgE3AxgLIAMpAwggAVYEQANAIAMoAgAgAadBBHRqKAIAEAYgAUIBfCIBIAMpAwhUDQALCyADKAIAEAYgAygCBBAGIAMQBgsgAhAGC0EAIQALIAALFAAgABBBIAAoAgAQICAAKAIEECALiwwBBn8gACABaiEFAkACQCAAKAIEIgJBAXENACACQQNxRQ0BIAAoAgAiAiABaiEBAkAgACACayIAQbycASgCAEcEQCACQf8BTQRAIAAoAggiBCACQQN2IgJBA3RB0JwBakYaIAAoAgwiAyAERw0CQaicAUGonAEoAgBBfiACd3E2AgAMAwsgACgCGCEGAkAgACAAKAIMIgNHBEAgACgCCCICQbicASgCAEkaIAIgAzYCDCADIAI2AggMAQsCQCAAQRRqIgIoAgAiBA0AIABBEGoiAigCACIEDQBBACEDDAELA0AgAiEHIAQiA0EUaiICKAIAIgQNACADQRBqIQIgAygCECIEDQALIAdBADYCAAsgBkUNAgJAIAAgACgCHCIEQQJ0QdieAWoiAigCAEYEQCACIAM2AgAgAw0BQaycAUGsnAEoAgBBfiAEd3E2AgAMBAsgBkEQQRQgBigCECAARhtqIAM2AgAgA0UNAwsgAyAGNgIYIAAoAhAiAgRAIAMgAjYCECACIAM2AhgLIAAoAhQiAkUNAiADIAI2AhQgAiADNgIYDAILIAUoAgQiAkEDcUEDRw0BQbCcASABNgIAIAUgAkF+cTYCBCAAIAFBAXI2AgQgBSABNgIADwsgBCADNgIMIAMgBDYCCAsCQCAFKAIEIgJBAnFFBEAgBUHAnAEoAgBGBEBBwJwBIAA2AgBBtJwBQbScASgCACABaiIBNgIAIAAgAUEBcjYCBCAAQbycASgCAEcNA0GwnAFBADYCAEG8nAFBADYCAA8LIAVBvJwBKAIARgRAQbycASAANgIAQbCcAUGwnAEoAgAgAWoiATYCACAAIAFBAXI2AgQgACABaiABNgIADwsgAkF4cSABaiEBAkAgAkH/AU0EQCAFKAIIIgQgAkEDdiICQQN0QdCcAWpGGiAEIAUoAgwiA0YEQEGonAFBqJwBKAIAQX4gAndxNgIADAILIAQgAzYCDCADIAQ2AggMAQsgBSgCGCEGAkAgBSAFKAIMIgNHBEAgBSgCCCICQbicASgCAEkaIAIgAzYCDCADIAI2AggMAQsCQCAFQRRqIgQoAgAiAg0AIAVBEGoiBCgCACICDQBBACEDDAELA0AgBCEHIAIiA0EUaiIEKAIAIgINACADQRBqIQQgAygCECICDQALIAdBADYCAAsgBkUNAAJAIAUgBSgCHCIEQQJ0QdieAWoiAigCAEYEQCACIAM2AgAgAw0BQaycAUGsnAEoAgBBfiAEd3E2AgAMAgsgBkEQQRQgBigCECAFRhtqIAM2AgAgA0UNAQsgAyAGNgIYIAUoAhAiAgRAIAMgAjYCECACIAM2AhgLIAUoAhQiAkUNACADIAI2AhQgAiADNgIYCyAAIAFBAXI2AgQgACABaiABNgIAIABBvJwBKAIARw0BQbCcASABNgIADwsgBSACQX5xNgIEIAAgAUEBcjYCBCAAIAFqIAE2AgALIAFB/wFNBEAgAUEDdiICQQN0QdCcAWohAQJ/QaicASgCACIDQQEgAnQiAnFFBEBBqJwBIAIgA3I2AgAgAQwBCyABKAIICyECIAEgADYCCCACIAA2AgwgACABNgIMIAAgAjYCCA8LQR8hAiAAQgA3AhAgAUH///8HTQRAIAFBCHYiAiACQYD+P2pBEHZBCHEiBHQiAiACQYDgH2pBEHZBBHEiA3QiAiACQYCAD2pBEHZBAnEiAnRBD3YgAyAEciACcmsiAkEBdCABIAJBFWp2QQFxckEcaiECCyAAIAI2AhwgAkECdEHYngFqIQcCQAJAQaycASgCACIEQQEgAnQiA3FFBEBBrJwBIAMgBHI2AgAgByAANgIAIAAgBzYCGAwBCyABQQBBGSACQQF2ayACQR9GG3QhAiAHKAIAIQMDQCADIgQoAgRBeHEgAUYNAiACQR12IQMgAkEBdCECIAQgA0EEcWoiB0EQaigCACIDDQALIAcgADYCECAAIAQ2AhgLIAAgADYCDCAAIAA2AggPCyAEKAIIIgEgADYCDCAEIAA2AgggAEEANgIYIAAgBDYCDCAAIAE2AggLC0MBA38CQCACRQ0AA0AgAC0AACIEIAEtAAAiBUYEQCABQQFqIQEgAEEBaiEAIAJBAWsiAg0BDAILCyAEIAVrIQMLIAML/wUCAX8CfiADrSEGIAApA7gtIQUCQCAAKALALSIDQQNqIgRBP00EQCAGIAOthiAFhCEGDAELIANBwABGBEAgACAAKAIQIgNBAWo2AhAgAyAAKAIEaiAFPAAAIAAgACgCECIDQQFqNgIQIAMgACgCBGogBUIIiDwAACAAIAAoAhAiA0EBajYCECADIAAoAgRqIAVCEIg8AAAgACAAKAIQIgNBAWo2AhAgAyAAKAIEaiAFQhiIPAAAIAAgACgCECIDQQFqNgIQIAMgACgCBGogBUIgiDwAACAAIAAoAhAiA0EBajYCECADIAAoAgRqIAVCKIg8AAAgACAAKAIQIgNBAWo2AhAgAyAAKAIEaiAFQjCIPAAAIAAgACgCECIDQQFqNgIQIAMgACgCBGogBUI4iDwAAEEDIQQMAQsgACAAKAIQIgRBAWo2AhAgBCAAKAIEaiAGIAOthiAFhCIFPAAAIAAgACgCECIEQQFqNgIQIAQgACgCBGogBUIIiDwAACAAIAAoAhAiBEEBajYCECAEIAAoAgRqIAVCEIg8AAAgACAAKAIQIgRBAWo2AhAgBCAAKAIEaiAFQhiIPAAAIAAgACgCECIEQQFqNgIQIAQgACgCBGogBUIgiDwAACAAIAAoAhAiBEEBajYCECAEIAAoAgRqIAVCKIg8AAAgACAAKAIQIgRBAWo2AhAgBCAAKAIEaiAFQjCIPAAAIAAgACgCECIEQQFqNgIQIAQgACgCBGogBUI4iDwAACADQT1rIQQgBkHAACADa62IIQYLIAAgBjcDuC0gACAENgLALSAAEIwBIAAgACgCECIDQQFqNgIQIAMgACgCBGogAjoAACAAIAAoAhAiA0EBajYCECADIAAoAgRqIAJBCHY6AAAgACAAKAIQIgNBAWo2AhAgAyAAKAIEaiACQX9zIgM6AAAgACAAKAIQIgRBAWo2AhAgBCAAKAIEaiADQQh2OgAAIAIEQCAAKAIEIAAoAhBqIAEgAhAJGiAAIAAoAhAgAmo2AhALC94EAgF/An4gAUECaq0hBCAAKQO4LSEDAkAgACgCwC0iAUEDaiICQT9NBEAgBCABrYYgA4QhBAwBCyABQcAARgRAIAAgACgCECIBQQFqNgIQIAEgACgCBGogAzwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIANCCIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiADQhCIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogA0IYiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIANCIIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiADQiiIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogA0IwiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIANCOIg8AABBAyECDAELIAAgACgCECICQQFqNgIQIAIgACgCBGogBCABrYYgA4QiAzwAACAAIAAoAhAiAkEBajYCECACIAAoAgRqIANCCIg8AAAgACAAKAIQIgJBAWo2AhAgAiAAKAIEaiADQhCIPAAAIAAgACgCECICQQFqNgIQIAIgACgCBGogA0IYiDwAACAAIAAoAhAiAkEBajYCECACIAAoAgRqIANCIIg8AAAgACAAKAIQIgJBAWo2AhAgAiAAKAIEaiADQiiIPAAAIAAgACgCECICQQFqNgIQIAIgACgCBGogA0IwiDwAACAAIAAoAhAiAkEBajYCECACIAAoAgRqIANCOIg8AAAgAUE9ayECIARBwAAgAWutiCEECyAAIAQ3A7gtIAAgAjYCwC0LqAkCA38CfkHQ4wAzAQAhBSAAKQO4LSEGAkAgACgCwC0iBEHS4wAvAQAiA2oiAkE/TQRAIAUgBK2GIAaEIQUMAQsgBEHAAEYEQCAAIAAoAhAiAkEBajYCECACIAAoAgRqIAY8AAAgACAAKAIQIgJBAWo2AhAgAiAAKAIEaiAGQgiIPAAAIAAgACgCECICQQFqNgIQIAIgACgCBGogBkIQiDwAACAAIAAoAhAiAkEBajYCECACIAAoAgRqIAZCGIg8AAAgACAAKAIQIgJBAWo2AhAgAiAAKAIEaiAGQiCIPAAAIAAgACgCECICQQFqNgIQIAIgACgCBGogBkIoiDwAACAAIAAoAhAiAkEBajYCECACIAAoAgRqIAZCMIg8AAAgACAAKAIQIgJBAWo2AhAgAiAAKAIEaiAGQjiIPAAAIAMhAgwBCyAAIAAoAhAiA0EBajYCECADIAAoAgRqIAUgBK2GIAaEIgY8AAAgACAAKAIQIgNBAWo2AhAgAyAAKAIEaiAGQgiIPAAAIAAgACgCECIDQQFqNgIQIAMgACgCBGogBkIQiDwAACAAIAAoAhAiA0EBajYCECADIAAoAgRqIAZCGIg8AAAgACAAKAIQIgNBAWo2AhAgAyAAKAIEaiAGQiCIPAAAIAAgACgCECIDQQFqNgIQIAMgACgCBGogBkIoiDwAACAAIAAoAhAiA0EBajYCECADIAAoAgRqIAZCMIg8AAAgACAAKAIQIgNBAWo2AhAgAyAAKAIEaiAGQjiIPAAAIAJBQGohAiAFQcAAIARrrYghBQsgACAFNwO4LSAAIAI2AsAtIAEEQAJAIAJBOU4EQCAAIAAoAhAiAUEBajYCECABIAAoAgRqIAU8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAFQgiIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBUIQiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAVCGIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAFQiCIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBUIoiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAVCMIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAFQjiIPAAADAELIAJBGU4EQCAAIAAoAhAiAUEBajYCECABIAAoAgRqIAU8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAFQgiIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBUIQiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAVCGIg8AAAgACAAKQO4LUIgiCIFNwO4LSAAIAAoAsAtQSBrIgI2AsAtCyACQQlOBEAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAFPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogBUIIiDwAACAAIAApA7gtQhCIIgU3A7gtIAAgACgCwC1BEGsiAjYCwC0LIAJBAUgNACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAU8AAALIABBADYCwC0gAEIANwO4LQsLNAAgASAAKAIAIAIQCSIBRQRAIABBADYCMA8LIAAgACgCMCABIAKtQcyYASgCABEDADYCMAtfAQJ/IAAoAggiAQRAIAEQCiAAQQA2AggLAkAgACgCBCIBRQ0AIAEoAgAiAkEBcUUNACABKAIQQX5HDQAgASACQX5xIgI2AgAgAg0AIAEQICAAQQA2AgQLIABBADoADAvXAgIEfwF+AkACQCAAKAJAIAGnQQR0aigCACIDRQRAIAIEQCACQQA2AgQgAkEUNgIACwwBCyAAKAIAIAMpA0giB0EAEBUhAyAAKAIAIQAgA0F/TARAIAIEQCACIAAoAgw2AgAgAiAAKAIQNgIECwwBC0IAIQEjAEEQayIGJABBfyEDAkAgAEIaQQEQFUF/TARAIAIEQCACIAAoAgw2AgAgAiAAKAIQNgIECwwBCyAAQgQgBkEKaiACEC0iBEUNAEEeIQBBASEFA0AgBBALIABqIQAgBUECRwRAIAVBAWohBQwBCwsgBC0AAAR/IAQpAxAgBCkDCFEFQQALRQRAIAIEQCACQQA2AgQgAkEUNgIACyAEEAcMAQsgBBAHIAAhAwsgBkEQaiQAIAMiAEEASA0BIAcgAK18IgFCf1UNASACBEAgAkEWNgIEIAJBBDYCAAsLQgAhAQsgAQtgAgF+AX8CQCAARQ0AIABBCGoQYiIARQ0AIAEgASgCMEEBajYCMCAAIAM2AgggACACNgIEIAAgATYCACAAQj8gASADQQBCAEEOIAIRCgAiBCAEQgBTGzcDGCAAIQULIAULIgAgACgCJEEBa0EBTQRAIABBAEIAQQoQDhogAEEANgIkCwtuAAJAAkACQCADQhBUDQAgAkUNAQJ+AkACQAJAIAIoAggOAwIAAQQLIAIpAwAgAHwMAgsgAikDACABfAwBCyACKQMACyIDQgBTDQAgASADWg0CCyAEBEAgBEEANgIEIARBEjYCAAsLQn8hAwsgAwuCAgIBfwJ+AkBBASACIAMbBEAgAiADahAIIgVFBEAgBARAIARBADYCBCAEQQ42AgALQQAPCyACrSEGAkACQCAABEAgACAGEBMiAEUEQCAEBEAgBEEANgIEIARBDjYCAAsMBQsgBSAAIAIQCRogAw0BDAILIAEgBSAGEBEiB0J/VwRAIAQEQCAEIAEoAgw2AgAgBCABKAIQNgIECwwECyAGIAdVBEAgBARAIARBADYCBCAEQRE2AgALDAQLIANFDQELIAIgBWoiAEEAOgAAIAJBAUgNACAFIQIDQCACLQAARQRAIAJBIDoAAAsgAkEBaiICIABJDQALCwsgBQ8LIAUQBkEAC4EBAQF/AkAgAARAIANBgAZxIQVBACEDA0ACQCAALwEIIAJHDQAgBSAAKAIEcUUNACADQQBODQMgA0EBaiEDCyAAKAIAIgANAAsLIAQEQCAEQQA2AgQgBEEJNgIAC0EADwsgAQRAIAEgAC8BCjsBAAsgAC8BCkUEQEHAFA8LIAAoAgwLVwEBf0EQEAgiA0UEQEEADwsgAyABOwEKIAMgADsBCCADQYAGNgIEIANBADYCAAJAIAEEQCADIAIgARBnIgA2AgwgAA0BIAMQBkEADwsgA0EANgIMCyADC30BA38jAEEQayICJAAgAiABNgIMQX8hAwJAIAAtACgNAAJAIAAoAgAiBEUNACAEIAEQSUF/Sg0AIAAoAgAhASAAQQxqIgAEQCAAIAEoAgw2AgAgACABKAIQNgIECwwBCyAAIAJBDGpCBEETEA5CP4enIQMLIAJBEGokACADC+4FAgR/BX4jAEHgAGsiBCQAIARBCGoiA0IANwMgIANBADYCGCADQv////8PNwMQIANBADsBDCADQb+GKDYCCCADQQE6AAYgA0EAOwEEIANBADYCACADQgA3A0ggA0GAgNiNeDYCRCADQgA3AyggA0IANwMwIANCADcDOCADQUBrQQA7AQAgA0IANwNQIAEpAwhQIgNFBEAgASgCACgCACkDSCEHCwJ+AkAgAwRAIAchCQwBCyAHIQkDQCAKp0EEdCIFIAEoAgBqKAIAIgMpA0giCCAJIAggCVQbIgkgASkDIFYEQCACBEAgAkEANgIEIAJBEzYCAAtCfwwDCyADKAIwIgYEfyAGLwEEBUEAC0H//wNxrSAIIAMpAyB8fEIefCIIIAcgByAIVBsiByABKQMgVgRAIAIEQCACQQA2AgQgAkETNgIAC0J/DAMLIAAoAgAgASgCACAFaigCACkDSEEAEBUhBiAAKAIAIQMgBkF/TARAIAIEQCACIAMoAgw2AgAgAiADKAIQNgIEC0J/DAMLIARBCGogA0EAQQEgAhBsQn9RBEAgBEEIahA2Qn8MAwsCQAJAIAEoAgAgBWooAgAiAy8BCiAELwESSQ0AIAMoAhAgBCgCGEcNACADKAIUIAQoAhxHDQAgAygCMCAEKAI4EGVFDQACQCAEKAIgIgYgAygCGEcEQCAEKQMoIQgMAQsgAykDICILIAQpAygiCFINACALIQggAykDKCAEKQMwUQ0CCyAELQAUQQhxRQ0AIAYNACAIQgBSDQAgBCkDMFANAQsgAgRAIAJBADYCBCACQRU2AgALIARBCGoQNkJ/DAMLIAEoAgAgBWooAgAoAjQgBCgCPBBzIQMgASgCACAFaigCACIFQQE6AAQgBSADNgI0IARBADYCPCAEQQhqEDYgCkIBfCIKIAEpAwhUDQALCyAHIAl9IgdC////////////ACAHQv///////////wBUGwshByAEQeAAaiQAIAcLxgEBAn9B2AAQCCIBRQRAIAAEQCAAQQA2AgQgAEEONgIAC0EADwsgAQJ/QRgQCCICRQRAIAAEQCAAQQA2AgQgAEEONgIAC0EADAELIAJBADYCECACQgA3AwggAkEANgIAIAILIgA2AlAgAEUEQCABEAZBAA8LIAFCADcDACABQQA2AhAgAUIANwIIIAFCADcCFCABQQA2AlQgAUIANwIcIAFCADcAISABQgA3AzAgAUIANwM4IAFBQGtCADcDACABQgA3A0ggAQuAEwIPfwJ+IwBB0ABrIgUkACAFIAE2AkwgBUE3aiETIAVBOGohEEEAIQEDQAJAIA5BAEgNAEH/////ByAOayABSARAQfibAUE9NgIAQX8hDgwBCyABIA5qIQ4LIAUoAkwiByEBAkACQAJAAkACQAJAAkACQCAFAn8CQCAHLQAAIgYEQANAAkACQCAGQf8BcSIGRQRAIAEhBgwBCyAGQSVHDQEgASEGA0AgAS0AAUElRw0BIAUgAUECaiIINgJMIAZBAWohBiABLQACIQwgCCEBIAxBJUYNAAsLIAYgB2shASAABEAgACAHIAEQLgsgAQ0NIAUoAkwhASAFKAJMLAABQTBrQQpPDQMgAS0AAkEkRw0DIAEsAAFBMGshD0EBIREgAUEDagwECyAFIAFBAWoiCDYCTCABLQABIQYgCCEBDAALAAsgDiENIAANCCARRQ0CQQEhAQNAIAQgAUECdGooAgAiAARAIAMgAUEDdGogACACEHxBASENIAFBAWoiAUEKRw0BDAoLC0EBIQ0gAUEKTw0IA0AgBCABQQJ0aigCAA0IIAFBAWoiAUEKRw0ACwwIC0F/IQ8gAUEBagsiATYCTEEAIQgCQCABLAAAIgpBIGsiBkEfSw0AQQEgBnQiBkGJ0QRxRQ0AA0ACQCAFIAFBAWoiCDYCTCABLAABIgpBIGsiAUEgTw0AQQEgAXQiAUGJ0QRxRQ0AIAEgBnIhBiAIIQEMAQsLIAghASAGIQgLAkAgCkEqRgRAIAUCfwJAIAEsAAFBMGtBCk8NACAFKAJMIgEtAAJBJEcNACABLAABQQJ0IARqQcABa0EKNgIAIAEsAAFBA3QgA2pBgANrKAIAIQtBASERIAFBA2oMAQsgEQ0IQQAhEUEAIQsgAARAIAIgAigCACIBQQRqNgIAIAEoAgAhCwsgBSgCTEEBagsiATYCTCALQX9KDQFBACALayELIAhBgMAAciEIDAELIAVBzABqEHsiC0EASA0GIAUoAkwhAQtBfyEJAkAgAS0AAEEuRw0AIAEtAAFBKkYEQAJAIAEsAAJBMGtBCk8NACAFKAJMIgEtAANBJEcNACABLAACQQJ0IARqQcABa0EKNgIAIAEsAAJBA3QgA2pBgANrKAIAIQkgBSABQQRqIgE2AkwMAgsgEQ0HIAAEfyACIAIoAgAiAUEEajYCACABKAIABUEACyEJIAUgBSgCTEECaiIBNgJMDAELIAUgAUEBajYCTCAFQcwAahB7IQkgBSgCTCEBC0EAIQYDQCAGIRJBfyENIAEsAABBwQBrQTlLDQcgBSABQQFqIgo2AkwgASwAACEGIAohASAGIBJBOmxqQZ+EAWotAAAiBkEBa0EISQ0ACyAGQRNGDQIgBkUNBiAPQQBOBEAgBCAPQQJ0aiAGNgIAIAUgAyAPQQN0aikDADcDQAwECyAADQELQQAhDQwFCyAFQUBrIAYgAhB8IAUoAkwhCgwCCyAPQX9KDQMLQQAhASAARQ0ECyAIQf//e3EiDCAIIAhBgMAAcRshBkEAIQ1BpAghDyAQIQgCQAJAAkACfwJAAkACQAJAAn8CQAJAAkACQAJAAkACQCAKQQFrLAAAIgFBX3EgASABQQ9xQQNGGyABIBIbIgFB2ABrDiEEEhISEhISEhIOEg8GDg4OEgYSEhISAgUDEhIJEgESEgQACwJAIAFBwQBrDgcOEgsSDg4OAAsgAUHTAEYNCQwRCyAFKQNAIRRBpAgMBQtBACEBAkACQAJAAkACQAJAAkAgEkH/AXEOCAABAgMEFwUGFwsgBSgCQCAONgIADBYLIAUoAkAgDjYCAAwVCyAFKAJAIA6sNwMADBQLIAUoAkAgDjsBAAwTCyAFKAJAIA46AAAMEgsgBSgCQCAONgIADBELIAUoAkAgDqw3AwAMEAsgCUEIIAlBCEsbIQkgBkEIciEGQfgAIQELIBAhByABQSBxIQwgBSkDQCIUUEUEQANAIAdBAWsiByAUp0EPcUGwiAFqLQAAIAxyOgAAIBRCD1YhCiAUQgSIIRQgCg0ACwsgBSkDQFANAyAGQQhxRQ0DIAFBBHZBpAhqIQ9BAiENDAMLIBAhASAFKQNAIhRQRQRAA0AgAUEBayIBIBSnQQdxQTByOgAAIBRCB1YhByAUQgOIIRQgBw0ACwsgASEHIAZBCHFFDQIgCSAQIAdrIgFBAWogASAJSBshCQwCCyAFKQNAIhRCf1cEQCAFQgAgFH0iFDcDQEEBIQ1BpAgMAQsgBkGAEHEEQEEBIQ1BpQgMAQtBpghBpAggBkEBcSINGwshDyAQIQECQCAUQoCAgIAQVARAIBQhFQwBCwNAIAFBAWsiASAUIBRCCoAiFUIKfn2nQTByOgAAIBRC/////58BViEHIBUhFCAHDQALCyAVpyIHBEADQCABQQFrIgEgByAHQQpuIgxBCmxrQTByOgAAIAdBCUshCiAMIQcgCg0ACwsgASEHCyAGQf//e3EgBiAJQX9KGyEGAkAgBSkDQCIUQgBSDQAgCQ0AQQAhCSAQIQcMCgsgCSAUUCAQIAdraiIBIAEgCUgbIQkMCQsgBSgCQCIBQYoSIAEbIgdBACAJEH4iASAHIAlqIAEbIQggDCEGIAEgB2sgCSABGyEJDAgLIAkEQCAFKAJADAILQQAhASAAQSAgC0EAIAYQJwwCCyAFQQA2AgwgBSAFKQNAPgIIIAUgBUEIajYCQEF/IQkgBUEIagshCEEAIQECQANAIAgoAgAiB0UNAQJAIAVBBGogBxB9IgdBAEgiDA0AIAcgCSABa0sNACAIQQRqIQggCSABIAdqIgFLDQEMAgsLQX8hDSAMDQULIABBICALIAEgBhAnIAFFBEBBACEBDAELQQAhCCAFKAJAIQoDQCAKKAIAIgdFDQEgBUEEaiAHEH0iByAIaiIIIAFKDQEgACAFQQRqIAcQLiAKQQRqIQogASAISw0ACwsgAEEgIAsgASAGQYDAAHMQJyALIAEgASALSBshAQwFCyAAIAUrA0AgCyAJIAYgAUEAER0AIQEMBAsgBSAFKQNAPAA3QQEhCSATIQcgDCEGDAILQX8hDQsgBUHQAGokACANDwsgAEEgIA0gCCAHayIMIAkgCSAMSBsiCmoiCCALIAggC0obIgEgCCAGECcgACAPIA0QLiAAQTAgASAIIAZBgIAEcxAnIABBMCAKIAxBABAnIAAgByAMEC4gAEEgIAEgCCAGQYDAAHMQJwwACwALngMCBH8BfiAABEAgACgCACIBBEAgARAbGiAAKAIAEAoLIAAoAhwQBiAAKAIgEBAgACgCJBAQIAAoAlAiAwRAIAMoAhAiAgRAIAMoAgAiAQR/A0AgAiAEQQJ0aigCACICBEADQCACKAIYIQEgAhAGIAEiAg0ACyADKAIAIQELIAEgBEEBaiIESwRAIAMoAhAhAgwBCwsgAygCEAUgAgsQBgsgAxAGCyAAKAJAIgEEQCAAKQMwUAR/IAEFIAEQOkICIQUCQCAAKQMwQgJUDQBBASECA0AgACgCQCACQQR0ahA6IAUgACkDMFoNASAFpyECIAVCAXwhBQwACwALIAAoAkALEAYLAkAgACgCREUNAEEAIQJCASEFA0AgACgCTCACQQJ0aigCACIBQQE6ACggAUEMaiIBKAIARQRAIAEEQCABQQA2AgQgAUEINgIACwsgBSAANQJEWg0BIAWnIQIgBUIBfCEFDAALAAsgACgCTBAGIAAoAlQiAgRAIAIoAggiAQRAIAIoAgwgAREEAAsgAhAGCyAAQQhqEC8gABAGCwvqAwIBfgR/AkAgAAR+IAFFBEAgAwRAIANBADYCBCADQRI2AgALQn8PCyACQYMgcQRAAkAgACkDMFANAEExQTIgAkEBcRshByACQQJxRQRAA0AgACAEIAIgAxBUIgUEQCABIAUgBxEBAEUNBgsgBEIBfCIEIAApAzBUDQAMAgsACwNAIAAgBCACIAMQVCIFBEAgAQJ/IAUQIkEBaiEGA0BBACAGRQ0BGiAFIAZBAWsiBmoiCC0AAEEvRw0ACyAICyIGQQFqIAUgBhsgBxEBAEUNBQsgBEIBfCIEIAApAzBUDQALCyADBEAgA0EANgIEIANBCTYCAAtCfw8LQRIhBgJAAkAgACgCUCIFRQ0AIAFFDQBBCSEGIAUpAwhQDQAgBSgCECABLQAAIgcEf0Kl6wohBCABIQADQCAEIAetQv8Bg3whBCAALQABIgcEQCAAQQFqIQAgBEL/////D4NCIX4hBAwBCwsgBKcFQYUqCyAFKAIAcEECdGooAgAiAEUNAANAIAEgACgCABA4RQRAIAJBCHEEQCAAKQMIIgRCf1ENAwwECyAAKQMQIgRCf1ENAgwDCyAAKAIYIgANAAsLIAMEQCADQQA2AgQgAyAGNgIAC0J/IQQLIAQFQn8LDwsgAwRAIANCADcCAAsgBAsPACAAIAEgAiAAQQhqEE4L4AQCB38BfgJAAkAgAEUNACABRQ0AIAJCf1UNAQsgBARAIARBADYCBCAEQRI2AgALQQAPCwJAIAAoAgAiB0UEQEGAAiEHQYACQQQQMCIGRQ0BIAAoAhAQBiAAQYACNgIAIAAgBjYCEAsCQAJAIAAoAhAgAS0AACIFBH9CpesKIQwgASEGA0AgDCAFrUL/AYN8IQwgBi0AASIFBEAgBkEBaiEGIAxC/////w+DQiF+IQwMAQsLIAynBUGFKgsiBiAHcEECdGoiCCgCACIFBEADQAJAIAUoAhwgBkcNACABIAUoAgAQOA0AAkAgA0EIcQRAIAUpAwhCf1INAQsgBSkDEEJ/UQ0ECyAEBEAgBEEANgIEIARBCjYCAAtBAA8LIAUoAhgiBQ0ACwtBIBAIIgVFDQIgBSABNgIAIAUgCCgCADYCGCAIIAU2AgAgBUJ/NwMIIAUgBjYCHCAAIAApAwhCAXwiDDcDCCAMuiAHuEQAAAAAAADoP6JkRQ0AIAdBAEgNACAHIAdBAXQiCEYNACAIQQQQMCIKRQ0BAkAgDEIAIAcbUARAIAAoAhAhCQwBCyAAKAIQIQlBACEEA0AgCSAEQQJ0aigCACIGBEADQCAGKAIYIQEgBiAKIAYoAhwgCHBBAnRqIgsoAgA2AhggCyAGNgIAIAEiBg0ACwsgBEEBaiIEIAdHDQALCyAJEAYgACAINgIAIAAgCjYCEAsgA0EIcQRAIAUgAjcDCAsgBSACNwMQQQEPCyAEBEAgBEEANgIEIARBDjYCAAtBAA8LIAQEQCAEQQA2AgQgBEEONgIAC0EAC9YPARZ/IwBBQGoiB0IANwMwIAdCADcDOCAHQgA3AyAgB0IANwMoAkACQAJAAkACQCACBEAgAkEDcSEJIAJBAWtBA08EQCACQXxxIQYDQCAHQSBqIAEgCEEBdCIMai8BAEEBdGoiCiAKLwEAQQFqOwEAIAdBIGogASAMQQJyai8BAEEBdGoiCiAKLwEAQQFqOwEAIAdBIGogASAMQQRyai8BAEEBdGoiCiAKLwEAQQFqOwEAIAdBIGogASAMQQZyai8BAEEBdGoiCiAKLwEAQQFqOwEAIAhBBGohCCAGQQRrIgYNAAsLIAkEQANAIAdBIGogASAIQQF0ai8BAEEBdGoiBiAGLwEAQQFqOwEAIAhBAWohCCAJQQFrIgkNAAsLIAQoAgAhCEEPIQsgBy8BPiIRDQIMAQsgBCgCACEIC0EOIQtBACERIAcvATwNAEENIQsgBy8BOg0AQQwhCyAHLwE4DQBBCyELIAcvATYNAEEKIQsgBy8BNA0AQQkhCyAHLwEyDQBBCCELIAcvATANAEEHIQsgBy8BLg0AQQYhCyAHLwEsDQBBBSELIAcvASoNAEEEIQsgBy8BKA0AQQMhCyAHLwEmDQBBAiELIAcvASQNACAHLwEiRQRAIAMgAygCACIAQQRqNgIAIABBwAI2AQAgAyADKAIAIgBBBGo2AgAgAEHAAjYBAEEBIQ0MAwsgCEEARyEPQQEhC0EBIQgMAQsgCyAIIAggC0sbIQ9BASEOQQEhCANAIAdBIGogCEEBdGovAQANASAIQQFqIgggC0cNAAsgCyEIC0F/IQkgBy8BIiIQQQJLDQFBBCAHLwEkIhIgEEEBdGprIgZBAEgNASAGQQF0IAcvASYiE2siBkEASA0BIAZBAXQgBy8BKCIUayIGQQBIDQEgBkEBdCAHLwEqIhVrIgZBAEgNASAGQQF0IAcvASwiFmsiBkEASA0BIAZBAXQgBy8BLiIXayIGQQBIDQEgBkEBdCAHLwEwIhlrIgZBAEgNASAGQQF0IAcvATIiGmsiBkEASA0BIAZBAXQgBy8BNCIbayIGQQBIDQEgBkEBdCAHLwE2Ig1rIgZBAEgNASAGQQF0IAcvATgiGGsiBkEASA0BIAZBAXQgBy8BOiIMayIGQQBIDQEgBkEBdCAHLwE8IgprIgZBAEgNASAGQQF0IBFrIgZBAEgNASAGQQAgAEUgDnIbDQEgCCAPSyERQQAhCSAHQQA7AQIgByAQOwEEIAcgECASaiIGOwEGIAcgBiATaiIGOwEIIAcgBiAUaiIGOwEKIAcgBiAVaiIGOwEMIAcgBiAWaiIGOwEOIAcgBiAXaiIGOwEQIAcgBiAZaiIGOwESIAcgBiAaaiIGOwEUIAcgBiAbaiIGOwEWIAcgBiANaiIGOwEYIAcgBiAYaiIGOwEaIAcgBiAMaiIGOwEcIAcgBiAKajsBHgJAIAJFDQAgAkEBRwRAIAJBfnEhBgNAIAEgCUEBdGovAQAiCgRAIAcgCkEBdGoiCiAKLwEAIgpBAWo7AQAgBSAKQQF0aiAJOwEACyABIAlBAXIiDEEBdGovAQAiCgRAIAcgCkEBdGoiCiAKLwEAIgpBAWo7AQAgBSAKQQF0aiAMOwEACyAJQQJqIQkgBkECayIGDQALCyACQQFxRQ0AIAEgCUEBdGovAQAiAkUNACAHIAJBAXRqIgIgAi8BACICQQFqOwEAIAUgAkEBdGogCTsBAAsgCCAPIBEbIQ1BFCEQQQAhFiAFIgohGEEAIRICQAJAAkAgAA4CAgABC0EBIQkgDUEJSw0DQYECIRBB8PEAIRhBsPEAIQpBASESDAELIABBAkYhFkEAIRBB8PIAIRhBsPIAIQogAEECRwRADAELQQEhCSANQQlLDQILQQEgDXQiE0EBayEaIAMoAgAhFEEAIRUgDSEGQQAhD0EAIQ5BfyEMA0BBASAGdCERAkADQCAIIA9rIRcCf0EAIAUgFUEBdGovAQAiAkEBaiAQSQ0AGiACIBBJBEBBACECQeAADAELIAogAiAQa0EBdCIAai8BACECIAAgGGotAAALIQAgDiAPdiEbQX8gF3QhBiARIQkDQCAUIAYgCWoiCSAbakECdGoiGSACOwECIBkgFzoAASAZIAA6AAAgCQ0AC0EBIAhBAWt0IQYDQCAGIgBBAXYhBiAAIA5xDQALIAdBIGogCEEBdGoiAiACLwEAQQFrIgI7AQAgAEEBayAOcSAAakEAIAAbIQ4gFUEBaiEVIAJB//8DcUUEQCAIIAtGDQIgASAFIBVBAXRqLwEAQQF0ai8BACEICyAIIA1NDQAgDiAacSIAIAxGDQALQQEgCCAPIA0gDxsiD2siBnQhAiAIIAtJBEAgCyAPayEMIAghCQJAA0AgAiAHQSBqIAlBAXRqLwEAayICQQFIDQEgAkEBdCECIAZBAWoiBiAPaiIJIAtJDQALIAwhBgtBASAGdCECC0EBIQkgEiACIBNqIhNB1AZLcQ0DIBYgE0HQBEtxDQMgAygCACICIABBAnRqIgkgDToAASAJIAY6AAAgCSAUIBFBAnRqIhQgAmtBAnY7AQIgACEMDAELCyAOBEAgFCAOQQJ0aiIAQQA7AQIgACAXOgABIABBwAA6AAALIAMgAygCACATQQJ0ajYCAAsgBCANNgIAQQAhCQsgCQtyAQF/IwBBEGsiBCQAAn9BACAARQ0AGiAAQQhqIQAgAUUEQCACUEUEQCAABEAgAEEANgIEIABBEjYCAAtBAAwCC0EAQgAgAyAAEDkMAQsgBCACNwMIIAQgATYCACAEQgEgAyAAEDkLIQAgBEEQaiQAIAAL5QECA38BfkF/IQUCQCAAIAEgAkEAECYiBEUNACAAIAEgAhCIASIGRQ0AAn4CQCACQQhxDQAgACgCQCABp0EEdGooAggiAkUNACACIAMQIUEATgRAIAMpAwAMAgsgAEEIaiIABEAgAEEANgIEIABBDzYCAAtBfw8LIAMQKiADIAQoAhg2AiwgAyAEKQMoNwMYIAMgBCgCFDYCKCADIAQpAyA3AyAgAyAEKAIQOwEwIAMgBC8BUjsBMkL8AULcASAELQAGGwshByADIAY2AgggAyABNwMQIAMgB0IDhDcDAEEAIQULIAULIgAgACABIAIgAxAmIgBFBEBBAA8LIAAoAjBBACACIAMQJQukFQESfyABKAIIIgIoAgAhBSACKAIMIQcgASgCACEIIABCgICAgNDHADcCxChBACECAkACQCAHQQBKBEBBfyEMA0ACQCAIIAJBAnRqIgMvAQAEQCAAIAAoAsQoQQFqIgM2AsQoIAAgA0ECdGpB0BZqIAI2AgAgACACakHMKGpBADoAACACIQwMAQsgA0EAOwECCyACQQFqIgIgB0cNAAsgAEGgLWohDyAAQZwtaiERIAAoAsQoIgRBAUoNAgwBCyAAQaAtaiEPIABBnC1qIRFBfyEMCwNAIAAgBEEBaiICNgLEKCAAIAJBAnRqQdAWaiAMQQFqIgNBACAMQQJIIgYbIgI2AgAgCCACQQJ0IgRqQQE7AQAgACACakHMKGpBADoAACAAIAAoApwtQQFrNgKcLSAFBEAgDyAPKAIAIAQgBWovAQJrNgIACyADIAwgBhshDCAAKALEKCIEQQJIDQALCyABIAw2AgQgBEEBdiEGA0AgACAGQQJ0akHQFmooAgAhCQJAIAYiAkEBdCIDIARKDQAgCCAJQQJ0aiEKIAAgCWpBzChqIQ0gBiEFA0ACQCADIAROBEAgAyECDAELIAggAEHQFmoiAiADQQFyIgRBAnRqKAIAIgtBAnRqLwEAIg4gCCACIANBAnRqKAIAIhBBAnRqLwEAIgJPBEAgAiAORwRAIAMhAgwCCyADIQIgAEHMKGoiAyALai0AACADIBBqLQAASw0BCyAEIQILIAovAQAiBCAIIAAgAkECdGpB0BZqKAIAIgNBAnRqLwEAIgtJBEAgBSECDAILAkAgBCALRw0AIA0tAAAgACADakHMKGotAABLDQAgBSECDAILIAAgBUECdGpB0BZqIAM2AgAgAiEFIAJBAXQiAyAAKALEKCIETA0ACwsgACACQQJ0akHQFmogCTYCACAGQQJOBEAgBkEBayEGIAAoAsQoIQQMAQsLIAAoAsQoIQMDQCAHIQYgACADQQFrIgQ2AsQoIAAoAtQWIQogACAAIANBAnRqQdAWaigCACIJNgLUFkEBIQICQCADQQNIDQAgCCAJQQJ0aiENIAAgCWpBzChqIQtBAiEDQQEhBQNAAkAgAyAETgRAIAMhAgwBCyAIIABB0BZqIgIgA0EBciIHQQJ0aigCACIEQQJ0ai8BACIOIAggAiADQQJ0aigCACIQQQJ0ai8BACICTwRAIAIgDkcEQCADIQIMAgsgAyECIABBzChqIgMgBGotAAAgAyAQai0AAEsNAQsgByECCyANLwEAIgcgCCAAIAJBAnRqQdAWaigCACIDQQJ0ai8BACIESQRAIAUhAgwCCwJAIAQgB0cNACALLQAAIAAgA2pBzChqLQAASw0AIAUhAgwCCyAAIAVBAnRqQdAWaiADNgIAIAIhBSACQQF0IgMgACgCxCgiBEwNAAsLQQIhAyAAQdAWaiIHIAJBAnRqIAk2AgAgACAAKALIKEEBayIFNgLIKCAAKALUFiECIAcgBUECdGogCjYCACAAIAAoAsgoQQFrIgU2AsgoIAcgBUECdGogAjYCACAIIAZBAnRqIg0gCCACQQJ0aiIFLwEAIAggCkECdGoiBC8BAGo7AQAgAEHMKGoiCSAGaiILIAIgCWotAAAiAiAJIApqLQAAIgogAiAKSxtBAWo6AAAgBSAGOwECIAQgBjsBAiAAIAY2AtQWQQEhBUEBIQICQCAAKALEKCIEQQJIDQADQCANLwEAIgogCCAAAn8gAyADIARODQAaIAggByADQQFyIgJBAnRqKAIAIgRBAnRqLwEAIg4gCCAHIANBAnRqKAIAIhBBAnRqLwEAIhJPBEAgAyAOIBJHDQEaIAMgBCAJai0AACAJIBBqLQAASw0BGgsgAgsiAkECdGpB0BZqKAIAIgNBAnRqLwEAIgRJBEAgBSECDAILAkAgBCAKRw0AIAstAAAgACADakHMKGotAABLDQAgBSECDAILIAAgBUECdGpB0BZqIAM2AgAgAiEFIAJBAXQiAyAAKALEKCIETA0ACwsgBkEBaiEHIAAgAkECdGpB0BZqIAY2AgAgACgCxCgiA0EBSg0ACyAAIAAoAsgoQQFrIgI2AsgoIABB0BZqIgMgAkECdGogACgC1BY2AgAgASgCBCEJIAEoAggiAigCECEGIAIoAgghCiACKAIEIRAgAigCACENIAEoAgAhByAAQcgWakIANwEAIABBwBZqQgA3AQAgAEG4FmpCADcBACAAQbAWaiIBQgA3AQBBACEFIAcgAyAAKALIKEECdGooAgBBAnRqQQA7AQICQCAAKALIKCICQbsESg0AIAJBAWohAgNAIAcgACACQQJ0akHQFmooAgAiBEECdCISaiILIAcgCy8BAkECdGovAQIiA0EBaiAGIAMgBkkbIg47AQIgAyAGTyETAkAgBCAJSg0AIAAgDkEBdGpBsBZqIgMgAy8BAEEBajsBAEEAIQMgBCAKTgRAIBAgBCAKa0ECdGooAgAhAwsgESARKAIAIAsvAQAiBCADIA5qbGo2AgAgDUUNACAPIA8oAgAgAyANIBJqLwECaiAEbGo2AgALIAUgE2ohBSACQQFqIgJBvQRHDQALIAVFDQAgACAGQQF0akGwFmohBANAIAYhAgNAIAAgAiIDQQFrIgJBAXRqQbAWaiIPLwEAIgpFDQALIA8gCkEBazsBACAAIANBAXRqQbAWaiICIAIvAQBBAmo7AQAgBCAELwEAQQFrIgM7AQAgBUECSiECIAVBAmshBSACDQALIAZFDQBBvQQhAgNAIANB//8DcSIFBEADQCAAIAJBAWsiAkECdGpB0BZqKAIAIgMgCUoNACAHIANBAnRqIgMvAQIgBkcEQCARIBEoAgAgBiADLwEAbGoiBDYCACARIAQgAy8BACADLwECbGs2AgAgAyAGOwECCyAFQQFrIgUNAAsLIAZBAWsiBkUNASAAIAZBAXRqQbAWai8BACEDDAALAAtBACEFIwBBIGsiAiABIgAvAQBBAXQiATsBAiACIAEgAC8BAmpBAXQiATsBBCACIAEgAC8BBGpBAXQiATsBBiACIAEgAC8BBmpBAXQiATsBCCACIAEgAC8BCGpBAXQiATsBCiACIAEgAC8BCmpBAXQiATsBDCACIAEgAC8BDGpBAXQiATsBDiACIAEgAC8BDmpBAXQiATsBECACIAEgAC8BEGpBAXQiATsBEiACIAEgAC8BEmpBAXQiATsBFCACIAEgAC8BFGpBAXQiATsBFiACIAEgAC8BFmpBAXQiATsBGCACIAEgAC8BGGpBAXQiATsBGiACIAEgAC8BGmpBAXQiATsBHCACIAAvARwgAWpBAXQ7AR4gDEEATgRAA0AgCCAFQQJ0aiIELwECIgEEQCACIAFBAXRqIgAgAC8BACIAQQFqOwEAIAFBA3EhBkEAIQMgAUEBa0EDTwRAIAFB/P8DcSEHA0AgAEEDdkEBcSAAQQJ2QQFxIABBAnEgAyAAQQFxckECdHJyQQF0ciIBQQF0IQMgAEEEdiEAIAdBBGsiBw0ACwsgBgRAA0AgAyAAQQFxciIBQQF0IQMgAEEBdiEAIAZBAWsiBg0ACwsgBCABOwEACyAFIAxHIQAgBUEBaiEFIAANAAsLC7AJAgV/AX4gACABayEDAkACQCACQQdNBEAgAkUNASAAIAMtAAA6AAAgAkEBRw0CIABBAWoPCwJAAn8CQAJAAkACQCABQQFrDggDAgIAAgICAQILIAMoAAAMAwsgAykAACIIQiCIpyEEIAinIQEMAwsgAUEHTQRAIAAgAmpBAWshByABIAJJBEAgA0EEaiEGA0AgByAAa0EBaiIEIAEgASAESxsiBUEITwRAA0AgACADKQAANwAAIANBCGohAyAAQQhqIQAMAAsACyAFQQRJBH8gAwUgACADKAAANgAAIAVBBGshBSAAQQRqIQAgBgshBCAFQQJPBEAgACAELwAAOwAAIAVBAmshBSAEQQJqIQQgAEECaiEACyAFQQFGBEAgACAELQAAOgAAIABBAWohAAsgAiABayICIAFLDQALIAJFDQULAkAgByAAa0EBaiIBIAIgASACSRsiAkEISQ0AIAJBCGsiBEEDdkEBakEHcSIBBEADQCAAIAMpAAA3AAAgAkEIayECIANBCGohAyAAQQhqIQAgAUEBayIBDQALCyAEQThJDQADQCAAIAMpAAA3AAAgACADKQAINwAIIAAgAykAEDcAECAAIAMpABg3ABggACADKQAgNwAgIAAgAykAKDcAKCAAIAMpADA3ADAgACADKQA4NwA4IANBQGshAyAAQUBrIQAgAkFAaiICQQdLDQALCyACQQRPBEAgACADKAAANgAAIAJBBGshAiADQQRqIQMgAEEEaiEACyACQQJPBEAgACADLwAAOwAAIAJBAmshAiADQQJqIQMgAEECaiEACyACQQFHDQQgACADLQAAOgAAIABBAWoPCyAAIAMpAAA3AAAgACACQQFrIgFBB3FBAWoiAmohACABQQhJDQMgAiADaiEDIAFBA3YiAkEBayEEIAJBB3EiAQRAA0AgACADKQAANwAAIAJBAWshAiADQQhqIQMgAEEIaiEAIAFBAWsiAQ0ACwsgBEEHSQ0DA0AgACADKQAANwAAIAAgAykACDcACCAAIAMpABA3ABAgACADKQAYNwAYIAAgAykAIDcAICAAIAMpACg3ACggACADKQAwNwAwIAAgAykAODcAOCADQUBrIQMgAEFAayEAIAJBCGsiAg0ACwwDCyADLQAAQYGChAhsCyIBIQQLIAJBB3EhBgJAIAJBeHEiAkUNACABrSAErUIghoQhCCACQQhrIgRBA3ZBAWpBB3EiAQRAA0AgACAINwAAIAJBCGshAiAAQQhqIQAgAUEBayIBDQALCyAEQThJDQADQCAAIAg3ADggACAINwAwIAAgCDcAKCAAIAg3ACAgACAINwAYIAAgCDcAECAAIAg3AAggACAINwAAIABBQGshACACQUBqIgINAAsLIAZFDQAgACADIAYQCSAGaiEACyAADwsgACADLQABOgABIAJBAkYEQCAAQQJqDwsgACADLQACOgACIAJBA0YEQCAAQQNqDwsgACADLQADOgADIAJBBEYEQCAAQQRqDwsgACADLQAEOgAEIAJBBUYEQCAAQQVqDwsgACADLQAFOgAFIAJBBkYEQCAAQQZqDwsgACADLQAGOgAGIABBB2oLAwABC2wBA38CQCABKAIAIgNBB0sNACADIAIoAgBPDQAgACADayEEA0AgACAEKQAANwAAIAIgAigCACABKAIAIgVrNgIAIAEgASgCAEEBdCIDNgIAIAAgBWohACADQQdLDQEgAyACKAIASQ0ACwsgAAu8AgEBfwJAIAMgAGtBAWoiAyACIAIgA0sbIgJBCEkNACACQQhrIgRBA3ZBAWpBB3EiAwRAA0AgACABKQAANwAAIAJBCGshAiABQQhqIQEgAEEIaiEAIANBAWsiAw0ACwsgBEE4SQ0AA0AgACABKQAANwAAIAAgASkACDcACCAAIAEpABA3ABAgACABKQAYNwAYIAAgASkAIDcAICAAIAEpACg3ACggACABKQAwNwAwIAAgASkAODcAOCABQUBrIQEgAEFAayEAIAJBQGoiAkEHSw0ACwsgAkEETwRAIAAgASgAADYAACACQQRrIQIgAUEEaiEBIABBBGohAAsgAkECTwRAIAAgAS8AADsAACACQQJrIQIgAUECaiEBIABBAmohAAsgAkEBRgR/IAAgAS0AADoAACAAQQFqBSAACwvnAQECfyAAIAEpAAA3AAAgACACQQFrIgJBB3FBAWoiA2ohAAJAIAJBCEkNACABIANqIQEgAkEDdiICQQFrIQQgAkEHcSIDBEADQCAAIAEpAAA3AAAgAkEBayECIAFBCGohASAAQQhqIQAgA0EBayIDDQALCyAEQQdJDQADQCAAIAEpAAA3AAAgACABKQAINwAIIAAgASkAEDcAECAAIAEpABg3ABggACABKQAgNwAgIAAgASkAKDcAKCAAIAEpADA3ADAgACABKQA4NwA4IAFBQGshASAAQUBrIQAgAkEIayICDQALCyAAC/wFAQR/IABB//8DcSEDIABBEHYhBEEBIQAgAkEBRgRAIAMgAS0AAGoiAEHx/wNrIAAgAEHw/wNLGyIAIARqIgFBEHQiAkGAgDxqIAIgAUHw/wNLGyAAcg8LAkAgAQR/IAJBEEkNAQJAAkACQCACQa8rSwRAA0AgAkGwK2shAkG1BSEFIAEhAANAIAMgAC0AAGoiAyAEaiADIAAtAAFqIgNqIAMgAC0AAmoiA2ogAyAALQADaiIDaiADIAAtAARqIgNqIAMgAC0ABWoiA2ogAyAALQAGaiIDaiADIAAtAAdqIgNqIQQgBQRAIABBCGohACAFQQFrIQUMAQsLIARB8f8DcCEEIANB8f8DcCEDIAFBsCtqIQEgAkGvK0sNAAsgAkUNAyACQQhJDQELA0AgAyABLQAAaiIAIARqIAAgAS0AAWoiAGogACABLQACaiIAaiAAIAEtAANqIgBqIAAgAS0ABGoiAGogACABLQAFaiIAaiAAIAEtAAZqIgBqIAAgAS0AB2oiA2ohBCABQQhqIQEgAkEIayICQQdLDQALIAJFDQELIAJBAWshBiACQQNxIgUEQCABIQADQCACQQFrIQIgAyAALQAAaiIDIARqIQQgAEEBaiIBIQAgBUEBayIFDQALCyAGQQNJDQADQCADIAEtAABqIgAgAS0AAWoiBSABLQACaiIGIAEtAANqIgMgBiAFIAAgBGpqamohBCABQQRqIQEgAkEEayICDQALCyAEQfH/A3AhBCADQfH/A3AhAwsgBEEQdCADcgVBAQsPCwJAIAJFDQAgAkEBayEGIAJBA3EiBQRAIAEhAANAIAJBAWshAiADIAAtAABqIgMgBGohBCAAQQFqIgEhACAFQQFrIgUNAAsLIAZBA0kNAANAIAMgAS0AAGoiACABLQABaiIFIAEtAAJqIgYgAS0AA2oiAyAGIAUgACAEampqaiEEIAFBBGohASACQQRrIgINAAsLIARB8f8DcEEQdCADQfH/A2sgAyADQfD/A0sbcgv+DQEKfyAAKAIwIgIgACgCDEEFayIDIAIgA0kbIQggACgCACICKAIEIQkgAUEERiEHAkADQCACKAIQIgMgACgCwC1BKmpBA3UiBEkEQEEBIQQMAgsgCCADIARrIgMgACgCZCAAKAJUayIGIAIoAgRqIgVB//8DIAVB//8DSRsiBCADIARJGyIDSwRAQQEhBCADQQBHIAdyRQ0CIAFFDQIgAyAFRw0CCyAAQQBBACAHIAMgBUZxIgoQPSAAIAAoAhAiAkEDazYCECACIAAoAgRqQQRrIAM6AAAgACAAKAIQIgJBAWo2AhAgAiAAKAIEaiADQQh2OgAAIAAgACgCECICQQFqNgIQIAIgACgCBGogA0F/cyICOgAAIAAgACgCECIEQQFqNgIQIAQgACgCBGogAkEIdjoAACAAKAIAIgIoAhwiBBAUAkAgAigCECIFIAQoAhAiCyAFIAtJGyIFRQ0AIAIoAgwgBCgCCCAFEAkaIAIgAigCDCAFajYCDCAEIAQoAgggBWo2AgggAiACKAIUIAVqNgIUIAIgAigCECAFazYCECAEIAQoAhAgBWsiAjYCECACDQAgBCAEKAIENgIICwJ/IAYEQCAAKAIAKAIMIAAoAkggACgCVGogAyAGIAMgBkkbIgIQCRogACgCACIEIAQoAgwgAmo2AgwgBCAEKAIQIAJrNgIQIAQgBCgCFCACajYCFCAAIAAoAlQgAmo2AlQgAyACayEDCyADCwRAIAAoAgAiAigCDCEEIAMgAigCBCIGIAMgBkkbIgUEQCACIAYgBWs2AgQCQCACKAIcKAIUQQJGBEAgAiAEIAUQQAwBCyAEIAIoAgAgBRAJIQQgAigCHCgCFEEBRw0AIAIgAigCMCAEIAVByJgBKAIAEQAANgIwCyACIAIoAgAgBWo2AgAgAiACKAIIIAVqNgIIIAAoAgAiAigCDCEECyACIAMgBGo2AgwgAiACKAIQIANrNgIQIAIgAigCFCADajYCFAsgACgCACECIApFDQALQQAhBAsCQCAJIAIoAgRrIgVFBEAgACgCZCEDDAELAkAgACgCMCIDIAVNBEAgAEECNgKkLSAAKAJIIAIoAgAgA2sgAxAJGiAAIAAoAjAiAzYCqC0gACADNgJkDAELAkAgACgCRCAAKAJkIgJrIAVLDQAgACACIANrIgI2AmQgACgCSCIGIAMgBmogAhAJGiAAKAKkLSICQQFNBEAgACACQQFqNgKkLQsgACgCZCICIAAoAqgtTw0AIAAgAjYCqC0LIAAoAkggAmogACgCACgCACAFayAFEAkaIAAgACgCZCAFaiIDNgJkIAAgACgCMCAAKAKoLSICayIGIAUgBSAGSxsgAmo2AqgtCyAAIAM2AlQLIAMgACgCQEsEQCAAIAM2AkALQQMhAgJAIARFDQAgACgCACgCBCEEAkACQCABQXtxRQ0AIAQNAEEBIQIgAyAAKAJURg0CIAAoAkQgA2shAgwBCyAEIAAoAkQgA2siAk0NACAAKAJUIgUgACgCMCIESA0AIAAgAyAEayIDNgJkIAAgBSAEazYCVCAAKAJIIgUgBCAFaiADEAkaIAAoAqQtIgNBAU0EQCAAIANBAWo2AqQtCyAAKAIwIAJqIQIgACgCZCIDIAAoAqgtTw0AIAAgAzYCqC0LIAAoAgAiBCgCBCIFIAIgAiAFSxsiAgRAIAAoAkghBiAEIAUgAms2AgQgAyAGaiEDAkAgBCgCHCgCFEECRgRAIAQgAyACEEAMAQsgAyAEKAIAIAIQCSEDIAQoAhwoAhRBAUcNACAEIAQoAjAgAyACQciYASgCABEAADYCMAsgBCAEKAIAIAJqNgIAIAQgBCgCCCACajYCCCAAIAAoAmQgAmoiAzYCZCAAIAAoAjAgACgCqC0iBGsiBSACIAIgBUsbIARqNgKoLQsgAyAAKAJASwRAIAAgAzYCQAsgAyAAKAJUIgZrIgMgACgCMCICIAAoAgwgACgCwC1BKmpBA3VrIgRB//8DIARB//8DSRsiBSACIAVJG0kEQEEAIQIgAUEERiADQQBHckUNASABRQ0BIAAoAgAoAgQNASADIAVLDQELQQAhBCABQQRGBEAgACgCACgCBEUgAyAFTXEhBAsgACAAKAJIIAZqIAUgAyADIAVLGyIBIAQQPSAAIAAoAlQgAWo2AlQgACgCACIAKAIcIgEQFAJAIAAoAhAiAiABKAIQIgMgAiADSRsiAkUNACAAKAIMIAEoAgggAhAJGiAAIAAoAgwgAmo2AgwgASABKAIIIAJqNgIIIAAgACgCFCACajYCFCAAIAAoAhAgAms2AhAgASABKAIQIAJrIgA2AhAgAA0AIAEgASgCBDYCCAtBAkEAIAQbIQILIAILfQEBfyAAIAAoAhAiAkEBajYCECACIAAoAgRqIAFBGHY6AAAgACAAKAIQIgJBAWo2AhAgAiAAKAIEaiABQRB2OgAAIAAgACgCECICQQFqNgIQIAIgACgCBGogAUEIdjoAACAAIAAoAhAiAkEBajYCECACIAAoAgRqIAE6AAALvAIBBH9BfiECAkAgAEUNACAAKAIgRQ0AIAAoAiQiBEUNACAAKAIcIgFFDQAgASgCACAARw0AAkACQCABKAIgIgNBOWsOOQECAgICAgICAgICAgECAgIBAgICAgICAgICAgICAgICAgIBAgICAgICAgICAgIBAgICAgICAgICAQALIANBmgVGDQAgA0EqRw0BCwJ/An8CfyABKAIEIgIEQCAAKAIoIAIgBBEGACAAKAIcIQELIAEoAlAiAgsEQCAAKAIoIAIgACgCJBEGACAAKAIcIQELIAEoAkwiAgsEQCAAKAIoIAIgACgCJBEGACAAKAIcIQELIAEoAkgiAgsEQCAAKAIoIAIgACgCJBEGACAAKAIcIQELIAAoAiggASAAKAIkEQYAIABBADYCHEF9QQAgA0HxAEYbIQILIAIL7wIBBn8gACgCMCIDQf//A3EhBCAAKAJQIQFBBCEFA0AgAUEAIAEvAQAiAiAEayIGIAIgBkkbOwEAIAFBACABLwECIgIgBGsiBiACIAZJGzsBAiABQQAgAS8BBCICIARrIgYgAiAGSRs7AQQgAUEAIAEvAQYiAiAEayIGIAIgBkkbOwEGIAVBgIAERkUEQCABQQhqIQEgBUEEaiEFDAELCwJAIANFDQAgA0EDcSEFIAAoAkwhASADQQFrQQNPBEAgA0F8cSEAA0AgAUEAIAEvAQAiAyAEayICIAIgA0sbOwEAIAFBACABLwECIgMgBGsiAiACIANLGzsBAiABQQAgAS8BBCIDIARrIgIgAiADSxs7AQQgAUEAIAEvAQYiAyAEayICIAIgA0sbOwEGIAFBCGohASAAQQRrIgANAAsLIAVFDQADQCABQQAgAS8BACIAIARrIgMgACADSRs7AQAgAUECaiEBIAVBAWsiBQ0ACwsLmAQCAX4BfyAAQX9zIQACQCACUA0AIAFBA3FFDQAgAS0AACAAQf8BcXNBAnRB0BhqKAIAIABBCHZzIQAgAkIBfSIDUEEBIAFBAWoiBEEDcRsEQCAEIQEgAyECDAELIAEtAAEgAEH/AXFzQQJ0QdAYaigCACAAQQh2cyEAIAFBAmohBAJAIAJCAn0iA1ANACAEQQNxRQ0AIAEtAAIgAEH/AXFzQQJ0QdAYaigCACAAQQh2cyEAIAFBA2ohBAJAIAJCA30iA1ANACAEQQNxRQ0AIAEtAAMgAEH/AXFzQQJ0QdAYaigCACAAQQh2cyEAIAJCBH0hAiABQQRqIQEMAgsgBCEBIAMhAgwBCyAEIQEgAyECCyACQgRaBEADQCABKAIAIABzIgBBBnZB/AdxQdAoaigCACAAQf8BcUECdEHQMGooAgBzIABBDnZB/AdxQdAgaigCAHMgAEEWdkH8B3FB0BhqKAIAcyEAIAFBBGohASACQgR9IgJCA1YNAAsLAkAgAlANACACQgGDUAR+IAIFIAEtAAAgAEH/AXFzQQJ0QdAYaigCACAAQQh2cyEAIAFBAWohASACQgF9CyEDIAJCAVENAANAIAEtAAEgAS0AACAAQf8BcXNBAnRB0BhqKAIAIABBCHZzIgBB/wFxc0ECdEHQGGooAgAgAEEIdnMhACABQQJqIQEgA0ICfSIDQgBSDQALCyAAQX9zC8ICAQN/IwBBEGsiCCQAAn8CQCAABEAgBA0BIAVQDQELIAYEQCAGQQA2AgQgBkESNgIAC0EADAELQYABEAgiB0UEQCAGBEAgBkEANgIEIAZBDjYCAAtBAAwBCyAHIAE3AwggB0IANwMAIAdBKGoiCRAqIAcgBTcDGCAHIAQ2AhAgByADOgBgIAdBADYCbCAHQgA3AmQgACkDGCEBIAhBfzYCCCAIQo6AgIDwADcDACAHQRAgCBAkIAFC/4EBg4QiATcDcCAHIAGnQQZ2QQFxOgB4AkAgAkUNACAJIAIQY0F/Sg0AIAcQBkEADAELIAYQYiICBEAgACAAKAIwQQFqNgIwIAIgBzYCCCACQQE2AgQgAiAANgIAIAJCPyAAIAdBAEIAQQ5BAREKACIBIAFCAFMbNwMYCyACCyEAIAhBEGokACAAC2IBAX9BOBAIIgFFBEAgAARAIABBADYCBCAAQQ42AgALQQAPCyABQQA2AgggAUIANwMAIAFCADcDICABQoCAgIAQNwIsIAFBADoAKCABQQA2AhQgAUIANwIMIAFBADsBNCABC7sBAQF+IAEpAwAiAkICg1BFBEAgACABKQMQNwMQCyACQgSDUEUEQCAAIAEpAxg3AxgLIAJCCINQRQRAIAAgASkDIDcDIAsgAkIQg1BFBEAgACABKAIoNgIoCyACQiCDUEUEQCAAIAEoAiw2AiwLIAJCwACDUEUEQCAAIAEvATA7ATALIAJCgAGDUEUEQCAAIAEvATI7ATILIAJCgAKDUEUEQCAAIAEoAjQ2AjQLIAAgACkDACAChDcDAEEACxkAIAFFBEBBAA8LIAAgASgCACABMwEEEBwLNwECfyAAQQAgARtFBEAgACABRg8LIAAvAQQiAyABLwEERgR/IAAoAgAgASgCACADEDwFQQELRQs0AQF/IAAEfwJ/IAAvAQQhAUEAIAAoAgAiAEUNABpBACAAIAGtQcyYASgCABEDAAsFQQALCyIBAX8gAUUEQEEADwsgARAIIgJFBEBBAA8LIAIgACABEAkLKQAgACABIAIgAyAEEEYiAEUEQEEADwsgACACQQAgBBA1IQEgABAGIAELcQEBfgJ/AkAgAkJ/VwRAIAMEQCADQQA2AgQgA0EUNgIACwwBCyAAIAEgAhARIgRCf1cEQCADBEAgAyAAKAIMNgIAIAMgACgCEDYCBAsMAQtBACACIARXDQEaIAMEQCADQQA2AgQgA0ERNgIACwtBfwsLNQAgACABIAJBABAmIgBFBEBBfw8LIAMEQCADIAAtAAk6AAALIAQEQCAEIAAoAkQ2AgALQQAL0QECAX8BfiMAQRBrIgMkAAJAIAAgA0EOaiABQYAGQQAQRyIARQRAIAIhAAwBCyADLwEOIgFBBUkEQCACIQAMAQsgAC0AAEEBRwRAIAIhAAwBCyAAIAGtQv//A4MQGCIBRQRAIAIhAAwBCyABEHUaAkAgARAWIAIQZkcEQCACIQAMAQsgASABLQAABH4gASkDCCABKQMQfQVCAAsiBEL//wODEBMgBKdB//8DcUGAEEEAEDUiAEUEQCACIQAMAQsgAhAQCyABEAcLIANBEGokACAAC+YPAgh/An4jAEHgAGsiByQAQR5BLiADGyELAkACQCACBEAgAiIFIgYtAAAEfiAGKQMIIAYpAxB9BUIACyALrVoNASAEBEAgBEEANgIEIARBEzYCAAtCfyENDAILIAEgC60gByAEEC0iBQ0AQn8hDQwBCyAFQgQQEygAAEGjEkGoEiADGygAAEcEQCAEBEAgBEEANgIEIARBEzYCAAtCfyENIAINASAFEAcMAQsgAEIANwMgIABBADYCGCAAQv////8PNwMQIABBADsBDCAAQb+GKDYCCCAAQQE6AAYgAEEAOwEEIABBADYCACAAQgA3A0ggAEGAgNiNeDYCRCAAQgA3AyggAEIANwMwIABCADcDOCAAQUBrQQA7AQAgAEIANwNQIAAgAwR/QQAFIAUQCws7AQggACAFEAs7AQogACAFEAs7AQwgACAFEAs2AhAgBRALIQYgBRALIQkgB0EANgJYIAdCADcDUCAHQgA3A0ggByAJQR9xNgI8IAcgBkELdjYCOCAHIAZBBXZBP3E2AjQgByAGQQF0QT5xNgIwIAcgCUEJdkHQAGo2AkQgByAJQQV2QQ9xQQFrNgJAIAAgB0EwahAFNgIUIAAgBRAWNgIYIAAgBRAWrTcDICAAIAUQFq03AyggBRALIQggBRALIQYgAAJ+IAMEQEEAIQkgAEEANgJEIABBADsBQCAAQQA2AjxCAAwBCyAFEAshCSAAIAUQCzYCPCAAIAUQCzsBQCAAIAUQFjYCRCAFEBatCzcDSCAFLQAARQRAIAQEQCAEQQA2AgQgBEEUNgIAC0J/IQ0gAg0BIAUQBwwBCwJAIAAvAQwiCkEBcQRAIApBwABxBEAgAEH//wM7AVIMAgsgAEEBOwFSDAELIABBADsBUgsgAEEANgI4IABCADcDMCAGIAhqIAlqIQoCQCACBEAgBS0AAAR+IAUpAwggBSkDEH0FQgALIAqtWg0BIAQEQCAEQQA2AgQgBEEVNgIAC0J/IQ0MAgsgBRAHIAEgCq1BACAEEC0iBQ0AQn8hDQwBCwJAIAhFDQAgACAFIAEgCEEBIAQQaCIINgIwIAhFBEAgBCgCAEERRgRAIAQEQCAEQQA2AgQgBEEVNgIACwtCfyENIAINAiAFEAcMAgsgAC0ADUEIcUUNACAIQQIQI0EFRw0AIAQEQCAEQQA2AgQgBEEVNgIAC0J/IQ0gAg0BIAUQBwwBCyAAQTRqIQgCQCAGRQ0AIAUgASAGQQAgBBBGIgxFBEBCfyENIAINAiAFEAcMAgsgDCAGQYACQYAEIAMbIAggBBByIQYgDBAGIAZFBEBCfyENIAINAiAFEAcMAgsgA0UNACAAQQE6AAQLAkAgCUUNACAAIAUgASAJQQAgBBBoIgE2AjggAUUEQEJ/IQ0gAg0CIAUQBwwCCyAALQANQQhxRQ0AIAFBAhAjQQVHDQAgBARAIARBADYCBCAEQRU2AgALQn8hDSACDQEgBRAHDAELIAAgACgCNEH14AEgACgCMBBrNgIwIAAgACgCNEH1xgEgACgCOBBrNgI4AkACQCAAKQMoQv////8PUQ0AIAApAyBC/////w9RDQAgACkDSEL/////D1INAQsCQAJAAkAgCCgCACAHQTBqQQFBgAJBgAQgAxsgBBBHIgFFBEAgAkUNAQwCCyABIAczATAQGCIBRQRAIAQEQCAEQQA2AgQgBEEONgIACyACRQ0BDAILAkAgACkDKEL/////D1EEQCAAIAEQHjcDKAwBCyADRQ0AQQAhBgJAIAEpAxAiDkIIfCINIA5UDQAgASkDCCANVA0AIAEgDTcDEEEBIQYLIAEgBjoAAAsgACkDIEL/////D1EEQCAAIAEQHjcDIAsCQCADDQAgACkDSEL/////D1EEQCAAIAEQHjcDSAsgACgCPEH//wNHDQAgACABEBY2AjwLIAEtAAAEfyABKQMQIAEpAwhRBUEACw0CIAQEQCAEQQA2AgQgBEEVNgIACyABEAcgAg0BCyAFEAcLQn8hDQwCCyABEAcLIAUtAABFBEAgBARAIARBADYCBCAEQRQ2AgALQn8hDSACDQEgBRAHDAELIAJFBEAgBRAHC0J/IQ0gACkDSEJ/VwRAIAQEQCAEQRY2AgQgBEEENgIACwwBCyMAQRBrIgMkAEEBIQECQCAAKAIQQeMARw0AQQAhAQJAIAAoAjQgA0EOakGBsgJBgAZBABBHIgIEQCADLwEOIgVBBksNAQsgBARAIARBADYCBCAEQRU2AgALDAELIAIgBa1C//8DgxAYIgJFBEAgBARAIARBADYCBCAEQRQ2AgALDAELQQEhAQJAAkACQCACEAtBAWsOAgIBAAtBACEBIAQEQCAEQQA2AgQgBEEYNgIACyACEAcMAgsgACkDKEITViEBCyACQgIQEy8AAEHBigFHBEBBACEBIAQEQCAEQQA2AgQgBEEYNgIACyACEAcMAQsgAhB1QQFrIgVB/wFxQQNPBEBBACEBIAQEQCAEQQA2AgQgBEEYNgIACyACEAcMAQsgAy8BDkEHRwRAQQAhASAEBEAgBEEANgIEIARBFTYCAAsgAhAHDAELIAAgAToABiAAIAVB/wFxQYECajsBUiAAIAIQCzYCECACEAdBASEBCyADQRBqJAAgAUUNACAIIAgoAgAQcTYCACAKIAtqrSENCyAHQeAAaiQAIA0L1gEBBH8jAEEQayIEJAACQCABIARBDGpBwABBABAlIgVFDQAgBCgCDEEFaiIDQYCABE8EQCACBEAgAkEANgIEIAJBEjYCAAsMAQtBACADrRAYIgNFBEAgAgRAIAJBADYCBCACQQ42AgALDAELIANBARB0IAMgARBmEBIgAyAFIAQoAgwQLAJ/IAMtAABFBEAgAgRAIAJBADYCBCACQRQ2AgALQQAMAQsgACADLQAABH4gAykDEAVCAAunQf//A3EgAygCBBBICyEGIAMQBwsgBEEQaiQAIAYL4AECAn8BfkEwEAgiAkUEQCABBEAgAUEANgIEIAFBDjYCAAtBAA8LIAJCADcDCCACQQA2AgAgAkIANwMQIAJCADcDGCACQgA3AyAgAkIANwAlIABQBEAgAg8LAkAgAEL/////AFYNACAAp0EEdBAIIgNFDQAgAiADNgIAQQAhAUIBIQQDQCADIAFBBHRqIgFCADcCACABQgA3AAUgACAEUgRAIASnIQEgBEIBfCEEDAELCyACIAA3AwggAiAANwMQIAIPCyABBEAgAUEANgIEIAFBDjYCAAtBABAQIAIQBkEAC+4BAgN/AX4jAEEQayIEJAACQCAEQQxqQgQQGCIDRQRAQX8hAgwBCwJAIAEEQCACQYAGcSEFA0ACQCAFIAEoAgRxRQ0AAkAgAykDCEIAVARAIANBADoAAAwBCyADQgA3AxAgA0EBOgAACyADIAEvAQgQDSADIAEvAQoQDSADLQAARQRAIABBCGoiAARAIABBADYCBCAAQRQ2AgALQX8hAgwEC0F/IQIgACAEQQxqQgQQHEEASA0DIAEzAQoiBlANACAAIAEoAgwgBhAcQQBIDQMLIAEoAgAiAQ0ACwtBACECCyADEAcLIARBEGokACACCzwBAX8gAARAIAFBgAZxIQEDQCABIAAoAgRxBEAgAiAALwEKakEEaiECCyAAKAIAIgANAAsLIAJB//8DcQucAQEDfyAARQRAQQAPCyAAIQMDQAJ/AkACQCAALwEIIgFB9OABTQRAIAFBAUYNASABQfXGAUYNAQwCCyABQYGyAkYNACABQfXgAUcNAQsgACgCACEBIABBADYCACAAKAIMEAYgABAGIAEgAyAAIANGGyEDAkAgAkUEQEEAIQIMAQsgAiABNgIACyABDAELIAAiAigCAAsiAA0ACyADC7IEAgV/AX4CQAJAAkAgACABrRAYIgEEQCABLQAADQFBACEADAILIAQEQCAEQQA2AgQgBEEONgIAC0EADwtBACEAA0AgAS0AAAR+IAEpAwggASkDEH0FQgALQgRUDQEgARALIQcgASABEAsiBq0QEyIIRQRAQQAhAiAEBEAgBEEANgIEIARBFTYCAAsgARAHIABFDQMDQCAAKAIAIQEgACgCDBAGIAAQBiABIgANAAsMAwsCQAJAQRAQCCIFBEAgBSAGOwEKIAUgBzsBCCAFIAI2AgQgBUEANgIAIAZFDQEgBSAIIAYQZyIGNgIMIAYNAiAFEAYLQQAhAiAEBEAgBEEANgIEIARBDjYCAAsgARAHIABFDQQDQCAAKAIAIQEgACgCDBAGIAAQBiABIgANAAsMBAsgBUEANgIMCwJAIABFBEAgBSEADAELIAkgBTYCAAsgBSEJIAEtAAANAAsLAkAgAS0AAAR/IAEpAxAgASkDCFEFQQALDQAgASABLQAABH4gASkDCCABKQMQfQVCAAsiCkL/////D4MQEyECAkAgCqciBUEDSw0AIAJFDQAgAkHBFCAFEDxFDQELQQAhAiAEBEAgBEEANgIEIARBFTYCAAsgARAHIABFDQEDQCAAKAIAIQEgACgCDBAGIAAQBiABIgANAAsMAQsgARAHIAMEQCADIAA2AgBBAQ8LQQEhAiAARQ0AA0AgACgCACEBIAAoAgwQBiAAEAYgASIADQALCyACC74BAQV/IAAEfyAAIQIDQCACIgQoAgAiAg0ACyABBEADQCABIgMvAQghBiADKAIAIQEgACECAkACQANAAkAgAi8BCCAGRw0AIAIvAQoiBSADLwEKRw0AIAVFDQIgAigCDCADKAIMIAUQPEUNAgsgAigCACICDQALIANBADYCACAEIAM2AgAgAyEEDAELIAIgAigCBCADKAIEQYAGcXI2AgQgA0EANgIAIAMoAgwQBiADEAYLIAENAAsLIAAFIAELC1UCAn4BfwJAAkAgAC0AAEUNACAAKQMQIgJCAXwiAyACVA0AIAMgACkDCFgNAQsgAEEAOgAADwsgACgCBCIERQRADwsgACADNwMQIAQgAqdqIAE6AAALWgICfgF/An8CQAJAIAAtAABFDQAgACkDECIBQgF8IgIgAVQNACACIAApAwhYDQELIABBADoAAEEADAELQQAgACgCBCIDRQ0AGiAAIAI3AxAgAyABp2otAAALC94BAQN/IAEgACkDMFoEQCAAQQhqBEAgAEEANgIMIABBEjYCCAtBfw8LIABBCGohAiAALQAYQQJxBEAgAgRAIAJBADYCBCACQRk2AgALQX8PC0F/IQMCQCAAIAFBACACEFQiBEUNACAAKAJQIAQgAhCBAUUNAAJ/IAEgACkDMFoEQCAAQQhqBEAgAEEANgIMIABBEjYCCAtBfwwBCyABp0EEdCICIAAoAkBqKAIEECAgACgCQCACaiICQQA2AgQgAhBBQQALDQAgACgCQCABp0EEdGpBAToADEEAIQMLIAMLpgIBBX9BfyEFAkAgACABQQBBABAmRQ0AIAAtABhBAnEEQCAAQQhqIgAEQCAAQQA2AgQgAEEZNgIAC0F/DwsCfyAAKAJAIgQgAaciBkEEdGooAgAiBUUEQCADQYCA2I14RyEHQQMMAQsgBSgCRCADRyEHIAUtAAkLIQggBCAGQQR0aiIEIQYgBCgCBCEEQQAgAiAIRiAHG0UEQAJAIAQNACAGIAUQKyIENgIEIAQNACAAQQhqIgAEQCAAQQA2AgQgAEEONgIAC0F/DwsgBCADNgJEIAQgAjoACSAEIAQoAgBBEHI2AgBBAA8LQQAhBSAERQ0AIAQgBCgCAEFvcSIANgIAIABFBEAgBBAgIAZBADYCBEEADwsgBCADNgJEIAQgCDoACQsgBQvkCAIFfwR+IAAtABhBAnEEQCAAQQhqBEAgAEEANgIMIABBGTYCCAtCfw8LIAApAzAhCwJAIANBgMAAcQRAIAAgASADQQAQTiIJQn9SDQELAn4CQAJAIAApAzAiCUIBfCIMIAApAzgiClQEQCAAKAJAIQQMAQsgCkIBhiIJQoAIIAlCgAhUGyIJQhAgCUIQVhsgCnwiCadBBHQiBK0gCkIEhkLw////D4NUDQEgACgCQCAEEDMiBEUNASAAIAk3AzggACAENgJAIAApAzAiCUIBfCEMCyAAIAw3AzAgBCAJp0EEdGoiBEIANwIAIARCADcABSAJDAELIABBCGoEQCAAQQA2AgwgAEEONgIIC0J/CyIJQgBZDQBCfw8LAkAgAUUNAAJ/QQAhBCAJIAApAzBaBEAgAEEIagRAIABBADYCDCAAQRI2AggLQX8MAQsgAC0AGEECcQRAIABBCGoEQCAAQQA2AgwgAEEZNgIIC0F/DAELAkAgAUUNACABLQAARQ0AQX8gASABECJB//8DcSADIABBCGoQNSIERQ0BGiADQYAwcQ0AIARBABAjQQNHDQAgBEECNgIICwJAIAAgAUEAQQAQTiIKQgBTIgENACAJIApRDQAgBBAQIABBCGoEQCAAQQA2AgwgAEEKNgIIC0F/DAELAkAgAUEBIAkgClEbRQ0AAkACfwJAIAAoAkAiASAJpyIFQQR0aiIGKAIAIgMEQCADKAIwIAQQZQ0BCyAEIAYoAgQNARogBiAGKAIAECsiAzYCBCAEIAMNARogAEEIagRAIABBADYCDCAAQQ42AggLDAILQQEhByAGKAIAKAIwC0EAQQAgAEEIaiIDECUiCEUNAAJAAkAgASAFQQR0aiIFKAIEIgENACAGKAIAIgENAEEAIQEMAQsgASgCMCIBRQRAQQAhAQwBCyABQQBBACADECUiAUUNAQsgACgCUCAIIAlBACADEFBFDQAgAQRAIAAoAlAgAUEAEIEBGgsgBSgCBCEDIAcEQCADRQ0CIAMtAABBAnFFDQIgAygCMBAQIAUoAgQiASABKAIAQX1xIgM2AgAgA0UEQCABECAgBUEANgIEIAQQEEEADAQLIAEgBigCACgCMDYCMCAEEBBBAAwDCyADKAIAIgFBAnEEQCADKAIwEBAgBSgCBCIDKAIAIQELIAMgBDYCMCADIAFBAnI2AgBBAAwCCyAEEBBBfwwBCyAEEBBBAAtFDQAgCyAAKQMwUQRAQn8PCyAAKAJAIAmnQQR0ahA6IAAgCzcDMEJ/DwsgCaciBkEEdCIBIAAoAkBqEEECQAJAIAAoAkAiBCABaiIDKAIAIgVFDQACQCADKAIEIgMEQCADKAIAIgBBAXFFDQEMAgsgBRArIQMgACgCQCIEIAZBBHRqIAM2AgQgA0UNAiADKAIAIQALIANBfjYCECADIABBAXI2AgALIAEgBGogAjYCCCAJDwsgAEEIagRAIABBADYCDCAAQQ42AggLQn8LXgEBfyMAQRBrIgIkAAJ/IAAoAiRBAUcEQCAAQQxqIgAEQCAAQQA2AgQgAEESNgIAC0F/DAELIAJBADYCCCACIAE3AwAgACACQhBBDBAOQj+HpwshACACQRBqJAAgAAvaAwEGfyMAQRBrIgUkACAFIAI2AgwjAEGgAWsiBCQAIARBCGpBwIgBQZABEAkaIAQgADYCNCAEIAA2AhwgBEF+IABrIgNB/////wcgA0H/////B0kbIgY2AjggBCAAIAZqIgA2AiQgBCAANgIYIARBCGohACMAQdABayIDJAAgAyACNgLMASADQaABakEAQSgQGiADIAMoAswBNgLIAQJAQQAgASADQcgBaiADQdAAaiADQaABahBMQQBIDQAgACgCTEEATiEHIAAoAgAhAiAALABKQQBMBEAgACACQV9xNgIACyACQSBxIQgCfyAAKAIwBEAgACABIANByAFqIANB0ABqIANBoAFqEEwMAQsgAEHQADYCMCAAIANB0ABqNgIQIAAgAzYCHCAAIAM2AhQgACgCLCECIAAgAzYCLCAAIAEgA0HIAWogA0HQAGogA0GgAWoQTCACRQ0AGiAAQQBBACAAKAIkEQAAGiAAQQA2AjAgACACNgIsIABBADYCHCAAQQA2AhAgACgCFBogAEEANgIUQQALGiAAIAAoAgAgCHI2AgAgB0UNAAsgA0HQAWokACAGBEAgBCgCHCIAIAAgBCgCGEZrQQA6AAALIARBoAFqJAAgBUEQaiQAC1MBA38CQCAAKAIALAAAQTBrQQpPDQADQCAAKAIAIgIsAAAhAyAAIAJBAWo2AgAgASADakEwayEBIAIsAAFBMGtBCk8NASABQQpsIQEMAAsACyABC7sCAAJAIAFBFEsNAAJAAkACQAJAAkACQAJAAkACQAJAIAFBCWsOCgABAgMEBQYHCAkKCyACIAIoAgAiAUEEajYCACAAIAEoAgA2AgAPCyACIAIoAgAiAUEEajYCACAAIAE0AgA3AwAPCyACIAIoAgAiAUEEajYCACAAIAE1AgA3AwAPCyACIAIoAgBBB2pBeHEiAUEIajYCACAAIAEpAwA3AwAPCyACIAIoAgAiAUEEajYCACAAIAEyAQA3AwAPCyACIAIoAgAiAUEEajYCACAAIAEzAQA3AwAPCyACIAIoAgAiAUEEajYCACAAIAEwAAA3AwAPCyACIAIoAgAiAUEEajYCACAAIAExAAA3AwAPCyACIAIoAgBBB2pBeHEiAUEIajYCACAAIAErAwA5AwAPCyAAIAJBABEGAAsLmwIAIABFBEBBAA8LAn8CQCAABH8gAUH/AE0NAQJAQeSaASgCACgCAEUEQCABQYB/cUGAvwNGDQMMAQsgAUH/D00EQCAAIAFBP3FBgAFyOgABIAAgAUEGdkHAAXI6AABBAgwECyABQYCwA09BACABQYBAcUGAwANHG0UEQCAAIAFBP3FBgAFyOgACIAAgAUEMdkHgAXI6AAAgACABQQZ2QT9xQYABcjoAAUEDDAQLIAFBgIAEa0H//z9NBEAgACABQT9xQYABcjoAAyAAIAFBEnZB8AFyOgAAIAAgAUEGdkE/cUGAAXI6AAIgACABQQx2QT9xQYABcjoAAUEEDAQLC0H4mwFBGTYCAEF/BUEBCwwBCyAAIAE6AABBAQsL4wEBAn8gAkEARyEDAkACQAJAIABBA3FFDQAgAkUNACABQf8BcSEEA0AgAC0AACAERg0CIAJBAWsiAkEARyEDIABBAWoiAEEDcUUNASACDQALCyADRQ0BCwJAIAAtAAAgAUH/AXFGDQAgAkEESQ0AIAFB/wFxQYGChAhsIQMDQCAAKAIAIANzIgRBf3MgBEGBgoQIa3FBgIGChHhxDQEgAEEEaiEAIAJBBGsiAkEDSw0ACwsgAkUNACABQf8BcSEBA0AgASAALQAARgRAIAAPCyAAQQFqIQAgAkEBayICDQALC0EAC3kBAXwCQCAARQ0AIAArAxAgACsDICICIAFEAAAAAAAAAAAgAUQAAAAAAAAAAGQbIgFEAAAAAAAA8D8gAUQAAAAAAADwP2MbIAArAyggAqGioCIBIAArAxihY0UNACAAKAIAIAEgACgCDCAAKAIEEQ4AIAAgATkDGAsLSAEBfAJAIABFDQAgACsDECAAKwMgIgEgACsDKCABoaAiASAAKwMYoWNFDQAgACgCACABIAAoAgwgACgCBBEOACAAIAE5AxgLC4QEAgZ/AX4gAEEAIAEbRQRAIAIEQCACQQA2AgQgAkESNgIAC0EADwsCQAJAIAApAwhQDQAgACgCECABLQAAIgQEf0Kl6wohCSABIQMDQCAJIAStQv8Bg3whCSADLQABIgQEQCADQQFqIQMgCUL/////D4NCIX4hCQwBCwsgCacFQYUqCyIEIAAoAgBwQQJ0aiIGKAIAIgNFDQADQAJAIAMoAhwgBEcNACABIAMoAgAQOA0AAkAgAykDCEJ/UQRAIAMoAhghAQJAIAUEQCAFIAE2AhgMAQsgBiABNgIACyADEAYgACAAKQMIQgF9Igk3AwggCbogACgCACIBuER7FK5H4XqEP6JjRQ0BIAFBgQJJDQECf0EAIQMgACgCACIGIAFBAXYiBUcEQCAFQQQQMCIHRQRAIAIEQCACQQA2AgQgAkEONgIAC0EADAILAkAgACkDCEIAIAYbUARAIAAoAhAhBAwBCyAAKAIQIQQDQCAEIANBAnRqKAIAIgEEQANAIAEoAhghAiABIAcgASgCHCAFcEECdGoiCCgCADYCGCAIIAE2AgAgAiIBDQALCyADQQFqIgMgBkcNAAsLIAQQBiAAIAU2AgAgACAHNgIQC0EBCw0BDAULIANCfzcDEAtBAQ8LIAMiBSgCGCIDDQALCyACBEAgAkEANgIEIAJBCTYCAAsLQQALkQEBAX8gACAAIAEgAiADEIMBIgIEQCACEDFBf0wEQCAAQQhqIgAEQCAAIAIoAgw2AgAgACACKAIQNgIECyACEApBAA8LQRgQCCIERQRAIABBCGoEQCAAQQA2AgwgAEEONgIICyACEApBAA8LIAQgADYCACAEQQA2AgwgBEIANwIEIAQgAjYCFCAEQQA6ABALIAQLpAYCCX8BfiMAQfAAayIFJAACQAJAIABFDQACQCABBEAgASkDMCACVg0BC0EAIQMgAEEIagRAIABBADYCDCAAQRI2AggLDAILAkAgA0EIcQ0AIAEoAkAgAqdBBHRqIgYoAghFBEAgBi0ADEUNAQtBACEDIABBCGoEQCAAQQA2AgwgAEEPNgIICwwCCyABIAIgA0EIciAFQThqEFNBf0wEQEEAIQMgAEEIagRAIABBADYCDCAAQRQ2AggLDAILIANBA3ZBBHEgA3IiBkEEcSEHIAUpA1AhDiAFLwFoIQkCQCADQSBxRSAFLwFqQQBHcSILRQ0AIAQNACAAKAIcIgQNAEEAIQMgAEEIagRAIABBADYCDCAAQRo2AggLDAILIAUpA1hQBEAgAEEAQgBBABBSIQMMAgsCQCAHRSIMIAlBAEdxIg1BAXJFBEBBACEDIAVBADsBMCAFIA43AyAgBSAONwMYIAUgBSgCYDYCKCAFQtwANwMAIAEoAgAgDiAFQQAgASACIABBCGoQYSIGDQEMAwtBACEDIAEgAiAGIABBCGoiBhAmIgdFDQIgASgCACAFKQNYIAVBOGogBy8BDEEBdkEDcSABIAIgBhBhIgZFDQILAn8gBiABNgIsAkAgASgCRCIIQQFqIgogASgCSCIHSQRAIAEoAkwhBwwBCyABKAJMIAdBCmoiCEECdBAzIgdFBEAgAUEIagRAIAFBADYCDCABQQ42AggLQX8MAgsgASAHNgJMIAEgCDYCSCABKAJEIghBAWohCgsgASAKNgJEIAcgCEECdGogBjYCAEEAC0F/TARAIAYQCgwBCwJAIAtFBEAgBiEBDAELQSVBACAFLwFqQQFGGyIBRQRAIABBCGoEQCAAQQA2AgwgAEEYNgIICwwDCyAAIAYgBS8BakEAIAQgAREIACEBIAYQCiABRQ0CCwJAIA1FBEAgASEDDAELIAAgASAFLwFoEIUBIQMgARAKIANFDQELAkAgCUUgDHJFBEAgAyEBDAELIAAgA0EBEIQBIQEgAxAKIAFFDQELIAEhAwwBC0EAIQMLIAVB8ABqJAAgAwuFAQEBfyABRQRAIABBCGoiAARAIABBADYCBCAAQRI2AgALQQAPC0E4EAgiA0UEQCAAQQhqIgAEQCAAQQA2AgQgAEEONgIAC0EADwsgA0EANgIQIANCADcCCCADQgA3AyggA0EANgIEIAMgAjYCACADQgA3AxggA0EANgIwIAAgAUEwIAMQQwsPACAAIAEgAkEAQQAQhgELrAIBAn8gAUUEQCAAQQhqIgAEQCAAQQA2AgQgAEESNgIAC0EADwsCQCACQX1LDQAgAkH//wNxQQhGDQAgAEEIaiIABEAgAEEANgIEIABBEDYCAAtBAA8LAkBBsMAAEAgiBQRAIAVBADYCCCAFQgA3AgAgBUH4mAFBmJkBIAMbNgKoQCAFIAI2AhQgBSADOgAQIAVBADoADyAFQQA7AQwgBSADIAJBfUsiBnE6AA4gBUEIIAIgBhtB//8DcSAEIAVB+JgBQZiZASADGygCABEAACICNgKsQCACDQEgBRAvIAUQBgsgAEEIaiIABEAgAEEANgIEIABBDjYCAAtBAA8LIAAgAUEvIAUQQyIABH8gAAUgBSgCrEAgBSgCqEAoAgQRBAAgBRAvIAUQBkEACwuKAwIGfwR+QcgAEAgiBEUEQEEADwsgBEIANwMAIARCADcDMCAEQQA2AiggBEIANwMgIARCADcDGCAEQgA3AxAgBEIANwMIIARCADcDOCABUARAIARBCBAIIgA2AgQgAEUEQCAEEAYgAwRAIANBADYCBCADQQ42AgALQQAPCyAAQgA3AwAgBA8LAkAgAaciBUEEdBAIIgZFDQAgBCAGNgIAIAVBA3RBCGoQCCIFRQ0AIAQgATcDECAEIAU2AgQDQCAAIAynIghBBHRqIgcpAwgiDVBFBEAgBygCACIHRQRAIAMEQCADQQA2AgQgA0ESNgIACyAGEAYgBRAGIAQQBkEADwsgBiAKp0EEdGoiCSANNwMIIAkgBzYCACAFIAhBA3RqIAs3AwAgCyANfCELIApCAXwhCgsgDEIBfCIMIAFSDQALIAQgCjcDCCAEQgAgCiACGzcDGCAFIAqnQQN0aiALNwMAIAQgCzcDMCAEDwsgAwRAIANBADYCBCADQQ42AgALIAYQBiAEEAZBAAspAQF/IAAgASACIABBCGoiABAmIgNFBEBBAA8LIAMoAjBBACACIAAQJQsKACAAQfybARAEC48qAgt/A34gACkDuC0hDiAAKALALSEDIAJBAE4EQEEEQQMgAS8BAiIKGyELQQdBigEgChshBUF/IQYDQCAKIQkgASAMIg1BAWoiDEECdGovAQIhCgJAAkAgB0EBaiIEIAVODQAgCSAKRw0AIAQhBwwBCwJAIAQgC0gEQCAAIAlBAnRqIgVB8hRqIQYgBUHwFGohCwNAIAszAQAhEAJ/IAMgBi8BACIHaiIFQT9NBEAgECADrYYgDoQhDiAFDAELIANBwABGBEAgACgCBCEDIAAgACgCECIFQQFqNgIQIAMgBWogDjwAACAAKAIEIQMgACAAKAIQIgVBAWo2AhAgAyAFaiAOQgiIPAAAIAAoAgQhAyAAIAAoAhAiBUEBajYCECADIAVqIA5CEIg8AAAgACgCBCEDIAAgACgCECIFQQFqNgIQIAMgBWogDkIYiDwAACAAKAIEIQMgACAAKAIQIgVBAWo2AhAgAyAFaiAOQiCIPAAAIAAoAgQhAyAAIAAoAhAiBUEBajYCECADIAVqIA5CKIg8AAAgACgCBCEDIAAgACgCECIFQQFqNgIQIAMgBWogDkIwiDwAACAAKAIEIQMgACAAKAIQIgVBAWo2AhAgAyAFaiAOQjiIPAAAIBAhDiAHDAELIAAoAgQhByAAIAAoAhAiCEEBajYCECAHIAhqIBAgA62GIA6EIg48AAAgACgCBCEHIAAgACgCECIIQQFqNgIQIAcgCGogDkIIiDwAACAAKAIEIQcgACAAKAIQIghBAWo2AhAgByAIaiAOQhCIPAAAIAAoAgQhByAAIAAoAhAiCEEBajYCECAHIAhqIA5CGIg8AAAgACgCBCEHIAAgACgCECIIQQFqNgIQIAcgCGogDkIgiDwAACAAKAIEIQcgACAAKAIQIghBAWo2AhAgByAIaiAOQiiIPAAAIAAoAgQhByAAIAAoAhAiCEEBajYCECAHIAhqIA5CMIg8AAAgACgCBCEHIAAgACgCECIIQQFqNgIQIAcgCGogDkI4iDwAACAQQcAAIANrrYghDiAFQUBqCyEDIARBAWsiBA0ACwwBCyAJBEACQCAGIAlGBEAgDiEQIAMhBSAEIQcMAQsgACAJQQJ0aiIEQfAUajMBACEQIAMgBEHyFGovAQAiBGoiBUE/TQRAIBAgA62GIA6EIRAMAQsgA0HAAEYEQCAAKAIEIQMgACAAKAIQIgVBAWo2AhAgAyAFaiAOPAAAIAAoAgQhAyAAIAAoAhAiBUEBajYCECADIAVqIA5CCIg8AAAgACgCBCEDIAAgACgCECIFQQFqNgIQIAMgBWogDkIQiDwAACAAKAIEIQMgACAAKAIQIgVBAWo2AhAgAyAFaiAOQhiIPAAAIAAoAgQhAyAAIAAoAhAiBUEBajYCECADIAVqIA5CIIg8AAAgACgCBCEDIAAgACgCECIFQQFqNgIQIAMgBWogDkIoiDwAACAAKAIEIQMgACAAKAIQIgVBAWo2AhAgAyAFaiAOQjCIPAAAIAAoAgQhAyAAIAAoAhAiBUEBajYCECADIAVqIA5COIg8AAAgBCEFDAELIAAoAgQhBCAAIAAoAhAiBkEBajYCECAEIAZqIBAgA62GIA6EIg48AAAgACgCBCEEIAAgACgCECIGQQFqNgIQIAQgBmogDkIIiDwAACAAKAIEIQQgACAAKAIQIgZBAWo2AhAgBCAGaiAOQhCIPAAAIAAoAgQhBCAAIAAoAhAiBkEBajYCECAEIAZqIA5CGIg8AAAgACgCBCEEIAAgACgCECIGQQFqNgIQIAQgBmogDkIgiDwAACAAKAIEIQQgACAAKAIQIgZBAWo2AhAgBCAGaiAOQiiIPAAAIAAoAgQhBCAAIAAoAhAiBkEBajYCECAEIAZqIA5CMIg8AAAgACgCBCEEIAAgACgCECIGQQFqNgIQIAQgBmogDkI4iDwAACAFQUBqIQUgEEHAACADa62IIRALIAAzAbAVIQ8CQCAFIAAvAbIVIgNqIgRBP00EQCAPIAWthiAQhCEPDAELIAVBwABGBEAgACgCBCEEIAAgACgCECIFQQFqNgIQIAQgBWogEDwAACAAKAIEIQQgACAAKAIQIgVBAWo2AhAgBCAFaiAQQgiIPAAAIAAoAgQhBCAAIAAoAhAiBUEBajYCECAEIAVqIBBCEIg8AAAgACgCBCEEIAAgACgCECIFQQFqNgIQIAQgBWogEEIYiDwAACAAKAIEIQQgACAAKAIQIgVBAWo2AhAgBCAFaiAQQiCIPAAAIAAoAgQhBCAAIAAoAhAiBUEBajYCECAEIAVqIBBCKIg8AAAgACgCBCEEIAAgACgCECIFQQFqNgIQIAQgBWogEEIwiDwAACAAKAIEIQQgACAAKAIQIgVBAWo2AhAgBCAFaiAQQjiIPAAAIAMhBAwBCyAAKAIEIQMgACAAKAIQIgZBAWo2AhAgAyAGaiAPIAWthiAQhCIOPAAAIAAoAgQhAyAAIAAoAhAiBkEBajYCECADIAZqIA5CCIg8AAAgACgCBCEDIAAgACgCECIGQQFqNgIQIAMgBmogDkIQiDwAACAAKAIEIQMgACAAKAIQIgZBAWo2AhAgAyAGaiAOQhiIPAAAIAAoAgQhAyAAIAAoAhAiBkEBajYCECADIAZqIA5CIIg8AAAgACgCBCEDIAAgACgCECIGQQFqNgIQIAMgBmogDkIoiDwAACAAKAIEIQMgACAAKAIQIgZBAWo2AhAgAyAGaiAOQjCIPAAAIAAoAgQhAyAAIAAoAhAiBkEBajYCECADIAZqIA5COIg8AAAgBEFAaiEEIA9BwAAgBWutiCEPCyAHrEIDfSEOIARBPU0EQCAEQQJqIQMgDiAErYYgD4QhDgwCCyAEQcAARgRAIAAoAgQhBCAAIAAoAhAiA0EBajYCECADIARqIA88AAAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogD0IIiDwAACAAKAIEIQQgACAAKAIQIgNBAWo2AhAgAyAEaiAPQhCIPAAAIAAoAgQhBCAAIAAoAhAiA0EBajYCECADIARqIA9CGIg8AAAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogD0IgiDwAACAAKAIEIQQgACAAKAIQIgNBAWo2AhAgAyAEaiAPQiiIPAAAIAAoAgQhBCAAIAAoAhAiA0EBajYCECADIARqIA9CMIg8AAAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogD0I4iDwAAEECIQMMAgsgACgCBCEDIAAgACgCECIFQQFqNgIQIAMgBWogDiAErYYgD4QiEDwAACAAKAIEIQMgACAAKAIQIgVBAWo2AhAgAyAFaiAQQgiIPAAAIAAoAgQhAyAAIAAoAhAiBUEBajYCECADIAVqIBBCEIg8AAAgACgCBCEDIAAgACgCECIFQQFqNgIQIAMgBWogEEIYiDwAACAAKAIEIQMgACAAKAIQIgVBAWo2AhAgAyAFaiAQQiCIPAAAIAAoAgQhAyAAIAAoAhAiBUEBajYCECADIAVqIBBCKIg8AAAgACgCBCEDIAAgACgCECIFQQFqNgIQIAMgBWogEEIwiDwAACAAKAIEIQMgACAAKAIQIgVBAWo2AhAgAyAFaiAQQjiIPAAAIARBPmshAyAOQcAAIARrrYghDgwBCyAHQQlMBEAgADMBtBUhDwJAIAMgAC8BthUiBWoiBEE/TQRAIA8gA62GIA6EIQ8MAQsgA0HAAEYEQCAAKAIEIQQgACAAKAIQIgNBAWo2AhAgAyAEaiAOPAAAIAAoAgQhBCAAIAAoAhAiA0EBajYCECADIARqIA5CCIg8AAAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogDkIQiDwAACAAKAIEIQQgACAAKAIQIgNBAWo2AhAgAyAEaiAOQhiIPAAAIAAoAgQhBCAAIAAoAhAiA0EBajYCECADIARqIA5CIIg8AAAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogDkIoiDwAACAAKAIEIQQgACAAKAIQIgNBAWo2AhAgAyAEaiAOQjCIPAAAIAAoAgQhBCAAIAAoAhAiA0EBajYCECADIARqIA5COIg8AAAgBSEEDAELIAAoAgQhBSAAIAAoAhAiBkEBajYCECAFIAZqIA8gA62GIA6EIg48AAAgACgCBCEFIAAgACgCECIGQQFqNgIQIAUgBmogDkIIiDwAACAAKAIEIQUgACAAKAIQIgZBAWo2AhAgBSAGaiAOQhCIPAAAIAAoAgQhBSAAIAAoAhAiBkEBajYCECAFIAZqIA5CGIg8AAAgACgCBCEFIAAgACgCECIGQQFqNgIQIAUgBmogDkIgiDwAACAAKAIEIQUgACAAKAIQIgZBAWo2AhAgBSAGaiAOQiiIPAAAIAAoAgQhBSAAIAAoAhAiBkEBajYCECAFIAZqIA5CMIg8AAAgACgCBCEFIAAgACgCECIGQQFqNgIQIAUgBmogDkI4iDwAACAEQUBqIQQgD0HAACADa62IIQ8LIAesQgJ9IQ4gBEE8TQRAIARBA2ohAyAOIASthiAPhCEODAILIARBwABGBEAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogDzwAACAAKAIEIQQgACAAKAIQIgNBAWo2AhAgAyAEaiAPQgiIPAAAIAAoAgQhBCAAIAAoAhAiA0EBajYCECADIARqIA9CEIg8AAAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogD0IYiDwAACAAKAIEIQQgACAAKAIQIgNBAWo2AhAgAyAEaiAPQiCIPAAAIAAoAgQhBCAAIAAoAhAiA0EBajYCECADIARqIA9CKIg8AAAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogD0IwiDwAACAAKAIEIQQgACAAKAIQIgNBAWo2AhAgAyAEaiAPQjiIPAAAQQMhAwwCCyAAKAIEIQMgACAAKAIQIgVBAWo2AhAgAyAFaiAOIASthiAPhCIQPAAAIAAoAgQhAyAAIAAoAhAiBUEBajYCECADIAVqIBBCCIg8AAAgACgCBCEDIAAgACgCECIFQQFqNgIQIAMgBWogEEIQiDwAACAAKAIEIQMgACAAKAIQIgVBAWo2AhAgAyAFaiAQQhiIPAAAIAAoAgQhAyAAIAAoAhAiBUEBajYCECADIAVqIBBCIIg8AAAgACgCBCEDIAAgACgCECIFQQFqNgIQIAMgBWogEEIoiDwAACAAKAIEIQMgACAAKAIQIgVBAWo2AhAgAyAFaiAQQjCIPAAAIAAoAgQhAyAAIAAoAhAiBUEBajYCECADIAVqIBBCOIg8AAAgBEE9ayEDIA5BwAAgBGutiCEODAELIAAzAbgVIQ8CQCADIAAvAboVIgVqIgRBP00EQCAPIAOthiAOhCEPDAELIANBwABGBEAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogDjwAACAAKAIEIQQgACAAKAIQIgNBAWo2AhAgAyAEaiAOQgiIPAAAIAAoAgQhBCAAIAAoAhAiA0EBajYCECADIARqIA5CEIg8AAAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogDkIYiDwAACAAKAIEIQQgACAAKAIQIgNBAWo2AhAgAyAEaiAOQiCIPAAAIAAoAgQhBCAAIAAoAhAiA0EBajYCECADIARqIA5CKIg8AAAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogDkIwiDwAACAAKAIEIQQgACAAKAIQIgNBAWo2AhAgAyAEaiAOQjiIPAAAIAUhBAwBCyAAKAIEIQUgACAAKAIQIgZBAWo2AhAgBSAGaiAPIAOthiAOhCIOPAAAIAAoAgQhBSAAIAAoAhAiBkEBajYCECAFIAZqIA5CCIg8AAAgACgCBCEFIAAgACgCECIGQQFqNgIQIAUgBmogDkIQiDwAACAAKAIEIQUgACAAKAIQIgZBAWo2AhAgBSAGaiAOQhiIPAAAIAAoAgQhBSAAIAAoAhAiBkEBajYCECAFIAZqIA5CIIg8AAAgACgCBCEFIAAgACgCECIGQQFqNgIQIAUgBmogDkIoiDwAACAAKAIEIQUgACAAKAIQIgZBAWo2AhAgBSAGaiAOQjCIPAAAIAAoAgQhBSAAIAAoAhAiBkEBajYCECAFIAZqIA5COIg8AAAgBEFAaiEEIA9BwAAgA2utiCEPCyAHrUIKfSEOIARBOE0EQCAEQQdqIQMgDiAErYYgD4QhDgwBCyAEQcAARgRAIAAoAgQhBCAAIAAoAhAiA0EBajYCECADIARqIA88AAAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogD0IIiDwAACAAKAIEIQQgACAAKAIQIgNBAWo2AhAgAyAEaiAPQhCIPAAAIAAoAgQhBCAAIAAoAhAiA0EBajYCECADIARqIA9CGIg8AAAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogD0IgiDwAACAAKAIEIQQgACAAKAIQIgNBAWo2AhAgAyAEaiAPQiiIPAAAIAAoAgQhBCAAIAAoAhAiA0EBajYCECADIARqIA9CMIg8AAAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogD0I4iDwAAEEHIQMMAQsgACgCBCEDIAAgACgCECIFQQFqNgIQIAMgBWogDiAErYYgD4QiEDwAACAAKAIEIQMgACAAKAIQIgVBAWo2AhAgAyAFaiAQQgiIPAAAIAAoAgQhAyAAIAAoAhAiBUEBajYCECADIAVqIBBCEIg8AAAgACgCBCEDIAAgACgCECIFQQFqNgIQIAMgBWogEEIYiDwAACAAKAIEIQMgACAAKAIQIgVBAWo2AhAgAyAFaiAQQiCIPAAAIAAoAgQhAyAAIAAoAhAiBUEBajYCECADIAVqIBBCKIg8AAAgACgCBCEDIAAgACgCECIFQQFqNgIQIAMgBWogEEIwiDwAACAAKAIEIQMgACAAKAIQIgVBAWo2AhAgAyAFaiAQQjiIPAAAIARBOWshAyAOQcAAIARrrYghDgtBACEHAn8gCkUEQEGKASEFQQMMAQtBBkEHIAkgCkYiBBshBUEDQQQgBBsLIQsgCSEGCyACIA1HDQALCyAAIAM2AsAtIAAgDjcDuC0LjxECCH8CfgJAIAAoApQtRQRAIAApA7gtIQwgACgCwC0hBAwBCwNAIAkiBEEDaiEJIAQgACgCkC1qIgQtAAIhBSAAKQO4LSELIAAoAsAtIQYCQCAELwAAIgdFBEAgASAFQQJ0aiIEMwEAIQwgBiAELwECIgVqIgRBP00EQCAMIAathiALhCEMDAILIAZBwABGBEAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogCzwAACAAKAIEIQQgACAAKAIQIgNBAWo2AhAgAyAEaiALQgiIPAAAIAAoAgQhBCAAIAAoAhAiA0EBajYCECADIARqIAtCEIg8AAAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogC0IYiDwAACAAKAIEIQQgACAAKAIQIgNBAWo2AhAgAyAEaiALQiCIPAAAIAAoAgQhBCAAIAAoAhAiA0EBajYCECADIARqIAtCKIg8AAAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogC0IwiDwAACAAKAIEIQQgACAAKAIQIgNBAWo2AhAgAyAEaiALQjiIPAAAIAUhBAwCCyAAKAIEIQUgACAAKAIQIgNBAWo2AhAgAyAFaiAMIAathiALhCILPAAAIAAoAgQhBSAAIAAoAhAiA0EBajYCECADIAVqIAtCCIg8AAAgACgCBCEFIAAgACgCECIDQQFqNgIQIAMgBWogC0IQiDwAACAAKAIEIQUgACAAKAIQIgNBAWo2AhAgAyAFaiALQhiIPAAAIAAoAgQhBSAAIAAoAhAiA0EBajYCECADIAVqIAtCIIg8AAAgACgCBCEFIAAgACgCECIDQQFqNgIQIAMgBWogC0IoiDwAACAAKAIEIQUgACAAKAIQIgNBAWo2AhAgAyAFaiALQjCIPAAAIAAoAgQhBSAAIAAoAhAiA0EBajYCECADIAVqIAtCOIg8AAAgBEFAaiEEIAxBwAAgBmutiCEMDAELIAVB0OkAai0AACIIQQJ0IgMgAWoiBEGECGozAQAhDCAEQYYIai8BACEEIAhBCGtBE00EQCAFIANB0OsAaigCAGutIASthiAMhCEMIANBkO4AaigCACAEaiEECyAEIAIgB0EBayIHIAdBB3ZBgAJqIAdBgAJJG0HQ5QBqLQAAIgVBAnQiCGoiCi8BAmohAyAKMwEAIASthiAMhCEMIAYgBUEESQR/IAMFIAcgCEHQ7ABqKAIAa60gA62GIAyEIQwgCEGQ7wBqKAIAIANqCyIFaiIEQT9NBEAgDCAGrYYgC4QhDAwBCyAGQcAARgRAIAAoAgQhBCAAIAAoAhAiA0EBajYCECADIARqIAs8AAAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogC0IIiDwAACAAKAIEIQQgACAAKAIQIgNBAWo2AhAgAyAEaiALQhCIPAAAIAAoAgQhBCAAIAAoAhAiA0EBajYCECADIARqIAtCGIg8AAAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogC0IgiDwAACAAKAIEIQQgACAAKAIQIgNBAWo2AhAgAyAEaiALQiiIPAAAIAAoAgQhBCAAIAAoAhAiA0EBajYCECADIARqIAtCMIg8AAAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogC0I4iDwAACAFIQQMAQsgACgCBCEFIAAgACgCECIDQQFqNgIQIAMgBWogDCAGrYYgC4QiCzwAACAAKAIEIQUgACAAKAIQIgNBAWo2AhAgAyAFaiALQgiIPAAAIAAoAgQhBSAAIAAoAhAiA0EBajYCECADIAVqIAtCEIg8AAAgACgCBCEFIAAgACgCECIDQQFqNgIQIAMgBWogC0IYiDwAACAAKAIEIQUgACAAKAIQIgNBAWo2AhAgAyAFaiALQiCIPAAAIAAoAgQhBSAAIAAoAhAiA0EBajYCECADIAVqIAtCKIg8AAAgACgCBCEFIAAgACgCECIDQQFqNgIQIAMgBWogC0IwiDwAACAAKAIEIQUgACAAKAIQIgNBAWo2AhAgAyAFaiALQjiIPAAAIARBQGohBCAMQcAAIAZrrYghDAsgACAMNwO4LSAAIAQ2AsAtIAkgACgClC1JDQALCyABQYAIajMBACELAkAgBCABQYIIai8BACICaiIBQT9NBEAgCyAErYYgDIQhCwwBCyAEQcAARgRAIAAgACgCECIBQQFqNgIQIAEgACgCBGogDDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAxCCIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAMQhCIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogDEIYiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAxCIIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiAMQiiIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogDEIwiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAxCOIg8AAAgAiEBDAELIAAgACgCECICQQFqNgIQIAIgACgCBGogCyAErYYgDIQiDDwAACAAIAAoAhAiAkEBajYCECACIAAoAgRqIAxCCIg8AAAgACAAKAIQIgJBAWo2AhAgAiAAKAIEaiAMQhCIPAAAIAAgACgCECICQQFqNgIQIAIgACgCBGogDEIYiDwAACAAIAAoAhAiAkEBajYCECACIAAoAgRqIAxCIIg8AAAgACAAKAIQIgJBAWo2AhAgAiAAKAIEaiAMQiiIPAAAIAAgACgCECICQQFqNgIQIAIgACgCBGogDEIwiDwAACAAIAAoAhAiAkEBajYCECACIAAoAgRqIAxCOIg8AAAgAUFAaiEBIAtBwAAgBGutiCELCyAAIAs3A7gtIAAgATYCwC0L2wQCAX8BfgJAIAAoAsAtIgFBOU4EQCAAIAAoAhAiAUEBajYCECABIAAoAgRqIAApA7gtIgI8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiACQgiIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogAkIQiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAJCGIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiACQiCIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogAkIoiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAJCMIg8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiACQjiIPAAADAELIAFBGU4EQCAAIAAoAhAiAUEBajYCECABIAAoAgRqIAApA7gtIgI8AAAgACAAKAIQIgFBAWo2AhAgASAAKAIEaiACQgiIPAAAIAAgACgCECIBQQFqNgIQIAEgACgCBGogAkIQiDwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAJCGIg8AAAgACAAQbwtajUCADcDuC0gACAAKALALUEgayIBNgLALQsgAUEJTgRAIAAgACgCECIBQQFqNgIQIAEgACgCBGogACkDuC0iAjwAACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAJCCIg8AAAgACAAKQO4LUIQiDcDuC0gACAAKALALUEQayIBNgLALQsgAUEBSA0AIAAgACgCECIBQQFqNgIQIAEgACgCBGogACkDuC08AAALIABBADYCwC0gAEIANwO4LQvwBAEDfyAAQYgBaiECA0AgAiABQQJ0IgNqQQA7AQAgAiADQQRyakEAOwEAIAFBAmoiAUGeAkcNAAsgAEEAOwHwFCAAQQA7AfwSIABBuBVqQQA7AQAgAEG0FWpBADsBACAAQbAVakEAOwEAIABBrBVqQQA7AQAgAEGoFWpBADsBACAAQaQVakEAOwEAIABBoBVqQQA7AQAgAEGcFWpBADsBACAAQZgVakEAOwEAIABBlBVqQQA7AQAgAEGQFWpBADsBACAAQYwVakEAOwEAIABBiBVqQQA7AQAgAEGEFWpBADsBACAAQYAVakEAOwEAIABB/BRqQQA7AQAgAEH4FGpBADsBACAAQfQUakEAOwEAIABB8BNqQQA7AQAgAEHsE2pBADsBACAAQegTakEAOwEAIABB5BNqQQA7AQAgAEHgE2pBADsBACAAQdwTakEAOwEAIABB2BNqQQA7AQAgAEHUE2pBADsBACAAQdATakEAOwEAIABBzBNqQQA7AQAgAEHIE2pBADsBACAAQcQTakEAOwEAIABBwBNqQQA7AQAgAEG8E2pBADsBACAAQbgTakEAOwEAIABBtBNqQQA7AQAgAEGwE2pBADsBACAAQawTakEAOwEAIABBqBNqQQA7AQAgAEGkE2pBADsBACAAQaATakEAOwEAIABBnBNqQQA7AQAgAEGYE2pBADsBACAAQZQTakEAOwEAIABBkBNqQQA7AQAgAEGME2pBADsBACAAQYgTakEAOwEAIABBhBNqQQA7AQAgAEGAE2pBADsBACAAQgA3A6AtIABBiAlqQQE7AQAgAEEANgKcLSAAQQA2ApQtC4oBAQR/IAAoAkggAWoiAyACIANqQQFrIgJNBEAgACgCUCEFA0AgAygAACEEIANBAWohAyAFIARBsfPd8XlsQQ92Qf7/B3FqIgQvAQAiBiABQf//A3FHBEAgACgCTCABIAAoAjhxQf//A3FBAXRqIAY7AQAgBCABOwEACyABQQFqIQEgAiADTw0ACwsLUAECfyABIAAoAlAgACgCSCABaigAAEGx893xeWxBD3ZB/v8HcWoiAy8BACICRwRAIAAoAkwgACgCOCABcUEBdGogAjsBACADIAE7AQALIAILhQUBE38gACgCcCIDIANBAnYgACgCbCIDQQEgAxsiAyAAKAKAAUkbIQcgACgCZCIKIAAoAjBBhgJrIgVrQf//A3FBACAFIApJGyEMIAAoAkgiCCAKaiIJIANBAWsiAmoiBS0AASENIAUtAAAhDiAJQQJqIQUgAiAIaiELIAAoAoQBIRIgACgCPCEPIAAoAkwhECAAKAI4IREgACgCeEEFSCETA0ACQCAKIAFB//8DcU0NAANAAkACQCALIAFB//8DcSIGai0AACAORw0AIAsgBkEBaiIBai0AACANRw0AIAYgCGoiAi0AACAJLQAARw0AIAEgCGotAAAgCS0AAUYNAQsgB0EBayIHRQ0CIAwgECAGIBFxQQF0ai8BACIBSQ0BDAILCyACQQJqIQRBACECIAUhAQJAA0AgAS0AACAELQAARw0BIAEtAAEgBC0AAUcEQCACQQFyIQIMAgsgAS0AAiAELQACRwRAIAJBAnIhAgwCCyABLQADIAQtAANHBEAgAkEDciECDAILIAEtAAQgBC0ABEcEQCACQQRyIQIMAgsgAS0ABSAELQAFRwRAIAJBBXIhAgwCCyABLQAGIAQtAAZHBEAgAkEGciECDAILIAEtAAcgBC0AB0cEQCACQQdyIQIMAgsgBEEIaiEEIAFBCGohASACQfgBSSEUIAJBCGohAiAUDQALQYACIQILAkAgAyACQQJqIgFJBEAgACAGNgJoIAEgD0sEQCAPDwsgASASTwRAIAEPCyAIIAJBAWoiA2ohCyADIAlqIgMtAAEhDSADLQAAIQ4gASEDDAELIBMNAQsgB0EBayIHRQ0AIAwgECAGIBFxQQF0ai8BACIBSQ0BCwsgAwuUAgECfwJ/QQAgAC0AACABLQAARw0AGkEBIAAtAAEgAS0AAUcNABogAUECaiEBIABBAmohAAJAA0AgAC0AACABLQAARw0BIAAtAAEgAS0AAUcEQCACQQFyIQIMAgsgAC0AAiABLQACRwRAIAJBAnIhAgwCCyAALQADIAEtAANHBEAgAkEDciECDAILIAAtAAQgAS0ABEcEQCACQQRyIQIMAgsgAC0ABSABLQAFRwRAIAJBBXIhAgwCCyAALQAGIAEtAAZHBEAgAkEGciECDAILIAAtAAcgAS0AB0cEQCACQQdyIQIMAgsgAUEIaiEBIABBCGohACACQfgBSSEDIAJBCGohAiADDQALQYACIQILIAJBAmoLC+IFAQR/IAMgAiACIANLGyEEIAAgAWshAgJAIABBB3FFDQAgBEUNACAAIAItAAA6AAAgA0EBayEGIAJBAWohAiAAQQFqIgdBB3FBACAEQQFrIgUbRQRAIAchACAFIQQgBiEDDAELIAAgAi0AADoAASADQQJrIQYgBEECayEFIAJBAWohAgJAIABBAmoiB0EHcUUNACAFRQ0AIAAgAi0AADoAAiADQQNrIQYgBEEDayEFIAJBAWohAgJAIABBA2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAAyADQQRrIQYgBEEEayEFIAJBAWohAgJAIABBBGoiB0EHcUUNACAFRQ0AIAAgAi0AADoABCADQQVrIQYgBEEFayEFIAJBAWohAgJAIABBBWoiB0EHcUUNACAFRQ0AIAAgAi0AADoABSADQQZrIQYgBEEGayEFIAJBAWohAgJAIABBBmoiB0EHcUUNACAFRQ0AIAAgAi0AADoABiADQQdrIQYgBEEHayEFIAJBAWohAgJAIABBB2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAByADQQhrIQMgBEEIayEEIABBCGohACACQQFqIQIMBgsgByEAIAUhBCAGIQMMBQsgByEAIAUhBCAGIQMMBAsgByEAIAUhBCAGIQMMAwsgByEAIAUhBCAGIQMMAgsgByEAIAUhBCAGIQMMAQsgByEAIAUhBCAGIQMLAkAgA0EXTQRAIARFDQEgBEEBayEBIARBB3EiAwRAA0AgACACLQAAOgAAIARBAWshBCAAQQFqIQAgAkEBaiECIANBAWsiAw0ACwsgAUEHSQ0BA0AgACACLQAAOgAAIAAgAi0AAToAASAAIAItAAI6AAIgACACLQADOgADIAAgAi0ABDoABCAAIAItAAU6AAUgACACLQAGOgAGIAAgAi0ABzoAByAAQQhqIQAgAkEIaiECIARBCGsiBA0ACwwBCyAAIAEgBBBWIQALIAALBABBCAsIAEEBQQwQMAuMCgIHfwF+AkADQAJAAn8CQCAAKAI8QYUCSw0AIAAQKQJAIAAoAjwiAkGFAksNACABDQBBAA8LIAJFDQIgAkEDTw0AQQAMAQsgACAAKAJkQcSYASgCABEBAAshAyAAIAAoAmg7AVxBAiECAkAgADUCZCADrX0iCUIBUw0AIAkgACgCMEGGAmutVQ0AIAAoAmwgACgCdE8NACADRQ0AIAAgA0HYmAEoAgARAQAiAkEFSw0AQQIgAiAAKAJ8QQFGGyECCwJAIAAoAmwiA0EDSQ0AIAIgA0sNACAAIAAoApQtIgJBAWo2ApQtIAAoAjwhBCACIAAoApAtaiAAKAJkIgYgAC8BXEF/c2oiAjoAACAAIAAoApQtIgVBAWo2ApQtIAUgACgCkC1qIAJBCHY6AAAgACAAKAKULSIFQQFqNgKULSAFIAAoApAtaiADQQNrOgAAIAAgACgCpC1BAWo2AqQtIANBzekAai0AAEECdCAAakGMCWoiAyADLwEAQQFqOwEAIAAgAkEBayICIAJBB3ZBgAJqIAJBgAJJG0HQ5QBqLQAAQQJ0akH8EmoiAiACLwEAQQFqOwEAIAAgACgCPCAAKAJsIgNBAWsiBWs2AjwgACgCmC0hByAAKAKULSEIIAQgBmpBA2siBCAAKAJkIgJLBEAgACACQQFqIAQgAmsiAiADQQJrIgMgAiADSRtBwJgBKAIAEQcAIAAoAmQhAgsgAEEANgJgIABBADYCbCAAIAIgBWoiBDYCZCAHIAhHDQJBACECIAAgACgCVCIDQQBOBH8gACgCSCADagVBAAsgBCADa0EAEA8gACAAKAJkNgJUIAAoAgAQDCAAKAIAKAIQDQIMAwsgACgCYARAIAAoAmQgACgCSGpBAWstAAAhAyAAIAAoApQtIgRBAWo2ApQtIAQgACgCkC1qQQA6AAAgACAAKAKULSIEQQFqNgKULSAEIAAoApAtakEAOgAAIAAgACgClC0iBEEBajYClC0gBCAAKAKQLWogAzoAACAAIANBAnRqIgMgAy8BiAFBAWo7AYgBIAAoApQtIAAoApgtRgRAIAAgACgCVCIDQQBOBH8gACgCSCADagVBAAsgACgCZCADa0EAEA8gACAAKAJkNgJUIAAoAgAQDAsgACACNgJsIAAgACgCZEEBajYCZCAAIAAoAjxBAWs2AjwgACgCACgCEA0CQQAPBSAAQQE2AmAgACACNgJsIAAgACgCZEEBajYCZCAAIAAoAjxBAWs2AjwMAgsACwsgACgCYARAIAAoAmQgACgCSGpBAWstAAAhAiAAIAAoApQtIgNBAWo2ApQtIAMgACgCkC1qQQA6AAAgACAAKAKULSIDQQFqNgKULSADIAAoApAtakEAOgAAIAAgACgClC0iA0EBajYClC0gAyAAKAKQLWogAjoAACAAIAJBAnRqIgIgAi8BiAFBAWo7AYgBIAAoApQtIAAoApgtRhogAEEANgJgCyAAIAAoAmQiA0ECIANBAkkbNgKoLSABQQRGBEAgACAAKAJUIgFBAE4EfyAAKAJIIAFqBUEACyADIAFrQQEQDyAAIAAoAmQ2AlQgACgCABAMQQNBAiAAKAIAKAIQGw8LIAAoApQtBEBBACECIAAgACgCVCIBQQBOBH8gACgCSCABagVBAAsgAyABa0EAEA8gACAAKAJkNgJUIAAoAgAQDCAAKAIAKAIQRQ0BC0EBIQILIAILxg4CD38BfgNAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACfwJAAkAgACgCPEGFAk0EQCAAECkgACgCPCIDQYUCSw0BIAENAUEADwsgCCEFIAYhBCALIQ0gCUH//wNxRQ0BDAMLIANFDQdBACADQQNJDQEaCyAAIAAoAmRBxJgBKAIAEQEACyECIAAoAmQiBa0gAq19IhFCAVMNASARIAAoAjBBhgJrrVUNASACRQ0BQQEgACACQdiYASgCABEBACIDIANB//8DcUEDSRtBASAAKAJoIg1B//8DcSAFQf//A3FJGyEJIAUhBAsgACgCPCICIAlB//8DcSIKQQNqSw0BIAkhAyAEIQUMAwtBASEKQQAhDUEBIQMgACgCPEEESw0BQQAhCQwHCwJ/AkAgCUH//wNxQQJNBEBBASAJQQFrQf//A3EiB0UNAhogBUH//wNxIgMgBEEBakH//wNxIgVLDQEgACAFIAcgAyAFa0EBaiAFIAdqIANLG0HAmAEoAgARBwAMAQsCQCAAKAJ0QQR0IApJDQAgAkEDSQ0AIAlBAWtB//8DcSIDIARBAWpB//8DcSICaiEHIAIgBUH//wNxIgxPBEBBwJgBKAIAIQUgByAMSwRAIAAgAiADIAURBwAMAwsgACACIAwgAmtBAWogBREHAAwCCyAHIAxNDQEgACAMIAcgDGtBwJgBKAIAEQcADAELIAQgCWpB//8DcSIDRQ0AIAAgA0EBa0HEmAEoAgARAQAaCyAJCyEDIAQhBQsgACgCPCECC0EAIQkgAkGHAkkNAyAKIAVB//8DcSIQaiIEIAAoAkRBhgJrTw0DIAAgBDYCZEEAIQsgACAEQcSYASgCABEBACEGIAAoAmQiCK0gBq19IhFCAVMNASARIAAoAjBBhgJrrVUNASAGRQ0BIAAgBkHYmAEoAgARAQAhCSAALwFoIgsgCEH//wNxIgJPDQEgCUH//wNxIgdBA0kNASAIIANB//8DcUECSQ0CGiAIIAogC0EBaksNAhogCCAKIAJBAWpLDQIaIAggACgCSCIEIAprQQFqIgYgC2otAAAgAiAGai0AAEcNAhogCCAEQQFrIgYgC2oiDi0AACACIAZqIg8tAABHDQIaIAggAiAIIAAoAjBBhgJrIgZrQf//A3FBACACIAZLGyIMTQ0CGiAIIAdB/wFLDQIaIAkhBiAIIQogAyECIAggCyIHQQJJDQIaA0ACQCACQQFrIQIgBkEBaiEEIAdBAWshByAKQQFrIQogDkEBayIOLQAAIA9BAWsiDy0AAEcNACACQf//A3FFDQAgDCAKQf//A3FPDQAgBkH//wNxQf4BSw0AIAQhBiAHQf//A3FBAUsNAQsLIAggAkH//wNxQQFLDQIaIAggBEH//wNxQQJGDQIaIAhBAWohCCACIQMgBCEJIAchCyAKDAILIAAgACgCZCIGQQIgBkECSRs2AqgtIAFBBEYEQEEAIQIgACAAKAJUIgFBAE4EfyAAKAJIIAFqBUEACyAGIAFrQQEQDyAAIAAoAmQ2AlQgACgCABAMQQNBAiAAKAIAKAIQGw8LIAAoApQtBEBBACEEQQAhAiAAIAAoAlQiAUEATgR/IAAoAkggAWoFQQALIAYgAWtBABAPIAAgACgCZDYCVCAAKAIAEAwgACgCACgCEEUNBwtBASEEDAYLQQEhCSAICyEGIAAgEDYCZAsgA0H//wNxIgJBAksNASADQf//A3FFDQQLIAAoApQtIQJBACEEIAMhDQNAIAAoAkggBUH//wNxai0AACEKIAAgAkEBajYClC0gACgCkC0gAmpBADoAACAAIAAoApQtIgdBAWo2ApQtIAcgACgCkC1qQQA6AAAgACAAKAKULSIHQQFqNgKULSAHIAAoApAtaiAKOgAAIAAgCkECdGoiB0GIAWogBy8BiAFBAWo7AQAgACAAKAI8QQFrNgI8IAVBAWohBSAEIAAoApQtIgIgACgCmC1GaiEEIA1BAWsiDUH//wNxDQALIANB//8DcSECDAELIAAgACgClC0iBEEBajYClC0gBCAAKAKQLWogBUH//wNxIA1B//8DcWsiBDoAACAAIAAoApQtIgVBAWo2ApQtIAUgACgCkC1qIARBCHY6AAAgACAAKAKULSIFQQFqNgKULSAFIAAoApAtaiADQQNrOgAAIAAgACgCpC1BAWo2AqQtIAJBzekAai0AAEECdCAAakGMCWoiAyADLwEAQQFqOwEAIAAgBEEBayIDIANBB3ZBgAJqIANBgAJJG0HQ5QBqLQAAQQJ0akH8EmoiAyADLwEAQQFqOwEAIAAgACgCPCACazYCPCAAKAKULSAAKAKYLUYhBAsgACAAKAJkIAJqIgM2AmQgBEUNAUEAIQRBACECIAAgACgCVCIFQQBOBH8gACgCSCAFagVBAAsgAyAFa0EAEA8gACAAKAJkNgJUIAAoAgAQDCAAKAIAKAIQDQELCyAEC7QHAgR/AX4CQANAAkACQAJAAkAgACgCPEGFAk0EQCAAECkCQCAAKAI8IgJBhQJLDQAgAQ0AQQAPCyACRQ0EIAJBA0kNAQsgACAAKAJkQcSYASgCABEBACECIAA1AmQgAq19IgZCAVMNACAGIAAoAjBBhgJrrVUNACACRQ0AIAAgAkHYmAEoAgARAQAiAkEDSQ0AIAAgACgClC0iA0EBajYClC0gAyAAKAKQLWogACgCZCAAKAJoayIDOgAAIAAgACgClC0iBEEBajYClC0gBCAAKAKQLWogA0EIdjoAACAAIAAoApQtIgRBAWo2ApQtIAQgACgCkC1qIAJBA2s6AAAgACAAKAKkLUEBajYCpC0gAkHN6QBqLQAAQQJ0IABqQYwJaiIEIAQvAQBBAWo7AQAgACADQQFrIgMgA0EHdkGAAmogA0GAAkkbQdDlAGotAABBAnRqQfwSaiIDIAMvAQBBAWo7AQAgACAAKAI8IAJrIgU2AjwgACgCmC0hAyAAKAKULSEEIAAoAnQgAk9BACAFQQJLGw0BIAAgACgCZCACaiICNgJkIAAgAkEBa0HEmAEoAgARAQAaIAMgBEcNBAwCCyAAKAJIIAAoAmRqLQAAIQIgACAAKAKULSIDQQFqNgKULSADIAAoApAtakEAOgAAIAAgACgClC0iA0EBajYClC0gAyAAKAKQLWpBADoAACAAIAAoApQtIgNBAWo2ApQtIAMgACgCkC1qIAI6AAAgACACQQJ0aiICQYgBaiACLwGIAUEBajsBACAAIAAoAjxBAWs2AjwgACAAKAJkQQFqNgJkIAAoApQtIAAoApgtRw0DDAELIAAgACgCZEEBaiIFNgJkIAAgBSACQQFrIgJBwJgBKAIAEQcAIAAgACgCZCACajYCZCADIARHDQILQQAhA0EAIQIgACAAKAJUIgRBAE4EfyAAKAJIIARqBUEACyAAKAJkIARrQQAQDyAAIAAoAmQ2AlQgACgCABAMIAAoAgAoAhANAQwCCwsgACAAKAJkIgRBAiAEQQJJGzYCqC0gAUEERgRAQQAhAiAAIAAoAlQiAUEATgR/IAAoAkggAWoFQQALIAQgAWtBARAPIAAgACgCZDYCVCAAKAIAEAxBA0ECIAAoAgAoAhAbDwsgACgClC0EQEEAIQNBACECIAAgACgCVCIBQQBOBH8gACgCSCABagVBAAsgBCABa0EAEA8gACAAKAJkNgJUIAAoAgAQDCAAKAIAKAIQRQ0BC0EBIQMLIAMLpRECC38CfiABQQRGIQcgACgCLCECAkACQAJAIAFBBEYEQCACQQJGDQIgAgRAQQAhAiAAQQAQPyAAQQA2AiwgACAAKAJkNgJUIAAoAgAQDCAAKAIAKAIQRQ0ECyAAIAcQPiAAQQI2AiwMAQsgAg0BIAAoAjxFDQEgACAHED4gAEEBNgIsCyAAIAAoAmQ2AlQLQQJBASABQQRGGyELIABB5ABqIQwgAEE8aiEKA0ACQCAAKAIMIAAoAhBBCGpLDQAgACgCABAMIAAoAgAiBCgCEA0AQQAhAiABQQRHDQIgBCgCBA0CIAAoAsAtDQIgACgCLEVBAXQPCwJAAkACQCAKKAIAQYUCTQRAIAAQKQJAIAAoAjwiAkGFAksNACABDQBBAA8LIAJFDQIgACgCLAR/IAIFIAAgBxA+IAAgCzYCLCAAIAAoAmQ2AlQgACgCPAtBA0kNAQsgACAAKAJkQcSYASgCABEBACECIAAoAmQiBK0gAq19Ig1CAVMNACANIAAoAjBBhgJrrVUNACAEIAAoAkgiBGogAiAEakHUmAEoAgARAQAiAkEDSQ0AIAAoAjwiBCACIAIgBEsbIgZBzekAai0AACIDQQJ0IgRB1OMAajMBACEOIARB1uMAai8BACECIANBCGtBE00EQCAGQQNrIARB0OsAaigCAGutIAKthiAOhCEOIARB0NgAaigCACACaiECCyAAKALALSEFIAIgDadBAWsiCCAIQQd2QYACaiAIQYACSRtB0OUAai0AACIEQQJ0IglB0uQAai8BAGohAyAJQdDkAGozAQAgAq2GIA6EIQ4gACkDuC0hDQJAIAUgBEEESQR/IAMFIAggCUHQ7ABqKAIAa60gA62GIA6EIQ4gCUHQ2QBqKAIAIANqCyIEaiICQT9NBEAgDiAFrYYgDYQhDgwBCyAFQcAARgRAIAAoAgQhAiAAIAAoAhAiA0EBajYCECACIANqIA08AAAgACgCBCECIAAgACgCECIDQQFqNgIQIAIgA2ogDUIIiDwAACAAKAIEIQIgACAAKAIQIgNBAWo2AhAgAiADaiANQhCIPAAAIAAoAgQhAiAAIAAoAhAiA0EBajYCECACIANqIA1CGIg8AAAgACgCBCECIAAgACgCECIDQQFqNgIQIAIgA2ogDUIgiDwAACAAKAIEIQIgACAAKAIQIgNBAWo2AhAgAiADaiANQiiIPAAAIAAoAgQhAiAAIAAoAhAiA0EBajYCECACIANqIA1CMIg8AAAgACgCBCECIAAgACgCECIDQQFqNgIQIAIgA2ogDUI4iDwAACAEIQIMAQsgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogDiAFrYYgDYQiDTwAACAAKAIEIQQgACAAKAIQIgNBAWo2AhAgAyAEaiANQgiIPAAAIAAoAgQhBCAAIAAoAhAiA0EBajYCECADIARqIA1CEIg8AAAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogDUIYiDwAACAAKAIEIQQgACAAKAIQIgNBAWo2AhAgAyAEaiANQiCIPAAAIAAoAgQhBCAAIAAoAhAiA0EBajYCECADIARqIA1CKIg8AAAgACgCBCEEIAAgACgCECIDQQFqNgIQIAMgBGogDUIwiDwAACAAKAIEIQQgACAAKAIQIgNBAWo2AhAgAyAEaiANQjiIPAAAIAJBQGohAiAOQcAAIAVrrYghDgsgACAONwO4LSAAIAI2AsAtIAAgACgCPCAGazYCPCAMIQIMAgsgACgCSCAAKAJkai0AAEECdCICQdDbAGozAQAhDiAAKQO4LSENAkAgACgCwC0iAyACQdLbAGovAQAiBGoiAkE/TQRAIA4gA62GIA2EIQ4MAQsgA0HAAEYEQCAAKAIEIQIgACAAKAIQIgNBAWo2AhAgAiADaiANPAAAIAAoAgQhAiAAIAAoAhAiA0EBajYCECACIANqIA1CCIg8AAAgACgCBCECIAAgACgCECIDQQFqNgIQIAIgA2ogDUIQiDwAACAAKAIEIQIgACAAKAIQIgNBAWo2AhAgAiADaiANQhiIPAAAIAAoAgQhAiAAIAAoAhAiA0EBajYCECACIANqIA1CIIg8AAAgACgCBCECIAAgACgCECIDQQFqNgIQIAIgA2ogDUIoiDwAACAAKAIEIQIgACAAKAIQIgNBAWo2AhAgAiADaiANQjCIPAAAIAAoAgQhAiAAIAAoAhAiA0EBajYCECACIANqIA1COIg8AAAgBCECDAELIAAoAgQhBCAAIAAoAhAiBUEBajYCECAEIAVqIA4gA62GIA2EIg08AAAgACgCBCEEIAAgACgCECIFQQFqNgIQIAQgBWogDUIIiDwAACAAKAIEIQQgACAAKAIQIgVBAWo2AhAgBCAFaiANQhCIPAAAIAAoAgQhBCAAIAAoAhAiBUEBajYCECAEIAVqIA1CGIg8AAAgACgCBCEEIAAgACgCECIFQQFqNgIQIAQgBWogDUIgiDwAACAAKAIEIQQgACAAKAIQIgVBAWo2AhAgBCAFaiANQiiIPAAAIAAoAgQhBCAAIAAoAhAiBUEBajYCECAEIAVqIA1CMIg8AAAgACgCBCEEIAAgACgCECIFQQFqNgIQIAQgBWogDUI4iDwAACACQUBqIQIgDkHAACADa62IIQ4LIAAgDjcDuC0gACACNgLALSAAIAAoAmRBAWo2AmRBfyEGIAohAgwBCyAAIAAoAmQiAkECIAJBAkkbNgKoLSAAKAIsIQIgAUEERgRAAkAgAkUNACAAQQEQPyAAQQA2AiwgACAAKAJkNgJUIAAoAgAQDCAAKAIAKAIQDQBBAg8LQQMPCyACBEBBACECIABBABA/IABBADYCLCAAIAAoAmQ2AlQgACgCABAMIAAoAgAoAhBFDQMLQQEhAgwCCyACIAIoAgAgBmo2AgAMAAsACyACCwcAIAAoAiwLzgUCA34BfyMAQYBAaiIIJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAEDhECAwwFAAEECAkJCQkJCQcJBgkLIANCCFoEfiACIAEoAmQ2AgAgAiABKAJoNgIEQggFQn8LIQYMCwsgARAGDAoLIAEoAhAiAgRAIAIgASkDGCABQeQAaiICEEIiA1ANCCABKQMIIgVCf4UgA1QEQCACBEAgAkEANgIEIAJBFTYCAAsMCQsgAUEANgIQIAEgAyAFfDcDCCABIAEpAwAgA3w3AwALIAEtAHgEQCABKQMAIQUMCQtCACEDIAEpAwAiBVAEQCABQgA3AyAMCgsDQCAAIAggBSADfSIFQoDAACAFQoDAAFQbEBEiB0J/VwRAIAFB5ABqIgEEQCABIAAoAgw2AgAgASAAKAIQNgIECwwJCyAHUEUEQCABKQMAIgUgAyAHfCIDWA0KDAELCyABQeQAagRAIAFBADYCaCABQRE2AmQLDAcLIAEpAwggASkDICIFfSIHIAMgAyAHVhsiA1ANCAJAIAEtAHhFDQAgACAFQQAQFUF/Sg0AIAFB5ABqIgEEQCABIAAoAgw2AgAgASAAKAIQNgIECwwHCyAAIAIgAxARIgZCf1cEQCABQeQAagRAIAFBADYCaCABQRE2AmQLDAcLIAEgASkDICAGfCIDNwMgIAZCAFINCEIAIQYgAyABKQMIWg0IIAFB5ABqBEAgAUEANgJoIAFBETYCZAsMBgsgASkDICABKQMAIgV9IAEpAwggBX0gAiADIAFB5ABqEEUiA0IAUw0FIAEgASkDACADfDcDIAwHCyACIAFBKGoQY0EfdawhBgwGCyABMABgIQYMBQsgASkDcCEGDAQLIAEpAyAgASkDAH0hBgwDCyABQeQAagRAIAFBADYCaCABQRw2AmQLC0J/IQYMAQsgASAFNwMgCyAIQYBAayQAIAYLDwAgACAAKAIwQQFqNgIwCwcAIAAoAigLBwAgACgCGAsHACAAQQxqCwcAIAAoAhALBwAgACgCCAtFAEHgmwFCADcDAEHYmwFCADcDAEHQmwFCADcDAEHImwFCADcDAEHAmwFCADcDAEG4mwFCADcDAEGwmwFCADcDAEGwmwELFAAgACABrSACrUIghoQgAyAEEFMLEwEBfiAAEDIiAUIgiKcQACABpwtvAQF+IAGtIAKtQiCGhCEFIwBBEGsiASQAAn8gAEUEQCAFUEUEQCAEBEAgBEEANgIEIARBEjYCAAtBAAwCC0EAQgAgAyAEEDkMAQsgASAFNwMIIAEgADYCACABQgEgAyAEEDkLIQAgAUEQaiQAIAALFAAgACABIAKtIAOtQiCGhCAEEFIL2gICAn8BfgJ/IAGtIAKtQiCGhCIHIAApAzBUQQAgBEEKSRtFBEAgAEEIagRAIABBADYCDCAAQRI2AggLQX8MAQsgAC0AGEECcQRAIABBCGoEQCAAQQA2AgwgAEEZNgIIC0F/DAELIAMEfyADQf//A3FBCEYgA0F9S3IFQQELRQRAIABBCGoEQCAAQQA2AgwgAEEQNgIIC0F/DAELIAAoAkAiASAHpyIFQQR0aigCACICBH8gAigCECADRgUgA0F/RgshBiABIAVBBHRqIgEhBSABKAIEIQECQCAGBEAgAUUNASABQQA7AVAgASABKAIAQX5xIgA2AgAgAA0BIAEQICAFQQA2AgRBAAwCCwJAIAENACAFIAIQKyIBNgIEIAENACAAQQhqBEAgAEEANgIMIABBDjYCCAtBfwwCCyABIAQ7AVAgASADNgIQIAEgASgCAEEBcjYCAAtBAAsLFwEBfiAAIAEgAhBPIgNCIIinEAAgA6cLHwEBfiAAIAEgAq0gA61CIIaEEBEiBEIgiKcQACAEpwteAQF+An5CfyAARQ0AGiAAKQMwIgIgAUEIcUUNABpCACACUA0AGiAAKAJAIQADQCACIAKnQQR0IABqQRBrKAIADQEaIAJCAX0iAkIAUg0AC0IACyICQiCIpxAAIAKnCxMAIAAgAa0gAq1CIIaEIAMQiAELnwEBAn4CfiACrSADrUIghoQhBUJ/IQQCQCAARQ0AIAAoAgQNACAAQQRqIQIgBUJ/VwRAIAIEQCACQQA2AgQgAkESNgIAC0J/DAILQgAhBCAALQAQDQAgBVANACAAKAIUIAEgBRARIgRCf1UNACAAKAIUIQAgAgRAIAIgACgCDDYCACACIAAoAhA2AgQLQn8hBAsgBAsiBEIgiKcQACAEpwsYACAAIAGtIAKtQiCGhCADIAAoAhwQggELsQICAX8BfgJ/QX8hBAJAIAAgAa0gAq1CIIaEIgZBAEEAECZFDQAgAC0AGEECcQRAIABBCGoEQCAAQQA2AgwgAEEZNgIIC0F/DAILIAAoAkAiASAGpyICQQR0aiIEKAIIIgUEQEEAIQQgBSADEElBf0oNASAAQQhqBEAgAEEANgIMIABBDzYCCAtBfwwCCwJAIAQoAgAiBQRAIAUoAhQgA0YNAQsCQCABIAJBBHRqIgEoAgQiBA0AIAEgBRArIgQ2AgQgBA0AIABBCGoEQCAAQQA2AgwgAEEONgIIC0F/DAMLIAQgAzYCFCAEIAQoAgBBIHI2AgBBAAwCC0EAIQQgASACQQR0aiIBKAIEIgBFDQAgACAAKAIAQV9xIgI2AgAgAg0AIAAQICABQQA2AgQLIAQLCxQAIAAgAa0gAq1CIIaEIAQgBRB3CxIAIAAgAa0gAq1CIIaEIAMQFQtBAQF+An4gAUEAIAIbRQRAIABBCGoEQCAAQQA2AgwgAEESNgIIC0J/DAELIAAgASACIAMQeAsiBEIgiKcQACAEpwvGAwIFfwF+An4CQAJAIAAiBC0AGEECcQRAIARBCGoEQCAEQQA2AgwgBEEZNgIICwwBCyABRQRAIARBCGoEQCAEQQA2AgwgBEESNgIICwwBCyABECIiByABakEBay0AAEEvRwRAIAdBAmoQCCIARQRAIARBCGoEQCAEQQA2AgwgBEEONgIICwwCCwJAAkAgACIGIAEiBXNBA3ENACAFQQNxBEADQCAGIAUtAAAiAzoAACADRQ0DIAZBAWohBiAFQQFqIgVBA3ENAAsLIAUoAgAiA0F/cyADQYGChAhrcUGAgYKEeHENAANAIAYgAzYCACAFKAIEIQMgBkEEaiEGIAVBBGohBSADQYGChAhrIANBf3NxQYCBgoR4cUUNAAsLIAYgBS0AACIDOgAAIANFDQADQCAGIAUtAAEiAzoAASAGQQFqIQYgBUEBaiEFIAMNAAsLIAcgACIDakEvOwAACyAEQQBCAEEAEFIiAEUEQCADEAYMAQsgBCADIAEgAxsgACACEHghCCADEAYgCEJ/VwRAIAAQCiAIDAMLIAQgCEEDQYCA/I8EEHdBf0oNASAEIAgQdhoLQn8hCAsgCAsiCEIgiKcQACAIpwsQACAAIAGtIAKtQiCGhBB2CxYAIAAgAa0gAq1CIIaEIAMgBCAFEGoLJQEBfiAAIAEgAhBPIgNCAFMEQEEADwsgACADIAIgACgCHBCCAQvgIwMPfwh+AXwjAEHwAGsiCSQAAkAgAUEATkEAIAAbRQRAIAIEQCACQQA2AgQgAkESNgIACwwBCyAAKQMYIhICfkGgmwEpAwAiE0J/UQRAIAlCg4CAgHA3AzAgCUKGgICA8AA3AyggCUKBgICAIDcDIEGgmwFBACAJQSBqECQ3AwAgCUKPgICAcDcDECAJQomAgICgATcDACAJQoyAgIDQATcDCEGomwFBCCAJECQ3AwBBoJsBKQMAIRMLIBMLgyATUgRAIAIEQCACQQA2AgQgAkEcNgIACwwBCyABIAFBEHJBqJsBKQMAIhMgEoMgE1EbIgpBGHFBGEYEQCACBEAgAkEANgIEIAJBGTYCAAsMAQsgCUE4ahAqAkAgACAJQThqECEEQAJAIAAoAgxBBUYEQCAAKAIQQSxGDQELIAIEQCACIAAoAgw2AgAgAiAAKAIQNgIECwwCCyAKQQFxRQRAIAIEQCACQQA2AgQgAkEJNgIACwwDCyACEEsiBUUNASAFIAo2AgQgBSAANgIAIApBEHFFDQIgBSAFKAIUQQJyNgIUIAUgBSgCGEECcjYCGAwCCyAKQQJxBEAgAgRAIAJBADYCBCACQQo2AgALDAILIAAQMUF/TARAIAIEQCACIAAoAgw2AgAgAiAAKAIQNgIECwwBCwJ/IApBCHEEQAJAIAIQSyIBRQ0AIAEgCjYCBCABIAA2AgAgCkEQcUUNACABIAEoAhRBAnI2AhQgASABKAIYQQJyNgIYCyABDAELIwBBQGoiDiQAIA5BCGoQKgJAIAAgDkEIahAhQX9MBEAgAgRAIAIgACgCDDYCACACIAAoAhA2AgQLDAELIA4tAAhBBHFFBEAgAgRAIAJBigE2AgQgAkEENgIACwwBCyAOKQMgIRMgAhBLIgVFBEBBACEFDAELIAUgCjYCBCAFIAA2AgAgCkEQcQRAIAUgBSgCFEECcjYCFCAFIAUoAhhBAnI2AhgLAkACQAJAIBNQBEACfyAAIQECQANAIAEpAxhCgIAQg0IAUg0BIAEoAgAiAQ0AC0EBDAELIAFBAEIAQRIQDqcLDQQgBUEIagRAIAVBADYCDCAFQRM2AggLDAELIwBB0ABrIgEkAAJAIBNCFVgEQCAFQQhqBEAgBUEANgIMIAVBEzYCCAsMAQsCQAJAIAUoAgBCACATQqqABCATQqqABFQbIhJ9QQIQFUF/Sg0AIAUoAgAiAygCDEEERgRAIAMoAhBBFkYNAQsgBUEIagRAIAUgAygCDDYCCCAFIAMoAhA2AgwLDAELIAUoAgAQMiITQn9XBEAgBSgCACEDIAVBCGoiCARAIAggAygCDDYCACAIIAMoAhA2AgQLDAELIAUoAgAgEkEAIAVBCGoiDxAtIgRFDQEgEkKqgARaBEACQCAEKQMIQhRUBEAgBEEAOgAADAELIARCFDcDECAEQQE6AAALCyABBEAgAUEANgIEIAFBEzYCAAsgBEIAEBMhDAJAIAQtAAAEfiAEKQMIIAQpAxB9BUIAC6ciB0ESa0EDSwRAQn8hFwNAIAxBAWshAyAHIAxqQRVrIQYCQANAIANBAWoiA0HQACAGIANrEH4iA0UNASADQQFqIgxBnxJBAxA8DQALAkAgAyAEKAIEa6wiEiAEKQMIVgRAIARBADoAAAwBCyAEIBI3AxAgBEEBOgAACyAELQAABH4gBCkDEAVCAAshEgJAIAQtAAAEfiAEKQMIIAQpAxB9BUIAC0IVWARAIAEEQCABQQA2AgQgAUETNgIACwwBCyAEQgQQEygAAEHQlpUwRwRAIAEEQCABQQA2AgQgAUETNgIACwwBCwJAAkACQCASQhRUDQAgBCgCBCASp2pBFGsoAABB0JaZOEcNAAJAIBJCFH0iFCAEIgMpAwhWBEAgA0EAOgAADAELIAMgFDcDECADQQE6AAALIAUoAhQhECAFKAIAIQYgAy0AAAR+IAQpAxAFQgALIRYgBEIEEBMaIAQQCyELIAQQCyENIAQQHiIUQn9XBEAgAQRAIAFBFjYCBCABQQQ2AgALDAQLIBRCOHwiFSATIBZ8IhZWBEAgAQRAIAFBADYCBCABQRU2AgALDAQLAkACQCATIBRWDQAgFSATIAQpAwh8Vg0AAkAgFCATfSIVIAQpAwhWBEAgA0EAOgAADAELIAMgFTcDECADQQE6AAALQQAhBwwBCyAGIBRBABAVQX9MBEAgAQRAIAEgBigCDDYCACABIAYoAhA2AgQLDAULQQEhByAGQjggAUEQaiABEC0iA0UNBAsgA0IEEBMoAABB0JaZMEcEQCABBEAgAUEANgIEIAFBFTYCAAsgB0UNBCADEAcMBAsgAxAeIRUCQCAQQQRxIgZFDQAgFCAVfEIMfCAWUQ0AIAEEQCABQQA2AgQgAUEVNgIACyAHRQ0EIAMQBwwECyADQgQQExogAxAWIhAgCyALQf//A0YbIQsgAxAWIhEgDSANQf//A0YbIQ0CQCAGRQ0AIA0gEUZBACALIBBGGw0AIAEEQCABQQA2AgQgAUEVNgIACyAHRQ0EIAMQBwwECyALIA1yBEAgAQRAIAFBADYCBCABQQE2AgALIAdFDQQgAxAHDAQLIAMQHiIYIAMQHlIEQCABBEAgAUEANgIEIAFBATYCAAsgB0UNBCADEAcMBAsgAxAeIRUgAxAeIRYgAy0AAEUEQCABBEAgAUEANgIEIAFBFDYCAAsgB0UNBCADEAcMBAsgBwRAIAMQBwsCQCAWQgBZBEAgFSAWfCIZIBZaDQELIAEEQCABQRY2AgQgAUEENgIACwwECyATIBR8IhQgGVQEQCABBEAgAUEANgIEIAFBFTYCAAsMBAsCQCAGRQ0AIBQgGVENACABBEAgAUEANgIEIAFBFTYCAAsMBAsgGCAVQi6AWA0BIAEEQCABQQA2AgQgAUEVNgIACwwDCwJAIBIgBCkDCFYEQCAEQQA6AAAMAQsgBCASNwMQIARBAToAAAsgBSgCFCEDIAQtAAAEfiAEKQMIIAQpAxB9BUIAC0IVWARAIAEEQCABQQA2AgQgAUEVNgIACwwDCyAELQAABH4gBCkDEAVCAAshFCAEQgQQExogBBAWBEAgAQRAIAFBADYCBCABQQE2AgALDAMLIAQQCyAEEAsiBkcEQCABBEAgAUEANgIEIAFBEzYCAAsMAwsgBBAWIQcgBBAWrSIWIAetIhV8IhggEyAUfCIUVgRAIAEEQCABQQA2AgQgAUEVNgIACwwDCwJAIANBBHFFDQAgFCAYUQ0AIAEEQCABQQA2AgQgAUEVNgIACwwDCyAGrSABEG4iA0UNAiADIBY3AyAgAyAVNwMYIANBADoALAwBCyAYIAEQbiIDRQ0BIAMgFjcDICADIBU3AxggA0EBOgAsCwJAIBJCFHwiFCAEKQMIVgRAIARBADoAAAwBCyAEIBQ3AxAgBEEBOgAACyAEEAshBgJAIAMpAxggAykDIHwgEiATfFYNAAJAIAZFBEAgBS0ABEEEcUUNAQsCQCASQhZ8IhIgBCkDCFYEQCAEQQA6AAAMAQsgBCASNwMQIARBAToAAAsgBC0AAAR+IAQpAwggBCkDEH0FQgALIhQgBq0iElQNASAFLQAEQQRxQQAgEiAUUhsNASAGRQ0AIAMgBCASEBMgBkEAIAEQNSIGNgIoIAYNACADEBcMAgsCQCATIAMpAyAiElgEQAJAIBIgE30iEiAEKQMIVgRAIARBADoAAAwBCyAEIBI3AxAgBEEBOgAACyAEIAMpAxgQEyIGRQ0CIAYgAykDGBAYIgcNASABBEAgAUEANgIEIAFBDjYCAAsgAxAXDAMLIAUoAgAgEkEAEBUhByAFKAIAIQYgB0F/TARAIAEEQCABIAYoAgw2AgAgASAGKAIQNgIECyADEBcMAwtBACEHIAYQMiADKQMgUQ0AIAEEQCABQQA2AgQgAUETNgIACyADEBcMAgtCACEUAkACQCADKQMYIhZQRQRAA0AgFCADKQMIUiILRQRAIAMtACwNAyAWQi5UDQMCfwJAIAMpAxAiFUKAgAR8IhIgFVpBACASQoCAgIABVBtFDQAgAygCACASp0EEdBAzIgZFDQAgAyAGNgIAAkAgAykDCCIVIBJaDQAgBiAVp0EEdGoiBkIANwIAIAZCADcABSAVQgF8IhUgElENAANAIAMoAgAgFadBBHRqIgZCADcCACAGQgA3AAUgFUIBfCIVIBJSDQALCyADIBI3AwggAyASNwMQQQEMAQsgAQRAIAFBADYCBCABQQ42AgALQQALRQ0EC0HYABAIIgYEfyAGQgA3AyAgBkEANgIYIAZC/////w83AxAgBkEAOwEMIAZBv4YoNgIIIAZBAToABiAGQQA7AQQgBkEANgIAIAZCADcDSCAGQYCA2I14NgJEIAZCADcDKCAGQgA3AzAgBkIANwM4IAZBQGtBADsBACAGQgA3A1AgBgVBAAshBiADKAIAIBSnQQR0aiAGNgIAAkAgBgRAIAYgBSgCACAHQQAgARBsIhJCf1UNAQsgCw0EIAEoAgBBE0cNBCABBEAgAUEANgIEIAFBFTYCAAsMBAsgFEIBfCEUIBYgEn0iFkIAUg0ACwsgFCADKQMIUg0AAkAgBS0ABEEEcUUNACAHBEAgBy0AAAR/IAcpAxAgBykDCFEFQQALRQ0CDAELIAUoAgAQMiISQn9XBEAgBSgCACEGIAEEQCABIAYoAgw2AgAgASAGKAIQNgIECyADEBcMBQsgEiADKQMYIAMpAyB8Ug0BCyAHEAcCfiAIBEACfyAXQgBXBEAgBSAIIAEQSiEXCyAFIAMgARBKIhIgF1ULBEAgCBAXIBIMAgsgAxAXDAULQgAgBS0ABEEEcUUNABogBSADIAEQSgshFyADIQgMAwsgAQRAIAFBADYCBCABQRU2AgALIAcQByADEBcMAgsgAxAXIAcQBwwBCyABBEAgAUEANgIEIAFBFTYCAAsgAxAXCwJAIAwgBCgCBGusIhIgBCkDCFYEQCAEQQA6AAAMAQsgBCASNwMQIARBAToAAAsgBC0AAAR+IAQpAwggBCkDEH0FQgALpyIHQRJrQQNLDQELCyAEEAcgF0J/VQ0DDAELIAQQBwsgDyIDBEAgAyABKAIANgIAIAMgASgCBDYCBAsgCBAXC0EAIQgLIAFB0ABqJAAgCA0BCyACBEAgAiAFKAIINgIAIAIgBSgCDDYCBAsMAQsgBSAIKAIANgJAIAUgCCkDCDcDMCAFIAgpAxA3AzggBSAIKAIoNgIgIAgQBiAFKAJQIQggBUEIaiIEIQFBACEHAkAgBSkDMCITUA0AQYCAgIB4IQYCfyATukQAAAAAAADoP6NEAADg////70GkIhpEAAAAAAAA8EFjIBpEAAAAAAAAAABmcQRAIBqrDAELQQALIgNBgICAgHhNBEAgA0EBayIDQQF2IANyIgNBAnYgA3IiA0EEdiADciIDQQh2IANyIgNBEHYgA3JBAWohBgsgBiAIKAIAIgxNDQAgBkEEEDAiC0UEQCABBEAgAUEANgIEIAFBDjYCAAsMAQsCQCAIKQMIQgAgDBtQBEAgCCgCECEPDAELIAgoAhAhDwNAIA8gB0ECdGooAgAiAQRAA0AgASgCGCEDIAEgCyABKAIcIAZwQQJ0aiINKAIANgIYIA0gATYCACADIgENAAsLIAdBAWoiByAMRw0ACwsgDxAGIAggBjYCACAIIAs2AhALAkAgBSkDMFANAEIAIRMCQCAKQQRxRQRAA0AgBSgCQCATp0EEdGooAgAoAjBBAEEAIAIQJSIBRQ0EIAUoAlAgASATQQggBBBQRQRAIAQoAgBBCkcNAwsgE0IBfCITIAUpAzBUDQAMAwsACwNAIAUoAkAgE6dBBHRqKAIAKAIwQQBBACACECUiAUUNAyAFKAJQIAEgE0EIIAQQUEUNASATQgF8IhMgBSkDMFQNAAsMAQsgAgRAIAIgBCgCADYCACACIAQoAgQ2AgQLDAELIAUgBSgCFDYCGAwBCyAAIAAoAjBBAWo2AjAgBRBNQQAhBQsgDkFAayQAIAULIgUNASAAEBsaC0EAIQULIAlB8ABqJAAgBQsQACMAIABrQXBxIgAkACAACwYAIAAkAAsEACMACwgAQQFBOBAwCyEBAX4gACABIAIQTyIEQgBTBEBBfw8LIAAgBCACIAMQUwvjKgMRfwh+A3wjAEHAwABrIgckAEF/IQICQCAARQ0AAn8gAC0AKEUEQEEAIAAoAhggACgCFEYNARoLQQELIQECQAJAIAApAzAiFFBFBEAgACgCQCEKA0AgCiASp0EEdGoiAy0ADCELAkACQCADKAIIDQAgCw0AIAMoAgQiA0UNASADKAIARQ0BC0EBIQELIBcgC0EBc61C/wGDfCEXIBJCAXwiEiAUUg0ACyAXQgBSDQELIAAoAgRBCHEgAXJFDQECfyAAKAIAIgMoAiQiAUEDRwRAIAMoAiAEf0F/IAMQG0EASA0CGiADKAIkBSABCwRAIAMQRAtBfyADQQBCAEEPEA5CAFMNARogA0EDNgIkC0EAC0F/Sg0BIAAoAgAoAgxBFkYEQCAAKAIAKAIQQSxGDQILIAAoAgAhASAAQQhqBEAgACABKAIMNgIIIAAgASgCEDYCDAsMAgsgAUUNACAUIBdUBEAgAEEIagRAIABBADYCDCAAQRQ2AggLDAILIBenQQN0EAgiC0UNAUJ/IRZCACESA0ACQCAKIBKnQQR0aiIGKAIAIgNFDQACQCAGKAIIDQAgBi0ADA0AIAYoAgQiAUUNASABKAIARQ0BCyAWIAMpA0giEyATIBZWGyEWCyAGLQAMRQRAIBcgGVgEQCALEAYgAEEIagRAIABBADYCDCAAQRQ2AggLDAQLIAsgGadBA3RqIBI3AwAgGUIBfCEZCyASQgF8IhIgFFINAAsgFyAZVgRAIAsQBiAAQQhqBEAgAEEANgIMIABBFDYCCAsMAgsCQAJAIAAoAgApAxhCgIAIg1ANAAJAAkAgFkJ/Ug0AIAApAzAiE1ANAiATQgGDIRUgACgCQCEDAkAgE0IBUQRAQn8hFEIAIRJCACEWDAELIBNCfoMhGUJ/IRRCACESQgAhFgNAIAMgEqdBBHRqKAIAIgEEQCAWIAEpA0giEyATIBZUIgEbIRYgFCASIAEbIRQLIAMgEkIBhCIYp0EEdGooAgAiAQRAIBYgASkDSCITIBMgFlQiARshFiAUIBggARshFAsgEkICfCESIBlCAn0iGVBFDQALCwJAIBVQDQAgAyASp0EEdGooAgAiAUUNACAWIAEpA0giEyATIBZUIgEbIRYgFCASIAEbIRQLIBRCf1ENAEIAIRMjAEEQayIGJAACQCAAIBQgAEEIaiIIEEIiFVANACAVIAAoAkAgFKdBBHRqKAIAIgopAyAiGHwiFCAYWkEAIBRCf1UbRQRAIAgEQCAIQRY2AgQgCEEENgIACwwBCyAKLQAMQQhxRQRAIBQhEwwBCyAAKAIAIBRBABAVIQEgACgCACEDIAFBf0wEQCAIBEAgCCADKAIMNgIAIAggAygCEDYCBAsMAQsgAyAGQQxqQgQQEUIEUgRAIAAoAgAhASAIBEAgCCABKAIMNgIAIAggASgCEDYCBAsMAQsgFEIEfCAUIAYoAAxB0JadwABGG0IUQgwCf0EBIQECQCAKKQMoQv7///8PVg0AIAopAyBC/v///w9WDQBBACEBCyABCxt8IhRCf1cEQCAIBEAgCEEWNgIEIAhBBDYCAAsMAQsgFCETCyAGQRBqJAAgEyIWQgBSDQEgCxAGDAULIBZQDQELAn8gACgCACIBKAIkQQFGBEAgAUEMagRAIAFBADYCECABQRI2AgwLQX8MAQtBfyABQQAgFkEREA5CAFMNABogAUEBNgIkQQALQX9KDQELQgAhFgJ/IAAoAgAiASgCJEEBRgRAIAFBDGoEQCABQQA2AhAgAUESNgIMC0F/DAELQX8gAUEAQgBBCBAOQgBTDQAaIAFBATYCJEEAC0F/Sg0AIAAoAgAhASAAQQhqBEAgACABKAIMNgIIIAAgASgCEDYCDAsgCxAGDAILIAAoAlQiAgRAIAJCADcDGCACKAIARAAAAAAAAAAAIAIoAgwgAigCBBEOAAsgAEEIaiEEIBe6IRxCACEUAkACQAJAA0AgFyAUIhNSBEAgE7ogHKMhGyATQgF8IhS6IByjIRoCQCAAKAJUIgJFDQAgAiAaOQMoIAIgGzkDICACKwMQIBogG6FEAAAAAAAAAACiIBugIhogAisDGKFjRQ0AIAIoAgAgGiACKAIMIAIoAgQRDgAgAiAaOQMYCwJ/AkAgACgCQCALIBOnQQN0aikDACITp0EEdGoiDSgCACIBBEAgASkDSCAWVA0BCyANKAIEIQUCQAJ/AkAgDSgCCCICRQRAIAVFDQFBASAFKAIAIgJBAXENAhogAkHAAHFBBnYMAgtBASAFDQEaCyANIAEQKyIFNgIEIAVFDQEgAkEARwshBkEAIQkjAEEQayIMJAACQCATIAApAzBaBEAgAEEIagRAIABBADYCDCAAQRI2AggLQX8hCQwBCyAAKAJAIgogE6ciA0EEdGoiDygCACICRQ0AIAItAAQNAAJAIAIpA0hCGnwiGEJ/VwRAIABBCGoEQCAAQRY2AgwgAEEENgIICwwBC0F/IQkgACgCACAYQQAQFUF/TARAIAAoAgAhAiAAQQhqBEAgACACKAIMNgIIIAAgAigCEDYCDAsMAgsgACgCAEIEIAxBDGogAEEIaiIOEC0iEEUNASAQEAshASAQEAshCCAQLQAABH8gECkDECAQKQMIUQVBAAshAiAQEAcgAkUEQCAOBEAgDkEANgIEIA5BFDYCAAsMAgsCQCAIRQ0AIAAoAgAgAa1BARAVQX9MBEBB+JsBKAIAIQIgDgRAIA4gAjYCBCAOQQQ2AgALDAMLQQAgACgCACAIQQAgDhBGIgFFDQEgASAIQYACIAxBCGogDhByIQIgARAGIAJFDQEgDCgCCCICRQ0AIAwgAhBxIgI2AgggDygCACgCNCACEHMhAiAPKAIAIAI2AjQLIA8oAgAiAkEBOgAEQQAhCSAKIANBBHRqKAIEIgFFDQEgAS0ABA0BIAIoAjQhAiABQQE6AAQgASACNgI0DAELQX8hCQsgDEEQaiQAIAlBAEgNBSAAKAIAEB8iGEIAUw0FIAUgGDcDSCAGBEBBACEMIA0oAggiDSEBIA1FBEAgACAAIBNBCEEAEIMBIgwhASAMRQ0HCwJAAkAgASAHQQhqECFBf0wEQCAEBEAgBCABKAIMNgIAIAQgASgCEDYCBAsMAQsgBykDCCISQsAAg1AEQCAHQQA7ATggByASQsAAhCISNwMICwJAAkAgBSgCECICQX5PBEAgBy8BOCIDRQ0BIAUgAzYCECADIQIMAgsgAg0AIBJCBINQDQAgByAHKQMgNwMoIAcgEkIIhCISNwMIQQAhAgwBCyAHIBJC9////w+DIhI3AwgLIBJCgAGDUARAIAdBADsBOiAHIBJCgAGEIhI3AwgLAn8gEkIEg1AEQEJ/IRVBgAoMAQsgBSAHKQMgIhU3AyggEkIIg1AEQAJAAkACQAJAQQggAiACQX1LG0H//wNxDg0CAwMDAwMDAwEDAwMAAwtBgApBgAIgFUKUwuTzD1YbDAQLQYAKQYACIBVCg4Ow/w9WGwwDC0GACkGAAiAVQv////8PVhsMAgtBgApBgAIgFUIAUhsMAQsgBSAHKQMoNwMgQYACCyEPIAAoAgAQHyITQn9XBEAgACgCACECIAQEQCAEIAIoAgw2AgAgBCACKAIQNgIECwwBCyAFIAUvAQxB9/8DcTsBDCAAIAUgDxA3IgpBAEgNACAHLwE4IghBCCAFKAIQIgMgA0F9SxtB//8DcSICRyEGAkACQAJAAkACQAJAAkAgAiAIRwRAIANBAEchAwwBC0EAIQMgBS0AAEGAAXFFDQELIAUvAVIhCSAHLwE6IQIMAQsgBS8BUiIJIAcvAToiAkYNAQsgASABKAIwQQFqNgIwIAJB//8DcQ0BIAEhAgwCCyABIAEoAjBBAWo2AjBBACEJDAILQSVBACAHLwE6QQFGGyICRQRAIAQEQCAEQQA2AgQgBEEYNgIACyABEAoMAwsgACABIAcvATpBACAAKAIcIAIRCAAhAiABEAogAkUNAgsgCUEARyEJIAhBAEcgBnFFBEAgAiEBDAELIAAgAiAHLwE4EIUBIQEgAhAKIAFFDQELAkAgCEUgBnJFBEAgASECDAELIAAgAUEAEIQBIQIgARAKIAJFDQELAkAgA0UEQCACIQMMAQsgACACIAUoAhBBASAFLwFQEIYBIQMgAhAKIANFDQELAkAgCUUEQCADIQEMAQsgBSgCVCIBRQRAIAAoAhwhAQsCfyAFLwFSGkEBCwRAIAQEQCAEQQA2AgQgBEEYNgIACyADEAoMAgsgACADIAUvAVJBASABQQARCAAhASADEAogAUUNAQsgACgCABAfIhhCf1cEQCAAKAIAIQIgBARAIAQgAigCDDYCACAEIAIoAhA2AgQLDAELAkAgARAxQQBOBEACfwJAAkAgASAHQUBrQoDAABARIhJCAVMNAEIAIRkgFUIAVQRAIBW5IRoDQCAAIAdBQGsgEhAcQQBIDQMCQCASQoDAAFINACAAKAJUIgJFDQAgAiAZQoBAfSIZuSAaoxB/CyABIAdBQGtCgMAAEBEiEkIAVQ0ACwwBCwNAIAAgB0FAayASEBxBAEgNAiABIAdBQGtCgMAAEBEiEkIAVQ0ACwtBACASQn9VDQEaIAQEQCAEIAEoAgw2AgAgBCABKAIQNgIECwtBfwshAiABEBsaDAELIAQEQCAEIAEoAgw2AgAgBCABKAIQNgIEC0F/IQILIAEgB0EIahAhQX9MBEAgBARAIAQgASgCDDYCACAEIAEoAhA2AgQLQX8hAgsCf0EAIQkCQCABIgNFDQADQCADLQAaQQFxBEBB/wEhCSADQQBCAEEQEA4iFUIAUw0CIBVCBFkEQCADQQxqBEAgA0EANgIQIANBFDYCDAsMAwsgFachCQwCCyADKAIAIgMNAAsLIAlBGHRBGHUiA0F/TAsEQCAEBEAgBCABKAIMNgIAIAQgASgCEDYCBAsgARAKDAELIAEQCiACQQBIDQAgACgCABAfIRUgACgCACECIBVCf1cEQCAEBEAgBCACKAIMNgIAIAQgAigCEDYCBAsMAQsgAiATEHlBf0wEQCAAKAIAIQIgBARAIAQgAigCDDYCACAEIAIoAhA2AgQLDAELIAcpAwgiE0LkAINC5ABSBEAgBARAIARBADYCBCAEQRQ2AgALDAELAkAgBS0AAEEgcQ0AIBNCEINQRQRAIAUgBygCMDYCFAwBCyAFQRRqEAEaCyAFIAcvATg2AhAgBSAHKAI0NgIYIAcpAyAhEyAFIBUgGH03AyAgBSATNwMoIAUgBS8BDEH5/wNxIANB/wFxQQF0cjsBDCAPQQp2IQNBPyEBAkACQAJAAkAgBSgCECICQQxrDgMAAQIBCyAFQS47AQoMAgtBLSEBIAMNACAFKQMoQv7///8PVg0AIAUpAyBC/v///w9WDQBBFCEBIAJBCEYNACAFLwFSQQFGDQAgBSgCMCICBH8gAi8BBAVBAAtB//8DcSICBEAgAiAFKAIwKAIAakEBay0AAEEvRg0BC0EKIQELIAUgATsBCgsgACAFIA8QNyICQQBIDQAgAiAKRwRAIAQEQCAEQQA2AgQgBEEUNgIACwwBCyAAKAIAIBUQeUF/Sg0BIAAoAgAhAiAEBEAgBCACKAIMNgIAIAQgAigCEDYCBAsLIA0NByAMEAoMBwsgDQ0CIAwQCgwCCyAFIAUvAQxB9/8DcTsBDCAAIAVBgAIQN0EASA0FIAAgEyAEEEIiE1ANBSAAKAIAIBNBABAVQX9MBEAgACgCACECIAQEQCAEIAIoAgw2AgAgBCACKAIQNgIECwwGCyAFKQMgIRIjAEGAQGoiAyQAAkAgElBFBEAgAEEIaiECIBK6IRoDQEF/IQEgACgCACADIBJCgMAAIBJCgMAAVBsiEyACEGlBAEgNAiAAIAMgExAcQQBIDQIgACgCVCAaIBIgE30iErqhIBqjEH8gEkIAUg0ACwtBACEBCyADQYBAayQAIAFBf0oNAUEBIREgAUEcdkEIcUEIRgwCCyAEBEAgBEEANgIEIARBDjYCAAsMBAtBAAtFDQELCyARDQBBfyECAkAgACgCABAfQgBTDQAgFyEUQQAhCkIAIRcjAEHwAGsiESQAAkAgACgCABAfIhVCAFkEQCAUUEUEQANAIAAgACgCQCALIBenQQN0aigCAEEEdGoiAygCBCIBBH8gAQUgAygCAAtBgAQQNyIBQQBIBEBCfyEXDAQLIAFBAEcgCnIhCiAXQgF8IhcgFFINAAsLQn8hFyAAKAIAEB8iGEJ/VwRAIAAoAgAhASAAQQhqBEAgACABKAIMNgIIIAAgASgCEDYCDAsMAgsgEULiABAYIgZFBEAgAEEIagRAIABBADYCDCAAQQ42AggLDAILIBggFX0hEyAVQv////8PViAUQv//A1ZyIApyQQFxBEAgBkGZEkEEECwgBkIsEBkgBkEtEA0gBkEtEA0gBkEAEBIgBkEAEBIgBiAUEBkgBiAUEBkgBiATEBkgBiAVEBkgBkGUEkEEECwgBkEAEBIgBiAYEBkgBkEBEBILIAZBnhJBBBAsIAZBABASIAYgFEL//wMgFEL//wNUG6dB//8DcSIBEA0gBiABEA0gBkF/IBOnIBNC/v///w9WGxASIAZBfyAVpyAVQv7///8PVhsQEiAGIABBJEEgIAAtACgbaigCACIDBH8gAy8BBAVBAAtB//8DcRANIAYtAABFBEAgAEEIagRAIABBADYCDCAAQRQ2AggLIAYQBwwCCyAAIAYoAgQgBi0AAAR+IAYpAxAFQgALEBwhASAGEAcgAUEASA0BIAMEQCAAIAMoAgAgAzMBBBAcQQBIDQILIBMhFwwBCyAAKAIAIQEgAEEIagRAIAAgASgCDDYCCCAAIAEoAhA2AgwLQn8hFwsgEUHwAGokACAXQgBTDQAgACgCABAfQj+HpyECCyALEAYgAkEASA0BAn8gACgCACIBKAIkQQFHBEAgAUEMagRAIAFBADYCECABQRI2AgwLQX8MAQsgASgCICICQQJPBEAgAUEMagRAIAFBADYCECABQR02AgwLQX8MAQsCQCACQQFHDQAgARAbQQBODQBBfwwBCyABQQBCAEEJEA5Cf1cEQCABQQI2AiRBfwwBCyABQQA2AiRBAAtFDQIgACgCACECIAQEQCAEIAIoAgw2AgAgBCACKAIQNgIECwwBCyALEAYLIAAoAlQQgAEgACgCABBEQX8hAgwCCyAAKAJUEIABCyAAEE1BACECCyAHQcDAAGokACACC6EDAQh/IwBBoAFrIgIkACAAEC8CQAJ/AkAgACgCACIBQQBOBEAgAUGwEygCAEgNAQsgAiABNgIQIAJBIGpB9hEgAkEQahB6QQEhBiACQSBqIQQgAkEgahAiIQNBAAwBCyABQQJ0IgFBsBJqKAIAIQUCfwJAAkAgAUHAE2ooAgBBAWsOAgABBAsgACgCBCEDQeSaASgCACEHQQAhAQJAAkADQCADIAFB0IkBai0AAEcEQEHXACEEIAFBAWoiAUHXAEcNAQwCCwsgASIEDQBBsIoBIQMMAQtBsIoBIQEDQCABLQAAIQggAUEBaiIDIQEgCA0AIAMhASAEQQFrIgQNAAsLIAcoAhQaIAMMAQtBACAAKAIEa0ECdEGI8QBqKAIACyIERQ0BIAQQIiEDIAVFBEBBACEFQQEhBkEADAELIAUQIkECagshASABIANqQQFqEAgiAUUEQEHoEigCACEFDAELIAIgBDYCCCACQawSQZESIAYbNgIEIAJBrBIgBSAGGzYCACABQasKIAIQeiAAIAE2AgggASEFCyACQaABaiQAIAULMwEBfyAAKAIUIgMgASACIAAoAhAgA2siASABIAJLGyIBEAkaIAAgACgCFCABajYCFCACCwYAQaSgAQsGAEGgoAELBgBBmKABCwcAIABBBGoLBwAgAEEIagsmAQF/IAAoAhQiAQRAIAEQCgsgACgCBCEBIABBBGoQLyAAEAYgAQupAQEDfwJAIAAtAAAiAkUNAANAIAEtAAAiBEUEQCACIQMMAgsCQCACIARGDQAgAkEgciACIAJBwQBrQRpJGyABLQAAIgJBIHIgAiACQcEAa0EaSRtGDQAgAC0AACEDDAILIAFBAWohASAALQABIQIgAEEBaiEAIAINAAsLIANB/wFxIgBBIHIgACAAQcEAa0EaSRsgAS0AACIAQSByIAAgAEHBAGtBGkkbawvMBgICfgJ/IwBB4ABrIgckAAJAAkACQAJAAkACQAJAAkACQAJAAkAgBA4PAAEKAgMEBgcICAgICAgFCAsgAUIANwMgDAkLIAAgAiADEBEiBUJ/VwRAIAFBCGoiAQRAIAEgACgCDDYCACABIAAoAhA2AgQLDAgLAkAgBVAEQCABKQMoIgMgASkDIFINASABIAM3AxggAUEBNgIEIAEoAgBFDQEgACAHQShqECFBf0wEQCABQQhqIgEEQCABIAAoAgw2AgAgASAAKAIQNgIECwwKCwJAIAcpAygiA0Igg1ANACAHKAJUIAEoAjBGDQAgAUEIagRAIAFBADYCDCABQQc2AggLDAoLIANCBINQDQEgBykDQCABKQMYUQ0BIAFBCGoEQCABQQA2AgwgAUEVNgIICwwJCyABKAIEDQAgASkDKCIDIAEpAyAiBlQNACAFIAMgBn0iA1gNACABKAIwIQQDQCABAn8gBSADfSIGQv////8PIAZC/////w9UGyIGpyEAQQAgAiADp2oiCEUNABogBCAIIACtQcyYASgCABEDAAsiBDYCMCABIAEpAyggBnw3AyggBSADIAZ8IgNWDQALCyABIAEpAyAgBXw3AyAMCAsgASgCBEUNByACIAEpAxgiAzcDGCABKAIwIQAgAkEANgIwIAIgAzcDICACIAA2AiwgAiACKQMAQuwBhDcDAAwHCyADQghaBH4gAiABKAIINgIAIAIgASgCDDYCBEIIBUJ/CyEFDAYLIAEQBgwFC0J/IQUgACkDGCIDQn9XBEAgAUEIaiIBBEAgASAAKAIMNgIAIAEgACgCEDYCBAsMBQsgB0F/NgIYIAdCj4CAgIACNwMQIAdCjICAgNABNwMIIAdCiYCAgKABNwMAIANBCCAHECRCf4WDIQUMBAsgA0IPWARAIAFBCGoEQCABQQA2AgwgAUESNgIICwwDCyACRQ0CAkAgACACKQMAIAIoAggQFUEATgRAIAAQMiIDQn9VDQELIAFBCGoiAQRAIAEgACgCDDYCACABIAAoAhA2AgQLDAMLIAEgAzcDIAwDCyABKQMgIQUMAgsgAUEIagRAIAFBADYCDCABQRw2AggLC0J/IQULIAdB4ABqJAAgBQuMBwICfgJ/IwBBEGsiByQAAkACQAJAAkACQAJAAkACQAJAAkAgBA4RAAECAwUGCAgICAgICAgHCAQICyABQn83AyAgAUEAOgAPIAFBADsBDCABQgA3AxggASgCrEAgASgCqEAoAgwRAgCtQgF9IQUMCAtCfyEFIAEoAgANB0IAIQUgA1ANByABLQANDQcgAUEoaiEEAkADQAJAIAcgAyAFfTcDCCABKAKsQCACIAWnaiAHQQhqIAEoAqhAKAIcEQAAIQhCACAHKQMIIAhBAkYbIAV8IQUCQAJAAkAgCEEBaw4DAAMBAgsgAUEBOgANIAEpAyAiA0J/VwRAIAEEQCABQQA2AgQgAUEUNgIACwwFCyABLQAORQ0EIAMgBVYNBCABIAM3AxggAUEBOgAPIAIgBCADpxAJGiABKQMYIQUMDAsgAS0ADA0DIAAgBEKAwAAQESIGQn9XBEAgAQRAIAEgACgCDDYCACABIAAoAhA2AgQLDAQLIAZQBEAgAUEBOgAMIAEoAqxAIAEoAqhAKAIYEQQAIAEpAyBCf1UNASABQgA3AyAMAQsCQCABKQMgQgBZBEAgAUEAOgAODAELIAEgBjcDIAsgASgCrEAgBCAGIAEoAqhAKAIUEQMAGgsgAyAFVg0BDAILCyABKAIADQAgAQRAIAFBADYCBCABQRQ2AgALCyAFUEUEQCABQQA6AA4gASABKQMYIAV8NwMYDAgLQn9CACABKAIAGyEFDAcLIAEoAqxAIAEoAqhAKAIQEQIArUIBfSEFDAYLIAEtABAEQCABLQANBEAgAiABLQAPBH9BAAVBCCABKAIUIgAgAEF9SxsLOwEwIAIgASkDGDcDICACIAIpAwBCyACENwMADAcLIAIgAikDAEK3////D4M3AwAMBgsgAkEAOwEwIAIpAwAhAyABLQANBEAgASkDGCEFIAIgA0LEAIQ3AwAgAiAFNwMYQgAhBQwGCyACIANCu////w+DQsAAhDcDAAwFCyABLQAPDQQgASgCrEAgASgCqEAoAggRAgCsIQUMBAsgA0IIWgR+IAIgASgCADYCACACIAEoAgQ2AgRCCAVCfwshBQwDCyABRQ0CIAEoAqxAIAEoAqhAKAIEEQQAIAEQLyABEAYMAgsgB0F/NgIAQRAgBxAkQj+EIQUMAQsgAQRAIAFBADYCBCABQRQ2AgALQn8hBQsgB0EQaiQAIAULYwBByAAQCCIARQRAQfibASgCACEBIAIEQCACIAE2AgQgAkEBNgIACyAADwsgAEEAOgAMIABBADoABCAAIAI2AgAgAEEANgI4IABCADcDMCAAIAFBCSABQQFrQQlJGzYCCCAAC0gBAX8gAEIANwIEIAAgATYCAAJAIAFBAEgNAEGwEygCACABTA0AIAFBAnRBwBNqKAIAQQFHDQBB+JsBKAIAIQILIAAgAjYCBAvuhwECJH8BfiACKQMAIScgACABNgIcIAAgJ0L/////DyAnQv////8PVBs+AiAgAEEQaiEKAn8gAC0ABARAAn8gAC0ADEECdCENQX4hAQJAAkACQCAKRQ0AIAooAiBFDQAgCigCJEUNACAKKAIcIgNFDQAgAygCACAKRw0AAkACQCADKAIgIgVBOWsOOQECAgICAgICAgICAgECAgIBAgICAgICAgICAgICAgICAgIBAgICAgICAgICAgIBAgICAgICAgICAQALIAVBmgVGDQAgBUEqRw0BCyANQQVLDQACQAJAIAooAgxFDQAgCigCBCIEBEAgCigCAEUNAQsgBUGaBUcNASANQQRGDQELIApBkPEAKAIANgIYQX4MBAsgCigCEEUNASADKAIkIQEgAyANNgIkAkAgAygCEARAIAMQFAJAIAooAhAiBSADKAIQIgkgBSAJSRsiAUUNACAKKAIMIAMoAgggARAJGiAKIAooAgwgAWo2AgwgAyADKAIIIAFqNgIIIAogCigCFCABajYCFCAKIAooAhAgAWsiBTYCECADIAMoAhAgAWsiCTYCECAJDQAgAyADKAIENgIIQQAhCQsgBQRAIAMoAiAhBQwCCwwECyAEDQAgDUEBdEF3QQAgDUEESxtqIAFBAXRBd0EAIAFBBEobakoNACANQQRGDQAMAgsCQAJAAkACQAJAIAVBKkcEQCAFQZoFRw0BIAooAgRFDQMMBwsgAygCFEUEQCADQfEANgIgDAILIAMoAjRBDHRBgPABayEBAkAgAygCfEECTg0AIAMoAngiBEEBTA0AIARBBUwEQCABQcAAciEBDAELQYABQcABIARBBkYbIAFyIQELIAMgCUEBajYCECADKAIEIAlqIAFBIHIgASADKAJkGyIBQQh2OgAAIAMgAygCECIEQQFqNgIQIAQgAygCBGogAUEfcCABckEfczoAACADKAJkBEAgAyAKKAIwEF0LIApBATYCMCADQfEANgIgIAoQDCADKAIQDQcgAygCICEFCwJAAkACQAJAIAVBOUYEfyADKAIAQQA2AjAgAyADKAIQIgFBAWo2AhAgASADKAIEakEfOgAAIAMgAygCECIBQQFqNgIQIAEgAygCBGpBiwE6AAAgAyADKAIQIgFBAWo2AhAgASADKAIEakEIOgAAAkAgAygCHCIBRQRAIANBABA0IAMgAygCECIBQQFqNgIQIAEgAygCBGpBADoAAEECIQEgAygCeCIEQQlHBEBBBCAEQQJIQQJ0IAMoAnxBAUobIQELIAMgAygCECIEQQFqNgIQIAQgAygCBGogAToAACADIAMoAhAiAUEBajYCECABIAMoAgRqQQM6AAAgA0HxADYCICAKEAwgAygCEEUNAQwNCyABKAIkIQQgASgCHCEFIAEoAhAhByABKAIsIQkgASgCACELIAMgAygCECIIQQFqNgIQQQIhASAIIAMoAgRqIAlBAEdBAXQgC0EAR3IgB0EAR0ECdHIgBUEAR0EDdHIgBEEAR0EEdHI6AAAgAyADKAIcKAIEEDQgAygCeCIEQQlHBEBBBCAEQQJIQQJ0IAMoAnxBAUobIQELIAMgAygCECIEQQFqNgIQIAQgAygCBGogAToAACADKAIcKAIMIQEgAyADKAIQIgRBAWo2AhAgBCADKAIEaiABOgAAIAMoAhwiASgCEAR/IAEoAhQhASADIAMoAhAiBEEBajYCECAEIAMoAgRqIAE6AAAgAyADKAIQIgRBAWo2AhAgBCADKAIEaiABQQh2OgAAIAMoAhwFIAELKAIsBEAgCgJ/IAooAjAhASADKAIQIQRBACADKAIEIgVFDQAaIAEgBSAErUHMmAEoAgARAwALNgIwCyADQcUANgIgIANBADYCGAwCCyADKAIgBSAFC0HFAGsOIwAEBAQBBAQEBAQEBAQEBAQEBAQEBAQCBAQEBAQEBAQEBAQDBAsgAygCHCIEKAIQIgUEQCADKAIMIgkgAygCECIBIAQvARQgAygCGCIHayIEakkEQANAIAMoAgQgAWogBSAHaiAJIAFrIgkQCRogAyADKAIMIgU2AhACQCADKAIcKAIsRQ0AIAEgBU8NACAKAn8gCigCMCEHQQAgAygCBCABaiILRQ0AGiAHIAsgBSABa61BzJgBKAIAEQMACzYCMAsgAyADKAIYIAlqNgIYIAooAhwiARAUAkAgCigCECIFIAEoAhAiByAFIAdJGyIFRQ0AIAooAgwgASgCCCAFEAkaIAogCigCDCAFajYCDCABIAEoAgggBWo2AgggCiAKKAIUIAVqNgIUIAogCigCECAFazYCECABIAEoAhAgBWsiBTYCECAFDQAgASABKAIENgIICyADKAIQDQwgAygCGCEHIAMoAhwoAhAhBUEAIQEgBCAJayIEIAMoAgwiCUsNAAsLIAMoAgQgAWogBSAHaiAEEAkaIAMgAygCECAEaiIENgIQAkAgAygCHCgCLEUNACABIARPDQAgCgJ/IAooAjAhBUEAIAMoAgQgAWoiB0UNABogBSAHIAQgAWutQcyYASgCABEDAAs2AjALIANBADYCGAsgA0HJADYCIAsgAygCHCgCHARAIAMoAhAiASEEA0ACQCABIAMoAgxHDQACQCADKAIcKAIsRQ0AIAEgBE0NACAKAn8gCigCMCEFQQAgAygCBCAEaiIHRQ0AGiAFIAcgASAEa61BzJgBKAIAEQMACzYCMAsgCigCHCIBEBQCQCAKKAIQIgQgASgCECIFIAQgBUkbIgRFDQAgCigCDCABKAIIIAQQCRogCiAKKAIMIARqNgIMIAEgASgCCCAEajYCCCAKIAooAhQgBGo2AhQgCiAKKAIQIARrNgIQIAEgASgCECAEayIENgIQIAQNACABIAEoAgQ2AggLQQAhAUEAIQQgAygCEEUNAAwLCyADKAIcKAIcIQUgAyADKAIYIgdBAWo2AhggBSAHai0AACEFIAMgAUEBajYCECADKAIEIAFqIAU6AAAgBQRAIAMoAhAhAQwBCwsCQCADKAIcKAIsRQ0AIAMoAhAiASAETQ0AIAoCfyAKKAIwIQVBACADKAIEIARqIgdFDQAaIAUgByABIARrrUHMmAEoAgARAwALNgIwCyADQQA2AhgLIANB2wA2AiALAkAgAygCHCgCJEUNACADKAIQIgEhBANAAkAgASADKAIMRw0AAkAgAygCHCgCLEUNACABIARNDQAgCgJ/IAooAjAhBUEAIAMoAgQgBGoiB0UNABogBSAHIAEgBGutQcyYASgCABEDAAs2AjALIAooAhwiARAUAkAgCigCECIEIAEoAhAiBSAEIAVJGyIERQ0AIAooAgwgASgCCCAEEAkaIAogCigCDCAEajYCDCABIAEoAgggBGo2AgggCiAKKAIUIARqNgIUIAogCigCECAEazYCECABIAEoAhAgBGsiBDYCECAEDQAgASABKAIENgIIC0EAIQFBACEEIAMoAhBFDQAMCgsgAygCHCgCJCEFIAMgAygCGCIHQQFqNgIYIAUgB2otAAAhBSADIAFBAWo2AhAgAygCBCABaiAFOgAAIAUEQCADKAIQIQEMAQsLIAMoAhwoAixFDQAgAygCECIBIARNDQAgCgJ/IAooAjAhBUEAIAMoAgQgBGoiB0UNABogBSAHIAEgBGutQcyYASgCABEDAAs2AjALIANB5wA2AiALAkAgAygCHCgCLARAIAMoAgwgAygCECIBQQJqSQRAIAoQDCADKAIQDQJBACEBCyAKKAIwIQQgAyABQQFqNgIQIAMoAgQgAWogBDoAACADIAMoAhAiAUEBajYCECABIAMoAgRqIARBCHY6AAAgAygCAEEANgIwCyADQfEANgIgIAoQDCADKAIQRQ0BDAcLDAYLIAooAgQNAQsgAygCPA0AIA1FDQEgAygCIEGaBUYNAQsCfyADKAJ4IgFFBEAgAyANEFwMAQsCQAJAAkAgAygCfEECaw4CAAECCwJ/AkADQAJAIAMoAjwNACADECkgAygCPA0AIA0NAkEADAMLIAMoAkggAygCZGotAAAhASADIAMoApQtIgRBAWo2ApQtIAQgAygCkC1qQQA6AAAgAyADKAKULSIEQQFqNgKULSAEIAMoApAtakEAOgAAIAMgAygClC0iBEEBajYClC0gBCADKAKQLWogAToAACADIAFBAnRqIgEgAS8BiAFBAWo7AYgBIAMgAygCPEEBazYCPCADIAMoAmRBAWoiBDYCZCADKAKULSADKAKYLUcNACADIAMoAlQiAUEATgR/IAMoAkggAWoFQQALIAQgAWtBABAPIAMgAygCZDYCVCADKAIAIgEoAhwiBBAUAkAgASgCECIFIAQoAhAiByAFIAdJGyIFRQ0AIAEoAgwgBCgCCCAFEAkaIAEgASgCDCAFajYCDCAEIAQoAgggBWo2AgggASABKAIUIAVqNgIUIAEgASgCECAFazYCECAEIAQoAhAgBWsiATYCECABDQAgBCAEKAIENgIICyADKAIAKAIQDQALQQAMAQsgA0EANgKoLSANQQRGBEAgAyADKAJUIgFBAE4EfyADKAJIIAFqBUEACyADKAJkIAFrQQEQDyADIAMoAmQ2AlQgAygCACIBKAIcIgQQFAJAIAEoAhAiBSAEKAIQIgcgBSAHSRsiBUUNACABKAIMIAQoAgggBRAJGiABIAEoAgwgBWo2AgwgBCAEKAIIIAVqNgIIIAEgASgCFCAFajYCFCABIAEoAhAgBWs2AhAgBCAEKAIQIAVrIgE2AhAgAQ0AIAQgBCgCBDYCCAtBA0ECIAMoAgAoAhAbDAELAkAgAygClC1FDQAgAyADKAJUIgFBAE4EfyADKAJIIAFqBUEACyADKAJkIAFrQQAQDyADIAMoAmQ2AlQgAygCACIBKAIcIgQQFAJAIAEoAhAiBSAEKAIQIgcgBSAHSRsiBUUNACABKAIMIAQoAgggBRAJGiABIAEoAgwgBWo2AgwgBCAEKAIIIAVqNgIIIAEgASgCFCAFajYCFCABIAEoAhAgBWs2AhAgBCAEKAIQIAVrIgE2AhAgAQ0AIAQgBCgCBDYCCAsgAygCACgCEA0AQQAMAQtBAQsMAgsCfwJAA0ACQAJAAkACQCADKAI8IghBggJLDQAgAxApAkAgAygCPCIIQYICSw0AIA0NAEEADAcLIAhFDQUgCEECSw0AIAMoAmQhCwwBCyADKAJkIgtFBEBBACELDAELIAMoAkggC2oiDEEBayIBLQAAIgkgDC0AAEcNACAJIAEtAAJHDQAgCSABLQADRw0AIAxBggJqIQ5BfyEBAkACQAJAAkACQAJAA0AgASAMaiIFLQAEIAlGBEAgCSAFLQAFRw0CIAkgBS0ABkcNAyAJIAUtAAdHDQQgCSAMIAFBCGoiBGoiBy0AAEcNByAJIAUtAAlHDQUgCSAFLQAKRw0GIAkgBUELaiIHLQAARw0HIAFB9wFIIQUgBCEBIAUNAQwHCwsgBUEEaiEHDAULIAVBBWohBwwECyAFQQZqIQcMAwsgBUEHaiEHDAILIAVBCWohBwwBCyAFQQpqIQcLIAggByAOa0GCAmoiASABIAhLGyIBQQJLDQELIAMoAkggC2otAAAhASADIAMoApQtIgRBAWo2ApQtIAQgAygCkC1qQQA6AAAgAyADKAKULSIEQQFqNgKULSAEIAMoApAtakEAOgAAIAMgAygClC0iBEEBajYClC0gBCADKAKQLWogAToAACADIAFBAnRqIgEgAS8BiAFBAWo7AYgBIAMgAygCPEEBazYCPCADIAMoAmRBAWoiCzYCZAwBCyADIAMoApQtIgRBAWo2ApQtIAQgAygCkC1qQQE6AAAgAyADKAKULSIEQQFqNgKULSAEIAMoApAtakEAOgAAIAMgAygClC0iBEEBajYClC0gBCADKAKQLWogAUEDazoAACADIAMoAqQtQQFqNgKkLSABQc3pAGotAABBAnQgA2pBjAlqIgQgBC8BAEEBajsBACADQdDlAC0AAEECdGpB/BJqIgQgBC8BAEEBajsBACADIAMoAjwgAWs2AjwgAyADKAJkIAFqIgs2AmQLIAMoApQtIAMoApgtRw0AIAMgAygCVCIBQQBOBH8gAygCSCABagVBAAsgCyABa0EAEA8gAyADKAJkNgJUIAMoAgAiASgCHCIEEBQCQCABKAIQIgUgBCgCECIHIAUgB0kbIgVFDQAgASgCDCAEKAIIIAUQCRogASABKAIMIAVqNgIMIAQgBCgCCCAFajYCCCABIAEoAhQgBWo2AhQgASABKAIQIAVrNgIQIAQgBCgCECAFayIBNgIQIAENACAEIAQoAgQ2AggLIAMoAgAoAhANAAtBAAwBCyADQQA2AqgtIA1BBEYEQCADIAMoAlQiAUEATgR/IAMoAkggAWoFQQALIAMoAmQgAWtBARAPIAMgAygCZDYCVCADKAIAIgEoAhwiBBAUAkAgASgCECIFIAQoAhAiByAFIAdJGyIFRQ0AIAEoAgwgBCgCCCAFEAkaIAEgASgCDCAFajYCDCAEIAQoAgggBWo2AgggASABKAIUIAVqNgIUIAEgASgCECAFazYCECAEIAQoAhAgBWsiATYCECABDQAgBCAEKAIENgIIC0EDQQIgAygCACgCEBsMAQsCQCADKAKULUUNACADIAMoAlQiAUEATgR/IAMoAkggAWoFQQALIAMoAmQgAWtBABAPIAMgAygCZDYCVCADKAIAIgEoAhwiBBAUAkAgASgCECIFIAQoAhAiByAFIAdJGyIFRQ0AIAEoAgwgBCgCCCAFEAkaIAEgASgCDCAFajYCDCAEIAQoAgggBWo2AgggASABKAIUIAVqNgIUIAEgASgCECAFazYCECAEIAQoAhAgBWsiATYCECABDQAgBCAEKAIENgIICyADKAIAKAIQDQBBAAwBC0EBCwwBCyADIA0gAUEMbEHY2gBqKAIAEQEACyIBQX5xQQJGBEAgA0GaBTYCIAsgAUF9cUUEQEEAIQEgCigCEA0CDAQLIAFBAUcNAAJAAkACQCANQQFrDgUAAQEBAgELIAMpA7gtIScCfwJ+IAMoAsAtIgFBA2oiBEE/TQRAQgIgAa2GICeEDAELIAFBwABGBEAgAyADKAIQIgFBAWo2AhAgASADKAIEaiAnPAAAIAMgAygCECIBQQFqNgIQIAEgAygCBGogJ0IIiDwAACADIAMoAhAiAUEBajYCECABIAMoAgRqICdCEIg8AAAgAyADKAIQIgFBAWo2AhAgASADKAIEaiAnQhiIPAAAIAMgAygCECIBQQFqNgIQIAEgAygCBGogJ0IgiDwAACADIAMoAhAiAUEBajYCECABIAMoAgRqICdCKIg8AAAgAyADKAIQIgFBAWo2AhAgASADKAIEaiAnQjCIPAAAIAMgAygCECIBQQFqNgIQIAEgAygCBGogJ0I4iDwAAEICIScgA0ICNwO4LSADQQM2AsAtQQoMAgsgAyADKAIQIgRBAWo2AhAgBCADKAIEakICIAGthiAnhCInPAAAIAMgAygCECIEQQFqNgIQIAQgAygCBGogJ0IIiDwAACADIAMoAhAiBEEBajYCECAEIAMoAgRqICdCEIg8AAAgAyADKAIQIgRBAWo2AhAgBCADKAIEaiAnQhiIPAAAIAMgAygCECIEQQFqNgIQIAQgAygCBGogJ0IgiDwAACADIAMoAhAiBEEBajYCECAEIAMoAgRqICdCKIg8AAAgAyADKAIQIgRBAWo2AhAgBCADKAIEaiAnQjCIPAAAIAMgAygCECIEQQFqNgIQIAQgAygCBGogJ0I4iDwAACABQT1rIQRCAkHAACABa62ICyEnIARBB2ogBEE5SQ0AGiADIAMoAhAiAUEBajYCECABIAMoAgRqICc8AAAgAyADKAIQIgFBAWo2AhAgASADKAIEaiAnQgiIPAAAIAMgAygCECIBQQFqNgIQIAEgAygCBGogJ0IQiDwAACADIAMoAhAiAUEBajYCECABIAMoAgRqICdCGIg8AAAgAyADKAIQIgFBAWo2AhAgASADKAIEaiAnQiCIPAAAIAMgAygCECIBQQFqNgIQIAEgAygCBGogJ0IoiDwAACADIAMoAhAiAUEBajYCECABIAMoAgRqICdCMIg8AAAgAyADKAIQIgFBAWo2AhAgASADKAIEaiAnQjiIPAAAQgAhJyAEQTlrCyEBIAMgJzcDuC0gAyABNgLALSADEBQMAQsgA0EAQQBBABA9IA1BA0cNACADKAJQQQBBgIAIEBogAygCPA0AIANBADYCqC0gA0EANgJUIANBADYCZAsgChAMIAooAhANAAwDC0EAIQEgDUEERw0AAkACQAJAIAMoAhRBAWsOAgEAAgsgAyAKKAIwEDQgAyAKKAIIEDQMAQsgAyAKKAIwEF0LIAoQDCADKAIUIgFBAU4EQCADQQAgAWs2AhQLIAMoAhBFIQELIAEMAgsgCkGc8QAoAgA2AhhBewwBCyADQX82AiRBAAsMAQsjAEEQayIUJABBfiEXAkAgCkUNACAKKAIgRQ0AIAooAiRFDQAgCigCHCIGRQ0AIAYoAgAgCkcNACAGKAIEIgdBtP4Aa0EfSw0AIAooAgwiEUUNACAKKAIAIgFFBEAgCigCBA0BCyAHQb/+AEYEQCAGQcD+ADYCBEHA/gAhBwsgBkHcAGohHiAGQfQFaiEaIAZB9ABqIRwgBkHYAGohHSAGQfAAaiEbIAZBtApqIRggBigCQCEDIAooAgQiHyEFIAYoAjwhCCAKKAIQIg4hFgJAAkADQAJAQX0hBEEBIQkCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAHQbT+AGsOHwcGCAkKJSYnKAUsLS0LGRoEDAIyMwE1ADcNDgM5SElKCyAGKAJMIQwgASEEIAUhBww1CyAGKAJMIQwgASEEIAUhBwwyCyAGKAJsIQcMLgsgBigCDCEHDEELIANBDk8NKSAFRQ1BIANBCGohBCABQQFqIQcgBUEBayEJIAEtAAAgA3QgCGohCCADQQZJDQwgByEBIAkhBSAEIQMMKQsgA0EgTw0lIAVFDUAgAUEBaiEEIAVBAWshByABLQAAIAN0IAhqIQggA0EYSQ0NIAQhASAHIQUMJQsgA0EQTw0VIAVFDT8gA0EIaiEEIAFBAWohByAFQQFrIQkgAS0AACADdCAIaiEIIANBCEkNDSAHIQEgCSEFIAQhAwwVCyAGKAIMIgtFDQcgA0EQTw0iIAVFDT4gA0EIaiEEIAFBAWohByAFQQFrIQkgAS0AACADdCAIaiEIIANBCEkNDSAHIQEgCSEFIAQhAwwiCyADQR9LDRUMFAsgA0EPSw0WDBULIAYoAhQiBEGACHFFBEAgAyEHDBcLIAghByADQQ9LDRgMFwsgCCADQQdxdiEIIANBeHEiA0EfSw0MIAVFDTogA0EIaiEEIAFBAWohByAFQQFrIQkgAS0AACADdCAIaiEIIANBGEkNBiAHIQEgCSEFIAQhAwwMCyAGKAJsIgcgBigCYCILTw0jDCILIA5FDSogESAGKAJEOgAAIAZByP4ANgIEIA5BAWshDiARQQFqIREgBigCBCEHDDkLIAYoAgwiB0UEQEEAIQcMCQsgA0EfSw0HIAVFDTcgA0EIaiEEIAFBAWohCSAFQQFrIQsgAS0AACADdCAIaiEIIANBGEkNASAJIQEgCyEFIAQhAwwHCyAGQcD+ADYCBAwqCyALRQRAIAkhAUEAIQUgBCEDIA0hBAw4CyADQRBqIQkgAUECaiELIAVBAmshDCABLQABIAR0IAhqIQggA0EPSwRAIAshASAMIQUgCSEDDAYLIAxFBEAgCyEBQQAhBSAJIQMgDSEEDDgLIANBGGohBCABQQNqIQsgBUEDayEMIAEtAAIgCXQgCGohCCADQQdLBEAgCyEBIAwhBSAEIQMMBgsgDEUEQCALIQFBACEFIAQhAyANIQQMOAsgA0EgaiEDIAVBBGshBSABLQADIAR0IAhqIQggAUEEaiEBDAULIAlFBEAgByEBQQAhBSAEIQMgDSEEDDcLIANBEGohAyAFQQJrIQUgAS0AASAEdCAIaiEIIAFBAmohAQwcCyAJRQRAIAchAUEAIQUgBCEDIA0hBAw2CyADQRBqIQcgAUECaiEJIAVBAmshCyABLQABIAR0IAhqIQggA0EPSwRAIAkhASALIQUgByEDDAYLIAtFBEAgCSEBQQAhBSAHIQMgDSEEDDYLIANBGGohBCABQQNqIQkgBUEDayELIAEtAAIgB3QgCGohCCADBEAgCSEBIAshBSAEIQMMBgsgC0UEQCAJIQFBACEFIAQhAyANIQQMNgsgA0EgaiEDIAVBBGshBSABLQADIAR0IAhqIQggAUEEaiEBDAULIANBCGohCSAHRQRAIAQhAUEAIQUgCSEDIA0hBAw1CyABQQJqIQQgBUECayEHIAEtAAEgCXQgCGohCCADQQ9LBEAgBCEBIAchBQwYCyADQRBqIQkgB0UEQCAEIQFBACEFIAkhAyANIQQMNQsgAUEDaiEEIAVBA2shByABLQACIAl0IAhqIQggA0EHSwRAIAQhASAHIQUMGAsgA0EYaiEDIAdFBEAgBCEBQQAhBSANIQQMNQsgBUEEayEFIAEtAAMgA3QgCGohCCABQQRqIQEMFwsgCQ0GIAchAUEAIQUgBCEDIA0hBAwzCyAJRQRAIAchAUEAIQUgBCEDIA0hBAwzCyADQRBqIQMgBUECayEFIAEtAAEgBHQgCGohCCABQQJqIQEMFAsgCiAWIA5rIgQgCigCFGo2AhQgBiAGKAIgIARqNgIgAkAgB0EEcSIJRQ0AIARFDQAgBgJ/IAYoAhQEQAJ/IAYoAhwhB0EAIBEgBGsiCUUNABogByAJIAStQcyYASgCABEDAAsMAQsgBigCHCARIARrIARByJgBKAIAEQAACyIENgIcIAogBDYCMCAGKAIMIgdBBHEhCQsCQCAJRQ0AIAYoAhwgCCAIQQh0QYCA/AdxIAhBGHRyIAhBCHZBgP4DcSAIQRh2cnIgBigCFBtGDQAgBkHR/gA2AgQgCkGkDDYCGCAOIRYgBigCBCEHDDELQQAhCEEAIQMgDiEWCyAGQc/+ADYCBAwtCyAIQf//A3EiBCAIQX9zQRB2RwRAIAZB0f4ANgIEIApBjgo2AhggBigCBCEHDC8LIAZBwv4ANgIEIAYgBDYCREEAIQhBACEDCyAGQcP+ADYCBAsgBigCRCIEBEAgDiAFIAQgBCAFSxsiBCAEIA5LGyIERQ0eIBEgASAEEAkhByAGIAYoAkQgBGs2AkQgBCAHaiERIA4gBGshDiABIARqIQEgBSAEayEFIAYoAgQhBwwtCyAGQb/+ADYCBCAGKAIEIQcMLAsgA0EQaiEDIAVBAmshBSABLQABIAR0IAhqIQggAUECaiEBCyAGIAg2AhQgCEH/AXFBCEcEQCAGQdH+ADYCBCAKQYIPNgIYIAYoAgQhBwwrCyAIQYDAA3EEQCAGQdH+ADYCBCAKQY0JNgIYIAYoAgQhBwwrCyAGKAIkIgQEQCAEIAhBCHZBAXE2AgALAkAgCEGABHFFDQAgBi0ADEEEcUUNACAUIAg7AAwgBgJ/IAYoAhwhBEEAIBRBDGoiA0UNABogBCADQgJBzJgBKAIAEQMACzYCHAsgBkG2/gA2AgRBACEDQQAhCAsgBUUNKCABQQFqIQQgBUEBayEHIAEtAAAgA3QgCGohCCADQRhPBEAgBCEBIAchBQwBCyADQQhqIQkgB0UEQCAEIQFBACEFIAkhAyANIQQMKwsgAUECaiEEIAVBAmshByABLQABIAl0IAhqIQggA0EPSwRAIAQhASAHIQUMAQsgA0EQaiEJIAdFBEAgBCEBQQAhBSAJIQMgDSEEDCsLIAFBA2ohBCAFQQNrIQcgAS0AAiAJdCAIaiEIIANBB0sEQCAEIQEgByEFDAELIANBGGohAyAHRQRAIAQhAUEAIQUgDSEEDCsLIAVBBGshBSABLQADIAN0IAhqIQggAUEEaiEBCyAGKAIkIgQEQCAEIAg2AgQLAkAgBi0AFUECcUUNACAGLQAMQQRxRQ0AIBQgCDYADCAGAn8gBigCHCEEQQAgFEEMaiIDRQ0AGiAEIANCBEHMmAEoAgARAwALNgIcCyAGQbf+ADYCBEEAIQNBACEICyAFRQ0mIAFBAWohBCAFQQFrIQcgAS0AACADdCAIaiEIIANBCE8EQCAEIQEgByEFDAELIANBCGohAyAHRQRAIAQhAUEAIQUgDSEEDCkLIAVBAmshBSABLQABIAN0IAhqIQggAUECaiEBCyAGKAIkIgQEQCAEIAhBCHY2AgwgBCAIQf8BcTYCCAsCQCAGLQAVQQJxRQ0AIAYtAAxBBHFFDQAgFCAIOwAMIAYCfyAGKAIcIQRBACAUQQxqIgNFDQAaIAQgA0ICQcyYASgCABEDAAs2AhwLIAZBuP4ANgIEQQAhB0EAIQNBACEIIAYoAhQiBEGACHENAQsgBigCJCIEBEAgBEEANgIQCyAHIQMMAgsgBUUEQEEAIQUgByEIIA0hBAwmCyABQQFqIQkgBUEBayELIAEtAAAgA3QgB2ohCCADQQhPBEAgCSEBIAshBQwBCyADQQhqIQMgC0UEQCAJIQFBACEFIA0hBAwmCyAFQQJrIQUgAS0AASADdCAIaiEIIAFBAmohAQsgBiAIQf//A3EiAzYCRCAGKAIkIgcEQCAHIAM2AhQLQQAhAwJAIARBgARxRQ0AIAYtAAxBBHFFDQAgFCAIOwAMIAYCfyAGKAIcIQRBACAUQQxqIgdFDQAaIAQgB0ICQcyYASgCABEDAAs2AhwLQQAhCAsgBkG5/gA2AgQLIAYoAhQiCUGACHEEQCAFIAYoAkQiByAFIAdJGyIEBEACQCAGKAIkIgtFDQAgCygCECIMRQ0AIAwgCygCFCAHayIHaiABIAsoAhgiCSAHayAEIAQgB2ogCUsbEAkaIAYoAhQhCQsCQCAJQYAEcUUNACAGLQAMQQRxRQ0AIAYCfyAGKAIcIQdBACABRQ0AGiAHIAEgBK1BzJgBKAIAEQMACzYCHAsgBiAGKAJEIARrIgc2AkQgBSAEayEFIAEgBGohAQsgBw0TCyAGQbr+ADYCBCAGQQA2AkQLAkAgBi0AFUEIcQRAQQAhByAFRQ0EA0AgASAHai0AACEEAkAgBigCJCIJRQ0AIAkoAhwiDEUNACAGKAJEIgsgCSgCIE8NACAGIAtBAWo2AkQgCyAMaiAEOgAACyAEQQAgBSAHQQFqIgdLGw0ACwJAIAYtABVBAnFFDQAgBi0ADEEEcUUNACAGAn8gBigCHCEJQQAgAUUNABogCSABIAetQcyYASgCABEDAAs2AhwLIAEgB2ohASAFIAdrIQUgBEUNAQwTCyAGKAIkIgRFDQAgBEEANgIcCyAGQbv+ADYCBCAGQQA2AkQLAkAgBi0AFUEQcQRAQQAhByAFRQ0DA0AgASAHai0AACEEAkAgBigCJCIJRQ0AIAkoAiQiDEUNACAGKAJEIgsgCSgCKE8NACAGIAtBAWo2AkQgCyAMaiAEOgAACyAEQQAgBSAHQQFqIgdLGw0ACwJAIAYtABVBAnFFDQAgBi0ADEEEcUUNACAGAn8gBigCHCEJQQAgAUUNABogCSABIAetQcyYASgCABEDAAs2AhwLIAEgB2ohASAFIAdrIQUgBEUNAQwSCyAGKAIkIgRFDQAgBEEANgIkCyAGQbz+ADYCBAsgBigCFCILQYAEcQRAAkAgA0EPSw0AIAVFDR8gA0EIaiEEIAFBAWohByAFQQFrIQkgAS0AACADdCAIaiEIIANBCE8EQCAHIQEgCSEFIAQhAwwBCyAJRQRAIAchAUEAIQUgBCEDIA0hBAwiCyADQRBqIQMgBUECayEFIAEtAAEgBHQgCGohCCABQQJqIQELAkAgBi0ADEEEcUUNACAIIAYvARxGDQAgBkHR/gA2AgQgCkHXDDYCGCAGKAIEIQcMIAtBACEIQQAhAwsgBigCJCIEBEAgBEEBNgIwIAQgC0EJdkEBcTYCLAsgBkEANgIcIApBADYCMCAGQb/+ADYCBCAGKAIEIQcMHgtBACEFDA4LAkAgC0ECcUUNACAIQZ+WAkcNACAGKAIoRQRAIAZBDzYCKAtBACEIIAZBADYCHCAUQZ+WAjsADCAGIBRBDGoiBAR/QQAgBEICQcyYASgCABEDAAVBAAs2AhwgBkG1/gA2AgRBACEDIAYoAgQhBwwdCyAGKAIkIgQEQCAEQX82AjALAkAgC0EBcQRAIAhBCHRBgP4DcSAIQQh2akEfcEUNAQsgBkHR/gA2AgQgCkH2CzYCGCAGKAIEIQcMHQsgCEEPcUEIRwRAIAZB0f4ANgIEIApBgg82AhggBigCBCEHDB0LIAhBBHYiBEEPcSIJQQhqIQcgCUEHTUEAIAYoAigiCwR/IAsFIAYgBzYCKCAHCyAHTxtFBEAgA0EEayEDIAZB0f4ANgIEIApB+gw2AhggBCEIIAYoAgQhBwwdCyAGQQE2AhxBACEDIAZBADYCFCAGQYACIAl0NgIYIApBATYCMCAGQb3+AEG//gAgCEGAwABxGzYCBEEAIQggBigCBCEHDBwLIAYgCEEIdEGAgPwHcSAIQRh0ciAIQQh2QYD+A3EgCEEYdnJyIgQ2AhwgCiAENgIwIAZBvv4ANgIEQQAhCEEAIQMLIAYoAhBFBEAgCiAONgIQIAogETYCDCAKIAU2AgQgCiABNgIAIAYgAzYCQCAGIAg2AjxBAiEXDB4LIAZBATYCHCAKQQE2AjAgBkG//gA2AgQLAn8CQCAGKAIIRQRAIANBA0kNASADDAILIAZBzv4ANgIEIAggA0EHcXYhCCADQXhxIQMgBigCBCEHDBsLIAVFDRkgBUEBayEFIAEtAAAgA3QgCGohCCABQQFqIQEgA0EIagshBCAGIAhBAXE2AggCQAJAAkACQAJAIAhBAXZBA3FBAWsOAwECAwALIAZBwf4ANgIEDAMLIAZBsPMANgJQIAZCiYCAgNAANwJYIAZBsIMBNgJUIAZBx/4ANgIEDAILIAZBxP4ANgIEDAELIAZB0f4ANgIEIApB1w02AhgLIARBA2shAyAIQQN2IQggBigCBCEHDBkLIAYgCEEfcSIEQYECajYCZCAGIAhBBXZBH3EiB0EBajYCaCAGIAhBCnZBD3FBBGoiCzYCYCADQQ5rIQMgCEEOdiEIIARBHU1BACAHQR5JG0UEQCAGQdH+ADYCBCAKQeoJNgIYIAYoAgQhBwwZCyAGQcX+ADYCBEEAIQcgBkEANgJsCyAHIQQDQCADQQJNBEAgBUUNGCAFQQFrIQUgAS0AACADdCAIaiEIIANBCGohAyABQQFqIQELIAYgBEEBaiIHNgJsIAYgBEEBdEGwhAFqLwEAQQF0aiAIQQdxOwF0IANBA2shAyAIQQN2IQggCyAHIgRLDQALCyAHQRJNBEBBEiAHayENQQMgB2tBA3EiBARAA0AgBiAHQQF0QbCEAWovAQBBAXRqQQA7AXQgB0EBaiEHIARBAWsiBA0ACwsgDUEDTwRAA0AgBkH0AGoiBCAHQQF0Ig1BsIQBai8BAEEBdGpBADsBACAEIA1BsoQBai8BAEEBdGpBADsBACAEIA1BtIQBai8BAEEBdGpBADsBACAEIA1BtoQBai8BAEEBdGpBADsBACAHQQRqIgdBE0cNAAsLIAZBEzYCbAsgBkEHNgJYIAYgGDYCUCAGIBg2AnBBACEHQQAgHEETIBsgHSAaEFEiDQRAIAZB0f4ANgIEIApB9Ag2AhggBigCBCEHDBcLIAZBxv4ANgIEIAZBADYCbEEAIQ0LIAYoAmQiGSAGKAJoaiISIAdLBEBBfyAGKAJYdEF/cyEVIAYoAlAhEANAIAMhDCAFIQkgASELAkAgECAIIBVxIhNBAnRqLQABIg8gA00EQCADIQQMAQsDQCAJRQ0NIAstAAAgDHQhDyALQQFqIQsgCUEBayEJIAxBCGoiBCEMIAQgECAIIA9qIgggFXEiE0ECdGotAAEiD0kNAAsgCyEBIAkhBQsCQCAQIBNBAnRqLwECIgNBD00EQCAGIAdBAWoiCTYCbCAGIAdBAXRqIAM7AXQgBCAPayEDIAggD3YhCCAJIQcMAQsCfwJ/AkACQAJAIANBEGsOAgABAgsgD0ECaiIDIARLBEADQCAFRQ0bIAVBAWshBSABLQAAIAR0IAhqIQggAUEBaiEBIARBCGoiBCADSQ0ACwsgBCAPayEDIAggD3YhBCAHRQRAIAZB0f4ANgIEIApBvAk2AhggBCEIIAYoAgQhBwwdCyADQQJrIQMgBEECdiEIIARBA3FBA2ohCSAHQQF0IAZqLwFyDAMLIA9BA2oiAyAESwRAA0AgBUUNGiAFQQFrIQUgAS0AACAEdCAIaiEIIAFBAWohASAEQQhqIgQgA0kNAAsLIAQgD2tBA2shAyAIIA92IgRBA3YhCCAEQQdxQQNqDAELIA9BB2oiAyAESwRAA0AgBUUNGSAFQQFrIQUgAS0AACAEdCAIaiEIIAFBAWohASAEQQhqIgQgA0kNAAsLIAQgD2tBB2shAyAIIA92IgRBB3YhCCAEQf8AcUELagshCUEACyEEIAcgCWogEksNEyAJQQFrIQwgCUEDcSILBEADQCAGIAdBAXRqIAQ7AXQgB0EBaiEHIAlBAWshCSALQQFrIgsNAAsLIAxBA08EQANAIAYgB0EBdGoiCyAEOwF2IAsgBDsBdCALIAQ7AXggCyAEOwF6IAdBBGohByAJQQRrIgkNAAsLIAYgBzYCbAsgByASSQ0ACwsgBi8B9ARFBEAgBkHR/gA2AgQgCkHRCzYCGCAGKAIEIQcMFgsgBkEJNgJYIAYgGDYCUCAGIBg2AnBBASAcIBkgGyAdIBoQUSINBEAgBkHR/gA2AgQgCkHYCDYCGCAGKAIEIQcMFgsgBkEGNgJcIAYgBigCcDYCVEECIAYgBigCZEEBdGpB9ABqIAYoAmggGyAeIBoQUSINBEAgBkHR/gA2AgQgCkGmCTYCGCAGKAIEIQcMFgsgBkHH/gA2AgRBACENCyAGQcj+ADYCBAsCQCAFQQhJDQAgDkGCAkkNACAKIA42AhAgCiARNgIMIAogBTYCBCAKIAE2AgAgBiADNgJAIAYgCDYCPCMAQRBrIg8kACAKKAIMIgggCigCECIBaiERIAEgFmshASAKKAIAIgQgCigCBGohA0F/IAooAhwiDCgCXHQhBUF/IAwoAlh0IQcgDCgCOCEJAn9BACAMKAIsIhBFDQAaQQAgCCAJSQ0AGiAIQYICaiAJIBBqTQshICARQYECayETIAEgCGohISADQQdrIRIgBUF/cyEiIAdBf3MhIyAMKAJUIRUgDCgCUCEZIAwoAkAhBSAMNQI8IScgDCgCNCELIAwoAjAhJCARQQFqISUDQCAFQQ5LBH8gBQUgBCkAACAFrYYgJ4QhJyAEQQZqIQQgBUEwagsgGSAnpyAjcUECdGoiAy0AASIBayEFICcgAa2IIScCQAJ/AkADQCADLQAAIgFFBEAgCCADLQACOgAAIAhBAWoMAwsgAUEQcQRAIAMvAQIhBwJ/IAFBD3EiAyAFTQRAIAUhASAEDAELIAVBMGohASAEKQAAIAWthiAnhCEnIARBBmoLIQQgDyAnp0F/IAN0QX9zcSAHaiIONgIMICcgA62IIScCfyABIANrIgNBDksEQCAEIQEgAwwBCyAEQQZqIQEgBCkAACADrYYgJ4QhJyADQTBqCyAVICenICJxQQJ0aiIDLQABIgRrIQUgJyAErYghJyADLQAAIgdBEHENAgNAIAdBwABxRQRAIAUgFSADLwECQQJ0aiAnp0F/IAd0QX9zcUECdGoiAy0AASIEayEFICcgBK2IIScgAy0AACIHQRBxRQ0BDAQLCyAMQdH+ADYCBCAKQewONgIYIAEhBAwECyABQcAAcUUEQCAFIBkgAy8BAkECdGogJ6dBfyABdEF/c3FBAnRqIgMtAAEiAWshBSAnIAGtiCEnDAELCyABQSBxBEAgDEG//gA2AgQMAwsgDEHR/gA2AgQgCkHQDjYCGAwCCyADLwECISYCfyAHQQ9xIgMgBU0EQCABIQQgBQwBCyABQQZqIQQgASkAACAFrYYgJ4QhJyAFQTBqCyEFIA8gJ6dBfyADdEF/c3EgJmoiATYCCCAFIANrIQUgJyADrYghJwJAIAggIWsiAyABSQRAAkAgASADayIDICRNDQAgDCgCxDdFDQAgDEHR/gA2AgQgCkG5DDYCGAwECwJAIAtFBEAgCSAQIANraiEHDAELIAMgC00EQCAJIAsgA2tqIQcMAQsgCSAQIAMgC2siA2tqIQcgAyAOTw0AIA8gDiADazYCDCAIIAcgAyARQeSYASgCABEFACEIIA8oAgwhDiALIQMgCSEHCyADIA5PDQEgDyAOIANrNgIMIAggByADIBFB5JgBKAIAEQUAIA9BCGogD0EMakHomAEoAgARAAAiASABIA8oAghrIA8oAgwgEUHkmAEoAgARBQAMAgsgIARAAkAgASAOSQRAIAEgDCgC0DdJDQELIAggCCABayAOIBFB5JgBKAIAEQUADAMLIAggASAOICUgCGtB8JgBKAIAEQUADAILAkAgASAOSQRAIAEgDCgC0DdJDQELIAggCCABayAOQeCYASgCABEAAAwCCyAIIAEgDkHsmAEoAgARAAAMAQsgCCAHIA4gEUHkmAEoAgARBQALIQggBCASTw0AIAggE0kNAQsLIAogCDYCDCAKIAQgBUEDdmsiATYCACAKIBMgCGtBgQJqNgIQIAogEiABa0EHajYCBCAMIAVBB3EiATYCQCAMICdCfyABrYZCf4WDPgI8IA9BEGokACAGKAJAIQMgBigCPCEIIAooAgQhBSAKKAIAIQEgCigCECEOIAooAgwhESAGKAIEQb/+AEcNByAGQX82Asg3IAYoAgQhBwwUCyAGQQA2Asg3IAMhCSAFIQcgASEEAkAgBigCUCISIAhBfyAGKAJYdEF/cyIQcSIPQQJ0ai0AASILIANNBEAgAyEMDAELA0AgB0UNDyAELQAAIAl0IQsgBEEBaiEEIAdBAWshByAJQQhqIgwhCSAMIBIgCCALaiIIIBBxIg9BAnRqLQABIgtJDQALCyASIA9BAnRqIgEvAQIhEwJAQQAgAS0AACIQIBBB8AFxG0UEQCALIQUMAQsgByEFIAQhAQJAIAwiAyALIBIgCEF/IAsgEGp0QX9zIhVxIAt2IBNqIhBBAnRqLQABIg9qTwRAIAwhCQwBCwNAIAVFDQ8gAS0AACADdCEPIAFBAWohASAFQQFrIQUgA0EIaiIJIQMgCyASIAggD2oiCCAVcSALdiATaiIQQQJ0ai0AASIPaiAJSw0ACyABIQQgBSEHCyASIBBBAnRqIgEtAAAhECABLwECIRMgBiALNgLINyALIA9qIQUgCSALayEMIAggC3YhCCAPIQsLIAYgBTYCyDcgBiATQf//A3E2AkQgDCALayEDIAggC3YhCCAQRQRAIAZBzf4ANgIEDBALIBBBIHEEQCAGQb/+ADYCBCAGQX82Asg3DBALIBBBwABxBEAgBkHR/gA2AgQgCkHQDjYCGAwQCyAGQcn+ADYCBCAGIBBBD3EiDDYCTAsCQCAMRQRAIAYoAkQhCyAEIQEgByEFDAELIAMhCSAHIQUgBCELAkAgAyAMTwRAIAQhAQwBCwNAIAVFDQ0gBUEBayEFIAstAAAgCXQgCGohCCALQQFqIgEhCyAJQQhqIgkgDEkNAAsLIAYgBigCyDcgDGo2Asg3IAYgBigCRCAIQX8gDHRBf3NxaiILNgJEIAkgDGshAyAIIAx2IQgLIAZByv4ANgIEIAYgCzYCzDcLIAMhCSAFIQcgASEEAkAgBigCVCISIAhBfyAGKAJcdEF/cyIQcSIPQQJ0ai0AASIMIANNBEAgAyELDAELA0AgB0UNCiAELQAAIAl0IQwgBEEBaiEEIAdBAWshByAJQQhqIgshCSALIBIgCCAMaiIIIBBxIg9BAnRqLQABIgxJDQALCyASIA9BAnRqIgEvAQIhEwJAIAEtAAAiEEHwAXEEQCAGKALINyEFIAwhCQwBCyAHIQUgBCEBAkAgCyIDIAwgEiAIQX8gDCAQanRBf3MiFXEgDHYgE2oiEEECdGotAAEiCWpPBEAgCyEPDAELA0AgBUUNCiABLQAAIAN0IQkgAUEBaiEBIAVBAWshBSADQQhqIg8hAyAMIBIgCCAJaiIIIBVxIAx2IBNqIhBBAnRqLQABIglqIA9LDQALIAEhBCAFIQcLIBIgEEECdGoiAS0AACEQIAEvAQIhEyAGIAYoAsg3IAxqIgU2Asg3IA8gDGshCyAIIAx2IQgLIAYgBSAJajYCyDcgCyAJayEDIAggCXYhCCAQQcAAcQRAIAZB0f4ANgIEIApB7A42AhggBCEBIAchBSAGKAIEIQcMEgsgBkHL/gA2AgQgBiAQQQ9xIgw2AkwgBiATQf//A3E2AkgLAkAgDEUEQCAEIQEgByEFDAELIAMhCSAHIQUgBCELAkAgAyAMTwRAIAQhAQwBCwNAIAVFDQggBUEBayEFIAstAAAgCXQgCGohCCALQQFqIgEhCyAJQQhqIgkgDEkNAAsLIAYgBigCyDcgDGo2Asg3IAYgBigCSCAIQX8gDHRBf3NxajYCSCAJIAxrIQMgCCAMdiEICyAGQcz+ADYCBAsgDkUNAAJ/IAYoAkgiBCAWIA5rIgdLBEACQCAEIAdrIgcgBigCME0NACAGKALEN0UNACAGQdH+ADYCBCAKQbkMNgIYIAYoAgQhBwwSCyARAn8gBigCNCIEIAdJBEAgBigCOCAGKAIsIAcgBGsiB2tqDAELIAYoAjggBCAHa2oLIA4gBigCRCIEIAcgBCAHSRsiBCAEIA5LGyIHIA4gEWpB5JgBKAIAEQUADAELIBEgBCAOIAYoAkQiBCAEIA5LGyIHIA5B8JgBKAIAEQUACyERIAYgBigCRCAHayIENgJEIA4gB2shDiAEDQIgBkHI/gA2AgQgBigCBCEHDA8LIA0hCQsgCSEEDA4LIAYoAgQhBwwMCyABIAVqIQEgAyAFQQN0aiEDDAoLIAQgB2ohASADIAdBA3RqIQMMCQsgBCAHaiEBIAsgB0EDdGohAwwICyABIAVqIQEgAyAFQQN0aiEDDAcLIAQgB2ohASADIAdBA3RqIQMMBgsgBCAHaiEBIAwgB0EDdGohAwwFCyABIAVqIQEgAyAFQQN0aiEDDAQLIAZB0f4ANgIEIApBvAk2AhggBigCBCEHDAQLIAQhASAHIQUgBigCBCEHDAMLQQAhBSAEIQMgDSEEDAMLAkACQCAHRQRAIAghCQwBCyAGKAIURQRAIAghCQwBCwJAIANBH0sNACAFRQ0DIANBCGohBCABQQFqIQkgBUEBayELIAEtAAAgA3QgCGohCCADQRhPBEAgCSEBIAshBSAEIQMMAQsgC0UEQCAJIQFBACEFIAQhAyANIQQMBgsgA0EQaiEJIAFBAmohCyAFQQJrIQwgAS0AASAEdCAIaiEIIANBD0sEQCALIQEgDCEFIAkhAwwBCyAMRQRAIAshAUEAIQUgCSEDIA0hBAwGCyADQRhqIQQgAUEDaiELIAVBA2shDCABLQACIAl0IAhqIQggA0EHSwRAIAshASAMIQUgBCEDDAELIAxFBEAgCyEBQQAhBSAEIQMgDSEEDAYLIANBIGohAyAFQQRrIQUgAS0AAyAEdCAIaiEIIAFBBGohAQtBACEJIAdBBHEEQCAIIAYoAiBHDQILQQAhAwsgBkHQ/gA2AgRBASEEIAkhCAwDCyAGQdH+ADYCBCAKQY0MNgIYIAYoAgQhBwwBCwtBACEFIA0hBAsgCiAONgIQIAogETYCDCAKIAU2AgQgCiABNgIAIAYgAzYCQCAGIAg2AjwCQAJAAkAgBigCLA0AIA4gFkYNASAGKAIEIgFB0P4ASw0BIAFBzv4ASQ0ACyAKKAIcIgEoAjhFBEAgASABKAIAIgMoAihBASABKAIodCIFIAEoAtA3akEBIAMoAiARAAAiAzYCOCADRQ0CIAMgBWpBACABKALQNxAaCyABKAIsIgVFBEAgAUIANwIwIAFBASABKAIodCIFNgIsCyAWIA5rIgMgBU8EQCABKAI4IBEgBWsgBRAJGiABQQA2AjQgASABKAIsNgIwDAELIAEoAjQiDSABKAI4aiARIANrIAMgBSANayIFIAMgBUkbIgUQCRogAyAFayIDBEAgASgCOCARIANrIAMQCRogASADNgI0IAEgASgCLDYCMAwBCyABQQAgASgCNCAFaiIDIAMgASgCLCINRhs2AjQgASgCMCIDIA1PDQAgASADIAVqNgIwCyAKIB8gCigCBGsiBSAKKAIIajYCCCAKIBYgCigCEGsiASAKKAIUajYCFCAGIAYoAiAgAWo2AiACQCAGLQAMQQRxRQ0AIAFFDQAgBgJ/IAYoAhQEQAJ/IAYoAhwhA0EAIAooAgwgAWsiDUUNABogAyANIAGtQcyYASgCABEDAAsMAQsgBigCHCAKKAIMIAFrIAFByJgBKAIAEQAACyIDNgIcIAogAzYCMAsgCiAGKAJAIAYoAghBAEdBBnRqIAYoAgQiA0G//gBGQQd0akGAAiADQcL+AEZBCHQgA0HH/gBGG2o2AiwgBCAEQXsgBBsgASAFchshFwwCCyAGQdL+ADYCBAtBfCEXCyAUQRBqJAAgFwshASACIAIpAwAgADUCIH03AwACQAJAAkACQCABQQVqDgcBAgICAgMAAgtBAQ8LIAAoAhQNAEEDDwsgACgCACIABEAgACABNgIEIABBDTYCAAtBAiEBCyABCwkAIABBAToADAtEAAJAIAJC/////w9YBEAgACgCFEUNAQsgACgCACIABEAgAEEANgIEIABBEjYCAAtBAA8LIAAgATYCECAAIAI+AhRBAQu6AQEEfyAAQRBqIQECfyAALQAEBEAgARBeDAELQX4hAwJAIAFFDQAgASgCIEUNACABKAIkIgRFDQAgASgCHCICRQ0AIAIoAgAgAUcNACACKAIEQbT+AGtBH0sNACACKAI4IgMEQCABKAIoIAMgBBEGACABKAIkIQQgASgCHCECCyABKAIoIAIgBBEGAEEAIQMgAUEANgIcCyADCyIBBEAgACgCACIABEAgACABNgIEIABBDTYCAAsLIAFFC5gMAQZ/IABCADcCECAAQgA3AhwgAEEQaiEBAn8gAC0ABARAAn8gACgCCCECQXohBQJAQesMLQAAQTFHDQBBfiEFIAFFDQAgAUEANgIYIAEoAiAiA0UEQCABQQA2AiggAUECNgIgQQIhAwsgASgCJEUEQCABQQM2AiQLQQYgAiACQX9GGyIGQQBIDQAgBkEJSg0AQXwhBSABKAIoQQFB8C0gAxEAACIERQ0AIAEgBDYCHCAEIAE2AgAgBEENQQ8gBkEBRhsiAzYCNCAEQoCAgICgBTcCHCAEQQA2AhQgBEEBIAN0IgM2AjAgBCADQQFrNgI4IAQgASgCKCADQQIgASgCIBEAADYCSCAEIAEoAiggBCgCMEECIAEoAiARAAAiAzYCTCADQQAgBCgCMEEBdBAaIAEoAihBgIAEQQIgASgCIBEAACEDIARBgIACNgKMLSAEQQA2AkAgBCADNgJQIAQgASgCKEGAgAJBBCABKAIgEQAAIgI2AgQgBCAEKAKMLSIDQQJ0NgIMAkACQCAEKAJIRQ0AIAQoAkxFDQAgBCgCUEUNACACDQELIARBmgU2AiAgAUGY8QAoAgA2AhggARBeGkF8DAILIARBADYCfCAEIAY2AnggBEIANwMoIAQgAiADajYCkC0gBCADQQNsQQNrNgKYLQJ/QX4hBQJAIAFFDQAgASgCIEUNACABKAIkRQ0AIAEoAhwiAkUNACACKAIAIAFHDQACQAJAIAIoAiAiA0E5aw45AQICAgICAgICAgICAQICAgECAgICAgICAgICAgICAgICAgECAgICAgICAgICAgECAgICAgICAgIBAAsgA0GaBUYNACADQSpHDQELIAFBAjYCLCABQQA2AgggAUIANwIUIAJBADYCECACIAIoAgQ2AgggAigCFCIFQX9MBEAgAkEAIAVrIgU2AhQLIAJBOUEqIAVBAkYbNgIgAkAgBUECRgRAIAIoAgBBADYCMAwBCyABQQE2AjALIAJBfjYCJCACQQA2AsAtIAJCADcDuC0gAkGsFmpB8O0ANgIAIAIgAkHwFGo2AqQWIAJBoBZqQdztADYCACACIAJB/BJqNgKYFiACQZQWakHI7QA2AgAgAiACQYgBajYCjBYgAhCNAUEAIQULIAVFCwRAIAEoAhwiAyADKAIwQQF0NgJEIAMoAlBBAEGAgAgQGiADQQA2AlQgA0EANgKoLSADQQA2AjwgA0KAgICAIDcDaCADQgA3A2AgAyADKAJ4QQxsIgFB1NoAai8BADYChAEgAyABQdDaAGovAQA2AoABIAMgAUHS2gBqLwEANgJ0IAMgAUHW2gBqLwEANgJwCwsgBQsMAQsCf0F6QesMLQAAQTFHDQAaQX4gAUUNABogAUEANgIYIAEoAiAiBUUEQCABQQA2AiggAUECNgIgQQIhBQsgASgCJEUEQCABQQM2AiQLQXwgASgCKEEBQdQ3IAURAAAiBkUNABogASAGNgIcIAZBADYCOCAGIAE2AgAgBkG0/gA2AgQgBkHcmAEoAgARCQA2AtA3QX4hBQJAIAFFDQAgASgCIEUNACABKAIkIgJFDQAgASgCHCIERQ0AIAQoAgAgAUcNACAEKAIEQbT+AGtBH0sNAAJAAkAgBCgCOCIDBEAgBCgCKEEPRw0BCyAEQQ82AiggBEEANgIMDAELIAEoAiggAyACEQYAIARBADYCOCABKAIgIQMgBEEPNgIoIARBADYCDCADRQ0BCyABKAIkRQ0AIAEoAhwiAkUNACACKAIAIAFHDQAgAigCBEG0/gBrQR9LDQBBACEFIAJBADYCNCACQgA3AiwgAkEANgIgIAFBADYCCCABQgA3AhQgAigCDCIDBEAgASADQQFxNgIwCyACQrT+ADcCBCACQgA3AjwgAkEANgIkIAJCgICCgBA3AhggAkKAgICAcDcCECACQoGAgIBwNwLENyACIAJBtApqIgM2AnAgAiADNgJUIAIgAzYCUAtBACAFRQ0AGiABKAIoIAYgASgCJBEGACABQQA2AhwgBQsLIgEEQCAAKAIAIgAEQCAAIAE2AgQgAEENNgIACwsgAUULKQEBfyAALQAERQRAQQAPC0ECIQEgACgCCCIAQQNOBH8gAEEHSgVBAgsLBgAgABAGC2MAQcgAEAgiAEUEQEH4mwEoAgAhASACBEAgAiABNgIEIAJBATYCAAsgAA8LIABBADoADCAAQQE6AAQgACACNgIAIABBADYCOCAAQgA3AzAgACABQQkgAUEBa0EJSRs2AgggAAuMCgIBfgJ/IwBB8ABrIgYkAAJAAkACQAJAAkACQAJAAkAgBA4PAAEHAgQFBgYGBgYGBgYDBgtCfyEFAkAgACAGQeQAakIMEBEiA0J/VwRAIAEEQCABIAAoAgw2AgAgASAAKAIQNgIECwwBCwJAIANCDFIEQCABBEAgAUEANgIEIAFBETYCAAsMAQsgASgCFCEEQQAhAkIBIQUDQCAGQeQAaiACaiICIAItAAAgBEH9/wNxIgJBAnIgAkEDc2xBCHZzIgI6AAAgBiACOgAoIAECfyABKAIMQX9zIQJBACAGQShqIgRFDQAaIAIgBEIBQcyYASgCABEDAAtBf3MiAjYCDCABIAEoAhAgAkH/AXFqQYWIosAAbEEBaiICNgIQIAYgAkEYdjoAKCABAn8gASgCFEF/cyECQQAgBkEoaiIERQ0AGiACIARCAUHMmAEoAgARAwALQX9zIgQ2AhQgBUIMUgRAIAWnIQIgBUIBfCEFDAELC0IAIQUgACAGQShqECFBAEgNASAGKAJQIQAjAEEQayICJAAgAiAANgIMIAYCfyACQQxqEIkBIgBFBEAgBkEhOwEkQQAMAQsCfyAAKAIUIgRB0ABOBEAgBEEJdAwBCyAAQdAANgIUQYDAAgshBCAGIAAoAgwgBCAAKAIQQQV0ampBoMABajsBJCAAKAIEQQV0IAAoAghBC3RqIAAoAgBBAXZqCzsBJiACQRBqJAAgBi0AbyIAIAYtAFdGDQEgBi0AJyAARg0BIAEEQCABQQA2AgQgAUEbNgIACwtCfyEFCyAGQfAAaiQAIAUPC0J/IQUgACACIAMQESIDQn9XBEAgAQRAIAEgACgCDDYCACABIAAoAhA2AgQLDAYLIwBBEGsiACQAAkAgA1ANACABKAIUIQQgAkUEQEIBIQUDQCAAIAIgB2otAAAgBEH9/wNxIgRBAnIgBEEDc2xBCHZzOgAPIAECfyABKAIMQX9zIQRBACAAQQ9qIgdFDQAaIAQgB0IBQcyYASgCABEDAAtBf3MiBDYCDCABIAEoAhAgBEH/AXFqQYWIosAAbEEBaiIENgIQIAAgBEEYdjoADyABAn8gASgCFEF/cyEEQQAgAEEPaiIHRQ0AGiAEIAdCAUHMmAEoAgARAwALQX9zIgQ2AhQgAyAFUQ0CIAWnIQcgBUIBfCEFDAALAAtCASEFA0AgACACIAdqLQAAIARB/f8DcSIEQQJyIARBA3NsQQh2cyIEOgAPIAIgB2ogBDoAACABAn8gASgCDEF/cyEEQQAgAEEPaiIHRQ0AGiAEIAdCAUHMmAEoAgARAwALQX9zIgQ2AgwgASABKAIQIARB/wFxakGFiKLAAGxBAWoiBDYCECAAIARBGHY6AA8gAQJ/IAEoAhRBf3MhBEEAIABBD2oiB0UNABogBCAHQgFBzJgBKAIAEQMAC0F/cyIENgIUIAMgBVENASAFpyEHIAVCAXwhBQwACwALIABBEGokACADIQUMBQsgAkEAOwEyIAIgAikDACIDQoABhDcDACADQgiDUA0EIAIgAikDIEIMfTcDIAwECyAGQoWAgIBwNwMQIAZCg4CAgMAANwMIIAZCgYCAgCA3AwBBACAGECQhBQwDCyADQghaBH4gAiABKAIANgIAIAIgASgCBDYCBEIIBUJ/CyEFDAILIAEQBgwBCyABBEAgAUEANgIEIAFBEjYCAAtCfyEFCyAGQfAAaiQAIAULrQMCAn8CfiMAQRBrIgYkAAJAAkACQCAERQ0AIAFFDQAgAkEBRg0BC0EAIQMgAEEIaiIABEAgAEEANgIEIABBEjYCAAsMAQsgA0EBcQRAQQAhAyAAQQhqIgAEQCAAQQA2AgQgAEEYNgIACwwBC0EYEAgiBUUEQEEAIQMgAEEIaiIABEAgAEEANgIEIABBDjYCAAsMAQsgBUEANgIIIAVCADcCACAFQZDx2aIDNgIUIAVC+KzRkZHx2aIjNwIMAkAgBBAiIgJFDQAgAq0hCEEAIQNBh9Ou7n4hAkIBIQcDQCAGIAMgBGotAAA6AA8gBSAGQQ9qIgMEfyACIANCAUHMmAEoAgARAwAFQQALQX9zIgI2AgwgBSAFKAIQIAJB/wFxakGFiKLAAGxBAWoiAjYCECAGIAJBGHY6AA8gBQJ/IAUoAhRBf3MhAkEAIAZBD2oiA0UNABogAiADQgFBzJgBKAIAEQMAC0F/czYCFCAHIAhRDQEgBSgCDEF/cyECIAenIQMgB0IBfCEHDAALAAsgACABQSQgBRBDIgMNACAFEAZBACEDCyAGQRBqJAAgAwudGgIGfgV/IwBB0ABrIgskAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMOFAUGFQsDBAkOAAIIEAoPDQcRAREMEQsCQEHIABAIIgEEQCABQgA3AwAgAUIANwMwIAFBADYCKCABQgA3AyAgAUIANwMYIAFCADcDECABQgA3AwggAUIANwM4IAFBCBAIIgM2AgQgAw0BIAEQBiAABEAgAEEANgIEIABBDjYCAAsLIABBADYCFAwUCyADQgA3AwAgACABNgIUIAFBQGtCADcDACABQgA3AzgMFAsCQAJAIAJQBEBByAAQCCIDRQ0UIANCADcDACADQgA3AzAgA0EANgIoIANCADcDICADQgA3AxggA0IANwMQIANCADcDCCADQgA3AzggA0EIEAgiATYCBCABDQEgAxAGIAAEQCAAQQA2AgQgAEEONgIACwwUCyACIAAoAhAiASkDMFYEQCAABEAgAEEANgIEIABBEjYCAAsMFAsgASgCKARAIAAEQCAAQQA2AgQgAEEdNgIACwwUCyABKAIEIQMCQCABKQMIIgZCAX0iB1ANAANAAkAgAiADIAcgBH1CAYggBHwiBadBA3RqKQMAVARAIAVCAX0hBwwBCyAFIAZRBEAgBiEFDAMLIAMgBUIBfCIEp0EDdGopAwAgAlYNAgsgBCEFIAQgB1QNAAsLAkAgAiADIAWnIgpBA3RqKQMAfSIEUEUEQCABKAIAIgMgCkEEdGopAwghBwwBCyABKAIAIgMgBUIBfSIFp0EEdGopAwgiByEECyACIAcgBH1UBEAgAARAIABBADYCBCAAQRw2AgALDBQLIAMgBUIBfCIFQQAgABCHASIDRQ0TIAMoAgAgAygCCCIKQQR0akEIayAENwMAIAMoAgQgCkEDdGogAjcDACADIAI3AzAgAyABKQMYIgYgAykDCCIEQgF9IgcgBiAHVBs3AxggASADNgIoIAMgATYCKCABIAQ3AyAgAyAFNwMgDAELIAFCADcDAAsgACADNgIUIAMgBDcDQCADIAI3AzhCACEEDBMLIAAoAhAiAQRAAkAgASgCKCIDRQRAIAEpAxghAgwBCyADQQA2AiggASgCKEIANwMgIAEgASkDGCICIAEpAyAiBSACIAVWGyICNwMYCyABKQMIIAJWBEADQCABKAIAIAKnQQR0aigCABAGIAJCAXwiAiABKQMIVA0ACwsgASgCABAGIAEoAgQQBiABEAYLIAAoAhQhASAAQQA2AhQgACABNgIQDBILIAJCCFoEfiABIAAoAgA2AgAgASAAKAIENgIEQggFQn8LIQQMEQsgACgCECIBBEACQCABKAIoIgNFBEAgASkDGCECDAELIANBADYCKCABKAIoQgA3AyAgASABKQMYIgIgASkDICIFIAIgBVYbIgI3AxgLIAEpAwggAlYEQANAIAEoAgAgAqdBBHRqKAIAEAYgAkIBfCICIAEpAwhUDQALCyABKAIAEAYgASgCBBAGIAEQBgsgACgCFCIBBEACQCABKAIoIgNFBEAgASkDGCECDAELIANBADYCKCABKAIoQgA3AyAgASABKQMYIgIgASkDICIFIAIgBVYbIgI3AxgLIAEpAwggAlYEQANAIAEoAgAgAqdBBHRqKAIAEAYgAkIBfCICIAEpAwhUDQALCyABKAIAEAYgASgCBBAGIAEQBgsgABAGDBALIAAoAhAiAEIANwM4IABBQGtCADcDAAwPCyACQn9XBEAgAARAIABBADYCBCAAQRI2AgALDA4LIAIgACgCECIDKQMwIAMpAzgiBn0iBSACIAVUGyIFUA0OIAEgAykDQCIHpyIAQQR0IgEgAygCAGoiCigCACAGIAMoAgQgAEEDdGopAwB9IgKnaiAFIAopAwggAn0iBiAFIAZUGyIEpxAJIQogByAEIAMoAgAiACABaikDCCACfVGtfCECIAUgBlYEQANAIAogBKdqIAAgAqdBBHQiAWoiACgCACAFIAR9IgYgACkDCCIHIAYgB1QbIganEAkaIAIgBiADKAIAIgAgAWopAwhRrXwhAiAFIAQgBnwiBFYNAAsLIAMgAjcDQCADIAMpAzggBHw3AzgMDgtCfyEEQcgAEAgiA0UNDSADQgA3AwAgA0IANwMwIANBADYCKCADQgA3AyAgA0IANwMYIANCADcDECADQgA3AwggA0IANwM4IANBCBAIIgE2AgQgAUUEQCADEAYgAARAIABBADYCBCAAQQ42AgALDA4LIAFCADcDACAAKAIQIgEEQAJAIAEoAigiCkUEQCABKQMYIQQMAQsgCkEANgIoIAEoAihCADcDICABIAEpAxgiAiABKQMgIgUgAiAFVhsiBDcDGAsgASkDCCAEVgRAA0AgASgCACAEp0EEdGooAgAQBiAEQgF8IgQgASkDCFQNAAsLIAEoAgAQBiABKAIEEAYgARAGCyAAIAM2AhBCACEEDA0LIAAoAhQiAQRAAkAgASgCKCIDRQRAIAEpAxghAgwBCyADQQA2AiggASgCKEIANwMgIAEgASkDGCICIAEpAyAiBSACIAVWGyICNwMYCyABKQMIIAJWBEADQCABKAIAIAKnQQR0aigCABAGIAJCAXwiAiABKQMIVA0ACwsgASgCABAGIAEoAgQQBiABEAYLIABBADYCFAwMCyAAKAIQIgMpAzggAykDMCABIAIgABBFIgdCAFMNCiADIAc3AzgCQCADKQMIIgZCAX0iAlANACADKAIEIQADQAJAIAcgACACIAR9QgGIIAR8IgWnQQN0aikDAFQEQCAFQgF9IQIMAQsgBSAGUQRAIAYhBQwDCyAAIAVCAXwiBKdBA3RqKQMAIAdWDQILIAQhBSACIARWDQALCyADIAU3A0BCACEEDAsLIAAoAhQiAykDOCADKQMwIAEgAiAAEEUiB0IAUw0JIAMgBzcDOAJAIAMpAwgiBkIBfSICUA0AIAMoAgQhAANAAkAgByAAIAIgBH1CAYggBHwiBadBA3RqKQMAVARAIAVCAX0hAgwBCyAFIAZRBEAgBiEFDAMLIAAgBUIBfCIEp0EDdGopAwAgB1YNAgsgBCEFIAIgBFYNAAsLIAMgBTcDQEIAIQQMCgsgAkI3WARAIAAEQCAAQQA2AgQgAEESNgIACwwJCyABECogASAAKAIMNgIoIAAoAhApAzAhAiABQQA2AjAgASACNwMgIAEgAjcDGCABQtwBNwMAQjghBAwJCyAAIAEoAgA2AgwMCAsgC0FAa0F/NgIAIAtCi4CAgLACNwM4IAtCjICAgNABNwMwIAtCj4CAgKABNwMoIAtCkYCAgJABNwMgIAtCh4CAgIABNwMYIAtChYCAgOAANwMQIAtCg4CAgMAANwMIIAtCgYCAgCA3AwBBACALECQhBAwHCyAAKAIQKQM4IgRCf1UNBiAABEAgAEE9NgIEIABBHjYCAAsMBQsgACgCFCkDOCIEQn9VDQUgAARAIABBPTYCBCAAQR42AgALDAQLQn8hBCACQn9XBEAgAARAIABBADYCBCAAQRI2AgALDAULIAIgACgCFCIDKQM4IAJ8IgVC//8DfCIEVgRAIAAEQCAAQQA2AgQgAEESNgIACwwECwJAIAUgAygCBCIKIAMpAwgiBqdBA3RqKQMAIgdYDQACQCAEIAd9QhCIIAZ8IgggAykDECIJWA0AQhAgCSAJUBshBQNAIAUiBEIBhiEFIAQgCFQNAAsgBCAJVA0AIAMoAgAgBKciCkEEdBAzIgxFDQMgAyAMNgIAIAMoAgQgCkEDdEEIahAzIgpFDQMgAyAENwMQIAMgCjYCBCADKQMIIQYLIAYgCFoNACADKAIAIQwDQCAMIAanQQR0aiINQYCABBAIIg42AgAgDkUEQCAABEAgAEEANgIEIABBDjYCAAsMBgsgDUKAgAQ3AwggAyAGQgF8IgU3AwggCiAFp0EDdGogB0KAgAR8Igc3AwAgAykDCCIGIAhUDQALCyADKQNAIQUgAykDOCEHAkAgAlAEQEIAIQQMAQsgBaciAEEEdCIMIAMoAgBqIg0oAgAgByAKIABBA3RqKQMAfSIGp2ogASACIA0pAwggBn0iByACIAdUGyIEpxAJGiAFIAQgAygCACIAIAxqKQMIIAZ9Ua18IQUgAiAHVgRAA0AgACAFp0EEdCIKaiIAKAIAIAEgBKdqIAIgBH0iBiAAKQMIIgcgBiAHVBsiBqcQCRogBSAGIAMoAgAiACAKaikDCFGtfCEFIAQgBnwiBCACVA0ACwsgAykDOCEHCyADIAU3A0AgAyAEIAd8IgI3AzggAiADKQMwWA0EIAMgAjcDMAwECyAABEAgAEEANgIEIABBHDYCAAsMAgsgAARAIABBADYCBCAAQQ42AgALIAAEQCAAQQA2AgQgAEEONgIACwwBCyAAQQA2AhQLQn8hBAsgC0HQAGokACAECwcAIAAvATALBgAgARAGC58DAQV/IwBBEGsiACQAIAEgAmwiAUGAf0sEf0EwBQJ/IAFBgH9PBEBB+JsBQTA2AgBBAAwBC0EAQRAgAUELakF4cSABQQtJGyIFQcwAahAIIgFFDQAaIAFBCGshAgJAIAFBP3FFBEAgAiEBDAELIAFBBGsiBigCACIHQXhxIAFBP2pBQHFBCGsiASABQUBrIAEgAmtBD0sbIgEgAmsiA2shBCAHQQNxRQRAIAIoAgAhAiABIAQ2AgQgASACIANqNgIADAELIAEgBCABKAIEQQFxckECcjYCBCABIARqIgQgBCgCBEEBcjYCBCAGIAMgBigCAEEBcXJBAnI2AgAgAiADaiIEIAQoAgRBAXI2AgQgAiADEDsLAkAgASgCBCICQQNxRQ0AIAJBeHEiAyAFQRBqTQ0AIAEgBSACQQFxckECcjYCBCABIAVqIgIgAyAFayIFQQNyNgIEIAEgA2oiAyADKAIEQQFyNgIEIAIgBRA7CyABQQhqCyIBBH8gACABNgIMQQAFQTALCyEBIAAoAgwhAiAAQRBqJABBACACIAEbCwcAIAAoAiALEgBB2JgBQRU2AgAgACABEJABCxIAQdSYAUEUNgIAIAAgARCRAQsnAEH0mwEtAABFBEBB9JsBQQE6AAALQcyYAUETNgIAIAAgASACEGALFgBB8JgBQRI2AgAgACABIAIgAxCSAQsTAEHsmAFBETYCACAAIAEgAhBWCxMAQeiYAUEQNgIAIAAgASACEFgLFQBB5JgBQQ82AgAgACABIAIgAxBZCwcAIAAoAgALEwBB4JgBQQ42AgAgACABIAIQWgshAEHcmAFBDTYCAEH0mwEtAABFBEBB9JsBQQE6AAALQQgLJwBByJgBQQw2AgBB9JsBLQAARQRAQfSbAUEBOgAACyAAIAEgAhBbCyMAQdCYAUELNgIAQfSbAS0AAEUEQEH0mwFBAToAAAsgABBfCxIAQcSYAUEKNgIAIAAgARCPAQsoAEHAmAFBCTYCAEH0mwEtAABFBEBB9JsBQQE6AAALIAAgASACEI4BCxgAQeibAUIANwIAQfCbAUEANgIAQeibAQuFAQIEfwF+IwBBEGsiASQAAkAgACkDMFAEQAwBCwNAAkAgACAFQQAgAUEPaiABQQhqEGoiBEF/Rg0AIAEtAA9BA0cNACACIAEoAghBgICAgH9xQYCAgIB6RmohAgtBfyEDIARBf0YNASACIQMgBUIBfCIFIAApAzBUDQALCyABQRBqJAAgAwsLho0BJQBBgAgLsQtpbnN1ZmZpY2llbnQgbWVtb3J5AG5lZWQgZGljdGlvbmFyeQAtKyAgIDBYMHgAWmlwIGFyY2hpdmUgaW5jb25zaXN0ZW50AEludmFsaWQgYXJndW1lbnQAaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0AGludmFsaWQgY29kZSBsZW5ndGhzIHNldAB1bmtub3duIGhlYWRlciBmbGFncyBzZXQAaW52YWxpZCBkaXN0YW5jZXMgc2V0AGludmFsaWQgYml0IGxlbmd0aCByZXBlYXQARmlsZSBhbHJlYWR5IGV4aXN0cwB0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scwBpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzACVzJXMlcwBidWZmZXIgZXJyb3IATm8gZXJyb3IAc3RyZWFtIGVycm9yAFRlbGwgZXJyb3IASW50ZXJuYWwgZXJyb3IAU2VlayBlcnJvcgBXcml0ZSBlcnJvcgBmaWxlIGVycm9yAFJlYWQgZXJyb3IAWmxpYiBlcnJvcgBkYXRhIGVycm9yAENSQyBlcnJvcgBpbmNvbXBhdGlibGUgdmVyc2lvbgBpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2sAaW5jb3JyZWN0IGhlYWRlciBjaGVjawBpbmNvcnJlY3QgbGVuZ3RoIGNoZWNrAGluY29ycmVjdCBkYXRhIGNoZWNrAGludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrAGhlYWRlciBjcmMgbWlzbWF0Y2gAMS4yLjExLnpsaWItbmcAaW52YWxpZCB3aW5kb3cgc2l6ZQBSZWFkLW9ubHkgYXJjaGl2ZQBOb3QgYSB6aXAgYXJjaGl2ZQBSZXNvdXJjZSBzdGlsbCBpbiB1c2UATWFsbG9jIGZhaWx1cmUAaW52YWxpZCBibG9jayB0eXBlAEZhaWx1cmUgdG8gY3JlYXRlIHRlbXBvcmFyeSBmaWxlAENhbid0IG9wZW4gZmlsZQBObyBzdWNoIGZpbGUAUHJlbWF0dXJlIGVuZCBvZiBmaWxlAENhbid0IHJlbW92ZSBmaWxlAGludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZQBpbnZhbGlkIGRpc3RhbmNlIGNvZGUAdW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QAc3RyZWFtIGVuZABDb21wcmVzc2VkIGRhdGEgaW52YWxpZABNdWx0aS1kaXNrIHppcCBhcmNoaXZlcyBub3Qgc3VwcG9ydGVkAE9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkAEVuY3J5cHRpb24gbWV0aG9kIG5vdCBzdXBwb3J0ZWQAQ29tcHJlc3Npb24gbWV0aG9kIG5vdCBzdXBwb3J0ZWQARW50cnkgaGFzIGJlZW4gZGVsZXRlZABDb250YWluaW5nIHppcCBhcmNoaXZlIHdhcyBjbG9zZWQAQ2xvc2luZyB6aXAgYXJjaGl2ZSBmYWlsZWQAUmVuYW1pbmcgdGVtcG9yYXJ5IGZpbGUgZmFpbGVkAEVudHJ5IGhhcyBiZWVuIGNoYW5nZWQATm8gcGFzc3dvcmQgcHJvdmlkZWQAV3JvbmcgcGFzc3dvcmQgcHJvdmlkZWQAVW5rbm93biBlcnJvciAlZABBRQAobnVsbCkAOiAAUEsGBwBQSwYGAFBLBQYAUEsDBABQSwECAAAAAD8FAADABwAAkwgAAHgIAABvBQAAkQUAAHoFAACyBQAAVggAABsHAADWBAAACwcAAOoGAACcBQAAyAYAALIIAAAeCAAAKAcAAEcEAACgBgAAYAUAAC4EAAA+BwAAPwgAAP4HAACOBgAAyQgAAN4IAADmBwAAsgYAAFUFAACoBwAAIABByBMLEQEAAAABAAAAAQAAAAEAAAABAEHsEwsJAQAAAAEAAAACAEGYFAsBAQBBuBQLAQEAQdIUC/5DOiY7JmUmZiZjJmAmIiDYJcsl2SVCJkAmaiZrJjwmuiXEJZUhPCC2AKcArCWoIZEhkyGSIZAhHyKUIbIlvCUgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQBiAGMAZABlAGYAZwBoAGkAagBrAGwAbQBuAG8AcABxAHIAcwB0AHUAdgB3AHgAeQB6AHsAfAB9AH4AAiPHAPwA6QDiAOQA4ADlAOcA6gDrAOgA7wDuAOwAxADFAMkA5gDGAPQA9gDyAPsA+QD/ANYA3ACiAKMApQCnIJIB4QDtAPMA+gDxANEAqgC6AL8AECOsAL0AvAChAKsAuwCRJZIlkyUCJSQlYSViJVYlVSVjJVElVyVdJVwlWyUQJRQlNCUsJRwlACU8JV4lXyVaJVQlaSVmJWAlUCVsJWclaCVkJWUlWSVYJVIlUyVrJWolGCUMJYglhCWMJZAlgCWxA98AkwPAA6MDwwO1AMQDpgOYA6kDtAMeIsYDtQMpImEisQBlImQiICMhI/cASCKwABkitwAaIn8gsgCgJaAAAAAAAJYwB3csYQ7uulEJmRnEbQeP9GpwNaVj6aOVZJ4yiNsOpLjceR7p1eCI2dKXK0y2Cb18sX4HLbjnkR2/kGQQtx3yILBqSHG5895BvoR91Noa6+TdbVG11PTHhdODVphsE8Coa2R6+WL97Mllik9cARTZbAZjYz0P+vUNCI3IIG47XhBpTORBYNVycWei0eQDPEfUBEv9hQ3Sa7UKpfqotTVsmLJC1sm720D5vKzjbNgydVzfRc8N1txZPdGrrDDZJjoA3lGAUdfIFmHQv7X0tCEjxLNWmZW6zw+lvbieuAIoCIgFX7LZDMYk6Quxh3xvLxFMaFirHWHBPS1mtpBB3HYGcdsBvCDSmCoQ1e+JhbFxH7W2BqXkv58z1LjooskHeDT5AA+OqAmWGJgO4bsNan8tPW0Il2xkkQFcY+b0UWtrYmFsHNgwZYVOAGLy7ZUGbHulARvB9AiCV8QP9cbZsGVQ6bcS6ri+i3yIufzfHd1iSS3aFfN804xlTNT7WGGyTc5RtTp0ALyj4jC71EGl30rXldg9bcTRpPv01tNq6WlD/NluNEaIZ63QuGDacy0EROUdAzNfTAqqyXwN3TxxBVCqQQInEBALvoYgDMkltWhXs4VvIAnUZrmf5GHODvneXpjJ2SkimNCwtKjXxxc9s1mBDbQuO1y9t61susAgg7jttrO/mgzitgOa0rF0OUfV6q930p0VJtsEgxbccxILY+OEO2SUPmptDahaanoLzw7knf8JkyeuAAqxngd9RJMP8NKjCIdo8gEe/sIGaV1XYvfLZ2WAcTZsGecGa252G9T+4CvTiVp62hDMSt1nb9+5+fnvvo5DvrcX1Y6wYOij1tZ+k9GhxMLYOFLy30/xZ7vRZ1e8pt0GtT9LNrJI2isN2EwbCq/2SgM2YHoEQcPvYN9V32eo745uMXm+aUaMs2HLGoNmvKDSbyU24mhSlXcMzANHC7u5FgIiLyYFVb47usUoC72yklq0KwRqs1yn/9fCMc/QtYue2Swdrt5bsMJkmybyY+yco2p1CpNtAqkGCZw/Ng7rhWcHchNXAAWCSr+VFHq44q4rsXs4G7YMm47Skg2+1eW379x8Id/bC9TS04ZC4tTx+LPdaG6D2h/NFr6BWya59uF3sG93R7cY5loIiHBqD//KOwZmXAsBEf+eZY9prmL40/9rYUXPbBZ44gqg7tIN11SDBE7CswM5YSZnp/cWYNBNR2lJ23duPkpq0a7cWtbZZgvfQPA72DdTrrypxZ673n/Pskfp/7UwHPK9vYrCusowk7NTpqO0JAU20LqTBtfNKVfeVL9n2SMuemazuEphxAIbaF2UK28qN74LtKGODMMb3wVaje8CLQAAAABBMRsZgmI2MsNTLSsExWxkRfR3fYanWlbHlkFPCIrZyEm7wtGK6O/6y9n04wxPtaxNfq61ji2Dns8cmIdREsJKECPZU9Nw9HiSQe9hVdeuLhTmtTfXtZgcloSDBVmYG4IYqQCb2/otsJrLNqldXXfmHGxs/98/QdSeDlrNoiSEleMVn4wgRrKnYXepvqbh6PHn0PPoJIPew2Wyxdqqrl1d659GRCjMa29p/XB2rmsxOe9aKiAsCQcLbTgcEvM2Rt+yB13GcVRw7TBla/T38yq7tsIxonWRHIk0oAeQ+7yfF7qNhA553qklOO+yPP9583O+SOhqfRvFQTwq3lgFT3nwRH5i6YctT8LGHFTbAYoVlEC7Do2D6COmwtk4vw3FoDhM9Lshj6eWCs6WjRMJAMxcSDHXRYti+m7KU+F3VF27uhVsoKPWP42Ilw6WkVCY194RqczH0vrh7JPL+vVc12JyHeZ5a961VECfhE9ZWBIOFhkjFQ/acDgkm0EjPadr/WXmWuZ8JQnLV2Q40E6jrpEB4p+KGCHMpzNg/bwqr+Ekre7QP7QtgxKfbLIJhqskSMnqFVPQKUZ++2h3ZeL2eT8vt0gkNnQbCR01KhIE8rxTS7ONSFJw3mV5Me9+YP7z5ue/wv3+fJHQ1T2gy8z6NoqDuweRmnhUvLE5ZaeoS5iDOwqpmCLJ+rUJiMuuEE9d718ObPRGzT/ZbYwOwnRDElrzAiNB6sFwbMGAQXfYR9c2lwbmLY7FtQClhIQbvBqKQXFbu1pomOh3Q9nZbFoeTy0VX342DJwtGyfdHAA+EgCYuVMxg6CQYq6L0VO1khbF9N1X9O/ElKfC79WW2fbpvAeuqI0ct2veMZwq7yqF7XlryqxIcNNvG134LipG4eE23magB8V/Y1ToVCJl803l87ICpMKpG2eRhDAmoJ8puK7F5Pmf3v06zPPWe/3oz7xrqYD9WrKZPgmfsn84hKuwJBws8RUHNTJGKh5zdzEHtOFwSPXQa1E2g0Z6d7JdY07X+ssP5uHSzLXM+Y2E1+BKEpavCyONtshwoJ2JQbuERl0jAwdsOBrEPxUxhQ4OKEKYT2cDqVR+wPp5VYHLYkwfxTiBXvQjmJ2nDrPclhWqGwBU5VoxT/yZYmLX2FN5zhdP4UlWfvpQlS3Xe9QczGITio0tUruWNJHoux/Q2aAG7PN+Xq3CZUdukUhsL6BTdeg2EjqpBwkjalQkCCtlPxHkeaeWpUi8j2YbkaQnKoq94LzL8qGN0Oti3v3AI+/m2b3hvBT80KcNP4OKJn6ykT+5JNBw+BXLaTtG5kJ6d/1btWtl3PRafsU3CVPudjhI97GuCbjwnxKhM8w/inL9JJMAAAAAN2rCAW7UhANZvkYC3KgJB+vCywayfI0EhRZPBbhREw6PO9EP1oWXDeHvVQxk+RoJU5PYCAotngo9R1wLcKMmHEfJ5B0ed6IfKR1gHqwLLxubYe0awt+rGPW1aRnI8jUS/5j3E6YmsRGRTHMQFFo8FSMw/hR6jrgWTeR6F+BGTTjXLI85jpLJO7n4Czo87kQ/C4SGPlI6wDxlUAI9WBdeNm99nDc2w9o1AakYNIS/VzGz1ZUw6mvTMt0BETOQ5Wskp4+pJf4x7yfJWy0mTE1iI3snoCIimeYgFfMkISi0eCof3rorRmD8KXEKPij0HHEtw3azLJrI9S6tojcvwI2acPfnWHGuWR5zmTPcchwlk3crT1F2cvEXdEWb1XV43Il+T7ZLfxYIDX0hYs98pHSAeZMeQnjKoAR6/crGe7AuvGyHRH5t3vo4b+mQ+m5shrVrW+x3agJSMWg1OPNpCH+vYj8VbWNmqythUcHpYNTXpmXjvWRkugMiZo1p4Gcgy9dIF6EVSU4fU0t5dZFK/GPeT8sJHE6St1pMpd2YTZiaxEav8AZH9k5ARcEkgkREMs1Bc1gPQCrmSUIdjItDUGjxVGcCM1U+vHVXCda3VozA+FO7qjpS4hR8UNV+vlHoOeJa31MgW4btZlmxh6RYNJHrXQP7KVxaRW9ebS+tX4AbNeG3cffg7s+x4tmlc+Ncszzma9n+5zJnuOUFDXrkOEom7w8g5O5WnqLsYfRg7eTiL+jTiO3pijar671caerwuBP9x9LR/J5sl/6pBlX/LBAa+ht62PtCxJ75da5c+EjpAPN/g8LyJj2E8BFXRvGUQQn0oyvL9fqVjffN/0/2YF142Vc3utgOifzaOeM+27z1cd6Ln7Pf0iH13eVLN9zYDGvX72ap1rbY79SBsi3VBKRi0DPOoNFqcObTXRok0hD+XsUnlJzEfiraxklAGMfMVlfC+zyVw6KC08GV6BHAqK9Ny5/Fj8rGe8nI8RELyXQHRMxDbYbNGtPAzy25As5Alq+Rd/xtkC5CK5IZKOmTnD6mlqtUZJfy6iKVxYDglPjHvJ/PrX6elhM4nKF5+p0kb7WYEwV3mUq7MZt90fOaMDWJjQdfS4xe4Q2OaYvPj+ydgIrb90KLgkkEibUjxoiIZJqDvw5YguawHoDR2tyBVMyThGOmUYU6GBeHDXLVhqDQ4qmXuiCozgRmqvlupKt8eOuuSxIprxKsb60lxq2sGIHxpy/rM6Z2VXWkQT+3pcQp+KDzQzqhqv18o52XvqLQc8S15xkGtL6nQLaJzYK3DNvNsjuxD7NiD0mxVWWLsGgi17tfSBW6BvZTuDGckbm0it68g+AcvdpeWr/tNJi+AAAAAGVnvLiLyAmq7q+1EleXYo8y8N433F9rJbk4153vKLTFik8IfWTgvW8BhwHXuL/WSt3YavIzd9/gVhBjWJ9XGVD6MKXoFJ8Q+nH4rELIwHvfrafHZ0MIcnUmb87NcH+tlRUYES37t6Q/ntAYhyfozxpCj3OirCDGsMlHegg+rzKgW8iOGLVnOwrQAIeyaThQLwxf7Jfi8FmFh5flPdGHhmW04DrdWk+Pzz8oM3eGEOTq43dYUg3Y7UBov1H4ofgr8MSfl0gqMCJaT1ee4vZvSX+TCPXHfadA1RjA/G1O0J81K7cjjcUYlp+gfyonGUf9unwgQQKSj/QQ9+hIqD1YFJtYP6gjtpAdMdP3oYlqz3YUD6jKrOEHf76EYMMG0nCgXrcXHOZZuKn0PN8VTIXnwtHggH5pDi/Le2tId8OiDw3Lx2ixcynHBGFMoLjZ9ZhvRJD/0/x+UGbuGzfaVk0nuQ4oQAW2xu+wpKOIDBwasNuBf9dnOZF40iv0H26TA/cmO2aQmoOIPy+R7ViTKVRgRLQxB/gM36hNHrrP8abs35L+ibguRmcXm1QCcCfsu0jwcd4vTMkwgPnbVedFY5ygP2v5x4PTF2g2wXIPinnLN13krlDhXED/VE4lmOj2c4iLrhbvNxb4QIIEnSc+vCQf6SFBeFWZr9fgi8qwXDM7tlntXtHlVbB+UEfVGez/bCE7YglGh9rn6TLIgo6OcNSe7Six+VGQX1bkgjoxWDqDCY+n5m4zHwjBhg1tpjq1pOFAvcGG/AUvKUkXSk71r/N2IjKWEZ6KeL4rmB3ZlyBLyfR4Lq5IwMAB/dKlZkFqHF6W93k5Kk+Xlp9d8vEj5QUZa01gftf1jtFi5+u23l9SjgnCN+m1etlGAGi8IbzQ6jHfiI9WYzBh+dYiBJ5qmr2mvQfYwQG/Nm60rVMJCBWaTnId/ynOpRGGe7d04ccPzdkQkqi+rCpGERk4I3algHVmxtgQAXpg/q7PcpvJc8oi8aRXR5YY76k5rf3MXhFFBu5NdmOJ8c6NJkTc6EH4ZFF5L/k0HpNB2rEmU7/WmuvpxvmzjKFFC2IO8BkHaUyhvlGbPNs2J4Q1mZKWUP4uLpm5VCb83uieEnFdjHcW4TTOLjapq0mKEUXmPwMggYO7dpHg4xP2XFv9WelJmD5V8SEGgmxEYT7Uqs6Lxs+pN344QX/WXSbDbrOJdnzW7srEb9YdWQqxoeHkHhTzgXmoS9dpyxOyDnerXKHCuTnGfgGA/qmc5ZkVJAs2oDZuURyOpxZmhsJx2j4s3m8sSbnTlPCBBAmV5rixe0kNox4usRtIPtJDLVlu+8P22+mmkWdRH6mwzHrODHSUYblm8QYF3gAAAAB3BzCW7g5hLJkJUboHbcQZcGr0j+ljpTWeZJWjDtuIMnncuKTg1ekel9LZiAm2TCt+sXy957gtB5C/HZEdtxBkarAg8vO5cUiEvkHeGtrUfW3d5Ov01LVRg9OFxxNsmFZka6jA/WL5eoplyewUAVxPYwZs2foPPWONCA31O24gyExpEF7VYEHkomdxcjwD5NFLBNRH0g2F/aUKtWs1taj6QrKYbNu7ydasvPlAMths40XfXHXc1g3Pq9E9WSbZMKxR3gA6yNdRgL/QYRYhtPS1VrPEI8+6lZm4vaUPKAK4nl8FiAjGDNmysQvpJC9vfIdYaEwRwWEdq7ZmLT123EGQAdtxBpjSILzv1RAqcbGFiQa2tR+fv+Sl6LjUM3gHyaIPAPk0lgmojuEOmBh/ag27CG09LZFkbJfmY1wBa2tR9BxsYWKFZTDY8mIATmwGle0bAaV7ggj0wfUPxFdlsNnGErfpUIu+uOr8uYh8Yt0d3xXaLUmM03zz+9RMZU2yYVg6tVHOo7wAdNS7MOJK36VBPdiV16TRxG3T1vT7Q2npajRu2fytZ4hG2mC40EQELXMzAx3lqgpMX90NfMlQBXE8JwJBqr4LEBDJDCCGV2i1JSBvhbO5ZtQJzmHkn17e+Q4p2cmYsNCYIsfXqLRZsz0XLrQNgbe9XDvAumyt7biDIJq/s7YDtuIMdLHSmurVRzmd0nevBNsmFXPcFoPjYwsSlGQ7hA1taj56alqo5A7PC5MJ/50KAK4nfQeesfAPk0SHCKPSHgHyaGkGwv73YlddgGVnyxlsNnFuawbn/tQbdonTK+AQ2npaZ91KzPm532+Ovu/5F7e+Q2CwjtXW1qPoodGTfjjYwsRP3/JS0btn8aa8V2c/tQbdSLI2S9gNK9qvChtMNgNK9kEEemDfYO/DqGffVTFuju9Gab55y2GzjLxmgxolb9KgUmjiNswMd5W7C0cDIgIWuVUFJi/Fuju+sr0LKCu0WpJcs2oEwtf/p7XQzzEs2Z6LW96uHZtkwrDsY/ImdWqjnAJtkwqcCQap6w42P3IHZ4UFAFcTlb9KguK4ehR7sSuuDLYbOJLSjpvl1b4NfNzvtwvb3yGG09LU8dTiQmjds/gf2oNugb4Wzfa5JltvsHfhGLdHd4gIWub/D2pwZgY7yhEBC1yPZZ7/+GKuaWFr/9MWbM9FoArieNcN0u5OBINUOQOzwqdnJmHQYBb3SWlHTT5ud9uu0WpK2dZa3EDfC2Y32DvwqbyuU967nsVHss9/MLX/6b298hzKusKKU7OTMCS0o6a60DYFzdcGk1TeVykj2We/s2Z6LsRhSrhdaBsCKm8rlLQLvjfDDI6hWgXfGy0C740AAAAAGRsxQTI2YoIrLVPDZGzFBH139EVWWqeGT0GWx8jZigjRwrtJ+u/oiuP02custU8Mta5+TZ6DLY6HmBzPSsISUVPZIxB49HDTYe9Bki6u11U3teYUHJi11wWDhJaCG5hZmwCpGLAt+tupNsua5nddXf9sbBzUQT/fzVoOnpWEJKKMnxXjp7JGIL6pd2Hx6OGm6PPQ58PegyTaxbJlXV2uqkRGn+tva8wodnD9aTkxa64gKlrvCwcJLBIcOG3fRjbzxl0Hsu1wVHH0a2Uwuyrz96IxwraJHJF1kAegNBefvPsOhI26JaneeTyy7zhz83n/auhIvkHFG31Y3io88HlPBelifkTCTy2H21QcxpQVigGNDrtApiPog7842cI4oMUNIbv0TAqWp48TjZbOXMwACUXXMUhu+mKLd+FTyrq7XVSjoGwViI0/1pGWDpfe15hQx8ypEezh+tL1+suTcmLXXGt55h1AVLXeWU+EnxYOElgPFSMZJDhw2j0jQZtl/WunfOZa5lfLCSVO0DhkAZGuoxiKn+Izp8whKrz9YK0k4a+0P9DunxKDLYYJsmzJSCSr0FMV6vt+RiniZXdoLz959jYkSLcdCRt0BBIqNUtTvPJSSI2zeWXecGB+7zHn5vP+/v3Cv9XQkXzMy6A9g4o2+pqRB7uxvFR4qKdlOTuDmEsimKkKCbX6yRCuy4hf711PRvRsDm3ZP810wg6M81oSQ+pBIwLBbHDB2HdBgJc210eOLeYGpQC1xbwbhIRxQYoaaFq7W0N36JhabNnZFS1PHgw2fl8nGy2cPgAc3bmYABKggzFTi65ikJK1U9Hd9MUWxO/0V+/Cp5T22ZbVrge86bccjaicMd5rhSrvKspree3TcEis+F0bb+FGKi5m3jbhf8UHoFToVGNN82UiArLz5RupwqQwhJFnKZ+gJuTFrrj93p/51vPMOs/o/XuAqWu8mbJa/bKfCT6rhDh/LBwksDUHFfEeKkYyBzF3c0hw4bRRa9D1ekaDNmNdsnfL+tdO0uHmD/nMtczg14SNr5YSSraNIwudoHDIhLtBiQMjXUYaOGwHMRU/xCgODoVnT5hCflSpA1V5+sBMYsuBgTjFH5gj9F6zDqedqhWW3OVUABv8TzFa12Jimc55U9hJ4U8XUPp+VnvXLZVizBzULY2KEzSWu1Ifu+iRBqDZ0F5+8+xHZcKtbEiRbnVToC86EjboIwkHqQgkVGoRP2Urlqd55I+8SKWkkRtmvYoqJ/LLvODr0I2hwP3eYtnm7yMUvOG9DafQ/CaKgz8/kbJ+cNAkuWnLFfhC5kY7W/13etxla7XFflr07lMJN/dIOHa4Ca6xoRKf8Io/zDOTJP1yAAAAAAHCajcDhNRuAka+WQcJqNwGy8LrBI18sgVPFoUOE1G4D9E7jw2XhdYMVe/hCRr5ZAjYk1MKni0KC1xHPRwmo3Ad5MlHH6J3Hh5gHSkbLwusGu1hmxir38IZabX1EjXyyBP3mP8RsSamEHNMkRU8WhQU/jAjFriOehd65E04TUbgOY8s1zvJko46C/i5P0TuPD6GhAs8wDpSPQJQZTZeF1g3nH1vNdrDNjQYqQExV7+EMJXVszLTa+ozEQHdJGvlkCWpj6cn7zH+Ji1bySNiTUwioCd7IOaZIiEk8xUqeLQoK7reHyn8YEYoPgpxLXEc9CyzdsMu9ciaLzeirXCajcBxWOf3cx5ZrnLcM5l3kyUcdlFPK3QX8XJ11ZtFfonceH9Ltk99DQgWfM9iIXmAdKR4Qh6TegSgynvGyv1svC6wbX5Eh284+t5u+pDpa7WGbGp37FtoMVICafM4NWKvfwhjbRU/YSurZmDpwVFlptfUZGS942YiA7pn4GmNSNfLIEkVoRdLUx9OSpF1eU/eY/xOHAnLTFq3kk2Y3aVGxJqYRwbwr0VATvZEgiTBQc0yREAPWHNCSeYqQ4uMHVTxaFBVMwJnV3W8Pla31glT+MCMUjqqu1B8FOJRvn7VWuI56FsgU99ZZu2GWKSHsV3rkTRcKfsDXm9FWl+tL23hNRuA4Pdxt+Kxz+7jc6XZ5jyzXOf+2WvluGcy5HoNBe8mSjju5CAP7KKeVu1g9GHoL+Lk6e2I0+urNorqaVy9/RO48PzR0sf+l2ye/1UGqfoaECz72Hob+Z7EQvhcrnXzAOlI8sKDf/CEPSbxRlcR9AlBlPXLK6P3jZX69k//zdl4XWDYujdX2vyJDts+4znecfW837Ofi931IdLcN0vl12sM2NapZu/U79i21S2ygdBipATRoM4z0+ZwatIkGl3FXv4QxJyUJ8baKn7HGEBJwldWzMOVPPvB04KiwBHolctNr6jKj8WfyMl7xskLEfHMRAd0zYZtQ8/A0xrOArktka+WQJBt/HeSK0Iuk+koGZamPpyXZFSrlSLq8pTggMWfvMf4nn6tz5w4E5ad+nmhmLVvJJl3BRObMbtKmvPRfY2JNTCMS18Hjg3hXo/Pi2mKgJ3si0L324kESYKIxiO1g5pkiIJYDr+AHrDmgdza0YSTzFSFUaZjhxcYOobVcg2p4tCgqCC6l6pmBM6rpG75rut4fK8pEkutb6wSrK3GJafxgRimM+svpHVVdqW3P0Gg+CnEoTpD86N8/aqivpedtcRz0LQGGee2QKe+t4LNibLN2wyzD7E7sUkPYrCLZVW71yJouhVIX7hT9ga5kZwxvN6KtL0c4IO/Wl7avpg07QAAAAC4vGdlqgnIixK1r+6PYpdXN97wMiVrX9yd1zi5xbQo730IT4pvveBk1wGHAUrWv7jyatjd4N93M1hjEFZQGVef6KUw+voQnxRCrPhx33vAyGfHp611cghDzc5vJpWtf3AtERgVP6S3+4cY0J4az+gnonOPQrDGIKwIekfJoDKvPhiOyFsKO2e1socA0C9QOGmX7F8MhVnw4j3ll4dlhofR3TrgtM+PT1p3Myg/6uQQhlJYd+NA7dgN+FG/aPAr+KFIl5/EWiIwKuKeV09/SW/2x/UIk9VAp31t/MAYNZ/QTo0jtyuflhjFJyp/oLr9RxkCQSB8EPSPkqhI6PebFFg9I6g/WDEdkLaJoffTFHbPaqzKqA++fwfhBsNghF6gcNLmHBe39Km4WUwV3zzRwueFaX6A4HvLLw7Dd0hryw0PonOxaMdhBMcp2bigTERvmPX80/+Q7mZQflbaNxsOuSdNtgVAKKSw78YcDIijgduwGjln138r0niRk24f9Dsm9wODmpBmkS8/iCmTWO20RGBUDPgHMR5NqN+m8c+6/pLf7EYuuIlUmxdn7CdwAnHwSLvJTC/e2/mAMGNF51VrP6Cc04PH+cE2aBd5ig9y5F03y1zhUK5OVP9A9uiYJa6LiHMWN+8WBIJA+Lw+J50h6R8kmVV4QYvg168zXLDK7Vm2O1Xl0V5HUH6w/+wZ1WI7IWzah0YJyDLp53COjoIo7Z7UkFH5sYLkVl86WDE6p48Jgx8zbuYNhsEItTqmbb1A4aQF/IbBF0kpL6/1TkoyInbzip4Rlpgrvnggl9kdePTJS8BIri7S/QHAakFmpfeWXhxPKjl5XZ+Wl+Uj8fJNaxkF9dd+YOdi0Y5f3rbrwgmOUnq16TdoAEbZ0LwhvIjfMeowY1aPItb5YZpqngQHvaa9vwHB2K20bjYVCAlTHXJOmqXOKf+3e4YRD8fhdJIQ2c0qrL6oOBkRRoCldiPYxmZ1YHoBEHLPrv7Kc8mbV6TxIu8Ylkf9rTmpRRFezHZN7gbO8Ylj3EQmjWT4Qej5L3lRQZMeNFMmsdrrmta/s/nG6QtFoYwZ8A5ioUxpBzybUb6EJzbblpKZNS4u/lAmVLmZnuje/IxdcRI04RZ3qTYuzhGKSasDP+ZFu4OBIOPgkXZbXPYTSelZ/fFVPphsggYh1D5hRMaLzqp+N6nP1n9BOG7DJl18domzxMru1lkd1m/hobEK8xQe5EuoeYETy2nXq3cOsrnCoVwBfsY5nKn+gCQVmeU2oDYLjhxRboZmFqc+2nHCLG/eLJTTuUkJBIHwsbjmlaMNSXsbsS4eQ9I+SPtuWS3p2/bDUWeRpsywqR90DM56ZrlhlN4FBvEAQfDYAAtNAQAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAADAAAABAAAAAQAAAAEAAAABAAAAAUAAAAFAAAABQAAAAUAQeDZAAtlAQAAAAEAAAACAAAAAgAAAAMAAAADAAAABAAAAAQAAAAFAAAABQAAAAYAAAAGAAAABwAAAAcAAAAIAAAACAAAAAkAAAAJAAAACgAAAAoAAAALAAAACwAAAAwAAAAMAAAADQAAAA0AQdjaAAttBAAAAAQABAAIAAQABQAAAAQABAAIAAQABgAAAAQABgAgACAABgAAAAQABAAQABAABwAAAAgAEAAgACAABwAAAAgAEACAAIAABwAAAAgAIACAAAABCAAAACAAgAACAQAECAAAACAAAgECAQAQCABB0NsAC/cJDAAIAIwACABMAAgAzAAIACwACACsAAgAbAAIAOwACAAcAAgAnAAIAFwACADcAAgAPAAIALwACAB8AAgA/AAIAAIACACCAAgAQgAIAMIACAAiAAgAogAIAGIACADiAAgAEgAIAJIACABSAAgA0gAIADIACACyAAgAcgAIAPIACAAKAAgAigAIAEoACADKAAgAKgAIAKoACABqAAgA6gAIABoACACaAAgAWgAIANoACAA6AAgAugAIAHoACAD6AAgABgAIAIYACABGAAgAxgAIACYACACmAAgAZgAIAOYACAAWAAgAlgAIAFYACADWAAgANgAIALYACAB2AAgA9gAIAA4ACACOAAgATgAIAM4ACAAuAAgArgAIAG4ACADuAAgAHgAIAJ4ACABeAAgA3gAIAD4ACAC+AAgAfgAIAP4ACAABAAgAgQAIAEEACADBAAgAIQAIAKEACABhAAgA4QAIABEACACRAAgAUQAIANEACAAxAAgAsQAIAHEACADxAAgACQAIAIkACABJAAgAyQAIACkACACpAAgAaQAIAOkACAAZAAgAmQAIAFkACADZAAgAOQAIALkACAB5AAgA+QAIAAUACACFAAgARQAIAMUACAAlAAgApQAIAGUACADlAAgAFQAIAJUACABVAAgA1QAIADUACAC1AAgAdQAIAPUACAANAAgAjQAIAE0ACADNAAgALQAIAK0ACABtAAgA7QAIAB0ACACdAAgAXQAIAN0ACAA9AAgAvQAIAH0ACAD9AAgAEwAJABMBCQCTAAkAkwEJAFMACQBTAQkA0wAJANMBCQAzAAkAMwEJALMACQCzAQkAcwAJAHMBCQDzAAkA8wEJAAsACQALAQkAiwAJAIsBCQBLAAkASwEJAMsACQDLAQkAKwAJACsBCQCrAAkAqwEJAGsACQBrAQkA6wAJAOsBCQAbAAkAGwEJAJsACQCbAQkAWwAJAFsBCQDbAAkA2wEJADsACQA7AQkAuwAJALsBCQB7AAkAewEJAPsACQD7AQkABwAJAAcBCQCHAAkAhwEJAEcACQBHAQkAxwAJAMcBCQAnAAkAJwEJAKcACQCnAQkAZwAJAGcBCQDnAAkA5wEJABcACQAXAQkAlwAJAJcBCQBXAAkAVwEJANcACQDXAQkANwAJADcBCQC3AAkAtwEJAHcACQB3AQkA9wAJAPcBCQAPAAkADwEJAI8ACQCPAQkATwAJAE8BCQDPAAkAzwEJAC8ACQAvAQkArwAJAK8BCQBvAAkAbwEJAO8ACQDvAQkAHwAJAB8BCQCfAAkAnwEJAF8ACQBfAQkA3wAJAN8BCQA/AAkAPwEJAL8ACQC/AQkAfwAJAH8BCQD/AAkA/wEJAAAABwBAAAcAIAAHAGAABwAQAAcAUAAHADAABwBwAAcACAAHAEgABwAoAAcAaAAHABgABwBYAAcAOAAHAHgABwAEAAcARAAHACQABwBkAAcAFAAHAFQABwA0AAcAdAAHAAMACACDAAgAQwAIAMMACAAjAAgAowAIAGMACADjAAgAAAAFABAABQAIAAUAGAAFAAQABQAUAAUADAAFABwABQACAAUAEgAFAAoABQAaAAUABgAFABYABQAOAAUAHgAFAAEABQARAAUACQAFABkABQAFAAUAFQAFAA0ABQAdAAUAAwAFABMABQALAAUAGwAFAAcABQAXAAUAQdHlAAvsBgECAwQEBQUGBgYGBwcHBwgICAgICAgICQkJCQkJCQkKCgoKCgoKCgoKCgoKCgoKCwsLCwsLCwsLCwsLCwsLCwwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAAEBESEhMTFBQUFBUVFRUWFhYWFhYWFhcXFxcXFxcXGBgYGBgYGBgYGBgYGBgYGBkZGRkZGRkZGRkZGRkZGRkaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0AAQIDBAUGBwgICQkKCgsLDAwMDA0NDQ0ODg4ODw8PDxAQEBAQEBAQERERERERERESEhISEhISEhMTExMTExMTFBQUFBQUFBQUFBQUFBQUFBUVFRUVFRUVFRUVFRUVFRUWFhYWFhYWFhYWFhYWFhYWFxcXFxcXFxcXFxcXFxcXFxgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxscAAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACgAAAAwAAAAOAAAAEAAAABQAAAAYAAAAHAAAACAAAAAoAAAAMAAAADgAAABAAAAAUAAAAGAAAABwAAAAgAAAAKAAAADAAAAA4ABB1OwAC60BAQAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAAAAAEAAIABAAAAAgAAAAMAAAAEAAAABgAAAAgAAAAMAAAAEAAAABgAAAAgAAAAMAAAAEAAAABgAADQLQAAEDcAAAEBAAAeAQAADwAAAFAyAACQNwAAAAAAAB4AAAAPAAAAAAAAABA4AAAAAAAAEwAAAAcAQbDuAAtNAQAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAADAAAABAAAAAQAAAAEAAAABAAAAAUAAAAFAAAABQAAAAUAQaDvAAtlAQAAAAEAAAACAAAAAgAAAAMAAAADAAAABAAAAAQAAAAFAAAABQAAAAYAAAAGAAAABwAAAAcAAAAIAAAACAAAAAkAAAAJAAAACgAAAAoAAAALAAAACwAAAAwAAAAMAAAADQAAAA0AQdDwAAsjAgAAAAMAAAAHAAAAAAAAABAREgAIBwkGCgULBAwDDQIOAQ8AQYDxAAsmFAQAAJ0HAAAsCQAAhgUAAEgFAACnBQAAAAQAADIFAAC8BQAALAkAQbDxAAulEwMABAAFAAYABwAIAAkACgALAA0ADwARABMAFwAbAB8AIwArADMAOwBDAFMAYwBzAIMAowDDAOMAAgEAAAAAAAAQABAAEAAQABAAEAAQABAAEQARABEAEQASABIAEgASABMAEwATABMAFAAUABQAFAAVABUAFQAVABAATQDKAAAAAQACAAMABAAFAAcACQANABEAGQAhADEAQQBhAIEAwQABAYEBAQIBAwEEAQYBCAEMARABGAEgATABQAFgAAAAABAAEAAQABAAEQARABIAEgATABMAFAAUABUAFQAWABYAFwAXABgAGAAZABkAGgAaABsAGwAcABwAHQAdAEAAQABgBwAAAAhQAAAIEAAUCHMAEgcfAAAIcAAACDAAAAnAABAHCgAACGAAAAggAAAJoAAACAAAAAiAAAAIQAAACeAAEAcGAAAIWAAACBgAAAmQABMHOwAACHgAAAg4AAAJ0AARBxEAAAhoAAAIKAAACbAAAAgIAAAIiAAACEgAAAnwABAHBAAACFQAAAgUABUI4wATBysAAAh0AAAINAAACcgAEQcNAAAIZAAACCQAAAmoAAAIBAAACIQAAAhEAAAJ6AAQBwgAAAhcAAAIHAAACZgAFAdTAAAIfAAACDwAAAnYABIHFwAACGwAAAgsAAAJuAAACAwAAAiMAAAITAAACfgAEAcDAAAIUgAACBIAFQijABMHIwAACHIAAAgyAAAJxAARBwsAAAhiAAAIIgAACaQAAAgCAAAIggAACEIAAAnkABAHBwAACFoAAAgaAAAJlAAUB0MAAAh6AAAIOgAACdQAEgcTAAAIagAACCoAAAm0AAAICgAACIoAAAhKAAAJ9AAQBwUAAAhWAAAIFgBACAAAEwczAAAIdgAACDYAAAnMABEHDwAACGYAAAgmAAAJrAAACAYAAAiGAAAIRgAACewAEAcJAAAIXgAACB4AAAmcABQHYwAACH4AAAg+AAAJ3AASBxsAAAhuAAAILgAACbwAAAgOAAAIjgAACE4AAAn8AGAHAAAACFEAAAgRABUIgwASBx8AAAhxAAAIMQAACcIAEAcKAAAIYQAACCEAAAmiAAAIAQAACIEAAAhBAAAJ4gAQBwYAAAhZAAAIGQAACZIAEwc7AAAIeQAACDkAAAnSABEHEQAACGkAAAgpAAAJsgAACAkAAAiJAAAISQAACfIAEAcEAAAIVQAACBUAEAgCARMHKwAACHUAAAg1AAAJygARBw0AAAhlAAAIJQAACaoAAAgFAAAIhQAACEUAAAnqABAHCAAACF0AAAgdAAAJmgAUB1MAAAh9AAAIPQAACdoAEgcXAAAIbQAACC0AAAm6AAAIDQAACI0AAAhNAAAJ+gAQBwMAAAhTAAAIEwAVCMMAEwcjAAAIcwAACDMAAAnGABEHCwAACGMAAAgjAAAJpgAACAMAAAiDAAAIQwAACeYAEAcHAAAIWwAACBsAAAmWABQHQwAACHsAAAg7AAAJ1gASBxMAAAhrAAAIKwAACbYAAAgLAAAIiwAACEsAAAn2ABAHBQAACFcAAAgXAEAIAAATBzMAAAh3AAAINwAACc4AEQcPAAAIZwAACCcAAAmuAAAIBwAACIcAAAhHAAAJ7gAQBwkAAAhfAAAIHwAACZ4AFAdjAAAIfwAACD8AAAneABIHGwAACG8AAAgvAAAJvgAACA8AAAiPAAAITwAACf4AYAcAAAAIUAAACBAAFAhzABIHHwAACHAAAAgwAAAJwQAQBwoAAAhgAAAIIAAACaEAAAgAAAAIgAAACEAAAAnhABAHBgAACFgAAAgYAAAJkQATBzsAAAh4AAAIOAAACdEAEQcRAAAIaAAACCgAAAmxAAAICAAACIgAAAhIAAAJ8QAQBwQAAAhUAAAIFAAVCOMAEwcrAAAIdAAACDQAAAnJABEHDQAACGQAAAgkAAAJqQAACAQAAAiEAAAIRAAACekAEAcIAAAIXAAACBwAAAmZABQHUwAACHwAAAg8AAAJ2QASBxcAAAhsAAAILAAACbkAAAgMAAAIjAAACEwAAAn5ABAHAwAACFIAAAgSABUIowATByMAAAhyAAAIMgAACcUAEQcLAAAIYgAACCIAAAmlAAAIAgAACIIAAAhCAAAJ5QAQBwcAAAhaAAAIGgAACZUAFAdDAAAIegAACDoAAAnVABIHEwAACGoAAAgqAAAJtQAACAoAAAiKAAAISgAACfUAEAcFAAAIVgAACBYAQAgAABMHMwAACHYAAAg2AAAJzQARBw8AAAhmAAAIJgAACa0AAAgGAAAIhgAACEYAAAntABAHCQAACF4AAAgeAAAJnQAUB2MAAAh+AAAIPgAACd0AEgcbAAAIbgAACC4AAAm9AAAIDgAACI4AAAhOAAAJ/QBgBwAAAAhRAAAIEQAVCIMAEgcfAAAIcQAACDEAAAnDABAHCgAACGEAAAghAAAJowAACAEAAAiBAAAIQQAACeMAEAcGAAAIWQAACBkAAAmTABMHOwAACHkAAAg5AAAJ0wARBxEAAAhpAAAIKQAACbMAAAgJAAAIiQAACEkAAAnzABAHBAAACFUAAAgVABAIAgETBysAAAh1AAAINQAACcsAEQcNAAAIZQAACCUAAAmrAAAIBQAACIUAAAhFAAAJ6wAQBwgAAAhdAAAIHQAACZsAFAdTAAAIfQAACD0AAAnbABIHFwAACG0AAAgtAAAJuwAACA0AAAiNAAAITQAACfsAEAcDAAAIUwAACBMAFQjDABMHIwAACHMAAAgzAAAJxwARBwsAAAhjAAAIIwAACacAAAgDAAAIgwAACEMAAAnnABAHBwAACFsAAAgbAAAJlwAUB0MAAAh7AAAIOwAACdcAEgcTAAAIawAACCsAAAm3AAAICwAACIsAAAhLAAAJ9wAQBwUAAAhXAAAIFwBACAAAEwczAAAIdwAACDcAAAnPABEHDwAACGcAAAgnAAAJrwAACAcAAAiHAAAIRwAACe8AEAcJAAAIXwAACB8AAAmfABQHYwAACH8AAAg/AAAJ3wASBxsAAAhvAAAILwAACb8AAAgPAAAIjwAACE8AAAn/ABAFAQAXBQEBEwURABsFARARBQUAGQUBBBUFQQAdBQFAEAUDABgFAQIUBSEAHAUBIBIFCQAaBQEIFgWBAEAFAAAQBQIAFwWBARMFGQAbBQEYEQUHABkFAQYVBWEAHQUBYBAFBAAYBQEDFAUxABwFATASBQ0AGgUBDBYFwQBABQAAEAARABIAAAAIAAcACQAGAAoABQALAAQADAADAA0AAgAOAAEADwBB4IQBC0ERAAoAERERAAAAAAUAAAAAAAAJAAAAAAsAAAAAAAAAABEADwoREREDCgcAAQAJCwsAAAkGCwAACwAGEQAAABEREQBBsYUBCyELAAAAAAAAAAARAAoKERERAAoAAAIACQsAAAAJAAsAAAsAQeuFAQsBDABB94UBCxUMAAAAAAwAAAAACQwAAAAAAAwAAAwAQaWGAQsBDgBBsYYBCxUNAAAABA0AAAAACQ4AAAAAAA4AAA4AQd+GAQsBEABB64YBCx4PAAAAAA8AAAAACRAAAAAAABAAABAAABIAAAASEhIAQaKHAQsOEgAAABISEgAAAAAAAAkAQdOHAQsBCwBB34cBCxUKAAAAAAoAAAAACQsAAAAAAAsAAAsAQY2IAQsBDABBmYgBCycMAAAAAAwAAAAACQwAAAAAAAwAAAwAADAxMjM0NTY3ODlBQkNERUYAQeSIAQsBMwBBi4kBCwX//////wBB0IkBC1cZEkQ7Aj8sRxQ9MzAKGwZGS0U3D0kOjhcDQB08aSs2H0otHAEgJSkhCAwVFiIuEDg+CzQxGGR0dXYvQQl/OREjQzJCiYqLBQQmKCcNKh41jAcaSJMTlJUAQbCKAQuKDklsbGVnYWwgYnl0ZSBzZXF1ZW5jZQBEb21haW4gZXJyb3IAUmVzdWx0IG5vdCByZXByZXNlbnRhYmxlAE5vdCBhIHR0eQBQZXJtaXNzaW9uIGRlbmllZABPcGVyYXRpb24gbm90IHBlcm1pdHRlZABObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5AE5vIHN1Y2ggcHJvY2VzcwBGaWxlIGV4aXN0cwBWYWx1ZSB0b28gbGFyZ2UgZm9yIGRhdGEgdHlwZQBObyBzcGFjZSBsZWZ0IG9uIGRldmljZQBPdXQgb2YgbWVtb3J5AFJlc291cmNlIGJ1c3kASW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwAUmVzb3VyY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUASW52YWxpZCBzZWVrAENyb3NzLWRldmljZSBsaW5rAFJlYWQtb25seSBmaWxlIHN5c3RlbQBEaXJlY3Rvcnkgbm90IGVtcHR5AENvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcgBPcGVyYXRpb24gdGltZWQgb3V0AENvbm5lY3Rpb24gcmVmdXNlZABIb3N0IGlzIGRvd24ASG9zdCBpcyB1bnJlYWNoYWJsZQBBZGRyZXNzIGluIHVzZQBCcm9rZW4gcGlwZQBJL08gZXJyb3IATm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcwBCbG9jayBkZXZpY2UgcmVxdWlyZWQATm8gc3VjaCBkZXZpY2UATm90IGEgZGlyZWN0b3J5AElzIGEgZGlyZWN0b3J5AFRleHQgZmlsZSBidXN5AEV4ZWMgZm9ybWF0IGVycm9yAEludmFsaWQgYXJndW1lbnQAQXJndW1lbnQgbGlzdCB0b28gbG9uZwBTeW1ib2xpYyBsaW5rIGxvb3AARmlsZW5hbWUgdG9vIGxvbmcAVG9vIG1hbnkgb3BlbiBmaWxlcyBpbiBzeXN0ZW0ATm8gZmlsZSBkZXNjcmlwdG9ycyBhdmFpbGFibGUAQmFkIGZpbGUgZGVzY3JpcHRvcgBObyBjaGlsZCBwcm9jZXNzAEJhZCBhZGRyZXNzAEZpbGUgdG9vIGxhcmdlAFRvbyBtYW55IGxpbmtzAE5vIGxvY2tzIGF2YWlsYWJsZQBSZXNvdXJjZSBkZWFkbG9jayB3b3VsZCBvY2N1cgBTdGF0ZSBub3QgcmVjb3ZlcmFibGUAUHJldmlvdXMgb3duZXIgZGllZABPcGVyYXRpb24gY2FuY2VsZWQARnVuY3Rpb24gbm90IGltcGxlbWVudGVkAE5vIG1lc3NhZ2Ugb2YgZGVzaXJlZCB0eXBlAElkZW50aWZpZXIgcmVtb3ZlZABEZXZpY2Ugbm90IGEgc3RyZWFtAE5vIGRhdGEgYXZhaWxhYmxlAERldmljZSB0aW1lb3V0AE91dCBvZiBzdHJlYW1zIHJlc291cmNlcwBMaW5rIGhhcyBiZWVuIHNldmVyZWQAUHJvdG9jb2wgZXJyb3IAQmFkIG1lc3NhZ2UARmlsZSBkZXNjcmlwdG9yIGluIGJhZCBzdGF0ZQBOb3QgYSBzb2NrZXQARGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZABNZXNzYWdlIHRvbyBsYXJnZQBQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQAUHJvdG9jb2wgbm90IGF2YWlsYWJsZQBQcm90b2NvbCBub3Qgc3VwcG9ydGVkAFNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQATm90IHN1cHBvcnRlZABQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZABBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sAEFkZHJlc3Mgbm90IGF2YWlsYWJsZQBOZXR3b3JrIGlzIGRvd24ATmV0d29yayB1bnJlYWNoYWJsZQBDb25uZWN0aW9uIHJlc2V0IGJ5IG5ldHdvcmsAQ29ubmVjdGlvbiBhYm9ydGVkAE5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUAU29ja2V0IGlzIGNvbm5lY3RlZABTb2NrZXQgbm90IGNvbm5lY3RlZABDYW5ub3Qgc2VuZCBhZnRlciBzb2NrZXQgc2h1dGRvd24AT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MAT3BlcmF0aW9uIGluIHByb2dyZXNzAFN0YWxlIGZpbGUgaGFuZGxlAFJlbW90ZSBJL08gZXJyb3IAUXVvdGEgZXhjZWVkZWQATm8gbWVkaXVtIGZvdW5kAFdyb25nIG1lZGl1bSB0eXBlAE5vIGVycm9yIGluZm9ybWF0aW9uAEHAmAELdRYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAABwUFAAJgAAACcAAAAoAAAAKQAAACoAAAArAAAALAAAAC0AAAAuAAAAJwAAACgAAAApAAAAKgAAACsAAAAsAAAALQBB5JoBCwJQUABBoJsBCxD/////////////////////";to(Di)||(Di=b(Di));function Qs(Be){try{if(Be==Di&&he)return new Uint8Array(he);var xe=$n(Be);if(xe)return xe;if(R)return R(Be);throw"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"}catch(Ve){ki(Ve)}}function ro(Be,xe){var Ve,vt,tr;try{tr=Qs(Be),vt=new WebAssembly.Module(tr),Ve=new WebAssembly.Instance(vt,xe)}catch(Tn){var Zr=Tn.toString();throw re("failed to compile wasm module: "+Zr),(Zr.includes("imported Memory")||Zr.includes("memory import"))&&re("Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time)."),Tn}return[Ve,vt]}function pc(){var Be={a:Ma};function xe(tr,Zr){var Tn=tr.exports;r.asm=Tn,le=r.asm.g,J(le.buffer),$=r.asm.$,tn(r.asm.h),bs("wasm-instantiate")}if(Hn("wasm-instantiate"),r.instantiateWasm)try{var Ve=r.instantiateWasm(Be,xe);return Ve}catch(tr){return re("Module.instantiateWasm callback failed with error: "+tr),!1}var vt=ro(Di,Be);return xe(vt[0]),r.asm}function gu(Be){return F.getFloat32(Be,!0)}function ap(Be){return F.getFloat64(Be,!0)}function lp(Be){return F.getInt16(Be,!0)}function ks(Be){return F.getInt32(Be,!0)}function En(Be,xe){F.setInt32(Be,xe,!0)}function no(Be){for(;Be.length>0;){var xe=Be.shift();if(typeof xe=="function"){xe(r);continue}var Ve=xe.func;typeof Ve=="number"?xe.arg===void 0?$.get(Ve)():$.get(Ve)(xe.arg):Ve(xe.arg===void 0?null:xe.arg)}}function Fs(Be,xe){var Ve=new Date(ks((Be>>2)*4)*1e3);En((xe>>2)*4,Ve.getUTCSeconds()),En((xe+4>>2)*4,Ve.getUTCMinutes()),En((xe+8>>2)*4,Ve.getUTCHours()),En((xe+12>>2)*4,Ve.getUTCDate()),En((xe+16>>2)*4,Ve.getUTCMonth()),En((xe+20>>2)*4,Ve.getUTCFullYear()-1900),En((xe+24>>2)*4,Ve.getUTCDay()),En((xe+36>>2)*4,0),En((xe+32>>2)*4,0);var vt=Date.UTC(Ve.getUTCFullYear(),0,1,0,0,0,0),tr=(Ve.getTime()-vt)/(1e3*60*60*24)|0;return En((xe+28>>2)*4,tr),Fs.GMTString||(Fs.GMTString=yt("GMT")),En((xe+40>>2)*4,Fs.GMTString),xe}function Cl(Be,xe){return Fs(Be,xe)}function El(Be,xe,Ve){qe.copyWithin(Be,xe,xe+Ve)}function io(Be){try{return le.grow(Be-Qe.byteLength+65535>>>16),J(le.buffer),1}catch{}}function Ue(Be){var xe=qe.length;Be=Be>>>0;var Ve=2147483648;if(Be>Ve)return!1;for(var vt=1;vt<=4;vt*=2){var tr=xe*(1+.2/vt);tr=Math.min(tr,Be+100663296);var Zr=Math.min(Ve,Te(Math.max(Be,tr),65536)),Tn=io(Zr);if(Tn)return!0}return!1}function Fn(Be){pe(Be)}function Fi(Be){var xe=Date.now()/1e3|0;return Be&&En((Be>>2)*4,xe),xe}function Rn(){if(Rn.called)return;Rn.called=!0;var Be=new Date().getFullYear(),xe=new Date(Be,0,1),Ve=new Date(Be,6,1),vt=xe.getTimezoneOffset(),tr=Ve.getTimezoneOffset(),Zr=Math.max(vt,tr);En((mi()>>2)*4,Zr*60),En((es()>>2)*4,Number(vt!=tr));function Tn(qa){var aa=qa.toTimeString().match(/\(([A-Za-z ]+)\)$/);return aa?aa[1]:"GMT"}var _r=Tn(xe),ei=Tn(Ve),Ti=yt(_r),Kn=yt(ei);tr>2)*4,Ti),En(($i()+4>>2)*4,Kn)):(En(($i()>>2)*4,Kn),En(($i()+4>>2)*4,Ti))}function Ui(Be){Rn();var xe=Date.UTC(ks((Be+20>>2)*4)+1900,ks((Be+16>>2)*4),ks((Be+12>>2)*4),ks((Be+8>>2)*4),ks((Be+4>>2)*4),ks((Be>>2)*4),0),Ve=new Date(xe);En((Be+24>>2)*4,Ve.getUTCDay());var vt=Date.UTC(Ve.getUTCFullYear(),0,1,0,0,0,0),tr=(Ve.getTime()-vt)/(1e3*60*60*24)|0;return En((Be+28>>2)*4,tr),Ve.getTime()/1e3|0}var Zt=typeof atob=="function"?atob:function(Be){var xe="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",Ve="",vt,tr,Zr,Tn,_r,ei,Ti,Kn=0;Be=Be.replace(/[^A-Za-z0-9\+\/\=]/g,"");do Tn=xe.indexOf(Be.charAt(Kn++)),_r=xe.indexOf(Be.charAt(Kn++)),ei=xe.indexOf(Be.charAt(Kn++)),Ti=xe.indexOf(Be.charAt(Kn++)),vt=Tn<<2|_r>>4,tr=(_r&15)<<4|ei>>2,Zr=(ei&3)<<6|Ti,Ve=Ve+String.fromCharCode(vt),ei!==64&&(Ve=Ve+String.fromCharCode(tr)),Ti!==64&&(Ve=Ve+String.fromCharCode(Zr));while(Kn0||(ht(),fr>0))return;function xe(){we||(we=!0,r.calledRun=!0,!Pe&&(Ut(),o(r),r.onRuntimeInitialized&&r.onRuntimeInitialized(),Xt()))}r.setStatus?(r.setStatus("Running..."),setTimeout(function(){setTimeout(function(){r.setStatus("")},1),xe()},1)):xe()}if(r.run=je,r.preInit)for(typeof r.preInit=="function"&&(r.preInit=[r.preInit]);r.preInit.length>0;)r.preInit.pop()();return je(),e}}();typeof ID=="object"&&typeof rT=="object"?rT.exports=tT:typeof define=="function"&&define.amd?define([],function(){return tT}):typeof ID=="object"&&(ID.createModule=tT)});var yf,VW,JW,zW=dt(()=>{yf=["number","number"],VW=(Z=>(Z[Z.ZIP_ER_OK=0]="ZIP_ER_OK",Z[Z.ZIP_ER_MULTIDISK=1]="ZIP_ER_MULTIDISK",Z[Z.ZIP_ER_RENAME=2]="ZIP_ER_RENAME",Z[Z.ZIP_ER_CLOSE=3]="ZIP_ER_CLOSE",Z[Z.ZIP_ER_SEEK=4]="ZIP_ER_SEEK",Z[Z.ZIP_ER_READ=5]="ZIP_ER_READ",Z[Z.ZIP_ER_WRITE=6]="ZIP_ER_WRITE",Z[Z.ZIP_ER_CRC=7]="ZIP_ER_CRC",Z[Z.ZIP_ER_ZIPCLOSED=8]="ZIP_ER_ZIPCLOSED",Z[Z.ZIP_ER_NOENT=9]="ZIP_ER_NOENT",Z[Z.ZIP_ER_EXISTS=10]="ZIP_ER_EXISTS",Z[Z.ZIP_ER_OPEN=11]="ZIP_ER_OPEN",Z[Z.ZIP_ER_TMPOPEN=12]="ZIP_ER_TMPOPEN",Z[Z.ZIP_ER_ZLIB=13]="ZIP_ER_ZLIB",Z[Z.ZIP_ER_MEMORY=14]="ZIP_ER_MEMORY",Z[Z.ZIP_ER_CHANGED=15]="ZIP_ER_CHANGED",Z[Z.ZIP_ER_COMPNOTSUPP=16]="ZIP_ER_COMPNOTSUPP",Z[Z.ZIP_ER_EOF=17]="ZIP_ER_EOF",Z[Z.ZIP_ER_INVAL=18]="ZIP_ER_INVAL",Z[Z.ZIP_ER_NOZIP=19]="ZIP_ER_NOZIP",Z[Z.ZIP_ER_INTERNAL=20]="ZIP_ER_INTERNAL",Z[Z.ZIP_ER_INCONS=21]="ZIP_ER_INCONS",Z[Z.ZIP_ER_REMOVE=22]="ZIP_ER_REMOVE",Z[Z.ZIP_ER_DELETED=23]="ZIP_ER_DELETED",Z[Z.ZIP_ER_ENCRNOTSUPP=24]="ZIP_ER_ENCRNOTSUPP",Z[Z.ZIP_ER_RDONLY=25]="ZIP_ER_RDONLY",Z[Z.ZIP_ER_NOPASSWD=26]="ZIP_ER_NOPASSWD",Z[Z.ZIP_ER_WRONGPASSWD=27]="ZIP_ER_WRONGPASSWD",Z[Z.ZIP_ER_OPNOTSUPP=28]="ZIP_ER_OPNOTSUPP",Z[Z.ZIP_ER_INUSE=29]="ZIP_ER_INUSE",Z[Z.ZIP_ER_TELL=30]="ZIP_ER_TELL",Z[Z.ZIP_ER_COMPRESSED_DATA=31]="ZIP_ER_COMPRESSED_DATA",Z))(VW||{}),JW=t=>({get HEAP8(){return t.HEAP8},get HEAPU8(){return t.HEAPU8},errors:VW,SEEK_SET:0,SEEK_CUR:1,SEEK_END:2,ZIP_CHECKCONS:4,ZIP_EXCL:2,ZIP_RDONLY:16,ZIP_FL_OVERWRITE:8192,ZIP_FL_COMPRESSED:4,ZIP_OPSYS_DOS:0,ZIP_OPSYS_AMIGA:1,ZIP_OPSYS_OPENVMS:2,ZIP_OPSYS_UNIX:3,ZIP_OPSYS_VM_CMS:4,ZIP_OPSYS_ATARI_ST:5,ZIP_OPSYS_OS_2:6,ZIP_OPSYS_MACINTOSH:7,ZIP_OPSYS_Z_SYSTEM:8,ZIP_OPSYS_CPM:9,ZIP_OPSYS_WINDOWS_NTFS:10,ZIP_OPSYS_MVS:11,ZIP_OPSYS_VSE:12,ZIP_OPSYS_ACORN_RISC:13,ZIP_OPSYS_VFAT:14,ZIP_OPSYS_ALTERNATE_MVS:15,ZIP_OPSYS_BEOS:16,ZIP_OPSYS_TANDEM:17,ZIP_OPSYS_OS_400:18,ZIP_OPSYS_OS_X:19,ZIP_CM_DEFAULT:-1,ZIP_CM_STORE:0,ZIP_CM_DEFLATE:8,uint08S:t._malloc(1),uint16S:t._malloc(2),uint32S:t._malloc(4),uint64S:t._malloc(8),malloc:t._malloc,free:t._free,getValue:t.getValue,openFromSource:t.cwrap("zip_open_from_source","number",["number","number","number"]),close:t.cwrap("zip_close","number",["number"]),discard:t.cwrap("zip_discard",null,["number"]),getError:t.cwrap("zip_get_error","number",["number"]),getName:t.cwrap("zip_get_name","string",["number","number","number"]),getNumEntries:t.cwrap("zip_get_num_entries","number",["number","number"]),delete:t.cwrap("zip_delete","number",["number","number"]),stat:t.cwrap("zip_stat","number",["number","string","number","number"]),statIndex:t.cwrap("zip_stat_index","number",["number",...yf,"number","number"]),fopen:t.cwrap("zip_fopen","number",["number","string","number"]),fopenIndex:t.cwrap("zip_fopen_index","number",["number",...yf,"number"]),fread:t.cwrap("zip_fread","number",["number","number","number","number"]),fclose:t.cwrap("zip_fclose","number",["number"]),dir:{add:t.cwrap("zip_dir_add","number",["number","string"])},file:{add:t.cwrap("zip_file_add","number",["number","string","number","number"]),getError:t.cwrap("zip_file_get_error","number",["number"]),getExternalAttributes:t.cwrap("zip_file_get_external_attributes","number",["number",...yf,"number","number","number"]),setExternalAttributes:t.cwrap("zip_file_set_external_attributes","number",["number",...yf,"number","number","number"]),setMtime:t.cwrap("zip_file_set_mtime","number",["number",...yf,"number","number"]),setCompression:t.cwrap("zip_set_file_compression","number",["number",...yf,"number","number"])},ext:{countSymlinks:t.cwrap("zip_ext_count_symlinks","number",["number"])},error:{initWithCode:t.cwrap("zip_error_init_with_code",null,["number","number"]),strerror:t.cwrap("zip_error_strerror","string",["number"])},name:{locate:t.cwrap("zip_name_locate","number",["number","string","number"])},source:{fromUnattachedBuffer:t.cwrap("zip_source_buffer_create","number",["number",...yf,"number","number"]),fromBuffer:t.cwrap("zip_source_buffer","number",["number","number",...yf,"number"]),free:t.cwrap("zip_source_free",null,["number"]),keep:t.cwrap("zip_source_keep",null,["number"]),open:t.cwrap("zip_source_open","number",["number"]),close:t.cwrap("zip_source_close","number",["number"]),seek:t.cwrap("zip_source_seek","number",["number",...yf,"number"]),tell:t.cwrap("zip_source_tell","number",["number"]),read:t.cwrap("zip_source_read","number",["number","number","number"]),error:t.cwrap("zip_source_error","number",["number"]),setMtime:t.cwrap("zip_source_set_mtime","number",["number","number"])},struct:{stat:t.cwrap("zipstruct_stat","number",[]),statS:t.cwrap("zipstruct_statS","number",[]),statName:t.cwrap("zipstruct_stat_name","string",["number"]),statIndex:t.cwrap("zipstruct_stat_index","number",["number"]),statSize:t.cwrap("zipstruct_stat_size","number",["number"]),statCompSize:t.cwrap("zipstruct_stat_comp_size","number",["number"]),statCompMethod:t.cwrap("zipstruct_stat_comp_method","number",["number"]),statMtime:t.cwrap("zipstruct_stat_mtime","number",["number"]),statCrc:t.cwrap("zipstruct_stat_crc","number",["number"]),error:t.cwrap("zipstruct_error","number",[]),errorS:t.cwrap("zipstruct_errorS","number",[]),errorCodeZip:t.cwrap("zipstruct_error_code_zip","number",["number"])}})});function nT(t,e){let r=t.indexOf(e);if(r<=0)return null;let o=r;for(;r>=0&&(o=r+e.length,t[o]!==z.sep);){if(t[r-1]===z.sep)return null;r=t.indexOf(e,o)}return t.length>o&&t[o]!==z.sep?null:t.slice(0,o)}var Ul,XW=dt(()=>{bt();bt();_c();Ul=class extends Up{static async openPromise(e,r){let o=new Ul(r);try{return await e(o)}finally{o.saveAndClose()}}constructor(e={}){let r=e.fileExtensions,o=e.readOnlyArchives,a=typeof r>"u"?A=>nT(A,".zip"):A=>{for(let p of r){let h=nT(A,p);if(h)return h}return null},n=(A,p)=>new os(p,{baseFs:A,readOnly:o,stats:A.statSync(p)}),u=async(A,p)=>{let h={baseFs:A,readOnly:o,stats:await A.statPromise(p)};return()=>new os(p,h)};super({...e,factorySync:n,factoryPromise:u,getMountPoint:a})}}});function x8e(t){if(typeof t=="string"&&String(+t)===t)return+t;if(typeof t=="number"&&Number.isFinite(t))return t<0?Date.now()/1e3:t;if(ZW.types.isDate(t))return t.getTime()/1e3;throw new Error("Invalid time")}function wD(){return Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])}var jo,iT,ZW,sT,Ay,BD,os,oT=dt(()=>{bt();bt();bt();bt();bt();bt();jo=Ie("fs"),iT=Ie("stream"),ZW=Ie("util"),sT=tt(Ie("zlib"));eT();Ay="mixed";BD=class extends Error{constructor(r,o){super(r);this.name="Libzip Error",this.code=o}},os=class extends qu{constructor(r,o={}){super();this.listings=new Map;this.entries=new Map;this.fileSources=new Map;this.fds=new Map;this.nextFd=0;this.ready=!1;this.readOnly=!1;let a=o;if(this.level=typeof a.level<"u"?a.level:Ay,r??(r=wD()),typeof r=="string"){let{baseFs:A=new xn}=a;this.baseFs=A,this.path=r}else this.path=null,this.baseFs=null;if(o.stats)this.stats=o.stats;else if(typeof r=="string")try{this.stats=this.baseFs.statSync(r)}catch(A){if(A.code==="ENOENT"&&a.create)this.stats=Ml.makeDefaultStats();else throw A}else this.stats=Ml.makeDefaultStats();this.libzip=UI();let n=this.libzip.malloc(4);try{let A=0;o.readOnly&&(A|=this.libzip.ZIP_RDONLY,this.readOnly=!0),typeof r=="string"&&(r=a.create?wD():this.baseFs.readFileSync(r));let p=this.allocateUnattachedSource(r);try{this.zip=this.libzip.openFromSource(p,A,n),this.lzSource=p}catch(h){throw this.libzip.source.free(p),h}if(this.zip===0){let h=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(h,this.libzip.getValue(n,"i32")),this.makeLibzipError(h)}}finally{this.libzip.free(n)}this.listings.set(wt.root,new Set);let u=this.libzip.getNumEntries(this.zip,0);for(let A=0;Ar)throw new Error("Overread");let n=this.libzip.HEAPU8.subarray(o,o+r);return Buffer.from(n)}finally{this.libzip.free(o)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource),this.ready=!1}}discardAndClose(){this.prepareClose(),this.libzip.discard(this.zip),this.ready=!1}saveAndClose(){if(!this.path||!this.baseFs)throw new Error("ZipFS cannot be saved and must be discarded when loaded from a buffer");if(this.readOnly){this.discardAndClose();return}let r=this.baseFs.existsSync(this.path)||this.stats.mode===Ml.DEFAULT_MODE?void 0:this.stats.mode;this.baseFs.writeFileSync(this.path,this.getBufferAndClose(),{mode:r}),this.ready=!1}resolve(r){return z.resolve(wt.root,r)}async openPromise(r,o,a){return this.openSync(r,o,a)}openSync(r,o,a){let n=this.nextFd++;return this.fds.set(n,{cursor:0,p:r}),n}hasOpenFileHandles(){return!!this.fds.size}async opendirPromise(r,o){return this.opendirSync(r,o)}opendirSync(r,o={}){let a=this.resolveFilename(`opendir '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw sr.ENOENT(`opendir '${r}'`);let n=this.listings.get(a);if(!n)throw sr.ENOTDIR(`opendir '${r}'`);let u=[...n],A=this.openSync(a,"r");return pD(this,a,u,{onClose:()=>{this.closeSync(A)}})}async readPromise(r,o,a,n,u){return this.readSync(r,o,a,n,u)}readSync(r,o,a=0,n=o.byteLength,u=-1){let A=this.fds.get(r);if(typeof A>"u")throw sr.EBADF("read");let p=u===-1||u===null?A.cursor:u,h=this.readFileSync(A.p);h.copy(o,a,p,p+n);let E=Math.max(0,Math.min(h.length-p,n));return(u===-1||u===null)&&(A.cursor+=E),E}async writePromise(r,o,a,n,u){return typeof o=="string"?this.writeSync(r,o,u):this.writeSync(r,o,a,n,u)}writeSync(r,o,a,n,u){throw typeof this.fds.get(r)>"u"?sr.EBADF("read"):new Error("Unimplemented")}async closePromise(r){return this.closeSync(r)}closeSync(r){if(typeof this.fds.get(r)>"u")throw sr.EBADF("read");this.fds.delete(r)}createReadStream(r,{encoding:o}={}){if(r===null)throw new Error("Unimplemented");let a=this.openSync(r,"r"),n=Object.assign(new iT.PassThrough({emitClose:!0,autoDestroy:!0,destroy:(A,p)=>{clearImmediate(u),this.closeSync(a),p(A)}}),{close(){n.destroy()},bytesRead:0,path:r,pending:!1}),u=setImmediate(async()=>{try{let A=await this.readFilePromise(r,o);n.bytesRead=A.length,n.end(A)}catch(A){n.destroy(A)}});return n}createWriteStream(r,{encoding:o}={}){if(this.readOnly)throw sr.EROFS(`open '${r}'`);if(r===null)throw new Error("Unimplemented");let a=[],n=this.openSync(r,"w"),u=Object.assign(new iT.PassThrough({autoDestroy:!0,emitClose:!0,destroy:(A,p)=>{try{A?p(A):(this.writeFileSync(r,Buffer.concat(a),o),p(null))}catch(h){p(h)}finally{this.closeSync(n)}}}),{close(){u.destroy()},bytesWritten:0,path:r,pending:!1});return u.on("data",A=>{let p=Buffer.from(A);u.bytesWritten+=p.length,a.push(p)}),u}async realpathPromise(r){return this.realpathSync(r)}realpathSync(r){let o=this.resolveFilename(`lstat '${r}'`,r);if(!this.entries.has(o)&&!this.listings.has(o))throw sr.ENOENT(`lstat '${r}'`);return o}async existsPromise(r){return this.existsSync(r)}existsSync(r){if(!this.ready)throw sr.EBUSY(`archive closed, existsSync '${r}'`);if(this.symlinkCount===0){let a=z.resolve(wt.root,r);return this.entries.has(a)||this.listings.has(a)}let o;try{o=this.resolveFilename(`stat '${r}'`,r,void 0,!1)}catch{return!1}return o===void 0?!1:this.entries.has(o)||this.listings.has(o)}async accessPromise(r,o){return this.accessSync(r,o)}accessSync(r,o=jo.constants.F_OK){let a=this.resolveFilename(`access '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw sr.ENOENT(`access '${r}'`);if(this.readOnly&&o&jo.constants.W_OK)throw sr.EROFS(`access '${r}'`)}async statPromise(r,o={bigint:!1}){return o.bigint?this.statSync(r,{bigint:!0}):this.statSync(r)}statSync(r,o={bigint:!1,throwIfNoEntry:!0}){let a=this.resolveFilename(`stat '${r}'`,r,void 0,o.throwIfNoEntry);if(a!==void 0){if(!this.entries.has(a)&&!this.listings.has(a)){if(o.throwIfNoEntry===!1)return;throw sr.ENOENT(`stat '${r}'`)}if(r[r.length-1]==="/"&&!this.listings.has(a))throw sr.ENOTDIR(`stat '${r}'`);return this.statImpl(`stat '${r}'`,a,o)}}async fstatPromise(r,o){return this.fstatSync(r,o)}fstatSync(r,o){let a=this.fds.get(r);if(typeof a>"u")throw sr.EBADF("fstatSync");let{p:n}=a,u=this.resolveFilename(`stat '${n}'`,n);if(!this.entries.has(u)&&!this.listings.has(u))throw sr.ENOENT(`stat '${n}'`);if(n[n.length-1]==="/"&&!this.listings.has(u))throw sr.ENOTDIR(`stat '${n}'`);return this.statImpl(`fstat '${n}'`,u,o)}async lstatPromise(r,o={bigint:!1}){return o.bigint?this.lstatSync(r,{bigint:!0}):this.lstatSync(r)}lstatSync(r,o={bigint:!1,throwIfNoEntry:!0}){let a=this.resolveFilename(`lstat '${r}'`,r,!1,o.throwIfNoEntry);if(a!==void 0){if(!this.entries.has(a)&&!this.listings.has(a)){if(o.throwIfNoEntry===!1)return;throw sr.ENOENT(`lstat '${r}'`)}if(r[r.length-1]==="/"&&!this.listings.has(a))throw sr.ENOTDIR(`lstat '${r}'`);return this.statImpl(`lstat '${r}'`,a,o)}}statImpl(r,o,a={}){let n=this.entries.get(o);if(typeof n<"u"){let u=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,n,0,0,u)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let p=this.stats.uid,h=this.stats.gid,E=this.libzip.struct.statSize(u)>>>0,w=512,v=Math.ceil(E/w),b=(this.libzip.struct.statMtime(u)>>>0)*1e3,C=b,R=b,L=b,_=new Date(C),V=new Date(R),re=new Date(L),oe=new Date(b),pe=this.listings.has(o)?jo.constants.S_IFDIR:this.isSymbolicLink(n)?jo.constants.S_IFLNK:jo.constants.S_IFREG,he=pe===jo.constants.S_IFDIR?493:420,ve=pe|this.getUnixMode(n,he)&511,ge=this.libzip.struct.statCrc(u),le=Object.assign(new Ml.StatEntry,{uid:p,gid:h,size:E,blksize:w,blocks:v,atime:_,birthtime:V,ctime:re,mtime:oe,atimeMs:C,birthtimeMs:R,ctimeMs:L,mtimeMs:b,mode:ve,crc:ge});return a.bigint===!0?Ml.convertToBigIntStats(le):le}if(this.listings.has(o)){let u=this.stats.uid,A=this.stats.gid,p=0,h=512,E=0,w=this.stats.mtimeMs,v=this.stats.mtimeMs,b=this.stats.mtimeMs,C=this.stats.mtimeMs,R=new Date(w),L=new Date(v),_=new Date(b),V=new Date(C),re=jo.constants.S_IFDIR|493,oe=0,pe=Object.assign(new Ml.StatEntry,{uid:u,gid:A,size:p,blksize:h,blocks:E,atime:R,birthtime:L,ctime:_,mtime:V,atimeMs:w,birthtimeMs:v,ctimeMs:b,mtimeMs:C,mode:re,crc:oe});return a.bigint===!0?Ml.convertToBigIntStats(pe):pe}throw new Error("Unreachable")}getUnixMode(r,o){if(this.libzip.file.getExternalAttributes(this.zip,r,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?o:this.libzip.getValue(this.libzip.uint32S,"i32")>>>16}registerListing(r){let o=this.listings.get(r);if(o)return o;this.registerListing(z.dirname(r)).add(z.basename(r));let n=new Set;return this.listings.set(r,n),n}registerEntry(r,o){this.registerListing(z.dirname(r)).add(z.basename(r)),this.entries.set(r,o)}unregisterListing(r){this.listings.delete(r);let o=this.listings.get(z.dirname(r));o==null||o.delete(z.basename(r))}unregisterEntry(r){this.unregisterListing(r);let o=this.entries.get(r);this.entries.delete(r),!(typeof o>"u")&&(this.fileSources.delete(o),this.isSymbolicLink(o)&&this.symlinkCount--)}deleteEntry(r,o){if(this.unregisterEntry(r),this.libzip.delete(this.zip,o)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}resolveFilename(r,o,a=!0,n=!0){if(!this.ready)throw sr.EBUSY(`archive closed, ${r}`);let u=z.resolve(wt.root,o);if(u==="/")return wt.root;let A=this.entries.get(u);if(a&&A!==void 0)if(this.symlinkCount!==0&&this.isSymbolicLink(A)){let p=this.getFileSource(A).toString();return this.resolveFilename(r,z.resolve(z.dirname(u),p),!0,n)}else return u;for(;;){let p=this.resolveFilename(r,z.dirname(u),!0,n);if(p===void 0)return p;let h=this.listings.has(p),E=this.entries.has(p);if(!h&&!E){if(n===!1)return;throw sr.ENOENT(r)}if(!h)throw sr.ENOTDIR(r);if(u=z.resolve(p,z.basename(u)),!a||this.symlinkCount===0)break;let w=this.libzip.name.locate(this.zip,u.slice(1),0);if(w===-1)break;if(this.isSymbolicLink(w)){let v=this.getFileSource(w).toString();u=z.resolve(z.dirname(u),v)}else break}return u}allocateBuffer(r){Buffer.isBuffer(r)||(r=Buffer.from(r));let o=this.libzip.malloc(r.byteLength);if(!o)throw new Error("Couldn't allocate enough memory");return new Uint8Array(this.libzip.HEAPU8.buffer,o,r.byteLength).set(r),{buffer:o,byteLength:r.byteLength}}allocateUnattachedSource(r){let o=this.libzip.struct.errorS(),{buffer:a,byteLength:n}=this.allocateBuffer(r),u=this.libzip.source.fromUnattachedBuffer(a,n,0,1,o);if(u===0)throw this.libzip.free(o),this.makeLibzipError(o);return u}allocateSource(r){let{buffer:o,byteLength:a}=this.allocateBuffer(r),n=this.libzip.source.fromBuffer(this.zip,o,a,0,1);if(n===0)throw this.libzip.free(o),this.makeLibzipError(this.libzip.getError(this.zip));return n}setFileSource(r,o){let a=Buffer.isBuffer(o)?o:Buffer.from(o),n=z.relative(wt.root,r),u=this.allocateSource(o);try{let A=this.libzip.file.add(this.zip,n,u,this.libzip.ZIP_FL_OVERWRITE);if(A===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.level!=="mixed"){let p=this.level===0?this.libzip.ZIP_CM_STORE:this.libzip.ZIP_CM_DEFLATE;if(this.libzip.file.setCompression(this.zip,A,0,p,this.level)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}return this.fileSources.set(A,a),A}catch(A){throw this.libzip.source.free(u),A}}isSymbolicLink(r){if(this.symlinkCount===0)return!1;if(this.libzip.file.getExternalAttributes(this.zip,r,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?!1:(this.libzip.getValue(this.libzip.uint32S,"i32")>>>16&jo.constants.S_IFMT)===jo.constants.S_IFLNK}getFileSource(r,o={asyncDecompress:!1}){let a=this.fileSources.get(r);if(typeof a<"u")return a;let n=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,r,0,0,n)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let A=this.libzip.struct.statCompSize(n),p=this.libzip.struct.statCompMethod(n),h=this.libzip.malloc(A);try{let E=this.libzip.fopenIndex(this.zip,r,0,this.libzip.ZIP_FL_COMPRESSED);if(E===0)throw this.makeLibzipError(this.libzip.getError(this.zip));try{let w=this.libzip.fread(E,h,A,0);if(w===-1)throw this.makeLibzipError(this.libzip.file.getError(E));if(wA)throw new Error("Overread");let v=this.libzip.HEAPU8.subarray(h,h+A),b=Buffer.from(v);if(p===0)return this.fileSources.set(r,b),b;if(o.asyncDecompress)return new Promise((C,R)=>{sT.default.inflateRaw(b,(L,_)=>{L?R(L):(this.fileSources.set(r,_),C(_))})});{let C=sT.default.inflateRawSync(b);return this.fileSources.set(r,C),C}}finally{this.libzip.fclose(E)}}finally{this.libzip.free(h)}}async fchmodPromise(r,o){return this.chmodPromise(this.fdToPath(r,"fchmod"),o)}fchmodSync(r,o){return this.chmodSync(this.fdToPath(r,"fchmodSync"),o)}async chmodPromise(r,o){return this.chmodSync(r,o)}chmodSync(r,o){if(this.readOnly)throw sr.EROFS(`chmod '${r}'`);o&=493;let a=this.resolveFilename(`chmod '${r}'`,r,!1),n=this.entries.get(a);if(typeof n>"u")throw new Error(`Assertion failed: The entry should have been registered (${a})`);let A=this.getUnixMode(n,jo.constants.S_IFREG|0)&-512|o;if(this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,A<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async fchownPromise(r,o,a){return this.chownPromise(this.fdToPath(r,"fchown"),o,a)}fchownSync(r,o,a){return this.chownSync(this.fdToPath(r,"fchownSync"),o,a)}async chownPromise(r,o,a){return this.chownSync(r,o,a)}chownSync(r,o,a){throw new Error("Unimplemented")}async renamePromise(r,o){return this.renameSync(r,o)}renameSync(r,o){throw new Error("Unimplemented")}async copyFilePromise(r,o,a){let{indexSource:n,indexDest:u,resolvedDestP:A}=this.prepareCopyFile(r,o,a),p=await this.getFileSource(n,{asyncDecompress:!0}),h=this.setFileSource(A,p);h!==u&&this.registerEntry(A,h)}copyFileSync(r,o,a=0){let{indexSource:n,indexDest:u,resolvedDestP:A}=this.prepareCopyFile(r,o,a),p=this.getFileSource(n),h=this.setFileSource(A,p);h!==u&&this.registerEntry(A,h)}prepareCopyFile(r,o,a=0){if(this.readOnly)throw sr.EROFS(`copyfile '${r} -> '${o}'`);if((a&jo.constants.COPYFILE_FICLONE_FORCE)!==0)throw sr.ENOSYS("unsupported clone operation",`copyfile '${r}' -> ${o}'`);let n=this.resolveFilename(`copyfile '${r} -> ${o}'`,r),u=this.entries.get(n);if(typeof u>"u")throw sr.EINVAL(`copyfile '${r}' -> '${o}'`);let A=this.resolveFilename(`copyfile '${r}' -> ${o}'`,o),p=this.entries.get(A);if((a&(jo.constants.COPYFILE_EXCL|jo.constants.COPYFILE_FICLONE_FORCE))!==0&&typeof p<"u")throw sr.EEXIST(`copyfile '${r}' -> '${o}'`);return{indexSource:u,resolvedDestP:A,indexDest:p}}async appendFilePromise(r,o,a){if(this.readOnly)throw sr.EROFS(`open '${r}'`);return typeof a>"u"?a={flag:"a"}:typeof a=="string"?a={flag:"a",encoding:a}:typeof a.flag>"u"&&(a={flag:"a",...a}),this.writeFilePromise(r,o,a)}appendFileSync(r,o,a={}){if(this.readOnly)throw sr.EROFS(`open '${r}'`);return typeof a>"u"?a={flag:"a"}:typeof a=="string"?a={flag:"a",encoding:a}:typeof a.flag>"u"&&(a={flag:"a",...a}),this.writeFileSync(r,o,a)}fdToPath(r,o){var n;let a=(n=this.fds.get(r))==null?void 0:n.p;if(typeof a>"u")throw sr.EBADF(o);return a}async writeFilePromise(r,o,a){let{encoding:n,mode:u,index:A,resolvedP:p}=this.prepareWriteFile(r,a);A!==void 0&&typeof a=="object"&&a.flag&&a.flag.includes("a")&&(o=Buffer.concat([await this.getFileSource(A,{asyncDecompress:!0}),Buffer.from(o)])),n!==null&&(o=o.toString(n));let h=this.setFileSource(p,o);h!==A&&this.registerEntry(p,h),u!==null&&await this.chmodPromise(p,u)}writeFileSync(r,o,a){let{encoding:n,mode:u,index:A,resolvedP:p}=this.prepareWriteFile(r,a);A!==void 0&&typeof a=="object"&&a.flag&&a.flag.includes("a")&&(o=Buffer.concat([this.getFileSource(A),Buffer.from(o)])),n!==null&&(o=o.toString(n));let h=this.setFileSource(p,o);h!==A&&this.registerEntry(p,h),u!==null&&this.chmodSync(p,u)}prepareWriteFile(r,o){if(typeof r=="number"&&(r=this.fdToPath(r,"read")),this.readOnly)throw sr.EROFS(`open '${r}'`);let a=this.resolveFilename(`open '${r}'`,r);if(this.listings.has(a))throw sr.EISDIR(`open '${r}'`);let n=null,u=null;typeof o=="string"?n=o:typeof o=="object"&&({encoding:n=null,mode:u=null}=o);let A=this.entries.get(a);return{encoding:n,mode:u,resolvedP:a,index:A}}async unlinkPromise(r){return this.unlinkSync(r)}unlinkSync(r){if(this.readOnly)throw sr.EROFS(`unlink '${r}'`);let o=this.resolveFilename(`unlink '${r}'`,r);if(this.listings.has(o))throw sr.EISDIR(`unlink '${r}'`);let a=this.entries.get(o);if(typeof a>"u")throw sr.EINVAL(`unlink '${r}'`);this.deleteEntry(o,a)}async utimesPromise(r,o,a){return this.utimesSync(r,o,a)}utimesSync(r,o,a){if(this.readOnly)throw sr.EROFS(`utimes '${r}'`);let n=this.resolveFilename(`utimes '${r}'`,r);this.utimesImpl(n,a)}async lutimesPromise(r,o,a){return this.lutimesSync(r,o,a)}lutimesSync(r,o,a){if(this.readOnly)throw sr.EROFS(`lutimes '${r}'`);let n=this.resolveFilename(`utimes '${r}'`,r,!1);this.utimesImpl(n,a)}utimesImpl(r,o){this.listings.has(r)&&(this.entries.has(r)||this.hydrateDirectory(r));let a=this.entries.get(r);if(a===void 0)throw new Error("Unreachable");if(this.libzip.file.setMtime(this.zip,a,0,x8e(o),0)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async mkdirPromise(r,o){return this.mkdirSync(r,o)}mkdirSync(r,{mode:o=493,recursive:a=!1}={}){if(a)return this.mkdirpSync(r,{chmod:o});if(this.readOnly)throw sr.EROFS(`mkdir '${r}'`);let n=this.resolveFilename(`mkdir '${r}'`,r);if(this.entries.has(n)||this.listings.has(n))throw sr.EEXIST(`mkdir '${r}'`);this.hydrateDirectory(n),this.chmodSync(n,o)}async rmdirPromise(r,o){return this.rmdirSync(r,o)}rmdirSync(r,{recursive:o=!1}={}){if(this.readOnly)throw sr.EROFS(`rmdir '${r}'`);if(o){this.removeSync(r);return}let a=this.resolveFilename(`rmdir '${r}'`,r),n=this.listings.get(a);if(!n)throw sr.ENOTDIR(`rmdir '${r}'`);if(n.size>0)throw sr.ENOTEMPTY(`rmdir '${r}'`);let u=this.entries.get(a);if(typeof u>"u")throw sr.EINVAL(`rmdir '${r}'`);this.deleteEntry(r,u)}hydrateDirectory(r){let o=this.libzip.dir.add(this.zip,z.relative(wt.root,r));if(o===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.registerListing(r),this.registerEntry(r,o),o}async linkPromise(r,o){return this.linkSync(r,o)}linkSync(r,o){throw sr.EOPNOTSUPP(`link '${r}' -> '${o}'`)}async symlinkPromise(r,o){return this.symlinkSync(r,o)}symlinkSync(r,o){if(this.readOnly)throw sr.EROFS(`symlink '${r}' -> '${o}'`);let a=this.resolveFilename(`symlink '${r}' -> '${o}'`,o);if(this.listings.has(a))throw sr.EISDIR(`symlink '${r}' -> '${o}'`);if(this.entries.has(a))throw sr.EEXIST(`symlink '${r}' -> '${o}'`);let n=this.setFileSource(a,r);if(this.registerEntry(a,n),this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,(jo.constants.S_IFLNK|511)<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));this.symlinkCount+=1}async readFilePromise(r,o){typeof o=="object"&&(o=o?o.encoding:void 0);let a=await this.readFileBuffer(r,{asyncDecompress:!0});return o?a.toString(o):a}readFileSync(r,o){typeof o=="object"&&(o=o?o.encoding:void 0);let a=this.readFileBuffer(r);return o?a.toString(o):a}readFileBuffer(r,o={asyncDecompress:!1}){typeof r=="number"&&(r=this.fdToPath(r,"read"));let a=this.resolveFilename(`open '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw sr.ENOENT(`open '${r}'`);if(r[r.length-1]==="/"&&!this.listings.has(a))throw sr.ENOTDIR(`open '${r}'`);if(this.listings.has(a))throw sr.EISDIR("read");let n=this.entries.get(a);if(n===void 0)throw new Error("Unreachable");return this.getFileSource(n,o)}async readdirPromise(r,o){return this.readdirSync(r,o)}readdirSync(r,o){let a=this.resolveFilename(`scandir '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw sr.ENOENT(`scandir '${r}'`);let n=this.listings.get(a);if(!n)throw sr.ENOTDIR(`scandir '${r}'`);let u=[...n];return o!=null&&o.withFileTypes?u.map(A=>Object.assign(this.statImpl("lstat",z.join(r,A)),{name:A})):u}async readlinkPromise(r){let o=this.prepareReadlink(r);return(await this.getFileSource(o,{asyncDecompress:!0})).toString()}readlinkSync(r){let o=this.prepareReadlink(r);return this.getFileSource(o).toString()}prepareReadlink(r){let o=this.resolveFilename(`readlink '${r}'`,r,!1);if(!this.entries.has(o)&&!this.listings.has(o))throw sr.ENOENT(`readlink '${r}'`);if(r[r.length-1]==="/"&&!this.listings.has(o))throw sr.ENOTDIR(`open '${r}'`);if(this.listings.has(o))throw sr.EINVAL(`readlink '${r}'`);let a=this.entries.get(o);if(a===void 0)throw new Error("Unreachable");if(!this.isSymbolicLink(a))throw sr.EINVAL(`readlink '${r}'`);return a}async truncatePromise(r,o=0){let a=this.resolveFilename(`open '${r}'`,r),n=this.entries.get(a);if(typeof n>"u")throw sr.EINVAL(`open '${r}'`);let u=await this.getFileSource(n,{asyncDecompress:!0}),A=Buffer.alloc(o,0);return u.copy(A),await this.writeFilePromise(r,A)}truncateSync(r,o=0){let a=this.resolveFilename(`open '${r}'`,r),n=this.entries.get(a);if(typeof n>"u")throw sr.EINVAL(`open '${r}'`);let u=this.getFileSource(n),A=Buffer.alloc(o,0);return u.copy(A),this.writeFileSync(r,A)}async ftruncatePromise(r,o){return this.truncatePromise(this.fdToPath(r,"ftruncate"),o)}ftruncateSync(r,o){return this.truncateSync(this.fdToPath(r,"ftruncateSync"),o)}watch(r,o,a){let n;switch(typeof o){case"function":case"string":case"undefined":n=!0;break;default:({persistent:n=!0}=o);break}if(!n)return{on:()=>{},close:()=>{}};let u=setInterval(()=>{},24*60*60*1e3);return{on:()=>{},close:()=>{clearInterval(u)}}}watchFile(r,o,a){let n=z.resolve(wt.root,r);return sy(this,n,o,a)}unwatchFile(r,o){let a=z.resolve(wt.root,r);return Tg(this,a,o)}}});function eY(t,e,r=Buffer.alloc(0),o){let a=new os(r),n=w=>w===e||w.startsWith(`${e}/`)?w.slice(0,e.length):null,u=async(w,v)=>()=>a,A=(w,v)=>a,p={...t},h=new xn(p),E=new Up({baseFs:h,getMountPoint:n,factoryPromise:u,factorySync:A,magicByte:21,maxAge:1/0,typeCheck:o==null?void 0:o.typeCheck});return OI($W.default,new _p(E)),a}var $W,tY=dt(()=>{bt();$W=tt(Ie("fs"));oT()});var rY=dt(()=>{XW();oT();tY()});var _I={};Yt(_I,{DEFAULT_COMPRESSION_LEVEL:()=>Ay,LibzipError:()=>BD,ZipFS:()=>os,ZipOpenFS:()=>Ul,getArchivePart:()=>nT,getLibzipPromise:()=>Q8e,getLibzipSync:()=>b8e,makeEmptyArchive:()=>wD,mountMemoryDrive:()=>eY});function b8e(){return UI()}async function Q8e(){return UI()}var nY,_c=dt(()=>{eT();nY=tt(KW());zW();rY();YW(()=>{let t=(0,nY.default)();return JW(t)})});var sY=U((cxt,iY)=>{"use strict";function k8e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function _g(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,_g)}k8e(_g,Error);_g.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",w;for(w=0;w0){for(w=1,v=1;w>",P=yr(">>",!1),y=">&",F=yr(">&",!1),J=">",X=yr(">",!1),$="<<<",ie=yr("<<<",!1),ke="<&",Ne=yr("<&",!1),st="<",ht=yr("<",!1),Ut=function(N){return{type:"argument",segments:[].concat(...N)}},Xt=function(N){return N},Pt="$'",tn=yr("$'",!1),Dr="'",fr=yr("'",!1),Br=function(N){return[{type:"text",text:N}]},jr='""',Hn=yr('""',!1),bs=function(){return{type:"text",text:""}},ki='"',gs=yr('"',!1),to=function(N){return N},Di=function(N){return{type:"arithmetic",arithmetic:N,quoted:!0}},Qs=function(N){return{type:"shell",shell:N,quoted:!0}},ro=function(N){return{type:"variable",...N,quoted:!0}},pc=function(N){return{type:"text",text:N}},gu=function(N){return{type:"arithmetic",arithmetic:N,quoted:!1}},ap=function(N){return{type:"shell",shell:N,quoted:!1}},lp=function(N){return{type:"variable",...N,quoted:!1}},ks=function(N){return{type:"glob",pattern:N}},En=/^[^']/,no=ys(["'"],!0,!1),Fs=function(N){return N.join("")},Cl=/^[^$"]/,El=ys(["$",'"'],!0,!1),io=`\\ +`,Ue=yr(`\\ +`,!1),Fn=function(){return""},Fi="\\",Rn=yr("\\",!1),Ui=/^[\\$"`]/,Zt=ys(["\\","$",'"',"`"],!1,!1),Ri=function(N){return N},$n="\\a",Ma=yr("\\a",!1),$t=function(){return"a"},hc="\\b",du=yr("\\b",!1),gc=function(){return"\b"},Il=/^[Ee]/,PA=ys(["E","e"],!1,!1),mu=function(){return"\x1B"},Ee="\\f",Rt=yr("\\f",!1),dc=function(){return"\f"},_i="\\n",yu=yr("\\n",!1),qt=function(){return` +`},wl="\\r",xA=yr("\\r",!1),cp=function(){return"\r"},mc="\\t",bA=yr("\\t",!1),Dn=function(){return" "},ui="\\v",yc=yr("\\v",!1),QA=function(){return"\v"},ra=/^[\\'"?]/,Hi=ys(["\\","'",'"',"?"],!1,!1),Oo=function(N){return String.fromCharCode(parseInt(N,16))},$e="\\x",so=yr("\\x",!1),Bl="\\u",Cu=yr("\\u",!1),qi="\\U",Eu=yr("\\U",!1),kA=function(N){return String.fromCodePoint(parseInt(N,16))},Ua=/^[0-7]/,Cc=ys([["0","7"]],!1,!1),ds=/^[0-9a-fA-f]/,Ot=ys([["0","9"],["a","f"],["A","f"]],!1,!1),Sn=og(),di="{}",na=yr("{}",!1),oo=function(){return"{}"},Rs="-",ia=yr("-",!1),sa="+",Mo=yr("+",!1),Zi=".",Ts=yr(".",!1),Ns=function(N,K,te){return{type:"number",value:(N==="-"?-1:1)*parseFloat(K.join("")+"."+te.join(""))}},Ls=function(N,K){return{type:"number",value:(N==="-"?-1:1)*parseInt(K.join(""))}},ao=function(N){return{type:"variable",...N}},Yn=function(N){return{type:"variable",name:N}},qn=function(N){return N},$i="*",es=yr("*",!1),mi="/",Ha=yr("/",!1),oa=function(N,K,te){return{type:K==="*"?"multiplication":"division",right:te}},ee=function(N,K){return K.reduce((te,Ae)=>({left:te,...Ae}),N)},we=function(N,K,te){return{type:K==="+"?"addition":"subtraction",right:te}},je="$((",Be=yr("$((",!1),xe="))",Ve=yr("))",!1),vt=function(N){return N},tr="$(",Zr=yr("$(",!1),Tn=function(N){return N},_r="${",ei=yr("${",!1),Ti=":-",Kn=yr(":-",!1),qa=function(N,K){return{name:N,defaultValue:K}},aa=":-}",yi=yr(":-}",!1),la=function(N){return{name:N,defaultValue:[]}},ja=":+",lo=yr(":+",!1),FA=function(N,K){return{name:N,alternativeValue:K}},Ec=":+}",ca=yr(":+}",!1),rg=function(N){return{name:N,alternativeValue:[]}},Ic=function(N){return{name:N}},bm="$",ng=yr("$",!1),Vn=function(N){return e.isGlobPattern(N)},up=function(N){return N},ig=/^[a-zA-Z0-9_]/,RA=ys([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),Os=function(){return sg()},Iu=/^[$@*?#a-zA-Z0-9_\-]/,Ga=ys(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),ji=/^[()}<>$|&; \t"']/,ua=ys(["(",")","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),wu=/^[<>&; \t"']/,ms=ys(["<",">","&",";"," "," ",'"',"'"],!1,!1),wc=/^[ \t]/,Bc=ys([" "," "],!1,!1),G=0,Dt=0,vl=[{line:1,column:1}],Si=0,vc=[],lt=0,Bu;if("startRule"in e){if(!(e.startRule in o))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=o[e.startRule]}function sg(){return t.substring(Dt,G)}function cI(){return Dc(Dt,G)}function TA(N,K){throw K=K!==void 0?K:Dc(Dt,G),cg([lg(N)],t.substring(Dt,G),K)}function Ap(N,K){throw K=K!==void 0?K:Dc(Dt,G),Qm(N,K)}function yr(N,K){return{type:"literal",text:N,ignoreCase:K}}function ys(N,K,te){return{type:"class",parts:N,inverted:K,ignoreCase:te}}function og(){return{type:"any"}}function ag(){return{type:"end"}}function lg(N){return{type:"other",description:N}}function fp(N){var K=vl[N],te;if(K)return K;for(te=N-1;!vl[te];)te--;for(K=vl[te],K={line:K.line,column:K.column};teSi&&(Si=G,vc=[]),vc.push(N))}function Qm(N,K){return new _g(N,null,null,K)}function cg(N,K,te){return new _g(_g.buildMessage(N,K),N,K,te)}function ug(){var N,K,te;for(N=G,K=[],te=kt();te!==r;)K.push(te),te=kt();return K!==r?(te=vu(),te===r&&(te=null),te!==r?(Dt=N,K=n(te),N=K):(G=N,N=r)):(G=N,N=r),N}function vu(){var N,K,te,Ae,ze;if(N=G,K=Du(),K!==r){for(te=[],Ae=kt();Ae!==r;)te.push(Ae),Ae=kt();te!==r?(Ae=Ag(),Ae!==r?(ze=km(),ze===r&&(ze=null),ze!==r?(Dt=N,K=u(K,Ae,ze),N=K):(G=N,N=r)):(G=N,N=r)):(G=N,N=r)}else G=N,N=r;if(N===r)if(N=G,K=Du(),K!==r){for(te=[],Ae=kt();Ae!==r;)te.push(Ae),Ae=kt();te!==r?(Ae=Ag(),Ae===r&&(Ae=null),Ae!==r?(Dt=N,K=A(K,Ae),N=K):(G=N,N=r)):(G=N,N=r)}else G=N,N=r;return N}function km(){var N,K,te,Ae,ze;for(N=G,K=[],te=kt();te!==r;)K.push(te),te=kt();if(K!==r)if(te=vu(),te!==r){for(Ae=[],ze=kt();ze!==r;)Ae.push(ze),ze=kt();Ae!==r?(Dt=N,K=p(te),N=K):(G=N,N=r)}else G=N,N=r;else G=N,N=r;return N}function Ag(){var N;return t.charCodeAt(G)===59?(N=h,G++):(N=r,lt===0&&mt(E)),N===r&&(t.charCodeAt(G)===38?(N=w,G++):(N=r,lt===0&&mt(v))),N}function Du(){var N,K,te;return N=G,K=Aa(),K!==r?(te=uI(),te===r&&(te=null),te!==r?(Dt=N,K=b(K,te),N=K):(G=N,N=r)):(G=N,N=r),N}function uI(){var N,K,te,Ae,ze,gt,ur;for(N=G,K=[],te=kt();te!==r;)K.push(te),te=kt();if(K!==r)if(te=Fm(),te!==r){for(Ae=[],ze=kt();ze!==r;)Ae.push(ze),ze=kt();if(Ae!==r)if(ze=Du(),ze!==r){for(gt=[],ur=kt();ur!==r;)gt.push(ur),ur=kt();gt!==r?(Dt=N,K=C(te,ze),N=K):(G=N,N=r)}else G=N,N=r;else G=N,N=r}else G=N,N=r;else G=N,N=r;return N}function Fm(){var N;return t.substr(G,2)===R?(N=R,G+=2):(N=r,lt===0&&mt(L)),N===r&&(t.substr(G,2)===_?(N=_,G+=2):(N=r,lt===0&&mt(V))),N}function Aa(){var N,K,te;return N=G,K=fg(),K!==r?(te=Sc(),te===r&&(te=null),te!==r?(Dt=N,K=re(K,te),N=K):(G=N,N=r)):(G=N,N=r),N}function Sc(){var N,K,te,Ae,ze,gt,ur;for(N=G,K=[],te=kt();te!==r;)K.push(te),te=kt();if(K!==r)if(te=Dl(),te!==r){for(Ae=[],ze=kt();ze!==r;)Ae.push(ze),ze=kt();if(Ae!==r)if(ze=Aa(),ze!==r){for(gt=[],ur=kt();ur!==r;)gt.push(ur),ur=kt();gt!==r?(Dt=N,K=oe(te,ze),N=K):(G=N,N=r)}else G=N,N=r;else G=N,N=r}else G=N,N=r;else G=N,N=r;return N}function Dl(){var N;return t.substr(G,2)===pe?(N=pe,G+=2):(N=r,lt===0&&mt(he)),N===r&&(t.charCodeAt(G)===124?(N=ve,G++):(N=r,lt===0&&mt(ge))),N}function Su(){var N,K,te,Ae,ze,gt;if(N=G,K=dg(),K!==r)if(t.charCodeAt(G)===61?(te=le,G++):(te=r,lt===0&&mt(Pe)),te!==r)if(Ae=Uo(),Ae!==r){for(ze=[],gt=kt();gt!==r;)ze.push(gt),gt=kt();ze!==r?(Dt=N,K=g(K,Ae),N=K):(G=N,N=r)}else G=N,N=r;else G=N,N=r;else G=N,N=r;if(N===r)if(N=G,K=dg(),K!==r)if(t.charCodeAt(G)===61?(te=le,G++):(te=r,lt===0&&mt(Pe)),te!==r){for(Ae=[],ze=kt();ze!==r;)Ae.push(ze),ze=kt();Ae!==r?(Dt=N,K=De(K),N=K):(G=N,N=r)}else G=N,N=r;else G=N,N=r;return N}function fg(){var N,K,te,Ae,ze,gt,ur,gr,hn,ri,Ni;for(N=G,K=[],te=kt();te!==r;)K.push(te),te=kt();if(K!==r)if(t.charCodeAt(G)===40?(te=Ce,G++):(te=r,lt===0&&mt(de)),te!==r){for(Ae=[],ze=kt();ze!==r;)Ae.push(ze),ze=kt();if(Ae!==r)if(ze=vu(),ze!==r){for(gt=[],ur=kt();ur!==r;)gt.push(ur),ur=kt();if(gt!==r)if(t.charCodeAt(G)===41?(ur=ne,G++):(ur=r,lt===0&&mt(Z)),ur!==r){for(gr=[],hn=kt();hn!==r;)gr.push(hn),hn=kt();if(gr!==r){for(hn=[],ri=Wa();ri!==r;)hn.push(ri),ri=Wa();if(hn!==r){for(ri=[],Ni=kt();Ni!==r;)ri.push(Ni),Ni=kt();ri!==r?(Dt=N,K=me(ze,hn),N=K):(G=N,N=r)}else G=N,N=r}else G=N,N=r}else G=N,N=r;else G=N,N=r}else G=N,N=r;else G=N,N=r}else G=N,N=r;else G=N,N=r;if(N===r){for(N=G,K=[],te=kt();te!==r;)K.push(te),te=kt();if(K!==r)if(t.charCodeAt(G)===123?(te=be,G++):(te=r,lt===0&&mt(ut)),te!==r){for(Ae=[],ze=kt();ze!==r;)Ae.push(ze),ze=kt();if(Ae!==r)if(ze=vu(),ze!==r){for(gt=[],ur=kt();ur!==r;)gt.push(ur),ur=kt();if(gt!==r)if(t.charCodeAt(G)===125?(ur=H,G++):(ur=r,lt===0&&mt(yt)),ur!==r){for(gr=[],hn=kt();hn!==r;)gr.push(hn),hn=kt();if(gr!==r){for(hn=[],ri=Wa();ri!==r;)hn.push(ri),ri=Wa();if(hn!==r){for(ri=[],Ni=kt();Ni!==r;)ri.push(Ni),Ni=kt();ri!==r?(Dt=N,K=Me(ze,hn),N=K):(G=N,N=r)}else G=N,N=r}else G=N,N=r}else G=N,N=r;else G=N,N=r}else G=N,N=r;else G=N,N=r}else G=N,N=r;else G=N,N=r;if(N===r){for(N=G,K=[],te=kt();te!==r;)K.push(te),te=kt();if(K!==r){for(te=[],Ae=Su();Ae!==r;)te.push(Ae),Ae=Su();if(te!==r){for(Ae=[],ze=kt();ze!==r;)Ae.push(ze),ze=kt();if(Ae!==r){if(ze=[],gt=pp(),gt!==r)for(;gt!==r;)ze.push(gt),gt=pp();else ze=r;if(ze!==r){for(gt=[],ur=kt();ur!==r;)gt.push(ur),ur=kt();gt!==r?(Dt=N,K=Te(te,ze),N=K):(G=N,N=r)}else G=N,N=r}else G=N,N=r}else G=N,N=r}else G=N,N=r;if(N===r){for(N=G,K=[],te=kt();te!==r;)K.push(te),te=kt();if(K!==r){if(te=[],Ae=Su(),Ae!==r)for(;Ae!==r;)te.push(Ae),Ae=Su();else te=r;if(te!==r){for(Ae=[],ze=kt();ze!==r;)Ae.push(ze),ze=kt();Ae!==r?(Dt=N,K=Qe(te),N=K):(G=N,N=r)}else G=N,N=r}else G=N,N=r}}}return N}function NA(){var N,K,te,Ae,ze;for(N=G,K=[],te=kt();te!==r;)K.push(te),te=kt();if(K!==r){if(te=[],Ae=hp(),Ae!==r)for(;Ae!==r;)te.push(Ae),Ae=hp();else te=r;if(te!==r){for(Ae=[],ze=kt();ze!==r;)Ae.push(ze),ze=kt();Ae!==r?(Dt=N,K=_e(te),N=K):(G=N,N=r)}else G=N,N=r}else G=N,N=r;return N}function pp(){var N,K,te;for(N=G,K=[],te=kt();te!==r;)K.push(te),te=kt();if(K!==r?(te=Wa(),te!==r?(Dt=N,K=qe(te),N=K):(G=N,N=r)):(G=N,N=r),N===r){for(N=G,K=[],te=kt();te!==r;)K.push(te),te=kt();K!==r?(te=hp(),te!==r?(Dt=N,K=qe(te),N=K):(G=N,N=r)):(G=N,N=r)}return N}function Wa(){var N,K,te,Ae,ze;for(N=G,K=[],te=kt();te!==r;)K.push(te),te=kt();return K!==r?(At.test(t.charAt(G))?(te=t.charAt(G),G++):(te=r,lt===0&&mt(Oe)),te===r&&(te=null),te!==r?(Ae=pg(),Ae!==r?(ze=hp(),ze!==r?(Dt=N,K=x(te,Ae,ze),N=K):(G=N,N=r)):(G=N,N=r)):(G=N,N=r)):(G=N,N=r),N}function pg(){var N;return t.substr(G,2)===I?(N=I,G+=2):(N=r,lt===0&&mt(P)),N===r&&(t.substr(G,2)===y?(N=y,G+=2):(N=r,lt===0&&mt(F)),N===r&&(t.charCodeAt(G)===62?(N=J,G++):(N=r,lt===0&&mt(X)),N===r&&(t.substr(G,3)===$?(N=$,G+=3):(N=r,lt===0&&mt(ie)),N===r&&(t.substr(G,2)===ke?(N=ke,G+=2):(N=r,lt===0&&mt(Ne)),N===r&&(t.charCodeAt(G)===60?(N=st,G++):(N=r,lt===0&&mt(ht))))))),N}function hp(){var N,K,te;for(N=G,K=[],te=kt();te!==r;)K.push(te),te=kt();return K!==r?(te=Uo(),te!==r?(Dt=N,K=qe(te),N=K):(G=N,N=r)):(G=N,N=r),N}function Uo(){var N,K,te;if(N=G,K=[],te=Cs(),te!==r)for(;te!==r;)K.push(te),te=Cs();else K=r;return K!==r&&(Dt=N,K=Ut(K)),N=K,N}function Cs(){var N,K;return N=G,K=Ci(),K!==r&&(Dt=N,K=Xt(K)),N=K,N===r&&(N=G,K=Rm(),K!==r&&(Dt=N,K=Xt(K)),N=K,N===r&&(N=G,K=Tm(),K!==r&&(Dt=N,K=Xt(K)),N=K,N===r&&(N=G,K=_o(),K!==r&&(Dt=N,K=Xt(K)),N=K))),N}function Ci(){var N,K,te,Ae;return N=G,t.substr(G,2)===Pt?(K=Pt,G+=2):(K=r,lt===0&&mt(tn)),K!==r?(te=rn(),te!==r?(t.charCodeAt(G)===39?(Ae=Dr,G++):(Ae=r,lt===0&&mt(fr)),Ae!==r?(Dt=N,K=Br(te),N=K):(G=N,N=r)):(G=N,N=r)):(G=N,N=r),N}function Rm(){var N,K,te,Ae;return N=G,t.charCodeAt(G)===39?(K=Dr,G++):(K=r,lt===0&&mt(fr)),K!==r?(te=dp(),te!==r?(t.charCodeAt(G)===39?(Ae=Dr,G++):(Ae=r,lt===0&&mt(fr)),Ae!==r?(Dt=N,K=Br(te),N=K):(G=N,N=r)):(G=N,N=r)):(G=N,N=r),N}function Tm(){var N,K,te,Ae;if(N=G,t.substr(G,2)===jr?(K=jr,G+=2):(K=r,lt===0&&mt(Hn)),K!==r&&(Dt=N,K=bs()),N=K,N===r)if(N=G,t.charCodeAt(G)===34?(K=ki,G++):(K=r,lt===0&&mt(gs)),K!==r){for(te=[],Ae=LA();Ae!==r;)te.push(Ae),Ae=LA();te!==r?(t.charCodeAt(G)===34?(Ae=ki,G++):(Ae=r,lt===0&&mt(gs)),Ae!==r?(Dt=N,K=to(te),N=K):(G=N,N=r)):(G=N,N=r)}else G=N,N=r;return N}function _o(){var N,K,te;if(N=G,K=[],te=gp(),te!==r)for(;te!==r;)K.push(te),te=gp();else K=r;return K!==r&&(Dt=N,K=to(K)),N=K,N}function LA(){var N,K;return N=G,K=Hr(),K!==r&&(Dt=N,K=Di(K)),N=K,N===r&&(N=G,K=mp(),K!==r&&(Dt=N,K=Qs(K)),N=K,N===r&&(N=G,K=xc(),K!==r&&(Dt=N,K=ro(K)),N=K,N===r&&(N=G,K=hg(),K!==r&&(Dt=N,K=pc(K)),N=K))),N}function gp(){var N,K;return N=G,K=Hr(),K!==r&&(Dt=N,K=gu(K)),N=K,N===r&&(N=G,K=mp(),K!==r&&(Dt=N,K=ap(K)),N=K,N===r&&(N=G,K=xc(),K!==r&&(Dt=N,K=lp(K)),N=K,N===r&&(N=G,K=AI(),K!==r&&(Dt=N,K=ks(K)),N=K,N===r&&(N=G,K=pa(),K!==r&&(Dt=N,K=pc(K)),N=K)))),N}function dp(){var N,K,te;for(N=G,K=[],En.test(t.charAt(G))?(te=t.charAt(G),G++):(te=r,lt===0&&mt(no));te!==r;)K.push(te),En.test(t.charAt(G))?(te=t.charAt(G),G++):(te=r,lt===0&&mt(no));return K!==r&&(Dt=N,K=Fs(K)),N=K,N}function hg(){var N,K,te;if(N=G,K=[],te=fa(),te===r&&(Cl.test(t.charAt(G))?(te=t.charAt(G),G++):(te=r,lt===0&&mt(El))),te!==r)for(;te!==r;)K.push(te),te=fa(),te===r&&(Cl.test(t.charAt(G))?(te=t.charAt(G),G++):(te=r,lt===0&&mt(El)));else K=r;return K!==r&&(Dt=N,K=Fs(K)),N=K,N}function fa(){var N,K,te;return N=G,t.substr(G,2)===io?(K=io,G+=2):(K=r,lt===0&&mt(Ue)),K!==r&&(Dt=N,K=Fn()),N=K,N===r&&(N=G,t.charCodeAt(G)===92?(K=Fi,G++):(K=r,lt===0&&mt(Rn)),K!==r?(Ui.test(t.charAt(G))?(te=t.charAt(G),G++):(te=r,lt===0&&mt(Zt)),te!==r?(Dt=N,K=Ri(te),N=K):(G=N,N=r)):(G=N,N=r)),N}function rn(){var N,K,te;for(N=G,K=[],te=co(),te===r&&(En.test(t.charAt(G))?(te=t.charAt(G),G++):(te=r,lt===0&&mt(no)));te!==r;)K.push(te),te=co(),te===r&&(En.test(t.charAt(G))?(te=t.charAt(G),G++):(te=r,lt===0&&mt(no)));return K!==r&&(Dt=N,K=Fs(K)),N=K,N}function co(){var N,K,te;return N=G,t.substr(G,2)===$n?(K=$n,G+=2):(K=r,lt===0&&mt(Ma)),K!==r&&(Dt=N,K=$t()),N=K,N===r&&(N=G,t.substr(G,2)===hc?(K=hc,G+=2):(K=r,lt===0&&mt(du)),K!==r&&(Dt=N,K=gc()),N=K,N===r&&(N=G,t.charCodeAt(G)===92?(K=Fi,G++):(K=r,lt===0&&mt(Rn)),K!==r?(Il.test(t.charAt(G))?(te=t.charAt(G),G++):(te=r,lt===0&&mt(PA)),te!==r?(Dt=N,K=mu(),N=K):(G=N,N=r)):(G=N,N=r),N===r&&(N=G,t.substr(G,2)===Ee?(K=Ee,G+=2):(K=r,lt===0&&mt(Rt)),K!==r&&(Dt=N,K=dc()),N=K,N===r&&(N=G,t.substr(G,2)===_i?(K=_i,G+=2):(K=r,lt===0&&mt(yu)),K!==r&&(Dt=N,K=qt()),N=K,N===r&&(N=G,t.substr(G,2)===wl?(K=wl,G+=2):(K=r,lt===0&&mt(xA)),K!==r&&(Dt=N,K=cp()),N=K,N===r&&(N=G,t.substr(G,2)===mc?(K=mc,G+=2):(K=r,lt===0&&mt(bA)),K!==r&&(Dt=N,K=Dn()),N=K,N===r&&(N=G,t.substr(G,2)===ui?(K=ui,G+=2):(K=r,lt===0&&mt(yc)),K!==r&&(Dt=N,K=QA()),N=K,N===r&&(N=G,t.charCodeAt(G)===92?(K=Fi,G++):(K=r,lt===0&&mt(Rn)),K!==r?(ra.test(t.charAt(G))?(te=t.charAt(G),G++):(te=r,lt===0&&mt(Hi)),te!==r?(Dt=N,K=Ri(te),N=K):(G=N,N=r)):(G=N,N=r),N===r&&(N=OA()))))))))),N}function OA(){var N,K,te,Ae,ze,gt,ur,gr,hn,ri,Ni,yg;return N=G,t.charCodeAt(G)===92?(K=Fi,G++):(K=r,lt===0&&mt(Rn)),K!==r?(te=Ya(),te!==r?(Dt=N,K=Oo(te),N=K):(G=N,N=r)):(G=N,N=r),N===r&&(N=G,t.substr(G,2)===$e?(K=$e,G+=2):(K=r,lt===0&&mt(so)),K!==r?(te=G,Ae=G,ze=Ya(),ze!==r?(gt=ti(),gt!==r?(ze=[ze,gt],Ae=ze):(G=Ae,Ae=r)):(G=Ae,Ae=r),Ae===r&&(Ae=Ya()),Ae!==r?te=t.substring(te,G):te=Ae,te!==r?(Dt=N,K=Oo(te),N=K):(G=N,N=r)):(G=N,N=r),N===r&&(N=G,t.substr(G,2)===Bl?(K=Bl,G+=2):(K=r,lt===0&&mt(Cu)),K!==r?(te=G,Ae=G,ze=ti(),ze!==r?(gt=ti(),gt!==r?(ur=ti(),ur!==r?(gr=ti(),gr!==r?(ze=[ze,gt,ur,gr],Ae=ze):(G=Ae,Ae=r)):(G=Ae,Ae=r)):(G=Ae,Ae=r)):(G=Ae,Ae=r),Ae!==r?te=t.substring(te,G):te=Ae,te!==r?(Dt=N,K=Oo(te),N=K):(G=N,N=r)):(G=N,N=r),N===r&&(N=G,t.substr(G,2)===qi?(K=qi,G+=2):(K=r,lt===0&&mt(Eu)),K!==r?(te=G,Ae=G,ze=ti(),ze!==r?(gt=ti(),gt!==r?(ur=ti(),ur!==r?(gr=ti(),gr!==r?(hn=ti(),hn!==r?(ri=ti(),ri!==r?(Ni=ti(),Ni!==r?(yg=ti(),yg!==r?(ze=[ze,gt,ur,gr,hn,ri,Ni,yg],Ae=ze):(G=Ae,Ae=r)):(G=Ae,Ae=r)):(G=Ae,Ae=r)):(G=Ae,Ae=r)):(G=Ae,Ae=r)):(G=Ae,Ae=r)):(G=Ae,Ae=r)):(G=Ae,Ae=r),Ae!==r?te=t.substring(te,G):te=Ae,te!==r?(Dt=N,K=kA(te),N=K):(G=N,N=r)):(G=N,N=r)))),N}function Ya(){var N;return Ua.test(t.charAt(G))?(N=t.charAt(G),G++):(N=r,lt===0&&mt(Cc)),N}function ti(){var N;return ds.test(t.charAt(G))?(N=t.charAt(G),G++):(N=r,lt===0&&mt(Ot)),N}function pa(){var N,K,te,Ae,ze;if(N=G,K=[],te=G,t.charCodeAt(G)===92?(Ae=Fi,G++):(Ae=r,lt===0&&mt(Rn)),Ae!==r?(t.length>G?(ze=t.charAt(G),G++):(ze=r,lt===0&&mt(Sn)),ze!==r?(Dt=te,Ae=Ri(ze),te=Ae):(G=te,te=r)):(G=te,te=r),te===r&&(te=G,t.substr(G,2)===di?(Ae=di,G+=2):(Ae=r,lt===0&&mt(na)),Ae!==r&&(Dt=te,Ae=oo()),te=Ae,te===r&&(te=G,Ae=G,lt++,ze=Nm(),lt--,ze===r?Ae=void 0:(G=Ae,Ae=r),Ae!==r?(t.length>G?(ze=t.charAt(G),G++):(ze=r,lt===0&&mt(Sn)),ze!==r?(Dt=te,Ae=Ri(ze),te=Ae):(G=te,te=r)):(G=te,te=r))),te!==r)for(;te!==r;)K.push(te),te=G,t.charCodeAt(G)===92?(Ae=Fi,G++):(Ae=r,lt===0&&mt(Rn)),Ae!==r?(t.length>G?(ze=t.charAt(G),G++):(ze=r,lt===0&&mt(Sn)),ze!==r?(Dt=te,Ae=Ri(ze),te=Ae):(G=te,te=r)):(G=te,te=r),te===r&&(te=G,t.substr(G,2)===di?(Ae=di,G+=2):(Ae=r,lt===0&&mt(na)),Ae!==r&&(Dt=te,Ae=oo()),te=Ae,te===r&&(te=G,Ae=G,lt++,ze=Nm(),lt--,ze===r?Ae=void 0:(G=Ae,Ae=r),Ae!==r?(t.length>G?(ze=t.charAt(G),G++):(ze=r,lt===0&&mt(Sn)),ze!==r?(Dt=te,Ae=Ri(ze),te=Ae):(G=te,te=r)):(G=te,te=r)));else K=r;return K!==r&&(Dt=N,K=Fs(K)),N=K,N}function Pc(){var N,K,te,Ae,ze,gt;if(N=G,t.charCodeAt(G)===45?(K=Rs,G++):(K=r,lt===0&&mt(ia)),K===r&&(t.charCodeAt(G)===43?(K=sa,G++):(K=r,lt===0&&mt(Mo))),K===r&&(K=null),K!==r){if(te=[],At.test(t.charAt(G))?(Ae=t.charAt(G),G++):(Ae=r,lt===0&&mt(Oe)),Ae!==r)for(;Ae!==r;)te.push(Ae),At.test(t.charAt(G))?(Ae=t.charAt(G),G++):(Ae=r,lt===0&&mt(Oe));else te=r;if(te!==r)if(t.charCodeAt(G)===46?(Ae=Zi,G++):(Ae=r,lt===0&&mt(Ts)),Ae!==r){if(ze=[],At.test(t.charAt(G))?(gt=t.charAt(G),G++):(gt=r,lt===0&&mt(Oe)),gt!==r)for(;gt!==r;)ze.push(gt),At.test(t.charAt(G))?(gt=t.charAt(G),G++):(gt=r,lt===0&&mt(Oe));else ze=r;ze!==r?(Dt=N,K=Ns(K,te,ze),N=K):(G=N,N=r)}else G=N,N=r;else G=N,N=r}else G=N,N=r;if(N===r){if(N=G,t.charCodeAt(G)===45?(K=Rs,G++):(K=r,lt===0&&mt(ia)),K===r&&(t.charCodeAt(G)===43?(K=sa,G++):(K=r,lt===0&&mt(Mo))),K===r&&(K=null),K!==r){if(te=[],At.test(t.charAt(G))?(Ae=t.charAt(G),G++):(Ae=r,lt===0&&mt(Oe)),Ae!==r)for(;Ae!==r;)te.push(Ae),At.test(t.charAt(G))?(Ae=t.charAt(G),G++):(Ae=r,lt===0&&mt(Oe));else te=r;te!==r?(Dt=N,K=Ls(K,te),N=K):(G=N,N=r)}else G=N,N=r;if(N===r&&(N=G,K=xc(),K!==r&&(Dt=N,K=ao(K)),N=K,N===r&&(N=G,K=Ka(),K!==r&&(Dt=N,K=Yn(K)),N=K,N===r)))if(N=G,t.charCodeAt(G)===40?(K=Ce,G++):(K=r,lt===0&&mt(de)),K!==r){for(te=[],Ae=kt();Ae!==r;)te.push(Ae),Ae=kt();if(te!==r)if(Ae=ts(),Ae!==r){for(ze=[],gt=kt();gt!==r;)ze.push(gt),gt=kt();ze!==r?(t.charCodeAt(G)===41?(gt=ne,G++):(gt=r,lt===0&&mt(Z)),gt!==r?(Dt=N,K=qn(Ae),N=K):(G=N,N=r)):(G=N,N=r)}else G=N,N=r;else G=N,N=r}else G=N,N=r}return N}function Sl(){var N,K,te,Ae,ze,gt,ur,gr;if(N=G,K=Pc(),K!==r){for(te=[],Ae=G,ze=[],gt=kt();gt!==r;)ze.push(gt),gt=kt();if(ze!==r)if(t.charCodeAt(G)===42?(gt=$i,G++):(gt=r,lt===0&&mt(es)),gt===r&&(t.charCodeAt(G)===47?(gt=mi,G++):(gt=r,lt===0&&mt(Ha))),gt!==r){for(ur=[],gr=kt();gr!==r;)ur.push(gr),gr=kt();ur!==r?(gr=Pc(),gr!==r?(Dt=Ae,ze=oa(K,gt,gr),Ae=ze):(G=Ae,Ae=r)):(G=Ae,Ae=r)}else G=Ae,Ae=r;else G=Ae,Ae=r;for(;Ae!==r;){for(te.push(Ae),Ae=G,ze=[],gt=kt();gt!==r;)ze.push(gt),gt=kt();if(ze!==r)if(t.charCodeAt(G)===42?(gt=$i,G++):(gt=r,lt===0&&mt(es)),gt===r&&(t.charCodeAt(G)===47?(gt=mi,G++):(gt=r,lt===0&&mt(Ha))),gt!==r){for(ur=[],gr=kt();gr!==r;)ur.push(gr),gr=kt();ur!==r?(gr=Pc(),gr!==r?(Dt=Ae,ze=oa(K,gt,gr),Ae=ze):(G=Ae,Ae=r)):(G=Ae,Ae=r)}else G=Ae,Ae=r;else G=Ae,Ae=r}te!==r?(Dt=N,K=ee(K,te),N=K):(G=N,N=r)}else G=N,N=r;return N}function ts(){var N,K,te,Ae,ze,gt,ur,gr;if(N=G,K=Sl(),K!==r){for(te=[],Ae=G,ze=[],gt=kt();gt!==r;)ze.push(gt),gt=kt();if(ze!==r)if(t.charCodeAt(G)===43?(gt=sa,G++):(gt=r,lt===0&&mt(Mo)),gt===r&&(t.charCodeAt(G)===45?(gt=Rs,G++):(gt=r,lt===0&&mt(ia))),gt!==r){for(ur=[],gr=kt();gr!==r;)ur.push(gr),gr=kt();ur!==r?(gr=Sl(),gr!==r?(Dt=Ae,ze=we(K,gt,gr),Ae=ze):(G=Ae,Ae=r)):(G=Ae,Ae=r)}else G=Ae,Ae=r;else G=Ae,Ae=r;for(;Ae!==r;){for(te.push(Ae),Ae=G,ze=[],gt=kt();gt!==r;)ze.push(gt),gt=kt();if(ze!==r)if(t.charCodeAt(G)===43?(gt=sa,G++):(gt=r,lt===0&&mt(Mo)),gt===r&&(t.charCodeAt(G)===45?(gt=Rs,G++):(gt=r,lt===0&&mt(ia))),gt!==r){for(ur=[],gr=kt();gr!==r;)ur.push(gr),gr=kt();ur!==r?(gr=Sl(),gr!==r?(Dt=Ae,ze=we(K,gt,gr),Ae=ze):(G=Ae,Ae=r)):(G=Ae,Ae=r)}else G=Ae,Ae=r;else G=Ae,Ae=r}te!==r?(Dt=N,K=ee(K,te),N=K):(G=N,N=r)}else G=N,N=r;return N}function Hr(){var N,K,te,Ae,ze,gt;if(N=G,t.substr(G,3)===je?(K=je,G+=3):(K=r,lt===0&&mt(Be)),K!==r){for(te=[],Ae=kt();Ae!==r;)te.push(Ae),Ae=kt();if(te!==r)if(Ae=ts(),Ae!==r){for(ze=[],gt=kt();gt!==r;)ze.push(gt),gt=kt();ze!==r?(t.substr(G,2)===xe?(gt=xe,G+=2):(gt=r,lt===0&&mt(Ve)),gt!==r?(Dt=N,K=vt(Ae),N=K):(G=N,N=r)):(G=N,N=r)}else G=N,N=r;else G=N,N=r}else G=N,N=r;return N}function mp(){var N,K,te,Ae;return N=G,t.substr(G,2)===tr?(K=tr,G+=2):(K=r,lt===0&&mt(Zr)),K!==r?(te=vu(),te!==r?(t.charCodeAt(G)===41?(Ae=ne,G++):(Ae=r,lt===0&&mt(Z)),Ae!==r?(Dt=N,K=Tn(te),N=K):(G=N,N=r)):(G=N,N=r)):(G=N,N=r),N}function xc(){var N,K,te,Ae,ze,gt;return N=G,t.substr(G,2)===_r?(K=_r,G+=2):(K=r,lt===0&&mt(ei)),K!==r?(te=Ka(),te!==r?(t.substr(G,2)===Ti?(Ae=Ti,G+=2):(Ae=r,lt===0&&mt(Kn)),Ae!==r?(ze=NA(),ze!==r?(t.charCodeAt(G)===125?(gt=H,G++):(gt=r,lt===0&&mt(yt)),gt!==r?(Dt=N,K=qa(te,ze),N=K):(G=N,N=r)):(G=N,N=r)):(G=N,N=r)):(G=N,N=r)):(G=N,N=r),N===r&&(N=G,t.substr(G,2)===_r?(K=_r,G+=2):(K=r,lt===0&&mt(ei)),K!==r?(te=Ka(),te!==r?(t.substr(G,3)===aa?(Ae=aa,G+=3):(Ae=r,lt===0&&mt(yi)),Ae!==r?(Dt=N,K=la(te),N=K):(G=N,N=r)):(G=N,N=r)):(G=N,N=r),N===r&&(N=G,t.substr(G,2)===_r?(K=_r,G+=2):(K=r,lt===0&&mt(ei)),K!==r?(te=Ka(),te!==r?(t.substr(G,2)===ja?(Ae=ja,G+=2):(Ae=r,lt===0&&mt(lo)),Ae!==r?(ze=NA(),ze!==r?(t.charCodeAt(G)===125?(gt=H,G++):(gt=r,lt===0&&mt(yt)),gt!==r?(Dt=N,K=FA(te,ze),N=K):(G=N,N=r)):(G=N,N=r)):(G=N,N=r)):(G=N,N=r)):(G=N,N=r),N===r&&(N=G,t.substr(G,2)===_r?(K=_r,G+=2):(K=r,lt===0&&mt(ei)),K!==r?(te=Ka(),te!==r?(t.substr(G,3)===Ec?(Ae=Ec,G+=3):(Ae=r,lt===0&&mt(ca)),Ae!==r?(Dt=N,K=rg(te),N=K):(G=N,N=r)):(G=N,N=r)):(G=N,N=r),N===r&&(N=G,t.substr(G,2)===_r?(K=_r,G+=2):(K=r,lt===0&&mt(ei)),K!==r?(te=Ka(),te!==r?(t.charCodeAt(G)===125?(Ae=H,G++):(Ae=r,lt===0&&mt(yt)),Ae!==r?(Dt=N,K=Ic(te),N=K):(G=N,N=r)):(G=N,N=r)):(G=N,N=r),N===r&&(N=G,t.charCodeAt(G)===36?(K=bm,G++):(K=r,lt===0&&mt(ng)),K!==r?(te=Ka(),te!==r?(Dt=N,K=Ic(te),N=K):(G=N,N=r)):(G=N,N=r)))))),N}function AI(){var N,K,te;return N=G,K=gg(),K!==r?(Dt=G,te=Vn(K),te?te=void 0:te=r,te!==r?(Dt=N,K=up(K),N=K):(G=N,N=r)):(G=N,N=r),N}function gg(){var N,K,te,Ae,ze;if(N=G,K=[],te=G,Ae=G,lt++,ze=mg(),lt--,ze===r?Ae=void 0:(G=Ae,Ae=r),Ae!==r?(t.length>G?(ze=t.charAt(G),G++):(ze=r,lt===0&&mt(Sn)),ze!==r?(Dt=te,Ae=Ri(ze),te=Ae):(G=te,te=r)):(G=te,te=r),te!==r)for(;te!==r;)K.push(te),te=G,Ae=G,lt++,ze=mg(),lt--,ze===r?Ae=void 0:(G=Ae,Ae=r),Ae!==r?(t.length>G?(ze=t.charAt(G),G++):(ze=r,lt===0&&mt(Sn)),ze!==r?(Dt=te,Ae=Ri(ze),te=Ae):(G=te,te=r)):(G=te,te=r);else K=r;return K!==r&&(Dt=N,K=Fs(K)),N=K,N}function dg(){var N,K,te;if(N=G,K=[],ig.test(t.charAt(G))?(te=t.charAt(G),G++):(te=r,lt===0&&mt(RA)),te!==r)for(;te!==r;)K.push(te),ig.test(t.charAt(G))?(te=t.charAt(G),G++):(te=r,lt===0&&mt(RA));else K=r;return K!==r&&(Dt=N,K=Os()),N=K,N}function Ka(){var N,K,te;if(N=G,K=[],Iu.test(t.charAt(G))?(te=t.charAt(G),G++):(te=r,lt===0&&mt(Ga)),te!==r)for(;te!==r;)K.push(te),Iu.test(t.charAt(G))?(te=t.charAt(G),G++):(te=r,lt===0&&mt(Ga));else K=r;return K!==r&&(Dt=N,K=Os()),N=K,N}function Nm(){var N;return ji.test(t.charAt(G))?(N=t.charAt(G),G++):(N=r,lt===0&&mt(ua)),N}function mg(){var N;return wu.test(t.charAt(G))?(N=t.charAt(G),G++):(N=r,lt===0&&mt(ms)),N}function kt(){var N,K;if(N=[],wc.test(t.charAt(G))?(K=t.charAt(G),G++):(K=r,lt===0&&mt(Bc)),K!==r)for(;K!==r;)N.push(K),wc.test(t.charAt(G))?(K=t.charAt(G),G++):(K=r,lt===0&&mt(Bc));else N=r;return N}if(Bu=a(),Bu!==r&&G===t.length)return Bu;throw Bu!==r&&G!1}){try{return(0,oY.parse)(t,e)}catch(r){throw r.location&&(r.message=r.message.replace(/(\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function fy(t,{endSemicolon:e=!1}={}){return t.map(({command:r,type:o},a)=>`${SD(r)}${o===";"?a!==t.length-1||e?";":"":" &"}`).join(" ")}function SD(t){return`${py(t.chain)}${t.then?` ${aT(t.then)}`:""}`}function aT(t){return`${t.type} ${SD(t.line)}`}function py(t){return`${cT(t)}${t.then?` ${lT(t.then)}`:""}`}function lT(t){return`${t.type} ${py(t.chain)}`}function cT(t){switch(t.type){case"command":return`${t.envs.length>0?`${t.envs.map(e=>vD(e)).join(" ")} `:""}${t.args.map(e=>uT(e)).join(" ")}`;case"subshell":return`(${fy(t.subshell)})${t.args.length>0?` ${t.args.map(e=>HI(e)).join(" ")}`:""}`;case"group":return`{ ${fy(t.group,{endSemicolon:!0})} }${t.args.length>0?` ${t.args.map(e=>HI(e)).join(" ")}`:""}`;case"envs":return t.envs.map(e=>vD(e)).join(" ");default:throw new Error(`Unsupported command type: "${t.type}"`)}}function vD(t){return`${t.name}=${t.args[0]?Hg(t.args[0]):""}`}function uT(t){switch(t.type){case"redirection":return HI(t);case"argument":return Hg(t);default:throw new Error(`Unsupported argument type: "${t.type}"`)}}function HI(t){return`${t.subtype} ${t.args.map(e=>Hg(e)).join(" ")}`}function Hg(t){return t.segments.map(e=>AT(e)).join("")}function AT(t){let e=(o,a)=>a?`"${o}"`:o,r=o=>o===""?'""':o.match(/[(){}<>$|&; \t"']/)?`$'${o.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\f/g,"\\f").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t").replace(/\v/g,"\\v").replace(/\0/g,"\\0")}'`:o;switch(t.type){case"text":return r(t.text);case"glob":return t.pattern;case"shell":return e(`\${${fy(t.shell)}}`,t.quoted);case"variable":return e(typeof t.defaultValue>"u"?typeof t.alternativeValue>"u"?`\${${t.name}}`:t.alternativeValue.length===0?`\${${t.name}:+}`:`\${${t.name}:+${t.alternativeValue.map(o=>Hg(o)).join(" ")}}`:t.defaultValue.length===0?`\${${t.name}:-}`:`\${${t.name}:-${t.defaultValue.map(o=>Hg(o)).join(" ")}}`,t.quoted);case"arithmetic":return`$(( ${PD(t.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: "${t.type}"`)}}function PD(t){let e=a=>{switch(a){case"addition":return"+";case"subtraction":return"-";case"multiplication":return"*";case"division":return"/";default:throw new Error(`Can't extract operator from arithmetic expression of type "${a}"`)}},r=(a,n)=>n?`( ${a} )`:a,o=a=>r(PD(a),!["number","variable"].includes(a.type));switch(t.type){case"number":return String(t.value);case"variable":return t.name;default:return`${o(t.left)} ${e(t.type)} ${o(t.right)}`}}var oY,aY=dt(()=>{oY=tt(sY())});var cY=U((Bxt,lY)=>{"use strict";function R8e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function qg(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,qg)}R8e(qg,Error);qg.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",w;for(w=0;w0){for(w=1,v=1;wpe&&(pe=V,he=[]),he.push(Oe))}function yt(Oe,x){return new qg(Oe,null,null,x)}function Me(Oe,x,I){return new qg(qg.buildMessage(Oe,x),Oe,x,I)}function Te(){var Oe,x,I,P;return Oe=V,x=Qe(),x!==r?(t.charCodeAt(V)===47?(I=n,V++):(I=r,ve===0&&H(u)),I!==r?(P=Qe(),P!==r?(re=Oe,x=A(x,P),Oe=x):(V=Oe,Oe=r)):(V=Oe,Oe=r)):(V=Oe,Oe=r),Oe===r&&(Oe=V,x=Qe(),x!==r&&(re=Oe,x=p(x)),Oe=x),Oe}function Qe(){var Oe,x,I,P;return Oe=V,x=_e(),x!==r?(t.charCodeAt(V)===64?(I=h,V++):(I=r,ve===0&&H(E)),I!==r?(P=At(),P!==r?(re=Oe,x=w(x,P),Oe=x):(V=Oe,Oe=r)):(V=Oe,Oe=r)):(V=Oe,Oe=r),Oe===r&&(Oe=V,x=_e(),x!==r&&(re=Oe,x=v(x)),Oe=x),Oe}function _e(){var Oe,x,I,P,y;return Oe=V,t.charCodeAt(V)===64?(x=h,V++):(x=r,ve===0&&H(E)),x!==r?(I=qe(),I!==r?(t.charCodeAt(V)===47?(P=n,V++):(P=r,ve===0&&H(u)),P!==r?(y=qe(),y!==r?(re=Oe,x=b(),Oe=x):(V=Oe,Oe=r)):(V=Oe,Oe=r)):(V=Oe,Oe=r)):(V=Oe,Oe=r),Oe===r&&(Oe=V,x=qe(),x!==r&&(re=Oe,x=b()),Oe=x),Oe}function qe(){var Oe,x,I;if(Oe=V,x=[],C.test(t.charAt(V))?(I=t.charAt(V),V++):(I=r,ve===0&&H(R)),I!==r)for(;I!==r;)x.push(I),C.test(t.charAt(V))?(I=t.charAt(V),V++):(I=r,ve===0&&H(R));else x=r;return x!==r&&(re=Oe,x=b()),Oe=x,Oe}function At(){var Oe,x,I;if(Oe=V,x=[],L.test(t.charAt(V))?(I=t.charAt(V),V++):(I=r,ve===0&&H(_)),I!==r)for(;I!==r;)x.push(I),L.test(t.charAt(V))?(I=t.charAt(V),V++):(I=r,ve===0&&H(_));else x=r;return x!==r&&(re=Oe,x=b()),Oe=x,Oe}if(ge=a(),ge!==r&&V===t.length)return ge;throw ge!==r&&V{uY=tt(cY())});var Gg=U((Dxt,jg)=>{"use strict";function fY(t){return typeof t>"u"||t===null}function N8e(t){return typeof t=="object"&&t!==null}function L8e(t){return Array.isArray(t)?t:fY(t)?[]:[t]}function O8e(t,e){var r,o,a,n;if(e)for(n=Object.keys(e),r=0,o=n.length;r{"use strict";function qI(t,e){Error.call(this),this.name="YAMLException",this.reason=t,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}qI.prototype=Object.create(Error.prototype);qI.prototype.constructor=qI;qI.prototype.toString=function(e){var r=this.name+": ";return r+=this.reason||"(unknown reason)",!e&&this.mark&&(r+=" "+this.mark.toString()),r};pY.exports=qI});var dY=U((Pxt,gY)=>{"use strict";var hY=Gg();function fT(t,e,r,o,a){this.name=t,this.buffer=e,this.position=r,this.line=o,this.column=a}fT.prototype.getSnippet=function(e,r){var o,a,n,u,A;if(!this.buffer)return null;for(e=e||4,r=r||75,o="",a=this.position;a>0&&`\0\r +\x85\u2028\u2029`.indexOf(this.buffer.charAt(a-1))===-1;)if(a-=1,this.position-a>r/2-1){o=" ... ",a+=5;break}for(n="",u=this.position;ur/2-1){n=" ... ",u-=5;break}return A=this.buffer.slice(a,u),hY.repeat(" ",e)+o+A+n+` +`+hY.repeat(" ",e+this.position-a+o.length)+"^"};fT.prototype.toString=function(e){var r,o="";return this.name&&(o+='in "'+this.name+'" '),o+="at line "+(this.line+1)+", column "+(this.column+1),e||(r=this.getSnippet(),r&&(o+=`: +`+r)),o};gY.exports=fT});var as=U((xxt,yY)=>{"use strict";var mY=hy(),_8e=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],H8e=["scalar","sequence","mapping"];function q8e(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(o){e[String(o)]=r})}),e}function j8e(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(_8e.indexOf(r)===-1)throw new mY('Unknown option "'+r+'" is met in definition of "'+t+'" YAML type.')}),this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=q8e(e.styleAliases||null),H8e.indexOf(this.kind)===-1)throw new mY('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}yY.exports=j8e});var Wg=U((bxt,EY)=>{"use strict";var CY=Gg(),QD=hy(),G8e=as();function pT(t,e,r){var o=[];return t.include.forEach(function(a){r=pT(a,e,r)}),t[e].forEach(function(a){r.forEach(function(n,u){n.tag===a.tag&&n.kind===a.kind&&o.push(u)}),r.push(a)}),r.filter(function(a,n){return o.indexOf(n)===-1})}function W8e(){var t={scalar:{},sequence:{},mapping:{},fallback:{}},e,r;function o(a){t[a.kind][a.tag]=t.fallback[a.tag]=a}for(e=0,r=arguments.length;e{"use strict";var Y8e=as();IY.exports=new Y8e("tag:yaml.org,2002:str",{kind:"scalar",construct:function(t){return t!==null?t:""}})});var vY=U((kxt,BY)=>{"use strict";var K8e=as();BY.exports=new K8e("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(t){return t!==null?t:[]}})});var SY=U((Fxt,DY)=>{"use strict";var V8e=as();DY.exports=new V8e("tag:yaml.org,2002:map",{kind:"mapping",construct:function(t){return t!==null?t:{}}})});var kD=U((Rxt,PY)=>{"use strict";var J8e=Wg();PY.exports=new J8e({explicit:[wY(),vY(),SY()]})});var bY=U((Txt,xY)=>{"use strict";var z8e=as();function X8e(t){if(t===null)return!0;var e=t.length;return e===1&&t==="~"||e===4&&(t==="null"||t==="Null"||t==="NULL")}function Z8e(){return null}function $8e(t){return t===null}xY.exports=new z8e("tag:yaml.org,2002:null",{kind:"scalar",resolve:X8e,construct:Z8e,predicate:$8e,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var kY=U((Nxt,QY)=>{"use strict";var eHe=as();function tHe(t){if(t===null)return!1;var e=t.length;return e===4&&(t==="true"||t==="True"||t==="TRUE")||e===5&&(t==="false"||t==="False"||t==="FALSE")}function rHe(t){return t==="true"||t==="True"||t==="TRUE"}function nHe(t){return Object.prototype.toString.call(t)==="[object Boolean]"}QY.exports=new eHe("tag:yaml.org,2002:bool",{kind:"scalar",resolve:tHe,construct:rHe,predicate:nHe,represent:{lowercase:function(t){return t?"true":"false"},uppercase:function(t){return t?"TRUE":"FALSE"},camelcase:function(t){return t?"True":"False"}},defaultStyle:"lowercase"})});var RY=U((Lxt,FY)=>{"use strict";var iHe=Gg(),sHe=as();function oHe(t){return 48<=t&&t<=57||65<=t&&t<=70||97<=t&&t<=102}function aHe(t){return 48<=t&&t<=55}function lHe(t){return 48<=t&&t<=57}function cHe(t){if(t===null)return!1;var e=t.length,r=0,o=!1,a;if(!e)return!1;if(a=t[r],(a==="-"||a==="+")&&(a=t[++r]),a==="0"){if(r+1===e)return!0;if(a=t[++r],a==="b"){for(r++;r=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},octal:function(t){return t>=0?"0"+t.toString(8):"-0"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var LY=U((Oxt,NY)=>{"use strict";var TY=Gg(),fHe=as(),pHe=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function hHe(t){return!(t===null||!pHe.test(t)||t[t.length-1]==="_")}function gHe(t){var e,r,o,a;return e=t.replace(/_/g,"").toLowerCase(),r=e[0]==="-"?-1:1,a=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(n){a.unshift(parseFloat(n,10))}),e=0,o=1,a.forEach(function(n){e+=n*o,o*=60}),r*e):r*parseFloat(e,10)}var dHe=/^[-+]?[0-9]+e/;function mHe(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(TY.isNegativeZero(t))return"-0.0";return r=t.toString(10),dHe.test(r)?r.replace("e",".e"):r}function yHe(t){return Object.prototype.toString.call(t)==="[object Number]"&&(t%1!==0||TY.isNegativeZero(t))}NY.exports=new fHe("tag:yaml.org,2002:float",{kind:"scalar",resolve:hHe,construct:gHe,predicate:yHe,represent:mHe,defaultStyle:"lowercase"})});var hT=U((Mxt,OY)=>{"use strict";var CHe=Wg();OY.exports=new CHe({include:[kD()],implicit:[bY(),kY(),RY(),LY()]})});var gT=U((Uxt,MY)=>{"use strict";var EHe=Wg();MY.exports=new EHe({include:[hT()]})});var qY=U((_xt,HY)=>{"use strict";var IHe=as(),UY=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),_Y=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function wHe(t){return t===null?!1:UY.exec(t)!==null||_Y.exec(t)!==null}function BHe(t){var e,r,o,a,n,u,A,p=0,h=null,E,w,v;if(e=UY.exec(t),e===null&&(e=_Y.exec(t)),e===null)throw new Error("Date resolve error");if(r=+e[1],o=+e[2]-1,a=+e[3],!e[4])return new Date(Date.UTC(r,o,a));if(n=+e[4],u=+e[5],A=+e[6],e[7]){for(p=e[7].slice(0,3);p.length<3;)p+="0";p=+p}return e[9]&&(E=+e[10],w=+(e[11]||0),h=(E*60+w)*6e4,e[9]==="-"&&(h=-h)),v=new Date(Date.UTC(r,o,a,n,u,A,p)),h&&v.setTime(v.getTime()-h),v}function vHe(t){return t.toISOString()}HY.exports=new IHe("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:wHe,construct:BHe,instanceOf:Date,represent:vHe})});var GY=U((Hxt,jY)=>{"use strict";var DHe=as();function SHe(t){return t==="<<"||t===null}jY.exports=new DHe("tag:yaml.org,2002:merge",{kind:"scalar",resolve:SHe})});var KY=U((qxt,YY)=>{"use strict";var Yg;try{WY=Ie,Yg=WY("buffer").Buffer}catch{}var WY,PHe=as(),dT=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= +\r`;function xHe(t){if(t===null)return!1;var e,r,o=0,a=t.length,n=dT;for(r=0;r64)){if(e<0)return!1;o+=6}return o%8===0}function bHe(t){var e,r,o=t.replace(/[\r\n=]/g,""),a=o.length,n=dT,u=0,A=[];for(e=0;e>16&255),A.push(u>>8&255),A.push(u&255)),u=u<<6|n.indexOf(o.charAt(e));return r=a%4*6,r===0?(A.push(u>>16&255),A.push(u>>8&255),A.push(u&255)):r===18?(A.push(u>>10&255),A.push(u>>2&255)):r===12&&A.push(u>>4&255),Yg?Yg.from?Yg.from(A):new Yg(A):A}function QHe(t){var e="",r=0,o,a,n=t.length,u=dT;for(o=0;o>18&63],e+=u[r>>12&63],e+=u[r>>6&63],e+=u[r&63]),r=(r<<8)+t[o];return a=n%3,a===0?(e+=u[r>>18&63],e+=u[r>>12&63],e+=u[r>>6&63],e+=u[r&63]):a===2?(e+=u[r>>10&63],e+=u[r>>4&63],e+=u[r<<2&63],e+=u[64]):a===1&&(e+=u[r>>2&63],e+=u[r<<4&63],e+=u[64],e+=u[64]),e}function kHe(t){return Yg&&Yg.isBuffer(t)}YY.exports=new PHe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:xHe,construct:bHe,predicate:kHe,represent:QHe})});var JY=U((Gxt,VY)=>{"use strict";var FHe=as(),RHe=Object.prototype.hasOwnProperty,THe=Object.prototype.toString;function NHe(t){if(t===null)return!0;var e=[],r,o,a,n,u,A=t;for(r=0,o=A.length;r{"use strict";var OHe=as(),MHe=Object.prototype.toString;function UHe(t){if(t===null)return!0;var e,r,o,a,n,u=t;for(n=new Array(u.length),e=0,r=u.length;e{"use strict";var HHe=as(),qHe=Object.prototype.hasOwnProperty;function jHe(t){if(t===null)return!0;var e,r=t;for(e in r)if(qHe.call(r,e)&&r[e]!==null)return!1;return!0}function GHe(t){return t!==null?t:{}}ZY.exports=new HHe("tag:yaml.org,2002:set",{kind:"mapping",resolve:jHe,construct:GHe})});var dy=U((Kxt,eK)=>{"use strict";var WHe=Wg();eK.exports=new WHe({include:[gT()],implicit:[qY(),GY()],explicit:[KY(),JY(),XY(),$Y()]})});var rK=U((Vxt,tK)=>{"use strict";var YHe=as();function KHe(){return!0}function VHe(){}function JHe(){return""}function zHe(t){return typeof t>"u"}tK.exports=new YHe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:KHe,construct:VHe,predicate:zHe,represent:JHe})});var iK=U((Jxt,nK)=>{"use strict";var XHe=as();function ZHe(t){if(t===null||t.length===0)return!1;var e=t,r=/\/([gim]*)$/.exec(t),o="";return!(e[0]==="/"&&(r&&(o=r[1]),o.length>3||e[e.length-o.length-1]!=="/"))}function $He(t){var e=t,r=/\/([gim]*)$/.exec(t),o="";return e[0]==="/"&&(r&&(o=r[1]),e=e.slice(1,e.length-o.length-1)),new RegExp(e,o)}function e6e(t){var e="/"+t.source+"/";return t.global&&(e+="g"),t.multiline&&(e+="m"),t.ignoreCase&&(e+="i"),e}function t6e(t){return Object.prototype.toString.call(t)==="[object RegExp]"}nK.exports=new XHe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:ZHe,construct:$He,predicate:t6e,represent:e6e})});var aK=U((zxt,oK)=>{"use strict";var FD;try{sK=Ie,FD=sK("esprima")}catch{typeof window<"u"&&(FD=window.esprima)}var sK,r6e=as();function n6e(t){if(t===null)return!1;try{var e="("+t+")",r=FD.parse(e,{range:!0});return!(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")}catch{return!1}}function i6e(t){var e="("+t+")",r=FD.parse(e,{range:!0}),o=[],a;if(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return r.body[0].expression.params.forEach(function(n){o.push(n.name)}),a=r.body[0].expression.body.range,r.body[0].expression.body.type==="BlockStatement"?new Function(o,e.slice(a[0]+1,a[1]-1)):new Function(o,"return "+e.slice(a[0],a[1]))}function s6e(t){return t.toString()}function o6e(t){return Object.prototype.toString.call(t)==="[object Function]"}oK.exports=new r6e("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:n6e,construct:i6e,predicate:o6e,represent:s6e})});var jI=U((Zxt,cK)=>{"use strict";var lK=Wg();cK.exports=lK.DEFAULT=new lK({include:[dy()],explicit:[rK(),iK(),aK()]})});var xK=U(($xt,GI)=>{"use strict";var Cf=Gg(),dK=hy(),a6e=dY(),mK=dy(),l6e=jI(),jp=Object.prototype.hasOwnProperty,RD=1,yK=2,CK=3,TD=4,mT=1,c6e=2,uK=3,u6e=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,A6e=/[\x85\u2028\u2029]/,f6e=/[,\[\]\{\}]/,EK=/^(?:!|!!|![a-z\-]+!)$/i,IK=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function AK(t){return Object.prototype.toString.call(t)}function Wu(t){return t===10||t===13}function Vg(t){return t===9||t===32}function Ia(t){return t===9||t===32||t===10||t===13}function my(t){return t===44||t===91||t===93||t===123||t===125}function p6e(t){var e;return 48<=t&&t<=57?t-48:(e=t|32,97<=e&&e<=102?e-97+10:-1)}function h6e(t){return t===120?2:t===117?4:t===85?8:0}function g6e(t){return 48<=t&&t<=57?t-48:-1}function fK(t){return t===48?"\0":t===97?"\x07":t===98?"\b":t===116||t===9?" ":t===110?` +`:t===118?"\v":t===102?"\f":t===114?"\r":t===101?"\x1B":t===32?" ":t===34?'"':t===47?"/":t===92?"\\":t===78?"\x85":t===95?"\xA0":t===76?"\u2028":t===80?"\u2029":""}function d6e(t){return t<=65535?String.fromCharCode(t):String.fromCharCode((t-65536>>10)+55296,(t-65536&1023)+56320)}var wK=new Array(256),BK=new Array(256);for(Kg=0;Kg<256;Kg++)wK[Kg]=fK(Kg)?1:0,BK[Kg]=fK(Kg);var Kg;function m6e(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||l6e,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function vK(t,e){return new dK(e,new a6e(t.filename,t.input,t.position,t.line,t.position-t.lineStart))}function wr(t,e){throw vK(t,e)}function ND(t,e){t.onWarning&&t.onWarning.call(null,vK(t,e))}var pK={YAML:function(e,r,o){var a,n,u;e.version!==null&&wr(e,"duplication of %YAML directive"),o.length!==1&&wr(e,"YAML directive accepts exactly one argument"),a=/^([0-9]+)\.([0-9]+)$/.exec(o[0]),a===null&&wr(e,"ill-formed argument of the YAML directive"),n=parseInt(a[1],10),u=parseInt(a[2],10),n!==1&&wr(e,"unacceptable YAML version of the document"),e.version=o[0],e.checkLineBreaks=u<2,u!==1&&u!==2&&ND(e,"unsupported YAML version of the document")},TAG:function(e,r,o){var a,n;o.length!==2&&wr(e,"TAG directive accepts exactly two arguments"),a=o[0],n=o[1],EK.test(a)||wr(e,"ill-formed tag handle (first argument) of the TAG directive"),jp.call(e.tagMap,a)&&wr(e,'there is a previously declared suffix for "'+a+'" tag handle'),IK.test(n)||wr(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[a]=n}};function qp(t,e,r,o){var a,n,u,A;if(e1&&(t.result+=Cf.repeat(` +`,e-1))}function y6e(t,e,r){var o,a,n,u,A,p,h,E,w=t.kind,v=t.result,b;if(b=t.input.charCodeAt(t.position),Ia(b)||my(b)||b===35||b===38||b===42||b===33||b===124||b===62||b===39||b===34||b===37||b===64||b===96||(b===63||b===45)&&(a=t.input.charCodeAt(t.position+1),Ia(a)||r&&my(a)))return!1;for(t.kind="scalar",t.result="",n=u=t.position,A=!1;b!==0;){if(b===58){if(a=t.input.charCodeAt(t.position+1),Ia(a)||r&&my(a))break}else if(b===35){if(o=t.input.charCodeAt(t.position-1),Ia(o))break}else{if(t.position===t.lineStart&&LD(t)||r&&my(b))break;if(Wu(b))if(p=t.line,h=t.lineStart,E=t.lineIndent,Wi(t,!1,-1),t.lineIndent>=e){A=!0,b=t.input.charCodeAt(t.position);continue}else{t.position=u,t.line=p,t.lineStart=h,t.lineIndent=E;break}}A&&(qp(t,n,u,!1),CT(t,t.line-p),n=u=t.position,A=!1),Vg(b)||(u=t.position+1),b=t.input.charCodeAt(++t.position)}return qp(t,n,u,!1),t.result?!0:(t.kind=w,t.result=v,!1)}function C6e(t,e){var r,o,a;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind="scalar",t.result="",t.position++,o=a=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(qp(t,o,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)o=t.position,t.position++,a=t.position;else return!0;else Wu(r)?(qp(t,o,a,!0),CT(t,Wi(t,!1,e)),o=a=t.position):t.position===t.lineStart&&LD(t)?wr(t,"unexpected end of the document within a single quoted scalar"):(t.position++,a=t.position);wr(t,"unexpected end of the stream within a single quoted scalar")}function E6e(t,e){var r,o,a,n,u,A;if(A=t.input.charCodeAt(t.position),A!==34)return!1;for(t.kind="scalar",t.result="",t.position++,r=o=t.position;(A=t.input.charCodeAt(t.position))!==0;){if(A===34)return qp(t,r,t.position,!0),t.position++,!0;if(A===92){if(qp(t,r,t.position,!0),A=t.input.charCodeAt(++t.position),Wu(A))Wi(t,!1,e);else if(A<256&&wK[A])t.result+=BK[A],t.position++;else if((u=h6e(A))>0){for(a=u,n=0;a>0;a--)A=t.input.charCodeAt(++t.position),(u=p6e(A))>=0?n=(n<<4)+u:wr(t,"expected hexadecimal character");t.result+=d6e(n),t.position++}else wr(t,"unknown escape sequence");r=o=t.position}else Wu(A)?(qp(t,r,o,!0),CT(t,Wi(t,!1,e)),r=o=t.position):t.position===t.lineStart&&LD(t)?wr(t,"unexpected end of the document within a double quoted scalar"):(t.position++,o=t.position)}wr(t,"unexpected end of the stream within a double quoted scalar")}function I6e(t,e){var r=!0,o,a=t.tag,n,u=t.anchor,A,p,h,E,w,v={},b,C,R,L;if(L=t.input.charCodeAt(t.position),L===91)p=93,w=!1,n=[];else if(L===123)p=125,w=!0,n={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=n),L=t.input.charCodeAt(++t.position);L!==0;){if(Wi(t,!0,e),L=t.input.charCodeAt(t.position),L===p)return t.position++,t.tag=a,t.anchor=u,t.kind=w?"mapping":"sequence",t.result=n,!0;r||wr(t,"missed comma between flow collection entries"),C=b=R=null,h=E=!1,L===63&&(A=t.input.charCodeAt(t.position+1),Ia(A)&&(h=E=!0,t.position++,Wi(t,!0,e))),o=t.line,Cy(t,e,RD,!1,!0),C=t.tag,b=t.result,Wi(t,!0,e),L=t.input.charCodeAt(t.position),(E||t.line===o)&&L===58&&(h=!0,L=t.input.charCodeAt(++t.position),Wi(t,!0,e),Cy(t,e,RD,!1,!0),R=t.result),w?yy(t,n,v,C,b,R):h?n.push(yy(t,null,v,C,b,R)):n.push(b),Wi(t,!0,e),L=t.input.charCodeAt(t.position),L===44?(r=!0,L=t.input.charCodeAt(++t.position)):r=!1}wr(t,"unexpected end of the stream within a flow collection")}function w6e(t,e){var r,o,a=mT,n=!1,u=!1,A=e,p=0,h=!1,E,w;if(w=t.input.charCodeAt(t.position),w===124)o=!1;else if(w===62)o=!0;else return!1;for(t.kind="scalar",t.result="";w!==0;)if(w=t.input.charCodeAt(++t.position),w===43||w===45)mT===a?a=w===43?uK:c6e:wr(t,"repeat of a chomping mode identifier");else if((E=g6e(w))>=0)E===0?wr(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):u?wr(t,"repeat of an indentation width identifier"):(A=e+E-1,u=!0);else break;if(Vg(w)){do w=t.input.charCodeAt(++t.position);while(Vg(w));if(w===35)do w=t.input.charCodeAt(++t.position);while(!Wu(w)&&w!==0)}for(;w!==0;){for(yT(t),t.lineIndent=0,w=t.input.charCodeAt(t.position);(!u||t.lineIndentA&&(A=t.lineIndent),Wu(w)){p++;continue}if(t.lineIndente)&&p!==0)wr(t,"bad indentation of a sequence entry");else if(t.lineIndente)&&(Cy(t,e,TD,!0,a)&&(C?v=t.result:b=t.result),C||(yy(t,h,E,w,v,b,n,u),w=v=b=null),Wi(t,!0,-1),L=t.input.charCodeAt(t.position)),t.lineIndent>e&&L!==0)wr(t,"bad indentation of a mapping entry");else if(t.lineIndente?p=1:t.lineIndent===e?p=0:t.lineIndente?p=1:t.lineIndent===e?p=0:t.lineIndent tag; it should be "scalar", not "'+t.kind+'"'),w=0,v=t.implicitTypes.length;w tag; it should be "'+b.kind+'", not "'+t.kind+'"'),b.resolve(t.result)?(t.result=b.construct(t.result),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):wr(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")):wr(t,"unknown tag !<"+t.tag+">");return t.listener!==null&&t.listener("close",t),t.tag!==null||t.anchor!==null||E}function P6e(t){var e=t.position,r,o,a,n=!1,u;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap={},t.anchorMap={};(u=t.input.charCodeAt(t.position))!==0&&(Wi(t,!0,-1),u=t.input.charCodeAt(t.position),!(t.lineIndent>0||u!==37));){for(n=!0,u=t.input.charCodeAt(++t.position),r=t.position;u!==0&&!Ia(u);)u=t.input.charCodeAt(++t.position);for(o=t.input.slice(r,t.position),a=[],o.length<1&&wr(t,"directive name must not be less than one character in length");u!==0;){for(;Vg(u);)u=t.input.charCodeAt(++t.position);if(u===35){do u=t.input.charCodeAt(++t.position);while(u!==0&&!Wu(u));break}if(Wu(u))break;for(r=t.position;u!==0&&!Ia(u);)u=t.input.charCodeAt(++t.position);a.push(t.input.slice(r,t.position))}u!==0&&yT(t),jp.call(pK,o)?pK[o](t,o,a):ND(t,'unknown document directive "'+o+'"')}if(Wi(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,Wi(t,!0,-1)):n&&wr(t,"directives end mark is expected"),Cy(t,t.lineIndent-1,TD,!1,!0),Wi(t,!0,-1),t.checkLineBreaks&&A6e.test(t.input.slice(e,t.position))&&ND(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&LD(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,Wi(t,!0,-1));return}if(t.position"u"&&(r=e,e=null);var o=DK(t,r);if(typeof e!="function")return o;for(var a=0,n=o.length;a"u"&&(r=e,e=null),SK(t,e,Cf.extend({schema:mK},r))}function b6e(t,e){return PK(t,Cf.extend({schema:mK},e))}GI.exports.loadAll=SK;GI.exports.load=PK;GI.exports.safeLoadAll=x6e;GI.exports.safeLoad=b6e});var XK=U((ebt,BT)=>{"use strict";var YI=Gg(),KI=hy(),Q6e=jI(),k6e=dy(),LK=Object.prototype.toString,OK=Object.prototype.hasOwnProperty,F6e=9,WI=10,R6e=13,T6e=32,N6e=33,L6e=34,MK=35,O6e=37,M6e=38,U6e=39,_6e=42,UK=44,H6e=45,_K=58,q6e=61,j6e=62,G6e=63,W6e=64,HK=91,qK=93,Y6e=96,jK=123,K6e=124,GK=125,wo={};wo[0]="\\0";wo[7]="\\a";wo[8]="\\b";wo[9]="\\t";wo[10]="\\n";wo[11]="\\v";wo[12]="\\f";wo[13]="\\r";wo[27]="\\e";wo[34]='\\"';wo[92]="\\\\";wo[133]="\\N";wo[160]="\\_";wo[8232]="\\L";wo[8233]="\\P";var V6e=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function J6e(t,e){var r,o,a,n,u,A,p;if(e===null)return{};for(r={},o=Object.keys(e),a=0,n=o.length;a0?t.charCodeAt(n-1):null,v=v&&kK(u,A)}else{for(n=0;no&&t[w+1]!==" ",w=n);else if(!Ey(u))return OD;A=n>0?t.charCodeAt(n-1):null,v=v&&kK(u,A)}h=h||E&&n-w-1>o&&t[w+1]!==" "}return!p&&!h?v&&!a(t)?YK:KK:r>9&&WK(t)?OD:h?JK:VK}function tqe(t,e,r,o){t.dump=function(){if(e.length===0)return"''";if(!t.noCompatMode&&V6e.indexOf(e)!==-1)return"'"+e+"'";var a=t.indent*Math.max(1,r),n=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-a),u=o||t.flowLevel>-1&&r>=t.flowLevel;function A(p){return X6e(t,p)}switch(eqe(e,u,t.indent,n,A)){case YK:return e;case KK:return"'"+e.replace(/'/g,"''")+"'";case VK:return"|"+FK(e,t.indent)+RK(QK(e,a));case JK:return">"+FK(e,t.indent)+RK(QK(rqe(e,n),a));case OD:return'"'+nqe(e,n)+'"';default:throw new KI("impossible error: invalid scalar style")}}()}function FK(t,e){var r=WK(t)?String(e):"",o=t[t.length-1]===` +`,a=o&&(t[t.length-2]===` +`||t===` +`),n=a?"+":o?"":"-";return r+n+` +`}function RK(t){return t[t.length-1]===` +`?t.slice(0,-1):t}function rqe(t,e){for(var r=/(\n+)([^\n]*)/g,o=function(){var h=t.indexOf(` +`);return h=h!==-1?h:t.length,r.lastIndex=h,TK(t.slice(0,h),e)}(),a=t[0]===` +`||t[0]===" ",n,u;u=r.exec(t);){var A=u[1],p=u[2];n=p[0]===" ",o+=A+(!a&&!n&&p!==""?` +`:"")+TK(p,e),a=n}return o}function TK(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,o,a=0,n,u=0,A=0,p="";o=r.exec(t);)A=o.index,A-a>e&&(n=u>a?u:A,p+=` +`+t.slice(a,n),a=n+1),u=A;return p+=` +`,t.length-a>e&&u>a?p+=t.slice(a,u)+` +`+t.slice(u+1):p+=t.slice(a),p.slice(1)}function nqe(t){for(var e="",r,o,a,n=0;n=55296&&r<=56319&&(o=t.charCodeAt(n+1),o>=56320&&o<=57343)){e+=bK((r-55296)*1024+o-56320+65536),n++;continue}a=wo[r],e+=!a&&Ey(r)?t[n]:a||bK(r)}return e}function iqe(t,e,r){var o="",a=t.tag,n,u;for(n=0,u=r.length;n1024&&(E+="? "),E+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),Jg(t,e,h,!1,!1)&&(E+=t.dump,o+=E));t.tag=a,t.dump="{"+o+"}"}function aqe(t,e,r,o){var a="",n=t.tag,u=Object.keys(r),A,p,h,E,w,v;if(t.sortKeys===!0)u.sort();else if(typeof t.sortKeys=="function")u.sort(t.sortKeys);else if(t.sortKeys)throw new KI("sortKeys must be a boolean or a function");for(A=0,p=u.length;A1024,w&&(t.dump&&WI===t.dump.charCodeAt(0)?v+="?":v+="? "),v+=t.dump,w&&(v+=ET(t,e)),Jg(t,e+1,E,!0,w)&&(t.dump&&WI===t.dump.charCodeAt(0)?v+=":":v+=": ",v+=t.dump,a+=v));t.tag=n,t.dump=a||"{}"}function NK(t,e,r){var o,a,n,u,A,p;for(a=r?t.explicitTypes:t.implicitTypes,n=0,u=a.length;n tag resolver accepts not "'+p+'" style');t.dump=o}return!0}return!1}function Jg(t,e,r,o,a,n){t.tag=null,t.dump=r,NK(t,r,!1)||NK(t,r,!0);var u=LK.call(t.dump);o&&(o=t.flowLevel<0||t.flowLevel>e);var A=u==="[object Object]"||u==="[object Array]",p,h;if(A&&(p=t.duplicates.indexOf(r),h=p!==-1),(t.tag!==null&&t.tag!=="?"||h||t.indent!==2&&e>0)&&(a=!1),h&&t.usedDuplicates[p])t.dump="*ref_"+p;else{if(A&&h&&!t.usedDuplicates[p]&&(t.usedDuplicates[p]=!0),u==="[object Object]")o&&Object.keys(t.dump).length!==0?(aqe(t,e,t.dump,a),h&&(t.dump="&ref_"+p+t.dump)):(oqe(t,e,t.dump),h&&(t.dump="&ref_"+p+" "+t.dump));else if(u==="[object Array]"){var E=t.noArrayIndent&&e>0?e-1:e;o&&t.dump.length!==0?(sqe(t,E,t.dump,a),h&&(t.dump="&ref_"+p+t.dump)):(iqe(t,E,t.dump),h&&(t.dump="&ref_"+p+" "+t.dump))}else if(u==="[object String]")t.tag!=="?"&&tqe(t,t.dump,e,n);else{if(t.skipInvalid)return!1;throw new KI("unacceptable kind of an object to dump "+u)}t.tag!==null&&t.tag!=="?"&&(t.dump="!<"+t.tag+"> "+t.dump)}return!0}function lqe(t,e){var r=[],o=[],a,n;for(IT(t,r,o),a=0,n=o.length;a{"use strict";var MD=xK(),ZK=XK();function UD(t){return function(){throw new Error("Function "+t+" is deprecated and cannot be used.")}}Pi.exports.Type=as();Pi.exports.Schema=Wg();Pi.exports.FAILSAFE_SCHEMA=kD();Pi.exports.JSON_SCHEMA=hT();Pi.exports.CORE_SCHEMA=gT();Pi.exports.DEFAULT_SAFE_SCHEMA=dy();Pi.exports.DEFAULT_FULL_SCHEMA=jI();Pi.exports.load=MD.load;Pi.exports.loadAll=MD.loadAll;Pi.exports.safeLoad=MD.safeLoad;Pi.exports.safeLoadAll=MD.safeLoadAll;Pi.exports.dump=ZK.dump;Pi.exports.safeDump=ZK.safeDump;Pi.exports.YAMLException=hy();Pi.exports.MINIMAL_SCHEMA=kD();Pi.exports.SAFE_SCHEMA=dy();Pi.exports.DEFAULT_SCHEMA=jI();Pi.exports.scan=UD("scan");Pi.exports.parse=UD("parse");Pi.exports.compose=UD("compose");Pi.exports.addConstructor=UD("addConstructor")});var tV=U((rbt,eV)=>{"use strict";var uqe=$K();eV.exports=uqe});var nV=U((nbt,rV)=>{"use strict";function Aqe(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function zg(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,zg)}Aqe(zg,Error);zg.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",w;for(w=0;w0){for(w=1,v=1;w({[Be]:je})))},pe=function(ee){return ee},he=function(ee){return ee},ve=ra("correct indentation"),ge=" ",le=Dn(" ",!1),Pe=function(ee){return ee.length===oa*Ha},g=function(ee){return ee.length===(oa+1)*Ha},De=function(){return oa++,!0},Ce=function(){return oa--,!0},de=function(){return xA()},ne=ra("pseudostring"),Z=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,me=ui(["\r",` +`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),be=/^[^\r\n\t ,\][{}:#"']/,ut=ui(["\r",` +`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),H=function(){return xA().replace(/^ *| *$/g,"")},yt="--",Me=Dn("--",!1),Te=/^[a-zA-Z\/0-9]/,Qe=ui([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),_e=/^[^\r\n\t :,]/,qe=ui(["\r",` +`," "," ",":",","],!0,!1),At="null",Oe=Dn("null",!1),x=function(){return null},I="true",P=Dn("true",!1),y=function(){return!0},F="false",J=Dn("false",!1),X=function(){return!1},$=ra("string"),ie='"',ke=Dn('"',!1),Ne=function(){return""},st=function(ee){return ee},ht=function(ee){return ee.join("")},Ut=/^[^"\\\0-\x1F\x7F]/,Xt=ui(['"',"\\",["\0",""],"\x7F"],!0,!1),Pt='\\"',tn=Dn('\\"',!1),Dr=function(){return'"'},fr="\\\\",Br=Dn("\\\\",!1),jr=function(){return"\\"},Hn="\\/",bs=Dn("\\/",!1),ki=function(){return"/"},gs="\\b",to=Dn("\\b",!1),Di=function(){return"\b"},Qs="\\f",ro=Dn("\\f",!1),pc=function(){return"\f"},gu="\\n",ap=Dn("\\n",!1),lp=function(){return` +`},ks="\\r",En=Dn("\\r",!1),no=function(){return"\r"},Fs="\\t",Cl=Dn("\\t",!1),El=function(){return" "},io="\\u",Ue=Dn("\\u",!1),Fn=function(ee,we,je,Be){return String.fromCharCode(parseInt(`0x${ee}${we}${je}${Be}`))},Fi=/^[0-9a-fA-F]/,Rn=ui([["0","9"],["a","f"],["A","F"]],!1,!1),Ui=ra("blank space"),Zt=/^[ \t]/,Ri=ui([" "," "],!1,!1),$n=ra("white space"),Ma=/^[ \t\n\r]/,$t=ui([" "," ",` +`,"\r"],!1,!1),hc=`\r +`,du=Dn(`\r +`,!1),gc=` +`,Il=Dn(` +`,!1),PA="\r",mu=Dn("\r",!1),Ee=0,Rt=0,dc=[{line:1,column:1}],_i=0,yu=[],qt=0,wl;if("startRule"in e){if(!(e.startRule in o))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=o[e.startRule]}function xA(){return t.substring(Rt,Ee)}function cp(){return Oo(Rt,Ee)}function mc(ee,we){throw we=we!==void 0?we:Oo(Rt,Ee),Bl([ra(ee)],t.substring(Rt,Ee),we)}function bA(ee,we){throw we=we!==void 0?we:Oo(Rt,Ee),so(ee,we)}function Dn(ee,we){return{type:"literal",text:ee,ignoreCase:we}}function ui(ee,we,je){return{type:"class",parts:ee,inverted:we,ignoreCase:je}}function yc(){return{type:"any"}}function QA(){return{type:"end"}}function ra(ee){return{type:"other",description:ee}}function Hi(ee){var we=dc[ee],je;if(we)return we;for(je=ee-1;!dc[je];)je--;for(we=dc[je],we={line:we.line,column:we.column};je_i&&(_i=Ee,yu=[]),yu.push(ee))}function so(ee,we){return new zg(ee,null,null,we)}function Bl(ee,we,je){return new zg(zg.buildMessage(ee,we),ee,we,je)}function Cu(){var ee;return ee=kA(),ee}function qi(){var ee,we,je;for(ee=Ee,we=[],je=Eu();je!==r;)we.push(je),je=Eu();return we!==r&&(Rt=ee,we=n(we)),ee=we,ee}function Eu(){var ee,we,je,Be,xe;return ee=Ee,we=ds(),we!==r?(t.charCodeAt(Ee)===45?(je=u,Ee++):(je=r,qt===0&&$e(A)),je!==r?(Be=qn(),Be!==r?(xe=Cc(),xe!==r?(Rt=ee,we=p(xe),ee=we):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r),ee}function kA(){var ee,we,je;for(ee=Ee,we=[],je=Ua();je!==r;)we.push(je),je=Ua();return we!==r&&(Rt=ee,we=h(we)),ee=we,ee}function Ua(){var ee,we,je,Be,xe,Ve,vt,tr,Zr;if(ee=Ee,we=qn(),we===r&&(we=null),we!==r){if(je=Ee,t.charCodeAt(Ee)===35?(Be=E,Ee++):(Be=r,qt===0&&$e(w)),Be!==r){if(xe=[],Ve=Ee,vt=Ee,qt++,tr=mi(),qt--,tr===r?vt=void 0:(Ee=vt,vt=r),vt!==r?(t.length>Ee?(tr=t.charAt(Ee),Ee++):(tr=r,qt===0&&$e(v)),tr!==r?(vt=[vt,tr],Ve=vt):(Ee=Ve,Ve=r)):(Ee=Ve,Ve=r),Ve!==r)for(;Ve!==r;)xe.push(Ve),Ve=Ee,vt=Ee,qt++,tr=mi(),qt--,tr===r?vt=void 0:(Ee=vt,vt=r),vt!==r?(t.length>Ee?(tr=t.charAt(Ee),Ee++):(tr=r,qt===0&&$e(v)),tr!==r?(vt=[vt,tr],Ve=vt):(Ee=Ve,Ve=r)):(Ee=Ve,Ve=r);else xe=r;xe!==r?(Be=[Be,xe],je=Be):(Ee=je,je=r)}else Ee=je,je=r;if(je===r&&(je=null),je!==r){if(Be=[],xe=es(),xe!==r)for(;xe!==r;)Be.push(xe),xe=es();else Be=r;Be!==r?(Rt=ee,we=b(),ee=we):(Ee=ee,ee=r)}else Ee=ee,ee=r}else Ee=ee,ee=r;if(ee===r&&(ee=Ee,we=ds(),we!==r?(je=na(),je!==r?(Be=qn(),Be===r&&(Be=null),Be!==r?(t.charCodeAt(Ee)===58?(xe=C,Ee++):(xe=r,qt===0&&$e(R)),xe!==r?(Ve=qn(),Ve===r&&(Ve=null),Ve!==r?(vt=Cc(),vt!==r?(Rt=ee,we=L(je,vt),ee=we):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r),ee===r&&(ee=Ee,we=ds(),we!==r?(je=oo(),je!==r?(Be=qn(),Be===r&&(Be=null),Be!==r?(t.charCodeAt(Ee)===58?(xe=C,Ee++):(xe=r,qt===0&&$e(R)),xe!==r?(Ve=qn(),Ve===r&&(Ve=null),Ve!==r?(vt=Cc(),vt!==r?(Rt=ee,we=L(je,vt),ee=we):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r),ee===r))){if(ee=Ee,we=ds(),we!==r)if(je=oo(),je!==r)if(Be=qn(),Be!==r)if(xe=ia(),xe!==r){if(Ve=[],vt=es(),vt!==r)for(;vt!==r;)Ve.push(vt),vt=es();else Ve=r;Ve!==r?(Rt=ee,we=L(je,xe),ee=we):(Ee=ee,ee=r)}else Ee=ee,ee=r;else Ee=ee,ee=r;else Ee=ee,ee=r;else Ee=ee,ee=r;if(ee===r)if(ee=Ee,we=ds(),we!==r)if(je=oo(),je!==r){if(Be=[],xe=Ee,Ve=qn(),Ve===r&&(Ve=null),Ve!==r?(t.charCodeAt(Ee)===44?(vt=_,Ee++):(vt=r,qt===0&&$e(V)),vt!==r?(tr=qn(),tr===r&&(tr=null),tr!==r?(Zr=oo(),Zr!==r?(Rt=xe,Ve=re(je,Zr),xe=Ve):(Ee=xe,xe=r)):(Ee=xe,xe=r)):(Ee=xe,xe=r)):(Ee=xe,xe=r),xe!==r)for(;xe!==r;)Be.push(xe),xe=Ee,Ve=qn(),Ve===r&&(Ve=null),Ve!==r?(t.charCodeAt(Ee)===44?(vt=_,Ee++):(vt=r,qt===0&&$e(V)),vt!==r?(tr=qn(),tr===r&&(tr=null),tr!==r?(Zr=oo(),Zr!==r?(Rt=xe,Ve=re(je,Zr),xe=Ve):(Ee=xe,xe=r)):(Ee=xe,xe=r)):(Ee=xe,xe=r)):(Ee=xe,xe=r);else Be=r;Be!==r?(xe=qn(),xe===r&&(xe=null),xe!==r?(t.charCodeAt(Ee)===58?(Ve=C,Ee++):(Ve=r,qt===0&&$e(R)),Ve!==r?(vt=qn(),vt===r&&(vt=null),vt!==r?(tr=Cc(),tr!==r?(Rt=ee,we=oe(je,Be,tr),ee=we):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r)}else Ee=ee,ee=r;else Ee=ee,ee=r}return ee}function Cc(){var ee,we,je,Be,xe,Ve,vt;if(ee=Ee,we=Ee,qt++,je=Ee,Be=mi(),Be!==r?(xe=Ot(),xe!==r?(t.charCodeAt(Ee)===45?(Ve=u,Ee++):(Ve=r,qt===0&&$e(A)),Ve!==r?(vt=qn(),vt!==r?(Be=[Be,xe,Ve,vt],je=Be):(Ee=je,je=r)):(Ee=je,je=r)):(Ee=je,je=r)):(Ee=je,je=r),qt--,je!==r?(Ee=we,we=void 0):we=r,we!==r?(je=es(),je!==r?(Be=Sn(),Be!==r?(xe=qi(),xe!==r?(Ve=di(),Ve!==r?(Rt=ee,we=pe(xe),ee=we):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r),ee===r&&(ee=Ee,we=mi(),we!==r?(je=Sn(),je!==r?(Be=kA(),Be!==r?(xe=di(),xe!==r?(Rt=ee,we=pe(Be),ee=we):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r),ee===r))if(ee=Ee,we=Rs(),we!==r){if(je=[],Be=es(),Be!==r)for(;Be!==r;)je.push(Be),Be=es();else je=r;je!==r?(Rt=ee,we=he(we),ee=we):(Ee=ee,ee=r)}else Ee=ee,ee=r;return ee}function ds(){var ee,we,je;for(qt++,ee=Ee,we=[],t.charCodeAt(Ee)===32?(je=ge,Ee++):(je=r,qt===0&&$e(le));je!==r;)we.push(je),t.charCodeAt(Ee)===32?(je=ge,Ee++):(je=r,qt===0&&$e(le));return we!==r?(Rt=Ee,je=Pe(we),je?je=void 0:je=r,je!==r?(we=[we,je],ee=we):(Ee=ee,ee=r)):(Ee=ee,ee=r),qt--,ee===r&&(we=r,qt===0&&$e(ve)),ee}function Ot(){var ee,we,je;for(ee=Ee,we=[],t.charCodeAt(Ee)===32?(je=ge,Ee++):(je=r,qt===0&&$e(le));je!==r;)we.push(je),t.charCodeAt(Ee)===32?(je=ge,Ee++):(je=r,qt===0&&$e(le));return we!==r?(Rt=Ee,je=g(we),je?je=void 0:je=r,je!==r?(we=[we,je],ee=we):(Ee=ee,ee=r)):(Ee=ee,ee=r),ee}function Sn(){var ee;return Rt=Ee,ee=De(),ee?ee=void 0:ee=r,ee}function di(){var ee;return Rt=Ee,ee=Ce(),ee?ee=void 0:ee=r,ee}function na(){var ee;return ee=Ns(),ee===r&&(ee=sa()),ee}function oo(){var ee,we,je;if(ee=Ns(),ee===r){if(ee=Ee,we=[],je=Mo(),je!==r)for(;je!==r;)we.push(je),je=Mo();else we=r;we!==r&&(Rt=ee,we=de()),ee=we}return ee}function Rs(){var ee;return ee=Zi(),ee===r&&(ee=Ts(),ee===r&&(ee=Ns(),ee===r&&(ee=sa()))),ee}function ia(){var ee;return ee=Zi(),ee===r&&(ee=Ns(),ee===r&&(ee=Mo())),ee}function sa(){var ee,we,je,Be,xe,Ve;if(qt++,ee=Ee,Z.test(t.charAt(Ee))?(we=t.charAt(Ee),Ee++):(we=r,qt===0&&$e(me)),we!==r){for(je=[],Be=Ee,xe=qn(),xe===r&&(xe=null),xe!==r?(be.test(t.charAt(Ee))?(Ve=t.charAt(Ee),Ee++):(Ve=r,qt===0&&$e(ut)),Ve!==r?(xe=[xe,Ve],Be=xe):(Ee=Be,Be=r)):(Ee=Be,Be=r);Be!==r;)je.push(Be),Be=Ee,xe=qn(),xe===r&&(xe=null),xe!==r?(be.test(t.charAt(Ee))?(Ve=t.charAt(Ee),Ee++):(Ve=r,qt===0&&$e(ut)),Ve!==r?(xe=[xe,Ve],Be=xe):(Ee=Be,Be=r)):(Ee=Be,Be=r);je!==r?(Rt=ee,we=H(),ee=we):(Ee=ee,ee=r)}else Ee=ee,ee=r;return qt--,ee===r&&(we=r,qt===0&&$e(ne)),ee}function Mo(){var ee,we,je,Be,xe;if(ee=Ee,t.substr(Ee,2)===yt?(we=yt,Ee+=2):(we=r,qt===0&&$e(Me)),we===r&&(we=null),we!==r)if(Te.test(t.charAt(Ee))?(je=t.charAt(Ee),Ee++):(je=r,qt===0&&$e(Qe)),je!==r){for(Be=[],_e.test(t.charAt(Ee))?(xe=t.charAt(Ee),Ee++):(xe=r,qt===0&&$e(qe));xe!==r;)Be.push(xe),_e.test(t.charAt(Ee))?(xe=t.charAt(Ee),Ee++):(xe=r,qt===0&&$e(qe));Be!==r?(Rt=ee,we=H(),ee=we):(Ee=ee,ee=r)}else Ee=ee,ee=r;else Ee=ee,ee=r;return ee}function Zi(){var ee,we;return ee=Ee,t.substr(Ee,4)===At?(we=At,Ee+=4):(we=r,qt===0&&$e(Oe)),we!==r&&(Rt=ee,we=x()),ee=we,ee}function Ts(){var ee,we;return ee=Ee,t.substr(Ee,4)===I?(we=I,Ee+=4):(we=r,qt===0&&$e(P)),we!==r&&(Rt=ee,we=y()),ee=we,ee===r&&(ee=Ee,t.substr(Ee,5)===F?(we=F,Ee+=5):(we=r,qt===0&&$e(J)),we!==r&&(Rt=ee,we=X()),ee=we),ee}function Ns(){var ee,we,je,Be;return qt++,ee=Ee,t.charCodeAt(Ee)===34?(we=ie,Ee++):(we=r,qt===0&&$e(ke)),we!==r?(t.charCodeAt(Ee)===34?(je=ie,Ee++):(je=r,qt===0&&$e(ke)),je!==r?(Rt=ee,we=Ne(),ee=we):(Ee=ee,ee=r)):(Ee=ee,ee=r),ee===r&&(ee=Ee,t.charCodeAt(Ee)===34?(we=ie,Ee++):(we=r,qt===0&&$e(ke)),we!==r?(je=Ls(),je!==r?(t.charCodeAt(Ee)===34?(Be=ie,Ee++):(Be=r,qt===0&&$e(ke)),Be!==r?(Rt=ee,we=st(je),ee=we):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r)),qt--,ee===r&&(we=r,qt===0&&$e($)),ee}function Ls(){var ee,we,je;if(ee=Ee,we=[],je=ao(),je!==r)for(;je!==r;)we.push(je),je=ao();else we=r;return we!==r&&(Rt=ee,we=ht(we)),ee=we,ee}function ao(){var ee,we,je,Be,xe,Ve;return Ut.test(t.charAt(Ee))?(ee=t.charAt(Ee),Ee++):(ee=r,qt===0&&$e(Xt)),ee===r&&(ee=Ee,t.substr(Ee,2)===Pt?(we=Pt,Ee+=2):(we=r,qt===0&&$e(tn)),we!==r&&(Rt=ee,we=Dr()),ee=we,ee===r&&(ee=Ee,t.substr(Ee,2)===fr?(we=fr,Ee+=2):(we=r,qt===0&&$e(Br)),we!==r&&(Rt=ee,we=jr()),ee=we,ee===r&&(ee=Ee,t.substr(Ee,2)===Hn?(we=Hn,Ee+=2):(we=r,qt===0&&$e(bs)),we!==r&&(Rt=ee,we=ki()),ee=we,ee===r&&(ee=Ee,t.substr(Ee,2)===gs?(we=gs,Ee+=2):(we=r,qt===0&&$e(to)),we!==r&&(Rt=ee,we=Di()),ee=we,ee===r&&(ee=Ee,t.substr(Ee,2)===Qs?(we=Qs,Ee+=2):(we=r,qt===0&&$e(ro)),we!==r&&(Rt=ee,we=pc()),ee=we,ee===r&&(ee=Ee,t.substr(Ee,2)===gu?(we=gu,Ee+=2):(we=r,qt===0&&$e(ap)),we!==r&&(Rt=ee,we=lp()),ee=we,ee===r&&(ee=Ee,t.substr(Ee,2)===ks?(we=ks,Ee+=2):(we=r,qt===0&&$e(En)),we!==r&&(Rt=ee,we=no()),ee=we,ee===r&&(ee=Ee,t.substr(Ee,2)===Fs?(we=Fs,Ee+=2):(we=r,qt===0&&$e(Cl)),we!==r&&(Rt=ee,we=El()),ee=we,ee===r&&(ee=Ee,t.substr(Ee,2)===io?(we=io,Ee+=2):(we=r,qt===0&&$e(Ue)),we!==r?(je=Yn(),je!==r?(Be=Yn(),Be!==r?(xe=Yn(),xe!==r?(Ve=Yn(),Ve!==r?(Rt=ee,we=Fn(je,Be,xe,Ve),ee=we):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r)):(Ee=ee,ee=r)))))))))),ee}function Yn(){var ee;return Fi.test(t.charAt(Ee))?(ee=t.charAt(Ee),Ee++):(ee=r,qt===0&&$e(Rn)),ee}function qn(){var ee,we;if(qt++,ee=[],Zt.test(t.charAt(Ee))?(we=t.charAt(Ee),Ee++):(we=r,qt===0&&$e(Ri)),we!==r)for(;we!==r;)ee.push(we),Zt.test(t.charAt(Ee))?(we=t.charAt(Ee),Ee++):(we=r,qt===0&&$e(Ri));else ee=r;return qt--,ee===r&&(we=r,qt===0&&$e(Ui)),ee}function $i(){var ee,we;if(qt++,ee=[],Ma.test(t.charAt(Ee))?(we=t.charAt(Ee),Ee++):(we=r,qt===0&&$e($t)),we!==r)for(;we!==r;)ee.push(we),Ma.test(t.charAt(Ee))?(we=t.charAt(Ee),Ee++):(we=r,qt===0&&$e($t));else ee=r;return qt--,ee===r&&(we=r,qt===0&&$e($n)),ee}function es(){var ee,we,je,Be,xe,Ve;if(ee=Ee,we=mi(),we!==r){for(je=[],Be=Ee,xe=qn(),xe===r&&(xe=null),xe!==r?(Ve=mi(),Ve!==r?(xe=[xe,Ve],Be=xe):(Ee=Be,Be=r)):(Ee=Be,Be=r);Be!==r;)je.push(Be),Be=Ee,xe=qn(),xe===r&&(xe=null),xe!==r?(Ve=mi(),Ve!==r?(xe=[xe,Ve],Be=xe):(Ee=Be,Be=r)):(Ee=Be,Be=r);je!==r?(we=[we,je],ee=we):(Ee=ee,ee=r)}else Ee=ee,ee=r;return ee}function mi(){var ee;return t.substr(Ee,2)===hc?(ee=hc,Ee+=2):(ee=r,qt===0&&$e(du)),ee===r&&(t.charCodeAt(Ee)===10?(ee=gc,Ee++):(ee=r,qt===0&&$e(Il)),ee===r&&(t.charCodeAt(Ee)===13?(ee=PA,Ee++):(ee=r,qt===0&&$e(mu)))),ee}let Ha=2,oa=0;if(wl=a(),wl!==r&&Ee===t.length)return wl;throw wl!==r&&Ee"u"?!0:typeof t=="object"&&t!==null?Object.keys(t).every(e=>aV(t[e])):!1}function vT(t,e,r){if(t===null)return`null +`;if(typeof t=="number"||typeof t=="boolean")return`${t.toString()} +`;if(typeof t=="string")return`${sV(t)} +`;if(Array.isArray(t)){if(t.length===0)return`[] +`;let o=" ".repeat(e);return` +${t.map(n=>`${o}- ${vT(n,e+1,!1)}`).join("")}`}if(typeof t=="object"&&t){let[o,a]=t instanceof _D?[t.data,!1]:[t,!0],n=" ".repeat(e),u=Object.keys(o);a&&u.sort((p,h)=>{let E=iV.indexOf(p),w=iV.indexOf(h);return E===-1&&w===-1?ph?1:0:E!==-1&&w===-1?-1:E===-1&&w!==-1?1:E-w});let A=u.filter(p=>!aV(o[p])).map((p,h)=>{let E=o[p],w=sV(p),v=vT(E,e+1,!0),b=h>0||r?n:"",C=w.length>1024?`? ${w} +${b}:`:`${w}:`,R=v.startsWith(` +`)?v:` ${v}`;return`${b}${C}${R}`}).join(e===0?` +`:"")||` +`;return r?` +${A}`:`${A}`}throw new Error(`Unsupported value type (${t})`)}function wa(t){try{let e=vT(t,0,!1);return e!==` +`?e:""}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}function hqe(t){return t.endsWith(` +`)||(t+=` +`),(0,oV.parse)(t)}function dqe(t){if(gqe.test(t))return hqe(t);let e=(0,HD.safeLoad)(t,{schema:HD.FAILSAFE_SCHEMA,json:!0});if(e==null)return{};if(typeof e!="object")throw new Error(`Expected an indexed object, got a ${typeof e} instead. Does your file follow Yaml's rules?`);if(Array.isArray(e))throw new Error("Expected an indexed object, got an array instead. Does your file follow Yaml's rules?");return e}function Yi(t){return dqe(t)}var HD,oV,pqe,iV,_D,gqe,lV=dt(()=>{HD=tt(tV()),oV=tt(nV()),pqe=/^(?![-?:,\][{}#&*!|>'"%@` \t\r\n]).([ \t]*(?![,\][{}:# \t\r\n]).)*$/,iV=["__metadata","version","resolution","dependencies","peerDependencies","dependenciesMeta","peerDependenciesMeta","binaries"],_D=class{constructor(e){this.data=e}};wa.PreserveOrdering=_D;gqe=/^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i});var VI={};Yt(VI,{parseResolution:()=>xD,parseShell:()=>DD,parseSyml:()=>Yi,stringifyArgument:()=>uT,stringifyArgumentSegment:()=>AT,stringifyArithmeticExpression:()=>PD,stringifyCommand:()=>cT,stringifyCommandChain:()=>py,stringifyCommandChainThen:()=>lT,stringifyCommandLine:()=>SD,stringifyCommandLineThen:()=>aT,stringifyEnvSegment:()=>vD,stringifyRedirectArgument:()=>HI,stringifyResolution:()=>bD,stringifyShell:()=>fy,stringifyShellLine:()=>fy,stringifySyml:()=>wa,stringifyValueArgument:()=>Hg});var _l=dt(()=>{aY();AY();lV()});var uV=U((lbt,DT)=>{"use strict";var mqe=t=>{let e=!1,r=!1,o=!1;for(let a=0;a{if(!(typeof t=="string"||Array.isArray(t)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let r=a=>e.pascalCase?a.charAt(0).toUpperCase()+a.slice(1):a;return Array.isArray(t)?t=t.map(a=>a.trim()).filter(a=>a.length).join("-"):t=t.trim(),t.length===0?"":t.length===1?e.pascalCase?t.toUpperCase():t.toLowerCase():(t!==t.toLowerCase()&&(t=mqe(t)),t=t.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(a,n)=>n.toUpperCase()).replace(/\d+(\w|$)/g,a=>a.toUpperCase()),r(t))};DT.exports=cV;DT.exports.default=cV});var AV=U((cbt,yqe)=>{yqe.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}},{name:"Vercel",constant:"VERCEL",env:"NOW_BUILDER"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"}]});var Xg=U(el=>{"use strict";var pV=AV(),Yu=process.env;Object.defineProperty(el,"_vendors",{value:pV.map(function(t){return t.constant})});el.name=null;el.isPR=null;pV.forEach(function(t){let r=(Array.isArray(t.env)?t.env:[t.env]).every(function(o){return fV(o)});if(el[t.constant]=r,r)switch(el.name=t.name,typeof t.pr){case"string":el.isPR=!!Yu[t.pr];break;case"object":"env"in t.pr?el.isPR=t.pr.env in Yu&&Yu[t.pr.env]!==t.pr.ne:"any"in t.pr?el.isPR=t.pr.any.some(function(o){return!!Yu[o]}):el.isPR=fV(t.pr);break;default:el.isPR=null}});el.isCI=!!(Yu.CI||Yu.CONTINUOUS_INTEGRATION||Yu.BUILD_NUMBER||Yu.RUN_ID||el.name);function fV(t){return typeof t=="string"?!!Yu[t]:Object.keys(t).every(function(e){return Yu[e]===t[e]})}});var ST,js,PT,qD,hV,xT,bT,QT=dt(()=>{ST="",js="\0",PT=/^(-h|--help)(?:=([0-9]+))?$/,qD=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,hV=/^-[a-zA-Z]{2,}$/,xT=/^([^=]+)=([\s\S]*)$/,bT=process.env.DEBUG_CLI==="1"});var ot,Iy,jD,kT,GD=dt(()=>{QT();ot=class extends Error{constructor(e){super(e),this.clipanion={type:"usage"},this.name="UsageError"}},Iy=class extends Error{constructor(e,r){if(super(),this.input=e,this.candidates=r,this.clipanion={type:"none"},this.name="UnknownSyntaxError",this.candidates.length===0)this.message="Command not found, but we're not sure what's the alternative.";else if(this.candidates.every(o=>o.reason!==null&&o.reason===r[0].reason)){let[{reason:o}]=this.candidates;this.message=`${o} + +${this.candidates.map(({usage:a})=>`$ ${a}`).join(` +`)}`}else if(this.candidates.length===1){let[{usage:o}]=this.candidates;this.message=`Command not found; did you mean: + +$ ${o} +${kT(e)}`}else this.message=`Command not found; did you mean one of: + +${this.candidates.map(({usage:o},a)=>`${`${a}.`.padStart(4)} ${o}`).join(` +`)} + +${kT(e)}`}},jD=class extends Error{constructor(e,r){super(),this.input=e,this.usages=r,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find which to pick amongst the following alternatives: + +${this.usages.map((o,a)=>`${`${a}.`.padStart(4)} ${o}`).join(` +`)} + +${kT(e)}`}},kT=t=>`While running ${t.filter(e=>e!==js).map(e=>{let r=JSON.stringify(e);return e.match(/\s/)||e.length===0||r!==`"${e}"`?r:e}).join(" ")}`});function Cqe(t){let e=t.split(` +`),r=e.filter(a=>a.match(/\S/)),o=r.length>0?r.reduce((a,n)=>Math.min(a,n.length-n.trimStart().length),Number.MAX_VALUE):0;return e.map(a=>a.slice(o).trimRight()).join(` +`)}function Bo(t,{format:e,paragraphs:r}){return t=t.replace(/\r\n?/g,` +`),t=Cqe(t),t=t.replace(/^\n+|\n+$/g,""),t=t.replace(/^(\s*)-([^\n]*?)\n+/gm,`$1-$2 + +`),t=t.replace(/\n(\n)?\n*/g,(o,a)=>a||" "),r&&(t=t.split(/\n/).map(o=>{let a=o.match(/^\s*[*-][\t ]+(.*)/);if(!a)return o.match(/(.{1,80})(?: |$)/g).join(` +`);let n=o.length-o.trimStart().length;return a[1].match(new RegExp(`(.{1,${78-n}})(?: |$)`,"g")).map((u,A)=>" ".repeat(n)+(A===0?"- ":" ")+u).join(` +`)}).join(` + +`)),t=t.replace(/(`+)((?:.|[\n])*?)\1/g,(o,a,n)=>e.code(a+n+a)),t=t.replace(/(\*\*)((?:.|[\n])*?)\1/g,(o,a,n)=>e.bold(a+n+a)),t?`${t} +`:""}var FT,gV,dV,RT=dt(()=>{FT=Array(80).fill("\u2501");for(let t=0;t<=24;++t)FT[FT.length-t]=`\x1B[38;5;${232+t}m\u2501`;gV={header:t=>`\x1B[1m\u2501\u2501\u2501 ${t}${t.length<80-5?` ${FT.slice(t.length+5).join("")}`:":"}\x1B[0m`,bold:t=>`\x1B[1m${t}\x1B[22m`,error:t=>`\x1B[31m\x1B[1m${t}\x1B[22m\x1B[39m`,code:t=>`\x1B[36m${t}\x1B[39m`},dV={header:t=>t,bold:t=>t,error:t=>t,code:t=>t}});function Go(t){return{...t,[JI]:!0}}function Ku(t,e){return typeof t>"u"?[t,e]:typeof t=="object"&&t!==null&&!Array.isArray(t)?[void 0,t]:[t,e]}function WD(t,e=!1){let r=t.replace(/^\.: /,"");return e&&(r=r[0].toLowerCase()+r.slice(1)),r}function zI(t,e){return e.length===1?new ot(`${t}: ${WD(e[0],!0)}`):new ot(`${t}: +${e.map(r=>` +- ${WD(r)}`).join("")}`)}function XI(t,e,r){if(typeof r>"u")return e;let o=[],a=[],n=A=>{let p=e;return e=A,n.bind(null,p)};if(!r(e,{errors:o,coercions:a,coercion:n}))throw zI(`Invalid value for ${t}`,o);for(let[,A]of a)A();return e}var JI,Ef=dt(()=>{GD();JI=Symbol("clipanion/isOption")});var Wo={};Yt(Wo,{KeyRelationship:()=>Zg,applyCascade:()=>ed,base64RegExp:()=>EV,colorStringAlphaRegExp:()=>CV,colorStringRegExp:()=>yV,computeKey:()=>Gp,getPrintable:()=>Ki,hasExactLength:()=>DV,hasForbiddenKeys:()=>Kqe,hasKeyRelationship:()=>UT,hasMaxLength:()=>Fqe,hasMinLength:()=>kqe,hasMutuallyExclusiveKeys:()=>Vqe,hasRequiredKeys:()=>Yqe,hasUniqueItems:()=>Rqe,isArray:()=>vqe,isAtLeast:()=>OT,isAtMost:()=>Lqe,isBase64:()=>Gqe,isBoolean:()=>wqe,isDate:()=>Bqe,isDict:()=>Sqe,isEnum:()=>Gs,isHexColor:()=>jqe,isISO8601:()=>qqe,isInExclusiveRange:()=>Mqe,isInInclusiveRange:()=>Oqe,isInstanceOf:()=>xqe,isInteger:()=>MT,isJSON:()=>Wqe,isLiteral:()=>Eqe,isLowerCase:()=>Uqe,isNegative:()=>Tqe,isNullable:()=>Qqe,isNumber:()=>NT,isObject:()=>Pqe,isOneOf:()=>LT,isOptional:()=>bqe,isPositive:()=>Nqe,isString:()=>ZI,isTuple:()=>Dqe,isUUID4:()=>Hqe,isUnknown:()=>vV,isUpperCase:()=>_qe,iso8601RegExp:()=>TT,makeCoercionFn:()=>$g,makeSetter:()=>BV,makeTrait:()=>wV,makeValidator:()=>Yr,matchesRegExp:()=>$I,plural:()=>YD,pushError:()=>xr,simpleKeyRegExp:()=>mV,uuid4RegExp:()=>IV});function Yr({test:t}){return wV(t)()}function Ki(t){return t===null?"null":t===void 0?"undefined":t===""?"an empty string":JSON.stringify(t)}function Gp(t,e){var r,o,a;return typeof e=="number"?`${(r=t==null?void 0:t.p)!==null&&r!==void 0?r:"."}[${e}]`:mV.test(e)?`${(o=t==null?void 0:t.p)!==null&&o!==void 0?o:""}.${e}`:`${(a=t==null?void 0:t.p)!==null&&a!==void 0?a:"."}[${JSON.stringify(e)}]`}function $g(t,e){return r=>{let o=t[e];return t[e]=r,$g(t,e).bind(null,o)}}function BV(t,e){return r=>{t[e]=r}}function YD(t,e,r){return t===1?e:r}function xr({errors:t,p:e}={},r){return t==null||t.push(`${e??"."}: ${r}`),!1}function Eqe(t){return Yr({test:(e,r)=>e!==t?xr(r,`Expected a literal (got ${Ki(t)})`):!0})}function Gs(t){let e=Array.isArray(t)?t:Object.values(t),r=new Set(e);return Yr({test:(o,a)=>r.has(o)?!0:xr(a,`Expected a valid enumeration value (got ${Ki(o)})`)})}var mV,yV,CV,EV,IV,TT,wV,vV,ZI,Iqe,wqe,NT,Bqe,vqe,Dqe,Sqe,Pqe,xqe,LT,ed,bqe,Qqe,kqe,Fqe,DV,Rqe,Tqe,Nqe,OT,Lqe,Oqe,Mqe,MT,$I,Uqe,_qe,Hqe,qqe,jqe,Gqe,Wqe,Yqe,Kqe,Vqe,Zg,Jqe,UT,tl=dt(()=>{mV=/^[a-zA-Z_][a-zA-Z0-9_]*$/,yV=/^#[0-9a-f]{6}$/i,CV=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,EV=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,IV=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,TT=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/,wV=t=>()=>t;vV=()=>Yr({test:(t,e)=>!0});ZI=()=>Yr({test:(t,e)=>typeof t!="string"?xr(e,`Expected a string (got ${Ki(t)})`):!0});Iqe=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]),wqe=()=>Yr({test:(t,e)=>{var r;if(typeof t!="boolean"){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return xr(e,"Unbound coercion result");let o=Iqe.get(t);if(typeof o<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,o)]),!0}return xr(e,`Expected a boolean (got ${Ki(t)})`)}return!0}}),NT=()=>Yr({test:(t,e)=>{var r;if(typeof t!="number"){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return xr(e,"Unbound coercion result");let o;if(typeof t=="string"){let a;try{a=JSON.parse(t)}catch{}if(typeof a=="number")if(JSON.stringify(a)===t)o=a;else return xr(e,`Received a number that can't be safely represented by the runtime (${t})`)}if(typeof o<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,o)]),!0}return xr(e,`Expected a number (got ${Ki(t)})`)}return!0}}),Bqe=()=>Yr({test:(t,e)=>{var r;if(!(t instanceof Date)){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return xr(e,"Unbound coercion result");let o;if(typeof t=="string"&&TT.test(t))o=new Date(t);else{let a;if(typeof t=="string"){let n;try{n=JSON.parse(t)}catch{}typeof n=="number"&&(a=n)}else typeof t=="number"&&(a=t);if(typeof a<"u")if(Number.isSafeInteger(a)||!Number.isSafeInteger(a*1e3))o=new Date(a*1e3);else return xr(e,`Received a timestamp that can't be safely represented by the runtime (${t})`)}if(typeof o<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,o)]),!0}return xr(e,`Expected a date (got ${Ki(t)})`)}return!0}}),vqe=(t,{delimiter:e}={})=>Yr({test:(r,o)=>{var a;if(typeof r=="string"&&typeof e<"u"&&typeof(o==null?void 0:o.coercions)<"u"){if(typeof(o==null?void 0:o.coercion)>"u")return xr(o,"Unbound coercion result");r=r.split(e),o.coercions.push([(a=o.p)!==null&&a!==void 0?a:".",o.coercion.bind(null,r)])}if(!Array.isArray(r))return xr(o,`Expected an array (got ${Ki(r)})`);let n=!0;for(let u=0,A=r.length;u{let r=DV(t.length);return Yr({test:(o,a)=>{var n;if(typeof o=="string"&&typeof e<"u"&&typeof(a==null?void 0:a.coercions)<"u"){if(typeof(a==null?void 0:a.coercion)>"u")return xr(a,"Unbound coercion result");o=o.split(e),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,o)])}if(!Array.isArray(o))return xr(a,`Expected a tuple (got ${Ki(o)})`);let u=r(o,Object.assign({},a));for(let A=0,p=o.length;AYr({test:(r,o)=>{if(typeof r!="object"||r===null)return xr(o,`Expected an object (got ${Ki(r)})`);let a=Object.keys(r),n=!0;for(let u=0,A=a.length;u{let r=Object.keys(t);return Yr({test:(o,a)=>{if(typeof o!="object"||o===null)return xr(a,`Expected an object (got ${Ki(o)})`);let n=new Set([...r,...Object.keys(o)]),u={},A=!0;for(let p of n){if(p==="constructor"||p==="__proto__")A=xr(Object.assign(Object.assign({},a),{p:Gp(a,p)}),"Unsafe property name");else{let h=Object.prototype.hasOwnProperty.call(t,p)?t[p]:void 0,E=Object.prototype.hasOwnProperty.call(o,p)?o[p]:void 0;typeof h<"u"?A=h(E,Object.assign(Object.assign({},a),{p:Gp(a,p),coercion:$g(o,p)}))&&A:e===null?A=xr(Object.assign(Object.assign({},a),{p:Gp(a,p)}),`Extraneous property (got ${Ki(E)})`):Object.defineProperty(u,p,{enumerable:!0,get:()=>E,set:BV(o,p)})}if(!A&&(a==null?void 0:a.errors)==null)break}return e!==null&&(A||(a==null?void 0:a.errors)!=null)&&(A=e(u,a)&&A),A}})},xqe=t=>Yr({test:(e,r)=>e instanceof t?!0:xr(r,`Expected an instance of ${t.name} (got ${Ki(e)})`)}),LT=(t,{exclusive:e=!1}={})=>Yr({test:(r,o)=>{var a,n,u;let A=[],p=typeof(o==null?void 0:o.errors)<"u"?[]:void 0;for(let h=0,E=t.length;h1?xr(o,`Expected to match exactly a single predicate (matched ${A.join(", ")})`):(u=o==null?void 0:o.errors)===null||u===void 0||u.push(...p),!1}}),ed=(t,e)=>Yr({test:(r,o)=>{var a,n;let u={value:r},A=typeof(o==null?void 0:o.coercions)<"u"?$g(u,"value"):void 0,p=typeof(o==null?void 0:o.coercions)<"u"?[]:void 0;if(!t(r,Object.assign(Object.assign({},o),{coercion:A,coercions:p})))return!1;let h=[];if(typeof p<"u")for(let[,E]of p)h.push(E());try{if(typeof(o==null?void 0:o.coercions)<"u"){if(u.value!==r){if(typeof(o==null?void 0:o.coercion)>"u")return xr(o,"Unbound coercion result");o.coercions.push([(a=o.p)!==null&&a!==void 0?a:".",o.coercion.bind(null,u.value)])}(n=o==null?void 0:o.coercions)===null||n===void 0||n.push(...p)}return e.every(E=>E(u.value,o))}finally{for(let E of h)E()}}}),bqe=t=>Yr({test:(e,r)=>typeof e>"u"?!0:t(e,r)}),Qqe=t=>Yr({test:(e,r)=>e===null?!0:t(e,r)}),kqe=t=>Yr({test:(e,r)=>e.length>=t?!0:xr(r,`Expected to have a length of at least ${t} elements (got ${e.length})`)}),Fqe=t=>Yr({test:(e,r)=>e.length<=t?!0:xr(r,`Expected to have a length of at most ${t} elements (got ${e.length})`)}),DV=t=>Yr({test:(e,r)=>e.length!==t?xr(r,`Expected to have a length of exactly ${t} elements (got ${e.length})`):!0}),Rqe=({map:t}={})=>Yr({test:(e,r)=>{let o=new Set,a=new Set;for(let n=0,u=e.length;nYr({test:(t,e)=>t<=0?!0:xr(e,`Expected to be negative (got ${t})`)}),Nqe=()=>Yr({test:(t,e)=>t>=0?!0:xr(e,`Expected to be positive (got ${t})`)}),OT=t=>Yr({test:(e,r)=>e>=t?!0:xr(r,`Expected to be at least ${t} (got ${e})`)}),Lqe=t=>Yr({test:(e,r)=>e<=t?!0:xr(r,`Expected to be at most ${t} (got ${e})`)}),Oqe=(t,e)=>Yr({test:(r,o)=>r>=t&&r<=e?!0:xr(o,`Expected to be in the [${t}; ${e}] range (got ${r})`)}),Mqe=(t,e)=>Yr({test:(r,o)=>r>=t&&rYr({test:(e,r)=>e!==Math.round(e)?xr(r,`Expected to be an integer (got ${e})`):Number.isSafeInteger(e)?!0:xr(r,`Expected to be a safe integer (got ${e})`)}),$I=t=>Yr({test:(e,r)=>t.test(e)?!0:xr(r,`Expected to match the pattern ${t.toString()} (got ${Ki(e)})`)}),Uqe=()=>Yr({test:(t,e)=>t!==t.toLowerCase()?xr(e,`Expected to be all-lowercase (got ${t})`):!0}),_qe=()=>Yr({test:(t,e)=>t!==t.toUpperCase()?xr(e,`Expected to be all-uppercase (got ${t})`):!0}),Hqe=()=>Yr({test:(t,e)=>IV.test(t)?!0:xr(e,`Expected to be a valid UUID v4 (got ${Ki(t)})`)}),qqe=()=>Yr({test:(t,e)=>TT.test(t)?!1:xr(e,`Expected to be a valid ISO 8601 date string (got ${Ki(t)})`)}),jqe=({alpha:t=!1})=>Yr({test:(e,r)=>(t?yV.test(e):CV.test(e))?!0:xr(r,`Expected to be a valid hexadecimal color string (got ${Ki(e)})`)}),Gqe=()=>Yr({test:(t,e)=>EV.test(t)?!0:xr(e,`Expected to be a valid base 64 string (got ${Ki(t)})`)}),Wqe=(t=vV())=>Yr({test:(e,r)=>{let o;try{o=JSON.parse(e)}catch{return xr(r,`Expected to be a valid JSON string (got ${Ki(e)})`)}return t(o,r)}}),Yqe=t=>{let e=new Set(t);return Yr({test:(r,o)=>{let a=new Set(Object.keys(r)),n=[];for(let u of e)a.has(u)||n.push(u);return n.length>0?xr(o,`Missing required ${YD(n.length,"property","properties")} ${n.map(u=>`"${u}"`).join(", ")}`):!0}})},Kqe=t=>{let e=new Set(t);return Yr({test:(r,o)=>{let a=new Set(Object.keys(r)),n=[];for(let u of e)a.has(u)&&n.push(u);return n.length>0?xr(o,`Forbidden ${YD(n.length,"property","properties")} ${n.map(u=>`"${u}"`).join(", ")}`):!0}})},Vqe=t=>{let e=new Set(t);return Yr({test:(r,o)=>{let a=new Set(Object.keys(r)),n=[];for(let u of e)a.has(u)&&n.push(u);return n.length>1?xr(o,`Mutually exclusive properties ${n.map(u=>`"${u}"`).join(", ")}`):!0}})};(function(t){t.Forbids="Forbids",t.Requires="Requires"})(Zg||(Zg={}));Jqe={[Zg.Forbids]:{expect:!1,message:"forbids using"},[Zg.Requires]:{expect:!0,message:"requires using"}},UT=(t,e,r,{ignore:o=[]}={})=>{let a=new Set(o),n=new Set(r),u=Jqe[e];return Yr({test:(A,p)=>{let h=new Set(Object.keys(A));if(!h.has(t)||a.has(A[t]))return!0;let E=[];for(let w of n)(h.has(w)&&!a.has(A[w]))!==u.expect&&E.push(w);return E.length>=1?xr(p,`Property "${t}" ${u.message} ${YD(E.length,"property","properties")} ${E.map(w=>`"${w}"`).join(", ")}`):!0}})}});var it,td=dt(()=>{Ef();it=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let r=this.constructor.schema;if(Array.isArray(r)){let{isDict:a,isUnknown:n,applyCascade:u}=await Promise.resolve().then(()=>(tl(),Wo)),A=u(a(n()),r),p=[],h=[];if(!A(this,{errors:p,coercions:h}))throw zI("Invalid option schema",p);for(let[,w]of h)w()}else if(r!=null)throw new Error("Invalid command schema");let o=await this.execute();return typeof o<"u"?o:0}};it.isOption=JI;it.Default=[]});function Ba(t){bT&&console.log(t)}function PV(){return{nodes:[Yo(),Yo(),Yo()]}}function zqe(t){let e=PV(),r=[],o=e.nodes.length;for(let a of t){r.push(o);for(let n=0;n{if(e.has(o))return;e.add(o);let a=t.nodes[o];for(let u of Object.values(a.statics))for(let{to:A}of u)r(A);for(let[,{to:u}]of a.dynamics)r(u);for(let{to:u}of a.shortcuts)r(u);let n=new Set(a.shortcuts.map(({to:u})=>u));for(;a.shortcuts.length>0;){let{to:u}=a.shortcuts.shift(),A=t.nodes[u];for(let[p,h]of Object.entries(A.statics)){let E=Object.prototype.hasOwnProperty.call(a.statics,p)?a.statics[p]:a.statics[p]=[];for(let w of h)E.some(({to:v})=>w.to===v)||E.push(w)}for(let[p,h]of A.dynamics)a.dynamics.some(([E,{to:w}])=>p===E&&h.to===w)||a.dynamics.push([p,h]);for(let p of A.shortcuts)n.has(p.to)||(a.shortcuts.push(p),n.add(p.to))}};r(0)}function Zqe(t,{prefix:e=""}={}){if(bT){Ba(`${e}Nodes are:`);for(let r=0;rp!==2).map(({state:p})=>({usage:p.candidateUsage,reason:null})));if(A.every(({node:p})=>p===2))throw new Iy(e,A.map(({state:p})=>({usage:p.candidateUsage,reason:p.errorMessage})));o=rje(A)}if(o.length>0){Ba(" Results:");for(let n of o)Ba(` - ${n.node} -> ${JSON.stringify(n.state)}`)}else Ba(" No results");return o}function $qe(t,e){if(e.selectedIndex!==null)return!0;if(Object.prototype.hasOwnProperty.call(t.statics,js)){for(let{to:r}of t.statics[js])if(r===1)return!0}return!1}function eje(t,e,r){let o=r&&e.length>0?[""]:[],a=xV(t,e,r),n=[],u=new Set,A=(p,h,E=!0)=>{let w=[h];for(;w.length>0;){let b=w;w=[];for(let C of b){let R=t.nodes[C],L=Object.keys(R.statics);for(let _ of Object.keys(R.statics)){let V=L[0];for(let{to:re,reducer:oe}of R.statics[V])oe==="pushPath"&&(E||p.push(V),w.push(re))}}E=!1}let v=JSON.stringify(p);u.has(v)||(n.push(p),u.add(v))};for(let{node:p,state:h}of a){if(h.remainder!==null){A([h.remainder],p);continue}let E=t.nodes[p],w=$qe(E,h);for(let[v,b]of Object.entries(E.statics))(w&&v!==js||!v.startsWith("-")&&b.some(({reducer:C})=>C==="pushPath"))&&A([...o,v],p);if(!!w)for(let[v,{to:b}]of E.dynamics){if(b===2)continue;let C=oje(v,h);if(C!==null)for(let R of C)A([...o,R],p)}}return[...n].sort()}function tje(t,e){let r=xV(t,[...e,js]);return nje(e,r.map(({state:o})=>o))}function rje(t){let e=0;for(let{state:r}of t)r.path.length>e&&(e=r.path.length);return t.filter(({state:r})=>r.path.length===e)}function nje(t,e){let r=e.filter(w=>w.selectedIndex!==null);if(r.length===0)throw new Error;let o=r.filter(w=>w.requiredOptions.every(v=>v.some(b=>w.options.find(C=>C.name===b))));if(o.length===0)throw new Iy(t,r.map(w=>({usage:w.candidateUsage,reason:null})));let a=0;for(let w of o)w.path.length>a&&(a=w.path.length);let n=o.filter(w=>w.path.length===a),u=w=>w.positionals.filter(({extra:v})=>!v).length+w.options.length,A=n.map(w=>({state:w,positionalCount:u(w)})),p=0;for(let{positionalCount:w}of A)w>p&&(p=w);let h=A.filter(({positionalCount:w})=>w===p).map(({state:w})=>w),E=ije(h);if(E.length>1)throw new jD(t,E.map(w=>w.candidateUsage));return E[0]}function ije(t){let e=[],r=[];for(let o of t)o.selectedIndex===-1?r.push(o):e.push(o);return r.length>0&&e.push({...SV,path:bV(...r.map(o=>o.path)),options:r.reduce((o,a)=>o.concat(a.options),[])}),e}function bV(t,e,...r){return e===void 0?Array.from(t):bV(t.filter((o,a)=>o===e[a]),...r)}function Yo(){return{dynamics:[],shortcuts:[],statics:{}}}function QV(t){return t===1||t===2}function _T(t,e=0){return{to:QV(t.to)?t.to:t.to>2?t.to+e-2:t.to+e,reducer:t.reducer}}function sje(t,e=0){let r=Yo();for(let[o,a]of t.dynamics)r.dynamics.push([o,_T(a,e)]);for(let o of t.shortcuts)r.shortcuts.push(_T(o,e));for(let[o,a]of Object.entries(t.statics))r.statics[o]=a.map(n=>_T(n,e));return r}function Ws(t,e,r,o,a){t.nodes[e].dynamics.push([r,{to:o,reducer:a}])}function wy(t,e,r,o){t.nodes[e].shortcuts.push({to:r,reducer:o})}function If(t,e,r,o,a){(Object.prototype.hasOwnProperty.call(t.nodes[e].statics,r)?t.nodes[e].statics[r]:t.nodes[e].statics[r]=[]).push({to:o,reducer:a})}function KD(t,e,r,o){if(Array.isArray(e)){let[a,...n]=e;return t[a](r,o,...n)}else return t[e](r,o)}function oje(t,e){let r=Array.isArray(t)?JD[t[0]]:JD[t];if(typeof r.suggest>"u")return null;let o=Array.isArray(t)?t.slice(1):[];return r.suggest(e,...o)}var SV,JD,HT,rl,qT,vy,XD=dt(()=>{QT();GD();SV={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:-1};JD={always:()=>!0,isOptionLike:(t,e)=>!t.ignoreOptions&&e!=="-"&&e.startsWith("-"),isNotOptionLike:(t,e)=>t.ignoreOptions||e==="-"||!e.startsWith("-"),isOption:(t,e,r,o)=>!t.ignoreOptions&&e===r,isBatchOption:(t,e,r)=>!t.ignoreOptions&&hV.test(e)&&[...e.slice(1)].every(o=>r.includes(`-${o}`)),isBoundOption:(t,e,r,o)=>{let a=e.match(xT);return!t.ignoreOptions&&!!a&&qD.test(a[1])&&r.includes(a[1])&&o.filter(n=>n.names.includes(a[1])).every(n=>n.allowBinding)},isNegatedOption:(t,e,r)=>!t.ignoreOptions&&e===`--no-${r.slice(2)}`,isHelp:(t,e)=>!t.ignoreOptions&&PT.test(e),isUnsupportedOption:(t,e,r)=>!t.ignoreOptions&&e.startsWith("-")&&qD.test(e)&&!r.includes(e),isInvalidOption:(t,e)=>!t.ignoreOptions&&e.startsWith("-")&&!qD.test(e)};JD.isOption.suggest=(t,e,r=!0)=>r?null:[e];HT={setCandidateState:(t,e,r)=>({...t,...r}),setSelectedIndex:(t,e,r)=>({...t,selectedIndex:r}),pushBatch:(t,e)=>({...t,options:t.options.concat([...e.slice(1)].map(r=>({name:`-${r}`,value:!0})))}),pushBound:(t,e)=>{let[,r,o]=e.match(xT);return{...t,options:t.options.concat({name:r,value:o})}},pushPath:(t,e)=>({...t,path:t.path.concat(e)}),pushPositional:(t,e)=>({...t,positionals:t.positionals.concat({value:e,extra:!1})}),pushExtra:(t,e)=>({...t,positionals:t.positionals.concat({value:e,extra:!0})}),pushExtraNoLimits:(t,e)=>({...t,positionals:t.positionals.concat({value:e,extra:rl})}),pushTrue:(t,e,r=e)=>({...t,options:t.options.concat({name:e,value:!0})}),pushFalse:(t,e,r=e)=>({...t,options:t.options.concat({name:r,value:!1})}),pushUndefined:(t,e)=>({...t,options:t.options.concat({name:e,value:void 0})}),pushStringValue:(t,e)=>{var r;let o={...t,options:[...t.options]},a=t.options[t.options.length-1];return a.value=((r=a.value)!==null&&r!==void 0?r:[]).concat([e]),o},setStringValue:(t,e)=>{let r={...t,options:[...t.options]},o=t.options[t.options.length-1];return o.value=e,r},inhibateOptions:t=>({...t,ignoreOptions:!0}),useHelp:(t,e,r)=>{let[,,o]=e.match(PT);return typeof o<"u"?{...t,options:[{name:"-c",value:String(r)},{name:"-i",value:o}]}:{...t,options:[{name:"-c",value:String(r)}]}},setError:(t,e,r)=>e===js?{...t,errorMessage:`${r}.`}:{...t,errorMessage:`${r} ("${e}").`},setOptionArityError:(t,e)=>{let r=t.options[t.options.length-1];return{...t,errorMessage:`Not enough arguments to option ${r.name}.`}}},rl=Symbol(),qT=class{constructor(e,r){this.allOptionNames=[],this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=r}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:r=this.arity.trailing,extra:o=this.arity.extra,proxy:a=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:r,extra:o,proxy:a})}addPositional({name:e="arg",required:r=!0}={}){if(!r&&this.arity.extra===rl)throw new Error("Optional parameters cannot be declared when using .rest() or .proxy()");if(!r&&this.arity.trailing.length>0)throw new Error("Optional parameters cannot be declared after the required trailing positional arguments");!r&&this.arity.extra!==rl?this.arity.extra.push(e):this.arity.extra!==rl&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e="arg",required:r=0}={}){if(this.arity.extra===rl)throw new Error("Infinite lists cannot be declared multiple times in the same command");if(this.arity.trailing.length>0)throw new Error("Infinite lists cannot be declared after the required trailing positional arguments");for(let o=0;o1)throw new Error("The arity cannot be higher than 1 when the option only supports the --arg=value syntax");if(!Number.isInteger(o))throw new Error(`The arity must be an integer, got ${o}`);if(o<0)throw new Error(`The arity must be positive, got ${o}`);this.allOptionNames.push(...e),this.options.push({names:e,description:r,arity:o,hidden:a,required:n,allowBinding:u})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:r=!0}={}){let o=[this.cliOpts.binaryName],a=[];if(this.paths.length>0&&o.push(...this.paths[0]),e){for(let{names:u,arity:A,hidden:p,description:h,required:E}of this.options){if(p)continue;let w=[];for(let b=0;b`:`[${v}]`)}o.push(...this.arity.leading.map(u=>`<${u}>`)),this.arity.extra===rl?o.push("..."):o.push(...this.arity.extra.map(u=>`[${u}]`)),o.push(...this.arity.trailing.map(u=>`<${u}>`))}return{usage:o.join(" "),options:a}}compile(){if(typeof this.context>"u")throw new Error("Assertion failed: No context attached");let e=PV(),r=0,o=this.usage().usage,a=this.options.filter(A=>A.required).map(A=>A.names);r=Hc(e,Yo()),If(e,0,ST,r,["setCandidateState",{candidateUsage:o,requiredOptions:a}]);let n=this.arity.proxy?"always":"isNotOptionLike",u=this.paths.length>0?this.paths:[[]];for(let A of u){let p=r;if(A.length>0){let v=Hc(e,Yo());wy(e,p,v),this.registerOptions(e,v),p=v}for(let v=0;v0||!this.arity.proxy){let v=Hc(e,Yo());Ws(e,p,"isHelp",v,["useHelp",this.cliIndex]),If(e,v,js,1,["setSelectedIndex",-1]),this.registerOptions(e,p)}this.arity.leading.length>0&&If(e,p,js,2,["setError","Not enough positional arguments"]);let h=p;for(let v=0;v0||v+1!==this.arity.leading.length)&&If(e,b,js,2,["setError","Not enough positional arguments"]),Ws(e,h,"isNotOptionLike",b,"pushPositional"),h=b}let E=h;if(this.arity.extra===rl||this.arity.extra.length>0){let v=Hc(e,Yo());if(wy(e,h,v),this.arity.extra===rl){let b=Hc(e,Yo());this.arity.proxy||this.registerOptions(e,b),Ws(e,h,n,b,"pushExtraNoLimits"),Ws(e,b,n,b,"pushExtraNoLimits"),wy(e,b,v)}else for(let b=0;b0)&&this.registerOptions(e,C),Ws(e,E,n,C,"pushExtra"),wy(e,C,v),E=C}E=v}this.arity.trailing.length>0&&If(e,E,js,2,["setError","Not enough positional arguments"]);let w=E;for(let v=0;vu.length>n.length?u:n,"");if(o.arity===0)for(let n of o.names)Ws(e,r,["isOption",n,o.hidden||n!==a],r,"pushTrue"),n.startsWith("--")&&!n.startsWith("--no-")&&Ws(e,r,["isNegatedOption",n],r,["pushFalse",n]);else{let n=Hc(e,Yo());for(let u of o.names)Ws(e,r,["isOption",u,o.hidden||u!==a],n,"pushUndefined");for(let u=0;u=0&&etje(o,a),suggest:(a,n)=>eje(o,a,n)}}}});function FV(){return ZD.default&&"getColorDepth"in ZD.default.WriteStream.prototype?ZD.default.WriteStream.prototype.getColorDepth():process.env.FORCE_COLOR==="0"?1:process.env.FORCE_COLOR==="1"||typeof process.stdout<"u"&&process.stdout.isTTY?8:1}function RV(t){let e=kV;if(typeof e>"u"){if(t.stdout===process.stdout&&t.stderr===process.stderr)return null;let{AsyncLocalStorage:r}=Ie("async_hooks");e=kV=new r;let o=process.stdout._write;process.stdout._write=function(n,u,A){let p=e.getStore();return typeof p>"u"?o.call(this,n,u,A):p.stdout.write(n,u,A)};let a=process.stderr._write;process.stderr._write=function(n,u,A){let p=e.getStore();return typeof p>"u"?a.call(this,n,u,A):p.stderr.write(n,u,A)}}return r=>e.run(t,r)}var ZD,kV,TV=dt(()=>{ZD=tt(Ie("tty"),1)});var Dy,NV=dt(()=>{td();Dy=class extends it{constructor(e){super(),this.contexts=e,this.commands=[]}static from(e,r){let o=new Dy(r);o.path=e.path;for(let a of e.options)switch(a.name){case"-c":o.commands.push(Number(a.value));break;case"-i":o.index=Number(a.value);break}return o}async execute(){let e=this.commands;if(typeof this.index<"u"&&this.index>=0&&this.index1){this.context.stdout.write(`Multiple commands match your selection: +`),this.context.stdout.write(` +`);let r=0;for(let o of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[o].commandClass,{prefix:`${r++}. `.padStart(5)}));this.context.stdout.write(` +`),this.context.stdout.write(`Run again with -h= to see the longer details of any of those commands. +`)}}}});async function MV(...t){let{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:o,resolvedContext:a}=_V(t);return vo.from(r,e).runExit(o,a)}async function UV(...t){let{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:o,resolvedContext:a}=_V(t);return vo.from(r,e).run(o,a)}function _V(t){let e,r,o,a;switch(typeof process<"u"&&typeof process.argv<"u"&&(o=process.argv.slice(2)),t.length){case 1:r=t[0];break;case 2:t[0]&&t[0].prototype instanceof it||Array.isArray(t[0])?(r=t[0],Array.isArray(t[1])?o=t[1]:a=t[1]):(e=t[0],r=t[1]);break;case 3:Array.isArray(t[2])?(e=t[0],r=t[1],o=t[2]):t[0]&&t[0].prototype instanceof it||Array.isArray(t[0])?(r=t[0],o=t[1],a=t[2]):(e=t[0],r=t[1],a=t[2]);break;default:e=t[0],r=t[1],o=t[2],a=t[3];break}if(typeof o>"u")throw new Error("The argv parameter must be provided when running Clipanion outside of a Node context");return{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:o,resolvedContext:a}}function OV(t){return t()}var LV,vo,HV=dt(()=>{XD();RT();TV();td();NV();LV=Symbol("clipanion/errorCommand");vo=class{constructor({binaryLabel:e,binaryName:r="...",binaryVersion:o,enableCapture:a=!1,enableColors:n}={}){this.registrations=new Map,this.builder=new vy({binaryName:r}),this.binaryLabel=e,this.binaryName=r,this.binaryVersion=o,this.enableCapture=a,this.enableColors=n}static from(e,r={}){let o=new vo(r),a=Array.isArray(e)?e:[e];for(let n of a)o.register(n);return o}register(e){var r;let o=new Map,a=new e;for(let p in a){let h=a[p];typeof h=="object"&&h!==null&&h[it.isOption]&&o.set(p,h)}let n=this.builder.command(),u=n.cliIndex,A=(r=e.paths)!==null&&r!==void 0?r:a.paths;if(typeof A<"u")for(let p of A)n.addPath(p);this.registrations.set(e,{specs:o,builder:n,index:u});for(let[p,{definition:h}]of o.entries())h(n,p);n.setContext({commandClass:e})}process(e,r){let{contexts:o,process:a}=this.builder.compile(),n=a(e),u={...vo.defaultContext,...r};switch(n.selectedIndex){case-1:{let A=Dy.from(n,o);return A.context=u,A}default:{let{commandClass:A}=o[n.selectedIndex],p=this.registrations.get(A);if(typeof p>"u")throw new Error("Assertion failed: Expected the command class to have been registered.");let h=new A;h.context=u,h.path=n.path;try{for(let[E,{transformer:w}]of p.specs.entries())h[E]=w(p.builder,E,n,u);return h}catch(E){throw E[LV]=h,E}}break}}async run(e,r){var o,a;let n,u={...vo.defaultContext,...r},A=(o=this.enableColors)!==null&&o!==void 0?o:u.colorDepth>1;if(!Array.isArray(e))n=e;else try{n=this.process(e,u)}catch(E){return u.stdout.write(this.error(E,{colored:A})),1}if(n.help)return u.stdout.write(this.usage(n,{colored:A,detailed:!0})),0;n.context=u,n.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableCapture:this.enableCapture,enableColors:this.enableColors,definitions:()=>this.definitions(),error:(E,w)=>this.error(E,w),format:E=>this.format(E),process:(E,w)=>this.process(E,{...u,...w}),run:(E,w)=>this.run(E,{...u,...w}),usage:(E,w)=>this.usage(E,w)};let p=this.enableCapture&&(a=RV(u))!==null&&a!==void 0?a:OV,h;try{h=await p(()=>n.validateAndExecute().catch(E=>n.catch(E).then(()=>0)))}catch(E){return u.stdout.write(this.error(E,{colored:A,command:n})),1}return h}async runExit(e,r){process.exitCode=await this.run(e,r)}suggest(e,r){let{suggest:o}=this.builder.compile();return o(e,r)}definitions({colored:e=!1}={}){let r=[];for(let[o,{index:a}]of this.registrations){if(typeof o.usage>"u")continue;let{usage:n}=this.getUsageByIndex(a,{detailed:!1}),{usage:u,options:A}=this.getUsageByIndex(a,{detailed:!0,inlineOptions:!1}),p=typeof o.usage.category<"u"?Bo(o.usage.category,{format:this.format(e),paragraphs:!1}):void 0,h=typeof o.usage.description<"u"?Bo(o.usage.description,{format:this.format(e),paragraphs:!1}):void 0,E=typeof o.usage.details<"u"?Bo(o.usage.details,{format:this.format(e),paragraphs:!0}):void 0,w=typeof o.usage.examples<"u"?o.usage.examples.map(([v,b])=>[Bo(v,{format:this.format(e),paragraphs:!1}),b.replace(/\$0/g,this.binaryName)]):void 0;r.push({path:n,usage:u,category:p,description:h,details:E,examples:w,options:A})}return r}usage(e=null,{colored:r,detailed:o=!1,prefix:a="$ "}={}){var n;if(e===null){for(let p of this.registrations.keys()){let h=p.paths,E=typeof p.usage<"u";if(!h||h.length===0||h.length===1&&h[0].length===0||((n=h==null?void 0:h.some(b=>b.length===0))!==null&&n!==void 0?n:!1))if(e){e=null;break}else e=p;else if(E){e=null;continue}}e&&(o=!0)}let u=e!==null&&e instanceof it?e.constructor:e,A="";if(u)if(o){let{description:p="",details:h="",examples:E=[]}=u.usage||{};p!==""&&(A+=Bo(p,{format:this.format(r),paragraphs:!1}).replace(/^./,b=>b.toUpperCase()),A+=` +`),(h!==""||E.length>0)&&(A+=`${this.format(r).header("Usage")} +`,A+=` +`);let{usage:w,options:v}=this.getUsageByRegistration(u,{inlineOptions:!1});if(A+=`${this.format(r).bold(a)}${w} +`,v.length>0){A+=` +`,A+=`${this.format(r).header("Options")} +`;let b=v.reduce((C,R)=>Math.max(C,R.definition.length),0);A+=` +`;for(let{definition:C,description:R}of v)A+=` ${this.format(r).bold(C.padEnd(b))} ${Bo(R,{format:this.format(r),paragraphs:!1})}`}if(h!==""&&(A+=` +`,A+=`${this.format(r).header("Details")} +`,A+=` +`,A+=Bo(h,{format:this.format(r),paragraphs:!0})),E.length>0){A+=` +`,A+=`${this.format(r).header("Examples")} +`;for(let[b,C]of E)A+=` +`,A+=Bo(b,{format:this.format(r),paragraphs:!1}),A+=`${C.replace(/^/m,` ${this.format(r).bold(a)}`).replace(/\$0/g,this.binaryName)} +`}}else{let{usage:p}=this.getUsageByRegistration(u);A+=`${this.format(r).bold(a)}${p} +`}else{let p=new Map;for(let[v,{index:b}]of this.registrations.entries()){if(typeof v.usage>"u")continue;let C=typeof v.usage.category<"u"?Bo(v.usage.category,{format:this.format(r),paragraphs:!1}):null,R=p.get(C);typeof R>"u"&&p.set(C,R=[]);let{usage:L}=this.getUsageByIndex(b);R.push({commandClass:v,usage:L})}let h=Array.from(p.keys()).sort((v,b)=>v===null?-1:b===null?1:v.localeCompare(b,"en",{usage:"sort",caseFirst:"upper"})),E=typeof this.binaryLabel<"u",w=typeof this.binaryVersion<"u";E||w?(E&&w?A+=`${this.format(r).header(`${this.binaryLabel} - ${this.binaryVersion}`)} + +`:E?A+=`${this.format(r).header(`${this.binaryLabel}`)} +`:A+=`${this.format(r).header(`${this.binaryVersion}`)} +`,A+=` ${this.format(r).bold(a)}${this.binaryName} +`):A+=`${this.format(r).bold(a)}${this.binaryName} +`;for(let v of h){let b=p.get(v).slice().sort((R,L)=>R.usage.localeCompare(L.usage,"en",{usage:"sort",caseFirst:"upper"})),C=v!==null?v.trim():"General commands";A+=` +`,A+=`${this.format(r).header(`${C}`)} +`;for(let{commandClass:R,usage:L}of b){let _=R.usage.description||"undocumented";A+=` +`,A+=` ${this.format(r).bold(L)} +`,A+=` ${Bo(_,{format:this.format(r),paragraphs:!1})}`}}A+=` +`,A+=Bo("You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.",{format:this.format(r),paragraphs:!0})}return A}error(e,r){var o,{colored:a,command:n=(o=e[LV])!==null&&o!==void 0?o:null}=r===void 0?{}:r;e instanceof Error||(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let u="",A=e.name.replace(/([a-z])([A-Z])/g,"$1 $2");A==="Error"&&(A="Internal Error"),u+=`${this.format(a).error(A)}: ${e.message} +`;let p=e.clipanion;return typeof p<"u"?p.type==="usage"&&(u+=` +`,u+=this.usage(n)):e.stack&&(u+=`${e.stack.replace(/^.*\n/,"")} +`),u}format(e){var r;return((r=e??this.enableColors)!==null&&r!==void 0?r:vo.defaultContext.colorDepth>1)?gV:dV}getUsageByRegistration(e,r){let o=this.registrations.get(e);if(typeof o>"u")throw new Error("Assertion failed: Unregistered command");return this.getUsageByIndex(o.index,r)}getUsageByIndex(e,r){return this.builder.getBuilderByIndex(e).usage(r)}};vo.defaultContext={env:process.env,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,colorDepth:FV()}});var ew,qV=dt(()=>{td();ew=class extends it{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)} +`)}};ew.paths=[["--clipanion=definitions"]]});var tw,jV=dt(()=>{td();tw=class extends it{async execute(){this.context.stdout.write(this.cli.usage())}};tw.paths=[["-h"],["--help"]]});var rw,GV=dt(()=>{td();rw=class extends it{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:""} +`)}};rw.paths=[["-v"],["--version"]]});var jT={};Yt(jT,{DefinitionsCommand:()=>ew,HelpCommand:()=>tw,VersionCommand:()=>rw});var WV=dt(()=>{qV();jV();GV()});function YV(t,e,r){let[o,a]=Ku(e,r??{}),{arity:n=1}=a,u=t.split(","),A=new Set(u);return Go({definition(p){p.addOption({names:u,arity:n,hidden:a==null?void 0:a.hidden,description:a==null?void 0:a.description,required:a.required})},transformer(p,h,E){let w=typeof o<"u"?[...o]:void 0;for(let{name:v,value:b}of E.options)!A.has(v)||(w=w??[],w.push(b));return w}})}var KV=dt(()=>{Ef()});function VV(t,e,r){let[o,a]=Ku(e,r??{}),n=t.split(","),u=new Set(n);return Go({definition(A){A.addOption({names:n,allowBinding:!1,arity:0,hidden:a.hidden,description:a.description,required:a.required})},transformer(A,p,h){let E=o;for(let{name:w,value:v}of h.options)!u.has(w)||(E=v);return E}})}var JV=dt(()=>{Ef()});function zV(t,e,r){let[o,a]=Ku(e,r??{}),n=t.split(","),u=new Set(n);return Go({definition(A){A.addOption({names:n,allowBinding:!1,arity:0,hidden:a.hidden,description:a.description,required:a.required})},transformer(A,p,h){let E=o;for(let{name:w,value:v}of h.options)!u.has(w)||(E??(E=0),v?E+=1:E=0);return E}})}var XV=dt(()=>{Ef()});function ZV(t={}){return Go({definition(e,r){var o;e.addProxy({name:(o=t.name)!==null&&o!==void 0?o:r,required:t.required})},transformer(e,r,o){return o.positionals.map(({value:a})=>a)}})}var $V=dt(()=>{Ef()});function eJ(t={}){return Go({definition(e,r){var o;e.addRest({name:(o=t.name)!==null&&o!==void 0?o:r,required:t.required})},transformer(e,r,o){let a=u=>{let A=o.positionals[u];return A.extra===rl||A.extra===!1&&uu)}})}var tJ=dt(()=>{XD();Ef()});function aje(t,e,r){let[o,a]=Ku(e,r??{}),{arity:n=1}=a,u=t.split(","),A=new Set(u);return Go({definition(p){p.addOption({names:u,arity:a.tolerateBoolean?0:n,hidden:a.hidden,description:a.description,required:a.required})},transformer(p,h,E,w){let v,b=o;typeof a.env<"u"&&w.env[a.env]&&(v=a.env,b=w.env[a.env]);for(let{name:C,value:R}of E.options)!A.has(C)||(v=C,b=R);return typeof b=="string"?XI(v??h,b,a.validator):b}})}function lje(t={}){let{required:e=!0}=t;return Go({definition(r,o){var a;r.addPositional({name:(a=t.name)!==null&&a!==void 0?a:o,required:t.required})},transformer(r,o,a){var n;for(let u=0;u{XD();Ef()});var fe={};Yt(fe,{Array:()=>YV,Boolean:()=>VV,Counter:()=>zV,Proxy:()=>ZV,Rest:()=>eJ,String:()=>rJ,applyValidator:()=>XI,cleanValidationError:()=>WD,formatError:()=>zI,isOptionSymbol:()=>JI,makeCommandOption:()=>Go,rerouteArguments:()=>Ku});var iJ=dt(()=>{Ef();KV();JV();XV();$V();tJ();nJ()});var nw={};Yt(nw,{Builtins:()=>jT,Cli:()=>vo,Command:()=>it,Option:()=>fe,UsageError:()=>ot,formatMarkdownish:()=>Bo,run:()=>UV,runExit:()=>MV});var _t=dt(()=>{GD();RT();td();HV();WV();iJ()});var oJ=U((AQt,sJ)=>{"use strict";sJ.exports=(t,...e)=>new Promise(r=>{r(t(...e))})});var rd=U((fQt,GT)=>{"use strict";var cje=oJ(),aJ=t=>{if(t<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],r=0,o=()=>{r--,e.length>0&&e.shift()()},a=(A,p,...h)=>{r++;let E=cje(A,...h);p(E),E.then(o,o)},n=(A,p,...h)=>{rnew Promise(h=>n(A,h,...p));return Object.defineProperties(u,{activeCount:{get:()=>r},pendingCount:{get:()=>e.length}}),u};GT.exports=aJ;GT.exports.default=aJ});function Vu(t){return`YN${t.toString(10).padStart(4,"0")}`}function $D(t){let e=Number(t.slice(2));if(typeof dr[e]>"u")throw new Error(`Unknown message name: "${t}"`);return e}var dr,eS=dt(()=>{dr=(Ue=>(Ue[Ue.UNNAMED=0]="UNNAMED",Ue[Ue.EXCEPTION=1]="EXCEPTION",Ue[Ue.MISSING_PEER_DEPENDENCY=2]="MISSING_PEER_DEPENDENCY",Ue[Ue.CYCLIC_DEPENDENCIES=3]="CYCLIC_DEPENDENCIES",Ue[Ue.DISABLED_BUILD_SCRIPTS=4]="DISABLED_BUILD_SCRIPTS",Ue[Ue.BUILD_DISABLED=5]="BUILD_DISABLED",Ue[Ue.SOFT_LINK_BUILD=6]="SOFT_LINK_BUILD",Ue[Ue.MUST_BUILD=7]="MUST_BUILD",Ue[Ue.MUST_REBUILD=8]="MUST_REBUILD",Ue[Ue.BUILD_FAILED=9]="BUILD_FAILED",Ue[Ue.RESOLVER_NOT_FOUND=10]="RESOLVER_NOT_FOUND",Ue[Ue.FETCHER_NOT_FOUND=11]="FETCHER_NOT_FOUND",Ue[Ue.LINKER_NOT_FOUND=12]="LINKER_NOT_FOUND",Ue[Ue.FETCH_NOT_CACHED=13]="FETCH_NOT_CACHED",Ue[Ue.YARN_IMPORT_FAILED=14]="YARN_IMPORT_FAILED",Ue[Ue.REMOTE_INVALID=15]="REMOTE_INVALID",Ue[Ue.REMOTE_NOT_FOUND=16]="REMOTE_NOT_FOUND",Ue[Ue.RESOLUTION_PACK=17]="RESOLUTION_PACK",Ue[Ue.CACHE_CHECKSUM_MISMATCH=18]="CACHE_CHECKSUM_MISMATCH",Ue[Ue.UNUSED_CACHE_ENTRY=19]="UNUSED_CACHE_ENTRY",Ue[Ue.MISSING_LOCKFILE_ENTRY=20]="MISSING_LOCKFILE_ENTRY",Ue[Ue.WORKSPACE_NOT_FOUND=21]="WORKSPACE_NOT_FOUND",Ue[Ue.TOO_MANY_MATCHING_WORKSPACES=22]="TOO_MANY_MATCHING_WORKSPACES",Ue[Ue.CONSTRAINTS_MISSING_DEPENDENCY=23]="CONSTRAINTS_MISSING_DEPENDENCY",Ue[Ue.CONSTRAINTS_INCOMPATIBLE_DEPENDENCY=24]="CONSTRAINTS_INCOMPATIBLE_DEPENDENCY",Ue[Ue.CONSTRAINTS_EXTRANEOUS_DEPENDENCY=25]="CONSTRAINTS_EXTRANEOUS_DEPENDENCY",Ue[Ue.CONSTRAINTS_INVALID_DEPENDENCY=26]="CONSTRAINTS_INVALID_DEPENDENCY",Ue[Ue.CANT_SUGGEST_RESOLUTIONS=27]="CANT_SUGGEST_RESOLUTIONS",Ue[Ue.FROZEN_LOCKFILE_EXCEPTION=28]="FROZEN_LOCKFILE_EXCEPTION",Ue[Ue.CROSS_DRIVE_VIRTUAL_LOCAL=29]="CROSS_DRIVE_VIRTUAL_LOCAL",Ue[Ue.FETCH_FAILED=30]="FETCH_FAILED",Ue[Ue.DANGEROUS_NODE_MODULES=31]="DANGEROUS_NODE_MODULES",Ue[Ue.NODE_GYP_INJECTED=32]="NODE_GYP_INJECTED",Ue[Ue.AUTHENTICATION_NOT_FOUND=33]="AUTHENTICATION_NOT_FOUND",Ue[Ue.INVALID_CONFIGURATION_KEY=34]="INVALID_CONFIGURATION_KEY",Ue[Ue.NETWORK_ERROR=35]="NETWORK_ERROR",Ue[Ue.LIFECYCLE_SCRIPT=36]="LIFECYCLE_SCRIPT",Ue[Ue.CONSTRAINTS_MISSING_FIELD=37]="CONSTRAINTS_MISSING_FIELD",Ue[Ue.CONSTRAINTS_INCOMPATIBLE_FIELD=38]="CONSTRAINTS_INCOMPATIBLE_FIELD",Ue[Ue.CONSTRAINTS_EXTRANEOUS_FIELD=39]="CONSTRAINTS_EXTRANEOUS_FIELD",Ue[Ue.CONSTRAINTS_INVALID_FIELD=40]="CONSTRAINTS_INVALID_FIELD",Ue[Ue.AUTHENTICATION_INVALID=41]="AUTHENTICATION_INVALID",Ue[Ue.PROLOG_UNKNOWN_ERROR=42]="PROLOG_UNKNOWN_ERROR",Ue[Ue.PROLOG_SYNTAX_ERROR=43]="PROLOG_SYNTAX_ERROR",Ue[Ue.PROLOG_EXISTENCE_ERROR=44]="PROLOG_EXISTENCE_ERROR",Ue[Ue.STACK_OVERFLOW_RESOLUTION=45]="STACK_OVERFLOW_RESOLUTION",Ue[Ue.AUTOMERGE_FAILED_TO_PARSE=46]="AUTOMERGE_FAILED_TO_PARSE",Ue[Ue.AUTOMERGE_IMMUTABLE=47]="AUTOMERGE_IMMUTABLE",Ue[Ue.AUTOMERGE_SUCCESS=48]="AUTOMERGE_SUCCESS",Ue[Ue.AUTOMERGE_REQUIRED=49]="AUTOMERGE_REQUIRED",Ue[Ue.DEPRECATED_CLI_SETTINGS=50]="DEPRECATED_CLI_SETTINGS",Ue[Ue.PLUGIN_NAME_NOT_FOUND=51]="PLUGIN_NAME_NOT_FOUND",Ue[Ue.INVALID_PLUGIN_REFERENCE=52]="INVALID_PLUGIN_REFERENCE",Ue[Ue.CONSTRAINTS_AMBIGUITY=53]="CONSTRAINTS_AMBIGUITY",Ue[Ue.CACHE_OUTSIDE_PROJECT=54]="CACHE_OUTSIDE_PROJECT",Ue[Ue.IMMUTABLE_INSTALL=55]="IMMUTABLE_INSTALL",Ue[Ue.IMMUTABLE_CACHE=56]="IMMUTABLE_CACHE",Ue[Ue.INVALID_MANIFEST=57]="INVALID_MANIFEST",Ue[Ue.PACKAGE_PREPARATION_FAILED=58]="PACKAGE_PREPARATION_FAILED",Ue[Ue.INVALID_RANGE_PEER_DEPENDENCY=59]="INVALID_RANGE_PEER_DEPENDENCY",Ue[Ue.INCOMPATIBLE_PEER_DEPENDENCY=60]="INCOMPATIBLE_PEER_DEPENDENCY",Ue[Ue.DEPRECATED_PACKAGE=61]="DEPRECATED_PACKAGE",Ue[Ue.INCOMPATIBLE_OS=62]="INCOMPATIBLE_OS",Ue[Ue.INCOMPATIBLE_CPU=63]="INCOMPATIBLE_CPU",Ue[Ue.FROZEN_ARTIFACT_EXCEPTION=64]="FROZEN_ARTIFACT_EXCEPTION",Ue[Ue.TELEMETRY_NOTICE=65]="TELEMETRY_NOTICE",Ue[Ue.PATCH_HUNK_FAILED=66]="PATCH_HUNK_FAILED",Ue[Ue.INVALID_CONFIGURATION_VALUE=67]="INVALID_CONFIGURATION_VALUE",Ue[Ue.UNUSED_PACKAGE_EXTENSION=68]="UNUSED_PACKAGE_EXTENSION",Ue[Ue.REDUNDANT_PACKAGE_EXTENSION=69]="REDUNDANT_PACKAGE_EXTENSION",Ue[Ue.AUTO_NM_SUCCESS=70]="AUTO_NM_SUCCESS",Ue[Ue.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK=71]="NM_CANT_INSTALL_EXTERNAL_SOFT_LINK",Ue[Ue.NM_PRESERVE_SYMLINKS_REQUIRED=72]="NM_PRESERVE_SYMLINKS_REQUIRED",Ue[Ue.UPDATE_LOCKFILE_ONLY_SKIP_LINK=73]="UPDATE_LOCKFILE_ONLY_SKIP_LINK",Ue[Ue.NM_HARDLINKS_MODE_DOWNGRADED=74]="NM_HARDLINKS_MODE_DOWNGRADED",Ue[Ue.PROLOG_INSTANTIATION_ERROR=75]="PROLOG_INSTANTIATION_ERROR",Ue[Ue.INCOMPATIBLE_ARCHITECTURE=76]="INCOMPATIBLE_ARCHITECTURE",Ue[Ue.GHOST_ARCHITECTURE=77]="GHOST_ARCHITECTURE",Ue[Ue.RESOLUTION_MISMATCH=78]="RESOLUTION_MISMATCH",Ue[Ue.PROLOG_LIMIT_EXCEEDED=79]="PROLOG_LIMIT_EXCEEDED",Ue[Ue.NETWORK_DISABLED=80]="NETWORK_DISABLED",Ue[Ue.NETWORK_UNSAFE_HTTP=81]="NETWORK_UNSAFE_HTTP",Ue[Ue.RESOLUTION_FAILED=82]="RESOLUTION_FAILED",Ue[Ue.AUTOMERGE_GIT_ERROR=83]="AUTOMERGE_GIT_ERROR",Ue[Ue.CONSTRAINTS_CHECK_FAILED=84]="CONSTRAINTS_CHECK_FAILED",Ue))(dr||{})});var iw=U((hQt,lJ)=>{var uje="2.0.0",Aje=Number.MAX_SAFE_INTEGER||9007199254740991,fje=16;lJ.exports={SEMVER_SPEC_VERSION:uje,MAX_LENGTH:256,MAX_SAFE_INTEGER:Aje,MAX_SAFE_COMPONENT_LENGTH:fje}});var sw=U((gQt,cJ)=>{var pje=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...t)=>console.error("SEMVER",...t):()=>{};cJ.exports=pje});var nd=U((Wp,uJ)=>{var{MAX_SAFE_COMPONENT_LENGTH:WT}=iw(),hje=sw();Wp=uJ.exports={};var gje=Wp.re=[],or=Wp.src=[],ar=Wp.t={},dje=0,Kr=(t,e,r)=>{let o=dje++;hje(t,o,e),ar[t]=o,or[o]=e,gje[o]=new RegExp(e,r?"g":void 0)};Kr("NUMERICIDENTIFIER","0|[1-9]\\d*");Kr("NUMERICIDENTIFIERLOOSE","[0-9]+");Kr("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*");Kr("MAINVERSION",`(${or[ar.NUMERICIDENTIFIER]})\\.(${or[ar.NUMERICIDENTIFIER]})\\.(${or[ar.NUMERICIDENTIFIER]})`);Kr("MAINVERSIONLOOSE",`(${or[ar.NUMERICIDENTIFIERLOOSE]})\\.(${or[ar.NUMERICIDENTIFIERLOOSE]})\\.(${or[ar.NUMERICIDENTIFIERLOOSE]})`);Kr("PRERELEASEIDENTIFIER",`(?:${or[ar.NUMERICIDENTIFIER]}|${or[ar.NONNUMERICIDENTIFIER]})`);Kr("PRERELEASEIDENTIFIERLOOSE",`(?:${or[ar.NUMERICIDENTIFIERLOOSE]}|${or[ar.NONNUMERICIDENTIFIER]})`);Kr("PRERELEASE",`(?:-(${or[ar.PRERELEASEIDENTIFIER]}(?:\\.${or[ar.PRERELEASEIDENTIFIER]})*))`);Kr("PRERELEASELOOSE",`(?:-?(${or[ar.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${or[ar.PRERELEASEIDENTIFIERLOOSE]})*))`);Kr("BUILDIDENTIFIER","[0-9A-Za-z-]+");Kr("BUILD",`(?:\\+(${or[ar.BUILDIDENTIFIER]}(?:\\.${or[ar.BUILDIDENTIFIER]})*))`);Kr("FULLPLAIN",`v?${or[ar.MAINVERSION]}${or[ar.PRERELEASE]}?${or[ar.BUILD]}?`);Kr("FULL",`^${or[ar.FULLPLAIN]}$`);Kr("LOOSEPLAIN",`[v=\\s]*${or[ar.MAINVERSIONLOOSE]}${or[ar.PRERELEASELOOSE]}?${or[ar.BUILD]}?`);Kr("LOOSE",`^${or[ar.LOOSEPLAIN]}$`);Kr("GTLT","((?:<|>)?=?)");Kr("XRANGEIDENTIFIERLOOSE",`${or[ar.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);Kr("XRANGEIDENTIFIER",`${or[ar.NUMERICIDENTIFIER]}|x|X|\\*`);Kr("XRANGEPLAIN",`[v=\\s]*(${or[ar.XRANGEIDENTIFIER]})(?:\\.(${or[ar.XRANGEIDENTIFIER]})(?:\\.(${or[ar.XRANGEIDENTIFIER]})(?:${or[ar.PRERELEASE]})?${or[ar.BUILD]}?)?)?`);Kr("XRANGEPLAINLOOSE",`[v=\\s]*(${or[ar.XRANGEIDENTIFIERLOOSE]})(?:\\.(${or[ar.XRANGEIDENTIFIERLOOSE]})(?:\\.(${or[ar.XRANGEIDENTIFIERLOOSE]})(?:${or[ar.PRERELEASELOOSE]})?${or[ar.BUILD]}?)?)?`);Kr("XRANGE",`^${or[ar.GTLT]}\\s*${or[ar.XRANGEPLAIN]}$`);Kr("XRANGELOOSE",`^${or[ar.GTLT]}\\s*${or[ar.XRANGEPLAINLOOSE]}$`);Kr("COERCE",`(^|[^\\d])(\\d{1,${WT}})(?:\\.(\\d{1,${WT}}))?(?:\\.(\\d{1,${WT}}))?(?:$|[^\\d])`);Kr("COERCERTL",or[ar.COERCE],!0);Kr("LONETILDE","(?:~>?)");Kr("TILDETRIM",`(\\s*)${or[ar.LONETILDE]}\\s+`,!0);Wp.tildeTrimReplace="$1~";Kr("TILDE",`^${or[ar.LONETILDE]}${or[ar.XRANGEPLAIN]}$`);Kr("TILDELOOSE",`^${or[ar.LONETILDE]}${or[ar.XRANGEPLAINLOOSE]}$`);Kr("LONECARET","(?:\\^)");Kr("CARETTRIM",`(\\s*)${or[ar.LONECARET]}\\s+`,!0);Wp.caretTrimReplace="$1^";Kr("CARET",`^${or[ar.LONECARET]}${or[ar.XRANGEPLAIN]}$`);Kr("CARETLOOSE",`^${or[ar.LONECARET]}${or[ar.XRANGEPLAINLOOSE]}$`);Kr("COMPARATORLOOSE",`^${or[ar.GTLT]}\\s*(${or[ar.LOOSEPLAIN]})$|^$`);Kr("COMPARATOR",`^${or[ar.GTLT]}\\s*(${or[ar.FULLPLAIN]})$|^$`);Kr("COMPARATORTRIM",`(\\s*)${or[ar.GTLT]}\\s*(${or[ar.LOOSEPLAIN]}|${or[ar.XRANGEPLAIN]})`,!0);Wp.comparatorTrimReplace="$1$2$3";Kr("HYPHENRANGE",`^\\s*(${or[ar.XRANGEPLAIN]})\\s+-\\s+(${or[ar.XRANGEPLAIN]})\\s*$`);Kr("HYPHENRANGELOOSE",`^\\s*(${or[ar.XRANGEPLAINLOOSE]})\\s+-\\s+(${or[ar.XRANGEPLAINLOOSE]})\\s*$`);Kr("STAR","(<|>)?=?\\s*\\*");Kr("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");Kr("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var ow=U((dQt,AJ)=>{var mje=["includePrerelease","loose","rtl"],yje=t=>t?typeof t!="object"?{loose:!0}:mje.filter(e=>t[e]).reduce((e,r)=>(e[r]=!0,e),{}):{};AJ.exports=yje});var tS=U((mQt,hJ)=>{var fJ=/^[0-9]+$/,pJ=(t,e)=>{let r=fJ.test(t),o=fJ.test(e);return r&&o&&(t=+t,e=+e),t===e?0:r&&!o?-1:o&&!r?1:tpJ(e,t);hJ.exports={compareIdentifiers:pJ,rcompareIdentifiers:Cje}});var Do=U((yQt,yJ)=>{var rS=sw(),{MAX_LENGTH:gJ,MAX_SAFE_INTEGER:nS}=iw(),{re:dJ,t:mJ}=nd(),Eje=ow(),{compareIdentifiers:Sy}=tS(),nl=class{constructor(e,r){if(r=Eje(r),e instanceof nl){if(e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid Version: ${e}`);if(e.length>gJ)throw new TypeError(`version is longer than ${gJ} characters`);rS("SemVer",e,r),this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease;let o=e.trim().match(r.loose?dJ[mJ.LOOSE]:dJ[mJ.FULL]);if(!o)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+o[1],this.minor=+o[2],this.patch=+o[3],this.major>nS||this.major<0)throw new TypeError("Invalid major version");if(this.minor>nS||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>nS||this.patch<0)throw new TypeError("Invalid patch version");o[4]?this.prerelease=o[4].split(".").map(a=>{if(/^[0-9]+$/.test(a)){let n=+a;if(n>=0&&n=0;)typeof this.prerelease[o]=="number"&&(this.prerelease[o]++,o=-2);o===-1&&this.prerelease.push(0)}r&&(Sy(this.prerelease[0],r)===0?isNaN(this.prerelease[1])&&(this.prerelease=[r,0]):this.prerelease=[r,0]);break;default:throw new Error(`invalid increment argument: ${e}`)}return this.format(),this.raw=this.version,this}};yJ.exports=nl});var id=U((CQt,wJ)=>{var{MAX_LENGTH:Ije}=iw(),{re:CJ,t:EJ}=nd(),IJ=Do(),wje=ow(),Bje=(t,e)=>{if(e=wje(e),t instanceof IJ)return t;if(typeof t!="string"||t.length>Ije||!(e.loose?CJ[EJ.LOOSE]:CJ[EJ.FULL]).test(t))return null;try{return new IJ(t,e)}catch{return null}};wJ.exports=Bje});var vJ=U((EQt,BJ)=>{var vje=id(),Dje=(t,e)=>{let r=vje(t,e);return r?r.version:null};BJ.exports=Dje});var SJ=U((IQt,DJ)=>{var Sje=id(),Pje=(t,e)=>{let r=Sje(t.trim().replace(/^[=v]+/,""),e);return r?r.version:null};DJ.exports=Pje});var bJ=U((wQt,xJ)=>{var PJ=Do(),xje=(t,e,r,o)=>{typeof r=="string"&&(o=r,r=void 0);try{return new PJ(t instanceof PJ?t.version:t,r).inc(e,o).version}catch{return null}};xJ.exports=xje});var Hl=U((BQt,kJ)=>{var QJ=Do(),bje=(t,e,r)=>new QJ(t,r).compare(new QJ(e,r));kJ.exports=bje});var iS=U((vQt,FJ)=>{var Qje=Hl(),kje=(t,e,r)=>Qje(t,e,r)===0;FJ.exports=kje});var NJ=U((DQt,TJ)=>{var RJ=id(),Fje=iS(),Rje=(t,e)=>{if(Fje(t,e))return null;{let r=RJ(t),o=RJ(e),a=r.prerelease.length||o.prerelease.length,n=a?"pre":"",u=a?"prerelease":"";for(let A in r)if((A==="major"||A==="minor"||A==="patch")&&r[A]!==o[A])return n+A;return u}};TJ.exports=Rje});var OJ=U((SQt,LJ)=>{var Tje=Do(),Nje=(t,e)=>new Tje(t,e).major;LJ.exports=Nje});var UJ=U((PQt,MJ)=>{var Lje=Do(),Oje=(t,e)=>new Lje(t,e).minor;MJ.exports=Oje});var HJ=U((xQt,_J)=>{var Mje=Do(),Uje=(t,e)=>new Mje(t,e).patch;_J.exports=Uje});var jJ=U((bQt,qJ)=>{var _je=id(),Hje=(t,e)=>{let r=_je(t,e);return r&&r.prerelease.length?r.prerelease:null};qJ.exports=Hje});var WJ=U((QQt,GJ)=>{var qje=Hl(),jje=(t,e,r)=>qje(e,t,r);GJ.exports=jje});var KJ=U((kQt,YJ)=>{var Gje=Hl(),Wje=(t,e)=>Gje(t,e,!0);YJ.exports=Wje});var sS=U((FQt,JJ)=>{var VJ=Do(),Yje=(t,e,r)=>{let o=new VJ(t,r),a=new VJ(e,r);return o.compare(a)||o.compareBuild(a)};JJ.exports=Yje});var XJ=U((RQt,zJ)=>{var Kje=sS(),Vje=(t,e)=>t.sort((r,o)=>Kje(r,o,e));zJ.exports=Vje});var $J=U((TQt,ZJ)=>{var Jje=sS(),zje=(t,e)=>t.sort((r,o)=>Jje(o,r,e));ZJ.exports=zje});var aw=U((NQt,ez)=>{var Xje=Hl(),Zje=(t,e,r)=>Xje(t,e,r)>0;ez.exports=Zje});var oS=U((LQt,tz)=>{var $je=Hl(),eGe=(t,e,r)=>$je(t,e,r)<0;tz.exports=eGe});var YT=U((OQt,rz)=>{var tGe=Hl(),rGe=(t,e,r)=>tGe(t,e,r)!==0;rz.exports=rGe});var aS=U((MQt,nz)=>{var nGe=Hl(),iGe=(t,e,r)=>nGe(t,e,r)>=0;nz.exports=iGe});var lS=U((UQt,iz)=>{var sGe=Hl(),oGe=(t,e,r)=>sGe(t,e,r)<=0;iz.exports=oGe});var KT=U((_Qt,sz)=>{var aGe=iS(),lGe=YT(),cGe=aw(),uGe=aS(),AGe=oS(),fGe=lS(),pGe=(t,e,r,o)=>{switch(e){case"===":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t===r;case"!==":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t!==r;case"":case"=":case"==":return aGe(t,r,o);case"!=":return lGe(t,r,o);case">":return cGe(t,r,o);case">=":return uGe(t,r,o);case"<":return AGe(t,r,o);case"<=":return fGe(t,r,o);default:throw new TypeError(`Invalid operator: ${e}`)}};sz.exports=pGe});var az=U((HQt,oz)=>{var hGe=Do(),gGe=id(),{re:cS,t:uS}=nd(),dGe=(t,e)=>{if(t instanceof hGe)return t;if(typeof t=="number"&&(t=String(t)),typeof t!="string")return null;e=e||{};let r=null;if(!e.rtl)r=t.match(cS[uS.COERCE]);else{let o;for(;(o=cS[uS.COERCERTL].exec(t))&&(!r||r.index+r[0].length!==t.length);)(!r||o.index+o[0].length!==r.index+r[0].length)&&(r=o),cS[uS.COERCERTL].lastIndex=o.index+o[1].length+o[2].length;cS[uS.COERCERTL].lastIndex=-1}return r===null?null:gGe(`${r[2]}.${r[3]||"0"}.${r[4]||"0"}`,e)};oz.exports=dGe});var cz=U((qQt,lz)=>{"use strict";lz.exports=function(t){t.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var AS=U((jQt,uz)=>{"use strict";uz.exports=dn;dn.Node=sd;dn.create=dn;function dn(t){var e=this;if(e instanceof dn||(e=new dn),e.tail=null,e.head=null,e.length=0,t&&typeof t.forEach=="function")t.forEach(function(a){e.push(a)});else if(arguments.length>0)for(var r=0,o=arguments.length;r1)r=e;else if(this.head)o=this.head.next,r=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var a=0;o!==null;a++)r=t(r,o.value,a),o=o.next;return r};dn.prototype.reduceReverse=function(t,e){var r,o=this.tail;if(arguments.length>1)r=e;else if(this.tail)o=this.tail.prev,r=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var a=this.length-1;o!==null;a--)r=t(r,o.value,a),o=o.prev;return r};dn.prototype.toArray=function(){for(var t=new Array(this.length),e=0,r=this.head;r!==null;e++)t[e]=r.value,r=r.next;return t};dn.prototype.toArrayReverse=function(){for(var t=new Array(this.length),e=0,r=this.tail;r!==null;e++)t[e]=r.value,r=r.prev;return t};dn.prototype.slice=function(t,e){e=e||this.length,e<0&&(e+=this.length),t=t||0,t<0&&(t+=this.length);var r=new dn;if(ethis.length&&(e=this.length);for(var o=0,a=this.head;a!==null&&othis.length&&(e=this.length);for(var o=this.length,a=this.tail;a!==null&&o>e;o--)a=a.prev;for(;a!==null&&o>t;o--,a=a.prev)r.push(a.value);return r};dn.prototype.splice=function(t,e,...r){t>this.length&&(t=this.length-1),t<0&&(t=this.length+t);for(var o=0,a=this.head;a!==null&&o{"use strict";var EGe=AS(),od=Symbol("max"),Bf=Symbol("length"),Py=Symbol("lengthCalculator"),cw=Symbol("allowStale"),ad=Symbol("maxAge"),wf=Symbol("dispose"),Az=Symbol("noDisposeOnSet"),Ds=Symbol("lruList"),qc=Symbol("cache"),pz=Symbol("updateAgeOnGet"),VT=()=>1,zT=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let r=this[od]=e.max||1/0,o=e.length||VT;if(this[Py]=typeof o!="function"?VT:o,this[cw]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[ad]=e.maxAge||0,this[wf]=e.dispose,this[Az]=e.noDisposeOnSet||!1,this[pz]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[od]=e||1/0,lw(this)}get max(){return this[od]}set allowStale(e){this[cw]=!!e}get allowStale(){return this[cw]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[ad]=e,lw(this)}get maxAge(){return this[ad]}set lengthCalculator(e){typeof e!="function"&&(e=VT),e!==this[Py]&&(this[Py]=e,this[Bf]=0,this[Ds].forEach(r=>{r.length=this[Py](r.value,r.key),this[Bf]+=r.length})),lw(this)}get lengthCalculator(){return this[Py]}get length(){return this[Bf]}get itemCount(){return this[Ds].length}rforEach(e,r){r=r||this;for(let o=this[Ds].tail;o!==null;){let a=o.prev;fz(this,e,o,r),o=a}}forEach(e,r){r=r||this;for(let o=this[Ds].head;o!==null;){let a=o.next;fz(this,e,o,r),o=a}}keys(){return this[Ds].toArray().map(e=>e.key)}values(){return this[Ds].toArray().map(e=>e.value)}reset(){this[wf]&&this[Ds]&&this[Ds].length&&this[Ds].forEach(e=>this[wf](e.key,e.value)),this[qc]=new Map,this[Ds]=new EGe,this[Bf]=0}dump(){return this[Ds].map(e=>fS(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[Ds]}set(e,r,o){if(o=o||this[ad],o&&typeof o!="number")throw new TypeError("maxAge must be a number");let a=o?Date.now():0,n=this[Py](r,e);if(this[qc].has(e)){if(n>this[od])return xy(this,this[qc].get(e)),!1;let p=this[qc].get(e).value;return this[wf]&&(this[Az]||this[wf](e,p.value)),p.now=a,p.maxAge=o,p.value=r,this[Bf]+=n-p.length,p.length=n,this.get(e),lw(this),!0}let u=new XT(e,r,n,a,o);return u.length>this[od]?(this[wf]&&this[wf](e,r),!1):(this[Bf]+=u.length,this[Ds].unshift(u),this[qc].set(e,this[Ds].head),lw(this),!0)}has(e){if(!this[qc].has(e))return!1;let r=this[qc].get(e).value;return!fS(this,r)}get(e){return JT(this,e,!0)}peek(e){return JT(this,e,!1)}pop(){let e=this[Ds].tail;return e?(xy(this,e),e.value):null}del(e){xy(this,this[qc].get(e))}load(e){this.reset();let r=Date.now();for(let o=e.length-1;o>=0;o--){let a=e[o],n=a.e||0;if(n===0)this.set(a.k,a.v);else{let u=n-r;u>0&&this.set(a.k,a.v,u)}}}prune(){this[qc].forEach((e,r)=>JT(this,r,!1))}},JT=(t,e,r)=>{let o=t[qc].get(e);if(o){let a=o.value;if(fS(t,a)){if(xy(t,o),!t[cw])return}else r&&(t[pz]&&(o.value.now=Date.now()),t[Ds].unshiftNode(o));return a.value}},fS=(t,e)=>{if(!e||!e.maxAge&&!t[ad])return!1;let r=Date.now()-e.now;return e.maxAge?r>e.maxAge:t[ad]&&r>t[ad]},lw=t=>{if(t[Bf]>t[od])for(let e=t[Ds].tail;t[Bf]>t[od]&&e!==null;){let r=e.prev;xy(t,e),e=r}},xy=(t,e)=>{if(e){let r=e.value;t[wf]&&t[wf](r.key,r.value),t[Bf]-=r.length,t[qc].delete(r.key),t[Ds].removeNode(e)}},XT=class{constructor(e,r,o,a,n){this.key=e,this.value=r,this.length=o,this.now=a,this.maxAge=n||0}},fz=(t,e,r,o)=>{let a=r.value;fS(t,a)&&(xy(t,r),t[cw]||(a=void 0)),a&&e.call(o,a.value,a.key,t)};hz.exports=zT});var ql=U((WQt,Cz)=>{var ld=class{constructor(e,r){if(r=wGe(r),e instanceof ld)return e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease?e:new ld(e.raw,r);if(e instanceof ZT)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease,this.raw=e,this.set=e.split("||").map(o=>this.parseRange(o.trim())).filter(o=>o.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${e}`);if(this.set.length>1){let o=this.set[0];if(this.set=this.set.filter(a=>!mz(a[0])),this.set.length===0)this.set=[o];else if(this.set.length>1){for(let a of this.set)if(a.length===1&&PGe(a[0])){this.set=[a];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){e=e.trim();let o=`parseRange:${Object.keys(this.options).join(",")}:${e}`,a=dz.get(o);if(a)return a;let n=this.options.loose,u=n?Da[Ko.HYPHENRANGELOOSE]:Da[Ko.HYPHENRANGE];e=e.replace(u,OGe(this.options.includePrerelease)),wi("hyphen replace",e),e=e.replace(Da[Ko.COMPARATORTRIM],vGe),wi("comparator trim",e),e=e.replace(Da[Ko.TILDETRIM],DGe),e=e.replace(Da[Ko.CARETTRIM],SGe),e=e.split(/\s+/).join(" ");let A=e.split(" ").map(w=>xGe(w,this.options)).join(" ").split(/\s+/).map(w=>LGe(w,this.options));n&&(A=A.filter(w=>(wi("loose invalid filter",w,this.options),!!w.match(Da[Ko.COMPARATORLOOSE])))),wi("range list",A);let p=new Map,h=A.map(w=>new ZT(w,this.options));for(let w of h){if(mz(w))return[w];p.set(w.value,w)}p.size>1&&p.has("")&&p.delete("");let E=[...p.values()];return dz.set(o,E),E}intersects(e,r){if(!(e instanceof ld))throw new TypeError("a Range is required");return this.set.some(o=>yz(o,r)&&e.set.some(a=>yz(a,r)&&o.every(n=>a.every(u=>n.intersects(u,r)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new BGe(e,this.options)}catch{return!1}for(let r=0;rt.value==="<0.0.0-0",PGe=t=>t.value==="",yz=(t,e)=>{let r=!0,o=t.slice(),a=o.pop();for(;r&&o.length;)r=o.every(n=>a.intersects(n,e)),a=o.pop();return r},xGe=(t,e)=>(wi("comp",t,e),t=kGe(t,e),wi("caret",t),t=bGe(t,e),wi("tildes",t),t=RGe(t,e),wi("xrange",t),t=NGe(t,e),wi("stars",t),t),Vo=t=>!t||t.toLowerCase()==="x"||t==="*",bGe=(t,e)=>t.trim().split(/\s+/).map(r=>QGe(r,e)).join(" "),QGe=(t,e)=>{let r=e.loose?Da[Ko.TILDELOOSE]:Da[Ko.TILDE];return t.replace(r,(o,a,n,u,A)=>{wi("tilde",t,o,a,n,u,A);let p;return Vo(a)?p="":Vo(n)?p=`>=${a}.0.0 <${+a+1}.0.0-0`:Vo(u)?p=`>=${a}.${n}.0 <${a}.${+n+1}.0-0`:A?(wi("replaceTilde pr",A),p=`>=${a}.${n}.${u}-${A} <${a}.${+n+1}.0-0`):p=`>=${a}.${n}.${u} <${a}.${+n+1}.0-0`,wi("tilde return",p),p})},kGe=(t,e)=>t.trim().split(/\s+/).map(r=>FGe(r,e)).join(" "),FGe=(t,e)=>{wi("caret",t,e);let r=e.loose?Da[Ko.CARETLOOSE]:Da[Ko.CARET],o=e.includePrerelease?"-0":"";return t.replace(r,(a,n,u,A,p)=>{wi("caret",t,a,n,u,A,p);let h;return Vo(n)?h="":Vo(u)?h=`>=${n}.0.0${o} <${+n+1}.0.0-0`:Vo(A)?n==="0"?h=`>=${n}.${u}.0${o} <${n}.${+u+1}.0-0`:h=`>=${n}.${u}.0${o} <${+n+1}.0.0-0`:p?(wi("replaceCaret pr",p),n==="0"?u==="0"?h=`>=${n}.${u}.${A}-${p} <${n}.${u}.${+A+1}-0`:h=`>=${n}.${u}.${A}-${p} <${n}.${+u+1}.0-0`:h=`>=${n}.${u}.${A}-${p} <${+n+1}.0.0-0`):(wi("no pr"),n==="0"?u==="0"?h=`>=${n}.${u}.${A}${o} <${n}.${u}.${+A+1}-0`:h=`>=${n}.${u}.${A}${o} <${n}.${+u+1}.0-0`:h=`>=${n}.${u}.${A} <${+n+1}.0.0-0`),wi("caret return",h),h})},RGe=(t,e)=>(wi("replaceXRanges",t,e),t.split(/\s+/).map(r=>TGe(r,e)).join(" ")),TGe=(t,e)=>{t=t.trim();let r=e.loose?Da[Ko.XRANGELOOSE]:Da[Ko.XRANGE];return t.replace(r,(o,a,n,u,A,p)=>{wi("xRange",t,o,a,n,u,A,p);let h=Vo(n),E=h||Vo(u),w=E||Vo(A),v=w;return a==="="&&v&&(a=""),p=e.includePrerelease?"-0":"",h?a===">"||a==="<"?o="<0.0.0-0":o="*":a&&v?(E&&(u=0),A=0,a===">"?(a=">=",E?(n=+n+1,u=0,A=0):(u=+u+1,A=0)):a==="<="&&(a="<",E?n=+n+1:u=+u+1),a==="<"&&(p="-0"),o=`${a+n}.${u}.${A}${p}`):E?o=`>=${n}.0.0${p} <${+n+1}.0.0-0`:w&&(o=`>=${n}.${u}.0${p} <${n}.${+u+1}.0-0`),wi("xRange return",o),o})},NGe=(t,e)=>(wi("replaceStars",t,e),t.trim().replace(Da[Ko.STAR],"")),LGe=(t,e)=>(wi("replaceGTE0",t,e),t.trim().replace(Da[e.includePrerelease?Ko.GTE0PRE:Ko.GTE0],"")),OGe=t=>(e,r,o,a,n,u,A,p,h,E,w,v,b)=>(Vo(o)?r="":Vo(a)?r=`>=${o}.0.0${t?"-0":""}`:Vo(n)?r=`>=${o}.${a}.0${t?"-0":""}`:u?r=`>=${r}`:r=`>=${r}${t?"-0":""}`,Vo(h)?p="":Vo(E)?p=`<${+h+1}.0.0-0`:Vo(w)?p=`<${h}.${+E+1}.0-0`:v?p=`<=${h}.${E}.${w}-${v}`:t?p=`<${h}.${E}.${+w+1}-0`:p=`<=${p}`,`${r} ${p}`.trim()),MGe=(t,e,r)=>{for(let o=0;o0){let a=t[o].semver;if(a.major===e.major&&a.minor===e.minor&&a.patch===e.patch)return!0}return!1}return!0}});var uw=U((YQt,vz)=>{var Aw=Symbol("SemVer ANY"),by=class{static get ANY(){return Aw}constructor(e,r){if(r=UGe(r),e instanceof by){if(e.loose===!!r.loose)return e;e=e.value}eN("comparator",e,r),this.options=r,this.loose=!!r.loose,this.parse(e),this.semver===Aw?this.value="":this.value=this.operator+this.semver.version,eN("comp",this)}parse(e){let r=this.options.loose?Ez[Iz.COMPARATORLOOSE]:Ez[Iz.COMPARATOR],o=e.match(r);if(!o)throw new TypeError(`Invalid comparator: ${e}`);this.operator=o[1]!==void 0?o[1]:"",this.operator==="="&&(this.operator=""),o[2]?this.semver=new wz(o[2],this.options.loose):this.semver=Aw}toString(){return this.value}test(e){if(eN("Comparator.test",e,this.options.loose),this.semver===Aw||e===Aw)return!0;if(typeof e=="string")try{e=new wz(e,this.options)}catch{return!1}return $T(e,this.operator,this.semver,this.options)}intersects(e,r){if(!(e instanceof by))throw new TypeError("a Comparator is required");if((!r||typeof r!="object")&&(r={loose:!!r,includePrerelease:!1}),this.operator==="")return this.value===""?!0:new Bz(e.value,r).test(this.value);if(e.operator==="")return e.value===""?!0:new Bz(this.value,r).test(e.semver);let o=(this.operator===">="||this.operator===">")&&(e.operator===">="||e.operator===">"),a=(this.operator==="<="||this.operator==="<")&&(e.operator==="<="||e.operator==="<"),n=this.semver.version===e.semver.version,u=(this.operator===">="||this.operator==="<=")&&(e.operator===">="||e.operator==="<="),A=$T(this.semver,"<",e.semver,r)&&(this.operator===">="||this.operator===">")&&(e.operator==="<="||e.operator==="<"),p=$T(this.semver,">",e.semver,r)&&(this.operator==="<="||this.operator==="<")&&(e.operator===">="||e.operator===">");return o||a||n&&u||A||p}};vz.exports=by;var UGe=ow(),{re:Ez,t:Iz}=nd(),$T=KT(),eN=sw(),wz=Do(),Bz=ql()});var fw=U((KQt,Dz)=>{var _Ge=ql(),HGe=(t,e,r)=>{try{e=new _Ge(e,r)}catch{return!1}return e.test(t)};Dz.exports=HGe});var Pz=U((VQt,Sz)=>{var qGe=ql(),jGe=(t,e)=>new qGe(t,e).set.map(r=>r.map(o=>o.value).join(" ").trim().split(" "));Sz.exports=jGe});var bz=U((JQt,xz)=>{var GGe=Do(),WGe=ql(),YGe=(t,e,r)=>{let o=null,a=null,n=null;try{n=new WGe(e,r)}catch{return null}return t.forEach(u=>{n.test(u)&&(!o||a.compare(u)===-1)&&(o=u,a=new GGe(o,r))}),o};xz.exports=YGe});var kz=U((zQt,Qz)=>{var KGe=Do(),VGe=ql(),JGe=(t,e,r)=>{let o=null,a=null,n=null;try{n=new VGe(e,r)}catch{return null}return t.forEach(u=>{n.test(u)&&(!o||a.compare(u)===1)&&(o=u,a=new KGe(o,r))}),o};Qz.exports=JGe});var Tz=U((XQt,Rz)=>{var tN=Do(),zGe=ql(),Fz=aw(),XGe=(t,e)=>{t=new zGe(t,e);let r=new tN("0.0.0");if(t.test(r)||(r=new tN("0.0.0-0"),t.test(r)))return r;r=null;for(let o=0;o{let A=new tN(u.semver.version);switch(u.operator){case">":A.prerelease.length===0?A.patch++:A.prerelease.push(0),A.raw=A.format();case"":case">=":(!n||Fz(A,n))&&(n=A);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${u.operator}`)}}),n&&(!r||Fz(r,n))&&(r=n)}return r&&t.test(r)?r:null};Rz.exports=XGe});var Lz=U((ZQt,Nz)=>{var ZGe=ql(),$Ge=(t,e)=>{try{return new ZGe(t,e).range||"*"}catch{return null}};Nz.exports=$Ge});var pS=U(($Qt,_z)=>{var e9e=Do(),Uz=uw(),{ANY:t9e}=Uz,r9e=ql(),n9e=fw(),Oz=aw(),Mz=oS(),i9e=lS(),s9e=aS(),o9e=(t,e,r,o)=>{t=new e9e(t,o),e=new r9e(e,o);let a,n,u,A,p;switch(r){case">":a=Oz,n=i9e,u=Mz,A=">",p=">=";break;case"<":a=Mz,n=s9e,u=Oz,A="<",p="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(n9e(t,e,o))return!1;for(let h=0;h{b.semver===t9e&&(b=new Uz(">=0.0.0")),w=w||b,v=v||b,a(b.semver,w.semver,o)?w=b:u(b.semver,v.semver,o)&&(v=b)}),w.operator===A||w.operator===p||(!v.operator||v.operator===A)&&n(t,v.semver))return!1;if(v.operator===p&&u(t,v.semver))return!1}return!0};_z.exports=o9e});var qz=U((ekt,Hz)=>{var a9e=pS(),l9e=(t,e,r)=>a9e(t,e,">",r);Hz.exports=l9e});var Gz=U((tkt,jz)=>{var c9e=pS(),u9e=(t,e,r)=>c9e(t,e,"<",r);jz.exports=u9e});var Kz=U((rkt,Yz)=>{var Wz=ql(),A9e=(t,e,r)=>(t=new Wz(t,r),e=new Wz(e,r),t.intersects(e));Yz.exports=A9e});var Jz=U((nkt,Vz)=>{var f9e=fw(),p9e=Hl();Vz.exports=(t,e,r)=>{let o=[],a=null,n=null,u=t.sort((E,w)=>p9e(E,w,r));for(let E of u)f9e(E,e,r)?(n=E,a||(a=E)):(n&&o.push([a,n]),n=null,a=null);a&&o.push([a,null]);let A=[];for(let[E,w]of o)E===w?A.push(E):!w&&E===u[0]?A.push("*"):w?E===u[0]?A.push(`<=${w}`):A.push(`${E} - ${w}`):A.push(`>=${E}`);let p=A.join(" || "),h=typeof e.raw=="string"?e.raw:String(e);return p.length{var zz=ql(),hS=uw(),{ANY:rN}=hS,pw=fw(),nN=Hl(),h9e=(t,e,r={})=>{if(t===e)return!0;t=new zz(t,r),e=new zz(e,r);let o=!1;e:for(let a of t.set){for(let n of e.set){let u=g9e(a,n,r);if(o=o||u!==null,u)continue e}if(o)return!1}return!0},g9e=(t,e,r)=>{if(t===e)return!0;if(t.length===1&&t[0].semver===rN){if(e.length===1&&e[0].semver===rN)return!0;r.includePrerelease?t=[new hS(">=0.0.0-0")]:t=[new hS(">=0.0.0")]}if(e.length===1&&e[0].semver===rN){if(r.includePrerelease)return!0;e=[new hS(">=0.0.0")]}let o=new Set,a,n;for(let b of t)b.operator===">"||b.operator===">="?a=Xz(a,b,r):b.operator==="<"||b.operator==="<="?n=Zz(n,b,r):o.add(b.semver);if(o.size>1)return null;let u;if(a&&n){if(u=nN(a.semver,n.semver,r),u>0)return null;if(u===0&&(a.operator!==">="||n.operator!=="<="))return null}for(let b of o){if(a&&!pw(b,String(a),r)||n&&!pw(b,String(n),r))return null;for(let C of e)if(!pw(b,String(C),r))return!1;return!0}let A,p,h,E,w=n&&!r.includePrerelease&&n.semver.prerelease.length?n.semver:!1,v=a&&!r.includePrerelease&&a.semver.prerelease.length?a.semver:!1;w&&w.prerelease.length===1&&n.operator==="<"&&w.prerelease[0]===0&&(w=!1);for(let b of e){if(E=E||b.operator===">"||b.operator===">=",h=h||b.operator==="<"||b.operator==="<=",a){if(v&&b.semver.prerelease&&b.semver.prerelease.length&&b.semver.major===v.major&&b.semver.minor===v.minor&&b.semver.patch===v.patch&&(v=!1),b.operator===">"||b.operator===">="){if(A=Xz(a,b,r),A===b&&A!==a)return!1}else if(a.operator===">="&&!pw(a.semver,String(b),r))return!1}if(n){if(w&&b.semver.prerelease&&b.semver.prerelease.length&&b.semver.major===w.major&&b.semver.minor===w.minor&&b.semver.patch===w.patch&&(w=!1),b.operator==="<"||b.operator==="<="){if(p=Zz(n,b,r),p===b&&p!==n)return!1}else if(n.operator==="<="&&!pw(n.semver,String(b),r))return!1}if(!b.operator&&(n||a)&&u!==0)return!1}return!(a&&h&&!n&&u!==0||n&&E&&!a&&u!==0||v||w)},Xz=(t,e,r)=>{if(!t)return e;let o=nN(t.semver,e.semver,r);return o>0?t:o<0||e.operator===">"&&t.operator===">="?e:t},Zz=(t,e,r)=>{if(!t)return e;let o=nN(t.semver,e.semver,r);return o<0?t:o>0||e.operator==="<"&&t.operator==="<="?e:t};$z.exports=h9e});var si=U((skt,tX)=>{var iN=nd();tX.exports={re:iN.re,src:iN.src,tokens:iN.t,SEMVER_SPEC_VERSION:iw().SEMVER_SPEC_VERSION,SemVer:Do(),compareIdentifiers:tS().compareIdentifiers,rcompareIdentifiers:tS().rcompareIdentifiers,parse:id(),valid:vJ(),clean:SJ(),inc:bJ(),diff:NJ(),major:OJ(),minor:UJ(),patch:HJ(),prerelease:jJ(),compare:Hl(),rcompare:WJ(),compareLoose:KJ(),compareBuild:sS(),sort:XJ(),rsort:$J(),gt:aw(),lt:oS(),eq:iS(),neq:YT(),gte:aS(),lte:lS(),cmp:KT(),coerce:az(),Comparator:uw(),Range:ql(),satisfies:fw(),toComparators:Pz(),maxSatisfying:bz(),minSatisfying:kz(),minVersion:Tz(),validRange:Lz(),outside:pS(),gtr:qz(),ltr:Gz(),intersects:Kz(),simplifyRange:Jz(),subset:eX()}});var nX=U((okt,rX)=>{"use strict";function d9e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function cd(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,cd)}d9e(cd,Error);cd.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",w;for(w=0;w0){for(w=1,v=1;w{switch(Ne[1]){case"|":return ke|Ne[3];case"&":return ke&Ne[3];case"^":return ke^Ne[3]}},$)},v="!",b=Me("!",!1),C=function($){return!$},R="(",L=Me("(",!1),_=")",V=Me(")",!1),re=function($){return $},oe=/^[^ \t\n\r()!|&\^]/,pe=Te([" "," ",` +`,"\r","(",")","!","|","&","^"],!0,!1),he=function($){return e.queryPattern.test($)},ve=function($){return e.checkFn($)},ge=qe("whitespace"),le=/^[ \t\n\r]/,Pe=Te([" "," ",` +`,"\r"],!1,!1),g=0,De=0,Ce=[{line:1,column:1}],de=0,ne=[],Z=0,me;if("startRule"in e){if(!(e.startRule in o))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=o[e.startRule]}function be(){return t.substring(De,g)}function ut(){return Oe(De,g)}function H($,ie){throw ie=ie!==void 0?ie:Oe(De,g),P([qe($)],t.substring(De,g),ie)}function yt($,ie){throw ie=ie!==void 0?ie:Oe(De,g),I($,ie)}function Me($,ie){return{type:"literal",text:$,ignoreCase:ie}}function Te($,ie,ke){return{type:"class",parts:$,inverted:ie,ignoreCase:ke}}function Qe(){return{type:"any"}}function _e(){return{type:"end"}}function qe($){return{type:"other",description:$}}function At($){var ie=Ce[$],ke;if(ie)return ie;for(ke=$-1;!Ce[ke];)ke--;for(ie=Ce[ke],ie={line:ie.line,column:ie.column};ke<$;)t.charCodeAt(ke)===10?(ie.line++,ie.column=1):ie.column++,ke++;return Ce[$]=ie,ie}function Oe($,ie){var ke=At($),Ne=At(ie);return{start:{offset:$,line:ke.line,column:ke.column},end:{offset:ie,line:Ne.line,column:Ne.column}}}function x($){gde&&(de=g,ne=[]),ne.push($))}function I($,ie){return new cd($,null,null,ie)}function P($,ie,ke){return new cd(cd.buildMessage($,ie),$,ie,ke)}function y(){var $,ie,ke,Ne,st,ht,Ut,Xt;if($=g,ie=F(),ie!==r){for(ke=[],Ne=g,st=X(),st!==r?(t.charCodeAt(g)===124?(ht=n,g++):(ht=r,Z===0&&x(u)),ht===r&&(t.charCodeAt(g)===38?(ht=A,g++):(ht=r,Z===0&&x(p)),ht===r&&(t.charCodeAt(g)===94?(ht=h,g++):(ht=r,Z===0&&x(E)))),ht!==r?(Ut=X(),Ut!==r?(Xt=F(),Xt!==r?(st=[st,ht,Ut,Xt],Ne=st):(g=Ne,Ne=r)):(g=Ne,Ne=r)):(g=Ne,Ne=r)):(g=Ne,Ne=r);Ne!==r;)ke.push(Ne),Ne=g,st=X(),st!==r?(t.charCodeAt(g)===124?(ht=n,g++):(ht=r,Z===0&&x(u)),ht===r&&(t.charCodeAt(g)===38?(ht=A,g++):(ht=r,Z===0&&x(p)),ht===r&&(t.charCodeAt(g)===94?(ht=h,g++):(ht=r,Z===0&&x(E)))),ht!==r?(Ut=X(),Ut!==r?(Xt=F(),Xt!==r?(st=[st,ht,Ut,Xt],Ne=st):(g=Ne,Ne=r)):(g=Ne,Ne=r)):(g=Ne,Ne=r)):(g=Ne,Ne=r);ke!==r?(De=$,ie=w(ie,ke),$=ie):(g=$,$=r)}else g=$,$=r;return $}function F(){var $,ie,ke,Ne,st,ht;return $=g,t.charCodeAt(g)===33?(ie=v,g++):(ie=r,Z===0&&x(b)),ie!==r?(ke=F(),ke!==r?(De=$,ie=C(ke),$=ie):(g=$,$=r)):(g=$,$=r),$===r&&($=g,t.charCodeAt(g)===40?(ie=R,g++):(ie=r,Z===0&&x(L)),ie!==r?(ke=X(),ke!==r?(Ne=y(),Ne!==r?(st=X(),st!==r?(t.charCodeAt(g)===41?(ht=_,g++):(ht=r,Z===0&&x(V)),ht!==r?(De=$,ie=re(Ne),$=ie):(g=$,$=r)):(g=$,$=r)):(g=$,$=r)):(g=$,$=r)):(g=$,$=r),$===r&&($=J())),$}function J(){var $,ie,ke,Ne,st;if($=g,ie=X(),ie!==r){if(ke=g,Ne=[],oe.test(t.charAt(g))?(st=t.charAt(g),g++):(st=r,Z===0&&x(pe)),st!==r)for(;st!==r;)Ne.push(st),oe.test(t.charAt(g))?(st=t.charAt(g),g++):(st=r,Z===0&&x(pe));else Ne=r;Ne!==r?ke=t.substring(ke,g):ke=Ne,ke!==r?(De=g,Ne=he(ke),Ne?Ne=void 0:Ne=r,Ne!==r?(De=$,ie=ve(ke),$=ie):(g=$,$=r)):(g=$,$=r)}else g=$,$=r;return $}function X(){var $,ie;for(Z++,$=[],le.test(t.charAt(g))?(ie=t.charAt(g),g++):(ie=r,Z===0&&x(Pe));ie!==r;)$.push(ie),le.test(t.charAt(g))?(ie=t.charAt(g),g++):(ie=r,Z===0&&x(Pe));return Z--,$===r&&(ie=r,Z===0&&x(ge)),$}if(me=a(),me!==r&&g===t.length)return me;throw me!==r&&g{var{parse:y9e}=nX();gS.makeParser=(t=/[a-z]+/)=>(e,r)=>y9e(e,{queryPattern:t,checkFn:r});gS.parse=gS.makeParser()});var oX=U((lkt,sX)=>{"use strict";sX.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var sN=U((ckt,lX)=>{var hw=oX(),aX={};for(let t of Object.keys(hw))aX[hw[t]]=t;var cr={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};lX.exports=cr;for(let t of Object.keys(cr)){if(!("channels"in cr[t]))throw new Error("missing channels property: "+t);if(!("labels"in cr[t]))throw new Error("missing channel labels property: "+t);if(cr[t].labels.length!==cr[t].channels)throw new Error("channel and label counts mismatch: "+t);let{channels:e,labels:r}=cr[t];delete cr[t].channels,delete cr[t].labels,Object.defineProperty(cr[t],"channels",{value:e}),Object.defineProperty(cr[t],"labels",{value:r})}cr.rgb.hsl=function(t){let e=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(e,r,o),n=Math.max(e,r,o),u=n-a,A,p;n===a?A=0:e===n?A=(r-o)/u:r===n?A=2+(o-e)/u:o===n&&(A=4+(e-r)/u),A=Math.min(A*60,360),A<0&&(A+=360);let h=(a+n)/2;return n===a?p=0:h<=.5?p=u/(n+a):p=u/(2-n-a),[A,p*100,h*100]};cr.rgb.hsv=function(t){let e,r,o,a,n,u=t[0]/255,A=t[1]/255,p=t[2]/255,h=Math.max(u,A,p),E=h-Math.min(u,A,p),w=function(v){return(h-v)/6/E+1/2};return E===0?(a=0,n=0):(n=E/h,e=w(u),r=w(A),o=w(p),u===h?a=o-r:A===h?a=1/3+e-o:p===h&&(a=2/3+r-e),a<0?a+=1:a>1&&(a-=1)),[a*360,n*100,h*100]};cr.rgb.hwb=function(t){let e=t[0],r=t[1],o=t[2],a=cr.rgb.hsl(t)[0],n=1/255*Math.min(e,Math.min(r,o));return o=1-1/255*Math.max(e,Math.max(r,o)),[a,n*100,o*100]};cr.rgb.cmyk=function(t){let e=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(1-e,1-r,1-o),n=(1-e-a)/(1-a)||0,u=(1-r-a)/(1-a)||0,A=(1-o-a)/(1-a)||0;return[n*100,u*100,A*100,a*100]};function C9e(t,e){return(t[0]-e[0])**2+(t[1]-e[1])**2+(t[2]-e[2])**2}cr.rgb.keyword=function(t){let e=aX[t];if(e)return e;let r=1/0,o;for(let a of Object.keys(hw)){let n=hw[a],u=C9e(t,n);u.04045?((e+.055)/1.055)**2.4:e/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92,o=o>.04045?((o+.055)/1.055)**2.4:o/12.92;let a=e*.4124+r*.3576+o*.1805,n=e*.2126+r*.7152+o*.0722,u=e*.0193+r*.1192+o*.9505;return[a*100,n*100,u*100]};cr.rgb.lab=function(t){let e=cr.rgb.xyz(t),r=e[0],o=e[1],a=e[2];r/=95.047,o/=100,a/=108.883,r=r>.008856?r**(1/3):7.787*r+16/116,o=o>.008856?o**(1/3):7.787*o+16/116,a=a>.008856?a**(1/3):7.787*a+16/116;let n=116*o-16,u=500*(r-o),A=200*(o-a);return[n,u,A]};cr.hsl.rgb=function(t){let e=t[0]/360,r=t[1]/100,o=t[2]/100,a,n,u;if(r===0)return u=o*255,[u,u,u];o<.5?a=o*(1+r):a=o+r-o*r;let A=2*o-a,p=[0,0,0];for(let h=0;h<3;h++)n=e+1/3*-(h-1),n<0&&n++,n>1&&n--,6*n<1?u=A+(a-A)*6*n:2*n<1?u=a:3*n<2?u=A+(a-A)*(2/3-n)*6:u=A,p[h]=u*255;return p};cr.hsl.hsv=function(t){let e=t[0],r=t[1]/100,o=t[2]/100,a=r,n=Math.max(o,.01);o*=2,r*=o<=1?o:2-o,a*=n<=1?n:2-n;let u=(o+r)/2,A=o===0?2*a/(n+a):2*r/(o+r);return[e,A*100,u*100]};cr.hsv.rgb=function(t){let e=t[0]/60,r=t[1]/100,o=t[2]/100,a=Math.floor(e)%6,n=e-Math.floor(e),u=255*o*(1-r),A=255*o*(1-r*n),p=255*o*(1-r*(1-n));switch(o*=255,a){case 0:return[o,p,u];case 1:return[A,o,u];case 2:return[u,o,p];case 3:return[u,A,o];case 4:return[p,u,o];case 5:return[o,u,A]}};cr.hsv.hsl=function(t){let e=t[0],r=t[1]/100,o=t[2]/100,a=Math.max(o,.01),n,u;u=(2-r)*o;let A=(2-r)*a;return n=r*a,n/=A<=1?A:2-A,n=n||0,u/=2,[e,n*100,u*100]};cr.hwb.rgb=function(t){let e=t[0]/360,r=t[1]/100,o=t[2]/100,a=r+o,n;a>1&&(r/=a,o/=a);let u=Math.floor(6*e),A=1-o;n=6*e-u,(u&1)!==0&&(n=1-n);let p=r+n*(A-r),h,E,w;switch(u){default:case 6:case 0:h=A,E=p,w=r;break;case 1:h=p,E=A,w=r;break;case 2:h=r,E=A,w=p;break;case 3:h=r,E=p,w=A;break;case 4:h=p,E=r,w=A;break;case 5:h=A,E=r,w=p;break}return[h*255,E*255,w*255]};cr.cmyk.rgb=function(t){let e=t[0]/100,r=t[1]/100,o=t[2]/100,a=t[3]/100,n=1-Math.min(1,e*(1-a)+a),u=1-Math.min(1,r*(1-a)+a),A=1-Math.min(1,o*(1-a)+a);return[n*255,u*255,A*255]};cr.xyz.rgb=function(t){let e=t[0]/100,r=t[1]/100,o=t[2]/100,a,n,u;return a=e*3.2406+r*-1.5372+o*-.4986,n=e*-.9689+r*1.8758+o*.0415,u=e*.0557+r*-.204+o*1.057,a=a>.0031308?1.055*a**(1/2.4)-.055:a*12.92,n=n>.0031308?1.055*n**(1/2.4)-.055:n*12.92,u=u>.0031308?1.055*u**(1/2.4)-.055:u*12.92,a=Math.min(Math.max(0,a),1),n=Math.min(Math.max(0,n),1),u=Math.min(Math.max(0,u),1),[a*255,n*255,u*255]};cr.xyz.lab=function(t){let e=t[0],r=t[1],o=t[2];e/=95.047,r/=100,o/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,o=o>.008856?o**(1/3):7.787*o+16/116;let a=116*r-16,n=500*(e-r),u=200*(r-o);return[a,n,u]};cr.lab.xyz=function(t){let e=t[0],r=t[1],o=t[2],a,n,u;n=(e+16)/116,a=r/500+n,u=n-o/200;let A=n**3,p=a**3,h=u**3;return n=A>.008856?A:(n-16/116)/7.787,a=p>.008856?p:(a-16/116)/7.787,u=h>.008856?h:(u-16/116)/7.787,a*=95.047,n*=100,u*=108.883,[a,n,u]};cr.lab.lch=function(t){let e=t[0],r=t[1],o=t[2],a;a=Math.atan2(o,r)*360/2/Math.PI,a<0&&(a+=360);let u=Math.sqrt(r*r+o*o);return[e,u,a]};cr.lch.lab=function(t){let e=t[0],r=t[1],a=t[2]/360*2*Math.PI,n=r*Math.cos(a),u=r*Math.sin(a);return[e,n,u]};cr.rgb.ansi16=function(t,e=null){let[r,o,a]=t,n=e===null?cr.rgb.hsv(t)[2]:e;if(n=Math.round(n/50),n===0)return 30;let u=30+(Math.round(a/255)<<2|Math.round(o/255)<<1|Math.round(r/255));return n===2&&(u+=60),u};cr.hsv.ansi16=function(t){return cr.rgb.ansi16(cr.hsv.rgb(t),t[2])};cr.rgb.ansi256=function(t){let e=t[0],r=t[1],o=t[2];return e===r&&r===o?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(r/255*5)+Math.round(o/255*5)};cr.ansi16.rgb=function(t){let e=t%10;if(e===0||e===7)return t>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let r=(~~(t>50)+1)*.5,o=(e&1)*r*255,a=(e>>1&1)*r*255,n=(e>>2&1)*r*255;return[o,a,n]};cr.ansi256.rgb=function(t){if(t>=232){let n=(t-232)*10+8;return[n,n,n]}t-=16;let e,r=Math.floor(t/36)/5*255,o=Math.floor((e=t%36)/6)/5*255,a=e%6/5*255;return[r,o,a]};cr.rgb.hex=function(t){let r=(((Math.round(t[0])&255)<<16)+((Math.round(t[1])&255)<<8)+(Math.round(t[2])&255)).toString(16).toUpperCase();return"000000".substring(r.length)+r};cr.hex.rgb=function(t){let e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let r=e[0];e[0].length===3&&(r=r.split("").map(A=>A+A).join(""));let o=parseInt(r,16),a=o>>16&255,n=o>>8&255,u=o&255;return[a,n,u]};cr.rgb.hcg=function(t){let e=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.max(Math.max(e,r),o),n=Math.min(Math.min(e,r),o),u=a-n,A,p;return u<1?A=n/(1-u):A=0,u<=0?p=0:a===e?p=(r-o)/u%6:a===r?p=2+(o-e)/u:p=4+(e-r)/u,p/=6,p%=1,[p*360,u*100,A*100]};cr.hsl.hcg=function(t){let e=t[1]/100,r=t[2]/100,o=r<.5?2*e*r:2*e*(1-r),a=0;return o<1&&(a=(r-.5*o)/(1-o)),[t[0],o*100,a*100]};cr.hsv.hcg=function(t){let e=t[1]/100,r=t[2]/100,o=e*r,a=0;return o<1&&(a=(r-o)/(1-o)),[t[0],o*100,a*100]};cr.hcg.rgb=function(t){let e=t[0]/360,r=t[1]/100,o=t[2]/100;if(r===0)return[o*255,o*255,o*255];let a=[0,0,0],n=e%1*6,u=n%1,A=1-u,p=0;switch(Math.floor(n)){case 0:a[0]=1,a[1]=u,a[2]=0;break;case 1:a[0]=A,a[1]=1,a[2]=0;break;case 2:a[0]=0,a[1]=1,a[2]=u;break;case 3:a[0]=0,a[1]=A,a[2]=1;break;case 4:a[0]=u,a[1]=0,a[2]=1;break;default:a[0]=1,a[1]=0,a[2]=A}return p=(1-r)*o,[(r*a[0]+p)*255,(r*a[1]+p)*255,(r*a[2]+p)*255]};cr.hcg.hsv=function(t){let e=t[1]/100,r=t[2]/100,o=e+r*(1-e),a=0;return o>0&&(a=e/o),[t[0],a*100,o*100]};cr.hcg.hsl=function(t){let e=t[1]/100,o=t[2]/100*(1-e)+.5*e,a=0;return o>0&&o<.5?a=e/(2*o):o>=.5&&o<1&&(a=e/(2*(1-o))),[t[0],a*100,o*100]};cr.hcg.hwb=function(t){let e=t[1]/100,r=t[2]/100,o=e+r*(1-e);return[t[0],(o-e)*100,(1-o)*100]};cr.hwb.hcg=function(t){let e=t[1]/100,o=1-t[2]/100,a=o-e,n=0;return a<1&&(n=(o-a)/(1-a)),[t[0],a*100,n*100]};cr.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]};cr.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]};cr.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]};cr.gray.hsl=function(t){return[0,0,t[0]]};cr.gray.hsv=cr.gray.hsl;cr.gray.hwb=function(t){return[0,100,t[0]]};cr.gray.cmyk=function(t){return[0,0,0,t[0]]};cr.gray.lab=function(t){return[t[0],0,0]};cr.gray.hex=function(t){let e=Math.round(t[0]/100*255)&255,o=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(o.length)+o};cr.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}});var uX=U((ukt,cX)=>{var dS=sN();function E9e(){let t={},e=Object.keys(dS);for(let r=e.length,o=0;o{var oN=sN(),v9e=uX(),Qy={},D9e=Object.keys(oN);function S9e(t){let e=function(...r){let o=r[0];return o==null?o:(o.length>1&&(r=o),t(r))};return"conversion"in t&&(e.conversion=t.conversion),e}function P9e(t){let e=function(...r){let o=r[0];if(o==null)return o;o.length>1&&(r=o);let a=t(r);if(typeof a=="object")for(let n=a.length,u=0;u{Qy[t]={},Object.defineProperty(Qy[t],"channels",{value:oN[t].channels}),Object.defineProperty(Qy[t],"labels",{value:oN[t].labels});let e=v9e(t);Object.keys(e).forEach(o=>{let a=e[o];Qy[t][o]=P9e(a),Qy[t][o].raw=S9e(a)})});AX.exports=Qy});var gw=U((fkt,mX)=>{"use strict";var pX=(t,e)=>(...r)=>`\x1B[${t(...r)+e}m`,hX=(t,e)=>(...r)=>{let o=t(...r);return`\x1B[${38+e};5;${o}m`},gX=(t,e)=>(...r)=>{let o=t(...r);return`\x1B[${38+e};2;${o[0]};${o[1]};${o[2]}m`},mS=t=>t,dX=(t,e,r)=>[t,e,r],ky=(t,e,r)=>{Object.defineProperty(t,e,{get:()=>{let o=r();return Object.defineProperty(t,e,{value:o,enumerable:!0,configurable:!0}),o},enumerable:!0,configurable:!0})},aN,Fy=(t,e,r,o)=>{aN===void 0&&(aN=fX());let a=o?10:0,n={};for(let[u,A]of Object.entries(aN)){let p=u==="ansi16"?"ansi":u;u===e?n[p]=t(r,a):typeof A=="object"&&(n[p]=t(A[e],a))}return n};function x9e(){let t=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[r,o]of Object.entries(e)){for(let[a,n]of Object.entries(o))e[a]={open:`\x1B[${n[0]}m`,close:`\x1B[${n[1]}m`},o[a]=e[a],t.set(n[0],n[1]);Object.defineProperty(e,r,{value:o,enumerable:!1})}return Object.defineProperty(e,"codes",{value:t,enumerable:!1}),e.color.close="\x1B[39m",e.bgColor.close="\x1B[49m",ky(e.color,"ansi",()=>Fy(pX,"ansi16",mS,!1)),ky(e.color,"ansi256",()=>Fy(hX,"ansi256",mS,!1)),ky(e.color,"ansi16m",()=>Fy(gX,"rgb",dX,!1)),ky(e.bgColor,"ansi",()=>Fy(pX,"ansi16",mS,!0)),ky(e.bgColor,"ansi256",()=>Fy(hX,"ansi256",mS,!0)),ky(e.bgColor,"ansi16m",()=>Fy(gX,"rgb",dX,!0)),e}Object.defineProperty(mX,"exports",{enumerable:!0,get:x9e})});var CX=U((pkt,yX)=>{"use strict";yX.exports=(t,e=process.argv)=>{let r=t.startsWith("-")?"":t.length===1?"-":"--",o=e.indexOf(r+t),a=e.indexOf("--");return o!==-1&&(a===-1||o{"use strict";var b9e=Ie("os"),EX=Ie("tty"),jl=CX(),{env:ls}=process,Yp;jl("no-color")||jl("no-colors")||jl("color=false")||jl("color=never")?Yp=0:(jl("color")||jl("colors")||jl("color=true")||jl("color=always"))&&(Yp=1);"FORCE_COLOR"in ls&&(ls.FORCE_COLOR==="true"?Yp=1:ls.FORCE_COLOR==="false"?Yp=0:Yp=ls.FORCE_COLOR.length===0?1:Math.min(parseInt(ls.FORCE_COLOR,10),3));function lN(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function cN(t,e){if(Yp===0)return 0;if(jl("color=16m")||jl("color=full")||jl("color=truecolor"))return 3;if(jl("color=256"))return 2;if(t&&!e&&Yp===void 0)return 0;let r=Yp||0;if(ls.TERM==="dumb")return r;if(process.platform==="win32"){let o=b9e.release().split(".");return Number(o[0])>=10&&Number(o[2])>=10586?Number(o[2])>=14931?3:2:1}if("CI"in ls)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(o=>o in ls)||ls.CI_NAME==="codeship"?1:r;if("TEAMCITY_VERSION"in ls)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(ls.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in ls)return 1;if(ls.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in ls){let o=parseInt((ls.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(ls.TERM_PROGRAM){case"iTerm.app":return o>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(ls.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(ls.TERM)||"COLORTERM"in ls?1:r}function Q9e(t){let e=cN(t,t&&t.isTTY);return lN(e)}IX.exports={supportsColor:Q9e,stdout:lN(cN(!0,EX.isatty(1))),stderr:lN(cN(!0,EX.isatty(2)))}});var BX=U((gkt,wX)=>{"use strict";var k9e=(t,e,r)=>{let o=t.indexOf(e);if(o===-1)return t;let a=e.length,n=0,u="";do u+=t.substr(n,o-n)+e+r,n=o+a,o=t.indexOf(e,n);while(o!==-1);return u+=t.substr(n),u},F9e=(t,e,r,o)=>{let a=0,n="";do{let u=t[o-1]==="\r";n+=t.substr(a,(u?o-1:o)-a)+e+(u?`\r +`:` +`)+r,a=o+1,o=t.indexOf(` +`,a)}while(o!==-1);return n+=t.substr(a),n};wX.exports={stringReplaceAll:k9e,stringEncaseCRLFWithFirstIndex:F9e}});var xX=U((dkt,PX)=>{"use strict";var R9e=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,vX=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,T9e=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,N9e=/\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.)|([^\\])/gi,L9e=new Map([["n",` +`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e","\x1B"],["a","\x07"]]);function SX(t){let e=t[0]==="u",r=t[1]==="{";return e&&!r&&t.length===5||t[0]==="x"&&t.length===3?String.fromCharCode(parseInt(t.slice(1),16)):e&&r?String.fromCodePoint(parseInt(t.slice(2,-1),16)):L9e.get(t)||t}function O9e(t,e){let r=[],o=e.trim().split(/\s*,\s*/g),a;for(let n of o){let u=Number(n);if(!Number.isNaN(u))r.push(u);else if(a=n.match(T9e))r.push(a[2].replace(N9e,(A,p,h)=>p?SX(p):h));else throw new Error(`Invalid Chalk template style argument: ${n} (in style '${t}')`)}return r}function M9e(t){vX.lastIndex=0;let e=[],r;for(;(r=vX.exec(t))!==null;){let o=r[1];if(r[2]){let a=O9e(o,r[2]);e.push([o].concat(a))}else e.push([o])}return e}function DX(t,e){let r={};for(let a of e)for(let n of a.styles)r[n[0]]=a.inverse?null:n.slice(1);let o=t;for(let[a,n]of Object.entries(r))if(!!Array.isArray(n)){if(!(a in o))throw new Error(`Unknown Chalk style: ${a}`);o=n.length>0?o[a](...n):o[a]}return o}PX.exports=(t,e)=>{let r=[],o=[],a=[];if(e.replace(R9e,(n,u,A,p,h,E)=>{if(u)a.push(SX(u));else if(p){let w=a.join("");a=[],o.push(r.length===0?w:DX(t,r)(w)),r.push({inverse:A,styles:M9e(p)})}else if(h){if(r.length===0)throw new Error("Found extraneous } in Chalk template literal");o.push(DX(t,r)(a.join(""))),a=[],r.pop()}else a.push(E)}),o.push(a.join("")),r.length>0){let n=`Chalk template literal is missing ${r.length} closing bracket${r.length===1?"":"s"} (\`}\`)`;throw new Error(n)}return o.join("")}});var dN=U((mkt,FX)=>{"use strict";var dw=gw(),{stdout:fN,stderr:pN}=uN(),{stringReplaceAll:U9e,stringEncaseCRLFWithFirstIndex:_9e}=BX(),bX=["ansi","ansi","ansi256","ansi16m"],Ry=Object.create(null),H9e=(t,e={})=>{if(e.level>3||e.level<0)throw new Error("The `level` option should be an integer from 0 to 3");let r=fN?fN.level:0;t.level=e.level===void 0?r:e.level},hN=class{constructor(e){return QX(e)}},QX=t=>{let e={};return H9e(e,t),e.template=(...r)=>G9e(e.template,...r),Object.setPrototypeOf(e,yS.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=hN,e.template};function yS(t){return QX(t)}for(let[t,e]of Object.entries(dw))Ry[t]={get(){let r=CS(this,gN(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,t,{value:r}),r}};Ry.visible={get(){let t=CS(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:t}),t}};var kX=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let t of kX)Ry[t]={get(){let{level:e}=this;return function(...r){let o=gN(dw.color[bX[e]][t](...r),dw.color.close,this._styler);return CS(this,o,this._isEmpty)}}};for(let t of kX){let e="bg"+t[0].toUpperCase()+t.slice(1);Ry[e]={get(){let{level:r}=this;return function(...o){let a=gN(dw.bgColor[bX[r]][t](...o),dw.bgColor.close,this._styler);return CS(this,a,this._isEmpty)}}}}var q9e=Object.defineProperties(()=>{},{...Ry,level:{enumerable:!0,get(){return this._generator.level},set(t){this._generator.level=t}}}),gN=(t,e,r)=>{let o,a;return r===void 0?(o=t,a=e):(o=r.openAll+t,a=e+r.closeAll),{open:t,close:e,openAll:o,closeAll:a,parent:r}},CS=(t,e,r)=>{let o=(...a)=>j9e(o,a.length===1?""+a[0]:a.join(" "));return o.__proto__=q9e,o._generator=t,o._styler=e,o._isEmpty=r,o},j9e=(t,e)=>{if(t.level<=0||!e)return t._isEmpty?"":e;let r=t._styler;if(r===void 0)return e;let{openAll:o,closeAll:a}=r;if(e.indexOf("\x1B")!==-1)for(;r!==void 0;)e=U9e(e,r.close,r.open),r=r.parent;let n=e.indexOf(` +`);return n!==-1&&(e=_9e(e,a,o,n)),o+e+a},AN,G9e=(t,...e)=>{let[r]=e;if(!Array.isArray(r))return e.join(" ");let o=e.slice(1),a=[r.raw[0]];for(let n=1;n{"use strict";Gl.isInteger=t=>typeof t=="number"?Number.isInteger(t):typeof t=="string"&&t.trim()!==""?Number.isInteger(Number(t)):!1;Gl.find=(t,e)=>t.nodes.find(r=>r.type===e);Gl.exceedsLimit=(t,e,r=1,o)=>o===!1||!Gl.isInteger(t)||!Gl.isInteger(e)?!1:(Number(e)-Number(t))/Number(r)>=o;Gl.escapeNode=(t,e=0,r)=>{let o=t.nodes[e];!o||(r&&o.type===r||o.type==="open"||o.type==="close")&&o.escaped!==!0&&(o.value="\\"+o.value,o.escaped=!0)};Gl.encloseBrace=t=>t.type!=="brace"?!1:t.commas>>0+t.ranges>>0===0?(t.invalid=!0,!0):!1;Gl.isInvalidBrace=t=>t.type!=="brace"?!1:t.invalid===!0||t.dollar?!0:t.commas>>0+t.ranges>>0===0||t.open!==!0||t.close!==!0?(t.invalid=!0,!0):!1;Gl.isOpenOrClose=t=>t.type==="open"||t.type==="close"?!0:t.open===!0||t.close===!0;Gl.reduce=t=>t.reduce((e,r)=>(r.type==="text"&&e.push(r.value),r.type==="range"&&(r.type="text"),e),[]);Gl.flatten=(...t)=>{let e=[],r=o=>{for(let a=0;a{"use strict";var RX=ES();TX.exports=(t,e={})=>{let r=(o,a={})=>{let n=e.escapeInvalid&&RX.isInvalidBrace(a),u=o.invalid===!0&&e.escapeInvalid===!0,A="";if(o.value)return(n||u)&&RX.isOpenOrClose(o)?"\\"+o.value:o.value;if(o.value)return o.value;if(o.nodes)for(let p of o.nodes)A+=r(p);return A};return r(t)}});var LX=U((Ekt,NX)=>{"use strict";NX.exports=function(t){return typeof t=="number"?t-t===0:typeof t=="string"&&t.trim()!==""?Number.isFinite?Number.isFinite(+t):isFinite(+t):!1}});var WX=U((Ikt,GX)=>{"use strict";var OX=LX(),ud=(t,e,r)=>{if(OX(t)===!1)throw new TypeError("toRegexRange: expected the first argument to be a number");if(e===void 0||t===e)return String(t);if(OX(e)===!1)throw new TypeError("toRegexRange: expected the second argument to be a number.");let o={relaxZeros:!0,...r};typeof o.strictZeros=="boolean"&&(o.relaxZeros=o.strictZeros===!1);let a=String(o.relaxZeros),n=String(o.shorthand),u=String(o.capture),A=String(o.wrap),p=t+":"+e+"="+a+n+u+A;if(ud.cache.hasOwnProperty(p))return ud.cache[p].result;let h=Math.min(t,e),E=Math.max(t,e);if(Math.abs(h-E)===1){let R=t+"|"+e;return o.capture?`(${R})`:o.wrap===!1?R:`(?:${R})`}let w=jX(t)||jX(e),v={min:t,max:e,a:h,b:E},b=[],C=[];if(w&&(v.isPadded=w,v.maxLen=String(v.max).length),h<0){let R=E<0?Math.abs(E):1;C=MX(R,Math.abs(h),v,o),h=v.a=0}return E>=0&&(b=MX(h,E,v,o)),v.negatives=C,v.positives=b,v.result=W9e(C,b,o),o.capture===!0?v.result=`(${v.result})`:o.wrap!==!1&&b.length+C.length>1&&(v.result=`(?:${v.result})`),ud.cache[p]=v,v.result};function W9e(t,e,r){let o=mN(t,e,"-",!1,r)||[],a=mN(e,t,"",!1,r)||[],n=mN(t,e,"-?",!0,r)||[];return o.concat(n).concat(a).join("|")}function Y9e(t,e){let r=1,o=1,a=_X(t,r),n=new Set([e]);for(;t<=a&&a<=e;)n.add(a),r+=1,a=_X(t,r);for(a=HX(e+1,o)-1;t1&&A.count.pop(),A.count.push(E.count[0]),A.string=A.pattern+qX(A.count),u=h+1;continue}r.isPadded&&(w=X9e(h,r,o)),E.string=w+E.pattern+qX(E.count),n.push(E),u=h+1,A=E}return n}function mN(t,e,r,o,a){let n=[];for(let u of t){let{string:A}=u;!o&&!UX(e,"string",A)&&n.push(r+A),o&&UX(e,"string",A)&&n.push(r+A)}return n}function V9e(t,e){let r=[];for(let o=0;oe?1:e>t?-1:0}function UX(t,e,r){return t.some(o=>o[e]===r)}function _X(t,e){return Number(String(t).slice(0,-e)+"9".repeat(e))}function HX(t,e){return t-t%Math.pow(10,e)}function qX(t){let[e=0,r=""]=t;return r||e>1?`{${e+(r?","+r:"")}}`:""}function z9e(t,e,r){return`[${t}${e-t===1?"":"-"}${e}]`}function jX(t){return/^-?(0+)\d/.test(t)}function X9e(t,e,r){if(!e.isPadded)return t;let o=Math.abs(e.maxLen-String(t).length),a=r.relaxZeros!==!1;switch(o){case 0:return"";case 1:return a?"0?":"0";case 2:return a?"0{0,2}":"00";default:return a?`0{0,${o}}`:`0{${o}}`}}ud.cache={};ud.clearCache=()=>ud.cache={};GX.exports=ud});var EN=U((wkt,$X)=>{"use strict";var Z9e=Ie("util"),VX=WX(),YX=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),$9e=t=>e=>t===!0?Number(e):String(e),yN=t=>typeof t=="number"||typeof t=="string"&&t!=="",yw=t=>Number.isInteger(+t),CN=t=>{let e=`${t}`,r=-1;if(e[0]==="-"&&(e=e.slice(1)),e==="0")return!1;for(;e[++r]==="0";);return r>0},e5e=(t,e,r)=>typeof t=="string"||typeof e=="string"?!0:r.stringify===!0,t5e=(t,e,r)=>{if(e>0){let o=t[0]==="-"?"-":"";o&&(t=t.slice(1)),t=o+t.padStart(o?e-1:e,"0")}return r===!1?String(t):t},KX=(t,e)=>{let r=t[0]==="-"?"-":"";for(r&&(t=t.slice(1),e--);t.length{t.negatives.sort((u,A)=>uA?1:0),t.positives.sort((u,A)=>uA?1:0);let r=e.capture?"":"?:",o="",a="",n;return t.positives.length&&(o=t.positives.join("|")),t.negatives.length&&(a=`-(${r}${t.negatives.join("|")})`),o&&a?n=`${o}|${a}`:n=o||a,e.wrap?`(${r}${n})`:n},JX=(t,e,r,o)=>{if(r)return VX(t,e,{wrap:!1,...o});let a=String.fromCharCode(t);if(t===e)return a;let n=String.fromCharCode(e);return`[${a}-${n}]`},zX=(t,e,r)=>{if(Array.isArray(t)){let o=r.wrap===!0,a=r.capture?"":"?:";return o?`(${a}${t.join("|")})`:t.join("|")}return VX(t,e,r)},XX=(...t)=>new RangeError("Invalid range arguments: "+Z9e.inspect(...t)),ZX=(t,e,r)=>{if(r.strictRanges===!0)throw XX([t,e]);return[]},n5e=(t,e)=>{if(e.strictRanges===!0)throw new TypeError(`Expected step "${t}" to be a number`);return[]},i5e=(t,e,r=1,o={})=>{let a=Number(t),n=Number(e);if(!Number.isInteger(a)||!Number.isInteger(n)){if(o.strictRanges===!0)throw XX([t,e]);return[]}a===0&&(a=0),n===0&&(n=0);let u=a>n,A=String(t),p=String(e),h=String(r);r=Math.max(Math.abs(r),1);let E=CN(A)||CN(p)||CN(h),w=E?Math.max(A.length,p.length,h.length):0,v=E===!1&&e5e(t,e,o)===!1,b=o.transform||$9e(v);if(o.toRegex&&r===1)return JX(KX(t,w),KX(e,w),!0,o);let C={negatives:[],positives:[]},R=V=>C[V<0?"negatives":"positives"].push(Math.abs(V)),L=[],_=0;for(;u?a>=n:a<=n;)o.toRegex===!0&&r>1?R(a):L.push(t5e(b(a,_),w,v)),a=u?a-r:a+r,_++;return o.toRegex===!0?r>1?r5e(C,o):zX(L,null,{wrap:!1,...o}):L},s5e=(t,e,r=1,o={})=>{if(!yw(t)&&t.length>1||!yw(e)&&e.length>1)return ZX(t,e,o);let a=o.transform||(v=>String.fromCharCode(v)),n=`${t}`.charCodeAt(0),u=`${e}`.charCodeAt(0),A=n>u,p=Math.min(n,u),h=Math.max(n,u);if(o.toRegex&&r===1)return JX(p,h,!1,o);let E=[],w=0;for(;A?n>=u:n<=u;)E.push(a(n,w)),n=A?n-r:n+r,w++;return o.toRegex===!0?zX(E,null,{wrap:!1,options:o}):E},wS=(t,e,r,o={})=>{if(e==null&&yN(t))return[t];if(!yN(t)||!yN(e))return ZX(t,e,o);if(typeof r=="function")return wS(t,e,1,{transform:r});if(YX(r))return wS(t,e,0,r);let a={...o};return a.capture===!0&&(a.wrap=!0),r=r||a.step||1,yw(r)?yw(t)&&yw(e)?i5e(t,e,r,a):s5e(t,e,Math.max(Math.abs(r),1),a):r!=null&&!YX(r)?n5e(r,a):wS(t,e,1,r)};$X.exports=wS});var rZ=U((Bkt,tZ)=>{"use strict";var o5e=EN(),eZ=ES(),a5e=(t,e={})=>{let r=(o,a={})=>{let n=eZ.isInvalidBrace(a),u=o.invalid===!0&&e.escapeInvalid===!0,A=n===!0||u===!0,p=e.escapeInvalid===!0?"\\":"",h="";if(o.isOpen===!0||o.isClose===!0)return p+o.value;if(o.type==="open")return A?p+o.value:"(";if(o.type==="close")return A?p+o.value:")";if(o.type==="comma")return o.prev.type==="comma"?"":A?o.value:"|";if(o.value)return o.value;if(o.nodes&&o.ranges>0){let E=eZ.reduce(o.nodes),w=o5e(...E,{...e,wrap:!1,toRegex:!0});if(w.length!==0)return E.length>1&&w.length>1?`(${w})`:w}if(o.nodes)for(let E of o.nodes)h+=r(E,o);return h};return r(t)};tZ.exports=a5e});var sZ=U((vkt,iZ)=>{"use strict";var l5e=EN(),nZ=IS(),Ty=ES(),Ad=(t="",e="",r=!1)=>{let o=[];if(t=[].concat(t),e=[].concat(e),!e.length)return t;if(!t.length)return r?Ty.flatten(e).map(a=>`{${a}}`):e;for(let a of t)if(Array.isArray(a))for(let n of a)o.push(Ad(n,e,r));else for(let n of e)r===!0&&typeof n=="string"&&(n=`{${n}}`),o.push(Array.isArray(n)?Ad(a,n,r):a+n);return Ty.flatten(o)},c5e=(t,e={})=>{let r=e.rangeLimit===void 0?1e3:e.rangeLimit,o=(a,n={})=>{a.queue=[];let u=n,A=n.queue;for(;u.type!=="brace"&&u.type!=="root"&&u.parent;)u=u.parent,A=u.queue;if(a.invalid||a.dollar){A.push(Ad(A.pop(),nZ(a,e)));return}if(a.type==="brace"&&a.invalid!==!0&&a.nodes.length===2){A.push(Ad(A.pop(),["{}"]));return}if(a.nodes&&a.ranges>0){let w=Ty.reduce(a.nodes);if(Ty.exceedsLimit(...w,e.step,r))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let v=l5e(...w,e);v.length===0&&(v=nZ(a,e)),A.push(Ad(A.pop(),v)),a.nodes=[];return}let p=Ty.encloseBrace(a),h=a.queue,E=a;for(;E.type!=="brace"&&E.type!=="root"&&E.parent;)E=E.parent,h=E.queue;for(let w=0;w{"use strict";oZ.exports={MAX_LENGTH:1024*64,CHAR_0:"0",CHAR_9:"9",CHAR_UPPERCASE_A:"A",CHAR_LOWERCASE_A:"a",CHAR_UPPERCASE_Z:"Z",CHAR_LOWERCASE_Z:"z",CHAR_LEFT_PARENTHESES:"(",CHAR_RIGHT_PARENTHESES:")",CHAR_ASTERISK:"*",CHAR_AMPERSAND:"&",CHAR_AT:"@",CHAR_BACKSLASH:"\\",CHAR_BACKTICK:"`",CHAR_CARRIAGE_RETURN:"\r",CHAR_CIRCUMFLEX_ACCENT:"^",CHAR_COLON:":",CHAR_COMMA:",",CHAR_DOLLAR:"$",CHAR_DOT:".",CHAR_DOUBLE_QUOTE:'"',CHAR_EQUAL:"=",CHAR_EXCLAMATION_MARK:"!",CHAR_FORM_FEED:"\f",CHAR_FORWARD_SLASH:"/",CHAR_HASH:"#",CHAR_HYPHEN_MINUS:"-",CHAR_LEFT_ANGLE_BRACKET:"<",CHAR_LEFT_CURLY_BRACE:"{",CHAR_LEFT_SQUARE_BRACKET:"[",CHAR_LINE_FEED:` +`,CHAR_NO_BREAK_SPACE:"\xA0",CHAR_PERCENT:"%",CHAR_PLUS:"+",CHAR_QUESTION_MARK:"?",CHAR_RIGHT_ANGLE_BRACKET:">",CHAR_RIGHT_CURLY_BRACE:"}",CHAR_RIGHT_SQUARE_BRACKET:"]",CHAR_SEMICOLON:";",CHAR_SINGLE_QUOTE:"'",CHAR_SPACE:" ",CHAR_TAB:" ",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\uFEFF"}});var fZ=U((Skt,AZ)=>{"use strict";var u5e=IS(),{MAX_LENGTH:lZ,CHAR_BACKSLASH:IN,CHAR_BACKTICK:A5e,CHAR_COMMA:f5e,CHAR_DOT:p5e,CHAR_LEFT_PARENTHESES:h5e,CHAR_RIGHT_PARENTHESES:g5e,CHAR_LEFT_CURLY_BRACE:d5e,CHAR_RIGHT_CURLY_BRACE:m5e,CHAR_LEFT_SQUARE_BRACKET:cZ,CHAR_RIGHT_SQUARE_BRACKET:uZ,CHAR_DOUBLE_QUOTE:y5e,CHAR_SINGLE_QUOTE:C5e,CHAR_NO_BREAK_SPACE:E5e,CHAR_ZERO_WIDTH_NOBREAK_SPACE:I5e}=aZ(),w5e=(t,e={})=>{if(typeof t!="string")throw new TypeError("Expected a string");let r=e||{},o=typeof r.maxLength=="number"?Math.min(lZ,r.maxLength):lZ;if(t.length>o)throw new SyntaxError(`Input length (${t.length}), exceeds max characters (${o})`);let a={type:"root",input:t,nodes:[]},n=[a],u=a,A=a,p=0,h=t.length,E=0,w=0,v,b={},C=()=>t[E++],R=L=>{if(L.type==="text"&&A.type==="dot"&&(A.type="text"),A&&A.type==="text"&&L.type==="text"){A.value+=L.value;return}return u.nodes.push(L),L.parent=u,L.prev=A,A=L,L};for(R({type:"bos"});E0){if(u.ranges>0){u.ranges=0;let L=u.nodes.shift();u.nodes=[L,{type:"text",value:u5e(u)}]}R({type:"comma",value:v}),u.commas++;continue}if(v===p5e&&w>0&&u.commas===0){let L=u.nodes;if(w===0||L.length===0){R({type:"text",value:v});continue}if(A.type==="dot"){if(u.range=[],A.value+=v,A.type="range",u.nodes.length!==3&&u.nodes.length!==5){u.invalid=!0,u.ranges=0,A.type="text";continue}u.ranges++,u.args=[];continue}if(A.type==="range"){L.pop();let _=L[L.length-1];_.value+=A.value+v,A=_,u.ranges--;continue}R({type:"dot",value:v});continue}R({type:"text",value:v})}do if(u=n.pop(),u.type!=="root"){u.nodes.forEach(V=>{V.nodes||(V.type==="open"&&(V.isOpen=!0),V.type==="close"&&(V.isClose=!0),V.nodes||(V.type="text"),V.invalid=!0)});let L=n[n.length-1],_=L.nodes.indexOf(u);L.nodes.splice(_,1,...u.nodes)}while(n.length>0);return R({type:"eos"}),a};AZ.exports=w5e});var gZ=U((Pkt,hZ)=>{"use strict";var pZ=IS(),B5e=rZ(),v5e=sZ(),D5e=fZ(),il=(t,e={})=>{let r=[];if(Array.isArray(t))for(let o of t){let a=il.create(o,e);Array.isArray(a)?r.push(...a):r.push(a)}else r=[].concat(il.create(t,e));return e&&e.expand===!0&&e.nodupes===!0&&(r=[...new Set(r)]),r};il.parse=(t,e={})=>D5e(t,e);il.stringify=(t,e={})=>pZ(typeof t=="string"?il.parse(t,e):t,e);il.compile=(t,e={})=>(typeof t=="string"&&(t=il.parse(t,e)),B5e(t,e));il.expand=(t,e={})=>{typeof t=="string"&&(t=il.parse(t,e));let r=v5e(t,e);return e.noempty===!0&&(r=r.filter(Boolean)),e.nodupes===!0&&(r=[...new Set(r)]),r};il.create=(t,e={})=>t===""||t.length<3?[t]:e.expand!==!0?il.compile(t,e):il.expand(t,e);hZ.exports=il});var Cw=U((xkt,EZ)=>{"use strict";var S5e=Ie("path"),Ju="\\\\/",dZ=`[^${Ju}]`,vf="\\.",P5e="\\+",x5e="\\?",BS="\\/",b5e="(?=.)",mZ="[^/]",wN=`(?:${BS}|$)`,yZ=`(?:^|${BS})`,BN=`${vf}{1,2}${wN}`,Q5e=`(?!${vf})`,k5e=`(?!${yZ}${BN})`,F5e=`(?!${vf}{0,1}${wN})`,R5e=`(?!${BN})`,T5e=`[^.${BS}]`,N5e=`${mZ}*?`,CZ={DOT_LITERAL:vf,PLUS_LITERAL:P5e,QMARK_LITERAL:x5e,SLASH_LITERAL:BS,ONE_CHAR:b5e,QMARK:mZ,END_ANCHOR:wN,DOTS_SLASH:BN,NO_DOT:Q5e,NO_DOTS:k5e,NO_DOT_SLASH:F5e,NO_DOTS_SLASH:R5e,QMARK_NO_DOT:T5e,STAR:N5e,START_ANCHOR:yZ},L5e={...CZ,SLASH_LITERAL:`[${Ju}]`,QMARK:dZ,STAR:`${dZ}*?`,DOTS_SLASH:`${vf}{1,2}(?:[${Ju}]|$)`,NO_DOT:`(?!${vf})`,NO_DOTS:`(?!(?:^|[${Ju}])${vf}{1,2}(?:[${Ju}]|$))`,NO_DOT_SLASH:`(?!${vf}{0,1}(?:[${Ju}]|$))`,NO_DOTS_SLASH:`(?!${vf}{1,2}(?:[${Ju}]|$))`,QMARK_NO_DOT:`[^.${Ju}]`,START_ANCHOR:`(?:^|[${Ju}])`,END_ANCHOR:`(?:[${Ju}]|$)`},O5e={alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};EZ.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:O5e,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:S5e.sep,extglobChars(t){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${t.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(t){return t===!0?L5e:CZ}}});var Ew=U(Sa=>{"use strict";var M5e=Ie("path"),U5e=process.platform==="win32",{REGEX_BACKSLASH:_5e,REGEX_REMOVE_BACKSLASH:H5e,REGEX_SPECIAL_CHARS:q5e,REGEX_SPECIAL_CHARS_GLOBAL:j5e}=Cw();Sa.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);Sa.hasRegexChars=t=>q5e.test(t);Sa.isRegexChar=t=>t.length===1&&Sa.hasRegexChars(t);Sa.escapeRegex=t=>t.replace(j5e,"\\$1");Sa.toPosixSlashes=t=>t.replace(_5e,"/");Sa.removeBackslashes=t=>t.replace(H5e,e=>e==="\\"?"":e);Sa.supportsLookbehinds=()=>{let t=process.version.slice(1).split(".").map(Number);return t.length===3&&t[0]>=9||t[0]===8&&t[1]>=10};Sa.isWindows=t=>t&&typeof t.windows=="boolean"?t.windows:U5e===!0||M5e.sep==="\\";Sa.escapeLast=(t,e,r)=>{let o=t.lastIndexOf(e,r);return o===-1?t:t[o-1]==="\\"?Sa.escapeLast(t,e,o-1):`${t.slice(0,o)}\\${t.slice(o)}`};Sa.removePrefix=(t,e={})=>{let r=t;return r.startsWith("./")&&(r=r.slice(2),e.prefix="./"),r};Sa.wrapOutput=(t,e={},r={})=>{let o=r.contains?"":"^",a=r.contains?"":"$",n=`${o}(?:${t})${a}`;return e.negated===!0&&(n=`(?:^(?!${n}).*$)`),n}});var xZ=U((Qkt,PZ)=>{"use strict";var IZ=Ew(),{CHAR_ASTERISK:vN,CHAR_AT:G5e,CHAR_BACKWARD_SLASH:Iw,CHAR_COMMA:W5e,CHAR_DOT:DN,CHAR_EXCLAMATION_MARK:SN,CHAR_FORWARD_SLASH:SZ,CHAR_LEFT_CURLY_BRACE:PN,CHAR_LEFT_PARENTHESES:xN,CHAR_LEFT_SQUARE_BRACKET:Y5e,CHAR_PLUS:K5e,CHAR_QUESTION_MARK:wZ,CHAR_RIGHT_CURLY_BRACE:V5e,CHAR_RIGHT_PARENTHESES:BZ,CHAR_RIGHT_SQUARE_BRACKET:J5e}=Cw(),vZ=t=>t===SZ||t===Iw,DZ=t=>{t.isPrefix!==!0&&(t.depth=t.isGlobstar?1/0:1)},z5e=(t,e)=>{let r=e||{},o=t.length-1,a=r.parts===!0||r.scanToEnd===!0,n=[],u=[],A=[],p=t,h=-1,E=0,w=0,v=!1,b=!1,C=!1,R=!1,L=!1,_=!1,V=!1,re=!1,oe=!1,pe=!1,he=0,ve,ge,le={value:"",depth:0,isGlob:!1},Pe=()=>h>=o,g=()=>p.charCodeAt(h+1),De=()=>(ve=ge,p.charCodeAt(++h));for(;h0&&(de=p.slice(0,E),p=p.slice(E),w-=E),Ce&&C===!0&&w>0?(Ce=p.slice(0,w),ne=p.slice(w)):C===!0?(Ce="",ne=p):Ce=p,Ce&&Ce!==""&&Ce!=="/"&&Ce!==p&&vZ(Ce.charCodeAt(Ce.length-1))&&(Ce=Ce.slice(0,-1)),r.unescape===!0&&(ne&&(ne=IZ.removeBackslashes(ne)),Ce&&V===!0&&(Ce=IZ.removeBackslashes(Ce)));let Z={prefix:de,input:t,start:E,base:Ce,glob:ne,isBrace:v,isBracket:b,isGlob:C,isExtglob:R,isGlobstar:L,negated:re,negatedExtglob:oe};if(r.tokens===!0&&(Z.maxDepth=0,vZ(ge)||u.push(le),Z.tokens=u),r.parts===!0||r.tokens===!0){let me;for(let be=0;be{"use strict";var vS=Cw(),sl=Ew(),{MAX_LENGTH:DS,POSIX_REGEX_SOURCE:X5e,REGEX_NON_SPECIAL_CHARS:Z5e,REGEX_SPECIAL_CHARS_BACKREF:$5e,REPLACEMENTS:bZ}=vS,e7e=(t,e)=>{if(typeof e.expandRange=="function")return e.expandRange(...t,e);t.sort();let r=`[${t.join("-")}]`;try{new RegExp(r)}catch{return t.map(a=>sl.escapeRegex(a)).join("..")}return r},Ny=(t,e)=>`Missing ${t}: "${e}" - use "\\\\${e}" to match literal characters`,bN=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");t=bZ[t]||t;let r={...e},o=typeof r.maxLength=="number"?Math.min(DS,r.maxLength):DS,a=t.length;if(a>o)throw new SyntaxError(`Input length: ${a}, exceeds maximum allowed length: ${o}`);let n={type:"bos",value:"",output:r.prepend||""},u=[n],A=r.capture?"":"?:",p=sl.isWindows(e),h=vS.globChars(p),E=vS.extglobChars(h),{DOT_LITERAL:w,PLUS_LITERAL:v,SLASH_LITERAL:b,ONE_CHAR:C,DOTS_SLASH:R,NO_DOT:L,NO_DOT_SLASH:_,NO_DOTS_SLASH:V,QMARK:re,QMARK_NO_DOT:oe,STAR:pe,START_ANCHOR:he}=h,ve=x=>`(${A}(?:(?!${he}${x.dot?R:w}).)*?)`,ge=r.dot?"":L,le=r.dot?re:oe,Pe=r.bash===!0?ve(r):pe;r.capture&&(Pe=`(${Pe})`),typeof r.noext=="boolean"&&(r.noextglob=r.noext);let g={input:t,index:-1,start:0,dot:r.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:u};t=sl.removePrefix(t,g),a=t.length;let De=[],Ce=[],de=[],ne=n,Z,me=()=>g.index===a-1,be=g.peek=(x=1)=>t[g.index+x],ut=g.advance=()=>t[++g.index]||"",H=()=>t.slice(g.index+1),yt=(x="",I=0)=>{g.consumed+=x,g.index+=I},Me=x=>{g.output+=x.output!=null?x.output:x.value,yt(x.value)},Te=()=>{let x=1;for(;be()==="!"&&(be(2)!=="("||be(3)==="?");)ut(),g.start++,x++;return x%2===0?!1:(g.negated=!0,g.start++,!0)},Qe=x=>{g[x]++,de.push(x)},_e=x=>{g[x]--,de.pop()},qe=x=>{if(ne.type==="globstar"){let I=g.braces>0&&(x.type==="comma"||x.type==="brace"),P=x.extglob===!0||De.length&&(x.type==="pipe"||x.type==="paren");x.type!=="slash"&&x.type!=="paren"&&!I&&!P&&(g.output=g.output.slice(0,-ne.output.length),ne.type="star",ne.value="*",ne.output=Pe,g.output+=ne.output)}if(De.length&&x.type!=="paren"&&(De[De.length-1].inner+=x.value),(x.value||x.output)&&Me(x),ne&&ne.type==="text"&&x.type==="text"){ne.value+=x.value,ne.output=(ne.output||"")+x.value;return}x.prev=ne,u.push(x),ne=x},At=(x,I)=>{let P={...E[I],conditions:1,inner:""};P.prev=ne,P.parens=g.parens,P.output=g.output;let y=(r.capture?"(":"")+P.open;Qe("parens"),qe({type:x,value:I,output:g.output?"":C}),qe({type:"paren",extglob:!0,value:ut(),output:y}),De.push(P)},Oe=x=>{let I=x.close+(r.capture?")":""),P;if(x.type==="negate"){let y=Pe;if(x.inner&&x.inner.length>1&&x.inner.includes("/")&&(y=ve(r)),(y!==Pe||me()||/^\)+$/.test(H()))&&(I=x.close=`)$))${y}`),x.inner.includes("*")&&(P=H())&&/^\.[^\\/.]+$/.test(P)){let F=bN(P,{...e,fastpaths:!1}).output;I=x.close=`)${F})${y})`}x.prev.type==="bos"&&(g.negatedExtglob=!0)}qe({type:"paren",extglob:!0,value:Z,output:I}),_e("parens")};if(r.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(t)){let x=!1,I=t.replace($5e,(P,y,F,J,X,$)=>J==="\\"?(x=!0,P):J==="?"?y?y+J+(X?re.repeat(X.length):""):$===0?le+(X?re.repeat(X.length):""):re.repeat(F.length):J==="."?w.repeat(F.length):J==="*"?y?y+J+(X?Pe:""):Pe:y?P:`\\${P}`);return x===!0&&(r.unescape===!0?I=I.replace(/\\/g,""):I=I.replace(/\\+/g,P=>P.length%2===0?"\\\\":P?"\\":"")),I===t&&r.contains===!0?(g.output=t,g):(g.output=sl.wrapOutput(I,g,e),g)}for(;!me();){if(Z=ut(),Z==="\0")continue;if(Z==="\\"){let P=be();if(P==="/"&&r.bash!==!0||P==="."||P===";")continue;if(!P){Z+="\\",qe({type:"text",value:Z});continue}let y=/^\\+/.exec(H()),F=0;if(y&&y[0].length>2&&(F=y[0].length,g.index+=F,F%2!==0&&(Z+="\\")),r.unescape===!0?Z=ut():Z+=ut(),g.brackets===0){qe({type:"text",value:Z});continue}}if(g.brackets>0&&(Z!=="]"||ne.value==="["||ne.value==="[^")){if(r.posix!==!1&&Z===":"){let P=ne.value.slice(1);if(P.includes("[")&&(ne.posix=!0,P.includes(":"))){let y=ne.value.lastIndexOf("["),F=ne.value.slice(0,y),J=ne.value.slice(y+2),X=X5e[J];if(X){ne.value=F+X,g.backtrack=!0,ut(),!n.output&&u.indexOf(ne)===1&&(n.output=C);continue}}}(Z==="["&&be()!==":"||Z==="-"&&be()==="]")&&(Z=`\\${Z}`),Z==="]"&&(ne.value==="["||ne.value==="[^")&&(Z=`\\${Z}`),r.posix===!0&&Z==="!"&&ne.value==="["&&(Z="^"),ne.value+=Z,Me({value:Z});continue}if(g.quotes===1&&Z!=='"'){Z=sl.escapeRegex(Z),ne.value+=Z,Me({value:Z});continue}if(Z==='"'){g.quotes=g.quotes===1?0:1,r.keepQuotes===!0&&qe({type:"text",value:Z});continue}if(Z==="("){Qe("parens"),qe({type:"paren",value:Z});continue}if(Z===")"){if(g.parens===0&&r.strictBrackets===!0)throw new SyntaxError(Ny("opening","("));let P=De[De.length-1];if(P&&g.parens===P.parens+1){Oe(De.pop());continue}qe({type:"paren",value:Z,output:g.parens?")":"\\)"}),_e("parens");continue}if(Z==="["){if(r.nobracket===!0||!H().includes("]")){if(r.nobracket!==!0&&r.strictBrackets===!0)throw new SyntaxError(Ny("closing","]"));Z=`\\${Z}`}else Qe("brackets");qe({type:"bracket",value:Z});continue}if(Z==="]"){if(r.nobracket===!0||ne&&ne.type==="bracket"&&ne.value.length===1){qe({type:"text",value:Z,output:`\\${Z}`});continue}if(g.brackets===0){if(r.strictBrackets===!0)throw new SyntaxError(Ny("opening","["));qe({type:"text",value:Z,output:`\\${Z}`});continue}_e("brackets");let P=ne.value.slice(1);if(ne.posix!==!0&&P[0]==="^"&&!P.includes("/")&&(Z=`/${Z}`),ne.value+=Z,Me({value:Z}),r.literalBrackets===!1||sl.hasRegexChars(P))continue;let y=sl.escapeRegex(ne.value);if(g.output=g.output.slice(0,-ne.value.length),r.literalBrackets===!0){g.output+=y,ne.value=y;continue}ne.value=`(${A}${y}|${ne.value})`,g.output+=ne.value;continue}if(Z==="{"&&r.nobrace!==!0){Qe("braces");let P={type:"brace",value:Z,output:"(",outputIndex:g.output.length,tokensIndex:g.tokens.length};Ce.push(P),qe(P);continue}if(Z==="}"){let P=Ce[Ce.length-1];if(r.nobrace===!0||!P){qe({type:"text",value:Z,output:Z});continue}let y=")";if(P.dots===!0){let F=u.slice(),J=[];for(let X=F.length-1;X>=0&&(u.pop(),F[X].type!=="brace");X--)F[X].type!=="dots"&&J.unshift(F[X].value);y=e7e(J,r),g.backtrack=!0}if(P.comma!==!0&&P.dots!==!0){let F=g.output.slice(0,P.outputIndex),J=g.tokens.slice(P.tokensIndex);P.value=P.output="\\{",Z=y="\\}",g.output=F;for(let X of J)g.output+=X.output||X.value}qe({type:"brace",value:Z,output:y}),_e("braces"),Ce.pop();continue}if(Z==="|"){De.length>0&&De[De.length-1].conditions++,qe({type:"text",value:Z});continue}if(Z===","){let P=Z,y=Ce[Ce.length-1];y&&de[de.length-1]==="braces"&&(y.comma=!0,P="|"),qe({type:"comma",value:Z,output:P});continue}if(Z==="/"){if(ne.type==="dot"&&g.index===g.start+1){g.start=g.index+1,g.consumed="",g.output="",u.pop(),ne=n;continue}qe({type:"slash",value:Z,output:b});continue}if(Z==="."){if(g.braces>0&&ne.type==="dot"){ne.value==="."&&(ne.output=w);let P=Ce[Ce.length-1];ne.type="dots",ne.output+=Z,ne.value+=Z,P.dots=!0;continue}if(g.braces+g.parens===0&&ne.type!=="bos"&&ne.type!=="slash"){qe({type:"text",value:Z,output:w});continue}qe({type:"dot",value:Z,output:w});continue}if(Z==="?"){if(!(ne&&ne.value==="(")&&r.noextglob!==!0&&be()==="("&&be(2)!=="?"){At("qmark",Z);continue}if(ne&&ne.type==="paren"){let y=be(),F=Z;if(y==="<"&&!sl.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");(ne.value==="("&&!/[!=<:]/.test(y)||y==="<"&&!/<([!=]|\w+>)/.test(H()))&&(F=`\\${Z}`),qe({type:"text",value:Z,output:F});continue}if(r.dot!==!0&&(ne.type==="slash"||ne.type==="bos")){qe({type:"qmark",value:Z,output:oe});continue}qe({type:"qmark",value:Z,output:re});continue}if(Z==="!"){if(r.noextglob!==!0&&be()==="("&&(be(2)!=="?"||!/[!=<:]/.test(be(3)))){At("negate",Z);continue}if(r.nonegate!==!0&&g.index===0){Te();continue}}if(Z==="+"){if(r.noextglob!==!0&&be()==="("&&be(2)!=="?"){At("plus",Z);continue}if(ne&&ne.value==="("||r.regex===!1){qe({type:"plus",value:Z,output:v});continue}if(ne&&(ne.type==="bracket"||ne.type==="paren"||ne.type==="brace")||g.parens>0){qe({type:"plus",value:Z});continue}qe({type:"plus",value:v});continue}if(Z==="@"){if(r.noextglob!==!0&&be()==="("&&be(2)!=="?"){qe({type:"at",extglob:!0,value:Z,output:""});continue}qe({type:"text",value:Z});continue}if(Z!=="*"){(Z==="$"||Z==="^")&&(Z=`\\${Z}`);let P=Z5e.exec(H());P&&(Z+=P[0],g.index+=P[0].length),qe({type:"text",value:Z});continue}if(ne&&(ne.type==="globstar"||ne.star===!0)){ne.type="star",ne.star=!0,ne.value+=Z,ne.output=Pe,g.backtrack=!0,g.globstar=!0,yt(Z);continue}let x=H();if(r.noextglob!==!0&&/^\([^?]/.test(x)){At("star",Z);continue}if(ne.type==="star"){if(r.noglobstar===!0){yt(Z);continue}let P=ne.prev,y=P.prev,F=P.type==="slash"||P.type==="bos",J=y&&(y.type==="star"||y.type==="globstar");if(r.bash===!0&&(!F||x[0]&&x[0]!=="/")){qe({type:"star",value:Z,output:""});continue}let X=g.braces>0&&(P.type==="comma"||P.type==="brace"),$=De.length&&(P.type==="pipe"||P.type==="paren");if(!F&&P.type!=="paren"&&!X&&!$){qe({type:"star",value:Z,output:""});continue}for(;x.slice(0,3)==="/**";){let ie=t[g.index+4];if(ie&&ie!=="/")break;x=x.slice(3),yt("/**",3)}if(P.type==="bos"&&me()){ne.type="globstar",ne.value+=Z,ne.output=ve(r),g.output=ne.output,g.globstar=!0,yt(Z);continue}if(P.type==="slash"&&P.prev.type!=="bos"&&!J&&me()){g.output=g.output.slice(0,-(P.output+ne.output).length),P.output=`(?:${P.output}`,ne.type="globstar",ne.output=ve(r)+(r.strictSlashes?")":"|$)"),ne.value+=Z,g.globstar=!0,g.output+=P.output+ne.output,yt(Z);continue}if(P.type==="slash"&&P.prev.type!=="bos"&&x[0]==="/"){let ie=x[1]!==void 0?"|$":"";g.output=g.output.slice(0,-(P.output+ne.output).length),P.output=`(?:${P.output}`,ne.type="globstar",ne.output=`${ve(r)}${b}|${b}${ie})`,ne.value+=Z,g.output+=P.output+ne.output,g.globstar=!0,yt(Z+ut()),qe({type:"slash",value:"/",output:""});continue}if(P.type==="bos"&&x[0]==="/"){ne.type="globstar",ne.value+=Z,ne.output=`(?:^|${b}|${ve(r)}${b})`,g.output=ne.output,g.globstar=!0,yt(Z+ut()),qe({type:"slash",value:"/",output:""});continue}g.output=g.output.slice(0,-ne.output.length),ne.type="globstar",ne.output=ve(r),ne.value+=Z,g.output+=ne.output,g.globstar=!0,yt(Z);continue}let I={type:"star",value:Z,output:Pe};if(r.bash===!0){I.output=".*?",(ne.type==="bos"||ne.type==="slash")&&(I.output=ge+I.output),qe(I);continue}if(ne&&(ne.type==="bracket"||ne.type==="paren")&&r.regex===!0){I.output=Z,qe(I);continue}(g.index===g.start||ne.type==="slash"||ne.type==="dot")&&(ne.type==="dot"?(g.output+=_,ne.output+=_):r.dot===!0?(g.output+=V,ne.output+=V):(g.output+=ge,ne.output+=ge),be()!=="*"&&(g.output+=C,ne.output+=C)),qe(I)}for(;g.brackets>0;){if(r.strictBrackets===!0)throw new SyntaxError(Ny("closing","]"));g.output=sl.escapeLast(g.output,"["),_e("brackets")}for(;g.parens>0;){if(r.strictBrackets===!0)throw new SyntaxError(Ny("closing",")"));g.output=sl.escapeLast(g.output,"("),_e("parens")}for(;g.braces>0;){if(r.strictBrackets===!0)throw new SyntaxError(Ny("closing","}"));g.output=sl.escapeLast(g.output,"{"),_e("braces")}if(r.strictSlashes!==!0&&(ne.type==="star"||ne.type==="bracket")&&qe({type:"maybe_slash",value:"",output:`${b}?`}),g.backtrack===!0){g.output="";for(let x of g.tokens)g.output+=x.output!=null?x.output:x.value,x.suffix&&(g.output+=x.suffix)}return g};bN.fastpaths=(t,e)=>{let r={...e},o=typeof r.maxLength=="number"?Math.min(DS,r.maxLength):DS,a=t.length;if(a>o)throw new SyntaxError(`Input length: ${a}, exceeds maximum allowed length: ${o}`);t=bZ[t]||t;let n=sl.isWindows(e),{DOT_LITERAL:u,SLASH_LITERAL:A,ONE_CHAR:p,DOTS_SLASH:h,NO_DOT:E,NO_DOTS:w,NO_DOTS_SLASH:v,STAR:b,START_ANCHOR:C}=vS.globChars(n),R=r.dot?w:E,L=r.dot?v:E,_=r.capture?"":"?:",V={negated:!1,prefix:""},re=r.bash===!0?".*?":b;r.capture&&(re=`(${re})`);let oe=ge=>ge.noglobstar===!0?re:`(${_}(?:(?!${C}${ge.dot?h:u}).)*?)`,pe=ge=>{switch(ge){case"*":return`${R}${p}${re}`;case".*":return`${u}${p}${re}`;case"*.*":return`${R}${re}${u}${p}${re}`;case"*/*":return`${R}${re}${A}${p}${L}${re}`;case"**":return R+oe(r);case"**/*":return`(?:${R}${oe(r)}${A})?${L}${p}${re}`;case"**/*.*":return`(?:${R}${oe(r)}${A})?${L}${re}${u}${p}${re}`;case"**/.*":return`(?:${R}${oe(r)}${A})?${u}${p}${re}`;default:{let le=/^(.*?)\.(\w+)$/.exec(ge);if(!le)return;let Pe=pe(le[1]);return Pe?Pe+u+le[2]:void 0}}},he=sl.removePrefix(t,V),ve=pe(he);return ve&&r.strictSlashes!==!0&&(ve+=`${A}?`),ve};QZ.exports=bN});var RZ=U((Fkt,FZ)=>{"use strict";var t7e=Ie("path"),r7e=xZ(),QN=kZ(),kN=Ew(),n7e=Cw(),i7e=t=>t&&typeof t=="object"&&!Array.isArray(t),Oi=(t,e,r=!1)=>{if(Array.isArray(t)){let E=t.map(v=>Oi(v,e,r));return v=>{for(let b of E){let C=b(v);if(C)return C}return!1}}let o=i7e(t)&&t.tokens&&t.input;if(t===""||typeof t!="string"&&!o)throw new TypeError("Expected pattern to be a non-empty string");let a=e||{},n=kN.isWindows(e),u=o?Oi.compileRe(t,e):Oi.makeRe(t,e,!1,!0),A=u.state;delete u.state;let p=()=>!1;if(a.ignore){let E={...e,ignore:null,onMatch:null,onResult:null};p=Oi(a.ignore,E,r)}let h=(E,w=!1)=>{let{isMatch:v,match:b,output:C}=Oi.test(E,u,e,{glob:t,posix:n}),R={glob:t,state:A,regex:u,posix:n,input:E,output:C,match:b,isMatch:v};return typeof a.onResult=="function"&&a.onResult(R),v===!1?(R.isMatch=!1,w?R:!1):p(E)?(typeof a.onIgnore=="function"&&a.onIgnore(R),R.isMatch=!1,w?R:!1):(typeof a.onMatch=="function"&&a.onMatch(R),w?R:!0)};return r&&(h.state=A),h};Oi.test=(t,e,r,{glob:o,posix:a}={})=>{if(typeof t!="string")throw new TypeError("Expected input to be a string");if(t==="")return{isMatch:!1,output:""};let n=r||{},u=n.format||(a?kN.toPosixSlashes:null),A=t===o,p=A&&u?u(t):t;return A===!1&&(p=u?u(t):t,A=p===o),(A===!1||n.capture===!0)&&(n.matchBase===!0||n.basename===!0?A=Oi.matchBase(t,e,r,a):A=e.exec(p)),{isMatch:Boolean(A),match:A,output:p}};Oi.matchBase=(t,e,r,o=kN.isWindows(r))=>(e instanceof RegExp?e:Oi.makeRe(e,r)).test(t7e.basename(t));Oi.isMatch=(t,e,r)=>Oi(e,r)(t);Oi.parse=(t,e)=>Array.isArray(t)?t.map(r=>Oi.parse(r,e)):QN(t,{...e,fastpaths:!1});Oi.scan=(t,e)=>r7e(t,e);Oi.compileRe=(t,e,r=!1,o=!1)=>{if(r===!0)return t.output;let a=e||{},n=a.contains?"":"^",u=a.contains?"":"$",A=`${n}(?:${t.output})${u}`;t&&t.negated===!0&&(A=`^(?!${A}).*$`);let p=Oi.toRegex(A,e);return o===!0&&(p.state=t),p};Oi.makeRe=(t,e={},r=!1,o=!1)=>{if(!t||typeof t!="string")throw new TypeError("Expected a non-empty string");let a={negated:!1,fastpaths:!0};return e.fastpaths!==!1&&(t[0]==="."||t[0]==="*")&&(a.output=QN.fastpaths(t,e)),a.output||(a=QN(t,e)),Oi.compileRe(a,e,r,o)};Oi.toRegex=(t,e)=>{try{let r=e||{};return new RegExp(t,r.flags||(r.nocase?"i":""))}catch(r){if(e&&e.debug===!0)throw r;return/$^/}};Oi.constants=n7e;FZ.exports=Oi});var NZ=U((Rkt,TZ)=>{"use strict";TZ.exports=RZ()});var Jo=U((Tkt,UZ)=>{"use strict";var OZ=Ie("util"),MZ=gZ(),zu=NZ(),FN=Ew(),LZ=t=>t===""||t==="./",hi=(t,e,r)=>{e=[].concat(e),t=[].concat(t);let o=new Set,a=new Set,n=new Set,u=0,A=E=>{n.add(E.output),r&&r.onResult&&r.onResult(E)};for(let E=0;E!o.has(E));if(r&&h.length===0){if(r.failglob===!0)throw new Error(`No matches found for "${e.join(", ")}"`);if(r.nonull===!0||r.nullglob===!0)return r.unescape?e.map(E=>E.replace(/\\/g,"")):e}return h};hi.match=hi;hi.matcher=(t,e)=>zu(t,e);hi.isMatch=(t,e,r)=>zu(e,r)(t);hi.any=hi.isMatch;hi.not=(t,e,r={})=>{e=[].concat(e).map(String);let o=new Set,a=[],n=A=>{r.onResult&&r.onResult(A),a.push(A.output)},u=new Set(hi(t,e,{...r,onResult:n}));for(let A of a)u.has(A)||o.add(A);return[...o]};hi.contains=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${OZ.inspect(t)}"`);if(Array.isArray(e))return e.some(o=>hi.contains(t,o,r));if(typeof e=="string"){if(LZ(t)||LZ(e))return!1;if(t.includes(e)||t.startsWith("./")&&t.slice(2).includes(e))return!0}return hi.isMatch(t,e,{...r,contains:!0})};hi.matchKeys=(t,e,r)=>{if(!FN.isObject(t))throw new TypeError("Expected the first argument to be an object");let o=hi(Object.keys(t),e,r),a={};for(let n of o)a[n]=t[n];return a};hi.some=(t,e,r)=>{let o=[].concat(t);for(let a of[].concat(e)){let n=zu(String(a),r);if(o.some(u=>n(u)))return!0}return!1};hi.every=(t,e,r)=>{let o=[].concat(t);for(let a of[].concat(e)){let n=zu(String(a),r);if(!o.every(u=>n(u)))return!1}return!0};hi.all=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${OZ.inspect(t)}"`);return[].concat(e).every(o=>zu(o,r)(t))};hi.capture=(t,e,r)=>{let o=FN.isWindows(r),n=zu.makeRe(String(t),{...r,capture:!0}).exec(o?FN.toPosixSlashes(e):e);if(n)return n.slice(1).map(u=>u===void 0?"":u)};hi.makeRe=(...t)=>zu.makeRe(...t);hi.scan=(...t)=>zu.scan(...t);hi.parse=(t,e)=>{let r=[];for(let o of[].concat(t||[]))for(let a of MZ(String(o),e))r.push(zu.parse(a,e));return r};hi.braces=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return e&&e.nobrace===!0||!/\{.*\}/.test(t)?[t]:MZ(t,e)};hi.braceExpand=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return hi.braces(t,{...e,expand:!0})};UZ.exports=hi});var HZ=U((Nkt,_Z)=>{"use strict";_Z.exports=({onlyFirst:t=!1}={})=>{let e=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(e,t?void 0:"g")}});var SS=U((Lkt,qZ)=>{"use strict";var s7e=HZ();qZ.exports=t=>typeof t=="string"?t.replace(s7e(),""):t});var GZ=U((Okt,jZ)=>{function o7e(){this.__data__=[],this.size=0}jZ.exports=o7e});var Ly=U((Mkt,WZ)=>{function a7e(t,e){return t===e||t!==t&&e!==e}WZ.exports=a7e});var ww=U((Ukt,YZ)=>{var l7e=Ly();function c7e(t,e){for(var r=t.length;r--;)if(l7e(t[r][0],e))return r;return-1}YZ.exports=c7e});var VZ=U((_kt,KZ)=>{var u7e=ww(),A7e=Array.prototype,f7e=A7e.splice;function p7e(t){var e=this.__data__,r=u7e(e,t);if(r<0)return!1;var o=e.length-1;return r==o?e.pop():f7e.call(e,r,1),--this.size,!0}KZ.exports=p7e});var zZ=U((Hkt,JZ)=>{var h7e=ww();function g7e(t){var e=this.__data__,r=h7e(e,t);return r<0?void 0:e[r][1]}JZ.exports=g7e});var ZZ=U((qkt,XZ)=>{var d7e=ww();function m7e(t){return d7e(this.__data__,t)>-1}XZ.exports=m7e});var e$=U((jkt,$Z)=>{var y7e=ww();function C7e(t,e){var r=this.__data__,o=y7e(r,t);return o<0?(++this.size,r.push([t,e])):r[o][1]=e,this}$Z.exports=C7e});var Bw=U((Gkt,t$)=>{var E7e=GZ(),I7e=VZ(),w7e=zZ(),B7e=ZZ(),v7e=e$();function Oy(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var D7e=Bw();function S7e(){this.__data__=new D7e,this.size=0}r$.exports=S7e});var s$=U((Ykt,i$)=>{function P7e(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}i$.exports=P7e});var a$=U((Kkt,o$)=>{function x7e(t){return this.__data__.get(t)}o$.exports=x7e});var c$=U((Vkt,l$)=>{function b7e(t){return this.__data__.has(t)}l$.exports=b7e});var RN=U((Jkt,u$)=>{var Q7e=typeof global=="object"&&global&&global.Object===Object&&global;u$.exports=Q7e});var Wl=U((zkt,A$)=>{var k7e=RN(),F7e=typeof self=="object"&&self&&self.Object===Object&&self,R7e=k7e||F7e||Function("return this")();A$.exports=R7e});var fd=U((Xkt,f$)=>{var T7e=Wl(),N7e=T7e.Symbol;f$.exports=N7e});var d$=U((Zkt,g$)=>{var p$=fd(),h$=Object.prototype,L7e=h$.hasOwnProperty,O7e=h$.toString,vw=p$?p$.toStringTag:void 0;function M7e(t){var e=L7e.call(t,vw),r=t[vw];try{t[vw]=void 0;var o=!0}catch{}var a=O7e.call(t);return o&&(e?t[vw]=r:delete t[vw]),a}g$.exports=M7e});var y$=U(($kt,m$)=>{var U7e=Object.prototype,_7e=U7e.toString;function H7e(t){return _7e.call(t)}m$.exports=H7e});var pd=U((eFt,I$)=>{var C$=fd(),q7e=d$(),j7e=y$(),G7e="[object Null]",W7e="[object Undefined]",E$=C$?C$.toStringTag:void 0;function Y7e(t){return t==null?t===void 0?W7e:G7e:E$&&E$ in Object(t)?q7e(t):j7e(t)}I$.exports=Y7e});var ol=U((tFt,w$)=>{function K7e(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}w$.exports=K7e});var PS=U((rFt,B$)=>{var V7e=pd(),J7e=ol(),z7e="[object AsyncFunction]",X7e="[object Function]",Z7e="[object GeneratorFunction]",$7e="[object Proxy]";function eWe(t){if(!J7e(t))return!1;var e=V7e(t);return e==X7e||e==Z7e||e==z7e||e==$7e}B$.exports=eWe});var D$=U((nFt,v$)=>{var tWe=Wl(),rWe=tWe["__core-js_shared__"];v$.exports=rWe});var x$=U((iFt,P$)=>{var TN=D$(),S$=function(){var t=/[^.]+$/.exec(TN&&TN.keys&&TN.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();function nWe(t){return!!S$&&S$ in t}P$.exports=nWe});var NN=U((sFt,b$)=>{var iWe=Function.prototype,sWe=iWe.toString;function oWe(t){if(t!=null){try{return sWe.call(t)}catch{}try{return t+""}catch{}}return""}b$.exports=oWe});var k$=U((oFt,Q$)=>{var aWe=PS(),lWe=x$(),cWe=ol(),uWe=NN(),AWe=/[\\^$.*+?()[\]{}|]/g,fWe=/^\[object .+?Constructor\]$/,pWe=Function.prototype,hWe=Object.prototype,gWe=pWe.toString,dWe=hWe.hasOwnProperty,mWe=RegExp("^"+gWe.call(dWe).replace(AWe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function yWe(t){if(!cWe(t)||lWe(t))return!1;var e=aWe(t)?mWe:fWe;return e.test(uWe(t))}Q$.exports=yWe});var R$=U((aFt,F$)=>{function CWe(t,e){return t==null?void 0:t[e]}F$.exports=CWe});var Kp=U((lFt,T$)=>{var EWe=k$(),IWe=R$();function wWe(t,e){var r=IWe(t,e);return EWe(r)?r:void 0}T$.exports=wWe});var xS=U((cFt,N$)=>{var BWe=Kp(),vWe=Wl(),DWe=BWe(vWe,"Map");N$.exports=DWe});var Dw=U((uFt,L$)=>{var SWe=Kp(),PWe=SWe(Object,"create");L$.exports=PWe});var U$=U((AFt,M$)=>{var O$=Dw();function xWe(){this.__data__=O$?O$(null):{},this.size=0}M$.exports=xWe});var H$=U((fFt,_$)=>{function bWe(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}_$.exports=bWe});var j$=U((pFt,q$)=>{var QWe=Dw(),kWe="__lodash_hash_undefined__",FWe=Object.prototype,RWe=FWe.hasOwnProperty;function TWe(t){var e=this.__data__;if(QWe){var r=e[t];return r===kWe?void 0:r}return RWe.call(e,t)?e[t]:void 0}q$.exports=TWe});var W$=U((hFt,G$)=>{var NWe=Dw(),LWe=Object.prototype,OWe=LWe.hasOwnProperty;function MWe(t){var e=this.__data__;return NWe?e[t]!==void 0:OWe.call(e,t)}G$.exports=MWe});var K$=U((gFt,Y$)=>{var UWe=Dw(),_We="__lodash_hash_undefined__";function HWe(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=UWe&&e===void 0?_We:e,this}Y$.exports=HWe});var J$=U((dFt,V$)=>{var qWe=U$(),jWe=H$(),GWe=j$(),WWe=W$(),YWe=K$();function My(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var z$=J$(),KWe=Bw(),VWe=xS();function JWe(){this.size=0,this.__data__={hash:new z$,map:new(VWe||KWe),string:new z$}}X$.exports=JWe});var eee=U((yFt,$$)=>{function zWe(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}$$.exports=zWe});var Sw=U((CFt,tee)=>{var XWe=eee();function ZWe(t,e){var r=t.__data__;return XWe(e)?r[typeof e=="string"?"string":"hash"]:r.map}tee.exports=ZWe});var nee=U((EFt,ree)=>{var $We=Sw();function eYe(t){var e=$We(this,t).delete(t);return this.size-=e?1:0,e}ree.exports=eYe});var see=U((IFt,iee)=>{var tYe=Sw();function rYe(t){return tYe(this,t).get(t)}iee.exports=rYe});var aee=U((wFt,oee)=>{var nYe=Sw();function iYe(t){return nYe(this,t).has(t)}oee.exports=iYe});var cee=U((BFt,lee)=>{var sYe=Sw();function oYe(t,e){var r=sYe(this,t),o=r.size;return r.set(t,e),this.size+=r.size==o?0:1,this}lee.exports=oYe});var bS=U((vFt,uee)=>{var aYe=Z$(),lYe=nee(),cYe=see(),uYe=aee(),AYe=cee();function Uy(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var fYe=Bw(),pYe=xS(),hYe=bS(),gYe=200;function dYe(t,e){var r=this.__data__;if(r instanceof fYe){var o=r.__data__;if(!pYe||o.length{var mYe=Bw(),yYe=n$(),CYe=s$(),EYe=a$(),IYe=c$(),wYe=fee();function _y(t){var e=this.__data__=new mYe(t);this.size=e.size}_y.prototype.clear=yYe;_y.prototype.delete=CYe;_y.prototype.get=EYe;_y.prototype.has=IYe;_y.prototype.set=wYe;pee.exports=_y});var gee=U((PFt,hee)=>{var BYe="__lodash_hash_undefined__";function vYe(t){return this.__data__.set(t,BYe),this}hee.exports=vYe});var mee=U((xFt,dee)=>{function DYe(t){return this.__data__.has(t)}dee.exports=DYe});var Cee=U((bFt,yee)=>{var SYe=bS(),PYe=gee(),xYe=mee();function kS(t){var e=-1,r=t==null?0:t.length;for(this.__data__=new SYe;++e{function bYe(t,e){for(var r=-1,o=t==null?0:t.length;++r{function QYe(t,e){return t.has(e)}wee.exports=QYe});var LN=U((FFt,vee)=>{var kYe=Cee(),FYe=Iee(),RYe=Bee(),TYe=1,NYe=2;function LYe(t,e,r,o,a,n){var u=r&TYe,A=t.length,p=e.length;if(A!=p&&!(u&&p>A))return!1;var h=n.get(t),E=n.get(e);if(h&&E)return h==e&&E==t;var w=-1,v=!0,b=r&NYe?new kYe:void 0;for(n.set(t,e),n.set(e,t);++w{var OYe=Wl(),MYe=OYe.Uint8Array;Dee.exports=MYe});var Pee=U((TFt,See)=>{function UYe(t){var e=-1,r=Array(t.size);return t.forEach(function(o,a){r[++e]=[a,o]}),r}See.exports=UYe});var bee=U((NFt,xee)=>{function _Ye(t){var e=-1,r=Array(t.size);return t.forEach(function(o){r[++e]=o}),r}xee.exports=_Ye});var Tee=U((LFt,Ree)=>{var Qee=fd(),kee=ON(),HYe=Ly(),qYe=LN(),jYe=Pee(),GYe=bee(),WYe=1,YYe=2,KYe="[object Boolean]",VYe="[object Date]",JYe="[object Error]",zYe="[object Map]",XYe="[object Number]",ZYe="[object RegExp]",$Ye="[object Set]",eKe="[object String]",tKe="[object Symbol]",rKe="[object ArrayBuffer]",nKe="[object DataView]",Fee=Qee?Qee.prototype:void 0,MN=Fee?Fee.valueOf:void 0;function iKe(t,e,r,o,a,n,u){switch(r){case nKe:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case rKe:return!(t.byteLength!=e.byteLength||!n(new kee(t),new kee(e)));case KYe:case VYe:case XYe:return HYe(+t,+e);case JYe:return t.name==e.name&&t.message==e.message;case ZYe:case eKe:return t==e+"";case zYe:var A=jYe;case $Ye:var p=o&WYe;if(A||(A=GYe),t.size!=e.size&&!p)return!1;var h=u.get(t);if(h)return h==e;o|=YYe,u.set(t,e);var E=qYe(A(t),A(e),o,a,n,u);return u.delete(t),E;case tKe:if(MN)return MN.call(t)==MN.call(e)}return!1}Ree.exports=iKe});var RS=U((OFt,Nee)=>{function sKe(t,e){for(var r=-1,o=e.length,a=t.length;++r{var oKe=Array.isArray;Lee.exports=oKe});var UN=U((UFt,Oee)=>{var aKe=RS(),lKe=Yl();function cKe(t,e,r){var o=e(t);return lKe(t)?o:aKe(o,r(t))}Oee.exports=cKe});var Uee=U((_Ft,Mee)=>{function uKe(t,e){for(var r=-1,o=t==null?0:t.length,a=0,n=[];++r{function AKe(){return[]}_ee.exports=AKe});var TS=U((qFt,qee)=>{var fKe=Uee(),pKe=_N(),hKe=Object.prototype,gKe=hKe.propertyIsEnumerable,Hee=Object.getOwnPropertySymbols,dKe=Hee?function(t){return t==null?[]:(t=Object(t),fKe(Hee(t),function(e){return gKe.call(t,e)}))}:pKe;qee.exports=dKe});var Gee=U((jFt,jee)=>{function mKe(t,e){for(var r=-1,o=Array(t);++r{function yKe(t){return t!=null&&typeof t=="object"}Wee.exports=yKe});var Kee=U((WFt,Yee)=>{var CKe=pd(),EKe=Xu(),IKe="[object Arguments]";function wKe(t){return EKe(t)&&CKe(t)==IKe}Yee.exports=wKe});var Pw=U((YFt,zee)=>{var Vee=Kee(),BKe=Xu(),Jee=Object.prototype,vKe=Jee.hasOwnProperty,DKe=Jee.propertyIsEnumerable,SKe=Vee(function(){return arguments}())?Vee:function(t){return BKe(t)&&vKe.call(t,"callee")&&!DKe.call(t,"callee")};zee.exports=SKe});var Zee=U((KFt,Xee)=>{function PKe(){return!1}Xee.exports=PKe});var bw=U((xw,Hy)=>{var xKe=Wl(),bKe=Zee(),tte=typeof xw=="object"&&xw&&!xw.nodeType&&xw,$ee=tte&&typeof Hy=="object"&&Hy&&!Hy.nodeType&&Hy,QKe=$ee&&$ee.exports===tte,ete=QKe?xKe.Buffer:void 0,kKe=ete?ete.isBuffer:void 0,FKe=kKe||bKe;Hy.exports=FKe});var Qw=U((VFt,rte)=>{var RKe=9007199254740991,TKe=/^(?:0|[1-9]\d*)$/;function NKe(t,e){var r=typeof t;return e=e??RKe,!!e&&(r=="number"||r!="symbol"&&TKe.test(t))&&t>-1&&t%1==0&&t{var LKe=9007199254740991;function OKe(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=LKe}nte.exports=OKe});var ste=U((zFt,ite)=>{var MKe=pd(),UKe=NS(),_Ke=Xu(),HKe="[object Arguments]",qKe="[object Array]",jKe="[object Boolean]",GKe="[object Date]",WKe="[object Error]",YKe="[object Function]",KKe="[object Map]",VKe="[object Number]",JKe="[object Object]",zKe="[object RegExp]",XKe="[object Set]",ZKe="[object String]",$Ke="[object WeakMap]",eVe="[object ArrayBuffer]",tVe="[object DataView]",rVe="[object Float32Array]",nVe="[object Float64Array]",iVe="[object Int8Array]",sVe="[object Int16Array]",oVe="[object Int32Array]",aVe="[object Uint8Array]",lVe="[object Uint8ClampedArray]",cVe="[object Uint16Array]",uVe="[object Uint32Array]",oi={};oi[rVe]=oi[nVe]=oi[iVe]=oi[sVe]=oi[oVe]=oi[aVe]=oi[lVe]=oi[cVe]=oi[uVe]=!0;oi[HKe]=oi[qKe]=oi[eVe]=oi[jKe]=oi[tVe]=oi[GKe]=oi[WKe]=oi[YKe]=oi[KKe]=oi[VKe]=oi[JKe]=oi[zKe]=oi[XKe]=oi[ZKe]=oi[$Ke]=!1;function AVe(t){return _Ke(t)&&UKe(t.length)&&!!oi[MKe(t)]}ite.exports=AVe});var LS=U((XFt,ote)=>{function fVe(t){return function(e){return t(e)}}ote.exports=fVe});var OS=U((kw,qy)=>{var pVe=RN(),ate=typeof kw=="object"&&kw&&!kw.nodeType&&kw,Fw=ate&&typeof qy=="object"&&qy&&!qy.nodeType&&qy,hVe=Fw&&Fw.exports===ate,HN=hVe&&pVe.process,gVe=function(){try{var t=Fw&&Fw.require&&Fw.require("util").types;return t||HN&&HN.binding&&HN.binding("util")}catch{}}();qy.exports=gVe});var MS=U((ZFt,ute)=>{var dVe=ste(),mVe=LS(),lte=OS(),cte=lte&<e.isTypedArray,yVe=cte?mVe(cte):dVe;ute.exports=yVe});var qN=U(($Ft,Ate)=>{var CVe=Gee(),EVe=Pw(),IVe=Yl(),wVe=bw(),BVe=Qw(),vVe=MS(),DVe=Object.prototype,SVe=DVe.hasOwnProperty;function PVe(t,e){var r=IVe(t),o=!r&&EVe(t),a=!r&&!o&&wVe(t),n=!r&&!o&&!a&&vVe(t),u=r||o||a||n,A=u?CVe(t.length,String):[],p=A.length;for(var h in t)(e||SVe.call(t,h))&&!(u&&(h=="length"||a&&(h=="offset"||h=="parent")||n&&(h=="buffer"||h=="byteLength"||h=="byteOffset")||BVe(h,p)))&&A.push(h);return A}Ate.exports=PVe});var US=U((eRt,fte)=>{var xVe=Object.prototype;function bVe(t){var e=t&&t.constructor,r=typeof e=="function"&&e.prototype||xVe;return t===r}fte.exports=bVe});var jN=U((tRt,pte)=>{function QVe(t,e){return function(r){return t(e(r))}}pte.exports=QVe});var gte=U((rRt,hte)=>{var kVe=jN(),FVe=kVe(Object.keys,Object);hte.exports=FVe});var mte=U((nRt,dte)=>{var RVe=US(),TVe=gte(),NVe=Object.prototype,LVe=NVe.hasOwnProperty;function OVe(t){if(!RVe(t))return TVe(t);var e=[];for(var r in Object(t))LVe.call(t,r)&&r!="constructor"&&e.push(r);return e}dte.exports=OVe});var Rw=U((iRt,yte)=>{var MVe=PS(),UVe=NS();function _Ve(t){return t!=null&&UVe(t.length)&&!MVe(t)}yte.exports=_Ve});var _S=U((sRt,Cte)=>{var HVe=qN(),qVe=mte(),jVe=Rw();function GVe(t){return jVe(t)?HVe(t):qVe(t)}Cte.exports=GVe});var GN=U((oRt,Ete)=>{var WVe=UN(),YVe=TS(),KVe=_S();function VVe(t){return WVe(t,KVe,YVe)}Ete.exports=VVe});var Bte=U((aRt,wte)=>{var Ite=GN(),JVe=1,zVe=Object.prototype,XVe=zVe.hasOwnProperty;function ZVe(t,e,r,o,a,n){var u=r&JVe,A=Ite(t),p=A.length,h=Ite(e),E=h.length;if(p!=E&&!u)return!1;for(var w=p;w--;){var v=A[w];if(!(u?v in e:XVe.call(e,v)))return!1}var b=n.get(t),C=n.get(e);if(b&&C)return b==e&&C==t;var R=!0;n.set(t,e),n.set(e,t);for(var L=u;++w{var $Ve=Kp(),eJe=Wl(),tJe=$Ve(eJe,"DataView");vte.exports=tJe});var Pte=U((cRt,Ste)=>{var rJe=Kp(),nJe=Wl(),iJe=rJe(nJe,"Promise");Ste.exports=iJe});var bte=U((uRt,xte)=>{var sJe=Kp(),oJe=Wl(),aJe=sJe(oJe,"Set");xte.exports=aJe});var kte=U((ARt,Qte)=>{var lJe=Kp(),cJe=Wl(),uJe=lJe(cJe,"WeakMap");Qte.exports=uJe});var Tw=U((fRt,Mte)=>{var WN=Dte(),YN=xS(),KN=Pte(),VN=bte(),JN=kte(),Ote=pd(),jy=NN(),Fte="[object Map]",AJe="[object Object]",Rte="[object Promise]",Tte="[object Set]",Nte="[object WeakMap]",Lte="[object DataView]",fJe=jy(WN),pJe=jy(YN),hJe=jy(KN),gJe=jy(VN),dJe=jy(JN),hd=Ote;(WN&&hd(new WN(new ArrayBuffer(1)))!=Lte||YN&&hd(new YN)!=Fte||KN&&hd(KN.resolve())!=Rte||VN&&hd(new VN)!=Tte||JN&&hd(new JN)!=Nte)&&(hd=function(t){var e=Ote(t),r=e==AJe?t.constructor:void 0,o=r?jy(r):"";if(o)switch(o){case fJe:return Lte;case pJe:return Fte;case hJe:return Rte;case gJe:return Tte;case dJe:return Nte}return e});Mte.exports=hd});var Yte=U((pRt,Wte)=>{var zN=QS(),mJe=LN(),yJe=Tee(),CJe=Bte(),Ute=Tw(),_te=Yl(),Hte=bw(),EJe=MS(),IJe=1,qte="[object Arguments]",jte="[object Array]",HS="[object Object]",wJe=Object.prototype,Gte=wJe.hasOwnProperty;function BJe(t,e,r,o,a,n){var u=_te(t),A=_te(e),p=u?jte:Ute(t),h=A?jte:Ute(e);p=p==qte?HS:p,h=h==qte?HS:h;var E=p==HS,w=h==HS,v=p==h;if(v&&Hte(t)){if(!Hte(e))return!1;u=!0,E=!1}if(v&&!E)return n||(n=new zN),u||EJe(t)?mJe(t,e,r,o,a,n):yJe(t,e,p,r,o,a,n);if(!(r&IJe)){var b=E&&Gte.call(t,"__wrapped__"),C=w&&Gte.call(e,"__wrapped__");if(b||C){var R=b?t.value():t,L=C?e.value():e;return n||(n=new zN),a(R,L,r,o,n)}}return v?(n||(n=new zN),CJe(t,e,r,o,a,n)):!1}Wte.exports=BJe});var zte=U((hRt,Jte)=>{var vJe=Yte(),Kte=Xu();function Vte(t,e,r,o,a){return t===e?!0:t==null||e==null||!Kte(t)&&!Kte(e)?t!==t&&e!==e:vJe(t,e,r,o,Vte,a)}Jte.exports=Vte});var Zte=U((gRt,Xte)=>{var DJe=zte();function SJe(t,e){return DJe(t,e)}Xte.exports=SJe});var XN=U((dRt,$te)=>{var PJe=Kp(),xJe=function(){try{var t=PJe(Object,"defineProperty");return t({},"",{}),t}catch{}}();$te.exports=xJe});var qS=U((mRt,tre)=>{var ere=XN();function bJe(t,e,r){e=="__proto__"&&ere?ere(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}tre.exports=bJe});var ZN=U((yRt,rre)=>{var QJe=qS(),kJe=Ly();function FJe(t,e,r){(r!==void 0&&!kJe(t[e],r)||r===void 0&&!(e in t))&&QJe(t,e,r)}rre.exports=FJe});var ire=U((CRt,nre)=>{function RJe(t){return function(e,r,o){for(var a=-1,n=Object(e),u=o(e),A=u.length;A--;){var p=u[t?A:++a];if(r(n[p],p,n)===!1)break}return e}}nre.exports=RJe});var ore=U((ERt,sre)=>{var TJe=ire(),NJe=TJe();sre.exports=NJe});var $N=U((Nw,Gy)=>{var LJe=Wl(),ure=typeof Nw=="object"&&Nw&&!Nw.nodeType&&Nw,are=ure&&typeof Gy=="object"&&Gy&&!Gy.nodeType&&Gy,OJe=are&&are.exports===ure,lre=OJe?LJe.Buffer:void 0,cre=lre?lre.allocUnsafe:void 0;function MJe(t,e){if(e)return t.slice();var r=t.length,o=cre?cre(r):new t.constructor(r);return t.copy(o),o}Gy.exports=MJe});var jS=U((IRt,fre)=>{var Are=ON();function UJe(t){var e=new t.constructor(t.byteLength);return new Are(e).set(new Are(t)),e}fre.exports=UJe});var eL=U((wRt,pre)=>{var _Je=jS();function HJe(t,e){var r=e?_Je(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}pre.exports=HJe});var GS=U((BRt,hre)=>{function qJe(t,e){var r=-1,o=t.length;for(e||(e=Array(o));++r{var jJe=ol(),gre=Object.create,GJe=function(){function t(){}return function(e){if(!jJe(e))return{};if(gre)return gre(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}();dre.exports=GJe});var WS=U((DRt,yre)=>{var WJe=jN(),YJe=WJe(Object.getPrototypeOf,Object);yre.exports=YJe});var tL=U((SRt,Cre)=>{var KJe=mre(),VJe=WS(),JJe=US();function zJe(t){return typeof t.constructor=="function"&&!JJe(t)?KJe(VJe(t)):{}}Cre.exports=zJe});var Ire=U((PRt,Ere)=>{var XJe=Rw(),ZJe=Xu();function $Je(t){return ZJe(t)&&XJe(t)}Ere.exports=$Je});var rL=U((xRt,Bre)=>{var eze=pd(),tze=WS(),rze=Xu(),nze="[object Object]",ize=Function.prototype,sze=Object.prototype,wre=ize.toString,oze=sze.hasOwnProperty,aze=wre.call(Object);function lze(t){if(!rze(t)||eze(t)!=nze)return!1;var e=tze(t);if(e===null)return!0;var r=oze.call(e,"constructor")&&e.constructor;return typeof r=="function"&&r instanceof r&&wre.call(r)==aze}Bre.exports=lze});var nL=U((bRt,vre)=>{function cze(t,e){if(!(e==="constructor"&&typeof t[e]=="function")&&e!="__proto__")return t[e]}vre.exports=cze});var YS=U((QRt,Dre)=>{var uze=qS(),Aze=Ly(),fze=Object.prototype,pze=fze.hasOwnProperty;function hze(t,e,r){var o=t[e];(!(pze.call(t,e)&&Aze(o,r))||r===void 0&&!(e in t))&&uze(t,e,r)}Dre.exports=hze});var gd=U((kRt,Sre)=>{var gze=YS(),dze=qS();function mze(t,e,r,o){var a=!r;r||(r={});for(var n=-1,u=e.length;++n{function yze(t){var e=[];if(t!=null)for(var r in Object(t))e.push(r);return e}Pre.exports=yze});var Qre=U((RRt,bre)=>{var Cze=ol(),Eze=US(),Ize=xre(),wze=Object.prototype,Bze=wze.hasOwnProperty;function vze(t){if(!Cze(t))return Ize(t);var e=Eze(t),r=[];for(var o in t)o=="constructor"&&(e||!Bze.call(t,o))||r.push(o);return r}bre.exports=vze});var Wy=U((TRt,kre)=>{var Dze=qN(),Sze=Qre(),Pze=Rw();function xze(t){return Pze(t)?Dze(t,!0):Sze(t)}kre.exports=xze});var Rre=U((NRt,Fre)=>{var bze=gd(),Qze=Wy();function kze(t){return bze(t,Qze(t))}Fre.exports=kze});var Ure=U((LRt,Mre)=>{var Tre=ZN(),Fze=$N(),Rze=eL(),Tze=GS(),Nze=tL(),Nre=Pw(),Lre=Yl(),Lze=Ire(),Oze=bw(),Mze=PS(),Uze=ol(),_ze=rL(),Hze=MS(),Ore=nL(),qze=Rre();function jze(t,e,r,o,a,n,u){var A=Ore(t,r),p=Ore(e,r),h=u.get(p);if(h){Tre(t,r,h);return}var E=n?n(A,p,r+"",t,e,u):void 0,w=E===void 0;if(w){var v=Lre(p),b=!v&&Oze(p),C=!v&&!b&&Hze(p);E=p,v||b||C?Lre(A)?E=A:Lze(A)?E=Tze(A):b?(w=!1,E=Fze(p,!0)):C?(w=!1,E=Rze(p,!0)):E=[]:_ze(p)||Nre(p)?(E=A,Nre(A)?E=qze(A):(!Uze(A)||Mze(A))&&(E=Nze(p))):w=!1}w&&(u.set(p,E),a(E,p,o,n,u),u.delete(p)),Tre(t,r,E)}Mre.exports=jze});var qre=U((ORt,Hre)=>{var Gze=QS(),Wze=ZN(),Yze=ore(),Kze=Ure(),Vze=ol(),Jze=Wy(),zze=nL();function _re(t,e,r,o,a){t!==e&&Yze(e,function(n,u){if(a||(a=new Gze),Vze(n))Kze(t,e,u,r,_re,o,a);else{var A=o?o(zze(t,u),n,u+"",t,e,a):void 0;A===void 0&&(A=n),Wze(t,u,A)}},Jze)}Hre.exports=_re});var iL=U((MRt,jre)=>{function Xze(t){return t}jre.exports=Xze});var Wre=U((URt,Gre)=>{function Zze(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}Gre.exports=Zze});var sL=U((_Rt,Kre)=>{var $ze=Wre(),Yre=Math.max;function eXe(t,e,r){return e=Yre(e===void 0?t.length-1:e,0),function(){for(var o=arguments,a=-1,n=Yre(o.length-e,0),u=Array(n);++a{function tXe(t){return function(){return t}}Vre.exports=tXe});var Zre=U((qRt,Xre)=>{var rXe=Jre(),zre=XN(),nXe=iL(),iXe=zre?function(t,e){return zre(t,"toString",{configurable:!0,enumerable:!1,value:rXe(e),writable:!0})}:nXe;Xre.exports=iXe});var ene=U((jRt,$re)=>{var sXe=800,oXe=16,aXe=Date.now;function lXe(t){var e=0,r=0;return function(){var o=aXe(),a=oXe-(o-r);if(r=o,a>0){if(++e>=sXe)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}$re.exports=lXe});var oL=U((GRt,tne)=>{var cXe=Zre(),uXe=ene(),AXe=uXe(cXe);tne.exports=AXe});var nne=U((WRt,rne)=>{var fXe=iL(),pXe=sL(),hXe=oL();function gXe(t,e){return hXe(pXe(t,e,fXe),t+"")}rne.exports=gXe});var sne=U((YRt,ine)=>{var dXe=Ly(),mXe=Rw(),yXe=Qw(),CXe=ol();function EXe(t,e,r){if(!CXe(r))return!1;var o=typeof e;return(o=="number"?mXe(r)&&yXe(e,r.length):o=="string"&&e in r)?dXe(r[e],t):!1}ine.exports=EXe});var ane=U((KRt,one)=>{var IXe=nne(),wXe=sne();function BXe(t){return IXe(function(e,r){var o=-1,a=r.length,n=a>1?r[a-1]:void 0,u=a>2?r[2]:void 0;for(n=t.length>3&&typeof n=="function"?(a--,n):void 0,u&&wXe(r[0],r[1],u)&&(n=a<3?void 0:n,a=1),e=Object(e);++o{var vXe=qre(),DXe=ane(),SXe=DXe(function(t,e,r,o){vXe(t,e,r,o)});lne.exports=SXe});var Ye={};Yt(Ye,{AsyncActions:()=>cL,BufferStream:()=>lL,CachingStrategy:()=>Ine,DefaultStream:()=>uL,allSettledSafe:()=>jc,assertNever:()=>fL,bufferStream:()=>Jy,buildIgnorePattern:()=>RXe,convertMapsToIndexableObjects:()=>KS,dynamicRequire:()=>Vp,escapeRegExp:()=>xXe,getArrayWithDefault:()=>Yy,getFactoryWithDefault:()=>Df,getMapWithDefault:()=>Ky,getSetWithDefault:()=>dd,isIndexableObject:()=>aL,isPathLike:()=>TXe,isTaggedYarnVersion:()=>PXe,makeDeferred:()=>yne,mapAndFilter:()=>Zu,mapAndFind:()=>Ow,mergeIntoTarget:()=>Bne,overrideType:()=>bXe,parseBoolean:()=>Mw,parseOptionalBoolean:()=>wne,prettifyAsyncErrors:()=>Vy,prettifySyncErrors:()=>pL,releaseAfterUseAsync:()=>kXe,replaceEnvVariables:()=>hL,sortMap:()=>Pa,toMerged:()=>NXe,tryParseOptionalBoolean:()=>gL,validateEnum:()=>QXe});function PXe(t){return!!(gne.default.valid(t)&&t.match(/^[^-]+(-rc\.[0-9]+)?$/))}function xXe(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function bXe(t){}function fL(t){throw new Error(`Assertion failed: Unexpected object '${t}'`)}function QXe(t,e){let r=Object.values(t);if(!r.includes(e))throw new ot(`Invalid value for enumeration: ${JSON.stringify(e)} (expected one of ${r.map(o=>JSON.stringify(o)).join(", ")})`);return e}function Zu(t,e){let r=[];for(let o of t){let a=e(o);a!==dne&&r.push(a)}return r}function Ow(t,e){for(let r of t){let o=e(r);if(o!==mne)return o}}function aL(t){return typeof t=="object"&&t!==null}async function jc(t){let e=await Promise.allSettled(t),r=[];for(let o of e){if(o.status==="rejected")throw o.reason;r.push(o.value)}return r}function KS(t){if(t instanceof Map&&(t=Object.fromEntries(t)),aL(t))for(let e of Object.keys(t)){let r=t[e];aL(r)&&(t[e]=KS(r))}return t}function Df(t,e,r){let o=t.get(e);return typeof o>"u"&&t.set(e,o=r()),o}function Yy(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=[]),r}function dd(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=new Set),r}function Ky(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=new Map),r}async function kXe(t,e){if(e==null)return await t();try{return await t()}finally{await e()}}async function Vy(t,e){try{return await t()}catch(r){throw r.message=e(r.message),r}}function pL(t,e){try{return t()}catch(r){throw r.message=e(r.message),r}}async function Jy(t){return await new Promise((e,r)=>{let o=[];t.on("error",a=>{r(a)}),t.on("data",a=>{o.push(a)}),t.on("end",()=>{e(Buffer.concat(o))})})}function yne(){let t,e;return{promise:new Promise((o,a)=>{t=o,e=a}),resolve:t,reject:e}}function Cne(t){return Lw(ue.fromPortablePath(t))}function Ene(path){let physicalPath=ue.fromPortablePath(path),currentCacheEntry=Lw.cache[physicalPath];delete Lw.cache[physicalPath];let result;try{result=Cne(physicalPath);let freshCacheEntry=Lw.cache[physicalPath],dynamicModule=eval("module"),freshCacheIndex=dynamicModule.children.indexOf(freshCacheEntry);freshCacheIndex!==-1&&dynamicModule.children.splice(freshCacheIndex,1)}finally{Lw.cache[physicalPath]=currentCacheEntry}return result}function FXe(t){let e=une.get(t),r=ae.statSync(t);if((e==null?void 0:e.mtime)===r.mtimeMs)return e.instance;let o=Ene(t);return une.set(t,{mtime:r.mtimeMs,instance:o}),o}function Vp(t,{cachingStrategy:e=2}={}){switch(e){case 0:return Ene(t);case 1:return FXe(t);case 2:return Cne(t);default:throw new Error("Unsupported caching strategy")}}function Pa(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let o=[];for(let n of e)o.push(r.map(u=>n(u)));let a=r.map((n,u)=>u);return a.sort((n,u)=>{for(let A of o){let p=A[n]A[u]?1:0;if(p!==0)return p}return 0}),a.map(n=>r[n])}function RXe(t){return t.length===0?null:t.map(e=>`(${pne.default.makeRe(e,{windows:!1,dot:!0}).source})`).join("|")}function hL(t,{env:e}){let r=/\${(?[\d\w_]+)(?:)?(?:-(?[^}]*))?}/g;return t.replace(r,(...o)=>{let{variableName:a,colon:n,fallback:u}=o[o.length-1],A=Object.prototype.hasOwnProperty.call(e,a),p=e[a];if(p||A&&!n)return p;if(u!=null)return u;throw new ot(`Environment variable not found (${a})`)})}function Mw(t){switch(t){case"true":case"1":case 1:case!0:return!0;case"false":case"0":case 0:case!1:return!1;default:throw new Error(`Couldn't parse "${t}" as a boolean`)}}function wne(t){return typeof t>"u"?t:Mw(t)}function gL(t){try{return wne(t)}catch{return null}}function TXe(t){return!!(ue.isAbsolute(t)||t.match(/^(\.{1,2}|~)\//))}function Bne(t,...e){let r=u=>({value:u}),o=r(t),a=e.map(u=>r(u)),{value:n}=(0,fne.default)(o,...a,(u,A)=>{if(Array.isArray(u)&&Array.isArray(A)){for(let p of A)u.find(h=>(0,Ane.default)(h,p))||u.push(p);return u}});return n}function NXe(...t){return Bne({},...t)}var Ane,fne,pne,hne,gne,AL,dne,mne,lL,cL,uL,Lw,une,Ine,Kl=dt(()=>{bt();_t();Ane=tt(Zte()),fne=tt(cne()),pne=tt(Jo()),hne=tt(rd()),gne=tt(si()),AL=Ie("stream");dne=Symbol();Zu.skip=dne;mne=Symbol();Ow.skip=mne;lL=class extends AL.Transform{constructor(){super(...arguments);this.chunks=[]}_transform(r,o,a){if(o!=="buffer"||!Buffer.isBuffer(r))throw new Error("Assertion failed: BufferStream only accept buffers");this.chunks.push(r),a(null,null)}_flush(r){r(null,Buffer.concat(this.chunks))}};cL=class{constructor(e){this.deferred=new Map;this.promises=new Map;this.limit=(0,hne.default)(e)}set(e,r){let o=this.deferred.get(e);typeof o>"u"&&this.deferred.set(e,o=yne());let a=this.limit(()=>r());return this.promises.set(e,a),a.then(()=>{this.promises.get(e)===a&&o.resolve()},n=>{this.promises.get(e)===a&&o.reject(n)}),o.promise}reduce(e,r){let o=this.promises.get(e)??Promise.resolve();this.set(e,()=>r(o))}async wait(){await Promise.all(this.promises.values())}},uL=class extends AL.Transform{constructor(r=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=r}_transform(r,o,a){if(o!=="buffer"||!Buffer.isBuffer(r))throw new Error("Assertion failed: DefaultStream only accept buffers");this.active=!1,a(null,r)}_flush(r){this.active&&this.ifEmpty.length>0?r(null,this.ifEmpty):r(null)}},Lw=eval("require");une=new Map;Ine=(o=>(o[o.NoCache=0]="NoCache",o[o.FsTime=1]="FsTime",o[o.Node=2]="Node",o))(Ine||{})});var zy,dL,mL,vne=dt(()=>{zy=(r=>(r.HARD="HARD",r.SOFT="SOFT",r))(zy||{}),dL=(o=>(o.Dependency="Dependency",o.PeerDependency="PeerDependency",o.PeerDependencyMeta="PeerDependencyMeta",o))(dL||{}),mL=(o=>(o.Inactive="inactive",o.Redundant="redundant",o.Active="active",o))(mL||{})});var ye={};Yt(ye,{LogLevel:()=>XS,Style:()=>CL,Type:()=>Bt,addLogFilterSupport:()=>Hw,applyColor:()=>xa,applyHyperlink:()=>Xy,applyStyle:()=>zS,json:()=>md,jsonOrPretty:()=>MXe,mark:()=>BL,pretty:()=>Kt,prettyField:()=>$u,prettyList:()=>wL,supportsColor:()=>JS,supportsHyperlinks:()=>IL,tuple:()=>Gc});function Gc(t,e){return[e,t]}function zS(t,e,r){return t.get("enableColors")&&r&2&&(e=_w.default.bold(e)),e}function xa(t,e,r){if(!t.get("enableColors"))return e;let o=LXe.get(r);if(o===null)return e;let a=typeof o>"u"?r:EL.level>=3?o[0]:o[1],n=typeof a=="number"?yL.ansi256(a):a.startsWith("#")?yL.hex(a):yL[a];if(typeof n!="function")throw new Error(`Invalid format type ${a}`);return n(e)}function Xy(t,e,r){return t.get("enableHyperlinks")?OXe?`\x1B]8;;${r}\x1B\\${e}\x1B]8;;\x1B\\`:`\x1B]8;;${r}\x07${e}\x1B]8;;\x07`:e}function Kt(t,e,r){if(e===null)return xa(t,"null",Bt.NULL);if(Object.prototype.hasOwnProperty.call(VS,r))return VS[r].pretty(t,e);if(typeof e!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof e}`);return xa(t,e,r)}function wL(t,e,r,{separator:o=", "}={}){return[...e].map(a=>Kt(t,a,r)).join(o)}function md(t,e){if(t===null)return null;if(Object.prototype.hasOwnProperty.call(VS,e))return VS[e].json(t);if(typeof t!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof t}`);return t}function MXe(t,e,[r,o]){return t?md(r,o):Kt(e,r,o)}function BL(t){return{Check:xa(t,"\u2713","green"),Cross:xa(t,"\u2718","red"),Question:xa(t,"?","cyan")}}function $u(t,{label:e,value:[r,o]}){return`${Kt(t,e,Bt.CODE)}: ${Kt(t,r,o)}`}function Hw(t,{configuration:e}){let r=e.get("logFilters"),o=new Map,a=new Map,n=[];for(let w of r){let v=w.get("level");if(typeof v>"u")continue;let b=w.get("code");typeof b<"u"&&o.set(b,v);let C=w.get("text");typeof C<"u"&&a.set(C,v);let R=w.get("pattern");typeof R<"u"&&n.push([Dne.default.matcher(R,{contains:!0}),v])}n.reverse();let u=(w,v,b)=>{if(w===null||w===0)return b;let C=a.size>0||n.length>0?(0,Sne.default)(v):v;if(a.size>0){let R=a.get(C);if(typeof R<"u")return R??b}if(n.length>0){for(let[R,L]of n)if(R(C))return L??b}if(o.size>0){let R=o.get(Vu(w));if(typeof R<"u")return R??b}return b},A=t.reportInfo,p=t.reportWarning,h=t.reportError,E=function(w,v,b,C){switch(u(v,b,C)){case"info":A.call(w,v,b);break;case"warning":p.call(w,v??0,b);break;case"error":h.call(w,v??0,b);break}};t.reportInfo=function(...w){return E(this,...w,"info")},t.reportWarning=function(...w){return E(this,...w,"warning")},t.reportError=function(...w){return E(this,...w,"error")}}var _w,Uw,Dne,Sne,Pne,Bt,CL,EL,JS,IL,yL,LXe,al,VS,OXe,XS,Jl=dt(()=>{bt();_w=tt(dN()),Uw=tt(Xg());_t();Dne=tt(Jo()),Sne=tt(SS()),Pne=Ie("util");eS();Ks();Bt={NO_HINT:"NO_HINT",NULL:"NULL",SCOPE:"SCOPE",NAME:"NAME",RANGE:"RANGE",REFERENCE:"REFERENCE",NUMBER:"NUMBER",PATH:"PATH",URL:"URL",ADDED:"ADDED",REMOVED:"REMOVED",CODE:"CODE",INSPECT:"INSPECT",DURATION:"DURATION",SIZE:"SIZE",IDENT:"IDENT",DESCRIPTOR:"DESCRIPTOR",LOCATOR:"LOCATOR",RESOLUTION:"RESOLUTION",DEPENDENT:"DEPENDENT",PACKAGE_EXTENSION:"PACKAGE_EXTENSION",SETTING:"SETTING",MARKDOWN:"MARKDOWN"},CL=(e=>(e[e.BOLD=2]="BOLD",e))(CL||{}),EL=Uw.default.GITHUB_ACTIONS?{level:2}:_w.default.supportsColor?{level:_w.default.supportsColor.level}:{level:0},JS=EL.level!==0,IL=JS&&!Uw.default.GITHUB_ACTIONS&&!Uw.default.CIRCLE&&!Uw.default.GITLAB,yL=new _w.default.Instance(EL),LXe=new Map([[Bt.NO_HINT,null],[Bt.NULL,["#a853b5",129]],[Bt.SCOPE,["#d75f00",166]],[Bt.NAME,["#d7875f",173]],[Bt.RANGE,["#00afaf",37]],[Bt.REFERENCE,["#87afff",111]],[Bt.NUMBER,["#ffd700",220]],[Bt.PATH,["#d75fd7",170]],[Bt.URL,["#d75fd7",170]],[Bt.ADDED,["#5faf00",70]],[Bt.REMOVED,["#d70000",160]],[Bt.CODE,["#87afff",111]],[Bt.SIZE,["#ffd700",220]]]),al=t=>t,VS={[Bt.INSPECT]:al({pretty:(t,e)=>(0,Pne.inspect)(e,{depth:1/0,colors:t.get("enableColors"),compact:!0,breakLength:1/0}),json:t=>t}),[Bt.NUMBER]:al({pretty:(t,e)=>xa(t,`${e}`,Bt.NUMBER),json:t=>t}),[Bt.IDENT]:al({pretty:(t,e)=>cs(t,e),json:t=>nn(t)}),[Bt.LOCATOR]:al({pretty:(t,e)=>kr(t,e),json:t=>Vl(t)}),[Bt.DESCRIPTOR]:al({pretty:(t,e)=>Ln(t,e),json:t=>ba(t)}),[Bt.RESOLUTION]:al({pretty:(t,{descriptor:e,locator:r})=>qw(t,e,r),json:({descriptor:t,locator:e})=>({descriptor:ba(t),locator:e!==null?Vl(e):null})}),[Bt.DEPENDENT]:al({pretty:(t,{locator:e,descriptor:r})=>vL(t,e,r),json:({locator:t,descriptor:e})=>({locator:Vl(t),descriptor:ba(e)})}),[Bt.PACKAGE_EXTENSION]:al({pretty:(t,e)=>{switch(e.type){case"Dependency":return`${cs(t,e.parentDescriptor)} \u27A4 ${xa(t,"dependencies",Bt.CODE)} \u27A4 ${cs(t,e.descriptor)}`;case"PeerDependency":return`${cs(t,e.parentDescriptor)} \u27A4 ${xa(t,"peerDependencies",Bt.CODE)} \u27A4 ${cs(t,e.descriptor)}`;case"PeerDependencyMeta":return`${cs(t,e.parentDescriptor)} \u27A4 ${xa(t,"peerDependenciesMeta",Bt.CODE)} \u27A4 ${cs(t,Ys(e.selector))} \u27A4 ${xa(t,e.key,Bt.CODE)}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${e.type}`)}},json:t=>{switch(t.type){case"Dependency":return`${nn(t.parentDescriptor)} > ${nn(t.descriptor)}`;case"PeerDependency":return`${nn(t.parentDescriptor)} >> ${nn(t.descriptor)}`;case"PeerDependencyMeta":return`${nn(t.parentDescriptor)} >> ${t.selector} / ${t.key}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${t.type}`)}}}),[Bt.SETTING]:al({pretty:(t,e)=>(t.get(e),Xy(t,xa(t,e,Bt.CODE),`https://yarnpkg.com/configuration/yarnrc#${e}`)),json:t=>t}),[Bt.DURATION]:al({pretty:(t,e)=>{if(e>1e3*60){let r=Math.floor(e/1e3/60),o=Math.ceil((e-r*60*1e3)/1e3);return o===0?`${r}m`:`${r}m ${o}s`}else{let r=Math.floor(e/1e3),o=e-r*1e3;return o===0?`${r}s`:`${r}s ${o}ms`}},json:t=>t}),[Bt.SIZE]:al({pretty:(t,e)=>{let r=["KB","MB","GB","TB"],o=r.length;for(;o>1&&e<1024**o;)o-=1;let a=1024**o,n=Math.floor(e*100/a)/100;return xa(t,`${n} ${r[o-1]}`,Bt.NUMBER)},json:t=>t}),[Bt.PATH]:al({pretty:(t,e)=>xa(t,ue.fromPortablePath(e),Bt.PATH),json:t=>ue.fromPortablePath(t)}),[Bt.MARKDOWN]:al({pretty:(t,{text:e,format:r,paragraphs:o})=>Bo(e,{format:r,paragraphs:o}),json:({text:t})=>t})};OXe=!!process.env.KONSOLE_VERSION;XS=(a=>(a.Error="error",a.Warning="warning",a.Info="info",a.Discard="discard",a))(XS||{})});var bne=U((sTt,xne)=>{"use strict";xne.exports=(...t)=>[...new Set([].concat(...t))]});var DL=U((oTt,Fne)=>{"use strict";var UXe=Ie("stream"),Qne=UXe.PassThrough,_Xe=Array.prototype.slice;Fne.exports=HXe;function HXe(){let t=[],e=_Xe.call(arguments),r=!1,o=e[e.length-1];o&&!Array.isArray(o)&&o.pipe==null?e.pop():o={};let a=o.end!==!1,n=o.pipeError===!0;o.objectMode==null&&(o.objectMode=!0),o.highWaterMark==null&&(o.highWaterMark=64*1024);let u=Qne(o);function A(){for(let E=0,w=arguments.length;E0||(r=!1,p())}function b(C){function R(){C.removeListener("merge2UnpipeEnd",R),C.removeListener("end",R),n&&C.removeListener("error",L),v()}function L(_){u.emit("error",_)}if(C._readableState.endEmitted)return v();C.on("merge2UnpipeEnd",R),C.on("end",R),n&&C.on("error",L),C.pipe(u,{end:!1}),C.resume()}for(let C=0;C{"use strict";Object.defineProperty(Zy,"__esModule",{value:!0});Zy.splitWhen=Zy.flatten=void 0;function qXe(t){return t.reduce((e,r)=>[].concat(e,r),[])}Zy.flatten=qXe;function jXe(t,e){let r=[[]],o=0;for(let a of t)e(a)?(o++,r[o]=[]):r[o].push(a);return r}Zy.splitWhen=jXe});var Tne=U(ZS=>{"use strict";Object.defineProperty(ZS,"__esModule",{value:!0});ZS.isEnoentCodeError=void 0;function GXe(t){return t.code==="ENOENT"}ZS.isEnoentCodeError=GXe});var Nne=U($S=>{"use strict";Object.defineProperty($S,"__esModule",{value:!0});$S.createDirentFromStats=void 0;var SL=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function WXe(t,e){return new SL(t,e)}$S.createDirentFromStats=WXe});var Lne=U(eA=>{"use strict";Object.defineProperty(eA,"__esModule",{value:!0});eA.removeLeadingDotSegment=eA.escape=eA.makeAbsolute=eA.unixify=void 0;var YXe=Ie("path"),KXe=2,VXe=/(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g;function JXe(t){return t.replace(/\\/g,"/")}eA.unixify=JXe;function zXe(t,e){return YXe.resolve(t,e)}eA.makeAbsolute=zXe;function XXe(t){return t.replace(VXe,"\\$2")}eA.escape=XXe;function ZXe(t){if(t.charAt(0)==="."){let e=t.charAt(1);if(e==="/"||e==="\\")return t.slice(KXe)}return t}eA.removeLeadingDotSegment=ZXe});var Mne=U((ATt,One)=>{One.exports=function(e){if(typeof e!="string"||e==="")return!1;for(var r;r=/(\\).|([@?!+*]\(.*\))/g.exec(e);){if(r[2])return!0;e=e.slice(r.index+r[0].length)}return!1}});var Hne=U((fTt,_ne)=>{var $Xe=Mne(),Une={"{":"}","(":")","[":"]"},eZe=function(t){if(t[0]==="!")return!0;for(var e=0,r=-2,o=-2,a=-2,n=-2,u=-2;ee&&(u===-1||u>o||(u=t.indexOf("\\",e),u===-1||u>o)))||a!==-1&&t[e]==="{"&&t[e+1]!=="}"&&(a=t.indexOf("}",e),a>e&&(u=t.indexOf("\\",e),u===-1||u>a))||n!==-1&&t[e]==="("&&t[e+1]==="?"&&/[:!=]/.test(t[e+2])&&t[e+3]!==")"&&(n=t.indexOf(")",e),n>e&&(u=t.indexOf("\\",e),u===-1||u>n))||r!==-1&&t[e]==="("&&t[e+1]!=="|"&&(rr&&(u=t.indexOf("\\",r),u===-1||u>n))))return!0;if(t[e]==="\\"){var A=t[e+1];e+=2;var p=Une[A];if(p){var h=t.indexOf(p,e);h!==-1&&(e=h+1)}if(t[e]==="!")return!0}else e++}return!1},tZe=function(t){if(t[0]==="!")return!0;for(var e=0;e{"use strict";var rZe=Hne(),nZe=Ie("path").posix.dirname,iZe=Ie("os").platform()==="win32",PL="/",sZe=/\\/g,oZe=/[\{\[].*[\}\]]$/,aZe=/(^|[^\\])([\{\[]|\([^\)]+$)/,lZe=/\\([\!\*\?\|\[\]\(\)\{\}])/g;qne.exports=function(e,r){var o=Object.assign({flipBackslashes:!0},r);o.flipBackslashes&&iZe&&e.indexOf(PL)<0&&(e=e.replace(sZe,PL)),oZe.test(e)&&(e+=PL),e+="a";do e=nZe(e);while(rZe(e)||aZe.test(e));return e.replace(lZe,"$1")}});var Xne=U(Or=>{"use strict";Object.defineProperty(Or,"__esModule",{value:!0});Or.matchAny=Or.convertPatternsToRe=Or.makeRe=Or.getPatternParts=Or.expandBraceExpansion=Or.expandPatternsWithBraceExpansion=Or.isAffectDepthOfReadingPattern=Or.endsWithSlashGlobStar=Or.hasGlobStar=Or.getBaseDirectory=Or.isPatternRelatedToParentDirectory=Or.getPatternsOutsideCurrentDirectory=Or.getPatternsInsideCurrentDirectory=Or.getPositivePatterns=Or.getNegativePatterns=Or.isPositivePattern=Or.isNegativePattern=Or.convertToNegativePattern=Or.convertToPositivePattern=Or.isDynamicPattern=Or.isStaticPattern=void 0;var cZe=Ie("path"),uZe=jne(),xL=Jo(),Gne="**",AZe="\\",fZe=/[*?]|^!/,pZe=/\[[^[]*]/,hZe=/(?:^|[^!*+?@])\([^(]*\|[^|]*\)/,gZe=/[!*+?@]\([^(]*\)/,dZe=/,|\.\./;function Wne(t,e={}){return!Yne(t,e)}Or.isStaticPattern=Wne;function Yne(t,e={}){return t===""?!1:!!(e.caseSensitiveMatch===!1||t.includes(AZe)||fZe.test(t)||pZe.test(t)||hZe.test(t)||e.extglob!==!1&&gZe.test(t)||e.braceExpansion!==!1&&mZe(t))}Or.isDynamicPattern=Yne;function mZe(t){let e=t.indexOf("{");if(e===-1)return!1;let r=t.indexOf("}",e+1);if(r===-1)return!1;let o=t.slice(e,r);return dZe.test(o)}function yZe(t){return eP(t)?t.slice(1):t}Or.convertToPositivePattern=yZe;function CZe(t){return"!"+t}Or.convertToNegativePattern=CZe;function eP(t){return t.startsWith("!")&&t[1]!=="("}Or.isNegativePattern=eP;function Kne(t){return!eP(t)}Or.isPositivePattern=Kne;function EZe(t){return t.filter(eP)}Or.getNegativePatterns=EZe;function IZe(t){return t.filter(Kne)}Or.getPositivePatterns=IZe;function wZe(t){return t.filter(e=>!bL(e))}Or.getPatternsInsideCurrentDirectory=wZe;function BZe(t){return t.filter(bL)}Or.getPatternsOutsideCurrentDirectory=BZe;function bL(t){return t.startsWith("..")||t.startsWith("./..")}Or.isPatternRelatedToParentDirectory=bL;function vZe(t){return uZe(t,{flipBackslashes:!1})}Or.getBaseDirectory=vZe;function DZe(t){return t.includes(Gne)}Or.hasGlobStar=DZe;function Vne(t){return t.endsWith("/"+Gne)}Or.endsWithSlashGlobStar=Vne;function SZe(t){let e=cZe.basename(t);return Vne(t)||Wne(e)}Or.isAffectDepthOfReadingPattern=SZe;function PZe(t){return t.reduce((e,r)=>e.concat(Jne(r)),[])}Or.expandPatternsWithBraceExpansion=PZe;function Jne(t){return xL.braces(t,{expand:!0,nodupes:!0})}Or.expandBraceExpansion=Jne;function xZe(t,e){let{parts:r}=xL.scan(t,Object.assign(Object.assign({},e),{parts:!0}));return r.length===0&&(r=[t]),r[0].startsWith("/")&&(r[0]=r[0].slice(1),r.unshift("")),r}Or.getPatternParts=xZe;function zne(t,e){return xL.makeRe(t,e)}Or.makeRe=zne;function bZe(t,e){return t.map(r=>zne(r,e))}Or.convertPatternsToRe=bZe;function QZe(t,e){return e.some(r=>r.test(t))}Or.matchAny=QZe});var $ne=U(tP=>{"use strict";Object.defineProperty(tP,"__esModule",{value:!0});tP.merge=void 0;var kZe=DL();function FZe(t){let e=kZe(t);return t.forEach(r=>{r.once("error",o=>e.emit("error",o))}),e.once("close",()=>Zne(t)),e.once("end",()=>Zne(t)),e}tP.merge=FZe;function Zne(t){t.forEach(e=>e.emit("close"))}});var eie=U($y=>{"use strict";Object.defineProperty($y,"__esModule",{value:!0});$y.isEmpty=$y.isString=void 0;function RZe(t){return typeof t=="string"}$y.isString=RZe;function TZe(t){return t===""}$y.isEmpty=TZe});var Sf=U(So=>{"use strict";Object.defineProperty(So,"__esModule",{value:!0});So.string=So.stream=So.pattern=So.path=So.fs=So.errno=So.array=void 0;var NZe=Rne();So.array=NZe;var LZe=Tne();So.errno=LZe;var OZe=Nne();So.fs=OZe;var MZe=Lne();So.path=MZe;var UZe=Xne();So.pattern=UZe;var _Ze=$ne();So.stream=_Ze;var HZe=eie();So.string=HZe});var nie=U(Po=>{"use strict";Object.defineProperty(Po,"__esModule",{value:!0});Po.convertPatternGroupToTask=Po.convertPatternGroupsToTasks=Po.groupPatternsByBaseDirectory=Po.getNegativePatternsAsPositive=Po.getPositivePatterns=Po.convertPatternsToTasks=Po.generate=void 0;var Pf=Sf();function qZe(t,e){let r=tie(t),o=rie(t,e.ignore),a=r.filter(p=>Pf.pattern.isStaticPattern(p,e)),n=r.filter(p=>Pf.pattern.isDynamicPattern(p,e)),u=QL(a,o,!1),A=QL(n,o,!0);return u.concat(A)}Po.generate=qZe;function QL(t,e,r){let o=[],a=Pf.pattern.getPatternsOutsideCurrentDirectory(t),n=Pf.pattern.getPatternsInsideCurrentDirectory(t),u=kL(a),A=kL(n);return o.push(...FL(u,e,r)),"."in A?o.push(RL(".",n,e,r)):o.push(...FL(A,e,r)),o}Po.convertPatternsToTasks=QL;function tie(t){return Pf.pattern.getPositivePatterns(t)}Po.getPositivePatterns=tie;function rie(t,e){return Pf.pattern.getNegativePatterns(t).concat(e).map(Pf.pattern.convertToPositivePattern)}Po.getNegativePatternsAsPositive=rie;function kL(t){let e={};return t.reduce((r,o)=>{let a=Pf.pattern.getBaseDirectory(o);return a in r?r[a].push(o):r[a]=[o],r},e)}Po.groupPatternsByBaseDirectory=kL;function FL(t,e,r){return Object.keys(t).map(o=>RL(o,t[o],e,r))}Po.convertPatternGroupsToTasks=FL;function RL(t,e,r,o){return{dynamic:o,positive:e,negative:r,base:t,patterns:[].concat(e,r.map(Pf.pattern.convertToNegativePattern))}}Po.convertPatternGroupToTask=RL});var sie=U(eC=>{"use strict";Object.defineProperty(eC,"__esModule",{value:!0});eC.removeDuplicateSlashes=eC.transform=void 0;var jZe=/(?!^)\/{2,}/g;function GZe(t){return t.map(e=>iie(e))}eC.transform=GZe;function iie(t){return t.replace(jZe,"/")}eC.removeDuplicateSlashes=iie});var aie=U(rP=>{"use strict";Object.defineProperty(rP,"__esModule",{value:!0});rP.read=void 0;function WZe(t,e,r){e.fs.lstat(t,(o,a)=>{if(o!==null){oie(r,o);return}if(!a.isSymbolicLink()||!e.followSymbolicLink){TL(r,a);return}e.fs.stat(t,(n,u)=>{if(n!==null){if(e.throwErrorOnBrokenSymbolicLink){oie(r,n);return}TL(r,a);return}e.markSymbolicLink&&(u.isSymbolicLink=()=>!0),TL(r,u)})})}rP.read=WZe;function oie(t,e){t(e)}function TL(t,e){t(null,e)}});var lie=U(nP=>{"use strict";Object.defineProperty(nP,"__esModule",{value:!0});nP.read=void 0;function YZe(t,e){let r=e.fs.lstatSync(t);if(!r.isSymbolicLink()||!e.followSymbolicLink)return r;try{let o=e.fs.statSync(t);return e.markSymbolicLink&&(o.isSymbolicLink=()=>!0),o}catch(o){if(!e.throwErrorOnBrokenSymbolicLink)return r;throw o}}nP.read=YZe});var cie=U(Jp=>{"use strict";Object.defineProperty(Jp,"__esModule",{value:!0});Jp.createFileSystemAdapter=Jp.FILE_SYSTEM_ADAPTER=void 0;var iP=Ie("fs");Jp.FILE_SYSTEM_ADAPTER={lstat:iP.lstat,stat:iP.stat,lstatSync:iP.lstatSync,statSync:iP.statSync};function KZe(t){return t===void 0?Jp.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},Jp.FILE_SYSTEM_ADAPTER),t)}Jp.createFileSystemAdapter=KZe});var uie=U(LL=>{"use strict";Object.defineProperty(LL,"__esModule",{value:!0});var VZe=cie(),NL=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=VZe.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(e,r){return e??r}};LL.default=NL});var yd=U(zp=>{"use strict";Object.defineProperty(zp,"__esModule",{value:!0});zp.statSync=zp.stat=zp.Settings=void 0;var Aie=aie(),JZe=lie(),OL=uie();zp.Settings=OL.default;function zZe(t,e,r){if(typeof e=="function"){Aie.read(t,ML(),e);return}Aie.read(t,ML(e),r)}zp.stat=zZe;function XZe(t,e){let r=ML(e);return JZe.read(t,r)}zp.statSync=XZe;function ML(t={}){return t instanceof OL.default?t:new OL.default(t)}});var pie=U((DTt,fie)=>{fie.exports=ZZe;function ZZe(t,e){var r,o,a,n=!0;Array.isArray(t)?(r=[],o=t.length):(a=Object.keys(t),r={},o=a.length);function u(p){function h(){e&&e(p,r),e=null}n?process.nextTick(h):h()}function A(p,h,E){r[p]=E,(--o===0||h)&&u(h)}o?a?a.forEach(function(p){t[p](function(h,E){A(p,h,E)})}):t.forEach(function(p,h){p(function(E,w){A(h,E,w)})}):u(null),n=!1}});var UL=U(oP=>{"use strict";Object.defineProperty(oP,"__esModule",{value:!0});oP.IS_SUPPORT_READDIR_WITH_FILE_TYPES=void 0;var sP=process.versions.node.split(".");if(sP[0]===void 0||sP[1]===void 0)throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);var hie=Number.parseInt(sP[0],10),$Ze=Number.parseInt(sP[1],10),gie=10,e$e=10,t$e=hie>gie,r$e=hie===gie&&$Ze>=e$e;oP.IS_SUPPORT_READDIR_WITH_FILE_TYPES=t$e||r$e});var die=U(aP=>{"use strict";Object.defineProperty(aP,"__esModule",{value:!0});aP.createDirentFromStats=void 0;var _L=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function n$e(t,e){return new _L(t,e)}aP.createDirentFromStats=n$e});var HL=U(lP=>{"use strict";Object.defineProperty(lP,"__esModule",{value:!0});lP.fs=void 0;var i$e=die();lP.fs=i$e});var qL=U(cP=>{"use strict";Object.defineProperty(cP,"__esModule",{value:!0});cP.joinPathSegments=void 0;function s$e(t,e,r){return t.endsWith(r)?t+e:t+r+e}cP.joinPathSegments=s$e});var wie=U(Xp=>{"use strict";Object.defineProperty(Xp,"__esModule",{value:!0});Xp.readdir=Xp.readdirWithFileTypes=Xp.read=void 0;var o$e=yd(),mie=pie(),a$e=UL(),yie=HL(),Cie=qL();function l$e(t,e,r){if(!e.stats&&a$e.IS_SUPPORT_READDIR_WITH_FILE_TYPES){Eie(t,e,r);return}Iie(t,e,r)}Xp.read=l$e;function Eie(t,e,r){e.fs.readdir(t,{withFileTypes:!0},(o,a)=>{if(o!==null){uP(r,o);return}let n=a.map(A=>({dirent:A,name:A.name,path:Cie.joinPathSegments(t,A.name,e.pathSegmentSeparator)}));if(!e.followSymbolicLinks){jL(r,n);return}let u=n.map(A=>c$e(A,e));mie(u,(A,p)=>{if(A!==null){uP(r,A);return}jL(r,p)})})}Xp.readdirWithFileTypes=Eie;function c$e(t,e){return r=>{if(!t.dirent.isSymbolicLink()){r(null,t);return}e.fs.stat(t.path,(o,a)=>{if(o!==null){if(e.throwErrorOnBrokenSymbolicLink){r(o);return}r(null,t);return}t.dirent=yie.fs.createDirentFromStats(t.name,a),r(null,t)})}}function Iie(t,e,r){e.fs.readdir(t,(o,a)=>{if(o!==null){uP(r,o);return}let n=a.map(u=>{let A=Cie.joinPathSegments(t,u,e.pathSegmentSeparator);return p=>{o$e.stat(A,e.fsStatSettings,(h,E)=>{if(h!==null){p(h);return}let w={name:u,path:A,dirent:yie.fs.createDirentFromStats(u,E)};e.stats&&(w.stats=E),p(null,w)})}});mie(n,(u,A)=>{if(u!==null){uP(r,u);return}jL(r,A)})})}Xp.readdir=Iie;function uP(t,e){t(e)}function jL(t,e){t(null,e)}});var Pie=U(Zp=>{"use strict";Object.defineProperty(Zp,"__esModule",{value:!0});Zp.readdir=Zp.readdirWithFileTypes=Zp.read=void 0;var u$e=yd(),A$e=UL(),Bie=HL(),vie=qL();function f$e(t,e){return!e.stats&&A$e.IS_SUPPORT_READDIR_WITH_FILE_TYPES?Die(t,e):Sie(t,e)}Zp.read=f$e;function Die(t,e){return e.fs.readdirSync(t,{withFileTypes:!0}).map(o=>{let a={dirent:o,name:o.name,path:vie.joinPathSegments(t,o.name,e.pathSegmentSeparator)};if(a.dirent.isSymbolicLink()&&e.followSymbolicLinks)try{let n=e.fs.statSync(a.path);a.dirent=Bie.fs.createDirentFromStats(a.name,n)}catch(n){if(e.throwErrorOnBrokenSymbolicLink)throw n}return a})}Zp.readdirWithFileTypes=Die;function Sie(t,e){return e.fs.readdirSync(t).map(o=>{let a=vie.joinPathSegments(t,o,e.pathSegmentSeparator),n=u$e.statSync(a,e.fsStatSettings),u={name:o,path:a,dirent:Bie.fs.createDirentFromStats(o,n)};return e.stats&&(u.stats=n),u})}Zp.readdir=Sie});var xie=U($p=>{"use strict";Object.defineProperty($p,"__esModule",{value:!0});$p.createFileSystemAdapter=$p.FILE_SYSTEM_ADAPTER=void 0;var tC=Ie("fs");$p.FILE_SYSTEM_ADAPTER={lstat:tC.lstat,stat:tC.stat,lstatSync:tC.lstatSync,statSync:tC.statSync,readdir:tC.readdir,readdirSync:tC.readdirSync};function p$e(t){return t===void 0?$p.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},$p.FILE_SYSTEM_ADAPTER),t)}$p.createFileSystemAdapter=p$e});var bie=U(YL=>{"use strict";Object.defineProperty(YL,"__esModule",{value:!0});var h$e=Ie("path"),g$e=yd(),d$e=xie(),WL=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=d$e.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,h$e.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new g$e.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e??r}};YL.default=WL});var AP=U(e0=>{"use strict";Object.defineProperty(e0,"__esModule",{value:!0});e0.Settings=e0.scandirSync=e0.scandir=void 0;var Qie=wie(),m$e=Pie(),KL=bie();e0.Settings=KL.default;function y$e(t,e,r){if(typeof e=="function"){Qie.read(t,VL(),e);return}Qie.read(t,VL(e),r)}e0.scandir=y$e;function C$e(t,e){let r=VL(e);return m$e.read(t,r)}e0.scandirSync=C$e;function VL(t={}){return t instanceof KL.default?t:new KL.default(t)}});var Fie=U((NTt,kie)=>{"use strict";function E$e(t){var e=new t,r=e;function o(){var n=e;return n.next?e=n.next:(e=new t,r=e),n.next=null,n}function a(n){r.next=n,r=n}return{get:o,release:a}}kie.exports=E$e});var Tie=U((LTt,JL)=>{"use strict";var I$e=Fie();function Rie(t,e,r){if(typeof t=="function"&&(r=e,e=t,t=null),r<1)throw new Error("fastqueue concurrency must be greater than 1");var o=I$e(w$e),a=null,n=null,u=0,A=null,p={push:R,drain:zl,saturated:zl,pause:E,paused:!1,concurrency:r,running:h,resume:b,idle:C,length:w,getQueue:v,unshift:L,empty:zl,kill:V,killAndDrain:re,error:oe};return p;function h(){return u}function E(){p.paused=!0}function w(){for(var pe=a,he=0;pe;)pe=pe.next,he++;return he}function v(){for(var pe=a,he=[];pe;)he.push(pe.value),pe=pe.next;return he}function b(){if(!!p.paused){p.paused=!1;for(var pe=0;pe{"use strict";Object.defineProperty(tA,"__esModule",{value:!0});tA.joinPathSegments=tA.replacePathSegmentSeparator=tA.isAppliedFilter=tA.isFatalError=void 0;function v$e(t,e){return t.errorFilter===null?!0:!t.errorFilter(e)}tA.isFatalError=v$e;function D$e(t,e){return t===null||t(e)}tA.isAppliedFilter=D$e;function S$e(t,e){return t.split(/[/\\]/).join(e)}tA.replacePathSegmentSeparator=S$e;function P$e(t,e,r){return t===""?e:t.endsWith(r)?t+e:t+r+e}tA.joinPathSegments=P$e});var ZL=U(XL=>{"use strict";Object.defineProperty(XL,"__esModule",{value:!0});var x$e=fP(),zL=class{constructor(e,r){this._root=e,this._settings=r,this._root=x$e.replacePathSegmentSeparator(e,r.pathSegmentSeparator)}};XL.default=zL});var tO=U(eO=>{"use strict";Object.defineProperty(eO,"__esModule",{value:!0});var b$e=Ie("events"),Q$e=AP(),k$e=Tie(),pP=fP(),F$e=ZL(),$L=class extends F$e.default{constructor(e,r){super(e,r),this._settings=r,this._scandir=Q$e.scandir,this._emitter=new b$e.EventEmitter,this._queue=k$e(this._worker.bind(this),this._settings.concurrency),this._isFatalError=!1,this._isDestroyed=!1,this._queue.drain=()=>{this._isFatalError||this._emitter.emit("end")}}read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()=>{this._pushToQueue(this._root,this._settings.basePath)}),this._emitter}get isDestroyed(){return this._isDestroyed}destroy(){if(this._isDestroyed)throw new Error("The reader is already destroyed");this._isDestroyed=!0,this._queue.killAndDrain()}onEntry(e){this._emitter.on("entry",e)}onError(e){this._emitter.once("error",e)}onEnd(e){this._emitter.once("end",e)}_pushToQueue(e,r){let o={directory:e,base:r};this._queue.push(o,a=>{a!==null&&this._handleError(a)})}_worker(e,r){this._scandir(e.directory,this._settings.fsScandirSettings,(o,a)=>{if(o!==null){r(o,void 0);return}for(let n of a)this._handleEntry(n,e.base);r(null,void 0)})}_handleError(e){this._isDestroyed||!pP.isFatalError(this._settings,e)||(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit("error",e))}_handleEntry(e,r){if(this._isDestroyed||this._isFatalError)return;let o=e.path;r!==void 0&&(e.path=pP.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),pP.isAppliedFilter(this._settings.entryFilter,e)&&this._emitEntry(e),e.dirent.isDirectory()&&pP.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(o,e.path)}_emitEntry(e){this._emitter.emit("entry",e)}};eO.default=$L});var Nie=U(nO=>{"use strict";Object.defineProperty(nO,"__esModule",{value:!0});var R$e=tO(),rO=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new R$e.default(this._root,this._settings),this._storage=new Set}read(e){this._reader.onError(r=>{T$e(e,r)}),this._reader.onEntry(r=>{this._storage.add(r)}),this._reader.onEnd(()=>{N$e(e,[...this._storage])}),this._reader.read()}};nO.default=rO;function T$e(t,e){t(e)}function N$e(t,e){t(null,e)}});var Lie=U(sO=>{"use strict";Object.defineProperty(sO,"__esModule",{value:!0});var L$e=Ie("stream"),O$e=tO(),iO=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new O$e.default(this._root,this._settings),this._stream=new L$e.Readable({objectMode:!0,read:()=>{},destroy:()=>{this._reader.isDestroyed||this._reader.destroy()}})}read(){return this._reader.onError(e=>{this._stream.emit("error",e)}),this._reader.onEntry(e=>{this._stream.push(e)}),this._reader.onEnd(()=>{this._stream.push(null)}),this._reader.read(),this._stream}};sO.default=iO});var Oie=U(aO=>{"use strict";Object.defineProperty(aO,"__esModule",{value:!0});var M$e=AP(),hP=fP(),U$e=ZL(),oO=class extends U$e.default{constructor(){super(...arguments),this._scandir=M$e.scandirSync,this._storage=new Set,this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),[...this._storage]}_pushToQueue(e,r){this._queue.add({directory:e,base:r})}_handleQueue(){for(let e of this._queue.values())this._handleDirectory(e.directory,e.base)}_handleDirectory(e,r){try{let o=this._scandir(e,this._settings.fsScandirSettings);for(let a of o)this._handleEntry(a,r)}catch(o){this._handleError(o)}}_handleError(e){if(!!hP.isFatalError(this._settings,e))throw e}_handleEntry(e,r){let o=e.path;r!==void 0&&(e.path=hP.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),hP.isAppliedFilter(this._settings.entryFilter,e)&&this._pushToStorage(e),e.dirent.isDirectory()&&hP.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(o,e.path)}_pushToStorage(e){this._storage.add(e)}};aO.default=oO});var Mie=U(cO=>{"use strict";Object.defineProperty(cO,"__esModule",{value:!0});var _$e=Oie(),lO=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new _$e.default(this._root,this._settings)}read(){return this._reader.read()}};cO.default=lO});var Uie=U(AO=>{"use strict";Object.defineProperty(AO,"__esModule",{value:!0});var H$e=Ie("path"),q$e=AP(),uO=class{constructor(e={}){this._options=e,this.basePath=this._getValue(this._options.basePath,void 0),this.concurrency=this._getValue(this._options.concurrency,Number.POSITIVE_INFINITY),this.deepFilter=this._getValue(this._options.deepFilter,null),this.entryFilter=this._getValue(this._options.entryFilter,null),this.errorFilter=this._getValue(this._options.errorFilter,null),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,H$e.sep),this.fsScandirSettings=new q$e.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e??r}};AO.default=uO});var dP=U(rA=>{"use strict";Object.defineProperty(rA,"__esModule",{value:!0});rA.Settings=rA.walkStream=rA.walkSync=rA.walk=void 0;var _ie=Nie(),j$e=Lie(),G$e=Mie(),fO=Uie();rA.Settings=fO.default;function W$e(t,e,r){if(typeof e=="function"){new _ie.default(t,gP()).read(e);return}new _ie.default(t,gP(e)).read(r)}rA.walk=W$e;function Y$e(t,e){let r=gP(e);return new G$e.default(t,r).read()}rA.walkSync=Y$e;function K$e(t,e){let r=gP(e);return new j$e.default(t,r).read()}rA.walkStream=K$e;function gP(t={}){return t instanceof fO.default?t:new fO.default(t)}});var mP=U(hO=>{"use strict";Object.defineProperty(hO,"__esModule",{value:!0});var V$e=Ie("path"),J$e=yd(),Hie=Sf(),pO=class{constructor(e){this._settings=e,this._fsStatSettings=new J$e.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return V$e.resolve(this._settings.cwd,e)}_makeEntry(e,r){let o={name:r,path:r,dirent:Hie.fs.createDirentFromStats(r,e)};return this._settings.stats&&(o.stats=e),o}_isFatalError(e){return!Hie.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}};hO.default=pO});var mO=U(dO=>{"use strict";Object.defineProperty(dO,"__esModule",{value:!0});var z$e=Ie("stream"),X$e=yd(),Z$e=dP(),$$e=mP(),gO=class extends $$e.default{constructor(){super(...arguments),this._walkStream=Z$e.walkStream,this._stat=X$e.stat}dynamic(e,r){return this._walkStream(e,r)}static(e,r){let o=e.map(this._getFullEntryPath,this),a=new z$e.PassThrough({objectMode:!0});a._write=(n,u,A)=>this._getEntry(o[n],e[n],r).then(p=>{p!==null&&r.entryFilter(p)&&a.push(p),n===o.length-1&&a.end(),A()}).catch(A);for(let n=0;nthis._makeEntry(a,r)).catch(a=>{if(o.errorFilter(a))return null;throw a})}_getStat(e){return new Promise((r,o)=>{this._stat(e,this._fsStatSettings,(a,n)=>a===null?r(n):o(a))})}};dO.default=gO});var qie=U(CO=>{"use strict";Object.defineProperty(CO,"__esModule",{value:!0});var eet=dP(),tet=mP(),ret=mO(),yO=class extends tet.default{constructor(){super(...arguments),this._walkAsync=eet.walk,this._readerStream=new ret.default(this._settings)}dynamic(e,r){return new Promise((o,a)=>{this._walkAsync(e,r,(n,u)=>{n===null?o(u):a(n)})})}async static(e,r){let o=[],a=this._readerStream.static(e,r);return new Promise((n,u)=>{a.once("error",u),a.on("data",A=>o.push(A)),a.once("end",()=>n(o))})}};CO.default=yO});var jie=U(IO=>{"use strict";Object.defineProperty(IO,"__esModule",{value:!0});var rC=Sf(),EO=class{constructor(e,r,o){this._patterns=e,this._settings=r,this._micromatchOptions=o,this._storage=[],this._fillStorage()}_fillStorage(){let e=rC.pattern.expandPatternsWithBraceExpansion(this._patterns);for(let r of e){let o=this._getPatternSegments(r),a=this._splitSegmentsIntoSections(o);this._storage.push({complete:a.length<=1,pattern:r,segments:o,sections:a})}}_getPatternSegments(e){return rC.pattern.getPatternParts(e,this._micromatchOptions).map(o=>rC.pattern.isDynamicPattern(o,this._settings)?{dynamic:!0,pattern:o,patternRe:rC.pattern.makeRe(o,this._micromatchOptions)}:{dynamic:!1,pattern:o})}_splitSegmentsIntoSections(e){return rC.array.splitWhen(e,r=>r.dynamic&&rC.pattern.hasGlobStar(r.pattern))}};IO.default=EO});var Gie=U(BO=>{"use strict";Object.defineProperty(BO,"__esModule",{value:!0});var net=jie(),wO=class extends net.default{match(e){let r=e.split("/"),o=r.length,a=this._storage.filter(n=>!n.complete||n.segments.length>o);for(let n of a){let u=n.sections[0];if(!n.complete&&o>u.length||r.every((p,h)=>{let E=n.segments[h];return!!(E.dynamic&&E.patternRe.test(p)||!E.dynamic&&E.pattern===p)}))return!0}return!1}};BO.default=wO});var Wie=U(DO=>{"use strict";Object.defineProperty(DO,"__esModule",{value:!0});var yP=Sf(),iet=Gie(),vO=class{constructor(e,r){this._settings=e,this._micromatchOptions=r}getFilter(e,r,o){let a=this._getMatcher(r),n=this._getNegativePatternsRe(o);return u=>this._filter(e,u,a,n)}_getMatcher(e){return new iet.default(e,this._settings,this._micromatchOptions)}_getNegativePatternsRe(e){let r=e.filter(yP.pattern.isAffectDepthOfReadingPattern);return yP.pattern.convertPatternsToRe(r,this._micromatchOptions)}_filter(e,r,o,a){if(this._isSkippedByDeep(e,r.path)||this._isSkippedSymbolicLink(r))return!1;let n=yP.path.removeLeadingDotSegment(r.path);return this._isSkippedByPositivePatterns(n,o)?!1:this._isSkippedByNegativePatterns(n,a)}_isSkippedByDeep(e,r){return this._settings.deep===1/0?!1:this._getEntryLevel(e,r)>=this._settings.deep}_getEntryLevel(e,r){let o=r.split("/").length;if(e==="")return o;let a=e.split("/").length;return o-a}_isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.dirent.isSymbolicLink()}_isSkippedByPositivePatterns(e,r){return!this._settings.baseNameMatch&&!r.match(e)}_isSkippedByNegativePatterns(e,r){return!yP.pattern.matchAny(e,r)}};DO.default=vO});var Yie=U(PO=>{"use strict";Object.defineProperty(PO,"__esModule",{value:!0});var Cd=Sf(),SO=class{constructor(e,r){this._settings=e,this._micromatchOptions=r,this.index=new Map}getFilter(e,r){let o=Cd.pattern.convertPatternsToRe(e,this._micromatchOptions),a=Cd.pattern.convertPatternsToRe(r,this._micromatchOptions);return n=>this._filter(n,o,a)}_filter(e,r,o){if(this._settings.unique&&this._isDuplicateEntry(e)||this._onlyFileFilter(e)||this._onlyDirectoryFilter(e)||this._isSkippedByAbsoluteNegativePatterns(e.path,o))return!1;let a=this._settings.baseNameMatch?e.name:e.path,n=e.dirent.isDirectory(),u=this._isMatchToPatterns(a,r,n)&&!this._isMatchToPatterns(e.path,o,n);return this._settings.unique&&u&&this._createIndexRecord(e),u}_isDuplicateEntry(e){return this.index.has(e.path)}_createIndexRecord(e){this.index.set(e.path,void 0)}_onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}_onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent.isDirectory()}_isSkippedByAbsoluteNegativePatterns(e,r){if(!this._settings.absolute)return!1;let o=Cd.path.makeAbsolute(this._settings.cwd,e);return Cd.pattern.matchAny(o,r)}_isMatchToPatterns(e,r,o){let a=Cd.path.removeLeadingDotSegment(e),n=Cd.pattern.matchAny(a,r);return!n&&o?Cd.pattern.matchAny(a+"/",r):n}};PO.default=SO});var Kie=U(bO=>{"use strict";Object.defineProperty(bO,"__esModule",{value:!0});var set=Sf(),xO=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return set.errno.isEnoentCodeError(e)||this._settings.suppressErrors}};bO.default=xO});var Jie=U(kO=>{"use strict";Object.defineProperty(kO,"__esModule",{value:!0});var Vie=Sf(),QO=class{constructor(e){this._settings=e}getTransformer(){return e=>this._transform(e)}_transform(e){let r=e.path;return this._settings.absolute&&(r=Vie.path.makeAbsolute(this._settings.cwd,r),r=Vie.path.unixify(r)),this._settings.markDirectories&&e.dirent.isDirectory()&&(r+="/"),this._settings.objectMode?Object.assign(Object.assign({},e),{path:r}):r}};kO.default=QO});var CP=U(RO=>{"use strict";Object.defineProperty(RO,"__esModule",{value:!0});var oet=Ie("path"),aet=Wie(),cet=Yie(),uet=Kie(),Aet=Jie(),FO=class{constructor(e){this._settings=e,this.errorFilter=new uet.default(this._settings),this.entryFilter=new cet.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new aet.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new Aet.default(this._settings)}_getRootDirectory(e){return oet.resolve(this._settings.cwd,e.base)}_getReaderOptions(e){let r=e.base==="."?"":e.base;return{basePath:r,pathSegmentSeparator:"/",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(r,e.positive,e.negative),entryFilter:this.entryFilter.getFilter(e.positive,e.negative),errorFilter:this.errorFilter.getFilter(),followSymbolicLinks:this._settings.followSymbolicLinks,fs:this._settings.fs,stats:this._settings.stats,throwErrorOnBrokenSymbolicLink:this._settings.throwErrorOnBrokenSymbolicLink,transform:this.entryTransformer.getTransformer()}}_getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._settings.baseNameMatch,nobrace:!this._settings.braceExpansion,nocase:!this._settings.caseSensitiveMatch,noext:!this._settings.extglob,noglobstar:!this._settings.globstar,posix:!0,strictSlashes:!1}}};RO.default=FO});var zie=U(NO=>{"use strict";Object.defineProperty(NO,"__esModule",{value:!0});var fet=qie(),pet=CP(),TO=class extends pet.default{constructor(){super(...arguments),this._reader=new fet.default(this._settings)}async read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e);return(await this.api(r,e,o)).map(n=>o.transform(n))}api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.static(r.patterns,o)}};NO.default=TO});var Xie=U(OO=>{"use strict";Object.defineProperty(OO,"__esModule",{value:!0});var het=Ie("stream"),get=mO(),det=CP(),LO=class extends det.default{constructor(){super(...arguments),this._reader=new get.default(this._settings)}read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e),a=this.api(r,e,o),n=new het.Readable({objectMode:!0,read:()=>{}});return a.once("error",u=>n.emit("error",u)).on("data",u=>n.emit("data",o.transform(u))).once("end",()=>n.emit("end")),n.once("close",()=>a.destroy()),n}api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.static(r.patterns,o)}};OO.default=LO});var Zie=U(UO=>{"use strict";Object.defineProperty(UO,"__esModule",{value:!0});var met=yd(),yet=dP(),Cet=mP(),MO=class extends Cet.default{constructor(){super(...arguments),this._walkSync=yet.walkSync,this._statSync=met.statSync}dynamic(e,r){return this._walkSync(e,r)}static(e,r){let o=[];for(let a of e){let n=this._getFullEntryPath(a),u=this._getEntry(n,a,r);u===null||!r.entryFilter(u)||o.push(u)}return o}_getEntry(e,r,o){try{let a=this._getStat(e);return this._makeEntry(a,r)}catch(a){if(o.errorFilter(a))return null;throw a}}_getStat(e){return this._statSync(e,this._fsStatSettings)}};UO.default=MO});var $ie=U(HO=>{"use strict";Object.defineProperty(HO,"__esModule",{value:!0});var Eet=Zie(),Iet=CP(),_O=class extends Iet.default{constructor(){super(...arguments),this._reader=new Eet.default(this._settings)}read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e);return this.api(r,e,o).map(o.transform)}api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.static(r.patterns,o)}};HO.default=_O});var ese=U(iC=>{"use strict";Object.defineProperty(iC,"__esModule",{value:!0});iC.DEFAULT_FILE_SYSTEM_ADAPTER=void 0;var nC=Ie("fs"),wet=Ie("os"),Bet=Math.max(wet.cpus().length,1);iC.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:nC.lstat,lstatSync:nC.lstatSync,stat:nC.stat,statSync:nC.statSync,readdir:nC.readdir,readdirSync:nC.readdirSync};var qO=class{constructor(e={}){this._options=e,this.absolute=this._getValue(this._options.absolute,!1),this.baseNameMatch=this._getValue(this._options.baseNameMatch,!1),this.braceExpansion=this._getValue(this._options.braceExpansion,!0),this.caseSensitiveMatch=this._getValue(this._options.caseSensitiveMatch,!0),this.concurrency=this._getValue(this._options.concurrency,Bet),this.cwd=this._getValue(this._options.cwd,process.cwd()),this.deep=this._getValue(this._options.deep,1/0),this.dot=this._getValue(this._options.dot,!1),this.extglob=this._getValue(this._options.extglob,!0),this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!0),this.fs=this._getFileSystemMethods(this._options.fs),this.globstar=this._getValue(this._options.globstar,!0),this.ignore=this._getValue(this._options.ignore,[]),this.markDirectories=this._getValue(this._options.markDirectories,!1),this.objectMode=this._getValue(this._options.objectMode,!1),this.onlyDirectories=this._getValue(this._options.onlyDirectories,!1),this.onlyFiles=this._getValue(this._options.onlyFiles,!0),this.stats=this._getValue(this._options.stats,!1),this.suppressErrors=this._getValue(this._options.suppressErrors,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!1),this.unique=this._getValue(this._options.unique,!0),this.onlyDirectories&&(this.onlyFiles=!1),this.stats&&(this.objectMode=!0)}_getValue(e,r){return e===void 0?r:e}_getFileSystemMethods(e={}){return Object.assign(Object.assign({},iC.DEFAULT_FILE_SYSTEM_ADAPTER),e)}};iC.default=qO});var EP=U((aNt,nse)=>{"use strict";var tse=nie(),rse=sie(),vet=zie(),Det=Xie(),Pet=$ie(),jO=ese(),Ed=Sf();async function GO(t,e){sC(t);let r=WO(t,vet.default,e),o=await Promise.all(r);return Ed.array.flatten(o)}(function(t){function e(u,A){sC(u);let p=WO(u,Pet.default,A);return Ed.array.flatten(p)}t.sync=e;function r(u,A){sC(u);let p=WO(u,Det.default,A);return Ed.stream.merge(p)}t.stream=r;function o(u,A){sC(u);let p=rse.transform([].concat(u)),h=new jO.default(A);return tse.generate(p,h)}t.generateTasks=o;function a(u,A){sC(u);let p=new jO.default(A);return Ed.pattern.isDynamicPattern(u,p)}t.isDynamicPattern=a;function n(u){return sC(u),Ed.path.escape(u)}t.escapePath=n})(GO||(GO={}));function WO(t,e,r){let o=rse.transform([].concat(t)),a=new jO.default(r),n=tse.generate(o,a),u=new e(a);return n.map(u.read,u)}function sC(t){if(![].concat(t).every(o=>Ed.string.isString(o)&&!Ed.string.isEmpty(o)))throw new TypeError("Patterns must be a string (non empty) or an array of strings")}nse.exports=GO});var sse=U(Id=>{"use strict";var{promisify:xet}=Ie("util"),ise=Ie("fs");async function YO(t,e,r){if(typeof r!="string")throw new TypeError(`Expected a string, got ${typeof r}`);try{return(await xet(ise[t])(r))[e]()}catch(o){if(o.code==="ENOENT")return!1;throw o}}function KO(t,e,r){if(typeof r!="string")throw new TypeError(`Expected a string, got ${typeof r}`);try{return ise[t](r)[e]()}catch(o){if(o.code==="ENOENT")return!1;throw o}}Id.isFile=YO.bind(null,"stat","isFile");Id.isDirectory=YO.bind(null,"stat","isDirectory");Id.isSymlink=YO.bind(null,"lstat","isSymbolicLink");Id.isFileSync=KO.bind(null,"statSync","isFile");Id.isDirectorySync=KO.bind(null,"statSync","isDirectory");Id.isSymlinkSync=KO.bind(null,"lstatSync","isSymbolicLink")});var use=U((cNt,VO)=>{"use strict";var wd=Ie("path"),ose=sse(),ase=t=>t.length>1?`{${t.join(",")}}`:t[0],lse=(t,e)=>{let r=t[0]==="!"?t.slice(1):t;return wd.isAbsolute(r)?r:wd.join(e,r)},bet=(t,e)=>wd.extname(t)?`**/${t}`:`**/${t}.${ase(e)}`,cse=(t,e)=>{if(e.files&&!Array.isArray(e.files))throw new TypeError(`Expected \`files\` to be of type \`Array\` but received type \`${typeof e.files}\``);if(e.extensions&&!Array.isArray(e.extensions))throw new TypeError(`Expected \`extensions\` to be of type \`Array\` but received type \`${typeof e.extensions}\``);return e.files&&e.extensions?e.files.map(r=>wd.posix.join(t,bet(r,e.extensions))):e.files?e.files.map(r=>wd.posix.join(t,`**/${r}`)):e.extensions?[wd.posix.join(t,`**/*.${ase(e.extensions)}`)]:[wd.posix.join(t,"**")]};VO.exports=async(t,e)=>{if(e={cwd:process.cwd(),...e},typeof e.cwd!="string")throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof e.cwd}\``);let r=await Promise.all([].concat(t).map(async o=>await ose.isDirectory(lse(o,e.cwd))?cse(o,e):o));return[].concat.apply([],r)};VO.exports.sync=(t,e)=>{if(e={cwd:process.cwd(),...e},typeof e.cwd!="string")throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof e.cwd}\``);let r=[].concat(t).map(o=>ose.isDirectorySync(lse(o,e.cwd))?cse(o,e):o);return[].concat.apply([],r)}});var Cse=U((uNt,yse)=>{function Ase(t){return Array.isArray(t)?t:[t]}var gse="",fse=" ",JO="\\",Qet=/^\s+$/,ket=/^\\!/,Fet=/^\\#/,Ret=/\r?\n/g,Tet=/^\.*\/|^\.+$/,zO="/",pse=typeof Symbol<"u"?Symbol.for("node-ignore"):"node-ignore",Net=(t,e,r)=>Object.defineProperty(t,e,{value:r}),Let=/([0-z])-([0-z])/g,dse=()=>!1,Oet=t=>t.replace(Let,(e,r,o)=>r.charCodeAt(0)<=o.charCodeAt(0)?e:gse),Met=t=>{let{length:e}=t;return t.slice(0,e-e%2)},Uet=[[/\\?\s+$/,t=>t.indexOf("\\")===0?fse:gse],[/\\\s/g,()=>fse],[/[\\$.|*+(){^]/g,t=>`\\${t}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(t,e,r)=>e+6`${e}[^\\/]*`],[/\\\\\\(?=[$.|*+(){^])/g,()=>JO],[/\\\\/g,()=>JO],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(t,e,r,o,a)=>e===JO?`\\[${r}${Met(o)}${a}`:a==="]"&&o.length%2===0?`[${Oet(r)}${o}]`:"[]"],[/(?:[^*])$/,t=>/\/$/.test(t)?`${t}$`:`${t}(?=$|\\/$)`],[/(\^|\\\/)?\\\*$/,(t,e)=>`${e?`${e}[^/]+`:"[^/]*"}(?=$|\\/$)`]],hse=Object.create(null),_et=(t,e)=>{let r=hse[t];return r||(r=Uet.reduce((o,a)=>o.replace(a[0],a[1].bind(t)),t),hse[t]=r),e?new RegExp(r,"i"):new RegExp(r)},$O=t=>typeof t=="string",Het=t=>t&&$O(t)&&!Qet.test(t)&&t.indexOf("#")!==0,qet=t=>t.split(Ret),XO=class{constructor(e,r,o,a){this.origin=e,this.pattern=r,this.negative=o,this.regex=a}},jet=(t,e)=>{let r=t,o=!1;t.indexOf("!")===0&&(o=!0,t=t.substr(1)),t=t.replace(ket,"!").replace(Fet,"#");let a=_et(t,e);return new XO(r,t,o,a)},Get=(t,e)=>{throw new e(t)},xf=(t,e,r)=>$O(t)?t?xf.isNotRelative(t)?r(`path should be a \`path.relative()\`d string, but got "${e}"`,RangeError):!0:r("path must not be empty",TypeError):r(`path must be a string, but got \`${e}\``,TypeError),mse=t=>Tet.test(t);xf.isNotRelative=mse;xf.convert=t=>t;var ZO=class{constructor({ignorecase:e=!0,ignoreCase:r=e,allowRelativePaths:o=!1}={}){Net(this,pse,!0),this._rules=[],this._ignoreCase=r,this._allowRelativePaths=o,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}_addPattern(e){if(e&&e[pse]){this._rules=this._rules.concat(e._rules),this._added=!0;return}if(Het(e)){let r=jet(e,this._ignoreCase);this._added=!0,this._rules.push(r)}}add(e){return this._added=!1,Ase($O(e)?qet(e):e).forEach(this._addPattern,this),this._added&&this._initCache(),this}addPattern(e){return this.add(e)}_testOne(e,r){let o=!1,a=!1;return this._rules.forEach(n=>{let{negative:u}=n;if(a===u&&o!==a||u&&!o&&!a&&!r)return;n.regex.test(e)&&(o=!u,a=u)}),{ignored:o,unignored:a}}_test(e,r,o,a){let n=e&&xf.convert(e);return xf(n,e,this._allowRelativePaths?dse:Get),this._t(n,r,o,a)}_t(e,r,o,a){if(e in r)return r[e];if(a||(a=e.split(zO)),a.pop(),!a.length)return r[e]=this._testOne(e,o);let n=this._t(a.join(zO)+zO,r,o,a);return r[e]=n.ignored?n:this._testOne(e,o)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return Ase(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}},IP=t=>new ZO(t),Wet=t=>xf(t&&xf.convert(t),t,dse);IP.isPathValid=Wet;IP.default=IP;yse.exports=IP;if(typeof process<"u"&&(process.env&&process.env.IGNORE_TEST_WIN32||process.platform==="win32")){let t=r=>/^\\\\\?\\/.test(r)||/["<>|\u0000-\u001F]+/u.test(r)?r:r.replace(/\\/g,"/");xf.convert=t;let e=/^[a-z]:\//i;xf.isNotRelative=r=>e.test(r)||mse(r)}});var Ise=U((ANt,Ese)=>{"use strict";Ese.exports=t=>{let e=/^\\\\\?\\/.test(t),r=/[^\u0000-\u0080]+/.test(t);return e||r?t:t.replace(/\\/g,"/")}});var xse=U((fNt,eM)=>{"use strict";var{promisify:Yet}=Ie("util"),wse=Ie("fs"),bf=Ie("path"),Bse=EP(),Ket=Cse(),jw=Ise(),vse=["**/node_modules/**","**/flow-typed/**","**/coverage/**","**/.git"],Vet=Yet(wse.readFile),Jet=t=>e=>e.startsWith("!")?"!"+bf.posix.join(t,e.slice(1)):bf.posix.join(t,e),zet=(t,e)=>{let r=jw(bf.relative(e.cwd,bf.dirname(e.fileName)));return t.split(/\r?\n/).filter(Boolean).filter(o=>!o.startsWith("#")).map(Jet(r))},Dse=t=>{let e=Ket();for(let r of t)e.add(zet(r.content,{cwd:r.cwd,fileName:r.filePath}));return e},Xet=(t,e)=>{if(t=jw(t),bf.isAbsolute(e)){if(jw(e).startsWith(t))return e;throw new Error(`Path ${e} is not in cwd ${t}`)}return bf.join(t,e)},Sse=(t,e)=>r=>t.ignores(jw(bf.relative(e,Xet(e,r.path||r)))),Zet=async(t,e)=>{let r=bf.join(e,t),o=await Vet(r,"utf8");return{cwd:e,filePath:r,content:o}},$et=(t,e)=>{let r=bf.join(e,t),o=wse.readFileSync(r,"utf8");return{cwd:e,filePath:r,content:o}},Pse=({ignore:t=[],cwd:e=jw(process.cwd())}={})=>({ignore:t,cwd:e});eM.exports=async t=>{t=Pse(t);let e=await Bse("**/.gitignore",{ignore:vse.concat(t.ignore),cwd:t.cwd}),r=await Promise.all(e.map(a=>Zet(a,t.cwd))),o=Dse(r);return Sse(o,t.cwd)};eM.exports.sync=t=>{t=Pse(t);let r=Bse.sync("**/.gitignore",{ignore:vse.concat(t.ignore),cwd:t.cwd}).map(a=>$et(a,t.cwd)),o=Dse(r);return Sse(o,t.cwd)}});var Qse=U((pNt,bse)=>{"use strict";var{Transform:ett}=Ie("stream"),wP=class extends ett{constructor(){super({objectMode:!0})}},tM=class extends wP{constructor(e){super(),this._filter=e}_transform(e,r,o){this._filter(e)&&this.push(e),o()}},rM=class extends wP{constructor(){super(),this._pushed=new Set}_transform(e,r,o){this._pushed.has(e)||(this.push(e),this._pushed.add(e)),o()}};bse.exports={FilterStream:tM,UniqueStream:rM}});var oM=U((hNt,Bd)=>{"use strict";var Fse=Ie("fs"),BP=bne(),ttt=DL(),vP=EP(),DP=use(),nM=xse(),{FilterStream:rtt,UniqueStream:ntt}=Qse(),Rse=()=>!1,kse=t=>t[0]==="!",itt=t=>{if(!t.every(e=>typeof e=="string"))throw new TypeError("Patterns must be a string or an array of strings")},stt=(t={})=>{if(!t.cwd)return;let e;try{e=Fse.statSync(t.cwd)}catch{return}if(!e.isDirectory())throw new Error("The `cwd` option must be a path to a directory")},ott=t=>t.stats instanceof Fse.Stats?t.path:t,SP=(t,e)=>{t=BP([].concat(t)),itt(t),stt(e);let r=[];e={ignore:[],expandDirectories:!0,...e};for(let[o,a]of t.entries()){if(kse(a))continue;let n=t.slice(o).filter(A=>kse(A)).map(A=>A.slice(1)),u={...e,ignore:e.ignore.concat(n)};r.push({pattern:a,options:u})}return r},att=(t,e)=>{let r={};return t.options.cwd&&(r.cwd=t.options.cwd),Array.isArray(t.options.expandDirectories)?r={...r,files:t.options.expandDirectories}:typeof t.options.expandDirectories=="object"&&(r={...r,...t.options.expandDirectories}),e(t.pattern,r)},iM=(t,e)=>t.options.expandDirectories?att(t,e):[t.pattern],Tse=t=>t&&t.gitignore?nM.sync({cwd:t.cwd,ignore:t.ignore}):Rse,sM=t=>e=>{let{options:r}=t;return r.ignore&&Array.isArray(r.ignore)&&r.expandDirectories&&(r.ignore=DP.sync(r.ignore)),{pattern:e,options:r}};Bd.exports=async(t,e)=>{let r=SP(t,e),o=async()=>e&&e.gitignore?nM({cwd:e.cwd,ignore:e.ignore}):Rse,a=async()=>{let p=await Promise.all(r.map(async h=>{let E=await iM(h,DP);return Promise.all(E.map(sM(h)))}));return BP(...p)},[n,u]=await Promise.all([o(),a()]),A=await Promise.all(u.map(p=>vP(p.pattern,p.options)));return BP(...A).filter(p=>!n(ott(p)))};Bd.exports.sync=(t,e)=>{let r=SP(t,e),o=[];for(let u of r){let A=iM(u,DP.sync).map(sM(u));o.push(...A)}let a=Tse(e),n=[];for(let u of o)n=BP(n,vP.sync(u.pattern,u.options));return n.filter(u=>!a(u))};Bd.exports.stream=(t,e)=>{let r=SP(t,e),o=[];for(let A of r){let p=iM(A,DP.sync).map(sM(A));o.push(...p)}let a=Tse(e),n=new rtt(A=>!a(A)),u=new ntt;return ttt(o.map(A=>vP.stream(A.pattern,A.options))).pipe(n).pipe(u)};Bd.exports.generateGlobTasks=SP;Bd.exports.hasMagic=(t,e)=>[].concat(t).some(r=>vP.isDynamicPattern(r,e));Bd.exports.gitignore=nM});var bn={};Yt(bn,{checksumFile:()=>xP,checksumPattern:()=>bP,makeHash:()=>Vs});function Vs(...t){let e=(0,PP.createHash)("sha512"),r="";for(let o of t)typeof o=="string"?r+=o:o&&(r&&(e.update(r),r=""),e.update(o));return r&&e.update(r),e.digest("hex")}async function xP(t,{baseFs:e,algorithm:r}={baseFs:ae,algorithm:"sha512"}){let o=await e.openPromise(t,"r");try{let n=Buffer.allocUnsafeSlow(65536),u=(0,PP.createHash)(r),A=0;for(;(A=await e.readPromise(o,n,0,65536))!==0;)u.update(A===65536?n:n.slice(0,A));return u.digest("hex")}finally{await e.closePromise(o)}}async function bP(t,{cwd:e}){let o=(await(0,aM.default)(t,{cwd:ue.fromPortablePath(e),expandDirectories:!1,onlyDirectories:!0,unique:!0})).map(A=>`${A}/**/*`),a=await(0,aM.default)([t,...o],{cwd:ue.fromPortablePath(e),expandDirectories:!1,onlyFiles:!1,unique:!0});a.sort();let n=await Promise.all(a.map(async A=>{let p=[Buffer.from(A)],h=ue.toPortablePath(A),E=await ae.lstatPromise(h);return E.isSymbolicLink()?p.push(Buffer.from(await ae.readlinkPromise(h))):E.isFile()&&p.push(await ae.readFilePromise(h)),p.join("\0")})),u=(0,PP.createHash)("sha512");for(let A of n)u.update(A);return u.digest("hex")}var PP,aM,t0=dt(()=>{bt();PP=Ie("crypto"),aM=tt(oM())});var Y={};Yt(Y,{areDescriptorsEqual:()=>Use,areIdentsEqual:()=>Vw,areLocatorsEqual:()=>Jw,areVirtualPackagesEquivalent:()=>dtt,bindDescriptor:()=>htt,bindLocator:()=>gtt,convertDescriptorToLocator:()=>QP,convertLocatorToDescriptor:()=>cM,convertPackageToLocator:()=>Att,convertToIdent:()=>utt,convertToManifestRange:()=>Ett,copyPackage:()=>Ww,devirtualizeDescriptor:()=>Yw,devirtualizeLocator:()=>Kw,ensureDevirtualizedDescriptor:()=>ftt,ensureDevirtualizedLocator:()=>ptt,getIdentVendorPath:()=>hM,isPackageCompatible:()=>NP,isVirtualDescriptor:()=>Qf,isVirtualLocator:()=>Wc,makeDescriptor:()=>mn,makeIdent:()=>nA,makeLocator:()=>us,makeRange:()=>FP,parseDescriptor:()=>r0,parseFileStyleRange:()=>ytt,parseIdent:()=>Ys,parseLocator:()=>kf,parseRange:()=>vd,prettyDependent:()=>vL,prettyDescriptor:()=>Ln,prettyIdent:()=>cs,prettyLocator:()=>kr,prettyLocatorNoColors:()=>pM,prettyRange:()=>TP,prettyReference:()=>Xw,prettyResolution:()=>qw,prettyWorkspace:()=>Zw,renamePackage:()=>uM,slugifyIdent:()=>lM,slugifyLocator:()=>aC,sortDescriptors:()=>lC,stringifyDescriptor:()=>ba,stringifyIdent:()=>nn,stringifyLocator:()=>Vl,tryParseDescriptor:()=>zw,tryParseIdent:()=>_se,tryParseLocator:()=>kP,tryParseRange:()=>mtt,virtualizeDescriptor:()=>AM,virtualizePackage:()=>fM});function nA(t,e){if(t!=null&&t.startsWith("@"))throw new Error("Invalid scope: don't prefix it with '@'");return{identHash:Vs(t,e),scope:t,name:e}}function mn(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:Vs(t.identHash,e),range:e}}function us(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:Vs(t.identHash,e),reference:e}}function utt(t){return{identHash:t.identHash,scope:t.scope,name:t.name}}function QP(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.descriptorHash,reference:t.range}}function cM(t){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:t.locatorHash,range:t.reference}}function Att(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.locatorHash,reference:t.reference}}function uM(t,e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference,version:t.version,languageName:t.languageName,linkType:t.linkType,conditions:t.conditions,dependencies:new Map(t.dependencies),peerDependencies:new Map(t.peerDependencies),dependenciesMeta:new Map(t.dependenciesMeta),peerDependenciesMeta:new Map(t.peerDependenciesMeta),bin:new Map(t.bin)}}function Ww(t){return uM(t,t)}function AM(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return mn(t,`virtual:${e}#${t.range}`)}function fM(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return uM(t,us(t,`virtual:${e}#${t.reference}`))}function Qf(t){return t.range.startsWith(Gw)}function Wc(t){return t.reference.startsWith(Gw)}function Yw(t){if(!Qf(t))throw new Error("Not a virtual descriptor");return mn(t,t.range.replace(/^[^#]*#/,""))}function Kw(t){if(!Wc(t))throw new Error("Not a virtual descriptor");return us(t,t.reference.replace(/^[^#]*#/,""))}function ftt(t){return Qf(t)?mn(t,t.range.replace(/^[^#]*#/,"")):t}function ptt(t){return Wc(t)?us(t,t.reference.replace(/^[^#]*#/,"")):t}function htt(t,e){return t.range.includes("::")?t:mn(t,`${t.range}::${oC.default.stringify(e)}`)}function gtt(t,e){return t.reference.includes("::")?t:us(t,`${t.reference}::${oC.default.stringify(e)}`)}function Vw(t,e){return t.identHash===e.identHash}function Use(t,e){return t.descriptorHash===e.descriptorHash}function Jw(t,e){return t.locatorHash===e.locatorHash}function dtt(t,e){if(!Wc(t))throw new Error("Invalid package type");if(!Wc(e))throw new Error("Invalid package type");if(!Vw(t,e)||t.dependencies.size!==e.dependencies.size)return!1;for(let r of t.dependencies.values()){let o=e.dependencies.get(r.identHash);if(!o||!Use(r,o))return!1}return!0}function Ys(t){let e=_se(t);if(!e)throw new Error(`Invalid ident (${t})`);return e}function _se(t){let e=t.match(/^(?:@([^/]+?)\/)?([^@/]+)$/);if(!e)return null;let[,r,o]=e;return nA(typeof r<"u"?r:null,o)}function r0(t,e=!1){let r=zw(t,e);if(!r)throw new Error(`Invalid descriptor (${t})`);return r}function zw(t,e=!1){let r=e?t.match(/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))$/):t.match(/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))?$/);if(!r)return null;let[,o,a,n]=r;if(n==="unknown")throw new Error(`Invalid range (${t})`);let u=typeof o<"u"?o:null,A=typeof n<"u"?n:"unknown";return mn(nA(u,a),A)}function kf(t,e=!1){let r=kP(t,e);if(!r)throw new Error(`Invalid locator (${t})`);return r}function kP(t,e=!1){let r=e?t.match(/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))$/):t.match(/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))?$/);if(!r)return null;let[,o,a,n]=r;if(n==="unknown")throw new Error(`Invalid reference (${t})`);let u=typeof o<"u"?o:null,A=typeof n<"u"?n:"unknown";return us(nA(u,a),A)}function vd(t,e){let r=t.match(/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/);if(r===null)throw new Error(`Invalid range (${t})`);let o=typeof r[1]<"u"?r[1]:null;if(typeof(e==null?void 0:e.requireProtocol)=="string"&&o!==e.requireProtocol)throw new Error(`Invalid protocol (${o})`);if((e==null?void 0:e.requireProtocol)&&o===null)throw new Error(`Missing protocol (${o})`);let a=typeof r[3]<"u"?decodeURIComponent(r[2]):null;if((e==null?void 0:e.requireSource)&&a===null)throw new Error(`Missing source (${t})`);let n=typeof r[3]<"u"?decodeURIComponent(r[3]):decodeURIComponent(r[2]),u=e!=null&&e.parseSelector?oC.default.parse(n):n,A=typeof r[4]<"u"?oC.default.parse(r[4]):null;return{protocol:o,source:a,selector:u,params:A}}function mtt(t,e){try{return vd(t,e)}catch{return null}}function ytt(t,{protocol:e}){let{selector:r,params:o}=vd(t,{requireProtocol:e,requireBindings:!0});if(typeof o.locator!="string")throw new Error(`Assertion failed: Invalid bindings for ${t}`);return{parentLocator:kf(o.locator,!0),path:r}}function Nse(t){return t=t.replace(/%/g,"%25"),t=t.replace(/:/g,"%3A"),t=t.replace(/#/g,"%23"),t}function Ctt(t){return t===null?!1:Object.entries(t).length>0}function FP({protocol:t,source:e,selector:r,params:o}){let a="";return t!==null&&(a+=`${t}`),e!==null&&(a+=`${Nse(e)}#`),a+=Nse(r),Ctt(o)&&(a+=`::${oC.default.stringify(o)}`),a}function Ett(t){let{params:e,protocol:r,source:o,selector:a}=vd(t);for(let n in e)n.startsWith("__")&&delete e[n];return FP({protocol:r,source:o,params:e,selector:a})}function nn(t){return t.scope?`@${t.scope}/${t.name}`:`${t.name}`}function ba(t){return t.scope?`@${t.scope}/${t.name}@${t.range}`:`${t.name}@${t.range}`}function Vl(t){return t.scope?`@${t.scope}/${t.name}@${t.reference}`:`${t.name}@${t.reference}`}function lM(t){return t.scope!==null?`@${t.scope}-${t.name}`:t.name}function aC(t){let{protocol:e,selector:r}=vd(t.reference),o=e!==null?e.replace(/:$/,""):"exotic",a=Lse.default.valid(r),n=a!==null?`${o}-${a}`:`${o}`,u=10,A=t.scope?`${lM(t)}-${n}-${t.locatorHash.slice(0,u)}`:`${lM(t)}-${n}-${t.locatorHash.slice(0,u)}`;return Li(A)}function cs(t,e){return e.scope?`${Kt(t,`@${e.scope}/`,Bt.SCOPE)}${Kt(t,e.name,Bt.NAME)}`:`${Kt(t,e.name,Bt.NAME)}`}function RP(t){if(t.startsWith(Gw)){let e=RP(t.substring(t.indexOf("#")+1)),r=t.substring(Gw.length,Gw.length+ltt);return`${e} [${r}]`}else return t.replace(/\?.*/,"?[...]")}function TP(t,e){return`${Kt(t,RP(e),Bt.RANGE)}`}function Ln(t,e){return`${cs(t,e)}${Kt(t,"@",Bt.RANGE)}${TP(t,e.range)}`}function Xw(t,e){return`${Kt(t,RP(e),Bt.REFERENCE)}`}function kr(t,e){return`${cs(t,e)}${Kt(t,"@",Bt.REFERENCE)}${Xw(t,e.reference)}`}function pM(t){return`${nn(t)}@${RP(t.reference)}`}function lC(t){return Pa(t,[e=>nn(e),e=>e.range])}function Zw(t,e){return cs(t,e.locator)}function qw(t,e,r){let o=Qf(e)?Yw(e):e;return r===null?`${Ln(t,o)} \u2192 ${BL(t).Cross}`:o.identHash===r.identHash?`${Ln(t,o)} \u2192 ${Xw(t,r.reference)}`:`${Ln(t,o)} \u2192 ${kr(t,r)}`}function vL(t,e,r){return r===null?`${kr(t,e)}`:`${kr(t,e)} (via ${TP(t,r.range)})`}function hM(t){return`node_modules/${nn(t)}`}function NP(t,e){return t.conditions?ctt(t.conditions,r=>{let[,o,a]=r.match(Mse),n=e[o];return n?n.includes(a):!0}):!0}var oC,Lse,Ose,Gw,ltt,Mse,ctt,Ks=dt(()=>{bt();oC=tt(Ie("querystring")),Lse=tt(si()),Ose=tt(iX());Jl();t0();Kl();Ks();Gw="virtual:",ltt=5,Mse=/(os|cpu|libc)=([a-z0-9_-]+)/,ctt=(0,Ose.makeParser)(Mse)});var Hse,qse=dt(()=>{Ks();Hse={hooks:{reduceDependency:(t,e,r,o,{resolver:a,resolveOptions:n})=>{for(let{pattern:u,reference:A}of e.topLevelWorkspace.manifest.resolutions){if(u.from&&(u.from.fullName!==nn(r)||e.configuration.normalizeLocator(us(Ys(u.from.fullName),u.from.description??r.reference)).locatorHash!==r.locatorHash)||u.descriptor.fullName!==nn(t)||e.configuration.normalizeDependency(mn(kf(u.descriptor.fullName),u.descriptor.description??t.range)).descriptorHash!==t.descriptorHash)continue;return a.bindDescriptor(e.configuration.normalizeDependency(mn(t,A)),e.topLevelWorkspace.anchoredLocator,n)}return t},validateProject:async(t,e)=>{for(let r of t.workspaces){let o=Zw(t.configuration,r);await t.configuration.triggerHook(a=>a.validateWorkspace,r,{reportWarning:(a,n)=>e.reportWarning(a,`${o}: ${n}`),reportError:(a,n)=>e.reportError(a,`${o}: ${n}`)})}},validateWorkspace:async(t,e)=>{let{manifest:r}=t;r.resolutions.length&&t.cwd!==t.project.cwd&&r.errors.push(new Error("Resolutions field will be ignored"));for(let o of r.errors)e.reportWarning(57,o.message)}}}});var $w,Gn,Dd=dt(()=>{$w=class{supportsDescriptor(e,r){return!!(e.range.startsWith($w.protocol)||r.project.tryWorkspaceByDescriptor(e)!==null)}supportsLocator(e,r){return!!e.reference.startsWith($w.protocol)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){return[o.project.getWorkspaceByDescriptor(e).anchoredLocator]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let o=r.project.getWorkspaceByCwd(e.reference.slice($w.protocol.length));return{...e,version:o.manifest.version||"0.0.0",languageName:"unknown",linkType:"SOFT",conditions:null,dependencies:r.project.configuration.normalizeDependencyMap(new Map([...o.manifest.dependencies,...o.manifest.devDependencies])),peerDependencies:new Map([...o.manifest.peerDependencies]),dependenciesMeta:o.manifest.dependenciesMeta,peerDependenciesMeta:o.manifest.peerDependenciesMeta,bin:o.manifest.bin}}},Gn=$w;Gn.protocol="workspace:"});var Tr={};Yt(Tr,{SemVer:()=>Wse.SemVer,clean:()=>wtt,satisfiesWithPrereleases:()=>Sd,validRange:()=>ll});function Sd(t,e,r=!1){if(!t)return!1;let o=`${e}${r}`,a=jse.get(o);if(typeof a>"u")try{a=new LP.default.Range(e,{includePrerelease:!0,loose:r})}catch{return!1}finally{jse.set(o,a||null)}else if(a===null)return!1;let n;try{n=new LP.default.SemVer(t,a)}catch{return!1}return a.test(n)?!0:(n.prerelease&&(n.prerelease=[]),a.set.some(u=>{for(let A of u)A.semver.prerelease&&(A.semver.prerelease=[]);return u.every(A=>A.test(n))}))}function ll(t){if(t.indexOf(":")!==-1)return null;let e=Gse.get(t);if(typeof e<"u")return e;try{e=new LP.default.Range(t)}catch{e=null}return Gse.set(t,e),e}function wtt(t){let e=Itt.exec(t);return e?e[1]:null}var LP,Wse,jse,Gse,Itt,n0=dt(()=>{LP=tt(si()),Wse=tt(si()),jse=new Map;Gse=new Map;Itt=/^(?:[\sv=]*?)((0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)(?:\s*)$/});function Yse(t){let e=t.match(/^[ \t]+/m);return e?e[0]:" "}function Kse(t){return t.charCodeAt(0)===65279?t.slice(1):t}function zo(t){return t.replace(/\\/g,"/")}function OP(t,{yamlCompatibilityMode:e}){return e?gL(t):typeof t>"u"||typeof t=="boolean"?t:null}function Vse(t,e){let r=e.search(/[^!]/);if(r===-1)return"invalid";let o=r%2===0?"":"!",a=e.slice(r);return`${o}${t}=${a}`}function gM(t,e){return e.length===1?Vse(t,e[0]):`(${e.map(r=>Vse(t,r)).join(" | ")})`}var Jse,cC,Nt,uC=dt(()=>{bt();_l();Jse=tt(si());Dd();Kl();n0();Ks();cC=class{constructor(){this.indent=" ";this.name=null;this.version=null;this.os=null;this.cpu=null;this.libc=null;this.type=null;this.packageManager=null;this.private=!1;this.license=null;this.main=null;this.module=null;this.browser=null;this.languageName=null;this.bin=new Map;this.scripts=new Map;this.dependencies=new Map;this.devDependencies=new Map;this.peerDependencies=new Map;this.workspaceDefinitions=[];this.dependenciesMeta=new Map;this.peerDependenciesMeta=new Map;this.resolutions=[];this.files=null;this.publishConfig=null;this.installConfig=null;this.preferUnplugged=null;this.raw={};this.errors=[]}static async tryFind(e,{baseFs:r=new xn}={}){let o=z.join(e,"package.json");try{return await cC.fromFile(o,{baseFs:r})}catch(a){if(a.code==="ENOENT")return null;throw a}}static async find(e,{baseFs:r}={}){let o=await cC.tryFind(e,{baseFs:r});if(o===null)throw new Error("Manifest not found");return o}static async fromFile(e,{baseFs:r=new xn}={}){let o=new cC;return await o.loadFile(e,{baseFs:r}),o}static fromText(e){let r=new cC;return r.loadFromText(e),r}loadFromText(e){let r;try{r=JSON.parse(Kse(e)||"{}")}catch(o){throw o.message+=` (when parsing ${e})`,o}this.load(r),this.indent=Yse(e)}async loadFile(e,{baseFs:r=new xn}){let o=await r.readFilePromise(e,"utf8"),a;try{a=JSON.parse(Kse(o)||"{}")}catch(n){throw n.message+=` (when parsing ${e})`,n}this.load(a),this.indent=Yse(o)}load(e,{yamlCompatibilityMode:r=!1}={}){if(typeof e!="object"||e===null)throw new Error(`Utterly invalid manifest data (${e})`);this.raw=e;let o=[];if(this.name=null,typeof e.name=="string")try{this.name=Ys(e.name)}catch{o.push(new Error("Parsing failed for the 'name' field"))}if(typeof e.version=="string"?this.version=e.version:this.version=null,Array.isArray(e.os)){let n=[];this.os=n;for(let u of e.os)typeof u!="string"?o.push(new Error("Parsing failed for the 'os' field")):n.push(u)}else this.os=null;if(Array.isArray(e.cpu)){let n=[];this.cpu=n;for(let u of e.cpu)typeof u!="string"?o.push(new Error("Parsing failed for the 'cpu' field")):n.push(u)}else this.cpu=null;if(Array.isArray(e.libc)){let n=[];this.libc=n;for(let u of e.libc)typeof u!="string"?o.push(new Error("Parsing failed for the 'libc' field")):n.push(u)}else this.libc=null;if(typeof e.type=="string"?this.type=e.type:this.type=null,typeof e.packageManager=="string"?this.packageManager=e.packageManager:this.packageManager=null,typeof e.private=="boolean"?this.private=e.private:this.private=!1,typeof e.license=="string"?this.license=e.license:this.license=null,typeof e.languageName=="string"?this.languageName=e.languageName:this.languageName=null,typeof e.main=="string"?this.main=zo(e.main):this.main=null,typeof e.module=="string"?this.module=zo(e.module):this.module=null,e.browser!=null)if(typeof e.browser=="string")this.browser=zo(e.browser);else{this.browser=new Map;for(let[n,u]of Object.entries(e.browser))this.browser.set(zo(n),typeof u=="string"?zo(u):u)}else this.browser=null;if(this.bin=new Map,typeof e.bin=="string")this.name!==null?this.bin.set(this.name.name,zo(e.bin)):o.push(new Error("String bin field, but no attached package name"));else if(typeof e.bin=="object"&&e.bin!==null)for(let[n,u]of Object.entries(e.bin)){if(typeof u!="string"){o.push(new Error(`Invalid bin definition for '${n}'`));continue}let A=Ys(n);this.bin.set(A.name,zo(u))}if(this.scripts=new Map,typeof e.scripts=="object"&&e.scripts!==null)for(let[n,u]of Object.entries(e.scripts)){if(typeof u!="string"){o.push(new Error(`Invalid script definition for '${n}'`));continue}this.scripts.set(n,u)}if(this.dependencies=new Map,typeof e.dependencies=="object"&&e.dependencies!==null)for(let[n,u]of Object.entries(e.dependencies)){if(typeof u!="string"){o.push(new Error(`Invalid dependency range for '${n}'`));continue}let A;try{A=Ys(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=mn(A,u);this.dependencies.set(p.identHash,p)}if(this.devDependencies=new Map,typeof e.devDependencies=="object"&&e.devDependencies!==null)for(let[n,u]of Object.entries(e.devDependencies)){if(typeof u!="string"){o.push(new Error(`Invalid dependency range for '${n}'`));continue}let A;try{A=Ys(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=mn(A,u);this.devDependencies.set(p.identHash,p)}if(this.peerDependencies=new Map,typeof e.peerDependencies=="object"&&e.peerDependencies!==null)for(let[n,u]of Object.entries(e.peerDependencies)){let A;try{A=Ys(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}(typeof u!="string"||!u.startsWith(Gn.protocol)&&!ll(u))&&(o.push(new Error(`Invalid dependency range for '${n}'`)),u="*");let p=mn(A,u);this.peerDependencies.set(p.identHash,p)}typeof e.workspaces=="object"&&e.workspaces!==null&&e.workspaces.nohoist&&o.push(new Error("'nohoist' is deprecated, please use 'installConfig.hoistingLimits' instead"));let a=Array.isArray(e.workspaces)?e.workspaces:typeof e.workspaces=="object"&&e.workspaces!==null&&Array.isArray(e.workspaces.packages)?e.workspaces.packages:[];this.workspaceDefinitions=[];for(let n of a){if(typeof n!="string"){o.push(new Error(`Invalid workspace definition for '${n}'`));continue}this.workspaceDefinitions.push({pattern:n})}if(this.dependenciesMeta=new Map,typeof e.dependenciesMeta=="object"&&e.dependenciesMeta!==null)for(let[n,u]of Object.entries(e.dependenciesMeta)){if(typeof u!="object"||u===null){o.push(new Error(`Invalid meta field for '${n}`));continue}let A=r0(n),p=this.ensureDependencyMeta(A),h=OP(u.built,{yamlCompatibilityMode:r});if(h===null){o.push(new Error(`Invalid built meta field for '${n}'`));continue}let E=OP(u.optional,{yamlCompatibilityMode:r});if(E===null){o.push(new Error(`Invalid optional meta field for '${n}'`));continue}let w=OP(u.unplugged,{yamlCompatibilityMode:r});if(w===null){o.push(new Error(`Invalid unplugged meta field for '${n}'`));continue}Object.assign(p,{built:h,optional:E,unplugged:w})}if(this.peerDependenciesMeta=new Map,typeof e.peerDependenciesMeta=="object"&&e.peerDependenciesMeta!==null)for(let[n,u]of Object.entries(e.peerDependenciesMeta)){if(typeof u!="object"||u===null){o.push(new Error(`Invalid meta field for '${n}'`));continue}let A=r0(n),p=this.ensurePeerDependencyMeta(A),h=OP(u.optional,{yamlCompatibilityMode:r});if(h===null){o.push(new Error(`Invalid optional meta field for '${n}'`));continue}Object.assign(p,{optional:h})}if(this.resolutions=[],typeof e.resolutions=="object"&&e.resolutions!==null)for(let[n,u]of Object.entries(e.resolutions)){if(typeof u!="string"){o.push(new Error(`Invalid resolution entry for '${n}'`));continue}try{this.resolutions.push({pattern:xD(n),reference:u})}catch(A){o.push(A);continue}}if(Array.isArray(e.files)){this.files=new Set;for(let n of e.files){if(typeof n!="string"){o.push(new Error(`Invalid files entry for '${n}'`));continue}this.files.add(n)}}else this.files=null;if(typeof e.publishConfig=="object"&&e.publishConfig!==null){if(this.publishConfig={},typeof e.publishConfig.access=="string"&&(this.publishConfig.access=e.publishConfig.access),typeof e.publishConfig.main=="string"&&(this.publishConfig.main=zo(e.publishConfig.main)),typeof e.publishConfig.module=="string"&&(this.publishConfig.module=zo(e.publishConfig.module)),e.publishConfig.browser!=null)if(typeof e.publishConfig.browser=="string")this.publishConfig.browser=zo(e.publishConfig.browser);else{this.publishConfig.browser=new Map;for(let[n,u]of Object.entries(e.publishConfig.browser))this.publishConfig.browser.set(zo(n),typeof u=="string"?zo(u):u)}if(typeof e.publishConfig.registry=="string"&&(this.publishConfig.registry=e.publishConfig.registry),typeof e.publishConfig.bin=="string")this.name!==null?this.publishConfig.bin=new Map([[this.name.name,zo(e.publishConfig.bin)]]):o.push(new Error("String bin field, but no attached package name"));else if(typeof e.publishConfig.bin=="object"&&e.publishConfig.bin!==null){this.publishConfig.bin=new Map;for(let[n,u]of Object.entries(e.publishConfig.bin)){if(typeof u!="string"){o.push(new Error(`Invalid bin definition for '${n}'`));continue}this.publishConfig.bin.set(n,zo(u))}}if(Array.isArray(e.publishConfig.executableFiles)){this.publishConfig.executableFiles=new Set;for(let n of e.publishConfig.executableFiles){if(typeof n!="string"){o.push(new Error("Invalid executable file definition"));continue}this.publishConfig.executableFiles.add(zo(n))}}}else this.publishConfig=null;if(typeof e.installConfig=="object"&&e.installConfig!==null){this.installConfig={};for(let n of Object.keys(e.installConfig))n==="hoistingLimits"?typeof e.installConfig.hoistingLimits=="string"?this.installConfig.hoistingLimits=e.installConfig.hoistingLimits:o.push(new Error("Invalid hoisting limits definition")):n=="selfReferences"?typeof e.installConfig.selfReferences=="boolean"?this.installConfig.selfReferences=e.installConfig.selfReferences:o.push(new Error("Invalid selfReferences definition, must be a boolean value")):o.push(new Error(`Unrecognized installConfig key: ${n}`))}else this.installConfig=null;if(typeof e.optionalDependencies=="object"&&e.optionalDependencies!==null)for(let[n,u]of Object.entries(e.optionalDependencies)){if(typeof u!="string"){o.push(new Error(`Invalid dependency range for '${n}'`));continue}let A;try{A=Ys(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=mn(A,u);this.dependencies.set(p.identHash,p);let h=mn(A,"unknown"),E=this.ensureDependencyMeta(h);Object.assign(E,{optional:!0})}typeof e.preferUnplugged=="boolean"?this.preferUnplugged=e.preferUnplugged:this.preferUnplugged=null,this.errors=o}getForScope(e){switch(e){case"dependencies":return this.dependencies;case"devDependencies":return this.devDependencies;case"peerDependencies":return this.peerDependencies;default:throw new Error(`Unsupported value ("${e}")`)}}hasConsumerDependency(e){return!!(this.dependencies.has(e.identHash)||this.peerDependencies.has(e.identHash))}hasHardDependency(e){return!!(this.dependencies.has(e.identHash)||this.devDependencies.has(e.identHash))}hasSoftDependency(e){return!!this.peerDependencies.has(e.identHash)}hasDependency(e){return!!(this.hasHardDependency(e)||this.hasSoftDependency(e))}getConditions(){let e=[];return this.os&&this.os.length>0&&e.push(gM("os",this.os)),this.cpu&&this.cpu.length>0&&e.push(gM("cpu",this.cpu)),this.libc&&this.libc.length>0&&e.push(gM("libc",this.libc)),e.length>0?e.join(" & "):null}ensureDependencyMeta(e){if(e.range!=="unknown"&&!Jse.default.valid(e.range))throw new Error(`Invalid meta field range for '${ba(e)}'`);let r=nn(e),o=e.range!=="unknown"?e.range:null,a=this.dependenciesMeta.get(r);a||this.dependenciesMeta.set(r,a=new Map);let n=a.get(o);return n||a.set(o,n={}),n}ensurePeerDependencyMeta(e){if(e.range!=="unknown")throw new Error(`Invalid meta field range for '${ba(e)}'`);let r=nn(e),o=this.peerDependenciesMeta.get(r);return o||this.peerDependenciesMeta.set(r,o={}),o}setRawField(e,r,{after:o=[]}={}){let a=new Set(o.filter(n=>Object.prototype.hasOwnProperty.call(this.raw,n)));if(a.size===0||Object.prototype.hasOwnProperty.call(this.raw,e))this.raw[e]=r;else{let n=this.raw,u=this.raw={},A=!1;for(let p of Object.keys(n))u[p]=n[p],A||(a.delete(p),a.size===0&&(u[e]=r,A=!0))}}exportTo(e,{compatibilityMode:r=!0}={}){if(Object.assign(e,this.raw),this.name!==null?e.name=nn(this.name):delete e.name,this.version!==null?e.version=this.version:delete e.version,this.os!==null?e.os=this.os:delete e.os,this.cpu!==null?e.cpu=this.cpu:delete e.cpu,this.type!==null?e.type=this.type:delete e.type,this.packageManager!==null?e.packageManager=this.packageManager:delete e.packageManager,this.private?e.private=!0:delete e.private,this.license!==null?e.license=this.license:delete e.license,this.languageName!==null?e.languageName=this.languageName:delete e.languageName,this.main!==null?e.main=this.main:delete e.main,this.module!==null?e.module=this.module:delete e.module,this.browser!==null){let n=this.browser;typeof n=="string"?e.browser=n:n instanceof Map&&(e.browser=Object.assign({},...Array.from(n.keys()).sort().map(u=>({[u]:n.get(u)}))))}else delete e.browser;this.bin.size===1&&this.name!==null&&this.bin.has(this.name.name)?e.bin=this.bin.get(this.name.name):this.bin.size>0?e.bin=Object.assign({},...Array.from(this.bin.keys()).sort().map(n=>({[n]:this.bin.get(n)}))):delete e.bin,this.workspaceDefinitions.length>0?this.raw.workspaces&&!Array.isArray(this.raw.workspaces)?e.workspaces={...this.raw.workspaces,packages:this.workspaceDefinitions.map(({pattern:n})=>n)}:e.workspaces=this.workspaceDefinitions.map(({pattern:n})=>n):this.raw.workspaces&&!Array.isArray(this.raw.workspaces)&&Object.keys(this.raw.workspaces).length>0?e.workspaces=this.raw.workspaces:delete e.workspaces;let o=[],a=[];for(let n of this.dependencies.values()){let u=this.dependenciesMeta.get(nn(n)),A=!1;if(r&&u){let p=u.get(null);p&&p.optional&&(A=!0)}A?a.push(n):o.push(n)}o.length>0?e.dependencies=Object.assign({},...lC(o).map(n=>({[nn(n)]:n.range}))):delete e.dependencies,a.length>0?e.optionalDependencies=Object.assign({},...lC(a).map(n=>({[nn(n)]:n.range}))):delete e.optionalDependencies,this.devDependencies.size>0?e.devDependencies=Object.assign({},...lC(this.devDependencies.values()).map(n=>({[nn(n)]:n.range}))):delete e.devDependencies,this.peerDependencies.size>0?e.peerDependencies=Object.assign({},...lC(this.peerDependencies.values()).map(n=>({[nn(n)]:n.range}))):delete e.peerDependencies,e.dependenciesMeta={};for(let[n,u]of Pa(this.dependenciesMeta.entries(),([A,p])=>A))for(let[A,p]of Pa(u.entries(),([h,E])=>h!==null?`0${h}`:"1")){let h=A!==null?ba(mn(Ys(n),A)):n,E={...p};r&&A===null&&delete E.optional,Object.keys(E).length!==0&&(e.dependenciesMeta[h]=E)}if(Object.keys(e.dependenciesMeta).length===0&&delete e.dependenciesMeta,this.peerDependenciesMeta.size>0?e.peerDependenciesMeta=Object.assign({},...Pa(this.peerDependenciesMeta.entries(),([n,u])=>n).map(([n,u])=>({[n]:u}))):delete e.peerDependenciesMeta,this.resolutions.length>0?e.resolutions=Object.assign({},...this.resolutions.map(({pattern:n,reference:u})=>({[bD(n)]:u}))):delete e.resolutions,this.files!==null?e.files=Array.from(this.files):delete e.files,this.preferUnplugged!==null?e.preferUnplugged=this.preferUnplugged:delete e.preferUnplugged,this.scripts!==null&&this.scripts.size>0){e.scripts??(e.scripts={});for(let n of Object.keys(e.scripts))this.scripts.has(n)||delete e.scripts[n];for(let[n,u]of this.scripts.entries())e.scripts[n]=u}else delete e.scripts;return e}},Nt=cC;Nt.fileName="package.json",Nt.allDependencies=["dependencies","devDependencies","peerDependencies"],Nt.hardDependencies=["dependencies","devDependencies"]});var Xse=U((kNt,zse)=>{var Btt=Wl(),vtt=function(){return Btt.Date.now()};zse.exports=vtt});var $se=U((FNt,Zse)=>{var Dtt=/\s/;function Stt(t){for(var e=t.length;e--&&Dtt.test(t.charAt(e)););return e}Zse.exports=Stt});var toe=U((RNt,eoe)=>{var Ptt=$se(),xtt=/^\s+/;function btt(t){return t&&t.slice(0,Ptt(t)+1).replace(xtt,"")}eoe.exports=btt});var AC=U((TNt,roe)=>{var Qtt=pd(),ktt=Xu(),Ftt="[object Symbol]";function Rtt(t){return typeof t=="symbol"||ktt(t)&&Qtt(t)==Ftt}roe.exports=Rtt});var ooe=U((NNt,soe)=>{var Ttt=toe(),noe=ol(),Ntt=AC(),ioe=0/0,Ltt=/^[-+]0x[0-9a-f]+$/i,Ott=/^0b[01]+$/i,Mtt=/^0o[0-7]+$/i,Utt=parseInt;function _tt(t){if(typeof t=="number")return t;if(Ntt(t))return ioe;if(noe(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=noe(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=Ttt(t);var r=Ott.test(t);return r||Mtt.test(t)?Utt(t.slice(2),r?2:8):Ltt.test(t)?ioe:+t}soe.exports=_tt});var coe=U((LNt,loe)=>{var Htt=ol(),dM=Xse(),aoe=ooe(),qtt="Expected a function",jtt=Math.max,Gtt=Math.min;function Wtt(t,e,r){var o,a,n,u,A,p,h=0,E=!1,w=!1,v=!0;if(typeof t!="function")throw new TypeError(qtt);e=aoe(e)||0,Htt(r)&&(E=!!r.leading,w="maxWait"in r,n=w?jtt(aoe(r.maxWait)||0,e):n,v="trailing"in r?!!r.trailing:v);function b(he){var ve=o,ge=a;return o=a=void 0,h=he,u=t.apply(ge,ve),u}function C(he){return h=he,A=setTimeout(_,e),E?b(he):u}function R(he){var ve=he-p,ge=he-h,le=e-ve;return w?Gtt(le,n-ge):le}function L(he){var ve=he-p,ge=he-h;return p===void 0||ve>=e||ve<0||w&&ge>=n}function _(){var he=dM();if(L(he))return V(he);A=setTimeout(_,R(he))}function V(he){return A=void 0,v&&o?b(he):(o=a=void 0,u)}function re(){A!==void 0&&clearTimeout(A),h=0,o=p=a=A=void 0}function oe(){return A===void 0?u:V(dM())}function pe(){var he=dM(),ve=L(he);if(o=arguments,a=this,p=he,ve){if(A===void 0)return C(p);if(w)return clearTimeout(A),A=setTimeout(_,e),b(p)}return A===void 0&&(A=setTimeout(_,e)),u}return pe.cancel=re,pe.flush=oe,pe}loe.exports=Wtt});var mM=U((ONt,uoe)=>{var Ytt=coe(),Ktt=ol(),Vtt="Expected a function";function Jtt(t,e,r){var o=!0,a=!0;if(typeof t!="function")throw new TypeError(Vtt);return Ktt(r)&&(o="leading"in r?!!r.leading:o,a="trailing"in r?!!r.trailing:a),Ytt(t,e,{leading:o,maxWait:e,trailing:a})}uoe.exports=Jtt});function Xtt(t){return typeof t.reportCode<"u"}var Aoe,foe,poe,ztt,Vt,Js,Xl=dt(()=>{Aoe=tt(mM()),foe=Ie("stream"),poe=Ie("string_decoder"),ztt=15,Vt=class extends Error{constructor(r,o,a){super(o);this.reportExtra=a;this.reportCode=r}};Js=class{constructor(){this.reportedInfos=new Set;this.reportedWarnings=new Set;this.reportedErrors=new Set}static progressViaCounter(e){let r=0,o,a=new Promise(p=>{o=p}),n=p=>{let h=o;a=new Promise(E=>{o=E}),r=p,h()},u=(p=0)=>{n(r+1)},A=async function*(){for(;r{r=u}),a=(0,Aoe.default)(u=>{let A=r;o=new Promise(p=>{r=p}),e=u,A()},1e3/ztt),n=async function*(){for(;;)await o,yield{title:e}}();return{[Symbol.asyncIterator](){return n},hasProgress:!1,hasTitle:!0,setTitle:a}}async startProgressPromise(e,r){let o=this.reportProgress(e);try{return await r(e)}finally{o.stop()}}startProgressSync(e,r){let o=this.reportProgress(e);try{return r(e)}finally{o.stop()}}reportInfoOnce(e,r,o){var n;let a=o&&o.key?o.key:r;this.reportedInfos.has(a)||(this.reportedInfos.add(a),this.reportInfo(e,r),(n=o==null?void 0:o.reportExtra)==null||n.call(o,this))}reportWarningOnce(e,r,o){var n;let a=o&&o.key?o.key:r;this.reportedWarnings.has(a)||(this.reportedWarnings.add(a),this.reportWarning(e,r),(n=o==null?void 0:o.reportExtra)==null||n.call(o,this))}reportErrorOnce(e,r,o){var n;let a=o&&o.key?o.key:r;this.reportedErrors.has(a)||(this.reportedErrors.add(a),this.reportError(e,r),(n=o==null?void 0:o.reportExtra)==null||n.call(o,this))}reportExceptionOnce(e){Xtt(e)?this.reportErrorOnce(e.reportCode,e.message,{key:e,reportExtra:e.reportExtra}):this.reportErrorOnce(1,e.stack||e.message,{key:e})}createStreamReporter(e=null){let r=new foe.PassThrough,o=new poe.StringDecoder,a="";return r.on("data",n=>{let u=o.write(n),A;do if(A=u.indexOf(` +`),A!==-1){let p=a+u.substring(0,A);u=u.substring(A+1),a="",e!==null?this.reportInfo(null,`${e} ${p}`):this.reportInfo(null,p)}while(A!==-1);a+=u}),r.on("end",()=>{let n=o.end();n!==""&&(e!==null?this.reportInfo(null,`${e} ${n}`):this.reportInfo(null,n))}),r}}});var fC,yM=dt(()=>{Xl();Ks();fC=class{constructor(e){this.fetchers=e}supports(e,r){return!!this.tryFetcher(e,r)}getLocalPath(e,r){return this.getFetcher(e,r).getLocalPath(e,r)}async fetch(e,r){return await this.getFetcher(e,r).fetch(e,r)}tryFetcher(e,r){let o=this.fetchers.find(a=>a.supports(e,r));return o||null}getFetcher(e,r){let o=this.fetchers.find(a=>a.supports(e,r));if(!o)throw new Vt(11,`${kr(r.project.configuration,e)} isn't supported by any available fetcher`);return o}}});var Pd,CM=dt(()=>{Ks();Pd=class{constructor(e){this.resolvers=e.filter(r=>r)}supportsDescriptor(e,r){return!!this.tryResolverByDescriptor(e,r)}supportsLocator(e,r){return!!this.tryResolverByLocator(e,r)}shouldPersistResolution(e,r){return this.getResolverByLocator(e,r).shouldPersistResolution(e,r)}bindDescriptor(e,r,o){return this.getResolverByDescriptor(e,o).bindDescriptor(e,r,o)}getResolutionDependencies(e,r){return this.getResolverByDescriptor(e,r).getResolutionDependencies(e,r)}async getCandidates(e,r,o){return await this.getResolverByDescriptor(e,o).getCandidates(e,r,o)}async getSatisfying(e,r,o,a){return this.getResolverByDescriptor(e,a).getSatisfying(e,r,o,a)}async resolve(e,r){return await this.getResolverByLocator(e,r).resolve(e,r)}tryResolverByDescriptor(e,r){let o=this.resolvers.find(a=>a.supportsDescriptor(e,r));return o||null}getResolverByDescriptor(e,r){let o=this.resolvers.find(a=>a.supportsDescriptor(e,r));if(!o)throw new Error(`${Ln(r.project.configuration,e)} isn't supported by any available resolver`);return o}tryResolverByLocator(e,r){let o=this.resolvers.find(a=>a.supportsLocator(e,r));return o||null}getResolverByLocator(e,r){let o=this.resolvers.find(a=>a.supportsLocator(e,r));if(!o)throw new Error(`${kr(r.project.configuration,e)} isn't supported by any available resolver`);return o}}});var pC,EM=dt(()=>{bt();Ks();pC=class{supports(e){return!!e.reference.startsWith("virtual:")}getLocalPath(e,r){let o=e.reference.indexOf("#");if(o===-1)throw new Error("Invalid virtual package reference");let a=e.reference.slice(o+1),n=us(e,a);return r.fetcher.getLocalPath(n,r)}async fetch(e,r){let o=e.reference.indexOf("#");if(o===-1)throw new Error("Invalid virtual package reference");let a=e.reference.slice(o+1),n=us(e,a),u=await r.fetcher.fetch(n,r);return await this.ensureVirtualLink(e,u,r)}getLocatorFilename(e){return aC(e)}async ensureVirtualLink(e,r,o){let a=r.packageFs.getRealPath(),n=o.project.configuration.get("virtualFolder"),u=this.getLocatorFilename(e),A=pi.makeVirtualPath(n,u,a),p=new ju(A,{baseFs:r.packageFs,pathUtils:z});return{...r,packageFs:p}}}});var hC,e1,hoe=dt(()=>{hC=class{static isVirtualDescriptor(e){return!!e.range.startsWith(hC.protocol)}static isVirtualLocator(e){return!!e.reference.startsWith(hC.protocol)}supportsDescriptor(e,r){return hC.isVirtualDescriptor(e)}supportsLocator(e,r){return hC.isVirtualLocator(e)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){throw new Error('Assertion failed: calling "bindDescriptor" on a virtual descriptor is unsupported')}getResolutionDependencies(e,r){throw new Error('Assertion failed: calling "getResolutionDependencies" on a virtual descriptor is unsupported')}async getCandidates(e,r,o){throw new Error('Assertion failed: calling "getCandidates" on a virtual descriptor is unsupported')}async getSatisfying(e,r,o,a){throw new Error('Assertion failed: calling "getSatisfying" on a virtual descriptor is unsupported')}async resolve(e,r){throw new Error('Assertion failed: calling "resolve" on a virtual locator is unsupported')}},e1=hC;e1.protocol="virtual:"});var gC,IM=dt(()=>{bt();Dd();gC=class{supports(e){return!!e.reference.startsWith(Gn.protocol)}getLocalPath(e,r){return this.getWorkspace(e,r).cwd}async fetch(e,r){let o=this.getWorkspace(e,r).cwd;return{packageFs:new An(o),prefixPath:wt.dot,localPath:o}}getWorkspace(e,r){return r.project.getWorkspaceByCwd(e.reference.slice(Gn.protocol.length))}}});function t1(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function goe(t){return typeof t>"u"?3:t1(t)?0:Array.isArray(t)?1:2}function vM(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function $tt(t){return t1(t)&&vM(t,"onConflict")&&typeof t.onConflict=="string"}function ert(t){if(typeof t>"u")return{onConflict:"default",value:t};if(!$tt(t))return{onConflict:"default",value:t};if(vM(t,"value"))return t;let{onConflict:e,...r}=t;return{onConflict:e,value:r}}function doe(t,e){let r=t1(t)&&vM(t,e)?t[e]:void 0;return ert(r)}function dC(t,e){return[t,e,moe]}function DM(t){return Array.isArray(t)?t[2]===moe:!1}function wM(t,e){if(t1(t)){let r={};for(let o of Object.keys(t))r[o]=wM(t[o],e);return dC(e,r)}return Array.isArray(t)?dC(e,t.map(r=>wM(r,e))):dC(e,t)}function BM(t,e,r,o,a){let n,u=[],A=a,p=0;for(let E=a-1;E>=o;--E){let[w,v]=t[E],{onConflict:b,value:C}=doe(v,r),R=goe(C);if(R!==3){if(n??(n=R),R!==n||b==="hardReset"){p=A;break}if(R===2)return dC(w,C);if(u.unshift([w,C]),b==="reset"){p=E;break}b==="extend"&&E===o&&(o=0),A=E}}if(typeof n>"u")return null;let h=u.map(([E])=>E).join(", ");switch(n){case 1:return dC(h,new Array().concat(...u.map(([E,w])=>w.map(v=>wM(v,E)))));case 0:{let E=Object.assign({},...u.map(([,R])=>R)),w=Object.keys(E),v={},b=t.map(([R,L])=>[R,doe(L,r).value]),C=Ztt(b,([R,L])=>{let _=goe(L);return _!==0&&_!==3});if(C!==-1){let R=b.slice(C+1);for(let L of w)v[L]=BM(R,e,L,0,R.length)}else for(let R of w)v[R]=BM(b,e,R,p,b.length);return dC(h,v)}default:throw new Error("Assertion failed: Non-extendable value type")}}function yoe(t){return BM(t.map(([e,r])=>[e,{["."]:r}]),[],".",0,t.length)}function r1(t){return DM(t)?t[1]:t}function MP(t){let e=DM(t)?t[1]:t;if(Array.isArray(e))return e.map(r=>MP(r));if(t1(e)){let r={};for(let[o,a]of Object.entries(e))r[o]=MP(a);return r}return e}function SM(t){return DM(t)?t[0]:null}var Ztt,moe,Coe=dt(()=>{Ztt=(t,e,r)=>{let o=[...t];return o.reverse(),o.findIndex(e,r)};moe=Symbol()});var UP={};Yt(UP,{getDefaultGlobalFolder:()=>xM,getHomeFolder:()=>mC,isFolderInside:()=>bM});function xM(){if(process.platform==="win32"){let t=ue.toPortablePath(process.env.LOCALAPPDATA||ue.join((0,PM.homedir)(),"AppData","Local"));return z.resolve(t,"Yarn/Berry")}if(process.env.XDG_DATA_HOME){let t=ue.toPortablePath(process.env.XDG_DATA_HOME);return z.resolve(t,"yarn/berry")}return z.resolve(mC(),".yarn/berry")}function mC(){return ue.toPortablePath((0,PM.homedir)()||"/usr/local/share")}function bM(t,e){let r=z.relative(e,t);return r&&!r.startsWith("..")&&!z.isAbsolute(r)}var PM,_P=dt(()=>{bt();PM=Ie("os")});var Boe=U(yC=>{"use strict";var zNt=Ie("net"),rrt=Ie("tls"),QM=Ie("http"),Eoe=Ie("https"),nrt=Ie("events"),XNt=Ie("assert"),irt=Ie("util");yC.httpOverHttp=srt;yC.httpsOverHttp=ort;yC.httpOverHttps=art;yC.httpsOverHttps=lrt;function srt(t){var e=new Ff(t);return e.request=QM.request,e}function ort(t){var e=new Ff(t);return e.request=QM.request,e.createSocket=Ioe,e.defaultPort=443,e}function art(t){var e=new Ff(t);return e.request=Eoe.request,e}function lrt(t){var e=new Ff(t);return e.request=Eoe.request,e.createSocket=Ioe,e.defaultPort=443,e}function Ff(t){var e=this;e.options=t||{},e.proxyOptions=e.options.proxy||{},e.maxSockets=e.options.maxSockets||QM.Agent.defaultMaxSockets,e.requests=[],e.sockets=[],e.on("free",function(o,a,n,u){for(var A=woe(a,n,u),p=0,h=e.requests.length;p=this.maxSockets){n.requests.push(u);return}n.createSocket(u,function(A){A.on("free",p),A.on("close",h),A.on("agentRemove",h),e.onSocket(A);function p(){n.emit("free",A,u)}function h(E){n.removeSocket(A),A.removeListener("free",p),A.removeListener("close",h),A.removeListener("agentRemove",h)}})};Ff.prototype.createSocket=function(e,r){var o=this,a={};o.sockets.push(a);var n=kM({},o.proxyOptions,{method:"CONNECT",path:e.host+":"+e.port,agent:!1,headers:{host:e.host+":"+e.port}});e.localAddress&&(n.localAddress=e.localAddress),n.proxyAuth&&(n.headers=n.headers||{},n.headers["Proxy-Authorization"]="Basic "+new Buffer(n.proxyAuth).toString("base64")),i0("making CONNECT request");var u=o.request(n);u.useChunkedEncodingByDefault=!1,u.once("response",A),u.once("upgrade",p),u.once("connect",h),u.once("error",E),u.end();function A(w){w.upgrade=!0}function p(w,v,b){process.nextTick(function(){h(w,v,b)})}function h(w,v,b){if(u.removeAllListeners(),v.removeAllListeners(),w.statusCode!==200){i0("tunneling socket could not be established, statusCode=%d",w.statusCode),v.destroy();var C=new Error("tunneling socket could not be established, statusCode="+w.statusCode);C.code="ECONNRESET",e.request.emit("error",C),o.removeSocket(a);return}if(b.length>0){i0("got illegal response body from proxy"),v.destroy();var C=new Error("got illegal response body from proxy");C.code="ECONNRESET",e.request.emit("error",C),o.removeSocket(a);return}return i0("tunneling connection has established"),o.sockets[o.sockets.indexOf(a)]=v,r(v)}function E(w){u.removeAllListeners(),i0(`tunneling socket could not be established, cause=%s +`,w.message,w.stack);var v=new Error("tunneling socket could not be established, cause="+w.message);v.code="ECONNRESET",e.request.emit("error",v),o.removeSocket(a)}};Ff.prototype.removeSocket=function(e){var r=this.sockets.indexOf(e);if(r!==-1){this.sockets.splice(r,1);var o=this.requests.shift();o&&this.createSocket(o,function(a){o.request.onSocket(a)})}};function Ioe(t,e){var r=this;Ff.prototype.createSocket.call(r,t,function(o){var a=t.request.getHeader("host"),n=kM({},r.options,{socket:o,servername:a?a.replace(/:.*$/,""):t.host}),u=rrt.connect(0,n);r.sockets[r.sockets.indexOf(o)]=u,e(u)})}function woe(t,e,r){return typeof t=="string"?{host:t,port:e,localAddress:r}:t}function kM(t){for(var e=1,r=arguments.length;e{voe.exports=Boe()});var Tf=U((Rf,HP)=>{"use strict";Object.defineProperty(Rf,"__esModule",{value:!0});var Soe=["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"];function crt(t){return Soe.includes(t)}var urt=["Function","Generator","AsyncGenerator","GeneratorFunction","AsyncGeneratorFunction","AsyncFunction","Observable","Array","Buffer","Object","RegExp","Date","Error","Map","Set","WeakMap","WeakSet","ArrayBuffer","SharedArrayBuffer","DataView","Promise","URL","FormData","URLSearchParams","HTMLElement",...Soe];function Art(t){return urt.includes(t)}var frt=["null","undefined","string","number","bigint","boolean","symbol"];function prt(t){return frt.includes(t)}function CC(t){return e=>typeof e===t}var{toString:Poe}=Object.prototype,n1=t=>{let e=Poe.call(t).slice(8,-1);if(/HTML\w+Element/.test(e)&&Fe.domElement(t))return"HTMLElement";if(Art(e))return e},Jn=t=>e=>n1(e)===t;function Fe(t){if(t===null)return"null";switch(typeof t){case"undefined":return"undefined";case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"function":return"Function";case"bigint":return"bigint";case"symbol":return"symbol";default:}if(Fe.observable(t))return"Observable";if(Fe.array(t))return"Array";if(Fe.buffer(t))return"Buffer";let e=n1(t);if(e)return e;if(t instanceof String||t instanceof Boolean||t instanceof Number)throw new TypeError("Please don't use object wrappers for primitive types");return"Object"}Fe.undefined=CC("undefined");Fe.string=CC("string");var hrt=CC("number");Fe.number=t=>hrt(t)&&!Fe.nan(t);Fe.bigint=CC("bigint");Fe.function_=CC("function");Fe.null_=t=>t===null;Fe.class_=t=>Fe.function_(t)&&t.toString().startsWith("class ");Fe.boolean=t=>t===!0||t===!1;Fe.symbol=CC("symbol");Fe.numericString=t=>Fe.string(t)&&!Fe.emptyStringOrWhitespace(t)&&!Number.isNaN(Number(t));Fe.array=(t,e)=>Array.isArray(t)?Fe.function_(e)?t.every(e):!0:!1;Fe.buffer=t=>{var e,r,o,a;return(a=(o=(r=(e=t)===null||e===void 0?void 0:e.constructor)===null||r===void 0?void 0:r.isBuffer)===null||o===void 0?void 0:o.call(r,t))!==null&&a!==void 0?a:!1};Fe.nullOrUndefined=t=>Fe.null_(t)||Fe.undefined(t);Fe.object=t=>!Fe.null_(t)&&(typeof t=="object"||Fe.function_(t));Fe.iterable=t=>{var e;return Fe.function_((e=t)===null||e===void 0?void 0:e[Symbol.iterator])};Fe.asyncIterable=t=>{var e;return Fe.function_((e=t)===null||e===void 0?void 0:e[Symbol.asyncIterator])};Fe.generator=t=>Fe.iterable(t)&&Fe.function_(t.next)&&Fe.function_(t.throw);Fe.asyncGenerator=t=>Fe.asyncIterable(t)&&Fe.function_(t.next)&&Fe.function_(t.throw);Fe.nativePromise=t=>Jn("Promise")(t);var grt=t=>{var e,r;return Fe.function_((e=t)===null||e===void 0?void 0:e.then)&&Fe.function_((r=t)===null||r===void 0?void 0:r.catch)};Fe.promise=t=>Fe.nativePromise(t)||grt(t);Fe.generatorFunction=Jn("GeneratorFunction");Fe.asyncGeneratorFunction=t=>n1(t)==="AsyncGeneratorFunction";Fe.asyncFunction=t=>n1(t)==="AsyncFunction";Fe.boundFunction=t=>Fe.function_(t)&&!t.hasOwnProperty("prototype");Fe.regExp=Jn("RegExp");Fe.date=Jn("Date");Fe.error=Jn("Error");Fe.map=t=>Jn("Map")(t);Fe.set=t=>Jn("Set")(t);Fe.weakMap=t=>Jn("WeakMap")(t);Fe.weakSet=t=>Jn("WeakSet")(t);Fe.int8Array=Jn("Int8Array");Fe.uint8Array=Jn("Uint8Array");Fe.uint8ClampedArray=Jn("Uint8ClampedArray");Fe.int16Array=Jn("Int16Array");Fe.uint16Array=Jn("Uint16Array");Fe.int32Array=Jn("Int32Array");Fe.uint32Array=Jn("Uint32Array");Fe.float32Array=Jn("Float32Array");Fe.float64Array=Jn("Float64Array");Fe.bigInt64Array=Jn("BigInt64Array");Fe.bigUint64Array=Jn("BigUint64Array");Fe.arrayBuffer=Jn("ArrayBuffer");Fe.sharedArrayBuffer=Jn("SharedArrayBuffer");Fe.dataView=Jn("DataView");Fe.directInstanceOf=(t,e)=>Object.getPrototypeOf(t)===e.prototype;Fe.urlInstance=t=>Jn("URL")(t);Fe.urlString=t=>{if(!Fe.string(t))return!1;try{return new URL(t),!0}catch{return!1}};Fe.truthy=t=>Boolean(t);Fe.falsy=t=>!t;Fe.nan=t=>Number.isNaN(t);Fe.primitive=t=>Fe.null_(t)||prt(typeof t);Fe.integer=t=>Number.isInteger(t);Fe.safeInteger=t=>Number.isSafeInteger(t);Fe.plainObject=t=>{if(Poe.call(t)!=="[object Object]")return!1;let e=Object.getPrototypeOf(t);return e===null||e===Object.getPrototypeOf({})};Fe.typedArray=t=>crt(n1(t));var drt=t=>Fe.safeInteger(t)&&t>=0;Fe.arrayLike=t=>!Fe.nullOrUndefined(t)&&!Fe.function_(t)&&drt(t.length);Fe.inRange=(t,e)=>{if(Fe.number(e))return t>=Math.min(0,e)&&t<=Math.max(e,0);if(Fe.array(e)&&e.length===2)return t>=Math.min(...e)&&t<=Math.max(...e);throw new TypeError(`Invalid range: ${JSON.stringify(e)}`)};var mrt=1,yrt=["innerHTML","ownerDocument","style","attributes","nodeValue"];Fe.domElement=t=>Fe.object(t)&&t.nodeType===mrt&&Fe.string(t.nodeName)&&!Fe.plainObject(t)&&yrt.every(e=>e in t);Fe.observable=t=>{var e,r,o,a;return t?t===((r=(e=t)[Symbol.observable])===null||r===void 0?void 0:r.call(e))||t===((a=(o=t)["@@observable"])===null||a===void 0?void 0:a.call(o)):!1};Fe.nodeStream=t=>Fe.object(t)&&Fe.function_(t.pipe)&&!Fe.observable(t);Fe.infinite=t=>t===1/0||t===-1/0;var xoe=t=>e=>Fe.integer(e)&&Math.abs(e%2)===t;Fe.evenInteger=xoe(0);Fe.oddInteger=xoe(1);Fe.emptyArray=t=>Fe.array(t)&&t.length===0;Fe.nonEmptyArray=t=>Fe.array(t)&&t.length>0;Fe.emptyString=t=>Fe.string(t)&&t.length===0;Fe.nonEmptyString=t=>Fe.string(t)&&t.length>0;var Crt=t=>Fe.string(t)&&!/\S/.test(t);Fe.emptyStringOrWhitespace=t=>Fe.emptyString(t)||Crt(t);Fe.emptyObject=t=>Fe.object(t)&&!Fe.map(t)&&!Fe.set(t)&&Object.keys(t).length===0;Fe.nonEmptyObject=t=>Fe.object(t)&&!Fe.map(t)&&!Fe.set(t)&&Object.keys(t).length>0;Fe.emptySet=t=>Fe.set(t)&&t.size===0;Fe.nonEmptySet=t=>Fe.set(t)&&t.size>0;Fe.emptyMap=t=>Fe.map(t)&&t.size===0;Fe.nonEmptyMap=t=>Fe.map(t)&&t.size>0;Fe.propertyKey=t=>Fe.any([Fe.string,Fe.number,Fe.symbol],t);Fe.formData=t=>Jn("FormData")(t);Fe.urlSearchParams=t=>Jn("URLSearchParams")(t);var boe=(t,e,r)=>{if(!Fe.function_(e))throw new TypeError(`Invalid predicate: ${JSON.stringify(e)}`);if(r.length===0)throw new TypeError("Invalid number of values");return t.call(r,e)};Fe.any=(t,...e)=>(Fe.array(t)?t:[t]).some(o=>boe(Array.prototype.some,o,e));Fe.all=(t,...e)=>boe(Array.prototype.every,t,e);var Mt=(t,e,r,o={})=>{if(!t){let{multipleValues:a}=o,n=a?`received values of types ${[...new Set(r.map(u=>`\`${Fe(u)}\``))].join(", ")}`:`received value of type \`${Fe(r)}\``;throw new TypeError(`Expected value which is \`${e}\`, ${n}.`)}};Rf.assert={undefined:t=>Mt(Fe.undefined(t),"undefined",t),string:t=>Mt(Fe.string(t),"string",t),number:t=>Mt(Fe.number(t),"number",t),bigint:t=>Mt(Fe.bigint(t),"bigint",t),function_:t=>Mt(Fe.function_(t),"Function",t),null_:t=>Mt(Fe.null_(t),"null",t),class_:t=>Mt(Fe.class_(t),"Class",t),boolean:t=>Mt(Fe.boolean(t),"boolean",t),symbol:t=>Mt(Fe.symbol(t),"symbol",t),numericString:t=>Mt(Fe.numericString(t),"string with a number",t),array:(t,e)=>{Mt(Fe.array(t),"Array",t),e&&t.forEach(e)},buffer:t=>Mt(Fe.buffer(t),"Buffer",t),nullOrUndefined:t=>Mt(Fe.nullOrUndefined(t),"null or undefined",t),object:t=>Mt(Fe.object(t),"Object",t),iterable:t=>Mt(Fe.iterable(t),"Iterable",t),asyncIterable:t=>Mt(Fe.asyncIterable(t),"AsyncIterable",t),generator:t=>Mt(Fe.generator(t),"Generator",t),asyncGenerator:t=>Mt(Fe.asyncGenerator(t),"AsyncGenerator",t),nativePromise:t=>Mt(Fe.nativePromise(t),"native Promise",t),promise:t=>Mt(Fe.promise(t),"Promise",t),generatorFunction:t=>Mt(Fe.generatorFunction(t),"GeneratorFunction",t),asyncGeneratorFunction:t=>Mt(Fe.asyncGeneratorFunction(t),"AsyncGeneratorFunction",t),asyncFunction:t=>Mt(Fe.asyncFunction(t),"AsyncFunction",t),boundFunction:t=>Mt(Fe.boundFunction(t),"Function",t),regExp:t=>Mt(Fe.regExp(t),"RegExp",t),date:t=>Mt(Fe.date(t),"Date",t),error:t=>Mt(Fe.error(t),"Error",t),map:t=>Mt(Fe.map(t),"Map",t),set:t=>Mt(Fe.set(t),"Set",t),weakMap:t=>Mt(Fe.weakMap(t),"WeakMap",t),weakSet:t=>Mt(Fe.weakSet(t),"WeakSet",t),int8Array:t=>Mt(Fe.int8Array(t),"Int8Array",t),uint8Array:t=>Mt(Fe.uint8Array(t),"Uint8Array",t),uint8ClampedArray:t=>Mt(Fe.uint8ClampedArray(t),"Uint8ClampedArray",t),int16Array:t=>Mt(Fe.int16Array(t),"Int16Array",t),uint16Array:t=>Mt(Fe.uint16Array(t),"Uint16Array",t),int32Array:t=>Mt(Fe.int32Array(t),"Int32Array",t),uint32Array:t=>Mt(Fe.uint32Array(t),"Uint32Array",t),float32Array:t=>Mt(Fe.float32Array(t),"Float32Array",t),float64Array:t=>Mt(Fe.float64Array(t),"Float64Array",t),bigInt64Array:t=>Mt(Fe.bigInt64Array(t),"BigInt64Array",t),bigUint64Array:t=>Mt(Fe.bigUint64Array(t),"BigUint64Array",t),arrayBuffer:t=>Mt(Fe.arrayBuffer(t),"ArrayBuffer",t),sharedArrayBuffer:t=>Mt(Fe.sharedArrayBuffer(t),"SharedArrayBuffer",t),dataView:t=>Mt(Fe.dataView(t),"DataView",t),urlInstance:t=>Mt(Fe.urlInstance(t),"URL",t),urlString:t=>Mt(Fe.urlString(t),"string with a URL",t),truthy:t=>Mt(Fe.truthy(t),"truthy",t),falsy:t=>Mt(Fe.falsy(t),"falsy",t),nan:t=>Mt(Fe.nan(t),"NaN",t),primitive:t=>Mt(Fe.primitive(t),"primitive",t),integer:t=>Mt(Fe.integer(t),"integer",t),safeInteger:t=>Mt(Fe.safeInteger(t),"integer",t),plainObject:t=>Mt(Fe.plainObject(t),"plain object",t),typedArray:t=>Mt(Fe.typedArray(t),"TypedArray",t),arrayLike:t=>Mt(Fe.arrayLike(t),"array-like",t),domElement:t=>Mt(Fe.domElement(t),"HTMLElement",t),observable:t=>Mt(Fe.observable(t),"Observable",t),nodeStream:t=>Mt(Fe.nodeStream(t),"Node.js Stream",t),infinite:t=>Mt(Fe.infinite(t),"infinite number",t),emptyArray:t=>Mt(Fe.emptyArray(t),"empty array",t),nonEmptyArray:t=>Mt(Fe.nonEmptyArray(t),"non-empty array",t),emptyString:t=>Mt(Fe.emptyString(t),"empty string",t),nonEmptyString:t=>Mt(Fe.nonEmptyString(t),"non-empty string",t),emptyStringOrWhitespace:t=>Mt(Fe.emptyStringOrWhitespace(t),"empty string or whitespace",t),emptyObject:t=>Mt(Fe.emptyObject(t),"empty object",t),nonEmptyObject:t=>Mt(Fe.nonEmptyObject(t),"non-empty object",t),emptySet:t=>Mt(Fe.emptySet(t),"empty set",t),nonEmptySet:t=>Mt(Fe.nonEmptySet(t),"non-empty set",t),emptyMap:t=>Mt(Fe.emptyMap(t),"empty map",t),nonEmptyMap:t=>Mt(Fe.nonEmptyMap(t),"non-empty map",t),propertyKey:t=>Mt(Fe.propertyKey(t),"PropertyKey",t),formData:t=>Mt(Fe.formData(t),"FormData",t),urlSearchParams:t=>Mt(Fe.urlSearchParams(t),"URLSearchParams",t),evenInteger:t=>Mt(Fe.evenInteger(t),"even integer",t),oddInteger:t=>Mt(Fe.oddInteger(t),"odd integer",t),directInstanceOf:(t,e)=>Mt(Fe.directInstanceOf(t,e),"T",t),inRange:(t,e)=>Mt(Fe.inRange(t,e),"in range",t),any:(t,...e)=>Mt(Fe.any(t,...e),"predicate returns truthy for any value",e,{multipleValues:!0}),all:(t,...e)=>Mt(Fe.all(t,...e),"predicate returns truthy for all values",e,{multipleValues:!0})};Object.defineProperties(Fe,{class:{value:Fe.class_},function:{value:Fe.function_},null:{value:Fe.null_}});Object.defineProperties(Rf.assert,{class:{value:Rf.assert.class_},function:{value:Rf.assert.function_},null:{value:Rf.assert.null_}});Rf.default=Fe;HP.exports=Fe;HP.exports.default=Fe;HP.exports.assert=Rf.assert});var Qoe=U((eLt,FM)=>{"use strict";var qP=class extends Error{constructor(e){super(e||"Promise was canceled"),this.name="CancelError"}get isCanceled(){return!0}},EC=class{static fn(e){return(...r)=>new EC((o,a,n)=>{r.push(n),e(...r).then(o,a)})}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((r,o)=>{this._reject=o;let a=A=>{this._isPending=!1,r(A)},n=A=>{this._isPending=!1,o(A)},u=A=>{if(!this._isPending)throw new Error("The `onCancel` handler was attached after the promise settled.");this._cancelHandlers.push(A)};return Object.defineProperties(u,{shouldReject:{get:()=>this._rejectOnCancel,set:A=>{this._rejectOnCancel=A}}}),e(a,n,u)})}then(e,r){return this._promise.then(e,r)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}cancel(e){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandlers.length>0)try{for(let r of this._cancelHandlers)r()}catch(r){this._reject(r)}this._isCanceled=!0,this._rejectOnCancel&&this._reject(new qP(e))}}get isCanceled(){return this._isCanceled}};Object.setPrototypeOf(EC.prototype,Promise.prototype);FM.exports=EC;FM.exports.CancelError=qP});var koe=U((TM,NM)=>{"use strict";Object.defineProperty(TM,"__esModule",{value:!0});var Ert=Ie("tls"),RM=(t,e)=>{let r;typeof e=="function"?r={connect:e}:r=e;let o=typeof r.connect=="function",a=typeof r.secureConnect=="function",n=typeof r.close=="function",u=()=>{o&&r.connect(),t instanceof Ert.TLSSocket&&a&&(t.authorized?r.secureConnect():t.authorizationError||t.once("secureConnect",r.secureConnect)),n&&t.once("close",r.close)};t.writable&&!t.connecting?u():t.connecting?t.once("connect",u):t.destroyed&&n&&r.close(t._hadError)};TM.default=RM;NM.exports=RM;NM.exports.default=RM});var Foe=U((OM,MM)=>{"use strict";Object.defineProperty(OM,"__esModule",{value:!0});var Irt=koe(),wrt=Number(process.versions.node.split(".")[0]),LM=t=>{let e={start:Date.now(),socket:void 0,lookup:void 0,connect:void 0,secureConnect:void 0,upload:void 0,response:void 0,end:void 0,error:void 0,abort:void 0,phases:{wait:void 0,dns:void 0,tcp:void 0,tls:void 0,request:void 0,firstByte:void 0,download:void 0,total:void 0}};t.timings=e;let r=u=>{let A=u.emit.bind(u);u.emit=(p,...h)=>(p==="error"&&(e.error=Date.now(),e.phases.total=e.error-e.start,u.emit=A),A(p,...h))};r(t),t.prependOnceListener("abort",()=>{e.abort=Date.now(),(!e.response||wrt>=13)&&(e.phases.total=Date.now()-e.start)});let o=u=>{e.socket=Date.now(),e.phases.wait=e.socket-e.start;let A=()=>{e.lookup=Date.now(),e.phases.dns=e.lookup-e.socket};u.prependOnceListener("lookup",A),Irt.default(u,{connect:()=>{e.connect=Date.now(),e.lookup===void 0&&(u.removeListener("lookup",A),e.lookup=e.connect,e.phases.dns=e.lookup-e.socket),e.phases.tcp=e.connect-e.lookup},secureConnect:()=>{e.secureConnect=Date.now(),e.phases.tls=e.secureConnect-e.connect}})};t.socket?o(t.socket):t.prependOnceListener("socket",o);let a=()=>{var u;e.upload=Date.now(),e.phases.request=e.upload-(u=e.secureConnect,u??e.connect)};return(()=>typeof t.writableFinished=="boolean"?t.writableFinished:t.finished&&t.outputSize===0&&(!t.socket||t.socket.writableLength===0))()?a():t.prependOnceListener("finish",a),t.prependOnceListener("response",u=>{e.response=Date.now(),e.phases.firstByte=e.response-e.upload,u.timings=e,r(u),u.prependOnceListener("end",()=>{e.end=Date.now(),e.phases.download=e.end-e.response,e.phases.total=e.end-e.start})}),e};OM.default=LM;MM.exports=LM;MM.exports.default=LM});var Uoe=U((tLt,HM)=>{"use strict";var{V4MAPPED:Brt,ADDRCONFIG:vrt,ALL:Moe,promises:{Resolver:Roe},lookup:Drt}=Ie("dns"),{promisify:UM}=Ie("util"),Srt=Ie("os"),IC=Symbol("cacheableLookupCreateConnection"),_M=Symbol("cacheableLookupInstance"),Toe=Symbol("expires"),Prt=typeof Moe=="number",Noe=t=>{if(!(t&&typeof t.createConnection=="function"))throw new Error("Expected an Agent instance as the first argument")},xrt=t=>{for(let e of t)e.family!==6&&(e.address=`::ffff:${e.address}`,e.family=6)},Loe=()=>{let t=!1,e=!1;for(let r of Object.values(Srt.networkInterfaces()))for(let o of r)if(!o.internal&&(o.family==="IPv6"?e=!0:t=!0,t&&e))return{has4:t,has6:e};return{has4:t,has6:e}},brt=t=>Symbol.iterator in t,Ooe={ttl:!0},Qrt={all:!0},jP=class{constructor({cache:e=new Map,maxTtl:r=1/0,fallbackDuration:o=3600,errorTtl:a=.15,resolver:n=new Roe,lookup:u=Drt}={}){if(this.maxTtl=r,this.errorTtl=a,this._cache=e,this._resolver=n,this._dnsLookup=UM(u),this._resolver instanceof Roe?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=UM(this._resolver.resolve4.bind(this._resolver)),this._resolve6=UM(this._resolver.resolve6.bind(this._resolver))),this._iface=Loe(),this._pending={},this._nextRemovalTime=!1,this._hostnamesToFallback=new Set,o<1)this._fallback=!1;else{this._fallback=!0;let A=setInterval(()=>{this._hostnamesToFallback.clear()},o*1e3);A.unref&&A.unref()}this.lookup=this.lookup.bind(this),this.lookupAsync=this.lookupAsync.bind(this)}set servers(e){this.clear(),this._resolver.setServers(e)}get servers(){return this._resolver.getServers()}lookup(e,r,o){if(typeof r=="function"?(o=r,r={}):typeof r=="number"&&(r={family:r}),!o)throw new Error("Callback must be a function.");this.lookupAsync(e,r).then(a=>{r.all?o(null,a):o(null,a.address,a.family,a.expires,a.ttl)},o)}async lookupAsync(e,r={}){typeof r=="number"&&(r={family:r});let o=await this.query(e);if(r.family===6){let a=o.filter(n=>n.family===6);r.hints&Brt&&(Prt&&r.hints&Moe||a.length===0)?xrt(o):o=a}else r.family===4&&(o=o.filter(a=>a.family===4));if(r.hints&vrt){let{_iface:a}=this;o=o.filter(n=>n.family===6?a.has6:a.has4)}if(o.length===0){let a=new Error(`cacheableLookup ENOTFOUND ${e}`);throw a.code="ENOTFOUND",a.hostname=e,a}return r.all?o:o[0]}async query(e){let r=await this._cache.get(e);if(!r){let o=this._pending[e];if(o)r=await o;else{let a=this.queryAndCache(e);this._pending[e]=a,r=await a}}return r=r.map(o=>({...o})),r}async _resolve(e){let r=async h=>{try{return await h}catch(E){if(E.code==="ENODATA"||E.code==="ENOTFOUND")return[];throw E}},[o,a]=await Promise.all([this._resolve4(e,Ooe),this._resolve6(e,Ooe)].map(h=>r(h))),n=0,u=0,A=0,p=Date.now();for(let h of o)h.family=4,h.expires=p+h.ttl*1e3,n=Math.max(n,h.ttl);for(let h of a)h.family=6,h.expires=p+h.ttl*1e3,u=Math.max(u,h.ttl);return o.length>0?a.length>0?A=Math.min(n,u):A=n:A=u,{entries:[...o,...a],cacheTtl:A}}async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),cacheTtl:0}}catch{return{entries:[],cacheTtl:0}}}async _set(e,r,o){if(this.maxTtl>0&&o>0){o=Math.min(o,this.maxTtl)*1e3,r[Toe]=Date.now()+o;try{await this._cache.set(e,r,o)}catch(a){this.lookupAsync=async()=>{let n=new Error("Cache Error. Please recreate the CacheableLookup instance.");throw n.cause=a,n}}brt(this._cache)&&this._tick(o)}}async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._dnsLookup(e,Qrt);try{let r=await this._resolve(e);r.entries.length===0&&this._fallback&&(r=await this._lookup(e),r.entries.length!==0&&this._hostnamesToFallback.add(e));let o=r.entries.length===0?this.errorTtl:r.cacheTtl;return await this._set(e,r.entries,o),delete this._pending[e],r.entries}catch(r){throw delete this._pending[e],r}}_tick(e){let r=this._nextRemovalTime;(!r||e{this._nextRemovalTime=!1;let o=1/0,a=Date.now();for(let[n,u]of this._cache){let A=u[Toe];a>=A?this._cache.delete(n):A("lookup"in r||(r.lookup=this.lookup),e[IC](r,o))}uninstall(e){if(Noe(e),e[IC]){if(e[_M]!==this)throw new Error("The agent is not owned by this CacheableLookup instance");e.createConnection=e[IC],delete e[IC],delete e[_M]}}updateInterfaceInfo(){let{_iface:e}=this;this._iface=Loe(),(e.has4&&!this._iface.has4||e.has6&&!this._iface.has6)&&this._cache.clear()}clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}};HM.exports=jP;HM.exports.default=jP});var qoe=U((rLt,qM)=>{"use strict";var krt=typeof URL>"u"?Ie("url").URL:URL,Frt="text/plain",Rrt="us-ascii",_oe=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),Trt=(t,{stripHash:e})=>{let r=t.match(/^data:([^,]*?),([^#]*?)(?:#(.*))?$/);if(!r)throw new Error(`Invalid URL: ${t}`);let o=r[1].split(";"),a=r[2],n=e?"":r[3],u=!1;o[o.length-1]==="base64"&&(o.pop(),u=!0);let A=(o.shift()||"").toLowerCase(),h=[...o.map(E=>{let[w,v=""]=E.split("=").map(b=>b.trim());return w==="charset"&&(v=v.toLowerCase(),v===Rrt)?"":`${w}${v?`=${v}`:""}`}).filter(Boolean)];return u&&h.push("base64"),(h.length!==0||A&&A!==Frt)&&h.unshift(A),`data:${h.join(";")},${u?a.trim():a}${n?`#${n}`:""}`},Hoe=(t,e)=>{if(e={defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},Reflect.has(e,"normalizeHttps"))throw new Error("options.normalizeHttps is renamed to options.forceHttp");if(Reflect.has(e,"normalizeHttp"))throw new Error("options.normalizeHttp is renamed to options.forceHttps");if(Reflect.has(e,"stripFragment"))throw new Error("options.stripFragment is renamed to options.stripHash");if(t=t.trim(),/^data:/i.test(t))return Trt(t,e);let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let a=new krt(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&a.protocol==="https:"&&(a.protocol="http:"),e.forceHttps&&a.protocol==="http:"&&(a.protocol="https:"),e.stripAuthentication&&(a.username="",a.password=""),e.stripHash&&(a.hash=""),a.pathname&&(a.pathname=a.pathname.replace(/((?!:).|^)\/{2,}/g,(n,u)=>/^(?!\/)/g.test(u)?`${u}/`:"/")),a.pathname&&(a.pathname=decodeURI(a.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let n=a.pathname.split("/"),u=n[n.length-1];_oe(u,e.removeDirectoryIndex)&&(n=n.slice(0,n.length-1),a.pathname=n.slice(1).join("/")+"/")}if(a.hostname&&(a.hostname=a.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(a.hostname)&&(a.hostname=a.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let n of[...a.searchParams.keys()])_oe(n,e.removeQueryParameters)&&a.searchParams.delete(n);return e.sortQueryParameters&&a.searchParams.sort(),e.removeTrailingSlash&&(a.pathname=a.pathname.replace(/\/$/,"")),t=a.toString(),(e.removeTrailingSlash||a.pathname==="/")&&a.hash===""&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\/\//,"")),t};qM.exports=Hoe;qM.exports.default=Hoe});var Woe=U((nLt,Goe)=>{Goe.exports=joe;function joe(t,e){if(t&&e)return joe(t)(e);if(typeof t!="function")throw new TypeError("need wrapper function");return Object.keys(t).forEach(function(o){r[o]=t[o]}),r;function r(){for(var o=new Array(arguments.length),a=0;a{var Yoe=Woe();jM.exports=Yoe(GP);jM.exports.strict=Yoe(Koe);GP.proto=GP(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return GP(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return Koe(this)},configurable:!0})});function GP(t){var e=function(){return e.called?e.value:(e.called=!0,e.value=t.apply(this,arguments))};return e.called=!1,e}function Koe(t){var e=function(){if(e.called)throw new Error(e.onceError);return e.called=!0,e.value=t.apply(this,arguments)},r=t.name||"Function wrapped with `once`";return e.onceError=r+" shouldn't be called more than once",e.called=!1,e}});var WM=U((sLt,Joe)=>{var Nrt=GM(),Lrt=function(){},Ort=function(t){return t.setHeader&&typeof t.abort=="function"},Mrt=function(t){return t.stdio&&Array.isArray(t.stdio)&&t.stdio.length===3},Voe=function(t,e,r){if(typeof e=="function")return Voe(t,null,e);e||(e={}),r=Nrt(r||Lrt);var o=t._writableState,a=t._readableState,n=e.readable||e.readable!==!1&&t.readable,u=e.writable||e.writable!==!1&&t.writable,A=function(){t.writable||p()},p=function(){u=!1,n||r.call(t)},h=function(){n=!1,u||r.call(t)},E=function(C){r.call(t,C?new Error("exited with error code: "+C):null)},w=function(C){r.call(t,C)},v=function(){if(n&&!(a&&a.ended))return r.call(t,new Error("premature close"));if(u&&!(o&&o.ended))return r.call(t,new Error("premature close"))},b=function(){t.req.on("finish",p)};return Ort(t)?(t.on("complete",p),t.on("abort",v),t.req?b():t.on("request",b)):u&&!o&&(t.on("end",A),t.on("close",A)),Mrt(t)&&t.on("exit",E),t.on("end",h),t.on("finish",p),e.error!==!1&&t.on("error",w),t.on("close",v),function(){t.removeListener("complete",p),t.removeListener("abort",v),t.removeListener("request",b),t.req&&t.req.removeListener("finish",p),t.removeListener("end",A),t.removeListener("close",A),t.removeListener("finish",p),t.removeListener("exit",E),t.removeListener("end",h),t.removeListener("error",w),t.removeListener("close",v)}};Joe.exports=Voe});var Zoe=U((oLt,Xoe)=>{var Urt=GM(),_rt=WM(),YM=Ie("fs"),i1=function(){},Hrt=/^v?\.0/.test(process.version),WP=function(t){return typeof t=="function"},qrt=function(t){return!Hrt||!YM?!1:(t instanceof(YM.ReadStream||i1)||t instanceof(YM.WriteStream||i1))&&WP(t.close)},jrt=function(t){return t.setHeader&&WP(t.abort)},Grt=function(t,e,r,o){o=Urt(o);var a=!1;t.on("close",function(){a=!0}),_rt(t,{readable:e,writable:r},function(u){if(u)return o(u);a=!0,o()});var n=!1;return function(u){if(!a&&!n){if(n=!0,qrt(t))return t.close(i1);if(jrt(t))return t.abort();if(WP(t.destroy))return t.destroy();o(u||new Error("stream was destroyed"))}}},zoe=function(t){t()},Wrt=function(t,e){return t.pipe(e)},Yrt=function(){var t=Array.prototype.slice.call(arguments),e=WP(t[t.length-1]||i1)&&t.pop()||i1;if(Array.isArray(t[0])&&(t=t[0]),t.length<2)throw new Error("pump requires two streams per minimum");var r,o=t.map(function(a,n){var u=n0;return Grt(a,u,A,function(p){r||(r=p),p&&o.forEach(zoe),!u&&(o.forEach(zoe),e(r))})});return t.reduce(Wrt)};Xoe.exports=Yrt});var eae=U((aLt,$oe)=>{"use strict";var{PassThrough:Krt}=Ie("stream");$oe.exports=t=>{t={...t};let{array:e}=t,{encoding:r}=t,o=r==="buffer",a=!1;e?a=!(r||o):r=r||"utf8",o&&(r=null);let n=new Krt({objectMode:a});r&&n.setEncoding(r);let u=0,A=[];return n.on("data",p=>{A.push(p),a?u=A.length:u+=p.length}),n.getBufferedValue=()=>e?A:o?Buffer.concat(A,u):A.join(""),n.getBufferedLength=()=>u,n}});var tae=U((lLt,wC)=>{"use strict";var Vrt=Zoe(),Jrt=eae(),YP=class extends Error{constructor(){super("maxBuffer exceeded"),this.name="MaxBufferError"}};async function KP(t,e){if(!t)return Promise.reject(new Error("Expected a stream"));e={maxBuffer:1/0,...e};let{maxBuffer:r}=e,o;return await new Promise((a,n)=>{let u=A=>{A&&(A.bufferedData=o.getBufferedValue()),n(A)};o=Vrt(t,Jrt(e),A=>{if(A){u(A);return}a()}),o.on("data",()=>{o.getBufferedLength()>r&&u(new YP)})}),o.getBufferedValue()}wC.exports=KP;wC.exports.default=KP;wC.exports.buffer=(t,e)=>KP(t,{...e,encoding:"buffer"});wC.exports.array=(t,e)=>KP(t,{...e,array:!0});wC.exports.MaxBufferError=YP});var nae=U((uLt,rae)=>{"use strict";var zrt=new Set([200,203,204,206,300,301,404,405,410,414,501]),Xrt=new Set([200,203,204,300,301,302,303,307,308,404,405,410,414,501]),Zrt=new Set([500,502,503,504]),$rt={date:!0,connection:!0,"keep-alive":!0,"proxy-authenticate":!0,"proxy-authorization":!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0},ent={"content-length":!0,"content-encoding":!0,"transfer-encoding":!0,"content-range":!0};function xd(t){let e=parseInt(t,10);return isFinite(e)?e:0}function tnt(t){return t?Zrt.has(t.status):!0}function KM(t){let e={};if(!t)return e;let r=t.trim().split(/\s*,\s*/);for(let o of r){let[a,n]=o.split(/\s*=\s*/,2);e[a]=n===void 0?!0:n.replace(/^"|"$/g,"")}return e}function rnt(t){let e=[];for(let r in t){let o=t[r];e.push(o===!0?r:r+"="+o)}if(!!e.length)return e.join(", ")}rae.exports=class{constructor(e,r,{shared:o,cacheHeuristic:a,immutableMinTimeToLive:n,ignoreCargoCult:u,_fromObject:A}={}){if(A){this._fromObject(A);return}if(!r||!r.headers)throw Error("Response headers missing");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=o!==!1,this._cacheHeuristic=a!==void 0?a:.1,this._immutableMinTtl=n!==void 0?n:24*3600*1e3,this._status="status"in r?r.status:200,this._resHeaders=r.headers,this._rescc=KM(r.headers["cache-control"]),this._method="method"in e?e.method:"GET",this._url=e.url,this._host=e.headers.host,this._noAuthorization=!e.headers.authorization,this._reqHeaders=r.headers.vary?e.headers:null,this._reqcc=KM(e.headers["cache-control"]),u&&"pre-check"in this._rescc&&"post-check"in this._rescc&&(delete this._rescc["pre-check"],delete this._rescc["post-check"],delete this._rescc["no-cache"],delete this._rescc["no-store"],delete this._rescc["must-revalidate"],this._resHeaders=Object.assign({},this._resHeaders,{"cache-control":rnt(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),r.headers["cache-control"]==null&&/no-cache/.test(r.headers.pragma)&&(this._rescc["no-cache"]=!0)}now(){return Date.now()}storable(){return!!(!this._reqcc["no-store"]&&(this._method==="GET"||this._method==="HEAD"||this._method==="POST"&&this._hasExplicitExpiration())&&Xrt.has(this._status)&&!this._rescc["no-store"]&&(!this._isShared||!this._rescc.private)&&(!this._isShared||this._noAuthorization||this._allowsStoringAuthenticated())&&(this._resHeaders.expires||this._rescc["max-age"]||this._isShared&&this._rescc["s-maxage"]||this._rescc.public||zrt.has(this._status)))}_hasExplicitExpiration(){return this._isShared&&this._rescc["s-maxage"]||this._rescc["max-age"]||this._resHeaders.expires}_assertRequestHasHeaders(e){if(!e||!e.headers)throw Error("Request headers missing")}satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);let r=KM(e.headers["cache-control"]);return r["no-cache"]||/no-cache/.test(e.headers.pragma)||r["max-age"]&&this.age()>r["max-age"]||r["min-fresh"]&&this.timeToLive()<1e3*r["min-fresh"]||this.stale()&&!(r["max-stale"]&&!this._rescc["must-revalidate"]&&(r["max-stale"]===!0||r["max-stale"]>this.age()-this.maxAge()))?!1:this._requestMatches(e,!1)}_requestMatches(e,r){return(!this._url||this._url===e.url)&&this._host===e.headers.host&&(!e.method||this._method===e.method||r&&e.method==="HEAD")&&this._varyMatches(e)}_allowsStoringAuthenticated(){return this._rescc["must-revalidate"]||this._rescc.public||this._rescc["s-maxage"]}_varyMatches(e){if(!this._resHeaders.vary)return!0;if(this._resHeaders.vary==="*")return!1;let r=this._resHeaders.vary.trim().toLowerCase().split(/\s*,\s*/);for(let o of r)if(e.headers[o]!==this._reqHeaders[o])return!1;return!0}_copyWithoutHopByHopHeaders(e){let r={};for(let o in e)$rt[o]||(r[o]=e[o]);if(e.connection){let o=e.connection.trim().split(/\s*,\s*/);for(let a of o)delete r[a]}if(r.warning){let o=r.warning.split(/,/).filter(a=>!/^\s*1[0-9][0-9]/.test(a));o.length?r.warning=o.join(",").trim():delete r.warning}return r}responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeaders),r=this.age();return r>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(e.warning=(e.warning?`${e.warning}, `:"")+'113 - "rfc7234 5.5.4"'),e.age=`${Math.round(r)}`,e.date=new Date(this.now()).toUTCString(),e}date(){let e=Date.parse(this._resHeaders.date);return isFinite(e)?e:this._responseTime}age(){let e=this._ageValue(),r=(this.now()-this._responseTime)/1e3;return e+r}_ageValue(){return xd(this._resHeaders.age)}maxAge(){if(!this.storable()||this._rescc["no-cache"]||this._isShared&&this._resHeaders["set-cookie"]&&!this._rescc.public&&!this._rescc.immutable||this._resHeaders.vary==="*")return 0;if(this._isShared){if(this._rescc["proxy-revalidate"])return 0;if(this._rescc["s-maxage"])return xd(this._rescc["s-maxage"])}if(this._rescc["max-age"])return xd(this._rescc["max-age"]);let e=this._rescc.immutable?this._immutableMinTtl:0,r=this.date();if(this._resHeaders.expires){let o=Date.parse(this._resHeaders.expires);return Number.isNaN(o)||oo)return Math.max(e,(r-o)/1e3*this._cacheHeuristic)}return e}timeToLive(){let e=this.maxAge()-this.age(),r=e+xd(this._rescc["stale-if-error"]),o=e+xd(this._rescc["stale-while-revalidate"]);return Math.max(0,e,r,o)*1e3}stale(){return this.maxAge()<=this.age()}_useStaleIfError(){return this.maxAge()+xd(this._rescc["stale-if-error"])>this.age()}useStaleWhileRevalidate(){return this.maxAge()+xd(this._rescc["stale-while-revalidate"])>this.age()}static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}_fromObject(e){if(this._responseTime)throw Error("Reinitialized");if(!e||e.v!==1)throw Error("Invalid serialization");this._responseTime=e.t,this._isShared=e.sh,this._cacheHeuristic=e.ch,this._immutableMinTtl=e.imm!==void 0?e.imm:24*3600*1e3,this._status=e.st,this._resHeaders=e.resh,this._rescc=e.rescc,this._method=e.m,this._url=e.u,this._host=e.h,this._noAuthorization=e.a,this._reqHeaders=e.reqh,this._reqcc=e.reqcc}toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._cacheHeuristic,imm:this._immutableMinTtl,st:this._status,resh:this._resHeaders,rescc:this._rescc,m:this._method,u:this._url,h:this._host,a:this._noAuthorization,reqh:this._reqHeaders,reqcc:this._reqcc}}revalidationHeaders(e){this._assertRequestHasHeaders(e);let r=this._copyWithoutHopByHopHeaders(e.headers);if(delete r["if-range"],!this._requestMatches(e,!0)||!this.storable())return delete r["if-none-match"],delete r["if-modified-since"],r;if(this._resHeaders.etag&&(r["if-none-match"]=r["if-none-match"]?`${r["if-none-match"]}, ${this._resHeaders.etag}`:this._resHeaders.etag),r["accept-ranges"]||r["if-match"]||r["if-unmodified-since"]||this._method&&this._method!="GET"){if(delete r["if-modified-since"],r["if-none-match"]){let a=r["if-none-match"].split(/,/).filter(n=>!/^\s*W\//.test(n));a.length?r["if-none-match"]=a.join(",").trim():delete r["if-none-match"]}}else this._resHeaders["last-modified"]&&!r["if-modified-since"]&&(r["if-modified-since"]=this._resHeaders["last-modified"]);return r}revalidatedPolicy(e,r){if(this._assertRequestHasHeaders(e),this._useStaleIfError()&&tnt(r))return{modified:!1,matches:!1,policy:this};if(!r||!r.headers)throw Error("Response headers missing");let o=!1;if(r.status!==void 0&&r.status!=304?o=!1:r.headers.etag&&!/^\s*W\//.test(r.headers.etag)?o=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag:this._resHeaders.etag&&r.headers.etag?o=this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag.replace(/^\s*W\//,""):this._resHeaders["last-modified"]?o=this._resHeaders["last-modified"]===r.headers["last-modified"]:!this._resHeaders.etag&&!this._resHeaders["last-modified"]&&!r.headers.etag&&!r.headers["last-modified"]&&(o=!0),!o)return{policy:new this.constructor(e,r),modified:r.status!=304,matches:!1};let a={};for(let u in this._resHeaders)a[u]=u in r.headers&&!ent[u]?r.headers[u]:this._resHeaders[u];let n=Object.assign({},r,{status:this._status,method:this._method,headers:a});return{policy:new this.constructor(e,n,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl}),modified:!1,matches:!0}}}});var VP=U((ALt,iae)=>{"use strict";iae.exports=t=>{let e={};for(let[r,o]of Object.entries(t))e[r.toLowerCase()]=o;return e}});var oae=U((fLt,sae)=>{"use strict";var nnt=Ie("stream").Readable,int=VP(),VM=class extends nnt{constructor(e,r,o,a){if(typeof e!="number")throw new TypeError("Argument `statusCode` should be a number");if(typeof r!="object")throw new TypeError("Argument `headers` should be an object");if(!(o instanceof Buffer))throw new TypeError("Argument `body` should be a buffer");if(typeof a!="string")throw new TypeError("Argument `url` should be a string");super(),this.statusCode=e,this.headers=int(r),this.body=o,this.url=a}_read(){this.push(this.body),this.push(null)}};sae.exports=VM});var lae=U((pLt,aae)=>{"use strict";var snt=["destroy","setTimeout","socket","headers","trailers","rawHeaders","statusCode","httpVersion","httpVersionMinor","httpVersionMajor","rawTrailers","statusMessage"];aae.exports=(t,e)=>{let r=new Set(Object.keys(t).concat(snt));for(let o of r)o in e||(e[o]=typeof t[o]=="function"?t[o].bind(t):t[o])}});var uae=U((hLt,cae)=>{"use strict";var ont=Ie("stream").PassThrough,ant=lae(),lnt=t=>{if(!(t&&t.pipe))throw new TypeError("Parameter `response` must be a response stream.");let e=new ont;return ant(t,e),t.pipe(e)};cae.exports=lnt});var Aae=U(JM=>{JM.stringify=function t(e){if(typeof e>"u")return e;if(e&&Buffer.isBuffer(e))return JSON.stringify(":base64:"+e.toString("base64"));if(e&&e.toJSON&&(e=e.toJSON()),e&&typeof e=="object"){var r="",o=Array.isArray(e);r=o?"[":"{";var a=!0;for(var n in e){var u=typeof e[n]=="function"||!o&&typeof e[n]>"u";Object.hasOwnProperty.call(e,n)&&!u&&(a||(r+=","),a=!1,o?e[n]==null?r+="null":r+=t(e[n]):e[n]!==void 0&&(r+=t(n)+":"+t(e[n])))}return r+=o?"]":"}",r}else return typeof e=="string"?JSON.stringify(/^:/.test(e)?":"+e:e):typeof e>"u"?"null":JSON.stringify(e)};JM.parse=function(t){return JSON.parse(t,function(e,r){return typeof r=="string"?/^:base64:/.test(r)?Buffer.from(r.substring(8),"base64"):/^:/.test(r)?r.substring(1):r:r})}});var hae=U((dLt,pae)=>{"use strict";var cnt=Ie("events"),fae=Aae(),unt=t=>{let e={redis:"@keyv/redis",mongodb:"@keyv/mongo",mongo:"@keyv/mongo",sqlite:"@keyv/sqlite",postgresql:"@keyv/postgres",postgres:"@keyv/postgres",mysql:"@keyv/mysql"};if(t.adapter||t.uri){let r=t.adapter||/^[^:]*/.exec(t.uri)[0];return new(Ie(e[r]))(t)}return new Map},zM=class extends cnt{constructor(e,r){if(super(),this.opts=Object.assign({namespace:"keyv",serialize:fae.stringify,deserialize:fae.parse},typeof e=="string"?{uri:e}:e,r),!this.opts.store){let o=Object.assign({},this.opts);this.opts.store=unt(o)}typeof this.opts.store.on=="function"&&this.opts.store.on("error",o=>this.emit("error",o)),this.opts.store.namespace=this.opts.namespace}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}get(e,r){e=this._getKeyPrefix(e);let{store:o}=this.opts;return Promise.resolve().then(()=>o.get(e)).then(a=>typeof a=="string"?this.opts.deserialize(a):a).then(a=>{if(a!==void 0){if(typeof a.expires=="number"&&Date.now()>a.expires){this.delete(e);return}return r&&r.raw?a:a.value}})}set(e,r,o){e=this._getKeyPrefix(e),typeof o>"u"&&(o=this.opts.ttl),o===0&&(o=void 0);let{store:a}=this.opts;return Promise.resolve().then(()=>{let n=typeof o=="number"?Date.now()+o:null;return r={value:r,expires:n},this.opts.serialize(r)}).then(n=>a.set(e,n,o)).then(()=>!0)}delete(e){e=this._getKeyPrefix(e);let{store:r}=this.opts;return Promise.resolve().then(()=>r.delete(e))}clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear())}};pae.exports=zM});var mae=U((yLt,dae)=>{"use strict";var Ant=Ie("events"),JP=Ie("url"),fnt=qoe(),pnt=tae(),XM=nae(),gae=oae(),hnt=VP(),gnt=uae(),dnt=hae(),Yc=class{constructor(e,r){if(typeof e!="function")throw new TypeError("Parameter `request` must be a function");return this.cache=new dnt({uri:typeof r=="string"&&r,store:typeof r!="string"&&r,namespace:"cacheable-request"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(r,o)=>{let a;if(typeof r=="string")a=ZM(JP.parse(r)),r={};else if(r instanceof JP.URL)a=ZM(JP.parse(r.toString())),r={};else{let[w,...v]=(r.path||"").split("?"),b=v.length>0?`?${v.join("?")}`:"";a=ZM({...r,pathname:w,search:b})}r={headers:{},method:"GET",cache:!0,strictTtl:!1,automaticFailover:!1,...r,...mnt(a)},r.headers=hnt(r.headers);let n=new Ant,u=fnt(JP.format(a),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),A=`${r.method}:${u}`,p=!1,h=!1,E=w=>{h=!0;let v=!1,b,C=new Promise(L=>{b=()=>{v||(v=!0,L())}}),R=L=>{if(p&&!w.forceRefresh){L.status=L.statusCode;let V=XM.fromObject(p.cachePolicy).revalidatedPolicy(w,L);if(!V.modified){let re=V.policy.responseHeaders();L=new gae(p.statusCode,re,p.body,p.url),L.cachePolicy=V.policy,L.fromCache=!0}}L.fromCache||(L.cachePolicy=new XM(w,L,w),L.fromCache=!1);let _;w.cache&&L.cachePolicy.storable()?(_=gnt(L),(async()=>{try{let V=pnt.buffer(L);if(await Promise.race([C,new Promise(he=>L.once("end",he))]),v)return;let re=await V,oe={cachePolicy:L.cachePolicy.toObject(),url:L.url,statusCode:L.fromCache?p.statusCode:L.statusCode,body:re},pe=w.strictTtl?L.cachePolicy.timeToLive():void 0;w.maxTtl&&(pe=pe?Math.min(pe,w.maxTtl):w.maxTtl),await this.cache.set(A,oe,pe)}catch(V){n.emit("error",new Yc.CacheError(V))}})()):w.cache&&p&&(async()=>{try{await this.cache.delete(A)}catch(V){n.emit("error",new Yc.CacheError(V))}})(),n.emit("response",_||L),typeof o=="function"&&o(_||L)};try{let L=e(w,R);L.once("error",b),L.once("abort",b),n.emit("request",L)}catch(L){n.emit("error",new Yc.RequestError(L))}};return(async()=>{let w=async b=>{await Promise.resolve();let C=b.cache?await this.cache.get(A):void 0;if(typeof C>"u")return E(b);let R=XM.fromObject(C.cachePolicy);if(R.satisfiesWithoutRevalidation(b)&&!b.forceRefresh){let L=R.responseHeaders(),_=new gae(C.statusCode,L,C.body,C.url);_.cachePolicy=R,_.fromCache=!0,n.emit("response",_),typeof o=="function"&&o(_)}else p=C,b.headers=R.revalidationHeaders(b),E(b)},v=b=>n.emit("error",new Yc.CacheError(b));this.cache.once("error",v),n.on("response",()=>this.cache.removeListener("error",v));try{await w(r)}catch(b){r.automaticFailover&&!h&&E(r),n.emit("error",new Yc.CacheError(b))}})(),n}}};function mnt(t){let e={...t};return e.path=`${t.pathname||"/"}${t.search||""}`,delete e.pathname,delete e.search,e}function ZM(t){return{protocol:t.protocol,auth:t.auth,hostname:t.hostname||t.host||"localhost",port:t.port,pathname:t.pathname,search:t.search}}Yc.RequestError=class extends Error{constructor(t){super(t.message),this.name="RequestError",Object.assign(this,t)}};Yc.CacheError=class extends Error{constructor(t){super(t.message),this.name="CacheError",Object.assign(this,t)}};dae.exports=Yc});var Cae=U((ILt,yae)=>{"use strict";var ynt=["aborted","complete","headers","httpVersion","httpVersionMinor","httpVersionMajor","method","rawHeaders","rawTrailers","setTimeout","socket","statusCode","statusMessage","trailers","url"];yae.exports=(t,e)=>{if(e._readableState.autoDestroy)throw new Error("The second stream must have the `autoDestroy` option set to `false`");let r=new Set(Object.keys(t).concat(ynt)),o={};for(let a of r)a in e||(o[a]={get(){let n=t[a];return typeof n=="function"?n.bind(t):n},set(n){t[a]=n},enumerable:!0,configurable:!1});return Object.defineProperties(e,o),t.once("aborted",()=>{e.destroy(),e.emit("aborted")}),t.once("close",()=>{t.complete&&e.readable?e.once("end",()=>{e.emit("close")}):e.emit("close")}),e}});var Iae=U((wLt,Eae)=>{"use strict";var{Transform:Cnt,PassThrough:Ent}=Ie("stream"),$M=Ie("zlib"),Int=Cae();Eae.exports=t=>{let e=(t.headers["content-encoding"]||"").toLowerCase();if(!["gzip","deflate","br"].includes(e))return t;let r=e==="br";if(r&&typeof $M.createBrotliDecompress!="function")return t.destroy(new Error("Brotli is not supported on Node.js < 12")),t;let o=!0,a=new Cnt({transform(A,p,h){o=!1,h(null,A)},flush(A){A()}}),n=new Ent({autoDestroy:!1,destroy(A,p){t.destroy(),p(A)}}),u=r?$M.createBrotliDecompress():$M.createUnzip();return u.once("error",A=>{if(o&&!t.readable){n.end();return}n.destroy(A)}),Int(t,n),t.pipe(a).pipe(u).pipe(n),n}});var t4=U((BLt,wae)=>{"use strict";var e4=class{constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");this.maxSize=e.maxSize,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(e,r){if(this.cache.set(e,r),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction=="function")for(let[o,a]of this.oldCache.entries())this.onEviction(o,a);this.oldCache=this.cache,this.cache=new Map}}get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e)){let r=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,r),r}}set(e,r){return this.cache.has(e)?this.cache.set(e,r):this._set(e,r),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e))return this.oldCache.get(e)}delete(e){let r=this.cache.delete(e);return r&&this._size--,this.oldCache.delete(e)||r}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.oldCache){let[r]=e;this.cache.has(r)||(yield e)}}get size(){let e=0;for(let r of this.oldCache.keys())this.cache.has(r)||e++;return Math.min(this._size+e,this.maxSize)}};wae.exports=e4});var n4=U((vLt,Sae)=>{"use strict";var wnt=Ie("events"),Bnt=Ie("tls"),vnt=Ie("http2"),Dnt=t4(),Xo=Symbol("currentStreamsCount"),Bae=Symbol("request"),Zl=Symbol("cachedOriginSet"),BC=Symbol("gracefullyClosing"),Snt=["maxDeflateDynamicTableSize","maxSessionMemory","maxHeaderListPairs","maxOutstandingPings","maxReservedRemoteStreams","maxSendHeaderBlockLength","paddingStrategy","localAddress","path","rejectUnauthorized","minDHSize","ca","cert","clientCertEngine","ciphers","key","pfx","servername","minVersion","maxVersion","secureProtocol","crl","honorCipherOrder","ecdhCurve","dhparam","secureOptions","sessionIdContext"],Pnt=(t,e,r)=>{let o=0,a=t.length;for(;o>>1;r(t[n],e)?o=n+1:a=n}return o},xnt=(t,e)=>t.remoteSettings.maxConcurrentStreams>e.remoteSettings.maxConcurrentStreams,r4=(t,e)=>{for(let r of t)r[Zl].lengthe[Zl].includes(o))&&r[Xo]+e[Xo]<=e.remoteSettings.maxConcurrentStreams&&Dae(r)},bnt=(t,e)=>{for(let r of t)e[Zl].lengthr[Zl].includes(o))&&e[Xo]+r[Xo]<=r.remoteSettings.maxConcurrentStreams&&Dae(e)},vae=({agent:t,isFree:e})=>{let r={};for(let o in t.sessions){let n=t.sessions[o].filter(u=>{let A=u[iA.kCurrentStreamsCount]{t[BC]=!0,t[Xo]===0&&t.close()},iA=class extends wnt{constructor({timeout:e=6e4,maxSessions:r=1/0,maxFreeSessions:o=10,maxCachedTlsSessions:a=100}={}){super(),this.sessions={},this.queue={},this.timeout=e,this.maxSessions=r,this.maxFreeSessions=o,this._freeSessionsCount=0,this._sessionsCount=0,this.settings={enablePush:!1},this.tlsSessionCache=new Dnt({maxSize:a})}static normalizeOrigin(e,r){return typeof e=="string"&&(e=new URL(e)),r&&e.hostname!==r&&(e.hostname=r),e.origin}normalizeOptions(e){let r="";if(e)for(let o of Snt)e[o]&&(r+=`:${e[o]}`);return r}_tryToCreateNewSession(e,r){if(!(e in this.queue)||!(r in this.queue[e]))return;let o=this.queue[e][r];this._sessionsCount{Array.isArray(o)?(o=[...o],a()):o=[{resolve:a,reject:n}];let u=this.normalizeOptions(r),A=iA.normalizeOrigin(e,r&&r.servername);if(A===void 0){for(let{reject:E}of o)E(new TypeError("The `origin` argument needs to be a string or an URL object"));return}if(u in this.sessions){let E=this.sessions[u],w=-1,v=-1,b;for(let C of E){let R=C.remoteSettings.maxConcurrentStreams;if(R=R||C[BC]||C.destroyed)continue;b||(w=R),L>v&&(b=C,v=L)}}if(b){if(o.length!==1){for(let{reject:C}of o){let R=new Error(`Expected the length of listeners to be 1, got ${o.length}. +Please report this to https://github.com/szmarczak/http2-wrapper/`);C(R)}return}o[0].resolve(b);return}}if(u in this.queue){if(A in this.queue[u]){this.queue[u][A].listeners.push(...o),this._tryToCreateNewSession(u,A);return}}else this.queue[u]={};let p=()=>{u in this.queue&&this.queue[u][A]===h&&(delete this.queue[u][A],Object.keys(this.queue[u]).length===0&&delete this.queue[u])},h=()=>{let E=`${A}:${u}`,w=!1;try{let v=vnt.connect(e,{createConnection:this.createConnection,settings:this.settings,session:this.tlsSessionCache.get(E),...r});v[Xo]=0,v[BC]=!1;let b=()=>v[Xo]{this.tlsSessionCache.set(E,L)}),v.once("error",L=>{for(let{reject:_}of o)_(L);this.tlsSessionCache.delete(E)}),v.setTimeout(this.timeout,()=>{v.destroy()}),v.once("close",()=>{if(w){C&&this._freeSessionsCount--,this._sessionsCount--;let L=this.sessions[u];L.splice(L.indexOf(v),1),L.length===0&&delete this.sessions[u]}else{let L=new Error("Session closed without receiving a SETTINGS frame");L.code="HTTP2WRAPPER_NOSETTINGS";for(let{reject:_}of o)_(L);p()}this._tryToCreateNewSession(u,A)});let R=()=>{if(!(!(u in this.queue)||!b())){for(let L of v[Zl])if(L in this.queue[u]){let{listeners:_}=this.queue[u][L];for(;_.length!==0&&b();)_.shift().resolve(v);let V=this.queue[u];if(V[L].listeners.length===0&&(delete V[L],Object.keys(V).length===0)){delete this.queue[u];break}if(!b())break}}};v.on("origin",()=>{v[Zl]=v.originSet,b()&&(R(),r4(this.sessions[u],v))}),v.once("remoteSettings",()=>{if(v.ref(),v.unref(),this._sessionsCount++,h.destroyed){let L=new Error("Agent has been destroyed");for(let _ of o)_.reject(L);v.destroy();return}v[Zl]=v.originSet;{let L=this.sessions;if(u in L){let _=L[u];_.splice(Pnt(_,v,xnt),0,v)}else L[u]=[v]}this._freeSessionsCount+=1,w=!0,this.emit("session",v),R(),p(),v[Xo]===0&&this._freeSessionsCount>this.maxFreeSessions&&v.close(),o.length!==0&&(this.getSession(A,r,o),o.length=0),v.on("remoteSettings",()=>{R(),r4(this.sessions[u],v)})}),v[Bae]=v.request,v.request=(L,_)=>{if(v[BC])throw new Error("The session is gracefully closing. No new streams are allowed.");let V=v[Bae](L,_);return v.ref(),++v[Xo],v[Xo]===v.remoteSettings.maxConcurrentStreams&&this._freeSessionsCount--,V.once("close",()=>{if(C=b(),--v[Xo],!v.destroyed&&!v.closed&&(bnt(this.sessions[u],v),b()&&!v.closed)){C||(this._freeSessionsCount++,C=!0);let re=v[Xo]===0;re&&v.unref(),re&&(this._freeSessionsCount>this.maxFreeSessions||v[BC])?v.close():(r4(this.sessions[u],v),R())}}),V}}catch(v){for(let b of o)b.reject(v);p()}};h.listeners=o,h.completed=!1,h.destroyed=!1,this.queue[u][A]=h,this._tryToCreateNewSession(u,A)})}request(e,r,o,a){return new Promise((n,u)=>{this.getSession(e,r,[{reject:u,resolve:A=>{try{n(A.request(o,a))}catch(p){u(p)}}}])})}createConnection(e,r){return iA.connect(e,r)}static connect(e,r){r.ALPNProtocols=["h2"];let o=e.port||443,a=e.hostname||e.host;return typeof r.servername>"u"&&(r.servername=a),Bnt.connect(o,a,r)}closeFreeSessions(){for(let e of Object.values(this.sessions))for(let r of e)r[Xo]===0&&r.close()}destroy(e){for(let r of Object.values(this.sessions))for(let o of r)o.destroy(e);for(let r of Object.values(this.queue))for(let o of Object.values(r))o.destroyed=!0;this.queue={}}get freeSessions(){return vae({agent:this,isFree:!0})}get busySessions(){return vae({agent:this,isFree:!1})}};iA.kCurrentStreamsCount=Xo;iA.kGracefullyClosing=BC;Sae.exports={Agent:iA,globalAgent:new iA}});var s4=U((DLt,Pae)=>{"use strict";var{Readable:Qnt}=Ie("stream"),i4=class extends Qnt{constructor(e,r){super({highWaterMark:r,autoDestroy:!1}),this.statusCode=null,this.statusMessage="",this.httpVersion="2.0",this.httpVersionMajor=2,this.httpVersionMinor=0,this.headers={},this.trailers={},this.req=null,this.aborted=!1,this.complete=!1,this.upgrade=null,this.rawHeaders=[],this.rawTrailers=[],this.socket=e,this.connection=e,this._dumped=!1}_destroy(e){this.req._request.destroy(e)}setTimeout(e,r){return this.req.setTimeout(e,r),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners("data"),this.resume())}_read(){this.req&&this.req._request.resume()}};Pae.exports=i4});var o4=U((SLt,xae)=>{"use strict";xae.exports=t=>{let e={protocol:t.protocol,hostname:typeof t.hostname=="string"&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return typeof t.port=="string"&&t.port.length!==0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var Qae=U((PLt,bae)=>{"use strict";bae.exports=(t,e,r)=>{for(let o of r)t.on(o,(...a)=>e.emit(o,...a))}});var Fae=U((xLt,kae)=>{"use strict";kae.exports=t=>{switch(t){case":method":case":scheme":case":authority":case":path":return!0;default:return!1}}});var Tae=U((QLt,Rae)=>{"use strict";var vC=(t,e,r)=>{Rae.exports[e]=class extends t{constructor(...a){super(typeof r=="string"?r:r(a)),this.name=`${super.name} [${e}]`,this.code=e}}};vC(TypeError,"ERR_INVALID_ARG_TYPE",t=>{let e=t[0].includes(".")?"property":"argument",r=t[1],o=Array.isArray(r);return o&&(r=`${r.slice(0,-1).join(", ")} or ${r.slice(-1)}`),`The "${t[0]}" ${e} must be ${o?"one of":"of"} type ${r}. Received ${typeof t[2]}`});vC(TypeError,"ERR_INVALID_PROTOCOL",t=>`Protocol "${t[0]}" not supported. Expected "${t[1]}"`);vC(Error,"ERR_HTTP_HEADERS_SENT",t=>`Cannot ${t[0]} headers after they are sent to the client`);vC(TypeError,"ERR_INVALID_HTTP_TOKEN",t=>`${t[0]} must be a valid HTTP token [${t[1]}]`);vC(TypeError,"ERR_HTTP_INVALID_HEADER_VALUE",t=>`Invalid value "${t[0]} for header "${t[1]}"`);vC(TypeError,"ERR_INVALID_CHAR",t=>`Invalid character in ${t[0]} [${t[1]}]`)});var A4=U((kLt,Hae)=>{"use strict";var knt=Ie("http2"),{Writable:Fnt}=Ie("stream"),{Agent:Nae,globalAgent:Rnt}=n4(),Tnt=s4(),Nnt=o4(),Lnt=Qae(),Ont=Fae(),{ERR_INVALID_ARG_TYPE:a4,ERR_INVALID_PROTOCOL:Mnt,ERR_HTTP_HEADERS_SENT:Lae,ERR_INVALID_HTTP_TOKEN:Unt,ERR_HTTP_INVALID_HEADER_VALUE:_nt,ERR_INVALID_CHAR:Hnt}=Tae(),{HTTP2_HEADER_STATUS:Oae,HTTP2_HEADER_METHOD:Mae,HTTP2_HEADER_PATH:Uae,HTTP2_METHOD_CONNECT:qnt}=knt.constants,xo=Symbol("headers"),l4=Symbol("origin"),c4=Symbol("session"),_ae=Symbol("options"),zP=Symbol("flushedHeaders"),s1=Symbol("jobs"),jnt=/^[\^`\-\w!#$%&*+.|~]+$/,Gnt=/[^\t\u0020-\u007E\u0080-\u00FF]/,u4=class extends Fnt{constructor(e,r,o){super({autoDestroy:!1});let a=typeof e=="string"||e instanceof URL;if(a&&(e=Nnt(e instanceof URL?e:new URL(e))),typeof r=="function"||r===void 0?(o=r,r=a?e:{...e}):r={...e,...r},r.h2session)this[c4]=r.h2session;else if(r.agent===!1)this.agent=new Nae({maxFreeSessions:0});else if(typeof r.agent>"u"||r.agent===null)typeof r.createConnection=="function"?(this.agent=new Nae({maxFreeSessions:0}),this.agent.createConnection=r.createConnection):this.agent=Rnt;else if(typeof r.agent.request=="function")this.agent=r.agent;else throw new a4("options.agent",["Agent-like Object","undefined","false"],r.agent);if(r.protocol&&r.protocol!=="https:")throw new Mnt(r.protocol,"https:");let n=r.port||r.defaultPort||this.agent&&this.agent.defaultPort||443,u=r.hostname||r.host||"localhost";delete r.hostname,delete r.host,delete r.port;let{timeout:A}=r;if(r.timeout=void 0,this[xo]=Object.create(null),this[s1]=[],this.socket=null,this.connection=null,this.method=r.method||"GET",this.path=r.path,this.res=null,this.aborted=!1,this.reusedSocket=!1,r.headers)for(let[p,h]of Object.entries(r.headers))this.setHeader(p,h);r.auth&&!("authorization"in this[xo])&&(this[xo].authorization="Basic "+Buffer.from(r.auth).toString("base64")),r.session=r.tlsSession,r.path=r.socketPath,this[_ae]=r,n===443?(this[l4]=`https://${u}`,":authority"in this[xo]||(this[xo][":authority"]=u)):(this[l4]=`https://${u}:${n}`,":authority"in this[xo]||(this[xo][":authority"]=`${u}:${n}`)),A&&this.setTimeout(A),o&&this.once("response",o),this[zP]=!1}get method(){return this[xo][Mae]}set method(e){e&&(this[xo][Mae]=e.toUpperCase())}get path(){return this[xo][Uae]}set path(e){e&&(this[xo][Uae]=e)}get _mustNotHaveABody(){return this.method==="GET"||this.method==="HEAD"||this.method==="DELETE"}_write(e,r,o){if(this._mustNotHaveABody){o(new Error("The GET, HEAD and DELETE methods must NOT have a body"));return}this.flushHeaders();let a=()=>this._request.write(e,r,o);this._request?a():this[s1].push(a)}_final(e){if(this.destroyed)return;this.flushHeaders();let r=()=>{if(this._mustNotHaveABody){e();return}this._request.end(e)};this._request?r():this[s1].push(r)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit("abort")),this.aborted=!0,this.destroy())}_destroy(e,r){this.res&&this.res._dump(),this._request&&this._request.destroy(),r(e)}async flushHeaders(){if(this[zP]||this.destroyed)return;this[zP]=!0;let e=this.method===qnt,r=o=>{if(this._request=o,this.destroyed){o.destroy();return}e||Lnt(o,this,["timeout","continue","close","error"]);let a=u=>(...A)=>{!this.writable&&!this.destroyed?u(...A):this.once("finish",()=>{u(...A)})};o.once("response",a((u,A,p)=>{let h=new Tnt(this.socket,o.readableHighWaterMark);this.res=h,h.req=this,h.statusCode=u[Oae],h.headers=u,h.rawHeaders=p,h.once("end",()=>{this.aborted?(h.aborted=!0,h.emit("aborted")):(h.complete=!0,h.socket=null,h.connection=null)}),e?(h.upgrade=!0,this.emit("connect",h,o,Buffer.alloc(0))?this.emit("close"):o.destroy()):(o.on("data",E=>{!h._dumped&&!h.push(E)&&o.pause()}),o.once("end",()=>{h.push(null)}),this.emit("response",h)||h._dump())})),o.once("headers",a(u=>this.emit("information",{statusCode:u[Oae]}))),o.once("trailers",a((u,A,p)=>{let{res:h}=this;h.trailers=u,h.rawTrailers=p}));let{socket:n}=o.session;this.socket=n,this.connection=n;for(let u of this[s1])u();this.emit("socket",this.socket)};if(this[c4])try{r(this[c4].request(this[xo]))}catch(o){this.emit("error",o)}else{this.reusedSocket=!0;try{r(await this.agent.request(this[l4],this[_ae],this[xo]))}catch(o){this.emit("error",o)}}}getHeader(e){if(typeof e!="string")throw new a4("name","string",e);return this[xo][e.toLowerCase()]}get headersSent(){return this[zP]}removeHeader(e){if(typeof e!="string")throw new a4("name","string",e);if(this.headersSent)throw new Lae("remove");delete this[xo][e.toLowerCase()]}setHeader(e,r){if(this.headersSent)throw new Lae("set");if(typeof e!="string"||!jnt.test(e)&&!Ont(e))throw new Unt("Header name",e);if(typeof r>"u")throw new _nt(r,e);if(Gnt.test(r))throw new Hnt("header content",e);this[xo][e.toLowerCase()]=r}setNoDelay(){}setSocketKeepAlive(){}setTimeout(e,r){let o=()=>this._request.setTimeout(e,r);return this._request?o():this[s1].push(o),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(e){}};Hae.exports=u4});var jae=U((FLt,qae)=>{"use strict";var Wnt=Ie("tls");qae.exports=(t={})=>new Promise((e,r)=>{let o=Wnt.connect(t,()=>{t.resolveSocket?(o.off("error",r),e({alpnProtocol:o.alpnProtocol,socket:o})):(o.destroy(),e({alpnProtocol:o.alpnProtocol}))});o.on("error",r)})});var Wae=U((RLt,Gae)=>{"use strict";var Ynt=Ie("net");Gae.exports=t=>{let e=t.host,r=t.headers&&t.headers.host;return r&&(r.startsWith("[")?r.indexOf("]")===-1?e=r:e=r.slice(1,-1):e=r.split(":",1)[0]),Ynt.isIP(e)?"":e}});var Vae=U((TLt,p4)=>{"use strict";var Yae=Ie("http"),f4=Ie("https"),Knt=jae(),Vnt=t4(),Jnt=A4(),znt=Wae(),Xnt=o4(),XP=new Vnt({maxSize:100}),o1=new Map,Kae=(t,e,r)=>{e._httpMessage={shouldKeepAlive:!0};let o=()=>{t.emit("free",e,r)};e.on("free",o);let a=()=>{t.removeSocket(e,r)};e.on("close",a);let n=()=>{t.removeSocket(e,r),e.off("close",a),e.off("free",o),e.off("agentRemove",n)};e.on("agentRemove",n),t.emit("free",e,r)},Znt=async t=>{let e=`${t.host}:${t.port}:${t.ALPNProtocols.sort()}`;if(!XP.has(e)){if(o1.has(e))return(await o1.get(e)).alpnProtocol;let{path:r,agent:o}=t;t.path=t.socketPath;let a=Knt(t);o1.set(e,a);try{let{socket:n,alpnProtocol:u}=await a;if(XP.set(e,u),t.path=r,u==="h2")n.destroy();else{let{globalAgent:A}=f4,p=f4.Agent.prototype.createConnection;o?o.createConnection===p?Kae(o,n,t):n.destroy():A.createConnection===p?Kae(A,n,t):n.destroy()}return o1.delete(e),u}catch(n){throw o1.delete(e),n}}return XP.get(e)};p4.exports=async(t,e,r)=>{if((typeof t=="string"||t instanceof URL)&&(t=Xnt(new URL(t))),typeof e=="function"&&(r=e,e=void 0),e={ALPNProtocols:["h2","http/1.1"],...t,...e,resolveSocket:!0},!Array.isArray(e.ALPNProtocols)||e.ALPNProtocols.length===0)throw new Error("The `ALPNProtocols` option must be an Array with at least one entry");e.protocol=e.protocol||"https:";let o=e.protocol==="https:";e.host=e.hostname||e.host||"localhost",e.session=e.tlsSession,e.servername=e.servername||znt(e),e.port=e.port||(o?443:80),e._defaultAgent=o?f4.globalAgent:Yae.globalAgent;let a=e.agent;if(a){if(a.addRequest)throw new Error("The `options.agent` object can contain only `http`, `https` or `http2` properties");e.agent=a[o?"https":"http"]}return o&&await Znt(e)==="h2"?(a&&(e.agent=a.http2),new Jnt(e,r)):Yae.request(e,r)};p4.exports.protocolCache=XP});var zae=U((NLt,Jae)=>{"use strict";var $nt=Ie("http2"),eit=n4(),h4=A4(),tit=s4(),rit=Vae(),nit=(t,e,r)=>new h4(t,e,r),iit=(t,e,r)=>{let o=new h4(t,e,r);return o.end(),o};Jae.exports={...$nt,ClientRequest:h4,IncomingMessage:tit,...eit,request:nit,get:iit,auto:rit}});var d4=U(g4=>{"use strict";Object.defineProperty(g4,"__esModule",{value:!0});var Xae=Tf();g4.default=t=>Xae.default.nodeStream(t)&&Xae.default.function_(t.getBoundary)});var tle=U(m4=>{"use strict";Object.defineProperty(m4,"__esModule",{value:!0});var $ae=Ie("fs"),ele=Ie("util"),Zae=Tf(),sit=d4(),oit=ele.promisify($ae.stat);m4.default=async(t,e)=>{if(e&&"content-length"in e)return Number(e["content-length"]);if(!t)return 0;if(Zae.default.string(t))return Buffer.byteLength(t);if(Zae.default.buffer(t))return t.length;if(sit.default(t))return ele.promisify(t.getLength.bind(t))();if(t instanceof $ae.ReadStream){let{size:r}=await oit(t.path);return r===0?void 0:r}}});var C4=U(y4=>{"use strict";Object.defineProperty(y4,"__esModule",{value:!0});function ait(t,e,r){let o={};for(let a of r)o[a]=(...n)=>{e.emit(a,...n)},t.on(a,o[a]);return()=>{for(let a of r)t.off(a,o[a])}}y4.default=ait});var rle=U(E4=>{"use strict";Object.defineProperty(E4,"__esModule",{value:!0});E4.default=()=>{let t=[];return{once(e,r,o){e.once(r,o),t.push({origin:e,event:r,fn:o})},unhandleAll(){for(let e of t){let{origin:r,event:o,fn:a}=e;r.removeListener(o,a)}t.length=0}}}});var ile=U(a1=>{"use strict";Object.defineProperty(a1,"__esModule",{value:!0});a1.TimeoutError=void 0;var lit=Ie("net"),cit=rle(),nle=Symbol("reentry"),uit=()=>{},ZP=class extends Error{constructor(e,r){super(`Timeout awaiting '${r}' for ${e}ms`),this.event=r,this.name="TimeoutError",this.code="ETIMEDOUT"}};a1.TimeoutError=ZP;a1.default=(t,e,r)=>{if(nle in t)return uit;t[nle]=!0;let o=[],{once:a,unhandleAll:n}=cit.default(),u=(w,v,b)=>{var C;let R=setTimeout(v,w,w,b);(C=R.unref)===null||C===void 0||C.call(R);let L=()=>{clearTimeout(R)};return o.push(L),L},{host:A,hostname:p}=r,h=(w,v)=>{t.destroy(new ZP(w,v))},E=()=>{for(let w of o)w();n()};if(t.once("error",w=>{if(E(),t.listenerCount("error")===0)throw w}),t.once("close",E),a(t,"response",w=>{a(w,"end",E)}),typeof e.request<"u"&&u(e.request,h,"request"),typeof e.socket<"u"){let w=()=>{h(e.socket,"socket")};t.setTimeout(e.socket,w),o.push(()=>{t.removeListener("timeout",w)})}return a(t,"socket",w=>{var v;let{socketPath:b}=t;if(w.connecting){let C=Boolean(b??lit.isIP((v=p??A)!==null&&v!==void 0?v:"")!==0);if(typeof e.lookup<"u"&&!C&&typeof w.address().address>"u"){let R=u(e.lookup,h,"lookup");a(w,"lookup",R)}if(typeof e.connect<"u"){let R=()=>u(e.connect,h,"connect");C?a(w,"connect",R()):a(w,"lookup",L=>{L===null&&a(w,"connect",R())})}typeof e.secureConnect<"u"&&r.protocol==="https:"&&a(w,"connect",()=>{let R=u(e.secureConnect,h,"secureConnect");a(w,"secureConnect",R)})}if(typeof e.send<"u"){let C=()=>u(e.send,h,"send");w.connecting?a(w,"connect",()=>{a(t,"upload-complete",C())}):a(t,"upload-complete",C())}}),typeof e.response<"u"&&a(t,"upload-complete",()=>{let w=u(e.response,h,"response");a(t,"response",w)}),E}});var ole=U(I4=>{"use strict";Object.defineProperty(I4,"__esModule",{value:!0});var sle=Tf();I4.default=t=>{t=t;let e={protocol:t.protocol,hostname:sle.default.string(t.hostname)&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return sle.default.string(t.port)&&t.port.length>0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var ale=U(w4=>{"use strict";Object.defineProperty(w4,"__esModule",{value:!0});var Ait=Ie("url"),fit=["protocol","host","hostname","port","pathname","search"];w4.default=(t,e)=>{var r,o;if(e.path){if(e.pathname)throw new TypeError("Parameters `path` and `pathname` are mutually exclusive.");if(e.search)throw new TypeError("Parameters `path` and `search` are mutually exclusive.");if(e.searchParams)throw new TypeError("Parameters `path` and `searchParams` are mutually exclusive.")}if(e.search&&e.searchParams)throw new TypeError("Parameters `search` and `searchParams` are mutually exclusive.");if(!t){if(!e.protocol)throw new TypeError("No URL protocol specified");t=`${e.protocol}//${(o=(r=e.hostname)!==null&&r!==void 0?r:e.host)!==null&&o!==void 0?o:""}`}let a=new Ait.URL(t);if(e.path){let n=e.path.indexOf("?");n===-1?e.pathname=e.path:(e.pathname=e.path.slice(0,n),e.search=e.path.slice(n+1)),delete e.path}for(let n of fit)e[n]&&(a[n]=e[n].toString());return a}});var lle=U(v4=>{"use strict";Object.defineProperty(v4,"__esModule",{value:!0});var B4=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(e,r){typeof e=="object"?this.weakMap.set(e,r):this.map.set(e,r)}get(e){return typeof e=="object"?this.weakMap.get(e):this.map.get(e)}has(e){return typeof e=="object"?this.weakMap.has(e):this.map.has(e)}};v4.default=B4});var S4=U(D4=>{"use strict";Object.defineProperty(D4,"__esModule",{value:!0});var pit=async t=>{let e=[],r=0;for await(let o of t)e.push(o),r+=Buffer.byteLength(o);return Buffer.isBuffer(e[0])?Buffer.concat(e,r):Buffer.from(e.join(""))};D4.default=pit});var ule=U(bd=>{"use strict";Object.defineProperty(bd,"__esModule",{value:!0});bd.dnsLookupIpVersionToFamily=bd.isDnsLookupIpVersion=void 0;var cle={auto:0,ipv4:4,ipv6:6};bd.isDnsLookupIpVersion=t=>t in cle;bd.dnsLookupIpVersionToFamily=t=>{if(bd.isDnsLookupIpVersion(t))return cle[t];throw new Error("Invalid DNS lookup IP version")}});var P4=U($P=>{"use strict";Object.defineProperty($P,"__esModule",{value:!0});$P.isResponseOk=void 0;$P.isResponseOk=t=>{let{statusCode:e}=t,r=t.request.options.followRedirect?299:399;return e>=200&&e<=r||e===304}});var fle=U(x4=>{"use strict";Object.defineProperty(x4,"__esModule",{value:!0});var Ale=new Set;x4.default=t=>{Ale.has(t)||(Ale.add(t),process.emitWarning(`Got: ${t}`,{type:"DeprecationWarning"}))}});var ple=U(b4=>{"use strict";Object.defineProperty(b4,"__esModule",{value:!0});var ai=Tf(),hit=(t,e)=>{if(ai.default.null_(t.encoding))throw new TypeError("To get a Buffer, set `options.responseType` to `buffer` instead");ai.assert.any([ai.default.string,ai.default.undefined],t.encoding),ai.assert.any([ai.default.boolean,ai.default.undefined],t.resolveBodyOnly),ai.assert.any([ai.default.boolean,ai.default.undefined],t.methodRewriting),ai.assert.any([ai.default.boolean,ai.default.undefined],t.isStream),ai.assert.any([ai.default.string,ai.default.undefined],t.responseType),t.responseType===void 0&&(t.responseType="text");let{retry:r}=t;if(e?t.retry={...e.retry}:t.retry={calculateDelay:o=>o.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},ai.default.object(r)?(t.retry={...t.retry,...r},t.retry.methods=[...new Set(t.retry.methods.map(o=>o.toUpperCase()))],t.retry.statusCodes=[...new Set(t.retry.statusCodes)],t.retry.errorCodes=[...new Set(t.retry.errorCodes)]):ai.default.number(r)&&(t.retry.limit=r),ai.default.undefined(t.retry.maxRetryAfter)&&(t.retry.maxRetryAfter=Math.min(...[t.timeout.request,t.timeout.connect].filter(ai.default.number))),ai.default.object(t.pagination)){e&&(t.pagination={...e.pagination,...t.pagination});let{pagination:o}=t;if(!ai.default.function_(o.transform))throw new Error("`options.pagination.transform` must be implemented");if(!ai.default.function_(o.shouldContinue))throw new Error("`options.pagination.shouldContinue` must be implemented");if(!ai.default.function_(o.filter))throw new TypeError("`options.pagination.filter` must be implemented");if(!ai.default.function_(o.paginate))throw new Error("`options.pagination.paginate` must be implemented")}return t.responseType==="json"&&t.headers.accept===void 0&&(t.headers.accept="application/json"),t};b4.default=hit});var hle=U(l1=>{"use strict";Object.defineProperty(l1,"__esModule",{value:!0});l1.retryAfterStatusCodes=void 0;l1.retryAfterStatusCodes=new Set([413,429,503]);var git=({attemptCount:t,retryOptions:e,error:r,retryAfter:o})=>{if(t>e.limit)return 0;let a=e.methods.includes(r.options.method),n=e.errorCodes.includes(r.code),u=r.response&&e.statusCodes.includes(r.response.statusCode);if(!a||!n&&!u)return 0;if(r.response){if(o)return e.maxRetryAfter===void 0||o>e.maxRetryAfter?0:o;if(r.response.statusCode===413)return 0}let A=Math.random()*100;return 2**(t-1)*1e3+A};l1.default=git});var A1=U(yn=>{"use strict";Object.defineProperty(yn,"__esModule",{value:!0});yn.UnsupportedProtocolError=yn.ReadError=yn.TimeoutError=yn.UploadError=yn.CacheError=yn.HTTPError=yn.MaxRedirectsError=yn.RequestError=yn.setNonEnumerableProperties=yn.knownHookEvents=yn.withoutBody=yn.kIsNormalizedAlready=void 0;var gle=Ie("util"),dle=Ie("stream"),dit=Ie("fs"),s0=Ie("url"),mle=Ie("http"),Q4=Ie("http"),mit=Ie("https"),yit=Foe(),Cit=Uoe(),yle=mae(),Eit=Iae(),Iit=zae(),wit=VP(),nt=Tf(),Bit=tle(),Cle=d4(),vit=C4(),Ele=ile(),Dit=ole(),Ile=ale(),Sit=lle(),Pit=S4(),wle=ule(),xit=P4(),o0=fle(),bit=ple(),Qit=hle(),k4,zs=Symbol("request"),rx=Symbol("response"),DC=Symbol("responseSize"),SC=Symbol("downloadedSize"),PC=Symbol("bodySize"),xC=Symbol("uploadedSize"),ex=Symbol("serverResponsesPiped"),Ble=Symbol("unproxyEvents"),vle=Symbol("isFromCache"),F4=Symbol("cancelTimeouts"),Dle=Symbol("startedReading"),bC=Symbol("stopReading"),tx=Symbol("triggerRead"),a0=Symbol("body"),c1=Symbol("jobs"),Sle=Symbol("originalResponse"),Ple=Symbol("retryTimeout");yn.kIsNormalizedAlready=Symbol("isNormalizedAlready");var kit=nt.default.string(process.versions.brotli);yn.withoutBody=new Set(["GET","HEAD"]);yn.knownHookEvents=["init","beforeRequest","beforeRedirect","beforeError","beforeRetry","afterResponse"];function Fit(t){for(let e in t){let r=t[e];if(!nt.default.string(r)&&!nt.default.number(r)&&!nt.default.boolean(r)&&!nt.default.null_(r)&&!nt.default.undefined(r))throw new TypeError(`The \`searchParams\` value '${String(r)}' must be a string, number, boolean or null`)}}function Rit(t){return nt.default.object(t)&&!("statusCode"in t)}var R4=new Sit.default,Tit=async t=>new Promise((e,r)=>{let o=a=>{r(a)};t.pending||e(),t.once("error",o),t.once("ready",()=>{t.off("error",o),e()})}),Nit=new Set([300,301,302,303,304,307,308]),Lit=["context","body","json","form"];yn.setNonEnumerableProperties=(t,e)=>{let r={};for(let o of t)if(!!o)for(let a of Lit)a in o&&(r[a]={writable:!0,configurable:!0,enumerable:!1,value:o[a]});Object.defineProperties(e,r)};var Vi=class extends Error{constructor(e,r,o){var a;if(super(e),Error.captureStackTrace(this,this.constructor),this.name="RequestError",this.code=r.code,o instanceof cx?(Object.defineProperty(this,"request",{enumerable:!1,value:o}),Object.defineProperty(this,"response",{enumerable:!1,value:o[rx]}),Object.defineProperty(this,"options",{enumerable:!1,value:o.options})):Object.defineProperty(this,"options",{enumerable:!1,value:o}),this.timings=(a=this.request)===null||a===void 0?void 0:a.timings,nt.default.string(r.stack)&&nt.default.string(this.stack)){let n=this.stack.indexOf(this.message)+this.message.length,u=this.stack.slice(n).split(` +`).reverse(),A=r.stack.slice(r.stack.indexOf(r.message)+r.message.length).split(` +`).reverse();for(;A.length!==0&&A[0]===u[0];)u.shift();this.stack=`${this.stack.slice(0,n)}${u.reverse().join(` +`)}${A.reverse().join(` +`)}`}}};yn.RequestError=Vi;var nx=class extends Vi{constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborting.`,{},e),this.name="MaxRedirectsError"}};yn.MaxRedirectsError=nx;var ix=class extends Vi{constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})`,{},e.request),this.name="HTTPError"}};yn.HTTPError=ix;var sx=class extends Vi{constructor(e,r){super(e.message,e,r),this.name="CacheError"}};yn.CacheError=sx;var ox=class extends Vi{constructor(e,r){super(e.message,e,r),this.name="UploadError"}};yn.UploadError=ox;var ax=class extends Vi{constructor(e,r,o){super(e.message,e,o),this.name="TimeoutError",this.event=e.event,this.timings=r}};yn.TimeoutError=ax;var u1=class extends Vi{constructor(e,r){super(e.message,e,r),this.name="ReadError"}};yn.ReadError=u1;var lx=class extends Vi{constructor(e){super(`Unsupported protocol "${e.url.protocol}"`,{},e),this.name="UnsupportedProtocolError"}};yn.UnsupportedProtocolError=lx;var Oit=["socket","connect","continue","information","upgrade","timeout"],cx=class extends dle.Duplex{constructor(e,r={},o){super({autoDestroy:!1,highWaterMark:0}),this[SC]=0,this[xC]=0,this.requestInitialized=!1,this[ex]=new Set,this.redirects=[],this[bC]=!1,this[tx]=!1,this[c1]=[],this.retryCount=0,this._progressCallbacks=[];let a=()=>this._unlockWrite(),n=()=>this._lockWrite();this.on("pipe",h=>{h.prependListener("data",a),h.on("data",n),h.prependListener("end",a),h.on("end",n)}),this.on("unpipe",h=>{h.off("data",a),h.off("data",n),h.off("end",a),h.off("end",n)}),this.on("pipe",h=>{h instanceof Q4.IncomingMessage&&(this.options.headers={...h.headers,...this.options.headers})});let{json:u,body:A,form:p}=r;if((u||A||p)&&this._lockWrite(),yn.kIsNormalizedAlready in r)this.options=r;else try{this.options=this.constructor.normalizeArguments(e,r,o)}catch(h){nt.default.nodeStream(r.body)&&r.body.destroy(),this.destroy(h);return}(async()=>{var h;try{this.options.body instanceof dit.ReadStream&&await Tit(this.options.body);let{url:E}=this.options;if(!E)throw new TypeError("Missing `url` property");if(this.requestUrl=E.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed){(h=this[zs])===null||h===void 0||h.destroy();return}for(let w of this[c1])w();this[c1].length=0,this.requestInitialized=!0}catch(E){if(E instanceof Vi){this._beforeError(E);return}this.destroyed||this.destroy(E)}})()}static normalizeArguments(e,r,o){var a,n,u,A,p;let h=r;if(nt.default.object(e)&&!nt.default.urlInstance(e))r={...o,...e,...r};else{if(e&&r&&r.url!==void 0)throw new TypeError("The `url` option is mutually exclusive with the `input` argument");r={...o,...r},e!==void 0&&(r.url=e),nt.default.urlInstance(r.url)&&(r.url=new s0.URL(r.url.toString()))}if(r.cache===!1&&(r.cache=void 0),r.dnsCache===!1&&(r.dnsCache=void 0),nt.assert.any([nt.default.string,nt.default.undefined],r.method),nt.assert.any([nt.default.object,nt.default.undefined],r.headers),nt.assert.any([nt.default.string,nt.default.urlInstance,nt.default.undefined],r.prefixUrl),nt.assert.any([nt.default.object,nt.default.undefined],r.cookieJar),nt.assert.any([nt.default.object,nt.default.string,nt.default.undefined],r.searchParams),nt.assert.any([nt.default.object,nt.default.string,nt.default.undefined],r.cache),nt.assert.any([nt.default.object,nt.default.number,nt.default.undefined],r.timeout),nt.assert.any([nt.default.object,nt.default.undefined],r.context),nt.assert.any([nt.default.object,nt.default.undefined],r.hooks),nt.assert.any([nt.default.boolean,nt.default.undefined],r.decompress),nt.assert.any([nt.default.boolean,nt.default.undefined],r.ignoreInvalidCookies),nt.assert.any([nt.default.boolean,nt.default.undefined],r.followRedirect),nt.assert.any([nt.default.number,nt.default.undefined],r.maxRedirects),nt.assert.any([nt.default.boolean,nt.default.undefined],r.throwHttpErrors),nt.assert.any([nt.default.boolean,nt.default.undefined],r.http2),nt.assert.any([nt.default.boolean,nt.default.undefined],r.allowGetBody),nt.assert.any([nt.default.string,nt.default.undefined],r.localAddress),nt.assert.any([wle.isDnsLookupIpVersion,nt.default.undefined],r.dnsLookupIpVersion),nt.assert.any([nt.default.object,nt.default.undefined],r.https),nt.assert.any([nt.default.boolean,nt.default.undefined],r.rejectUnauthorized),r.https&&(nt.assert.any([nt.default.boolean,nt.default.undefined],r.https.rejectUnauthorized),nt.assert.any([nt.default.function_,nt.default.undefined],r.https.checkServerIdentity),nt.assert.any([nt.default.string,nt.default.object,nt.default.array,nt.default.undefined],r.https.certificateAuthority),nt.assert.any([nt.default.string,nt.default.object,nt.default.array,nt.default.undefined],r.https.key),nt.assert.any([nt.default.string,nt.default.object,nt.default.array,nt.default.undefined],r.https.certificate),nt.assert.any([nt.default.string,nt.default.undefined],r.https.passphrase),nt.assert.any([nt.default.string,nt.default.buffer,nt.default.array,nt.default.undefined],r.https.pfx)),nt.assert.any([nt.default.object,nt.default.undefined],r.cacheOptions),nt.default.string(r.method)?r.method=r.method.toUpperCase():r.method="GET",r.headers===(o==null?void 0:o.headers)?r.headers={...r.headers}:r.headers=wit({...o==null?void 0:o.headers,...r.headers}),"slashes"in r)throw new TypeError("The legacy `url.Url` has been deprecated. Use `URL` instead.");if("auth"in r)throw new TypeError("Parameter `auth` is deprecated. Use `username` / `password` instead.");if("searchParams"in r&&r.searchParams&&r.searchParams!==(o==null?void 0:o.searchParams)){let b;if(nt.default.string(r.searchParams)||r.searchParams instanceof s0.URLSearchParams)b=new s0.URLSearchParams(r.searchParams);else{Fit(r.searchParams),b=new s0.URLSearchParams;for(let C in r.searchParams){let R=r.searchParams[C];R===null?b.append(C,""):R!==void 0&&b.append(C,R)}}(a=o==null?void 0:o.searchParams)===null||a===void 0||a.forEach((C,R)=>{b.has(R)||b.append(R,C)}),r.searchParams=b}if(r.username=(n=r.username)!==null&&n!==void 0?n:"",r.password=(u=r.password)!==null&&u!==void 0?u:"",nt.default.undefined(r.prefixUrl)?r.prefixUrl=(A=o==null?void 0:o.prefixUrl)!==null&&A!==void 0?A:"":(r.prefixUrl=r.prefixUrl.toString(),r.prefixUrl!==""&&!r.prefixUrl.endsWith("/")&&(r.prefixUrl+="/")),nt.default.string(r.url)){if(r.url.startsWith("/"))throw new Error("`input` must not start with a slash when using `prefixUrl`");r.url=Ile.default(r.prefixUrl+r.url,r)}else(nt.default.undefined(r.url)&&r.prefixUrl!==""||r.protocol)&&(r.url=Ile.default(r.prefixUrl,r));if(r.url){"port"in r&&delete r.port;let{prefixUrl:b}=r;Object.defineProperty(r,"prefixUrl",{set:R=>{let L=r.url;if(!L.href.startsWith(R))throw new Error(`Cannot change \`prefixUrl\` from ${b} to ${R}: ${L.href}`);r.url=new s0.URL(R+L.href.slice(b.length)),b=R},get:()=>b});let{protocol:C}=r.url;if(C==="unix:"&&(C="http:",r.url=new s0.URL(`http://unix${r.url.pathname}${r.url.search}`)),r.searchParams&&(r.url.search=r.searchParams.toString()),C!=="http:"&&C!=="https:")throw new lx(r);r.username===""?r.username=r.url.username:r.url.username=r.username,r.password===""?r.password=r.url.password:r.url.password=r.password}let{cookieJar:E}=r;if(E){let{setCookie:b,getCookieString:C}=E;nt.assert.function_(b),nt.assert.function_(C),b.length===4&&C.length===0&&(b=gle.promisify(b.bind(r.cookieJar)),C=gle.promisify(C.bind(r.cookieJar)),r.cookieJar={setCookie:b,getCookieString:C})}let{cache:w}=r;if(w&&(R4.has(w)||R4.set(w,new yle((b,C)=>{let R=b[zs](b,C);return nt.default.promise(R)&&(R.once=(L,_)=>{if(L==="error")R.catch(_);else if(L==="abort")(async()=>{try{(await R).once("abort",_)}catch{}})();else throw new Error(`Unknown HTTP2 promise event: ${L}`);return R}),R},w))),r.cacheOptions={...r.cacheOptions},r.dnsCache===!0)k4||(k4=new Cit.default),r.dnsCache=k4;else if(!nt.default.undefined(r.dnsCache)&&!r.dnsCache.lookup)throw new TypeError(`Parameter \`dnsCache\` must be a CacheableLookup instance or a boolean, got ${nt.default(r.dnsCache)}`);nt.default.number(r.timeout)?r.timeout={request:r.timeout}:o&&r.timeout!==o.timeout?r.timeout={...o.timeout,...r.timeout}:r.timeout={...r.timeout},r.context||(r.context={});let v=r.hooks===(o==null?void 0:o.hooks);r.hooks={...r.hooks};for(let b of yn.knownHookEvents)if(b in r.hooks)if(nt.default.array(r.hooks[b]))r.hooks[b]=[...r.hooks[b]];else throw new TypeError(`Parameter \`${b}\` must be an Array, got ${nt.default(r.hooks[b])}`);else r.hooks[b]=[];if(o&&!v)for(let b of yn.knownHookEvents)o.hooks[b].length>0&&(r.hooks[b]=[...o.hooks[b],...r.hooks[b]]);if("family"in r&&o0.default('"options.family" was never documented, please use "options.dnsLookupIpVersion"'),o!=null&&o.https&&(r.https={...o.https,...r.https}),"rejectUnauthorized"in r&&o0.default('"options.rejectUnauthorized" is now deprecated, please use "options.https.rejectUnauthorized"'),"checkServerIdentity"in r&&o0.default('"options.checkServerIdentity" was never documented, please use "options.https.checkServerIdentity"'),"ca"in r&&o0.default('"options.ca" was never documented, please use "options.https.certificateAuthority"'),"key"in r&&o0.default('"options.key" was never documented, please use "options.https.key"'),"cert"in r&&o0.default('"options.cert" was never documented, please use "options.https.certificate"'),"passphrase"in r&&o0.default('"options.passphrase" was never documented, please use "options.https.passphrase"'),"pfx"in r&&o0.default('"options.pfx" was never documented, please use "options.https.pfx"'),"followRedirects"in r)throw new TypeError("The `followRedirects` option does not exist. Use `followRedirect` instead.");if(r.agent){for(let b in r.agent)if(b!=="http"&&b!=="https"&&b!=="http2")throw new TypeError(`Expected the \`options.agent\` properties to be \`http\`, \`https\` or \`http2\`, got \`${b}\``)}return r.maxRedirects=(p=r.maxRedirects)!==null&&p!==void 0?p:0,yn.setNonEnumerableProperties([o,h],r),bit.default(r,o)}_lockWrite(){let e=()=>{throw new TypeError("The payload has been already provided")};this.write=e,this.end=e}_unlockWrite(){this.write=super.write,this.end=super.end}async _finalizeBody(){let{options:e}=this,{headers:r}=e,o=!nt.default.undefined(e.form),a=!nt.default.undefined(e.json),n=!nt.default.undefined(e.body),u=o||a||n,A=yn.withoutBody.has(e.method)&&!(e.method==="GET"&&e.allowGetBody);if(this._cannotHaveBody=A,u){if(A)throw new TypeError(`The \`${e.method}\` method cannot be used with a body`);if([n,o,a].filter(p=>p).length>1)throw new TypeError("The `body`, `json` and `form` options are mutually exclusive");if(n&&!(e.body instanceof dle.Readable)&&!nt.default.string(e.body)&&!nt.default.buffer(e.body)&&!Cle.default(e.body))throw new TypeError("The `body` option must be a stream.Readable, string or Buffer");if(o&&!nt.default.object(e.form))throw new TypeError("The `form` option must be an Object");{let p=!nt.default.string(r["content-type"]);n?(Cle.default(e.body)&&p&&(r["content-type"]=`multipart/form-data; boundary=${e.body.getBoundary()}`),this[a0]=e.body):o?(p&&(r["content-type"]="application/x-www-form-urlencoded"),this[a0]=new s0.URLSearchParams(e.form).toString()):(p&&(r["content-type"]="application/json"),this[a0]=e.stringifyJson(e.json));let h=await Bit.default(this[a0],e.headers);nt.default.undefined(r["content-length"])&&nt.default.undefined(r["transfer-encoding"])&&!A&&!nt.default.undefined(h)&&(r["content-length"]=String(h))}}else A?this._lockWrite():this._unlockWrite();this[PC]=Number(r["content-length"])||void 0}async _onResponseBase(e){let{options:r}=this,{url:o}=r;this[Sle]=e,r.decompress&&(e=Eit(e));let a=e.statusCode,n=e;n.statusMessage=n.statusMessage?n.statusMessage:mle.STATUS_CODES[a],n.url=r.url.toString(),n.requestUrl=this.requestUrl,n.redirectUrls=this.redirects,n.request=this,n.isFromCache=e.fromCache||!1,n.ip=this.ip,n.retryCount=this.retryCount,this[vle]=n.isFromCache,this[DC]=Number(e.headers["content-length"])||void 0,this[rx]=e,e.once("end",()=>{this[DC]=this[SC],this.emit("downloadProgress",this.downloadProgress)}),e.once("error",A=>{e.destroy(),this._beforeError(new u1(A,this))}),e.once("aborted",()=>{this._beforeError(new u1({name:"Error",message:"The server aborted pending request",code:"ECONNRESET"},this))}),this.emit("downloadProgress",this.downloadProgress);let u=e.headers["set-cookie"];if(nt.default.object(r.cookieJar)&&u){let A=u.map(async p=>r.cookieJar.setCookie(p,o.toString()));r.ignoreInvalidCookies&&(A=A.map(async p=>p.catch(()=>{})));try{await Promise.all(A)}catch(p){this._beforeError(p);return}}if(r.followRedirect&&e.headers.location&&Nit.has(a)){if(e.resume(),this[zs]&&(this[F4](),delete this[zs],this[Ble]()),(a===303&&r.method!=="GET"&&r.method!=="HEAD"||!r.methodRewriting)&&(r.method="GET","body"in r&&delete r.body,"json"in r&&delete r.json,"form"in r&&delete r.form,this[a0]=void 0,delete r.headers["content-length"]),this.redirects.length>=r.maxRedirects){this._beforeError(new nx(this));return}try{let p=Buffer.from(e.headers.location,"binary").toString(),h=new s0.URL(p,o),E=h.toString();decodeURI(E),h.hostname!==o.hostname||h.port!==o.port?("host"in r.headers&&delete r.headers.host,"cookie"in r.headers&&delete r.headers.cookie,"authorization"in r.headers&&delete r.headers.authorization,(r.username||r.password)&&(r.username="",r.password="")):(h.username=r.username,h.password=r.password),this.redirects.push(E),r.url=h;for(let w of r.hooks.beforeRedirect)await w(r,n);this.emit("redirect",n,r),await this._makeRequest()}catch(p){this._beforeError(p);return}return}if(r.isStream&&r.throwHttpErrors&&!xit.isResponseOk(n)){this._beforeError(new ix(n));return}e.on("readable",()=>{this[tx]&&this._read()}),this.on("resume",()=>{e.resume()}),this.on("pause",()=>{e.pause()}),e.once("end",()=>{this.push(null)}),this.emit("response",e);for(let A of this[ex])if(!A.headersSent){for(let p in e.headers){let h=r.decompress?p!=="content-encoding":!0,E=e.headers[p];h&&A.setHeader(p,E)}A.statusCode=a}}async _onResponse(e){try{await this._onResponseBase(e)}catch(r){this._beforeError(r)}}_onRequest(e){let{options:r}=this,{timeout:o,url:a}=r;yit.default(e),this[F4]=Ele.default(e,o,a);let n=r.cache?"cacheableResponse":"response";e.once(n,p=>{this._onResponse(p)}),e.once("error",p=>{var h;e.destroy(),(h=e.res)===null||h===void 0||h.removeAllListeners("end"),p=p instanceof Ele.TimeoutError?new ax(p,this.timings,this):new Vi(p.message,p,this),this._beforeError(p)}),this[Ble]=vit.default(e,this,Oit),this[zs]=e,this.emit("uploadProgress",this.uploadProgress);let u=this[a0],A=this.redirects.length===0?this:e;nt.default.nodeStream(u)?(u.pipe(A),u.once("error",p=>{this._beforeError(new ox(p,this))})):(this._unlockWrite(),nt.default.undefined(u)?(this._cannotHaveBody||this._noPipe)&&(A.end(),this._lockWrite()):(this._writeRequest(u,void 0,()=>{}),A.end(),this._lockWrite())),this.emit("request",e)}async _createCacheableRequest(e,r){return new Promise((o,a)=>{Object.assign(r,Dit.default(e)),delete r.url;let n,u=R4.get(r.cache)(r,async A=>{A._readableState.autoDestroy=!1,n&&(await n).emit("cacheableResponse",A),o(A)});r.url=e,u.once("error",a),u.once("request",async A=>{n=A,o(n)})})}async _makeRequest(){var e,r,o,a,n;let{options:u}=this,{headers:A}=u;for(let _ in A)if(nt.default.undefined(A[_]))delete A[_];else if(nt.default.null_(A[_]))throw new TypeError(`Use \`undefined\` instead of \`null\` to delete the \`${_}\` header`);if(u.decompress&&nt.default.undefined(A["accept-encoding"])&&(A["accept-encoding"]=kit?"gzip, deflate, br":"gzip, deflate"),u.cookieJar){let _=await u.cookieJar.getCookieString(u.url.toString());nt.default.nonEmptyString(_)&&(u.headers.cookie=_)}for(let _ of u.hooks.beforeRequest){let V=await _(u);if(!nt.default.undefined(V)){u.request=()=>V;break}}u.body&&this[a0]!==u.body&&(this[a0]=u.body);let{agent:p,request:h,timeout:E,url:w}=u;if(u.dnsCache&&!("lookup"in u)&&(u.lookup=u.dnsCache.lookup),w.hostname==="unix"){let _=/(?.+?):(?.+)/.exec(`${w.pathname}${w.search}`);if(_!=null&&_.groups){let{socketPath:V,path:re}=_.groups;Object.assign(u,{socketPath:V,path:re,host:""})}}let v=w.protocol==="https:",b;u.http2?b=Iit.auto:b=v?mit.request:mle.request;let C=(e=u.request)!==null&&e!==void 0?e:b,R=u.cache?this._createCacheableRequest:C;p&&!u.http2&&(u.agent=p[v?"https":"http"]),u[zs]=C,delete u.request,delete u.timeout;let L=u;if(L.shared=(r=u.cacheOptions)===null||r===void 0?void 0:r.shared,L.cacheHeuristic=(o=u.cacheOptions)===null||o===void 0?void 0:o.cacheHeuristic,L.immutableMinTimeToLive=(a=u.cacheOptions)===null||a===void 0?void 0:a.immutableMinTimeToLive,L.ignoreCargoCult=(n=u.cacheOptions)===null||n===void 0?void 0:n.ignoreCargoCult,u.dnsLookupIpVersion!==void 0)try{L.family=wle.dnsLookupIpVersionToFamily(u.dnsLookupIpVersion)}catch{throw new Error("Invalid `dnsLookupIpVersion` option value")}u.https&&("rejectUnauthorized"in u.https&&(L.rejectUnauthorized=u.https.rejectUnauthorized),u.https.checkServerIdentity&&(L.checkServerIdentity=u.https.checkServerIdentity),u.https.certificateAuthority&&(L.ca=u.https.certificateAuthority),u.https.certificate&&(L.cert=u.https.certificate),u.https.key&&(L.key=u.https.key),u.https.passphrase&&(L.passphrase=u.https.passphrase),u.https.pfx&&(L.pfx=u.https.pfx));try{let _=await R(w,L);nt.default.undefined(_)&&(_=b(w,L)),u.request=h,u.timeout=E,u.agent=p,u.https&&("rejectUnauthorized"in u.https&&delete L.rejectUnauthorized,u.https.checkServerIdentity&&delete L.checkServerIdentity,u.https.certificateAuthority&&delete L.ca,u.https.certificate&&delete L.cert,u.https.key&&delete L.key,u.https.passphrase&&delete L.passphrase,u.https.pfx&&delete L.pfx),Rit(_)?this._onRequest(_):this.writable?(this.once("finish",()=>{this._onResponse(_)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(_)}catch(_){throw _ instanceof yle.CacheError?new sx(_,this):new Vi(_.message,_,this)}}async _error(e){try{for(let r of this.options.hooks.beforeError)e=await r(e)}catch(r){e=new Vi(r.message,r,this)}this.destroy(e)}_beforeError(e){if(this[bC])return;let{options:r}=this,o=this.retryCount+1;this[bC]=!0,e instanceof Vi||(e=new Vi(e.message,e,this));let a=e,{response:n}=a;(async()=>{if(n&&!n.body){n.setEncoding(this._readableState.encoding);try{n.rawBody=await Pit.default(n),n.body=n.rawBody.toString()}catch{}}if(this.listenerCount("retry")!==0){let u;try{let A;n&&"retry-after"in n.headers&&(A=Number(n.headers["retry-after"]),Number.isNaN(A)?(A=Date.parse(n.headers["retry-after"])-Date.now(),A<=0&&(A=1)):A*=1e3),u=await r.retry.calculateDelay({attemptCount:o,retryOptions:r.retry,error:a,retryAfter:A,computedValue:Qit.default({attemptCount:o,retryOptions:r.retry,error:a,retryAfter:A,computedValue:0})})}catch(A){this._error(new Vi(A.message,A,this));return}if(u){let A=async()=>{try{for(let p of this.options.hooks.beforeRetry)await p(this.options,a,o)}catch(p){this._error(new Vi(p.message,e,this));return}this.destroyed||(this.destroy(),this.emit("retry",o,e))};this[Ple]=setTimeout(A,u);return}}this._error(a)})()}_read(){this[tx]=!0;let e=this[rx];if(e&&!this[bC]){e.readableLength&&(this[tx]=!1);let r;for(;(r=e.read())!==null;){this[SC]+=r.length,this[Dle]=!0;let o=this.downloadProgress;o.percent<1&&this.emit("downloadProgress",o),this.push(r)}}}_write(e,r,o){let a=()=>{this._writeRequest(e,r,o)};this.requestInitialized?a():this[c1].push(a)}_writeRequest(e,r,o){this[zs].destroyed||(this._progressCallbacks.push(()=>{this[xC]+=Buffer.byteLength(e,r);let a=this.uploadProgress;a.percent<1&&this.emit("uploadProgress",a)}),this[zs].write(e,r,a=>{!a&&this._progressCallbacks.length>0&&this._progressCallbacks.shift()(),o(a)}))}_final(e){let r=()=>{for(;this._progressCallbacks.length!==0;)this._progressCallbacks.shift()();if(!(zs in this)){e();return}if(this[zs].destroyed){e();return}this[zs].end(o=>{o||(this[PC]=this[xC],this.emit("uploadProgress",this.uploadProgress),this[zs].emit("upload-complete")),e(o)})};this.requestInitialized?r():this[c1].push(r)}_destroy(e,r){var o;this[bC]=!0,clearTimeout(this[Ple]),zs in this&&(this[F4](),!((o=this[rx])===null||o===void 0)&&o.complete||this[zs].destroy()),e!==null&&!nt.default.undefined(e)&&!(e instanceof Vi)&&(e=new Vi(e.message,e,this)),r(e)}get _isAboutToError(){return this[bC]}get ip(){var e;return(e=this.socket)===null||e===void 0?void 0:e.remoteAddress}get aborted(){var e,r,o;return((r=(e=this[zs])===null||e===void 0?void 0:e.destroyed)!==null&&r!==void 0?r:this.destroyed)&&!(!((o=this[Sle])===null||o===void 0)&&o.complete)}get socket(){var e,r;return(r=(e=this[zs])===null||e===void 0?void 0:e.socket)!==null&&r!==void 0?r:void 0}get downloadProgress(){let e;return this[DC]?e=this[SC]/this[DC]:this[DC]===this[SC]?e=1:e=0,{percent:e,transferred:this[SC],total:this[DC]}}get uploadProgress(){let e;return this[PC]?e=this[xC]/this[PC]:this[PC]===this[xC]?e=1:e=0,{percent:e,transferred:this[xC],total:this[PC]}}get timings(){var e;return(e=this[zs])===null||e===void 0?void 0:e.timings}get isFromCache(){return this[vle]}pipe(e,r){if(this[Dle])throw new Error("Failed to pipe. The response has been emitted already.");return e instanceof Q4.ServerResponse&&this[ex].add(e),super.pipe(e,r)}unpipe(e){return e instanceof Q4.ServerResponse&&this[ex].delete(e),super.unpipe(e),this}};yn.default=cx});var f1=U(Kc=>{"use strict";var Mit=Kc&&Kc.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),Uit=Kc&&Kc.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&Mit(e,t,r)};Object.defineProperty(Kc,"__esModule",{value:!0});Kc.CancelError=Kc.ParseError=void 0;var xle=A1(),T4=class extends xle.RequestError{constructor(e,r){let{options:o}=r.request;super(`${e.message} in "${o.url.toString()}"`,e,r.request),this.name="ParseError"}};Kc.ParseError=T4;var N4=class extends xle.RequestError{constructor(e){super("Promise was canceled",{},e),this.name="CancelError"}get isCanceled(){return!0}};Kc.CancelError=N4;Uit(A1(),Kc)});var Qle=U(L4=>{"use strict";Object.defineProperty(L4,"__esModule",{value:!0});var ble=f1(),_it=(t,e,r,o)=>{let{rawBody:a}=t;try{if(e==="text")return a.toString(o);if(e==="json")return a.length===0?"":r(a.toString());if(e==="buffer")return a;throw new ble.ParseError({message:`Unknown body type '${e}'`,name:"Error"},t)}catch(n){throw new ble.ParseError(n,t)}};L4.default=_it});var O4=U(l0=>{"use strict";var Hit=l0&&l0.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),qit=l0&&l0.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&Hit(e,t,r)};Object.defineProperty(l0,"__esModule",{value:!0});var jit=Ie("events"),Git=Tf(),Wit=Qoe(),ux=f1(),kle=Qle(),Fle=A1(),Yit=C4(),Kit=S4(),Rle=P4(),Vit=["request","response","redirect","uploadProgress","downloadProgress"];function Tle(t){let e,r,o=new jit.EventEmitter,a=new Wit((u,A,p)=>{let h=E=>{let w=new Fle.default(void 0,t);w.retryCount=E,w._noPipe=!0,p(()=>w.destroy()),p.shouldReject=!1,p(()=>A(new ux.CancelError(w))),e=w,w.once("response",async C=>{var R;if(C.retryCount=E,C.request.aborted)return;let L;try{L=await Kit.default(w),C.rawBody=L}catch{return}if(w._isAboutToError)return;let _=((R=C.headers["content-encoding"])!==null&&R!==void 0?R:"").toLowerCase(),V=["gzip","deflate","br"].includes(_),{options:re}=w;if(V&&!re.decompress)C.body=L;else try{C.body=kle.default(C,re.responseType,re.parseJson,re.encoding)}catch(oe){if(C.body=L.toString(),Rle.isResponseOk(C)){w._beforeError(oe);return}}try{for(let[oe,pe]of re.hooks.afterResponse.entries())C=await pe(C,async he=>{let ve=Fle.default.normalizeArguments(void 0,{...he,retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1},re);ve.hooks.afterResponse=ve.hooks.afterResponse.slice(0,oe);for(let le of ve.hooks.beforeRetry)await le(ve);let ge=Tle(ve);return p(()=>{ge.catch(()=>{}),ge.cancel()}),ge})}catch(oe){w._beforeError(new ux.RequestError(oe.message,oe,w));return}if(!Rle.isResponseOk(C)){w._beforeError(new ux.HTTPError(C));return}r=C,u(w.options.resolveBodyOnly?C.body:C)});let v=C=>{if(a.isCanceled)return;let{options:R}=w;if(C instanceof ux.HTTPError&&!R.throwHttpErrors){let{response:L}=C;u(w.options.resolveBodyOnly?L.body:L);return}A(C)};w.once("error",v);let b=w.options.body;w.once("retry",(C,R)=>{var L,_;if(b===((L=R.request)===null||L===void 0?void 0:L.options.body)&&Git.default.nodeStream((_=R.request)===null||_===void 0?void 0:_.options.body)){v(R);return}h(C)}),Yit.default(w,o,Vit)};h(0)});a.on=(u,A)=>(o.on(u,A),a);let n=u=>{let A=(async()=>{await a;let{options:p}=r.request;return kle.default(r,u,p.parseJson,p.encoding)})();return Object.defineProperties(A,Object.getOwnPropertyDescriptors(a)),A};return a.json=()=>{let{headers:u}=e.options;return!e.writableFinished&&u.accept===void 0&&(u.accept="application/json"),n("json")},a.buffer=()=>n("buffer"),a.text=()=>n("text"),a}l0.default=Tle;qit(f1(),l0)});var Nle=U(M4=>{"use strict";Object.defineProperty(M4,"__esModule",{value:!0});var Jit=f1();function zit(t,...e){let r=(async()=>{if(t instanceof Jit.RequestError)try{for(let a of e)if(a)for(let n of a)t=await n(t)}catch(a){t=a}throw t})(),o=()=>r;return r.json=o,r.text=o,r.buffer=o,r.on=o,r}M4.default=zit});var Mle=U(U4=>{"use strict";Object.defineProperty(U4,"__esModule",{value:!0});var Lle=Tf();function Ole(t){for(let e of Object.values(t))(Lle.default.plainObject(e)||Lle.default.array(e))&&Ole(e);return Object.freeze(t)}U4.default=Ole});var _le=U(Ule=>{"use strict";Object.defineProperty(Ule,"__esModule",{value:!0})});var _4=U(ec=>{"use strict";var Xit=ec&&ec.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),Zit=ec&&ec.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&Xit(e,t,r)};Object.defineProperty(ec,"__esModule",{value:!0});ec.defaultHandler=void 0;var Hle=Tf(),$l=O4(),$it=Nle(),fx=A1(),est=Mle(),tst={RequestError:$l.RequestError,CacheError:$l.CacheError,ReadError:$l.ReadError,HTTPError:$l.HTTPError,MaxRedirectsError:$l.MaxRedirectsError,TimeoutError:$l.TimeoutError,ParseError:$l.ParseError,CancelError:$l.CancelError,UnsupportedProtocolError:$l.UnsupportedProtocolError,UploadError:$l.UploadError},rst=async t=>new Promise(e=>{setTimeout(e,t)}),{normalizeArguments:Ax}=fx.default,qle=(...t)=>{let e;for(let r of t)e=Ax(void 0,r,e);return e},nst=t=>t.isStream?new fx.default(void 0,t):$l.default(t),ist=t=>"defaults"in t&&"options"in t.defaults,sst=["get","post","put","patch","head","delete"];ec.defaultHandler=(t,e)=>e(t);var jle=(t,e)=>{if(t)for(let r of t)r(e)},Gle=t=>{t._rawHandlers=t.handlers,t.handlers=t.handlers.map(o=>(a,n)=>{let u,A=o(a,p=>(u=n(p),u));if(A!==u&&!a.isStream&&u){let p=A,{then:h,catch:E,finally:w}=p;Object.setPrototypeOf(p,Object.getPrototypeOf(u)),Object.defineProperties(p,Object.getOwnPropertyDescriptors(u)),p.then=h,p.catch=E,p.finally=w}return A});let e=(o,a={},n)=>{var u,A;let p=0,h=E=>t.handlers[p++](E,p===t.handlers.length?nst:h);if(Hle.default.plainObject(o)){let E={...o,...a};fx.setNonEnumerableProperties([o,a],E),a=E,o=void 0}try{let E;try{jle(t.options.hooks.init,a),jle((u=a.hooks)===null||u===void 0?void 0:u.init,a)}catch(v){E=v}let w=Ax(o,a,n??t.options);if(w[fx.kIsNormalizedAlready]=!0,E)throw new $l.RequestError(E.message,E,w);return h(w)}catch(E){if(a.isStream)throw E;return $it.default(E,t.options.hooks.beforeError,(A=a.hooks)===null||A===void 0?void 0:A.beforeError)}};e.extend=(...o)=>{let a=[t.options],n=[...t._rawHandlers],u;for(let A of o)ist(A)?(a.push(A.defaults.options),n.push(...A.defaults._rawHandlers),u=A.defaults.mutableDefaults):(a.push(A),"handlers"in A&&n.push(...A.handlers),u=A.mutableDefaults);return n=n.filter(A=>A!==ec.defaultHandler),n.length===0&&n.push(ec.defaultHandler),Gle({options:qle(...a),handlers:n,mutableDefaults:Boolean(u)})};let r=async function*(o,a){let n=Ax(o,a,t.options);n.resolveBodyOnly=!1;let u=n.pagination;if(!Hle.default.object(u))throw new TypeError("`options.pagination` must be implemented");let A=[],{countLimit:p}=u,h=0;for(;h{let n=[];for await(let u of r(o,a))n.push(u);return n},e.paginate.each=r,e.stream=(o,a)=>e(o,{...a,isStream:!0});for(let o of sst)e[o]=(a,n)=>e(a,{...n,method:o}),e.stream[o]=(a,n)=>e(a,{...n,method:o,isStream:!0});return Object.assign(e,tst),Object.defineProperty(e,"defaults",{value:t.mutableDefaults?t:est.default(t),writable:t.mutableDefaults,configurable:t.mutableDefaults,enumerable:!0}),e.mergeOptions=qle,e};ec.default=Gle;Zit(_le(),ec)});var Kle=U((Nf,px)=>{"use strict";var ost=Nf&&Nf.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),Wle=Nf&&Nf.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&ost(e,t,r)};Object.defineProperty(Nf,"__esModule",{value:!0});var ast=Ie("url"),Yle=_4(),lst={options:{method:"GET",retry:{limit:2,methods:["GET","PUT","HEAD","DELETE","OPTIONS","TRACE"],statusCodes:[408,413,429,500,502,503,504,521,522,524],errorCodes:["ETIMEDOUT","ECONNRESET","EADDRINUSE","ECONNREFUSED","EPIPE","ENOTFOUND","ENETUNREACH","EAI_AGAIN"],maxRetryAfter:void 0,calculateDelay:({computedValue:t})=>t},timeout:{},headers:{"user-agent":"got (https://github.com/sindresorhus/got)"},hooks:{init:[],beforeRequest:[],beforeRedirect:[],beforeRetry:[],beforeError:[],afterResponse:[]},cache:void 0,dnsCache:void 0,decompress:!0,throwHttpErrors:!0,followRedirect:!0,isStream:!1,responseType:"text",resolveBodyOnly:!1,maxRedirects:10,prefixUrl:"",methodRewriting:!0,ignoreInvalidCookies:!1,context:{},http2:!1,allowGetBody:!1,https:void 0,pagination:{transform:t=>t.request.options.responseType==="json"?t.body:JSON.parse(t.body),paginate:t=>{if(!Reflect.has(t.headers,"link"))return!1;let e=t.headers.link.split(","),r;for(let o of e){let a=o.split(";");if(a[1].includes("next")){r=a[0].trimStart().trim(),r=r.slice(1,-1);break}}return r?{url:new ast.URL(r)}:!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:1/0,backoff:0,requestLimit:1e4,stackAllItems:!0},parseJson:t=>JSON.parse(t),stringifyJson:t=>JSON.stringify(t),cacheOptions:{}},handlers:[Yle.defaultHandler],mutableDefaults:!1},H4=Yle.default(lst);Nf.default=H4;px.exports=H4;px.exports.default=H4;px.exports.__esModule=!0;Wle(_4(),Nf);Wle(O4(),Nf)});var ln={};Yt(ln,{Method:()=>ece,del:()=>pst,get:()=>W4,getNetworkSettings:()=>$le,post:()=>Y4,put:()=>fst,request:()=>p1});function zle(t){let e=new hx.URL(t),r={host:e.hostname,headers:{}};return e.port&&(r.port=Number(e.port)),e.username&&e.password&&(r.proxyAuth=`${e.username}:${e.password}`),{proxy:r}}async function q4(t){return Df(Jle,t,()=>ae.readFilePromise(t).then(e=>(Jle.set(t,e),e)))}function Ast({statusCode:t,statusMessage:e},r){let o=Kt(r,t,Bt.NUMBER),a=`https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/${t}`;return Xy(r,`${o}${e?` (${e})`:""}`,a)}async function gx(t,{configuration:e,customErrorMessage:r}){var o;try{return await t}catch(a){if(a.name!=="HTTPError")throw a;let n=(r==null?void 0:r(a,e))??((o=a.response.body)==null?void 0:o.error);n==null&&(a.message.startsWith("Response code")?n="The remote server failed to provide the requested resource":n=a.message),a.code==="ETIMEDOUT"&&a.event==="socket"&&(n+=`(can be increased via ${Kt(e,"httpTimeout",Bt.SETTING)})`);let u=new Vt(35,n,A=>{a.response&&A.reportError(35,` ${$u(e,{label:"Response Code",value:Gc(Bt.NO_HINT,Ast(a.response,e))})}`),a.request&&(A.reportError(35,` ${$u(e,{label:"Request Method",value:Gc(Bt.NO_HINT,a.request.options.method)})}`),A.reportError(35,` ${$u(e,{label:"Request URL",value:Gc(Bt.URL,a.request.requestUrl)})}`)),a.request.redirects.length>0&&A.reportError(35,` ${$u(e,{label:"Request Redirects",value:Gc(Bt.NO_HINT,wL(e,a.request.redirects,Bt.URL))})}`),a.request.retryCount===a.request.options.retry.limit&&A.reportError(35,` ${$u(e,{label:"Request Retry Count",value:Gc(Bt.NO_HINT,`${Kt(e,a.request.retryCount,Bt.NUMBER)} (can be increased via ${Kt(e,"httpRetry",Bt.SETTING)})`)})}`)});throw u.originalError=a,u}}function $le(t,e){let r=[...e.configuration.get("networkSettings")].sort(([u],[A])=>A.length-u.length),o={enableNetwork:void 0,httpsCaFilePath:void 0,httpProxy:void 0,httpsProxy:void 0,httpsKeyFilePath:void 0,httpsCertFilePath:void 0},a=Object.keys(o),n=typeof t=="string"?new hx.URL(t):t;for(let[u,A]of r)if(G4.default.isMatch(n.hostname,u))for(let p of a){let h=A.get(p);h!==null&&typeof o[p]>"u"&&(o[p]=h)}for(let u of a)typeof o[u]>"u"&&(o[u]=e.configuration.get(u));return o}async function p1(t,e,{configuration:r,headers:o,jsonRequest:a,jsonResponse:n,method:u="GET"}){let A=async()=>await hst(t,e,{configuration:r,headers:o,jsonRequest:a,jsonResponse:n,method:u});return await(await r.reduceHook(h=>h.wrapNetworkRequest,A,{target:t,body:e,configuration:r,headers:o,jsonRequest:a,jsonResponse:n,method:u}))()}async function W4(t,{configuration:e,jsonResponse:r,customErrorMessage:o,...a}){let n=Df(Vle,t,()=>gx(p1(t,null,{configuration:e,...a}),{configuration:e,customErrorMessage:o}).then(u=>(Vle.set(t,u.body),u.body)));return Buffer.isBuffer(n)===!1&&(n=await n),r?JSON.parse(n.toString()):n}async function fst(t,e,{customErrorMessage:r,...o}){return(await gx(p1(t,e,{...o,method:"PUT"}),{customErrorMessage:r,configuration:o.configuration})).body}async function Y4(t,e,{customErrorMessage:r,...o}){return(await gx(p1(t,e,{...o,method:"POST"}),{customErrorMessage:r,configuration:o.configuration})).body}async function pst(t,{customErrorMessage:e,...r}){return(await gx(p1(t,null,{...r,method:"DELETE"}),{customErrorMessage:e,configuration:r.configuration})).body}async function hst(t,e,{configuration:r,headers:o,jsonRequest:a,jsonResponse:n,method:u="GET"}){let A=typeof t=="string"?new hx.URL(t):t,p=$le(A,{configuration:r});if(p.enableNetwork===!1)throw new Vt(80,`Request to '${A.href}' has been blocked because of your configuration settings`);if(A.protocol==="http:"&&!G4.default.isMatch(A.hostname,r.get("unsafeHttpWhitelist")))throw new Vt(81,`Unsafe http requests must be explicitly whitelisted in your configuration (${A.hostname})`);let E={agent:{http:p.httpProxy?j4.default.httpOverHttp(zle(p.httpProxy)):cst,https:p.httpsProxy?j4.default.httpsOverHttp(zle(p.httpsProxy)):ust},headers:o,method:u};E.responseType=n?"json":"buffer",e!==null&&(Buffer.isBuffer(e)||!a&&typeof e=="string"?E.body=e:E.json=e);let w=r.get("httpTimeout"),v=r.get("httpRetry"),b=r.get("enableStrictSsl"),C=p.httpsCaFilePath,R=p.httpsCertFilePath,L=p.httpsKeyFilePath,{default:_}=await Promise.resolve().then(()=>tt(Kle())),V=C?await q4(C):void 0,re=R?await q4(R):void 0,oe=L?await q4(L):void 0,pe=_.extend({timeout:{socket:w},retry:v,https:{rejectUnauthorized:b,certificateAuthority:V,certificate:re,key:oe},...E});return r.getLimit("networkConcurrency")(()=>pe(A))}var Xle,Zle,G4,j4,hx,Vle,Jle,cst,ust,ece,dx=dt(()=>{bt();Xle=Ie("https"),Zle=Ie("http"),G4=tt(Jo()),j4=tt(Doe()),hx=Ie("url");Xl();Jl();Kl();Vle=new Map,Jle=new Map,cst=new Zle.Agent({keepAlive:!0}),ust=new Xle.Agent({keepAlive:!0});ece=(a=>(a.GET="GET",a.PUT="PUT",a.POST="POST",a.DELETE="DELETE",a))(ece||{})});var As={};Yt(As,{availableParallelism:()=>J4,builtinModules:()=>K4,getArchitecture:()=>h1,getArchitectureName:()=>mst,getArchitectureSet:()=>V4,getCaller:()=>Ist,openUrl:()=>gst});function K4(){return new Set(ice.default.builtinModules||Object.keys(process.binding("natives")))}function dst(){var o;if(process.platform==="win32")return null;let e=(((o=process.report)==null?void 0:o.getReport())??{}).sharedObjects??[],r=/\/(?:(ld-linux-|[^/]+-linux-gnu\/)|(libc.musl-|ld-musl-))/;return Ow(e,a=>{let n=a.match(r);if(!n)return Ow.skip;if(n[1])return"glibc";if(n[2])return"musl";throw new Error("Assertion failed: Expected the libc variant to have been detected")})??null}function h1(){return rce=rce??{os:process.platform,cpu:process.arch,libc:dst()}}function mst(t=h1()){return t.libc?`${t.os}-${t.cpu}-${t.libc}`:`${t.os}-${t.cpu}`}function V4(){let t=h1();return nce=nce??{os:[t.os],cpu:[t.cpu],libc:t.libc?[t.libc]:[]}}function Est(t){let e=yst.exec(t);if(!e)return null;let r=e[2]&&e[2].indexOf("native")===0,o=e[2]&&e[2].indexOf("eval")===0,a=Cst.exec(e[2]);return o&&a!=null&&(e[2]=a[1],e[3]=a[2],e[4]=a[3]),{file:r?null:e[2],methodName:e[1]||"",arguments:r?[e[2]]:[],line:e[3]?+e[3]:null,column:e[4]?+e[4]:null}}function Ist(){let e=new Error().stack.split(` +`)[3];return Est(e)}function J4(){return"availableParallelism"in mx.default?mx.default.availableParallelism():Math.max(1,mx.default.cpus().length)}var ice,mx,tce,gst,rce,nce,yst,Cst,g1=dt(()=>{bt();ice=tt(Ie("module")),mx=tt(Ie("os"));yx();Kl();tce=new Map([["darwin","open"],["linux","xdg-open"],["win32","explorer.exe"]]).get(process.platform),gst=typeof tce<"u"?async t=>{try{return await z4(tce,[t],{cwd:z.cwd()}),!0}catch{return!1}}:void 0;yst=/^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack||\/|[a-z]:\\|\\\\).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,Cst=/\((\S*)(?::(\d+))(?::(\d+))\)/});function tU(t,e,r,o,a){let n=r1(r);if(o.isArray||o.type==="ANY"&&Array.isArray(n))return Array.isArray(n)?n.map((u,A)=>X4(t,`${e}[${A}]`,u,o,a)):String(n).split(/,/).map(u=>X4(t,e,u,o,a));if(Array.isArray(n))throw new Error(`Non-array configuration settings "${e}" cannot be an array`);return X4(t,e,r,o,a)}function X4(t,e,r,o,a){var p;let n=r1(r);switch(o.type){case"ANY":return MP(n);case"SHAPE":return Dst(t,e,r,o,a);case"MAP":return Sst(t,e,r,o,a)}if(n===null&&!o.isNullable&&o.default!==null)throw new Error(`Non-nullable configuration settings "${e}" cannot be set to null`);if((p=o.values)!=null&&p.includes(n))return n;let A=(()=>{if(o.type==="BOOLEAN"&&typeof n!="string")return Mw(n);if(typeof n!="string")throw new Error(`Expected value (${n}) to be a string`);let h=hL(n,{env:process.env});switch(o.type){case"ABSOLUTE_PATH":{let E=a,w=SM(r);return w&&(E=z.resolve(w,"..")),z.resolve(E,ue.toPortablePath(h))}case"LOCATOR_LOOSE":return kf(h,!1);case"NUMBER":return parseInt(h);case"LOCATOR":return kf(h);case"BOOLEAN":return Mw(h);default:return h}})();if(o.values&&!o.values.includes(A))throw new Error(`Invalid value, expected one of ${o.values.join(", ")}`);return A}function Dst(t,e,r,o,a){let n=r1(r);if(typeof n!="object"||Array.isArray(n))throw new ot(`Object configuration settings "${e}" must be an object`);let u=rU(t,o,{ignoreArrays:!0});if(n===null)return u;for(let[A,p]of Object.entries(n)){let h=`${e}.${A}`;if(!o.properties[A])throw new ot(`Unrecognized configuration settings found: ${e}.${A} - run "yarn config -v" to see the list of settings supported in Yarn`);u.set(A,tU(t,h,p,o.properties[A],a))}return u}function Sst(t,e,r,o,a){let n=r1(r),u=new Map;if(typeof n!="object"||Array.isArray(n))throw new ot(`Map configuration settings "${e}" must be an object`);if(n===null)return u;for(let[A,p]of Object.entries(n)){let h=o.normalizeKeys?o.normalizeKeys(A):A,E=`${e}['${h}']`,w=o.valueDefinition;u.set(h,tU(t,E,p,w,a))}return u}function rU(t,e,{ignoreArrays:r=!1}={}){switch(e.type){case"SHAPE":{if(e.isArray&&!r)return[];let o=new Map;for(let[a,n]of Object.entries(e.properties))o.set(a,rU(t,n));return o}break;case"MAP":return e.isArray&&!r?[]:new Map;case"ABSOLUTE_PATH":return e.default===null?null:t.projectCwd===null?z.isAbsolute(e.default)?z.normalize(e.default):e.isNullable?null:void 0:Array.isArray(e.default)?e.default.map(o=>z.resolve(t.projectCwd,o)):z.resolve(t.projectCwd,e.default);default:return e.default}}function Ex(t,e,r){if(e.type==="SECRET"&&typeof t=="string"&&r.hideSecrets)return vst;if(e.type==="ABSOLUTE_PATH"&&typeof t=="string"&&r.getNativePaths)return ue.fromPortablePath(t);if(e.isArray&&Array.isArray(t)){let o=[];for(let a of t)o.push(Ex(a,e,r));return o}if(e.type==="MAP"&&t instanceof Map){let o=new Map;for(let[a,n]of t.entries())o.set(a,Ex(n,e.valueDefinition,r));return o}if(e.type==="SHAPE"&&t instanceof Map){let o=new Map;for(let[a,n]of t.entries()){let u=e.properties[a];o.set(a,Ex(n,u,r))}return o}return t}function Pst(){let t={};for(let[e,r]of Object.entries(process.env))e=e.toLowerCase(),e.startsWith(wx)&&(e=(0,oce.default)(e.slice(wx.length)),t[e]=r);return t}function Ix(){let t=`${wx}rc_filename`;for(let[e,r]of Object.entries(process.env))if(e.toLowerCase()===t&&typeof r=="string")return r;return $4}var oce,c0,ace,Z4,sce,wst,Bst,QC,wx,$4,eU,vst,d1,lce,Bx,Cx,nU,Vc,Xe,m1=dt(()=>{bt();_c();_l();oce=tt(uV()),c0=tt(Xg());_t();ace=tt(rd()),Z4=Ie("stream");qse();uC();yM();CM();EM();hoe();IM();Dd();Coe();_P();Jl();t0();dx();Kl();g1();n0();Ks();wst=c0.GITHUB_ACTIONS&&process.env.GITHUB_EVENT_PATH?!(((sce=ae.readJsonSync(ue.toPortablePath(process.env.GITHUB_EVENT_PATH)).repository)==null?void 0:sce.private)??!0):!1,Bst=new Set(["isTestEnv","injectNpmUser","injectNpmPassword","injectNpm2FaToken","binFolder","version","flags","profile","gpg","ignoreNode","wrapOutput","home","confDir","registry"]),QC=/^(?!v)[a-z0-9._-]+$/i,wx="yarn_",$4=".yarnrc.yml",eU="yarn.lock",vst="********",d1=(E=>(E.ANY="ANY",E.BOOLEAN="BOOLEAN",E.ABSOLUTE_PATH="ABSOLUTE_PATH",E.LOCATOR="LOCATOR",E.LOCATOR_LOOSE="LOCATOR_LOOSE",E.NUMBER="NUMBER",E.STRING="STRING",E.SECRET="SECRET",E.SHAPE="SHAPE",E.MAP="MAP",E))(d1||{}),lce=Bt,Bx=(r=>(r.JUNCTIONS="junctions",r.SYMLINKS="symlinks",r))(Bx||{}),Cx={lastUpdateCheck:{description:"Last timestamp we checked whether new Yarn versions were available",type:"STRING",default:null},yarnPath:{description:"Path to the local executable that must be used over the global one",type:"ABSOLUTE_PATH",default:null},ignorePath:{description:"If true, the local executable will be ignored when using the global one",type:"BOOLEAN",default:!1},ignoreCwd:{description:"If true, the `--cwd` flag will be ignored",type:"BOOLEAN",default:!1},cacheKeyOverride:{description:"A global cache key override; used only for test purposes",type:"STRING",default:null},globalFolder:{description:"Folder where all system-global files are stored",type:"ABSOLUTE_PATH",default:xM()},cacheFolder:{description:"Folder where the cache files must be written",type:"ABSOLUTE_PATH",default:"./.yarn/cache"},compressionLevel:{description:"Zip files compression level, from 0 to 9 or mixed (a variant of 9, which stores some files uncompressed, when compression doesn't yield good results)",type:"NUMBER",values:["mixed",0,1,2,3,4,5,6,7,8,9],default:Ay},virtualFolder:{description:"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named __virtual__)",type:"ABSOLUTE_PATH",default:"./.yarn/__virtual__"},lockfileFilename:{description:"Name of the files where the Yarn dependency tree entries must be stored",type:"STRING",default:eU},installStatePath:{description:"Path of the file where the install state will be persisted",type:"ABSOLUTE_PATH",default:"./.yarn/install-state.gz"},immutablePatterns:{description:"Array of glob patterns; files matching them won't be allowed to change during immutable installs",type:"STRING",default:[],isArray:!0},rcFilename:{description:"Name of the files where the configuration can be found",type:"STRING",default:Ix()},enableGlobalCache:{description:"If true, the system-wide cache folder will be used regardless of `cache-folder`",type:"BOOLEAN",default:!0},enableColors:{description:"If true, the CLI is allowed to use colors in its output",type:"BOOLEAN",default:JS,defaultText:""},enableHyperlinks:{description:"If true, the CLI is allowed to use hyperlinks in its output",type:"BOOLEAN",default:IL,defaultText:""},enableInlineBuilds:{description:"If true, the CLI will print the build output on the command line",type:"BOOLEAN",default:c0.isCI,defaultText:""},enableMessageNames:{description:"If true, the CLI will prefix most messages with codes suitable for search engines",type:"BOOLEAN",default:!0},enableProgressBars:{description:"If true, the CLI is allowed to show a progress bar for long-running events",type:"BOOLEAN",default:!c0.isCI,defaultText:""},enableTimers:{description:"If true, the CLI is allowed to print the time spent executing commands",type:"BOOLEAN",default:!0},preferAggregateCacheInfo:{description:"If true, the CLI will only print a one-line report of any cache changes",type:"BOOLEAN",default:c0.isCI},preferInteractive:{description:"If true, the CLI will automatically use the interactive mode when called from a TTY",type:"BOOLEAN",default:!1},preferTruncatedLines:{description:"If true, the CLI will truncate lines that would go beyond the size of the terminal",type:"BOOLEAN",default:!1},progressBarStyle:{description:"Which style of progress bar should be used (only when progress bars are enabled)",type:"STRING",default:void 0,defaultText:""},defaultLanguageName:{description:"Default language mode that should be used when a package doesn't offer any insight",type:"STRING",default:"node"},defaultProtocol:{description:"Default resolution protocol used when resolving pure semver and tag ranges",type:"STRING",default:"npm:"},enableTransparentWorkspaces:{description:"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol",type:"BOOLEAN",default:!0},supportedArchitectures:{description:"Architectures that Yarn will fetch and inject into the resolver",type:"SHAPE",properties:{os:{description:"Array of supported process.platform strings, or null to target them all",type:"STRING",isArray:!0,isNullable:!0,default:["current"]},cpu:{description:"Array of supported process.arch strings, or null to target them all",type:"STRING",isArray:!0,isNullable:!0,default:["current"]},libc:{description:"Array of supported libc libraries, or null to target them all",type:"STRING",isArray:!0,isNullable:!0,default:["current"]}}},enableMirror:{description:"If true, the downloaded packages will be retrieved and stored in both the local and global folders",type:"BOOLEAN",default:!0},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:"BOOLEAN",default:!0},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:"STRING",default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:"STRING",default:null},unsafeHttpWhitelist:{description:"List of the hostnames for which http queries are allowed (glob patterns are supported)",type:"STRING",default:[],isArray:!0},httpTimeout:{description:"Timeout of each http request in milliseconds",type:"NUMBER",default:6e4},httpRetry:{description:"Retry times on http failure",type:"NUMBER",default:3},networkConcurrency:{description:"Maximal number of concurrent requests",type:"NUMBER",default:50},networkSettings:{description:"Network settings per hostname (glob patterns are supported)",type:"MAP",valueDefinition:{description:"",type:"SHAPE",properties:{httpsCaFilePath:{description:"Path to file containing one or multiple Certificate Authority signing certificates",type:"ABSOLUTE_PATH",default:null},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:"BOOLEAN",default:null},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:"STRING",default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:"STRING",default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:"ABSOLUTE_PATH",default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:"ABSOLUTE_PATH",default:null}}}},httpsCaFilePath:{description:"A path to a file containing one or multiple Certificate Authority signing certificates",type:"ABSOLUTE_PATH",default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:"ABSOLUTE_PATH",default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:"ABSOLUTE_PATH",default:null},enableStrictSsl:{description:"If false, SSL certificate errors will be ignored",type:"BOOLEAN",default:!0},logFilters:{description:"Overrides for log levels",type:"SHAPE",isArray:!0,concatenateValues:!0,properties:{code:{description:"Code of the messages covered by this override",type:"STRING",default:void 0},text:{description:"Code of the texts covered by this override",type:"STRING",default:void 0},pattern:{description:"Code of the patterns covered by this override",type:"STRING",default:void 0},level:{description:"Log level override, set to null to remove override",type:"STRING",values:Object.values(XS),isNullable:!0,default:void 0}}},enableTelemetry:{description:"If true, telemetry will be periodically sent, following the rules in https://yarnpkg.com/advanced/telemetry",type:"BOOLEAN",default:!0},telemetryInterval:{description:"Minimal amount of time between two telemetry uploads, in days",type:"NUMBER",default:7},telemetryUserId:{description:"If you desire to tell us which project you are, you can set this field. Completely optional and opt-in.",type:"STRING",default:null},enableHardenedMode:{description:"If true, automatically enable --check-resolutions --refresh-lockfile on installs",type:"BOOLEAN",default:c0.isPR&&wst,defaultText:""},enableScripts:{description:"If true, packages are allowed to have install scripts by default",type:"BOOLEAN",default:!0},enableStrictSettings:{description:"If true, unknown settings will cause Yarn to abort",type:"BOOLEAN",default:!0},enableImmutableCache:{description:"If true, the cache is reputed immutable and actions that would modify it will throw",type:"BOOLEAN",default:!1},checksumBehavior:{description:"Enumeration defining what to do when a checksum doesn't match expectations",type:"STRING",default:"throw"},packageExtensions:{description:"Map of package corrections to apply on the dependency tree",type:"MAP",valueDefinition:{description:"The extension that will be applied to any package whose version matches the specified range",type:"SHAPE",properties:{dependencies:{description:"The set of dependencies that must be made available to the current package in order for it to work properly",type:"MAP",valueDefinition:{description:"A range",type:"STRING"}},peerDependencies:{description:"Inherited dependencies - the consumer of the package will be tasked to provide them",type:"MAP",valueDefinition:{description:"A semver range",type:"STRING"}},peerDependenciesMeta:{description:"Extra information related to the dependencies listed in the peerDependencies field",type:"MAP",valueDefinition:{description:"The peerDependency meta",type:"SHAPE",properties:{optional:{description:"If true, the selected peer dependency will be marked as optional by the package manager and the consumer omitting it won't be reported as an error",type:"BOOLEAN",default:!1}}}}}}}};nU=(o=>(o[o.LOCKFILE=0]="LOCKFILE",o[o.MANIFEST=1]="MANIFEST",o[o.NONE=2]="NONE",o))(nU||{}),Vc=class{constructor(e){this.projectCwd=null;this.plugins=new Map;this.settings=new Map;this.values=new Map;this.sources=new Map;this.invalid=new Map;this.packageExtensions=new Map;this.limits=new Map;this.startingCwd=e}static create(e,r,o){let a=new Vc(e);typeof r<"u"&&!(r instanceof Map)&&(a.projectCwd=r),a.importSettings(Cx);let n=typeof o<"u"?o:r instanceof Map?r:new Map;for(let[u,A]of n)a.activatePlugin(u,A);return a}static async find(e,r,{lookup:o=0,strict:a=!0,usePath:n=!1,useRc:u=!0}={}){let A=Pst();delete A.rcFilename;let p=await Vc.findRcFiles(e),h=await Vc.findHomeRcFile();h&&(p.find(ve=>ve.path===h.path)||p.unshift(h));let E=yoe(p.map(he=>[he.path,he.data])),w=".",v=new Set(Object.keys(Cx)),b=({ignoreCwd:he,yarnPath:ve,ignorePath:ge,lockfileFilename:le})=>({ignoreCwd:he,yarnPath:ve,ignorePath:ge,lockfileFilename:le}),C=({ignoreCwd:he,yarnPath:ve,ignorePath:ge,lockfileFilename:le,...Pe})=>{let g={};for(let[De,Ce]of Object.entries(Pe))v.has(De)&&(g[De]=Ce);return g},R=({ignoreCwd:he,yarnPath:ve,ignorePath:ge,lockfileFilename:le,...Pe})=>{let g={};for(let[De,Ce]of Object.entries(Pe))v.has(De)||(g[De]=Ce);return g},L=new Vc(e);if(L.importSettings(b(Cx)),L.useWithSource("",b(A),e,{strict:!1}),E){let[he,ve]=E;L.useWithSource(he,b(ve),w,{strict:!1})}if(n){let he=L.get("yarnPath"),ve=L.get("ignorePath");if(he!==null&&!ve)return L}let _=L.get("lockfileFilename"),V;switch(o){case 0:V=await Vc.findProjectCwd(e,_);break;case 1:V=await Vc.findProjectCwd(e,null);break;case 2:ae.existsSync(z.join(e,"package.json"))?V=z.resolve(e):V=null;break}if(L.startingCwd=e,L.projectCwd=V,L.importSettings(C(Cx)),L.useWithSource("",C(A),e,{strict:a}),E){let[he,ve]=E;L.useWithSource(he,C(ve),w,{strict:a})}let re=he=>"default"in he?he.default:he,oe=new Map([["@@core",Hse]]);if(r!==null)for(let he of r.plugins.keys())oe.set(he,re(r.modules.get(he)));for(let[he,ve]of oe)L.activatePlugin(he,ve);let pe=new Map([]);if(r!==null){let he=new Map;for(let le of K4())he.set(le,()=>Vp(le));for(let[le,Pe]of r.modules)he.set(le,()=>Pe);let ve=new Set,ge=async(le,Pe)=>{let{factory:g,name:De}=Vp(le);if(!g||ve.has(De))return;let Ce=new Map(he),de=Z=>{if(Ce.has(Z))return Ce.get(Z)();throw new ot(`This plugin cannot access the package referenced via ${Z} which is neither a builtin, nor an exposed entry`)},ne=await Vy(async()=>re(await g(de)),Z=>`${Z} (when initializing ${De}, defined in ${Pe})`);he.set(De,()=>ne),ve.add(De),pe.set(De,ne)};if(A.plugins)for(let le of A.plugins.split(";")){let Pe=z.resolve(e,ue.toPortablePath(le));await ge(Pe,"")}for(let{path:le,cwd:Pe,data:g}of p)if(!!u&&!!Array.isArray(g.plugins))for(let De of g.plugins){let Ce=typeof De!="string"?De.path:De,de=(De==null?void 0:De.spec)??"",ne=(De==null?void 0:De.checksum)??"",Z=z.resolve(Pe,ue.toPortablePath(Ce));if(!await ae.existsPromise(Z)){if(!de){let ut=Kt(L,z.basename(Z,".cjs"),Bt.NAME),H=Kt(L,".gitignore",Bt.NAME),yt=Kt(L,L.values.get("rcFilename"),Bt.NAME),Me=Kt(L,"https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored",Bt.URL);throw new ot(`Missing source for the ${ut} plugin - please try to remove the plugin from ${yt} then reinstall it manually. This error usually occurs because ${H} is incorrect, check ${Me} to make sure your plugin folder isn't gitignored.`)}if(!de.match(/^https?:/)){let ut=Kt(L,z.basename(Z,".cjs"),Bt.NAME),H=Kt(L,L.values.get("rcFilename"),Bt.NAME);throw new ot(`Failed to recognize the source for the ${ut} plugin - please try to delete the plugin from ${H} then reinstall it manually.`)}let me=await W4(de,{configuration:L}),be=Vs(me);if(ne&&ne!==be){let ut=Kt(L,z.basename(Z,".cjs"),Bt.NAME),H=Kt(L,L.values.get("rcFilename"),Bt.NAME),yt=Kt(L,`yarn plugin import ${de}`,Bt.CODE);throw new ot(`Failed to fetch the ${ut} plugin from its remote location: its checksum seems to have changed. If this is expected, please remove the plugin from ${H} then run ${yt} to reimport it.`)}await ae.mkdirPromise(z.dirname(Z),{recursive:!0}),await ae.writeFilePromise(Z,me)}await ge(Z,le)}}for(let[he,ve]of pe)L.activatePlugin(he,ve);if(L.useWithSource("",R(A),e,{strict:a}),E){let[he,ve]=E;L.useWithSource(he,R(ve),w,{strict:a})}return L.get("enableGlobalCache")&&(L.values.set("cacheFolder",`${L.get("globalFolder")}/cache`),L.sources.set("cacheFolder","")),await L.refreshPackageExtensions(),L}static async findRcFiles(e){let r=Ix(),o=[],a=e,n=null;for(;a!==n;){n=a;let u=z.join(n,r);if(ae.existsSync(u)){let A=await ae.readFilePromise(u,"utf8"),p;try{p=Yi(A)}catch{let E="";throw A.match(/^\s+(?!-)[^:]+\s+\S+/m)&&(E=" (in particular, make sure you list the colons after each key name)"),new ot(`Parse error when loading ${u}; please check it's proper Yaml${E}`)}o.unshift({path:u,cwd:n,data:p})}a=z.dirname(n)}return o}static async findHomeRcFile(){let e=Ix(),r=mC(),o=z.join(r,e);if(ae.existsSync(o)){let a=await ae.readFilePromise(o,"utf8"),n=Yi(a);return{path:o,cwd:r,data:n}}return null}static async findProjectCwd(e,r){let o=null,a=e,n=null;for(;a!==n;){if(n=a,ae.existsSync(z.join(n,"package.json"))&&(o=n),r!==null){if(ae.existsSync(z.join(n,r))){o=n;break}}else if(o!==null)break;a=z.dirname(n)}return o}static async updateConfiguration(e,r){let o=Ix(),a=z.join(e,o),n=ae.existsSync(a)?Yi(await ae.readFilePromise(a,"utf8")):{},u=!1,A;if(typeof r=="function"){try{A=r(n)}catch{A=r({})}if(A===n)return}else{A=n;for(let p of Object.keys(r)){let h=n[p],E=r[p],w;if(typeof E=="function")try{w=E(h)}catch{w=E(void 0)}else w=E;h!==w&&(w===Vc.deleteProperty?delete A[p]:A[p]=w,u=!0)}if(!u)return}await ae.changeFilePromise(a,wa(A),{automaticNewlines:!0})}static async addPlugin(e,r){r.length!==0&&await Vc.updateConfiguration(e,o=>{let a=o.plugins??[];if(a.length===0)return{...o,plugins:r};let n=[],u=[...r];for(let A of a){let p=typeof A!="string"?A.path:A,h=u.find(E=>E.path===p);h?(n.push(h),u=u.filter(E=>E!==h)):n.push(A)}return n.push(...u),{...o,plugins:n}})}static async updateHomeConfiguration(e){let r=mC();return await Vc.updateConfiguration(r,e)}activatePlugin(e,r){this.plugins.set(e,r),typeof r.configuration<"u"&&this.importSettings(r.configuration)}importSettings(e){for(let[r,o]of Object.entries(e))if(o!=null){if(this.settings.has(r))throw new Error(`Cannot redefine settings "${r}"`);this.settings.set(r,o),this.values.set(r,rU(this,o))}}useWithSource(e,r,o,a){try{this.use(e,r,o,a)}catch(n){throw n.message+=` (in ${Kt(this,e,Bt.PATH)})`,n}}use(e,r,o,{strict:a=!0,overwrite:n=!1}={}){a=a&&this.get("enableStrictSettings");for(let u of["enableStrictSettings",...Object.keys(r)]){let A=r[u],p=SM(A);if(p&&(e=p),typeof A>"u"||u==="plugins"||e===""&&Bst.has(u))continue;if(u==="rcFilename")throw new ot(`The rcFilename settings can only be set via ${`${wx}RC_FILENAME`.toUpperCase()}, not via a rc file`);let h=this.settings.get(u);if(!h){let w=mC(),v=z.resolve(e,"..");if(a&&!(w===v))throw new ot(`Unrecognized or legacy configuration settings found: ${u} - run "yarn config -v" to see the list of settings supported in Yarn`);this.invalid.set(u,e);continue}if(this.sources.has(u)&&!(n||h.type==="MAP"||h.isArray&&h.concatenateValues))continue;let E;try{E=tU(this,u,A,h,o)}catch(w){throw w.message+=` in ${Kt(this,e,Bt.PATH)}`,w}if(u==="enableStrictSettings"&&e!==""){a=E;continue}if(h.type==="MAP"){let w=this.values.get(u);this.values.set(u,new Map(n?[...w,...E]:[...E,...w])),this.sources.set(u,`${this.sources.get(u)}, ${e}`)}else if(h.isArray&&h.concatenateValues){let w=this.values.get(u);this.values.set(u,n?[...w,...E]:[...E,...w]),this.sources.set(u,`${this.sources.get(u)}, ${e}`)}else this.values.set(u,E),this.sources.set(u,e)}}get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key "${e}"`);return this.values.get(e)}getSpecial(e,{hideSecrets:r=!1,getNativePaths:o=!1}){let a=this.get(e),n=this.settings.get(e);if(typeof n>"u")throw new ot(`Couldn't find a configuration settings named "${e}"`);return Ex(a,n,{hideSecrets:r,getNativePaths:o})}getSubprocessStreams(e,{header:r,prefix:o,report:a}){let n,u,A=ae.createWriteStream(e);if(this.get("enableInlineBuilds")){let p=a.createStreamReporter(`${o} ${Kt(this,"STDOUT","green")}`),h=a.createStreamReporter(`${o} ${Kt(this,"STDERR","red")}`);n=new Z4.PassThrough,n.pipe(p),n.pipe(A),u=new Z4.PassThrough,u.pipe(h),u.pipe(A)}else n=A,u=A,typeof r<"u"&&n.write(`${r} +`);return{stdout:n,stderr:u}}makeResolver(){let e=[];for(let r of this.plugins.values())for(let o of r.resolvers||[])e.push(new o);return new Pd([new e1,new Gn,...e])}makeFetcher(){let e=[];for(let r of this.plugins.values())for(let o of r.fetchers||[])e.push(new o);return new fC([new pC,new gC,...e])}getLinkers(){let e=[];for(let r of this.plugins.values())for(let o of r.linkers||[])e.push(new o);return e}getSupportedArchitectures(){let e=h1(),r=this.get("supportedArchitectures"),o=r.get("os");o!==null&&(o=o.map(u=>u==="current"?e.os:u));let a=r.get("cpu");a!==null&&(a=a.map(u=>u==="current"?e.cpu:u));let n=r.get("libc");return n!==null&&(n=Zu(n,u=>u==="current"?e.libc??Zu.skip:u)),{os:o,cpu:a,libc:n}}async refreshPackageExtensions(){this.packageExtensions=new Map;let e=this.packageExtensions,r=(o,a,{userProvided:n=!1}={})=>{if(!ll(o.range))throw new Error("Only semver ranges are allowed as keys for the packageExtensions setting");let u=new Nt;u.load(a,{yamlCompatibilityMode:!0});let A=Yy(e,o.identHash),p=[];A.push([o.range,p]);let h={status:"inactive",userProvided:n,parentDescriptor:o};for(let E of u.dependencies.values())p.push({...h,type:"Dependency",descriptor:E});for(let E of u.peerDependencies.values())p.push({...h,type:"PeerDependency",descriptor:E});for(let[E,w]of u.peerDependenciesMeta)for(let[v,b]of Object.entries(w))p.push({...h,type:"PeerDependencyMeta",selector:E,key:v,value:b})};await this.triggerHook(o=>o.registerPackageExtensions,this,r);for(let[o,a]of this.get("packageExtensions"))r(r0(o,!0),KS(a),{userProvided:!0})}normalizeLocator(e){return ll(e.reference)?us(e,`${this.get("defaultProtocol")}${e.reference}`):QC.test(e.reference)?us(e,`${this.get("defaultProtocol")}${e.reference}`):e}normalizeDependency(e){return ll(e.range)?mn(e,`${this.get("defaultProtocol")}${e.range}`):QC.test(e.range)?mn(e,`${this.get("defaultProtocol")}${e.range}`):e}normalizeDependencyMap(e){return new Map([...e].map(([r,o])=>[r,this.normalizeDependency(o)]))}normalizePackage(e){let r=Ww(e);if(this.packageExtensions==null)throw new Error("refreshPackageExtensions has to be called before normalizing packages");let o=this.packageExtensions.get(e.identHash);if(typeof o<"u"){let n=e.version;if(n!==null){for(let[u,A]of o)if(!!Sd(n,u))for(let p of A)switch(p.status==="inactive"&&(p.status="redundant"),p.type){case"Dependency":typeof r.dependencies.get(p.descriptor.identHash)>"u"&&(p.status="active",r.dependencies.set(p.descriptor.identHash,this.normalizeDependency(p.descriptor)));break;case"PeerDependency":typeof r.peerDependencies.get(p.descriptor.identHash)>"u"&&(p.status="active",r.peerDependencies.set(p.descriptor.identHash,p.descriptor));break;case"PeerDependencyMeta":{let h=r.peerDependenciesMeta.get(p.selector);(typeof h>"u"||!Object.prototype.hasOwnProperty.call(h,p.key)||h[p.key]!==p.value)&&(p.status="active",Df(r.peerDependenciesMeta,p.selector,()=>({}))[p.key]=p.value)}break;default:fL(p);break}}}let a=n=>n.scope?`${n.scope}__${n.name}`:`${n.name}`;for(let n of r.peerDependenciesMeta.keys()){let u=Ys(n);r.peerDependencies.has(u.identHash)||r.peerDependencies.set(u.identHash,mn(u,"*"))}for(let n of r.peerDependencies.values()){if(n.scope==="types")continue;let u=a(n),A=nA("types",u),p=nn(A);r.peerDependencies.has(A.identHash)||r.peerDependenciesMeta.has(p)||(r.peerDependencies.set(A.identHash,mn(A,"*")),r.peerDependenciesMeta.set(p,{optional:!0}))}return r.dependencies=new Map(Pa(r.dependencies,([,n])=>ba(n))),r.peerDependencies=new Map(Pa(r.peerDependencies,([,n])=>ba(n))),r}getLimit(e){return Df(this.limits,e,()=>(0,ace.default)(this.get(e)))}async triggerHook(e,...r){for(let o of this.plugins.values()){let a=o.hooks;if(!a)continue;let n=e(a);!n||await n(...r)}}async triggerMultipleHooks(e,r){for(let o of r)await this.triggerHook(e,...o)}async reduceHook(e,r,...o){let a=r;for(let n of this.plugins.values()){let u=n.hooks;if(!u)continue;let A=e(u);!A||(a=await A(a,...o))}return a}async firstHook(e,...r){for(let o of this.plugins.values()){let a=o.hooks;if(!a)continue;let n=e(a);if(!n)continue;let u=await n(...r);if(typeof u<"u")return u}return null}},Xe=Vc;Xe.deleteProperty=Symbol(),Xe.telemetry=null});var Mr={};Yt(Mr,{EndStrategy:()=>aU,ExecError:()=>vx,PipeError:()=>y1,execvp:()=>z4,pipevp:()=>sA});function Qd(t){return t!==null&&typeof t.fd=="number"}function iU(){}function sU(){for(let t of kd)t.kill()}async function sA(t,e,{cwd:r,env:o=process.env,strict:a=!1,stdin:n=null,stdout:u,stderr:A,end:p=2}){let h=["pipe","pipe","pipe"];n===null?h[0]="ignore":Qd(n)&&(h[0]=n),Qd(u)&&(h[1]=u),Qd(A)&&(h[2]=A);let E=(0,oU.default)(t,e,{cwd:ue.fromPortablePath(r),env:{...o,PWD:ue.fromPortablePath(r)},stdio:h});kd.add(E),kd.size===1&&(process.on("SIGINT",iU),process.on("SIGTERM",sU)),!Qd(n)&&n!==null&&n.pipe(E.stdin),Qd(u)||E.stdout.pipe(u,{end:!1}),Qd(A)||E.stderr.pipe(A,{end:!1});let w=()=>{for(let v of new Set([u,A]))Qd(v)||v.end()};return new Promise((v,b)=>{E.on("error",C=>{kd.delete(E),kd.size===0&&(process.off("SIGINT",iU),process.off("SIGTERM",sU)),(p===2||p===1)&&w(),b(C)}),E.on("close",(C,R)=>{kd.delete(E),kd.size===0&&(process.off("SIGINT",iU),process.off("SIGTERM",sU)),(p===2||p===1&&C!==0)&&w(),C===0||!a?v({code:lU(C,R)}):b(new y1({fileName:t,code:C,signal:R}))})})}async function z4(t,e,{cwd:r,env:o=process.env,encoding:a="utf8",strict:n=!1}){let u=["ignore","pipe","pipe"],A=[],p=[],h=ue.fromPortablePath(r);typeof o.PWD<"u"&&(o={...o,PWD:h});let E=(0,oU.default)(t,e,{cwd:h,env:o,stdio:u});return E.stdout.on("data",w=>{A.push(w)}),E.stderr.on("data",w=>{p.push(w)}),await new Promise((w,v)=>{E.on("error",b=>{let C=Xe.create(r),R=Kt(C,t,Bt.PATH);v(new Vt(1,`Process ${R} failed to spawn`,L=>{L.reportError(1,` ${$u(C,{label:"Thrown Error",value:Gc(Bt.NO_HINT,b.message)})}`)}))}),E.on("close",(b,C)=>{let R=a==="buffer"?Buffer.concat(A):Buffer.concat(A).toString(a),L=a==="buffer"?Buffer.concat(p):Buffer.concat(p).toString(a);b===0||!n?w({code:lU(b,C),stdout:R,stderr:L}):v(new vx({fileName:t,code:b,signal:C,stdout:R,stderr:L}))})})}function lU(t,e){let r=xst.get(e);return typeof r<"u"?128+r:t??1}function bst(t,e,{configuration:r,report:o}){o.reportError(1,` ${$u(r,t!==null?{label:"Exit Code",value:Gc(Bt.NUMBER,t)}:{label:"Exit Signal",value:Gc(Bt.CODE,e)})}`)}var oU,aU,y1,vx,kd,xst,yx=dt(()=>{bt();oU=tt(ZR());m1();Xl();Jl();aU=(o=>(o[o.Never=0]="Never",o[o.ErrorCode=1]="ErrorCode",o[o.Always=2]="Always",o))(aU||{}),y1=class extends Vt{constructor({fileName:r,code:o,signal:a}){let n=Xe.create(z.cwd()),u=Kt(n,r,Bt.PATH);super(1,`Child ${u} reported an error`,A=>{bst(o,a,{configuration:n,report:A})});this.code=lU(o,a)}},vx=class extends y1{constructor({fileName:r,code:o,signal:a,stdout:n,stderr:u}){super({fileName:r,code:o,signal:a});this.stdout=n,this.stderr=u}};kd=new Set;xst=new Map([["SIGINT",2],["SIGQUIT",3],["SIGKILL",9],["SIGTERM",15]])});var kC,cce=dt(()=>{bt();_t();C1();kC=class extends it{constructor(){super(...arguments);this.cwd=fe.String("--cwd",process.cwd(),{description:"The directory to run the command in"});this.commandName=fe.String();this.args=fe.Proxy()}async execute(){let r=this.args.length>0?`${this.commandName} ${this.args.join(" ")}`:this.commandName;return await FC(r,[],{cwd:ue.toPortablePath(this.cwd),stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}};kC.usage={description:"run a command using yarn's portable shell",details:` + This command will run a command using Yarn's portable shell. + + Make sure to escape glob patterns, redirections, and other features that might be expanded by your own shell. + + Note: To escape something from Yarn's shell, you might have to escape it twice, the first time from your own shell. + + Note: Don't use this command in Yarn scripts, as Yarn's shell is automatically used. + + For a list of features, visit: https://github.com/yarnpkg/berry/blob/master/packages/yarnpkg-shell/README.md. + `,examples:[["Run a simple command","$0 echo Hello"],["Run a command with a glob pattern","$0 echo '*.js'"],["Run a command with a redirection","$0 echo Hello World '>' hello.txt"],["Run a command with an escaped glob pattern (The double escape is needed in Unix shells)",`$0 echo '"*.js"'`],["Run a command with a variable (Double quotes are needed in Unix shells, to prevent them from expanding the variable)",'$0 "GREETING=Hello echo $GREETING World"']]}});var cl,uce=dt(()=>{cl=class extends Error{constructor(e){super(e),this.name="ShellError"}}});var Px={};Yt(Px,{fastGlobOptions:()=>pce,isBraceExpansion:()=>cU,isGlobPattern:()=>Qst,match:()=>kst,micromatchOptions:()=>Sx});function Qst(t){if(!Dx.default.scan(t,Sx).isGlob)return!1;try{Dx.default.parse(t,Sx)}catch{return!1}return!0}function kst(t,{cwd:e,baseFs:r}){return(0,Ace.default)(t,{...pce,cwd:ue.fromPortablePath(e),fs:CD(fce.default,new _p(r))})}function cU(t){return Dx.default.scan(t,Sx).isBrace}var Ace,fce,Dx,Sx,pce,hce=dt(()=>{bt();Ace=tt(EP()),fce=tt(Ie("fs")),Dx=tt(Jo()),Sx={strictBrackets:!0},pce={onlyDirectories:!1,onlyFiles:!1}});function uU(){}function AU(){for(let t of Fd)t.kill()}function yce(t,e,r,o){return a=>{let n=a[0]instanceof oA.Transform?"pipe":a[0],u=a[1]instanceof oA.Transform?"pipe":a[1],A=a[2]instanceof oA.Transform?"pipe":a[2],p=(0,dce.default)(t,e,{...o,stdio:[n,u,A]});return Fd.add(p),Fd.size===1&&(process.on("SIGINT",uU),process.on("SIGTERM",AU)),a[0]instanceof oA.Transform&&a[0].pipe(p.stdin),a[1]instanceof oA.Transform&&p.stdout.pipe(a[1],{end:!1}),a[2]instanceof oA.Transform&&p.stderr.pipe(a[2],{end:!1}),{stdin:p.stdin,promise:new Promise(h=>{p.on("error",E=>{switch(Fd.delete(p),Fd.size===0&&(process.off("SIGINT",uU),process.off("SIGTERM",AU)),E.code){case"ENOENT":a[2].write(`command not found: ${t} +`),h(127);break;case"EACCES":a[2].write(`permission denied: ${t} +`),h(128);break;default:a[2].write(`uncaught error: ${E.message} +`),h(1);break}}),p.on("close",E=>{Fd.delete(p),Fd.size===0&&(process.off("SIGINT",uU),process.off("SIGTERM",AU)),h(E!==null?E:129)})})}}}function Cce(t){return e=>{let r=e[0]==="pipe"?new oA.PassThrough:e[0];return{stdin:r,promise:Promise.resolve().then(()=>t({stdin:r,stdout:e[1],stderr:e[2]}))}}}function xx(t,e){return RC.start(t,e)}function gce(t,e=null){let r=new oA.PassThrough,o=new mce.StringDecoder,a="";return r.on("data",n=>{let u=o.write(n),A;do if(A=u.indexOf(` +`),A!==-1){let p=a+u.substring(0,A);u=u.substring(A+1),a="",t(e!==null?`${e} ${p}`:p)}while(A!==-1);a+=u}),r.on("end",()=>{let n=o.end();n!==""&&t(e!==null?`${e} ${n}`:n)}),r}function Ece(t,{prefix:e}){return{stdout:gce(r=>t.stdout.write(`${r} +`),t.stdout.isTTY?e:null),stderr:gce(r=>t.stderr.write(`${r} +`),t.stderr.isTTY?e:null)}}var dce,oA,mce,Fd,tc,fU,RC,pU=dt(()=>{dce=tt(ZR()),oA=Ie("stream"),mce=Ie("string_decoder"),Fd=new Set;tc=class{constructor(e){this.stream=e}close(){}get(){return this.stream}},fU=class{constructor(){this.stream=null}close(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");this.stream.end()}attach(e){this.stream=e}get(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");return this.stream}},RC=class{constructor(e,r){this.stdin=null;this.stdout=null;this.stderr=null;this.pipe=null;this.ancestor=e,this.implementation=r}static start(e,{stdin:r,stdout:o,stderr:a}){let n=new RC(null,e);return n.stdin=r,n.stdout=o,n.stderr=a,n}pipeTo(e,r=1){let o=new RC(this,e),a=new fU;return o.pipe=a,o.stdout=this.stdout,o.stderr=this.stderr,(r&1)===1?this.stdout=a:this.ancestor!==null&&(this.stderr=this.ancestor.stdout),(r&2)===2?this.stderr=a:this.ancestor!==null&&(this.stderr=this.ancestor.stderr),o}async exec(){let e=["ignore","ignore","ignore"];if(this.pipe)e[0]="pipe";else{if(this.stdin===null)throw new Error("Assertion failed: No input stream registered");e[0]=this.stdin.get()}let r;if(this.stdout===null)throw new Error("Assertion failed: No output stream registered");r=this.stdout,e[1]=r.get();let o;if(this.stderr===null)throw new Error("Assertion failed: No error stream registered");o=this.stderr,e[2]=o.get();let a=this.implementation(e);return this.pipe&&this.pipe.attach(a.stdin),await a.promise.then(n=>(r.close(),o.close(),n))}async run(){let e=[];for(let o=this;o;o=o.ancestor)e.push(o.exec());return(await Promise.all(e))[0]}}});var B1={};Yt(B1,{EntryCommand:()=>kC,ShellError:()=>cl,execute:()=>FC,globUtils:()=>Px});function Ice(t,e,r){let o=new ul.PassThrough({autoDestroy:!0});switch(t){case 0:(e&1)===1&&r.stdin.pipe(o,{end:!1}),(e&2)===2&&r.stdin instanceof ul.Writable&&o.pipe(r.stdin,{end:!1});break;case 1:(e&1)===1&&r.stdout.pipe(o,{end:!1}),(e&2)===2&&o.pipe(r.stdout,{end:!1});break;case 2:(e&1)===1&&r.stderr.pipe(o,{end:!1}),(e&2)===2&&o.pipe(r.stderr,{end:!1});break;default:throw new cl(`Bad file descriptor: "${t}"`)}return o}function Qx(t,e={}){let r={...t,...e};return r.environment={...t.environment,...e.environment},r.variables={...t.variables,...e.variables},r}async function Tst(t,e,r){let o=[],a=new ul.PassThrough;return a.on("data",n=>o.push(n)),await kx(t,e,Qx(r,{stdout:a})),Buffer.concat(o).toString().replace(/[\r\n]+$/,"")}async function wce(t,e,r){let o=t.map(async n=>{let u=await Rd(n.args,e,r);return{name:n.name,value:u.join(" ")}});return(await Promise.all(o)).reduce((n,u)=>(n[u.name]=u.value,n),{})}function bx(t){return t.match(/[^ \r\n\t]+/g)||[]}async function xce(t,e,r,o,a=o){switch(t.name){case"$":o(String(process.pid));break;case"#":o(String(e.args.length));break;case"@":if(t.quoted)for(let n of e.args)a(n);else for(let n of e.args){let u=bx(n);for(let A=0;A=0&&n"u"&&(t.defaultValue?u=(await Rd(t.defaultValue,e,r)).join(" "):t.alternativeValue&&(u="")),typeof u>"u")throw A?new cl(`Unbound argument #${n}`):new cl(`Unbound variable "${t.name}"`);if(t.quoted)o(u);else{let p=bx(u);for(let E=0;Eo.push(n));let a=Number(o.join(" "));return Number.isNaN(a)?E1({type:"variable",name:o.join(" ")},e,r):E1({type:"number",value:a},e,r)}else return Nst[t.type](await E1(t.left,e,r),await E1(t.right,e,r))}async function Rd(t,e,r){let o=new Map,a=[],n=[],u=E=>{n.push(E)},A=()=>{n.length>0&&a.push(n.join("")),n=[]},p=E=>{u(E),A()},h=(E,w,v)=>{let b=JSON.stringify({type:E,fd:w}),C=o.get(b);typeof C>"u"&&o.set(b,C=[]),C.push(v)};for(let E of t){let w=!1;switch(E.type){case"redirection":{let v=await Rd(E.args,e,r);for(let b of v)h(E.subtype,E.fd,b)}break;case"argument":for(let v of E.segments)switch(v.type){case"text":u(v.text);break;case"glob":u(v.pattern),w=!0;break;case"shell":{let b=await Tst(v.shell,e,r);if(v.quoted)u(b);else{let C=bx(b);for(let R=0;R"u")throw new Error("Assertion failed: Expected a glob pattern to have been set");let b=await e.glob.match(v,{cwd:r.cwd,baseFs:e.baseFs});if(b.length===0){let C=cU(v)?". Note: Brace expansion of arbitrary strings isn't currently supported. For more details, please read this issue: https://github.com/yarnpkg/berry/issues/22":"";throw new cl(`No matches found: "${v}"${C}`)}for(let C of b.sort())p(C)}}if(o.size>0){let E=[];for(let[w,v]of o.entries())E.splice(E.length,0,w,String(v.length),...v);a.splice(0,0,"__ysh_set_redirects",...E,"--")}return a}function I1(t,e,r){e.builtins.has(t[0])||(t=["command",...t]);let o=ue.fromPortablePath(r.cwd),a=r.environment;typeof a.PWD<"u"&&(a={...a,PWD:o});let[n,...u]=t;if(n==="command")return yce(u[0],u.slice(1),e,{cwd:o,env:a});let A=e.builtins.get(n);if(typeof A>"u")throw new Error(`Assertion failed: A builtin should exist for "${n}"`);return Cce(async({stdin:p,stdout:h,stderr:E})=>{let{stdin:w,stdout:v,stderr:b}=r;r.stdin=p,r.stdout=h,r.stderr=E;try{return await A(u,e,r)}finally{r.stdin=w,r.stdout=v,r.stderr=b}})}function Lst(t,e,r){return o=>{let a=new ul.PassThrough,n=kx(t,e,Qx(r,{stdin:a}));return{stdin:a,promise:n}}}function Ost(t,e,r){return o=>{let a=new ul.PassThrough,n=kx(t,e,r);return{stdin:a,promise:n}}}function Bce(t,e,r,o){if(e.length===0)return t;{let a;do a=String(Math.random());while(Object.prototype.hasOwnProperty.call(o.procedures,a));return o.procedures={...o.procedures},o.procedures[a]=t,I1([...e,"__ysh_run_procedure",a],r,o)}}async function vce(t,e,r){let o=t,a=null,n=null;for(;o;){let u=o.then?{...r}:r,A;switch(o.type){case"command":{let p=await Rd(o.args,e,r),h=await wce(o.envs,e,r);A=o.envs.length?I1(p,e,Qx(u,{environment:h})):I1(p,e,u)}break;case"subshell":{let p=await Rd(o.args,e,r),h=Lst(o.subshell,e,u);A=Bce(h,p,e,u)}break;case"group":{let p=await Rd(o.args,e,r),h=Ost(o.group,e,u);A=Bce(h,p,e,u)}break;case"envs":{let p=await wce(o.envs,e,r);u.environment={...u.environment,...p},A=I1(["true"],e,u)}break}if(typeof A>"u")throw new Error("Assertion failed: An action should have been generated");if(a===null)n=xx(A,{stdin:new tc(u.stdin),stdout:new tc(u.stdout),stderr:new tc(u.stderr)});else{if(n===null)throw new Error("Assertion failed: The execution pipeline should have been setup");switch(a){case"|":n=n.pipeTo(A,1);break;case"|&":n=n.pipeTo(A,3);break}}o.then?(a=o.then.type,o=o.then.chain):o=null}if(n===null)throw new Error("Assertion failed: The execution pipeline should have been setup");return await n.run()}async function Mst(t,e,r,{background:o=!1}={}){function a(n){let u=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],A=u[n%u.length];return Dce.default.hex(A)}if(o){let n=r.nextBackgroundJobIndex++,u=a(n),A=`[${n}]`,p=u(A),{stdout:h,stderr:E}=Ece(r,{prefix:p});return r.backgroundJobs.push(vce(t,e,Qx(r,{stdout:h,stderr:E})).catch(w=>E.write(`${w.message} +`)).finally(()=>{r.stdout.isTTY&&r.stdout.write(`Job ${p}, '${u(py(t))}' has ended +`)})),0}return await vce(t,e,r)}async function Ust(t,e,r,{background:o=!1}={}){let a,n=A=>{a=A,r.variables["?"]=String(A)},u=async A=>{try{return await Mst(A.chain,e,r,{background:o&&typeof A.then>"u"})}catch(p){if(!(p instanceof cl))throw p;return r.stderr.write(`${p.message} +`),1}};for(n(await u(t));t.then;){if(r.exitCode!==null)return r.exitCode;switch(t.then.type){case"&&":a===0&&n(await u(t.then.line));break;case"||":a!==0&&n(await u(t.then.line));break;default:throw new Error(`Assertion failed: Unsupported command type: "${t.then.type}"`)}t=t.then.line}return a}async function kx(t,e,r){let o=r.backgroundJobs;r.backgroundJobs=[];let a=0;for(let{command:n,type:u}of t){if(a=await Ust(n,e,r,{background:u==="&"}),r.exitCode!==null)return r.exitCode;r.variables["?"]=String(a)}return await Promise.all(r.backgroundJobs),r.backgroundJobs=o,a}function bce(t){switch(t.type){case"variable":return t.name==="@"||t.name==="#"||t.name==="*"||Number.isFinite(parseInt(t.name,10))||"defaultValue"in t&&!!t.defaultValue&&t.defaultValue.some(e=>w1(e))||"alternativeValue"in t&&!!t.alternativeValue&&t.alternativeValue.some(e=>w1(e));case"arithmetic":return hU(t.arithmetic);case"shell":return gU(t.shell);default:return!1}}function w1(t){switch(t.type){case"redirection":return t.args.some(e=>w1(e));case"argument":return t.segments.some(e=>bce(e));default:throw new Error(`Assertion failed: Unsupported argument type: "${t.type}"`)}}function hU(t){switch(t.type){case"variable":return bce(t);case"number":return!1;default:return hU(t.left)||hU(t.right)}}function gU(t){return t.some(({command:e})=>{for(;e;){let r=e.chain;for(;r;){let o;switch(r.type){case"subshell":o=gU(r.subshell);break;case"command":o=r.envs.some(a=>a.args.some(n=>w1(n)))||r.args.some(a=>w1(a));break}if(o)return!0;if(!r.then)break;r=r.then.chain}if(!e.then)break;e=e.then.line}return!1})}async function FC(t,e=[],{baseFs:r=new xn,builtins:o={},cwd:a=ue.toPortablePath(process.cwd()),env:n=process.env,stdin:u=process.stdin,stdout:A=process.stdout,stderr:p=process.stderr,variables:h={},glob:E=Px}={}){let w={};for(let[C,R]of Object.entries(n))typeof R<"u"&&(w[C]=R);let v=new Map(Rst);for(let[C,R]of Object.entries(o))v.set(C,R);u===null&&(u=new ul.PassThrough,u.end());let b=DD(t,E);if(!gU(b)&&b.length>0&&e.length>0){let{command:C}=b[b.length-1];for(;C.then;)C=C.then.line;let R=C.chain;for(;R.then;)R=R.then.chain;R.type==="command"&&(R.args=R.args.concat(e.map(L=>({type:"argument",segments:[{type:"text",text:L}]}))))}return await kx(b,{args:e,baseFs:r,builtins:v,initialStdin:u,initialStdout:A,initialStderr:p,glob:E},{cwd:a,environment:w,exitCode:null,procedures:{},stdin:u,stdout:A,stderr:p,variables:Object.assign({},h,{["?"]:0}),nextBackgroundJobIndex:1,backgroundJobs:[]})}var Dce,Sce,ul,Pce,Fst,Rst,Nst,C1=dt(()=>{bt();_l();Dce=tt(dN()),Sce=Ie("os"),ul=Ie("stream"),Pce=Ie("util");cce();uce();hce();pU();pU();Fst=(0,Pce.promisify)(setTimeout);Rst=new Map([["cd",async([t=(0,Sce.homedir)(),...e],r,o)=>{let a=z.resolve(o.cwd,ue.toPortablePath(t));if(!(await r.baseFs.statPromise(a).catch(u=>{throw u.code==="ENOENT"?new cl(`cd: no such file or directory: ${t}`):u})).isDirectory())throw new cl(`cd: not a directory: ${t}`);return o.cwd=a,0}],["pwd",async(t,e,r)=>(r.stdout.write(`${ue.fromPortablePath(r.cwd)} +`),0)],[":",async(t,e,r)=>0],["true",async(t,e,r)=>0],["false",async(t,e,r)=>1],["exit",async([t,...e],r,o)=>o.exitCode=parseInt(t??o.variables["?"],10)],["echo",async(t,e,r)=>(r.stdout.write(`${t.join(" ")} +`),0)],["sleep",async([t],e,r)=>{if(typeof t>"u")throw new cl("sleep: missing operand");let o=Number(t);if(Number.isNaN(o))throw new cl(`sleep: invalid time interval '${t}'`);return await Fst(1e3*o,0)}],["__ysh_run_procedure",async(t,e,r)=>{let o=r.procedures[t[0]];return await xx(o,{stdin:new tc(r.stdin),stdout:new tc(r.stdout),stderr:new tc(r.stderr)}).run()}],["__ysh_set_redirects",async(t,e,r)=>{let o=r.stdin,a=r.stdout,n=r.stderr,u=[],A=[],p=[],h=0;for(;t[h]!=="--";){let w=t[h++],{type:v,fd:b}=JSON.parse(w),C=V=>{switch(b){case null:case 0:u.push(V);break;default:throw new Error(`Unsupported file descriptor: "${b}"`)}},R=V=>{switch(b){case null:case 1:A.push(V);break;case 2:p.push(V);break;default:throw new Error(`Unsupported file descriptor: "${b}"`)}},L=Number(t[h++]),_=h+L;for(let V=h;V<_;++h,++V)switch(v){case"<":C(()=>e.baseFs.createReadStream(z.resolve(r.cwd,ue.toPortablePath(t[V]))));break;case"<<<":C(()=>{let re=new ul.PassThrough;return process.nextTick(()=>{re.write(`${t[V]} +`),re.end()}),re});break;case"<&":C(()=>Ice(Number(t[V]),1,r));break;case">":case">>":{let re=z.resolve(r.cwd,ue.toPortablePath(t[V]));R(re==="/dev/null"?new ul.Writable({autoDestroy:!0,emitClose:!0,write(oe,pe,he){setImmediate(he)}}):e.baseFs.createWriteStream(re,v===">>"?{flags:"a"}:void 0))}break;case">&":R(Ice(Number(t[V]),2,r));break;default:throw new Error(`Assertion failed: Unsupported redirection type: "${v}"`)}}if(u.length>0){let w=new ul.PassThrough;o=w;let v=b=>{if(b===u.length)w.end();else{let C=u[b]();C.pipe(w,{end:!1}),C.on("end",()=>{v(b+1)})}};v(0)}if(A.length>0){let w=new ul.PassThrough;a=w;for(let v of A)w.pipe(v)}if(p.length>0){let w=new ul.PassThrough;n=w;for(let v of p)w.pipe(v)}let E=await xx(I1(t.slice(h+1),e,r),{stdin:new tc(o),stdout:new tc(a),stderr:new tc(n)}).run();return await Promise.all(A.map(w=>new Promise((v,b)=>{w.on("error",C=>{b(C)}),w.on("close",()=>{v()}),w.end()}))),await Promise.all(p.map(w=>new Promise((v,b)=>{w.on("error",C=>{b(C)}),w.on("close",()=>{v()}),w.end()}))),E}]]);Nst={addition:(t,e)=>t+e,subtraction:(t,e)=>t-e,multiplication:(t,e)=>t*e,division:(t,e)=>Math.trunc(t/e)}});var Fx=U((cMt,Qce)=>{function _st(t,e){for(var r=-1,o=t==null?0:t.length,a=Array(o);++r{var kce=fd(),Hst=Fx(),qst=Yl(),jst=AC(),Gst=1/0,Fce=kce?kce.prototype:void 0,Rce=Fce?Fce.toString:void 0;function Tce(t){if(typeof t=="string")return t;if(qst(t))return Hst(t,Tce)+"";if(jst(t))return Rce?Rce.call(t):"";var e=t+"";return e=="0"&&1/t==-Gst?"-0":e}Nce.exports=Tce});var v1=U((AMt,Oce)=>{var Wst=Lce();function Yst(t){return t==null?"":Wst(t)}Oce.exports=Yst});var dU=U((fMt,Mce)=>{function Kst(t,e,r){var o=-1,a=t.length;e<0&&(e=-e>a?0:a+e),r=r>a?a:r,r<0&&(r+=a),a=e>r?0:r-e>>>0,e>>>=0;for(var n=Array(a);++o{var Vst=dU();function Jst(t,e,r){var o=t.length;return r=r===void 0?o:r,!e&&r>=o?t:Vst(t,e,r)}Uce.exports=Jst});var mU=U((hMt,Hce)=>{var zst="\\ud800-\\udfff",Xst="\\u0300-\\u036f",Zst="\\ufe20-\\ufe2f",$st="\\u20d0-\\u20ff",eot=Xst+Zst+$st,tot="\\ufe0e\\ufe0f",rot="\\u200d",not=RegExp("["+rot+zst+eot+tot+"]");function iot(t){return not.test(t)}Hce.exports=iot});var jce=U((gMt,qce)=>{function sot(t){return t.split("")}qce.exports=sot});var Xce=U((dMt,zce)=>{var Gce="\\ud800-\\udfff",oot="\\u0300-\\u036f",aot="\\ufe20-\\ufe2f",lot="\\u20d0-\\u20ff",cot=oot+aot+lot,uot="\\ufe0e\\ufe0f",Aot="["+Gce+"]",yU="["+cot+"]",CU="\\ud83c[\\udffb-\\udfff]",fot="(?:"+yU+"|"+CU+")",Wce="[^"+Gce+"]",Yce="(?:\\ud83c[\\udde6-\\uddff]){2}",Kce="[\\ud800-\\udbff][\\udc00-\\udfff]",pot="\\u200d",Vce=fot+"?",Jce="["+uot+"]?",hot="(?:"+pot+"(?:"+[Wce,Yce,Kce].join("|")+")"+Jce+Vce+")*",got=Jce+Vce+hot,dot="(?:"+[Wce+yU+"?",yU,Yce,Kce,Aot].join("|")+")",mot=RegExp(CU+"(?="+CU+")|"+dot+got,"g");function yot(t){return t.match(mot)||[]}zce.exports=yot});var $ce=U((mMt,Zce)=>{var Cot=jce(),Eot=mU(),Iot=Xce();function wot(t){return Eot(t)?Iot(t):Cot(t)}Zce.exports=wot});var tue=U((yMt,eue)=>{var Bot=_ce(),vot=mU(),Dot=$ce(),Sot=v1();function Pot(t){return function(e){e=Sot(e);var r=vot(e)?Dot(e):void 0,o=r?r[0]:e.charAt(0),a=r?Bot(r,1).join(""):e.slice(1);return o[t]()+a}}eue.exports=Pot});var nue=U((CMt,rue)=>{var xot=tue(),bot=xot("toUpperCase");rue.exports=bot});var EU=U((EMt,iue)=>{var Qot=v1(),kot=nue();function Fot(t){return kot(Qot(t).toLowerCase())}iue.exports=Fot});var sue=U((IMt,Rx)=>{function Rot(){var t=0,e=1,r=2,o=3,a=4,n=5,u=6,A=7,p=8,h=9,E=10,w=11,v=12,b=13,C=14,R=15,L=16,_=17,V=0,re=1,oe=2,pe=3,he=4;function ve(g,De){return 55296<=g.charCodeAt(De)&&g.charCodeAt(De)<=56319&&56320<=g.charCodeAt(De+1)&&g.charCodeAt(De+1)<=57343}function ge(g,De){De===void 0&&(De=0);var Ce=g.charCodeAt(De);if(55296<=Ce&&Ce<=56319&&De=1){var de=g.charCodeAt(De-1),ne=Ce;return 55296<=de&&de<=56319?(de-55296)*1024+(ne-56320)+65536:ne}return Ce}function le(g,De,Ce){var de=[g].concat(De).concat([Ce]),ne=de[de.length-2],Z=Ce,me=de.lastIndexOf(C);if(me>1&&de.slice(1,me).every(function(H){return H==o})&&[o,b,_].indexOf(g)==-1)return oe;var be=de.lastIndexOf(a);if(be>0&&de.slice(1,be).every(function(H){return H==a})&&[v,a].indexOf(ne)==-1)return de.filter(function(H){return H==a}).length%2==1?pe:he;if(ne==t&&Z==e)return V;if(ne==r||ne==t||ne==e)return Z==C&&De.every(function(H){return H==o})?oe:re;if(Z==r||Z==t||Z==e)return re;if(ne==u&&(Z==u||Z==A||Z==h||Z==E))return V;if((ne==h||ne==A)&&(Z==A||Z==p))return V;if((ne==E||ne==p)&&Z==p)return V;if(Z==o||Z==R)return V;if(Z==n)return V;if(ne==v)return V;var ut=de.indexOf(o)!=-1?de.lastIndexOf(o)-1:de.length-2;return[b,_].indexOf(de[ut])!=-1&&de.slice(ut+1,-1).every(function(H){return H==o})&&Z==C||ne==R&&[L,_].indexOf(Z)!=-1?V:De.indexOf(a)!=-1?oe:ne==a&&Z==a?V:re}this.nextBreak=function(g,De){if(De===void 0&&(De=0),De<0)return 0;if(De>=g.length-1)return g.length;for(var Ce=Pe(ge(g,De)),de=[],ne=De+1;ne{var Tot=/^(.*?)(\x1b\[[^m]+m|\x1b\]8;;.*?(\x1b\\|\u0007))/,Tx;function Not(){if(Tx)return Tx;if(typeof Intl.Segmenter<"u"){let t=new Intl.Segmenter("en",{granularity:"grapheme"});return Tx=e=>Array.from(t.segment(e),({segment:r})=>r)}else{let t=sue(),e=new t;return Tx=r=>e.splitGraphemes(r)}}oue.exports=(t,e=0,r=t.length)=>{if(e<0||r<0)throw new RangeError("Negative indices aren't supported by this implementation");let o=r-e,a="",n=0,u=0;for(;t.length>0;){let A=t.match(Tot)||[t,t,void 0],p=Not()(A[1]),h=Math.min(e-n,p.length);p=p.slice(h);let E=Math.min(o-u,p.length);a+=p.slice(0,E).join(""),n+=h,u+=E,typeof A[2]<"u"&&(a+=A[2]),t=t.slice(A[0].length)}return a}});function fue(t,{configuration:e,json:r}){if(!e.get("enableMessageNames"))return"";let a=Vu(t===null?0:t);return!r&&t===null?Kt(e,a,"grey"):a}function IU(t,{configuration:e,json:r}){let o=fue(t,{configuration:e,json:r});if(!o||t===null||t===0)return o;let a=dr[t],n=`https://yarnpkg.com/advanced/error-codes#${o}---${a}`.toLowerCase();return Xy(e,o,n)}var Aue,Lx,lue,cue,Lot,Oot,Nx,uue,Mot,Uot,Ox,_ot,Et,Mx=dt(()=>{Aue=tt(aue()),Lx=tt(Xg());eS();Xl();Jl();Ks();lue=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],cue=80,Lot=new Set([13,19]),Oot=5,Nx=Lx.default.GITHUB_ACTIONS?{start:t=>`::group::${t} +`,end:t=>`::endgroup:: +`}:Lx.default.TRAVIS?{start:t=>`travis_fold:start:${t} +`,end:t=>`travis_fold:end:${t} +`}:Lx.default.GITLAB?{start:t=>`section_start:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}[collapsed=true]\r\x1B[0K${t} +`,end:t=>`section_end:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}\r\x1B[0K`}:null,uue=new Date,Mot=["iTerm.app","Apple_Terminal","WarpTerminal","vscode"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,Uot=t=>t,Ox=Uot({patrick:{date:[17,3],chars:["\u{1F340}","\u{1F331}"],size:40},simba:{date:[19,7],chars:["\u{1F981}","\u{1F334}"],size:40},jack:{date:[31,10],chars:["\u{1F383}","\u{1F987}"],size:40},hogsfather:{date:[31,12],chars:["\u{1F389}","\u{1F384}"],size:40},default:{chars:["=","-"],size:80}}),_ot=Mot&&Object.keys(Ox).find(t=>{let e=Ox[t];return!(e.date&&(e.date[0]!==uue.getDate()||e.date[1]!==uue.getMonth()+1))})||"default";Et=class extends Js{constructor({configuration:r,stdout:o,json:a=!1,includeNames:n=!0,includePrefix:u=!0,includeFooter:A=!0,includeLogs:p=!a,includeInfos:h=p,includeWarnings:E=p,forgettableBufferSize:w=Oot,forgettableNames:v=new Set}){super();this.uncommitted=new Set;this.cacheHitCount=0;this.cacheMissCount=0;this.lastCacheMiss=null;this.warningCount=0;this.errorCount=0;this.startTime=Date.now();this.indent=0;this.progress=new Map;this.progressTime=0;this.progressFrame=0;this.progressTimeout=null;this.progressStyle=null;this.progressMaxScaledSize=null;this.forgettableLines=[];if(Hw(this,{configuration:r}),this.configuration=r,this.forgettableBufferSize=w,this.forgettableNames=new Set([...v,...Lot]),this.includeNames=n,this.includePrefix=u,this.includeFooter=A,this.includeInfos=h,this.includeWarnings=E,this.json=a,this.stdout=o,r.get("enableProgressBars")&&!a&&o.isTTY&&o.columns>22){let b=r.get("progressBarStyle")||_ot;if(!Object.prototype.hasOwnProperty.call(Ox,b))throw new Error("Assertion failed: Invalid progress bar style");this.progressStyle=Ox[b];let C=12,R=Math.max(0,Math.min(o.columns-C,80));this.progressMaxScaledSize=Math.floor(this.progressStyle.size*R/80)}}static async start(r,o){let a=new this(r),n=process.emitWarning;process.emitWarning=(u,A)=>{if(typeof u!="string"){let h=u;u=h.message,A=A??h.name}let p=typeof A<"u"?`${A}: ${u}`:u;a.reportWarning(0,p)};try{await o(a)}catch(u){a.reportExceptionOnce(u)}finally{await a.finalize(),process.emitWarning=n}return a}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(r){this.cacheHitCount+=1}reportCacheMiss(r,o){this.lastCacheMiss=r,this.cacheMissCount+=1,typeof o<"u"&&!this.configuration.get("preferAggregateCacheInfo")&&this.reportInfo(13,o)}startSectionSync({reportHeader:r,reportFooter:o,skipIfEmpty:a},n){let u={committed:!1,action:()=>{r==null||r()}};a?this.uncommitted.add(u):(u.action(),u.committed=!0);let A=Date.now();try{return n()}catch(p){throw this.reportExceptionOnce(p),p}finally{let p=Date.now();this.uncommitted.delete(u),u.committed&&(o==null||o(p-A))}}async startSectionPromise({reportHeader:r,reportFooter:o,skipIfEmpty:a},n){let u={committed:!1,action:()=>{r==null||r()}};a?this.uncommitted.add(u):(u.action(),u.committed=!0);let A=Date.now();try{return await n()}catch(p){throw this.reportExceptionOnce(p),p}finally{let p=Date.now();this.uncommitted.delete(u),u.committed&&(o==null||o(p-A))}}startTimerImpl(r,o,a){return{cb:typeof o=="function"?o:a,reportHeader:()=>{this.reportInfo(null,`\u250C ${r}`),this.indent+=1,Nx!==null&&!this.json&&this.includeInfos&&this.stdout.write(Nx.start(r))},reportFooter:A=>{this.indent-=1,Nx!==null&&!this.json&&this.includeInfos&&this.stdout.write(Nx.end(r)),this.configuration.get("enableTimers")&&A>200?this.reportInfo(null,`\u2514 Completed in ${Kt(this.configuration,A,Bt.DURATION)}`):this.reportInfo(null,"\u2514 Completed")},skipIfEmpty:(typeof o=="function"?{}:o).skipIfEmpty}}startTimerSync(r,o,a){let{cb:n,...u}=this.startTimerImpl(r,o,a);return this.startSectionSync(u,n)}async startTimerPromise(r,o,a){let{cb:n,...u}=this.startTimerImpl(r,o,a);return this.startSectionPromise(u,n)}async startCacheReport(r){let o=this.configuration.get("preferAggregateCacheInfo")?{cacheHitCount:this.cacheHitCount,cacheMissCount:this.cacheMissCount}:null;try{return await r()}catch(a){throw this.reportExceptionOnce(a),a}finally{o!==null&&this.reportCacheChanges(o)}}reportSeparator(){this.indent===0?this.writeLineWithForgettableReset(""):this.reportInfo(null,"")}reportInfo(r,o){if(!this.includeInfos)return;this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:"",u=`${this.formatPrefix(n,"blueBright")}${o}`;if(this.json)this.reportJson({type:"info",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:o});else if(this.forgettableNames.has(r))if(this.forgettableLines.push(u),this.forgettableLines.length>this.forgettableBufferSize){for(;this.forgettableLines.length>this.forgettableBufferSize;)this.forgettableLines.shift();this.writeLines(this.forgettableLines,{truncate:!0})}else this.writeLine(u,{truncate:!0});else this.writeLineWithForgettableReset(u)}reportWarning(r,o){if(this.warningCount+=1,!this.includeWarnings)return;this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:"";this.json?this.reportJson({type:"warning",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:o}):this.writeLineWithForgettableReset(`${this.formatPrefix(n,"yellowBright")}${o}`)}reportError(r,o){this.errorCount+=1,this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:"";this.json?this.reportJson({type:"error",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:o}):this.writeLineWithForgettableReset(`${this.formatPrefix(n,"redBright")}${o}`,{truncate:!1})}reportProgress(r){if(this.progressStyle===null)return{...Promise.resolve(),stop:()=>{}};if(r.hasProgress&&r.hasTitle)throw new Error("Unimplemented: Progress bars can't have both progress and titles.");let o=!1,a=Promise.resolve().then(async()=>{let u={progress:r.hasProgress?0:void 0,title:r.hasTitle?"":void 0};this.progress.set(r,{definition:u,lastScaledSize:r.hasProgress?-1:void 0,lastTitle:void 0}),this.refreshProgress({delta:-1});for await(let{progress:A,title:p}of r)o||u.progress===A&&u.title===p||(u.progress=A,u.title=p,this.refreshProgress());n()}),n=()=>{o||(o=!0,this.progress.delete(r),this.refreshProgress({delta:1}))};return{...a,stop:n}}reportJson(r){this.json&&this.writeLineWithForgettableReset(`${JSON.stringify(r)}`)}async finalize(){if(!this.includeFooter)return;let r="";this.errorCount>0?r="Failed with errors":this.warningCount>0?r="Done with warnings":r="Done";let o=Kt(this.configuration,Date.now()-this.startTime,Bt.DURATION),a=this.configuration.get("enableTimers")?`${r} in ${o}`:r;this.errorCount>0?this.reportError(0,a):this.warningCount>0?this.reportWarning(0,a):this.reportInfo(0,a)}writeLine(r,{truncate:o}={}){this.clearProgress({clear:!0}),this.stdout.write(`${this.truncate(r,{truncate:o})} +`),this.writeProgress()}writeLineWithForgettableReset(r,{truncate:o}={}){this.forgettableLines=[],this.writeLine(r,{truncate:o})}writeLines(r,{truncate:o}={}){this.clearProgress({delta:r.length});for(let a of r)this.stdout.write(`${this.truncate(a,{truncate:o})} +`);this.writeProgress()}reportCacheChanges({cacheHitCount:r,cacheMissCount:o}){let a=this.cacheHitCount-r,n=this.cacheMissCount-o;if(a===0&&n===0)return;let u="";this.cacheHitCount>1?u+=`${this.cacheHitCount} packages were already cached`:this.cacheHitCount===1?u+=" - one package was already cached":u+="No packages were cached",this.cacheHitCount>0?this.cacheMissCount>1?u+=`, ${this.cacheMissCount} had to be fetched`:this.cacheMissCount===1&&(u+=`, one had to be fetched (${kr(this.configuration,this.lastCacheMiss)})`):this.cacheMissCount>1?u+=` - ${this.cacheMissCount} packages had to be fetched`:this.cacheMissCount===1&&(u+=` - one package had to be fetched (${kr(this.configuration,this.lastCacheMiss)})`),this.reportInfo(13,u)}commit(){let r=this.uncommitted;this.uncommitted=new Set;for(let o of r)o.committed=!0,o.action()}clearProgress({delta:r=0,clear:o=!1}){this.progressStyle!==null&&this.progress.size+r>0&&(this.stdout.write(`\x1B[${this.progress.size+r}A`),(r>0||o)&&this.stdout.write("\x1B[0J"))}writeProgress(){if(this.progressStyle===null||(this.progressTimeout!==null&&clearTimeout(this.progressTimeout),this.progressTimeout=null,this.progress.size===0))return;let r=Date.now();r-this.progressTime>cue&&(this.progressFrame=(this.progressFrame+1)%lue.length,this.progressTime=r);let o=lue[this.progressFrame];for(let a of this.progress.values()){let n="";if(typeof a.lastScaledSize<"u"){let h=this.progressStyle.chars[0].repeat(a.lastScaledSize),E=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-a.lastScaledSize);n=` ${h}${E}`}let u=this.formatName(null),A=u?`${u}: `:"",p=a.definition.title?` ${a.definition.title}`:"";this.stdout.write(`${Kt(this.configuration,"\u27A4","blueBright")} ${A}${o}${n}${p} +`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress({force:!0})},cue)}refreshProgress({delta:r=0,force:o=!1}={}){let a=!1,n=!1;if(o||this.progress.size===0)a=!0;else for(let u of this.progress.values()){let A=typeof u.definition.progress<"u"?Math.trunc(this.progressMaxScaledSize*u.definition.progress):void 0,p=u.lastScaledSize;u.lastScaledSize=A;let h=u.lastTitle;if(u.lastTitle=u.definition.title,A!==p||(n=h!==u.definition.title)){a=!0;break}}a&&(this.clearProgress({delta:r,clear:n}),this.writeProgress())}truncate(r,{truncate:o}={}){return this.progressStyle===null&&(o=!1),typeof o>"u"&&(o=this.configuration.get("preferTruncatedLines")),o&&(r=(0,Aue.default)(r,0,this.stdout.columns-1)),r}formatName(r){return this.includeNames?fue(r,{configuration:this.configuration,json:this.json}):""}formatPrefix(r,o){return this.includePrefix?`${Kt(this.configuration,"\u27A4",o)} ${r}${this.formatIndent()}`:""}formatNameWithHyperlink(r){return this.includeNames?IU(r,{configuration:this.configuration,json:this.json}):""}formatIndent(){return"\u2502 ".repeat(this.indent)}}});var On,wU=dt(()=>{On="4.0.0-rc.42"});var sn={};Yt(sn,{PackageManager:()=>gue,detectPackageManager:()=>due,executePackageAccessibleBinary:()=>Iue,executePackageScript:()=>Ux,executePackageShellcode:()=>BU,executeWorkspaceAccessibleBinary:()=>Kot,executeWorkspaceLifecycleScript:()=>Cue,executeWorkspaceScript:()=>yue,getPackageAccessibleBinaries:()=>_x,getWorkspaceAccessibleBinaries:()=>Eue,hasPackageScript:()=>Got,hasWorkspaceScript:()=>vU,makeScriptEnv:()=>D1,maybeExecuteWorkspaceLifecycleScript:()=>Yot,prepareExternalProject:()=>jot});async function Lf(t,e,r,o=[]){if(process.platform==="win32"){let a=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @"${r}" ${o.map(n=>`"${n.replace('"','""')}"`).join(" ")} %*`;await ae.writeFilePromise(z.format({dir:t,name:e,ext:".cmd"}),a)}await ae.writeFilePromise(z.join(t,e),`#!/bin/sh +exec "${r}" ${o.map(a=>`'${a.replace(/'/g,`'"'"'`)}'`).join(" ")} "$@" +`,{mode:493})}async function due(t){let e=await Nt.tryFind(t);if(e!=null&&e.packageManager){let o=kP(e.packageManager);if(o!=null&&o.name){let a=`found ${JSON.stringify({packageManager:e.packageManager})} in manifest`,[n]=o.reference.split(".");switch(o.name){case"yarn":return{packageManagerField:!0,packageManager:Number(n)===1?"Yarn Classic":"Yarn",reason:a};case"npm":return{packageManagerField:!0,packageManager:"npm",reason:a};case"pnpm":return{packageManagerField:!0,packageManager:"pnpm",reason:a}}}}let r;try{r=await ae.readFilePromise(z.join(t,Lr.lockfile),"utf8")}catch{}return r!==void 0?r.match(/^__metadata:$/m)?{packageManager:"Yarn",reason:'"__metadata" key found in yarn.lock'}:{packageManager:"Yarn Classic",reason:'"__metadata" key not found in yarn.lock, must be a Yarn classic lockfile'}:ae.existsSync(z.join(t,"package-lock.json"))?{packageManager:"npm",reason:`found npm's "package-lock.json" lockfile`}:ae.existsSync(z.join(t,"pnpm-lock.yaml"))?{packageManager:"pnpm",reason:`found pnpm's "pnpm-lock.yaml" lockfile`}:null}async function D1({project:t,locator:e,binFolder:r,ignoreCorepack:o,lifecycleScript:a}){let n={};for(let[h,E]of Object.entries(process.env))typeof E<"u"&&(n[h.toLowerCase()!=="path"?h:"PATH"]=E);let u=ue.fromPortablePath(r);n.BERRY_BIN_FOLDER=ue.fromPortablePath(u);let A=process.env.COREPACK_ROOT&&!o?ue.join(process.env.COREPACK_ROOT,"dist/yarn.js"):process.argv[1];if(await Promise.all([Lf(r,"node",process.execPath),...On!==null?[Lf(r,"run",process.execPath,[A,"run"]),Lf(r,"yarn",process.execPath,[A]),Lf(r,"yarnpkg",process.execPath,[A]),Lf(r,"node-gyp",process.execPath,[A,"run","--top-level","node-gyp"])]:[]]),t&&(n.INIT_CWD=ue.cwd(),n.PROJECT_CWD=ue.fromPortablePath(t.cwd)),n.PATH=n.PATH?`${u}${ue.delimiter}${n.PATH}`:`${u}`,n.npm_execpath=`${u}${ue.sep}yarn`,n.npm_node_execpath=`${u}${ue.sep}node`,e){if(!t)throw new Error("Assertion failed: Missing project");let h=t.tryWorkspaceByLocator(e),E=h?h.manifest.version??"":t.storedPackages.get(e.locatorHash).version??"";n.npm_package_name=nn(e),n.npm_package_version=E;let w;if(h)w=h.cwd;else{let v=t.storedPackages.get(e.locatorHash);if(!v)throw new Error(`Package for ${kr(t.configuration,e)} not found in the project`);let b=t.configuration.getLinkers(),C={project:t,report:new Et({stdout:new u0.PassThrough,configuration:t.configuration})},R=b.find(L=>L.supportsPackage(v,C));if(!R)throw new Error(`The package ${kr(t.configuration,v)} isn't supported by any of the available linkers`);w=await R.findPackageLocation(v,C)}n.npm_package_json=ue.fromPortablePath(z.join(w,Lr.manifest))}let p=On!==null?`yarn/${On}`:`yarn/${Vp("@yarnpkg/core").version}-core`;return n.npm_config_user_agent=`${p} npm/? node/${process.version} ${process.platform} ${process.arch}`,a&&(n.npm_lifecycle_event=a),t&&await t.configuration.triggerHook(h=>h.setupScriptEnvironment,t,n,async(h,E,w)=>await Lf(r,Li(h),E,w)),n}async function jot(t,e,{configuration:r,report:o,workspace:a=null,locator:n=null}){await qot(async()=>{await ae.mktempPromise(async u=>{let A=z.join(u,"pack.log"),p=null,{stdout:h,stderr:E}=r.getSubprocessStreams(A,{prefix:ue.fromPortablePath(t),report:o}),w=n&&Wc(n)?Kw(n):n,v=w?Vl(w):"an external project";h.write(`Packing ${v} from sources +`);let b=await due(t),C;b!==null?(h.write(`Using ${b.packageManager} for bootstrap. Reason: ${b.reason} + +`),C=b.packageManager):(h.write(`No package manager configuration detected; defaulting to Yarn + +`),C="Yarn");let R=C==="Yarn"&&!(b!=null&&b.packageManagerField);await ae.mktempPromise(async L=>{let _=await D1({binFolder:L,ignoreCorepack:R}),re=new Map([["Yarn Classic",async()=>{let pe=a!==null?["workspace",a]:[],he=z.join(t,Lr.manifest),ve=await ae.readFilePromise(he),ge=await sA(process.execPath,[process.argv[1],"set","version","classic","--only-if-needed","--yarn-path"],{cwd:t,env:_,stdin:p,stdout:h,stderr:E,end:1});if(ge.code!==0)return ge.code;await ae.writeFilePromise(he,ve),await ae.appendFilePromise(z.join(t,".npmignore"),`/.yarn +`),h.write(` +`),delete _.NODE_ENV;let le=await sA("yarn",["install"],{cwd:t,env:_,stdin:p,stdout:h,stderr:E,end:1});if(le.code!==0)return le.code;h.write(` +`);let Pe=await sA("yarn",[...pe,"pack","--filename",ue.fromPortablePath(e)],{cwd:t,env:_,stdin:p,stdout:h,stderr:E});return Pe.code!==0?Pe.code:0}],["Yarn",async()=>{let pe=a!==null?["workspace",a]:[];_.YARN_ENABLE_INLINE_BUILDS="1";let he=z.join(t,Lr.lockfile);await ae.existsPromise(he)||await ae.writeFilePromise(he,"");let ve=await sA("yarn",[...pe,"pack","--install-if-needed","--filename",ue.fromPortablePath(e)],{cwd:t,env:_,stdin:p,stdout:h,stderr:E});return ve.code!==0?ve.code:0}],["npm",async()=>{if(a!==null){let De=new u0.PassThrough,Ce=Jy(De);De.pipe(h,{end:!1});let de=await sA("npm",["--version"],{cwd:t,env:_,stdin:p,stdout:De,stderr:E,end:0});if(De.end(),de.code!==0)return h.end(),E.end(),de.code;let ne=(await Ce).toString().trim();if(!Sd(ne,">=7.x")){let Z=nA(null,"npm"),me=mn(Z,ne),be=mn(Z,">=7.x");throw new Error(`Workspaces aren't supported by ${Ln(r,me)}; please upgrade to ${Ln(r,be)} (npm has been detected as the primary package manager for ${Kt(r,t,Bt.PATH)})`)}}let pe=a!==null?["--workspace",a]:[];delete _.npm_config_user_agent,delete _.npm_config_production,delete _.NPM_CONFIG_PRODUCTION,delete _.NODE_ENV;let he=await sA("npm",["install"],{cwd:t,env:_,stdin:p,stdout:h,stderr:E,end:1});if(he.code!==0)return he.code;let ve=new u0.PassThrough,ge=Jy(ve);ve.pipe(h);let le=await sA("npm",["pack","--silent",...pe],{cwd:t,env:_,stdin:p,stdout:ve,stderr:E});if(le.code!==0)return le.code;let Pe=(await ge).toString().trim().replace(/^.*\n/s,""),g=z.resolve(t,ue.toPortablePath(Pe));return await ae.renamePromise(g,e),0}]]).get(C);if(typeof re>"u")throw new Error("Assertion failed: Unsupported workflow");let oe=await re();if(!(oe===0||typeof oe>"u"))throw ae.detachTemp(u),new Vt(58,`Packing the package failed (exit code ${oe}, logs can be found here: ${Kt(r,A,Bt.PATH)})`)})})})}async function Got(t,e,{project:r}){let o=r.tryWorkspaceByLocator(t);if(o!==null)return vU(o,e);let a=r.storedPackages.get(t.locatorHash);if(!a)throw new Error(`Package for ${kr(r.configuration,t)} not found in the project`);return await Ul.openPromise(async n=>{let u=r.configuration,A=r.configuration.getLinkers(),p={project:r,report:new Et({stdout:new u0.PassThrough,configuration:u})},h=A.find(b=>b.supportsPackage(a,p));if(!h)throw new Error(`The package ${kr(r.configuration,a)} isn't supported by any of the available linkers`);let E=await h.findPackageLocation(a,p),w=new An(E,{baseFs:n});return(await Nt.find(wt.dot,{baseFs:w})).scripts.has(e)})}async function Ux(t,e,r,{cwd:o,project:a,stdin:n,stdout:u,stderr:A}){return await ae.mktempPromise(async p=>{let{manifest:h,env:E,cwd:w}=await mue(t,{project:a,binFolder:p,cwd:o,lifecycleScript:e}),v=h.scripts.get(e);if(typeof v>"u")return 1;let b=async()=>await FC(v,r,{cwd:w,env:E,stdin:n,stdout:u,stderr:A});return await(await a.configuration.reduceHook(R=>R.wrapScriptExecution,b,a,t,e,{script:v,args:r,cwd:w,env:E,stdin:n,stdout:u,stderr:A}))()})}async function BU(t,e,r,{cwd:o,project:a,stdin:n,stdout:u,stderr:A}){return await ae.mktempPromise(async p=>{let{env:h,cwd:E}=await mue(t,{project:a,binFolder:p,cwd:o});return await FC(e,r,{cwd:E,env:h,stdin:n,stdout:u,stderr:A})})}async function Wot(t,{binFolder:e,cwd:r,lifecycleScript:o}){let a=await D1({project:t.project,locator:t.anchoredLocator,binFolder:e,lifecycleScript:o});return await Promise.all(Array.from(await Eue(t),([n,[,u]])=>Lf(e,Li(n),process.execPath,[u]))),typeof r>"u"&&(r=z.dirname(await ae.realpathPromise(z.join(t.cwd,"package.json")))),{manifest:t.manifest,binFolder:e,env:a,cwd:r}}async function mue(t,{project:e,binFolder:r,cwd:o,lifecycleScript:a}){let n=e.tryWorkspaceByLocator(t);if(n!==null)return Wot(n,{binFolder:r,cwd:o,lifecycleScript:a});let u=e.storedPackages.get(t.locatorHash);if(!u)throw new Error(`Package for ${kr(e.configuration,t)} not found in the project`);return await Ul.openPromise(async A=>{let p=e.configuration,h=e.configuration.getLinkers(),E={project:e,report:new Et({stdout:new u0.PassThrough,configuration:p})},w=h.find(L=>L.supportsPackage(u,E));if(!w)throw new Error(`The package ${kr(e.configuration,u)} isn't supported by any of the available linkers`);let v=await D1({project:e,locator:t,binFolder:r,lifecycleScript:a});await Promise.all(Array.from(await _x(t,{project:e}),([L,[,_]])=>Lf(r,Li(L),process.execPath,[_])));let b=await w.findPackageLocation(u,E),C=new An(b,{baseFs:A}),R=await Nt.find(wt.dot,{baseFs:C});return typeof o>"u"&&(o=b),{manifest:R,binFolder:r,env:v,cwd:o}})}async function yue(t,e,r,{cwd:o,stdin:a,stdout:n,stderr:u}){return await Ux(t.anchoredLocator,e,r,{cwd:o,project:t.project,stdin:a,stdout:n,stderr:u})}function vU(t,e){return t.manifest.scripts.has(e)}async function Cue(t,e,{cwd:r,report:o}){let{configuration:a}=t.project,n=null;await ae.mktempPromise(async u=>{let A=z.join(u,`${e}.log`),p=`# This file contains the result of Yarn calling the "${e}" lifecycle script inside a workspace ("${ue.fromPortablePath(t.cwd)}") +`,{stdout:h,stderr:E}=a.getSubprocessStreams(A,{report:o,prefix:kr(a,t.anchoredLocator),header:p});o.reportInfo(36,`Calling the "${e}" lifecycle script`);let w=await yue(t,e,[],{cwd:r,stdin:n,stdout:h,stderr:E});if(h.end(),E.end(),w!==0)throw ae.detachTemp(u),new Vt(36,`${(0,pue.default)(e)} script failed (exit code ${Kt(a,w,Bt.NUMBER)}, logs can be found here: ${Kt(a,A,Bt.PATH)}); run ${Kt(a,`yarn ${e}`,Bt.CODE)} to investigate`)})}async function Yot(t,e,r){vU(t,e)&&await Cue(t,e,r)}async function _x(t,{project:e}){let r=e.configuration,o=new Map,a=e.storedPackages.get(t.locatorHash);if(!a)throw new Error(`Package for ${kr(r,t)} not found in the project`);let n=new u0.Writable,u=r.getLinkers(),A={project:e,report:new Et({configuration:r,stdout:n})},p=new Set([t.locatorHash]);for(let E of a.dependencies.values()){let w=e.storedResolutions.get(E.descriptorHash);if(!w)throw new Error(`Assertion failed: The resolution (${Ln(r,E)}) should have been registered`);p.add(w)}let h=await Promise.all(Array.from(p,async E=>{let w=e.storedPackages.get(E);if(!w)throw new Error(`Assertion failed: The package (${E}) should have been registered`);if(w.bin.size===0)return Zu.skip;let v=u.find(C=>C.supportsPackage(w,A));if(!v)return Zu.skip;let b=null;try{b=await v.findPackageLocation(w,A)}catch(C){if(C.code==="LOCATOR_NOT_INSTALLED")return Zu.skip;throw C}return{dependency:w,packageLocation:b}}));for(let E of h){if(E===Zu.skip)continue;let{dependency:w,packageLocation:v}=E;for(let[b,C]of w.bin)o.set(b,[w,ue.fromPortablePath(z.resolve(v,C))])}return o}async function Eue(t){return await _x(t.anchoredLocator,{project:t.project})}async function Iue(t,e,r,{cwd:o,project:a,stdin:n,stdout:u,stderr:A,nodeArgs:p=[],packageAccessibleBinaries:h}){h??(h=await _x(t,{project:a}));let E=h.get(e);if(!E)throw new Error(`Binary not found (${e}) for ${kr(a.configuration,t)}`);return await ae.mktempPromise(async w=>{let[,v]=E,b=await D1({project:a,locator:t,binFolder:w});await Promise.all(Array.from(h,([R,[,L]])=>Lf(b.BERRY_BIN_FOLDER,Li(R),process.execPath,[L])));let C;try{C=await sA(process.execPath,[...p,v,...r],{cwd:o,env:b,stdin:n,stdout:u,stderr:A})}finally{await ae.removePromise(b.BERRY_BIN_FOLDER)}return C.code})}async function Kot(t,e,r,{cwd:o,stdin:a,stdout:n,stderr:u,packageAccessibleBinaries:A}){return await Iue(t.anchoredLocator,e,r,{project:t.project,cwd:o,stdin:a,stdout:n,stderr:u,packageAccessibleBinaries:A})}var pue,hue,u0,gue,Hot,qot,DU=dt(()=>{bt();bt();_c();C1();pue=tt(EU()),hue=tt(rd()),u0=Ie("stream");uC();Xl();Mx();wU();yx();Jl();Kl();n0();Ks();gue=(a=>(a.Yarn1="Yarn Classic",a.Yarn2="Yarn",a.Npm="npm",a.Pnpm="pnpm",a))(gue||{});Hot=2,qot=(0,hue.default)(Hot)});var TC=U((qMt,Bue)=>{"use strict";var wue=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"]]);Bue.exports=t=>t?Object.keys(t).map(e=>[wue.has(e)?wue.get(e):e,t[e]]).reduce((e,r)=>(e[r[0]]=r[1],e),Object.create(null)):{}});var LC=U((jMt,Fue)=>{"use strict";var vue=typeof process=="object"&&process?process:{stdout:null,stderr:null},Vot=Ie("events"),Due=Ie("stream"),Sue=Ie("string_decoder").StringDecoder,Of=Symbol("EOF"),Mf=Symbol("maybeEmitEnd"),A0=Symbol("emittedEnd"),Hx=Symbol("emittingEnd"),S1=Symbol("emittedError"),qx=Symbol("closed"),Pue=Symbol("read"),jx=Symbol("flush"),xue=Symbol("flushChunk"),Qa=Symbol("encoding"),Uf=Symbol("decoder"),Gx=Symbol("flowing"),P1=Symbol("paused"),NC=Symbol("resume"),Ss=Symbol("bufferLength"),SU=Symbol("bufferPush"),PU=Symbol("bufferShift"),bo=Symbol("objectMode"),Qo=Symbol("destroyed"),xU=Symbol("emitData"),bue=Symbol("emitEnd"),bU=Symbol("emitEnd2"),_f=Symbol("async"),x1=t=>Promise.resolve().then(t),Que=global._MP_NO_ITERATOR_SYMBOLS_!=="1",Jot=Que&&Symbol.asyncIterator||Symbol("asyncIterator not implemented"),zot=Que&&Symbol.iterator||Symbol("iterator not implemented"),Xot=t=>t==="end"||t==="finish"||t==="prefinish",Zot=t=>t instanceof ArrayBuffer||typeof t=="object"&&t.constructor&&t.constructor.name==="ArrayBuffer"&&t.byteLength>=0,$ot=t=>!Buffer.isBuffer(t)&&ArrayBuffer.isView(t),Wx=class{constructor(e,r,o){this.src=e,this.dest=r,this.opts=o,this.ondrain=()=>e[NC](),r.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},QU=class extends Wx{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(e,r,o){super(e,r,o),this.proxyErrors=a=>r.emit("error",a),e.on("error",this.proxyErrors)}};Fue.exports=class kue extends Due{constructor(e){super(),this[Gx]=!1,this[P1]=!1,this.pipes=[],this.buffer=[],this[bo]=e&&e.objectMode||!1,this[bo]?this[Qa]=null:this[Qa]=e&&e.encoding||null,this[Qa]==="buffer"&&(this[Qa]=null),this[_f]=e&&!!e.async||!1,this[Uf]=this[Qa]?new Sue(this[Qa]):null,this[Of]=!1,this[A0]=!1,this[Hx]=!1,this[qx]=!1,this[S1]=null,this.writable=!0,this.readable=!0,this[Ss]=0,this[Qo]=!1}get bufferLength(){return this[Ss]}get encoding(){return this[Qa]}set encoding(e){if(this[bo])throw new Error("cannot set encoding in objectMode");if(this[Qa]&&e!==this[Qa]&&(this[Uf]&&this[Uf].lastNeed||this[Ss]))throw new Error("cannot change encoding");this[Qa]!==e&&(this[Uf]=e?new Sue(e):null,this.buffer.length&&(this.buffer=this.buffer.map(r=>this[Uf].write(r)))),this[Qa]=e}setEncoding(e){this.encoding=e}get objectMode(){return this[bo]}set objectMode(e){this[bo]=this[bo]||!!e}get async(){return this[_f]}set async(e){this[_f]=this[_f]||!!e}write(e,r,o){if(this[Of])throw new Error("write after end");if(this[Qo])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof r=="function"&&(o=r,r="utf8"),r||(r="utf8");let a=this[_f]?x1:n=>n();return!this[bo]&&!Buffer.isBuffer(e)&&($ot(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):Zot(e)?e=Buffer.from(e):typeof e!="string"&&(this.objectMode=!0)),this[bo]?(this.flowing&&this[Ss]!==0&&this[jx](!0),this.flowing?this.emit("data",e):this[SU](e),this[Ss]!==0&&this.emit("readable"),o&&a(o),this.flowing):e.length?(typeof e=="string"&&!(r===this[Qa]&&!this[Uf].lastNeed)&&(e=Buffer.from(e,r)),Buffer.isBuffer(e)&&this[Qa]&&(e=this[Uf].write(e)),this.flowing&&this[Ss]!==0&&this[jx](!0),this.flowing?this.emit("data",e):this[SU](e),this[Ss]!==0&&this.emit("readable"),o&&a(o),this.flowing):(this[Ss]!==0&&this.emit("readable"),o&&a(o),this.flowing)}read(e){if(this[Qo])return null;if(this[Ss]===0||e===0||e>this[Ss])return this[Mf](),null;this[bo]&&(e=null),this.buffer.length>1&&!this[bo]&&(this.encoding?this.buffer=[this.buffer.join("")]:this.buffer=[Buffer.concat(this.buffer,this[Ss])]);let r=this[Pue](e||null,this.buffer[0]);return this[Mf](),r}[Pue](e,r){return e===r.length||e===null?this[PU]():(this.buffer[0]=r.slice(e),r=r.slice(0,e),this[Ss]-=e),this.emit("data",r),!this.buffer.length&&!this[Of]&&this.emit("drain"),r}end(e,r,o){return typeof e=="function"&&(o=e,e=null),typeof r=="function"&&(o=r,r="utf8"),e&&this.write(e,r),o&&this.once("end",o),this[Of]=!0,this.writable=!1,(this.flowing||!this[P1])&&this[Mf](),this}[NC](){this[Qo]||(this[P1]=!1,this[Gx]=!0,this.emit("resume"),this.buffer.length?this[jx]():this[Of]?this[Mf]():this.emit("drain"))}resume(){return this[NC]()}pause(){this[Gx]=!1,this[P1]=!0}get destroyed(){return this[Qo]}get flowing(){return this[Gx]}get paused(){return this[P1]}[SU](e){this[bo]?this[Ss]+=1:this[Ss]+=e.length,this.buffer.push(e)}[PU](){return this.buffer.length&&(this[bo]?this[Ss]-=1:this[Ss]-=this.buffer[0].length),this.buffer.shift()}[jx](e){do;while(this[xue](this[PU]()));!e&&!this.buffer.length&&!this[Of]&&this.emit("drain")}[xue](e){return e?(this.emit("data",e),this.flowing):!1}pipe(e,r){if(this[Qo])return;let o=this[A0];return r=r||{},e===vue.stdout||e===vue.stderr?r.end=!1:r.end=r.end!==!1,r.proxyErrors=!!r.proxyErrors,o?r.end&&e.end():(this.pipes.push(r.proxyErrors?new QU(this,e,r):new Wx(this,e,r)),this[_f]?x1(()=>this[NC]()):this[NC]()),e}unpipe(e){let r=this.pipes.find(o=>o.dest===e);r&&(this.pipes.splice(this.pipes.indexOf(r),1),r.unpipe())}addListener(e,r){return this.on(e,r)}on(e,r){let o=super.on(e,r);return e==="data"&&!this.pipes.length&&!this.flowing?this[NC]():e==="readable"&&this[Ss]!==0?super.emit("readable"):Xot(e)&&this[A0]?(super.emit(e),this.removeAllListeners(e)):e==="error"&&this[S1]&&(this[_f]?x1(()=>r.call(this,this[S1])):r.call(this,this[S1])),o}get emittedEnd(){return this[A0]}[Mf](){!this[Hx]&&!this[A0]&&!this[Qo]&&this.buffer.length===0&&this[Of]&&(this[Hx]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[qx]&&this.emit("close"),this[Hx]=!1)}emit(e,r,...o){if(e!=="error"&&e!=="close"&&e!==Qo&&this[Qo])return;if(e==="data")return r?this[_f]?x1(()=>this[xU](r)):this[xU](r):!1;if(e==="end")return this[bue]();if(e==="close"){if(this[qx]=!0,!this[A0]&&!this[Qo])return;let n=super.emit("close");return this.removeAllListeners("close"),n}else if(e==="error"){this[S1]=r;let n=super.emit("error",r);return this[Mf](),n}else if(e==="resume"){let n=super.emit("resume");return this[Mf](),n}else if(e==="finish"||e==="prefinish"){let n=super.emit(e);return this.removeAllListeners(e),n}let a=super.emit(e,r,...o);return this[Mf](),a}[xU](e){for(let o of this.pipes)o.dest.write(e)===!1&&this.pause();let r=super.emit("data",e);return this[Mf](),r}[bue](){this[A0]||(this[A0]=!0,this.readable=!1,this[_f]?x1(()=>this[bU]()):this[bU]())}[bU](){if(this[Uf]){let r=this[Uf].end();if(r){for(let o of this.pipes)o.dest.write(r);super.emit("data",r)}}for(let r of this.pipes)r.end();let e=super.emit("end");return this.removeAllListeners("end"),e}collect(){let e=[];this[bo]||(e.dataLength=0);let r=this.promise();return this.on("data",o=>{e.push(o),this[bo]||(e.dataLength+=o.length)}),r.then(()=>e)}concat(){return this[bo]?Promise.reject(new Error("cannot concat in objectMode")):this.collect().then(e=>this[bo]?Promise.reject(new Error("cannot concat in objectMode")):this[Qa]?e.join(""):Buffer.concat(e,e.dataLength))}promise(){return new Promise((e,r)=>{this.on(Qo,()=>r(new Error("stream destroyed"))),this.on("error",o=>r(o)),this.on("end",()=>e())})}[Jot](){return{next:()=>{let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[Of])return Promise.resolve({done:!0});let o=null,a=null,n=h=>{this.removeListener("data",u),this.removeListener("end",A),a(h)},u=h=>{this.removeListener("error",n),this.removeListener("end",A),this.pause(),o({value:h,done:!!this[Of]})},A=()=>{this.removeListener("error",n),this.removeListener("data",u),o({done:!0})},p=()=>n(new Error("stream destroyed"));return new Promise((h,E)=>{a=E,o=h,this.once(Qo,p),this.once("error",n),this.once("end",A),this.once("data",u)})}}}[zot](){return{next:()=>{let r=this.read();return{value:r,done:r===null}}}}destroy(e){return this[Qo]?(e?this.emit("error",e):this.emit(Qo),this):(this[Qo]=!0,this.buffer.length=0,this[Ss]=0,typeof this.close=="function"&&!this[qx]&&this.close(),e?this.emit("error",e):this.emit(Qo),this)}static isStream(e){return!!e&&(e instanceof kue||e instanceof Due||e instanceof Vot&&(typeof e.pipe=="function"||typeof e.write=="function"&&typeof e.end=="function"))}}});var Tue=U((GMt,Rue)=>{var eat=Ie("zlib").constants||{ZLIB_VERNUM:4736};Rue.exports=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:1/0,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},eat))});var YU=U(Al=>{"use strict";var NU=Ie("assert"),f0=Ie("buffer").Buffer,Oue=Ie("zlib"),Td=Al.constants=Tue(),tat=LC(),Nue=f0.concat,Nd=Symbol("_superWrite"),MC=class extends Error{constructor(e){super("zlib: "+e.message),this.code=e.code,this.errno=e.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+e.message,Error.captureStackTrace(this,this.constructor)}get name(){return"ZlibError"}},rat=Symbol("opts"),b1=Symbol("flushFlag"),Lue=Symbol("finishFlushFlag"),WU=Symbol("fullFlushFlag"),zn=Symbol("handle"),Yx=Symbol("onError"),OC=Symbol("sawError"),kU=Symbol("level"),FU=Symbol("strategy"),RU=Symbol("ended"),WMt=Symbol("_defaultFullFlush"),Kx=class extends tat{constructor(e,r){if(!e||typeof e!="object")throw new TypeError("invalid options for ZlibBase constructor");super(e),this[OC]=!1,this[RU]=!1,this[rat]=e,this[b1]=e.flush,this[Lue]=e.finishFlush;try{this[zn]=new Oue[r](e)}catch(o){throw new MC(o)}this[Yx]=o=>{this[OC]||(this[OC]=!0,this.close(),this.emit("error",o))},this[zn].on("error",o=>this[Yx](new MC(o))),this.once("end",()=>this.close)}close(){this[zn]&&(this[zn].close(),this[zn]=null,this.emit("close"))}reset(){if(!this[OC])return NU(this[zn],"zlib binding closed"),this[zn].reset()}flush(e){this.ended||(typeof e!="number"&&(e=this[WU]),this.write(Object.assign(f0.alloc(0),{[b1]:e})))}end(e,r,o){return e&&this.write(e,r),this.flush(this[Lue]),this[RU]=!0,super.end(null,null,o)}get ended(){return this[RU]}write(e,r,o){if(typeof r=="function"&&(o=r,r="utf8"),typeof e=="string"&&(e=f0.from(e,r)),this[OC])return;NU(this[zn],"zlib binding closed");let a=this[zn]._handle,n=a.close;a.close=()=>{};let u=this[zn].close;this[zn].close=()=>{},f0.concat=h=>h;let A;try{let h=typeof e[b1]=="number"?e[b1]:this[b1];A=this[zn]._processChunk(e,h),f0.concat=Nue}catch(h){f0.concat=Nue,this[Yx](new MC(h))}finally{this[zn]&&(this[zn]._handle=a,a.close=n,this[zn].close=u,this[zn].removeAllListeners("error"))}this[zn]&&this[zn].on("error",h=>this[Yx](new MC(h)));let p;if(A)if(Array.isArray(A)&&A.length>0){p=this[Nd](f0.from(A[0]));for(let h=1;h{this.flush(a),n()};try{this[zn].params(e,r)}finally{this[zn].flush=o}this[zn]&&(this[kU]=e,this[FU]=r)}}}},LU=class extends Hf{constructor(e){super(e,"Deflate")}},OU=class extends Hf{constructor(e){super(e,"Inflate")}},TU=Symbol("_portable"),MU=class extends Hf{constructor(e){super(e,"Gzip"),this[TU]=e&&!!e.portable}[Nd](e){return this[TU]?(this[TU]=!1,e[9]=255,super[Nd](e)):super[Nd](e)}},UU=class extends Hf{constructor(e){super(e,"Gunzip")}},_U=class extends Hf{constructor(e){super(e,"DeflateRaw")}},HU=class extends Hf{constructor(e){super(e,"InflateRaw")}},qU=class extends Hf{constructor(e){super(e,"Unzip")}},Vx=class extends Kx{constructor(e,r){e=e||{},e.flush=e.flush||Td.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||Td.BROTLI_OPERATION_FINISH,super(e,r),this[WU]=Td.BROTLI_OPERATION_FLUSH}},jU=class extends Vx{constructor(e){super(e,"BrotliCompress")}},GU=class extends Vx{constructor(e){super(e,"BrotliDecompress")}};Al.Deflate=LU;Al.Inflate=OU;Al.Gzip=MU;Al.Gunzip=UU;Al.DeflateRaw=_U;Al.InflateRaw=HU;Al.Unzip=qU;typeof Oue.BrotliCompress=="function"?(Al.BrotliCompress=jU,Al.BrotliDecompress=GU):Al.BrotliCompress=Al.BrotliDecompress=class{constructor(){throw new Error("Brotli is not supported in this version of Node.js")}}});var UC=U((VMt,Mue)=>{var nat=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform;Mue.exports=nat!=="win32"?t=>t:t=>t&&t.replace(/\\/g,"/")});var Jx=U((zMt,Uue)=>{"use strict";var iat=LC(),KU=UC(),VU=Symbol("slurp");Uue.exports=class extends iat{constructor(e,r,o){switch(super(),this.pause(),this.extended=r,this.globalExtended=o,this.header=e,this.startBlockSize=512*Math.ceil(e.size/512),this.blockRemain=this.startBlockSize,this.remain=e.size,this.type=e.type,this.meta=!1,this.ignore=!1,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}this.path=KU(e.path),this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=e.size,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=KU(e.linkpath),this.uname=e.uname,this.gname=e.gname,r&&this[VU](r),o&&this[VU](o,!0)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");let o=this.remain,a=this.blockRemain;return this.remain=Math.max(0,o-r),this.blockRemain=Math.max(0,a-r),this.ignore?!0:o>=r?super.write(e):super.write(e.slice(0,o))}[VU](e,r){for(let o in e)e[o]!==null&&e[o]!==void 0&&!(r&&o==="path")&&(this[o]=o==="path"||o==="linkpath"?KU(e[o]):e[o])}}});var JU=U(zx=>{"use strict";zx.name=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]);zx.code=new Map(Array.from(zx.name).map(t=>[t[1],t[0]]))});var jue=U((ZMt,que)=>{"use strict";var sat=(t,e)=>{if(Number.isSafeInteger(t))t<0?aat(t,e):oat(t,e);else throw Error("cannot encode number outside of javascript safe integer range");return e},oat=(t,e)=>{e[0]=128;for(var r=e.length;r>1;r--)e[r-1]=t&255,t=Math.floor(t/256)},aat=(t,e)=>{e[0]=255;var r=!1;t=t*-1;for(var o=e.length;o>1;o--){var a=t&255;t=Math.floor(t/256),r?e[o-1]=_ue(a):a===0?e[o-1]=0:(r=!0,e[o-1]=Hue(a))}},lat=t=>{let e=t[0],r=e===128?uat(t.slice(1,t.length)):e===255?cat(t):null;if(r===null)throw Error("invalid base256 encoding");if(!Number.isSafeInteger(r))throw Error("parsed number outside of javascript safe integer range");return r},cat=t=>{for(var e=t.length,r=0,o=!1,a=e-1;a>-1;a--){var n=t[a],u;o?u=_ue(n):n===0?u=n:(o=!0,u=Hue(n)),u!==0&&(r-=u*Math.pow(256,e-a-1))}return r},uat=t=>{for(var e=t.length,r=0,o=e-1;o>-1;o--){var a=t[o];a!==0&&(r+=a*Math.pow(256,e-o-1))}return r},_ue=t=>(255^t)&255,Hue=t=>(255^t)+1&255;que.exports={encode:sat,parse:lat}});var HC=U(($Mt,Wue)=>{"use strict";var zU=JU(),_C=Ie("path").posix,Gue=jue(),XU=Symbol("slurp"),fl=Symbol("type"),e3=class{constructor(e,r,o,a){this.cksumValid=!1,this.needPax=!1,this.nullBlock=!1,this.block=null,this.path=null,this.mode=null,this.uid=null,this.gid=null,this.size=null,this.mtime=null,this.cksum=null,this[fl]="0",this.linkpath=null,this.uname=null,this.gname=null,this.devmaj=0,this.devmin=0,this.atime=null,this.ctime=null,Buffer.isBuffer(e)?this.decode(e,r||0,o,a):e&&this.set(e)}decode(e,r,o,a){if(r||(r=0),!e||!(e.length>=r+512))throw new Error("need 512 bytes for header");if(this.path=Ld(e,r,100),this.mode=p0(e,r+100,8),this.uid=p0(e,r+108,8),this.gid=p0(e,r+116,8),this.size=p0(e,r+124,12),this.mtime=ZU(e,r+136,12),this.cksum=p0(e,r+148,12),this[XU](o),this[XU](a,!0),this[fl]=Ld(e,r+156,1),this[fl]===""&&(this[fl]="0"),this[fl]==="0"&&this.path.substr(-1)==="/"&&(this[fl]="5"),this[fl]==="5"&&(this.size=0),this.linkpath=Ld(e,r+157,100),e.slice(r+257,r+265).toString()==="ustar\x0000")if(this.uname=Ld(e,r+265,32),this.gname=Ld(e,r+297,32),this.devmaj=p0(e,r+329,8),this.devmin=p0(e,r+337,8),e[r+475]!==0){let u=Ld(e,r+345,155);this.path=u+"/"+this.path}else{let u=Ld(e,r+345,130);u&&(this.path=u+"/"+this.path),this.atime=ZU(e,r+476,12),this.ctime=ZU(e,r+488,12)}let n=8*32;for(let u=r;u=r+512))throw new Error("need 512 bytes for header");let o=this.ctime||this.atime?130:155,a=Aat(this.path||"",o),n=a[0],u=a[1];this.needPax=a[2],this.needPax=Od(e,r,100,n)||this.needPax,this.needPax=h0(e,r+100,8,this.mode)||this.needPax,this.needPax=h0(e,r+108,8,this.uid)||this.needPax,this.needPax=h0(e,r+116,8,this.gid)||this.needPax,this.needPax=h0(e,r+124,12,this.size)||this.needPax,this.needPax=$U(e,r+136,12,this.mtime)||this.needPax,e[r+156]=this[fl].charCodeAt(0),this.needPax=Od(e,r+157,100,this.linkpath)||this.needPax,e.write("ustar\x0000",r+257,8),this.needPax=Od(e,r+265,32,this.uname)||this.needPax,this.needPax=Od(e,r+297,32,this.gname)||this.needPax,this.needPax=h0(e,r+329,8,this.devmaj)||this.needPax,this.needPax=h0(e,r+337,8,this.devmin)||this.needPax,this.needPax=Od(e,r+345,o,u)||this.needPax,e[r+475]!==0?this.needPax=Od(e,r+345,155,u)||this.needPax:(this.needPax=Od(e,r+345,130,u)||this.needPax,this.needPax=$U(e,r+476,12,this.atime)||this.needPax,this.needPax=$U(e,r+488,12,this.ctime)||this.needPax);let A=8*32;for(let p=r;p{let o=t,a="",n,u=_C.parse(t).root||".";if(Buffer.byteLength(o)<100)n=[o,a,!1];else{a=_C.dirname(o),o=_C.basename(o);do Buffer.byteLength(o)<=100&&Buffer.byteLength(a)<=e?n=[o,a,!1]:Buffer.byteLength(o)>100&&Buffer.byteLength(a)<=e?n=[o.substr(0,100-1),a,!0]:(o=_C.join(_C.basename(a),o),a=_C.dirname(a));while(a!==u&&!n);n||(n=[t.substr(0,100-1),"",!0])}return n},Ld=(t,e,r)=>t.slice(e,e+r).toString("utf8").replace(/\0.*/,""),ZU=(t,e,r)=>fat(p0(t,e,r)),fat=t=>t===null?null:new Date(t*1e3),p0=(t,e,r)=>t[e]&128?Gue.parse(t.slice(e,e+r)):hat(t,e,r),pat=t=>isNaN(t)?null:t,hat=(t,e,r)=>pat(parseInt(t.slice(e,e+r).toString("utf8").replace(/\0.*$/,"").trim(),8)),gat={12:8589934591,8:2097151},h0=(t,e,r,o)=>o===null?!1:o>gat[r]||o<0?(Gue.encode(o,t.slice(e,e+r)),!0):(dat(t,e,r,o),!1),dat=(t,e,r,o)=>t.write(mat(o,r),e,r,"ascii"),mat=(t,e)=>yat(Math.floor(t).toString(8),e),yat=(t,e)=>(t.length===e-1?t:new Array(e-t.length-1).join("0")+t+" ")+"\0",$U=(t,e,r,o)=>o===null?!1:h0(t,e,r,o.getTime()/1e3),Cat=new Array(156).join("\0"),Od=(t,e,r,o)=>o===null?!1:(t.write(o+Cat,e,r,"utf8"),o.length!==Buffer.byteLength(o)||o.length>r);Wue.exports=e3});var Xx=U((e4t,Yue)=>{"use strict";var Eat=HC(),Iat=Ie("path"),Q1=class{constructor(e,r){this.atime=e.atime||null,this.charset=e.charset||null,this.comment=e.comment||null,this.ctime=e.ctime||null,this.gid=e.gid||null,this.gname=e.gname||null,this.linkpath=e.linkpath||null,this.mtime=e.mtime||null,this.path=e.path||null,this.size=e.size||null,this.uid=e.uid||null,this.uname=e.uname||null,this.dev=e.dev||null,this.ino=e.ino||null,this.nlink=e.nlink||null,this.global=r||!1}encode(){let e=this.encodeBody();if(e==="")return null;let r=Buffer.byteLength(e),o=512*Math.ceil(1+r/512),a=Buffer.allocUnsafe(o);for(let n=0;n<512;n++)a[n]=0;new Eat({path:("PaxHeader/"+Iat.basename(this.path)).slice(0,99),mode:this.mode||420,uid:this.uid||null,gid:this.gid||null,size:r,mtime:this.mtime||null,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime||null,ctime:this.ctime||null}).encode(a),a.write(e,512,r,"utf8");for(let n=r+512;n=Math.pow(10,n)&&(n+=1),n+a+o}};Q1.parse=(t,e,r)=>new Q1(wat(Bat(t),e),r);var wat=(t,e)=>e?Object.keys(t).reduce((r,o)=>(r[o]=t[o],r),e):t,Bat=t=>t.replace(/\n$/,"").split(` +`).reduce(vat,Object.create(null)),vat=(t,e)=>{let r=parseInt(e,10);if(r!==Buffer.byteLength(e)+1)return t;e=e.substr((r+" ").length);let o=e.split("="),a=o.shift().replace(/^SCHILY\.(dev|ino|nlink)/,"$1");if(!a)return t;let n=o.join("=");return t[a]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(a)?new Date(n*1e3):/^[0-9]+$/.test(n)?+n:n,t};Yue.exports=Q1});var qC=U((t4t,Kue)=>{Kue.exports=t=>{let e=t.length-1,r=-1;for(;e>-1&&t.charAt(e)==="/";)r=e,e--;return r===-1?t:t.slice(0,r)}});var Zx=U((r4t,Vue)=>{"use strict";Vue.exports=t=>class extends t{warn(e,r,o={}){this.file&&(o.file=this.file),this.cwd&&(o.cwd=this.cwd),o.code=r instanceof Error&&r.code||e,o.tarCode=e,!this.strict&&o.recoverable!==!1?(r instanceof Error&&(o=Object.assign(r,o),r=r.message),this.emit("warn",o.tarCode,r,o)):r instanceof Error?this.emit("error",Object.assign(r,o)):this.emit("error",Object.assign(new Error(`${e}: ${r}`),o))}}});var r3=U((i4t,Jue)=>{"use strict";var $x=["|","<",">","?",":"],t3=$x.map(t=>String.fromCharCode(61440+t.charCodeAt(0))),Dat=new Map($x.map((t,e)=>[t,t3[e]])),Sat=new Map(t3.map((t,e)=>[t,$x[e]]));Jue.exports={encode:t=>$x.reduce((e,r)=>e.split(r).join(Dat.get(r)),t),decode:t=>t3.reduce((e,r)=>e.split(r).join(Sat.get(r)),t)}});var n3=U((s4t,Xue)=>{var{isAbsolute:Pat,parse:zue}=Ie("path").win32;Xue.exports=t=>{let e="",r=zue(t);for(;Pat(t)||r.root;){let o=t.charAt(0)==="/"&&t.slice(0,4)!=="//?/"?"/":r.root;t=t.substr(o.length),e+=o,r=zue(t)}return[e,t]}});var $ue=U((o4t,Zue)=>{"use strict";Zue.exports=(t,e,r)=>(t&=4095,r&&(t=(t|384)&-19),e&&(t&256&&(t|=64),t&32&&(t|=8),t&4&&(t|=1)),t)});var p3=U((c4t,pAe)=>{"use strict";var oAe=LC(),aAe=Xx(),lAe=HC(),lA=Ie("fs"),eAe=Ie("path"),aA=UC(),xat=qC(),cAe=(t,e)=>e?(t=aA(t).replace(/^\.(\/|$)/,""),xat(e)+"/"+t):aA(t),bat=16*1024*1024,tAe=Symbol("process"),rAe=Symbol("file"),nAe=Symbol("directory"),s3=Symbol("symlink"),iAe=Symbol("hardlink"),k1=Symbol("header"),eb=Symbol("read"),o3=Symbol("lstat"),tb=Symbol("onlstat"),a3=Symbol("onread"),l3=Symbol("onreadlink"),c3=Symbol("openfile"),u3=Symbol("onopenfile"),g0=Symbol("close"),rb=Symbol("mode"),A3=Symbol("awaitDrain"),i3=Symbol("ondrain"),cA=Symbol("prefix"),sAe=Symbol("hadError"),uAe=Zx(),Qat=r3(),AAe=n3(),fAe=$ue(),nb=uAe(class extends oAe{constructor(e,r){if(r=r||{},super(r),typeof e!="string")throw new TypeError("path is required");this.path=aA(e),this.portable=!!r.portable,this.myuid=process.getuid&&process.getuid()||0,this.myuser=process.env.USER||"",this.maxReadSize=r.maxReadSize||bat,this.linkCache=r.linkCache||new Map,this.statCache=r.statCache||new Map,this.preservePaths=!!r.preservePaths,this.cwd=aA(r.cwd||process.cwd()),this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.mtime=r.mtime||null,this.prefix=r.prefix?aA(r.prefix):null,this.fd=null,this.blockLen=null,this.blockRemain=null,this.buf=null,this.offset=null,this.length=null,this.pos=null,this.remain=null,typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let o=!1;if(!this.preservePaths){let[a,n]=AAe(this.path);a&&(this.path=n,o=a)}this.win32=!!r.win32||process.platform==="win32",this.win32&&(this.path=Qat.decode(this.path.replace(/\\/g,"/")),e=e.replace(/\\/g,"/")),this.absolute=aA(r.absolute||eAe.resolve(this.cwd,e)),this.path===""&&(this.path="./"),o&&this.warn("TAR_ENTRY_INFO",`stripping ${o} from absolute path`,{entry:this,path:o+this.path}),this.statCache.has(this.absolute)?this[tb](this.statCache.get(this.absolute)):this[o3]()}emit(e,...r){return e==="error"&&(this[sAe]=!0),super.emit(e,...r)}[o3](){lA.lstat(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[tb](r)})}[tb](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=Fat(e),this.emit("stat",e),this[tAe]()}[tAe](){switch(this.type){case"File":return this[rAe]();case"Directory":return this[nAe]();case"SymbolicLink":return this[s3]();default:return this.end()}}[rb](e){return fAe(e,this.type==="Directory",this.portable)}[cA](e){return cAe(e,this.prefix)}[k1](){this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.header=new lAe({path:this[cA](this.path),linkpath:this.type==="Link"?this[cA](this.linkpath):this.linkpath,mode:this[rb](this.stat.mode),uid:this.portable?null:this.stat.uid,gid:this.portable?null:this.stat.gid,size:this.stat.size,mtime:this.noMtime?null:this.mtime||this.stat.mtime,type:this.type,uname:this.portable?null:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?null:this.stat.atime,ctime:this.portable?null:this.stat.ctime}),this.header.encode()&&!this.noPax&&super.write(new aAe({atime:this.portable?null:this.header.atime,ctime:this.portable?null:this.header.ctime,gid:this.portable?null:this.header.gid,mtime:this.noMtime?null:this.mtime||this.header.mtime,path:this[cA](this.path),linkpath:this.type==="Link"?this[cA](this.linkpath):this.linkpath,size:this.header.size,uid:this.portable?null:this.header.uid,uname:this.portable?null:this.header.uname,dev:this.portable?null:this.stat.dev,ino:this.portable?null:this.stat.ino,nlink:this.portable?null:this.stat.nlink}).encode()),super.write(this.header.block)}[nAe](){this.path.substr(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[k1](),this.end()}[s3](){lA.readlink(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[l3](r)})}[l3](e){this.linkpath=aA(e),this[k1](),this.end()}[iAe](e){this.type="Link",this.linkpath=aA(eAe.relative(this.cwd,e)),this.stat.size=0,this[k1](),this.end()}[rAe](){if(this.stat.nlink>1){let e=this.stat.dev+":"+this.stat.ino;if(this.linkCache.has(e)){let r=this.linkCache.get(e);if(r.indexOf(this.cwd)===0)return this[iAe](r)}this.linkCache.set(e,this.absolute)}if(this[k1](),this.stat.size===0)return this.end();this[c3]()}[c3](){lA.open(this.absolute,"r",(e,r)=>{if(e)return this.emit("error",e);this[u3](r)})}[u3](e){if(this.fd=e,this[sAe])return this[g0]();this.blockLen=512*Math.ceil(this.stat.size/512),this.blockRemain=this.blockLen;let r=Math.min(this.blockLen,this.maxReadSize);this.buf=Buffer.allocUnsafe(r),this.offset=0,this.pos=0,this.remain=this.stat.size,this.length=this.buf.length,this[eb]()}[eb](){let{fd:e,buf:r,offset:o,length:a,pos:n}=this;lA.read(e,r,o,a,n,(u,A)=>{if(u)return this[g0](()=>this.emit("error",u));this[a3](A)})}[g0](e){lA.close(this.fd,e)}[a3](e){if(e<=0&&this.remain>0){let a=new Error("encountered unexpected EOF");return a.path=this.absolute,a.syscall="read",a.code="EOF",this[g0](()=>this.emit("error",a))}if(e>this.remain){let a=new Error("did not encounter expected EOF");return a.path=this.absolute,a.syscall="read",a.code="EOF",this[g0](()=>this.emit("error",a))}if(e===this.remain)for(let a=e;athis[i3]())}[A3](e){this.once("drain",e)}write(e){if(this.blockRemaine?this.emit("error",e):this.end());this.offset>=this.length&&(this.buf=Buffer.allocUnsafe(Math.min(this.blockRemain,this.buf.length)),this.offset=0),this.length=this.buf.length-this.offset,this[eb]()}}),f3=class extends nb{[o3](){this[tb](lA.lstatSync(this.absolute))}[s3](){this[l3](lA.readlinkSync(this.absolute))}[c3](){this[u3](lA.openSync(this.absolute,"r"))}[eb](){let e=!0;try{let{fd:r,buf:o,offset:a,length:n,pos:u}=this,A=lA.readSync(r,o,a,n,u);this[a3](A),e=!1}finally{if(e)try{this[g0](()=>{})}catch{}}}[A3](e){e()}[g0](e){lA.closeSync(this.fd),e()}},kat=uAe(class extends oAe{constructor(e,r){r=r||{},super(r),this.preservePaths=!!r.preservePaths,this.portable=!!r.portable,this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.readEntry=e,this.type=e.type,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.prefix=r.prefix||null,this.path=aA(e.path),this.mode=this[rb](e.mode),this.uid=this.portable?null:e.uid,this.gid=this.portable?null:e.gid,this.uname=this.portable?null:e.uname,this.gname=this.portable?null:e.gname,this.size=e.size,this.mtime=this.noMtime?null:r.mtime||e.mtime,this.atime=this.portable?null:e.atime,this.ctime=this.portable?null:e.ctime,this.linkpath=aA(e.linkpath),typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let o=!1;if(!this.preservePaths){let[a,n]=AAe(this.path);a&&(this.path=n,o=a)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.header=new lAe({path:this[cA](this.path),linkpath:this.type==="Link"?this[cA](this.linkpath):this.linkpath,mode:this.mode,uid:this.portable?null:this.uid,gid:this.portable?null:this.gid,size:this.size,mtime:this.noMtime?null:this.mtime,type:this.type,uname:this.portable?null:this.uname,atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime}),o&&this.warn("TAR_ENTRY_INFO",`stripping ${o} from absolute path`,{entry:this,path:o+this.path}),this.header.encode()&&!this.noPax&&super.write(new aAe({atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime,gid:this.portable?null:this.gid,mtime:this.noMtime?null:this.mtime,path:this[cA](this.path),linkpath:this.type==="Link"?this[cA](this.linkpath):this.linkpath,size:this.size,uid:this.portable?null:this.uid,uname:this.portable?null:this.uname,dev:this.portable?null:this.readEntry.dev,ino:this.portable?null:this.readEntry.ino,nlink:this.portable?null:this.readEntry.nlink}).encode()),super.write(this.header.block),e.pipe(this)}[cA](e){return cAe(e,this.prefix)}[rb](e){return fAe(e,this.type==="Directory",this.portable)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=r,super.write(e)}end(){return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),super.end()}});nb.Sync=f3;nb.Tar=kat;var Fat=t=>t.isFile()?"File":t.isDirectory()?"Directory":t.isSymbolicLink()?"SymbolicLink":"Unsupported";pAe.exports=nb});var pb=U((A4t,EAe)=>{"use strict";var Ab=class{constructor(e,r){this.path=e||"./",this.absolute=r,this.entry=null,this.stat=null,this.readdir=null,this.pending=!1,this.ignore=!1,this.piped=!1}},Rat=LC(),Tat=YU(),Nat=Jx(),w3=p3(),Lat=w3.Sync,Oat=w3.Tar,Mat=AS(),hAe=Buffer.alloc(1024),ob=Symbol("onStat"),ib=Symbol("ended"),uA=Symbol("queue"),jC=Symbol("current"),Md=Symbol("process"),sb=Symbol("processing"),gAe=Symbol("processJob"),AA=Symbol("jobs"),h3=Symbol("jobDone"),ab=Symbol("addFSEntry"),dAe=Symbol("addTarEntry"),y3=Symbol("stat"),C3=Symbol("readdir"),lb=Symbol("onreaddir"),ub=Symbol("pipe"),mAe=Symbol("entry"),g3=Symbol("entryOpt"),E3=Symbol("writeEntryClass"),CAe=Symbol("write"),d3=Symbol("ondrain"),fb=Ie("fs"),yAe=Ie("path"),Uat=Zx(),m3=UC(),B3=Uat(class extends Rat{constructor(e){super(e),e=e||Object.create(null),this.opt=e,this.file=e.file||"",this.cwd=e.cwd||process.cwd(),this.maxReadSize=e.maxReadSize,this.preservePaths=!!e.preservePaths,this.strict=!!e.strict,this.noPax=!!e.noPax,this.prefix=m3(e.prefix||""),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this[E3]=w3,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),this.portable=!!e.portable,this.zip=null,e.gzip?(typeof e.gzip!="object"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new Tat.Gzip(e.gzip),this.zip.on("data",r=>super.write(r)),this.zip.on("end",r=>super.end()),this.zip.on("drain",r=>this[d3]()),this.on("resume",r=>this.zip.resume())):this.on("drain",this[d3]),this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,this.mtime=e.mtime||null,this.filter=typeof e.filter=="function"?e.filter:r=>!0,this[uA]=new Mat,this[AA]=0,this.jobs=+e.jobs||4,this[sb]=!1,this[ib]=!1}[CAe](e){return super.write(e)}add(e){return this.write(e),this}end(e){return e&&this.write(e),this[ib]=!0,this[Md](),this}write(e){if(this[ib])throw new Error("write after end");return e instanceof Nat?this[dAe](e):this[ab](e),this.flowing}[dAe](e){let r=m3(yAe.resolve(this.cwd,e.path));if(!this.filter(e.path,e))e.resume();else{let o=new Ab(e.path,r,!1);o.entry=new Oat(e,this[g3](o)),o.entry.on("end",a=>this[h3](o)),this[AA]+=1,this[uA].push(o)}this[Md]()}[ab](e){let r=m3(yAe.resolve(this.cwd,e));this[uA].push(new Ab(e,r)),this[Md]()}[y3](e){e.pending=!0,this[AA]+=1;let r=this.follow?"stat":"lstat";fb[r](e.absolute,(o,a)=>{e.pending=!1,this[AA]-=1,o?this.emit("error",o):this[ob](e,a)})}[ob](e,r){this.statCache.set(e.absolute,r),e.stat=r,this.filter(e.path,r)||(e.ignore=!0),this[Md]()}[C3](e){e.pending=!0,this[AA]+=1,fb.readdir(e.absolute,(r,o)=>{if(e.pending=!1,this[AA]-=1,r)return this.emit("error",r);this[lb](e,o)})}[lb](e,r){this.readdirCache.set(e.absolute,r),e.readdir=r,this[Md]()}[Md](){if(!this[sb]){this[sb]=!0;for(let e=this[uA].head;e!==null&&this[AA]this.warn(r,o,a),noPax:this.noPax,cwd:this.cwd,absolute:e.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime,prefix:this.prefix}}[mAe](e){this[AA]+=1;try{return new this[E3](e.path,this[g3](e)).on("end",()=>this[h3](e)).on("error",r=>this.emit("error",r))}catch(r){this.emit("error",r)}}[d3](){this[jC]&&this[jC].entry&&this[jC].entry.resume()}[ub](e){e.piped=!0,e.readdir&&e.readdir.forEach(a=>{let n=e.path,u=n==="./"?"":n.replace(/\/*$/,"/");this[ab](u+a)});let r=e.entry,o=this.zip;o?r.on("data",a=>{o.write(a)||r.pause()}):r.on("data",a=>{super.write(a)||r.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}}),I3=class extends B3{constructor(e){super(e),this[E3]=Lat}pause(){}resume(){}[y3](e){let r=this.follow?"statSync":"lstatSync";this[ob](e,fb[r](e.absolute))}[C3](e,r){this[lb](e,fb.readdirSync(e.absolute))}[ub](e){let r=e.entry,o=this.zip;e.readdir&&e.readdir.forEach(a=>{let n=e.path,u=n==="./"?"":n.replace(/\/*$/,"/");this[ab](u+a)}),o?r.on("data",a=>{o.write(a)}):r.on("data",a=>{super[CAe](a)})}};B3.Sync=I3;EAe.exports=B3});var XC=U(R1=>{"use strict";var _at=LC(),Hat=Ie("events").EventEmitter,ka=Ie("fs"),S3=ka.writev;if(!S3){let t=process.binding("fs"),e=t.FSReqWrap||t.FSReqCallback;S3=(r,o,a,n)=>{let u=(p,h)=>n(p,h,o),A=new e;A.oncomplete=u,t.writeBuffers(r,o,a,A)}}var JC=Symbol("_autoClose"),Jc=Symbol("_close"),F1=Symbol("_ended"),Mn=Symbol("_fd"),IAe=Symbol("_finished"),m0=Symbol("_flags"),v3=Symbol("_flush"),P3=Symbol("_handleChunk"),x3=Symbol("_makeBuf"),yb=Symbol("_mode"),hb=Symbol("_needDrain"),KC=Symbol("_onerror"),zC=Symbol("_onopen"),D3=Symbol("_onread"),WC=Symbol("_onwrite"),y0=Symbol("_open"),qf=Symbol("_path"),Ud=Symbol("_pos"),fA=Symbol("_queue"),YC=Symbol("_read"),wAe=Symbol("_readSize"),d0=Symbol("_reading"),gb=Symbol("_remain"),BAe=Symbol("_size"),db=Symbol("_write"),GC=Symbol("_writing"),mb=Symbol("_defaultFlag"),VC=Symbol("_errored"),Cb=class extends _at{constructor(e,r){if(r=r||{},super(r),this.readable=!0,this.writable=!1,typeof e!="string")throw new TypeError("path must be a string");this[VC]=!1,this[Mn]=typeof r.fd=="number"?r.fd:null,this[qf]=e,this[wAe]=r.readSize||16*1024*1024,this[d0]=!1,this[BAe]=typeof r.size=="number"?r.size:1/0,this[gb]=this[BAe],this[JC]=typeof r.autoClose=="boolean"?r.autoClose:!0,typeof this[Mn]=="number"?this[YC]():this[y0]()}get fd(){return this[Mn]}get path(){return this[qf]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[y0](){ka.open(this[qf],"r",(e,r)=>this[zC](e,r))}[zC](e,r){e?this[KC](e):(this[Mn]=r,this.emit("open",r),this[YC]())}[x3](){return Buffer.allocUnsafe(Math.min(this[wAe],this[gb]))}[YC](){if(!this[d0]){this[d0]=!0;let e=this[x3]();if(e.length===0)return process.nextTick(()=>this[D3](null,0,e));ka.read(this[Mn],e,0,e.length,null,(r,o,a)=>this[D3](r,o,a))}}[D3](e,r,o){this[d0]=!1,e?this[KC](e):this[P3](r,o)&&this[YC]()}[Jc](){if(this[JC]&&typeof this[Mn]=="number"){let e=this[Mn];this[Mn]=null,ka.close(e,r=>r?this.emit("error",r):this.emit("close"))}}[KC](e){this[d0]=!0,this[Jc](),this.emit("error",e)}[P3](e,r){let o=!1;return this[gb]-=e,e>0&&(o=super.write(ethis[zC](e,r))}[zC](e,r){this[mb]&&this[m0]==="r+"&&e&&e.code==="ENOENT"?(this[m0]="w",this[y0]()):e?this[KC](e):(this[Mn]=r,this.emit("open",r),this[v3]())}end(e,r){return e&&this.write(e,r),this[F1]=!0,!this[GC]&&!this[fA].length&&typeof this[Mn]=="number"&&this[WC](null,0),this}write(e,r){return typeof e=="string"&&(e=Buffer.from(e,r)),this[F1]?(this.emit("error",new Error("write() after end()")),!1):this[Mn]===null||this[GC]||this[fA].length?(this[fA].push(e),this[hb]=!0,!1):(this[GC]=!0,this[db](e),!0)}[db](e){ka.write(this[Mn],e,0,e.length,this[Ud],(r,o)=>this[WC](r,o))}[WC](e,r){e?this[KC](e):(this[Ud]!==null&&(this[Ud]+=r),this[fA].length?this[v3]():(this[GC]=!1,this[F1]&&!this[IAe]?(this[IAe]=!0,this[Jc](),this.emit("finish")):this[hb]&&(this[hb]=!1,this.emit("drain"))))}[v3](){if(this[fA].length===0)this[F1]&&this[WC](null,0);else if(this[fA].length===1)this[db](this[fA].pop());else{let e=this[fA];this[fA]=[],S3(this[Mn],e,this[Ud],(r,o)=>this[WC](r,o))}}[Jc](){if(this[JC]&&typeof this[Mn]=="number"){let e=this[Mn];this[Mn]=null,ka.close(e,r=>r?this.emit("error",r):this.emit("close"))}}},Q3=class extends Eb{[y0](){let e;if(this[mb]&&this[m0]==="r+")try{e=ka.openSync(this[qf],this[m0],this[yb])}catch(r){if(r.code==="ENOENT")return this[m0]="w",this[y0]();throw r}else e=ka.openSync(this[qf],this[m0],this[yb]);this[zC](null,e)}[Jc](){if(this[JC]&&typeof this[Mn]=="number"){let e=this[Mn];this[Mn]=null,ka.closeSync(e),this.emit("close")}}[db](e){let r=!0;try{this[WC](null,ka.writeSync(this[Mn],e,0,e.length,this[Ud])),r=!1}finally{if(r)try{this[Jc]()}catch{}}}};R1.ReadStream=Cb;R1.ReadStreamSync=b3;R1.WriteStream=Eb;R1.WriteStreamSync=Q3});var Pb=U((h4t,QAe)=>{"use strict";var qat=Zx(),jat=HC(),Gat=Ie("events"),Wat=AS(),Yat=1024*1024,Kat=Jx(),vAe=Xx(),Vat=YU(),k3=Buffer.from([31,139]),rc=Symbol("state"),_d=Symbol("writeEntry"),jf=Symbol("readEntry"),F3=Symbol("nextEntry"),DAe=Symbol("processEntry"),nc=Symbol("extendedHeader"),T1=Symbol("globalExtendedHeader"),C0=Symbol("meta"),SAe=Symbol("emitMeta"),li=Symbol("buffer"),Gf=Symbol("queue"),Hd=Symbol("ended"),PAe=Symbol("emittedEnd"),qd=Symbol("emit"),Fa=Symbol("unzip"),Ib=Symbol("consumeChunk"),wb=Symbol("consumeChunkSub"),R3=Symbol("consumeBody"),xAe=Symbol("consumeMeta"),bAe=Symbol("consumeHeader"),Bb=Symbol("consuming"),T3=Symbol("bufferConcat"),N3=Symbol("maybeEnd"),N1=Symbol("writing"),E0=Symbol("aborted"),vb=Symbol("onDone"),jd=Symbol("sawValidEntry"),Db=Symbol("sawNullBlock"),Sb=Symbol("sawEOF"),Jat=t=>!0;QAe.exports=qat(class extends Gat{constructor(e){e=e||{},super(e),this.file=e.file||"",this[jd]=null,this.on(vb,r=>{(this[rc]==="begin"||this[jd]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),e.ondone?this.on(vb,e.ondone):this.on(vb,r=>{this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||Yat,this.filter=typeof e.filter=="function"?e.filter:Jat,this.writable=!0,this.readable=!1,this[Gf]=new Wat,this[li]=null,this[jf]=null,this[_d]=null,this[rc]="begin",this[C0]="",this[nc]=null,this[T1]=null,this[Hd]=!1,this[Fa]=null,this[E0]=!1,this[Db]=!1,this[Sb]=!1,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),typeof e.onentry=="function"&&this.on("entry",e.onentry)}[bAe](e,r){this[jd]===null&&(this[jd]=!1);let o;try{o=new jat(e,r,this[nc],this[T1])}catch(a){return this.warn("TAR_ENTRY_INVALID",a)}if(o.nullBlock)this[Db]?(this[Sb]=!0,this[rc]==="begin"&&(this[rc]="header"),this[qd]("eof")):(this[Db]=!0,this[qd]("nullBlock"));else if(this[Db]=!1,!o.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:o});else if(!o.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:o});else{let a=o.type;if(/^(Symbolic)?Link$/.test(a)&&!o.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:o});else if(!/^(Symbolic)?Link$/.test(a)&&o.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:o});else{let n=this[_d]=new Kat(o,this[nc],this[T1]);if(!this[jd])if(n.remain){let u=()=>{n.invalid||(this[jd]=!0)};n.on("end",u)}else this[jd]=!0;n.meta?n.size>this.maxMetaEntrySize?(n.ignore=!0,this[qd]("ignoredEntry",n),this[rc]="ignore",n.resume()):n.size>0&&(this[C0]="",n.on("data",u=>this[C0]+=u),this[rc]="meta"):(this[nc]=null,n.ignore=n.ignore||!this.filter(n.path,n),n.ignore?(this[qd]("ignoredEntry",n),this[rc]=n.remain?"ignore":"header",n.resume()):(n.remain?this[rc]="body":(this[rc]="header",n.end()),this[jf]?this[Gf].push(n):(this[Gf].push(n),this[F3]())))}}}[DAe](e){let r=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this[jf]=e,this.emit("entry",e),e.emittedEnd||(e.on("end",o=>this[F3]()),r=!1)):(this[jf]=null,r=!1),r}[F3](){do;while(this[DAe](this[Gf].shift()));if(!this[Gf].length){let e=this[jf];!e||e.flowing||e.size===e.remain?this[N1]||this.emit("drain"):e.once("drain",o=>this.emit("drain"))}}[R3](e,r){let o=this[_d],a=o.blockRemain,n=a>=e.length&&r===0?e:e.slice(r,r+a);return o.write(n),o.blockRemain||(this[rc]="header",this[_d]=null,o.end()),n.length}[xAe](e,r){let o=this[_d],a=this[R3](e,r);return this[_d]||this[SAe](o),a}[qd](e,r,o){!this[Gf].length&&!this[jf]?this.emit(e,r,o):this[Gf].push([e,r,o])}[SAe](e){switch(this[qd]("meta",this[C0]),e.type){case"ExtendedHeader":case"OldExtendedHeader":this[nc]=vAe.parse(this[C0],this[nc],!1);break;case"GlobalExtendedHeader":this[T1]=vAe.parse(this[C0],this[T1],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":this[nc]=this[nc]||Object.create(null),this[nc].path=this[C0].replace(/\0.*/,"");break;case"NextFileHasLongLinkpath":this[nc]=this[nc]||Object.create(null),this[nc].linkpath=this[C0].replace(/\0.*/,"");break;default:throw new Error("unknown meta: "+e.type)}}abort(e){this[E0]=!0,this.emit("abort",e),this.warn("TAR_ABORT",e,{recoverable:!1})}write(e){if(this[E0])return;if(this[Fa]===null&&e){if(this[li]&&(e=Buffer.concat([this[li],e]),this[li]=null),e.lengththis[Ib](n)),this[Fa].on("error",n=>this.abort(n)),this[Fa].on("end",n=>{this[Hd]=!0,this[Ib]()}),this[N1]=!0;let a=this[Fa][o?"end":"write"](e);return this[N1]=!1,a}}this[N1]=!0,this[Fa]?this[Fa].write(e):this[Ib](e),this[N1]=!1;let r=this[Gf].length?!1:this[jf]?this[jf].flowing:!0;return!r&&!this[Gf].length&&this[jf].once("drain",o=>this.emit("drain")),r}[T3](e){e&&!this[E0]&&(this[li]=this[li]?Buffer.concat([this[li],e]):e)}[N3](){if(this[Hd]&&!this[PAe]&&!this[E0]&&!this[Bb]){this[PAe]=!0;let e=this[_d];if(e&&e.blockRemain){let r=this[li]?this[li].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${e.blockRemain} more bytes, only ${r} available)`,{entry:e}),this[li]&&e.write(this[li]),e.end()}this[qd](vb)}}[Ib](e){if(this[Bb])this[T3](e);else if(!e&&!this[li])this[N3]();else{if(this[Bb]=!0,this[li]){this[T3](e);let r=this[li];this[li]=null,this[wb](r)}else this[wb](e);for(;this[li]&&this[li].length>=512&&!this[E0]&&!this[Sb];){let r=this[li];this[li]=null,this[wb](r)}this[Bb]=!1}(!this[li]||this[Hd])&&this[N3]()}[wb](e){let r=0,o=e.length;for(;r+512<=o&&!this[E0]&&!this[Sb];)switch(this[rc]){case"begin":case"header":this[bAe](e,r),r+=512;break;case"ignore":case"body":r+=this[R3](e,r);break;case"meta":r+=this[xAe](e,r);break;default:throw new Error("invalid state: "+this[rc])}r{"use strict";var zat=TC(),FAe=Pb(),ZC=Ie("fs"),Xat=XC(),kAe=Ie("path"),L3=qC();TAe.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let o=zat(t);if(o.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!o.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&$at(o,e),o.noResume||Zat(o),o.file&&o.sync?elt(o):o.file?tlt(o,r):RAe(o)};var Zat=t=>{let e=t.onentry;t.onentry=e?r=>{e(r),r.resume()}:r=>r.resume()},$at=(t,e)=>{let r=new Map(e.map(n=>[L3(n),!0])),o=t.filter,a=(n,u)=>{let A=u||kAe.parse(n).root||".",p=n===A?!1:r.has(n)?r.get(n):a(kAe.dirname(n),A);return r.set(n,p),p};t.filter=o?(n,u)=>o(n,u)&&a(L3(n)):n=>a(L3(n))},elt=t=>{let e=RAe(t),r=t.file,o=!0,a;try{let n=ZC.statSync(r),u=t.maxReadSize||16*1024*1024;if(n.size{let r=new FAe(t),o=t.maxReadSize||16*1024*1024,a=t.file,n=new Promise((u,A)=>{r.on("error",A),r.on("end",u),ZC.stat(a,(p,h)=>{if(p)A(p);else{let E=new Xat.ReadStream(a,{readSize:o,size:h.size});E.on("error",A),E.pipe(r)}})});return e?n.then(e,e):n},RAe=t=>new FAe(t)});var _Ae=U((d4t,UAe)=>{"use strict";var rlt=TC(),bb=pb(),NAe=XC(),LAe=xb(),OAe=Ie("path");UAe.exports=(t,e,r)=>{if(typeof e=="function"&&(r=e),Array.isArray(t)&&(e=t,t={}),!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");e=Array.from(e);let o=rlt(t);if(o.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!o.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return o.file&&o.sync?nlt(o,e):o.file?ilt(o,e,r):o.sync?slt(o,e):olt(o,e)};var nlt=(t,e)=>{let r=new bb.Sync(t),o=new NAe.WriteStreamSync(t.file,{mode:t.mode||438});r.pipe(o),MAe(r,e)},ilt=(t,e,r)=>{let o=new bb(t),a=new NAe.WriteStream(t.file,{mode:t.mode||438});o.pipe(a);let n=new Promise((u,A)=>{a.on("error",A),a.on("close",u),o.on("error",A)});return O3(o,e),r?n.then(r,r):n},MAe=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?LAe({file:OAe.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:o=>t.add(o)}):t.add(r)}),t.end()},O3=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return LAe({file:OAe.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:o=>t.add(o)}).then(o=>O3(t,e));t.add(r)}t.end()},slt=(t,e)=>{let r=new bb.Sync(t);return MAe(r,e),r},olt=(t,e)=>{let r=new bb(t);return O3(r,e),r}});var M3=U((m4t,KAe)=>{"use strict";var alt=TC(),HAe=pb(),pl=Ie("fs"),qAe=XC(),jAe=xb(),GAe=Ie("path"),WAe=HC();KAe.exports=(t,e,r)=>{let o=alt(t);if(!o.file)throw new TypeError("file is required");if(o.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),o.sync?llt(o,e):ult(o,e,r)};var llt=(t,e)=>{let r=new HAe.Sync(t),o=!0,a,n;try{try{a=pl.openSync(t.file,"r+")}catch(p){if(p.code==="ENOENT")a=pl.openSync(t.file,"w+");else throw p}let u=pl.fstatSync(a),A=Buffer.alloc(512);e:for(n=0;nu.size)break;n+=h,t.mtimeCache&&t.mtimeCache.set(p.path,p.mtime)}o=!1,clt(t,r,n,a,e)}finally{if(o)try{pl.closeSync(a)}catch{}}},clt=(t,e,r,o,a)=>{let n=new qAe.WriteStreamSync(t.file,{fd:o,start:r});e.pipe(n),Alt(e,a)},ult=(t,e,r)=>{e=Array.from(e);let o=new HAe(t),a=(u,A,p)=>{let h=(C,R)=>{C?pl.close(u,L=>p(C)):p(null,R)},E=0;if(A===0)return h(null,0);let w=0,v=Buffer.alloc(512),b=(C,R)=>{if(C)return h(C);if(w+=R,w<512&&R)return pl.read(u,v,w,v.length-w,E+w,b);if(E===0&&v[0]===31&&v[1]===139)return h(new Error("cannot append to compressed archives"));if(w<512)return h(null,E);let L=new WAe(v);if(!L.cksumValid)return h(null,E);let _=512*Math.ceil(L.size/512);if(E+_+512>A||(E+=_+512,E>=A))return h(null,E);t.mtimeCache&&t.mtimeCache.set(L.path,L.mtime),w=0,pl.read(u,v,0,512,E,b)};pl.read(u,v,0,512,E,b)},n=new Promise((u,A)=>{o.on("error",A);let p="r+",h=(E,w)=>{if(E&&E.code==="ENOENT"&&p==="r+")return p="w+",pl.open(t.file,p,h);if(E)return A(E);pl.fstat(w,(v,b)=>{if(v)return pl.close(w,()=>A(v));a(w,b.size,(C,R)=>{if(C)return A(C);let L=new qAe.WriteStream(t.file,{fd:w,start:R});o.pipe(L),L.on("error",A),L.on("close",u),YAe(o,e)})})};pl.open(t.file,p,h)});return r?n.then(r,r):n},Alt=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?jAe({file:GAe.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:o=>t.add(o)}):t.add(r)}),t.end()},YAe=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return jAe({file:GAe.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:o=>t.add(o)}).then(o=>YAe(t,e));t.add(r)}t.end()}});var JAe=U((y4t,VAe)=>{"use strict";var flt=TC(),plt=M3();VAe.exports=(t,e,r)=>{let o=flt(t);if(!o.file)throw new TypeError("file is required");if(o.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),hlt(o),plt(o,e,r)};var hlt=t=>{let e=t.filter;t.mtimeCache||(t.mtimeCache=new Map),t.filter=e?(r,o)=>e(r,o)&&!(t.mtimeCache.get(r)>o.mtime):(r,o)=>!(t.mtimeCache.get(r)>o.mtime)}});var ZAe=U((C4t,XAe)=>{var{promisify:zAe}=Ie("util"),I0=Ie("fs"),glt=t=>{if(!t)t={mode:511,fs:I0};else if(typeof t=="object")t={mode:511,fs:I0,...t};else if(typeof t=="number")t={mode:t,fs:I0};else if(typeof t=="string")t={mode:parseInt(t,8),fs:I0};else throw new TypeError("invalid options argument");return t.mkdir=t.mkdir||t.fs.mkdir||I0.mkdir,t.mkdirAsync=zAe(t.mkdir),t.stat=t.stat||t.fs.stat||I0.stat,t.statAsync=zAe(t.stat),t.statSync=t.statSync||t.fs.statSync||I0.statSync,t.mkdirSync=t.mkdirSync||t.fs.mkdirSync||I0.mkdirSync,t};XAe.exports=glt});var efe=U((E4t,$Ae)=>{var dlt=process.platform,{resolve:mlt,parse:ylt}=Ie("path"),Clt=t=>{if(/\0/.test(t))throw Object.assign(new TypeError("path must be a string without null bytes"),{path:t,code:"ERR_INVALID_ARG_VALUE"});if(t=mlt(t),dlt==="win32"){let e=/[*|"<>?:]/,{root:r}=ylt(t);if(e.test(t.substr(r.length)))throw Object.assign(new Error("Illegal characters in path."),{path:t,code:"EINVAL"})}return t};$Ae.exports=Clt});var sfe=U((I4t,ife)=>{var{dirname:tfe}=Ie("path"),rfe=(t,e,r=void 0)=>r===e?Promise.resolve():t.statAsync(e).then(o=>o.isDirectory()?r:void 0,o=>o.code==="ENOENT"?rfe(t,tfe(e),e):void 0),nfe=(t,e,r=void 0)=>{if(r!==e)try{return t.statSync(e).isDirectory()?r:void 0}catch(o){return o.code==="ENOENT"?nfe(t,tfe(e),e):void 0}};ife.exports={findMade:rfe,findMadeSync:nfe}});var H3=U((w4t,afe)=>{var{dirname:ofe}=Ie("path"),U3=(t,e,r)=>{e.recursive=!1;let o=ofe(t);return o===t?e.mkdirAsync(t,e).catch(a=>{if(a.code!=="EISDIR")throw a}):e.mkdirAsync(t,e).then(()=>r||t,a=>{if(a.code==="ENOENT")return U3(o,e).then(n=>U3(t,e,n));if(a.code!=="EEXIST"&&a.code!=="EROFS")throw a;return e.statAsync(t).then(n=>{if(n.isDirectory())return r;throw a},()=>{throw a})})},_3=(t,e,r)=>{let o=ofe(t);if(e.recursive=!1,o===t)try{return e.mkdirSync(t,e)}catch(a){if(a.code!=="EISDIR")throw a;return}try{return e.mkdirSync(t,e),r||t}catch(a){if(a.code==="ENOENT")return _3(t,e,_3(o,e,r));if(a.code!=="EEXIST"&&a.code!=="EROFS")throw a;try{if(!e.statSync(t).isDirectory())throw a}catch{throw a}}};afe.exports={mkdirpManual:U3,mkdirpManualSync:_3}});var ufe=U((B4t,cfe)=>{var{dirname:lfe}=Ie("path"),{findMade:Elt,findMadeSync:Ilt}=sfe(),{mkdirpManual:wlt,mkdirpManualSync:Blt}=H3(),vlt=(t,e)=>(e.recursive=!0,lfe(t)===t?e.mkdirAsync(t,e):Elt(e,t).then(o=>e.mkdirAsync(t,e).then(()=>o).catch(a=>{if(a.code==="ENOENT")return wlt(t,e);throw a}))),Dlt=(t,e)=>{if(e.recursive=!0,lfe(t)===t)return e.mkdirSync(t,e);let o=Ilt(e,t);try{return e.mkdirSync(t,e),o}catch(a){if(a.code==="ENOENT")return Blt(t,e);throw a}};cfe.exports={mkdirpNative:vlt,mkdirpNativeSync:Dlt}});var hfe=U((v4t,pfe)=>{var Afe=Ie("fs"),Slt=process.version,q3=Slt.replace(/^v/,"").split("."),ffe=+q3[0]>10||+q3[0]==10&&+q3[1]>=12,Plt=ffe?t=>t.mkdir===Afe.mkdir:()=>!1,xlt=ffe?t=>t.mkdirSync===Afe.mkdirSync:()=>!1;pfe.exports={useNative:Plt,useNativeSync:xlt}});var Efe=U((D4t,Cfe)=>{var $C=ZAe(),eE=efe(),{mkdirpNative:gfe,mkdirpNativeSync:dfe}=ufe(),{mkdirpManual:mfe,mkdirpManualSync:yfe}=H3(),{useNative:blt,useNativeSync:Qlt}=hfe(),tE=(t,e)=>(t=eE(t),e=$C(e),blt(e)?gfe(t,e):mfe(t,e)),klt=(t,e)=>(t=eE(t),e=$C(e),Qlt(e)?dfe(t,e):yfe(t,e));tE.sync=klt;tE.native=(t,e)=>gfe(eE(t),$C(e));tE.manual=(t,e)=>mfe(eE(t),$C(e));tE.nativeSync=(t,e)=>dfe(eE(t),$C(e));tE.manualSync=(t,e)=>yfe(eE(t),$C(e));Cfe.exports=tE});var Pfe=U((S4t,Sfe)=>{"use strict";var ic=Ie("fs"),Gd=Ie("path"),Flt=ic.lchown?"lchown":"chown",Rlt=ic.lchownSync?"lchownSync":"chownSync",wfe=ic.lchown&&!process.version.match(/v1[1-9]+\./)&&!process.version.match(/v10\.[6-9]/),Ife=(t,e,r)=>{try{return ic[Rlt](t,e,r)}catch(o){if(o.code!=="ENOENT")throw o}},Tlt=(t,e,r)=>{try{return ic.chownSync(t,e,r)}catch(o){if(o.code!=="ENOENT")throw o}},Nlt=wfe?(t,e,r,o)=>a=>{!a||a.code!=="EISDIR"?o(a):ic.chown(t,e,r,o)}:(t,e,r,o)=>o,j3=wfe?(t,e,r)=>{try{return Ife(t,e,r)}catch(o){if(o.code!=="EISDIR")throw o;Tlt(t,e,r)}}:(t,e,r)=>Ife(t,e,r),Llt=process.version,Bfe=(t,e,r)=>ic.readdir(t,e,r),Olt=(t,e)=>ic.readdirSync(t,e);/^v4\./.test(Llt)&&(Bfe=(t,e,r)=>ic.readdir(t,r));var Qb=(t,e,r,o)=>{ic[Flt](t,e,r,Nlt(t,e,r,a=>{o(a&&a.code!=="ENOENT"?a:null)}))},vfe=(t,e,r,o,a)=>{if(typeof e=="string")return ic.lstat(Gd.resolve(t,e),(n,u)=>{if(n)return a(n.code!=="ENOENT"?n:null);u.name=e,vfe(t,u,r,o,a)});if(e.isDirectory())G3(Gd.resolve(t,e.name),r,o,n=>{if(n)return a(n);let u=Gd.resolve(t,e.name);Qb(u,r,o,a)});else{let n=Gd.resolve(t,e.name);Qb(n,r,o,a)}},G3=(t,e,r,o)=>{Bfe(t,{withFileTypes:!0},(a,n)=>{if(a){if(a.code==="ENOENT")return o();if(a.code!=="ENOTDIR"&&a.code!=="ENOTSUP")return o(a)}if(a||!n.length)return Qb(t,e,r,o);let u=n.length,A=null,p=h=>{if(!A){if(h)return o(A=h);if(--u===0)return Qb(t,e,r,o)}};n.forEach(h=>vfe(t,h,e,r,p))})},Mlt=(t,e,r,o)=>{if(typeof e=="string")try{let a=ic.lstatSync(Gd.resolve(t,e));a.name=e,e=a}catch(a){if(a.code==="ENOENT")return;throw a}e.isDirectory()&&Dfe(Gd.resolve(t,e.name),r,o),j3(Gd.resolve(t,e.name),r,o)},Dfe=(t,e,r)=>{let o;try{o=Olt(t,{withFileTypes:!0})}catch(a){if(a.code==="ENOENT")return;if(a.code==="ENOTDIR"||a.code==="ENOTSUP")return j3(t,e,r);throw a}return o&&o.length&&o.forEach(a=>Mlt(t,a,e,r)),j3(t,e,r)};Sfe.exports=G3;G3.sync=Dfe});var kfe=U((P4t,W3)=>{"use strict";var xfe=Efe(),sc=Ie("fs"),kb=Ie("path"),bfe=Pfe(),zc=UC(),Fb=class extends Error{constructor(e,r){super("Cannot extract through symbolic link"),this.path=r,this.symlink=e}get name(){return"SylinkError"}},Rb=class extends Error{constructor(e,r){super(r+": Cannot cd into '"+e+"'"),this.path=e,this.code=r}get name(){return"CwdError"}},Tb=(t,e)=>t.get(zc(e)),L1=(t,e,r)=>t.set(zc(e),r),Ult=(t,e)=>{sc.stat(t,(r,o)=>{(r||!o.isDirectory())&&(r=new Rb(t,r&&r.code||"ENOTDIR")),e(r)})};W3.exports=(t,e,r)=>{t=zc(t);let o=e.umask,a=e.mode|448,n=(a&o)!==0,u=e.uid,A=e.gid,p=typeof u=="number"&&typeof A=="number"&&(u!==e.processUid||A!==e.processGid),h=e.preserve,E=e.unlink,w=e.cache,v=zc(e.cwd),b=(L,_)=>{L?r(L):(L1(w,t,!0),_&&p?bfe(_,u,A,V=>b(V)):n?sc.chmod(t,a,r):r())};if(w&&Tb(w,t)===!0)return b();if(t===v)return Ult(t,b);if(h)return xfe(t,{mode:a}).then(L=>b(null,L),b);let R=zc(kb.relative(v,t)).split("/");Nb(v,R,a,w,E,v,null,b)};var Nb=(t,e,r,o,a,n,u,A)=>{if(!e.length)return A(null,u);let p=e.shift(),h=zc(kb.resolve(t+"/"+p));if(Tb(o,h))return Nb(h,e,r,o,a,n,u,A);sc.mkdir(h,r,Qfe(h,e,r,o,a,n,u,A))},Qfe=(t,e,r,o,a,n,u,A)=>p=>{p?sc.lstat(t,(h,E)=>{if(h)h.path=h.path&&zc(h.path),A(h);else if(E.isDirectory())Nb(t,e,r,o,a,n,u,A);else if(a)sc.unlink(t,w=>{if(w)return A(w);sc.mkdir(t,r,Qfe(t,e,r,o,a,n,u,A))});else{if(E.isSymbolicLink())return A(new Fb(t,t+"/"+e.join("/")));A(p)}}):(u=u||t,Nb(t,e,r,o,a,n,u,A))},_lt=t=>{let e=!1,r="ENOTDIR";try{e=sc.statSync(t).isDirectory()}catch(o){r=o.code}finally{if(!e)throw new Rb(t,r)}};W3.exports.sync=(t,e)=>{t=zc(t);let r=e.umask,o=e.mode|448,a=(o&r)!==0,n=e.uid,u=e.gid,A=typeof n=="number"&&typeof u=="number"&&(n!==e.processUid||u!==e.processGid),p=e.preserve,h=e.unlink,E=e.cache,w=zc(e.cwd),v=L=>{L1(E,t,!0),L&&A&&bfe.sync(L,n,u),a&&sc.chmodSync(t,o)};if(E&&Tb(E,t)===!0)return v();if(t===w)return _lt(w),v();if(p)return v(xfe.sync(t,o));let C=zc(kb.relative(w,t)).split("/"),R=null;for(let L=C.shift(),_=w;L&&(_+="/"+L);L=C.shift())if(_=zc(kb.resolve(_)),!Tb(E,_))try{sc.mkdirSync(_,o),R=R||_,L1(E,_,!0)}catch{let re=sc.lstatSync(_);if(re.isDirectory()){L1(E,_,!0);continue}else if(h){sc.unlinkSync(_),sc.mkdirSync(_,o),R=R||_,L1(E,_,!0);continue}else if(re.isSymbolicLink())return new Fb(_,_+"/"+C.join("/"))}return v(R)}});var K3=U((x4t,Ffe)=>{var Y3=Object.create(null),{hasOwnProperty:Hlt}=Object.prototype;Ffe.exports=t=>(Hlt.call(Y3,t)||(Y3[t]=t.normalize("NFKD")),Y3[t])});var Lfe=U((b4t,Nfe)=>{var Rfe=Ie("assert"),qlt=K3(),jlt=qC(),{join:Tfe}=Ie("path"),Glt=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,Wlt=Glt==="win32";Nfe.exports=()=>{let t=new Map,e=new Map,r=h=>h.split("/").slice(0,-1).reduce((w,v)=>(w.length&&(v=Tfe(w[w.length-1],v)),w.push(v||"/"),w),[]),o=new Set,a=h=>{let E=e.get(h);if(!E)throw new Error("function does not have any path reservations");return{paths:E.paths.map(w=>t.get(w)),dirs:[...E.dirs].map(w=>t.get(w))}},n=h=>{let{paths:E,dirs:w}=a(h);return E.every(v=>v[0]===h)&&w.every(v=>v[0]instanceof Set&&v[0].has(h))},u=h=>o.has(h)||!n(h)?!1:(o.add(h),h(()=>A(h)),!0),A=h=>{if(!o.has(h))return!1;let{paths:E,dirs:w}=e.get(h),v=new Set;return E.forEach(b=>{let C=t.get(b);Rfe.equal(C[0],h),C.length===1?t.delete(b):(C.shift(),typeof C[0]=="function"?v.add(C[0]):C[0].forEach(R=>v.add(R)))}),w.forEach(b=>{let C=t.get(b);Rfe(C[0]instanceof Set),C[0].size===1&&C.length===1?t.delete(b):C[0].size===1?(C.shift(),v.add(C[0])):C[0].delete(h)}),o.delete(h),v.forEach(b=>u(b)),!0};return{check:n,reserve:(h,E)=>{h=Wlt?["win32 parallelization disabled"]:h.map(v=>qlt(jlt(Tfe(v))).toLowerCase());let w=new Set(h.map(v=>r(v)).reduce((v,b)=>v.concat(b)));return e.set(E,{dirs:w,paths:h}),h.forEach(v=>{let b=t.get(v);b?b.push(E):t.set(v,[E])}),w.forEach(v=>{let b=t.get(v);b?b[b.length-1]instanceof Set?b[b.length-1].add(E):b.push(new Set([E])):t.set(v,[new Set([E])])}),u(E)}}}});var Ufe=U((Q4t,Mfe)=>{var Ylt=process.platform,Klt=Ylt==="win32",Vlt=global.__FAKE_TESTING_FS__||Ie("fs"),{O_CREAT:Jlt,O_TRUNC:zlt,O_WRONLY:Xlt,UV_FS_O_FILEMAP:Ofe=0}=Vlt.constants,Zlt=Klt&&!!Ofe,$lt=512*1024,ect=Ofe|zlt|Jlt|Xlt;Mfe.exports=Zlt?t=>t<$lt?ect:"w":()=>"w"});var r_=U((k4t,$fe)=>{"use strict";var tct=Ie("assert"),rct=Pb(),Cn=Ie("fs"),nct=XC(),Wf=Ie("path"),zfe=kfe(),_fe=r3(),ict=Lfe(),sct=n3(),hl=UC(),oct=qC(),act=K3(),Hfe=Symbol("onEntry"),z3=Symbol("checkFs"),qfe=Symbol("checkFs2"),Mb=Symbol("pruneCache"),X3=Symbol("isReusable"),oc=Symbol("makeFs"),Z3=Symbol("file"),$3=Symbol("directory"),Ub=Symbol("link"),jfe=Symbol("symlink"),Gfe=Symbol("hardlink"),Wfe=Symbol("unsupported"),Yfe=Symbol("checkPath"),w0=Symbol("mkdir"),ko=Symbol("onError"),Lb=Symbol("pending"),Kfe=Symbol("pend"),rE=Symbol("unpend"),V3=Symbol("ended"),J3=Symbol("maybeClose"),e_=Symbol("skip"),O1=Symbol("doChown"),M1=Symbol("uid"),U1=Symbol("gid"),_1=Symbol("checkedCwd"),Xfe=Ie("crypto"),Zfe=Ufe(),lct=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,H1=lct==="win32",cct=(t,e)=>{if(!H1)return Cn.unlink(t,e);let r=t+".DELETE."+Xfe.randomBytes(16).toString("hex");Cn.rename(t,r,o=>{if(o)return e(o);Cn.unlink(r,e)})},uct=t=>{if(!H1)return Cn.unlinkSync(t);let e=t+".DELETE."+Xfe.randomBytes(16).toString("hex");Cn.renameSync(t,e),Cn.unlinkSync(e)},Vfe=(t,e,r)=>t===t>>>0?t:e===e>>>0?e:r,Jfe=t=>act(oct(hl(t))).toLowerCase(),Act=(t,e)=>{e=Jfe(e);for(let r of t.keys()){let o=Jfe(r);(o===e||o.indexOf(e+"/")===0)&&t.delete(r)}},fct=t=>{for(let e of t.keys())t.delete(e)},q1=class extends rct{constructor(e){if(e||(e={}),e.ondone=r=>{this[V3]=!0,this[J3]()},super(e),this[_1]=!1,this.reservations=ict(),this.transform=typeof e.transform=="function"?e.transform:null,this.writable=!0,this.readable=!1,this[Lb]=0,this[V3]=!1,this.dirCache=e.dirCache||new Map,typeof e.uid=="number"||typeof e.gid=="number"){if(typeof e.uid!="number"||typeof e.gid!="number")throw new TypeError("cannot set owner without number uid and gid");if(e.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=null,this.gid=null,this.setOwner=!1;e.preserveOwner===void 0&&typeof e.uid!="number"?this.preserveOwner=process.getuid&&process.getuid()===0:this.preserveOwner=!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():null,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():null,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||H1,this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=hl(Wf.resolve(e.cwd||process.cwd())),this.strip=+e.strip||0,this.processUmask=e.noChmod?0:process.umask(),this.umask=typeof e.umask=="number"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on("entry",r=>this[Hfe](r))}warn(e,r,o={}){return(e==="TAR_BAD_ARCHIVE"||e==="TAR_ABORT")&&(o.recoverable=!1),super.warn(e,r,o)}[J3](){this[V3]&&this[Lb]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close"))}[Yfe](e){if(this.strip){let r=hl(e.path).split("/");if(r.length=this.strip)e.linkpath=o.slice(this.strip).join("/");else return!1}}if(!this.preservePaths){let r=hl(e.path),o=r.split("/");if(o.includes("..")||H1&&/^[a-z]:\.\.$/i.test(o[0]))return this.warn("TAR_ENTRY_ERROR","path contains '..'",{entry:e,path:r}),!1;let[a,n]=sct(r);a&&(e.path=n,this.warn("TAR_ENTRY_INFO",`stripping ${a} from absolute path`,{entry:e,path:r}))}if(Wf.isAbsolute(e.path)?e.absolute=hl(Wf.resolve(e.path)):e.absolute=hl(Wf.resolve(this.cwd,e.path)),!this.preservePaths&&e.absolute.indexOf(this.cwd+"/")!==0&&e.absolute!==this.cwd)return this.warn("TAR_ENTRY_ERROR","path escaped extraction target",{entry:e,path:hl(e.path),resolvedPath:e.absolute,cwd:this.cwd}),!1;if(e.absolute===this.cwd&&e.type!=="Directory"&&e.type!=="GNUDumpDir")return!1;if(this.win32){let{root:r}=Wf.win32.parse(e.absolute);e.absolute=r+_fe.encode(e.absolute.substr(r.length));let{root:o}=Wf.win32.parse(e.path);e.path=o+_fe.encode(e.path.substr(o.length))}return!0}[Hfe](e){if(!this[Yfe](e))return e.resume();switch(tct.equal(typeof e.absolute,"string"),e.type){case"Directory":case"GNUDumpDir":e.mode&&(e.mode=e.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[z3](e);case"CharacterDevice":case"BlockDevice":case"FIFO":default:return this[Wfe](e)}}[ko](e,r){e.name==="CwdError"?this.emit("error",e):(this.warn("TAR_ENTRY_ERROR",e,{entry:r}),this[rE](),r.resume())}[w0](e,r,o){zfe(hl(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r,noChmod:this.noChmod},o)}[O1](e){return this.forceChown||this.preserveOwner&&(typeof e.uid=="number"&&e.uid!==this.processUid||typeof e.gid=="number"&&e.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[M1](e){return Vfe(this.uid,e.uid,this.processUid)}[U1](e){return Vfe(this.gid,e.gid,this.processGid)}[Z3](e,r){let o=e.mode&4095||this.fmode,a=new nct.WriteStream(e.absolute,{flags:Zfe(e.size),mode:o,autoClose:!1});a.on("error",p=>{a.fd&&Cn.close(a.fd,()=>{}),a.write=()=>!0,this[ko](p,e),r()});let n=1,u=p=>{if(p){a.fd&&Cn.close(a.fd,()=>{}),this[ko](p,e),r();return}--n===0&&Cn.close(a.fd,h=>{h?this[ko](h,e):this[rE](),r()})};a.on("finish",p=>{let h=e.absolute,E=a.fd;if(e.mtime&&!this.noMtime){n++;let w=e.atime||new Date,v=e.mtime;Cn.futimes(E,w,v,b=>b?Cn.utimes(h,w,v,C=>u(C&&b)):u())}if(this[O1](e)){n++;let w=this[M1](e),v=this[U1](e);Cn.fchown(E,w,v,b=>b?Cn.chown(h,w,v,C=>u(C&&b)):u())}u()});let A=this.transform&&this.transform(e)||e;A!==e&&(A.on("error",p=>{this[ko](p,e),r()}),e.pipe(A)),A.pipe(a)}[$3](e,r){let o=e.mode&4095||this.dmode;this[w0](e.absolute,o,a=>{if(a){this[ko](a,e),r();return}let n=1,u=A=>{--n===0&&(r(),this[rE](),e.resume())};e.mtime&&!this.noMtime&&(n++,Cn.utimes(e.absolute,e.atime||new Date,e.mtime,u)),this[O1](e)&&(n++,Cn.chown(e.absolute,this[M1](e),this[U1](e),u)),u()})}[Wfe](e){e.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[jfe](e,r){this[Ub](e,e.linkpath,"symlink",r)}[Gfe](e,r){let o=hl(Wf.resolve(this.cwd,e.linkpath));this[Ub](e,o,"link",r)}[Kfe](){this[Lb]++}[rE](){this[Lb]--,this[J3]()}[e_](e){this[rE](),e.resume()}[X3](e,r){return e.type==="File"&&!this.unlink&&r.isFile()&&r.nlink<=1&&!H1}[z3](e){this[Kfe]();let r=[e.path];e.linkpath&&r.push(e.linkpath),this.reservations.reserve(r,o=>this[qfe](e,o))}[Mb](e){e.type==="SymbolicLink"?fct(this.dirCache):e.type!=="Directory"&&Act(this.dirCache,e.absolute)}[qfe](e,r){this[Mb](e);let o=A=>{this[Mb](e),r(A)},a=()=>{this[w0](this.cwd,this.dmode,A=>{if(A){this[ko](A,e),o();return}this[_1]=!0,n()})},n=()=>{if(e.absolute!==this.cwd){let A=hl(Wf.dirname(e.absolute));if(A!==this.cwd)return this[w0](A,this.dmode,p=>{if(p){this[ko](p,e),o();return}u()})}u()},u=()=>{Cn.lstat(e.absolute,(A,p)=>{if(p&&(this.keep||this.newer&&p.mtime>e.mtime)){this[e_](e),o();return}if(A||this[X3](e,p))return this[oc](null,e,o);if(p.isDirectory()){if(e.type==="Directory"){let h=!this.noChmod&&e.mode&&(p.mode&4095)!==e.mode,E=w=>this[oc](w,e,o);return h?Cn.chmod(e.absolute,e.mode,E):E()}if(e.absolute!==this.cwd)return Cn.rmdir(e.absolute,h=>this[oc](h,e,o))}if(e.absolute===this.cwd)return this[oc](null,e,o);cct(e.absolute,h=>this[oc](h,e,o))})};this[_1]?n():a()}[oc](e,r,o){if(e){this[ko](e,r),o();return}switch(r.type){case"File":case"OldFile":case"ContiguousFile":return this[Z3](r,o);case"Link":return this[Gfe](r,o);case"SymbolicLink":return this[jfe](r,o);case"Directory":case"GNUDumpDir":return this[$3](r,o)}}[Ub](e,r,o,a){Cn[o](r,e.absolute,n=>{n?this[ko](n,e):(this[rE](),e.resume()),a()})}},Ob=t=>{try{return[null,t()]}catch(e){return[e,null]}},t_=class extends q1{[oc](e,r){return super[oc](e,r,()=>{})}[z3](e){if(this[Mb](e),!this[_1]){let n=this[w0](this.cwd,this.dmode);if(n)return this[ko](n,e);this[_1]=!0}if(e.absolute!==this.cwd){let n=hl(Wf.dirname(e.absolute));if(n!==this.cwd){let u=this[w0](n,this.dmode);if(u)return this[ko](u,e)}}let[r,o]=Ob(()=>Cn.lstatSync(e.absolute));if(o&&(this.keep||this.newer&&o.mtime>e.mtime))return this[e_](e);if(r||this[X3](e,o))return this[oc](null,e);if(o.isDirectory()){if(e.type==="Directory"){let u=!this.noChmod&&e.mode&&(o.mode&4095)!==e.mode,[A]=u?Ob(()=>{Cn.chmodSync(e.absolute,e.mode)}):[];return this[oc](A,e)}let[n]=Ob(()=>Cn.rmdirSync(e.absolute));this[oc](n,e)}let[a]=e.absolute===this.cwd?[]:Ob(()=>uct(e.absolute));this[oc](a,e)}[Z3](e,r){let o=e.mode&4095||this.fmode,a=A=>{let p;try{Cn.closeSync(n)}catch(h){p=h}(A||p)&&this[ko](A||p,e),r()},n;try{n=Cn.openSync(e.absolute,Zfe(e.size),o)}catch(A){return a(A)}let u=this.transform&&this.transform(e)||e;u!==e&&(u.on("error",A=>this[ko](A,e)),e.pipe(u)),u.on("data",A=>{try{Cn.writeSync(n,A,0,A.length)}catch(p){a(p)}}),u.on("end",A=>{let p=null;if(e.mtime&&!this.noMtime){let h=e.atime||new Date,E=e.mtime;try{Cn.futimesSync(n,h,E)}catch(w){try{Cn.utimesSync(e.absolute,h,E)}catch{p=w}}}if(this[O1](e)){let h=this[M1](e),E=this[U1](e);try{Cn.fchownSync(n,h,E)}catch(w){try{Cn.chownSync(e.absolute,h,E)}catch{p=p||w}}}a(p)})}[$3](e,r){let o=e.mode&4095||this.dmode,a=this[w0](e.absolute,o);if(a){this[ko](a,e),r();return}if(e.mtime&&!this.noMtime)try{Cn.utimesSync(e.absolute,e.atime||new Date,e.mtime)}catch{}if(this[O1](e))try{Cn.chownSync(e.absolute,this[M1](e),this[U1](e))}catch{}r(),e.resume()}[w0](e,r){try{return zfe.sync(hl(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r})}catch(o){return o}}[Ub](e,r,o,a){try{Cn[o+"Sync"](r,e.absolute),a(),e.resume()}catch(n){return this[ko](n,e)}}};q1.Sync=t_;$fe.exports=q1});var ipe=U((F4t,npe)=>{"use strict";var pct=TC(),_b=r_(),tpe=Ie("fs"),rpe=XC(),epe=Ie("path"),n_=qC();npe.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let o=pct(t);if(o.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!o.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&hct(o,e),o.file&&o.sync?gct(o):o.file?dct(o,r):o.sync?mct(o):yct(o)};var hct=(t,e)=>{let r=new Map(e.map(n=>[n_(n),!0])),o=t.filter,a=(n,u)=>{let A=u||epe.parse(n).root||".",p=n===A?!1:r.has(n)?r.get(n):a(epe.dirname(n),A);return r.set(n,p),p};t.filter=o?(n,u)=>o(n,u)&&a(n_(n)):n=>a(n_(n))},gct=t=>{let e=new _b.Sync(t),r=t.file,o=tpe.statSync(r),a=t.maxReadSize||16*1024*1024;new rpe.ReadStreamSync(r,{readSize:a,size:o.size}).pipe(e)},dct=(t,e)=>{let r=new _b(t),o=t.maxReadSize||16*1024*1024,a=t.file,n=new Promise((u,A)=>{r.on("error",A),r.on("close",u),tpe.stat(a,(p,h)=>{if(p)A(p);else{let E=new rpe.ReadStream(a,{readSize:o,size:h.size});E.on("error",A),E.pipe(r)}})});return e?n.then(e,e):n},mct=t=>new _b.Sync(t),yct=t=>new _b(t)});var spe=U(fs=>{"use strict";fs.c=fs.create=_Ae();fs.r=fs.replace=M3();fs.t=fs.list=xb();fs.u=fs.update=JAe();fs.x=fs.extract=ipe();fs.Pack=pb();fs.Unpack=r_();fs.Parse=Pb();fs.ReadEntry=Jx();fs.WriteEntry=p3();fs.Header=HC();fs.Pax=Xx();fs.types=JU()});var ope,ape,B0,Hb,lpe=dt(()=>{ope=tt(rd()),ape=Ie("worker_threads");g1();B0=Symbol("kTaskInfo"),Hb=class{constructor(e){this.source=e;this.workers=[];this.limit=(0,ope.default)(J4());this.cleanupInterval=setInterval(()=>{if(this.limit.pendingCount===0&&this.limit.activeCount===0){let r=this.workers.pop();r?r.terminate():clearInterval(this.cleanupInterval)}},5e3).unref()}createWorker(){this.cleanupInterval.refresh();let e=new ape.Worker(this.source,{eval:!0,execArgv:[...process.execArgv,"--unhandled-rejections=strict"]});return e.on("message",r=>{if(!e[B0])throw new Error("Assertion failed: Worker sent a result without having a task assigned");e[B0].resolve(r),e[B0]=null,e.unref(),this.workers.push(e)}),e.on("error",r=>{var o;(o=e[B0])==null||o.reject(r),e[B0]=null}),e.on("exit",r=>{var o;r!==0&&((o=e[B0])==null||o.reject(new Error(`Worker exited with code ${r}`))),e[B0]=null}),e}run(e){return this.limit(()=>{let r=this.workers.pop()??this.createWorker();return r.ref(),new Promise((o,a)=>{r[B0]={resolve:o,reject:a},r.postMessage(e)})})}}});var upe=U((N4t,cpe)=>{var i_;cpe.exports.getContent=()=>(typeof i_>"u"&&(i_=Ie("zlib").brotliDecompressSync(Buffer.from("W6ZZVqNs+8SKoLwBmlrp7fYqeY0yhpgy0V/n2JQfhDBtpLoLihs2mwL+ug2hHFXtiXf+HI6qalbSMUST0gcQVbe1/16L3COQGc0RVMXJoqzqSGoDo2NWnxEJZZoXasuyIFpUzi/W0azjN5zD8tkdHyU0C4mFFAIpRAhZFzyFa6D6vq8bs7CVkGlFvoJmUxxUY2dxjo6g2hg9Zs2IcGgmZLzw+6ez7y/5fyAhfNnbzyu+HxK7SDKP5+zpjhI5RBJJ1off9mbzU54C6Lj1FVBCsEWGRVokWzzTF3mET/v+/VT7z8+Xcf0CwqIIUJRClwWqGldY+VRJycLKe0TNwGTr8KxJDgu3J1ovPLuZmb6+JUdFQEuWAG3SwxnGwWo2U+a8xLVzcVnlcKYWc7TC1sp3n339xgGXOmrrgCW1J4Rv73irdDrcACnghD0/vj/1v36JxqVSODikfSs+8QSB1HkA45H2Lss8YwlXjZFdSTzS2H72qvb1mxDBgIpEeN+bsrsGGIPp+rxaZJlWWtH1Ofiv+mbvatsQiue6zQEJ/12mkgo8s1jT2HjAmD9MwmPVtf/5Nvu+fonLpdJtH/xmWWWOVfS2kW1Wx0Vr4L5EFYgoY16GjvXSLKv2yxAdYptjecNJiMXPIgxog31TX6tqY09GA9gvDESKlEjuWxXt9T7c3021wp1Ls9c3Ig1SCysUETPO4gLWgJuU0Vxr3+s2D0+V2/9y8SfeF6flqdtTdRKSCgQJOwhaHcb3RG30pVZWfbp0t5ufGRVYQjYxQhqBvE8efN+cHq+BUY4eywN2K938pb5kqVsOwuObtTpeAw10zfFLVgoNKQb3st1YZWHY603aHCZbPR/7MKLnuc+ZySQNbYFpCIA/VtdpiMC6elfChF7gtPe6ZRBGwGUAfC7b7+t4hUSmhiPNSJBamUmQdOT22wKkw7PkZ4Dn6cXrPz/ee69B2OznuTOTZFqjLkLTv0prENRucIsf39g6HjrImu3q8c0w4KBYA2LhjTA+xBYq7n7Jjxpq3/HwdzfY0f5Rju9VV0NhwG5klMg3BU+KjibGMkqQxo/aqz2/XLzPVfyZcZanqqubAhq7wGCjnYImhYxtOYMS7IGKbux/vzsjQVKAD1r+//uW2be+F4kEkF+wlbLEaFP6k0igOFob7tiII+4uxBNBZEZGNlPhE6JqCIKsbrCK1aLW4jnnvki89yLBjoxEcTITRa4qkL1WsTii2PzrL3bPaIpR0jDHcvhHKG+0PWM59YW2xvvm/P+9pVa7Pvf9H/EjMpNMJkCqBDRZKqotxXFsu44IgBRBsWtYbOM0zqxnRbx733/Cf+/9L8X/ESlG/IgoZphsZUYCqozIRBUyE4ifkUBFJkBWAtTUSVBSnaRRDySNgaQyLOMIwx4SpM4hUVQ7VY13K0+11XjVOL/tWffZW7scY3e92SznzKo3y1msx/9vr5VULXXPLHQ63AjOatQOCXkRn6169e9YcWPCxonWe7delZR3Qm9O2BEgYMbVjm02Rsz+f2uf2eIO0/Exsppu+IVghV6/m/4zL9CZWSBwqLCm93W4FgAcoHCANs7tvf5alBD42fcoOjqq8suAl8VYdhCzMyu6nZxnuXOe//4qtedceJmfDXj3gL0KDXhW8WBbVl+JuxpEIw5pJKCQYIdUD/eoJvPo1gLmn4LFAmNB+//a/jtXCRUwXiRV4u/ZrWfgt/l0vMncm8FFbu1UDMIAE2zAICzE7hmoW1/F5w2gW9XF1eiAyP3/VEVKFbqQhB5qQktCDQGkCFJEKTWAtNEvjTIzO4Fu9T9RiR7I+n61USWFkhBIpZUUlVCkNVEEBRXFUhHr6swMYPsFmrJwB+r1i4kKRLMgGr+b1T/tp9vltM/yDo1EaDFCZiaHzFBgHEophhJKLSEDpQSpQ4QIfWjhic91saZ9z79vzgbJ8/d9jmGDCQY8gYIJhBG2AgUdKOhAgbgoaB7CNKYxFXTQwfjq+nr4pmYAeb/dARc0aFCgQUCBgALRKiAgICDSGgREqwCDAAODs5KBQYHhwe/EN+HBoFAYFAqBg0AgcBA4gj//37b/fxwY9Qro61OU0jIBSMYw0IPEUBMoqX3i/xWxg1jrTbxbfpMVyqLvtNsWQjAL4gtBloCHIBEsiGjl5PPa18illcl1EcMb2vfo84SGD6dpcyyA6Tom3zjtAmfNr8mG82FMdGG/Pegr8a3rxS/eijlParoG9tddlYj7A+/5v11cY6V7Q0+3aijX3G4J8jrv/rpeOGZ3faPU6rH+WHdNt27x0WE02Zvr0+ZX5/722e2lVPEKek7UKkJXxxmsymgl9aUyv+9y98ArP7ZN8npv1sEzSV3EPM3gm19+C2DEfYv6JCX7tC3/ZFgWiFBiPKJSFP1j0eA5HoVCGTiAKpl9jHL3j8CRvumbfC8ZVnzDs4zUr9anMWiDy9gfHhdASZqlrPIzFllSMPtH/T6vXOefv7jO4xXBuqarm7o6NvWWyTf8WAU1glrOyvD7GQkzcenPvY2PX4IRH7NiGR5Jp+w7z1eF37jfqYN1nGlyz0nLMH+X7ADACLndAjdHcJ9hREUaldzookqA08GqFIklGp37abnfnhp4CbjiIrg2TwGzcmNl4ZkQ2gz8RSftSVmj3Vf0TFZ6lK8OK4Vzo2QetXWK1gfZd+Yg8c0faO8QZMVVuTtt4InT8Qrcr95Vi/BoXR9TzT+Or69v9KpwOcY3jga9zRLInAdFMj0nEBoW/uAklsn5zILA3GTs8GUchn8RsQ5WqInpsPvbW5ORp1MRRpg2EF/HwJZSw6bDafddkLXqsRQsOehfxCSSZlCeDtnmIVW9GeVOaYcc5LVfjzs/QTHDunfuWymuZ4xNM7lpGm0bwQHdZ8DMf0WY14U8HQKHVDscpDKS034d81gTwKZDTkhGvdoCoVWZOU83Pix5Ay2sDAU+9SRXsHI4b08H/XpSPzoNYIYdvm0klLJsiF+HfOUn/0+NzCP31u4ISONTWpr8iUtE3cNU8uhXlB6xOuifTRe5pFAoNnU9fQkKHvc9fp3CS6XjVvOpfP55l5ZIuFrXcD1DwXP57vnnKKuw/eh92WDaoGCFU+56HDW+f++0VVx5k+sVwJ03PSx179lhZ8orUpI7GFViMprLyhPkG+3dMcuyjzvkeLiBXlbHRKKNTh5iLHvWDJIOJmNKTNnh6Q9UeX8xrL1gbDViofH8M6L4CYT9d7HYl2fltbL856bOZPRZcEmpMVmdah4bRIpnzzrHtr0DBRb0X9PcBSdBB44iEDjLBEaYblpojuNejDAZYTLiZOjk+DkbnoLD1V1wetIpll/5DCaYWfdg/Y4dOQCWjzAnJA9Sagxgup2yxo4K9KOUrLJfBXpxf6sJ9aorVZRSlpMcZHg9xSqEMWzxZDmx/jKwafysKS2XYYX9s21wdR46kQ8rUqlh9BZPaXwqpK6Net3N4JL/EywaaR1zbbwWXDA/ZP0i2ENgq3Oc+VAyAzp07IoaU0sEUzuOJsv9D4RXw8oYQqHTuqDGQlBfSMd1uj2OVDAd4vZmrHPIQGSzSsTMJH7mT5/RvR9vUJoOpn4qitqCtxc+uJWBNRG/l1oVpTwNjTmE6+bJhwsns29rlia4Gg4DDigs9HLwkpjLtKxGcJKUsFJWImW7UJpbUKG4jxTQt8j4JylKAiLgJ9mUBERAlJAJbKAfWvJJHCxmTHKWIQNhC9oZCxLfCbRoZNF+OkQpkAGQzEl1rwF3MgYn+WDHPYicsUgkWP5j+NTG53UnyYPYwH+KDLXH9pwdRErLXVSDEW6vcRk/fEoTm5u3fVq98j5cn3QEg/pUn+tFLExVSReA3L2aKeVpxiotmNzE5bUPH5IzC/IPg0DaY4fjTbzb0LRmRs1iuQ6G1Az1VWSsbNXBIev3jqx49TAoniW2cWlzLN2rKFY8PfE6haFLrSdQexF+DWLQtnJUXRzEun/5OQdiAUtT3j5H5wj9Gk/X/ZkQi+ZLFE7EVQkNO1c2SJ31Tl2FgGMgqYI+pvBdWpRuzeMF/Pm1HoAWdxsQXlPtLT73lbPlaq3YVGT01yE65BbBNIlePsCSYcSELDo5jeOCt5EL8lwS3iwBNoiPGu94OASURf20ru4V1MoIHkiyNbS89qTU0+8lP+J3/ij5O9D/74U52+FmXv5bXr3u8ezUvXTN3w4FA5+I3fYr+LEd911H+PQOJ/FFFnEzG3vfRob8jEz+p+nUCmmpLdKPpUM07/oW5MTOqU/CNE/fvleySQmWAwo9Z1m/PFQ6it12NChDbtypULYkAFmbxr1PQbu4/vpqUdd5t8HroeWJNPdePXdflSjTR/NrYtdlpKJtUQA7PJHAIhucqyHvLsWXz1ClULlYRpAe76JdVy1RcZGvGypk7ZECNRQUi/VZ8Ckuu2eGUxzyo4TQNhd+AgXM3v1Rgl9ERNSghV75R3dZw3q1ez9YdZJOFXBSi7S3Gl4NSP9QpU0O4g8SWqpedhsh6dKB0eVQCK4226evUheO3zw/WTIFW1S4uWb8rVoLqiZf8AD1DF5eR/g4QSayMuhXMp+4XWliHmlQVS3LcLm+jTPyyUnY2UepbQUmiD7cVU261Yfr4Z0+V2wWDN0CAVLgW8dzVdCCkZjF1TLXZ0GQ4zbKPUdwSYFLeUUh2X4pPvX7rSK+8BtBwuAF8vziMdlQ0XqA6kOhWbcy9aX30thCMPemch+ZRZg9x8Cc9DpyEfvTvbuy8hH6BZLQMUwys4VHWDmQHOkZ9g9wVlMGjB6bPxflmYp0TJowac+kHJ6JR1K5GHf7IqTFoL010SL7bssLJFAIvXO+O5vey34RmqFPMltDRKlnUF8Ua/HQ6jaYPhudodKJTkPc7tXlMimQtxuBnIiblqggt2jpCP66TFQSU6wMb7uF+TR7aVWMTdbH4uy1udTT7rAFKEDF8u368aKOJ6P+WA+OykHBA5bWmL5JDm7t7xhE11murTdY1s1cdZQ/52dWrCa15KTEWf9Bxpl7SDyyIsW1Wyd42Hz0Yl2X0/L2VvW3Vh8RcQHW2+UhMHpjHbiHOMpANg2IeD3U8CJiNW36dMCilCW86RAngvsa3LlUKznzHgvGQkpDOfBlJleLuDQdnakJyGMcjEJfIdDsogRdxhAApPBuOX1Fmez2wl1OOPasH5FwoFU4ihA0dBytr1VbFkZF2NmH2s1B+ewIKgyWjPUfhy2xUByiR9wYxWEJrfZ3lcGkUSwRTUaef248ussRY9mkGgUOLZ1ju8pHLkxHw+f0Khu+GopHl9/Qp1ygQuqFBOPJpTyaUq4Eh8s5c2rxfGlQiv6hlj95j0cW9KSeogj+GsSgraVvYTiIub0HBtGR4bpPcKFhrPDEll2329pH3Oxwfefex5N7SM+tx1YckGI5/iJXwDOZQcmfaXGug5UfNfhOBk+Q1xfnUhi9gX2p95p3xVnrUTrv0/N/5rD1Sn98nLDXw+/3xmwd6ShdaVJUfDZ2uGOepabxEiPeida8M5BbiSt9f/cHfmcvj5IDZQie6t9JLf+uqs71yYoPloM/PMN08o7HiqT93x5TevCRLe6y2f8lGFXKsEJG++gb3k3KNyg+epOP5rtqmXx3GRx79K0uct962zPa/Bg95OvTkfV2TXdVkN9eYsUlUv8OX6PTu+cLF0islPejhObl3wawlS/xbnLTVcqeNb9PdJLKMj6bJ4YyGSvhkehxT88mgt0P6Lw7htvvX+0wntwsJ0+LxWVmZh+TBPudvGdFwHPnGNpb8HHfJ3UFARrYekbq/M6WXeqtTBVtdf2bjBsD5nMSMJ9E9+6rYl4gxYmn6DkK1iXs1Jo9eibhHIloEIOoufDSyFO/xMLxdNm1S1QLzW4RByQ0KFte6uSaz0+xUYaPkt41PG0J0IFEVScKHAqLPelHlfGv567YB08lxFQSyCAqt+RV6J3b1aOPxPvGI400/HeCupZu/3tYcWTZvbgNbxaUTtaSZOh4uIEkwuR0/Ocgyrc24xy5cL+0T60MSLyyQC2t+jEJ6jolsysE3cz/jZTNf6MqZOWhoImSIOQebWwbdpAHaIpF5Cd+LAxI0mjLJO4fABG01fY9lj9hHwZGGkVHSM192pioFhyCVMHYDxmZc0UlAKe5rw1YdJLVpFUFyXiX7cphieT3KnVV9SBh29SLSMNjd6SWob0ejLVHySoAursKnTg2jNyBSitRg7FdIyiThQ9VL8o5j5MGsb7V9z1zmbvhQxlvKlt3mp4laoXvRzWwCqOwyA6vFThRds3vmk97Gn0/xOuxX8BXOfnrAU7+59KSQ6FTDN2kRD6V7bcxmrX3KsuV62DnJlca4uzHQ6MTw8g/QS7eO1nuywRl2QV2T1nXZHTnfTBb29YvgmEBI9DrWnhW40jTmr4vU/yQ0vO+BNfXWSNKYlWZfqWt+dJKjcRF7Dt6iFnEeWl++yxtMP9Td8SXDfAViOigb2aRC6kdxS2MNyM95AN0MZMhUn6KTX0dPtOepjfBiKImukMsOHhOQ+AbhwpBiAz6siGpeh0Tf64D+HVRYnPHYQmvTyQ0tD+3JGSX1qcdXQgK9EihNrX0Ng1tP07Amp8bDZx3+UiDXWZPSEhrnDq+bD9lihMmHXDmBVBx0nvRtcwtElHqPg2MabJOyVnjtMXg3hYOU/yDo5SZxrBqQxtPIegOcyS7LUx4CCfykXVvPjLyZ4NQT33nKUNGcreBd3KuykUWwoT2vMsrNCyhoDnPGU4seRySLH/R8x347wIhxc8/6GjUrppFSF++b6vR06ah/Rr+R3CuSFzlkXOf7N7lWyTY7OTw/A/Sbh2TzXa6wcE9amTq0Bu0atkqfPOuG+zjnFj8kKi0Tu+Ze7CBo9EXi66cXaBcJIop14vrBG/Hzjwud1aMqD19l6wXZjsK1XJS0+zNlsz3AmAb6aMDiN3dKDX9F1ZdPXUs0gNmGmgw5mGF1esx75L2iL2FI5I5rCAUSydLXMK0g9IIobmXxejKLrm0eB2nZqeXS8sF217c8l2jTEwPI+LDvK9xNFCMAKqsXqBZ8dBpgUWuG7hx8juQz3WmesbwXPLNJHitJUE48TqvmmJpmDpg4wDvCSk+3fZVfBzIlSyTPS6pZvYO6FmrHCXYnFIEoYay3zaihvBYVrP0dE5cSw1otdZOxylnJQoTzfY36LWGsQb/62lhDKWUA9Ku6wq+efkiQG3BSAnGUdiJKtSZUymdJ9JkHHaH9DtdYm3NpeWzSojosOVgKa1o2m1q7GgjNtt8eA02Ke17P3C+U8sFhxR843wv2aIFB5SLX/my1tJgGmZu8RbXmTJb6RxC/p3BPVRtB+fziJzKP4O4ZpqPQ23MeG0jrmC43vO6d6UFanX6/kHeDld4dagRsnVsTgfExr/XvK4xV87T9EOPRA1A6YovEefWziXVXJU1p/RecZHYeAjHE2d1HRdf0I8HRxl9bOLZTOzjO7ew2GIsQKVDaqcfluZZv8OYmXEGpst0hF/mPnXlyIU1ZC+tUwpEwoGSifvjH6qdrCXHbqxdoB0h3f259Lr5gOviGnToLXRgxkOupe+AVW1snHYEu3S4W1n/88DO7CHBJCcYX0WdcgNI0KUxGSauSc5VVSpXQhk+6kS8voKc7gF1TRQgQ3LzWKozAYBBqGEjQZ8ol6eudADcM3fAyYHzQpFB/k2dA/CShx4xkOl9nwJ0wLhWnfYf2doOLe2n3qSuX0KdT4xtv7czJ7VMTDDZfAKIvgxS4bX8xNbpXhTQYFU/gHaMaHVeU5rD7GL2je636IxeUFKUrQccmQCmpMVFiUai2vx4qK51xppIXxb4rHXkpEmTJCAJ2NQlHVO7DehbntpNjhPPTMGR9qc9RpMa1OTJGw0HCGpntPEiZpolO+KcYZsaM1ibxrNk/ngY0GidFr8/Di7txtCEvcmttLMK1YrrPfowF5fCNbFv8dzeIOziuui9t+zWLijPrYv+wl9EF8P/HQgjh3m2MLiKzRmnhDnVZpeGUogoauFAv+WWurIKrF5wd1iOuxSlJzzIbvDjlEAP9IiPEEAXtsp5vPqWZWkdkfCpadfwlNTo8hD4+oqRXdHpGXp4lL6V5amMe04eb30kE2joShbijlj9+Sb7BD2nm14Dpje0falZfUkTbr6EGS4UdQpId4ne90YfF18ABoCq+GbmqJTV3HeRow/BnI9KLd/K1+gxAferUjzh7Y880pZxwrE89EiWScDRDjT+HGQ0xSTjQtpSTr2cfjFtVVkFY2Sh0bGMLmj07yDXq0ai5PNMlCXHk54PXGKwPuukOsH1I32EAooRC0vTmYjvD94/F9Pu9eazDYZbfEzLD2Hku/yQyjAVR30w53uKxS98H0FLB7M4hEm4sk1KyFBwY25lox1XjHtNOcHgj3HKL3QyU8J54sZujmKI+LJtzPIgIDnBpEYVcD1lyHTYU2UpQWeaj7t77GBozFyjjhQzVyIekhijmquZkWQC3wNJ1i9ydjRGXyCJ97FoRXXYTijhM3QQ8LMONncbmLv/Naa/RIMHmg5UieOKQH2RPGYAm8wUSOILN+g5mPZrg5KQ6Vkw3nz4NtQXZtF3kSaPb93FWXVF270NJJg/2XKf8QAPvWkkSb7JY6CvxuH/ZEwK51dyuRehQZ5phCKAdZYpLTPzxHwf0Oe9fD8saHnfuAfmzXP2fafogCateS1KWqmsqr/Awt43Q6XpzHXp8y39+uXoaFSHPDFh2HSonSZL/7ymNy90M5R/N8qnCmo4VHOHoSMGGSvbGVN7pshHoKVdYtYoFbkWy1mLCk8uh4u/9BfSljtuuH4Iygddv/vl40pQevgCXRu6fSG5CMam/OzJeyxRwEnjdG4BQvM8jSYCRglZsN7yxXCu/nL44YyfIWfM8NWZcQrZ7pNAspKflTJNW9IOMbGU7ThfsXOQMU84musAVB3psrIEIagwBp1AQkQDz53LAh8bsXTBYQg1/UM6vjFiINcWrmMBZOGTm8b9m1z9SOW0FXyW8TDH5becxaOPh19yZVqFH1a4etN+C14dNTMQS37rTJYML6/rNxE3gKdQPTwl/HZ7u73fKx72dqSLIS2bJ3vmqbmAB0T2IThpUODMn1ONnmzE+ag6HVraCvMRgxEVtO7dYHwb/u96TLBzX1nn3NPjW/Mk1Rxg4qdMjgLNuGkRAZyfemg63lIhA5ketnIimkch6wQGJZi+RW1+UR4JRUJruo7TjpiMi4Z9jYxCUqf33rkCa81dcmHSJjWFmp//pGCmn6hrngvCxpeZADLeL6MCV/6cI4leWog7yRstxybL+W2xfhuck+CpIPWZbMQX9XoURaiSlJEsM9BipmRAqI/IJgZHGoTu4yhb/Ab14E+2sPPX7zxlbrgwmFM44bNDLat67uenBmzoNyOKR0nNGGcHO/kUnbPqCs3MdLgZidalDk3fehCHjFuQZhiNsdjYgxMQ0chZpZK4Qbhn85e3nyOiQTSpUoZKVZYyhDOKSx3JmAkN2+AEZGtaoMbOUReRLkPavVdUfgv0Oknq2WAcPw2AzpMY9UDJO96p+KMFAjN0yD6jAqONZMVyFPRO+qaS4tnWY1KA5w0gZ/Ei3WEyeSMxAzLztjL+E6fN/Yj5ktIcOztF+kgNcdxUL/xD1pVNmrzQMNZmQCm+FshWahaAxMPahV4Mk2q/5nqYKwW6c5S1K+kNUROQNCq9/YiKKRLs24lLyHQBxEcVIvCwn8FJA3cHtWCnmC67/h3UcMwdo+/4sPcBPbwwyoEE3PVbcM8C7ktAdBO34B2CRJ3RwIrFcp5nGZMfm2pE00KsOQmHptiTPLrfxPJQ6xIsF6JoXAmsx2Abk18ba0TTpnboDgA0FRqHaC5vkpoESamu5PH25AOCupzNMmvVCUhRgKlwVg2pbuwmTNV940n2hB6QIpH5og1dMq5Q3+fPpo33HJM/7CqPo2y+KuGe+eG+aWSLLcNmMV1hGQY1Urg1+cA+sB3Ckq7yXlLKwwc1LuHMfQnzx3UJ9OySm8Mlei0a1O0EQ6G+uHYtzkvrBTDnBdCG3qhoEiyNdGJUOuJGpWLp0PfBOqiAO3wL7k1ATOZsVdRGHE0UtmgsB2DJDWAUcZtqRkTTEACq+kB0XE6XX5TvIUwaxDCAY5GjAt5yPcy10qfJW+2ya8JTBOhV656rqw6/OYSVqZJ3nkq0sngUpCH3oI+7EoRi/gfrOM/OLkCdZyRYMshalQBGX42/J0WbylIlDZbOuerEmG+QGryIB9NZZWInQcUtnRpF6ENxCSIgr2mILbrjZymuKM+EUs1gAk+9oCJElVCppGsnSwkSh6Fl67i4UhWA03IAF39uGnYmS311usPSJK/vjOUQzFZpn2kdOODxNYn5Q0EsTjxdsZSvC4xHUcOMx1JkgHMhtOaickCdlSeGoplCCYp7duRHXX1BIBg8Spq/rNB/LN+7mGpzkfdj7WaHbeDCx646ogkbaYJ7gWnAMtmjPPknd1BypQbeIvE3D3avuHiRp+DRaZx4aup34abum3DY1FGjtrnP0NsUNEPh7ov3gyZP4R0Nh9ztYpZeLnjbBVsu0AQUDgAf+OmAF2yLqSw45eNNYo8JX6bE2BW/Rlqe7H8ZTWpQ7X6Bsui7vOu0z63lwyOfH/xy9t81QD9O515qzVsxcze8Hpug3X2L0YPuy13dQpot6kezvNa292Crf2B5mfvjis9vbfEWQLb2Mx80T0v+UeUTXnocTt7MEZGfWU5D4rPGbgnCnVTPeuDQPb4WtxVQeYD6CLSe4GIUjkjLlPikGiA/YLq+DrV4db7dFEbYwTCC/AnafbDHMswTgHz1GcHrD8z6IUJ5R97cyDtc7gmVS+zI+jwyfDSab62vfpWNSDNz8N4jue6jORovziovswhDB/rPqnG70Wo/PNVZSdF1fi7LfLlq5off9d+i261T1V3yMICYuhCGZPHkShbSPNFPSKtxlVPztPWWbq2MB2UUOTE+d+B5YfOFL6ILjf7SeRjM5yv5QQ9fE6wzOYnz4Z84rVNfGN2Oab9d2ATfKtCcmmOkGMgUGFnbSfkLzmF0+WcBZ/CFY4RZQ8oRvFzXFyLKcDbQbM1Xbi/4SRVWPyVDvmpGn0Zg6vpaOVosJEfJ0mSkk0znXJrz85iHga3PGKFgAUaM989zAVsCYxoFYtrLMK7tNCPO/+pjZukriuur2cPrBUPA6gZLhweoGhsFKgnQUnZvL2UkmjdIfOQXiTfizgUkLLaNkoiQGMt9vSb7Yl6I5U9BSUxeax59iBI6ao6baUsvoKtDs+WBhEQpfdcxjq9R+rdwpRCfh0MYjCF15DaxfFSKgm8J1qP2i0HCqo0hrJ75gaFNcABVC9KyXN/KRjgm+DRefxWMye3tHsULc4wSJm2GLqXMKoprNBFuAJoT60I39ecI8vomX7lGaudP4FoySdJNDziqq+POeWlbMoZzO2kbV1AIVlxaiXWdfaVpn0Y9rmgtrRO7mIkEDARkSPsRk4/G7Vp71H0zZHvRBJRQ09uxLsnw03qQ4VyAo6JhkZfHS7lVeIboIsNo26dICykvL99Iy1bMLHK3ekwq+2YOHVBZ69ExMrcdPYC1UtUBjnBJRiHXixLLORdaymxfdIRve7oAaQ09bOX6cLeBHvYL9bDWV9FY3eoKhI0nlSXOoyGKEOS/bxn9THdpmUs9V2N6m/gdhkZG4CkkHm4te0/2cXHgfgWu2ESKA32r2FUUm0iBVsAtVcDUUiULhSqQgkp026mApy39DmkEklJFg+MBgLcKAEsKiPr1AbHTAwBNAbz8Gidd3UAxJcN5bIgJBOBbjrhm69y1fqgh2K2CATwNjYA8oZB1uxwjwRuzJ8HLDQ8z7WxgZJx41VSqEZiGM4PFUyOTydvlWm51e0YhcX9ZTmSZhrKDaDyZRsuxTLRKltOe2lLhrzsTL4TWHVMj2RqLzQwcvMQToGMmEOc3sG9qj4VjJMBoIVqHeJpqfxMM968pUfXDUxKWUML2qOnNBTr375En+6VN8GVEP+Lat9iiE+NdepqwhVSI77XvpZaZGPC35sVRN5e+Ab51s2hiAL51hAWosG7cab7hZlcaBUyA7JNN2lbktdb68Gk4cdABmovGfZ8+dHasli8jjXEP+fJ8o1uMHYeEkhz+pHWCI+ji2s5xiZtuTecFxujRTRo9xMkxWe6qv9L4SRMEgYWFnGV7Dg6U2l78N2SRwlNrJuxvztdbwzIDR7yI+AE58E+x9gC82Ewf9WNyXLFC2X6FjIGaZQQQ9BVy2WIjnUH/wUmf1nqjlzNHrmK47GXLimtOc2eQAVuXzoTLYuk5jGUZykhPxW6XpJ2SHJNnljUgFOnEs0CudTMmkFdsDDDbA9Mz3prUDDgaXj8wrZ+a7k4/togD7oqXcEou8bjFJbD7Li3Lp+ZepFY/soC0RpcBbOWA3K0OaPscgDUA/kVu9Q1AXItrYNMyikkTI1A4jGKVGq/ePZX2L+A2BB7wW3AfAm5J4AP18DhRDWjr6LW9vugcPT9tQISjXVHgCPBALXua/EJ9/1M++1/wz3sQ4QR+/LN3z+Kr34iwkLpqEOtoq6eSRXx+WUvZ5wrWys1aT45ZfU0pQlH76AK7CmKL+CrSh2DgEQRYQN5ZfNXTDjDWg2BTQ51JfQiIHRBZxKfpc1RSBXhr0qjCaOBkuVGUlf/AZT3gmOQ+YK1jsB2Bu5oofnBebNBmt+f8usa0AeJanAWbVsZLJg0AIHYAsEqA+WfTlv3VwNUYAlQGwZKG8KgdBEQtIUDlkHZz4TMSq1dylW1exk2WTk3PW6zvpkaQekpgkjYCkqdkVmM970wECYAJDCp1i0yIvewQClBsI8TskoZkX10tg55vj62Bom2ysN0QnS6U/1aKx96z8XhYmMGerba9HSlRxhFabV31098StBhpQqNKmJ0WhBLvLFQKjay+7+j55IL90QkvBdWHkX0YGWVRuwSKQgM3dBi4XSh4tgPmlpzM9SygEcVyqCDabYT3hGj/qI6aPVEq1GF6DqbphywpeeuHTsBOt0s6yO1Uf4JqMSZtz0p5EsIgczLx0O46tji8nDQhmMFI6l/lhyZtEbsYNWqj1iPCxTiXsOGfH4cTabetENCfqgUBg5N0CJImo25zUZQb75qPEZqJHMxGnVDMR+TpD3al+9xiwGgD3nDvkrS7Q15NIW1A1uTzp6GBkfaU3tGTMrMxp5RGqiG7QiRfsOjme88/2WHKY/i4r94HDL45DAWQM4YbcHqN68CdiEKc1CAcgaDjbS2zJp9RHGd9psrBj8cXIS++OzWUS4/HvlAcavdNLbRs8SlcO4A9UEFgOsd+vvF0Bwh57LWhOGlfvl2aVW4ELDBtY1btFQ2A1sjizx8bYKZ5zzkY9iH1lD+IJctO38h3wEMMIKzLalzlQqQ7kWZZ2ZYzllZls5Pc/Grf5zE8bIx4E22TX5OViedaw7qWloFvmrADZCMpnpF9ao8ZBDvg09548IHNsT6nTlWT9tyu7zae2VYdIrsFDZwNerrZHbokj4Sep6vtc9MyEBnxBkzWVnCF35NnDiUqSs5wgX0QpIZJ/ZcCfuFjE3E2Q9BcLB154vABjViV5VoS3oJjKpdjj0sUG+F6D4U4AgTtiSJ/f5d+wFf308l9XP/W1ZHc3euz6kdu0ReyFBVKdR8Gmhxj1Rk+KOpJoHww46su9olJ/jdrFaB+EgSQ1IzwN/sROx2rLoAbNSwr6jFPfrq/++M4FLRRIAs3pdfzakVXc7llObBzGf3+mByf4spbohNCj6Lf3ufrkYjnlSWq9WjVQ+/QWdHK5rwLYOoKvxl/CnaW2cRTk0TqXPrnZnXvIhYjmKgkomeFmNtThj9cZaZyjKLeSoWvJD6Sast7x3To5AsukWNDMrAR1+K4T3MdQftRMGvdAm0Um4Vd5HJXSVLyyV+TW/TyCzuUg4ndxcCpsvxg0na/++yoezjA0wrpd4I/CaAP8cmK0z6fv6mJepkUl+2Sbg2PZx90cMCz0HDStAH6l7ZEOS2Kbqn1wTKjInOkzYdIRSjoWM1oIkZO1vaZvz3Uf/4r7B6RuWtriY4oWbOt2QN4le+VUFrjxZk877HzA8l5+7pl8ej8RAaLPA7D+3cx8GIgj/3z+GzivhNlNqBLtsX93rrBN7Jtu9ZNgd2VlL8fRRWUQHvDzD0feceZkdtPuvHe0RmCxT98ll9f8tVcZsZn7OvkNnwTtdVpnw8FLwp0ePufsga3HbCm9qUDOItPHvBbNY027edDR8ZKk7m+uupAU/+HHhf69tgXus9CMmnpJdwgsQiP6q36Gblo4nDvjmUmSfREQvq82PUZKd5pY5rswsg9vpzkXUpsV/qZdzPkz8jwHaPxNwkSiwKROhzeKUa7rFjOHr3cAhUkMwhjgs3NTW/aqmPMfIzQf2ZRQ3C33M58H2d4OSXwEdba3RMRGneHr841HhPlNbxrDX1oWc6Fq8LFDlIGWAANnX9nC0OJz6wJFy2QUUeQlZBfkm2Li8xNFgrFNPDI2mXDjMyPLHJjWdgQYlFV3+uKA6OpW/pLDpbfgXEGR/07cTlSgidqCHZ7TLGDg5jMzE+Yld8NIwbJoCD4+MQ5Il+Z53VvEi5DAyS7ZRgi908uWkFMjl5UKrS1Jop68rdmPZtNHYyPHuoZjRfpIVeKroek9gZymxBpncpCpcZkfSrAxZsT25vjvJf5IDU3MRhX+g1fcOATPvBB+vCNUvWVyuSGCrIBRpbbIWEQuB+Dt7aMoA1Gxal2l7dVhYWR1c5csW26e8S8IrGj7Eo77FWJpLn+8GOWtl7U3NsC8+K5by9bibCo9fCqT6w7y2WZ5f1VZzqhJJ7D3+dxhitdUStGq63AIetOYVNVn1fZqvpwtpaQ3gy8cAXtydyZrl2/xb3PkVt+LIIE/WZcV5h7+2zbv8ggYv34y8fyk5AdQCe2knsQeqk7DUjmMn761ksImp/4QDDPacmSyk1MTzl5FmkqEVOlQAwK4oucUCA+2JgVO1591a0TV905JFT76u2wKN919W5c8I4XDwIbhvhzUXTFG+FU9oXPfR4IrzV+iy8Uei0DDr6ybuPB08M8HWnRS/X/HRGVAKTqw/zFOIgzZKkqX8bUhc4DmLzmQ73js/uf8yGdT6oF0adbaYXqFTS9vsqUwPONd2WqeNCdTX40sAj/5+qh+e/CBxZd3kZyepPfWnfdZxLeb6Aro9JavVxeL0Y0pfUducKldE+0iGgJ44/V7z6ATqWPsWAKWXpfdv7yC/+u9txMLBLM7Lsm0328NFcY/EESKUSD+bAJCmpx8HKD0w9UvGXJxssaWr0hAL1ZwW5cGj7AF3xkDl2oXDP9FVok1Orve5955XuH0vcu7olftu36aLv0/bfWgrVN4vcsGr5VP6U+FclH/bJwvfy3/mtERNzOD++m/0PPN39sDz+9XfKju306jM9OxqJPG/jgp8ekWhL4YFfUL3IebqpGR5761FZcjZ+L8/x4RXF8exLzl604fjwJ3lt5KMwOQvUyfsZKqqI9fruUPX2LOZaYLZiiIwF/ZPvfsXcGvx/xPD6pDlykMa4fb56OD9yPkQOw90DTeSChaCCLYdDfbUWZ2EyZgPIVAJxYSaVFLcAe0FkKnxagtxT+WgJf/99BNTyh6BATOBiefEgi0R8WRMqE3YG8WcLdE0EYbR/pPivCmPxSIYRDr57MABsVHQZyh4ZojEjeCCDZLBDZPsrwxH4pgRYgA2AlE3IDVYQpMZUOJFAHwp3obMH3tCBvDQwvBNSRAYx1Bz5WCFvDhMj6GkwIphVBGW7E5oTgBuiJrIhMiGSAAICnOVvBcMzZegE3ZDeDDozNCJ6AnbfgB4ArYhsA6BlYgJCCTYUs8lhbQKsJI9gZMLkT39eIy4eQ4Et1We0JT7UA4oCreaj2GxJd0KWEpxH/VaZ3UAuJbmhBeFrgfVV8X+UNEnnMPeFZ8JaYapcEi36wHAnPhutV8ZTsGyyaozHCc43/VsUPaIJET6iF8DywtoiQHaFXbK5oPiAsEtSe0PfYVsXMyQSJ1sBIOaDoF5xdMXfyPyTaoloQ/Ya/iWlvHMCiZ1Se0N/h16pYgC+QKEPVEwbFLzAVm5whUYG6IAwFPlzx4OQDEr2hMsLg4H18Ac6ydfILEjWwQgkEeIsjeJH9l8J5VSrnit+hdIwF51A6vgo2MB+/FP6sSse54o8rVVvGb5irn4zLqlQ9Klxc56VXMJM6fZrl3qsNhukA+5ofXm4wLvi5xvev/7T0+vefw+ZsWCZCPZq/+F1x4dWB3zucp3WJfwwXKD54K/iI4h1vLQZpneMI/FmrJaaCP2i2mGapqVljOuA9NYLH7h/YdfqPvmde1xbs9IkRCu4bMGDWfpi2ChY5DBdgJXtrr6b8NCnYGGQW3YPAkSTUQ2rQISjygCKzHTOmXLyBzyjnoYmDQFUaKBr6X09soWh9D4pIMx8tSOCoLsTKiki4PnTCEk7a2DfcpR/nQMZuoFk9ehKiSz1RqrxGdAISH5T2cXzeM7AFmkAKuYKvjgjeOQsBWivywOgTtQZFdqgulpUy34MiD6hnMrhz1ivEcTwQYyP5GhQNRfGQ5BBglWBwGLUqnTZQqKcFRKAmGTYGYbBa7SQly7KLqV1QZIEdFJEkDQ0Z3EBNPS2A1WkUjTPgCT6zgFigqLAb6GRaI957nNcLVulcQdG6HhTmsC4ZDAotoms9UaqBJq9c6S0jihip+jg0cTyfC14ts0B4AirGOWZHBNxhEqDMimKmGmNNMMdhXWSliPEXZ0fh+Y9fxPDPlu3uSXbr0IjGemIAruBQRpC9PV07NVZkBxaqfx6IGFA0l+SHVuzLK4aX0FC6Irr3EgALj4zXiDGi1YJg8SgmBd7h4LYWkoI3OLpx2KegiynIL4IKMIumJKurimDv8opE57HJ3NYEvzhTWvKObKr/7VimpiV5h+lh4JCePZ2NhLMghblmy73R9ntOOdIfZ27eI657Cj7veeiHg4MKrsGhILWUBsATsMnw8bPun72HL877jSa4DXRUK9kYsRbW+TSp8NlTHs0/RC+wy4aQpvDwFy7Tm4W/zhkRAQeQgkMefxkYb2M8EM614aOhMLx5DTgbB9nxHKbPr3nTGTwxXYEDmtkbYXVwMUO3U2OAJScixVH1z8X7F14QY28HOkkgwZQwhe04JMP+AKnhXPTmR2cGhKBdUBSvP2QEBZScrr8d/sJmUlI0jFALM2DNp9nMTp1wbxY9ZsdXck+Pn6qucjppmHYBZi0rSnKP8PPEmDEItO8weGD0ZuSo/HDKoKKcDNrpOPRRDQzqeNWhenpBPEdTGu5nE6XAybD1TZslQTrlW7ZDgyTAAjJJI4k5ZGEpXh2Yv157ycDSHERxxA8g9HMRI6jxlcACy3pHUTz9Wh7z7/14KRCiMlYIYQdHZNeIFmbi0DRdfXvN1TdNeLYWGVZEonV0MX0lp6GPeyUAT2iUpGbNdblxttepn4lYlihaZjJB6G1jPGY2PrvmM2RmZ3BhFejWOv/+N6FqGNjb0oHjPRwd32cCIMZAbSASOMgJEhJPAMG45d/2G7l/ikaUNOZCBiwgQ/l4uwqiFeKOhJgN98hTzW5nbCuIg9N308ksmpwP2Vx0MpCfTPO5IzyL4zQnRsNJAtkpX2M7EG7pIU0tAVmKkGVQtTeIiPa2cDy8Xjs1KVB8FACIKRcczK0q2o4Tiz2qUkW9+SLuqQG7RjHzq1343hnVv0wlAxYiTtBJAszg8LebgTjO/dWUCAYOnyLhacwQYHa/TxndTeuZeUR6OxKv5QSB6wwq6JTFu0Vew2ITOGZZZubJkmKqUQ3Gk+l0Uqx3AQUnHNOt2S4AUHNEpH7qjZoqjM5YX9oXb+gmZqOTaJcxQGXsJdDh7m42a89TcI4ovr3mpJSpP6IGjIHRKBBr7aykA/QHDyPJMhsmp97/mqgZNzc4M3HsrGMXRcBdce7UXtQEW2k2AFyhqJicVpgmKawBMChk0uuNLCGjAu64PrQb/9Ief3FXYVFQ7K/jINb1FETh+khSCM8mqvFZUJSEGDssCcPz+8R7brT9eFEf6eT3negEJS7GHehhqFXIDO0ACxQ5hFnRWgaFnhlThvsGNjoomzVS2ebn81w5LsKu5AfDygy1h8riyEylz2txF2oRvKoByXK0mHtKRnh07I47gICG4tg2Eo1EAjOx0UsMsox6YAo7zGdrFBoY6a0FUGNIErUAvBrBUCuO7NmfyNZQEGeqzsFp1gRLB1riclz6ccqz9EisqTeh4zB/mKSaC5si/ueOinkSGg51WLpwMZvNqib3BVIHmLX35lBwwv8+V+c00DxZezWtzWnyhizLxEkHS/pokq3uNdJjiia5quRKz+aEAMsOF+EXf5vTOh4W1Uq7IqQWN80wS8zh2waXrruFaZKpK8FQMtPVHj9OxV0sFXbvi9OamYRCvbVEzs4qg4C8VXAHziuk60UGLfvVkMNY7LX8rUYRTwqK2JWVCCa1iieAop2A+9S5s47AIrqOmbk0+1sLwh+EKr1SVzppU357/OQO+fJICcTmOlIBRk1iDj0ICv2BKybIAUacriBaLx1SRCc4rBnYQTbN8T8axkpTD9OW9SnFnNVDP+86dJBxMFU4jQxyaGQ/1mHvJnDpcnRAB1r4DC25xYUq0xUAc/SgurX9ER0FhXBg8vFMAUuHqtoW0v9RtiqDxVukEUXuDNf2aj0Y1fLYURHGGyCTUmxJViG7iRtAYizKEekOwIuL2hJfyYryLlaHsY9qwNok8z3+Mme3asAoDgFnCzQc+aS2ftTW1EkErQNhU+7RsZK4uLmN90fBfAzc7h6A15ruwIZT5eT7y9nOT5W5u0qFsxPcQGLgm4rIZvdz2tE9veXXu+Pz/DrGx4pzEWF/V9G/rW8yQbFmtkNKEiji1fT12mYt7zruK31b7bsfWtgp33Hbo0FRXkwjNkVnETfZbkMbG/n4+o4YACIyJRMtfrLAIqYe7KOoKcCOpAaEUVwNOYyKcuiuli8CJ4wy19OIwTau7AqrMrTSIZtDIsCuahZdTaHYiewQFwEc27NiWOB+rVkr+pbLqcNZ85fqO6V9aKgIiV2ZJeH9rXL7Zglhb0GlgJPXDv3iHHDe+9PUgXkbiDP7qwHO5h5n/8dWu7FWpEE9qhFtw37oxJYaakf4VuMscwUUM/t4CKZdB0l6xrg6olQM12OnxoeabIFdXcIM0ovCLd8LpzBDiqH9b4eDhEJ4IwbndkwtDTu00YGWVd2UsILRPkvJX5jj6LxYuLoDv/Cfekni4064TBaeKNWP2epJH1+pAwu7CUnwKBHo+dJUU3TUnuDwPoMKy/myV2E3CgP8lREV8Vg6tzY6yyKFM/ci6/JXUJyoWyVUWJnG+Thx57Vtg//2ElHw6i4ORnqw0JgCqirsA4TFw28rLcLhFqc4C+xWSqCKhuqtmhYNwVhnAIHpDH8x1k7yCg7RB/DIuqWjCjPjX4MqUwe4aGvvQJuKiQu83SSna3LKV9VD16buvzJ+LHUd3sUE0nCmWLQnRVfp8T5Gbz+yC4LHWQW1IZu17jqsMCi0+dgUHT5PZcIS5l8x4MjfCkU1aVEPjGgFxWfio/7w4VoNXt08n7Nj0UOTkG4xL98tztl7JSz583iua9Mr1R2NskMrDBKHIqJV5kmYH3BCv+sl1YYxdib5GMVuTuPNBJMMX5oAXACfpHVkFAn+Jll1rT4nc3iuCz91PSdPgA3k0fU8QONsEsoXlBSJMDfhXScX7sE3ZG/OcboQHyOBwWbtOfumy9mcEqGK17Ppy18TdUYUw3u8FpX4HX/f3RK8NRSn7oPk0MfWw9secMzhQqOzp1Ly0hquO4xihGhpR7nAAu8mPaqYWarhlHM6EOky59J3WO9qRucWOMeBnsFpmOZmK0v33vEs6kSTtpaKgzNJCqHUGZUMzVURLELEwVNSdKYuTJ9J1ndFwNYhiIFlkwkzUduqtKFFeRrziI+bza5oDb6ZjYExYFGribRGIK8216BPI5q8a97DS85kkV7hM2Or7PjuFhD/qxXiYkuOqYAZ9JKGM7uDQJiA3iOsi2x3UsDtLkJRpbmvhJzZq4t+RCYOGDMFmO0tbSgKI5q9bB4LkBUZ8vEOAqU4rYA7Mv5OOI+QbL2TGfhKkbeWLScQ2MfaBaAgsQAoSIwABSkHrLEoBaAFmQFG284nc3ggM8r7+WJOdhzDKC8CpRtlCGyMWEiXNDv8a8NJOYGVkDqcokcQgk7sp4SmAkAtY/lSPiYSKQ+KvTKDaPk48bo+yqG86PxlnswyYf055b0jQtX1ElqtzBHre+yA49ny2ulV/HPE8tNH853dfARjHwKvqv1kZNlYvqpU09uqf0CJR5nLUp/4XC85NBBW/dlUf9i/txTj4FRq+yrNKGYpJNI0Vu4dAbPs0kWEdIiB9JHKRRmST7iCS5pqGHcyKKEakZlNt34wj49Tbopy4MxJaVoJSEetXPXkEMIq1KmK6R7uDicIE4noF+M4RMwiAM4xT2wO395LXKg8GHOmzQgwyfmsysreNKdJX2/BOURFYAPcWjE2dkKVKKZ61Wh+HADLVmX8KBON9TEJO0jdGYXkkeLB/8RmIm8k/Ct1M0lkEoFmbE2Obl92vCnBbnRyU1NshUQJO10sEnzIeQtqV7En9MZsUmSFCk+dntN48XNJaroj0zhHKFKarkFgMWszBH20ADrYC0WgsjekFvQ7FPOc/QgCbVbTcgGvhO3CH8lI2aNwKVgQoAawum+AEgrr5ILFA/4xMek/ahJQt6rsYzg3TE9z81ImMctsIr0E0rYXd6KTLxYDRe+rAQocLbLHZGAmHTHPLDs7k9zFRhgGndoSRXYhAyieD4rWuxCPfYqZcK3NLPMAzmPZ8TRPegPa+BOxeXPGVHJGJ02ChQ0NXGr9J3xwww+N2mmAVYjWq8FeZetqA5Sz9jFJ6uv0a67m6EGaCWRLfw0hJdY4mktA6dK2CYVcOiDK6XQSkkpKwBmLgCUU0mN59XnRNe+yGPEOTiaRbLuNkEoJC05f7DWFFKdbMPuWS7mSljx8EGmCVgt7pVXnzXTQkk+Z5IinoRj0o4zkTzjJ7YtPeBAO4jWPczNQaYIXQxlyYEOaAe40hyPA1ruQYdA8W3BBF2VYgmLg4cPq66N2a0Jcbx2lBJI7da5wjKC4Y0lEY7NrFgtMXhXrOl+m7iKuW/CzEbvvloTey5TpA3eartaAWwPu3fuqJ2MChijUuiwOTaa4BQvAnt6V3+5X0x49MAmt6HpsBV1M911ofoGJ9BsoGAWa6TzCJJNsdVZmjjDnRNnRJ2dnk/PKgqPZXCdPlZ2dC+ucbfaIyRewnWPYMvPMVli7KeIwFhX7LR5z5PZoEEP70RdEK30ND5MUs+xkU/LSAVZNeeIA5awZTtD09xzFYxZeyRHwLxIAjwPQnXQB6F+AJlk4Bwti7fY3AXrJSQVNIQRhCOpiTVD2VelUbtbz2Ofm5YawwzJ0XwXdOsrGXNHsoNIVlVgAlTKroqvKFU4oED9KnYFbcxFaX1VhmS6wFFbOI+BuClChigWkfpGBNWQWoFnWiS1qcK5ydh3T3ZI0yE3unfmCIVS7tQVO5yInvKC7yAiX1Pg1zIghEgU3RwfPQfNw0bjBDRGJ/eWI1j+wWkrjchFaIpqy1OYiNft9dDeZq5+vYwrqA0WuW/0U731T6G6BFsTrMNBktu84BoZw9fR9zA2AtcmVFXIdctKwkpAhBCO228waiLe/m9ZYYydW7WtVocbZELVenkvcvtqL6Ka50l+Is1FFp9msKMeMXR2xOB4GsUJzEp+l3wW9obky3jdE5tQpPmBLiiQf3pTWsghXSrf7VqLPV5ubT6LHn8IwwF9TqH9ugvC+/QkWq4ZxCbABXKtU3F/y2RvhWa9LWXKVDoePwRmuQ5cey/tNv1W8b4AArCi8qHZRhbtvk2QsKjeSgGr5min13WHF+jaNymHdNDB8faeAEbaTiC1dPUxrQkoxmiHFSaa5AVeYwQ+mRY548FqH0BUSkcRCGkKgizeYWsUOnX1/2Qu/QBTGg6WPE9EYU9aHg4syM03HkLdIMe8lBNelAUwz/75mB4F5NT9Bux/8uGW+URV1+576Hr/wTUQuwlbizHki9DcpCo/4U5/JfwnL2MEXoPZlgAWiwB/sPa2pg5bswQ1OiUrHL659lx6/ou47Vai1BZWO37w9lh7/ru13fR2/e81+S4A3PDJ2TbeZQinHfq19ESlLtSxoojJbM46eUV3PaVSmX/P/2FdeC4VZezvmhl315RVH2nWS9T66aVVqKQHL2I3Mi0VnkmZQ60foCuik5AnBqKLTOim8SU5p9DXXTQ4oiL74clFXNOnrQkehE+uJ8qI74r3/9CX/iPGz8OgRwVIovhFyoyZSWDlIgH83eSKJhOO36c73m3ZmmEU7UPgkEVCc07hTdNsdolqDiCHNWa0q+0/0ZBH3x83El9DgQigzX0BxN3EHuMon72aVrXfQTqI4gBbzqfzDZ3Y3jNeqW4LxUN0v1MfvwnMSuETUWe4OEUI1IuUopjj+YpoE5kw1m9k8Mf63E0nHpL/FyXmE/xDRPk71nZpNegZf2iPFyWredkQ80UCpFqxfBvbaKNbvUnWpWCaZFg8RlnmrmuHiQZiaFtAs+D2318eqQ/9FlP4LI6JBB/gjBFSvToBVdVs1bhT2UTmLGWKsW03Xaf/ZTApLtilxVOcxptDTgM7kguLzD9lOAHZIva6yj3hoszFZ/BrpK27HbP7IZjNY/SOHtrfGPB6j7pHHxd6a57eWy6vGcDqkHCyf/9cq8p8ZH3LUGWumKNJT5YdURm9yNx7TG8uiS6cPr01EYdntPAupEW3fRe/JXyP4ZTWiULzWftJgCsWiaxUWxNxVglvvguOKn4v9ox/41y8LsdYkZur/5eUyWbY2lUX3ix1dxShXr8VESQbA0qs5leV/lynXchwOS0UnaiqZTQXgCTWcHmoFfZ4hD/Ainwa2BGCZygfrxYeYlze9bC77CmVy0cZHjDRSIA+XKT9srNaVCVD990LLsXr9Wkk6hZwh6cLP/JBZ2l7ovLy8KIFTGhd0vFHdPEfcQotSzeJ6kk4hZ0DK4f+niPTyOk5CiFYDFPH6cdCJMjoIcecfH5scUPg9VnwbEAXdCDmFAuQtzJMmWLPs8rHjiAWKJKFKD7ZfdSRwRtD1sHcM1jLzEFqNiyQRW2NwBeE8LdOQEaKmk9dDNvvcmcnEyQp4Smi8E51wBeE8LdOQEaKmk9dDtvCs/9ua5PtxaFAM5AGO7b99Vo48ART9dZ/cC+Biy34HJ4u+rgdeSp+uopivzOyUrt0pgDsV9eNBllnncpluXuK0nzKuFZZTFV+HfqEmEW7dYxwkQQaMgyTIENx/KarR5MCUSzIbhtorzyd03okQG0AUInlachCHbDCf/qaXfnHzbxHU9rcPqdoQ+OfCafSvnS+o+GdvUkb/HatYJomIisM2oBPFPXTkhFWUiNQYukXoKHQwDGFIi+GC/7u6DiE0OxZzw8ii8wltuCDpklBQ/OFsT8uwn0b/duZjnF3C18RIoat45XKp/cHyGlby8OpoqTknIfWCkOEBef3DYFX9cIuImmvBeuBPq9/e5kvb3z9YDrmI9lUn92bMs4mZ6zWqoX2UCX7YA8hvvgVLh/sWwRLxvnVhuRvfk9J6dopCNTmeLQyMnOLgptvE3I8i8/pwWYHD1Rzk9RAl6RKy+ednMoqYpXIIQM44Q9KcQ4AgmkdIQDLEIRuKT+GtJppf/PzgS6TGoGhAqI+tOrk2dhBkpc8TdTgTbEGu0uJ7z4ySd42OsUecV+nafOvIO3QIJHAgp7Cx8QYH7HsxhJZWOwvGTfgav98hws2pvjMJL4/acC6yR5msjDeLQS/jsqWBEBoiNjwLGdzO0sVBPds65wI0FnypOqI+Ybt+xwcWADM4fHS+R5Lu0wxMgpvcLmcHv8/NPQ4sinG1KDvc40dxRGdedlHBP+25ZlVEy8u75Vgd0+Vu+xbF3nEBVKkPK7P2fflaVKT94vjANB2sCYQa4M4e+cVTFu7FcKdumzcIq0itmIvX5W/AkpH93TF/dJBi42WH5Y3HO4xowUAdcDNG1KANtSLYYj5qqT6hhc+BvwCizximLLI1pxgyHObkrhaonFgt6njfClRyliw9Wb6+bbWhyUILlQQFUkKIBAVSRvS7xAh1+E/vCcizj5vT8+y7AypTwzuhXAISIDKC4/AP4LRsXocDOISJ0nNwT7V4f9mLafSvZJEbkkY9UmoS59lI/jnA4h104YN13Cngame+8J2k/ZBb+kX8OOoZYD2a8BqMRQlyWSqssHCXGI5PhvkZ+5XIDei4ewt3vs22xpiZlRZyGaeXIRYsC7ZVNApCS/jXqLBsVPm59ePgYbt+xwNPuk9EwpwhPyzmLnvwqFwcoBoWpAJiUVLhMU1DXV2TXdQOgcg2cHzjnwk3jaTUCFMI1MDqICdASLW2IzHjO8V5IlETQ1HFNXfpfEXQk2YSiulgtRZF/qVIgmUuESsnqNBCNnKXjyp7S0JxXq6x+UC5xjmqbRbfk6JnB+onWX8nZWjydPdensQ0L+IUTGSTNRqakhDx0vYU23Eqj7eSZkvFQFl3sCwybrfOeQ0KhAa6pzDDacgwjcNjPXt2p+5wKZgAQlO7WrxCjQP03kWb3AI8JMVWtuYSteAL08ouCIiAGF/8mvYxtxgXFK9LivaqhnKD0jE9tiV3Uv9VRYW94KJQTWIQJGng00qSqysseEtcTCtQKQZOGhEwjOdzrB4pysBr8rOcSalO1T8NPNbZFcAop7w3aH+JOxCc+KBaWFE67S40EMZ82xTnml4gq3fPmMNX5XIqp+vPrnEdLFWab1U90pxCI6lN3QdnERnXQct0RSiiINZ2xrlThBR5h05LzOeQ+/NVhW58L+Zz6KVXl42ag4KFd2TgJRaH/LuDKN3opZ4PamGmqpljvfaX3NwNP3qjgfQuS5wIZGts39sCUYXVdb07ljwZ2/eXb9YxlWkQsSamAfdQe3SoMbPutAPxX1mzgLCNOat47IfVo1b/clgbeVs2PCXk5MjuKZVT62THua4jznNY8Bt0+Fy8Mj5wRSaVj3tX9PyF8Nrn4wB8YMV/cL8J2HOqo4MVUGA301x/31no+etE/Ruws/Gdi8k7e9XLFL7pHdRa8BtU8mRro0+6K2saTehXTs123RhkF/jSLJopuICcvhdxRjkosycDozs5o9VzEBfLwoBfKI1I6BD0BzJgTrvVQ2iE3N8wsrf8dysiP0N4S7fysvj7SabLJ3Q3UzBDVHmjyrORpQLKjUUnQko04IU+qRIcxKg9uiTO6gmWhVf/GAcPP7Tyz6mLVqdqWEl19KnDj09pJ+kFIDOqZr9ER2SsUo0gwNXk51Zg7acITQAwtyoaUSCUn/34A7FOVsgIaeLSbKmzsV0xN3wD0KSlz1PP1w+ts1cfGEFm6z9Di30hMBPHuUfXTnjtvzpAOcPb1lEqxS4iDxeTEKGTpGgIextPWBNbSBVkUZo1gytP4cqSHlDf0ztoXGVmLXSNWIdX5rwwZayAUfCk84vHMxbvidAJjAHQF6gCp9aTYupLGcf+xLg1sNVAIr8A+qmDE3O6zdtxGEqnJhZapTnp8ABkiC7Vdmm56aiH1hkM1PowhIg5qO7+VDNXwKxwFMXMF4zd4tCliVBuvIYLIyHTZ8qccje3YBqMgUaB8UC4htU7Qgeju/n1e5qzf8mgJs4UZ7krwBMsL8YIduIW54//OuBYTUv4nf7r8TeXcVE4ri5MyfDjT3rzYw+wxGuqZjwanRJUm6+Lnm6EZXszhoUmm2W1uqTatgjnh9JJ4SMMbdlfAgvruHQ3tSSZSBYIDM1nmYnrlaI1SlF0afJ1J+b7gU09d71bNSkrzJpVsajm7osY7T5nFFARe3X1dyoxiSe0VoJybcq9027en/XXrdM7vN/EnEcBjc/u25JFTZn2+w2NjRuSkapgX1YbgUEbpxN0tN8Pw8pWwvJsdJQS0C/fj2nME5jvCOqv0Zo4k5BiIPTrd5MzgSWaYaZ2oOids7lhqu+UsfhCjTNPiHYEmpGbhg6bOxMSQrOkl8e+qGlO0jSs+NNJojn9CwCQZoG8/k2aWO8oca/nOE/71ZUmEjQro9nuIlVdhdmn4WimzTxIqluDpHZ6p5Giy6GARYA9hitOcMcHzKzCiyUXAtZsQ9Y5tEXFVS1XrzE0RdEwkdFBVDbCkhdRL34XMBFVsWyF5LrvB25QbFzXBZ1vuppqBaNF610JIglThNTKgmNiPYJDX6FjUT6Wl5QhvJLdAJ/RWkRRPdHUmSBa6kUj8Dmx8WQhNOBU5K+o9bsrNrcWrDQwZlwChBuLlSFoLQ0YrGhSThIgHda7b5yssUOgcvVyygxj8t3ACw3ci8VV4cUV559wimBlach44TWsfXUO80sNqAtXaooq+AVCeeBArodIwByhI0b7DEW8uQdPlCLbksCBCJkF5CQ59bcKbeU1zfp7iyZpXsPW02Hr9d+xaZGTVaXdFrJDcyapMlcue9P+8ziUFGLzhuR+8DOo0UXQhxUsR4Adf2DwozrtEUrovIu5unJKHYiiJ1T1UZ3hLX2b4s5PwmnXp9zXqEnz4bKIGm2swupA+G/pWQ2RQm5QrbtsdfC9cFwnRsCI/t+WCDNEtBaTJubiswQBJUouL6k+DkS2ae/M2CMWeQmU7T0iFCz3juF0BctEoyg7Paie49Q5RtXNAILwQwnA7BVegHYasIwGTCHtR+Te3CL0Thlj7HfpBcWrn35pJzq9r2NZNcSklTZ347VWmD6ICZK0P3pnpnUSmZOX7q+mvRrbaMnfLtQIQEt9xunH+4PqDqFMbzssS5ZnKSo04sI4pUXIAlGW2BXWsL90l6G6uyuderhuZKGxhnhZRXzA3pS1UlnRkPN6Hk9mhQZaidceJgif0g0STO3rALI11TEzGzXSKRDW/mzMXHHoCeBLm83LwtXAfvkMBux7+xmfLPID7T4sAOulWM++/kH/s6z2Qw4Xc9Ae36o8DYviOnZyMDyT5DpV5AJ7dBEtR+pUfATBpuzsOUnzaf/fMN9Ns7YLivqT0LPDr9bxAczEdtdNCd7l899lz9nH+sKs/vTUWsYFXR8YXISd1OyZT4FeQo6fitSvWJX/KVRB129TFkI4YAeFSavcmBLo4UlYw/Pz2P3+uT9J5Tsh7Ng+Ha1NC5xwghEXKJmTdiCebDgNpDiIjd7vT+OKWbJCml1hXQdiiKK/Dsl1a+j91PAEHA/MufjKP0lINdQiBRjfL8MGNAm5xYlIZogK2/LTIisO583b0iKKSMDGIKCT2AfsobQC6AVSuPJiPic6XgTYRyN2oHgxr4VpmGx0PKgzSEDZE79IegUzhiVYTWxD2b1UBOwLLlPd/aWbsmxv4wXRtYz5T+4hSKXDrDNb0Hb84qUL2sQZ4FCoB1hCwOnLDzkBInNJ4ZmyzC0qgOJx1U5VcMnsTzwyyjoBP0W1jn8rKGB+UtGZXkHhpMR+aegOe7GesBPpdW+2wkgixIYM1X+++GaQbj+y2/PNSAHHLiFnIJ0FSH28U9RhzPPZ63epRgLP+GWi7DqVd+zuvYzsYaFhCbI0K6S+SLIhOwB8md4d5P/gRALZRxT9XCbEhe/rsq4FtF28+iQTKDTHGJoIupEQJbawAFZ4Sw6uKvlbLCFa1a58P9/EZhS0zOadM5nB2FAufLZGFGaw0PocIvbC8ZihHOiDT8P9pka8ELnBqqepYH/tPZC2ZfwLW/RSaZ6kWYcrZMQZ2JzfMgvMEemOJfvflwpSNzdAa0TT1A7JsNxfoFj8WiOmIXGdMwN2YiSev/P3KW/L6zwbJ2a/kBrEWagJx7OkJAk7GBMxe/C6qIdjmuKZpiO43UGqJngU15C3s+6SGTSjaOo0Gyy4JjHSNMcTCh9avoy9vpZb8UKqT0rQBETYh2rCQnxDsWnCKnA46xJGq24UkOCgW4a1fASogsFVxatnoI/nGvGe1GJEku+UT8JwSgCgzY5fBjcYf3dj7ze/TTl58HCMfmmFzy2Q6aq8+K5l9GIgqBJ5XwL7KUkCbXi9BetcNSb6FqgsuTqkK+k4lPhQ75EcWepBeNiPCgcUaG34lyoLr1qJZ+SapVQpr0IwN0zuXfUMJx7MFNAW90lclNws0t6YlmieLlBFSLYpRMCp6WBM3nnU3CUjdtjVru+oaFKTXbdgAPtOdbGgviZ5AkyYdSpZah3lYtSh9UgoI9spkh/RSfHsFPfZAgwVMDVzov27slI4XwZhGTVlhWY0gDwE4iv5ANvuyM6URodQno3EoE4TUlOF7bcI3yWEOjVZCi5tA+NHarILaEpvz4R4Qo/LJGjO/2CSJa/j0QDZeOe/odXAEPUHB0YzDIUkVLe0hD6vI8wTiCcjHLF4CC3WxHi+lc2cPEAVdYtHjeJxUKpqaylUjY9j/Rog7SbK8l1hOTrAqMPxY7FxnIb18cnhsxsfUp05zaMaSfSbJ4fHM5a19/WX44eewHZSlaRidRt3K7Qqze1Luxgm8bBPZNxVhwCf/WavyISsYT5Q4Ykd/7GIZlKrHSkiqHrvSHD/IFvUJrA2hq0Qy/QgbBjKhvAPVVOuLRJgclZ0WkaYvfvlb5jRCd8z4pjksH4D7uq+bU/AX9CewCIT2+44SzH8PpjxQ902LVwAo02TyUpKZOExrTh/9HStB8xJzGhg98s7f7Lldb7YIHUoAIFrhlB0+bXMyZJg00g/Z9DxuchzUQm68TdugbVJoBDTeVFe4yM5M9SCMe9L1In9nzGAlnY5p0Y05V0g1wrE7L5REph+mTNLYjPgPSSx0bsUZ+0C04YWXRzOHNaJO6LSQQ4Xe/1pQlwylAQp9G/YncASQpyvUMz+TN31cdJ+sKoRodPTzTfJIXbNmfprF9CAIOGaJXq1n7Ew6DHxip60rfnmU3JvIODtu21tXrRdWJuQa+xh1msgf7BRFL/YPjbY5KkJZvXNWzrU/+F1vdoz++QDlQS+m5Wq1y6B1ghUNvbuig9/pWb7mRLh7QIW/I4eOOS5FGaSzyj1V5Tk8Oea9oIXZcoCdqeJe88pij2vCWN3Py6LIit+CLX3X/EWoK+Ty+NVytJXaX5fh80YGvJnAhzcClZeFNzADsD6NdfQ9OTzi5Yz8UPsgg6jUpUzowf3aFmz/ReV2nwtM4kawYlFMNseF8ylyiWELNRf5MLMhtv8lryNj/IiYJqnH1rRcsYfsLV6nmsIphpXmcksRVE8vzbkZ4YrS40KBf9+bXEVJBGfGO859wLoLHVAJdpJUyyM2fZ5c6PQa4jmYduzYLKgW2xKFbVQykpZ7w695WvfBU7tdDT/YMDVC68NeHBrZjc0I78KBSWNXiNNhXzUYSp6zwOV8Woux7ft/e/GOTBd09Dwt8YLBfrrvGuW64VIWA2OSu2KOa1X3FrR4RKjL3EPTcdfa9H3Qi+MoK3XlmGOHoWdo36b/tfrijqLFU46CHAka6FO3166YcZ79lre9vezhoXBkY55ltLy3vKEDnjfkh4D0POGVStPMAX0SXpc1coQ8GUiQWfUDQ6BwWd0Ij32l9+7iXg+tqR3AaaUnGC8Eb1ll2MvdYW7SFV4c3MqOMolVDAZcBqIvi2I9gP21VOjE4818am32rcwlUczVDgk/My7d7yihcmewUCt9TZXRHtbgjPb3m930cE9+/xDWzdM2vmG4jOtlH5fmToEj2tivTjXXpkKQZPup29nUKs3lUuTFHQprwu6dR62mFVk2eWXJAwEauhq15Iv9JuxKScD6zD/Qcb9iX05Myyx7AD5BFbf3NYAWi8c9RQYAwNraqbOaqMJbG+rlp1TTno/IE/9kjJqipWLWNxDl3RBLf+/08IKk1enPafYIrr/JyFtE/d/HFGC45gWQRVTkBvt67QiFLgcNfmGblAiHEYCxXlZmwi54wxQU2FLmiNtLrXMFy6OvgDohGdVS06YvV3CeRYb083MYR+7bnY4Lc1fCONZ+yMY7QUU2GESSuHqzj8XCpu3dtXsZ+oXGQWeRe+GdtF4FfEywfkWuvk+eBbUxeWn2VyRAOcBR6FZqg83cWD13P2zsLF3U33ApzcBdsbkjk0phgYKG1AoDjfEdXZ5AIVgVE6jQD+laVBgDF/gXE5hZNQWaWv2zFjJRuMTljpRUsxg8YVCUt3UcdDsX1RxQbfcJKRO3gkMTIXWzttXRWMDPnLRXWT9ec/IhdSKaywvQ7HALxNIrfpJ31ueZiFwIoLMcR3/jMEzwJNBMPHlmTBlNoXG3jdqXngXKuzDQi2U70/Oy46dRGV5yeIY4R1RKGxPigAHElkyE8rXFWHU3boSv7f+b/IuiQtclfp5qxYy2E2pZvINw5ICGByQXjDxnISXeWh4Fm/CVrUTWUP6fGEV3PpCjgyxTZHgsdKqN4EA2+0EaCFuVeEicBgbUtkdXmxg3+BR1mFMCmEhqhc+5rMY3wgHNRSbd4wp8GlKnhwLmR1sng+jtk2o8DHi7HOEPU9YY0ctQ8NyWCTJ5sA6Vh8LM0EGoSoiMnKalbyS7eqQEDy1q+RWxpG+yXtkZCcJXDgUsm6fS5RzwDk6dzvYOVm4zKrlryqjrcErvu362wrHihiZy63NWXvbJAuKikSqd53xHpE6CtESPiyU93Jv4k/SM+N0Z+w4S/wccMgNVvFQGHk4dmC2oPqs3+7HQ8MLxzy7P31OX4Dps0E6LlKQw95moiONCHZjJInGVBfm39wFGmyVSCIndjCLMIhZg2b6rJQ5g9t3qeNhApJGIBDbAqdwB4EA1lHfeWkaGXDA6ORBpRH4BSLxuuzIq8vw4WX+Ti68nHVp7DThKnH4D8c7GGEM73PnHsPH7lsKnjJUbzPmhMRXo9ezK7c5nvRVzYknQDOwbipeGqg3w41hC5wP4eGu7NgAU/AIONOY5gzdkWmsFEImZZHuwgmC1C7AYCmjJF6BmqOOjE6uhbQpfNshIHSXq9LpTOe0uOvZ22cztKSvoaAlQK41zmxmM5piFSYxToLbDzt0qQwGijsDV4erOcl68nbmC4KZqxkLRkjczhSzo1mjzv3UcIl7fFEiIfn3wJBOs2vpizWYRNQ1q1FokQvTOAw/5kP+HOKQDcWn8KFClRX9UpLyje4jaW5LhRvLcA4+5B+IQzYUn8IHBgL7BWaXVNDlYu8cx/CfHb/XNfApiW5s75PFcabGK7X7ZH8fP5xkb6t/TdunGshbIvD7ktiJsoxQfwq6fAIo76Lj1cbKXnjbOBJU6ZP9S14FaWkTzActyNF8PAJhl3GDNBBLAgNpIJYEptS0J0fz8LjL3CANxJLAQBqIJYEBFGyA8tqUZGwCx7nmgiJdvLo5VbJYccPW5fYlLz0hXOSN/e+dbr4+iDLONnOYJMNF+S97rC2PR0khBbLHeEiB7CN/jRdABTxO23hbfhhyrld8DB+FqQzy5ySdQi6QlA8Hqrgkc8cLdOZcWvA1rWWRHfJ/G3jub+BJ12X0p8i4VmIlN8DtGkgZx5mMcKKG5PZfgH8fYTpaOLzXPgH1AfBwjvtLQn8GKhbiWcBKt7PimI3NArlXQaHGuVrB4qaR4m7gVZ/cU93S6+2wgGOScNW5/IDYgyPu2RnUj90B6iArOYCEOkXqiXCVxfb2ZJ8ImQFGkiHUInVSOUgI0UkWf76BG+vNwrYAlNO3xQVAWsa6Vv3OogkXEVW8Xj7DeBajECpmnKYMvivO9kiqKeDEspAGxYn4j4W+QChpb9sfWayHKmJR8dOcAKagTmlbdUg42JKif9w0VlGixYg6NIjMv3rme3uQkGrj9YMq2tmuo6+7UpUi0Xs2XhVt8DQPTkAUCswo9Isb7U3kDhZ02FExOdpfW4dS9m4od9Dr/C0YIqy9uUYcxtI25OZQijBjywHUmtq+8y8te6RYZ5AC/OxVZLyJHeYn2efWERH2nHsotGXHvyVxiFiD7bVa+HE16S4hVW8Yyu0sRS5TZLr8RnNqBmsJUqHg0wYgDwRx9PojbAbQS0CXTFA0PtqovwdgULNWTqSNpeDJLKDoRDW8OjWpwSRKG+MayUuN2e8tmx6ffqsBWV0ibo+1d7J9pptRgklIn98qGFuJcueRe3F7JbjXTkLpVjckTyoMWxTJ04CjSji8Kgo5LU9CchKDmRlTZwKh/9ckgZh+dq847nNPZBKGgH6EJqdVeRYmziAzTbS3R1hHefGSNAwAVnfaOCXYl1CWW/bVqFfghRIsUiM16Iqv4fByNzkQWAJ2xlCf16AodUIxCsQ6JFE9+4w9U+dbeIQDtxLRP9Q65Ka8nvWq2RFDv3xKnpUCEbJYtDYbr7jefwaBA2h/2Qp83rSdsSMJrF4iba5jCGQSCst4jToG+jYVutjxVjbqE8VeO9/zBKu5BtcAFFCAmKiivXEqdMhLyHUAK2NMmEgoWW7Li/MzjIimQ4KWAgBS4yeF8VlQ5BGWILHolxDUb1fgh4WD93f0tvgJLhz8mIUMilZP0sZ2cyvpxIygYhxeKdk70j7x/p9m0xiTUQajMqbHQKX87Jpr+SYTHOM0+SFlUIupT1PSnUhI83f4YqQqBfffVWpb0yRiGtxQrQ/CqM6FylFCrNLQ00PDt1IJpcJd9md9UvK8OAIlwx0oyX8eNbXqYNpqNNahoG9+7EDH9WqVzz80/HMnQfX1JsJAkTCoBT39XgcoWBstPoIVtkEDHUR5LaM9yfzrTB1LXnasTCcCIASwsXzkVzp/6X3dzUPDDMuReoewNdyonlerW3IH115jbgEe6lErbnuZOv+17p3H+jp5VJ1Ynqxg9mg6+FA/wJsHRb1X+l23dMB8hS4AtTJd8UrqtAGjVnNn3d7EfpDxWFoberPW1Bobd1oNKpoBcR9h09LKRsFZYKtw66nXRV9XojyqyVj081sR/ZikDUUa++GbkugbllsvK609qy2dFIUBqjx5m43i9Yv5q9z9Gb1lo///Y69RSn6Z1KX4A5glram5uoW2bA4Y88xdX5VKmpLcal0M7fRu6pC6Ml/UlvLmfQEItebnyCvEhkr5NO7M2Ay4hmrJwnlS3ORrSr9OIXT40P/vdqx9nCWLb8mSPYvlH7zZyg6yaiqI2igNxfKcucKyWuPPuj6mrbPPaZeyIOxn5S0h3oEU/8N/kjJheRjAHC2syVdI8r1zBva2nIJGP3VvzyaL/fMLL2uWqhh/Nc+IeJ9+ulC4SHURZ53AgyikNmKZ+aDrLT+stedpSZpX3Muruqx7ebw0PTSu7uEKaKiMAV/Xu5CQ4pPzQvk6ZXScLRPi7Ll2oRDbusUhQVcknLCP37hMtwDZnq5Jzk/W0gx7Fi0QbiwrIFIaj1MwStqKR0YHhiKMht5UW/KecwFZpQT+fiIh20KBhhltZoGYCYKgrJx/CgNTsDvzmAWcwydJcSd00jxqkaTyqcKZA1Us8Bj2sWE3vaRX9Zmws9su2K8WwaSXAJMOVFLtKak4kRY9ANTf8cs3K0Xfd1MBM3GeU5ZSzoOUMYjm0rAaAG7CzyWJP2exexCpqCj1jGY7qAlyu8onRCS11dmSop/SX/eKqWykciPdxdHc4mp1/QaUlDA6pi2q+GKG9pJegdWk1c5ZwlVxnRxm71QsrkOD3kPTerSQz6+lEpgZZk0CtXEyxurgIVApu6QSuiOCQ7avpdqYUQNb2YheF3U1tFPM1BYwZTfOFQf6AV60GbOa9QWloLQot9EJc9GNPSK/BaR1UqRNf2BDNQdT5jUHyQcqVa/xkMcYGYOLR2vYDjeFgKCuehKBJHi+TIVtYPpqsMsWSsRCSA/Yr4xWrzg0/vuUZ2oshFWpcBsutgkOvch7bSKf8JrWfxtrdU4WWfN9HdEDWJI+E3UDSuj57XpOLw/C07Btq7IQjUZK7PeW7ZSqKEuoY2WmZceEh15N45Unr8aw48NvX6iDMI0hmOtwJoiPiuD2d5LB6DDyudVQVOHXKzJUehMirmVe4oVFMuyOnQpBafkS+6+JRUHtF8/QKVSImuNv0lh62vctn7uVWXTtd2/Et0d11PYKq2uSXRxPQCX9cb7mHHQN2Vhmi//ybZbi2zJ0m686fD8BHyyr5+IaxRPY2Sq28lhlY3HZZULAO8f28zs230eb/LtvO2ib0Rnaot0IPChF1eXUDVdyzwDBW45+8FHP+IbjXQtUDlMEXa/htn+CvXjxv5ZuaiGQXY0tzHn+Ad78F0AWT86Rj3yun7EBqEiSJxj3kmSs95sIUzZvjSOY1EqYCSG/5t3EO2MfhLXvpdc+m0fC01z+Rzt9FPpQD95n3KURQPF5e1SAUsbhr0MrmWRuF7Q1JxqFxQuXRmjwBT8FRdRI5UjnvVdWxMkW804RWVR5Y+4FE6JotXlUyr8jcKbX9JjROKv9eAunpYhSKPYW2zXUJcIUxw95ekIgosxpHCog8mlMzV2g4onmoLEJ8ixLTYRIJhF1fClBCpGTleZu/ONTKnKGeLWb2C/kg+xg9EbR0hZK1sbwGelCr0T0rd42D+Q5adW83b+VpSn6OqfPPHTWKBVzJPjWX2ZzvllDgmAYqFK7eJ/Z+fdxV9LX9SNtEY6kYiV2uV6tdtHakC3U6TlnZi59GE9SRtLhTvhIBD7GekOro7z6JKLvuW6CZObEJTl/9ZaM2ptVsnL4GiA/TF8JjFKKRcZDqc6nfnEeSFLsECZXKJ6e1GFuFj3xWIkAZVLTcjiDuxgt8c3SfK6tTrKaD84C4ytJVOVFE7vQ/VcrlknmJzBrtIsCZrSFSALNB6/8mf0K4rnADoopo64C3UAhC8V9FxU3PMuxCyfCqdqMyKH86xIpQ1J1R5wNtC4DfRvrFUWrasOSpuUs0Tfu/vsaKYIscWELQRE3saQqZumHKXUdbS4kv6xdT6ZYnJO/LpKVIVCklkzWYBG1IADXz/aRf2HgA/OvbnRIAmkDqEkmrBUvAq6TCRfsEVuMQ2hxNP/iwiBEppswx7+xdi6EohrWKxaXiJzTmPU0pxJqhbuY+cpUVQhJuHYQHhS7tO0A28MRoYo9OQOZrjgbEKWMSvFJILwbwFnRCy8+lCYP7UOUKt/eXhzX2eQ5TvMJf2sDfmBQd0Fwbo1rwu+aK4rcKsHOrQ9kwgISmqYbBmBmgEvAE7jGyj3WHMimRJdfUMgJyFGgIUQN+YinuXsiw/dIW+1D79BFu2dXQsh8YFe41FHKI+h1sj0vRmoFn9tJ6wSK+ozjcjjcOaoNT9MCVzwMzQ7xrBCsGhjPfqJUKlCo2U4w7jJ62BEA4wm76fZa1kFQ0jg7L+ukvEFs3/q++pSSBG41lghgbj+lmBeddekjNcPUcvHbszoGkRs91ofCoERLd8fJf86YDBvv5Sw8nD1a5Qk8l0zfsdRJlN3u5+UzrVUI43xStY7RO6inxb1bYjKbLGryqhgdiEF0KDJAAOM3cu2UQU4gklFNO7BmpR2t2ptKaD5m+0lgpAxPFugijNhFnPPWnxU8IfBkfsJyiG3jkuXAdtYaYSzzXubxda7SoFqXEpUQBNc9XCViJdPrHQ1LbgCMpuX+2qO+Fw9//7vOjQRSA5Z64j/79P+W7vN6yqL2KO1LUBgvcm3atYuO9XkxETarpW0dpSx+RTvtxKTLt8S9N8UXDN+/EfvTvO5XRdWNoqoNNgX8zljZVxHvjOubXfUKLyH3qNrJFtn3tgn9QhmwrnX0DqxPEARiMq2r+aZZwJgeLbLBEAuxi+pyK3s6G3cOiSgkISMtYWivCpyssRJsZpayUkNMtMHPUkWGYySQl3Ql1iFn8WXWKzn//f4QzAuVlwyEeB26Gfrd8tTHPAEdtYa0DpiJax+8dfMPVb/IX+PrjSlFG7dkyTTNRaksZ5HEEkVixc6yNPHrmEKeEdHgqaSCun55v7MGNml/kCzlrNBA9zGbyV9AT+7rWSQA+4tPsNpOddoomI+Ev1FzP1QG8el2rlBEqoEThys2ygWVWJ3/Jc0/E/y5LwwXT3Xfrj6Ksyqj+O0+W6csYEVrVoWL4TqsUEzfB2gbEgKfNmGB8iqZAJvjYKWTk/Yx06qx3kga71jFdAkI8Bmhuq4QDFcOWV1xnLTRXBwKvlKUkkQz6L1QND8ITH9eM3loJSccunc596fw6vCC9jhDJeQ+4hz9wqAT5y0uq1VuFvyuASsJQ452232h/HaHiOPCch1VSWxSK+QqAwyQ1p5Mu/XKqerjpG3WQhoiCL+Tkun6gcruz3FqJkZNoNr61VReumEoMg30kCgAKegn4AlKFqVP2sRUk+VBoaSlW750PoR4eZpNDvRegFl8nekP1r4Dkebupp+9gJmfpKLZen0MRsSTdtdW6VTjOzi9XR224BTjW+eU1tetlI/HwZHxDZzUOk3iBKb4FGSDGyrACCTdKUQe4QoW7wzwSIG2pB4ugJdDzVW1wDxcISxoJ11N8LpR2m14Z9OMhqVXVkQn91cDzRGJIqRAtFi5mOZmxg5QYlTEqr7gPj259Cfb0CKiMj3FRlNN6v75MH1hUKVDYoKKN8vOZpJWKBveXk1UWZO1P8yKEmmwaoSnZPg8l33i++HzfHp/tp3vYDqIf96ftZ6278+O9cf7MzO/A3cQ/v15PnkPzwd4vxBF3zjm8x7O9gs020d4yM2wyHWx4faps0J24R9nciV0VboPy389M+t0SKd0m96k+/Q2vUzv0pJ+Scf0IZ3Sv9Lb9CK9T+/Th3SffvXa12Rsajw4fnFXdEtq3hQ8R+kgiW6dVPuVvrnwDXeDLjwNn6FN6IpdReaaavEExOn+rtFT4bR0vzA3Sy4CziPyYugMxWevnzumDOM9hpKCfHyA8JKlce/IUg1ZqxlIQlHJoUz9YvQ1MTPMMePU51ayQFuF9fvhRuBAXvzj1HtIUua+CFYKa0u0fBJo2/LriaF2JnTSWeX9y2GMReEyrSy0hgBrYDwtZEC3MfvbAIu94mFnnQX1lPSwiMMx5qsWHvzhVcxBpH/5T2xu2mNHQod0Em6xwBpDFd8/bKhh0Yt6j/XhTAwRTFR1f8CbRKzU2T6UUXX+QzyspgG28Y8WCyvgpR/2ANRq8JBZnbL9Srulx4fUMjNoDTfqFaOT7ZAa8ePYp+Zv8zaCnzclpd7jbQY67BX4C4CLBKgbB7B8K7YCCuHyyvImKG79IuuxGU1DzhoNprJDgLXd5bQDAM1z+GGywMEtGTamxJeiJLVFlzKCdx5R6UCWSDVBBVrHIv7WheX1IQhYfRJrjDUnKnYerksuOp8/pxE5nSJTKhWr24rLFT6JJEitmDzB61OKKVIR/2xsZ0b+9SraN7rUdRzdJuqFAp+JVdruT2l3sbHDX9hv62SCUunUVEZyuQYZ1jor5mh88hDDBKUem0HxqqMLDBaavxDeDwytgmT/qfKEfQVi6r7swNkWCM8uhJjItz1Sj3qIxxsXAYoJDSQE4P18WbndIJH7Q1k4t4GO6HqMxkyoySoX8pf1oaERQSs4phIsSL0moZ9QOJVHQ7h4R8zpFWG/g8FZ+5+ScIXNqfunCz6WFAXhUqES3/OjBHRLsAW8b0SRCOUU4kiRBoQrGpwVISRWaS94dD0AEigtNogpsR+J4fZl23RYteXdfo/TSsoKObggt8mJAzBIW5HHDFfQftTT5Y2WLF4W9n3zjL6ugUeZpHc8yypGDyDIVHZ80dCG1wAiOmcykuRZJ1O6+uBcJhZfm9i/HkW6xmYW0AMizBQ65NcR3y1VEBb2Njq7RqjlKqMrBUN6FmhDQszEb6XjYb17rRoH9PjaV7q4bbzZQU5DCsLZbhgTeSqBq171m9ixYXhpu7qZoRGjYKxxM/InKpnj88fJYEd/OaYNj9HaK/dnZGcGrCIBq5VE33J/tiEqIaUVrcOTaecarhgoVUxvNhLRP5/pEHxkEy0ffmncJaH9mPlnF/kbVopq2fNnvZhrLAvKhiWhYrVB7CNGuJSTK2w0pdha4zIFMziSyv4fUV9TsAHn6iTXxuEiHMeNmkBO1hSjIZ4Nodxu4n+INV8jaxVw2Z55k/FsEjizOYeTatk0YMeBK35g0mEEk+proxWhLr80W9Smph2K5mJyZiLg1CwDueotFHPztCpKN2Cw6sBxDhQS7YMCedPsTaBhbgpBacsUkSu3oyGZZRQOCYwJtUbAdoRBYYvkstmxDe1mTLEp0ZzKtWwudJ0Dy9amHxGeM8rtqJCT1FjwLJ5gSJIjMeEkv1S67MkfYhDr66eOzZ/5Ttt5RDH2kmIhUq5Z7lyTYq+opgF0F9opCQUWUzeCZw2rTdkBa27wo2uKsRUUVEWkFkO3M3sjcLT8jm0Y3yv8moMXuaYZwe6qhzJqupEpr1H8a8rW1FbZDGbSAtHrVZ6pygy9aLo6utRRsBwNT0X8mtULh4k21sSMeoduwTGrRZA3cDM2YXR44KKESjmLy0oE8i69imbhLcRYqYVBd9PesDSChSbqfVErPe0Z5iDg95oidkaKiUJ1EVcB2Gs5XNkAPniZAqjZc3tn4RKphrVl4WJq8s4KkRaH7KJWDBy6mrpoI/1k5oqPzV757F3V5vcL4WmAaosRAwsIjK8Nqidg7KqXtKXLJCqHsK4ejNuE2fVY68olgv477qwcyq0L9gdXpGeooRLCqg+DXULJnZxSOtWeRObMAftU9Sfm+ichr4OGgzLBGiWJXFRyt61LTspkr6ElIvC+dM8kiB1kKYMSCQsrSdq5SpPg1tPahi76jRbmkf1s7X3doPEqovr5ckmKB9peNS3i17tAqAkM2HtPNF7gyoqigpn0kdsJtUqzWRLFtMv2vqh+r8vIQFzxW01cliH9XT5J6EiHqVq3rIGPv6yobZSnxCuvmNObmb60wu8nXbety4dNeCjCqsyvShMhXBSMjnQgWzWRUq6mUmQjtTSinQr+OnQQarfn77JOBxNj4UFxNztxZxZKCY8LVCV8iYrZpTqbGyMLa//TECqAmraYESwaKycRtGfG2gCuE1irOBANmZWk0DFN3QmMdvWxcJAS1/Ok0D9tmjehsYMg65O11AGV825+ILwtuSld7Te72v8kuUwDxIr9pcRoemhPK62KHbpMkPM1Vufo1FolBbySsVDeDx2S7dBqFdag4jOQ/+UgNn6uGsdgZL3cOHVxZ+CXrMJsoChAhAvZCxtRkwMpdNSEfVdrdvpkyTTw9n76MUEuxXZ8hbgc2/EVyw1jO77CXEmeeIvjRrEdX/HcOLbjaw0f/mDwjq3LiP4/aBceeBVSgGcJcQgZN0g9gFzIMYBNDvBculYNUacaWWfSsH8ZRr3A06aIwtUhnh6RdMSZSBjQOhZY0xydqvkknx4j7E0QohfLMe8pGOVoJt5Tfpmw3p1FkkCjR41AwvBup/isACRzwNFOfGP6gxK+v8Nq4SBQZXiKxS1CiyXRtXyDfBLOURIhn+lpuCCvXgp17DWCegA3gBvB3p0pAWJmp06AG6p1Gj5uyorTk4mcS0kgLQ3HmnpazoClMtn+tWgGhFSVD9PupyW899T7kiWJPnrloT9sDGg8ozCIs1EB4bExVnQ6zBI4PpqGOwZwpGshm2TgryJKzHNiViDbLgu43wAs0yJr95sD19KAHUF8x8xyTYNVhtWxxrnUWxay8tlFjaUwoKVTnGdZStTZ8HnMjyAR47Z37AIxc0k+A3DdpA5Qx/q1SFXSBVM/T9u3tbUUWS9TCArNHuVQgy+z6CbJMXeUtU6btZgMYDfeI9gdFo+3F3StlghYzg47NeJbZy0kW7PLO5GxomPiZ5SaywlWKe6cxGHyC2o71vk88wVN1WgeiHZEejQRotMc9u4ZTj/1Kfr2xSDNMlSc/zM/6gkhmHI6T05rqdQ/fdnD0cG/dUgRDTByiGGG2OjvL1lwQpbcJDu2ORNbutYfZcOIUQss9jSgroIVun7/NVIN1WxbXLxDdLSkj1OWe7103YH8O3jJo1GEoP54N4erb8tzZb7WNc7xGSG7658RXIIopoVSOk8ynL3Dk3AATeTuITAfzO5MENMLJaCylUV0kbVFZDEChLK0HI7tyeWCsU3OLm/HgmUnSfIyJjY7Rd6BRds5fd6RJfBA15nPC2xAnq+Qnk8LSZPCqsNSKHNVnDMuWvKFSGmWyAS1l2PS06lFaEkNSG27pAMH9oiDZ01H/irA7w1c0ZpZmh38jeCQwmd8vv4h0hpZlg5oykyasiaJSuGo9C/VZCZ2k0Y+5cU8yae8mCf5lIkpypfQYigpaHTdY0X50TvuswCNKiAjPz0I+fCBoOFdDrFlenQSh2/D2wxmrg+J0FcLqxkB9n/eAKBTwfX5mVPDjIxr2VyLFE0LBMrSXUvMYfRyQp6kMBVzo20y9sF2ypN8yot5kk95MU9yKBUzUQz1tFEM7dTMRxytT94TCNcnkqJsyUJqqP8uUGTOwVvj4v7Jdn8N4ODCf7JdF09+uLcUUQrrKCV4uJ4N1JGuWoDJPYa8mlOwZMR0paNWbT52vbnJUk4Ps2VCKe+ZS1TIDGjypIh8kYwmLgDxHnxeqLfGTcTl8Pt4I/Y6vz2UXguk1HGXmKO7o9ZA660khXhd1dLyxzbUYrzTLw1zbZRvyuLy/4eoCprF8RdoyAWWLRD/6JCVSuo5IPOKLiw+DAAT1gS8PpTiArHAXs97MU3ikSQF2SinY1nq2QBE3Fxqv0S36I6vNVqoK9rpCqScKs3xTLt3ebOdDjkZDRSfllh6xBde1CozLiyjP5+PjyWcLGDa0c/BKor5d381GKvsf6eb8z3CXr0wqHJIwd5XEq711D5RKCeUpMSQaMYsAWIZzkYLv7E7dSSnomiLkXYlWakPF+wqrvB6++8gyOHx/XxM40Bi/zoRJIlUjgp7x2OJHxCuVyzfR//zH29SucZdl/NlrUisRnBvWZxxQIIutJ7t0PrNWw4EQAUt0qQ2AZcLw0l4MZK0efVoH/Kv1+bFIV47DBOBXEq151Gk+AsfJVpu0Q/N9RCbSZNXMlorjrdeAtGyiT7PjUrS43HbZMVX6pj2d9O5rnLQ7lFs9YFVfnKQfx8S9TxNTI/iKy5kdJ0jOaaL0058AMqCuXcLon9JyI8h6bTMvQse0tOFKUBvy7QRBTj5eI5qrO4PkDEbxEsTvkflv7tXDBc/3VkMH46MjSiPGfU2oYwTsdRR4KCDbWIOcZ2NCyLJ27TcVGUo4TiCMpHNrP50vaYnA421bejCuQ4RADDxkfAvPRVUDV0IDfa9Kk41kL9HI2pgMIsZBI43NnyPe3giG3DC62RtEzBfMgvspsoBPQNKNUv2GkAlckPOUug94TqYfOwKnrsRsX9FGw7SumUoQHfIG6xJ3IDp5hBPwalwBIjsiFkhXMlbikC9Kfvn/wWRqJ8CpPcX+MxTKd0Xxvp45x5KE1XqawHkzOgVsl11ROZ2oAvWC+G8uqT6g+8+q7WCEO8Jh262Bf3WDT82NX2aodxiBQDsHOXSJKgxW0nGEmVlPz6/oHexUHaRVPon+gTS4Y/euFXggGL+AQQOM1gD8Uv1u1U1vy8U8kqx5DmTfoc/aonjppO3UFhIW2gdrB4gyyyyiAArvd10vH22g9DAEjtnW1dIBEJ5tmyso/zdlylFhx8o/KHNWDpUghNqZBScYYQIrw93lnZIiOEIVGkxfY8z4WQQq4U3h+QOCu+wsmgThUPura3I4ogneos4/9ZGe2gqmti9WcdpMVHcqPRpUu80z1XiQF0EMTcjjPsdk6CwMASMLnH5BsflqCCr8ycFf2URA7s4kCaH7ROS7x+/g2N0Actxlrggx5iK0HJrXUSzs+h8X9O04TRbqL+Mp9/TfSFdh1ftVyiNqNOKp80hiYNRBhgdchpSXQvaUXLWzFzQFOvQT7I/xczaGZMQG0o/vJfs32RmLITWN0D4GVP4SABUNsKS2/bWHQCN9/aOqUQoh9qNbE/GHZDQEQMDAppAtBMjIvyURtujtTX0MzYClvKMO2atqym+RwDeMxhMvw8WhcjetZIfRq2bxNTcfLQPTAz0B44Ll+LS2H/+DN9zNdkohj3w4IdduWY5BVPQungDiHfcoNv0q3bTDp+fxselCcPtX/DLwmHHueMhnM/tL9/71yR7f/VTQfaRN0ZUNSbu7NDn/zOhLCm7sFPJfj1Pl0uyY4def2OV9YFwQDkHNjq7qJTI6Pxa4ioVPFbdwSNR8Z/VfFNihIVrL5rZs9DUdiBjVbhqSTmuZXha48SRG1TMoM0qNOWRlfv2SfyzUEihmOmSWHmuw+FtZnyejX/B7MkBS/D9AzkDaZ1uclVqyqCuCyH1yko1yphJEA1AIVKV4iQ7sf64icuyNQraVYq4IYfd2ryvZpsKlj26ze9Dn1h+8E2TkaspWRqiFSs/gBSgZWRlo5BcetjbbAmbk18PFtUbwC8gwlJqBXb7odvB8QCIQalvu3QLA7abNXqSvWP++o5i2OxCKEQIGAqFPd2ETW430fS6cgHIOz/xKvrxBkXYK1D0jltpvNWMOz8r15SM9yJz/zqciF+gtAdAc68O6vr+5oWSaR1IVSsT0QTbhfQzWRq3mLrrD0CFqO/GP6ZE+n7BGbbX9IbLI1G3Glw4kaX6iHfbRsJrW70C9lR5Op2qZz7GZtzCcrFXXP/z1WcWIqyzuPSBALRqaQt725UBTwHq9J/Se+JPmdTWGg0iG0TDp09PqIyBisaisB2L1yVLb+3+pBPRUjHGnAmAo1QzvcfLszFsp5HbGmwR1QphJ4A2seSNe5AMyHcUjeIdM/zPyPStMlKCBBi33LsR/SbKrUxzhEfqaD0DfhlMAWTgofAt7vGofXaqS8u8W5W0QMhd2FXMfH8Z8kS14QRu1l9gWvCmM7ggFoPIswWT26SOdR1en8yn7yTHDf8wtUcsezgtr7qVAfKpJ0hUoZJLreycgG2zjb41aWZ5NptJFBknXn2ZUJig3p/8E9FKBVZSREZM37up3fME4klBMUOgrwWeG+F5xWeCqqMBw93HEsYN0EHpJCcWICdmyElOXE38ZyFY9IAeXheZYuTuGJHI7WxqUSv9Le+sdYA3pas7IvtKZm3MYhQubQ6FwnW7SaJ8tQKP2zrFI5vX8LQe53ucf5E/WONvPOLRHDzTtG7RpmaPaewlKZDVAQbr+vv4fsJoVPPl1LoapV5ZyDcLv3PgwEwPtyKdzG2buC7hWta8mSSB0GaQ4IMD2pmNRQiZkjBlun+OFknCPUp01rG2SOB5E2uUvmsLORhNqK4eYvoGigiX7bOwNG2s+YtXsMjYwfcioqhJxDe+XBuRFFLXianxuC1dwORhztkkYi68Oo1BHVAyQdscgZgRyA756+sSXVa0b1rn+k9SLb/2aCzNotCukkBmRbZZxb2QwwvLfwGY3nKhu31q1UESr+5c3oFl9yihjaD8VI3eLwFVMrJh2fSOpJ6Zh2qZWioCUbFIrJ2GHEFwEWX+hhrlN0N/QJStxayU2EIpikCk3wEDnhRqx35MbkSQMxmioX6GTXInqwxYrLVnK5Q6tj72qcGjK5BQtJ5IrI6Qx+dhilR8u+CH8gU+feINJ4Y6b9kTtzFR52tnuXN/XvaDE575/7ipYjzjyp8sFDyhu+4v59AB4sF/r1D4C6R7Tp4KJ6shBzON3xePgriYX91cEvlygKRPLeXFMvEI69r4A1AO4UdEvgxGlh0qAIdykYHDDmWQzxk47FA+HM7Co/4uamemN/YWCw7lMj9yB8fTsC4ZUKuVfzH9+4rleo8XOCm783+FVcwtW107tWfD5CzanX4e6JlRKPZEb0d6edQrvCRlhTeLgrR/unZqk8HkkqQ8nSpBGg6xpMSqHeY4H1o01Cngse3Y4F68iQc8uf3oN7w+D5iHttXoUtRFBQJXSCE0UGV28WYTYJ+bCiQiKbpKr7CWeJKYHPIP9it+8YYeqs+Wrh+Fqr3cxhAZEWgfhkSM9BBLT+DQgj/iLQfi+oLPWjSCre+DE/AucMX7CeVBzbYWPW/RpBUlVDohwf4jJdDPJ8V8BtFKMnRPxMrFaB9gEu0gSbMIoinE4a8LfDSkQO5Ac706oOje38TnHcFUzJ/1Fz9iFasUZpUGpSGY365sgUgrBDfyfNR3Mn3Szs52KESxetA5Nd3ptDQ8bWNNLJ0Ats8uKKxOi6bcuy3/O5tIsfo1olAWFTCw/2YCWwlR5HcDdyJNJqULiKTY35OXVXJCGwRLhdwc6RIGLpbxIZdFUiLfDDQNlmghEQoyBOqxC2wONWwl7SZcaf0LKX5tIGIjJrq2N3C+5eqppXlkvUYEhv1pvLAU7Jndb6LwC8ukYa5F9DcL21NE3Rd1mJODOFwXJ9J6/pbLEAlxCiqmf7HGWG4MbOlOoMw8Dy6kFbRZfJ2CS2z9OYZ2vE0GFtao9ZR9feRSLPyU0Chuh2AY2VJzEJBeeMFlLEJORCbobsCHBxNMeGMpUdHQS4gULIaciHbNzVqQUDnHyyoKYshPqN5F+FUP1X5CvpCOiIHHg5hYmppuj8j4fzf0FwBFjotzNapUeccj0UVRkuaizDWZlSNyDM4urDWQF3SO2ccO2pcATSLzdZplukdZrHF4IRCtBaSYY7DXvWG2oX64bxTP8HAghvTd767Yq9flXbwgocxUBBePtPAIbmgFDOWtPxIqGCHo7NPHQ2e4qP6DwUS+toAU1EVsSCiNWTzyXnNQe3FA8u5MJfTXLcNem5Cap8U80cajPa+TLMEQ1HHsxOPKXvhKRqVvpUOrpCY4qq4oOrSnaoDguwA1I6ntyrdXKS7njx03PKHB8/fsml8XprWfy2x7PIILw7hfuwTCq0wL4PIUkN8dVjJI7vQR1oscH41w7fEeQxQEE7Zwlb7XREuBITsM9AW48B3WJuwAyqBKDQuThxwLQxEUpd9Pk7MAE3RJeVI0AfiBbf7+cbuA9b5dJ9CDTU5Kx3UgtYwGzPgEzEy8M0/U6h5ZfIRkwS5PJtrs3dTlDrjrv4ig+AlXcBAiccLToZkMsowUA1ITIFgb1afW7b5NRCAoYO60wPuA34rIL1QfeLp5imBaFTrZh0XWuwuuFoVSYhRb1NQ3VkBdjK/0UxKBTTZSvdtcC4WJ3xvDY4bLSBQDpI/lgbFIiDmANsg1HtPk3XHJ5v/s4YxAVURMrTKmneq4Ra9VWLyY/RemzJxSX9N1jngVDkmVhmDPCY8owB7r2BNN/6xA1qoi6oekRd84gKRL1kCxthWGdEvSDEkZyfL03zVEAgZMTFykIBcAHak0Wu4RV48gRTsqyRGiGH7z/0Sn9VgZTyiF5GdQNkkWY5TGWhLfHSk2Pmiw76rSdJlJJJh0JFuTijYktb9rPrx0guU/JrucQbRmBGoYkpXCtoNgkSHfxkV0OmRCS4wkfltyMWOuT/0M0LUs4ouABGuWzyLJlwWT5nPNLQ8DwdxGUhCygP8R+S6BUQdmKTU0/KMrFirKHTG00MNNUVW03iaRe8JEeypCj452nMxGz8XlndM27kOGn/ff6og1gu5rbSiyO//6C4iSx6YkroGVwERt3QTyIMRPLjTMM2UtctFWa/K1/r5d+RyzJAm5L/jHlRVGjCjhzn+eodweADH2SU5lAkga2ZJydJbNnD6AtzuB+I/ZmVAq+KA4S8AbRENjU9COE9mSwMaVyNNUA7nNjMRycTWOp2ivAqHVT/J1OvAIK3t7kb6BL29bAlqswZB9tl9NDygkhUoa3sUv+Kasfr4fLJK/aDHsgE+p5l8DMBolnS0qaEh8+3xLjqD06oCI5/YGaG+RuYjHDje2bg3/NrL0lA3X/SAaihXaWd0KPN9LsIq8os12vsieLzZhWLEDS4ScR7LbKg9aGD+G5E5Hdk9gvSAi6MXCfBFLZCN0mUxtFITXnsloNLsKHRkwwC47RFhwTXs1MUU3RmLlkyIj9Qef3bEiACT0nN2Q3uCBKUfwhjYIb6zHD/EF2BLeFc9j7QWEeFrepd1LkuJwnUGoxHKREAqp9+Wu7Numn7QxS1EdMwMjxDT29DKtSWhq6DwZCg5OIDGXh7ajiQNjQCwSpFZvm8nQj143Fj9zLwElXp1DEECZch62S5RCW8jCe2BmhEjeaylI/D/uQiVFc9cRbs75nCSCK2Niefu3K/9PAhqbtf+R+sYKMh7vSUQt0K5mZCdIZyIXLlwobmT7zuf2/WUXmtR4733xMcqKodH5Bbz8kTCePhALc1IM25J/NgaC4lUU4+Anm1sLlaR2aBeX85r1cENcWydt4FKM51Mzyaqp+6mQLZGQ1gS6pYrlM/5zsMG60SLOq8SRrZEIQUi5ohSkjgGw2j2AOcrQrfJg1s4KoVLPGHy540toxGhGt56CY9NljBIPyW9SNKMdMrVcrimQNH8Pj2DtsWjbIFcFaeHUE70tiajEyebGAtLJ1XIVybmyyDgsXl9LILzgjQmCJjhryv8dSbCmNce1ui7L4Uf/4RNBWNwDVKGQ6qDyob+Cq8ShRiIL7vb5Zq6q2pM09bcAstbtaLgvPfKDPe0QzJxXhUcuUlMH4vvw5CdsQRqNlsysAbwmFHOzK2LrtcLFSTlbDTryEZE5I4mIuJvUyYMLeQqISEcEJVIFI3wUDFyYuBr0bmLPuVAf/ZHHgqhQrMEh1CAtj7RRMNl4w90qHOfSEwyGU4oAyhz5JQlrIU3eLMM5Kqtm0pna5j+dOUz+Ukkv/fIxIgJUlAA/No0JwDoRcVTVDZApoBIUGd+wyiAUKrpKXFCXBIRAvusHyaAScLXT8CaVDHfD5TZqQVgq6QzsO4cuoyxsKJsWlI64QaogWRiV0mlIKjlSXxYE3AxTCxEfUqa1IwOdZnFJfBqALle7L02qNZIVAiRgrwTfcFn5Dfxjb06xmRPBXEi0ypzx6SI1IQ4qFAPG5Qu+/eotMSTc2+d/2vO6C5Zz1uXgz5FJfQQY5OD5ftaf4OSwVbte5czJlHIEcd1Fc7WwAyEs6iJyfFDKog7n9XbtMMpDNHFUh9VAGmMzDU/1hRY10+7k+lLYCWhBYOBJImz67rpaBVZdwXKX7LAhP/61siwNsARmHVeq3ci8DTjkx7ixnw6EqmOJCB47M/rQoLwp0CZLqUixflhd50fSS5WdbKAGAcRzNMFdHrcHoCODa8rbWhsXhroYnBGPK5htf834h3OK1ulY+N3eeoJyRvE0PPYaEie0bKhrBpOvaCLBimq8CpiuUHwL2BWvdQ+FY9qRnvuSZIaai65DBWWjzCaNYnSehg62ipBNdSh0rZ39NYlAVLVplGvwndGuwL/wMxT3EtQAVJAjGIP9bl8AzPOG4J3BhbmznixFN6uakPRqC+fFROQayAn5ghufimTduEeJVZH4dXwkpz/7oSAr14zlgZR7ozBAPdfVGdv9ij9gO8C3mEhwVHYa1fNP7gNT4Cf3Bfm5v//9ym0A+Dwz8dm/9j9utieTJGBtTislE1FL/i9cL5FDTYRdV/PGx9eDutkIN3zNkmZ14fFn7Xw4HqaRsN+AQhGQl/qI4KtOcf3sYb4QwRbiDYtBMSQsRetBwB+dQHEvoYdVZJ69gx71D7yFIXmuvy79HHl/wWUaICm9l66lteDdkogDlOx4vL9snFEhxDzR7f02No+rIoC+ptDKeBK2tVLP7zOgexsLWiiCbIuEEEuECEFJI2E3KmJfK2DbrtIcb0NeVceXlAJ61zdxSMx7bwjNj2mPzefWkRO5uYYDlT7z3FYjmFVIV4SQBfebUkSwzj02mQhWHne9MATQ0UbfLja9zUDBjyfCs8cWzOBfXEM8hmDYsk3wHz/fkQyXJHs3PXnkXVjeHfzTrOWF2er7Psv8rOlCJbeDhmUKYi6jl6aILX6ujnUfPNYmQqjJUUwsbLwHUPlWlf5A20vDJZn4tns//Fxsy84DbYbaSHJf46ve4tMbWiSBv0iciiync/iBYBgOu5MapENAmTQu0UqhzHR3SUSwUir8OlIn6RaRSTlExjddyilJMkrwbh2i6azUcTiT5VKC6hyTnRtfesm3StL3ipzdcYIzblrzdG1dNT+tQdPya8t6Y/pnw5+4eaoW3y66+l1/bqtWR3JpnoQmkviypR90EofVyk58pAglzrkUOTjLBG+gSJuTPz6YQDP1ZhFbBm6VQAlMZZAkz7MNI+qKkkogW8rIApxBK4Fby6hsqhX6INcOvSIcaMsUfhPu03Dz7xgYIRg3qTt4mZRnrL+YTvAe2UnoGY26ZqprRTOt8S5seet12mooVH//LhCYVmn10VlCe27JhieHxCeXpBncUzFjAPvmREUJUVm03LZn7Jn5z0YDQM8P1D3gJfW6sQ89gw+uIBdoo/MFlUOoo6RxsAePK5bP4GBRsJx5QpAebX8u4W77wfdsjNbwq2Sc7duzul3i5yzxMkZ24QgXA1c2DPkNPGTJ3vw95pBxWx8vLr0II1hO9z6+qs/dYn0X6n2s3FrxbeMRMgNdOjYlFOCgrwKiXC1N4Zjhm8hyzYpXghyvpnfEM99MKamBl1N9W+gbDVMccS96h/6u6GT/kWi3FUtCCXg7MXB8noFgr5OFDOUgSm38STdlxEm1GSgqoL2xXampR40LqkFQ90QZtThydC7iqYW5TTb6ZaNsVPuMLxB3FblldspiokYVdhVHKjC5FuqE/0wBykhJO3EXmS0mNOZxRKGfJzcFkANlSxHqJTpjFTBM1DxkST4rAkanNEbjRdxcyiv0pEfzA4ELUozii9ONVtgahUiMFzcd43KQYl17B1Gw0EXdOcShq/a3MiKwloGK2rTQU/HqAyqEh2DvWh6a5OM7q+JXa5REjdTEcUXr74CwtX4w5bcHWmLst6bfM+xMnwSu80lwcHCD3zi9qTyJ2fBF6beZgBaikQXuzsd75tNMhHv5zSCbeRXgWNHVsNa1uyKQ6rmnaLmdFm1Z9KuhS9f89gW2pTXs6jYJ3Mm1sBDHFiBwoYs/TC4mQixvTpmKxS84+qoLA/J7pw8XImBKcIfWs0M+7xuwk0Db4zuqf240fGU56xNw40yidXRxuSSDYA89cuz+QMePfzEBEoCVd+7hKxHnpv6wmBtUUCS5GpE8firZhIoXbVT9q/ALn2i9XCfgArEpi/3vM9jMzxSx1Z7S4EbDJzRzAq3fd135FO+OMk+l8HE4AZYlKji3ZUxQ9byxCJ+SCEYEs4JwtmGuGksUSxhoXjgsV+3XGgjXaAufNJ4Cfp/DQtC18PVmOnXkdcZ3TJ7LhiIItwYqGw4eFYTIPEcLyTJKz2RwCEnRdZOIWvZcNNd5M2TzYrDeNi8Vi0b7Nv8h8Owbshx4yVFxb8dbZOWoKe0FlQxBbrpR8etNrx/R5aZtit3DkI0lvEMxQp9jrO9boWRX6dy72N0EMKgRYYjGh53ha9++Y4DwYnuGXj5xsrGn6pgpZLwebhVd++FYzCCw8zh5GxsPv8aJOVRlXCamOFMUqYq974nI6nfDFIor3L54FrVZ5rKp58naj0L1UbNXXjAnxsnQvAqen9jjcvoWpdRB10c/NP2HWlFhWvm6yFEJ4BWTg4tuA7VCNVwqwQzB97nrgNz0O1EA1Y9FOK4wKN9uqSTA2QuQ+jaWKCis9fYR8oHbJEE4NlwMbsF425JH6QsYbZw4dJ0CN7gJdstnVkSSxI2KaLm8TRkKmOcQjqdXh7G/Nm0i5hY5eufk4guE3DozAe0w0Yq2NFaXlopHi4NTui6BqX+EaQOJ2Q0ScFzQZaus2y28BdIOWzNkUb1WpxKy8YCrfEmNHZYqkqPO1sAikUozYJ9cPIk96wR8S2Yctjj4LYWRl2u0kgMZJxnb+gMVdwF++ufPkyTWM6KlUpQ03scSpas0x1Ns0cs+CEkWi4+x4uCUrktYysekjj9oUrgyuHFBi6f/h1/YqE34fbRr/7xt1MGZ6sE8aXEPYRiMU45qe2maSmmv44GKuVJSw0YkljGifGOsY/dN1ylwA9sSYN8CwmB9Sy/KJ/ldYmi3Umm1L6fSSRiLj7HiABV3ofsUPsAxR4g61XfAYorsodpc1QgW7uOWXkRqvsjimyHDFMketXIYEm45rGi3YUi4+jHBXclyAmTw72cwpplOiHaDVTtKIo/Sfz9GioNzui5x6dRxtwhPguLuTPJ7hzrr0HxC8nRIdMo4oUOiUw7SVeX0l8bhvCVscQrY9FBj9pf1eJFN6cY0B2n782jJ2zRkkR9NKHAr3G3PlvLyZVoWj7/lBx/SKHyMFQeouAvdp/CxdxSpjzbuFNw1iE36BkWTWB9ro/TAKV2XuJQPJ0eaC2a+LTf75z1p/fPehdPO98mWcDVX8g5FZxBqdRPfLyuzLf3Ji5br1vpAB5SMYwfhFLjJtsVJbPp7LHTShk3ye8eCtT6QcZax7UOg4s64z5fTX4eXVba/Pax/+D5ARlVwF/RctTf30TJjUy3MEbgE3uIKcAm8xZVzlkfoxa3N+fH3GO0N5IzSa7gMVNyF4FMk3/QPxuzrhlBNPssBT38mh1928Wd47Ot9Pj8hg+IV8/yYlH5JG3QSt3zm5szifyCLSzlkwXFikmBmjjg2wUaXKIknkOJb5SXMZHBwDA+A70XN51WJ/yxFxvcf1T/pe12VyPXAO5woE2BiapHYdqq0uTrDK8/0fw5N3wAFP/s1Xpec35FaUXIrI1HhCVkD6seg80x2MWTrwDrITLG4PY3cgB3uQicG2OEudGKqugoZ/qhckt8bh/p7+B4zDB/Dh9kOHsOHcXyMEQcYcGeyTxk67OdCnpj8PP+3gscFOvRIFbwQtSqgnk/C8bCk/8KBIFaWehAuHLoU38jVg9jTUPC4QnZcS//2YwX6IufzHf3jY50hBqLI2pCCDZFJVXx8Mbm8r8GRinkSx/aU9Ozkeq2asqJZ9EY5V61oGyF5jS8B0HsNzKIcMWqtwv4AjVo7nBSzBHx9yPyGlForimat7DnVuJwABCuNySNRJSyjn3gxK1CAHe4CFGCHuwS5hxF30NKKJfl9Up3eqkbnckauPW4EdhnbOLAtoRGINn2azkdqT0qRkQzSNkYSaonR+ZD7GrjRthLKAQhAAY9BidVh7OCdUsEQBHcAycI4/l0OFvIJ6UkCQz4hPUlg/3m1wpENkzw+dlfsAfmE9CSBIZ+QniSwhXM/sYMBUxfb6/rIWVPrbfPV3EiScVHjq9//yILVP5X+f2kjxel+s72vF8zgJcA3sJB3oy7EGYZQbzI/WSn3bSmYz++CzDHOWRgk/zTWHYXsrxXKsdsoBr71fyWI4C5jpeMh/SURxZa7T0G2UMIfPx27wv2mRllIUvrwwiPE3D3VFAn4WPm57qp3/JNN0HU4BfH1TAgjXsPfhPJ0gWv+cGhVCwz59aFHV+Bvvh1a+gJdAcnHI2eU/ZrFIsbfpEnpmyy5e+Sos2/yEc8FnvLdoae1wLxAkY8CP/l6aJ3y/aFpeei7F7jl+0OrtcClQJ9Pge/88tCjFejz00NLV6DNR6/DA/7CpQxjfKQlEuCExGaj/yN9y+MsemehWJTK9FJz0XH7i+nET+qquDoGIBKibiLTm29p/PH0tv32d0myuk/NX5/oMV5ME9dZy6CbIH8d6K/bJD5O13eBsQhhjDyAmRg0sWll7H5LXG0SFBsUoj9CWXzzVQZA0n375fP1759X2scXmv1fVvV9RJflzOsK1frdt2RQPUDIxnBEosbkUO31l2tTIrlmr7TLVIcX9kvZLsgsaJeZCuif47VreNHVrZp20A3d/72ZTC87tZ9UvdrNSqjwWqSX56rSYoEGDeuRkxYgtDWFIxMOOaEtu1TUVu2j/QdVl9auim+sbdg1v41jzvIoJYXKRPXDDtMBMB3Ub7VdSFgafc/luxiZkuNPqtGj4zB67ZZbA74t0XssVxRAvhmM45+kO9ffXAlJKboniQA/QNK2R9PdJoOW6V6uHOw0W0Yu+lQojZFopwtciiZwEH2wT6IMaI8q0D/kteoUhd0AzRpk6OXnt9KqLHySJD+boNyJh9JbKjn7Aj41OUHm1CGL6qQd7m+cMZceKmANCOY8aiVYrdnd9Moaba8hhfVFUE62z9FD6DtSd8p/XGlmg6JU8fPL4b2KV47Xn6WzO9QWG7sLUprtQUMz/h++jyk17szEBj6VRyVzRIaqOA64mt6MBnzApAxzBaSfh78tNUEHTcRiZxAtNSEHTcRiJxAXIil0VFAcShZF2I3+eaEHrTGRBU67Z6YZhs8MWgUUaRqAmo0oCGXUKNfV0zWhUg9evc1Rj7g+D0rTNOHsdMybTJORCHGHAEvYXzpybagLl5GwDdE/HX7TPiwRwtGcwq4+tLkyXyGrlV2geAFyONTHNq8mD8f61ObLdOFUX7SZm0m3JtU6y6Wb1MlcNN3FqrP/HYQ0GyoaeK3BjrDVebVN7+bPPLNOE0nwaS6nwgu2sItzGHGi21NjUSobudaVtB5JigsyhJNSj7dAVxGtM3qqQ7A9lWPq0H3odSr86Z/kNUxHc+FkS7q/6fr1+GfUtA3fFROIGKuBCJn51OP3jpw1tiGqLLBgbqKC7l0qC5YJN2AbdcL2Ndulj5DZPitBw6IkJoX0Qg9eT6879RijAQbnpJP/heFOUNjuswUfrx+u30zWpFRsBWbCU3pJMd5+782k9YnSwjdFngehoHVTlYbvAm0YujyWr5b1erktHzSXz57WptGQhzDFG+Wi6c5D/JBW8zGBTxr4PtrbqwOveo83ibN6Lm2lZFDu3u+Xz2HGUp2qqHP2iR/TiNdEmyWUwvEfuQ+2frUb+vl7uUHUVD/g0MueKX6zBZNKBAez0XJpKVwKMFXpWS2G1wsiuqTM49G0Kqjh1y9ZeacJ2K/3RaIblifeCVd1QCO/qVPB8xQa/pvcA1IfvelmRC9ybKQRyqOgVnEF7/4cCfQERyj07HFBiN2EKS4abQya6RdDRUxDBnt8NSkEd6UmW34yS0yF/J1ZC01tDet7tPEoVMWAoeAiUZPFyO0z9oxJUIpcychFXaEQ9Q8xxl/8iJwBL27b1yFwm8HCSZxW3OGgmfXRMRr9Rn6Z1E8vKRo2p5VWCav8jtUanyjuoG5955VQHpyEprCTNh4od7gGb2cqiMDKp51NXs7tDjrnhoMOD8I8GNU5pkuw+5Onx7nwgbRqO2VMX4XLSXywfYnKdwkJUHGzve3nzeifoPoRrBfJHWJh6IDi/cUI2WxHOJW+E/ttE+8ZyVStQuTQXyuoQHJvUFbSas/ffSMhQNnqhtgGy5ckDF+okXiPkYguFu5fa6yh9zQdPtLuX8ladurYklCrBcawpIky2dQlPhFwfZBsk0Mem3vnAx2elHL6aZHD5Pi8+2JzJAzpDh3aSSD62AvaeFVsJq247ZS7VEwOwoIYf8rQ+UDw7yQVJs4K3CfoOXvhrze3WfF6im639OX+k5cJFaxWODBTFZx0KgmZNMGiSJqwmU1fkU9dphMlcVmqYcItpg2t4PX2PAdPS6Zm+X5/ifddeK+LfdMOOMX38HgeJPWgQseH5EnjFpG5IFkWuBMhrUvZo6+Ep9utYqvsn180w+lGNVb2+hRQx6BdcKOiBx2QA0u6LpSnsWLDfS59GoKDFNLdhUbx2d1k5QsE3100dnaYk0iDJHNZpWqqhGY4W3q+t25bS8mS4KIWXg+lbLCcOvhCqxhC21alK0tVX67O81QEC8KpowiGnQ8htTpLKmtW2/tJK2Hw5kJhqE1ECdRRXVw46WK9whNI8voV1bKzgxZ7MecWSNzFlXMIlrAvJWoJoRot0bmxsfcdmgESfXyMzvZBZYZGvCPj9RQghqg4K2Y5u94rj9ftBUDrYIyQmOvyXoCz+23D+n1c73grUUQzi9mFGUCLq9ylWmNmkb8bA4bXuJg/YP+IHdPt+94hQjxsCVRU3ymrVOpdwoulK4dsB0L1Yr34FO103jfMBRr1THMLOpSwbNSlPEGUbpn8Op7Eg9hmzZg9rpjPMU1S0fppghdIeFud8sxXw9FIJKMS57R76b3tjShQAgC6ExA1MXWXZ/F6efz2RiA83OKHoI7dCgGZtKRvqCk7EjDCdIVmqwJXyUjSK4oO9fiyjITMAot7u0myRpHbIDvEkw1F02okFb1LmhB0Mm3cW0ZyeOS+nvNEMrlFpvi6pJVQyKoptfES9OhbWKR3ytZpeza22hEhkYyNgui+LLv1rZTLnUK3IhqMcAOnTbeyxQ10IB8hT4kdYXb73scDV06QweY2B9vIoCGH8GcRvNyBv88qt8UI+4Bel1DX6C1NedleLmgZvRWKufEBcWFoXMMa5j9pDe+VVglyG05mco7g0sRtmgvDSLdpHlSdvjqp2dDkIG5qfcNbIq5b/OXRGclmMYzXmRIkUZwmzSdgRGx4auw48w0A5DTHId5+3tVS2LhvUjCceYPti9/FWWWgS9r7mgYusf8Qqq2EpXotxOLidCoBb0DFEiPiOdJb+PD9FK07GJSfg5L1J3DJ5mH854CaYOk5KcoXGtEf28a+YNsKXY4E25yl0BAJYrZNHUtcLtVXhjCo/gNloMlWPb1x+A4DlchSTSxCCPnnE+7yzgIjVRaY4l64LoNveiomcjl4d6Q7+I3EkiVJM5GsGMgQyJ8K9uKWposL9amWXlj/wq5J0McSHxON0OmN+HpiONlJlJMYFqQSduApgo5O2UG14SdHsIxCXplEzoI8nprdUP1GJkl90zf3zEwkDWoD4qDWCrjfkoioNISpHkyE42YvJOp70msMYVhZndIqwNMszbI1LVg8E8dJtZAgjEap6BaS65LOLCFMCFE8qXte8wl0MfEOlrtjWkuxEgrFn7fay/F53VJEWeYc9z5ALKLnJ0Bf2DYeM5zUyUB4thc/ua6tCB/r3zV7yyZqGeiBKa3osFVX/FDgonZYv8yf3AqXfpGDHlrqGOfuQI2RH5V5pi8sw4depa6RN5WEoEGMp/WFLFzQLheq/esxg5t9/F4R7LeEh29qmHyVlrALQcvlWxUsKaAedO5gDCRFfxCb6uEwTu7OStCZ030qk0XCg7uIunnsY6ak+w/N7xqLcJFq7qeOdgR1x6fIYVAuaMSAWch5zO0rr0z8uXt//Tx9ay5oRcbND3urlW7HyIp1U9o14HXqmG03pAa6PGOLhTxK/+0YKQ7O6brEpXwoMSrm/ZP8PpmurDcIh2xhLuO3XTQuARfAb7h0sYVtqFvaYWHQmnseGj7NZP4gdfrC4+e5ge0UfmEzNJv3fec35rvXV1TTsPBvMWUxbtTVdm0hL/VohQZyRqs6LgMVdyb7lOTHsFiYlub3TnghTuMGlR/JIY3Fx1hxcE7XJS7lw82FZtkLaF5hiwY8GDZPgsVAwsj8UWpuZmAX68oFySq5pfAhOi1K64MInt94MBNCRTIDr5qlQ35gNVpGBML/1lvYns7AiOjMwUAu1lUgdtZJgm5rxH4pvkZem5sPhOuNp557EA7pQc4RG/x9YwwJrRK2NQJEGEtN9s7N1TW6UxPQMEeDvWdIIdGli9Txcqiac9uarlqZMrZmPoU4Lx+kzRH5XljsGWQfFbBJIgprAtZkgQP7L3gzOO4TSuCWaK+Jrw/A0rcqXKPsN6SuqioezL6INWw1TuXKtaFWZLabAEs4b2bZ4EQo/Ts9uwXMiuL0qzW7EG0oAMbvM0R7t+TUcUAIhXnSFDU/snq2KaSPRF4JptA03fCK3YPKn1JK6AusKpvJ53pLXYip0ZxfKbDGZhcKRQ6LD+2SbIwSCQzgRLpmsMjg8oxFZ5UBqD8M5gWvc/pRRcwiUkuSscO+L2rDor6aahXo0su3WANggfH6Esrj7Iz8lQgUCZb3P9Oochd0gRvSo9yfMN7B/BgFwAu8hAF3Af12R9rEQ90H+vP1uE7UtaQJmIKcSZmSXVSvdlbakp+oqEARZM4xZGZ7/vwrL7NRRMTQlIpQVT2gCk8TelTTQMWr0eDJUiceawXaRnncNuIqhEsEKdyvFb10eHLLXMvVHDw4LQr4JdpFgIN100xoon/UY7qVTbHJgAQ9kdTz2WsCBp3Xyx9I9KCkm0F1S1l9i8S2REWElSva/xhiYbC6IWsHxjJdOkBsmyaHb0OS93ComsF9NL7Naj13j2Bb3EUvh8LWSXgQ+YuyyrNbVPYep8jy87asXJNYRgcTV7tHQzNtLKiASWWuU0iTrvJ6iapshswNMMwwc6DSNioG7UCfjowgWigJg7cSTqQu+RsDXBnLnlKowY6GwKnY6RFA6pek0YLyp7NTaMlwBfVIqCi3pK6wyyZ0gkT1BnVhamvjyoknPy0jV+odqZ6eFOB4Gpvm6z0+C8fTXXiwpg+4zEysvy+Dt/+X5maeEVeWYkVdoM1aOgswuMDJLEqo09tu9Z0km7AfH+iKBuyJP4cPwd3FoPdX5MDAk5F1Gj6ugGxJrl7VkLegmG85IFsH19+rIt430mTouoMASg6ZrKgSKjlSIfsMvgbVqc+Gq9Wk3elRrc3BEAu/69xAc7S8V4hzwE2NDG8Ng1NAQM65gHPQ+t5OtLNaL/Hicihap4ZlCEZpy9W1G1PYkVbu7G3fukyJjHBaAmENxxms4iatEEspcl3buxAK0rDEIq/ues6lK3HmR9RA25ToPpwgGpPjDGJBsqRuDcnnXQ12SBv+VSkreh1+S859kN0yQCQV8ykVzUo/APdOhiCayQnqfSY7rAygLeTQZ7Mt31NZf/DmONCj3K3IrchurJjZoPc+Vv3RcqnOqaXLja0/itT3p4TNnJcza8Nw/kmK4LSOOBTKqXPMTvO6qrBa06qKcXCN0HSPYFNvypdzRVj6fkRc1CIyt/8kux3hujU7Zru7VZbYTC2cuM3ww6PBqBRHFw47/xro8GR6B2Mu0E6NhQH4UeKkCRfRHo5uDTIA9dVX+tzd057JzV8e29A1N8X9krseCiWijG+LsDgizYkEvduZln5Pn+Zd+P9xAniMVlzt6aiOOlz/SgS0xc2aMC6N3SQndSfceMtg3BHqURUWJMLy/2mlUpyqvEIUnt6muamYMMlRpoXTF0icy/1QdBzWX4CkYZlbN12EmOLT/NCcUw3xK9h/t6ldNev0H1b+BWKWz2oUyvwIj4Y7p6HKpKKSl93Vs1FzKvXXOojKZvSTq15FNwKvDGZfSVIVOyPcAdf48sgihMx5UvCqEcEoLaeLkj1i+2S96MlN3UdKGx7BlMNawQsb49ZmSNJQwpgCusTh3y/S/53fpluldOtuWBd+W+6rRrc69YQuP/8xn1vVy071Xn+YvtOvI4plHJrpmAFI/ebYHKuFKJWCDRJRwx/TK7GY7bpm+b3UpZ2eNTgT3VotDb8pPWehj0TWLLTViYqzgw0LXcUH2d7S9YJhek8/VkJ9pRYPP1GMyxtDZkzYIHrvO81SC3LPb50P0jqh49TyydDaSfpjVwjoSFExTKe5QPea//KcSNKMtwR7VIwwTlOF4tWtPsu0iLJ9oWhA722fZEtCHRj4leDmApiJ6yhKpN6FZpFmRrV041IcUlmh8/faRR3D/P7O/FhPA7JIuyDyb26mu0fcq28P7YwEhDlgWKnEq1OPGpgrCHEzYTr1QEnw8MUhCsvUwsvYWDNHFaIz3BktS/GTtA0GpQhNjg5ujLkEM8l0+0ASrE5vqE80DY46lzPw921G9m5j/TOZzg5B78IObF1ap7ltEqOeemRkQrpSfsAQ09leRdhRSTtfu7CbYIRgD7aCZ+qIBuWlo6pF4WNfueLbdGfVo+Xh04GyZKxEsVtr+zRQ8YeC4pajpovFDKMyFF80Lv+Ruu4HJJS2AUo4w9mlCgPiXeH3mMVoV00KjeY91B+nDhSf2Gtic6vnNGzxRGF0s2mNTWVs0NHmqs3Cq4sdXkevPF9rxCeeg2FDq1jq0T5Zs8Uh6+tNLdjoTlbS28g+A2+mSb5iPplJ9b7PHtjwClPJ1CNdHIDt/TAU9vd9mPrp0+C67nW0XPzUTSOjO9+/08XjDBAFdfVnKVNXfEiq6yDTsXJHK/or9jSR863ZOUFQezQqJYlZizBCdK8GOq7YltSZrK0czHjS7tdadNadpyK7LvhujT63mZm0/3RQxs+Fz3PEo9JxafPL9tOtCLdlhUjjZz0qZa/4mbzBxNu9U0+vioTHZheGt43cX2BdN4OO9VSvlBEIQwNb8g3izEC5Y9BjOmr26fPMPCgcFJUeMoCJybygHwq4kuAfj1mkvHBqA652xW8fCjaGefemAfjvZiQMjYbcCDwVFpTJHuIJDZcXZyM7SWXLWPycy5dudYZKdcXjFS+kNePb345qiGhGA2zdf+DtXNOewKiVKI59hM/eKb7dMp8wKSqe4wWLr2hmSy/zpfa/T//XErwfEIco9scgfQ4HEbY49fCDg7b3yRxfSEr48k+NhL3SsSoi9c9kVtqCt2N5f4iXNictN1YCXjuQtkeZXwlpkPXyh26w7gRP2DGPql/DYC+Rehnwy+HW+QvA6FAdSogr03okeInlvh2aUF7fUMt2IkFKmSVuuBxi6HhW1has2RZmeE8JxBSGVtXq35u+7sKT4p+9jftnm921Iv2U0PfE6SQXoiEtUUE9Vm/jNy/11x2QpO6CU1WpVFrfiYqNgISlut69Quw9704UGwuOLNSUChUwdlb9S6bGt/xGu66w1QQrjI9lsnm/Wii8a2bdxH2f1LGPEIoj5PxJdBLX9pks0Sh1Sjj5Z4lZvMKclJ9Fto80EGa2BtHd9ZLANZP6edmzAFS+EAoN+V5QiO1yYJZ94eICCdW4erxzdUW2D1dB+b9r9aGgA5HWTOIvAwFRY3KLPWFUHwE3gFSjFtK74kpSI5P8OyoclI4Ra9YhGDNJTzcKnTkUU6OlnjX7jRTSepQf9/hF/N4rAg3o4MXAWcfXtvYnn+dvmG8g38EXttYdD8F8GlEiK5HnVMExFGJN3JwJjA4pe5QOdIsG+gCmA8TBf9aLtF6VaITFrINSUp1nmdmAhZzi7NUAoLrHPKh+6KCznnSsmb7g4yaRujEpNVdcVK+yeXubBFRa4S1qWANJVbKqec7lQVWCoE4CxPoqAL1jthd4Rr0sE0mhoF+2p/+bw+CGXmD7tJdEGQuQ9x4NkZHQT6RxpzerFWb2kyzW3hVM2an1DU5udgDlVaLcX8RABopVMOMAiVBgaHfRaKM5bEumQkfb9wxRdmOHvaQj7k71pn6dc5HnZWCbX4om6C3ZNCWGIzEXZWZPD2LlEq43ogrFpyTVaQna6JrrIDwS6AHUyJoFec+EQdvemeOV14AqxPLOdjzBgQHVpgqV+6FOXUcQz0qa4S3wXH1t7t4iDWV22OeWKTatmuuuDRExooYpvgzHVyLZjeRCp9RlehsT/5OJ/703Of+zaZ9kWXJNsttuTOYEk8elgW+svDLkYD1Ug+MyzABiCjFBmvSLrtlNoOsPBfIROFlsUa0Be9SZsnRHHKEXiF/1pC1p1vnG2UJElTiFc9a06gmDu6WpuUGPiC7yxO0ackP/0/VYYAcrGW64MCu5uWH9r1vaLuoECO5ng8v9MmVv4ztq5BKNn4YvTYC+5pYaXT7gZs1avZsp216N3aAhv3t7LJrXJlPB2cyDnVDmXMbWOZFpx6UgmQzKX3ROpaV+7baIP8TKEnBSg0sUk0nMUKDHWmjAW0KBRzRXp6McyKHCwN9x5zTokgY44jEnVtBSgM5ksAeHWAtqUX9nr1gP6tO/PoK76xW9S+zl4QqvcPf3+1WxTqPLilyItqFtahsfZLbNwqx95NFYUZgbTokANM6VBozu5XUzEY/GRYjUm+4K5fF9SthCNT2z61HRmzk7G1m7T+uTVyXBTJDmXeKozFf57oa4mq7CrEB/6cfuM+1tYJSNnAsZMwB2myY54wWhLx4DTDwxaL0vUA60G8WzMnpwIbWrr9Wd01EtWfGOVz4XKRMCS1+VrmlHd1MUEMD+660vgFWBU7B3iEX0TNikKtpNXVehtp+MzXGNPU6YTK8otj8/H7QdlgP7JMQ2+8GoGMgoF2Jy7FoLUCELaDbVjjgil2h6cYS2WUBnjdmRqYMRx+UdyUQSOYVaILDU9BRBzf1KU0EgJk1U+D6C7QlIhWo/blD/905mPraN8LMSHg8pt+UFuGOC6OLsmtojr8WxS6LQxEYAwRCRP0uS8IiiMONek+PSsauBSOLO71sYQXxatQxOs1xnHUsfBLeCCAerGg3uOVpGwYBuzSi0FNzm+sG1AJTOpK3Nen7z8oIfej2nrv9h7JVOAwpQIyF9wAvmFJ4V86K+nOnVcQ86OaImNmE9tAyOaTevLDOZvOsxMztlqD5h62lE2Wh/leNrPOmWJ/itIde+RbWXE/OnUgvG+GB8oEeHG4jCBOr+Mil19zwh1nrONDoV+i/jseLl8ALWhN0KX4rCGdtxBh8z+6z6HQBnx8dS3xW5KLpnZ++kk6Ol1bYofDNgQYOVCptpsTW9BLN+kgb27riZd2OZvp31mcMY1bplm342m+Dy4GmTpDlXqOsvF7MoEjrFEdr289Ji2EoY6yY7o65Uuup6c49KqYsfKTOMU8wkJef/irAWrKBGuFP6i6ePtxsyocGhXDrY4BiNFyj/MxJTk8236BIXGJr2HSgZJKMviOhpZkv8wZXiebFNR82jVG/He3d87RUuuAI+LJevU9Jtwox++5gQKuNOa9UxijtjCiSkWBMk2EZrZ29DwHqD51bhnMmFhs5Jr9IHWXMZkk95EekfBOCmMQ7AJ01d3azAOA6sN7fKezNidYc4aCt0xpUK6bbD98vW34C8yWfvJ85MMSokj+K6oLO2Vts2bMXluvKFPqaj4f6CLTKIa1NaoPnJ/aAT30WWabWFNSogF21ah4PR3iRUTuLaIZK6Mq7TFsCm6LpfR2+DSV8Xg75Mi5BaAurd2xGZcN8JDYcZdDqR9n4q0cwiFdBBW/oEGBZbcgT/Ie3pTYYvdbA6xKeXoY8Ta+9zg5B+vsVYkXTuIglc/52jatO2rGTzcrsno+mnDYPK9tWvsbH/ZRz+k3RwUC9vpxAYvPGtKA1RPkGivgbcOf4LG+dAfg9+E30a3DShZb5F55fZNIQu3JTSHNGIx6FWen536VBmpcRGlugKQLRTCU8O3sxCzxGzIYynBzxvkGtHjZU7gNcuDvsqpQIUEdH3oYdfzoS4CBaerAstRyFaEFq+d+/g942U7p+qR4ghIaAkPnLfHPrkc69dDafYvgBsIlTqNW7Bf695y6MkOafJrPSFLRJW2aJqZYw89/Y9GmZzLms+Z7LcNy0GUVF8iuM2sLecYLQR81ETrNNvVogm6L1L1yrDZghtEwmgI4LJj6R3vwWBrVC3vetgB0N5xJOgOBwQ7XqkyD8nzXtt9aCbKVrDcu7RsYSbCNOuh5HeCIQJbTh5QyB+9mphCwPShnaPeAgoo4XNMZJti9zzqzpZ8EOdtEW2nDUK5g/uXNm0nx1slN2pFE1fjUicngCEHatTPKYyH52LACyuBUihEs9sUK8m24C0BT9Ky7xlrr3WezlzCRahmRU7k83ZEoVQQNixUztiDYiUt1I9ljMLKsYsjii8Dci+swSYQ2AFoub0eK3ORoDfQYyNuscfHb5VZgkuxIRr8mFT/fb29EQCy2+fZ3vVM2ebxJo11GKuX0LaWGguEF/PUtdN7cVhci0WrtTNsP/xmpxZme+HOk+VtSaQHYEBj7c0jFyeaN58Oa3A+7ZY8V2eGNvCgRwuswhF+MvaODzgy/F0cF/TZ+YcGQVkYlHOqqCFYGvtfzPNtvDuCxV//nkKHlNVbL+/3cL94T2Aba1EZSVY6cBu87h9stXX2K+BghLcl4ATG4d5XitWIuyYop+XyML02NPCDk+62jFtW0/8xARIYrkTIK1cCpLiDC76A7nz520aMqwE3Kf3cMWDOVn1k1n8lPkkn76iW449uEvMPgtnk/qNkoCWuiic82QCKBFTWJMEbKOqI81vdJZ4tf1kpgn0LVmcfG6aXhsS1kQMF7m5kPBiLKLcYAGOysjHqrXLEAp7omvisGijuGxA/yxZ0xRp+kwk1hxoy9A4nuIejXy9InYO5jC3ZXL6NEuqjHROmrBPINaYE4Fv5TkhIIqT4AC1hqD8VIYxIkilMYF5hxIRFwWSGguPwnw3EGSr2cA2Bb+tJ1d6GPTdH+NekX16trVdh7xdkYNGcnsjQgLIuRwIP22ciNdHr4wTwAb4BJBcFSnUBnz6AjmPm7asFnTdg12D0OpcE4Z03Ki+fmoYFwuvT9YOe7LLHSnx6AqLxjUQQ54nagNie/UXGwR+7sL+31c4PP/lXRkx6CVvoi1ASE5W6kiSLE2gPeOeuohC9xqe8+mjvqxO9GSGJ3VwviMsI6ikFRqPqE7rE5GLcMyzheH0ZBZ50RGBuEbPmQbgsoAwdYQD/yoOVaI7mWjmZRSfQPMmuMlNGG5Fi1Yp6kspfXY6BhqXjGCL4+Had4fEiroMsnn1vVstTiyOT3rtSqwWJdUnxh1UgAAFdWcEAIxKZZXB+ZzJLrq6tZbib2+fyYJHCkjU71Zmmh6h4SdQDn131yaAcrzbLO1YzEZavbOiT1U0kZJnthkFORzUeL5TbpviURxqH2WmYtTUMiq8bAK0Gnu0L+Rm0XpyvQCjYar62T1v88HsfG+2oxeHMUnauIrdP4K2ANNoPfniL9jQm6qjJXq6zpAxXbhnEZkaspEajHeA61si6HdV6/kFPG8XVpep7QGSGwEC1EFFczPazFLjQbzkLu0mKw/6vd2ogUNy1ugU9vF9kpRD4bQKNtcE7Lqp4GcJzjskfcnfzURuFQLoH8gh2G5GDaNOB/NgEZ3OypTHCna82JmkD6skFrdXX8AJNi8TAx/pxwwthjQQ20RD8Rdi5FKIQHz1FvDL/557wDok6W9r0iznXxtb6WfYBAcO4oS/58nw8lMHkVxn/cvcMmI3nib6Y5aeadT0RJrWwNqmuUFfRyVcYLNjUnsDg7oBcssGcV0kNWPVNEKOKwba1vsAx2QnxntCGw76S0kM9/RHKwRkyDI24UOroC4GXKgQNi0U1g/+DqB5VcjkcrZRMruJwh9nWtVMpEEdNXIEn/E5fF5T3cGSfGwv7niwLV7UedwFk1aCrnSkYxVHL5PBx61Xfnw4S/kii7Kw5yuzL8XeWfRbYff7a4CQTmVSXp9esw0vzUnyk72fKoqk8659T7XrxivtCYROMbposWLS38YuJa+QYaA4Uea7UuKdg2kY7tprJr4jlqnGg8o0Nk3XbpfEoL92IuIOkMz3jagdzlpdKfoj5H/jM34jYDS2EMtBXZmX8GBkZEOhYarSjKBSgxiC1iSjMoVbG1At+VXIeW1su+0mcQKQBXAO9FpAb+KnVHjPJua5SrIqiNolKydaKnSJNWzufADWaowUB1ZD2419ygtcma5ax4sH/PDUNOBWVhAPlMHtNp8EaaNfzhReqE2eOh17IgF32myLA/9EJIQmhYXNQhR51EW+QfkXGqsDpHxD5t8aYO2naMQBhxJeRoDwcvaT6QryfvuOlLxWFxDvoPlK/EDdK535c9JVUjU+JRMTzHJOXpFP0mNDdtmZOAlt4pKII+cXIfYA3XdTAbmy8CaDiV1AAghhAAZ7VAozWE9Ic4N2YAulzC+mIsUbWMTVz+HYJpNAUEcvha3RLjKyzO1fWQKEv67mfEp7lm8tSPZ6iyh79tM+7rA/PR0c8qNT0MC7rV7vJGItnoynlhcx05NZxY4F0xO2T8J3iSKP0DraqPJ9wClvsxgsJxFEawzXHeP1qnUnR+kU4/uuqnplQFaU4p9t/qnV+0OA2kc6y1vsiBJ5KmiBVS7n7dQrLresbyjijgdNAimeKi3uEoaE4AxZ1P2kmf0BrPqqkLEESW6Ga3LErwcg9qPqqL6gb7LS8guYx7EOPqZFFsHQp1rtJvT9Uvn3ApGA0xaeqKX/EnzZLjyo7/RFxG9BshUd86ZL/z3e8FyeKEGf16iFTkrXqxUOkx6+Drdyy0z23du1tu3S8FW0Sb1JUlEEPcemDH0EAf7om2QBltNk0vrVENKNvj99P65/WnT+pf0FQ3AakpnXVcLNEyAVvGVy4/+XOoj+amnV0QDLlOHZgSo36aSAc3NI7LkKkPLvOjeQq8BgWkdSkTZF0ZkDpmXJ5fGkNHLa8glUWsKdrhyl+0C+hhHT7xlj7rZoXqFEMR9RXsNBmnZNwhzTzJxMSqdwC19KGyYxyKdaKxt0EMuQnGHQoygJblgtfSTJQjU7mrExp/lL4Fux14TsZiQ5zczZr57Mn28KZjmp8zM6BIM3RdAt2cbKZLy3pihz7jyvzlQwe0v2S/Nuy5KKM4C1a6Fn9OUalL6hCWTTFWUgiSK+3G7CVFQ/+8FtITvp7Ouraf9WGm2R9GXempuOJgoXZZB/c1ARVQaLPOmNjX1i5NYocjGFfdm0humUGDexaCVMrvKlijayyjR6Vx3luBG4OTnBF2Z7OiArjOXf9oMH22syoxDOuNl8DdWKvJERLj6HFyTdmSCXFsOBkqHeb3hyXiGQBfXtw2HOUP28jIkyULgmHIKqgtCHF38i85gq8lDvPPLxuf7t0Hve/jtVU8uw/pdibINnOFRFUyB0q8y+ILXuHas44yMlElRgNDPoWXtw+cb0tqzIbEolzEZaWFCg0+jiHg21dbUJjV6984zrashixSSpSj1HG0A6+xRP38dcXjA0/Jym4KuqAGqtAKPYilxjJiyHXwbDch21gAjCpesmAJmSPkrPjkX1NYKqYVy7nAkgYnRzvzP6fBw35Y64LSkxpZt6dTYpxYytMgrRG6UABcf1uMIGMOk0VeQ0C8Ts6N5IcFH3iWy/IhkYI8N9ht7SpLRLkDIVjzZGMm+BG4rFaRwks95NQroAfStFciJ4c3CfKJoVMHRjZxnfXWmRJga4deOIKXFq/FKFd1RDvr9YYKvULjANuRWsovh34RTsGqhzAcKORDczEv67ygOtVwQG4uDFvToUPK9ES+PsQojX/LAdI/34v8JFErVwCDyD3AapHi08Wo/YINsi9l5PH2cxosagYM0C3cUwjUBtx4mLt0ZZTEk8uqXe8D8PNfEIaGRZwOd7CM0qaPnoV9t19cn1P+5KsJppObEnxsDNulRDICDtsJSNlIkbHMNGCm/n64JlcF5R0vE/vv02lD+Ja5jUjRq1Li09cQJIPsi/lhgNI7SllxtzC6UlOW2KhQPRdw7gWWG+Rc0f5yA7SfVXQP4EM/AQQllCjwGwlg7Os+JGhlUfg/bYvYXvvVKcc0qjM7nGS6/nqwl/frdVKXFARJ1S7mqflNZrqTZY6saE89QyT+N/eLpHmWhb8KYdQot/KkhWP40be1tYJelqpQ/OTz7oSg6ZK1t1hSze1G1mRisT0FT4E3H/lRnGmYhnubfZYRsaMPo70WsfsgrJvzpI7wG3WknaQ7Ubs0wkseyD5YnBdVfsbSEDfgR2eVm9GESiM5G4oKQQMbhVP4rQGpHlQ9XU/V+p0lrVTqkqle0B2tQ5vb2jwqbjneeQnCaorDPh/v21ADjIryl1Xeb71tLYdT1SpnC52CBGNqBIt6tDEjqpe0z/5qW7X87FhefaqVDx/Ennq2Ofz4GT1BhcSYR9e6BNj9quHIeZGkbH3X8tTckNknFSmdCa+gX61M7XO/YYrjNyT0DVUEx9ybsy7x3TvOTsWVjq1W6JimHRqQETDlmVLwpPsOfLcbJfCESsSimR8ycVhxtlXyz74Ttg/AzZrjkClq5XTfJzFKD6pO+jKAhDxJaEtc1NXVA68WgmeXvX4FxtlKaFVod+HoElsk+1+9yP8jPXATMAelkXD2GHZ+r6Hj+H0vLDdmZe9QkIs4KbR9Aszrg2PKndFWH9ErPaq/qdpPprnaUJwohoHMq370roz1d5nU7yrfUA1GAYMsLOcZL0xoqp7j0D2qoEW7AS6zOro7obg5ALGm2NGPkOq90DJKI5WjVTDtW9LBDZ9HREZVwHF50P7o7mq+BM/+xgM5NEHmrq1L/QgqUmL+zOapJ/pr+VtDdBShlWFRvQn/naBsgMbhN2ZK+BnNYVUTd5ie9ejR7bHNlUOE8dMYogZiJAWGOYg2u9Y/Lv0KSqhNqGzry6aa0eaif91gVYo3n2P16RgypCGh/DBiYYEUz+m3GuQGjWaqC4zjaKBzk41QN1OnrIY5FnLaoh1+jJbSyk0nZ4wFyWOboJImNuvwZ6A75tZDkGqxs0lRTHvP+xP3Q/p+JFYdlhOrGiagAG2YjZkzv+KGBaKfjHgFlcnBkVrwH2+lwAPZiJZ8QWW3KP9vkQxEc5hwDlC0heS5+SB1BaZBf60YZJfvtTq9oevCnKRdVGjZUWjx+lYYWtr1n9wA/JRPEdsmL3ghzSWTYjakhc8dKz2pfQyktXB4MbKWZrCQWPt/w39wjv7KKwpIfzkgNUXt3ewPEV2R1Ms7Ug+rbbQGEekne5kUm6ATc1OQ5Kzpf80KtU5SSIP9Mck90fItkyzB+Ph0SbFqjs8wS9+wO2ZXswSXFhIzu0McFAH0xha2RSuyaTogryOSDGC/GXmQCWuD5RsKj65ttOcaNly5A8ZH4x5LE+JX0nB/QsKIOhLelr20FfqcDmG2o84ZwdC/T9zFfMcKIrqz13m7muI02odGwbHjZS7oPePST9+yVOP7xZMjIVIdZwIC4khaWgL9gWFuZtW1BGJ5xkHakXVSzPcnOTrBQDTa9dLEh80YyW81wL2rItPcF1IXqkNtdzaLAyDx50y0cnk+c19FSWumuZRV1pb5Jc8PiOYsuE1dACS8XGIEPfrE9pCc7rFreq/5+OgucoWnTL7TCamolHn4W82vKprrAD3ZuQRItBhiEJYYmup8uFEeSnVywk+pWWQ2RVtW4EEN5mDNpHRMdV9LGd+4vVXYf1T+cMw+Lv0UtcBBvnkBV+qbojCShquN69UIZ84JoJkp5NPEALRRHkrUrgQ7/kJdQQUpNvgj4yFepTB6dJNdtBZIsgZ6oVnkFdXQjkxuHEcTY5QO5PfJQIAjnYSIdPR/KQ2opB08KaUagxgkat/mgVtqAlfR6LloDNyazWWMmAQUwRjqTEGq0iJSmyLUVAW9K8iwSxBzcRy9GRIDBB8uJqH4arqTaaNOmS9uxCtZfJgn0UZeVintF0/nQAX2aNLpV3xBsoY7GIo9i804vooDv9+onq9Sv+pHmNFataqZz7BrLETA9q7BYuLO+UnACRiWTLemEXiGel6pL6mvSzYj2fPXkgpTSZ6wn/kyA8FYbsivcJqT9dOg3zlge7JiKyY5zYIAB0DGGRRRC9yEnw8WW8jvXsaJmfFzXsOqG5DvCUvfpFIKvsspKkNlyBfIFqbaTVGoNaYRGO80CnIr/YrEMT9rWcmb2a6bEPU3a8xHULp6nC1hSnaJ1N4yRnzfIwlYy3mbWwZ/KZlUj9D/E9MaY3hRRO944/weTLS3/vD4OkUftM36GsXEJWf35X1pLLwfiID+/1o+TipsoIelssPXmj+fh3lJwKGghc1zrQWocPtehLZBplyMpWeVNSMVqg3iaVguVh5VLGA7IYYim6c1ASFNBbxt5PIKbE7u9CBKWHwLpVHEApsbfuJ2Z0iMNiUlDYQp0qfwY7wV9YnYvxIhTwqW+nSxVUPEEWfzrQfunguWKyI3wS3oiaUIediXT+sIW6NJUnCCyZwKodC/oi79qUc+cnrkLZo5al54kFU1aynlUaKa4c/kcmI7GBnfDX3HAHulg3zmruMQBMCNubgG/VWItzymkyvm4brlDaU+aMHer8YYJpQoauVTLHf6vk/ATT/l1D1BBI4cC6mU4qS+FlVhIKr0Mc0pIcxd7cKcrL6d3GWE25MZilU4/BEszST+lGihT0ec7UI2luS4Uby3AMPuTXIQ5pSY7ib3pyebwqYxj6T570bNASzecgy60XMVE5MtTFINGcxUoJ8Zic5Xwd0TMA+8ocxrqCbf/3Q6qiIrv6pnRcXYFOA7NByAapMML0vvergsso/PHsdLwzUKFhwnDn5z0XMeQ/331dc8TqMqJfprsLYAsTmZIVWbIC0s7K9Pz3PgW4XEfL1v6BiqjJ5VROPDQMoRc2LkRZ9Tl1cxytYOIZJ0tK+bpNcH9Xm/i7G2r2tuT2sU9dSQUkj/6OJKzdhJScip0H5utWw5reYPQ0Y40sfTFRf+X30yMOk/7cTbNlI1sK1ZiaKKyG2D1Eof3pH4Ifg1YdfuC5rv/w4n8OI6fFWapX+KFVGW9NclXawWFPK9DFBu8s1f7EimMA69eeG/6A01moRJGqKZ9yd2pEKgUy23ubWzA+TFs1ewv8wPj9cPtD7K/HeOH5n61mfGz8WBKWh3lefj9AvzYxaOJsMAv9aie9R6g769p/dvL6QBP8BmXqBnBGFP2gg7vhb+mbNw7Csc69O4dYHhN5nYbCftttcsTMftGfUEBP2NXaeUgL3DnHQ3IpEAh3H5PQPNbcLGYke9N0o4wzUPWPhCVbwE8wFGeg0V5FE1idFMXlbmLMLegU1iKiUCtyEsbM3mf3yzuMKovWIDzI+D2abiacBFIq3NWUpbOBPeISJV6Ip3Wfzsma1S/RWn0pld/7CwDLV7KWrZowK3KEI/uQd7+GVNSS/JNSFk7g9dTb1CakYV6cmLcMHHhKPj5dX6+SER/VWrfRH9iBxQ+NXdCWJ9SxOL9hz1rvtf9nIF1xG8N8CI1nWsbv0T1NT48SGMy6GTJDmcJBQjzkLwr727O6+oZsda17pXtSVeF6UuLBjXdChzJTrUo22FFsZ6mOffWyutHMAgGhz/7G1Ltu0qPs/M6Hkh8coZbRllfkygth3RuRsxJp9lef2YIYtHpVJQi8N4qE0DXRZfXYzhpZSPW/lrrswlMTiEdmy5LTgWPS9SIkElhdsVCz9BnVRFdH0gUT3pMfaF5KoXqNn8McsWsmCiVjSap4ZwcRzi5WQfwoFfPkDzjl3Du1M3/YUq3FqidZU5dMzCkOVDq90z2IDxTGseevE2IOWH5j75xo4kBc9geW1m0S4c71YOEZOONUs5UUxl6Nk2C6SPyh4Jo35EjOwoxjcds7cwWc96qLLAaOiRh6vF8fi5QheQEoQHrCtYZMXbrUoPb7RCQoi/Nk/i1Wzr9+mpbjtrO5eIslDFOZbff2wzSxj2LhBzLPnF2Mmj51ZdqFksCIytrU+q7h62z4t3KdaBRKsuoaFVvTPLxVt4AKqQ/S3fePVtFeDVqHM5qZAnj1zwatotf6X4lrmWWaoWgUQTt8ItsW//Aw/oft1WCmX2eTwUxaH8k9PYZ6B2pZez++2dF2dCshRqVhZsvVlVKWYOS3+17bsuGFp09hQdcK2bYN7HxilyDAqioE/TvbaKWB5qKDzp6CH13S+uDROQd5ocLLJjXp/6jxfpVd/Mu1BJaQfqIUOwOrQCpoDiTPL/uEIKXbZtF/9b8dxREhgmVihU8uKulZMWr5qAt/c95NzHtuHypaJqWIMutRn6+me2ve3u8XRM47b6KDb+1wG94KkcWK42jnTMjHR4tYJjovn6oL3cpKfVj3ZQz1kfieMsSwD+8jqDGqWawYfSlHhGe9CO1S6NERUhY7IKV/u73C/wI2pxbfYp09JcmYgyvqwq5meNi6xVLOyqb6XLFU/DSb+mZDqY4duHmmrH1qP5u/bNZObHyGM2+FqODDBIxZwXmSAMZ4vDMSrliEq19jPjfN6WYbBd5MgMzJHrswal/IC0O6p3AzJHPlm50IS75fHwthnaSqLLOCazqxJQIj4X3bVmROreIDV6RJN/BzN0zCBunXiqR+DOBmqsoT3DH4RbIOHbj++Cx3CR08Q79+/Q7QDK+EX66wSs0/zbMPf0oJBjshecKmTyXO3Xq/oY9HboLNxI/q3tDXdIeyuXB9Liac1wa85d8FlmrEJLfOqChL0yMXzVnlI54MfImSFBOzICgTuhN+uVVz+rzuVs7AkoSUPLZOKUleGEKOBQPdIDsDLZ4hE5lYoymMd4mjy0719wm05DBkkHk9GFIbYUul/gnSmBvXhE1rYn8klgrDekFxgzBZprlO58hqe9HO/ypfemp8Mu2MZ41xE6xIPw5Jjy0R12XnP7+VkMom77ZOI8TggnwM7a821nnokU8YPXah7LsjgsgqnornSqc+XK8qm5c2KelkPa1Zc7J/HeAYO4IFpRX0Yi3VXPguioNuZeedBLl7DRWIOYx3klT0VcJaoshMRCUwp2HjlQi6LsdnxQPhvcuSrWaVBsR2T4kgxT/DfjARNlMxdyy3JtvPni1P3Kmoo2zBc/6TWiG7/+F95/qnyPbrYHapsvlfygOn6vILl6xibiGh8FOZzUeyV9Y/ngwHxwOZRdbJJLnKn+8/hjt531rtJE1iljGLNuD6jc9IT6aB81qeTtpXsHU1Sup1C2SH4bRaa9xFf6tv6C8wRHAZtePDK+ZmfU5G7fX3ZhONR8IUWvUf9r8ssC4Rzgu0M8t33cYtDVQSvufdDxJrwVec1MsviOsRE9TbI9nAAeNXSXrc5a2b8qPM5GdFY6MLy4PMa9hQeRT1bZYCVA5Xyk6y8S6UnQh1b5JiXwjuuFKOrFN/p6xxzMDt1A2j4AnN/kGgOJK3tFfv+OH8M5JoIqgCjOZrWiIDiOJk5Xjn1o/ZO4/wuRvSbJbpftkGvJc3Kkvcxrw34lirR/Xwp6kajHEx5mQXpzJ8wImmVoynt7qaphxbkuEy1vb0f8ANjkXRox5b8zRbgsTn0CdsQ8V6L50ZSm09GI0j9QJynd+FtGjuhkdYqyqN4gs4St156favVF7I/RghDv1g2RH8jEyaOeL62554qm/ttd4yFRixZSQp5bhE5a2ImuhICKObeVht9qWA3rpHwnVcqfo2JWwYv6kf1YD8smd86ru1KPYyiakOENb79z3WE0t1un/6CMp358mSZLn23q+FbkybrOUzBLPdvAxOv+rnuAtipSDN6Db0pgJr+fBAU71l6ftI6IhiJssrse61p4+WsNxP3H0trYtvdJyjn55Tt+54fciPZ+tlp9XfBoWpm65Yf0nl+rcg6KXCoAzicXGAQo4ImSHeLTxMek2x+3L5k3o/wTnkLBKc/f7HKZr1k8RIJe8d0PGmhM9U8kzrrC66qePs4v/LgIqpkmnKl6Z3YTwNzv0Eer30bNaZF7DGanHN4iFJ2PuQmVIZqFdT2IuY33E0IUetEl/+uCj2Qc4P92YHmvEqbkc65N3oJQxVpPq9lzhWa3+khBVrldw93onYkP3HoGJ5VBq9ijiYk1ORRn60n3Bdlz71x/1R7yXRQfu0TilvV427h8v0GB0bh5j4WilP+oqGUDfnrQ+MupXrtoEQKYL6/BpKUKXD3UbHilMC4gZiClmyZSbMc373syo01oaKrmiN0WWB059MKYrftV0I8d1Hazfu5GT6MMQ16PKUs7LLMkejoGFKvheB5AOnIekjGwlr/f6ChbrDIMeEh/5puoeHBjSlASUCt2Vj4RrA5/RxYDsYZQdneouXQHINvq+ATkzOXRbVFO3N8onK60cBPl2RZf8J/Y/SiwJjbaduy0S4nmBKEuvQj/2lmWJt19J3+i/T7IVNNEbhLkeknEuLWKqRFI9SO2YuzC5NMKX43vIekawnukAPdiHI9QPSezEvhA4tbraYBq67SYv3a+AbTC7bIbQsHX9hfln7pzJFu5BtsjRbWQtZrxyvriV26UV/OsAV8IwSjTvW3gq+3+JsD9pvR74J1KEl5+/wpI8YDYwEmdYbMchtkUZFLM4PPG+4QhuRkPSWA+WFzjXQwc3/49RhMuy9rHgzHGrqtAn+5e85ZJ69Yit5r0vHugi/6JeWRH6C2sjzqoP8/estT7LeXjWkrJtOTP0Uzxoh52898FBKQrda3Ly5x0xebLB6RpuYuI81V/WRFVt+YecD1pb2kmX33ZymqXyfeDyFiCcAO3GKHZg429z1F3KyW5tl7T3ZZj6molj7qb1kKR2gqrx/p52bf3ikrWC4dHjUF/mvvMKzjJMRWisHGFsjiZUsAsKzg6rU6JC945//fb61in7vEbbFZUhqH0eV6bY/70zvrIsFC1W/w7FU09IdxyIkXHxq1tKKw7DVAxgAF9ePiY8q23G+fv3tGIuXEe/vNxzHgVmhF6NTkrwG147DoWlXizOlEH2A2xlw6ue65HUdJE5Yjc4gxaOB7xEpfNRTCe7hDNgYrjlPlMYN0q4MMLOEs2DmKl/zAj4fKs7v+RWbYL5R4xQR+rI4HNh+EjYDYXPtnJF+whYjWiThS0q54bWt7ekiFRvljyej5K69FLbuqm9AVZubKP3AkSBVZAupeQePPPXvwnId3XloCnJvsI/rJe/IBFvlb0tYC8sIT+yZsW3R0+gt66MnHgBUCEDEnxPB1TECN5dzUT+9EhFShf+4aVBtj4uOPPXdIN2y8jsWS+cOfaYDDxnM+vzADTQtIQCE7g61m/5ajdkKLkzGl4pKKN1DUCkvjFhY7fI4qk5xFz1ln1CvT/LXcAu/yca2OBnNudt2ZC6Ludz0IhpV8VYUKxVew/S63j13lv+EcJMad89IhNXRvoUJ98ypYilWx+xyphQ8x5PabMlv6M6TXKDN33nIeJiDEBTfG4N9QBlZBIW7Xl2nkOlGCnnhblrFLQR4JlQsgag5wfl5liJ6mlO7BRTf9UTHG81Vry5LiHhoDV0pTR/Xjrqmoj8z9ICtaYMES/edbI2Flgmneqsz7y4EB7brRiCiUf75+1cuXPyNzyffKVqH1+1DE4qAoqnwYWepvm6jDKYIxZY3N7nuPXSXRcVdTcWyzjnEDn5syTicfnH3HuKQ0vizmuaXiUDnB87zkQkE2RsCfvIsCvnURtXr4UWqOPPi7JkIiOnzqI9BDyujTGJpZG9J9j5muX+fWidlSclkRhsv5aennat/Jk82gDd4U5ljohVrYLaF9FydYh4aCyb1LnhLx2ZaqBXNjhML+me9tM3QhGAEXCbRN/X6EGOcn/iTUEy+lkrqQqir9KBEd9MvQ8W/GA3FUfFWNdUOAW2AmavotaZEtES8j3O/Xj998ldKNNrzmYruqsfanV9d/bl5V9m4vxpc7p3ljjJG9OVs7WA29wK6m3GZyYG+jR+IV1KxmHmVr6x0R8U93DFdRRjqHdQnx8Ojkqz3YA1+/hS0rBlVvBOVKIF93wC4fsdY6+UJc6oJjerGGO36TO16N3Ih69qDGp3COpqCY2KxZuH0Hgb6lGt9Gzbpn2IghDGRLkuJmVaWzj2reaDQfngv6ESEwVtAVYmIgKtW7wmR9K20XmVHSa6qosSmmL1dTIruM/um1mI0mMTs9TbZ2fWs6igF3X3ywEQf5kitHvxQLcFz3A21t2XYZAglfkuGtP9Hlu4OHPgMzY3+zKRGMOkL+gmvTR1vr2UDqeu50S3gDurDUtWADL46LUnhdJ9x4bErR3EDLqfV1SeY8rLIk+5dwOaaU5wjWPWE8qtqu3knHprS6WxO41nh3ro9P6EgWN1rpxSyZrQf8HLk6/A9u51QmydVcvkP9Pmhf87gLIY0pSgnTErE0tkCbTFFGoLVoZLwGdcMhVF3hcgXNQrxouq+kpw/WcHUDslt2Lxwx7+4cZmSkTi+UpzqkBXTQlx6dfqfrD5JrInZ/Har2J947qtQ5LhUTlf6c6bdS8jUJgMrXDkUBzF6hML6xNGVXxtUDy58givu9rLrUNpIGh8RyYn312Xvp5bt/GFlrCxYC++sUaCWYV1dDSZpSji7zCm0K9DOb+05nBfJheG5pv39IA9G1HKh7ZmiQO4mcZJoyPU+bb6lqt086dBaKNiiptp345wtDhkOpuw4QU6WY7jTOyfGfK0yhhuZxEj7xyIQjJFULpFZwbhviyoEodQOJeWsBcMGCKsyTwrgs+Y5WuDBTYeQy9sOMoJtaLaT9zOTTNXg24XzlkWOkFXzchI03nxYhs39q8Cp1NfBYgYyGrYPw3mXoVzZMB74VyKFpYiZP+dbBhgYx+cI97TWouoNk2DUxHgWPX3WlQ+GEqPiIRhep3t4gZIM+zjpgJKRCYy+cuAPsqzA1zjFuAhDGR+JNKN1BR0R0DNtiwKZsSqdSPN9AltYn18s1O4m+Qtn9B2xLonyAWRYvhUddlDcOFzK73ZVeyIGZB6g4loonhAgJLVH9cJxsn0cIZBAqfElOD9/Yuk3Ho5dUYaqB+DbHQd61mI3F50pBlla2+6Og4ogCacln9XApuQFgjFTE9P4t+/Qngiowe0oGJGPTKOA7tqpTSXgbVopl/ixeUyGsc/BeiOaapj7h0I1fxAEostJSoDrWX6iE/l8iECejB+k6hb6BAsTsd50toS1ydolpuuFsfzt6TkfYsPtTRRqSsupsTTmIReotC2k8p1xCquHSKdCakS4z32CjKM698h4W5Ay3dqYCwODTfAxInHeUsz7GePVILLejg0guKPhSuVXk9zTQ0N0wQae8UT95M1OxVEj+8rW6uYHwp54bQ6mWieK8bwpyWQ+ZG/WCKys1NPy5JKW2qWaIi6vMWDPftLFh3FqDSEcJxMWT5/2u9AGl7LZw2VsJFCnBbh3DQ8Yjy4gEqDb24Af/yc9M6T35qS4n/anB+y2LS7qVdRVWfgH3Zx2jIcM3qAjaoxjfN//VqDQ/4PHHmH/TmAiP2/P2CRgRLM2SFg80IfS2Sz4wwFPhSYI6hIMkxBibGLduvDAqHlSgOdyc+spxVUte1vb9tkh+yVcXxJbZ57OUuqL61vJmsWWJ4XFaSSNbPLaiJ+8BTvOROR1YX4Uk7+KvQ+A+5wQ34S9DY2SwD7e284A20vGO002l5KIpvfO63wcUQiNlRcJxk1Not1ACAD3jKULtTMrFcyNVRn7I7eAToMX7M1PbMQvWiWipQSOqwJYRTxJfFIgS4fH8zssVXmGHLYx7LSAfebJcV1/ED7xeCB2OPKWNREoeZK4U0aqfdVaDOH2sZUz5P6vPJzkpBdhhfQA29fNcNKlE+Fw9jkb1UBCNfssQN3Ignvot3nM8gIvRIFEWiUJjjlRkbquAijRTZJa8AKCenO3iVXGt6jU5I7ZQLn65tKp7JrnwkpLXyPscicUKZW7Z+WV6WxLfDa15ijsZnac493lhLpE1dkhZq0Xk+rMbkziWhc97LeWzKR7mBSMKv/4AnxjzDMja2G70fL9APT2uG7+HyaGpxdLh/33Oeuh0XGNkPrxBvX8XClXQrwggdfz2HeepQd2CHwBnRDjGESVZlwUJF5siFL3QJ15+WUwaETkPslPXiq16s6SXWtEsqhKFz2QtNkMWOqR0sLv5Ur5FU/vfH7cQaMzX6opemsEa/sig7xc0tu/F12DKoVEnNaVow6yo71WvQp/36xR27B0bNCaT+4dRlnQLPJUO9j3+dUqrMIbgqhmuUyViBKTvx35mA8puBOvYy9r+QGARf/giyO4kru96iLZfTGN+KsbOOQmJa/deKidwgF23b3CGRSszhf53Mn6tBtXm9fcVzWtz/xmGrNnKOLvJjyKQ90t+Nj1j4cp6eFQSm++2iuF7JQeDH2LlKRc2RORzCv7gmOZGg/ZuLTBXb871QN7V3Y6vGrJfsurU5JnhcUlbFx4iRRD0g3mQa0ArJYJCO4XZ2+3MVuoIIeRdmuem0wwHvwKyr+8Q6gDWuX0m0E8qJBjCenvflt6fKZ6sh2WqHxa1VS+akMYU08KLbO4T2D8zJ1Q58iuzz96FdDm4CUMygklOyN2LALXpcBHpsPiqw9bcEPfTQ03U93iG/5YUfjvzsnKdXoKWLvAhYO3jtRRgh6LJGiC+gxW7qynXTXTg89+cZ2I2A0uzMv6emNCRCT9hZlArg8EBNA7edhbZSlyt0f40qCDApF43sL3ByAeH2lUDyvxSoJQ7igJuxxw93yeBgPIBps2waMFXQAW3er37pP5sxjUrmSU5aOKSi2Vd3A4DdUdFNnkSgf/32C3X8R1lUpY5Eq3fp/EnJ5qLsUX0HAYIe5SIlWjvjNEOakYqhXBruu0kRCWa8ecXKxMTqJ3M38r3V+9O4ontarMEsDFF7+ZOvugDBO6y8tdoul3MqCPwkrqMidvQnxsxgeavewquqT9q57fAT88lscmql3t259+zrSaOrqNmLuIjOj4Ks9wiT8vUrQM0TRGjTRR2ReSNBfew8Mb6lKz0kvc1FCKPOITZmpLPM7GArGhqZPZQ/gYMd7C+Dhpkazy1LnCU/gOBCYVouwEhl7BDsHx8Z2XHYj8YD6Cx/HlIoMPya2OdG6W+pkn/LjZbqPHnUpr8voFlxOgdQC+1A8qcpkncUu2wnT/oMYT2KTfSNJp0H/BKDRvE1BHcY8eafdq5hpNltjgj89Yr7x2/yAyqcvWLayVPSfMVruu4cdDiH3f5BTfBSc/tJ0s3g+Wh3QDfPDHXwwVrrBAMrXwbS2fQkHpl45nfrJKs0YL3RWzZGIao270cjltrHQLZnJrGfe9YBNOS8FUqxl9uWMvXXfWAekuYgbBiOSaFO5Kkmg6cG2iTXAWBPMcgaJAJH+1Pj8xuc6NPNbiAI1Pqz6pEwNTmwVVf9bHGmxAFYk0uCyXhJ2e9ATR3DwrDpm2vQ0/+1a1jP2Y21ht2IYXdggFELP9YCRh05INUVDmoTA6enZiQq2X4dWcq6+p54uGAYeP9sEdbXK6kk6F13O4cw45jcieETsaPM6tupKxR4J7qNHfi5VO41JuqHkzBH9A6a2Odgzv90e3BThx4IfNT19emrh67KZhekyJOFFo6bPYlKzdUfvl8ffnt0032vW0wsc6FrPFiNQSpn2Ey5ZN+evOrAK2AVPxwOUER0iZ0mamH0ex92l+/chYgjxDEc59iw9UeJ4U/zxRrzKNkSr0SjsqRzj74Z8G0hDsBQnS39U9pt83pVroe/qxg5zlTP/+o6rIzxF9imwMiOURoCo4X1ire2gli40iUigISps+OZWRT4MVRO1sgq93tsdxGvBHx61HxcG6LSZZkb0go47yEUkSZoIN2obKaezs6ZE7S/7z1mG9ebY0Eh0gBC/4hNwPqSAhGv7l3QnB59OJHAnoo+VKCZmYXI84eGG4wj/Dh9ijgIwYEMGmyvMNVT3rgAPy46FFcO5R4NAhlaB/9QIaV4LpshoBtH+tydn8EozO2fgsuK/DVxcDWjQ4BBIaU9pnTn2MUxSILoyDfKyLNDPXPg4Lv6Yk89D3enR5mffotL5f6/zcBVF3Sq/mcVEONB5BvtPVqV2I8uzdWaqyobvOPjgKncj8RSFZfNLYtJDXsCTTz4JF+Wf2qApjht6TFXSddOIlSGbjwLFIdyjUVO1o2Q8gSC0umLwxtJoDjaWilcW//Mkk9sY3WCdzm/QpuKI5gtC3hzOQy2snARYJlM72AqqXWkzrDFAonF2cj7EzBp1JTztGtKJlZY2tcIQ79xpPRluJp3I9A8pXT6ouXs19Dijh4AD8UB7wuBf35D3ljCYhiRsojQkekfy7Oe6WkLT2SxMGMdLysIUcNUtlXQBmFPBUv1M7p081LKSQrZZ8POIdEQRmR4hMWZm2lDgfKSn0aRfgPMmgE5lQ/D8lu6/LIFJIKKTPPTBCjR1iM7WgoTK0tikdw42vefJXTtp+2c2znIuCsmLeFdg9lhgqCH9pvwWRuWQVoJi6A7t1LoMbrI8/zR/OZnj6nAyvwBdvHzx+fjlUE0MFLFJHHQ+XvR/c7P3thzHutDPVw8dUezq7yYbW0YiiKBDDdtUYNqmCTVl+n95Nj0+eliV8kx5lyCks6/9+myZIky49r1ncQyb1sSEoKWx57EZtp5CApx2+Uh3Nu9U3Pe80meAYp8kEx6SblAYJhD4k49tsIZtOGpC4gG0tW2xVgqjQ0k0d9Tad+a27DTWd2zxzznRQVPzPZcHVWfdYHQjukMGBHncDQ3B1XaEO9tSn04dSZAkbOcEK2NIYkHwmRDMb+Vbs/lScviR9Qetmg4XCivm9s9UepEj9FQ2nmS44by7OVVJIlg+pKAtMzS6G83u0q+TKsGtp/hWtFkVTxPIelZioGKlgYd1BZ2Bw7sjSkkxLcfyKO5SPAg5e0axZ9P4uq8zKm8FStMx9xZEBkZ4sNlTdv3DTS5omAiGfug0ugGj0R9pSjPfk9XhY0APjEN6DDjbAGNd9olAz5dgLKPbwlSDTnVVfJDwACvQlGfLMF4BFsRBwQceO4zzIbiuUoMc+fSIEDrpTUysoYUFMxEHzPae4SB7texpgeNx0ARio6SXYHN4ljJWDXVs6Nm5ss/fssOcRYMk6s0DBi13XYasK3tlYurBnGBwmzvfUut6idTRnJlIBGwRFy936sncyYdjwpKnzMn3KwWK+XJrvnXByFj72weUpdjmm18VNa1XW0c+KTPnrQfKf3S+plYCCoIr/I8Cs5St2sBYqEWVB40TZQdGfhJXaTPkT4lCRGRxqcBKUbZ21gHnZ1UqtPknS+DQunkq9E20zEZh30SSRlVKDshsOAHhyMSHartcXVjKoh9jmTmgoG5s4suiWh1TBIZBe7ZtfDS9tybjq1YIGCxz52JlE+TuT4pGcHFNoxbtZYlvb+ABXklrs5MN1hkWOovzu8tO0SA5NKzfRSGqn8/0ML1E7MrFIf/6KPEi/KdVWM1B8FnCqC6vhcLA1+A6a3lN0G4cIqj8fJoTQCrUW0o+CkIEB08zyObJiwNFEQXalIgIaoJIagbtGJjLQwBwhlq+1NbdBrXP7dr7CTklG95Pf+hnesg4BNkYXGx3iQDk0pP3GtJiHDxmxe9nzB+vIoecv/7QNsMNsMsfU0Pb36inhZ7Hoe6EbZdN5eVf9fCKhR25L/UgVlk2Jpbp6aGZk5uubHjVFvn1dGGOZY1PqqUgv6+HTokjOljF7VUhQeHJ+/k5Zf44z0d07xa1eaB3FazXhVbOlQxdujV0mgRp/SmETnnYpmstfPuQLuMuXhwMk/zwh5FWSzwSGRFsuD2L/2wONAXsyFvis9nRkvyEnQPdxogP+7nX9S2f8Z2bo40RwJDb4xj5ucn8gkZAIbLIHlr874G+ZAColqegm98npnl1ejqF210KOS8N05/qumpYfdjiQl4sT57UDEGPYdaUE8d3ATrs9CCNU/D/818xg4xu4CH6tCjyqEK04ctHvxfqWyzxeMYIloY4ccXkpo2QNdD2JsPEZpBh/LZUBW0+csOV7C/aRpfmWjQ7MenooW07z5U6msKnFad7iRHt1ywQu6mor3PBtK8w1c0+cgpink1pngDzAzk+obXnDnl9Sx0/Cajo1EcqOF4MIQG4CqUnernMr9sJmD7D3h+WxSG/Id0eor+ZODgBCszm9deXfDPaEvUHrnsRTjWIxbEjoVWOe8tIEREXEx4DKP5KHQ/nftRwh67eZoMWln1fQcfF3f6uxrRe++5QKm4KV3sFqM9h6jy8awQn6X/1LM84TEyNy0OYrwdm6b+bcFytvZik1s+yBegX3gRNBEpS9CGo7QX1jE7eS0fri3KENz3vau9em40bimDX7zpYnYtCCXc7R5J5gkLkrdZ1NloiyZ5PNhv71W3Mkqv9DLBi/+yqGJRpFapPllY2psZ0Xn++9suA5kf99k1VrKWARDLYmhvlmThYtH5t1a7h1N4b0REU6goVIZnVwiqnyJijgj9eKqViwySMB8AbvwIkBYiMjZdNSFTAgzcJcQEJfil5eB/BQ3NTAZFuBzfV1wwkZzP+DSjZmf73ydH7a6qQHvDFXAwStb+YeSk8SwwgRttE1+6lGo09v7qQHjIaVFXPrxWQOnKKHvTm+1Lb8doLJSminNpxcFUEciScKDDJ2bIzxl1iyQNEB6Zzt2oNpN+RJEV1iI35TIW8cyHAc2vH9HNM/f2Kjhl3JC1n8X+QbNt9hYDBB/40oe7PaKUt902N4gnyX/W1eC68G0lzeXFe5W4KVKxivbMf9yU6Oqbu5d4KDlPtfUehXPOruo3NGzL/6H0dvwr9/iPzn8D6Er/Nk1aRWvyyGlmdJP0HsyibCnqgGHWHk5EBtVe0d9r+MBhOPWe2u4jK9vh6+13m/1HhbYVvmjvB5w2twrVuWrkRCUWEyvWLYIZ1k+JJeUVAhEv425VfPBfyKy+iEmSdMvlu8YSngNEGnJoY3RvC1+IsemCz8cNjLR/zmuinrJVvLvdUSyCXFG76R3zVzT2wUkYpgYFexdcHAK0fJB4ydRyIcBC+1CMAh38gEp2H+Q1RviDIq04xQzNkyI0L/mWLYZSzBVC0spDyBHcAZ7QyIQ3lI8k2Sk49Sb+XfA6WcmHlDUbcIjrBhiX94geWDWs3PfftmhFWM+gm+5ECwHRH8SXqh9Nhg4trj+nAEOXPfLP74inhjH/K9b2MY1OY/0VSkDjZCj+me4VARTjY3uYQDPGrxrGPipfXG3Af6rN5gF0q9hxefwjX9t1pvMZxm4AD3nqCMJKvOmmak/D19RPHNup16Z5MzzIhQVujYKGr6O/AyY6SuxmDb5Kpk17QOXhDhXB2NvXRJ9pDWDCOdUq9Y2rAx+nvYtu+EXhseribg4Jt7sY8SjYuWnryhZm4U1JtoM4zBtoir6w2pSE7l1rdW9ppmu1ma9hnN/V6xsYQkLhRTHKO2/5CAktEPZr1A0ccD6yN27WuTTMq19T2dnIv28V6f+EuYIYCmqtGQDA9WGXIkfUnBg+4Y9jXxLQWXOZOmluZOIGxg/dIQgxT8Zo9lzPjqsOCA9hCILBV7dkQZ8C8xbCyzKVvEMmX81oqzMtK8yozXvKfrOsReZmRJvmV1HkqABBTQQqIdpjBP4xvE/69T2fc1r6KIfEo5pwRlG3cxOw3LY/9x/to9rY/r+/kTT/Ho9/Nhevz/+a2bjzxtjtff5/f29PN41Y7rbroMd8xi4Lv7so/XYRp/9+fxmqn9vdjl2/j4FbtKBLlyTyij8kQMLPA3sWdhvBIFy8wvGqyU3zSJM/xF03NmnNKMrCsfaYyN8i9CRSEJbVZMWu3ONstAWzlXWdC+ckG6oD3lwqTQBbsqF3TKpcod3cAX0ppuzxeTA13BVZZv9NirPNEnrkkv9D3XJi/0Izc5fac3bjV90lccSAeG6GDphKFzl9M7hsxXTWcME99IvxlKHC8HNsYH9U+sC6c0L6wPfMj+O+vKR/M/Wc+80dSsRt5n37NRPmf/m83Ev9TP6HreEU8sEn9rvMUxplL9B5vEv3LzxlnwT44PLCvaWL6yLPhFPLKY+GlRQpVVN1q7crJCEhd69PpJodAvr68UXOi8PhK6vztTkt7jcvHqSNGUv72+pKULtdeSYqGtx4j+Ri8e21THevJY0qLQz0zf6O8PH48/ScTlPXv2aYjxnlUR1TF+TeZzxYNt+JC82fovVurf83rPh9H/YLWLr33zoav3+BSOU0kv8UmPMdJj/N/g3C2MND79mN3E56pONer8BmDsTTzYhBZH4pDXNQrq5M5C7lQ2La2PmYU9kVlhqmK/zjysVe+LyiVXuOIUpNRiDfohXA5TR4zJet7Pg4uAg+Q454v+FJ3dPFnCKRpn78WlYXPJCMAv81CCYduX29Liw7U9BIpbMsQlgEinSWMcu4EuGNdPcybtkw+ygTswOQVVFAkj45ZdfctlEzP8FVHVQZXD20IdsMJNtw7qZWSgrfW2nH54TLrKwcdEIhCP39rX52bzK8OvdgvKhM83tUtp33k+VfuFQUeJCcpaESfZuckYOjmhf3UzmtKI+B5gvPOuuhhl4ZRGjEk95Y1kIJzrbdH31l/RyMRulyOZtT14OleWReVEKsqDvTnem7jFgStAbXPxlckIYbd4uHHqg/V+WY5BrngfZxjA2pgpktTGwvLDzGbqtCNIGZF3GByxSIAcCqJzTybxkM3mSZPQYiT9R6aBlMvXyLg3SzMdF1KOTRd5ekihQ+SFR+wd0KE/5aq/Wi7hzvPQTKxNCsLe0Td9MpKkn1/g7umvEKP/eqznSFiQRhTa47Fs6Lzw3dW+Ifg0NyIaedAcL1PIlJRAnUvis+IHCa4VlMxn1j6zbb/4MVH/fdmQ2xxHmQWW0e8laXhjGM+ojQ8svBVmDtJ9qnFJtvh7ruK1VxFv6CaTe06tj9+3oA94YvncuSz4R58EfFwH0zRkf567BU7N152NlUG7CFlBHRIbjUIrFKrnITRvXhSvoieAJViIF9jTevJZm2Xzon8POcw1pQ6/6mKY7Z2bknZVw6ZMreeUcqEaoQIPRcpCOE7uWk+RiCn89JCqQsoQHJFoH8C42+/ClUBa3vBOeM5pAAfq+b4XnL/3IoYT4kmsrofPFBhoqX0NPbFE/YdC4JuSt5vCFbWekHT6tG7uqoJ0h4kIT85tIOI1BpLIi+AU9p2YdIgi1UJi+GXEE5AFmXEgsi4t5nRrvJf/AgSbWm+MC+NjTJkjL1xslE7/JWKYY+R1BAtHIr9h3CDtcbcD/s0gXXNGATpnclWI95T7ieeHoQ7TL/8lwK9YkBXmVvNktkHi0gc0G3Jvo0IuWjNmmIjzdiAU5Q3DNmw/4gOTyMSYMNIbGgSAqwgl6ZdSSjDnaN+DsJTDTv8FdLvMJIJHWtAUd4KNfhlOXyJ6SDTqkkWCj4vSyezGg6BmPekUMwcr1ECVJvS6TzoGgfSeBLGdsymGNVtDnooJwx7PCiR3PAaeeOm8gkWUmKzpIqOKoOVlD+sGZWQRnXmaNnft2AyJ8KW/77/1TQkSnUH7GOoVJINHtjX6TnbuOpZnIE1/3SxIZQIE0jefPWtTC+sq1OkZ8YyrmrLvEtb2ZZQ8E5FAQ6jNJDH91CSLN4wcfcKsryhOdxiGYVjWcI+0mRTEOExf9w7hjd7BrV20TrI5GnN5HESbU/b0J0zkc0oaYYHEj54h7HntM3vNeiPgvkP4+aCKSSld4VA1gbPTgDYfWu48p6LbsKwuvfWn06/jM22KcfF4NpwSCVOSzeFyBFzOQ911cxvLOK4nWXoPkKZAp/QqftzNpfOEsTLCGXsad9fmJK7We8tbwpZnyLYXVbGrB4l+b7lt+wiXBE5LLtcbGUKvYMwi+3S8VkVnWsccnFPoud8Uwm0g7gn8WBiVitB9SJ8dM9BHqd9GnofyLnPkysoALUzlAOSvFsnNbBkcR7dhtCzgZ9s0TqEW4FntVru36PjPho6N6KPz48p4RyTF6VO6JIt+ziRLOAocyS8IT3DW9JwDdj+ouPCtQetH2xNVxB1E1LuGyhhv4fFy7CZnB0ykFgAiGooIebXhsWh2ZGOIMj5ENIRcAtOYuxWfDN17S6q2DtxhASPqT65SPKMJOBS4uhXoNGIVS2yHXnTArOCbYYKE3s7KHYziKbpSSnVmPUQcDBKIfl8FFlsBTeJkY/3MBsyfbQeEYa9Ixyads3m1OtcVtd2OwTPmTQxtRwtSAEBaNK10pPKp+4SawZydnHMhWGsVgdpf3yMt0xPVB51C3KhoILHJD78q8LlRoFZlB/aR5kd9hLls/PVU7jS3wa0LeJpVi4d3vPVs68TpKrAHamdclyDQJQlTVm670ueDaZ481jO7vDDuH9OZLHGIT25IjBPXiUsXyPjkk56Q4ulwY6s4+c1umhOL+QWvy2S1qEPPaS4ulf+DwhjFEF59TulXlzLDAELDJVdovA3BOclG6FBowUObi7QJx7QFCqNWcyQdRUidrzdTXZsCFSdyV0b6bORvE8l43H/bqxSmeUswiundKmGVgKBT1rBUCCawv4ScOlIQOlKkwq2GtkpI5bY8My0qtV4aKeL2VKM3RHy2HVUgunzku28JT0e7ltrNVB8zhbXa9ajsc1BuIJu+Kmkt/pWfIJ+W+Hh27GSwgDRQSpSkWiYQGQPHYeOX7H16bAAJIsAAqwlrdnM/yzyP9llURHXyS3BHqGee8rDYXbDf4G0dzNIELfGRgt9CF3jsFQ8TWU+Gp379jo1vp59UZOZ3uxjbaJMeNsDD5fXBX5pMeoyIJv61pY0FY1TfqzN6aFzRTvFJit8t0BnsV2Sq8nK9oINkjETaJhBvKJcG5TUE7aETrF9WDSL028o+Q5+NzsBx52i/8lBlVbQGHdUjST5kzqwtG43pn05tkglZZ4feKKMA4ITkaHuzPgVphWljlqbOxG/wAVw12QdgYz3zTwkfVKIE4fyMzhG13aw+ApQL7avsW4UmpYvL+2d+tdagHrCbdVpVDYZhGMZEdo6JyKBlzPQeEg7VGpUFbu73ZL9agYTWTW02b13hIWyLFmx4iWK+ku/QeQfAXdQAtxOOWc65WWgXfvRCMyZZqFWchaqSUGrNhRt5e3T9vfKkgrLnBHbJjuDMnRWqDzwQ71GBSKbDlVxfNhxRXCjRMx6wdYl+byK/cgkRYCXf72NdofB+1VWLnDHuWyhycEAO8yR7VIiHf8eAUeiILStzoumZL5CHXmAmGxJT8cDwkz44DR5iun3jhFjBtxw8OoYVA1a1xl7yV6vRD5p8Ae4U9JgXTummKmnE2hgUr4MqbqnRfdndiae0WNDsrodkWTgfNPt0dVdojziXvrgfBckKu54jWboiF/8m3y6K9hkHtNh9WESKW4hLIcrhOMRQZQR8MtXrN1H4GGqTg6ZW2WOq1KicudcWxiXAYpcqkrlu6Se7Mn6i94LlwOQAE360e7hHwItmjeoZUQNbtrlyMnAnPRXmkTltv7MNCnlNTD9ep7i/I3e4GqNLF3jFpKL50aUiEkLoBVgdQCdepqIGSnblU4cqC4R3wquxlkjip132CtlNMalMDzjjFsLQDK5gHDBbwI3tcPvkBUrZKycfSP0bSgVnwAFwy2HMlRkaLh8DiBa59auHtS4VmCFwj/JiVWqGwkYTYfmZjtPbEm5iqvIeOzaphW/mRnSVe8AZY0xuVhJa1HVDHsCLndNYAGZxfN+U0TOAf+p8WYHIx/tgCctEPlSDW3g0b/qR1G5DVn6nA73fWeja9dlOkHCRVftzsTb90roLqvgxgsTKjjGos0wGtCeB2Cf3qiReZngBCP3K2CbYUPpP7RGBYsXYvaXAcWZo+d06XW9hX9cmCIFIIsIYEhbodTZWV3+ZVRkAQn5wURL6TNo11MkwWoW6SX8JL90xiWQrvOcJSXvs0aEhq7kdxNvWYopbYeV+7C4D1PJAfATzqH5C3e3ZO4yMZNRGONYc8P3Ch9A4iJJCgpWZTaPNHw6KPbVLFTUrlCvov9iRXePl8yQ3pdNmvh+CMwfOjBvgluB7DhzOabiSatbkzzwxjdsZpGr9IzotfBO+Ge1evlXQ3mOiGlsDmzURB1ZoyMkoEZ4QnYKNNNKThmorM/hI7Z2y9rC3whzEypLb7oFf2Sh7TkOa3gyD0OVB/y6dkqobfz940lzZIy+8i5w/NjR+fitZU5AEhMRWMh/rYbvxDrZN8dVxy9e403aP16qdVGVdl/cq6/5qR05A47shh6TI7/oDd4NIkTCOBscH0LVwVkDjP+fb2u2GqQVH4nvTnYLyYPwdpFMnZkfP1C/RUN68zaO/Xp40Ox6a3jCK9ENqOpg8a4+NCPZO/YuXiiGfoO4kqAZgirtcq2gHT1PtAIZhGEYK51vv9B8zbeQGwMJYxclC/SgTQ1GR3tV8wGAcvTXdF7uBUurIb+6IYttHji8djLwTTbJb+UoabMKW7SOVjqWQJwwtXkSVcoBZxnZBVx75rvesllPIUIo5mHKKNAsZOEc3SAQPJU/CAeeTSdpfvXzvyvWo1e0cLx3GKFdNA+yf1kRUZ0l6OFvP7jBK9cv81tGftybVuqPESWzxerRLSW6nCML4vYwGwP4+ajHQShIsf8PQMgkaNCEDdrlhGVvqZqcMrx6hZjM4NfPhqsLu9PZiwOfsWK6zkoHdngEl2IJUCtbIou+LIBlXoKl/yywFNX3NT+M4mteDjkMDrbLxcCKqZ2ITTX+uTGmUNrok4/ahScATvbZbglyThJAYhgTNXBPvRSxbaXppM2SbVOgr8fycctPI+Mp3oF4hp1JSVsc/qP4i3Vv8ZpmVRGPR+5RO29tVeRACXyCQ8kv66iwcoPlysMVhIuS9gGfVLIVnn+wwL7amy9lKRQzqbkhGCJ8Bi8lCMmdaLMX+AS4Zdr4Wuo2rOy8LNgZKtKa87zaV5QeK60CXN5c7FfEEO1zB1ccF9U9RYrdvDE9jz3lYlWKC/xobufEXs30RaZAnVuxunnUTRod95NtY4MFQwMbJ6pEC6/S9zW/zzTFHUYTZK4Cbc2rCE9lKjNKdrpuO2p6YN8hznM/4lMcwZ4FAqEOp+sCcE8ikGaWW3mfC15VmIazC9CrS614glJwYzoemX96I33guAWZ8wj756dm2gc+13+DVEpm7kCSQCW4tGGJvIOEdNBGl1yIhJbRKx/aJRdPxx+q/2sX0DVceg2HBUhvTQdxkkYhodMC1AYjHlS6pW+hxJ0gzCG7qs4b7U+xw4ELQkfb6ZuZMYIKrc5QYqaOU/HOIXq47hY6Sj22BMulYFd+mHZlup04eRwLNiYD20FA5Nsr8WSnB32ytriRVZAlhRWF/5eAMWwfs3CoJ7oApaDY2cji9Z+Mw8dqAG2kX660W1NJRmRu7eJKQxIDvNWrErSiyF26Wk6VSBWGqg18Qgoyloojr4ADJq8kiuzAFJBhN172+9/T1mihyiGJR7CBnwa+9Rym3zQNRMQeeUi0KbOzS1wkPuZxCr64SZrHs5SLCfN/S+2zdoEkTgniyH6NpEossV7nBXhuJxZuOqlGdeDykPEFqpldIfDLYDkJ/D2A1UQxzYjCKvZzPd0st5y8ij13I6aSMnO1dKnmQW/9r4mnx6HL9vdaPn6s91mTu8mepbiQG3KYCT4dQZQ5k4dMrcH/W+qZTe6gv0mMHOlGHl8/+aHMsy0whvndvBQ3m8mLX4Z6Kfaq8Ho4XQNkIAkzTEJWuTEzPJ+8WL3tBko8T5SQi2jAMw7Ao+3ER2eCtrg5qkC9yXjhpIe1QD4z96kdVqkY9f16KMc/FpfkNXA3VSOtpx0yIz53AEf9onGxOFudAORXK82WHbGca6rbwIuiEe5Ar6dyDOkJL3LohWA/dhrbE9zWPSUyHjOgZMNLxalnHX/UETPjayZMeSL3YdmSZHIPCFoI1P+FdBZEME0Eelql8i/7hcVPUWdOVoQYRwSzQzuiAz6wnnF1LcvMif2V23PbIGGd7YFBcx3JcwA1qb7RAR16eGtrrog1D/MzSbXTQSdykPW0PDndbUCiAGNMJu7PA1hgNm0dK7Jhe4s3pdzj3qnL0XStlkgmP+0RCuZHppPswggqSw5Tny669p+jfDbvMVuSS2DkZcrpAfQPeSOh9YKCN/MsUm7EHaGympb8Ea2JbMGsQkpMgWk/FIVfrKYEfNkNOl2bfI4k0MfX5hJoUxp8eaaygnMlCsml66KkD+xXL8TBnSdjrNVAu4LJ26kpaKjmhEn3jTA8mA0K/D6BdIw2QXxI2xBnK1kI+TGl6pGGpGkqErF12IUz47iuhPnz7pIPMa9a7F1L/zhRrJWTiMEhwBD02PuZFx61ZjZiGzNoYHTYWKPVR2W3HdIHlVZ7jpBDpYNVj7za38PR01G+ShxkmK8DBVqSYksPkEuWo40130+ODYn13zCav6Ji/mWv6nWTe8Yq6gQeZ8OelGKUue9O1h+43ldBc3ax5TGJsF+Ji98lzeKPkkC0Dn1mPE9m4LThD2hxuqCAOaYyGzbVTVUfN2APkyZxme3Ij/zJpkJ6bRJOxLBspnH/veJizeGVPPoOnk5fL7GsA4yDzmqU0rH32hKMIYN0XiItkBTgI9/RnHMGbvSyl5Nd9nzyHa6Og6kH5OVNZRoVIAZ5OXnq6gnh0Y2r0dnPtaZiNqdGDIFQTXycWyG9SXYe+ePUXLWU5jv8Q6ev1d2reZcxprQmmvjOPxyjxiOSgglcaJbrCQFQ7ULz6Czh2SNe4C4pWtTiQRXjOGlzJ2Pk+4UBSQo9o4pLTc3h2/khAZSqjrZ8Z9RyereCcbCUeDLFRRU6xQGTEwh9zWmsuDatalzy86+L1JLdU3evXe4RzzKzN7z6fO0d/kgTRekCVfudMfXmATY0s5tXkWPTVGa6O533IdSvppVxijRJdOcgj65M2CflrBZaDf3aakiAgaVcWiTtIG1Fu0OLC7F1lFiZ04RarmIHlWN+zlbM6yU7C5qgXjbLv41dJXxcUrRpSphkq8DWHJCjC38+W/66AJsj5COXjoEFDj0EiR2iq/bTr0LSAtHyD86CFyAiIT8SvLKQB9qvwN/RIVIEHkhL64bbe3pYZe3DaRO2j7uh3X/O8QrRRE9fSD+JIDGIYhmEk93gdX0GSRdn10OZT6RNZGUZpIYyirZJ8SIpeqk+7pnef/VSBC1y6y4aQ4jrOgDLODAf8lOD1hJAn9rO9Q/GC0E6Vl8VomfeTimaHjrhgOEDPKglktYPhJ+JbNeMkvE2nh1slnTmB81rN48rwuSzjmj5y9gscH6y/cLHmNRJUTTPmN+5XUpUUnVhLRH4JS5oI23Zwyq6an5+9uTrGIXJtgyvNwHln1LOUM09n/vBmBNZo435zT6HqrFJYElq7ff69IyQfF/yEsgxlSPBcv/2jCeV99kyVVREemKox2aq+7cNqFYRQs7mq/N+P/NqPQmcwu1rlHmRRQuEE7RaKkkebrcauHnzO/yEyAjvFuzph10gmv5/M2tlLQ1IYUijYYgSmkt+Qz2zRilF+n+ZWbDwMF8SxEbQXMGl6CYj+b9/IOPT6RXrCToFAeJUifq0rGG+dl/qtQvW1wKnDwHH5xaTHsXTieAszoR5XUQAI85tYwtjYomekKt8+SA/1TnqOYHTNtZVm+FjrnBdaEN8OTCpdy9tpM6B8K/W02v7RiQYNWAZANs1f86vxepKox/SpHuftkGiExH0Cbjd3aVwu+kfjdJ8Mnl6UnHtCLKtsZnD6t616noJ8VRRXhcQC5CfP+G0D4I1yNx07Q/wZP4KhG2xBgHVzWfJ6b9HFNq0cLf/iJ+HoJm3QuDwmfi53/bC2JmHYdm/34Cc0tSkYehrCoODFc4CVVR6dzWWeReSSbdQCgaHK0qtEWh0OfvMnbxX3dZIly8SNjCATJdQ2y805FT3YlpsHqUdqln5IYTdMgeZTwrBa03yi3xF4N6gaHNBySRtB9FogFAIgt+I+gqR5uDcVReRF0WddYZT43nr7rR3rXlWoXwjdAYhQngOipHX4hPZ5W1OBvIj+EkqmSSFBx+z6h7vX+mzO06rirKVAo16+uO89ja4gDt+2YR3gAsYXs0UXNeVqBuZazfnE3vItqLPPcPCBLNZCpQ3Jj/1EtIDaB8tdN6N5uBoy3pzM8phrHThLC7rkiQdn4yy+BsY8c8cTz9szU3mucpF5pdVPtnOMPg6SzJIe2XAD8OUai1/C2cdbrh69lYFDHDhYIzkutvF7UcabnhaJj9+qcmujCLXCgGFvyv/EDEbUbipwPKBbFQuoOLBXIJzvWE/D7mO/QE8QTfi86IKV+gI6l934FBJxgAJeOS20Mxc6N59Df+EoQujzRXkGeXOaIZQW10aCfdxKHFcAytOiYXDP6U6WTQV1/bb4HVKQ9rHRKjnnifwZwW1JNJ/VDshlWvNR4JCrQGEywxXNuli3HD4kZATCaHW+Y0bGYj3uEDkaqgmWiiVnGJcR7+JqNaUs4MdbvmrDP4ZhGIaRuawv+NZ0L2bIgMgp1M18pB+l76wCU0cT2uISWAIsYTwtkP2DxG2ZGGEFtpy74ynTJwNsaHMHaRz8yrb7TAvKlLgxyjKhonKLN7I35PpzHdIFt9Pb7SilpFkew0If/36sjU425R5eNgmyaQxuQEWtE4A904t7Z1VtSeAChPlB3lgJdcDfrQ4LRnBgh9uQf9k8IbXMQT386tmO6qR+Wolwg84yfJvlzpu9k2yO8IYkIBhqHB6f7mfA8gmOXKrSPQ5ctPZEMZOfDKgdnP88s/ODp1u4klSsLFU6YaDeYKt0Z9HIvZJ/M5UIyWI366vHQkFzv688jIsuukz/qm6Puawv2DeyarR48XSf9cLAR3T4BUU5iraGOjEVqzCcnmK9zEUl0/o50DTvNFFt0J0ST0ypuZjTEn7VeM1vvqXfDR83Rzx5jAstQmHAiV/Ayq8ZGUm5tKKkeC5GqHBZbWBmpN310/a5G4CJd+3pxK9PKI7rWQep5NEYknQMuc6YNJmeWeuKMISLW+rBS1veKsJVAFYJ+FoyM+u+uKHDgCRoFkqvuiXukz87FDL+nQpN57NOAf1cgbEj2eS8Ktkc7DLk0H8zkQ2NR51DNKLsMUPhZvQBgzOCftsumKVES3XvmQyjS8EJ8WgCmk7TC5EizZOPEN0H3y20+uDjiRajETh1BG1N92Iwu3xPQHs/gOwLIk7x/vfFVg0g0T1eUvHD5cVkK2ry+v7COcYmNa0KL7ihJXnRAX0gKkSBgGs3l33Lwh8NuhZG2Z8LHTUwIr8KhANpq5dM4D4SkZccSEnBudtin+OPsUaFOjS+BjnB9vLXHQuXZkZ2tGNdI2y0T2OCHkDwK0csjvjk6ssYuX8qfx4A9s1VUUcUSlp1R6OwUuqFCd0jjBwGYmZreoEBSXcI7CG/pmS7lfHdxcA+CEif7FQGaUTF+MacV/0FKpVn2kzKksCqz1hGn2GFtn2zEKZ1DysvY3GaO9FrPRXVP2Mk32PQhVo2XKaEviQ9HQpkoHe3mH04hwyIHJU9QbnyNEi5BmBYpDSb7PUXp6K3j56+UavfNEZU30aNzTNxfviDCXhWAvPUTnp4q+qIsq6VG/mpTbft1gmimj5neDAl9w3axgtod8ikNSp6dJCOItggeImmvJ0FN/g6dIqa8DvAyDs/NeWXQYnnf6InBlnat2+RWEseFg2yYifXbBxHjMQ6sQaxrxKJ79eJ1Rq1CsN15sTj7RoqqVn9Nm43GcBxr3IYlluE2pDUANwsLP7KU4RJgdnW3WtVnoX7QbojSVWFOFoFnJhudrluIs/v40mBPILBTnZOT8OIhH/qcrWhEpOtTzcZPqTPe5uEdupQgSkWGI1kdq8NRDoMwzAcdkvluDWz0r0avAOEnaxlbNLkY3ThHtO/Ev46/M2dhUQhxcfW+67YAX4kmQn26Cb7X3b2JWbSqAG3vSCmjhRWNaEFD3Avzvy63G63L4rezE+q5ZWA4aJp+a/Ab3WNzhplTsFtQpvwUAArEkjFsg9o5mW2bGfnJUV7lGqo1YXXbrvtrJ94aBZSwcdSMBBHO5Y0xaRIGW04P1iPjiNWju1Su6i/N6cB2D68osavAYnLcdpRTUrAZMiyMQFRAjOb2QFNVEYcFKJOebRLq0KIBr0IRF4wUAY6ZFYUPkGDScwUdPwF6s/fVY9tL6q/FVz0nXbfgXM8lhJszx62ViHsKhfFhlaIBox4oRz0TF3q2hfl3M62T9sYAKifumUPs2lFoilMfZLZCqW1CYuCJ0S/z32uSsxigsHkW9cfki+hdv89kL3M1psZZcsaxYrkXeML7j3ZMQWBgENOqVOPeWa+h3V5pXk2IaNp3kNSScErXd+U1yP14wyj1A7NnTsgWE3zx0Q/Fj+t7DR4FNhxkx9ZCORKbMDbjWy4uLmZwEQVAAGuek0KyXUpYzC95Uxy5cPM8uPpt+pzYIWAE2NIpojD4W4TXAFhtgwUApKxJd419A8XIfQHf22g4VZo0wx9dYmaEXonG5EJUBGrqAygP4CKQy3hUsMUhpiT3A1MUF+s8xoZTogFxyMU4nIgEw8IPCkcKaQSfVkLJeqP11cc5ax+URYyJYNBlPEj0YdwpIiIF4gVo9Tmpb78Ssz2EJTT36Y8hxksc0RQyVkRGladAGF/WH7KnH/dirnj2uz33DQjPZSV7asexSp7R3qgIzPZIE5rXUVx+9paP+JxCkQjEPRUrZrZO4h0WQKJVXZQgtfonu9PM1nBvMGEXy6MkKeQ/rS30tdGtTwJnNnKmeNJum5z48h3ltH3I7OIhkB5n4QcM/pyrFrTFltaDaAVlrg8VbelqjhIAW27TiwWO7juwo1lZyfvlMKJvLCCrNv7TWoFNeUh4b/KRSXjUNO7P62uK1afnJpkk1tUMvao4Ex95GNO1eM6OrpOalSmaExHue/TmYEHOEuEc4pL8qQUg3dL8K7s98uDnBDUL8/HVUtND7vAkZlCfUrnq69A5S0LV4EwN0U3P7m+VtK87OBtIBUvzGIVy26GOM1jO/G9akzBWgzttT2aJmlhHm9dI9O/bQVMYrbhmWYtieTVEabKZfpeY7/gcSjhCWyXXNCo16lw4VqqRPB/yBxvaGEd+8wt4cPWR4LP2gw0nBNOVYAsfKL37evmSzqJWwEgs8zpEljpqu9fwaCyivwceT+NmWF68ZEfHlY5tAJ49nlFHroiYM4HUeWux+/ZXBriDZxI97EdTUxk7xzaoDz4PX5cKGCpbWUVUabajTVnVvJ7Jj+QtVPdltKTys5f48fLd09UDC9MFnj78Nrp2drhY/VgHJG9WAIvFPax43adE8r2+YYfH5UqBV1CIkpnuiAcCPSuAGpXWgm5/xqBbOU2yX3sUI8GhTbsVQMU+n/t9N/8f8dsGBtkeSZICZU/yMIIYkLlFtl6JnBA5RlZZwRNsLEsVf43uXAr2SpHL/prtMbStRNN8e1gk4Xj2pdrLCxKf3yQio0vzvLBT8M10vK+1HgTxatr63zxqLvGmWXp2Oc5LZYurPLTd/01BmNp552m+Mc3m6RVXdteI1uUHp1KxZWds7x5NVwjlh9Kc79F8e7GOteedNdYW5ZO/Wt2RW1rlUd/66/RGUu3/tIUR+5scuZ+7ck1lhalDx+lYuvKWT77Zbjm7+3MSEri1N3ggQdrR7pEqNxQRk4SzuKPlWXux8Fw3qd5jaXj8mty7tzqvIXI/fWPPvnrg3Xc6o25e1905/1fEx/9tEx++WpzXppDrjWtPSStN6t4Nlrk3lzrz3svxZVHY7Jy6ey8M03uxA9DcuKzTWw0y59yly7Wfjrvj4hfvlskX26tzxuk3INnXfLgnbP4n41lbuab4fz7f0+PnLzy70C/RbHTJLNYW+PFjZTsrQ3R2i40edDp4sTdj5UA/Iq1Su6/L0GveXpQesT99PiWzU5TMrG25sWNVOqtDWltF1oadbqcuJu5lCz1Obgi30zZto/4NaUaglnbpN2N80ttGJL9lhc1Hefv/HoWkfe/HJuWf23YquFXhRYX/xdbNrl8+5+YVZu3nzjaFM7DlC5q0a6T7rK+6r7Uj/3bXcNVd6Af+HXDr3tc91d/bWz6af/XwnTbvw1ZDj/sH6Xw/69i227ffitKbIRdzygzuTUtOVrFEG0ffrf04+030r+RNpOZhLd3hJANIOYCCGaCkIyChNnD3Cvaf3IwcNEBq++bLb4vW/s4f8fXtV5rP99fDB/Oi9VoMtZ2vyRQLdJ8Q172lCRHy5k4K2TQJAfGU7//Ntn0mbI0Xuz2KcvbvkbPdW/bDCz1fqWgsU8d/K6GXmxgTyqpbxApvsiYdhD936fc+5+D7n9BNv7XG//0bX99BhgdkP2/uNtQycnGPnK3FGbfaFwrFaX3B7y+dgrGooVXVzDlHW2tiTcpoKCJHaISxZIHyr1/w8+Xdk4SOuxJRuaByCxxQmNsSYnOuCVV5JnvNIn1LA1dYm/yh7zixZqG9Qo1ABQS2se9CltSgHOIVoW0Z+aCfj63E1x+oMPSJbhQv/jQEC4w2qB3Vgj9/3hPNEFReSS3ZpXYh0SJiTm0Si+OdsWW1NBWLkhKlwEggUkgAQJfvB4FXH2ZmR7XpJE+c0Oa6I0DyRiUuw+oMx+yjEmn9uou2kRbh28jH/jp+SQxuKx5rpkfeziOXKbdZ+vQRL78by0ZnlRK7XJGtBlqibHAVg4B0x55AXEPakQ+QoQKzyYxCEStUDupy6fGhXxPmArkM4gha8twgXwN4RSe9sgJIhaYAsYzFLGMaUAeINaZjrsb5G8Q3uC5l+JQG6IxqBPGTwhmOCbkC4iHrHXwyLuKkKjTp2cptXFGtBH1G+MBW7EJ0xNyroiNojrkmomQ8TxKDGKIeg91g/EFu1QkmM6Q1xWxVW0dLpBvMuH28FQgR0bEF5gWGH+jiHWY7pC7LALaefiDfJcJ38NzksLgDdH0UF8x/oVgD8cGeZsRO9M6zJGvMkJKeBokbXtDtCXUf8B4gnM5TJg+kZcZcW+oS+T7TIRTeK70DCDqgHoldbmaczlUmA7IK0UMUeuwQN4rwgU8PSEriNhiEoxlpoj1mNbIvSLWUTsPH5G/KuFHeL6WwhAKohmhvmOcMsEDHOfI54p4iFqHgHypCOm0qrNN7cIQbYd6hPE724oVmF6QR0Vs9qg18qRE2OH5j8TgIOoC6hbja7ZLRwmm38gbRWz32jpcId8q4Qp4OkNuFBFPYLrA+E9WxBKmG+R25tKlRDsP98gHI3yC50YKgzNEk6A+Y3zPBCs4euRiiF2vdWiRvxhCJni6k7RVQ7QT1F8YjzLnckiY/iIvDHHfo54jH40Ir/B8LDGIIuoB6kor40J+EqYT5DNDDKW2DJfI14ZwAzx9IidDxANMLcZfmSI2YnpAHgyxLum4e0b+ZoSv4HknxaExRFNB/cL4lQk+wfES+cIQD6U9B5B3CEHH9CPFoTVEC6phNFXE9pgyckZsAirIFSLA86PEIBlRZ6g9xlFdyM+EqUReI7ZBW4Yr5BsIl+HpgBwQscIUMVZKEVNMHXKHS7dc0c7Dd+Q7CK/wPJfC4BXRKNQR4x8lKHAMyFuI3ah1iMhXEGLwtJa07WZEa1ArjMfKuRwGTBPyEuJ+RE3I9xBhhudTiYEZUUfUa6nLL+ZCvhOmb+RVRgydtgznyPuMcBFPL8gqImZMDuOpUsQGTBvkPiPWnY47j/w1E34Pz7dSHMKMaPZQ/2D8UIIXOC6QzzPiodM61MiXGSE9hYqU2mSItod6jPFHbcUqTK/IY0ZsCtQGecpE2MPzh8TgFFGXUHcY39QuHSeY/gF5kxHbQluHW+TbTLgSnn4jNxkRT2FaYpypAeTqceHSRSo0L+SRaSO0JWpsN8acluWdSplTD+1HN91ektWQI9omqstfape6LFvaJqpo94p8MCe5oG0yb9LOs5fyU5ZnsyGeWbU3U+7L8svcBmbKCfOa87KsrjNmaJeGvDGHtKxVTNUeVJmV5Yupcsl8svm/BDNDOgpXoiGFuduSptqWrWin1y6JdJ0qd1JqWruGlGsl7tJ1MLBLMcXOKTdSQu7yXaLVQRGNOrtLbFPdKLdSwj6UbiCNtdLfyl0waJd6oRPsRUNTs3sjWe2Cc9GCPnfJS1+bJpKiZUuKkDkQSo8XkrJEoUGDE1TWtBqTVMYirghbvNBuw5ZRyOhxc14rpOyR/e//oYXG5YHC6GzCQxOGMPpQIIVtKCJTv0vuOyz5Oq9LLdjLz81CJ/v1a1N2n50ySUOS32WX3KFb8YvaS4QaUc9M2dz1Gch7p35vnb0jcZIu2SmcTmz/ybbGz8rxcnMHn265wk/vQHx1zsMUlc1ioEzLtp7a56Hy1UUPlO1yKM6G7Tkph1u6hfXiNs34uv44Tr329eF/D78tGt7SfTq5uOlPls2LlPGi3XZ7yu66KLuyqafyoWqr/+2HY6yI/w/paFi3D/qR++r16k0/px8Wja3766J754txef94aIoU1eb69Xgo9h+Dts7Px8cw33ZP8Wdo8j/xo29Nf1VsV/svLS+zdR/u9c88nvp/zpPq6yKGi8Vj+dczh835mG5e5jvl3i0on4tmfJRISyP0zHjUzzl5UsApJvEFg1YkXJsibyJenmeErNhw+p2wuayTw+8Vc8KsBrYjRbl824FU3uoL5PnlrNHkZ8SwIxTBElUR/GuftGNjd69gw4xSILX+3lJ1s64HupKJ6shplL/qJXOfWe1vq5iFUw8QSClxcyk+8ZtLwZtzInHChK5cTerXsZQGK2ypSF4Y2qo8EsFgPMWL/OuWsgdjOl2RZKSsypUGj2a+lmvQnHFmwPc4eXqz4PUS+QBx5GuBB6eR0vG8tzvOdxg09vESwNwWFcx45NSVPi65A38/XzEKQ9sRg6NuHl3BLk/I+Ao380DLb4KEa72ky+73rvOUmr9+iVQF7prvsMEVK3A7/IgY2XP9PFqhSftKMybovOr5wIP3f8aaycvd99aU7x4Jmt+Q2o1duEKEs8XwVgc+trFc/k7MFpEAlVD9HO5virqb+hQJcbsJj4KXWkWZZ2f/eTdm+hLKwyvGMInxWWqjh1FNahvQsVjKGx5X+Rq2c1b5IIweWba69nVhmn/vkShapZLc9YqjmTxwV30RvDfF2VK66UbANpBfNEueRrR5w7CT4/bx/8L/Bxv3T1e3n/j2DXcom8VAo43ipWnb6PlW/AZ12/yWYJr7WgfvKpwr1FXecgrnn688f6mloxPhpA66m5X2caLGKwt9MvdvTdWu/Ua4PZ54qmI41IZtuSdcsiH8oWTk8l9EftumtR1FVTsfWRmDy5zfN3Y99zvFt190nm8kzCOpiySYepOfiqIzHGV4f/g68d3XGh7dUzIrIs0PW/26Z4XKyUij+8zSXrz39IuIexYxniIzcFWBK7NqFk2LrQBx962g3qCToj1fN71hInwGPBPfWFliTeVAeWKQxUX1FnMLs9ZZieDarGjOxVF6TDMK2eiqGKncOniRn7YXh7lpaniaC+/yZ3JELT3g3s6galbMyXT5xysl85gIWzD4FdXlsqeLVCu4UUVtdaYfANof9wR7/4iRkRJ6l6nLK3dZceAOBVNVIshb6WHs0s02vGUjf78iQbabMEPxviMGPqVOiHYZUe06vkquoJyJhpKPhslqsXl3pdQVG4qp6nFGv1Du6zPsOiefKuumJp1p8jYxtLlqANKQ14/4lkQWUAq60vfOrDq5JJOY61nfFn3kb2UUZ9Nnqn/HHzZ4VlRTRHT1umnxw6U+wuC9nRNBstRSvQVkFzpY/TLaeGAbRz16GXs3SMdDTE5irmRVG59ikDwCnsA8KoklyWvrzxODHFUWtmnsmL+pLL/Um9wWFvntnmnFq5AsavUg6VTXeDn7UHiy9W5D6tJGzGbklbvL3zS0K0SRbCK+KSoMsyx5LnOl0btNf8oMbVlPh3EEMxONXlt8ScNg7dpNDbvc7qZPBOW4UbuesmD3AHgMnQLFEcm/Da5P/R4AnqXVWAxYPx/MeN5xFM5y4eL0WW3uDW5bug+uO7Fz5eTp2+LfsRuB39vSD3bzhwfOmHVm5/f7v2UQ8rUU+Nc++pp0D3d/thuStsubBHiyRKCD1cWv51tdrclfCPV7gLcrNjfahLbbM1tztdVfK7m4pu2RMro6jkfrrrYgm8h4sHmU/dAmx4yObIlebGteBTNfWeG2r9CIIpC15Lvw+P067J286cgv3S1eANltj6ttlgXrGUF9uzK1cJlNZAmKeWkP6yB85lWnQPB7182NWq8g8GKFHRcBSEq4kWw5JAztlX5vjfUp3DIcu9TYIL1tWUHAkhqvtoxNYNeze1bOZVVsfaIN3vu5iZHqAyKoTPveoxxBw+ewqwOBpp/YHREkT718sFbvGbx7J7UBwZ1gw9CgflrRh53g8hds9ds37oBv2ZOB/WAA0tKtVB47I3vJqeO2TD2VfCAub2VC4d92aoKjoa0onroXXLn+fClX2Jsvh/pgOPj/GWhP76Q+YcnV61myjMILJW9o/bGrhMObG698aN6GubLmgo3dclp2bsbWHT08rZcrYffEjwKbQVJSxqLzwCa6OqVyucsU2MgiCc2s5P1HQWbzCK9Cr0kCy9/46gtY9ta5bDFhVivubqggtzz07Vu+EEC16z9gJi8eVKyHL1UoU4NLahPv78HqURz+9DcTl3mya6cC+eD17trGuOa0qpPIBIfFfrq2MY467ae/M42Q0EkHH9ZmswA8wTjs227T3jWXtdU3vJylwVOoyAybc6Rfn2If3flSa4CKol6vHuJWkKr1X2EJeP2j2foo+8rt2Zs21xRn60SjT+FjmVBbJLPE1DrzWzR4cOMhsTQqD9Sh34rlpc7PXt1xZ9FdHb0vP1jf/EXbMJb7FUPcOq/BLJv0jqhN1/CvrnbCnscU92sVDSXO0wuEmeHg2YjiKg+p9Jia562X9VhMHI6UPQK68OHjj5+zWIUagauwdApHanTurP62zWn7o93XSWYeTOngDu3ahFmyszLksAp4j7gb6O6RfpaZ2RVFSr4wowzSP82IIfwUhfw5rCA7K2xhNJCO/qBZsBWPlds0SKi7fHGkj2L5++3Vv7On6P50ZztOKqoI+GEquGEwc6pfLYjRX1aItGtD3hJbeUM83PB9gigG08bileigAVFmkcOkvQ10AwxZJwTFXpQ/ZCAKWpt5ECvHeOTt5oeu/Ge36D3anPQ65MqSF5D3vnQcoiIDzi7fclLx17HwT1A2Ht1zUZxJct1VE097TmfmthWx2q1ec8LYMZo/rrrn+LnIbURsDmcvDTn71ao1DWuNOOeLl1lFengAkSrO/6nZf+y9OsL+6ozTuad4pSHtPD1/Bv23vguYzMGIxK0vhnhuJULZY8ONvOr52useKOoeQLQSn0O/PYK9DejPOBjO7i7z9X9ChBOJ0JRLhOviII3ex2m4ju7gamVe9hm/H2S/2M2KTudBG1BE1TXnc8Og3MauoGwY6a4h+HFRsf41O/OJ8yZN8vPmz5q893SyuV97GJb8swue/u1XZ98/Ia3cVNsV5q8iTYl7OYFryvdZ+M5XJWF3BHqVi7zO3BYD/0vWJRo0gkYaZbMwrf3Z+K89LSZnw3QreA3mXgh+sPDrfGryXRbo31vzg17RlJHKZFq5jlz9VvRXYZ/9p5R/r2jE9zbvN0wyQszq8Jl78VdHtTX5jhfkaTwK7J5jy5qq9W1gag0BQFhkU1d83Rtc1CTSHtOEQAjkwrQSGGu5jeli+i+5bQSO/CxM1I9uAit5/d/Ku+FeQu/HS45jaR3+U7ew+/+LVbIePUgGTbL1wbkdpzv5NhYqOalPMBZ4s5UT+Hyy06pX2Ei8SD6PqXc6htUF7hgFI3Hkd00Cji9iXTN3uanvWs7fjppu13p6HDLSskmCkte1c8iHHdqXyTFJdUaFYad33FHvB/RRl1rhL0i0ul8mx13pbtp6DGUjR7O2976MNjlIt/GnqHtg0/hpQF++NNonbMMhZkqR+e2kcS+y+W1XCxzNq8+jVUV+6zbU3wuUNJhBPLsYlJN1qfbaPVLt41mcM+NQ3nhSPA+adlTxVrefVT3336v+PO4zaxY1p1YstvWrDNUGkpuGcV1lcgTW0uh8YyWeFdvvbfPL0zbZJNjUl5xIJEqVK1TWk14Ak4uehIMFGfXI1pXPMdE4DULHkGgp8E35K4nhoeVDchyU14XIiXFfKbZKOVhKzqdeq6ra0pSyhf9UPh/+lqU2GHiHFPTyVJd8Xxha/mDDMhSmyjf8zylmQOn8M1dmqxQeriy+CS+Fzn/Qg3rktxvqdXM9NOzvE44xzZ4X82IKrfNdIPf58AhdWVwkjODg7X1oBT1Rp0sTDlScuW9Ljd9W/7HxYUVlflD1kbtgfin/rJC7dPN6MXMZwHgaoLCO5F0nq27TppE1I98rB35pflB2PwstKthamO2MuNjh5tudXkmkja18pznKPI3wd3h3dy7REXkc5a/2nRhSa5v+Zn1n92PonnVQjTiRc/km55NBNfrJn6spzq/7+dLnkpORizcE5Vkdb7Bv01y7WV8rUewq03ZRaXLNMyI0HPHor7RfSFZBqcLJ8EHleQgVZOQmsJ4Ir0zqQqjTLbSrKs2p+w9GYfJBPVyCn4PgAIsAkPbJYJ+rpheL7kX1xmtsDemHYuOCHoNZMYaznKKJbTOd+vvdaop7Wv39oDXKfGeZFl88BSCp9lBJf8WtFC3wY3tEHn0xxJci4XsRijVfOqyHN09bQVhWTecd4fpekVL9zN+HGLpA5oLm9LdGDPaeySGBcV06GDYAQx+893alFGxdJgQ5xTNATP7F7Ev4SmKXrf63kNZhPUfgu5vgYntLYzd+U9mk3w3es/FI4Ui6M+bwPYFs6/WTIS9eVgJeL2yoYklbpKXvqKVz0pJ6UKE3YO4Z9qwGYJCFgfkg3JCC/S56bqv2WuKjDu8u1JUdQQeuSw127vzFuCnWPr+oXnkJkdUeV5T4qzQ0JFqER9CMfiIcTTqo9lhz0ADyTI8PF7ZSDiQkaXrNJMVGiWKpnlR8c5ZuKKVSNSnpM6Iz2ZPQWNe9DpbkInpIyvY9JnsqbhaTeuB1njnVpwTyErqJ/y5KagY9xJuWX8HUQeomTdWbUv5ud5QQ1wb2Rm/6ICX6aKre2IW38RJpmpkInAhv3biaqlcocxxFMAf28sRv7hBHN82M9Ki331ghlkPk9TIJstPrEKppeIX8b8lHNtFMPRf39DhMkNqjB/qC9uMg8YOH5Izf5K5GAhzYy5QP3o0EOsADyvXvVgqOappe+pQ0T8RN0vJ6mQBMl67yCu7AHvhQ+0CzB45hkGxBueq6Wwg1r5fLoRbgXjOtLPJPltEw0U09k6Ffk0jS1DHVbM5K/FpPquc30DRWAj5uvf5pQ4JrPSfbhVtrTpkgMqzUrqn+211dyJabHmjH+YSSYfl/rLdexJGF6UirJJ+8HW/qCyOH8u3n5DUBi0gLcBfcuXxQPtkpBDNr0TPLdZGBVUAY9VaJftGsrxagofPKYGQFnbfbh70sSjcoZpfDxjsCTrEB+eDVkrm87FJ+gmqeuFpklGtfATpODnNwkpda3C9D/XYbZlbvdkAlonccE3nboVl8MA8jp0vE4X0u9WqAQvrIJedi6jLK5VeMuU+NyZYBcflwRWeJc7l3hhDlXH98o97lxkc5aqFGt6ix/vDXUqBA+8Czt3stt0BtYR0mqHB3DqHMEbaKgpl6nd0fOc6lfQXLEL06YmNxCCLFQ5QpOyQMWgvK1+x8fEANo8lgEj4voGO0QId0DEPIgDY22eMsp+hB3+ppHzkTIJboVhDh4kkxuDWYRVODDG5IEhVDLxYJ/mXqhhCTWOoMD5CkUK/E7dsnMAcNyoVwKT380uiB0ktjHskeMmZMKaFCQqmJosmgI+Yu92F0buiCMdchakWMxvEwn5CU4T+lGwD61/UsOeUo2zGoRlN/GEGGhS1a1dGCZlQoGdSiaQWW1p8YZ+9wQXzd8nU+ISBTLE6TRz/whJE/ET1EfnXzHFWHMHSXoNlI/LcQGs6ISwkrs5MuqjUCcBXnP73tPjXvILLOmr6A/NJQsaj94NLHul5FVnqO7z2Kkw2zhUb5Rh9GMJ1Qi9wzXsXcYdLzV0Ou6XExOOpwmghJuU0pJWtVqHWAAt++NYlMVzHQil5fOQHN2MI9KkJ7d7eVgmdZ7mFrP7h8tz4HBP983nDq3lpvs2IaLFmLGhTL3ENQM5XweKZidb3uFHCXxTw0jEXwT8GyWjsQFN6cXFCXBEBaDqZyNyG4kEJOtbzB5TWPdu3Ra86WB2C3wO40iKUtOKRewVYL5xsWBHpV7JIIV44OCEh4hJAupPfm/77jnmWh51j/FjOI525Sgqbz0lOMPRbqSX6Te6zFIblPz8Jw9yFzz9kTOnLeudhuQWxcEKGZuMvfXL/wCd2SZudtVm7Z9rnYOvVTxzxg2vTvSwAutKxA+49r0benCcogCepqUwX7bbVwBakr0fpvBjTrK98/XQpQxvhhyoejac5elp62932HtrAJCzYvPM1AXRZPjgHWsdpgPbX772gbAx6XAI5M9R9bdDnMtHg0Ni3ogclpkpsw/h+AJg97F16QEYCG6sR6hE4V9UTMvnlZCTMNhP9izZd3OTDNFH2xia7ybDMFmX1bEfYOFLQZL+Mb+zQjvONSfMV8DOEusCvQKKM4idKkoWQBdMSmYPi3uEoQCUR2leAvtaAuA6hMOMDeNaWZw/cHMU54TXRhE/YJkDbD0OuKoKFpdy6Vgo/fUYYevCklm0rQUsaO7dbBhtX3uBDVhYK7J4IJLk3eza6ktZZAf4McUyLYOPZmfuAL8N6eM75GG0oWyY4Og5PefTDrqf/6RpGv4ns6XPv1CJ+VjKhkLShG5RYk/urNpeFPFds/ypdoay+JxbsJFA4GKiIbhbDES6i5qkAISEyFhrgriSXPAlmgl/SZoWADvzJox1PEl0ZQpFGZg7fgkitSndDy9K0DRs1qq1spflKxkbI4XRpUZGEb1jMSTM22jC+lrqLPx+MF+Ns5gW0RytBTBNtqDZFKXZvQuHnPWmqwVrNC4LJPFqfDMAPNGmxPfi6vW45Z87cKTYsLOvmKxHPOrDtL/qkCeLRdnQ5rNfiPBHC+LNMMGDERr4aOhIw8DOzgWqd38O2AvTqQKMpdQ+AKdqedzHya0OxO7oysOuSSuZSDjASuFNU5Ua4fM1BxUCPUl2MCTwd2ZoQmbE5zEZAjFHMX4kDC+QU06LAyVf60WIqB+QlHRnrddOBpjWJsVjcjf/IxNWFd+C1VuQw6SJw1EWO53g761NSqW1sQ0+5T44S/xWePbayooKF5twwk2OcNrj9oKkVua/kr4HFSonc9Pl7qWdO4n4VWscm20nYck2xd0lH5qyGxB7Z39xBqlG6b/6Pe8djhykWhZMEHnu0otITerLMAoJ+kdUh/cgHb5V3SkHCU+JqKQkbDNtnH4r343geyFEToFcYps4WjodU6n3FRAokFyGqclB8vpaCQT2qwnuuAczs1h0UvyVjMEjUfxH64u+8e2XtjKbbeTvSAOIPTscymozdA8BV6qy3Cxlpt+A5baK4Y+cvBUicLGzm5IwI2exCSA5AFUI5Sy619hxr7roXp7DLqBOZpITwFBuDOQSeEn2SQ82xYPDh25BkYBCsDix4RFjZrAjbZ7l3YY9GenBMUlOUQWtueTymLkF6gXjWgepWevvoN7hKtQv90ktJGWfahrQRPmSyadThGInRZCOykahR4XVFnIlWAAk2ENgbTzhyaiwT7gRx/JllVlzbqWimdc46RqWRPqIQy28CPIDTc4kSq2X0DFalSgXYGf0keFqi4Z+vsp3Hoj0B40OZlVCRRC1Qm9H8JQGLwBP1HRjWPnaqmENcDYNGSQCNoD5ZnWT2e9OYpplx5I9VZEsnzxOMn0pQ5iIHB+DDLQsX+9VqCirU4ync/ZRqF2UD49AhVLfWYH9I9o6GHMyBsZOKHku8bhwZdvLxDDInmBeB/cvzOM1d3qD9Cuk4JE7YKNDwwneMmzQRQwsvw604QGtIgPLuSzYbWqujKtxkaAprwZ/AABLIpXgwxXBFkm3Z7EKcmtB5Edo95Ae8NMJfUzDVFil63AYIkz8EdaCbBckaQmgEmbR7CWJEZlEYeMkERSoKkc36RcYUT/F6Lp3icYo5yBIPHs8pQkFZ1NpAAIcQeVj99NoQEEDxIU4lCwb2maucuAT6xauo839RLF0rhx4ARiF5TtpZ+ccwwqDXgWZani39loAKsvTbS/lHn5tn6AXEnlF9nhdRpUgpcxN4AgmMF/eKYwx9B+EkCR94MgALyiZ4HXZk3F4SYueddFS5mEYh6ntad+Ho3Mcy8K2gHgQL/WvNTKmQfz1Gw2NaNZJLQEfFogI9m5hhojozPkE63eLzUL1PUGwNtynzUY+QO8lurk2DEzFH/B+j6EYyA//HjuMyEnM87usQVHyJ+kIZm+vIktRvg16/Gzi1AwOVTDFvHVeC1p3KA4EwWC5UAw2y+7r5DCwIYIrHChYA4YfBtVJsBbDQYTAAxcvitvZ3+2XoQED9a+Uz7ykQApTx448v9UYBMqttvkLATuBJxyOfVTiDF6PlkFnsQkEq07azssFXfbUwlGrnEoHqUsPWwBVbuLZNj/2ILR84ifAkApZnD2lseMxp30tKtpqgHSSOTN3g0xiF4EmoznM0ivCefbb59lpwT2M1KrWfOjjyLaYP1z7FcXjl8/DzKWmS7/3ToiJT+Ve6n4KLn8RIHoN0R0is40/dARLDDZKrLArqGHktAnk02dt37BPJ/IKtoSVhB11T/q4Qakz/R2w9oeYdjutP1E4uKUcOCyKJ8OkfID0clOUj1RWQmJcJR0DZHuEv4dCNwKDXF7OkUD7h6CIb8VmxUroQYusvca27f3MrckEC+zh0iRNJHOq72ecQ9g7z/oigDDE1CJuU7s+Ll59kScgUsx71geLyo7oluxUEm6BlmReh/+lyv/35wWwAUasdwbtLEqCSfhCiDbcX4T5BVw2iRLIF7z0yYaIxV/mzMCc1IDElSesEF8Ful7vPgu8F4BnBZPjnpEulIAilbjY3uwkQt7wIKnH4rpr94CF1DkzyweqgySAcsSsoFrxivouG5xB08pyGk8wYFaRqhB2qkw1icW4wmNZCJdjJu1yZIeXSxqqO65/uvT878IvAM7Ns2Vi5G8KEOkkmXEv6RWLPRfFRbvYiAgqlP5aqzvRArQlyRb4l1n4n/6YovrspnYufPxKbPBOwAhYEQSejoC66LdCJtbxObMfu2OJXIYmFfds9vYuLYg0H0jhE9Yh5BrPu5nAdhyOjccpgJNREfOKxr3lD4Ys0Y0Z5QVBc0fza/tou/qe5sSEZO1RPab6kMWjCd2Tyyf53QrgE8GsGUcwdzzg0sT3vPNv5cO0I5YuexPK2HP8NzN7efShNqjfar4hv1IU7D95d+utrLuMiG33g/wcLQFcXx+Ufe/X3s7ybjG/AlG8Khw4XvbIc+hgQ95reF9fBIcodfK8EyS3M+85fd81coCEPbFh85w3g1IHhnm/wRNxfmDrir+sZZ6z74cCqM1KTnX98x8wEWLjk8/jfcDBn/MgpQJ3cHl8cNh0LuzAFxKONDM1NWonVZtxAJIHhYLI/Ec1N2IEK53JtCsagda5dzBvZT+ZzJSJVoVmO0P7Ww9Ne46OUqGr/iyR1b3GSthWNhwX3Eg5/8XOzLuSiVo32E3ambWfC0mzySZuAv76brYmqaLfoiaGRrRDrOG/LPz5g6chXOrS4P9Ob6FOCT4qO4e+RnmmTDQC+V4Aav5xa1YAnpV/KUMlVEQWez8Nsi+2Imhh3iZhS/mTcD56dzyODPou2R8BciV3hcIWkhB9HpL0gee2sHxo1unl8iOf7kAuFn76l3JeHCGSeMD1iEqah8gmWCIiAvpHeLVIlMLlwIAmKqJ7mgQZ3pTAzgzRHoPoa8fqYinA6Ya+ZYdBEP++/31s43hnmTiU2+t6K3xcVvGytYnwVT6XrRK4hu2eWoxB/AnrGgB3HmBVDoYdZeTmKHmm3XicqhuzOGTCoiyPQ1TPdhMptDJwMlmBmPxxk8zLhXV7sSl0k3H+WImwuXCVKyYsH9tmfYmiAMzRmDmp75vqBpYJBg2bY9NdNeZCPDvvdNM5hhtDDf+gh7gJ1HPX0ppmGOLyPL68C/OVWZVBQm8K3QKHRLcScS8h5Uy/aVP48w6l6LiUpSFlocrWyWD4rYQicnl+/XlrfjzFuSkyNX0+IIkbdSbRTixnGEV7/2QBk7y7wMO8H2pGZoNHiDbWZ2A95p26X3wu/3wepgwM1Jh9t/xsYLXlHcGy86hT/XaGLuKU7mU/EpJ9lnIhV7nFXHe4r2RJIzt0AjP3WVKkyc4VEU88l0PMXghkwcWT6/SUUBJx8HO9qu1nnzR5Xw8qgcCiIXU2ZpCkBplaY5+qmQc1FCdjiXqB9CKXdN7BC968Jm+P4Rt4jrCc6d0ydXpG3RZQSGpVGvybMEjqF/m0bOUl+scWpnu00v3FhybXTAT4ggNYomWiVbuEFnci+Ybd53C9zIwW3ZGAheHv33bSASgnlMgxAkQbfUqvqIxAMNl145pCyrawsoSs0oS33mCpfyR8Up+IDNKX0yFZVdscKimMYyuQF+6MaDhCdsBQ+/24VNPEEb9Btz072lz4mUV4WQ6Cln9juTUPc3nKGPUA0xWZz5MWS6QLUXux2qqlyV6vJBWPW5mI/U1vvoJUz7+XgWxu7VoqTcBQJ8rjdOx6VVFvd3HjlK4TTer+fBZxwRHb+v5rDSkXime9IM88vb1IHoeRSSJ/7rItsXlz9xIuL2WHPEsMdt+MhNmm9avCSnl12IF2SQCU33rp5ediANA6BWDHlWmhKuswtohZYEzavJJtm0iWvKSnSRaZ/gLFncYU7qwBNU91ImLm5UX96nT558+nCETghovzMQ4md4G5/VULEEv/vU02trVnpfoL1E7O9RzdQynyMGVtj6/Vmd+OJV1xpzLzQIhTacUNYESK0o+qw4tRL2hHWil4Lo1uipuHYgPDOjnMCq4iDTNMzq+MRh79SNfOKrBdIr2Z40GoUZVi9zRzUZS5Ovz56H1zz0xDSRfJo8l40Nz+9h7J70CJMM2sU4sEI8LXM62ZN27yFY4Ox0XDGikWkVbnIruXQ1ZgncTXKZzvs8YEL1KSGq+/VphxtRAeQT9t6LdYRALkSFTiJtUGnYRYNRpNGwDrEzT8jtpiFZc4U4b+hIhCZ2Qw7McqTtzogtqH0uWZDLPuc5qvFtvA6V1A2qgJNCnRf4C2SHtFO1OZ8EgmW/li9cd4ysb07pacfCae1kwXTT28pndMa1OojnYT++UmnqH6coQn4Tgb0T5hv8fYyUajvQJGU/sIPSBYTUmHO1sZzlPmuDQleu9FqxGfBlbQGiNrWJzKlz1LM81O8we55rzvk3svL2lEyhzxBi3lNKpfQ5/wnIp9LTL5s3puRut2lWRglDqvXsRQhJnpgfOeBNFzaq5LX69zJ58+hl0N/Swcc6z48FIOf/riU7Te/LmbLGUECSlKSEDAj4+2TeGaFun4xOpVL6Gwvn00nWWfE8qydPSWP48sy9lvkZYHeULUf55CDmbO5xGQuSMBFuSlhgRU1AWC5ntZnYjw14djBepSjCYZWRq2EW52aS35zQu/RDWOTTdpqZBr6uBRHCKDJQ94VDCfcCW8oAjiuaBNPYlYDiwVSNYtBBlYckzt1bsijsdk9sEGKv3xJ7/0zoUXrJZWYmtQQpJvcEFsFfwwvTWULeNcOh6/0CnDMUjsU85QN0mfuHfvmJzBdujXkPtfEw/L4fHp/djHYynTKR517HFK0sAcK1PfVZMl6L7zi4ZSeeFqUFJLqtoIMLVT+QHL5m4Aa5onvitvecLcJo0GqmdjUcLUoEVvep+6M/77M0vU5HSv3YcY+5S+jhEoCplrdrIAvtnlgeS4M0M2QQJfvAG66tl6CxPuLI0rR4zfwt0Fmp5ve236FGe8/SOzaaqa8E58yRWVCb6DSJlLgU51RgGGxkhU6MtChJgVh9vHNC+qIMSFT8dqLOLy1DF1vLDSwQDvYtdf0GNOyeFd+e1ypr1Hh4w7/ResaBlQreK/WAGuS5ASXWO1xjjQdVEl8NBNoOJEbFaKsivVwZZbxqKXVjpT5IycqfocV0Dd5fzD9OvSijlwgGbo2zqkaB4qFx+QzHpZO5FQc61fow7V+skJ21W4ai6flLr/UyguoTN1pIQ35RUbAf3I7gAt3aW4a+p/QelE368gswbKRSdLhqHwlvx0XGQrAxl9941GiQpqQdBtqGgTfnHj+TFA6xKzTzWooymzvMSuV2VNE0AtVsQw2fq0q35T5qxuRmzyPZXWD0CKnhc9lgWr90/8DZp+riBVX9Abx/KMYXnO6mcCArC6GMhftSVRpg/z1nHTYurdqzT8StCZziLvNX5Sf+fpYgCvRgMpeAJeuSJgKNfY2oFoAU14+ZyHiztsXHrzttuPQBI1LZKWXGIOPYMUSxWLyYwCOunQb9kCs+LCq/vqpiRzGwEFpiSFpF0A1v12hdZickaewYi1X7r/vxMqOtI2dqUDuTcniC3juK3ykAmeX2friVn/MQgwAOz1+fiw2UrAh9WDM91zATvCNhdWRkz8DGiVMEnGj3c6p4TiH4tUBSpupvQkg4qmBxTcNd86t8izbI3wTdbNLwNFP2LMmFN9vwIQJq2e8785+6YjOBtFoMrHJX2Mr/SBSbZMLssFD1dmiTElNj4xhDDb0a837voIdfBaHPuDZnooGLUS+8x3A3zRlf3ypwYEilnUIgtJw30oy2zIokZmP9PZN6XwyCa+0qrQ6mq/F/5U72qABWtX+YlJeMop0sgA+rib2p+Z0SYMsenMh7WXcAoac8Z2N6BleM9C72/YJEY79Iu/04pqYojL3Vgv+FWuuXYuscQOyKAFMFpzAqd/txAKO4aAKGmqroM3245aEsd57TugXvn1LWftsN49W9Hti1V/sSXi2Ut7nupHXF1lqfTmQPGFQ8Jr0exqNyj9ky36ZJ2RNgP9t6yGd3fX7FKGww2MH/HUaz9iOVRFyez+D+KBW84KzuYh9eCCoyARPej7TCU+5NDIX8GC/sMK8iEvRBYIQ/DU7exB+MeuDJFp9r43W0xAdwcmBq1z/Ntdc8FNKRtoWTNOoc8j8UhJYQQnPsB+g+XmvpTpbH07kHJgj3z1p2/aIXGILupzRD+joKRFFwd2dZ2JHHJeQpCTgb2zGE7ox9HSd8wG1FBB96h5OpKHBQzNJ7GqGSoku71eEOONC2oMMulyIZxh9odXlFu8WhWPucVk7B1d4r4tYfMO+8WzibpFsL+/u/1Y1aQleY3xa0at5C7k9IilMt0/l95XtETv3H14d7l3x/xeFXQJsj8u5BW7KP6Vpp6JxqBH7dJ6YMF9T8+4P8wq9jQbOfqR1Tk/pNsb3TbXQP8b63VmMr+O/vag9nKDGixtJeDqv8lJL0trghTHCrogbIWp865SEysCjppynOGrGu+BbOQVlDeso9yXRBW20wCORKFJQ5q8e6thZwCku6HHJBUiYdrkEZNH7r2WEMGw0VxiwIv9/Sx3YI2vBoGJAq9ohaA9/1Rdbdwj51QGhXv9tpBvkYSdh5j49+HNLx/LPAww+8cryNLZNE1YTwVp1YMOINu1iw492akcQHRDg9EjMkQxzAtvo1EhuuLeGHRRCgeU5atqcGMRnKw81bqqK4zT0AJGaj2xb+Gf63PkQTq+COjOMY0ZJmK8jj4AdQqq4mvU9VsaHwT5yP6ijdd9xc66ReS9pWp92i4myje3Gdhm0W3TA1+FtUP9/kzZWRNgP6os07SOvqEbh53gJIV+PHjQ6T3TdG+IwJmrYtfaQu+hL2vivKmwpCVNxumzSzzXFkMawHWmlNjZlvgyX4GJ5xZ3sRq4/IOMNOd9faprJAMzKheql+Z9aOmVfrZ6iwi5TukW0kxAl/2MTUB5/JGZGEvlGZPKeD6wTsonKKMGdPkym3XeYNDa9huHV/G98R5ZRxPJbCJseug+l09KTPL1z5Hr5PCwVlDPZA9VCZkXhCqbHfgeB4zzRhdHeEP/dSKSj12+80dIZqMswM7jZZXSb6HBK9sU368Ky3DO9PNcYXLkfWC1QzYcwXShcl0H4XchJXN30C1SqTUeyCD9QFap3BLba4+0l434A2gpmeR9uV86ecj/sHf5SOeLQA7v+MfCDgjjkMpcC4eWsqG/wkykAHpHBX9RrcE42gmLbpVHQBbMW1jiPmTLbkl2/H3YKh19cf6U7LqDv4XVDXoBu0cnROQWD2LBV4w12CsPi4DRCH2l0XxGHFYimwqXBzy2GT2ilIzurYJ3faTPQsEA4V3eM7BHADLiTc+vshQEZCkHdTCQbwKX4M+/N2TQ3SsQxm6mJCai9/lmaLK75ngSqLv5SC0N/u2iH8jtIbYoN0ENmpLT3cn0p0/WmyVheu2AWtcaJs2fkItSWVQHlEDcG03WeLwJrH4l1PX1kVGRL6xkTYJUwFk1qt7jy8VX3BNpcprfcP9IZdq7DbXVuZIR6mdEfi359+xWhje/QSNJ9tH38AtSZqd7eLO2YMMKYKbW+XC9P21uv4bNsl8hEQW7+IiljUNsYeYFPCM1VzmHwVUzCdZy/vK+RqLa4cSAETa4nk5uYFlFCVvUQBXsCoirmj0k+f+p7E1VZuknVGUWG7c5Dc9+2BFsUzGCVZoOOxy2IT0TlGD96cSIkt2Z2QcEEERmbgkJFZ2iwFUSmouh1MjwA2qQnqZXBDZOx1AAse9rmM7B8NXSbzfs2N74ZWqmVcHMs+1wMExQehyVOcs4Zigy20gnypcH2yp7sKFVZI2O/dptcjf/VjienqO41a0f/jWkrsWlS7dr6FszpAevgaLKwzuEX+TkHKMd4aN+sSPuQrBD1ajkBsBKCse5JvmhBLfzLPmPnclhWP172b7z+cBDv7JyujMYGsS/u32JaVaIJLhvB2uAMS9WWYX6BcHUYMeLkgNGW0JshzF0mhOgXdNm50HqEjTjZJPf7lrZ/o8/oeUJaLxuBWHPC6UbcnTL9Gp5Bxsij/hNVzJ60UQ7PyRwy/Su+LamnSCVoUU31vPEfG84SQIT0oHI3IqbJ7FdIqdTARQcL5XLTY0Wbwp1B9KGQX3VtHf6Jovahfcv0EErfZtJRf55ske84ype4spuL030LlIYYWXJkYhnWO8f2cwQxZMtUywL6G0iSIcUXXPPejF2H1xc1Gp4p+3EAHYtdV4+lSPbqvQf/ORJ26W+RiOMY1mpark8BgFenbQJjFrVy5RHA4C6+oRrm3khoX5TRKcIcalV6TXEYvdy/Sk9+dmJNAr4jfyMSOxHR/9S6F0G2IXysUU5+gCcM2KRQwK2fE2tLxd4dxetE3sfo2SNpWfAHBI9IMTBiaXdJ4FAFeXMOnQ6I8AqBbX2/IgjP5b8E8W2SP/ER5Wch+e4LZ0erUgqFU2ZyMBOrimUJymags4oqhH4EcQ/T4XLelOMfAoA9M2zYCp2OgbTjAX6MWWkpK8wSM0m5uJtOCzWAjqCCQL9RDd7bqI3ZJp4d6vYnTczbXKVXaRaSwiShoCdtho/6/4eH9dj/nssIaP8/yNPhhftJFcdJP44uSdw+OkAe2zUSZrX5/kiROc6xoV6iEsmYdgCBRDPpuPzK++DGFsfTje2LYfgJMlFdFcirPHy/20Q86pbQHry1PugAulKLEtApMyJXdZNJmjRvbuC7FRshuHkO4qJr4iVszChm97Gt4fsoPqufY/nxS+6KtCSeUR+tOjHdQMYBAnR6XQjs/i+uKQAdZcfyE/wmlao0ECx/gCds+1wU7kgy3YvpjZAHjtJCUT2Na12DegQH01BIL1635N4VlQnXjLWJm0oioruanOXHIcZLrVsubWUCBIgzLgotZriGUTofkgA7h5SL21bXPZ2rTp2eSOt3yFR8Ja6QE+BodYQ8MOpBRwIUE/2KJ+iHbPJKKHIcTdLnfFWw+snWizk6WGMnVryptCC4E9MvZ347tKLQW280rqcvpCid31RBbEYRmRw3r2e4vrrNOrVNXqsBTOyKlGo5QYMToNW0lhrl/fJ7XLRf6Ua0fLdVpstUYlvLsZv5387bvGRdNXQ2savwa1GDsgns6c6eJYHAoN8ksrwqv/57Kgt0P/KJZJnjbsVBn4BWjUDByrs4mQJY+zsovZsj+2T4EjsJ+ukbDSJyqQceKSrcrq3B2Cadnj2mHCWaJxC3CZICTbq4G0+lGJtCz8qoS5oLdFLvgMHbRGrw8BAaIC7W2d4cNIgFKmmN92MUjKJjEtoqF7ROOVWtDjZssYHRqUyhG9PNiZdIxl5W31aHsru/VxG6vnw63n3j25oEqz5a++mauO/EB/kIqUeyMra67h7O7cJBqZWga46QYjVpjvRQZ511uRWjgQ/Ap5SI8kF5PYXAv1AGE2RbQWVx82BRNFkATYpHSie9oMQHYhKpHLiBVexRxPT3HYhhKbwtO4lYFNzFeDkUXWTiWaY7tp1QI97uNHFFwCmqIaKUqeOSxeAYtEmRu4gsUxOrdjBvuxGLY54grhzUGhKIPYCngSKxtU7qM9HPO+ccfpTFXdovNjNV6kC3OAekm83I3KeXq6fqITHivmc3AIRGcJt4sUN6WfQEiAREc06PyvcLGbRUKqWK3JXjSMXv5QcK6Q1BIWL19Ig77H+zgGkP69j2hP1LWhfFBlZ9Q9UTgH5uiqE2oMvjcsZZLxylGVAAeD+e8nHHmpgX3fBMEAylNDb/cCb1spFGMjSZjh2pvdmWKwtPf4uBmEycO8rNoD2+zSM74drNGS9wug+8g/48Peq6NJqqH8rYJlRt5O4kHwVGDM7PLUjnAjRtXYZnIaCiYNcTd0ScbeXPWjLlhHLbgfp4lhC0cFuFhrqoFeLVSdIEj2EEy7sGblnwlBXfitjNLffT+/yjPJlziKA3HAGeMIwymw4LE4JoE0PJu3PqZ29gd7n3OGUeoOwbDdBfa/e4JVAZ0WUN1zSU4bhxOy2CRAu8rSrYABvNrufXg3nH8CKXLPgRQ92XR6k3MSozdwdW3Sw4j7idHwaco/j3QsrWUHcuVWKovRmZ8QJhj6bXwn4EmqyfWTBggCyXkc5iqF4NwswHxv4bDkmxDmBZBm6T/FO8nx1YPrzWE4YZ4V7zpkqnpR+2i2cKW4cZbcGGGvNWsyQRq8uts1xtKolEKKV93Ot3FpM3uNFTgn6L6enw1PCWE1JiTXlG1U6R2D6dYGtBQp+egewUETdng5mhx/d+DWw+DcskdBLuQoR9ev4ipEYhsXVylabSdaQ0Ekcq9AmyXdpCAbcFixtBmhN1o4lkICROL/LxTsQPVCPMyAlwARXRIfOvr4Bgq1SPuBXM4KERTVHzOAvxhLbpKYw8HppImlcpKZi0cdj0Ma/iMQndTgiRlzECJn5CfWTawNtnpkbS6nANsbmirAgUQHlo38FM+TrNqEA9mLkUKi1HnVD7oC2pIzqFeJJUERRLChAXjIkFVl17CLihSKT/fsV/ryEQV2Y7MqL/K4Xcw5mx4tID4t1slMFOyovMyfgyZpIH7vc1/S6T+LvShmscDJvvDxwVGc+G5Gr0W6d+MRyNl6sy+eptroshr9ynwc+BeQTmhgtYEi7qCAKkXhVMbs44ZVXam3IvwOlNPV3zb/ZLjsPsl4V78cuxPsOY06hU+RZqnNW82wYrFEtoGGbNfWb2iRRvkAyNa4lsqQDYJac/MfjyPedZZYc1u8oSYsFNDG6Tpx68BMzxIW329D07LdNWFRHqf28fNhmMU5R73F2cojT5g9NCYyjJRe7rDKdQGLy7du12tNyqfpZnfSBd38nJCRmAciGy9b8qdma08FTABjiiYoZDr6yEaE/1UR3z2hVZ+hE+qLdyzyXr8RMu1R1ke9+31i3Q++JtslgWGezbv6yjvwhJGS54aOo/ybFJ3oamVLsH5Zg1i7Z6HuwPIpbxm9aYjvxDBb1lsQ8l27CAAa2FEdsGun1PdjNozA+C3sShYJjWAi1NSo63Ubdw9qQbbVIvtad+bYCNgsxiP9pVF9DeLFSFcqPrlV4GAaiFl+lJmFhDCnmVrD0CARs2W9Qj/QhFn+U40wEMLsb3EjpY7axmXSQzuDUQ2A4FoIo66iGOSl1UQ5CwxqgYXi67//suuKFs3kPgyr9Hscuw2Nab8jQ0yxFF7l0TAKlmHT1fGNcgKMRrQPg0p12+9UUe0eGWDVssBmCyMSaH5ctlw4kfigaZDElYioJahDoq5eHtxrZm9IOOJdoFLWPGXVJtVCpHdJR0fmBh+C9oPXue15tPQuVMVOkisr87bnUaHzJPcpZSco3OIGkrYUcqKruAhB/b0t7dYs3r6PzHY5HcRwxYNdPjxLXemeuVbMKZiRLo7FA+RF52yuDOsmgn4wV5hcRF2IUdPiWk0q1T4cQzQj70bAliA8tqIfzdgya0l/2l0TDZs8bPzBCbwYAHOQAX/kVtmgQ5jTx1nUz86EkF7CDI+hXHUS9VnkoDb0BVONZ8quYNrxCo1jvnqznJWGOLywsXf9ye1TmIVMDulsbGLBzh+q4U99Q/gp0vkW8samKPwTRc1mazzqDj+1CWVI5Ww8MSwwvECHo1O2r3MQnAkKwQvJGjcm7EyWyi1l418IZefWxq9/FB8+NpjxzD5Zbc72QOFkCZ58MaguppdRdYnh+jouv9SDPy8G1URWPdUkkphtaT1O61VCZcsXSS4WwOzwQ06dY9uEjB+XG5B+a/GrTPLCQYPEYRJ8whDDJZuRhwwPxHsLcQ/EyNvx4f198oNrAAio7q5FW0cpHtZnT16ulWj3d1UgS3fDDjizxuq5KB6dWwirDLivBsJzndOOsb8VO6cx7/2+vfe/ZwPzYUi81GLR+Sg23jPqlEIuxtS8s8/f242Qihi3uqiD3qCdK8nnbAIE9WNHuBQqASSM3t+2QQnhb3lJLL0lkDdcZWPAv+EKjf9YeC1C+t1Ee0wBATICP8QULJNTq7G1Tc1PgpjApzJMQslMxJ9Kw2NjwROQ06aLnZmGmyaHEcUWl8K8VvFTqcW7k1vYQ41HwgVnRViV5NgBRRv6927lqYGy8KJLCfuiSTHzpGAJrQC1MQT7MiDF8LkCzqRxqi7ldXFmq+l3Bu6ZAuVQSNm1r+gLVrTsxsgrHQcqZ8LcSVUUczpPdIUt0dN/dS9AgGiWVZcsIZqrZ7Qc+pLWdn3Khptn+LkypbiH3s2t0v9ghJcj3z7Hf1YUTeJeWsat0XboC+YiaQTAlKVD85FTsDgLeSADN6FclYO3ic5NFc+QM6ywUeRk8rKJy8Xq4M8X4mwbOWY0xmJ4P7WJMFGt3zRiFaugPHE6Ep8Px5J+jS4bYT7sM1aLFf9+j74W+bU4oV8MLFlI+ysLIqFMBeA8ZUHYo07ItCYbHTK73DCiE4vSlUeXAJgr9/oUl13eFtBgU3aaL+2ls6JHw2H0PKlzj9uO0v8Xkc58hOu4uV7FRSGcEI4w6JTDEdkOShhI9TnmAc7LSIvUCuuJL5MzGviRDPxf2LdVL4HJQK+x9b+1irtT/iyJqbKb6Xa/dR8cre7DPP24aWLEPqNhr8IPutrUxOSdd1Am3o6fkrFE+f9KfuWY8zAxI8sIeBAZRHya7MgzeyHOoq1aV3iHAEXWm1HfW8GAarrOZnlBR8z0UXtzjtZ8eQtorjAKwg3PiSHt8odyu4eUZzXaojDdXdEGbw8V1rrDVvxuxdc9Nbbzisbyy2FhAH+DpKoUlFGghEWiB9siMTd4V6qYji5YHr7dzcl3lYwE837NJsQnspHsjmTXW2xPRKJDNlwgFUXNZ+DkvyqLB3seW3gcppDZT8+macnDBpYAkUOczDukeWPWs1eaO+GgXvHM9cRvFT+EMSPvwD0tvdPUbWgrfyQPEmp/SPXbC5ZqOKolJotXGeg6iAMqF+rZDbh9VHArQ56J52GUDRiNgMg5B26kgTDnVJai2Eb1jfIbOuBhUoPaOw3qyp5CZsG5WKuglgdVADG5dxFeEHrWdCQW8kagY6TR8hUigAaYNS97SZVVetpN+emVMtGHml8h6r7ffjJVvSj0fRCAPCQ26Sk6o5U2T1d9vakuK1jZE4u5NCyMfy+OGUHnE+3SoUVXOx6txhbU5nxUuajWLk18/m/sbkMcEtVTSSGSYT9W82W12QPz3ZmZXUyI5xEwEpcwGWZPNatHdehj61NYzHUHeQNtUKJVzYnR3Um/cdKQyyHOD62HSg/D4m/I2+V49gCwRc0RX1fuyJV9GCWxIJPScNUbx+UZ54jUvV/ReuL7CkrhksfNvzQQsookUipMVTu8bSZdlXlz9z9/btiJKUS5mZuhcPriVafF089U4bZHWKBn+J59M4lcz/Sd+SGKA5e1pzEMLJIaO4Pll2k+ZvRGG2vUwX75OZ30q2iq1WTTd+kajiz3Xvc1dUYxR8qplGbR6O+7QNOI+IckLFSHHpWwY1ki3Hrqvs8kUULTrw9NW/dq3qGhWEmIzhKtx4Ipeq7nH1/nwfXvf51RvraWGKFPLematFH5lzqOVJsYQCswNpMVrz7JdS5jYc52vGvJ3eRYt0kz0KdCfkfGaHY6GqFqRx20f8faGbVGC3s0jG7TqugfauQtc6z9Bqq/+BzZxmHdNyDi8uwFjqJRabhqbPa93pI2tltQ5+AjxNBAhsRPYvjUDgbyR3b30Jj/raLPfdvHVQuHf7cZcAbY3e0ecD/KBGHx7z0AOLPlAVmC3ksGDW6Z3UeS0wnUWf94cWpE7ez/AgF5EVC2POieX7H4MVzbHhbrrb5sWJN/RryYiumZ7UPI4DrlVLG4jQX3i/x14BDGxhkkxdmcGgXLmFuuSBHX0sX5w89TjT496UL6rkWAHdEWF/iCid3rUpgKBbfkpYI2TgD2VGopDdg+8wt7j8tzJUPIlKwUrGgm2O2uvl2mZEdMNsB1BjUtvwaVf0k6Pc7s71vv5hOMJTIKVJNrUjTVJa8sAWcqvBwShtYAldqI7s943+KdXmXnLRxBCteS+Kcs9f/abueu+nQ187b9Ar/a/QyAl2JBZrbc8P+0xyeEj35sMUPXV0aUKf2pyyVz/r72w7gQlgPAtqB6n8NMc19NmAC0nZF0wbebibyjDbwwEB0UbrJpTlAgb6bjGfiU+fw2YGwvwGl065JFZSVceUz35+2t70wg3pU/R8T1L7GJnn02nVf6/WOAAeM83f3+Vjyx6h3jJFrfLA3FRGje554zz/NYzDf/0iKv9Vj+w6fT4FF0JL3UOVjywllji6GiuqZ2Hju/3M0XKp4v5xC35q1y+OyHr2XrfYVl+Pc+r7WNeCI9G0YtWdwT2yFw1Teo1DbExNCabplRiW1lb5G1BwJchsW+UVWEfucGuPP7v8fQxHee0aJoe+c0m0TNQHilP/v/hjkSqtj++kswm5farbmKVkFVbnJvn9n65Qcod/itLWcQVVqUaEO3PffSLQti439h+5UIQ2Qh9hNT8E3RdjcwFUYF5Lx9KCrzT1yQ+IKYc2lToqxLYvOsak067Wy0A/zMY7gk2qToUn7HAPWUdjUg6MYU0ETpQlmKD1zeWAmpS3uX5huJZ9V5AfJ3HaYsYAeqvHJGVC+QjOgAh5QuBtmGOoDJBxHc1B0nMf4DBPhgJ+Dqj1vxw8ZehkGIz1EQ7VuB1Jtk/iHe/xxHokAAOCnLSU+AoqB94Kbw6eOWHShP9Eifggte1H5zarsHh/zmKOoCzMaqZ90T3FecGQspbpvP5FHK/jUqaHLVCpS9tuS9WKzj+o0C5vm/i9DNyeaKsu0z0thJKmD5Dh6tKM267zy4f7hkQSbVKgduEpysT9lmyai71KeiJQ2T9zj+HHyvqRaM2vdc4nA+27xDMCdzJZD1khI/S3Xvv6haFpzyNZD60ZnXdnJwth3gE3gpzsaVsQaLlm2GEX40451qYOGHGgTUXvqGfPUaOkROAUbKAcwL72x9PlS96J/eD0Sl4T8g1YweblK8sDz8yj1OLXy8pTmeeXxtm9LGTAvPc4uEJd3HUPauCqzbnduum6grqV8pzgtvpdaNiJcd1DjWJbPkqgs/55mF2+2vpnPCE914y1sqsN2FxOqJqtIJ6gFq0sJVamDwzxhl5pXWLB1O39+s6TcSl6f/107U214qtqvNQbzsDMYqJhXo+80+35eLNXqrqaEoDMEGOEehraFm54KIXbv9rcECYEfFMEGEh3RezuKCydriavTxn6wYYNcOgjQZV6lYYm46iASAYpBMQMn1drXbr6qnszVxlDcJAI9SV1R0oefpw1eSGyYN9oU9jUuE2G/VYsEwkBkEizE3DuW9qs10Sp3qLL72mItRtUWZ6I3yGuT2jz+2Jt9PQgZLdTCAUQaAGSBv0Li77qJreu4eQhZP29OWU/cD+eSTNoXPw3j8y6dyP9BE+JsN7Zff/rG1CBeV085iO1r7j2FIzNBgePnmNctvTWa+xsJ7kGHCGX7K0MgTqGh5M/9yHXLffpjfOPN74NsniS5TNGRE7fP+SXPR/mfw3wJ9ukbb9EQupqKt4lPBuyFVHCpJ2rB8+sYwamrYPN5a4A+1lQd+jLhwG01JAzUAyNpwestiZbJZDOz8j5/iNk4pQm8suldmrA9J3LuqfyZENwymxNGZ2f3NWx/bh2F56Do03uguPIXvlKstorISnsRUz//7ZZw4CbVFlJ4XrlciX4DT098iYYJTMkQKp3nbFRv+iYLKhRtTj6lu1KWLb6avrFO9wAszbebZ3hAR/SJ+Z+bwzq0Q2D4BQU4+w5T3LBNS4wR01RS8iU67K86FtyKLQ72m5wQSD5LS1hhkNezABxSB2gitl6+C4kfrH72FsPRPCuWw8WFMMHhiVNt5kPqk6/o7L4AD8ZbuW2FXBfS3BQ3Kp5xxVYL7Ae77chOZJ58/EJ73HAnpqF+DZcs+pwC42whcL9G/RSJkIeqeMdWonGpNsxzE0NoAeI/BqfcF3x+bJdAcBY8r22RGRC7f7kpz7Na51K5EKkultedBZxDjr+WgE/hCBraZ/vtU/h8LK/55wS18A66D8wyPghVbZxuhDHJWLYSLcFddsiCqUXPjJDjLEcD8ltiix87rVzt6L3YE2Jk7rwgHBAW7rEFcgLxr3RtXx/ktWHpgp0CrbzfcBPcpMhCCY8OZwjZSasLthz2EHz4T8tpJu2L3kRgyIm/TUbPxPF29FF47DoUkkx6uGMo+mve3WSbcWb5C8BfDnoL5fggTkEicpFwqCJ9Bej7VFJCGCN7L9TIyX7mYTw+6GGV/om0/ImL5fawxRF4DOVrDq0Pz3z2c/F203nyjA0s7rGk2kqEL7FDLDmJExtnaUKCczQJ03NBQBVbA1e2WG7OQWVzGlgBpZI9ZgkvsP6IJ88PW8nD48g8+vncfECm0Otm91iyPNs+BFRgraBK6hTj3kGhYD0sA7tTmaSi3Rujc7+E5guqzIfaEiPPr9lmKtk479SuiCDeS8ntVTFkC2GHaot1Ppl+FxbuBAvIL0vr5HMmtTeHhwjwxw9LNJ066CIXPyMCS6ZkKTKO7CGX5DMEKgENHJEWfxKJHvArcvniuo2uRxm6qPja9qFKmu6Ms7rNYcKI+QVfUcGYI+0PlzFqwh977YsyP63fFpN7bDvM/GaSm31keZyuksiqBJXWG821ZEI/k05aM7MQHZhX+dB27ZxMzMggQlh3pxCKgZAvn7YvXVczqHAtTguWPEzFBZheBe0sF4r52kCQSX+MRsKjGrQmdday2FM35coDALOH4LsP5O0UTDjJhtsDo7T4iHmn5YhZJ/sWu3i8d4jmnido6PcjUc9Hrae9H7tV0JKSSL4vQFszY3pU2mRszkdMx+m0ClpGzc4/FKnXsTuVpB37SYTtUVXZ1oF/KNdpt4hKn53tsZ0dDdJGbmIeeL8I9XToY+KwuvNARkt5kIXRuAgYb7phLALi7z0EIfxfWpiehaVHxAiRkVDXLOFqHOcvgWahhHNqWHjVYHGSG3qlWptt9eXqIm8UtA5MR4uYvFJJH5EpaegMpUNfR2cKwC381XrzrAX9c0d9/ya+pqKklmrfuWLoxxMW5emwInQVxVETL0525FlQDvibFW49mu2FvkIyAb+ZMsr263KcObfnRPaSlZMSINNbrchDppIpQOi5RiRkONGYHMbeFly2QoSWFkwg9HUDKc661mGwJaq2K5w+oUd7hmAKgpTqaHuKgpjiX9H8OsJhU28Tbgwz0G2SNjHC+YIaqNFPGFkhlHoB3ylkDRDgQj6jaZHjPTU0zPKZk8XZE/lHPKciA8Fzlj/lIWKDgVzS3DAbpNGOGZJ5GPsdIEZ6HEIBTMcZTLIpM1IyaFyusH4UamuZGHNujdSL0GQeL3RuV3PRVhmOs/UYLNYGlxqcixovNd2epBIdQigtGEpyL9OsaOxv0/6FU1LzScY7HmELfYTrMDnpEcYb6j6Kjyidl7T7wU9kp2+sBp66OYcoV/jZkEW9uB02TNjbevEVrHHaFhiw7t3Y2OJUiFy7FAFhiW2HbNTJvSBx+lmVrMmu7XiiKaAC1KIWfYRWX+VkiwfjOACA/c+5+0VbgiQffMCu/ERn+E5PNNSMyM+0MByOYKALP/jHm4jbsCkEp542Y9knic5Vq+1IdVtxEFLfBkteqMYYZ4VyWumr3unv05+3DizvO9LTfSfY3HS2gGnPeXZx3OAK802B8u/Txze20AvTt6tKAzK1WSETcc9PSuIdAKekd/+hqH27AGIW2rfiaOdxW/5OZARrEl/TAuNB0jaKSPG7yZ2PwiBavtVshU07yfaXgsiOHNj2GtC8KHHbIoT2L75ZSKX0Q254OMoKLKq90IjUoiHCHUVR8GzHmJNv9fgcYp2JL6i21682DQsTI0HxGbn2GmMHlf51a9kVnqoqR7TBTc1NMARxyqnpQwSCArOksDJGQewUiRsujLEiHljJJQ5+os95FPBr4elQFV4Hj0wwSwbIvtM5Xgvfnq8+9AF0uqhwOhUYiLXKaCM2izTsZQnvgR8iRUArO4wYx+ISUU7mC6tkpeOoqQTTIPQn28rBx0ZMHFbmCEofsmafVNjHVmzcnpsOMHPt9Y7o/+Xv6rpTotvXdQ23fnVZBMwG03tBTkTMk5D8i+k2Tw3mHfFVfVxHo+aHfV/7t1EFydSgrYr2TkNtdAIHvKZrNvDTeBWZH6J7nXxdNCq/mwWo4g3YpKoKPtqKt4+jeMSIXeTvA6GK0hcdelXAD8XN39mHcAvek2+J/UxpF2O+fS90trfPBux90663xGZkq25uu9Ngb+KS93asxU4tTKG3b+HGzA1dqNzeTYXL3bu+kNb5nGJ7SxjuFtskhhst3zfm4fp3qaeeb8Kk6fR12Lrpsn+IPA6FtVi54RO9aYWbV95WW7oW7XjkZ25JVfx0pZsHDS2lcu0j6sq28ly6bNI2n5zNq1xzitZwt4B0zWffK2ODvq6S7QngUafciXbVIYGWAxCXacus5FdC7K8l8S6372lPpLuSwy7sQtY6qnWUFL0kcbsw9aJlcNJO2k7UIS6e4IrhsKqPUEVCaKjTB6YyXGCorw9GtRMbYimLiW8IRodB/B74LRS76Eb+62O7ZDVKAONf+oazAievm1oIs/gtkUOdj889CLr4d6DhnJu+4EjK+TiE8SHSJllB9DWWT8F/28iYt1DYkb61M1hXHbYDxy5JvD1NaOheo4WtN1WYMHO2U//j55L7ws3M0s6OuiPSPfU9olf7ryq9T4U3pc6bheyR/D6Y9ghqnXtemB5NYROk3TGg/QvVoHvxhYCU195VbRsLHYVDSG11Be5PSHXx2z4AvOmUrooJ57gR4d/+hJVixwACV8T0IM4RIKEQ7fyDOON/3eGcDy2Ksak2+yoB3p62hhmNF4yszel1CNJGZHOuBeZ7355EqAgtvu9HyWFarQsgKgSMM3qPUlBG+PcWaOp/+QsUVhfcz0i3y2cY0X+6ToHw6BBJprxkyyS99bgwC9iC0Nfy7MaMY5Ec0z1L9ylkuj0REQVq02GrGnUmaCYoySFBbxXPruSjx+naQZzEAsgZ4ZKApPaBM1MDGi4ClBdYuT6dTi/lvLyuPflxIgPhxMgfbCRPKSgBO2Wj4ZuJxEWSIgPgDI1BYWtcwyy4OhsKESuNjEA4OwA7HhC6AuAACSA2FEhpHtdH9sN9lqAkTVdwHf4yKgv4nIk0InUdrPvN4/+oAbX/xKAXWKr4gWVsfIkvcFNEDrAnE2OOk8gkydj/CVnD9uu6SWfIQU3ix1IJfgWyBOBmBMBV/EnEBO60/EN0b7Edu9AfWUi1/oZcapJtamjebmIIb1+BqWVnPG9QY7F2nO1in1R4Sijz7wsi3mruuwoCu1mDgUgOwSnaCNLf82XNCdYAeKek/vdujjiAb4+MpIoRCH1Tpr5kGlgymOpHDU4zz31M5P2BGMgDEr4nAdCijFnfgaceT4HFy9QKC7jBe7hsIjoQRkshuzcLEWLl6IPmY2t2QBKwOaCLSLK/KHiPkCyt+769PkneZgQLDWZFF3P3aFtKZlVVxCcytx8TL9miSJCy3yqKsHypmxg742xjpnD0uYMghLQ8mWZHBpT5WEFazAzAwhMHYhxvVMOHEJcghv5u59PsWWUr014I+TrS7pRgPX8moazhIs7CgEnzMRn1qXR8+AXSIw4N3mFzALHSFLg4drHoyDiD87l+/xevcqGR0z1KMrAB5iUOYCx4q7bOpNr+SJ8SMHgvtvYKh9z1T6hY5Nv/xWnyeW4kVFR9e3d6WrAtb+YSrzYJ/5SeaIbYaZpYSLk/dcab0zkJRyPE0Mr6E8vaCfqQA97MpePV5khjsO+Q2XCtmj5Eowf5f6pE2T58+aslR5CNe6HNtX2ilwxqLHGPN1K4rlUxcMtiiywih5XuRcsPIO3oIdHg/s0htfY0kMIgERL8fQ51RnsfJ8r7xjgEfloAxdScNZVGwhLaH5NwRmrWa7UlkuXmRHA/O0ty9BX4cNU06O5myUeejFs03Phq2s3lm5bHz/34AbufbO66SiFaB6F+Yean24P358bgcY9pe4w8XcBwk/E4uGi4kMtYj16EXAcaMEZF6HoHP1eF1gvHlmm2WJK4DlFR6Kg+s2BwcavGCA7bZBkkTTU1KK82tySWjkUr3aIlfOXNEwvJ16V7/Ym2BTwM1i6MY57mtw3+nzvAE9gdXI0VjzmR4ZOvoYEz0dy//ENW8fknPvfj0DawiR1fiSYJ9lf3QoJ++/MBrrgyjSHBwCfTk61OMSdmLs4Wnw9vwZ89skonuv3zu8Mdj4DmIlnpCH1IICeBFgso5aShGfjOKJu0LohdftlcWQD4q6SxIWZdsPhgMhLzpz81HpgxCx0zIlqn+5IPN950BkMb6x4xaHwMrtylUj4Mk/VGkx82gP3Xw+DGM7c5BS4HqhWR7FZQQKxrBuXhNGI9XmZJ4TVoMNPiuoL5FNeXdYKZDSbRtgWaFOhetnLxpeLGoCiaTAIUK/u6rNcmDJQd/r8hXEU8CWW96DXrE2PzVv5e7scTsgW6bwRfL+J6dBq61qcFUi8oklJm85lnasEYir66djAi1pVZrjBVgvGtWMHFTeRu/iCLxiBL7hslJgFDIGRYutGdi961Wih274r9+gc3CIKdqpiSax6zAfkcTulZk8bbkIGNhuRzgujX/pV2dkgXGtXqpevkbUl9Ku9rmsxMwB5P5OP5Ka+uU/NXw9N6jFTLyLZND4S96M8n25Mhoc9OyjHUjY6g7oWnXQpaWhkQzvaEtdmvvpm8dwM4IClkQN82YmPar5SrP2j669H1ZWsYaHaVjuD63HJR3emsJ/miQWn1zgP4t1RJBFwyUfJ7jQhdxoY8UTO1iFepAd9ATSJsBMWMzWrDz5K2Ms4FG9/lMKHgKx0yPEZx6stkq51wR46c50HptkcEzvn2vmK5Zwv0Zw+9EWZA26JbeoqkylszjEoNzkfru4U5P0HKOb+eB9vTwOmxAypW0dBtUysqoDqXi1Od7/cIYOR5JDNLySWqOHwtlzBKTc2iZNIlVV/ZGKCS11jZcG3JGhEcIAOaTqkBaahUQ6L0EbZfwFxzWE48CfBem7bO89nPN3kHMJEev1eo2w1GMWvBTYb6JlTS9q6+anKhUKj9KNP7UTaMBD6dY2ydgQXH0OznKf8IQxoaJYIgvXJd+6HjUamixvCs3qUhZlZYUHXtluhWjXD/lAUSMqOJblpgIcqm3mjajSxAuWzKI9F9Vuc8UqiyPg1tIvRbU2cn4dK71LZg7F/W+W54nFtN3w8xSnNO2gsxMFUq2kxd4eS7mOzYr9OYDabd7EzNC2o1gZoG1pc2J24cYmPL5r9XRAvErsSsaSSPOMFdBUaZzFZfNWTlC8k7dpsxYYKjqhdQ/6uOP7+Gm+etq1vSm7V5ZeKbGWLag90uRGLCqpbQDBE9+VKBQI5m8I2heSF6AJWQWwDFQwUko5+/GG9kqvswibp8qXLisdhX8Np3hMkq+c6IVi0hCTGAJR2W1s3zCjI3JciveQJjKmtm7GUtJPK55+QCIMlmeQgIk7HRrBo5bziZbHyT4LOZxtXmjouaGIXt3MHb/b1nIFx8f2WwkvN8Y2rx/RYT/PVvtVQcQsS5L2rk15bRzpD4YGo6hJdg9YdxVNI5K5U/e5qc23jpk1pI5bsqsSiGaS3qKQPzQPoWGjEOZuvYkmsImLmyqiXbmlFmZFuoM/3SV/BuhmSjciRDV/gy0NM7BDuCAfRpmoZ/8qDTsckwTbMJ2m9yWzhJS5kbmpJa9swcSiWN3MHn49Vvlq3Hfeogoiv/vwT2PHSJkP4UvV+MlzHwW23uaaVMX3hNg0jMWr7Uw6Q3TFCOHkZp9f3GN/jx3788VFOqJNapUjWu1/XqJbynIrejPseS6/JrjGIL1uJRxwysRIikJ7g6OtTK1zP4Dukbn4aS3DPAfKea7nt9AeH+MxDJA+m1LsTDt7kAjrMg6qp8dRfy44uAcK0cPMiDufwN3/wDRhyEzO1+Cc/hhpmkyvp3klQxq5GCzjDhreCMLsBytZxrVWQilQ3pIFMN0aZ8BkAfBeCUgTSpstQ7mURUGiFjNdZqpcQjFZJxDz0AAREQhCaJqiNtACnU1QihKyRJVSSdbayxhii6s4vV7FoUaYh0vnqgrb5oKfP3AQJEJZwcPjeKKhLHgSHNZm7Elcozd4vn2c/Mztb4CPvN04OGWtUqBU2I28n43LqQYtZZHjK1rf9s2ZPnEIFJYMAXh1Cnm2mdHVJCLvumMZO9K88j8TL6yqzPiQYJ8MW+dFBJEJGdp9rDDlqTgVCyWKdAP5gOl2h1uPE6NoePoSKsHdtXE6CWJcl1HA8uphVzpzfDt3TnsU7er9NEr4u2EEerEXAXI6kggba1ku/0Qu1ZjnPdXSICwcmA2yRyJPlAE3L8696kEVOmhmuSoUoeba54hpecPY4FwYGNVMNRiYGQppcQ4UvXH4q1DjoyQXt4fxQHSetx+g0TWKxrNxPLOWKUbecR7N4kZVyHFzacjC5wR7fOoUE/laBMSHg5Z0SjrJ/IqU2gNvumx4kF/IJOOWlV1IXR6BkXCB+GvoBwK/GAbUhowK7JM8vL8J7dJNgeToqvlBzAAQ16GAjcwa05ltmHqHxw+szWg1hJz5NivmFa2c2DmzL4G4IQ9ezOvW733vtWL5ZVDK+vHNpB0/lFD3cVerYzs7ctsohc+AkvyFOYY2afigK8ndrFrers90gHNNgDRU6OZWMJiIf94UVKLrSdGrrckpVqvVAq//x9QJaAXXiNP6RmfWhXn0oi4QstEwx/vzz5oIrODAlB99oZ/jmo0zu+DGpgYc5TBBkaIB99KyzWvj9TgKcMG3/0Y3k6QoQyERp4YLdKBVeUN8pkh2a42JCficDIaKYunHiYBZHhNqKSeX3BU22umZwjZY6YyV98qq2XJcFHkZVjXCczTk1OX3k5vPLfYPQToXX6Lo58H2P5bre2K7DqUF7gaF1vB84nKRJ8c0pfdx324hRjGBZPkhDVLfULZ9vcjDTFFGl+UJ4nw5xlUx7EoDhUzaWT2Rgu744OW44uI5Zx/80FAlJcHRZ88AIyw3HOdDIaffK96VDQf/4FUjB5kmtmrs6krDnow2YfofnE1HAJ1rzj2aABOr0r5WwTU+Yeizu4mk+SLAKB6CkdfT6sTV+gzfk926zZIIBp2rgO5hkdLGZCTJ+VzZGwgiyZVwdVcEcakDw1EisimMqcRkkU4otMKGWt4OJ248JCTISIXoLAN914Ao8IMOzZoybzqN5DuY8EnBNsnpXELM2XKdANhOP0I55vwJACbsz9P+e8HoE/H4rNs9HH73TSO5082ZjMzH7MhJPeTPuk9M/hxBGFgj9V5S08PRLTpJDJcqXlyezxLvfhdBKiVWdPBI5gH356iln8jb28iXHm6BGZl0z3/9cBetJSLvGbmsx7NtogbhNDZ4vfXiTB/rjWES7gO+Jq+RFAq36YafF6PuQRVD0UcvJtSGzzJqcMOkYiSvNJ/VZTL1aGyPlZW+JtjFefSqB191XQU9573zDD4yoZb+YLbTvq3jAkCJqb09A8BHLTdANSY0exik9u37J5vqIr3Zs/d+Gsq02Qc42PtY40lICXOHQgGgcKqDxHANQBB9/xEn9nPAZ61BCXZ8FbOWD3KVBGU5cFd2erC+mCTOKSC2OBX9H8vlKr+ABEI/qNWac033zZZl5yUmCayxBTVtHukldhoQbBssrSEXmo517Vzcf8Z/6Zm3H8RHsiXMTh8TWNIqDIAswH4IcWAk88Hjw0/Yci4YhbD0vnCps9G9MxTG/Ilpkf27Zug6Yz3lQjvAmXIma4U44wCA4U/9LAdjlO739Yjjx72ISJYBeUh70XXBSVNPaxTLDVKa2/z2hCOfQshlUiy33be0zldFt0k5ZlMK+qNoKPwNPHq9XYYKGtYeP2vs5OQujR0pjcQR69Fmn3skxZQo78Q8YL2cjrtmxqR10PTpeO/+YxE1tw/pjp0zUZkR2Rl58M3wIhFs47kXUgcQoLJI/wjR7ybwMBvlijceP8mMT2Q3hpnadH3BqacGG2xV+5Oq1Bc2mVlAhkvXjcEWInZsg3uAjsqrBARCnCDye9dWI81tLzlqtkz2T+mXI5RRoJDRBEHysjYYYFj75dQSO1WvcGXBZhrkifF58Jmauk1hf78hEBhZBIhuyhK2nnuhAcwWCg1bhpZjuNm3SCx+bsC9Adu5k8yVxB7bKO4IAkkPsU0bsYEoQuccveeIxaUs83hbBj1AHYJdVArF10I9XM++2EIkaiUlqYm8wq95BGtP/h2Q675NqUfp5GUS3QhZ/pyW4GF6yTSjN42YSrs884ZaiPX1l4xKdEAov/7TGa8QnsHEZVxiBl6E4VXaGyOg6F5KZ96EpcJ2y6jcSS0zNNGYLfR+pEHbqKzecbqRkSYqYm0TIn6jwV7URNvj3WiISmrucJECdVMAxMO5gyLJJaIk+0+tCkyCh40cYD+ksWcEnUpA6wmiau883LDlD85YlGOyVfqb3D6hzuvBPHtcogniambH6OsVPikVaUCLR6AoKyKzXEi+ndyKSfodYceFezBPV4PEB/ObM+aTfJ0h2a0QNoKs1qfd4Tz8n02MxVF4AKCd3VL0ikhvNdMtlFpgF+t4CUTecm2f45lNjFtOAKUhmlwiLnHPQ747cp8k61XoUW5WNFekiG/cVHMIxycsm1PANE19xAZ0nf45nS0fn5GJ0M9GEPD/AKpdLJ5ir66S2Qffz2XkzqMv1bOm0tNP9/D23JM7xo7bsT0NLS8y7odfqUEaRRJijFmsrNhi2YaswEiHDoaFgz4ri58IgZYy3MBS0LMt4rapuH62KjQ7svcVMD2zaxi+Hb9N5CBW3G70BgYLejnGGhkFEawFzZFDHGmrRrWvEj8KaTO0QC11TH4u3ZGh3h1BIBc/qef30YiOtYCkAiNymUp8nZLx652chmzGR+850HrU77ygb59ohfSQBv2flhwg1Hq4c1aiyXgD6IOGsZ2otch2TnhXxHzz3CeD/XIdDWyDfsLKAO+RrUBAXbuAAVLwZdhSDb52ZrUckV1Sfyd47wJn9uD9rKwjgn6Yjudc6sfC9HZ7UD7ZInyDvbMGb+Yer4mb+iwDXTJ3XSWebHVQZJuwenLt8GQoJHXjlSwL6B5ArF90ReG0mMafXVkUfsnWmGV7mjAoI2JqVoP7Y021hn1Xa/MWw4Zj0jtp550TKXyL7ICFbkOKbOKamFDSoqm4Gsz57EMvPgKsqknYg+ZkMsU/xD6HYCT9Oj0yiqGFJZG3g2oJOJpkxzDlmhbTwb7RedNgYaFXqqPCzxXMKOqBLYyQkoet+xa2fF1Pbu6aKiC7kT95X1keJ38ptXU4vcd7aw8kU78yRNAcEcpSBj1tX8EjgZIuQF85xErSx6ywkwV24Zpgm4CdQ7T2QgxADkWM9h13tm9UFEgaoGhmbd+zhZ0hRVNE+pFRTzCjBVggBl7hamWTYkueDlizVcHbAjt+4AMZpa7AAXEyK4uyZWLJ2qYY5NRL4FFBD0rngKT3zlK/zRy+7IyIHWVWZNiniE7mk/ZKaylVu7MHqyzbrggZQFJLf5LIx0rtUqdCSUh1nombIomBzkwzIGr1xnuxf5VkXUrukbFR4Wglip9DHUQqnUkYmZIMlJ5BMV0XB61Cmg7R5kakenb3G3S23jHKoLHPKOVAWoZf9US/oU7VmjYY7YADbVj9Idzw1Xx7LCfE6JQdh7fHd043q6EHNHSWphi2FcZYFNbe2NXDf3MldCTvPlMmpG7T0UbcKhryI211M/YbebCtbZ4fnnp02P9sfQqxbpt5oDx8KrLGl+J9hdGFFZQSlC7cmR30sSCRw+w6SjLtGgVWQJwEyQEhqfoBgrhgf2+cCSSfNSoO06i6fT35eMQwNWFDcZeZ9Ly3gfZi4HpJh1qVHcGkZSm7hIb8/6J4rEx82PXdIU6VgX82OO6q2w7J0uoQlVgIEaIS2eINWxpgyHYrVDpqa+kWVwTFPTBvbzqupkDyCEU0mNdaCzdHiziVun9htuLWIniNftTr8gQHgmu1D8DM2K07cXLZAt7COhIiNxwniPd2ficcZTq+owSTQ3utnuLEQQ7OHCc07IPU+553ko5BZRpnMvzHKLn1iHYKdrSY2OEstLYtFcH82uzh0RskHhGi9OUE20B1oKeIKL/4l0tMgAEtELLKpxs97d9o0e6rvX9aA+F5nPOjNHuEFzD7hyHt8SdWW/buRx23B/eAcQmnOZezCiBMXkgO4AeFNpRzZdi/qWMfODNzL1tg1Phs1i9TRZvTO+EPflTSr35mMoGt70Qvtpn/byTdZeRxIRqKEQF7oFkdNeTYM2yyM4vHHaco3eVxlMFSSVueHgRERKMDyv+dsxPDtIPUZVsXug6DahJwLagCBvmUR1O24/4bsVNexnpu9FUmmOv/jLC/1HlGiITxnelDy30ukYenLarBYRoRukK4HB+VgpODdOh5sWwkavNqGqbNTUtcdMU+d6XTlCqfDwGQPzCYkbuTN6MkYwtbBKwkVcrjeC4ga8MQSXrfZQ0yTu2MhFRDdlmRzvVbgonZw1WcbZik1RLP9JQZH94eI9fIX/w9KfFvueU815rJcyZLVhyaM1urAqcIEZNt3tVEBBm82YMiR0o7zPOerqeASvLCiuTQG3D9vAmpLX0Whsk5EO38GFwL9OKLObwRbrNSP0+gaAA0UQ8+m+lMoHgt0QHmbFcgRqGFKZk3hNjcoZcnIZZ0zYr8MEvt2y5il6SPqv9Rt2bcKoIKcDWjHtuY7CrhLkr0E8R5K+JlHJMlWuZtWBhWhZOR8aqydNz940PVKq+5FMWuBfUQJTQUXFdSxXBJm7Q51DadOrBKbM4xRxTv/GGberFdSU6kenTFQvV893ler4Z2IxZPUgvU6IMqzqoWwbUjyB1t1EDvc0eMGeLzJzM4TRLN0e7NctgizYlR7BgvdxGctXC8B+v9+y0KsFtN1t/4ecrOz70rW+AJd+4xcUftS4Iu38tmewdZuNeLZtUeXqrrhNYgtZ0RtzcgB8965X57Ke8qeriHpCTa0dlYw7UjrRkVv8gFKx3zyR2Wd+7JZkJuXktRYlHHOZ6joubrBavcDqoT+ap5BeHo8J9qPPW2dsI3dL3WX2RGL9KUs6kZDurppkzID5SLZtilsKyY4BtR+yLoT1mHLn71kXjKirjzZYqwXPDjwMG0NBfQxRIDlP9tSt1xV/skU2wsT8dWhH7ttb4uZKDAyfFQ2HW3fyGSnrGsUG5ILuJS3C1A5YMP85nA7DwgJ11IHjdp7bydTaX05hRStZzMjFzDcyqjYuSLdMn8KC6efnyi/IixLY+igHUfLDLVmQsU6l74v4COOadjWKkbjX0fL5jKGKbDyOvaUuF0PXnzbS2jdF1/WDatqL+EWU3Xl6HT4TdcRZ4r2ItT7NEo0vD1eG95HZIlgBxVstjP9jxRGSU/aR1UaSkgahkLAOmJCPxC4CXxlX8mUblG6JYCKCDO1AnjnZssbnT9mI5Jjds/KnrO0GfmTgNf4Xhf/jowCGDvjIAY1AyURugJ2FGTnO1skhuNbk6i+v8A+OuVLWSRmfviUTZ5W4kj9UanYasnCuThTC8eQ2phhyQEktitu38wsYdbqCJJPDSXSfRR1IOYUDXnnyLANla4ROltirXNLabHIy+7Xj5pwfINb72ymjkEFzCfvCpd+XIMrIhpfMtkjs46h89+aLtT/fkTOc962+sddwol1b5s4aoKhxa7V9pHMpS3u76xR5DzMV2ju81PvJo8Ic4q1gv4JduuI3boFXH29IsQAVLoWywAsqK4VOlOWr6MXXwmFAVYWGiETiMHE116IfhERPAAk2ulpPZxerESJpFovq/YM18CBczsq1Oj3sz99074vz2AGn8B7YxhpX+on93XhwodaFRmpChQbd+b3yZ+bOu9IRZElMgNQZeFCAdSVcsXoIbk6CBf/Z38iidxehna3GzhwMbmVaPnzPs/GPasOrvrl+bY7PvwPlcryS44pOSmlHLWLY0JZqQz0KNs1OpMozCco4CXvtj+K7ej3JFUB+AKhenrxU/NvbaNO/+OitOQdVZy9YPJuDxhvT0Q78X7Rc2HE41Hdd1rFnRDJpcwOrakWWDhGsSoR/SmgeCz4UwaW0USe12eFPp+LXwrwJQnjHM3pnHjqY2xTC0oGQ1AxZvd60uPO8LXqc4ccJL3sJkNVvkoP+9UTJnF2dVnuJQDzUwWBbzlXYlE6rRA5Bu5Q7FyrrcIsD+jBz0OxdLIUOdmnRRDlfAbUbBDR3/ZnuwD6UvlumKpCDnsF68sg+qz1vyVt9hNsJ3rFnLizmrkGsGGGvGdtNjanznlAEEc54e+9gX3VekvMBtn7gVQW8w4XiFuP34KO/NPcWdehxs24jvEb1HPjsfNiOT3NSpfnMUZ6i26lWCrcbIak2HpAEJfx5SCkMOpEeF4Ri+Oc4x0RhcoZoiMjuo/hCLoJwXFjpJYLiAW/LpE32LFklh3HYR/sM8+S9QXgHOXo3JRH2moftscQR/QrfN6gClxqmBqKctreT2LqJvQi/gr+Og2COMkEXKOzE42fU0IsNdeMKHYagCUABiPRwX4zR4FX4ZILKLJ7G6X9d0tQMTB4dZ+eYr7Jl9FQH1unB0geKWLY8u9+nqkvZlP274JDdxhONP0zX+mFvl7JRdGcBgX+Xzg/VZRw2DckwiJq+pGz8Zt/bWwR4ftrbK74T6MnfTdLQIQmqLhxAopNeQaDFoYosgmTkLZrRHjPrnWjeMZmyLoJA7OOLuc5iohGTiZgiGDusgcgHH4TDhLFpA5Q8w+HkhDOW0Gsodbr1hGg4Ht+uZAKdzMrzkDpzIBqbBd5U6RSu4WnR9DHEu2b+N94JFikDtqS52N7TAbBtcwD3dmgIHXYUMISGwBMaApboHK5BIw3ZeGobWvDG7fF3b7ZxDEbHrVRsSODED99+ushJVdEy/5xKsnpSrT3zm5sR64FLdkaPl1un+SIjJm5KH4Tp7vff/9TN5Pjrjm3nFH66/N6OL8eb0AIOy5zZFIEsbr0cUZHcbIdEuazw2zVmjJOqI72UzjDFtfqNp7X9NOGJ3j50IwwigFYEBdR8eFhwcejRPt1P4s3cPfNOPM6983oty3qNLbeiMVlpSGJjb/PY7j6kcfB6roJJgzzBELa7SiSdVAiB5ZT6rMQbznbf//RzW1phzad6UzPdb6yRPNgmbbp0e+Cb4pr3ZhXmnMmihe4L11bVsoMbHkjCvhcNX7jWIma3e3+RCJHKPqdQAH/k1DWq2bDwXI7LLyeZ56fVIkxDdCWXzh30MXMvyk8rAQfrWTADnrGOKpZnyqhZglfLwuEbBz5VaL0aUwOr90d4d3b/77pT194wcZZcVmk1FdhLH/1Dk6ybGXi4k6MuGf+iKc3Uvs5H8lQrmeSeQFmxge1RBfOdakbvI78PhQuZeu/pevB6osJjIeMR0cCcr3NBUGrQPH76au6GPLdBmgZLSYcsph4qhXlfRUq7t13P7WKyALJ00Rwn+0Emm2uAJwTJgz9Q8Fzckw1RoKah/a4xj0uQM60TgCiA2DYCo6IJY4s/sBlCCKIfed9XA7Qo4FmE4VI4ErWHazBy1fO7ZOyMq2lwFbqmJp1zC+wl642rmFUTJjNU8vWhA1roqvkfzc+rgLWv0UPKVY+vzqr0cFLNZuEc79d+ZZh3GjE/6M1fztLgMXJfrXzYIvZZxoF/BWzebHcRzeL73cWm+waiDt4BQ+5K7i1XkuYdfsBMW4vjUzDjvrIP65y/wXwDkFDZMCjoluLOm3VbJEBeL02/V6CkZLMqeBmNcldiqy2FjhPkAyMlSiCaPJJgGFKyyqdyVTq1MXUBgs8dSXWxr8E0ngX3COfFdlydWb9kqL352s0eZEVPPJIod0ZnGXu3PlvuL3K+GMHcOEzQON4/uorZNN+GD7uEhSzFtWEgt0mwiYncla0vgllopSnAz+5Vc18dm7NE1P7RtBOwwKmuzXBmUaLHGjNKNkT/UB8mDPMGd3dKA6cPlTTmrE4GtqKY+z83UChKT7f3obblsO9n0eS7Q1TsFfQspSvYBL5Fz2W09Q+dcB6KvV90Hp0pkd5MInQ0q05lFYMz8er/kPU48xGOCQNmGjreP0oWRb3zXjCYFlXXl1LbsiBVZ4RaY/OD01iQQyLBkxcvz5giRtvPGRdFtG+xRpF+wHKG6J6wHzexyqksnXXKrd+O5eib4yI2/eSCQXxDwr58XTRiExF+n1Ds0v61b6Dr1AYbAVq2XCwXjCVuOZreGj21Ozp2PTYEMnYCT8RClvWrE3qIu0k/CQSZBw3jyK6UltOLHnPDLl/MPKmwiMkT2hlphzivMkQSoysszvZpVrptS7WVVnEtCLGuuyFBWy4mW+O6cUxD/pKFSmZ9mc3Fh881pS50ro7qoTRGSzHUTTfMaoHUESs/KM7MmbbO/r2t6/QoboRUMVMyuSoN8RDNVZMTiBhyMAmqWqM2oVbTOixJLn3sPVXacCLskYl229GEx3tC8oiaGsxWRNidb6cCatJxTJIaTm6rys4DUog0MYs535c08MjHKRM9+BKBmy47vl6fS+TRx+eMMUcKEVOW9oj6asjTAlOs3/EU0WPwp0iu/zp2AI4fl1z2o7An+wPlB6YimDx9epzOC8seNRlIBjf+qp/JTiIYvc22XF9PQMsHATBV//wj+ljw+PtPk/e1ExKI0UMCeCkAgeESMm27Mf/dq9vE6sYzNJOhVcVvC++j9gCx5cafV5LtNcbcE6K4TmCK0K7ofAkOZ0e6poYxl83oKHZoEvzmyxP/h3PG22iPznPV6gzrH2FevL87OpX5CTGUn/Kf9Hxo6USLt0S2SIt4mGfj4701CDc8EHqjdD2vR3ufraam/fRcuG6ho+VP/r76XqIFsol7DB13VRoRTUO8lx7GyHh1cO+npppACh3uK9dwMAENg6OHTKEk+iBk+Sax2bZPd6QL5MsxyOy3ckBDNJDVx4pTpIrH6xR0/rWJ8LjLt2/gdjX0vAnjZUim6QoJbK4DIBmw1Wf30fWm4othYoDqw+NSy/HlILO4XBTcQivJcGviZ+sI1x61HbnDMqsKNVsYjS3pnKS4pb6HWB1CyOnegTNm0DUvZS2KsW9yjor2xycbPo0vn2l8Fb7TQ53NbfzSEXlSWLlMUPiJmXNJoy5+lA4YjN3WstOmpDjA+bRTHtg2dw0+QtoNLh83YKUhdNnc00AuZXQ2l8pXit3I/vJImLu+kOhn1KT3n8DBexIM6bxSp7MEl335s1UKq19FYve4sR6QTxnaFzrZzeNaJEvBhsxRE5NH05W12EkJEiPHq8zCmK/dlej5Ly5/dk7Orwsu4unnCqeJ7inZ2Bwn3gzFQL/+dfr3EAH95P7LS+y12PqGP/fJ5t9+1+WmRtOhfbzZYdooS81mNnwWNt9m21GE22hlWuJ4pAMr530Q9vPxWja2xuERUyPF1WKVarFavViJU6+9XP0zAqzeIsDV2uNqUh3dg8aq4irt4d2n+M1B7f2kY8GXio1x45QCaFRIOQeHzbIrwgS7DwXzS7PIgykbPNtbidwAoDGTBVoyPXRFPy1NH/T84bN2yiTJFHRhXIDeq7Pi7SALn+4Vss3Zy8nOZN+G/DPxLwhrWzyg4qF2cw4CSwDtcPfWZBpzjzkUyprNYyQP0gVAvVC2g5vOayQL7qwOe/89+Hbtb5O70OErGXDJj4aM66UYR9WP0/nRuX3gMnHK2W8AFLg6bQeV9BcMo3AAnfBkuIgQlHEOzJJGwEtDctMhjw+QjnxQHstAasfh1ptpmDsly9s3L0b6on19e5Anz/ldQOHh6M7vxnyVb1Z5snuAmih3CuezieswzY6UgPZ+wmAOLFGYwyv/qZwM2mxN4xhlPq551n1EG/x0ZPtnpGtT3UUdR68bc5+1XVvCm+zzhEXqqMeGXI1qUjepce4ExJlb6cUoa2WU3cwEREfI2BPlmZZmoSUHhP+9eNmS8bvqe2wW9W85JVN9z5t7KQulJa/e4v6dcrnsVofGeShZz2W4WhAf+OJyyoRg3wu8pD68k5Z5pnag0jZHnTdgH7Oh50L5HTaVxqUirUfcDqmCJ/hZhbo0E9oGrHOh/MXhpX3wJY0LeZh36MJ6HP2iB3vSNKAhBHTZA8sKNsaaEc+O7WlZadVjXxLPj05hlLT9DUa8nHmQCiWOMnEfOAyQWlaTMmwmxZV6uki5nMwg95tie5xJ07VT81fO9or64+8VL3WIMfuzw6MPQcLxpXzcGL95hs31TorV8J0Yw6HgJ/Y0ppv9JvntIueNPtxnOPZZ0StJM84/GOpavHcmRk463Yjb6vQlvfJ4yTZkYCD6PNuE1mWVMVkQNOW3p7BWe3JKZ/TKG+L0+/vD9igHPmr9N7jf4J4P+3FOcrdYuam93cUSYa5KIvqYFmt5QIv8EDFa10Xi8PdZ2HKanQUtie8ZkOvMG+lICe4a52J5OvbsfsUT+X7BlOSLVM7P5YWjYUn4gS9DXB4BCEVSgTmM4SJe+W/9Tn8lKLIQe/mrqD+gQPW/wVB1pY033flkAIwI42dlhbEGLpK8+DFJqePeZWWmPbZ7bFmjiDHOWUzJJaaeDL2XiIm+SxUkbHkC+1fQAjgc0h35zCCjC1r4dIYNJh0Dw9ckDFs1e9022v1amotarPWaVWjKyMfMWLrARRYC8EIoxtX5Yltn5gyaZ+E+qz0d8Tw6XoRImNpakWL6QIc2/N810u12+cy39vGxjW3VTU38pCit8SBAnCvRITfSoav62vepvUK6JJbJYX8Luqh455eKH1yJsTq0GQLmy+KYePcNmoeC64kpYXFLIxO0tfrkVZpQISh/u4qzeJJa8/BFyRBCz8wiOTiDuLCAomEjyR6N/+iREiwtbpjR0gOhPnKrOCSpnUZSzNrdTwtI/JcjFdzGwLpohK1ptrFMq969vT6kfDg1KZYGd3nVdEBBt8imHjhh+SJLq7zC+Ndmkt2QQmcMaMKwqDTlRiRsvSuOjqV7ks686Dr2xyVyZBwsBQSkTh3vZgOmnStLWZaW6CNhgn+kVoPRYBlw+dzWKNRYJwT5zk+/hfc2WG7rQn7TFcBrvFQiLQp6PjVw2l3RCXF4GkMclHXgEzSsEpJMD5ANBvk9dh0jKgR7Jkpqcd1tBRjcn5JBqoTBQCgMuIfHE6wL5/RL5myBcQyYBSO90YeVD40yGCnOyE6tSbJPIik38jDc5QUcH2ZlNvcTkhlSGRUocvqvJThuqnJR9lIyqSGjXuPZtZoa2QU+vfMaFabkrmtyNJnIcZMvSNfts5sGjWuUN/Mb8vlvN51bSLHEWLyendYH8GVp3uDbVVrLYaIu1CYY5Ec27iH1/WjoSNtp5TWwZG4L1hGcK1cRpguvSktAHWOIZnkvLr7nKn66e8/SZtt4pEIvUCRYY8kRmDvpCE9SSQFi7LawuiS13nPCuKvJIhPchiXPYlpWfy4sUhzJjbL7sx5ij1Pkr7oR6ZM1C3sAmNQ+VisBrZuZ97CHKei5jpjC0Fk2/M1Q8Ea3ad6VB2DSKpVg1eZYxbud4euw5Xypp5c14KNH4CzNDhdCs9UuLrIGlrMCxWAdGCphplouDdljjkg15bCrob1BUJKzxIgIPyI/kJK3LrI/B7VGmIN+hm/l1+XcsbdMmi2qjOu/ayIQcxOQFwo1JjbENMHiNVt1xr5BuBgZUpL1OEZiC7+F6WLd+LizYgZ7FPxAcBG+D+Pgh5bjg4MD+aT0KBCmvmcHUpUFStjCZNWqPSvYqVP2/nnZDjSWCQPtZowS50l4sxPHwkQSMbmkMWpfFsllNQXBYVZmHLqeF6V5Z4Rkhvpndzzobm5q98pLn7pdV5SOzk9H2FWbYAmpMk+4/EomCh3WUpa5bRL6BSOHyyjdsNgnF32XxEPdOGe6AIWCIBXlhnFt9w+ipCdXhVvXiot1k0DqG9Bl8VpX034w1XuMRJA9hP3GUWl3l2ZcnoFFwQGV9JGWNuQC+gyTosDzUPUCYuRVaGP4B5jqxzn5QljCv42JF/OhUeo4Z3NxLq5qs0TpJlzmDXCNK9IITV8nOOJMGKRhc8SK4hWjeAylfAtTlgJuG+nOq7okQL40APgNBNh5oksUqntMvTy2TRNI2KJOssd+pAkB2QoYDXkwsOSF5rscbbtjpMDDicVqKFiooktN/ki5cyuRMwHuwFmNgoF/VHaThZN+bABrn4y8Bpujyzy1m9ksyeDEj2oe9RCaoLMc9iUknkwwzFUJ7RMMM1cEBM2aFc2F0SwPAArCNbHgyHKp8RsAciRTbpxTRdoChTO+/R/umC3vnV9moOgwsRMjvBDI0XfzJQXeu+V5ldgrnjHqjIhe4nUk3RO3ThJtlssuqF0Ymsv437sdKHuydy2jZ20PVY+dX4EcTHTVSRoGH9Qaxb0ZYDkVdpm4YBYsfhssMTgfdP9CDIoPRiXmAebmGdMUiF/QkerLO6W1qaH28VT8RO+GxP6llqZx/A2LwY+vmhPxDQrXDbygaB7SGqQdXE/e95g1xlPW+iPzbD2NQZD7HBDxodfA8rwX+J+uwwxD5mcCBnakJQddvWhrCs7M7fj7jfphBW+aMmABXGSxlFuTHD4bt+U8R2ftFuVhOURbFqEN9wAoJZg5Z3klro0BM9HcFChXojemeAj34GINAfxkUBxquHhS9ML4oxVdVibR1LiMYObyAUUIJ8ob5pJVBg4eTp27uztW8HXQsysNZq4wEMtwMoOVoKwxZ1dTfqpOL5seacE+QRnzEjPZIA7tWM6+qU/lPHf2HLp9KT3v4hlPmj237gzu3BJ3X0kt/uBemJRXsf50odR6jlOOfmSdgI13X6oGsKego84zzBPV0DVmKMihbRpHWL6UW+AVB25NVWacxQAUFQXV0KAoM4JxI+MvBUZXbAjKE8A/9fD/NAhMoB8LS33GcAFCkrkAk0xSI0JubEVr7hGOgXik4N8euIy/7bOggPDADJ9RIWGTo7YbC3EEI8/4QQ9vzPVxjB1QT7TZQfUu+xUTZqSHCGZ8CsBHbvBApv2Ud5QnH2UQbpO8LRdQqihQwMzKw2Drwi86qlUaDHAE0cIl05gv+k1lV5OHLaTPKrE6dOQB+coyq1tCRL+pNgx9xbc85RcVFGPwwgndzi3HgGXiJRmA54e84ts6qSa+8Vtew3G/vCwTdbO/x9Pt1JzSXJLFRRGMuGL0ZrgabNUPqS2puYTR6FH/GWpHQNPhCfzKLktm38O9/+NOSf2Xy98bJjn4/84eXhRl1dX1ouyqVlgrZd+v+dRwV2tFdxNaDKrLtiiyajwiK8L6EwvpNyRDgGC4b7TVrxyZnN7JVQb5VuOjOCkGnd+1gOXbVZSf6yHVxekn5FAp2L4x6z7DzgT5+qicDa57M67sSmD1euTdTp/5Y6ZF4sk1trKJZ/J29OAigr2QSTSEqtDB005r+2gMP3D2YdQOgPzkEoqeUr+vSW9TP/XvvF9Oawa4udevCQkL8s69qr98bAd7J1xXn1DysUX/NNuPat3vULd9s95XHfC7G6EmXGC6tqGShNc5q1krdTQ/RmyOtmpDGNQ1+Dg1vhlvvtnfeMXECxR1P7P8iyzxgw+gi++Ouv1N7d11o7sGyqeqH+Gu6WjzKjFmif23BAp0Dc/JgwTOgzUIb7jvf0lrp2ZOpXpQ1p1T1GAykkesBoWgNbcetTuGU+wpoxLD5przj6SPYTdTRsdsp3v7yyvV9roFcCRB7tBrZLSxF+nd5JLo79v8clJ+yIv+71/aOYY0+UcL6AvPqfjSu0c19a+uML/QL/HDq4EhN2ziTxCt09oniJOnXQUduV5i93Mtzc+/Hy743ccWQbx9v/RB6H4HC3b4zRIt19imyPqOaWG8pvdKTlzRkCKjwO4ntwAWDmbX8MVaM0pC4tleb+gvp3E2cJvbDQ/miUN9pI4I3urUw8bEmR3G3vHH2Cou1meH39L9rKdbCowKh2ZQOuf4B0BhUFR85fnfD+YtC0mQ0D2qWhVZBvUshHOWVvaNv89q99l991YsHy4lu+EsuWMeKobQfcFuZ5pwkxGCwp5Njv2+x//wY5z7zyQZNkNV1+QdZ1OjYp1A9V/l+rbJgkTr15tXv99Q96+dbxbff6QUGZGcZe5f9c/p+ynG1RsiDe3IW44DRSMUdkNVSvHkUDLR2SfFLbfFLLLrZ+SSER09T3w+Jw6zcm75gjDgNrlrvwIhJNaW2D+7eYYHjofDFWBx8m+Hn3T8FOOHXu365pcO3yzKnnW6z6Q+W39jjyP+EHMjsIbo8AXoiPQ/FiD7xqVzw+Pp/98QbjagP7MLgo0cUW4UMMeu26p+x/b9mDIWW1163P5/AMwvtvl/i2BxBPJ+ChqgnNU8puGtv6awCPlnPsYdG+QAmPMAHaz+G/nVP8QJD/B8IwC2AOTMNweI9irsgLM2k7I5YwL2Yr3oDkvedix780offLNyMG8GSK0AtuOS+7Jkg/neZ/958s+bvv6n20LYIOFQiJe8bjR9bgRTvnKPw8qsNsTNCE3t90igwJ9fbAp6mlKQZGT757iymcgYXCDF4oP68oGCVDuDeAZgP5HfEP7xv2aLbg9eHj67BexROadCjZvUhac2c/11MMwzFalc7NpxV/RzkIkxLTgq7aHoD7lNmdAWi7wnXS8Ml+NgJvATOTYOhv5jQ1gRqEioSFjLGo7iBWuQBXUBT9y+Z2LGoQYpG1H5b1TjqmaMm6js8VItxGY6K9oSTNuPyWHccej/ZXQipE4SgPqeVoaMmGBrHjaDKR4DlTbx6IKFiwRmGeTGAPZ0O8zNWZHnOhxZJ4PK5JilrGOspdeXyj19ye1/0rooX7RtkFNpUcIVCEtXw48gyXHcLvenE/9++2r+J3q5Xrb6EorKe4TgvmGAQ++KkqXyddj3lUmrVPUfiT2gYhM3etPW6AFfOiIf0TkYf2QX9OvbmJ7VmdAp1U0uZBrg0i9rnx3viU9882q9Hee3O/ixSVGYSPKbhYIPE1JPCanHQdagAigGman8lDnehA6Kj/YNocRGEc7cehGJ96cUerwlSZd3d7SBJ21Ip+HQczJ/OoXfwJPSda75sWiunI8MNgJWnsPanFboFy5FOH3RMnc1MWR6uHllMQUGmhL/exvN33U0cE0eMAgzAQxpgUfqLrzPmggnMXsOIuzcodgVDfKKb/yXF0Nc8Mkpn5IqveGrOZY+7iIG7EO5/8262FLdC++fLV11IMllVw5sWvLdjNStdNx+mtCd5p3Wj0QDH7woXxua/G2SA+/LFa7WCiCn490OAn6QKtbKOB+5JM9hlZNIbbcWrcNVDdMl9vp1eoSqtmNggtjs1R5Tyubwmk+jGTfPAM/JAGpjibxkPkJmVNrt2xRxOjCsua6NEytmNu5aGdCTd8pXsCciNk+MQMv6/AT49s5kqsqPRfP3LBpgywQ4gU3GswB8Ek5ohn2nGJFQLxvP55adV9/wdIPZ7OYihKTJPu3cpixWpNsnH9mXHtzuZOg2kuNWCNdNTDKrqLNj5GZsCJBBGalru648aFEX8rM+O4VtudOdkzr5Kh/+ZcR7Ehd5j0LcpmiCwJ8a3egdPcZmJvkcyZ6hyJh1gm2S3G7TawiQATvVlglhj2gRNqtg1t/H0cyuP9/ZGIARrJh4sxgL/hbJ6G8S7o5Wd0G3GAt7oksNRYH0CNDA0iVTejp0yruiT6K9VSQwjtJi+MqRmccKZ0Ul82B4Mz23Bl2YQENuv+iy2Ppkk7JqMeWxf5Wna1mrnU17YU8sx+jzxIu9dVM30Gmv+SHl1H5QprXDD1r17RCrzYTfWO/brc9l3yqrUPY5ncsq93BDdtOblZpp5mNXk7hLu549jTyPMeg1hzl65CZ8bm7MAn6c55GXwiANnTUmvFIUsUWifNl1VTdSJTK5IdGgLLshSWj4iVS8z5VMb4itm2JlvgIZDPF+vowYInWqstaKXlXoCZCdwOei+04Cq1FfyNZSu6mnOUjA4NBSoGhtG2EKhH6uKkZRg+vInPpzSBfcMZ5hPINE8fmpNeXJPbkJOFAtmdr+VT8z4vc+9rE6GxNMfAi8qPMaUPVRYvp0v1vxXOlfH/kBPBubm/j+/GPW8c7RL/S9QVCSpiP5J6PG4TUsD/nwGnB/9Vrlxsn24QEtAbGwjup8lxqvUGqwFIHcKuFUJ5PeTifa+8Bf7eqgyC6FFSPB/Lj6leDznGp8xK9SsU2CiF384BTcRkmyrONFPpKOkrWASUPueTSbXs0JBo9AY/ZbkHuEwFADaCTqJz3ePTatO1Cr6lRbH/QTXUGD/zBAbSR2O/RM2WFD/+dQdxdxrYYhTHYfMvoaqK4emKT4jg/dlcOAjMD28fKQibZXrfW/+2iu9B+N5mPRMOCBq409nAMuN0ZggJeHwPNeHNZgAr9JQjBAl1W8uajuRPo2EUgqut86RmK+vlXLlBF1wL4iBDE9tpauMMS8vurMmbt9dytQ9X0AEcIWnox3OkGIXK2uvJM/q74JJabG+696ff9ZqoXc2HQJQ86JoS5+69SgNTGhaj+taLD2bpRkz4BGt3j3wooC8yQ2TGqcRfzhTF9zpELwS7EofpwKACs7xYtRtKbLjV0+ttXPJZzQDtfPMXr5BVe8njLX4f4ATHuqWgUH1gNy7dJH/dVGAp1zyzPPnClaWA/nZvXiWRVnvqp8KZRSbK3Y20zVcCt0TDNd7SL3vqV+tT2x8JtgJxLs4vkPSB9hZQTENUkHMZOvOfbdRNHIpJr3vcJDed8eN/tOTNr4BGE5o6IV/w/wLFw0J7mUv5Am/dcmfZ241jdYxK62JXCsQoJT8n4vPV5PyVWDE6OW0ex5a3VQRH8ZYH2Bh4zmtQXpD6EmHR/LSnFuIiI1FJBBPNgN2l+TFeQaVrkRX8uSshkhblTk1wqav+HPW5Y2Ye8rgfhAEDwTiAXLPEjHsZh4pzx0Dl2C/taLjFOrjjfQLh1VNqjMo5MyZYn3pIAL3fMLUWif3InSGwp7bSShrVsHmLPM/UE+NzFStr9qgxbaebUbvq+eP8UFjnp93aIYlVEjG73/hsWgLEPkIJ1Jqt2nRniUvr3+uU+1/bvGlYuDfxqVPkkEE87wkqr0euTTvSlQ7ak9eT2tk1P0gmXEYzB5nIdWil6aSERIjw1nyXZF0N0n4F8Y5ewi29MN8J+DhdKzE3zDk8V1oD4R/bkITlh3VP37Mrpq7mASA2I3podVxQbavklXsw+n84Jp3Q/BPu68wT1WDLu7COngjApV1p+C/ND/CC4yfv21dG64LXpYvX5ggt4/BjHe3776Yqfv3bvrvgar0DMAGr8QtnvrQzge98cdc3xo2h7jrk5suDXlf7+DRau7xoahvfKZVx6TmU960koQXaUPJqqFM/xNJ+bC5mDdihv5iIXgVKq3MKVttvccOWMlgkwfOUzg17wyQQr/fG/WsraBd0XlFrw7RcLYQYFPJz4uOyliY5UumY8XSFEgXObZtEQSI2YCcQGAx/Q8vKZvdEnEG2vTv/K7Sm3Dl8O2QK0Bnls6k0cRG2aYMbN5EoSZcMPzRQGqx+ctCF7x+WaenSFaZ5+HcL3Zc2C+50ODQBgSLUI0xGZEVIvRkvloEhuGlSaS/8AC0el+IlTBoGH1iIVNLMKcTwsY7qArhpuVfHlRluQ6scMdmvLmWbV51SLvXrzWbbubkA8nKlL1z07NrTWAMAaB1mh+9Kl6HkscVwPffZNa7SWzf7wC0dyWYRmuMfDPQvU4yrATTVxAl4nfsvUPxPu2ZL88wrtZk11bbE/WTi6gTyyC6oWmOOh1LRq8Y5itQU46oMHQiF5Pv+iJCPf/RcXfTtuDg2HT/dW0kRlB9euwwPKrg2b7P+58F5jj57OHaqTw71JLLueOr9a9I2T5O/nqp08cN7j94pG7Y/DkY55SqS+p0idglv0PiODrixYe5tM7breuj9Ul4sO9L1kTpWz7t1qgz2n6yax+karD0VhJuEoOHr+Ogwnlsql4M2XgzCZhywc0hldNUXKWIeOuA5+/PK/wHV2dC4SGoPFYhG74P3yAtnfTYaU4STfjScs62i20/iKxJChACDDC27TaEicDLi74lItjIpvwvsWLjq9jb1YA/vaS6COPLunLVqjTLYlVbPnX86OqZwUrvJCqtR/Mx814m4MxYt0OEF9I6ePQJXMa4+XIP9E7yXXZJdjbRBRLvs2wjPxftQKv9qw/NJt5jfGIKpiP9Ip1T/3dWXqGpf0r3Pd8vpZl7IUqpaML7lxRKC6cANKpuWi44iWafsWGQa48sgNUVOyfBc3PSnNLktBAZZMYW9hTeY0cu5L1UpzRB0zKvuRo1aEnxrPbWhQ/RyB489sht+2FdNF80BjY/IBelKkfJ3DHCPkMg3NbFhfbbzBFDTiMzu11ixv1rgVKyy8cpvCKdYqwoqhDW1wUYm+oGls50SFrgMJkiJsP+HtTyuZWi8c0Tov4WxskpiUXhRKxUiC7OH7alURggBcydpVocgHjF+28Q/Q7l9npojEaveAt6aYZUU+BE7FdlRBsuVb+Kz4lhWRLB/lKROnIuhbW4uKBywLgQMHpK1PRqxJ5JHb9915yYPREvnT6Qysz9u+H04BUKaet9ueDPf1ttw91rTeG6pDSzifa1Fq3hFL13gyo+S8Rub3Z4/w8yLRUy01TYEVBokQfxM0GvYko3yKDP1LNoFuACKAw4+cu1tp6lpWwB7OTUUO9RMp8me00qit9k3DzClApghQXdS2mI50yq3Q10mI9pxgysJowmbT0o/0bzP29uRSbqjGS8Ikp+qwUckjEHwhE5FWy8DQzsPBnp22p5/t2hwmyVMWndVPgkaMF8MJb0nvsuNOy8A8V3qn1rIUh+aa8kOP89xUMKICROLd2is7xb5aVTXSYmZD4DCTm8MlJoxEAbdqX/9CzMEbxmlJ1GnCIyAqWIs1uOpXC9ATlF3h7q+PufHhQc33P+zU3dWIihjEOIE7LGTJZHcYhh+fB7LHTiXlfFreBGc1oTMj14KhbNX6ddwvzFZcScxFPYXLA0+4ECGf5QcWEN53FubpwXqEQwYRuIGQc6kaGxa1ELQFvN1TKHr32FWOQPo7OhWJDHTf/YjHAaAMpSMsKYjqgMlXr2UgRSTknKXyZ52WwYFq8UCCUbu8UhhvoyiXeOU9ESUFR0iLENyZXT+G+yFlNTfAJKH99nzyDfTFUAHYTYddSGCA+ThYx2nScgnFE2IxQf+YadP/HcgSjP8ao9qjZ+CjZ5+NWsEFJtkxRoqsCFSch6/STpzwQrQny//iM7teYrndKBWIBQdoQq6jLRQasKK0OsOxZeyH9q3Q7MPFSSwqXDd9XCN++eSPPPaf4aHL7hWfNnYQQdSdEyG+R8SxlF0q8QwtXp7T8k2Rcw0CilmoQapPXmcLNtYaSVCGbCj7ZvR/QIF8T7tnnJLTFOCZJPA6mS4GhDYdpV+EqjoGkK5Y5cYIS7WIE/1M2/eE6bFO/Xeede/VZHU4TGcYZeV5BlltvQxY9HeHWEFJfKqXds6Het4S5DqH3N82TJlnXudfgcA+/I0rwEj3dFofr4Wg1jpo1GqJF7LYJPYkN0xYcLT0zBApvEKiK77wSqoojHwXACxcZLDhyoqJ8CGL7t2fz0ysoj77u+/kdequnXdKaXK+5gIbJO6wx6NIEjzVu34TWny6V82k7DJDcmbTxrFAPFZbyS51Rg+AlHwM6+0rQiaeSPjARfmNZZXejOhjgQXb1Ry2Xk1IhhFf9BZnnfIQ9zkeNwxUWBDhi/JLwg5nW01BYniTCP0953oo8LZzYKS7MZFEjftKvA8sPwSzkLBkpPaKIhbU8ABgAoeiT1PyMbuRQHAADeq4kW9LaG3q0d2IjYZArsEnAxgWsAR1TV+eBXzMT6vMCUYRZlm0L8iE1cNgS1dXcs4HN4+/JPIRgZmCQDVlZ7Dh5+msUQWpdLpyLlQlg1kxzbvEn5njBxcymSZDODsKXmiuBPrsy5i5MiLFhDMq6AnmbSegDlCT3G24yQI9VPaIGNUpYTWNK//fKDowaxY3RZSmZFOTKdYdwyGFKDEi7iIXjrjcQtw9c6Am6m4FkXChNfqDq0T8qhf1GN9peGK0wXZpt7mrDpRHLHsxFOrXcwKrHpTKg2yuvFtY8s+TEy0qw+NEZCo4gx0/nNOpQ6EGNliKFzNGcF6qjGT0QP6RYAqpYCGMoJrHeyKIg8c9XzfllKfnqYvHnxCDtqZKb+ZEXbeuAFTxYMMINvvShAdVAV4RUPT8PGMyLCOWKgNRNx4BE+lACy2IGRHNlNoLJIj2RR61XhaovdssV7bTJe5hQDvkzIr1ZV3WcKqbGRh4zeMVq8FTdJMFAYf+OFuoc9yC+8CifuPy0CN+PF2dXBvLjvmN8X04mxRKmV09vb2Ze9YrR8Hk0xZOfmN1dgZuZnjyScXTXa6NfL69VM1KasDsKUjEkGgMIS5U+RtVTjtTbhy8GzechsPNKHccMZCAc7JyUFBYFjXMXc1/k+NAkDvMBoGQ4abdjPKaF5sYP7flgv++5vG8kqEX3Y9GwmgBZzr2hGNB+NzjMw+OidYpDC7eabz1Q820j2XX1qkytGON6yqhhDkHvRKMjefgTc+jOFQ56Vzt0lMe8wHGnRUuCeY9975r22QhwNhE+zXNpv9N2ZR3d1ix9VfEKexI57LhytCIVu0niqpi+MKLsXqq9wUjq2LyO2AQR5r0n8GGG8MO3HvXPlAxJuuXhiXw7PQ4tyegDXbc7LVwHwqaJBQ9pgrbDnlA928kKyruODKWxYRzO4JT8Ga/yiXt4qVwhaxxJq8hLNfkjTUCGDaWaIynANGMzlM8qjVqirHoTMnOJ6vP4vIFlILjT0ZwuNolxoLwTD/2JJzTwxBChtVBn086419tVPBzRoNrhEM7jnYc52GGnKvipyRNuVkj/9J+I700nntmeErkPc56xTczY64fXDa8Tbhie5pQf7PVA9xkRrnq7Ya8AtFdtZmKoE0hi/hINvL2RnZ6HFGIDNrMadjC3Enqnr1M2vrx+eAPhdS43uHSf9MbvGXbNRqY9h0kPK7Yy0mbS6Eri0q745FYvXBTUUWBvf2DXA0kHwu2IV035umD9lGpdaWWp1nuRcqVe8qpUdaoFohGbyqCKm4g2CwPz2TXoiHhU7a0qHQtK/tE+dtlLiKL0TWqZPe/CnWxuR4l2mnKUyGpeL+i00aO+dzloqcj6JXDwA1/dP17M8R2EDoBuh19eP3pmo8m03+u0FTdLeh9thr+wBQ6AW8EL0ITucocqdirFCRYlnvkV378G9ebwfgWD78ZotqiLZ+q4bTQ8NQBUwNnxF7kcVNPwOF22LKoJ4Ekcci65d8vYHiQVp/XaV8Rjtg86ksib4zJwTqkH6gS7QzqYu4naKV+vu0HcqE/cteBGXtHTEqYQ6NfSJnj16KYlt9Wf6fZarz1lnLZhzxJbcL+GMRvXcfBY6uLFIzp2MfZmuOWyf0pwgpKqoq/U2UYObQzwo3ghHfUNHuIOXVQv4pU8ZXH8st4nuriLLyJmsZfOvEZIhmA0vPy7opxnDuqcogP31YbEg2yWGwMad8hnzC3a74U8gTb96aA56uGKw6wzq+c4Ck3Xi36mGzvkKnd0HA48A5BAOQRSQXndAGRcuK8Sqh8gaFYgpWWd2yoNSMItCeFjTh8R970N+fo3QWG6XMN4spLQkPJL96u+6qvhWti4O+Do+wNVXr8kW3fvYpHcn6qXfyXVdBu82lvXb/rMtT7G7nYXURdU9Hu4Hl8tP7WQl7U67GA6WK93OUzBl0EOeAH/dOFK2RlNlqgScTA8FE6cvo495k8xqL+DoZ8SOa9dm4hCP5wIWD9TWfvGvi9T6nXHOpGzdfUoL9V9ZP5NssAUQKUrgEd+eUTXH1DnIJuGit5BAi6j0JX0YMwiay8IGVCsTXi1LTmseHXoGfBZ8Hr3Aq6Fq/dr9yLgFTY3U1Yz2DRCFVra8XWpe4ltNKji8rIxRXQQNNIfI60272aODgCZke5txHxHNOadZ/UUOL5QgP04bEf3NSZ/nqc2G4MMjoC42zEYAM4U3goo6pglpC48kpueE5E9OSe+o5DwtJfrycqg+ukOZKcTw3F5x59v+Pcu95QyNmIv8EGyRSsKxTWIA05daMpzTe9rGW3eqHMzvZhOW5HUJT+7pXVTXj/rCjjdLPx/Va4ewxx9oh4vIAevmPA9TzJduhQ0cUK4FXDJv0nus3xhwDF+IRxjXuGP7onLvmhqPqzwxiCDeuEKNMucvvwp4uacTDyOTxc0QgGGhXJLFzQtWD9TO9VspL2JWxwlnHX0hs7FHS3wwWMN5uLWhNSK0CfD22qgrXHD5IJpnmrze36KxxWUfOKzXAKGwKcwdXCYc9hw9cyUM0EvHkVGo9+V0NtcC1iJsnMfqxO87r4/cdJ0v/fhp/QIuDhSaHHDcOulJiD3l7+iy1Ha3d2ou93Tpu7d93ZFeXb2kZ3ME4yozSli6duUkNu3VyVZ5XoCLq7E1TRr0REMfZmvC6ODaF+sdwcWjOkf6IKE/DECfeMwzl2y2wTKzq1aihVrkwJ2b8JqrG/OiQxfxnaj3Qx3ZAF/HM3G3FC+4ZwgJs10nZVzp4YVEZW1uMAIIVMk4JzL8orTG9keyvki4dWN4HX3sDCcY+gNw5G7+deYZxEPZg3gJpiiMebKjHk0yVyZAcgfBvSEiZs42/xp8RwHRafEwhVMKD0FjuagDinBccsV15p76UxhmPjtWrA0k1v97T7d2HRj09q0Os0StQBaY7Ijysvjytn1QjAdI4CXFouVWH4dxp5ZjobZn1MzIiZkRj1BDWujimyMTvO4zuDWW/lzj0Qm1G3Kx1TD9xBibMnkVawjjtfEV753aLXdpNrkPgZe59cMx0c/EnSs1kvrxuF1Qync8tZ/fw0uCdU0IvafvMba2FZjMrhug9a5GDYK9/K1TkXqB9CesWBOfbJNjzDHFdK/8/7rWDyHFHMaPblClm29PRcQeuyfOf7Flt3XNojueZWu16uWnPjWMcsXsCqaOsxNtHgP066NZt9fOH2txSW9yW8Y/fXq/UaVPJ6hU1olbKm7Cv5itQ2QRbhduUbuVspp8tXRJiYOJNvlB4ReFQ8Nh/J7yhVm1ZMXbnJC7XZNZZcqzrhfYMpBKLf7mvIxgQzfYjCU5ey0UNFyFrihU51qyS5+I9xzy6uuxhig+G7xB2ypYd/2wPfO2Fyvf7jrailx+PRfH1x7eHtK7RDd7LFvIWSPfNL1FsYtEUCi3xj3VoVMgwD30C1j5fw7lakOb19qnlwGGuyW4zG6bq3Kuyt/I5esBF/dENB+D1ZEp9ZxCh5PIEtVeC6YR8nrcZQB4t10sbDpsD/pcODgSlwq0DquJ5Yl+g274Ec1IxQ6Kr0rfDci2onIMNRdA+Yxfd0kwdnJP+XSy6UTI0x26p/VjgmXaGKSF9m47bbBt3TzJzA1Kj27fzgFe+iJ//gU+MlXm7ah8jEadla7dH/1z7Hd+Kla0Javl2vzZpWfihzXVGkt/O1eSuhC7U1/0ksJBWwRzwCA1F7rLwfg4aNFk+hr/8yZX2zS46fufD2zT82/NFJtTq2YtKdnnZW7NpNMvRgHu/STzhaivU7uukmsJ77DOjqcx8tCbnO99mc0zJGePcZMLdMqKRwDxYqupIxS9NSGd/4f3KKzJLxZj1sDV1DJj3pbD5cXnyHbMvp3WT9v3zT/vUp+CuwTyTDiQzCIuCDUEFkCaaPH+rB6ILnF+0PgOe8R5rh7Epw1796Vsn32Wdt6ImDvAr0bpVQc6Gh+ZtXNOM/AgP3HcDVXi8cF7fXGiZ1ZRdSxtZAwBEtkQOBLIYciProR3dx6X1LMTtpHTqGFzKEFm91A5zxZXkUEcLlALC/FUkZx9FIb/p2cnrLOT59OW5dOWxveGfnsXe3Dw75tE7X3z7/fjSNf1+Zfnwq+7lwfTK3uRUvBm6dx2EGVfv8U9u7bmEePmN2vIAkqwz8AFzzBQic6Fhb8JGsSSqoc2bFuP5nNP0xrE+0f1a9yhTZf4qpunnWbH1/1V/3m+DGe/3H/Zvn98v8WflRcyNh9734+3v18uPv5e/Wi4BeTSyUP8b9fXDr1i/oYm//zTwv/yykXhVvsdqv7qzjcxNNt0aiuPcQ/9YkG/xV0IiF4/CxG+hMY/1hvd9VybL+788fzi14z9Afvr0B8601pI+MrrP/4p5smWdk136g9jOaaGWPXsTUp17PxofE0O9o6MVyFbH0YoSQfQHzNrWv1xxfSPp48HDfr26DfuelhtD4FuSDeba+Em/loizPjs9V2CMqZ8y/n0w1C/8yhwZ/F029Iek2nK+7hfASeupuVCvlPsQGirqPi49La8l2/Lr3iz+9pdUajQAjXf6f0x9Yd9Rve0IsEaiAVLaoeX9TTpQcZGZgF/K49rWOcwgya0+8LVA2Mmtk2+O82VA20KZoOYdMYUPxP+EkkD6bb4odTkccdUtC3BLUGUJPfJM+8WhV6BuZM6ntpW96lK3jT6raGYKaYeEQW8/T9PlXxc4IqgULhzwuqBgGt7jMLthdChcm3UQbw6qNVfbWKAbUH3WAsgI/tEy+iUzjuHYpuUafux/yDE166DMx9/KtG3YVim5hPcoiy9mfnNeV1KQGoM8bJzwsVFn+k44CVOF4tFJfyVxBKX5BfDQqEEwTxtla9kVhNyfAvJgo+MggIQcxyi6ahqu3KWKVEHxg1Ds3LnTaWzUSYGogLKnXwgeMGhvz1huLvXNQ29IX0zYciFyFELhv9qUUV8RuIOhfaA+UHhLP23Vc04C8J9V93HSz4frzfpfWbKdijg67amk4sX3U+KE9G8+CVcP9CjUv09Sa1rdILIN/dOVXrU1I1WtOanRRZHv3aP/LNDKx9KrFu42tdOozy8zOvYVOnN7sxWJ/rTxcPp6evwW9cNxaulUpN13JAbZ37Me/aHB8czQel8k9xYVrihUv/MIf9h+BD8pvfXH9y6btRGyAlhONz7lnFQXjvXbcyxzKZnE/an1lHnN/O/WsUTXmRW5LuEE9Oo8nYkh/dyqQMJeznB3eNpMdgXqG0LRKIlp55AamrppLI9oJlvQEbBU9+YZRH3p9UvNfOF6RZj3i84H6POrDibE5OGEO/VAxzj1MTx/g+XUSQXoKQGpU0ku3T7yuDTBT73ePV8Yf3U4QPaSQ8055UiWBbWf/zZqy/4aF+uPQPkgAJr3SbnZVT4JLd0iSfj9G1Eyr9Ku6N/fK+q2j7ibpsxNiOQP0mdxAj7+y1zW+xIMlxL1/hFfdrxvktms/hXcHA0Blp9t4MddT7XPwlag7JzvUySuyzSNEdmXpiqxRU/nP8zkM6r0fBxsQBmh6kchrweTKB/luzkl/qR5pfRBQK6z8Qk+g7+fi99K9tSr4Xw2U6aI+vTTMcmBw3SlWTVIS50P+DzLVbVe7qsNoCAXu2CUgv4xQkNdRdd789q2JuCqeI+Nk0zfRTajB427BsKoUMEXypoTQaE047tnviEJfd+XT9jPThP9KfEPZ9Q/izs50t7h6S6WLqpBJdPqmfo8slPpQoN/CNodRHqGngykA7l/TKFxNkiP0A9CIJvqARaZEeA9O2+X0tWv6B3Lk/x5k6u5dBFQO5+iZ0yulaplM5mvhDxE0/chcExQbMeeurc405dw1vzRBe4j/53k7nbML+DjVCGl8afvorhJIN7OgRmg+Bg6Q4LD3E6admo6Nc+NGEnN1I19qiFbBiZ/CkjsSWhpxD7vlgZGjTDkRgHaR7yEUfNuBog+6FZIT80oWw8dHUhZ/54OuCKc+h8bGr7xbaJkn7p4x2qzJBn/pHtiB9dhLim7Zpurpf1VjdNeHKHPmPSAK1GRp21imzDguuPgZHA+T5db1pou4j8W2C2DeJWBOgLyJUkmSgt9GixbOgRDJ+zn9DuybZQG6TYbH4HCFTNTg6xBaRmDGpSwHaonwPattIwJJVwbSrscOQRyBoVdpDpcVLuJyWYmJIOrIA+RyAZKVFm/zRisndK1xcglnP4AYX3oYRvarOzk76filEWcDWyQ4db8PEorGS/lyfQ/pulWnByH+F5GVqhNkvLZaN2nRKojtTPjaFdvK/xwq0hq3WkhiEyFalfomOnfulUV0mvQm26poIikq4rXDiCs50l7cPN+LSB/fbcrLRRk9CKHEbf4Ip/follpWwVaXhKyjnPeTmLXxKNNbnkqALijbS+PcAbO8aVssmloQcS4reD2p8AU+9zajwLhQ5dVU0iJx04yc3C/EzON2vDGAT5ctAnWsUJnKxeV4LYl94TIG72/S+D8fr9CxzPlzWugne7t6K35SzBJNXhdUAQy+JJSlco/Ga8WQfcAW4ZV9SUjdJj4b0G+Nzp1/D+zHgIeq/GQ1TQRAn3rvKG+fuL8GlRsRtu8+klNZcmnzH6Kkcwz2O+hIjetNZXOYRscGFwBhKPbGAwDYsdcic4TgV5XfKGktQXkyCiXG0tIUJWvR0bAtSBM4zaxB7G84vGtkaY2EhaLnA61b3YTTC7RT37fZrMF3iBSBZmHOuBof+vPYWk0XjV07t1Tx/ol/7T7IxLbX3NEO3P9m0BJzzqI3Vd6ieY36x5sIhr4hnVZ24Ev8EA6w27EjCfiW+902yehNvIUMbNL77Ssn+4n7v1XH9JRf4kPVv9oktcgcttmFi0UYw/br/0BvffMGd9eGR5Nn4qT3vP59RyEAvdGSVj2gZa+7W765+1MBJjgN8Suzs63Vw/sfYMmzkT5xI99sj6SBcOBTffoMDLoFZuLhL34KRVYoeJaaT1RYJsNBInDYlg9Mkg4wAObRIWsglfxOl9xLhZkRFQ2OIv26+AC+SQJM2WPR3I1piXPsQaPFQItlCym3wxQlSXMbwAQSE2dCuceDcAcnsw6JXyMTVb/9OZ+PHuKvaVb3F6p1PjeM8p/+Ji8bxscf4JpPl2S7GoHc9i9vhpA/vvvvlpfP568FnTNdp3h/biJY1hDmQa+tGjdnXW2kVj36ATf/aLiUJr5Cw6dXF+RPXLg4AED1nNs3HFvjdZbfa4mv/MUZs5k+2pYqa3Gj2ydTmFFVkn29blqKAbb8u2PhoxadTQ1zP9eUkhFIL4/4Oj8LUJR/iQAYg9TB+FnACDvHe/KUSeD7FG0WBUTAnGy0034VjnvQYrGDak1eOOrX0n9T+1J8OsxwcKMyBNmXAEm1hdSGIJDL4in/o+2ClEb4UhNtI7qcKsBUFIdeh7XZq4Ut+ninevolLBO8hZRCkpzPTg5YDbCeV6PA5+rsp0axk6vH0nDo6UcKfsh6LrCDaphMB2Xxp1bzJHZq99SxdPKKXW79Tb6ZhtKDjqnQOBYGxAUfw9HHMv1ovykT8lmT/OcngHghW66wZZ5peTj1dLf9cGxvVwF8ab9OjxsSBNxKPd+g3F7LvXZTWu21lyJDJVHu5C3Tj/KagrFVcDH1zIzjvPl0Ez7V+44G6gSygrgvYG5/t89htIXXjdnGvOjSmg36qOd80BgO3zLBdMpbuTnez+L07jQ7q0NdNe8kPS2isdfQ2SmVgTEZa2EzHW0Ubm5DdnGoQhSQRNfwsBVwNCskx4/WVn+jio1nHKI7EtYvGZTFUb5UTGXWLeD8D0ZokJQNUYRlVhqSoJGKBVda2NYbrSSkIUWv/WXq/+CFUDciQuz2It0crwOdQYKeGbRIorN2Llzo8UdqLA73MwuId7CN5lxff/YJ758KiylcSzR7pY14iv2rIfXgKYJskP0Mbkn1wbiW/tVw3L7qap+B0GzlowQhQQdZg7xtYxaZjqn6sf8DAL8NhXvfOniTdzZxQnW68TLgzlDpItg2NRSVsJooz6aKznfoH8ttwm6eIAeFeJOWYewkMa3nt/Bpdda813+Zq4PBLAJL9DLAGVytszbe56qdnAGM5bVQJvIdJPh5eUOiANv4WtH3sbR7y2DrXpdM9WP+6W0UfIjOK3A4EuAv+DgLFBVEHnMDQy+/qvcFHV4bDoYwcD3whDz238ncDdQ/xYwPInol/GgDtwAdZn+BbaM3G8xtilWMsgEAJL9mZv/xj/JqiX2TOzXaTxLwa5xY76h3OspKipCsLRcWUeT1hvQsuxqeH37ZtZ6gV+X08qRWse3EjNm9BoIiF2Kbrj87Y9SZ5uuaS818H2kay1lYha9KmYzXEkNebtCy6vLmkqRpO67TfSEYfOO5Pw916nGCHTW1VgyUWf+uBDFJ/bZTLqdvUzJZDaE+7znJAHTgg4YxWEV6KvVfMfMBG+yVp3Er6C9iudoicqvXXIIUCae+RIMpzxjGYatitlcWOaEhHof1pa2pNE3O+xVmFxTtrEC6oZeF3c4WufBsYIoKl2bdpQep+vCzwLU5NffE+IEV8QahNvJma9hd/5TttGjjGRds5xu7MszscIVe9vrECdYkR1wdgfnV/rEPHTzvpJg7roLDWb6UDZ7gi7xgayjvVU0IwOTv7SaIXcKG1wGsbqa+UvjS/1jbybTwt3fkU774XDZGlLNIihLv+rsg59v2frGfTD8qtUbex5pr4/6qG7ksNm6P07ZOqSG6uoTlG7dgDutHARTWeluPJklf06jKtrdP6i7SK2kqOfhhSKMZq/tNRq/HNosnab4GTs5h08Gex7Aj4GxJDbkS89fJLwsyop0OAuT1iegLTGqf8kBTW2Q+13ta8SVNDgfnDkhuUd78C2mYvvsixpcwLkOWaZyKJ9HG9pq8315Ta8+E3NrAVWxulxZKBEVayHlzcRebKTqE5f8Eg7pvGVL4+N3kZ4QRXhLO3gDxTrz05h4NUt6UWKZSmMWnrhZOxW5175NzfxE2CkOnUnKHe21Mh6wAnhUZgd0nftQTaAmg5iDuOwzgxD0q7xODnNELqQ5das16ivGt2KP7Jt8Ernd45nPmqtV46GtXNoGZWRBR8UGYTkTUMJFGDUW4GD4UoJIFgRCI+hNEyVbp7sC4DG0O4qKj38Cc+qJQWsQdk1GQI5Rfueh/ZLf+hlWJS8lEUn9BjxAlLk41gVW90CFHyvwPTKT0bkU2mbs4BIJoJIOLEK26ZbBVLfh/PpG6kCAEAK+s/uA5KCI8f+OhH2B6mIFios4DgwKSVtg/PMOSkU51hDqO8ADmq3ce3hhpKV2lKFq6nRI1Kj/Gm1RVGtrvsYjMmGU/tS/fv9i+mMRsrJJby0iZuHesAz6dO3kwj31qH54sqwotWLrGE80UeaqRZE4p3Yj1ffLJG5qrVVCHFUJXEkoSN4kdIY6mVxXLI4sckiyWQxo+Q8bFr1FYZvduQPofBPwgbL1hpsBECTIptbH8QiHJUaGtTj01s6ZLf4SpjcVTm+qaD84zR+YdzmmSBWhkghXVhnf8OMs3jhgnMLaFJXy/Cau2K+eZNyMV+o3+crV3zUzqYx3Yl2XD7LSy2Jgs1yAgE4yNB/imOnDjEWvBhE9RjzMeEea23N8HtGEHvsCPQkIpjSGDsne61a5dJMAyMKHJ64i0UE8dbhctyX1ty1kWso+zK+njd6JlcaY082wG4XfFcbVBGFaaXZtfq8awZj5MxSj/oz/ckqMGCt+QKrGhx+dblsmbVXzVhBk+yai1GJjSGKdgBmcd3/6IpJxZmH9BIt/T4TXwBkedGlVpN7mdSXuXkaBULQ++n0hJ1usI9yontxwv1y5RZUJ7VjQCl/faGbarXMpjwYDUFwTwXPKtZTrGILUTnp2XBiF57pTSHhul2M+/nfQx+H84bq8u615cGsiBVXeFfeqTddDdq8gC0WonEyTpZ0Np7S66LpA1DNKfEg6XfS08sj6/RUEkLanVMO1xbqQ0hUWDLCoYDFVUUs+Mqm2TWZ4mcg9pU4fBxomAJ23Yh/dbK5IqmLPDZkrRSCtoUCYEaiKTVFm2tQ7+SuUK9InmvvKwDKgxxdGWM5tahnySu4PwHTfsvc4ChSwYPbwUh16EXdiqo5QqPdRXbSKbE05UxrSAoSf+0OoJ0iRp69RYJ6QpBTyc7T5Q0AbriSqHXAG3rLCh5J1+G8+W066F8YsSrlDmoPOjLYjHoy1hzCQQKtQzTdtUJaNEAHKmdskgcRLVynoVDMI/UCdkpDvRavZKdQnjsKx4MTtme9E4WgOLLlzNrWMdWPD/cdiqtvA9tTemIJyBkR6unQQwHzwAW2rhLMDJY/YSV7EIP0G0Cfqqox7SHVSOGN+FM5T0CmRmze32wyJ1InKV6ieucsh11YzTJEvj2I0kkcpEVeuz3yr5dChlJSZdtZX2yaJAhLhaWxAClQRRDJkNAg2/sNIkBClITTptAM711STYUiYiTOf7mCYgpzBekYQMt9QKb9sHm/wkJ65FEYD0KFJiXsDXbS+ohTctAS0H5pRAPvodbQOJKy9pjPwu+W+DQ3t5Tk833rp+teP/FxNA326FH41k8t/WclGYjjvqRw15oLyXN0nPLG5L/fPYb+r1aTa4d1/uBEa1ImkcC1dD/2NTLNUHm9S7SAo4Co3gjpDYHaTD0SUvNb38AoePuFUjtRo9GpkteRaFMPhKykX3dKXye7AdlPjWt/+BRuYPN7qTOfX4sZJuyyxt4hZHx2JYh5OIOT1sf2ewBTGBmil8QryVhrq4dE4kHUXxiVK7OWOqVzPwJVnbj7frfkBn2crDnVG2Lpp4dfx9i5szowcHvb4Ep+8Hqadx42Wl3AsqYBD2xdji/Cw7vO0EJGNsGedOGlt2s2brdWrkG6Jil6GMlM2cr8Y6Vcs6mfmtyCGhvopD0HHLSD7TYYuQRV1lzwrCUZh5/5ZOpxDLclImG4H0/QZYc7nHOi7JB7Q95Y8gidgK7sqKcKU8ahicGxcDwFCoTcJkg3KYz5pCMNUORXPdD9Q9JgddJtMW1qZL/S7r2H5OcqNvSz5pw8+VISKyz2Byc/vsokSjTLSJf0wcOD3NQGhtLbeEM4x10RY2yWrVVED1ny4IV11Q2GBzM/rTB6Jywne1Be9ogb1kJHDsJTp+H2Eyh48vKd0f0b3BJGHFJfe5quDzPLk6Jl82/qy/HoHE99QdjRFR7yQVqi7CDC1rh7q+NkC/1ClTDRoFVeKq5Ei+6Aubw2yKUB324+hDyHolAU5zKgOiE9FQJfAk0YDPwWm5IgbCVGpBAF1kVbxc2/EOLMeGCjRp/+AAgE4xD0Vrl9sODFF2gEpAZ0/C3L0osD12Y9qNvJ7GmpgXzUh1RrnpoIOytpnqZIHihpPqAEsmSoIBUeT2XlFPiT81Px8zkuzXdnenQVb+5bjVer5ZrlYxk0RzCpBTGpBTnZa+PVXi+ezpsc70WNwjHguRi/R6Zod3i43IxIWQ9Pjvf4gLZ6O0pC8lLp85cDyaHDNgOjJ0q9LUYDFJmiH/0Ud7+RFWaAntrsn9/YZ7AhVs8W9crU82N8j+YLTqjzEJQV3rw+QsKBKCwKGp8TodJ0YuEeyZvUzVfPCJmXbR4NDkAld1YcSIrHVm4vvbEJ83jnd1cZ8dStErzHcCnuj33iajQ4TB3qOFyH+vVbf082AX7PHYnzjOBDmwGkic73/C5l59VgQ+2IbmclnGp9tjZXItGadIcxge7tmtpfzCTwJEVEMviz2tmi7g671jvQX18d6tow6zF4jPvDWB8qPzVmTbTZcCrstOd1DHbuBWUdCut+A7XoL1t8Krl2wooCdoxtExpywTaDIGpxSxyM8km4vKIUBtlbCSnoX4HSpvZElYvcv59WwW7WtdiqhdZrb6twu2sawA6MMz39FPbNuflQexOCHdcqJ/1MAZb3+xjiul3A4agZmTk3rrSRdj0MdqCGMsRc/cKseLnfskUSCv1fHjjUVPn9xbmziTVOEwxYZiL+QqPwyVNfMb/yfYyFIxUNRAAyZyE32HibDH0Syj01HMUyBvLt1C93b1It1cfl5ivDYsE2T8/cOQMg6/Tg7dnVIZdXF5cuIqhCJWg7sXezlgzwVD+TM5S9LxA8QjhHBeobxi4uY4QJY9anMqDQ+O9HQfuShZWfMQRMoZ/lkhprhoaPJYkg+9BbVcKOEfBroZcftF3HTkIbgeMtKiuud4i0nAcIrAemui81PRRiEq0PS+2iti+XHyQ6qKqraIHJAInzcazHppMIZlLMQJgTuKdtO/LwCAsKBtnLLmXL8cEGUSiEs+HzJ5rCzvvlYBYZftvZWpJsmNmPShKLkY53LTwisNgjg1zvDCzUp5TGBE0JD+RUSoFRZ9EVBsZgX+k30WMT5NG0Iy1lE0HrLHMjyk4BaEZrl3Ns+kuhmkb9mq5YwtpsmHHX/8Chbj++fBSd3A39pyAV89dnmdWWzary3oVXVBiXgw0m3TnHrbXph80ZN+5xsjCYmGHstq2nXrNRfp9W4NslVfbY59EWIk6ZGtfbQQYrHJV1ShOfzwv4sd/3fmuNZYikw4oIFUFeZ8RswNe/hhCam7hKv59m8UX9KIWpiixO7m55pIVGxwpv8G2cctLdAYLQzDma6y0iBA1kYTgGFJoRLJcV0EMFvb4IoHV+f6jfg7Qhv528lieothhcoUT6xdZYhzwbwWny7BlsJ8M38dPq/yzvL5nLs206A/n78B0TSDbk6sUBMC/Z5nt1YgEN1oixxGiauD8nG1wUrp/iracvXOge/T2LZl77aROa9HXqzo3HHStv/3VoIiYpul3QgdfJbpbZL4XPhT62RhmYcdJlMhOa/qs5bPCFrpLs5AkB0LiIfwdYHE4g5TEJAoALXptcZI8OL4pdBNkE2h2HjhpRuwMutxnUJlI+4c5EAVGWQrqBOXtRCp0sptGPOZLZsusjoI1tpZAOGTBdkhYNKNrRIsdVH3HkumAPa/Zns1QFVGopqK0lwumgRCw2EuGxwgk+FgfrEX2hE15UuLvUVUi1rKZvKlvIZJ81qmrhL/X7s/S+zV2Uw3NlV/W5yDHwzuhq/2f/9U9ZH5x2OjzqQkQWmLADS2bnvFZAz8X8sXzk4F8UdDZKWxspHj+Tqi+bYR6uf0fmcWIBLLAGGgsV18P/KaXPmXyLDbv1QdmI0zhT3VDmnvkTiBnnqjmfb/WPRjoYbnZRAzEuL9FW+3aChj/+kwuGAxDbsujnzz/E7BcvLoQjAuX4F+2ENyU41cA4kdwaT6uF+I0/VtcvjeUHMiJ+DmDDIiDAO+xJeBwq5bqXSDdVznlUEELMq/Iw+yVKPAXa2i8PEH5WTq0OdgFffYtvU3U9KbGTpZ9H4PoXZR6txPbF9d73pneyantmn7IB8A9co/H24wld55OWULUZINLXovLj3q167LEUa10oXV766DFRo0tMdQTF/bKgXApbPRLLn+5jY9Q9TLsgALlxzX6IljsyGsGrzrQsS1XKAHWQgfH+eLeOhpuirJwIdr7xnwqb/5mmKSrOQjuiv1KvJXY138qC8YdjW9eEWr+KI67t/6g0uCxMLT5kZhFb+zgoOh7Y0b/zZmlL0sHfsId45PlB2RBiGeq8qCiitFEzKsqhwNXIJG5kW9Z+WiwGX1gWOlbceGTsS9/wAXxbYJ/RFgPPpvb7XgRgiT7dMJky6nDBY/7NkG3KSPq65EeQJcTmJv9QWFT0vgCAqov44r9fQFSRHlaGRGmcTugxqr+4WeQfbx0gJNE/SbhYfS/xiMq+r9z/2I8OlL3P52g/eE9i3LzAte37JdvyHfL+Y14fogXmfl3rd0zroHECXx1Dy1vfW3uQ409L8ow5Y/10RO5Vg5dtfQQ3ovl7F5BvmS66L29PSaB8ddYcuO3A4rkZr5N09EfAA==","base64")).toString()),i_)});var Ji={};Yt(Ji,{convertToZip:()=>Ect,extractArchiveTo:()=>wct,makeArchiveFromDirectory:()=>Cct});async function Cct(t,{baseFs:e=new xn,prefixPath:r=wt.root,compressionLevel:o,inMemory:a=!1}={}){let n;if(a)n=new os(null,{level:o});else{let A=await ae.mktempPromise(),p=z.join(A,"archive.zip");n=new os(p,{create:!0,level:o})}let u=z.resolve(wt.root,r);return await n.copyPromise(u,t,{baseFs:e,stableTime:!0,stableSort:!0}),n}async function Ect(t,e){let r=await ae.mktempPromise(),o=z.join(r,"archive.zip");return Ape||(Ape=new Hb((0,hpe.getContent)())),await Ape.run({tmpFile:o,tgz:t,opts:e}),new os(o,{level:e.compressionLevel})}async function*Ict(t){let e=new ppe.default.Parse,r=new fpe.PassThrough({objectMode:!0,autoDestroy:!0,emitClose:!0});e.on("entry",o=>{r.write(o)}),e.on("error",o=>{r.destroy(o)}),e.on("close",()=>{r.destroyed||r.end()}),e.end(t);for await(let o of r){let a=o;yield a,a.resume()}}async function wct(t,e,{stripComponents:r=0,prefixPath:o=wt.dot}={}){function a(n){if(n.path[0]==="/")return!0;let u=n.path.split(/\//g);return!!(u.some(A=>A==="..")||u.length<=r)}for await(let n of Ict(t)){if(a(n))continue;let u=z.normalize(ue.toPortablePath(n.path)).replace(/\/$/,"").split(/\//g);if(u.length<=r)continue;let A=u.slice(r).join("/"),p=z.join(o,A),h=420;switch((n.type==="Directory"||((n.mode??0)&73)!==0)&&(h|=73),n.type){case"Directory":e.mkdirpSync(z.dirname(p),{chmod:493,utimes:[Ii.SAFE_TIME,Ii.SAFE_TIME]}),e.mkdirSync(p,{mode:h}),e.utimesSync(p,Ii.SAFE_TIME,Ii.SAFE_TIME);break;case"OldFile":case"File":e.mkdirpSync(z.dirname(p),{chmod:493,utimes:[Ii.SAFE_TIME,Ii.SAFE_TIME]}),e.writeFileSync(p,await Jy(n),{mode:h}),e.utimesSync(p,Ii.SAFE_TIME,Ii.SAFE_TIME);break;case"SymbolicLink":e.mkdirpSync(z.dirname(p),{chmod:493,utimes:[Ii.SAFE_TIME,Ii.SAFE_TIME]}),e.symlinkSync(n.linkpath,p),e.lutimesSync(p,Ii.SAFE_TIME,Ii.SAFE_TIME);break}}return e}var fpe,ppe,hpe,Ape,gpe=dt(()=>{bt();_c();fpe=Ie("stream"),ppe=tt(spe());lpe();Kl();hpe=tt(upe())});var mpe=U((s_,dpe)=>{(function(t,e){typeof s_=="object"?dpe.exports=e():typeof define=="function"&&define.amd?define(e):t.treeify=e()})(s_,function(){function t(a,n){var u=n?"\u2514":"\u251C";return a?u+="\u2500 ":u+="\u2500\u2500\u2510",u}function e(a,n){var u=[];for(var A in a)!a.hasOwnProperty(A)||n&&typeof a[A]=="function"||u.push(A);return u}function r(a,n,u,A,p,h,E){var w="",v=0,b,C,R=A.slice(0);if(R.push([n,u])&&A.length>0&&(A.forEach(function(_,V){V>0&&(w+=(_[1]?" ":"\u2502")+" "),!C&&_[0]===n&&(C=!0)}),w+=t(a,u)+a,p&&(typeof n!="object"||n instanceof Date)&&(w+=": "+n),C&&(w+=" (circular ref.)"),E(w)),!C&&typeof n=="object"){var L=e(n,h);L.forEach(function(_){b=++v===L.length,r(_,n[_],b,R,p,h,E)})}}var o={};return o.asLines=function(a,n,u,A){var p=typeof u!="function"?u:!1;r(".",a,!1,[],n,p,A||u)},o.asTree=function(a,n,u){var A="";return r(".",a,!1,[],n,u,function(p){A+=p+` +`}),A},o})});var Zo={};Yt(Zo,{emitList:()=>Bct,emitTree:()=>Ipe,treeNodeToJson:()=>Epe,treeNodeToTreeify:()=>Cpe});function Cpe(t,{configuration:e}){let r={},o=(a,n)=>{let u=Array.isArray(a)?a.entries():Object.entries(a);for(let[A,{label:p,value:h,children:E}]of u){let w=[];typeof p<"u"&&w.push(zS(e,p,2)),typeof h<"u"&&w.push(Kt(e,h[0],h[1])),w.length===0&&w.push(zS(e,`${A}`,2));let v=w.join(": "),b=n[v]={};typeof E<"u"&&o(E,b)}};if(typeof t.children>"u")throw new Error("The root node must only contain children");return o(t.children,r),r}function Epe(t){let e=r=>{if(typeof r.children>"u"){if(typeof r.value>"u")throw new Error("Assertion failed: Expected a value to be set if the children are missing");return md(r.value[0],r.value[1])}let o=Array.isArray(r.children)?r.children.entries():Object.entries(r.children??{}),a=Array.isArray(r.children)?[]:{};for(let[n,u]of o)a[n]=e(u);return typeof r.value>"u"?a:{value:md(r.value[0],r.value[1]),children:a}};return e(t)}function Bct(t,{configuration:e,stdout:r,json:o}){let a=t.map(n=>({value:n}));Ipe({children:a},{configuration:e,stdout:r,json:o})}function Ipe(t,{configuration:e,stdout:r,json:o,separators:a=0}){if(o){let u=Array.isArray(t.children)?t.children.values():Object.values(t.children??{});for(let A of u)r.write(`${JSON.stringify(Epe(A))} +`);return}let n=(0,ype.asTree)(Cpe(t,{configuration:e}),!1,!1);if(a>=1&&(n=n.replace(/^([├└]─)/gm,`\u2502 +$1`).replace(/^│\n/,"")),a>=2)for(let u=0;u<2;++u)n=n.replace(/^([│ ].{2}[├│ ].{2}[^\n]+\n)(([│ ]).{2}[├└].{2}[^\n]*\n[│ ].{2}[│ ].{2}[├└]─)/gm,`$1$3 \u2502 +$2`).replace(/^│\n/,"");if(a>=3)throw new Error("Only the first two levels are accepted by treeUtils.emitTree");r.write(n)}var ype,wpe=dt(()=>{ype=tt(mpe());Jl()});function o_(t){let e=t.indexOf("/");return e!==-1?t.slice(0,e):null}function Dct(t){let e=t.indexOf("/");return e!==-1?t.slice(e+1):t}var Bpe,a_,vct,Ur,vpe=dt(()=>{bt();bt();_c();Bpe=Ie("crypto"),a_=tt(Ie("fs"));Xl();t0();Kl();Ks();vct=9,Ur=class{constructor(e,{configuration:r,immutable:o=r.get("enableImmutableCache"),check:a=!1}){this.markedFiles=new Set;this.mutexes=new Map;this.cacheId=`-${(0,Bpe.randomBytes)(8).toString("hex")}.tmp`;this.configuration=r,this.cwd=e,this.immutable=o,this.check=a;let n=r.get("cacheKeyOverride");if(n!==null)this.cacheKey=`${n}`;else{let u=r.get("compressionLevel"),A=u!==Ay?`c${u}`:"";this.cacheKey=[vct,A].join("")}}static async find(e,{immutable:r,check:o}={}){let a=new Ur(e.get("cacheFolder"),{configuration:e,immutable:r,check:o});return await a.setup(),a}get mirrorCwd(){if(!this.configuration.get("enableMirror"))return null;let e=`${this.configuration.get("globalFolder")}/cache`;return e!==this.cwd?e:null}getVersionFilename(e){return`${aC(e)}-${this.cacheKey}.zip`}getChecksumFilename(e,r){let a=Dct(r).slice(0,10);return`${aC(e)}-${a}.zip`}getLocatorPath(e,r,o={}){var n;return this.mirrorCwd===null||((n=o.unstablePackages)==null?void 0:n.has(e.locatorHash))?z.resolve(this.cwd,this.getVersionFilename(e)):r===null||o_(r)!==this.cacheKey?null:z.resolve(this.cwd,this.getChecksumFilename(e,r))}getLocatorMirrorPath(e){let r=this.mirrorCwd;return r!==null?z.resolve(r,this.getVersionFilename(e)):null}async setup(){if(!this.configuration.get("enableGlobalCache"))if(this.immutable){if(!await ae.existsPromise(this.cwd))throw new Vt(56,"Cache path does not exist.")}else{await ae.mkdirPromise(this.cwd,{recursive:!0});let e=z.resolve(this.cwd,".gitignore");await ae.changeFilePromise(e,`/.gitignore +*.flock +*.tmp +`)}(this.mirrorCwd||!this.immutable)&&await ae.mkdirPromise(this.mirrorCwd||this.cwd,{recursive:!0})}async fetchPackageFromCache(e,r,{onHit:o,onMiss:a,loader:n,...u}){var ge;let A=this.getLocatorMirrorPath(e),p=new xn,h=()=>{let le=new os,Pe=z.join(wt.root,hM(e));return le.mkdirSync(Pe,{recursive:!0}),le.writeJsonSync(z.join(Pe,Lr.manifest),{name:nn(e),mocked:!0}),le},E=async(le,Pe=null)=>{var De;if(Pe===null&&((De=u.unstablePackages)==null?void 0:De.has(e.locatorHash)))return{isValid:!0,hash:null};let g=!u.skipIntegrityCheck||!r?`${this.cacheKey}/${await xP(le)}`:r;if(Pe!==null){let Ce=!u.skipIntegrityCheck||!r?`${this.cacheKey}/${await xP(Pe)}`:r;if(g!==Ce)throw new Vt(18,"The remote archive doesn't match the local checksum - has the local cache been corrupted?")}if(r!==null&&g!==r){let Ce;switch(this.check?Ce="throw":o_(r)!==o_(g)?Ce="update":Ce=this.configuration.get("checksumBehavior"),Ce){case"ignore":return{isValid:!0,hash:r};case"update":return{isValid:!0,hash:g};case"reset":return{isValid:!1,hash:r};default:case"throw":throw new Vt(18,"The remote archive doesn't match the expected checksum")}}return{isValid:!0,hash:g}},w=async le=>{if(!n)throw new Error(`Cache check required but no loader configured for ${kr(this.configuration,e)}`);let Pe=await n(),g=Pe.getRealPath();Pe.saveAndClose(),await ae.chmodPromise(g,420);let De=await E(le,g);if(!De.isValid)throw new Error("Assertion failed: Expected a valid checksum");return De.hash},v=async()=>{if(A===null||!await ae.existsPromise(A)){let le=await n(),Pe=le.getRealPath();return le.saveAndClose(),{source:"loader",path:Pe}}return{source:"mirror",path:A}},b=async()=>{if(!n)throw new Error(`Cache entry required but missing for ${kr(this.configuration,e)}`);if(this.immutable)throw new Vt(56,`Cache entry required but missing for ${kr(this.configuration,e)}`);let{path:le,source:Pe}=await v(),g=(await E(le)).hash,De=this.getLocatorPath(e,g,u);if(!De)throw new Error("Assertion failed: Expected the cache path to be available");let Ce=[];Pe!=="mirror"&&A!==null&&Ce.push(async()=>{let ne=`${A}${this.cacheId}`;await ae.copyFilePromise(le,ne,a_.default.constants.COPYFILE_FICLONE),await ae.chmodPromise(ne,420),await ae.renamePromise(ne,A)}),(!u.mirrorWriteOnly||A===null)&&Ce.push(async()=>{let ne=`${De}${this.cacheId}`;await ae.copyFilePromise(le,ne,a_.default.constants.COPYFILE_FICLONE),await ae.chmodPromise(ne,420),await ae.renamePromise(ne,De)});let de=u.mirrorWriteOnly?A??De:De;return await Promise.all(Ce.map(ne=>ne())),[!1,de,g]},C=async()=>{let Pe=(async()=>{var Z;let g=this.getLocatorPath(e,r,u),De=g!==null?this.markedFiles.has(g)||await p.existsPromise(g):!1,Ce=!!((Z=u.mockedPackages)!=null&&Z.has(e.locatorHash))&&(!this.check||!De),de=Ce||De,ne=de?o:a;if(ne&&ne(),de){let me=null,be=g;if(!Ce)if(this.check)me=await w(be);else{let ut=await E(be);if(ut.isValid)me=ut.hash;else return b()}return[Ce,be,me]}else return b()})();this.mutexes.set(e.locatorHash,Pe);try{return await Pe}finally{this.mutexes.delete(e.locatorHash)}};for(let le;le=this.mutexes.get(e.locatorHash);)await le;let[R,L,_]=await C();R||this.markedFiles.add(L);let V,re=R?()=>h():()=>new os(L,{baseFs:p,readOnly:!0}),oe=new oy(()=>pL(()=>V=re(),le=>`Failed to open the cache entry for ${kr(this.configuration,e)}: ${le}`),z),pe=new ju(L,{baseFs:oe,pathUtils:z}),he=()=>{V==null||V.discardAndClose()},ve=(ge=u.unstablePackages)!=null&&ge.has(e.locatorHash)?null:_;return[pe,he,ve]}}});var qb,Dpe=dt(()=>{qb=(r=>(r[r.SCRIPT=0]="SCRIPT",r[r.SHELLCODE=1]="SHELLCODE",r))(qb||{})});var Sct,nE,l_=dt(()=>{bt();_l();n0();Ks();Sct=[[/^(git(?:\+(?:https|ssh))?:\/\/.*(?:\.git)?)#(.*)$/,(t,e,r,o)=>`${r}#commit=${o}`],[/^https:\/\/((?:[^/]+?)@)?codeload\.github\.com\/([^/]+\/[^/]+)\/tar\.gz\/([0-9a-f]+)$/,(t,e,r="",o,a)=>`https://${r}github.com/${o}.git#commit=${a}`],[/^https:\/\/((?:[^/]+?)@)?github\.com\/([^/]+\/[^/]+?)(?:\.git)?#([0-9a-f]+)$/,(t,e,r="",o,a)=>`https://${r}github.com/${o}.git#commit=${a}`],[/^https?:\/\/[^/]+\/(?:[^/]+\/)*(?:@.+(?:\/|(?:%2f)))?([^/]+)\/(?:-|download)\/\1-[^/]+\.tgz(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.pkg\.github\.com\/download\/(?:@[^/]+)\/(?:[^/]+)\/(?:[^/]+)\/(?:[0-9a-f]+)(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.fontawesome\.com\/(?:@[^/]+)\/([^/]+)\/-\/([^/]+)\/\1-\2.tgz(?:#|$)/,t=>`npm:${t}`],[/^https?:\/\/[^/]+\/.*\/(@[^/]+)\/([^/]+)\/-\/\1\/\2-(?:[.\d\w-]+)\.tgz(?:#|$)/,(t,e)=>FP({protocol:"npm:",source:null,selector:t,params:{__archiveUrl:e}})],[/^[^/]+\.tgz#[0-9a-f]+$/,t=>`npm:${t}`]],nE=class{constructor(e){this.resolver=e;this.resolutions=null}async setup(e,{report:r}){let o=z.join(e.cwd,e.configuration.get("lockfileFilename"));if(!ae.existsSync(o))return;let a=await ae.readFilePromise(o,"utf8"),n=Yi(a);if(Object.prototype.hasOwnProperty.call(n,"__metadata"))return;let u=this.resolutions=new Map;for(let A of Object.keys(n)){let p=zw(A);if(!p){r.reportWarning(14,`Failed to parse the string "${A}" into a proper descriptor`);continue}let h=ll(p.range)?mn(p,`npm:${p.range}`):p,{version:E,resolved:w}=n[A];if(!w)continue;let v;for(let[C,R]of Sct){let L=w.match(C);if(L){v=R(E,...L);break}}if(!v){r.reportWarning(14,`${Ln(e.configuration,h)}: Only some patterns can be imported from legacy lockfiles (not "${w}")`);continue}let b=h;try{let C=vd(h.range),R=zw(C.selector,!0);R&&(b=R)}catch{}u.set(h.descriptorHash,us(b,v))}}supportsDescriptor(e,r){return this.resolutions?this.resolutions.has(e.descriptorHash):!1}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!this.resolutions)throw new Error("Assertion failed: The resolution store should have been setup");let a=this.resolutions.get(e.descriptorHash);if(!a)throw new Error("Assertion failed: The resolution should have been registered");let n=cM(a),u=o.project.configuration.normalizeDependency(n);return await this.resolver.getCandidates(u,r,o)}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}}});var pA,Spe=dt(()=>{Xl();Mx();Jl();pA=class extends Js{constructor({configuration:r,stdout:o,suggestInstall:a=!0}){super();this.errorCount=0;Hw(this,{configuration:r}),this.configuration=r,this.stdout=o,this.suggestInstall=a}static async start(r,o){let a=new this(r);try{await o(a)}catch(n){a.reportExceptionOnce(n)}finally{await a.finalize()}return a}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(r){}reportCacheMiss(r){}startSectionSync(r,o){return o()}async startSectionPromise(r,o){return await o()}startTimerSync(r,o,a){return(typeof o=="function"?o:a)()}async startTimerPromise(r,o,a){return await(typeof o=="function"?o:a)()}async startCacheReport(r){return await r()}reportSeparator(){}reportInfo(r,o){}reportWarning(r,o){}reportError(r,o){this.errorCount+=1,this.stdout.write(`${Kt(this.configuration,"\u27A4","redBright")} ${this.formatNameWithHyperlink(r)}: ${o} +`)}reportProgress(r){return{...Promise.resolve().then(async()=>{for await(let{}of r);}),stop:()=>{}}}reportJson(r){}async finalize(){this.errorCount>0&&(this.stdout.write(` +`),this.stdout.write(`${Kt(this.configuration,"\u27A4","redBright")} Errors happened when preparing the environment required to run this command. +`),this.suggestInstall&&this.stdout.write(`${Kt(this.configuration,"\u27A4","redBright")} This might be caused by packages being missing from the lockfile, in which case running "yarn install" might help. +`))}formatNameWithHyperlink(r){return IU(r,{configuration:this.configuration,json:!1})}}});var iE,c_=dt(()=>{Ks();iE=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return!!(r.project.storedResolutions.get(e.descriptorHash)||r.project.originalPackages.has(QP(e).locatorHash))}supportsLocator(e,r){return!!(r.project.originalPackages.has(e.locatorHash)&&!r.project.lockfileNeedsRefresh)}shouldPersistResolution(e,r){throw new Error("The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,o){let a=o.project.storedResolutions.get(e.descriptorHash);if(a){let u=o.project.originalPackages.get(a);if(u)return[u]}let n=o.project.originalPackages.get(QP(e).locatorHash);if(n)return[n];throw new Error("Resolution expected from the lockfile data")}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let o=r.project.originalPackages.get(e.locatorHash);if(!o)throw new Error("The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache");return o}}});function Yf(){}function Pct(t,e,r,o,a){for(var n=0,u=e.length,A=0,p=0;nb.length?R:b}),h.value=t.join(E)}else h.value=t.join(r.slice(A,A+h.count));A+=h.count,h.added||(p+=h.count)}}var v=e[u-1];return u>1&&typeof v.value=="string"&&(v.added||v.removed)&&t.equals("",v.value)&&(e[u-2].value+=v.value,e.pop()),e}function xct(t){return{newPos:t.newPos,components:t.components.slice(0)}}function bct(t,e){if(typeof t=="function")e.callback=t;else if(t)for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e}function bpe(t,e,r){return r=bct(r,{ignoreWhitespace:!0}),h_.diff(t,e,r)}function Qct(t,e,r){return g_.diff(t,e,r)}function jb(t){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?jb=function(e){return typeof e}:jb=function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},jb(t)}function u_(t){return Rct(t)||Tct(t)||Nct(t)||Lct()}function Rct(t){if(Array.isArray(t))return A_(t)}function Tct(t){if(typeof Symbol<"u"&&Symbol.iterator in Object(t))return Array.from(t)}function Nct(t,e){if(!!t){if(typeof t=="string")return A_(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);if(r==="Object"&&t.constructor&&(r=t.constructor.name),r==="Map"||r==="Set")return Array.from(t);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return A_(t,e)}}function A_(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,o=new Array(e);r"u"&&(u.context=4);var A=Qct(r,o,u);if(!A)return;A.push({value:"",lines:[]});function p(_){return _.map(function(V){return" "+V})}for(var h=[],E=0,w=0,v=[],b=1,C=1,R=function(V){var re=A[V],oe=re.lines||re.value.replace(/\n$/,"").split(` +`);if(re.lines=oe,re.added||re.removed){var pe;if(!E){var he=A[V-1];E=b,w=C,he&&(v=u.context>0?p(he.lines.slice(-u.context)):[],E-=v.length,w-=v.length)}(pe=v).push.apply(pe,u_(oe.map(function(de){return(re.added?"+":"-")+de}))),re.added?C+=oe.length:b+=oe.length}else{if(E)if(oe.length<=u.context*2&&V=A.length-2&&oe.length<=u.context){var g=/\n$/.test(r),De=/\n$/.test(o),Ce=oe.length==0&&v.length>Pe.oldLines;!g&&Ce&&r.length>0&&v.splice(Pe.oldLines,0,"\\ No newline at end of file"),(!g&&!Ce||!De)&&v.push("\\ No newline at end of file")}h.push(Pe),E=0,w=0,v=[]}b+=oe.length,C+=oe.length}},L=0;L{Yf.prototype={diff:function(e,r){var o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},a=o.callback;typeof o=="function"&&(a=o,o={}),this.options=o;var n=this;function u(R){return a?(setTimeout(function(){a(void 0,R)},0),!0):R}e=this.castInput(e),r=this.castInput(r),e=this.removeEmpty(this.tokenize(e)),r=this.removeEmpty(this.tokenize(r));var A=r.length,p=e.length,h=1,E=A+p;o.maxEditLength&&(E=Math.min(E,o.maxEditLength));var w=[{newPos:-1,components:[]}],v=this.extractCommon(w[0],r,e,0);if(w[0].newPos+1>=A&&v+1>=p)return u([{value:this.join(r),count:r.length}]);function b(){for(var R=-1*h;R<=h;R+=2){var L=void 0,_=w[R-1],V=w[R+1],re=(V?V.newPos:0)-R;_&&(w[R-1]=void 0);var oe=_&&_.newPos+1=A&&re+1>=p)return u(Pct(n,L.components,r,e,n.useLongestToken));w[R]=L}h++}if(a)(function R(){setTimeout(function(){if(h>E)return a();b()||R()},0)})();else for(;h<=E;){var C=b();if(C)return C}},pushComponent:function(e,r,o){var a=e[e.length-1];a&&a.added===r&&a.removed===o?e[e.length-1]={count:a.count+1,added:r,removed:o}:e.push({count:1,added:r,removed:o})},extractCommon:function(e,r,o,a){for(var n=r.length,u=o.length,A=e.newPos,p=A-a,h=0;A+1"u"?r:u}:o;return typeof t=="string"?t:JSON.stringify(f_(t,null,null,a),a," ")};j1.equals=function(t,e){return Yf.prototype.equals.call(j1,t.replace(/,([\r\n])/g,"$1"),e.replace(/,([\r\n])/g,"$1"))};p_=new Yf;p_.tokenize=function(t){return t.slice()};p_.join=p_.removeEmpty=function(t){return t}});var Fpe=U((aUt,kpe)=>{var Mct=Yl(),Uct=AC(),_ct=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Hct=/^\w*$/;function qct(t,e){if(Mct(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||Uct(t)?!0:Hct.test(t)||!_ct.test(t)||e!=null&&t in Object(e)}kpe.exports=qct});var Npe=U((lUt,Tpe)=>{var Rpe=bS(),jct="Expected a function";function m_(t,e){if(typeof t!="function"||e!=null&&typeof e!="function")throw new TypeError(jct);var r=function(){var o=arguments,a=e?e.apply(this,o):o[0],n=r.cache;if(n.has(a))return n.get(a);var u=t.apply(this,o);return r.cache=n.set(a,u)||n,u};return r.cache=new(m_.Cache||Rpe),r}m_.Cache=Rpe;Tpe.exports=m_});var Ope=U((cUt,Lpe)=>{var Gct=Npe(),Wct=500;function Yct(t){var e=Gct(t,function(o){return r.size===Wct&&r.clear(),o}),r=e.cache;return e}Lpe.exports=Yct});var y_=U((uUt,Mpe)=>{var Kct=Ope(),Vct=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Jct=/\\(\\)?/g,zct=Kct(function(t){var e=[];return t.charCodeAt(0)===46&&e.push(""),t.replace(Vct,function(r,o,a,n){e.push(a?n.replace(Jct,"$1"):o||r)}),e});Mpe.exports=zct});var Wd=U((AUt,Upe)=>{var Xct=Yl(),Zct=Fpe(),$ct=y_(),eut=v1();function tut(t,e){return Xct(t)?t:Zct(t,e)?[t]:$ct(eut(t))}Upe.exports=tut});var sE=U((fUt,_pe)=>{var rut=AC(),nut=1/0;function iut(t){if(typeof t=="string"||rut(t))return t;var e=t+"";return e=="0"&&1/t==-nut?"-0":e}_pe.exports=iut});var Gb=U((pUt,Hpe)=>{var sut=Wd(),out=sE();function aut(t,e){e=sut(e,t);for(var r=0,o=e.length;t!=null&&r{var lut=YS(),cut=Wd(),uut=Qw(),qpe=ol(),Aut=sE();function fut(t,e,r,o){if(!qpe(t))return t;e=cut(e,t);for(var a=-1,n=e.length,u=n-1,A=t;A!=null&&++a{var put=Gb(),hut=C_(),gut=Wd();function dut(t,e,r){for(var o=-1,a=e.length,n={};++o{function mut(t,e){return t!=null&&e in Object(t)}Ype.exports=mut});var E_=U((mUt,Vpe)=>{var yut=Wd(),Cut=Pw(),Eut=Yl(),Iut=Qw(),wut=NS(),But=sE();function vut(t,e,r){e=yut(e,t);for(var o=-1,a=e.length,n=!1;++o{var Dut=Kpe(),Sut=E_();function Put(t,e){return t!=null&&Sut(t,e,Dut)}Jpe.exports=Put});var Zpe=U((CUt,Xpe)=>{var xut=Wpe(),but=zpe();function Qut(t,e){return xut(t,e,function(r,o){return but(t,o)})}Xpe.exports=Qut});var r0e=U((EUt,t0e)=>{var $pe=fd(),kut=Pw(),Fut=Yl(),e0e=$pe?$pe.isConcatSpreadable:void 0;function Rut(t){return Fut(t)||kut(t)||!!(e0e&&t&&t[e0e])}t0e.exports=Rut});var s0e=U((IUt,i0e)=>{var Tut=RS(),Nut=r0e();function n0e(t,e,r,o,a){var n=-1,u=t.length;for(r||(r=Nut),a||(a=[]);++n0&&r(A)?e>1?n0e(A,e-1,r,o,a):Tut(a,A):o||(a[a.length]=A)}return a}i0e.exports=n0e});var a0e=U((wUt,o0e)=>{var Lut=s0e();function Out(t){var e=t==null?0:t.length;return e?Lut(t,1):[]}o0e.exports=Out});var I_=U((BUt,l0e)=>{var Mut=a0e(),Uut=sL(),_ut=oL();function Hut(t){return _ut(Uut(t,void 0,Mut),t+"")}l0e.exports=Hut});var u0e=U((vUt,c0e)=>{var qut=Zpe(),jut=I_(),Gut=jut(function(t,e){return t==null?{}:qut(t,e)});c0e.exports=Gut});var Wb,A0e=dt(()=>{Xl();Wb=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return this.resolver.supportsDescriptor(e,r)}supportsLocator(e,r){return this.resolver.supportsLocator(e,r)}shouldPersistResolution(e,r){return this.resolver.shouldPersistResolution(e,r)}bindDescriptor(e,r,o){return this.resolver.bindDescriptor(e,r,o)}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,o){throw new Vt(20,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async getSatisfying(e,r,o,a){throw new Vt(20,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async resolve(e,r){throw new Vt(20,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}}});var xi,w_=dt(()=>{Xl();xi=class extends Js{reportCacheHit(e){}reportCacheMiss(e){}startSectionSync(e,r){return r()}async startSectionPromise(e,r){return await r()}startTimerSync(e,r,o){return(typeof r=="function"?r:o)()}async startTimerPromise(e,r,o){return await(typeof r=="function"?r:o)()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,r){}reportWarning(e,r){}reportError(e,r){}reportProgress(e){return{...Promise.resolve().then(async()=>{for await(let{}of e);}),stop:()=>{}}}reportJson(e){}async finalize(){}}});var f0e,oE,B_=dt(()=>{bt();f0e=tt(oM());uC();Dd();Jl();t0();n0();Ks();oE=class{constructor(e,{project:r}){this.workspacesCwds=new Set;this.project=r,this.cwd=e}async setup(){this.manifest=await Nt.tryFind(this.cwd)??new Nt,this.relativeCwd=z.relative(this.project.cwd,this.cwd)||wt.dot;let e=this.manifest.name?this.manifest.name:nA(null,`${this.computeCandidateName()}-${Vs(this.relativeCwd).substring(0,6)}`),r=this.manifest.version?this.manifest.version:"0.0.0";this.locator=us(e,r),this.anchoredDescriptor=mn(this.locator,`${Gn.protocol}${this.relativeCwd}`),this.anchoredLocator=us(this.locator,`${Gn.protocol}${this.relativeCwd}`);let o=this.manifest.workspaceDefinitions.map(({pattern:n})=>n),a=await(0,f0e.default)(o,{cwd:ue.fromPortablePath(this.cwd),expandDirectories:!1,onlyDirectories:!0,onlyFiles:!1,ignore:["**/node_modules","**/.git","**/.yarn"]});a.sort();for(let n of a){let u=z.resolve(this.cwd,ue.toPortablePath(n));ae.existsSync(z.join(u,"package.json"))&&this.workspacesCwds.add(u)}}get anchoredPackage(){let e=this.project.storedPackages.get(this.anchoredLocator.locatorHash);if(!e)throw new Error(`Assertion failed: Expected workspace ${Zw(this.project.configuration,this)} (${Kt(this.project.configuration,z.join(this.cwd,Lr.manifest),Bt.PATH)}) to have been resolved. Run "yarn install" to update the lockfile`);return e}accepts(e){let r=e.indexOf(":"),o=r!==-1?e.slice(0,r+1):null,a=r!==-1?e.slice(r+1):e;if(o===Gn.protocol&&z.normalize(a)===this.relativeCwd||o===Gn.protocol&&(a==="*"||a==="^"||a==="~"))return!0;let n=ll(a);return n?o===Gn.protocol?n.test(this.manifest.version??"0.0.0"):this.project.configuration.get("enableTransparentWorkspaces")&&this.manifest.version!==null?n.test(this.manifest.version):!1:!1}computeCandidateName(){return this.cwd===this.project.cwd?"root-workspace":`${z.basename(this.cwd)}`||"unnamed-workspace"}getRecursiveWorkspaceDependencies({dependencies:e=Nt.hardDependencies}={}){let r=new Set,o=a=>{for(let n of e)for(let u of a.manifest[n].values()){let A=this.project.tryWorkspaceByDescriptor(u);A===null||r.has(A)||(r.add(A),o(A))}};return o(this),r}getRecursiveWorkspaceDependents({dependencies:e=Nt.hardDependencies}={}){let r=new Set,o=a=>{for(let n of this.project.workspaces)e.some(A=>[...n.manifest[A].values()].some(p=>{let h=this.project.tryWorkspaceByDescriptor(p);return h!==null&&Jw(h.anchoredLocator,a.anchoredLocator)}))&&!r.has(n)&&(r.add(n),o(n))};return o(this),r}getRecursiveWorkspaceChildren(){let e=[];for(let r of this.workspacesCwds){let o=this.project.workspacesByCwd.get(r);o&&e.push(o,...o.getRecursiveWorkspaceChildren())}return e}async persistManifest(){let e={};this.manifest.exportTo(e);let r=z.join(this.cwd,Nt.fileName),o=`${JSON.stringify(e,null,this.manifest.indent)} +`;await ae.changeFilePromise(r,o,{automaticNewlines:!0}),this.manifest.raw=e}}});function zut({project:t,allDescriptors:e,allResolutions:r,allPackages:o,accessibleLocators:a=new Set,optionalBuilds:n=new Set,peerRequirements:u=new Map,volatileDescriptors:A=new Set,report:p}){let h=new Map,E=[],w=new Map,v=new Map,b=new Map,C=new Map,R=new Map,L=new Map(t.workspaces.map(ge=>{let le=ge.anchoredLocator.locatorHash,Pe=o.get(le);if(typeof Pe>"u")throw new Error("Assertion failed: The workspace should have an associated package");return[le,Ww(Pe)]})),_=()=>{let ge=ae.mktempSync(),le=z.join(ge,"stacktrace.log"),Pe=String(E.length+1).length,g=E.map((De,Ce)=>`${`${Ce+1}.`.padStart(Pe," ")} ${Vl(De)} +`).join("");throw ae.writeFileSync(le,g),ae.detachTemp(ge),new Vt(45,`Encountered a stack overflow when resolving peer dependencies; cf ${ue.fromPortablePath(le)}`)},V=ge=>{let le=r.get(ge.descriptorHash);if(typeof le>"u")throw new Error("Assertion failed: The resolution should have been registered");let Pe=o.get(le);if(!Pe)throw new Error("Assertion failed: The package could not be found");return Pe},re=(ge,le,Pe,{top:g,optional:De})=>{E.length>1e3&&_(),E.push(le);let Ce=oe(ge,le,Pe,{top:g,optional:De});return E.pop(),Ce},oe=(ge,le,Pe,{top:g,optional:De})=>{if(a.has(le.locatorHash))return;a.add(le.locatorHash),De||n.delete(le.locatorHash);let Ce=o.get(le.locatorHash);if(!Ce)throw new Error(`Assertion failed: The package (${kr(t.configuration,le)}) should have been registered`);let de=[],ne=[],Z=[],me=[],be=[];for(let H of Array.from(Ce.dependencies.values())){if(Ce.peerDependencies.has(H.identHash)&&Ce.locatorHash!==g)continue;if(Qf(H))throw new Error("Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch");A.delete(H.descriptorHash);let yt=De;if(!yt){let Oe=Ce.dependenciesMeta.get(nn(H));if(typeof Oe<"u"){let x=Oe.get(null);typeof x<"u"&&x.optional&&(yt=!0)}}let Me=r.get(H.descriptorHash);if(!Me)throw new Error(`Assertion failed: The resolution (${Ln(t.configuration,H)}) should have been registered`);let Te=L.get(Me)||o.get(Me);if(!Te)throw new Error(`Assertion failed: The package (${Me}, resolved from ${Ln(t.configuration,H)}) should have been registered`);if(Te.peerDependencies.size===0){re(H,Te,new Map,{top:g,optional:yt});continue}let Qe,_e,qe=new Set,At;ne.push(()=>{Qe=AM(H,le.locatorHash),_e=fM(Te,le.locatorHash),Ce.dependencies.delete(H.identHash),Ce.dependencies.set(Qe.identHash,Qe),r.set(Qe.descriptorHash,_e.locatorHash),e.set(Qe.descriptorHash,Qe),o.set(_e.locatorHash,_e),de.push([Te,Qe,_e])}),Z.push(()=>{At=new Map;for(let Oe of _e.peerDependencies.values()){let x=Ce.dependencies.get(Oe.identHash);if(!x&&Vw(le,Oe)&&(ge.identHash===le.identHash?x=ge:(x=mn(le,ge.range),e.set(x.descriptorHash,x),r.set(x.descriptorHash,le.locatorHash),A.delete(x.descriptorHash))),(!x||x.range==="missing:")&&_e.dependencies.has(Oe.identHash)){_e.peerDependencies.delete(Oe.identHash);continue}x||(x=mn(Oe,"missing:")),_e.dependencies.set(x.identHash,x),Qf(x)&&dd(b,x.descriptorHash).add(_e.locatorHash),w.set(x.identHash,x),x.range==="missing:"&&qe.add(x.identHash),At.set(Oe.identHash,Pe.get(Oe.identHash)??_e.locatorHash)}_e.dependencies=new Map(Pa(_e.dependencies,([Oe,x])=>nn(x)))}),me.push(()=>{if(!o.has(_e.locatorHash))return;let Oe=h.get(Te.locatorHash);typeof Oe=="number"&&Oe>=2&&_();let x=h.get(Te.locatorHash),I=typeof x<"u"?x+1:1;h.set(Te.locatorHash,I),re(Qe,_e,At,{top:g,optional:yt}),h.set(Te.locatorHash,I-1)}),be.push(()=>{let Oe=Ce.dependencies.get(H.identHash);if(typeof Oe>"u")throw new Error("Assertion failed: Expected the peer dependency to have been turned into a dependency");let x=r.get(Oe.descriptorHash);if(typeof x>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");if(dd(R,x).add(le.locatorHash),!!o.has(_e.locatorHash)){for(let I of _e.peerDependencies.values()){let P=At.get(I.identHash);if(typeof P>"u")throw new Error("Assertion failed: Expected the peer dependency ident to be registered");Yy(Ky(C,P),nn(I)).push(_e.locatorHash)}for(let I of qe)_e.dependencies.delete(I)}})}for(let H of[...ne,...Z])H();let ut;do{ut=!0;for(let[H,yt,Me]of de){let Te=Ky(v,H.locatorHash),Qe=Vs(...[...Me.dependencies.values()].map(Oe=>{let x=Oe.range!=="missing:"?r.get(Oe.descriptorHash):"missing:";if(typeof x>"u")throw new Error(`Assertion failed: Expected the resolution for ${Ln(t.configuration,Oe)} to have been registered`);return x===g?`${x} (top)`:x}),yt.identHash),_e=Te.get(Qe);if(typeof _e>"u"){Te.set(Qe,yt);continue}if(_e===yt)continue;o.delete(Me.locatorHash),e.delete(yt.descriptorHash),r.delete(yt.descriptorHash),a.delete(Me.locatorHash);let qe=b.get(yt.descriptorHash)||[],At=[Ce.locatorHash,...qe];b.delete(yt.descriptorHash);for(let Oe of At){let x=o.get(Oe);typeof x>"u"||(x.dependencies.get(yt.identHash).descriptorHash!==_e.descriptorHash&&(ut=!1),x.dependencies.set(yt.identHash,_e))}}}while(!ut);for(let H of[...me,...be])H()};for(let ge of t.workspaces){let le=ge.anchoredLocator;A.delete(ge.anchoredDescriptor.descriptorHash),re(ge.anchoredDescriptor,le,new Map,{top:le.locatorHash,optional:!1})}let pe;(Pe=>(Pe[Pe.NotProvided=0]="NotProvided",Pe[Pe.NotCompatible=1]="NotCompatible"))(pe||(pe={}));let he=[];for(let[ge,le]of R){let Pe=o.get(ge);if(typeof Pe>"u")throw new Error("Assertion failed: Expected the root to be registered");let g=C.get(ge);if(!(typeof g>"u"))for(let De of le){let Ce=o.get(De);if(!(typeof Ce>"u"))for(let[de,ne]of g){let Z=Ys(de);if(Ce.peerDependencies.has(Z.identHash))continue;let me=`p${Vs(De,de,ge).slice(0,5)}`;u.set(me,{subject:De,requested:Z,rootRequester:ge,allRequesters:ne});let be=Pe.dependencies.get(Z.identHash);if(typeof be<"u"){let ut=V(be),H=ut.version??"0.0.0",yt=new Set;for(let Te of ne){let Qe=o.get(Te);if(typeof Qe>"u")throw new Error("Assertion failed: Expected the link to be registered");let _e=Qe.peerDependencies.get(Z.identHash);if(typeof _e>"u")throw new Error("Assertion failed: Expected the ident to be registered");yt.add(_e.range)}[...yt].every(Te=>{if(Te.startsWith(Gn.protocol)){if(!t.tryWorkspaceByLocator(ut))return!1;Te=Te.slice(Gn.protocol.length),(Te==="^"||Te==="~")&&(Te="*")}return Sd(H,Te)})||he.push({type:1,subject:Ce,requested:Z,requester:Pe,version:H,hash:me,requirementCount:ne.length})}else{let ut=Pe.peerDependenciesMeta.get(de);ut!=null&&ut.optional||he.push({type:0,subject:Ce,requested:Z,requester:Pe,hash:me})}}}}let ve=[ge=>pM(ge.subject),ge=>nn(ge.requested),ge=>`${ge.type}`];p==null||p.startSectionSync({reportFooter:()=>{p.reportWarning(0,`Some peer dependencies are incorrectly met; run ${Kt(t.configuration,"yarn explain peer-requirements ",Bt.CODE)} for details, where ${Kt(t.configuration,"",Bt.CODE)} is the six-letter p-prefixed code`)},skipIfEmpty:!0},()=>{for(let ge of Pa(he,ve))switch(ge.type){case 0:p.reportWarning(2,`${kr(t.configuration,ge.subject)} doesn't provide ${cs(t.configuration,ge.requested)} (${Kt(t.configuration,ge.hash,Bt.CODE)}), requested by ${cs(t.configuration,ge.requester)}`);break;case 1:{let le=ge.requirementCount>1?"and some of its descendants request":"requests";p.reportWarning(60,`${kr(t.configuration,ge.subject)} provides ${cs(t.configuration,ge.requested)} (${Kt(t.configuration,ge.hash,Bt.CODE)}) with version ${Xw(t.configuration,ge.version)}, which doesn't satisfy what ${cs(t.configuration,ge.requester)} ${le}`)}break}})}var Yb,Kb,d0e,m0e,S_,D_,P_,p0e,Wut,Yut,h0e,Kut,Vut,Jut,gl,v_,g0e,St,y0e=dt(()=>{bt();bt();_l();_t();Yb=Ie("crypto");d_();Kb=tt(u0e()),d0e=tt(rd()),m0e=tt(si()),S_=Ie("util"),D_=tt(Ie("v8")),P_=tt(Ie("zlib"));m1();l_();c_();uC();CM();Xl();A0e();w_();Dd();B_();_P();Jl();t0();Kl();g1();DU();n0();Ks();p0e=7,Wut=2,Yut=/ *, */g,h0e=/\/$/,Kut=32,Vut=(0,S_.promisify)(P_.default.gzip),Jut=(0,S_.promisify)(P_.default.gunzip),gl=(r=>(r.UpdateLockfile="update-lockfile",r.SkipBuild="skip-build",r))(gl||{}),v_={restoreLinkersCustomData:["linkersCustomData"],restoreResolutions:["accessibleLocators","conditionalLocators","disabledLocators","optionalBuilds","storedDescriptors","storedResolutions","storedPackages","lockFileChecksum"],restoreBuildState:["storedBuildState"]},g0e=t=>Vs(`${Wut}`,t),St=class{constructor(e,{configuration:r}){this.resolutionAliases=new Map;this.workspaces=[];this.workspacesByCwd=new Map;this.workspacesByIdent=new Map;this.storedResolutions=new Map;this.storedDescriptors=new Map;this.storedPackages=new Map;this.storedChecksums=new Map;this.storedBuildState=new Map;this.accessibleLocators=new Set;this.conditionalLocators=new Set;this.disabledLocators=new Set;this.originalPackages=new Map;this.optionalBuilds=new Set;this.lockfileNeedsRefresh=!1;this.peerRequirements=new Map;this.linkersCustomData=new Map;this.lockFileChecksum=null;this.installStateChecksum=null;this.configuration=r,this.cwd=e}static async find(e,r){var C,R,L;if(!e.projectCwd)throw new ot(`No project found in ${r}`);let o=e.projectCwd,a=r,n=null;for(;n!==e.projectCwd;){if(n=a,ae.existsSync(z.join(n,Lr.manifest))){o=n;break}a=z.dirname(n)}let u=new St(e.projectCwd,{configuration:e});(C=Xe.telemetry)==null||C.reportProject(u.cwd),await u.setupResolutions(),await u.setupWorkspaces(),(R=Xe.telemetry)==null||R.reportWorkspaceCount(u.workspaces.length),(L=Xe.telemetry)==null||L.reportDependencyCount(u.workspaces.reduce((_,V)=>_+V.manifest.dependencies.size+V.manifest.devDependencies.size,0));let A=u.tryWorkspaceByCwd(o);if(A)return{project:u,workspace:A,locator:A.anchoredLocator};let p=await u.findLocatorForLocation(`${o}/`,{strict:!0});if(p)return{project:u,locator:p,workspace:null};let h=Kt(e,u.cwd,Bt.PATH),E=Kt(e,z.relative(u.cwd,o),Bt.PATH),w=`- If ${h} isn't intended to be a project, remove any yarn.lock and/or package.json file there.`,v=`- If ${h} is intended to be a project, it might be that you forgot to list ${E} in its workspace configuration.`,b=`- Finally, if ${h} is fine and you intend ${E} to be treated as a completely separate project (not even a workspace), create an empty yarn.lock file in it.`;throw new ot(`The nearest package directory (${Kt(e,o,Bt.PATH)}) doesn't seem to be part of the project declared in ${Kt(e,u.cwd,Bt.PATH)}. + +${[w,v,b].join(` +`)}`)}async setupResolutions(){this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;let e=z.join(this.cwd,this.configuration.get("lockfileFilename")),r=this.configuration.get("defaultLanguageName");if(ae.existsSync(e)){let o=await ae.readFilePromise(e,"utf8");this.lockFileChecksum=g0e(o);let a=Yi(o);if(a.__metadata){let n=a.__metadata.version,u=a.__metadata.cacheKey;this.lockfileNeedsRefresh=n"u")throw new Error(`Assertion failed: Expected the lockfile entry to have a resolution field (${A})`);let h=kf(p.resolution,!0),E=new Nt;E.load(p,{yamlCompatibilityMode:!0});let w=E.version,v=E.languageName||r,b=p.linkType.toUpperCase(),C=p.conditions??null,R=E.dependencies,L=E.peerDependencies,_=E.dependenciesMeta,V=E.peerDependenciesMeta,re=E.bin;if(p.checksum!=null){let pe=typeof u<"u"&&!p.checksum.includes("/")?`${u}/${p.checksum}`:p.checksum;this.storedChecksums.set(h.locatorHash,pe)}let oe={...h,version:w,languageName:v,linkType:b,conditions:C,dependencies:R,peerDependencies:L,dependenciesMeta:_,peerDependenciesMeta:V,bin:re};this.originalPackages.set(oe.locatorHash,oe);for(let pe of A.split(Yut)){let he=r0(pe);n<=6&&(he=this.configuration.normalizeDependency(he),he=mn(he,he.range.replace(/^patch:[^@]+@(?!npm(:|%3A))/,"$1npm%3A"))),this.storedDescriptors.set(he.descriptorHash,he),this.storedResolutions.set(he.descriptorHash,h.locatorHash)}}}}}async setupWorkspaces(){this.workspaces=[],this.workspacesByCwd=new Map,this.workspacesByIdent=new Map;let e=[this.cwd];for(;e.length>0;){let r=e;e=[];for(let o of r){if(this.workspacesByCwd.has(o))continue;let a=await this.addWorkspace(o);for(let n of a.workspacesCwds)e.push(n)}}}async addWorkspace(e){let r=new oE(e,{project:this});await r.setup();let o=this.workspacesByIdent.get(r.locator.identHash);if(typeof o<"u")throw new Error(`Duplicate workspace name ${cs(this.configuration,r.locator)}: ${ue.fromPortablePath(e)} conflicts with ${ue.fromPortablePath(o.cwd)}`);return this.workspaces.push(r),this.workspacesByCwd.set(e,r),this.workspacesByIdent.set(r.locator.identHash,r),r}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(e){z.isAbsolute(e)||(e=z.resolve(this.cwd,e)),e=z.normalize(e).replace(/\/+$/,"");let r=this.workspacesByCwd.get(e);return r||null}getWorkspaceByCwd(e){let r=this.tryWorkspaceByCwd(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByFilePath(e){let r=null;for(let o of this.workspaces)z.relative(o.cwd,e).startsWith("../")||r&&r.cwd.length>=o.cwd.length||(r=o);return r||null}getWorkspaceByFilePath(e){let r=this.tryWorkspaceByFilePath(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByIdent(e){let r=this.workspacesByIdent.get(e.identHash);return typeof r>"u"?null:r}getWorkspaceByIdent(e){let r=this.tryWorkspaceByIdent(e);if(!r)throw new Error(`Workspace not found (${cs(this.configuration,e)})`);return r}tryWorkspaceByDescriptor(e){if(e.range.startsWith(Gn.protocol)){let o=e.range.slice(Gn.protocol.length);if(o!=="^"&&o!=="~"&&o!=="*"&&!ll(o))return this.tryWorkspaceByCwd(o)}let r=this.tryWorkspaceByIdent(e);return r===null||(Qf(e)&&(e=Yw(e)),!r.accepts(e.range))?null:r}getWorkspaceByDescriptor(e){let r=this.tryWorkspaceByDescriptor(e);if(r===null)throw new Error(`Workspace not found (${Ln(this.configuration,e)})`);return r}tryWorkspaceByLocator(e){let r=this.tryWorkspaceByIdent(e);return r===null||(Wc(e)&&(e=Kw(e)),r.locator.locatorHash!==e.locatorHash&&r.anchoredLocator.locatorHash!==e.locatorHash)?null:r}getWorkspaceByLocator(e){let r=this.tryWorkspaceByLocator(e);if(!r)throw new Error(`Workspace not found (${kr(this.configuration,e)})`);return r}forgetResolution(e){let r=a=>{this.storedResolutions.delete(a),this.storedDescriptors.delete(a)},o=a=>{this.originalPackages.delete(a),this.storedPackages.delete(a),this.accessibleLocators.delete(a)};if("descriptorHash"in e){let a=this.storedResolutions.get(e.descriptorHash);r(e.descriptorHash);let n=new Set(this.storedResolutions.values());typeof a<"u"&&!n.has(a)&&o(a)}if("locatorHash"in e){o(e.locatorHash);for(let[a,n]of this.storedResolutions)n===e.locatorHash&&r(a)}}forgetTransientResolutions(){let e=this.configuration.makeResolver();for(let r of this.originalPackages.values()){let o;try{o=e.shouldPersistResolution(r,{project:this,resolver:e})}catch{o=!1}o||this.forgetResolution(r)}}forgetVirtualResolutions(){for(let e of this.storedPackages.values())for(let[r,o]of e.dependencies)Qf(o)&&e.dependencies.set(r,Yw(o))}getDependencyMeta(e,r){let o={},n=this.topLevelWorkspace.manifest.dependenciesMeta.get(nn(e));if(!n)return o;let u=n.get(null);if(u&&Object.assign(o,u),r===null||!m0e.default.valid(r))return o;for(let[A,p]of n)A!==null&&A===r&&Object.assign(o,p);return o}async findLocatorForLocation(e,{strict:r=!1}={}){let o=new xi,a=this.configuration.getLinkers(),n={project:this,report:o};for(let u of a){let A=await u.findPackageLocator(e,n);if(A){if(r&&(await u.findPackageLocation(A,n)).replace(h0e,"")!==e.replace(h0e,""))continue;return A}}return null}async loadUserConfig(){let e=z.join(this.cwd,"yarn.config.js");return await ae.existsPromise(e)?Vp(e):null}async preparePackage(e,{resolver:r,resolveOptions:o}){let a=this.configuration.normalizePackage(e);for(let[n,u]of a.dependencies){let A=await this.configuration.reduceHook(h=>h.reduceDependency,u,this,a,u,{resolver:r,resolveOptions:o});if(!Vw(u,A))throw new Error("Assertion failed: The descriptor ident cannot be changed through aliases");let p=r.bindDescriptor(A,a,o);a.dependencies.set(n,p)}return a}async resolveEverything(e){if(!this.workspacesByCwd||!this.workspacesByIdent)throw new Error("Workspaces must have been setup before calling this function");this.forgetVirtualResolutions(),e.lockfileOnly||this.forgetTransientResolutions();let r=e.resolver||this.configuration.makeResolver(),o=new nE(r);await o.setup(this,{report:e.report});let a=e.lockfileOnly?[new Wb(r)]:[o,r],n=new Pd([new iE(r),...a]),u=new Pd([...a]),A=this.configuration.makeFetcher(),p=e.lockfileOnly?{project:this,report:e.report,resolver:n}:{project:this,report:e.report,resolver:n,fetchOptions:{project:this,cache:e.cache,checksums:this.storedChecksums,report:e.report,fetcher:A,cacheOptions:{mirrorWriteOnly:!0}}},h=new Map,E=new Map,w=new Map,v=new Map,b=new Map,C=new Map,R=this.topLevelWorkspace.anchoredLocator,L=new Set,_=[],V=V4(),re=this.configuration.getSupportedArchitectures();await e.report.startProgressPromise(Js.progressViaTitle(),async Pe=>{let g=async Z=>{let me=await Vy(async()=>await n.resolve(Z,p),H=>`${kr(this.configuration,Z)}: ${H}`);if(!Jw(Z,me))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${kr(this.configuration,Z)} to ${kr(this.configuration,me)})`);v.set(me.locatorHash,me);let be=await this.preparePackage(me,{resolver:n,resolveOptions:p}),ut=jc([...be.dependencies.values()].map(H=>ne(H)));return _.push(ut),ut.catch(()=>{}),E.set(be.locatorHash,be),be},De=async Z=>{let me=b.get(Z.locatorHash);if(typeof me<"u")return me;let be=Promise.resolve().then(()=>g(Z));return b.set(Z.locatorHash,be),be},Ce=async(Z,me)=>{let be=await ne(me);return h.set(Z.descriptorHash,Z),w.set(Z.descriptorHash,be.locatorHash),be},de=async Z=>{Pe.setTitle(Ln(this.configuration,Z));let me=this.resolutionAliases.get(Z.descriptorHash);if(typeof me<"u")return Ce(Z,this.storedDescriptors.get(me));let be=n.getResolutionDependencies(Z,p),ut=Object.fromEntries(await jc(Object.entries(be).map(async([Me,Te])=>{let Qe=n.bindDescriptor(Te,R,p),_e=await ne(Qe);return L.add(_e.locatorHash),[Me,_e]}))),yt=(await Vy(async()=>await n.getCandidates(Z,ut,p),Me=>`${Ln(this.configuration,Z)}: ${Me}`))[0];if(typeof yt>"u")throw new Vt(82,`${Ln(this.configuration,Z)}: No candidates found`);if(e.checkResolutions){let{locators:Me}=await u.getSatisfying(Z,ut,[yt],{...p,resolver:u});if(!Me.find(Te=>Te.locatorHash===yt.locatorHash))throw new Vt(78,`Invalid resolution ${qw(this.configuration,Z,yt)}`)}return h.set(Z.descriptorHash,Z),w.set(Z.descriptorHash,yt.locatorHash),De(yt)},ne=Z=>{let me=C.get(Z.descriptorHash);if(typeof me<"u")return me;h.set(Z.descriptorHash,Z);let be=Promise.resolve().then(()=>de(Z));return C.set(Z.descriptorHash,be),be};for(let Z of this.workspaces){let me=Z.anchoredDescriptor;_.push(ne(me))}for(;_.length>0;){let Z=[..._];_.length=0,await jc(Z)}});let oe=new Set(this.resolutionAliases.values()),pe=new Set(E.keys()),he=new Set,ve=new Map;zut({project:this,report:e.report,accessibleLocators:he,volatileDescriptors:oe,optionalBuilds:pe,peerRequirements:ve,allDescriptors:h,allResolutions:w,allPackages:E});for(let Pe of L)pe.delete(Pe);for(let Pe of oe)h.delete(Pe),w.delete(Pe);let ge=new Set,le=new Set;for(let Pe of E.values())Pe.conditions!=null&&(!pe.has(Pe.locatorHash)||(NP(Pe,re)||(NP(Pe,V)&&e.report.reportWarningOnce(77,`${kr(this.configuration,Pe)}: Your current architecture (${process.platform}-${process.arch}) is supported by this package, but is missing from the ${Kt(this.configuration,"supportedArchitectures",Bt.SETTING)} setting`),le.add(Pe.locatorHash)),ge.add(Pe.locatorHash)));this.storedResolutions=w,this.storedDescriptors=h,this.storedPackages=E,this.accessibleLocators=he,this.conditionalLocators=ge,this.disabledLocators=le,this.originalPackages=v,this.optionalBuilds=pe,this.peerRequirements=ve}async fetchEverything({cache:e,report:r,fetcher:o,mode:a}){let n={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators},u=o||this.configuration.makeFetcher(),A={checksums:this.storedChecksums,project:this,cache:e,fetcher:u,report:r,cacheOptions:n},p=Array.from(new Set(Pa(this.storedResolutions.values(),[v=>{let b=this.storedPackages.get(v);if(!b)throw new Error("Assertion failed: The locator should have been registered");return Vl(b)}])));a==="update-lockfile"&&(p=p.filter(v=>!this.storedChecksums.has(v)));let h=!1,E=Js.progressViaCounter(p.length);await r.reportProgress(E);let w=(0,d0e.default)(Kut);if(await r.startCacheReport(async()=>{await jc(p.map(v=>w(async()=>{let b=this.storedPackages.get(v);if(!b)throw new Error("Assertion failed: The locator should have been registered");if(Wc(b))return;let C;try{C=await u.fetch(b,A)}catch(R){R.message=`${kr(this.configuration,b)}: ${R.message}`,r.reportExceptionOnce(R),h=R;return}C.checksum!=null?this.storedChecksums.set(b.locatorHash,C.checksum):this.storedChecksums.delete(b.locatorHash),C.releaseFs&&C.releaseFs()}).finally(()=>{E.tick()})))}),h)throw h}async linkEverything({cache:e,report:r,fetcher:o,mode:a}){var De,Ce;let n={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators,skipIntegrityCheck:!0},u=o||this.configuration.makeFetcher(),A={checksums:this.storedChecksums,project:this,cache:e,fetcher:u,report:r,cacheOptions:n},p=this.configuration.getLinkers(),h={project:this,report:r},E=new Map(p.map(de=>{let ne=de.makeInstaller(h),Z=de.getCustomDataKey(),me=this.linkersCustomData.get(Z);return typeof me<"u"&&ne.attachCustomData(me),[de,ne]})),w=new Map,v=new Map,b=new Map,C=new Map(await jc([...this.accessibleLocators].map(async de=>{let ne=this.storedPackages.get(de);if(!ne)throw new Error("Assertion failed: The locator should have been registered");return[de,await u.fetch(ne,A)]}))),R=[];for(let de of this.accessibleLocators){let ne=this.storedPackages.get(de);if(typeof ne>"u")throw new Error("Assertion failed: The locator should have been registered");let Z=C.get(ne.locatorHash);if(typeof Z>"u")throw new Error("Assertion failed: The fetch result should have been registered");let me=[],be=H=>{me.push(H)},ut=this.tryWorkspaceByLocator(ne);if(ut!==null){let H=[],{scripts:yt}=ut.manifest;for(let Te of["preinstall","install","postinstall"])yt.has(Te)&&H.push([0,Te]);try{for(let[Te,Qe]of E)if(Te.supportsPackage(ne,h)&&(await Qe.installPackage(ne,Z,{holdFetchResult:be})).buildDirective!==null)throw new Error("Assertion failed: Linkers can't return build directives for workspaces; this responsibility befalls to the Yarn core")}finally{me.length===0?(De=Z.releaseFs)==null||De.call(Z):R.push(jc(me).catch(()=>{}).then(()=>{var Te;(Te=Z.releaseFs)==null||Te.call(Z)}))}let Me=z.join(Z.packageFs.getRealPath(),Z.prefixPath);v.set(ne.locatorHash,Me),!Wc(ne)&&H.length>0&&b.set(ne.locatorHash,{directives:H,buildLocations:[Me]})}else{let H=p.find(Te=>Te.supportsPackage(ne,h));if(!H)throw new Vt(12,`${kr(this.configuration,ne)} isn't supported by any available linker`);let yt=E.get(H);if(!yt)throw new Error("Assertion failed: The installer should have been registered");let Me;try{Me=await yt.installPackage(ne,Z,{holdFetchResult:be})}finally{me.length===0?(Ce=Z.releaseFs)==null||Ce.call(Z):R.push(jc(me).then(()=>{}).then(()=>{var Te;(Te=Z.releaseFs)==null||Te.call(Z)}))}w.set(ne.locatorHash,H),v.set(ne.locatorHash,Me.packageLocation),Me.buildDirective&&Me.buildDirective.length>0&&Me.packageLocation&&b.set(ne.locatorHash,{directives:Me.buildDirective,buildLocations:[Me.packageLocation]})}}let L=new Map;for(let de of this.accessibleLocators){let ne=this.storedPackages.get(de);if(!ne)throw new Error("Assertion failed: The locator should have been registered");let Z=this.tryWorkspaceByLocator(ne)!==null,me=async(be,ut)=>{let H=v.get(ne.locatorHash);if(typeof H>"u")throw new Error(`Assertion failed: The package (${kr(this.configuration,ne)}) should have been registered`);let yt=[];for(let Me of ne.dependencies.values()){let Te=this.storedResolutions.get(Me.descriptorHash);if(typeof Te>"u")throw new Error(`Assertion failed: The resolution (${Ln(this.configuration,Me)}, from ${kr(this.configuration,ne)})should have been registered`);let Qe=this.storedPackages.get(Te);if(typeof Qe>"u")throw new Error(`Assertion failed: The package (${Te}, resolved from ${Ln(this.configuration,Me)}) should have been registered`);let _e=this.tryWorkspaceByLocator(Qe)===null?w.get(Te):null;if(typeof _e>"u")throw new Error(`Assertion failed: The package (${Te}, resolved from ${Ln(this.configuration,Me)}) should have been registered`);_e===be||_e===null?v.get(Qe.locatorHash)!==null&&yt.push([Me,Qe]):!Z&&H!==null&&Yy(L,Te).push(H)}H!==null&&await ut.attachInternalDependencies(ne,yt)};if(Z)for(let[be,ut]of E)be.supportsPackage(ne,h)&&await me(be,ut);else{let be=w.get(ne.locatorHash);if(!be)throw new Error("Assertion failed: The linker should have been found");let ut=E.get(be);if(!ut)throw new Error("Assertion failed: The installer should have been registered");await me(be,ut)}}for(let[de,ne]of L){let Z=this.storedPackages.get(de);if(!Z)throw new Error("Assertion failed: The package should have been registered");let me=w.get(Z.locatorHash);if(!me)throw new Error("Assertion failed: The linker should have been found");let be=E.get(me);if(!be)throw new Error("Assertion failed: The installer should have been registered");await be.attachExternalDependents(Z,ne)}let _=new Map;for(let[de,ne]of E){let Z=await ne.finalizeInstall();for(let me of(Z==null?void 0:Z.records)??[])b.set(me.locatorHash,{directives:me.buildDirective,buildLocations:me.buildLocations});typeof(Z==null?void 0:Z.customData)<"u"&&_.set(de.getCustomDataKey(),Z.customData)}if(this.linkersCustomData=_,await jc(R),a==="skip-build")return;let V=new Set(this.storedPackages.keys()),re=new Set(b.keys());for(let de of re)V.delete(de);let oe=(0,Yb.createHash)("sha512");oe.update(process.versions.node),await this.configuration.triggerHook(de=>de.globalHashGeneration,this,de=>{oe.update("\0"),oe.update(de)});let pe=oe.digest("hex"),he=new Map,ve=de=>{let ne=he.get(de.locatorHash);if(typeof ne<"u")return ne;let Z=this.storedPackages.get(de.locatorHash);if(typeof Z>"u")throw new Error("Assertion failed: The package should have been registered");let me=(0,Yb.createHash)("sha512");me.update(de.locatorHash),he.set(de.locatorHash,"");for(let be of Z.dependencies.values()){let ut=this.storedResolutions.get(be.descriptorHash);if(typeof ut>"u")throw new Error(`Assertion failed: The resolution (${Ln(this.configuration,be)}) should have been registered`);let H=this.storedPackages.get(ut);if(typeof H>"u")throw new Error("Assertion failed: The package should have been registered");me.update(ve(H))}return ne=me.digest("hex"),he.set(de.locatorHash,ne),ne},ge=(de,ne)=>{let Z=(0,Yb.createHash)("sha512");Z.update(pe),Z.update(ve(de));for(let me of ne)Z.update(me);return Z.digest("hex")},le=new Map,Pe=!1,g=de=>{let ne=new Set([de.locatorHash]);for(let Z of ne){let me=this.storedPackages.get(Z);if(!me)throw new Error("Assertion failed: The package should have been registered");for(let be of me.dependencies.values()){let ut=this.storedResolutions.get(be.descriptorHash);if(!ut)throw new Error(`Assertion failed: The resolution (${Ln(this.configuration,be)}) should have been registered`);if(ut!==de.locatorHash&&re.has(ut))return!1;let H=this.storedPackages.get(ut);if(!H)throw new Error("Assertion failed: The package should have been registered");let yt=this.tryWorkspaceByLocator(H);if(yt){if(yt.anchoredLocator.locatorHash!==de.locatorHash&&re.has(yt.anchoredLocator.locatorHash))return!1;ne.add(yt.anchoredLocator.locatorHash)}ne.add(ut)}}return!0};for(;re.size>0;){let de=re.size,ne=[];for(let Z of re){let me=this.storedPackages.get(Z);if(!me)throw new Error("Assertion failed: The package should have been registered");if(!g(me))continue;let be=b.get(me.locatorHash);if(!be)throw new Error("Assertion failed: The build directive should have been registered");let ut=ge(me,be.buildLocations);if(this.storedBuildState.get(me.locatorHash)===ut){le.set(me.locatorHash,ut),re.delete(Z);continue}Pe||(await this.persistInstallStateFile(),Pe=!0),this.storedBuildState.has(me.locatorHash)?r.reportInfo(8,`${kr(this.configuration,me)} must be rebuilt because its dependency tree changed`):r.reportInfo(7,`${kr(this.configuration,me)} must be built because it never has been before or the last one failed`);let H=be.buildLocations.map(async yt=>{if(!z.isAbsolute(yt))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${yt})`);for(let[Me,Te]of be.directives){let Qe=`# This file contains the result of Yarn building a package (${Vl(me)}) +`;switch(Me){case 0:Qe+=`# Script name: ${Te} +`;break;case 1:Qe+=`# Script code: ${Te} +`;break}let _e=null;if(!await ae.mktempPromise(async At=>{let Oe=z.join(At,"build.log"),{stdout:x,stderr:I}=this.configuration.getSubprocessStreams(Oe,{header:Qe,prefix:kr(this.configuration,me),report:r}),P;try{switch(Me){case 0:P=await Ux(me,Te,[],{cwd:yt,project:this,stdin:_e,stdout:x,stderr:I});break;case 1:P=await BU(me,Te,[],{cwd:yt,project:this,stdin:_e,stdout:x,stderr:I});break}}catch(F){I.write(F.stack),P=1}if(x.end(),I.end(),P===0)return!0;ae.detachTemp(At);let y=`${kr(this.configuration,me)} couldn't be built successfully (exit code ${Kt(this.configuration,P,Bt.NUMBER)}, logs can be found here: ${Kt(this.configuration,Oe,Bt.PATH)})`;return this.optionalBuilds.has(me.locatorHash)?(r.reportInfo(9,y),!0):(r.reportError(9,y),!1)}))return!1}return!0});ne.push(...H,Promise.allSettled(H).then(yt=>{re.delete(Z),yt.every(Me=>Me.status==="fulfilled"&&Me.value===!0)&&le.set(me.locatorHash,ut)}))}if(await jc(ne),de===re.size){let Z=Array.from(re).map(me=>{let be=this.storedPackages.get(me);if(!be)throw new Error("Assertion failed: The package should have been registered");return kr(this.configuration,be)}).join(", ");r.reportError(3,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${Z})`);break}}this.storedBuildState=le}async install(e){var h,E;let r=this.configuration.get("nodeLinker");(h=Xe.telemetry)==null||h.reportInstall(r);let o=!1;if(await e.report.startTimerPromise("Project validation",{skipIfEmpty:!0},async()=>{await this.configuration.triggerHook(w=>w.validateProject,this,{reportWarning:(w,v)=>{e.report.reportWarning(w,v)},reportError:(w,v)=>{e.report.reportError(w,v),o=!0}})}),o)return;for(let w of this.configuration.packageExtensions.values())for(let[,v]of w)for(let b of v)b.status="inactive";let a=z.join(this.cwd,this.configuration.get("lockfileFilename")),n=null;if(e.immutable)try{n=await ae.readFilePromise(a,"utf8")}catch(w){throw w.code==="ENOENT"?new Vt(28,"The lockfile would have been created by this install, which is explicitly forbidden."):w}await e.report.startTimerPromise("Resolution step",async()=>{await this.resolveEverything(e)}),await e.report.startTimerPromise("Post-resolution validation",{skipIfEmpty:!0},async()=>{for(let[,w]of this.configuration.packageExtensions)for(let[,v]of w)for(let b of v)if(b.userProvided){let C=Kt(this.configuration,b,Bt.PACKAGE_EXTENSION);switch(b.status){case"inactive":e.report.reportWarning(68,`${C}: No matching package in the dependency tree; you may not need this rule anymore.`);break;case"redundant":e.report.reportWarning(69,`${C}: This rule seems redundant when applied on the original package; the extension may have been applied upstream.`);break}}if(n!==null){let w=Lg(n,this.generateLockfile());if(w!==n){let v=Qpe(a,a,n,w,void 0,void 0,{maxEditLength:100});if(v){e.report.reportSeparator();for(let b of v.hunks){e.report.reportInfo(null,`@@ -${b.oldStart},${b.oldLines} +${b.newStart},${b.newLines} @@`);for(let C of b.lines)C.startsWith("+")?e.report.reportError(28,Kt(this.configuration,C,Bt.ADDED)):C.startsWith("-")?e.report.reportError(28,Kt(this.configuration,C,Bt.REMOVED)):e.report.reportInfo(null,Kt(this.configuration,C,"grey"))}e.report.reportSeparator()}throw new Vt(28,"The lockfile would have been modified by this install, which is explicitly forbidden.")}}});for(let w of this.configuration.packageExtensions.values())for(let[,v]of w)for(let b of v)b.userProvided&&b.status==="active"&&((E=Xe.telemetry)==null||E.reportPackageExtension(md(b,Bt.PACKAGE_EXTENSION)));await e.report.startTimerPromise("Fetch step",async()=>{await this.fetchEverything(e),(typeof e.persistProject>"u"||e.persistProject)&&e.mode!=="update-lockfile"&&await this.cacheCleanup(e)});let u=e.immutable?[...new Set(this.configuration.get("immutablePatterns"))].sort():[],A=await Promise.all(u.map(async w=>bP(w,{cwd:this.cwd})));(typeof e.persistProject>"u"||e.persistProject)&&await this.persist(),await e.report.startTimerPromise("Link step",async()=>{if(e.mode==="update-lockfile"){e.report.reportWarning(73,`Skipped due to ${Kt(this.configuration,"mode=update-lockfile",Bt.CODE)}`);return}await this.linkEverything(e);let w=await Promise.all(u.map(async v=>bP(v,{cwd:this.cwd})));for(let v=0;v{await this.configuration.triggerHook(w=>w.validateProjectAfterInstall,this,{reportWarning:(w,v)=>{e.report.reportWarning(w,v)},reportError:(w,v)=>{e.report.reportError(w,v),p=!0}})}),!p&&await this.configuration.triggerHook(w=>w.afterAllInstalled,this,e)}generateLockfile(){let e=new Map;for(let[a,n]of this.storedResolutions.entries()){let u=e.get(n);u||e.set(n,u=new Set),u.add(a)}let r={};r.__metadata={version:p0e,cacheKey:void 0};for(let[a,n]of e.entries()){let u=this.originalPackages.get(a);if(!u)continue;let A=[];for(let v of n){let b=this.storedDescriptors.get(v);if(!b)throw new Error("Assertion failed: The descriptor should have been registered");A.push(b)}let p=A.map(v=>ba(v)).sort().join(", "),h=new Nt;h.version=u.linkType==="HARD"?u.version:"0.0.0-use.local",h.languageName=u.languageName,h.dependencies=new Map(u.dependencies),h.peerDependencies=new Map(u.peerDependencies),h.dependenciesMeta=new Map(u.dependenciesMeta),h.peerDependenciesMeta=new Map(u.peerDependenciesMeta),h.bin=new Map(u.bin);let E,w=this.storedChecksums.get(u.locatorHash);if(typeof w<"u"){let v=w.indexOf("/");if(v===-1)throw new Error("Assertion failed: Expected the checksum to reference its cache key");let b=w.slice(0,v),C=w.slice(v+1);typeof r.__metadata.cacheKey>"u"&&(r.__metadata.cacheKey=b),b===r.__metadata.cacheKey?E=C:E=w}r[p]={...h.exportTo({},{compatibilityMode:!1}),linkType:u.linkType.toLowerCase(),resolution:Vl(u),checksum:E,conditions:u.conditions||void 0}}return`${[`# This file is generated by running "yarn install" inside your project. +`,`# Manual changes might be lost - proceed with caution! +`].join("")} +`+wa(r)}async persistLockfile(){let e=z.join(this.cwd,this.configuration.get("lockfileFilename")),r="";try{r=await ae.readFilePromise(e,"utf8")}catch{}let o=this.generateLockfile(),a=Lg(r,o);a!==r&&(await ae.writeFilePromise(e,a),this.lockFileChecksum=g0e(a),this.lockfileNeedsRefresh=!1)}async persistInstallStateFile(){let e=[];for(let u of Object.values(v_))e.push(...u);let r=(0,Kb.default)(this,e),o=D_.default.serialize(r),a=Vs(o);if(this.installStateChecksum===a)return;let n=this.configuration.get("installStatePath");await ae.mkdirPromise(z.dirname(n),{recursive:!0}),await ae.writeFilePromise(n,await Vut(o)),this.installStateChecksum=a}async restoreInstallState({restoreLinkersCustomData:e=!0,restoreResolutions:r=!0,restoreBuildState:o=!0}={}){let a=this.configuration.get("installStatePath"),n;try{let u=await Jut(await ae.readFilePromise(a));n=D_.default.deserialize(u),this.installStateChecksum=Vs(u)}catch{r&&await this.applyLightResolution();return}e&&typeof n.linkersCustomData<"u"&&(this.linkersCustomData=n.linkersCustomData),o&&Object.assign(this,(0,Kb.default)(n,v_.restoreBuildState)),r&&(n.lockFileChecksum===this.lockFileChecksum?Object.assign(this,(0,Kb.default)(n,v_.restoreResolutions)):await this.applyLightResolution())}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new xi}),await this.persistInstallStateFile()}async persist(){await this.persistLockfile();for(let e of this.workspacesByCwd.values())await e.persistManifest()}async cacheCleanup({cache:e,report:r}){if(this.configuration.get("enableGlobalCache"))return;let o=new Set([".gitignore"]);if(!bM(e.cwd,this.cwd)||!await ae.existsPromise(e.cwd))return;let a=this.configuration.get("preferAggregateCacheInfo"),n=0,u=null;for(let A of await ae.readdirPromise(e.cwd)){if(o.has(A))continue;let p=z.resolve(e.cwd,A);e.markedFiles.has(p)||(u=A,e.immutable?r.reportError(56,`${Kt(this.configuration,z.basename(p),"magenta")} appears to be unused and would be marked for deletion, but the cache is immutable`):(a?n+=1:r.reportInfo(19,`${Kt(this.configuration,z.basename(p),"magenta")} appears to be unused - removing`),await ae.removePromise(p)))}a&&n!==0&&r.reportInfo(19,n>1?`${n} packages appeared to be unused and were removed`:`${u} appeared to be unused and was removed`)}}});var aE,C0e=dt(()=>{bt();t0();dx();Kl();aE=class{constructor(e,r){this.values=new Map;this.hits=new Map;this.enumerators=new Map;this.configuration=e;let o=this.getRegistryPath();this.isNew=!ae.existsSync(o),this.sendReport(r),this.startBuffer()}reportVersion(e){this.reportValue("version",e.replace(/-git\..*/,"-git"))}reportCommandName(e){this.reportValue("commandName",e||"")}reportPluginName(e){this.reportValue("pluginName",e)}reportProject(e){this.reportEnumerator("projectCount",e)}reportInstall(e){this.reportHit("installCount",e)}reportPackageExtension(e){this.reportValue("packageExtension",e)}reportWorkspaceCount(e){this.reportValue("workspaceCount",String(e))}reportDependencyCount(e){this.reportValue("dependencyCount",String(e))}reportValue(e,r){dd(this.values,e).add(r)}reportEnumerator(e,r){dd(this.enumerators,e).add(Vs(r))}reportHit(e,r="*"){let o=Ky(this.hits,e),a=Df(o,r,()=>0);o.set(r,a+1)}getRegistryPath(){let e=this.configuration.get("globalFolder");return z.join(e,"telemetry.json")}sendReport(e){let r=this.getRegistryPath(),o;try{o=ae.readJsonSync(r)}catch{o={}}let a=Date.now(),n=this.configuration.get("telemetryInterval")*24*60*60*1e3,A=(o.lastUpdate??a+n+Math.floor(n*Math.random()))+n;if(A>a&&o.lastUpdate!=null)return;try{ae.mkdirSync(z.dirname(r),{recursive:!0}),ae.writeJsonSync(r,{lastUpdate:a})}catch{return}if(A>a||!o.blocks)return;let p=`https://browser-http-intake.logs.datadoghq.eu/v1/input/${e}?ddsource=yarn`,h=E=>Y4(p,E,{configuration:this.configuration}).catch(()=>{});for(let[E,w]of Object.entries(o.blocks??{})){if(Object.keys(w).length===0)continue;let v=w;v.userId=E,v.reportType="primary";for(let R of Object.keys(v.enumerators??{}))v.enumerators[R]=v.enumerators[R].length;h(v);let b=new Map,C=20;for(let[R,L]of Object.entries(v.values))L.length>0&&b.set(R,L.slice(0,C));for(;b.size>0;){let R={};R.userId=E,R.reportType="secondary",R.metrics={};for(let[L,_]of b)R.metrics[L]=_.shift(),_.length===0&&b.delete(L);h(R)}}}applyChanges(){let e=this.getRegistryPath(),r;try{r=ae.readJsonSync(e)}catch{r={}}let o=this.configuration.get("telemetryUserId")??"*",a=r.blocks=r.blocks??{},n=a[o]=a[o]??{};for(let u of this.hits.keys()){let A=n.hits=n.hits??{},p=A[u]=A[u]??{};for(let[h,E]of this.hits.get(u))p[h]=(p[h]??0)+E}for(let u of["values","enumerators"])for(let A of this[u].keys()){let p=n[u]=n[u]??{};p[A]=[...new Set([...p[A]??[],...this[u].get(A)??[]])]}ae.mkdirSync(z.dirname(e),{recursive:!0}),ae.writeJsonSync(e,r)}startBuffer(){process.on("exit",()=>{try{this.applyChanges()}catch{}})}}});var G1={};Yt(G1,{BuildType:()=>qb,Cache:()=>Ur,Configuration:()=>Xe,DEFAULT_LOCK_FILENAME:()=>eU,DEFAULT_RC_FILENAME:()=>$4,FormatType:()=>lce,InstallMode:()=>gl,LegacyMigrationResolver:()=>nE,LightReport:()=>pA,LinkType:()=>zy,LockfileResolver:()=>iE,Manifest:()=>Nt,MessageName:()=>dr,MultiFetcher:()=>fC,PackageExtensionStatus:()=>mL,PackageExtensionType:()=>dL,Project:()=>St,ProjectLookup:()=>nU,Report:()=>Js,ReportError:()=>Vt,SettingsType:()=>d1,StreamReport:()=>Et,TAG_REGEXP:()=>QC,TelemetryManager:()=>aE,ThrowReport:()=>xi,VirtualFetcher:()=>pC,WindowsLinkType:()=>Bx,Workspace:()=>oE,WorkspaceFetcher:()=>gC,WorkspaceResolver:()=>Gn,YarnVersion:()=>On,execUtils:()=>Mr,folderUtils:()=>UP,formatUtils:()=>ye,hashUtils:()=>bn,httpUtils:()=>ln,miscUtils:()=>Ye,nodeUtils:()=>As,parseMessageName:()=>$D,scriptUtils:()=>sn,semverUtils:()=>Tr,stringifyMessageName:()=>Vu,structUtils:()=>Y,tgzUtils:()=>Ji,treeUtils:()=>Zo});var Ke=dt(()=>{yx();_P();Jl();t0();dx();Kl();g1();DU();n0();Ks();gpe();wpe();vpe();m1();m1();Dpe();l_();Spe();c_();uC();eS();yM();y0e();Xl();Mx();C0e();w_();EM();IM();Dd();B_();wU();vne()});var D0e=U(($3t,Y1)=>{"use strict";var $ut=process.env.TERM_PROGRAM==="Hyper",eAt=process.platform==="win32",w0e=process.platform==="linux",Q_={ballotDisabled:"\u2612",ballotOff:"\u2610",ballotOn:"\u2611",bullet:"\u2022",bulletWhite:"\u25E6",fullBlock:"\u2588",heart:"\u2764",identicalTo:"\u2261",line:"\u2500",mark:"\u203B",middot:"\xB7",minus:"\uFF0D",multiplication:"\xD7",obelus:"\xF7",pencilDownRight:"\u270E",pencilRight:"\u270F",pencilUpRight:"\u2710",percent:"%",pilcrow2:"\u2761",pilcrow:"\xB6",plusMinus:"\xB1",section:"\xA7",starsOff:"\u2606",starsOn:"\u2605",upDownArrow:"\u2195"},B0e=Object.assign({},Q_,{check:"\u221A",cross:"\xD7",ellipsisLarge:"...",ellipsis:"...",info:"i",question:"?",questionSmall:"?",pointer:">",pointerSmall:"\xBB",radioOff:"( )",radioOn:"(*)",warning:"\u203C"}),v0e=Object.assign({},Q_,{ballotCross:"\u2718",check:"\u2714",cross:"\u2716",ellipsisLarge:"\u22EF",ellipsis:"\u2026",info:"\u2139",question:"?",questionFull:"\uFF1F",questionSmall:"\uFE56",pointer:w0e?"\u25B8":"\u276F",pointerSmall:w0e?"\u2023":"\u203A",radioOff:"\u25EF",radioOn:"\u25C9",warning:"\u26A0"});Y1.exports=eAt&&!$ut?B0e:v0e;Reflect.defineProperty(Y1.exports,"common",{enumerable:!1,value:Q_});Reflect.defineProperty(Y1.exports,"windows",{enumerable:!1,value:B0e});Reflect.defineProperty(Y1.exports,"other",{enumerable:!1,value:v0e})});var Xc=U((e_t,k_)=>{"use strict";var tAt=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),rAt=/[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,S0e=()=>{let t={enabled:!0,visible:!0,styles:{},keys:{}};"FORCE_COLOR"in process.env&&(t.enabled=process.env.FORCE_COLOR!=="0");let e=n=>{let u=n.open=`\x1B[${n.codes[0]}m`,A=n.close=`\x1B[${n.codes[1]}m`,p=n.regex=new RegExp(`\\u001b\\[${n.codes[1]}m`,"g");return n.wrap=(h,E)=>{h.includes(A)&&(h=h.replace(p,A+u));let w=u+h+A;return E?w.replace(/\r*\n/g,`${A}$&${u}`):w},n},r=(n,u,A)=>typeof n=="function"?n(u):n.wrap(u,A),o=(n,u)=>{if(n===""||n==null)return"";if(t.enabled===!1)return n;if(t.visible===!1)return"";let A=""+n,p=A.includes(` +`),h=u.length;for(h>0&&u.includes("unstyle")&&(u=[...new Set(["unstyle",...u])].reverse());h-- >0;)A=r(t.styles[u[h]],A,p);return A},a=(n,u,A)=>{t.styles[n]=e({name:n,codes:u}),(t.keys[A]||(t.keys[A]=[])).push(n),Reflect.defineProperty(t,n,{configurable:!0,enumerable:!0,set(h){t.alias(n,h)},get(){let h=E=>o(E,h.stack);return Reflect.setPrototypeOf(h,t),h.stack=this.stack?this.stack.concat(n):[n],h}})};return a("reset",[0,0],"modifier"),a("bold",[1,22],"modifier"),a("dim",[2,22],"modifier"),a("italic",[3,23],"modifier"),a("underline",[4,24],"modifier"),a("inverse",[7,27],"modifier"),a("hidden",[8,28],"modifier"),a("strikethrough",[9,29],"modifier"),a("black",[30,39],"color"),a("red",[31,39],"color"),a("green",[32,39],"color"),a("yellow",[33,39],"color"),a("blue",[34,39],"color"),a("magenta",[35,39],"color"),a("cyan",[36,39],"color"),a("white",[37,39],"color"),a("gray",[90,39],"color"),a("grey",[90,39],"color"),a("bgBlack",[40,49],"bg"),a("bgRed",[41,49],"bg"),a("bgGreen",[42,49],"bg"),a("bgYellow",[43,49],"bg"),a("bgBlue",[44,49],"bg"),a("bgMagenta",[45,49],"bg"),a("bgCyan",[46,49],"bg"),a("bgWhite",[47,49],"bg"),a("blackBright",[90,39],"bright"),a("redBright",[91,39],"bright"),a("greenBright",[92,39],"bright"),a("yellowBright",[93,39],"bright"),a("blueBright",[94,39],"bright"),a("magentaBright",[95,39],"bright"),a("cyanBright",[96,39],"bright"),a("whiteBright",[97,39],"bright"),a("bgBlackBright",[100,49],"bgBright"),a("bgRedBright",[101,49],"bgBright"),a("bgGreenBright",[102,49],"bgBright"),a("bgYellowBright",[103,49],"bgBright"),a("bgBlueBright",[104,49],"bgBright"),a("bgMagentaBright",[105,49],"bgBright"),a("bgCyanBright",[106,49],"bgBright"),a("bgWhiteBright",[107,49],"bgBright"),t.ansiRegex=rAt,t.hasColor=t.hasAnsi=n=>(t.ansiRegex.lastIndex=0,typeof n=="string"&&n!==""&&t.ansiRegex.test(n)),t.alias=(n,u)=>{let A=typeof u=="string"?t[u]:u;if(typeof A!="function")throw new TypeError("Expected alias to be the name of an existing color (string) or a function");A.stack||(Reflect.defineProperty(A,"name",{value:n}),t.styles[n]=A,A.stack=[n]),Reflect.defineProperty(t,n,{configurable:!0,enumerable:!0,set(p){t.alias(n,p)},get(){let p=h=>o(h,p.stack);return Reflect.setPrototypeOf(p,t),p.stack=this.stack?this.stack.concat(A.stack):A.stack,p}})},t.theme=n=>{if(!tAt(n))throw new TypeError("Expected theme to be an object");for(let u of Object.keys(n))t.alias(u,n[u]);return t},t.alias("unstyle",n=>typeof n=="string"&&n!==""?(t.ansiRegex.lastIndex=0,n.replace(t.ansiRegex,"")):""),t.alias("noop",n=>n),t.none=t.clear=t.noop,t.stripColor=t.unstyle,t.symbols=D0e(),t.define=a,t};k_.exports=S0e();k_.exports.create=S0e});var Fo=U($r=>{"use strict";var nAt=Object.prototype.toString,ac=Xc(),P0e=!1,F_=[],x0e={yellow:"blue",cyan:"red",green:"magenta",black:"white",blue:"yellow",red:"cyan",magenta:"green",white:"black"};$r.longest=(t,e)=>t.reduce((r,o)=>Math.max(r,e?o[e].length:o.length),0);$r.hasColor=t=>!!t&&ac.hasColor(t);var zb=$r.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);$r.nativeType=t=>nAt.call(t).slice(8,-1).toLowerCase().replace(/\s/g,"");$r.isAsyncFn=t=>$r.nativeType(t)==="asyncfunction";$r.isPrimitive=t=>t!=null&&typeof t!="object"&&typeof t!="function";$r.resolve=(t,e,...r)=>typeof e=="function"?e.call(t,...r):e;$r.scrollDown=(t=[])=>[...t.slice(1),t[0]];$r.scrollUp=(t=[])=>[t.pop(),...t];$r.reorder=(t=[])=>{let e=t.slice();return e.sort((r,o)=>r.index>o.index?1:r.index{let o=t.length,a=r===o?0:r<0?o-1:r,n=t[e];t[e]=t[a],t[a]=n};$r.width=(t,e=80)=>{let r=t&&t.columns?t.columns:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[0]),process.platform==="win32"?r-1:r};$r.height=(t,e=20)=>{let r=t&&t.rows?t.rows:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[1]),r};$r.wordWrap=(t,e={})=>{if(!t)return t;typeof e=="number"&&(e={width:e});let{indent:r="",newline:o=` +`+r,width:a=80}=e,n=(o+r).match(/[^\S\n]/g)||[];a-=n.length;let u=`.{1,${a}}([\\s\\u200B]+|$)|[^\\s\\u200B]+?([\\s\\u200B]+|$)`,A=t.trim(),p=new RegExp(u,"g"),h=A.match(p)||[];return h=h.map(E=>E.replace(/\n$/,"")),e.padEnd&&(h=h.map(E=>E.padEnd(a," "))),e.padStart&&(h=h.map(E=>E.padStart(a," "))),r+h.join(o)};$r.unmute=t=>{let e=t.stack.find(o=>ac.keys.color.includes(o));return e?ac[e]:t.stack.find(o=>o.slice(2)==="bg")?ac[e.slice(2)]:o=>o};$r.pascal=t=>t?t[0].toUpperCase()+t.slice(1):"";$r.inverse=t=>{if(!t||!t.stack)return t;let e=t.stack.find(o=>ac.keys.color.includes(o));if(e){let o=ac["bg"+$r.pascal(e)];return o?o.black:t}let r=t.stack.find(o=>o.slice(0,2)==="bg");return r?ac[r.slice(2).toLowerCase()]||t:ac.none};$r.complement=t=>{if(!t||!t.stack)return t;let e=t.stack.find(o=>ac.keys.color.includes(o)),r=t.stack.find(o=>o.slice(0,2)==="bg");if(e&&!r)return ac[x0e[e]||e];if(r){let o=r.slice(2).toLowerCase(),a=x0e[o];return a&&ac["bg"+$r.pascal(a)]||t}return ac.none};$r.meridiem=t=>{let e=t.getHours(),r=t.getMinutes(),o=e>=12?"pm":"am";e=e%12;let a=e===0?12:e,n=r<10?"0"+r:r;return a+":"+n+" "+o};$r.set=(t={},e="",r)=>e.split(".").reduce((o,a,n,u)=>{let A=u.length-1>n?o[a]||{}:r;return!$r.isObject(A)&&n{let o=t[e]==null?e.split(".").reduce((a,n)=>a&&a[n],t):t[e];return o??r};$r.mixin=(t,e)=>{if(!zb(t))return e;if(!zb(e))return t;for(let r of Object.keys(e)){let o=Object.getOwnPropertyDescriptor(e,r);if(o.hasOwnProperty("value"))if(t.hasOwnProperty(r)&&zb(o.value)){let a=Object.getOwnPropertyDescriptor(t,r);zb(a.value)?t[r]=$r.merge({},t[r],e[r]):Reflect.defineProperty(t,r,o)}else Reflect.defineProperty(t,r,o);else Reflect.defineProperty(t,r,o)}return t};$r.merge=(...t)=>{let e={};for(let r of t)$r.mixin(e,r);return e};$r.mixinEmitter=(t,e)=>{let r=e.constructor.prototype;for(let o of Object.keys(r)){let a=r[o];typeof a=="function"?$r.define(t,o,a.bind(e)):$r.define(t,o,a)}};$r.onExit=t=>{let e=(r,o)=>{P0e||(P0e=!0,F_.forEach(a=>a()),r===!0&&process.exit(128+o))};F_.length===0&&(process.once("SIGTERM",e.bind(null,!0,15)),process.once("SIGINT",e.bind(null,!0,2)),process.once("exit",e)),F_.push(t)};$r.define=(t,e,r)=>{Reflect.defineProperty(t,e,{value:r})};$r.defineExport=(t,e,r)=>{let o;Reflect.defineProperty(t,e,{enumerable:!0,configurable:!0,set(a){o=a},get(){return o?o():r()}})}});var b0e=U(uE=>{"use strict";uE.ctrl={a:"first",b:"backward",c:"cancel",d:"deleteForward",e:"last",f:"forward",g:"reset",i:"tab",k:"cutForward",l:"reset",n:"newItem",m:"cancel",j:"submit",p:"search",r:"remove",s:"save",u:"undo",w:"cutLeft",x:"toggleCursor",v:"paste"};uE.shift={up:"shiftUp",down:"shiftDown",left:"shiftLeft",right:"shiftRight",tab:"prev"};uE.fn={up:"pageUp",down:"pageDown",left:"pageLeft",right:"pageRight",delete:"deleteForward"};uE.option={b:"backward",f:"forward",d:"cutRight",left:"cutLeft",up:"altUp",down:"altDown"};uE.keys={pageup:"pageUp",pagedown:"pageDown",home:"home",end:"end",cancel:"cancel",delete:"deleteForward",backspace:"delete",down:"down",enter:"submit",escape:"cancel",left:"left",space:"space",number:"number",return:"submit",right:"right",tab:"next",up:"up"}});var F0e=U((n_t,k0e)=>{"use strict";var Q0e=Ie("readline"),iAt=b0e(),sAt=/^(?:\x1b)([a-zA-Z0-9])$/,oAt=/^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/,aAt={OP:"f1",OQ:"f2",OR:"f3",OS:"f4","[11~":"f1","[12~":"f2","[13~":"f3","[14~":"f4","[[A":"f1","[[B":"f2","[[C":"f3","[[D":"f4","[[E":"f5","[15~":"f5","[17~":"f6","[18~":"f7","[19~":"f8","[20~":"f9","[21~":"f10","[23~":"f11","[24~":"f12","[A":"up","[B":"down","[C":"right","[D":"left","[E":"clear","[F":"end","[H":"home",OA:"up",OB:"down",OC:"right",OD:"left",OE:"clear",OF:"end",OH:"home","[1~":"home","[2~":"insert","[3~":"delete","[4~":"end","[5~":"pageup","[6~":"pagedown","[[5~":"pageup","[[6~":"pagedown","[7~":"home","[8~":"end","[a":"up","[b":"down","[c":"right","[d":"left","[e":"clear","[2$":"insert","[3$":"delete","[5$":"pageup","[6$":"pagedown","[7$":"home","[8$":"end",Oa:"up",Ob:"down",Oc:"right",Od:"left",Oe:"clear","[2^":"insert","[3^":"delete","[5^":"pageup","[6^":"pagedown","[7^":"home","[8^":"end","[Z":"tab"};function lAt(t){return["[a","[b","[c","[d","[e","[2$","[3$","[5$","[6$","[7$","[8$","[Z"].includes(t)}function cAt(t){return["Oa","Ob","Oc","Od","Oe","[2^","[3^","[5^","[6^","[7^","[8^"].includes(t)}var Xb=(t="",e={})=>{let r,o={name:e.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:t,raw:t,...e};if(Buffer.isBuffer(t)?t[0]>127&&t[1]===void 0?(t[0]-=128,t="\x1B"+String(t)):t=String(t):t!==void 0&&typeof t!="string"?t=String(t):t||(t=o.sequence||""),o.sequence=o.sequence||t||o.name,t==="\r")o.raw=void 0,o.name="return";else if(t===` +`)o.name="enter";else if(t===" ")o.name="tab";else if(t==="\b"||t==="\x7F"||t==="\x1B\x7F"||t==="\x1B\b")o.name="backspace",o.meta=t.charAt(0)==="\x1B";else if(t==="\x1B"||t==="\x1B\x1B")o.name="escape",o.meta=t.length===2;else if(t===" "||t==="\x1B ")o.name="space",o.meta=t.length===2;else if(t<="")o.name=String.fromCharCode(t.charCodeAt(0)+"a".charCodeAt(0)-1),o.ctrl=!0;else if(t.length===1&&t>="0"&&t<="9")o.name="number";else if(t.length===1&&t>="a"&&t<="z")o.name=t;else if(t.length===1&&t>="A"&&t<="Z")o.name=t.toLowerCase(),o.shift=!0;else if(r=sAt.exec(t))o.meta=!0,o.shift=/^[A-Z]$/.test(r[1]);else if(r=oAt.exec(t)){let a=[...t];a[0]==="\x1B"&&a[1]==="\x1B"&&(o.option=!0);let n=[r[1],r[2],r[4],r[6]].filter(Boolean).join(""),u=(r[3]||r[5]||1)-1;o.ctrl=!!(u&4),o.meta=!!(u&10),o.shift=!!(u&1),o.code=n,o.name=aAt[n],o.shift=lAt(n)||o.shift,o.ctrl=cAt(n)||o.ctrl}return o};Xb.listen=(t={},e)=>{let{stdin:r}=t;if(!r||r!==process.stdin&&!r.isTTY)throw new Error("Invalid stream passed");let o=Q0e.createInterface({terminal:!0,input:r});Q0e.emitKeypressEvents(r,o);let a=(A,p)=>e(A,Xb(A,p),o),n=r.isRaw;return r.isTTY&&r.setRawMode(!0),r.on("keypress",a),o.resume(),()=>{r.isTTY&&r.setRawMode(n),r.removeListener("keypress",a),o.pause(),o.close()}};Xb.action=(t,e,r)=>{let o={...iAt,...r};return e.ctrl?(e.action=o.ctrl[e.name],e):e.option&&o.option?(e.action=o.option[e.name],e):e.shift?(e.action=o.shift[e.name],e):(e.action=o.keys[e.name],e)};k0e.exports=Xb});var T0e=U((i_t,R0e)=>{"use strict";R0e.exports=t=>{t.timers=t.timers||{};let e=t.options.timers;if(!!e)for(let r of Object.keys(e)){let o=e[r];typeof o=="number"&&(o={interval:o}),uAt(t,r,o)}};function uAt(t,e,r={}){let o=t.timers[e]={name:e,start:Date.now(),ms:0,tick:0},a=r.interval||120;o.frames=r.frames||[],o.loading=!0;let n=setInterval(()=>{o.ms=Date.now()-o.start,o.tick++,t.render()},a);return o.stop=()=>{o.loading=!1,clearInterval(n)},Reflect.defineProperty(o,"interval",{value:n}),t.once("close",()=>o.stop()),o.stop}});var L0e=U((s_t,N0e)=>{"use strict";var{define:AAt,width:fAt}=Fo(),R_=class{constructor(e){let r=e.options;AAt(this,"_prompt",e),this.type=e.type,this.name=e.name,this.message="",this.header="",this.footer="",this.error="",this.hint="",this.input="",this.cursor=0,this.index=0,this.lines=0,this.tick=0,this.prompt="",this.buffer="",this.width=fAt(r.stdout||process.stdout),Object.assign(this,r),this.name=this.name||this.message,this.message=this.message||this.name,this.symbols=e.symbols,this.styles=e.styles,this.required=new Set,this.cancelled=!1,this.submitted=!1}clone(){let e={...this};return e.status=this.status,e.buffer=Buffer.from(e.buffer),delete e.clone,e}set color(e){this._color=e}get color(){let e=this.prompt.styles;if(this.cancelled)return e.cancelled;if(this.submitted)return e.submitted;let r=this._color||e[this.status];return typeof r=="function"?r:e.pending}set loading(e){this._loading=e}get loading(){return typeof this._loading=="boolean"?this._loading:this.loadingChoices?"choices":!1}get status(){return this.cancelled?"cancelled":this.submitted?"submitted":"pending"}};N0e.exports=R_});var M0e=U((o_t,O0e)=>{"use strict";var T_=Fo(),Xs=Xc(),N_={default:Xs.noop,noop:Xs.noop,set inverse(t){this._inverse=t},get inverse(){return this._inverse||T_.inverse(this.primary)},set complement(t){this._complement=t},get complement(){return this._complement||T_.complement(this.primary)},primary:Xs.cyan,success:Xs.green,danger:Xs.magenta,strong:Xs.bold,warning:Xs.yellow,muted:Xs.dim,disabled:Xs.gray,dark:Xs.dim.gray,underline:Xs.underline,set info(t){this._info=t},get info(){return this._info||this.primary},set em(t){this._em=t},get em(){return this._em||this.primary.underline},set heading(t){this._heading=t},get heading(){return this._heading||this.muted.underline},set pending(t){this._pending=t},get pending(){return this._pending||this.primary},set submitted(t){this._submitted=t},get submitted(){return this._submitted||this.success},set cancelled(t){this._cancelled=t},get cancelled(){return this._cancelled||this.danger},set typing(t){this._typing=t},get typing(){return this._typing||this.dim},set placeholder(t){this._placeholder=t},get placeholder(){return this._placeholder||this.primary.dim},set highlight(t){this._highlight=t},get highlight(){return this._highlight||this.inverse}};N_.merge=(t={})=>{t.styles&&typeof t.styles.enabled=="boolean"&&(Xs.enabled=t.styles.enabled),t.styles&&typeof t.styles.visible=="boolean"&&(Xs.visible=t.styles.visible);let e=T_.merge({},N_,t.styles);delete e.merge;for(let r of Object.keys(Xs))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>Xs[r]});for(let r of Object.keys(Xs.styles))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>Xs[r]});return e};O0e.exports=N_});var _0e=U((a_t,U0e)=>{"use strict";var L_=process.platform==="win32",Kf=Xc(),pAt=Fo(),O_={...Kf.symbols,upDownDoubleArrow:"\u21D5",upDownDoubleArrow2:"\u2B0D",upDownArrow:"\u2195",asterisk:"*",asterism:"\u2042",bulletWhite:"\u25E6",electricArrow:"\u2301",ellipsisLarge:"\u22EF",ellipsisSmall:"\u2026",fullBlock:"\u2588",identicalTo:"\u2261",indicator:Kf.symbols.check,leftAngle:"\u2039",mark:"\u203B",minus:"\u2212",multiplication:"\xD7",obelus:"\xF7",percent:"%",pilcrow:"\xB6",pilcrow2:"\u2761",pencilUpRight:"\u2710",pencilDownRight:"\u270E",pencilRight:"\u270F",plus:"+",plusMinus:"\xB1",pointRight:"\u261E",rightAngle:"\u203A",section:"\xA7",hexagon:{off:"\u2B21",on:"\u2B22",disabled:"\u2B22"},ballot:{on:"\u2611",off:"\u2610",disabled:"\u2612"},stars:{on:"\u2605",off:"\u2606",disabled:"\u2606"},folder:{on:"\u25BC",off:"\u25B6",disabled:"\u25B6"},prefix:{pending:Kf.symbols.question,submitted:Kf.symbols.check,cancelled:Kf.symbols.cross},separator:{pending:Kf.symbols.pointerSmall,submitted:Kf.symbols.middot,cancelled:Kf.symbols.middot},radio:{off:L_?"( )":"\u25EF",on:L_?"(*)":"\u25C9",disabled:L_?"(|)":"\u24BE"},numbers:["\u24EA","\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469","\u246A","\u246B","\u246C","\u246D","\u246E","\u246F","\u2470","\u2471","\u2472","\u2473","\u3251","\u3252","\u3253","\u3254","\u3255","\u3256","\u3257","\u3258","\u3259","\u325A","\u325B","\u325C","\u325D","\u325E","\u325F","\u32B1","\u32B2","\u32B3","\u32B4","\u32B5","\u32B6","\u32B7","\u32B8","\u32B9","\u32BA","\u32BB","\u32BC","\u32BD","\u32BE","\u32BF"]};O_.merge=t=>{let e=pAt.merge({},Kf.symbols,O_,t.symbols);return delete e.merge,e};U0e.exports=O_});var q0e=U((l_t,H0e)=>{"use strict";var hAt=M0e(),gAt=_0e(),dAt=Fo();H0e.exports=t=>{t.options=dAt.merge({},t.options.theme,t.options),t.symbols=gAt.merge(t.options),t.styles=hAt.merge(t.options)}});var K0e=U((W0e,Y0e)=>{"use strict";var j0e=process.env.TERM_PROGRAM==="Apple_Terminal",mAt=Xc(),M_=Fo(),Zc=Y0e.exports=W0e,Bi="\x1B[",G0e="\x07",U_=!1,v0=Zc.code={bell:G0e,beep:G0e,beginning:`${Bi}G`,down:`${Bi}J`,esc:Bi,getPosition:`${Bi}6n`,hide:`${Bi}?25l`,line:`${Bi}2K`,lineEnd:`${Bi}K`,lineStart:`${Bi}1K`,restorePosition:Bi+(j0e?"8":"u"),savePosition:Bi+(j0e?"7":"s"),screen:`${Bi}2J`,show:`${Bi}?25h`,up:`${Bi}1J`},Yd=Zc.cursor={get hidden(){return U_},hide(){return U_=!0,v0.hide},show(){return U_=!1,v0.show},forward:(t=1)=>`${Bi}${t}C`,backward:(t=1)=>`${Bi}${t}D`,nextLine:(t=1)=>`${Bi}E`.repeat(t),prevLine:(t=1)=>`${Bi}F`.repeat(t),up:(t=1)=>t?`${Bi}${t}A`:"",down:(t=1)=>t?`${Bi}${t}B`:"",right:(t=1)=>t?`${Bi}${t}C`:"",left:(t=1)=>t?`${Bi}${t}D`:"",to(t,e){return e?`${Bi}${e+1};${t+1}H`:`${Bi}${t+1}G`},move(t=0,e=0){let r="";return r+=t<0?Yd.left(-t):t>0?Yd.right(t):"",r+=e<0?Yd.up(-e):e>0?Yd.down(e):"",r},restore(t={}){let{after:e,cursor:r,initial:o,input:a,prompt:n,size:u,value:A}=t;if(o=M_.isPrimitive(o)?String(o):"",a=M_.isPrimitive(a)?String(a):"",A=M_.isPrimitive(A)?String(A):"",u){let p=Zc.cursor.up(u)+Zc.cursor.to(n.length),h=a.length-r;return h>0&&(p+=Zc.cursor.left(h)),p}if(A||e){let p=!a&&!!o?-o.length:-a.length+r;return e&&(p-=e.length),a===""&&o&&!n.includes(o)&&(p+=o.length),Zc.cursor.move(p)}}},__=Zc.erase={screen:v0.screen,up:v0.up,down:v0.down,line:v0.line,lineEnd:v0.lineEnd,lineStart:v0.lineStart,lines(t){let e="";for(let r=0;r{if(!e)return __.line+Yd.to(0);let r=n=>[...mAt.unstyle(n)].length,o=t.split(/\r?\n/),a=0;for(let n of o)a+=1+Math.floor(Math.max(r(n)-1,0)/e);return(__.line+Yd.prevLine()).repeat(a-1)+__.line+Yd.to(0)}});var AE=U((c_t,J0e)=>{"use strict";var yAt=Ie("events"),V0e=Xc(),H_=F0e(),CAt=T0e(),EAt=L0e(),IAt=q0e(),Ra=Fo(),Kd=K0e(),K1=class extends yAt{constructor(e={}){super(),this.name=e.name,this.type=e.type,this.options=e,IAt(this),CAt(this),this.state=new EAt(this),this.initial=[e.initial,e.default].find(r=>r!=null),this.stdout=e.stdout||process.stdout,this.stdin=e.stdin||process.stdin,this.scale=e.scale||1,this.term=this.options.term||process.env.TERM_PROGRAM,this.margin=BAt(this.options.margin),this.setMaxListeners(0),wAt(this)}async keypress(e,r={}){this.keypressed=!0;let o=H_.action(e,H_(e,r),this.options.actions);this.state.keypress=o,this.emit("keypress",e,o),this.emit("state",this.state.clone());let a=this.options[o.action]||this[o.action]||this.dispatch;if(typeof a=="function")return await a.call(this,e,o);this.alert()}alert(){delete this.state.alert,this.options.show===!1?this.emit("alert"):this.stdout.write(Kd.code.beep)}cursorHide(){this.stdout.write(Kd.cursor.hide()),Ra.onExit(()=>this.cursorShow())}cursorShow(){this.stdout.write(Kd.cursor.show())}write(e){!e||(this.stdout&&this.state.show!==!1&&this.stdout.write(e),this.state.buffer+=e)}clear(e=0){let r=this.state.buffer;this.state.buffer="",!(!r&&!e||this.options.show===!1)&&this.stdout.write(Kd.cursor.down(e)+Kd.clear(r,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:e,after:r,rest:o}=this.sections(),{cursor:a,initial:n="",input:u="",value:A=""}=this,p=this.state.size=o.length,h={after:r,cursor:a,initial:n,input:u,prompt:e,size:p,value:A},E=Kd.cursor.restore(h);E&&this.stdout.write(E)}sections(){let{buffer:e,input:r,prompt:o}=this.state;o=V0e.unstyle(o);let a=V0e.unstyle(e),n=a.indexOf(o),u=a.slice(0,n),p=a.slice(n).split(` +`),h=p[0],E=p[p.length-1],v=(o+(r?" "+r:"")).length,b=ve.call(this,this.value),this.result=()=>o.call(this,this.value),typeof r.initial=="function"&&(this.initial=await r.initial.call(this,this)),typeof r.onRun=="function"&&await r.onRun.call(this,this),typeof r.onSubmit=="function"){let a=r.onSubmit.bind(this),n=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>(await a(this.name,this.value,this),n())}await this.start(),await this.render()}render(){throw new Error("expected prompt to have a custom render method")}run(){return new Promise(async(e,r)=>{if(this.once("submit",e),this.once("cancel",r),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit("run")})}async element(e,r,o){let{options:a,state:n,symbols:u,timers:A}=this,p=A&&A[e];n.timer=p;let h=a[e]||n[e]||u[e],E=r&&r[e]!=null?r[e]:await h;if(E==="")return E;let w=await this.resolve(E,n,r,o);return!w&&r&&r[e]?this.resolve(h,n,r,o):w}async prefix(){let e=await this.element("prefix")||this.symbols,r=this.timers&&this.timers.prefix,o=this.state;return o.timer=r,Ra.isObject(e)&&(e=e[o.status]||e.pending),Ra.hasColor(e)?e:(this.styles[o.status]||this.styles.pending)(e)}async message(){let e=await this.element("message");return Ra.hasColor(e)?e:this.styles.strong(e)}async separator(){let e=await this.element("separator")||this.symbols,r=this.timers&&this.timers.separator,o=this.state;o.timer=r;let a=e[o.status]||e.pending||o.separator,n=await this.resolve(a,o);return Ra.isObject(n)&&(n=n[o.status]||n.pending),Ra.hasColor(n)?n:this.styles.muted(n)}async pointer(e,r){let o=await this.element("pointer",e,r);if(typeof o=="string"&&Ra.hasColor(o))return o;if(o){let a=this.styles,n=this.index===r,u=n?a.primary:h=>h,A=await this.resolve(o[n?"on":"off"]||o,this.state),p=Ra.hasColor(A)?A:u(A);return n?p:" ".repeat(A.length)}}async indicator(e,r){let o=await this.element("indicator",e,r);if(typeof o=="string"&&Ra.hasColor(o))return o;if(o){let a=this.styles,n=e.enabled===!0,u=n?a.success:a.dark,A=o[n?"on":"off"]||o;return Ra.hasColor(A)?A:u(A)}return""}body(){return null}footer(){if(this.state.status==="pending")return this.element("footer")}header(){if(this.state.status==="pending")return this.element("header")}async hint(){if(this.state.status==="pending"&&!this.isValue(this.state.input)){let e=await this.element("hint");return Ra.hasColor(e)?e:this.styles.muted(e)}}error(e){return this.state.submitted?"":e||this.state.error}format(e){return e}result(e){return e}validate(e){return this.options.required===!0?this.isValue(e):!0}isValue(e){return e!=null&&e!==""}resolve(e,...r){return Ra.resolve(this,e,...r)}get base(){return K1.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||Ra.height(this.stdout,25)}get width(){return this.options.columns||Ra.width(this.stdout,80)}get size(){return{width:this.width,height:this.height}}set cursor(e){this.state.cursor=e}get cursor(){return this.state.cursor}set input(e){this.state.input=e}get input(){return this.state.input}set value(e){this.state.value=e}get value(){let{input:e,value:r}=this.state,o=[r,e].find(this.isValue.bind(this));return this.isValue(o)?o:this.initial}static get prompt(){return e=>new this(e).run()}};function wAt(t){let e=a=>t[a]===void 0||typeof t[a]=="function",r=["actions","choices","initial","margin","roles","styles","symbols","theme","timers","value"],o=["body","footer","error","header","hint","indicator","message","prefix","separator","skip"];for(let a of Object.keys(t.options)){if(r.includes(a)||/^on[A-Z]/.test(a))continue;let n=t.options[a];typeof n=="function"&&e(a)?o.includes(a)||(t[a]=n.bind(t)):typeof t[a]!="function"&&(t[a]=n)}}function BAt(t){typeof t=="number"&&(t=[t,t,t,t]);let e=[].concat(t||[]),r=a=>a%2===0?` +`:" ",o=[];for(let a=0;a<4;a++){let n=r(a);e[a]?o.push(n.repeat(e[a])):o.push("")}return o}J0e.exports=K1});var Z0e=U((u_t,X0e)=>{"use strict";var vAt=Fo(),z0e={default(t,e){return e},checkbox(t,e){throw new Error("checkbox role is not implemented yet")},editable(t,e){throw new Error("editable role is not implemented yet")},expandable(t,e){throw new Error("expandable role is not implemented yet")},heading(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||"",e},input(t,e){throw new Error("input role is not implemented yet")},option(t,e){return z0e.default(t,e)},radio(t,e){throw new Error("radio role is not implemented yet")},separator(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||t.symbols.line.repeat(5),e},spacer(t,e){return e}};X0e.exports=(t,e={})=>{let r=vAt.merge({},z0e,e.roles);return r[t]||r.default}});var V1=U((A_t,the)=>{"use strict";var DAt=Xc(),SAt=AE(),PAt=Z0e(),Zb=Fo(),{reorder:q_,scrollUp:xAt,scrollDown:bAt,isObject:$0e,swap:QAt}=Zb,j_=class extends SAt{constructor(e){super(e),this.cursorHide(),this.maxSelected=e.maxSelected||1/0,this.multiple=e.multiple||!1,this.initial=e.initial||0,this.delay=e.delay||0,this.longest=0,this.num=""}async initialize(){typeof this.options.initial=="function"&&(this.initial=await this.options.initial.call(this)),await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:r,autofocus:o,suggest:a}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach(n=>n.enabled=!1),typeof a!="function"&&this.selectable.length===0)throw new Error("At least one choice must be selectable");$0e(r)&&(r=Object.keys(r)),Array.isArray(r)?(o!=null&&(this.index=this.findIndex(o)),r.forEach(n=>this.enable(this.find(n))),await this.render()):(o!=null&&(r=o),typeof r=="string"&&(r=this.findIndex(r)),typeof r=="number"&&r>-1&&(this.index=Math.max(0,Math.min(r,this.choices.length)),this.enable(this.find(this.index)))),this.isDisabled(this.focused)&&await this.down()}async toChoices(e,r){this.state.loadingChoices=!0;let o=[],a=0,n=async(u,A)=>{typeof u=="function"&&(u=await u.call(this)),u instanceof Promise&&(u=await u);for(let p=0;p(this.state.loadingChoices=!1,u))}async toChoice(e,r,o){if(typeof e=="function"&&(e=await e.call(this,this)),e instanceof Promise&&(e=await e),typeof e=="string"&&(e={name:e}),e.normalized)return e;e.normalized=!0;let a=e.value;if(e=PAt(e.role,this.options)(this,e),typeof e.disabled=="string"&&!e.hint&&(e.hint=e.disabled,e.disabled=!0),e.disabled===!0&&e.hint==null&&(e.hint="(disabled)"),e.index!=null)return e;e.name=e.name||e.key||e.title||e.value||e.message,e.message=e.message||e.name||"",e.value=[e.value,e.name].find(this.isValue.bind(this)),e.input="",e.index=r,e.cursor=0,Zb.define(e,"parent",o),e.level=o?o.level+1:1,e.indent==null&&(e.indent=o?o.indent+" ":e.indent||""),e.path=o?o.path+"."+e.name:e.name,e.enabled=!!(this.multiple&&!this.isDisabled(e)&&(e.enabled||this.isSelected(e))),this.isDisabled(e)||(this.longest=Math.max(this.longest,DAt.unstyle(e.message).length));let u={...e};return e.reset=(A=u.input,p=u.value)=>{for(let h of Object.keys(u))e[h]=u[h];e.input=A,e.value=p},a==null&&typeof e.initial=="function"&&(e.input=await e.initial.call(this,this.state,e,r)),e}async onChoice(e,r){this.emit("choice",e,r,this),typeof e.onChoice=="function"&&await e.onChoice.call(this,this.state,e,r)}async addChoice(e,r,o){let a=await this.toChoice(e,r,o);return this.choices.push(a),this.index=this.choices.length-1,this.limit=this.choices.length,a}async newItem(e,r,o){let a={name:"New choice name?",editable:!0,newChoice:!0,...e},n=await this.addChoice(a,r,o);return n.updateChoice=()=>{delete n.newChoice,n.name=n.message=n.input,n.input="",n.cursor=0},this.render()}indent(e){return e.indent==null?e.level>1?" ".repeat(e.level-1):"":e.indent}dispatch(e,r){if(this.multiple&&this[r.name])return this[r.name]();this.alert()}focus(e,r){return typeof r!="boolean"&&(r=e.enabled),r&&!e.enabled&&this.selected.length>=this.maxSelected?this.alert():(this.index=e.index,e.enabled=r&&!this.isDisabled(e),e)}space(){return this.multiple?(this.toggle(this.focused),this.render()):this.alert()}a(){if(this.maxSelectedr.enabled);return this.choices.forEach(r=>r.enabled=!e),this.render()}i(){return this.choices.length-this.selected.length>this.maxSelected?this.alert():(this.choices.forEach(e=>e.enabled=!e.enabled),this.render())}g(e=this.focused){return this.choices.some(r=>!!r.parent)?(this.toggle(e.parent&&!e.choices?e.parent:e),this.render()):this.a()}toggle(e,r){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();typeof r!="boolean"&&(r=!e.enabled),e.enabled=r,e.choices&&e.choices.forEach(a=>this.toggle(a,r));let o=e.parent;for(;o;){let a=o.choices.filter(n=>this.isDisabled(n));o.enabled=a.every(n=>n.enabled===!0),o=o.parent}return ehe(this,this.choices),this.emit("toggle",e,this),e}enable(e){return this.selected.length>=this.maxSelected?this.alert():(e.enabled=!this.isDisabled(e),e.choices&&e.choices.forEach(this.enable.bind(this)),e)}disable(e){return e.enabled=!1,e.choices&&e.choices.forEach(this.disable.bind(this)),e}number(e){this.num+=e;let r=o=>{let a=Number(o);if(a>this.choices.length-1)return this.alert();let n=this.focused,u=this.choices.find(A=>a===A.index);if(!u.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(u)===-1){let A=q_(this.choices),p=A.indexOf(u);if(n.index>p){let h=A.slice(p,p+this.limit),E=A.filter(w=>!h.includes(w));this.choices=h.concat(E)}else{let h=p-this.limit+1;this.choices=A.slice(h).concat(A.slice(0,h))}}return this.index=this.choices.indexOf(u),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise(o=>{let a=this.choices.length,n=this.num,u=(A=!1,p)=>{clearTimeout(this.numberTimeout),A&&(p=r(n)),this.num="",o(p)};if(n==="0"||n.length===1&&Number(n+"0")>a)return u(!0);if(Number(n)>a)return u(!1,this.alert());this.numberTimeout=setTimeout(()=>u(!0),this.delay)})}home(){return this.choices=q_(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,r=q_(this.choices);return this.choices=r.slice(e).concat(r.slice(0,e)),this.index=this.limit-1,this.render()}first(){return this.index=0,this.render()}last(){return this.index=this.visible.length-1,this.render()}prev(){return this.visible.length<=1?this.alert():this.up()}next(){return this.visible.length<=1?this.alert():this.down()}right(){return this.cursor>=this.input.length?this.alert():(this.cursor++,this.render())}left(){return this.cursor<=0?this.alert():(this.cursor--,this.render())}up(){let e=this.choices.length,r=this.visible.length,o=this.index;return this.options.scroll===!1&&o===0?this.alert():e>r&&o===0?this.scrollUp():(this.index=(o-1%e+e)%e,this.isDisabled()?this.up():this.render())}down(){let e=this.choices.length,r=this.visible.length,o=this.index;return this.options.scroll===!1&&o===r-1?this.alert():e>r&&o===r-1?this.scrollDown():(this.index=(o+1)%e,this.isDisabled()?this.down():this.render())}scrollUp(e=0){return this.choices=xAt(this.choices),this.index=e,this.isDisabled()?this.up():this.render()}scrollDown(e=this.visible.length-1){return this.choices=bAt(this.choices),this.index=e,this.isDisabled()?this.down():this.render()}async shiftUp(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index-1),await this.up(),this.sorting=!1;return}return this.scrollUp(this.index)}async shiftDown(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index+1),await this.down(),this.sorting=!1;return}return this.scrollDown(this.index)}pageUp(){return this.visible.length<=1?this.alert():(this.limit=Math.max(this.limit-1,0),this.index=Math.min(this.limit-1,this.index),this._limit=this.limit,this.isDisabled()?this.up():this.render())}pageDown(){return this.visible.length>=this.choices.length?this.alert():(this.index=Math.max(0,this.index),this.limit=Math.min(this.limit+1,this.choices.length),this._limit=this.limit,this.isDisabled()?this.down():this.render())}swap(e){QAt(this.choices,this.index,e)}isDisabled(e=this.focused){return e&&["disabled","collapsed","hidden","completing","readonly"].some(o=>e[o]===!0)?!0:e&&e.role==="heading"}isEnabled(e=this.focused){if(Array.isArray(e))return e.every(r=>this.isEnabled(r));if(e.choices){let r=e.choices.filter(o=>!this.isDisabled(o));return e.enabled&&r.every(o=>this.isEnabled(o))}return e.enabled&&!this.isDisabled(e)}isChoice(e,r){return e.name===r||e.index===Number(r)}isSelected(e){return Array.isArray(this.initial)?this.initial.some(r=>this.isChoice(e,r)):this.isChoice(e,this.initial)}map(e=[],r="value"){return[].concat(e||[]).reduce((o,a)=>(o[a]=this.find(a,r),o),{})}filter(e,r){let a=typeof e=="function"?e:(A,p)=>[A.name,p].includes(e),u=(this.options.multiple?this.state._choices:this.choices).filter(a);return r?u.map(A=>A[r]):u}find(e,r){if($0e(e))return r?e[r]:e;let a=typeof e=="function"?e:(u,A)=>[u.name,A].includes(e),n=this.choices.find(a);if(n)return r?n[r]:n}findIndex(e){return this.choices.indexOf(this.find(e))}async submit(){let e=this.focused;if(!e)return this.alert();if(e.newChoice)return e.input?(e.updateChoice(),this.render()):this.alert();if(this.choices.some(u=>u.newChoice))return this.alert();let{reorder:r,sort:o}=this.options,a=this.multiple===!0,n=this.selected;return n===void 0?this.alert():(Array.isArray(n)&&r!==!1&&o!==!0&&(n=Zb.reorder(n)),this.value=a?n.map(u=>u.name):n.name,super.submit())}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let r of e)this.state._choices.some(o=>o.name===r.name)||this.state._choices.push(r);if(!this._initial&&this.options.initial){this._initial=!0;let r=this.initial;if(typeof r=="string"||typeof r=="number"){let o=this.find(r);o&&(this.initial=o.index,this.focus(o,!0))}}}get choices(){return ehe(this,this.state.choices||[])}set visible(e){this.state.visible=e}get visible(){return(this.state.visible||this.choices).slice(0,this.limit)}set limit(e){this.state.limit=e}get limit(){let{state:e,options:r,choices:o}=this,a=e.limit||this._limit||r.limit||o.length;return Math.min(a,this.height)}set value(e){super.value=e}get value(){return typeof super.value!="string"&&super.value===this.initial?this.input:super.value}set index(e){this.state.index=e}get index(){return Math.max(0,this.state?this.state.index:0)}get enabled(){return this.filter(this.isEnabled.bind(this))}get focused(){let e=this.choices[this.index];return e&&this.state.submitted&&this.multiple!==!0&&(e.enabled=!0),e}get selectable(){return this.choices.filter(e=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}};function ehe(t,e){if(e instanceof Promise)return e;if(typeof e=="function"){if(Zb.isAsyncFn(e))return e;e=e.call(t,t)}for(let r of e){if(Array.isArray(r.choices)){let o=r.choices.filter(a=>!t.isDisabled(a));r.enabled=o.every(a=>a.enabled===!0)}t.isDisabled(r)===!0&&delete r.enabled}return e}the.exports=j_});var D0=U((f_t,rhe)=>{"use strict";var kAt=V1(),G_=Fo(),W_=class extends kAt{constructor(e){super(e),this.emptyError=this.options.emptyError||"No items were selected"}async dispatch(e,r){if(this.multiple)return this[r.name]?await this[r.name](e,r):await super.dispatch(e,r);this.alert()}separator(){if(this.options.separator)return super.separator();let e=this.styles.muted(this.symbols.ellipsis);return this.state.submitted?super.separator():e}pointer(e,r){return!this.multiple||this.options.pointer?super.pointer(e,r):""}indicator(e,r){return this.multiple?super.indicator(e,r):""}choiceMessage(e,r){let o=this.resolve(e.message,this.state,e,r);return e.role==="heading"&&!G_.hasColor(o)&&(o=this.styles.strong(o)),this.resolve(o,this.state,e,r)}choiceSeparator(){return":"}async renderChoice(e,r){await this.onChoice(e,r);let o=this.index===r,a=await this.pointer(e,r),n=await this.indicator(e,r)+(e.pad||""),u=await this.resolve(e.hint,this.state,e,r);u&&!G_.hasColor(u)&&(u=this.styles.muted(u));let A=this.indent(e),p=await this.choiceMessage(e,r),h=()=>[this.margin[3],A+a+n,p,this.margin[1],u].filter(Boolean).join(" ");return e.role==="heading"?h():e.disabled?(G_.hasColor(p)||(p=this.styles.disabled(p)),h()):(o&&(p=this.styles.em(p)),h())}async renderChoices(){if(this.state.loading==="choices")return this.styles.warning("Loading choices");if(this.state.submitted)return"";let e=this.visible.map(async(n,u)=>await this.renderChoice(n,u)),r=await Promise.all(e);r.length||r.push(this.styles.danger("No matching choices"));let o=this.margin[0]+r.join(` +`),a;return this.options.choicesHeader&&(a=await this.resolve(this.options.choicesHeader,this.state)),[a,o].filter(Boolean).join(` +`)}format(){return!this.state.submitted||this.state.cancelled?"":Array.isArray(this.selected)?this.selected.map(e=>this.styles.primary(e.name)).join(", "):this.styles.primary(this.selected.name)}async render(){let{submitted:e,size:r}=this.state,o="",a=await this.header(),n=await this.prefix(),u=await this.separator(),A=await this.message();this.options.promptLine!==!1&&(o=[n,A,u,""].join(" "),this.state.prompt=o);let p=await this.format(),h=await this.error()||await this.hint(),E=await this.renderChoices(),w=await this.footer();p&&(o+=p),h&&!o.includes(h)&&(o+=" "+h),e&&!p&&!E.trim()&&this.multiple&&this.emptyError!=null&&(o+=this.styles.danger(this.emptyError)),this.clear(r),this.write([a,o,E,w].filter(Boolean).join(` +`)),this.write(this.margin[2]),this.restore()}};rhe.exports=W_});var ihe=U((p_t,nhe)=>{"use strict";var FAt=D0(),RAt=(t,e)=>{let r=t.toLowerCase();return o=>{let n=o.toLowerCase().indexOf(r),u=e(o.slice(n,n+r.length));return n>=0?o.slice(0,n)+u+o.slice(n+r.length):o}},Y_=class extends FAt{constructor(e){super(e),this.cursorShow()}moveCursor(e){this.state.cursor+=e}dispatch(e){return this.append(e)}space(e){return this.options.multiple?super.space(e):this.append(e)}append(e){let{cursor:r,input:o}=this.state;return this.input=o.slice(0,r)+e+o.slice(r),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:r}=this.state;return r?(this.input=r.slice(0,e-1)+r.slice(e),this.moveCursor(-1),this.complete()):this.alert()}deleteForward(){let{cursor:e,input:r}=this.state;return r[e]===void 0?this.alert():(this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.complete())}number(e){return this.append(e)}async complete(){this.completing=!0,this.choices=await this.suggest(this.input,this.state._choices),this.state.limit=void 0,this.index=Math.min(Math.max(this.visible.length-1,0),this.index),await this.render(),this.completing=!1}suggest(e=this.input,r=this.state._choices){if(typeof this.options.suggest=="function")return this.options.suggest.call(this,e,r);let o=e.toLowerCase();return r.filter(a=>a.message.toLowerCase().includes(o))}pointer(){return""}format(){if(!this.focused)return this.input;if(this.options.multiple&&this.state.submitted)return this.selected.map(e=>this.styles.primary(e.message)).join(", ");if(this.state.submitted){let e=this.value=this.input=this.focused.value;return this.styles.primary(e)}return this.input}async render(){if(this.state.status!=="pending")return super.render();let e=this.options.highlight?this.options.highlight.bind(this):this.styles.placeholder,r=RAt(this.input,e),o=this.choices;this.choices=o.map(a=>({...a,message:r(a.message)})),await super.render(),this.choices=o}submit(){return this.options.multiple&&(this.value=this.selected.map(e=>e.name)),super.submit()}};nhe.exports=Y_});var V_=U((h_t,she)=>{"use strict";var K_=Fo();she.exports=(t,e={})=>{t.cursorHide();let{input:r="",initial:o="",pos:a,showCursor:n=!0,color:u}=e,A=u||t.styles.placeholder,p=K_.inverse(t.styles.primary),h=R=>p(t.styles.black(R)),E=r,w=" ",v=h(w);if(t.blink&&t.blink.off===!0&&(h=R=>R,v=""),n&&a===0&&o===""&&r==="")return h(w);if(n&&a===0&&(r===o||r===""))return h(o[0])+A(o.slice(1));o=K_.isPrimitive(o)?`${o}`:"",r=K_.isPrimitive(r)?`${r}`:"";let b=o&&o.startsWith(r)&&o!==r,C=b?h(o[r.length]):v;if(a!==r.length&&n===!0&&(E=r.slice(0,a)+h(r[a])+r.slice(a+1),C=""),n===!1&&(C=""),b){let R=t.styles.unstyle(E+C);return E+C+A(o.slice(R.length))}return E+C}});var $b=U((g_t,ohe)=>{"use strict";var TAt=Xc(),NAt=D0(),LAt=V_(),J_=class extends NAt{constructor(e){super({...e,multiple:!0}),this.type="form",this.initial=this.options.initial,this.align=[this.options.align,"right"].find(r=>r!=null),this.emptyError="",this.values={}}async reset(e){return await super.reset(),e===!0&&(this._index=this.index),this.index=this._index,this.values={},this.choices.forEach(r=>r.reset&&r.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let r=this.focused;if(!r)return this.alert();let{cursor:o,input:a}=r;return r.value=r.input=a.slice(0,o)+e+a.slice(o),r.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:r,input:o}=e;return e.value=e.input=o.slice(0,r-1)+o.slice(r),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:r,input:o}=e;if(o[r]===void 0)return this.alert();let a=`${o}`.slice(0,r)+`${o}`.slice(r+1);return e.value=e.input=a,this.render()}right(){let e=this.focused;return e?e.cursor>=e.input.length?this.alert():(e.cursor++,this.render()):this.alert()}left(){let e=this.focused;return e?e.cursor<=0?this.alert():(e.cursor--,this.render()):this.alert()}space(e,r){return this.dispatch(e,r)}number(e,r){return this.dispatch(e,r)}next(){let e=this.focused;if(!e)return this.alert();let{initial:r,input:o}=e;return r&&r.startsWith(o)&&o!==r?(e.value=e.input=r,e.cursor=e.value.length,this.render()):super.next()}prev(){let e=this.focused;return e?e.cursor===0?super.prev():(e.value=e.input="",e.cursor=0,this.render()):this.alert()}separator(){return""}format(e){return this.state.submitted?"":super.format(e)}pointer(){return""}indicator(e){return e.input?"\u29BF":"\u2299"}async choiceSeparator(e,r){let o=await this.resolve(e.separator,this.state,e,r)||":";return o?" "+this.styles.disabled(o):""}async renderChoice(e,r){await this.onChoice(e,r);let{state:o,styles:a}=this,{cursor:n,initial:u="",name:A,hint:p,input:h=""}=e,{muted:E,submitted:w,primary:v,danger:b}=a,C=p,R=this.index===r,L=e.validate||(()=>!0),_=await this.choiceSeparator(e,r),V=e.message;this.align==="right"&&(V=V.padStart(this.longest+1," ")),this.align==="left"&&(V=V.padEnd(this.longest+1," "));let re=this.values[A]=h||u,oe=h?"success":"dark";await L.call(e,re,this.state)!==!0&&(oe="danger");let pe=a[oe],he=pe(await this.indicator(e,r))+(e.pad||""),ve=this.indent(e),ge=()=>[ve,he,V+_,h,C].filter(Boolean).join(" ");if(o.submitted)return V=TAt.unstyle(V),h=w(h),C="",ge();if(e.format)h=await e.format.call(this,h,e,r);else{let le=this.styles.muted;h=LAt(this,{input:h,initial:u,pos:n,showCursor:R,color:le})}return this.isValue(h)||(h=this.styles.muted(this.symbols.ellipsis)),e.result&&(this.values[A]=await e.result.call(this,re,e,r)),R&&(V=v(V)),e.error?h+=(h?" ":"")+b(e.error.trim()):e.hint&&(h+=(h?" ":"")+E(e.hint.trim())),ge()}async submit(){return this.value=this.values,super.base.submit.call(this)}};ohe.exports=J_});var z_=U((d_t,lhe)=>{"use strict";var OAt=$b(),MAt=()=>{throw new Error("expected prompt to have a custom authenticate method")},ahe=(t=MAt)=>{class e extends OAt{constructor(o){super(o)}async submit(){this.value=await t.call(this,this.values,this.state),super.base.submit.call(this)}static create(o){return ahe(o)}}return e};lhe.exports=ahe()});var Ahe=U((m_t,uhe)=>{"use strict";var UAt=z_();function _At(t,e){return t.username===this.options.username&&t.password===this.options.password}var che=(t=_At)=>{let e=[{name:"username",message:"username"},{name:"password",message:"password",format(o){return this.options.showPassword?o:(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(o.length))}}];class r extends UAt.create(t){constructor(a){super({...a,choices:e})}static create(a){return che(a)}}return r};uhe.exports=che()});var eQ=U((y_t,fhe)=>{"use strict";var HAt=AE(),{isPrimitive:qAt,hasColor:jAt}=Fo(),X_=class extends HAt{constructor(e){super(e),this.cursorHide()}async initialize(){let e=await this.resolve(this.initial,this.state);this.input=await this.cast(e),await super.initialize()}dispatch(e){return this.isValue(e)?(this.input=e,this.submit()):this.alert()}format(e){let{styles:r,state:o}=this;return o.submitted?r.success(e):r.primary(e)}cast(e){return this.isTrue(e)}isTrue(e){return/^[ty1]/i.test(e)}isFalse(e){return/^[fn0]/i.test(e)}isValue(e){return qAt(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status==="pending"){let e=await this.element("hint");return jAt(e)?e:this.styles.muted(e)}}async render(){let{input:e,size:r}=this.state,o=await this.prefix(),a=await this.separator(),n=await this.message(),u=this.styles.muted(this.default),A=[o,n,u,a].filter(Boolean).join(" ");this.state.prompt=A;let p=await this.header(),h=this.value=this.cast(e),E=await this.format(h),w=await this.error()||await this.hint(),v=await this.footer();w&&!A.includes(w)&&(E+=" "+w),A+=" "+E,this.clear(r),this.write([p,A,v].filter(Boolean).join(` +`)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}};fhe.exports=X_});var hhe=U((C_t,phe)=>{"use strict";var GAt=eQ(),Z_=class extends GAt{constructor(e){super(e),this.default=this.options.default||(this.initial?"(Y/n)":"(y/N)")}};phe.exports=Z_});var dhe=U((E_t,ghe)=>{"use strict";var WAt=D0(),YAt=$b(),fE=YAt.prototype,$_=class extends WAt{constructor(e){super({...e,multiple:!0}),this.align=[this.options.align,"left"].find(r=>r!=null),this.emptyError="",this.values={}}dispatch(e,r){let o=this.focused,a=o.parent||{};return!o.editable&&!a.editable&&(e==="a"||e==="i")?super[e]():fE.dispatch.call(this,e,r)}append(e,r){return fE.append.call(this,e,r)}delete(e,r){return fE.delete.call(this,e,r)}space(e){return this.focused.editable?this.append(e):super.space()}number(e){return this.focused.editable?this.append(e):super.number(e)}next(){return this.focused.editable?fE.next.call(this):super.next()}prev(){return this.focused.editable?fE.prev.call(this):super.prev()}async indicator(e,r){let o=e.indicator||"",a=e.editable?o:super.indicator(e,r);return await this.resolve(a,this.state,e,r)||""}indent(e){return e.role==="heading"?"":e.editable?" ":" "}async renderChoice(e,r){return e.indent="",e.editable?fE.renderChoice.call(this,e,r):super.renderChoice(e,r)}error(){return""}footer(){return this.state.error}async validate(){let e=!0;for(let r of this.choices){if(typeof r.validate!="function"||r.role==="heading")continue;let o=r.parent?this.value[r.parent.name]:this.value;if(r.editable?o=r.value===r.name?r.initial||"":r.value:this.isDisabled(r)||(o=r.enabled===!0),e=await r.validate(o,this.state),e!==!0)break}return e!==!0&&(this.state.error=typeof e=="string"?e:"Invalid Input"),e}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some(e=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let r=e.parent?this.value[e.parent.name]:this.value;if(e.role==="heading"){this.value[e.name]={};continue}e.editable?r[e.name]=e.value===e.name?e.initial||"":e.value:this.isDisabled(e)||(r[e.name]=e.enabled===!0)}return this.base.submit.call(this)}};ghe.exports=$_});var Vd=U((I_t,mhe)=>{"use strict";var KAt=AE(),VAt=V_(),{isPrimitive:JAt}=Fo(),e8=class extends KAt{constructor(e){super(e),this.initial=JAt(this.initial)?String(this.initial):"",this.initial&&this.cursorHide(),this.state.prevCursor=0,this.state.clipboard=[]}async keypress(e,r={}){let o=this.state.prevKeypress;return this.state.prevKeypress=r,this.options.multiline===!0&&r.name==="return"&&(!o||o.name!=="return")?this.append(` +`,r):super.keypress(e,r)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value="",this.cursor=0,this.render()}dispatch(e,r){if(!e||r.ctrl||r.code)return this.alert();this.append(e)}append(e){let{cursor:r,input:o}=this.state;this.input=`${o}`.slice(0,r)+e+`${o}`.slice(r),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:r}=this.state;if(e<=0)return this.alert();this.input=`${r}`.slice(0,e-1)+`${r}`.slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:r}=this.state;if(r[e]===void 0)return this.alert();this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.render()}cutForward(){let e=this.cursor;if(this.input.length<=e)return this.alert();this.state.clipboard.push(this.input.slice(e)),this.input=this.input.slice(0,e),this.render()}cutLeft(){let e=this.cursor;if(e===0)return this.alert();let r=this.input.slice(0,e),o=this.input.slice(e),a=r.split(" ");this.state.clipboard.push(a.pop()),this.input=a.join(" "),this.cursor=this.input.length,this.input+=o,this.render()}paste(){if(!this.state.clipboard.length)return this.alert();this.insert(this.state.clipboard.pop()),this.render()}toggleCursor(){this.state.prevCursor?(this.cursor=this.state.prevCursor,this.state.prevCursor=0):(this.state.prevCursor=this.cursor,this.cursor=0),this.render()}first(){this.cursor=0,this.render()}last(){this.cursor=this.input.length-1,this.render()}next(){let e=this.initial!=null?String(this.initial):"";if(!e||!e.startsWith(this.input))return this.alert();this.input=this.initial,this.cursor=this.initial.length,this.render()}prev(){if(!this.input)return this.alert();this.reset()}backward(){return this.left()}forward(){return this.right()}right(){return this.cursor>=this.input.length?this.alert():(this.moveCursor(1),this.render())}left(){return this.cursor<=0?this.alert():(this.moveCursor(-1),this.render())}isValue(e){return!!e}async format(e=this.value){let r=await this.resolve(this.initial,this.state);return this.state.submitted?this.styles.submitted(e||r):VAt(this,{input:e,initial:r,pos:this.cursor})}async render(){let e=this.state.size,r=await this.prefix(),o=await this.separator(),a=await this.message(),n=[r,a,o].filter(Boolean).join(" ");this.state.prompt=n;let u=await this.header(),A=await this.format(),p=await this.error()||await this.hint(),h=await this.footer();p&&!A.includes(p)&&(A+=" "+p),n+=" "+A,this.clear(e),this.write([u,n,h].filter(Boolean).join(` +`)),this.restore()}};mhe.exports=e8});var Che=U((w_t,yhe)=>{"use strict";var zAt=t=>t.filter((e,r)=>t.lastIndexOf(e)===r),tQ=t=>zAt(t).filter(Boolean);yhe.exports=(t,e={},r="")=>{let{past:o=[],present:a=""}=e,n,u;switch(t){case"prev":case"undo":return n=o.slice(0,o.length-1),u=o[o.length-1]||"",{past:tQ([r,...n]),present:u};case"next":case"redo":return n=o.slice(1),u=o[0]||"",{past:tQ([...n,r]),present:u};case"save":return{past:tQ([...o,r]),present:""};case"remove":return u=tQ(o.filter(A=>A!==r)),a="",u.length&&(a=u.pop()),{past:u,present:a};default:throw new Error(`Invalid action: "${t}"`)}}});var r8=U((B_t,Ihe)=>{"use strict";var XAt=Vd(),Ehe=Che(),t8=class extends XAt{constructor(e){super(e);let r=this.options.history;if(r&&r.store){let o=r.values||this.initial;this.autosave=!!r.autosave,this.store=r.store,this.data=this.store.get("values")||{past:[],present:o},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){return this.store?(this.data=Ehe(e,this.data,this.input),this.data.present?(this.input=this.data.present,this.cursor=this.input.length,this.render()):this.alert()):this.alert()}altUp(){return this.completion("prev")}altDown(){return this.completion("next")}prev(){return this.save(),super.prev()}save(){!this.store||(this.data=Ehe("save",this.data,this.input),this.store.set("values",this.data))}submit(){return this.store&&this.autosave===!0&&this.save(),super.submit()}};Ihe.exports=t8});var Bhe=U((v_t,whe)=>{"use strict";var ZAt=Vd(),n8=class extends ZAt{format(){return""}};whe.exports=n8});var Dhe=U((D_t,vhe)=>{"use strict";var $At=Vd(),i8=class extends $At{constructor(e={}){super(e),this.sep=this.options.separator||/, */,this.initial=e.initial||""}split(e=this.value){return e?String(e).split(this.sep):[]}format(){let e=this.state.submitted?this.styles.primary:r=>r;return this.list.map(e).join(", ")}async submit(e){let r=this.state.error||await this.validate(this.list,this.state);return r!==!0?(this.state.error=r,super.submit()):(this.value=this.list,super.submit())}get list(){return this.split()}};vhe.exports=i8});var Phe=U((S_t,She)=>{"use strict";var eft=D0(),s8=class extends eft{constructor(e){super({...e,multiple:!0})}};She.exports=s8});var a8=U((P_t,xhe)=>{"use strict";var tft=Vd(),o8=class extends tft{constructor(e={}){super({style:"number",...e}),this.min=this.isValue(e.min)?this.toNumber(e.min):-1/0,this.max=this.isValue(e.max)?this.toNumber(e.max):1/0,this.delay=e.delay!=null?e.delay:1e3,this.float=e.float!==!1,this.round=e.round===!0||e.float===!1,this.major=e.major||10,this.minor=e.minor||1,this.initial=e.initial!=null?e.initial:"",this.input=String(this.initial),this.cursor=this.input.length,this.cursorShow()}append(e){return!/[-+.]/.test(e)||e==="."&&this.input.includes(".")?this.alert("invalid number"):super.append(e)}number(e){return super.append(e)}next(){return this.input&&this.input!==this.initial?this.alert():this.isValue(this.initial)?(this.input=this.initial,this.cursor=String(this.initial).length,this.render()):this.alert()}up(e){let r=e||this.minor,o=this.toNumber(this.input);return o>this.max+r?this.alert():(this.input=`${o+r}`,this.render())}down(e){let r=e||this.minor,o=this.toNumber(this.input);return othis.isValue(r));return this.value=this.toNumber(e||0),super.submit()}};xhe.exports=o8});var Qhe=U((x_t,bhe)=>{bhe.exports=a8()});var Fhe=U((b_t,khe)=>{"use strict";var rft=Vd(),l8=class extends rft{constructor(e){super(e),this.cursorShow()}format(e=this.input){return this.keypressed?(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length)):""}};khe.exports=l8});var Nhe=U((Q_t,The)=>{"use strict";var nft=Xc(),ift=V1(),Rhe=Fo(),c8=class extends ift{constructor(e={}){super(e),this.widths=[].concat(e.messageWidth||50),this.align=[].concat(e.align||"left"),this.linebreak=e.linebreak||!1,this.edgeLength=e.edgeLength||3,this.newline=e.newline||` + `;let r=e.startNumber||1;typeof this.scale=="number"&&(this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((o,a)=>({name:a+r})))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let e=0;for(let r of this.choices){e=Math.max(e,r.message.length),r.scaleIndex=r.initial||2,r.scale=[];for(let o=0;o=this.scale.length-1?this.alert():(e.scaleIndex++,this.render())}left(){let e=this.focused;return e.scaleIndex<=0?this.alert():(e.scaleIndex--,this.render())}indent(){return""}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.index)).join(", "):""}pointer(){return""}renderScaleKey(){return this.scaleKey===!1||this.state.submitted?"":["",...this.scale.map(o=>` ${o.name} - ${o.message}`)].map(o=>this.styles.muted(o)).join(` +`)}renderScaleHeading(e){let r=this.scale.map(p=>p.name);typeof this.options.renderScaleHeading=="function"&&(r=this.options.renderScaleHeading.call(this,e));let o=this.scaleLength-r.join("").length,a=Math.round(o/(r.length-1)),u=r.map(p=>this.styles.strong(p)).join(" ".repeat(a)),A=" ".repeat(this.widths[0]);return this.margin[3]+A+this.margin[1]+u}scaleIndicator(e,r,o){if(typeof this.options.scaleIndicator=="function")return this.options.scaleIndicator.call(this,e,r,o);let a=e.scaleIndex===r.index;return r.disabled?this.styles.hint(this.symbols.radio.disabled):a?this.styles.success(this.symbols.radio.on):this.symbols.radio.off}renderScale(e,r){let o=e.scale.map(n=>this.scaleIndicator(e,n,r)),a=this.term==="Hyper"?"":" ";return o.join(a+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,r){await this.onChoice(e,r);let o=this.index===r,a=await this.pointer(e,r),n=await e.hint;n&&!Rhe.hasColor(n)&&(n=this.styles.muted(n));let u=C=>this.margin[3]+C.replace(/\s+$/,"").padEnd(this.widths[0]," "),A=this.newline,p=this.indent(e),h=await this.resolve(e.message,this.state,e,r),E=await this.renderScale(e,r),w=this.margin[1]+this.margin[3];this.scaleLength=nft.unstyle(E).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-w.length);let b=Rhe.wordWrap(h,{width:this.widths[0],newline:A}).split(` +`).map(C=>u(C)+this.margin[1]);return o&&(E=this.styles.info(E),b=b.map(C=>this.styles.info(C))),b[0]+=E,this.linebreak&&b.push(""),[p+a,b.join(` +`)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return"";this.tableize();let e=this.visible.map(async(a,n)=>await this.renderChoice(a,n)),r=await Promise.all(e),o=await this.renderScaleHeading();return this.margin[0]+[o,...r.map(a=>a.join(" "))].join(` +`)}async render(){let{submitted:e,size:r}=this.state,o=await this.prefix(),a=await this.separator(),n=await this.message(),u="";this.options.promptLine!==!1&&(u=[o,n,a,""].join(" "),this.state.prompt=u);let A=await this.header(),p=await this.format(),h=await this.renderScaleKey(),E=await this.error()||await this.hint(),w=await this.renderChoices(),v=await this.footer(),b=this.emptyError;p&&(u+=p),E&&!u.includes(E)&&(u+=" "+E),e&&!p&&!w.trim()&&this.multiple&&b!=null&&(u+=this.styles.danger(b)),this.clear(r),this.write([A,u,h,w,v].filter(Boolean).join(` +`)),this.state.submitted||this.write(this.margin[2]),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIndex;return this.base.submit.call(this)}};The.exports=c8});var Mhe=U((k_t,Ohe)=>{"use strict";var Lhe=Xc(),sft=(t="")=>typeof t=="string"?t.replace(/^['"]|['"]$/g,""):"",A8=class{constructor(e){this.name=e.key,this.field=e.field||{},this.value=sft(e.initial||this.field.initial||""),this.message=e.message||this.name,this.cursor=0,this.input="",this.lines=[]}},oft=async(t={},e={},r=o=>o)=>{let o=new Set,a=t.fields||[],n=t.template,u=[],A=[],p=[],h=1;typeof n=="function"&&(n=await n());let E=-1,w=()=>n[++E],v=()=>n[E+1],b=C=>{C.line=h,u.push(C)};for(b({type:"bos",value:""});Eoe.name===_.key);_.field=a.find(oe=>oe.name===_.key),re||(re=new A8(_),A.push(re)),re.lines.push(_.line-1);continue}let R=u[u.length-1];R.type==="text"&&R.line===h?R.value+=C:b({type:"text",value:C})}return b({type:"eos",value:""}),{input:n,tabstops:u,unique:o,keys:p,items:A}};Ohe.exports=async t=>{let e=t.options,r=new Set(e.required===!0?[]:e.required||[]),o={...e.values,...e.initial},{tabstops:a,items:n,keys:u}=await oft(e,o),A=u8("result",t,e),p=u8("format",t,e),h=u8("validate",t,e,!0),E=t.isValue.bind(t);return async(w={},v=!1)=>{let b=0;w.required=r,w.items=n,w.keys=u,w.output="";let C=async(V,re,oe,pe)=>{let he=await h(V,re,oe,pe);return he===!1?"Invalid field "+oe.name:he};for(let V of a){let re=V.value,oe=V.key;if(V.type!=="template"){re&&(w.output+=re);continue}if(V.type==="template"){let pe=n.find(Pe=>Pe.name===oe);e.required===!0&&w.required.add(pe.name);let he=[pe.input,w.values[pe.value],pe.value,re].find(E),ge=(pe.field||{}).message||V.inner;if(v){let Pe=await C(w.values[oe],w,pe,b);if(Pe&&typeof Pe=="string"||Pe===!1){w.invalid.set(oe,Pe);continue}w.invalid.delete(oe);let g=await A(w.values[oe],w,pe,b);w.output+=Lhe.unstyle(g);continue}pe.placeholder=!1;let le=re;re=await p(re,w,pe,b),he!==re?(w.values[oe]=he,re=t.styles.typing(he),w.missing.delete(ge)):(w.values[oe]=void 0,he=`<${ge}>`,re=t.styles.primary(he),pe.placeholder=!0,w.required.has(oe)&&w.missing.add(ge)),w.missing.has(ge)&&w.validating&&(re=t.styles.warning(he)),w.invalid.has(oe)&&w.validating&&(re=t.styles.danger(he)),b===w.index&&(le!==re?re=t.styles.underline(re):re=t.styles.heading(Lhe.unstyle(re))),b++}re&&(w.output+=re)}let R=w.output.split(` +`).map(V=>" "+V),L=n.length,_=0;for(let V of n)w.invalid.has(V.name)&&V.lines.forEach(re=>{R[re][0]===" "&&(R[re]=w.styles.danger(w.symbols.bullet)+R[re].slice(1))}),t.isValue(w.values[V.name])&&_++;return w.completed=(_/L*100).toFixed(0),w.output=R.join(` +`),w.output}};function u8(t,e,r,o){return(a,n,u,A)=>typeof u.field[t]=="function"?u.field[t].call(e,a,n,u,A):[o,a].find(p=>e.isValue(p))}});var _he=U((F_t,Uhe)=>{"use strict";var aft=Xc(),lft=Mhe(),cft=AE(),f8=class extends cft{constructor(e){super(e),this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await lft(this),await super.initialize()}async reset(e){this.state.keys=[],this.state.invalid=new Map,this.state.missing=new Set,this.state.completed=0,this.state.values={},e!==!0&&(await this.initialize(),await this.render())}moveCursor(e){let r=this.getItem();this.cursor+=e,r.cursor+=e}dispatch(e,r){if(!r.code&&!r.ctrl&&e!=null&&this.getItem()){this.append(e,r);return}this.alert()}append(e,r){let o=this.getItem(),a=o.input.slice(0,this.cursor),n=o.input.slice(this.cursor);this.input=o.input=`${a}${e}${n}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let r=e.input.slice(this.cursor),o=e.input.slice(0,this.cursor-1);this.input=e.input=`${o}${r}`,this.moveCursor(-1),this.render()}increment(e){return e>=this.state.keys.length-1?0:e+1}decrement(e){return e<=0?this.state.keys.length-1:e-1}first(){this.state.index=0,this.render()}last(){this.state.index=this.state.keys.length-1,this.render()}right(){if(this.cursor>=this.input.length)return this.alert();this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();this.moveCursor(-1),this.render()}prev(){this.state.index=this.decrement(this.state.index),this.getItem(),this.render()}next(){this.state.index=this.increment(this.state.index),this.getItem(),this.render()}up(){this.prev()}down(){this.next()}format(e){let r=this.state.completed<100?this.styles.warning:this.styles.success;return this.state.submitted===!0&&this.state.completed!==100&&(r=this.styles.danger),r(`${this.state.completed}% completed`)}async render(){let{index:e,keys:r=[],submitted:o,size:a}=this.state,n=[this.options.newline,` +`].find(V=>V!=null),u=await this.prefix(),A=await this.separator(),p=await this.message(),h=[u,p,A].filter(Boolean).join(" ");this.state.prompt=h;let E=await this.header(),w=await this.error()||"",v=await this.hint()||"",b=o?"":await this.interpolate(this.state),C=this.state.key=r[e]||"",R=await this.format(C),L=await this.footer();R&&(h+=" "+R),v&&!R&&this.state.completed===0&&(h+=" "+v),this.clear(a);let _=[E,h,b,L,w.trim()];this.write(_.filter(Boolean).join(n)),this.restore()}getItem(e){let{items:r,keys:o,index:a}=this.state,n=r.find(u=>u.name===o[a]);return n&&n.input!=null&&(this.input=n.input,this.cursor=n.cursor),n}async submit(){typeof this.interpolate!="function"&&await this.initialize(),await this.interpolate(this.state,!0);let{invalid:e,missing:r,output:o,values:a}=this.state;if(e.size){let A="";for(let[p,h]of e)A+=`Invalid ${p}: ${h} +`;return this.state.error=A,super.submit()}if(r.size)return this.state.error="Required: "+[...r.keys()].join(", "),super.submit();let u=aft.unstyle(o).split(` +`).map(A=>A.slice(1)).join(` +`);return this.value={values:a,result:u},super.submit()}};Uhe.exports=f8});var qhe=U((R_t,Hhe)=>{"use strict";var uft="(Use + to sort)",Aft=D0(),p8=class extends Aft{constructor(e){super({...e,reorder:!1,sort:!0,multiple:!0}),this.state.hint=[this.options.hint,uft].find(this.isValue.bind(this))}indicator(){return""}async renderChoice(e,r){let o=await super.renderChoice(e,r),a=this.symbols.identicalTo+" ",n=this.index===r&&this.sorting?this.styles.muted(a):" ";return this.options.drag===!1&&(n=""),this.options.numbered===!0?n+`${r+1} - `+o:n+o}get selected(){return this.choices}submit(){return this.value=this.choices.map(e=>e.value),super.submit()}};Hhe.exports=p8});var Ghe=U((T_t,jhe)=>{"use strict";var fft=V1(),h8=class extends fft{constructor(e={}){if(super(e),this.emptyError=e.emptyError||"No items were selected",this.term=process.env.TERM_PROGRAM,!this.options.header){let r=["","4 - Strongly Agree","3 - Agree","2 - Neutral","1 - Disagree","0 - Strongly Disagree",""];r=r.map(o=>this.styles.muted(o)),this.state.header=r.join(` + `)}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let r=await super.toChoices(...e);for(let o of r)o.scale=pft(5,this.options),o.scaleIdx=2;return r}dispatch(){this.alert()}space(){let e=this.focused,r=e.scale[e.scaleIdx],o=r.selected;return e.scale.forEach(a=>a.selected=!1),r.selected=!o,this.render()}indicator(){return""}pointer(){return""}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIdx>=e.scale.length-1?this.alert():(e.scaleIdx++,this.render())}left(){let e=this.focused;return e.scaleIdx<=0?this.alert():(e.scaleIdx--,this.render())}indent(){return" "}async renderChoice(e,r){await this.onChoice(e,r);let o=this.index===r,a=this.term==="Hyper",n=a?9:8,u=a?"":" ",A=this.symbols.line.repeat(n),p=" ".repeat(n+(a?0:1)),h=re=>(re?this.styles.success("\u25C9"):"\u25EF")+u,E=r+1+".",w=o?this.styles.heading:this.styles.noop,v=await this.resolve(e.message,this.state,e,r),b=this.indent(e),C=b+e.scale.map((re,oe)=>h(oe===e.scaleIdx)).join(A),R=re=>re===e.scaleIdx?w(re):re,L=b+e.scale.map((re,oe)=>R(oe)).join(p),_=()=>[E,v].filter(Boolean).join(" "),V=()=>[_(),C,L," "].filter(Boolean).join(` +`);return o&&(C=this.styles.cyan(C),L=this.styles.cyan(L)),V()}async renderChoices(){if(this.state.submitted)return"";let e=this.visible.map(async(o,a)=>await this.renderChoice(o,a)),r=await Promise.all(e);return r.length||r.push(this.styles.danger("No matching choices")),r.join(` +`)}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.scaleIdx)).join(", "):""}async render(){let{submitted:e,size:r}=this.state,o=await this.prefix(),a=await this.separator(),n=await this.message(),u=[o,n,a].filter(Boolean).join(" ");this.state.prompt=u;let A=await this.header(),p=await this.format(),h=await this.error()||await this.hint(),E=await this.renderChoices(),w=await this.footer();(p||!h)&&(u+=" "+p),h&&!u.includes(h)&&(u+=" "+h),e&&!p&&!E&&this.multiple&&this.type!=="form"&&(u+=this.styles.danger(this.emptyError)),this.clear(r),this.write([u,A,E,w].filter(Boolean).join(` +`)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}};function pft(t,e={}){if(Array.isArray(e.scale))return e.scale.map(o=>({...o}));let r=[];for(let o=1;o{Whe.exports=r8()});var Vhe=U((L_t,Khe)=>{"use strict";var hft=eQ(),g8=class extends hft{async initialize(){await super.initialize(),this.value=this.initial=!!this.options.initial,this.disabled=this.options.disabled||"no",this.enabled=this.options.enabled||"yes",await this.render()}reset(){this.value=this.initial,this.render()}delete(){this.alert()}toggle(){this.value=!this.value,this.render()}enable(){if(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)return this.alert();this.value=!1,this.render()}up(){this.toggle()}down(){this.toggle()}right(){this.toggle()}left(){this.toggle()}next(){this.toggle()}prev(){this.toggle()}dispatch(e="",r){switch(e.toLowerCase()){case" ":return this.toggle();case"1":case"y":case"t":return this.enable();case"0":case"n":case"f":return this.disable();default:return this.alert()}}format(){let e=o=>this.styles.primary.underline(o);return[this.value?this.disabled:e(this.disabled),this.value?e(this.enabled):this.enabled].join(this.styles.muted(" / "))}async render(){let{size:e}=this.state,r=await this.header(),o=await this.prefix(),a=await this.separator(),n=await this.message(),u=await this.format(),A=await this.error()||await this.hint(),p=await this.footer(),h=[o,n,a,u].join(" ");this.state.prompt=h,A&&!h.includes(A)&&(h+=" "+A),this.clear(e),this.write([r,h,p].filter(Boolean).join(` +`)),this.write(this.margin[2]),this.restore()}};Khe.exports=g8});var zhe=U((O_t,Jhe)=>{"use strict";var gft=D0(),d8=class extends gft{constructor(e){if(super(e),typeof this.options.correctChoice!="number"||this.options.correctChoice<0)throw new Error("Please specify the index of the correct answer from the list of choices")}async toChoices(e,r){let o=await super.toChoices(e,r);if(o.length<2)throw new Error("Please give at least two choices to the user");if(this.options.correctChoice>o.length)throw new Error("Please specify the index of the correct answer from the list of choices");return o}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}};Jhe.exports=d8});var Zhe=U(m8=>{"use strict";var Xhe=Fo(),ps=(t,e)=>{Xhe.defineExport(m8,t,e),Xhe.defineExport(m8,t.toLowerCase(),e)};ps("AutoComplete",()=>ihe());ps("BasicAuth",()=>Ahe());ps("Confirm",()=>hhe());ps("Editable",()=>dhe());ps("Form",()=>$b());ps("Input",()=>r8());ps("Invisible",()=>Bhe());ps("List",()=>Dhe());ps("MultiSelect",()=>Phe());ps("Numeral",()=>Qhe());ps("Password",()=>Fhe());ps("Scale",()=>Nhe());ps("Select",()=>D0());ps("Snippet",()=>_he());ps("Sort",()=>qhe());ps("Survey",()=>Ghe());ps("Text",()=>Yhe());ps("Toggle",()=>Vhe());ps("Quiz",()=>zhe())});var ege=U((U_t,$he)=>{$he.exports={ArrayPrompt:V1(),AuthPrompt:z_(),BooleanPrompt:eQ(),NumberPrompt:a8(),StringPrompt:Vd()}});var z1=U((__t,rge)=>{"use strict";var tge=Ie("assert"),C8=Ie("events"),S0=Fo(),$c=class extends C8{constructor(e,r){super(),this.options=S0.merge({},e),this.answers={...r}}register(e,r){if(S0.isObject(e)){for(let a of Object.keys(e))this.register(a,e[a]);return this}tge.equal(typeof r,"function","expected a function");let o=e.toLowerCase();return r.prototype instanceof this.Prompt?this.prompts[o]=r:this.prompts[o]=r(this.Prompt,this),this}async prompt(e=[]){for(let r of[].concat(e))try{typeof r=="function"&&(r=await r.call(this)),await this.ask(S0.merge({},this.options,r))}catch(o){return Promise.reject(o)}return this.answers}async ask(e){typeof e=="function"&&(e=await e.call(this));let r=S0.merge({},this.options,e),{type:o,name:a}=e,{set:n,get:u}=S0;if(typeof o=="function"&&(o=await o.call(this,e,this.answers)),!o)return this.answers[a];tge(this.prompts[o],`Prompt "${o}" is not registered`);let A=new this.prompts[o](r),p=u(this.answers,a);A.state.answers=this.answers,A.enquirer=this,a&&A.on("submit",E=>{this.emit("answer",a,E,A),n(this.answers,a,E)});let h=A.emit.bind(A);return A.emit=(...E)=>(this.emit.call(this,...E),h(...E)),this.emit("prompt",A,this),r.autofill&&p!=null?(A.value=A.input=p,r.autofill==="show"&&await A.submit()):p=A.value=await A.run(),p}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||AE()}static get prompts(){return Zhe()}static get types(){return ege()}static get prompt(){let e=(r,...o)=>{let a=new this(...o),n=a.emit.bind(a);return a.emit=(...u)=>(e.emit(...u),n(...u)),a.prompt(r)};return S0.mixinEmitter(e,new C8),e}};S0.mixinEmitter($c,new C8);var y8=$c.prompts;for(let t of Object.keys(y8)){let e=t.toLowerCase(),r=o=>new y8[t](o).run();$c.prompt[e]=r,$c[e]=r,$c[t]||Reflect.defineProperty($c,t,{get:()=>y8[t]})}var J1=t=>{S0.defineExport($c,t,()=>$c.types[t])};J1("ArrayPrompt");J1("AuthPrompt");J1("BooleanPrompt");J1("NumberPrompt");J1("StringPrompt");rge.exports=$c});var e2=U((w8t,cge)=>{var Ift=Gb();function wft(t,e,r){var o=t==null?void 0:Ift(t,e);return o===void 0?r:o}cge.exports=wft});var fge=U((x8t,Age)=>{function Bft(t,e){for(var r=-1,o=t==null?0:t.length;++r{var vft=gd(),Dft=_S();function Sft(t,e){return t&&vft(e,Dft(e),t)}pge.exports=Sft});var dge=U((Q8t,gge)=>{var Pft=gd(),xft=Wy();function bft(t,e){return t&&Pft(e,xft(e),t)}gge.exports=bft});var yge=U((k8t,mge)=>{var Qft=gd(),kft=TS();function Fft(t,e){return Qft(t,kft(t),e)}mge.exports=Fft});var D8=U((F8t,Cge)=>{var Rft=RS(),Tft=WS(),Nft=TS(),Lft=_N(),Oft=Object.getOwnPropertySymbols,Mft=Oft?function(t){for(var e=[];t;)Rft(e,Nft(t)),t=Tft(t);return e}:Lft;Cge.exports=Mft});var Ige=U((R8t,Ege)=>{var Uft=gd(),_ft=D8();function Hft(t,e){return Uft(t,_ft(t),e)}Ege.exports=Hft});var S8=U((T8t,wge)=>{var qft=UN(),jft=D8(),Gft=Wy();function Wft(t){return qft(t,Gft,jft)}wge.exports=Wft});var vge=U((N8t,Bge)=>{var Yft=Object.prototype,Kft=Yft.hasOwnProperty;function Vft(t){var e=t.length,r=new t.constructor(e);return e&&typeof t[0]=="string"&&Kft.call(t,"index")&&(r.index=t.index,r.input=t.input),r}Bge.exports=Vft});var Sge=U((L8t,Dge)=>{var Jft=jS();function zft(t,e){var r=e?Jft(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}Dge.exports=zft});var xge=U((O8t,Pge)=>{var Xft=/\w*$/;function Zft(t){var e=new t.constructor(t.source,Xft.exec(t));return e.lastIndex=t.lastIndex,e}Pge.exports=Zft});var Rge=U((M8t,Fge)=>{var bge=fd(),Qge=bge?bge.prototype:void 0,kge=Qge?Qge.valueOf:void 0;function $ft(t){return kge?Object(kge.call(t)):{}}Fge.exports=$ft});var Nge=U((U8t,Tge)=>{var ept=jS(),tpt=Sge(),rpt=xge(),npt=Rge(),ipt=eL(),spt="[object Boolean]",opt="[object Date]",apt="[object Map]",lpt="[object Number]",cpt="[object RegExp]",upt="[object Set]",Apt="[object String]",fpt="[object Symbol]",ppt="[object ArrayBuffer]",hpt="[object DataView]",gpt="[object Float32Array]",dpt="[object Float64Array]",mpt="[object Int8Array]",ypt="[object Int16Array]",Cpt="[object Int32Array]",Ept="[object Uint8Array]",Ipt="[object Uint8ClampedArray]",wpt="[object Uint16Array]",Bpt="[object Uint32Array]";function vpt(t,e,r){var o=t.constructor;switch(e){case ppt:return ept(t);case spt:case opt:return new o(+t);case hpt:return tpt(t,r);case gpt:case dpt:case mpt:case ypt:case Cpt:case Ept:case Ipt:case wpt:case Bpt:return ipt(t,r);case apt:return new o;case lpt:case Apt:return new o(t);case cpt:return rpt(t);case upt:return new o;case fpt:return npt(t)}}Tge.exports=vpt});var Oge=U((_8t,Lge)=>{var Dpt=Tw(),Spt=Xu(),Ppt="[object Map]";function xpt(t){return Spt(t)&&Dpt(t)==Ppt}Lge.exports=xpt});var Hge=U((H8t,_ge)=>{var bpt=Oge(),Qpt=LS(),Mge=OS(),Uge=Mge&&Mge.isMap,kpt=Uge?Qpt(Uge):bpt;_ge.exports=kpt});var jge=U((q8t,qge)=>{var Fpt=Tw(),Rpt=Xu(),Tpt="[object Set]";function Npt(t){return Rpt(t)&&Fpt(t)==Tpt}qge.exports=Npt});var Kge=U((j8t,Yge)=>{var Lpt=jge(),Opt=LS(),Gge=OS(),Wge=Gge&&Gge.isSet,Mpt=Wge?Opt(Wge):Lpt;Yge.exports=Mpt});var P8=U((G8t,Xge)=>{var Upt=QS(),_pt=fge(),Hpt=YS(),qpt=hge(),jpt=dge(),Gpt=$N(),Wpt=GS(),Ypt=yge(),Kpt=Ige(),Vpt=GN(),Jpt=S8(),zpt=Tw(),Xpt=vge(),Zpt=Nge(),$pt=tL(),e0t=Yl(),t0t=bw(),r0t=Hge(),n0t=ol(),i0t=Kge(),s0t=_S(),o0t=Wy(),a0t=1,l0t=2,c0t=4,Vge="[object Arguments]",u0t="[object Array]",A0t="[object Boolean]",f0t="[object Date]",p0t="[object Error]",Jge="[object Function]",h0t="[object GeneratorFunction]",g0t="[object Map]",d0t="[object Number]",zge="[object Object]",m0t="[object RegExp]",y0t="[object Set]",C0t="[object String]",E0t="[object Symbol]",I0t="[object WeakMap]",w0t="[object ArrayBuffer]",B0t="[object DataView]",v0t="[object Float32Array]",D0t="[object Float64Array]",S0t="[object Int8Array]",P0t="[object Int16Array]",x0t="[object Int32Array]",b0t="[object Uint8Array]",Q0t="[object Uint8ClampedArray]",k0t="[object Uint16Array]",F0t="[object Uint32Array]",Xn={};Xn[Vge]=Xn[u0t]=Xn[w0t]=Xn[B0t]=Xn[A0t]=Xn[f0t]=Xn[v0t]=Xn[D0t]=Xn[S0t]=Xn[P0t]=Xn[x0t]=Xn[g0t]=Xn[d0t]=Xn[zge]=Xn[m0t]=Xn[y0t]=Xn[C0t]=Xn[E0t]=Xn[b0t]=Xn[Q0t]=Xn[k0t]=Xn[F0t]=!0;Xn[p0t]=Xn[Jge]=Xn[I0t]=!1;function nQ(t,e,r,o,a,n){var u,A=e&a0t,p=e&l0t,h=e&c0t;if(r&&(u=a?r(t,o,a,n):r(t)),u!==void 0)return u;if(!n0t(t))return t;var E=e0t(t);if(E){if(u=Xpt(t),!A)return Wpt(t,u)}else{var w=zpt(t),v=w==Jge||w==h0t;if(t0t(t))return Gpt(t,A);if(w==zge||w==Vge||v&&!a){if(u=p||v?{}:$pt(t),!A)return p?Kpt(t,jpt(u,t)):Ypt(t,qpt(u,t))}else{if(!Xn[w])return a?t:{};u=Zpt(t,w,A)}}n||(n=new Upt);var b=n.get(t);if(b)return b;n.set(t,u),i0t(t)?t.forEach(function(L){u.add(nQ(L,e,r,L,t,n))}):r0t(t)&&t.forEach(function(L,_){u.set(_,nQ(L,e,r,_,t,n))});var C=h?p?Jpt:Vpt:p?o0t:s0t,R=E?void 0:C(t);return _pt(R||t,function(L,_){R&&(_=L,L=t[_]),Hpt(u,_,nQ(L,e,r,_,t,n))}),u}Xge.exports=nQ});var x8=U((W8t,Zge)=>{var R0t=P8(),T0t=1,N0t=4;function L0t(t){return R0t(t,T0t|N0t)}Zge.exports=L0t});var b8=U((Y8t,$ge)=>{var O0t=C_();function M0t(t,e,r){return t==null?t:O0t(t,e,r)}$ge.exports=M0t});var ide=U((Z8t,nde)=>{var U0t=Object.prototype,_0t=U0t.hasOwnProperty;function H0t(t,e){return t!=null&&_0t.call(t,e)}nde.exports=H0t});var ode=U(($8t,sde)=>{var q0t=ide(),j0t=E_();function G0t(t,e){return t!=null&&j0t(t,e,q0t)}sde.exports=G0t});var lde=U((eHt,ade)=>{function W0t(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}ade.exports=W0t});var ude=U((tHt,cde)=>{var Y0t=Gb(),K0t=dU();function V0t(t,e){return e.length<2?t:Y0t(t,K0t(e,0,-1))}cde.exports=V0t});var k8=U((rHt,Ade)=>{var J0t=Wd(),z0t=lde(),X0t=ude(),Z0t=sE();function $0t(t,e){return e=J0t(e,t),t=X0t(t,e),t==null||delete t[Z0t(z0t(e))]}Ade.exports=$0t});var F8=U((nHt,fde)=>{var eht=k8();function tht(t,e){return t==null?!0:eht(t,e)}fde.exports=tht});var mde=U((FHt,iht)=>{iht.exports={name:"@yarnpkg/cli",version:"4.0.0-rc.42",stableVersion:"3.4.1",license:"BSD-2-Clause",main:"./sources/index.ts",exports:{".":"./sources/index.ts","./polyfills":"./sources/polyfills.ts","./package.json":"./package.json"},dependencies:{"@yarnpkg/core":"workspace:^","@yarnpkg/fslib":"workspace:^","@yarnpkg/libzip":"workspace:^","@yarnpkg/parsers":"workspace:^","@yarnpkg/plugin-compat":"workspace:^","@yarnpkg/plugin-constraints":"workspace:^","@yarnpkg/plugin-dlx":"workspace:^","@yarnpkg/plugin-essentials":"workspace:^","@yarnpkg/plugin-exec":"workspace:^","@yarnpkg/plugin-file":"workspace:^","@yarnpkg/plugin-git":"workspace:^","@yarnpkg/plugin-github":"workspace:^","@yarnpkg/plugin-http":"workspace:^","@yarnpkg/plugin-init":"workspace:^","@yarnpkg/plugin-interactive-tools":"workspace:^","@yarnpkg/plugin-link":"workspace:^","@yarnpkg/plugin-nm":"workspace:^","@yarnpkg/plugin-npm":"workspace:^","@yarnpkg/plugin-npm-cli":"workspace:^","@yarnpkg/plugin-pack":"workspace:^","@yarnpkg/plugin-patch":"workspace:^","@yarnpkg/plugin-pnp":"workspace:^","@yarnpkg/plugin-pnpm":"workspace:^","@yarnpkg/plugin-stage":"workspace:^","@yarnpkg/plugin-typescript":"workspace:^","@yarnpkg/plugin-version":"workspace:^","@yarnpkg/plugin-workspace-tools":"workspace:^","@yarnpkg/shell":"workspace:^","ci-info":"^3.2.0",clipanion:"^3.2.0-rc.10",semver:"^7.1.2",tslib:"^2.4.0",typanion:"^3.3.0"},devDependencies:{"@types/semver":"^7.1.0","@yarnpkg/builder":"workspace:^","@yarnpkg/monorepo":"workspace:^","@yarnpkg/pnpify":"workspace:^",micromatch:"^4.0.2"},peerDependencies:{"@yarnpkg/core":"workspace:^"},scripts:{postpack:"rm -rf lib",prepack:'run build:compile "$(pwd)"',"build:cli+hook":"run build:pnp:hook && builder build bundle","build:cli":"builder build bundle","run:cli":"builder run","update-local":"run build:cli --no-git-hash && rsync -a --delete bundles/ bin/"},publishConfig:{main:"./lib/index.js",bin:null,exports:{".":"./lib/index.js","./package.json":"./package.json"}},files:["/lib/**/*","!/lib/pluginConfiguration.*","!/lib/cli.*"],"@yarnpkg/builder":{bundles:{standard:["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-constraints","@yarnpkg/plugin-dlx","@yarnpkg/plugin-exec","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-interactive-tools","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm","@yarnpkg/plugin-stage","@yarnpkg/plugin-typescript","@yarnpkg/plugin-version","@yarnpkg/plugin-workspace-tools"]}},repository:{type:"git",url:"ssh://git@github.com/yarnpkg/berry.git",directory:"packages/yarnpkg-cli"},engines:{node:">=14.15.0"}}});var H8=U((aGt,Qde)=>{"use strict";Qde.exports=function(e,r){r===!0&&(r=0);var o="";if(typeof e=="string")try{o=new URL(e).protocol}catch{}else e&&e.constructor===URL&&(o=e.protocol);var a=o.split(/\:|\+/).filter(Boolean);return typeof r=="number"?a[r]:a}});var Fde=U((lGt,kde)=>{"use strict";var Eht=H8();function Iht(t){var e={protocols:[],protocol:null,port:null,resource:"",host:"",user:"",password:"",pathname:"",hash:"",search:"",href:t,query:{},parse_failed:!1};try{var r=new URL(t);e.protocols=Eht(r),e.protocol=e.protocols[0],e.port=r.port,e.resource=r.hostname,e.host=r.host,e.user=r.username||"",e.password=r.password||"",e.pathname=r.pathname,e.hash=r.hash.slice(1),e.search=r.search.slice(1),e.href=r.href,e.query=Object.fromEntries(r.searchParams)}catch{e.protocols=["file"],e.protocol=e.protocols[0],e.port="",e.resource="",e.user="",e.pathname="",e.hash="",e.search="",e.href=t,e.query={},e.parse_failed=!0}return e}kde.exports=Iht});var Nde=U((cGt,Tde)=>{"use strict";var wht=Fde();function Bht(t){return t&&typeof t=="object"&&"default"in t?t:{default:t}}var vht=Bht(wht),Dht="text/plain",Sht="us-ascii",Rde=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),Pht=(t,{stripHash:e})=>{let r=/^data:(?[^,]*?),(?[^#]*?)(?:#(?.*))?$/.exec(t);if(!r)throw new Error(`Invalid URL: ${t}`);let{type:o,data:a,hash:n}=r.groups,u=o.split(";");n=e?"":n;let A=!1;u[u.length-1]==="base64"&&(u.pop(),A=!0);let p=(u.shift()||"").toLowerCase(),E=[...u.map(w=>{let[v,b=""]=w.split("=").map(C=>C.trim());return v==="charset"&&(b=b.toLowerCase(),b===Sht)?"":`${v}${b?`=${b}`:""}`}).filter(Boolean)];return A&&E.push("base64"),(E.length>0||p&&p!==Dht)&&E.unshift(p),`data:${E.join(";")},${A?a.trim():a}${n?`#${n}`:""}`};function xht(t,e){if(e={defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripTextFragment:!0,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeSingleSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},t=t.trim(),/^data:/i.test(t))return Pht(t,e);if(/^view-source:/i.test(t))throw new Error("`view-source:` is not supported as it is a non-standard protocol");let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let a=new URL(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&a.protocol==="https:"&&(a.protocol="http:"),e.forceHttps&&a.protocol==="http:"&&(a.protocol="https:"),e.stripAuthentication&&(a.username="",a.password=""),e.stripHash?a.hash="":e.stripTextFragment&&(a.hash=a.hash.replace(/#?:~:text.*?$/i,"")),a.pathname){let u=/\b[a-z][a-z\d+\-.]{1,50}:\/\//g,A=0,p="";for(;;){let E=u.exec(a.pathname);if(!E)break;let w=E[0],v=E.index,b=a.pathname.slice(A,v);p+=b.replace(/\/{2,}/g,"/"),p+=w,A=v+w.length}let h=a.pathname.slice(A,a.pathname.length);p+=h.replace(/\/{2,}/g,"/"),a.pathname=p}if(a.pathname)try{a.pathname=decodeURI(a.pathname)}catch{}if(e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let u=a.pathname.split("/"),A=u[u.length-1];Rde(A,e.removeDirectoryIndex)&&(u=u.slice(0,-1),a.pathname=u.slice(1).join("/")+"/")}if(a.hostname&&(a.hostname=a.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.(?!www\.)[a-z\-\d]{1,63}\.[a-z.\-\d]{2,63}$/.test(a.hostname)&&(a.hostname=a.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let u of[...a.searchParams.keys()])Rde(u,e.removeQueryParameters)&&a.searchParams.delete(u);if(e.removeQueryParameters===!0&&(a.search=""),e.sortQueryParameters){a.searchParams.sort();try{a.search=decodeURIComponent(a.search)}catch{}}e.removeTrailingSlash&&(a.pathname=a.pathname.replace(/\/$/,""));let n=t;return t=a.toString(),!e.removeSingleSlash&&a.pathname==="/"&&!n.endsWith("/")&&a.hash===""&&(t=t.replace(/\/$/,"")),(e.removeTrailingSlash||a.pathname==="/")&&a.hash===""&&e.removeSingleSlash&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\/\//,"")),t}var q8=(t,e=!1)=>{let r=/^(?:([a-z_][a-z0-9_-]{0,31})@|https?:\/\/)([\w\.\-@]+)[\/:]([\~,\.\w,\-,\_,\/]+?(?:\.git|\/)?)$/,o=n=>{let u=new Error(n);throw u.subject_url=t,u};(typeof t!="string"||!t.trim())&&o("Invalid url."),t.length>q8.MAX_INPUT_LENGTH&&o("Input exceeds maximum length. If needed, change the value of parseUrl.MAX_INPUT_LENGTH."),e&&(typeof e!="object"&&(e={stripHash:!1}),t=xht(t,e));let a=vht.default(t);if(a.parse_failed){let n=a.href.match(r);n?(a.protocols=["ssh"],a.protocol="ssh",a.resource=n[2],a.host=n[2],a.user=n[1],a.pathname=`/${n[3]}`,a.parse_failed=!1):o("URL parsing failed.")}return a};q8.MAX_INPUT_LENGTH=2048;Tde.exports=q8});var Mde=U((uGt,Ode)=>{"use strict";var bht=H8();function Lde(t){if(Array.isArray(t))return t.indexOf("ssh")!==-1||t.indexOf("rsync")!==-1;if(typeof t!="string")return!1;var e=bht(t);if(t=t.substring(t.indexOf("://")+3),Lde(e))return!0;var r=new RegExp(".([a-zA-Z\\d]+):(\\d+)/");return!t.match(r)&&t.indexOf("@"){"use strict";var Qht=Nde(),Ude=Mde();function kht(t){var e=Qht(t);return e.token="",e.password==="x-oauth-basic"?e.token=e.user:e.user==="x-token-auth"&&(e.token=e.password),Ude(e.protocols)||e.protocols.length===0&&Ude(t)?e.protocol="ssh":e.protocols.length?e.protocol=e.protocols[0]:(e.protocol="file",e.protocols=["file"]),e.href=e.href.replace(/\/$/,""),e}_de.exports=kht});var jde=U((fGt,qde)=>{"use strict";var Fht=Hde();function j8(t){if(typeof t!="string")throw new Error("The url must be a string.");var e=/^([a-z\d-]{1,39})\/([-\.\w]{1,100})$/i;e.test(t)&&(t="https://github.com/"+t);var r=Fht(t),o=r.resource.split("."),a=null;switch(r.toString=function(L){return j8.stringify(this,L)},r.source=o.length>2?o.slice(1-o.length).join("."):r.source=r.resource,r.git_suffix=/\.git$/.test(r.pathname),r.name=decodeURIComponent((r.pathname||r.href).replace(/(^\/)|(\/$)/g,"").replace(/\.git$/,"")),r.owner=decodeURIComponent(r.user),r.source){case"git.cloudforge.com":r.owner=r.user,r.organization=o[0],r.source="cloudforge.com";break;case"visualstudio.com":if(r.resource==="vs-ssh.visualstudio.com"){a=r.name.split("/"),a.length===4&&(r.organization=a[1],r.owner=a[2],r.name=a[3],r.full_name=a[2]+"/"+a[3]);break}else{a=r.name.split("/"),a.length===2?(r.owner=a[1],r.name=a[1],r.full_name="_git/"+r.name):a.length===3?(r.name=a[2],a[0]==="DefaultCollection"?(r.owner=a[2],r.organization=a[0],r.full_name=r.organization+"/_git/"+r.name):(r.owner=a[0],r.full_name=r.owner+"/_git/"+r.name)):a.length===4&&(r.organization=a[0],r.owner=a[1],r.name=a[3],r.full_name=r.organization+"/"+r.owner+"/_git/"+r.name);break}case"dev.azure.com":case"azure.com":if(r.resource==="ssh.dev.azure.com"){a=r.name.split("/"),a.length===4&&(r.organization=a[1],r.owner=a[2],r.name=a[3]);break}else{a=r.name.split("/"),a.length===5?(r.organization=a[0],r.owner=a[1],r.name=a[4],r.full_name="_git/"+r.name):a.length===3?(r.name=a[2],a[0]==="DefaultCollection"?(r.owner=a[2],r.organization=a[0],r.full_name=r.organization+"/_git/"+r.name):(r.owner=a[0],r.full_name=r.owner+"/_git/"+r.name)):a.length===4&&(r.organization=a[0],r.owner=a[1],r.name=a[3],r.full_name=r.organization+"/"+r.owner+"/_git/"+r.name),r.query&&r.query.path&&(r.filepath=r.query.path.replace(/^\/+/g,"")),r.query&&r.query.version&&(r.ref=r.query.version.replace(/^GB/,""));break}default:a=r.name.split("/");var n=a.length-1;if(a.length>=2){var u=a.indexOf("-",2),A=a.indexOf("blob",2),p=a.indexOf("tree",2),h=a.indexOf("commit",2),E=a.indexOf("src",2),w=a.indexOf("raw",2),v=a.indexOf("edit",2);n=u>0?u-1:A>0?A-1:p>0?p-1:h>0?h-1:E>0?E-1:w>0?w-1:v>0?v-1:n,r.owner=a.slice(0,n).join("/"),r.name=a[n],h&&(r.commit=a[n+2])}r.ref="",r.filepathtype="",r.filepath="";var b=a.length>n&&a[n+1]==="-"?n+1:n;a.length>b+2&&["raw","src","blob","tree","edit"].indexOf(a[b+1])>=0&&(r.filepathtype=a[b+1],r.ref=a[b+2],a.length>b+3&&(r.filepath=a.slice(b+3).join("/"))),r.organization=r.owner;break}r.full_name||(r.full_name=r.owner,r.name&&(r.full_name&&(r.full_name+="/"),r.full_name+=r.name)),r.owner.startsWith("scm/")&&(r.source="bitbucket-server",r.owner=r.owner.replace("scm/",""),r.organization=r.owner,r.full_name=r.owner+"/"+r.name);var C=/(projects|users)\/(.*?)\/repos\/(.*?)((\/.*$)|$)/,R=C.exec(r.pathname);return R!=null&&(r.source="bitbucket-server",R[1]==="users"?r.owner="~"+R[2]:r.owner=R[2],r.organization=r.owner,r.name=R[3],a=R[4].split("/"),a.length>1&&(["raw","browse"].indexOf(a[1])>=0?(r.filepathtype=a[1],a.length>2&&(r.filepath=a.slice(2).join("/"))):a[1]==="commits"&&a.length>2&&(r.commit=a[2])),r.full_name=r.owner+"/"+r.name,r.query.at?r.ref=r.query.at:r.ref=""),r}j8.stringify=function(t,e){e=e||(t.protocols&&t.protocols.length?t.protocols.join("+"):t.protocol);var r=t.port?":"+t.port:"",o=t.user||"git",a=t.git_suffix?".git":"";switch(e){case"ssh":return r?"ssh://"+o+"@"+t.resource+r+"/"+t.full_name+a:o+"@"+t.resource+":"+t.full_name+a;case"git+ssh":case"ssh+git":case"ftp":case"ftps":return e+"://"+o+"@"+t.resource+r+"/"+t.full_name+a;case"http":case"https":var n=t.token?Rht(t):t.user&&(t.protocols.includes("http")||t.protocols.includes("https"))?t.user+"@":"";return e+"://"+n+t.resource+r+"/"+Tht(t)+a;default:return t.href}};function Rht(t){switch(t.source){case"bitbucket.org":return"x-token-auth:"+t.token+"@";default:return t.token+"@"}}function Tht(t){switch(t.source){case"bitbucket-server":return"scm/"+t.full_name;default:return""+t.full_name}}qde.exports=j8});var sme=U((j9t,ime)=>{var Ght=Fx(),Wht=GS(),Yht=Yl(),Kht=AC(),Vht=y_(),Jht=sE(),zht=v1();function Xht(t){return Yht(t)?Ght(t,Jht):Kht(t)?[t]:Wht(Vht(zht(t)))}ime.exports=Xht});function tgt(t,e){return e===1&&egt.has(t[0])}function l2(t){let e=Array.isArray(t)?t:(0,lme.default)(t);return e.map((o,a)=>Zht.test(o)?`[${o}]`:$ht.test(o)&&!tgt(e,a)?`.${o}`:`[${JSON.stringify(o)}]`).join("").replace(/^\./,"")}function rgt(t,e){let r=[];if(e.methodName!==null&&r.push(ye.pretty(t,e.methodName,ye.Type.CODE)),e.file!==null){let o=[];o.push(ye.pretty(t,e.file,ye.Type.PATH)),e.line!==null&&(o.push(ye.pretty(t,e.line,ye.Type.NUMBER)),e.column!==null&&o.push(ye.pretty(t,e.line,ye.Type.NUMBER))),r.push(`(${o.join(ye.pretty(t,":","grey"))})`)}return r.join(" ")}function aQ(t,{manifestUpdates:e,reportedErrors:r},{fix:o}={}){var u;let a=new Map,n=new Map;for(let[A,p]of e){let h=((u=r.get(A))==null?void 0:u.map(b=>({text:b,fixable:!1})))??[],E=!1,w=t.getWorkspaceByCwd(A),v=w.manifest.exportTo({});for(let[b,C]of p){if(C.size>1){let R=[...C].map(([L,_])=>{let V=ye.pretty(t.configuration,L,ye.Type.INSPECT),re=_.size>0?rgt(t.configuration,_.values().next().value):null;return re!==null?` +${V} at ${re}`:` +${V}`}).join("");h.push({text:`Conflict detected in constraint targeting ${ye.pretty(t.configuration,b,ye.Type.CODE)}; conflicting values are:${R}`,fixable:!1})}else{let[[R]]=C,L=(0,ome.default)(v,b);if(L===R)continue;if(!o){let _=typeof L>"u"?`Missing field ${ye.pretty(t.configuration,b,ye.Type.CODE)}; expected ${ye.pretty(t.configuration,R,ye.Type.INSPECT)}`:typeof R>"u"?`Extraneous field ${ye.pretty(t.configuration,b,ye.Type.CODE)} currently set to ${ye.pretty(t.configuration,L,ye.Type.INSPECT)}`:`Invalid field ${ye.pretty(t.configuration,b,ye.Type.CODE)}; expected ${ye.pretty(t.configuration,R,ye.Type.INSPECT)}, found ${ye.pretty(t.configuration,L,ye.Type.INSPECT)}`;h.push({text:_,fixable:!0});continue}typeof R>"u"?(0,cme.default)(v,b):(0,ame.default)(v,b,R),E=!0}E&&a.set(w,v)}h.length>0&&n.set(w,h)}return{changedWorkspaces:a,remainingErrors:n}}var ome,ame,lme,cme,a2,Zht,$ht,egt,c2=dt(()=>{Ke();ome=tt(e2()),ame=tt(b8()),lme=tt(sme()),cme=tt(F8()),a2=class{constructor(e){this.indexedFields=e;this.items=[];this.indexes={};this.clear()}clear(){this.items=[];for(let e of this.indexedFields)this.indexes[e]=new Map}insert(e){this.items.push(e);for(let r of this.indexedFields){let o=Object.prototype.hasOwnProperty.call(e,r)?e[r]:void 0;if(typeof o>"u")continue;Ye.getArrayWithDefault(this.indexes[r],o).push(e)}return e}find(e){if(typeof e>"u")return this.items;let r=Object.entries(e);if(r.length===0)return this.items;let o=[],a;for(let[u,A]of r){let p=u,h=Object.prototype.hasOwnProperty.call(this.indexes,p)?this.indexes[p]:void 0;if(typeof h>"u"){o.push([p,A]);continue}let E=new Set(h.get(A)??[]);if(E.size===0)return[];if(typeof a>"u")a=E;else for(let w of a)E.has(w)||a.delete(w);if(a.size===0)break}let n=[...a??[]];return o.length>0&&(n=n.filter(u=>{for(let[A,p]of o)if(!(typeof p<"u"?Object.prototype.hasOwnProperty.call(u,A)&&u[A]===p:Object.prototype.hasOwnProperty.call(u,A)===!1))return!1;return!0})),n}},Zht=/^[0-9]+$/,$ht=/^[a-zA-Z0-9_]+$/,egt=new Set(["scripts",...Nt.allDependencies])});var ume=U((Z9t,iH)=>{var ngt;(function(t){var e=function(){return{"append/2":[new t.type.Rule(new t.type.Term("append",[new t.type.Var("X"),new t.type.Var("L")]),new t.type.Term("foldl",[new t.type.Term("append",[]),new t.type.Var("X"),new t.type.Term("[]",[]),new t.type.Var("L")]))],"append/3":[new t.type.Rule(new t.type.Term("append",[new t.type.Term("[]",[]),new t.type.Var("X"),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("append",[new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("S")])]),new t.type.Term("append",[new t.type.Var("T"),new t.type.Var("X"),new t.type.Var("S")]))],"member/2":[new t.type.Rule(new t.type.Term("member",[new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("_")])]),null),new t.type.Rule(new t.type.Term("member",[new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("_"),new t.type.Var("Xs")])]),new t.type.Term("member",[new t.type.Var("X"),new t.type.Var("Xs")]))],"permutation/2":[new t.type.Rule(new t.type.Term("permutation",[new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("permutation",[new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("permutation",[new t.type.Var("T"),new t.type.Var("P")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("P")]),new t.type.Term("append",[new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("Y")]),new t.type.Var("S")])])]))],"maplist/2":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("X")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("Xs")])]))],"maplist/3":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs")])]))],"maplist/4":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs")])]))],"maplist/5":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds")])]))],"maplist/6":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")]),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Es")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D"),new t.type.Var("E")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds"),new t.type.Var("Es")])]))],"maplist/7":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")]),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Es")]),new t.type.Term(".",[new t.type.Var("F"),new t.type.Var("Fs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D"),new t.type.Var("E"),new t.type.Var("F")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds"),new t.type.Var("Es"),new t.type.Var("Fs")])]))],"maplist/8":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")]),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Es")]),new t.type.Term(".",[new t.type.Var("F"),new t.type.Var("Fs")]),new t.type.Term(".",[new t.type.Var("G"),new t.type.Var("Gs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D"),new t.type.Var("E"),new t.type.Var("F"),new t.type.Var("G")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds"),new t.type.Var("Es"),new t.type.Var("Fs"),new t.type.Var("Gs")])]))],"include/3":[new t.type.Rule(new t.type.Term("include",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("include",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("L")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P"),new t.type.Var("A")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("A"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Term("[]",[])]),new t.type.Var("B")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("F"),new t.type.Var("B")]),new t.type.Term(",",[new t.type.Term(";",[new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("F")]),new t.type.Term(",",[new t.type.Term("=",[new t.type.Var("L"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("S")])]),new t.type.Term("!",[])])]),new t.type.Term("=",[new t.type.Var("L"),new t.type.Var("S")])]),new t.type.Term("include",[new t.type.Var("P"),new t.type.Var("T"),new t.type.Var("S")])])])])]))],"exclude/3":[new t.type.Rule(new t.type.Term("exclude",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("exclude",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("exclude",[new t.type.Var("P"),new t.type.Var("T"),new t.type.Var("E")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P"),new t.type.Var("L")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("L"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Term("[]",[])]),new t.type.Var("Q")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("R"),new t.type.Var("Q")]),new t.type.Term(";",[new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("R")]),new t.type.Term(",",[new t.type.Term("!",[]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("E")])])]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("E")])])])])])])]))],"foldl/4":[new t.type.Rule(new t.type.Term("foldl",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Var("I"),new t.type.Var("I")]),null),new t.type.Rule(new t.type.Term("foldl",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("I"),new t.type.Var("R")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P"),new t.type.Var("L")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("L"),new t.type.Term(".",[new t.type.Var("I"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])])])]),new t.type.Var("L2")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P2"),new t.type.Var("L2")]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P2")]),new t.type.Term("foldl",[new t.type.Var("P"),new t.type.Var("T"),new t.type.Var("X"),new t.type.Var("R")])])])])]))],"select/3":[new t.type.Rule(new t.type.Term("select",[new t.type.Var("E"),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Xs")]),new t.type.Var("Xs")]),null),new t.type.Rule(new t.type.Term("select",[new t.type.Var("E"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Ys")])]),new t.type.Term("select",[new t.type.Var("E"),new t.type.Var("Xs"),new t.type.Var("Ys")]))],"sum_list/2":[new t.type.Rule(new t.type.Term("sum_list",[new t.type.Term("[]",[]),new t.type.Num(0,!1)]),null),new t.type.Rule(new t.type.Term("sum_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("sum_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term("is",[new t.type.Var("S"),new t.type.Term("+",[new t.type.Var("X"),new t.type.Var("Y")])])]))],"max_list/2":[new t.type.Rule(new t.type.Term("max_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])]),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("max_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("max_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term(";",[new t.type.Term(",",[new t.type.Term(">=",[new t.type.Var("X"),new t.type.Var("Y")]),new t.type.Term(",",[new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("X")]),new t.type.Term("!",[])])]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("Y")])])]))],"min_list/2":[new t.type.Rule(new t.type.Term("min_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])]),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("min_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("min_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term(";",[new t.type.Term(",",[new t.type.Term("=<",[new t.type.Var("X"),new t.type.Var("Y")]),new t.type.Term(",",[new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("X")]),new t.type.Term("!",[])])]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("Y")])])]))],"prod_list/2":[new t.type.Rule(new t.type.Term("prod_list",[new t.type.Term("[]",[]),new t.type.Num(1,!1)]),null),new t.type.Rule(new t.type.Term("prod_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("prod_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term("is",[new t.type.Var("S"),new t.type.Term("*",[new t.type.Var("X"),new t.type.Var("Y")])])]))],"last/2":[new t.type.Rule(new t.type.Term("last",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])]),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("last",[new t.type.Term(".",[new t.type.Var("_"),new t.type.Var("Xs")]),new t.type.Var("X")]),new t.type.Term("last",[new t.type.Var("Xs"),new t.type.Var("X")]))],"prefix/2":[new t.type.Rule(new t.type.Term("prefix",[new t.type.Var("Part"),new t.type.Var("Whole")]),new t.type.Term("append",[new t.type.Var("Part"),new t.type.Var("_"),new t.type.Var("Whole")]))],"nth0/3":[new t.type.Rule(new t.type.Term("nth0",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")])]),new t.type.Term(",",[new t.type.Term(">=",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")]),new t.type.Term("!",[])])])]))],"nth1/3":[new t.type.Rule(new t.type.Term("nth1",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")])]),new t.type.Term(",",[new t.type.Term(">",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")]),new t.type.Term("!",[])])])]))],"nth0/4":[new t.type.Rule(new t.type.Term("nth0",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")])]),new t.type.Term(",",[new t.type.Term(">=",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term("!",[])])])]))],"nth1/4":[new t.type.Rule(new t.type.Term("nth1",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")])]),new t.type.Term(",",[new t.type.Term(">",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term("!",[])])])]))],"nth/5":[new t.type.Rule(new t.type.Term("nth",[new t.type.Var("N"),new t.type.Var("N"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("X"),new t.type.Var("Xs")]),null),new t.type.Rule(new t.type.Term("nth",[new t.type.Var("N"),new t.type.Var("O"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("Y"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Ys")])]),new t.type.Term(",",[new t.type.Term("is",[new t.type.Var("M"),new t.type.Term("+",[new t.type.Var("N"),new t.type.Num(1,!1)])]),new t.type.Term("nth",[new t.type.Var("M"),new t.type.Var("O"),new t.type.Var("Xs"),new t.type.Var("Y"),new t.type.Var("Ys")])]))],"length/2":function(o,a,n){var u=n.args[0],A=n.args[1];if(!t.type.is_variable(A)&&!t.type.is_integer(A))o.throw_error(t.error.type("integer",A,n.indicator));else if(t.type.is_integer(A)&&A.value<0)o.throw_error(t.error.domain("not_less_than_zero",A,n.indicator));else{var p=new t.type.Term("length",[u,new t.type.Num(0,!1),A]);t.type.is_integer(A)&&(p=new t.type.Term(",",[p,new t.type.Term("!",[])])),o.prepend([new t.type.State(a.goal.replace(p),a.substitution,a)])}},"length/3":[new t.type.Rule(new t.type.Term("length",[new t.type.Term("[]",[]),new t.type.Var("N"),new t.type.Var("N")]),null),new t.type.Rule(new t.type.Term("length",[new t.type.Term(".",[new t.type.Var("_"),new t.type.Var("X")]),new t.type.Var("A"),new t.type.Var("N")]),new t.type.Term(",",[new t.type.Term("succ",[new t.type.Var("A"),new t.type.Var("B")]),new t.type.Term("length",[new t.type.Var("X"),new t.type.Var("B"),new t.type.Var("N")])]))],"replicate/3":function(o,a,n){var u=n.args[0],A=n.args[1],p=n.args[2];if(t.type.is_variable(A))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_integer(A))o.throw_error(t.error.type("integer",A,n.indicator));else if(A.value<0)o.throw_error(t.error.domain("not_less_than_zero",A,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))o.throw_error(t.error.type("list",p,n.indicator));else{for(var h=new t.type.Term("[]"),E=0;E0;w--)E[w].equals(E[w-1])&&E.splice(w,1);for(var v=new t.type.Term("[]"),w=E.length-1;w>=0;w--)v=new t.type.Term(".",[E[w],v]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[v,A])),a.substitution,a)])}}},"msort/2":function(o,a,n){var u=n.args[0],A=n.args[1];if(t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(A)&&!t.type.is_fully_list(A))o.throw_error(t.error.type("list",A,n.indicator));else{for(var p=[],h=u;h.indicator==="./2";)p.push(h.args[0]),h=h.args[1];if(t.type.is_variable(h))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_empty_list(h))o.throw_error(t.error.type("list",u,n.indicator));else{for(var E=p.sort(t.compare),w=new t.type.Term("[]"),v=E.length-1;v>=0;v--)w=new t.type.Term(".",[E[v],w]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[w,A])),a.substitution,a)])}}},"keysort/2":function(o,a,n){var u=n.args[0],A=n.args[1];if(t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(A)&&!t.type.is_fully_list(A))o.throw_error(t.error.type("list",A,n.indicator));else{for(var p=[],h,E=u;E.indicator==="./2";){if(h=E.args[0],t.type.is_variable(h)){o.throw_error(t.error.instantiation(n.indicator));return}else if(!t.type.is_term(h)||h.indicator!=="-/2"){o.throw_error(t.error.type("pair",h,n.indicator));return}h.args[0].pair=h.args[1],p.push(h.args[0]),E=E.args[1]}if(t.type.is_variable(E))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_empty_list(E))o.throw_error(t.error.type("list",u,n.indicator));else{for(var w=p.sort(t.compare),v=new t.type.Term("[]"),b=w.length-1;b>=0;b--)v=new t.type.Term(".",[new t.type.Term("-",[w[b],w[b].pair]),v]),delete w[b].pair;o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[v,A])),a.substitution,a)])}}},"take/3":function(o,a,n){var u=n.args[0],A=n.args[1],p=n.args[2];if(t.type.is_variable(A)||t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_list(A))o.throw_error(t.error.type("list",A,n.indicator));else if(!t.type.is_integer(u))o.throw_error(t.error.type("integer",u,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))o.throw_error(t.error.type("list",p,n.indicator));else{for(var h=u.value,E=[],w=A;h>0&&w.indicator==="./2";)E.push(w.args[0]),w=w.args[1],h--;if(h===0){for(var v=new t.type.Term("[]"),h=E.length-1;h>=0;h--)v=new t.type.Term(".",[E[h],v]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[v,p])),a.substitution,a)])}}},"drop/3":function(o,a,n){var u=n.args[0],A=n.args[1],p=n.args[2];if(t.type.is_variable(A)||t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_list(A))o.throw_error(t.error.type("list",A,n.indicator));else if(!t.type.is_integer(u))o.throw_error(t.error.type("integer",u,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))o.throw_error(t.error.type("list",p,n.indicator));else{for(var h=u.value,E=[],w=A;h>0&&w.indicator==="./2";)E.push(w.args[0]),w=w.args[1],h--;h===0&&o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[w,p])),a.substitution,a)])}},"reverse/2":function(o,a,n){var u=n.args[0],A=n.args[1],p=t.type.is_instantiated_list(u),h=t.type.is_instantiated_list(A);if(t.type.is_variable(u)&&t.type.is_variable(A))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(u)&&!t.type.is_fully_list(u))o.throw_error(t.error.type("list",u,n.indicator));else if(!t.type.is_variable(A)&&!t.type.is_fully_list(A))o.throw_error(t.error.type("list",A,n.indicator));else if(!p&&!h)o.throw_error(t.error.instantiation(n.indicator));else{for(var E=p?u:A,w=new t.type.Term("[]",[]);E.indicator==="./2";)w=new t.type.Term(".",[E.args[0],w]),E=E.args[1];o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[w,p?A:u])),a.substitution,a)])}},"list_to_set/2":function(o,a,n){var u=n.args[0],A=n.args[1];if(t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else{for(var p=u,h=[];p.indicator==="./2";)h.push(p.args[0]),p=p.args[1];if(t.type.is_variable(p))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_term(p)||p.indicator!=="[]/0")o.throw_error(t.error.type("list",u,n.indicator));else{for(var E=[],w=new t.type.Term("[]",[]),v,b=0;b=0;b--)w=new t.type.Term(".",[E[b],w]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[A,w])),a.substitution,a)])}}}}},r=["append/2","append/3","member/2","permutation/2","maplist/2","maplist/3","maplist/4","maplist/5","maplist/6","maplist/7","maplist/8","include/3","exclude/3","foldl/4","sum_list/2","max_list/2","min_list/2","prod_list/2","last/2","prefix/2","nth0/3","nth1/3","nth0/4","nth1/4","length/2","replicate/3","select/3","sort/2","msort/2","keysort/2","take/3","drop/3","reverse/2","list_to_set/2"];typeof iH<"u"?iH.exports=function(o){t=o,new t.type.Module("lists",e(),r)}:new t.type.Module("lists",e(),r)})(ngt)});var Dme=U(qr=>{"use strict";var tm=process.platform==="win32",sH="aes-256-cbc",igt="sha256",pme="The current environment doesn't support interactive reading from TTY.",Un=Ie("fs"),Ame=process.binding("tty_wrap").TTY,aH=Ie("child_process"),oh=Ie("path"),lH={prompt:"> ",hideEchoBack:!1,mask:"*",limit:[],limitMessage:"Input another, please.$<( [)limit(])>",defaultInput:"",trueValue:[],falseValue:[],caseSensitive:!1,keepWhitespace:!1,encoding:"utf8",bufferSize:1024,print:void 0,history:!0,cd:!1,phContent:void 0,preCheck:void 0},Jf="none",tu,mE,fme=!1,sh,cQ,oH,sgt=0,pH="",em=[],uQ,hme=!1,cH=!1,u2=!1;function gme(t){function e(r){return r.replace(/[^\w\u0080-\uFFFF]/g,function(o){return"#"+o.charCodeAt(0)+";"})}return cQ.concat(function(r){var o=[];return Object.keys(r).forEach(function(a){r[a]==="boolean"?t[a]&&o.push("--"+a):r[a]==="string"&&t[a]&&o.push("--"+a,e(t[a]))}),o}({display:"string",displayOnly:"boolean",keyIn:"boolean",hideEchoBack:"boolean",mask:"string",limit:"string",caseSensitive:"boolean"}))}function ogt(t,e){function r(_){var V,re="",oe;for(oH=oH||Ie("os").tmpdir();;){V=oh.join(oH,_+re);try{oe=Un.openSync(V,"wx")}catch(pe){if(pe.code==="EEXIST"){re++;continue}else throw pe}Un.closeSync(oe);break}return V}var o,a,n,u={},A,p,h=r("readline-sync.stdout"),E=r("readline-sync.stderr"),w=r("readline-sync.exit"),v=r("readline-sync.done"),b=Ie("crypto"),C,R,L;C=b.createHash(igt),C.update(""+process.pid+sgt+++Math.random()),L=C.digest("hex"),R=b.createDecipher(sH,L),o=gme(t),tm?(a=process.env.ComSpec||"cmd.exe",process.env.Q='"',n=["/V:ON","/S","/C","(%Q%"+a+"%Q% /V:ON /S /C %Q%%Q%"+sh+"%Q%"+o.map(function(_){return" %Q%"+_+"%Q%"}).join("")+" & (echo !ERRORLEVEL!)>%Q%"+w+"%Q%%Q%) 2>%Q%"+E+"%Q% |%Q%"+process.execPath+"%Q% %Q%"+__dirname+"\\encrypt.js%Q% %Q%"+sH+"%Q% %Q%"+L+"%Q% >%Q%"+h+"%Q% & (echo 1)>%Q%"+v+"%Q%"]):(a="/bin/sh",n=["-c",'("'+sh+'"'+o.map(function(_){return" '"+_.replace(/'/g,"'\\''")+"'"}).join("")+'; echo $?>"'+w+'") 2>"'+E+'" |"'+process.execPath+'" "'+__dirname+'/encrypt.js" "'+sH+'" "'+L+'" >"'+h+'"; echo 1 >"'+v+'"']),u2&&u2("_execFileSync",o);try{aH.spawn(a,n,e)}catch(_){u.error=new Error(_.message),u.error.method="_execFileSync - spawn",u.error.program=a,u.error.args=n}for(;Un.readFileSync(v,{encoding:t.encoding}).trim()!=="1";);return(A=Un.readFileSync(w,{encoding:t.encoding}).trim())==="0"?u.input=R.update(Un.readFileSync(h,{encoding:"binary"}),"hex",t.encoding)+R.final(t.encoding):(p=Un.readFileSync(E,{encoding:t.encoding}).trim(),u.error=new Error(pme+(p?` +`+p:"")),u.error.method="_execFileSync",u.error.program=a,u.error.args=n,u.error.extMessage=p,u.error.exitCode=+A),Un.unlinkSync(h),Un.unlinkSync(E),Un.unlinkSync(w),Un.unlinkSync(v),u}function agt(t){var e,r={},o,a={env:process.env,encoding:t.encoding};if(sh||(tm?process.env.PSModulePath?(sh="powershell.exe",cQ=["-ExecutionPolicy","Bypass","-File",__dirname+"\\read.ps1"]):(sh="cscript.exe",cQ=["//nologo",__dirname+"\\read.cs.js"]):(sh="/bin/sh",cQ=[__dirname+"/read.sh"])),tm&&!process.env.PSModulePath&&(a.stdio=[process.stdin]),aH.execFileSync){e=gme(t),u2&&u2("execFileSync",e);try{r.input=aH.execFileSync(sh,e,a)}catch(n){o=n.stderr?(n.stderr+"").trim():"",r.error=new Error(pme+(o?` +`+o:"")),r.error.method="execFileSync",r.error.program=sh,r.error.args=e,r.error.extMessage=o,r.error.exitCode=n.status,r.error.code=n.code,r.error.signal=n.signal}}else r=ogt(t,a);return r.error||(r.input=r.input.replace(/^\s*'|'\s*$/g,""),t.display=""),r}function uH(t){var e="",r=t.display,o=!t.display&&t.keyIn&&t.hideEchoBack&&!t.mask;function a(){var n=agt(t);if(n.error)throw n.error;return n.input}return cH&&cH(t),function(){var n,u,A;function p(){return n||(n=process.binding("fs"),u=process.binding("constants")),n}if(typeof Jf=="string")if(Jf=null,tm){if(A=function(h){var E=h.replace(/^\D+/,"").split("."),w=0;return(E[0]=+E[0])&&(w+=E[0]*1e4),(E[1]=+E[1])&&(w+=E[1]*100),(E[2]=+E[2])&&(w+=E[2]),w}(process.version),!(A>=20302&&A<40204||A>=5e4&&A<50100||A>=50600&&A<60200)&&process.stdin.isTTY)process.stdin.pause(),Jf=process.stdin.fd,mE=process.stdin._handle;else try{Jf=p().open("CONIN$",u.O_RDWR,parseInt("0666",8)),mE=new Ame(Jf,!0)}catch{}if(process.stdout.isTTY)tu=process.stdout.fd;else{try{tu=Un.openSync("\\\\.\\CON","w")}catch{}if(typeof tu!="number")try{tu=p().open("CONOUT$",u.O_RDWR,parseInt("0666",8))}catch{}}}else{if(process.stdin.isTTY){process.stdin.pause();try{Jf=Un.openSync("/dev/tty","r"),mE=process.stdin._handle}catch{}}else try{Jf=Un.openSync("/dev/tty","r"),mE=new Ame(Jf,!1)}catch{}if(process.stdout.isTTY)tu=process.stdout.fd;else try{tu=Un.openSync("/dev/tty","w")}catch{}}}(),function(){var n,u,A=!t.hideEchoBack&&!t.keyIn,p,h,E,w,v;uQ="";function b(C){return C===fme?!0:mE.setRawMode(C)!==0?!1:(fme=C,!0)}if(hme||!mE||typeof tu!="number"&&(t.display||!A)){e=a();return}if(t.display&&(Un.writeSync(tu,t.display),t.display=""),!t.displayOnly){if(!b(!A)){e=a();return}for(h=t.keyIn?1:t.bufferSize,p=Buffer.allocUnsafe&&Buffer.alloc?Buffer.alloc(h):new Buffer(h),t.keyIn&&t.limit&&(u=new RegExp("[^"+t.limit+"]","g"+(t.caseSensitive?"":"i")));;){E=0;try{E=Un.readSync(Jf,p,0,h)}catch(C){if(C.code!=="EOF"){b(!1),e+=a();return}}if(E>0?(w=p.toString(t.encoding,0,E),uQ+=w):(w=` +`,uQ+=String.fromCharCode(0)),w&&typeof(v=(w.match(/^(.*?)[\r\n]/)||[])[1])=="string"&&(w=v,n=!0),w&&(w=w.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g,"")),w&&u&&(w=w.replace(u,"")),w&&(A||(t.hideEchoBack?t.mask&&Un.writeSync(tu,new Array(w.length+1).join(t.mask)):Un.writeSync(tu,w)),e+=w),!t.keyIn&&n||t.keyIn&&e.length>=h)break}!A&&!o&&Un.writeSync(tu,` +`),b(!1)}}(),t.print&&!o&&t.print(r+(t.displayOnly?"":(t.hideEchoBack?new Array(e.length+1).join(t.mask):e)+` +`),t.encoding),t.displayOnly?"":pH=t.keepWhitespace||t.keyIn?e:e.trim()}function lgt(t,e){var r=[];function o(a){a!=null&&(Array.isArray(a)?a.forEach(o):(!e||e(a))&&r.push(a))}return o(t),r}function hH(t){return t.replace(/[\x00-\x7f]/g,function(e){return"\\x"+("00"+e.charCodeAt().toString(16)).substr(-2)})}function Ps(){var t=Array.prototype.slice.call(arguments),e,r;return t.length&&typeof t[0]=="boolean"&&(r=t.shift(),r&&(e=Object.keys(lH),t.unshift(lH))),t.reduce(function(o,a){return a==null||(a.hasOwnProperty("noEchoBack")&&!a.hasOwnProperty("hideEchoBack")&&(a.hideEchoBack=a.noEchoBack,delete a.noEchoBack),a.hasOwnProperty("noTrim")&&!a.hasOwnProperty("keepWhitespace")&&(a.keepWhitespace=a.noTrim,delete a.noTrim),r||(e=Object.keys(a)),e.forEach(function(n){var u;if(!!a.hasOwnProperty(n))switch(u=a[n],n){case"mask":case"limitMessage":case"defaultInput":case"encoding":u=u!=null?u+"":"",u&&n!=="limitMessage"&&(u=u.replace(/[\r\n]/g,"")),o[n]=u;break;case"bufferSize":!isNaN(u=parseInt(u,10))&&typeof u=="number"&&(o[n]=u);break;case"displayOnly":case"keyIn":case"hideEchoBack":case"caseSensitive":case"keepWhitespace":case"history":case"cd":o[n]=!!u;break;case"limit":case"trueValue":case"falseValue":o[n]=lgt(u,function(A){var p=typeof A;return p==="string"||p==="number"||p==="function"||A instanceof RegExp}).map(function(A){return typeof A=="string"?A.replace(/[\r\n]/g,""):A});break;case"print":case"phContent":case"preCheck":o[n]=typeof u=="function"?u:void 0;break;case"prompt":case"display":o[n]=u??"";break}})),o},{})}function AH(t,e,r){return e.some(function(o){var a=typeof o;return a==="string"?r?t===o:t.toLowerCase()===o.toLowerCase():a==="number"?parseFloat(t)===o:a==="function"?o(t):o instanceof RegExp?o.test(t):!1})}function gH(t,e){var r=oh.normalize(tm?(process.env.HOMEDRIVE||"")+(process.env.HOMEPATH||""):process.env.HOME||"").replace(/[\/\\]+$/,"");return t=oh.normalize(t),e?t.replace(/^~(?=\/|\\|$)/,r):t.replace(new RegExp("^"+hH(r)+"(?=\\/|\\\\|$)",tm?"i":""),"~")}function yE(t,e){var r="(?:\\(([\\s\\S]*?)\\))?(\\w+|.-.)(?:\\(([\\s\\S]*?)\\))?",o=new RegExp("(\\$)?(\\$<"+r+">)","g"),a=new RegExp("(\\$)?(\\$\\{"+r+"\\})","g");function n(u,A,p,h,E,w){var v;return A||typeof(v=e(E))!="string"?p:v?(h||"")+v+(w||""):""}return t.replace(o,n).replace(a,n)}function dme(t,e,r){var o,a=[],n=-1,u=0,A="",p;function h(E,w){return w.length>3?(E.push(w[0]+"..."+w[w.length-1]),p=!0):w.length&&(E=E.concat(w)),E}return o=t.reduce(function(E,w){return E.concat((w+"").split(""))},[]).reduce(function(E,w){var v,b;return e||(w=w.toLowerCase()),v=/^\d$/.test(w)?1:/^[A-Z]$/.test(w)?2:/^[a-z]$/.test(w)?3:0,r&&v===0?A+=w:(b=w.charCodeAt(0),v&&v===n&&b===u+1?a.push(w):(E=h(E,a),a=[w],n=v),u=b),E},[]),o=h(o,a),A&&(o.push(A),p=!0),{values:o,suppressed:p}}function mme(t,e){return t.join(t.length>2?", ":e?" / ":"/")}function yme(t,e){var r,o,a={},n;if(e.phContent&&(r=e.phContent(t,e)),typeof r!="string")switch(t){case"hideEchoBack":case"mask":case"defaultInput":case"caseSensitive":case"keepWhitespace":case"encoding":case"bufferSize":case"history":case"cd":r=e.hasOwnProperty(t)?typeof e[t]=="boolean"?e[t]?"on":"off":e[t]+"":"";break;case"limit":case"trueValue":case"falseValue":o=e[e.hasOwnProperty(t+"Src")?t+"Src":t],e.keyIn?(a=dme(o,e.caseSensitive),o=a.values):o=o.filter(function(u){var A=typeof u;return A==="string"||A==="number"}),r=mme(o,a.suppressed);break;case"limitCount":case"limitCountNotZero":r=e[e.hasOwnProperty("limitSrc")?"limitSrc":"limit"].length,r=r||t!=="limitCountNotZero"?r+"":"";break;case"lastInput":r=pH;break;case"cwd":case"CWD":case"cwdHome":r=process.cwd(),t==="CWD"?r=oh.basename(r):t==="cwdHome"&&(r=gH(r));break;case"date":case"time":case"localeDate":case"localeTime":r=new Date()["to"+t.replace(/^./,function(u){return u.toUpperCase()})+"String"]();break;default:typeof(n=(t.match(/^history_m(\d+)$/)||[])[1])=="string"&&(r=em[em.length-n]||"")}return r}function Cme(t){var e=/^(.)-(.)$/.exec(t),r="",o,a,n,u;if(!e)return null;for(o=e[1].charCodeAt(0),a=e[2].charCodeAt(0),u=o +And the length must be: $`,trueValue:null,falseValue:null,caseSensitive:!0},e,{history:!1,cd:!1,phContent:function(b){return b==="charlist"?r.text:b==="length"?o+"..."+a:null}}),u,A,p,h,E,w,v;for(e=e||{},u=yE(e.charlist?e.charlist+"":"$",Cme),(isNaN(o=parseInt(e.min,10))||typeof o!="number")&&(o=12),(isNaN(a=parseInt(e.max,10))||typeof a!="number")&&(a=24),h=new RegExp("^["+hH(u)+"]{"+o+","+a+"}$"),r=dme([u],n.caseSensitive,!0),r.text=mme(r.values,r.suppressed),A=e.confirmMessage!=null?e.confirmMessage:"Reinput a same one to confirm it: ",p=e.unmatchMessage!=null?e.unmatchMessage:"It differs from first one. Hit only the Enter key if you want to retry from first one.",t==null&&(t="Input new password: "),E=n.limitMessage;!v;)n.limit=h,n.limitMessage=E,w=qr.question(t,n),n.limit=[w,""],n.limitMessage=p,v=qr.question(A,n);return w};function wme(t,e,r){var o;function a(n){return o=r(n),!isNaN(o)&&typeof o=="number"}return qr.question(t,Ps({limitMessage:"Input valid number, please."},e,{limit:a,cd:!1})),o}qr.questionInt=function(t,e){return wme(t,e,function(r){return parseInt(r,10)})};qr.questionFloat=function(t,e){return wme(t,e,parseFloat)};qr.questionPath=function(t,e){var r,o="",a=Ps({hideEchoBack:!1,limitMessage:`$Input valid path, please.$<( Min:)min>$<( Max:)max>`,history:!0,cd:!0},e,{keepWhitespace:!1,limit:function(n){var u,A,p;n=gH(n,!0),o="";function h(E){E.split(/\/|\\/).reduce(function(w,v){var b=oh.resolve(w+=v+oh.sep);if(!Un.existsSync(b))Un.mkdirSync(b);else if(!Un.statSync(b).isDirectory())throw new Error("Non directory already exists: "+b);return w},"")}try{if(u=Un.existsSync(n),r=u?Un.realpathSync(n):oh.resolve(n),!e.hasOwnProperty("exists")&&!u||typeof e.exists=="boolean"&&e.exists!==u)return o=(u?"Already exists":"No such file or directory")+": "+r,!1;if(!u&&e.create&&(e.isDirectory?h(r):(h(oh.dirname(r)),Un.closeSync(Un.openSync(r,"w"))),r=Un.realpathSync(r)),u&&(e.min||e.max||e.isFile||e.isDirectory)){if(A=Un.statSync(r),e.isFile&&!A.isFile())return o="Not file: "+r,!1;if(e.isDirectory&&!A.isDirectory())return o="Not directory: "+r,!1;if(e.min&&A.size<+e.min||e.max&&A.size>+e.max)return o="Size "+A.size+" is out of range: "+r,!1}if(typeof e.validate=="function"&&(p=e.validate(r))!==!0)return typeof p=="string"&&(o=p),!1}catch(E){return o=E+"",!1}return!0},phContent:function(n){return n==="error"?o:n!=="min"&&n!=="max"?null:e.hasOwnProperty(n)?e[n]+"":""}});return e=e||{},t==null&&(t='Input path (you can "cd" and "pwd"): '),qr.question(t,a),r};function Bme(t,e){var r={},o={};return typeof t=="object"?(Object.keys(t).forEach(function(a){typeof t[a]=="function"&&(o[e.caseSensitive?a:a.toLowerCase()]=t[a])}),r.preCheck=function(a){var n;return r.args=fH(a),n=r.args[0]||"",e.caseSensitive||(n=n.toLowerCase()),r.hRes=n!=="_"&&o.hasOwnProperty(n)?o[n].apply(a,r.args.slice(1)):o.hasOwnProperty("_")?o._.apply(a,r.args):null,{res:a,forceNext:!1}},o.hasOwnProperty("_")||(r.limit=function(){var a=r.args[0]||"";return e.caseSensitive||(a=a.toLowerCase()),o.hasOwnProperty(a)})):r.preCheck=function(a){return r.args=fH(a),r.hRes=typeof t=="function"?t.apply(a,r.args):!0,{res:a,forceNext:!1}},r}qr.promptCL=function(t,e){var r=Ps({hideEchoBack:!1,limitMessage:"Requested command is not available.",caseSensitive:!1,history:!0},e),o=Bme(t,r);return r.limit=o.limit,r.preCheck=o.preCheck,qr.prompt(r),o.args};qr.promptLoop=function(t,e){for(var r=Ps({hideEchoBack:!1,trueValue:null,falseValue:null,caseSensitive:!1,history:!0},e);!t(qr.prompt(r)););};qr.promptCLLoop=function(t,e){var r=Ps({hideEchoBack:!1,limitMessage:"Requested command is not available.",caseSensitive:!1,history:!0},e),o=Bme(t,r);for(r.limit=o.limit,r.preCheck=o.preCheck;qr.prompt(r),!o.hRes;);};qr.promptSimShell=function(t){return qr.prompt(Ps({hideEchoBack:!1,history:!0},t,{prompt:function(){return tm?"$>":(process.env.USER||"")+(process.env.HOSTNAME?"@"+process.env.HOSTNAME.replace(/\..*$/,""):"")+":$$ "}()}))};function vme(t,e,r){var o;return t==null&&(t="Are you sure? "),(!e||e.guide!==!1)&&(t+="")&&(t=t.replace(/\s*:?\s*$/,"")+" [y/n]: "),o=qr.keyIn(t,Ps(e,{hideEchoBack:!1,limit:r,trueValue:"y",falseValue:"n",caseSensitive:!1})),typeof o=="boolean"?o:""}qr.keyInYN=function(t,e){return vme(t,e)};qr.keyInYNStrict=function(t,e){return vme(t,e,"yn")};qr.keyInPause=function(t,e){t==null&&(t="Continue..."),(!e||e.guide!==!1)&&(t+="")&&(t=t.replace(/\s+$/,"")+" (Hit any key)"),qr.keyIn(t,Ps({limit:null},e,{hideEchoBack:!0,mask:""}))};qr.keyInSelect=function(t,e,r){var o=Ps({hideEchoBack:!1},r,{trueValue:null,falseValue:null,caseSensitive:!1,phContent:function(p){return p==="itemsCount"?t.length+"":p==="firstItem"?(t[0]+"").trim():p==="lastItem"?(t[t.length-1]+"").trim():null}}),a="",n={},u=49,A=` +`;if(!Array.isArray(t)||!t.length||t.length>35)throw"`items` must be Array (max length: 35).";return t.forEach(function(p,h){var E=String.fromCharCode(u);a+=E,n[E]=h,A+="["+E+"] "+(p+"").trim()+` +`,u=u===57?97:u+1}),(!r||r.cancel!==!1)&&(a+="0",n[0]=-1,A+="[0] "+(r&&r.cancel!=null&&typeof r.cancel!="boolean"?(r.cancel+"").trim():"CANCEL")+` +`),o.limit=a,A+=` +`,e==null&&(e="Choose one from list: "),(e+="")&&((!r||r.guide!==!1)&&(e=e.replace(/\s*:?\s*$/,"")+" [$]: "),A+=e),n[qr.keyIn(A,o).toLowerCase()]};qr.getRawInput=function(){return uQ};function A2(t,e){var r;return e.length&&(r={},r[t]=e[0]),qr.setDefaultOptions(r)[t]}qr.setPrint=function(){return A2("print",arguments)};qr.setPrompt=function(){return A2("prompt",arguments)};qr.setEncoding=function(){return A2("encoding",arguments)};qr.setMask=function(){return A2("mask",arguments)};qr.setBufferSize=function(){return A2("bufferSize",arguments)}});var dH=U((e5t,dl)=>{(function(){var t={major:0,minor:2,patch:66,status:"beta"};tau_file_system={files:{},open:function(I,P,y){var F=tau_file_system.files[I];if(!F){if(y==="read")return null;F={path:I,text:"",type:P,get:function(J,X){return X===this.text.length||X>this.text.length?"end_of_file":this.text.substring(X,X+J)},put:function(J,X){return X==="end_of_file"?(this.text+=J,!0):X==="past_end_of_file"?null:(this.text=this.text.substring(0,X)+J+this.text.substring(X+J.length),!0)},get_byte:function(J){if(J==="end_of_stream")return-1;var X=Math.floor(J/2);if(this.text.length<=X)return-1;var $=n(this.text[Math.floor(J/2)],0);return J%2===0?$&255:$/256>>>0},put_byte:function(J,X){var $=X==="end_of_stream"?this.text.length:Math.floor(X/2);if(this.text.length<$)return null;var ie=this.text.length===$?-1:n(this.text[Math.floor(X/2)],0);return X%2===0?(ie=ie/256>>>0,ie=(ie&255)<<8|J&255):(ie=ie&255,ie=(J&255)<<8|ie&255),this.text.length===$?this.text+=u(ie):this.text=this.text.substring(0,$)+u(ie)+this.text.substring($+1),!0},flush:function(){return!0},close:function(){var J=tau_file_system.files[this.path];return J?!0:null}},tau_file_system.files[I]=F}return y==="write"&&(F.text=""),F}},tau_user_input={buffer:"",get:function(I,P){for(var y;tau_user_input.buffer.length\?\@\^\~\\]+|'(?:[^']*?(?:\\(?:x?\d+)?\\)*(?:'')*(?:\\')*)*')/,number:/^(?:0o[0-7]+|0x[0-9a-fA-F]+|0b[01]+|0'(?:''|\\[abfnrtv\\'"`]|\\x?\d+\\|[^\\])|\d+(?:\.\d+(?:[eE][+-]?\d+)?)?)/,string:/^(?:"([^"]|""|\\")*"|`([^`]|``|\\`)*`)/,l_brace:/^(?:\[)/,r_brace:/^(?:\])/,l_bracket:/^(?:\{)/,r_bracket:/^(?:\})/,bar:/^(?:\|)/,l_paren:/^(?:\()/,r_paren:/^(?:\))/};function L(I,P){return I.get_flag("char_conversion").id==="on"?P.replace(/./g,function(y){return I.get_char_conversion(y)}):P}function _(I){this.thread=I,this.text="",this.tokens=[]}_.prototype.set_last_tokens=function(I){return this.tokens=I},_.prototype.new_text=function(I){this.text=I,this.tokens=[]},_.prototype.get_tokens=function(I){var P,y=0,F=0,J=0,X=[],$=!1;if(I){var ie=this.tokens[I-1];y=ie.len,P=L(this.thread,this.text.substr(ie.len)),F=ie.line,J=ie.start}else P=this.text;if(/^\s*$/.test(P))return null;for(;P!=="";){var ke=[],Ne=!1;if(/^\n/.exec(P)!==null){F++,J=0,y++,P=P.replace(/\n/,""),$=!0;continue}for(var st in R)if(R.hasOwnProperty(st)){var ht=R[st].exec(P);ht&&ke.push({value:ht[0],name:st,matches:ht})}if(!ke.length)return this.set_last_tokens([{value:P,matches:[],name:"lexical",line:F,start:J}]);var ie=r(ke,function(Dr,fr){return Dr.value.length>=fr.value.length?Dr:fr});switch(ie.start=J,ie.line=F,P=P.replace(ie.value,""),J+=ie.value.length,y+=ie.value.length,ie.name){case"atom":ie.raw=ie.value,ie.value.charAt(0)==="'"&&(ie.value=v(ie.value.substr(1,ie.value.length-2),"'"),ie.value===null&&(ie.name="lexical",ie.value="unknown escape sequence"));break;case"number":ie.float=ie.value.substring(0,2)!=="0x"&&ie.value.match(/[.eE]/)!==null&&ie.value!=="0'.",ie.value=C(ie.value),ie.blank=Ne;break;case"string":var Ut=ie.value.charAt(0);ie.value=v(ie.value.substr(1,ie.value.length-2),Ut),ie.value===null&&(ie.name="lexical",ie.value="unknown escape sequence");break;case"whitespace":var Xt=X[X.length-1];Xt&&(Xt.space=!0),Ne=!0;continue;case"r_bracket":X.length>0&&X[X.length-1].name==="l_bracket"&&(ie=X.pop(),ie.name="atom",ie.value="{}",ie.raw="{}",ie.space=!1);break;case"r_brace":X.length>0&&X[X.length-1].name==="l_brace"&&(ie=X.pop(),ie.name="atom",ie.value="[]",ie.raw="[]",ie.space=!1);break}ie.len=y,X.push(ie),Ne=!1}var Pt=this.set_last_tokens(X);return Pt.length===0?null:Pt};function V(I,P,y,F,J){if(!P[y])return{type:A,value:x.error.syntax(P[y-1],"expression expected",!0)};var X;if(F==="0"){var $=P[y];switch($.name){case"number":return{type:p,len:y+1,value:new x.type.Num($.value,$.float)};case"variable":return{type:p,len:y+1,value:new x.type.Var($.value)};case"string":var ie;switch(I.get_flag("double_quotes").id){case"atom":ie=new H($.value,[]);break;case"codes":ie=new H("[]",[]);for(var ke=$.value.length-1;ke>=0;ke--)ie=new H(".",[new x.type.Num(n($.value,ke),!1),ie]);break;case"chars":ie=new H("[]",[]);for(var ke=$.value.length-1;ke>=0;ke--)ie=new H(".",[new x.type.Term($.value.charAt(ke),[]),ie]);break}return{type:p,len:y+1,value:ie};case"l_paren":var Pt=V(I,P,y+1,I.__get_max_priority(),!0);return Pt.type!==p?Pt:P[Pt.len]&&P[Pt.len].name==="r_paren"?(Pt.len++,Pt):{type:A,derived:!0,value:x.error.syntax(P[Pt.len]?P[Pt.len]:P[Pt.len-1],") or operator expected",!P[Pt.len])};case"l_bracket":var Pt=V(I,P,y+1,I.__get_max_priority(),!0);return Pt.type!==p?Pt:P[Pt.len]&&P[Pt.len].name==="r_bracket"?(Pt.len++,Pt.value=new H("{}",[Pt.value]),Pt):{type:A,derived:!0,value:x.error.syntax(P[Pt.len]?P[Pt.len]:P[Pt.len-1],"} or operator expected",!P[Pt.len])}}var Ne=re(I,P,y,J);return Ne.type===p||Ne.derived||(Ne=oe(I,P,y),Ne.type===p||Ne.derived)?Ne:{type:A,derived:!1,value:x.error.syntax(P[y],"unexpected token")}}var st=I.__get_max_priority(),ht=I.__get_next_priority(F),Ut=y;if(P[y].name==="atom"&&P[y+1]&&(P[y].space||P[y+1].name!=="l_paren")){var $=P[y++],Xt=I.__lookup_operator_classes(F,$.value);if(Xt&&Xt.indexOf("fy")>-1){var Pt=V(I,P,y,F,J);if(Pt.type!==A)return $.value==="-"&&!$.space&&x.type.is_number(Pt.value)?{value:new x.type.Num(-Pt.value.value,Pt.value.is_float),len:Pt.len,type:p}:{value:new x.type.Term($.value,[Pt.value]),len:Pt.len,type:p};X=Pt}else if(Xt&&Xt.indexOf("fx")>-1){var Pt=V(I,P,y,ht,J);if(Pt.type!==A)return{value:new x.type.Term($.value,[Pt.value]),len:Pt.len,type:p};X=Pt}}y=Ut;var Pt=V(I,P,y,ht,J);if(Pt.type===p){y=Pt.len;var $=P[y];if(P[y]&&(P[y].name==="atom"&&I.__lookup_operator_classes(F,$.value)||P[y].name==="bar"&&I.__lookup_operator_classes(F,"|"))){var tn=ht,Dr=F,Xt=I.__lookup_operator_classes(F,$.value);if(Xt.indexOf("xf")>-1)return{value:new x.type.Term($.value,[Pt.value]),len:++Pt.len,type:p};if(Xt.indexOf("xfx")>-1){var fr=V(I,P,y+1,tn,J);return fr.type===p?{value:new x.type.Term($.value,[Pt.value,fr.value]),len:fr.len,type:p}:(fr.derived=!0,fr)}else if(Xt.indexOf("xfy")>-1){var fr=V(I,P,y+1,Dr,J);return fr.type===p?{value:new x.type.Term($.value,[Pt.value,fr.value]),len:fr.len,type:p}:(fr.derived=!0,fr)}else if(Pt.type!==A)for(;;){y=Pt.len;var $=P[y];if($&&$.name==="atom"&&I.__lookup_operator_classes(F,$.value)){var Xt=I.__lookup_operator_classes(F,$.value);if(Xt.indexOf("yf")>-1)Pt={value:new x.type.Term($.value,[Pt.value]),len:++y,type:p};else if(Xt.indexOf("yfx")>-1){var fr=V(I,P,++y,tn,J);if(fr.type===A)return fr.derived=!0,fr;y=fr.len,Pt={value:new x.type.Term($.value,[Pt.value,fr.value]),len:y,type:p}}else break}else break}}else X={type:A,value:x.error.syntax(P[Pt.len-1],"operator expected")};return Pt}return Pt}function re(I,P,y,F){if(!P[y]||P[y].name==="atom"&&P[y].raw==="."&&!F&&(P[y].space||!P[y+1]||P[y+1].name!=="l_paren"))return{type:A,derived:!1,value:x.error.syntax(P[y-1],"unfounded token")};var J=P[y],X=[];if(P[y].name==="atom"&&P[y].raw!==","){if(y++,P[y-1].space)return{type:p,len:y,value:new x.type.Term(J.value,X)};if(P[y]&&P[y].name==="l_paren"){if(P[y+1]&&P[y+1].name==="r_paren")return{type:A,derived:!0,value:x.error.syntax(P[y+1],"argument expected")};var $=V(I,P,++y,"999",!0);if($.type===A)return $.derived?$:{type:A,derived:!0,value:x.error.syntax(P[y]?P[y]:P[y-1],"argument expected",!P[y])};for(X.push($.value),y=$.len;P[y]&&P[y].name==="atom"&&P[y].value===",";){if($=V(I,P,y+1,"999",!0),$.type===A)return $.derived?$:{type:A,derived:!0,value:x.error.syntax(P[y+1]?P[y+1]:P[y],"argument expected",!P[y+1])};X.push($.value),y=$.len}if(P[y]&&P[y].name==="r_paren")y++;else return{type:A,derived:!0,value:x.error.syntax(P[y]?P[y]:P[y-1],", or ) expected",!P[y])}}return{type:p,len:y,value:new x.type.Term(J.value,X)}}return{type:A,derived:!1,value:x.error.syntax(P[y],"term expected")}}function oe(I,P,y){if(!P[y])return{type:A,derived:!1,value:x.error.syntax(P[y-1],"[ expected")};if(P[y]&&P[y].name==="l_brace"){var F=V(I,P,++y,"999",!0),J=[F.value],X=void 0;if(F.type===A)return P[y]&&P[y].name==="r_brace"?{type:p,len:y+1,value:new x.type.Term("[]",[])}:{type:A,derived:!0,value:x.error.syntax(P[y],"] expected")};for(y=F.len;P[y]&&P[y].name==="atom"&&P[y].value===",";){if(F=V(I,P,y+1,"999",!0),F.type===A)return F.derived?F:{type:A,derived:!0,value:x.error.syntax(P[y+1]?P[y+1]:P[y],"argument expected",!P[y+1])};J.push(F.value),y=F.len}var $=!1;if(P[y]&&P[y].name==="bar"){if($=!0,F=V(I,P,y+1,"999",!0),F.type===A)return F.derived?F:{type:A,derived:!0,value:x.error.syntax(P[y+1]?P[y+1]:P[y],"argument expected",!P[y+1])};X=F.value,y=F.len}return P[y]&&P[y].name==="r_brace"?{type:p,len:y+1,value:g(J,X)}:{type:A,derived:!0,value:x.error.syntax(P[y]?P[y]:P[y-1],$?"] expected":", or | or ] expected",!P[y])}}return{type:A,derived:!1,value:x.error.syntax(P[y],"list expected")}}function pe(I,P,y){var F=P[y].line,J=V(I,P,y,I.__get_max_priority(),!1),X=null,$;if(J.type!==A)if(y=J.len,P[y]&&P[y].name==="atom"&&P[y].raw===".")if(y++,x.type.is_term(J.value)){if(J.value.indicator===":-/2"?(X=new x.type.Rule(J.value.args[0],Pe(J.value.args[1])),$={value:X,len:y,type:p}):J.value.indicator==="-->/2"?(X=ge(new x.type.Rule(J.value.args[0],J.value.args[1]),I),X.body=Pe(X.body),$={value:X,len:y,type:x.type.is_rule(X)?p:A}):(X=new x.type.Rule(J.value,null),$={value:X,len:y,type:p}),X){var ie=X.singleton_variables();ie.length>0&&I.throw_warning(x.warning.singleton(ie,X.head.indicator,F))}return $}else return{type:A,value:x.error.syntax(P[y],"callable expected")};else return{type:A,value:x.error.syntax(P[y]?P[y]:P[y-1],". or operator expected")};return J}function he(I,P,y){y=y||{},y.from=y.from?y.from:"$tau-js",y.reconsult=y.reconsult!==void 0?y.reconsult:!0;var F=new _(I),J={},X;F.new_text(P);var $=0,ie=F.get_tokens($);do{if(ie===null||!ie[$])break;var ke=pe(I,ie,$);if(ke.type===A)return new H("throw",[ke.value]);if(ke.value.body===null&&ke.value.head.indicator==="?-/1"){var Ne=new At(I.session);Ne.add_goal(ke.value.head.args[0]),Ne.answer(function(ht){x.type.is_error(ht)?I.throw_warning(ht.args[0]):(ht===!1||ht===null)&&I.throw_warning(x.warning.failed_goal(ke.value.head.args[0],ke.len))}),$=ke.len;var st=!0}else if(ke.value.body===null&&ke.value.head.indicator===":-/1"){var st=I.run_directive(ke.value.head.args[0]);$=ke.len,ke.value.head.args[0].indicator==="char_conversion/2"&&(ie=F.get_tokens($),$=0)}else{X=ke.value.head.indicator,y.reconsult!==!1&&J[X]!==!0&&!I.is_multifile_predicate(X)&&(I.session.rules[X]=a(I.session.rules[X]||[],function(Ut){return Ut.dynamic}),J[X]=!0);var st=I.add_rule(ke.value,y);$=ke.len}if(!st)return st}while(!0);return!0}function ve(I,P){var y=new _(I);y.new_text(P);var F=0;do{var J=y.get_tokens(F);if(J===null)break;var X=V(I,J,0,I.__get_max_priority(),!1);if(X.type!==A){var $=X.len,ie=$;if(J[$]&&J[$].name==="atom"&&J[$].raw===".")I.add_goal(Pe(X.value));else{var ke=J[$];return new H("throw",[x.error.syntax(ke||J[$-1],". or operator expected",!ke)])}F=X.len+1}else return new H("throw",[X.value])}while(!0);return!0}function ge(I,P){I=I.rename(P);var y=P.next_free_variable(),F=le(I.body,y,P);return F.error?F.value:(I.body=F.value,I.head.args=I.head.args.concat([y,F.variable]),I.head=new H(I.head.id,I.head.args),I)}function le(I,P,y){var F;if(x.type.is_term(I)&&I.indicator==="!/0")return{value:I,variable:P,error:!1};if(x.type.is_term(I)&&I.indicator===",/2"){var J=le(I.args[0],P,y);if(J.error)return J;var X=le(I.args[1],J.variable,y);return X.error?X:{value:new H(",",[J.value,X.value]),variable:X.variable,error:!1}}else{if(x.type.is_term(I)&&I.indicator==="{}/1")return{value:I.args[0],variable:P,error:!1};if(x.type.is_empty_list(I))return{value:new H("true",[]),variable:P,error:!1};if(x.type.is_list(I)){F=y.next_free_variable();for(var $=I,ie;$.indicator==="./2";)ie=$,$=$.args[1];return x.type.is_variable($)?{value:x.error.instantiation("DCG"),variable:P,error:!0}:x.type.is_empty_list($)?(ie.args[1]=F,{value:new H("=",[P,I]),variable:F,error:!1}):{value:x.error.type("list",I,"DCG"),variable:P,error:!0}}else return x.type.is_callable(I)?(F=y.next_free_variable(),I.args=I.args.concat([P,F]),I=new H(I.id,I.args),{value:I,variable:F,error:!1}):{value:x.error.type("callable",I,"DCG"),variable:P,error:!0}}}function Pe(I){return x.type.is_variable(I)?new H("call",[I]):x.type.is_term(I)&&[",/2",";/2","->/2"].indexOf(I.indicator)!==-1?new H(I.id,[Pe(I.args[0]),Pe(I.args[1])]):I}function g(I,P){for(var y=P||new x.type.Term("[]",[]),F=I.length-1;F>=0;F--)y=new x.type.Term(".",[I[F],y]);return y}function De(I,P){for(var y=I.length-1;y>=0;y--)I[y]===P&&I.splice(y,1)}function Ce(I){for(var P={},y=[],F=0;F=0;P--)if(I.charAt(P)==="/")return new H("/",[new H(I.substring(0,P)),new be(parseInt(I.substring(P+1)),!1)])}function me(I){this.id=I}function be(I,P){this.is_float=P!==void 0?P:parseInt(I)!==I,this.value=this.is_float?I:parseInt(I)}var ut=0;function H(I,P,y){this.ref=y||++ut,this.id=I,this.args=P||[],this.indicator=I+"/"+this.args.length}var yt=0;function Me(I,P,y,F,J,X){this.id=yt++,this.stream=I,this.mode=P,this.alias=y,this.type=F!==void 0?F:"text",this.reposition=J!==void 0?J:!0,this.eof_action=X!==void 0?X:"eof_code",this.position=this.mode==="append"?"end_of_stream":0,this.output=this.mode==="write"||this.mode==="append",this.input=this.mode==="read"}function Te(I){I=I||{},this.links=I}function Qe(I,P,y){P=P||new Te,y=y||null,this.goal=I,this.substitution=P,this.parent=y}function _e(I,P,y){this.head=I,this.body=P,this.dynamic=y||!1}function qe(I){I=I===void 0||I<=0?1e3:I,this.rules={},this.src_predicates={},this.rename=0,this.modules=[],this.thread=new At(this),this.total_threads=1,this.renamed_variables={},this.public_predicates={},this.multifile_predicates={},this.limit=I,this.streams={user_input:new Me(typeof dl<"u"&&dl.exports?nodejs_user_input:tau_user_input,"read","user_input","text",!1,"reset"),user_output:new Me(typeof dl<"u"&&dl.exports?nodejs_user_output:tau_user_output,"write","user_output","text",!1,"eof_code")},this.file_system=typeof dl<"u"&&dl.exports?nodejs_file_system:tau_file_system,this.standard_input=this.streams.user_input,this.standard_output=this.streams.user_output,this.current_input=this.streams.user_input,this.current_output=this.streams.user_output,this.format_success=function(P){return P.substitution},this.format_error=function(P){return P.goal},this.flag={bounded:x.flag.bounded.value,max_integer:x.flag.max_integer.value,min_integer:x.flag.min_integer.value,integer_rounding_function:x.flag.integer_rounding_function.value,char_conversion:x.flag.char_conversion.value,debug:x.flag.debug.value,max_arity:x.flag.max_arity.value,unknown:x.flag.unknown.value,double_quotes:x.flag.double_quotes.value,occurs_check:x.flag.occurs_check.value,dialect:x.flag.dialect.value,version_data:x.flag.version_data.value,nodejs:x.flag.nodejs.value},this.__loaded_modules=[],this.__char_conversion={},this.__operators={1200:{":-":["fx","xfx"],"-->":["xfx"],"?-":["fx"]},1100:{";":["xfy"]},1050:{"->":["xfy"]},1e3:{",":["xfy"]},900:{"\\+":["fy"]},700:{"=":["xfx"],"\\=":["xfx"],"==":["xfx"],"\\==":["xfx"],"@<":["xfx"],"@=<":["xfx"],"@>":["xfx"],"@>=":["xfx"],"=..":["xfx"],is:["xfx"],"=:=":["xfx"],"=\\=":["xfx"],"<":["xfx"],"=<":["xfx"],">":["xfx"],">=":["xfx"]},600:{":":["xfy"]},500:{"+":["yfx"],"-":["yfx"],"/\\":["yfx"],"\\/":["yfx"]},400:{"*":["yfx"],"/":["yfx"],"//":["yfx"],rem:["yfx"],mod:["yfx"],"<<":["yfx"],">>":["yfx"]},200:{"**":["xfx"],"^":["xfy"],"-":["fy"],"+":["fy"],"\\":["fy"]}}}function At(I){this.epoch=Date.now(),this.session=I,this.session.total_threads++,this.total_steps=0,this.cpu_time=0,this.cpu_time_last=0,this.points=[],this.debugger=!1,this.debugger_states=[],this.level="top_level/0",this.__calls=[],this.current_limit=this.session.limit,this.warnings=[]}function Oe(I,P,y){this.id=I,this.rules=P,this.exports=y,x.module[I]=this}Oe.prototype.exports_predicate=function(I){return this.exports.indexOf(I)!==-1},me.prototype.unify=function(I,P){if(P&&e(I.variables(),this.id)!==-1&&!x.type.is_variable(I))return null;var y={};return y[this.id]=I,new Te(y)},be.prototype.unify=function(I,P){return x.type.is_number(I)&&this.value===I.value&&this.is_float===I.is_float?new Te:null},H.prototype.unify=function(I,P){if(x.type.is_term(I)&&this.indicator===I.indicator){for(var y=new Te,F=0;F=0){var F=this.args[0].value,J=Math.floor(F/26),X=F%26;return"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[X]+(J!==0?J:"")}switch(this.indicator){case"[]/0":case"{}/0":case"!/0":return this.id;case"{}/1":return"{"+this.args[0].toString(I)+"}";case"./2":for(var $="["+this.args[0].toString(I),ie=this.args[1];ie.indicator==="./2";)$+=", "+ie.args[0].toString(I),ie=ie.args[1];return ie.indicator!=="[]/0"&&($+="|"+ie.toString(I)),$+="]",$;case",/2":return"("+this.args[0].toString(I)+", "+this.args[1].toString(I)+")";default:var ke=this.id,Ne=I.session?I.session.lookup_operator(this.id,this.args.length):null;if(I.session===void 0||I.ignore_ops||Ne===null)return I.quoted&&!/^(!|,|;|[a-z][0-9a-zA-Z_]*)$/.test(ke)&&ke!=="{}"&&ke!=="[]"&&(ke="'"+b(ke)+"'"),ke+(this.args.length?"("+o(this.args,function(Xt){return Xt.toString(I)}).join(", ")+")":"");var st=Ne.priority>P.priority||Ne.priority===P.priority&&(Ne.class==="xfy"&&this.indicator!==P.indicator||Ne.class==="yfx"&&this.indicator!==P.indicator||this.indicator===P.indicator&&Ne.class==="yfx"&&y==="right"||this.indicator===P.indicator&&Ne.class==="xfy"&&y==="left");Ne.indicator=this.indicator;var ht=st?"(":"",Ut=st?")":"";return this.args.length===0?"("+this.id+")":["fy","fx"].indexOf(Ne.class)!==-1?ht+ke+" "+this.args[0].toString(I,Ne)+Ut:["yf","xf"].indexOf(Ne.class)!==-1?ht+this.args[0].toString(I,Ne)+" "+ke+Ut:ht+this.args[0].toString(I,Ne,"left")+" "+this.id+" "+this.args[1].toString(I,Ne,"right")+Ut}},Me.prototype.toString=function(I){return"("+this.id+")"},Te.prototype.toString=function(I){var P="{";for(var y in this.links)!this.links.hasOwnProperty(y)||(P!=="{"&&(P+=", "),P+=y+"/"+this.links[y].toString(I));return P+="}",P},Qe.prototype.toString=function(I){return this.goal===null?"<"+this.substitution.toString(I)+">":"<"+this.goal.toString(I)+", "+this.substitution.toString(I)+">"},_e.prototype.toString=function(I){return this.body?this.head.toString(I)+" :- "+this.body.toString(I)+".":this.head.toString(I)+"."},qe.prototype.toString=function(I){for(var P="",y=0;y=0;J--)F=new H(".",[P[J],F]);return F}return new H(this.id,o(this.args,function(X){return X.apply(I)}),this.ref)},Me.prototype.apply=function(I){return this},_e.prototype.apply=function(I){return new _e(this.head.apply(I),this.body!==null?this.body.apply(I):null)},Te.prototype.apply=function(I){var P,y={};for(P in this.links)!this.links.hasOwnProperty(P)||(y[P]=this.links[P].apply(I));return new Te(y)},H.prototype.select=function(){for(var I=this;I.indicator===",/2";)I=I.args[0];return I},H.prototype.replace=function(I){return this.indicator===",/2"?this.args[0].indicator===",/2"?new H(",",[this.args[0].replace(I),this.args[1]]):I===null?this.args[1]:new H(",",[I,this.args[1]]):I},H.prototype.search=function(I){if(x.type.is_term(I)&&I.ref!==void 0&&this.ref===I.ref)return!0;for(var P=0;PP&&F0&&(P=this.head_point().substitution.domain());e(P,x.format_variable(this.session.rename))!==-1;)this.session.rename++;if(I.id==="_")return new me(x.format_variable(this.session.rename));this.session.renamed_variables[I.id]=x.format_variable(this.session.rename)}return new me(this.session.renamed_variables[I.id])},qe.prototype.next_free_variable=function(){return this.thread.next_free_variable()},At.prototype.next_free_variable=function(){this.session.rename++;var I=[];for(this.points.length>0&&(I=this.head_point().substitution.domain());e(I,x.format_variable(this.session.rename))!==-1;)this.session.rename++;return new me(x.format_variable(this.session.rename))},qe.prototype.is_public_predicate=function(I){return!this.public_predicates.hasOwnProperty(I)||this.public_predicates[I]===!0},At.prototype.is_public_predicate=function(I){return this.session.is_public_predicate(I)},qe.prototype.is_multifile_predicate=function(I){return this.multifile_predicates.hasOwnProperty(I)&&this.multifile_predicates[I]===!0},At.prototype.is_multifile_predicate=function(I){return this.session.is_multifile_predicate(I)},qe.prototype.prepend=function(I){return this.thread.prepend(I)},At.prototype.prepend=function(I){for(var P=I.length-1;P>=0;P--)this.points.push(I[P])},qe.prototype.success=function(I,P){return this.thread.success(I,P)},At.prototype.success=function(I,y){var y=typeof y>"u"?I:y;this.prepend([new Qe(I.goal.replace(null),I.substitution,y)])},qe.prototype.throw_error=function(I){return this.thread.throw_error(I)},At.prototype.throw_error=function(I){this.prepend([new Qe(new H("throw",[I]),new Te,null,null)])},qe.prototype.step_rule=function(I,P){return this.thread.step_rule(I,P)},At.prototype.step_rule=function(I,P){var y=P.indicator;if(I==="user"&&(I=null),I===null&&this.session.rules.hasOwnProperty(y))return this.session.rules[y];for(var F=I===null?this.session.modules:e(this.session.modules,I)===-1?[]:[I],J=0;J1)&&this.again()},qe.prototype.answers=function(I,P,y){return this.thread.answers(I,P,y)},At.prototype.answers=function(I,P,y){var F=P||1e3,J=this;if(P<=0){y&&y();return}this.answer(function(X){I(X),X!==!1?setTimeout(function(){J.answers(I,P-1,y)},1):y&&y()})},qe.prototype.again=function(I){return this.thread.again(I)},At.prototype.again=function(I){for(var P,y=Date.now();this.__calls.length>0;){for(this.warnings=[],I!==!1&&(this.current_limit=this.session.limit);this.current_limit>0&&this.points.length>0&&this.head_point().goal!==null&&!x.type.is_error(this.head_point().goal);)if(this.current_limit--,this.step()===!0)return;var F=Date.now();this.cpu_time_last=F-y,this.cpu_time+=this.cpu_time_last;var J=this.__calls.shift();this.current_limit<=0?J(null):this.points.length===0?J(!1):x.type.is_error(this.head_point().goal)?(P=this.session.format_error(this.points.pop()),this.points=[],J(P)):(this.debugger&&this.debugger_states.push(this.head_point()),P=this.session.format_success(this.points.pop()),J(P))}},qe.prototype.unfold=function(I){if(I.body===null)return!1;var P=I.head,y=I.body,F=y.select(),J=new At(this),X=[];J.add_goal(F),J.step();for(var $=J.points.length-1;$>=0;$--){var ie=J.points[$],ke=P.apply(ie.substitution),Ne=y.replace(ie.goal);Ne!==null&&(Ne=Ne.apply(ie.substitution)),X.push(new _e(ke,Ne))}var st=this.rules[P.indicator],ht=e(st,I);return X.length>0&&ht!==-1?(st.splice.apply(st,[ht,1].concat(X)),!0):!1},At.prototype.unfold=function(I){return this.session.unfold(I)},me.prototype.interpret=function(I){return x.error.instantiation(I.level)},be.prototype.interpret=function(I){return this},H.prototype.interpret=function(I){return x.type.is_unitary_list(this)?this.args[0].interpret(I):x.operate(I,this)},me.prototype.compare=function(I){return this.idI.id?1:0},be.prototype.compare=function(I){if(this.value===I.value&&this.is_float===I.is_float)return 0;if(this.valueI.value)return 1},H.prototype.compare=function(I){if(this.args.lengthI.args.length||this.args.length===I.args.length&&this.id>I.id)return 1;for(var P=0;PF)return 1;if(I.constructor===be){if(I.is_float&&P.is_float)return 0;if(I.is_float)return-1;if(P.is_float)return 1}return 0},is_substitution:function(I){return I instanceof Te},is_state:function(I){return I instanceof Qe},is_rule:function(I){return I instanceof _e},is_variable:function(I){return I instanceof me},is_stream:function(I){return I instanceof Me},is_anonymous_var:function(I){return I instanceof me&&I.id==="_"},is_callable:function(I){return I instanceof H},is_number:function(I){return I instanceof be},is_integer:function(I){return I instanceof be&&!I.is_float},is_float:function(I){return I instanceof be&&I.is_float},is_term:function(I){return I instanceof H},is_atom:function(I){return I instanceof H&&I.args.length===0},is_ground:function(I){if(I instanceof me)return!1;if(I instanceof H){for(var P=0;P0},is_list:function(I){return I instanceof H&&(I.indicator==="[]/0"||I.indicator==="./2")},is_empty_list:function(I){return I instanceof H&&I.indicator==="[]/0"},is_non_empty_list:function(I){return I instanceof H&&I.indicator==="./2"},is_fully_list:function(I){for(;I instanceof H&&I.indicator==="./2";)I=I.args[1];return I instanceof me||I instanceof H&&I.indicator==="[]/0"},is_instantiated_list:function(I){for(;I instanceof H&&I.indicator==="./2";)I=I.args[1];return I instanceof H&&I.indicator==="[]/0"},is_unitary_list:function(I){return I instanceof H&&I.indicator==="./2"&&I.args[1]instanceof H&&I.args[1].indicator==="[]/0"},is_character:function(I){return I instanceof H&&(I.id.length===1||I.id.length>0&&I.id.length<=2&&n(I.id,0)>=65536)},is_character_code:function(I){return I instanceof be&&!I.is_float&&I.value>=0&&I.value<=1114111},is_byte:function(I){return I instanceof be&&!I.is_float&&I.value>=0&&I.value<=255},is_operator:function(I){return I instanceof H&&x.arithmetic.evaluation[I.indicator]},is_directive:function(I){return I instanceof H&&x.directive[I.indicator]!==void 0},is_builtin:function(I){return I instanceof H&&x.predicate[I.indicator]!==void 0},is_error:function(I){return I instanceof H&&I.indicator==="throw/1"},is_predicate_indicator:function(I){return I instanceof H&&I.indicator==="//2"&&I.args[0]instanceof H&&I.args[0].args.length===0&&I.args[1]instanceof be&&I.args[1].is_float===!1},is_flag:function(I){return I instanceof H&&I.args.length===0&&x.flag[I.id]!==void 0},is_value_flag:function(I,P){if(!x.type.is_flag(I))return!1;for(var y in x.flag[I.id].allowed)if(!!x.flag[I.id].allowed.hasOwnProperty(y)&&x.flag[I.id].allowed[y].equals(P))return!0;return!1},is_io_mode:function(I){return x.type.is_atom(I)&&["read","write","append"].indexOf(I.id)!==-1},is_stream_option:function(I){return x.type.is_term(I)&&(I.indicator==="alias/1"&&x.type.is_atom(I.args[0])||I.indicator==="reposition/1"&&x.type.is_atom(I.args[0])&&(I.args[0].id==="true"||I.args[0].id==="false")||I.indicator==="type/1"&&x.type.is_atom(I.args[0])&&(I.args[0].id==="text"||I.args[0].id==="binary")||I.indicator==="eof_action/1"&&x.type.is_atom(I.args[0])&&(I.args[0].id==="error"||I.args[0].id==="eof_code"||I.args[0].id==="reset"))},is_stream_position:function(I){return x.type.is_integer(I)&&I.value>=0||x.type.is_atom(I)&&(I.id==="end_of_stream"||I.id==="past_end_of_stream")},is_stream_property:function(I){return x.type.is_term(I)&&(I.indicator==="input/0"||I.indicator==="output/0"||I.indicator==="alias/1"&&(x.type.is_variable(I.args[0])||x.type.is_atom(I.args[0]))||I.indicator==="file_name/1"&&(x.type.is_variable(I.args[0])||x.type.is_atom(I.args[0]))||I.indicator==="position/1"&&(x.type.is_variable(I.args[0])||x.type.is_stream_position(I.args[0]))||I.indicator==="reposition/1"&&(x.type.is_variable(I.args[0])||x.type.is_atom(I.args[0])&&(I.args[0].id==="true"||I.args[0].id==="false"))||I.indicator==="type/1"&&(x.type.is_variable(I.args[0])||x.type.is_atom(I.args[0])&&(I.args[0].id==="text"||I.args[0].id==="binary"))||I.indicator==="mode/1"&&(x.type.is_variable(I.args[0])||x.type.is_atom(I.args[0])&&(I.args[0].id==="read"||I.args[0].id==="write"||I.args[0].id==="append"))||I.indicator==="eof_action/1"&&(x.type.is_variable(I.args[0])||x.type.is_atom(I.args[0])&&(I.args[0].id==="error"||I.args[0].id==="eof_code"||I.args[0].id==="reset"))||I.indicator==="end_of_stream/1"&&(x.type.is_variable(I.args[0])||x.type.is_atom(I.args[0])&&(I.args[0].id==="at"||I.args[0].id==="past"||I.args[0].id==="not")))},is_streamable:function(I){return I.__proto__.stream!==void 0},is_read_option:function(I){return x.type.is_term(I)&&["variables/1","variable_names/1","singletons/1"].indexOf(I.indicator)!==-1},is_write_option:function(I){return x.type.is_term(I)&&(I.indicator==="quoted/1"&&x.type.is_atom(I.args[0])&&(I.args[0].id==="true"||I.args[0].id==="false")||I.indicator==="ignore_ops/1"&&x.type.is_atom(I.args[0])&&(I.args[0].id==="true"||I.args[0].id==="false")||I.indicator==="numbervars/1"&&x.type.is_atom(I.args[0])&&(I.args[0].id==="true"||I.args[0].id==="false"))},is_close_option:function(I){return x.type.is_term(I)&&I.indicator==="force/1"&&x.type.is_atom(I.args[0])&&(I.args[0].id==="true"||I.args[0].id==="false")},is_modifiable_flag:function(I){return x.type.is_flag(I)&&x.flag[I.id].changeable},is_module:function(I){return I instanceof H&&I.indicator==="library/1"&&I.args[0]instanceof H&&I.args[0].args.length===0&&x.module[I.args[0].id]!==void 0}},arithmetic:{evaluation:{"e/0":{type_args:null,type_result:!0,fn:function(I){return Math.E}},"pi/0":{type_args:null,type_result:!0,fn:function(I){return Math.PI}},"tau/0":{type_args:null,type_result:!0,fn:function(I){return 2*Math.PI}},"epsilon/0":{type_args:null,type_result:!0,fn:function(I){return Number.EPSILON}},"+/1":{type_args:null,type_result:null,fn:function(I,P){return I}},"-/1":{type_args:null,type_result:null,fn:function(I,P){return-I}},"\\/1":{type_args:!1,type_result:!1,fn:function(I,P){return~I}},"abs/1":{type_args:null,type_result:null,fn:function(I,P){return Math.abs(I)}},"sign/1":{type_args:null,type_result:null,fn:function(I,P){return Math.sign(I)}},"float_integer_part/1":{type_args:!0,type_result:!1,fn:function(I,P){return parseInt(I)}},"float_fractional_part/1":{type_args:!0,type_result:!0,fn:function(I,P){return I-parseInt(I)}},"float/1":{type_args:null,type_result:!0,fn:function(I,P){return parseFloat(I)}},"floor/1":{type_args:!0,type_result:!1,fn:function(I,P){return Math.floor(I)}},"truncate/1":{type_args:!0,type_result:!1,fn:function(I,P){return parseInt(I)}},"round/1":{type_args:!0,type_result:!1,fn:function(I,P){return Math.round(I)}},"ceiling/1":{type_args:!0,type_result:!1,fn:function(I,P){return Math.ceil(I)}},"sin/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.sin(I)}},"cos/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.cos(I)}},"tan/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.tan(I)}},"asin/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.asin(I)}},"acos/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.acos(I)}},"atan/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.atan(I)}},"atan2/2":{type_args:null,type_result:!0,fn:function(I,P,y){return Math.atan2(I,P)}},"exp/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.exp(I)}},"sqrt/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.sqrt(I)}},"log/1":{type_args:null,type_result:!0,fn:function(I,P){return I>0?Math.log(I):x.error.evaluation("undefined",P.__call_indicator)}},"+/2":{type_args:null,type_result:null,fn:function(I,P,y){return I+P}},"-/2":{type_args:null,type_result:null,fn:function(I,P,y){return I-P}},"*/2":{type_args:null,type_result:null,fn:function(I,P,y){return I*P}},"//2":{type_args:null,type_result:!0,fn:function(I,P,y){return P?I/P:x.error.evaluation("zero_division",y.__call_indicator)}},"///2":{type_args:!1,type_result:!1,fn:function(I,P,y){return P?parseInt(I/P):x.error.evaluation("zero_division",y.__call_indicator)}},"**/2":{type_args:null,type_result:!0,fn:function(I,P,y){return Math.pow(I,P)}},"^/2":{type_args:null,type_result:null,fn:function(I,P,y){return Math.pow(I,P)}},"<>/2":{type_args:!1,type_result:!1,fn:function(I,P,y){return I>>P}},"/\\/2":{type_args:!1,type_result:!1,fn:function(I,P,y){return I&P}},"\\//2":{type_args:!1,type_result:!1,fn:function(I,P,y){return I|P}},"xor/2":{type_args:!1,type_result:!1,fn:function(I,P,y){return I^P}},"rem/2":{type_args:!1,type_result:!1,fn:function(I,P,y){return P?I%P:x.error.evaluation("zero_division",y.__call_indicator)}},"mod/2":{type_args:!1,type_result:!1,fn:function(I,P,y){return P?I-parseInt(I/P)*P:x.error.evaluation("zero_division",y.__call_indicator)}},"max/2":{type_args:null,type_result:null,fn:function(I,P,y){return Math.max(I,P)}},"min/2":{type_args:null,type_result:null,fn:function(I,P,y){return Math.min(I,P)}}}},directive:{"dynamic/1":function(I,P){var y=P.args[0];if(x.type.is_variable(y))I.throw_error(x.error.instantiation(P.indicator));else if(!x.type.is_compound(y)||y.indicator!=="//2")I.throw_error(x.error.type("predicate_indicator",y,P.indicator));else if(x.type.is_variable(y.args[0])||x.type.is_variable(y.args[1]))I.throw_error(x.error.instantiation(P.indicator));else if(!x.type.is_atom(y.args[0]))I.throw_error(x.error.type("atom",y.args[0],P.indicator));else if(!x.type.is_integer(y.args[1]))I.throw_error(x.error.type("integer",y.args[1],P.indicator));else{var F=P.args[0].args[0].id+"/"+P.args[0].args[1].value;I.session.public_predicates[F]=!0,I.session.rules[F]||(I.session.rules[F]=[])}},"multifile/1":function(I,P){var y=P.args[0];x.type.is_variable(y)?I.throw_error(x.error.instantiation(P.indicator)):!x.type.is_compound(y)||y.indicator!=="//2"?I.throw_error(x.error.type("predicate_indicator",y,P.indicator)):x.type.is_variable(y.args[0])||x.type.is_variable(y.args[1])?I.throw_error(x.error.instantiation(P.indicator)):x.type.is_atom(y.args[0])?x.type.is_integer(y.args[1])?I.session.multifile_predicates[P.args[0].args[0].id+"/"+P.args[0].args[1].value]=!0:I.throw_error(x.error.type("integer",y.args[1],P.indicator)):I.throw_error(x.error.type("atom",y.args[0],P.indicator))},"set_prolog_flag/2":function(I,P){var y=P.args[0],F=P.args[1];x.type.is_variable(y)||x.type.is_variable(F)?I.throw_error(x.error.instantiation(P.indicator)):x.type.is_atom(y)?x.type.is_flag(y)?x.type.is_value_flag(y,F)?x.type.is_modifiable_flag(y)?I.session.flag[y.id]=F:I.throw_error(x.error.permission("modify","flag",y)):I.throw_error(x.error.domain("flag_value",new H("+",[y,F]),P.indicator)):I.throw_error(x.error.domain("prolog_flag",y,P.indicator)):I.throw_error(x.error.type("atom",y,P.indicator))},"use_module/1":function(I,P){var y=P.args[0];if(x.type.is_variable(y))I.throw_error(x.error.instantiation(P.indicator));else if(!x.type.is_term(y))I.throw_error(x.error.type("term",y,P.indicator));else if(x.type.is_module(y)){var F=y.args[0].id;e(I.session.modules,F)===-1&&I.session.modules.push(F)}},"char_conversion/2":function(I,P){var y=P.args[0],F=P.args[1];x.type.is_variable(y)||x.type.is_variable(F)?I.throw_error(x.error.instantiation(P.indicator)):x.type.is_character(y)?x.type.is_character(F)?y.id===F.id?delete I.session.__char_conversion[y.id]:I.session.__char_conversion[y.id]=F.id:I.throw_error(x.error.type("character",F,P.indicator)):I.throw_error(x.error.type("character",y,P.indicator))},"op/3":function(I,P){var y=P.args[0],F=P.args[1],J=P.args[2];if(x.type.is_variable(y)||x.type.is_variable(F)||x.type.is_variable(J))I.throw_error(x.error.instantiation(P.indicator));else if(!x.type.is_integer(y))I.throw_error(x.error.type("integer",y,P.indicator));else if(!x.type.is_atom(F))I.throw_error(x.error.type("atom",F,P.indicator));else if(!x.type.is_atom(J))I.throw_error(x.error.type("atom",J,P.indicator));else if(y.value<0||y.value>1200)I.throw_error(x.error.domain("operator_priority",y,P.indicator));else if(J.id===",")I.throw_error(x.error.permission("modify","operator",J,P.indicator));else if(J.id==="|"&&(y.value<1001||F.id.length!==3))I.throw_error(x.error.permission("modify","operator",J,P.indicator));else if(["fy","fx","yf","xf","xfx","yfx","xfy"].indexOf(F.id)===-1)I.throw_error(x.error.domain("operator_specifier",F,P.indicator));else{var X={prefix:null,infix:null,postfix:null};for(var $ in I.session.__operators)if(!!I.session.__operators.hasOwnProperty($)){var ie=I.session.__operators[$][J.id];ie&&(e(ie,"fx")!==-1&&(X.prefix={priority:$,type:"fx"}),e(ie,"fy")!==-1&&(X.prefix={priority:$,type:"fy"}),e(ie,"xf")!==-1&&(X.postfix={priority:$,type:"xf"}),e(ie,"yf")!==-1&&(X.postfix={priority:$,type:"yf"}),e(ie,"xfx")!==-1&&(X.infix={priority:$,type:"xfx"}),e(ie,"xfy")!==-1&&(X.infix={priority:$,type:"xfy"}),e(ie,"yfx")!==-1&&(X.infix={priority:$,type:"yfx"}))}var ke;switch(F.id){case"fy":case"fx":ke="prefix";break;case"yf":case"xf":ke="postfix";break;default:ke="infix";break}if(((X.prefix&&ke==="prefix"||X.postfix&&ke==="postfix"||X.infix&&ke==="infix")&&X[ke].type!==F.id||X.infix&&ke==="postfix"||X.postfix&&ke==="infix")&&y.value!==0)I.throw_error(x.error.permission("create","operator",J,P.indicator));else return X[ke]&&(De(I.session.__operators[X[ke].priority][J.id],F.id),I.session.__operators[X[ke].priority][J.id].length===0&&delete I.session.__operators[X[ke].priority][J.id]),y.value>0&&(I.session.__operators[y.value]||(I.session.__operators[y.value.toString()]={}),I.session.__operators[y.value][J.id]||(I.session.__operators[y.value][J.id]=[]),I.session.__operators[y.value][J.id].push(F.id)),!0}}},predicate:{"op/3":function(I,P,y){x.directive["op/3"](I,y)&&I.success(P)},"current_op/3":function(I,P,y){var F=y.args[0],J=y.args[1],X=y.args[2],$=[];for(var ie in I.session.__operators)for(var ke in I.session.__operators[ie])for(var Ne=0;Ne/2"){var F=I.points,J=I.session.format_success,X=I.session.format_error;I.session.format_success=function(Ne){return Ne.substitution},I.session.format_error=function(Ne){return Ne.goal},I.points=[new Qe(y.args[0].args[0],P.substitution,P)];var $=function(Ne){I.points=F,I.session.format_success=J,I.session.format_error=X,Ne===!1?I.prepend([new Qe(P.goal.replace(y.args[1]),P.substitution,P)]):x.type.is_error(Ne)?I.throw_error(Ne.args[0]):Ne===null?(I.prepend([P]),I.__calls.shift()(null)):I.prepend([new Qe(P.goal.replace(y.args[0].args[1]).apply(Ne),P.substitution.apply(Ne),P)])};I.__calls.unshift($)}else{var ie=new Qe(P.goal.replace(y.args[0]),P.substitution,P),ke=new Qe(P.goal.replace(y.args[1]),P.substitution,P);I.prepend([ie,ke])}},"!/0":function(I,P,y){var F,J,X=[];for(F=P,J=null;F.parent!==null&&F.parent.goal.search(y);)if(J=F,F=F.parent,F.goal!==null){var $=F.goal.select();if($&&$.id==="call"&&$.search(y)){F=J;break}}for(var ie=I.points.length-1;ie>=0;ie--){for(var ke=I.points[ie],Ne=ke.parent;Ne!==null&&Ne!==F.parent;)Ne=Ne.parent;Ne===null&&Ne!==F.parent&&X.push(ke)}I.points=X.reverse(),I.success(P)},"\\+/1":function(I,P,y){var F=y.args[0];x.type.is_variable(F)?I.throw_error(x.error.instantiation(I.level)):x.type.is_callable(F)?I.prepend([new Qe(P.goal.replace(new H(",",[new H(",",[new H("call",[F]),new H("!",[])]),new H("fail",[])])),P.substitution,P),new Qe(P.goal.replace(null),P.substitution,P)]):I.throw_error(x.error.type("callable",F,I.level))},"->/2":function(I,P,y){var F=P.goal.replace(new H(",",[y.args[0],new H(",",[new H("!"),y.args[1]])]));I.prepend([new Qe(F,P.substitution,P)])},"fail/0":function(I,P,y){},"false/0":function(I,P,y){},"true/0":function(I,P,y){I.success(P)},"call/1":ne(1),"call/2":ne(2),"call/3":ne(3),"call/4":ne(4),"call/5":ne(5),"call/6":ne(6),"call/7":ne(7),"call/8":ne(8),"once/1":function(I,P,y){var F=y.args[0];I.prepend([new Qe(P.goal.replace(new H(",",[new H("call",[F]),new H("!",[])])),P.substitution,P)])},"forall/2":function(I,P,y){var F=y.args[0],J=y.args[1];I.prepend([new Qe(P.goal.replace(new H("\\+",[new H(",",[new H("call",[F]),new H("\\+",[new H("call",[J])])])])),P.substitution,P)])},"repeat/0":function(I,P,y){I.prepend([new Qe(P.goal.replace(null),P.substitution,P),P])},"throw/1":function(I,P,y){x.type.is_variable(y.args[0])?I.throw_error(x.error.instantiation(I.level)):I.throw_error(y.args[0])},"catch/3":function(I,P,y){var F=I.points;I.points=[],I.prepend([new Qe(y.args[0],P.substitution,P)]);var J=I.session.format_success,X=I.session.format_error;I.session.format_success=function(ie){return ie.substitution},I.session.format_error=function(ie){return ie.goal};var $=function(ie){var ke=I.points;if(I.points=F,I.session.format_success=J,I.session.format_error=X,x.type.is_error(ie)){for(var Ne=[],st=I.points.length-1;st>=0;st--){for(var Xt=I.points[st],ht=Xt.parent;ht!==null&&ht!==P.parent;)ht=ht.parent;ht===null&&ht!==P.parent&&Ne.push(Xt)}I.points=Ne;var Ut=I.get_flag("occurs_check").indicator==="true/0",Xt=new Qe,Pt=x.unify(ie.args[0],y.args[1],Ut);Pt!==null?(Xt.substitution=P.substitution.apply(Pt),Xt.goal=P.goal.replace(y.args[2]).apply(Pt),Xt.parent=P,I.prepend([Xt])):I.throw_error(ie.args[0])}else if(ie!==!1){for(var tn=ie===null?[]:[new Qe(P.goal.apply(ie).replace(null),P.substitution.apply(ie),P)],Dr=[],st=ke.length-1;st>=0;st--){Dr.push(ke[st]);var fr=ke[st].goal!==null?ke[st].goal.select():null;if(x.type.is_term(fr)&&fr.indicator==="!/0")break}var Br=o(Dr,function(jr){return jr.goal===null&&(jr.goal=new H("true",[])),jr=new Qe(P.goal.replace(new H("catch",[jr.goal,y.args[1],y.args[2]])),P.substitution.apply(jr.substitution),jr.parent),jr.exclude=y.args[0].variables(),jr}).reverse();I.prepend(Br),I.prepend(tn),ie===null&&(this.current_limit=0,I.__calls.shift()(null))}};I.__calls.unshift($)},"=/2":function(I,P,y){var F=I.get_flag("occurs_check").indicator==="true/0",J=new Qe,X=x.unify(y.args[0],y.args[1],F);X!==null&&(J.goal=P.goal.apply(X).replace(null),J.substitution=P.substitution.apply(X),J.parent=P,I.prepend([J]))},"unify_with_occurs_check/2":function(I,P,y){var F=new Qe,J=x.unify(y.args[0],y.args[1],!0);J!==null&&(F.goal=P.goal.apply(J).replace(null),F.substitution=P.substitution.apply(J),F.parent=P,I.prepend([F]))},"\\=/2":function(I,P,y){var F=I.get_flag("occurs_check").indicator==="true/0",J=x.unify(y.args[0],y.args[1],F);J===null&&I.success(P)},"subsumes_term/2":function(I,P,y){var F=I.get_flag("occurs_check").indicator==="true/0",J=x.unify(y.args[1],y.args[0],F);J!==null&&y.args[1].apply(J).equals(y.args[1])&&I.success(P)},"findall/3":function(I,P,y){var F=y.args[0],J=y.args[1],X=y.args[2];if(x.type.is_variable(J))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(J))I.throw_error(x.error.type("callable",J,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_list(X))I.throw_error(x.error.type("list",X,y.indicator));else{var $=I.next_free_variable(),ie=new H(",",[J,new H("=",[$,F])]),ke=I.points,Ne=I.session.limit,st=I.session.format_success;I.session.format_success=function(Xt){return Xt.substitution},I.add_goal(ie,!0,P);var ht=[],Ut=function(Xt){if(Xt!==!1&&Xt!==null&&!x.type.is_error(Xt))I.__calls.unshift(Ut),ht.push(Xt.links[$.id]),I.session.limit=I.current_limit;else if(I.points=ke,I.session.limit=Ne,I.session.format_success=st,x.type.is_error(Xt))I.throw_error(Xt.args[0]);else if(I.current_limit>0){for(var Pt=new H("[]"),tn=ht.length-1;tn>=0;tn--)Pt=new H(".",[ht[tn],Pt]);I.prepend([new Qe(P.goal.replace(new H("=",[X,Pt])),P.substitution,P)])}};I.__calls.unshift(Ut)}},"bagof/3":function(I,P,y){var F,J=y.args[0],X=y.args[1],$=y.args[2];if(x.type.is_variable(X))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(X))I.throw_error(x.error.type("callable",X,y.indicator));else if(!x.type.is_variable($)&&!x.type.is_list($))I.throw_error(x.error.type("list",$,y.indicator));else{var ie=I.next_free_variable(),ke;X.indicator==="^/2"?(ke=X.args[0].variables(),X=X.args[1]):ke=[],ke=ke.concat(J.variables());for(var Ne=X.variables().filter(function(Br){return e(ke,Br)===-1}),st=new H("[]"),ht=Ne.length-1;ht>=0;ht--)st=new H(".",[new me(Ne[ht]),st]);var Ut=new H(",",[X,new H("=",[ie,new H(",",[st,J])])]),Xt=I.points,Pt=I.session.limit,tn=I.session.format_success;I.session.format_success=function(Br){return Br.substitution},I.add_goal(Ut,!0,P);var Dr=[],fr=function(Br){if(Br!==!1&&Br!==null&&!x.type.is_error(Br)){I.__calls.unshift(fr);var jr=!1,Hn=Br.links[ie.id].args[0],bs=Br.links[ie.id].args[1];for(var ki in Dr)if(!!Dr.hasOwnProperty(ki)){var gs=Dr[ki];if(gs.variables.equals(Hn)){gs.answers.push(bs),jr=!0;break}}jr||Dr.push({variables:Hn,answers:[bs]}),I.session.limit=I.current_limit}else if(I.points=Xt,I.session.limit=Pt,I.session.format_success=tn,x.type.is_error(Br))I.throw_error(Br.args[0]);else if(I.current_limit>0){for(var to=[],Di=0;Di=0;ro--)Qs=new H(".",[Br[ro],Qs]);to.push(new Qe(P.goal.replace(new H(",",[new H("=",[st,Dr[Di].variables]),new H("=",[$,Qs])])),P.substitution,P))}I.prepend(to)}};I.__calls.unshift(fr)}},"setof/3":function(I,P,y){var F,J=y.args[0],X=y.args[1],$=y.args[2];if(x.type.is_variable(X))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(X))I.throw_error(x.error.type("callable",X,y.indicator));else if(!x.type.is_variable($)&&!x.type.is_list($))I.throw_error(x.error.type("list",$,y.indicator));else{var ie=I.next_free_variable(),ke;X.indicator==="^/2"?(ke=X.args[0].variables(),X=X.args[1]):ke=[],ke=ke.concat(J.variables());for(var Ne=X.variables().filter(function(Br){return e(ke,Br)===-1}),st=new H("[]"),ht=Ne.length-1;ht>=0;ht--)st=new H(".",[new me(Ne[ht]),st]);var Ut=new H(",",[X,new H("=",[ie,new H(",",[st,J])])]),Xt=I.points,Pt=I.session.limit,tn=I.session.format_success;I.session.format_success=function(Br){return Br.substitution},I.add_goal(Ut,!0,P);var Dr=[],fr=function(Br){if(Br!==!1&&Br!==null&&!x.type.is_error(Br)){I.__calls.unshift(fr);var jr=!1,Hn=Br.links[ie.id].args[0],bs=Br.links[ie.id].args[1];for(var ki in Dr)if(!!Dr.hasOwnProperty(ki)){var gs=Dr[ki];if(gs.variables.equals(Hn)){gs.answers.push(bs),jr=!0;break}}jr||Dr.push({variables:Hn,answers:[bs]}),I.session.limit=I.current_limit}else if(I.points=Xt,I.session.limit=Pt,I.session.format_success=tn,x.type.is_error(Br))I.throw_error(Br.args[0]);else if(I.current_limit>0){for(var to=[],Di=0;Di=0;ro--)Qs=new H(".",[Br[ro],Qs]);to.push(new Qe(P.goal.replace(new H(",",[new H("=",[st,Dr[Di].variables]),new H("=",[$,Qs])])),P.substitution,P))}I.prepend(to)}};I.__calls.unshift(fr)}},"functor/3":function(I,P,y){var F,J=y.args[0],X=y.args[1],$=y.args[2];if(x.type.is_variable(J)&&(x.type.is_variable(X)||x.type.is_variable($)))I.throw_error(x.error.instantiation("functor/3"));else if(!x.type.is_variable($)&&!x.type.is_integer($))I.throw_error(x.error.type("integer",y.args[2],"functor/3"));else if(!x.type.is_variable(X)&&!x.type.is_atomic(X))I.throw_error(x.error.type("atomic",y.args[1],"functor/3"));else if(x.type.is_integer(X)&&x.type.is_integer($)&&$.value!==0)I.throw_error(x.error.type("atom",y.args[1],"functor/3"));else if(x.type.is_variable(J)){if(y.args[2].value>=0){for(var ie=[],ke=0;ke<$.value;ke++)ie.push(I.next_free_variable());var Ne=x.type.is_integer(X)?X:new H(X.id,ie);I.prepend([new Qe(P.goal.replace(new H("=",[J,Ne])),P.substitution,P)])}}else{var st=x.type.is_integer(J)?J:new H(J.id,[]),ht=x.type.is_integer(J)?new be(0,!1):new be(J.args.length,!1),Ut=new H(",",[new H("=",[st,X]),new H("=",[ht,$])]);I.prepend([new Qe(P.goal.replace(Ut),P.substitution,P)])}},"arg/3":function(I,P,y){if(x.type.is_variable(y.args[0])||x.type.is_variable(y.args[1]))I.throw_error(x.error.instantiation(y.indicator));else if(y.args[0].value<0)I.throw_error(x.error.domain("not_less_than_zero",y.args[0],y.indicator));else if(!x.type.is_compound(y.args[1]))I.throw_error(x.error.type("compound",y.args[1],y.indicator));else{var F=y.args[0].value;if(F>0&&F<=y.args[1].args.length){var J=new H("=",[y.args[1].args[F-1],y.args[2]]);I.prepend([new Qe(P.goal.replace(J),P.substitution,P)])}}},"=../2":function(I,P,y){var F;if(x.type.is_variable(y.args[0])&&(x.type.is_variable(y.args[1])||x.type.is_non_empty_list(y.args[1])&&x.type.is_variable(y.args[1].args[0])))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_fully_list(y.args[1]))I.throw_error(x.error.type("list",y.args[1],y.indicator));else if(x.type.is_variable(y.args[0])){if(!x.type.is_variable(y.args[1])){var X=[];for(F=y.args[1].args[1];F.indicator==="./2";)X.push(F.args[0]),F=F.args[1];x.type.is_variable(y.args[0])&&x.type.is_variable(F)?I.throw_error(x.error.instantiation(y.indicator)):X.length===0&&x.type.is_compound(y.args[1].args[0])?I.throw_error(x.error.type("atomic",y.args[1].args[0],y.indicator)):X.length>0&&(x.type.is_compound(y.args[1].args[0])||x.type.is_number(y.args[1].args[0]))?I.throw_error(x.error.type("atom",y.args[1].args[0],y.indicator)):X.length===0?I.prepend([new Qe(P.goal.replace(new H("=",[y.args[1].args[0],y.args[0]],P)),P.substitution,P)]):I.prepend([new Qe(P.goal.replace(new H("=",[new H(y.args[1].args[0].id,X),y.args[0]])),P.substitution,P)])}}else{if(x.type.is_atomic(y.args[0]))F=new H(".",[y.args[0],new H("[]")]);else{F=new H("[]");for(var J=y.args[0].args.length-1;J>=0;J--)F=new H(".",[y.args[0].args[J],F]);F=new H(".",[new H(y.args[0].id),F])}I.prepend([new Qe(P.goal.replace(new H("=",[F,y.args[1]])),P.substitution,P)])}},"copy_term/2":function(I,P,y){var F=y.args[0].rename(I);I.prepend([new Qe(P.goal.replace(new H("=",[F,y.args[1]])),P.substitution,P.parent)])},"term_variables/2":function(I,P,y){var F=y.args[0],J=y.args[1];if(!x.type.is_fully_list(J))I.throw_error(x.error.type("list",J,y.indicator));else{var X=g(o(Ce(F.variables()),function($){return new me($)}));I.prepend([new Qe(P.goal.replace(new H("=",[J,X])),P.substitution,P)])}},"clause/2":function(I,P,y){if(x.type.is_variable(y.args[0]))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))I.throw_error(x.error.type("callable",y.args[0],y.indicator));else if(!x.type.is_variable(y.args[1])&&!x.type.is_callable(y.args[1]))I.throw_error(x.error.type("callable",y.args[1],y.indicator));else if(I.session.rules[y.args[0].indicator]!==void 0)if(I.is_public_predicate(y.args[0].indicator)){var F=[];for(var J in I.session.rules[y.args[0].indicator])if(!!I.session.rules[y.args[0].indicator].hasOwnProperty(J)){var X=I.session.rules[y.args[0].indicator][J];I.session.renamed_variables={},X=X.rename(I),X.body===null&&(X.body=new H("true"));var $=new H(",",[new H("=",[X.head,y.args[0]]),new H("=",[X.body,y.args[1]])]);F.push(new Qe(P.goal.replace($),P.substitution,P))}I.prepend(F)}else I.throw_error(x.error.permission("access","private_procedure",y.args[0].indicator,y.indicator))},"current_predicate/1":function(I,P,y){var F=y.args[0];if(!x.type.is_variable(F)&&(!x.type.is_compound(F)||F.indicator!=="//2"))I.throw_error(x.error.type("predicate_indicator",F,y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_variable(F.args[0])&&!x.type.is_atom(F.args[0]))I.throw_error(x.error.type("atom",F.args[0],y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_variable(F.args[1])&&!x.type.is_integer(F.args[1]))I.throw_error(x.error.type("integer",F.args[1],y.indicator));else{var J=[];for(var X in I.session.rules)if(!!I.session.rules.hasOwnProperty(X)){var $=X.lastIndexOf("/"),ie=X.substr(0,$),ke=parseInt(X.substr($+1,X.length-($+1))),Ne=new H("/",[new H(ie),new be(ke,!1)]),st=new H("=",[Ne,F]);J.push(new Qe(P.goal.replace(st),P.substitution,P))}I.prepend(J)}},"asserta/1":function(I,P,y){if(x.type.is_variable(y.args[0]))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))I.throw_error(x.error.type("callable",y.args[0],y.indicator));else{var F,J;y.args[0].indicator===":-/2"?(F=y.args[0].args[0],J=Pe(y.args[0].args[1])):(F=y.args[0],J=null),x.type.is_callable(F)?J!==null&&!x.type.is_callable(J)?I.throw_error(x.error.type("callable",J,y.indicator)):I.is_public_predicate(F.indicator)?(I.session.rules[F.indicator]===void 0&&(I.session.rules[F.indicator]=[]),I.session.public_predicates[F.indicator]=!0,I.session.rules[F.indicator]=[new _e(F,J,!0)].concat(I.session.rules[F.indicator]),I.success(P)):I.throw_error(x.error.permission("modify","static_procedure",F.indicator,y.indicator)):I.throw_error(x.error.type("callable",F,y.indicator))}},"assertz/1":function(I,P,y){if(x.type.is_variable(y.args[0]))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))I.throw_error(x.error.type("callable",y.args[0],y.indicator));else{var F,J;y.args[0].indicator===":-/2"?(F=y.args[0].args[0],J=Pe(y.args[0].args[1])):(F=y.args[0],J=null),x.type.is_callable(F)?J!==null&&!x.type.is_callable(J)?I.throw_error(x.error.type("callable",J,y.indicator)):I.is_public_predicate(F.indicator)?(I.session.rules[F.indicator]===void 0&&(I.session.rules[F.indicator]=[]),I.session.public_predicates[F.indicator]=!0,I.session.rules[F.indicator].push(new _e(F,J,!0)),I.success(P)):I.throw_error(x.error.permission("modify","static_procedure",F.indicator,y.indicator)):I.throw_error(x.error.type("callable",F,y.indicator))}},"retract/1":function(I,P,y){if(x.type.is_variable(y.args[0]))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))I.throw_error(x.error.type("callable",y.args[0],y.indicator));else{var F,J;if(y.args[0].indicator===":-/2"?(F=y.args[0].args[0],J=y.args[0].args[1]):(F=y.args[0],J=new H("true")),typeof P.retract>"u")if(I.is_public_predicate(F.indicator)){if(I.session.rules[F.indicator]!==void 0){for(var X=[],$=0;$I.get_flag("max_arity").value)I.throw_error(x.error.representation("max_arity",y.indicator));else{var F=y.args[0].args[0].id+"/"+y.args[0].args[1].value;I.is_public_predicate(F)?(delete I.session.rules[F],I.success(P)):I.throw_error(x.error.permission("modify","static_procedure",F,y.indicator))}},"atom_length/2":function(I,P,y){if(x.type.is_variable(y.args[0]))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_atom(y.args[0]))I.throw_error(x.error.type("atom",y.args[0],y.indicator));else if(!x.type.is_variable(y.args[1])&&!x.type.is_integer(y.args[1]))I.throw_error(x.error.type("integer",y.args[1],y.indicator));else if(x.type.is_integer(y.args[1])&&y.args[1].value<0)I.throw_error(x.error.domain("not_less_than_zero",y.args[1],y.indicator));else{var F=new be(y.args[0].id.length,!1);I.prepend([new Qe(P.goal.replace(new H("=",[F,y.args[1]])),P.substitution,P)])}},"atom_concat/3":function(I,P,y){var F,J,X=y.args[0],$=y.args[1],ie=y.args[2];if(x.type.is_variable(ie)&&(x.type.is_variable(X)||x.type.is_variable($)))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_atom(X))I.throw_error(x.error.type("atom",X,y.indicator));else if(!x.type.is_variable($)&&!x.type.is_atom($))I.throw_error(x.error.type("atom",$,y.indicator));else if(!x.type.is_variable(ie)&&!x.type.is_atom(ie))I.throw_error(x.error.type("atom",ie,y.indicator));else{var ke=x.type.is_variable(X),Ne=x.type.is_variable($);if(!ke&&!Ne)J=new H("=",[ie,new H(X.id+$.id)]),I.prepend([new Qe(P.goal.replace(J),P.substitution,P)]);else if(ke&&!Ne)F=ie.id.substr(0,ie.id.length-$.id.length),F+$.id===ie.id&&(J=new H("=",[X,new H(F)]),I.prepend([new Qe(P.goal.replace(J),P.substitution,P)]));else if(Ne&&!ke)F=ie.id.substr(X.id.length),X.id+F===ie.id&&(J=new H("=",[$,new H(F)]),I.prepend([new Qe(P.goal.replace(J),P.substitution,P)]));else{for(var st=[],ht=0;ht<=ie.id.length;ht++){var Ut=new H(ie.id.substr(0,ht)),Xt=new H(ie.id.substr(ht));J=new H(",",[new H("=",[Ut,X]),new H("=",[Xt,$])]),st.push(new Qe(P.goal.replace(J),P.substitution,P))}I.prepend(st)}}},"sub_atom/5":function(I,P,y){var F,J=y.args[0],X=y.args[1],$=y.args[2],ie=y.args[3],ke=y.args[4];if(x.type.is_variable(J))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_integer(X))I.throw_error(x.error.type("integer",X,y.indicator));else if(!x.type.is_variable($)&&!x.type.is_integer($))I.throw_error(x.error.type("integer",$,y.indicator));else if(!x.type.is_variable(ie)&&!x.type.is_integer(ie))I.throw_error(x.error.type("integer",ie,y.indicator));else if(x.type.is_integer(X)&&X.value<0)I.throw_error(x.error.domain("not_less_than_zero",X,y.indicator));else if(x.type.is_integer($)&&$.value<0)I.throw_error(x.error.domain("not_less_than_zero",$,y.indicator));else if(x.type.is_integer(ie)&&ie.value<0)I.throw_error(x.error.domain("not_less_than_zero",ie,y.indicator));else{var Ne=[],st=[],ht=[];if(x.type.is_variable(X))for(F=0;F<=J.id.length;F++)Ne.push(F);else Ne.push(X.value);if(x.type.is_variable($))for(F=0;F<=J.id.length;F++)st.push(F);else st.push($.value);if(x.type.is_variable(ie))for(F=0;F<=J.id.length;F++)ht.push(F);else ht.push(ie.value);var Ut=[];for(var Xt in Ne)if(!!Ne.hasOwnProperty(Xt)){F=Ne[Xt];for(var Pt in st)if(!!st.hasOwnProperty(Pt)){var tn=st[Pt],Dr=J.id.length-F-tn;if(e(ht,Dr)!==-1&&F+tn+Dr===J.id.length){var fr=J.id.substr(F,tn);if(J.id===J.id.substr(0,F)+fr+J.id.substr(F+tn,Dr)){var Br=new H("=",[new H(fr),ke]),jr=new H("=",[X,new be(F)]),Hn=new H("=",[$,new be(tn)]),bs=new H("=",[ie,new be(Dr)]),ki=new H(",",[new H(",",[new H(",",[jr,Hn]),bs]),Br]);Ut.push(new Qe(P.goal.replace(ki),P.substitution,P))}}}}I.prepend(Ut)}},"atom_chars/2":function(I,P,y){var F=y.args[0],J=y.args[1];if(x.type.is_variable(F)&&x.type.is_variable(J))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_atom(F))I.throw_error(x.error.type("atom",F,y.indicator));else if(x.type.is_variable(F)){for(var ie=J,ke=x.type.is_variable(F),Ne="";ie.indicator==="./2";){if(x.type.is_character(ie.args[0]))Ne+=ie.args[0].id;else if(x.type.is_variable(ie.args[0])&&ke){I.throw_error(x.error.instantiation(y.indicator));return}else if(!x.type.is_variable(ie.args[0])){I.throw_error(x.error.type("character",ie.args[0],y.indicator));return}ie=ie.args[1]}x.type.is_variable(ie)&&ke?I.throw_error(x.error.instantiation(y.indicator)):!x.type.is_empty_list(ie)&&!x.type.is_variable(ie)?I.throw_error(x.error.type("list",J,y.indicator)):I.prepend([new Qe(P.goal.replace(new H("=",[new H(Ne),F])),P.substitution,P)])}else{for(var X=new H("[]"),$=F.id.length-1;$>=0;$--)X=new H(".",[new H(F.id.charAt($)),X]);I.prepend([new Qe(P.goal.replace(new H("=",[J,X])),P.substitution,P)])}},"atom_codes/2":function(I,P,y){var F=y.args[0],J=y.args[1];if(x.type.is_variable(F)&&x.type.is_variable(J))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_atom(F))I.throw_error(x.error.type("atom",F,y.indicator));else if(x.type.is_variable(F)){for(var ie=J,ke=x.type.is_variable(F),Ne="";ie.indicator==="./2";){if(x.type.is_character_code(ie.args[0]))Ne+=u(ie.args[0].value);else if(x.type.is_variable(ie.args[0])&&ke){I.throw_error(x.error.instantiation(y.indicator));return}else if(!x.type.is_variable(ie.args[0])){I.throw_error(x.error.representation("character_code",y.indicator));return}ie=ie.args[1]}x.type.is_variable(ie)&&ke?I.throw_error(x.error.instantiation(y.indicator)):!x.type.is_empty_list(ie)&&!x.type.is_variable(ie)?I.throw_error(x.error.type("list",J,y.indicator)):I.prepend([new Qe(P.goal.replace(new H("=",[new H(Ne),F])),P.substitution,P)])}else{for(var X=new H("[]"),$=F.id.length-1;$>=0;$--)X=new H(".",[new be(n(F.id,$),!1),X]);I.prepend([new Qe(P.goal.replace(new H("=",[J,X])),P.substitution,P)])}},"char_code/2":function(I,P,y){var F=y.args[0],J=y.args[1];if(x.type.is_variable(F)&&x.type.is_variable(J))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_character(F))I.throw_error(x.error.type("character",F,y.indicator));else if(!x.type.is_variable(J)&&!x.type.is_integer(J))I.throw_error(x.error.type("integer",J,y.indicator));else if(!x.type.is_variable(J)&&!x.type.is_character_code(J))I.throw_error(x.error.representation("character_code",y.indicator));else if(x.type.is_variable(J)){var X=new be(n(F.id,0),!1);I.prepend([new Qe(P.goal.replace(new H("=",[X,J])),P.substitution,P)])}else{var $=new H(u(J.value));I.prepend([new Qe(P.goal.replace(new H("=",[$,F])),P.substitution,P)])}},"number_chars/2":function(I,P,y){var F,J=y.args[0],X=y.args[1];if(x.type.is_variable(J)&&x.type.is_variable(X))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(J)&&!x.type.is_number(J))I.throw_error(x.error.type("number",J,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_list(X))I.throw_error(x.error.type("list",X,y.indicator));else{var $=x.type.is_variable(J);if(!x.type.is_variable(X)){var ie=X,ke=!0;for(F="";ie.indicator==="./2";){if(x.type.is_character(ie.args[0]))F+=ie.args[0].id;else if(x.type.is_variable(ie.args[0]))ke=!1;else if(!x.type.is_variable(ie.args[0])){I.throw_error(x.error.type("character",ie.args[0],y.indicator));return}ie=ie.args[1]}if(ke=ke&&x.type.is_empty_list(ie),!x.type.is_empty_list(ie)&&!x.type.is_variable(ie)){I.throw_error(x.error.type("list",X,y.indicator));return}if(!ke&&$){I.throw_error(x.error.instantiation(y.indicator));return}else if(ke)if(x.type.is_variable(ie)&&$){I.throw_error(x.error.instantiation(y.indicator));return}else{var Ne=I.parse(F),st=Ne.value;!x.type.is_number(st)||Ne.tokens[Ne.tokens.length-1].space?I.throw_error(x.error.syntax_by_predicate("parseable_number",y.indicator)):I.prepend([new Qe(P.goal.replace(new H("=",[J,st])),P.substitution,P)]);return}}if(!$){F=J.toString();for(var ht=new H("[]"),Ut=F.length-1;Ut>=0;Ut--)ht=new H(".",[new H(F.charAt(Ut)),ht]);I.prepend([new Qe(P.goal.replace(new H("=",[X,ht])),P.substitution,P)])}}},"number_codes/2":function(I,P,y){var F,J=y.args[0],X=y.args[1];if(x.type.is_variable(J)&&x.type.is_variable(X))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(J)&&!x.type.is_number(J))I.throw_error(x.error.type("number",J,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_list(X))I.throw_error(x.error.type("list",X,y.indicator));else{var $=x.type.is_variable(J);if(!x.type.is_variable(X)){var ie=X,ke=!0;for(F="";ie.indicator==="./2";){if(x.type.is_character_code(ie.args[0]))F+=u(ie.args[0].value);else if(x.type.is_variable(ie.args[0]))ke=!1;else if(!x.type.is_variable(ie.args[0])){I.throw_error(x.error.type("character_code",ie.args[0],y.indicator));return}ie=ie.args[1]}if(ke=ke&&x.type.is_empty_list(ie),!x.type.is_empty_list(ie)&&!x.type.is_variable(ie)){I.throw_error(x.error.type("list",X,y.indicator));return}if(!ke&&$){I.throw_error(x.error.instantiation(y.indicator));return}else if(ke)if(x.type.is_variable(ie)&&$){I.throw_error(x.error.instantiation(y.indicator));return}else{var Ne=I.parse(F),st=Ne.value;!x.type.is_number(st)||Ne.tokens[Ne.tokens.length-1].space?I.throw_error(x.error.syntax_by_predicate("parseable_number",y.indicator)):I.prepend([new Qe(P.goal.replace(new H("=",[J,st])),P.substitution,P)]);return}}if(!$){F=J.toString();for(var ht=new H("[]"),Ut=F.length-1;Ut>=0;Ut--)ht=new H(".",[new be(n(F,Ut),!1),ht]);I.prepend([new Qe(P.goal.replace(new H("=",[X,ht])),P.substitution,P)])}}},"upcase_atom/2":function(I,P,y){var F=y.args[0],J=y.args[1];x.type.is_variable(F)?I.throw_error(x.error.instantiation(y.indicator)):x.type.is_atom(F)?!x.type.is_variable(J)&&!x.type.is_atom(J)?I.throw_error(x.error.type("atom",J,y.indicator)):I.prepend([new Qe(P.goal.replace(new H("=",[J,new H(F.id.toUpperCase(),[])])),P.substitution,P)]):I.throw_error(x.error.type("atom",F,y.indicator))},"downcase_atom/2":function(I,P,y){var F=y.args[0],J=y.args[1];x.type.is_variable(F)?I.throw_error(x.error.instantiation(y.indicator)):x.type.is_atom(F)?!x.type.is_variable(J)&&!x.type.is_atom(J)?I.throw_error(x.error.type("atom",J,y.indicator)):I.prepend([new Qe(P.goal.replace(new H("=",[J,new H(F.id.toLowerCase(),[])])),P.substitution,P)]):I.throw_error(x.error.type("atom",F,y.indicator))},"atomic_list_concat/2":function(I,P,y){var F=y.args[0],J=y.args[1];I.prepend([new Qe(P.goal.replace(new H("atomic_list_concat",[F,new H("",[]),J])),P.substitution,P)])},"atomic_list_concat/3":function(I,P,y){var F=y.args[0],J=y.args[1],X=y.args[2];if(x.type.is_variable(J)||x.type.is_variable(F)&&x.type.is_variable(X))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_list(F))I.throw_error(x.error.type("list",F,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_atom(X))I.throw_error(x.error.type("atom",X,y.indicator));else if(x.type.is_variable(X)){for(var ie="",ke=F;x.type.is_term(ke)&&ke.indicator==="./2";){if(!x.type.is_atom(ke.args[0])&&!x.type.is_number(ke.args[0])){I.throw_error(x.error.type("atomic",ke.args[0],y.indicator));return}ie!==""&&(ie+=J.id),x.type.is_atom(ke.args[0])?ie+=ke.args[0].id:ie+=""+ke.args[0].value,ke=ke.args[1]}ie=new H(ie,[]),x.type.is_variable(ke)?I.throw_error(x.error.instantiation(y.indicator)):!x.type.is_term(ke)||ke.indicator!=="[]/0"?I.throw_error(x.error.type("list",F,y.indicator)):I.prepend([new Qe(P.goal.replace(new H("=",[ie,X])),P.substitution,P)])}else{var $=g(o(X.id.split(J.id),function(Ne){return new H(Ne,[])}));I.prepend([new Qe(P.goal.replace(new H("=",[$,F])),P.substitution,P)])}},"@=/2":function(I,P,y){x.compare(y.args[0],y.args[1])>0&&I.success(P)},"@>=/2":function(I,P,y){x.compare(y.args[0],y.args[1])>=0&&I.success(P)},"compare/3":function(I,P,y){var F=y.args[0],J=y.args[1],X=y.args[2];if(!x.type.is_variable(F)&&!x.type.is_atom(F))I.throw_error(x.error.type("atom",F,y.indicator));else if(x.type.is_atom(F)&&["<",">","="].indexOf(F.id)===-1)I.throw_error(x.type.domain("order",F,y.indicator));else{var $=x.compare(J,X);$=$===0?"=":$===-1?"<":">",I.prepend([new Qe(P.goal.replace(new H("=",[F,new H($,[])])),P.substitution,P)])}},"is/2":function(I,P,y){var F=y.args[1].interpret(I);x.type.is_number(F)?I.prepend([new Qe(P.goal.replace(new H("=",[y.args[0],F],I.level)),P.substitution,P)]):I.throw_error(F)},"between/3":function(I,P,y){var F=y.args[0],J=y.args[1],X=y.args[2];if(x.type.is_variable(F)||x.type.is_variable(J))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_integer(F))I.throw_error(x.error.type("integer",F,y.indicator));else if(!x.type.is_integer(J))I.throw_error(x.error.type("integer",J,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_integer(X))I.throw_error(x.error.type("integer",X,y.indicator));else if(x.type.is_variable(X)){var $=[new Qe(P.goal.replace(new H("=",[X,F])),P.substitution,P)];F.value=X.value&&I.success(P)},"succ/2":function(I,P,y){var F=y.args[0],J=y.args[1];x.type.is_variable(F)&&x.type.is_variable(J)?I.throw_error(x.error.instantiation(y.indicator)):!x.type.is_variable(F)&&!x.type.is_integer(F)?I.throw_error(x.error.type("integer",F,y.indicator)):!x.type.is_variable(J)&&!x.type.is_integer(J)?I.throw_error(x.error.type("integer",J,y.indicator)):!x.type.is_variable(F)&&F.value<0?I.throw_error(x.error.domain("not_less_than_zero",F,y.indicator)):!x.type.is_variable(J)&&J.value<0?I.throw_error(x.error.domain("not_less_than_zero",J,y.indicator)):(x.type.is_variable(J)||J.value>0)&&(x.type.is_variable(F)?I.prepend([new Qe(P.goal.replace(new H("=",[F,new be(J.value-1,!1)])),P.substitution,P)]):I.prepend([new Qe(P.goal.replace(new H("=",[J,new be(F.value+1,!1)])),P.substitution,P)]))},"=:=/2":function(I,P,y){var F=x.arithmetic_compare(I,y.args[0],y.args[1]);x.type.is_term(F)?I.throw_error(F):F===0&&I.success(P)},"=\\=/2":function(I,P,y){var F=x.arithmetic_compare(I,y.args[0],y.args[1]);x.type.is_term(F)?I.throw_error(F):F!==0&&I.success(P)},"/2":function(I,P,y){var F=x.arithmetic_compare(I,y.args[0],y.args[1]);x.type.is_term(F)?I.throw_error(F):F>0&&I.success(P)},">=/2":function(I,P,y){var F=x.arithmetic_compare(I,y.args[0],y.args[1]);x.type.is_term(F)?I.throw_error(F):F>=0&&I.success(P)},"var/1":function(I,P,y){x.type.is_variable(y.args[0])&&I.success(P)},"atom/1":function(I,P,y){x.type.is_atom(y.args[0])&&I.success(P)},"atomic/1":function(I,P,y){x.type.is_atomic(y.args[0])&&I.success(P)},"compound/1":function(I,P,y){x.type.is_compound(y.args[0])&&I.success(P)},"integer/1":function(I,P,y){x.type.is_integer(y.args[0])&&I.success(P)},"float/1":function(I,P,y){x.type.is_float(y.args[0])&&I.success(P)},"number/1":function(I,P,y){x.type.is_number(y.args[0])&&I.success(P)},"nonvar/1":function(I,P,y){x.type.is_variable(y.args[0])||I.success(P)},"ground/1":function(I,P,y){y.variables().length===0&&I.success(P)},"acyclic_term/1":function(I,P,y){for(var F=P.substitution.apply(P.substitution),J=y.args[0].variables(),X=0;X0?Pt[Pt.length-1]:null,Pt!==null&&(Ut=V(I,Pt,0,I.__get_max_priority(),!1))}if(Ut.type===p&&Ut.len===Pt.length-1&&tn.value==="."){Ut=Ut.value.rename(I);var Dr=new H("=",[J,Ut]);if(ie.variables){var fr=g(o(Ce(Ut.variables()),function(Br){return new me(Br)}));Dr=new H(",",[Dr,new H("=",[ie.variables,fr])])}if(ie.variable_names){var fr=g(o(Ce(Ut.variables()),function(jr){var Hn;for(Hn in I.session.renamed_variables)if(I.session.renamed_variables.hasOwnProperty(Hn)&&I.session.renamed_variables[Hn]===jr)break;return new H("=",[new H(Hn,[]),new me(jr)])}));Dr=new H(",",[Dr,new H("=",[ie.variable_names,fr])])}if(ie.singletons){var fr=g(o(new _e(Ut,null).singleton_variables(),function(jr){var Hn;for(Hn in I.session.renamed_variables)if(I.session.renamed_variables.hasOwnProperty(Hn)&&I.session.renamed_variables[Hn]===jr)break;return new H("=",[new H(Hn,[]),new me(jr)])}));Dr=new H(",",[Dr,new H("=",[ie.singletons,fr])])}I.prepend([new Qe(P.goal.replace(Dr),P.substitution,P)])}else Ut.type===p?I.throw_error(x.error.syntax(Pt[Ut.len],"unexpected token",!1)):I.throw_error(Ut.value)}}},"write/1":function(I,P,y){var F=y.args[0];I.prepend([new Qe(P.goal.replace(new H(",",[new H("current_output",[new me("S")]),new H("write",[new me("S"),F])])),P.substitution,P)])},"write/2":function(I,P,y){var F=y.args[0],J=y.args[1];I.prepend([new Qe(P.goal.replace(new H("write_term",[F,J,new H(".",[new H("quoted",[new H("false",[])]),new H(".",[new H("ignore_ops",[new H("false")]),new H(".",[new H("numbervars",[new H("true")]),new H("[]",[])])])])])),P.substitution,P)])},"writeq/1":function(I,P,y){var F=y.args[0];I.prepend([new Qe(P.goal.replace(new H(",",[new H("current_output",[new me("S")]),new H("writeq",[new me("S"),F])])),P.substitution,P)])},"writeq/2":function(I,P,y){var F=y.args[0],J=y.args[1];I.prepend([new Qe(P.goal.replace(new H("write_term",[F,J,new H(".",[new H("quoted",[new H("true",[])]),new H(".",[new H("ignore_ops",[new H("false")]),new H(".",[new H("numbervars",[new H("true")]),new H("[]",[])])])])])),P.substitution,P)])},"write_canonical/1":function(I,P,y){var F=y.args[0];I.prepend([new Qe(P.goal.replace(new H(",",[new H("current_output",[new me("S")]),new H("write_canonical",[new me("S"),F])])),P.substitution,P)])},"write_canonical/2":function(I,P,y){var F=y.args[0],J=y.args[1];I.prepend([new Qe(P.goal.replace(new H("write_term",[F,J,new H(".",[new H("quoted",[new H("true",[])]),new H(".",[new H("ignore_ops",[new H("true")]),new H(".",[new H("numbervars",[new H("false")]),new H("[]",[])])])])])),P.substitution,P)])},"write_term/2":function(I,P,y){var F=y.args[0],J=y.args[1];I.prepend([new Qe(P.goal.replace(new H(",",[new H("current_output",[new me("S")]),new H("write_term",[new me("S"),F,J])])),P.substitution,P)])},"write_term/3":function(I,P,y){var F=y.args[0],J=y.args[1],X=y.args[2],$=x.type.is_stream(F)?F:I.get_stream_by_alias(F.id);if(x.type.is_variable(F)||x.type.is_variable(X))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_list(X))I.throw_error(x.error.type("list",X,y.indicator));else if(!x.type.is_stream(F)&&!x.type.is_atom(F))I.throw_error(x.error.domain("stream_or_alias",F,y.indicator));else if(!x.type.is_stream($)||$.stream===null)I.throw_error(x.error.existence("stream",F,y.indicator));else if($.input)I.throw_error(x.error.permission("output","stream",F,y.indicator));else if($.type==="binary")I.throw_error(x.error.permission("output","binary_stream",F,y.indicator));else if($.position==="past_end_of_stream"&&$.eof_action==="error")I.throw_error(x.error.permission("output","past_end_of_stream",F,y.indicator));else{for(var ie={},ke=X,Ne;x.type.is_term(ke)&&ke.indicator==="./2";){if(Ne=ke.args[0],x.type.is_variable(Ne)){I.throw_error(x.error.instantiation(y.indicator));return}else if(!x.type.is_write_option(Ne)){I.throw_error(x.error.domain("write_option",Ne,y.indicator));return}ie[Ne.id]=Ne.args[0].id==="true",ke=ke.args[1]}if(ke.indicator!=="[]/0"){x.type.is_variable(ke)?I.throw_error(x.error.instantiation(y.indicator)):I.throw_error(x.error.type("list",X,y.indicator));return}else{ie.session=I.session;var st=J.toString(ie);$.stream.put(st,$.position),typeof $.position=="number"&&($.position+=st.length),I.success(P)}}},"halt/0":function(I,P,y){I.points=[]},"halt/1":function(I,P,y){var F=y.args[0];x.type.is_variable(F)?I.throw_error(x.error.instantiation(y.indicator)):x.type.is_integer(F)?I.points=[]:I.throw_error(x.error.type("integer",F,y.indicator))},"current_prolog_flag/2":function(I,P,y){var F=y.args[0],J=y.args[1];if(!x.type.is_variable(F)&&!x.type.is_atom(F))I.throw_error(x.error.type("atom",F,y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_flag(F))I.throw_error(x.error.domain("prolog_flag",F,y.indicator));else{var X=[];for(var $ in x.flag)if(!!x.flag.hasOwnProperty($)){var ie=new H(",",[new H("=",[new H($),F]),new H("=",[I.get_flag($),J])]);X.push(new Qe(P.goal.replace(ie),P.substitution,P))}I.prepend(X)}},"set_prolog_flag/2":function(I,P,y){var F=y.args[0],J=y.args[1];x.type.is_variable(F)||x.type.is_variable(J)?I.throw_error(x.error.instantiation(y.indicator)):x.type.is_atom(F)?x.type.is_flag(F)?x.type.is_value_flag(F,J)?x.type.is_modifiable_flag(F)?(I.session.flag[F.id]=J,I.success(P)):I.throw_error(x.error.permission("modify","flag",F)):I.throw_error(x.error.domain("flag_value",new H("+",[F,J]),y.indicator)):I.throw_error(x.error.domain("prolog_flag",F,y.indicator)):I.throw_error(x.error.type("atom",F,y.indicator))}},flag:{bounded:{allowed:[new H("true"),new H("false")],value:new H("true"),changeable:!1},max_integer:{allowed:[new be(Number.MAX_SAFE_INTEGER)],value:new be(Number.MAX_SAFE_INTEGER),changeable:!1},min_integer:{allowed:[new be(Number.MIN_SAFE_INTEGER)],value:new be(Number.MIN_SAFE_INTEGER),changeable:!1},integer_rounding_function:{allowed:[new H("down"),new H("toward_zero")],value:new H("toward_zero"),changeable:!1},char_conversion:{allowed:[new H("on"),new H("off")],value:new H("on"),changeable:!0},debug:{allowed:[new H("on"),new H("off")],value:new H("off"),changeable:!0},max_arity:{allowed:[new H("unbounded")],value:new H("unbounded"),changeable:!1},unknown:{allowed:[new H("error"),new H("fail"),new H("warning")],value:new H("error"),changeable:!0},double_quotes:{allowed:[new H("chars"),new H("codes"),new H("atom")],value:new H("codes"),changeable:!0},occurs_check:{allowed:[new H("false"),new H("true")],value:new H("false"),changeable:!0},dialect:{allowed:[new H("tau")],value:new H("tau"),changeable:!1},version_data:{allowed:[new H("tau",[new be(t.major,!1),new be(t.minor,!1),new be(t.patch,!1),new H(t.status)])],value:new H("tau",[new be(t.major,!1),new be(t.minor,!1),new be(t.patch,!1),new H(t.status)]),changeable:!1},nodejs:{allowed:[new H("yes"),new H("no")],value:new H(typeof dl<"u"&&dl.exports?"yes":"no"),changeable:!1}},unify:function(I,P,y){y=y===void 0?!1:y;for(var F=[{left:I,right:P}],J={};F.length!==0;){var X=F.pop();if(I=X.left,P=X.right,x.type.is_term(I)&&x.type.is_term(P)){if(I.indicator!==P.indicator)return null;for(var $=0;$J.value?1:0:J}else return F},operate:function(I,P){if(x.type.is_operator(P)){for(var y=x.type.is_operator(P),F=[],J,X=!1,$=0;$I.get_flag("max_integer").value||J0?I.start+I.matches[0].length:I.start,J=y?new H("token_not_found"):new H("found",[new H(I.value.toString())]),X=new H(".",[new H("line",[new be(I.line+1)]),new H(".",[new H("column",[new be(F+1)]),new H(".",[J,new H("[]",[])])])]);return new H("error",[new H("syntax_error",[new H(P)]),X])},syntax_by_predicate:function(I,P){return new H("error",[new H("syntax_error",[new H(I)]),Z(P)])}},warning:{singleton:function(I,P,y){for(var F=new H("[]"),J=I.length-1;J>=0;J--)F=new H(".",[new me(I[J]),F]);return new H("warning",[new H("singleton_variables",[F,Z(P)]),new H(".",[new H("line",[new be(y,!1)]),new H("[]")])])},failed_goal:function(I,P){return new H("warning",[new H("failed_goal",[I]),new H(".",[new H("line",[new be(P,!1)]),new H("[]")])])}},format_variable:function(I){return"_"+I},format_answer:function(I,P,F){P instanceof qe&&(P=P.thread);var F=F||{};if(F.session=P?P.session:void 0,x.type.is_error(I))return"uncaught exception: "+I.args[0].toString();if(I===!1)return"false.";if(I===null)return"limit exceeded ;";var J=0,X="";if(x.type.is_substitution(I)){var $=I.domain(!0);I=I.filter(function(Ne,st){return!x.type.is_variable(st)||$.indexOf(st.id)!==-1&&Ne!==st.id})}for(var ie in I.links)!I.links.hasOwnProperty(ie)||(J++,X!==""&&(X+=", "),X+=ie.toString(F)+" = "+I.links[ie].toString(F));var ke=typeof P>"u"||P.points.length>0?" ;":".";return J===0?"true"+ke:X+ke},flatten_error:function(I){if(!x.type.is_error(I))return null;I=I.args[0];var P={};return P.type=I.args[0].id,P.thrown=P.type==="syntax_error"?null:I.args[1].id,P.expected=null,P.found=null,P.representation=null,P.existence=null,P.existence_type=null,P.line=null,P.column=null,P.permission_operation=null,P.permission_type=null,P.evaluation_type=null,P.type==="type_error"||P.type==="domain_error"?(P.expected=I.args[0].args[0].id,P.found=I.args[0].args[1].toString()):P.type==="syntax_error"?I.args[1].indicator==="./2"?(P.expected=I.args[0].args[0].id,P.found=I.args[1].args[1].args[1].args[0],P.found=P.found.id==="token_not_found"?P.found.id:P.found.args[0].id,P.line=I.args[1].args[0].args[0].value,P.column=I.args[1].args[1].args[0].args[0].value):P.thrown=I.args[1].id:P.type==="permission_error"?(P.found=I.args[0].args[2].toString(),P.permission_operation=I.args[0].args[0].id,P.permission_type=I.args[0].args[1].id):P.type==="evaluation_error"?P.evaluation_type=I.args[0].args[0].id:P.type==="representation_error"?P.representation=I.args[0].args[0].id:P.type==="existence_error"&&(P.existence=I.args[0].args[1].toString(),P.existence_type=I.args[0].args[0].id),P},create:function(I){return new x.type.Session(I)}};typeof dl<"u"?dl.exports=x:window.pl=x})()});function Sme(t,e,r){t.prepend(r.map(o=>new Ta.default.type.State(e.goal.replace(o),e.substitution,e)))}function mH(t){let e=xme.get(t.session);if(e==null)throw new Error("Assertion failed: A project should have been registered for the active session");return e}function bme(t,e){xme.set(t,e),t.consult(`:- use_module(library(${Agt.id})).`)}var yH,Ta,Pme,ah,cgt,ugt,xme,Agt,Qme=dt(()=>{Ke();yH=tt(e2()),Ta=tt(dH()),Pme=tt(Ie("vm")),{is_atom:ah,is_variable:cgt,is_instantiated_list:ugt}=Ta.default.type;xme=new WeakMap;Agt=new Ta.default.type.Module("constraints",{["project_workspaces_by_descriptor/3"]:(t,e,r)=>{let[o,a,n]=r.args;if(!ah(o)||!ah(a)){t.throw_error(Ta.default.error.instantiation(r.indicator));return}let u=Y.parseIdent(o.id),A=Y.makeDescriptor(u,a.id),h=mH(t).tryWorkspaceByDescriptor(A);cgt(n)&&h!==null&&Sme(t,e,[new Ta.default.type.Term("=",[n,new Ta.default.type.Term(String(h.relativeCwd))])]),ah(n)&&h!==null&&h.relativeCwd===n.id&&t.success(e)},["workspace_field/3"]:(t,e,r)=>{let[o,a,n]=r.args;if(!ah(o)||!ah(a)){t.throw_error(Ta.default.error.instantiation(r.indicator));return}let A=mH(t).tryWorkspaceByCwd(o.id);if(A==null)return;let p=(0,yH.default)(A.manifest.raw,a.id);typeof p>"u"||Sme(t,e,[new Ta.default.type.Term("=",[n,new Ta.default.type.Term(typeof p=="object"?JSON.stringify(p):p)])])},["workspace_field_test/3"]:(t,e,r)=>{let[o,a,n]=r.args;t.prepend([new Ta.default.type.State(e.goal.replace(new Ta.default.type.Term("workspace_field_test",[o,a,n,new Ta.default.type.Term("[]",[])])),e.substitution,e)])},["workspace_field_test/4"]:(t,e,r)=>{let[o,a,n,u]=r.args;if(!ah(o)||!ah(a)||!ah(n)||!ugt(u)){t.throw_error(Ta.default.error.instantiation(r.indicator));return}let p=mH(t).tryWorkspaceByCwd(o.id);if(p==null)return;let h=(0,yH.default)(p.manifest.raw,a.id);if(typeof h>"u")return;let E={$$:h};for(let[v,b]of u.toJavaScript().entries())E[`$${v}`]=b;Pme.default.runInNewContext(n.id,E)&&t.success(e)}},["project_workspaces_by_descriptor/3","workspace_field/3","workspace_field_test/3","workspace_field_test/4"])});var p2={};Yt(p2,{Constraints:()=>f2,DependencyType:()=>Tme});function Zs(t){if(t instanceof CE.default.type.Num)return t.value;if(t instanceof CE.default.type.Term)switch(t.indicator){case"throw/1":return Zs(t.args[0]);case"error/1":return Zs(t.args[0]);case"error/2":if(t.args[0]instanceof CE.default.type.Term&&t.args[0].indicator==="syntax_error/1")return Object.assign(Zs(t.args[0]),...Zs(t.args[1]));{let e=Zs(t.args[0]);return e.message+=` (in ${Zs(t.args[1])})`,e}case"syntax_error/1":return new Vt(43,`Syntax error: ${Zs(t.args[0])}`);case"existence_error/2":return new Vt(44,`Existence error: ${Zs(t.args[0])} ${Zs(t.args[1])} not found`);case"instantiation_error/0":return new Vt(75,"Instantiation error: an argument is variable when an instantiated argument was expected");case"line/1":return{line:Zs(t.args[0])};case"column/1":return{column:Zs(t.args[0])};case"found/1":return{found:Zs(t.args[0])};case"./2":return[Zs(t.args[0])].concat(Zs(t.args[1]));case"//2":return`${Zs(t.args[0])}/${Zs(t.args[1])}`;default:return t.id}throw`couldn't pretty print because of unsupported node ${t}`}function Fme(t){let e;try{e=Zs(t)}catch(r){throw typeof r=="string"?new Vt(42,`Unknown error: ${t} (note: ${r})`):r}return typeof e.line<"u"&&typeof e.column<"u"&&(e.message+=` at line ${e.line}, column ${e.column}`),e}function rm(t){return t.id==="null"?null:`${t.toJavaScript()}`}function fgt(t){if(t.id==="null")return null;{let e=t.toJavaScript();if(typeof e!="string")return JSON.stringify(e);try{return JSON.stringify(JSON.parse(e))}catch{return JSON.stringify(e)}}}function lh(t){return typeof t=="string"?`'${t}'`:"[]"}var Rme,CE,Tme,kme,CH,f2,h2=dt(()=>{Ke();Ke();bt();Rme=tt(ume()),CE=tt(dH());c2();Qme();(0,Rme.default)(CE.default);Tme=(o=>(o.Dependencies="dependencies",o.DevDependencies="devDependencies",o.PeerDependencies="peerDependencies",o))(Tme||{}),kme=["dependencies","devDependencies","peerDependencies"];CH=class{constructor(e,r){let o=1e3*e.workspaces.length;this.session=CE.default.create(o),bme(this.session,e),this.session.consult(":- use_module(library(lists))."),this.session.consult(r)}fetchNextAnswer(){return new Promise(e=>{this.session.answer(r=>{e(r)})})}async*makeQuery(e){let r=this.session.query(e);if(r!==!0)throw Fme(r);for(;;){let o=await this.fetchNextAnswer();if(o===null)throw new Vt(79,"Resolution limit exceeded");if(!o)break;if(o.id==="throw")throw Fme(o);yield o}}};f2=class{constructor(e){this.source="";this.project=e;let r=e.configuration.get("constraintsPath");ae.existsSync(r)&&(this.source=ae.readFileSync(r,"utf8"))}static async find(e){return new f2(e)}getProjectDatabase(){let e="";for(let r of kme)e+=`dependency_type(${r}). +`;for(let r of this.project.workspacesByCwd.values()){let o=r.relativeCwd;e+=`workspace(${lh(o)}). +`,e+=`workspace_ident(${lh(o)}, ${lh(Y.stringifyIdent(r.locator))}). +`,e+=`workspace_version(${lh(o)}, ${lh(r.manifest.version)}). +`;for(let a of kme)for(let n of r.manifest[a].values())e+=`workspace_has_dependency(${lh(o)}, ${lh(Y.stringifyIdent(n))}, ${lh(n.range)}, ${a}). +`}return e+=`workspace(_) :- false. +`,e+=`workspace_ident(_, _) :- false. +`,e+=`workspace_version(_, _) :- false. +`,e+=`workspace_has_dependency(_, _, _, _) :- false. +`,e}getDeclarations(){let e="";return e+=`gen_enforced_dependency(_, _, _, _) :- false. +`,e+=`gen_enforced_field(_, _, _) :- false. +`,e}get fullSource(){return`${this.getProjectDatabase()} +${this.source} +${this.getDeclarations()}`}createSession(){return new CH(this.project,this.fullSource)}async processClassic(){let e=this.createSession();return{enforcedDependencies:await this.genEnforcedDependencies(e),enforcedFields:await this.genEnforcedFields(e)}}async process(){let{enforcedDependencies:e,enforcedFields:r}=await this.processClassic(),o=new Map;for(let{workspace:a,dependencyIdent:n,dependencyRange:u,dependencyType:A}of e){let p=l2([A,Y.stringifyIdent(n)]),h=Ye.getMapWithDefault(o,a.cwd);Ye.getMapWithDefault(h,p).set(u??void 0,new Set)}for(let{workspace:a,fieldPath:n,fieldValue:u}of r){let A=l2(n),p=Ye.getMapWithDefault(o,a.cwd);Ye.getMapWithDefault(p,A).set(JSON.parse(u)??void 0,new Set)}return{manifestUpdates:o,reportedErrors:new Map}}async genEnforcedDependencies(e){let r=[];for await(let o of e.makeQuery("workspace(WorkspaceCwd), dependency_type(DependencyType), gen_enforced_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, DependencyType).")){let a=z.resolve(this.project.cwd,rm(o.links.WorkspaceCwd)),n=rm(o.links.DependencyIdent),u=rm(o.links.DependencyRange),A=rm(o.links.DependencyType);if(a===null||n===null)throw new Error("Invalid rule");let p=this.project.getWorkspaceByCwd(a),h=Y.parseIdent(n);r.push({workspace:p,dependencyIdent:h,dependencyRange:u,dependencyType:A})}return Ye.sortMap(r,[({dependencyRange:o})=>o!==null?"0":"1",({workspace:o})=>Y.stringifyIdent(o.locator),({dependencyIdent:o})=>Y.stringifyIdent(o)])}async genEnforcedFields(e){let r=[];for await(let o of e.makeQuery("workspace(WorkspaceCwd), gen_enforced_field(WorkspaceCwd, FieldPath, FieldValue).")){let a=z.resolve(this.project.cwd,rm(o.links.WorkspaceCwd)),n=rm(o.links.FieldPath),u=fgt(o.links.FieldValue);if(a===null||n===null)throw new Error("Invalid rule");let A=this.project.getWorkspaceByCwd(a);r.push({workspace:A,fieldPath:n,fieldValue:u})}return Ye.sortMap(r,[({workspace:o})=>Y.stringifyIdent(o.locator),({fieldPath:o})=>o])}async*query(e){let r=this.createSession();for await(let o of r.makeQuery(e)){let a={};for(let[n,u]of Object.entries(o.links))n!=="_"&&(a[n]=rm(u));yield a}}}});var qme=U(hQ=>{"use strict";Object.defineProperty(hQ,"__esModule",{value:!0});function Q2(t){let e=[...t.caches],r=e.shift();return r===void 0?Hme():{get(o,a,n={miss:()=>Promise.resolve()}){return r.get(o,a,n).catch(()=>Q2({caches:e}).get(o,a,n))},set(o,a){return r.set(o,a).catch(()=>Q2({caches:e}).set(o,a))},delete(o){return r.delete(o).catch(()=>Q2({caches:e}).delete(o))},clear(){return r.clear().catch(()=>Q2({caches:e}).clear())}}}function Hme(){return{get(t,e,r={miss:()=>Promise.resolve()}){return e().then(a=>Promise.all([a,r.miss(a)])).then(([a])=>a)},set(t,e){return Promise.resolve(e)},delete(t){return Promise.resolve()},clear(){return Promise.resolve()}}}hQ.createFallbackableCache=Q2;hQ.createNullCache=Hme});var Gme=U((RWt,jme)=>{jme.exports=qme()});var Wme=U(RH=>{"use strict";Object.defineProperty(RH,"__esModule",{value:!0});function kgt(t={serializable:!0}){let e={};return{get(r,o,a={miss:()=>Promise.resolve()}){let n=JSON.stringify(r);if(n in e)return Promise.resolve(t.serializable?JSON.parse(e[n]):e[n]);let u=o(),A=a&&a.miss||(()=>Promise.resolve());return u.then(p=>A(p)).then(()=>u)},set(r,o){return e[JSON.stringify(r)]=t.serializable?JSON.stringify(o):o,Promise.resolve(o)},delete(r){return delete e[JSON.stringify(r)],Promise.resolve()},clear(){return e={},Promise.resolve()}}}RH.createInMemoryCache=kgt});var Kme=U((NWt,Yme)=>{Yme.exports=Wme()});var Jme=U(ru=>{"use strict";Object.defineProperty(ru,"__esModule",{value:!0});function Fgt(t,e,r){let o={"x-algolia-api-key":r,"x-algolia-application-id":e};return{headers(){return t===TH.WithinHeaders?o:{}},queryParameters(){return t===TH.WithinQueryParameters?o:{}}}}function Rgt(t){let e=0,r=()=>(e++,new Promise(o=>{setTimeout(()=>{o(t(r))},Math.min(100*e,1e3))}));return t(r)}function Vme(t,e=(r,o)=>Promise.resolve()){return Object.assign(t,{wait(r){return Vme(t.then(o=>Promise.all([e(o,r),o])).then(o=>o[1]))}})}function Tgt(t){let e=t.length-1;for(e;e>0;e--){let r=Math.floor(Math.random()*(e+1)),o=t[e];t[e]=t[r],t[r]=o}return t}function Ngt(t,e){return e&&Object.keys(e).forEach(r=>{t[r]=e[r](t)}),t}function Lgt(t,...e){let r=0;return t.replace(/%s/g,()=>encodeURIComponent(e[r++]))}var Ogt="4.14.2",Mgt=t=>()=>t.transporter.requester.destroy(),TH={WithinQueryParameters:0,WithinHeaders:1};ru.AuthMode=TH;ru.addMethods=Ngt;ru.createAuth=Fgt;ru.createRetryablePromise=Rgt;ru.createWaitablePromise=Vme;ru.destroy=Mgt;ru.encode=Lgt;ru.shuffle=Tgt;ru.version=Ogt});var k2=U((OWt,zme)=>{zme.exports=Jme()});var Xme=U(NH=>{"use strict";Object.defineProperty(NH,"__esModule",{value:!0});var Ugt={Delete:"DELETE",Get:"GET",Post:"POST",Put:"PUT"};NH.MethodEnum=Ugt});var F2=U((UWt,Zme)=>{Zme.exports=Xme()});var pye=U(bi=>{"use strict";Object.defineProperty(bi,"__esModule",{value:!0});var eye=F2();function LH(t,e){let r=t||{},o=r.data||{};return Object.keys(r).forEach(a=>{["timeout","headers","queryParameters","data","cacheable"].indexOf(a)===-1&&(o[a]=r[a])}),{data:Object.entries(o).length>0?o:void 0,timeout:r.timeout||e,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var R2={Read:1,Write:2,Any:3},BE={Up:1,Down:2,Timeouted:3},tye=2*60*1e3;function MH(t,e=BE.Up){return{...t,status:e,lastUpdate:Date.now()}}function rye(t){return t.status===BE.Up||Date.now()-t.lastUpdate>tye}function nye(t){return t.status===BE.Timeouted&&Date.now()-t.lastUpdate<=tye}function UH(t){return typeof t=="string"?{protocol:"https",url:t,accept:R2.Any}:{protocol:t.protocol||"https",url:t.url,accept:t.accept||R2.Any}}function _gt(t,e){return Promise.all(e.map(r=>t.get(r,()=>Promise.resolve(MH(r))))).then(r=>{let o=r.filter(A=>rye(A)),a=r.filter(A=>nye(A)),n=[...o,...a],u=n.length>0?n.map(A=>UH(A)):e;return{getTimeout(A,p){return(a.length===0&&A===0?1:a.length+3+A)*p},statelessHosts:u}})}var Hgt=({isTimedOut:t,status:e})=>!t&&~~e===0,qgt=t=>{let e=t.status;return t.isTimedOut||Hgt(t)||~~(e/100)!==2&&~~(e/100)!==4},jgt=({status:t})=>~~(t/100)===2,Ggt=(t,e)=>qgt(t)?e.onRetry(t):jgt(t)?e.onSuccess(t):e.onFail(t);function $me(t,e,r,o){let a=[],n=lye(r,o),u=cye(t,o),A=r.method,p=r.method!==eye.MethodEnum.Get?{}:{...r.data,...o.data},h={"x-algolia-agent":t.userAgent.value,...t.queryParameters,...p,...o.queryParameters},E=0,w=(v,b)=>{let C=v.pop();if(C===void 0)throw fye(OH(a));let R={data:n,headers:u,method:A,url:oye(C,r.path,h),connectTimeout:b(E,t.timeouts.connect),responseTimeout:b(E,o.timeout)},L=V=>{let re={request:R,response:V,host:C,triesLeft:v.length};return a.push(re),re},_={onSuccess:V=>iye(V),onRetry(V){let re=L(V);return V.isTimedOut&&E++,Promise.all([t.logger.info("Retryable failure",_H(re)),t.hostsCache.set(C,MH(C,V.isTimedOut?BE.Timeouted:BE.Down))]).then(()=>w(v,b))},onFail(V){throw L(V),sye(V,OH(a))}};return t.requester.send(R).then(V=>Ggt(V,_))};return _gt(t.hostsCache,e).then(v=>w([...v.statelessHosts].reverse(),v.getTimeout))}function Wgt(t){let{hostsCache:e,logger:r,requester:o,requestsCache:a,responsesCache:n,timeouts:u,userAgent:A,hosts:p,queryParameters:h,headers:E}=t,w={hostsCache:e,logger:r,requester:o,requestsCache:a,responsesCache:n,timeouts:u,userAgent:A,headers:E,queryParameters:h,hosts:p.map(v=>UH(v)),read(v,b){let C=LH(b,w.timeouts.read),R=()=>$me(w,w.hosts.filter(V=>(V.accept&R2.Read)!==0),v,C);if((C.cacheable!==void 0?C.cacheable:v.cacheable)!==!0)return R();let _={request:v,mappedRequestOptions:C,transporter:{queryParameters:w.queryParameters,headers:w.headers}};return w.responsesCache.get(_,()=>w.requestsCache.get(_,()=>w.requestsCache.set(_,R()).then(V=>Promise.all([w.requestsCache.delete(_),V]),V=>Promise.all([w.requestsCache.delete(_),Promise.reject(V)])).then(([V,re])=>re)),{miss:V=>w.responsesCache.set(_,V)})},write(v,b){return $me(w,w.hosts.filter(C=>(C.accept&R2.Write)!==0),v,LH(b,w.timeouts.write))}};return w}function Ygt(t){let e={value:`Algolia for JavaScript (${t})`,add(r){let o=`; ${r.segment}${r.version!==void 0?` (${r.version})`:""}`;return e.value.indexOf(o)===-1&&(e.value=`${e.value}${o}`),e}};return e}function iye(t){try{return JSON.parse(t.content)}catch(e){throw Aye(e.message,t)}}function sye({content:t,status:e},r){let o=t;try{o=JSON.parse(t).message}catch{}return uye(o,e,r)}function Kgt(t,...e){let r=0;return t.replace(/%s/g,()=>encodeURIComponent(e[r++]))}function oye(t,e,r){let o=aye(r),a=`${t.protocol}://${t.url}/${e.charAt(0)==="/"?e.substr(1):e}`;return o.length&&(a+=`?${o}`),a}function aye(t){let e=r=>Object.prototype.toString.call(r)==="[object Object]"||Object.prototype.toString.call(r)==="[object Array]";return Object.keys(t).map(r=>Kgt("%s=%s",r,e(t[r])?JSON.stringify(t[r]):t[r])).join("&")}function lye(t,e){if(t.method===eye.MethodEnum.Get||t.data===void 0&&e.data===void 0)return;let r=Array.isArray(t.data)?t.data:{...t.data,...e.data};return JSON.stringify(r)}function cye(t,e){let r={...t.headers,...e.headers},o={};return Object.keys(r).forEach(a=>{let n=r[a];o[a.toLowerCase()]=n}),o}function OH(t){return t.map(e=>_H(e))}function _H(t){let e=t.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...t,request:{...t.request,headers:{...t.request.headers,...e}}}}function uye(t,e,r){return{name:"ApiError",message:t,status:e,transporterStackTrace:r}}function Aye(t,e){return{name:"DeserializationError",message:t,response:e}}function fye(t){return{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:t}}bi.CallEnum=R2;bi.HostStatusEnum=BE;bi.createApiError=uye;bi.createDeserializationError=Aye;bi.createMappedRequestOptions=LH;bi.createRetryError=fye;bi.createStatefulHost=MH;bi.createStatelessHost=UH;bi.createTransporter=Wgt;bi.createUserAgent=Ygt;bi.deserializeFailure=sye;bi.deserializeSuccess=iye;bi.isStatefulHostTimeouted=nye;bi.isStatefulHostUp=rye;bi.serializeData=lye;bi.serializeHeaders=cye;bi.serializeQueryParameters=aye;bi.serializeUrl=oye;bi.stackFrameWithoutCredentials=_H;bi.stackTraceWithoutCredentials=OH});var T2=U((HWt,hye)=>{hye.exports=pye()});var gye=U(hh=>{"use strict";Object.defineProperty(hh,"__esModule",{value:!0});var vE=k2(),Vgt=T2(),N2=F2(),Jgt=t=>{let e=t.region||"us",r=vE.createAuth(vE.AuthMode.WithinHeaders,t.appId,t.apiKey),o=Vgt.createTransporter({hosts:[{url:`analytics.${e}.algolia.com`}],...t,headers:{...r.headers(),"content-type":"application/json",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}}),a=t.appId;return vE.addMethods({appId:a,transporter:o},t.methods)},zgt=t=>(e,r)=>t.transporter.write({method:N2.MethodEnum.Post,path:"2/abtests",data:e},r),Xgt=t=>(e,r)=>t.transporter.write({method:N2.MethodEnum.Delete,path:vE.encode("2/abtests/%s",e)},r),Zgt=t=>(e,r)=>t.transporter.read({method:N2.MethodEnum.Get,path:vE.encode("2/abtests/%s",e)},r),$gt=t=>e=>t.transporter.read({method:N2.MethodEnum.Get,path:"2/abtests"},e),edt=t=>(e,r)=>t.transporter.write({method:N2.MethodEnum.Post,path:vE.encode("2/abtests/%s/stop",e)},r);hh.addABTest=zgt;hh.createAnalyticsClient=Jgt;hh.deleteABTest=Xgt;hh.getABTest=Zgt;hh.getABTests=$gt;hh.stopABTest=edt});var mye=U((jWt,dye)=>{dye.exports=gye()});var Cye=U(L2=>{"use strict";Object.defineProperty(L2,"__esModule",{value:!0});var HH=k2(),tdt=T2(),yye=F2(),rdt=t=>{let e=t.region||"us",r=HH.createAuth(HH.AuthMode.WithinHeaders,t.appId,t.apiKey),o=tdt.createTransporter({hosts:[{url:`personalization.${e}.algolia.com`}],...t,headers:{...r.headers(),"content-type":"application/json",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}});return HH.addMethods({appId:t.appId,transporter:o},t.methods)},ndt=t=>e=>t.transporter.read({method:yye.MethodEnum.Get,path:"1/strategies/personalization"},e),idt=t=>(e,r)=>t.transporter.write({method:yye.MethodEnum.Post,path:"1/strategies/personalization",data:e},r);L2.createPersonalizationClient=rdt;L2.getPersonalizationStrategy=ndt;L2.setPersonalizationStrategy=idt});var Iye=U((WWt,Eye)=>{Eye.exports=Cye()});var Nye=U(Ft=>{"use strict";Object.defineProperty(Ft,"__esModule",{value:!0});var Ht=k2(),Na=T2(),mr=F2(),sdt=Ie("crypto");function gQ(t){let e=r=>t.request(r).then(o=>{if(t.batch!==void 0&&t.batch(o.hits),!t.shouldStop(o))return o.cursor?e({cursor:o.cursor}):e({page:(r.page||0)+1})});return e({})}var odt=t=>{let e=t.appId,r=Ht.createAuth(t.authMode!==void 0?t.authMode:Ht.AuthMode.WithinHeaders,e,t.apiKey),o=Na.createTransporter({hosts:[{url:`${e}-dsn.algolia.net`,accept:Na.CallEnum.Read},{url:`${e}.algolia.net`,accept:Na.CallEnum.Write}].concat(Ht.shuffle([{url:`${e}-1.algolianet.com`},{url:`${e}-2.algolianet.com`},{url:`${e}-3.algolianet.com`}])),...t,headers:{...r.headers(),"content-type":"application/x-www-form-urlencoded",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}}),a={transporter:o,appId:e,addAlgoliaAgent(n,u){o.userAgent.add({segment:n,version:u})},clearCache(){return Promise.all([o.requestsCache.clear(),o.responsesCache.clear()]).then(()=>{})}};return Ht.addMethods(a,t.methods)};function wye(){return{name:"MissingObjectIDError",message:"All objects must have an unique objectID (like a primary key) to be valid. Algolia is also able to generate objectIDs automatically but *it's not recommended*. To do it, use the `{'autoGenerateObjectIDIfNotExist': true}` option."}}function Bye(){return{name:"ObjectNotFoundError",message:"Object not found."}}function vye(){return{name:"ValidUntilNotFoundError",message:"ValidUntil not found in given secured api key."}}var adt=t=>(e,r)=>{let{queryParameters:o,...a}=r||{},n={acl:e,...o!==void 0?{queryParameters:o}:{}},u=(A,p)=>Ht.createRetryablePromise(h=>O2(t)(A.key,p).catch(E=>{if(E.status!==404)throw E;return h()}));return Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Post,path:"1/keys",data:n},a),u)},ldt=t=>(e,r,o)=>{let a=Na.createMappedRequestOptions(o);return a.queryParameters["X-Algolia-User-ID"]=e,t.transporter.write({method:mr.MethodEnum.Post,path:"1/clusters/mapping",data:{cluster:r}},a)},cdt=t=>(e,r,o)=>t.transporter.write({method:mr.MethodEnum.Post,path:"1/clusters/mapping/batch",data:{users:e,cluster:r}},o),udt=t=>(e,r)=>Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Post,path:Ht.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!0,requests:{action:"addEntry",body:[]}}},r),(o,a)=>DE(t)(o.taskID,a)),dQ=t=>(e,r,o)=>{let a=(n,u)=>M2(t)(e,{methods:{waitTask:zi}}).waitTask(n.taskID,u);return Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Post,path:Ht.encode("1/indexes/%s/operation",e),data:{operation:"copy",destination:r}},o),a)},Adt=t=>(e,r,o)=>dQ(t)(e,r,{...o,scope:[yQ.Rules]}),fdt=t=>(e,r,o)=>dQ(t)(e,r,{...o,scope:[yQ.Settings]}),pdt=t=>(e,r,o)=>dQ(t)(e,r,{...o,scope:[yQ.Synonyms]}),hdt=t=>(e,r)=>e.method===mr.MethodEnum.Get?t.transporter.read(e,r):t.transporter.write(e,r),gdt=t=>(e,r)=>{let o=(a,n)=>Ht.createRetryablePromise(u=>O2(t)(e,n).then(u).catch(A=>{if(A.status!==404)throw A}));return Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Delete,path:Ht.encode("1/keys/%s",e)},r),o)},ddt=t=>(e,r,o)=>{let a=r.map(n=>({action:"deleteEntry",body:{objectID:n}}));return Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Post,path:Ht.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!1,requests:a}},o),(n,u)=>DE(t)(n.taskID,u))},mdt=()=>(t,e)=>{let r=Na.serializeQueryParameters(e),o=sdt.createHmac("sha256",t).update(r).digest("hex");return Buffer.from(o+r).toString("base64")},O2=t=>(e,r)=>t.transporter.read({method:mr.MethodEnum.Get,path:Ht.encode("1/keys/%s",e)},r),Dye=t=>(e,r)=>t.transporter.read({method:mr.MethodEnum.Get,path:Ht.encode("1/task/%s",e.toString())},r),ydt=t=>e=>t.transporter.read({method:mr.MethodEnum.Get,path:"/1/dictionaries/*/settings"},e),Cdt=t=>e=>t.transporter.read({method:mr.MethodEnum.Get,path:"1/logs"},e),Edt=()=>t=>{let e=Buffer.from(t,"base64").toString("ascii"),r=/validUntil=(\d+)/,o=e.match(r);if(o===null)throw vye();return parseInt(o[1],10)-Math.round(new Date().getTime()/1e3)},Idt=t=>e=>t.transporter.read({method:mr.MethodEnum.Get,path:"1/clusters/mapping/top"},e),wdt=t=>(e,r)=>t.transporter.read({method:mr.MethodEnum.Get,path:Ht.encode("1/clusters/mapping/%s",e)},r),Bdt=t=>e=>{let{retrieveMappings:r,...o}=e||{};return r===!0&&(o.getClusters=!0),t.transporter.read({method:mr.MethodEnum.Get,path:"1/clusters/mapping/pending"},o)},M2=t=>(e,r={})=>{let o={transporter:t.transporter,appId:t.appId,indexName:e};return Ht.addMethods(o,r.methods)},vdt=t=>e=>t.transporter.read({method:mr.MethodEnum.Get,path:"1/keys"},e),Ddt=t=>e=>t.transporter.read({method:mr.MethodEnum.Get,path:"1/clusters"},e),Sdt=t=>e=>t.transporter.read({method:mr.MethodEnum.Get,path:"1/indexes"},e),Pdt=t=>e=>t.transporter.read({method:mr.MethodEnum.Get,path:"1/clusters/mapping"},e),xdt=t=>(e,r,o)=>{let a=(n,u)=>M2(t)(e,{methods:{waitTask:zi}}).waitTask(n.taskID,u);return Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Post,path:Ht.encode("1/indexes/%s/operation",e),data:{operation:"move",destination:r}},o),a)},bdt=t=>(e,r)=>{let o=(a,n)=>Promise.all(Object.keys(a.taskID).map(u=>M2(t)(u,{methods:{waitTask:zi}}).waitTask(a.taskID[u],n)));return Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Post,path:"1/indexes/*/batch",data:{requests:e}},r),o)},Qdt=t=>(e,r)=>t.transporter.read({method:mr.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:e}},r),kdt=t=>(e,r)=>{let o=e.map(a=>({...a,params:Na.serializeQueryParameters(a.params||{})}));return t.transporter.read({method:mr.MethodEnum.Post,path:"1/indexes/*/queries",data:{requests:o},cacheable:!0},r)},Fdt=t=>(e,r)=>Promise.all(e.map(o=>{let{facetName:a,facetQuery:n,...u}=o.params;return M2(t)(o.indexName,{methods:{searchForFacetValues:Fye}}).searchForFacetValues(a,n,{...r,...u})})),Rdt=t=>(e,r)=>{let o=Na.createMappedRequestOptions(r);return o.queryParameters["X-Algolia-User-ID"]=e,t.transporter.write({method:mr.MethodEnum.Delete,path:"1/clusters/mapping"},o)},Tdt=t=>(e,r,o)=>{let a=r.map(n=>({action:"addEntry",body:n}));return Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Post,path:Ht.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!0,requests:a}},o),(n,u)=>DE(t)(n.taskID,u))},Ndt=t=>(e,r)=>{let o=(a,n)=>Ht.createRetryablePromise(u=>O2(t)(e,n).catch(A=>{if(A.status!==404)throw A;return u()}));return Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Post,path:Ht.encode("1/keys/%s/restore",e)},r),o)},Ldt=t=>(e,r,o)=>{let a=r.map(n=>({action:"addEntry",body:n}));return Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Post,path:Ht.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!1,requests:a}},o),(n,u)=>DE(t)(n.taskID,u))},Odt=t=>(e,r,o)=>t.transporter.read({method:mr.MethodEnum.Post,path:Ht.encode("/1/dictionaries/%s/search",e),data:{query:r},cacheable:!0},o),Mdt=t=>(e,r)=>t.transporter.read({method:mr.MethodEnum.Post,path:"1/clusters/mapping/search",data:{query:e}},r),Udt=t=>(e,r)=>Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Put,path:"/1/dictionaries/*/settings",data:e},r),(o,a)=>DE(t)(o.taskID,a)),_dt=t=>(e,r)=>{let o=Object.assign({},r),{queryParameters:a,...n}=r||{},u=a?{queryParameters:a}:{},A=["acl","indexes","referers","restrictSources","queryParameters","description","maxQueriesPerIPPerHour","maxHitsPerQuery"],p=E=>Object.keys(o).filter(w=>A.indexOf(w)!==-1).every(w=>E[w]===o[w]),h=(E,w)=>Ht.createRetryablePromise(v=>O2(t)(e,w).then(b=>p(b)?Promise.resolve():v()));return Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Put,path:Ht.encode("1/keys/%s",e),data:u},n),h)},DE=t=>(e,r)=>Ht.createRetryablePromise(o=>Dye(t)(e,r).then(a=>a.status!=="published"?o():void 0)),Sye=t=>(e,r)=>{let o=(a,n)=>zi(t)(a.taskID,n);return Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Post,path:Ht.encode("1/indexes/%s/batch",t.indexName),data:{requests:e}},r),o)},Hdt=t=>e=>gQ({shouldStop:r=>r.cursor===void 0,...e,request:r=>t.transporter.read({method:mr.MethodEnum.Post,path:Ht.encode("1/indexes/%s/browse",t.indexName),data:r},e)}),qdt=t=>e=>{let r={hitsPerPage:1e3,...e};return gQ({shouldStop:o=>o.hits.length({...a,hits:a.hits.map(n=>(delete n._highlightResult,n))}))}})},jdt=t=>e=>{let r={hitsPerPage:1e3,...e};return gQ({shouldStop:o=>o.hits.length({...a,hits:a.hits.map(n=>(delete n._highlightResult,n))}))}})},mQ=t=>(e,r,o)=>{let{batchSize:a,...n}=o||{},u={taskIDs:[],objectIDs:[]},A=(p=0)=>{let h=[],E;for(E=p;E({action:r,body:w})),n).then(w=>(u.objectIDs=u.objectIDs.concat(w.objectIDs),u.taskIDs.push(w.taskID),E++,A(E)))};return Ht.createWaitablePromise(A(),(p,h)=>Promise.all(p.taskIDs.map(E=>zi(t)(E,h))))},Gdt=t=>e=>Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Post,path:Ht.encode("1/indexes/%s/clear",t.indexName)},e),(r,o)=>zi(t)(r.taskID,o)),Wdt=t=>e=>{let{forwardToReplicas:r,...o}=e||{},a=Na.createMappedRequestOptions(o);return r&&(a.queryParameters.forwardToReplicas=1),Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Post,path:Ht.encode("1/indexes/%s/rules/clear",t.indexName)},a),(n,u)=>zi(t)(n.taskID,u))},Ydt=t=>e=>{let{forwardToReplicas:r,...o}=e||{},a=Na.createMappedRequestOptions(o);return r&&(a.queryParameters.forwardToReplicas=1),Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Post,path:Ht.encode("1/indexes/%s/synonyms/clear",t.indexName)},a),(n,u)=>zi(t)(n.taskID,u))},Kdt=t=>(e,r)=>Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Post,path:Ht.encode("1/indexes/%s/deleteByQuery",t.indexName),data:e},r),(o,a)=>zi(t)(o.taskID,a)),Vdt=t=>e=>Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Delete,path:Ht.encode("1/indexes/%s",t.indexName)},e),(r,o)=>zi(t)(r.taskID,o)),Jdt=t=>(e,r)=>Ht.createWaitablePromise(Pye(t)([e],r).then(o=>({taskID:o.taskIDs[0]})),(o,a)=>zi(t)(o.taskID,a)),Pye=t=>(e,r)=>{let o=e.map(a=>({objectID:a}));return mQ(t)(o,sm.DeleteObject,r)},zdt=t=>(e,r)=>{let{forwardToReplicas:o,...a}=r||{},n=Na.createMappedRequestOptions(a);return o&&(n.queryParameters.forwardToReplicas=1),Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Delete,path:Ht.encode("1/indexes/%s/rules/%s",t.indexName,e)},n),(u,A)=>zi(t)(u.taskID,A))},Xdt=t=>(e,r)=>{let{forwardToReplicas:o,...a}=r||{},n=Na.createMappedRequestOptions(a);return o&&(n.queryParameters.forwardToReplicas=1),Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Delete,path:Ht.encode("1/indexes/%s/synonyms/%s",t.indexName,e)},n),(u,A)=>zi(t)(u.taskID,A))},Zdt=t=>e=>xye(t)(e).then(()=>!0).catch(r=>{if(r.status!==404)throw r;return!1}),$dt=t=>(e,r,o)=>t.transporter.read({method:mr.MethodEnum.Post,path:Ht.encode("1/answers/%s/prediction",t.indexName),data:{query:e,queryLanguages:r},cacheable:!0},o),emt=t=>(e,r)=>{let{query:o,paginate:a,...n}=r||{},u=0,A=()=>kye(t)(o||"",{...n,page:u}).then(p=>{for(let[h,E]of Object.entries(p.hits))if(e(E))return{object:E,position:parseInt(h,10),page:u};if(u++,a===!1||u>=p.nbPages)throw Bye();return A()});return A()},tmt=t=>(e,r)=>t.transporter.read({method:mr.MethodEnum.Get,path:Ht.encode("1/indexes/%s/%s",t.indexName,e)},r),rmt=()=>(t,e)=>{for(let[r,o]of Object.entries(t.hits))if(o.objectID===e)return parseInt(r,10);return-1},nmt=t=>(e,r)=>{let{attributesToRetrieve:o,...a}=r||{},n=e.map(u=>({indexName:t.indexName,objectID:u,...o?{attributesToRetrieve:o}:{}}));return t.transporter.read({method:mr.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:n}},a)},imt=t=>(e,r)=>t.transporter.read({method:mr.MethodEnum.Get,path:Ht.encode("1/indexes/%s/rules/%s",t.indexName,e)},r),xye=t=>e=>t.transporter.read({method:mr.MethodEnum.Get,path:Ht.encode("1/indexes/%s/settings",t.indexName),data:{getVersion:2}},e),smt=t=>(e,r)=>t.transporter.read({method:mr.MethodEnum.Get,path:Ht.encode("1/indexes/%s/synonyms/%s",t.indexName,e)},r),bye=t=>(e,r)=>t.transporter.read({method:mr.MethodEnum.Get,path:Ht.encode("1/indexes/%s/task/%s",t.indexName,e.toString())},r),omt=t=>(e,r)=>Ht.createWaitablePromise(Qye(t)([e],r).then(o=>({objectID:o.objectIDs[0],taskID:o.taskIDs[0]})),(o,a)=>zi(t)(o.taskID,a)),Qye=t=>(e,r)=>{let{createIfNotExists:o,...a}=r||{},n=o?sm.PartialUpdateObject:sm.PartialUpdateObjectNoCreate;return mQ(t)(e,n,a)},amt=t=>(e,r)=>{let{safe:o,autoGenerateObjectIDIfNotExist:a,batchSize:n,...u}=r||{},A=(C,R,L,_)=>Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Post,path:Ht.encode("1/indexes/%s/operation",C),data:{operation:L,destination:R}},_),(V,re)=>zi(t)(V.taskID,re)),p=Math.random().toString(36).substring(7),h=`${t.indexName}_tmp_${p}`,E=qH({appId:t.appId,transporter:t.transporter,indexName:h}),w=[],v=A(t.indexName,h,"copy",{...u,scope:["settings","synonyms","rules"]});w.push(v);let b=(o?v.wait(u):v).then(()=>{let C=E(e,{...u,autoGenerateObjectIDIfNotExist:a,batchSize:n});return w.push(C),o?C.wait(u):C}).then(()=>{let C=A(h,t.indexName,"move",u);return w.push(C),o?C.wait(u):C}).then(()=>Promise.all(w)).then(([C,R,L])=>({objectIDs:R.objectIDs,taskIDs:[C.taskID,...R.taskIDs,L.taskID]}));return Ht.createWaitablePromise(b,(C,R)=>Promise.all(w.map(L=>L.wait(R))))},lmt=t=>(e,r)=>jH(t)(e,{...r,clearExistingRules:!0}),cmt=t=>(e,r)=>GH(t)(e,{...r,clearExistingSynonyms:!0}),umt=t=>(e,r)=>Ht.createWaitablePromise(qH(t)([e],r).then(o=>({objectID:o.objectIDs[0],taskID:o.taskIDs[0]})),(o,a)=>zi(t)(o.taskID,a)),qH=t=>(e,r)=>{let{autoGenerateObjectIDIfNotExist:o,...a}=r||{},n=o?sm.AddObject:sm.UpdateObject;if(n===sm.UpdateObject){for(let u of e)if(u.objectID===void 0)return Ht.createWaitablePromise(Promise.reject(wye()))}return mQ(t)(e,n,a)},Amt=t=>(e,r)=>jH(t)([e],r),jH=t=>(e,r)=>{let{forwardToReplicas:o,clearExistingRules:a,...n}=r||{},u=Na.createMappedRequestOptions(n);return o&&(u.queryParameters.forwardToReplicas=1),a&&(u.queryParameters.clearExistingRules=1),Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Post,path:Ht.encode("1/indexes/%s/rules/batch",t.indexName),data:e},u),(A,p)=>zi(t)(A.taskID,p))},fmt=t=>(e,r)=>GH(t)([e],r),GH=t=>(e,r)=>{let{forwardToReplicas:o,clearExistingSynonyms:a,replaceExistingSynonyms:n,...u}=r||{},A=Na.createMappedRequestOptions(u);return o&&(A.queryParameters.forwardToReplicas=1),(n||a)&&(A.queryParameters.replaceExistingSynonyms=1),Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Post,path:Ht.encode("1/indexes/%s/synonyms/batch",t.indexName),data:e},A),(p,h)=>zi(t)(p.taskID,h))},kye=t=>(e,r)=>t.transporter.read({method:mr.MethodEnum.Post,path:Ht.encode("1/indexes/%s/query",t.indexName),data:{query:e},cacheable:!0},r),Fye=t=>(e,r,o)=>t.transporter.read({method:mr.MethodEnum.Post,path:Ht.encode("1/indexes/%s/facets/%s/query",t.indexName,e),data:{facetQuery:r},cacheable:!0},o),Rye=t=>(e,r)=>t.transporter.read({method:mr.MethodEnum.Post,path:Ht.encode("1/indexes/%s/rules/search",t.indexName),data:{query:e}},r),Tye=t=>(e,r)=>t.transporter.read({method:mr.MethodEnum.Post,path:Ht.encode("1/indexes/%s/synonyms/search",t.indexName),data:{query:e}},r),pmt=t=>(e,r)=>{let{forwardToReplicas:o,...a}=r||{},n=Na.createMappedRequestOptions(a);return o&&(n.queryParameters.forwardToReplicas=1),Ht.createWaitablePromise(t.transporter.write({method:mr.MethodEnum.Put,path:Ht.encode("1/indexes/%s/settings",t.indexName),data:e},n),(u,A)=>zi(t)(u.taskID,A))},zi=t=>(e,r)=>Ht.createRetryablePromise(o=>bye(t)(e,r).then(a=>a.status!=="published"?o():void 0)),hmt={AddObject:"addObject",Analytics:"analytics",Browser:"browse",DeleteIndex:"deleteIndex",DeleteObject:"deleteObject",EditSettings:"editSettings",ListIndexes:"listIndexes",Logs:"logs",Personalization:"personalization",Recommendation:"recommendation",Search:"search",SeeUnretrievableAttributes:"seeUnretrievableAttributes",Settings:"settings",Usage:"usage"},sm={AddObject:"addObject",UpdateObject:"updateObject",PartialUpdateObject:"partialUpdateObject",PartialUpdateObjectNoCreate:"partialUpdateObjectNoCreate",DeleteObject:"deleteObject",DeleteIndex:"delete",ClearIndex:"clear"},yQ={Settings:"settings",Synonyms:"synonyms",Rules:"rules"},gmt={None:"none",StopIfEnoughMatches:"stopIfEnoughMatches"},dmt={Synonym:"synonym",OneWaySynonym:"oneWaySynonym",AltCorrection1:"altCorrection1",AltCorrection2:"altCorrection2",Placeholder:"placeholder"};Ft.ApiKeyACLEnum=hmt;Ft.BatchActionEnum=sm;Ft.ScopeEnum=yQ;Ft.StrategyEnum=gmt;Ft.SynonymEnum=dmt;Ft.addApiKey=adt;Ft.assignUserID=ldt;Ft.assignUserIDs=cdt;Ft.batch=Sye;Ft.browseObjects=Hdt;Ft.browseRules=qdt;Ft.browseSynonyms=jdt;Ft.chunkedBatch=mQ;Ft.clearDictionaryEntries=udt;Ft.clearObjects=Gdt;Ft.clearRules=Wdt;Ft.clearSynonyms=Ydt;Ft.copyIndex=dQ;Ft.copyRules=Adt;Ft.copySettings=fdt;Ft.copySynonyms=pdt;Ft.createBrowsablePromise=gQ;Ft.createMissingObjectIDError=wye;Ft.createObjectNotFoundError=Bye;Ft.createSearchClient=odt;Ft.createValidUntilNotFoundError=vye;Ft.customRequest=hdt;Ft.deleteApiKey=gdt;Ft.deleteBy=Kdt;Ft.deleteDictionaryEntries=ddt;Ft.deleteIndex=Vdt;Ft.deleteObject=Jdt;Ft.deleteObjects=Pye;Ft.deleteRule=zdt;Ft.deleteSynonym=Xdt;Ft.exists=Zdt;Ft.findAnswers=$dt;Ft.findObject=emt;Ft.generateSecuredApiKey=mdt;Ft.getApiKey=O2;Ft.getAppTask=Dye;Ft.getDictionarySettings=ydt;Ft.getLogs=Cdt;Ft.getObject=tmt;Ft.getObjectPosition=rmt;Ft.getObjects=nmt;Ft.getRule=imt;Ft.getSecuredApiKeyRemainingValidity=Edt;Ft.getSettings=xye;Ft.getSynonym=smt;Ft.getTask=bye;Ft.getTopUserIDs=Idt;Ft.getUserID=wdt;Ft.hasPendingMappings=Bdt;Ft.initIndex=M2;Ft.listApiKeys=vdt;Ft.listClusters=Ddt;Ft.listIndices=Sdt;Ft.listUserIDs=Pdt;Ft.moveIndex=xdt;Ft.multipleBatch=bdt;Ft.multipleGetObjects=Qdt;Ft.multipleQueries=kdt;Ft.multipleSearchForFacetValues=Fdt;Ft.partialUpdateObject=omt;Ft.partialUpdateObjects=Qye;Ft.removeUserID=Rdt;Ft.replaceAllObjects=amt;Ft.replaceAllRules=lmt;Ft.replaceAllSynonyms=cmt;Ft.replaceDictionaryEntries=Tdt;Ft.restoreApiKey=Ndt;Ft.saveDictionaryEntries=Ldt;Ft.saveObject=umt;Ft.saveObjects=qH;Ft.saveRule=Amt;Ft.saveRules=jH;Ft.saveSynonym=fmt;Ft.saveSynonyms=GH;Ft.search=kye;Ft.searchDictionaryEntries=Odt;Ft.searchForFacetValues=Fye;Ft.searchRules=Rye;Ft.searchSynonyms=Tye;Ft.searchUserIDs=Mdt;Ft.setDictionarySettings=Udt;Ft.setSettings=pmt;Ft.updateApiKey=_dt;Ft.waitAppTask=DE;Ft.waitTask=zi});var Oye=U((KWt,Lye)=>{Lye.exports=Nye()});var Mye=U(CQ=>{"use strict";Object.defineProperty(CQ,"__esModule",{value:!0});function mmt(){return{debug(t,e){return Promise.resolve()},info(t,e){return Promise.resolve()},error(t,e){return Promise.resolve()}}}var ymt={Debug:1,Info:2,Error:3};CQ.LogLevelEnum=ymt;CQ.createNullLogger=mmt});var _ye=U((JWt,Uye)=>{Uye.exports=Mye()});var Gye=U(WH=>{"use strict";Object.defineProperty(WH,"__esModule",{value:!0});var Hye=Ie("http"),qye=Ie("https"),Cmt=Ie("url"),jye={keepAlive:!0},Emt=new Hye.Agent(jye),Imt=new qye.Agent(jye);function wmt({agent:t,httpAgent:e,httpsAgent:r,requesterOptions:o={}}={}){let a=e||t||Emt,n=r||t||Imt;return{send(u){return new Promise(A=>{let p=Cmt.parse(u.url),h=p.query===null?p.pathname:`${p.pathname}?${p.query}`,E={...o,agent:p.protocol==="https:"?n:a,hostname:p.hostname,path:h,method:u.method,headers:{...o&&o.headers?o.headers:{},...u.headers},...p.port!==void 0?{port:p.port||""}:{}},w=(p.protocol==="https:"?qye:Hye).request(E,R=>{let L=[];R.on("data",_=>{L=L.concat(_)}),R.on("end",()=>{clearTimeout(b),clearTimeout(C),A({status:R.statusCode||0,content:Buffer.concat(L).toString(),isTimedOut:!1})})}),v=(R,L)=>setTimeout(()=>{w.abort(),A({status:0,content:L,isTimedOut:!0})},R*1e3),b=v(u.connectTimeout,"Connection timeout"),C;w.on("error",R=>{clearTimeout(b),clearTimeout(C),A({status:0,content:R.message,isTimedOut:!1})}),w.once("response",()=>{clearTimeout(b),C=v(u.responseTimeout,"Socket timeout")}),u.data!==void 0&&w.write(u.data),w.end()})},destroy(){return a.destroy(),n.destroy(),Promise.resolve()}}}WH.createNodeHttpRequester=wmt});var Yye=U((XWt,Wye)=>{Wye.exports=Gye()});var zye=U((ZWt,Jye)=>{"use strict";var Kye=Gme(),Bmt=Kme(),SE=mye(),KH=k2(),YH=Iye(),Lt=Oye(),vmt=_ye(),Dmt=Yye(),Smt=T2();function Vye(t,e,r){let o={appId:t,apiKey:e,timeouts:{connect:2,read:5,write:30},requester:Dmt.createNodeHttpRequester(),logger:vmt.createNullLogger(),responsesCache:Kye.createNullCache(),requestsCache:Kye.createNullCache(),hostsCache:Bmt.createInMemoryCache(),userAgent:Smt.createUserAgent(KH.version).add({segment:"Node.js",version:process.versions.node})},a={...o,...r},n=()=>u=>YH.createPersonalizationClient({...o,...u,methods:{getPersonalizationStrategy:YH.getPersonalizationStrategy,setPersonalizationStrategy:YH.setPersonalizationStrategy}});return Lt.createSearchClient({...a,methods:{search:Lt.multipleQueries,searchForFacetValues:Lt.multipleSearchForFacetValues,multipleBatch:Lt.multipleBatch,multipleGetObjects:Lt.multipleGetObjects,multipleQueries:Lt.multipleQueries,copyIndex:Lt.copyIndex,copySettings:Lt.copySettings,copyRules:Lt.copyRules,copySynonyms:Lt.copySynonyms,moveIndex:Lt.moveIndex,listIndices:Lt.listIndices,getLogs:Lt.getLogs,listClusters:Lt.listClusters,multipleSearchForFacetValues:Lt.multipleSearchForFacetValues,getApiKey:Lt.getApiKey,addApiKey:Lt.addApiKey,listApiKeys:Lt.listApiKeys,updateApiKey:Lt.updateApiKey,deleteApiKey:Lt.deleteApiKey,restoreApiKey:Lt.restoreApiKey,assignUserID:Lt.assignUserID,assignUserIDs:Lt.assignUserIDs,getUserID:Lt.getUserID,searchUserIDs:Lt.searchUserIDs,listUserIDs:Lt.listUserIDs,getTopUserIDs:Lt.getTopUserIDs,removeUserID:Lt.removeUserID,hasPendingMappings:Lt.hasPendingMappings,generateSecuredApiKey:Lt.generateSecuredApiKey,getSecuredApiKeyRemainingValidity:Lt.getSecuredApiKeyRemainingValidity,destroy:KH.destroy,clearDictionaryEntries:Lt.clearDictionaryEntries,deleteDictionaryEntries:Lt.deleteDictionaryEntries,getDictionarySettings:Lt.getDictionarySettings,getAppTask:Lt.getAppTask,replaceDictionaryEntries:Lt.replaceDictionaryEntries,saveDictionaryEntries:Lt.saveDictionaryEntries,searchDictionaryEntries:Lt.searchDictionaryEntries,setDictionarySettings:Lt.setDictionarySettings,waitAppTask:Lt.waitAppTask,customRequest:Lt.customRequest,initIndex:u=>A=>Lt.initIndex(u)(A,{methods:{batch:Lt.batch,delete:Lt.deleteIndex,findAnswers:Lt.findAnswers,getObject:Lt.getObject,getObjects:Lt.getObjects,saveObject:Lt.saveObject,saveObjects:Lt.saveObjects,search:Lt.search,searchForFacetValues:Lt.searchForFacetValues,waitTask:Lt.waitTask,setSettings:Lt.setSettings,getSettings:Lt.getSettings,partialUpdateObject:Lt.partialUpdateObject,partialUpdateObjects:Lt.partialUpdateObjects,deleteObject:Lt.deleteObject,deleteObjects:Lt.deleteObjects,deleteBy:Lt.deleteBy,clearObjects:Lt.clearObjects,browseObjects:Lt.browseObjects,getObjectPosition:Lt.getObjectPosition,findObject:Lt.findObject,exists:Lt.exists,saveSynonym:Lt.saveSynonym,saveSynonyms:Lt.saveSynonyms,getSynonym:Lt.getSynonym,searchSynonyms:Lt.searchSynonyms,browseSynonyms:Lt.browseSynonyms,deleteSynonym:Lt.deleteSynonym,clearSynonyms:Lt.clearSynonyms,replaceAllObjects:Lt.replaceAllObjects,replaceAllSynonyms:Lt.replaceAllSynonyms,searchRules:Lt.searchRules,getRule:Lt.getRule,deleteRule:Lt.deleteRule,saveRule:Lt.saveRule,saveRules:Lt.saveRules,replaceAllRules:Lt.replaceAllRules,browseRules:Lt.browseRules,clearRules:Lt.clearRules}}),initAnalytics:()=>u=>SE.createAnalyticsClient({...o,...u,methods:{addABTest:SE.addABTest,getABTest:SE.getABTest,getABTests:SE.getABTests,stopABTest:SE.stopABTest,deleteABTest:SE.deleteABTest}}),initPersonalization:n,initRecommendation:()=>u=>(a.logger.info("The `initRecommendation` method is deprecated. Use `initPersonalization` instead."),n()(u))}})}Vye.version=KH.version;Jye.exports=Vye});var JH=U(($Wt,VH)=>{var Xye=zye();VH.exports=Xye;VH.exports.default=Xye});var ZH=U((tYt,eCe)=>{"use strict";var $ye=Object.getOwnPropertySymbols,xmt=Object.prototype.hasOwnProperty,bmt=Object.prototype.propertyIsEnumerable;function Qmt(t){if(t==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}function kmt(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de",Object.getOwnPropertyNames(t)[0]==="5")return!1;for(var e={},r=0;r<10;r++)e["_"+String.fromCharCode(r)]=r;var o=Object.getOwnPropertyNames(e).map(function(n){return e[n]});if(o.join("")!=="0123456789")return!1;var a={};return"abcdefghijklmnopqrst".split("").forEach(function(n){a[n]=n}),Object.keys(Object.assign({},a)).join("")==="abcdefghijklmnopqrst"}catch{return!1}}eCe.exports=kmt()?Object.assign:function(t,e){for(var r,o=Qmt(t),a,n=1;n{"use strict";var n6=ZH(),nu=typeof Symbol=="function"&&Symbol.for,U2=nu?Symbol.for("react.element"):60103,Fmt=nu?Symbol.for("react.portal"):60106,Rmt=nu?Symbol.for("react.fragment"):60107,Tmt=nu?Symbol.for("react.strict_mode"):60108,Nmt=nu?Symbol.for("react.profiler"):60114,Lmt=nu?Symbol.for("react.provider"):60109,Omt=nu?Symbol.for("react.context"):60110,Mmt=nu?Symbol.for("react.forward_ref"):60112,Umt=nu?Symbol.for("react.suspense"):60113,_mt=nu?Symbol.for("react.memo"):60115,Hmt=nu?Symbol.for("react.lazy"):60116,tCe=typeof Symbol=="function"&&Symbol.iterator;function _2(t){for(var e="https://reactjs.org/docs/error-decoder.html?invariant="+t,r=1;rEQ.length&&EQ.push(t)}function e6(t,e,r,o){var a=typeof t;(a==="undefined"||a==="boolean")&&(t=null);var n=!1;if(t===null)n=!0;else switch(a){case"string":case"number":n=!0;break;case"object":switch(t.$$typeof){case U2:case Fmt:n=!0}}if(n)return r(o,t,e===""?"."+$H(t,0):e),1;if(n=0,e=e===""?".":e+":",Array.isArray(t))for(var u=0;u{"use strict";pCe.exports=fCe()});var c6=U((iYt,l6)=>{"use strict";var on=l6.exports;l6.exports.default=on;var kn="\x1B[",H2="\x1B]",xE="\x07",IQ=";",hCe=process.env.TERM_PROGRAM==="Apple_Terminal";on.cursorTo=(t,e)=>{if(typeof t!="number")throw new TypeError("The `x` argument is required");return typeof e!="number"?kn+(t+1)+"G":kn+(e+1)+";"+(t+1)+"H"};on.cursorMove=(t,e)=>{if(typeof t!="number")throw new TypeError("The `x` argument is required");let r="";return t<0?r+=kn+-t+"D":t>0&&(r+=kn+t+"C"),e<0?r+=kn+-e+"A":e>0&&(r+=kn+e+"B"),r};on.cursorUp=(t=1)=>kn+t+"A";on.cursorDown=(t=1)=>kn+t+"B";on.cursorForward=(t=1)=>kn+t+"C";on.cursorBackward=(t=1)=>kn+t+"D";on.cursorLeft=kn+"G";on.cursorSavePosition=hCe?"\x1B7":kn+"s";on.cursorRestorePosition=hCe?"\x1B8":kn+"u";on.cursorGetPosition=kn+"6n";on.cursorNextLine=kn+"E";on.cursorPrevLine=kn+"F";on.cursorHide=kn+"?25l";on.cursorShow=kn+"?25h";on.eraseLines=t=>{let e="";for(let r=0;r[H2,"8",IQ,IQ,e,xE,t,H2,"8",IQ,IQ,xE].join("");on.image=(t,e={})=>{let r=`${H2}1337;File=inline=1`;return e.width&&(r+=`;width=${e.width}`),e.height&&(r+=`;height=${e.height}`),e.preserveAspectRatio===!1&&(r+=";preserveAspectRatio=0"),r+":"+t.toString("base64")+xE};on.iTerm={setCwd:(t=process.cwd())=>`${H2}50;CurrentDir=${t}${xE}`,annotation:(t,e={})=>{let r=`${H2}1337;`,o=typeof e.x<"u",a=typeof e.y<"u";if((o||a)&&!(o&&a&&typeof e.length<"u"))throw new Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");return t=t.replace(/\|/g,""),r+=e.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",e.length>0?r+=(o?[t,e.length,e.x,e.y]:[e.length,t]).join("|"):r+=t,r+xE}}});var dCe=U((sYt,u6)=>{"use strict";var gCe=(t,e)=>{for(let r of Reflect.ownKeys(e))Object.defineProperty(t,r,Object.getOwnPropertyDescriptor(e,r));return t};u6.exports=gCe;u6.exports.default=gCe});var yCe=U((oYt,BQ)=>{"use strict";var Kmt=dCe(),wQ=new WeakMap,mCe=(t,e={})=>{if(typeof t!="function")throw new TypeError("Expected a function");let r,o=0,a=t.displayName||t.name||"",n=function(...u){if(wQ.set(n,++o),o===1)r=t.apply(this,u),t=null;else if(e.throw===!0)throw new Error(`Function \`${a}\` can only be called once`);return r};return Kmt(n,t),wQ.set(n,o),n};BQ.exports=mCe;BQ.exports.default=mCe;BQ.exports.callCount=t=>{if(!wQ.has(t))throw new Error(`The given function \`${t.name}\` is not wrapped by the \`onetime\` package`);return wQ.get(t)}});var CCe=U((aYt,vQ)=>{vQ.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"];process.platform!=="win32"&&vQ.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT");process.platform==="linux"&&vQ.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")});var p6=U((lYt,kE)=>{var gi=global.process,om=function(t){return t&&typeof t=="object"&&typeof t.removeListener=="function"&&typeof t.emit=="function"&&typeof t.reallyExit=="function"&&typeof t.listeners=="function"&&typeof t.kill=="function"&&typeof t.pid=="number"&&typeof t.on=="function"};om(gi)?(ECe=Ie("assert"),bE=CCe(),ICe=/^win/i.test(gi.platform),q2=Ie("events"),typeof q2!="function"&&(q2=q2.EventEmitter),gi.__signal_exit_emitter__?xs=gi.__signal_exit_emitter__:(xs=gi.__signal_exit_emitter__=new q2,xs.count=0,xs.emitted={}),xs.infinite||(xs.setMaxListeners(1/0),xs.infinite=!0),kE.exports=function(t,e){if(!om(global.process))return function(){};ECe.equal(typeof t,"function","a callback must be provided for exit handler"),QE===!1&&A6();var r="exit";e&&e.alwaysLast&&(r="afterexit");var o=function(){xs.removeListener(r,t),xs.listeners("exit").length===0&&xs.listeners("afterexit").length===0&&DQ()};return xs.on(r,t),o},DQ=function(){!QE||!om(global.process)||(QE=!1,bE.forEach(function(e){try{gi.removeListener(e,SQ[e])}catch{}}),gi.emit=PQ,gi.reallyExit=f6,xs.count-=1)},kE.exports.unload=DQ,am=function(e,r,o){xs.emitted[e]||(xs.emitted[e]=!0,xs.emit(e,r,o))},SQ={},bE.forEach(function(t){SQ[t]=function(){if(!!om(global.process)){var r=gi.listeners(t);r.length===xs.count&&(DQ(),am("exit",null,t),am("afterexit",null,t),ICe&&t==="SIGHUP"&&(t="SIGINT"),gi.kill(gi.pid,t))}}}),kE.exports.signals=function(){return bE},QE=!1,A6=function(){QE||!om(global.process)||(QE=!0,xs.count+=1,bE=bE.filter(function(e){try{return gi.on(e,SQ[e]),!0}catch{return!1}}),gi.emit=BCe,gi.reallyExit=wCe)},kE.exports.load=A6,f6=gi.reallyExit,wCe=function(e){!om(global.process)||(gi.exitCode=e||0,am("exit",gi.exitCode,null),am("afterexit",gi.exitCode,null),f6.call(gi,gi.exitCode))},PQ=gi.emit,BCe=function(e,r){if(e==="exit"&&om(global.process)){r!==void 0&&(gi.exitCode=r);var o=PQ.apply(this,arguments);return am("exit",gi.exitCode,null),am("afterexit",gi.exitCode,null),o}else return PQ.apply(this,arguments)}):kE.exports=function(){return function(){}};var ECe,bE,ICe,q2,xs,DQ,am,SQ,QE,A6,f6,wCe,PQ,BCe});var DCe=U((cYt,vCe)=>{"use strict";var Vmt=yCe(),Jmt=p6();vCe.exports=Vmt(()=>{Jmt(()=>{process.stderr.write("\x1B[?25h")},{alwaysLast:!0})})});var h6=U(FE=>{"use strict";var zmt=DCe(),xQ=!1;FE.show=(t=process.stderr)=>{!t.isTTY||(xQ=!1,t.write("\x1B[?25h"))};FE.hide=(t=process.stderr)=>{!t.isTTY||(zmt(),xQ=!0,t.write("\x1B[?25l"))};FE.toggle=(t,e)=>{t!==void 0&&(xQ=t),xQ?FE.show(e):FE.hide(e)}});var bCe=U(j2=>{"use strict";var xCe=j2&&j2.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(j2,"__esModule",{value:!0});var SCe=xCe(c6()),PCe=xCe(h6()),Xmt=(t,{showCursor:e=!1}={})=>{let r=0,o="",a=!1,n=u=>{!e&&!a&&(PCe.default.hide(),a=!0);let A=u+` +`;A!==o&&(o=A,t.write(SCe.default.eraseLines(r)+A),r=A.split(` +`).length)};return n.clear=()=>{t.write(SCe.default.eraseLines(r)),o="",r=0},n.done=()=>{o="",r=0,e||(PCe.default.show(),a=!1)},n};j2.default={create:Xmt}});var QCe=U((fYt,Zmt)=>{Zmt.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY_BUILD_BASE",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}}]});var RCe=U(ml=>{"use strict";var FCe=QCe(),gA=process.env;Object.defineProperty(ml,"_vendors",{value:FCe.map(function(t){return t.constant})});ml.name=null;ml.isPR=null;FCe.forEach(function(t){var e=Array.isArray(t.env)?t.env:[t.env],r=e.every(function(o){return kCe(o)});if(ml[t.constant]=r,r)switch(ml.name=t.name,typeof t.pr){case"string":ml.isPR=!!gA[t.pr];break;case"object":"env"in t.pr?ml.isPR=t.pr.env in gA&&gA[t.pr.env]!==t.pr.ne:"any"in t.pr?ml.isPR=t.pr.any.some(function(o){return!!gA[o]}):ml.isPR=kCe(t.pr);break;default:ml.isPR=null}});ml.isCI=!!(gA.CI||gA.CONTINUOUS_INTEGRATION||gA.BUILD_NUMBER||gA.RUN_ID||ml.name);function kCe(t){return typeof t=="string"?!!gA[t]:Object.keys(t).every(function(e){return gA[e]===t[e]})}});var NCe=U((hYt,TCe)=>{"use strict";TCe.exports=RCe().isCI});var OCe=U((gYt,LCe)=>{"use strict";var $mt=t=>{let e=new Set;do for(let r of Reflect.ownKeys(t))e.add([t,r]);while((t=Reflect.getPrototypeOf(t))&&t!==Object.prototype);return e};LCe.exports=(t,{include:e,exclude:r}={})=>{let o=a=>{let n=u=>typeof u=="string"?a===u:u.test(a);return e?e.some(n):r?!r.some(n):!0};for(let[a,n]of $mt(t.constructor.prototype)){if(n==="constructor"||!o(n))continue;let u=Reflect.getOwnPropertyDescriptor(a,n);u&&typeof u.value=="function"&&(t[n]=t[n].bind(t))}return t}});var GCe=U(vn=>{"use strict";Object.defineProperty(vn,"__esModule",{value:!0});var TE,Y2,RQ,TQ,I6;typeof window>"u"||typeof MessageChannel!="function"?(RE=null,g6=null,d6=function(){if(RE!==null)try{var t=vn.unstable_now();RE(!0,t),RE=null}catch(e){throw setTimeout(d6,0),e}},MCe=Date.now(),vn.unstable_now=function(){return Date.now()-MCe},TE=function(t){RE!==null?setTimeout(TE,0,t):(RE=t,setTimeout(d6,0))},Y2=function(t,e){g6=setTimeout(t,e)},RQ=function(){clearTimeout(g6)},TQ=function(){return!1},I6=vn.unstable_forceFrameRate=function(){}):(bQ=window.performance,m6=window.Date,UCe=window.setTimeout,_Ce=window.clearTimeout,typeof console<"u"&&(HCe=window.cancelAnimationFrame,typeof window.requestAnimationFrame!="function"&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),typeof HCe!="function"&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills")),typeof bQ=="object"&&typeof bQ.now=="function"?vn.unstable_now=function(){return bQ.now()}:(qCe=m6.now(),vn.unstable_now=function(){return m6.now()-qCe}),G2=!1,W2=null,QQ=-1,y6=5,C6=0,TQ=function(){return vn.unstable_now()>=C6},I6=function(){},vn.unstable_forceFrameRate=function(t){0>t||125FQ(u,r))p!==void 0&&0>FQ(p,u)?(t[o]=p,t[A]=r,o=A):(t[o]=u,t[n]=r,o=n);else if(p!==void 0&&0>FQ(p,r))t[o]=p,t[A]=r,o=A;else break e}}return e}return null}function FQ(t,e){var r=t.sortIndex-e.sortIndex;return r!==0?r:t.id-e.id}var iu=[],gh=[],eyt=1,ea=null,Ro=3,LQ=!1,lm=!1,K2=!1;function OQ(t){for(var e=lc(gh);e!==null;){if(e.callback===null)NQ(gh);else if(e.startTime<=t)NQ(gh),e.sortIndex=e.expirationTime,w6(iu,e);else break;e=lc(gh)}}function B6(t){if(K2=!1,OQ(t),!lm)if(lc(iu)!==null)lm=!0,TE(v6);else{var e=lc(gh);e!==null&&Y2(B6,e.startTime-t)}}function v6(t,e){lm=!1,K2&&(K2=!1,RQ()),LQ=!0;var r=Ro;try{for(OQ(e),ea=lc(iu);ea!==null&&(!(ea.expirationTime>e)||t&&!TQ());){var o=ea.callback;if(o!==null){ea.callback=null,Ro=ea.priorityLevel;var a=o(ea.expirationTime<=e);e=vn.unstable_now(),typeof a=="function"?ea.callback=a:ea===lc(iu)&&NQ(iu),OQ(e)}else NQ(iu);ea=lc(iu)}if(ea!==null)var n=!0;else{var u=lc(gh);u!==null&&Y2(B6,u.startTime-e),n=!1}return n}finally{ea=null,Ro=r,LQ=!1}}function jCe(t){switch(t){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1e4;default:return 5e3}}var tyt=I6;vn.unstable_ImmediatePriority=1;vn.unstable_UserBlockingPriority=2;vn.unstable_NormalPriority=3;vn.unstable_IdlePriority=5;vn.unstable_LowPriority=4;vn.unstable_runWithPriority=function(t,e){switch(t){case 1:case 2:case 3:case 4:case 5:break;default:t=3}var r=Ro;Ro=t;try{return e()}finally{Ro=r}};vn.unstable_next=function(t){switch(Ro){case 1:case 2:case 3:var e=3;break;default:e=Ro}var r=Ro;Ro=e;try{return t()}finally{Ro=r}};vn.unstable_scheduleCallback=function(t,e,r){var o=vn.unstable_now();if(typeof r=="object"&&r!==null){var a=r.delay;a=typeof a=="number"&&0o?(t.sortIndex=a,w6(gh,t),lc(iu)===null&&t===lc(gh)&&(K2?RQ():K2=!0,Y2(B6,a-o))):(t.sortIndex=r,w6(iu,t),lm||LQ||(lm=!0,TE(v6))),t};vn.unstable_cancelCallback=function(t){t.callback=null};vn.unstable_wrapCallback=function(t){var e=Ro;return function(){var r=Ro;Ro=e;try{return t.apply(this,arguments)}finally{Ro=r}}};vn.unstable_getCurrentPriorityLevel=function(){return Ro};vn.unstable_shouldYield=function(){var t=vn.unstable_now();OQ(t);var e=lc(iu);return e!==ea&&ea!==null&&e!==null&&e.callback!==null&&e.startTime<=t&&e.expirationTime{"use strict";WCe.exports=GCe()});var YCe=U((yYt,V2)=>{V2.exports=function t(e){"use strict";var r=ZH(),o=en(),a=D6();function n(S){for(var D="https://reactjs.org/docs/error-decoder.html?invariant="+S,T=1;Tio||(S.current=El[io],El[io]=null,io--)}function Fn(S,D){io++,El[io]=S.current,S.current=D}var Fi={},Rn={current:Fi},Ui={current:!1},Zt=Fi;function Ri(S,D){var T=S.type.contextTypes;if(!T)return Fi;var q=S.stateNode;if(q&&q.__reactInternalMemoizedUnmaskedChildContext===D)return q.__reactInternalMemoizedMaskedChildContext;var W={},ce;for(ce in T)W[ce]=D[ce];return q&&(S=S.stateNode,S.__reactInternalMemoizedUnmaskedChildContext=D,S.__reactInternalMemoizedMaskedChildContext=W),W}function $n(S){return S=S.childContextTypes,S!=null}function Ma(S){Ue(Ui,S),Ue(Rn,S)}function $t(S){Ue(Ui,S),Ue(Rn,S)}function hc(S,D,T){if(Rn.current!==Fi)throw Error(n(168));Fn(Rn,D,S),Fn(Ui,T,S)}function du(S,D,T){var q=S.stateNode;if(S=D.childContextTypes,typeof q.getChildContext!="function")return T;q=q.getChildContext();for(var W in q)if(!(W in S))throw Error(n(108,ge(D)||"Unknown",W));return r({},T,{},q)}function gc(S){var D=S.stateNode;return D=D&&D.__reactInternalMemoizedMergedChildContext||Fi,Zt=Rn.current,Fn(Rn,D,S),Fn(Ui,Ui.current,S),!0}function Il(S,D,T){var q=S.stateNode;if(!q)throw Error(n(169));T?(D=du(S,D,Zt),q.__reactInternalMemoizedMergedChildContext=D,Ue(Ui,S),Ue(Rn,S),Fn(Rn,D,S)):Ue(Ui,S),Fn(Ui,T,S)}var PA=a.unstable_runWithPriority,mu=a.unstable_scheduleCallback,Ee=a.unstable_cancelCallback,Rt=a.unstable_shouldYield,dc=a.unstable_requestPaint,_i=a.unstable_now,yu=a.unstable_getCurrentPriorityLevel,qt=a.unstable_ImmediatePriority,wl=a.unstable_UserBlockingPriority,xA=a.unstable_NormalPriority,cp=a.unstable_LowPriority,mc=a.unstable_IdlePriority,bA={},Dn=dc!==void 0?dc:function(){},ui=null,yc=null,QA=!1,ra=_i(),Hi=1e4>ra?_i:function(){return _i()-ra};function Oo(){switch(yu()){case qt:return 99;case wl:return 98;case xA:return 97;case cp:return 96;case mc:return 95;default:throw Error(n(332))}}function $e(S){switch(S){case 99:return qt;case 98:return wl;case 97:return xA;case 96:return cp;case 95:return mc;default:throw Error(n(332))}}function so(S,D){return S=$e(S),PA(S,D)}function Bl(S,D,T){return S=$e(S),mu(S,D,T)}function Cu(S){return ui===null?(ui=[S],yc=mu(qt,Eu)):ui.push(S),bA}function qi(){if(yc!==null){var S=yc;yc=null,Ee(S)}Eu()}function Eu(){if(!QA&&ui!==null){QA=!0;var S=0;try{var D=ui;so(99,function(){for(;S=D&&(Uo=!0),S.firstContext=null)}function Ls(S,D){if(ia!==S&&D!==!1&&D!==0)if((typeof D!="number"||D===1073741823)&&(ia=S,D=1073741823),D={context:S,observedBits:D,next:null},Rs===null){if(oo===null)throw Error(n(308));Rs=D,oo.dependencies={expirationTime:0,firstContext:D,responders:null}}else Rs=Rs.next=D;return x?S._currentValue:S._currentValue2}var ao=!1;function Yn(S){return{baseState:S,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function qn(S){return{baseState:S.baseState,firstUpdate:S.firstUpdate,lastUpdate:S.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function $i(S,D){return{expirationTime:S,suspenseConfig:D,tag:0,payload:null,callback:null,next:null,nextEffect:null}}function es(S,D){S.lastUpdate===null?S.firstUpdate=S.lastUpdate=D:(S.lastUpdate.next=D,S.lastUpdate=D)}function mi(S,D){var T=S.alternate;if(T===null){var q=S.updateQueue,W=null;q===null&&(q=S.updateQueue=Yn(S.memoizedState))}else q=S.updateQueue,W=T.updateQueue,q===null?W===null?(q=S.updateQueue=Yn(S.memoizedState),W=T.updateQueue=Yn(T.memoizedState)):q=S.updateQueue=qn(W):W===null&&(W=T.updateQueue=qn(q));W===null||q===W?es(q,D):q.lastUpdate===null||W.lastUpdate===null?(es(q,D),es(W,D)):(es(q,D),W.lastUpdate=D)}function Ha(S,D){var T=S.updateQueue;T=T===null?S.updateQueue=Yn(S.memoizedState):oa(S,T),T.lastCapturedUpdate===null?T.firstCapturedUpdate=T.lastCapturedUpdate=D:(T.lastCapturedUpdate.next=D,T.lastCapturedUpdate=D)}function oa(S,D){var T=S.alternate;return T!==null&&D===T.updateQueue&&(D=S.updateQueue=qn(D)),D}function ee(S,D,T,q,W,ce){switch(T.tag){case 1:return S=T.payload,typeof S=="function"?S.call(ce,q,W):S;case 3:S.effectTag=S.effectTag&-4097|64;case 0:if(S=T.payload,W=typeof S=="function"?S.call(ce,q,W):S,W==null)break;return r({},q,W);case 2:ao=!0}return q}function we(S,D,T,q,W){ao=!1,D=oa(S,D);for(var ce=D.baseState,Se=null,It=0,Ct=D.firstUpdate,xt=ce;Ct!==null;){var Nr=Ct.expirationTime;Nrwn?(ni=Sr,Sr=null):ni=Sr.sibling;var Xr=fi(rt,Sr,ft[wn],jt);if(Xr===null){Sr===null&&(Sr=ni);break}S&&Sr&&Xr.alternate===null&&D(rt,Sr),Je=ce(Xr,Je,wn),In===null?Cr=Xr:In.sibling=Xr,In=Xr,Sr=ni}if(wn===ft.length)return T(rt,Sr),Cr;if(Sr===null){for(;wnwn?(ni=Sr,Sr=null):ni=Sr.sibling;var fo=fi(rt,Sr,Xr.value,jt);if(fo===null){Sr===null&&(Sr=ni);break}S&&Sr&&fo.alternate===null&&D(rt,Sr),Je=ce(fo,Je,wn),In===null?Cr=fo:In.sibling=fo,In=fo,Sr=ni}if(Xr.done)return T(rt,Sr),Cr;if(Sr===null){for(;!Xr.done;wn++,Xr=ft.next())Xr=is(rt,Xr.value,jt),Xr!==null&&(Je=ce(Xr,Je,wn),In===null?Cr=Xr:In.sibling=Xr,In=Xr);return Cr}for(Sr=q(rt,Sr);!Xr.done;wn++,Xr=ft.next())Xr=Ao(Sr,rt,wn,Xr.value,jt),Xr!==null&&(S&&Xr.alternate!==null&&Sr.delete(Xr.key===null?wn:Xr.key),Je=ce(Xr,Je,wn),In===null?Cr=Xr:In.sibling=Xr,In=Xr);return S&&Sr.forEach(function(mF){return D(rt,mF)}),Cr}return function(rt,Je,ft,jt){var Cr=typeof ft=="object"&&ft!==null&&ft.type===E&&ft.key===null;Cr&&(ft=ft.props.children);var In=typeof ft=="object"&&ft!==null;if(In)switch(ft.$$typeof){case p:e:{for(In=ft.key,Cr=Je;Cr!==null;){if(Cr.key===In)if(Cr.tag===7?ft.type===E:Cr.elementType===ft.type){T(rt,Cr.sibling),Je=W(Cr,ft.type===E?ft.props.children:ft.props,jt),Je.ref=Kn(rt,Cr,ft),Je.return=rt,rt=Je;break e}else{T(rt,Cr);break}else D(rt,Cr);Cr=Cr.sibling}ft.type===E?(Je=Fu(ft.props.children,rt.mode,jt,ft.key),Je.return=rt,rt=Je):(jt=Gm(ft.type,ft.key,ft.props,null,rt.mode,jt),jt.ref=Kn(rt,Je,ft),jt.return=rt,rt=jt)}return Se(rt);case h:e:{for(Cr=ft.key;Je!==null;){if(Je.key===Cr)if(Je.tag===4&&Je.stateNode.containerInfo===ft.containerInfo&&Je.stateNode.implementation===ft.implementation){T(rt,Je.sibling),Je=W(Je,ft.children||[],jt),Je.return=rt,rt=Je;break e}else{T(rt,Je);break}else D(rt,Je);Je=Je.sibling}Je=vI(ft,rt.mode,jt),Je.return=rt,rt=Je}return Se(rt)}if(typeof ft=="string"||typeof ft=="number")return ft=""+ft,Je!==null&&Je.tag===6?(T(rt,Je.sibling),Je=W(Je,ft,jt),Je.return=rt,rt=Je):(T(rt,Je),Je=BI(ft,rt.mode,jt),Je.return=rt,rt=Je),Se(rt);if(Ti(ft))return VA(rt,Je,ft,jt);if(he(ft))return Ho(rt,Je,ft,jt);if(In&&qa(rt,ft),typeof ft>"u"&&!Cr)switch(rt.tag){case 1:case 0:throw rt=rt.type,Error(n(152,rt.displayName||rt.name||"Component"))}return T(rt,Je)}}var yi=aa(!0),la=aa(!1),ja={},lo={current:ja},FA={current:ja},Ec={current:ja};function ca(S){if(S===ja)throw Error(n(174));return S}function rg(S,D){Fn(Ec,D,S),Fn(FA,S,S),Fn(lo,ja,S),D=ne(D),Ue(lo,S),Fn(lo,D,S)}function Ic(S){Ue(lo,S),Ue(FA,S),Ue(Ec,S)}function bm(S){var D=ca(Ec.current),T=ca(lo.current);D=Z(T,S.type,D),T!==D&&(Fn(FA,S,S),Fn(lo,D,S))}function ng(S){FA.current===S&&(Ue(lo,S),Ue(FA,S))}var Vn={current:0};function up(S){for(var D=S;D!==null;){if(D.tag===13){var T=D.memoizedState;if(T!==null&&(T=T.dehydrated,T===null||Qs(T)||ro(T)))return D}else if(D.tag===19&&D.memoizedProps.revealOrder!==void 0){if((D.effectTag&64)!==0)return D}else if(D.child!==null){D.child.return=D,D=D.child;continue}if(D===S)break;for(;D.sibling===null;){if(D.return===null||D.return===S)return null;D=D.return}D.sibling.return=D.return,D=D.sibling}return null}function ig(S,D){return{responder:S,props:D}}var RA=u.ReactCurrentDispatcher,Os=u.ReactCurrentBatchConfig,Iu=0,Ga=null,ji=null,ua=null,wu=null,ms=null,wc=null,Bc=0,G=null,Dt=0,vl=!1,Si=null,vc=0;function lt(){throw Error(n(321))}function Bu(S,D){if(D===null)return!1;for(var T=0;TBc&&(Bc=Nr,jm(Bc))):(yI(Nr,Ct.suspenseConfig),ce=Ct.eagerReducer===S?Ct.eagerState:S(ce,Ct.action)),Se=Ct,Ct=Ct.next}while(Ct!==null&&Ct!==q);xt||(It=Se,W=ce),ds(ce,D.memoizedState)||(Uo=!0),D.memoizedState=ce,D.baseUpdate=It,D.baseState=W,T.lastRenderedState=ce}return[D.memoizedState,T.dispatch]}function og(S){var D=TA();return typeof S=="function"&&(S=S()),D.memoizedState=D.baseState=S,S=D.queue={last:null,dispatch:null,lastRenderedReducer:yr,lastRenderedState:S},S=S.dispatch=Ag.bind(null,Ga,S),[D.memoizedState,S]}function ag(S){return ys(yr,S)}function lg(S,D,T,q){return S={tag:S,create:D,destroy:T,deps:q,next:null},G===null?(G={lastEffect:null},G.lastEffect=S.next=S):(D=G.lastEffect,D===null?G.lastEffect=S.next=S:(T=D.next,D.next=S,S.next=T,G.lastEffect=S)),S}function fp(S,D,T,q){var W=TA();Dt|=S,W.memoizedState=lg(D,T,void 0,q===void 0?null:q)}function Dc(S,D,T,q){var W=Ap();q=q===void 0?null:q;var ce=void 0;if(ji!==null){var Se=ji.memoizedState;if(ce=Se.destroy,q!==null&&Bu(q,Se.deps)){lg(0,T,ce,q);return}}Dt|=S,W.memoizedState=lg(D,T,ce,q)}function mt(S,D){return fp(516,192,S,D)}function Qm(S,D){return Dc(516,192,S,D)}function cg(S,D){if(typeof D=="function")return S=S(),D(S),function(){D(null)};if(D!=null)return S=S(),D.current=S,function(){D.current=null}}function ug(){}function vu(S,D){return TA().memoizedState=[S,D===void 0?null:D],S}function km(S,D){var T=Ap();D=D===void 0?null:D;var q=T.memoizedState;return q!==null&&D!==null&&Bu(D,q[1])?q[0]:(T.memoizedState=[S,D],S)}function Ag(S,D,T){if(!(25>vc))throw Error(n(301));var q=S.alternate;if(S===Ga||q!==null&&q===Ga)if(vl=!0,S={expirationTime:Iu,suspenseConfig:null,action:T,eagerReducer:null,eagerState:null,next:null},Si===null&&(Si=new Map),T=Si.get(D),T===void 0)Si.set(D,S);else{for(D=T;D.next!==null;)D=D.next;D.next=S}else{var W=ga(),ce=xe.suspense;W=qA(W,S,ce),ce={expirationTime:W,suspenseConfig:ce,action:T,eagerReducer:null,eagerState:null,next:null};var Se=D.last;if(Se===null)ce.next=ce;else{var It=Se.next;It!==null&&(ce.next=It),Se.next=ce}if(D.last=ce,S.expirationTime===0&&(q===null||q.expirationTime===0)&&(q=D.lastRenderedReducer,q!==null))try{var Ct=D.lastRenderedState,xt=q(Ct,T);if(ce.eagerReducer=q,ce.eagerState=xt,ds(xt,Ct))return}catch{}finally{}Qc(S,W)}}var Du={readContext:Ls,useCallback:lt,useContext:lt,useEffect:lt,useImperativeHandle:lt,useLayoutEffect:lt,useMemo:lt,useReducer:lt,useRef:lt,useState:lt,useDebugValue:lt,useResponder:lt,useDeferredValue:lt,useTransition:lt},uI={readContext:Ls,useCallback:vu,useContext:Ls,useEffect:mt,useImperativeHandle:function(S,D,T){return T=T!=null?T.concat([S]):null,fp(4,36,cg.bind(null,D,S),T)},useLayoutEffect:function(S,D){return fp(4,36,S,D)},useMemo:function(S,D){var T=TA();return D=D===void 0?null:D,S=S(),T.memoizedState=[S,D],S},useReducer:function(S,D,T){var q=TA();return D=T!==void 0?T(D):D,q.memoizedState=q.baseState=D,S=q.queue={last:null,dispatch:null,lastRenderedReducer:S,lastRenderedState:D},S=S.dispatch=Ag.bind(null,Ga,S),[q.memoizedState,S]},useRef:function(S){var D=TA();return S={current:S},D.memoizedState=S},useState:og,useDebugValue:ug,useResponder:ig,useDeferredValue:function(S,D){var T=og(S),q=T[0],W=T[1];return mt(function(){a.unstable_next(function(){var ce=Os.suspense;Os.suspense=D===void 0?null:D;try{W(S)}finally{Os.suspense=ce}})},[S,D]),q},useTransition:function(S){var D=og(!1),T=D[0],q=D[1];return[vu(function(W){q(!0),a.unstable_next(function(){var ce=Os.suspense;Os.suspense=S===void 0?null:S;try{q(!1),W()}finally{Os.suspense=ce}})},[S,T]),T]}},Fm={readContext:Ls,useCallback:km,useContext:Ls,useEffect:Qm,useImperativeHandle:function(S,D,T){return T=T!=null?T.concat([S]):null,Dc(4,36,cg.bind(null,D,S),T)},useLayoutEffect:function(S,D){return Dc(4,36,S,D)},useMemo:function(S,D){var T=Ap();D=D===void 0?null:D;var q=T.memoizedState;return q!==null&&D!==null&&Bu(D,q[1])?q[0]:(S=S(),T.memoizedState=[S,D],S)},useReducer:ys,useRef:function(){return Ap().memoizedState},useState:ag,useDebugValue:ug,useResponder:ig,useDeferredValue:function(S,D){var T=ag(S),q=T[0],W=T[1];return Qm(function(){a.unstable_next(function(){var ce=Os.suspense;Os.suspense=D===void 0?null:D;try{W(S)}finally{Os.suspense=ce}})},[S,D]),q},useTransition:function(S){var D=ag(!1),T=D[0],q=D[1];return[km(function(W){q(!0),a.unstable_next(function(){var ce=Os.suspense;Os.suspense=S===void 0?null:S;try{q(!1),W()}finally{Os.suspense=ce}})},[S,T]),T]}},Aa=null,Sc=null,Dl=!1;function Su(S,D){var T=xl(5,null,null,0);T.elementType="DELETED",T.type="DELETED",T.stateNode=D,T.return=S,T.effectTag=8,S.lastEffect!==null?(S.lastEffect.nextEffect=T,S.lastEffect=T):S.firstEffect=S.lastEffect=T}function fg(S,D){switch(S.tag){case 5:return D=to(D,S.type,S.pendingProps),D!==null?(S.stateNode=D,!0):!1;case 6:return D=Di(D,S.pendingProps),D!==null?(S.stateNode=D,!0):!1;case 13:return!1;default:return!1}}function NA(S){if(Dl){var D=Sc;if(D){var T=D;if(!fg(S,D)){if(D=pc(T),!D||!fg(S,D)){S.effectTag=S.effectTag&-1025|2,Dl=!1,Aa=S;return}Su(Aa,T)}Aa=S,Sc=gu(D)}else S.effectTag=S.effectTag&-1025|2,Dl=!1,Aa=S}}function pp(S){for(S=S.return;S!==null&&S.tag!==5&&S.tag!==3&&S.tag!==13;)S=S.return;Aa=S}function Wa(S){if(!y||S!==Aa)return!1;if(!Dl)return pp(S),Dl=!0,!1;var D=S.type;if(S.tag!==5||D!=="head"&&D!=="body"&&!Te(D,S.memoizedProps))for(D=Sc;D;)Su(S,D),D=pc(D);if(pp(S),S.tag===13){if(!y)throw Error(n(316));if(S=S.memoizedState,S=S!==null?S.dehydrated:null,!S)throw Error(n(317));Sc=ks(S)}else Sc=Aa?pc(S.stateNode):null;return!0}function pg(){y&&(Sc=Aa=null,Dl=!1)}var hp=u.ReactCurrentOwner,Uo=!1;function Cs(S,D,T,q){D.child=S===null?la(D,null,T,q):yi(D,S.child,T,q)}function Ci(S,D,T,q,W){T=T.render;var ce=D.ref;return Ns(D,W),q=sg(S,D,T,q,ce,W),S!==null&&!Uo?(D.updateQueue=S.updateQueue,D.effectTag&=-517,S.expirationTime<=W&&(S.expirationTime=0),ti(S,D,W)):(D.effectTag|=1,Cs(S,D,q,W),D.child)}function Rm(S,D,T,q,W,ce){if(S===null){var Se=T.type;return typeof Se=="function"&&!wI(Se)&&Se.defaultProps===void 0&&T.compare===null&&T.defaultProps===void 0?(D.tag=15,D.type=Se,Tm(S,D,Se,q,W,ce)):(S=Gm(T.type,null,q,null,D.mode,ce),S.ref=D.ref,S.return=D,D.child=S)}return Se=S.child,WD)&&HA.set(S,D)))}}function Ig(S,D){S.expirationTimeS?D:S)}function uo(S){if(S.lastExpiredTime!==0)S.callbackExpirationTime=1073741823,S.callbackPriority=99,S.callbackNode=Cu(mI.bind(null,S));else{var D=qm(S),T=S.callbackNode;if(D===0)T!==null&&(S.callbackNode=null,S.callbackExpirationTime=0,S.callbackPriority=90);else{var q=ga();if(D===1073741823?q=99:D===1||D===2?q=95:(q=10*(1073741821-D)-10*(1073741821-q),q=0>=q?99:250>=q?98:5250>=q?97:95),T!==null){var W=S.callbackPriority;if(S.callbackExpirationTime===D&&W>=q)return;T!==bA&&Ee(T)}S.callbackExpirationTime=D,S.callbackPriority=q,D=D===1073741823?Cu(mI.bind(null,S)):Bl(q,Fv.bind(null,S),{timeout:10*(1073741821-D)-Hi()}),S.callbackNode=D}}}function Fv(S,D){if(Hm=0,D)return D=ga(),Wm(S,D),uo(S),null;var T=qm(S);if(T!==0){if(D=S.callbackNode,(pr&(rs|Ms))!==gn)throw Error(n(327));if(Ip(),S===Ai&&T===ns||Qu(S,T),Fr!==null){var q=pr;pr|=rs;var W=GA(S);do try{oF();break}catch(It){jA(S,It)}while(1);if(sa(),pr=q,yp.current=W,Gi===Om)throw D=Mm,Qu(S,T),KA(S,T),uo(S),D;if(Fr===null)switch(W=S.finishedWork=S.current.alternate,S.finishedExpirationTime=T,q=Gi,Ai=null,q){case Pu:case Om:throw Error(n(345));case Ei:Wm(S,2=T){S.lastPingedTime=T,Qu(S,T);break}}if(ce=qm(S),ce!==0&&ce!==T)break;if(q!==0&&q!==T){S.lastPingedTime=q;break}S.timeoutHandle=qe(ku.bind(null,S),W);break}ku(S);break;case Pl:if(KA(S,T),q=S.lastSuspendedTime,T===q&&(S.nextKnownPendingLevel=CI(W)),UA&&(W=S.lastPingedTime,W===0||W>=T)){S.lastPingedTime=T,Qu(S,T);break}if(W=qm(S),W!==0&&W!==T)break;if(q!==0&&q!==T){S.lastPingedTime=q;break}if(MA!==1073741823?q=10*(1073741821-MA)-Hi():Va===1073741823?q=0:(q=10*(1073741821-Va)-5e3,W=Hi(),T=10*(1073741821-T)-W,q=W-q,0>q&&(q=0),q=(120>q?120:480>q?480:1080>q?1080:1920>q?1920:3e3>q?3e3:4320>q?4320:1960*fI(q/1960))-q,T=q?q=0:(W=Se.busyDelayMs|0,ce=Hi()-(10*(1073741821-ce)-(Se.timeoutMs|0||5e3)),q=ce<=W?0:W+q-ce),10 component higher in the tree to provide a loading indicator or placeholder to display.`+Cl(W))}Gi!==bc&&(Gi=Ei),ce=gg(ce,W),Ct=q;do{switch(Ct.tag){case 3:Se=ce,Ct.effectTag|=4096,Ct.expirationTime=D;var Je=Qv(Ct,Se,D);Ha(Ct,Je);break e;case 1:Se=ce;var ft=Ct.type,jt=Ct.stateNode;if((Ct.effectTag&64)===0&&(typeof ft.getDerivedStateFromError=="function"||jt!==null&&typeof jt.componentDidCatch=="function"&&(bu===null||!bu.has(jt)))){Ct.effectTag|=4096,Ct.expirationTime=D;var Cr=kv(Ct,Se,D);Ha(Ct,Cr);break e}}Ct=Ct.return}while(Ct!==null)}Fr=Lv(Fr)}catch(In){D=In;continue}break}while(1)}function GA(){var S=yp.current;return yp.current=Du,S===null?Du:S}function yI(S,D){SCp&&(Cp=S)}function sF(){for(;Fr!==null;)Fr=Nv(Fr)}function oF(){for(;Fr!==null&&!Rt();)Fr=Nv(Fr)}function Nv(S){var D=Mv(S.alternate,S,ns);return S.memoizedProps=S.pendingProps,D===null&&(D=Lv(S)),pI.current=null,D}function Lv(S){Fr=S;do{var D=Fr.alternate;if(S=Fr.return,(Fr.effectTag&2048)===0){e:{var T=D;D=Fr;var q=ns,W=D.pendingProps;switch(D.tag){case 2:break;case 16:break;case 15:case 0:break;case 1:$n(D.type)&&Ma(D);break;case 3:Ic(D),$t(D),W=D.stateNode,W.pendingContext&&(W.context=W.pendingContext,W.pendingContext=null),(T===null||T.child===null)&&Wa(D)&&pa(D),Sl(D);break;case 5:ng(D);var ce=ca(Ec.current);if(q=D.type,T!==null&&D.stateNode!=null)ts(T,D,q,W,ce),T.ref!==D.ref&&(D.effectTag|=128);else if(W){if(T=ca(lo.current),Wa(D)){if(W=D,!y)throw Error(n(175));T=ap(W.stateNode,W.type,W.memoizedProps,ce,T,W),W.updateQueue=T,T=T!==null,T&&pa(D)}else{var Se=ut(q,W,ce,T,D);Pc(Se,D,!1,!1),D.stateNode=Se,yt(Se,q,W,ce,T)&&pa(D)}D.ref!==null&&(D.effectTag|=128)}else if(D.stateNode===null)throw Error(n(166));break;case 6:if(T&&D.stateNode!=null)Hr(T,D,T.memoizedProps,W);else{if(typeof W!="string"&&D.stateNode===null)throw Error(n(166));if(T=ca(Ec.current),ce=ca(lo.current),Wa(D)){if(T=D,!y)throw Error(n(176));(T=lp(T.stateNode,T.memoizedProps,T))&&pa(D)}else D.stateNode=_e(W,T,ce,D)}break;case 11:break;case 13:if(Ue(Vn,D),W=D.memoizedState,(D.effectTag&64)!==0){D.expirationTime=q;break e}W=W!==null,ce=!1,T===null?D.memoizedProps.fallback!==void 0&&Wa(D):(q=T.memoizedState,ce=q!==null,W||q===null||(q=T.child.sibling,q!==null&&(Se=D.firstEffect,Se!==null?(D.firstEffect=q,q.nextEffect=Se):(D.firstEffect=D.lastEffect=q,q.nextEffect=null),q.effectTag=8))),W&&!ce&&(D.mode&2)!==0&&(T===null&&D.memoizedProps.unstable_avoidThisFallback!==!0||(Vn.current&1)!==0?Gi===Pu&&(Gi=ha):((Gi===Pu||Gi===ha)&&(Gi=Pl),Cp!==0&&Ai!==null&&(KA(Ai,ns),_v(Ai,Cp)))),P&&W&&(D.effectTag|=4),I&&(W||ce)&&(D.effectTag|=4);break;case 7:break;case 8:break;case 12:break;case 4:Ic(D),Sl(D);break;case 10:Zi(D);break;case 9:break;case 14:break;case 17:$n(D.type)&&Ma(D);break;case 19:if(Ue(Vn,D),W=D.memoizedState,W===null)break;if(ce=(D.effectTag&64)!==0,Se=W.rendering,Se===null){if(ce)xc(W,!1);else if(Gi!==Pu||T!==null&&(T.effectTag&64)!==0)for(T=D.child;T!==null;){if(Se=up(T),Se!==null){for(D.effectTag|=64,xc(W,!1),T=Se.updateQueue,T!==null&&(D.updateQueue=T,D.effectTag|=4),W.lastEffect===null&&(D.firstEffect=null),D.lastEffect=W.lastEffect,T=q,W=D.child;W!==null;)ce=W,q=T,ce.effectTag&=2,ce.nextEffect=null,ce.firstEffect=null,ce.lastEffect=null,Se=ce.alternate,Se===null?(ce.childExpirationTime=0,ce.expirationTime=q,ce.child=null,ce.memoizedProps=null,ce.memoizedState=null,ce.updateQueue=null,ce.dependencies=null):(ce.childExpirationTime=Se.childExpirationTime,ce.expirationTime=Se.expirationTime,ce.child=Se.child,ce.memoizedProps=Se.memoizedProps,ce.memoizedState=Se.memoizedState,ce.updateQueue=Se.updateQueue,q=Se.dependencies,ce.dependencies=q===null?null:{expirationTime:q.expirationTime,firstContext:q.firstContext,responders:q.responders}),W=W.sibling;Fn(Vn,Vn.current&1|2,D),D=D.child;break e}T=T.sibling}}else{if(!ce)if(T=up(Se),T!==null){if(D.effectTag|=64,ce=!0,T=T.updateQueue,T!==null&&(D.updateQueue=T,D.effectTag|=4),xc(W,!0),W.tail===null&&W.tailMode==="hidden"&&!Se.alternate){D=D.lastEffect=W.lastEffect,D!==null&&(D.nextEffect=null);break}}else Hi()>W.tailExpiration&&1W&&(W=q),Se>W&&(W=Se),ce=ce.sibling;T.childExpirationTime=W}if(D!==null)return D;S!==null&&(S.effectTag&2048)===0&&(S.firstEffect===null&&(S.firstEffect=Fr.firstEffect),Fr.lastEffect!==null&&(S.lastEffect!==null&&(S.lastEffect.nextEffect=Fr.firstEffect),S.lastEffect=Fr.lastEffect),1S?D:S}function ku(S){var D=Oo();return so(99,aF.bind(null,S,D)),null}function aF(S,D){do Ip();while(Cg!==null);if((pr&(rs|Ms))!==gn)throw Error(n(327));var T=S.finishedWork,q=S.finishedExpirationTime;if(T===null)return null;if(S.finishedWork=null,S.finishedExpirationTime=0,T===S.current)throw Error(n(177));S.callbackNode=null,S.callbackExpirationTime=0,S.callbackPriority=90,S.nextKnownPendingLevel=0;var W=CI(T);if(S.firstPendingTime=W,q<=S.lastSuspendedTime?S.firstSuspendedTime=S.lastSuspendedTime=S.nextKnownPendingLevel=0:q<=S.firstSuspendedTime&&(S.firstSuspendedTime=q-1),q<=S.lastPingedTime&&(S.lastPingedTime=0),q<=S.lastExpiredTime&&(S.lastExpiredTime=0),S===Ai&&(Fr=Ai=null,ns=0),1=T?rn(S,D,T):(Fn(Vn,Vn.current&1,D),D=ti(S,D,T),D!==null?D.sibling:null);Fn(Vn,Vn.current&1,D);break;case 19:if(q=D.childExpirationTime>=T,(S.effectTag&64)!==0){if(q)return Ya(S,D,T);D.effectTag|=64}if(W=D.memoizedState,W!==null&&(W.rendering=null,W.tail=null),Fn(Vn,Vn.current,D),!q)return null}return ti(S,D,T)}Uo=!1}}else Uo=!1;switch(D.expirationTime=0,D.tag){case 2:if(q=D.type,S!==null&&(S.alternate=null,D.alternate=null,D.effectTag|=2),S=D.pendingProps,W=Ri(D,Rn.current),Ns(D,T),W=sg(null,D,q,S,W,T),D.effectTag|=1,typeof W=="object"&&W!==null&&typeof W.render=="function"&&W.$$typeof===void 0){if(D.tag=1,cI(),$n(q)){var ce=!0;gc(D)}else ce=!1;D.memoizedState=W.state!==null&&W.state!==void 0?W.state:null;var Se=q.getDerivedStateFromProps;typeof Se=="function"&&vt(D,q,Se,S),W.updater=tr,D.stateNode=W,W._reactInternalFiber=D,ei(D,q,S,T),D=dp(null,D,q,!0,ce,T)}else D.tag=0,Cs(null,D,W,T),D=D.child;return D;case 16:if(W=D.elementType,S!==null&&(S.alternate=null,D.alternate=null,D.effectTag|=2),S=D.pendingProps,ve(W),W._status!==1)throw W._result;switch(W=W._result,D.type=W,ce=D.tag=hF(W),S=di(W,S),ce){case 0:D=LA(null,D,W,S,T);break;case 1:D=gp(null,D,W,S,T);break;case 11:D=Ci(null,D,W,S,T);break;case 14:D=Rm(null,D,W,di(W.type,S),q,T);break;default:throw Error(n(306,W,""))}return D;case 0:return q=D.type,W=D.pendingProps,W=D.elementType===q?W:di(q,W),LA(S,D,q,W,T);case 1:return q=D.type,W=D.pendingProps,W=D.elementType===q?W:di(q,W),gp(S,D,q,W,T);case 3:if(hg(D),q=D.updateQueue,q===null)throw Error(n(282));if(W=D.memoizedState,W=W!==null?W.element:null,we(D,q,D.pendingProps,null,T),q=D.memoizedState.element,q===W)pg(),D=ti(S,D,T);else{if((W=D.stateNode.hydrate)&&(y?(Sc=gu(D.stateNode.containerInfo),Aa=D,W=Dl=!0):W=!1),W)for(T=la(D,null,q,T),D.child=T;T;)T.effectTag=T.effectTag&-3|1024,T=T.sibling;else Cs(S,D,q,T),pg();D=D.child}return D;case 5:return bm(D),S===null&&NA(D),q=D.type,W=D.pendingProps,ce=S!==null?S.memoizedProps:null,Se=W.children,Te(q,W)?Se=null:ce!==null&&Te(q,ce)&&(D.effectTag|=16),_o(S,D),D.mode&4&&T!==1&&Qe(q,W)?(D.expirationTime=D.childExpirationTime=1,D=null):(Cs(S,D,Se,T),D=D.child),D;case 6:return S===null&&NA(D),null;case 13:return rn(S,D,T);case 4:return rg(D,D.stateNode.containerInfo),q=D.pendingProps,S===null?D.child=yi(D,null,q,T):Cs(S,D,q,T),D.child;case 11:return q=D.type,W=D.pendingProps,W=D.elementType===q?W:di(q,W),Ci(S,D,q,W,T);case 7:return Cs(S,D,D.pendingProps,T),D.child;case 8:return Cs(S,D,D.pendingProps.children,T),D.child;case 12:return Cs(S,D,D.pendingProps.children,T),D.child;case 10:e:{if(q=D.type._context,W=D.pendingProps,Se=D.memoizedProps,ce=W.value,Mo(D,ce),Se!==null){var It=Se.value;if(ce=ds(It,ce)?0:(typeof q._calculateChangedBits=="function"?q._calculateChangedBits(It,ce):1073741823)|0,ce===0){if(Se.children===W.children&&!Ui.current){D=ti(S,D,T);break e}}else for(It=D.child,It!==null&&(It.return=D);It!==null;){var Ct=It.dependencies;if(Ct!==null){Se=It.child;for(var xt=Ct.firstContext;xt!==null;){if(xt.context===q&&(xt.observedBits&ce)!==0){It.tag===1&&(xt=$i(T,null),xt.tag=2,mi(It,xt)),It.expirationTime"u")return!1;var D=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(D.isDisabled||!D.supportsFiber)return!0;try{var T=D.inject(S);EI=function(q){try{D.onCommitFiberRoot(T,q,void 0,(q.current.effectTag&64)===64)}catch{}},II=function(q){try{D.onCommitFiberUnmount(T,q)}catch{}}}catch{}return!0}function pF(S,D,T,q){this.tag=S,this.key=T,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=D,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=q,this.effectTag=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childExpirationTime=this.expirationTime=0,this.alternate=null}function xl(S,D,T,q){return new pF(S,D,T,q)}function wI(S){return S=S.prototype,!(!S||!S.isReactComponent)}function hF(S){if(typeof S=="function")return wI(S)?1:0;if(S!=null){if(S=S.$$typeof,S===L)return 11;if(S===re)return 14}return 2}function YA(S,D){var T=S.alternate;return T===null?(T=xl(S.tag,D,S.key,S.mode),T.elementType=S.elementType,T.type=S.type,T.stateNode=S.stateNode,T.alternate=S,S.alternate=T):(T.pendingProps=D,T.effectTag=0,T.nextEffect=null,T.firstEffect=null,T.lastEffect=null),T.childExpirationTime=S.childExpirationTime,T.expirationTime=S.expirationTime,T.child=S.child,T.memoizedProps=S.memoizedProps,T.memoizedState=S.memoizedState,T.updateQueue=S.updateQueue,D=S.dependencies,T.dependencies=D===null?null:{expirationTime:D.expirationTime,firstContext:D.firstContext,responders:D.responders},T.sibling=S.sibling,T.index=S.index,T.ref=S.ref,T}function Gm(S,D,T,q,W,ce){var Se=2;if(q=S,typeof S=="function")wI(S)&&(Se=1);else if(typeof S=="string")Se=5;else e:switch(S){case E:return Fu(T.children,W,ce,D);case R:Se=8,W|=7;break;case w:Se=8,W|=1;break;case v:return S=xl(12,T,D,W|8),S.elementType=v,S.type=v,S.expirationTime=ce,S;case _:return S=xl(13,T,D,W),S.type=_,S.elementType=_,S.expirationTime=ce,S;case V:return S=xl(19,T,D,W),S.elementType=V,S.expirationTime=ce,S;default:if(typeof S=="object"&&S!==null)switch(S.$$typeof){case b:Se=10;break e;case C:Se=9;break e;case L:Se=11;break e;case re:Se=14;break e;case oe:Se=16,q=null;break e}throw Error(n(130,S==null?S:typeof S,""))}return D=xl(Se,T,D,W),D.elementType=S,D.type=q,D.expirationTime=ce,D}function Fu(S,D,T,q){return S=xl(7,S,q,D),S.expirationTime=T,S}function BI(S,D,T){return S=xl(6,S,null,D),S.expirationTime=T,S}function vI(S,D,T){return D=xl(4,S.children!==null?S.children:[],S.key,D),D.expirationTime=T,D.stateNode={containerInfo:S.containerInfo,pendingChildren:null,implementation:S.implementation},D}function gF(S,D,T){this.tag=D,this.current=null,this.containerInfo=S,this.pingCache=this.pendingChildren=null,this.finishedExpirationTime=0,this.finishedWork=null,this.timeoutHandle=Oe,this.pendingContext=this.context=null,this.hydrate=T,this.callbackNode=null,this.callbackPriority=90,this.lastExpiredTime=this.lastPingedTime=this.nextKnownPendingLevel=this.lastSuspendedTime=this.firstSuspendedTime=this.firstPendingTime=0}function Uv(S,D){var T=S.firstSuspendedTime;return S=S.lastSuspendedTime,T!==0&&T>=D&&S<=D}function KA(S,D){var T=S.firstSuspendedTime,q=S.lastSuspendedTime;TD||T===0)&&(S.lastSuspendedTime=D),D<=S.lastPingedTime&&(S.lastPingedTime=0),D<=S.lastExpiredTime&&(S.lastExpiredTime=0)}function _v(S,D){D>S.firstPendingTime&&(S.firstPendingTime=D);var T=S.firstSuspendedTime;T!==0&&(D>=T?S.firstSuspendedTime=S.lastSuspendedTime=S.nextKnownPendingLevel=0:D>=S.lastSuspendedTime&&(S.lastSuspendedTime=D+1),D>S.nextKnownPendingLevel&&(S.nextKnownPendingLevel=D))}function Wm(S,D){var T=S.lastExpiredTime;(T===0||T>D)&&(S.lastExpiredTime=D)}function Hv(S){var D=S._reactInternalFiber;if(D===void 0)throw typeof S.render=="function"?Error(n(188)):Error(n(268,Object.keys(S)));return S=De(D),S===null?null:S.stateNode}function qv(S,D){S=S.memoizedState,S!==null&&S.dehydrated!==null&&S.retryTime{"use strict";KCe.exports=YCe()});var zCe=U((EYt,JCe)=>{"use strict";var ryt={ALIGN_COUNT:8,ALIGN_AUTO:0,ALIGN_FLEX_START:1,ALIGN_CENTER:2,ALIGN_FLEX_END:3,ALIGN_STRETCH:4,ALIGN_BASELINE:5,ALIGN_SPACE_BETWEEN:6,ALIGN_SPACE_AROUND:7,DIMENSION_COUNT:2,DIMENSION_WIDTH:0,DIMENSION_HEIGHT:1,DIRECTION_COUNT:3,DIRECTION_INHERIT:0,DIRECTION_LTR:1,DIRECTION_RTL:2,DISPLAY_COUNT:2,DISPLAY_FLEX:0,DISPLAY_NONE:1,EDGE_COUNT:9,EDGE_LEFT:0,EDGE_TOP:1,EDGE_RIGHT:2,EDGE_BOTTOM:3,EDGE_START:4,EDGE_END:5,EDGE_HORIZONTAL:6,EDGE_VERTICAL:7,EDGE_ALL:8,EXPERIMENTAL_FEATURE_COUNT:1,EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS:0,FLEX_DIRECTION_COUNT:4,FLEX_DIRECTION_COLUMN:0,FLEX_DIRECTION_COLUMN_REVERSE:1,FLEX_DIRECTION_ROW:2,FLEX_DIRECTION_ROW_REVERSE:3,JUSTIFY_COUNT:6,JUSTIFY_FLEX_START:0,JUSTIFY_CENTER:1,JUSTIFY_FLEX_END:2,JUSTIFY_SPACE_BETWEEN:3,JUSTIFY_SPACE_AROUND:4,JUSTIFY_SPACE_EVENLY:5,LOG_LEVEL_COUNT:6,LOG_LEVEL_ERROR:0,LOG_LEVEL_WARN:1,LOG_LEVEL_INFO:2,LOG_LEVEL_DEBUG:3,LOG_LEVEL_VERBOSE:4,LOG_LEVEL_FATAL:5,MEASURE_MODE_COUNT:3,MEASURE_MODE_UNDEFINED:0,MEASURE_MODE_EXACTLY:1,MEASURE_MODE_AT_MOST:2,NODE_TYPE_COUNT:2,NODE_TYPE_DEFAULT:0,NODE_TYPE_TEXT:1,OVERFLOW_COUNT:3,OVERFLOW_VISIBLE:0,OVERFLOW_HIDDEN:1,OVERFLOW_SCROLL:2,POSITION_TYPE_COUNT:2,POSITION_TYPE_RELATIVE:0,POSITION_TYPE_ABSOLUTE:1,PRINT_OPTIONS_COUNT:3,PRINT_OPTIONS_LAYOUT:1,PRINT_OPTIONS_STYLE:2,PRINT_OPTIONS_CHILDREN:4,UNIT_COUNT:4,UNIT_UNDEFINED:0,UNIT_POINT:1,UNIT_PERCENT:2,UNIT_AUTO:3,WRAP_COUNT:3,WRAP_NO_WRAP:0,WRAP_WRAP:1,WRAP_WRAP_REVERSE:2};JCe.exports=ryt});var eEe=U((IYt,$Ce)=>{"use strict";var nyt=Object.assign||function(t){for(var e=1;e"}}]),t}(),XCe=function(){MQ(t,null,[{key:"fromJS",value:function(r){var o=r.width,a=r.height;return new t(o,a)}}]);function t(e,r){P6(this,t),this.width=e,this.height=r}return MQ(t,[{key:"fromJS",value:function(r){r(this.width,this.height)}},{key:"toString",value:function(){return""}}]),t}(),ZCe=function(){function t(e,r){P6(this,t),this.unit=e,this.value=r}return MQ(t,[{key:"fromJS",value:function(r){r(this.unit,this.value)}},{key:"toString",value:function(){switch(this.unit){case su.UNIT_POINT:return String(this.value);case su.UNIT_PERCENT:return this.value+"%";case su.UNIT_AUTO:return"auto";default:return this.value+"?"}}},{key:"valueOf",value:function(){return this.value}}]),t}();$Ce.exports=function(t,e){function r(u,A,p){var h=u[A];u[A]=function(){for(var E=arguments.length,w=Array(E),v=0;v1?w-1:0),b=1;b1&&arguments[1]!==void 0?arguments[1]:NaN,p=arguments.length>2&&arguments[2]!==void 0?arguments[2]:NaN,h=arguments.length>3&&arguments[3]!==void 0?arguments[3]:su.DIRECTION_LTR;return u.call(this,A,p,h)}),nyt({Config:e.Config,Node:e.Node,Layout:t("Layout",iyt),Size:t("Size",XCe),Value:t("Value",ZCe),getInstanceCount:function(){return e.getInstanceCount.apply(e,arguments)}},su)}});var tEe=U((exports,module)=>{(function(t,e){typeof define=="function"&&define.amd?define([],function(){return e}):typeof module=="object"&&module.exports?module.exports=e:(t.nbind=t.nbind||{}).init=e})(exports,function(Module,cb){typeof Module=="function"&&(cb=Module,Module={}),Module.onRuntimeInitialized=function(t,e){return function(){t&&t.apply(this,arguments);try{Module.ccall("nbind_init")}catch(r){e(r);return}e(null,{bind:Module._nbind_value,reflect:Module.NBind.reflect,queryType:Module.NBind.queryType,toggleLightGC:Module.toggleLightGC,lib:Module})}}(Module.onRuntimeInitialized,cb);var Module;Module||(Module=(typeof Module<"u"?Module:null)||{});var moduleOverrides={};for(var key in Module)Module.hasOwnProperty(key)&&(moduleOverrides[key]=Module[key]);var ENVIRONMENT_IS_WEB=!1,ENVIRONMENT_IS_WORKER=!1,ENVIRONMENT_IS_NODE=!1,ENVIRONMENT_IS_SHELL=!1;if(Module.ENVIRONMENT)if(Module.ENVIRONMENT==="WEB")ENVIRONMENT_IS_WEB=!0;else if(Module.ENVIRONMENT==="WORKER")ENVIRONMENT_IS_WORKER=!0;else if(Module.ENVIRONMENT==="NODE")ENVIRONMENT_IS_NODE=!0;else if(Module.ENVIRONMENT==="SHELL")ENVIRONMENT_IS_SHELL=!0;else throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.");else ENVIRONMENT_IS_WEB=typeof window=="object",ENVIRONMENT_IS_WORKER=typeof importScripts=="function",ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof Ie=="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER,ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){Module.print||(Module.print=console.log),Module.printErr||(Module.printErr=console.warn);var nodeFS,nodePath;Module.read=function(e,r){nodeFS||(nodeFS={}("")),nodePath||(nodePath={}("")),e=nodePath.normalize(e);var o=nodeFS.readFileSync(e);return r?o:o.toString()},Module.readBinary=function(e){var r=Module.read(e,!0);return r.buffer||(r=new Uint8Array(r)),assert(r.buffer),r},Module.load=function(e){globalEval(read(e))},Module.thisProgram||(process.argv.length>1?Module.thisProgram=process.argv[1].replace(/\\/g,"/"):Module.thisProgram="unknown-program"),Module.arguments=process.argv.slice(2),typeof module<"u"&&(module.exports=Module),Module.inspect=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL)Module.print||(Module.print=print),typeof printErr<"u"&&(Module.printErr=printErr),typeof read<"u"?Module.read=read:Module.read=function(){throw"no read() available"},Module.readBinary=function(e){if(typeof readbuffer=="function")return new Uint8Array(readbuffer(e));var r=read(e,"binary");return assert(typeof r=="object"),r},typeof scriptArgs<"u"?Module.arguments=scriptArgs:typeof arguments<"u"&&(Module.arguments=arguments),typeof quit=="function"&&(Module.quit=function(t,e){quit(t)});else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(Module.read=function(e){var r=new XMLHttpRequest;return r.open("GET",e,!1),r.send(null),r.responseText},ENVIRONMENT_IS_WORKER&&(Module.readBinary=function(e){var r=new XMLHttpRequest;return r.open("GET",e,!1),r.responseType="arraybuffer",r.send(null),new Uint8Array(r.response)}),Module.readAsync=function(e,r,o){var a=new XMLHttpRequest;a.open("GET",e,!0),a.responseType="arraybuffer",a.onload=function(){a.status==200||a.status==0&&a.response?r(a.response):o()},a.onerror=o,a.send(null)},typeof arguments<"u"&&(Module.arguments=arguments),typeof console<"u")Module.print||(Module.print=function(e){console.log(e)}),Module.printErr||(Module.printErr=function(e){console.warn(e)});else{var TRY_USE_DUMP=!1;Module.print||(Module.print=TRY_USE_DUMP&&typeof dump<"u"?function(t){dump(t)}:function(t){})}ENVIRONMENT_IS_WORKER&&(Module.load=importScripts),typeof Module.setWindowTitle>"u"&&(Module.setWindowTitle=function(t){document.title=t})}else throw"Unknown runtime environment. Where are we?";function globalEval(t){eval.call(null,t)}!Module.load&&Module.read&&(Module.load=function(e){globalEval(Module.read(e))}),Module.print||(Module.print=function(){}),Module.printErr||(Module.printErr=Module.print),Module.arguments||(Module.arguments=[]),Module.thisProgram||(Module.thisProgram="./this.program"),Module.quit||(Module.quit=function(t,e){throw e}),Module.print=Module.print,Module.printErr=Module.printErr,Module.preRun=[],Module.postRun=[];for(var key in moduleOverrides)moduleOverrides.hasOwnProperty(key)&&(Module[key]=moduleOverrides[key]);moduleOverrides=void 0;var Runtime={setTempRet0:function(t){return tempRet0=t,t},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(t){STACKTOP=t},getNativeTypeSize:function(t){switch(t){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(t[t.length-1]==="*")return Runtime.QUANTUM_SIZE;if(t[0]==="i"){var e=parseInt(t.substr(1));return assert(e%8===0),e/8}else return 0}}},getNativeFieldSize:function(t){return Math.max(Runtime.getNativeTypeSize(t),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(t,e){return e==="double"||e==="i64"?t&7&&(assert((t&7)===4),t+=4):assert((t&3)===0),t},getAlignSize:function(t,e,r){return!r&&(t=="i64"||t=="double")?8:t?Math.min(e||(t?Runtime.getNativeFieldSize(t):0),Runtime.QUANTUM_SIZE):Math.min(e,8)},dynCall:function(t,e,r){return r&&r.length?Module["dynCall_"+t].apply(null,[e].concat(r)):Module["dynCall_"+t].call(null,e)},functionPointers:[],addFunction:function(t){for(var e=0;e>2],r=(e+t+15|0)&-16;if(HEAP32[DYNAMICTOP_PTR>>2]=r,r>=TOTAL_MEMORY){var o=enlargeMemory();if(!o)return HEAP32[DYNAMICTOP_PTR>>2]=e,0}return e},alignMemory:function(t,e){var r=t=Math.ceil(t/(e||16))*(e||16);return r},makeBigInt:function(t,e,r){var o=r?+(t>>>0)+ +(e>>>0)*4294967296:+(t>>>0)+ +(e|0)*4294967296;return o},GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module.Runtime=Runtime;var ABORT=0,EXITSTATUS=0;function assert(t,e){t||abort("Assertion failed: "+e)}function getCFunc(ident){var func=Module["_"+ident];if(!func)try{func=eval("_"+ident)}catch(t){}return assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)"),func}var cwrap,ccall;(function(){var JSfuncs={stackSave:function(){Runtime.stackSave()},stackRestore:function(){Runtime.stackRestore()},arrayToC:function(t){var e=Runtime.stackAlloc(t.length);return writeArrayToMemory(t,e),e},stringToC:function(t){var e=0;if(t!=null&&t!==0){var r=(t.length<<2)+1;e=Runtime.stackAlloc(r),stringToUTF8(t,e,r)}return e}},toC={string:JSfuncs.stringToC,array:JSfuncs.arrayToC};ccall=function(e,r,o,a,n){var u=getCFunc(e),A=[],p=0;if(a)for(var h=0;h>0]=e;break;case"i8":HEAP8[t>>0]=e;break;case"i16":HEAP16[t>>1]=e;break;case"i32":HEAP32[t>>2]=e;break;case"i64":tempI64=[e>>>0,(tempDouble=e,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[t>>2]=tempI64[0],HEAP32[t+4>>2]=tempI64[1];break;case"float":HEAPF32[t>>2]=e;break;case"double":HEAPF64[t>>3]=e;break;default:abort("invalid type for setValue: "+r)}}Module.setValue=setValue;function getValue(t,e,r){switch(e=e||"i8",e.charAt(e.length-1)==="*"&&(e="i32"),e){case"i1":return HEAP8[t>>0];case"i8":return HEAP8[t>>0];case"i16":return HEAP16[t>>1];case"i32":return HEAP32[t>>2];case"i64":return HEAP32[t>>2];case"float":return HEAPF32[t>>2];case"double":return HEAPF64[t>>3];default:abort("invalid type for setValue: "+e)}return null}Module.getValue=getValue;var ALLOC_NORMAL=0,ALLOC_STACK=1,ALLOC_STATIC=2,ALLOC_DYNAMIC=3,ALLOC_NONE=4;Module.ALLOC_NORMAL=ALLOC_NORMAL,Module.ALLOC_STACK=ALLOC_STACK,Module.ALLOC_STATIC=ALLOC_STATIC,Module.ALLOC_DYNAMIC=ALLOC_DYNAMIC,Module.ALLOC_NONE=ALLOC_NONE;function allocate(t,e,r,o){var a,n;typeof t=="number"?(a=!0,n=t):(a=!1,n=t.length);var u=typeof e=="string"?e:null,A;if(r==ALLOC_NONE?A=o:A=[typeof _malloc=="function"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][r===void 0?ALLOC_STATIC:r](Math.max(n,u?1:e.length)),a){var o=A,p;for(assert((A&3)==0),p=A+(n&-4);o>2]=0;for(p=A+n;o>0]=0;return A}if(u==="i8")return t.subarray||t.slice?HEAPU8.set(t,A):HEAPU8.set(new Uint8Array(t),A),A;for(var h=0,E,w,v;h>0],r|=o,!(o==0&&!e||(a++,e&&a==e)););e||(e=a);var n="";if(r<128){for(var u=1024,A;e>0;)A=String.fromCharCode.apply(String,HEAPU8.subarray(t,t+Math.min(e,u))),n=n?n+A:A,t+=u,e-=u;return n}return Module.UTF8ToString(t)}Module.Pointer_stringify=Pointer_stringify;function AsciiToString(t){for(var e="";;){var r=HEAP8[t++>>0];if(!r)return e;e+=String.fromCharCode(r)}}Module.AsciiToString=AsciiToString;function stringToAscii(t,e){return writeAsciiToMemory(t,e,!1)}Module.stringToAscii=stringToAscii;var UTF8Decoder=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0;function UTF8ArrayToString(t,e){for(var r=e;t[r];)++r;if(r-e>16&&t.subarray&&UTF8Decoder)return UTF8Decoder.decode(t.subarray(e,r));for(var o,a,n,u,A,p,h="";;){if(o=t[e++],!o)return h;if(!(o&128)){h+=String.fromCharCode(o);continue}if(a=t[e++]&63,(o&224)==192){h+=String.fromCharCode((o&31)<<6|a);continue}if(n=t[e++]&63,(o&240)==224?o=(o&15)<<12|a<<6|n:(u=t[e++]&63,(o&248)==240?o=(o&7)<<18|a<<12|n<<6|u:(A=t[e++]&63,(o&252)==248?o=(o&3)<<24|a<<18|n<<12|u<<6|A:(p=t[e++]&63,o=(o&1)<<30|a<<24|n<<18|u<<12|A<<6|p))),o<65536)h+=String.fromCharCode(o);else{var E=o-65536;h+=String.fromCharCode(55296|E>>10,56320|E&1023)}}}Module.UTF8ArrayToString=UTF8ArrayToString;function UTF8ToString(t){return UTF8ArrayToString(HEAPU8,t)}Module.UTF8ToString=UTF8ToString;function stringToUTF8Array(t,e,r,o){if(!(o>0))return 0;for(var a=r,n=r+o-1,u=0;u=55296&&A<=57343&&(A=65536+((A&1023)<<10)|t.charCodeAt(++u)&1023),A<=127){if(r>=n)break;e[r++]=A}else if(A<=2047){if(r+1>=n)break;e[r++]=192|A>>6,e[r++]=128|A&63}else if(A<=65535){if(r+2>=n)break;e[r++]=224|A>>12,e[r++]=128|A>>6&63,e[r++]=128|A&63}else if(A<=2097151){if(r+3>=n)break;e[r++]=240|A>>18,e[r++]=128|A>>12&63,e[r++]=128|A>>6&63,e[r++]=128|A&63}else if(A<=67108863){if(r+4>=n)break;e[r++]=248|A>>24,e[r++]=128|A>>18&63,e[r++]=128|A>>12&63,e[r++]=128|A>>6&63,e[r++]=128|A&63}else{if(r+5>=n)break;e[r++]=252|A>>30,e[r++]=128|A>>24&63,e[r++]=128|A>>18&63,e[r++]=128|A>>12&63,e[r++]=128|A>>6&63,e[r++]=128|A&63}}return e[r]=0,r-a}Module.stringToUTF8Array=stringToUTF8Array;function stringToUTF8(t,e,r){return stringToUTF8Array(t,HEAPU8,e,r)}Module.stringToUTF8=stringToUTF8;function lengthBytesUTF8(t){for(var e=0,r=0;r=55296&&o<=57343&&(o=65536+((o&1023)<<10)|t.charCodeAt(++r)&1023),o<=127?++e:o<=2047?e+=2:o<=65535?e+=3:o<=2097151?e+=4:o<=67108863?e+=5:e+=6}return e}Module.lengthBytesUTF8=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0;function demangle(t){var e=Module.___cxa_demangle||Module.__cxa_demangle;if(e){try{var r=t.substr(1),o=lengthBytesUTF8(r)+1,a=_malloc(o);stringToUTF8(r,a,o);var n=_malloc(4),u=e(a,0,0,n);if(getValue(n,"i32")===0&&u)return Pointer_stringify(u)}catch{}finally{a&&_free(a),n&&_free(n),u&&_free(u)}return t}return Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling"),t}function demangleAll(t){var e=/__Z[\w\d_]+/g;return t.replace(e,function(r){var o=demangle(r);return r===o?r:r+" ["+o+"]"})}function jsStackTrace(){var t=new Error;if(!t.stack){try{throw new Error(0)}catch(e){t=e}if(!t.stack)return"(no stack trace available)"}return t.stack.toString()}function stackTrace(){var t=jsStackTrace();return Module.extraStackTrace&&(t+=` +`+Module.extraStackTrace()),demangleAll(t)}Module.stackTrace=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module.HEAP8=HEAP8=new Int8Array(buffer),Module.HEAP16=HEAP16=new Int16Array(buffer),Module.HEAP32=HEAP32=new Int32Array(buffer),Module.HEAPU8=HEAPU8=new Uint8Array(buffer),Module.HEAPU16=HEAPU16=new Uint16Array(buffer),Module.HEAPU32=HEAPU32=new Uint32Array(buffer),Module.HEAPF32=HEAPF32=new Float32Array(buffer),Module.HEAPF64=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed,STACK_BASE,STACKTOP,STACK_MAX,DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0,staticSealed=!1;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module.TOTAL_STACK||5242880,TOTAL_MEMORY=Module.TOTAL_MEMORY||134217728;TOTAL_MEMORY0;){var e=t.shift();if(typeof e=="function"){e();continue}var r=e.func;typeof r=="number"?e.arg===void 0?Module.dynCall_v(r):Module.dynCall_vi(r,e.arg):r(e.arg===void 0?null:e.arg)}}var __ATPRERUN__=[],__ATINIT__=[],__ATMAIN__=[],__ATEXIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1,runtimeExited=!1;function preRun(){if(Module.preRun)for(typeof Module.preRun=="function"&&(Module.preRun=[Module.preRun]);Module.preRun.length;)addOnPreRun(Module.preRun.shift());callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){runtimeInitialized||(runtimeInitialized=!0,callRuntimeCallbacks(__ATINIT__))}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__),runtimeExited=!0}function postRun(){if(Module.postRun)for(typeof Module.postRun=="function"&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(t){__ATPRERUN__.unshift(t)}Module.addOnPreRun=addOnPreRun;function addOnInit(t){__ATINIT__.unshift(t)}Module.addOnInit=addOnInit;function addOnPreMain(t){__ATMAIN__.unshift(t)}Module.addOnPreMain=addOnPreMain;function addOnExit(t){__ATEXIT__.unshift(t)}Module.addOnExit=addOnExit;function addOnPostRun(t){__ATPOSTRUN__.unshift(t)}Module.addOnPostRun=addOnPostRun;function intArrayFromString(t,e,r){var o=r>0?r:lengthBytesUTF8(t)+1,a=new Array(o),n=stringToUTF8Array(t,a,0,a.length);return e&&(a.length=n),a}Module.intArrayFromString=intArrayFromString;function intArrayToString(t){for(var e=[],r=0;r255&&(o&=255),e.push(String.fromCharCode(o))}return e.join("")}Module.intArrayToString=intArrayToString;function writeStringToMemory(t,e,r){Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");var o,a;r&&(a=e+lengthBytesUTF8(t),o=HEAP8[a]),stringToUTF8(t,e,1/0),r&&(HEAP8[a]=o)}Module.writeStringToMemory=writeStringToMemory;function writeArrayToMemory(t,e){HEAP8.set(t,e)}Module.writeArrayToMemory=writeArrayToMemory;function writeAsciiToMemory(t,e,r){for(var o=0;o>0]=t.charCodeAt(o);r||(HEAP8[e>>0]=0)}if(Module.writeAsciiToMemory=writeAsciiToMemory,(!Math.imul||Math.imul(4294967295,5)!==-5)&&(Math.imul=function t(e,r){var o=e>>>16,a=e&65535,n=r>>>16,u=r&65535;return a*u+(o*u+a*n<<16)|0}),Math.imul=Math.imul,!Math.fround){var froundBuffer=new Float32Array(1);Math.fround=function(t){return froundBuffer[0]=t,froundBuffer[0]}}Math.fround=Math.fround,Math.clz32||(Math.clz32=function(t){t=t>>>0;for(var e=0;e<32;e++)if(t&1<<31-e)return e;return 32}),Math.clz32=Math.clz32,Math.trunc||(Math.trunc=function(t){return t<0?Math.ceil(t):Math.floor(t)}),Math.trunc=Math.trunc;var Math_abs=Math.abs,Math_cos=Math.cos,Math_sin=Math.sin,Math_tan=Math.tan,Math_acos=Math.acos,Math_asin=Math.asin,Math_atan=Math.atan,Math_atan2=Math.atan2,Math_exp=Math.exp,Math_log=Math.log,Math_sqrt=Math.sqrt,Math_ceil=Math.ceil,Math_floor=Math.floor,Math_pow=Math.pow,Math_imul=Math.imul,Math_fround=Math.fround,Math_round=Math.round,Math_min=Math.min,Math_clz32=Math.clz32,Math_trunc=Math.trunc,runDependencies=0,runDependencyWatcher=null,dependenciesFulfilled=null;function getUniqueRunDependency(t){return t}function addRunDependency(t){runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}Module.addRunDependency=addRunDependency;function removeRunDependency(t){if(runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),runDependencies==0&&(runDependencyWatcher!==null&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var e=dependenciesFulfilled;dependenciesFulfilled=null,e()}}Module.removeRunDependency=removeRunDependency,Module.preloadedImages={},Module.preloadedAudios={};var ASM_CONSTS=[function(t,e,r,o,a,n,u,A){return _nbind.callbackSignatureList[t].apply(this,arguments)}];function _emscripten_asm_const_iiiiiiii(t,e,r,o,a,n,u,A){return ASM_CONSTS[t](e,r,o,a,n,u,A)}function _emscripten_asm_const_iiiii(t,e,r,o,a){return ASM_CONSTS[t](e,r,o,a)}function _emscripten_asm_const_iiidddddd(t,e,r,o,a,n,u,A,p){return ASM_CONSTS[t](e,r,o,a,n,u,A,p)}function _emscripten_asm_const_iiididi(t,e,r,o,a,n,u){return ASM_CONSTS[t](e,r,o,a,n,u)}function _emscripten_asm_const_iiii(t,e,r,o){return ASM_CONSTS[t](e,r,o)}function _emscripten_asm_const_iiiid(t,e,r,o,a){return ASM_CONSTS[t](e,r,o,a)}function _emscripten_asm_const_iiiiii(t,e,r,o,a,n){return ASM_CONSTS[t](e,r,o,a,n)}STATIC_BASE=Runtime.GLOBAL_BASE,STATICTOP=STATIC_BASE+12800,__ATINIT__.push({func:function(){__GLOBAL__sub_I_Yoga_cpp()}},{func:function(){__GLOBAL__sub_I_nbind_cc()}},{func:function(){__GLOBAL__sub_I_common_cc()}},{func:function(){__GLOBAL__sub_I_Binding_cc()}}),allocate([0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,192,127,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,128,191,0,0,128,191,0,0,192,127,0,0,0,0,0,0,0,0,0,0,128,63,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,190,12,0,0,200,12,0,0,208,12,0,0,216,12,0,0,230,12,0,0,242,12,0,0,1,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,0,0,192,127,3,0,0,0,180,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,182,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,183,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,184,45,0,0,185,45,0,0,181,45,0,0,181,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,148,4,0,0,3,0,0,0,187,45,0,0,164,4,0,0,188,45,0,0,2,0,0,0,189,45,0,0,164,4,0,0,188,45,0,0,185,45,0,0,164,4,0,0,185,45,0,0,164,4,0,0,188,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,6,0,0,0,1,0,0,0,7,0,0,0,183,45,0,0,182,45,0,0,181,45,0,0,190,45,0,0,190,45,0,0,182,45,0,0,182,45,0,0,185,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,185,45,0,0,48,5,0,0,3,0,0,0,56,5,0,0,1,0,0,0,189,45,0,0,185,45,0,0,164,4,0,0,76,5,0,0,2,0,0,0,191,45,0,0,186,45,0,0,182,45,0,0,185,45,0,0,192,45,0,0,185,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,76,5,0,0,76,5,0,0,136,5,0,0,182,45,0,0,181,45,0,0,2,0,0,0,190,45,0,0,136,5,0,0,56,19,0,0,156,5,0,0,2,0,0,0,184,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,9,0,0,0,1,0,0,0,10,0,0,0,204,5,0,0,181,45,0,0,181,45,0,0,2,0,0,0,180,45,0,0,204,5,0,0,2,0,0,0,195,45,0,0,236,5,0,0,97,19,0,0,198,45,0,0,211,45,0,0,212,45,0,0,213,45,0,0,214,45,0,0,215,45,0,0,188,45,0,0,182,45,0,0,216,45,0,0,217,45,0,0,218,45,0,0,219,45,0,0,192,45,0,0,181,45,0,0,0,0,0,0,185,45,0,0,110,19,0,0,186,45,0,0,115,19,0,0,221,45,0,0,120,19,0,0,148,4,0,0,132,19,0,0,96,6,0,0,145,19,0,0,222,45,0,0,164,19,0,0,223,45,0,0,173,19,0,0,0,0,0,0,3,0,0,0,104,6,0,0,1,0,0,0,187,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,11,0,0,0,12,0,0,0,1,0,0,0,13,0,0,0,185,45,0,0,224,45,0,0,164,6,0,0,188,45,0,0,172,6,0,0,180,6,0,0,2,0,0,0,188,6,0,0,7,0,0,0,224,45,0,0,7,0,0,0,164,6,0,0,1,0,0,0,213,45,0,0,185,45,0,0,224,45,0,0,172,6,0,0,185,45,0,0,224,45,0,0,164,6,0,0,185,45,0,0,224,45,0,0,211,45,0,0,211,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,172,6,0,0,222,45,0,0,211,45,0,0,224,45,0,0,188,45,0,0,222,45,0,0,211,45,0,0,40,7,0,0,188,45,0,0,2,0,0,0,224,45,0,0,185,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,222,45,0,0,224,45,0,0,148,4,0,0,185,45,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,185,45,0,0,164,6,0,0,148,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,14,0,0,0,15,0,0,0,1,0,0,0,16,0,0,0,148,7,0,0,2,0,0,0,225,45,0,0,183,45,0,0,188,45,0,0,168,7,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,234,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,148,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,9,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,242,45,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,110,111,100,101,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,119,104,105,99,104,32,115,116,105,108,108,32,104,97,115,32,99,104,105,108,100,114,101,110,32,97,116,116,97,99,104,101,100,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,115,116,105,108,108,32,97,116,116,97,99,104,101,100,32,116,111,32,97,32,112,97,114,101,110,116,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,99,111,110,102,105,103,0,67,97,110,110,111,116,32,115,101,116,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,67,104,105,108,100,32,97,108,114,101,97,100,121,32,104,97,115,32,97,32,112,97,114,101,110,116,44,32,105,116,32,109,117,115,116,32,98,101,32,114,101,109,111,118,101,100,32,102,105,114,115,116,46,0,67,97,110,110,111,116,32,97,100,100,32,99,104,105,108,100,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,79,110,108,121,32,108,101,97,102,32,110,111,100,101,115,32,119,105,116,104,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,115,104,111,117,108,100,32,109,97,110,117,97,108,108,121,32,109,97,114,107,32,116,104,101,109,115,101,108,118,101,115,32,97,115,32,100,105,114,116,121,0,67,97,110,110,111,116,32,103,101,116,32,108,97,121,111,117,116,32,112,114,111,112,101,114,116,105,101,115,32,111,102,32,109,117,108,116,105,45,101,100,103,101,32,115,104,111,114,116,104,97,110,100,115,0,37,115,37,100,46,123,91,115,107,105,112,112,101,100,93,32,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,61,62,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,37,115,37,100,46,123,37,115,0,42,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,37,115,10,0,37,115,37,100,46,125,37,115,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,79,117,116,32,111,102,32,99,97,99,104,101,32,101,110,116,114,105,101,115,33,10,0,83,99,97,108,101,32,102,97,99,116,111,114,32,115,104,111,117,108,100,32,110,111,116,32,98,101,32,108,101,115,115,32,116,104,97,110,32,122,101,114,111,0,105,110,105,116,105,97,108,0,37,115,10,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,85,78,68,69,70,73,78,69,68,0,69,88,65,67,84,76,89,0,65,84,95,77,79,83,84,0,76,65,89,95,85,78,68,69,70,73,78,69,68,0,76,65,89,95,69,88,65,67,84,76,89,0,76,65,89,95,65,84,95,77,79,83,84,0,97,118,97,105,108,97,98,108,101,87,105,100,116,104,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,119,105,100,116,104,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,97,118,97,105,108,97,98,108,101,72,101,105,103,104,116,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,104,101,105,103,104,116,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,102,108,101,120,0,115,116,114,101,116,99,104,0,109,117,108,116,105,108,105,110,101,45,115,116,114,101,116,99,104,0,69,120,112,101,99,116,101,100,32,110,111,100,101,32,116,111,32,104,97,118,101,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,0,109,101,97,115,117,114,101,0,69,120,112,101,99,116,32,99,117,115,116,111,109,32,98,97,115,101,108,105,110,101,32,102,117,110,99,116,105,111,110,32,116,111,32,110,111,116,32,114,101,116,117,114,110,32,78,97,78,0,97,98,115,45,109,101,97,115,117,114,101,0,97,98,115,45,108,97,121,111,117,116,0,78,111,100,101,0,99,114,101,97,116,101,68,101,102,97,117,108,116,0,99,114,101,97,116,101,87,105,116,104,67,111,110,102,105,103,0,100,101,115,116,114,111,121,0,114,101,115,101,116,0,99,111,112,121,83,116,121,108,101,0,115,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,115,101,116,80,111,115,105,116,105,111,110,0,115,101,116,80,111,115,105,116,105,111,110,80,101,114,99,101,110,116,0,115,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,115,101,116,65,108,105,103,110,73,116,101,109,115,0,115,101,116,65,108,105,103,110,83,101,108,102,0,115,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,115,101,116,70,108,101,120,87,114,97,112,0,115,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,115,101,116,77,97,114,103,105,110,0,115,101,116,77,97,114,103,105,110,80,101,114,99,101,110,116,0,115,101,116,77,97,114,103,105,110,65,117,116,111,0,115,101,116,79,118,101,114,102,108,111,119,0,115,101,116,68,105,115,112,108,97,121,0,115,101,116,70,108,101,120,0,115,101,116,70,108,101,120,66,97,115,105,115,0,115,101,116,70,108,101,120,66,97,115,105,115,80,101,114,99,101,110,116,0,115,101,116,70,108,101,120,71,114,111,119,0,115,101,116,70,108,101,120,83,104,114,105,110,107,0,115,101,116,87,105,100,116,104,0,115,101,116,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,87,105,100,116,104,65,117,116,111,0,115,101,116,72,101,105,103,104,116,0,115,101,116,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,72,101,105,103,104,116,65,117,116,111,0,115,101,116,77,105,110,87,105,100,116,104,0,115,101,116,77,105,110,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,105,110,72,101,105,103,104,116,0,115,101,116,77,105,110,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,77,97,120,87,105,100,116,104,0,115,101,116,77,97,120,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,97,120,72,101,105,103,104,116,0,115,101,116,77,97,120,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,65,115,112,101,99,116,82,97,116,105,111,0,115,101,116,66,111,114,100,101,114,0,115,101,116,80,97,100,100,105,110,103,0,115,101,116,80,97,100,100,105,110,103,80,101,114,99,101,110,116,0,103,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,103,101,116,80,111,115,105,116,105,111,110,0,103,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,103,101,116,65,108,105,103,110,73,116,101,109,115,0,103,101,116,65,108,105,103,110,83,101,108,102,0,103,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,103,101,116,70,108,101,120,87,114,97,112,0,103,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,103,101,116,77,97,114,103,105,110,0,103,101,116,70,108,101,120,66,97,115,105,115,0,103,101,116,70,108,101,120,71,114,111,119,0,103,101,116,70,108,101,120,83,104,114,105,110,107,0,103,101,116,87,105,100,116,104,0,103,101,116,72,101,105,103,104,116,0,103,101,116,77,105,110,87,105,100,116,104,0,103,101,116,77,105,110,72,101,105,103,104,116,0,103,101,116,77,97,120,87,105,100,116,104,0,103,101,116,77,97,120,72,101,105,103,104,116,0,103,101,116,65,115,112,101,99,116,82,97,116,105,111,0,103,101,116,66,111,114,100,101,114,0,103,101,116,79,118,101,114,102,108,111,119,0,103,101,116,68,105,115,112,108,97,121,0,103,101,116,80,97,100,100,105,110,103,0,105,110,115,101,114,116,67,104,105,108,100,0,114,101,109,111,118,101,67,104,105,108,100,0,103,101,116,67,104,105,108,100,67,111,117,110,116,0,103,101,116,80,97,114,101,110,116,0,103,101,116,67,104,105,108,100,0,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,117,110,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,109,97,114,107,68,105,114,116,121,0,105,115,68,105,114,116,121,0,99,97,108,99,117,108,97,116,101,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,76,101,102,116,0,103,101,116,67,111,109,112,117,116,101,100,82,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,84,111,112,0,103,101,116,67,111,109,112,117,116,101,100,66,111,116,116,111,109,0,103,101,116,67,111,109,112,117,116,101,100,87,105,100,116,104,0,103,101,116,67,111,109,112,117,116,101,100,72,101,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,77,97,114,103,105,110,0,103,101,116,67,111,109,112,117,116,101,100,66,111,114,100,101,114,0,103,101,116,67,111,109,112,117,116,101,100,80,97,100,100,105,110,103,0,67,111,110,102,105,103,0,99,114,101,97,116,101,0,115,101,116,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,115,101,116,80,111,105,110,116,83,99,97,108,101,70,97,99,116,111,114,0,105,115,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,86,97,108,117,101,0,76,97,121,111,117,116,0,83,105,122,101,0,103,101,116,73,110,115,116,97,110,99,101,67,111,117,110,116,0,73,110,116,54,52,0,1,1,1,2,2,4,4,4,4,8,8,4,8,118,111,105,100,0,98,111,111,108,0,115,116,100,58,58,115,116,114,105,110,103,0,99,98,70,117,110,99,116,105,111,110,32,38,0,99,111,110,115,116,32,99,98,70,117,110,99,116,105,111,110,32,38,0,69,120,116,101,114,110,97,108,0,66,117,102,102,101,114,0,78,66,105,110,100,73,68,0,78,66,105,110,100,0,98,105,110,100,95,118,97,108,117,101,0,114,101,102,108,101,99,116,0,113,117,101,114,121,84,121,112,101,0,108,97,108,108,111,99,0,108,114,101,115,101,116,0,123,114,101,116,117,114,110,40,95,110,98,105,110,100,46,99,97,108,108,98,97,99,107,83,105,103,110,97,116,117,114,101,76,105,115,116,91,36,48,93,46,97,112,112,108,121,40,116,104,105,115,44,97,114,103,117,109,101,110,116,115,41,41,59,125,0,95,110,98,105,110,100,95,110,101,119,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;STATICTOP+=16;function _atexit(t,e){__ATEXIT__.unshift({func:t,arg:e})}function ___cxa_atexit(){return _atexit.apply(null,arguments)}function _abort(){Module.abort()}function __ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj(){Module.printErr("missing function: _ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj"),abort(-1)}function __decorate(t,e,r,o){var a=arguments.length,n=a<3?e:o===null?o=Object.getOwnPropertyDescriptor(e,r):o,u;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")n=Reflect.decorate(t,e,r,o);else for(var A=t.length-1;A>=0;A--)(u=t[A])&&(n=(a<3?u(n):a>3?u(e,r,n):u(e,r))||n);return a>3&&n&&Object.defineProperty(e,r,n),n}function _defineHidden(t){return function(e,r){Object.defineProperty(e,r,{configurable:!1,enumerable:!1,value:t,writable:!0})}}var _nbind={};function __nbind_free_external(t){_nbind.externalList[t].dereference(t)}function __nbind_reference_external(t){_nbind.externalList[t].reference()}function _llvm_stackrestore(t){var e=_llvm_stacksave,r=e.LLVM_SAVEDSTACKS[t];e.LLVM_SAVEDSTACKS.splice(t,1),Runtime.stackRestore(r)}function __nbind_register_pool(t,e,r,o){_nbind.Pool.pageSize=t,_nbind.Pool.usedPtr=e/4,_nbind.Pool.rootPtr=r,_nbind.Pool.pagePtr=o/4,HEAP32[e/4]=16909060,HEAP8[e]==1&&(_nbind.bigEndian=!0),HEAP32[e/4]=0,_nbind.makeTypeKindTbl=(n={},n[1024]=_nbind.PrimitiveType,n[64]=_nbind.Int64Type,n[2048]=_nbind.BindClass,n[3072]=_nbind.BindClassPtr,n[4096]=_nbind.SharedClassPtr,n[5120]=_nbind.ArrayType,n[6144]=_nbind.ArrayType,n[7168]=_nbind.CStringType,n[9216]=_nbind.CallbackType,n[10240]=_nbind.BindType,n),_nbind.makeTypeNameTbl={Buffer:_nbind.BufferType,External:_nbind.ExternalType,Int64:_nbind.Int64Type,_nbind_new:_nbind.CreateValueType,bool:_nbind.BooleanType,"cbFunction &":_nbind.CallbackType,"const cbFunction &":_nbind.CallbackType,"const std::string &":_nbind.StringType,"std::string":_nbind.StringType},Module.toggleLightGC=_nbind.toggleLightGC,_nbind.callUpcast=Module.dynCall_ii;var a=_nbind.makeType(_nbind.constructType,{flags:2048,id:0,name:""});a.proto=Module,_nbind.BindClass.list.push(a);var n}function _emscripten_set_main_loop_timing(t,e){if(Browser.mainLoop.timingMode=t,Browser.mainLoop.timingValue=e,!Browser.mainLoop.func)return 1;if(t==0)Browser.mainLoop.scheduler=function(){var u=Math.max(0,Browser.mainLoop.tickStartTime+e-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,u)},Browser.mainLoop.method="timeout";else if(t==1)Browser.mainLoop.scheduler=function(){Browser.requestAnimationFrame(Browser.mainLoop.runner)},Browser.mainLoop.method="rAF";else if(t==2){if(!window.setImmediate){let n=function(u){u.source===window&&u.data===o&&(u.stopPropagation(),r.shift()())};var a=n,r=[],o="setimmediate";window.addEventListener("message",n,!0),window.setImmediate=function(A){r.push(A),ENVIRONMENT_IS_WORKER?(Module.setImmediates===void 0&&(Module.setImmediates=[]),Module.setImmediates.push(A),window.postMessage({target:o})):window.postMessage(o,"*")}}Browser.mainLoop.scheduler=function(){window.setImmediate(Browser.mainLoop.runner)},Browser.mainLoop.method="immediate"}return 0}function _emscripten_get_now(){abort()}function _emscripten_set_main_loop(t,e,r,o,a){Module.noExitRuntime=!0,assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters."),Browser.mainLoop.func=t,Browser.mainLoop.arg=o;var n;typeof o<"u"?n=function(){Module.dynCall_vi(t,o)}:n=function(){Module.dynCall_v(t)};var u=Browser.mainLoop.currentlyRunningMainloop;if(Browser.mainLoop.runner=function(){if(!ABORT){if(Browser.mainLoop.queue.length>0){var p=Date.now(),h=Browser.mainLoop.queue.shift();if(h.func(h.arg),Browser.mainLoop.remainingBlockers){var E=Browser.mainLoop.remainingBlockers,w=E%1==0?E-1:Math.floor(E);h.counted?Browser.mainLoop.remainingBlockers=w:(w=w+.5,Browser.mainLoop.remainingBlockers=(8*E+w)/9)}if(console.log('main loop blocker "'+h.name+'" took '+(Date.now()-p)+" ms"),Browser.mainLoop.updateStatus(),u1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else Browser.mainLoop.timingMode==0&&(Browser.mainLoop.tickStartTime=_emscripten_get_now());Browser.mainLoop.method==="timeout"&&Module.ctx&&(Module.printErr("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!"),Browser.mainLoop.method=""),Browser.mainLoop.runIter(n),!(u0?_emscripten_set_main_loop_timing(0,1e3/e):_emscripten_set_main_loop_timing(1,1),Browser.mainLoop.scheduler()),r)throw"SimulateInfiniteLoop"}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null,Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var t=Browser.mainLoop.timingMode,e=Browser.mainLoop.timingValue,r=Browser.mainLoop.func;Browser.mainLoop.func=null,_emscripten_set_main_loop(r,0,!1,Browser.mainLoop.arg,!0),_emscripten_set_main_loop_timing(t,e),Browser.mainLoop.scheduler()},updateStatus:function(){if(Module.setStatus){var t=Module.statusMessage||"Please wait...",e=Browser.mainLoop.remainingBlockers,r=Browser.mainLoop.expectedBlockers;e?e"u"&&(console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available."),Module.noImageDecoding=!0);var t={};t.canHandle=function(n){return!Module.noImageDecoding&&/\.(jpg|jpeg|png|bmp)$/i.test(n)},t.handle=function(n,u,A,p){var h=null;if(Browser.hasBlobConstructor)try{h=new Blob([n],{type:Browser.getMimetype(u)}),h.size!==n.length&&(h=new Blob([new Uint8Array(n).buffer],{type:Browser.getMimetype(u)}))}catch(b){Runtime.warnOnce("Blob constructor present but fails: "+b+"; falling back to blob builder")}if(!h){var E=new Browser.BlobBuilder;E.append(new Uint8Array(n).buffer),h=E.getBlob()}var w=Browser.URLObject.createObjectURL(h),v=new Image;v.onload=function(){assert(v.complete,"Image "+u+" could not be decoded");var C=document.createElement("canvas");C.width=v.width,C.height=v.height;var R=C.getContext("2d");R.drawImage(v,0,0),Module.preloadedImages[u]=C,Browser.URLObject.revokeObjectURL(w),A&&A(n)},v.onerror=function(C){console.log("Image "+w+" could not be decoded"),p&&p()},v.src=w},Module.preloadPlugins.push(t);var e={};e.canHandle=function(n){return!Module.noAudioDecoding&&n.substr(-4)in{".ogg":1,".wav":1,".mp3":1}},e.handle=function(n,u,A,p){var h=!1;function E(R){h||(h=!0,Module.preloadedAudios[u]=R,A&&A(n))}function w(){h||(h=!0,Module.preloadedAudios[u]=new Audio,p&&p())}if(Browser.hasBlobConstructor){try{var v=new Blob([n],{type:Browser.getMimetype(u)})}catch{return w()}var b=Browser.URLObject.createObjectURL(v),C=new Audio;C.addEventListener("canplaythrough",function(){E(C)},!1),C.onerror=function(L){if(h)return;console.log("warning: browser could not fully decode audio "+u+", trying slower base64 approach");function _(V){for(var re="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",oe="=",pe="",he=0,ve=0,ge=0;ge=6;){var le=he>>ve-6&63;ve-=6,pe+=re[le]}return ve==2?(pe+=re[(he&3)<<4],pe+=oe+oe):ve==4&&(pe+=re[(he&15)<<2],pe+=oe),pe}C.src="data:audio/x-"+u.substr(-3)+";base64,"+_(n),E(C)},C.src=b,Browser.safeSetTimeout(function(){E(C)},1e4)}else return w()},Module.preloadPlugins.push(e);function r(){Browser.pointerLock=document.pointerLockElement===Module.canvas||document.mozPointerLockElement===Module.canvas||document.webkitPointerLockElement===Module.canvas||document.msPointerLockElement===Module.canvas}var o=Module.canvas;o&&(o.requestPointerLock=o.requestPointerLock||o.mozRequestPointerLock||o.webkitRequestPointerLock||o.msRequestPointerLock||function(){},o.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||document.msExitPointerLock||function(){},o.exitPointerLock=o.exitPointerLock.bind(document),document.addEventListener("pointerlockchange",r,!1),document.addEventListener("mozpointerlockchange",r,!1),document.addEventListener("webkitpointerlockchange",r,!1),document.addEventListener("mspointerlockchange",r,!1),Module.elementPointerLock&&o.addEventListener("click",function(a){!Browser.pointerLock&&Module.canvas.requestPointerLock&&(Module.canvas.requestPointerLock(),a.preventDefault())},!1))},createContext:function(t,e,r,o){if(e&&Module.ctx&&t==Module.canvas)return Module.ctx;var a,n;if(e){var u={antialias:!1,alpha:!1};if(o)for(var A in o)u[A]=o[A];n=GL.createContext(t,u),n&&(a=GL.getContext(n).GLctx)}else a=t.getContext("2d");return a?(r&&(e||assert(typeof GLctx>"u","cannot set in module if GLctx is used, but we are a non-GL context that would replace it"),Module.ctx=a,e&&GL.makeContextCurrent(n),Module.useWebGL=e,Browser.moduleContextCreatedCallbacks.forEach(function(p){p()}),Browser.init()),a):null},destroyContext:function(t,e,r){},fullscreenHandlersInstalled:!1,lockPointer:void 0,resizeCanvas:void 0,requestFullscreen:function(t,e,r){Browser.lockPointer=t,Browser.resizeCanvas=e,Browser.vrDevice=r,typeof Browser.lockPointer>"u"&&(Browser.lockPointer=!0),typeof Browser.resizeCanvas>"u"&&(Browser.resizeCanvas=!1),typeof Browser.vrDevice>"u"&&(Browser.vrDevice=null);var o=Module.canvas;function a(){Browser.isFullscreen=!1;var u=o.parentNode;(document.fullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.webkitFullscreenElement||document.webkitCurrentFullScreenElement)===u?(o.exitFullscreen=document.exitFullscreen||document.cancelFullScreen||document.mozCancelFullScreen||document.msExitFullscreen||document.webkitCancelFullScreen||function(){},o.exitFullscreen=o.exitFullscreen.bind(document),Browser.lockPointer&&o.requestPointerLock(),Browser.isFullscreen=!0,Browser.resizeCanvas&&Browser.setFullscreenCanvasSize()):(u.parentNode.insertBefore(o,u),u.parentNode.removeChild(u),Browser.resizeCanvas&&Browser.setWindowedCanvasSize()),Module.onFullScreen&&Module.onFullScreen(Browser.isFullscreen),Module.onFullscreen&&Module.onFullscreen(Browser.isFullscreen),Browser.updateCanvasDimensions(o)}Browser.fullscreenHandlersInstalled||(Browser.fullscreenHandlersInstalled=!0,document.addEventListener("fullscreenchange",a,!1),document.addEventListener("mozfullscreenchange",a,!1),document.addEventListener("webkitfullscreenchange",a,!1),document.addEventListener("MSFullscreenChange",a,!1));var n=document.createElement("div");o.parentNode.insertBefore(n,o),n.appendChild(o),n.requestFullscreen=n.requestFullscreen||n.mozRequestFullScreen||n.msRequestFullscreen||(n.webkitRequestFullscreen?function(){n.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}:null)||(n.webkitRequestFullScreen?function(){n.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:null),r?n.requestFullscreen({vrDisplay:r}):n.requestFullscreen()},requestFullScreen:function(t,e,r){return Module.printErr("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead."),Browser.requestFullScreen=function(o,a,n){return Browser.requestFullscreen(o,a,n)},Browser.requestFullscreen(t,e,r)},nextRAF:0,fakeRequestAnimationFrame:function(t){var e=Date.now();if(Browser.nextRAF===0)Browser.nextRAF=e+1e3/60;else for(;e+2>=Browser.nextRAF;)Browser.nextRAF+=1e3/60;var r=Math.max(Browser.nextRAF-e,0);setTimeout(t,r)},requestAnimationFrame:function t(e){typeof window>"u"?Browser.fakeRequestAnimationFrame(e):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||Browser.fakeRequestAnimationFrame),window.requestAnimationFrame(e))},safeCallback:function(t){return function(){if(!ABORT)return t.apply(null,arguments)}},allowAsyncCallbacks:!0,queuedAsyncCallbacks:[],pauseAsyncCallbacks:function(){Browser.allowAsyncCallbacks=!1},resumeAsyncCallbacks:function(){if(Browser.allowAsyncCallbacks=!0,Browser.queuedAsyncCallbacks.length>0){var t=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[],t.forEach(function(e){e()})}},safeRequestAnimationFrame:function(t){return Browser.requestAnimationFrame(function(){ABORT||(Browser.allowAsyncCallbacks?t():Browser.queuedAsyncCallbacks.push(t))})},safeSetTimeout:function(t,e){return Module.noExitRuntime=!0,setTimeout(function(){ABORT||(Browser.allowAsyncCallbacks?t():Browser.queuedAsyncCallbacks.push(t))},e)},safeSetInterval:function(t,e){return Module.noExitRuntime=!0,setInterval(function(){ABORT||Browser.allowAsyncCallbacks&&t()},e)},getMimetype:function(t){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[t.substr(t.lastIndexOf(".")+1)]},getUserMedia:function(t){window.getUserMedia||(window.getUserMedia=navigator.getUserMedia||navigator.mozGetUserMedia),window.getUserMedia(t)},getMovementX:function(t){return t.movementX||t.mozMovementX||t.webkitMovementX||0},getMovementY:function(t){return t.movementY||t.mozMovementY||t.webkitMovementY||0},getMouseWheelDelta:function(t){var e=0;switch(t.type){case"DOMMouseScroll":e=t.detail;break;case"mousewheel":e=t.wheelDelta;break;case"wheel":e=t.deltaY;break;default:throw"unrecognized mouse wheel event: "+t.type}return e},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(t){if(Browser.pointerLock)t.type!="mousemove"&&"mozMovementX"in t?Browser.mouseMovementX=Browser.mouseMovementY=0:(Browser.mouseMovementX=Browser.getMovementX(t),Browser.mouseMovementY=Browser.getMovementY(t)),typeof SDL<"u"?(Browser.mouseX=SDL.mouseX+Browser.mouseMovementX,Browser.mouseY=SDL.mouseY+Browser.mouseMovementY):(Browser.mouseX+=Browser.mouseMovementX,Browser.mouseY+=Browser.mouseMovementY);else{var e=Module.canvas.getBoundingClientRect(),r=Module.canvas.width,o=Module.canvas.height,a=typeof window.scrollX<"u"?window.scrollX:window.pageXOffset,n=typeof window.scrollY<"u"?window.scrollY:window.pageYOffset;if(t.type==="touchstart"||t.type==="touchend"||t.type==="touchmove"){var u=t.touch;if(u===void 0)return;var A=u.pageX-(a+e.left),p=u.pageY-(n+e.top);A=A*(r/e.width),p=p*(o/e.height);var h={x:A,y:p};if(t.type==="touchstart")Browser.lastTouches[u.identifier]=h,Browser.touches[u.identifier]=h;else if(t.type==="touchend"||t.type==="touchmove"){var E=Browser.touches[u.identifier];E||(E=h),Browser.lastTouches[u.identifier]=E,Browser.touches[u.identifier]=h}return}var w=t.pageX-(a+e.left),v=t.pageY-(n+e.top);w=w*(r/e.width),v=v*(o/e.height),Browser.mouseMovementX=w-Browser.mouseX,Browser.mouseMovementY=v-Browser.mouseY,Browser.mouseX=w,Browser.mouseY=v}},asyncLoad:function(t,e,r,o){var a=o?"":"al "+t;Module.readAsync(t,function(n){assert(n,'Loading data file "'+t+'" failed (no arrayBuffer).'),e(new Uint8Array(n)),a&&removeRunDependency(a)},function(n){if(r)r();else throw'Loading data file "'+t+'" failed.'}),a&&addRunDependency(a)},resizeListeners:[],updateResizeListeners:function(){var t=Module.canvas;Browser.resizeListeners.forEach(function(e){e(t.width,t.height)})},setCanvasSize:function(t,e,r){var o=Module.canvas;Browser.updateCanvasDimensions(o,t,e),r||Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL<"u"){var t=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];t=t|8388608,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=t}Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL<"u"){var t=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];t=t&-8388609,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=t}Browser.updateResizeListeners()},updateCanvasDimensions:function(t,e,r){e&&r?(t.widthNative=e,t.heightNative=r):(e=t.widthNative,r=t.heightNative);var o=e,a=r;if(Module.forcedAspectRatio&&Module.forcedAspectRatio>0&&(o/a>2];return e},getStr:function(){var t=Pointer_stringify(SYSCALLS.get());return t},get64:function(){var t=SYSCALLS.get(),e=SYSCALLS.get();return t>=0?assert(e===0):assert(e===-1),t},getZero:function(){assert(SYSCALLS.get()===0)}};function ___syscall6(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.getStreamFromFD();return FS.close(r),0}catch(o){return(typeof FS>"u"||!(o instanceof FS.ErrnoError))&&abort(o),-o.errno}}function ___syscall54(t,e){SYSCALLS.varargs=e;try{return 0}catch(r){return(typeof FS>"u"||!(r instanceof FS.ErrnoError))&&abort(r),-r.errno}}function _typeModule(t){var e=[[0,1,"X"],[1,1,"const X"],[128,1,"X *"],[256,1,"X &"],[384,1,"X &&"],[512,1,"std::shared_ptr"],[640,1,"std::unique_ptr"],[5120,1,"std::vector"],[6144,2,"std::array"],[9216,-1,"std::function"]];function r(p,h,E,w,v,b){if(h==1){var C=w&896;(C==128||C==256||C==384)&&(p="X const")}var R;return b?R=E.replace("X",p).replace("Y",v):R=p.replace("X",E).replace("Y",v),R.replace(/([*&]) (?=[*&])/g,"$1")}function o(p,h,E,w,v){throw new Error(p+" type "+E.replace("X",h+"?")+(w?" with flag "+w:"")+" in "+v)}function a(p,h,E,w,v,b,C,R){b===void 0&&(b="X"),R===void 0&&(R=1);var L=E(p);if(L)return L;var _=w(p),V=_.placeholderFlag,re=e[V];C&&re&&(b=r(C[2],C[0],b,re[0],"?",!0));var oe;V==0&&(oe="Unbound"),V>=10&&(oe="Corrupt"),R>20&&(oe="Deeply nested"),oe&&o(oe,p,b,V,v||"?");var pe=_.paramList[0],he=a(pe,h,E,w,v,b,re,R+1),ve,ge={flags:re[0],id:p,name:"",paramList:[he]},le=[],Pe="?";switch(_.placeholderFlag){case 1:ve=he.spec;break;case 2:if((he.flags&15360)==1024&&he.spec.ptrSize==1){ge.flags=7168;break}case 3:case 6:case 5:ve=he.spec,he.flags&15360;break;case 8:Pe=""+_.paramList[1],ge.paramList.push(_.paramList[1]);break;case 9:for(var g=0,De=_.paramList[1];g>2]=t),t}function _llvm_stacksave(){var t=_llvm_stacksave;return t.LLVM_SAVEDSTACKS||(t.LLVM_SAVEDSTACKS=[]),t.LLVM_SAVEDSTACKS.push(Runtime.stackSave()),t.LLVM_SAVEDSTACKS.length-1}function ___syscall140(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.getStreamFromFD(),o=SYSCALLS.get(),a=SYSCALLS.get(),n=SYSCALLS.get(),u=SYSCALLS.get(),A=a;return FS.llseek(r,A,u),HEAP32[n>>2]=r.position,r.getdents&&A===0&&u===0&&(r.getdents=null),0}catch(p){return(typeof FS>"u"||!(p instanceof FS.ErrnoError))&&abort(p),-p.errno}}function ___syscall146(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.get(),o=SYSCALLS.get(),a=SYSCALLS.get(),n=0;___syscall146.buffer||(___syscall146.buffers=[null,[],[]],___syscall146.printChar=function(E,w){var v=___syscall146.buffers[E];assert(v),w===0||w===10?((E===1?Module.print:Module.printErr)(UTF8ArrayToString(v,0)),v.length=0):v.push(w)});for(var u=0;u>2],p=HEAP32[o+(u*8+4)>>2],h=0;h"u"||!(E instanceof FS.ErrnoError))&&abort(E),-E.errno}}function __nbind_finish(){for(var t=0,e=_nbind.BindClass.list;tt.pageSize/2||e>t.pageSize-r){var o=_nbind.typeNameTbl.NBind.proto;return o.lalloc(e)}else return HEAPU32[t.usedPtr]=r+e,t.rootPtr+r},t.lreset=function(e,r){var o=HEAPU32[t.pagePtr];if(o){var a=_nbind.typeNameTbl.NBind.proto;a.lreset(e,r)}else HEAPU32[t.usedPtr]=e},t}();_nbind.Pool=Pool;function constructType(t,e){var r=t==10240?_nbind.makeTypeNameTbl[e.name]||_nbind.BindType:_nbind.makeTypeKindTbl[t],o=new r(e);return typeIdTbl[e.id]=o,_nbind.typeNameTbl[e.name]=o,o}_nbind.constructType=constructType;function getType(t){return typeIdTbl[t]}_nbind.getType=getType;function queryType(t){var e=HEAPU8[t],r=_nbind.structureList[e][1];t/=4,r<0&&(++t,r=HEAPU32[t]+1);var o=Array.prototype.slice.call(HEAPU32.subarray(t+1,t+1+r));return e==9&&(o=[o[0],o.slice(1)]),{paramList:o,placeholderFlag:e}}_nbind.queryType=queryType;function getTypes(t,e){return t.map(function(r){return typeof r=="number"?_nbind.getComplexType(r,constructType,getType,queryType,e):_nbind.typeNameTbl[r]})}_nbind.getTypes=getTypes;function readTypeIdList(t,e){return Array.prototype.slice.call(HEAPU32,t/4,t/4+e)}_nbind.readTypeIdList=readTypeIdList;function readAsciiString(t){for(var e=t;HEAPU8[e++];);return String.fromCharCode.apply("",HEAPU8.subarray(t,e-1))}_nbind.readAsciiString=readAsciiString;function readPolicyList(t){var e={};if(t)for(;;){var r=HEAPU32[t/4];if(!r)break;e[readAsciiString(r)]=!0,t+=4}return e}_nbind.readPolicyList=readPolicyList;function getDynCall(t,e){var r={float32_t:"d",float64_t:"d",int64_t:"d",uint64_t:"d",void:"v"},o=t.map(function(n){return r[n.name]||"i"}).join(""),a=Module["dynCall_"+o];if(!a)throw new Error("dynCall_"+o+" not found for "+e+"("+t.map(function(n){return n.name}).join(", ")+")");return a}_nbind.getDynCall=getDynCall;function addMethod(t,e,r,o){var a=t[e];t.hasOwnProperty(e)&&a?((a.arity||a.arity===0)&&(a=_nbind.makeOverloader(a,a.arity),t[e]=a),a.addMethod(r,o)):(r.arity=o,t[e]=r)}_nbind.addMethod=addMethod;function throwError(t){throw new Error(t)}_nbind.throwError=throwError,_nbind.bigEndian=!1,_a=_typeModule(_typeModule),_nbind.Type=_a.Type,_nbind.makeType=_a.makeType,_nbind.getComplexType=_a.getComplexType,_nbind.structureList=_a.structureList;var BindType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.heap=HEAPU32,r.ptrSize=4,r}return e.prototype.needsWireRead=function(r){return!!this.wireRead||!!this.makeWireRead},e.prototype.needsWireWrite=function(r){return!!this.wireWrite||!!this.makeWireWrite},e}(_nbind.Type);_nbind.BindType=BindType;var PrimitiveType=function(t){__extends(e,t);function e(r){var o=t.call(this,r)||this,a=r.flags&32?{32:HEAPF32,64:HEAPF64}:r.flags&8?{8:HEAPU8,16:HEAPU16,32:HEAPU32}:{8:HEAP8,16:HEAP16,32:HEAP32};return o.heap=a[r.ptrSize*8],o.ptrSize=r.ptrSize,o}return e.prototype.needsWireWrite=function(r){return!!r&&!!r.Strict},e.prototype.makeWireWrite=function(r,o){return o&&o.Strict&&function(a){if(typeof a=="number")return a;throw new Error("Type mismatch")}},e}(BindType);_nbind.PrimitiveType=PrimitiveType;function pushCString(t,e){if(t==null){if(e&&e.Nullable)return 0;throw new Error("Type mismatch")}if(e&&e.Strict){if(typeof t!="string")throw new Error("Type mismatch")}else t=t.toString();var r=Module.lengthBytesUTF8(t)+1,o=_nbind.Pool.lalloc(r);return Module.stringToUTF8Array(t,HEAPU8,o,r),o}_nbind.pushCString=pushCString;function popCString(t){return t===0?null:Module.Pointer_stringify(t)}_nbind.popCString=popCString;var CStringType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireRead=popCString,r.wireWrite=pushCString,r.readResources=[_nbind.resources.pool],r.writeResources=[_nbind.resources.pool],r}return e.prototype.makeWireWrite=function(r,o){return function(a){return pushCString(a,o)}},e}(BindType);_nbind.CStringType=CStringType;var BooleanType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireRead=function(o){return!!o},r}return e.prototype.needsWireWrite=function(r){return!!r&&!!r.Strict},e.prototype.makeWireRead=function(r){return"!!("+r+")"},e.prototype.makeWireWrite=function(r,o){return o&&o.Strict&&function(a){if(typeof a=="boolean")return a;throw new Error("Type mismatch")}||r},e}(BindType);_nbind.BooleanType=BooleanType;var Wrapper=function(){function t(){}return t.prototype.persist=function(){this.__nbindState|=1},t}();_nbind.Wrapper=Wrapper;function makeBound(t,e){var r=function(o){__extends(a,o);function a(n,u,A,p){var h=o.call(this)||this;if(!(h instanceof a))return new(Function.prototype.bind.apply(a,Array.prototype.concat.apply([null],arguments)));var E=u,w=A,v=p;if(n!==_nbind.ptrMarker){var b=h.__nbindConstructor.apply(h,arguments);E=4608,v=HEAPU32[b/4],w=HEAPU32[b/4+1]}var C={configurable:!0,enumerable:!1,value:null,writable:!1},R={__nbindFlags:E,__nbindPtr:w};v&&(R.__nbindShared=v,_nbind.mark(h));for(var L=0,_=Object.keys(R);L<_.length;L++){var V=_[L];C.value=R[V],Object.defineProperty(h,V,C)}return _defineHidden(0)(h,"__nbindState"),h}return a.prototype.free=function(){e.destroy.call(this,this.__nbindShared,this.__nbindFlags),this.__nbindState|=2,disableMember(this,"__nbindShared"),disableMember(this,"__nbindPtr")},a}(Wrapper);return __decorate([_defineHidden()],r.prototype,"__nbindConstructor",void 0),__decorate([_defineHidden()],r.prototype,"__nbindValueConstructor",void 0),__decorate([_defineHidden(t)],r.prototype,"__nbindPolicies",void 0),r}_nbind.makeBound=makeBound;function disableMember(t,e){function r(){throw new Error("Accessing deleted object")}Object.defineProperty(t,e,{configurable:!1,enumerable:!1,get:r,set:r})}_nbind.ptrMarker={};var BindClass=function(t){__extends(e,t);function e(r){var o=t.call(this,r)||this;return o.wireRead=function(a){return _nbind.popValue(a,o.ptrType)},o.wireWrite=function(a){return pushPointer(a,o.ptrType,!0)},o.pendingSuperCount=0,o.ready=!1,o.methodTbl={},r.paramList?(o.classType=r.paramList[0].classType,o.proto=o.classType.proto):o.classType=o,o}return e.prototype.makeBound=function(r){var o=_nbind.makeBound(r,this);return this.proto=o,this.ptrType.proto=o,o},e.prototype.addMethod=function(r){var o=this.methodTbl[r.name]||[];o.push(r),this.methodTbl[r.name]=o},e.prototype.registerMethods=function(r,o){for(var a,n=0,u=Object.keys(r.methodTbl);n>=1;var r=_nbind.valueList[t];return _nbind.valueList[t]=firstFreeValue,firstFreeValue=t,r}else{if(e)return _nbind.popShared(t,e);throw new Error("Invalid value slot "+t)}}_nbind.popValue=popValue;var valueBase=18446744073709552e3;function push64(t){return typeof t=="number"?t:pushValue(t)*4096+valueBase}function pop64(t){return t=3?u=Buffer.from(n):u=new Buffer(n),u.copy(o)}else getBuffer(o).set(n)}}_nbind.commitBuffer=commitBuffer;var dirtyList=[],gcTimer=0;function sweep(){for(var t=0,e=dirtyList;t>2]=DYNAMIC_BASE,staticSealed=!0;function invoke_viiiii(t,e,r,o,a,n){try{Module.dynCall_viiiii(t,e,r,o,a,n)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_vif(t,e,r){try{Module.dynCall_vif(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_vid(t,e,r){try{Module.dynCall_vid(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_fiff(t,e,r,o){try{return Module.dynCall_fiff(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_vi(t,e){try{Module.dynCall_vi(t,e)}catch(r){if(typeof r!="number"&&r!=="longjmp")throw r;Module.setThrew(1,0)}}function invoke_vii(t,e,r){try{Module.dynCall_vii(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_ii(t,e){try{return Module.dynCall_ii(t,e)}catch(r){if(typeof r!="number"&&r!=="longjmp")throw r;Module.setThrew(1,0)}}function invoke_viddi(t,e,r,o,a){try{Module.dynCall_viddi(t,e,r,o,a)}catch(n){if(typeof n!="number"&&n!=="longjmp")throw n;Module.setThrew(1,0)}}function invoke_vidd(t,e,r,o){try{Module.dynCall_vidd(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_iiii(t,e,r,o){try{return Module.dynCall_iiii(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_diii(t,e,r,o){try{return Module.dynCall_diii(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_di(t,e){try{return Module.dynCall_di(t,e)}catch(r){if(typeof r!="number"&&r!=="longjmp")throw r;Module.setThrew(1,0)}}function invoke_iid(t,e,r){try{return Module.dynCall_iid(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_iii(t,e,r){try{return Module.dynCall_iii(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_viiddi(t,e,r,o,a,n){try{Module.dynCall_viiddi(t,e,r,o,a,n)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_viiiiii(t,e,r,o,a,n,u){try{Module.dynCall_viiiiii(t,e,r,o,a,n,u)}catch(A){if(typeof A!="number"&&A!=="longjmp")throw A;Module.setThrew(1,0)}}function invoke_dii(t,e,r){try{return Module.dynCall_dii(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_i(t){try{return Module.dynCall_i(t)}catch(e){if(typeof e!="number"&&e!=="longjmp")throw e;Module.setThrew(1,0)}}function invoke_iiiiii(t,e,r,o,a,n){try{return Module.dynCall_iiiiii(t,e,r,o,a,n)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_viiid(t,e,r,o,a){try{Module.dynCall_viiid(t,e,r,o,a)}catch(n){if(typeof n!="number"&&n!=="longjmp")throw n;Module.setThrew(1,0)}}function invoke_viififi(t,e,r,o,a,n,u){try{Module.dynCall_viififi(t,e,r,o,a,n,u)}catch(A){if(typeof A!="number"&&A!=="longjmp")throw A;Module.setThrew(1,0)}}function invoke_viii(t,e,r,o){try{Module.dynCall_viii(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_v(t){try{Module.dynCall_v(t)}catch(e){if(typeof e!="number"&&e!=="longjmp")throw e;Module.setThrew(1,0)}}function invoke_viid(t,e,r,o){try{Module.dynCall_viid(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_idd(t,e,r){try{return Module.dynCall_idd(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_viiii(t,e,r,o,a){try{Module.dynCall_viiii(t,e,r,o,a)}catch(n){if(typeof n!="number"&&n!=="longjmp")throw n;Module.setThrew(1,0)}}Module.asmGlobalArg={Math,Int8Array,Int16Array,Int32Array,Uint8Array,Uint16Array,Uint32Array,Float32Array,Float64Array,NaN:NaN,Infinity:1/0},Module.asmLibraryArg={abort,assert,enlargeMemory,getTotalMemory,abortOnCannotGrowMemory,invoke_viiiii,invoke_vif,invoke_vid,invoke_fiff,invoke_vi,invoke_vii,invoke_ii,invoke_viddi,invoke_vidd,invoke_iiii,invoke_diii,invoke_di,invoke_iid,invoke_iii,invoke_viiddi,invoke_viiiiii,invoke_dii,invoke_i,invoke_iiiiii,invoke_viiid,invoke_viififi,invoke_viii,invoke_v,invoke_viid,invoke_idd,invoke_viiii,_emscripten_asm_const_iiiii,_emscripten_asm_const_iiidddddd,_emscripten_asm_const_iiiid,__nbind_reference_external,_emscripten_asm_const_iiiiiiii,_removeAccessorPrefix,_typeModule,__nbind_register_pool,__decorate,_llvm_stackrestore,___cxa_atexit,__extends,__nbind_get_value_object,__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,_emscripten_set_main_loop_timing,__nbind_register_primitive,__nbind_register_type,_emscripten_memcpy_big,__nbind_register_function,___setErrNo,__nbind_register_class,__nbind_finish,_abort,_nbind_value,_llvm_stacksave,___syscall54,_defineHidden,_emscripten_set_main_loop,_emscripten_get_now,__nbind_register_callback_signature,_emscripten_asm_const_iiiiii,__nbind_free_external,_emscripten_asm_const_iiii,_emscripten_asm_const_iiididi,___syscall6,_atexit,___syscall140,___syscall146,DYNAMICTOP_PTR,tempDoublePtr,ABORT,STACKTOP,STACK_MAX,cttz_i8,___dso_handle};var asm=function(t,e,r){var o=new t.Int8Array(r),a=new t.Int16Array(r),n=new t.Int32Array(r),u=new t.Uint8Array(r),A=new t.Uint16Array(r),p=new t.Uint32Array(r),h=new t.Float32Array(r),E=new t.Float64Array(r),w=e.DYNAMICTOP_PTR|0,v=e.tempDoublePtr|0,b=e.ABORT|0,C=e.STACKTOP|0,R=e.STACK_MAX|0,L=e.cttz_i8|0,_=e.___dso_handle|0,V=0,re=0,oe=0,pe=0,he=t.NaN,ve=t.Infinity,ge=0,le=0,Pe=0,g=0,De=0,Ce=0,de=t.Math.floor,ne=t.Math.abs,Z=t.Math.sqrt,me=t.Math.pow,be=t.Math.cos,ut=t.Math.sin,H=t.Math.tan,yt=t.Math.acos,Me=t.Math.asin,Te=t.Math.atan,Qe=t.Math.atan2,_e=t.Math.exp,qe=t.Math.log,At=t.Math.ceil,Oe=t.Math.imul,x=t.Math.min,I=t.Math.max,P=t.Math.clz32,y=t.Math.fround,F=e.abort,J=e.assert,X=e.enlargeMemory,$=e.getTotalMemory,ie=e.abortOnCannotGrowMemory,ke=e.invoke_viiiii,Ne=e.invoke_vif,st=e.invoke_vid,ht=e.invoke_fiff,Ut=e.invoke_vi,Xt=e.invoke_vii,Pt=e.invoke_ii,tn=e.invoke_viddi,Dr=e.invoke_vidd,fr=e.invoke_iiii,Br=e.invoke_diii,jr=e.invoke_di,Hn=e.invoke_iid,bs=e.invoke_iii,ki=e.invoke_viiddi,gs=e.invoke_viiiiii,to=e.invoke_dii,Di=e.invoke_i,Qs=e.invoke_iiiiii,ro=e.invoke_viiid,pc=e.invoke_viififi,gu=e.invoke_viii,ap=e.invoke_v,lp=e.invoke_viid,ks=e.invoke_idd,En=e.invoke_viiii,no=e._emscripten_asm_const_iiiii,Fs=e._emscripten_asm_const_iiidddddd,Cl=e._emscripten_asm_const_iiiid,El=e.__nbind_reference_external,io=e._emscripten_asm_const_iiiiiiii,Ue=e._removeAccessorPrefix,Fn=e._typeModule,Fi=e.__nbind_register_pool,Rn=e.__decorate,Ui=e._llvm_stackrestore,Zt=e.___cxa_atexit,Ri=e.__extends,$n=e.__nbind_get_value_object,Ma=e.__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,$t=e._emscripten_set_main_loop_timing,hc=e.__nbind_register_primitive,du=e.__nbind_register_type,gc=e._emscripten_memcpy_big,Il=e.__nbind_register_function,PA=e.___setErrNo,mu=e.__nbind_register_class,Ee=e.__nbind_finish,Rt=e._abort,dc=e._nbind_value,_i=e._llvm_stacksave,yu=e.___syscall54,qt=e._defineHidden,wl=e._emscripten_set_main_loop,xA=e._emscripten_get_now,cp=e.__nbind_register_callback_signature,mc=e._emscripten_asm_const_iiiiii,bA=e.__nbind_free_external,Dn=e._emscripten_asm_const_iiii,ui=e._emscripten_asm_const_iiididi,yc=e.___syscall6,QA=e._atexit,ra=e.___syscall140,Hi=e.___syscall146,Oo=y(0);let $e=y(0);function so(s){s=s|0;var l=0;return l=C,C=C+s|0,C=C+15&-16,l|0}function Bl(){return C|0}function Cu(s){s=s|0,C=s}function qi(s,l){s=s|0,l=l|0,C=s,R=l}function Eu(s,l){s=s|0,l=l|0,V||(V=s,re=l)}function kA(s){s=s|0,Ce=s}function Ua(){return Ce|0}function Cc(){var s=0,l=0;Er(8104,8,400)|0,Er(8504,408,540)|0,s=9044,l=s+44|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));o[9088]=0,o[9089]=1,n[2273]=0,n[2274]=948,n[2275]=948,Zt(17,8104,_|0)|0}function ds(s){s=s|0,Be(s+948|0)}function Ot(s){return s=y(s),((bu(s)|0)&2147483647)>>>0>2139095040|0}function Sn(s,l,c){s=s|0,l=l|0,c=c|0;e:do if(n[s+(l<<3)+4>>2]|0)s=s+(l<<3)|0;else{if((l|2|0)==3&&n[s+60>>2]|0){s=s+56|0;break}switch(l|0){case 0:case 2:case 4:case 5:{if(n[s+52>>2]|0){s=s+48|0;break e}break}default:}if(n[s+68>>2]|0){s=s+64|0;break}else{s=(l|1|0)==5?948:c;break}}while(0);return s|0}function di(s){s=s|0;var l=0;return l=$v(1e3)|0,na(s,(l|0)!=0,2456),n[2276]=(n[2276]|0)+1,Er(l|0,8104,1e3)|0,o[s+2>>0]|0&&(n[l+4>>2]=2,n[l+12>>2]=4),n[l+976>>2]=s,l|0}function na(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;d=C,C=C+16|0,f=d,l||(n[f>>2]=c,gg(s,5,3197,f)),C=d}function oo(){return di(956)|0}function Rs(s){s=s|0;var l=0;return l=Gt(1e3)|0,ia(l,s),na(n[s+976>>2]|0,1,2456),n[2276]=(n[2276]|0)+1,n[l+944>>2]=0,l|0}function ia(s,l){s=s|0,l=l|0;var c=0;Er(s|0,l|0,948)|0,Nm(s+948|0,l+948|0),c=s+960|0,s=l+960|0,l=c+40|0;do n[c>>2]=n[s>>2],c=c+4|0,s=s+4|0;while((c|0)<(l|0))}function sa(s){s=s|0;var l=0,c=0,f=0,d=0;if(l=s+944|0,c=n[l>>2]|0,c|0&&(Mo(c+948|0,s)|0,n[l>>2]=0),c=Zi(s)|0,c|0){l=0;do n[(Ts(s,l)|0)+944>>2]=0,l=l+1|0;while((l|0)!=(c|0))}c=s+948|0,f=n[c>>2]|0,d=s+952|0,l=n[d>>2]|0,(l|0)!=(f|0)&&(n[d>>2]=l+(~((l+-4-f|0)>>>2)<<2)),Ns(c),eD(s),n[2276]=(n[2276]|0)+-1}function Mo(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0;f=n[s>>2]|0,Q=s+4|0,c=n[Q>>2]|0,m=c;e:do if((f|0)==(c|0))d=f,B=4;else for(s=f;;){if((n[s>>2]|0)==(l|0)){d=s,B=4;break e}if(s=s+4|0,(s|0)==(c|0)){s=0;break}}while(0);return(B|0)==4&&((d|0)!=(c|0)?(f=d+4|0,s=m-f|0,l=s>>2,l&&(bI(d|0,f|0,s|0)|0,c=n[Q>>2]|0),s=d+(l<<2)|0,(c|0)==(s|0)||(n[Q>>2]=c+(~((c+-4-s|0)>>>2)<<2)),s=1):s=0),s|0}function Zi(s){return s=s|0,(n[s+952>>2]|0)-(n[s+948>>2]|0)>>2|0}function Ts(s,l){s=s|0,l=l|0;var c=0;return c=n[s+948>>2]|0,(n[s+952>>2]|0)-c>>2>>>0>l>>>0?s=n[c+(l<<2)>>2]|0:s=0,s|0}function Ns(s){s=s|0;var l=0,c=0,f=0,d=0;f=C,C=C+32|0,l=f,d=n[s>>2]|0,c=(n[s+4>>2]|0)-d|0,((n[s+8>>2]|0)-d|0)>>>0>c>>>0&&(d=c>>2,Ep(l,d,d,s+8|0),Cg(s,l),_A(l)),C=f}function Ls(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0;M=Zi(s)|0;do if(M|0){if((n[(Ts(s,0)|0)+944>>2]|0)==(s|0)){if(!(Mo(s+948|0,l)|0))break;Er(l+400|0,8504,540)|0,n[l+944>>2]=0,je(s);break}B=n[(n[s+976>>2]|0)+12>>2]|0,Q=s+948|0,k=(B|0)==0,c=0,m=0;do f=n[(n[Q>>2]|0)+(m<<2)>>2]|0,(f|0)==(l|0)?je(s):(d=Rs(f)|0,n[(n[Q>>2]|0)+(c<<2)>>2]=d,n[d+944>>2]=s,k||PR[B&15](f,d,s,c),c=c+1|0),m=m+1|0;while((m|0)!=(M|0));if(c>>>0>>0){k=s+948|0,Q=s+952|0,B=c,c=n[Q>>2]|0;do m=(n[k>>2]|0)+(B<<2)|0,f=m+4|0,d=c-f|0,l=d>>2,l&&(bI(m|0,f|0,d|0)|0,c=n[Q>>2]|0),d=c,f=m+(l<<2)|0,(d|0)!=(f|0)&&(c=d+(~((d+-4-f|0)>>>2)<<2)|0,n[Q>>2]=c),B=B+1|0;while((B|0)!=(M|0))}}while(0)}function ao(s){s=s|0;var l=0,c=0,f=0,d=0;Yn(s,(Zi(s)|0)==0,2491),Yn(s,(n[s+944>>2]|0)==0,2545),l=s+948|0,c=n[l>>2]|0,f=s+952|0,d=n[f>>2]|0,(d|0)!=(c|0)&&(n[f>>2]=d+(~((d+-4-c|0)>>>2)<<2)),Ns(l),l=s+976|0,c=n[l>>2]|0,Er(s|0,8104,1e3)|0,o[c+2>>0]|0&&(n[s+4>>2]=2,n[s+12>>2]=4),n[l>>2]=c}function Yn(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;d=C,C=C+16|0,f=d,l||(n[f>>2]=c,co(s,5,3197,f)),C=d}function qn(){return n[2276]|0}function $i(){var s=0;return s=$v(20)|0,es((s|0)!=0,2592),n[2277]=(n[2277]|0)+1,n[s>>2]=n[239],n[s+4>>2]=n[240],n[s+8>>2]=n[241],n[s+12>>2]=n[242],n[s+16>>2]=n[243],s|0}function es(s,l){s=s|0,l=l|0;var c=0,f=0;f=C,C=C+16|0,c=f,s||(n[c>>2]=l,co(0,5,3197,c)),C=f}function mi(s){s=s|0,eD(s),n[2277]=(n[2277]|0)+-1}function Ha(s,l){s=s|0,l=l|0;var c=0;l?(Yn(s,(Zi(s)|0)==0,2629),c=1):(c=0,l=0),n[s+964>>2]=l,n[s+988>>2]=c}function oa(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,m=f+8|0,d=f+4|0,B=f,n[d>>2]=l,Yn(s,(n[l+944>>2]|0)==0,2709),Yn(s,(n[s+964>>2]|0)==0,2763),ee(s),l=s+948|0,n[B>>2]=(n[l>>2]|0)+(c<<2),n[m>>2]=n[B>>2],we(l,m,d)|0,n[(n[d>>2]|0)+944>>2]=s,je(s),C=f}function ee(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,Q=0;if(c=Zi(s)|0,c|0&&(n[(Ts(s,0)|0)+944>>2]|0)!=(s|0)){f=n[(n[s+976>>2]|0)+12>>2]|0,d=s+948|0,m=(f|0)==0,l=0;do B=n[(n[d>>2]|0)+(l<<2)>>2]|0,Q=Rs(B)|0,n[(n[d>>2]|0)+(l<<2)>>2]=Q,n[Q+944>>2]=s,m||PR[f&15](B,Q,s,l),l=l+1|0;while((l|0)!=(c|0))}}function we(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0,We=0,Le=0,Re=0,et=0,Ze=0;et=C,C=C+64|0,j=et+52|0,Q=et+48|0,se=et+28|0,We=et+24|0,Le=et+20|0,Re=et,f=n[s>>2]|0,m=f,l=f+((n[l>>2]|0)-m>>2<<2)|0,f=s+4|0,d=n[f>>2]|0,B=s+8|0;do if(d>>>0<(n[B>>2]|0)>>>0){if((l|0)==(d|0)){n[l>>2]=n[c>>2],n[f>>2]=(n[f>>2]|0)+4;break}HA(s,l,d,l+4|0),l>>>0<=c>>>0&&(c=(n[f>>2]|0)>>>0>c>>>0?c+4|0:c),n[l>>2]=n[c>>2]}else{f=(d-m>>2)+1|0,d=N(s)|0,d>>>0>>0&&Vr(s),O=n[s>>2]|0,M=(n[B>>2]|0)-O|0,m=M>>1,Ep(Re,M>>2>>>0>>1>>>0?m>>>0>>0?f:m:d,l-O>>2,s+8|0),O=Re+8|0,f=n[O>>2]|0,m=Re+12|0,M=n[m>>2]|0,B=M,k=f;do if((f|0)==(M|0)){if(M=Re+4|0,f=n[M>>2]|0,Ze=n[Re>>2]|0,d=Ze,f>>>0<=Ze>>>0){f=B-d>>1,f=(f|0)==0?1:f,Ep(se,f,f>>>2,n[Re+16>>2]|0),n[We>>2]=n[M>>2],n[Le>>2]=n[O>>2],n[Q>>2]=n[We>>2],n[j>>2]=n[Le>>2],dI(se,Q,j),f=n[Re>>2]|0,n[Re>>2]=n[se>>2],n[se>>2]=f,f=se+4|0,Ze=n[M>>2]|0,n[M>>2]=n[f>>2],n[f>>2]=Ze,f=se+8|0,Ze=n[O>>2]|0,n[O>>2]=n[f>>2],n[f>>2]=Ze,f=se+12|0,Ze=n[m>>2]|0,n[m>>2]=n[f>>2],n[f>>2]=Ze,_A(se),f=n[O>>2]|0;break}m=f,B=((m-d>>2)+1|0)/-2|0,Q=f+(B<<2)|0,d=k-m|0,m=d>>2,m&&(bI(Q|0,f|0,d|0)|0,f=n[M>>2]|0),Ze=Q+(m<<2)|0,n[O>>2]=Ze,n[M>>2]=f+(B<<2),f=Ze}while(0);n[f>>2]=n[c>>2],n[O>>2]=(n[O>>2]|0)+4,l=Eg(s,Re,l)|0,_A(Re)}while(0);return C=et,l|0}function je(s){s=s|0;var l=0;do{if(l=s+984|0,o[l>>0]|0)break;o[l>>0]=1,h[s+504>>2]=y(he),s=n[s+944>>2]|0}while((s|0)!=0)}function Be(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-4-f|0)>>>2)<<2)),pt(c))}function xe(s){return s=s|0,n[s+944>>2]|0}function Ve(s){s=s|0,Yn(s,(n[s+964>>2]|0)!=0,2832),je(s)}function vt(s){return s=s|0,(o[s+984>>0]|0)!=0|0}function tr(s,l){s=s|0,l=l|0,ZUe(s,l,400)|0&&(Er(s|0,l|0,400)|0,je(s))}function Zr(s){s=s|0;var l=$e;return l=y(h[s+44>>2]),s=Ot(l)|0,y(s?y(0):l)}function Tn(s){s=s|0;var l=$e;return l=y(h[s+48>>2]),Ot(l)|0&&(l=o[(n[s+976>>2]|0)+2>>0]|0?y(1):y(0)),y(l)}function _r(s,l){s=s|0,l=l|0,n[s+980>>2]=l}function ei(s){return s=s|0,n[s+980>>2]|0}function Ti(s,l){s=s|0,l=l|0;var c=0;c=s+4|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,je(s))}function Kn(s){return s=s|0,n[s+4>>2]|0}function qa(s,l){s=s|0,l=l|0;var c=0;c=s+8|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,je(s))}function aa(s){return s=s|0,n[s+8>>2]|0}function yi(s,l){s=s|0,l=l|0;var c=0;c=s+12|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,je(s))}function la(s){return s=s|0,n[s+12>>2]|0}function ja(s,l){s=s|0,l=l|0;var c=0;c=s+16|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,je(s))}function lo(s){return s=s|0,n[s+16>>2]|0}function FA(s,l){s=s|0,l=l|0;var c=0;c=s+20|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,je(s))}function Ec(s){return s=s|0,n[s+20>>2]|0}function ca(s,l){s=s|0,l=l|0;var c=0;c=s+24|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,je(s))}function rg(s){return s=s|0,n[s+24>>2]|0}function Ic(s,l){s=s|0,l=l|0;var c=0;c=s+28|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,je(s))}function bm(s){return s=s|0,n[s+28>>2]|0}function ng(s,l){s=s|0,l=l|0;var c=0;c=s+32|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,je(s))}function Vn(s){return s=s|0,n[s+32>>2]|0}function up(s,l){s=s|0,l=l|0;var c=0;c=s+36|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,je(s))}function ig(s){return s=s|0,n[s+36>>2]|0}function RA(s,l){s=s|0,l=y(l);var c=0;c=s+40|0,y(h[c>>2])!=l&&(h[c>>2]=l,je(s))}function Os(s,l){s=s|0,l=y(l);var c=0;c=s+44|0,y(h[c>>2])!=l&&(h[c>>2]=l,je(s))}function Iu(s,l){s=s|0,l=y(l);var c=0;c=s+48|0,y(h[c>>2])!=l&&(h[c>>2]=l,je(s))}function Ga(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=(m^1)&1,f=s+52|0,d=s+56|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,je(s))}function ji(s,l){s=s|0,l=y(l);var c=0,f=0;f=s+52|0,c=s+56|0,y(h[f>>2])==l&&(n[c>>2]|0)==2||(h[f>>2]=l,f=Ot(l)|0,n[c>>2]=f?3:2,je(s))}function ua(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+52|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function wu(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ot(c)|0,f=(m^1)&1,d=s+132+(l<<3)|0,l=s+132+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,je(s))}function ms(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ot(c)|0,f=m?0:2,d=s+132+(l<<3)|0,l=s+132+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,je(s))}function wc(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=l+132+(c<<3)|0,l=n[f+4>>2]|0,c=s,n[c>>2]=n[f>>2],n[c+4>>2]=l}function Bc(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ot(c)|0,f=(m^1)&1,d=s+60+(l<<3)|0,l=s+60+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,je(s))}function G(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ot(c)|0,f=m?0:2,d=s+60+(l<<3)|0,l=s+60+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,je(s))}function Dt(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=l+60+(c<<3)|0,l=n[f+4>>2]|0,c=s,n[c>>2]=n[f>>2],n[c+4>>2]=l}function vl(s,l){s=s|0,l=l|0;var c=0;c=s+60+(l<<3)+4|0,(n[c>>2]|0)!=3&&(h[s+60+(l<<3)>>2]=y(he),n[c>>2]=3,je(s))}function Si(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ot(c)|0,f=(m^1)&1,d=s+204+(l<<3)|0,l=s+204+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,je(s))}function vc(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ot(c)|0,f=m?0:2,d=s+204+(l<<3)|0,l=s+204+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,je(s))}function lt(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=l+204+(c<<3)|0,l=n[f+4>>2]|0,c=s,n[c>>2]=n[f>>2],n[c+4>>2]=l}function Bu(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ot(c)|0,f=(m^1)&1,d=s+276+(l<<3)|0,l=s+276+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,je(s))}function sg(s,l){return s=s|0,l=l|0,y(h[s+276+(l<<3)>>2])}function cI(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=(m^1)&1,f=s+348|0,d=s+352|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,je(s))}function TA(s,l){s=s|0,l=y(l);var c=0,f=0;f=s+348|0,c=s+352|0,y(h[f>>2])==l&&(n[c>>2]|0)==2||(h[f>>2]=l,f=Ot(l)|0,n[c>>2]=f?3:2,je(s))}function Ap(s){s=s|0;var l=0;l=s+352|0,(n[l>>2]|0)!=3&&(h[s+348>>2]=y(he),n[l>>2]=3,je(s))}function yr(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+348|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function ys(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=(m^1)&1,f=s+356|0,d=s+360|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,je(s))}function og(s,l){s=s|0,l=y(l);var c=0,f=0;f=s+356|0,c=s+360|0,y(h[f>>2])==l&&(n[c>>2]|0)==2||(h[f>>2]=l,f=Ot(l)|0,n[c>>2]=f?3:2,je(s))}function ag(s){s=s|0;var l=0;l=s+360|0,(n[l>>2]|0)!=3&&(h[s+356>>2]=y(he),n[l>>2]=3,je(s))}function lg(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+356|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function fp(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=(m^1)&1,f=s+364|0,d=s+368|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,je(s))}function Dc(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=m?0:2,f=s+364|0,d=s+368|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,je(s))}function mt(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+364|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Qm(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=(m^1)&1,f=s+372|0,d=s+376|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,je(s))}function cg(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=m?0:2,f=s+372|0,d=s+376|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,je(s))}function ug(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+372|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function vu(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=(m^1)&1,f=s+380|0,d=s+384|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,je(s))}function km(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=m?0:2,f=s+380|0,d=s+384|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,je(s))}function Ag(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+380|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Du(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=(m^1)&1,f=s+388|0,d=s+392|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,je(s))}function uI(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=m?0:2,f=s+388|0,d=s+392|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,je(s))}function Fm(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+388|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Aa(s,l){s=s|0,l=y(l);var c=0;c=s+396|0,y(h[c>>2])!=l&&(h[c>>2]=l,je(s))}function Sc(s){return s=s|0,y(h[s+396>>2])}function Dl(s){return s=s|0,y(h[s+400>>2])}function Su(s){return s=s|0,y(h[s+404>>2])}function fg(s){return s=s|0,y(h[s+408>>2])}function NA(s){return s=s|0,y(h[s+412>>2])}function pp(s){return s=s|0,y(h[s+416>>2])}function Wa(s){return s=s|0,y(h[s+420>>2])}function pg(s,l){switch(s=s|0,l=l|0,Yn(s,(l|0)<6,2918),l|0){case 0:{l=(n[s+496>>2]|0)==2?5:4;break}case 2:{l=(n[s+496>>2]|0)==2?4:5;break}default:}return y(h[s+424+(l<<2)>>2])}function hp(s,l){switch(s=s|0,l=l|0,Yn(s,(l|0)<6,2918),l|0){case 0:{l=(n[s+496>>2]|0)==2?5:4;break}case 2:{l=(n[s+496>>2]|0)==2?4:5;break}default:}return y(h[s+448+(l<<2)>>2])}function Uo(s,l){switch(s=s|0,l=l|0,Yn(s,(l|0)<6,2918),l|0){case 0:{l=(n[s+496>>2]|0)==2?5:4;break}case 2:{l=(n[s+496>>2]|0)==2?4:5;break}default:}return y(h[s+472+(l<<2)>>2])}function Cs(s,l){s=s|0,l=l|0;var c=0,f=$e;return c=n[s+4>>2]|0,(c|0)==(n[l+4>>2]|0)?c?(f=y(h[s>>2]),s=y(ne(y(f-y(h[l>>2]))))>2]=0,n[f+4>>2]=0,n[f+8>>2]=0,Ma(f|0,s|0,l|0,0),co(s,3,(o[f+11>>0]|0)<0?n[f>>2]|0:f,c),I3e(f),C=c}function _o(s,l,c,f){s=y(s),l=y(l),c=c|0,f=f|0;var d=$e;s=y(s*l),d=y(IR(s,y(1)));do if(Ci(d,y(0))|0)s=y(s-d);else{if(s=y(s-d),Ci(d,y(1))|0){s=y(s+y(1));break}if(c){s=y(s+y(1));break}f||(d>y(.5)?d=y(1):(f=Ci(d,y(.5))|0,d=y(f?1:0)),s=y(s+d))}while(0);return y(s/l)}function LA(s,l,c,f,d,m,B,Q,k,M,O,j,se){s=s|0,l=y(l),c=c|0,f=y(f),d=d|0,m=y(m),B=B|0,Q=y(Q),k=y(k),M=y(M),O=y(O),j=y(j),se=se|0;var We=0,Le=$e,Re=$e,et=$e,Ze=$e,at=$e,He=$e;return k>2]),Le!=y(0))?(et=y(_o(l,Le,0,0)),Ze=y(_o(f,Le,0,0)),Re=y(_o(m,Le,0,0)),Le=y(_o(Q,Le,0,0))):(Re=m,et=l,Le=Q,Ze=f),(d|0)==(s|0)?We=Ci(Re,et)|0:We=0,(B|0)==(c|0)?se=Ci(Le,Ze)|0:se=0,!We&&(at=y(l-O),!(gp(s,at,k)|0))&&!(dp(s,at,d,k)|0)?We=hg(s,at,d,m,k)|0:We=1,!se&&(He=y(f-j),!(gp(c,He,M)|0))&&!(dp(c,He,B,M)|0)?se=hg(c,He,B,Q,M)|0:se=1,se=We&se),se|0}function gp(s,l,c){return s=s|0,l=y(l),c=y(c),(s|0)==1?s=Ci(l,c)|0:s=0,s|0}function dp(s,l,c,f){return s=s|0,l=y(l),c=c|0,f=y(f),(s|0)==2&(c|0)==0?l>=f?s=1:s=Ci(l,f)|0:s=0,s|0}function hg(s,l,c,f,d){return s=s|0,l=y(l),c=c|0,f=y(f),d=y(d),(s|0)==2&(c|0)==2&f>l?d<=l?s=1:s=Ci(l,d)|0:s=0,s|0}function fa(s,l,c,f,d,m,B,Q,k,M,O){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=m|0,B=y(B),Q=y(Q),k=k|0,M=M|0,O=O|0;var j=0,se=0,We=0,Le=0,Re=$e,et=$e,Ze=0,at=0,He=0,Ge=0,Tt=0,Rr=0,ir=0,Jt=0,Ir=0,Qr=0,rr=0,Bn=$e,po=$e,ho=$e,go=0,ya=0;rr=C,C=C+160|0,Jt=rr+152|0,ir=rr+120|0,Rr=rr+104|0,He=rr+72|0,Le=rr+56|0,Tt=rr+8|0,at=rr,Ge=(n[2279]|0)+1|0,n[2279]=Ge,Ir=s+984|0,(o[Ir>>0]|0)!=0&&(n[s+512>>2]|0)!=(n[2278]|0)?Ze=4:(n[s+516>>2]|0)==(f|0)?Qr=0:Ze=4,(Ze|0)==4&&(n[s+520>>2]=0,n[s+924>>2]=-1,n[s+928>>2]=-1,h[s+932>>2]=y(-1),h[s+936>>2]=y(-1),Qr=1);e:do if(n[s+964>>2]|0)if(Re=y(rn(s,2,B)),et=y(rn(s,0,B)),j=s+916|0,ho=y(h[j>>2]),po=y(h[s+920>>2]),Bn=y(h[s+932>>2]),LA(d,l,m,c,n[s+924>>2]|0,ho,n[s+928>>2]|0,po,Bn,y(h[s+936>>2]),Re,et,O)|0)Ze=22;else if(We=n[s+520>>2]|0,!We)Ze=21;else for(se=0;;){if(j=s+524+(se*24|0)|0,Bn=y(h[j>>2]),po=y(h[s+524+(se*24|0)+4>>2]),ho=y(h[s+524+(se*24|0)+16>>2]),LA(d,l,m,c,n[s+524+(se*24|0)+8>>2]|0,Bn,n[s+524+(se*24|0)+12>>2]|0,po,ho,y(h[s+524+(se*24|0)+20>>2]),Re,et,O)|0){Ze=22;break e}if(se=se+1|0,se>>>0>=We>>>0){Ze=21;break}}else{if(k){if(j=s+916|0,!(Ci(y(h[j>>2]),l)|0)){Ze=21;break}if(!(Ci(y(h[s+920>>2]),c)|0)){Ze=21;break}if((n[s+924>>2]|0)!=(d|0)){Ze=21;break}j=(n[s+928>>2]|0)==(m|0)?j:0,Ze=22;break}if(We=n[s+520>>2]|0,!We)Ze=21;else for(se=0;;){if(j=s+524+(se*24|0)|0,Ci(y(h[j>>2]),l)|0&&Ci(y(h[s+524+(se*24|0)+4>>2]),c)|0&&(n[s+524+(se*24|0)+8>>2]|0)==(d|0)&&(n[s+524+(se*24|0)+12>>2]|0)==(m|0)){Ze=22;break e}if(se=se+1|0,se>>>0>=We>>>0){Ze=21;break}}}while(0);do if((Ze|0)==21)o[11697]|0?(j=0,Ze=28):(j=0,Ze=31);else if((Ze|0)==22){if(se=(o[11697]|0)!=0,!((j|0)!=0&(Qr^1)))if(se){Ze=28;break}else{Ze=31;break}Le=j+16|0,n[s+908>>2]=n[Le>>2],We=j+20|0,n[s+912>>2]=n[We>>2],(o[11698]|0)==0|se^1||(n[at>>2]=OA(Ge)|0,n[at+4>>2]=Ge,co(s,4,2972,at),se=n[s+972>>2]|0,se|0&&tf[se&127](s),d=Ya(d,k)|0,m=Ya(m,k)|0,ya=+y(h[Le>>2]),go=+y(h[We>>2]),n[Tt>>2]=d,n[Tt+4>>2]=m,E[Tt+8>>3]=+l,E[Tt+16>>3]=+c,E[Tt+24>>3]=ya,E[Tt+32>>3]=go,n[Tt+40>>2]=M,co(s,4,2989,Tt))}while(0);return(Ze|0)==28&&(se=OA(Ge)|0,n[Le>>2]=se,n[Le+4>>2]=Ge,n[Le+8>>2]=Qr?3047:11699,co(s,4,3038,Le),se=n[s+972>>2]|0,se|0&&tf[se&127](s),Tt=Ya(d,k)|0,Ze=Ya(m,k)|0,n[He>>2]=Tt,n[He+4>>2]=Ze,E[He+8>>3]=+l,E[He+16>>3]=+c,n[He+24>>2]=M,co(s,4,3049,He),Ze=31),(Ze|0)==31&&(ti(s,l,c,f,d,m,B,Q,k,O),o[11697]|0&&(se=n[2279]|0,Tt=OA(se)|0,n[Rr>>2]=Tt,n[Rr+4>>2]=se,n[Rr+8>>2]=Qr?3047:11699,co(s,4,3083,Rr),se=n[s+972>>2]|0,se|0&&tf[se&127](s),Tt=Ya(d,k)|0,Rr=Ya(m,k)|0,go=+y(h[s+908>>2]),ya=+y(h[s+912>>2]),n[ir>>2]=Tt,n[ir+4>>2]=Rr,E[ir+8>>3]=go,E[ir+16>>3]=ya,n[ir+24>>2]=M,co(s,4,3092,ir)),n[s+516>>2]=f,j||(se=s+520|0,j=n[se>>2]|0,(j|0)==16&&(o[11697]|0&&co(s,4,3124,Jt),n[se>>2]=0,j=0),k?j=s+916|0:(n[se>>2]=j+1,j=s+524+(j*24|0)|0),h[j>>2]=l,h[j+4>>2]=c,n[j+8>>2]=d,n[j+12>>2]=m,n[j+16>>2]=n[s+908>>2],n[j+20>>2]=n[s+912>>2],j=0)),k&&(n[s+416>>2]=n[s+908>>2],n[s+420>>2]=n[s+912>>2],o[s+985>>0]=1,o[Ir>>0]=0),n[2279]=(n[2279]|0)+-1,n[s+512>>2]=n[2278],C=rr,Qr|(j|0)==0|0}function rn(s,l,c){s=s|0,l=l|0,c=y(c);var f=$e;return f=y(K(s,l,c)),y(f+y(te(s,l,c)))}function co(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=C,C=C+16|0,d=m,n[d>>2]=f,s?f=n[s+976>>2]|0:f=0,dg(f,s,l,c,d),C=m}function OA(s){return s=s|0,(s>>>0>60?3201:3201+(60-s)|0)|0}function Ya(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;return d=C,C=C+32|0,c=d+12|0,f=d,n[c>>2]=n[254],n[c+4>>2]=n[255],n[c+8>>2]=n[256],n[f>>2]=n[257],n[f+4>>2]=n[258],n[f+8>>2]=n[259],(s|0)>2?s=11699:s=n[(l?f:c)+(s<<2)>>2]|0,C=d,s|0}function ti(s,l,c,f,d,m,B,Q,k,M){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=m|0,B=y(B),Q=y(Q),k=k|0,M=M|0;var O=0,j=0,se=0,We=0,Le=$e,Re=$e,et=$e,Ze=$e,at=$e,He=$e,Ge=$e,Tt=0,Rr=0,ir=0,Jt=$e,Ir=$e,Qr=0,rr=$e,Bn=0,po=0,ho=0,go=0,ya=0,Qp=0,kp=0,kl=0,Fp=0,Lu=0,Ou=0,Rp=0,Tp=0,Np=0,Jr=0,Fl=0,Lp=0,Fc=0,Op=$e,Mp=$e,Mu=$e,Uu=$e,Rc=$e,Us=0,$a=0,qo=0,Rl=0,nf=0,sf=$e,_u=$e,of=$e,af=$e,_s=$e,ws=$e,Tl=0,Pn=$e,lf=$e,mo=$e,Tc=$e,yo=$e,Nc=$e,cf=0,uf=0,Lc=$e,Hs=$e,Nl=0,Af=0,ff=0,pf=0,vr=$e,jn=0,Bs=0,Co=0,qs=0,Pr=0,lr=0,Ll=0,Wt=$e,hf=0,ii=0;Ll=C,C=C+16|0,Us=Ll+12|0,$a=Ll+8|0,qo=Ll+4|0,Rl=Ll,Yn(s,(d|0)==0|(Ot(l)|0)^1,3326),Yn(s,(m|0)==0|(Ot(c)|0)^1,3406),Bs=gt(s,f)|0,n[s+496>>2]=Bs,Pr=ur(2,Bs)|0,lr=ur(0,Bs)|0,h[s+440>>2]=y(K(s,Pr,B)),h[s+444>>2]=y(te(s,Pr,B)),h[s+428>>2]=y(K(s,lr,B)),h[s+436>>2]=y(te(s,lr,B)),h[s+464>>2]=y(gr(s,Pr)),h[s+468>>2]=y(hn(s,Pr)),h[s+452>>2]=y(gr(s,lr)),h[s+460>>2]=y(hn(s,lr)),h[s+488>>2]=y(ri(s,Pr,B)),h[s+492>>2]=y(Ni(s,Pr,B)),h[s+476>>2]=y(ri(s,lr,B)),h[s+484>>2]=y(Ni(s,lr,B));do if(n[s+964>>2]|0)yg(s,l,c,d,m,B,Q);else{if(Co=s+948|0,qs=(n[s+952>>2]|0)-(n[Co>>2]|0)>>2,!qs){Qv(s,l,c,d,m,B,Q);break}if(!k&&kv(s,l,c,d,m,B,Q)|0)break;ee(s),Fl=s+508|0,o[Fl>>0]=0,Pr=ur(n[s+4>>2]|0,Bs)|0,lr=fI(Pr,Bs)|0,jn=Ae(Pr)|0,Lp=n[s+8>>2]|0,Af=s+28|0,Fc=(n[Af>>2]|0)!=0,yo=jn?B:Q,Lc=jn?Q:B,Op=y(yp(s,Pr,B)),Mp=y(pI(s,Pr,B)),Le=y(yp(s,lr,B)),Nc=y(gn(s,Pr,B)),Hs=y(gn(s,lr,B)),ir=jn?d:m,Nl=jn?m:d,vr=jn?Nc:Hs,at=jn?Hs:Nc,Tc=y(rn(s,2,B)),Ze=y(rn(s,0,B)),Re=y(y(Hr(s+364|0,B))-vr),et=y(y(Hr(s+380|0,B))-vr),He=y(y(Hr(s+372|0,Q))-at),Ge=y(y(Hr(s+388|0,Q))-at),Mu=jn?Re:He,Uu=jn?et:Ge,Tc=y(l-Tc),l=y(Tc-vr),Ot(l)|0?vr=l:vr=y(Nn(y(Qg(l,et)),Re)),lf=y(c-Ze),l=y(lf-at),Ot(l)|0?mo=l:mo=y(Nn(y(Qg(l,Ge)),He)),Re=jn?vr:mo,Pn=jn?mo:vr;e:do if((ir|0)==1)for(f=0,j=0;;){if(O=Ts(s,j)|0,!f)y(rs(O))>y(0)&&y(Ms(O))>y(0)?f=O:f=0;else if(Lm(O)|0){We=0;break e}if(j=j+1|0,j>>>0>=qs>>>0){We=f;break}}else We=0;while(0);Tt=We+500|0,Rr=We+504|0,f=0,O=0,l=y(0),se=0;do{if(j=n[(n[Co>>2]|0)+(se<<2)>>2]|0,(n[j+36>>2]|0)==1)Pu(j),o[j+985>>0]=1,o[j+984>>0]=0;else{Sl(j),k&&mp(j,gt(j,Bs)|0,Re,Pn,vr);do if((n[j+24>>2]|0)!=1)if((j|0)==(We|0)){n[Tt>>2]=n[2278],h[Rr>>2]=y(0);break}else{Om(s,j,vr,d,mo,vr,mo,m,Bs,M);break}else O|0&&(n[O+960>>2]=j),n[j+960>>2]=0,O=j,f=(f|0)==0?j:f;while(0);ws=y(h[j+504>>2]),l=y(l+y(ws+y(rn(j,Pr,vr))))}se=se+1|0}while((se|0)!=(qs|0));for(ho=l>Re,Tl=Fc&((ir|0)==2&ho)?1:ir,Bn=(Nl|0)==1,ya=Bn&(k^1),Qp=(Tl|0)==1,kp=(Tl|0)==2,kl=976+(Pr<<2)|0,Fp=(Nl|2|0)==2,Np=Bn&(Fc^1),Lu=1040+(lr<<2)|0,Ou=1040+(Pr<<2)|0,Rp=976+(lr<<2)|0,Tp=(Nl|0)!=1,ho=Fc&((ir|0)!=0&ho),po=s+976|0,Bn=Bn^1,l=Re,Qr=0,go=0,ws=y(0),Rc=y(0);;){e:do if(Qr>>>0>>0)for(Rr=n[Co>>2]|0,se=0,Ge=y(0),He=y(0),et=y(0),Re=y(0),j=0,O=0,We=Qr;;){if(Tt=n[Rr+(We<<2)>>2]|0,(n[Tt+36>>2]|0)!=1&&(n[Tt+940>>2]=go,(n[Tt+24>>2]|0)!=1)){if(Ze=y(rn(Tt,Pr,vr)),Jr=n[kl>>2]|0,c=y(Hr(Tt+380+(Jr<<3)|0,yo)),at=y(h[Tt+504>>2]),c=y(Qg(c,at)),c=y(Nn(y(Hr(Tt+364+(Jr<<3)|0,yo)),c)),Fc&(se|0)!=0&y(Ze+y(He+c))>l){m=se,Ze=Ge,ir=We;break e}Ze=y(Ze+c),c=y(He+Ze),Ze=y(Ge+Ze),Lm(Tt)|0&&(et=y(et+y(rs(Tt))),Re=y(Re-y(at*y(Ms(Tt))))),O|0&&(n[O+960>>2]=Tt),n[Tt+960>>2]=0,se=se+1|0,O=Tt,j=(j|0)==0?Tt:j}else Ze=Ge,c=He;if(We=We+1|0,We>>>0>>0)Ge=Ze,He=c;else{m=se,ir=We;break}}else m=0,Ze=y(0),et=y(0),Re=y(0),j=0,ir=Qr;while(0);Jr=et>y(0)&ety(0)&ReUu&((Ot(Uu)|0)^1))l=Uu,Jr=51;else if(o[(n[po>>2]|0)+3>>0]|0)Jr=51;else{if(Jt!=y(0)&&y(rs(s))!=y(0)){Jr=53;break}l=Ze,Jr=53}while(0);if((Jr|0)==51&&(Jr=0,Ot(l)|0?Jr=53:(Ir=y(l-Ze),rr=l)),(Jr|0)==53&&(Jr=0,Ze>2]|0,We=Iry(0),He=y(Ir/Jt),et=y(0),Ze=y(0),l=y(0),O=j;do c=y(Hr(O+380+(se<<3)|0,yo)),Re=y(Hr(O+364+(se<<3)|0,yo)),Re=y(Qg(c,y(Nn(Re,y(h[O+504>>2]))))),We?(c=y(Re*y(Ms(O))),c!=y(-0)&&(Wt=y(Re-y(at*c)),sf=y(Ei(O,Pr,Wt,rr,vr)),Wt!=sf)&&(et=y(et-y(sf-Re)),l=y(l+c))):Tt&&(_u=y(rs(O)),_u!=y(0))&&(Wt=y(Re+y(He*_u)),of=y(Ei(O,Pr,Wt,rr,vr)),Wt!=of)&&(et=y(et-y(of-Re)),Ze=y(Ze-_u)),O=n[O+960>>2]|0;while((O|0)!=0);if(l=y(Ge+l),Re=y(Ir+et),nf)l=y(0);else{at=y(Jt+Ze),We=n[kl>>2]|0,Tt=Rey(0),at=y(Re/at),l=y(0);do{Wt=y(Hr(j+380+(We<<3)|0,yo)),et=y(Hr(j+364+(We<<3)|0,yo)),et=y(Qg(Wt,y(Nn(et,y(h[j+504>>2]))))),Tt?(Wt=y(et*y(Ms(j))),Re=y(-Wt),Wt!=y(-0)?(Wt=y(He*Re),Re=y(Ei(j,Pr,y(et+(Rr?Re:Wt)),rr,vr))):Re=et):se&&(af=y(rs(j)),af!=y(0))?Re=y(Ei(j,Pr,y(et+y(at*af)),rr,vr)):Re=et,l=y(l-y(Re-et)),Ze=y(rn(j,Pr,vr)),c=y(rn(j,lr,vr)),Re=y(Re+Ze),h[$a>>2]=Re,n[Rl>>2]=1,et=y(h[j+396>>2]);e:do if(Ot(et)|0){O=Ot(Pn)|0;do if(!O){if(ho|(ts(j,lr,Pn)|0|Bn)||(ha(s,j)|0)!=4||(n[(Pl(j,lr)|0)+4>>2]|0)==3||(n[(bc(j,lr)|0)+4>>2]|0)==3)break;h[Us>>2]=Pn,n[qo>>2]=1;break e}while(0);if(ts(j,lr,Pn)|0){O=n[j+992+(n[Rp>>2]<<2)>>2]|0,Wt=y(c+y(Hr(O,Pn))),h[Us>>2]=Wt,O=Tp&(n[O+4>>2]|0)==2,n[qo>>2]=((Ot(Wt)|0|O)^1)&1;break}else{h[Us>>2]=Pn,n[qo>>2]=O?0:2;break}}else Wt=y(Re-Ze),Jt=y(Wt/et),Wt=y(et*Wt),n[qo>>2]=1,h[Us>>2]=y(c+(jn?Jt:Wt));while(0);pr(j,Pr,rr,vr,Rl,$a),pr(j,lr,Pn,vr,qo,Us);do if(!(ts(j,lr,Pn)|0)&&(ha(s,j)|0)==4){if((n[(Pl(j,lr)|0)+4>>2]|0)==3){O=0;break}O=(n[(bc(j,lr)|0)+4>>2]|0)!=3}else O=0;while(0);Wt=y(h[$a>>2]),Jt=y(h[Us>>2]),hf=n[Rl>>2]|0,ii=n[qo>>2]|0,fa(j,jn?Wt:Jt,jn?Jt:Wt,Bs,jn?hf:ii,jn?ii:hf,vr,mo,k&(O^1),3488,M)|0,o[Fl>>0]=o[Fl>>0]|o[j+508>>0],j=n[j+960>>2]|0}while((j|0)!=0)}}else l=y(0);if(l=y(Ir+l),ii=l>0]=ii|u[Fl>>0],kp&l>y(0)?(O=n[kl>>2]|0,(n[s+364+(O<<3)+4>>2]|0)!=0&&(_s=y(Hr(s+364+(O<<3)|0,yo)),_s>=y(0))?Re=y(Nn(y(0),y(_s-y(rr-l)))):Re=y(0)):Re=l,Tt=Qr>>>0>>0,Tt){We=n[Co>>2]|0,se=Qr,O=0;do j=n[We+(se<<2)>>2]|0,n[j+24>>2]|0||(O=((n[(Pl(j,Pr)|0)+4>>2]|0)==3&1)+O|0,O=O+((n[(bc(j,Pr)|0)+4>>2]|0)==3&1)|0),se=se+1|0;while((se|0)!=(ir|0));O?(Ze=y(0),c=y(0)):Jr=101}else Jr=101;e:do if((Jr|0)==101)switch(Jr=0,Lp|0){case 1:{O=0,Ze=y(Re*y(.5)),c=y(0);break e}case 2:{O=0,Ze=Re,c=y(0);break e}case 3:{if(m>>>0<=1){O=0,Ze=y(0),c=y(0);break e}c=y((m+-1|0)>>>0),O=0,Ze=y(0),c=y(y(Nn(Re,y(0)))/c);break e}case 5:{c=y(Re/y((m+1|0)>>>0)),O=0,Ze=c;break e}case 4:{c=y(Re/y(m>>>0)),O=0,Ze=y(c*y(.5));break e}default:{O=0,Ze=y(0),c=y(0);break e}}while(0);if(l=y(Op+Ze),Tt){et=y(Re/y(O|0)),se=n[Co>>2]|0,j=Qr,Re=y(0);do{O=n[se+(j<<2)>>2]|0;e:do if((n[O+36>>2]|0)!=1){switch(n[O+24>>2]|0){case 1:{if(Ai(O,Pr)|0){if(!k)break e;Wt=y(Fr(O,Pr,rr)),Wt=y(Wt+y(gr(s,Pr))),Wt=y(Wt+y(K(O,Pr,vr))),h[O+400+(n[Ou>>2]<<2)>>2]=Wt;break e}break}case 0:if(ii=(n[(Pl(O,Pr)|0)+4>>2]|0)==3,Wt=y(et+l),l=ii?Wt:l,k&&(ii=O+400+(n[Ou>>2]<<2)|0,h[ii>>2]=y(l+y(h[ii>>2]))),ii=(n[(bc(O,Pr)|0)+4>>2]|0)==3,Wt=y(et+l),l=ii?Wt:l,ya){Wt=y(c+y(rn(O,Pr,vr))),Re=Pn,l=y(l+y(Wt+y(h[O+504>>2])));break e}else{l=y(l+y(c+y(ns(O,Pr,vr)))),Re=y(Nn(Re,y(ns(O,lr,vr))));break e}default:}k&&(Wt=y(Ze+y(gr(s,Pr))),ii=O+400+(n[Ou>>2]<<2)|0,h[ii>>2]=y(Wt+y(h[ii>>2])))}while(0);j=j+1|0}while((j|0)!=(ir|0))}else Re=y(0);if(c=y(Mp+l),Fp?Ze=y(y(Ei(s,lr,y(Hs+Re),Lc,B))-Hs):Ze=Pn,et=y(y(Ei(s,lr,y(Hs+(Np?Pn:Re)),Lc,B))-Hs),Tt&k){j=Qr;do{se=n[(n[Co>>2]|0)+(j<<2)>>2]|0;do if((n[se+36>>2]|0)!=1){if((n[se+24>>2]|0)==1){if(Ai(se,lr)|0){if(Wt=y(Fr(se,lr,Pn)),Wt=y(Wt+y(gr(s,lr))),Wt=y(Wt+y(K(se,lr,vr))),O=n[Lu>>2]|0,h[se+400+(O<<2)>>2]=Wt,!(Ot(Wt)|0))break}else O=n[Lu>>2]|0;Wt=y(gr(s,lr)),h[se+400+(O<<2)>>2]=y(Wt+y(K(se,lr,vr)));break}O=ha(s,se)|0;do if((O|0)==4){if((n[(Pl(se,lr)|0)+4>>2]|0)==3){Jr=139;break}if((n[(bc(se,lr)|0)+4>>2]|0)==3){Jr=139;break}if(ts(se,lr,Pn)|0){l=Le;break}hf=n[se+908+(n[kl>>2]<<2)>>2]|0,n[Us>>2]=hf,l=y(h[se+396>>2]),ii=Ot(l)|0,Re=(n[v>>2]=hf,y(h[v>>2])),ii?l=et:(Ir=y(rn(se,lr,vr)),Wt=y(Re/l),l=y(l*Re),l=y(Ir+(jn?Wt:l))),h[$a>>2]=l,h[Us>>2]=y(y(rn(se,Pr,vr))+Re),n[qo>>2]=1,n[Rl>>2]=1,pr(se,Pr,rr,vr,qo,Us),pr(se,lr,Pn,vr,Rl,$a),l=y(h[Us>>2]),Ir=y(h[$a>>2]),Wt=jn?l:Ir,l=jn?Ir:l,ii=((Ot(Wt)|0)^1)&1,fa(se,Wt,l,Bs,ii,((Ot(l)|0)^1)&1,vr,mo,1,3493,M)|0,l=Le}else Jr=139;while(0);e:do if((Jr|0)==139){Jr=0,l=y(Ze-y(ns(se,lr,vr)));do if((n[(Pl(se,lr)|0)+4>>2]|0)==3){if((n[(bc(se,lr)|0)+4>>2]|0)!=3)break;l=y(Le+y(Nn(y(0),y(l*y(.5)))));break e}while(0);if((n[(bc(se,lr)|0)+4>>2]|0)==3){l=Le;break}if((n[(Pl(se,lr)|0)+4>>2]|0)==3){l=y(Le+y(Nn(y(0),l)));break}switch(O|0){case 1:{l=Le;break e}case 2:{l=y(Le+y(l*y(.5)));break e}default:{l=y(Le+l);break e}}}while(0);Wt=y(ws+l),ii=se+400+(n[Lu>>2]<<2)|0,h[ii>>2]=y(Wt+y(h[ii>>2]))}while(0);j=j+1|0}while((j|0)!=(ir|0))}if(ws=y(ws+et),Rc=y(Nn(Rc,c)),m=go+1|0,ir>>>0>=qs>>>0)break;l=rr,Qr=ir,go=m}do if(k){if(O=m>>>0>1,!O&&!(Gi(s)|0))break;if(!(Ot(Pn)|0)){l=y(Pn-ws);e:do switch(n[s+12>>2]|0){case 3:{Le=y(Le+l),He=y(0);break}case 2:{Le=y(Le+y(l*y(.5))),He=y(0);break}case 4:{Pn>ws?He=y(l/y(m>>>0)):He=y(0);break}case 7:if(Pn>ws){Le=y(Le+y(l/y(m<<1>>>0))),He=y(l/y(m>>>0)),He=O?He:y(0);break e}else{Le=y(Le+y(l*y(.5))),He=y(0);break e}case 6:{He=y(l/y(go>>>0)),He=Pn>ws&O?He:y(0);break}default:He=y(0)}while(0);if(m|0)for(Tt=1040+(lr<<2)|0,Rr=976+(lr<<2)|0,We=0,j=0;;){e:do if(j>>>0>>0)for(Re=y(0),et=y(0),l=y(0),se=j;;){O=n[(n[Co>>2]|0)+(se<<2)>>2]|0;do if((n[O+36>>2]|0)!=1&&(n[O+24>>2]|0)==0){if((n[O+940>>2]|0)!=(We|0))break e;if(Mm(O,lr)|0&&(Wt=y(h[O+908+(n[Rr>>2]<<2)>>2]),l=y(Nn(l,y(Wt+y(rn(O,lr,vr)))))),(ha(s,O)|0)!=5)break;_s=y(Va(O)),_s=y(_s+y(K(O,0,vr))),Wt=y(h[O+912>>2]),Wt=y(y(Wt+y(rn(O,0,vr)))-_s),_s=y(Nn(et,_s)),Wt=y(Nn(Re,Wt)),Re=Wt,et=_s,l=y(Nn(l,y(_s+Wt)))}while(0);if(O=se+1|0,O>>>0>>0)se=O;else{se=O;break}}else et=y(0),l=y(0),se=j;while(0);if(at=y(He+l),c=Le,Le=y(Le+at),j>>>0>>0){Ze=y(c+et),O=j;do{j=n[(n[Co>>2]|0)+(O<<2)>>2]|0;e:do if((n[j+36>>2]|0)!=1&&(n[j+24>>2]|0)==0)switch(ha(s,j)|0){case 1:{Wt=y(c+y(K(j,lr,vr))),h[j+400+(n[Tt>>2]<<2)>>2]=Wt;break e}case 3:{Wt=y(y(Le-y(te(j,lr,vr)))-y(h[j+908+(n[Rr>>2]<<2)>>2])),h[j+400+(n[Tt>>2]<<2)>>2]=Wt;break e}case 2:{Wt=y(c+y(y(at-y(h[j+908+(n[Rr>>2]<<2)>>2]))*y(.5))),h[j+400+(n[Tt>>2]<<2)>>2]=Wt;break e}case 4:{if(Wt=y(c+y(K(j,lr,vr))),h[j+400+(n[Tt>>2]<<2)>>2]=Wt,ts(j,lr,Pn)|0||(jn?(Re=y(h[j+908>>2]),l=y(Re+y(rn(j,Pr,vr))),et=at):(et=y(h[j+912>>2]),et=y(et+y(rn(j,lr,vr))),l=at,Re=y(h[j+908>>2])),Ci(l,Re)|0&&Ci(et,y(h[j+912>>2]))|0))break e;fa(j,l,et,Bs,1,1,vr,mo,1,3501,M)|0;break e}case 5:{h[j+404>>2]=y(y(Ze-y(Va(j)))+y(Fr(j,0,Pn)));break e}default:break e}while(0);O=O+1|0}while((O|0)!=(se|0))}if(We=We+1|0,(We|0)==(m|0))break;j=se}}}while(0);if(h[s+908>>2]=y(Ei(s,2,Tc,B,B)),h[s+912>>2]=y(Ei(s,0,lf,Q,B)),(Tl|0)!=0&&(cf=n[s+32>>2]|0,uf=(Tl|0)==2,!(uf&(cf|0)!=2))?uf&(cf|0)==2&&(l=y(Nc+rr),l=y(Nn(y(Qg(l,y(MA(s,Pr,Rc,yo)))),Nc)),Jr=198):(l=y(Ei(s,Pr,Rc,yo,B)),Jr=198),(Jr|0)==198&&(h[s+908+(n[976+(Pr<<2)>>2]<<2)>>2]=l),(Nl|0)!=0&&(ff=n[s+32>>2]|0,pf=(Nl|0)==2,!(pf&(ff|0)!=2))?pf&(ff|0)==2&&(l=y(Hs+Pn),l=y(Nn(y(Qg(l,y(MA(s,lr,y(Hs+ws),Lc)))),Hs)),Jr=204):(l=y(Ei(s,lr,y(Hs+ws),Lc,B)),Jr=204),(Jr|0)==204&&(h[s+908+(n[976+(lr<<2)>>2]<<2)>>2]=l),k){if((n[Af>>2]|0)==2){j=976+(lr<<2)|0,se=1040+(lr<<2)|0,O=0;do We=Ts(s,O)|0,n[We+24>>2]|0||(hf=n[j>>2]|0,Wt=y(h[s+908+(hf<<2)>>2]),ii=We+400+(n[se>>2]<<2)|0,Wt=y(Wt-y(h[ii>>2])),h[ii>>2]=y(Wt-y(h[We+908+(hf<<2)>>2]))),O=O+1|0;while((O|0)!=(qs|0))}if(f|0){O=jn?Tl:d;do Um(s,f,vr,O,mo,Bs,M),f=n[f+960>>2]|0;while((f|0)!=0)}if(O=(Pr|2|0)==3,j=(lr|2|0)==3,O|j){f=0;do se=n[(n[Co>>2]|0)+(f<<2)>>2]|0,(n[se+36>>2]|0)!=1&&(O&&Cp(s,se,Pr),j&&Cp(s,se,lr)),f=f+1|0;while((f|0)!=(qs|0))}}}while(0);C=Ll}function pa(s,l){s=s|0,l=y(l);var c=0;na(s,l>=y(0),3147),c=l==y(0),h[s+4>>2]=c?y(0):l}function Pc(s,l,c,f){s=s|0,l=y(l),c=y(c),f=f|0;var d=$e,m=$e,B=0,Q=0,k=0;n[2278]=(n[2278]|0)+1,Sl(s),ts(s,2,l)|0?(d=y(Hr(n[s+992>>2]|0,l)),k=1,d=y(d+y(rn(s,2,l)))):(d=y(Hr(s+380|0,l)),d>=y(0)?k=2:(k=((Ot(l)|0)^1)&1,d=l)),ts(s,0,c)|0?(m=y(Hr(n[s+996>>2]|0,c)),Q=1,m=y(m+y(rn(s,0,l)))):(m=y(Hr(s+388|0,c)),m>=y(0)?Q=2:(Q=((Ot(c)|0)^1)&1,m=c)),B=s+976|0,fa(s,d,m,f,k,Q,l,c,1,3189,n[B>>2]|0)|0&&(mp(s,n[s+496>>2]|0,l,c,l),xc(s,y(h[(n[B>>2]|0)+4>>2]),y(0),y(0)),o[11696]|0)&&Rm(s,7)}function Sl(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0;Q=C,C=C+32|0,B=Q+24|0,m=Q+16|0,f=Q+8|0,d=Q,c=0;do l=s+380+(c<<3)|0,(n[s+380+(c<<3)+4>>2]|0)!=0&&(k=l,M=n[k+4>>2]|0,O=f,n[O>>2]=n[k>>2],n[O+4>>2]=M,O=s+364+(c<<3)|0,M=n[O+4>>2]|0,k=d,n[k>>2]=n[O>>2],n[k+4>>2]=M,n[m>>2]=n[f>>2],n[m+4>>2]=n[f+4>>2],n[B>>2]=n[d>>2],n[B+4>>2]=n[d+4>>2],Cs(m,B)|0)||(l=s+348+(c<<3)|0),n[s+992+(c<<2)>>2]=l,c=c+1|0;while((c|0)!=2);C=Q}function ts(s,l,c){s=s|0,l=l|0,c=y(c);var f=0;switch(s=n[s+992+(n[976+(l<<2)>>2]<<2)>>2]|0,n[s+4>>2]|0){case 0:case 3:{s=0;break}case 1:{y(h[s>>2])>2])>2]|0){case 2:{l=y(y(y(h[s>>2])*l)/y(100));break}case 1:{l=y(h[s>>2]);break}default:l=y(he)}return y(l)}function mp(s,l,c,f,d){s=s|0,l=l|0,c=y(c),f=y(f),d=y(d);var m=0,B=$e;l=n[s+944>>2]|0?l:1,m=ur(n[s+4>>2]|0,l)|0,l=fI(m,l)|0,c=y(_m(s,m,c)),f=y(_m(s,l,f)),B=y(c+y(K(s,m,d))),h[s+400+(n[1040+(m<<2)>>2]<<2)>>2]=B,c=y(c+y(te(s,m,d))),h[s+400+(n[1e3+(m<<2)>>2]<<2)>>2]=c,c=y(f+y(K(s,l,d))),h[s+400+(n[1040+(l<<2)>>2]<<2)>>2]=c,d=y(f+y(te(s,l,d))),h[s+400+(n[1e3+(l<<2)>>2]<<2)>>2]=d}function xc(s,l,c,f){s=s|0,l=y(l),c=y(c),f=y(f);var d=0,m=0,B=$e,Q=$e,k=0,M=0,O=$e,j=0,se=$e,We=$e,Le=$e,Re=$e;if(l!=y(0)&&(d=s+400|0,Re=y(h[d>>2]),m=s+404|0,Le=y(h[m>>2]),j=s+416|0,We=y(h[j>>2]),M=s+420|0,B=y(h[M>>2]),se=y(Re+c),O=y(Le+f),f=y(se+We),Q=y(O+B),k=(n[s+988>>2]|0)==1,h[d>>2]=y(_o(Re,l,0,k)),h[m>>2]=y(_o(Le,l,0,k)),c=y(IR(y(We*l),y(1))),Ci(c,y(0))|0?m=0:m=(Ci(c,y(1))|0)^1,c=y(IR(y(B*l),y(1))),Ci(c,y(0))|0?d=0:d=(Ci(c,y(1))|0)^1,Re=y(_o(f,l,k&m,k&(m^1))),h[j>>2]=y(Re-y(_o(se,l,0,k))),Re=y(_o(Q,l,k&d,k&(d^1))),h[M>>2]=y(Re-y(_o(O,l,0,k))),m=(n[s+952>>2]|0)-(n[s+948>>2]|0)>>2,m|0)){d=0;do xc(Ts(s,d)|0,l,se,O),d=d+1|0;while((d|0)!=(m|0))}}function AI(s,l,c,f,d){switch(s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,c|0){case 5:case 0:{s=e7(n[489]|0,f,d)|0;break}default:s=m3e(f,d)|0}return s|0}function gg(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;d=C,C=C+16|0,m=d,n[m>>2]=f,dg(s,0,l,c,m),C=d}function dg(s,l,c,f,d){if(s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,s=s|0?s:956,I7[n[s+8>>2]&1](s,l,c,f,d)|0,(c|0)==5)Rt();else return}function Ka(s,l,c){s=s|0,l=l|0,c=c|0,o[s+l>>0]=c&1}function Nm(s,l){s=s|0,l=l|0;var c=0,f=0;n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,c=l+4|0,f=(n[c>>2]|0)-(n[l>>2]|0)>>2,f|0&&(mg(s,f),kt(s,n[l>>2]|0,n[c>>2]|0,f))}function mg(s,l){s=s|0,l=l|0;var c=0;if((N(s)|0)>>>0>>0&&Vr(s),l>>>0>1073741823)Rt();else{c=Gt(l<<2)|0,n[s+4>>2]=c,n[s>>2]=c,n[s+8>>2]=c+(l<<2);return}}function kt(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,f=s+4|0,s=c-l|0,(s|0)>0&&(Er(n[f>>2]|0,l|0,s|0)|0,n[f>>2]=(n[f>>2]|0)+(s>>>2<<2))}function N(s){return s=s|0,1073741823}function K(s,l,c){return s=s|0,l=l|0,c=y(c),Ae(l)|0&&(n[s+96>>2]|0)!=0?s=s+92|0:s=Sn(s+60|0,n[1040+(l<<2)>>2]|0,992)|0,y(ze(s,c))}function te(s,l,c){return s=s|0,l=l|0,c=y(c),Ae(l)|0&&(n[s+104>>2]|0)!=0?s=s+100|0:s=Sn(s+60|0,n[1e3+(l<<2)>>2]|0,992)|0,y(ze(s,c))}function Ae(s){return s=s|0,(s|1|0)==3|0}function ze(s,l){return s=s|0,l=y(l),(n[s+4>>2]|0)==3?l=y(0):l=y(Hr(s,l)),y(l)}function gt(s,l){return s=s|0,l=l|0,s=n[s>>2]|0,((s|0)==0?(l|0)>1?l:1:s)|0}function ur(s,l){s=s|0,l=l|0;var c=0;e:do if((l|0)==2){switch(s|0){case 2:{s=3;break e}case 3:break;default:{c=4;break e}}s=2}else c=4;while(0);return s|0}function gr(s,l){s=s|0,l=l|0;var c=$e;return Ae(l)|0&&(n[s+312>>2]|0)!=0&&(c=y(h[s+308>>2]),c>=y(0))||(c=y(Nn(y(h[(Sn(s+276|0,n[1040+(l<<2)>>2]|0,992)|0)>>2]),y(0)))),y(c)}function hn(s,l){s=s|0,l=l|0;var c=$e;return Ae(l)|0&&(n[s+320>>2]|0)!=0&&(c=y(h[s+316>>2]),c>=y(0))||(c=y(Nn(y(h[(Sn(s+276|0,n[1e3+(l<<2)>>2]|0,992)|0)>>2]),y(0)))),y(c)}function ri(s,l,c){s=s|0,l=l|0,c=y(c);var f=$e;return Ae(l)|0&&(n[s+240>>2]|0)!=0&&(f=y(Hr(s+236|0,c)),f>=y(0))||(f=y(Nn(y(Hr(Sn(s+204|0,n[1040+(l<<2)>>2]|0,992)|0,c)),y(0)))),y(f)}function Ni(s,l,c){s=s|0,l=l|0,c=y(c);var f=$e;return Ae(l)|0&&(n[s+248>>2]|0)!=0&&(f=y(Hr(s+244|0,c)),f>=y(0))||(f=y(Nn(y(Hr(Sn(s+204|0,n[1e3+(l<<2)>>2]|0,992)|0,c)),y(0)))),y(f)}function yg(s,l,c,f,d,m,B){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=y(m),B=y(B);var Q=$e,k=$e,M=$e,O=$e,j=$e,se=$e,We=0,Le=0,Re=0;Re=C,C=C+16|0,We=Re,Le=s+964|0,Yn(s,(n[Le>>2]|0)!=0,3519),Q=y(gn(s,2,l)),k=y(gn(s,0,l)),M=y(rn(s,2,l)),O=y(rn(s,0,l)),Ot(l)|0?j=l:j=y(Nn(y(0),y(y(l-M)-Q))),Ot(c)|0?se=c:se=y(Nn(y(0),y(y(c-O)-k))),(f|0)==1&(d|0)==1?(h[s+908>>2]=y(Ei(s,2,y(l-M),m,m)),l=y(Ei(s,0,y(c-O),B,m))):(w7[n[Le>>2]&1](We,s,j,f,se,d),j=y(Q+y(h[We>>2])),se=y(l-M),h[s+908>>2]=y(Ei(s,2,(f|2|0)==2?j:se,m,m)),se=y(k+y(h[We+4>>2])),l=y(c-O),l=y(Ei(s,0,(d|2|0)==2?se:l,B,m))),h[s+912>>2]=l,C=Re}function Qv(s,l,c,f,d,m,B){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=y(m),B=y(B);var Q=$e,k=$e,M=$e,O=$e;M=y(gn(s,2,m)),Q=y(gn(s,0,m)),O=y(rn(s,2,m)),k=y(rn(s,0,m)),l=y(l-O),h[s+908>>2]=y(Ei(s,2,(f|2|0)==2?M:l,m,m)),c=y(c-k),h[s+912>>2]=y(Ei(s,0,(d|2|0)==2?Q:c,B,m))}function kv(s,l,c,f,d,m,B){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=y(m),B=y(B);var Q=0,k=$e,M=$e;return Q=(f|0)==2,!(l<=y(0)&Q)&&!(c<=y(0)&(d|0)==2)&&!((f|0)==1&(d|0)==1)?s=0:(k=y(rn(s,0,m)),M=y(rn(s,2,m)),Q=l>2]=y(Ei(s,2,Q?y(0):l,m,m)),l=y(c-k),Q=c>2]=y(Ei(s,0,Q?y(0):l,B,m)),s=1),s|0}function fI(s,l){return s=s|0,l=l|0,UA(s)|0?s=ur(2,l)|0:s=0,s|0}function yp(s,l,c){return s=s|0,l=l|0,c=y(c),c=y(ri(s,l,c)),y(c+y(gr(s,l)))}function pI(s,l,c){return s=s|0,l=l|0,c=y(c),c=y(Ni(s,l,c)),y(c+y(hn(s,l)))}function gn(s,l,c){s=s|0,l=l|0,c=y(c);var f=$e;return f=y(yp(s,l,c)),y(f+y(pI(s,l,c)))}function Lm(s){return s=s|0,n[s+24>>2]|0?s=0:y(rs(s))!=y(0)?s=1:s=y(Ms(s))!=y(0),s|0}function rs(s){s=s|0;var l=$e;if(n[s+944>>2]|0){if(l=y(h[s+44>>2]),Ot(l)|0)return l=y(h[s+40>>2]),s=l>y(0)&((Ot(l)|0)^1),y(s?l:y(0))}else l=y(0);return y(l)}function Ms(s){s=s|0;var l=$e,c=0,f=$e;do if(n[s+944>>2]|0){if(l=y(h[s+48>>2]),Ot(l)|0){if(c=o[(n[s+976>>2]|0)+2>>0]|0,c<<24>>24==0&&(f=y(h[s+40>>2]),f>24?y(1):y(0)}}else l=y(0);while(0);return y(l)}function Pu(s){s=s|0;var l=0,c=0;if($m(s+400|0,0,540)|0,o[s+985>>0]=1,ee(s),c=Zi(s)|0,c|0){l=s+948|0,s=0;do Pu(n[(n[l>>2]|0)+(s<<2)>>2]|0),s=s+1|0;while((s|0)!=(c|0))}}function Om(s,l,c,f,d,m,B,Q,k,M){s=s|0,l=l|0,c=y(c),f=f|0,d=y(d),m=y(m),B=y(B),Q=Q|0,k=k|0,M=M|0;var O=0,j=$e,se=0,We=0,Le=$e,Re=$e,et=0,Ze=$e,at=0,He=$e,Ge=0,Tt=0,Rr=0,ir=0,Jt=0,Ir=0,Qr=0,rr=0,Bn=0,po=0;Bn=C,C=C+16|0,Rr=Bn+12|0,ir=Bn+8|0,Jt=Bn+4|0,Ir=Bn,rr=ur(n[s+4>>2]|0,k)|0,Ge=Ae(rr)|0,j=y(Hr(hI(l)|0,Ge?m:B)),Tt=ts(l,2,m)|0,Qr=ts(l,0,B)|0;do if(!(Ot(j)|0)&&!(Ot(Ge?c:d)|0)){if(O=l+504|0,!(Ot(y(h[O>>2]))|0)&&(!(gI(n[l+976>>2]|0,0)|0)||(n[l+500>>2]|0)==(n[2278]|0)))break;h[O>>2]=y(Nn(j,y(gn(l,rr,m))))}else se=7;while(0);do if((se|0)==7){if(at=Ge^1,!(at|Tt^1)){B=y(Hr(n[l+992>>2]|0,m)),h[l+504>>2]=y(Nn(B,y(gn(l,2,m))));break}if(!(Ge|Qr^1)){B=y(Hr(n[l+996>>2]|0,B)),h[l+504>>2]=y(Nn(B,y(gn(l,0,m))));break}h[Rr>>2]=y(he),h[ir>>2]=y(he),n[Jt>>2]=0,n[Ir>>2]=0,Ze=y(rn(l,2,m)),He=y(rn(l,0,m)),Tt?(Le=y(Ze+y(Hr(n[l+992>>2]|0,m))),h[Rr>>2]=Le,n[Jt>>2]=1,We=1):(We=0,Le=y(he)),Qr?(j=y(He+y(Hr(n[l+996>>2]|0,B))),h[ir>>2]=j,n[Ir>>2]=1,O=1):(O=0,j=y(he)),se=n[s+32>>2]|0,Ge&(se|0)==2?se=2:Ot(Le)|0&&!(Ot(c)|0)&&(h[Rr>>2]=c,n[Jt>>2]=2,We=2,Le=c),!((se|0)==2&at)&&Ot(j)|0&&!(Ot(d)|0)&&(h[ir>>2]=d,n[Ir>>2]=2,O=2,j=d),Re=y(h[l+396>>2]),et=Ot(Re)|0;do if(et)se=We;else{if((We|0)==1&at){h[ir>>2]=y(y(Le-Ze)/Re),n[Ir>>2]=1,O=1,se=1;break}Ge&(O|0)==1?(h[Rr>>2]=y(Re*y(j-He)),n[Jt>>2]=1,O=1,se=1):se=We}while(0);po=Ot(c)|0,We=(ha(s,l)|0)!=4,!(Ge|Tt|((f|0)!=1|po)|(We|(se|0)==1))&&(h[Rr>>2]=c,n[Jt>>2]=1,!et)&&(h[ir>>2]=y(y(c-Ze)/Re),n[Ir>>2]=1,O=1),!(Qr|at|((Q|0)!=1|(Ot(d)|0))|(We|(O|0)==1))&&(h[ir>>2]=d,n[Ir>>2]=1,!et)&&(h[Rr>>2]=y(Re*y(d-He)),n[Jt>>2]=1),pr(l,2,m,m,Jt,Rr),pr(l,0,B,m,Ir,ir),c=y(h[Rr>>2]),d=y(h[ir>>2]),fa(l,c,d,k,n[Jt>>2]|0,n[Ir>>2]|0,m,B,0,3565,M)|0,B=y(h[l+908+(n[976+(rr<<2)>>2]<<2)>>2]),h[l+504>>2]=y(Nn(B,y(gn(l,rr,m))))}while(0);n[l+500>>2]=n[2278],C=Bn}function Ei(s,l,c,f,d){return s=s|0,l=l|0,c=y(c),f=y(f),d=y(d),f=y(MA(s,l,c,f)),y(Nn(f,y(gn(s,l,d))))}function ha(s,l){return s=s|0,l=l|0,l=l+20|0,l=n[((n[l>>2]|0)==0?s+16|0:l)>>2]|0,(l|0)==5&&UA(n[s+4>>2]|0)|0&&(l=1),l|0}function Pl(s,l){return s=s|0,l=l|0,Ae(l)|0&&(n[s+96>>2]|0)!=0?l=4:l=n[1040+(l<<2)>>2]|0,s+60+(l<<3)|0}function bc(s,l){return s=s|0,l=l|0,Ae(l)|0&&(n[s+104>>2]|0)!=0?l=5:l=n[1e3+(l<<2)>>2]|0,s+60+(l<<3)|0}function pr(s,l,c,f,d,m){switch(s=s|0,l=l|0,c=y(c),f=y(f),d=d|0,m=m|0,c=y(Hr(s+380+(n[976+(l<<2)>>2]<<3)|0,c)),c=y(c+y(rn(s,l,f))),n[d>>2]|0){case 2:case 1:{d=Ot(c)|0,f=y(h[m>>2]),h[m>>2]=d|f>2]=2,h[m>>2]=c);break}default:}}function Ai(s,l){return s=s|0,l=l|0,s=s+132|0,Ae(l)|0&&(n[(Sn(s,4,948)|0)+4>>2]|0)!=0?s=1:s=(n[(Sn(s,n[1040+(l<<2)>>2]|0,948)|0)+4>>2]|0)!=0,s|0}function Fr(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0;return s=s+132|0,Ae(l)|0&&(f=Sn(s,4,948)|0,(n[f+4>>2]|0)!=0)?d=4:(f=Sn(s,n[1040+(l<<2)>>2]|0,948)|0,n[f+4>>2]|0?d=4:c=y(0)),(d|0)==4&&(c=y(Hr(f,c))),y(c)}function ns(s,l,c){s=s|0,l=l|0,c=y(c);var f=$e;return f=y(h[s+908+(n[976+(l<<2)>>2]<<2)>>2]),f=y(f+y(K(s,l,c))),y(f+y(te(s,l,c)))}function Gi(s){s=s|0;var l=0,c=0,f=0;e:do if(UA(n[s+4>>2]|0)|0)l=0;else if((n[s+16>>2]|0)!=5)if(c=Zi(s)|0,!c)l=0;else for(l=0;;){if(f=Ts(s,l)|0,(n[f+24>>2]|0)==0&&(n[f+20>>2]|0)==5){l=1;break e}if(l=l+1|0,l>>>0>=c>>>0){l=0;break}}else l=1;while(0);return l|0}function Mm(s,l){s=s|0,l=l|0;var c=$e;return c=y(h[s+908+(n[976+(l<<2)>>2]<<2)>>2]),c>=y(0)&((Ot(c)|0)^1)|0}function Va(s){s=s|0;var l=$e,c=0,f=0,d=0,m=0,B=0,Q=0,k=$e;if(c=n[s+968>>2]|0,c)k=y(h[s+908>>2]),l=y(h[s+912>>2]),l=y(m7[c&0](s,k,l)),Yn(s,(Ot(l)|0)^1,3573);else{m=Zi(s)|0;do if(m|0){for(c=0,d=0;;){if(f=Ts(s,d)|0,n[f+940>>2]|0){B=8;break}if((n[f+24>>2]|0)!=1)if(Q=(ha(s,f)|0)==5,Q){c=f;break}else c=(c|0)==0?f:c;if(d=d+1|0,d>>>0>=m>>>0){B=8;break}}if((B|0)==8&&!c)break;return l=y(Va(c)),y(l+y(h[c+404>>2]))}while(0);l=y(h[s+912>>2])}return y(l)}function MA(s,l,c,f){s=s|0,l=l|0,c=y(c),f=y(f);var d=$e,m=0;return UA(l)|0?(l=1,m=3):Ae(l)|0?(l=0,m=3):(f=y(he),d=y(he)),(m|0)==3&&(d=y(Hr(s+364+(l<<3)|0,f)),f=y(Hr(s+380+(l<<3)|0,f))),m=f=y(0)&((Ot(f)|0)^1)),c=m?f:c,m=d>=y(0)&((Ot(d)|0)^1)&c>2]|0,m)|0,Le=fI(et,m)|0,Re=Ae(et)|0,j=y(rn(l,2,c)),se=y(rn(l,0,c)),ts(l,2,c)|0?Q=y(j+y(Hr(n[l+992>>2]|0,c))):Ai(l,2)|0&&nr(l,2)|0?(Q=y(h[s+908>>2]),k=y(gr(s,2)),k=y(Q-y(k+y(hn(s,2)))),Q=y(Fr(l,2,c)),Q=y(Ei(l,2,y(k-y(Q+y(xu(l,2,c)))),c,c))):Q=y(he),ts(l,0,d)|0?k=y(se+y(Hr(n[l+996>>2]|0,d))):Ai(l,0)|0&&nr(l,0)|0?(k=y(h[s+912>>2]),at=y(gr(s,0)),at=y(k-y(at+y(hn(s,0)))),k=y(Fr(l,0,d)),k=y(Ei(l,0,y(at-y(k+y(xu(l,0,d)))),d,c))):k=y(he),M=Ot(Q)|0,O=Ot(k)|0;do if(M^O&&(We=y(h[l+396>>2]),!(Ot(We)|0)))if(M){Q=y(j+y(y(k-se)*We));break}else{at=y(se+y(y(Q-j)/We)),k=O?at:k;break}while(0);O=Ot(Q)|0,M=Ot(k)|0,O|M&&(He=(O^1)&1,f=c>y(0)&((f|0)!=0&O),Q=Re?Q:f?c:Q,fa(l,Q,k,m,Re?He:f?2:He,O&(M^1)&1,Q,k,0,3623,B)|0,Q=y(h[l+908>>2]),Q=y(Q+y(rn(l,2,c))),k=y(h[l+912>>2]),k=y(k+y(rn(l,0,c)))),fa(l,Q,k,m,1,1,Q,k,1,3635,B)|0,nr(l,et)|0&&!(Ai(l,et)|0)?(He=n[976+(et<<2)>>2]|0,at=y(h[s+908+(He<<2)>>2]),at=y(at-y(h[l+908+(He<<2)>>2])),at=y(at-y(hn(s,et))),at=y(at-y(te(l,et,c))),at=y(at-y(xu(l,et,Re?c:d))),h[l+400+(n[1040+(et<<2)>>2]<<2)>>2]=at):Ze=21;do if((Ze|0)==21){if(!(Ai(l,et)|0)&&(n[s+8>>2]|0)==1){He=n[976+(et<<2)>>2]|0,at=y(h[s+908+(He<<2)>>2]),at=y(y(at-y(h[l+908+(He<<2)>>2]))*y(.5)),h[l+400+(n[1040+(et<<2)>>2]<<2)>>2]=at;break}!(Ai(l,et)|0)&&(n[s+8>>2]|0)==2&&(He=n[976+(et<<2)>>2]|0,at=y(h[s+908+(He<<2)>>2]),at=y(at-y(h[l+908+(He<<2)>>2])),h[l+400+(n[1040+(et<<2)>>2]<<2)>>2]=at)}while(0);nr(l,Le)|0&&!(Ai(l,Le)|0)?(He=n[976+(Le<<2)>>2]|0,at=y(h[s+908+(He<<2)>>2]),at=y(at-y(h[l+908+(He<<2)>>2])),at=y(at-y(hn(s,Le))),at=y(at-y(te(l,Le,c))),at=y(at-y(xu(l,Le,Re?d:c))),h[l+400+(n[1040+(Le<<2)>>2]<<2)>>2]=at):Ze=30;do if((Ze|0)==30&&!(Ai(l,Le)|0)){if((ha(s,l)|0)==2){He=n[976+(Le<<2)>>2]|0,at=y(h[s+908+(He<<2)>>2]),at=y(y(at-y(h[l+908+(He<<2)>>2]))*y(.5)),h[l+400+(n[1040+(Le<<2)>>2]<<2)>>2]=at;break}He=(ha(s,l)|0)==3,He^(n[s+28>>2]|0)==2&&(He=n[976+(Le<<2)>>2]|0,at=y(h[s+908+(He<<2)>>2]),at=y(at-y(h[l+908+(He<<2)>>2])),h[l+400+(n[1040+(Le<<2)>>2]<<2)>>2]=at)}while(0)}function Cp(s,l,c){s=s|0,l=l|0,c=c|0;var f=$e,d=0;d=n[976+(c<<2)>>2]|0,f=y(h[l+908+(d<<2)>>2]),f=y(y(h[s+908+(d<<2)>>2])-f),f=y(f-y(h[l+400+(n[1040+(c<<2)>>2]<<2)>>2])),h[l+400+(n[1e3+(c<<2)>>2]<<2)>>2]=f}function UA(s){return s=s|0,(s|1|0)==1|0}function hI(s){s=s|0;var l=$e;switch(n[s+56>>2]|0){case 0:case 3:{l=y(h[s+40>>2]),l>y(0)&((Ot(l)|0)^1)?s=o[(n[s+976>>2]|0)+2>>0]|0?1056:992:s=1056;break}default:s=s+52|0}return s|0}function gI(s,l){return s=s|0,l=l|0,(o[s+l>>0]|0)!=0|0}function nr(s,l){return s=s|0,l=l|0,s=s+132|0,Ae(l)|0&&(n[(Sn(s,5,948)|0)+4>>2]|0)!=0?s=1:s=(n[(Sn(s,n[1e3+(l<<2)>>2]|0,948)|0)+4>>2]|0)!=0,s|0}function xu(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0;return s=s+132|0,Ae(l)|0&&(f=Sn(s,5,948)|0,(n[f+4>>2]|0)!=0)?d=4:(f=Sn(s,n[1e3+(l<<2)>>2]|0,948)|0,n[f+4>>2]|0?d=4:c=y(0)),(d|0)==4&&(c=y(Hr(f,c))),y(c)}function _m(s,l,c){return s=s|0,l=l|0,c=y(c),Ai(s,l)|0?c=y(Fr(s,l,c)):c=y(-y(xu(s,l,c))),y(c)}function bu(s){return s=y(s),h[v>>2]=s,n[v>>2]|0|0}function Ep(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>1073741823)Rt();else{d=Gt(l<<2)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<2)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<2)}function Cg(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function _A(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-4-l|0)>>>2)<<2)),s=n[s>>2]|0,s|0&&pt(s)}function HA(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0;if(B=s+4|0,Q=n[B>>2]|0,d=Q-f|0,m=d>>2,s=l+(m<<2)|0,s>>>0>>0){f=Q;do n[f>>2]=n[s>>2],s=s+4|0,f=(n[B>>2]|0)+4|0,n[B>>2]=f;while(s>>>0>>0)}m|0&&bI(Q+(0-m<<2)|0,l|0,d|0)|0}function Eg(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0;return Q=l+4|0,k=n[Q>>2]|0,d=n[s>>2]|0,B=c,m=B-d|0,f=k+(0-(m>>2)<<2)|0,n[Q>>2]=f,(m|0)>0&&Er(f|0,d|0,m|0)|0,d=s+4|0,m=l+8|0,f=(n[d>>2]|0)-B|0,(f|0)>0&&(Er(n[m>>2]|0,c|0,f|0)|0,n[m>>2]=(n[m>>2]|0)+(f>>>2<<2)),B=n[s>>2]|0,n[s>>2]=n[Q>>2],n[Q>>2]=B,B=n[d>>2]|0,n[d>>2]=n[m>>2],n[m>>2]=B,B=s+8|0,c=l+12|0,s=n[B>>2]|0,n[B>>2]=n[c>>2],n[c>>2]=s,n[l>>2]=n[Q>>2],k|0}function dI(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;if(B=n[l>>2]|0,m=n[c>>2]|0,(B|0)!=(m|0)){d=s+8|0,c=((m+-4-B|0)>>>2)+1|0,s=B,f=n[d>>2]|0;do n[f>>2]=n[s>>2],f=(n[d>>2]|0)+4|0,n[d>>2]=f,s=s+4|0;while((s|0)!=(m|0));n[l>>2]=B+(c<<2)}}function Hm(){Cc()}function ga(){var s=0;return s=Gt(4)|0,qA(s),s|0}function qA(s){s=s|0,n[s>>2]=$i()|0}function Qc(s){s=s|0,s|0&&(Ig(s),pt(s))}function Ig(s){s=s|0,mi(n[s>>2]|0)}function qm(s,l,c){s=s|0,l=l|0,c=c|0,Ka(n[s>>2]|0,l,c)}function uo(s,l){s=s|0,l=y(l),pa(n[s>>2]|0,l)}function Fv(s,l){return s=s|0,l=l|0,gI(n[s>>2]|0,l)|0}function mI(){var s=0;return s=Gt(8)|0,Rv(s,0),s|0}function Rv(s,l){s=s|0,l=l|0,l?l=di(n[l>>2]|0)|0:l=oo()|0,n[s>>2]=l,n[s+4>>2]=0,_r(l,s)}function iF(s){s=s|0;var l=0;return l=Gt(8)|0,Rv(l,s),l|0}function Tv(s){s=s|0,s|0&&(Qu(s),pt(s))}function Qu(s){s=s|0;var l=0;sa(n[s>>2]|0),l=s+4|0,s=n[l>>2]|0,n[l>>2]=0,s|0&&(jA(s),pt(s))}function jA(s){s=s|0,GA(s)}function GA(s){s=s|0,s=n[s>>2]|0,s|0&&bA(s|0)}function yI(s){return s=s|0,ei(s)|0}function jm(s){s=s|0;var l=0,c=0;c=s+4|0,l=n[c>>2]|0,n[c>>2]=0,l|0&&(jA(l),pt(l)),ao(n[s>>2]|0)}function sF(s,l){s=s|0,l=l|0,tr(n[s>>2]|0,n[l>>2]|0)}function oF(s,l){s=s|0,l=l|0,ca(n[s>>2]|0,l)}function Nv(s,l,c){s=s|0,l=l|0,c=+c,wu(n[s>>2]|0,l,y(c))}function Lv(s,l,c){s=s|0,l=l|0,c=+c,ms(n[s>>2]|0,l,y(c))}function CI(s,l){s=s|0,l=l|0,yi(n[s>>2]|0,l)}function ku(s,l){s=s|0,l=l|0,ja(n[s>>2]|0,l)}function aF(s,l){s=s|0,l=l|0,FA(n[s>>2]|0,l)}function lF(s,l){s=s|0,l=l|0,Ti(n[s>>2]|0,l)}function Ip(s,l){s=s|0,l=l|0,Ic(n[s>>2]|0,l)}function cF(s,l){s=s|0,l=l|0,qa(n[s>>2]|0,l)}function Ov(s,l,c){s=s|0,l=l|0,c=+c,Bc(n[s>>2]|0,l,y(c))}function WA(s,l,c){s=s|0,l=l|0,c=+c,G(n[s>>2]|0,l,y(c))}function uF(s,l){s=s|0,l=l|0,vl(n[s>>2]|0,l)}function AF(s,l){s=s|0,l=l|0,ng(n[s>>2]|0,l)}function Mv(s,l){s=s|0,l=l|0,up(n[s>>2]|0,l)}function EI(s,l){s=s|0,l=+l,RA(n[s>>2]|0,y(l))}function II(s,l){s=s|0,l=+l,Ga(n[s>>2]|0,y(l))}function fF(s,l){s=s|0,l=+l,ji(n[s>>2]|0,y(l))}function pF(s,l){s=s|0,l=+l,Os(n[s>>2]|0,y(l))}function xl(s,l){s=s|0,l=+l,Iu(n[s>>2]|0,y(l))}function wI(s,l){s=s|0,l=+l,cI(n[s>>2]|0,y(l))}function hF(s,l){s=s|0,l=+l,TA(n[s>>2]|0,y(l))}function YA(s){s=s|0,Ap(n[s>>2]|0)}function Gm(s,l){s=s|0,l=+l,ys(n[s>>2]|0,y(l))}function Fu(s,l){s=s|0,l=+l,og(n[s>>2]|0,y(l))}function BI(s){s=s|0,ag(n[s>>2]|0)}function vI(s,l){s=s|0,l=+l,fp(n[s>>2]|0,y(l))}function gF(s,l){s=s|0,l=+l,Dc(n[s>>2]|0,y(l))}function Uv(s,l){s=s|0,l=+l,Qm(n[s>>2]|0,y(l))}function KA(s,l){s=s|0,l=+l,cg(n[s>>2]|0,y(l))}function _v(s,l){s=s|0,l=+l,vu(n[s>>2]|0,y(l))}function Wm(s,l){s=s|0,l=+l,km(n[s>>2]|0,y(l))}function Hv(s,l){s=s|0,l=+l,Du(n[s>>2]|0,y(l))}function qv(s,l){s=s|0,l=+l,uI(n[s>>2]|0,y(l))}function Ym(s,l){s=s|0,l=+l,Aa(n[s>>2]|0,y(l))}function jv(s,l,c){s=s|0,l=l|0,c=+c,Bu(n[s>>2]|0,l,y(c))}function dF(s,l,c){s=s|0,l=l|0,c=+c,Si(n[s>>2]|0,l,y(c))}function S(s,l,c){s=s|0,l=l|0,c=+c,vc(n[s>>2]|0,l,y(c))}function D(s){return s=s|0,rg(n[s>>2]|0)|0}function T(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,wc(d,n[l>>2]|0,c),q(s,d),C=f}function q(s,l){s=s|0,l=l|0,W(s,n[l+4>>2]|0,+y(h[l>>2]))}function W(s,l,c){s=s|0,l=l|0,c=+c,n[s>>2]=l,E[s+8>>3]=c}function ce(s){return s=s|0,la(n[s>>2]|0)|0}function Se(s){return s=s|0,lo(n[s>>2]|0)|0}function It(s){return s=s|0,Ec(n[s>>2]|0)|0}function Ct(s){return s=s|0,Kn(n[s>>2]|0)|0}function xt(s){return s=s|0,bm(n[s>>2]|0)|0}function Nr(s){return s=s|0,aa(n[s>>2]|0)|0}function is(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,Dt(d,n[l>>2]|0,c),q(s,d),C=f}function fi(s){return s=s|0,Vn(n[s>>2]|0)|0}function Ao(s){return s=s|0,ig(n[s>>2]|0)|0}function VA(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,ua(f,n[l>>2]|0),q(s,f),C=c}function Ho(s){return s=s|0,+ +y(Zr(n[s>>2]|0))}function rt(s){return s=s|0,+ +y(Tn(n[s>>2]|0))}function Je(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,yr(f,n[l>>2]|0),q(s,f),C=c}function ft(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,lg(f,n[l>>2]|0),q(s,f),C=c}function jt(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,mt(f,n[l>>2]|0),q(s,f),C=c}function Cr(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,ug(f,n[l>>2]|0),q(s,f),C=c}function In(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,Ag(f,n[l>>2]|0),q(s,f),C=c}function Sr(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,Fm(f,n[l>>2]|0),q(s,f),C=c}function wn(s){return s=s|0,+ +y(Sc(n[s>>2]|0))}function ni(s,l){return s=s|0,l=l|0,+ +y(sg(n[s>>2]|0,l))}function Xr(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,lt(d,n[l>>2]|0,c),q(s,d),C=f}function fo(s,l,c){s=s|0,l=l|0,c=c|0,oa(n[s>>2]|0,n[l>>2]|0,c)}function mF(s,l){s=s|0,l=l|0,Ls(n[s>>2]|0,n[l>>2]|0)}function Ive(s){return s=s|0,Zi(n[s>>2]|0)|0}function wve(s){return s=s|0,s=xe(n[s>>2]|0)|0,s?s=yI(s)|0:s=0,s|0}function Bve(s,l){return s=s|0,l=l|0,s=Ts(n[s>>2]|0,l)|0,s?s=yI(s)|0:s=0,s|0}function vve(s,l){s=s|0,l=l|0;var c=0,f=0;f=Gt(4)|0,YG(f,l),c=s+4|0,l=n[c>>2]|0,n[c>>2]=f,l|0&&(jA(l),pt(l)),Ha(n[s>>2]|0,1)}function YG(s,l){s=s|0,l=l|0,Lve(s,l)}function Dve(s,l,c,f,d,m){s=s|0,l=l|0,c=y(c),f=f|0,d=y(d),m=m|0;var B=0,Q=0;B=C,C=C+16|0,Q=B,Sve(Q,ei(l)|0,+c,f,+d,m),h[s>>2]=y(+E[Q>>3]),h[s+4>>2]=y(+E[Q+8>>3]),C=B}function Sve(s,l,c,f,d,m){s=s|0,l=l|0,c=+c,f=f|0,d=+d,m=m|0;var B=0,Q=0,k=0,M=0,O=0;B=C,C=C+32|0,O=B+8|0,M=B+20|0,k=B,Q=B+16|0,E[O>>3]=c,n[M>>2]=f,E[k>>3]=d,n[Q>>2]=m,Pve(s,n[l+4>>2]|0,O,M,k,Q),C=B}function Pve(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,Q=0;B=C,C=C+16|0,Q=B,za(Q),l=da(l)|0,xve(s,l,+E[c>>3],n[f>>2]|0,+E[d>>3],n[m>>2]|0),Xa(Q),C=B}function da(s){return s=s|0,n[s>>2]|0}function xve(s,l,c,f,d,m){s=s|0,l=l|0,c=+c,f=f|0,d=+d,m=m|0;var B=0;B=bl(bve()|0)|0,c=+JA(c),f=yF(f)|0,d=+JA(d),Qve(s,ui(0,B|0,l|0,+c,f|0,+d,yF(m)|0)|0)}function bve(){var s=0;return o[7608]|0||(Tve(9120),s=7608,n[s>>2]=1,n[s+4>>2]=0),9120}function bl(s){return s=s|0,n[s+8>>2]|0}function JA(s){return s=+s,+ +CF(s)}function yF(s){return s=s|0,VG(s)|0}function Qve(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;d=C,C=C+32|0,c=d,f=l,f&1?(kve(c,0),$n(f|0,c|0)|0,Fve(s,c),Rve(c)):(n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=n[l+8>>2],n[s+12>>2]=n[l+12>>2]),C=d}function kve(s,l){s=s|0,l=l|0,KG(s,l),n[s+8>>2]=0,o[s+24>>0]=0}function Fve(s,l){s=s|0,l=l|0,l=l+8|0,n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=n[l+8>>2],n[s+12>>2]=n[l+12>>2]}function Rve(s){s=s|0,o[s+24>>0]=0}function KG(s,l){s=s|0,l=l|0,n[s>>2]=l}function VG(s){return s=s|0,s|0}function CF(s){return s=+s,+s}function Tve(s){s=s|0,Ql(s,Nve()|0,4)}function Nve(){return 1064}function Ql(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c,n[s+8>>2]=cp(l|0,c+1|0)|0}function Lve(s,l){s=s|0,l=l|0,l=n[l>>2]|0,n[s>>2]=l,El(l|0)}function Ove(s){s=s|0;var l=0,c=0;c=s+4|0,l=n[c>>2]|0,n[c>>2]=0,l|0&&(jA(l),pt(l)),Ha(n[s>>2]|0,0)}function Mve(s){s=s|0,Ve(n[s>>2]|0)}function Uve(s){return s=s|0,vt(n[s>>2]|0)|0}function _ve(s,l,c,f){s=s|0,l=+l,c=+c,f=f|0,Pc(n[s>>2]|0,y(l),y(c),f)}function Hve(s){return s=s|0,+ +y(Dl(n[s>>2]|0))}function qve(s){return s=s|0,+ +y(fg(n[s>>2]|0))}function jve(s){return s=s|0,+ +y(Su(n[s>>2]|0))}function Gve(s){return s=s|0,+ +y(NA(n[s>>2]|0))}function Wve(s){return s=s|0,+ +y(pp(n[s>>2]|0))}function Yve(s){return s=s|0,+ +y(Wa(n[s>>2]|0))}function Kve(s,l){s=s|0,l=l|0,E[s>>3]=+y(Dl(n[l>>2]|0)),E[s+8>>3]=+y(fg(n[l>>2]|0)),E[s+16>>3]=+y(Su(n[l>>2]|0)),E[s+24>>3]=+y(NA(n[l>>2]|0)),E[s+32>>3]=+y(pp(n[l>>2]|0)),E[s+40>>3]=+y(Wa(n[l>>2]|0))}function Vve(s,l){return s=s|0,l=l|0,+ +y(pg(n[s>>2]|0,l))}function Jve(s,l){return s=s|0,l=l|0,+ +y(hp(n[s>>2]|0,l))}function zve(s,l){return s=s|0,l=l|0,+ +y(Uo(n[s>>2]|0,l))}function Xve(){return qn()|0}function Zve(){$ve(),eDe(),tDe(),rDe(),nDe(),iDe()}function $ve(){nLe(11713,4938,1)}function eDe(){wNe(10448)}function tDe(){nNe(10408)}function rDe(){STe(10324)}function nDe(){TFe(10096)}function iDe(){sDe(9132)}function sDe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0,We=0,Le=0,Re=0,et=0,Ze=0,at=0,He=0,Ge=0,Tt=0,Rr=0,ir=0,Jt=0,Ir=0,Qr=0,rr=0,Bn=0,po=0,ho=0,go=0,ya=0,Qp=0,kp=0,kl=0,Fp=0,Lu=0,Ou=0,Rp=0,Tp=0,Np=0,Jr=0,Fl=0,Lp=0,Fc=0,Op=0,Mp=0,Mu=0,Uu=0,Rc=0,Us=0,$a=0,qo=0,Rl=0,nf=0,sf=0,_u=0,of=0,af=0,_s=0,ws=0,Tl=0,Pn=0,lf=0,mo=0,Tc=0,yo=0,Nc=0,cf=0,uf=0,Lc=0,Hs=0,Nl=0,Af=0,ff=0,pf=0,vr=0,jn=0,Bs=0,Co=0,qs=0,Pr=0,lr=0,Ll=0;l=C,C=C+672|0,c=l+656|0,Ll=l+648|0,lr=l+640|0,Pr=l+632|0,qs=l+624|0,Co=l+616|0,Bs=l+608|0,jn=l+600|0,vr=l+592|0,pf=l+584|0,ff=l+576|0,Af=l+568|0,Nl=l+560|0,Hs=l+552|0,Lc=l+544|0,uf=l+536|0,cf=l+528|0,Nc=l+520|0,yo=l+512|0,Tc=l+504|0,mo=l+496|0,lf=l+488|0,Pn=l+480|0,Tl=l+472|0,ws=l+464|0,_s=l+456|0,af=l+448|0,of=l+440|0,_u=l+432|0,sf=l+424|0,nf=l+416|0,Rl=l+408|0,qo=l+400|0,$a=l+392|0,Us=l+384|0,Rc=l+376|0,Uu=l+368|0,Mu=l+360|0,Mp=l+352|0,Op=l+344|0,Fc=l+336|0,Lp=l+328|0,Fl=l+320|0,Jr=l+312|0,Np=l+304|0,Tp=l+296|0,Rp=l+288|0,Ou=l+280|0,Lu=l+272|0,Fp=l+264|0,kl=l+256|0,kp=l+248|0,Qp=l+240|0,ya=l+232|0,go=l+224|0,ho=l+216|0,po=l+208|0,Bn=l+200|0,rr=l+192|0,Qr=l+184|0,Ir=l+176|0,Jt=l+168|0,ir=l+160|0,Rr=l+152|0,Tt=l+144|0,Ge=l+136|0,He=l+128|0,at=l+120|0,Ze=l+112|0,et=l+104|0,Re=l+96|0,Le=l+88|0,We=l+80|0,se=l+72|0,j=l+64|0,O=l+56|0,M=l+48|0,k=l+40|0,Q=l+32|0,B=l+24|0,m=l+16|0,d=l+8|0,f=l,oDe(s,3646),aDe(s,3651,2)|0,lDe(s,3665,2)|0,cDe(s,3682,18)|0,n[Ll>>2]=19,n[Ll+4>>2]=0,n[c>>2]=n[Ll>>2],n[c+4>>2]=n[Ll+4>>2],DI(s,3690,c)|0,n[lr>>2]=1,n[lr+4>>2]=0,n[c>>2]=n[lr>>2],n[c+4>>2]=n[lr+4>>2],uDe(s,3696,c)|0,n[Pr>>2]=2,n[Pr+4>>2]=0,n[c>>2]=n[Pr>>2],n[c+4>>2]=n[Pr+4>>2],Ru(s,3706,c)|0,n[qs>>2]=1,n[qs+4>>2]=0,n[c>>2]=n[qs>>2],n[c+4>>2]=n[qs+4>>2],wg(s,3722,c)|0,n[Co>>2]=2,n[Co+4>>2]=0,n[c>>2]=n[Co>>2],n[c+4>>2]=n[Co+4>>2],wg(s,3734,c)|0,n[Bs>>2]=3,n[Bs+4>>2]=0,n[c>>2]=n[Bs>>2],n[c+4>>2]=n[Bs+4>>2],Ru(s,3753,c)|0,n[jn>>2]=4,n[jn+4>>2]=0,n[c>>2]=n[jn>>2],n[c+4>>2]=n[jn+4>>2],Ru(s,3769,c)|0,n[vr>>2]=5,n[vr+4>>2]=0,n[c>>2]=n[vr>>2],n[c+4>>2]=n[vr+4>>2],Ru(s,3783,c)|0,n[pf>>2]=6,n[pf+4>>2]=0,n[c>>2]=n[pf>>2],n[c+4>>2]=n[pf+4>>2],Ru(s,3796,c)|0,n[ff>>2]=7,n[ff+4>>2]=0,n[c>>2]=n[ff>>2],n[c+4>>2]=n[ff+4>>2],Ru(s,3813,c)|0,n[Af>>2]=8,n[Af+4>>2]=0,n[c>>2]=n[Af>>2],n[c+4>>2]=n[Af+4>>2],Ru(s,3825,c)|0,n[Nl>>2]=3,n[Nl+4>>2]=0,n[c>>2]=n[Nl>>2],n[c+4>>2]=n[Nl+4>>2],wg(s,3843,c)|0,n[Hs>>2]=4,n[Hs+4>>2]=0,n[c>>2]=n[Hs>>2],n[c+4>>2]=n[Hs+4>>2],wg(s,3853,c)|0,n[Lc>>2]=9,n[Lc+4>>2]=0,n[c>>2]=n[Lc>>2],n[c+4>>2]=n[Lc+4>>2],Ru(s,3870,c)|0,n[uf>>2]=10,n[uf+4>>2]=0,n[c>>2]=n[uf>>2],n[c+4>>2]=n[uf+4>>2],Ru(s,3884,c)|0,n[cf>>2]=11,n[cf+4>>2]=0,n[c>>2]=n[cf>>2],n[c+4>>2]=n[cf+4>>2],Ru(s,3896,c)|0,n[Nc>>2]=1,n[Nc+4>>2]=0,n[c>>2]=n[Nc>>2],n[c+4>>2]=n[Nc+4>>2],Es(s,3907,c)|0,n[yo>>2]=2,n[yo+4>>2]=0,n[c>>2]=n[yo>>2],n[c+4>>2]=n[yo+4>>2],Es(s,3915,c)|0,n[Tc>>2]=3,n[Tc+4>>2]=0,n[c>>2]=n[Tc>>2],n[c+4>>2]=n[Tc+4>>2],Es(s,3928,c)|0,n[mo>>2]=4,n[mo+4>>2]=0,n[c>>2]=n[mo>>2],n[c+4>>2]=n[mo+4>>2],Es(s,3948,c)|0,n[lf>>2]=5,n[lf+4>>2]=0,n[c>>2]=n[lf>>2],n[c+4>>2]=n[lf+4>>2],Es(s,3960,c)|0,n[Pn>>2]=6,n[Pn+4>>2]=0,n[c>>2]=n[Pn>>2],n[c+4>>2]=n[Pn+4>>2],Es(s,3974,c)|0,n[Tl>>2]=7,n[Tl+4>>2]=0,n[c>>2]=n[Tl>>2],n[c+4>>2]=n[Tl+4>>2],Es(s,3983,c)|0,n[ws>>2]=20,n[ws+4>>2]=0,n[c>>2]=n[ws>>2],n[c+4>>2]=n[ws+4>>2],DI(s,3999,c)|0,n[_s>>2]=8,n[_s+4>>2]=0,n[c>>2]=n[_s>>2],n[c+4>>2]=n[_s+4>>2],Es(s,4012,c)|0,n[af>>2]=9,n[af+4>>2]=0,n[c>>2]=n[af>>2],n[c+4>>2]=n[af+4>>2],Es(s,4022,c)|0,n[of>>2]=21,n[of+4>>2]=0,n[c>>2]=n[of>>2],n[c+4>>2]=n[of+4>>2],DI(s,4039,c)|0,n[_u>>2]=10,n[_u+4>>2]=0,n[c>>2]=n[_u>>2],n[c+4>>2]=n[_u+4>>2],Es(s,4053,c)|0,n[sf>>2]=11,n[sf+4>>2]=0,n[c>>2]=n[sf>>2],n[c+4>>2]=n[sf+4>>2],Es(s,4065,c)|0,n[nf>>2]=12,n[nf+4>>2]=0,n[c>>2]=n[nf>>2],n[c+4>>2]=n[nf+4>>2],Es(s,4084,c)|0,n[Rl>>2]=13,n[Rl+4>>2]=0,n[c>>2]=n[Rl>>2],n[c+4>>2]=n[Rl+4>>2],Es(s,4097,c)|0,n[qo>>2]=14,n[qo+4>>2]=0,n[c>>2]=n[qo>>2],n[c+4>>2]=n[qo+4>>2],Es(s,4117,c)|0,n[$a>>2]=15,n[$a+4>>2]=0,n[c>>2]=n[$a>>2],n[c+4>>2]=n[$a+4>>2],Es(s,4129,c)|0,n[Us>>2]=16,n[Us+4>>2]=0,n[c>>2]=n[Us>>2],n[c+4>>2]=n[Us+4>>2],Es(s,4148,c)|0,n[Rc>>2]=17,n[Rc+4>>2]=0,n[c>>2]=n[Rc>>2],n[c+4>>2]=n[Rc+4>>2],Es(s,4161,c)|0,n[Uu>>2]=18,n[Uu+4>>2]=0,n[c>>2]=n[Uu>>2],n[c+4>>2]=n[Uu+4>>2],Es(s,4181,c)|0,n[Mu>>2]=5,n[Mu+4>>2]=0,n[c>>2]=n[Mu>>2],n[c+4>>2]=n[Mu+4>>2],wg(s,4196,c)|0,n[Mp>>2]=6,n[Mp+4>>2]=0,n[c>>2]=n[Mp>>2],n[c+4>>2]=n[Mp+4>>2],wg(s,4206,c)|0,n[Op>>2]=7,n[Op+4>>2]=0,n[c>>2]=n[Op>>2],n[c+4>>2]=n[Op+4>>2],wg(s,4217,c)|0,n[Fc>>2]=3,n[Fc+4>>2]=0,n[c>>2]=n[Fc>>2],n[c+4>>2]=n[Fc+4>>2],zA(s,4235,c)|0,n[Lp>>2]=1,n[Lp+4>>2]=0,n[c>>2]=n[Lp>>2],n[c+4>>2]=n[Lp+4>>2],EF(s,4251,c)|0,n[Fl>>2]=4,n[Fl+4>>2]=0,n[c>>2]=n[Fl>>2],n[c+4>>2]=n[Fl+4>>2],zA(s,4263,c)|0,n[Jr>>2]=5,n[Jr+4>>2]=0,n[c>>2]=n[Jr>>2],n[c+4>>2]=n[Jr+4>>2],zA(s,4279,c)|0,n[Np>>2]=6,n[Np+4>>2]=0,n[c>>2]=n[Np>>2],n[c+4>>2]=n[Np+4>>2],zA(s,4293,c)|0,n[Tp>>2]=7,n[Tp+4>>2]=0,n[c>>2]=n[Tp>>2],n[c+4>>2]=n[Tp+4>>2],zA(s,4306,c)|0,n[Rp>>2]=8,n[Rp+4>>2]=0,n[c>>2]=n[Rp>>2],n[c+4>>2]=n[Rp+4>>2],zA(s,4323,c)|0,n[Ou>>2]=9,n[Ou+4>>2]=0,n[c>>2]=n[Ou>>2],n[c+4>>2]=n[Ou+4>>2],zA(s,4335,c)|0,n[Lu>>2]=2,n[Lu+4>>2]=0,n[c>>2]=n[Lu>>2],n[c+4>>2]=n[Lu+4>>2],EF(s,4353,c)|0,n[Fp>>2]=12,n[Fp+4>>2]=0,n[c>>2]=n[Fp>>2],n[c+4>>2]=n[Fp+4>>2],Bg(s,4363,c)|0,n[kl>>2]=1,n[kl+4>>2]=0,n[c>>2]=n[kl>>2],n[c+4>>2]=n[kl+4>>2],XA(s,4376,c)|0,n[kp>>2]=2,n[kp+4>>2]=0,n[c>>2]=n[kp>>2],n[c+4>>2]=n[kp+4>>2],XA(s,4388,c)|0,n[Qp>>2]=13,n[Qp+4>>2]=0,n[c>>2]=n[Qp>>2],n[c+4>>2]=n[Qp+4>>2],Bg(s,4402,c)|0,n[ya>>2]=14,n[ya+4>>2]=0,n[c>>2]=n[ya>>2],n[c+4>>2]=n[ya+4>>2],Bg(s,4411,c)|0,n[go>>2]=15,n[go+4>>2]=0,n[c>>2]=n[go>>2],n[c+4>>2]=n[go+4>>2],Bg(s,4421,c)|0,n[ho>>2]=16,n[ho+4>>2]=0,n[c>>2]=n[ho>>2],n[c+4>>2]=n[ho+4>>2],Bg(s,4433,c)|0,n[po>>2]=17,n[po+4>>2]=0,n[c>>2]=n[po>>2],n[c+4>>2]=n[po+4>>2],Bg(s,4446,c)|0,n[Bn>>2]=18,n[Bn+4>>2]=0,n[c>>2]=n[Bn>>2],n[c+4>>2]=n[Bn+4>>2],Bg(s,4458,c)|0,n[rr>>2]=3,n[rr+4>>2]=0,n[c>>2]=n[rr>>2],n[c+4>>2]=n[rr+4>>2],XA(s,4471,c)|0,n[Qr>>2]=1,n[Qr+4>>2]=0,n[c>>2]=n[Qr>>2],n[c+4>>2]=n[Qr+4>>2],Gv(s,4486,c)|0,n[Ir>>2]=10,n[Ir+4>>2]=0,n[c>>2]=n[Ir>>2],n[c+4>>2]=n[Ir+4>>2],zA(s,4496,c)|0,n[Jt>>2]=11,n[Jt+4>>2]=0,n[c>>2]=n[Jt>>2],n[c+4>>2]=n[Jt+4>>2],zA(s,4508,c)|0,n[ir>>2]=3,n[ir+4>>2]=0,n[c>>2]=n[ir>>2],n[c+4>>2]=n[ir+4>>2],EF(s,4519,c)|0,n[Rr>>2]=4,n[Rr+4>>2]=0,n[c>>2]=n[Rr>>2],n[c+4>>2]=n[Rr+4>>2],ADe(s,4530,c)|0,n[Tt>>2]=19,n[Tt+4>>2]=0,n[c>>2]=n[Tt>>2],n[c+4>>2]=n[Tt+4>>2],fDe(s,4542,c)|0,n[Ge>>2]=12,n[Ge+4>>2]=0,n[c>>2]=n[Ge>>2],n[c+4>>2]=n[Ge+4>>2],pDe(s,4554,c)|0,n[He>>2]=13,n[He+4>>2]=0,n[c>>2]=n[He>>2],n[c+4>>2]=n[He+4>>2],hDe(s,4568,c)|0,n[at>>2]=2,n[at+4>>2]=0,n[c>>2]=n[at>>2],n[c+4>>2]=n[at+4>>2],gDe(s,4578,c)|0,n[Ze>>2]=20,n[Ze+4>>2]=0,n[c>>2]=n[Ze>>2],n[c+4>>2]=n[Ze+4>>2],dDe(s,4587,c)|0,n[et>>2]=22,n[et+4>>2]=0,n[c>>2]=n[et>>2],n[c+4>>2]=n[et+4>>2],DI(s,4602,c)|0,n[Re>>2]=23,n[Re+4>>2]=0,n[c>>2]=n[Re>>2],n[c+4>>2]=n[Re+4>>2],DI(s,4619,c)|0,n[Le>>2]=14,n[Le+4>>2]=0,n[c>>2]=n[Le>>2],n[c+4>>2]=n[Le+4>>2],mDe(s,4629,c)|0,n[We>>2]=1,n[We+4>>2]=0,n[c>>2]=n[We>>2],n[c+4>>2]=n[We+4>>2],yDe(s,4637,c)|0,n[se>>2]=4,n[se+4>>2]=0,n[c>>2]=n[se>>2],n[c+4>>2]=n[se+4>>2],XA(s,4653,c)|0,n[j>>2]=5,n[j+4>>2]=0,n[c>>2]=n[j>>2],n[c+4>>2]=n[j+4>>2],XA(s,4669,c)|0,n[O>>2]=6,n[O+4>>2]=0,n[c>>2]=n[O>>2],n[c+4>>2]=n[O+4>>2],XA(s,4686,c)|0,n[M>>2]=7,n[M+4>>2]=0,n[c>>2]=n[M>>2],n[c+4>>2]=n[M+4>>2],XA(s,4701,c)|0,n[k>>2]=8,n[k+4>>2]=0,n[c>>2]=n[k>>2],n[c+4>>2]=n[k+4>>2],XA(s,4719,c)|0,n[Q>>2]=9,n[Q+4>>2]=0,n[c>>2]=n[Q>>2],n[c+4>>2]=n[Q+4>>2],XA(s,4736,c)|0,n[B>>2]=21,n[B+4>>2]=0,n[c>>2]=n[B>>2],n[c+4>>2]=n[B+4>>2],CDe(s,4754,c)|0,n[m>>2]=2,n[m+4>>2]=0,n[c>>2]=n[m>>2],n[c+4>>2]=n[m+4>>2],Gv(s,4772,c)|0,n[d>>2]=3,n[d+4>>2]=0,n[c>>2]=n[d>>2],n[c+4>>2]=n[d+4>>2],Gv(s,4790,c)|0,n[f>>2]=4,n[f+4>>2]=0,n[c>>2]=n[f>>2],n[c+4>>2]=n[f+4>>2],Gv(s,4808,c)|0,C=l}function oDe(s,l){s=s|0,l=l|0;var c=0;c=DFe()|0,n[s>>2]=c,SFe(c,l),Pp(n[s>>2]|0)}function aDe(s,l,c){return s=s|0,l=l|0,c=c|0,AFe(s,cn(l)|0,c,0),s|0}function lDe(s,l,c){return s=s|0,l=l|0,c=c|0,Jke(s,cn(l)|0,c,0),s|0}function cDe(s,l,c){return s=s|0,l=l|0,c=c|0,Nke(s,cn(l)|0,c,0),s|0}function DI(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Cke(s,l,d),C=f,s|0}function uDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],eke(s,l,d),C=f,s|0}function Ru(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],MQe(s,l,d),C=f,s|0}function wg(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],wQe(s,l,d),C=f,s|0}function Es(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],oQe(s,l,d),C=f,s|0}function zA(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Gbe(s,l,d),C=f,s|0}function EF(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],xbe(s,l,d),C=f,s|0}function Bg(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ebe(s,l,d),C=f,s|0}function XA(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Mxe(s,l,d),C=f,s|0}function Gv(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],wxe(s,l,d),C=f,s|0}function ADe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],oxe(s,l,d),C=f,s|0}function fDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],GPe(s,l,d),C=f,s|0}function pDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],bPe(s,l,d),C=f,s|0}function hDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],hPe(s,l,d),C=f,s|0}function gDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],XSe(s,l,d),C=f,s|0}function dDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],TSe(s,l,d),C=f,s|0}function mDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ySe(s,l,d),C=f,s|0}function yDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],eSe(s,l,d),C=f,s|0}function CDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],EDe(s,l,d),C=f,s|0}function EDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],IDe(s,c,d,1),C=f}function cn(s){return s=s|0,s|0}function IDe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=IF()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=wDe(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,BDe(m,f)|0,f),C=d}function IF(){var s=0,l=0;if(o[7616]|0||(XG(9136),Zt(24,9136,_|0)|0,l=7616,n[l>>2]=1,n[l+4>>2]=0),!(br(9136)|0)){s=9136,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));XG(9136)}return 9136}function wDe(s){return s=s|0,0}function BDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=IF()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],zG(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(SDe(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function un(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,Q=0,k=0,M=0,O=0,j=0,se=0,We=0;B=C,C=C+32|0,se=B+24|0,j=B+20|0,k=B+16|0,O=B+12|0,M=B+8|0,Q=B+4|0,We=B,n[j>>2]=l,n[k>>2]=c,n[O>>2]=f,n[M>>2]=d,n[Q>>2]=m,m=s+28|0,n[We>>2]=n[m>>2],n[se>>2]=n[We>>2],vDe(s+24|0,se,j,O,M,k,Q)|0,n[m>>2]=n[n[m>>2]>>2],C=B}function vDe(s,l,c,f,d,m,B){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0,s=DDe(l)|0,l=Gt(24)|0,JG(l+4|0,n[c>>2]|0,n[f>>2]|0,n[d>>2]|0,n[m>>2]|0,n[B>>2]|0),n[l>>2]=n[s>>2],n[s>>2]=l,l|0}function DDe(s){return s=s|0,n[s>>2]|0}function JG(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,n[s>>2]=l,n[s+4>>2]=c,n[s+8>>2]=f,n[s+12>>2]=d,n[s+16>>2]=m}function Ar(s,l){return s=s|0,l=l|0,l|s|0}function zG(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function SDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=PDe(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,xDe(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],zG(m,f,c),n[k>>2]=(n[k>>2]|0)+12,bDe(s,Q),QDe(Q),C=M;return}}function PDe(s){return s=s|0,357913941}function xDe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function bDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function QDe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function XG(s){s=s|0,RDe(s)}function kDe(s){s=s|0,FDe(s+24|0)}function br(s){return s=s|0,n[s>>2]|0}function FDe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function RDe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,3,l,TDe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Gr(){return 9228}function TDe(){return 1140}function NDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=LDe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=ODe(l,f)|0,C=c,l|0}function Wr(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,n[s>>2]=l,n[s+4>>2]=c,n[s+8>>2]=f,n[s+12>>2]=d,n[s+16>>2]=m}function LDe(s){return s=s|0,(n[(IF()|0)+24>>2]|0)+(s*12|0)|0}function ODe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;return d=C,C=C+48|0,f=d,c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),rf[c&31](f,s),f=MDe(f)|0,C=d,f|0}function MDe(s){s=s|0;var l=0,c=0,f=0,d=0;return d=C,C=C+32|0,l=d+12|0,c=d,f=wF(ZG()|0)|0,f?(BF(l,f),vF(c,l),UDe(s,c),s=DF(l)|0):s=_De(s)|0,C=d,s|0}function ZG(){var s=0;return o[7632]|0||(zDe(9184),Zt(25,9184,_|0)|0,s=7632,n[s>>2]=1,n[s+4>>2]=0),9184}function wF(s){return s=s|0,n[s+36>>2]|0}function BF(s,l){s=s|0,l=l|0,n[s>>2]=l,n[s+4>>2]=s,n[s+8>>2]=0}function vF(s,l){s=s|0,l=l|0,n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=0}function UDe(s,l){s=s|0,l=l|0,GDe(l,s,s+8|0,s+16|0,s+24|0,s+32|0,s+40|0)|0}function DF(s){return s=s|0,n[(n[s+4>>2]|0)+8>>2]|0}function _De(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,Q=0,k=0;k=C,C=C+16|0,c=k+4|0,f=k,d=Ja(8)|0,m=d,B=Gt(48)|0,Q=B,l=Q+48|0;do n[Q>>2]=n[s>>2],Q=Q+4|0,s=s+4|0;while((Q|0)<(l|0));return l=m+4|0,n[l>>2]=B,Q=Gt(8)|0,B=n[l>>2]|0,n[f>>2]=0,n[c>>2]=n[f>>2],$G(Q,B,c),n[d>>2]=Q,C=k,m|0}function $G(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Gt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1092,n[c+12>>2]=l,n[s+4>>2]=c}function HDe(s){s=s|0,Zm(s),pt(s)}function qDe(s){s=s|0,s=n[s+12>>2]|0,s|0&&pt(s)}function jDe(s){s=s|0,pt(s)}function GDe(s,l,c,f,d,m,B){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0,m=WDe(n[s>>2]|0,l,c,f,d,m,B)|0,B=s+4|0,n[(n[B>>2]|0)+8>>2]=m,n[(n[B>>2]|0)+8>>2]|0}function WDe(s,l,c,f,d,m,B){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0;var Q=0,k=0;return Q=C,C=C+16|0,k=Q,za(k),s=da(s)|0,B=YDe(s,+E[l>>3],+E[c>>3],+E[f>>3],+E[d>>3],+E[m>>3],+E[B>>3])|0,Xa(k),C=Q,B|0}function YDe(s,l,c,f,d,m,B){s=s|0,l=+l,c=+c,f=+f,d=+d,m=+m,B=+B;var Q=0;return Q=bl(KDe()|0)|0,l=+JA(l),c=+JA(c),f=+JA(f),d=+JA(d),m=+JA(m),Fs(0,Q|0,s|0,+l,+c,+f,+d,+m,+ +JA(B))|0}function KDe(){var s=0;return o[7624]|0||(VDe(9172),s=7624,n[s>>2]=1,n[s+4>>2]=0),9172}function VDe(s){s=s|0,Ql(s,JDe()|0,6)}function JDe(){return 1112}function zDe(s){s=s|0,wp(s)}function XDe(s){s=s|0,e9(s+24|0),t9(s+16|0)}function e9(s){s=s|0,$De(s)}function t9(s){s=s|0,ZDe(s)}function ZDe(s){s=s|0;var l=0,c=0;if(l=n[s>>2]|0,l|0)do c=l,l=n[l>>2]|0,pt(c);while((l|0)!=0);n[s>>2]=0}function $De(s){s=s|0;var l=0,c=0;if(l=n[s>>2]|0,l|0)do c=l,l=n[l>>2]|0,pt(c);while((l|0)!=0);n[s>>2]=0}function wp(s){s=s|0;var l=0;n[s+16>>2]=0,n[s+20>>2]=0,l=s+24|0,n[l>>2]=0,n[s+28>>2]=l,n[s+36>>2]=0,o[s+40>>0]=0,o[s+41>>0]=0}function eSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],tSe(s,c,d,0),C=f}function tSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=SF()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=rSe(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,nSe(m,f)|0,f),C=d}function SF(){var s=0,l=0;if(o[7640]|0||(n9(9232),Zt(26,9232,_|0)|0,l=7640,n[l>>2]=1,n[l+4>>2]=0),!(br(9232)|0)){s=9232,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));n9(9232)}return 9232}function rSe(s){return s=s|0,0}function nSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=SF()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],r9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(iSe(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function r9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function iSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=sSe(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,oSe(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],r9(m,f,c),n[k>>2]=(n[k>>2]|0)+12,aSe(s,Q),lSe(Q),C=M;return}}function sSe(s){return s=s|0,357913941}function oSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function aSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function lSe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function n9(s){s=s|0,ASe(s)}function cSe(s){s=s|0,uSe(s+24|0)}function uSe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function ASe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,1,l,fSe()|0,3),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function fSe(){return 1144}function pSe(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0;var m=0,B=0,Q=0,k=0;m=C,C=C+16|0,B=m+8|0,Q=m,k=hSe(s)|0,s=n[k+4>>2]|0,n[Q>>2]=n[k>>2],n[Q+4>>2]=s,n[B>>2]=n[Q>>2],n[B+4>>2]=n[Q+4>>2],gSe(l,B,c,f,d),C=m}function hSe(s){return s=s|0,(n[(SF()|0)+24>>2]|0)+(s*12|0)|0}function gSe(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0;var m=0,B=0,Q=0,k=0,M=0;M=C,C=C+16|0,B=M+2|0,Q=M+1|0,k=M,m=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(m=n[(n[s>>2]|0)+m>>2]|0),Tu(B,c),c=+Nu(B,c),Tu(Q,f),f=+Nu(Q,f),ZA(k,d),k=$A(k,d)|0,y7[m&1](s,c,f,k),C=M}function Tu(s,l){s=s|0,l=+l}function Nu(s,l){return s=s|0,l=+l,+ +mSe(l)}function ZA(s,l){s=s|0,l=l|0}function $A(s,l){return s=s|0,l=l|0,dSe(l)|0}function dSe(s){return s=s|0,s|0}function mSe(s){return s=+s,+s}function ySe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],CSe(s,c,d,1),C=f}function CSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=PF()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=ESe(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,ISe(m,f)|0,f),C=d}function PF(){var s=0,l=0;if(o[7648]|0||(s9(9268),Zt(27,9268,_|0)|0,l=7648,n[l>>2]=1,n[l+4>>2]=0),!(br(9268)|0)){s=9268,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));s9(9268)}return 9268}function ESe(s){return s=s|0,0}function ISe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=PF()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],i9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(wSe(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function i9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function wSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=BSe(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,vSe(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],i9(m,f,c),n[k>>2]=(n[k>>2]|0)+12,DSe(s,Q),SSe(Q),C=M;return}}function BSe(s){return s=s|0,357913941}function vSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function DSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function SSe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function s9(s){s=s|0,bSe(s)}function PSe(s){s=s|0,xSe(s+24|0)}function xSe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function bSe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,4,l,QSe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function QSe(){return 1160}function kSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=FSe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=RSe(l,f)|0,C=c,l|0}function FSe(s){return s=s|0,(n[(PF()|0)+24>>2]|0)+(s*12|0)|0}function RSe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),o9(Fg[c&31](s)|0)|0}function o9(s){return s=s|0,s&1|0}function TSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],NSe(s,c,d,0),C=f}function NSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=xF()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=LSe(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,OSe(m,f)|0,f),C=d}function xF(){var s=0,l=0;if(o[7656]|0||(l9(9304),Zt(28,9304,_|0)|0,l=7656,n[l>>2]=1,n[l+4>>2]=0),!(br(9304)|0)){s=9304,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));l9(9304)}return 9304}function LSe(s){return s=s|0,0}function OSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=xF()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],a9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(MSe(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function a9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function MSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=USe(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,_Se(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],a9(m,f,c),n[k>>2]=(n[k>>2]|0)+12,HSe(s,Q),qSe(Q),C=M;return}}function USe(s){return s=s|0,357913941}function _Se(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function HSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function qSe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function l9(s){s=s|0,WSe(s)}function jSe(s){s=s|0,GSe(s+24|0)}function GSe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function WSe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,5,l,YSe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function YSe(){return 1164}function KSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=VSe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],JSe(l,d,c),C=f}function VSe(s){return s=s|0,(n[(xF()|0)+24>>2]|0)+(s*12|0)|0}function JSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),Bp(d,c),c=vp(d,c)|0,rf[f&31](s,c),Dp(d),C=m}function Bp(s,l){s=s|0,l=l|0,zSe(s,l)}function vp(s,l){return s=s|0,l=l|0,s|0}function Dp(s){s=s|0,jA(s)}function zSe(s,l){s=s|0,l=l|0,bF(s,l)}function bF(s,l){s=s|0,l=l|0,n[s>>2]=l}function XSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ZSe(s,c,d,0),C=f}function ZSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=QF()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=$Se(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,ePe(m,f)|0,f),C=d}function QF(){var s=0,l=0;if(o[7664]|0||(u9(9340),Zt(29,9340,_|0)|0,l=7664,n[l>>2]=1,n[l+4>>2]=0),!(br(9340)|0)){s=9340,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));u9(9340)}return 9340}function $Se(s){return s=s|0,0}function ePe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=QF()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],c9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(tPe(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function c9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function tPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=rPe(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,nPe(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],c9(m,f,c),n[k>>2]=(n[k>>2]|0)+12,iPe(s,Q),sPe(Q),C=M;return}}function rPe(s){return s=s|0,357913941}function nPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function iPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function sPe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function u9(s){s=s|0,lPe(s)}function oPe(s){s=s|0,aPe(s+24|0)}function aPe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function lPe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,4,l,cPe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function cPe(){return 1180}function uPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=APe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=fPe(l,d,c)|0,C=f,c|0}function APe(s){return s=s|0,(n[(QF()|0)+24>>2]|0)+(s*12|0)|0}function fPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;return m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),vg(d,c),d=Dg(d,c)|0,d=Wv(SR[f&15](s,d)|0)|0,C=m,d|0}function vg(s,l){s=s|0,l=l|0}function Dg(s,l){return s=s|0,l=l|0,pPe(l)|0}function Wv(s){return s=s|0,s|0}function pPe(s){return s=s|0,s|0}function hPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],gPe(s,c,d,0),C=f}function gPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=kF()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=dPe(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,mPe(m,f)|0,f),C=d}function kF(){var s=0,l=0;if(o[7672]|0||(f9(9376),Zt(30,9376,_|0)|0,l=7672,n[l>>2]=1,n[l+4>>2]=0),!(br(9376)|0)){s=9376,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));f9(9376)}return 9376}function dPe(s){return s=s|0,0}function mPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=kF()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],A9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(yPe(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function A9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function yPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=CPe(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,EPe(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],A9(m,f,c),n[k>>2]=(n[k>>2]|0)+12,IPe(s,Q),wPe(Q),C=M;return}}function CPe(s){return s=s|0,357913941}function EPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function IPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function wPe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function f9(s){s=s|0,DPe(s)}function BPe(s){s=s|0,vPe(s+24|0)}function vPe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function DPe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,5,l,p9()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function p9(){return 1196}function SPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=PPe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=xPe(l,f)|0,C=c,l|0}function PPe(s){return s=s|0,(n[(kF()|0)+24>>2]|0)+(s*12|0)|0}function xPe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),Wv(Fg[c&31](s)|0)|0}function bPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],QPe(s,c,d,1),C=f}function QPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=FF()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=kPe(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,FPe(m,f)|0,f),C=d}function FF(){var s=0,l=0;if(o[7680]|0||(g9(9412),Zt(31,9412,_|0)|0,l=7680,n[l>>2]=1,n[l+4>>2]=0),!(br(9412)|0)){s=9412,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));g9(9412)}return 9412}function kPe(s){return s=s|0,0}function FPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=FF()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],h9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(RPe(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function h9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function RPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=TPe(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,NPe(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],h9(m,f,c),n[k>>2]=(n[k>>2]|0)+12,LPe(s,Q),OPe(Q),C=M;return}}function TPe(s){return s=s|0,357913941}function NPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function LPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function OPe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function g9(s){s=s|0,_Pe(s)}function MPe(s){s=s|0,UPe(s+24|0)}function UPe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function _Pe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,6,l,d9()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function d9(){return 1200}function HPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=qPe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=jPe(l,f)|0,C=c,l|0}function qPe(s){return s=s|0,(n[(FF()|0)+24>>2]|0)+(s*12|0)|0}function jPe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),Yv(Fg[c&31](s)|0)|0}function Yv(s){return s=s|0,s|0}function GPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],WPe(s,c,d,0),C=f}function WPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=RF()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=YPe(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,KPe(m,f)|0,f),C=d}function RF(){var s=0,l=0;if(o[7688]|0||(y9(9448),Zt(32,9448,_|0)|0,l=7688,n[l>>2]=1,n[l+4>>2]=0),!(br(9448)|0)){s=9448,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));y9(9448)}return 9448}function YPe(s){return s=s|0,0}function KPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=RF()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],m9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(VPe(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function m9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function VPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=JPe(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,zPe(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],m9(m,f,c),n[k>>2]=(n[k>>2]|0)+12,XPe(s,Q),ZPe(Q),C=M;return}}function JPe(s){return s=s|0,357913941}function zPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function XPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function ZPe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function y9(s){s=s|0,txe(s)}function $Pe(s){s=s|0,exe(s+24|0)}function exe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function txe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,6,l,C9()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function C9(){return 1204}function rxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=nxe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ixe(l,d,c),C=f}function nxe(s){return s=s|0,(n[(RF()|0)+24>>2]|0)+(s*12|0)|0}function ixe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),TF(d,c),d=NF(d,c)|0,rf[f&31](s,d),C=m}function TF(s,l){s=s|0,l=l|0}function NF(s,l){return s=s|0,l=l|0,sxe(l)|0}function sxe(s){return s=s|0,s|0}function oxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],axe(s,c,d,0),C=f}function axe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=LF()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=lxe(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,cxe(m,f)|0,f),C=d}function LF(){var s=0,l=0;if(o[7696]|0||(I9(9484),Zt(33,9484,_|0)|0,l=7696,n[l>>2]=1,n[l+4>>2]=0),!(br(9484)|0)){s=9484,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));I9(9484)}return 9484}function lxe(s){return s=s|0,0}function cxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=LF()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],E9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(uxe(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function E9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function uxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Axe(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,fxe(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],E9(m,f,c),n[k>>2]=(n[k>>2]|0)+12,pxe(s,Q),hxe(Q),C=M;return}}function Axe(s){return s=s|0,357913941}function fxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function pxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function hxe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function I9(s){s=s|0,mxe(s)}function gxe(s){s=s|0,dxe(s+24|0)}function dxe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function mxe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,1,l,yxe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function yxe(){return 1212}function Cxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0;d=C,C=C+16|0,m=d+8|0,B=d,Q=Exe(s)|0,s=n[Q+4>>2]|0,n[B>>2]=n[Q>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],Ixe(l,m,c,f),C=d}function Exe(s){return s=s|0,(n[(LF()|0)+24>>2]|0)+(s*12|0)|0}function Ixe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0;Q=C,C=C+16|0,m=Q+1|0,B=Q,d=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(d=n[(n[s>>2]|0)+d>>2]|0),TF(m,c),m=NF(m,c)|0,vg(B,f),B=Dg(B,f)|0,FI[d&15](s,m,B),C=Q}function wxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Bxe(s,c,d,1),C=f}function Bxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=OF()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=vxe(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,Dxe(m,f)|0,f),C=d}function OF(){var s=0,l=0;if(o[7704]|0||(B9(9520),Zt(34,9520,_|0)|0,l=7704,n[l>>2]=1,n[l+4>>2]=0),!(br(9520)|0)){s=9520,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));B9(9520)}return 9520}function vxe(s){return s=s|0,0}function Dxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=OF()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],w9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(Sxe(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function w9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function Sxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Pxe(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,xxe(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],w9(m,f,c),n[k>>2]=(n[k>>2]|0)+12,bxe(s,Q),Qxe(Q),C=M;return}}function Pxe(s){return s=s|0,357913941}function xxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function bxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Qxe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function B9(s){s=s|0,Rxe(s)}function kxe(s){s=s|0,Fxe(s+24|0)}function Fxe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function Rxe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,1,l,Txe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Txe(){return 1224}function Nxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;return d=C,C=C+16|0,m=d+8|0,B=d,Q=Lxe(s)|0,s=n[Q+4>>2]|0,n[B>>2]=n[Q>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],f=+Oxe(l,m,c),C=d,+f}function Lxe(s){return s=s|0,(n[(OF()|0)+24>>2]|0)+(s*12|0)|0}function Oxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),ZA(d,c),d=$A(d,c)|0,B=+CF(+E7[f&7](s,d)),C=m,+B}function Mxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Uxe(s,c,d,1),C=f}function Uxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=MF()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=_xe(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,Hxe(m,f)|0,f),C=d}function MF(){var s=0,l=0;if(o[7712]|0||(D9(9556),Zt(35,9556,_|0)|0,l=7712,n[l>>2]=1,n[l+4>>2]=0),!(br(9556)|0)){s=9556,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));D9(9556)}return 9556}function _xe(s){return s=s|0,0}function Hxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=MF()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],v9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(qxe(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function v9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function qxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=jxe(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,Gxe(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],v9(m,f,c),n[k>>2]=(n[k>>2]|0)+12,Wxe(s,Q),Yxe(Q),C=M;return}}function jxe(s){return s=s|0,357913941}function Gxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Wxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Yxe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function D9(s){s=s|0,Jxe(s)}function Kxe(s){s=s|0,Vxe(s+24|0)}function Vxe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function Jxe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,5,l,zxe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function zxe(){return 1232}function Xxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=Zxe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=+$xe(l,d),C=f,+c}function Zxe(s){return s=s|0,(n[(MF()|0)+24>>2]|0)+(s*12|0)|0}function $xe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),+ +CF(+C7[c&15](s))}function ebe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],tbe(s,c,d,1),C=f}function tbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=UF()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=rbe(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,nbe(m,f)|0,f),C=d}function UF(){var s=0,l=0;if(o[7720]|0||(P9(9592),Zt(36,9592,_|0)|0,l=7720,n[l>>2]=1,n[l+4>>2]=0),!(br(9592)|0)){s=9592,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));P9(9592)}return 9592}function rbe(s){return s=s|0,0}function nbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=UF()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],S9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(ibe(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function S9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function ibe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=sbe(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,obe(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],S9(m,f,c),n[k>>2]=(n[k>>2]|0)+12,abe(s,Q),lbe(Q),C=M;return}}function sbe(s){return s=s|0,357913941}function obe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function abe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function lbe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function P9(s){s=s|0,Abe(s)}function cbe(s){s=s|0,ube(s+24|0)}function ube(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function Abe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,7,l,fbe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function fbe(){return 1276}function pbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=hbe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=gbe(l,f)|0,C=c,l|0}function hbe(s){return s=s|0,(n[(UF()|0)+24>>2]|0)+(s*12|0)|0}function gbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;return d=C,C=C+16|0,f=d,c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),rf[c&31](f,s),f=x9(f)|0,C=d,f|0}function x9(s){s=s|0;var l=0,c=0,f=0,d=0;return d=C,C=C+32|0,l=d+12|0,c=d,f=wF(b9()|0)|0,f?(BF(l,f),vF(c,l),dbe(s,c),s=DF(l)|0):s=mbe(s)|0,C=d,s|0}function b9(){var s=0;return o[7736]|0||(Pbe(9640),Zt(25,9640,_|0)|0,s=7736,n[s>>2]=1,n[s+4>>2]=0),9640}function dbe(s,l){s=s|0,l=l|0,Ibe(l,s,s+8|0)|0}function mbe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,Q=0;return c=C,C=C+16|0,d=c+4|0,B=c,f=Ja(8)|0,l=f,Q=Gt(16)|0,n[Q>>2]=n[s>>2],n[Q+4>>2]=n[s+4>>2],n[Q+8>>2]=n[s+8>>2],n[Q+12>>2]=n[s+12>>2],m=l+4|0,n[m>>2]=Q,s=Gt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],_F(s,m,d),n[f>>2]=s,C=c,l|0}function _F(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Gt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1244,n[c+12>>2]=l,n[s+4>>2]=c}function ybe(s){s=s|0,Zm(s),pt(s)}function Cbe(s){s=s|0,s=n[s+12>>2]|0,s|0&&pt(s)}function Ebe(s){s=s|0,pt(s)}function Ibe(s,l,c){return s=s|0,l=l|0,c=c|0,l=wbe(n[s>>2]|0,l,c)|0,c=s+4|0,n[(n[c>>2]|0)+8>>2]=l,n[(n[c>>2]|0)+8>>2]|0}function wbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;return f=C,C=C+16|0,d=f,za(d),s=da(s)|0,c=Bbe(s,n[l>>2]|0,+E[c>>3])|0,Xa(d),C=f,c|0}function Bbe(s,l,c){s=s|0,l=l|0,c=+c;var f=0;return f=bl(vbe()|0)|0,l=yF(l)|0,Cl(0,f|0,s|0,l|0,+ +JA(c))|0}function vbe(){var s=0;return o[7728]|0||(Dbe(9628),s=7728,n[s>>2]=1,n[s+4>>2]=0),9628}function Dbe(s){s=s|0,Ql(s,Sbe()|0,2)}function Sbe(){return 1264}function Pbe(s){s=s|0,wp(s)}function xbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],bbe(s,c,d,1),C=f}function bbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=HF()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=Qbe(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,kbe(m,f)|0,f),C=d}function HF(){var s=0,l=0;if(o[7744]|0||(k9(9684),Zt(37,9684,_|0)|0,l=7744,n[l>>2]=1,n[l+4>>2]=0),!(br(9684)|0)){s=9684,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));k9(9684)}return 9684}function Qbe(s){return s=s|0,0}function kbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=HF()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Q9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(Fbe(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function Q9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function Fbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Rbe(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,Tbe(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],Q9(m,f,c),n[k>>2]=(n[k>>2]|0)+12,Nbe(s,Q),Lbe(Q),C=M;return}}function Rbe(s){return s=s|0,357913941}function Tbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Nbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Lbe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function k9(s){s=s|0,Ube(s)}function Obe(s){s=s|0,Mbe(s+24|0)}function Mbe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function Ube(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,5,l,_be()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function _be(){return 1280}function Hbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=qbe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=jbe(l,d,c)|0,C=f,c|0}function qbe(s){return s=s|0,(n[(HF()|0)+24>>2]|0)+(s*12|0)|0}function jbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return B=C,C=C+32|0,d=B,m=B+16|0,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),ZA(m,c),m=$A(m,c)|0,FI[f&15](d,s,m),m=x9(d)|0,C=B,m|0}function Gbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Wbe(s,c,d,1),C=f}function Wbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=qF()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=Ybe(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,Kbe(m,f)|0,f),C=d}function qF(){var s=0,l=0;if(o[7752]|0||(R9(9720),Zt(38,9720,_|0)|0,l=7752,n[l>>2]=1,n[l+4>>2]=0),!(br(9720)|0)){s=9720,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));R9(9720)}return 9720}function Ybe(s){return s=s|0,0}function Kbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=qF()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],F9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(Vbe(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function F9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function Vbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Jbe(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,zbe(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],F9(m,f,c),n[k>>2]=(n[k>>2]|0)+12,Xbe(s,Q),Zbe(Q),C=M;return}}function Jbe(s){return s=s|0,357913941}function zbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Xbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Zbe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function R9(s){s=s|0,tQe(s)}function $be(s){s=s|0,eQe(s+24|0)}function eQe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function tQe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,8,l,rQe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function rQe(){return 1288}function nQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=iQe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=sQe(l,f)|0,C=c,l|0}function iQe(s){return s=s|0,(n[(qF()|0)+24>>2]|0)+(s*12|0)|0}function sQe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),VG(Fg[c&31](s)|0)|0}function oQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],aQe(s,c,d,0),C=f}function aQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=jF()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=lQe(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,cQe(m,f)|0,f),C=d}function jF(){var s=0,l=0;if(o[7760]|0||(N9(9756),Zt(39,9756,_|0)|0,l=7760,n[l>>2]=1,n[l+4>>2]=0),!(br(9756)|0)){s=9756,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));N9(9756)}return 9756}function lQe(s){return s=s|0,0}function cQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=jF()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],T9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(uQe(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function T9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function uQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=AQe(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,fQe(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],T9(m,f,c),n[k>>2]=(n[k>>2]|0)+12,pQe(s,Q),hQe(Q),C=M;return}}function AQe(s){return s=s|0,357913941}function fQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function pQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function hQe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function N9(s){s=s|0,mQe(s)}function gQe(s){s=s|0,dQe(s+24|0)}function dQe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function mQe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,8,l,yQe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function yQe(){return 1292}function CQe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=EQe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],IQe(l,d,c),C=f}function EQe(s){return s=s|0,(n[(jF()|0)+24>>2]|0)+(s*12|0)|0}function IQe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),Tu(d,c),c=+Nu(d,c),d7[f&31](s,c),C=m}function wQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],BQe(s,c,d,0),C=f}function BQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=GF()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=vQe(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,DQe(m,f)|0,f),C=d}function GF(){var s=0,l=0;if(o[7768]|0||(O9(9792),Zt(40,9792,_|0)|0,l=7768,n[l>>2]=1,n[l+4>>2]=0),!(br(9792)|0)){s=9792,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));O9(9792)}return 9792}function vQe(s){return s=s|0,0}function DQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=GF()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],L9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(SQe(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function L9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function SQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=PQe(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,xQe(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],L9(m,f,c),n[k>>2]=(n[k>>2]|0)+12,bQe(s,Q),QQe(Q),C=M;return}}function PQe(s){return s=s|0,357913941}function xQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function bQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function QQe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function O9(s){s=s|0,RQe(s)}function kQe(s){s=s|0,FQe(s+24|0)}function FQe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function RQe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,1,l,TQe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function TQe(){return 1300}function NQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f;var d=0,m=0,B=0,Q=0;d=C,C=C+16|0,m=d+8|0,B=d,Q=LQe(s)|0,s=n[Q+4>>2]|0,n[B>>2]=n[Q>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],OQe(l,m,c,f),C=d}function LQe(s){return s=s|0,(n[(GF()|0)+24>>2]|0)+(s*12|0)|0}function OQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f;var d=0,m=0,B=0,Q=0;Q=C,C=C+16|0,m=Q+1|0,B=Q,d=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(d=n[(n[s>>2]|0)+d>>2]|0),ZA(m,c),m=$A(m,c)|0,Tu(B,f),f=+Nu(B,f),v7[d&15](s,m,f),C=Q}function MQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],UQe(s,c,d,0),C=f}function UQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=WF()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=_Qe(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,HQe(m,f)|0,f),C=d}function WF(){var s=0,l=0;if(o[7776]|0||(U9(9828),Zt(41,9828,_|0)|0,l=7776,n[l>>2]=1,n[l+4>>2]=0),!(br(9828)|0)){s=9828,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));U9(9828)}return 9828}function _Qe(s){return s=s|0,0}function HQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=WF()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],M9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(qQe(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function M9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function qQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=jQe(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,GQe(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],M9(m,f,c),n[k>>2]=(n[k>>2]|0)+12,WQe(s,Q),YQe(Q),C=M;return}}function jQe(s){return s=s|0,357913941}function GQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function WQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function YQe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function U9(s){s=s|0,JQe(s)}function KQe(s){s=s|0,VQe(s+24|0)}function VQe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function JQe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,7,l,zQe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function zQe(){return 1312}function XQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=ZQe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],$Qe(l,d,c),C=f}function ZQe(s){return s=s|0,(n[(WF()|0)+24>>2]|0)+(s*12|0)|0}function $Qe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),ZA(d,c),d=$A(d,c)|0,rf[f&31](s,d),C=m}function eke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],tke(s,c,d,0),C=f}function tke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=YF()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=rke(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,nke(m,f)|0,f),C=d}function YF(){var s=0,l=0;if(o[7784]|0||(H9(9864),Zt(42,9864,_|0)|0,l=7784,n[l>>2]=1,n[l+4>>2]=0),!(br(9864)|0)){s=9864,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));H9(9864)}return 9864}function rke(s){return s=s|0,0}function nke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=YF()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],_9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(ike(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function _9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function ike(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=ske(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,oke(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],_9(m,f,c),n[k>>2]=(n[k>>2]|0)+12,ake(s,Q),lke(Q),C=M;return}}function ske(s){return s=s|0,357913941}function oke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function ake(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function lke(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function H9(s){s=s|0,Ake(s)}function cke(s){s=s|0,uke(s+24|0)}function uke(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function Ake(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,8,l,fke()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function fke(){return 1320}function pke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=hke(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],gke(l,d,c),C=f}function hke(s){return s=s|0,(n[(YF()|0)+24>>2]|0)+(s*12|0)|0}function gke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),dke(d,c),d=mke(d,c)|0,rf[f&31](s,d),C=m}function dke(s,l){s=s|0,l=l|0}function mke(s,l){return s=s|0,l=l|0,yke(l)|0}function yke(s){return s=s|0,s|0}function Cke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Eke(s,c,d,0),C=f}function Eke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=KF()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=Ike(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,wke(m,f)|0,f),C=d}function KF(){var s=0,l=0;if(o[7792]|0||(j9(9900),Zt(43,9900,_|0)|0,l=7792,n[l>>2]=1,n[l+4>>2]=0),!(br(9900)|0)){s=9900,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));j9(9900)}return 9900}function Ike(s){return s=s|0,0}function wke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=KF()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],q9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(Bke(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function q9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function Bke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=vke(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,Dke(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],q9(m,f,c),n[k>>2]=(n[k>>2]|0)+12,Ske(s,Q),Pke(Q),C=M;return}}function vke(s){return s=s|0,357913941}function Dke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Ske(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Pke(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function j9(s){s=s|0,Qke(s)}function xke(s){s=s|0,bke(s+24|0)}function bke(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function Qke(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,22,l,kke()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function kke(){return 1344}function Fke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;c=C,C=C+16|0,f=c+8|0,d=c,m=Rke(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],Tke(l,f),C=c}function Rke(s){return s=s|0,(n[(KF()|0)+24>>2]|0)+(s*12|0)|0}function Tke(s,l){s=s|0,l=l|0;var c=0;c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),tf[c&127](s)}function Nke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=VF()|0,s=Lke(c)|0,un(m,l,d,s,Oke(c,f)|0,f)}function VF(){var s=0,l=0;if(o[7800]|0||(W9(9936),Zt(44,9936,_|0)|0,l=7800,n[l>>2]=1,n[l+4>>2]=0),!(br(9936)|0)){s=9936,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));W9(9936)}return 9936}function Lke(s){return s=s|0,s|0}function Oke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0;return Q=C,C=C+16|0,d=Q,m=Q+4|0,n[d>>2]=s,k=VF()|0,B=k+24|0,l=Ar(l,4)|0,n[m>>2]=l,c=k+28|0,f=n[c>>2]|0,f>>>0<(n[k+32>>2]|0)>>>0?(G9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(Mke(B,d,m),l=n[c>>2]|0),C=Q,(l-(n[B>>2]|0)>>3)+-1|0}function G9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function Mke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0;if(Q=C,C=C+32|0,d=Q,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=Uke(s)|0,f>>>0>>0)Vr(s);else{k=n[s>>2]|0,O=(n[s+8>>2]|0)-k|0,M=O>>2,_ke(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-k>>3,s+8|0),B=d+8|0,G9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,Hke(s,d),qke(d),C=Q;return}}function Uke(s){return s=s|0,536870911}function _ke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Gt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function Hke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function qke(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&pt(s)}function W9(s){s=s|0,Wke(s)}function jke(s){s=s|0,Gke(s+24|0)}function Gke(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),pt(c))}function Wke(s){s=s|0;var l=0;l=Gr()|0,Wr(s,1,23,l,C9()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Yke(s,l){s=s|0,l=l|0,Vke(n[(Kke(s)|0)>>2]|0,l)}function Kke(s){return s=s|0,(n[(VF()|0)+24>>2]|0)+(s<<3)|0}function Vke(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,TF(f,l),l=NF(f,l)|0,tf[s&127](l),C=c}function Jke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=JF()|0,s=zke(c)|0,un(m,l,d,s,Xke(c,f)|0,f)}function JF(){var s=0,l=0;if(o[7808]|0||(K9(9972),Zt(45,9972,_|0)|0,l=7808,n[l>>2]=1,n[l+4>>2]=0),!(br(9972)|0)){s=9972,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));K9(9972)}return 9972}function zke(s){return s=s|0,s|0}function Xke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0;return Q=C,C=C+16|0,d=Q,m=Q+4|0,n[d>>2]=s,k=JF()|0,B=k+24|0,l=Ar(l,4)|0,n[m>>2]=l,c=k+28|0,f=n[c>>2]|0,f>>>0<(n[k+32>>2]|0)>>>0?(Y9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(Zke(B,d,m),l=n[c>>2]|0),C=Q,(l-(n[B>>2]|0)>>3)+-1|0}function Y9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function Zke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0;if(Q=C,C=C+32|0,d=Q,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=$ke(s)|0,f>>>0>>0)Vr(s);else{k=n[s>>2]|0,O=(n[s+8>>2]|0)-k|0,M=O>>2,eFe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-k>>3,s+8|0),B=d+8|0,Y9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,tFe(s,d),rFe(d),C=Q;return}}function $ke(s){return s=s|0,536870911}function eFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Gt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function tFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function rFe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&pt(s)}function K9(s){s=s|0,sFe(s)}function nFe(s){s=s|0,iFe(s+24|0)}function iFe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),pt(c))}function sFe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,1,9,l,oFe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function oFe(){return 1348}function aFe(s,l){return s=s|0,l=l|0,cFe(n[(lFe(s)|0)>>2]|0,l)|0}function lFe(s){return s=s|0,(n[(JF()|0)+24>>2]|0)+(s<<3)|0}function cFe(s,l){s=s|0,l=l|0;var c=0,f=0;return c=C,C=C+16|0,f=c,V9(f,l),l=J9(f,l)|0,l=Wv(Fg[s&31](l)|0)|0,C=c,l|0}function V9(s,l){s=s|0,l=l|0}function J9(s,l){return s=s|0,l=l|0,uFe(l)|0}function uFe(s){return s=s|0,s|0}function AFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=zF()|0,s=fFe(c)|0,un(m,l,d,s,pFe(c,f)|0,f)}function zF(){var s=0,l=0;if(o[7816]|0||(X9(10008),Zt(46,10008,_|0)|0,l=7816,n[l>>2]=1,n[l+4>>2]=0),!(br(10008)|0)){s=10008,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));X9(10008)}return 10008}function fFe(s){return s=s|0,s|0}function pFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0;return Q=C,C=C+16|0,d=Q,m=Q+4|0,n[d>>2]=s,k=zF()|0,B=k+24|0,l=Ar(l,4)|0,n[m>>2]=l,c=k+28|0,f=n[c>>2]|0,f>>>0<(n[k+32>>2]|0)>>>0?(z9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(hFe(B,d,m),l=n[c>>2]|0),C=Q,(l-(n[B>>2]|0)>>3)+-1|0}function z9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function hFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0;if(Q=C,C=C+32|0,d=Q,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=gFe(s)|0,f>>>0>>0)Vr(s);else{k=n[s>>2]|0,O=(n[s+8>>2]|0)-k|0,M=O>>2,dFe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-k>>3,s+8|0),B=d+8|0,z9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,mFe(s,d),yFe(d),C=Q;return}}function gFe(s){return s=s|0,536870911}function dFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Gt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function mFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function yFe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&pt(s)}function X9(s){s=s|0,IFe(s)}function CFe(s){s=s|0,EFe(s+24|0)}function EFe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),pt(c))}function IFe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,1,15,l,p9()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function wFe(s){return s=s|0,vFe(n[(BFe(s)|0)>>2]|0)|0}function BFe(s){return s=s|0,(n[(zF()|0)+24>>2]|0)+(s<<3)|0}function vFe(s){return s=s|0,Wv(oD[s&7]()|0)|0}function DFe(){var s=0;return o[7832]|0||(RFe(10052),Zt(25,10052,_|0)|0,s=7832,n[s>>2]=1,n[s+4>>2]=0),10052}function SFe(s,l){s=s|0,l=l|0,n[s>>2]=PFe()|0,n[s+4>>2]=xFe()|0,n[s+12>>2]=l,n[s+8>>2]=bFe()|0,n[s+32>>2]=2}function PFe(){return 11709}function xFe(){return 1188}function bFe(){return Kv()|0}function QFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Sp(f,896)|0)==512?c|0&&(kFe(c),pt(c)):l|0&&(Qu(l),pt(l))}function Sp(s,l){return s=s|0,l=l|0,l&s|0}function kFe(s){s=s|0,s=n[s+4>>2]|0,s|0&&xp(s)}function Kv(){var s=0;return o[7824]|0||(n[2511]=FFe()|0,n[2512]=0,s=7824,n[s>>2]=1,n[s+4>>2]=0),10044}function FFe(){return 0}function RFe(s){s=s|0,wp(s)}function TFe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0;l=C,C=C+32|0,c=l+24|0,m=l+16|0,d=l+8|0,f=l,NFe(s,4827),LFe(s,4834,3)|0,OFe(s,3682,47)|0,n[m>>2]=9,n[m+4>>2]=0,n[c>>2]=n[m>>2],n[c+4>>2]=n[m+4>>2],MFe(s,4841,c)|0,n[d>>2]=1,n[d+4>>2]=0,n[c>>2]=n[d>>2],n[c+4>>2]=n[d+4>>2],UFe(s,4871,c)|0,n[f>>2]=10,n[f+4>>2]=0,n[c>>2]=n[f>>2],n[c+4>>2]=n[f+4>>2],_Fe(s,4891,c)|0,C=l}function NFe(s,l){s=s|0,l=l|0;var c=0;c=yTe()|0,n[s>>2]=c,CTe(c,l),Pp(n[s>>2]|0)}function LFe(s,l,c){return s=s|0,l=l|0,c=c|0,rTe(s,cn(l)|0,c,0),s|0}function OFe(s,l,c){return s=s|0,l=l|0,c=c|0,HRe(s,cn(l)|0,c,0),s|0}function MFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],wRe(s,l,d),C=f,s|0}function UFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],nRe(s,l,d),C=f,s|0}function _Fe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],HFe(s,l,d),C=f,s|0}function HFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],qFe(s,c,d,1),C=f}function qFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=XF()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=jFe(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,GFe(m,f)|0,f),C=d}function XF(){var s=0,l=0;if(o[7840]|0||($9(10100),Zt(48,10100,_|0)|0,l=7840,n[l>>2]=1,n[l+4>>2]=0),!(br(10100)|0)){s=10100,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));$9(10100)}return 10100}function jFe(s){return s=s|0,0}function GFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=XF()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Z9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(WFe(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function Z9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function WFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=YFe(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,KFe(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],Z9(m,f,c),n[k>>2]=(n[k>>2]|0)+12,VFe(s,Q),JFe(Q),C=M;return}}function YFe(s){return s=s|0,357913941}function KFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function VFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function JFe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function $9(s){s=s|0,ZFe(s)}function zFe(s){s=s|0,XFe(s+24|0)}function XFe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function ZFe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,6,l,$Fe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function $Fe(){return 1364}function eRe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=tRe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=rRe(l,d,c)|0,C=f,c|0}function tRe(s){return s=s|0,(n[(XF()|0)+24>>2]|0)+(s*12|0)|0}function rRe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;return m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),ZA(d,c),d=$A(d,c)|0,d=o9(SR[f&15](s,d)|0)|0,C=m,d|0}function nRe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],iRe(s,c,d,0),C=f}function iRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=ZF()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=sRe(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,oRe(m,f)|0,f),C=d}function ZF(){var s=0,l=0;if(o[7848]|0||(t5(10136),Zt(49,10136,_|0)|0,l=7848,n[l>>2]=1,n[l+4>>2]=0),!(br(10136)|0)){s=10136,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));t5(10136)}return 10136}function sRe(s){return s=s|0,0}function oRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=ZF()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],e5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(aRe(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function e5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function aRe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=lRe(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,cRe(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],e5(m,f,c),n[k>>2]=(n[k>>2]|0)+12,uRe(s,Q),ARe(Q),C=M;return}}function lRe(s){return s=s|0,357913941}function cRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function uRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function ARe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function t5(s){s=s|0,hRe(s)}function fRe(s){s=s|0,pRe(s+24|0)}function pRe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function hRe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,9,l,gRe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function gRe(){return 1372}function dRe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=mRe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],yRe(l,d,c),C=f}function mRe(s){return s=s|0,(n[(ZF()|0)+24>>2]|0)+(s*12|0)|0}function yRe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=$e;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),CRe(d,c),B=y(ERe(d,c)),g7[f&1](s,B),C=m}function CRe(s,l){s=s|0,l=+l}function ERe(s,l){return s=s|0,l=+l,y(IRe(l))}function IRe(s){return s=+s,y(s)}function wRe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,d=f+8|0,m=f,Q=n[c>>2]|0,B=n[c+4>>2]|0,c=cn(l)|0,n[m>>2]=Q,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],BRe(s,c,d,0),C=f}function BRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0,k=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,Q=d,M=n[c>>2]|0,k=n[c+4>>2]|0,B=n[s>>2]|0,s=$F()|0,n[O>>2]=M,n[O+4>>2]=k,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=vRe(m)|0,n[Q>>2]=M,n[Q+4>>2]=k,n[m>>2]=n[Q>>2],n[m+4>>2]=n[Q+4>>2],un(B,l,s,c,DRe(m,f)|0,f),C=d}function $F(){var s=0,l=0;if(o[7856]|0||(n5(10172),Zt(50,10172,_|0)|0,l=7856,n[l>>2]=1,n[l+4>>2]=0),!(br(10172)|0)){s=10172,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));n5(10172)}return 10172}function vRe(s){return s=s|0,0}function DRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,Q=O,k=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[Q>>2]=m,n[Q+4>>2]=f,j=$F()|0,M=j+24|0,s=Ar(l,4)|0,n[k>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],r5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(SRe(M,Q,k),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function r5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function SRe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,Q=M,k=s+4|0,d=(((n[k>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=PRe(s)|0,m>>>0>>0)Vr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,j=se<<1,xRe(Q,se>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[k>>2]|0)-O|0)/12|0,s+8|0),k=Q+8|0,m=n[k>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],r5(m,f,c),n[k>>2]=(n[k>>2]|0)+12,bRe(s,Q),QRe(Q),C=M;return}}function PRe(s){return s=s|0,357913941}function xRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Gt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function bRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function QRe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&pt(s)}function n5(s){s=s|0,RRe(s)}function kRe(s){s=s|0,FRe(s+24|0)}function FRe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),pt(c))}function RRe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,2,3,l,TRe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function TRe(){return 1380}function NRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0;d=C,C=C+16|0,m=d+8|0,B=d,Q=LRe(s)|0,s=n[Q+4>>2]|0,n[B>>2]=n[Q>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],ORe(l,m,c,f),C=d}function LRe(s){return s=s|0,(n[($F()|0)+24>>2]|0)+(s*12|0)|0}function ORe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0;Q=C,C=C+16|0,m=Q+1|0,B=Q,d=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(d=n[(n[s>>2]|0)+d>>2]|0),ZA(m,c),m=$A(m,c)|0,MRe(B,f),B=URe(B,f)|0,FI[d&15](s,m,B),C=Q}function MRe(s,l){s=s|0,l=l|0}function URe(s,l){return s=s|0,l=l|0,_Re(l)|0}function _Re(s){return s=s|0,(s|0)!=0|0}function HRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=eR()|0,s=qRe(c)|0,un(m,l,d,s,jRe(c,f)|0,f)}function eR(){var s=0,l=0;if(o[7864]|0||(s5(10208),Zt(51,10208,_|0)|0,l=7864,n[l>>2]=1,n[l+4>>2]=0),!(br(10208)|0)){s=10208,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));s5(10208)}return 10208}function qRe(s){return s=s|0,s|0}function jRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0;return Q=C,C=C+16|0,d=Q,m=Q+4|0,n[d>>2]=s,k=eR()|0,B=k+24|0,l=Ar(l,4)|0,n[m>>2]=l,c=k+28|0,f=n[c>>2]|0,f>>>0<(n[k+32>>2]|0)>>>0?(i5(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(GRe(B,d,m),l=n[c>>2]|0),C=Q,(l-(n[B>>2]|0)>>3)+-1|0}function i5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function GRe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0;if(Q=C,C=C+32|0,d=Q,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=WRe(s)|0,f>>>0>>0)Vr(s);else{k=n[s>>2]|0,O=(n[s+8>>2]|0)-k|0,M=O>>2,YRe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-k>>3,s+8|0),B=d+8|0,i5(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,KRe(s,d),VRe(d),C=Q;return}}function WRe(s){return s=s|0,536870911}function YRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Gt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function KRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function VRe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&pt(s)}function s5(s){s=s|0,XRe(s)}function JRe(s){s=s|0,zRe(s+24|0)}function zRe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),pt(c))}function XRe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,1,24,l,ZRe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function ZRe(){return 1392}function $Re(s,l){s=s|0,l=l|0,tTe(n[(eTe(s)|0)>>2]|0,l)}function eTe(s){return s=s|0,(n[(eR()|0)+24>>2]|0)+(s<<3)|0}function tTe(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,V9(f,l),l=J9(f,l)|0,tf[s&127](l),C=c}function rTe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=tR()|0,s=nTe(c)|0,un(m,l,d,s,iTe(c,f)|0,f)}function tR(){var s=0,l=0;if(o[7872]|0||(a5(10244),Zt(52,10244,_|0)|0,l=7872,n[l>>2]=1,n[l+4>>2]=0),!(br(10244)|0)){s=10244,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));a5(10244)}return 10244}function nTe(s){return s=s|0,s|0}function iTe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0;return Q=C,C=C+16|0,d=Q,m=Q+4|0,n[d>>2]=s,k=tR()|0,B=k+24|0,l=Ar(l,4)|0,n[m>>2]=l,c=k+28|0,f=n[c>>2]|0,f>>>0<(n[k+32>>2]|0)>>>0?(o5(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(sTe(B,d,m),l=n[c>>2]|0),C=Q,(l-(n[B>>2]|0)>>3)+-1|0}function o5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function sTe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0;if(Q=C,C=C+32|0,d=Q,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=oTe(s)|0,f>>>0>>0)Vr(s);else{k=n[s>>2]|0,O=(n[s+8>>2]|0)-k|0,M=O>>2,aTe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-k>>3,s+8|0),B=d+8|0,o5(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,lTe(s,d),cTe(d),C=Q;return}}function oTe(s){return s=s|0,536870911}function aTe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Gt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function lTe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function cTe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&pt(s)}function a5(s){s=s|0,fTe(s)}function uTe(s){s=s|0,ATe(s+24|0)}function ATe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),pt(c))}function fTe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,1,16,l,pTe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function pTe(){return 1400}function hTe(s){return s=s|0,dTe(n[(gTe(s)|0)>>2]|0)|0}function gTe(s){return s=s|0,(n[(tR()|0)+24>>2]|0)+(s<<3)|0}function dTe(s){return s=s|0,mTe(oD[s&7]()|0)|0}function mTe(s){return s=s|0,s|0}function yTe(){var s=0;return o[7880]|0||(DTe(10280),Zt(25,10280,_|0)|0,s=7880,n[s>>2]=1,n[s+4>>2]=0),10280}function CTe(s,l){s=s|0,l=l|0,n[s>>2]=ETe()|0,n[s+4>>2]=ITe()|0,n[s+12>>2]=l,n[s+8>>2]=wTe()|0,n[s+32>>2]=4}function ETe(){return 11711}function ITe(){return 1356}function wTe(){return Kv()|0}function BTe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Sp(f,896)|0)==512?c|0&&(vTe(c),pt(c)):l|0&&(Ig(l),pt(l))}function vTe(s){s=s|0,s=n[s+4>>2]|0,s|0&&xp(s)}function DTe(s){s=s|0,wp(s)}function STe(s){s=s|0,PTe(s,4920),xTe(s)|0,bTe(s)|0}function PTe(s,l){s=s|0,l=l|0;var c=0;c=b9()|0,n[s>>2]=c,zTe(c,l),Pp(n[s>>2]|0)}function xTe(s){s=s|0;var l=0;return l=n[s>>2]|0,Sg(l,_Te()|0),s|0}function bTe(s){s=s|0;var l=0;return l=n[s>>2]|0,Sg(l,QTe()|0),s|0}function QTe(){var s=0;return o[7888]|0||(l5(10328),Zt(53,10328,_|0)|0,s=7888,n[s>>2]=1,n[s+4>>2]=0),br(10328)|0||l5(10328),10328}function Sg(s,l){s=s|0,l=l|0,un(s,0,l,0,0,0)}function l5(s){s=s|0,RTe(s),Pg(s,10)}function kTe(s){s=s|0,FTe(s+24|0)}function FTe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),pt(c))}function RTe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,5,1,l,OTe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function TTe(s,l,c){s=s|0,l=l|0,c=+c,NTe(s,l,c)}function Pg(s,l){s=s|0,l=l|0,n[s+20>>2]=l}function NTe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+16|0,m=f+8|0,Q=f+13|0,d=f,B=f+12|0,ZA(Q,l),n[m>>2]=$A(Q,l)|0,Tu(B,c),E[d>>3]=+Nu(B,c),LTe(s,m,d),C=f}function LTe(s,l,c){s=s|0,l=l|0,c=c|0,W(s+8|0,n[l>>2]|0,+E[c>>3]),o[s+24>>0]=1}function OTe(){return 1404}function MTe(s,l){return s=s|0,l=+l,UTe(s,l)|0}function UTe(s,l){s=s|0,l=+l;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0;return f=C,C=C+16|0,m=f+4|0,B=f+8|0,Q=f,d=Ja(8)|0,c=d,k=Gt(16)|0,ZA(m,s),s=$A(m,s)|0,Tu(B,l),W(k,s,+Nu(B,l)),B=c+4|0,n[B>>2]=k,s=Gt(8)|0,B=n[B>>2]|0,n[Q>>2]=0,n[m>>2]=n[Q>>2],_F(s,B,m),n[d>>2]=s,C=f,c|0}function _Te(){var s=0;return o[7896]|0||(c5(10364),Zt(54,10364,_|0)|0,s=7896,n[s>>2]=1,n[s+4>>2]=0),br(10364)|0||c5(10364),10364}function c5(s){s=s|0,jTe(s),Pg(s,55)}function HTe(s){s=s|0,qTe(s+24|0)}function qTe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),pt(c))}function jTe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,5,4,l,KTe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function GTe(s){s=s|0,WTe(s)}function WTe(s){s=s|0,YTe(s)}function YTe(s){s=s|0,u5(s+8|0),o[s+24>>0]=1}function u5(s){s=s|0,n[s>>2]=0,E[s+8>>3]=0}function KTe(){return 1424}function VTe(){return JTe()|0}function JTe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0;return l=C,C=C+16|0,d=l+4|0,B=l,c=Ja(8)|0,s=c,f=Gt(16)|0,u5(f),m=s+4|0,n[m>>2]=f,f=Gt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],_F(f,m,d),n[c>>2]=f,C=l,s|0}function zTe(s,l){s=s|0,l=l|0,n[s>>2]=XTe()|0,n[s+4>>2]=ZTe()|0,n[s+12>>2]=l,n[s+8>>2]=$Te()|0,n[s+32>>2]=5}function XTe(){return 11710}function ZTe(){return 1416}function $Te(){return Vv()|0}function eNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Sp(f,896)|0)==512?c|0&&(tNe(c),pt(c)):l|0&&pt(l)}function tNe(s){s=s|0,s=n[s+4>>2]|0,s|0&&xp(s)}function Vv(){var s=0;return o[7904]|0||(n[2600]=rNe()|0,n[2601]=0,s=7904,n[s>>2]=1,n[s+4>>2]=0),10400}function rNe(){return n[357]|0}function nNe(s){s=s|0,iNe(s,4926),sNe(s)|0}function iNe(s,l){s=s|0,l=l|0;var c=0;c=ZG()|0,n[s>>2]=c,dNe(c,l),Pp(n[s>>2]|0)}function sNe(s){s=s|0;var l=0;return l=n[s>>2]|0,Sg(l,oNe()|0),s|0}function oNe(){var s=0;return o[7912]|0||(A5(10412),Zt(56,10412,_|0)|0,s=7912,n[s>>2]=1,n[s+4>>2]=0),br(10412)|0||A5(10412),10412}function A5(s){s=s|0,cNe(s),Pg(s,57)}function aNe(s){s=s|0,lNe(s+24|0)}function lNe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),pt(c))}function cNe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,5,5,l,pNe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function uNe(s){s=s|0,ANe(s)}function ANe(s){s=s|0,fNe(s)}function fNe(s){s=s|0;var l=0,c=0;l=s+8|0,c=l+48|0;do n[l>>2]=0,l=l+4|0;while((l|0)<(c|0));o[s+56>>0]=1}function pNe(){return 1432}function hNe(){return gNe()|0}function gNe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0,Q=0;B=C,C=C+16|0,s=B+4|0,l=B,c=Ja(8)|0,f=c,d=Gt(48)|0,m=d,Q=m+48|0;do n[m>>2]=0,m=m+4|0;while((m|0)<(Q|0));return m=f+4|0,n[m>>2]=d,Q=Gt(8)|0,m=n[m>>2]|0,n[l>>2]=0,n[s>>2]=n[l>>2],$G(Q,m,s),n[c>>2]=Q,C=B,f|0}function dNe(s,l){s=s|0,l=l|0,n[s>>2]=mNe()|0,n[s+4>>2]=yNe()|0,n[s+12>>2]=l,n[s+8>>2]=CNe()|0,n[s+32>>2]=6}function mNe(){return 11704}function yNe(){return 1436}function CNe(){return Vv()|0}function ENe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Sp(f,896)|0)==512?c|0&&(INe(c),pt(c)):l|0&&pt(l)}function INe(s){s=s|0,s=n[s+4>>2]|0,s|0&&xp(s)}function wNe(s){s=s|0,BNe(s,4933),vNe(s)|0,DNe(s)|0}function BNe(s,l){s=s|0,l=l|0;var c=0;c=JNe()|0,n[s>>2]=c,zNe(c,l),Pp(n[s>>2]|0)}function vNe(s){s=s|0;var l=0;return l=n[s>>2]|0,Sg(l,UNe()|0),s|0}function DNe(s){s=s|0;var l=0;return l=n[s>>2]|0,Sg(l,SNe()|0),s|0}function SNe(){var s=0;return o[7920]|0||(f5(10452),Zt(58,10452,_|0)|0,s=7920,n[s>>2]=1,n[s+4>>2]=0),br(10452)|0||f5(10452),10452}function f5(s){s=s|0,bNe(s),Pg(s,1)}function PNe(s){s=s|0,xNe(s+24|0)}function xNe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),pt(c))}function bNe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,5,1,l,RNe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function QNe(s,l,c){s=s|0,l=+l,c=+c,kNe(s,l,c)}function kNe(s,l,c){s=s|0,l=+l,c=+c;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+32|0,m=f+8|0,Q=f+17|0,d=f,B=f+16|0,Tu(Q,l),E[m>>3]=+Nu(Q,l),Tu(B,c),E[d>>3]=+Nu(B,c),FNe(s,m,d),C=f}function FNe(s,l,c){s=s|0,l=l|0,c=c|0,p5(s+8|0,+E[l>>3],+E[c>>3]),o[s+24>>0]=1}function p5(s,l,c){s=s|0,l=+l,c=+c,E[s>>3]=l,E[s+8>>3]=c}function RNe(){return 1472}function TNe(s,l){return s=+s,l=+l,NNe(s,l)|0}function NNe(s,l){s=+s,l=+l;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0;return f=C,C=C+16|0,B=f+4|0,Q=f+8|0,k=f,d=Ja(8)|0,c=d,m=Gt(16)|0,Tu(B,s),s=+Nu(B,s),Tu(Q,l),p5(m,s,+Nu(Q,l)),Q=c+4|0,n[Q>>2]=m,m=Gt(8)|0,Q=n[Q>>2]|0,n[k>>2]=0,n[B>>2]=n[k>>2],h5(m,Q,B),n[d>>2]=m,C=f,c|0}function h5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Gt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1452,n[c+12>>2]=l,n[s+4>>2]=c}function LNe(s){s=s|0,Zm(s),pt(s)}function ONe(s){s=s|0,s=n[s+12>>2]|0,s|0&&pt(s)}function MNe(s){s=s|0,pt(s)}function UNe(){var s=0;return o[7928]|0||(g5(10488),Zt(59,10488,_|0)|0,s=7928,n[s>>2]=1,n[s+4>>2]=0),br(10488)|0||g5(10488),10488}function g5(s){s=s|0,qNe(s),Pg(s,60)}function _Ne(s){s=s|0,HNe(s+24|0)}function HNe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),pt(c))}function qNe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,5,6,l,YNe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function jNe(s){s=s|0,GNe(s)}function GNe(s){s=s|0,WNe(s)}function WNe(s){s=s|0,d5(s+8|0),o[s+24>>0]=1}function d5(s){s=s|0,n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,n[s+12>>2]=0}function YNe(){return 1492}function KNe(){return VNe()|0}function VNe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0;return l=C,C=C+16|0,d=l+4|0,B=l,c=Ja(8)|0,s=c,f=Gt(16)|0,d5(f),m=s+4|0,n[m>>2]=f,f=Gt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],h5(f,m,d),n[c>>2]=f,C=l,s|0}function JNe(){var s=0;return o[7936]|0||(rLe(10524),Zt(25,10524,_|0)|0,s=7936,n[s>>2]=1,n[s+4>>2]=0),10524}function zNe(s,l){s=s|0,l=l|0,n[s>>2]=XNe()|0,n[s+4>>2]=ZNe()|0,n[s+12>>2]=l,n[s+8>>2]=$Ne()|0,n[s+32>>2]=7}function XNe(){return 11700}function ZNe(){return 1484}function $Ne(){return Vv()|0}function eLe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Sp(f,896)|0)==512?c|0&&(tLe(c),pt(c)):l|0&&pt(l)}function tLe(s){s=s|0,s=n[s+4>>2]|0,s|0&&xp(s)}function rLe(s){s=s|0,wp(s)}function nLe(s,l,c){s=s|0,l=l|0,c=c|0,s=cn(l)|0,l=iLe(c)|0,c=sLe(c,0)|0,NLe(s,l,c,rR()|0,0)}function iLe(s){return s=s|0,s|0}function sLe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0;return Q=C,C=C+16|0,d=Q,m=Q+4|0,n[d>>2]=s,k=rR()|0,B=k+24|0,l=Ar(l,4)|0,n[m>>2]=l,c=k+28|0,f=n[c>>2]|0,f>>>0<(n[k+32>>2]|0)>>>0?(y5(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(fLe(B,d,m),l=n[c>>2]|0),C=Q,(l-(n[B>>2]|0)>>3)+-1|0}function rR(){var s=0,l=0;if(o[7944]|0||(m5(10568),Zt(61,10568,_|0)|0,l=7944,n[l>>2]=1,n[l+4>>2]=0),!(br(10568)|0)){s=10568,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));m5(10568)}return 10568}function m5(s){s=s|0,lLe(s)}function oLe(s){s=s|0,aLe(s+24|0)}function aLe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),pt(c))}function lLe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,1,17,l,d9()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function cLe(s){return s=s|0,ALe(n[(uLe(s)|0)>>2]|0)|0}function uLe(s){return s=s|0,(n[(rR()|0)+24>>2]|0)+(s<<3)|0}function ALe(s){return s=s|0,Yv(oD[s&7]()|0)|0}function y5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function fLe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0;if(Q=C,C=C+32|0,d=Q,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=pLe(s)|0,f>>>0>>0)Vr(s);else{k=n[s>>2]|0,O=(n[s+8>>2]|0)-k|0,M=O>>2,hLe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-k>>3,s+8|0),B=d+8|0,y5(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,gLe(s,d),dLe(d),C=Q;return}}function pLe(s){return s=s|0,536870911}function hLe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Gt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function gLe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function dLe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&pt(s)}function mLe(){yLe()}function yLe(){CLe(10604)}function CLe(s){s=s|0,ELe(s,4955)}function ELe(s,l){s=s|0,l=l|0;var c=0;c=ILe()|0,n[s>>2]=c,wLe(c,l),Pp(n[s>>2]|0)}function ILe(){var s=0;return o[7952]|0||(kLe(10612),Zt(25,10612,_|0)|0,s=7952,n[s>>2]=1,n[s+4>>2]=0),10612}function wLe(s,l){s=s|0,l=l|0,n[s>>2]=SLe()|0,n[s+4>>2]=PLe()|0,n[s+12>>2]=l,n[s+8>>2]=xLe()|0,n[s+32>>2]=8}function Pp(s){s=s|0;var l=0,c=0;l=C,C=C+16|0,c=l,Km()|0,n[c>>2]=s,BLe(10608,c),C=l}function Km(){return o[11714]|0||(n[2652]=0,Zt(62,10608,_|0)|0,o[11714]=1),10608}function BLe(s,l){s=s|0,l=l|0;var c=0;c=Gt(8)|0,n[c+4>>2]=n[l>>2],n[c>>2]=n[s>>2],n[s>>2]=c}function vLe(s){s=s|0,DLe(s)}function DLe(s){s=s|0;var l=0,c=0;if(l=n[s>>2]|0,l|0)do c=l,l=n[l>>2]|0,pt(c);while((l|0)!=0);n[s>>2]=0}function SLe(){return 11715}function PLe(){return 1496}function xLe(){return Kv()|0}function bLe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Sp(f,896)|0)==512?c|0&&(QLe(c),pt(c)):l|0&&pt(l)}function QLe(s){s=s|0,s=n[s+4>>2]|0,s|0&&xp(s)}function kLe(s){s=s|0,wp(s)}function FLe(s,l){s=s|0,l=l|0;var c=0,f=0;Km()|0,c=n[2652]|0;e:do if(c|0){for(;f=n[c+4>>2]|0,!(f|0&&($5(nR(f)|0,s)|0)==0);)if(c=n[c>>2]|0,!c)break e;RLe(f,l)}while(0)}function nR(s){return s=s|0,n[s+12>>2]|0}function RLe(s,l){s=s|0,l=l|0;var c=0;s=s+36|0,c=n[s>>2]|0,c|0&&(jA(c),pt(c)),c=Gt(4)|0,YG(c,l),n[s>>2]=c}function iR(){return o[11716]|0||(n[2664]=0,Zt(63,10656,_|0)|0,o[11716]=1),10656}function C5(){var s=0;return o[11717]|0?s=n[2665]|0:(TLe(),n[2665]=1504,o[11717]=1,s=1504),s|0}function TLe(){o[11740]|0||(o[11718]=Ar(Ar(8,0)|0,0)|0,o[11719]=Ar(Ar(0,0)|0,0)|0,o[11720]=Ar(Ar(0,16)|0,0)|0,o[11721]=Ar(Ar(8,0)|0,0)|0,o[11722]=Ar(Ar(0,0)|0,0)|0,o[11723]=Ar(Ar(8,0)|0,0)|0,o[11724]=Ar(Ar(0,0)|0,0)|0,o[11725]=Ar(Ar(8,0)|0,0)|0,o[11726]=Ar(Ar(0,0)|0,0)|0,o[11727]=Ar(Ar(8,0)|0,0)|0,o[11728]=Ar(Ar(0,0)|0,0)|0,o[11729]=Ar(Ar(0,0)|0,32)|0,o[11730]=Ar(Ar(0,0)|0,32)|0,o[11740]=1)}function E5(){return 1572}function NLe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,Q=0,k=0,M=0,O=0;m=C,C=C+32|0,O=m+16|0,M=m+12|0,k=m+8|0,Q=m+4|0,B=m,n[O>>2]=s,n[M>>2]=l,n[k>>2]=c,n[Q>>2]=f,n[B>>2]=d,iR()|0,LLe(10656,O,M,k,Q,B),C=m}function LLe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0;B=Gt(24)|0,JG(B+4|0,n[l>>2]|0,n[c>>2]|0,n[f>>2]|0,n[d>>2]|0,n[m>>2]|0),n[B>>2]=n[s>>2],n[s>>2]=B}function I5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0,We=0,Le=0,Re=0,et=0,Ze=0,at=0;if(at=C,C=C+32|0,Le=at+20|0,Re=at+8|0,et=at+4|0,Ze=at,l=n[l>>2]|0,l|0){We=Le+4|0,k=Le+8|0,M=Re+4|0,O=Re+8|0,j=Re+8|0,se=Le+8|0;do{if(B=l+4|0,Q=sR(B)|0,Q|0){if(d=SI(Q)|0,n[Le>>2]=0,n[We>>2]=0,n[k>>2]=0,f=(PI(Q)|0)+1|0,OLe(Le,f),f|0)for(;f=f+-1|0,kc(Re,n[d>>2]|0),m=n[We>>2]|0,m>>>0<(n[se>>2]|0)>>>0?(n[m>>2]=n[Re>>2],n[We>>2]=(n[We>>2]|0)+4):oR(Le,Re),f;)d=d+4|0;f=xI(Q)|0,n[Re>>2]=0,n[M>>2]=0,n[O>>2]=0;e:do if(n[f>>2]|0)for(d=0,m=0;;){if((d|0)==(m|0)?MLe(Re,f):(n[d>>2]=n[f>>2],n[M>>2]=(n[M>>2]|0)+4),f=f+4|0,!(n[f>>2]|0))break e;d=n[M>>2]|0,m=n[j>>2]|0}while(0);n[et>>2]=Jv(B)|0,n[Ze>>2]=br(Q)|0,ULe(c,s,et,Ze,Le,Re),aR(Re),ef(Le)}l=n[l>>2]|0}while((l|0)!=0)}C=at}function sR(s){return s=s|0,n[s+12>>2]|0}function SI(s){return s=s|0,n[s+12>>2]|0}function PI(s){return s=s|0,n[s+16>>2]|0}function OLe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;d=C,C=C+32|0,c=d,f=n[s>>2]|0,(n[s+8>>2]|0)-f>>2>>>0>>0&&(b5(c,l,(n[s+4>>2]|0)-f>>2,s+8|0),Q5(s,c),k5(c)),C=d}function oR(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0;if(B=C,C=C+32|0,c=B,f=s+4|0,d=((n[f>>2]|0)-(n[s>>2]|0)>>2)+1|0,m=x5(s)|0,m>>>0>>0)Vr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,k=M>>1,b5(c,M>>2>>>0>>1>>>0?k>>>0>>0?d:k:m,(n[f>>2]|0)-Q>>2,s+8|0),m=c+8|0,n[n[m>>2]>>2]=n[l>>2],n[m>>2]=(n[m>>2]|0)+4,Q5(s,c),k5(c),C=B;return}}function xI(s){return s=s|0,n[s+8>>2]|0}function MLe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0;if(B=C,C=C+32|0,c=B,f=s+4|0,d=((n[f>>2]|0)-(n[s>>2]|0)>>2)+1|0,m=P5(s)|0,m>>>0>>0)Vr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,k=M>>1,iOe(c,M>>2>>>0>>1>>>0?k>>>0>>0?d:k:m,(n[f>>2]|0)-Q>>2,s+8|0),m=c+8|0,n[n[m>>2]>>2]=n[l>>2],n[m>>2]=(n[m>>2]|0)+4,sOe(s,c),oOe(c),C=B;return}}function Jv(s){return s=s|0,n[s>>2]|0}function ULe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,_Le(s,l,c,f,d,m)}function aR(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-4-f|0)>>>2)<<2)),pt(c))}function ef(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-4-f|0)>>>2)<<2)),pt(c))}function _Le(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,Q=0,k=0,M=0,O=0,j=0;B=C,C=C+48|0,O=B+40|0,Q=B+32|0,j=B+24|0,k=B+12|0,M=B,za(Q),s=da(s)|0,n[j>>2]=n[l>>2],c=n[c>>2]|0,f=n[f>>2]|0,lR(k,d),HLe(M,m),n[O>>2]=n[j>>2],qLe(s,O,c,f,k,M),aR(M),ef(k),Xa(Q),C=B}function lR(s,l){s=s|0,l=l|0;var c=0,f=0;n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,c=l+4|0,f=(n[c>>2]|0)-(n[l>>2]|0)>>2,f|0&&(rOe(s,f),nOe(s,n[l>>2]|0,n[c>>2]|0,f))}function HLe(s,l){s=s|0,l=l|0;var c=0,f=0;n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,c=l+4|0,f=(n[c>>2]|0)-(n[l>>2]|0)>>2,f|0&&(eOe(s,f),tOe(s,n[l>>2]|0,n[c>>2]|0,f))}function qLe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,Q=0,k=0,M=0,O=0,j=0;B=C,C=C+32|0,O=B+28|0,j=B+24|0,Q=B+12|0,k=B,M=bl(jLe()|0)|0,n[j>>2]=n[l>>2],n[O>>2]=n[j>>2],l=xg(O)|0,c=w5(c)|0,f=cR(f)|0,n[Q>>2]=n[d>>2],O=d+4|0,n[Q+4>>2]=n[O>>2],j=d+8|0,n[Q+8>>2]=n[j>>2],n[j>>2]=0,n[O>>2]=0,n[d>>2]=0,d=uR(Q)|0,n[k>>2]=n[m>>2],O=m+4|0,n[k+4>>2]=n[O>>2],j=m+8|0,n[k+8>>2]=n[j>>2],n[j>>2]=0,n[O>>2]=0,n[m>>2]=0,io(0,M|0,s|0,l|0,c|0,f|0,d|0,GLe(k)|0)|0,aR(k),ef(Q),C=B}function jLe(){var s=0;return o[7968]|0||(ZLe(10708),s=7968,n[s>>2]=1,n[s+4>>2]=0),10708}function xg(s){return s=s|0,v5(s)|0}function w5(s){return s=s|0,B5(s)|0}function cR(s){return s=s|0,Yv(s)|0}function uR(s){return s=s|0,YLe(s)|0}function GLe(s){return s=s|0,WLe(s)|0}function WLe(s){s=s|0;var l=0,c=0,f=0;if(f=(n[s+4>>2]|0)-(n[s>>2]|0)|0,c=f>>2,f=Ja(f+4|0)|0,n[f>>2]=c,c|0){l=0;do n[f+4+(l<<2)>>2]=B5(n[(n[s>>2]|0)+(l<<2)>>2]|0)|0,l=l+1|0;while((l|0)!=(c|0))}return f|0}function B5(s){return s=s|0,s|0}function YLe(s){s=s|0;var l=0,c=0,f=0;if(f=(n[s+4>>2]|0)-(n[s>>2]|0)|0,c=f>>2,f=Ja(f+4|0)|0,n[f>>2]=c,c|0){l=0;do n[f+4+(l<<2)>>2]=v5((n[s>>2]|0)+(l<<2)|0)|0,l=l+1|0;while((l|0)!=(c|0))}return f|0}function v5(s){s=s|0;var l=0,c=0,f=0,d=0;return d=C,C=C+32|0,l=d+12|0,c=d,f=wF(D5()|0)|0,f?(BF(l,f),vF(c,l),xUe(s,c),s=DF(l)|0):s=KLe(s)|0,C=d,s|0}function D5(){var s=0;return o[7960]|0||(XLe(10664),Zt(25,10664,_|0)|0,s=7960,n[s>>2]=1,n[s+4>>2]=0),10664}function KLe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,Q=0;return c=C,C=C+16|0,d=c+4|0,B=c,f=Ja(8)|0,l=f,Q=Gt(4)|0,n[Q>>2]=n[s>>2],m=l+4|0,n[m>>2]=Q,s=Gt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],S5(s,m,d),n[f>>2]=s,C=c,l|0}function S5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Gt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1656,n[c+12>>2]=l,n[s+4>>2]=c}function VLe(s){s=s|0,Zm(s),pt(s)}function JLe(s){s=s|0,s=n[s+12>>2]|0,s|0&&pt(s)}function zLe(s){s=s|0,pt(s)}function XLe(s){s=s|0,wp(s)}function ZLe(s){s=s|0,Ql(s,$Le()|0,5)}function $Le(){return 1676}function eOe(s,l){s=s|0,l=l|0;var c=0;if((P5(s)|0)>>>0>>0&&Vr(s),l>>>0>1073741823)Rt();else{c=Gt(l<<2)|0,n[s+4>>2]=c,n[s>>2]=c,n[s+8>>2]=c+(l<<2);return}}function tOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,f=s+4|0,s=c-l|0,(s|0)>0&&(Er(n[f>>2]|0,l|0,s|0)|0,n[f>>2]=(n[f>>2]|0)+(s>>>2<<2))}function P5(s){return s=s|0,1073741823}function rOe(s,l){s=s|0,l=l|0;var c=0;if((x5(s)|0)>>>0>>0&&Vr(s),l>>>0>1073741823)Rt();else{c=Gt(l<<2)|0,n[s+4>>2]=c,n[s>>2]=c,n[s+8>>2]=c+(l<<2);return}}function nOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,f=s+4|0,s=c-l|0,(s|0)>0&&(Er(n[f>>2]|0,l|0,s|0)|0,n[f>>2]=(n[f>>2]|0)+(s>>>2<<2))}function x5(s){return s=s|0,1073741823}function iOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>1073741823)Rt();else{d=Gt(l<<2)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<2)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<2)}function sOe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function oOe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-4-l|0)>>>2)<<2)),s=n[s>>2]|0,s|0&&pt(s)}function b5(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>1073741823)Rt();else{d=Gt(l<<2)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<2)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<2)}function Q5(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function k5(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-4-l|0)>>>2)<<2)),s=n[s>>2]|0,s|0&&pt(s)}function aOe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0,We=0,Le=0,Re=0;if(Re=C,C=C+32|0,O=Re+20|0,j=Re+12|0,M=Re+16|0,se=Re+4|0,We=Re,Le=Re+8|0,Q=C5()|0,m=n[Q>>2]|0,B=n[m>>2]|0,B|0)for(k=n[Q+8>>2]|0,Q=n[Q+4>>2]|0;kc(O,B),lOe(s,O,Q,k),m=m+4|0,B=n[m>>2]|0,B;)k=k+1|0,Q=Q+1|0;if(m=E5()|0,B=n[m>>2]|0,B|0)do kc(O,B),n[j>>2]=n[m+4>>2],cOe(l,O,j),m=m+8|0,B=n[m>>2]|0;while((B|0)!=0);if(m=n[(Km()|0)>>2]|0,m|0)do l=n[m+4>>2]|0,kc(O,n[(Vm(l)|0)>>2]|0),n[j>>2]=nR(l)|0,uOe(c,O,j),m=n[m>>2]|0;while((m|0)!=0);if(kc(M,0),m=iR()|0,n[O>>2]=n[M>>2],I5(O,m,d),m=n[(Km()|0)>>2]|0,m|0){s=O+4|0,l=O+8|0,c=O+8|0;do{if(k=n[m+4>>2]|0,kc(j,n[(Vm(k)|0)>>2]|0),AOe(se,F5(k)|0),B=n[se>>2]|0,B|0){n[O>>2]=0,n[s>>2]=0,n[l>>2]=0;do kc(We,n[(Vm(n[B+4>>2]|0)|0)>>2]|0),Q=n[s>>2]|0,Q>>>0<(n[c>>2]|0)>>>0?(n[Q>>2]=n[We>>2],n[s>>2]=(n[s>>2]|0)+4):oR(O,We),B=n[B>>2]|0;while((B|0)!=0);fOe(f,j,O),ef(O)}n[Le>>2]=n[j>>2],M=R5(k)|0,n[O>>2]=n[Le>>2],I5(O,M,d),t9(se),m=n[m>>2]|0}while((m|0)!=0)}C=Re}function lOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,vOe(s,l,c,f)}function cOe(s,l,c){s=s|0,l=l|0,c=c|0,BOe(s,l,c)}function Vm(s){return s=s|0,s|0}function uOe(s,l,c){s=s|0,l=l|0,c=c|0,COe(s,l,c)}function F5(s){return s=s|0,s+16|0}function AOe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0;if(m=C,C=C+16|0,d=m+8|0,c=m,n[s>>2]=0,f=n[l>>2]|0,n[d>>2]=f,n[c>>2]=s,c=yOe(c)|0,f|0){if(f=Gt(12)|0,B=(T5(d)|0)+4|0,s=n[B+4>>2]|0,l=f+4|0,n[l>>2]=n[B>>2],n[l+4>>2]=s,l=n[n[d>>2]>>2]|0,n[d>>2]=l,!l)s=f;else for(l=f;s=Gt(12)|0,k=(T5(d)|0)+4|0,Q=n[k+4>>2]|0,B=s+4|0,n[B>>2]=n[k>>2],n[B+4>>2]=Q,n[l>>2]=s,B=n[n[d>>2]>>2]|0,n[d>>2]=B,B;)l=s;n[s>>2]=n[c>>2],n[c>>2]=f}C=m}function fOe(s,l,c){s=s|0,l=l|0,c=c|0,pOe(s,l,c)}function R5(s){return s=s|0,s+24|0}function pOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+32|0,B=f+24|0,d=f+16|0,Q=f+12|0,m=f,za(d),s=da(s)|0,n[Q>>2]=n[l>>2],lR(m,c),n[B>>2]=n[Q>>2],hOe(s,B,m),ef(m),Xa(d),C=f}function hOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=C,C=C+32|0,B=f+16|0,Q=f+12|0,d=f,m=bl(gOe()|0)|0,n[Q>>2]=n[l>>2],n[B>>2]=n[Q>>2],l=xg(B)|0,n[d>>2]=n[c>>2],B=c+4|0,n[d+4>>2]=n[B>>2],Q=c+8|0,n[d+8>>2]=n[Q>>2],n[Q>>2]=0,n[B>>2]=0,n[c>>2]=0,no(0,m|0,s|0,l|0,uR(d)|0)|0,ef(d),C=f}function gOe(){var s=0;return o[7976]|0||(dOe(10720),s=7976,n[s>>2]=1,n[s+4>>2]=0),10720}function dOe(s){s=s|0,Ql(s,mOe()|0,2)}function mOe(){return 1732}function yOe(s){return s=s|0,n[s>>2]|0}function T5(s){return s=s|0,n[s>>2]|0}function COe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+32|0,m=f+16|0,d=f+8|0,B=f,za(d),s=da(s)|0,n[B>>2]=n[l>>2],c=n[c>>2]|0,n[m>>2]=n[B>>2],N5(s,m,c),Xa(d),C=f}function N5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,m=f+4|0,B=f,d=bl(EOe()|0)|0,n[B>>2]=n[l>>2],n[m>>2]=n[B>>2],l=xg(m)|0,no(0,d|0,s|0,l|0,w5(c)|0)|0,C=f}function EOe(){var s=0;return o[7984]|0||(IOe(10732),s=7984,n[s>>2]=1,n[s+4>>2]=0),10732}function IOe(s){s=s|0,Ql(s,wOe()|0,2)}function wOe(){return 1744}function BOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+32|0,m=f+16|0,d=f+8|0,B=f,za(d),s=da(s)|0,n[B>>2]=n[l>>2],c=n[c>>2]|0,n[m>>2]=n[B>>2],N5(s,m,c),Xa(d),C=f}function vOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0;d=C,C=C+32|0,B=d+16|0,m=d+8|0,Q=d,za(m),s=da(s)|0,n[Q>>2]=n[l>>2],c=o[c>>0]|0,f=o[f>>0]|0,n[B>>2]=n[Q>>2],DOe(s,B,c,f),Xa(m),C=d}function DOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0;d=C,C=C+16|0,B=d+4|0,Q=d,m=bl(SOe()|0)|0,n[Q>>2]=n[l>>2],n[B>>2]=n[Q>>2],l=xg(B)|0,c=Jm(c)|0,mc(0,m|0,s|0,l|0,c|0,Jm(f)|0)|0,C=d}function SOe(){var s=0;return o[7992]|0||(xOe(10744),s=7992,n[s>>2]=1,n[s+4>>2]=0),10744}function Jm(s){return s=s|0,POe(s)|0}function POe(s){return s=s|0,s&255|0}function xOe(s){s=s|0,Ql(s,bOe()|0,3)}function bOe(){return 1756}function QOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;switch(se=C,C=C+32|0,Q=se+8|0,k=se+4|0,M=se+20|0,O=se,bF(s,0),f=PUe(l)|0,n[Q>>2]=0,j=Q+4|0,n[j>>2]=0,n[Q+8>>2]=0,f<<24>>24){case 0:{o[M>>0]=0,kOe(k,c,M),zv(s,k)|0,GA(k);break}case 8:{j=dR(l)|0,o[M>>0]=8,kc(O,n[j+4>>2]|0),FOe(k,c,M,O,j+8|0),zv(s,k)|0,GA(k);break}case 9:{if(m=dR(l)|0,l=n[m+4>>2]|0,l|0)for(B=Q+8|0,d=m+12|0;l=l+-1|0,kc(k,n[d>>2]|0),f=n[j>>2]|0,f>>>0<(n[B>>2]|0)>>>0?(n[f>>2]=n[k>>2],n[j>>2]=(n[j>>2]|0)+4):oR(Q,k),l;)d=d+4|0;o[M>>0]=9,kc(O,n[m+8>>2]|0),ROe(k,c,M,O,Q),zv(s,k)|0,GA(k);break}default:j=dR(l)|0,o[M>>0]=f,kc(O,n[j+4>>2]|0),TOe(k,c,M,O),zv(s,k)|0,GA(k)}ef(Q),C=se}function kOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,za(d),l=da(l)|0,KOe(s,l,o[c>>0]|0),Xa(d),C=f}function zv(s,l){s=s|0,l=l|0;var c=0;return c=n[s>>2]|0,c|0&&bA(c|0),n[s>>2]=n[l>>2],n[l>>2]=0,s|0}function FOe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,Q=0,k=0;m=C,C=C+32|0,Q=m+16|0,B=m+8|0,k=m,za(B),l=da(l)|0,c=o[c>>0]|0,n[k>>2]=n[f>>2],d=n[d>>2]|0,n[Q>>2]=n[k>>2],jOe(s,l,c,Q,d),Xa(B),C=m}function ROe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,Q=0,k=0,M=0;m=C,C=C+32|0,k=m+24|0,B=m+16|0,M=m+12|0,Q=m,za(B),l=da(l)|0,c=o[c>>0]|0,n[M>>2]=n[f>>2],lR(Q,d),n[k>>2]=n[M>>2],UOe(s,l,c,k,Q),ef(Q),Xa(B),C=m}function TOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0;d=C,C=C+32|0,B=d+16|0,m=d+8|0,Q=d,za(m),l=da(l)|0,c=o[c>>0]|0,n[Q>>2]=n[f>>2],n[B>>2]=n[Q>>2],NOe(s,l,c,B),Xa(m),C=d}function NOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,Q=0;d=C,C=C+16|0,m=d+4|0,Q=d,B=bl(LOe()|0)|0,c=Jm(c)|0,n[Q>>2]=n[f>>2],n[m>>2]=n[Q>>2],Xv(s,no(0,B|0,l|0,c|0,xg(m)|0)|0),C=d}function LOe(){var s=0;return o[8e3]|0||(OOe(10756),s=8e3,n[s>>2]=1,n[s+4>>2]=0),10756}function Xv(s,l){s=s|0,l=l|0,bF(s,l)}function OOe(s){s=s|0,Ql(s,MOe()|0,2)}function MOe(){return 1772}function UOe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,Q=0,k=0,M=0;m=C,C=C+32|0,k=m+16|0,M=m+12|0,B=m,Q=bl(_Oe()|0)|0,c=Jm(c)|0,n[M>>2]=n[f>>2],n[k>>2]=n[M>>2],f=xg(k)|0,n[B>>2]=n[d>>2],k=d+4|0,n[B+4>>2]=n[k>>2],M=d+8|0,n[B+8>>2]=n[M>>2],n[M>>2]=0,n[k>>2]=0,n[d>>2]=0,Xv(s,mc(0,Q|0,l|0,c|0,f|0,uR(B)|0)|0),ef(B),C=m}function _Oe(){var s=0;return o[8008]|0||(HOe(10768),s=8008,n[s>>2]=1,n[s+4>>2]=0),10768}function HOe(s){s=s|0,Ql(s,qOe()|0,3)}function qOe(){return 1784}function jOe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,Q=0,k=0;m=C,C=C+16|0,Q=m+4|0,k=m,B=bl(GOe()|0)|0,c=Jm(c)|0,n[k>>2]=n[f>>2],n[Q>>2]=n[k>>2],f=xg(Q)|0,Xv(s,mc(0,B|0,l|0,c|0,f|0,cR(d)|0)|0),C=m}function GOe(){var s=0;return o[8016]|0||(WOe(10780),s=8016,n[s>>2]=1,n[s+4>>2]=0),10780}function WOe(s){s=s|0,Ql(s,YOe()|0,3)}function YOe(){return 1800}function KOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=bl(VOe()|0)|0,Xv(s,Dn(0,f|0,l|0,Jm(c)|0)|0)}function VOe(){var s=0;return o[8024]|0||(JOe(10792),s=8024,n[s>>2]=1,n[s+4>>2]=0),10792}function JOe(s){s=s|0,Ql(s,zOe()|0,1)}function zOe(){return 1816}function XOe(){ZOe(),$Oe(),eMe()}function ZOe(){n[2702]=c7(65536)|0}function $Oe(){EMe(10856)}function eMe(){tMe(10816)}function tMe(s){s=s|0,rMe(s,5044),nMe(s)|0}function rMe(s,l){s=s|0,l=l|0;var c=0;c=D5()|0,n[s>>2]=c,hMe(c,l),Pp(n[s>>2]|0)}function nMe(s){s=s|0;var l=0;return l=n[s>>2]|0,Sg(l,iMe()|0),s|0}function iMe(){var s=0;return o[8032]|0||(L5(10820),Zt(64,10820,_|0)|0,s=8032,n[s>>2]=1,n[s+4>>2]=0),br(10820)|0||L5(10820),10820}function L5(s){s=s|0,aMe(s),Pg(s,25)}function sMe(s){s=s|0,oMe(s+24|0)}function oMe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),pt(c))}function aMe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,5,18,l,AMe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function lMe(s,l){s=s|0,l=l|0,cMe(s,l)}function cMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;c=C,C=C+16|0,f=c,d=c+4|0,vg(d,l),n[f>>2]=Dg(d,l)|0,uMe(s,f),C=c}function uMe(s,l){s=s|0,l=l|0,O5(s+4|0,n[l>>2]|0),o[s+8>>0]=1}function O5(s,l){s=s|0,l=l|0,n[s>>2]=l}function AMe(){return 1824}function fMe(s){return s=s|0,pMe(s)|0}function pMe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,Q=0;return c=C,C=C+16|0,d=c+4|0,B=c,f=Ja(8)|0,l=f,Q=Gt(4)|0,vg(d,s),O5(Q,Dg(d,s)|0),m=l+4|0,n[m>>2]=Q,s=Gt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],S5(s,m,d),n[f>>2]=s,C=c,l|0}function Ja(s){s=s|0;var l=0,c=0;return s=s+7&-8,s>>>0<=32768&&(l=n[2701]|0,s>>>0<=(65536-l|0)>>>0)?(c=(n[2702]|0)+l|0,n[2701]=l+s,s=c):(s=c7(s+8|0)|0,n[s>>2]=n[2703],n[2703]=s,s=s+8|0),s|0}function hMe(s,l){s=s|0,l=l|0,n[s>>2]=gMe()|0,n[s+4>>2]=dMe()|0,n[s+12>>2]=l,n[s+8>>2]=mMe()|0,n[s+32>>2]=9}function gMe(){return 11744}function dMe(){return 1832}function mMe(){return Vv()|0}function yMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Sp(f,896)|0)==512?c|0&&(CMe(c),pt(c)):l|0&&pt(l)}function CMe(s){s=s|0,s=n[s+4>>2]|0,s|0&&xp(s)}function EMe(s){s=s|0,IMe(s,5052),wMe(s)|0,BMe(s,5058,26)|0,vMe(s,5069,1)|0,DMe(s,5077,10)|0,SMe(s,5087,19)|0,PMe(s,5094,27)|0}function IMe(s,l){s=s|0,l=l|0;var c=0;c=CUe()|0,n[s>>2]=c,EUe(c,l),Pp(n[s>>2]|0)}function wMe(s){s=s|0;var l=0;return l=n[s>>2]|0,Sg(l,sUe()|0),s|0}function BMe(s,l,c){return s=s|0,l=l|0,c=c|0,H4e(s,cn(l)|0,c,0),s|0}function vMe(s,l,c){return s=s|0,l=l|0,c=c|0,S4e(s,cn(l)|0,c,0),s|0}function DMe(s,l,c){return s=s|0,l=l|0,c=c|0,i4e(s,cn(l)|0,c,0),s|0}function SMe(s,l,c){return s=s|0,l=l|0,c=c|0,jMe(s,cn(l)|0,c,0),s|0}function M5(s,l){s=s|0,l=l|0;var c=0,f=0;e:for(;;){for(c=n[2703]|0;;){if((c|0)==(l|0))break e;if(f=n[c>>2]|0,n[2703]=f,!c)c=f;else break}pt(c)}n[2701]=s}function PMe(s,l,c){return s=s|0,l=l|0,c=c|0,xMe(s,cn(l)|0,c,0),s|0}function xMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=AR()|0,s=bMe(c)|0,un(m,l,d,s,QMe(c,f)|0,f)}function AR(){var s=0,l=0;if(o[8040]|0||(_5(10860),Zt(65,10860,_|0)|0,l=8040,n[l>>2]=1,n[l+4>>2]=0),!(br(10860)|0)){s=10860,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));_5(10860)}return 10860}function bMe(s){return s=s|0,s|0}function QMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0;return Q=C,C=C+16|0,d=Q,m=Q+4|0,n[d>>2]=s,k=AR()|0,B=k+24|0,l=Ar(l,4)|0,n[m>>2]=l,c=k+28|0,f=n[c>>2]|0,f>>>0<(n[k+32>>2]|0)>>>0?(U5(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(kMe(B,d,m),l=n[c>>2]|0),C=Q,(l-(n[B>>2]|0)>>3)+-1|0}function U5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function kMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0;if(Q=C,C=C+32|0,d=Q,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=FMe(s)|0,f>>>0>>0)Vr(s);else{k=n[s>>2]|0,O=(n[s+8>>2]|0)-k|0,M=O>>2,RMe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-k>>3,s+8|0),B=d+8|0,U5(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,TMe(s,d),NMe(d),C=Q;return}}function FMe(s){return s=s|0,536870911}function RMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Gt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function TMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function NMe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&pt(s)}function _5(s){s=s|0,MMe(s)}function LMe(s){s=s|0,OMe(s+24|0)}function OMe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),pt(c))}function MMe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,1,11,l,UMe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function UMe(){return 1840}function _Me(s,l,c){s=s|0,l=l|0,c=c|0,qMe(n[(HMe(s)|0)>>2]|0,l,c)}function HMe(s){return s=s|0,(n[(AR()|0)+24>>2]|0)+(s<<3)|0}function qMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;f=C,C=C+16|0,m=f+1|0,d=f,vg(m,l),l=Dg(m,l)|0,vg(d,c),c=Dg(d,c)|0,rf[s&31](l,c),C=f}function jMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=fR()|0,s=GMe(c)|0,un(m,l,d,s,WMe(c,f)|0,f)}function fR(){var s=0,l=0;if(o[8048]|0||(q5(10896),Zt(66,10896,_|0)|0,l=8048,n[l>>2]=1,n[l+4>>2]=0),!(br(10896)|0)){s=10896,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));q5(10896)}return 10896}function GMe(s){return s=s|0,s|0}function WMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0;return Q=C,C=C+16|0,d=Q,m=Q+4|0,n[d>>2]=s,k=fR()|0,B=k+24|0,l=Ar(l,4)|0,n[m>>2]=l,c=k+28|0,f=n[c>>2]|0,f>>>0<(n[k+32>>2]|0)>>>0?(H5(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(YMe(B,d,m),l=n[c>>2]|0),C=Q,(l-(n[B>>2]|0)>>3)+-1|0}function H5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function YMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0;if(Q=C,C=C+32|0,d=Q,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=KMe(s)|0,f>>>0>>0)Vr(s);else{k=n[s>>2]|0,O=(n[s+8>>2]|0)-k|0,M=O>>2,VMe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-k>>3,s+8|0),B=d+8|0,H5(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,JMe(s,d),zMe(d),C=Q;return}}function KMe(s){return s=s|0,536870911}function VMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Gt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function JMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function zMe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&pt(s)}function q5(s){s=s|0,$Me(s)}function XMe(s){s=s|0,ZMe(s+24|0)}function ZMe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),pt(c))}function $Me(s){s=s|0;var l=0;l=Gr()|0,Wr(s,1,11,l,e4e()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function e4e(){return 1852}function t4e(s,l){return s=s|0,l=l|0,n4e(n[(r4e(s)|0)>>2]|0,l)|0}function r4e(s){return s=s|0,(n[(fR()|0)+24>>2]|0)+(s<<3)|0}function n4e(s,l){s=s|0,l=l|0;var c=0,f=0;return c=C,C=C+16|0,f=c,vg(f,l),l=Dg(f,l)|0,l=Yv(Fg[s&31](l)|0)|0,C=c,l|0}function i4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=pR()|0,s=s4e(c)|0,un(m,l,d,s,o4e(c,f)|0,f)}function pR(){var s=0,l=0;if(o[8056]|0||(G5(10932),Zt(67,10932,_|0)|0,l=8056,n[l>>2]=1,n[l+4>>2]=0),!(br(10932)|0)){s=10932,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));G5(10932)}return 10932}function s4e(s){return s=s|0,s|0}function o4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0;return Q=C,C=C+16|0,d=Q,m=Q+4|0,n[d>>2]=s,k=pR()|0,B=k+24|0,l=Ar(l,4)|0,n[m>>2]=l,c=k+28|0,f=n[c>>2]|0,f>>>0<(n[k+32>>2]|0)>>>0?(j5(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(a4e(B,d,m),l=n[c>>2]|0),C=Q,(l-(n[B>>2]|0)>>3)+-1|0}function j5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function a4e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0;if(Q=C,C=C+32|0,d=Q,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=l4e(s)|0,f>>>0>>0)Vr(s);else{k=n[s>>2]|0,O=(n[s+8>>2]|0)-k|0,M=O>>2,c4e(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-k>>3,s+8|0),B=d+8|0,j5(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,u4e(s,d),A4e(d),C=Q;return}}function l4e(s){return s=s|0,536870911}function c4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Gt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function u4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function A4e(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&pt(s)}function G5(s){s=s|0,h4e(s)}function f4e(s){s=s|0,p4e(s+24|0)}function p4e(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),pt(c))}function h4e(s){s=s|0;var l=0;l=Gr()|0,Wr(s,1,7,l,g4e()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function g4e(){return 1860}function d4e(s,l,c){return s=s|0,l=l|0,c=c|0,y4e(n[(m4e(s)|0)>>2]|0,l,c)|0}function m4e(s){return s=s|0,(n[(pR()|0)+24>>2]|0)+(s<<3)|0}function y4e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0;return f=C,C=C+32|0,B=f+12|0,m=f+8|0,Q=f,k=f+16|0,d=f+4|0,C4e(k,l),E4e(Q,k,l),Bp(d,c),c=vp(d,c)|0,n[B>>2]=n[Q>>2],FI[s&15](m,B,c),c=I4e(m)|0,GA(m),Dp(d),C=f,c|0}function C4e(s,l){s=s|0,l=l|0}function E4e(s,l,c){s=s|0,l=l|0,c=c|0,w4e(s,c)}function I4e(s){return s=s|0,da(s)|0}function w4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;d=C,C=C+16|0,c=d,f=l,f&1?(B4e(c,0),$n(f|0,c|0)|0,v4e(s,c),D4e(c)):n[s>>2]=n[l>>2],C=d}function B4e(s,l){s=s|0,l=l|0,KG(s,l),n[s+4>>2]=0,o[s+8>>0]=0}function v4e(s,l){s=s|0,l=l|0,n[s>>2]=n[l+4>>2]}function D4e(s){s=s|0,o[s+8>>0]=0}function S4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=hR()|0,s=P4e(c)|0,un(m,l,d,s,x4e(c,f)|0,f)}function hR(){var s=0,l=0;if(o[8064]|0||(Y5(10968),Zt(68,10968,_|0)|0,l=8064,n[l>>2]=1,n[l+4>>2]=0),!(br(10968)|0)){s=10968,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));Y5(10968)}return 10968}function P4e(s){return s=s|0,s|0}function x4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0;return Q=C,C=C+16|0,d=Q,m=Q+4|0,n[d>>2]=s,k=hR()|0,B=k+24|0,l=Ar(l,4)|0,n[m>>2]=l,c=k+28|0,f=n[c>>2]|0,f>>>0<(n[k+32>>2]|0)>>>0?(W5(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(b4e(B,d,m),l=n[c>>2]|0),C=Q,(l-(n[B>>2]|0)>>3)+-1|0}function W5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function b4e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0;if(Q=C,C=C+32|0,d=Q,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=Q4e(s)|0,f>>>0>>0)Vr(s);else{k=n[s>>2]|0,O=(n[s+8>>2]|0)-k|0,M=O>>2,k4e(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-k>>3,s+8|0),B=d+8|0,W5(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,F4e(s,d),R4e(d),C=Q;return}}function Q4e(s){return s=s|0,536870911}function k4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Gt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function F4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function R4e(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&pt(s)}function Y5(s){s=s|0,L4e(s)}function T4e(s){s=s|0,N4e(s+24|0)}function N4e(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),pt(c))}function L4e(s){s=s|0;var l=0;l=Gr()|0,Wr(s,1,1,l,O4e()|0,5),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function O4e(){return 1872}function M4e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,_4e(n[(U4e(s)|0)>>2]|0,l,c,f,d,m)}function U4e(s){return s=s|0,(n[(hR()|0)+24>>2]|0)+(s<<3)|0}function _4e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,Q=0,k=0,M=0,O=0,j=0;B=C,C=C+32|0,Q=B+16|0,k=B+12|0,M=B+8|0,O=B+4|0,j=B,Bp(Q,l),l=vp(Q,l)|0,Bp(k,c),c=vp(k,c)|0,Bp(M,f),f=vp(M,f)|0,Bp(O,d),d=vp(O,d)|0,Bp(j,m),m=vp(j,m)|0,h7[s&1](l,c,f,d,m),Dp(j),Dp(O),Dp(M),Dp(k),Dp(Q),C=B}function H4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=gR()|0,s=q4e(c)|0,un(m,l,d,s,j4e(c,f)|0,f)}function gR(){var s=0,l=0;if(o[8072]|0||(V5(11004),Zt(69,11004,_|0)|0,l=8072,n[l>>2]=1,n[l+4>>2]=0),!(br(11004)|0)){s=11004,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));V5(11004)}return 11004}function q4e(s){return s=s|0,s|0}function j4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,Q=0,k=0;return Q=C,C=C+16|0,d=Q,m=Q+4|0,n[d>>2]=s,k=gR()|0,B=k+24|0,l=Ar(l,4)|0,n[m>>2]=l,c=k+28|0,f=n[c>>2]|0,f>>>0<(n[k+32>>2]|0)>>>0?(K5(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(G4e(B,d,m),l=n[c>>2]|0),C=Q,(l-(n[B>>2]|0)>>3)+-1|0}function K5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function G4e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0;if(Q=C,C=C+32|0,d=Q,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=W4e(s)|0,f>>>0>>0)Vr(s);else{k=n[s>>2]|0,O=(n[s+8>>2]|0)-k|0,M=O>>2,Y4e(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-k>>3,s+8|0),B=d+8|0,K5(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,K4e(s,d),V4e(d),C=Q;return}}function W4e(s){return s=s|0,536870911}function Y4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Gt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function K4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Er(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function V4e(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&pt(s)}function V5(s){s=s|0,X4e(s)}function J4e(s){s=s|0,z4e(s+24|0)}function z4e(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),pt(c))}function X4e(s){s=s|0;var l=0;l=Gr()|0,Wr(s,1,12,l,Z4e()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Z4e(){return 1896}function $4e(s,l,c){s=s|0,l=l|0,c=c|0,tUe(n[(eUe(s)|0)>>2]|0,l,c)}function eUe(s){return s=s|0,(n[(gR()|0)+24>>2]|0)+(s<<3)|0}function tUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;f=C,C=C+16|0,m=f+4|0,d=f,rUe(m,l),l=nUe(m,l)|0,Bp(d,c),c=vp(d,c)|0,rf[s&31](l,c),Dp(d),C=f}function rUe(s,l){s=s|0,l=l|0}function nUe(s,l){return s=s|0,l=l|0,iUe(l)|0}function iUe(s){return s=s|0,s|0}function sUe(){var s=0;return o[8080]|0||(J5(11040),Zt(70,11040,_|0)|0,s=8080,n[s>>2]=1,n[s+4>>2]=0),br(11040)|0||J5(11040),11040}function J5(s){s=s|0,lUe(s),Pg(s,71)}function oUe(s){s=s|0,aUe(s+24|0)}function aUe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),pt(c))}function lUe(s){s=s|0;var l=0;l=Gr()|0,Wr(s,5,7,l,fUe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function cUe(s){s=s|0,uUe(s)}function uUe(s){s=s|0,AUe(s)}function AUe(s){s=s|0,o[s+8>>0]=1}function fUe(){return 1936}function pUe(){return hUe()|0}function hUe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0;return l=C,C=C+16|0,d=l+4|0,B=l,c=Ja(8)|0,s=c,m=s+4|0,n[m>>2]=Gt(1)|0,f=Gt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],gUe(f,m,d),n[c>>2]=f,C=l,s|0}function gUe(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Gt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1916,n[c+12>>2]=l,n[s+4>>2]=c}function dUe(s){s=s|0,Zm(s),pt(s)}function mUe(s){s=s|0,s=n[s+12>>2]|0,s|0&&pt(s)}function yUe(s){s=s|0,pt(s)}function CUe(){var s=0;return o[8088]|0||(SUe(11076),Zt(25,11076,_|0)|0,s=8088,n[s>>2]=1,n[s+4>>2]=0),11076}function EUe(s,l){s=s|0,l=l|0,n[s>>2]=IUe()|0,n[s+4>>2]=wUe()|0,n[s+12>>2]=l,n[s+8>>2]=BUe()|0,n[s+32>>2]=10}function IUe(){return 11745}function wUe(){return 1940}function BUe(){return Kv()|0}function vUe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Sp(f,896)|0)==512?c|0&&(DUe(c),pt(c)):l|0&&pt(l)}function DUe(s){s=s|0,s=n[s+4>>2]|0,s|0&&xp(s)}function SUe(s){s=s|0,wp(s)}function kc(s,l){s=s|0,l=l|0,n[s>>2]=l}function dR(s){return s=s|0,n[s>>2]|0}function PUe(s){return s=s|0,o[n[s>>2]>>0]|0}function xUe(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,n[f>>2]=n[s>>2],bUe(l,f)|0,C=c}function bUe(s,l){s=s|0,l=l|0;var c=0;return c=QUe(n[s>>2]|0,l)|0,l=s+4|0,n[(n[l>>2]|0)+8>>2]=c,n[(n[l>>2]|0)+8>>2]|0}function QUe(s,l){s=s|0,l=l|0;var c=0,f=0;return c=C,C=C+16|0,f=c,za(f),s=da(s)|0,l=kUe(s,n[l>>2]|0)|0,Xa(f),C=c,l|0}function za(s){s=s|0,n[s>>2]=n[2701],n[s+4>>2]=n[2703]}function kUe(s,l){s=s|0,l=l|0;var c=0;return c=bl(FUe()|0)|0,Dn(0,c|0,s|0,cR(l)|0)|0}function Xa(s){s=s|0,M5(n[s>>2]|0,n[s+4>>2]|0)}function FUe(){var s=0;return o[8096]|0||(RUe(11120),s=8096,n[s>>2]=1,n[s+4>>2]=0),11120}function RUe(s){s=s|0,Ql(s,TUe()|0,1)}function TUe(){return 1948}function NUe(){LUe()}function LUe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0,We=0,Le=0,Re=0;if(Le=C,C=C+16|0,O=Le+4|0,j=Le,Fi(65536,10804,n[2702]|0,10812),c=C5()|0,l=n[c>>2]|0,s=n[l>>2]|0,s|0)for(f=n[c+8>>2]|0,c=n[c+4>>2]|0;hc(s|0,u[c>>0]|0|0,o[f>>0]|0),l=l+4|0,s=n[l>>2]|0,s;)f=f+1|0,c=c+1|0;if(s=E5()|0,l=n[s>>2]|0,l|0)do du(l|0,n[s+4>>2]|0),s=s+8|0,l=n[s>>2]|0;while((l|0)!=0);du(OUe()|0,5167),M=Km()|0,s=n[M>>2]|0;e:do if(s|0){do MUe(n[s+4>>2]|0),s=n[s>>2]|0;while((s|0)!=0);if(s=n[M>>2]|0,s|0){k=M;do{for(;d=s,s=n[s>>2]|0,d=n[d+4>>2]|0,!!(UUe(d)|0);)if(n[j>>2]=k,n[O>>2]=n[j>>2],_Ue(M,O)|0,!s)break e;if(HUe(d),k=n[k>>2]|0,l=z5(d)|0,m=_i()|0,B=C,C=C+((1*(l<<2)|0)+15&-16)|0,Q=C,C=C+((1*(l<<2)|0)+15&-16)|0,l=n[(F5(d)|0)>>2]|0,l|0)for(c=B,f=Q;n[c>>2]=n[(Vm(n[l+4>>2]|0)|0)>>2],n[f>>2]=n[l+8>>2],l=n[l>>2]|0,l;)c=c+4|0,f=f+4|0;Re=Vm(d)|0,l=qUe(d)|0,c=z5(d)|0,f=jUe(d)|0,mu(Re|0,l|0,B|0,Q|0,c|0,f|0,nR(d)|0),Ui(m|0)}while((s|0)!=0)}}while(0);if(s=n[(iR()|0)>>2]|0,s|0)do Re=s+4|0,M=sR(Re)|0,d=xI(M)|0,m=SI(M)|0,B=(PI(M)|0)+1|0,Q=Zv(M)|0,k=X5(Re)|0,M=br(M)|0,O=Jv(Re)|0,j=mR(Re)|0,Il(0,d|0,m|0,B|0,Q|0,k|0,M|0,O|0,j|0,yR(Re)|0),s=n[s>>2]|0;while((s|0)!=0);s=n[(Km()|0)>>2]|0;e:do if(s|0){t:for(;;){if(l=n[s+4>>2]|0,l|0&&(se=n[(Vm(l)|0)>>2]|0,We=n[(R5(l)|0)>>2]|0,We|0)){c=We;do{l=c+4|0,f=sR(l)|0;r:do if(f|0)switch(br(f)|0){case 0:break t;case 4:case 3:case 2:{Q=xI(f)|0,k=SI(f)|0,M=(PI(f)|0)+1|0,O=Zv(f)|0,j=br(f)|0,Re=Jv(l)|0,Il(se|0,Q|0,k|0,M|0,O|0,0,j|0,Re|0,mR(l)|0,yR(l)|0);break r}case 1:{B=xI(f)|0,Q=SI(f)|0,k=(PI(f)|0)+1|0,M=Zv(f)|0,O=X5(l)|0,j=br(f)|0,Re=Jv(l)|0,Il(se|0,B|0,Q|0,k|0,M|0,O|0,j|0,Re|0,mR(l)|0,yR(l)|0);break r}case 5:{M=xI(f)|0,O=SI(f)|0,j=(PI(f)|0)+1|0,Re=Zv(f)|0,Il(se|0,M|0,O|0,j|0,Re|0,GUe(f)|0,br(f)|0,0,0,0);break r}default:break r}while(0);c=n[c>>2]|0}while((c|0)!=0)}if(s=n[s>>2]|0,!s)break e}Rt()}while(0);Ee(),C=Le}function OUe(){return 11703}function MUe(s){s=s|0,o[s+40>>0]=0}function UUe(s){return s=s|0,(o[s+40>>0]|0)!=0|0}function _Ue(s,l){return s=s|0,l=l|0,l=WUe(l)|0,s=n[l>>2]|0,n[l>>2]=n[s>>2],pt(s),n[l>>2]|0}function HUe(s){s=s|0,o[s+40>>0]=1}function z5(s){return s=s|0,n[s+20>>2]|0}function qUe(s){return s=s|0,n[s+8>>2]|0}function jUe(s){return s=s|0,n[s+32>>2]|0}function Zv(s){return s=s|0,n[s+4>>2]|0}function X5(s){return s=s|0,n[s+4>>2]|0}function mR(s){return s=s|0,n[s+8>>2]|0}function yR(s){return s=s|0,n[s+16>>2]|0}function GUe(s){return s=s|0,n[s+20>>2]|0}function WUe(s){return s=s|0,n[s>>2]|0}function $v(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0,We=0,Le=0,Re=0,et=0,Ze=0,at=0,He=0,Ge=0,Tt=0;Tt=C,C=C+16|0,se=Tt;do if(s>>>0<245){if(M=s>>>0<11?16:s+11&-8,s=M>>>3,j=n[2783]|0,c=j>>>s,c&3|0)return l=(c&1^1)+s|0,s=11172+(l<<1<<2)|0,c=s+8|0,f=n[c>>2]|0,d=f+8|0,m=n[d>>2]|0,(s|0)==(m|0)?n[2783]=j&~(1<>2]=s,n[c>>2]=m),Ge=l<<3,n[f+4>>2]=Ge|3,Ge=f+Ge+4|0,n[Ge>>2]=n[Ge>>2]|1,Ge=d,C=Tt,Ge|0;if(O=n[2785]|0,M>>>0>O>>>0){if(c|0)return l=2<>>12&16,l=l>>>B,c=l>>>5&8,l=l>>>c,d=l>>>2&4,l=l>>>d,s=l>>>1&2,l=l>>>s,f=l>>>1&1,f=(c|B|d|s|f)+(l>>>f)|0,l=11172+(f<<1<<2)|0,s=l+8|0,d=n[s>>2]|0,B=d+8|0,c=n[B>>2]|0,(l|0)==(c|0)?(s=j&~(1<>2]=l,n[s>>2]=c,s=j),m=(f<<3)-M|0,n[d+4>>2]=M|3,f=d+M|0,n[f+4>>2]=m|1,n[f+m>>2]=m,O|0&&(d=n[2788]|0,l=O>>>3,c=11172+(l<<1<<2)|0,l=1<>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=d,n[l+12>>2]=d,n[d+8>>2]=l,n[d+12>>2]=c),n[2785]=m,n[2788]=f,Ge=B,C=Tt,Ge|0;if(Q=n[2784]|0,Q){if(c=(Q&0-Q)+-1|0,B=c>>>12&16,c=c>>>B,m=c>>>5&8,c=c>>>m,k=c>>>2&4,c=c>>>k,f=c>>>1&2,c=c>>>f,s=c>>>1&1,s=n[11436+((m|B|k|f|s)+(c>>>s)<<2)>>2]|0,c=(n[s+4>>2]&-8)-M|0,f=n[s+16+(((n[s+16>>2]|0)==0&1)<<2)>>2]|0,!f)k=s,m=c;else{do B=(n[f+4>>2]&-8)-M|0,k=B>>>0>>0,c=k?B:c,s=k?f:s,f=n[f+16+(((n[f+16>>2]|0)==0&1)<<2)>>2]|0;while((f|0)!=0);k=s,m=c}if(B=k+M|0,k>>>0>>0){d=n[k+24>>2]|0,l=n[k+12>>2]|0;do if((l|0)==(k|0)){if(s=k+20|0,l=n[s>>2]|0,!l&&(s=k+16|0,l=n[s>>2]|0,!l)){c=0;break}for(;;){if(c=l+20|0,f=n[c>>2]|0,f|0){l=f,s=c;continue}if(c=l+16|0,f=n[c>>2]|0,f)l=f,s=c;else break}n[s>>2]=0,c=l}else c=n[k+8>>2]|0,n[c+12>>2]=l,n[l+8>>2]=c,c=l;while(0);do if(d|0){if(l=n[k+28>>2]|0,s=11436+(l<<2)|0,(k|0)==(n[s>>2]|0)){if(n[s>>2]=c,!c){n[2784]=Q&~(1<>2]|0)!=(k|0)&1)<<2)>>2]=c,!c)break;n[c+24>>2]=d,l=n[k+16>>2]|0,l|0&&(n[c+16>>2]=l,n[l+24>>2]=c),l=n[k+20>>2]|0,l|0&&(n[c+20>>2]=l,n[l+24>>2]=c)}while(0);return m>>>0<16?(Ge=m+M|0,n[k+4>>2]=Ge|3,Ge=k+Ge+4|0,n[Ge>>2]=n[Ge>>2]|1):(n[k+4>>2]=M|3,n[B+4>>2]=m|1,n[B+m>>2]=m,O|0&&(f=n[2788]|0,l=O>>>3,c=11172+(l<<1<<2)|0,l=1<>2]|0):(n[2783]=j|l,l=c,s=c+8|0),n[s>>2]=f,n[l+12>>2]=f,n[f+8>>2]=l,n[f+12>>2]=c),n[2785]=m,n[2788]=B),Ge=k+8|0,C=Tt,Ge|0}else j=M}else j=M}else j=M}else if(s>>>0<=4294967231)if(s=s+11|0,M=s&-8,k=n[2784]|0,k){f=0-M|0,s=s>>>8,s?M>>>0>16777215?Q=31:(j=(s+1048320|0)>>>16&8,He=s<>>16&4,He=He<>>16&2,Q=14-(O|j|Q)+(He<>>15)|0,Q=M>>>(Q+7|0)&1|Q<<1):Q=0,c=n[11436+(Q<<2)>>2]|0;e:do if(!c)c=0,s=0,He=57;else for(s=0,B=M<<((Q|0)==31?0:25-(Q>>>1)|0),m=0;;){if(d=(n[c+4>>2]&-8)-M|0,d>>>0>>0)if(d)s=c,f=d;else{s=c,f=0,d=c,He=61;break e}if(d=n[c+20>>2]|0,c=n[c+16+(B>>>31<<2)>>2]|0,m=(d|0)==0|(d|0)==(c|0)?m:d,d=(c|0)==0,d){c=m,He=57;break}else B=B<<((d^1)&1)}while(0);if((He|0)==57){if((c|0)==0&(s|0)==0){if(s=2<>>12&16,j=j>>>B,m=j>>>5&8,j=j>>>m,Q=j>>>2&4,j=j>>>Q,O=j>>>1&2,j=j>>>O,c=j>>>1&1,s=0,c=n[11436+((m|B|Q|O|c)+(j>>>c)<<2)>>2]|0}c?(d=c,He=61):(Q=s,B=f)}if((He|0)==61)for(;;)if(He=0,c=(n[d+4>>2]&-8)-M|0,j=c>>>0>>0,c=j?c:f,s=j?d:s,d=n[d+16+(((n[d+16>>2]|0)==0&1)<<2)>>2]|0,d)f=c,He=61;else{Q=s,B=c;break}if((Q|0)!=0&&B>>>0<((n[2785]|0)-M|0)>>>0){if(m=Q+M|0,Q>>>0>=m>>>0)return Ge=0,C=Tt,Ge|0;d=n[Q+24>>2]|0,l=n[Q+12>>2]|0;do if((l|0)==(Q|0)){if(s=Q+20|0,l=n[s>>2]|0,!l&&(s=Q+16|0,l=n[s>>2]|0,!l)){l=0;break}for(;;){if(c=l+20|0,f=n[c>>2]|0,f|0){l=f,s=c;continue}if(c=l+16|0,f=n[c>>2]|0,f)l=f,s=c;else break}n[s>>2]=0}else Ge=n[Q+8>>2]|0,n[Ge+12>>2]=l,n[l+8>>2]=Ge;while(0);do if(d){if(s=n[Q+28>>2]|0,c=11436+(s<<2)|0,(Q|0)==(n[c>>2]|0)){if(n[c>>2]=l,!l){f=k&~(1<>2]|0)!=(Q|0)&1)<<2)>>2]=l,!l){f=k;break}n[l+24>>2]=d,s=n[Q+16>>2]|0,s|0&&(n[l+16>>2]=s,n[s+24>>2]=l),s=n[Q+20>>2]|0,s&&(n[l+20>>2]=s,n[s+24>>2]=l),f=k}else f=k;while(0);do if(B>>>0>=16){if(n[Q+4>>2]=M|3,n[m+4>>2]=B|1,n[m+B>>2]=B,l=B>>>3,B>>>0<256){c=11172+(l<<1<<2)|0,s=n[2783]|0,l=1<>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=m,n[l+12>>2]=m,n[m+8>>2]=l,n[m+12>>2]=c;break}if(l=B>>>8,l?B>>>0>16777215?l=31:(He=(l+1048320|0)>>>16&8,Ge=l<>>16&4,Ge=Ge<>>16&2,l=14-(at|He|l)+(Ge<>>15)|0,l=B>>>(l+7|0)&1|l<<1):l=0,c=11436+(l<<2)|0,n[m+28>>2]=l,s=m+16|0,n[s+4>>2]=0,n[s>>2]=0,s=1<>2]=m,n[m+24>>2]=c,n[m+12>>2]=m,n[m+8>>2]=m;break}for(s=B<<((l|0)==31?0:25-(l>>>1)|0),c=n[c>>2]|0;;){if((n[c+4>>2]&-8|0)==(B|0)){He=97;break}if(f=c+16+(s>>>31<<2)|0,l=n[f>>2]|0,l)s=s<<1,c=l;else{He=96;break}}if((He|0)==96){n[f>>2]=m,n[m+24>>2]=c,n[m+12>>2]=m,n[m+8>>2]=m;break}else if((He|0)==97){He=c+8|0,Ge=n[He>>2]|0,n[Ge+12>>2]=m,n[He>>2]=m,n[m+8>>2]=Ge,n[m+12>>2]=c,n[m+24>>2]=0;break}}else Ge=B+M|0,n[Q+4>>2]=Ge|3,Ge=Q+Ge+4|0,n[Ge>>2]=n[Ge>>2]|1;while(0);return Ge=Q+8|0,C=Tt,Ge|0}else j=M}else j=M;else j=-1;while(0);if(c=n[2785]|0,c>>>0>=j>>>0)return l=c-j|0,s=n[2788]|0,l>>>0>15?(Ge=s+j|0,n[2788]=Ge,n[2785]=l,n[Ge+4>>2]=l|1,n[Ge+l>>2]=l,n[s+4>>2]=j|3):(n[2785]=0,n[2788]=0,n[s+4>>2]=c|3,Ge=s+c+4|0,n[Ge>>2]=n[Ge>>2]|1),Ge=s+8|0,C=Tt,Ge|0;if(B=n[2786]|0,B>>>0>j>>>0)return at=B-j|0,n[2786]=at,Ge=n[2789]|0,He=Ge+j|0,n[2789]=He,n[He+4>>2]=at|1,n[Ge+4>>2]=j|3,Ge=Ge+8|0,C=Tt,Ge|0;if(n[2901]|0?s=n[2903]|0:(n[2903]=4096,n[2902]=4096,n[2904]=-1,n[2905]=-1,n[2906]=0,n[2894]=0,s=se&-16^1431655768,n[se>>2]=s,n[2901]=s,s=4096),Q=j+48|0,k=j+47|0,m=s+k|0,d=0-s|0,M=m&d,M>>>0<=j>>>0||(s=n[2893]|0,s|0&&(O=n[2891]|0,se=O+M|0,se>>>0<=O>>>0|se>>>0>s>>>0)))return Ge=0,C=Tt,Ge|0;e:do if(n[2894]&4)l=0,He=133;else{c=n[2789]|0;t:do if(c){for(f=11580;s=n[f>>2]|0,!(s>>>0<=c>>>0&&(Re=f+4|0,(s+(n[Re>>2]|0)|0)>>>0>c>>>0));)if(s=n[f+8>>2]|0,s)f=s;else{He=118;break t}if(l=m-B&d,l>>>0<2147483647)if(s=bp(l|0)|0,(s|0)==((n[f>>2]|0)+(n[Re>>2]|0)|0)){if((s|0)!=-1){B=l,m=s,He=135;break e}}else f=s,He=126;else l=0}else He=118;while(0);do if((He|0)==118)if(c=bp(0)|0,(c|0)!=-1&&(l=c,We=n[2902]|0,Le=We+-1|0,l=((Le&l|0)==0?0:(Le+l&0-We)-l|0)+M|0,We=n[2891]|0,Le=l+We|0,l>>>0>j>>>0&l>>>0<2147483647)){if(Re=n[2893]|0,Re|0&&Le>>>0<=We>>>0|Le>>>0>Re>>>0){l=0;break}if(s=bp(l|0)|0,(s|0)==(c|0)){B=l,m=c,He=135;break e}else f=s,He=126}else l=0;while(0);do if((He|0)==126){if(c=0-l|0,!(Q>>>0>l>>>0&(l>>>0<2147483647&(f|0)!=-1)))if((f|0)==-1){l=0;break}else{B=l,m=f,He=135;break e}if(s=n[2903]|0,s=k-l+s&0-s,s>>>0>=2147483647){B=l,m=f,He=135;break e}if((bp(s|0)|0)==-1){bp(c|0)|0,l=0;break}else{B=s+l|0,m=f,He=135;break e}}while(0);n[2894]=n[2894]|4,He=133}while(0);if((He|0)==133&&M>>>0<2147483647&&(at=bp(M|0)|0,Re=bp(0)|0,et=Re-at|0,Ze=et>>>0>(j+40|0)>>>0,!((at|0)==-1|Ze^1|at>>>0>>0&((at|0)!=-1&(Re|0)!=-1)^1))&&(B=Ze?et:l,m=at,He=135),(He|0)==135){l=(n[2891]|0)+B|0,n[2891]=l,l>>>0>(n[2892]|0)>>>0&&(n[2892]=l),k=n[2789]|0;do if(k){for(l=11580;;){if(s=n[l>>2]|0,c=l+4|0,f=n[c>>2]|0,(m|0)==(s+f|0)){He=145;break}if(d=n[l+8>>2]|0,d)l=d;else break}if((He|0)==145&&(n[l+12>>2]&8|0)==0&&k>>>0>>0&k>>>0>=s>>>0){n[c>>2]=f+B,Ge=k+8|0,Ge=(Ge&7|0)==0?0:0-Ge&7,He=k+Ge|0,Ge=(n[2786]|0)+(B-Ge)|0,n[2789]=He,n[2786]=Ge,n[He+4>>2]=Ge|1,n[He+Ge+4>>2]=40,n[2790]=n[2905];break}for(m>>>0<(n[2787]|0)>>>0&&(n[2787]=m),c=m+B|0,l=11580;;){if((n[l>>2]|0)==(c|0)){He=153;break}if(s=n[l+8>>2]|0,s)l=s;else break}if((He|0)==153&&(n[l+12>>2]&8|0)==0){n[l>>2]=m,O=l+4|0,n[O>>2]=(n[O>>2]|0)+B,O=m+8|0,O=m+((O&7|0)==0?0:0-O&7)|0,l=c+8|0,l=c+((l&7|0)==0?0:0-l&7)|0,M=O+j|0,Q=l-O-j|0,n[O+4>>2]=j|3;do if((l|0)!=(k|0)){if((l|0)==(n[2788]|0)){Ge=(n[2785]|0)+Q|0,n[2785]=Ge,n[2788]=M,n[M+4>>2]=Ge|1,n[M+Ge>>2]=Ge;break}if(s=n[l+4>>2]|0,(s&3|0)==1){B=s&-8,f=s>>>3;e:do if(s>>>0<256)if(s=n[l+8>>2]|0,c=n[l+12>>2]|0,(c|0)==(s|0)){n[2783]=n[2783]&~(1<>2]=c,n[c+8>>2]=s;break}else{m=n[l+24>>2]|0,s=n[l+12>>2]|0;do if((s|0)==(l|0)){if(f=l+16|0,c=f+4|0,s=n[c>>2]|0,!s)if(s=n[f>>2]|0,s)c=f;else{s=0;break}for(;;){if(f=s+20|0,d=n[f>>2]|0,d|0){s=d,c=f;continue}if(f=s+16|0,d=n[f>>2]|0,d)s=d,c=f;else break}n[c>>2]=0}else Ge=n[l+8>>2]|0,n[Ge+12>>2]=s,n[s+8>>2]=Ge;while(0);if(!m)break;c=n[l+28>>2]|0,f=11436+(c<<2)|0;do if((l|0)!=(n[f>>2]|0)){if(n[m+16+(((n[m+16>>2]|0)!=(l|0)&1)<<2)>>2]=s,!s)break e}else{if(n[f>>2]=s,s|0)break;n[2784]=n[2784]&~(1<>2]=m,c=l+16|0,f=n[c>>2]|0,f|0&&(n[s+16>>2]=f,n[f+24>>2]=s),c=n[c+4>>2]|0,!c)break;n[s+20>>2]=c,n[c+24>>2]=s}while(0);l=l+B|0,d=B+Q|0}else d=Q;if(l=l+4|0,n[l>>2]=n[l>>2]&-2,n[M+4>>2]=d|1,n[M+d>>2]=d,l=d>>>3,d>>>0<256){c=11172+(l<<1<<2)|0,s=n[2783]|0,l=1<>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=M,n[l+12>>2]=M,n[M+8>>2]=l,n[M+12>>2]=c;break}l=d>>>8;do if(!l)l=0;else{if(d>>>0>16777215){l=31;break}He=(l+1048320|0)>>>16&8,Ge=l<>>16&4,Ge=Ge<>>16&2,l=14-(at|He|l)+(Ge<>>15)|0,l=d>>>(l+7|0)&1|l<<1}while(0);if(f=11436+(l<<2)|0,n[M+28>>2]=l,s=M+16|0,n[s+4>>2]=0,n[s>>2]=0,s=n[2784]|0,c=1<>2]=M,n[M+24>>2]=f,n[M+12>>2]=M,n[M+8>>2]=M;break}for(s=d<<((l|0)==31?0:25-(l>>>1)|0),c=n[f>>2]|0;;){if((n[c+4>>2]&-8|0)==(d|0)){He=194;break}if(f=c+16+(s>>>31<<2)|0,l=n[f>>2]|0,l)s=s<<1,c=l;else{He=193;break}}if((He|0)==193){n[f>>2]=M,n[M+24>>2]=c,n[M+12>>2]=M,n[M+8>>2]=M;break}else if((He|0)==194){He=c+8|0,Ge=n[He>>2]|0,n[Ge+12>>2]=M,n[He>>2]=M,n[M+8>>2]=Ge,n[M+12>>2]=c,n[M+24>>2]=0;break}}else Ge=(n[2786]|0)+Q|0,n[2786]=Ge,n[2789]=M,n[M+4>>2]=Ge|1;while(0);return Ge=O+8|0,C=Tt,Ge|0}for(l=11580;s=n[l>>2]|0,!(s>>>0<=k>>>0&&(Ge=s+(n[l+4>>2]|0)|0,Ge>>>0>k>>>0));)l=n[l+8>>2]|0;d=Ge+-47|0,s=d+8|0,s=d+((s&7|0)==0?0:0-s&7)|0,d=k+16|0,s=s>>>0>>0?k:s,l=s+8|0,c=m+8|0,c=(c&7|0)==0?0:0-c&7,He=m+c|0,c=B+-40-c|0,n[2789]=He,n[2786]=c,n[He+4>>2]=c|1,n[He+c+4>>2]=40,n[2790]=n[2905],c=s+4|0,n[c>>2]=27,n[l>>2]=n[2895],n[l+4>>2]=n[2896],n[l+8>>2]=n[2897],n[l+12>>2]=n[2898],n[2895]=m,n[2896]=B,n[2898]=0,n[2897]=l,l=s+24|0;do He=l,l=l+4|0,n[l>>2]=7;while((He+8|0)>>>0>>0);if((s|0)!=(k|0)){if(m=s-k|0,n[c>>2]=n[c>>2]&-2,n[k+4>>2]=m|1,n[s>>2]=m,l=m>>>3,m>>>0<256){c=11172+(l<<1<<2)|0,s=n[2783]|0,l=1<>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=k,n[l+12>>2]=k,n[k+8>>2]=l,n[k+12>>2]=c;break}if(l=m>>>8,l?m>>>0>16777215?c=31:(He=(l+1048320|0)>>>16&8,Ge=l<>>16&4,Ge=Ge<>>16&2,c=14-(at|He|c)+(Ge<>>15)|0,c=m>>>(c+7|0)&1|c<<1):c=0,f=11436+(c<<2)|0,n[k+28>>2]=c,n[k+20>>2]=0,n[d>>2]=0,l=n[2784]|0,s=1<>2]=k,n[k+24>>2]=f,n[k+12>>2]=k,n[k+8>>2]=k;break}for(s=m<<((c|0)==31?0:25-(c>>>1)|0),c=n[f>>2]|0;;){if((n[c+4>>2]&-8|0)==(m|0)){He=216;break}if(f=c+16+(s>>>31<<2)|0,l=n[f>>2]|0,l)s=s<<1,c=l;else{He=215;break}}if((He|0)==215){n[f>>2]=k,n[k+24>>2]=c,n[k+12>>2]=k,n[k+8>>2]=k;break}else if((He|0)==216){He=c+8|0,Ge=n[He>>2]|0,n[Ge+12>>2]=k,n[He>>2]=k,n[k+8>>2]=Ge,n[k+12>>2]=c,n[k+24>>2]=0;break}}}else{Ge=n[2787]|0,(Ge|0)==0|m>>>0>>0&&(n[2787]=m),n[2895]=m,n[2896]=B,n[2898]=0,n[2792]=n[2901],n[2791]=-1,l=0;do Ge=11172+(l<<1<<2)|0,n[Ge+12>>2]=Ge,n[Ge+8>>2]=Ge,l=l+1|0;while((l|0)!=32);Ge=m+8|0,Ge=(Ge&7|0)==0?0:0-Ge&7,He=m+Ge|0,Ge=B+-40-Ge|0,n[2789]=He,n[2786]=Ge,n[He+4>>2]=Ge|1,n[He+Ge+4>>2]=40,n[2790]=n[2905]}while(0);if(l=n[2786]|0,l>>>0>j>>>0)return at=l-j|0,n[2786]=at,Ge=n[2789]|0,He=Ge+j|0,n[2789]=He,n[He+4>>2]=at|1,n[Ge+4>>2]=j|3,Ge=Ge+8|0,C=Tt,Ge|0}return n[(zm()|0)>>2]=12,Ge=0,C=Tt,Ge|0}function eD(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,Q=0,k=0;if(!!s){c=s+-8|0,d=n[2787]|0,s=n[s+-4>>2]|0,l=s&-8,k=c+l|0;do if(s&1)Q=c,B=c;else{if(f=n[c>>2]|0,!(s&3)||(B=c+(0-f)|0,m=f+l|0,B>>>0>>0))return;if((B|0)==(n[2788]|0)){if(s=k+4|0,l=n[s>>2]|0,(l&3|0)!=3){Q=B,l=m;break}n[2785]=m,n[s>>2]=l&-2,n[B+4>>2]=m|1,n[B+m>>2]=m;return}if(c=f>>>3,f>>>0<256)if(s=n[B+8>>2]|0,l=n[B+12>>2]|0,(l|0)==(s|0)){n[2783]=n[2783]&~(1<>2]=l,n[l+8>>2]=s,Q=B,l=m;break}d=n[B+24>>2]|0,s=n[B+12>>2]|0;do if((s|0)==(B|0)){if(c=B+16|0,l=c+4|0,s=n[l>>2]|0,!s)if(s=n[c>>2]|0,s)l=c;else{s=0;break}for(;;){if(c=s+20|0,f=n[c>>2]|0,f|0){s=f,l=c;continue}if(c=s+16|0,f=n[c>>2]|0,f)s=f,l=c;else break}n[l>>2]=0}else Q=n[B+8>>2]|0,n[Q+12>>2]=s,n[s+8>>2]=Q;while(0);if(d){if(l=n[B+28>>2]|0,c=11436+(l<<2)|0,(B|0)==(n[c>>2]|0)){if(n[c>>2]=s,!s){n[2784]=n[2784]&~(1<>2]|0)!=(B|0)&1)<<2)>>2]=s,!s){Q=B,l=m;break}n[s+24>>2]=d,l=B+16|0,c=n[l>>2]|0,c|0&&(n[s+16>>2]=c,n[c+24>>2]=s),l=n[l+4>>2]|0,l?(n[s+20>>2]=l,n[l+24>>2]=s,Q=B,l=m):(Q=B,l=m)}else Q=B,l=m}while(0);if(!(B>>>0>=k>>>0)&&(s=k+4|0,f=n[s>>2]|0,!!(f&1))){if(f&2)n[s>>2]=f&-2,n[Q+4>>2]=l|1,n[B+l>>2]=l,d=l;else{if(s=n[2788]|0,(k|0)==(n[2789]|0)){if(k=(n[2786]|0)+l|0,n[2786]=k,n[2789]=Q,n[Q+4>>2]=k|1,(Q|0)!=(s|0))return;n[2788]=0,n[2785]=0;return}if((k|0)==(s|0)){k=(n[2785]|0)+l|0,n[2785]=k,n[2788]=B,n[Q+4>>2]=k|1,n[B+k>>2]=k;return}d=(f&-8)+l|0,c=f>>>3;do if(f>>>0<256)if(l=n[k+8>>2]|0,s=n[k+12>>2]|0,(s|0)==(l|0)){n[2783]=n[2783]&~(1<>2]=s,n[s+8>>2]=l;break}else{m=n[k+24>>2]|0,s=n[k+12>>2]|0;do if((s|0)==(k|0)){if(c=k+16|0,l=c+4|0,s=n[l>>2]|0,!s)if(s=n[c>>2]|0,s)l=c;else{c=0;break}for(;;){if(c=s+20|0,f=n[c>>2]|0,f|0){s=f,l=c;continue}if(c=s+16|0,f=n[c>>2]|0,f)s=f,l=c;else break}n[l>>2]=0,c=s}else c=n[k+8>>2]|0,n[c+12>>2]=s,n[s+8>>2]=c,c=s;while(0);if(m|0){if(s=n[k+28>>2]|0,l=11436+(s<<2)|0,(k|0)==(n[l>>2]|0)){if(n[l>>2]=c,!c){n[2784]=n[2784]&~(1<>2]|0)!=(k|0)&1)<<2)>>2]=c,!c)break;n[c+24>>2]=m,s=k+16|0,l=n[s>>2]|0,l|0&&(n[c+16>>2]=l,n[l+24>>2]=c),s=n[s+4>>2]|0,s|0&&(n[c+20>>2]=s,n[s+24>>2]=c)}}while(0);if(n[Q+4>>2]=d|1,n[B+d>>2]=d,(Q|0)==(n[2788]|0)){n[2785]=d;return}}if(s=d>>>3,d>>>0<256){c=11172+(s<<1<<2)|0,l=n[2783]|0,s=1<>2]|0):(n[2783]=l|s,s=c,l=c+8|0),n[l>>2]=Q,n[s+12>>2]=Q,n[Q+8>>2]=s,n[Q+12>>2]=c;return}s=d>>>8,s?d>>>0>16777215?s=31:(B=(s+1048320|0)>>>16&8,k=s<>>16&4,k=k<>>16&2,s=14-(m|B|s)+(k<>>15)|0,s=d>>>(s+7|0)&1|s<<1):s=0,f=11436+(s<<2)|0,n[Q+28>>2]=s,n[Q+20>>2]=0,n[Q+16>>2]=0,l=n[2784]|0,c=1<>>1)|0),c=n[f>>2]|0;;){if((n[c+4>>2]&-8|0)==(d|0)){s=73;break}if(f=c+16+(l>>>31<<2)|0,s=n[f>>2]|0,s)l=l<<1,c=s;else{s=72;break}}if((s|0)==72){n[f>>2]=Q,n[Q+24>>2]=c,n[Q+12>>2]=Q,n[Q+8>>2]=Q;break}else if((s|0)==73){B=c+8|0,k=n[B>>2]|0,n[k+12>>2]=Q,n[B>>2]=Q,n[Q+8>>2]=k,n[Q+12>>2]=c,n[Q+24>>2]=0;break}}else n[2784]=l|c,n[f>>2]=Q,n[Q+24>>2]=f,n[Q+12>>2]=Q,n[Q+8>>2]=Q;while(0);if(k=(n[2791]|0)+-1|0,n[2791]=k,!k)s=11588;else return;for(;s=n[s>>2]|0,s;)s=s+8|0;n[2791]=-1}}}function YUe(){return 11628}function KUe(s){s=s|0;var l=0,c=0;return l=C,C=C+16|0,c=l,n[c>>2]=zUe(n[s+60>>2]|0)|0,s=tD(yc(6,c|0)|0)|0,C=l,s|0}function Z5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0,We=0;j=C,C=C+48|0,M=j+16|0,m=j,d=j+32|0,Q=s+28|0,f=n[Q>>2]|0,n[d>>2]=f,k=s+20|0,f=(n[k>>2]|0)-f|0,n[d+4>>2]=f,n[d+8>>2]=l,n[d+12>>2]=c,f=f+c|0,B=s+60|0,n[m>>2]=n[B>>2],n[m+4>>2]=d,n[m+8>>2]=2,m=tD(Hi(146,m|0)|0)|0;e:do if((f|0)!=(m|0)){for(l=2;!((m|0)<0);)if(f=f-m|0,We=n[d+4>>2]|0,se=m>>>0>We>>>0,d=se?d+8|0:d,l=(se<<31>>31)+l|0,We=m-(se?We:0)|0,n[d>>2]=(n[d>>2]|0)+We,se=d+4|0,n[se>>2]=(n[se>>2]|0)-We,n[M>>2]=n[B>>2],n[M+4>>2]=d,n[M+8>>2]=l,m=tD(Hi(146,M|0)|0)|0,(f|0)==(m|0)){O=3;break e}n[s+16>>2]=0,n[Q>>2]=0,n[k>>2]=0,n[s>>2]=n[s>>2]|32,(l|0)==2?c=0:c=c-(n[d+4>>2]|0)|0}else O=3;while(0);return(O|0)==3&&(We=n[s+44>>2]|0,n[s+16>>2]=We+(n[s+48>>2]|0),n[Q>>2]=We,n[k>>2]=We),C=j,c|0}function VUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;return d=C,C=C+32|0,m=d,f=d+20|0,n[m>>2]=n[s+60>>2],n[m+4>>2]=0,n[m+8>>2]=l,n[m+12>>2]=f,n[m+16>>2]=c,(tD(ra(140,m|0)|0)|0)<0?(n[f>>2]=-1,s=-1):s=n[f>>2]|0,C=d,s|0}function tD(s){return s=s|0,s>>>0>4294963200&&(n[(zm()|0)>>2]=0-s,s=-1),s|0}function zm(){return(JUe()|0)+64|0}function JUe(){return CR()|0}function CR(){return 2084}function zUe(s){return s=s|0,s|0}function XUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;return d=C,C=C+32|0,f=d,n[s+36>>2]=1,(n[s>>2]&64|0)==0&&(n[f>>2]=n[s+60>>2],n[f+4>>2]=21523,n[f+8>>2]=d+16,yu(54,f|0)|0)&&(o[s+75>>0]=-1),f=Z5(s,l,c)|0,C=d,f|0}function $5(s,l){s=s|0,l=l|0;var c=0,f=0;if(c=o[s>>0]|0,f=o[l>>0]|0,c<<24>>24==0||c<<24>>24!=f<<24>>24)s=f;else{do s=s+1|0,l=l+1|0,c=o[s>>0]|0,f=o[l>>0]|0;while(!(c<<24>>24==0||c<<24>>24!=f<<24>>24));s=f}return(c&255)-(s&255)|0}function ZUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;e:do if(!c)s=0;else{for(;f=o[s>>0]|0,d=o[l>>0]|0,f<<24>>24==d<<24>>24;)if(c=c+-1|0,c)s=s+1|0,l=l+1|0;else{s=0;break e}s=(f&255)-(d&255)|0}while(0);return s|0}function e7(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0,We=0,Le=0,Re=0;Re=C,C=C+224|0,O=Re+120|0,j=Re+80|0,We=Re,Le=Re+136|0,f=j,d=f+40|0;do n[f>>2]=0,f=f+4|0;while((f|0)<(d|0));return n[O>>2]=n[c>>2],(ER(0,l,O,We,j)|0)<0?c=-1:((n[s+76>>2]|0)>-1?se=$Ue(s)|0:se=0,c=n[s>>2]|0,M=c&32,(o[s+74>>0]|0)<1&&(n[s>>2]=c&-33),f=s+48|0,n[f>>2]|0?c=ER(s,l,O,We,j)|0:(d=s+44|0,m=n[d>>2]|0,n[d>>2]=Le,B=s+28|0,n[B>>2]=Le,Q=s+20|0,n[Q>>2]=Le,n[f>>2]=80,k=s+16|0,n[k>>2]=Le+80,c=ER(s,l,O,We,j)|0,m&&(sD[n[s+36>>2]&7](s,0,0)|0,c=(n[Q>>2]|0)==0?-1:c,n[d>>2]=m,n[f>>2]=0,n[k>>2]=0,n[B>>2]=0,n[Q>>2]=0)),f=n[s>>2]|0,n[s>>2]=f|M,se|0&&e3e(s),c=(f&32|0)==0?c:-1),C=Re,c|0}function ER(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0,We=0,Le=0,Re=0,et=0,Ze=0,at=0,He=0,Ge=0,Tt=0,Rr=0,ir=0,Jt=0,Ir=0,Qr=0,rr=0;rr=C,C=C+64|0,ir=rr+16|0,Jt=rr,Tt=rr+24|0,Ir=rr+8|0,Qr=rr+20|0,n[ir>>2]=l,at=(s|0)!=0,He=Tt+40|0,Ge=He,Tt=Tt+39|0,Rr=Ir+4|0,B=0,m=0,O=0;e:for(;;){do if((m|0)>-1)if((B|0)>(2147483647-m|0)){n[(zm()|0)>>2]=75,m=-1;break}else{m=B+m|0;break}while(0);if(B=o[l>>0]|0,B<<24>>24)Q=l;else{Ze=87;break}t:for(;;){switch(B<<24>>24){case 37:{B=Q,Ze=9;break t}case 0:{B=Q;break t}default:}et=Q+1|0,n[ir>>2]=et,B=o[et>>0]|0,Q=et}t:do if((Ze|0)==9)for(;;){if(Ze=0,(o[Q+1>>0]|0)!=37)break t;if(B=B+1|0,Q=Q+2|0,n[ir>>2]=Q,(o[Q>>0]|0)==37)Ze=9;else break}while(0);if(B=B-l|0,at&&ss(s,l,B),B|0){l=Q;continue}k=Q+1|0,B=(o[k>>0]|0)+-48|0,B>>>0<10?(et=(o[Q+2>>0]|0)==36,Re=et?B:-1,O=et?1:O,k=et?Q+3|0:k):Re=-1,n[ir>>2]=k,B=o[k>>0]|0,Q=(B<<24>>24)+-32|0;t:do if(Q>>>0<32)for(M=0,j=B;;){if(B=1<>2]=k,B=o[k>>0]|0,Q=(B<<24>>24)+-32|0,Q>>>0>=32)break;j=B}else M=0;while(0);if(B<<24>>24==42){if(Q=k+1|0,B=(o[Q>>0]|0)+-48|0,B>>>0<10&&(o[k+2>>0]|0)==36)n[d+(B<<2)>>2]=10,B=n[f+((o[Q>>0]|0)+-48<<3)>>2]|0,O=1,k=k+3|0;else{if(O|0){m=-1;break}at?(O=(n[c>>2]|0)+(4-1)&~(4-1),B=n[O>>2]|0,n[c>>2]=O+4,O=0,k=Q):(B=0,O=0,k=Q)}n[ir>>2]=k,et=(B|0)<0,B=et?0-B|0:B,M=et?M|8192:M}else{if(B=t7(ir)|0,(B|0)<0){m=-1;break}k=n[ir>>2]|0}do if((o[k>>0]|0)==46){if((o[k+1>>0]|0)!=42){n[ir>>2]=k+1,Q=t7(ir)|0,k=n[ir>>2]|0;break}if(j=k+2|0,Q=(o[j>>0]|0)+-48|0,Q>>>0<10&&(o[k+3>>0]|0)==36){n[d+(Q<<2)>>2]=10,Q=n[f+((o[j>>0]|0)+-48<<3)>>2]|0,k=k+4|0,n[ir>>2]=k;break}if(O|0){m=-1;break e}at?(et=(n[c>>2]|0)+(4-1)&~(4-1),Q=n[et>>2]|0,n[c>>2]=et+4):Q=0,n[ir>>2]=j,k=j}else Q=-1;while(0);for(Le=0;;){if(((o[k>>0]|0)+-65|0)>>>0>57){m=-1;break e}if(et=k+1|0,n[ir>>2]=et,j=o[(o[k>>0]|0)+-65+(5178+(Le*58|0))>>0]|0,se=j&255,(se+-1|0)>>>0<8)Le=se,k=et;else break}if(!(j<<24>>24)){m=-1;break}We=(Re|0)>-1;do if(j<<24>>24==19)if(We){m=-1;break e}else Ze=49;else{if(We){n[d+(Re<<2)>>2]=se,We=f+(Re<<3)|0,Re=n[We+4>>2]|0,Ze=Jt,n[Ze>>2]=n[We>>2],n[Ze+4>>2]=Re,Ze=49;break}if(!at){m=0;break e}r7(Jt,se,c)}while(0);if((Ze|0)==49&&(Ze=0,!at)){B=0,l=et;continue}k=o[k>>0]|0,k=(Le|0)!=0&(k&15|0)==3?k&-33:k,We=M&-65537,Re=(M&8192|0)==0?M:We;t:do switch(k|0){case 110:switch((Le&255)<<24>>24){case 0:{n[n[Jt>>2]>>2]=m,B=0,l=et;continue e}case 1:{n[n[Jt>>2]>>2]=m,B=0,l=et;continue e}case 2:{B=n[Jt>>2]|0,n[B>>2]=m,n[B+4>>2]=((m|0)<0)<<31>>31,B=0,l=et;continue e}case 3:{a[n[Jt>>2]>>1]=m,B=0,l=et;continue e}case 4:{o[n[Jt>>2]>>0]=m,B=0,l=et;continue e}case 6:{n[n[Jt>>2]>>2]=m,B=0,l=et;continue e}case 7:{B=n[Jt>>2]|0,n[B>>2]=m,n[B+4>>2]=((m|0)<0)<<31>>31,B=0,l=et;continue e}default:{B=0,l=et;continue e}}case 112:{k=120,Q=Q>>>0>8?Q:8,l=Re|8,Ze=61;break}case 88:case 120:{l=Re,Ze=61;break}case 111:{k=Jt,l=n[k>>2]|0,k=n[k+4>>2]|0,se=r3e(l,k,He)|0,We=Ge-se|0,M=0,j=5642,Q=(Re&8|0)==0|(Q|0)>(We|0)?Q:We+1|0,We=Re,Ze=67;break}case 105:case 100:if(k=Jt,l=n[k>>2]|0,k=n[k+4>>2]|0,(k|0)<0){l=rD(0,0,l|0,k|0)|0,k=Ce,M=Jt,n[M>>2]=l,n[M+4>>2]=k,M=1,j=5642,Ze=66;break t}else{M=(Re&2049|0)!=0&1,j=(Re&2048|0)==0?(Re&1|0)==0?5642:5644:5643,Ze=66;break t}case 117:{k=Jt,M=0,j=5642,l=n[k>>2]|0,k=n[k+4>>2]|0,Ze=66;break}case 99:{o[Tt>>0]=n[Jt>>2],l=Tt,M=0,j=5642,se=He,k=1,Q=We;break}case 109:{k=n3e(n[(zm()|0)>>2]|0)|0,Ze=71;break}case 115:{k=n[Jt>>2]|0,k=k|0?k:5652,Ze=71;break}case 67:{n[Ir>>2]=n[Jt>>2],n[Rr>>2]=0,n[Jt>>2]=Ir,se=-1,k=Ir,Ze=75;break}case 83:{l=n[Jt>>2]|0,Q?(se=Q,k=l,Ze=75):(Is(s,32,B,0,Re),l=0,Ze=84);break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{B=s3e(s,+E[Jt>>3],B,Q,Re,k)|0,l=et;continue e}default:M=0,j=5642,se=He,k=Q,Q=Re}while(0);t:do if((Ze|0)==61)Re=Jt,Le=n[Re>>2]|0,Re=n[Re+4>>2]|0,se=t3e(Le,Re,He,k&32)|0,j=(l&8|0)==0|(Le|0)==0&(Re|0)==0,M=j?0:2,j=j?5642:5642+(k>>4)|0,We=l,l=Le,k=Re,Ze=67;else if((Ze|0)==66)se=Xm(l,k,He)|0,We=Re,Ze=67;else if((Ze|0)==71)Ze=0,Re=i3e(k,0,Q)|0,Le=(Re|0)==0,l=k,M=0,j=5642,se=Le?k+Q|0:Re,k=Le?Q:Re-k|0,Q=We;else if((Ze|0)==75){for(Ze=0,j=k,l=0,Q=0;M=n[j>>2]|0,!(!M||(Q=n7(Qr,M)|0,(Q|0)<0|Q>>>0>(se-l|0)>>>0));)if(l=Q+l|0,se>>>0>l>>>0)j=j+4|0;else break;if((Q|0)<0){m=-1;break e}if(Is(s,32,B,l,Re),!l)l=0,Ze=84;else for(M=0;;){if(Q=n[k>>2]|0,!Q){Ze=84;break t}if(Q=n7(Qr,Q)|0,M=Q+M|0,(M|0)>(l|0)){Ze=84;break t}if(ss(s,Qr,Q),M>>>0>=l>>>0){Ze=84;break}else k=k+4|0}}while(0);if((Ze|0)==67)Ze=0,k=(l|0)!=0|(k|0)!=0,Re=(Q|0)!=0|k,k=((k^1)&1)+(Ge-se)|0,l=Re?se:He,se=He,k=Re?(Q|0)>(k|0)?Q:k:Q,Q=(Q|0)>-1?We&-65537:We;else if((Ze|0)==84){Ze=0,Is(s,32,B,l,Re^8192),B=(B|0)>(l|0)?B:l,l=et;continue}Le=se-l|0,We=(k|0)<(Le|0)?Le:k,Re=We+M|0,B=(B|0)<(Re|0)?Re:B,Is(s,32,B,Re,Q),ss(s,j,M),Is(s,48,B,Re,Q^65536),Is(s,48,We,Le,0),ss(s,l,Le),Is(s,32,B,Re,Q^8192),l=et}e:do if((Ze|0)==87&&!s)if(!O)m=0;else{for(m=1;l=n[d+(m<<2)>>2]|0,!!l;)if(r7(f+(m<<3)|0,l,c),m=m+1|0,(m|0)>=10){m=1;break e}for(;;){if(n[d+(m<<2)>>2]|0){m=-1;break e}if(m=m+1|0,(m|0)>=10){m=1;break}}}while(0);return C=rr,m|0}function $Ue(s){return s=s|0,0}function e3e(s){s=s|0}function ss(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]&32||h3e(l,c,s)|0}function t7(s){s=s|0;var l=0,c=0,f=0;if(c=n[s>>2]|0,f=(o[c>>0]|0)+-48|0,f>>>0<10){l=0;do l=f+(l*10|0)|0,c=c+1|0,n[s>>2]=c,f=(o[c>>0]|0)+-48|0;while(f>>>0<10)}else l=0;return l|0}function r7(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;e:do if(l>>>0<=20)do switch(l|0){case 9:{f=(n[c>>2]|0)+(4-1)&~(4-1),l=n[f>>2]|0,n[c>>2]=f+4,n[s>>2]=l;break e}case 10:{f=(n[c>>2]|0)+(4-1)&~(4-1),l=n[f>>2]|0,n[c>>2]=f+4,f=s,n[f>>2]=l,n[f+4>>2]=((l|0)<0)<<31>>31;break e}case 11:{f=(n[c>>2]|0)+(4-1)&~(4-1),l=n[f>>2]|0,n[c>>2]=f+4,f=s,n[f>>2]=l,n[f+4>>2]=0;break e}case 12:{f=(n[c>>2]|0)+(8-1)&~(8-1),l=f,d=n[l>>2]|0,l=n[l+4>>2]|0,n[c>>2]=f+8,f=s,n[f>>2]=d,n[f+4>>2]=l;break e}case 13:{d=(n[c>>2]|0)+(4-1)&~(4-1),f=n[d>>2]|0,n[c>>2]=d+4,f=(f&65535)<<16>>16,d=s,n[d>>2]=f,n[d+4>>2]=((f|0)<0)<<31>>31;break e}case 14:{d=(n[c>>2]|0)+(4-1)&~(4-1),f=n[d>>2]|0,n[c>>2]=d+4,d=s,n[d>>2]=f&65535,n[d+4>>2]=0;break e}case 15:{d=(n[c>>2]|0)+(4-1)&~(4-1),f=n[d>>2]|0,n[c>>2]=d+4,f=(f&255)<<24>>24,d=s,n[d>>2]=f,n[d+4>>2]=((f|0)<0)<<31>>31;break e}case 16:{d=(n[c>>2]|0)+(4-1)&~(4-1),f=n[d>>2]|0,n[c>>2]=d+4,d=s,n[d>>2]=f&255,n[d+4>>2]=0;break e}case 17:{d=(n[c>>2]|0)+(8-1)&~(8-1),m=+E[d>>3],n[c>>2]=d+8,E[s>>3]=m;break e}case 18:{d=(n[c>>2]|0)+(8-1)&~(8-1),m=+E[d>>3],n[c>>2]=d+8,E[s>>3]=m;break e}default:break e}while(0);while(0)}function t3e(s,l,c,f){if(s=s|0,l=l|0,c=c|0,f=f|0,!((s|0)==0&(l|0)==0))do c=c+-1|0,o[c>>0]=u[5694+(s&15)>>0]|0|f,s=nD(s|0,l|0,4)|0,l=Ce;while(!((s|0)==0&(l|0)==0));return c|0}function r3e(s,l,c){if(s=s|0,l=l|0,c=c|0,!((s|0)==0&(l|0)==0))do c=c+-1|0,o[c>>0]=s&7|48,s=nD(s|0,l|0,3)|0,l=Ce;while(!((s|0)==0&(l|0)==0));return c|0}function Xm(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;if(l>>>0>0|(l|0)==0&s>>>0>4294967295){for(;f=vR(s|0,l|0,10,0)|0,c=c+-1|0,o[c>>0]=f&255|48,f=s,s=BR(s|0,l|0,10,0)|0,l>>>0>9|(l|0)==9&f>>>0>4294967295;)l=Ce;l=s}else l=s;if(l)for(;c=c+-1|0,o[c>>0]=(l>>>0)%10|0|48,!(l>>>0<10);)l=(l>>>0)/10|0;return c|0}function n3e(s){return s=s|0,u3e(s,n[(c3e()|0)+188>>2]|0)|0}function i3e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;m=l&255,f=(c|0)!=0;e:do if(f&(s&3|0)!=0)for(d=l&255;;){if((o[s>>0]|0)==d<<24>>24){B=6;break e}if(s=s+1|0,c=c+-1|0,f=(c|0)!=0,!(f&(s&3|0)!=0)){B=5;break}}else B=5;while(0);(B|0)==5&&(f?B=6:c=0);e:do if((B|0)==6&&(d=l&255,(o[s>>0]|0)!=d<<24>>24)){f=Oe(m,16843009)|0;t:do if(c>>>0>3){for(;m=n[s>>2]^f,!((m&-2139062144^-2139062144)&m+-16843009|0);)if(s=s+4|0,c=c+-4|0,c>>>0<=3){B=11;break t}}else B=11;while(0);if((B|0)==11&&!c){c=0;break}for(;;){if((o[s>>0]|0)==d<<24>>24)break e;if(s=s+1|0,c=c+-1|0,!c){c=0;break}}}while(0);return(c|0?s:0)|0}function Is(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0;if(B=C,C=C+256|0,m=B,(c|0)>(f|0)&(d&73728|0)==0){if(d=c-f|0,$m(m|0,l|0,(d>>>0<256?d:256)|0)|0,d>>>0>255){l=c-f|0;do ss(s,m,256),d=d+-256|0;while(d>>>0>255);d=l&255}ss(s,m,d)}C=B}function n7(s,l){return s=s|0,l=l|0,s?s=a3e(s,l,0)|0:s=0,s|0}function s3e(s,l,c,f,d,m){s=s|0,l=+l,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,Q=0,k=0,M=0,O=0,j=0,se=0,We=0,Le=0,Re=0,et=0,Ze=0,at=0,He=0,Ge=0,Tt=0,Rr=0,ir=0,Jt=0,Ir=0,Qr=0,rr=0,Bn=0;Bn=C,C=C+560|0,k=Bn+8|0,et=Bn,rr=Bn+524|0,Qr=rr,M=Bn+512|0,n[et>>2]=0,Ir=M+12|0,i7(l)|0,(Ce|0)<0?(l=-l,ir=1,Rr=5659):(ir=(d&2049|0)!=0&1,Rr=(d&2048|0)==0?(d&1|0)==0?5660:5665:5662),i7(l)|0,Jt=Ce&2146435072;do if(Jt>>>0<2146435072|(Jt|0)==2146435072&0<0){if(We=+o3e(l,et)*2,B=We!=0,B&&(n[et>>2]=(n[et>>2]|0)+-1),at=m|32,(at|0)==97){Le=m&32,se=(Le|0)==0?Rr:Rr+9|0,j=ir|2,B=12-f|0;do if(f>>>0>11|(B|0)==0)l=We;else{l=8;do B=B+-1|0,l=l*16;while((B|0)!=0);if((o[se>>0]|0)==45){l=-(l+(-We-l));break}else{l=We+l-l;break}}while(0);Q=n[et>>2]|0,B=(Q|0)<0?0-Q|0:Q,B=Xm(B,((B|0)<0)<<31>>31,Ir)|0,(B|0)==(Ir|0)&&(B=M+11|0,o[B>>0]=48),o[B+-1>>0]=(Q>>31&2)+43,O=B+-2|0,o[O>>0]=m+15,M=(f|0)<1,k=(d&8|0)==0,B=rr;do Jt=~~l,Q=B+1|0,o[B>>0]=u[5694+Jt>>0]|Le,l=(l-+(Jt|0))*16,(Q-Qr|0)==1&&!(k&(M&l==0))?(o[Q>>0]=46,B=B+2|0):B=Q;while(l!=0);Jt=B-Qr|0,Qr=Ir-O|0,Ir=(f|0)!=0&(Jt+-2|0)<(f|0)?f+2|0:Jt,B=Qr+j+Ir|0,Is(s,32,c,B,d),ss(s,se,j),Is(s,48,c,B,d^65536),ss(s,rr,Jt),Is(s,48,Ir-Jt|0,0,0),ss(s,O,Qr),Is(s,32,c,B,d^8192);break}Q=(f|0)<0?6:f,B?(B=(n[et>>2]|0)+-28|0,n[et>>2]=B,l=We*268435456):(l=We,B=n[et>>2]|0),Jt=(B|0)<0?k:k+288|0,k=Jt;do Ge=~~l>>>0,n[k>>2]=Ge,k=k+4|0,l=(l-+(Ge>>>0))*1e9;while(l!=0);if((B|0)>0)for(M=Jt,j=k;;){if(O=(B|0)<29?B:29,B=j+-4|0,B>>>0>=M>>>0){k=0;do He=u7(n[B>>2]|0,0,O|0)|0,He=wR(He|0,Ce|0,k|0,0)|0,Ge=Ce,Ze=vR(He|0,Ge|0,1e9,0)|0,n[B>>2]=Ze,k=BR(He|0,Ge|0,1e9,0)|0,B=B+-4|0;while(B>>>0>=M>>>0);k&&(M=M+-4|0,n[M>>2]=k)}for(k=j;!(k>>>0<=M>>>0);)if(B=k+-4|0,!(n[B>>2]|0))k=B;else break;if(B=(n[et>>2]|0)-O|0,n[et>>2]=B,(B|0)>0)j=k;else break}else M=Jt;if((B|0)<0){f=((Q+25|0)/9|0)+1|0,Re=(at|0)==102;do{if(Le=0-B|0,Le=(Le|0)<9?Le:9,M>>>0>>0){O=(1<>>Le,se=0,B=M;do Ge=n[B>>2]|0,n[B>>2]=(Ge>>>Le)+se,se=Oe(Ge&O,j)|0,B=B+4|0;while(B>>>0>>0);B=(n[M>>2]|0)==0?M+4|0:M,se?(n[k>>2]=se,M=B,B=k+4|0):(M=B,B=k)}else M=(n[M>>2]|0)==0?M+4|0:M,B=k;k=Re?Jt:M,k=(B-k>>2|0)>(f|0)?k+(f<<2)|0:B,B=(n[et>>2]|0)+Le|0,n[et>>2]=B}while((B|0)<0);B=M,f=k}else B=M,f=k;if(Ge=Jt,B>>>0>>0){if(k=(Ge-B>>2)*9|0,O=n[B>>2]|0,O>>>0>=10){M=10;do M=M*10|0,k=k+1|0;while(O>>>0>=M>>>0)}}else k=0;if(Re=(at|0)==103,Ze=(Q|0)!=0,M=Q-((at|0)!=102?k:0)+((Ze&Re)<<31>>31)|0,(M|0)<(((f-Ge>>2)*9|0)+-9|0)){if(M=M+9216|0,Le=Jt+4+(((M|0)/9|0)+-1024<<2)|0,M=((M|0)%9|0)+1|0,(M|0)<9){O=10;do O=O*10|0,M=M+1|0;while((M|0)!=9)}else O=10;if(j=n[Le>>2]|0,se=(j>>>0)%(O>>>0)|0,M=(Le+4|0)==(f|0),M&(se|0)==0)M=Le;else if(We=(((j>>>0)/(O>>>0)|0)&1|0)==0?9007199254740992:9007199254740994,He=(O|0)/2|0,l=se>>>0>>0?.5:M&(se|0)==(He|0)?1:1.5,ir&&(He=(o[Rr>>0]|0)==45,l=He?-l:l,We=He?-We:We),M=j-se|0,n[Le>>2]=M,We+l!=We){if(He=M+O|0,n[Le>>2]=He,He>>>0>999999999)for(k=Le;M=k+-4|0,n[k>>2]=0,M>>>0>>0&&(B=B+-4|0,n[B>>2]=0),He=(n[M>>2]|0)+1|0,n[M>>2]=He,He>>>0>999999999;)k=M;else M=Le;if(k=(Ge-B>>2)*9|0,j=n[B>>2]|0,j>>>0>=10){O=10;do O=O*10|0,k=k+1|0;while(j>>>0>=O>>>0)}}else M=Le;M=M+4|0,M=f>>>0>M>>>0?M:f,He=B}else M=f,He=B;for(at=M;;){if(at>>>0<=He>>>0){et=0;break}if(B=at+-4|0,!(n[B>>2]|0))at=B;else{et=1;break}}f=0-k|0;do if(Re)if(B=((Ze^1)&1)+Q|0,(B|0)>(k|0)&(k|0)>-5?(O=m+-1|0,Q=B+-1-k|0):(O=m+-2|0,Q=B+-1|0),B=d&8,B)Le=B;else{if(et&&(Tt=n[at+-4>>2]|0,(Tt|0)!=0))if((Tt>>>0)%10|0)M=0;else{M=0,B=10;do B=B*10|0,M=M+1|0;while(!((Tt>>>0)%(B>>>0)|0|0))}else M=9;if(B=((at-Ge>>2)*9|0)+-9|0,(O|32|0)==102){Le=B-M|0,Le=(Le|0)>0?Le:0,Q=(Q|0)<(Le|0)?Q:Le,Le=0;break}else{Le=B+k-M|0,Le=(Le|0)>0?Le:0,Q=(Q|0)<(Le|0)?Q:Le,Le=0;break}}else O=m,Le=d&8;while(0);if(Re=Q|Le,j=(Re|0)!=0&1,se=(O|32|0)==102,se)Ze=0,B=(k|0)>0?k:0;else{if(B=(k|0)<0?f:k,B=Xm(B,((B|0)<0)<<31>>31,Ir)|0,M=Ir,(M-B|0)<2)do B=B+-1|0,o[B>>0]=48;while((M-B|0)<2);o[B+-1>>0]=(k>>31&2)+43,B=B+-2|0,o[B>>0]=O,Ze=B,B=M-B|0}if(B=ir+1+Q+j+B|0,Is(s,32,c,B,d),ss(s,Rr,ir),Is(s,48,c,B,d^65536),se){O=He>>>0>Jt>>>0?Jt:He,Le=rr+9|0,j=Le,se=rr+8|0,M=O;do{if(k=Xm(n[M>>2]|0,0,Le)|0,(M|0)==(O|0))(k|0)==(Le|0)&&(o[se>>0]=48,k=se);else if(k>>>0>rr>>>0){$m(rr|0,48,k-Qr|0)|0;do k=k+-1|0;while(k>>>0>rr>>>0)}ss(s,k,j-k|0),M=M+4|0}while(M>>>0<=Jt>>>0);if(Re|0&&ss(s,5710,1),M>>>0>>0&(Q|0)>0)for(;;){if(k=Xm(n[M>>2]|0,0,Le)|0,k>>>0>rr>>>0){$m(rr|0,48,k-Qr|0)|0;do k=k+-1|0;while(k>>>0>rr>>>0)}if(ss(s,k,(Q|0)<9?Q:9),M=M+4|0,k=Q+-9|0,M>>>0>>0&(Q|0)>9)Q=k;else{Q=k;break}}Is(s,48,Q+9|0,9,0)}else{if(Re=et?at:He+4|0,(Q|0)>-1){et=rr+9|0,Le=(Le|0)==0,f=et,j=0-Qr|0,se=rr+8|0,O=He;do{k=Xm(n[O>>2]|0,0,et)|0,(k|0)==(et|0)&&(o[se>>0]=48,k=se);do if((O|0)==(He|0)){if(M=k+1|0,ss(s,k,1),Le&(Q|0)<1){k=M;break}ss(s,5710,1),k=M}else{if(k>>>0<=rr>>>0)break;$m(rr|0,48,k+j|0)|0;do k=k+-1|0;while(k>>>0>rr>>>0)}while(0);Qr=f-k|0,ss(s,k,(Q|0)>(Qr|0)?Qr:Q),Q=Q-Qr|0,O=O+4|0}while(O>>>0>>0&(Q|0)>-1)}Is(s,48,Q+18|0,18,0),ss(s,Ze,Ir-Ze|0)}Is(s,32,c,B,d^8192)}else rr=(m&32|0)!=0,B=ir+3|0,Is(s,32,c,B,d&-65537),ss(s,Rr,ir),ss(s,l!=l|!1?rr?5686:5690:rr?5678:5682,3),Is(s,32,c,B,d^8192);while(0);return C=Bn,((B|0)<(c|0)?c:B)|0}function i7(s){s=+s;var l=0;return E[v>>3]=s,l=n[v>>2]|0,Ce=n[v+4>>2]|0,l|0}function o3e(s,l){return s=+s,l=l|0,+ +s7(s,l)}function s7(s,l){s=+s,l=l|0;var c=0,f=0,d=0;switch(E[v>>3]=s,c=n[v>>2]|0,f=n[v+4>>2]|0,d=nD(c|0,f|0,52)|0,d&2047){case 0:{s!=0?(s=+s7(s*18446744073709552e3,l),c=(n[l>>2]|0)+-64|0):c=0,n[l>>2]=c;break}case 2047:break;default:n[l>>2]=(d&2047)+-1022,n[v>>2]=c,n[v+4>>2]=f&-2146435073|1071644672,s=+E[v>>3]}return+s}function a3e(s,l,c){s=s|0,l=l|0,c=c|0;do if(s){if(l>>>0<128){o[s>>0]=l,s=1;break}if(!(n[n[(l3e()|0)+188>>2]>>2]|0))if((l&-128|0)==57216){o[s>>0]=l,s=1;break}else{n[(zm()|0)>>2]=84,s=-1;break}if(l>>>0<2048){o[s>>0]=l>>>6|192,o[s+1>>0]=l&63|128,s=2;break}if(l>>>0<55296|(l&-8192|0)==57344){o[s>>0]=l>>>12|224,o[s+1>>0]=l>>>6&63|128,o[s+2>>0]=l&63|128,s=3;break}if((l+-65536|0)>>>0<1048576){o[s>>0]=l>>>18|240,o[s+1>>0]=l>>>12&63|128,o[s+2>>0]=l>>>6&63|128,o[s+3>>0]=l&63|128,s=4;break}else{n[(zm()|0)>>2]=84,s=-1;break}}else s=1;while(0);return s|0}function l3e(){return CR()|0}function c3e(){return CR()|0}function u3e(s,l){s=s|0,l=l|0;var c=0,f=0;for(f=0;;){if((u[5712+f>>0]|0)==(s|0)){s=2;break}if(c=f+1|0,(c|0)==87){c=5800,f=87,s=5;break}else f=c}if((s|0)==2&&(f?(c=5800,s=5):c=5800),(s|0)==5)for(;;){do s=c,c=c+1|0;while((o[s>>0]|0)!=0);if(f=f+-1|0,f)s=5;else break}return A3e(c,n[l+20>>2]|0)|0}function A3e(s,l){return s=s|0,l=l|0,f3e(s,l)|0}function f3e(s,l){return s=s|0,l=l|0,l?l=p3e(n[l>>2]|0,n[l+4>>2]|0,s)|0:l=0,(l|0?l:s)|0}function p3e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0;se=(n[s>>2]|0)+1794895138|0,m=bg(n[s+8>>2]|0,se)|0,f=bg(n[s+12>>2]|0,se)|0,d=bg(n[s+16>>2]|0,se)|0;e:do if(m>>>0>>2>>>0&&(j=l-(m<<2)|0,f>>>0>>0&d>>>0>>0)&&((d|f)&3|0)==0){for(j=f>>>2,O=d>>>2,M=0;;){if(Q=m>>>1,k=M+Q|0,B=k<<1,d=B+j|0,f=bg(n[s+(d<<2)>>2]|0,se)|0,d=bg(n[s+(d+1<<2)>>2]|0,se)|0,!(d>>>0>>0&f>>>0<(l-d|0)>>>0)){f=0;break e}if(o[s+(d+f)>>0]|0){f=0;break e}if(f=$5(c,s+d|0)|0,!f)break;if(f=(f|0)<0,(m|0)==1){f=0;break e}else M=f?M:k,m=f?Q:m-Q|0}f=B+O|0,d=bg(n[s+(f<<2)>>2]|0,se)|0,f=bg(n[s+(f+1<<2)>>2]|0,se)|0,f>>>0>>0&d>>>0<(l-f|0)>>>0?f=(o[s+(f+d)>>0]|0)==0?s+f|0:0:f=0}else f=0;while(0);return f|0}function bg(s,l){s=s|0,l=l|0;var c=0;return c=p7(s|0)|0,((l|0)==0?s:c)|0}function h3e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,Q=0;f=c+16|0,d=n[f>>2]|0,d?m=5:g3e(c)|0?f=0:(d=n[f>>2]|0,m=5);e:do if((m|0)==5){if(Q=c+20|0,B=n[Q>>2]|0,f=B,(d-B|0)>>>0>>0){f=sD[n[c+36>>2]&7](c,s,l)|0;break}t:do if((o[c+75>>0]|0)>-1){for(B=l;;){if(!B){m=0,d=s;break t}if(d=B+-1|0,(o[s+d>>0]|0)==10)break;B=d}if(f=sD[n[c+36>>2]&7](c,s,B)|0,f>>>0>>0)break e;m=B,d=s+B|0,l=l-B|0,f=n[Q>>2]|0}else m=0,d=s;while(0);Er(f|0,d|0,l|0)|0,n[Q>>2]=(n[Q>>2]|0)+l,f=m+l|0}while(0);return f|0}function g3e(s){s=s|0;var l=0,c=0;return l=s+74|0,c=o[l>>0]|0,o[l>>0]=c+255|c,l=n[s>>2]|0,l&8?(n[s>>2]=l|32,s=-1):(n[s+8>>2]=0,n[s+4>>2]=0,c=n[s+44>>2]|0,n[s+28>>2]=c,n[s+20>>2]=c,n[s+16>>2]=c+(n[s+48>>2]|0),s=0),s|0}function Nn(s,l){s=y(s),l=y(l);var c=0,f=0;c=o7(s)|0;do if((c&2147483647)>>>0<=2139095040){if(f=o7(l)|0,(f&2147483647)>>>0<=2139095040)if((f^c|0)<0){s=(c|0)<0?l:s;break}else{s=s>2]=s,n[v>>2]|0|0}function Qg(s,l){s=y(s),l=y(l);var c=0,f=0;c=a7(s)|0;do if((c&2147483647)>>>0<=2139095040){if(f=a7(l)|0,(f&2147483647)>>>0<=2139095040)if((f^c|0)<0){s=(c|0)<0?s:l;break}else{s=s>2]=s,n[v>>2]|0|0}function IR(s,l){s=y(s),l=y(l);var c=0,f=0,d=0,m=0,B=0,Q=0,k=0,M=0;m=(h[v>>2]=s,n[v>>2]|0),Q=(h[v>>2]=l,n[v>>2]|0),c=m>>>23&255,B=Q>>>23&255,k=m&-2147483648,d=Q<<1;e:do if((d|0)!=0&&!((c|0)==255|((d3e(l)|0)&2147483647)>>>0>2139095040)){if(f=m<<1,f>>>0<=d>>>0)return l=y(s*y(0)),y((f|0)==(d|0)?l:s);if(c)f=m&8388607|8388608;else{if(c=m<<9,(c|0)>-1){f=c,c=0;do c=c+-1|0,f=f<<1;while((f|0)>-1)}else c=0;f=m<<1-c}if(B)Q=Q&8388607|8388608;else{if(m=Q<<9,(m|0)>-1){d=0;do d=d+-1|0,m=m<<1;while((m|0)>-1)}else d=0;B=d,Q=Q<<1-d}d=f-Q|0,m=(d|0)>-1;t:do if((c|0)>(B|0)){for(;;){if(m)if(d)f=d;else break;if(f=f<<1,c=c+-1|0,d=f-Q|0,m=(d|0)>-1,(c|0)<=(B|0))break t}l=y(s*y(0));break e}while(0);if(m)if(d)f=d;else{l=y(s*y(0));break}if(f>>>0<8388608)do f=f<<1,c=c+-1|0;while(f>>>0<8388608);(c|0)>0?c=f+-8388608|c<<23:c=f>>>(1-c|0),l=(n[v>>2]=c|k,y(h[v>>2]))}else M=3;while(0);return(M|0)==3&&(l=y(s*l),l=y(l/l)),y(l)}function d3e(s){return s=y(s),h[v>>2]=s,n[v>>2]|0|0}function m3e(s,l){return s=s|0,l=l|0,e7(n[582]|0,s,l)|0}function Vr(s){s=s|0,Rt()}function Zm(s){s=s|0}function y3e(s,l){return s=s|0,l=l|0,0}function C3e(s){return s=s|0,(l7(s+4|0)|0)==-1?(tf[n[(n[s>>2]|0)+8>>2]&127](s),s=1):s=0,s|0}function l7(s){s=s|0;var l=0;return l=n[s>>2]|0,n[s>>2]=l+-1,l+-1|0}function xp(s){s=s|0,C3e(s)|0&&E3e(s)}function E3e(s){s=s|0;var l=0;l=s+8|0,(n[l>>2]|0)!=0&&(l7(l)|0)!=-1||tf[n[(n[s>>2]|0)+16>>2]&127](s)}function Gt(s){s=s|0;var l=0;for(l=(s|0)==0?1:s;s=$v(l)|0,!(s|0);){if(s=w3e()|0,!s){s=0;break}B7[s&0]()}return s|0}function c7(s){return s=s|0,Gt(s)|0}function pt(s){s=s|0,eD(s)}function I3e(s){s=s|0,(o[s+11>>0]|0)<0&&pt(n[s>>2]|0)}function w3e(){var s=0;return s=n[2923]|0,n[2923]=s+0,s|0}function B3e(){}function rD(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,f=l-f-(c>>>0>s>>>0|0)>>>0,Ce=f,s-c>>>0|0|0}function wR(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,c=s+c>>>0,Ce=l+f+(c>>>0>>0|0)>>>0,c|0|0}function $m(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;if(m=s+c|0,l=l&255,(c|0)>=67){for(;s&3;)o[s>>0]=l,s=s+1|0;for(f=m&-4|0,d=f-64|0,B=l|l<<8|l<<16|l<<24;(s|0)<=(d|0);)n[s>>2]=B,n[s+4>>2]=B,n[s+8>>2]=B,n[s+12>>2]=B,n[s+16>>2]=B,n[s+20>>2]=B,n[s+24>>2]=B,n[s+28>>2]=B,n[s+32>>2]=B,n[s+36>>2]=B,n[s+40>>2]=B,n[s+44>>2]=B,n[s+48>>2]=B,n[s+52>>2]=B,n[s+56>>2]=B,n[s+60>>2]=B,s=s+64|0;for(;(s|0)<(f|0);)n[s>>2]=B,s=s+4|0}for(;(s|0)<(m|0);)o[s>>0]=l,s=s+1|0;return m-c|0}function u7(s,l,c){return s=s|0,l=l|0,c=c|0,(c|0)<32?(Ce=l<>>32-c,s<>>c,s>>>c|(l&(1<>>c-32|0)}function Er(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;if((c|0)>=8192)return gc(s|0,l|0,c|0)|0;if(m=s|0,d=s+c|0,(s&3)==(l&3)){for(;s&3;){if(!c)return m|0;o[s>>0]=o[l>>0]|0,s=s+1|0,l=l+1|0,c=c-1|0}for(c=d&-4|0,f=c-64|0;(s|0)<=(f|0);)n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=n[l+8>>2],n[s+12>>2]=n[l+12>>2],n[s+16>>2]=n[l+16>>2],n[s+20>>2]=n[l+20>>2],n[s+24>>2]=n[l+24>>2],n[s+28>>2]=n[l+28>>2],n[s+32>>2]=n[l+32>>2],n[s+36>>2]=n[l+36>>2],n[s+40>>2]=n[l+40>>2],n[s+44>>2]=n[l+44>>2],n[s+48>>2]=n[l+48>>2],n[s+52>>2]=n[l+52>>2],n[s+56>>2]=n[l+56>>2],n[s+60>>2]=n[l+60>>2],s=s+64|0,l=l+64|0;for(;(s|0)<(c|0);)n[s>>2]=n[l>>2],s=s+4|0,l=l+4|0}else for(c=d-4|0;(s|0)<(c|0);)o[s>>0]=o[l>>0]|0,o[s+1>>0]=o[l+1>>0]|0,o[s+2>>0]=o[l+2>>0]|0,o[s+3>>0]=o[l+3>>0]|0,s=s+4|0,l=l+4|0;for(;(s|0)<(d|0);)o[s>>0]=o[l>>0]|0,s=s+1|0,l=l+1|0;return m|0}function A7(s){s=s|0;var l=0;return l=o[L+(s&255)>>0]|0,(l|0)<8?l|0:(l=o[L+(s>>8&255)>>0]|0,(l|0)<8?l+8|0:(l=o[L+(s>>16&255)>>0]|0,(l|0)<8?l+16|0:(o[L+(s>>>24)>>0]|0)+24|0))}function f7(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,Q=0,k=0,M=0,O=0,j=0,se=0,We=0,Le=0;if(O=s,k=l,M=k,B=c,se=f,Q=se,!M)return m=(d|0)!=0,Q?m?(n[d>>2]=s|0,n[d+4>>2]=l&0,se=0,d=0,Ce=se,d|0):(se=0,d=0,Ce=se,d|0):(m&&(n[d>>2]=(O>>>0)%(B>>>0),n[d+4>>2]=0),se=0,d=(O>>>0)/(B>>>0)>>>0,Ce=se,d|0);m=(Q|0)==0;do if(B){if(!m){if(m=(P(Q|0)|0)-(P(M|0)|0)|0,m>>>0<=31){j=m+1|0,Q=31-m|0,l=m-31>>31,B=j,s=O>>>(j>>>0)&l|M<>>(j>>>0)&l,m=0,Q=O<>2]=s|0,n[d+4>>2]=k|l&0,se=0,d=0,Ce=se,d|0):(se=0,d=0,Ce=se,d|0)}if(m=B-1|0,m&B|0){Q=(P(B|0)|0)+33-(P(M|0)|0)|0,Le=64-Q|0,j=32-Q|0,k=j>>31,We=Q-32|0,l=We>>31,B=Q,s=j-1>>31&M>>>(We>>>0)|(M<>>(Q>>>0))&l,l=l&M>>>(Q>>>0),m=O<>>(We>>>0))&k|O<>31;break}return d|0&&(n[d>>2]=m&O,n[d+4>>2]=0),(B|0)==1?(We=k|l&0,Le=s|0|0,Ce=We,Le|0):(Le=A7(B|0)|0,We=M>>>(Le>>>0)|0,Le=M<<32-Le|O>>>(Le>>>0)|0,Ce=We,Le|0)}else{if(m)return d|0&&(n[d>>2]=(M>>>0)%(B>>>0),n[d+4>>2]=0),We=0,Le=(M>>>0)/(B>>>0)>>>0,Ce=We,Le|0;if(!O)return d|0&&(n[d>>2]=0,n[d+4>>2]=(M>>>0)%(Q>>>0)),We=0,Le=(M>>>0)/(Q>>>0)>>>0,Ce=We,Le|0;if(m=Q-1|0,!(m&Q))return d|0&&(n[d>>2]=s|0,n[d+4>>2]=m&M|l&0),We=0,Le=M>>>((A7(Q|0)|0)>>>0),Ce=We,Le|0;if(m=(P(Q|0)|0)-(P(M|0)|0)|0,m>>>0<=30){l=m+1|0,Q=31-m|0,B=l,s=M<>>(l>>>0),l=M>>>(l>>>0),m=0,Q=O<>2]=s|0,n[d+4>>2]=k|l&0,We=0,Le=0,Ce=We,Le|0):(We=0,Le=0,Ce=We,Le|0)}while(0);if(!B)M=Q,k=0,Q=0;else{j=c|0|0,O=se|f&0,M=wR(j|0,O|0,-1,-1)|0,c=Ce,k=Q,Q=0;do f=k,k=m>>>31|k<<1,m=Q|m<<1,f=s<<1|f>>>31|0,se=s>>>31|l<<1|0,rD(M|0,c|0,f|0,se|0)|0,Le=Ce,We=Le>>31|((Le|0)<0?-1:0)<<1,Q=We&1,s=rD(f|0,se|0,We&j|0,(((Le|0)<0?-1:0)>>31|((Le|0)<0?-1:0)<<1)&O|0)|0,l=Ce,B=B-1|0;while((B|0)!=0);M=k,k=0}return B=0,d|0&&(n[d>>2]=s,n[d+4>>2]=l),We=(m|0)>>>31|(M|B)<<1|(B<<1|m>>>31)&0|k,Le=(m<<1|0>>>31)&-2|Q,Ce=We,Le|0}function BR(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,f7(s,l,c,f,0)|0}function bp(s){s=s|0;var l=0,c=0;return c=s+15&-16|0,l=n[w>>2]|0,s=l+c|0,(c|0)>0&(s|0)<(l|0)|(s|0)<0?(ie()|0,PA(12),-1):(n[w>>2]=s,(s|0)>($()|0)&&(X()|0)==0?(n[w>>2]=l,PA(12),-1):l|0)}function bI(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;if((l|0)<(s|0)&(s|0)<(l+c|0)){for(f=s,l=l+c|0,s=s+c|0;(c|0)>0;)s=s-1|0,l=l-1|0,c=c-1|0,o[s>>0]=o[l>>0]|0;s=f}else Er(s,l,c)|0;return s|0}function vR(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;return m=C,C=C+16|0,d=m|0,f7(s,l,c,f,d)|0,C=m,Ce=n[d+4>>2]|0,n[d>>2]|0|0}function p7(s){return s=s|0,(s&255)<<24|(s>>8&255)<<16|(s>>16&255)<<8|s>>>24|0}function v3e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,h7[s&1](l|0,c|0,f|0,d|0,m|0)}function D3e(s,l,c){s=s|0,l=l|0,c=y(c),g7[s&1](l|0,y(c))}function S3e(s,l,c){s=s|0,l=l|0,c=+c,d7[s&31](l|0,+c)}function P3e(s,l,c,f){return s=s|0,l=l|0,c=y(c),f=y(f),y(m7[s&0](l|0,y(c),y(f)))}function x3e(s,l){s=s|0,l=l|0,tf[s&127](l|0)}function b3e(s,l,c){s=s|0,l=l|0,c=c|0,rf[s&31](l|0,c|0)}function Q3e(s,l){return s=s|0,l=l|0,Fg[s&31](l|0)|0}function k3e(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0,y7[s&1](l|0,+c,+f,d|0)}function F3e(s,l,c,f){s=s|0,l=l|0,c=+c,f=+f,f_e[s&1](l|0,+c,+f)}function R3e(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,sD[s&7](l|0,c|0,f|0)|0}function T3e(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,+p_e[s&1](l|0,c|0,f|0)}function N3e(s,l){return s=s|0,l=l|0,+C7[s&15](l|0)}function L3e(s,l,c){return s=s|0,l=l|0,c=+c,h_e[s&1](l|0,+c)|0}function O3e(s,l,c){return s=s|0,l=l|0,c=c|0,SR[s&15](l|0,c|0)|0}function M3e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=+f,d=+d,m=m|0,g_e[s&1](l|0,c|0,+f,+d,m|0)}function U3e(s,l,c,f,d,m,B){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0,d_e[s&1](l|0,c|0,f|0,d|0,m|0,B|0)}function _3e(s,l,c){return s=s|0,l=l|0,c=c|0,+E7[s&7](l|0,c|0)}function H3e(s){return s=s|0,oD[s&7]()|0}function q3e(s,l,c,f,d,m){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,I7[s&1](l|0,c|0,f|0,d|0,m|0)|0}function j3e(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=+d,m_e[s&1](l|0,c|0,f|0,+d)}function G3e(s,l,c,f,d,m,B){s=s|0,l=l|0,c=c|0,f=y(f),d=d|0,m=y(m),B=B|0,w7[s&1](l|0,c|0,y(f),d|0,y(m),B|0)}function W3e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,FI[s&15](l|0,c|0,f|0)}function Y3e(s){s=s|0,B7[s&0]()}function K3e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f,v7[s&15](l|0,c|0,+f)}function V3e(s,l,c){return s=s|0,l=+l,c=+c,y_e[s&1](+l,+c)|0}function J3e(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,PR[s&15](l|0,c|0,f|0,d|0)}function z3e(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,F(0)}function X3e(s,l){s=s|0,l=y(l),F(1)}function ma(s,l){s=s|0,l=+l,F(2)}function Z3e(s,l,c){return s=s|0,l=y(l),c=y(c),F(3),$e}function hr(s){s=s|0,F(4)}function QI(s,l){s=s|0,l=l|0,F(5)}function Za(s){return s=s|0,F(6),0}function $3e(s,l,c,f){s=s|0,l=+l,c=+c,f=f|0,F(7)}function e_e(s,l,c){s=s|0,l=+l,c=+c,F(8)}function t_e(s,l,c){return s=s|0,l=l|0,c=c|0,F(9),0}function r_e(s,l,c){return s=s|0,l=l|0,c=c|0,F(10),0}function kg(s){return s=s|0,F(11),0}function n_e(s,l){return s=s|0,l=+l,F(12),0}function kI(s,l){return s=s|0,l=l|0,F(13),0}function i_e(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0,F(14)}function s_e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,F(15)}function DR(s,l){return s=s|0,l=l|0,F(16),0}function o_e(){return F(17),0}function a_e(s,l,c,f,d){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,F(18),0}function l_e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f,F(19)}function c_e(s,l,c,f,d,m){s=s|0,l=l|0,c=y(c),f=f|0,d=y(d),m=m|0,F(20)}function iD(s,l,c){s=s|0,l=l|0,c=c|0,F(21)}function u_e(){F(22)}function ey(s,l,c){s=s|0,l=l|0,c=+c,F(23)}function A_e(s,l){return s=+s,l=+l,F(24),0}function ty(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,F(25)}var h7=[z3e,aOe],g7=[X3e,uo],d7=[ma,EI,II,fF,pF,xl,wI,hF,Gm,Fu,vI,gF,Uv,KA,_v,Wm,Hv,qv,Ym,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma],m7=[Z3e],tf=[hr,Zm,HDe,qDe,jDe,ybe,Cbe,Ebe,LNe,ONe,MNe,VLe,JLe,zLe,dUe,mUe,yUe,ds,Tv,jm,YA,BI,Ove,Mve,kDe,XDe,cSe,PSe,jSe,oPe,BPe,MPe,$Pe,gxe,kxe,Kxe,cbe,Obe,$be,gQe,kQe,KQe,cke,xke,jke,nFe,CFe,Qc,zFe,fRe,kRe,JRe,uTe,kTe,HTe,GTe,aNe,uNe,PNe,_Ne,jNe,oLe,vLe,e9,sMe,LMe,XMe,f4e,T4e,J4e,oUe,cUe,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr,hr],rf=[QI,sF,oF,CI,ku,aF,lF,Ip,cF,uF,AF,Mv,VA,Je,ft,jt,Cr,In,Sr,mF,vve,Kve,Fke,Yke,$Re,lMe,FLe,M5,QI,QI,QI,QI],Fg=[Za,KUe,iF,D,ce,Se,It,Ct,xt,Nr,fi,Ao,Ive,wve,Uve,wFe,hTe,cLe,fMe,Ja,Za,Za,Za,Za,Za,Za,Za,Za,Za,Za,Za,Za],y7=[$3e,_ve],f_e=[e_e,QNe],sD=[t_e,Z5,VUe,XUe,uPe,Hbe,eRe,d4e],p_e=[r_e,Nxe],C7=[kg,Ho,rt,wn,Hve,qve,jve,Gve,Wve,Yve,kg,kg,kg,kg,kg,kg],h_e=[n_e,MTe],SR=[kI,y3e,Bve,NDe,kSe,SPe,HPe,pbe,nQe,aFe,Fv,t4e,kI,kI,kI,kI],g_e=[i_e,pSe],d_e=[s_e,M4e],E7=[DR,ni,Vve,Jve,zve,Xxe,DR,DR],oD=[o_e,Xve,mI,ga,VTe,hNe,KNe,pUe],I7=[a_e,AI],m_e=[l_e,NQe],w7=[c_e,Dve],FI=[iD,T,is,Xr,fo,KSe,rxe,XQe,pke,qm,QOe,_Me,$4e,iD,iD,iD],B7=[u_e],v7=[ey,Nv,Lv,Ov,WA,jv,dF,S,CQe,dRe,TTe,ey,ey,ey,ey,ey],y_e=[A_e,TNe],PR=[ty,Cxe,QFe,NRe,BTe,eNe,ENe,eLe,bLe,yMe,vUe,ty,ty,ty,ty,ty];return{_llvm_bswap_i32:p7,dynCall_idd:V3e,dynCall_i:H3e,_i64Subtract:rD,___udivdi3:BR,dynCall_vif:D3e,setThrew:Eu,dynCall_viii:W3e,_bitshift64Lshr:nD,_bitshift64Shl:u7,dynCall_vi:x3e,dynCall_viiddi:M3e,dynCall_diii:T3e,dynCall_iii:O3e,_memset:$m,_sbrk:bp,_memcpy:Er,__GLOBAL__sub_I_Yoga_cpp:Hm,dynCall_vii:b3e,___uremdi3:vR,dynCall_vid:S3e,stackAlloc:so,_nbind_init:NUe,getTempRet0:Ua,dynCall_di:N3e,dynCall_iid:L3e,setTempRet0:kA,_i64Add:wR,dynCall_fiff:P3e,dynCall_iiii:R3e,_emscripten_get_global_libc:YUe,dynCall_viid:K3e,dynCall_viiid:j3e,dynCall_viififi:G3e,dynCall_ii:Q3e,__GLOBAL__sub_I_Binding_cc:XOe,dynCall_viiii:J3e,dynCall_iiiiii:q3e,stackSave:Bl,dynCall_viiiii:v3e,__GLOBAL__sub_I_nbind_cc:Zve,dynCall_vidd:F3e,_free:eD,runPostSets:B3e,dynCall_viiiiii:U3e,establishStackSpace:qi,_memmove:bI,stackRestore:Cu,_malloc:$v,__GLOBAL__sub_I_common_cc:mLe,dynCall_viddi:k3e,dynCall_dii:_3e,dynCall_v:Y3e}}(Module.asmGlobalArg,Module.asmLibraryArg,buffer),_llvm_bswap_i32=Module._llvm_bswap_i32=asm._llvm_bswap_i32,getTempRet0=Module.getTempRet0=asm.getTempRet0,___udivdi3=Module.___udivdi3=asm.___udivdi3,setThrew=Module.setThrew=asm.setThrew,_bitshift64Lshr=Module._bitshift64Lshr=asm._bitshift64Lshr,_bitshift64Shl=Module._bitshift64Shl=asm._bitshift64Shl,_memset=Module._memset=asm._memset,_sbrk=Module._sbrk=asm._sbrk,_memcpy=Module._memcpy=asm._memcpy,stackAlloc=Module.stackAlloc=asm.stackAlloc,___uremdi3=Module.___uremdi3=asm.___uremdi3,_nbind_init=Module._nbind_init=asm._nbind_init,_i64Subtract=Module._i64Subtract=asm._i64Subtract,setTempRet0=Module.setTempRet0=asm.setTempRet0,_i64Add=Module._i64Add=asm._i64Add,_emscripten_get_global_libc=Module._emscripten_get_global_libc=asm._emscripten_get_global_libc,__GLOBAL__sub_I_Yoga_cpp=Module.__GLOBAL__sub_I_Yoga_cpp=asm.__GLOBAL__sub_I_Yoga_cpp,__GLOBAL__sub_I_Binding_cc=Module.__GLOBAL__sub_I_Binding_cc=asm.__GLOBAL__sub_I_Binding_cc,stackSave=Module.stackSave=asm.stackSave,__GLOBAL__sub_I_nbind_cc=Module.__GLOBAL__sub_I_nbind_cc=asm.__GLOBAL__sub_I_nbind_cc,_free=Module._free=asm._free,runPostSets=Module.runPostSets=asm.runPostSets,establishStackSpace=Module.establishStackSpace=asm.establishStackSpace,_memmove=Module._memmove=asm._memmove,stackRestore=Module.stackRestore=asm.stackRestore,_malloc=Module._malloc=asm._malloc,__GLOBAL__sub_I_common_cc=Module.__GLOBAL__sub_I_common_cc=asm.__GLOBAL__sub_I_common_cc,dynCall_viiiii=Module.dynCall_viiiii=asm.dynCall_viiiii,dynCall_vif=Module.dynCall_vif=asm.dynCall_vif,dynCall_vid=Module.dynCall_vid=asm.dynCall_vid,dynCall_fiff=Module.dynCall_fiff=asm.dynCall_fiff,dynCall_vi=Module.dynCall_vi=asm.dynCall_vi,dynCall_vii=Module.dynCall_vii=asm.dynCall_vii,dynCall_ii=Module.dynCall_ii=asm.dynCall_ii,dynCall_viddi=Module.dynCall_viddi=asm.dynCall_viddi,dynCall_vidd=Module.dynCall_vidd=asm.dynCall_vidd,dynCall_iiii=Module.dynCall_iiii=asm.dynCall_iiii,dynCall_diii=Module.dynCall_diii=asm.dynCall_diii,dynCall_di=Module.dynCall_di=asm.dynCall_di,dynCall_iid=Module.dynCall_iid=asm.dynCall_iid,dynCall_iii=Module.dynCall_iii=asm.dynCall_iii,dynCall_viiddi=Module.dynCall_viiddi=asm.dynCall_viiddi,dynCall_viiiiii=Module.dynCall_viiiiii=asm.dynCall_viiiiii,dynCall_dii=Module.dynCall_dii=asm.dynCall_dii,dynCall_i=Module.dynCall_i=asm.dynCall_i,dynCall_iiiiii=Module.dynCall_iiiiii=asm.dynCall_iiiiii,dynCall_viiid=Module.dynCall_viiid=asm.dynCall_viiid,dynCall_viififi=Module.dynCall_viififi=asm.dynCall_viififi,dynCall_viii=Module.dynCall_viii=asm.dynCall_viii,dynCall_v=Module.dynCall_v=asm.dynCall_v,dynCall_viid=Module.dynCall_viid=asm.dynCall_viid,dynCall_idd=Module.dynCall_idd=asm.dynCall_idd,dynCall_viiii=Module.dynCall_viiii=asm.dynCall_viiii;Runtime.stackAlloc=Module.stackAlloc,Runtime.stackSave=Module.stackSave,Runtime.stackRestore=Module.stackRestore,Runtime.establishStackSpace=Module.establishStackSpace,Runtime.setTempRet0=Module.setTempRet0,Runtime.getTempRet0=Module.getTempRet0,Module.asm=asm;function ExitStatus(t){this.name="ExitStatus",this.message="Program terminated with exit("+t+")",this.status=t}ExitStatus.prototype=new Error,ExitStatus.prototype.constructor=ExitStatus;var initialStackTop,preloadStartTime=null,calledMain=!1;dependenciesFulfilled=function t(){Module.calledRun||run(),Module.calledRun||(dependenciesFulfilled=t)},Module.callMain=Module.callMain=function t(e){e=e||[],ensureInitRuntime();var r=e.length+1;function o(){for(var p=0;p<4-1;p++)a.push(0)}var a=[allocate(intArrayFromString(Module.thisProgram),"i8",ALLOC_NORMAL)];o();for(var n=0;n0||(preRun(),runDependencies>0)||Module.calledRun)return;function e(){Module.calledRun||(Module.calledRun=!0,!ABORT&&(ensureInitRuntime(),preMain(),Module.onRuntimeInitialized&&Module.onRuntimeInitialized(),Module._main&&shouldRunNow&&Module.callMain(t),postRun()))}Module.setStatus?(Module.setStatus("Running..."),setTimeout(function(){setTimeout(function(){Module.setStatus("")},1),e()},1)):e()}Module.run=Module.run=run;function exit(t,e){e&&Module.noExitRuntime||(Module.noExitRuntime||(ABORT=!0,EXITSTATUS=t,STACKTOP=initialStackTop,exitRuntime(),Module.onExit&&Module.onExit(t)),ENVIRONMENT_IS_NODE&&process.exit(t),Module.quit(t,new ExitStatus(t)))}Module.exit=Module.exit=exit;var abortDecorators=[];function abort(t){Module.onAbort&&Module.onAbort(t),t!==void 0?(Module.print(t),Module.printErr(t),t=JSON.stringify(t)):t="",ABORT=!0,EXITSTATUS=1;var e=` +If this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.`,r="abort("+t+") at "+stackTrace()+e;throw abortDecorators&&abortDecorators.forEach(function(o){r=o(r,t)}),r}if(Module.abort=Module.abort=abort,Module.preInit)for(typeof Module.preInit=="function"&&(Module.preInit=[Module.preInit]);Module.preInit.length>0;)Module.preInit.pop()();var shouldRunNow=!0;Module.noInitialRun&&(shouldRunNow=!1),run()})});var cm=U((BYt,rEe)=>{"use strict";var syt=eEe(),oyt=tEe(),x6=!1,b6=null;oyt({},function(t,e){if(!x6){if(x6=!0,t)throw t;b6=e}});if(!x6)throw new Error("Failed to load the yoga module - it needed to be loaded synchronously, but didn't");rEe.exports=syt(b6.bind,b6.lib)});var k6=U((vYt,Q6)=>{"use strict";var nEe=t=>Number.isNaN(t)?!1:t>=4352&&(t<=4447||t===9001||t===9002||11904<=t&&t<=12871&&t!==12351||12880<=t&&t<=19903||19968<=t&&t<=42182||43360<=t&&t<=43388||44032<=t&&t<=55203||63744<=t&&t<=64255||65040<=t&&t<=65049||65072<=t&&t<=65131||65281<=t&&t<=65376||65504<=t&&t<=65510||110592<=t&&t<=110593||127488<=t&&t<=127569||131072<=t&&t<=262141);Q6.exports=nEe;Q6.exports.default=nEe});var sEe=U((DYt,iEe)=>{"use strict";iEe.exports=function(){return/\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g}});var UQ=U((SYt,F6)=>{"use strict";var ayt=SS(),lyt=k6(),cyt=sEe(),oEe=t=>{if(typeof t!="string"||t.length===0||(t=ayt(t),t.length===0))return 0;t=t.replace(cyt()," ");let e=0;for(let r=0;r=127&&o<=159||o>=768&&o<=879||(o>65535&&r++,e+=lyt(o)?2:1)}return e};F6.exports=oEe;F6.exports.default=oEe});var T6=U((PYt,R6)=>{"use strict";var uyt=UQ(),aEe=t=>{let e=0;for(let r of t.split(` +`))e=Math.max(e,uyt(r));return e};R6.exports=aEe;R6.exports.default=aEe});var lEe=U(J2=>{"use strict";var Ayt=J2&&J2.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(J2,"__esModule",{value:!0});var fyt=Ayt(T6()),N6={};J2.default=t=>{if(t.length===0)return{width:0,height:0};if(N6[t])return N6[t];let e=fyt.default(t),r=t.split(` +`).length;return N6[t]={width:e,height:r},{width:e,height:r}}});var cEe=U(z2=>{"use strict";var pyt=z2&&z2.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(z2,"__esModule",{value:!0});var fn=pyt(cm()),hyt=(t,e)=>{"position"in e&&t.setPositionType(e.position==="absolute"?fn.default.POSITION_TYPE_ABSOLUTE:fn.default.POSITION_TYPE_RELATIVE)},gyt=(t,e)=>{"marginLeft"in e&&t.setMargin(fn.default.EDGE_START,e.marginLeft||0),"marginRight"in e&&t.setMargin(fn.default.EDGE_END,e.marginRight||0),"marginTop"in e&&t.setMargin(fn.default.EDGE_TOP,e.marginTop||0),"marginBottom"in e&&t.setMargin(fn.default.EDGE_BOTTOM,e.marginBottom||0)},dyt=(t,e)=>{"paddingLeft"in e&&t.setPadding(fn.default.EDGE_LEFT,e.paddingLeft||0),"paddingRight"in e&&t.setPadding(fn.default.EDGE_RIGHT,e.paddingRight||0),"paddingTop"in e&&t.setPadding(fn.default.EDGE_TOP,e.paddingTop||0),"paddingBottom"in e&&t.setPadding(fn.default.EDGE_BOTTOM,e.paddingBottom||0)},myt=(t,e)=>{var r;"flexGrow"in e&&t.setFlexGrow((r=e.flexGrow)!==null&&r!==void 0?r:0),"flexShrink"in e&&t.setFlexShrink(typeof e.flexShrink=="number"?e.flexShrink:1),"flexDirection"in e&&(e.flexDirection==="row"&&t.setFlexDirection(fn.default.FLEX_DIRECTION_ROW),e.flexDirection==="row-reverse"&&t.setFlexDirection(fn.default.FLEX_DIRECTION_ROW_REVERSE),e.flexDirection==="column"&&t.setFlexDirection(fn.default.FLEX_DIRECTION_COLUMN),e.flexDirection==="column-reverse"&&t.setFlexDirection(fn.default.FLEX_DIRECTION_COLUMN_REVERSE)),"flexBasis"in e&&(typeof e.flexBasis=="number"?t.setFlexBasis(e.flexBasis):typeof e.flexBasis=="string"?t.setFlexBasisPercent(Number.parseInt(e.flexBasis,10)):t.setFlexBasis(NaN)),"alignItems"in e&&((e.alignItems==="stretch"||!e.alignItems)&&t.setAlignItems(fn.default.ALIGN_STRETCH),e.alignItems==="flex-start"&&t.setAlignItems(fn.default.ALIGN_FLEX_START),e.alignItems==="center"&&t.setAlignItems(fn.default.ALIGN_CENTER),e.alignItems==="flex-end"&&t.setAlignItems(fn.default.ALIGN_FLEX_END)),"alignSelf"in e&&((e.alignSelf==="auto"||!e.alignSelf)&&t.setAlignSelf(fn.default.ALIGN_AUTO),e.alignSelf==="flex-start"&&t.setAlignSelf(fn.default.ALIGN_FLEX_START),e.alignSelf==="center"&&t.setAlignSelf(fn.default.ALIGN_CENTER),e.alignSelf==="flex-end"&&t.setAlignSelf(fn.default.ALIGN_FLEX_END)),"justifyContent"in e&&((e.justifyContent==="flex-start"||!e.justifyContent)&&t.setJustifyContent(fn.default.JUSTIFY_FLEX_START),e.justifyContent==="center"&&t.setJustifyContent(fn.default.JUSTIFY_CENTER),e.justifyContent==="flex-end"&&t.setJustifyContent(fn.default.JUSTIFY_FLEX_END),e.justifyContent==="space-between"&&t.setJustifyContent(fn.default.JUSTIFY_SPACE_BETWEEN),e.justifyContent==="space-around"&&t.setJustifyContent(fn.default.JUSTIFY_SPACE_AROUND))},yyt=(t,e)=>{var r,o;"width"in e&&(typeof e.width=="number"?t.setWidth(e.width):typeof e.width=="string"?t.setWidthPercent(Number.parseInt(e.width,10)):t.setWidthAuto()),"height"in e&&(typeof e.height=="number"?t.setHeight(e.height):typeof e.height=="string"?t.setHeightPercent(Number.parseInt(e.height,10)):t.setHeightAuto()),"minWidth"in e&&(typeof e.minWidth=="string"?t.setMinWidthPercent(Number.parseInt(e.minWidth,10)):t.setMinWidth((r=e.minWidth)!==null&&r!==void 0?r:0)),"minHeight"in e&&(typeof e.minHeight=="string"?t.setMinHeightPercent(Number.parseInt(e.minHeight,10)):t.setMinHeight((o=e.minHeight)!==null&&o!==void 0?o:0))},Cyt=(t,e)=>{"display"in e&&t.setDisplay(e.display==="flex"?fn.default.DISPLAY_FLEX:fn.default.DISPLAY_NONE)},Eyt=(t,e)=>{if("borderStyle"in e){let r=typeof e.borderStyle=="string"?1:0;t.setBorder(fn.default.EDGE_TOP,r),t.setBorder(fn.default.EDGE_BOTTOM,r),t.setBorder(fn.default.EDGE_LEFT,r),t.setBorder(fn.default.EDGE_RIGHT,r)}};z2.default=(t,e={})=>{hyt(t,e),gyt(t,e),dyt(t,e),myt(t,e),yyt(t,e),Cyt(t,e),Eyt(t,e)}});var fEe=U((QYt,AEe)=>{"use strict";var X2=UQ(),Iyt=SS(),wyt=gw(),O6=new Set(["\x1B","\x9B"]),Byt=39,uEe=t=>`${O6.values().next().value}[${t}m`,vyt=t=>t.split(" ").map(e=>X2(e)),L6=(t,e,r)=>{let o=[...e],a=!1,n=X2(Iyt(t[t.length-1]));for(let[u,A]of o.entries()){let p=X2(A);if(n+p<=r?t[t.length-1]+=A:(t.push(A),n=0),O6.has(A))a=!0;else if(a&&A==="m"){a=!1;continue}a||(n+=p,n===r&&u0&&t.length>1&&(t[t.length-2]+=t.pop())},Dyt=t=>{let e=t.split(" "),r=e.length;for(;r>0&&!(X2(e[r-1])>0);)r--;return r===e.length?t:e.slice(0,r).join(" ")+e.slice(r).join("")},Syt=(t,e,r={})=>{if(r.trim!==!1&&t.trim()==="")return"";let o="",a="",n,u=vyt(t),A=[""];for(let[p,h]of t.split(" ").entries()){r.trim!==!1&&(A[A.length-1]=A[A.length-1].trimLeft());let E=X2(A[A.length-1]);if(p!==0&&(E>=e&&(r.wordWrap===!1||r.trim===!1)&&(A.push(""),E=0),(E>0||r.trim===!1)&&(A[A.length-1]+=" ",E++)),r.hard&&u[p]>e){let w=e-E,v=1+Math.floor((u[p]-w-1)/e);Math.floor((u[p]-1)/e)e&&E>0&&u[p]>0){if(r.wordWrap===!1&&Ee&&r.wordWrap===!1){L6(A,h,e);continue}A[A.length-1]+=h}r.trim!==!1&&(A=A.map(Dyt)),o=A.join(` +`);for(let[p,h]of[...o].entries()){if(a+=h,O6.has(h)){let w=parseFloat(/\d[^m]*/.exec(o.slice(p,p+4)));n=w===Byt?null:w}let E=wyt.codes.get(Number(n));n&&E&&(o[p+1]===` +`?a+=uEe(E):h===` +`&&(a+=uEe(n)))}return a};AEe.exports=(t,e,r)=>String(t).normalize().replace(/\r\n/g,` +`).split(` +`).map(o=>Syt(o,e,r)).join(` +`)});var gEe=U((kYt,hEe)=>{"use strict";var pEe="[\uD800-\uDBFF][\uDC00-\uDFFF]",Pyt=t=>t&&t.exact?new RegExp(`^${pEe}$`):new RegExp(pEe,"g");hEe.exports=Pyt});var M6=U((FYt,CEe)=>{"use strict";var xyt=k6(),byt=gEe(),dEe=gw(),yEe=["\x1B","\x9B"],_Q=t=>`${yEe[0]}[${t}m`,mEe=(t,e,r)=>{let o=[];t=[...t];for(let a of t){let n=a;a.match(";")&&(a=a.split(";")[0][0]+"0");let u=dEe.codes.get(parseInt(a,10));if(u){let A=t.indexOf(u.toString());A>=0?t.splice(A,1):o.push(_Q(e?u:n))}else if(e){o.push(_Q(0));break}else o.push(_Q(n))}if(e&&(o=o.filter((a,n)=>o.indexOf(a)===n),r!==void 0)){let a=_Q(dEe.codes.get(parseInt(r,10)));o=o.reduce((n,u)=>u===a?[u,...n]:[...n,u],[])}return o.join("")};CEe.exports=(t,e,r)=>{let o=[...t.normalize()],a=[];r=typeof r=="number"?r:o.length;let n=!1,u,A=0,p="";for(let[h,E]of o.entries()){let w=!1;if(yEe.includes(E)){let v=/\d[^m]*/.exec(t.slice(h,h+18));u=v&&v.length>0?v[0]:void 0,Ae&&A<=r)p+=E;else if(A===e&&!n&&u!==void 0)p=mEe(a);else if(A>=r){p+=mEe(a,!0,u);break}}return p}});var IEe=U((RYt,EEe)=>{"use strict";var dh=M6(),Qyt=UQ();function HQ(t,e,r){if(t.charAt(e)===" ")return e;for(let o=1;o<=3;o++)if(r){if(t.charAt(e+o)===" ")return e+o}else if(t.charAt(e-o)===" ")return e-o;return e}EEe.exports=(t,e,r)=>{r={position:"end",preferTruncationOnSpace:!1,...r};let{position:o,space:a,preferTruncationOnSpace:n}=r,u="\u2026",A=1;if(typeof t!="string")throw new TypeError(`Expected \`input\` to be a string, got ${typeof t}`);if(typeof e!="number")throw new TypeError(`Expected \`columns\` to be a number, got ${typeof e}`);if(e<1)return"";if(e===1)return u;let p=Qyt(t);if(p<=e)return t;if(o==="start"){if(n){let h=HQ(t,p-e+1,!0);return u+dh(t,h,p).trim()}return a===!0&&(u+=" ",A=2),u+dh(t,p-e+A,p)}if(o==="middle"){a===!0&&(u=" "+u+" ",A=3);let h=Math.floor(e/2);if(n){let E=HQ(t,h),w=HQ(t,p-(e-h)+1,!0);return dh(t,0,E)+u+dh(t,w,p).trim()}return dh(t,0,h)+u+dh(t,p-(e-h)+A,p)}if(o==="end"){if(n){let h=HQ(t,e-1);return dh(t,0,h)+u}return a===!0&&(u=" "+u,A=2),dh(t,0,e-A)+u}throw new Error(`Expected \`options.position\` to be either \`start\`, \`middle\` or \`end\`, got ${o}`)}});var _6=U(Z2=>{"use strict";var wEe=Z2&&Z2.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Z2,"__esModule",{value:!0});var kyt=wEe(fEe()),Fyt=wEe(IEe()),U6={};Z2.default=(t,e,r)=>{let o=t+String(e)+String(r);if(U6[o])return U6[o];let a=t;if(r==="wrap"&&(a=kyt.default(t,e,{trim:!1,hard:!0})),r.startsWith("truncate")){let n="end";r==="truncate-middle"&&(n="middle"),r==="truncate-start"&&(n="start"),a=Fyt.default(t,e,{position:n})}return U6[o]=a,a}});var q6=U(H6=>{"use strict";Object.defineProperty(H6,"__esModule",{value:!0});var BEe=t=>{let e="";if(t.childNodes.length>0)for(let r of t.childNodes){let o="";r.nodeName==="#text"?o=r.nodeValue:((r.nodeName==="ink-text"||r.nodeName==="ink-virtual-text")&&(o=BEe(r)),o.length>0&&typeof r.internal_transform=="function"&&(o=r.internal_transform(o))),e+=o}return e};H6.default=BEe});var j6=U(ci=>{"use strict";var $2=ci&&ci.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(ci,"__esModule",{value:!0});ci.setTextNodeValue=ci.createTextNode=ci.setStyle=ci.setAttribute=ci.removeChildNode=ci.insertBeforeNode=ci.appendChildNode=ci.createNode=ci.TEXT_NAME=void 0;var Ryt=$2(cm()),vEe=$2(lEe()),Tyt=$2(cEe()),Nyt=$2(_6()),Lyt=$2(q6());ci.TEXT_NAME="#text";ci.createNode=t=>{var e;let r={nodeName:t,style:{},attributes:{},childNodes:[],parentNode:null,yogaNode:t==="ink-virtual-text"?void 0:Ryt.default.Node.create()};return t==="ink-text"&&((e=r.yogaNode)===null||e===void 0||e.setMeasureFunc(Oyt.bind(null,r))),r};ci.appendChildNode=(t,e)=>{var r;e.parentNode&&ci.removeChildNode(e.parentNode,e),e.parentNode=t,t.childNodes.push(e),e.yogaNode&&((r=t.yogaNode)===null||r===void 0||r.insertChild(e.yogaNode,t.yogaNode.getChildCount())),(t.nodeName==="ink-text"||t.nodeName==="ink-virtual-text")&&qQ(t)};ci.insertBeforeNode=(t,e,r)=>{var o,a;e.parentNode&&ci.removeChildNode(e.parentNode,e),e.parentNode=t;let n=t.childNodes.indexOf(r);if(n>=0){t.childNodes.splice(n,0,e),e.yogaNode&&((o=t.yogaNode)===null||o===void 0||o.insertChild(e.yogaNode,n));return}t.childNodes.push(e),e.yogaNode&&((a=t.yogaNode)===null||a===void 0||a.insertChild(e.yogaNode,t.yogaNode.getChildCount())),(t.nodeName==="ink-text"||t.nodeName==="ink-virtual-text")&&qQ(t)};ci.removeChildNode=(t,e)=>{var r,o;e.yogaNode&&((o=(r=e.parentNode)===null||r===void 0?void 0:r.yogaNode)===null||o===void 0||o.removeChild(e.yogaNode)),e.parentNode=null;let a=t.childNodes.indexOf(e);a>=0&&t.childNodes.splice(a,1),(t.nodeName==="ink-text"||t.nodeName==="ink-virtual-text")&&qQ(t)};ci.setAttribute=(t,e,r)=>{t.attributes[e]=r};ci.setStyle=(t,e)=>{t.style=e,t.yogaNode&&Tyt.default(t.yogaNode,e)};ci.createTextNode=t=>{let e={nodeName:"#text",nodeValue:t,yogaNode:void 0,parentNode:null,style:{}};return ci.setTextNodeValue(e,t),e};var Oyt=function(t,e){var r,o;let a=t.nodeName==="#text"?t.nodeValue:Lyt.default(t),n=vEe.default(a);if(n.width<=e||n.width>=1&&e>0&&e<1)return n;let u=(o=(r=t.style)===null||r===void 0?void 0:r.textWrap)!==null&&o!==void 0?o:"wrap",A=Nyt.default(a,e,u);return vEe.default(A)},DEe=t=>{var e;if(!(!t||!t.parentNode))return(e=t.yogaNode)!==null&&e!==void 0?e:DEe(t.parentNode)},qQ=t=>{let e=DEe(t);e==null||e.markDirty()};ci.setTextNodeValue=(t,e)=>{typeof e!="string"&&(e=String(e)),t.nodeValue=e,qQ(t)}});var QEe=U(eB=>{"use strict";var bEe=eB&&eB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(eB,"__esModule",{value:!0});var SEe=D6(),Myt=bEe(VCe()),PEe=bEe(cm()),To=j6(),xEe=t=>{t==null||t.unsetMeasureFunc(),t==null||t.freeRecursive()};eB.default=Myt.default({schedulePassiveEffects:SEe.unstable_scheduleCallback,cancelPassiveEffects:SEe.unstable_cancelCallback,now:Date.now,getRootHostContext:()=>({isInsideText:!1}),prepareForCommit:()=>{},resetAfterCommit:t=>{if(t.isStaticDirty){t.isStaticDirty=!1,typeof t.onImmediateRender=="function"&&t.onImmediateRender();return}typeof t.onRender=="function"&&t.onRender()},getChildHostContext:(t,e)=>{let r=t.isInsideText,o=e==="ink-text"||e==="ink-virtual-text";return r===o?t:{isInsideText:o}},shouldSetTextContent:()=>!1,createInstance:(t,e,r,o)=>{if(o.isInsideText&&t==="ink-box")throw new Error(" can\u2019t be nested inside component");let a=t==="ink-text"&&o.isInsideText?"ink-virtual-text":t,n=To.createNode(a);for(let[u,A]of Object.entries(e))u!=="children"&&(u==="style"?To.setStyle(n,A):u==="internal_transform"?n.internal_transform=A:u==="internal_static"?n.internal_static=!0:To.setAttribute(n,u,A));return n},createTextInstance:(t,e,r)=>{if(!r.isInsideText)throw new Error(`Text string "${t}" must be rendered inside component`);return To.createTextNode(t)},resetTextContent:()=>{},hideTextInstance:t=>{To.setTextNodeValue(t,"")},unhideTextInstance:(t,e)=>{To.setTextNodeValue(t,e)},getPublicInstance:t=>t,hideInstance:t=>{var e;(e=t.yogaNode)===null||e===void 0||e.setDisplay(PEe.default.DISPLAY_NONE)},unhideInstance:t=>{var e;(e=t.yogaNode)===null||e===void 0||e.setDisplay(PEe.default.DISPLAY_FLEX)},appendInitialChild:To.appendChildNode,appendChild:To.appendChildNode,insertBefore:To.insertBeforeNode,finalizeInitialChildren:(t,e,r,o)=>(t.internal_static&&(o.isStaticDirty=!0,o.staticNode=t),!1),supportsMutation:!0,appendChildToContainer:To.appendChildNode,insertInContainerBefore:To.insertBeforeNode,removeChildFromContainer:(t,e)=>{To.removeChildNode(t,e),xEe(e.yogaNode)},prepareUpdate:(t,e,r,o,a)=>{t.internal_static&&(a.isStaticDirty=!0);let n={},u=Object.keys(o);for(let A of u)if(o[A]!==r[A]){if(A==="style"&&typeof o.style=="object"&&typeof r.style=="object"){let h=o.style,E=r.style,w=Object.keys(h);for(let v of w){if(v==="borderStyle"||v==="borderColor"){if(typeof n.style!="object"){let b={};n.style=b}n.style.borderStyle=h.borderStyle,n.style.borderColor=h.borderColor}if(h[v]!==E[v]){if(typeof n.style!="object"){let b={};n.style=b}n.style[v]=h[v]}}continue}n[A]=o[A]}return n},commitUpdate:(t,e)=>{for(let[r,o]of Object.entries(e))r!=="children"&&(r==="style"?To.setStyle(t,o):r==="internal_transform"?t.internal_transform=o:r==="internal_static"?t.internal_static=!0:To.setAttribute(t,r,o))},commitTextUpdate:(t,e,r)=>{To.setTextNodeValue(t,r)},removeChild:(t,e)=>{To.removeChildNode(t,e),xEe(e.yogaNode)}})});var FEe=U((MYt,kEe)=>{"use strict";kEe.exports=(t,e=1,r)=>{if(r={indent:" ",includeEmptyLines:!1,...r},typeof t!="string")throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof t}\``);if(typeof e!="number")throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof e}\``);if(typeof r.indent!="string")throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof r.indent}\``);if(e===0)return t;let o=r.includeEmptyLines?/^/gm:/^(?!\s*$)/gm;return t.replace(o,r.indent.repeat(e))}});var REe=U(tB=>{"use strict";var Uyt=tB&&tB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(tB,"__esModule",{value:!0});var jQ=Uyt(cm());tB.default=t=>t.getComputedWidth()-t.getComputedPadding(jQ.default.EDGE_LEFT)-t.getComputedPadding(jQ.default.EDGE_RIGHT)-t.getComputedBorder(jQ.default.EDGE_LEFT)-t.getComputedBorder(jQ.default.EDGE_RIGHT)});var TEe=U((_Yt,_yt)=>{_yt.exports={single:{topLeft:"\u250C",topRight:"\u2510",bottomRight:"\u2518",bottomLeft:"\u2514",vertical:"\u2502",horizontal:"\u2500"},double:{topLeft:"\u2554",topRight:"\u2557",bottomRight:"\u255D",bottomLeft:"\u255A",vertical:"\u2551",horizontal:"\u2550"},round:{topLeft:"\u256D",topRight:"\u256E",bottomRight:"\u256F",bottomLeft:"\u2570",vertical:"\u2502",horizontal:"\u2500"},bold:{topLeft:"\u250F",topRight:"\u2513",bottomRight:"\u251B",bottomLeft:"\u2517",vertical:"\u2503",horizontal:"\u2501"},singleDouble:{topLeft:"\u2553",topRight:"\u2556",bottomRight:"\u255C",bottomLeft:"\u2559",vertical:"\u2551",horizontal:"\u2500"},doubleSingle:{topLeft:"\u2552",topRight:"\u2555",bottomRight:"\u255B",bottomLeft:"\u2558",vertical:"\u2502",horizontal:"\u2550"},classic:{topLeft:"+",topRight:"+",bottomRight:"+",bottomLeft:"+",vertical:"|",horizontal:"-"}}});var LEe=U((HYt,G6)=>{"use strict";var NEe=TEe();G6.exports=NEe;G6.exports.default=NEe});var MEe=U((qYt,OEe)=>{"use strict";var Hyt=(t,e,r)=>{let o=t.indexOf(e);if(o===-1)return t;let a=e.length,n=0,u="";do u+=t.substr(n,o-n)+e+r,n=o+a,o=t.indexOf(e,n);while(o!==-1);return u+=t.substr(n),u},qyt=(t,e,r,o)=>{let a=0,n="";do{let u=t[o-1]==="\r";n+=t.substr(a,(u?o-1:o)-a)+e+(u?`\r +`:` +`)+r,a=o+1,o=t.indexOf(` +`,a)}while(o!==-1);return n+=t.substr(a),n};OEe.exports={stringReplaceAll:Hyt,stringEncaseCRLFWithFirstIndex:qyt}});var jEe=U((jYt,qEe)=>{"use strict";var jyt=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,UEe=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,Gyt=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,Wyt=/\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi,Yyt=new Map([["n",` +`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e","\x1B"],["a","\x07"]]);function HEe(t){let e=t[0]==="u",r=t[1]==="{";return e&&!r&&t.length===5||t[0]==="x"&&t.length===3?String.fromCharCode(parseInt(t.slice(1),16)):e&&r?String.fromCodePoint(parseInt(t.slice(2,-1),16)):Yyt.get(t)||t}function Kyt(t,e){let r=[],o=e.trim().split(/\s*,\s*/g),a;for(let n of o){let u=Number(n);if(!Number.isNaN(u))r.push(u);else if(a=n.match(Gyt))r.push(a[2].replace(Wyt,(A,p,h)=>p?HEe(p):h));else throw new Error(`Invalid Chalk template style argument: ${n} (in style '${t}')`)}return r}function Vyt(t){UEe.lastIndex=0;let e=[],r;for(;(r=UEe.exec(t))!==null;){let o=r[1];if(r[2]){let a=Kyt(o,r[2]);e.push([o].concat(a))}else e.push([o])}return e}function _Ee(t,e){let r={};for(let a of e)for(let n of a.styles)r[n[0]]=a.inverse?null:n.slice(1);let o=t;for(let[a,n]of Object.entries(r))if(!!Array.isArray(n)){if(!(a in o))throw new Error(`Unknown Chalk style: ${a}`);o=n.length>0?o[a](...n):o[a]}return o}qEe.exports=(t,e)=>{let r=[],o=[],a=[];if(e.replace(jyt,(n,u,A,p,h,E)=>{if(u)a.push(HEe(u));else if(p){let w=a.join("");a=[],o.push(r.length===0?w:_Ee(t,r)(w)),r.push({inverse:A,styles:Vyt(p)})}else if(h){if(r.length===0)throw new Error("Found extraneous } in Chalk template literal");o.push(_Ee(t,r)(a.join(""))),a=[],r.pop()}else a.push(E)}),o.push(a.join("")),r.length>0){let n=`Chalk template literal is missing ${r.length} closing bracket${r.length===1?"":"s"} (\`}\`)`;throw new Error(n)}return o.join("")}});var VQ=U((GYt,JEe)=>{"use strict";var rB=gw(),{stdout:Y6,stderr:K6}=uN(),{stringReplaceAll:Jyt,stringEncaseCRLFWithFirstIndex:zyt}=MEe(),{isArray:GQ}=Array,WEe=["ansi","ansi","ansi256","ansi16m"],NE=Object.create(null),Xyt=(t,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let r=Y6?Y6.level:0;t.level=e.level===void 0?r:e.level},V6=class{constructor(e){return YEe(e)}},YEe=t=>{let e={};return Xyt(e,t),e.template=(...r)=>VEe(e.template,...r),Object.setPrototypeOf(e,WQ.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=V6,e.template};function WQ(t){return YEe(t)}for(let[t,e]of Object.entries(rB))NE[t]={get(){let r=YQ(this,J6(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,t,{value:r}),r}};NE.visible={get(){let t=YQ(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:t}),t}};var KEe=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let t of KEe)NE[t]={get(){let{level:e}=this;return function(...r){let o=J6(rB.color[WEe[e]][t](...r),rB.color.close,this._styler);return YQ(this,o,this._isEmpty)}}};for(let t of KEe){let e="bg"+t[0].toUpperCase()+t.slice(1);NE[e]={get(){let{level:r}=this;return function(...o){let a=J6(rB.bgColor[WEe[r]][t](...o),rB.bgColor.close,this._styler);return YQ(this,a,this._isEmpty)}}}}var Zyt=Object.defineProperties(()=>{},{...NE,level:{enumerable:!0,get(){return this._generator.level},set(t){this._generator.level=t}}}),J6=(t,e,r)=>{let o,a;return r===void 0?(o=t,a=e):(o=r.openAll+t,a=e+r.closeAll),{open:t,close:e,openAll:o,closeAll:a,parent:r}},YQ=(t,e,r)=>{let o=(...a)=>GQ(a[0])&&GQ(a[0].raw)?GEe(o,VEe(o,...a)):GEe(o,a.length===1?""+a[0]:a.join(" "));return Object.setPrototypeOf(o,Zyt),o._generator=t,o._styler=e,o._isEmpty=r,o},GEe=(t,e)=>{if(t.level<=0||!e)return t._isEmpty?"":e;let r=t._styler;if(r===void 0)return e;let{openAll:o,closeAll:a}=r;if(e.indexOf("\x1B")!==-1)for(;r!==void 0;)e=Jyt(e,r.close,r.open),r=r.parent;let n=e.indexOf(` +`);return n!==-1&&(e=zyt(e,a,o,n)),o+e+a},W6,VEe=(t,...e)=>{let[r]=e;if(!GQ(r)||!GQ(r.raw))return e.join(" ");let o=e.slice(1),a=[r.raw[0]];for(let n=1;n{"use strict";var $yt=iB&&iB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(iB,"__esModule",{value:!0});var nB=$yt(VQ()),eCt=/^(rgb|hsl|hsv|hwb)\(\s?(\d+),\s?(\d+),\s?(\d+)\s?\)$/,tCt=/^(ansi|ansi256)\(\s?(\d+)\s?\)$/,JQ=(t,e)=>e==="foreground"?t:"bg"+t[0].toUpperCase()+t.slice(1);iB.default=(t,e,r)=>{if(!e)return t;if(e in nB.default){let a=JQ(e,r);return nB.default[a](t)}if(e.startsWith("#")){let a=JQ("hex",r);return nB.default[a](e)(t)}if(e.startsWith("ansi")){let a=tCt.exec(e);if(!a)return t;let n=JQ(a[1],r),u=Number(a[2]);return nB.default[n](u)(t)}if(e.startsWith("rgb")||e.startsWith("hsl")||e.startsWith("hsv")||e.startsWith("hwb")){let a=eCt.exec(e);if(!a)return t;let n=JQ(a[1],r),u=Number(a[2]),A=Number(a[3]),p=Number(a[4]);return nB.default[n](u,A,p)(t)}return t}});var XEe=U(sB=>{"use strict";var zEe=sB&&sB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(sB,"__esModule",{value:!0});var rCt=zEe(LEe()),X6=zEe(z6());sB.default=(t,e,r,o)=>{if(typeof r.style.borderStyle=="string"){let a=r.yogaNode.getComputedWidth(),n=r.yogaNode.getComputedHeight(),u=r.style.borderColor,A=rCt.default[r.style.borderStyle],p=X6.default(A.topLeft+A.horizontal.repeat(a-2)+A.topRight,u,"foreground"),h=(X6.default(A.vertical,u,"foreground")+` +`).repeat(n-2),E=X6.default(A.bottomLeft+A.horizontal.repeat(a-2)+A.bottomRight,u,"foreground");o.write(t,e,p,{transformers:[]}),o.write(t,e+1,h,{transformers:[]}),o.write(t+a-1,e+1,h,{transformers:[]}),o.write(t,e+n-1,E,{transformers:[]})}}});var $Ee=U(oB=>{"use strict";var um=oB&&oB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(oB,"__esModule",{value:!0});var nCt=um(cm()),iCt=um(T6()),sCt=um(FEe()),oCt=um(_6()),aCt=um(REe()),lCt=um(q6()),cCt=um(XEe()),uCt=(t,e)=>{var r;let o=(r=t.childNodes[0])===null||r===void 0?void 0:r.yogaNode;if(o){let a=o.getComputedLeft(),n=o.getComputedTop();e=` +`.repeat(n)+sCt.default(e,a)}return e},ZEe=(t,e,r)=>{var o;let{offsetX:a=0,offsetY:n=0,transformers:u=[],skipStaticElements:A}=r;if(A&&t.internal_static)return;let{yogaNode:p}=t;if(p){if(p.getDisplay()===nCt.default.DISPLAY_NONE)return;let h=a+p.getComputedLeft(),E=n+p.getComputedTop(),w=u;if(typeof t.internal_transform=="function"&&(w=[t.internal_transform,...u]),t.nodeName==="ink-text"){let v=lCt.default(t);if(v.length>0){let b=iCt.default(v),C=aCt.default(p);if(b>C){let R=(o=t.style.textWrap)!==null&&o!==void 0?o:"wrap";v=oCt.default(v,C,R)}v=uCt(t,v),e.write(h,E,v,{transformers:w})}return}if(t.nodeName==="ink-box"&&cCt.default(h,E,t,e),t.nodeName==="ink-root"||t.nodeName==="ink-box")for(let v of t.childNodes)ZEe(v,e,{offsetX:h,offsetY:E,transformers:w,skipStaticElements:A})}};oB.default=ZEe});var tIe=U((VYt,eIe)=>{"use strict";eIe.exports=t=>{t=Object.assign({onlyFirst:!1},t);let e=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(e,t.onlyFirst?void 0:"g")}});var nIe=U((JYt,Z6)=>{"use strict";var ACt=tIe(),rIe=t=>typeof t=="string"?t.replace(ACt(),""):t;Z6.exports=rIe;Z6.exports.default=rIe});var oIe=U((zYt,sIe)=>{"use strict";var iIe="[\uD800-\uDBFF][\uDC00-\uDFFF]";sIe.exports=t=>t&&t.exact?new RegExp(`^${iIe}$`):new RegExp(iIe,"g")});var lIe=U((XYt,$6)=>{"use strict";var fCt=nIe(),pCt=oIe(),aIe=t=>fCt(t).replace(pCt()," ").length;$6.exports=aIe;$6.exports.default=aIe});var AIe=U(aB=>{"use strict";var uIe=aB&&aB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(aB,"__esModule",{value:!0});var cIe=uIe(M6()),hCt=uIe(lIe()),eq=class{constructor(e){this.writes=[];let{width:r,height:o}=e;this.width=r,this.height=o}write(e,r,o,a){let{transformers:n}=a;!o||this.writes.push({x:e,y:r,text:o,transformers:n})}get(){let e=[];for(let o=0;oo.trimRight()).join(` +`),height:e.length}}};aB.default=eq});var hIe=U(lB=>{"use strict";var tq=lB&&lB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(lB,"__esModule",{value:!0});var gCt=tq(cm()),fIe=tq($Ee()),pIe=tq(AIe());lB.default=(t,e)=>{var r;if(t.yogaNode.setWidth(e),t.yogaNode){t.yogaNode.calculateLayout(void 0,void 0,gCt.default.DIRECTION_LTR);let o=new pIe.default({width:t.yogaNode.getComputedWidth(),height:t.yogaNode.getComputedHeight()});fIe.default(t,o,{skipStaticElements:!0});let a;!((r=t.staticNode)===null||r===void 0)&&r.yogaNode&&(a=new pIe.default({width:t.staticNode.yogaNode.getComputedWidth(),height:t.staticNode.yogaNode.getComputedHeight()}),fIe.default(t.staticNode,a,{skipStaticElements:!1}));let{output:n,height:u}=o.get();return{output:n,outputHeight:u,staticOutput:a?`${a.get().output} +`:""}}return{output:"",outputHeight:0,staticOutput:""}}});var yIe=U((eKt,mIe)=>{"use strict";var gIe=Ie("stream"),dIe=["assert","count","countReset","debug","dir","dirxml","error","group","groupCollapsed","groupEnd","info","log","table","time","timeEnd","timeLog","trace","warn"],rq={},dCt=t=>{let e=new gIe.PassThrough,r=new gIe.PassThrough;e.write=a=>t("stdout",a),r.write=a=>t("stderr",a);let o=new console.Console(e,r);for(let a of dIe)rq[a]=console[a],console[a]=o[a];return()=>{for(let a of dIe)console[a]=rq[a];rq={}}};mIe.exports=dCt});var iq=U(nq=>{"use strict";Object.defineProperty(nq,"__esModule",{value:!0});nq.default=new WeakMap});var oq=U(sq=>{"use strict";Object.defineProperty(sq,"__esModule",{value:!0});var mCt=en(),CIe=mCt.createContext({exit:()=>{}});CIe.displayName="InternalAppContext";sq.default=CIe});var lq=U(aq=>{"use strict";Object.defineProperty(aq,"__esModule",{value:!0});var yCt=en(),EIe=yCt.createContext({stdin:void 0,setRawMode:()=>{},isRawModeSupported:!1,internal_exitOnCtrlC:!0});EIe.displayName="InternalStdinContext";aq.default=EIe});var uq=U(cq=>{"use strict";Object.defineProperty(cq,"__esModule",{value:!0});var CCt=en(),IIe=CCt.createContext({stdout:void 0,write:()=>{}});IIe.displayName="InternalStdoutContext";cq.default=IIe});var fq=U(Aq=>{"use strict";Object.defineProperty(Aq,"__esModule",{value:!0});var ECt=en(),wIe=ECt.createContext({stderr:void 0,write:()=>{}});wIe.displayName="InternalStderrContext";Aq.default=wIe});var zQ=U(pq=>{"use strict";Object.defineProperty(pq,"__esModule",{value:!0});var ICt=en(),BIe=ICt.createContext({activeId:void 0,add:()=>{},remove:()=>{},activate:()=>{},deactivate:()=>{},enableFocus:()=>{},disableFocus:()=>{},focusNext:()=>{},focusPrevious:()=>{}});BIe.displayName="InternalFocusContext";pq.default=BIe});var DIe=U((aKt,vIe)=>{"use strict";var wCt=/[|\\{}()[\]^$+*?.-]/g;vIe.exports=t=>{if(typeof t!="string")throw new TypeError("Expected a string");return t.replace(wCt,"\\$&")}});var bIe=U((lKt,xIe)=>{"use strict";var BCt=DIe(),vCt=typeof process=="object"&&process&&typeof process.cwd=="function"?process.cwd():".",PIe=[].concat(Ie("module").builtinModules,"bootstrap_node","node").map(t=>new RegExp(`(?:\\((?:node:)?${t}(?:\\.js)?:\\d+:\\d+\\)$|^\\s*at (?:node:)?${t}(?:\\.js)?:\\d+:\\d+$)`));PIe.push(/\((?:node:)?internal\/[^:]+:\d+:\d+\)$/,/\s*at (?:node:)?internal\/[^:]+:\d+:\d+$/,/\/\.node-spawn-wrap-\w+-\w+\/node:\d+:\d+\)?$/);var cB=class{constructor(e){e={ignoredPackages:[],...e},"internals"in e||(e.internals=cB.nodeInternals()),"cwd"in e||(e.cwd=vCt),this._cwd=e.cwd.replace(/\\/g,"/"),this._internals=[].concat(e.internals,DCt(e.ignoredPackages)),this._wrapCallSite=e.wrapCallSite||!1}static nodeInternals(){return[...PIe]}clean(e,r=0){r=" ".repeat(r),Array.isArray(e)||(e=e.split(` +`)),!/^\s*at /.test(e[0])&&/^\s*at /.test(e[1])&&(e=e.slice(1));let o=!1,a=null,n=[];return e.forEach(u=>{if(u=u.replace(/\\/g,"/"),this._internals.some(p=>p.test(u)))return;let A=/^\s*at /.test(u);o?u=u.trimEnd().replace(/^(\s+)at /,"$1"):(u=u.trim(),A&&(u=u.slice(3))),u=u.replace(`${this._cwd}/`,""),u&&(A?(a&&(n.push(a),a=null),n.push(u)):(o=!0,a=u))}),n.map(u=>`${r}${u} +`).join("")}captureString(e,r=this.captureString){typeof e=="function"&&(r=e,e=1/0);let{stackTraceLimit:o}=Error;e&&(Error.stackTraceLimit=e);let a={};Error.captureStackTrace(a,r);let{stack:n}=a;return Error.stackTraceLimit=o,this.clean(n)}capture(e,r=this.capture){typeof e=="function"&&(r=e,e=1/0);let{prepareStackTrace:o,stackTraceLimit:a}=Error;Error.prepareStackTrace=(A,p)=>this._wrapCallSite?p.map(this._wrapCallSite):p,e&&(Error.stackTraceLimit=e);let n={};Error.captureStackTrace(n,r);let{stack:u}=n;return Object.assign(Error,{prepareStackTrace:o,stackTraceLimit:a}),u}at(e=this.at){let[r]=this.capture(1,e);if(!r)return{};let o={line:r.getLineNumber(),column:r.getColumnNumber()};SIe(o,r.getFileName(),this._cwd),r.isConstructor()&&(o.constructor=!0),r.isEval()&&(o.evalOrigin=r.getEvalOrigin()),r.isNative()&&(o.native=!0);let a;try{a=r.getTypeName()}catch{}a&&a!=="Object"&&a!=="[object Object]"&&(o.type=a);let n=r.getFunctionName();n&&(o.function=n);let u=r.getMethodName();return u&&n!==u&&(o.method=u),o}parseLine(e){let r=e&&e.match(SCt);if(!r)return null;let o=r[1]==="new",a=r[2],n=r[3],u=r[4],A=Number(r[5]),p=Number(r[6]),h=r[7],E=r[8],w=r[9],v=r[10]==="native",b=r[11]===")",C,R={};if(E&&(R.line=Number(E)),w&&(R.column=Number(w)),b&&h){let L=0;for(let _=h.length-1;_>0;_--)if(h.charAt(_)===")")L++;else if(h.charAt(_)==="("&&h.charAt(_-1)===" "&&(L--,L===-1&&h.charAt(_-1)===" ")){let V=h.slice(0,_-1);h=h.slice(_+1),a+=` (${V}`;break}}if(a){let L=a.match(PCt);L&&(a=L[1],C=L[2])}return SIe(R,h,this._cwd),o&&(R.constructor=!0),n&&(R.evalOrigin=n,R.evalLine=A,R.evalColumn=p,R.evalFile=u&&u.replace(/\\/g,"/")),v&&(R.native=!0),a&&(R.function=a),C&&a!==C&&(R.method=C),R}};function SIe(t,e,r){e&&(e=e.replace(/\\/g,"/"),e.startsWith(`${r}/`)&&(e=e.slice(r.length+1)),t.file=e)}function DCt(t){if(t.length===0)return[];let e=t.map(r=>BCt(r));return new RegExp(`[/\\\\]node_modules[/\\\\](?:${e.join("|")})[/\\\\][^:]+:\\d+:\\d+`)}var SCt=new RegExp("^(?:\\s*at )?(?:(new) )?(?:(.*?) \\()?(?:eval at ([^ ]+) \\((.+?):(\\d+):(\\d+)\\), )?(?:(.+?):(\\d+):(\\d+)|(native))(\\)?)$"),PCt=/^(.*?) \[as (.*?)\]$/;xIe.exports=cB});var kIe=U((cKt,QIe)=>{"use strict";QIe.exports=(t,e)=>t.replace(/^\t+/gm,r=>" ".repeat(r.length*(e||2)))});var RIe=U((uKt,FIe)=>{"use strict";var xCt=kIe(),bCt=(t,e)=>{let r=[],o=t-e,a=t+e;for(let n=o;n<=a;n++)r.push(n);return r};FIe.exports=(t,e,r)=>{if(typeof t!="string")throw new TypeError("Source code is missing.");if(!e||e<1)throw new TypeError("Line number must start from `1`.");if(t=xCt(t).split(/\r?\n/),!(e>t.length))return r={around:3,...r},bCt(e,r.around).filter(o=>t[o-1]!==void 0).map(o=>({line:o,value:t[o-1]}))}});var XQ=U(ou=>{"use strict";var QCt=ou&&ou.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),kCt=ou&&ou.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),FCt=ou&&ou.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&QCt(e,t,r);return kCt(e,t),e},RCt=ou&&ou.__rest||function(t,e){var r={};for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&e.indexOf(o)<0&&(r[o]=t[o]);if(t!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,o=Object.getOwnPropertySymbols(t);a{var{children:r}=t,o=RCt(t,["children"]);let a=Object.assign(Object.assign({},o),{marginLeft:o.marginLeft||o.marginX||o.margin||0,marginRight:o.marginRight||o.marginX||o.margin||0,marginTop:o.marginTop||o.marginY||o.margin||0,marginBottom:o.marginBottom||o.marginY||o.margin||0,paddingLeft:o.paddingLeft||o.paddingX||o.padding||0,paddingRight:o.paddingRight||o.paddingX||o.padding||0,paddingTop:o.paddingTop||o.paddingY||o.padding||0,paddingBottom:o.paddingBottom||o.paddingY||o.padding||0});return TIe.default.createElement("ink-box",{ref:e,style:a},r)});hq.displayName="Box";hq.defaultProps={flexDirection:"row",flexGrow:0,flexShrink:1};ou.default=hq});var mq=U(uB=>{"use strict";var gq=uB&&uB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(uB,"__esModule",{value:!0});var TCt=gq(en()),LE=gq(VQ()),NIe=gq(z6()),dq=({color:t,backgroundColor:e,dimColor:r,bold:o,italic:a,underline:n,strikethrough:u,inverse:A,wrap:p,children:h})=>{if(h==null)return null;let E=w=>(r&&(w=LE.default.dim(w)),t&&(w=NIe.default(w,t,"foreground")),e&&(w=NIe.default(w,e,"background")),o&&(w=LE.default.bold(w)),a&&(w=LE.default.italic(w)),n&&(w=LE.default.underline(w)),u&&(w=LE.default.strikethrough(w)),A&&(w=LE.default.inverse(w)),w);return TCt.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row",textWrap:p},internal_transform:E},h)};dq.displayName="Text";dq.defaultProps={dimColor:!1,bold:!1,italic:!1,underline:!1,strikethrough:!1,wrap:"wrap"};uB.default=dq});var UIe=U(au=>{"use strict";var NCt=au&&au.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),LCt=au&&au.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),OCt=au&&au.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&NCt(e,t,r);return LCt(e,t),e},AB=au&&au.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(au,"__esModule",{value:!0});var LIe=OCt(Ie("fs")),hs=AB(en()),OIe=AB(bIe()),MCt=AB(RIe()),Xf=AB(XQ()),dA=AB(mq()),MIe=new OIe.default({cwd:process.cwd(),internals:OIe.default.nodeInternals()}),UCt=({error:t})=>{let e=t.stack?t.stack.split(` +`).slice(1):void 0,r=e?MIe.parseLine(e[0]):void 0,o,a=0;if((r==null?void 0:r.file)&&(r==null?void 0:r.line)&&LIe.existsSync(r.file)){let n=LIe.readFileSync(r.file,"utf8");if(o=MCt.default(n,r.line),o)for(let{line:u}of o)a=Math.max(a,String(u).length)}return hs.default.createElement(Xf.default,{flexDirection:"column",padding:1},hs.default.createElement(Xf.default,null,hs.default.createElement(dA.default,{backgroundColor:"red",color:"white"}," ","ERROR"," "),hs.default.createElement(dA.default,null," ",t.message)),r&&hs.default.createElement(Xf.default,{marginTop:1},hs.default.createElement(dA.default,{dimColor:!0},r.file,":",r.line,":",r.column)),r&&o&&hs.default.createElement(Xf.default,{marginTop:1,flexDirection:"column"},o.map(({line:n,value:u})=>hs.default.createElement(Xf.default,{key:n},hs.default.createElement(Xf.default,{width:a+1},hs.default.createElement(dA.default,{dimColor:n!==r.line,backgroundColor:n===r.line?"red":void 0,color:n===r.line?"white":void 0},String(n).padStart(a," "),":")),hs.default.createElement(dA.default,{key:n,backgroundColor:n===r.line?"red":void 0,color:n===r.line?"white":void 0}," "+u)))),t.stack&&hs.default.createElement(Xf.default,{marginTop:1,flexDirection:"column"},t.stack.split(` +`).slice(1).map(n=>{let u=MIe.parseLine(n);return u?hs.default.createElement(Xf.default,{key:n},hs.default.createElement(dA.default,{dimColor:!0},"- "),hs.default.createElement(dA.default,{dimColor:!0,bold:!0},u.function),hs.default.createElement(dA.default,{dimColor:!0,color:"gray"}," ","(",u.file,":",u.line,":",u.column,")")):hs.default.createElement(Xf.default,{key:n},hs.default.createElement(dA.default,{dimColor:!0},"- "),hs.default.createElement(dA.default,{dimColor:!0,bold:!0},n))})))};au.default=UCt});var HIe=U(lu=>{"use strict";var _Ct=lu&&lu.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),HCt=lu&&lu.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),qCt=lu&&lu.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&_Ct(e,t,r);return HCt(e,t),e},fm=lu&&lu.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(lu,"__esModule",{value:!0});var Am=qCt(en()),_Ie=fm(h6()),jCt=fm(oq()),GCt=fm(lq()),WCt=fm(uq()),YCt=fm(fq()),KCt=fm(zQ()),VCt=fm(UIe()),JCt=" ",zCt="\x1B[Z",XCt="\x1B",ZQ=class extends Am.PureComponent{constructor(){super(...arguments),this.state={isFocusEnabled:!0,activeFocusId:void 0,focusables:[],error:void 0},this.rawModeEnabledCount=0,this.handleSetRawMode=e=>{let{stdin:r}=this.props;if(!this.isRawModeSupported())throw r===process.stdin?new Error(`Raw mode is not supported on the current process.stdin, which Ink uses as input stream by default. +Read about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`):new Error(`Raw mode is not supported on the stdin provided to Ink. +Read about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`);if(r.setEncoding("utf8"),e){this.rawModeEnabledCount===0&&(r.addListener("data",this.handleInput),r.resume(),r.setRawMode(!0)),this.rawModeEnabledCount++;return}--this.rawModeEnabledCount===0&&(r.setRawMode(!1),r.removeListener("data",this.handleInput),r.pause())},this.handleInput=e=>{e===""&&this.props.exitOnCtrlC&&this.handleExit(),e===XCt&&this.state.activeFocusId&&this.setState({activeFocusId:void 0}),this.state.isFocusEnabled&&this.state.focusables.length>0&&(e===JCt&&this.focusNext(),e===zCt&&this.focusPrevious())},this.handleExit=e=>{this.isRawModeSupported()&&this.handleSetRawMode(!1),this.props.onExit(e)},this.enableFocus=()=>{this.setState({isFocusEnabled:!0})},this.disableFocus=()=>{this.setState({isFocusEnabled:!1})},this.focusNext=()=>{this.setState(e=>{let r=e.focusables[0].id;return{activeFocusId:this.findNextFocusable(e)||r}})},this.focusPrevious=()=>{this.setState(e=>{let r=e.focusables[e.focusables.length-1].id;return{activeFocusId:this.findPreviousFocusable(e)||r}})},this.addFocusable=(e,{autoFocus:r})=>{this.setState(o=>{let a=o.activeFocusId;return!a&&r&&(a=e),{activeFocusId:a,focusables:[...o.focusables,{id:e,isActive:!0}]}})},this.removeFocusable=e=>{this.setState(r=>({activeFocusId:r.activeFocusId===e?void 0:r.activeFocusId,focusables:r.focusables.filter(o=>o.id!==e)}))},this.activateFocusable=e=>{this.setState(r=>({focusables:r.focusables.map(o=>o.id!==e?o:{id:e,isActive:!0})}))},this.deactivateFocusable=e=>{this.setState(r=>({activeFocusId:r.activeFocusId===e?void 0:r.activeFocusId,focusables:r.focusables.map(o=>o.id!==e?o:{id:e,isActive:!1})}))},this.findNextFocusable=e=>{let r=e.focusables.findIndex(o=>o.id===e.activeFocusId);for(let o=r+1;o{let r=e.focusables.findIndex(o=>o.id===e.activeFocusId);for(let o=r-1;o>=0;o--)if(e.focusables[o].isActive)return e.focusables[o].id}}static getDerivedStateFromError(e){return{error:e}}isRawModeSupported(){return this.props.stdin.isTTY}render(){return Am.default.createElement(jCt.default.Provider,{value:{exit:this.handleExit}},Am.default.createElement(GCt.default.Provider,{value:{stdin:this.props.stdin,setRawMode:this.handleSetRawMode,isRawModeSupported:this.isRawModeSupported(),internal_exitOnCtrlC:this.props.exitOnCtrlC}},Am.default.createElement(WCt.default.Provider,{value:{stdout:this.props.stdout,write:this.props.writeToStdout}},Am.default.createElement(YCt.default.Provider,{value:{stderr:this.props.stderr,write:this.props.writeToStderr}},Am.default.createElement(KCt.default.Provider,{value:{activeId:this.state.activeFocusId,add:this.addFocusable,remove:this.removeFocusable,activate:this.activateFocusable,deactivate:this.deactivateFocusable,enableFocus:this.enableFocus,disableFocus:this.disableFocus,focusNext:this.focusNext,focusPrevious:this.focusPrevious}},this.state.error?Am.default.createElement(VCt.default,{error:this.state.error}):this.props.children)))))}componentDidMount(){_Ie.default.hide(this.props.stdout)}componentWillUnmount(){_Ie.default.show(this.props.stdout),this.isRawModeSupported()&&this.handleSetRawMode(!1)}componentDidCatch(e){this.handleExit(e)}};lu.default=ZQ;ZQ.displayName="InternalApp"});var GIe=U(cu=>{"use strict";var ZCt=cu&&cu.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),$Ct=cu&&cu.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),eEt=cu&&cu.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&ZCt(e,t,r);return $Ct(e,t),e},uu=cu&&cu.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(cu,"__esModule",{value:!0});var tEt=uu(en()),qIe=mM(),rEt=uu(bCe()),nEt=uu(c6()),iEt=uu(NCe()),sEt=uu(OCe()),yq=uu(QEe()),oEt=uu(hIe()),aEt=uu(p6()),lEt=uu(yIe()),cEt=eEt(j6()),uEt=uu(iq()),AEt=uu(HIe()),OE=process.env.CI==="false"?!1:iEt.default,jIe=()=>{},Cq=class{constructor(e){this.resolveExitPromise=()=>{},this.rejectExitPromise=()=>{},this.unsubscribeExit=()=>{},this.onRender=()=>{if(this.isUnmounted)return;let{output:r,outputHeight:o,staticOutput:a}=oEt.default(this.rootNode,this.options.stdout.columns||80),n=a&&a!==` +`;if(this.options.debug){n&&(this.fullStaticOutput+=a),this.options.stdout.write(this.fullStaticOutput+r);return}if(OE){n&&this.options.stdout.write(a),this.lastOutput=r;return}if(n&&(this.fullStaticOutput+=a),o>=this.options.stdout.rows){this.options.stdout.write(nEt.default.clearTerminal+this.fullStaticOutput+r),this.lastOutput=r;return}n&&(this.log.clear(),this.options.stdout.write(a),this.log(r)),!n&&r!==this.lastOutput&&this.throttledLog(r),this.lastOutput=r},sEt.default(this),this.options=e,this.rootNode=cEt.createNode("ink-root"),this.rootNode.onRender=e.debug?this.onRender:qIe(this.onRender,32,{leading:!0,trailing:!0}),this.rootNode.onImmediateRender=this.onRender,this.log=rEt.default.create(e.stdout),this.throttledLog=e.debug?this.log:qIe(this.log,void 0,{leading:!0,trailing:!0}),this.isUnmounted=!1,this.lastOutput="",this.fullStaticOutput="",this.container=yq.default.createContainer(this.rootNode,!1,!1),this.unsubscribeExit=aEt.default(this.unmount,{alwaysLast:!1}),e.patchConsole&&this.patchConsole(),OE||(e.stdout.on("resize",this.onRender),this.unsubscribeResize=()=>{e.stdout.off("resize",this.onRender)})}render(e){let r=tEt.default.createElement(AEt.default,{stdin:this.options.stdin,stdout:this.options.stdout,stderr:this.options.stderr,writeToStdout:this.writeToStdout,writeToStderr:this.writeToStderr,exitOnCtrlC:this.options.exitOnCtrlC,onExit:this.unmount},e);yq.default.updateContainer(r,this.container,null,jIe)}writeToStdout(e){if(!this.isUnmounted){if(this.options.debug){this.options.stdout.write(e+this.fullStaticOutput+this.lastOutput);return}if(OE){this.options.stdout.write(e);return}this.log.clear(),this.options.stdout.write(e),this.log(this.lastOutput)}}writeToStderr(e){if(!this.isUnmounted){if(this.options.debug){this.options.stderr.write(e),this.options.stdout.write(this.fullStaticOutput+this.lastOutput);return}if(OE){this.options.stderr.write(e);return}this.log.clear(),this.options.stderr.write(e),this.log(this.lastOutput)}}unmount(e){this.isUnmounted||(this.onRender(),this.unsubscribeExit(),typeof this.restoreConsole=="function"&&this.restoreConsole(),typeof this.unsubscribeResize=="function"&&this.unsubscribeResize(),OE?this.options.stdout.write(this.lastOutput+` +`):this.options.debug||this.log.done(),this.isUnmounted=!0,yq.default.updateContainer(null,this.container,null,jIe),uEt.default.delete(this.options.stdout),e instanceof Error?this.rejectExitPromise(e):this.resolveExitPromise())}waitUntilExit(){return this.exitPromise||(this.exitPromise=new Promise((e,r)=>{this.resolveExitPromise=e,this.rejectExitPromise=r})),this.exitPromise}clear(){!OE&&!this.options.debug&&this.log.clear()}patchConsole(){this.options.debug||(this.restoreConsole=lEt.default((e,r)=>{e==="stdout"&&this.writeToStdout(r),e==="stderr"&&(r.startsWith("The above error occurred")||this.writeToStderr(r))}))}};cu.default=Cq});var YIe=U(fB=>{"use strict";var WIe=fB&&fB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(fB,"__esModule",{value:!0});var fEt=WIe(GIe()),$Q=WIe(iq()),pEt=Ie("stream"),hEt=(t,e)=>{let r=Object.assign({stdout:process.stdout,stdin:process.stdin,stderr:process.stderr,debug:!1,exitOnCtrlC:!0,patchConsole:!0},gEt(e)),o=dEt(r.stdout,()=>new fEt.default(r));return o.render(t),{rerender:o.render,unmount:()=>o.unmount(),waitUntilExit:o.waitUntilExit,cleanup:()=>$Q.default.delete(r.stdout),clear:o.clear}};fB.default=hEt;var gEt=(t={})=>t instanceof pEt.Stream?{stdout:t,stdin:process.stdin}:t,dEt=(t,e)=>{let r;return $Q.default.has(t)?r=$Q.default.get(t):(r=e(),$Q.default.set(t,r)),r}});var VIe=U(Zf=>{"use strict";var mEt=Zf&&Zf.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),yEt=Zf&&Zf.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),CEt=Zf&&Zf.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&mEt(e,t,r);return yEt(e,t),e};Object.defineProperty(Zf,"__esModule",{value:!0});var pB=CEt(en()),KIe=t=>{let{items:e,children:r,style:o}=t,[a,n]=pB.useState(0),u=pB.useMemo(()=>e.slice(a),[e,a]);pB.useLayoutEffect(()=>{n(e.length)},[e.length]);let A=u.map((h,E)=>r(h,a+E)),p=pB.useMemo(()=>Object.assign({position:"absolute",flexDirection:"column"},o),[o]);return pB.default.createElement("ink-box",{internal_static:!0,style:p},A)};KIe.displayName="Static";Zf.default=KIe});var zIe=U(hB=>{"use strict";var EEt=hB&&hB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(hB,"__esModule",{value:!0});var IEt=EEt(en()),JIe=({children:t,transform:e})=>t==null?null:IEt.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row"},internal_transform:e},t);JIe.displayName="Transform";hB.default=JIe});var ZIe=U(gB=>{"use strict";var wEt=gB&&gB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(gB,"__esModule",{value:!0});var BEt=wEt(en()),XIe=({count:t=1})=>BEt.default.createElement("ink-text",null,` +`.repeat(t));XIe.displayName="Newline";gB.default=XIe});var twe=U(dB=>{"use strict";var $Ie=dB&&dB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(dB,"__esModule",{value:!0});var vEt=$Ie(en()),DEt=$Ie(XQ()),ewe=()=>vEt.default.createElement(DEt.default,{flexGrow:1});ewe.displayName="Spacer";dB.default=ewe});var ek=U(mB=>{"use strict";var SEt=mB&&mB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(mB,"__esModule",{value:!0});var PEt=en(),xEt=SEt(lq()),bEt=()=>PEt.useContext(xEt.default);mB.default=bEt});var nwe=U(yB=>{"use strict";var QEt=yB&&yB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(yB,"__esModule",{value:!0});var rwe=en(),kEt=QEt(ek()),FEt=(t,e={})=>{let{stdin:r,setRawMode:o,internal_exitOnCtrlC:a}=kEt.default();rwe.useEffect(()=>{if(e.isActive!==!1)return o(!0),()=>{o(!1)}},[e.isActive,o]),rwe.useEffect(()=>{if(e.isActive===!1)return;let n=u=>{let A=String(u),p={upArrow:A==="\x1B[A",downArrow:A==="\x1B[B",leftArrow:A==="\x1B[D",rightArrow:A==="\x1B[C",pageDown:A==="\x1B[6~",pageUp:A==="\x1B[5~",return:A==="\r",escape:A==="\x1B",ctrl:!1,shift:!1,tab:A===" "||A==="\x1B[Z",backspace:A==="\b",delete:A==="\x7F"||A==="\x1B[3~",meta:!1};A<=""&&!p.return&&(A=String.fromCharCode(A.charCodeAt(0)+"a".charCodeAt(0)-1),p.ctrl=!0),A.startsWith("\x1B")&&(A=A.slice(1),p.meta=!0);let h=A>="A"&&A<="Z",E=A>="\u0410"&&A<="\u042F";A.length===1&&(h||E)&&(p.shift=!0),p.tab&&A==="[Z"&&(p.shift=!0),(p.tab||p.backspace||p.delete)&&(A=""),(!(A==="c"&&p.ctrl)||!a)&&t(A,p)};return r==null||r.on("data",n),()=>{r==null||r.off("data",n)}},[e.isActive,r,a,t])};yB.default=FEt});var iwe=U(CB=>{"use strict";var REt=CB&&CB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(CB,"__esModule",{value:!0});var TEt=en(),NEt=REt(oq()),LEt=()=>TEt.useContext(NEt.default);CB.default=LEt});var swe=U(EB=>{"use strict";var OEt=EB&&EB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(EB,"__esModule",{value:!0});var MEt=en(),UEt=OEt(uq()),_Et=()=>MEt.useContext(UEt.default);EB.default=_Et});var owe=U(IB=>{"use strict";var HEt=IB&&IB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(IB,"__esModule",{value:!0});var qEt=en(),jEt=HEt(fq()),GEt=()=>qEt.useContext(jEt.default);IB.default=GEt});var lwe=U(BB=>{"use strict";var awe=BB&&BB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(BB,"__esModule",{value:!0});var wB=en(),WEt=awe(zQ()),YEt=awe(ek()),KEt=({isActive:t=!0,autoFocus:e=!1}={})=>{let{isRawModeSupported:r,setRawMode:o}=YEt.default(),{activeId:a,add:n,remove:u,activate:A,deactivate:p}=wB.useContext(WEt.default),h=wB.useMemo(()=>Math.random().toString().slice(2,7),[]);return wB.useEffect(()=>(n(h,{autoFocus:e}),()=>{u(h)}),[h,e]),wB.useEffect(()=>{t?A(h):p(h)},[t,h]),wB.useEffect(()=>{if(!(!r||!t))return o(!0),()=>{o(!1)}},[t]),{isFocused:Boolean(h)&&a===h}};BB.default=KEt});var cwe=U(vB=>{"use strict";var VEt=vB&&vB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(vB,"__esModule",{value:!0});var JEt=en(),zEt=VEt(zQ()),XEt=()=>{let t=JEt.useContext(zEt.default);return{enableFocus:t.enableFocus,disableFocus:t.disableFocus,focusNext:t.focusNext,focusPrevious:t.focusPrevious}};vB.default=XEt});var uwe=U(Eq=>{"use strict";Object.defineProperty(Eq,"__esModule",{value:!0});Eq.default=t=>{var e,r,o,a;return{width:(r=(e=t.yogaNode)===null||e===void 0?void 0:e.getComputedWidth())!==null&&r!==void 0?r:0,height:(a=(o=t.yogaNode)===null||o===void 0?void 0:o.getComputedHeight())!==null&&a!==void 0?a:0}}});var cc=U($s=>{"use strict";Object.defineProperty($s,"__esModule",{value:!0});var ZEt=YIe();Object.defineProperty($s,"render",{enumerable:!0,get:function(){return ZEt.default}});var $Et=XQ();Object.defineProperty($s,"Box",{enumerable:!0,get:function(){return $Et.default}});var eIt=mq();Object.defineProperty($s,"Text",{enumerable:!0,get:function(){return eIt.default}});var tIt=VIe();Object.defineProperty($s,"Static",{enumerable:!0,get:function(){return tIt.default}});var rIt=zIe();Object.defineProperty($s,"Transform",{enumerable:!0,get:function(){return rIt.default}});var nIt=ZIe();Object.defineProperty($s,"Newline",{enumerable:!0,get:function(){return nIt.default}});var iIt=twe();Object.defineProperty($s,"Spacer",{enumerable:!0,get:function(){return iIt.default}});var sIt=nwe();Object.defineProperty($s,"useInput",{enumerable:!0,get:function(){return sIt.default}});var oIt=iwe();Object.defineProperty($s,"useApp",{enumerable:!0,get:function(){return oIt.default}});var aIt=ek();Object.defineProperty($s,"useStdin",{enumerable:!0,get:function(){return aIt.default}});var lIt=swe();Object.defineProperty($s,"useStdout",{enumerable:!0,get:function(){return lIt.default}});var cIt=owe();Object.defineProperty($s,"useStderr",{enumerable:!0,get:function(){return cIt.default}});var uIt=lwe();Object.defineProperty($s,"useFocus",{enumerable:!0,get:function(){return uIt.default}});var AIt=cwe();Object.defineProperty($s,"useFocusManager",{enumerable:!0,get:function(){return AIt.default}});var fIt=uwe();Object.defineProperty($s,"measureElement",{enumerable:!0,get:function(){return fIt.default}})});var wq={};Yt(wq,{Gem:()=>Iq});var Awe,pm,Iq,tk=dt(()=>{Awe=tt(cc()),pm=tt(en()),Iq=(0,pm.memo)(({active:t})=>{let e=(0,pm.useMemo)(()=>t?"\u25C9":"\u25EF",[t]),r=(0,pm.useMemo)(()=>t?"green":"yellow",[t]);return pm.default.createElement(Awe.Text,{color:r},e)})});var pwe={};Yt(pwe,{useKeypress:()=>hm});function hm({active:t},e,r){let{stdin:o}=(0,fwe.useStdin)(),a=(0,rk.useCallback)((n,u)=>e(n,u),r);(0,rk.useEffect)(()=>{if(!(!t||!o))return o.on("keypress",a),()=>{o.off("keypress",a)}},[t,a,o])}var fwe,rk,DB=dt(()=>{fwe=tt(cc()),rk=tt(en())});var gwe={};Yt(gwe,{FocusRequest:()=>hwe,useFocusRequest:()=>Bq});var hwe,Bq,vq=dt(()=>{DB();hwe=(r=>(r.BEFORE="before",r.AFTER="after",r))(hwe||{}),Bq=function({active:t},e,r){hm({active:t},(o,a)=>{a.name==="tab"&&(a.shift?e("before"):e("after"))},r)}});var dwe={};Yt(dwe,{useListInput:()=>SB});var SB,nk=dt(()=>{DB();SB=function(t,e,{active:r,minus:o,plus:a,set:n,loop:u=!0}){hm({active:r},(A,p)=>{let h=e.indexOf(t);switch(p.name){case o:{let E=h-1;if(u){n(e[(e.length+E)%e.length]);return}if(E<0)return;n(e[E])}break;case a:{let E=h+1;if(u){n(e[E%e.length]);return}if(E>=e.length)return;n(e[E])}break}},[e,t,a,n,u])}});var ik={};Yt(ik,{ScrollableItems:()=>pIt});var mh,La,pIt,sk=dt(()=>{mh=tt(cc()),La=tt(en());vq();nk();pIt=({active:t=!0,children:e=[],radius:r=10,size:o=1,loop:a=!0,onFocusRequest:n,willReachEnd:u})=>{let A=L=>{if(L.key===null)throw new Error("Expected all children to have a key");return L.key},p=La.default.Children.map(e,L=>A(L)),h=p[0],[E,w]=(0,La.useState)(h),v=p.indexOf(E);(0,La.useEffect)(()=>{p.includes(E)||w(h)},[e]),(0,La.useEffect)(()=>{u&&v>=p.length-2&&u()},[v]),Bq({active:t&&!!n},L=>{n==null||n(L)},[n]),SB(E,p,{active:t,minus:"up",plus:"down",set:w,loop:a});let b=v-r,C=v+r;C>p.length&&(b-=C-p.length,C=p.length),b<0&&(C+=-b,b=0),C>=p.length&&(C=p.length-1);let R=[];for(let L=b;L<=C;++L){let _=p[L],V=t&&_===E;R.push(La.default.createElement(mh.Box,{key:_,height:o},La.default.createElement(mh.Box,{marginLeft:1,marginRight:1},La.default.createElement(mh.Text,null,V?La.default.createElement(mh.Text,{color:"cyan",bold:!0},">"):" ")),La.default.createElement(mh.Box,null,La.default.cloneElement(e[L],{active:V}))))}return La.default.createElement(mh.Box,{flexDirection:"column",width:"100%"},R)}});var mwe,$f,ywe,Dq,Cwe,Sq=dt(()=>{mwe=tt(cc()),$f=tt(en()),ywe=Ie("readline"),Dq=$f.default.createContext(null),Cwe=({children:t})=>{let{stdin:e,setRawMode:r}=(0,mwe.useStdin)();(0,$f.useEffect)(()=>{r&&r(!0),e&&(0,ywe.emitKeypressEvents)(e)},[e,r]);let[o,a]=(0,$f.useState)(new Map),n=(0,$f.useMemo)(()=>({getAll:()=>o,get:u=>o.get(u),set:(u,A)=>a(new Map([...o,[u,A]]))}),[o,a]);return $f.default.createElement(Dq.Provider,{value:n,children:t})}});var Pq={};Yt(Pq,{useMinistore:()=>hIt});function hIt(t,e){let r=(0,ok.useContext)(Dq);if(r===null)throw new Error("Expected this hook to run with a ministore context attached");if(typeof t>"u")return r.getAll();let o=(0,ok.useCallback)(n=>{r.set(t,n)},[t,r.set]),a=r.get(t);return typeof a>"u"&&(a=e),[a,o]}var ok,xq=dt(()=>{ok=tt(en());Sq()});var lk={};Yt(lk,{renderForm:()=>gIt});async function gIt(t,e,{stdin:r,stdout:o,stderr:a}){let n,u=p=>{let{exit:h}=(0,ak.useApp)();hm({active:!0},(E,w)=>{w.name==="return"&&(n=p,h())},[h,p])},{waitUntilExit:A}=(0,ak.render)(bq.default.createElement(Cwe,null,bq.default.createElement(t,{...e,useSubmit:u})),{stdin:r,stdout:o,stderr:a});return await A(),n}var ak,bq,ck=dt(()=>{ak=tt(cc()),bq=tt(en());Sq();DB()});var Bwe=U(PB=>{"use strict";Object.defineProperty(PB,"__esModule",{value:!0});PB.UncontrolledTextInput=void 0;var Iwe=en(),Qq=en(),Ewe=cc(),gm=VQ(),wwe=({value:t,placeholder:e="",focus:r=!0,mask:o,highlightPastedText:a=!1,showCursor:n=!0,onChange:u,onSubmit:A})=>{let[{cursorOffset:p,cursorWidth:h},E]=Qq.useState({cursorOffset:(t||"").length,cursorWidth:0});Qq.useEffect(()=>{E(R=>{if(!r||!n)return R;let L=t||"";return R.cursorOffset>L.length-1?{cursorOffset:L.length,cursorWidth:0}:R})},[t,r,n]);let w=a?h:0,v=o?o.repeat(t.length):t,b=v,C=e?gm.grey(e):void 0;if(n&&r){C=e.length>0?gm.inverse(e[0])+gm.grey(e.slice(1)):gm.inverse(" "),b=v.length>0?"":gm.inverse(" ");let R=0;for(let L of v)R>=p-w&&R<=p?b+=gm.inverse(L):b+=L,R++;v.length>0&&p===v.length&&(b+=gm.inverse(" "))}return Ewe.useInput((R,L)=>{if(L.upArrow||L.downArrow||L.ctrl&&R==="c"||L.tab||L.shift&&L.tab)return;if(L.return){A&&A(t);return}let _=p,V=t,re=0;L.leftArrow?n&&_--:L.rightArrow?n&&_++:L.backspace||L.delete?p>0&&(V=t.slice(0,p-1)+t.slice(p,t.length),_--):(V=t.slice(0,p)+R+t.slice(p,t.length),_+=R.length,R.length>1&&(re=R.length)),p<0&&(_=0),p>t.length&&(_=t.length),E({cursorOffset:_,cursorWidth:re}),V!==t&&u(V)},{isActive:r}),Iwe.createElement(Ewe.Text,null,e?v.length>0?b:C:b)};PB.default=wwe;PB.UncontrolledTextInput=t=>{let[e,r]=Qq.useState("");return Iwe.createElement(wwe,Object.assign({},t,{value:e,onChange:r}))}});var Swe={};Yt(Swe,{Pad:()=>kq});var vwe,Dwe,kq,Fq=dt(()=>{vwe=tt(cc()),Dwe=tt(en()),kq=({length:t,active:e})=>{if(t===0)return null;let r=t>1?` ${"-".repeat(t-1)}`:" ";return Dwe.default.createElement(vwe.Text,{dimColor:!e},r)}});var Pwe={};Yt(Pwe,{ItemOptions:()=>dIt});var bB,Ch,dIt,xwe=dt(()=>{bB=tt(cc()),Ch=tt(en());nk();tk();Fq();dIt=function({active:t,skewer:e,options:r,value:o,onChange:a,sizes:n=[]}){let u=r.filter(({label:p})=>!!p).map(({value:p})=>p),A=r.findIndex(p=>p.value===o&&p.label!="");return SB(o,u,{active:t,minus:"left",plus:"right",set:a}),Ch.default.createElement(Ch.default.Fragment,null,r.map(({label:p},h)=>{let E=h===A,w=n[h]-1||0,v=p.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,""),b=Math.max(0,w-v.length-2);return p?Ch.default.createElement(bB.Box,{key:p,width:w,marginLeft:1},Ch.default.createElement(bB.Text,{wrap:"truncate"},Ch.default.createElement(Iq,{active:E})," ",p),e?Ch.default.createElement(kq,{active:t,length:b}):null):Ch.default.createElement(bB.Box,{key:`spacer-${h}`,width:w,marginLeft:1})}))}});var Gwe=U((ZVt,jwe)=>{var Hq;jwe.exports=()=>(typeof Hq>"u"&&(Hq=Ie("zlib").brotliDecompressSync(Buffer.from("W6abVjHd5indCaqldL7F3/eAMmSYwqb3Ose0DoWBu/qV74KybUeF0nPb04YlUmTIUNW0pDLG9qMbPyCoVVUeRdWAkERDd4REs50hxMCh8DrGXAJlieoPk2lOql7LazghL5zbaUF0M2kuVAxTi48HN1lFfBq+FpRCWub+3vbzNZL50ZDFfW49DiMWBKaK/7t8C6DH5o5SQQilXTSDnMfkbXuHh/hhQ/9banW2L6dnWjMNCnx7QtZM3hhOwhag1NrGoSSrE2KhsplhD0GV/B1P1tydj/BkpTnxT/w2QRTANlP1788rQtoK8kgAapxPGep4rfliB0hFSuiJs6Uu+urXUv3TGdlOGDGkXBk9Nr+UmroCFdyESxebqrl7mZRufauOUiES9ONMATyA1EdOQUrb2p+/Vv378/XKPXypecYZe8+4F4L0rSxhTooKNERMNxKWYO+wtfjq/l95CbIeulHTJ/v4xLF70TY0vLKnSOmXbX8638+5nWmxlWEH19JGOHNniO8H9L41e0B8/PKn+fWrdJjIpHQ7zddqcq3bXiBFeta83TNwM9g7s7d3U2HntXEsY2pjmD1G2vcPGOkBsjlp4fEtWx2vBUPoPX7JqkZLNTuekG5EWRhyv60xEI/K9uPgYJV+xfFekrYBCjygQtmgaICC+K0a0A8TZ3889IAIfD49vhmNZSVxwlgRIdwoXcZCkJTCriP85xtbv1zMQqbsf1uee7ngVbEOSEU7w3ySM6HizJPxo4badzzs7gY7+n/k43vV1VAYsBsFJfJNwZOio4mxjBKk8aNGKv3xsLv/Y1tK5OOr6uqmgEYqEEjMbczExRhJo4SJkfK39trxikZ26lH6hdnQhWywcovYgcjzkw8orLas57dNZo8842hiYHeQjhK7/C6J0sbsAT1SqOjG/tfujAQvBfigZZFOK1vZTh7KC58CLGun25k1nwkHtpujIUzAD7Dff29q1eMJUirVWLM3drEyjq7GGL+fs0dG3HhXyJ+mCEcJAEkVZfo0WV5UG/si4v1EZiLBASCWGmQ7SdVq73Zj7XI11cs5s12ImvEr70e+ZaWLxUmTHj33hLZIz0NHRuTjdHVVcSFXADOnZimEyhcv8v9S3ZCnpUfvfNKk4RoNDA2lLNKiZZX0/2WhIHyHJM+FgK47quOtpyJAdDIjs2L3zMh5JIJI9R6ZY/r/vze1anvf/xE/AoAEgRRVSbbUWcq2StWY8uuIICXffTTq8W5lV6n37v1v9N97/1fG/z9wMuJHoBJhOAUEwDOMCLCHBMj4AZAVgCgNqMypA6ocZaqHlTmGafqMyrgkSJ2SSOmcFKUck6a9W41l+Rzf1i3HubNv65Zj7K53m1ks97OczXIW2/F5dVmtwLY2mffiI3r9vquoaKSx54d1RFO0VzQzcvReRkmWYLI4myMsl7QeednHXAKVyOVVV17R1NcjMePOQwzkMQAb6UBiF1CQ4mazzjII9ImeJ/6n32y4Q3ujtihwSByLUDkopM6nJtRHaQ5hcQi1VmMk9v/3TTtTO3AYiPzuvHbb6GMaBXKXeeC1zJaIPXw4MSyc2NZh6t7Og9vi35S4I+THnQWDsQbGqFoQKSAGURISLQgbEzB+DDFn/b9JRN+J4uvbNFGkFZEmIlZsMYoVUwBLSzNmt7/+SwTAY29r+7J3iNrHg3iKIL5adLhND7Tk1icQBAfNf5cWGa8h3fMPYQoVUwgyHCpUqBCHCkFUTDEEFy4ccMCFIC5cbJHnM3VR/v4BUta2CwIWBCyIqgADg4AAAwMDqzIwGGBV8dP5H7wvu4C8fi+4IFIDAgIMItXAYICBgYFVGYwqqxpVAw4YcIDB+rn1/w/f7XuFed85YosWW7ToTBAIBAKBQJAMAoFAIBAlSqxJSiyBOMOjm/9/g4I+hrw/2jqSQCCDlYQ5ZU0VQWS4EG3V+tcAzDjDthOv2///X1wUt4LeuppUSQGSEJASKQlFQg8grUppAgHFssrXnZNKXikjlH8C6gb4rJH30mOLOwAT251S9CrtD+J87AarxM1Ku9hZ8vtb0OKUOK/OhSHfeWwm/C6rd60U8Eb3Czcr7TuO2UzPRI+aYuSxp9HaNLyvUiJhbQb0v0WSVkPbqpZX0I9v2Dh+njIJSYkYpyz6ldamhnFK3BStySePk8Lv2JQMoQvKV0Kdw3RR1fL7QfiKHKl0imQFTyYGohcloLpBw6tGBMiGMOeSI54USyWG6k4zP6vLiUsa437WA11Rl40OOzXOn/FuVKO6het2QH8W/KgakuLsMBMz3CoAacB3E0cWQ0DYuw7CVcUllcFi4+/nv5TSDk3bTq4eZ//1lth5a3vgHwaLeP1zb+BuYy+6w/gAEO6CsdaUk2aBAol1lgfUpgb7LwsoguTO5foX2DTYvh3iLyjGhy9ybQTfM5+0C0m4aw86fHyJuydUieKFy/gikWVkr0/ePCYGeRz7Fr1niUngkyi67icHzuhe42TeAQZOoEs6yOBVLF4S44CmkNCXxM1Esri8JF5HMUR3YvwZAOaUpvrmBwwj9QR5MZLKv8XCk79ccfu3OGbkL8+8+83UCr0LCX0p2KL8wUbMrHeP/XKX0bake48t2NFr3HIPxL+AW8vUo1zXrxZe9rsokZe/0K+MLfFSXyI/8vzZpUpNtj+sV9tmy5qV56kTlOnnRETuw3uZGDTyy/QaMSPrwM0Jvx9NliBx1lRnP0q3PENeUwCKAFs9RhXlSt7K5L1tIaaQZhDVnoVUOEx929aa+N7tBblCQBH15kFlFUrvZkcPjfbIe2SrkRRCFsDf9KH7wuZzJwvtkIXM5cSjz8+Aqb6C+e8ZUARQbdn8DgZ+rZH3ppIMaAbRCInh8eOaWIjrth7G0GOr944gk2j5/VvqoLeV3Q0p+j1aKyVENDnjT1BJ57lZaw+oR1L/f2uy9TefTmzluAH3Bw/S9h10je5C3pXad2A9dCneTGFHP9ajwJ9Sx+r2FhsatK+icBi2Y8lfBz+rzfffwsfgBj+8ssr9egR9Q9f8kmIYCuZ/uN12db+66HgjTQU2A1W+gvFJaimv3a9ZwL499ZMiF7w9yWA/lBqVRRRTnXLYPVtJ9ld/ekRmoGOhkcsCJ2uv1+05DlllMfphEzNxlUT/jCx5YZY5Kdv4rDvvekfcevCK2HsJ3yWhKf1LZkftT1Lc/qhIzV60RbBf7aaZPVPOjumvyrwbj8bzWc+tvsUQix6Og5A9qDiraSpUoRxm/coTrGc5uHa/ZvH1r1WMa9+79r3r27t87wOiBch5REuQp0K5I+yahuU9RJQFvmy1LABbCk/i6W8xjDurbYDsU2tCHm4PHQ51NCn/PfZQuxBoYiY95EcmGDehpfEDBC2L7LkXcWChgbHIrvOlgN2MwyY7JZOWuI1z+IyN8y3UtSCrcgLxIRGbMDLW/NlinRGYbKTrk2wuoJrqt4SqZCTzdPP5DEeNqfR6ouTz/tpI/m20VhsMrCoZ6XSsr6eY2uemVd6YrsQY+ZYhn/2ACYHBG85c3tuJ+I3PoWXNK5Ia7RqVJeID0+CULjaX4TlMo7UzpekYTw3o8LjeLU5xYXeaN7db7x8jLs3RTuS6/epy3eKvmnmqnBisllnDirvP1En0Wwd9m/O8i3RiNKPuy4lHuHE0y0wBTbqIgjfb0bAghHO70Q6NuyJUuNasWhQKjyfUyYIiAGNK9+axfpWaCM38KoMVmomSOsSKIgRpRpfd7YmSYL3R+qIA8VG/Fyrk+SDAW+3wKAEQwHk7wKyeWl7vofV3fqLyRtrxoWgAHHK5Hc6z4vU5SorQ4mqzdi7z7XGyvE5svX5N3zx+TW8rN/4OewE5vYvl1KOd7KW7wMxbKX7CX8Gv168g1yvMpIgDt5vxuKZPls+UpWZ1v1odNTWVLZveJaQbWbr66iWJFlW5tS53l6NqW9heskTDJPWfP+PS/5Jnop5qQ3O5sX27l6vR+PXpgbFmY1l238+S9EOq4wbs3j3Ycj29sLYTA7FTllfXDRx6t3Z3TTZgt/m96d/0z+RzIpfJGIpcWmZhDzN4sNPznDgFHEvkHzuhzeFgSBz4A/Yl/5fGb0bzBtyo8c03ApU6qKqFaEbIE/4OGRvtHbVxj8u/Z3c0flljs+hLgWz5n+FTg0J+EREpt/YSgmJHSqn/dI5QudMWA6WTwjo2pBZJENo1HZODCNLBI3pCafVksY/7hXOUxGZLUB0IF5+dkGAollcdfT89UWihb0hrfNwa5Cq9MdiiSYj756550BkgtgyaFvDdQQ2xCqml1MUhl5X4VzTDlWlZgqDsQ2yF/haZMnxgxKXTCuDlbOustxKETMyFkSPgB9nMnGOR3BYM0pzMgARfCo4obQlvF7izXlLwutfUoTPBsFC2LIY6RKgiCSzdH8uVFSxhH85g6Js/GvkHQZDGxH/ljhdm8PBssP+4tljsCfZb9WsfHP4LVqSIK6lIPLmybO8p+9VqZSuG/QmltY/Vst+FoxEhPhNgwZlpQmm3otnLDy63hits7lSu+o6OBhGritziXUeUEUhhwxhWYoi9qJV6zvh7eIIJ8cjC8XM8lMEBbVbBD9utuyGq3Yk82pD0R2nKF+SPjEZNdIB5zaxRdgy9j1er7kf3FFEXHeCbYiQhHnp4wYXO6ktqSDJEpHUNC2TWlS2WETJRMQE0ePPzZAoq+tuHmMFJezSp+lgoiaBbnZFgoJIoMl5pUwSq6KVpuZgj0eJBUNc06h2wy6tc9zNkURZt6+EgHEH10pEb1SUiT1pfw1mPtyxxB1deBp/Mwe/vWjei2qy5+2S/UL4jhQf12K2VsJPG/1aYtU/bRqjqj4o+xAheeuuMfZpCYid4QgIsKlJN40jeadap1ZJD0lhqMAVHOU4krbEdRNde+0N0TeUl0q4vh/ZOcCP3w4W/kbQsVN3RaGqSCaWZDnVtmf2nILRXc52hmYcharOK6p2slALpA+19KT9Whh2BJs0O1qWk7i7VhSHd+LmlT7FyPn8tK8ZaGT51G7sG1Tcihdm7QQXxhZ5bSyjl4IekeCaLfhzcmTy2Ufdkg6cXeHOuRRe8TwFhH5ADpp5HqUxhw6KMsZLmy3BHQkzPPi9rdUR2K6hOJrWmXWWHUpOkU+wLj8YPa3ZaWabDJtVhpWQGutwBUoP6UQ93oFrrtKRDGNwZRRMMrFotlzXt/Vp1arHK1cwCgOUWNtsMJeeU/q10za1xBG6gS+s8pmkNN3JtdaALA49nXbxhUWXmroWE6SMXcIcDSo7eyIV5ppnkSbN90MS862omORucS/XS0y6bWWuSB/vymCcbCMzb/bf1w4Evmbz2dk5GnrHOyD3eq+LjEHuN89LUJvGKclCmNORJ38Eh9dV76UqMI70lMcqvF2UcTIGX8Sl1G8uXcpzmWlap3D0aKwSB20NeduWO9JhxEV6MObAGYees8wGRNVuVxLj4A1BdY7hidQXHuzZ1CcOSBbhSgp52hCtp1hEvUlsouUdo3ZiPK0ZHOJEbkGomSlru7R6UZlKZTY4um6V0N2R7ksdyWr1y6e892sVJR+quVPseWj1tFFQCWogRdgEZgt6oU7FsrSyC2/Opi1CQp6zVh5Cp8Z8VUqs2n4C4O/N1V4jLOpN1lUx1DskYhQbSMoCNKRnEwk4aJNXrp4riGWhvFRdcZTVM3t4IIFl7GOdWcuzd1mvnLCSlUdlXgLDMuxUEtLJd9hEUhn68y+X2SvFZtTS+gxhsGWlTEd8B3bxWTcMAy5a5x30z6bzKfGaOmQxSkpF1cocxtbxHBXLQUYzqoInJYs56sCdjXWdLTHQvVpNKVsTNkm2RmU9A2oaV8hqXL3aIcwRrsAkBXMLMVClFT03nzRvOovoi7d7jwY6wR2HIYlkUsdIPoVwN+IBTnbUHaFdQ3Jk6ZI8Ot3B8T6VFDIo/3A6H/eL9E5tcFz0F7f4AC/pvy+JIS4ZzvzLoWsQ9d4nUs4pz7MzvSuFBMm7Fm21LjIVuVLT59XaTOy6nHMc8AbsxcJ+6mLZpo7poODWecW5R0NarvGtm46ILyBmcK+bXLByBLb3pDUFghNr9Sv7ArYdw4uniRknVXmK7juf4iEItZkW3dTGvqTKWy8tZSLwilzFCBy4nFCsAdGL9Jt/U+iqsI4TF0LQnNLiwOPY3tURuAnjRZj0KwSt0LA0/zNL9yQZrYHHEl1Iv++BLPQuzpQNvJqUPgXaWfl6yah96yRx0GJFY4jFfseX1YLzGhbPdsWEvknCaxYwaz5HDpIm3O3SzEz932N5nkfZIHMkjlNr3RaT3vbUxC4n1xSpeqsZsoklKSgMY2PWg3lztN8X/o6coUKyYqGjfkOUa758gPzDR1152kfXuR7mvUCPJrz71wjmbPR1JmJZ5DAoxya0vRccQA1BdwFCidZubOrOsemXvj9zpQw8Rw80caeUjCc9XYVuRO3HBAQ46aRX6xhpHgVBF7vz1w+BCRzlJKEe2RJySTZvu8qQgj7w5PAnlls5NneM/+0aEYurqricijDCimzt9lWqqM5a1eDeH1FDeMAibVU3LgmBuRid49YnvXQxOqdV9aJQZCiqYXzyUOra4VUcVk/2HYVbi4Z1zqNt+a9vUb5cuL4yJWClQ/4vR88gBQ6DR6fc3qn5+EzexWu6sj2W5y0qdnM4YNWs1lWwCweM/Z6QRaTwfMRSKxnULaXnUPpLSFhDzwKJYpjGlsIGeGF/qyYGxl6fYAzUvwrtjcBYeat3gT0Gwjonu1T4SGKxV12pwYFYSNQjGX1zEa2kocWzfVj9mrstJahS8AGzcBz0IQ0TYdl582cEKbN5aHf2BZWadL+7huWDeu2iE/7oTIw7C1F8dJ2FVWoZ497N/fOreylAR9aUlGxXalxLqQAo9pDae0a6P+qSOdL0iZ1vi8T2att1a0cyRsqwDGJX7bsXRAYHfsJlB40K2j6Vp0gkHeN4JItWjD7loinjhD3RzHTCH6cx250UOqT3lulMc54En0eqJuyBjwcusHQHT0qqpfdYG50fliQSJORxYKcOBvb4yxB7/swckZKsdTbpRueiaFWmmdVv8gk83Y5P4ew3X7v0sfuXDzsANWu7fWYBDL6xohBPNck36LMGodGcIVteFnA7uY8rUrym1Q9c4+jEm8sEX1mtvZ18mmuN9bzGmLOh0eSv++MdxZcQKXfhxR7OceipQvQbnkb/62dOJuJfdNhvX7STP5X2q7rDbKNLYHe6wvPTSLhqzYcofstA49pUbMKuj8XmA7omZ79FfWh46WD6bPsvL3wNbw2DUOiwNbF/Tjaa0i6fywZl62RM/IZHa4TBmOqJODaquELz481ibXIquxFkNdgfQ/qh0ITMDDO2PHhXe+1xMK8r5VbCgU2UcXCkx0Fajgk8EGaYzSbsCxhzjWbgOrSNJ1hCsNsYglLhKbRpG9RiFLm3pEZl8Kq/DFRIX1RSBF6y/IfBAisYQ2Esp7l5cHthladiGeuGg2PNJHuSfo00+mvtUm6/aSJ0/a/T5KgDziojn3qUKEDRxp4B2B9QDHR4nnzQNaAyPgO9lgYiz7TT9bgaS5ORIJD5PnrNKr51VcizqM4McA90l1E/83dTDB5DDUy2sSkpVbXyCfooZIn5vgzFnfECxOrSeYuuUhRH6sKKQM9NSbEleUSabThBG784+eoWfqcwuVLB2Pp6V7RE+G8/H3e84HXNjw6TPB+THe3P5n+Bv9LpKh/sMaMd+XvIMN39yRhxDpjyXCqbkqo7pMpZd2YCnA7PQjQuGAc3mgrqW6fUarCV1OVtqN/xAzQtvwFQqLvP7oHSzZT/zyXTxW3nP7+KFxkdxDl/q6OhMJ8ma8JEjX4BiLgyyOP9rX0EdBYaVjvBhi+z1xIFBz1WegU+XAP/531AZ12BRBRBmkUiv94m6E6/ErUicD2p+1m1nmANc8mEQZ/O2x0AO/enrHZ42C5k4Pn2fBR9lR98sPuj2Ah8iBxFDuWG/ba/ox+y7vXvi6nTuYZv1eXFDYxQkvZtC9fCvlKozGbizKoHFvX1v+N9KLr/Xy4gn1XGErgOF53OxfyQei+y4LFxtS8to9scN3WJDOMMl7Y/G/n08oOQz44cGZfxnoca1cWI1loeiwPhi0bePldaVURWcIObte8jy0jUZKM11h4fRSvpJjFwANYYgN8KjRamxbtuw24V7bRVwXMB6fZNqdtnM0Vw5vQXv1bBms0gg+b2VbWFZNqWXXZUqj7aX1aKEoWOGqs6FYv+WF5rfW4U+ugLn3sxmxEc07/grJRbyYnbbhZWITyuxM4YUtLz+xMZd/Pd1ROLFHAejz8NjY/EPAaqlWRNo9/HspR+gEYhDpWIeuV00HnyQDY3aulS/nFxx7AF6NE5D64Xs5C15wej/nS8oZQoICs7jHhl0QqSFx+6la8jPPOd+V6XxkU4HbiNeClLyotMLFrQr7ui3PWyxUsYjCiNm789FryZUGOlraU7hmIO/BYA+/wfDtpoz6mQCKeMNMO/KwD3H6MT193jxtvHOjfY40fivG8PDj1C3t8thi/dGddR8Mfiunb3HvBpy8jYVocjiRm1gKZ4IYT2enBYOZbT0Nqj70nPQGnOyha6/b8KkSaLk+qBPJPTbCfUc2q2VKQ13lUt8C8aOymCj1sqYdDAy71SBqMy8jLkOwGI32s/E8XGUK7ba732nppInv/cULFoYKp+Ut066bRbasSvfnsZuzCq5pKwwdHTiyqApmluF9qkYehzN2wh2FHeALXlebdjolGTTQsfVxjUoiFA5h9tO9fGFzxbAh5NBb7rQPvFAmBKo7oPePETbqN6F2kAGs5NFbvZBuHMjyX+rrxnAUSUcjzsaDZ8bf03Y9vzScSlOxW3HibPN/PH2lidDITVJuVxqW13yN0Ytq5nqaWZ747LhMCrBo6l2CCyGrMRSp97jijDrL6oubgHmyCxrad04Qf4DFmE4W4njY5Zbpuf8F7U7m6pVWz81mEjtTAuUvC322xwA6ErFMW1hEBXv5GRA8lrPrHWn4tGz5HAE0wNNZfd53ZSezAWlDqg9fi7Cu01SRimzxz3RXEjF1mVtc8GsjWDBZ5Otu+XTdPvOmPpfA42d47rFNVfGV3jjxt+yMewPgTVlfvkcycy89WpfFFse8DUjj9bj2MhyGOS7BvoATDKBuqM+s1qdHcNuBaYnvTwCI6qsEW6UXsJNigdKjF8vkOHU+Le7vKjlSmMJLrcCgg7Z9Tsa6geNTqg/34U+N2P7D7Equm0lZD38zGoTkqN1EJ7+zydI1SwA/T/xkNoeQDuHgbiaFWA9fBvAuq9seiLtIr7/6zucgKYDqKog2nHcDwA5HnD6qHOcFk//8FO5XyXwK8jsbjwHGck+BF5ICOG5hYCOayaccE6oSJhJmmJWpmqIQ9BGw1wXrITbKVjC+7sbGpoMMPLth/dg7T1IBT425SlgYGRB7LhOFJsD1zCeD3ZjrLGHClWtH/ReD21cta+Bpolc4fiVVdHE64jxMBbabuhfBqtmSzBwOUKN1/Kx3vPlWV7hQlcKgwnXPTCRI+05dwcAPWUKwIPZfUhrYxPgYnCNOSQoR2NiEi/wzke7Mzw0CHsil+XYO33uXXGDfqYlVi2dnF+Gnq2mmiWrG7s9/GXJcY8XhKPezhtdDw8P2m/c1fbuVVhH7p2uiE11bpv+5QQr0tFazFRRA2oTQz8E7YNX1ubWK+wl7s0RDhWJ3Q8MOopcvG+KNGMMtMSVBmX3njNcGnRuT31mkCwbLpa3BiNit+kpaAOa859WjnalT+PLKe3v2bxWcT9NvuWi1QchfhRlsuMvW43xtpMT33Ymwp8AyrKxE+IzJBzl1D6p/5adaEmjBRLTnnEBheTyomIhoeV8P9dasDtMhBhbkZSL92s99eUNbN/PtTPvjdurZa7Q9obIQfJhNshMUx/8dTE3hiPSx0a6Oxa6K/Awjv6b+vN6uyYPbgmBmU9Tv/Yp4hwKWfqxzrZ+bZUOmpl4cb4e+jLVjT/TiWvXj1ONZTx8JB8nhOrInc7DVQIsxB0WUU6EgN/KSwn4YR2yqptYxtkomZHo2odmNPikygjR75RLVHPdDEgfGDnOvLd3atC9vVOnUbInf6BeuN0SL6s0+CCanIXzSxsFdkTWbcvbdv7cIiuiLRFXVetcnGQh3bDoakeMqWB8hIZIk/nLqAkhAfzKzCax+h+q4j1LxHfjVQSex2ZvA6gKHgc7t/+hdhH7u+Q4GQMPKGw/Rk1F7nPXzhdqs+svzc/8GjK9xu8yD22lYafSndEP+dYmg6177r4Rj/P0dU1fbRf/wo+qLBujmOMj4Oj+yWP53QeuQ1ElxnKz86lRZbZPzcX9ShfgIZvBwss2fNJUI9oqI/H4KA2Q/IxZ+Salm3wzSKTvIo3e5a1/u5HbYdohDrEaD4voP8bIdQTN6vd/bcT79FyoufbSOBtKy8hbD8DQn3a184nRKScl1O4qQ/r3155+qWAwLaseHsbV9IXzte3jJMk1ozIuxPRE9R81jZd1myPoU5s5kg0KZ0oTkrp/2AR1DdeJaNN47wAipsVrhzPyZm7dGIzL86UmuLtuqeMJKHfdYWx6vDtg7170RpmhuhzJ/TFyOQ9bQi8bmPZB+Ozt21D90A74tXJNb4uXa7BEdwUNAP7HNbQdqkP1YKhuLmbHsJqgQdszU77OpRqeqMPtLuC3pKPD4Td53VNeHjJcOVbKjeaoLDv+xYru4yF3i9u73H94QQ3nTFm4QDI+jKRboPFX3u2gNrRIHZHUR7OsT7ynez6kK0eFKWMsyV2nvoZIrb6gPAOH2lmMCg7x49kOKGApFHz+1pRiVsFonwXrM24MAz6MjnTNg00zp6isHgxYEYaIyakPnAynI4eN6CgUEiXNVqIwluGCFviW9RjrlPXMzjyJqCp7b9dhXG2lzdu16sNhCIVfXDCStsCjWs6IIjL3R7xsbpEe1yk27oLA5pBCEGNTfkFBygZkL2lP0t8ME3LeV5CYC5CZJQJVhD69nZ+dGtGv3IIvs1+OqxNxeQRDqGUq9vwQkukCRW76JImIgcZkzcQrENBhNzEIGOOsugY7fMQZUyturZN47bUDKHRNJHJP6i09GDB284/SkI1AqmUuy6QOoCGhlAQvJYKAiK2dO76MGluEqig5+t7vGQfUpK3CVv05yGcc7EfqngghuwVmG/ROyJzYAneuVAohsRLMboy00dpO6xYDnjI9SIjb09UYWcRMAubZ5cKLOmGiVBEcheo7stexjrQ6rntUpGe0T41ZZyTCmKdZcplRssoslKONCQwKOtJW/14tENvlFiOdleQ/aHnpE83TErmi0+rVAF3LQVcFdATeEv51t9CXSnrC9HNoY1YZM1Fj6Nk0xJDWcUaPnEyhwvMyQvArtmnfGcvD/+J76w2LGEgLF1N9fQo6cyZ6DD27hhjSeld0ydU0agX912RKbu79dh+qaJT7tNEZ0DUMfI+aLMWOn3xc3EGbRB1Z5yIxqFPsq/ver2Cp96OJ2tbnqirSIKe1QOIqsTM7JoMxwJKuO5NgwOZEoK/wjeOXg6iqvAlM2P3pj9tjmYyEKQowMWfTBQCePpKPvhz5BxlDFGB2FIgnmm1kq1JFpmZ/EbEeYLQMIG46xRsfaFdmFknkiYwkZaH7dSZTYOgi8V67Jae/B0DXd9D1AXHt3CQHj6htwE0gU6jMOvvbLYsMP69cfk5D+TnmEhrrcdLHZvdarOXE2OthWbenCQB0DwL5s32x8R2XfKrRYzm5o/POLLv4XKIEqcQNmmkQPk8QcbDhKk0lHznTqqVf9hBpCPt4hw767x6FcsH1SoHaslL6gyuqCbV0U8HxzyKmLyS7kTfkMs8LBOiqLggn9AXzBw/4sxc7+Hr+RaC1PoJqrhY2HCcRbUy/9xxQkuRZCDyYRxXobSTKOPFKw/T9OGJT4ozOiR/rVHxTpyDWB0CbDoCnD7aX6j7AtyHK+D5fX1Ui05fkAbZBk6wgUxthxjpC9wlFY6JFsYZO10kQqItdZyWy/0od7+k2jlWcyDLssNDDSPaB+ct3bSihuSXQLl1m89D+4wmRp25BOM+pbkRII9oVdW/rKeILZPHEGK27VZGPkTbZEu0fPkuCSFIfEx1QsjVTYE/1x7cT0BQPgCcO/CWUkS5u0EdOa3oYxNcJ2vZ7Kw94yH6P13VhSkfQQdWf83PvmzShh3KmlO2DzBWOMJN6EVzuLXx8RqSc4VHQ0wMawB9BhUdDYINJd7Fa7Jjz4Cqmy7QMoaqJnfAkDbO+WahPZDqMukkebH96TFTQ0Ko+wewG+Q0Rmt7JX8TYD/bd74rG7/4nvMDsPi/FT7hiuOktEtdOb8XOYnH9WTRKa1kcqF65JgJp1tTWTJ+WrUb3WAiAd4/FAI/g/2SxaVc2mvqLEN4nT9mwux0pjPqn99QAN0jUD4Rg80tqansGWp3fI4dqORvw27q6D4uWGXGFeNq3OtW+aua3dy+SvYAgoxMA47LAZht2/Ds8uQ+hfYpIyQL4EtTvh9VjcRFPxbZjMU9IRK5y9gejrufR+pySgwhPX5xkKxkHk3LX+7eKodxwgLIRlrA8ahfSHtj6nlKaoJISuOqSdj2n+oqvKRzYy7GBL2qj7ydFhgRV2Q3+Ut7KBkYt8aadtX3S8sLoqKnp32W+sgecqco28icZnUTEj9T916QytNGIqaOWeDU2Yj+Ilj3lli8NO3Oy9Rd7ZGEr4BjoNzseCenC7BPRxfZiTevtCwToVgH9/hx0W4CuD6geiOnvzcCKVOZ3XP3gTtA3Ar/0CNUM4tJJO3A08lStGI4AUr+6wC5SclSQflAq+fADvzoQqhnJqKN+wGvOW7nSeAJf7XHQKwk5vFcrKXe+5uuzH1xLEIGBb3OwrV3xg3ktDmGqiRgYO80I7oBeyBOBRSZngK+xcI43k8A3SzJmUsI9TM7KdadV+tdpF9LdywSghJ5+moO1C+4vgl5M5XlYh8mhPleDPw/Zp2Nbbzw3VGDkbv1on7F12v4hKcEQzx8F0X60F2jv7/ZAxT9SvE4I4o9iVHsqRzC/WUVgWAZBBIO+GgvpNXdVrbk3CvjVeOuAruig6wPqL0Xwa2+Pr+Iaul5Y5hB5quqrv9xhfVfaTv8cAMiKoL+agyIZCqu1qsNfmasdCjlYb7jaXzkSEwQu0R0rSfxaB8taAiKE1zL+OolI/kapvDEGjucao7+hQicCjnWkMi0HOL/Tn/seCYeb+ZhfdPWNCgtJV/ao0s6wYdmD84ojj0CzmdgEIrvRvH/N+lrHBD7r/gL3gfcI+vN3VxRnbvxd9FLc1TN4GB/Wu7D6GhGXgrXFkOZsVcdxmZfhgXvGSha/92VjgnbK4BqIaAHAVQWGtTU+vR+gCHbq05Q/cd1OzldVV4b1O26VkR6YGHTTXxPEuBUQZwQlHfvXBpE+QZ0H/xohgghq1ONaobohlfZU1Yd7RLvMxj0qTwwY+3a3dWbsgIA/7HUiC68BRA+q5GWfwN477WthppVqbq1KpVg7wx5H1VxzmjDQZ2l7ne1lJO5kHe08/eXtHDQVOju6SDpBAlu0uy/bY5eQXW7tj6o3c1wvor7p1bcOyvd3BVTdOKIOcCqCG95xfHM8OpmrekiPU9LeOdKiLfWGMu77RWzqVUeScsxVz1u6PmaCylukDHmBbV6XRXu/R4zZNIPXwT+/tVnt4m9bTbbjAtyX452xaknCNrI8f304RmJF2cx6GYLb9+TCwNe11H89Tlii12aYNiVXG9gyDcQWfH+aH7S3TAZb2to+DGdf3dEjWabtzaHIjPizPtONWZZVAgk4GW1FouZManIBNw1YcN2bI6PZhd2oLxhN8GcN5thYPOz1agSw0wJ48O3vYAjOxIM/PZhPgO5WbcbFOF4tSd/hj3XcfzjifOJhymQbl/tjVOsvi5Z0BneFq+QQ7H7cgZhbCka/aOT4dv0Pupn8j4cNUp8qPcZlHxfaz4tha0YzVGPugtZVoz1jDNqob+Dv6C1B8rkM9mrTzW9+wHaH1cZcPC0JrjptLZm8vB7YS//3rYSMZX7PM/u0hgF7LGjbWzfFb3+T4NS4w2ZdjxZTkTlPLL3FbEldDdsP32bZeG1KEvGFVJt7DVfZj34tsTN3H8YH2j8pUQSjXOcQYnwUBRiYIye2pbjUz0DVWtE7j5fUYdXDSJBlL/+OFcF+66iwdliGqgDiJAIpMxLDW2a+dbjzcjdOq91fXmuvHDmL2RUDWSJulwL827+jx9jmrrp7NuTAQPqirXuZLbVVfH6MmtCWvqx/uk9PATnQVJR9eHz+y/2NH+/nDNkeY7eEbboykEYaaa1RRuBwb4PvL5rulvnnNwgEm24UpLnMH9KeZA1yv1gMa49tzw2IkRUjHGgtXVp2buchfZ3rhk3d1OE4jW7F7X88w/rl1PY4hxgxRE5fKsHrqiWTpYiU+5XRgNG5XN4/QMjYLN7z7NQHEuhgOImEsX/A/BEuPi3E3bOT+PqaJO2FtBkVGcpvf7cDvvBNfOzZlEepsO9uHhLkbOqjgvHlwXGtXxgjZF+3G5gESz1ZeB8kxmuWVm626D0wJZ/5CaxAa0gpd37wFxrw+uE6JesQTpPX47j5+1D4x+05Uz1i71sqH/e8EX/fQ0OFS24O7O3PJdnBPLZEObnilmM5WjPPmpfHQuDX4X2iK2YYqXJZlzIiuCcsd4PNt9CLc2AqX2yU3X09vI0lIc5K8+BaTE3Gh7OkxDJCaXJEb72yekuTUvW7A0kjRut7lvirQsBu6R0iwTQfnt1i/GbTjO3GI5sMgF53Lx6/IQUDjzkjZp0zxwE3fpMqyv5YpNNxaDZza82tg4IfIVGNTHh+m3/cptksPnnbBbDNtUYZkL77nDq/9kjlVIh1fpoYCctlKOdpN24U0JUA3Z6DbgXQswLqH5DjhjWlxWGI4IMhRYT7D2P0w6RzLv152xDgJOzcpsgPNG0/0K/TB2rtLY7c5zkNFyDZslT97ZT8NaJIbfGqATGyavFfPVgK7xdnUiDr1MeN+jUJWmdDwIVRl8Gm+Hez8tuWGn2/fQGjHJBifzcsv53RdFy2hqTrEnp239JmRvY80SezWSpBvaTUhOd0myTO2lT8aSze/fbSR+8OP2jVe8sffWb7ZKT4g5pc/FwWnw9lv/f5FHelEnuXS6APhr98TwrXrr/lc6tz+Yb8Wh5tHrWyN7cHIVS688gTb5Fr6zv4zpCjCD/0MsuHKHi2g6PhiSabFB3fsCeg+exmXZVOXYd61cegm/PUlueRRpLWEFx1DIhjh8KxzH6svLt4xaz0LYoComhNLk4ku/V67Z1GSls8XVX2G5mlLIkyeqKQhdGTaMBjS59+sawb+hCxzmULDRQpgx35tlBcKd7jvhoW78m4B7gG2Vh4MTTy1Qn9ED9t/dbYxeS3TwYXf6umavMjsqq+b4+yfE+TQiAc4C8dX0dJHxVs2he0Aj/1E0D1FYAfkeRPDhKeLj3IxiYkf5Mw+UBzYM73PLuG+27g1JEAL5PhfpUvOhpvGLwUVAWhveDDKEcrMbggHRJuOnJvKF+Sa2qT8pAb8nAv6nro1KrM0CG9Rn4/mCiuVPnk67HHS0siK9IY1iSvQMbtYfOu5/m3x0lfC/Yhv9LknQzke0iR2LOMHPWRaNOCFvqjFNLsw82qGmyeoaewdxPd3sGsJNOVYN1OYL3W/yAarcHR7Pv32va7NJti2Kc3NdWBKWds2OnaN+XZYedxfeZ0+vLHjV0nLCMQYu0oWM6OgsS6UcXMHwUVQ7S9VbS/ImRU7YYnjdZiSGRYBQC7F5BgDrz7WPvNVxfAb8zKyekl3f5B2H5DFxnZzE4K/RzTK+qM5eDmAV0d0C076PYAXQWQZS9xvwVI2nazk0nfK25HWwsMGn5Asn3wrVkWc4L2euDnk8uOthYYNPzg55BLf1d02y3tumGrItgLuEhv4PNtoZ7fpewWd4mVyegkXs2r+WB2fyNuiGAv/BJFAsNh7a7GXWVlMb+mkQPPge/+Yi8z9iM5vUEkYdk/6N1v8hIlExKJt/IaTX6enlmzXsXcC+0JBvyLAcXCaQXrnZ1hZkQw9cfBohtHlnXiIO6NE6uOmw569xdhhbXfjKSUATDr7hTvN6hiYSrWiLsmW/9Qer8Xe4nR4jD5sK2GyfMCDP2jM/l1GdmcDfGuJyJWJspPCPBXL+C/OFn9h/FvX2XetyFPvctZjnifdv2JBX51gMZklWg2JD3eOGeITcn6T0LwgJxGh/ddE7IiHji0+j85VNlVjA99Q5+e0ql4fyN2t5Mv2+pIjLIm86Mg6cOOi81GnI/eJwxQMf7086PVmKgH2xfCNxIb04P9yvyk3RxI3G9db4BvW/C9Zyq3J+eyKR6WvofCYBVNdJLl9i34HaWH1BCHB9civInv7nkofxIi9x6FrI7QJDSbXxcuOBinww9ekKyGbJziwKVjMOi5uBof7dZ2EP7AtZe9+vtKHOqNMPCezeDMAstELm37lHTjuczWhTMKaLETpj1K4nDFdAtqBoZzaNPe05vsnm3A6x7VykMAetSfbvSQ6ExspGk6bFehgMck+h0OU3QoIBT6/RrwElyOGlNB8P6jXIA97EE6dgskpmt5NtXiFtuS7yCC3fQXBKlu6fcCy7ceBlI6ohge/i6o0JM4jbaM8cxfYOT7D3THkvyghnSqs/dOjkom5EzmTvl53KK9SEXFU1/goTL5XpKGnm92AuLvIx+nIXLt/TZzR2p2Eqh9ssvrZTp8RhJcPAGa5kHR6Vs3vtZmTVufheJz0jnI7o1vKkuXmpvCvatj8e65vvc0tFiFJbbu+37cJbfXOStgJbG0FiTab2vA3j2VTJ1xd3aOkR9Xe4QgvNF7uTfpHopk886R2IPikFyXcxL8AGSxK0okSveVH7vqh6yWUmgF796nPI8RZabuTbheZP8by4aGiHdKN/VfDxoaVgDGAThymbLX5Ebf56diKsOFQAbQLTUL42udQmzZpqX1qMJpUXSnBcQkbZudqwZJjy3+5KWYNm2UgvatCCfZMOMQ2xj1UT2frzVi6JWkppBKuh0PNt41HFlXauJ8p+3R5rRwzq/MsjxDQvyVAoH11NVUdBdWbXRnExl+ScYSU1j9ujU4/vr7OJ+IgQFoBtlz53Lepu5eORZkE3uVGnCRCtlo8niUoOTkKH8XljoNX9PVzaOh6AtuuBvk0q1i6LzzglzdPZ57urmlFsLKreF0gx52Pi2pRT02QpHPH5eFCmKmVGgFFF8tYqLz4XSc0gnCjRswE/jleABaphPw+lPAcRQYNyJi0kuDBhsTUTN1uiJZ+ufNrmBTXUjR1bSkV/EuIqVhw0Eq8L0rkWJ+5mSewtR/iloSadmFLlGsH56vef/L6NPETRn/frki/uHNe0fbWZG4fAi+6hN1JBK48f8lA1cVOht8z6Er783EszCD1jYtjIlfIN6jEem9Ml6Oi5ojzzJF/1wNJjXkDjWpR2iOflPSou0/22ouzIfjaiRTCA6obDW6NCQEYuqP3PbkoEofWCT48TZFAuDJ3u+1XNtUqN0nKSzICivxicEXP9mCWsRKdvAeKqbb+cyCUyyvaIuoIvVjttuZKGwedk8fiVc6/Xjgb2RAy7bYA13dZjRojbeRCKo5dDNuYR3HFpAa2I5I2X+4AQCn7Sq3iOgMShX0rm3MmgqAnC4ggjnULlLYcnpEdNDclFIOPCzagDJkcFNpP2K0zeYqCucSEWx4zV7FP1DlEXMatqQInBC+nCfvazhDayKutnJc04XbWlo2ExxakHw4LoM5WfBXgb00Xz6Jq2eVq1xzxcgADHHgucCeJKypdUsLNXAHmyp7sb1E5TNGVLcaMU9SYVupJz9BZLaeGE3LK38itF9lnW3SX8BWxgaTVZU9vU5calKqIzVMBpeeBB85pnRWoyMmZMv/SZjmo/UT6x+7k/+uyMbbB5Y2jx6YHsGsTYxUQjDLPcjqXyT8/WGS785n4fe7/pwWtgBsWrSydwYy+XQpf1K0i9orK0cdTT+Wxjg/DL4jwvp+SmCQ0+fGKu//HWXMkitGv2SKvT7Mgp3958hCFSRYaL+8FMxf9Otwmc5K6KkunIusuRDu607B5G06oCYKNVv2dnhzXknQ9134Kc7ICiLNFgPsZP1TtG97V0xk7smcRibGgWrHqkbMK2U6ffxfih4ca4kUuspQcWguOYBNLHeyZoue2eHdVO/Yus32g6iO+cce2dwksbJz34Z1z+dFJeIxro+FU4MW21Y7JfxIC6/rzE6XqUSKRTqIX9K91Ctb3xpXxH54unpWxJ5SieWmfTYGq4GhgGwJloLIPM8Nn+IQAr8bloGhg1aiwTCpH3B2J895Ev9XpsdyUzCZ8VOvk9GTr5Ox+ReznTkIZyKEHR3E1BjAeQbI6BqxCkZq1WPvWblJ9QKjkaw+f/wT+jO5Di3SgqoZKIz62kaM0Z9x/dX0p7kWhCtvrlkrG3BGrqG6em1BJaZAgQO618gn+1QAGkRJgSr5OFJpNIV4X7kQYXJpB5bXqX/eZJn2QCSpl+8S7N4jiQorsqXSwMjO/C3KU2DsgHfY3zW6i877BvhfaaMkFpzu+m5F2/swXDMhh7ltpZ0Muo3OPxdkTR++lEOM2DobuM38bZkbebRkuA/qtZzgK5S0Jv9p6pvZeaCZy4Fm4+KU5/PhERuDroyiHIXxXexFnxNqC/H3mtyL0wJ38+QJw5Lqxqk7FWmOzir8VMJaVjceity+wbcaLh44cINZ68sDD44vziY6zUCGnUducou4Jj4rXqTUcJN7ZsoyihTRK9dOWfdOAJEbrmf4eEu4TezHIyH3CwW4ISuO7slseJkC3JBZfNKXgqCBP6vzbsywSXFvzXmcK6bhweabcG+kh/BQA/XLASACYWSvPUCljc0B1kK+EwwFXXe4bgFBrsOCjJBJUGO6XDO/GK52PBSwNxSuWCkFxpqmlsqOHfnTpXHHSg1wLx54ZkH7ACOFJBnivo6MGN95aSfVJLQdSXAtV4kQb5tYbB/mZC+WNlObBsxQzQelQc7noQaVq5qFywJ57yKLu9OUd8R56vtF7gQjvbgq1s5HY0qsmb/5mEgr3AM7no9dJUPC7Tpb9F2LkZp1JqHR3yTD2vc4x2gnvYLc3j7zKkNN+0U69oSZSr7tWchwmTbPKeLIRi6E383kFkMwdDroJuXGeHhIc0Cmq9uELA45d+oNHn7dsiEo75fzS2QXcddGYBudtyKjbRdFuTt095hOhLSp75yhOWZhWXGbE9wxNSIRc/tHbOBgcRedONiK60BvuHRH/JTzFXeLZve8pXJbjrgpQg6004i5UE3utR+s6dRbhRe3OxedzbaOapUCiGLTle5KvmUAqs4dK3c2dirRFGXxVzEWLo9LG0MUuONCnPodLrtm2GGE7+15L1SSGqakjMqcAxBBCVBFOpW/FcK2BZVo06pRcz4pVjpXxjP/5mc5Oq/EbEAgnx/BNJyusr9h3xWdq22rQ7jDy4F2q+AcN31TvAzV+MQqmu0qQV3l313BDgZ8dw3aN4TtGesnvXsxE0TGhVYJH2EYia6NqgyxcwfSIJK5bZIcJ7BvcToqrhp3iB3ofL4r5VCk0eb5nHgNUo5w7P2PW/VoFOvaU2xwLvkHWm6n9af8+MbBD6z0UnsrsM+sONBzJj/JUz1Uwg766XNXaLnCDGrMree3TrXyVhnKRvms+dBwhqGIoY2hGEIVg56AObmFCe661sdJw7mv2ohUbBSTPvBN0AZgDgXq+QEYC4+q44IvcRKGDupAf2wb/UDcxkieuEC/X1en/tSM4jKZ4+FccTtIv1j2RprX9IwTI06kOjbiTMW3Mxk4i8/EGcVC5jgYgC4hZbrEuLjJI0iOLIizrstVBAEuy/W5w0PCorOYeDgWYkzcho5VmYfBogRAl3ihBnFO5QvljekTsmZEvJP0JnLwk4ZXNnrwGe3DkF/17GjsLkACF3KebkdAcB0+hOAlKDs1uPFoAHLBntkupfGy4HWK6FkD3TT1SCwfguJGqkUFg5k4SJuRNw+feWWq8Qc2ukyPRGRzFZvZc4rkmPvYZScXgUaBfyNTRHwrT+mCjvKHCDgWf8+BP6NH+EerWbA/hp1p33AuPEgbKhO+D4gx9icE7dOHlpNHpTZ3DgsTwPpH2Xe3myA4A6n1MsQaNN1IBr8Hfd2kW4wJGWqwbSgoUvl5Oq6+DgOP6qYRv/wB+/a3u9KB3bjiInh2DCYbNPg9Oaw77BpwXKaxuEx4h1tu4jOpy2AhzFaJ/iCjhUKFOhfZjPS1zJU3BKLqjLhZKMywlveOKpylxbcYpDEIWFCUNfTc9LerzTvT3M+BGQ2gO+IgyaV4CpFO6j4gtLyzp8Vi5vJLFIu4i3qhKdcDSvpC3xZUDaUb5QCci99cgfO4rkf6pO+vImT5LtSgt8AyrDI4fCxWGqyq1JCc7FKMp69HQNI9jEFLCyITZyj2Cu4mtZMS7jiQlrQtjgPmAqR1699dVlSScj7GIVDa904ZkpdqlnXmVUsU1Sp669Ayx2plgqOgc5nMg8CKOx9kXEUBKLTX9f9O8+dgyh/V50oZ/ghjJQ13arm/GGfn6Lq9gmggpnNjp3PNHHnJfNgZGFrkgn5geGMOSPlZOReDvT6mPCsLDje3Qs5CzLDGWurq6fTysk9talxP/MBtP+pmPFXNpAYWJkgRKiY5VQg3QxM53LFi2j4MfPw5a5j7FEWuo3LCjmxVEYtxQwDEFd5G3T6ZuzQpBAUwTW3Zh/a7eqqzDj8EauSe3ZBr56c4A+fa3RB339QZ9anNbhPe44GKSdlSf9ES6XKqWJuoWdSGCDgvCjsqpF+IRSIm3kYqA5x+Ti2LbtksE+JM8bziosPTC2XuH4Y7bWz3S3BPtEzeS7VbtKgazZUzOgKGCvtqmIMyUL8b6VcnX2LHseskx9i7x+zXfSc3tel/JiUw92le2Ad0t4+9dGcHfYdDO/CHqlxNWN0cNEZoRNOUZjO8bCMWCY5mAixV0hUFRJ5+xaYTe8yj9N1i/0WPCvMdewvgcfw/1bLOh+G0RoIPR4hvfsDALzDF9bra7YNG5WEwbahsAS59n8/OONBA0u0S9yfGQsF94jAyzgfG1j0fWDcfS+E/ronn4NLcY6uvScmvwlN7FylylHK/RryBswR6LE3CKXSm0e0hQ91Z0phcNEQlBRmNctY/RgbYDGtUjC+lrBi2BNO1Leu+PhKk4+bgjJJaA0XlFvCQnBLdfm8kVXFOPTWhMLHwUQXMScH4ZtCPDlNAoH0bq4A0TyMAqPRG9MxCqsgplJ7TNjAkxgc7LXnJY/yralCWYKgg3uzxem5KtZCsWmiflnH8wnMTjLtFgGegkeKYH2BrKDj6fzcflSHQm/zCR/vTFZkv7fws+4z/kJwCEKMajqij+CasPuJMpzrdlzi473ka6V/0AETL140Hyfd1xxrAiuMDIhCNLDU4zItGILUFRHho/kr66NH+7KAPX3LjT+KmeMrSvGhoqxKIIbINKZBLcZ74asllEsVuCqO0CpPEPkDngkok+FIHWUNPvW+gwWTPgFcIl19qLWp2caFXgUzX6jzcEPS1A3Qo1MjHJCyQ9cdBZ8nV/V8Gwy/tKDV809DCfkjOIdHYi+RS5FEvaPafIIWC9et8CbzuGYYyMvOk92aJm1343sXQFIONNsGZthn9rVfjuk9yPu+ZV7Li2zn2TXTKYd8aWBXtGPNrcnqKz1qxYd9FzwFUP37a9TqFRpsTT+QJO/a/7UukSuQ+3Q6T3yBzjAz2Ssov/WqZd2hJ01mIwHH/wmSaJxfNtmQJhHQmsRP6adbqx930Js2HX9lBz3EoQa5MEYshWlRMoYIs/iu3Wm2NxQOtwYg0iXtxY+ntP5weBSFKHWCmubnXb5rp/ucdQKtD+xIK7PS29j1t73WM9U3hCrH6GQ7e1t5vIuQ77HSIKr1QELsXEppvQ/+ZlakVYRgd0LOrVRn0pbYNcYHOoX4N+nfA6MSuSBoIfDdZ/+Yicoh/wdtXUDY37T3YByLq1Q7FRzzf1EK+l9F//8M8C0Sn8zgQ29D2g9jSCuKEO/sBv/QSF3EV/gkP4ssK6Ke8zoQTBOop/6U3vOgfylBijZ6TyzIE5CcrKGz664WL+5YiVbgvnYzJOILpKnZ/CkbRukePPkGU3IkHIysnIRRJ/oqgMOE9Ej6uqhuAkkBLdLwRquBOkzHInrEY9QpRJy1DhV1hyMbmBtwwK6YEPMC+fEFrW3nsiMdoD2KWYqB8LFY58SaVrA+eEyUZCWaE8I9befoydFbDbWOCPEhmV3slf1rjjw0S8s5/fK3lYQvxWkp9MkeDkOZdQWZuXQXPiBNIP3646dnDqNMuEglTdtOX8gWjpW76tvsyVCDL3+k9k7VwDTuvUb3qTRS46rMSHR+lDf6OMLjXjhy/hMWihXXdbMWGUtqqveqPxtFTKjDmPG8PLRsajvFvJ4pFooGDAdVOY1hqC8XT38UYkO8o/qjKtGIa5B/wPstGPBXin5OnhwHYtR3rntV8n4xT9ei5MWLMXQtFHEfDWDxv2SfcM9ZOQPsEofAWl1KdV9yfQ8xWB1JV14uNNh/QNQpx83JtOX5t0PKPeHc7Ddf00HIiGU5vEI5lM1UsTcXCVfLzegf8rj4glg8a2raNTr+XNIo8JkPuLZI/Mrzdl1u5OeqMT7bPLgDRwpkAfGBcQagBO3lwgAPZc05DxigNxj0AnyrSxMCVy1ICCxhLjxhpbJiOCPo10RZHhMUrdp9nVMEn/xN21vC2dbE31nFsXkRXd1YhSlJb21en6PBOpqPiOJXn961PXP2zHz48VDZFxQdNY+yUjuyhVkSSZTcX8OmblPl0CcXpu1u029ry7UQv4PiSxACPW35RSWUUCa5RNBTRYLJMYS5QTC8OKlTauxsJv7Zj79hkqHYt+j7f5KB0LjNU3EiSOOBj5xVbPF4ZZZhkPgjNc9StYvnR7KHCZ3fdJ+iLx70HTmaa/E73ditffUq700fqZdyoirGyqb6c6euQ1gwa2EaD8CunQcB6chN9V88zYPFcLf7AZ3va1G2Sxq5/DpLj8nzXsWEQrp2Ez71yoEKhQhV8rZzOTg0O9RFv5GK7SxInkzAm/xmigHxyZ2CFtxLKPdbGCSX0m6rIJtNWUeJ5VxBYQjv8kBGQSoKxQwSPUtnmmyTzXj7WTdLmb5xRyqVodUgU7HHBB+Sp4xgV1C9EfqvOUDnVCORVh/oPkPk1BvxcGXJ4Dg4/FGc2OusPVP5LqR+JHHCo398BwKwkxiGKcEIIC5ipTlP6pXJI4gZ8GF3J0zba1JY5IpVtxJnbCRmSIhSqzGb/5PI/ImVss0qx0hSPaViedEFhWdm863GbJju1YuQG7VYJL034GfQV8sTwCkWRRTR5UG5zaC1quMDBFOWhzQdPX+jd/rlvvy1oSnCxOYWKVlbsNiWmjuwxi3va/FlRbpRuANXjHayzdUl78Bav+lqmbt8n/BM/lGVQSLh9F0ZgKB3UPDy8CxsaPKWB1BJkS/fFQNiVvoS4WlUhaTXXTw4SoYLPhPfqItB7HP5ZNxLcB3z/OK/SG5v29mMchU0LATltYAhuVweoMfxijcpSlNMNkfEGfkLNMm3qrfOQG+R61EP9h1zij+ESv7BtcOEaivrggOMMtqd61OSG2FM9n4Bhqijtp/7D3PAPumHakmP/UytG/p/AAhX9L1jM9gmwaGzQE5etbv9D3alFURu71yQ4Y2JDrpGTewtRVH3GfgTKdX0wgK3dMOhaun1TRAgz5CnQLPHVK7E5sVeob/bk2PEJTQZEQqi8L9UBEXgCbeJsbZPqItqCW71L6eJ+yqGvN2RQNwNaahCIragZSblGxTLeGB4AbVcTob+aOqppoF1N4+1qAB7+cEOFvJyrPTPcbFetjzv7cgI1YrgRpZwUr1cwHPtr6Behjq7JdbyT3x0IOAD2QKMUP+ocJeh5D3YQjnDYhtYcGttrPsZ7bsRQ7RCSxGgAIf/ZydotiZECbuwFLDtb2l7vYRIwnY0bMD7B0waAfBxqAxnG1Tz44sd8188mN++eedr5Ie2F1b6flT6JxuHm4auwGq9OXLlpPargD6kPUWv4khPFa8jU9iw88ACIDQJdGAFiYBtU2y2OheHhSnMem82JYyBApzRw6c0Laku0E5Tf3FnL9OvH8Ewaanf4b/CVyYdUXSyq5OzEWlxd/JhnYGifCgrbOtNNsIjN4TrCVGHku0Xh+zIQl8j1heER7L3hOBu0LXcxISMrP/Ej+wtty0P3qvh5tBhyR6vjKWGSlbSDkLZJsznXlFeLPqP7XD0A5Nm/70kAgCZR6gHtZH+15f4eXHRpv8YLwGyqb0Vj/9hQAEXBxidItD2sKlZPHtfML4j5D1TuJuWrYvXgOD78D1aPjquHbU+IhxWCesByCLupUx0JdFizD6LNOvM/hErKFMeTv74nPm+geswcf1RpaGHd+LE/lv/4wUPMi0BCySI7YNRHbsLSy1QgVK8C8IKNNMwOgBXQWQpfFuBoKfyyBH7/fwfV8ICyQ2lwCDyFVExiPGxEnAXFQaJ5wd2zQBjdMfJtVoKpxKUiCKdRg5CADUoBo4RDLzJEkmgMkO0WSbjJSjxpXErQFEQA1qgg72FKMCeVJoAN6iC4k4Jt9JY2Eq2H4ReBJiPA2HbwsSLYHGYkPNYwI5jXAmW4sTIIww0YSFhHFUQhIADgaamsGY6l8ihwIw0zFCDYjeEJHLyFHwBXwj4AGBhYQZBS6ULMInZMyJaYwMHAEk58WSPNHlOBL9VptRs8tQLEnq7lU/Xf0OyMdSF4GvBvFfoAH6DZFSsQnqZ4W5U+VvkNzSKWkXg2vCah1iXDsn/YToJn4tuqtEv+DZbdoaXgucW/q9InPEKzBzRGeO7ZMRPkQAyK3ZUYA8EyQxOJYcC+KpVBZmg2ByapAMWw4uhKVZD/oNkK9ZQYdvxNQhtqAsueUEdiuMPfq1INPkOzEvWRGB1/Q6je5QjNajQ1Yazx7kovQd6g2RtqCsaAEOMjcJF9kF/QbA9vtIAAr3GCrHL4rbisys2d4t9Qfs8Nl1B+fzXsEH7/rfi9Kr/fKX678nYr+Bfh7U/BdVXePiqurssmKozWFA+zXHp1j3E84NDyzct7TFN+rfHl6/9aef31z+H+ZNQsjI7of+GfSlOvnvhnR3dp3uAvoynKT34XvEf5gd8tJWle4QT6t1ZbzAX/oV9hnqWlfo75QLfUGx67f2CX6X90m3leW9juEy0MMrRgwHj4MGsNInIcLmAnvh2uZvwwrZkKIrNbUDiyhHbILXoER+4xFPZDxpXTN8gF4zKlORi0TYOilb/1zBUUXeyhiDKJ3UYMjubC6uyIgm+HTkTCTnt+ozv30xwo+CU0u8cgRnKuZ+o2r5GCQOIPp7sfvxwU2AOPYId8ha+OBF4HiwHaOHLP5BOthiIHNBevTmXsocg95pkCrYMNDnG8Hlixk2MNRStZ3iclBOwSCIdT26bzEgr1tIEI1CzDhqAKdmud7MSyPJvZCUMRFFBEsdQ3FGgJNfe0ATanU7TBwCNCyYRYYWjwS+hsVhPeerqrp9ymSw1FF3ooLGDXKBiUMpNLPVO3Q1BRdWJgKZIpEsExaPP8bka9VslEdAQ5pjssLgqkw2IQmlcXzVqODWQdp3bFxZlqKC8uZNGZgsj4lcX1Lel6nlJkqGdG4CscxgTi28O1MxNFDhCh9ueBRQFFe27c9J2O8I7xOSXwJ2S3XhNgtZLxGjFFZCsijp7MrMQbJXyvhaTkDZ1cbexT0NmM6MugAcZsTBu7qgj8kGdkTe/J3G1NiIszp5n1wlD1l5NlZI71g6qHgWM64nRe6J6FDF5hv+WGJRSDrZ8Bub4z7wnfeknqyKd+eHKoM9kNQbhSz6knPY72GTl91s4PP8AXt/5aI7oldHJrlIrYD+tinlUV8tRK80fUS+zLPvwpPf6ly/yJhb/DmRABB5GSYxF/GphuYzoYzraxZM7grPN6BjYMG+R1sj66/Zsu4MnsKhz0zF8Lm0PKCapCTQGjnCiC/ZPx9sCzkNnbg3YSyTVlZglOTstwIEAauLy2N9HcwQjrYFGhDvaniuBAmLPt04gX9qOyo1WEVoQB23+6v4+/h+HeInrKTp9ReL7+tO2qu5PGeRdpJ5EdlYQn/ASYMAaB7g7DA+Of73JSedhlyFGNhm48DiMySwxwZBm3Ty+E52xM4+1s6jq4Ija/YXKRpF2+Zd836AJYwbQ0KFlAEZGO1Yn567XXEkYtQBQnDQCK0HmMEMhPCyKw8uioSrtfi6PqSz9dCjP3cJxghAKOZLCROMznKb1V+/2aCX6VCp55QEEUUWSenc1eKal/xlDQBDyid+Q7LDA0SBvsoCO8I6uxPOq0zGSVMNjGdIKcXFwLBJn5eVzZXLq1zf/Dm9B2GOxt5qDhHo613mYiIKZAQ5AYHByEBElHQDCt9D/7F7198pFkaciFCaxgoipuVkHyiLgWI3NrezLD4+tZ3gmiyem72TQxmhwPZcLoNEU+m/3nTvBsjvc5cRp2Eom7fI19r7qlx7TABDxXyJvh4F4jIfJt6rh6vXZmfmAAuAtATLnrYG5nzLWrVXEGU6XI+eLwqQFF41j4yfnr93vnaQ4tgZWEM7yTCCMc4XoziOPYn81IYOD4KQqehgwDxtt9KuVmVi/MI8nbu+jczjC4zZCDgDzeLDmxd0cCTtmb+bvERQf2qV7mybQ7KbW7CNRxx3RPrhMSdScKBwDHo66GaWdsNO2zNw4U89FZ4ssYUDj2Mujz4hFiPJxN4WSoxL0WJC5QPKkFQ+BiCsQ6OysZAv1uxViem3Omu/H/jaJG3d/QkeZ4YMdDlpF3xfngM0bN1NV+CdLXVnLMTt+oKshhLMCg9IrtYlznQk6J8pgh5ZV/tU++dLuwKhSHyzg4djUFSTp/FyvNahMD+TwoKlWMHZGq4fkR8VaYbX8/BxCj8p+eFIQsTscd9DjUO2SBdcAKQwkRdnQsodALUyrI0MIGByPyxpfLAQVfVc45UgwmLxm9xQW2kuPiSNBj+tIR12kcIaiGFOeOlgmfkTHZPi7MO6BCI3RsH4vTRJIzsdErCmIpYyAivFisd8QABne+AOoMaSROlrAqEI3jxLF9K3vDSZy4Boekyd4tHeL08makzzNZZEwSzcMkOgbLh2kRu3Bf1L/qaFguUuJYx5mLlJPJfb+oYoHUAePh3hwGSfj/Xz/PaZS7xMPVrHbA9A1ZmYvTDrboo0t8vI/JmzRDv7iYkfDMIAxY+XJ2/ya+LWWe90v0/cxCsRY3jVh85hxtg8vg3cI8zdy1QFTmlK2XIxx+K9LgN7GAQhcySvd2LnKDVhkC8sphH3Re6V8vCsTyJyunsuQah8XBKPNRoYiDWU1gZat0BBTdSF51p+9CxVF0GTNLfw50TMIfhkHdrSvvtG++PX6EaTUaB2UpzdARfgFF7WJC9CA49Ie0hCElEG09gWQ+c2hd7d5hy6AAx8XZSxsBxoO3NPU4bRc/o1jyduiXokMP8YSZ2mnEzaGXmmzAPozg4vXogAotfIiWw+LbqrDrAuEKQHVn/WPmB6VwcIrxXAGrSlVtDdm/Ync1BW/wGhbJ5E7NUnyDmL4S877I0RA9DpDLGbYkb5CK4lMg5Y2uT0oXPL+q7/ONMb3pYnM4C6kFbJNyX5MvS3atRUwbwuH5EnOdxAdtmtTe2HET2l1hU9HpRCXc4cLG+x1ivhXcHh7B+033s5g604x+oJqs40xThV1qXJzhBrmD3lBCJm/n9CC39Du/3h2f52cvn6gvZYT1neXxbX2TCYots+9TskARL2av11lrpej0WNnbauH96GC7fLfea3hwVGczNbiis4kb7FYph0Y/v74gJYCIzMlFm58ucRRzD/tENg0omGqQjOKd04lbWY4D1opF0KbR5fU0StgymF3msUzZBBTryNDAXcnsYgbDg8kH4qsAjv2JYITtp7hnazaOYe5K6ei4/0v4nZKfelWFbGaZGesDrXH/Zhlhw6RywClbR3Fxjrh8+vPcwaK54vzhYpDa3NPkr3e1G8/6CdTjPpod9oMaW25oQuHbjZMyFFAsHPI+mIsOkvxCc3VC5Rgvx86Pb2xDcwZ6KLAMelUyPvClGFUV5BglfBoONkrhjRLO/ZBW0u+Ig4Mwq7qFYMNS+1hIvPCZC/QienUHv/B/9YzsJ4Nwryy8v1Y/Jq0no3y5HmwcJmTBTzGDo2+TNTcv5Edr/GKDicjlstdgVx5DK6wgiuI97dza6FneFFp8PzJyhSXFSboVQ1WdtZyL8/q8ljv49xOTtl5b54mvB1OZKRCrwT4HsUivQ9DPfINLcpxc7BYn8BWm6j0yl4nF+HAAielM/2g8d/IMG0UU4JV1y0YNRvNfQy5zB1zltXeUZdXFqeRu0t01heVd9di1b/vPTBj63ZB3PoNknKsW7UkpVHu6baW3v2sIQsxZhYbI5CFghw0mJaw+cUVH0VOvRB+LP/8iTvxHUW4nLdtBoDiR8xPpXn+Y8cPMFnDSNfY5OxaPkIMugbGo3C3OxfvRaaNipUX79uMjXH+UKq0yyCG8IbcKj9v5di/kv3pGN0cW6sQoo6joLN5MoGX40kTgCnyQ55lZpFY4zaZrATqFc/Bo+EXwOXkCdnDEWvcAjZZJRF9SMmTWfBJfcHIRHX5SfAuO9wvpPgoYTB7OiE+rXMwpCap4OZu9/DV1Z0JZhh7BN0JSLdvFKdnYnOFdgZAc+uAGxNuDTgVcanIO2I9xWiN4h1lOUtjaspRYEd9kTKXcUgu7/KyTTV3iVIYOH1/NFN6CLnSI2OD0TAuzlWWA7wQ1DaNpa8uk4VySQSjNo8qm5goJNiGi+8QGderC+JnmY7cWWMgI7q5lswm5qG3bNOfCHvR6QZFPnAuiJ6IzmwJnwvRek2ydQXFtocWQBkFFl6KrT7hQRAaFz0x8+enD7cIdrHaIi2805wNmoCeNcLaPQaIJg0dql9yFWYHAexTKbVr3WciFxboMxiR1wJSrwOxg6ZyhLkVznC1iCbYiQzHuYFCGswrYVwh3wvkKSasvO+UHmFcsZxMYHGXtCihJLABKEiNASSoAay3KALSkMMBk+5tNDLjCAoN8zlWG2Ukco6IIlG2VkbAxZle2ZsWRvymcXBBYBYUjGXoMI+i0gYxiMgDUC35lKtyRSSaACr3MI7LaUrxulAqoKDp/WUTDTNl/QXXvhLDtegqtFecYtS9UcKxY1TqDkH+SWLX7aL1zfefDfBRBVtVhNGY5vFlVq/lt1T/gxavcadAn3tYzOocYrf7/VsPP9n9binlwPfXDNg0pESn3pMlb7p0AY3nuIkF60sD6xOf8Au8Qg8FF/XaYqBkUiY1JbtNdJCySY5z3RdmvzclZWgnIRq3r6ikhjG1bpzrme7g7wiDMuEm/9OSQkEcAzqlIgBv6foC4VHUo5sybccEsM1qNneNpQZ+93IJjiEbCBny3cuxUQ00k57trdnccgJWPZX6/K/T2CQs7yD0chRRf8bAHSsxsx5HIP3bzWWR2AnO2plC3Pwd+K6NvNL2p+c5S4iXUTjDBx05vQVtUHAT64A472SBWZ5foMX7py8z7Cr1zgjKj2RYkNrO2wNBHJpDCXigC3f2ctsJgzrFk7b8RGLRZjcsdejnsF/5YdNQNugfBhgA1gdVDC1RQmJpLVg8aJsxkBKlrQumqSstwnDM7ZedBZjGWTKUXQbrDJaDoHI3JVfRhAEAh1IoFMhvKpWMWm6W6c8mFG2GaqLUlihxEhoi8GBRdfMFVlhVHI5RnnmWI6pEc+D6nvSF5/KnYfjlTJjmTk3pvDLa+Fdc18//2IRBPjbbSgG0bg2fDQWhHlAexTwgrTLK24xdZJc3pGihMbybsRNvEZSYUV9waCplz0mZpcoRldqY4qRYJ1fR1r3jatHlmnDPwTeI2mE/GkLmlRJQ8G46vfIsQSdwR498yyRKLQhPIDXoMtCwwfuzimQ5y8rkr6fPojEHvZyiBVJjcvnrKg3AIL0VSWIJLIzwfxqsANrICuNMCXgG23oWCgBb5kqsIUkb3UA6yAbH6+mjCmgjfto5aguxOoCc4JnDeAYrQO7vmscLoVYHsfEneZXzj4ZAxy+9WgsF7lUlEfDBhrYFWBO49/qoncwKGLLS6N0lpSW6JCThyvPzb7WrWUwQtUnZeTayms9l+nTIyMJGRQ2wNL8x1HsuSD2x1VmaOss7J8pNPL85m55lFx/OlTp8ruzgntnZW+VdM/wIrHMe2uSe2wtrNEccBKw4wH3LUbQgJGu3HWJCwjDZ8mZaclSebUdYO2GTlyS5Q5s1whKx/9kk+ZJGNIQ7/Mgnw2IP+pCugfwD6wMJZ+EFWcaCJ0ItOqmi7IZApqLM9Qd2/TedKO89kH5lnG8JegOj+Grp3VEzXhflBFZiKIFBcwEW72lecMRB+lJaDW0sTQlj9sBKbaD9s3ErA3ZygRg0rmH2ZUT2UTNCs68Q5dThxzgXH9A6UBnnSvctYMIXqDl2IhE7PFAddmBGuafp1jKIQiYaboyN2YCb+3E3D4iAkjZcjVv/Aaib7tQZWGDgBqRkWvPHI+/1hDQYx1LfmZuBj4CyYTijCuWaEwokwiNfJwHS2/3UMAmH39H3MDYCtKVVEchUO0quTEUmC4cLbwh7Yt7+b1XSTIF7wa1WhpmUf7718NHG1tRcpzPJWgiEuZhW9z4aFz8zYxVFLkmG4KxBAAbD0w9AbvlPG24bknDrDB21RlBjFW9KxvPFzpdtjq9HHq9UtZtHTz+0wwB83iuYfIuFt+xMith0mFcAccqXGcX/N57+JZ8kOiuRtOn724Z7hPA3qibzcJFzD22YYwIoUR7VvlgJ+WywDVm6kCfXKLVPrixfMepNO5bhuGhh+7BQwyXYyMfDq4cBG+yR/hpRkmbODwJjBj2XTM67C63YJXWETaS6lMQWUvMH2Kg1Y8/thv/0lkjTvbX2SBL1MUYvDsMxMCRnyFgXtvYzgBjWAaTLwdTsYrI/zE6z7ob3t8ufquqHQ097jb3yxkTDsRFw4TsRw08Yrz5/qM+UvsY4dPoEmlhGWiAO/cYj0dAfPeIS0ODdFTh+D9C0sfYa4TaiiWKVE5PS3S/fC0n+q9J/4TF9cTFZKwKeOUdmF93TmHPm1PioTZ6uBwV7UJGo89kzs+5xOZf41/4/D6+9CSR5ux9ywG/DBihP9fNEx/z5Q+6XWElhHRfqaebnqsaQZ1Y4++m9a9FbpiKhY73Femwg4JBXZ77neV4CC5Dcfz9rVDp6xC52EAQXJkY/nRyjU74i3/iO9fLrnb+GrRwJb6fhCyI2aScmmlwj/bvpAMQk//2u68eWmaxKLWAeFT5IAxSVNPnqlEBqgscmQrqXuXvf39GwJ9z/fSHxOCRdGVcYCiruJH8AuH7yY9G27Q5dGhQsdzbvyD2854DBeqW0JxsP2fqFEfhgvxeCS0JTP+0SIBxJ5RzHfk0/mNLDgqskkHimmfnX44LjsFzWca/hXkNrPub5Qi1HP41MHsSJdvQbXIgpVvJTRF7qfAR21d2zfpelWsU4yLx4SrIx2NS/lDzNrVsG15PfCwR+3nf4vo+H/MGEb9CF/jIDv7gzYtu63jfcOC6kexW1krF8tl2n/0cwK0DZjjtpdzHn0tKATpav8/MO744AC6ah3iMf8OIwTOv0bpd9xP+Grx+43gzU8tm97ayjSCe4e+z7dW8vigxWKthM0PqTprVD8y6qLn5g+5N3nPelCsmP1hzRTb3A9HNN7ltm5s8fnJqFkeT3nITUS7jvpJfW3D7+iJpSOlzqMGo2hXPVshUXKXjHcfpccZ/yE+8vv+L9foFhrFjdZwMpqlljOKbTodrGkt+qUt6/FRF1AEQVf51SR/1+oXMnxdFg6elMTSi2XKHGkWWIM43PzTmPQTVj/YbAZgC/l7nr+IRaAc7JYyH4HYGU1YfcZaabAP/Io74Oi1pUZGPAvQKe5+4jGaukUcoEUja88MBaHUufwN6Im7HM5oVOW6vxF4hZU1KYcPkJLp5ALoLDXX52KKM+vwySMyBZQxMvHwSbq4GDEdXy6bipA4ffY8GUgSboBugsVpCtYJI/wZHn+2EnECkOWsE2PtnnsxOBMoMvhEBjtQI3kEcQW6EK/sCrWBdF6DsuGTBCvp9s0ZOdPXUMpwuzwq/K4PBudrAui9RyWDZkgXk+3aciePP3RLN+PQ6NilAg49n/2WSXqCCiGb1q5FODim0c7JDH7XRF8nd5cxbB8NCMQt3NJoLNb6f34ydjmDm7XhPPL5/2U6Q4iolhIr71mtIi0PGA6SIaMmA6SIWPS/ZqiHkxfVCpLZO9sw/d4nJ6NGKdAFGL1HBhCHLLEfMU3TjQTLd/GUNtcP6Rpz+Lna6fTP3axoOOvvWlT/XrcxjJJQnQctxG9iW5w4gwcFcSsCukitBJOGIEIpMOIkF+vL0MM+52IhWFi1WVKG7bLKCUpOf4oV9d4HaDTP53lBBcX8Tkx8egqXrgF219VXcpKHl0fDVpwMpIeaBf3y8sfBQvru1pE1EIL08GfVb9+LVbc3D4WHUp52789uTfD2Ea56zrNiJ9lRuj3AEXOt2H5eN8S2CLeti4idx4+LSuPQBS26fGpomsUlIc23ybuPpS510fLFlY+wF7hIyCupUvIbiX2qGRiLHYSMGihMyUqdcgwiNZjTCAZ4pClji+x3xlRmPXTj5ihlw3keE/Wae/YwRBfr5F0tfmgmpxlhfueiQzeOTqmHnGeZc317ZOu0SOIwUFawIYmEA5kvgQqztXOhikNX+H3O9R4f6ovisJLoyEuRbOUKXC8WQ1DlMtXBMPzEEp5FnK4XaRPknqSPBcStEw+rU1o71jR73jDBhAH54hO92dJX2w/CBlucruavMRM92qPPZu6mjg54BI/OhJ2EvhaDfKzomtuizoF+bwSm2O+3CVwmnjHFajxMfhm/fvydTL1fnm8Y54OngahDtxVJF8+FZFBDHfqO32DsBqBxep83vwH5IAy++Nx9+RgR+plLyv3Hi/QgocBIHCHRrQ/b6jXge68zMKfwOMj4A+A5DOBq5gk5wxDhqcFuWgF3VOrKY8yhdSAWnL8tBH2GZsppxZ2VS2okArCWlAhlcQHkyK04V+9TGTvlljJk/1tQ81APBvOcyARYb6MCf9VJM2a1/4AjnBCK6pf0mved0Vxjf+P2eRmUd5RLGcaPaqU/UNAzTv0I18V6G4XPvGV9PAh32/O0/sRaYD36JA3J1hhkCtUqsPC9aJ0fDoq0SSuPLsBnXRv0Tq2A9c4M7JhKmdhYIaFsCJw5WghQkv45whZNgp/bv08eNSh3/GgI/qJxcQz+pvFwnUPj+EVKqpjRT8gESUQL3o1AOua8qy+DyTBQeAv/pG4YWSlvQilQANsDg4CQqLbjiR8wlO+S0rqQkxWQrtLpysiUppfSC4lq7VB+U/EFliGxOoM4rSlTAmXj6r2i2FxUb5hd1W55bkAbhb/iKTsyUEObb4THJre3T3QE1pImcbFREFZkyGjhCgebM+onWfy5EGyzNRVlXUHszIj4dr1GgqghegTC3FSmujlHIJSVJyOGZ6ViyYQtPWvi5PUuEDvXbWvmOBhJbeytZTnFvzUtLqLQkSHjC9/TodcD5iWc7wuO7oLEOVTSsc3iOlaTP4Co1QxuOdQTVHQoaTBp5Ulb9ti6i15Pes4l2Jw8pgdh3FMgTWiZEN4X3FZMCtFVf3zIFObHQJGlYy+xuqnhAPDST9c6zqqL41QoESYiG1TnLsVA9kDtcQY3+HlTCWXn1jTPFlqfLcFe4idQuO4jQIAZ1GIrkMs3ScUrSGxdiG7U4wceY0eJxZzKENrV6ErX4r5AoMMgNloQUhC3FfAJ1gc+ucO6pTqxb0P4zDTgObEUfsr3d8NP/qyAZGXpU4Esj3h93YKNK72qnrDlkcT+374Vh/jrDkSxWIaBz7IES81DddrfEB/t24JD27MGeSxH9YgcP0rYWv0bdbomEiWY8V7nPl7gTVRBwRTQHIEotH4+zfM2Rovj3ecUcjV/T4Ue38pOo/5OogeXG/UDGfgoIVPAd5Aid1Mc/35HbVevsDUvxCFTe9YTd8xqF6ijM0QAGwhbhDmSX7jz+iVtXNNGn2nbutOC5/6FATLJg6u4KAvRZzIHFTy3ZB+pxe0Bk2iuyyN+BuVjTw8BP32jFjSw+NjyqXc1zTi24y7FVGfILytW3me/v0k8+UTup44WKBg3ih8NuIs4Hy66DwjxVWIpj6DCU5ktCIdiJO2wQtx949xCPDDyv466zL/VK0wkUqfOsLw3HuSXgFZ0LD9gE4oeFh9TXLQRX5uBXb45CETAHOJoU5BRATtx28oO/GRMcLisnBpMLWyWBi+ADC17MvcS7ZvXko+fxEFFq6/gjabWmA0x7Gn0M547j87oJrgY+uoleEhk4guFyNBb8nRCrIbB62ZTSUIOSrNk9iZZ+jESn4gu6UXrHKVkQfYGk87vKbthYPGCXAKHnXZfF/B01+hz57uTAkwlMBzJgHdPOVC8KmimNZgxBXBbEHtEIBh7nBmmRIdRQWnwjfIZKk1uhOKNzgp1RVwl7Wbjki0weCjWoNSCB8Fjv2cuQwFjLWjKpWxYB4Why1NgvLe6wPDSLj4mWFQvqNbMg/Uo0Y65YF0id07Pv7rhfrXr2me8ClDzZw5TqpQgEd4nY4RtpMXt5D/MnCi5nP8HgF7/DUz7gyX1sWcHD/+hJyPQLjYntjUjKqPTgNqC9jdnq7Euu1gMdSZqqTrLtb2ZbhF+AYhH56itX4RrD9plIM8o6jHhYHA2Hy2hSd7cTY/pyi7MH3BmeUBYFevu+KtmTYk88aTsap3qEsg7T6XkhCKvbb6O420yEes2IAqPOU+ay/wn/JXh9M7csCUweNFlJ/d1yWLFTPtlxv6KjckLlahwqw1ipI2STugtP8Bhp3ZwKpycNQSGNbvxzThEcI3RPXX6GnOLOQYBcP23fREsEUSC62DYnAu5oa5vnAmAks1TSKdaUdgm9w0btlcFJEQmpU83+9GjVaJhlgNu5NPyo2zxSwckkc/ZpkNjqH8et7v0ubxuioMNSdGcn2Wph3J/FO/XFiV8ZhUdyVJ/f2dZYqulAErHfcY+hzJx8dBs0qbA1cCW64iG5zSrXiwpf8aO09RrCgsO3Cdc2mjbtSLfwvMBCxWrI5d13zHNwz3oQODTjf1p3rFVNN6V5ViETOMpMrKpE3qLKMfYGBVOZWnFCVezq7AR/TMJKMUzV0Roo2yKANfEJ+PNcIcnFD+3zzafLjS/tbCGvB2WLcAmAqxJgXNrQWDHW2REs4E4n7Ldgd2tBezmgKio5bAesqMQwodVLIECjgYkQ3YeNrOvy7ipCLYhBoyNb3GuM8vYHmugaZ25X1RJb+OoTzYID0iUoiHUGK0Kc8Rb+whkqwsV2JwEELJhNopjX+rtFpes19/b4mWLBv2no4OXv/VTouD3JHtHqBrMDQJzFy+Opr1H8eh7JCqN6TshEPgRt2gD29Yj0fs4ht6PwJqj4RCt3wqkCZSqadl4TskvqwLvKa7qZ/9HJ4u+JDL+tyk+XhaFEgbkuwdBXAUT9EMyQ0Iu45LkWTpdZ2YjozwPy7FQUMk80Bp0jh+nMCjEiUPF20/DizVae/M1BPWiAmUHzwiplYGP8XpM6wTudZrPkIHmeP2GNV2wyGEH+eEQJEnzzsNaqOhYkj7FbkzPAqDU4da7Dx+BoHah184Re/vniyJQ0zXaQtXnmuj6oOYIcX75TszbzqxoLz4cDHrgexcJ7FjqUUEePU5ZxjuL6QewsTe7rAug56nqMHG7c0CcuJFBANTdrur6mFz4U5EdXcdv/eA3dgiZR3xPI9umLbDPBtnRyvB62U+mjfqpcXW9ghEhGq5Xac0CXSA2fjP98Jx1CQpYaz95ZA546kugE9tMS+bUIPj8hkM2Pf2Mz4ayY/S+5gC1q9yM/nyq+wfWKv3BmzmoD2xNbkZpsVVuHMIPJM1O2blQnt4Gq1H+VR8CDEggHosH1pODvwJi900OZSQqT8LPTnCfJ3sEclYcdWc4F25+KcctPy1PkVif35ubZOaLo8MTsNO8/a4V4FBgo7fEmleMS9/G9TAl29zFkZ4QQGF6avCmBEY4Ib84cVlHn7/XKGk+Z1Sd2yfzdamDc50hgkZiK3TdyCevcRAkAohcXq/Qk0qDlMU+uwyuzawQhTDVUjJXaP+v5KHG0AcjOgQx5l/korTfObkBLASCuuxpBIWJyGRiA5b6cMic06MnJvyMsvEwFQQ1IkNCOIBXwUGl1aTQ66QS+LjZWCGzKUOHC/RuTWbeGC8R0R1UISKpxZD/RUsKBY1Njac0N6DIuBYcKLq9Uc3FdlfewyS6xv3LMUAMupE4vkVaLUFiwsXtkkKaKPQj8AEAeorjzkBIqNJ0RkmWlhVgdCLeTvTILH5n2Ri0nZYpUQbHwGt4IADii/PDwpaTsocl4Zv8BgbiTql3vBmr44kRmzIVf3VxVdDuv7I7k83YwccDwsJBumZIB3jhaMOZ57Pn79LMzZ4JjITlZfBvGN967VkDxv1S9SmeSH1oMvWWQPgy2xxWAGGhxLofpLs3yVSXPmyTux6RFfJ3SeZwSkDU0pTdWOhTGxjCazwlu5eVd9osYVsXrsa/lwzr5GkOZzXwbQGEyPpxNM1ojDCUv9zHcUXDscklUQffSvc7+oUDAocrJaaih7Y3gN7W4e/sEgPSv8g+3U4F01xBpbnty0CCyS5Ycvx96VCmv0N6NxoHNyhEM39EuX01xqpSLHduTlgC1H07j3Xw9eVTVUOE0tkSA0KLdSM5FkSS0YPJkzMAb4u+7GclXys6Qhvd5C2E0AqZpG3nt8xCc4IjBHxPd5CRVK1wEn7Vp1axYSOwSULtTuk9qQMTkCEQ2imLugbyk0zWiE6tGFh8OvGAQoOB2ZYt5iMtWjimuMlNtDHY014u9liQtLwmFICccogoM2OYAbfQP6FPT9ukZtKivDhBMNgQ6iYyIBVQYHXS3l2EVSFvQ/gMCZdgBveMId1zhuTfSMuS8EOGUw6hiz+aHdYjnzvQbg6gIYOOND8xMcpbExiIaJRaJZitrxTwLnh4lZZz9ni4VgBq/JhUZelMEY6uNMSz9MlrgjJdqUYJDMfiis6jlvAZMwOu9nNvoY+M9ltC4aw71QXD+rrTU/IEbXOJMusk5yOOvUfEWdkhWINEp0V0c5In23AUBVTZxD739WWFH4ZBmbUnBj68QDzIIyv5BfYdkd25jSEhIp8JA53mpKWKW2/ReQuYTSZ2TJw6R0YPzKzXUEzenshJiMGZCYldfE7kzxlREwDZOPV/8LWgkDU720wXoAoIURtT1vw8yrGOoJ1NEYSy8eIY11MR1zFGOYBqmo3LeqSD91SU9/qoVq8Hku4ccghjrp8V6xHB0w6Or0vlo7T8D9ojG3c/ZAGzWketShm4Tw9JJhnebinuBT/OBJsrVdRL9b2cTdHa7K/fWlXxKgg9otM61ofaGm/XS1yIU/8HpKo8KhMIpLWuL1LJlD1vhPDnQdxWh8h9pgoBxtNj+qGkSxK/A+rqWYXqjA5LjqdIozfA/InzNiQ75nwmvRlBgdc131boEA+poOATYa23XOjEvx7MObXDdy0cAX6G4eTtYip6mNWaQTp+UqPqBONaVD3y7t86Mq8mm6QOpyA4DXDOLr8WhFkS7CBpJ+S6JiCUp3XgC79+8DA2ixQiPkyLa/wljoSjWFK/QnqzPHPGKDVzFzwSGL4nqXULGh8XyspzD+tIxc5CcQHdbaILyXlYQFqQ2anT3QB60VAotpDShd9/U2ENGNqCVL6n7AbwRZSnL2JcvJ/7M5Psw4kFiaEas/uv+kOWjfn669dFAQiRNes02vDgqmBCbC18Fmb+2/hXuENBHHjXTZnFO2n1iakm/gx6TXIb9w7jl/u7lk2RXmCSY6LLPr6H8Cup6tmn7yjkeF389PYa5egOQaVT0d3zocPqeB+5iR4vcAFP9iDhKqykrR8JvT+CZUE/Lmmg+oVWmUJxWni6nOK46BzwVThr1dEsRU/Bdv7z/gdMDQPKtNVz+JXvLzNxGZMiTdyEQ5uFieeFG6wF6D9WvJoegrVaSuYxk52YYdxzcyZ4KN7rNQz/1K2Nq/nJjFjOKkO5Op41lwyHWBko+NpIczsui3uKXB4WJQAszr+4JyWY/6gB3s4ZoQI5jxXkbZIVVLQ14f8zEjNglIr+L/XMlchmfjEdIfbT1Bn3EFO4SnNiLBIuD8wjGTZoNTrLdDUzCQ5LUufjltaQaxpd0q3lUIUckXntvts/saIcx6djT+6teQ1jRJX4aSUwWuS8TUfuZiG3/MF3/IaOydXh/veTXJkuqaV/m9NZ6r013nTIucLSbAZTmbtCUuZP3LFusqxojZJj7bq11v1pdArE2gVdaVAR4+icLRvM3x6a2RnuqLTDwSP5C3V6dtLKTM+tlcK3NzOGldGxzoW2SpW9eWgjojfQE8J6GnJqlc7OAN6pz92tSYFfJnI0DF1jZfE4DM2ke/78+fdJDy/t/ToAk0pOYHpWvJWno+9tBXdWZoCnJvzq+PyjgpOgxgIVLsl02HEynpqChKwJTnXV/sipnJ/nqSYVRW59e54RQeTPYEBy+vdX5H4NoNnLni5YWhKfPrRh1XbCHn15xwfd+P037lpnfA+S3IvL01UoVpQqPvbVxjU2mXl4mSlnHPQpeQ6d1zCLtrs0jMKRoE8eH7BjM/ymeNMkJH14o1DTAeS+HJmGoX54QogXH1jKwI0nzraKQhGBbbUD57VlBFib49tg84EGfyAPfVbKmVfrO0oMvAwKF3Qgf9da2sMU2WoPa1QoByeUXHmd84dzvoGkGNeBnXNQG60z9SqUbLTUVN06Bo14jgSFJdlR1NzxxBQc3WLtiMuL/UyFkGOvgTojcdVS8641V0CepYYs87MYSW7ag54X5q/UMWz/YdA2kurUWAYonp1R6ALhi3ysGqJNPWLTAbPyndD62iyicaZ4HILu8VjCGq4i9uiZnmOKpwvoh+ajftw+SszspNDnPf8MNMrfHgTYSfM7rhvzNBCYT0Gw9MNaV6eH6EQTOZpFOmIp8GEMXIqRnOGIkppaK/ZCxOlS41PaOpUJYmCFZhQk+oml0MW/2qMk+RymZBWeScyMBha62ifWeV76PrWJXEiRjMDNwHs4rrIr85Y0ucRbFh91vdWFWUKnEkgBu7yf2MICvBoCLRongmDZlMo7pHRisI70eAfFVqpfF9yUXb8NBrLA4tjQghFCXV7UgY4SMSXmXK+qgij6daV9L2NgGN8iU7FvNTPizVpYfderVAuGcUGaHBIf8HM2xJg5sucZ4knbFWHkTX0z8fWIF0s5Mgx2xWrHivdBQbs7pHBUhmNOp4CIWOLIMWRFTvI6ODfxDqclZwwhZYVeUywWn4nHHyIYudHxuyIkgd4TLFkYOcJONjrXoKGIEPOcZZw9TOe+fGic6CJVZdsDhJli7KUgMerg6MqyShsNuI5FqzbjBCrvUQtZxol3H6LTbmQVS5DCmng5yJlITgn6V6HYjfLoNlk9glLZW6Mi++E/sYYx5pUWlfLO2IXb0MivgydNNlVx8dEJlGNsswIdZyHhfTjx2aSrrLjJPE3c5QDK6fC2SNhNjP0hsRH/Zga3jwq1sogDU3Y/A4pyQsUFLK/n9hMVWUugQMZabHFfRfo37ymGmyVhcIwdjDhGCTswTZ9Xioc4e271HE1Bc0SMIjtgTPYxyDX3NR3cZq5AkIwOsdQsQ++RBSdNx1ldZP+eH58p5Rxzob0PJkKFR3+1XGHIkzg7brHntL7Q0CDzBluFxqzw+Jr2espmNscT/ps6CQjUBCsm2qcBtrNCGQEktOmq+OuHNgDM3gMnFnKco73FXqrgJBLeeS7cIahsCswWMYpYSxggViV8Tm4kDWFbzsFhO6aVYad8Swr7oz2DogcLelrOGkFoGudS45txjPswiTBWZD79Q5dmYOBIc8gtfFiYbKevJrEzEBzLePhCIncmXp8NBs0VaQazklPz2YkJP8eGiqZS+PrZC0qIXX5mhRayMLlDuUJ7BGeAuKQpY4vsQcJzSj6lExCrntJ8lsqklvK09gj/BfikKWOL7EHCfQnIa9RcM10X3kdw7+e/FmhwTsS3VniK8XrLE+/El2Mgo7Pkvn2+K9Ze5OHiZcUCP5GsROT6BhaUEtdygIqvxdrfdz42Z1E90IGKxfZAzZxBetrG6BPcMQjuAZi1viGtBCvBQ7SQrwWOKVtnSNehetZ8w1pIV4LHKSFeC1wTVvCSheJsAZe727OqDLI++9PlU5XfGPxmquNknaLlBXT/+bP6dcJ1FGuxHGMEvTGaU/51RNwUkiFHDABUiEHKSzmgMjwreyX8kz90Okm5+Cj/BCuaQhPoaVTyAlS2KNfCQPyBT5zKh38Gislq4iskf/rwNNwA1C6QaM/Q+b5YmPyKbhdozCTuKAbjvKg5v5L8NcTUIdTh4/bN0B9gDyc1wOVYDgDWZOCJmDpdlEc4dBskH4VFGpauR9Ml3MF7rpeDQ+uUV/T8+2APgjIwnnn+gPqEY55bGfYQna7qEPqFAIigwoNFAqWJXx78FBIa4ChbgituD/tHCSM6CSP39/gJpYzeReASvr2uQBoZ4z063dWzcgIZfJ6+QTnWZxCqF5wMmPwC+Jkw826A2EsC1kouS3+t6FvIEo22P67l+ixqllW/zRHwEzUGV1tO2ycLErRX+4cr44o4CQ05CB0ABtl7D1CxKpNtBBq6Cbrjj6vSzXOzPLZeGa4xONIOI5QOrAA7ddA2pvIHSLoUdAxO1Y/tyGl/N1Q6WHZ+Xs4hPy9hUYDJnwbenUwhRzZSgLDpn7o/EvLKkkzDQqAn+OKjDdJyPwk+9o6EsKqcw+Fdhr4D1IHsQ22N+7jJ9tJ1wlpfENfOcx65BJV5stvbKdu4IHZyukOG9hCTEnj6PUn7AZYJqADMwx95Bv19wAG7WfLlXnJAjyaZ+CuGrXwGgylOSEz25jUxX7lmf/esvl98281EKtj0gJZ/6B4aLq5JeKmkNDvTIytxLzzeAfj1ovar5OMisVudKpMGraklGeBUBWFvKoOAVYmIzuLQ82MGTSB1OBvTAYx/fDBcdqnj0uLFDEzrS2n1XwmJ2e4OU30uMfYSnn5Sjz0AFtAbYoW3HJPY7j7YHJU8FQJlhmSGtbidQIeb6YvAraAwh3qixoVlVVI/YCNJ4RsPQUWMbNKGkHCgZuNW8MORapleaT/qjUUg5/8oHzYSkTQ4gdnbe6j0r5QMziE9kUb6GnX1dX8QFYENkjL6wQCOoXkG69RxyjfZmpXVL2VKcfbtNouDjrC267BNwgKOAArih/yY8xW5EUcOsDPmBIZEIVY5c3T2XNMSM5DSpoSAGLxJ6X5ScjkEZhAxehXINSnFfTHNIP3F7Ka/oSUAWHIwoSis5S0897cbDq5IhgZT0BG9w70rY//yYf6Wwe3DCblnI+hbDnkOmzFLhcc57TFIeOEHdOYp2Q9oZrm3/QeQ1IrtQVcs7Y1T6LOwTXdjkEV9alQOUmMmRrGerADT1RG5XCXFVqfzDwV56Db5A5i+y+mplYrTHubxjqUDM2PHbRnd2u8/aHxrzuJarGvQhxlyNLsoA+8ty4Kdm6LD11hG4zqQDlo6+9plr/ZIrAWZcfLJygCBEEbKyd+puNDH+1uHhsWaI60PMjbcHk9i21L7WyixVQxwWM92cXtYHMXwdZD+FhfsZmPaqblyTnMHk0vPgAIOD9iiB6l9waL/tSX0ACijtdonrXzFozGLbT06jGJg2pksCEG46HYmpjWWksqtIFkyJC2tAmSZAts10SpXjdHamkKAiiLyR/dncg/04JV5HEnvsFE3wndej6Rh7P6JkiFDFAXyU32jpcH81e5+NHCoNwnXdeKlFNcJjaIfQI7ac3N2Wu0FXeAqdruaDCVLib5vHVP0U7vsQFpyPkGXCq77wYQaiPRsZdDNgHLZ3FXyObglqqxxda0dNMvKfs8g9iL1/5/HRPt9WFhfn0hBXS0/kF2u5sJeY9rEtDFbKi152+8r1hXZ5Zvx7SdY5Sn1DcVQS0k4s+Jt4R4Byn/23/ScsP2OEAVOtg+XyHL9y4Ygl8Jxn/q3p5Npyvox17XLE2JgVVTRNQqUZQmFxovdKYTfBDFVEoiCx91A6uXuf08a8n2SgZ5MZj1oJEH02Mb6gGwgCbMMeCrRhc2cnxwWZtfp0yBi2VCGj9XLh1iq7A4NOle4uANxSWqYgUQN3JJenr2LJLsWbVCuLZsQJQiH6bglLyzmIwOFIXcht5U3+hG0wFZjYT+3kootnGgVUVXMhHSMARlb/o7IpjC+sxrFq4eYLCVN6K39mGLLHVUFS6crGqJr7BJDMUAk3HV50JhN7rguBqHSc8gJh24pNrI8p9LQVRBKwDq74xpyFL1ZTcXMJrzmIrUcpmk8tZrAhRgah4A99ZPJot/yePhQeSyAu+Z1nZUM+zWc0VJcpufLan6of/1YJrKYqpXch5Hc5mr3fULqGTR1AmtkMkbGbpzegZtJ63XwW7tim8pYPFOw+bSOSJ+aLqYlmjp66kmZsSiWaA2DMdEHa0IFJfn+4jvED1k+84yThQNtJXP5HXRbIeuHQutBeYcyPkURvkHOms/ZHWKHkUpa1mv2ycsqSJ7RP4lUOukKMvjQQwZHUpV1B4iH6xSR5sHY8Y8NDh9tBJ3+GQIGOxqZBFQgmMqVHsHZshIVNoiiVmQ/oDNrpHtiqfG/5sdL+tqhFapdCEudwspepP6yiQx0SXtfjWebVqWWfMXd6QIsCV9EesatJCn1+s5Pf4wnvqFW9WpaJQrcSCwXCs3Ugak4460sxPGQ71mCeaT12pY8w1wf2iDMk0QGDxsBo0RTbpaTRfDFDDxttwFsVUYJQRRxWWINJs5zounyfB25FwYKs2n2H9OrAq1nzzBptCgbqGF0+7SB3zbtnS3JrNLzXsjvd2rI7/P8PGadJ3nI8jJf5hFugNdQjGRxdK/fcKt+LZMw+ZJ/FB98QQfvC22BE08wdNWsZzjgo1P4suuGQLxObZZXCtjzzf5959raFfKCdYSrwR3S9n0hOqaK7tngOCtxDiErG78JXq8HqTpqAg2Y8N9/0zU4+X/WLq5RRCeTyws+PLtvPkvgGz+oMC+5mP9jF2AqmS5xbiXbBNH/zdVnLMF7h3RrHHCwgZiJTfT6EzHoOrDIIMYWihOxNOQpSG/F/rQDiFmunOjgOLj9mSAUqnpz8NBCtnCLmrHIFaA43J7MEOLT4RBSLyR136XE6az6SNxtk2KnCpGyn5u6RUVQr7aIjlV3xyc2Z0kYDLJZj/dwnkQyUrHwWe7grskmOP0oVGPCyRUlQwbC4h8nvD+jqp4PAMs9kmevambkNCopI6tJaQ0ObHSwpV/fIIjJ8mr3eZxqQDYDsXgFg12UOIhEmhkEL2aMPDdtPaUOWu9f7t/exsH6ev86/Ols96pXiIjuv4K96eb9WIIREGVesb7ydPvY67k39ePu58fTuR6m6QwuLUulp9oGKz2grOw9D/MRz0jJXGHfCQKIIucQ2t5Xn2SMAycO4IyC+KS3cJGy5T3Rp3Y9F8j5IfZK8GorJxmYpTqfNKvwQNbYg+JB1XKx9s6zJNVtTsOI0CbqWkVvIm7mLiIBeOIrq9OwZoPwWLTV7No0Mu0maGPX61YJhmhwKzVrgyY00aSBFkMnvnzhcuI54ICijmp3lLdQKEMNXyXHSnPSlwTisRgbSbkVAN2SZyhq7oTjga7y8DiFjnTyzW1flLjhJb42y5yTHorkyzMsKWoiEs2qYqJ+jGndccqnahARfu6zIg4N+CqSGxSoCy4GP3BMhpXAG6k7Yb/gYNLw9IxBWSBdAnUzPZ1sz4K+JZodrBHUWaSQjMQDmBSEmpktk3T/FurcGGU22GDY3VJyJUMWd/nVEbjcBc3X5mpCSMZtw7Gg6NIqw7YBo4EVRwkGGS+4mggKRS144MgvBngbBiMp794Vx46kpSq395eHi9zn4G5DVD0WR/xA4W6C4JLa1oTfdddSekmAvNYExSIASlb0yUCmAnkEsgQrrNznTVT2ZRZ80sOOQM6Eh6C8mCUeFb6Z5LAh/ZqHwaHLfY9OyNG5gO9EpNd6HkBe51sT6uxW81n7WR1hkV9RnI5pVg7Tmi4MQyOOQ/9tXvE003ZMSqe40TNFnEo4fLKdUaPawJgaqH0xN7JXBBMmuAgoJQGLcHuGx2tzyjq4FbLhUHm9lOGRdHZxW+pIKbM3c+e1TGaXOopR6EOYp4FPE7+c8ZstPde08KPp45+eQrRRed3oggSZ7eHRflIO1fDYkSplsv4DdbTEuCNmR0ni5o8K/EDF8PiFKUBApj8Jo9PBRwGQi3V5It6YlzTaoO5juZbbT8FjFQiyoQvwiAqKUa99fsEHhF5tDBkOc22aUl0cD5lgzFWdKP1+JmuclqtK4vKGIIbIK6JqJnpDbsallwKjKYJ/4t61Jfi8dd/17mRQW4IVIjir336b8vweZ3IQEOQ+6hKC+NI16tdm3bqz9OJWK4GV23Upv6b77QTs07gWIZ4ii8ovn+j+Gd1XrOqq0+LRFssC7zOseKrknem0Y5XoyHoyD2uPNkyfm+bNC6ygerWSu9gewYNxBRpj5ObZgpTecSZcnbZM3joajH7QDasHRJTSINGWohorwmcrWcDJslCXR5sRhsckkYyvMYGjYnnOBO5ka8wf5TT3++P0aJa+YSBES/DeoJ6PQP6WCagl9dQ2iFHce0Pq938wzVO8+t8vjGnbBmWLIW+wCi10VlExYRcrMRZJ6f4OmLQJ3AaPPWV5OuXlztrYcP2OyhSTWpNdCWzFSMG+OyLexZNwPHiE7C2051eikiJ6t+owx8aaXy6HS3ISTUI4/DQRrngEjeW/yT9H1MAABD6zzf1sWR9Umg1RvnZfWanomKpPKsW0+EqolDM3wd0RZHKx2WYcF4lQ2Bz6q5sctJ+FlZqyjmSPj5WNVsWAfEZkbuhEBRXdlpDcRq20dJCCr7KlJFUQSJ+oXiEIJz+oqQ9lFOUrrN6Ofen8OPhGd37BJeQK4lz8kuXjs62OM1XuVzwvAGrEEWOiu3KUHm7gcRJycpKVcJOCmNGf2siJG1PYbWK2la1p1lLrcfUcwi/jhbj1f1V3pf3mYUUNQFrGxczjekSUeRd0IdkCUjJMIUnqFiWPWlTVE2RBweTBrd87nxMEfMsm5zovQqz+CrzH+xiB5H2+oafvIAxTtLQr6JeB4roqOsrq3HqyTWco90cteCUk6vgNNbnrVJNpt6RySWcwnqfxhmo+CQoLjc0wBh03SkkEfErjPEM8KgDF6VfFFICvw4EEXJLWuyLiwi6Ue9IW8QprTd8uHFMw8I371pv9+dDBaKQRCqgMjNvO5u194wdgFtQJds7vnqBn10fvVilzETeekS1yUxv3vvnw+ylibb1SGaYDPY2nS10bWFudJ7Ecsxur/pwHBcbxemqG2j3gHycyv52GzHP7+2sOn8gc45/2tn5edvOWv1HOwvzOxJyhHaezj6Q24x3Z+fZKPsWvb7g4Wi/UGuE8VCNOk5zXS65fe5s0HX4+5hdGf02PZQVfjwLu2zM5uwqe58dsvvsNvuQ1exjNmWfsjn7K7vPbrKH7CH7lB2yz97qqYxNfQzHrwGLbiX7N4XPhX6QYrfOav1c36K2XFX9PUhi8W4xoW6wMstYtXgEIXX/7Pi5yN3ssLQkF2cV57EB1HmGGdqj05O7p0uCG9J8fMDwslGTwZEoCdkZGtyIz9XJfpj+ZKZmJJZY6NznVopAO1eXq4AbgYNa4xfT0UOWqopFYGPsncjs2aDdgZ/PArUT0Vvvl/evhylWxUXWWWz1AbHBeIu0QLUld+CeV1f28MDOnNJ26NM0DqeY8j9NtYdkicQSnELtgfubDigo6JF2Ih1WeCpU8f3DxlZeCoVi8JijGIshiooOdrCTLBRLg/lpjorgYU23Uxfb+IXFxg54Gfo9gMYNHgp3u2y/0sPM41U6sDDaDdcaFFOQfZ+a8OPYB+e/5m0CP+3KTkeP3zPocXDgDwAumiB30YWVa7EYIInLa3qaUNxGRkY0NMJ03DjsTmUHwbXd7bwDoOYF/DCdSuFzGe5NhTBFWfLTV8ZWT0J0ehGM7pskC629kXzp0hz0Ew1YfYhr2DjHOwoP5yWXqC8e04TyBLkp1Ya7xOJKh0+iC6yWhk/w8hxZRSprQRvbhbF/fcf3ja51Lsv7RLvI4LO4Skv+nNZnmzr6icOqTS44NUFdRbHrNWjHNtgxSpOTBxYTVHoqSChYnZ0KutDihXg7NGkNbCtQTUesLBAz9xVH27bAeA4iJCSx9LGm30M8XroYUMJoQSEAH+lL6vUGzQIgioRuAyvRjRlNmGKhNa7lYzQ4NGZ4BZcVw2jqdQnHISUG83gkjHfEgp4j+jtMzzrwkIyr3J8mwGzNx0BVCDcmFX0vThLRT8IW8LZRRkTmJIWkyAYScxqcVVITq3wQPIYekITQFxtEldg/ieL2ZS47vOHyLr/HeUVzBUNckNscpIMw0F6Rx7zU0JHU88W1Zqx/LRyOzS2GpgUiZZLl8TzvmGKASq9v0lk4hOcAEaszzSV53rsZg31wqZAyWLvgnx7V+r3XTOCDwJiRPOS3nO+WKggNu4nOzxFaOcsUTBGkniVZilFziu+2Kir5vTaQQ5Z8/TOdAjfeosSwIdJwtjuyIk9l8LZXwzIPbRie3K51ZrjPkI6Fo5HfqmTh6i00wN7j5Zg2JhD+XmW4YDvzsC0g3J1I8i2XZxuzd6S+wpl4Mq9DI7UC75XT71kSMaSY7whc5hdeOfyyuWPhFZm5pxnG9d/DfPb8WS/mwmYR2qEVGu5M7ZoFclwqiwtwNOPYW9MyBUc4shoBGPNoU7BD52qn2SbhRMhxeROiLeuKyRXPx1DplgwgbJzfSLZywGV/4rdMZ9PEWawLOamuoYY8OXAlj0yGjGBUfX44J9TlE8eL2uS1w9GeTi9MUU7NlsrVOMBQt3l3iFCB/ao1PM7JQpKVkLA3LfEE7OimMFS6XKV0hR12ymEmY1JgwmhsAlYgCiXKxKDNjlXKS8ShUlJncr1YR17n5LK82UcQdMa5JBWaEosLnhQUDCl0pFRP8ksVEx8jIgZsXz9VbfHCV9qPpDoD2ZPMoqvWVuvQ5HhUgqU+VCDXLkSJzcyVWOtJW6hroM1z8hgKYzw2KkgSwtQXU5u9VzlaPic2TO4Vkc3h00LTjGF31UMdbd3IvLXFAqApYdNaY0EimVaQXm8aTbXm0JvCa6NLLiWr8fCcGGzWQCETbY2TMJo1ugXHIh8ScOhyYsT4+MjFCZW2rZhYROUdPItlkZ1krNzHwOtZ7xs1wioV1r/sdaT2DOsgiu81deyMHbOM6qSwAjSw5XBhA/jwRQag5tDeOwsXrprILw+nwcmHK0SaHrKSWlFwWNfVxR7pp7B0vC/3ysfvqlV1uxBPPVhbTti0gMH42UHtDHqvdk17yfws5+jGawRqqTC7MWvd2gnB/447WxsV1iX7QyuzC7RQCWPVx+6OUbVPUUVhtaeR2+agfab+U3P7B2nsLfs2xJERQEjuLAbcRgqUMVlvaFEMcSe+5E1IHVKraImIhsWW1q54EuR6Vjvyot/aYR4dyLfe7IZWvh6SyMezAgV7E5A0jb/fBaElGLCPumg67RcBW3Q4E3/kgoLl4niWYjHvMj8WtfB1xQ2sWYd76XaWpP4u7yT2wsNca1vmwbfAvLrtVJDFq8/M6c1YH2wIm1F3pevqcRMeqrqq8DPbFIkL6ehCEtGwmoSpbKf30EtqaUI3GPyt8yDUb8/ftZ0OTsbSg+NuDuPOb5wWVi7xNpELYZpdrIu5kVtY/5tGsoCwtWlMsGyinIm2Z6b8AG4YWJtCoKLMna7Q8W71zsXK+sfCbkpdLbJDf5dqXtXGDobMUNZiFVTVeouj4HVJj0/UYbmr/02azrRQLK0wsaLwdetabU1motsMcsQm7uyfuzsnuxAoOR8VP6KI3kOrc1iRis+A/c8QsQmj1XRNLBpfLp26BjTEl8zEbMAoQISr4Es7yVMIKXTkJWqvdg3qsy/zmg6v7ydDupLb/UtZlVW9qd5U0RTNzszOzGBuME9f+I0xOvYY9f+PbupB5iFSPGPETmQyx+4UctJkAJtzEPasURtRFzZZZ9Kw2Q6jngFqU/JwdWDULwLGBdKE6gBnMqFNC7yrlqOH8Zg3YCBJL5FTXlUEz9HMrY9vyFujri2SIho76gxSh3d3jo8KgFoHOlyLj+b/UcH3DyQg2oWuJ01vIhdLsev5Cg1F4VFUIuFTv+6mDUwyyK4TzAPcADeG7Z6JAdbszAm4plqn8f2mojg/mdpZnAXU0gitqacJDdSuFmI8QZpEK9iA47T+aSH4nnpbsmTRx2g+9IclgTY2laBxzjWAIJtgQ7XDcgHIR/NwzQABrS3RUJL6q4gT8zaNC9FwlwTud6DRtGjbAwyQehoaJMivGS3X1F0VbKE1bqdeNSKrnl83WF8HsnSGqzJPjXp2oKcWkZCCub1jF6k5B/IJwLdCdQQ7RucjjUkXTv0obXOoPe/JnJlCVCh4WUILuchTmKbA3DG2clZ5j+kAduNdE+5jPtxe06VWI9CcHdw1ClyXZaTLs6s7UfBUNfoZ5wILAqvca2fhMEYGNY8RvxSFTmekuSvakeTeSYjeZ+K7R6l+EVX0/dYgzURU8saHvtczKjKmdZ6cg6XSAvV1FRch/q3DPSqCscOMcsQm/3DBohPzHKY5sN2Z2db1/zCh4IxasNSzhZ+tYJZu5H+NNCM3rjKgXUTLlXyeiebrpcsO8s8QJ48mUYP6Y3cOD+CWp+x8zW1K8zMheNc/I4Rb9KIWWfFsmuEcHJmGAzQJvIfBfHN2x4I7wLrBMXFuCcnQ30LBGAH5VQTTg5XDp4xtdoqiNQuWnxYrKpnY4tRFLyzanXMsemcJAtBV7uYFO0jvVlDPp6mkxWTVYTJUeJcBN9210VwxpWMib6m9JpOxTi1qS9pAPJgJI7TBHnNwhOkrsAr4dwNX8mcGc0C4EiEp8ZQfsYv6lKwmtbWDVGJ2lNgXK6JjrYZRK2Z6E0MlJSmikpIUUUmkiFRbzxxMWuqt3QeqymMM3a8CHDIhpYnUEzFRfCKkda8lprN4SBYJp3jdQ2XoF4/8yrA/E8DxzxsgdPPqkVtUqunCoSGKAgfkaMswsKy5HigD+k8KikQURTlxJ/xE7hRRSUmKqKQkRSSKYpJUcTs7Nk54NHgSO5hgn+InEK5OYmVzoAi5oQRAJnMb3p6Ut09x89cAh5TxU9ys8zES97YiWcmOWsLD+WxQRz5vAbPHDDkB12HZmFlLy9xuPnb1ucFazo+LZUItL1lZdMgCtKkyjNFIRhNXQMEHH6fqtXgTzByeyRvzV8XdQ+m1RMqcLlAGBjzqDTzjYq0V7KpOZj+2oRX3HT+xo+uDfMmWlP898ipwHCef4E4nNJsw/+iY2Ur5OSkLexjEmAHAhLUBrx5KeYlY4qDv6jFLbiUpDDakOyAr1owHoEDOpf2LklOFfM/TQsPRDVgg5XJp9mi2e2cg1zqkZTSUwayk98fC67XWaAbfE85wOh/pHacMRHoR6WAVsv7dT42mVfZ/1S34nmDPL6SNDlTtwu+L9CwByiiHlJTFJ+XM+wKwGZ6Kp74gHGxu60WlMdLdu6zSh1P2NWkIlvsPEuT4+H4+pgmVmF3oGQmJb+LrC4+Lo5UQrpYs30f/8z9WrQ6Ou0HnS3qTuB303ooG9wBVXWjHhofO7/c5IAQVtFiTWlIul4azyOomacb1cCXyL1fmMSRePw5TgtxPtW+lyPHBtxMtN0QkmkciMVqhV6bMHadbr4k44hnVhm67JBqGFoXT5Wo5MB9ub5zrXQXbXYvffnQzfWXI/x0W9wxE9QzD4smMrySRDGFdw3b0C1BG575QCMM2IT+S0nGie1dJZKmjM4D7ZdqIBqR8skQtbu8PkAnraduE77z8JweLmK57bQl8ODYxoTJk3NukWo7Y1FFk2sE2s5C4zu4FCuXd825qWhSRHJKNEpo1oq7XJ2mqsbYlncLrkAEAU29JfPQ08HboVJjT2BvjmAdGfDR4A8OJzKByvIn13e7hiTkUhteL2Y3QfGykdmP2gJ4RlRsfeD2pMs0hxykMntgdjFF2hdjdmHjAVIqDrG4ZX8FrHh3Miy7BdHvQc+hUOAJwOxJ2qFeMlwqo3lQ19P/CSFhTgun9FUDz3E93y1gfr8NjbXilvr8i2mb8DNpWX1Hy+PqM9kI4p673/TF6n7dageQ95dDtwqBfK+KnwmbfZzC3XINEVA/TaVbVImGswzsV50g+v6R30VB2lnL67xIS1uGP+riZiC4VbwxhcCKJ1WOLqWG9qlW3RUbeTZOem+mvEUitTG488VYdS8UBVtPVAyQ6TGqiwuK3q5W339YQ7Fps0FYXCnnJSxrcpXVcvo9katGRDSo+lJpIj2zEkBobr84zQdzXL9eWd8iIhATMdiB9mXUUZqD5wgVAcruFD1lFvZDSofC7bSgSikeJy3R7uDbWo7BoYgX5PSLppLi89Fly/TSPVmyDhglYN2OC/B2x4DAiguCXuC0HryvRwGzzbwb+1kgM7Owgy47a76IClXethOQXsJxkSVNygrmMzl52cgs+jD72ec0SJ4dr9Zce9QfJn83WDlb7OYp96nT0vDku8qSfAcY7HTtVt6p2nMI18ycs1TrUFD1QGls7czFxQxs6+KLNmy1kQ2jfA8IhvDeYj0YO62Nq78yeukBj594R1QxVZ7vc9jTzANUOdQ0IWArTTvUJRSqNloiza93fiQmwVBZcM2tdzPA9BoDPEJ1+P1ZFZB92yXehNvsktL9Fae+fHOQPnSAuMtPYX36P74X22ZjFHjj94YJSi5z4M23d3QPEh244cPp5u1lHT0/D09aM4fZv4sui9Y6zp4PCz+3fvg8bJXv/7ueCGrk3Row1Ju740Jf/R6Fi6QXyVNGDPceWC/Rka5de6aorwgkMqpRARw+vqg02uji3+JhePVLdIJNYyf+rRaeojym4Fy2sWz/dMhF1VylYi+ZxvSADWwwduUQlDFquQrNWskrfYZH/W6imhKLpUtR5tMPhJguhKoe/YHx20AZC/yjBIF3YTc5LTS3U7VJIM7cyrXKOEkQDWAiNpSTpWrG/z8UZbo1X7SaV3DqH3do8UrvKBMse31e3dZ+xkNprMnZxJuMxm7PyF5ABtIytchy6S4+rm61h8x7Zg2ntBkQGiJhSr1GsiG4VJxMIFEp9W6dblPCwXItYsveOubqjGu13MdQiBA2FIrFuRCe3m9l6XbkCsusnWWX/4kERDiYU7nKLx1veYu1n1ZpK8VZkLjfEEYMB79YGqPw117dWM3VcqlTmiV61SuITbDOy0OT7aIs2Qv8EVVCO1/5nRpLvF5pgd02/cXpIuashiBOxsEi879dYemWbV1KfKk+7U3XL+1iQ+7qc7tXQ/3z+zEKEbRzHb6Cg1Upfe9yuFngGkKv/9KQn/pRRfb7xaNoBiz59iUIjCyoai9ftnDZMxm/tCqUXyqXqjG0jiCNuVOJj5dYYtrbJbQ22mGqVKFxQVEw4HYPkQt5RNdEuM/Ffo/NbU6RbEmLc8hBI9HueW4XuCE+00npG/G2YKWQQoPSN+bjsn5wW1DIffiVOEQwYdh0LX7ZDHq/Wn8DNx0tMC79wS7gQVkPUydRR2KSOXRueBaUjfSd9v0vMbk/Ga6yrOE6whjUJ9qlnUFQhm4vZdM7Qttn735o1Ez2fSeORcfX15xHO7S8ahfGB6KwGOzmiIhYf3dwedATrqFAsIOj1wHdGeH7kE0HV8YD1A8gSyA0oROlkJ5YgJ+bIyU5cTfr/Qlj2Az+8KgrVONwxE9Pc+YJRqzWu7Lx/IC7js4ci+ypVb+kzUlCb0wn1ut30ttxcIY7bOhVHvqzheT3OjTj7Mr+xw594xOMFBOZZ32J1P/+aJn4lBcE6YLC1v59vJ4xHQ18Ort2oiCpCsdnEteNYIxzj9aVOGbYNs4uCy1qWkzQU2gwWIj2gXXIoSGRKiMp45wUOyEL4iOlkZW2R4PMmtqi110Y6GM+4rh5ZfUMvUdD2eVibFdv85RtEZOqQO8QpeoskfDEzByE5pGmT0N6ZW7rCyeuFZ9OYOcV15kZ3SMkEe3MMrBHIDvvbhokuO7o3u3P0s0zHrz7mlmbz2gWVgByL/H6lO6SJl9b/AnC+5VR3a9VqkmRx3YW8g5VZSmjdcG7N6f0kUE1Tzlk57pLUS/MJw+zz36pHknpVVbAbMofgPCrjJRbL06HfLtKWuTrdbpGVNRXpB2HEk0Pt/Tg+mEugcDIkwzUN9ymgrDJksTZuvVERuIqyzwwBXYGEuvzU7doETXAOZq7izYJ/NFP49IkPpBjaopUPXLGiztW1776ieOd+CMOz8FuKK6YTzvzJWsEj1pf96QK9my8x38ZNN1j3gtwUTmNDTsYaz4xHQYPMr82Q1D4dkPSltTxZstgRdN34I3CB1LiYfAWCLTtUAg4VIgdHHMqhWHJwxKFiOJKHR/0Fb2d+MI1zFsICIxrKwt6J2LEDIxq35sMcdyxW6gNi4OR84b+BNSxZPl47s1vD7Ky63v088BOjdBxE3t7l+V6/4lcyNgQyS9Lm4dqZzYbZJUu1O1WK1B9iTbcTvtwhffyaBqsFPLIfG7qtN8mIp8AffkaXLyFlzl3LzkVu+EoQXmsC1Y+qV03AOAXxpbBAOUnRVeol8kkmSQ9C/Yf+0qe4xMfqq6yrR6PtXr7HkBQRal8PixgbQJaexGEFf2ifA7b7UsxalcPW984ZdFO5tEOhMrrj1qKnPTq19E49+/Jixa5lgWExOZYzjBZrX0FiyyXofgAl2mGS3cokMmDt+PsCII1+pXDE0V4bUVbw7+HjjmB80V8sGD+iFascxq1GlSJY9le2INKpwY2kGI/VzJ6ZD3KCUIui9aALbl7ogWn9uxsrZHAEbFOecVidpk1lcG/+h5okufs1klEiFVCw3zuB2UAU+cPgTpLRtAmBkByHOxhnlW2hDYTF19w02Qp67pjxTpcvZUTuDTQtmmghTQYZDfbYtShQ2NjKSk4F0/o3Vv7cQBRHInIpcejslqtntua68TU4GPanydoysCd2v4kJGJZJ1xzxnUWU3Ain7g0DlhKgAefFSTIfwZU6cCFOIcf8L3bozY3BLd0RXDL24IJawSqRr4NwwOZfY1j1uCnhwjqtHrSvj1KqxZ8SW8ftEIi+jdsXFemFRy4TEQojMsGAA+8+lGjiniWZ1UYuICFdTLRFtOkv14KMmjv8WpVBAvkJ1rsY/3deT7WAYyFVwa4XBzZjPDcVH5MR8HEYrgBloYuzpVyquuYVVZLexdEo002XzZgcw+NL5BvYFp0j/Nyh2wZoFlpfp3GmO89iMeBRIFDHxHSUwV4fXbMN1cTdUzzPpwOZSh//cMXBvc7BRQxS5kzVcN0nLT3BjfyAdVvXn0SlpiBJ+/TxpTOaVv/RYGqfW0BK6SL2YnSXWTLx0nZQe4WAGu9M3epvW6ZH7Uk1HxDLUJvMNrxXNoogoU5SRwmqB+NrGZW/lXausrzgpPqXRUh7pgao5QnWjLT1LG+udlzPHztpdUSP6O8pmp/PLvPdPR5Rhmnes10B4QXVArhWBeTHg42C7C4iYf2SM2QuXHrGxzohgilO3bDvFdFJYsgBo/ymXPgd2yZcg5aB1VrvrjzkbFiXQxH/+6SeiU7QFedR+QQQhxz9A9NqCuttu860B5ucnI0jSLWMhzbyEdGMzljA8eoeebyFxAeuVUat9i6yZg3h959HKIPChQ5ORVZyY8pNg6zE0ICMBZBxo4b8uv23qUGCRHTHJd4HAZeSK9UjG3t9hmBaQzr5H9Oyd5cTI8VSsi22bGl0WBAxAQtBDNIcy2yQ2p17TSETv98OL4pcwaYYgT9WemYjcuYA2nHXeI3quxOSrz7t/oyQVSitVpRppzte0vMgFu9g/4UpulNGbLrOCc/wkAxqkIGOjESie4zYUTT7b6Wy1hUxQkR7+iYBHLxiP1Ciqy2LdEuODUmUZGX69xpqgQVGqgtD5ETRkWGjlR7p8QkUahdh8loP4vDwkrqth00+oorJITA2SyNjnGZbmuEdOVwfsWXfDabpqksknXSs7CelVsTAv7uBeHCE1/9N/JxhvmYEahpES2HVQWC2lW/jIJ0OxeAiI4e/LYWYZ+jzSAN0g0a8AciwZfkokn1a3NR8tqXtYUSi21hBQyYCIA7gAZh0UKEyRsN/jFFQlHxiWMEA34oro/VFyd2jTdozCbo88X20XXouM++sVqkfNv2672wQtiR6qLeh5K4G9lcaJa9NNbyG1gKT4nVTyIOQvnEpoWkqWpHRVkv7XIFvVj7GLFlCFQsL8sSKMkW0cLNAz1B594P5di2VGVJJI5uNHV3QmdOn8HZHsP6/8YzCCj5CZymCAzU1NobwOYVhEvjUknuaaaG0VZGMLh7IyRQdgyC4/knLTgcr4cTBnm1o4cvJluCLzTHE0/bb5gO8lyElTe8yGAK3sdnNgXkeTWoz0QXfokZ/DtRogXW2aOBJ8bXzI22C+DVQEc/ug9LeIobIyA7vuXKt/2Nk8akQKfwADiUK7a5uA53uMayyPmpna1/Q5/NNlVjswDJCeqTBrcq0hemDWNxGkn1Eup4fOfTu0nweWzQkdJVRfRIi2J7JhKhfKUoGDLDrDhGGrtFbIyU9N5GqnwaN1B+GdsebgJLQc3IjeSMIZjokOLRBeDU+vpOvoAPxpowe60Ak4ll5wbsHkuHpOtNQ0ehCGEqM31f6al82/ag9WfA65kdFqHH26VWxSXJq6KIOyYYjLubK2HX0ebIdUAgFqTXYctzqh98beyN3LyklUS3bCDszXFmxXZKV3kYW3g0LE0RaX4OQ+HfcxWpSgzcIvqHzBcUEzybEcwk3q39PAo37tf+R/8ZEmcg3BFIT39VMBgVGTeTS9ZoIJGzT+ZLfD7uUe95S7NeoKItG5y/wxluSUKzLWViQanTA/croiYoXMUxDGG3JA0yy2sthcTmuWZ9uSHN2skpcqslyama0GgcAitkSCUVdoB9UrJ/xn9MNRiaMJK8TT+6MIALhXDq5lrGBrnYSqEKVQio9XLizQqzWE2VYGfiYUpTP6NaUbDZdpYn5VMAm5TPaKXPL5aoCSfPP+kmsgxBuG/K8wSBCZ2Jvs2EU88K9sYBRuXrlgp0rz40TAvZ1AsIvxvF+OIVsa5TgjixYs2Lgzl0X5vC9v/yGECz1QepQKHhQfdNfixvGwWbCPdzt0826yuowqLHHicra4DuZX3qyCHu6Pli4qgkPdqSWLhRn6xcwxSnGNFq2sN3ifaG4112Qrdcb12eVgjVGko+krDOSDaXepH/mwSU9BTRMx5QnUgPjyTgsuDBzRfDMxL5zyT76rZQlUaE8hoO8QVwg0VUwefuG6ywc4zIIjIgTJ1Blnvx5ktiCsbzDDOe8XG00EQSYBtTFxnyDIW20UIiQCBCkBOjYOFRYXQlJxz3gABlvVYOj6RtbGQTvU2fRI3XNgiD5bhy0RFDAjU/Dqwwz3A2X71Ebx1JJd4jec+gSKsKEdFp4OvSKDEKyMC7yaWCVXKxvSwK6w6KN0BKpyPxPGeikx+Xw06B0ufF9ualaI2OCkEC9imHD0vIU/pG3oLTXimAuKVoV2/h0uZoQh0OKgTLzyXK/8oGUCu7t63+Kz9UPdrXWpfD7yKwhCQxy+nwb609ICtgHXnc5cTajvoPs7rKFfliDIBv1KEr84WCjjjR7+9nhwodik6M6rAdyOzaz8Fy/cFkznS/XV8B2oD0EBn9LImyGDtttC227wqqQdmJDft/nShyMsAWMXRe3vs28DRzzRtI4KAQKdgyY4LGzbR8aY28GtMxLQXk2Xh6vGhIjU5UgLtQwhXhBRnTn4vYE9GTvWAUbbElJ1MbHOVq5aG77c9M/XFLCzlqNz+yVJ0LnHU99sZdIXNWKvu4UPICpkcgY1fgmoi6Fvol4xfvdgwznQCLdF2UjGju6AROejXJuGqbpPPUdhhVymxpQRFs7h0tSSFR1uVRq/PWMdgX/ZNBg6ovQAAhCjmEWrnH7BLAgUOzDe8ENz3reK7pZA4UYWVs6LaaGbAhbyBfm+ExmW9Dwf1Nivyj6OjxxiKB9GsRmrlgfObx3LLagnurdOS2u/xX2jC99khBS6XlRr4xOCbv9yj6h563+d8N2gHxU8wb9x6PM/6jgmyNLwNa8rwYFOOpagEhr7CkncEVX95nPr0/YZ24c9spsZNLmgN9rF9IZMYvM/gaUioCi3EcCX1XJ9WuEeyAeWEh2bKbFOnczPIoE/vgMSgYJfXx0lGCQYyT1H8GFIX2lPx/+JHt7oVkWkJS+jU+zWvJmSaQJT3Yy31wyTqQSMp8wg34bmutViUJfV3Qozxjc7lpG+idM6T4hwhfahjhGBmPZPYNK7iTyh1TMszXidgmb64tqrY7yh51SeuNNDk7z/Tuh/WfW0/5zGyhJwlzjUc8DFvRQTXRWw1cMZlGP00CC8C1bY9ORBDRkz9BWAJ25+na1+SYTBd+fiOfILpjHPzgvNzOEyM6OaPjnT3Vkw0WJH2anj70Ls7tDfF60HJ1vvv+jLM+aHlVzO8RY5kHaDL+aIjb93R27YwjYmgShfZmkWthwD6COrSn9hVUv9ZcU0smFh/7nxjE7B+QOtUnsvs673uLDG54mg79gTmUR4Cx+cBjWJ97JGNJDwLk0KckqoMr1d0lCsFIm/M0UQfItotPyFJm8djHnpIt5wvkxrLNPkR3JZbmYiICOKa+ML77411XSf31F6neh4kxQbJ6fXdfMT6vQrPxyWq9Nf2z8Py4fqum3s979V385VqujhLRcpDQsvmLFpU6AWL3p5K+kUBjnbMoynG3KOlAczymeHkygrt4swGXg+xIwi5kCIfZ8uFfEaFE6DGRLBQXCGd4ncGsdF4zSseIV7kRfo5ooaSz+csIXa3X/7xgEIcye1B3BTCIao5fTKd0IgxKOjMY9NtX1pllWeZe4vPWquOYUGsF/JxiM67R67y6Kn1uyYfWQunYHNYN7QToDxLc/o6JkWFm00lYnHFQt0Lk9wJ8fqn3Ai+oV0zEMCn4JBVWkDWsMkgRDRXJ7sId9Li2gwWFPwUqWCcEGvv3ZhPftBz8aMlqf7JLpuDmctVtnf9aWMkfcGS4IY+DKJiJP4Qmj7M1fYgmFbhXjyfUoqgis5Nanb/XhLzZ2sfFkpXPFXxtPkuvx4ZEpkYEJvQtIKreigLOG30JZeXa8EHK6mt0Rz5azyEuN1lz/oIiOmxhTknAPvsNwVwpy+JrI6wqQZALOSVPHZx0EB532yFAZKLcJp92UCe/BzcB5Ae0l102sXsRcRCBERJ+wqPfsPCfrhc8xt9HGP3cpG40/iy9IF5QVy53KpKpFELuGE0OYPA4N4r/NABXkzJ14AZFTlcY8SSgj9PiHCqACyldGASY8ZzUIzNhAuJf8sAiYnzI3UZdxc5WYIqXL1YuARfm4Znk+GlXZmggU4x3dwDRjvOIyFjCago0e6+5P4uBz+0sFiVrLgMI2LQ4kYGNEzfEgA6/loV/ceEdT+nydkqmJmznOWP3FA2TX+onSb48yw+xvzb9n+KZPg1b6ND04uGFwnJ4yT7M2fA37bWaqBTUzMe98nOU+zDx0L70bMhmDgBNVV8MOrusL4mA9+5ywsNcSL4t+NiPT3YD7Eg+lJ3t1mwX75EpYSUMLCBx28Uf1ouI7b9thzOX0Fzr5XVdG5I/OHk9VreiF8NB6cuid/T1+JL69OBMBoGsNn1mOegPcOLNoLV1mLqIQ7EePvnd/0FvkbyQgA9h5HR4/E9tu6reRudEQRdquwQLEdcyRF0+tVPur+IAPsX+5IcAjNFSOjr/PsVs4ViRsPK9hVyMgOdPu/KHzKuc4c4wFlMPH4UTYxlTbbitUoOqlCyG+RSKYOMwKT9guytVYpFgWtxHK09wvj2Xrb3wLn2OeRMAvEIK6lj7fzKauvMr4jtlzuZeMxK0xztanj9JQtELMkQVqjjmaQg9BHF232ajV60JtV1sIkqzaXnwtadjsRRrHu+A5NmUlyKKjonfHefLyqjn3JZMCk2660fH3W2Q/Yl2eNiW7RyEby3qHYyI/J9jenaF0Z+n0XuxuChiOiTBEw6NveP3bd4wQnm7PsMsnepsdVR03hcLYE86iu4M4ESMJ9i3j7Kt81DW5Ywk1mZaJOU5CRZet3Y6OhOx+N1GhuPD2+YvYrmXu3cqnQLgkWH3cdiwvWRDnA9G8QM/v39NsihvWJjCXMYa+ydxBsf0LxaKWXRQYBvDKw4PLbwO1Qi2c6pBZh+HnrgTS7XciUdWPRHhdsaV8uxVYgLMnmvo2tjwoUe/tExCCWKaSSXhgPBtu6XjhiVylo1WTSl+nwCVstjSuHg3Kwh41CWWmKqQky90Ex83zYfSP4zZJ5VLSi2eX0CTKrZgIeWwcJDRdNzeSV5YKZ/q6BBbxtTOaGG+7Q7hf09lZdp0Tz2B3YjsmLfZeKvTIUEwdeZ3fqGYQ2yDJ/S62x55EI89hO5TXnWVGu0x984te3+FI4cIlq0x2oOK0xkMLAB13An7FT28kW6ypxKlUIrkPskjpNi3wXab0cg1GCk/nH+GpcKavS1hhD1PLDzStXYXeONrhkf/hF+7dVL6LO9vfaPfu9EzywJ6oRg/JWJpKjWR/apqPsqfx+iqDksl4MYlaFYmc9F81v/o6BS5hu0ftaxBlNVZeSPBKPMXYckpt6aAm5T04nX+EpwI67qTvS+zRlwiws/edshiRPmzvL7oNltz3O3kG1RYFjd8bCjIm6bUzG6MgXJYLl+IMvPq0cCebFEgmoc3gTEVXgLtLdy0Znsh9PypKhXN9XQILcyyLsBoM7lCvxGepsy6tTwe9PhJ9KjjVR6JPJdFuZXq/Yw7HbomLc9SmQU/+Mj4O8oVcmZeAt+/HM16noQiCZMbgBNxNZbPwHXhY09ZBK+FYwpV8wrWAjjvp+xLLNZNJduJxRrjLEfMMOeomKVzPJzzGmb4ucYUlkpszBDdis9X+ek9W/9w5dT4eS997OsHXOZvbFP2UIHcb5H5iWepaYHji6vouf2AAWo1TFeEUuKxtd+VZ9TtMdaFF68X4rEUrf6DijBwqcwV03EXblxzeAruIWeL5bYNh332A9KvEo0DnZnt2L21rbDOGeQVugbe4CtwCb3H1mO2VDKHl7cVo/4aXOFBr1HrDZaDjTlq+ZPi/E7E4b4j12JNk7v7P4R9e/s9jf6Z9eoKKJYpXHuknpPZbWqK3uOkzVzqLXzyrSz0UoWFilkAykIYm2uCSLOkIdnwhWKkrMjw4gQfI91HN11VZ31RkfAeS/ElfM6uLXQ8i5USFAIqpVWbb2aYtFRpevdd/SUtfgMKfsVuI921tlIpFuV6pwDFJ5UmyA+5nAa2nDydkktmRrkmmijvokW/gGnfVJw64xl31iWu2biLlAaTzLD55bKR8vdhYTjlsbwnWc2sq0gJG3EXbl5TBPxp8X8z+lcwAg+RphRZ9gyt8YUNrIup7knHeT+pXDgyxpvGjIXG4l/MrJYMk/kYrydOGpwxB+rPvLWRYJxk65/h0vYMhJqLdxY1RsXWxSdvp/sXo8rKGEw3LRd7nQ9K0G/K17akonsVt1HPbG1bF4L/tnAR0+WvIZEPOlmqDkv8Dj7p8PCnGCfK51iKRFK3bFO3Zcq+bK4u1AAksjci1A+SywqEXswEFuMZdgQJc466JLDPiHjo4a16Mr1an35nTF3KNkn/cBOxqXLmC7V4rcdSouXxFB6MWOSbDtBesUfRWNytvcllDN/axga4BCkhBpyZuFjuUE7pYGoTEYn1QiyD5Zx085AMyaAkC+YAMWoLEH7crHMXIi+UVd8VfkA/IoCUI5AMyaAkif3SrmFB05cE1l7RFO65td6vBkWzIZYvPv/+xBbt/TP//3EbJQ/5q+1gvmIEnwHfAkHehqcUZKWirvqVZqk1p0vLzmyDz6uopFCb/Aay7StnfLlSh2CgKvvV3JYRwl7Am8CkZk7DNVroPUTap4ZfHY1doaIQCrJ7TJw8PCbp7qjky8KD6c90R7Pgj9w+vIimJryciDIgN//45b/1ekAv7bqv0bPse5BfZJkonRpwTmd3lNOZjn/KYcX0Ouhif8UUeGLpb5U5qQv7R2ybGplk/XK6M3a5yliORbzZ9pxxZtAlyIP4BV/gD11Rs3pZ9AqTQ225I3f+evuR6Fs0zqRalOj1uz1pufzOg+FlhNdgcYBOloG5C0xvvZPjx/Hv77deS9PE+7f/6JL14NkvrznqBiIL8+WN/VyrJ63S9I5RFiMn5EGpi2MimVfCbTXHSZNiUodwFn7P05rcZgKTb9uHz9e+fZ/r7F5n8va1an9gyK2XUFqr176otg9pBCFQjAq0FR4BC8fVXOKRM9o094z5THT7YL8V9kFnwLvM1MNzltVt41LVnTUvoOdv/9Y7Gl506jKpg7WZl1Igt1MzzYGmxQYOWDWItTTC0NbWjEI85pK04VfLOLaT9B2WX1spKbqwr2jX/mMRK7VFOCrWJCogdrgNkOmhu6ruY0DT6fp3vomRip3+ZVk/UYfjZrVYE/lqi92iuKIGEMxhGAJTvXH13ZSSn7JY0g/wASesezf5NCS7Tg2Q5KHRbRl77VCnlySR2AY6zER6EX+0zpUJYpLr4n1emFREcdgXaOczQy3e4sqrszTRZcTlFlRMfKm+Z5BxKhMzsJLldhyKqlXa0f+9MlQ1gAasXcM5lNmC3Z3dDrFi0vobUX58c4sH6OXpI2SN1r/4Xc83hqKiU/PyCeK/jhUv2F/nsDrXp1u5ZqYj4kKHVAgC+TyjPXVAFBz6lSCWDRIaaOC6Yt/M+6hECnorsET/Rfx+Ecx6KkEc4ZoLEOQ9FyCMcM0BqIBOKSLAcFH9NiN7onxf+4RmGsiDo98w4xvBjgzYRRVaGwGZjCkMJnHodK8EvSvXglW8O68RlPYjnacjZGVi2maZgEZIeAZhwoAmU+tDujXQmSlEw1Im/uBNLPcvHzsk6O7TylX0mZabMQvJR0uQlO7byyqrkPTu18pt1yS67bOWOjfTACqpLkj6TK3am0mfT8X8bIx0PiZR8ZmA67Fne3Jxfdz9vnhdPKAtWklKgLTvgxRhjTljnDci0dOQJl+QDyFJuyWcyMIThUVaY+vqFBcfnKZ0mZYMzsJQL6l8EDK7DTHyyU3qHI2qWf7RcK763LCBRbAYRImMa8O+Og/XWIYGHc2M76N6lpmap8BxsqVDYvmbL9DEy3GcVeFi1kUkxPWnCG+l5pyBjNLTEOend/8J4I1S2+33N71cPl28ua1aq9wJj4ZUGSzlef+/3mjzBthb+Vux5EJLacFVj+k54w7Cr3PluW69nG/Nhg/n8+9p0GqpnTIVXOW26IxEvpd18wuDbOXwdLe7VYbV6jzeLk3YhraXkw8K9P0yg65lLdeq6qRZQvJxFfEulllILJ3/k8oX1d7uVf39POAI31Q8cezlom9/s4aQSw8FsvJpcSlcEp4pv1WZ41ENsmRh9MphlRuj49a/IVryLm9h8RqZbluo78fThkE5+01oJz2Fh+m9KHUiN9OarGT3GOZcmqI+CWskVfDA6IuxJv+/hkHOBBG9kjCvMNoYN9cthq05DCnvsdlII7tKN1vxomJhJ+TeHLaVbGzYO6Fzic5VDhoKLTE0mpLDP2XMmRToKJSfndUUyGm/izL94GTkfvTxXr33gewYNJ5FaSUcHzmxMgQ7xR+SXYf30AsOOc1qhxdgkeKzW+I6uh7XrO69Eiq4DDiIohMSDVJRr8HqmHiJc+bQjKiqF3SHnwnDI4UG4B6M5r9kK7L6U2WlOfiDl6qU+rK1wPQkQzlmS+t1V0qu43d7282b2j2D9CJ5HcodZ+nxI9f5yhEyuBef0d/K4bVw+J4UyVooc+tsFDYQEBxUlvfbizTeSQpStbh3rYPmRBuKTIomPGQrpEuHjZ1091J8m5SPu/5XMZqdOBzIat8QcFnVRJhu7JDsC2QeLbXaMZXNPP9DhUTmu3yTyNDk+7h5siYyxWKNHNwxEH3tRG+9MSCvHbbtcqTQ8kA2x+FdBz4Lg38kqTBwX+F5BLxcY/ua9zY6XL4J4S59DOHmd0CBqNYWZqgGlM1nIFEGWRVqIzmzGimP4MqQoKWmphhE3DRxa4evtZQ5+ic0M8/3+kezXqW8X/aY76BRfw9O5mzSSClUfSmwct4guJIllskMheV3Gqxc0MXmmzbJ/+tAMqBtXd/nrc0BVIyyD5xoG2AFSWKILUp8mjh35OfjUB0cr5btLveOj82blZwmhwrD37LAgzoYbzSWVtlNlrYYbppe767YdqJEiYNTC66GWPdZTh0+sHOPztm3T1aWqT1nny1wEG8KZdxPx9FxIY2uwpdTmdXUfaSXxYnNtY0KfKGRQy7a4SODl+k5SIBHoV1zLzh6a8FfhionkHVFxCZET9iVNLWHU/SU6NVb2voMzQKL3j/7ZPpgs8Ij7CkHPj6iT0n05C+TyVx5r2wtA8xfCSWq0K3oBzh9WczZsXHunZCI5NKvhhelhi6vcpVlP2uRfiAMDbFzUH4h/Qo/p1d3ePkIybAtVVN/bVlyaP+KxdCWRzwuMmn/Np3Cn87JhJdJoFHpPglLCsnGX8wRZyBXK5y2LXKKbNaP2fgBWOeZJGlZMTfAISXhscFWyNSxHEZvUOKddTw90MKJCCQB1RyhqavCOZ+W95PE4DMKDJz+FdVyoEDSUlgytFGZHAiagLum2qnD1DWW9lHioJ9dlLEQX0PXtpos1inwIuoZLWVQ4sMZWt3jZKrClzDrny0h3kMLXs54bTWGZK78gWUkwZM2VXnypFunb00jv1K2zdmtutSNBnBnrB9FlmXr9JdXkl7QrVGSIHDjtlivL3KAK+TbyjPg+9qdK9+f+q6Yo4AvbQ2/lw9EXMloEz37Ej+c1q3oCfsBRV2DX6DUNevlBntXKFlcqFsb7pQtTrhvWCP+f5vBebSUb3IYamhwluD/JIS3FYajdNA/KTl9pajY2PKC31he8puZ1i788PiPZTB151KCAzeK0W30KSMT6Z8b3NN9BQE6zJ4oAzvm6JDc5NvkFnDjL9s1/CVploHM6xLoVKMMmyvxKYKrX0vzmUe5OJfA6B1wJrKfv6Xd4Y3+K1h0Qys8P0yWA8JLNwwhQACyEwWMy1Aea0R9Z5bFg6ZI2R8JtnqK2IhTFbJu7RXGlcrYMMqn+Q6WryXI9vZ54h0EltlTzIiGEGfqIMO+p0Xsxyej62eva/eK5GMopsD0m5HQEvWSXdONMB4xdGQIyqoh63NJVcqk+0+EHO760S1LUskTIRBO0emMxp+INWkpUFjkwSGX0wDOEqs7YIXXhB/uwdIS8TBQ3NZBnZt1ZfzqTpcZpvhfWt03q3MfdKXh8zdIimxGmB1HVw8Fw6ewZhX1Pe3VDppW1Od098hyB42zdCibQxJ5SKy2Io4VcdAuJd2BNLgRDAs+6iUXH9UBn0+gQuTumrdqsBEPxO1d7NT+NTEdUZNRxfQKJRHoOAPmycOM1w0lrGwXPfGbKda1F+NaOI/+ZGarxsQeztOLDVp3xw4GL4mF0qr+xd7jWDPYlEKoa5+5grZF/Kq+aPraCHHuVK0d6i4XBQUxm7aVhuLBd7lb751PGevZ994qC37TM/5uwo1VpEns2dOt8q4YtPmokXbgYA0vhH8SWeniyuPlslKHG3X1qwNskWgOuyivd0+A2I91/6H5Xd4iMVEumOtwTNBwfQodhyaBRE+ZNst4HL5nlE3F37l36yyTHewvdRDjYVrJ7ZBRg1hYVh8D71bF42JAPwfcUfG5z+o70l+sMubr//Kdfl/dfIS8Qy0979Z+K8ZumK7stwl9vG4Zn8Ms++v7L9+Pmfvxy/+Wn2liHZrb2OBXsIPeyc2STn1cIadoX2YNWRuYu/MJ2KCg7v82tAe97G4bVSPHfrdRbcQNfH9amoeHprizZQK3RMo/LQMddtH2J949xsDjNj/HZ8EKgZos0/PKucHf+Fe4K5/q6xBX+5shLs/QFvKiy6Rw8mDZPg6krCee8iPc3Q7DzbeWUZNWiCllEZ9Vb+zCG52cdjNZURUMDr5FFpx+aj1aQgPD/Z1xYnU7XiNgZhIGdb6uA7Ox3Vz9VZ42T8RXK2nz7wPi24eq5h+CYHuUoscEfv4AVEg7K2NcIiDDWmnmsmW1N4dREtKpZby8ZdogHSZI6WfU1C25d03VrCkXXLKYUl+WrtDpC9oWjg4L4WUmbbKLAJlBNNjiw/5g3g+My4QRuyTaaV/YBFvWthm6v7jeksKoZrgy/cHHY6oPquytDrc7Kq4AtfGsWucctqf07g4YFzioE6rvtdzGyLwDjx3NEfthy6tglSGWeNkYtTqw+3NcyOENeghn0+254RfGo9MewUhoDa5sv7SO9pnWKudGdXy6yx/0ulo78NHk5LAEnqBDEEFKkS8Iyk8sz5oFVBmB/GM0LYuf0HZPbMhIvStnhcL3orZpCrQloIFIv39wNwQUm61Noj+OzWGHRYwqysv8ZSo0PSSW4z3pUhjOOH8yPjgBesCaM8Af8aUdZ5n09JPrz9bhOtLXkEVSAgmlTCF/3P4ukFBbBVEMVZdI8yxCdHfkdWI61UUaU0ZSGmFk9wAofII24pqGs16Kh28EgAVsFfaO8bpuwC+MaIWX4teKXnsjCppCFXoAHp2mJOKDrDHC4bpYRT/TzKRYr25X2GUjwM1k9nz8nMOi0Xv5Asx9O6mgHUtHgR4zVFMkV7n8QsTZZ3ZC9AxMZMl4gts+SI7chS1+crm64d8hfh725c06wLS48VGJp7UQcIn9Z1lV5jereYxzZft4mll1FbQpw8XF3b3imDT4sYVKdmytJCS+GIigg86EMQ9cVJ2VYJhbIMeoH6jqRTb6tZgzfStFIXfQnRrg6lj1kUEdBU+BM7PQEYPVjafWg/IZ2hkA2oqIeS1XlljQc5sCEapC43qBNTn1rupSK298kE+/cO3Y9PynguBmb/s+7fRSOm7vwaIUfSKqZWH+vwMd/ZH8z0ED1rJiDXKjNWjoJGFzj9jAqKO1tt/5OWg7Z7xvlIg3gE7+LD8nd1TD4q3Ji4NGYncb3K4A4Uc4tFHCsLtDt247I7JDme1XC20b2Gb7sEGDJIbMdVUoph0pkn+HX4DrX2vqKNWl5uqwNA0yxxN8G76E7WjkoxDkip8aGmzmDt4GA6bmAHQhIi6al1ajgy8sBOSKPFQSztJXmuh5S3JNWL7hat67CQjOclkBYx3EGM7lJs8RShl1yexdEgTqWxOSFsOds+jQ7/9w8aBsU3eMJoilRZ+AiJE/u5hFZ7+ooEDr8o1Jk+Lm+p4L7IBMzQCZV8xmngsV/ANcvIxDNAKn98vu1I0ygLRTQh7OV3lJqv+MWOMq93CzRrYxXZs1s8HsfrP4ou0zv1JJ0Y+vPRPX8KbFbtxIeUtKfe5ZEOJ0jDkk9dZbll6L+RGM/SwNtlw6uGRrHNE/Eq/oFsLGn2fsxIand1ZNDzvKwFnwrzw65vtll0XZKnVeRuCIeD2aluluRqP0TVOI9nYFizIXa1acALYwrc9IEjOgASLd6+UhorC/3ubulg0qYv1yXomtwKnZMOCPi2izlwxayOULdiYS92xknf89v9C799zQDnNGnKEQg0ak6XIYlhNqK7RqZlyZhkttGECm+FTDtiDmpiQgWYeX/975Kucv0CaLw9HuaC4sJkwJlWjp9jKQ7uR0SLzr2x2CpX5asqPMQC4SaHwp0phd9FfvrNrd3+3X6H1bxETEr5jWROj/Go+nOxpWZmFjk2V29GO9Ppf1au1HFnIZy1YvYRuCVyeyrSa7zYIw74Bs+vbJEgOY8Qb1mJDAqVnJW5j3279aznonqTqjYP8KMdUcKH2xMes6zpR7HFB91Sf2/n43/h74rVk7FKtywq91j4bMmYp3GQs7/fgtfWtPTzvRSf5i9M8wzyW3qnNmcAaRxc2zUaiEqteAcmyjij9iVVI93XWN1K7Vpp2cPzkSv7JbW95ZdstDHJluW1tWJjgvFhoWu4p1icenyYJiB68fKQmOpjeMnyuFgY9iMKfZUf19nVtiQe/HVeSfPgzpGrRqN7J0kI7vCo45UVdN0HA10r/uvLKlRmsmTf8DFuOZpqrR5davRMitM2f5QNQr+tm9kK9Y+xOMfCG4uwEKaZ1kwjS40kqwwqi2RS3ksvIW1v9cv6vjUH/wWx0YaEUm2CzKGczP5H3Ne3x5aUwxNc8i0UgmvU48ZLBRNcTOBOo1ESfTwxhCFlW7peWw8GahEdMY7I8tCfJfWwaDopKnZS+hlbpOZZr59FAs22husFU2To875DPpxkxk/bKp/Jvr4EAwkduAb0gXdbZOUHduPdI5YV4wRFGI22ys9Xdai8x2J3RQTBHu0FTzXxvRhUVo2rYoHfeWML7O9VY/Wxw8HzpKxEtVu/dDnrir+4cOk06zwEjGiVNZFGE3af6iw+3YJFYeACnQ4F7jCoHi7/DdmcdpvJwVH7/K9neLcQfGBvsaFbu2cxk0eJUe329bXcRXBSI72ov2U18UOr2NXHq814QO3gdjSKpF7tE/WbK7Q/npTBze6U5T8Noov0JtZMlvMN2ZS8/nhExtfYSyZecTXQ8C974KSv96HuZ+/D8/sXq/NRVDdMCn60/07u3yYAUlSb/9sZe4yAAv+ptVFhqhTrZivZg7Dcd+agxOovUeTtiUatxAlhL418HHlrtHPZO3WYdRR1z+sTWfeeU60S8J3a/a1jTRq/01BpT6VMc8Jj07vM1te9t9vRbitrCmUn/DoVL6KJ8gHk2z3QUG9KjIe97s43mwkhBK7Bgkt66nBqRQQxiK29AvFWYAKp2BAddT55SPNImScJBaPGRDBydhgWBdyJeE/HhGi7YVz+2i3M/7xsWYqjN8bu+C/X5Ex7jXmveCptiRVEoqm+3VekimWksqnsvwx9wzufYFJI+PxkkdpzXDzD6IWEtrxBF33H3mFaz4IGI2T5Hl08uHXji+36KdoZcddXmByRj9eetkydfjxgX9ZkPcBdFHCPwgZ4jiEtMW5xz/RbXufGPgolsZXftpLPDi9b4ta82+6bGzBALjF38kzW5KV90wD7x8K3aPmXwdrkffyO29kd4InFIylFtfQ3WNynoFGY6bQrgD9Q/U4IR5O6xEBJqz72ihE6WJDZduJDElnnrThlFDn8YhtC7ZsDbN+XRFmSjyvubU/bviyi0+Ov/Y27W9tcdeG/FPiUBenE2CItnFRFvWUwY17HwyXHchShcG55tSore9Ewz2BwjLr3oND7CPvTxSLC15ZrDvVSmBRXY1PmYufxQ1XXmnWBRuQj2W0et8tltG1sNvHQ600cMgwimNE/0TVxON9JtM0ztUSzv5EohYvsyTjR5HtLXWF+RUh0btaUrgW8rAsuxaAyq9Co07fC4XYuoJm2SfuMBApx9Wj39UNxd5cFTn4ptWroiVQaPNJPo0IRE0B/jAJgsl97NBj1bCM9EOCZWNDo/x9DR00jqNZ6yGYckmPXklrDuXMxMLzE38jybQe5YM9fhF/4EXALh28mDjr+Nn24ewj/TXzFRw7fGLP7ngIZDXCYE5EmXMNx5iMNfH+RDB6rOwyvcg1muhzgCBx8J/1Iu1XJR7haPXRabGFDrNwDxdyqnNQI4TqHstg+qbDdD3ZWDd7QchNI3VjVtq/c3G9ysfu7T5geokvar0ikspk1aw6VyZVA4LSBNAMS5DeCTsQolHfpgrlUDCsOMjfzaEnoid0nw6yKMNH0vdySIqEf0KdO96wlWtoP81qHVzRlJ1aX+Bczw7hvGKqGCOGoqjTem07gR5fjnCMMthkENuSudD+9rOHZMXYUT3piLxTg7Ff51jkeSLYFpfEUYtLF07MoBJzcWb2/CA27uOoPlUqPSMpVwPEwbXkgjgJ9ABrZP2SvGRit20/MPDddaAKsaqzBx3RwQHVMhOvfzk0YnAhPDt5hpfBCw0Ng+8y9Vg77A/LFJveLVTYhpqxwA2jD/lGfGKj3Ug8+AUrTe+94n80+Z/3Qudv1D6J5eKSdL3amiwIZo8nB74u5pVhBxuhGSCXUQ6QMiSCxGG/HJrVJNr+UBATIWVFmWp9tEedGY9+kgR9hStWT7hRt85f3DCBqaIvcMmb1TzRi25Ft9DtBaYLubhdU24YflM91ihgjcKNpmaN7m/Y/em2tkd1BoTwU+FSz0l5tOkdN3KRxi+jjyZAv0eXOp0/AGdXbtw7Csbwauq6DTLv7WF2Vx/NRGfzV3YmnAsZ32Ywd5i0EqUyQgKjSzgt9Wu3SfxOVpGAszpkIg0niUKhHmthga6JDJxorlZHOZRDha6/485p0iVNcOigEytoSUJnNhzgIWxDZeoXFouN4D4B6BO8u9EwkGKvDGcEhxPgH1DFNot1ZEgi2oZ2hXW8X1o3u4btY4/mimRwOCMC0KRy6jJ6kNhdJuGRDE6S+nTnKE8zlbCH6urmgkfHYOjs7GjvPqs3vEq0nEDdu0RSmc8U3g1xdV2FscZ/6ccKNK1HIEYkR0PGHMBusyTHvCBl4zFYxuMSrfcXjKOs+/FhHTyQSF0wNO70dJhPVt/xwttfZdQhgQso6JIe5GaGCgY4HqDACmwKLsDRoczkibBLU7KcuqpDbTOaWOAOfZwymj6h3v/8fLR2nBDsXoh9/INRCZRRTsVI7VpPUGMLcDzVjjlCUjS9UKFtNtjZ3NyJsYNR6vKOFFIjOYVWIKg1LSqCGvzFc9FETBqqxN0YNihgVWq9vEb73zuZxOD3Is9OiDzRdltegKsmSCRnV7SedG6Oh0WWGtkQFExg8g+TJRxSFBYINrk0nZMNRJJXf9/KBNIvNZagzXLpOgYfDLeCCAirOQ0EHS2nYEi3piOcDG7rjsOzATjeS2ubUcx5RdFPec+x8r8LB6XdQAbcSEifAIMFhWeVzc8Djp29K9h6SaKmhcIovIzo1W5seRY0etdTdHbOUWPEnmsktDZUfTav+ah7HRFWRC5ZQqn18j6oKlvahn2A9WHz8ukGpDBFfqDMSt2Djkj5XjCLnbv9RTw2PL68hC1RN8fHWTpmO87gY2w/rH4HyNmxsdYXdSgS7xnknaOyXHrv6uQ3A1YUWVzbWCvKs2+hYHuSB/audT/vpjIGu+xjwBTNvmWbfhQcrfPgaZOE+mq1uv6ysQmR0TvKkKsng9XoIHHKnayOhlJD1vXmHp2KEN9SYRymWMhKwX+WsaGuyXuR3umX4K3I23sxohGdOX5h9xhPrzAFZ8StJqtvqhQXGpoNHSgRlNEXRfQ8L0z8kUzxnLgKSc39VG97fHd6PSpeuSI+kTJfB6XbRBj91UEhmMrzeFBqFBozCQtJs4KE22it7hghpwDwTGPi0jO54NAFG1SGReZdPiumoiR6AAjghjH14IOu3t6soDxPbLCwyktBigyvQ9FW6oL42ZN0BOntsmUckN584T9xFnRTZXt02IWdtbXZvmirLudzXxgSeifyL9hig3g8pQ2anwkInfhOYum1FlasQNy5WR0vRnuzUCUpuUNkTXZc2hbApkTeryPfYJrtYpjNtIz0I1Tv3oGkgvtOShzH0NmFlfgziYKmcECHrelTcFhRlmP4D2lRbwqAyQeq5OVMlD5PrLuNDiT/fJuxIevSJTG4/n+OalUcytZwTt7dGI0/bexFMkFN1P+7pvD0nxa9Q738PoXI4GVs1amP8gYU9RuBO6c/YdMcKO8hLLMvk5smrCyedP44nMY0vPEbeQ4W4zFonJ7eSB0q7G1xLksiA6CSivFE8WY2mo6Eiae8NcS9geSOGnN3AN4uTv0atQLKTOT7MMAv9yQwgo0nZ4ZWh8+0YbT8SPDgH4spOzxTjyBDxEBJhOT+OfTGx7fdDIfZvgI2FCrljVsK32verlLSa6fpsvFlYUR22ZS5I5hIcMXI1BaXYs4VuXM6GqKi+HDILeK+rXCSrTkvm2GbfuSFcYjeO3OtMWyM0DaUADpqmJkkvftXEBYW6rZ+HexQ6CrxJBieDohuRlLE0IkjX9s92HYKZ7GC++W8IhEM066HicEMhBluOTkrMIe8hm5hRNrS7jEPAUe1tDsmLtwi9xhrQTYrok5xQLGdNQrnD+7IbNpPDjHL7tSOtrbGxFVPAkLBDMWvaTOM9CIAi+sBkqzUqQ3qxWgbCDfhyzTLW1m31wcvxy5aJDSzozDaPFySEQ5IVO3MWlQDJCXMNo7kkkm1NEsSSr4BWXuWAAsIrETSHCCv1HMA/A5iatY9+RjETXWRuBMx8a08bqqfbw/PYrD99nm8V8PybJPZs4ZWjPYD4i1TkiBWWYT3xZ/kmF2rxXcNI3ZAXt82jwb8oV8Gy3oTyZLAYJU3GAZuz/Q3vn2p4m3bocSfZ9Nt6UUCTuMIOvmiNg1X+HTxZXhn02cMjoIDMrkwZ1WwQrC3/r+Z5lu860LDn58H0WOu6/33t+9wefgIsBUb1GzATi8aNk/7qL9hHtfASQk+lsCZe8o87+BY6ukRxbAszsn42DN0rKM4/SKDzscVxRRYorlTMK0iYnPiJh71G3rjz0QNmlYCvsTg4Ywr84q4xfsx1+YT+fwV3a7Zg5vM7MNxOWrYKiG41MXhnCMzRAmXhXVJQDeqxtnivS+S3rdvzDyIvhnrsy+N0+t9sjihDiO3FxJgLBIpt1hA49L3kfyunkKBT/iWLos3iswG8i+yNU3OZk/EYp0I7RRYUL7gLk2wvQr0HCxhacvsZDVLK410CRzRT2DWVBBBbuUxJSJKsuACt8ag+l6BMyPIFAmDVw8xCRkFmplKT2TAGxi21b8Hq+OKW09keuLhxz/lRyWNIdredh1id4UOGgHuTQgpKOdKEH7aNDVfH/UySYANrRRACpXCqI/4YAM5h/el+RZquqRTAQidLzVjLHqOOuZQjT1j6fXBun5XdqkTNR9cgdE4C3Lci0Rv0dyu/che8HMXD3++4vj8lxep5MhPeBVrASE7W+1FWbI0gvbcDqqLZHTL41mfH+jL/IRnMzy9I/0O2kZgWqs0HIWd1ndsMETNs4Vb68lIipIjhLkW3JkG8LKAUHWIBP88jlWzG4VkEmUSVqBeM9zkOdemKNOaZMd0StZOx0HrNiTYk/h0zd4h0aLuEtm8sO/W6jPT49PeKlNkDAPrE9MOTkKApLpjAkA4xtTKF8WcKy6+urWz8ld9n8mkRw5Q1I8oc80RsdUHUAV+d2cngHLE22FaqxmOtAZnw5+qbChFbrZ5hRxLLD4/qLdNeRiHOjiab5gUXkG1l32CV2OP9gmJFu0H4gEWpqnqZwXd5AN5ujdbyzNlTLp17MLbR7AWMHfoVe/eVX19qnVrwvN11unVpQeWobEhm7DI+BC47BLBsK8axQx4zi7OLzP7I9JbAYTUQY2js7CaxeKDeNFdWo+WIsF8u1ETh/S40ant8/swKTvDaSVtoYkouoPBTzBcdoQak3+OicMqTaB/lIBo6zE1jD4gLEJEdECrSOUuWK/GzmQLsUpc5Pb6L0iCjcy4hI/1bYzGTg3MllFfGEOMvQwRml+jBX7w33cPWIct/SpPHOf8c3EblyvN4riGOO7veTI6/9TNSM60/mV0GfNbTxMZmSU3jZrPpGkNol2oG2Q7inEFzk5Y440m6j2UWxYJjRlv6LFpNmKRatCu3Qk4Jqsx2TNKcZgxJdXhs5+tEEinZWyiY6ugHQ1caVBDLSL7B/8BorkrZHY52iSFh6HCH8da1QylQes3sg+f8VH8OM1NB2E6kdjY9WBOXzZ4fEgmbU262pHLVTy8jIb3W738roGzlo+2qghHZ7VPpaOz6pei+PE3gpDPFHLRMbtj9xxfkOV3+zBTlVDrXf+eavLGyx0EhN4xhWizYoYfc5uceCHDSK6iwt9qjRe7mDmjdYnN5zckrNpzqMzivvDahyUJ7K+9MHEKJPN9K2qHp2xkiv4E+t/4mN+ImMwt3AmhYSyTeDAtZUOjjqrSmKBykRjC1uRSZQbfbSD55Nch5xxi6W03cxWgYYAWQK9J9GaL4jJym5jnTMnMCNwu2jnhZKGru/VGz/thrgZnSWQ3td3Y96KkIaqWtkhsglxNw8Sy2HygCm43+ihKG/9yr/CBpfIMeu/DINyBs60B8i8Sa2pSXNisRRFLQ+QLmH+pZxsQ9jVZ/9MAO3zykdTT4YRXMCA8G/9kyNTAb96RU9TmAvEOnK+UCepe6cSfk67SbeNNohlhVirhRT7Jjg3FdW3kRPrEgUgDl2cx9lDL7+YS8tXGG00mLgAJYAhDQNhlK0nYT0iDg3ZiK+XML6dq5RvYhOznidoms0hQJ57C7mAniZgB+tmwQLRoxQKrdJ93Mxcse+OAJH0Wc7bLevr8J0c+PEWYeLc1+J1MrMWjyeDyMkY/m3fsWUSIZP1E7CU13sYQaEiZN3am5b1E2VsJ2cE01EnIeLXtutN36x3Tx76qdmHEVsT5v43+qdv3xwi1z6TLO9qRLOqIakHbnNDbRVSacNkwZ0h7HjQKFC5VZXOXMiWEzpBN3WfNGg+w7VeDDiUkhRlpJJB+P4I0jsqjxkKx0OLlFzSPy00f1EKJMPS9Xtcj/n5Q/7xALSC1iYtaMpiIj+0i3fpOX0T9DiZbtTG/dMXg44138ygNfV6Tlz4svWKrOE56/DpeS68TCy1UnLTuIsqTc8z5JDEx1KITMz5/DAOkjhtkh1UyGrV+PoJ0ZTievh/XPy0Fhml/uiQ4DdnM6xpx8wxIDW+Fwvj/qQ6iv9ladSxgHTSWvZGdt+mkgnPjSO26SpDyvw3eQ7ICvWmppCJvE6PzGhgnJneVJ+WR57IaQr/FRB4kKd1HjjX6TL9nnLlbo3llGGlEwtjWh2naLYpzTDt2MotPwRM/mTYMZHilaq1s1FEwg5KGYU5RFN2wFr8l2UItBxqyMccRjBCuot5IejOWaDMLDqtHC6ebwhiXOp3SQUu8GYZuyVZWJiO+NTladOdxHU5xuTdwmJl3+0Up3QOshxYGRW2uIRtaGcFWXVEGlEg+5IYT5rI65EfiQnbWhe2raX9Wmm2h/GXRM0xHI4XzCrSCc1A1VRPLeoscm/rEJKxR6GJqC7NZDwMqLt1o2koZXRVLjTgslrH/rjrJ60bgRnMiPpjt6UBWnCi/7UcPr+uqojQudb/5mrrVeStDJJ/rJyXbmyCZpg6BAWH9z3nqeCHEItT3x8OcoRwKWw6MQuEtUYKquqmvn4GpMnK5uIp6x4nXL/RnR5F7+59RS2XD+q/E2IegcKjK5mSCWJl9Qm7dO+5cTQ6UWFBCaebQs/Zw+UL1tqzOakxFhiMtbCTRanjYcLG0a23KFrt8uUwTHVmimGVVmS/REqDOPsfT9zEnGPE8/JgG4V1VAbWDgFFuRq6wEOvhl2GczaQWBIZwcN0EIEvgy/Tk2BSARlS13rpdjgUQhQdzvzf6aALvm7VoaWJw/epkhJNRKVdtNVGK+ogDVBxXkxo7YNZ7ysppJonZ8oFieK2HYLZfERBMEeHTJ1+alHdhY8YE4tZIxk7IoUSc5kEy8gvJSK9gaBVIQQjvvxAoYsEC1t3aWeSrKy/StARu3ThSWFwfv1jhQzWn3w822CqVDMzreAarOv45dQp2RdR/BUFM04ZjkvjpPbybsguMoi+OHtRhkCNLtDR0FyRg89OSjPT9/xGX2QLDacQ9lDakvrfxaN1jh3QLF/h6fnAYE5obfKFVpHs0XGNQW8XQxfmFNCbWiG9ptPqHoyYZgGKWSXyxh5TMouXjn6XX1afQ//CXWmxm5fieFaPu14UAAkJp1wvbSKr4lGM0V8BL+qqwEs4zanr9H3a/DaUABTZMG06tvQ42kTQCsg9k2KL+MEaberk1t0jakuO2mChE39FDTwkDLqyApAJZSqpfIvJ+VYATxyhL8DEAdpLiPC9upGP1MWiD4iZ869Xi3Fbsn+lZXvKerxb8/t1W5QUFEVZLpW9ZKa3nuHZo6rkbjoPLogz/w8GXMuE2rU47hA4/BZ70I4i0fJvaJel6rg8uZx90pYQs1a26xhZv6rYz47URaCb8qbj/kxsnmXHVcm/yZZUSwsM7sGsfqQvZzwZk4MCtbSXvototWQolVryzPgvW3TW+TXPBESDualavJpGrsFkHq6hhRIL1qp85aU0o8vVEcz85Eyp7VTtn6ky2R1hlLtn9vgafjXdeQkqWTP0Wkf/+TgQc5M+MuqT5vrc1dslHKtR1rigSI1tQ0XJXhyy00+4+/VyS/nY5Mxe0ZVeogP6ky9WxzxfgQD24Pgpj3x5lecRtV9/7WZ/wIPb/9aIQIiTTyWVC7nMY2Lmdr/faUzovJTyDtkMp/IEXFd6EZfPA0bOI5KzdidQdo9MCMxJZNR+KbkXdV+JowRCIYBXDQvonFTscJqBcHTfgIfNnyHYrELBs2zXLz1FA7UlfRmGQeEabErZq7tol6aPDmWQAXcOlekdNS9k+/ygiW9QYbvdpmOxnvEOGAPgxEhFhh+fq+uKjgLLyXXZiWfUGeGpFN5agn57F7PC0indk/5Kw26f6J9D+XxUZiYAYEY8jYu67EsPlKrbTiUDvQhcPRmMj7JwkLbxWXXUbG/BWbdhfKLE/szrMvSGInFppa8LEO9jsIyDl0NEa6WtU1wFhsvF8ROXIg8vOgu+QFqvozD/tYAuTVCxqrta/1ALDk68uzG6Wglx/K3lvQhg2rCoVoT9h2wbIKG4TcWSvQU7vHeZOvuSr1ygQpS4WqnCZecVED5nRI7LHMEdyvSPyz9AXyoT6jrWBdduzHfJHzHUBZmmO+C0ralJlSMNT3CEEE4HZfzMtNEjNlhEhsLMNXUIOTjkRWh09xlIL6keu7Tz2E3GsMCWmI+byLAVREJpz++2xN0jcxowz2IjQVFYdixbQlRIyjKriNdl2mLVgUfUQg3zC4ZM7/lPBtArwPxNmej0/OV4WOOhLEvRoKJ4TW2wpPNmXhyA9ziUEqFhAilb4PX0BZUVWossmH9BffyxXO0IwZcow40JnpY3zIx6W3PqalQl+vWiU+JFZuxfkmC5DBdkJsjYB0/O655QpxvfDL1B3qekVKmu2/DP6ED87JRc1cd6iBJfvt/egvkLLg1lmGQp2uw0k52GlKIxMsj10M7PjkORcKcdeZWonQfxxFpjt/iFSLMMU8OVh0WUFavsyxeD+A9uyu5hkpLShJdqEYKgWZrA3MrALZtM6E/IkEOPJ+CITwBZHNwsW1VCA26lEWrauE4uMMYE85ijWlwaB3ILuC+hiey09GKoNJGBjxYf07CJJ38bdigXOrFObWVJBN3SiEZVOpcOXjaT8kNcPy/C3Spxh/YLJyUyCWOPBpJSUlpKhZFdaWLB9ScG1pJ8pGEkwLyTnQwFjQmThUyUjFh91o3oZbYdblyzriK4SZZ34Rj4ni0yX7kMV84dSNF9fKw+p8ddls93W1hctzoj8VJvVi8UGJRmzFqAhpgv2afoml9YuitkyFiR9/TaN2uVoboYefRHzaoupdocCdm/SRlqOsiGiGBZb9mw1NYP81g0bi8zSspOs2q4bAYQ3GsMWEtHrKvzYzsfXtaLDDKhzlGH1O/2IGpFNan2VX6bNJUWb2oDmvVSGfPCWC7JFm3iBlkz4sHVnQioXdI2KCKnLN0EjmQmNucOXtKLtELJFkHPNCs+hriQChWn95vFUcoHcl/Q4CQRyqAkvn670JfUVw8aFdadQZAStYv3xGnxJjxo9Fi0DX5BZq7OTCQMNEo5kxBqtMiMZsi1DIFuyJH9Gg3Ei6/BvuolRo6f3fRgvZlps0qhLWrSTci+XaQFJqeWOntGQ/mwAf8zmQarvcHWgbJGFa4rxYqbBvMBde6K59rRxxp9Qr3CnrtY4V7GILDHzUY3d2kXkDgMkGBkFXLHLggFXrZhhVGCjhpZm9MMnD6yWRoM9YqAE4XAYynfeB63+IHVajy8PiiYSMjVOQggEXTxjkUUQvUpKxAFmvJcN7GTRz9OaqDzSXQf0hb349WNW22U1SzN1CfsC1dooj2uMarVNuBgJOhXHxWodejWMk/x3ykHyuMWOfD9D1fFLprQ1oxlaJ9PQ5KzZHqdS8TovLuwFWbNS4f8Rvi4m9FshjNP186eY/fHy7/9huHHUP9LXc1YvIraf39W1SDqYvOKNv36cSW5qjKC5FelHPpqv/0IGX6gVBK5tHSqvJ6ZaNCYylAqyulV6S6tGS7TbpOELeVk5LnAgUyfL0J2DkaGEwXL2fgopI/ZwFxIoOwZWsXQBZSSzp+/M8KKLyRPKkCUgORuuBn9jd049hlTwmS+n2y4wgdQw/myg+6OTk8VkVfgkvqG8YJWdiZD+qKV9aUlRkNgygVfFIvRlPrRv7pwfyAplhy1L7oklV25lN67M5fhI+R+Z9cU5FLLC5lN3qJJ1S1dzjwEwI1HiCH2rpVboKWfJCLtt+IrTnrFg7KnOnyaa7rHFhg4/yr+r5PiMgb/fRw2CDOxaG3mntAx0YNSE4S4gDllpeRV+s12UJ9RlZ6yovDiQhT0Ia+hx+mHd2JEWejxi+JLkt1Qkt5S7sVe4C4hDVlpeJb5xRHp8Tqlg9Ks86tHQidzNQZFbHrGglNTQJkSL5VosnZCAKbVcXCAGC8H+fQFT3SC2+fUhTcmRQ/2tdjy3gUx4OBixm5IZpvd9ZBVIo8Q/j8CxwaBC/ZDhjtB7zuKQQR8/ES0xKBMGx6XKoz0MZcrmZLkYkJZWpl+B71fA5Uxa8fwJSo7TE6ocerAjwkBWLti2Gktaj3I4h9EpJwO1fN4mEODVJ/5TEXW+zdb7olZdWQVkj35XEtbDlNSCml2GRuxWr55uYPKsaY0svZGov/Lr+RrHSX/u5vFyLlt+rjE44dM6oThGof3pDsdk0GrDD5zs+vMX/z9g4rw4a/WM0LeqELhP3TbtyXGQR9DZxuis1eHWShOA9WvPFX8g6CJWQme1VM7Wd2rCKgUy3nubJIyPgatubwkTjH/scH+E/eGpZPjyKysfnvo4loz1cVk1348YtiYlTV725qGf7ayXCG3nQ/u/nb088oiwRFUQAc6LYtjs4G79m+zNGzbDiXV4VwnxOmHyOq2kx223rBBL/iSjUEAu7FrrvKQN7oLjKgUYBMLd74uUUeTdrIYke4tiqRwdqPpHxpKv4WcgijNif6+hTexOyhraNzBVTDqHHZBQutV58ZSZvc9vZvucKousdzlk/COebj7sBLCK/pq2dv5xj7kki6+Sed2HdLJm90v0bF9m8gM/BbB8Oc/ysUnLOme48g9V92sqdSPLPykVkQSeD75N7VPp6OWJGIsQIGIEye76+h7N+DDfuvVw//Ysf3jqgjZFoY0J+icO6s1GDvwM7CfcxrTqQ9O9th68fJDx+VoGIyJvhsKYqnC0Zx5ZGKXHAPK2+q7h6lb7ir4yVel2WtKhDXeiR5VrViWLbBn7WRq1r17nNxxbIAjws78x9m6YHnF2/ppFyQ9UqBV0KaZ4ORq2vQk5LwnHf/URMYgicaRwepkihGQS0tB4kBlka2tgITP8TdTlIdw1j8WV2/MSCnRhzeSaaagIYv+GjRuLJ2TUkB1ZEqYOlxrMyBRR78WHREl4S62HtNFFVJ/fQwq6i/2gcZSGZQSZs3SftMlyxtLYypoxtugqklRmNckxWU/glXnaka9uDXGZlfZ1MIW8JKT9SxZaKonczXFYzJOBctSfSJLDH0fJZH6BxkPSHb1IIq2UHTlzJS6+ElZeXBnJYVcjh5tCcKdECbavCIkvwfSIXEOGL0k1sAS/IZqUCXo6/yas4F+/CM3ptrN/fQsXDDOFfff2wywtIGnqB7LAnJ2NGT91Zd7FqolhO2vT6ouib4jh54nrRKdQsnnXqOAaR+It+ykUxSqi5X3b6BzdxdBRzmheFsCzfzFppXrrfyXNbZGBBh2iEz4moOGh0OD9fMDualgY5uVoWMjzdwnP16HdQa083I9v9rfdybUEGcXjxJqrK7WswczvwnvtmqInrk+yoWuFYvsidj6xSxCBVVWG/u42etMod33sK2U6+dF656uvHeSrqs4aeDr+UVMIqnz9VzgQbCH7jGF2RnUBVeAoiNwv+4Uh8W0z7b/2307mSBDBOrEhBBjVdFqMWh/oknHOu6n52O0nR8c0Tki1njT6avZdD/wIgZo5H76pNXwridvwWoosVupK+9oEWT5aoja39MquetWt2fjDzC/dqI/g9zQp1vv6CEktHJvVjtGXlER41ozgPgUPj5DS2CE5/c0OCv8L2J2WAUt0eU6ScddHzQgM9ZKHzVus5SJ1qo9XpIsDh/PQLtuqw4P3z1UenkvQ5k8bD1PLmOPcaykq+TAFY1ZymW4CEzrcGQVfWYSL36I+Ny1bzjZJ+EyArJN19uxotSFfrVNBpdt1ole+3YmwxvzjYy2sk1yVlVZyxSC+QVAkvG1LCw2qdTxyxTXqBnnhVsUWQvo5K5kfQ8iZmvIIeAx+NVqHD95+/Wp3QR26wnF0Dg/Srp8Nv5ljlRqAmi8s/hgWjPYCJQqbPtQ4d+v9jiGZdP/CzCtSPZj6mu5SNhqOXseEy1qEt/z5LNI15gIc0S9a1sL+wTIlITmiOqLHSeLQjBV6R9MIv9zMOcei9a1cANNNKX1tXbQl+WqdBlkyoBdZHcLmGUqKho3uGe86renyc/0vCXQSMEaRez0EYtVhWWX+F6ReN6lZFK6JNZKaLI4RMjC9kNEyjnY6O1f7h+4YWPnJp6azaec9a6qbEEUMSUg+uIRcyOp/cTaQ7Kb9W7sxWuKCfBCrn6WsS+dDVhg9VqKsvSdFFFkyF1+ynflweVU2r6US62w/rZl3tIAdWjN2BCvSSy3GWmu5iD90JYhlF4NEufsMHZg54fIkaRi2ieiJIqOQilCn/HGnFjjWKfmw9CJ4q7R0uVmVQXO7pySQ46/1/olg2EKl+EXKNRf+Y18KhdriDhGU4Vn/Ca+U3ffwyKX+GXL151B2mbr537YHnWpygKSsVNNkzP8MlyMS1svo6+mwe9yfmSJPB8qD/mJ/Md4a+K3Vg2yVItKETYtwdPEz0rNx4KJWu5PWFqxcnZJ63gTZYf3WWu/DRYOrb1pg4JrBJdTef7wyOutLQOqgwTdLh7wiY2g1fD3wa4F3m+GioJsw5pHFG4+SFr4WXQ4315KvYliv/IJrj8zA+h4ruw7QO15K4T5vZNiPs5B/J/QcXEQepF7rdZbHMd/mJRHq4WrTCSLZxaoaoeW/I7haLfDzqiWyzv2Fs8WIKVBgVVEOdbA5ClT05S39+30/wvycbBqMUALGyzU0jAKyJLHp8aL9cwOcR/jcdWkyCS1/xQ66ld/tLOWRxetMQUT0pAH+PFfdMSnGHPDRqUl/oKfwCdPurW5mKc6WFCSV9YP87XLDvZHq1CM/b7EtaHIJPWMbajZ4CWIk9fVA7EnqF8x18SGVaeMfHmGu6lDKv2BT5sJLCWCpvpA7MsQc+sG2I/jXN3HsSNpvh+bD//7F27UIBwZRNrIxFXSp7FsZFtKTccKDWTrWZp8M8Kb7LvgW56q+XRk7enDmRy0gf+wZnodurY6DVGKmA8L6cLfHBmG5IbdPD0D56jyDjErZ3su10I1xk7V8iGhc36XCOa76Oe6iWGNYM/Qo+FRgLo8PNNubPH8/mTqSfJnlNXL38uGjJSL3Q3dfJ/P6C6lz9MNJdSN77MN+PuuXESDzDUdmKrxy/emXy3CB4EuFbhnkPePgNfYJGaXwTxyTXt/hflx6pyFO6Cg5y8Td/YGnObrRgQpnsfcUdJwZEZrKTrXO66ZbBC4uDGAGSqZqoe8ZTB8ieOrp/Qi/Hj/TPvNZrLdbXLF4yBJI8RZYK4cAa376MuZ3HEyFqlUizN8nCjrE+dFebd0H4r3YkHQoxcgTJpSk+qOeuFzr8GQpVq91Cvd4I2FL9ltAJfLoNHiVcLTOzkWL+fF+wnWb/swf95/6SItOSqj1nsp23ri7v0xP0amhxBSf1WanzzSEev+t9YZJN3PdQ2DENoG1fgVlqNLLzSZqxRkF8SliCmmyRRNGOr/7tyr0PISGdeLmBpcprvZBjq5r2WGvQnxnae3GBzubRkwgG3Q556ziMtFhP5gzJ/ZFYHnktEnKMLHb1h8fIln7DDlhPNRQ0z1cFaGpTCgFdNstLpwFUKiWh7eDU6Y40yvEhGiwwfc50Enp0cuiuqPzLs9UHu0I+IHKMgHfoP9Q65FQ1nbhlk2Eb0NMLCkX/Ticmzm2ko2/k8FMCw8bFUfprkCkpEuLYGouGQ5TO2IhLC6FMKP43vKeELAn0RAcdiHExUHlAaxKkSNH77eYB2kGSgv/NRoR77bvQ+vSySeWDnQ8lynaxYjT6dnKysh64ZJ1I7PLLvqDApcAGjEdIeuNNMj9HheGzekH/hY0z+Pgd3CjTygN4QxKbV7FQ7dM5hpSgr79ZcNHdJlYo95ybHthF4ro0Ja/JfWYjY5eNvw26mvuvX3xMz5oygJ7FuXkPZ88Nkz4Qz+WpVhRYCl53nmI//wtlu+y2171jVm31Zj5SaeNIP1bDzzUkvGtFjdv7rE0MDZaA6MtTNyDzVV9KaFDd+kH2JZ2kxX3/ZymwXy/eHwPkW7vhHriOnlm293e9RcO8jCnbW0/+8zbVLA5DwTZslUUqCrv4HHv5h8PtaUll46HfSGD5WW+6DAZo2PTxdhONLLYEiQ8P7rKxQ7FO70DfvFgDcPuI+xqB5DVwZWqA25/XtPvrHcHG9XcwWtc8+SdpDoEHT4059OIjtg6AgyBS+rrtJKq8H3Efv39GIuXCW/vN7yOg7BKL0HvjfIK3DqeDk37VqApxehD650hWj+XlNelSJyyVtBB0uHA94iS3us5Rnc8gygO16AnKvIiadcEDC3hSMu56u95YVgMDcf3GMttcsRR4yAR+jZBnDxzU3m5nSPGz06Ghmzq0xSIb2EVhut7buQsDffOn0/Gi5v+kqzdVV+EqjY4UfYVg7nCK6W0Ft7h0FP/Ji7XkdBD80PXi30aFYEjU1wpvxlgL1kKotiz6bbF0EpvWZ882QeAkgjEDFbvF9DRQXS5EPXNK0WJduFfbRtUW+dUlae+GdI1q7yhsXRF6TMbpNOIyM8NUkSzmkJA0H/o/QDY6slHwDCaXypKoySIwHQ+O1JydRfLsnaOOw8Z31Kv349VAYXotxHZXgxHr+xu+yHTQBXLba/Ao2rejHK3wnMYYEf5urP8X0g3qXn3vCRYL+5cmPB9c6YYxOZYXM5tBb9xsL5Y8o0g9EQStMU7DwWOOUhBxd3cyE8wI4ugcNdr6xQK676CPNxN77gFAc+Hhi0ZFig4hw5TJg+jareG4rum6Finedur0yRCx9bgu3j6eLvsmsvjvZEjtmYNQcb3vXSNhZYLu3qzs+guDArbkU6w2Sh/8m0r1y7hytvbrxNt3jTsU4OKgMSp+HVnrT49YhRiqN/yxptL8KH7SKruOlks61xCfPcXZZmE3a/1vYc6pMLHYUvL81Cgy5HzfNsEgeyNi/gObGbnXSnVLodHueL8c7BbNWCmj6Q+uj3cGV0mVibW15RZS9ju72bWSVlSMpzh1kuFAWrn5p8bKBsgGNyovGbCOWtovIX8Qr1j6RxLpu0u8qWLglpqHO16LRYMp7203dCmcAQxUQp26tEgYzFC8dtQTH5jOrkLo9mmRyW5mT10Fv9iNpQkx03NTKsEtAMjJLJrzUlkhnjr6X4zg/pcYSnVaS9mGtbvPYnv4uYaTgW8yqb92XC9p8sdp5vo4WzvYHaCAd2NuYyyq2+Xh+Yr2zGOvcrnVvRTdQ8501WMsd2h2VEPj2vA3sN88Ktz0PJGzHonOUkQ+78AuMxjrPPKIXOmia1a9zLc95mGfDdyadj1B7eWCrtoDNTENGuJAT4M/L3Q+9Zxsv/KQUQmIj4xpcZamT73vh5BYvv160GnZhi8Pao5STPgwdWbpogaV5yx8pOk51VKsynHbxeVoofo/pp2wHgyjNnbbfJgN4dNJ0nqhScP0uzDEuE1QugzRquOu6H2Ngv7EqPEkzKo/++sHkLXgY/QQv/PjWqCk76kf+G5yWWJ+0NpC3PR+iHaHWq0lmxzCPmQr1I83WdSRjykpLyEnbPa5SgYY7PIkwFewu5awlxg2PZJ6OfVdvODeeiboIs5TcaFe+v+9EyG4M63nTPE2vFjl5d9X4e/h7cTWgFlKh6Bg32895+ziACxKQs5LhEYudNZBm0zRyi02MG08GOuGZKj7pJRLGoS40Xb+2xyC2UWMw+iwa03Muz7P27cZclY6mEZyazFYkxr89Ir7X+6AFBmjcvNr7Ws/akX/pRKXJqqWpb+GGv3MjKWytAcVwmVIkZPYFif13SV1wbXI6Y+Whd3Bys6pPejtDYZWgy9j/dxatnOH+fG6kYdfWdNBrV92tXNMMtTwsVlVMF9gfYV157DeZHrMPFN8w5/eBWG7eXZ9qc2BXI3mZOpKEd933zbri7kUcfyEqItLKz9N87F0aEggW6QE+VwOYG7pJjEbPBiCbhpAhlrf10EBDKi0iUyLxr3bVqFQGrtqhYFlpZsQLApd1YAP26epT0+tPkhEor2Q4xggzWNdwxhzbisqm/OzKtFstRlX2F6aCtATcXi8AmkCs7lHPGk7jYQ+eolX5fx4j/HDbDxVXBGmPnLlcvQEsaJBcL3tWZpWHXzsFSjHk11/ZTbShhK4VhctOR11o8ucHrJPkk+qORkCpPxNfhjyLLE56TkYhqGKjmRWo3WOXRMYM+4MQp0zKr2JgL2C/YwesVYqr2QHC9ro386tklRHkEmUnjCGgUUNw6Y8vt91Z5ICRoIqDgb0hkBJKtd1hOvk/XjGMEE4saP4HICxeAXro5dSYqqR+jbvgM/abGcEypJoMGG6xueVAiJSC15WgOb068QyIyFjCOAfScsioDmuB9EI/LQNHzU3TqzOQ2cq5VKSQ+ax2Ts/Zzw6IR2O6wrUazmD6JAQTqJQfBIy+94K0+ICORs/KBQuOB32JiI9sb7AfW2PCxuXR7Gypfnkz5oy+3NOiInmZyoBOx0gcrbQmrumGSwBsh0SqZGiPvCZ5hrqrOPS28LUqpbH3JZwohC+CCR1t5S0Psh48UQF9+ODyC6ww6LOVCT5NOjqejCDTy3L+qnQO6Ko0721T3b5gfcQXTOAFfNwXJ+x4xSmffamzVBK6vttNxe0pK/TFPG9SkD9uxnbXwY5/Ig8TgasXh+4+/ZdpDK5l/OEyOBOy3g/BoeZC5vIBLA29vABwBKbobsxpxV97PxdMRu2+OqvKKu0sI/aOd0t/SQLzZIRS1cGd/5vxUo9H+w7wn25wRm8vN2yiZBI5oNIU+TUT7Vzma6QhziKjRRVJdaMpEYYxNr14mDUfOwAF8q+bWuFGe24m1+OxdHZiYcKYttsI73GfWF/FYuzhKvo8riNAIXC+W1mT54C3ufCMkbInwYk78Kvg9C+4Ow3gDf+kZdwD7f2zUB28jGO/tsXVjkUB2KplKgoiCdlRcg46Yl9YpADIB7z4qluiYbFfPcY5kzklsQtMFL9hYnFuMbVs1kJonjrAC7CChxpRTI5HGUSEvOcAmVB0Ietka4zyIH7tqvxIrHF1wQR94uTggnjzJ3jEqtPrUnhIgfW5VCQviBh5ODDCbskDpgmwaJ2y7tiOP9R2w0gzzXzFpwhWDgdXgcVpXbygoeokCdrbIEx1IkUV1XBdToJsktOArB3nzHSZnuSo3KAzxiPfXKzqVz6jWPhtVOfm9jlzpjyKnZPyvPTmdb462xNRdi7w9Pd3gjnVAnx7pQYtaP4sKdXw9Jd65HPR5WXEz8e5RUdOz++gXihjFvwlyew0Ip/Hbo7XHd/AcmiMcPS9f777PWSxN1Dcn9OEujOlXqFZ7Zf9aVcvadY/nIDkIY4C0uHYOo1EyqQubFhiitj9RZlL8No05E7pR05qnEp+eTULnGZIuqIumBRZtJoKnHKhu/V6rlZ3x/5+1TAZ2OqkQR/P0I1v5lenk8p9//XrQNqhITcW1vlHUw3/m67VX8M4Gbs8YmLITWfPEQMMmm1YpV1Q6NfYz1Bq/yhiSqRTJTIyHNyLgjD/qQojv6nPi1Vh4BWTRPbBzi/xLJFl8r8baYRfrZ9TzlJqyfcIA46rvwBLzufsUFEq0ultWdc/HTbkPtPgtf1TxD83Qas+co4n+FuIxjfZiuZEdfj1Lyo6HGbzHjJwpxl64MQ5nEUt/tSUjmeQEjejMWn1jIZZ3Y97uDPaj3daZi5jZcc0V1RoqstLhNW0y92BhDshfzoFgAUbMgaP0rxm+3OFtoYMpIuzNPhUZLD34N5Z/uINUBr3L6BUFHFXI5If3dcUvOZ8wpW4s0Vc6roso3fQhTrEvSM5NPQvmZW1NdYF6+/BhXIJuDX0+hHldpMNZAJLiuSYZZFMQ12G/hRrGbG2nH3PG8gqgieNOY7P18Dli7xpXdt4HUtQU9JYpaBdYarHx3Peuqmx4+/cWlEbFbMTWvGJoljZqRZAwziWQfGBig1xKxtytSVmFP8KWhAAMh6V0L9g+ADpD0VRNLSmW3qeyrBBc4cHdCz5wC2AabN+FwQReChZ79I4Eyv4+BJYtmWT4pqdRMfQeH01DeQZlPXXwI/w1++0XIq1RCI1e7Des07vSUcxm+hFbTDHOXMakc9TtTlJOqkVsd6EKnlQTZrh1xSvlodBK9mQFcfH/ld6SzWlVZFMDJF+ZMnVkow4X486qdoun3MqCPI0rqOipvQoC8OMFQ94uvcE6HV7+8Az84yxNT16/2HXY/Z1a6OvSIy7uI2ez4eZ6RNH9U7OgUwmnhOLLUzj6WrLn2Hsc3NKRRtRd5m1POOPERNbUlDrRhcPdDDSaP4WMULtdMT7PWpDiH79ECB4NJyag4oaGX4UtyfHznaQehHyzHcCBfIXJ4r3yPsY5oqZ9lwo+b7Td6ul3paZ8fczUCXYDwZX5gois6ClzyFbPDgyKP0Ek/i6z3oAGDiXRvU7BQq/lQW8VGcjSZZoNfP2NUiu3+QRRUmI1MrlW+IIyP+671r4cR/8iUjNwFpzy8Hy05AJGHbA9y6Kcvh4autkRyLbFby3MoMIb4dF5R1mSy10N3xbgYl41RN/Bczpqo3YKF5Fq6fgB8irYUTHW60Vc69rLrztdAugmZwYRTJCeFu1gXug4xO+E2OA+CuwKBskRExlpfzkxu8N4OtjhI79O8jwrFgIqzoGnQ+tgDe5SRohWuyCWj0NueKJr3X1SHTNuB/c/aVe3SfiJsoH2i7MgOoQAz2w9GMqaebB0VZRFKk6N7p5FqPljojP715pIGvWwA5SPV2BcKGbBAK5xR7lyQAwnqJvY07bqskcnYHHtCwIeaGF/svPGXhammd4j+iNNbHfme3u6P7pNw/Kg/ln99fenr2ms3d9QjRsK5jcYfxbZk7VoOD0//nr5tKtJuZx0s6yKhLSaksjDtIS5btjlodGQWbANm4sGrKV4h5SqbuWES1T5k+VtGwSPoGcpw6ct8KMuL7Pjrqf0qVxyZko5wXlkxcJT0lwOZMxxECZLx6h7z75vSLPR9C7KTguVM//hFqshPEUPKOATC+gSoCi6fPdsenWWzQdRKB0EVvC6tjDwPlpq1sww+79hB9NRAHjhuXSt9oduEoh3ZSzLpSCE2SkRNsEH753Ige+p86M7Af9522LwfriimBYTgJR/M/ZoJEqThn+6cGHycT+RowA8sV9qUcZkbUUq3c3bhFB9cIAVsxiAwbKr5tqHM5zuILvnUONvHPtXjOvQpJTxtEvavXmDjSlBdVitSLWbWK/Y/BVNw9jEL8uuJTUx83oiQcuq241DS+phOVUCVmER5nxlxbK6/HTbMpij10JeadOmAj+msvb/t/NxFUXhKXvOkqjw27kTe4fuZXYzyvp6lEfiiv6ceqEKnynheKvSBOptF0jn6lOgvokX5i/aoGmUm+JMVtJ146yVa5pPAa6L2OdQ0/WjFDzBILSRM3ri0+hcZ0oVzi3/6pUnspW/ATtZtsnNwqUCCULtPdKAO+M3aY0yCFKuE4bITE0R0gKRydpE+xo8ZeC+5dozoRSvOOluiwvVen6xBLlJK2XOgeuVSdRFr7kmgREyny9fKiANf8JZ0O1rhDP40PRBAIv2bcySaCqEoGTFQXyvCFnJ5jJq0P3ZPtsUDEq0OPUv7DL/9W0x+ijYw44P3CFPWZC0jzltGSn1YlQIeunLkJEtwLvkjso8nckcqSKYvdTBGxR1iN7aQnWUjZEW4tPA1Vv7spB1XfHuWY5FUVi92NYqnNEMD5Q/3W4jMZauAcupqMea6AimyPv40fzwa4ulLQLxLfHiHpVfer1i6CaICEaoLLQ/3/mjwfh+uPz7wk7AM94k5s9qd3YA77Nj/Oii8J+wei8NmVS5UVl6mD7PjE9eyBHDiYYZcx4r+77d5gjzp4uOapTtm0rwWBQbGYy8qUvtBJJCBh5+rjlUVK4+Wkumiu9wnO7h1nwuOy7YZDTIMfZ2ob+NUFh71bWSosircZKv6EJMtieqwvml+kdSsVHhuAalgevE6he7lsGTxbQjYKAR3yBhgj0+ihpF1PFA84nCr09c4Y9C+3HIXbJkbkVgTooXFfCuKPxOnP7KFsZYiwmRx1/yBbrWHJHN/xcNpbRncOhTQD7eRPG9SVRaYop069Lt1jymU8YKZ+Ve8Whi51xB1KlFRCVK9iHW7HTWXC2KWVaNpKU5fkYfyMODgFc+ax+AXkeU2zghbLBs6qYW/ZyMjqq5h+NbbVo1NBFl157gGptGfWpeiy6ev16OCHRwP4SXocBFMcCcsPzTVYy+h2tXXJpntrfo84x5SoE8BITdfgEWKhYCTOvE6LoJ4XcEEPfblE/F4mFBNrbCEJXERR933guIqZXtXzVO43nSFGKj5I9hcX3c/LaMeUrMxbWI52ER22PMEWDpiHCh5tZsG9irpnSWLqUXDcEdxvltzBCVQVXNzIhe4QVCX3a3PG6ck04anzdWXGzIdTBermfmehpMb8cGPIVba55hBGzfrdWrHP7Iy468HuQL1Ht69gzgIzPonK+zVKwrYASYJVU3DRF139J9FlA657VNBClVm8JKHk2BctVkrnJddrcIa0o1anMfF4cw7tm6mhHqnQomskRtUuv4CQESSCSq9Xt+wUVAdsQ2/quTLxvomiloFBthXUK8OFaCGj7YUugzWgw4NHPpYndT2dybHoZwh12M2lgr9EjH1N0g2scxqT9cZ+OOL+pu/B0YXAQrjyk3Ul9rpdD8DTFTRUCziL8AiL9RwSsWVh9NrrIiBw+NwPNiafAd9/Sn2yGmC+heICSGtBctLtCCFZ0NdppnlY1yM8SAPtyG7VlkTku2Em0+VI4MZKmIuUqSQ/04YsVvrUsKdryi00ehh+FvvV/WQqL2NtYyNdnKg7ByYU1FU8vghI5Yve35jFwXU/Ud62AbYy2Q4F2V4rfc1kxN+Fou+FLqPS4tRQvXTADT9+6nQL+MTWjkoxs322MyQZPumw6aQ3dcFMsaaG1MjT1waocZrpFsWCVClDIU3Fu/eqfMnSSYRvqPr2oWeKp6XT1CyWCbxhL82IiColPtrB5mUwnJ7lihRD9g4fDkeIP0LCvHDdep3U6GhT7jltf/tSGMcCMgkcN3zkf2mQQG5B4oOMd7r9rvOmC/LIT746zhjo28LyE3dr0hEMoFN/hI5SEb8uchoH87S8E3u2ekeLzAn0LizIZemMeC57FXb5IdFTo21/SZEfoAQi6dXtQqkN4PtdgcYBp70e2UtYcMbpEx+rQo9qpI82uTi38vtrZ17vGwCW0KTBdLsZc7RHuhqkmDDF0g5/Jos5Skix3Ovtxb2mfhiy8cAtB4ejrNZPvplBruafimaHm+vYZkgZUtgpRv2OM/QLJ94EA9ZxNv6mgA9wM7PuG3pZc8vaZM7sRrxxSQwu3gdRAgy/y0OIgK7LazZM5s9UN8XlddRekO9uUh9NXpyEhAcz/Gmq39m2Bl7w/Y9qXONYjHSEPwkDjQvH4IwkeIgUPlr8nA6/7uegyAWZgIXxz+vsOPyf32ysW0XvrBKNffFYZ3rMRvDRh1gNEZD9L/+l2aaJy4oEmDNZyKC+2pYy6Oe8NcUlGGtZlJ4UjPcIAaQsECYThgPg/g0qOz+nNLJF+mOXza9U3nmfCRTbjVJe5y+jVQ4O5dItxg1n3E/id+cKmvM5qDjKfc9accfjGXX7qvOkYdzDRK/vai9DDIdLk9fVkqhBjH/6VS1R0MeIDwHXi65HMKuop/v90EP+xxXziRBCwjRz0rwBnd6ng66r28Edy1JOVAk+SRvIYEJGIumnsrWNcQxK5YFTFFVyFc2Rzj03RdL8mFAuDCPBk3FweUPKh9MnWdp2J3l/0NP+Mu1uxDjLJejvscAjlyJZvTE+LnaUbnmI+gJS1A3gekMZoma2tP0r/xUx55MoI9nRiWJSakSiE/w/U2LkXYEo/pTbJUCTxC1Fg/NwGYeD/pUXSROr4Lm7IFYjqHp9Pe8tH7qzVi6C1KeRMfvzL+U8kEGFxgnA7ZzSEhScBhmGe+HR9C/5pcGWVK8jAr2XbqJlGqn6p4mp8dZPZJZd2uWQMO6+6+OYfRn7xfTWkTTwn5GIUDLJcMXEL8nYH9WdZKEazh6CUkL0uo+caCJGe20wGKN4f6a5Iv6d8VAHnWlTfepSi/X++9lXW095TtlNO/JQ/5B56nNaFTwRwty0u2Hf6E6MLuNzsxGx9jVgnwPPWGtIX8urQV48/0/PEZ90mhIDozbwcHKBY6me7an9uNhEae+tNOrY+YthTRs5eG3BUiBOesN/7SmGRhLyEogQ5T4NGhMeFM2peMyHSjWG6iykLLRfjJneAeVS0avxNa2GQMhC0NbQFbwoRyJWHACrptS96TkA7mpHUdnPELfN1W2XEGu0tJRymjOm7NT/9udYg79BK5UxSYJb8t+AAvsYLlQCU8uCrDw1vAU/ogL/Jyl/fK1wIf+q7p8H71zec+uq9GBk5R/nDtQgju1sNJqE5oUGHyK2cDMBRKsB/6XsxBMM2ye6pWqsqSALo/GZ3AMBzkYNmqGdCuaqqyfygqQ5q2fqW4xMovbrLzPIQNVeVQJS2D+QcSoa2Hf07eZadfsMB4TXIkmE8T7wb+0gVzbvBFs4VdtpbkbFStlnCcMT9YnhsE2fPUMeThiL0cGeK5vYQGp4Ny8EZ6RPGCflNBn6eEwSjUrK2JIvK3z4cBi18ZAqZ5CU14s988TIkXzh2vYiOSmZXKAynW5RNF5rHMyGYnW9V4r/N8KZwCw/QwsEqGNAYrgQX5FodUKiksG5iYKryGAdAXYpQAmNjC55GAaUbhRw8h74M0AQxpwjQMTJEBNBSZ1wJ1EmMYA07QAM5EANw0wTj3Ys0ToQg1ZlYG5SASPyE3KkVMHIAAoQHVpV3QudoNVA8xiXmd0nzFx4Ed09P+PVNGdr8z9Q5kc6ufBuTqvD+vj4MzZH2w9aLrT4/zVDFrOm6X7Ghzj+WdhN1hX+6kxjwwbvszy4tdu397yuV+zL27Dym/96ddUAePwgSNGGShnTMMQPjEXhpEOkzAK/GKhVG7YkjE8YGvGkRTbMgk8YyNT5Q6xjyKC82gUh6uYBSlwgbnKENexQMa4lEUUJXNUQRZkyqvKkqxhiazJLiyjNGQJqyDv5FCrHMhL1siJvGYd5ULesgnyRR7ZqvyQ92mQK4WniZJQVOyC9CgCbypPFB3vyAtFCodpwTTypPbAREmxJyYNT8F+MQk8R/vDJHLFZpQt/4LNmSovwd6YdtzR3oNrepgDw5JPNR9+4CVV+8205C6EK2PH/2CeGPVxZtIxSvjF7Bl2/MQaupppGmepHXYSYI261qGDplFjHd5jk5qpDluh9LuZFPDmzltdb8XO+SdTFbSp6esgwJsw1dTE31GPmkzpXfA1nWO/UR1TNP7+zf+aloLu/MU6Wy6Ojkw3ceRIyZWXPm2cwlNpY5w8UKr9DJOap9Z+U775rrbfWn76szt0Kid/1oM35d7ft5ibYUTawx7Z+I9+6IIJgw0AMKij9JquVu80kdc1CurkzkLuVDYtrY+ZhT2RWWGqYl9nHtaq90XlkitccQpSarEGfQiXw9QRY7Ke9/PgIuAgOc75op+is5snSzhF4+y9uDRsLhkB+GUeSjBs+3JbWny4todAcUuGuAQQ6TRpjGM30AXj+mnOpH3yQzZwByanoIoiYWTcsqtvuWxihl8RVR1UObwt1AEr3HTroF5GBtpab8vph8ekqxx8TCQC8fit/X1uNl8Z/rVbUCZ8vqldSvvO86naLww6SkxQ1oo4yc5NxtDJCf2rm9GURsT/AOOdd9XFKAunNGJM6ilvJAPhXG+Lvrf+ikYmdrscyaztwdO5siwqJ1JRHuzN8d7ELQ5cAWqbi69MRgi7xcONUz+s98tyDHLF+zjDANbGTJGkNhaWH2Y2U6cdQcqIvMPgiEUC5FAQnXsyiYdsNk+ahBYj6R+ZBlIuXyPj3izNdFxIOTZd5OkhhQ6RFx6xd0CHfspV/7Vcwp3noZlYmxSEvaNv+mQkSZ9f4O7prxCjfz3WcyQsSCMK7fFYNnRe+O5q3xB8mhsRjTxojpcpZEpKoM4l8VnxQYJrBSXzm7XPbNsXPybqvy8bcpvjKLPAMvq9JA1vDOMZtfGBhbfCzEG6TzUuyRZ/z1W89iriDd1kcs+p9fH7FvQBTyyfO5cFf/RJwMd1ME1D9ue5W+DU/N3ZWBm0i5AV1CGx0Si0QqF6HkLz5kXxKnoCWIKFeIE9rSeftVk2L/r/kMNcU+rwVRfDbO/clLSrGjZlaj2nlAvVCBV4KFIWwnFy13qKREzhp4dUFVKG4IhE+wDG3X4XrgTS8oZ3wnNOAzhQz/e94Py9FzGcEE9idT18psBAS+1r6Ikl6h8KgW9K3m4KV9R6QtLp07q5qwrSHSYiPDm3gYjXGEgiL4JT2Hdi0iGKVAuJ4ZcRT0AWZMaByLq0mNOt8V7+BQg2td4YF8bPmDJHXrjYKJ3+JWKYY+R1BAtHIt8wbpD2uNsBfzNI15xRgM6ZXBXiPeV+4vlhqMP05V8CfMWCrDC3miezDRKXPqDZkHsbFXLRmjHDRJy3A6Eobxi2YfsRH5hEJsaEkd7QIABcRShJv5RSgjlH+x6EpRx2+i+g22UmETzSgqa4E2z0ZTh9iegh0ahLFgk+LkonsxsPgpr1pFPMHKxQA1Wa0Os+6RgE0nsSxHbOphjWbA15KiYMezwrkNzxGHjipfMKFlFisqaLjCqClpc9rBuUkUV05mna3LVjMyTCl/6+f+ubEiQ6g/Yx1CtIBo9sa/Sd7Nx1LM9Amv66WZDKBAikbz571qYW1lWo0zPiGVc1Zf8lrO3LKHkmIoGGUJtJYvqpSRZvGDn6hFlfUZzuMAzDsKzhHmkzKYhxmL7uHcIbvYNbu2idZHM05vI4iDan7OknTORzShphgcRHzxD2vPaZvWa9EXDfIfx8UMWklK5wqJrA2WlAmw8td55T0W1YVpfe+tPp1/GZNsW4eDwbTomEKcnmcDkCLueh7rq5jWUc15MsvQdIU6BTehU/7ubSecJYGeGMPY27a3MSV+u95S1hyzNk24uq2NWDRN9bbts+wiWB05LL9UaG0CsYs8g+Ha9V0ZnWMQfnFHruN4VwG4h7Ah8Lo1IRug/ps2MG+ij1beR5KO8yR66sDNDCVA5AfrVIbmbL4Di6DaNlAZ9t0ziFWoBntVvt3qLjPxs6NqKPzo8r4x2RFKdP6ZIs+jmTLOEocCS/IDzBWdNzDtj9oOLCtwatH21PVBF3EFHvGipjvIXHy7GbnB0wkVoAiGgoIuTVhsei2ZGNIcr4ENEQcglMY+5W/DJ07y2p2jpwhwWMqJ9cpXhGE3AocHUr0GnEKpbYDr3ogFnBN8MECb2dlTsYxVN0pZTqzHqIOBgkEP2+Ciy2AprEycb6mw2YP9sOCMNekY5NOmfzanWuK2q7HYNnzJsY2o4WpACAtGha6UjlU/cJNYM5OznnQrDWKgK1v75HWqYnqg86hbhR0UBikz9+VeBzo0Ctyg7sI81H/YS5bPz1VO40t8GtC3iaVYuHd7z1bOvE6SqwB2pnXJcg0CUJU1Zuu9Lvg2mePNYzu7ww7j/TmSxxiE9uSIwT14lLF8j45JOekOLpcGOrOPnNbpoTi/kFr8tktahDz2kuLpX/QWGMYgivPqf01aXMMIDQcMkVGm9DcE6yEToUWvDQ5iJtwjFtgcKo1RxJRxFS5+vNVNemQMWJ3JWRPhv5bSIZj/u3vUphmrcEo5jerRJWCQg6ZQ1LhWAC+0vIqSMFoSNFKtxqaKuEVG7LM9OiUuulkSJuTzV6Q8Rv21EFostPvvuW8HS0a6ndTPUxU1irXY/KPgflBrLpq5LW4n/5C/JpiY9nx04GC0gDpURJqmUCkTFwHDZ+yd6vxwaQIAIMsJqwZjf3WeZ5tM+iIqqTX4I7Qj3zlIfF7oL9Bm/rYJYmaImPFPwWusBjr3iYyHoyPPXrd2x8O/2kIjO/28XYRpv0sAEeLq8Pfmky6TEimvjfljYWjFF9r87ooXFFO8UvKX63QGewX5Gpysv1gg6SMRJpm0C8oVwalNcQtIdOsH5ZNYjQbyv7DH02OgPHnaP9ykOVVdEadFSPJPmQObO2bDSm/zq1SSZknR16o4wCgBOSo+3N+hSkFaaNWZo6E9/gA7hqsg/AxnrmnxI+qEQJwvkZnSNqu1l9BCgX2lfZtwpNSheX98/8aq1BPWA367SqGgzDMIyJ7BwTkUHLmOk9JByqNSoL3Nz3ZF+tQELrpjabt67wELZFCza8RDFfyXfovAPgLmqA2wnHLOfcLLQLP3qhGZMs1CrOQlVJKLXmwo28Pbr+XnlSQdlzArtkR3DmzgrVBx6I96hAJNPhSq4vG44oLpToGQ/YukS/N5FfuYQIsJLv97GuUHi/6qpFzhj3LxQ5OCCHeZI9KsTDv2PAKHTElpU50fTMF8hDLzCTDYmpeGD4Sz+cBg8x3b5xQqzgWw4eHcOKAataYy/51Wr0QZMvwJ2CHvPCKd1UJY1YG4PidVDFLTW6L7s78ZQWC5rd9ZAsC+eDZr+u7grtEefSF/ejIFlh13MkS1fk4v/k20XRPuOAFrsPi0hxC3EpRDkchxiqjIBPpnr9JgofQ21y0NQqe0yVGpUz99rCuARY7FJFMtctfbIr4yd6L1gOTA4w4Ue7h3sEvGjWqJ4RNbBlmysnA3fSU2EemdP2nW1QyGti+vE6xf0ducPVGF26wCsmFc1Hl4pICKEXYHUAnXiZihoo2ZVPHaosEN4Jr8ZaIomfdtkrZDfFpDI94IxbCEMzuIJxwGwBN7bD7ZMXKGWvnHwg9W8oFZwBB8AthzFXZmi4/AwgWuTWrx7WulRghsA9yotVqRkKG02E5Wc6Tm9LuImpynvs2KQWvpkb0VXuAWeMMblZSWhR1w15AC92TmMBmMXx/1NGzwD+q/NlBSIf74MlLBP5UA1u4dG86UdSuw1Z+Z0O9H5noWvXZztBwkVW7c/F2vRL6y6o4scIEis7xqDOMhnQngRin9yrkniZ4QUg9Ctjm2BD6Z/aIwLFirF7S4HjzNDy3Tpdb2Ff1yYIgUgiwhgSFuh1NlZX/5lVGQBC/nBREvpM2jXUyTBahbpJ/wkv3TGJZCu85wlJe+zRoSGruR3E29Ziilth5X7sLgPU8kB8BPOo/kLd7dk7jIxk1EY41hzwf+FDaBxESSHBysym0eaHg2JP7VJFzQrlCvoXO7JrvHye5KZ02sz/IThz4My4AW4JvufA4ZyGK6lmTf7ME9O4nUGq1h/RaeGb8M1o9/KtgvYeE9XYGtisiTiwQkNORonwhOgUbKSRnjRUW5nBR2rvlLWHvRXmIFaW3HYPfGWj7DkNaXozDEKXB/27dEqqbvz94ElzZY+88C5yfmxofH4rWVOQBITEVjIf62G78Q62TfHVccvfuNN2j9eqnVRlXZf3Kuv+akdOQOO7IYekyO/6gbtBpEgYR4PjA+haOCug8b/zb+12w9SCI/G96U5BeTD+DtKpE7OjZ+qfaChv3ubRXy9Pmh0PTW8YRfohNR1MnrXHRgR7p/7FS8WQT1B3ElQDMMVdrlW0g6epdgDDMAwjhfOtd/rHTBu5AbAwVnGyUB9lYigq0ruaDxiMo7em+2I3UEod+c0dUWz7yPGlg5F3okl2K39Jg03Ysn2k0rEU8oShxYuoUg4wy9gu6Moj3/We1XIKGUoxB1NOkWYhA+foBongoeRJOOB8Mkn71cv/rlyPWt3O8dJhjHLVNMD+a01EdZakh7P17A6jVF/mt47+vDWp1h0lTmKL16NdSnI7RRDG72U0APb/U4uBVpJg+RuGlknQoAkZsMsNy9hSNztlePUINZvBqZkPVxV2p7cXAz5nx3KdlQzs9gwowRakUrBGFn1fBMm4Ak39LbMU1PQ1P43jaF4POg4NtMrGw4monolNNP25MqVR2uiSjNuPJgFP9NpuCXJNEkJiGBI0c028F7FspemlzZBtUqGvxPNzyk0j4yvfgXqFnEpJWR3/oPqLdG/xzTIricai9ymdtrer8iAEvkAg5Zf011k4QPPlYIvDRMh7Ac+qWQrPPtlhXmxNl7OVihjU3ZCMED4DFpOFZM60WIr9AS4Zdr4Wuo2rOy8LNgZKtKa87zaV5QeK60CXN5c7FfEEO1zB1ccF9U9RYrdvDE9jz3lYlWKCf42N3PiL2b6INMgTK3Y3z7oJo8M+8m0s8GAoYONk9UiBdfre5rf55pijKMLsFcDNOTXhiWwlRulO101HbU/MG+Q5zmd8ymOYs0Ag1KFU/WDOCWTSjFJL7zPh60qzEFZhehXpdS8QSk4M50PTL2/EbzyXADM+Yb/89GzbwOfab/BqicxdSBLIBLcWDLE3kPAOmojSa5GQElqlY/vEoun4sfpXu5i+4cpjMCxYamM6iJssEhGNDrg2APG40iV1Cz3uBGkGwU191nB/ih0OXAg60l7fzJwJTHB1jhIjdZSS/w7Ry3Wn0FHysy1QJh2r4tu0I9Pt1MnjSKA5EdAeGirHRpk/KyX4zdbqSlJFlhBWFPZfDs6wdcDOrZLgDpiCZmMjh9N7Ng4Trw24kXax3mpBLR2VubGLJwlJDPheo0bciiJ74WY5WSpVEKY6+AUhyFgqirgODpC8miyyC1NAgtF03et7T3+viSKHKBbFDnIWfO09SrltHoiKOfCUalFgY5e+TnjI5RR6dZUwi2UvFxHm+5beZ+sGTZoQxJP9GE2TWGS5yg322kgs3nRUjerE4yHlCVIzvULik8F2EPp7AKuJYpgTg1Hs5Xy+W2o5/xF57EJOJ2XkbO9SyYPc+n8TT4tHl+v3Wh8/V3usydzlz1LdSAy4TQWeDqHKHMjCp1fgftb6plN7qC/SYwc6UYeXz/5ocyzLTCG+d28FDebyYtfhnop9qrwejhdA2QgCTNMQla5MTM8v7xYve0GSjxPlJCLaMAzDsCj7cxHZ4K2uDmqQL3JeOGkh7VAPjP3qR1WqRj1/Xooxz8Wl+Q1cDdVI62nHTIjPncARfzRONieLc6CcCuX5skO2Mw11W3gRdMI9yJV07kEdoSVu3RCsh25DW+L7msckpkNG9AwY6Xi1rONXPQETvnbypAdSL7YdWSbHoLCFYM0nvKsgkmEiyMMylW/RPzxuijprujLUICKYBdoZHfCZ9YSza0luXuRXZsdtj4xxtgcGxXUsxwXcoPZGC3Tk5amhvS7aMMRnlm6jg07iJu1pe3C424JCAcSYTtidBbbGaNg8UmLH9BJvTt/h3KvK0XetlEkmPO4TCeVGppPuwwgqSA5Tni+79p6i/zfsMluRS2LnZMjpAvUNeCOh94GBNvKXKTZjD9DYTEt/CdbEtmDWICQnQbSeikOu1lMCP2yGnC7NvkcSaWLq8wk1KYw/PdJYQTmThWTT9NBTB/YrluNhzpKw12ugXMBl7dSVtFRyQiX6xpkeTAaE/j9Au0YaIF8SNsQZytZCPkxpeqRhqRpKhKxddiFM+O4roT58+6SDzGvWuxdSf2eKtRIycRgkOIIeGz/zouPWrEZMQ2ZtjA4bC5T6qOy2Y7rA8irPcVKIdLDqsXebW3h6Ouo/ycMMkxXgYCtSTMlhcoly1PGmu+nxQ7G+O2aTV3TM38w1fSeZd7yibuBBJvx5KUapy9507aH7TyU0VzdrHpMY24W42H3yHN4oOWTLwGfW40Q2bgvOkDaHGyqIQxqjYXPtVNVRM/YAeTKn2Z7cyF8mDdJzk2gylmUjhfP3joc5i1f25DN4Onm5zL4GMA4yr1lKw9pvTziKANZ9gbhIVoCDcE9/xhG82ctSSn7d98lzuDYKqh6UnzOVZVSIFODp5KWnK4hHN6ZGbzfXnobZmBo9CEI18XVigfwm1XXoi1d/0VKW4/iHSH+vv1PzLmNOa00w9Z15PEaJRyQHFbzSKNEVBqLageLVX8CxQ7rGXVC0qsWBLMJz1uBKxs7/CweSEnpEE5ecnsOz80cCKlMZbf3MqOfwbAXnZCvxYIiNKnKKBSIjFv6Y01pzaVjVuuThXRevJ7ml6l6/3iOcY2Zt/vf53Dn6SRJE6wFV+p0z9eUBNjWymFeTY9FfZ7g6nvch162kl3KJNUp05SCPrE/aJOTXCiwHf3aakiAgaVcWiTtIG1Fu0OLC7F1lFiZ04RarmIHlWP+zlbM6yU7C5qgXjbLv41dJXxcUrRpSphkq8DWHJCjC38+Wf1dAE+R8hPJx0KChxyCRIzTV/tp1aFpAWr7BedBCZATEJ+JfFtIA+1X4DT0SVeCBpIR+uK23t2XGHpw2UfuoO/rd1zyvEG3UxLX0QRyJQQzDMIzkHq/jK0iyKLse2nwq/SIrwygthFG0VZIPSdFL9WnX9O6znypwgUt32RBSXMcZUMaZ4YCfEryeEPLE/rZ3KF4Q2qnyshgt835S0ezQERcMB+hZJYGsdjD8RHyrZpyEt+n0cKukMydwXqt5XBk+l2Vc00fO/oHjg/UfLta8RoKqacb8xv1KqpKiE2uJyC9hSRNh2w5O2VXz+dmbq2McItc2uNIMnHdGPUs583TmD29GYI027jf3FKrOKoUlobXb5/87QvJxwU8oy1CGBM/17T9NKO+zZ6qsivDAVI3JVvVtH1arIISazVXlfx/5tz+FzmB2tco9yKKEwgnaLRQljzZbjV09+Jz/ITICO8W7OmHXSCa/n8za2UtDUhhSKNhiBKaS35DPbNGKUX6f5lZsPAwXxLERtBcwaXoJiP63b2Qcev0iPWGnQCC8ShG/1hWMt85LfatQ/S1w6jBwXH4x6XEsnTjewkyox1UUAML8JpYwNrboGanKtw/SQ72TniMYXXNtpRk+1jrnhRbEtwOTStfydtoMKP9KPa22/3SiQQOWAZBN89f8aryeJOox/arHeTskGiFxn4DbzV0al4v+0zjdJ4OnFyXnnhDLKpsZnP5tq56nIH8VxVUhsQD5yzN+2wB4o9xNx84Q/8ZHMHSDLQiwbi5LXu8tutimlaPlX/wkHN2kDRqXx8TncteHtTUJw7Z7uwc/oalNwdDTEAYFL54DrKzy6Gwu8ywil2yjFggMVZZeJdLqcPCbP3mruK+TLFkmbmQEmSihtlluzqnowbbcPEg9UrP0IYXdMAWaTwnDak3zi35H4N2ganBAyyVtBNFrgVAIgNyK+wiS5uHeVBSRF0WfdYVR4nvr7bd2rHtVoX4hdAcgQnkOiJLW4RPa521NBfIi+ksomSaFBB2z6z/uXuuzOU+rirOWAo16+eK+9zS6gjh824Z1gAsYX8wWXdSUqxmYazXnE3vLt6DOPsPBB7JYC5U2JB/7i2gBtQ+Wu25G83A1ZLw5meUx1zpwlhZ0yRMPzsZZ/A2MeeaOJ563Z6byXOUi80qrn2znGH0cJJklPbLhBuDLNRa/hLOPt1w9eisDhzhwsEZyXGzj96KMNz0tEj+/VeXWRhFqhQHD3pT/ixmMqN1U4HhAtyoWUHFgr0A437Geht3P/oGeIJrwe9EFK/UFdC678Skk4gAFvHJaaGcudG4+h/7CUYTQ54vyDPLmNEMoLa6NBPu4lTiuAJSnRcPgntOdLJsK6vpt8TukIO1jo1VyzhP5GcFtSTSf1Q7IZVrzU+CQq0BhMsMVzbpYtxw+JGQEwmh1vmNGxmI97hA5GqoJloolZxiXEe/iajWlLODPW75qwx/DMAzDyFzWF3xruhczZEDkFOpmPtJH6TurwNTRhLa4BJYASxhPC2T/IHFbJkZYgS3n7njK9MkAG9rcQRoHv7LtPtOCMiVujLJMqKjc4o3sDbn+XId0we30djtKKWmWx7DQx9/H2uhkU+7hZZMgm8bgBlTUOgHYM724d1bVlgQuQJgf5I2VUAf83+qwYAQHdrgN+ZfNE1LLHNTDr57tqE7qp5UIN+gsw7dZ7rzZO8nmCG9IAoKhxuHx634GLL/gyKUq3ePARWtPFDP5y4DawfnnmZ0fPN3ClaRiZanSCQP1BlulO4tG7pX8zVQiJIvdrK8eCwXNfX95GBdddJn+V90ec1lfsG9k1Wjx4uk+64WBj+jwBUU5iraGOjEVqzCcnmK9zEUl0/o50DTvNFFt0J0ST0ypuZjTEn7VeM0339J3w8fNEU8e40KLUBhw4hew8mtGRlIurSgpnosRKlxWG5gZaXf9tH3uBmDiXXs68esTiuN61kEqeTSGJB1DrjMmTaZn1roiDOHilnrw0pa3inAVgFUCvpbMzLovbugwIAmahdKrbon75M8OhYx/p0LT+axTQJ8rMHYkm5xXJZuDXYYc+m8msqHxqHOIRpQ9ZijcjD5gcEbQb9sFs5Roqe49k2F0KTghHk1A02l6IVKkefIRovvgu4VWH3w80WI0AqeOoK3pXgxml+8JaO8PkH1BxCnef39s1QAS3eMlFR8uLyZbUZPX9xfOMTapaVV4wQ0tyYsO6ANRIQoEXLu57FsWfjToWhhl/y501MCIfBUIB9JWL5nA/SQiLzmQkoJzt8U+xz9jjQp1aHwNcoLt5a87Fi7NjOxox7pG2GifxgQ9gOBfjlgc8cnVlzFyfyp/HgD2z1VRRxRKWnVHo7BS6oUJ3SOMHAZiZmt6gQFJdwjsIV9Tst3K+O5iYD8EpE92KoM0omJ8Y86rfoFK5Zk2k7IksOozltFvWKFt3yyEad3DystYnOZO9FpPRfVnjOR7DLpQy4bLlNCfpKdDgQz07hazD+eQAZGjsicoV54GKdcADIuUZpO9fnEqevvo6Ru1+k1jRPVt1Ng8E+ePP5iAZyUwT+2kh7eqjijrWrmRn9p0226dIKrpc4YHU3LfoG28gHaHTFqjokcH6SiCDYKXaMrbWXCDr0OnqAm/A4y881NT/hmUeP4vemKQpX37Fom15GHRICt2cs3GccRIrBNrEPsqkfh+nVitUaswXGdOPN6uoZKa1W/jdpMBHPcqh2G5RagNSQ3AzcLirzxFmBSYbd29VuVZuD+kO5JUVYijVcCJ6WaX6ybyfD9PCuQRDHayc3oaRiT8qcvVhkpMtj7dZPiQPu9tEtqpQwWmWGA0ktm9NhDpMAzDcNgtlePWzEr3avAOEHaylrFJk4/RhXtMfyX8d/ibOwuJQoqPrfddsQP8SDIT7NFN9l929iVm0qgBt70gpo4UVjWhBQ9wL878utxuty+K3swn1fJKwHDRtPxf4Le6RmeNMqfgNqFNeCiAFQmkYtkPNPMyW7az85KiPUo11OrCa7fddtYnHpqFVPCxFAzE0Y4lTTEpUkYbzg/Wo+OIlWO71C7q781pALYPr6jxNSBxOU47qkkJmAxZNiYgSmBmMzugicqIg0LUKY92aVUI0aAXgcgLBspAh8yKwidoMImZgo6/QP35XfXY9qL6reCi77T7DpzjsZRge/awtQphV7koNrRCNGDEC+WgZ+pS174o53a2/drGAED91C17mE0rEk1h6pPMViitTVgUPCH6/+5zVWIWEwwm37r+kHwJtfv3QPYyW29mlC1rFCuSd40vuPdkxxQEAg45pU495pn5HtbllebZhIymeQ9JJQWvdH1TXo/UjzOMUjs0d+6AYDXNHxP9WPy0stPgUWDHTX5kIZArsQFvN7Lh4uZmAhNVAAS46jUpJNeljMH0ljPJlQ8zy4+n36rPgRUCTowhmSIOh7tNcAWE2TJQCEjGlnjX0B8uQugH/22g4VZo0wx9dYmaEXonG5EJUBGrqAygP4CKQy3hUsMUhpiT3A1MUH+s8xoZTogFxyMU4nIgEw8IPCkcKaQS/VkLJerH6yuOcla/KAuZksEgyviR6EM4UkTEC8SKUWrzUn9+JWZ7CMrpb1OewwyWOSKo5KwIDatOgLA/LJ8y53+3Yu64Nvs9N81ID2Vl+6pHscrekR7oyEw2iNNaV1HcvrbWj3icAtEIBD1Vq2b2DiJdlkBilR2U4DW65/vTTFYwbzDhlwsj5CmkP+2t9LVRLU8CZ7Zy5niSrtvcOPKdZfT9yCyiIVDeJyHHjL4cq9a0xZZWA2iFJS5P1W2pKg5SQNuuE4vFDq67cGPZ2ck7pXAiL6wg6/Z+k1pBTXlI+K9yUck41PTuT6vritUvpybZ5BaVjD0qOFMf+ZhT9biOjq6TGpUpGtNR7vt0ZuABzhLhnOKSPCnF4N0SvCv7f3mQE4L65/m4aqnpYRc4MlOoT+l89RWovGXhKhDmpujmJ9ffSpqXHbwNpOKFWaxi2c0Qp3lsJ75XjSlYi6G9tkfTJC3M461rZPq/rYBJzDY806wlkbw6wlS5TP9r7Bc8DiU8ge2SCxr1OhUuXEuVCP6HzPGGFtaxz9wSPmx9JPiszUDDOeFUBcjCJ3rfvm6+pJO4FQAyy5wugZWu+v4VDCqryM+R99OYGaYXH/nhYZVDK4Bnn1fkoSsC5nwQVe56fM/m0hBv4ES6j+1otmSnmfw69N3W8D2+QltesW15vAI9CINsa0W7lFMYPUWrUplkdI2+2TV8nyZKL2j94HSQV2PnVtyqWWSrtQaTJlgXa/RsJq6AkKsk6O64sXx/L1gJSkkPyga8k3AI7EJq7YBjVBn/jQx4yz8hLKPMFlg2KE72Ehwo/t9OC+a+rez0jvYRg5S1FrH/xUxNZ2tSGh+yWFOjSt/9xAcxQ0NL7zAuobnfKM6gMpewNTeNaRk6DHeJNTSs/PdEajaWxuXJjyKWTF8jd62pna07qS2dmtWWxhl59FJSE4uWqR9fzVM/ig5Sb3qx7rxnSkbQOrdRvGFlLyU1M5VxueoUscz0LQZuNa1Pm05aa+dmrbVJRv65K5XMrGXl5LN55STroPLqIdaDXabGjnWJsVGHiW/PlcTOquPEi98UJ/7fRQZIKUbNAlra6AZkJUZlgbYkoxqXP6VRzZ9GEas/6MrIYfiuMjJXxhoyNV/+yytfnkzKVm5Qs7WUxXpky7Mfo8qzN9NYMmhqCvvhmkrhqiwfBoY1H9byWP9IWTkZVFZejWON2Zqeb0Wl58W0TNnh+zVTi+H6sf6Y8uvLsPJraxKrIDXvPmSVdz3jcm9qVHPvXRHr/pRMyFb3syCPi6rYSmSGC+ViQyq1iaI4s2G00spkJbH7RPkajNOZWFTmKG7CPkuG5NkRvOdSVMVWIjNcKBcbUqlNFMWZDaOVViYrid0gVkojeWmsmG9Ed8UJfjsJzhDViVZPOr84NoXEZ1/UtR10/i0MTbj8DGI3+tsjlpa/PjQZ/59sYkMa/Y8s9qeR+Du3n3nu9uUiE62+YvWazapltq/valbZFXfASP7m23U++9tjg/vL3w7dNr+qYuf/IcX/uZJdMYuOB/VWqHJX0c2wG/lkM2R2/Pre9P6snZsxvvmucuGue+2mCJgjYDIljGYEs8A0I/gPDxeeq4HifqtYzG8VivcgjGFNtnIzcd0/VuAdu1zHbwojjfTIwArW0LZXTRF5mETMUyITmxETjWe+TiJlfi6PTGJ8B87Q+Ze2OlJwtmHivTk6tFGFcGsbHUfmZUnVk1NQyEoKbzQx+r+Obu3PxO5/Rjb293fcF7d3R1HGC939qp25gJfY5iZUIyFaq36C9tHaXqE7ZygMkgLojMI+VOBCBuZjcljF+kQHWf3qiHb7w7X35+Riiawr1DyZ52m9oD6TYP+TMENKssgW6eMjX9iSSRRLVlJH+cOXXKK1TEoIDihRt3S9PA32HDAHbwUo90QWeF63BV55cucyAAu1wzmAcdVFUeiNgyH/z8491qEqe7wjKkLtBPVCdA6txeBKZkiOCywQJQsAqqQo1UgJll69TWD1GQZyWCMteWCDdOSRBokUym7KOnjy7XT3urirlSlKXGje6xt2+XggFCbIZwgeucChXpe3344mH2R5Okr/eVakLCYRTMEMadCSPD6TqwP2F8Nju6Dd4zBdUBGH0Ey3df/Lp5GF3DqRGF9pAk6bMdbTqJwWRE5LPPdOlqf7KjFoFFfWgYzdAu+1canv+SKLzePeBR0/20JUWvQ9sK3Cw55MD0fieTfXxs5h+NCNMg2BTyu67BuW0/1KktKTydypSYu5CeIiqQkuhnlRWZ5lQU5nvtn80V1QL+WlK6zaOV9q+ZiFvkWDrLa9/ue5QbSokbpbepdzufox6jaa5Cg965MXuH3mwgwxSN91lsruVQxnrXAORTnSNKitm+vut4XnvqnWvE61PtsFrcGcKzzXV32kwhEMswxVHnoLEqcO1EXWvar8r0FiN84hD146VRerblXiqVYlxr0LSosrLvJqyhLHNlEpj1E69jMo2WpUK7qMOsuoznMfgtJXh1Ft1EPUHY9HAtX8WuGS2q+F/HH0zgSiNFNRkx9Ro+hz0OZdlOYo6ntLru+3v0E/U/EspQ5YOGP/d+mLAuKMquJyBMAFIHtBUM9Wt4XuSMHuMOsGwbUGgW9fqWpLbJ/MxAVf3UENapVq+18p1xlavitE61Sifh9Vo+sIrbJHRP9K5Pd5fFwSgfK4IewVRq0D71QCz/SfamyaBxXbt+DiNc7F/36ryzFEUCUTzmp0h5Rqj/1TfecMJPLs1b5rVOptfGge3WUqsc1W6iVWavLtnoVAZq+VXfdQbmW57EUuQlcl1a4W2vy7E/NJlRlQ7epPtbxuZt858kBXHVXli6qS3YnZ0VVHJautJN+iJGO66sQb5VNHq8zfnZijqIkVlasPXbZ3Yp7FVSPq0hN1Gd2JWT0piprVVJMPUZNCXPVF/dW7fu7vxPyK+pmK+lj/vzD3MJKhrESduFjNkC5jxky0ItdKRKpMlZ1ohqOySMhQX8ncUVCJF58ZZSPqfBaWgiMDVNSTxaUwK7Nc2Yq62mlVIG2G1q+ydBRaSS1kArWosxnVFYkZC+aiCXmoxEqdRRVEwcEM8QAeGoySwwVRRqBYsJBAYAIOG0VSr2ISN4MLbuZmAJNDOWGbgU5OvDiBJy97/5qcNaEBZWBiB7S5iWAiudPwzc2cinR1JebmRtg8bM0M2eUne4x2dvf96NuPRzuxiLykdt+1Kq34xPmeVqSqJ6KbZb5A2NvVtTW+Q0iyKUshndrd5R2TT+lkOt0HfX/Gjd+QXL4nuhy6GRZoN3EBUPOCNtx53U2KjryJe3ppM1kNkdkhxxfUj37mXIdHf2v+tWC5lscyGS/q3sSeRNuxm1U1+jZH5ss4c0jbSlz9Lx6It0r+PyXz0Kxdq88c+93sqi/lH8M8rvN5UvVs0k6O+8aqJP3NvHsskst3gQuDebs3xNfs4H+cDXfhT695Pkt2q/pX9XQv6o76NzCH+v9IVM9D04yH+/ThSLNpBuXiNKjQrRmiP0PbvgKVbcAwG22j81oO+kQy+KPQLR5RkfehWzinjzRkVZp3Bo+yc9UE/uayHLjWF5NTtAF+YbmsRL+fIPQPezqX2cmEjARKjJ2Ff+YxJOPs3auIQTQjIDmukdXgyIygm8sUeUeeHOWdvVledKXNwK0xpbKegGlKN705SF27d/QpwbmAPkHl6Cr/U96vE1k8ZgtbQj+mQ1saUSSH4EJe5t/QVpaqS56e4BlI1YVJDi6zwvR8SnMhBQPKoe6XhsuJ4ZnhjviU2KJWKR8pM3nemnlcnOibi8XzKcxttkk0PpnvcveUMlHz/EJ0grjt9O2e31x+UuFHmvFGczk2PQms4L1vCzAto9abcE7wfWQ1bj7LSPlGqINnD/89AAtr62weMYBmXfOBccf3YtQKYeYluFT438p06HFEES45MoaqmuazzuFgVYJjvyiiEV+M2AMVIfpTJjDPGdjnqoyKvJq5uYMqK4zHriLsL3rJml5DWo3uwIP1asqQHiPpJSYYl7OU4BNQfQUZ9JQCFdqTnK3eLXvWeKl5NnVmkFWYeX3/Nbgci6HS7dEsnriUmdONpGyDqhRZSy6IDL2mCXjenH77xyvVvjonzf2Z/TDoJi2bJ2woO8qBpoz2KauFo+a2JsCsZjim/Gf4HqR1FRKADHz5gfNREp8TmqQE9h2upodbsvHyqLJptiqro2ZXePbx+G3nyCYxo8L3pxSuPKcUF8QQ7T91PMoUbWXU5XcjjCnuq0H2t8cz7IcrPC85H2XXwtaOVMrU8xlUUjuv+56ieGIfzwszgtPw6KOFSc2rSbhSa5D4JTm6PyQ+7v6y1IPiiIwO0HvEU65KJSwn6hnNJmcAeOa3SiGkOpHeK/KbnosJjwKXxV2rwOVTeYryeIwu/W4FU0K2c4Lg3Vwyz02PYgdGKTTOr1JQpfOAoiM4mJhiyKeG78gMX1DkbJCaesKXQam85rvLISQkLujYGGhGqtQv6ZeMH8jWxghXFdpVVjCUov0+MxW/g0VTfyqqxL1k6Wc1QRoWIaxqgRvTYzSUXEO8zZXvFxURZm5Q3+WRDg4ZByRpV2R01NKZ5iGpKZNSyPVyq+Vy++IyqVs3napOo/SleGGeIGpN45uTURHurYdGKmwL2pFimEfT/JMzDNOM3OVkNFU/UrxH1vUpj2xf8939yIM23eP6j/00NYehWycXaVcvxIsPL1oSKtS/gBgiy6ZeYbO7rAMlXLO0ycWEEq30WOJ7LmoZxnQsFltVj47nZHIQuAjzXxcxpaHWW9diKTWlQjx2rF9RMQcarjOwlg/Ea+R5DT4eknBB5kc9fYx+CC1uVCOEveBIDVHymvCu7CVsl3H0AbgX29QwQ+mRWWhZxYj/DLtpRfnheJI57xyeRn7CoG8+dTgPCs/+9AGh039bhRJxCDgVjgNS4u80P1G+md/D11TMGF+RgfNHf8JmMzWzXq7Nw+oHdXL3t7OwxHvTmT1+OTx9fe3/FRzI/VuxXeHxt7+sh+34/ZT/fXnB+WjWQXW2/92PPq/bx6ng9t8XmP5g8OOmDdYlbbXVrOPNSus29nbgqG0NVINet1BtruDwJlrX+rWU9yfPHh9N17B2uO19K8Z4/d5yQwIrbdv62YYABnJFKwXoIh/JhhtDu4FVRUsReiny+yjTGpw30sqTQQ1hVBJ6botpwx4f2264XwqCwVpbBHcujartxYJqqX9GM5I9oYplyR8T8nz2vByKsgl7AU6eAjidgqY8Y4nbPm9//6HfBiX7ENaXrzf0NCiaN7SuYfHUxCiwjYC61TsDjvbjHuYaFQdrt5G+598eZ6ZlBZHZI8y7DGFhn61dXMRzyTFkpoSZhR+yuHlhIVzuWMQ+I2OqU7G02+d6zp0CXPfUiJtrWUX9xFavFmExECxMetgLHsGn/AG/q0OqRhcBPQD3B0xz86qDMuGY7Y0YW3yExacDYH8HYDhU4Zya4S1bQQegYK0Hv7Fjg+UAygkFsDS1pTnQju5/dRpgzM39yDGAXdwq8PjsMMSyII0lgLyddHaDVksWF8/eCpo4Du2AKiSDFHclScT5+byxOErqKRb5prVVPLmFWywrQEeu2reoKMS7Qc9YbKDdNF8S4YZQg2Ceb8Bjva2oDZupmGtjOcJ8ah86+e0rASgs28kq3Fxj3Jt6/vh5yYLU9drCHnjvcn32fK3orHljGFfCku3vzXVBnPh02bfVZgaOGC6cKt75pvv1VZwJjajTD++3rvm6U39TIC7IYn9t3SZseIa36jBls4/NmpxJl9dIrHTg/bJit1qPvwAVZdOPDKmIUikiHIdINyA1tTw+bCCi/khQqcZZGhx3U0pNiuMyOy1i2Wbelq2aDuwPCz8I32hzIYtWgWAbHDsW3Pzh/fz9431DGmZH/Hmkd6FbGnn21j+uV5hxQiqaW0YWQPiceR8Sl5i6bjbka6940n5ZPOZ2MCZVgiEP6bYWpkuiyUO2jY3JEG1e43xN4VsFRLa5qt3Q5LZlNvkN+Yk0UHDmNr815SETWe4H1hZTmQZao4pbFbNF/KDqurhOc08O3vMZqc++WJrkrraLeeKPN+X93L3HrmSdW7fDNc1+PbNE29ZZWjqH5yxxWVI+9ZoCJ86zQFhSIjr0smLuulVi7Nb7o/DZyDtmxu4bo1CwtF9BvN/za1kqrnL3Nz0KwyixNwvDtYRCQnd/wx+NUYF+KYF6btFD//fOpcp5NQbxIXS7l+fHJ9dXBzcBNlX45fOfkrAOrW5P/o6/sH3P8mOHVHTChBjMplA7/+8xLoF4FLCWl3/2o23YOIHi77IUXwMljuGp98qtzVTPo6bMlJGeAfigpDfAH/9hMXG5IvUm7IYom6M3tcVcufdDdq+7uDctZkzewHbabJL0v5/aM5bdqKzViin200COXpLdiI3jVtsoaRj+9PbIpP9sC5Tb3Nd6d2tgbI5Udxwf0nR6Kcj3/wVqkk0JeOJ1pL8NaktRb4r94K2/PqMNDBinR18Pwttrch9skd2Q9XMnIcoL3dYiw86ysNUFEn6s0dYLKFKQiznxJzT4y2gtc796w0ly+gUY42R6MEtAxM+5770x+f0mt369GxaoaZVahIfeVuQojBfyeIAouI3wHa7dNm3AGS3/yBy4EQW6ruWSZZVJCR+Dv65X3YBE7mbiScMYlor/66hGOCocm/cWeGl6W/1lbHovucGq4foMtKlwhJd2K89s/SjRJKphAmlVlDCTPOoc1pzyYUjp06Z9lqxg5EXhXzTSEsYupr09fiH4l7gYnqv7qfZwGM5IGWyGl10Yq/MZHs8jr36XnLo1XGficajkqwbrjfOJRetGGiTAluImUNZwTjxek1hkDUgMpI0coCnAS1WNp2MGytR5p7UwNLPe7V/tasTzxSrxC1hVNcax0iILEBaB7gj0kCzsWD9it1e05MJi4iRaJL+aG9o3lmVHU2cvTmVZAUh8lo5EK2emr/mwX6MD36LfkU5McWJ8XJ4h8lDYLv1ndjN8OBp+CYK0VWFVafrwgt7e5ksRKiO8hHKA//CcF5+W+y+Dh3A/i4/YU0tmPHcJeuayT63vwlMjLhC2Gf2drCBL8kLqDgYSgR/SJ4q6UhVp7lfuvjL4bp3Pn4tFHmdMt2epdzu1RTT5SNDrviyjQZEPXqLNrbMNKIUfKsEQZ0RbNf6E+owDVNadLjOFyZ0lUNbkzDUdOInIco503C7gD+bo7/wjiYe53P2IFbm76boeaR0GkMQ+/AvID/6zO9aAXgLfo8inFbthorioV8z5jzxG6HwNzS3knQ7DCyn1ukHA3VmABaSz/I+8AGHEmaUQhEw2YU28jhFXvAPu2yn0DZ88X0nGEc2UlOdZ65S77fVE63bTZ4R5k0FInpyB5N23NOXIsmiljtti1VSapWirVUdXvKaQ5FQzPNMucfQo1f3z5kJ+sc4HgcVywbiucqFZs+JvMV1orb5F4BdsPA2YzAvWEfaeKsvB7d9HVQiNqrqlXXjoJFXk9MEHS6ppByBZGisFq6iZr24k3rVVKdikNKeAG45CrvoMvYj5DmrshTFdz8ucNF5Po7AUR5fXdVaAhqPxulpJ3spwXVayU71zXd25ykvTtf6jk2fVwXX1dXwey1nuqUqiSSr3xxuC8STFLqqOfzEAJi+5d9XXTkFgHJ1c/V8g/iWN1/D1OxqVEe+vPppeTVW2q/5n0XevhzE1qanxWLm/und2x4xcbVvmUsZVfameNPaeWCHwJ4rfFXfi+Ji7cni+dS3w4rVVXOUjOa+nou1o5fboGxmgiHdhAqx8605Qco67K96F7VhjJbbyvZC4fK/wwCjALUcn1/gY1kZX3UuUz09SZJVDNgvrwhUjN7dGVNinScPKf0d3IM7VYxFldDtgq1xdXWoiSF/J/KrcXjWRdEBm1PBCx72V34fC+kG0HfOD05Fqbiv31/wxKlerfnIXnTorfzb/Rdcs0zV/CfLeiorIC/MjFxPnAh51dHf1p6h5X7F0Ehb8UxWqD3e+6moQ0rgwHKH58NJNaCNZZbvKkeNJIcGdiris5rq8d1x4smJxxRM/aHtvJ01tv4pZ5lW1RuLty5/TRT+GeyXXLwPSsun71V4OVRLg8uZOPDrpLdtlvJ4ztjfguz6LeCZAthxNFXccR8idNHtPT50iN3iZ/EbPz9cZOedcNJ+PcDOn/x01WwZ0y4s9rDT4qEi4Yo9O/JCzS15Sq4U2+qgberzZN78N03mQKreCm0GSbkxy41hhxthjMl9i9GBydn7M6S5xQ893HEH+JJg3l9HunNmvLeOpuRxw55gjRb79qNs9XzrXnIxFPmz5gzZS55cP6bJ1A5qP+9wwOZTjaB2yS6LTkprI0GbJ7NwhCXdoismzGVC5V1CLjTwOWLEwewda4WAIsjIcjoffx3lTaqSODrJTqfXDlEG+U6h0D9VOYUsmzHja/IlRM4CiIPjz6bdby67KDwBu5UyBTbaR01V6ZWgnJrdv/j3AkWsqjuqyA8Oa+uSqdv0vYdisOkYyLrCCTmb3pcgw4T6QOFAPiOItNMMjjW4eDVF2MFD0SH2HaMIIBt26vVeqiGDpiehdgwkzkMjWYWbRQbGRBZ3MzvDkw1ihIo3Ohr+GAywQLT8FMl3IHqtWaTruHGlkAT91Kn8DUio90cZMowEeaOSDduM+bWBCptvaHwEBjRgplW55yYS7TuSGKCn1VHtI2scMFPKBqQYiLcjooCd/DWNyQcUdnTigLqv9bQNN6Xrs7yBsJlhCplv560lAIUBi0An+hhTcohGeUukZ9cdBU3wDlpR6RHZROC8YCVlP6n0KmN0HB5HS6RZD69bAD7Oi7KkiYowgC0cdBeHZLD1R0YFunlTmwKUfaXpKa/ujQrBZ4OQHk6i96ls01g0Ih/ktFdrCSCqtC5FmZfQTj6c+fujve9MrkfGBHBD4gPBDzTxSN90JnfZl5tPpqs0414z4bRixAMtRaT6/rBvWgR78stD0OftlyPEi5EDRzlWK4Xr+LFXnGyt6y6qvDSyseyk7pLlq2/kDDNIKVHXU1vy/phRbzKNYIKuTn4CJtiArbdri3Jin3StAgAB2XVzB786Th93I658uqKDkVgfDoxfML8wV4stPEIir2B1cYW7v/TfbYF1fIW+Ekl9eBCyinxLXZANTD4czSRTpF2dDGh38XSCIsitZWAsj/mKCikRmAtyreRlFwd6IshNZ7lbgGMqzbcbXi1ekK1fOjXeKUXArTA4WT+vsD+q+FxtM95akpzMB91eL068x/cXwNr8Nubysw/5dbqRPd+p3IczUVxDF1D+RL82hXX9mtn0b0YPVDpk1xk5AFiea3S7X2bXLBmVDoHbdRDgrw6Nv3KXnDW9gvxa7m63UNiQp/TAHkjXYxHUPZQuqXY5HFMTGw97qFMUFExgUCCXIFp4IAy5rG6fQhqCpxAD3ZyNiep/2gy+Di4BKD3yKSXF2sgVY2iioshqNtnIslD1oqGgjvcG4a8UvUzKQfp5a9K1NVyifmoOpUGjWCLzkvqwFvtjYlPTCHCx0WuU+lErYbVvjjlCE9R4jUmJScipKn2/VkNu1kDp/TN2tlL+ohGufZk9z8IwJt723WxSup+cWz8U6cnc2Buw/8fGvX/2xmzpQXHFc3nv2c4TiNuG1vr62iv/Isp837bDb5phs5a6QRc1DKeUv7sm6Tz5Mbbej/Fq+JFH1dXrRrKk4jMn0Gv8gp7KlA26NWTf79KjgT5Onk0VY+Nd6DbBZV+Jd74FIdH4jmfBfTnquVeggxgJ+lzzVdkl8oC59M8o8syHEplaLhFEWCd0i8rXYiZpRtinpZPIEN5vtUDQbpTDPRq9N9BYJo5yQEG2wJpZrinGAsqgtk00R17ea5ZRNFz2fyRREpXvnjlUfz8V0HpdL42XSSD1nbS93oSEQHciiRfcitcXuNNI7vHhu0mzN1qRQMy/F3hXraMqGOWlzNl241OK/aUl/IV7K+OFeckSR0VZpZja3kMZLpdHa3ism7HpGYbl1N2BnZCVegb4D74igMUAVsAFUZl4F+aoPJgOY3oEBiKZh5qZcdArajaCodn/d3wrecjbhRhbXJ43VQxvlPnf3BqhA4rZNUjmYw9S1TZ2GRpg12FUR6DEDDuYLlAWHmVWILkesHFEIuo6+wFtMtxKDPVVNBOWHSThQONbMQJ0VFgVQuPHt/5YUyQ2KEgaFA9+fFPlMqS32e/uqtPQ3R9bQsCB4tFm7mwEejy/qiuxqdlBDf9sUWu+wyncRKI5kyKuzW80kgKtRQpFpHtm1IL9clA4wZw7YliqPd0zlp1LkqI8AdTYvnI6PRZbpXyaonUnV30YuPAn+Iw0FKnPMVADZTSXOQT+86nRkm9JVEYrFRGm/CVmSEGkcRK774+GHtUaxwn0/geQ8KdJ1dNzAIPk0VQbeLUG5UHL7aQJMDdFB4FIDXc1ZX36G1yTeRVCyB3P2UsZi3EJmoSgcpO/iwRKgg+THKEVxnKOu27nYkBrTCOTpmqgazHY7x2T1fSR4NHYqfwvGUAI4dsTxf2qelbuhRki8hldJ3Wu3d3YzZqFUF77GVUcrjISyoRUCWDdLpdBTKySyPYBcCNs4+hbee92u8usmGmvCAOOwHLBhmTQ+ZB5Gl+hzK5ryiMWwL8pjHtjt2A151cOMlr8Vq7NSjF/ddbP9cnxju8+8+B9x/ddAzG9bye7jYiKNCjaUOBIqFRmxE0w6XE6R0EjnbHZT7Uj8Av+53KGpvpMKLeUhTUC7vaAioBMmPU0gS0+AKvkiWmAew/fzBm9ifcplGeZf1OQ05vwHUpsZCdVGgQM03GQnNSZE/ZwBJlADf1I05+Qu6AR2MwjHF5oKzX31jGtq+hVfn8NpJjSVMZwq/bRGSKsqS0diuy9lJT5n2O8JMVRVxS7Q5Ge+CNTkYSxaynTW308ai4FciLFQLHG/VHmplRrZ2a8GoC5tBpi1FJxb/BIgeCnZFJJzrQ63LprTvBi82BPFxiu4E1ABnbHMmWi+ksDodscng9XFwgMHDYDl1Ue4J06x6Iwneu+GGyLcIuoHAQNMs1mrm0CqUvg9jko0ENphCr5ZkIBPp6fatNvwKAYMN7tD4pQXdjd5alFMJRPju8xf6C25J2FYIHCULr6eRFkTlsClNlxtjwMEQ+dlTiNEKldxJeS6k3bX28kbPsRCpYmcePmlqY1Q6CRmgKbIeFQZiI4ZoFflEYEeP46di4ijSa3rgs8eZZwhZ0JLbitjKs1FLGqCu1CPyVAARJaDp/SRAXjSgATdmpG1KVfIwzMPPt+HxsNfjqh92g5/Q+rnGJX1BzqgYXo0ZIWeMUtCRpexpeYKSLDjUPdjAaN9CwQwHavpgR4imrKLP6vQC7UCjWtvMhV+Z2oHPoWHuKIegWAJNeSaKZBZcjgJfAsj9a8Y2Z50Dk/GXDBaWSuWuJyJIsKqJ4cSnRfXTqoEHEwDGN0fkrizOUMevHCpeKS6eSCxWFYcTvAbjxdSbr4BFRKd+3eBqYrcGKQ9x4Kz5JaKkX5WD/NYJ45eWdB71LsX4O+DoSWhLI9XhfYUmy6USosHosO66jAO1XTg8eqOetSEROGnMqJRQDfeM6I9lcIvPEU4i1BLggfeEOZahvp52WMvREj5VosFaD6aa0OsPMfL/y0/JjHLRHgZ1gACwri8yYFDcWRL4P/ZVhDszaF0FJoSXtUjeMQHVmJkGUJUFg+nRhLDNhVErTE45WoOnwxHiQ4S2jjuw+j+g4GEPHdJOCcSc4uboYKjinLlPXiv5LUuVkKsERBw97qPLXMi2XXphOgrBZHTPs/4noqLesWzj0xiu9ZdJZzNJyk6Yxb3PSeiZslsJR1IuVkxQrIyuK3E+YVDcWF8/8b5/LwCfbrzh3RtVVdCDNqURPLGnvFEHN6vPWi6Svi6KaQBIaNoAHW7NoOiwvVHaU17f8CPEjESOkvIVM9kIgp7FjihYlIPubofJV1I1GcZ4eNSZyfIANS0XILrAz/NqMfxtNbcz7dbqSTBivvS2n+ty/i6r+BKSTie00/0HYBucw02CLsqG4akH66lLwF5eBRjwTY4RxIaC/TNox2RKgHEkYUe40Qdds5OQJ800luvzJ3LUVQ6XHga9azqqwDwqxCG26V0nUeyDK3xl2sBaQppm/3yaJkSnfZcP/GTMXMHcaHrFEcZIjc2lWTrZvSjd2k/049L1Zd+JlYeeUdvaS21b4K0atWHUOFIXbGPDBS64NlBS+xZJgJN94K/c9pPeeqh2KLP6hcgYL9b9KIT4ygpeVKufQQ39zv2awB4w55Zzh4IkjnlwnIAKNrqlmFy5ne1Ukr278+cu5AdISKQDwiMAaFLrI9QKIikw+xaUYVD+tAs0dHHkN3ycHh3r3BOhWGZaWVcU1lWcbIYqDK09pn+p+WU4R54bAF5IFn0tawyp+OhamTu/Q2vTl6AoSdPvDHX2PPinKIchjPDffws8VnU5MgzUHEcHIWq6GGF6jeor/weHkPJjtizzn2M7emE6bHOUfSGygPGhR0UHxswrTCUveT5F97oKTMt6J4jz8rHcnpovSwcdToOuwshyYqGcQwi+XjCCh/8IbgpaMlgPRlEy6t1+306KmcamDPasGxWUr37241KVfmO+RuOv863WHxat4YLmJ9rorGmI4WPOYMWmwAgzZRuV9PEhA6eB8VtGzA5CX+2EbvwZdjqjaBWrTCtRVohJsQghaKDQMRb/KoKklAEdaiIWAkxAzlcxsP+axjkfWQe8HFyIfyBvkv92BRsb4GdLfs7A7kyWkvxEHaq/I11VPOK6WcTKqSeUecwHbV6Ko67z3CvFYlwvnTxgI3tjmtx3r2j/XVPSwBQEbTtaKq0/qdz+1e9WKIoL26Q+U/Dbke9XNZnTxQRAgegj/M3URaG0Z1i10hNPcvSQOCIhqMrHRKY9CWa+UrqP/VQLUEXula1w/ef7YFS3l/epaQBckdW8D21klXfndn5016mvHrELqt6PNUdKI9GhuBfqTyWhU0XqU2UdV2mnL9Ids2U+zis7HUSTeCzLPS6OH0WQ0Sy1jWzUSDCMDG9jutdKkVue2/OAQ4Q5GKa7O6NupWIRH2A3nSUS8yomsw62S5028/Lax0lbPSPUSFaIQW9QFQLmE+gqd0VIO5FKp48uAq6FOgS/lArl/uS6l58HBb2uXZZ2TySiuK6uwRX9Ga0J7cKijX/AgDaTEAksO4ZDtyh0IY/VjJ5CCR0bKi5FLovXwvczgOi1ZO9ZgTBL0r21UpZi2ziHzJougwFyb3IQ3wjrZLTZPJYCrPYk9mQW4i0ovg1Tj9UJ99+YaQDrodLhb8qTzSoBcsyB36sBgYxdeSGEXRLjxisrwzz16frBFBD3aWz9f2vu0S6fszZ585a439i08rvLmGU6igY/wdxxqXOaD79p5DhfxhneDjO+BCckc4B0rbJ1bqkDmOSoB5bSXevIFJUqmqYNypUnL/dNheFj1aoFhQjEGXxjpAH83r/uzrMDqOoAOq7+nr4IAyor9hc1B4zp3z0DNAuC5/9+LAXUkH73RNKA52h2JxNr9wX/g3oanLJIgpXBfR3R6FUfCqDs9iL7gOBz7FxD2iJgnGN9Mdwhhi378z7FZin3hVJYpdLneHo1sUVZ1fdUoHE4nL/LrrQdMINxO5sXkUIwEWay3P3vyzzLofjB0rlwKXNFoJQD7JyeR4kFOViwF7Px0HNadrP4pC7ccUPiLxAvk5ysCryif2IXmb7A9/L3dUMY1fx5csIrK6kDSXoeigSd1rWH/uyQY2nZq543GsRHcNyFqlxaNL+80vbgj0qEj421dyrm31JdDS3qxGE2zGicv9QEkAn0hZG5i3UtPerelq83rmA6gX2eaKGmGe8G8f0w84+xTUMTkldjh/2suz9VycVLz310uBv0Ib3hglkqvLa8i9MRFEs9VoM81b1Co1jPya8EAuP41G8CUkssxvRJbo6K5ugaHyP3WjSD8Zpib8j/efdYYGoztN6h2RLlo5OLgQooanXOyUWEqnfsxfvp9BTVdy5lfR5b1oH1Xle3PvN3GaRySgfbhgEmDIf84CyOrsinViIaUpwqh6yYMIC0LDPgsUEh/0hDyM7PgcZHaRx7dVIL+BI7I8lHvis5SEjYISmWSpriBhhbb3VIdIFZvpAa4AikyMgMswIEycBW0WQsTM/yGMyBGyxsSvkHb1sBIQ3duRHrUccEZW3WL5jmY1Quz8ia6q4Ciew6lrdBac1uKyRw8uVbYhUNg5DA/igMzzEBFA7eluZDvsEzVrX1hiXAsX01Py1Mj0qpBUtWaMWDC/11S4JqNys5+PKWLOxmYHtKfEKPMUpw4fCWMl8C/bIu0JdaXE2tQ9PjVGAfK8wbhBr2YPTgqukMXEGKGTSBWYOFRzANbvJpq5EyqhDLc/MBEmHoSo6Ug3e5aOM2At67h07Ev3pc/dwmeKg00uVis1tnBWFaxQ7985GAiEk/S7CqRFKvSf2IkGHFM0lAvtkxDFjUy3jEVpPN7RSZEmiQp6GmO5VV+Ol3hkzfrJl9XR7Jr0/4DZW1hAtlkt8J7enDrjQqMJFAMpt012H4n5xKOpI9CWLtCi5KkI4XcuLN/CQYAIjTNx21KCGKUxxIrlZBwxum7zdMdyOi++DD9/6uJYJItlrAwg1/VIP7eF+vTDXpDXu1gHNogDaJAi2YHNOsO47HwSeBkNpteiTUeCSJYMUXVClYKgHB/S9onKV9DPod7zdhIdjzHDnGNVDeeUU8JhfmUWUCfc0PRAx/rHEYfAZ6rWSYdmEwy2h6/dW67F6PFaEv7ZGNtQJpVrmBU0V86MzWgOAi93S8ipMOk+IBVi44EbHNB0LsvNWpGoAkjHun2bn6XO8uOWCh/f0UQdY9Q6P3xStnT/G24lw7jnwnUKRwjOn3tMZOjx7KgI0M6KWvGRjiF1kgpWOCOgh7SKy+pxt7fjUT8LVF77WQgyic6lEeeoOi3Pz5h+3NQfcSbJvE7v1mZJ6gR8Nqf8/N/TukmgE4iuCXcc0YhGyLT0ySssFD9xLimP94EZPQ/YaX/V3h5sKfO7M84A/fMM3yCCCoduJA88IKRelB+pe5ZejBK86ZKXlLl3wMjMVFjQhm4O456P49dkFeAEErrzCND6jyF/oMMHSHcO23FNMdJNqaZ/xwIvMdPyyq/xHLrmpc39Qm60a8/WVU06ugwTdQUyWS4kLU7bf/drIda5T2ZHKUin/iayN/5mvjXyHml4yheNbZHnuPVdb8ciD5qn8+ZzmIH93XMxAyypFubz+YrqualYGiccd/wb4A/zz+gCN/sxGP0KAX8j07VYa3HCqtunYhFhkq8NqSNLZwhE4BCEDyIUFGfFSS1BwpqK0zaxE+s+GNPNQF5rc8RiJRR7v4/d0mTxFw/yA8HUEKDeSSuMbKkhsPIBTDisguxEYir74POj18N4IArsTEIJquTtAG6/MYhxfwVm+YGOZRbdgnRILTOzBp+Um8eaXuXz1ZdPCHCIwB8RjHXV50qCUD/K8a9djSF6F6rHHoeeX6YVu9nZZ6YS3cwze/8IZ/j83kz724ax6lqnPU/RM02pHfnckk6n93X/6MUm4PEwgkVNV1IAODiuiBhKYir5FWV4XS5DY6ztVyECaX0lieWBA0oCvAMGacoUAzuP8QTaa6R3qGI/yQ3Z/93AN5ToQgkuceApb+FrwTw55YtkAfXUE0siLRtwHURx2S4YcEQmXDyum0+U0XPdF5GFXK0Rn/CELyuRi8HbwcabHTFJ88mJ7NipgX6rNVkhvcLSb0JSvBykIMAUUT74hk+YwB2ogBI4J+g8DSxGvT0YmRG/Ck6zWqdB+JLuAZAPyi7Jtubfh1KLTwYLqPY/AEspidFyYGpGlatbpBI7sxR6hQOuoIDFkobkUQRvh9n2uCuMIWpcQz6iqcdveJ2UhItfZXUrFbkvKbhAInBfhRbHgYO3VVRgLg0o5DmOUllR/QxBzJzfGNxRHLNFVOxiWDNkIyjL/a85hGVH9e4UhXC7vxTG8OJAs4Q6wr+7poRMYB9wVjgU3qc6M83dWAefo0juHS1oMfvKRGcFz8o7ikIwjaUKWR+0D9HOQMbHAP8ZvUZGIHs7u1DtaVpRm7WSKLJlnGVcTzPawJdKcDw1vzv9rirlbvMKPA7qF7cGWO6/nc8qanz0RMQVlnRSixZdYOAT3S3fd9lHS1Q9uyTps3FkDX0tvxlq5OhqXEWvSMWiJgghfdQpcKbd9JcxT2WW7mZxUSvE5+DgiCMLi0QvjhsczrtJcLvv448L+Qg+RBzpkklCawY1c5CaP1zikW/bCcqUQiBcrZtMglZI0cqPHQCYBBEEBxUi5e65gU+z2YY44Gr48XNGDBDCl/d+k7wsp5kLJE+izxzhEknm9MnCZn+9o99vKUvVTSJ9D9gePWgz4G24LITHaDCfEPkWUTpiNo0/TUhwCLQRZRSIEaTwaYnBdAqafnhWxdRPOeDPOyAmXqfEmHauwNZ9e0l4JBWbK+rvtrPrCtLKj5kXt9xImj4bT+IBF85ba9jTMeMSEuvaS/9g3ovRRbeUrLfORG2p3o5+LEKkG6ojtE4J3OxS2adSL07DRFkXQoKv2oUA2sVklaec630ohukExrfinx7WUzP2i0O5Tirtt5oNh1O5G5wpQkejlhH4y/tihaPR/k+Ao9vT6Apl+IaAkJM7y4oxiVKS8qNP5iUBi8Rttp+rFMBB1s7ifuZjzR9pXH5z6F9E4R727cP7Cp/zCeaHFjPrhcIoinRT7eczmOO7CiKkiLCz0UWmB0RTA4vMD6b3SOYfoNwHD3MWEBSm5xjQFHmjKiTXQ4LfZYGZQ5jYmNdb+c5SWV/2GSzdM86Lk2cNYCzjOyvHWhS5DYJt4Mq5G9W6PNI3VGTArmEIOD0rAPw1AF2J9TbpkmEIMc9D6IX39IT/5oek1tJ+XcGjgemfhA8t1kGPzQo3ofUpNpQF04cQJoWPBHNbIu3vfgfsy4PThvPO8uGztFVWjl7aKmQl7rkEps6AYfocXKFQekKIaTHoQIB1Nfdr0t+VQ/CAe/T4fwYDMJ+jxNCzfyQbaw8NYgCLi2W1JFM0aE8Tko1rfz3vexGG8CMGC3MveTacPFQ26fHES7P0D11mFHEAqQJ8i1XYrPNpAAzuDScKabNL/nO/UknYEQY4FLlviKMNDVpnzwjWX/oz1OjNGPzZqWjhiWX/mEd4buODQ2jtYf7ghSjF9vu6Mm3QZdY8VNZve8ZbnSfQ9kmQejibgBBo5aCRyeB7JrFpKrZQe9blOdOrC3Ctai3cjyAreZl8eh6/ITd27eBhhCoIbJJgC1tASUO+BBlfUEyuyC+w7cJ6CUsALwuo/8VBbzjsm4IUd8AZY9YThp3HglnWl7Pm/uTZmxytM5A76DXbz2EAYXN8y/PdZwb9vWzEw2lTHaEHIWQQmB4Rh6SXxqnDiAKHhad2wvjTwRdrMU7y116g2ykhQl8XfUy97r3NW4WR+I2PfD7yGjbcyx+uYKDso2R7H/4EbAFDI/8y57P2R9/vYuz6/cNZ+JQ7+DGJniei/AQc3/ov75ZwmHOf84/P9VeIM2jm28av+9e/ziAU5IoeFm3BQ4/N7FkQVBNIyy39dG2RKhBHJOXXEphhyH/jNtHf7SO7iWcW/Z2GnY3A0nWKH3x2v4IHDhB6dcO9vD41jmd0/DWB/w1mq/7kgePaa0nXxqexmrCbMBleFxlbkgMZK0MC5SHNw0I7Ap54LEIYJM2wiWWHPzLBDw8MZXVuH1Q8SD4laO9+IW/F1utS9lZl8CeTIQ1XSkop6pmP8ZYWppeJGYG/NHDos6jSFL7ZfsoZfDMjgEEsdSO/Jn/R4+MofxkQb0wrEWPJKRtVgyOKC4wWAnZD659k5eRGACZAbS9yhYQOZBXcWvMylt0tmzGRH3DmohQxVCFr+rWPHbDewwmT9CpJKqnYhq18dEhY5K7avD7hJn3tYoLu4oqhmRPXbvRuYmj/GibH6VyJSE/02WkrAHSWEGxZMBpGSpvZWKKLNbBmN8Kh7QOVYbsdqIr4eX3cLts4KU+M3uVE47gIX2/Jz8ApUGVyQGKUiMhYRQX3tX53zNmur6fTXkUtf7WLsf3Zify9vEs0hVliqPA2IqJnysEKvRyRWByDJoPJ9GOwyQ3l53mI/Q6bo7LttkPQbSq0GrTEHdnQlXVK4Es9QXvBTfyxG7FMFPBagsT2Ri5A+FnQr7KbDv4efRpN961QEdVMOJaR7joqXBRZjdnWWXFowAL3W38OnW+2mkQ6u7iFJ32soL1W9VpjljGsy8ZUyp7uffknwLfQshGK31qveNQqucWc8ET4HBs/Mn5JJL8IbtOmufjeqm5H3anFCjdJjiSWthhGrbRcQl5V3d0DBj1ocdR8+m9SOsXaCN+EzimnJ0Puh1C1Rwh5lkzAFick8X5RcEx6InJYJ87uuune7jFC2tAK2wkwTqd336BaPjmKvDpoiQ1zGm5N23kbAiUuA6NX+2Mne7ignBXq2pwRXr4jnEkPMeE9C58bemS4Rr7ikT3g0WR+nlTfS4Bc+b4UzHrpewN6s1X1Kq6y+Zpaxr+CV7OqX3aF3/Xw/r0SQbgbe8MVRjCeAEw3QjmCHF7hxa1BwZ3+WrbtDL+m79ASwB3YRGXrl4o8+s8twM9ehdPUBh+bPrOXW3YfutAVIIDSobfz+ttUJ4vQ0PsoCrnd9oYrKhohWsPUYWPbQCY8MdamPYX84gc/RVxJeeQuF3/ayqsO4T2h5xpzdIfEkBxWaejmuD8U0DVK11fqVZreGdQYaIBeGbgMthJpoTVFzcRh+DiPgl4kj0vzp48dwSK2oV6/39T0Y43PeQ7CCPUU5BqRkQ2Ph60iQ9Zx/jSIZ2IOMkuSoTmR982jCHJidHRSV/tiG5v/dyJXoyTx+1OEDv7ITvu6KX8LAX8ZenZZRePer//ooQwdCqig1u3TgqPgPRrXzknEIneb/L2k8NdfwdieNuoyYFBQbvKcj+DXIvDquhfFTHZ8l46UlcvxJ3TSpr0x0LA9QsrEAgo8GjYl2PPM2VpdPLF8qzaPr/Olfrjh4g9eOR4fHrbdZHffLIXNUwMI14L0o2mLqQ0eVcX34r1XEFwPoTo3k8fMX+O304lVOcMEQh/cbsiCicx8xxz74TwEIFyg1z/uZywkbKWcbg4Bnh0tiby+e7OiVJ0R39+u1w4xLxUJaVh1ABe8oCf9vDfqIv1imPT8Fk8KhJHT1CE/tV67i85jjmJgVtXFeOViszhxQQryHbtazqVVTKlblm/5E/JTxKZKt5TXttk7OZw0QsTUgkCjtqiXTsM3xNY9niKQRaSCZI4tbYuiHaX+s9lQ7nWMVaDgIouFBREX1WXfcDFa9mtf4D/Oz7Xx9JfJj8l8YkRmXo+kq2I+mGuEZxASBChCG+ctN2n60W9uBUNJt6m5xsVjDti0n2sc8zKNNiIiI42F2zp0xbjyyj2CVp/18cOn2sc/NYBO0ILPgSuUdq5sYUzeafWwaJWNMs1N6dS+nGggnaLgnSTPTMtMbjrqC0QkAzJ22zBmctUHMTpl5nu61qymFmvVd+N0Uq80EiI95fzqQdBT38yQ5urvHw5xnCrh5K75FVEsp1W+ZqQEQNYUjlegGl9yGCFt9XxkAvIBwTHdW8aTFVldeNG10AvklwDTZwWwt4oGI7y2iRNlF2AVpAzBd+2QRSWfzwK2uC5O8mhWKbKLe1up7b1yh99ft5FD/hxKHDFElwy62d6gJhrOeWToEb9Bx7REFWGRoMToOmireHOWpCOU/Gm0aYsyhaDZWpro4692uPuqCD8wKK56M6EcwlQNYJ5R69S58XIK4sUjQEQJ7pf60JSyzCHUY6yRyptMQtIyDuEmwDsk0bIlFHHh+myQrTFvjs5V5F2K+AqyriKAdYIjgx/A87ho1buFu5tWu81jqbJ8E7eVjKTig+4OyTHbSg0bQhfWcMKJbzXYRHQ4YgIwNORAlrTUVUIN3MPvsLCSxDnawGD3z/FjoEw4oBOvVDHnIZ2GjYFiRjA4J5I4CFC8+rHC69e97K0XbfxhpfTT6B6Rfd/yHE4qnc4RBFLsXWlFsnv/8Lwn5N2Iu4xlnKApneCcOurDzvVwTOskwew5IgHgweXaWZKeguePNBaSOhvmLNB2OQZw4atVlfG2/QQHX7XTa0HsU7z0NJ+1JXYY0wKTG9Hz6BvRfv9DyKtg8tWSsDlnt/G0hCKb7XNYf4K6fmHnIVj/7TdMmTXin+ZV7xKt4Y5SCDUSD66FTrPq6EXpweW4eERy3AEfchkm9QtTDDIMIYGwcLnJYaA+PjB9rMRofscSVTMHQBWCh8dbiH28p/vu/1igcaAtdD1uTJZxDBDB+W1LEe2H9YL/IfcHEIFZTMon09DJiztiO1QTFJbe9i+p+vPD2kLZ674vM4x0a/a+1Hk4Un3M85P3PSSxnZYTUGho7yB2dkwjfHHggCiTeQzK6fneNGhjB/VS7TtroMmtImuy2CMRMn5WIdDkiR+shiCCpE/a0wSShx8qa+QMZmW2qyJF3L3MTtPbpEWIx/jUwwyKVbJEMUWTNIwgqWQPQ6z8gefHjXuPgzthHMbet1MpVv4J95THmWRqDyHjm6BnWvbnvrlz9zS1dE59+TydAXAkZ4Gy1UFgNSu8RPZY2CHcXB6X286tp0VgV19pAPaTsnFjmuQJdzFibHK+w1NhFtBSyhdyTK+ayCP3393OZOW1cNt3UjuTG6Pcm4DtD1uxVubfHSF8GD8uwBmMHGyp30b0opa4Xh1XgCGzwkLFCTpB3+cC02sA4rdO6bAAZueh3l2RbUFGlOrTAPeFqgdslAfyVXr8luq5sTmA96360Ypcna1IHORGD4/Q8tW46eF29I7hOlNrNAIm2sJilVWdCzcNE1HWxIX3bmjQY1UtdwWjMguhWmm729/BbuEIBr80kUmCqOwKQ25eLAAOqg9GOYq+S/m5W6+2cwZuVJYu73GRTXwdRCl9LhzSTi+iVxMZ8+0eOkSBc3BFC0hHQZS7O5ZRqezFAikKrRqsvddkPdp0LgqZZjYa/NFVdW82dZSn7kun1cnRakJPOALCv8ud3H8Tas04PBpF//DdSkf818p63QynEdks8lL+lYA4NAnTL47BAg52zJPPn4rEWwyXhGhWnzZ4xum3xawPTxD3uLDcrdU9km9ViaFNxwFrwcRFuwS0JbxHGvk7zLTrJ1xxQsaF83526fUxOHkqVmPMkyE8TDvWYm/i9XSaXRAGZkICI0cep62hpIXE1gCjN6MRdjDOPJc348cP9Gp7VEQTa7Usp0Exsh476z1ISelyS3gPDV9UjwgUZD7ZFa9HAuuTDfPVo45ASvuLJwIMQavvwI78NuonOzLi89C/Psob5Zgl7uj6DuWJwrHP+G6/k1H1kfNsB6OgT2wDccFtMPfMafxyroXvsHpOkdOpICwB2glp82p6U1XH1w38wEeAywLPTYumzmH5vv9dlnjn+L0Di2KRCN6qdiPCVq3NT52JyZ2MM5Eb8PAOQspCAjf0ANO14y1Em+SwwdMZlMeFDLhegUwH6tMdxQcPnbjuBV3nuX6yFBQWav9v4jTsJcTJas/m03ragchgYiEMNm7nN8ZlrXK5l5/CQ2AiPABzocXTEjmX2E63IaMVA1AFXNhUOWuT2ZV52ZyDyvVuyBnZgxxyLZ3vC/HjQxRksDPH23nY5bvNw09yHAIJ8unBlk0fUZ9KFwuZkxr8MH6UD5A8HHD/nEwhuFrOc3/1eCQM4uLvk52A0X6jNrvr3Y0OrC2423E4J7uco9i9Jr06BBQkqyUpUVmHnJJni+OcOIzrY/4hIngaFoa78FVyS6OHHuaNcirImkoX+xcr3ouzW04Tdo0EG9y9/sSTfy3+kLpxCmC+taL8RM6Ui08nhWqTMQPd2x5KT/vuDI9ZqcWwIhFJyxGALIhuTXwxSetRABZO8X0gd33BTfPT567u2bC4dSnsaUlq7aydVG7LMrdWCdGYuVbkNesGVtHA0urZY/kvI/yPGxHV5oLm5FjajowCb/to/UgL073FYeepQgdJgUq7dGCOWMAbUhatYStHEVQMSfMkjhBckBH70TAEuG1NPWnT5OEpinFSo3VVbt/rVNuCnbW4amz6nU4XGxhcVxYoXkoq8RIPh4rX4aLZ2woS7NNNoAIocGXxxQ6ACSGfSy8fpM02+1ajYWwAR17ebk1bEooqSt4lI4Dkx2C21aiMB4dPQYsAcRCYq6s0lVpzyyyIiVU25xICRBgw5jwQuc+UTq3bbv8x976DZcx4yA5zCdbOq8Nfw33NWMmaiqsVgdv9/5mB9JtezQ/QQDQkjurfK7vNMVN8sh9lov7mYjZZjXGfhEO02OneASnO5r8HEpR4qJLPn8aShO2oilgXRorZk3QG/bLaTQ3fSWfSTp/XlyHgsMlpWtT8QWVSvwYOQeRdpgzlu/lpm8euc3Yw8FnrzVo8V382TPrLU0l1TSx2UnaqBI5fAgTrbgCnO8OUgzuDRMTQAPcT+lIsC9QnzbeROmmslufYvevoDIkCboL4Yssh/d3/aQtDJiTYX0fqaIeG4xt0Alxed0YVp3Ko96WgO2wtO2FjGm30di1t8rv4wnUUzudymveAwsaUZtqz8+vGPgup3zbdDz7pgrHQHYlEMHyR+x0PQocVKgsugDb7cAhfuDH6U+tj8ZCZ3zvsP5SPYrM+tQ39wOtYUcW7Nbqcxw7AaieOumWlg+C7DLriBR2EzsPEx+iaJM/IdLFuHiZpsS5U45/hjImkxv4NrdsjmZINuKB6gTRJ7Ew+OEDOwyX0dZzL1Q8TAt2E9AF/eMRR32UgIg1/fZOKd9XAOHliA+9g/C8oQSoJfy23jt+4y8Xai0ifj1UwSu52pTOZNiaWFIAIc7ugcGPP9NyoP23MEnJnU72q/2Ko1++oL1+z0Ux8o/qHq+0BBQhH+HnvrpmKmyoKqMcPIgkjOK4LYLAMmwzdDg7kmF/NSDET3DgLzCmbkkRwDs001FTKrM/sLD1MUCnyTPO3gw2tWNEG+G0jGzs/67U9CdAntkKLTFrAgynI7w01isX0tMbnO49B/jygeKk5pWLH0Y+JlzCosNq8PZl/UzNqPqcZpkxq34raIA2o+Aev+heuLE5moFDBkSm/V8sk0TOFqr5Q59KtOPuqLiDuADf0hFfa5tFvXSC3ghUbZNHJpFkBJE43WfnEd2ATv0bfkynKMJdxm5fnv3wprUEOUW58GDkLsncKqYAkv298j+qHzbJ0ZTolD3UqujwAiHx+sjw7q85tEkwSaIjqr7NkoGkt2ffhy3IyWYVYFnyq5BhHR31WRTNLb3u6jGToISu6/38NT5DUeyp9ZGvljKgE3M+grQYYXHWofdCA+1Z3PDf3VnOPcesrRjqcICdPsdMHTg1+LMVsEwGBYsyGu3suSy056AUxE2J0CfUMhGoLowkLNZ+iUmcsYRN8+Enu2ZSAjjK8Z3P6tge8qQ7B9/FqceGgwz8IEnWA3IH31vqcwtTsBfYERfA2BM/N3BPPHsJAPPoaKN+hi6OZr5tMDAceNVa/Mn6TKv1RUYdsVB0krF8OIiw3s588OqJvbIvHFmUwFoJZaaDGizqkG7t57pN2ukxf5pz+2LhSXTa21Yhk0jPYI02g6V6m1SPzP2/86Yjs5Dt/ilEMfzOcmNfQku4l5VmMBaalqgqyNkDe/GwrESrPbSYT7K7rAglcJuigsk3lzq/Re5HQBS9CY5G5wBULHDabjGfGD/sAPEsxiVin4ppBpC9+9nELPgGru/w6get9TTWaP8Neh6oUrsBIWK6Hk/6Up6ErM3ZO7cmJmpxC3OTsXWqEVWq1V2joNILcumRpg87GgOK6OP57sMnMITPO9z5LwXQQZU3DL0p3CWwM3cXIW7VwR4NX4m0E5tvnOdFRoX8KV1XHyTFSnftZoFOry4LPzUozrmCWT3RlHH5yAUHevOPu25xDhNhfTUD76TjKJFDBsLipLqbuTUCsuRou4O484EnwozNWpq+VYhECSoIKk+hhuirHCN+/LSZUg33T0qCmFipqbzWsVDX4OLh9xb3XkDB4ETtFjbtjChiAEJ2KyYFMsRAiZ02vDkEdQIcDs60mD+A5ebiXRXR9wXpVKOgZJSG79s/HifwrVbijlAQ2XaQxtM6ccHPxJJR0Ph8deDOnBefLT9EjAe9MzXYHP7luU4oX16Tv4YvZJZrsPSUoZDvC/p1QFrksnqQNeTj5dkzLsN0SZ/T/HJ8qVQVOGjJX8FRTXDfAeoenKyUpjEpxR4qbJ//bHkugpKGhSk/2fAxw7FiZOSrxVQME3vnKuUspQJd2hOHywQn4xCsaUYILd3alL8w+ybsQuE4wZVVu8SH5dyFNGAaFy03BrxRrwtf9HhyHIbwF3ygZyV5JM133Hk2iVqLt2Uj5urkhTXZODjZ1ArE5TMrkHPpLEvNy40wyhixQ8vEu8tXBY5Fu/uG3gpLhQsQPFezSD3drL5FFA3EJOmm3XoXCdaG92R55cqbKCTBi/JLuo8rckS7PCO6886BB1P9Mi8LZGJxNPO6X1Jblbm5/Ae5wHxsKsm2ORdZkQLtnqCltQnByTkUZGAz2gz8LanGX+Aa2EZvv6cb9CE00nvB/tjf/QG5rQW3M+2+gZFrMMVJQVTEArkrBsPO9NYD5C+KZyVmbYOB6OuKfNI2uKtrdhII+YMcfbJZCJrDZpdVFJ4Oa9BdDPnnT9PQEeUDGQZhY+NlwS4WK8Rka7yqUZbI/v5mn6/ygSZ67k/Ajv+TcvPWd+kB+N92GDhY3jfO3jwsdavcYLXGvWxoVxodwYxbX92ttKb7dfmNbm2thwyNrr4ivQjbG85h/1JsWdMnPAyaXnE90SHPTJ21VMXT2WMekx5ejnUQDnoMQ29raQiu08QoqaQz4M6kTL7EPRKHKbgBm+3KRf0epSbndLLbnFZBPuXUCPxq/ZbqEHEI9RYehQ7Q7mYZlmEasj0r7QuC3miCf45fScnmQytmt3gCOFzieueRu+zfqAS9IAA67U2MPwchp1cpTFRNwn3+DEySx4VbO7sFM301kKGJPsiYV7FTtQl6KG6XiKpTIJpzeyDwXCeGPOhtT3Pvkg3WRlrMUW4Cn7XrvET3hMzWuTYa2cSQPQbJIjXHj4wH9SLMBUF1GosyGWl26ihIwJIO0sd0VwRzGHElFhJE/4zjizhEo0zWh2oUtk4fhy5B/uTNoWEOKRBJd68BGtTGSMpx6jVuYcaVgZoCWMUwwN9J1XWidQU6NDabMXgjWfzaYRpjYjvFt4MtX9Mvtl3kYdALd2X1Px00EhUIiPBm66QM2KmkOUTYvLEXrz+WqV0eMGYtxlvbC3W7j0lDNWe6CsTMCXoXLPwDQGh1KpjIqRdkc08DNSLc52uWiAvVBOCJiJp46NfxCv9X4t2yfhUmaALkybuGDf4jt0VFJ/9xA3KTqnTsx/ACDmwKYIahgb3YYrEXmlCBQhJkKNQ45uDlESlzOfn5QjI/iiOLF0ORxK/kKoIYCyxVOvk29DFEj5fuRtnezKNCxO77XHEUXLSEDOfJ2uZJc5A19Yl5SwpJbUZStj7iGMIZ6u8SgJeoyOOjkUm4qsi40YKOtCl2cTALNkh+t8e0c5ge0vGyXipWuD776H4I3A2k3u9csGczDdswAzYy10feiad27iQfc1ZdgvAR1WnhaBhiGFxCgLuvV+ZIACjU9CWjib2ZTTMk0PipPyA3r60CLOImFqnuVcZqovmQQgGAUdUbrOJa/riuB+dc9OTjBAxG5jbGs8TRJrBlWG0JtkC10JuX6MeQgljCt6cfOX2SE8B3e47WvLKgFFWjpFpp+swDDXttfgfz9/FQ8yImZTC9wzqku1rd9ve7lHderFhrOr2xyTQhxR2ddNOFe2nnOBit8uuyrlz/nJ3tbI+PAj3iBHXRAz19aWdJeVmU3PKEu654ugZsVvTMSGEw84HxRCC1RlNYzZ5JIGmOts+YDR4HBNQiwY/Mi7Z8ZXXF3r6uLKCbLfI2/RYAEi/iA/7KTUSjcv3xLwE/uXSbE9v6PcyZhFrwyKOJ8beDHDfL+/NteuprUfXglh73nF+vPnXLodYXGwPeS9k4xNoDAMObbp2ndKOrGyvyQOKwWyUx2tYLiRTZdmAXYL5nCfSA08LPhIbdQ/MgmDpOvCEur+XibXDM19M2zrykf9HnLbwKyb/0cVJ9yyPNIWu1jdvZgM/UcBqYDxH5x/UuZCT8skvMLU67GQVs+DwReeQH7jucZ+HgaDTVo5+mDkKrAPKsDMYFaP5FM8uW6B9mcXpAqXIzEACL+xPqkixj4IpMPeAmgTVho2hRknZZduPUWwO237MvDhUh73buNefMeeH/w/5LEEdHvzkzAtMaIMnB43+Y7CLlYo7YPNgHr6mxBEgn61Utq4GblYh70RaDI39UPHcmZjXIpK5iWLW+XduUkUqaZgvERZDaPokE4R03ow8se1CtggoWEE5nVM/Xfiex++MzdoG8gyL+kukq5EERN7XqKDdT0wjlXoWJEvYRDonUjVyBWXrMykwajr2j6YsRY2zms8z1ffcWiDnsvaSN5kodNwYFWm5WrKDyOl0cIm+NqD/2qHsHhgE+Ho8gzS+hMMkPbO1yKuroQBAc5nG8E8W+wstneUI193IDkGb1PH15Nktv+25R4IFGOm8675R2sdB0DVotrModCwsQ0cqsQ4pbUnnrklwRG1jxby45N/SxArc6NlOKoaixjt00/8ucKmLk4sR2xym3R31NxCD1D0YmTGAuuK/82HHmPCFjRRT2k/irNq3RU6luCFmbQYdu4lHdbETC3o9Pj/p2e/qNdyTpdQforN6P353c/GAEmH0R8CE2K2vQq5udAU08yG5OrARk3AwEkYX2Q2jyFlJ2AoGZqrMFZjmGwOgT69yAgwxwQTtyvMJU2fyfy+1j+7MlZBTiJDdYCh0UB5Oap9O/Y9f5loDfsMEkrTyYK2GN+S2AwLQyIoEN/TLe3S4bgdY4oaxcIRBb4Tr9nkPNCDcIyhsViMS8a0pHqRaTBVsTUsP1ZclGlC/d266NKatES6ScOMkhujBYHMK8L1OjN8xblN5yvR6dgw20AKSAjgZ5YCbKbHcxmlDcC5y0d1JslUVtKRqQ3afp9Roqr8+uV50tXlqMpLXP35EJmp+ZlkSyfLVw0mS5W1JP3U6aW+1jrq+rqWToeSZnb1YH8+PILRimJfftTkIBf1CKpKbAy9nBasjW0swDTfiGd9/f6HFif1iVazG7I1LeYXwhr5g8jNFzRJYU8XpvzyQoOCTes/QebfO/vVfM8FVLUwkzgXbcz+cdY4mT7A0nDCbBDOv85oLHry7pONXMXYG7fLTDHxNcduk2eRtOWqWFoXYEGzi7sWfeFcIXLGsly5+mU4mSaX8/56ToNvDee15PTput1bn+JtZ8G+sxQDN56twNcWCtX7ivrsiJ9vsNvWsGLpUxzMRMWvihkxgWkPjdiL+Nr66a5a9Uu9qBp4eVDARdMZNYBcvemNLYbw00dPGHzrNbrDzI/5DheARjRAo+7t+aak2aV7LtPhsikC6z74YSADubiQyxE5ei+xsOhGtRsY9vDYQAX0oqNUv7Kjob6Egm4V8xWnL7JTcngE7Qb1nxkm9Kwl24wUQky7J+YBIxuzWNkb+qoMG6ATUpYSVWgLPYbnw1yszGooCUw/m6K6UbJ0MSXfeqKaBbsLXRJwTPqS2MXb5hWbk32zrXqxqndg2JY9nVjquOmaJkzskp0SqHITK9u/SV9tdqnZejqAVK8EgmXgYla/78L/qAiBAVEmOkr0GQ4naprxwms7gwexG/pE30fnOKdzNO8McrOPoQ/FqhMmKvl3OlZlC0ryown+MwnRi9AaTe/OEF1uQbXE7+fYRrlWbffHMklL+ZK+i2O3HEjRvG98ZP8Hbmd30mBxz/ij/lRLLYLWS1V6UJIRiLSHepLw1kOWqjIOdXZJAYsP4yzFDmoetuMy8UKhLq2OiBlWQ0rMViGRf2vM2q7WQIyIYQ4lBshipLk6OJ+lYuombqyUbZXXOeI4xHBM/nahVqGlhnU5QwTyWNAPCb0Axr2YIQ0gCv8IitFpYzAsJVJEURQGG0uk087JTomYRjgJhEL5FdAh3InsOZbEFGInF52x/triA6zJUfbj9M2topczHqKwXNiJvjhdnGFW4c7Qo/uSRd68Jqb35aM2UIsqG22ReDsefCGYQDXksE1sYyRGdcvkdhWDbY/cTEaAbMq+zR54bdEQEmLAxry/eZnzbPTNJU3WIo7L77AmJWiAWI38Y8RIBi5yGljZIhbFxm5AGad4b24BrBRo9iN8BdKzsoyDaYnZyjrFfFUspBlSveYZAg33L8oqlyzS29Z/5J/Ca1NOdOSC/1ibUmhU5DdGr/iPSWDVkf9/xRyzNBE40R8YqUFGtctNULiAqwiGW+ShHK7iczOlMchSr5sad1h41T8zcPktBiJRxm/C7T/I7FdjAUR1Yd+qyKgpZOYDzAi1XEQP+Bh3w/vOwLEcV5ZQwUOAOBHZgBMuS0eC0SRC6vdRzjxQZwsDI+mmsIlkRkc8D5CwWLIyyhItauM13axVk5Wj3l55R9f/zF32QdXXuZL8Q67qRT/sRlREAz4sckBGARBTybiWUaZ8f3BgO1xVEqVNA6GyaUyO8VBpFAPoV1ocIFKYnzL6Wf6nBSepu/BC/wlsBZQC0CXx3yWkl8sGbgHTDG0V3Bl6k8q5cdvjcHuMTql0PS64kmSbNFLS4JlL0M0k6mJKv6j6zkWS9BTbHv0tOvc0jOO/0YEw5WRub8Uo/Sd6M26DVPKQ0a2EexvbWlSPmGfTEtZWXYXzzK0gUhw64pFOQavkrRrI4swtxJsSPmeoU/Z4sfMC9zP4HVLXyjBwStq0Oj35QqRxBK6xgWQKssEe7QSFbbVBZelm+RebC+TWp3dVSR5syOB0HzPD7MlqkTID/27Pc/Ffu1fnp153IK8YGvvT3uxKtYhnpv9ZsaVhVPu/wIyAff3P0P+fYwb+V7hj8KgrBw1NR2MzfByDcbLnRVe6ID1MLbrdKI66mxvpYpil27Uw86kHoHpIAG91pH6T/OXHd313jmWZ0jCRxsx6nTp14h81Zv2K97S9xLn9HV5NvHkmq+wjutfq2fdLGL+5oQdoW3NVN6s+UnN0TLRhDakYNk2LG1+QwIaxg+dhCtJin7UOW/kXduNBmnlAIMjdgWbLm06hEVgbOJ0LNID2+AdwS1m6zUKT8rCD/6H0OJsT7O3HT1YqLTzxpaYaQ+zuogkLXSLQSIMIzWd2F0Plb/QeWhlfUT1UI2Y4FuH+zkKj6nzvqgMbOCw5uA5ga6/dofPrUwWwckIvRcx6ETE8YM5el5p2O7zBMJMtpaYoOrwjMT9eukrFbuqW6mKMQAJTRe4Xowp3xt/DibQIGSLw7vnncOFY1PTnpjW+Eh8bUdzWWAjD+cMIC6rkquawSqamZU7dSdkCcBgjvOstsBliCVpEQCLZLqfol4l9kqLDPIQ4Sf+7a0jWt6ySfKK+JABnGQt2J0jEDSmqASaiAxxM9MsGd/7/juNkssPKkclexqDQBmRg+c0D1osqlUSfqbyy5eIycPZ1fg/Kzvrk63MeIex6PnZN+HraEOg6UI1g9UTiwtvBkzs73K2M6BYG1/0sWBrZDyqLqw7p+ok4cnEDrbd7LjCer6sAcDkhLAb6WW34rpva2ni9MVayaqF0J7v1Ck28KydriBmUIIvgkyb9x5hYVHUU0rIpGHscUOh6fBilIw8SkUQ7L0VJxo8vuIMEl32ys8Le2+6tVuAy4+VJWCDbyPgpdTD3NObbJ5L9apyPOeTBcDNPnfc8fv6yA9bCT5Uoqymc3fBTotEB2k6m9c9s9c0zjK66aUe7tutj5p9HLw89DriskLxFSaMUuAuVHhu1MQx6reAmZ1EoCmo+TTvYUb0SOzzBzY6S3TA+3lYxBEdu88uQI5nZz1Z34XZVFGu79frW/hmeqciick+0j0J8XUAx/c0d6n2PeqXZP99bhG+QQurDxb+xlZ4avvAL8e9smnxcsBJMusOz3NBD8XdVd3c/v3/kD/v3JV/ophvn6XsOAAHGZ39y3w7umKSmNX6CA8tfCdtr8tROi7tfsJreTgsZel5WYFsIMKlmh685Nc79w60xjbznZzI+OZ6Sexsez/k59S8nmpCBcuLKWqKI61zL4Sf8EGjwQK4qeA1A7gnOIo/dM/PFH1v4bFrxt+VcJFZpm8ooyt5FU9TUxpayECL0jPsslak3+uN48PvFNNcC73B/bJcGAXWNBHGhrtO97aydWcv1fxT8w7t8h5n4Mj6mrjBqmdRDfJAIpra0nsZrjnddDyIK3zg9ERx1ACme/Yt5jhPkPrqEP1B6KXFwYxkneX+mOm17d1/flEobKNLktoZ4Ff6hxRT20zcxORTHkok9o7G2e1Wxe4MKzyGCbjulyx8GSKUv9McsgouAGaTWhlnAHQAntqig81QARiZm38x+UKJI6TusUo6YVLGUv/7oeJo4ywfG8mF0KYJv3q+mP7yiTCTwtmRd7HS0UrAp5NKkFKFWPeDbr0BDzSDSVuqF3h3UrBUJbd/T83CF1/APZUzS0r2XBnUhEk3o41q6X4e1tAwKpxxX7AzH96k/KnOHNxhjUJxC1NR7aIVn07Cwyk6+qa8IBRAvMRWDQfVCUWgZ4Az4tHfYaDIz8sJ8FLyOjTA7YKQwtQYNdTtKwxIGjDoOwneSnY10m6AxaWo4RTlmWKi+Affh9/Hf2HOM/eT1o1mz75E0Ur7IxaY2CTuj1mwXaA3S3vTZCPnIszcCXJlQLvlkSzvqSeLlsJK72m8inhGukGNXcW0rHQ+TlrcLGQTDO6jps+afXNnw3G3ke6YBnhFdV03o1u4X8P13KfpO17RuFvHMs0+nLVssTx0e43ykqkv9EUkTVor72B5Y9ox2uyrS2vAUTc8Ct+sXAvQrZ0EA+w3q9h0oegykAB4nl4qiOQ07KdncjcGjLfwSAoxjI0O2fV9gF6CxRtMUC6lvOXKWr0Rc7wuiZFQw6gHvPpBj5mycOhZx8opkbl0phvE8275eabtMm8BcEICFLURwB2PaA9qgUPJkZ5452DOgK6jNZqGnlpwRExJL7GYzRYodHIBLxeULweG5MxllJQv67IYsBN4RuS/o7HPRYKHHqSCjm+P+n2IiaRLUl7PPHjVPqrUt3sMjyeZvg5mTPv6cE1sJTx+uXdLhHYUE5r9VkECaXMidTO7ELtGThYt0noo9y1QNgyyLOojyaGJWsGsDTjTcCRoT8QziND8Xm+XC/jy/h27gLZErEVnNUQ8o5JwcTKPBDik1z0wfIaxnvV0wZyiXQFQBhoJjXjgzk8BZO/HeoYBE2Y/5Q3zdduyJ4mUOS7HcIjzCUMlldW3uyM0EXc8c0eOgsfukenIgLKaTBLwwxfJXXQdddWFT/ph5Iz48aL865yl8E3821xkp7T2K4YI9VRyFnErWDJfvY4FpyqyrOgc2rirf88lw/cCr6UDZfvLU38R31Z1HcW8X28pnYPbPes0EJhKavV5eN6fT1KfKkXormth9YK6C0ZqqlUZoN3Jhn3da6uyhpxYX23vmWd1zZpjuKv6dmXzrY6AL2GYZVxl533bZZyUNlVviR4+wm9UWGdPZXWWWyl0GxguAJKymymn40FMjG5bD63apehYDFVXaXBiKcVeabEzhugYStt26esL1KVYkjYIjyZcBqe6ydm+U9x0YCfTTUCNJcbPJgkIxPjzcWSFvHebfOvbqrcpnQtbM3sp8fCbR3s54lb5HUuf7OwFt8bfb1EXKHtOpy94jXe+G1k2QACUrplONnxWozQ3wygQe8mzB1kRqBIIcOLmlC9C9t5fubzwmu8A4WLWRHjfR+pZGQNYWQjA5IYiBRjV86mw6QaVwBV6ZDuCF+6RO7A9nhKW+SHaFMsrEmYRvZTOEYwnNMrHREKt8vhASgOqjGQabwUQkJDOYpQE2Ap+y0p1AXBgx0XHAJYGO7eKIAnwM2i0p7JZIKtl7QHFIbm6Ola3Qda5kGJI8Z2rwD1JHFzvmnxUOIuU6sFDvHi8/xUlOc0c8GaDTRT+bBNe2gOwAuSZQ2DMQf1GQKi5lKqJTotS7KpFDWZ0M4D20tNNjXKs3ssK6TnAJUN4JlBFtjEpZKRWhKR2TQ4KeO1LbRi7wQpQXmQLAJmGasQEJgKWXuvKzDNEPzQMPtkzB7CbYNuoYYSc5nS6pu7EhCLNkedLq2EqUypfQX82OXpfccQwL23URdB5aPaBMA0PmnF8fwo31/lyIW6P1POPSry+ALYVlXTCYQaXW/VI9vCszwXDQF2RLDPWW+DiWqWA5qxsrMcBwfiwDpYCjT0oyNBShkLsj6rRTCx86lWu66qNdUdrtosHhV5bcrRqAE1Gm34SFPTlQ3f7ZRUnM8OhQ8216PvKZundTN0nsMFlAKtPok70zk/yW2ByJ95/mKrwQS+qkd4HgMbT62P/l2se4ORJCs67K9eBrzZi6YR/Ai8JpO+ck2lLQl0+/67erO5VG8UjGbx6p6S+tAzBVVxgbsTfrCx0HxZPH0fnAC8033SQ21mzzCuaaFylknpgvZ9YXhv9FdPlrHegwaffQ7Q5NICOC1B/swZlkUVtX/OKWoX3jPYA2DwAmMB4hfIFjIylobmn00GCV0/RuLeVuRiVWVC1NEbkPzOqh0sliWPN1TvqjnYstdE/tlpp1E8fUQmUDwwP6sYnalBtqRB8EtfqLHeR5Sih3mPDZXj+bYCPFpF4bTfRmIyUG8nmsHZQjnk4oHizNwUFOSH2pwwgKnNadtV7bZyxYwoU7rkVfhjzmPQK348BsanwazX6VKYooBx58ft4j7oyIqRemvyJwLnlWuA8rShMnN+01skptVcg+I2SJHWwqVSgwSQKpqYkyL5l6gXBYKoDQ07yAmRN2+WiP14UTsVun/MgX8GlvXd6lYobkhh4kTYqLcLY2YOGQk82eu8683xQlWejebMLKO98kjQkjYB7xdBBF7LSOeigTnIatdovHu3Vc408olTl+zDTzok5dk57W1rUfuXZ9LbTQRsvhiZTO+KIFcbgLmQLJLXVf+jC6DtSahhEg/MeC/DWGWoW8VnmrpFRd+Vv/wHZ5SoqkQ/ue5y3XdSr96nClYu8idWUJ1dLGx7qeG05NXiRxjVzBxDjSp/uZ127BtcoeaMBxfY/Ru2rvk33QPrdg6B1SmueUi/Agd79/+V71GsBr9zR1gtiY8uxnb50lp0TTGjyeOUae5ZEE373+1b8EjEXE5deGU1/emzhfAsoilJW6uktFBlnuDLw7orsOhdXGgIYaWlFHISDJcdn5tY7NQCN1wXLxHNzgrXlDLPRYWmx8mSeLKdznk55VRJXXdWLToa0usdPQmcjVOl70e6UIwrW+AS20ZVZoMXZzPk2raOQ0kCy1Zt8DhblqRuXglVmloynYnVHJnLSTuyg+vegjkYTan92DxkWWjNVPmBe5ilJgSCHuUeaYNBGh14bwb6WEfEZJYee/2ecfY+e5CCALMpf0c8jbsQ++M0Nc+fsoIESebZsJOgcNL5QPtmxLfB9DOSEtvTJJ1isn3JGy9YhthdFkWylKyrp4AGrNXAlBB7XDiG3dmJqiYRrUXNct/wW6CCcutF9DT9o4QWNMM8qik1OHhBMPAJQQF6K2Pzr9O4Djk6kv83td9O37N/jf/R5RWgfayZcJZKSb3jmZDP6yopBGlS8cSRtwYyp8t9ylY0yTKniGH9uHARaU4XnUQUeuFJLkujoOktOCI2+lCUdUPDMDknWmI92nP658Ecyl+P9V566+4mtKa19pZkuzuIhWmuU6iABo2dLa8slZvpgu9GuV2LosCYokab4dTnimRIkTffFZ0qVyQ9kemmi2QSoR+YmJ+afMheVvHS8h7YCawqRxJUUS4H0TjugaCUW2muMfKQzkqkouu24eB7gvEdVL/2Wm9EYyk/dZp7Ohe03CWv9Vi4o1Qf7v9ORIe/2cZz6rQbz49Gf+J7KoVqel/01y82/FKGHMOl18tbv+hKZbKBOv0HlSbNrFEZHoiQg585BZW+AwTU8Ztk2FT3OGIzXV68ZTnPOxGPFke19CqbKU3cNuVIU9wIn/mR2cIVnW0weGhy3rS0tzrSrxxZWC+vNBqsFRvd+K4gcdD206fCZiVcpSvySPL3KamU+V2cZD7PHgFMw/4cXx9hgkKHkKlA8Jlx5acmg/giDrhdfA00MuLDt4Qhx3nodRHH7yUZPMOzFA4o1y9Hp/QQNZGNa2iuL/p7SlnWIx+1LiT2359MwJQINMgvkbngvYLikymS4n9JJMCZqpYXzy6Pj6VaeqSlDh5GAUtt9JfT7KOmyeNDo7eM1bfQQG6AeT92erghcQq09qZaOg5HIUejAztH1ulGGA6crzZIV/8jiDWCyn0he4PGDx5MbdTrA1ZvoCznurtWPho9lAZxB67G/Zt7cM90vcGZaWEK+0WH8BKOJchmr+AvFR2bNYej/mhRlDAtr5EIC2HPD1F5EFilE/jBvlI4MPVtKPwJz5wczA9cxmAndQ2j6RJ+uBcBpgD9hcj8BdZcY0BZ32N0AiKP9SF2qPmPiRcv/YBK9lJLiEaeTMuX0MyHGuyVoNgH92CDGt498Jycgj1suawAdFWAM3mw835KtOVo6mbPoBQ3SuzQUTvbkrFv7/+JKC0d7r12deUc2QFFvKVFVRqtcHW3jikUhRxgJIylLulMVB2OGN/nk/GU6D/UwOYbnSUEw9VMWmXBsKH2UMKse0CfwkboVUJM1g2Sxbjcl1GWVOfbcSsHS1Y+poGfHpY00nwrQ+ltUeTZhJ416tZaWrCdV9oTEGhp3wyHKiLR/M0Cm1JgwExhvpEFu1ghXj6mNsikWp9skOpIsUs4gqO3KoSMWU/r4s0AENk5RPW6yVM3neivXoJVcelN9zBC1hdNmaha3ZWH89gi3LoSmSHZaT4EdyHqu88bcphwwppPy3tdP0TDx+GxhqPbmF39Lm7VMCqc3sg3TqrtGdKOG/IH0CYbzXSiyjVleaZ/x7cb9+rv9E0/u6R+cBtX68/E0ncTV5v9L9ZQL9r3F/Bp3GIX1rw5v8gPbRXzmf7Yoa2R8VJ4oSr+S3P5vx63AabSbtxVCvfa9uIUqYIVVH8ZqfYhKj5dgxTzqPsF/q0zA+e9aCpr0g0PSv+kRFse/WEus0fNCB8JRfxnKUCy9CKdjRuRGBc3D9Yrl6rUKk9+B+KMbJitl64enxPQNgx7hginUNYckFMN9mKpHDl0RSunTNOMtxqxWd7/4r8od3diCDQXLz8CDGIIucCCDhcFd6WU8GM7Gfakgox84/sQucl4xzXAtQ04cpqSeLeT7lBhqrRaPCKmOXQRGT04brFV1V084X4ZLjgXmKxeZWh8UZfNuz4Qt6oTo9bpeOdS84QrFfyqEqNnGgdhlLATOaV+Y1Ns0sLwj+mqj1VIG8l1a7ZwVu/vxRq7bdQVDjEKSUEJI6PK/3j0P6oZGwOokbzYXTY7bhOW4nKdMBzJ/WVe4XghNh1qei6lyqeGxFOFD4tQycjAcs9mSKPpdC9mJimCOu5TlY3g1/ACDqVE/gfCm/utHTy/MlvRdkS4qEQmS5uCXtvSBz1muhWj4V9BK0fCMN+FYMEHi/E+JOs805M7W5QrR6wSWaWe8kzox6PF2LTi2Y5t5ry2zopdmmnrXmUPoGa5nWHGKunkaTNELD2lu6Z6Cx/8E6E0c3Ee3FMwbkAlpXJ6WWJUCgvMKtL1M4pJXsotj8NUfyNimGG5yjbbOJjQv8QwNwxjeWJUQbYZBB1d2JP3EN8IRVXbxzWEdCqLP5A7HOkp4x5NeXp5T8gWp2iEpMFlfZr8YbhZmIQKrGVUopGjpyDEKRS1R6UeX56FUXppIj6B4Sx9JMaDNtXgpg1Txm8zWB1NEd00jfoIic+wSmPjUUBDw/odEHjELu9zBlKko75OIwie259IPniNGTdeu+cyBzXKJYymAQ89czYY3eUMRitc8LEvPV4SjEmnwC1PkiTem1lZg/2jQ5ki61KfR6Atr5BEdy4u/nZHZpBfNbXcpyY9UnCoh4/k+8nYna51yIRobxk04EIY/7pegyz7pJ3071k5gS/KdJ+9LxL4jze3emr6RkLxj7pZfMpvPjMZCz4jRx2ekCSRGcO/L7iYAzNBM4f3oHmIeq+GYbSH2z9Bt9xOWtM5J4uZ3YMYL7bkZS6yb3GtRJTnzncv/q/ahXb9/BDTwbdpWK2d+B6fjh899w1uXRjPu6NEzqmRT/c5Pt+SIYbPDYuBaS40kJtuGX5LcWqS9HDpTHVF88i4ikrX1pknxIrPonHulSxSY3CccuBkVXHiFLh5+OKNQ7EGltk+FNmxBtsIsUMc9FCAj6l1PoVgMHyrznY3JZRGWymx9SgYstLnBqtY2lUU6Zyn6e/pp99RgM63NpWJU3FsInyeZ042t0xwHE6ssOM9cpe5Lo9p8bo4pd22CjYBMKbX0r+mKX9Xklzc1UWxCwk3NW4gMs4jsNUkMlXybTbgv54BFkkN99C3WzAw+EoTvDSye1s1NsoUi7aZ60YOD0N8Dn6a5+axXIUcY9EkIOLHkAimXRj010jSo3kXWl+n4lZj9kC+PJQx0D4oSI3aP4hb8yC2qKpWjdqy5xr90/WbueXe5+vjcHm3mOx6fl9D5eGHAIvP7+unDN4QtU0lAXA1PksW/Fy/9GkN647cIRGpOgWigxTtVhq5m1wCEaWOKHjFFewk1Yw3kCL2Kn4n4SM75GsIoNdRh5UlBVAst9UEkSwn68pw4xOOp5b7kS5pXXMKJtNn5w/YfhrJSxc+fojQ1pD6DjChRQU7xV9iiGu8xITxOFtYPmUvcJvHktACEX/ZbyYmgHjbXDgGRIISmXR12eH3/byQa7zfrNjZ9Dx54V3oovKFyLnmsm5IdMsWn5OznMCahrQ5Rarl9YpZ+B+z2A/Ot7lGlN3HqReN/39Szcs0OHlg7Ge3HmSC3p6+sAsI6aK6ub6WdaEfTWi6TLQmwDioZhYS8yTPalK1yvu/K9e/s7NRDM3jHsre9xAXqtsk3+ocRwPo0aKquyVqHfFA4XH/2i8HzWrHEkrVCoDz1xKR4t0vdsUW0eks5kJbsUtG4xqvtKZz0CDS5VV7GlyKu1q+kQcn1yp35zrBmieWsoa34ewtaLoA46b3pIBaP8D1oMWKkMqMHLzvvD+uRRJJ9CN/5/UCrUC9GnsE5FS3W/DRAVfmzvSdjkrVbgiEqKDbWJP4bxWPzZn24KurhD9zfiVp878TdQ5r9vpudcFqgPBEFuGRKYbZ6TYy4hdjuzuy1y9EyQ1nICKDOCNHzAKnjMHisti4zPqpBFwpXN/4SNvo0ZRRWHXrQlnhJoWLCnC7RfJGLGy9kQ3HD4kRvvsT/w9FJ5EKaJCrnQIQLyS7eLDzXAQkQVjarZQxCZHdDM/4jJyYSy96CsvUERmDOPHhGZu1BvG2dgfUn7lnSmw0ujtlMmtlUcB78Y37uTGbOBKEN0SdGAd/ie7EBuNNQsCzs8IESPVPoVWZoBDAfeBjTiM6o18mzALGXPP5ENf29v2OaHhz+Ag8PthI5ubh0R0Idr0G9GJ/ds8oF0AGx7TYDmAfmBeXZ01HXhY08wOeBM9dbShvue7V8luC6kOIkOfi3rAfOR8yLHQSadDk7ZTaGwto7QybU0LrE7H0DTrgdgogN5tyHwSEbXMeaHGN4Tw/Zm1u+mSIkBSX7t38Jvh/5KHbb2ZKBkV2ZP3xUWv86wPpGt2TwiPQMCpudLeXknbHWbw3f12dsU27G9J7As2uxp85Ee7wu3Zfu86bHr2b+uDzyB+11TWuPnr/H22j9e/sG1ZvsH6XH7xIM2PhHeeyoOWNX+zM7+TrOS749zwfoIuMzzMEfOqBr5OPNKPJZtSiLVYbNOx9j/fiEGf4FVoPRc5Tg4od2Ww6bKtnhrhQ4MnxoNjR4zv4UEdHACu4fBBT4emjssBTcmWzsXtlSdJLtrRASTqK7hzWTxb8eadPaBAfHPEAU=","base64")).toString()),Hq)});var A1e=U((BJt,u1e)=>{var zq=Symbol("arg flag"),Oa=class extends Error{constructor(e,r){super(e),this.name="ArgError",this.code=r,Object.setPrototypeOf(this,Oa.prototype)}};function WB(t,{argv:e=process.argv.slice(2),permissive:r=!1,stopAtPositional:o=!1}={}){if(!t)throw new Oa("argument specification object is required","ARG_CONFIG_NO_SPEC");let a={_:[]},n={},u={};for(let A of Object.keys(t)){if(!A)throw new Oa("argument key cannot be an empty string","ARG_CONFIG_EMPTY_KEY");if(A[0]!=="-")throw new Oa(`argument key must start with '-' but found: '${A}'`,"ARG_CONFIG_NONOPT_KEY");if(A.length===1)throw new Oa(`argument key must have a name; singular '-' keys are not allowed: ${A}`,"ARG_CONFIG_NONAME_KEY");if(typeof t[A]=="string"){n[A]=t[A];continue}let p=t[A],h=!1;if(Array.isArray(p)&&p.length===1&&typeof p[0]=="function"){let[E]=p;p=(w,v,b=[])=>(b.push(E(w,v,b[b.length-1])),b),h=E===Boolean||E[zq]===!0}else if(typeof p=="function")h=p===Boolean||p[zq]===!0;else throw new Oa(`type missing or not a function or valid array type: ${A}`,"ARG_CONFIG_VAD_TYPE");if(A[1]!=="-"&&A.length>2)throw new Oa(`short argument keys (with a single hyphen) must have only one character: ${A}`,"ARG_CONFIG_SHORTOPT_TOOLONG");u[A]=[p,h]}for(let A=0,p=e.length;A0){a._=a._.concat(e.slice(A));break}if(h==="--"){a._=a._.concat(e.slice(A+1));break}if(h.length>1&&h[0]==="-"){let E=h[1]==="-"||h.length===2?[h]:h.slice(1).split("").map(w=>`-${w}`);for(let w=0;w1&&e[A+1][0]==="-"&&!(e[A+1].match(/^-?\d*(\.(?=\d))?\d*$/)&&(L===Number||typeof BigInt<"u"&&L===BigInt))){let V=b===R?"":` (alias for ${R})`;throw new Oa(`option requires argument: ${b}${V}`,"ARG_MISSING_REQUIRED_LONGARG")}a[R]=L(e[A+1],R,a[R]),++A}else a[R]=L(C,R,a[R])}}else a._.push(h)}return a}WB.flag=t=>(t[zq]=!0,t);WB.COUNT=WB.flag((t,e,r)=>(r||0)+1);WB.ArgError=Oa;u1e.exports=WB});var E1e=U((XJt,C1e)=>{var ej;C1e.exports=()=>(typeof ej>"u"&&(ej=Ie("zlib").brotliDecompressSync(Buffer.from("WzoTIYq6NFp90shASafEDLAc4MloeA+IqFUj1M6o3UpA6Ct+Q9/2o9iE0BngDitiqvdrr2X/+vl6O060rw+HLDkHOcQp6sQKtOaGRZRgg1xu31c1dy7TP4WnI2gFiFfz+TG9ToJjXCkVNEXt/IVWX9PmIs4vm/r3XG7oM0QGF+F0jR/6pXQ8YYVtxbjuBHGSsUqn/TfVmShQZlwJTuJ9PQVog61tzpmysQcVlzQvU3IMaqpnpqq7l4lbXOjk9vRha3ODzLeFBAR8eCnpfr1v9spIAugiuVChFAV0oIuZMsgUZDvdp7uJeWO0GAygNfPxHUiPpTW3u+97mBngLwfYZRHY/dZEMt5msTORimGEXdkslvUt/39Of6MRPnmUYad2ihxVNPbVdHf1j/tIWf3jScYgrNsL2Th0jk1TMYmsgL/9IfP/j07t5nXzf9dCICFACFQLdm9/1N7/Y+tyW+v4/9OBEAL7hLCo+UP9eso3W1y33BmNEMS4DHGyIOJVBLD9luXXw8t7hk6vbsVrv0PJ9etf4vmCLelljM897zJe6AKUqeO/Xccj25Vv+rX4hrfkfSEdhJcpVvAwU9y3A3AjlZMa/BEWueY6r7yyPpw/+kVeXkUmzOjZqHladhoi1j4HQ+R3gcvI6rnXDGjrN6LFXw4QGmCJubZIbAiA+/0NjHCmr0+wBblQtg9H6whF7KIZtGBExt41/hR9jBJOwQzpt9e7TweQBDwEKM3fVKCN8wkfCCwqO3aW9IgszjRz3GoKDMKX4pku0JTgakHFfhx3lK3ezCylog3dRMlboKOO+s+9EiC61ls1VJ9dDQbAKSiviYWv5qLLp32dQiy8kRwTH34Fb+yCGQyXwcPhj1eLGf7t1DC174MKtQBrq4CXuBCPqLH+3pm24IHG8a4A+iiRySIg4eHJDKb0OKmxXQ84kemQ6j0U50JsQEKvjtaU6hsNwW1kNeL/cLYaP22Ki830tzJUxjIIiNd0YaPMFuEDPm1ve2MGJ8jIM/e59dQD7lEnfxOY/E+l3T7dbl8/Ws4Uxcrz+oWC1v7OKippzipU06Tbx5191jpVa/ParY/OnduJ+qWsHIfFnuJVfNWIrlLf3zWah+41XbPDlsxOL4+oYGjcZd1n7Xzslyj3xVYoZoiok+IlfH2XXOAavfhCA55k+M7t7A7S1TtzmfSxEh2Yd/BHYUBr/FNj0MhWRj84NWI+C4lmvxcZ+EdVZL+63ZhUZwH1bfdxAWbOyTdoX04IQxGugpMIg/HJLCRX4/38+kGS6ADK+0mxybueX9u4RPzfXDoarOi6vxP10pSatasR0oeMyNL8Cblors8XICfRTHwLlMgsp/HI148w0dHBeV6aDwPkM0kRRBCj8uEIY+NdSCYfTpHfa6zk8xnvCMy7pg94TCIBl3hL5Kd53TH3SpFw8/koZykdxs8p0udmUJjgB8v85l3V0kmAfKTOLEtTt6ICE5q6MTySQ4KBEsh1Tq/1ejqUZtndo9Tz1QD71Bf9/cNH0AOiE83Q4rAYGYPjlsZqy80HiKua1SeY1w+M1VaKOxzN97AUkO3z+rsLS7ZaRdIejoR+fyMZuum6/XVCid8Zg95J5oMbr3qOimrzTKhTGG/kge25JMSOvHJ1zPzEOdeX6p72lNdpkFfIg4+4d8sIDqf/Mq8hUYDHzdS8wkYIdUWLbcPiC3SXrKQlk2MtNkfwJrJRMYktrSjVfQyicuXvUm1W1VZVbXOkAyI9JtFrQMMpDPashui/NVwblWcELdapQ/AS3KjlWIthFzXClP7RbEzK0DQLCuu+ZBmVaqlwW9rc08qOQU8GM2NDGH8AAMRVgPWb52X3roM1DKIsnEvvSZgPi3+G8phL+cfp8KGCdSeosPn7zg3PdbwVRoVEJwj1eKQqucfvyqWJ16X/Jc1JtsyDKblH/y6qX9L4kuL4rDzrFCG10Hkhc3QoMtgHlaw2YxERQFc2e5iAqt76pqrr05Vo1eapEwMSEmk9MrJG63fxWmA/qQGnhoifEHfgqBCfjP8Epaq2CuiXOR4aa3RkrvDm3JbcAb+y+WKBOP5e2H4XZcPtd7RGiHkwFjR+UJAEeezAstAsA17kNJByjYCrpR8jGtq4JPjizCRxBpRpPgsJrlSxkYQ4Wt4lVpd3Iz2/5S60RG4sUrEaSzJQl0Vdq6VESin9sELYZchIDGAyyIca9o/UNT8e6VcKi8QL91ZyD++lof7m6P0mPSKfi7koS3BpQ61YzVx+nEh/Aupp0EO5m50tkJO4aFSNFERBIxvHDS7r3gUM1fM/MKq/4MMxzO0CAnPO4lsB/XKMWX3Y3x137eQyIRB4Nm0bF9Ld5l2HPBa+DGrG0AMDplLGHsO1PDaNRbSSWqJEIiP9vqGXfZOin5qm5rJiynG3CyObc/BBNiMzGo6lmEfrioMIXnrndRkFG9qkNGVonTove9QVJqkexAc3/HEExdXEKpaZLaOk+TkNMx+uofbUByVeVAGrVB6FgoqY5R9henjHcf59jmKgC5edNJgzKtAYN01kO4OxxA0EP9yMxqTha9/UCkP3Qnp/CpPaloQSFqqn4gPX5V0tR4eetohtRWbraujPja5He+VIH9+5sk/06vVh7Tw31jbn+SAVAn8LxaZgUPTFLxPekapTpGd82Anj8wrQklOUusxf5dxo6dJ3Xl+MuNJHDUA9wPUmdNa3fv9rO/j7DbnMRPk98hhLV9HsGxCEkHtHS4AflUnGaYZUjILwyLzalbuN3MehDHCRUozVhtoUlel3vZt2AR9wah6dPl83HAMZ1LmZ4fdRn3FY7HzDjmo78hlI87lwXgKb9En5CGnV6yOLdKEVrkFGEfmHcPI8TfXreB0kl2DHIfp6RSwmN3HEPoBYkrJL1Vx3/s5ltYs11U/JlE+GrZdAqPWKpC0LEdfFlF1aTNmCSUCM958uHL2Bgm9Y8junuLTxybJJjDDXZh64diFujBZ+7ltGL4bdytRWKxG+5OeNcXJmSxkSYWqoBYGXIOmZ57GQ6EntR/RUprWpHGsRTtvO5fIe8ob4X7VHmO/MrveNulfAcbKvo0WrwCaO0IAwyhw2Wu0vcDy/WvmgeqL4m8ALUuyq8kA+vWs4Cuxqck29R285+2T+yyN5XgaxyaY8lcuyp9ZU9Czmq3HMEbAZxK+uIqf3Qq6Tye+W7fgZhVhq5OQCURRCwLz7YDFsfVJbK6OinH9/0Ebcf3UN9Qn+oaZJ7dOj0oi/e35AtK+83juMgNqmb9652vldgFfH3aulsQSjmuZN92KErNNRWtXHf2UkDWn0HpD6enPtQWpK2EdykgI4/rBInFKZQjRN+//PeG13/vmjb61Z9968KKc1pnELblvimiCCx74H+PR0H+lL2hbVlnTRy6asBCjyVI7eRl84dokoGf20cQco7Q4MwfEus/Pisv2nWtbpOheA4KGXs0zAKQslcQZamcbfqZSOserIY82bA2zK0+QbU6LQvCWg1jzu1TP+BwiD+dj1SCEz5QrtFiApLcsA88rGD32/VkzjAZhdkstPblUfHbjoZ7yS6qMIAX+bAOfnvqF2uOUU12hPDcoDgDt05WmT1w3Cp714m9Bz5Pp+InAdsZNjfngxHqWd9ND2D/CLFovz+NWLnfxQPxf/Ik5r1gq4sqH4WCFlpv/oiIr6u/ryCdYB1EJj9rEykHCXfl53jf35dKYWRlIROVU4NPAVBtvLAT9RdBgapAf6caGpM1vKSJqeAPaXNz3wpSo6yJdVrJK1A/TLocEN/ouzWvMcEoh1B1wFbNxeE5qI8ypZB3s5/YQYuHjFJCAyRe+YAXhJy3TAl8jG82S3xfn4fmAVoFKiIfERjWFVqYKOV2roMBlRDjdhalNREFYReCwB34dZlBppk3m7L5JWwJ8tJWTdC8eNl/Nldi+8Dzp+M0E7K4j7w3H6xTe7qAzxPNTfEH00T+Hlq2Tnl4IfmthhR/+Vh7vjD76erWWGrYNhyHHirGgNJXk5fMp1bGTRR5kv6fpQ3zKojA7PJNE2LI8u4wMY4Hl8/k5jbO0ydpbxEnDvsz92ySoq/U2QLCwNYcTI2k2EKrneSJdg68IURvM0GD7kAfUnZuQYMn9n5Kyj7HKGYVkN0gM03TL2UbO/upEUAd0xAm7IOgNu5RpBmxAGiueSVmXmTthr0cp6tzZd7wDb2kBe0qW3GcpZO+9XTkO5JYqTbpXDqsLGqphYDZrgMb0F6E2gGMzzFpj+zqOt+mpDbUjYUX3fY5lvy+ESrw5TIXecBIsZ8uzbpLenYxB9WF10mrA9EUR4WrtXERxKY6i8i1qS2cvd3BiSE8s87rP7VD9nN9y5JlgoYezSHlszVdnV/LtgGqtjFHEVFUkogiJEC+SX/+tkK2IDaPtP3lZGAkaWzjcXogJghx/wLcgz/I62HLeLH8yR/lc10SlqGYeBW1IsusMq8K14ltT22PuUTbWTP8AuFfOWvUi4ND16MN4jCdQcsvZ0aDl0IjSm/dKDjWMX6J4MdZVbswpoL3O5/mAAlCOmgBE+3vD1e62zp4BiMXh6siYgukmvAIavZVnDR57NjYEZQnozCvM7bbnFFJl6DjFzG+co/sBzVOY6orCrW4QtrrByauBCJk0oq8nAp/TOj117QhM66R3g7aiQPdOt3sK+icQ9ZnEIgPJnDoVVJ6su539uC7zPkMEnVeBpKbfDZhX0cqfFqzaVgbP3svrD+q/gK5m/Pb/peky1Y2U4J62os3Yc8Lj6dM6TFRgsUryN3jR9far5ChwKsihJ3VJqNreVL4ZKB3xFXMlTGAItVUb5gmcbaNQHUKurt2lbRMB2nVY7qGCXoE73lkpVEUN5UoVGxndQV7hMaC3fLi+BX4RZ8P4EJWF3WDgI+9XWTv1FPbHHQQj+tfc46b69HQm/LWRU+2Wr6Haabh/qJW1yx08izBjtFRi11L8URqpzVKH2SL+0xFMVskPEJnbsMAmcxIngOBaTX+jQCnMOczNAtVtu+AUNnt6bwbyLHSqzdLg+MOaErA+Dlj0+vLCYk+j+HwRzV3Da20SM7lAFC004qHz0BHDk9JHZ3ZI91Np55fT+c6mP59gsX8R5OPrqCZMyvGLr3OxVBbcQyPJv9XRxFDEdh73lxYOECll+83AtD5/h2GlV9hz+qPAzX5hjPageJi5k1YVnf0/BylB0qGTZvyXk95pMcM0Hd4qCojF9appP9zhR1dpT154e7nU+sqMsCc8J7s/N6rpmbK+xzepMak3den6X2hF/a24ugJbIr2JkqxszXJGAUpRMfBitW9kXsDqmjPaMK53gk7Ode06SE1NrDJhiVs1dYBT6KWV0/zXQqdOqOJTDYDIc2RdNU1zbHK7zjlld5ZdaY+HqBfRMXwP1Ok8wvabgmMM9ommByd2zgJ8X77hb2P10oZblG6MBGM1ZSdN9j/nny2O1iJ2CKMJ1x0LDRKyrkMtzk461gwadCEGRB2FaVRlQKPgeRVkjX1OmC7aWc2Q47W35M7rzZtVhIY98w8jnFrxip+2uaJHTBiTlVYYTsG3SLIRYEU69mck/DsjgiJ3/yUpwbbWf2YxTqXzLc2n3G9vApdiL+nu/9tqV1NPWFo8otYy8NsHhsZscTCFhyLDBVCNjvmXZwU5Ngg3dEopylXD5PLkYHK8965BpgHxTu00XQ3gsxKlDHRhHTNLr6+Q6ywWq4rKnNUqwf/PtYYFxe0Cg0q6gWL7lXBi5/Q7dZs5OMK7NNhTWVepwWmWaCRsrxPvWcbWqZVkeLgQ1GlxjjP7bPKA+c/dh/1ZTICvASWdPU1AgIuW+YaJX13p2tt/+0hRrXqP0vSQddnwG+3mLjBMAHd+Kt2vyYEnh9sGyDAd6tfjEsGD6/RUKJhhBLZh+YUi/UD8wsH48aBSGYve8FKfiiLVcRUmqvHaC6cpdKh/QaLJYqRpCXSFiRqacwHOfBu8ckyDJcBP/AV9qqmqtqZYoQWqWUy0WIpRPhX1BBudql9zQgHzZggKselXh5EtcGdSATAC21Ok711J39svrjUKvZ23t1y4dpbKulg5OY4j24gqQmUjaEBI7Mgi62m/eTo45T6qUvFEqg1gnECISHLzxHlCGBABTbQA509kWPwUALDwlVRQCw6HfuIECSzbep+oqqad5JY0xZ5YpEnuFXEANK1DitGkeVilvWZ9ghHWHkr9wk0TSHWhDZIm0n2WrLOkqpms1qRtinRa4MdcDQp6TEIo0DbXaPwZktzY8warYkfVqK9XTMwEKEOGmeqmG2+RP2TjbMebNRFSgsAJtV6QrfbIBATYH70DTuwIeb9vBGBjPP3Db82SMl7jprVRR0Sxq4oG1FxGxmbXVhhI7RtGU4ZJ0dqRuXTsY+LhKuMir5KrZGbdbgL5ahcoI0RTXpYjEvg7COI5FjnOKBZYxQoxVyeQhhkF1vs5Vuz8GFz6fayGOQ73PTRZY1DGCzgdGdx5m4agYDrVAvu0cHu1eyi4TiQOpDSaFGmNlo3b3xh272LcrFBpgUc6v9Ex5xHySfu1OHXvQejAZkQhYjV6rK45jrWzW7t65Yxf7O0KjMTaQhN9zaVlc0Xv3aK4/ur3b/oFo8QAtj+3V/xlaiX7lupkJFHG8s3I5g5cceLrnSD3TH6PdL0DZstQj0FQb2TRgnlkF5VXyfF2TSVDSOcNP8q8ameZOZS0KFIw1vr7nu6KoKmkDFDBBbmjENs161NWRbMZ39xB3j7mnXzVgy4Jh7eJeIsaasI9F7Vye1dUX+83CaNxgWegirpxzNcIhYn1m+q5lF67BwvExHG+B7eVM+3aMUpYxOgS9Sb64x277g5X9QVr6g5hdnqfzhoLFWjX57KaiWt3Kp7QPGtH8M9O9eskQfIy+l7iylKcN8zrFjZy961W5Nsxccu9597Sp/zMSnfihQbFHScXebdnNvH3pJupTX7rA5LB5QK4lKSngEdgCZNmYYP7j68erEGdP0qevOAmArnpMzAr8hHwX1vulZzes+eM7w131GU/uiNAwb3haOOle2/ekLj6Eb+ADQ7TyrGkzVjGMVJ8wWib0tmm2Tek7YQo1dcHqfkHsuvyUz6M02lriPvMOV3dWkQIUKJlIMwrSUgZgjPzM0yYzmiwFoNyDp0zEFJdSxtF53Al3s/792qoOWHff+AaPyUOef3lqv1sgbWGzisb1exA/fuTf73oh8rUGG/GnZt2YRNe0nubLWbhP8APcC1+mUnS9+ETWwTa2PP4IaCURj2Q7PDEafn6CI6UEIMDmivgL0rymMcxJeKtFHoHeBnibQvqa2bC84+0IXKODXZBlbL7CPpwfScgrZ2wf8kLiZq5LrgD3h1/d+Xedt4aa+WlnLsAqSt4yP4PB7zMt+0PhmkKFlQP3wpzsMlSaXMtnVQuoEW7Pze3zjPhQLnVxTMDGgD/m+wvcNLzJCJV3hwHh7USNq5/6adI3xPab4Y/TT/xvbBVs4ISwefR3BWTTp8I4q1TSAHawjo5UnNNNTuLKVnU7L/nj7/P9HPxPYDTdnmyo1OkGzzAZVl7Bjor5tIteNgNGYMm/7gO3uldAAs43S1s/74beuDzxZ6KLqBKnFVM0u7drbrDYI/7t3H+pcH2Qtk6BotNK2wZhaB2Dec8hJg4RwC+sLzYoewsxpetkNuig7ciixqxxJ0SVX3R+Awmsg52G1FYgpvp0jftFBSku3DXZYIZD+KYDEGEqqfOhYlVR6qAhn8IqP6ru8JyjoTQ9Ti10g4sMBSiVDJyZFNVfzgBRssv2sBDPNBMq3imSuJqrdNG09NRm6IUclejcP+dJaqET4tyigoo3tBpuVDrVpflwpy8EA5Z4/dmtuvsyVkh67klUODNRosfZ9d/aPV3/Qxb+rRauL4Z/l4XjLeQZl/31GDCo3F9h1VmcQG2U/lSjy+VEky/qDFG1JF8m/EzRfi8BRwFsPnGzT4HeL/1eQJfMHb9vvMxWtahSXvwM1/4JKBnzJkc1s8awxu7HOouWouK3tptV2+/wCZuaYEZ2UQaszfvdzF1NB6Q5LX4mb1um8IYzT/PD6u1nUHipUs7GVU+m1HfOrqTqFgXNlHXtnfkxu4Y63flcno6/xd9gWPwV7fb16Ls7enGNPwxll4k6fw/IM/bUf/m9prm7hzp3HzPq22s7KO8/QjxG2PqKn62j7Kz9fs8AKi2C7fdThTIfG5V1V+nxX9h5799u4cAYjrdQb2/Q77YxneWU0HHSlkEtyfqp3qbh/KfQBuplCOYzytDvyKQHPXu58UZ3Oc5WJAQ+z0GqvYEIFkqfzf4GI/3uBlZuAba8Q7U3JlH6ZzRK0su8MtSeC+WmE9EiMU+UGj/n//L392PuVbCvTfPtWZZvknCmVKWJVPF+sLVtQ39VE94Ifdu3LbLShur47CapCgnW5aePB2ibdL/+Wop2eKenJDlxeGVH3v9ruubKtwRpc2xcUojk9rAejvVCTY3rgnnGIzOoT08XSauBbS0CDVkxtqDp9/eUpAxQm9NNrXNia7I+srfS6fcUUaZ6v0/qLX84dQo1qaR8298CiKiUPHJ/SyCKSg5UWwTlc1DBBnP7aX4l2WVdyrdPEjC6c5UYKx5oXdY36Nigg2TE15ZBxsn5I6P698H8M6jO/XsDIcp+M80lmdl4L4uJCuUa4NnXqHGkw7O/y+XPpXaVKCm4RNHLZz6nOtrtnjkD2s0/a3RJoP4yZ3+OkOC14x1zLXlxiQGynh80WwoQsNZQJo41awRV9H3HARitqHa2g75KcjG7FohNO144VqtJGH2BoMOehBSOeUXMVn2k7zCBwOKIJJ1kgHIlSW/LqLev5tXYax8Nc8L3/0hJMYEbt5lMjJOMOOsgIK921sJ62R4yhvSQxANHTnKzd2gZ3OLJa/v4udaxxqkdoTT3yg8U417XgKy1hMZbZ5ouNGQ6O/06qNkpAEq6YdZxf+LG4zC2cQzoFXtOnWHUtrtJvzVbdQOTn99ldjFof3o2lyMEQfbjz1gJJOubmTUukqazc4y+SsmAVuaxF0MPbgCFId16Q32jmxB85J0Rq+gzlAK/bD8c0SDScN4Lqq+fGl5d3V4YCuJx1ytDjSJzhzeXhva13BsE8OVz6eUdIIM+SF4lHR0CcSLG66xwnEGspRZp80cY0LKHY+oofaAxdbOP2Rb7gMrM9X3v3W/ISjC24Xlic0iL/JbeOJp5Fa1LMPNHDD9mBrFfPnW19WdKYHTMad7p77JSIRYmie6y35wQfiiA2M+My61SDfrwVxn++jk21NEYoZ9kNdmpbbQrmnBmIgpwSZMRk9/WbFKWRYKBANRDpwZ1AyoK+m4uHceDzlySu29M/dwtKkG/if1PQvAo4XVYz7FJPDzJECsjuol/yFp4R1nUppwzMC+2zC7Qw5IOepzWU05T8jUmv+JqYWwqoLjcYDkx4tvPfPsssLBY8ejfPItasrG2DwIGfxSFPO2Cd66ibttJj89lFGvBoG0lrE30Zj2pz44BvxsYHuJG9Y71GK7Me4dgU/AVzfgAQx8J6mMr5QpOd2T0u5o/IPczr4g0WWyq/Ipj9LmO0g2XdNrbdKN5x9loukHb+MB5RkbbIQ1fXPPoj/5YVfXuEq2GIKPhMH0ejupV5BtJOKQJBawM5AXONXwMZx8gx3XOvkdeu/Fg98nDTdrvwwMcPqRHKRCKIUVz1Y4slAF/7OU8VBgd+5eF0N8x5voZ2S62zsuI5Ux1MQdVlD73iDz0usVWI+3ZcVFuqYRZji8/gjsHlU6XjRYiglzG/IV6G4L3HkU3oS/Um/x3SjByiJrxSVnn8zQngwWQsDBlDxlgl1iwvrDu0976bMBJtS30Me9AvwYGXovLZcWkFgEimh5VOFw6hq3cO6hvCTfCT+i/cBB14fTMGK28Lp1XBhoAuW9SpfBuQTTGz7QHpiXuCILBsG6c0L9JNPCmfZ/rJ52Ts9PazeNfHZbo1PET7CuMhFbfXVTeAVT94EhwDa3qe4PS5MVZgGfqSEvOfb2dln7ZKx4UA2EI94Vqh23lSEqnEX3J8wDxxYWhyJB5Zov67LGvnMZ7rJ92L+v6+SFSYp0aWPey7Lcmq6/iE517Lp9MqRsccE/9358o8elbGWbhakBheW4IKabnnW9jOPy9dPbYv5dyeElrEiy0DoeZ9hH2NnuRRkBpNl3378RutamY5iPIWIQdnNRrVSbieDobMYhvUsGZ7l2e7GqR5Or7wdVSGO+ylinvEcwmqbu4nQSdxi2J8YrdHaa6oA3tN6Bk4F+5BsuwwjkLphfUXlDuNkQc6odzvDonyaLEjhYyESp3z05zykP+YCmFhqMXKl2Q/YEuo4uhDIhF+I1SFx8NJO26QoVShcgd/vsBsMcItEdyXM6YEctRiH1sagv0e0wojyd7ZskzFLga6kNFNncRjKX7UiHsUD+WA4LSFk5iUC7WHRi0R5P/eXLiu8hVm9xm7mRpL51T8j2fXVhHuc2D0vRK/fDo7hHaGQ4tECywIjCWkkbEaO3HAaHIdUFx92gBSgflud2k/zWtNIh2YAR6agQ+sUereX+MZezTABdUF81WuRS46Mi/VOc/x/jKezxpHd6H/DqhzD5aFKX2ROz2n0g3B6Bz1jFjDB2ZOqGzBYGJHYewoUHStZXJS74yerhG0wF4FH6sS7ATr+D+xFInRakoWg2S9FD8TCI5esjsPGh6YkswVY82RyDl55iob8kP65sv09QJ/92nFZ7EX4fwQJ2vAZvPKwVU/pY2bYH9jEFpu7MG2q4hZ4KLYuAPbxpHN74QAd08ixJZehOwlVjkA8LzJHEnr/if28Bb21ovWnyncANfthUmhb6XVL2jUoAizQc+fCZBYjyjM5sRyBEHBQEEm//t2ZdSVFOFwZfPw/+Mc843BWrrRbM4aqIVpixvahJWIuW77XN+NPiwFD+gtDxtwgyuPWoeGCaJTE1Xjdga8ypb5pfBVpuyCTZmmS2hl3/UNLhEYQepACCD3rdMi6h3FpEHTMCz+qSTeXvLh/q7k1M57eb2f1xdSifP7sy4iQrf3LjtSR23k9OT8tnC9cmihatVsHVhgOmpNOVL7eTfSQZ8uUiDsyKrQMXHpWUlaYicQppHny8ZreKC9DUt31TQ0UqN7zQWE9b2QFscmDk+BNNnj5k386BAKJoXeKfMZLA5ZJoz0kO/jMr02HgDc53n/5igbGRjRxblFU1ucaIsVvbiF81q92Ejd9X35aDLCzgDBovcXZuxGnqA2cL0VcgMoGMJe48wpCKfSgkGgcQJm9Ern9MQh6gjCbB61uF/PgwIjTu5CAOLojRDHzfEwTk/cl2fFXstxf/0BQ8TgMYNc7FE0qAJhCgI/pEwTFq0VaueYNXWcJORBMTL9oNOU0Boywg2+XTpS9V4L3EJmN61Hft9ICiBMCmuIEQ3KFugY3eHqb7llujGhXGwwsEWK6uMfnnDVz1vW1NOBV+b1USnrf20QPONqHkLZRU6zYC5stnG8aLEyKrJzxFL45jZDmvjjvI5CiHRzilEhk04ZmE3FON1Tb1Mg4M982KN+GOHVgw/Q+P724Y862mPKoT1bN4FB+xEpycZHxTvaLMcHtrefTGWzpqlJTl2O7HTgoDC+abYFrwf17DqPoViMMEzCgLwkC3//yL2LVbZoAaiT9uog92f5q0FS3Kw5NOypMqkISMNfZa0QJWG7B9k4bc4Q9ddxqxjCeouG8XLvReC7yz48lwIHO99b1dg/jvKO8Ak4+ly+TN5JZFKZ52oEMsRyrZ7r+hwFkO2G94gh+LCsZbNndk2T5G5Xrh3nh5TXLfb5jY1Nj1p4TnpRrabnaJso6FDrM/9XUdJW0WW82pQtPqSL2LgfIQPLD9UlnCVNqc8d62/bfVW6DaVexioaSLMwko0T3o9i6kpv639QojTAL8EDqjB+OYpA1z3rgqoPsqVUCiiarUddgA4yS/kh96wI3FC55MUFB4oyK+2xBAn6UGSp9D4ydAXuQ0viYn6Ji5jjHzriWi5UvNkBHcsnOuf3MIVgRwrdK2tLbOaidokSZNdR+GRSioC6QvpJiUDryIEIVOgwd7eqeHzljRsrwUSdof7KFC64VBsONywptlzo4c0pSTLtaMS7nADSYK1v4GnvxNUPRDsl20awKj7lAN62iJl8E5bNn6OYMJpdANROUfjgQgr4leOagMxkOVEPF0WbseLHUqQiwKWaYcfjMK52MfCyh8md3rAR9UBtjDs5Sxb2QKtGjFgqHKRGIdjHvHtlF7swoOWpp/4jVnG3FM74CpHxEETfbu58Cm9hFWvrq4KpqySIkugkxjfJC25VC8/YytY5JfzG0bVDzJv34GbOHMhClJCGrjDDdWIYEU+WKO6WargnVtE643Ak5ZH+i1QPa6k8EnuBhhRqhKgoD9GEp3nU+2I5nwtJfjAN9JYAjjUpdMJTrOdlKN6MCY4LNYGdHiOzDt/5yGJ/BS+yc1UhYyPhGY7rxNJvNVR7PXQb8WTcSeX5JJc8kt2qY/xzotdRv6vaSTnADx8N0Lm9PL76uejC9JFDIrabF7KO0fcw4zKG4N/ZtFgcHG+tiHWWPz++jZM0zgCYLREf8gHrKMrougZIglsjX0ys53GZriOMBIRRV8UfZ9muXelvfMBDzGGWry2xNUGxpSITOhJu2gejaFF2ANsncqB12QQ1xsYW+mHO3oe52UdXT163ABBGcrUcvxFuFW6ELrP+Pwul86zgYIYe8vufAmT5JYNm5+Qi12nnnMbRv9RDRuY5iWF8ts7+MAy0MZwswTdQizezy0KwcmX9eBRWU8wMZRkHBxjDmVdzJ0OvVMNDDrG0xuwiM1nB/CjXokaEo32x85b3e9cyreM/Yp4FmI7c96vbnqo39BniC/ypZJneNlbP+XvYmD/izf+Ywdj74SK/AXvFe8YCjsrAKnurGf6bqDIf3NkpoO/V0d+j1XcW3cif+Z7f8gzlPL5C1pUvkW927Refoc471cv/OaskIPbxt/bIvnU9rmX5u07hfLpQZ6/ko/veizHR0KPd1ZI7ABEdOYd/WZiGIY/5a+Qkdy9xMPf6iIhpHsh5DN+fvFxHxCVvTtpy9j/P2XHLWq+gCreARQmvA8fMkbz9n4FBUv7bc6ntaiDAcJZ+dDN4qIIGRDkoVOZvY86gFpev+pTateEzcoAbfS8yIILsGn+dVrSZxBFdpZkYMivs0LChEKWvFRQhOpi8Hk9lG3VPk7Q085gOkRtbQK0Fx2SLlRVxRNbwNv6M+4Nd2StqUJcgSlArEDL9mekwwgv3H7seSRUI0b4em0xbuIx3IAGficUQfYOqQh5QF7Y02hpmta2NDVB36tVrbBimtS44wNm40h6TN1apVUhNiXfW0b9BX4XJVNC0Vy3jFu3HOoDAG7jYJTpIji0MTmCQdau4+rUvyFgku6balOhJOfc1s3T4wdrS4f+pen/rrundJT1aW1aX65fX7u+vlq/sXZjrdoMwPp+3R3LWVvr1ms9NneZ9XFxBLbZgtavPXINlLx30CLJofZS+lNqODxNs+wrplQC98yGANdPIy5WualIpEbslmPEIpst2FEAooTJLDiMbBfsuGSr2390hPyzsz3pmk9URhN4s5PbsJzaVh2sCS0d4VvBkdfbw6BzJxZK96SbNQ07Lwt5u2Kj6TSaAJDbyFzYT7dQzu4L0hKTLRV+CDQr9hLGGnTHN20TFhQPWuBgY/CUu2YEvXAH2fxw++q8D6IV4C8UX5iCJGvKgQQqSx+QwqSV7Ba0zTSVKRLbi+T3cM2wsoxaASezh7KjzbISaFxeFMPVabMBaBvVnB98FfP/LaKUT4reAN/eT71z3I4RUh4wjo5zUxAPwoyPPTXtPRSvu4m0iy1sILrmohcc7ZDrxXtH06oSqtrpKM4bQbm9W4iQ0x/H7onBAkwgKUnzMfSjg2p2+GS1RM37Vb83M0+CktZdwrKJWCCRvfzlbTFPAU2Kum+rs+ZmnfRZCD/leelSRfw4VxVDEmpdZae5ZOc1v4ZefT7PRp3IFEtTY3g0XWL44QAkzBRQwSxDyAmN9OFaB0pi5TNbLxAwqlbhlDXzH8tzPpA+zYZ+BQbSCkc4kX3bBFM0lAVDzNDaRzinRMZw0eU5dGDsNgCeMRs5ifFVeglLsnCrDLskpJLQ8iHm5heMaP+yTSp0woMPh1cBrM5f3LRY7euYokwAlq7dLsilsjGdaReOfCAklZcefHsYzHi1CBtjVsM3Lvb3sH+EEXTzPx3j5fCbdyG4l7lGshCR85BKjpYKP84CNNd1gmpn7QDqJ0xx5mC2u6tF7agSI49VcxcaBdkAl8pgUOgQne6HEUwTYHvUyQcY4YJRiRdSiGqHwImVLH5jxWdPPANrBndtLAogNK3dhLNyMdK9xPH7QvLXNo2pT77yFKBys9gBNoyrEhwuNqZrrlZL0sc5o5xJB3kY5QqWUKmlZJ69wfrHq6bPCKfMsm3vjOmK7RVNrCfKisVlyeUm1HY3rn+hUvxbpEcFzn99GU1hYN/Dx8jUnTPksNYfvwv129XvrOYwNB+NC6BeOl06Mv12j9/xkZ1SzCqOqd9rfKB0oYP8WuXXwvTGFgf7fUHxi7KZDHSl/OW3DULDAEbcycNhlfwKegnZ6lUn4kkiV1n+ZPg9KOlo8J1VpNuHqWdidfUSoaa26GE6cn0UbNA2Mb9u6phJl7EUpxWYjg8nCq11B3trOB5yVjR1Xw8mOOoeGR22sIq02yFmJ9am5JAJdMi+4lA63jTj2zICqjZwJVl9XNocRR38DenFTNoEqf72vGB2ntiId0hJdTpmB+HlxLV9h5WC5XNRyJOrdhMtgpf8YI1Sp7f9OIQo+yXpwaOr7KQQUu6d5pja5Zoc60vrBKf3i+LhyOx/NVFkS96wMm4CjNwfVFU3AoOTauHrciHmpXPr8eI9PV+/AAYs45TM27WIfi0VYKKWbPr1UWyEDIfTJAth3gY8vRA7ROfK5l/mNNDhLBJSZRFeFrVIqRLztVUkM62pO9ofj0+iwtFz2YhEsi/SFznK8WUGHHA0s1UaMjSLaTGW6UA46T5+bHlzGdBqF6hRYbt8rJlHk/kzv9mtm1v9rf2EBPH/OeeAhZuMacCzqW/X39W2ELS7a9bm2f9J41xl0T7o0OFnsCs+Iq93u0Upvywc6/JWb/RSNHBT/36A6stzGucm03en4fpQ7X/CgTdPAF+aPWgqYciaFNfcIxFGpqVKtFB0bXe1QpX/lU9HzhxQVltCVvvBcW/wMjMsW6QDSD4WyIUHaaryvCX7nJlRlLKWtXkrmI06CcfbZALWVJ5AsR8aonzeQus8RAfL+BnWupYQW/NUUR+K/3g1dBnbev+seThdfW4hMMjLZ7vNZyaOWBaJFLzs06N/vC+IrYrFIPlEw3ShrsgcvE4YMHOpLt4Zc7/hYOjggcef3a2df/h3CXCaXO/50TGgh6V+sKNnpcJTT03OXWK2FxHmnt2gafLoVO2dAfqrJYMUfjeOHk7qKfAQz736UswWho5ZK/On+cNzRxlDuJMnkpwP1/4LuNbIFpkXlzTkXRmVZ9LPLitmGdEkvlgBNJ8mxijbe6cd9PJFGKifkz3bHACfpFHCNZhKqRMwCsxmOuv5ghEC8A7b9wCmnfIwDVMOM2ItiWHLrdeMJQPNwRkskZJbJIfqyREvYBFSBXIyQ+sYfFALcFrJKIx4vkB3NQB2RUlW1CKZ4kaugRb4briONVLN0hKoGup397/EV1/w76vBu6OfAeCTIs2nlc5MljBCbjmZVS8w0PRGZUzZDGIoJKxy1OjYUpci3dZAZ4xjLtV5KT8+8JB01T7weCF9jdPV4kO3zVB3kntOliahHeyhdmsKCR5g0GPhvCXXGzbofaBL20xCTOicnTmeCatlsDeNZ02frLfNZUDIG8s6ZbNRypVfSgQJm9mGZyYZ0cd8Bnj5ThyWZTGgCPf2ImhkCYtOBzmy+3sc6Gmp3GAaZbpqbfR7qvA74/+7iWMWeoFLq9Yhmwr+7XVbCNzQ0zfLngHmFlnDiY/QKIXHGXCV/jE+W5WZRx42AKXqVjeUa0iQQbnWTKeYxEAU7dd7KQKXHP7M5p1ImPbLJR8ThufX+OzXu9nWm34If1QGQUChCTcv47d5/CnRnfu2De93nNVd38nhqDTmJzzYroQ/fy6NDedUKa8KSVNuaFnoeebSpsHe50CKCeb+xO5GxbHRvYwfIzDLOarvMfGCtwPIsXbxh+nwQCBHrv3JftuJ5cJV64fcuLIt5KCJgVcQUJpjVBrWZEw8FCYB","base64")).toString()),ej)});var P1e=U((oj,aj)=>{(function(t){oj&&typeof oj=="object"&&typeof aj<"u"?aj.exports=t():typeof define=="function"&&define.amd?define([],t):typeof window<"u"?window.isWindows=t():typeof global<"u"?global.isWindows=t():typeof self<"u"?self.isWindows=t():this.isWindows=t()})(function(){"use strict";return function(){return process&&(process.platform==="win32"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var k1e=U((Jzt,Q1e)=>{"use strict";lj.ifExists=hwt;var UE=Ie("util"),uc=Ie("path"),x1e=P1e(),Awt=/^#!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+)(.*)$/,fwt={createPwshFile:!0,createCmdFile:x1e(),fs:Ie("fs")},pwt=new Map([[".js","node"],[".cjs","node"],[".mjs","node"],[".cmd","cmd"],[".bat","cmd"],[".ps1","pwsh"],[".sh","sh"]]);function b1e(t){let e={...fwt,...t},r=e.fs;return e.fs_={chmod:r.chmod?UE.promisify(r.chmod):async()=>{},mkdir:UE.promisify(r.mkdir),readFile:UE.promisify(r.readFile),stat:UE.promisify(r.stat),unlink:UE.promisify(r.unlink),writeFile:UE.promisify(r.writeFile)},e}async function lj(t,e,r){let o=b1e(r);await o.fs_.stat(t),await dwt(t,e,o)}function hwt(t,e,r){return lj(t,e,r).catch(()=>{})}function gwt(t,e){return e.fs_.unlink(t).catch(()=>{})}async function dwt(t,e,r){let o=await Iwt(t,r);return await mwt(e,r),ywt(t,e,o,r)}function mwt(t,e){return e.fs_.mkdir(uc.dirname(t),{recursive:!0})}function ywt(t,e,r,o){let a=b1e(o),n=[{generator:vwt,extension:""}];return a.createCmdFile&&n.push({generator:Bwt,extension:".cmd"}),a.createPwshFile&&n.push({generator:Dwt,extension:".ps1"}),Promise.all(n.map(u=>wwt(t,e+u.extension,r,u.generator,a)))}function Cwt(t,e){return gwt(t,e)}function Ewt(t,e){return Swt(t,e)}async function Iwt(t,e){let a=(await e.fs_.readFile(t,"utf8")).trim().split(/\r*\n/)[0].match(Awt);if(!a){let n=uc.extname(t).toLowerCase();return{program:pwt.get(n)||null,additionalArgs:""}}return{program:a[1],additionalArgs:a[2]}}async function wwt(t,e,r,o,a){let n=a.preserveSymlinks?"--preserve-symlinks":"",u=[r.additionalArgs,n].filter(A=>A).join(" ");return a=Object.assign({},a,{prog:r.program,args:u}),await Cwt(e,a),await a.fs_.writeFile(e,o(t,e,a),"utf8"),Ewt(e,a)}function Bwt(t,e,r){let a=uc.relative(uc.dirname(e),t).split("/").join("\\"),n=uc.isAbsolute(a)?`"${a}"`:`"%~dp0\\${a}"`,u,A=r.prog,p=r.args||"",h=cj(r.nodePath).win32;A?(u=`"%~dp0\\${A}.exe"`,a=n):(A=n,p="",a="");let E=r.progArgs?`${r.progArgs.join(" ")} `:"",w=h?`@SET NODE_PATH=${h}\r +`:"";return u?w+=`@IF EXIST ${u} (\r + ${u} ${p} ${a} ${E}%*\r +) ELSE (\r + @SETLOCAL\r + @SET PATHEXT=%PATHEXT:;.JS;=;%\r + ${A} ${p} ${a} ${E}%*\r +)\r +`:w+=`@${A} ${p} ${a} ${E}%*\r +`,w}function vwt(t,e,r){let o=uc.relative(uc.dirname(e),t),a=r.prog&&r.prog.split("\\").join("/"),n;o=o.split("\\").join("/");let u=uc.isAbsolute(o)?`"${o}"`:`"$basedir/${o}"`,A=r.args||"",p=cj(r.nodePath).posix;a?(n=`"$basedir/${r.prog}"`,o=u):(a=u,A="",o="");let h=r.progArgs?`${r.progArgs.join(" ")} `:"",E=`#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')") + +case \`uname\` in + *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;; +esac + +`,w=r.nodePath?`export NODE_PATH="${p}" +`:"";return n?E+=`${w}if [ -x ${n} ]; then + exec ${n} ${A} ${o} ${h}"$@" +else + exec ${a} ${A} ${o} ${h}"$@" +fi +`:E+=`${w}${a} ${A} ${o} ${h}"$@" +exit $? +`,E}function Dwt(t,e,r){let o=uc.relative(uc.dirname(e),t),a=r.prog&&r.prog.split("\\").join("/"),n=a&&`"${a}$exe"`,u;o=o.split("\\").join("/");let A=uc.isAbsolute(o)?`"${o}"`:`"$basedir/${o}"`,p=r.args||"",h=cj(r.nodePath),E=h.win32,w=h.posix;n?(u=`"$basedir/${r.prog}$exe"`,o=A):(n=A,p="",o="");let v=r.progArgs?`${r.progArgs.join(" ")} `:"",b=`#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +${r.nodePath?`$env_node_path=$env:NODE_PATH +$env:NODE_PATH="${E}" +`:""}if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +}`;return r.nodePath&&(b+=` else { + $env:NODE_PATH="${w}" +}`),u?b+=` +$ret=0 +if (Test-Path ${u}) { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & ${u} ${p} ${o} ${v}$args + } else { + & ${u} ${p} ${o} ${v}$args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & ${n} ${p} ${o} ${v}$args + } else { + & ${n} ${p} ${o} ${v}$args + } + $ret=$LASTEXITCODE +} +${r.nodePath?`$env:NODE_PATH=$env_node_path +`:""}exit $ret +`:b+=` +# Support pipeline input +if ($MyInvocation.ExpectingInput) { + $input | & ${n} ${p} ${o} ${v}$args +} else { + & ${n} ${p} ${o} ${v}$args +} +${r.nodePath?`$env:NODE_PATH=$env_node_path +`:""}exit $LASTEXITCODE +`,b}function Swt(t,e){return e.fs_.chmod(t,493)}function cj(t){if(!t)return{win32:"",posix:""};let e=typeof t=="string"?t.split(uc.delimiter):Array.from(t),r={};for(let o=0;o`/mnt/${A.toLowerCase()}`):e[o];r.win32=r.win32?`${r.win32};${a}`:a,r.posix=r.posix?`${r.posix}:${n}`:n,r[o]={win32:a,posix:n}}return r}Q1e.exports=lj});var wj=U((AZt,X1e)=>{X1e.exports=Ie("stream")});var t2e=U((fZt,e2e)=>{"use strict";function Z1e(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);e&&(o=o.filter(function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable})),r.push.apply(r,o)}return r}function Ywt(t){for(var e=1;e0?this.tail.next=o:this.head=o,this.tail=o,++this.length}},{key:"unshift",value:function(r){var o={data:r,next:this.head};this.length===0&&(this.tail=o),this.head=o,++this.length}},{key:"shift",value:function(){if(this.length!==0){var r=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,r}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(r){if(this.length===0)return"";for(var o=this.head,a=""+o.data;o=o.next;)a+=r+o.data;return a}},{key:"concat",value:function(r){if(this.length===0)return Ik.alloc(0);for(var o=Ik.allocUnsafe(r>>>0),a=this.head,n=0;a;)$wt(a.data,o,n),n+=a.data.length,a=a.next;return o}},{key:"consume",value:function(r,o){var a;return ru.length?u.length:r;if(A===u.length?n+=u:n+=u.slice(0,r),r-=A,r===0){A===u.length?(++a,o.next?this.head=o.next:this.head=this.tail=null):(this.head=o,o.data=u.slice(A));break}++a}return this.length-=a,n}},{key:"_getBuffer",value:function(r){var o=Ik.allocUnsafe(r),a=this.head,n=1;for(a.data.copy(o),r-=a.data.length;a=a.next;){var u=a.data,A=r>u.length?u.length:r;if(u.copy(o,o.length-r,0,A),r-=A,r===0){A===u.length?(++n,a.next?this.head=a.next:this.head=this.tail=null):(this.head=a,a.data=u.slice(A));break}++n}return this.length-=n,o}},{key:Zwt,value:function(r,o){return Bj(this,Ywt({},o,{depth:0,customInspect:!1}))}}]),t}()});var Dj=U((pZt,n2e)=>{"use strict";function e1t(t,e){var r=this,o=this._readableState&&this._readableState.destroyed,a=this._writableState&&this._writableState.destroyed;return o||a?(e?e(t):t&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(vj,this,t)):process.nextTick(vj,this,t)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(t||null,function(n){!e&&n?r._writableState?r._writableState.errorEmitted?process.nextTick(wk,r):(r._writableState.errorEmitted=!0,process.nextTick(r2e,r,n)):process.nextTick(r2e,r,n):e?(process.nextTick(wk,r),e(n)):process.nextTick(wk,r)}),this)}function r2e(t,e){vj(t,e),wk(t)}function wk(t){t._writableState&&!t._writableState.emitClose||t._readableState&&!t._readableState.emitClose||t.emit("close")}function t1t(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function vj(t,e){t.emit("error",e)}function r1t(t,e){var r=t._readableState,o=t._writableState;r&&r.autoDestroy||o&&o.autoDestroy?t.destroy(e):t.emit("error",e)}n2e.exports={destroy:e1t,undestroy:t1t,errorOrDestroy:r1t}});var xh=U((hZt,o2e)=>{"use strict";var s2e={};function Ac(t,e,r){r||(r=Error);function o(n,u,A){return typeof e=="string"?e:e(n,u,A)}class a extends r{constructor(u,A,p){super(o(u,A,p))}}a.prototype.name=r.name,a.prototype.code=t,s2e[t]=a}function i2e(t,e){if(Array.isArray(t)){let r=t.length;return t=t.map(o=>String(o)),r>2?`one of ${e} ${t.slice(0,r-1).join(", ")}, or `+t[r-1]:r===2?`one of ${e} ${t[0]} or ${t[1]}`:`of ${e} ${t[0]}`}else return`of ${e} ${String(t)}`}function n1t(t,e,r){return t.substr(!r||r<0?0:+r,e.length)===e}function i1t(t,e,r){return(r===void 0||r>t.length)&&(r=t.length),t.substring(r-e.length,r)===e}function s1t(t,e,r){return typeof r!="number"&&(r=0),r+e.length>t.length?!1:t.indexOf(e,r)!==-1}Ac("ERR_INVALID_OPT_VALUE",function(t,e){return'The value "'+e+'" is invalid for option "'+t+'"'},TypeError);Ac("ERR_INVALID_ARG_TYPE",function(t,e,r){let o;typeof e=="string"&&n1t(e,"not ")?(o="must not be",e=e.replace(/^not /,"")):o="must be";let a;if(i1t(t," argument"))a=`The ${t} ${o} ${i2e(e,"type")}`;else{let n=s1t(t,".")?"property":"argument";a=`The "${t}" ${n} ${o} ${i2e(e,"type")}`}return a+=`. Received type ${typeof r}`,a},TypeError);Ac("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF");Ac("ERR_METHOD_NOT_IMPLEMENTED",function(t){return"The "+t+" method is not implemented"});Ac("ERR_STREAM_PREMATURE_CLOSE","Premature close");Ac("ERR_STREAM_DESTROYED",function(t){return"Cannot call "+t+" after a stream was destroyed"});Ac("ERR_MULTIPLE_CALLBACK","Callback called multiple times");Ac("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable");Ac("ERR_STREAM_WRITE_AFTER_END","write after end");Ac("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError);Ac("ERR_UNKNOWN_ENCODING",function(t){return"Unknown encoding: "+t},TypeError);Ac("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event");o2e.exports.codes=s2e});var Sj=U((gZt,a2e)=>{"use strict";var o1t=xh().codes.ERR_INVALID_OPT_VALUE;function a1t(t,e,r){return t.highWaterMark!=null?t.highWaterMark:e?t[r]:null}function l1t(t,e,r,o){var a=a1t(e,o,r);if(a!=null){if(!(isFinite(a)&&Math.floor(a)===a)||a<0){var n=o?r:"highWaterMark";throw new o1t(n,a)}return Math.floor(a)}return t.objectMode?16:16*1024}a2e.exports={getHighWaterMark:l1t}});var l2e=U((dZt,Pj)=>{typeof Object.create=="function"?Pj.exports=function(e,r){r&&(e.super_=r,e.prototype=Object.create(r.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:Pj.exports=function(e,r){if(r){e.super_=r;var o=function(){};o.prototype=r.prototype,e.prototype=new o,e.prototype.constructor=e}}});var bh=U((mZt,bj)=>{try{if(xj=Ie("util"),typeof xj.inherits!="function")throw"";bj.exports=xj.inherits}catch{bj.exports=l2e()}var xj});var u2e=U((yZt,c2e)=>{c2e.exports=Ie("util").deprecate});var Fj=U((CZt,d2e)=>{"use strict";d2e.exports=Qi;function f2e(t){var e=this;this.next=null,this.entry=null,this.finish=function(){N1t(e,t)}}var qE;Qi.WritableState=nv;var c1t={deprecate:u2e()},p2e=wj(),vk=Ie("buffer").Buffer,u1t=global.Uint8Array||function(){};function A1t(t){return vk.from(t)}function f1t(t){return vk.isBuffer(t)||t instanceof u1t}var kj=Dj(),p1t=Sj(),h1t=p1t.getHighWaterMark,Qh=xh().codes,g1t=Qh.ERR_INVALID_ARG_TYPE,d1t=Qh.ERR_METHOD_NOT_IMPLEMENTED,m1t=Qh.ERR_MULTIPLE_CALLBACK,y1t=Qh.ERR_STREAM_CANNOT_PIPE,C1t=Qh.ERR_STREAM_DESTROYED,E1t=Qh.ERR_STREAM_NULL_VALUES,I1t=Qh.ERR_STREAM_WRITE_AFTER_END,w1t=Qh.ERR_UNKNOWN_ENCODING,jE=kj.errorOrDestroy;bh()(Qi,p2e);function B1t(){}function nv(t,e,r){qE=qE||Im(),t=t||{},typeof r!="boolean"&&(r=e instanceof qE),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.writableObjectMode),this.highWaterMark=h1t(this,t,"writableHighWaterMark",r),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var o=t.decodeStrings===!1;this.decodeStrings=!o,this.defaultEncoding=t.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(a){Q1t(e,a)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new f2e(this)}nv.prototype.getBuffer=function(){for(var e=this.bufferedRequest,r=[];e;)r.push(e),e=e.next;return r};(function(){try{Object.defineProperty(nv.prototype,"buffer",{get:c1t.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch{}})();var Bk;typeof Symbol=="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]=="function"?(Bk=Function.prototype[Symbol.hasInstance],Object.defineProperty(Qi,Symbol.hasInstance,{value:function(e){return Bk.call(this,e)?!0:this!==Qi?!1:e&&e._writableState instanceof nv}})):Bk=function(e){return e instanceof this};function Qi(t){qE=qE||Im();var e=this instanceof qE;if(!e&&!Bk.call(Qi,this))return new Qi(t);this._writableState=new nv(t,this,e),this.writable=!0,t&&(typeof t.write=="function"&&(this._write=t.write),typeof t.writev=="function"&&(this._writev=t.writev),typeof t.destroy=="function"&&(this._destroy=t.destroy),typeof t.final=="function"&&(this._final=t.final)),p2e.call(this)}Qi.prototype.pipe=function(){jE(this,new y1t)};function v1t(t,e){var r=new I1t;jE(t,r),process.nextTick(e,r)}function D1t(t,e,r,o){var a;return r===null?a=new E1t:typeof r!="string"&&!e.objectMode&&(a=new g1t("chunk",["string","Buffer"],r)),a?(jE(t,a),process.nextTick(o,a),!1):!0}Qi.prototype.write=function(t,e,r){var o=this._writableState,a=!1,n=!o.objectMode&&f1t(t);return n&&!vk.isBuffer(t)&&(t=A1t(t)),typeof e=="function"&&(r=e,e=null),n?e="buffer":e||(e=o.defaultEncoding),typeof r!="function"&&(r=B1t),o.ending?v1t(this,r):(n||D1t(this,o,t,r))&&(o.pendingcb++,a=P1t(this,o,n,t,e,r)),a};Qi.prototype.cork=function(){this._writableState.corked++};Qi.prototype.uncork=function(){var t=this._writableState;t.corked&&(t.corked--,!t.writing&&!t.corked&&!t.bufferProcessing&&t.bufferedRequest&&h2e(this,t))};Qi.prototype.setDefaultEncoding=function(e){if(typeof e=="string"&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new w1t(e);return this._writableState.defaultEncoding=e,this};Object.defineProperty(Qi.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function S1t(t,e,r){return!t.objectMode&&t.decodeStrings!==!1&&typeof e=="string"&&(e=vk.from(e,r)),e}Object.defineProperty(Qi.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function P1t(t,e,r,o,a,n){if(!r){var u=S1t(e,o,a);o!==u&&(r=!0,a="buffer",o=u)}var A=e.objectMode?1:o.length;e.length+=A;var p=e.length{"use strict";var L1t=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e};y2e.exports=IA;var m2e=Nj(),Tj=Fj();bh()(IA,m2e);for(Rj=L1t(Tj.prototype),Dk=0;Dk{var Pk=Ie("buffer"),ip=Pk.Buffer;function C2e(t,e){for(var r in t)e[r]=t[r]}ip.from&&ip.alloc&&ip.allocUnsafe&&ip.allocUnsafeSlow?E2e.exports=Pk:(C2e(Pk,Lj),Lj.Buffer=GE);function GE(t,e,r){return ip(t,e,r)}C2e(ip,GE);GE.from=function(t,e,r){if(typeof t=="number")throw new TypeError("Argument must not be a number");return ip(t,e,r)};GE.alloc=function(t,e,r){if(typeof t!="number")throw new TypeError("Argument must be a number");var o=ip(t);return e!==void 0?typeof r=="string"?o.fill(e,r):o.fill(e):o.fill(0),o};GE.allocUnsafe=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return ip(t)};GE.allocUnsafeSlow=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return Pk.SlowBuffer(t)}});var Uj=U(B2e=>{"use strict";var Mj=I2e().Buffer,w2e=Mj.isEncoding||function(t){switch(t=""+t,t&&t.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function U1t(t){if(!t)return"utf8";for(var e;;)switch(t){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return t;default:if(e)return;t=(""+t).toLowerCase(),e=!0}}function _1t(t){var e=U1t(t);if(typeof e!="string"&&(Mj.isEncoding===w2e||!w2e(t)))throw new Error("Unknown encoding: "+t);return e||t}B2e.StringDecoder=iv;function iv(t){this.encoding=_1t(t);var e;switch(this.encoding){case"utf16le":this.text=Y1t,this.end=K1t,e=4;break;case"utf8":this.fillLast=j1t,e=4;break;case"base64":this.text=V1t,this.end=J1t,e=3;break;default:this.write=z1t,this.end=X1t;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=Mj.allocUnsafe(e)}iv.prototype.write=function(t){if(t.length===0)return"";var e,r;if(this.lastNeed){if(e=this.fillLast(t),e===void 0)return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r>5===6?2:t>>4===14?3:t>>3===30?4:t>>6===2?-1:-2}function H1t(t,e,r){var o=e.length-1;if(o=0?(a>0&&(t.lastNeed=a-1),a):--o=0?(a>0&&(t.lastNeed=a-2),a):--o=0?(a>0&&(a===2?a=0:t.lastNeed=a-3),a):0))}function q1t(t,e,r){if((e[0]&192)!==128)return t.lastNeed=0,"\uFFFD";if(t.lastNeed>1&&e.length>1){if((e[1]&192)!==128)return t.lastNeed=1,"\uFFFD";if(t.lastNeed>2&&e.length>2&&(e[2]&192)!==128)return t.lastNeed=2,"\uFFFD"}}function j1t(t){var e=this.lastTotal-this.lastNeed,r=q1t(this,t,e);if(r!==void 0)return r;if(this.lastNeed<=t.length)return t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,e,0,t.length),this.lastNeed-=t.length}function G1t(t,e){var r=H1t(this,t,e);if(!this.lastNeed)return t.toString("utf8",e);this.lastTotal=r;var o=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,o),t.toString("utf8",e,o)}function W1t(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+"\uFFFD":e}function Y1t(t,e){if((t.length-e)%2===0){var r=t.toString("utf16le",e);if(r){var o=r.charCodeAt(r.length-1);if(o>=55296&&o<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString("utf16le",e,t.length-1)}function K1t(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,r)}return e}function V1t(t,e){var r=(t.length-e)%3;return r===0?t.toString("base64",e):(this.lastNeed=3-r,this.lastTotal=3,r===1?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString("base64",e,t.length-r))}function J1t(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function z1t(t){return t.toString(this.encoding)}function X1t(t){return t&&t.length?this.write(t):""}});var xk=U((wZt,S2e)=>{"use strict";var v2e=xh().codes.ERR_STREAM_PREMATURE_CLOSE;function Z1t(t){var e=!1;return function(){if(!e){e=!0;for(var r=arguments.length,o=new Array(r),a=0;a{"use strict";var bk;function kh(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var t2t=xk(),Fh=Symbol("lastResolve"),wm=Symbol("lastReject"),sv=Symbol("error"),Qk=Symbol("ended"),Bm=Symbol("lastPromise"),_j=Symbol("handlePromise"),vm=Symbol("stream");function Rh(t,e){return{value:t,done:e}}function r2t(t){var e=t[Fh];if(e!==null){var r=t[vm].read();r!==null&&(t[Bm]=null,t[Fh]=null,t[wm]=null,e(Rh(r,!1)))}}function n2t(t){process.nextTick(r2t,t)}function i2t(t,e){return function(r,o){t.then(function(){if(e[Qk]){r(Rh(void 0,!0));return}e[_j](r,o)},o)}}var s2t=Object.getPrototypeOf(function(){}),o2t=Object.setPrototypeOf((bk={get stream(){return this[vm]},next:function(){var e=this,r=this[sv];if(r!==null)return Promise.reject(r);if(this[Qk])return Promise.resolve(Rh(void 0,!0));if(this[vm].destroyed)return new Promise(function(u,A){process.nextTick(function(){e[sv]?A(e[sv]):u(Rh(void 0,!0))})});var o=this[Bm],a;if(o)a=new Promise(i2t(o,this));else{var n=this[vm].read();if(n!==null)return Promise.resolve(Rh(n,!1));a=new Promise(this[_j])}return this[Bm]=a,a}},kh(bk,Symbol.asyncIterator,function(){return this}),kh(bk,"return",function(){var e=this;return new Promise(function(r,o){e[vm].destroy(null,function(a){if(a){o(a);return}r(Rh(void 0,!0))})})}),bk),s2t),a2t=function(e){var r,o=Object.create(o2t,(r={},kh(r,vm,{value:e,writable:!0}),kh(r,Fh,{value:null,writable:!0}),kh(r,wm,{value:null,writable:!0}),kh(r,sv,{value:null,writable:!0}),kh(r,Qk,{value:e._readableState.endEmitted,writable:!0}),kh(r,_j,{value:function(n,u){var A=o[vm].read();A?(o[Bm]=null,o[Fh]=null,o[wm]=null,n(Rh(A,!1))):(o[Fh]=n,o[wm]=u)},writable:!0}),r));return o[Bm]=null,t2t(e,function(a){if(a&&a.code!=="ERR_STREAM_PREMATURE_CLOSE"){var n=o[wm];n!==null&&(o[Bm]=null,o[Fh]=null,o[wm]=null,n(a)),o[sv]=a;return}var u=o[Fh];u!==null&&(o[Bm]=null,o[Fh]=null,o[wm]=null,u(Rh(void 0,!0))),o[Qk]=!0}),e.on("readable",n2t.bind(null,o)),o};P2e.exports=a2t});var F2e=U((vZt,k2e)=>{"use strict";function b2e(t,e,r,o,a,n,u){try{var A=t[n](u),p=A.value}catch(h){r(h);return}A.done?e(p):Promise.resolve(p).then(o,a)}function l2t(t){return function(){var e=this,r=arguments;return new Promise(function(o,a){var n=t.apply(e,r);function u(p){b2e(n,o,a,u,A,"next",p)}function A(p){b2e(n,o,a,u,A,"throw",p)}u(void 0)})}}function Q2e(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);e&&(o=o.filter(function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable})),r.push.apply(r,o)}return r}function c2t(t){for(var e=1;e{"use strict";q2e.exports=pn;var WE;pn.ReadableState=L2e;var DZt=Ie("events").EventEmitter,N2e=function(e,r){return e.listeners(r).length},av=wj(),kk=Ie("buffer").Buffer,p2t=global.Uint8Array||function(){};function h2t(t){return kk.from(t)}function g2t(t){return kk.isBuffer(t)||t instanceof p2t}var Hj=Ie("util"),zr;Hj&&Hj.debuglog?zr=Hj.debuglog("stream"):zr=function(){};var d2t=t2e(),Vj=Dj(),m2t=Sj(),y2t=m2t.getHighWaterMark,Fk=xh().codes,C2t=Fk.ERR_INVALID_ARG_TYPE,E2t=Fk.ERR_STREAM_PUSH_AFTER_EOF,I2t=Fk.ERR_METHOD_NOT_IMPLEMENTED,w2t=Fk.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,YE,qj,jj;bh()(pn,av);var ov=Vj.errorOrDestroy,Gj=["error","close","destroy","pause","resume"];function B2t(t,e,r){if(typeof t.prependListener=="function")return t.prependListener(e,r);!t._events||!t._events[e]?t.on(e,r):Array.isArray(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]}function L2e(t,e,r){WE=WE||Im(),t=t||{},typeof r!="boolean"&&(r=e instanceof WE),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.readableObjectMode),this.highWaterMark=y2t(this,t,"readableHighWaterMark",r),this.buffer=new d2t,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.destroyed=!1,this.defaultEncoding=t.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(YE||(YE=Uj().StringDecoder),this.decoder=new YE(t.encoding),this.encoding=t.encoding)}function pn(t){if(WE=WE||Im(),!(this instanceof pn))return new pn(t);var e=this instanceof WE;this._readableState=new L2e(t,this,e),this.readable=!0,t&&(typeof t.read=="function"&&(this._read=t.read),typeof t.destroy=="function"&&(this._destroy=t.destroy)),av.call(this)}Object.defineProperty(pn.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(e){!this._readableState||(this._readableState.destroyed=e)}});pn.prototype.destroy=Vj.destroy;pn.prototype._undestroy=Vj.undestroy;pn.prototype._destroy=function(t,e){e(t)};pn.prototype.push=function(t,e){var r=this._readableState,o;return r.objectMode?o=!0:typeof t=="string"&&(e=e||r.defaultEncoding,e!==r.encoding&&(t=kk.from(t,e),e=""),o=!0),O2e(this,t,e,!1,o)};pn.prototype.unshift=function(t){return O2e(this,t,null,!0,!1)};function O2e(t,e,r,o,a){zr("readableAddChunk",e);var n=t._readableState;if(e===null)n.reading=!1,S2t(t,n);else{var u;if(a||(u=v2t(n,e)),u)ov(t,u);else if(n.objectMode||e&&e.length>0)if(typeof e!="string"&&!n.objectMode&&Object.getPrototypeOf(e)!==kk.prototype&&(e=h2t(e)),o)n.endEmitted?ov(t,new w2t):Wj(t,n,e,!0);else if(n.ended)ov(t,new E2t);else{if(n.destroyed)return!1;n.reading=!1,n.decoder&&!r?(e=n.decoder.write(e),n.objectMode||e.length!==0?Wj(t,n,e,!1):Kj(t,n)):Wj(t,n,e,!1)}else o||(n.reading=!1,Kj(t,n))}return!n.ended&&(n.length=R2e?t=R2e:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}function T2e(t,e){return t<=0||e.length===0&&e.ended?0:e.objectMode?1:t!==t?e.flowing&&e.length?e.buffer.head.data.length:e.length:(t>e.highWaterMark&&(e.highWaterMark=D2t(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}pn.prototype.read=function(t){zr("read",t),t=parseInt(t,10);var e=this._readableState,r=t;if(t!==0&&(e.emittedReadable=!1),t===0&&e.needReadable&&((e.highWaterMark!==0?e.length>=e.highWaterMark:e.length>0)||e.ended))return zr("read: emitReadable",e.length,e.ended),e.length===0&&e.ended?Yj(this):Rk(this),null;if(t=T2e(t,e),t===0&&e.ended)return e.length===0&&Yj(this),null;var o=e.needReadable;zr("need readable",o),(e.length===0||e.length-t0?a=_2e(t,e):a=null,a===null?(e.needReadable=e.length<=e.highWaterMark,t=0):(e.length-=t,e.awaitDrain=0),e.length===0&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&Yj(this)),a!==null&&this.emit("data",a),a};function S2t(t,e){if(zr("onEofChunk"),!e.ended){if(e.decoder){var r=e.decoder.end();r&&r.length&&(e.buffer.push(r),e.length+=e.objectMode?1:r.length)}e.ended=!0,e.sync?Rk(t):(e.needReadable=!1,e.emittedReadable||(e.emittedReadable=!0,M2e(t)))}}function Rk(t){var e=t._readableState;zr("emitReadable",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(zr("emitReadable",e.flowing),e.emittedReadable=!0,process.nextTick(M2e,t))}function M2e(t){var e=t._readableState;zr("emitReadable_",e.destroyed,e.length,e.ended),!e.destroyed&&(e.length||e.ended)&&(t.emit("readable"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,Jj(t)}function Kj(t,e){e.readingMore||(e.readingMore=!0,process.nextTick(P2t,t,e))}function P2t(t,e){for(;!e.reading&&!e.ended&&(e.length1&&H2e(o.pipes,t)!==-1)&&!h&&(zr("false write response, pause",o.awaitDrain),o.awaitDrain++),r.pause())}function v(L){zr("onerror",L),R(),t.removeListener("error",v),N2e(t,"error")===0&&ov(t,L)}B2t(t,"error",v);function b(){t.removeListener("finish",C),R()}t.once("close",b);function C(){zr("onfinish"),t.removeListener("close",b),R()}t.once("finish",C);function R(){zr("unpipe"),r.unpipe(t)}return t.emit("pipe",r),o.flowing||(zr("pipe resume"),r.resume()),t};function x2t(t){return function(){var r=t._readableState;zr("pipeOnDrain",r.awaitDrain),r.awaitDrain&&r.awaitDrain--,r.awaitDrain===0&&N2e(t,"data")&&(r.flowing=!0,Jj(t))}}pn.prototype.unpipe=function(t){var e=this._readableState,r={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this,r),this);if(!t){var o=e.pipes,a=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var n=0;n0,o.flowing!==!1&&this.resume()):t==="readable"&&!o.endEmitted&&!o.readableListening&&(o.readableListening=o.needReadable=!0,o.flowing=!1,o.emittedReadable=!1,zr("on readable",o.length,o.reading),o.length?Rk(this):o.reading||process.nextTick(b2t,this)),r};pn.prototype.addListener=pn.prototype.on;pn.prototype.removeListener=function(t,e){var r=av.prototype.removeListener.call(this,t,e);return t==="readable"&&process.nextTick(U2e,this),r};pn.prototype.removeAllListeners=function(t){var e=av.prototype.removeAllListeners.apply(this,arguments);return(t==="readable"||t===void 0)&&process.nextTick(U2e,this),e};function U2e(t){var e=t._readableState;e.readableListening=t.listenerCount("readable")>0,e.resumeScheduled&&!e.paused?e.flowing=!0:t.listenerCount("data")>0&&t.resume()}function b2t(t){zr("readable nexttick read 0"),t.read(0)}pn.prototype.resume=function(){var t=this._readableState;return t.flowing||(zr("resume"),t.flowing=!t.readableListening,Q2t(this,t)),t.paused=!1,this};function Q2t(t,e){e.resumeScheduled||(e.resumeScheduled=!0,process.nextTick(k2t,t,e))}function k2t(t,e){zr("resume",e.reading),e.reading||t.read(0),e.resumeScheduled=!1,t.emit("resume"),Jj(t),e.flowing&&!e.reading&&t.read(0)}pn.prototype.pause=function(){return zr("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1&&(zr("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this};function Jj(t){var e=t._readableState;for(zr("flow",e.flowing);e.flowing&&t.read()!==null;);}pn.prototype.wrap=function(t){var e=this,r=this._readableState,o=!1;t.on("end",function(){if(zr("wrapped end"),r.decoder&&!r.ended){var u=r.decoder.end();u&&u.length&&e.push(u)}e.push(null)}),t.on("data",function(u){if(zr("wrapped data"),r.decoder&&(u=r.decoder.write(u)),!(r.objectMode&&u==null)&&!(!r.objectMode&&(!u||!u.length))){var A=e.push(u);A||(o=!0,t.pause())}});for(var a in t)this[a]===void 0&&typeof t[a]=="function"&&(this[a]=function(A){return function(){return t[A].apply(t,arguments)}}(a));for(var n=0;n=e.length?(e.decoder?r=e.buffer.join(""):e.buffer.length===1?r=e.buffer.first():r=e.buffer.concat(e.length),e.buffer.clear()):r=e.buffer.consume(t,e.decoder),r}function Yj(t){var e=t._readableState;zr("endReadable",e.endEmitted),e.endEmitted||(e.ended=!0,process.nextTick(F2t,e,t))}function F2t(t,e){if(zr("endReadableNT",t.endEmitted,t.length),!t.endEmitted&&t.length===0&&(t.endEmitted=!0,e.readable=!1,e.emit("end"),t.autoDestroy)){var r=e._writableState;(!r||r.autoDestroy&&r.finished)&&e.destroy()}}typeof Symbol=="function"&&(pn.from=function(t,e){return jj===void 0&&(jj=F2e()),jj(pn,t,e)});function H2e(t,e){for(var r=0,o=t.length;r{"use strict";G2e.exports=sp;var Tk=xh().codes,R2t=Tk.ERR_METHOD_NOT_IMPLEMENTED,T2t=Tk.ERR_MULTIPLE_CALLBACK,N2t=Tk.ERR_TRANSFORM_ALREADY_TRANSFORMING,L2t=Tk.ERR_TRANSFORM_WITH_LENGTH_0,Nk=Im();bh()(sp,Nk);function O2t(t,e){var r=this._transformState;r.transforming=!1;var o=r.writecb;if(o===null)return this.emit("error",new T2t);r.writechunk=null,r.writecb=null,e!=null&&this.push(e),o(t);var a=this._readableState;a.reading=!1,(a.needReadable||a.length{"use strict";Y2e.exports=lv;var W2e=zj();bh()(lv,W2e);function lv(t){if(!(this instanceof lv))return new lv(t);W2e.call(this,t)}lv.prototype._transform=function(t,e,r){r(null,t)}});var Z2e=U((bZt,X2e)=>{"use strict";var Xj;function U2t(t){var e=!1;return function(){e||(e=!0,t.apply(void 0,arguments))}}var z2e=xh().codes,_2t=z2e.ERR_MISSING_ARGS,H2t=z2e.ERR_STREAM_DESTROYED;function V2e(t){if(t)throw t}function q2t(t){return t.setHeader&&typeof t.abort=="function"}function j2t(t,e,r,o){o=U2t(o);var a=!1;t.on("close",function(){a=!0}),Xj===void 0&&(Xj=xk()),Xj(t,{readable:e,writable:r},function(u){if(u)return o(u);a=!0,o()});var n=!1;return function(u){if(!a&&!n){if(n=!0,q2t(t))return t.abort();if(typeof t.destroy=="function")return t.destroy();o(u||new H2t("pipe"))}}}function J2e(t){t()}function G2t(t,e){return t.pipe(e)}function W2t(t){return!t.length||typeof t[t.length-1]!="function"?V2e:t.pop()}function Y2t(){for(var t=arguments.length,e=new Array(t),r=0;r0;return j2t(u,p,h,function(E){a||(a=E),E&&n.forEach(J2e),!p&&(n.forEach(J2e),o(a))})});return e.reduce(G2t)}X2e.exports=Y2t});var KE=U((fc,uv)=>{var cv=Ie("stream");process.env.READABLE_STREAM==="disable"&&cv?(uv.exports=cv.Readable,Object.assign(uv.exports,cv),uv.exports.Stream=cv):(fc=uv.exports=Nj(),fc.Stream=cv||fc,fc.Readable=fc,fc.Writable=Fj(),fc.Duplex=Im(),fc.Transform=zj(),fc.PassThrough=K2e(),fc.finished=xk(),fc.pipeline=Z2e())});var tBe=U((QZt,eBe)=>{"use strict";var{Buffer:hu}=Ie("buffer"),$2e=Symbol.for("BufferList");function Zn(t){if(!(this instanceof Zn))return new Zn(t);Zn._init.call(this,t)}Zn._init=function(e){Object.defineProperty(this,$2e,{value:!0}),this._bufs=[],this.length=0,e&&this.append(e)};Zn.prototype._new=function(e){return new Zn(e)};Zn.prototype._offset=function(e){if(e===0)return[0,0];let r=0;for(let o=0;othis.length||e<0)return;let r=this._offset(e);return this._bufs[r[0]][r[1]]};Zn.prototype.slice=function(e,r){return typeof e=="number"&&e<0&&(e+=this.length),typeof r=="number"&&r<0&&(r+=this.length),this.copy(null,0,e,r)};Zn.prototype.copy=function(e,r,o,a){if((typeof o!="number"||o<0)&&(o=0),(typeof a!="number"||a>this.length)&&(a=this.length),o>=this.length||a<=0)return e||hu.alloc(0);let n=!!e,u=this._offset(o),A=a-o,p=A,h=n&&r||0,E=u[1];if(o===0&&a===this.length){if(!n)return this._bufs.length===1?this._bufs[0]:hu.concat(this._bufs,this.length);for(let w=0;wv)this._bufs[w].copy(e,h,E),h+=v;else{this._bufs[w].copy(e,h,E,E+p),h+=v;break}p-=v,E&&(E=0)}return e.length>h?e.slice(0,h):e};Zn.prototype.shallowSlice=function(e,r){if(e=e||0,r=typeof r!="number"?this.length:r,e<0&&(e+=this.length),r<0&&(r+=this.length),e===r)return this._new();let o=this._offset(e),a=this._offset(r),n=this._bufs.slice(o[0],a[0]+1);return a[1]===0?n.pop():n[n.length-1]=n[n.length-1].slice(0,a[1]),o[1]!==0&&(n[0]=n[0].slice(o[1])),this._new(n)};Zn.prototype.toString=function(e,r,o){return this.slice(r,o).toString(e)};Zn.prototype.consume=function(e){if(e=Math.trunc(e),Number.isNaN(e)||e<=0)return this;for(;this._bufs.length;)if(e>=this._bufs[0].length)e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}return this};Zn.prototype.duplicate=function(){let e=this._new();for(let r=0;rthis.length?this.length:e;let o=this._offset(e),a=o[0],n=o[1];for(;a=t.length){let p=u.indexOf(t,n);if(p!==-1)return this._reverseOffset([a,p]);n=u.length-t.length+1}else{let p=this._reverseOffset([a,n]);if(this._match(p,t))return p;n++}n=0}return-1};Zn.prototype._match=function(t,e){if(this.length-t{"use strict";var Zj=KE().Duplex,K2t=bh(),Av=tBe();function Lo(t){if(!(this instanceof Lo))return new Lo(t);if(typeof t=="function"){this._callback=t;let e=function(o){this._callback&&(this._callback(o),this._callback=null)}.bind(this);this.on("pipe",function(o){o.on("error",e)}),this.on("unpipe",function(o){o.removeListener("error",e)}),t=null}Av._init.call(this,t),Zj.call(this)}K2t(Lo,Zj);Object.assign(Lo.prototype,Av.prototype);Lo.prototype._new=function(e){return new Lo(e)};Lo.prototype._write=function(e,r,o){this._appendBuffer(e),typeof o=="function"&&o()};Lo.prototype._read=function(e){if(!this.length)return this.push(null);e=Math.min(e,this.length),this.push(this.slice(0,e)),this.consume(e)};Lo.prototype.end=function(e){Zj.prototype.end.call(this,e),this._callback&&(this._callback(null,this.slice()),this._callback=null)};Lo.prototype._destroy=function(e,r){this._bufs.length=0,this.length=0,r(e)};Lo.prototype._isBufferList=function(e){return e instanceof Lo||e instanceof Av||Lo.isBufferList(e)};Lo.isBufferList=Av.isBufferList;Lk.exports=Lo;Lk.exports.BufferListStream=Lo;Lk.exports.BufferList=Av});var tG=U(JE=>{var V2t=Buffer.alloc,J2t="0000000000000000000",z2t="7777777777777777777",nBe="0".charCodeAt(0),iBe=Buffer.from("ustar\0","binary"),X2t=Buffer.from("00","binary"),Z2t=Buffer.from("ustar ","binary"),$2t=Buffer.from(" \0","binary"),eBt=parseInt("7777",8),fv=257,eG=263,tBt=function(t,e,r){return typeof t!="number"?r:(t=~~t,t>=e?e:t>=0||(t+=e,t>=0)?t:0)},rBt=function(t){switch(t){case 0:return"file";case 1:return"link";case 2:return"symlink";case 3:return"character-device";case 4:return"block-device";case 5:return"directory";case 6:return"fifo";case 7:return"contiguous-file";case 72:return"pax-header";case 55:return"pax-global-header";case 27:return"gnu-long-link-path";case 28:case 30:return"gnu-long-path"}return null},nBt=function(t){switch(t){case"file":return 0;case"link":return 1;case"symlink":return 2;case"character-device":return 3;case"block-device":return 4;case"directory":return 5;case"fifo":return 6;case"contiguous-file":return 7;case"pax-header":return 72}return 0},sBe=function(t,e,r,o){for(;re?z2t.slice(0,e)+" ":J2t.slice(0,e-t.length)+t+" "};function iBt(t){var e;if(t[0]===128)e=!0;else if(t[0]===255)e=!1;else return null;for(var r=[],o=t.length-1;o>0;o--){var a=t[o];e?r.push(a):r.push(255-a)}var n=0,u=r.length;for(o=0;o=Math.pow(10,r)&&r++,e+r+t};JE.decodeLongPath=function(t,e){return VE(t,0,t.length,e)};JE.encodePax=function(t){var e="";t.name&&(e+=$j(" path="+t.name+` +`)),t.linkname&&(e+=$j(" linkpath="+t.linkname+` +`));var r=t.pax;if(r)for(var o in r)e+=$j(" "+o+"="+r[o]+` +`);return Buffer.from(e)};JE.decodePax=function(t){for(var e={};t.length;){for(var r=0;r100;){var a=r.indexOf("/");if(a===-1)return null;o+=o?"/"+r.slice(0,a):r.slice(0,a),r=r.slice(a+1)}return Buffer.byteLength(r)>100||Buffer.byteLength(o)>155||t.linkname&&Buffer.byteLength(t.linkname)>100?null:(e.write(r),e.write(Th(t.mode&eBt,6),100),e.write(Th(t.uid,6),108),e.write(Th(t.gid,6),116),e.write(Th(t.size,11),124),e.write(Th(t.mtime.getTime()/1e3|0,11),136),e[156]=nBe+nBt(t.type),t.linkname&&e.write(t.linkname,157),iBe.copy(e,fv),X2t.copy(e,eG),t.uname&&e.write(t.uname,265),t.gname&&e.write(t.gname,297),e.write(Th(t.devmajor||0,6),329),e.write(Th(t.devminor||0,6),337),o&&e.write(o,345),e.write(Th(oBe(e),6),148),e)};JE.decode=function(t,e,r){var o=t[156]===0?0:t[156]-nBe,a=VE(t,0,100,e),n=Nh(t,100,8),u=Nh(t,108,8),A=Nh(t,116,8),p=Nh(t,124,12),h=Nh(t,136,12),E=rBt(o),w=t[157]===0?null:VE(t,157,100,e),v=VE(t,265,32),b=VE(t,297,32),C=Nh(t,329,8),R=Nh(t,337,8),L=oBe(t);if(L===8*32)return null;if(L!==Nh(t,148,8))throw new Error("Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?");if(iBe.compare(t,fv,fv+6)===0)t[345]&&(a=VE(t,345,155,e)+"/"+a);else if(!(Z2t.compare(t,fv,fv+6)===0&&$2t.compare(t,eG,eG+2)===0)){if(!r)throw new Error("Invalid tar header: unknown format.")}return o===0&&a&&a[a.length-1]==="/"&&(o=5),{name:a,mode:n,uid:u,gid:A,size:p,mtime:new Date(1e3*h),type:E,linkname:w,uname:v,gname:b,devmajor:C,devminor:R}}});var pBe=U((RZt,fBe)=>{var lBe=Ie("util"),sBt=rBe(),pv=tG(),cBe=KE().Writable,uBe=KE().PassThrough,ABe=function(){},aBe=function(t){return t&=511,t&&512-t},oBt=function(t,e){var r=new Ok(t,e);return r.end(),r},aBt=function(t,e){return e.path&&(t.name=e.path),e.linkpath&&(t.linkname=e.linkpath),e.size&&(t.size=parseInt(e.size,10)),t.pax=e,t},Ok=function(t,e){this._parent=t,this.offset=e,uBe.call(this,{autoDestroy:!1})};lBe.inherits(Ok,uBe);Ok.prototype.destroy=function(t){this._parent.destroy(t)};var op=function(t){if(!(this instanceof op))return new op(t);cBe.call(this,t),t=t||{},this._offset=0,this._buffer=sBt(),this._missing=0,this._partial=!1,this._onparse=ABe,this._header=null,this._stream=null,this._overflow=null,this._cb=null,this._locked=!1,this._destroyed=!1,this._pax=null,this._paxGlobal=null,this._gnuLongPath=null,this._gnuLongLinkPath=null;var e=this,r=e._buffer,o=function(){e._continue()},a=function(v){if(e._locked=!1,v)return e.destroy(v);e._stream||o()},n=function(){e._stream=null;var v=aBe(e._header.size);v?e._parse(v,u):e._parse(512,w),e._locked||o()},u=function(){e._buffer.consume(aBe(e._header.size)),e._parse(512,w),o()},A=function(){var v=e._header.size;e._paxGlobal=pv.decodePax(r.slice(0,v)),r.consume(v),n()},p=function(){var v=e._header.size;e._pax=pv.decodePax(r.slice(0,v)),e._paxGlobal&&(e._pax=Object.assign({},e._paxGlobal,e._pax)),r.consume(v),n()},h=function(){var v=e._header.size;this._gnuLongPath=pv.decodeLongPath(r.slice(0,v),t.filenameEncoding),r.consume(v),n()},E=function(){var v=e._header.size;this._gnuLongLinkPath=pv.decodeLongPath(r.slice(0,v),t.filenameEncoding),r.consume(v),n()},w=function(){var v=e._offset,b;try{b=e._header=pv.decode(r.slice(0,512),t.filenameEncoding,t.allowUnknownFormat)}catch(C){e.emit("error",C)}if(r.consume(512),!b){e._parse(512,w),o();return}if(b.type==="gnu-long-path"){e._parse(b.size,h),o();return}if(b.type==="gnu-long-link-path"){e._parse(b.size,E),o();return}if(b.type==="pax-global-header"){e._parse(b.size,A),o();return}if(b.type==="pax-header"){e._parse(b.size,p),o();return}if(e._gnuLongPath&&(b.name=e._gnuLongPath,e._gnuLongPath=null),e._gnuLongLinkPath&&(b.linkname=e._gnuLongLinkPath,e._gnuLongLinkPath=null),e._pax&&(e._header=b=aBt(b,e._pax),e._pax=null),e._locked=!0,!b.size||b.type==="directory"){e._parse(512,w),e.emit("entry",b,oBt(e,v),a);return}e._stream=new Ok(e,v),e.emit("entry",b,e._stream,a),e._parse(b.size,n),o()};this._onheader=w,this._parse(512,w)};lBe.inherits(op,cBe);op.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.emit("close"))};op.prototype._parse=function(t,e){this._destroyed||(this._offset+=t,this._missing=t,e===this._onheader&&(this._partial=!1),this._onparse=e)};op.prototype._continue=function(){if(!this._destroyed){var t=this._cb;this._cb=ABe,this._overflow?this._write(this._overflow,void 0,t):t()}};op.prototype._write=function(t,e,r){if(!this._destroyed){var o=this._stream,a=this._buffer,n=this._missing;if(t.length&&(this._partial=!0),t.lengthn&&(u=t.slice(n),t=t.slice(0,n)),o?o.end(t):a.append(t),this._overflow=u,this._onparse()}};op.prototype._final=function(t){if(this._partial)return this.destroy(new Error("Unexpected end of data"));t()};fBe.exports=op});var gBe=U((TZt,hBe)=>{hBe.exports=Ie("fs").constants||Ie("constants")});var EBe=U((NZt,CBe)=>{var zE=gBe(),dBe=WM(),Uk=bh(),lBt=Buffer.alloc,mBe=KE().Readable,XE=KE().Writable,cBt=Ie("string_decoder").StringDecoder,Mk=tG(),uBt=parseInt("755",8),ABt=parseInt("644",8),yBe=lBt(1024),nG=function(){},rG=function(t,e){e&=511,e&&t.push(yBe.slice(0,512-e))};function fBt(t){switch(t&zE.S_IFMT){case zE.S_IFBLK:return"block-device";case zE.S_IFCHR:return"character-device";case zE.S_IFDIR:return"directory";case zE.S_IFIFO:return"fifo";case zE.S_IFLNK:return"symlink"}return"file"}var _k=function(t){XE.call(this),this.written=0,this._to=t,this._destroyed=!1};Uk(_k,XE);_k.prototype._write=function(t,e,r){if(this.written+=t.length,this._to.push(t))return r();this._to._drain=r};_k.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var Hk=function(){XE.call(this),this.linkname="",this._decoder=new cBt("utf-8"),this._destroyed=!1};Uk(Hk,XE);Hk.prototype._write=function(t,e,r){this.linkname+=this._decoder.write(t),r()};Hk.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var hv=function(){XE.call(this),this._destroyed=!1};Uk(hv,XE);hv.prototype._write=function(t,e,r){r(new Error("No body allowed for this entry"))};hv.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var wA=function(t){if(!(this instanceof wA))return new wA(t);mBe.call(this,t),this._drain=nG,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};Uk(wA,mBe);wA.prototype.entry=function(t,e,r){if(this._stream)throw new Error("already piping an entry");if(!(this._finalized||this._destroyed)){typeof e=="function"&&(r=e,e=null),r||(r=nG);var o=this;if((!t.size||t.type==="symlink")&&(t.size=0),t.type||(t.type=fBt(t.mode)),t.mode||(t.mode=t.type==="directory"?uBt:ABt),t.uid||(t.uid=0),t.gid||(t.gid=0),t.mtime||(t.mtime=new Date),typeof e=="string"&&(e=Buffer.from(e)),Buffer.isBuffer(e)){t.size=e.length,this._encode(t);var a=this.push(e);return rG(o,t.size),a?process.nextTick(r):this._drain=r,new hv}if(t.type==="symlink"&&!t.linkname){var n=new Hk;return dBe(n,function(A){if(A)return o.destroy(),r(A);t.linkname=n.linkname,o._encode(t),r()}),n}if(this._encode(t),t.type!=="file"&&t.type!=="contiguous-file")return process.nextTick(r),new hv;var u=new _k(this);return this._stream=u,dBe(u,function(A){if(o._stream=null,A)return o.destroy(),r(A);if(u.written!==t.size)return o.destroy(),r(new Error("size mismatch"));rG(o,t.size),o._finalizing&&o.finalize(),r()}),u}};wA.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push(yBe),this.push(null))};wA.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.destroy&&this._stream.destroy())};wA.prototype._encode=function(t){if(!t.pax){var e=Mk.encode(t);if(e){this.push(e);return}}this._encodePax(t)};wA.prototype._encodePax=function(t){var e=Mk.encodePax({name:t.name,linkname:t.linkname,pax:t.pax}),r={name:"PaxHeader",mode:t.mode,uid:t.uid,gid:t.gid,size:e.length,mtime:t.mtime,type:"pax-header",linkname:t.linkname&&"PaxHeader",uname:t.uname,gname:t.gname,devmajor:t.devmajor,devminor:t.devminor};this.push(Mk.encode(r)),this.push(e),rG(this,e.length),r.size=t.size,r.type=t.type,this.push(Mk.encode(r))};wA.prototype._read=function(t){var e=this._drain;this._drain=nG,e()};CBe.exports=wA});var IBe=U(iG=>{iG.extract=pBe();iG.pack=EBe()});var RBe=U((r$t,FBe)=>{"use strict";var Dm=class{constructor(e,r,o){this.__specs=e||{},Object.keys(this.__specs).forEach(a=>{if(typeof this.__specs[a]=="string"){let n=this.__specs[a],u=this.__specs[n];if(u){let A=u.aliases||[];A.push(a,n),u.aliases=[...new Set(A)],this.__specs[a]=u}else throw new Error(`Alias refers to invalid key: ${n} -> ${a}`)}}),this.__opts=r||{},this.__providers=QBe(o.filter(a=>a!=null&&typeof a=="object")),this.__isFiggyPudding=!0}get(e){return uG(this,e,!0)}get[Symbol.toStringTag](){return"FiggyPudding"}forEach(e,r=this){for(let[o,a]of this.entries())e.call(r,a,o,this)}toJSON(){let e={};return this.forEach((r,o)=>{e[o]=r}),e}*entries(e){for(let o of Object.keys(this.__specs))yield[o,this.get(o)];let r=e||this.__opts.other;if(r){let o=new Set;for(let a of this.__providers){let n=a.entries?a.entries(r):PBt(a);for(let[u,A]of n)r(u)&&!o.has(u)&&(o.add(u),yield[u,A])}}}*[Symbol.iterator](){for(let[e,r]of this.entries())yield[e,r]}*keys(){for(let[e]of this.entries())yield e}*values(){for(let[,e]of this.entries())yield e}concat(...e){return new Proxy(new Dm(this.__specs,this.__opts,QBe(this.__providers).concat(e)),kBe)}};try{let t=Ie("util");Dm.prototype[t.inspect.custom]=function(e,r){return this[Symbol.toStringTag]+" "+t.inspect(this.toJSON(),r)}}catch{}function DBt(t){throw Object.assign(new Error(`invalid config key requested: ${t}`),{code:"EBADKEY"})}function uG(t,e,r){let o=t.__specs[e];if(r&&!o&&(!t.__opts.other||!t.__opts.other(e)))DBt(e);else{o||(o={});let a;for(let n of t.__providers){if(a=bBe(e,n),a===void 0&&o.aliases&&o.aliases.length){for(let u of o.aliases)if(u!==e&&(a=bBe(u,n),a!==void 0))break}if(a!==void 0)break}return a===void 0&&o.default!==void 0?typeof o.default=="function"?o.default(t):o.default:a}}function bBe(t,e){let r;return e.__isFiggyPudding?r=uG(e,t,!1):typeof e.get=="function"?r=e.get(t):r=e[t],r}var kBe={has(t,e){return e in t.__specs&&uG(t,e,!1)!==void 0},ownKeys(t){return Object.keys(t.__specs)},get(t,e){return typeof e=="symbol"||e.slice(0,2)==="__"||e in Dm.prototype?t[e]:t.get(e)},set(t,e,r){if(typeof e=="symbol"||e.slice(0,2)==="__")return t[e]=r,!0;throw new Error("figgyPudding options cannot be modified. Use .concat() instead.")},deleteProperty(){throw new Error("figgyPudding options cannot be deleted. Use .concat() and shadow them instead.")}};FBe.exports=SBt;function SBt(t,e){function r(...o){return new Proxy(new Dm(t,e,o),kBe)}return r}function QBe(t){let e=[];return t.forEach(r=>e.unshift(r)),e}function PBt(t){return Object.keys(t).map(e=>[e,t[e]])}});var LBe=U((n$t,DA)=>{"use strict";var dv=Ie("crypto"),xBt=RBe(),bBt=Ie("stream").Transform,TBe=["sha256","sha384","sha512"],QBt=/^[a-z0-9+/]+(?:=?=?)$/i,kBt=/^([^-]+)-([^?]+)([?\S*]*)$/,FBt=/^([^-]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)*$/,RBt=/^[\x21-\x7E]+$/,ta=xBt({algorithms:{default:["sha512"]},error:{default:!1},integrity:{},options:{default:[]},pickAlgorithm:{default:()=>HBt},Promise:{default:()=>Promise},sep:{default:" "},single:{default:!1},size:{},strict:{default:!1}}),Oh=class{get isHash(){return!0}constructor(e,r){r=ta(r);let o=!!r.strict;this.source=e.trim();let a=this.source.match(o?FBt:kBt);if(!a||o&&!TBe.some(u=>u===a[1]))return;this.algorithm=a[1],this.digest=a[2];let n=a[3];this.options=n?n.slice(1).split("?"):[]}hexDigest(){return this.digest&&Buffer.from(this.digest,"base64").toString("hex")}toJSON(){return this.toString()}toString(e){if(e=ta(e),e.strict&&!(TBe.some(o=>o===this.algorithm)&&this.digest.match(QBt)&&(this.options||[]).every(o=>o.match(RBt))))return"";let r=this.options&&this.options.length?`?${this.options.join("?")}`:"";return`${this.algorithm}-${this.digest}${r}`}},Sm=class{get isIntegrity(){return!0}toJSON(){return this.toString()}toString(e){e=ta(e);let r=e.sep||" ";return e.strict&&(r=r.replace(/\S+/g," ")),Object.keys(this).map(o=>this[o].map(a=>Oh.prototype.toString.call(a,e)).filter(a=>a.length).join(r)).filter(o=>o.length).join(r)}concat(e,r){r=ta(r);let o=typeof e=="string"?e:gv(e,r);return vA(`${this.toString(r)} ${o}`,r)}hexDigest(){return vA(this,{single:!0}).hexDigest()}match(e,r){r=ta(r);let o=vA(e,r),a=o.pickAlgorithm(r);return this[a]&&o[a]&&this[a].find(n=>o[a].find(u=>n.digest===u.digest))||!1}pickAlgorithm(e){e=ta(e);let r=e.pickAlgorithm,o=Object.keys(this);if(!o.length)throw new Error(`No algorithms available for ${JSON.stringify(this.toString())}`);return o.reduce((a,n)=>r(a,n)||a)}};DA.exports.parse=vA;function vA(t,e){if(e=ta(e),typeof t=="string")return AG(t,e);if(t.algorithm&&t.digest){let r=new Sm;return r[t.algorithm]=[t],AG(gv(r,e),e)}else return AG(gv(t,e),e)}function AG(t,e){return e.single?new Oh(t,e):t.trim().split(/\s+/).reduce((r,o)=>{let a=new Oh(o,e);if(a.algorithm&&a.digest){let n=a.algorithm;r[n]||(r[n]=[]),r[n].push(a)}return r},new Sm)}DA.exports.stringify=gv;function gv(t,e){return e=ta(e),t.algorithm&&t.digest?Oh.prototype.toString.call(t,e):typeof t=="string"?gv(vA(t,e),e):Sm.prototype.toString.call(t,e)}DA.exports.fromHex=TBt;function TBt(t,e,r){r=ta(r);let o=r.options&&r.options.length?`?${r.options.join("?")}`:"";return vA(`${e}-${Buffer.from(t,"hex").toString("base64")}${o}`,r)}DA.exports.fromData=NBt;function NBt(t,e){e=ta(e);let r=e.algorithms,o=e.options&&e.options.length?`?${e.options.join("?")}`:"";return r.reduce((a,n)=>{let u=dv.createHash(n).update(t).digest("base64"),A=new Oh(`${n}-${u}${o}`,e);if(A.algorithm&&A.digest){let p=A.algorithm;a[p]||(a[p]=[]),a[p].push(A)}return a},new Sm)}DA.exports.fromStream=LBt;function LBt(t,e){e=ta(e);let r=e.Promise||Promise,o=fG(e);return new r((a,n)=>{t.pipe(o),t.on("error",n),o.on("error",n);let u;o.on("integrity",A=>{u=A}),o.on("end",()=>a(u)),o.on("data",()=>{})})}DA.exports.checkData=OBt;function OBt(t,e,r){if(r=ta(r),e=vA(e,r),!Object.keys(e).length){if(r.error)throw Object.assign(new Error("No valid integrity hashes to check against"),{code:"EINTEGRITY"});return!1}let o=e.pickAlgorithm(r),a=dv.createHash(o).update(t).digest("base64"),n=vA({algorithm:o,digest:a}),u=n.match(e,r);if(u||!r.error)return u;if(typeof r.size=="number"&&t.length!==r.size){let A=new Error(`data size mismatch when checking ${e}. + Wanted: ${r.size} + Found: ${t.length}`);throw A.code="EBADSIZE",A.found=t.length,A.expected=r.size,A.sri=e,A}else{let A=new Error(`Integrity checksum failed when using ${o}: Wanted ${e}, but got ${n}. (${t.length} bytes)`);throw A.code="EINTEGRITY",A.found=n,A.expected=e,A.algorithm=o,A.sri=e,A}}DA.exports.checkStream=MBt;function MBt(t,e,r){r=ta(r);let o=r.Promise||Promise,a=fG(r.concat({integrity:e}));return new o((n,u)=>{t.pipe(a),t.on("error",u),a.on("error",u);let A;a.on("verified",p=>{A=p}),a.on("end",()=>n(A)),a.on("data",()=>{})})}DA.exports.integrityStream=fG;function fG(t){t=ta(t);let e=t.integrity&&vA(t.integrity,t),r=e&&Object.keys(e).length,o=r&&e.pickAlgorithm(t),a=r&&e[o],n=Array.from(new Set(t.algorithms.concat(o?[o]:[]))),u=n.map(dv.createHash),A=0,p=new bBt({transform(h,E,w){A+=h.length,u.forEach(v=>v.update(h,E)),w(null,h,E)}}).on("end",()=>{let h=t.options&&t.options.length?`?${t.options.join("?")}`:"",E=vA(u.map((v,b)=>`${n[b]}-${v.digest("base64")}${h}`).join(" "),t),w=r&&E.match(e,t);if(typeof t.size=="number"&&A!==t.size){let v=new Error(`stream size mismatch when checking ${e}. + Wanted: ${t.size} + Found: ${A}`);v.code="EBADSIZE",v.found=A,v.expected=t.size,v.sri=e,p.emit("error",v)}else if(t.integrity&&!w){let v=new Error(`${e} integrity checksum failed when using ${o}: wanted ${a} but got ${E}. (${A} bytes)`);v.code="EINTEGRITY",v.found=E,v.expected=a,v.algorithm=o,v.sri=e,p.emit("error",v)}else p.emit("size",A),p.emit("integrity",E),w&&p.emit("verified",w)});return p}DA.exports.create=UBt;function UBt(t){t=ta(t);let e=t.algorithms,r=t.options.length?`?${t.options.join("?")}`:"",o=e.map(dv.createHash);return{update:function(a,n){return o.forEach(u=>u.update(a,n)),this},digest:function(a){return e.reduce((u,A)=>{let p=o.shift().digest("base64"),h=new Oh(`${A}-${p}${r}`,t);if(h.algorithm&&h.digest){let E=h.algorithm;u[E]||(u[E]=[]),u[E].push(h)}return u},new Sm)}}}var _Bt=new Set(dv.getHashes()),NBe=["md5","whirlpool","sha1","sha224","sha256","sha384","sha512","sha3","sha3-256","sha3-384","sha3-512","sha3_256","sha3_384","sha3_512"].filter(t=>_Bt.has(t));function HBt(t,e){return NBe.indexOf(t.toLowerCase())>=NBe.indexOf(e.toLowerCase())?t:e}});var hve=U((tnr,pve)=>{var jvt=rL();function Gvt(t){return jvt(t)?void 0:t}pve.exports=Gvt});var dve=U((rnr,gve)=>{var Wvt=Fx(),Yvt=P8(),Kvt=k8(),Vvt=Wd(),Jvt=gd(),zvt=hve(),Xvt=I_(),Zvt=S8(),$vt=1,eDt=2,tDt=4,rDt=Xvt(function(t,e){var r={};if(t==null)return r;var o=!1;e=Wvt(e,function(n){return n=Vvt(n,t),o||(o=n.length>1),n}),Jvt(t,Zvt(t),r),o&&(r=Yvt(r,$vt|eDt|tDt,zvt));for(var a=e.length;a--;)Kvt(r,e[a]);return r});gve.exports=rDt});Ke();Ke();bt();var x_=Ie("child_process"),E0e=tt(Xg());_t();var b_=Ie("fs");var lE=new Map([]);function Xut(t){let e=ue.fromPortablePath(t);process.on("SIGINT",()=>{}),e?(0,x_.execFileSync)(process.execPath,[e,...process.argv.slice(2)],{stdio:"inherit",env:{...process.env,YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"}}):(0,x_.execFileSync)(e,process.argv.slice(2),{stdio:"inherit",env:{...process.env,YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"}})}async function Vb({binaryVersion:t,pluginConfiguration:e}){async function r(){let a=new vo({binaryLabel:"Yarn Package Manager",binaryName:"yarn",binaryVersion:t});try{await o(a)}catch(n){process.stdout.write(a.error(n)),process.exitCode=1}}async function o(a){var R,L,_,V;let n=process.versions.node,u=">=14.15.0";if(!Ye.parseOptionalBoolean(process.env.YARN_IGNORE_NODE)&&!Tr.satisfiesWithPrereleases(n,u))throw new ot(`This tool requires a Node version compatible with ${u} (got ${n}). Upgrade Node, or set \`YARN_IGNORE_NODE=1\` in your environment.`);let p=await Xe.find(ue.toPortablePath(process.cwd()),e,{usePath:!0,strict:!1}),h=p.get("yarnPath"),E=p.get("ignorePath"),w=p.get("ignoreCwd"),v=ue.toPortablePath(ue.resolve(process.argv[1])),b=re=>ae.readFilePromise(re).catch(()=>Buffer.of());if(!E&&!w&&await(async()=>h&&(h===v||Buffer.compare(...await Promise.all([b(h),b(v)]))===0))()){process.env.YARN_IGNORE_PATH="1",process.env.YARN_IGNORE_CWD="1",await o(a);return}else if(h!==null&&!E)if(!ae.existsSync(h))process.stdout.write(a.error(new Error(`The "yarn-path" option has been set (in ${p.sources.get("yarnPath")}), but the specified location doesn't exist (${h}).`))),process.exitCode=1;else try{Xut(h)}catch(re){process.exitCode=re.code||1}else{E&&delete process.env.YARN_IGNORE_PATH,p.get("enableTelemetry")&&!E0e.isCI&&process.stdout.isTTY&&(Xe.telemetry=new aE(p,"puba9cdc10ec5790a2cf4969dd413a47270")),(R=Xe.telemetry)==null||R.reportVersion(t);for(let[ve,ge]of p.plugins.entries()){lE.has(((L=ve.match(/^@yarnpkg\/plugin-(.*)$/))==null?void 0:L[1])??"")&&((_=Xe.telemetry)==null||_.reportPluginName(ve));for(let le of ge.commands||[])a.register(le)}let oe={cwd:ue.toPortablePath(process.cwd()),plugins:e,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr},pe=a.process(process.argv.slice(2),oe);pe.help||(V=Xe.telemetry)==null||V.reportCommandName(pe.path.join(" "));let he=pe.cwd;if(typeof he<"u"&&!w){let ve=(0,b_.realpathSync)(process.cwd()),ge=(0,b_.realpathSync)(he);if(ve!==ge){process.chdir(he),await r();return}}await a.runExit(pe,oe)}}return r().catch(a=>{process.stdout.write(a.stack||a.message),process.exitCode=1}).finally(()=>ae.rmtempPromise())}var W1={};Yt(W1,{BaseCommand:()=>ct,WorkspaceRequiredError:()=>er,getDynamicLibs:()=>I0e,getPluginConfiguration:()=>Jb,main:()=>Vb,openWorkspace:()=>cE,pluginCommands:()=>lE});_t();var ct=class extends it{constructor(){super(...arguments);this.cwd=fe.String("--cwd",{hidden:!0})}};Ke();bt();_t();var er=class extends ot{constructor(e,r){let o=z.relative(e,r),a=z.join(e,Nt.fileName);super(`This command can only be run from within a workspace of your project (${o} isn't a workspace of ${a}).`)}};Ke();bt();_c();_l();C1();_t();var Zut=tt(si());tl();var I0e=()=>new Map([["@yarnpkg/cli",W1],["@yarnpkg/core",G1],["@yarnpkg/fslib",MI],["@yarnpkg/libzip",_I],["@yarnpkg/parsers",VI],["@yarnpkg/shell",B1],["clipanion",nw],["semver",Zut],["typanion",Wo]]);Ke();async function cE(t,e){let{project:r,workspace:o}=await St.find(t,e);if(!o)throw new er(r.cwd,e);return o}Ke();bt();_c();_l();C1();_t();var ADt=tt(si());tl();var Z8={};Yt(Z8,{AddCommand:()=>P0,BinCommand:()=>x0,CacheCleanCommand:()=>b0,ClipanionCommand:()=>Jd,ConfigCommand:()=>R0,ConfigGetCommand:()=>Q0,ConfigSetCommand:()=>k0,ConfigUnsetCommand:()=>F0,DedupeCommand:()=>T0,EntryCommand:()=>pE,ExecCommand:()=>N0,ExplainCommand:()=>M0,ExplainPeerRequirementsCommand:()=>L0,HelpCommand:()=>zd,InfoCommand:()=>U0,LinkCommand:()=>H0,NodeCommand:()=>q0,PluginCheckCommand:()=>j0,PluginImportCommand:()=>Y0,PluginImportSourcesCommand:()=>K0,PluginListCommand:()=>G0,PluginRemoveCommand:()=>V0,PluginRuntimeCommand:()=>J0,RebuildCommand:()=>z0,RemoveCommand:()=>X0,RunCommand:()=>Z0,RunIndexCommand:()=>$d,SetResolutionCommand:()=>$0,SetVersionCommand:()=>O0,SetVersionSourcesCommand:()=>W0,UnlinkCommand:()=>eh,UpCommand:()=>Vf,VersionCommand:()=>Xd,WhyCommand:()=>th,WorkspaceCommand:()=>ih,WorkspacesListCommand:()=>nh,YarnCommand:()=>_0,dedupeUtils:()=>iQ,default:()=>Hht,suggestUtils:()=>eu});var $de=tt(Xg());Ke();Ke();Ke();_t();var lge=tt(z1());tl();var eu={};Yt(eu,{Modifier:()=>I8,Strategy:()=>rQ,Target:()=>X1,WorkspaceModifier:()=>nge,applyModifier:()=>yft,extractDescriptorFromPath:()=>w8,extractRangeModifier:()=>ige,fetchDescriptorFrom:()=>B8,findProjectDescriptors:()=>age,getModifier:()=>Z1,getSuggestedDescriptors:()=>$1,makeWorkspaceDescriptor:()=>oge,toWorkspaceModifier:()=>sge});Ke();Ke();bt();var E8=tt(si()),dft="workspace:",X1=(o=>(o.REGULAR="dependencies",o.DEVELOPMENT="devDependencies",o.PEER="peerDependencies",o))(X1||{}),I8=(o=>(o.CARET="^",o.TILDE="~",o.EXACT="",o))(I8||{}),nge=(o=>(o.CARET="^",o.TILDE="~",o.EXACT="*",o))(nge||{}),rQ=(n=>(n.KEEP="keep",n.REUSE="reuse",n.PROJECT="project",n.LATEST="latest",n.CACHE="cache",n))(rQ||{});function Z1(t,e){return t.exact?"":t.caret?"^":t.tilde?"~":e.configuration.get("defaultSemverRangePrefix")}var mft=/^([\^~]?)[0-9]+(?:\.[0-9]+){0,2}(?:-\S+)?$/;function ige(t,{project:e}){let r=t.match(mft);return r?r[1]:e.configuration.get("defaultSemverRangePrefix")}function yft(t,e){let{protocol:r,source:o,params:a,selector:n}=Y.parseRange(t.range);return E8.default.valid(n)&&(n=`${e}${t.range}`),Y.makeDescriptor(t,Y.makeRange({protocol:r,source:o,params:a,selector:n}))}function sge(t){switch(t){case"^":return"^";case"~":return"~";case"":return"*";default:throw new Error(`Assertion failed: Unknown modifier: "${t}"`)}}function oge(t,e){return Y.makeDescriptor(t.anchoredDescriptor,`${dft}${sge(e)}`)}async function age(t,{project:e,target:r}){let o=new Map,a=n=>{let u=o.get(n.descriptorHash);return u||o.set(n.descriptorHash,u={descriptor:n,locators:[]}),u};for(let n of e.workspaces)if(r==="peerDependencies"){let u=n.manifest.peerDependencies.get(t.identHash);u!==void 0&&a(u).locators.push(n.anchoredLocator)}else{let u=n.manifest.dependencies.get(t.identHash),A=n.manifest.devDependencies.get(t.identHash);r==="devDependencies"?A!==void 0?a(A).locators.push(n.anchoredLocator):u!==void 0&&a(u).locators.push(n.anchoredLocator):u!==void 0?a(u).locators.push(n.anchoredLocator):A!==void 0&&a(A).locators.push(n.anchoredLocator)}return o}async function w8(t,{cwd:e,workspace:r}){return await Cft(async o=>{z.isAbsolute(t)||(t=z.relative(r.cwd,z.resolve(e,t)),t.match(/^\.{0,2}\//)||(t=`./${t}`));let{project:a}=r,n=await B8(Y.makeIdent(null,"archive"),t,{project:r.project,cache:o,workspace:r});if(!n)throw new Error("Assertion failed: The descriptor should have been found");let u=new xi,A=a.configuration.makeResolver(),p=a.configuration.makeFetcher(),h={checksums:a.storedChecksums,project:a,cache:o,fetcher:p,report:u,resolver:A},E=A.bindDescriptor(n,r.anchoredLocator,h),w=Y.convertDescriptorToLocator(E),v=await p.fetch(w,h),b=await Nt.find(v.prefixPath,{baseFs:v.packageFs});if(!b.name)throw new Error("Target path doesn't have a name");return Y.makeDescriptor(b.name,t)})}async function $1(t,{project:e,workspace:r,cache:o,target:a,fixed:n,modifier:u,strategies:A,maxResults:p=1/0}){if(!(p>=0))throw new Error(`Invalid maxResults (${p})`);let[h,E]=t.range!=="unknown"?n||Tr.validRange(t.range)||!t.range.match(/^[a-z0-9._-]+$/i)?[t.range,"latest"]:["unknown",t.range]:["unknown","latest"];if(h!=="unknown")return{suggestions:[{descriptor:t,name:`Use ${Y.prettyDescriptor(e.configuration,t)}`,reason:"(unambiguous explicit request)"}],rejections:[]};let w=typeof r<"u"&&r!==null&&r.manifest[a].get(t.identHash)||null,v=[],b=[],C=async R=>{try{await R()}catch(L){b.push(L)}};for(let R of A){if(v.length>=p)break;switch(R){case"keep":await C(async()=>{w&&v.push({descriptor:w,name:`Keep ${Y.prettyDescriptor(e.configuration,w)}`,reason:"(no changes)"})});break;case"reuse":await C(async()=>{for(let{descriptor:L,locators:_}of(await age(t,{project:e,target:a})).values()){if(_.length===1&&_[0].locatorHash===r.anchoredLocator.locatorHash&&A.includes("keep"))continue;let V=`(originally used by ${Y.prettyLocator(e.configuration,_[0])}`;V+=_.length>1?` and ${_.length-1} other${_.length>2?"s":""})`:")",v.push({descriptor:L,name:`Reuse ${Y.prettyDescriptor(e.configuration,L)}`,reason:V})}});break;case"cache":await C(async()=>{for(let L of e.storedDescriptors.values())L.identHash===t.identHash&&v.push({descriptor:L,name:`Reuse ${Y.prettyDescriptor(e.configuration,L)}`,reason:"(already used somewhere in the lockfile)"})});break;case"project":await C(async()=>{if(r.manifest.name!==null&&t.identHash===r.manifest.name.identHash)return;let L=e.tryWorkspaceByIdent(t);if(L===null)return;let _=oge(L,u);v.push({descriptor:_,name:`Attach ${Y.prettyDescriptor(e.configuration,_)}`,reason:`(local workspace at ${ye.pretty(e.configuration,L.relativeCwd,ye.Type.PATH)})`})});break;case"latest":await C(async()=>{if(a==="peerDependencies")v.push({descriptor:Y.makeDescriptor(t,"*"),name:"Use *",reason:"(catch-all peer dependency pattern)"});else if(!e.configuration.get("enableNetwork"))v.push({descriptor:null,name:"Resolve from latest",reason:ye.pretty(e.configuration,"(unavailable because enableNetwork is toggled off)","grey")});else{let L=await B8(t,E,{project:e,cache:o,workspace:r,modifier:u});L&&v.push({descriptor:L,name:`Use ${Y.prettyDescriptor(e.configuration,L)}`,reason:"(resolved from latest)"})}});break}}return{suggestions:v.slice(0,p),rejections:b.slice(0,p)}}async function B8(t,e,{project:r,cache:o,workspace:a,preserveModifier:n=!0,modifier:u}){let A=r.configuration.normalizeDependency(Y.makeDescriptor(t,e)),p=new xi,h=r.configuration.makeFetcher(),E=r.configuration.makeResolver(),w={project:r,fetcher:h,cache:o,checksums:r.storedChecksums,report:p,cacheOptions:{skipIntegrityCheck:!0}},v={...w,resolver:E,fetchOptions:w},b=E.bindDescriptor(A,a.anchoredLocator,v),C=await E.getCandidates(b,{},v);if(C.length===0)return null;let R=C[0],{protocol:L,source:_,params:V,selector:re}=Y.parseRange(Y.convertToManifestRange(R.reference));if(L===r.configuration.get("defaultProtocol")&&(L=null),E8.default.valid(re)){let oe=re;if(typeof u<"u")re=u+re;else if(n!==!1){let ve=typeof n=="string"?n:A.range;re=ige(ve,{project:r})+re}let pe=Y.makeDescriptor(R,Y.makeRange({protocol:L,source:_,params:V,selector:re}));(await E.getCandidates(r.configuration.normalizeDependency(pe),{},v)).length!==1&&(re=oe)}return Y.makeDescriptor(R,Y.makeRange({protocol:L,source:_,params:V,selector:re}))}async function Cft(t){return await ae.mktempPromise(async e=>{let r=Xe.create(e);return r.useWithSource(e,{enableMirror:!1,compressionLevel:0},e,{overwrite:!0}),await t(new Ur(e,{configuration:r,check:!1,immutable:!1}))})}var P0=class extends ct{constructor(){super(...arguments);this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.fixed=fe.Boolean("-F,--fixed",!1,{description:"Store dependency tags as-is instead of resolving them"});this.exact=fe.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=fe.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=fe.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.dev=fe.Boolean("-D,--dev",!1,{description:"Add a package as a dev dependency"});this.peer=fe.Boolean("-P,--peer",!1,{description:"Add a package as a peer dependency"});this.optional=fe.Boolean("-O,--optional",!1,{description:"Add / upgrade a package to an optional regular / peer dependency"});this.preferDev=fe.Boolean("--prefer-dev",!1,{description:"Add / upgrade a package to a dev dependency"});this.interactive=fe.Boolean("-i,--interactive",{description:"Reuse the specified package from other workspaces in the project"});this.cached=fe.Boolean("--cached",!1,{description:"Reuse the highest version already used somewhere within the project"});this.mode=fe.String("--mode",{description:"Change what artifacts installs generate",validator:Gs(gl)});this.silent=fe.Boolean("--silent",{hidden:!0});this.packages=fe.Rest()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Ur.find(r);if(!a)throw new er(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=this.fixed,A=this.interactive??r.get("preferInteractive"),p=A||r.get("preferReuse"),h=Z1(this,o),E=[p?"reuse":void 0,"project",this.cached?"cache":void 0,"latest"].filter(V=>typeof V<"u"),w=A?1/0:1,v=await Promise.all(this.packages.map(async V=>{let re=V.match(/^\.{0,2}\//)?await w8(V,{cwd:this.context.cwd,workspace:a}):Y.tryParseDescriptor(V),oe=V.match(/^(https?:|git@github)/);if(oe)throw new ot(`It seems you are trying to add a package using a ${ye.pretty(r,`${oe[0]}...`,ye.Type.RANGE)} url; we now require package names to be explicitly specified. +Try running the command again with the package name prefixed: ${ye.pretty(r,"yarn add",ye.Type.CODE)} ${ye.pretty(r,Y.makeDescriptor(Y.makeIdent(null,"my-package"),`${oe[0]}...`),ye.Type.DESCRIPTOR)}`);if(!re)throw new ot(`The ${ye.pretty(r,V,ye.Type.CODE)} string didn't match the required format (package-name@range). Did you perhaps forget to explicitly reference the package name?`);let pe=Eft(a,re,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional});return await Promise.all(pe.map(async ve=>{let ge=await $1(re,{project:o,workspace:a,cache:n,fixed:u,target:ve,modifier:h,strategies:E,maxResults:w});return{request:re,suggestedDescriptors:ge,target:ve}}))})).then(V=>V.flat()),b=await pA.start({configuration:r,stdout:this.context.stdout,suggestInstall:!1},async V=>{for(let{request:re,suggestedDescriptors:{suggestions:oe,rejections:pe}}of v)if(oe.filter(ve=>ve.descriptor!==null).length===0){let[ve]=pe;if(typeof ve>"u")throw new Error("Assertion failed: Expected an error to have been set");o.configuration.get("enableNetwork")?V.reportError(27,`${Y.prettyDescriptor(r,re)} can't be resolved to a satisfying range`):V.reportError(27,`${Y.prettyDescriptor(r,re)} can't be resolved to a satisfying range (note: network resolution has been disabled)`),V.reportSeparator(),V.reportExceptionOnce(ve)}});if(b.hasErrors())return b.exitCode();let C=!1,R=[],L=[];for(let{suggestedDescriptors:{suggestions:V},target:re}of v){let oe,pe=V.filter(le=>le.descriptor!==null),he=pe[0].descriptor,ve=pe.every(le=>Y.areDescriptorsEqual(le.descriptor,he));pe.length===1||ve?oe=he:(C=!0,{answer:oe}=await(0,lge.prompt)({type:"select",name:"answer",message:"Which range do you want to use?",choices:V.map(({descriptor:le,name:Pe,reason:g})=>le?{name:Pe,hint:g,descriptor:le}:{name:Pe,hint:g,disabled:!0}),onCancel:()=>process.exit(130),result(le){return this.find(le,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let ge=a.manifest[re].get(oe.identHash);(typeof ge>"u"||ge.descriptorHash!==oe.descriptorHash)&&(a.manifest[re].set(oe.identHash,oe),this.optional&&(re==="dependencies"?a.manifest.ensureDependencyMeta({...oe,range:"unknown"}).optional=!0:re==="peerDependencies"&&(a.manifest.ensurePeerDependencyMeta({...oe,range:"unknown"}).optional=!0)),typeof ge>"u"?R.push([a,re,oe,E]):L.push([a,re,ge,oe]))}return await r.triggerMultipleHooks(V=>V.afterWorkspaceDependencyAddition,R),await r.triggerMultipleHooks(V=>V.afterWorkspaceDependencyReplacement,L),C&&this.context.stdout.write(` +`),(await Et.start({configuration:r,json:this.json,stdout:this.context.stdout,includeLogs:!this.context.quiet},async V=>{await o.install({cache:n,report:V,mode:this.mode})})).exitCode()}};P0.paths=[["add"]],P0.usage=it.Usage({description:"add dependencies to the project",details:"\n This command adds a package to the package.json for the nearest workspace.\n\n - If it didn't exist before, the package will by default be added to the regular `dependencies` field, but this behavior can be overriden thanks to the `-D,--dev` flag (which will cause the dependency to be added to the `devDependencies` field instead) and the `-P,--peer` flag (which will do the same but for `peerDependencies`).\n\n - If the package was already listed in your dependencies, it will by default be upgraded whether it's part of your `dependencies` or `devDependencies` (it won't ever update `peerDependencies`, though).\n\n - If set, the `--prefer-dev` flag will operate as a more flexible `-D,--dev` in that it will add the package to your `devDependencies` if it isn't already listed in either `dependencies` or `devDependencies`, but it will also happily upgrade your `dependencies` if that's what you already use (whereas `-D,--dev` would throw an exception).\n\n - If set, the `-O,--optional` flag will add the package to the `optionalDependencies` field and, in combination with the `-P,--peer` flag, it will add the package as an optional peer dependency. If the package was already listed in your `dependencies`, it will be upgraded to `optionalDependencies`. If the package was already listed in your `peerDependencies`, in combination with the `-P,--peer` flag, it will be upgraded to an optional peer dependency: `\"peerDependenciesMeta\": { \"\": { \"optional\": true } }`\n\n - If the added package doesn't specify a range at all its `latest` tag will be resolved and the returned version will be used to generate a new semver range (using the `^` modifier by default unless otherwise configured via the `defaultSemverRangePrefix` configuration, or the `~` modifier if `-T,--tilde` is specified, or no modifier at all if `-E,--exact` is specified). Two exceptions to this rule: the first one is that if the package is a workspace then its local version will be used, and the second one is that if you use `-P,--peer` the default range will be `*` and won't be resolved at all.\n\n - If the added package specifies a range (such as `^1.0.0`, `latest`, or `rc`), Yarn will add this range as-is in the resulting package.json entry (in particular, tags such as `rc` will be encoded as-is rather than being converted into a semver range).\n\n If the `--cached` option is used, Yarn will preferably reuse the highest version already used somewhere within the project, even if through a transitive dependency.\n\n If the `-i,--interactive` option is used (or if the `preferInteractive` settings is toggled on) the command will first try to check whether other workspaces in the project use the specified package and, if so, will offer to reuse them.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n For a compilation of all the supported protocols, please consult the dedicated page from our website: https://yarnpkg.com/features/protocols.\n ",examples:[["Add a regular package to the current workspace","$0 add lodash"],["Add a specific version for a package to the current workspace","$0 add lodash@1.2.3"],["Add a package from a GitHub repository (the master branch) to the current workspace using a URL","$0 add lodash@https://github.com/lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol","$0 add lodash@github:lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol (shorthand)","$0 add lodash@lodash/lodash"],["Add a package from a specific branch of a GitHub repository to the current workspace using the GitHub protocol (shorthand)","$0 add lodash-es@lodash/lodash#es"]]});function Eft(t,e,{dev:r,peer:o,preferDev:a,optional:n}){let u=t.manifest["dependencies"].has(e.identHash),A=t.manifest["devDependencies"].has(e.identHash),p=t.manifest["peerDependencies"].has(e.identHash);if((r||o)&&u)throw new ot(`Package "${Y.prettyIdent(t.project.configuration,e)}" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!r&&!o&&p)throw new ot(`Package "${Y.prettyIdent(t.project.configuration,e)}" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(n&&A)throw new ot(`Package "${Y.prettyIdent(t.project.configuration,e)}" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(n&&!o&&p)throw new ot(`Package "${Y.prettyIdent(t.project.configuration,e)}" is already listed as a peer dependency - remove the -O flag or add the -P flag or remove it from your peer dependencies first`);if((r||a)&&n)throw new ot(`Package "${Y.prettyIdent(t.project.configuration,e)}" cannot simultaneously be a dev dependency and an optional dependency`);let h=[];return o&&h.push("peerDependencies"),(r||a)&&h.push("devDependencies"),n&&h.push("dependencies"),h.length>0?h:A?["devDependencies"]:p?["peerDependencies"]:["dependencies"]}Ke();Ke();_t();var x0=class extends ct{constructor(){super(...arguments);this.verbose=fe.Boolean("-v,--verbose",!1,{description:"Print both the binary name and the locator of the package that provides the binary"});this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.name=fe.String({required:!1})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,locator:a}=await St.find(r,this.context.cwd);if(await o.restoreInstallState(),this.name){let A=(await sn.getPackageAccessibleBinaries(a,{project:o})).get(this.name);if(!A)throw new ot(`Couldn't find a binary named "${this.name}" for package "${Y.prettyLocator(r,a)}"`);let[,p]=A;return this.context.stdout.write(`${p} +`),0}return(await Et.start({configuration:r,json:this.json,stdout:this.context.stdout},async u=>{let A=await sn.getPackageAccessibleBinaries(a,{project:o}),h=Array.from(A.keys()).reduce((E,w)=>Math.max(E,w.length),0);for(let[E,[w,v]]of A)u.reportJson({name:E,source:Y.stringifyIdent(w),path:v});if(this.verbose)for(let[E,[w]]of A)u.reportInfo(null,`${E.padEnd(h," ")} ${Y.prettyLocator(r,w)}`);else for(let E of A.keys())u.reportInfo(null,E)})).exitCode()}};x0.paths=[["bin"]],x0.usage=it.Usage({description:"get the path to a binary script",details:` + When used without arguments, this command will print the list of all the binaries available in the current workspace. Adding the \`-v,--verbose\` flag will cause the output to contain both the binary name and the locator of the package that provides the binary. + + When an argument is specified, this command will just print the path to the binary on the standard output and exit. Note that the reported path may be stored within a zip archive. + `,examples:[["List all the available binaries","$0 bin"],["Print the path to a specific binary","$0 bin eslint"]]});Ke();bt();_t();var b0=class extends ct{constructor(){super(...arguments);this.mirror=fe.Boolean("--mirror",!1,{description:"Remove the global cache files instead of the local cache files"});this.all=fe.Boolean("--all",!1,{description:"Remove both the global cache files and the local cache files of the current project"})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),o=await Ur.find(r);return(await Et.start({configuration:r,stdout:this.context.stdout},async()=>{let n=(this.all||this.mirror)&&o.mirrorCwd!==null,u=!this.mirror;n&&(await ae.removePromise(o.mirrorCwd),await r.triggerHook(A=>A.cleanGlobalArtifacts,r)),u&&await ae.removePromise(o.cwd)})).exitCode()}};b0.paths=[["cache","clean"],["cache","clear"]],b0.usage=it.Usage({description:"remove the shared cache files",details:` + This command will remove all the files from the cache. + `,examples:[["Remove all the local archives","$0 cache clean"],["Remove all the archives stored in the ~/.yarn directory","$0 cache clean --mirror"]]});Ke();_t();var uge=tt(e2()),v8=Ie("util"),Q0=class extends ct{constructor(){super(...arguments);this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.unsafe=fe.Boolean("--no-redacted",!1,{description:"Don't redact secrets (such as tokens) from the output"});this.name=fe.String()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),o=this.name.replace(/[.[].*$/,""),a=this.name.replace(/^[^.[]*/,"");if(typeof r.settings.get(o)>"u")throw new ot(`Couldn't find a configuration settings named "${o}"`);let u=r.getSpecial(o,{hideSecrets:!this.unsafe,getNativePaths:!0}),A=Ye.convertMapsToIndexableObjects(u),p=a?(0,uge.default)(A,a):A,h=await Et.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async E=>{E.reportJson(p)});if(!this.json){if(typeof p=="string")return this.context.stdout.write(`${p} +`),h.exitCode();v8.inspect.styles.name="cyan",this.context.stdout.write(`${(0,v8.inspect)(p,{depth:1/0,colors:r.get("enableColors"),compact:!1})} +`)}return h.exitCode()}};Q0.paths=[["config","get"]],Q0.usage=it.Usage({description:"read a configuration settings",details:` + This command will print a configuration setting. + + Secrets (such as tokens) will be redacted from the output by default. If this behavior isn't desired, set the \`--no-redacted\` to get the untransformed value. + `,examples:[["Print a simple configuration setting","yarn config get yarnPath"],["Print a complex configuration setting","yarn config get packageExtensions"],["Print a nested field from the configuration",`yarn config get 'npmScopes["my-company"].npmRegistryServer'`],["Print a token from the configuration","yarn config get npmAuthToken --no-redacted"],["Print a configuration setting as JSON","yarn config get packageExtensions --json"]]});Ke();_t();var ede=tt(x8()),tde=tt(e2()),rde=tt(b8()),Q8=Ie("util"),k0=class extends ct{constructor(){super(...arguments);this.json=fe.Boolean("--json",!1,{description:"Set complex configuration settings to JSON values"});this.home=fe.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=fe.String();this.value=fe.String()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),o=()=>{if(!r.projectCwd)throw new ot("This command must be run from within a project folder");return r.projectCwd},a=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof r.settings.get(a)>"u")throw new ot(`Couldn't find a configuration settings named "${a}"`);if(a==="enableStrictSettings")throw new ot("This setting only affects the file it's in, and thus cannot be set from the CLI");let A=this.json?JSON.parse(this.value):this.value;await(this.home?C=>Xe.updateHomeConfiguration(C):C=>Xe.updateConfiguration(o(),C))(C=>{if(n){let R=(0,ede.default)(C);return(0,rde.default)(R,this.name,A),R}else return{...C,[a]:A}});let E=(await Xe.find(this.context.cwd,this.context.plugins)).getSpecial(a,{hideSecrets:!0,getNativePaths:!0}),w=Ye.convertMapsToIndexableObjects(E),v=n?(0,tde.default)(w,n):w;return(await Et.start({configuration:r,includeFooter:!1,stdout:this.context.stdout},async C=>{Q8.inspect.styles.name="cyan",C.reportInfo(0,`Successfully set ${this.name} to ${(0,Q8.inspect)(v,{depth:1/0,colors:r.get("enableColors"),compact:!1})}`)})).exitCode()}};k0.paths=[["config","set"]],k0.usage=it.Usage({description:"change a configuration settings",details:` + This command will set a configuration setting. + + When used without the \`--json\` flag, it can only set a simple configuration setting (a string, a number, or a boolean). + + When used with the \`--json\` flag, it can set both simple and complex configuration settings, including Arrays and Objects. + `,examples:[["Set a simple configuration setting (a string, a number, or a boolean)","yarn config set initScope myScope"],["Set a simple configuration setting (a string, a number, or a boolean) using the `--json` flag",'yarn config set initScope --json \\"myScope\\"'],["Set a complex configuration setting (an Array) using the `--json` flag",`yarn config set unsafeHttpWhitelist --json '["*.example.com", "example.com"]'`],["Set a complex configuration setting (an Object) using the `--json` flag",`yarn config set packageExtensions --json '{ "@babel/parser@*": { "dependencies": { "@babel/types": "*" } } }'`],["Set a nested configuration setting",'yarn config set npmScopes.company.npmRegistryServer "https://npm.example.com"'],["Set a nested configuration setting using indexed access for non-simple keys",`yarn config set 'npmRegistries["//npm.example.com"].npmAuthToken' "ffffffff-ffff-ffff-ffff-ffffffffffff"`]]});Ke();_t();var pde=tt(x8()),hde=tt(ode()),gde=tt(F8()),F0=class extends ct{constructor(){super(...arguments);this.home=fe.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=fe.String()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),o=()=>{if(!r.projectCwd)throw new ot("This command must be run from within a project folder");return r.projectCwd},a=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof r.settings.get(a)>"u")throw new ot(`Couldn't find a configuration settings named "${a}"`);let A=this.home?h=>Xe.updateHomeConfiguration(h):h=>Xe.updateConfiguration(o(),h);return(await Et.start({configuration:r,includeFooter:!1,stdout:this.context.stdout},async h=>{let E=!1;await A(w=>{if(!(0,hde.default)(w,this.name))return h.reportWarning(0,`Configuration doesn't contain setting ${this.name}; there is nothing to unset`),E=!0,w;let v=n?(0,pde.default)(w):{...w};return(0,gde.default)(v,this.name),v}),E||h.reportInfo(0,`Successfully unset ${this.name}`)})).exitCode()}};F0.paths=[["config","unset"]],F0.usage=it.Usage({description:"unset a configuration setting",details:` + This command will unset a configuration setting. + `,examples:[["Unset a simple configuration setting","yarn config unset initScope"],["Unset a complex configuration setting","yarn config unset packageExtensions"],["Unset a nested configuration setting","yarn config unset npmScopes.company.npmRegistryServer"]]});Ke();Ke();_t();var R8=Ie("util"),R0=class extends ct{constructor(){super(...arguments);this.verbose=fe.Boolean("-v,--verbose",!1,{description:"Print the setting description on top of the regular key/value information"});this.why=fe.Boolean("--why",!1,{description:"Print the reason why a setting is set a particular way"});this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins,{strict:!1});return(await Et.start({configuration:r,json:this.json,stdout:this.context.stdout},async a=>{if(r.invalid.size>0&&!this.json){for(let[n,u]of r.invalid)a.reportError(34,`Invalid configuration key "${n}" in ${u}`);a.reportSeparator()}if(this.json){let n=Ye.sortMap(r.settings.keys(),u=>u);for(let u of n){let A=r.settings.get(u),p=r.getSpecial(u,{hideSecrets:!0,getNativePaths:!0}),h=r.sources.get(u);this.verbose?a.reportJson({key:u,effective:p,source:h}):a.reportJson({key:u,effective:p,source:h,...A})}}else{let n=Ye.sortMap(r.settings.keys(),p=>p),u=n.reduce((p,h)=>Math.max(p,h.length),0),A={breakLength:1/0,colors:r.get("enableColors"),maxArrayLength:2};if(this.why||this.verbose){let p=n.map(E=>{let w=r.settings.get(E);if(!w)throw new Error(`Assertion failed: This settings ("${E}") should have been registered`);let v=this.why?r.sources.get(E)||"":w.description;return[E,v]}),h=p.reduce((E,[,w])=>Math.max(E,w.length),0);for(let[E,w]of p)a.reportInfo(null,`${E.padEnd(u," ")} ${w.padEnd(h," ")} ${(0,R8.inspect)(r.getSpecial(E,{hideSecrets:!0,getNativePaths:!0}),A)}`)}else for(let p of n)a.reportInfo(null,`${p.padEnd(u," ")} ${(0,R8.inspect)(r.getSpecial(p,{hideSecrets:!0,getNativePaths:!0}),A)}`)}})).exitCode()}};R0.paths=[["config"]],R0.usage=it.Usage({description:"display the current configuration",details:` + This command prints the current active configuration settings. + `,examples:[["Print the active configuration settings","$0 config"]]});Ke();_t();tl();var iQ={};Yt(iQ,{Strategy:()=>t2,acceptedStrategies:()=>rht,dedupe:()=>T8});Ke();Ke();var dde=tt(Jo()),t2=(e=>(e.HIGHEST="highest",e))(t2||{}),rht=new Set(Object.values(t2)),nht={highest:async(t,e,{resolver:r,fetcher:o,resolveOptions:a,fetchOptions:n})=>{let u=new Map;for(let[p,h]of t.storedResolutions){let E=t.storedDescriptors.get(p);if(typeof E>"u")throw new Error(`Assertion failed: The descriptor (${p}) should have been registered`);Ye.getSetWithDefault(u,E.identHash).add(h)}let A=new Map(Ye.mapAndFilter(t.storedDescriptors.values(),p=>Y.isVirtualDescriptor(p)?Ye.mapAndFilter.skip:[p.descriptorHash,Ye.makeDeferred()]));for(let p of t.storedDescriptors.values()){let h=A.get(p.descriptorHash);if(typeof h>"u")throw new Error(`Assertion failed: The descriptor (${p.descriptorHash}) should have been registered`);let E=t.storedResolutions.get(p.descriptorHash);if(typeof E>"u")throw new Error(`Assertion failed: The resolution (${p.descriptorHash}) should have been registered`);let w=t.originalPackages.get(E);if(typeof w>"u")throw new Error(`Assertion failed: The package (${E}) should have been registered`);Promise.resolve().then(async()=>{var re;let v=r.getResolutionDependencies(p,a),b=Object.fromEntries(await Ye.allSettledSafe(Object.entries(v).map(async([oe,pe])=>{let he=A.get(pe.descriptorHash);if(typeof he>"u")throw new Error(`Assertion failed: The descriptor (${pe.descriptorHash}) should have been registered`);let ve=await he.promise;if(!ve)throw new Error("Assertion failed: Expected the dependency to have been through the dedupe process itself");return[oe,ve.updatedPackage]})));if(e.length&&!dde.default.isMatch(Y.stringifyIdent(p),e)||!r.shouldPersistResolution(w,a))return w;let C=u.get(p.identHash);if(typeof C>"u")throw new Error(`Assertion failed: The resolutions (${p.identHash}) should have been registered`);if(C.size===1)return w;let R=[...C].map(oe=>{let pe=t.originalPackages.get(oe);if(typeof pe>"u")throw new Error(`Assertion failed: The package (${oe}) should have been registered`);return pe}),L=await r.getSatisfying(p,b,R,a),_=(re=L.locators)==null?void 0:re[0];if(typeof _>"u"||!L.sorted)return w;let V=t.originalPackages.get(_.locatorHash);if(typeof V>"u")throw new Error(`Assertion failed: The package (${_.locatorHash}) should have been registered`);return V}).then(async v=>{let b=await t.preparePackage(v,{resolver:r,resolveOptions:a});h.resolve({descriptor:p,currentPackage:w,updatedPackage:v,resolvedPackage:b})}).catch(v=>{h.reject(v)})}return[...A.values()].map(p=>p.promise)}};async function T8(t,{strategy:e,patterns:r,cache:o,report:a}){let{configuration:n}=t,u=new xi,A=n.makeResolver(),p=n.makeFetcher(),h={cache:o,checksums:t.storedChecksums,fetcher:p,project:t,report:u,cacheOptions:{skipIntegrityCheck:!0}},E={project:t,resolver:A,report:u,fetchOptions:h};return await a.startTimerPromise("Deduplication step",async()=>{let w=nht[e],v=await w(t,r,{resolver:A,resolveOptions:E,fetcher:p,fetchOptions:h}),b=Js.progressViaCounter(v.length);await a.reportProgress(b);let C=0;await Promise.all(v.map(_=>_.then(V=>{if(V===null||V.currentPackage.locatorHash===V.updatedPackage.locatorHash)return;C++;let{descriptor:re,currentPackage:oe,updatedPackage:pe}=V;a.reportInfo(0,`${Y.prettyDescriptor(n,re)} can be deduped from ${Y.prettyLocator(n,oe)} to ${Y.prettyLocator(n,pe)}`),a.reportJson({descriptor:Y.stringifyDescriptor(re),currentResolution:Y.stringifyLocator(oe),updatedResolution:Y.stringifyLocator(pe)}),t.storedResolutions.set(re.descriptorHash,pe.locatorHash)}).finally(()=>b.tick())));let R;switch(C){case 0:R="No packages";break;case 1:R="One package";break;default:R=`${C} packages`}let L=ye.pretty(n,e,ye.Type.CODE);return a.reportInfo(0,`${R} can be deduped using the ${L} strategy`),C})}var T0=class extends ct{constructor(){super(...arguments);this.strategy=fe.String("-s,--strategy","highest",{description:"The strategy to use when deduping dependencies",validator:Gs(t2)});this.check=fe.Boolean("-c,--check",!1,{description:"Exit with exit code 1 when duplicates are found, without persisting the dependency tree"});this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.mode=fe.String("--mode",{description:"Change what artifacts installs generate",validator:Gs(gl)});this.patterns=fe.Rest()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd),a=await Ur.find(r);await o.restoreInstallState({restoreResolutions:!1});let n=0,u=await Et.start({configuration:r,includeFooter:!1,stdout:this.context.stdout,json:this.json},async A=>{n=await T8(o,{strategy:this.strategy,patterns:this.patterns,cache:a,report:A})});return u.hasErrors()?u.exitCode():this.check?n?1:0:(await Et.start({configuration:r,stdout:this.context.stdout,json:this.json},async p=>{await o.install({cache:a,report:p,mode:this.mode})})).exitCode()}};T0.paths=[["dedupe"]],T0.usage=it.Usage({description:"deduplicate dependencies with overlapping ranges",details:"\n Duplicates are defined as descriptors with overlapping ranges being resolved and locked to different locators. They are a natural consequence of Yarn's deterministic installs, but they can sometimes pile up and unnecessarily increase the size of your project.\n\n This command dedupes dependencies in the current project using different strategies (only one is implemented at the moment):\n\n - `highest`: Reuses (where possible) the locators with the highest versions. This means that dependencies can only be upgraded, never downgraded. It's also guaranteed that it never takes more than a single pass to dedupe the entire dependency tree.\n\n **Note:** Even though it never produces a wrong dependency tree, this command should be used with caution, as it modifies the dependency tree, which can sometimes cause problems when packages don't strictly follow semver recommendations. Because of this, it is recommended to also review the changes manually.\n\n If set, the `-c,--check` flag will only report the found duplicates, without persisting the modified dependency tree. If changes are found, the command will exit with a non-zero exit code, making it suitable for CI purposes.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n ### In-depth explanation:\n\n Yarn doesn't deduplicate dependencies by default, otherwise installs wouldn't be deterministic and the lockfile would be useless. What it actually does is that it tries to not duplicate dependencies in the first place.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@*`will cause Yarn to reuse `foo@2.3.4`, even if the latest `foo` is actually `foo@2.10.14`, thus preventing unnecessary duplication.\n\n Duplication happens when Yarn can't unlock dependencies that have already been locked inside the lockfile.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@2.10.14` will cause Yarn to install `foo@2.10.14` because the existing resolution doesn't satisfy the range `2.10.14`. This behavior can lead to (sometimes) unwanted duplication, since now the lockfile contains 2 separate resolutions for the 2 `foo` descriptors, even though they have overlapping ranges, which means that the lockfile can be simplified so that both descriptors resolve to `foo@2.10.14`.\n ",examples:[["Dedupe all packages","$0 dedupe"],["Dedupe all packages using a specific strategy","$0 dedupe --strategy highest"],["Dedupe a specific package","$0 dedupe lodash"],["Dedupe all packages with the `@babel/*` scope","$0 dedupe '@babel/*'"],["Check for duplicates (can be used as a CI step)","$0 dedupe --check"]]});Ke();_t();var Jd=class extends ct{async execute(){let{plugins:e}=await Xe.find(this.context.cwd,this.context.plugins),r=[];for(let u of e){let{commands:A}=u[1];if(A){let h=vo.from(A).definitions();r.push([u[0],h])}}let o=this.cli.definitions(),a=(u,A)=>u.split(" ").slice(1).join()===A.split(" ").slice(1).join(),n=mde()["@yarnpkg/builder"].bundles.standard;for(let u of r){let A=u[1];for(let p of A)o.find(h=>a(h.path,p.path)).plugin={name:u[0],isDefault:n.includes(u[0])}}this.context.stdout.write(`${JSON.stringify(o,null,2)} +`)}};Jd.paths=[["--clipanion=definitions"]];var zd=class extends ct{async execute(){this.context.stdout.write(this.cli.usage(null))}};zd.paths=[["help"],["--help"],["-h"]];Ke();bt();_t();var pE=class extends ct{constructor(){super(...arguments);this.leadingArgument=fe.String();this.args=fe.Proxy()}async execute(){if(this.leadingArgument.match(/[\\/]/)&&!Y.tryParseIdent(this.leadingArgument)){let r=z.resolve(this.context.cwd,ue.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:r})}else return await this.cli.run(["run",this.leadingArgument,...this.args])}};Ke();var Xd=class extends ct{async execute(){this.context.stdout.write(`${On||""} +`)}};Xd.paths=[["-v"],["--version"]];Ke();Ke();_t();var N0=class extends ct{constructor(){super(...arguments);this.commandName=fe.String();this.args=fe.Proxy()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,locator:a}=await St.find(r,this.context.cwd);return await o.restoreInstallState(),await sn.executePackageShellcode(a,this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,project:o})}};N0.paths=[["exec"]],N0.usage=it.Usage({description:"execute a shell script",details:` + This command simply executes a shell script within the context of the root directory of the active workspace using the portable shell. + + It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). + `,examples:[["Execute a single shell command","$0 exec echo Hello World"],["Execute a shell script",'$0 exec "tsc & babel src --out-dir lib"']]});Ke();_t();tl();var L0=class extends ct{constructor(){super(...arguments);this.hash=fe.String({required:!1,validator:ed(ZI(),[$I(/^p[0-9a-f]{5}$/)])})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd);return await o.restoreInstallState({restoreResolutions:!1}),await o.applyLightResolution(),typeof this.hash<"u"?await sht(this.hash,o,{stdout:this.context.stdout}):(await Et.start({configuration:r,stdout:this.context.stdout,includeFooter:!1},async n=>{let u=[([,A])=>Y.stringifyLocator(o.storedPackages.get(A.subject)),([,A])=>Y.stringifyIdent(A.requested)];for(let[A,p]of Ye.sortMap(o.peerRequirements,u)){let h=o.storedPackages.get(p.subject);if(typeof h>"u")throw new Error("Assertion failed: Expected the subject package to have been registered");let E=o.storedPackages.get(p.rootRequester);if(typeof E>"u")throw new Error("Assertion failed: Expected the root package to have been registered");let w=h.dependencies.get(p.requested.identHash)??null,v=ye.pretty(r,A,ye.Type.CODE),b=Y.prettyLocator(r,h),C=Y.prettyIdent(r,p.requested),R=Y.prettyIdent(r,E),L=p.allRequesters.length-1,_=`descendant${L===1?"":"s"}`,V=L>0?` and ${L} ${_}`:"",re=w!==null?"provides":"doesn't provide";n.reportInfo(null,`${v} \u2192 ${b} ${re} ${C} to ${R}${V}`)}})).exitCode()}};L0.paths=[["explain","peer-requirements"]],L0.usage=it.Usage({description:"explain a set of peer requirements",details:` + A set of peer requirements represents all peer requirements that a dependent must satisfy when providing a given peer request to a requester and its descendants. + + When the hash argument is specified, this command prints a detailed explanation of all requirements of the set corresponding to the hash and whether they're satisfied or not. + + When used without arguments, this command lists all sets of peer requirements and the corresponding hash that can be used to get detailed information about a given set. + + **Note:** A hash is a six-letter p-prefixed code that can be obtained from peer dependency warnings or from the list of all peer requirements (\`yarn explain peer-requirements\`). + `,examples:[["Explain the corresponding set of peer requirements for a hash","$0 explain peer-requirements p1a4ed"],["List all sets of peer requirements","$0 explain peer-requirements"]]});async function sht(t,e,r){let{configuration:o}=e,a=e.peerRequirements.get(t);if(typeof a>"u")throw new Error(`No peerDependency requirements found for hash: "${t}"`);return(await Et.start({configuration:o,stdout:r.stdout,includeFooter:!1},async u=>{let A=e.storedPackages.get(a.subject);if(typeof A>"u")throw new Error("Assertion failed: Expected the subject package to have been registered");let p=e.storedPackages.get(a.rootRequester);if(typeof p>"u")throw new Error("Assertion failed: Expected the root package to have been registered");let h=A.dependencies.get(a.requested.identHash)??null,E=h!==null?e.storedResolutions.get(h.descriptorHash):null;if(typeof E>"u")throw new Error("Assertion failed: Expected the resolution to have been registered");let w=E!==null?e.storedPackages.get(E):null;if(typeof w>"u")throw new Error("Assertion failed: Expected the provided package to have been registered");let v=[...a.allRequesters.values()].map(_=>{let V=e.storedPackages.get(_);if(typeof V>"u")throw new Error("Assertion failed: Expected the package to be registered");let re=Y.devirtualizeLocator(V),oe=e.storedPackages.get(re.locatorHash);if(typeof oe>"u")throw new Error("Assertion failed: Expected the package to be registered");let pe=oe.peerDependencies.get(a.requested.identHash);if(typeof pe>"u")throw new Error("Assertion failed: Expected the peer dependency to be registered");return{pkg:V,peerDependency:pe}});if(w!==null){let _=v.every(({peerDependency:V})=>Tr.satisfiesWithPrereleases(w.version,V.range));u.reportInfo(0,`${Y.prettyLocator(o,A)} provides ${Y.prettyLocator(o,w)} with version ${Y.prettyReference(o,w.version??"")}, which ${_?"satisfies":"doesn't satisfy"} the following requirements:`)}else u.reportInfo(0,`${Y.prettyLocator(o,A)} doesn't provide ${Y.prettyIdent(o,a.requested)}, breaking the following requirements:`);u.reportSeparator();let b=ye.mark(o),C=[];for(let{pkg:_,peerDependency:V}of Ye.sortMap(v,re=>Y.stringifyLocator(re.pkg))){let oe=(w!==null?Tr.satisfiesWithPrereleases(w.version,V.range):!1)?b.Check:b.Cross;C.push({stringifiedLocator:Y.stringifyLocator(_),prettyLocator:Y.prettyLocator(o,_),prettyRange:Y.prettyRange(o,V.range),mark:oe})}let R=Math.max(...C.map(({stringifiedLocator:_})=>_.length)),L=Math.max(...C.map(({prettyRange:_})=>_.length));for(let{stringifiedLocator:_,prettyLocator:V,prettyRange:re,mark:oe}of Ye.sortMap(C,({stringifiedLocator:pe})=>pe))u.reportInfo(null,`${V.padEnd(R+(V.length-_.length)," ")} \u2192 ${re.padEnd(L," ")} ${oe}`);C.length>1&&(u.reportSeparator(),u.reportInfo(0,`Note: these requirements start with ${Y.prettyLocator(e.configuration,p)}`))})).exitCode()}Ke();_t();tl();Ke();Ke();bt();_t();var yde=tt(si()),O0=class extends ct{constructor(){super(...arguments);this.useYarnPath=fe.Boolean("--yarn-path",{description:"Set the yarnPath setting even if the version can be accessed by Corepack"});this.onlyIfNeeded=fe.Boolean("--only-if-needed",!1,{description:"Only lock the Yarn version if it isn't already locked"});this.version=fe.String()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins);if(this.onlyIfNeeded&&r.get("yarnPath")){let A=r.sources.get("yarnPath");if(!A)throw new Error("Assertion failed: Expected 'yarnPath' to have a source");let p=r.projectCwd??r.startingCwd;if(z.contains(p,A))return 0}let o=()=>{if(typeof On>"u")throw new ot("The --install flag can only be used without explicit version specifier from the Yarn CLI");return`file://${process.argv[1]}`},a,n=(A,p)=>({version:p,url:A.replace(/\{\}/g,p)});if(this.version==="self")a={url:o(),version:On??"self"};else if(this.version==="latest"||this.version==="berry"||this.version==="stable")a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",await r2(r,"stable"));else if(this.version==="canary")a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",await r2(r,"canary"));else if(this.version==="classic")a={url:"https://classic.yarnpkg.com/latest.js",version:"classic"};else if(this.version.match(/^https?:/))a={url:this.version,version:"remote"};else if(this.version.match(/^\.{0,2}[\\/]/)||ue.isAbsolute(this.version))a={url:`file://${z.resolve(ue.toPortablePath(this.version))}`,version:"file"};else if(Tr.satisfiesWithPrereleases(this.version,">=2.0.0"))a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",this.version);else if(Tr.satisfiesWithPrereleases(this.version,"^0.x || ^1.x"))a=n("https://github.com/yarnpkg/yarn/releases/download/v{}/yarn-{}.js",this.version);else if(Tr.validRange(this.version))a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",await oht(r,this.version));else throw new ot(`Invalid version descriptor "${this.version}"`);return(await Et.start({configuration:r,stdout:this.context.stdout,includeLogs:!this.context.quiet},async A=>{let p=async()=>{let h="file://";return a.url.startsWith(h)?(A.reportInfo(0,`Retrieving ${ye.pretty(r,a.url,ye.Type.PATH)}`),await ae.readFilePromise(a.url.slice(h.length))):(A.reportInfo(0,`Downloading ${ye.pretty(r,a.url,ye.Type.URL)}`),await ln.get(a.url,{configuration:r}))};await N8(r,a.version,p,{report:A,useYarnPath:this.useYarnPath})})).exitCode()}};O0.paths=[["set","version"]],O0.usage=it.Usage({description:"lock the Yarn version used by the project",details:"\n This command will set a specific release of Yarn to be used by Corepack: https://nodejs.org/api/corepack.html.\n\n By default it only will set the `packageManager` field at the root of your project, but if the referenced release cannot be represented this way, if you already have `yarnPath` configured, or if you set the `--yarn-path` command line flag, then the release will also be downloaded from the Yarn GitHub repository, stored inside your project, and referenced via the `yarnPath` settings from your project `.yarnrc.yml` file.\n\n A very good use case for this command is to enforce the version of Yarn used by any single member of your team inside the same project - by doing this you ensure that you have control over Yarn upgrades and downgrades (including on your deployment servers), and get rid of most of the headaches related to someone using a slightly different version and getting different behavior.\n\n The version specifier can be:\n\n - a tag:\n - `latest` / `berry` / `stable` -> the most recent stable berry (`>=2.0.0`) release\n - `canary` -> the most recent canary (release candidate) berry (`>=2.0.0`) release\n - `classic` -> the most recent classic (`^0.x || ^1.x`) release\n\n - a semver range (e.g. `2.x`) -> the most recent version satisfying the range (limited to berry releases)\n\n - a semver version (e.g. `2.4.1`, `1.22.1`)\n\n - a local file referenced through either a relative or absolute path\n\n - `self` -> the version used to invoke the command\n ",examples:[["Download the latest release from the Yarn repository","$0 set version latest"],["Download the latest canary release from the Yarn repository","$0 set version canary"],["Download the latest classic release from the Yarn repository","$0 set version classic"],["Download the most recent Yarn 3 build","$0 set version 3.x"],["Download a specific Yarn 2 build","$0 set version 2.0.0-rc.30"],["Switch back to a specific Yarn 1 release","$0 set version 1.22.1"],["Use a release from the local filesystem","$0 set version ./yarn.cjs"],["Use a release from a URL","$0 set version https://repo.yarnpkg.com/3.1.0/packages/yarnpkg-cli/bin/yarn.js"],["Download the version used to invoke the command","$0 set version self"]]});async function oht(t,e){let o=(await ln.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0})).tags.filter(a=>Tr.satisfiesWithPrereleases(a,e));if(o.length===0)throw new ot(`No matching release found for range ${ye.pretty(t,e,ye.Type.RANGE)}.`);return o[0]}async function r2(t,e){let r=await ln.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0});if(!r.latest[e])throw new ot(`Tag ${ye.pretty(t,e,ye.Type.RANGE)} not found`);return r.latest[e]}async function N8(t,e,r,{report:o,useYarnPath:a}){let n,u=async()=>(typeof n>"u"&&(n=await r()),n);if(e===null){let re=await u();await ae.mktempPromise(async oe=>{let pe=z.join(oe,"yarn.cjs");await ae.writeFilePromise(pe,re);let{stdout:he}=await Mr.execvp(process.execPath,[ue.fromPortablePath(pe),"--version"],{cwd:oe,env:{...process.env,YARN_IGNORE_PATH:"1"}});if(e=he.trim(),!yde.default.valid(e))throw new Error(`Invalid semver version. ${ye.pretty(t,"yarn --version",ye.Type.CODE)} returned: +${e}`)})}let A=t.projectCwd??t.startingCwd,p=z.resolve(A,".yarn/releases"),h=z.resolve(p,`yarn-${e}.cjs`),E=z.relative(t.startingCwd,h),w=Ye.isTaggedYarnVersion(e),v=t.get("yarnPath"),b=!w,C=b||!!v||!!a;if(a===!1){if(b)throw new Vt(0,"You explicitly opted out of yarnPath usage in your command line, but the version you specified cannot be represented by Corepack");C=!1}else!C&&!process.env.COREPACK_ROOT&&(o.reportWarning(0,`You don't seem to have ${ye.applyHyperlink(t,"Corepack","https://nodejs.org/api/corepack.html")} enabled; we'll have to rely on ${ye.applyHyperlink(t,"yarnPath","https://yarnpkg.com/configuration/yarnrc#yarnPath")} instead`),C=!0);if(C){let re=await u();o.reportInfo(0,`Saving the new release in ${ye.pretty(t,E,"magenta")}`),await ae.removePromise(z.dirname(h)),await ae.mkdirPromise(z.dirname(h),{recursive:!0}),await ae.writeFilePromise(h,re,{mode:493}),await Xe.updateConfiguration(A,{yarnPath:z.relative(A,h)})}else await ae.removePromise(z.dirname(h)),await Xe.updateConfiguration(A,{yarnPath:Xe.deleteProperty});let R=await Nt.tryFind(A)||new Nt;R.packageManager=`yarn@${w?e:await r2(t,"stable")}`;let L={};R.exportTo(L);let _=z.join(A,Nt.fileName),V=`${JSON.stringify(L,null,R.indent)} +`;return await ae.changeFilePromise(_,V,{automaticNewlines:!0}),{bundleVersion:e}}function Cde(t){return dr[$D(t)]}var aht=/## (?YN[0-9]{4}) - `(?[A-Z_]+)`\n\n(?

(?:.(?!##))+)/gs;async function lht(t){let r=`https://repo.yarnpkg.com/${Ye.isTaggedYarnVersion(On)?On:await r2(t,"canary")}/packages/gatsby/content/advanced/error-codes.md`,o=await ln.get(r,{configuration:t});return new Map(Array.from(o.toString().matchAll(aht),({groups:a})=>{if(!a)throw new Error("Assertion failed: Expected the match to have been successful");let n=Cde(a.code);if(a.name!==n)throw new Error(`Assertion failed: Invalid error code data: Expected "${a.name}" to be named "${n}"`);return[a.code,a.details]}))}var M0=class extends ct{constructor(){super(...arguments);this.code=fe.String({required:!1,validator:ed(ZI(),[$I(/^YN[0-9]{4}$/)])});this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins);if(typeof this.code<"u"){let o=Cde(this.code),a=ye.pretty(r,o,ye.Type.CODE),n=this.cli.format().header(`${this.code} - ${a}`),A=(await lht(r)).get(this.code),p=typeof A<"u"?ye.jsonOrPretty(this.json,r,ye.tuple(ye.Type.MARKDOWN,{text:A,format:this.cli.format(),paragraphs:!0})):`This error code does not have a description. + +You can help us by editing this page on GitHub \u{1F642}: +${ye.jsonOrPretty(this.json,r,ye.tuple(ye.Type.URL,"https://github.com/yarnpkg/berry/blob/master/packages/gatsby/content/advanced/error-codes.md"))} +`;this.json?this.context.stdout.write(`${JSON.stringify({code:this.code,name:o,details:p})} +`):this.context.stdout.write(`${n} + +${p} +`)}else{let o={children:Ye.mapAndFilter(Object.entries(dr),([a,n])=>Number.isNaN(Number(a))?Ye.mapAndFilter.skip:{label:Vu(Number(a)),value:ye.tuple(ye.Type.CODE,n)})};Zo.emitTree(o,{configuration:r,stdout:this.context.stdout,json:this.json})}}};M0.paths=[["explain"]],M0.usage=it.Usage({description:"explain an error code",details:` + When the code argument is specified, this command prints its name and its details. + + When used without arguments, this command lists all error codes and their names. + `,examples:[["Explain an error code","$0 explain YN0006"],["List all error codes","$0 explain"]]});Ke();bt();_t();var Ede=tt(Jo()),U0=class extends ct{constructor(){super(...arguments);this.all=fe.Boolean("-A,--all",!1,{description:"Print versions of a package from the whole project"});this.recursive=fe.Boolean("-R,--recursive",!1,{description:"Print information for all packages, including transitive dependencies"});this.extra=fe.Array("-X,--extra",[],{description:"An array of requests of extra data provided by plugins"});this.cache=fe.Boolean("--cache",!1,{description:"Print information about the cache entry of a package (path, size, checksum)"});this.dependents=fe.Boolean("--dependents",!1,{description:"Print all dependents for each matching package"});this.manifest=fe.Boolean("--manifest",!1,{description:"Print data obtained by looking at the package archive (license, homepage, ...)"});this.nameOnly=fe.Boolean("--name-only",!1,{description:"Only print the name for the matching packages"});this.virtuals=fe.Boolean("--virtuals",!1,{description:"Print each instance of the virtual packages"});this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=fe.Rest()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Ur.find(r);if(!a&&!this.all)throw new er(o.cwd,this.context.cwd);await o.restoreInstallState();let u=new Set(this.extra);this.cache&&u.add("cache"),this.dependents&&u.add("dependents"),this.manifest&&u.add("manifest");let A=(oe,{recursive:pe})=>{let he=oe.anchoredLocator.locatorHash,ve=new Map,ge=[he];for(;ge.length>0;){let le=ge.shift();if(ve.has(le))continue;let Pe=o.storedPackages.get(le);if(typeof Pe>"u")throw new Error("Assertion failed: Expected the package to be registered");if(ve.set(le,Pe),Y.isVirtualLocator(Pe)&&ge.push(Y.devirtualizeLocator(Pe).locatorHash),!(!pe&&le!==he))for(let g of Pe.dependencies.values()){let De=o.storedResolutions.get(g.descriptorHash);if(typeof De>"u")throw new Error("Assertion failed: Expected the resolution to be registered");ge.push(De)}}return ve.values()},p=({recursive:oe})=>{let pe=new Map;for(let he of o.workspaces)for(let ve of A(he,{recursive:oe}))pe.set(ve.locatorHash,ve);return pe.values()},h=({all:oe,recursive:pe})=>oe&&pe?o.storedPackages.values():oe?p({recursive:pe}):A(a,{recursive:pe}),E=({all:oe,recursive:pe})=>{let he=h({all:oe,recursive:pe}),ve=this.patterns.map(Pe=>{let g=Y.parseLocator(Pe),De=Ede.default.makeRe(Y.stringifyIdent(g)),Ce=Y.isVirtualLocator(g),de=Ce?Y.devirtualizeLocator(g):g;return ne=>{let Z=Y.stringifyIdent(ne);if(!De.test(Z))return!1;if(g.reference==="unknown")return!0;let me=Y.isVirtualLocator(ne),be=me?Y.devirtualizeLocator(ne):ne;return!(Ce&&me&&g.reference!==ne.reference||de.reference!==be.reference)}}),ge=Ye.sortMap([...he],Pe=>Y.stringifyLocator(Pe));return{selection:ge.filter(Pe=>ve.length===0||ve.some(g=>g(Pe))),sortedLookup:ge}},{selection:w,sortedLookup:v}=E({all:this.all,recursive:this.recursive});if(w.length===0)throw new ot("No package matched your request");let b=new Map;if(this.dependents)for(let oe of v)for(let pe of oe.dependencies.values()){let he=o.storedResolutions.get(pe.descriptorHash);if(typeof he>"u")throw new Error("Assertion failed: Expected the resolution to be registered");Ye.getArrayWithDefault(b,he).push(oe)}let C=new Map;for(let oe of v){if(!Y.isVirtualLocator(oe))continue;let pe=Y.devirtualizeLocator(oe);Ye.getArrayWithDefault(C,pe.locatorHash).push(oe)}let R={},L={children:R},_=r.makeFetcher(),V={project:o,fetcher:_,cache:n,checksums:o.storedChecksums,report:new xi,cacheOptions:{skipIntegrityCheck:!0}},re=[async(oe,pe,he)=>{var le;if(!pe.has("manifest"))return;let ve=await _.fetch(oe,V),ge;try{ge=await Nt.find(ve.prefixPath,{baseFs:ve.packageFs})}finally{(le=ve.releaseFs)==null||le.call(ve)}he("Manifest",{License:ye.tuple(ye.Type.NO_HINT,ge.license),Homepage:ye.tuple(ye.Type.URL,ge.raw.homepage??null)})},async(oe,pe,he)=>{if(!pe.has("cache"))return;let ve={mockedPackages:o.disabledLocators,unstablePackages:o.conditionalLocators},ge=o.storedChecksums.get(oe.locatorHash)??null,le=n.getLocatorPath(oe,ge,ve),Pe;if(le!==null)try{Pe=ae.statSync(le)}catch{}let g=typeof Pe<"u"?[Pe.size,ye.Type.SIZE]:void 0;he("Cache",{Checksum:ye.tuple(ye.Type.NO_HINT,ge),Path:ye.tuple(ye.Type.PATH,le),Size:g})}];for(let oe of w){let pe=Y.isVirtualLocator(oe);if(!this.virtuals&&pe)continue;let he={},ve={value:[oe,ye.Type.LOCATOR],children:he};if(R[Y.stringifyLocator(oe)]=ve,this.nameOnly){delete ve.children;continue}let ge=C.get(oe.locatorHash);typeof ge<"u"&&(he.Instances={label:"Instances",value:ye.tuple(ye.Type.NUMBER,ge.length)}),he.Version={label:"Version",value:ye.tuple(ye.Type.NO_HINT,oe.version)};let le=(g,De)=>{let Ce={};if(he[g]=Ce,Array.isArray(De))Ce.children=De.map(de=>({value:de}));else{let de={};Ce.children=de;for(let[ne,Z]of Object.entries(De))typeof Z>"u"||(de[ne]={label:ne,value:Z})}};if(!pe){for(let g of re)await g(oe,u,le);await r.triggerHook(g=>g.fetchPackageInfo,oe,u,le)}oe.bin.size>0&&!pe&&le("Exported Binaries",[...oe.bin.keys()].map(g=>ye.tuple(ye.Type.PATH,g)));let Pe=b.get(oe.locatorHash);typeof Pe<"u"&&Pe.length>0&&le("Dependents",Pe.map(g=>ye.tuple(ye.Type.LOCATOR,g))),oe.dependencies.size>0&&!pe&&le("Dependencies",[...oe.dependencies.values()].map(g=>{let De=o.storedResolutions.get(g.descriptorHash),Ce=typeof De<"u"?o.storedPackages.get(De)??null:null;return ye.tuple(ye.Type.RESOLUTION,{descriptor:g,locator:Ce})})),oe.peerDependencies.size>0&&pe&&le("Peer dependencies",[...oe.peerDependencies.values()].map(g=>{let De=oe.dependencies.get(g.identHash),Ce=typeof De<"u"?o.storedResolutions.get(De.descriptorHash)??null:null,de=Ce!==null?o.storedPackages.get(Ce)??null:null;return ye.tuple(ye.Type.RESOLUTION,{descriptor:g,locator:de})}))}Zo.emitTree(L,{configuration:r,json:this.json,stdout:this.context.stdout,separators:this.nameOnly?0:2})}};U0.paths=[["info"]],U0.usage=it.Usage({description:"see information related to packages",details:"\n This command prints various information related to the specified packages, accepting glob patterns.\n\n By default, if the locator reference is missing, Yarn will default to print the information about all the matching direct dependencies of the package for the active workspace. To instead print all versions of the package that are direct dependencies of any of your workspaces, use the `-A,--all` flag. Adding the `-R,--recursive` flag will also report transitive dependencies.\n\n Some fields will be hidden by default in order to keep the output readable, but can be selectively displayed by using additional options (`--dependents`, `--manifest`, `--virtuals`, ...) described in the option descriptions.\n\n Note that this command will only print the information directly related to the selected packages - if you wish to know why the package is there in the first place, use `yarn why` which will do just that (it also provides a `-R,--recursive` flag that may be of some help).\n ",examples:[["Show information about Lodash","$0 info lodash"]]});Ke();bt();_l();var sQ=tt(Xg());_t();tl();var _0=class extends ct{constructor(){super(...arguments);this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.immutable=fe.Boolean("--immutable",{description:"Abort with an error exit code if the lockfile was to be modified"});this.immutableCache=fe.Boolean("--immutable-cache",{description:"Abort with an error exit code if the cache folder was to be modified"});this.refreshLockfile=fe.Boolean("--refresh-lockfile",{description:"Refresh the package metadata stored in the lockfile"});this.checkCache=fe.Boolean("--check-cache",{description:"Always refetch the packages and ensure that their checksums are consistent"});this.checkResolutions=fe.Boolean("--check-resolutions",{description:"Validates that the package resolutions are coherent"});this.inlineBuilds=fe.Boolean("--inline-builds",{description:"Verbosely print the output of the build steps of dependencies"});this.mode=fe.String("--mode",{description:"Change what artifacts installs generate",validator:Gs(gl)});this.cacheFolder=fe.String("--cache-folder",{hidden:!0});this.frozenLockfile=fe.Boolean("--frozen-lockfile",{hidden:!0});this.ignoreEngines=fe.Boolean("--ignore-engines",{hidden:!0});this.nonInteractive=fe.Boolean("--non-interactive",{hidden:!0});this.preferOffline=fe.Boolean("--prefer-offline",{hidden:!0});this.production=fe.Boolean("--production",{hidden:!0});this.registry=fe.String("--registry",{hidden:!0});this.silent=fe.Boolean("--silent",{hidden:!0});this.networkTimeout=fe.String("--network-timeout",{hidden:!0})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins);typeof this.inlineBuilds<"u"&&r.useWithSource("",{enableInlineBuilds:this.inlineBuilds},r.startingCwd,{overwrite:!0});let o=!!process.env.FUNCTION_TARGET||!!process.env.GOOGLE_RUNTIME,a=async(C,{error:R})=>{let L=await Et.start({configuration:r,stdout:this.context.stdout,includeFooter:!1},async _=>{R?_.reportError(50,C):_.reportWarning(50,C)});return L.hasErrors()?L.exitCode():null};if(typeof this.ignoreEngines<"u"){let C=await a("The --ignore-engines option is deprecated; engine checking isn't a core feature anymore",{error:!sQ.default.VERCEL});if(C!==null)return C}if(typeof this.registry<"u"){let C=await a("The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file",{error:!1});if(C!==null)return C}if(typeof this.preferOffline<"u"){let C=await a("The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead",{error:!sQ.default.VERCEL});if(C!==null)return C}if(typeof this.production<"u"){let C=await a("The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead",{error:!0});if(C!==null)return C}if(typeof this.nonInteractive<"u"){let C=await a("The --non-interactive option is deprecated",{error:!o});if(C!==null)return C}if(typeof this.frozenLockfile<"u"&&(await a("The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead",{error:!1}),this.immutable=this.frozenLockfile),typeof this.cacheFolder<"u"){let C=await a("The cache-folder option has been deprecated; use rc settings instead",{error:!sQ.default.NETLIFY});if(C!==null)return C}let n=this.mode==="update-lockfile";if(n&&(this.immutable||this.immutableCache))throw new ot(`${ye.pretty(r,"--immutable",ye.Type.CODE)} and ${ye.pretty(r,"--immutable-cache",ye.Type.CODE)} cannot be used with ${ye.pretty(r,"--mode=update-lockfile",ye.Type.CODE)}`);let u=(this.immutable??r.get("enableImmutableInstalls"))&&!n,A=this.immutableCache&&!n;if(r.projectCwd!==null){let C=await Et.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async R=>{await uht(r,u)&&(R.reportInfo(48,"Automatically fixed merge conflicts \u{1F44D}"),R.reportSeparator())});if(C.hasErrors())return C.exitCode()}if(r.projectCwd!==null&&typeof r.sources.get("nodeLinker")>"u"){let C=r.projectCwd,R;try{R=await ae.readFilePromise(z.join(C,Lr.lockfile),"utf8")}catch{}if(R!=null&&R.includes("yarn lockfile v1")){let L=await Et.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async _=>{_.reportInfo(70,"Migrating from Yarn 1; automatically enabling the compatibility node-modules linker \u{1F44D}"),_.reportSeparator(),r.use("",{nodeLinker:"node-modules"},C,{overwrite:!0}),await Xe.updateConfiguration(C,{nodeLinker:"node-modules"})});if(L.hasErrors())return L.exitCode()}}if(r.projectCwd!==null){let C=await Et.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async R=>{var L;(L=Xe.telemetry)!=null&&L.isNew&&(R.reportInfo(65,"Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry"),R.reportInfo(65,`Run ${ye.pretty(r,"yarn config set --home enableTelemetry 0",ye.Type.CODE)} to disable`),R.reportSeparator())});if(C.hasErrors())return C.exitCode()}let{project:p,workspace:h}=await St.find(r,this.context.cwd),E=await Ur.find(r,{immutable:A,check:this.checkCache});if(!h)throw new er(p.cwd,this.context.cwd);await p.restoreInstallState({restoreResolutions:!1});let w=r.get("enableHardenedMode");(this.refreshLockfile??w)&&(p.lockfileNeedsRefresh=!0);let v=this.checkResolutions??w;return(await Et.start({configuration:r,json:this.json,stdout:this.context.stdout,includeLogs:!0},async C=>{await p.install({cache:E,report:C,immutable:u,checkResolutions:v,mode:this.mode})})).exitCode()}};_0.paths=[["install"],it.Default],_0.usage=it.Usage({description:"install the project dependencies",details:"\n This command sets up your project if needed. The installation is split into four different steps that each have their own characteristics:\n\n - **Resolution:** First the package manager will resolve your dependencies. The exact way a dependency version is privileged over another isn't standardized outside of the regular semver guarantees. If a package doesn't resolve to what you would expect, check that all dependencies are correctly declared (also check our website for more information: ).\n\n - **Fetch:** Then we download all the dependencies if needed, and make sure that they're all stored within our cache (check the value of `cacheFolder` in `yarn config` to see where the cache files are stored).\n\n - **Link:** Then we send the dependency tree information to internal plugins tasked with writing them on the disk in some form (for example by generating the .pnp.cjs file you might know).\n\n - **Build:** Once the dependency tree has been written on the disk, the package manager will now be free to run the build scripts for all packages that might need it, in a topological order compatible with the way they depend on one another. See https://yarnpkg.com/advanced/lifecycle-scripts for detail.\n\n Note that running this command is not part of the recommended workflow. Yarn supports zero-installs, which means that as long as you store your cache and your .pnp.cjs file inside your repository, everything will work without requiring any install right after cloning your repository or switching branches.\n\n If the `--immutable` option is set (defaults to true on CI), Yarn will abort with an error exit code if the lockfile was to be modified (other paths can be added using the `immutablePatterns` configuration setting). For backward compatibility we offer an alias under the name of `--frozen-lockfile`, but it will be removed in a later release.\n\n If the `--immutable-cache` option is set, Yarn will abort with an error exit code if the cache folder was to be modified (either because files would be added, or because they'd be removed).\n\n If the `--refresh-lockfile` option is set, Yarn will keep the same resolution for the packages currently in the lockfile but will refresh their metadata. If used together with `--immutable`, it can validate that the lockfile information are consistent. This flag is enabled by default when Yarn detects it runs within a pull request context.\n\n If the `--check-cache` option is set, Yarn will always refetch the packages and will ensure that their checksum matches what's 1/ described in the lockfile 2/ inside the existing cache files (if present). This is recommended as part of your CI workflow if you're both following the Zero-Installs model and accepting PRs from third-parties, as they'd otherwise have the ability to alter the checked-in packages before submitting them.\n\n If the `--inline-builds` option is set, Yarn will verbosely print the output of the build steps of your dependencies (instead of writing them into individual files). This is likely useful mostly for debug purposes only when using Docker-like environments.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n ",examples:[["Install the project","$0 install"],["Validate a project when using Zero-Installs","$0 install --immutable --immutable-cache"],["Validate a project when using Zero-Installs (slightly safer if you accept external PRs)","$0 install --immutable --immutable-cache --check-cache"]]});var cht="<<<<<<<";async function uht(t,e){if(!t.projectCwd)return!1;let r=z.join(t.projectCwd,t.get("lockfileFilename"));if(!await ae.existsPromise(r)||!(await ae.readFilePromise(r,"utf8")).includes(cht))return!1;if(e)throw new Vt(47,"Cannot autofix a lockfile when running an immutable install");let a=await Mr.execvp("git",["rev-parse","MERGE_HEAD","HEAD"],{cwd:t.projectCwd});if(a.code!==0&&(a=await Mr.execvp("git",["rev-parse","REBASE_HEAD","HEAD"],{cwd:t.projectCwd})),a.code!==0&&(a=await Mr.execvp("git",["rev-parse","CHERRY_PICK_HEAD","HEAD"],{cwd:t.projectCwd})),a.code!==0)throw new Vt(83,"Git returned an error when trying to find the commits pertaining to the conflict");let n=await Promise.all(a.stdout.trim().split(/\n/).map(async A=>{let p=await Mr.execvp("git",["show",`${A}:./${Lr.lockfile}`],{cwd:t.projectCwd});if(p.code!==0)throw new Vt(83,`Git returned an error when trying to access the lockfile content in ${A}`);try{return Yi(p.stdout)}catch{throw new Vt(46,"A variant of the conflicting lockfile failed to parse")}}));n=n.filter(A=>!!A.__metadata);for(let A of n)if(A.__metadata.version<7)for(let p of Object.keys(A)){if(p==="__metadata")continue;let h=Y.parseDescriptor(p,!0),E=t.normalizeDependency(h),w=Y.stringifyDescriptor(E);w!==p&&(A[w]=A[p],delete A[p])}let u=Object.assign({},...n);u.__metadata.version=Math.min(0,...n.map(A=>A.__metadata.version??1/0)),u.__metadata.cacheKey=Math.min(0,...n.map(A=>A.__metadata.cacheKey??0));for(let[A,p]of Object.entries(u))typeof p=="string"&&delete u[A];return await ae.changeFilePromise(r,wa(u),{automaticNewlines:!0}),!0}Ke();bt();_t();var H0=class extends ct{constructor(){super(...arguments);this.all=fe.Boolean("-A,--all",!1,{description:"Link all workspaces belonging to the target projects to the current one"});this.private=fe.Boolean("-p,--private",!1,{description:"Also link private workspaces belonging to the target projects to the current one"});this.relative=fe.Boolean("-r,--relative",!1,{description:"Link workspaces using relative paths instead of absolute paths"});this.destinations=fe.Rest()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Ur.find(r);if(!a)throw new er(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=o.topLevelWorkspace,A=[];for(let h of this.destinations){let E=z.resolve(this.context.cwd,ue.toPortablePath(h)),w=await Xe.find(E,this.context.plugins,{useRc:!1,strict:!1}),{project:v,workspace:b}=await St.find(w,E);if(o.cwd===v.cwd)throw new ot(`Invalid destination '${h}'; Can't link the project to itself`);if(!b)throw new er(v.cwd,E);if(this.all){let C=!1;for(let R of v.workspaces)R.manifest.name&&(!R.manifest.private||this.private)&&(A.push(R),C=!0);if(!C)throw new ot(`No workspace found to be linked in the target project: ${h}`)}else{if(!b.manifest.name)throw new ot(`The target workspace at '${h}' doesn't have a name and thus cannot be linked`);if(b.manifest.private&&!this.private)throw new ot(`The target workspace at '${h}' is marked private - use the --private flag to link it anyway`);A.push(b)}}for(let h of A){let E=Y.stringifyIdent(h.locator),w=this.relative?z.relative(o.cwd,h.cwd):h.cwd;u.manifest.resolutions.push({pattern:{descriptor:{fullName:E}},reference:`portal:${w}`})}return(await Et.start({configuration:r,stdout:this.context.stdout},async h=>{await o.install({cache:n,report:h})})).exitCode()}};H0.paths=[["link"]],H0.usage=it.Usage({description:"connect the local project to another one",details:"\n This command will set a new `resolutions` field in the project-level manifest and point it to the workspace at the specified location (even if part of another project).\n ",examples:[["Register one or more remote workspaces for use in the current project","$0 link ~/ts-loader ~/jest"],["Register all workspaces from a remote project for use in the current project","$0 link ~/jest --all"]]});_t();var q0=class extends ct{constructor(){super(...arguments);this.args=fe.Proxy()}async execute(){return this.cli.run(["exec","node",...this.args])}};q0.paths=[["node"]],q0.usage=it.Usage({description:"run node with the hook already setup",details:` + This command simply runs Node. It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). + + The Node process will use the exact same version of Node as the one used to run Yarn itself, which might be a good way to ensure that your commands always use a consistent Node version. + `,examples:[["Run a Node script","$0 node ./my-script.js"]]});Ke();_t();var j0=class extends ct{constructor(){super(...arguments);this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),o=await Xe.findRcFiles(this.context.cwd);return(await Et.start({configuration:r,json:this.json,stdout:this.context.stdout},async n=>{var u;for(let A of o)if(!!((u=A.data)!=null&&u.plugins))for(let p of A.data.plugins){if(!p.checksum||!p.spec.match(/^https?:/))continue;let h=await ln.get(p.spec,{configuration:r}),E=bn.makeHash(h);if(p.checksum===E)continue;let w=ye.pretty(r,p.path,ye.Type.PATH),v=ye.pretty(r,p.spec,ye.Type.URL),b=`${w} is different from the file provided by ${v}`;n.reportJson({...p,newChecksum:E}),n.reportError(0,b)}})).exitCode()}};j0.paths=[["plugin","check"]],j0.usage=it.Usage({category:"Plugin-related commands",description:"find all third-party plugins that differ from their own spec",details:` + Check only the plugins from https. + + If this command detects any plugin differences in the CI environment, it will throw an error. + `,examples:[["find all third-party plugins that differ from their own spec","$0 plugin check"]]});Ke();Ke();bt();_t();var Sde=Ie("os");Ke();bt();_t();var Ide=Ie("os");Ke();_l();_t();var Aht="https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml";async function Zd(t,e){let r=await ln.get(Aht,{configuration:t}),o=Yi(r.toString());return Object.fromEntries(Object.entries(o).filter(([a,n])=>!e||Tr.satisfiesWithPrereleases(e,n.range??"<4.0.0-rc.1")))}var G0=class extends ct{constructor(){super(...arguments);this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins);return(await Et.start({configuration:r,json:this.json,stdout:this.context.stdout},async a=>{let n=await Zd(r,On);for(let[u,{experimental:A,...p}]of Object.entries(n)){let h=u;A&&(h+=" [experimental]"),a.reportJson({name:u,experimental:A,...p}),a.reportInfo(null,h)}})).exitCode()}};G0.paths=[["plugin","list"]],G0.usage=it.Usage({category:"Plugin-related commands",description:"list the available official plugins",details:"\n This command prints the plugins available directly from the Yarn repository. Only those plugins can be referenced by name in `yarn plugin import`.\n ",examples:[["List the official plugins","$0 plugin list"]]});var fht=/^[0-9]+$/;function wde(t){return fht.test(t)?`pull/${t}/head`:t}var pht=({repository:t,branch:e},r)=>[["git","init",ue.fromPortablePath(r)],["git","remote","add","origin",t],["git","fetch","origin","--depth=1",wde(e)],["git","reset","--hard","FETCH_HEAD"]],hht=({branch:t})=>[["git","fetch","origin","--depth=1",wde(t),"--force"],["git","reset","--hard","FETCH_HEAD"],["git","clean","-dfx"]],ght=({plugins:t,noMinify:e},r)=>[["yarn","build:cli",...new Array().concat(...t.map(o=>["--plugin",z.resolve(r,o)])),...e?["--no-minify"]:[],"|"]],W0=class extends ct{constructor(){super(...arguments);this.installPath=fe.String("--path",{description:"The path where the repository should be cloned to"});this.repository=fe.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=fe.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.plugins=fe.Array("--plugin",[],{description:"An array of additional plugins that should be included in the bundle"});this.noMinify=fe.Boolean("--no-minify",!1,{description:"Build a bundle for development (debugging) - non-minified and non-mangled"});this.force=fe.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.skipPlugins=fe.Boolean("--skip-plugins",!1,{description:"Skip updating the contrib plugins"})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd),a=typeof this.installPath<"u"?z.resolve(this.context.cwd,ue.toPortablePath(this.installPath)):z.resolve(ue.toPortablePath((0,Ide.tmpdir)()),"yarnpkg-sources",bn.makeHash(this.repository).slice(0,6));return(await Et.start({configuration:r,stdout:this.context.stdout},async u=>{await L8(this,{configuration:r,report:u,target:a}),u.reportSeparator(),u.reportInfo(0,"Building a fresh bundle"),u.reportSeparator(),await n2(ght(this,a),{configuration:r,context:this.context,target:a}),u.reportSeparator();let A=z.resolve(a,"packages/yarnpkg-cli/bundles/yarn.js"),p=await ae.readFilePromise(A),{bundleVersion:h}=await N8(r,null,async()=>p,{report:u});this.skipPlugins||await dht(this,h,{project:o,report:u,target:a})})).exitCode()}};W0.paths=[["set","version","from","sources"]],W0.usage=it.Usage({description:"build Yarn from master",details:` + This command will clone the Yarn repository into a temporary folder, then build it. The resulting bundle will then be copied into the local project. + + By default, it also updates all contrib plugins to the same commit the bundle is built from. This behavior can be disabled by using the \`--skip-plugins\` flag. + `,examples:[["Build Yarn from master","$0 set version from sources"]]});async function n2(t,{configuration:e,context:r,target:o}){for(let[a,...n]of t){let u=n[n.length-1]==="|";if(u&&n.pop(),u)await Mr.pipevp(a,n,{cwd:o,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,strict:!0});else{r.stdout.write(`${ye.pretty(e,` $ ${[a,...n].join(" ")}`,"grey")} +`);try{await Mr.execvp(a,n,{cwd:o,strict:!0})}catch(A){throw r.stdout.write(A.stdout||A.stack),A}}}}async function L8(t,{configuration:e,report:r,target:o}){let a=!1;if(!t.force&&ae.existsSync(z.join(o,".git"))){r.reportInfo(0,"Fetching the latest commits"),r.reportSeparator();try{await n2(hht(t),{configuration:e,context:t.context,target:o}),a=!0}catch{r.reportSeparator(),r.reportWarning(0,"Repository update failed; we'll try to regenerate it")}}a||(r.reportInfo(0,"Cloning the remote repository"),r.reportSeparator(),await ae.removePromise(o),await ae.mkdirPromise(o,{recursive:!0}),await n2(pht(t,o),{configuration:e,context:t.context,target:o}))}async function dht(t,e,{project:r,report:o,target:a}){let n=await Zd(r.configuration,e),u=new Set(Object.keys(n));for(let A of r.configuration.plugins.keys())!u.has(A)||await O8(A,t,{project:r,report:o,target:a})}Ke();Ke();bt();_t();var Bde=tt(si()),vde=Ie("url"),Dde=Ie("vm");var Y0=class extends ct{constructor(){super(...arguments);this.name=fe.String();this.checksum=fe.Boolean("--checksum",!0,{description:"Whether to care if this plugin is modified"})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins);return(await Et.start({configuration:r,stdout:this.context.stdout},async a=>{let{project:n}=await St.find(r,this.context.cwd),u,A;if(this.name.match(/^\.{0,2}[\\/]/)||ue.isAbsolute(this.name)){let p=z.resolve(this.context.cwd,ue.toPortablePath(this.name));a.reportInfo(0,`Reading ${ye.pretty(r,p,ye.Type.PATH)}`),u=z.relative(n.cwd,p),A=await ae.readFilePromise(p)}else{let p;if(this.name.match(/^https?:/)){try{new vde.URL(this.name)}catch{throw new Vt(52,`Plugin specifier "${this.name}" is neither a plugin name nor a valid url`)}u=this.name,p=this.name}else{let h=Y.parseLocator(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-"));if(h.reference!=="unknown"&&!Bde.default.valid(h.reference))throw new Vt(0,"Official plugins only accept strict version references. Use an explicit URL if you wish to download them from another location.");let E=Y.stringifyIdent(h),w=await Zd(r,On);if(!Object.prototype.hasOwnProperty.call(w,E)){let v=`Couldn't find a plugin named ${Y.prettyIdent(r,h)} on the remote registry. +`;throw r.plugins.has(E)?v+=`A plugin named ${Y.prettyIdent(r,h)} is already installed; possibly attempting to import a built-in plugin.`:v+=`Note that only the plugins referenced on our website (${ye.pretty(r,"https://github.com/yarnpkg/berry/blob/master/plugins.yml",ye.Type.URL)}) can be referenced by their name; any other plugin will have to be referenced through its public url (for example ${ye.pretty(r,"https://github.com/yarnpkg/berry/raw/master/packages/plugin-typescript/bin/%40yarnpkg/plugin-typescript.js",ye.Type.URL)}).`,new Vt(51,v)}u=E,p=w[E].url,h.reference!=="unknown"?p=p.replace(/\/master\//,`/${E}/${h.reference}/`):On!==null&&(p=p.replace(/\/master\//,`/@yarnpkg/cli/${On}/`))}a.reportInfo(0,`Downloading ${ye.pretty(r,p,"green")}`),A=await ln.get(p,{configuration:r})}await M8(u,A,{checksum:this.checksum,project:n,report:a})})).exitCode()}};Y0.paths=[["plugin","import"]],Y0.usage=it.Usage({category:"Plugin-related commands",description:"download a plugin",details:` + This command downloads the specified plugin from its remote location and updates the configuration to reference it in further CLI invocations. + + Three types of plugin references are accepted: + + - If the plugin is stored within the Yarn repository, it can be referenced by name. + - Third-party plugins can be referenced directly through their public urls. + - Local plugins can be referenced by their path on the disk. + + If the \`--no-checksum\` option is set, Yarn will no longer care if the plugin is modified. + + Plugins cannot be downloaded from the npm registry, and aren't allowed to have dependencies (they need to be bundled into a single file, possibly thanks to the \`@yarnpkg/builder\` package). + `,examples:[['Download and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import @yarnpkg/plugin-exec"],['Download and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import exec"],["Download and activate a community plugin","$0 plugin import https://example.org/path/to/plugin.js"],["Activate a local plugin","$0 plugin import ./path/to/plugin.js"]]});async function M8(t,e,{checksum:r=!0,project:o,report:a}){let{configuration:n}=o,u={},A={exports:u};(0,Dde.runInNewContext)(e.toString(),{module:A,exports:u});let h=`.yarn/plugins/${A.exports.name}.cjs`,E=z.resolve(o.cwd,h);a.reportInfo(0,`Saving the new plugin in ${ye.pretty(n,h,"magenta")}`),await ae.mkdirPromise(z.dirname(E),{recursive:!0}),await ae.writeFilePromise(E,e);let w={path:h,spec:t};r&&(w.checksum=bn.makeHash(e)),await Xe.addPlugin(o.cwd,[w])}var mht=({pluginName:t,noMinify:e},r)=>[["yarn",`build:${t}`,...e?["--no-minify"]:[],"|"]],K0=class extends ct{constructor(){super(...arguments);this.installPath=fe.String("--path",{description:"The path where the repository should be cloned to"});this.repository=fe.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=fe.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.noMinify=fe.Boolean("--no-minify",!1,{description:"Build a plugin for development (debugging) - non-minified and non-mangled"});this.force=fe.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.name=fe.String()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),o=typeof this.installPath<"u"?z.resolve(this.context.cwd,ue.toPortablePath(this.installPath)):z.resolve(ue.toPortablePath((0,Sde.tmpdir)()),"yarnpkg-sources",bn.makeHash(this.repository).slice(0,6));return(await Et.start({configuration:r,stdout:this.context.stdout},async n=>{let{project:u}=await St.find(r,this.context.cwd),A=Y.parseIdent(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-")),p=Y.stringifyIdent(A),h=await Zd(r,On);if(!Object.prototype.hasOwnProperty.call(h,p))throw new Vt(51,`Couldn't find a plugin named "${p}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be built and imported from sources.`);let E=p;await L8(this,{configuration:r,report:n,target:o}),await O8(E,this,{project:u,report:n,target:o})})).exitCode()}};K0.paths=[["plugin","import","from","sources"]],K0.usage=it.Usage({category:"Plugin-related commands",description:"build a plugin from sources",details:` + This command clones the Yarn repository into a temporary folder, builds the specified contrib plugin and updates the configuration to reference it in further CLI invocations. + + The plugins can be referenced by their short name if sourced from the official Yarn repository. + `,examples:[['Build and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import from sources @yarnpkg/plugin-exec"],['Build and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import from sources exec"]]});async function O8(t,{context:e,noMinify:r},{project:o,report:a,target:n}){let u=t.replace(/@yarnpkg\//,""),{configuration:A}=o;a.reportSeparator(),a.reportInfo(0,`Building a fresh ${u}`),a.reportSeparator(),await n2(mht({pluginName:u,noMinify:r},n),{configuration:A,context:e,target:n}),a.reportSeparator();let p=z.resolve(n,`packages/${u}/bundles/${t}.js`),h=await ae.readFilePromise(p);await M8(t,h,{project:o,report:a})}Ke();bt();_t();var V0=class extends ct{constructor(){super(...arguments);this.name=fe.String()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd);return(await Et.start({configuration:r,stdout:this.context.stdout},async n=>{let u=this.name,A=Y.parseIdent(u);if(!r.plugins.has(u))throw new ot(`${Y.prettyIdent(r,A)} isn't referenced by the current configuration`);let p=`.yarn/plugins/${u}.cjs`,h=z.resolve(o.cwd,p);ae.existsSync(h)&&(n.reportInfo(0,`Removing ${ye.pretty(r,p,ye.Type.PATH)}...`),await ae.removePromise(h)),n.reportInfo(0,"Updating the configuration..."),await Xe.updateConfiguration(o.cwd,E=>{if(!Array.isArray(E.plugins))return E;let w=E.plugins.filter(v=>v.path!==p);return E.plugins.length===w.length?E:{...E,plugins:w}})})).exitCode()}};V0.paths=[["plugin","remove"]],V0.usage=it.Usage({category:"Plugin-related commands",description:"remove a plugin",details:` + This command deletes the specified plugin from the .yarn/plugins folder and removes it from the configuration. + + **Note:** The plugins have to be referenced by their name property, which can be obtained using the \`yarn plugin runtime\` command. Shorthands are not allowed. + `,examples:[["Remove a plugin imported from the Yarn repository","$0 plugin remove @yarnpkg/plugin-typescript"],["Remove a plugin imported from a local file","$0 plugin remove my-local-plugin"]]});Ke();_t();var J0=class extends ct{constructor(){super(...arguments);this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins);return(await Et.start({configuration:r,json:this.json,stdout:this.context.stdout},async a=>{for(let n of r.plugins.keys()){let u=this.context.plugins.plugins.has(n),A=n;u&&(A+=" [builtin]"),a.reportJson({name:n,builtin:u}),a.reportInfo(null,`${A}`)}})).exitCode()}};J0.paths=[["plugin","runtime"]],J0.usage=it.Usage({category:"Plugin-related commands",description:"list the active plugins",details:` + This command prints the currently active plugins. Will be displayed both builtin plugins and external plugins. + `,examples:[["List the currently active plugins","$0 plugin runtime"]]});Ke();Ke();_t();var z0=class extends ct{constructor(){super(...arguments);this.idents=fe.Rest()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Ur.find(r);if(!a)throw new er(o.cwd,this.context.cwd);let u=new Set;for(let p of this.idents)u.add(Y.parseIdent(p).identHash);if(await o.restoreInstallState({restoreResolutions:!1}),await o.resolveEverything({cache:n,report:new xi}),u.size>0)for(let p of o.storedPackages.values())u.has(p.identHash)&&o.storedBuildState.delete(p.locatorHash);else o.storedBuildState.clear();return(await Et.start({configuration:r,stdout:this.context.stdout,includeLogs:!this.context.quiet},async p=>{await o.install({cache:n,report:p})})).exitCode()}};z0.paths=[["rebuild"]],z0.usage=it.Usage({description:"rebuild the project's native packages",details:` + This command will automatically cause Yarn to forget about previous compilations of the given packages and to run them again. + + Note that while Yarn forgets the compilation, the previous artifacts aren't erased from the filesystem and may affect the next builds (in good or bad). To avoid this, you may remove the .yarn/unplugged folder, or any other relevant location where packages might have been stored (Yarn may offer a way to do that automatically in the future). + + By default all packages will be rebuilt, but you can filter the list by specifying the names of the packages you want to clear from memory. + `,examples:[["Rebuild all packages","$0 rebuild"],["Rebuild fsevents only","$0 rebuild fsevents"]]});Ke();Ke();Ke();_t();var U8=tt(Jo());tl();var X0=class extends ct{constructor(){super(...arguments);this.all=fe.Boolean("-A,--all",!1,{description:"Apply the operation to all workspaces from the current project"});this.mode=fe.String("--mode",{description:"Change what artifacts installs generate",validator:Gs(gl)});this.patterns=fe.Rest()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Ur.find(r);if(!a)throw new er(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=this.all?o.workspaces:[a],A=["dependencies","devDependencies","peerDependencies"],p=[],h=!1,E=[];for(let C of this.patterns){let R=!1,L=Y.parseIdent(C);for(let _ of u){let V=[..._.manifest.peerDependenciesMeta.keys()];for(let re of(0,U8.default)(V,C))_.manifest.peerDependenciesMeta.delete(re),h=!0,R=!0;for(let re of A){let oe=_.manifest.getForScope(re),pe=[...oe.values()].map(he=>Y.stringifyIdent(he));for(let he of(0,U8.default)(pe,Y.stringifyIdent(L))){let{identHash:ve}=Y.parseIdent(he),ge=oe.get(ve);if(typeof ge>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");_.manifest[re].delete(ve),E.push([_,re,ge]),h=!0,R=!0}}}R||p.push(C)}let w=p.length>1?"Patterns":"Pattern",v=p.length>1?"don't":"doesn't",b=this.all?"any":"this";if(p.length>0)throw new ot(`${w} ${ye.prettyList(r,p,ye.Type.CODE)} ${v} match any packages referenced by ${b} workspace`);return h?(await r.triggerMultipleHooks(R=>R.afterWorkspaceDependencyRemoval,E),(await Et.start({configuration:r,stdout:this.context.stdout},async R=>{await o.install({cache:n,report:R,mode:this.mode})})).exitCode()):0}};X0.paths=[["remove"]],X0.usage=it.Usage({description:"remove dependencies from the project",details:` + This command will remove the packages matching the specified patterns from the current workspace. + + If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: + + - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run. + + - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. + + This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them. + `,examples:[["Remove a dependency from the current project","$0 remove lodash"],["Remove a dependency from all workspaces at once","$0 remove lodash --all"],["Remove all dependencies starting with `eslint-`","$0 remove 'eslint-*'"],["Remove all dependencies with the `@babel` scope","$0 remove '@babel/*'"],["Remove all dependencies matching `react-dom` or `react-helmet`","$0 remove 'react-{dom,helmet}'"]]});Ke();Ke();var Pde=Ie("util"),$d=class extends ct{async execute(){let e=await Xe.find(this.context.cwd,this.context.plugins),{project:r,workspace:o}=await St.find(e,this.context.cwd);if(!o)throw new er(r.cwd,this.context.cwd);return(await Et.start({configuration:e,stdout:this.context.stdout},async n=>{let u=o.manifest.scripts,A=Ye.sortMap(u.keys(),E=>E),p={breakLength:1/0,colors:e.get("enableColors"),maxArrayLength:2},h=A.reduce((E,w)=>Math.max(E,w.length),0);for(let[E,w]of u.entries())n.reportInfo(null,`${E.padEnd(h," ")} ${(0,Pde.inspect)(w,p)}`)})).exitCode()}};$d.paths=[["run"]];Ke();Ke();_t();var Z0=class extends ct{constructor(){super(...arguments);this.inspect=fe.String("--inspect",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.inspectBrk=fe.String("--inspect-brk",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.topLevel=fe.Boolean("-T,--top-level",!1,{description:"Check the root workspace for scripts and/or binaries instead of the current one"});this.binariesOnly=fe.Boolean("-B,--binaries-only",!1,{description:"Ignore any user defined scripts and only check for binaries"});this.require=fe.String("--require",{description:"Forwarded to the underlying Node process when executing a binary"});this.silent=fe.Boolean("--silent",{hidden:!0});this.scriptName=fe.String();this.args=fe.Proxy()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a,locator:n}=await St.find(r,this.context.cwd);await o.restoreInstallState();let u=this.topLevel?o.topLevelWorkspace.anchoredLocator:n;if(!this.binariesOnly&&await sn.hasPackageScript(u,this.scriptName,{project:o}))return await sn.executePackageScript(u,this.scriptName,this.args,{project:o,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});let A=await sn.getPackageAccessibleBinaries(u,{project:o});if(A.get(this.scriptName)){let h=[];return this.inspect&&(typeof this.inspect=="string"?h.push(`--inspect=${this.inspect}`):h.push("--inspect")),this.inspectBrk&&(typeof this.inspectBrk=="string"?h.push(`--inspect-brk=${this.inspectBrk}`):h.push("--inspect-brk")),this.require&&h.push(`--require=${this.require}`),await sn.executePackageAccessibleBinary(u,this.scriptName,this.args,{cwd:this.context.cwd,project:o,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:h,packageAccessibleBinaries:A})}if(!this.topLevel&&!this.binariesOnly&&a&&this.scriptName.includes(":")){let E=(await Promise.all(o.workspaces.map(async w=>w.manifest.scripts.has(this.scriptName)?w:null))).filter(w=>w!==null);if(E.length===1)return await sn.executeWorkspaceScript(E[0],this.scriptName,this.args,{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}if(this.topLevel)throw this.scriptName==="node-gyp"?new ot(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${Y.prettyLocator(r,n)}). This typically happens because some package depends on "node-gyp" to build itself, but didn't list it in their dependencies. To fix that, please run "yarn add node-gyp" into your top-level workspace. You also can open an issue on the repository of the specified package to suggest them to use an optional peer dependency.`):new ot(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${Y.prettyLocator(r,n)}).`);{if(this.scriptName==="global")throw new ot("The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead");let h=[this.scriptName].concat(this.args);for(let[E,w]of lE)for(let v of w)if(h.length>=v.length&&JSON.stringify(h.slice(0,v.length))===JSON.stringify(v))throw new ot(`Couldn't find a script named "${this.scriptName}", but a matching command can be found in the ${E} plugin. You can install it with "yarn plugin import ${E}".`);throw new ot(`Couldn't find a script named "${this.scriptName}".`)}}};Z0.paths=[["run"]],Z0.usage=it.Usage({description:"run a script defined in the package.json",details:` + This command will run a tool. The exact tool that will be executed will depend on the current state of your workspace: + + - If the \`scripts\` field from your local package.json contains a matching script name, its definition will get executed. + + - Otherwise, if one of the local workspace's dependencies exposes a binary with a matching name, this binary will get executed. + + - Otherwise, if the specified name contains a colon character and if one of the workspaces in the project contains exactly one script with a matching name, then this script will get executed. + + Whatever happens, the cwd of the spawned process will be the workspace that declares the script (which makes it possible to call commands cross-workspaces using the third syntax). + `,examples:[["Run the tests from the local workspace","$0 run test"],['Same thing, but without the "run" keyword',"$0 test"],["Inspect Webpack while running","$0 run --inspect-brk webpack"]]});Ke();Ke();_t();var $0=class extends ct{constructor(){super(...arguments);this.save=fe.Boolean("-s,--save",!1,{description:"Persist the resolution inside the top-level manifest"});this.descriptor=fe.String();this.resolution=fe.String()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Ur.find(r);if(await o.restoreInstallState({restoreResolutions:!1}),!a)throw new er(o.cwd,this.context.cwd);let u=Y.parseDescriptor(this.descriptor,!0),A=Y.makeDescriptor(u,this.resolution);return o.storedDescriptors.set(u.descriptorHash,u),o.storedDescriptors.set(A.descriptorHash,A),o.resolutionAliases.set(u.descriptorHash,A.descriptorHash),(await Et.start({configuration:r,stdout:this.context.stdout},async h=>{await o.install({cache:n,report:h})})).exitCode()}};$0.paths=[["set","resolution"]],$0.usage=it.Usage({description:"enforce a package resolution",details:'\n This command updates the resolution table so that `descriptor` is resolved by `resolution`.\n\n Note that by default this command only affect the current resolution table - meaning that this "manual override" will disappear if you remove the lockfile, or if the package disappear from the table. If you wish to make the enforced resolution persist whatever happens, add the `-s,--save` flag which will also edit the `resolutions` field from your top-level manifest.\n\n Note that no attempt is made at validating that `resolution` is a valid resolution entry for `descriptor`.\n ',examples:[["Force all instances of lodash@npm:^1.2.3 to resolve to 1.5.0","$0 set resolution lodash@npm:^1.2.3 1.5.0"]]});Ke();bt();_t();var xde=tt(Jo()),eh=class extends ct{constructor(){super(...arguments);this.all=fe.Boolean("-A,--all",!1,{description:"Unlink all workspaces belonging to the target project from the current one"});this.leadingArguments=fe.Rest()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Ur.find(r);if(!a)throw new er(o.cwd,this.context.cwd);let u=o.topLevelWorkspace,A=new Set;if(this.leadingArguments.length===0&&this.all)for(let{pattern:h,reference:E}of u.manifest.resolutions)E.startsWith("portal:")&&A.add(h.descriptor.fullName);if(this.leadingArguments.length>0)for(let h of this.leadingArguments){let E=z.resolve(this.context.cwd,ue.toPortablePath(h));if(Ye.isPathLike(h)){let w=await Xe.find(E,this.context.plugins,{useRc:!1,strict:!1}),{project:v,workspace:b}=await St.find(w,E);if(!b)throw new er(v.cwd,E);if(this.all){for(let C of v.workspaces)C.manifest.name&&A.add(Y.stringifyIdent(C.locator));if(A.size===0)throw new ot("No workspace found to be unlinked in the target project")}else{if(!b.manifest.name)throw new ot("The target workspace doesn't have a name and thus cannot be unlinked");A.add(Y.stringifyIdent(b.locator))}}else{let w=[...u.manifest.resolutions.map(({pattern:v})=>v.descriptor.fullName)];for(let v of(0,xde.default)(w,h))A.add(v)}}return u.manifest.resolutions=u.manifest.resolutions.filter(({pattern:h})=>!A.has(h.descriptor.fullName)),(await Et.start({configuration:r,stdout:this.context.stdout},async h=>{await o.install({cache:n,report:h})})).exitCode()}};eh.paths=[["unlink"]],eh.usage=it.Usage({description:"disconnect the local project from another one",details:` + This command will remove any resolutions in the project-level manifest that would have been added via a yarn link with similar arguments. + `,examples:[["Unregister a remote workspace in the current project","$0 unlink ~/ts-loader"],["Unregister all workspaces from a remote project in the current project","$0 unlink ~/jest --all"],["Unregister all previously linked workspaces","$0 unlink --all"],["Unregister all workspaces matching a glob","$0 unlink '@babel/*' 'pkg-{a,b}'"]]});Ke();Ke();Ke();_t();var bde=tt(z1()),_8=tt(Jo());tl();var Vf=class extends ct{constructor(){super(...arguments);this.interactive=fe.Boolean("-i,--interactive",{description:"Offer various choices, depending on the detected upgrade paths"});this.fixed=fe.Boolean("-F,--fixed",!1,{description:"Store dependency tags as-is instead of resolving them"});this.exact=fe.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=fe.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=fe.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.recursive=fe.Boolean("-R,--recursive",!1,{description:"Resolve again ALL resolutions for those packages"});this.mode=fe.String("--mode",{description:"Change what artifacts installs generate",validator:Gs(gl)});this.patterns=fe.Rest()}async execute(){return this.recursive?await this.executeUpRecursive():await this.executeUpClassic()}async executeUpRecursive(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Ur.find(r);if(!a)throw new er(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=[...o.storedDescriptors.values()],A=u.map(w=>Y.stringifyIdent(w)),p=new Set;for(let w of this.patterns){if(Y.parseDescriptor(w).range!=="unknown")throw new ot("Ranges aren't allowed when using --recursive");for(let v of(0,_8.default)(A,w)){let b=Y.parseIdent(v);p.add(b.identHash)}}let h=u.filter(w=>p.has(w.identHash));for(let w of h)o.storedDescriptors.delete(w.descriptorHash),o.storedResolutions.delete(w.descriptorHash);return(await Et.start({configuration:r,stdout:this.context.stdout},async w=>{await o.install({cache:n,report:w})})).exitCode()}async executeUpClassic(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Ur.find(r);if(!a)throw new er(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=this.fixed,A=this.interactive??r.get("preferInteractive"),p=Z1(this,o),h=A?["keep","reuse","project","latest"]:["project","latest"],E=[],w=[];for(let _ of this.patterns){let V=!1,re=Y.parseDescriptor(_);for(let oe of o.workspaces)for(let pe of["dependencies","devDependencies"]){let ve=[...oe.manifest.getForScope(pe).values()].map(ge=>Y.stringifyIdent(ge));for(let ge of(0,_8.default)(ve,Y.stringifyIdent(re))){let le=Y.parseIdent(ge),Pe=oe.manifest[pe].get(le.identHash);if(typeof Pe>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");let g=Y.makeDescriptor(le,re.range);E.push(Promise.resolve().then(async()=>[oe,pe,Pe,await $1(g,{project:o,workspace:oe,cache:n,target:pe,fixed:u,modifier:p,strategies:h})])),V=!0}}V||w.push(_)}if(w.length>1)throw new ot(`Patterns ${ye.prettyList(r,w,ye.Type.CODE)} don't match any packages referenced by any workspace`);if(w.length>0)throw new ot(`Pattern ${ye.prettyList(r,w,ye.Type.CODE)} doesn't match any packages referenced by any workspace`);let v=await Promise.all(E),b=await pA.start({configuration:r,stdout:this.context.stdout,suggestInstall:!1},async _=>{for(let[,,V,{suggestions:re,rejections:oe}]of v){let pe=re.filter(he=>he.descriptor!==null);if(pe.length===0){let[he]=oe;if(typeof he>"u")throw new Error("Assertion failed: Expected an error to have been set");let ve=this.cli.error(he);o.configuration.get("enableNetwork")?_.reportError(27,`${Y.prettyDescriptor(r,V)} can't be resolved to a satisfying range + +${ve}`):_.reportError(27,`${Y.prettyDescriptor(r,V)} can't be resolved to a satisfying range (note: network resolution has been disabled) + +${ve}`)}else pe.length>1&&!A&&_.reportError(27,`${Y.prettyDescriptor(r,V)} has multiple possible upgrade strategies; use -i to disambiguate manually`)}});if(b.hasErrors())return b.exitCode();let C=!1,R=[];for(let[_,V,,{suggestions:re}]of v){let oe,pe=re.filter(le=>le.descriptor!==null),he=pe[0].descriptor,ve=pe.every(le=>Y.areDescriptorsEqual(le.descriptor,he));pe.length===1||ve?oe=he:(C=!0,{answer:oe}=await(0,bde.prompt)({type:"select",name:"answer",message:`Which range do you want to use in ${Y.prettyWorkspace(r,_)} \u276F ${V}?`,choices:re.map(({descriptor:le,name:Pe,reason:g})=>le?{name:Pe,hint:g,descriptor:le}:{name:Pe,hint:g,disabled:!0}),onCancel:()=>process.exit(130),result(le){return this.find(le,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let ge=_.manifest[V].get(oe.identHash);if(typeof ge>"u")throw new Error("Assertion failed: This descriptor should have a matching entry");if(ge.descriptorHash!==oe.descriptorHash)_.manifest[V].set(oe.identHash,oe),R.push([_,V,ge,oe]);else{let le=r.makeResolver(),Pe={project:o,resolver:le},g=r.normalizeDependency(ge),De=le.bindDescriptor(g,_.anchoredLocator,Pe);o.forgetResolution(De)}}return await r.triggerMultipleHooks(_=>_.afterWorkspaceDependencyReplacement,R),C&&this.context.stdout.write(` +`),(await Et.start({configuration:r,stdout:this.context.stdout},async _=>{await o.install({cache:n,report:_,mode:this.mode})})).exitCode()}};Vf.paths=[["up"]],Vf.usage=it.Usage({description:"upgrade dependencies across the project",details:"\n This command upgrades the packages matching the list of specified patterns to their latest available version across the whole project (regardless of whether they're part of `dependencies` or `devDependencies` - `peerDependencies` won't be affected). This is a project-wide command: all workspaces will be upgraded in the process.\n\n If `-R,--recursive` is set the command will change behavior and no other switch will be allowed. When operating under this mode `yarn up` will force all ranges matching the selected packages to be resolved again (often to the highest available versions) before being stored in the lockfile. It however won't touch your manifests anymore, so depending on your needs you might want to run both `yarn up` and `yarn up -R` to cover all bases.\n\n If `-i,--interactive` is set (or if the `preferInteractive` settings is toggled on) the command will offer various choices, depending on the detected upgrade paths. Some upgrades require this flag in order to resolve ambiguities.\n\n The, `-C,--caret`, `-E,--exact` and `-T,--tilde` options have the same meaning as in the `add` command (they change the modifier used when the range is missing or a tag, and are ignored when the range is explicitly set).\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n Generally you can see `yarn up` as a counterpart to what was `yarn upgrade --latest` in Yarn 1 (ie it ignores the ranges previously listed in your manifests), but unlike `yarn upgrade` which only upgraded dependencies in the current workspace, `yarn up` will upgrade all workspaces at the same time.\n\n This command accepts glob patterns as arguments (if valid Descriptors and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n **Note:** The ranges have to be static, only the package scopes and names can contain glob patterns.\n ",examples:[["Upgrade all instances of lodash to the latest release","$0 up lodash"],["Upgrade all instances of lodash to the latest release, but ask confirmation for each","$0 up lodash -i"],["Upgrade all instances of lodash to 1.2.3","$0 up lodash@1.2.3"],["Upgrade all instances of packages with the `@babel` scope to the latest release","$0 up '@babel/*'"],["Upgrade all instances of packages containing the word `jest` to the latest release","$0 up '*jest*'"],["Upgrade all instances of packages with the `@babel` scope to 7.0.0","$0 up '@babel/*@7.0.0'"]]}),Vf.schema=[UT("recursive",Zg.Forbids,["interactive","exact","tilde","caret"],{ignore:[void 0,!1]})];Ke();Ke();Ke();_t();var th=class extends ct{constructor(){super(...arguments);this.recursive=fe.Boolean("-R,--recursive",!1,{description:"List, for each workspace, what are all the paths that lead to the dependency"});this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.peers=fe.Boolean("--peers",!1,{description:"Also print the peer dependencies that match the specified name"});this.package=fe.String()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new er(o.cwd,this.context.cwd);await o.restoreInstallState();let n=Y.parseIdent(this.package).identHash,u=this.recursive?Cht(o,n,{configuration:r,peers:this.peers}):yht(o,n,{configuration:r,peers:this.peers});Zo.emitTree(u,{configuration:r,stdout:this.context.stdout,json:this.json,separators:1})}};th.paths=[["why"]],th.usage=it.Usage({description:"display the reason why a package is needed",details:` + This command prints the exact reasons why a package appears in the dependency tree. + + If \`-R,--recursive\` is set, the listing will go in depth and will list, for each workspaces, what are all the paths that lead to the dependency. Note that the display is somewhat optimized in that it will not print the package listing twice for a single package, so if you see a leaf named "Foo" when looking for "Bar", it means that "Foo" already got printed higher in the tree. + `,examples:[["Explain why lodash is used in your project","$0 why lodash"]]});function yht(t,e,{configuration:r,peers:o}){let a=Ye.sortMap(t.storedPackages.values(),A=>Y.stringifyLocator(A)),n={},u={children:n};for(let A of a){let p={};for(let E of A.dependencies.values()){if(!o&&A.peerDependencies.has(E.identHash))continue;let w=t.storedResolutions.get(E.descriptorHash);if(!w)throw new Error("Assertion failed: The resolution should have been registered");let v=t.storedPackages.get(w);if(!v)throw new Error("Assertion failed: The package should have been registered");if(v.identHash!==e)continue;{let C=Y.stringifyLocator(A);n[C]={value:[A,ye.Type.LOCATOR],children:p}}let b=Y.stringifyLocator(v);p[b]={value:[{descriptor:E,locator:v},ye.Type.DEPENDENT]}}}return u}function Cht(t,e,{configuration:r,peers:o}){let a=Ye.sortMap(t.workspaces,v=>Y.stringifyLocator(v.anchoredLocator)),n=new Set,u=new Set,A=v=>{if(n.has(v.locatorHash))return u.has(v.locatorHash);if(n.add(v.locatorHash),v.identHash===e)return u.add(v.locatorHash),!0;let b=!1;v.identHash===e&&(b=!0);for(let C of v.dependencies.values()){if(!o&&v.peerDependencies.has(C.identHash))continue;let R=t.storedResolutions.get(C.descriptorHash);if(!R)throw new Error("Assertion failed: The resolution should have been registered");let L=t.storedPackages.get(R);if(!L)throw new Error("Assertion failed: The package should have been registered");A(L)&&(b=!0)}return b&&u.add(v.locatorHash),b};for(let v of a)A(v.anchoredPackage);let p=new Set,h={},E={children:h},w=(v,b,C)=>{if(!u.has(v.locatorHash))return;let R=C!==null?ye.tuple(ye.Type.DEPENDENT,{locator:v,descriptor:C}):ye.tuple(ye.Type.LOCATOR,v),L={},_={value:R,children:L},V=Y.stringifyLocator(v);if(b[V]=_,!p.has(v.locatorHash)&&(p.add(v.locatorHash),!(C!==null&&t.tryWorkspaceByLocator(v))))for(let re of v.dependencies.values()){if(!o&&v.peerDependencies.has(re.identHash))continue;let oe=t.storedResolutions.get(re.descriptorHash);if(!oe)throw new Error("Assertion failed: The resolution should have been registered");let pe=t.storedPackages.get(oe);if(!pe)throw new Error("Assertion failed: The package should have been registered");w(pe,L,re)}};for(let v of a)w(v.anchoredPackage,h,null);return E}Ke();var X8={};Yt(X8,{GitFetcher:()=>s2,GitResolver:()=>o2,default:()=>Uht,gitUtils:()=>$o});Ke();bt();var $o={};Yt($o,{TreeishProtocols:()=>i2,clone:()=>z8,fetchBase:()=>Xde,fetchChangedFiles:()=>Zde,fetchChangedWorkspaces:()=>Oht,fetchRoot:()=>zde,isGitUrl:()=>gE,lsRemote:()=>Jde,normalizeLocator:()=>K8,normalizeRepoUrl:()=>oQ,resolveUrl:()=>J8,splitRepoUrl:()=>rh,validateRepoUrl:()=>V8});Ke();bt();_t();var Yde=tt(jde()),Kde=tt(EU()),hE=tt(Ie("querystring")),W8=tt(si());function G8(t,e,r){let o=t.indexOf(r);return t.lastIndexOf(e,o>-1?o:1/0)}function Gde(t){try{return new URL(t)}catch{return}}function Nht(t){let e=G8(t,"@","#"),r=G8(t,":","#");return r>e&&(t=`${t.slice(0,r)}/${t.slice(r+1)}`),G8(t,":","#")===-1&&t.indexOf("//")===-1&&(t=`ssh://${t}`),t}function Wde(t){return Gde(t)||Gde(Nht(t))}function Vde(){return{...process.env,GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND||`${process.env.GIT_SSH||"ssh"} -o BatchMode=yes`}}var Lht=[/^ssh:/,/^git(?:\+[^:]+)?:/,/^(?:git\+)?https?:[^#]+\/[^#]+(?:\.git)(?:#.*)?$/,/^git@[^#]+\/[^#]+\.git(?:#.*)?$/,/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z._0-9-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z._0-9-]+?)(?:\.git)?(?:#.*)?$/,/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/],i2=(a=>(a.Commit="commit",a.Head="head",a.Tag="tag",a.Semver="semver",a))(i2||{});function gE(t){return t?Lht.some(e=>!!t.match(e)):!1}function rh(t){t=oQ(t);let e=t.indexOf("#");if(e===-1)return{repo:t,treeish:{protocol:"head",request:"HEAD"},extra:{}};let r=t.slice(0,e),o=t.slice(e+1);if(o.match(/^[a-z]+=/)){let a=hE.default.parse(o);for(let[p,h]of Object.entries(a))if(typeof h!="string")throw new Error(`Assertion failed: The ${p} parameter must be a literal string`);let n=Object.values(i2).find(p=>Object.prototype.hasOwnProperty.call(a,p)),[u,A]=typeof n<"u"?[n,a[n]]:["head","HEAD"];for(let p of Object.values(i2))delete a[p];return{repo:r,treeish:{protocol:u,request:A},extra:a}}else{let a=o.indexOf(":"),[n,u]=a===-1?[null,o]:[o.slice(0,a),o.slice(a+1)];return{repo:r,treeish:{protocol:n,request:u},extra:{}}}}function oQ(t,{git:e=!1}={}){if(t=t.replace(/^git\+https:/,"https:"),t=t.replace(/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)(?:\.git)?(#.*)?$/,"https://github.com/$1/$2.git$3"),t=t.replace(/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/,"https://github.com/$1/$2.git#$3"),e){let r=Wde(t);r&&(t=r.href),t=t.replace(/^git\+([^:]+):/,"$1:")}return t}function K8(t){return Y.makeLocator(t,oQ(t.reference))}function V8(t,{configuration:e}){let r=oQ(t,{git:!0});if(!ln.getNetworkSettings(`https://${(0,Yde.default)(r).resource}`,{configuration:e}).enableNetwork)throw new Vt(80,`Request to '${r}' has been blocked because of your configuration settings`);return r}async function Jde(t,e){let r=V8(t,{configuration:e}),o=await Y8("listing refs",["ls-remote",r],{cwd:e.startingCwd,env:Vde()},{configuration:e,normalizedRepoUrl:r}),a=new Map,n=/^([a-f0-9]{40})\t([^\n]+)/gm,u;for(;(u=n.exec(o.stdout))!==null;)a.set(u[2],u[1]);return a}async function J8(t,e){let{repo:r,treeish:{protocol:o,request:a},extra:n}=rh(t),u=await Jde(r,e),A=(h,E)=>{switch(h){case"commit":{if(!E.match(/^[a-f0-9]{40}$/))throw new Error("Invalid commit hash");return hE.default.stringify({...n,commit:E})}case"head":{let w=u.get(E==="HEAD"?E:`refs/heads/${E}`);if(typeof w>"u")throw new Error(`Unknown head ("${E}")`);return hE.default.stringify({...n,commit:w})}case"tag":{let w=u.get(`refs/tags/${E}`);if(typeof w>"u")throw new Error(`Unknown tag ("${E}")`);return hE.default.stringify({...n,commit:w})}case"semver":{let w=Tr.validRange(E);if(!w)throw new Error(`Invalid range ("${E}")`);let v=new Map([...u.entries()].filter(([C])=>C.startsWith("refs/tags/")).map(([C,R])=>[W8.default.parse(C.slice(10)),R]).filter(C=>C[0]!==null)),b=W8.default.maxSatisfying([...v.keys()],w);if(b===null)throw new Error(`No matching range ("${E}")`);return hE.default.stringify({...n,commit:v.get(b)})}case null:{let w;if((w=p("commit",E))!==null||(w=p("tag",E))!==null||(w=p("head",E))!==null)return w;throw E.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve "${E}" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve "${E}" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol ("${h}")`)}},p=(h,E)=>{try{return A(h,E)}catch{return null}};return`${r}#${A(o,a)}`}async function z8(t,e){return await e.getLimit("cloneConcurrency")(async()=>{let{repo:r,treeish:{protocol:o,request:a}}=rh(t);if(o!=="commit")throw new Error("Invalid treeish protocol when cloning");let n=V8(r,{configuration:e}),u=await ae.mktempPromise(),A={cwd:u,env:Vde()};return await Y8("cloning the repository",["clone","-c core.autocrlf=false",n,ue.fromPortablePath(u)],A,{configuration:e,normalizedRepoUrl:n}),await Y8("switching branch",["checkout",`${a}`],A,{configuration:e,normalizedRepoUrl:n}),u})}async function zde(t){let e,r=t;do{if(e=r,await ae.existsPromise(z.join(e,".git")))return e;r=z.dirname(e)}while(r!==e);return null}async function Xde(t,{baseRefs:e}){if(e.length===0)throw new ot("Can't run this command with zero base refs specified.");let r=[];for(let A of e){let{code:p}=await Mr.execvp("git",["merge-base",A,"HEAD"],{cwd:t});p===0&&r.push(A)}if(r.length===0)throw new ot(`No ancestor could be found between any of HEAD and ${e.join(", ")}`);let{stdout:o}=await Mr.execvp("git",["merge-base","HEAD",...r],{cwd:t,strict:!0}),a=o.trim(),{stdout:n}=await Mr.execvp("git",["show","--quiet","--pretty=format:%s",a],{cwd:t,strict:!0}),u=n.trim();return{hash:a,title:u}}async function Zde(t,{base:e,project:r}){let o=Ye.buildIgnorePattern(r.configuration.get("changesetIgnorePatterns")),{stdout:a}=await Mr.execvp("git",["diff","--name-only",`${e}`],{cwd:t,strict:!0}),n=a.split(/\r\n|\r|\n/).filter(h=>h.length>0).map(h=>z.resolve(t,ue.toPortablePath(h))),{stdout:u}=await Mr.execvp("git",["ls-files","--others","--exclude-standard"],{cwd:t,strict:!0}),A=u.split(/\r\n|\r|\n/).filter(h=>h.length>0).map(h=>z.resolve(t,ue.toPortablePath(h))),p=[...new Set([...n,...A].sort())];return o?p.filter(h=>!z.relative(r.cwd,h).match(o)):p}async function Oht({ref:t,project:e}){if(e.configuration.projectCwd===null)throw new ot("This command can only be run from within a Yarn project");let r=[z.resolve(e.cwd,e.configuration.get("cacheFolder")),z.resolve(e.cwd,e.configuration.get("installStatePath")),z.resolve(e.cwd,e.configuration.get("lockfileFilename")),z.resolve(e.cwd,e.configuration.get("virtualFolder"))];await e.configuration.triggerHook(u=>u.populateYarnPaths,e,u=>{u!=null&&r.push(u)});let o=await zde(e.configuration.projectCwd);if(o==null)throw new ot("This command can only be run on Git repositories");let a=await Xde(o,{baseRefs:typeof t=="string"?[t]:e.configuration.get("changesetBaseRefs")}),n=await Zde(o,{base:a.hash,project:e});return new Set(Ye.mapAndFilter(n,u=>{let A=e.tryWorkspaceByFilePath(u);return A===null?Ye.mapAndFilter.skip:r.some(p=>u.startsWith(p))?Ye.mapAndFilter.skip:A}))}async function Y8(t,e,r,{configuration:o,normalizedRepoUrl:a}){try{return await Mr.execvp("git",e,{...r,strict:!0})}catch(n){if(!(n instanceof Mr.ExecError))throw n;let u=n.reportExtra,A=n.stderr.toString();throw new Vt(1,`Failed ${t}`,p=>{p.reportError(1,` ${ye.prettyField(o,{label:"Repository URL",value:ye.tuple(ye.Type.URL,a)})}`);for(let h of A.matchAll(/^(.+?): (.*)$/gm)){let[,E,w]=h;E=E.toLowerCase();let v=E==="error"?"Error":`${(0,Kde.default)(E)} Error`;p.reportError(1,` ${ye.prettyField(o,{label:v,value:ye.tuple(ye.Type.NO_HINT,w)})}`)}u==null||u(p)})}}var s2=class{supports(e,r){return gE(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,a=K8(e),n=new Map(r.checksums);n.set(a.locatorHash,o);let u={...r,checksums:n},A=await this.downloadHosted(a,u);if(A!==null)return A;let[p,h,E]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${Y.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote repository`),loader:()=>this.cloneFromRemote(a,u),...r.cacheOptions});return{packageFs:p,releaseFs:h,prefixPath:Y.getIdentVendorPath(e),checksum:E}}async downloadHosted(e,r){return r.project.configuration.reduceHook(o=>o.fetchHostedRepository,null,e,r)}async cloneFromRemote(e,r){let o=await z8(e.reference,r.project.configuration),a=rh(e.reference),n=z.join(o,"package.tgz");await sn.prepareExternalProject(o,n,{configuration:r.project.configuration,report:r.report,workspace:a.extra.workspace,locator:e});let u=await ae.readFilePromise(n);return await Ye.releaseAfterUseAsync(async()=>await Ji.convertToZip(u,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:Y.getIdentVendorPath(e),stripComponents:1}))}};Ke();Ke();var o2=class{supportsDescriptor(e,r){return gE(e.range)}supportsLocator(e,r){return gE(e.reference)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=await J8(e.range,o.project.configuration);return[Y.makeLocator(e,a)]}async getSatisfying(e,r,o,a){let n=rh(e.range);return{locators:o.filter(A=>{if(A.identHash!==e.identHash)return!1;let p=rh(A.reference);return!(n.repo!==p.repo||n.treeish.protocol==="commit"&&n.treeish.request!==p.treeish.request)}),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await Ye.releaseAfterUseAsync(async()=>await Nt.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var Mht={configuration:{changesetBaseRefs:{description:"The base git refs that the current HEAD is compared against when detecting changes. Supports git branches, tags, and commits.",type:"STRING",isArray:!0,isNullable:!1,default:["master","origin/master","upstream/master","main","origin/main","upstream/main"]},changesetIgnorePatterns:{description:"Array of glob patterns; files matching them will be ignored when fetching the changed files",type:"STRING",default:[],isArray:!0},cloneConcurrency:{description:"Maximal number of concurrent clones",type:"NUMBER",default:2}},fetchers:[s2],resolvers:[o2]};var Uht=Mht;_t();var nh=class extends ct{constructor(){super(...arguments);this.since=fe.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.recursive=fe.Boolean("-R,--recursive",!1,{description:"Find packages via dependencies/devDependencies instead of using the workspaces field"});this.noPrivate=fe.Boolean("--no-private",{description:"Exclude workspaces that have the private field set to true"});this.verbose=fe.Boolean("-v,--verbose",!1,{description:"Also return the cross-dependencies between workspaces"});this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd);return(await Et.start({configuration:r,json:this.json,stdout:this.context.stdout},async n=>{let u=this.since?await $o.fetchChangedWorkspaces({ref:this.since,project:o}):o.workspaces,A=new Set(u);if(this.recursive)for(let p of[...u].map(h=>h.getRecursiveWorkspaceDependents()))for(let h of p)A.add(h);for(let p of A){let{manifest:h}=p;if(h.private&&this.noPrivate)continue;let E;if(this.verbose){let w=new Set,v=new Set;for(let b of Nt.hardDependencies)for(let[C,R]of h.getForScope(b)){let L=o.tryWorkspaceByDescriptor(R);L===null?o.workspacesByIdent.has(C)&&v.add(R):w.add(L)}E={workspaceDependencies:Array.from(w).map(b=>b.relativeCwd),mismatchedWorkspaceDependencies:Array.from(v).map(b=>Y.stringifyDescriptor(b))}}n.reportInfo(null,`${p.relativeCwd}`),n.reportJson({location:p.relativeCwd,name:h.name?Y.stringifyIdent(h.name):null,...E})}})).exitCode()}};nh.paths=[["workspaces","list"]],nh.usage=it.Usage({category:"Workspace-related commands",description:"list all available workspaces",details:"\n This command will print the list of all workspaces in the project.\n\n - If `--since` is set, Yarn will only list workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If `--no-private` is set, Yarn will not list any workspaces that have the `private` field set to `true`.\n\n - If both the `-v,--verbose` and `--json` options are set, Yarn will also return the cross-dependencies between each workspaces (useful when you wish to automatically generate Buck / Bazel rules).\n "});Ke();Ke();_t();var ih=class extends ct{constructor(){super(...arguments);this.workspaceName=fe.String();this.commandName=fe.String();this.args=fe.Proxy()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new er(o.cwd,this.context.cwd);let n=o.workspaces,u=new Map(n.map(p=>[Y.stringifyIdent(p.locator),p])),A=u.get(this.workspaceName);if(A===void 0){let p=Array.from(u.keys()).sort();throw new ot(`Workspace '${this.workspaceName}' not found. Did you mean any of the following: + - ${p.join(` + - `)}?`)}return this.cli.run([this.commandName,...this.args],{cwd:A.cwd})}};ih.paths=[["workspace"]],ih.usage=it.Usage({category:"Workspace-related commands",description:"run a command within the specified workspace",details:` + This command will run a given sub-command on a single workspace. + `,examples:[["Add a package to a single workspace","yarn workspace components add -D react"],["Run build script on a single workspace","yarn workspace components run build"]]});var _ht={configuration:{enableImmutableInstalls:{description:"If true (the default on CI), prevents the install command from modifying the lockfile",type:"BOOLEAN",default:$de.isCI},defaultSemverRangePrefix:{description:"The default save prefix: '^', '~' or ''",type:"STRING",values:["^","~",""],default:"^"},preferReuse:{description:"If true, `yarn add` will attempt to reuse the most common dependency range in other workspaces.",type:"BOOLEAN",default:!1}},commands:[b0,Q0,k0,F0,$0,W0,O0,nh,Jd,zd,pE,Xd,P0,x0,R0,T0,N0,L0,M0,U0,_0,H0,eh,q0,j0,K0,Y0,V0,G0,J0,z0,X0,$d,Z0,Vf,th,ih]},Hht=_ht;var nH={};Yt(nH,{default:()=>jht});Ke();var Qt={optional:!0},$8=[["@tailwindcss/aspect-ratio@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@tailwindcss/line-clamp@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@fullhuman/postcss-purgecss@3.1.3 || 3.1.3-alpha.0",{peerDependencies:{postcss:"^8.0.0"}}],["@samverschueren/stream-to-observable@<0.3.1",{peerDependenciesMeta:{rxjs:Qt,zenObservable:Qt}}],["any-observable@<0.5.1",{peerDependenciesMeta:{rxjs:Qt,zenObservable:Qt}}],["@pm2/agent@<1.0.4",{dependencies:{debug:"*"}}],["debug@<4.2.0",{peerDependenciesMeta:{["supports-color"]:Qt}}],["got@<11",{dependencies:{["@types/responselike"]:"^1.0.0",["@types/keyv"]:"^3.1.1"}}],["cacheable-lookup@<4.1.2",{dependencies:{["@types/keyv"]:"^3.1.1"}}],["http-link-dataloader@*",{peerDependencies:{graphql:"^0.13.1 || ^14.0.0"}}],["typescript-language-server@*",{dependencies:{["vscode-jsonrpc"]:"^5.0.1",["vscode-languageserver-protocol"]:"^3.15.0"}}],["postcss-syntax@*",{peerDependenciesMeta:{["postcss-html"]:Qt,["postcss-jsx"]:Qt,["postcss-less"]:Qt,["postcss-markdown"]:Qt,["postcss-scss"]:Qt}}],["jss-plugin-rule-value-function@<=10.1.1",{dependencies:{["tiny-warning"]:"^1.0.2"}}],["ink-select-input@<4.1.0",{peerDependencies:{react:"^16.8.2"}}],["license-webpack-plugin@<2.3.18",{peerDependenciesMeta:{webpack:Qt}}],["snowpack@>=3.3.0",{dependencies:{["node-gyp"]:"^7.1.0"}}],["promise-inflight@*",{peerDependenciesMeta:{bluebird:Qt}}],["reactcss@*",{peerDependencies:{react:"*"}}],["react-color@<=2.19.0",{peerDependencies:{react:"*"}}],["gatsby-plugin-i18n@*",{dependencies:{ramda:"^0.24.1"}}],["useragent@^2.0.0",{dependencies:{request:"^2.88.0",yamlparser:"0.0.x",semver:"5.5.x"}}],["@apollographql/apollo-tools@<=0.5.2",{peerDependencies:{graphql:"^14.2.1 || ^15.0.0"}}],["material-table@^2.0.0",{dependencies:{"@babel/runtime":"^7.11.2"}}],["@babel/parser@*",{dependencies:{"@babel/types":"^7.8.3"}}],["fork-ts-checker-webpack-plugin@<=6.3.4",{peerDependencies:{eslint:">= 6",typescript:">= 2.7",webpack:">= 4","vue-template-compiler":"*"},peerDependenciesMeta:{eslint:Qt,"vue-template-compiler":Qt}}],["rc-animate@<=3.1.1",{peerDependencies:{react:">=16.9.0","react-dom":">=16.9.0"}}],["react-bootstrap-table2-paginator@*",{dependencies:{classnames:"^2.2.6"}}],["react-draggable@<=4.4.3",{peerDependencies:{react:">= 16.3.0","react-dom":">= 16.3.0"}}],["apollo-upload-client@<14",{peerDependencies:{graphql:"14 - 15"}}],["react-instantsearch-core@<=6.7.0",{peerDependencies:{algoliasearch:">= 3.1 < 5"}}],["react-instantsearch-dom@<=6.7.0",{dependencies:{"react-fast-compare":"^3.0.0"}}],["ws@<7.2.1",{peerDependencies:{bufferutil:"^4.0.1","utf-8-validate":"^5.0.2"},peerDependenciesMeta:{bufferutil:Qt,"utf-8-validate":Qt}}],["react-portal@<4.2.2",{peerDependencies:{"react-dom":"^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0"}}],["react-scripts@<=4.0.1",{peerDependencies:{react:"*"}}],["testcafe@<=1.10.1",{dependencies:{"@babel/plugin-transform-for-of":"^7.12.1","@babel/runtime":"^7.12.5"}}],["testcafe-legacy-api@<=4.2.0",{dependencies:{"testcafe-hammerhead":"^17.0.1","read-file-relative":"^1.2.0"}}],["@google-cloud/firestore@<=4.9.3",{dependencies:{protobufjs:"^6.8.6"}}],["gatsby-source-apiserver@*",{dependencies:{["babel-polyfill"]:"^6.26.0"}}],["@webpack-cli/package-utils@<=1.0.1-alpha.4",{dependencies:{["cross-spawn"]:"^7.0.3"}}],["gatsby-remark-prismjs@<3.3.28",{dependencies:{lodash:"^4"}}],["gatsby-plugin-favicon@*",{peerDependencies:{webpack:"*"}}],["gatsby-plugin-sharp@<=4.6.0-next.3",{dependencies:{debug:"^4.3.1"}}],["gatsby-react-router-scroll@<=5.6.0-next.0",{dependencies:{["prop-types"]:"^15.7.2"}}],["@rebass/forms@*",{dependencies:{["@styled-system/should-forward-prop"]:"^5.0.0"},peerDependencies:{react:"^16.8.6"}}],["rebass@*",{peerDependencies:{react:"^16.8.6"}}],["@ant-design/react-slick@<=0.28.3",{peerDependencies:{react:">=16.0.0"}}],["mqtt@<4.2.7",{dependencies:{duplexify:"^4.1.1"}}],["vue-cli-plugin-vuetify@<=2.0.3",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":Qt,"vuetify-loader":Qt}}],["vue-cli-plugin-vuetify@<=2.0.4",{dependencies:{"null-loader":"^3.0.0"}}],["vue-cli-plugin-vuetify@>=2.4.3",{peerDependencies:{vue:"*"}}],["@vuetify/cli-plugin-utils@<=0.0.4",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":Qt}}],["@vue/cli-plugin-typescript@<=5.0.0-alpha.0",{dependencies:{"babel-loader":"^8.1.0"}}],["@vue/cli-plugin-typescript@<=5.0.0-beta.0",{dependencies:{"@babel/core":"^7.12.16"},peerDependencies:{"vue-template-compiler":"^2.0.0"},peerDependenciesMeta:{"vue-template-compiler":Qt}}],["cordova-ios@<=6.3.0",{dependencies:{underscore:"^1.9.2"}}],["cordova-lib@<=10.0.1",{dependencies:{underscore:"^1.9.2"}}],["git-node-fs@*",{peerDependencies:{"js-git":"^0.7.8"},peerDependenciesMeta:{"js-git":Qt}}],["consolidate@<0.16.0",{peerDependencies:{mustache:"^3.0.0"},peerDependenciesMeta:{mustache:Qt}}],["consolidate@<=0.16.0",{peerDependencies:{velocityjs:"^2.0.1",tinyliquid:"^0.2.34","liquid-node":"^3.0.1",jade:"^1.11.0","then-jade":"*",dust:"^0.3.0","dustjs-helpers":"^1.7.4","dustjs-linkedin":"^2.7.5",swig:"^1.4.2","swig-templates":"^2.0.3","razor-tmpl":"^1.3.1",atpl:">=0.7.6",liquor:"^0.0.5",twig:"^1.15.2",ejs:"^3.1.5",eco:"^1.1.0-rc-3",jazz:"^0.0.18",jqtpl:"~1.1.0",hamljs:"^0.6.2",hamlet:"^0.3.3",whiskers:"^0.4.0","haml-coffee":"^1.14.1","hogan.js":"^3.0.2",templayed:">=0.2.3",handlebars:"^4.7.6",underscore:"^1.11.0",lodash:"^4.17.20",pug:"^3.0.0","then-pug":"*",qejs:"^3.0.5",walrus:"^0.10.1",mustache:"^4.0.1",just:"^0.1.8",ect:"^0.5.9",mote:"^0.2.0",toffee:"^0.3.6",dot:"^1.1.3","bracket-template":"^1.1.5",ractive:"^1.3.12",nunjucks:"^3.2.2",htmling:"^0.0.8","babel-core":"^6.26.3",plates:"~0.4.11","react-dom":"^16.13.1",react:"^16.13.1","arc-templates":"^0.5.3",vash:"^0.13.0",slm:"^2.0.0",marko:"^3.14.4",teacup:"^2.0.0","coffee-script":"^1.12.7",squirrelly:"^5.1.0",twing:"^5.0.2"},peerDependenciesMeta:{velocityjs:Qt,tinyliquid:Qt,"liquid-node":Qt,jade:Qt,"then-jade":Qt,dust:Qt,"dustjs-helpers":Qt,"dustjs-linkedin":Qt,swig:Qt,"swig-templates":Qt,"razor-tmpl":Qt,atpl:Qt,liquor:Qt,twig:Qt,ejs:Qt,eco:Qt,jazz:Qt,jqtpl:Qt,hamljs:Qt,hamlet:Qt,whiskers:Qt,"haml-coffee":Qt,"hogan.js":Qt,templayed:Qt,handlebars:Qt,underscore:Qt,lodash:Qt,pug:Qt,"then-pug":Qt,qejs:Qt,walrus:Qt,mustache:Qt,just:Qt,ect:Qt,mote:Qt,toffee:Qt,dot:Qt,"bracket-template":Qt,ractive:Qt,nunjucks:Qt,htmling:Qt,"babel-core":Qt,plates:Qt,"react-dom":Qt,react:Qt,"arc-templates":Qt,vash:Qt,slm:Qt,marko:Qt,teacup:Qt,"coffee-script":Qt,squirrelly:Qt,twing:Qt}}],["vue-loader@<=16.3.3",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",webpack:"^4.1.0 || ^5.0.0-0"},peerDependenciesMeta:{"@vue/compiler-sfc":Qt}}],["vue-loader@^16.7.0",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",vue:"^3.2.13"},peerDependenciesMeta:{"@vue/compiler-sfc":Qt,vue:Qt}}],["scss-parser@<=1.0.5",{dependencies:{lodash:"^4.17.21"}}],["query-ast@<1.0.5",{dependencies:{lodash:"^4.17.21"}}],["redux-thunk@<=2.3.0",{peerDependencies:{redux:"^4.0.0"}}],["skypack@<=0.3.2",{dependencies:{tar:"^6.1.0"}}],["@npmcli/metavuln-calculator@<2.0.0",{dependencies:{"json-parse-even-better-errors":"^2.3.1"}}],["bin-links@<2.3.0",{dependencies:{"mkdirp-infer-owner":"^1.0.2"}}],["rollup-plugin-polyfill-node@<=0.8.0",{peerDependencies:{rollup:"^1.20.0 || ^2.0.0"}}],["snowpack@<3.8.6",{dependencies:{"magic-string":"^0.25.7"}}],["elm-webpack-loader@*",{dependencies:{temp:"^0.9.4"}}],["winston-transport@<=4.4.0",{dependencies:{logform:"^2.2.0"}}],["jest-vue-preprocessor@*",{dependencies:{"@babel/core":"7.8.7","@babel/template":"7.8.6"},peerDependencies:{pug:"^2.0.4"},peerDependenciesMeta:{pug:Qt}}],["redux-persist@*",{peerDependencies:{react:">=16"},peerDependenciesMeta:{react:Qt}}],["sodium@>=3",{dependencies:{"node-gyp":"^3.8.0"}}],["babel-plugin-graphql-tag@<=3.1.0",{peerDependencies:{graphql:"^14.0.0 || ^15.0.0"}}],["@playwright/test@<=1.14.1",{dependencies:{"jest-matcher-utils":"^26.4.2"}}],...["babel-plugin-remove-graphql-queries@<3.14.0-next.1","babel-preset-gatsby-package@<1.14.0-next.1","create-gatsby@<1.14.0-next.1","gatsby-admin@<0.24.0-next.1","gatsby-cli@<3.14.0-next.1","gatsby-core-utils@<2.14.0-next.1","gatsby-design-tokens@<3.14.0-next.1","gatsby-legacy-polyfills@<1.14.0-next.1","gatsby-plugin-benchmark-reporting@<1.14.0-next.1","gatsby-plugin-graphql-config@<0.23.0-next.1","gatsby-plugin-image@<1.14.0-next.1","gatsby-plugin-mdx@<2.14.0-next.1","gatsby-plugin-netlify-cms@<5.14.0-next.1","gatsby-plugin-no-sourcemaps@<3.14.0-next.1","gatsby-plugin-page-creator@<3.14.0-next.1","gatsby-plugin-preact@<5.14.0-next.1","gatsby-plugin-preload-fonts@<2.14.0-next.1","gatsby-plugin-schema-snapshot@<2.14.0-next.1","gatsby-plugin-styletron@<6.14.0-next.1","gatsby-plugin-subfont@<3.14.0-next.1","gatsby-plugin-utils@<1.14.0-next.1","gatsby-recipes@<0.25.0-next.1","gatsby-source-shopify@<5.6.0-next.1","gatsby-source-wikipedia@<3.14.0-next.1","gatsby-transformer-screenshot@<3.14.0-next.1","gatsby-worker@<0.5.0-next.1"].map(t=>[t,{dependencies:{"@babel/runtime":"^7.14.8"}}]),["gatsby-core-utils@<2.14.0-next.1",{dependencies:{got:"8.3.2"}}],["gatsby-plugin-gatsby-cloud@<=3.1.0-next.0",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["gatsby-plugin-gatsby-cloud@<=3.2.0-next.1",{peerDependencies:{webpack:"*"}}],["babel-plugin-remove-graphql-queries@<=3.14.0-next.1",{dependencies:{"gatsby-core-utils":"^2.8.0-next.1"}}],["gatsby-plugin-netlify@3.13.0-next.1",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["clipanion-v3-codemod@<=0.2.0",{peerDependencies:{jscodeshift:"^0.11.0"}}],["react-live@*",{peerDependencies:{"react-dom":"*",react:"*"}}],["webpack@<4.44.1",{peerDependenciesMeta:{"webpack-cli":Qt,"webpack-command":Qt}}],["webpack@<5.0.0-beta.23",{peerDependenciesMeta:{"webpack-cli":Qt}}],["webpack-dev-server@<3.10.2",{peerDependenciesMeta:{"webpack-cli":Qt}}],["@docusaurus/responsive-loader@<1.5.0",{peerDependenciesMeta:{sharp:Qt,jimp:Qt}}],["eslint-module-utils@*",{peerDependenciesMeta:{"eslint-import-resolver-node":Qt,"eslint-import-resolver-typescript":Qt,"eslint-import-resolver-webpack":Qt,"@typescript-eslint/parser":Qt}}],["eslint-plugin-import@*",{peerDependenciesMeta:{"@typescript-eslint/parser":Qt}}],["critters-webpack-plugin@<3.0.2",{peerDependenciesMeta:{"html-webpack-plugin":Qt}}],["terser@<=5.10.0",{dependencies:{acorn:"^8.5.0"}}],["babel-preset-react-app@10.0.x",{dependencies:{"@babel/plugin-proposal-private-property-in-object":"^7.16.0"}}],["eslint-config-react-app@*",{peerDependenciesMeta:{typescript:Qt}}],["@vue/eslint-config-typescript@<11.0.0",{peerDependenciesMeta:{typescript:Qt}}],["unplugin-vue2-script-setup@<0.9.1",{peerDependencies:{"@vue/composition-api":"^1.4.3","@vue/runtime-dom":"^3.2.26"}}],["@cypress/snapshot@*",{dependencies:{debug:"^3.2.7"}}],["auto-relay@<=0.14.0",{peerDependencies:{"reflect-metadata":"^0.1.13"}}],["vue-template-babel-compiler@<1.2.0",{peerDependencies:{["vue-template-compiler"]:"^2.6.0"}}],["@parcel/transformer-image@<2.5.0",{peerDependencies:{["@parcel/core"]:"*"}}],["@parcel/transformer-js@<2.5.0",{peerDependencies:{["@parcel/core"]:"*"}}],["parcel@*",{peerDependenciesMeta:{["@parcel/core"]:Qt}}],["react-scripts@*",{peerDependencies:{eslint:"*"}}],["focus-trap-react@^8.0.0",{dependencies:{tabbable:"^5.3.2"}}],["react-rnd@<10.3.7",{peerDependencies:{react:">=16.3.0","react-dom":">=16.3.0"}}],["connect-mongo@*",{peerDependencies:{"express-session":"^1.17.1"}}],["vue-i18n@<9",{peerDependencies:{vue:"^2"}}],["vue-router@<4",{peerDependencies:{vue:"^2"}}],["unified@<10",{dependencies:{"@types/unist":"^2.0.0"}}],["react-github-btn@<=1.3.0",{peerDependencies:{react:">=16.3.0"}}],["react-dev-utils@*",{peerDependencies:{typescript:">=2.7",webpack:">=4"},peerDependenciesMeta:{typescript:Qt}}],["@asyncapi/react-component@<=1.0.0-next.39",{peerDependencies:{react:">=16.8.0","react-dom":">=16.8.0"}}],["xo@*",{peerDependencies:{webpack:">=1.11.0"},peerDependenciesMeta:{webpack:Qt}}],["babel-plugin-remove-graphql-queries@<=4.20.0-next.0",{dependencies:{"@babel/types":"^7.15.4"}}],["gatsby-plugin-page-creator@<=4.20.0-next.1",{dependencies:{"fs-extra":"^10.1.0"}}],["gatsby-plugin-utils@<=3.14.0-next.1",{dependencies:{fastq:"^1.13.0"},peerDependencies:{graphql:"^15.0.0"}}],["gatsby-plugin-mdx@<3.1.0-next.1",{dependencies:{mkdirp:"^1.0.4"}}],["gatsby-plugin-mdx@^2",{peerDependencies:{gatsby:"^3.0.0-next"}}],["fdir@<=5.2.0",{peerDependencies:{picomatch:"2.x"},peerDependenciesMeta:{picomatch:Qt}}],["babel-plugin-transform-typescript-metadata@<=0.3.2",{peerDependencies:{"@babel/core":"^7","@babel/traverse":"^7"},peerDependenciesMeta:{"@babel/traverse":Qt}}],["graphql-compose@>=9.0.10",{peerDependencies:{graphql:"^14.2.0 || ^15.0.0 || ^16.0.0"}}]];var eH;function eme(){return typeof eH>"u"&&(eH=Ie("zlib").brotliDecompressSync(Buffer.from("G7weAByFTVk3Vs7UfHhq4yykgEM7pbW7TI43SG2S5tvGrwHBAzdz+s/npQ6tgEvobvxisrPIadkXeUAJotBn5bDZ5kAhcRqsIHe3F75Walet5hNalwgFDtxb0BiDUjiUQkjG0yW2hto9HPgiCkm316d6bC0kST72YN7D7rfkhCE9x4J0XwB0yavalxpUu2t9xszHrmtwalOxT7VslsxWcB1qpqZwERUra4psWhTV8BgwWeizurec82Caf1ABL11YMfbf8FJ9JBceZOkgmvrQPbC9DUldX/yMbmX06UQluCEjSwUoyO+EZPIjofr+/oAZUck2enraRD+oWLlnlYnj8xB+gwSo9lmmks4fXv574qSqcWA6z21uYkzMu3EWj+K23RxeQlLqiE35/rC8GcS4CGkKHKKq+zAIQwD9iRDNfiAqueLLpicFFrNsAI4zeTD/eO9MHcnRa5m8UT+M2+V+AkFST4BlKneiAQRSdST8KEAIyFlULt6wa9EBd0Ds28VmpaxquJdVt+nwdEs5xUskI13OVtFyY0UrQIRAlCuvvWivvlSKQfTO+2Q8OyUR1W5RvetaPz4jD27hdtwHFFA1Ptx6Ee/t2cY2rg2G46M1pNDRf2pWhvpy8pqMnuI3++4OF3+7OFIWXGjh+o7Nr2jNvbiYcQdQS1h903/jVFgOpA0yJ78z+x759bFA0rq+6aY5qPB4FzS3oYoLupDUhD9nDz6F6H7hpnlMf18KNKDu4IKjTWwrAnY6MFQw1W6ymOALHlFyCZmQhldg1MQHaMVVQTVgDC60TfaBqG++Y8PEoFhN/PBTZT175KNP/BlHDYGOOBmnBdzqJKplZ/ljiVG0ZBzfqeBRrrUkn6rA54462SgiliKoYVnbeptMdXNfAuaupIEi0bApF10TlgHfmEJAPUVidRVFyDupSem5po5vErPqWKhKbUIp0LozpYsIKK57dM/HKr+nguF+7924IIWMICkQ8JUigs9D+W+c4LnNoRtPPKNRUiCYmP+Jfo2lfKCKw8qpraEeWU3uiNRO6zcyKQoXPR5htmzzLznke7b4YbXW3I1lIRzmgG02Udb58U+7TpwyN7XymCgH+wuPDthZVQvRZuEP+SnLtMicz9m5zASWOBiAcLmkuFlTKuHspSIhCBD0yUPKcxu81A+4YD78rA2vtwsUEday9WNyrShyrl60rWmA+SmbYZkQOwFJWArxRYYc5jGhA5ikxYw1rx3ei4NmeX/lKiwpZ9Ln1tV2Ae7sArvxuVLbJjqJRjW1vFXAyHpvLG+8MJ6T2Ubx5M2KDa2SN6vuIGxJ9WQM9Mk3Q7aCNiZONXllhqq24DmoLbQfW2rYWsOgHWjtOmIQMyMKdiHZDjoyIq5+U700nZ6odJAoYXPQBvFNiQ78d5jaXliBqLTJEqUCwi+LiH2mx92EmNKDsJL74Z613+3lf20pxkV1+erOrjj8pW00vsPaahKUM+05ssd5uwM7K482KWEf3TCwlg/o3e5ngto7qSMz7YteIgCsF1UOcsLk7F7MxWbvrPMY473ew0G+noVL8EPbkmEMftMSeL6HFub/zy+2JQ==","base64")).toString()),eH}var tH;function tme(){return typeof tH>"u"&&(tH=Ie("zlib").brotliDecompressSync(Buffer.from("G8MSIIzURnVBnObTcvb3XE6v2S9Qgc2K801Oa5otNKEtK8BINZNcaQHy+9/vf/WXBimwutXC33P2DPc64pps5rz7NGGWaOKNSPL4Y2KRE8twut2lFOIN+OXPtRmPMRhMTILib2bEQx43az2I5d3YS8Roa5UZpF/ujHb3Djd3GDvYUfvFYSUQ39vb2cmifp/rgB4J/65JK3wRBTvMBoNBmn3mbXC63/gbBkW/2IRPri0O8bcsRBsmarF328pAln04nyJFkwUAvNu934supAqLtyerZZpJ8I8suJHhf/ocMV+scKwa8NOiDKIPXw6Ex/EEZD6TEGaW8N5zvNHYF10l6Lfooj7D5W2k3dgvQSbp2Wv8TGOayS978gxlOLVjTGXs66ozewbrjwElLtyrYNnWTfzzdEutgROUFPVMhnMoy8EjJLLlWwIEoySxliim9kYW30JUHiPVyjt0iAw/ZpPmCbUCltYPnq6ZNblIKhTNhqS/oqC9iya5sGKZTOVsTEg34n92uZTf2iPpcZih8rPW8CzA+adIGmyCPcKdLMsBLShd+zuEbTrqpwuh+DLmracZcjPC5Sdf5odDAhKpFuOsQS67RT+1VgWWygSv3YwxDnylc04/PYuaMeIzhBkLrvs7e/OUzRTF56MmfY6rI63QtEjEQzq637zQqJ39nNhu3NmoRRhW/086bHGBUtx0PE0j3aEGvkdh9WJC8y8j8mqqke9/dQ5la+Q3ba4RlhvTbnfQhPDDab3tUifkjKuOsp13mXEmO00Mu88F/M67R7LXfoFDFLNtgCSWjWX+3Jn1371pJTK9xPBiMJafvDjtFyAzu8rxeQ0TKMQXNPs5xxiBOd+BRJP8KP88XPtJIbZKh/cdW8KvBUkpqKpGoiIaA32c3/JnQr4efXt85mXvidOvn/eU3Pase1typLYBalJ14mCso9h79nuMOuCa/kZAOkJHmTjP5RM2WNoPasZUAnT1TAE/NH25hUxcQv6hQWR/m1PKk4ooXMcM4SR1iYU3fUohvqk4RY2hbmTVVIXv6TvqO+0doOjgeVFAcom+RlwJQmOVH7pr1Q9LoJT6n1DeQEB+NHygsATbIwTcOKZlJsY8G4+suX1uQLjUWwLjjs0mvSvZcLTpIGAekeR7GCgl8eo3ndAqEe2XCav4huliHjdbIPBsGJuPX7lrO9HX1UbXRH5opOe1x6JsOSgHZR+EaxuXVhpLLxm6jk1LJtZfHSc6BKPun3CpYYVMJGwEUyk8MTGG0XL5MfEwaXpnc9TKnBmlGn6nHiGREc3ysn47XIBDzA+YvFdjZzVIEDcKGpS6PbUJehFRjEne8D0lVU1XuRtlgszq6pTNlQ/3MzNOEgCWPyTct22V2mEi2krizn5VDo9B19/X2DB3hCGRMM7ONbtnAcIx/OWB1u5uPbW1gsH8irXxT/IzG0PoXWYjhbMsH3KTuoOl5o17PulcgvsfTSnKFM354GWI8luqZnrswWjiXy3G+Vbyo1KMopFmmvBwNELgaS8z8dNZchx/Cl/xjddxhMcyqtzFyONb2Zdu90NkI8pAeufe7YlXrp53v8Dj/l8vWeVspRKBGXScBBPI/HinSTGmLDOGGOCIyH0JFdOZx0gWsacNlQLJMIrBhqRxXxHF/5pseWwejlAAvZ3klZSDSYY8mkToaWejXhgNomeGtx1DTLEUFMRkgF5yFB22WYdJnaWN14r1YJj81hGi45+jrADS5nYRhCiSlCJJ1nL8pYX+HDSMhdTEWyRcgHVp/IsUIZYMfT+YYncUQPgcxNGCHfZ88vDdrcUuaGIl6zhAsiaq7R5dfqrqXH/JcBhfjT8D0azayIyEz75Nxp6YkcyDxlJq3EXnJUpqDohJJOysL1t1uNiHESlvsxPb5cpbW0+ICZqJmUZus1BMW0F5IVBODLIo2zHHjA0=","base64")).toString()),tH}var rH;function rme(){return typeof rH>"u"&&(rH=Ie("zlib").brotliDecompressSync(Buffer.from("m8ceLpONa9CbVRyMKwxRBbsFXufYVA4cEMvWR3Uimne/QYmdo63gCl3vazegeirgxhBqaPe1QKHajqeXSRL/NGhyyn/rugIBjlheG+tpUesyvK1GnbNIXrx8svmtjrLFJrSwIDYOW98Rc0Ewz2pBQsfQQ+jFc7nqf+KoCd2PAZzcXh6gCGGGO2YiFiG7OYhL2PGr+dxP9mlVu3HocKPRCJ+rY6qCwhB8H6MKRzrPC36/fFX798/XyzUtfCDoMF2+RrfKseRrGg9VAFJIKIizu7LDK2otkx9BOqfZF8/qJ3D9DYGU2uTXUv3TWZu2E9Iqk6eS+nuXFldcQGPhz4HIj+Xs772cXlhLqEyHYc1PX06mBAI1zX5LS2ieR+i1XM5u4ptbSFVRuvFVXY8CimRhv6pIpvstk5EpbYVAEklJRKf19RkO9r5T4fu1WKrXRJBLgtmQN4phlIEbOPfBfjesTaxVNuYC8wFdqa53//7SvtTWBwDpL3j+YjRBKPMCYLibLavrVt3ydPfrni+1pDMtWx+QqurWfa9J8kiWdywNe+YTRguASbRJCpwtZ3GLBheQUsD/05m1G4L1wcob0ISsYOemyEvTHFDRBuwvzchh8DG/XhoNbBjaVFcR7hV1KwxaQXk3yVmHkvcIuyuK6i6XKW11923flxkr9QyInpAHMAh9ke5nIoIc1CoO+qpjhuwPEBbG272VpjmildLujOwMz/+pWrb3cCFJuMD/6TAfF4RLJbZpxKJ066bB8xDL9VauYuesdeKuY+Vqk4bORRNy7dKdqaLp3NXiAiNcACWHGdDhf8CBAzoFv2+/+rI99GoYqk33opsRblgtggX2vzPfrThbQ0wZGRkRjTUIapEVybV6tct8PQsEahX6fatqmqPic2XUXt1cXasBVSPcyBUKpa7M2r09i+Kt4jiNYrLd4jASIbuFUTg/R2SXicg0lVWqxwHGYHZJsxEtKfSywq/3GLNW92tngIiKpjaeM11a4ystebWqiGUMOMjHPw2vdzmJTN+w0YBdkbfAlZ+A/hnt9zM/Ile0F573gG0xllW82eyf/VVoXgGhRRywzmRMq/25lGkiBBlW2j8hRHLZDOS/862kkEs3OpBt2ZtjrJXtVrpv9yQi8gkkI4OYoWjKRu6bw7gi92RY6BNIuZZig71OpYslvf0BIFDbjBqYcVRMf/nz32ka7HeHUUg+yzKva+U+F8x7Yw/rjwiGj/1A/v7+fnvUPQ4sP4vCceaQH+LNc2B0PfgFjDogX+w3PG7k23xk3S6Gi+xpt7F8H/+AfdPaCdRD/XaF7hGC8HheqMPsyxoNP77ce7nW2goK+A7NvG5KAPMA2ESRneCQIi8/FMRR7n4K4fVWDVLL8tBWDodYWrHAYI+A/NazObzzCzhulHY5D1STnvld1xlDgKZgSUQ9jp5G6aPNYg54V/Qb8lVwZbh5TwX8hhG53W3gxmXdMq1S8zbjv4ziKGJz8R8S7all+q+12dvsYUVEU+jfEnA/evQvT4LLyWme/DJAwN2LX3qcBRd53oEZ0olIMyIU5p645SfTtZ6GK5g56VEBx4uzWxV6DBE/bdakWVlXLjv1/PLsbyxaD1BIftIyfg2r3ss2xwqW6seN5RCfXLyicGV7F4Tr7nr0q4kFfXBGlpw2B4eAWWL8Wm3vF30EPHHRso/kLPSRqvXagwvA3lLQcHHNm/k2qvcaCkSFEBf8UZ24D8mHtIpBIAMR+CIPE5UIOJdpy/tjJDsIZwgbXNVrz774UfyrPbDxejgDJCn4ZJog3SJq2ctuCiskF6/HP7aDLCA5EGrlSTM3fupuWlu6Irz6KvpddmQ9o5fJZMmA5fDEPMC56wsSR6zBEfiC+qQAdrPbtkRgokzCWkOvFUOIab7T3wN2TakKwFRAxmw+KxBNCjg4GUpm8oCZFwtYEG4LUMvc6tjCvzqThru6uwTXa6Cof79cVZYtchpU/BKeMvPHVCxmYFkJ0YCaiIyotnZzHKXmCFTPcqVPndrpfiE+tQRm24IZYpIvSoWZi5RgwQeXFvD1bcfnQPUsGPVCqLhwQMmkyiGnQJyjjs1AOB/lAAdVk9qIvjlYmf6xIKDMeh1bHShIQXvWbIantz3eyJTO45g6XAFVR23ekKOFMSN5Xl0uSit1FCJgUGyx7+VhOl9nElBnbj0QAko3YoAm89DfYE0QuRUajjjzkN2Tvxw+szsgSZePUfnxZ3B7fGjzf3rX2165oo1+OEZnVgPkryxzmd4ys2B+sr90VwgERS6Evgu184Ko7eFxL6F3mD2ckhNLvQ4syPDU38J+2eRHJaiNplj5wZBEpEbe/u3ofoXYpVIHiC1HXXDYpCTn+wvlTrJo01Y0rsSNPUvqY7fu/65s9NUa5Vw9KCQ36zLnFfUgWyEk5mtmKYWACLGe2Wb9hgcfhib8lMped77m2HyPxDRZSa/MnMK4OaHk70h+oUCZTMUEhSDhfi/kx9z8WFu2Bz3obredq8dFC6+/JDWEQB3zqAeNQMjRM02YPMcc84H3NbroK12WJmtTXQORXcOHP/Znl7j7SaADsvfSamptU6AP3Q8gUOAiKgo6qheVXhzibewXWuWQWH+5MDBJn+5CkjjmdZgJyjqvMTtdIL0UYyfv20PjIqtWOc0oAPiOhPZdOW5G5Ezf+yA2IXKxLwmM7HW7qT438o35gDhQe0htlvGMtHSfnCvEEGnTeqamtNUUxjM8pu3aXosYPC4ujy5bqRF36B94JiZZW3ruPorZYR3uZnae3NHFC1Bmq+IHe97L3M7QdRY91Z1CMtxcPEE4dqmlVdrBIneoRFdUM0B4kV4Ipeh+xzRIVXEW/OaoWBBk11pFculAAH1ENRIbsSG+jVUNk+Dt/NHSygN2xVe71smGjizomJRXzhyg8trKl3QaMlTKbZUB0z40y3sMgL1uLeSIP82LJhDSw28OtBRQEGRcgwBFT5dbVlTTtS5DQ5S7KoEYOXohsyUiTYgCky8ZCV8nJIQ/ypUSv6SwWDASt2ikxcO3cH7dDKCPAB0VDnaOy4uk6xmWFV43PVcY7QsqiURWbowdhNnOJaT4HSSJBMnDQ5npufTZe/Fe3yv/8cszaN+LA/WTl8x0jx6DAZPX3HUG+FB9a6abKhieiZ2m1j3PxoRPTi8BmegHWl69eGnmEWJt2CIMdH0hlIeYYCu31xr4EoQzryjX5RTc5twpI/oJz8uTCVU6RPNWNepDhqf/Dk1g164dXTVLyst74UtLNgjpfaNqEdxyIG3wKQFc83z1/Vql572+AxJG0sWkWUaM9Uw7o57pYXUdGbdV5N37tQgzFU5rlMqwzaSm3fMcpBr0PyvWxT4sLaN3yLyBVS9bw+j+9axsVWUQTS4VlzdvxUO64laxOlwsRGUG+ApQPFkh23PCq+esLZ79PwvsGIHdg+xj1zokd6fkX2DnCatwNhacRAw3S7D1TCouk1h3Y+2hjqbeZ5/+YIRTpHVCtU9knbAz6WU6T41wnM2zn2qh3k5uv6urfAwIzg3jY8n30mWhBoA+Ny/9oVdbAP+Pol5RoWJXuwtsg8pzhof/wSbqXDHnsTN8ALy7mqkLSx8frLDGPWt1wob3DFK28VcwvkXLoZA0wKdjq+qYpgZivwYqyC9Gw3vekDRS0mRnSSjjv8gqbneCnWzsDuMXoW6Axv5i8j32EiBesW9fi8cNoke82/6yiX8kH15CLwMGCDiVs9poCXLo4hmxLJq2YKvsyBD/uloUGp72pUko68qsStproW/pPFDek/+aCGAIudvLy7T2ge7NMb6zh/o+jYWTU/nom2WfaD6YMKo10GUDmV//3vM+EcSVXVS7TT7Zvtly4NJHJ1P6Q2aV7ZE9TpHL/E0GLH4iLgah9g6wCLUCxTFPn0BRzRiFcAGACNGVJLGFLTAg7TOIUpAoagQARpIoraFmoGKZx4YrgpkfuvdMuPSv4318nnLUshW3PHmcopURCeICAAiApMLbgDZtlwE9oUcAQAdlodk0elmNVzQzH9C+ZR0GB37Q6fZOtY5Z6GY1jRGsAKCdH3361cePh9FTZTBPHasoZ966TxwI79faOGOkTF6DaqdPoVq0Q7gAgI2678rCTgO4pJ1BdLeSFDUCAJHZTDjmf5nId6ve2G9pDL6+MtI7l21Yz3DYZ2QAAOS+Ecj/51Zff1Xx6numG7Ne+epnrwWG6r3KjtKAQVvX10MB+PPd5MuRbeNy8gJjeOZv2E7NsM+8BQDIJKIsnzDZmO1W/k7s8slpliuEuS5X2d0dMM/5X5kAgBcFngNOP29mgUT+pGhJ5RSbhGLGUtAWAChh66zhxdYttZtqLLG5RZcAQAuXHE2eZyaQ7U9O5UObQsNW4bDPYAsA0MmNiakwBmBb7VWIqQB4ihoBgJI0TDTm6/wAPT/Mgg6TZZNeTq8xeRUAdLNe04xX+Jwtu6zlPuhPO755UmpGaeZtmWwBgMyxcWINA1tebq8qK4EtmxsBAJnJJGMei3uv+Ol2BTS3bghdWaEdMUMxwz4jAwAgn6UValxvsvzZWzjDlGXGtH0IyHjsc+C/jc+L9eLs9vog3weInvlb5nIP+8xbAIDkLPVpXG9PORhFnHnHQGPSvofoeiQpzAQAIvyXiCzwWbR+uf02wy2nW53GWA7hAgBl1N0uCRuFyDsyWe0n0fVIFFwCACftrU9K2sIFv24e+53il9P4w5oQLgBQg8i9MlnCkcgrCavdEl1LomATALDwDpgwwW/hWZwdXMWfpvdnBCsAWGe90rb8Cijct2MUcc8291fadWkc1VbSZ8YFAHLM3lwy3MGWLHdjS0WNAIAxtytU9GaPVGo3a+5IuK652C4J6HZFgulT+lS5nF/g0dRLgcnpm6L/XmT4noRStgMjSdE1MMCVdPgf4UlH7KoTlqwstOQM+iReu7ELj0LHa4mOqwGWX78ofSW9wS8n1R53rd7TF71e0PdJR12knM/iHyhwTIFWRmHfyvjquPvGUstpK6S8jRXfkoYBzg+dzV+jWNO/9s5FerPF/naKWMo9W78mMyCNBBZQSb9NzrZjIraomqCvYnIuZB2E6LuFN2O4AOXhoRd1b9BFeU5yTnNlJGHcX3ipTN70ql67QvQsX2kTvvDZtNfTHMsoQIYY4PWeX+EnrHZjHBooeChRXZs/Nkb+QBimGqnzjAvOrXZ3slhKT8y4T+ZAOibeC7XX1bg6RqbCMWIfcWcmVvu9mVt0ADlrSM5tWusVY00BnVszkGmpFV2NhtGdKCKDf4f2YoBCSMc9XXfxZ80XhhnIiGJy4IpbMuDvLVCAWZugVZEu3nPAP7ULIi5NDg8x6NF0x5rTHsfBHrFkNyXwHbyNeO7wfLePL0MJO+jlz54ypbchLNk599xAkA4iTknrppnrx5UkaohCDLEMovPgArTW1BillgiMaKmsm7AffcIYA3zaT04gIxv8lmFZuFZYASE7ti/zRtNyxstEpjhE3m+6OTivJ+NHVvdokCdA4ThV6wgd34Dzs3o7/g3peeTL0mnu8ySE7t9xulQ+3iMJX47wPHlN6zRxkMBrIdsuxFqAqUG73dRJYCOC/kjjF22Rpz2EQ6I03nJWK7ldiDZKygc+DsT0b2A02JtTv7kFA0PghVN9/NoEH8dr34b8PvkO7tnz6yIPO6QW2S1M1mcJBF4PJdb+r0gS9atLrc0OF+3aNd7gyplcvHzxuVdE4mD7c+A/WSG1qGDj6uvJZsaEehsTp+H56jgahx+uHQIANux1bHPbGF+1LgpbjUt/7XgevO4pDaxa0STOf5ZYDvsYk7aP+2cWVl37tWeT8LIp7J2xAiMklOFJ1m/5rOhRd0YBsGgyaanK0UzqyJodAczgAZs0Js8XF0RH9jQLs6YzjDeNYpBoybKLbYDHAYtXEtM2bB0Uj2yZjA2ZTCkMCIkpYFijG1KXX5Vxw8voeihu5iJwpkI1XNkEb+pxvIwMZszqRcZqs4/wPDaX8dr8IzyXf0nVlfCc2x/pCPhrZh1KPk5nFYuUdhbx6avfhzfZoRwba/0mQZPeFnODloTFooGJBRPXA0PQLySBosy53+FrV1k6ObFzdmG8010jb8F7CIgD7Gg1LkHCW6iTBQ+gatkJ/JxWgIjekAiCU+a8HwMkSFVhSSaJS1ZH6ojN81kzJ4jLktWAH8xwDdZNW1wvbAxuGJMeS+koawNt6v17EhL9J/q4FN7dskESPmw3+vgjiQIrXULh1mhYtowCTvTWDaG6LIditGvCAZhD+Z49LEw699NLQ7EnZiZPvomdHljZxzyQDWdmtCwm5zTpk+EG9FacZVJTUq7OSzrx6pJRrrhvXfV+4ohitYg7xpKdAjxtQ1/Dy9GoGG8SznkHHojesWncJZGrNlv+ttfJRk02V2CsK/HhaIcluedgDFuJWxuAkyNlAQ7hHbDnc1c1tYQLvhYLtniekaeNf9rMQWLm0u63fNn2Bhiv8PdjqT6j8FOTrlnAxBWtP3ZuilU5PvvSh6Q9WPrIRWHtt81zwKhm75cEQE/lS0ijTnPsTW1Wo0UhawV2nQiNk6HHbJzP1YC333smd+SJpehKswc4VmABuGWOz9QyAwBWNzppaGzhc0SrfR21QBMAWGHjyh3A9AkcuCWdK/rmlptSUtG0PWieyEa9wd63Mt+x5k4nOdjMQcWxVkAkzAwAUIxMiiTrOFjtU0y+UQOaAMDsczi78isA7RXoo+b19nnAO99TCc0XM1G38unovveNG3lyqcVUAHarWdhEhMsnVs5vdCXyZHJ1d5q9GsdaAyjaQWYAwMfYpJZbFlZJ2lWOGNAEAFLC0JUvgbEfYBddtWVpp/SXyD/rCejnrB+u5F7oUSdUIZHzEBnjSBY0AwAOMpX5d0JduTPn54JE2yWY7vbafAXChKVVhfH0WP4vsFudKAX5qrphTCBjhV1yM7DZgZmJVmM5EpXfk5eQaglyANvMbJY/mh1VMqiYXmmli/OD9KuFKSbR3NVkZKnpXHCzOWLh0p529nLTcgCGVIKokqNfbBF8ypI9doo/ZrRHp0MiKxdw7+LsIx0rsV30qtHVoi9y27FCK4LMuJw/aTVBCjqtKfXLbB4LaoYJr5DguCUVhg2V454L2JZjyOFqoJShHL3tKs/FwQfB9mh7cGtuL7zKaE5JMTfXH81ao+anBz1mmc8UrGXiYeSSM0Qvj3bKfkoXRCqvBswsk3+PSWfljZ1EBGVplmXZmGormqxXoeBLF4iOA+wRumbtaZcyPIRrsjvOvoRKlZOb1BkS2nSjW2vanY5sDnKYeiTgNtnUOrJvbe0FFJGYlYOf7fCnO91Evd1heMF10s7cqfG70MDyyQXrzgAaVwFhTXTtlE+/egqDWAO9akYovDirB0blOnJ78WDiK9AZFkIHQoyicSwauCnZBseDyd/m4JGt17wwkmuG3bS/ktgc+EUGcnCyc/FZcotZt+hfl7guWyqlDYLKKSNl4c67ejP2z6PpID8w/9S1g6ofqk5qVIC/XY4ZAPCkZmpTwhk1evHE5JxnZxV4bZZYOv1eJgDAGszjqS5d8Yf/cHfpEnahnz5WNGI9qY/VW/s0H4Uxp9ljeEllPLdasbMOn3ipQeBlZkAwWCEUvAH8VZx65mR1+YkgpvVY3OWhwQ0frqrLoX7Jb4twCN+H5lPlP9aR2ucG9/tXO69Hs+tVGoPSJO5eWNjsmcR1ruzGVvCq973b92fjXvcawzElVCCg8L87NvoeipPWBfxyIXPo86NHmFPMxqgI//I4QChAbSvpmxi76a2f0O1nw6kSO37bWlI+WeTIjd7uYN7wesOz0lMuOFuJgFAiyxtlnehGUX+E+1snItHBhVXLXLELDxXfThU0wLa4CtW40YvsfOXM9s7Kf4WYz6OQXQfrywwJOnDp1lpqOe4E+RXn1xtSu3VYy/XDRTW4V+wDFpBkE+XL8vHLL3yN5OdZ/H1q1gZATxGpGl3BsV71G4EzYWYAYAbYsYQ3KKVHrKa0vQ0sQ5oAwBrMVN1PCcxdjhIATBdNqyomz6DhQUVTqtFRXT4+gML7FGcPrl+aXNVbxPwaqxyAPiI0llKT/6j90qdj8QdS/GnrMyI9zVMOQB8SeuuGy0f8jKbZxfubpgJx+o9I2eNVJ3K+Ws+IBtOXMgMAzNJQxhLmVFEUwEvbW4AZ0AQAWrSc8d3fUcOGTQIAGV3VrOa/i3nt1e0+907wsz7WozrSx6tO5BzEU9askrDIDACwMWvnpOUUk4w7N38WswsnhbAvjdlyC5X5U5FXXiIq9JeabOA4F/7w/PwoGQ0FNwghtRBb+0IJttFN1kxBXcF297OeAEe/4KgxMJ1AATC83OWYxo7DF8BpN5wnTmAUfJ5sgpMbYsnEqZpCvgCiul8xW9etihjC/yG4RUluCBlyBMp+QTcskAGA7AmIJHuWSugAXrRpMIJmmmr/ox0NWJoOTEufUODKtLsgWffQxbXzkReH+YihHal6hlHtgcC4Lin8hoIOPYS+W3YEtb+oc67/FoJ9HFcbeM7FobqDri8/9j/bj77BHXscJ/aO+4v613I6+c+0sEszTOkwmeQ+i20feae6tqFC6u8995E1iken7yo5d418uAJEIdZDlA6LQp8tkJESTocuMYCTbTCagE3LMKZlgcFNJ4lD6y+PrOi6VnuYAgB8rQ5mUl/cB6XBOgijZPra3nlYnVyTjrRKtVSVHiTDvb6n9GFsD1zkjtCM0KHeeHxNoz9jt+YTHliCIbjKoPd4GoT+RBsYRX7RsC1GgbzZS/o3ONTnhhYYCenAJEUfqKH5HOu5FSbG4HO2FFyrI5wW2xQ8udUsTsMNU1xw5xdT1gIeXONaKyLXP8S8z9Qp+lk7ADg6OSZrMfAmTmyx0mCktORIykznZCnWn3kprsBhMwkQwu5pqwX7SHEDMaTCgIMOnDeXb9VrB1ZFN0u3nfO+mZVOgwy/EEEnB+FTS4bfqyp2R+hCRtw9Cm0wI0AE3HxgpSB7GGOBuejPxXs+cAHo8Cd1rV6e6VZCa8o1/wRXrJjiADtkc2W3Ub3nSSmXCTbJhvrtQnm1gOhEWPAFC7JbMdVPsDglADHcy93Qkpq4FZrOJmiENSkbeEQYLtezdu4bQErEQlsM3naOm0MlEaQXtOw/ogxoJc64+37mx7CmPLsq1M9Hpob3slcErJlqPqr8O9MqCnlHudD0XHqRwJCgKCfRIr997IW12F4eTHVLaEATMCLNkx573R4hA1LLYD2RQS6KBYPlIr4sWsE44Xen6OzQ0azvw1TC+UQGPzyIJXVHFS2IRXEzgTdmqZt3G/lLmCrX5s+KV5MjTCu6Cs6YQUoHKBHnhFUmkf7UMaBlDKiwnCG6GCjtM1o6PpSLjr3GPVmibdVecznqLm/GMMQU8PDo55mza9c+iYjCynRA1DjGfWTB73Srgc9ezM8Sn8vAjMzKmQG2WJbM8SF9UHM6xJWIF4t2dAUYMneap5hPr06pAzHtL5gq2GUQXXY88OxcXTH6k+toLajcqmE0r1Vjd+W734Ski65G+TPBX/cbnteVcEXiwyv15uaGtsVSR2ub9lSDsv2QEjj7dQyToJ8g2iikOCD/nDXAABtdKI3uE+PyfaYiT0XzUR+YmL4lxYObVY9d0EIePuLoIEQTp6qcfH+Aw+fFpHTSfPnF9Pv9Bebzz+8BbPH5oZqr4KHLyETVuHWbIdlp+OtszADAoMpuVy2k+H+Ni1ScS3KdqkqsnZWq1dvsCvrLBACIu9dx1mY+wF87culU91e+xwKrAcC1Fmgtrq+coVcfwQ1FA4n7AFGHAfEc9eJJ1nKe4GtX1/G3e8ICqstLxBGBpikA26pjo/zNCsGUZlyFHxMNH7wTMOoDYrhgtSvWMQwRlBCKVoABShKzMFp5/iruuIJVzZ8mp7u0BQB2yyKbm0vcSMIHXRN3jWnPW2EFZ6AhiNS7hHF5RLJiHbY911m1M+C2twCRxvquTTSO32XFwHTy646Jt0s77moQIzLXm/EXBZ1CjJY4Ij89OP9iXqvXQ/39dVhHV/skdvkrzGu2pE4C+rDb2lwhfF9Eq5VHbQslQFLEDCfCOx/AGwXVge8+RCYujq+6LnvMApPcessYEEVCux7r0T7YFIf/DZi8gfSGrbaoQu20Zyzo40lubdrkSc7TQ5WlCObmDTisc9jy3twPnXdeAtjoT8b2ktDmCYFQWyTIPunhr0bTPC16djUgb6LXQHOYTxdaEFh30x3bPKRRbFm7EdHm41JrNYAO48rBuqUb2oNXwakFC6yLSFkbVEM50/RF/pg7YvkfznDDscHQZpXVtRK60awT3kkSjIYzzubi1QNyZeBh6CDrz87rJd2so2kdZrZyRZNmqB3fxIjzElU537YKK+KRv1ajHrpiXSOmkWFTe/PmeW7lStis166mGW1ThJQN9/sajYaHBKayIV3emL6AVTCFBxzw9DP4DlsFwyymVjTXUaZJy4j6aSfBGVxDM/uxnRv+qBo2Aza7tkvByA4piBaF/Dhdcprw43vlpmCqPesEVEwPkYKBNhHiPBy4JrYya8GCKPSoZD54rqlLiYIIzY00HjdYXI6WeSu9I6/nT2gbm6DgNJjoVkbs5fTlbS6cbjvhdFzBdZ/rObCj5fBfuU1/XNtGqX1rk5jK5R5iwnLmTNiX6UxnlDSrfYGFFDibbyqdRRNbQFXjYvQkpsSWCDtor3dhWmHNIcEkEPv5WY7zL6SyWAa8lUphZQa8ERpY9v4xJWVXecEThPwYr8/D3xE2ZXcJ6nA8ggVx3tDYDOTautlmJ4G+ct0gVy7iXz7UB6IjPa2jrWkaCg+7dJw+I7TjN6FWG6jibUosPIo/LtNB7zZK6OwTDsqvJhAj6aku1bVqIGVLUgLtA3xOLL5IvTaNqiDmRfDahzpipxVemZF6yf2YsdrZQ06NEbu4EpUF9W3eyH1N4jLlSeDEEWCw4PI+a9eK7LyDAQa+SE5Ekx7SS2GOzwhnNzSQbkP+OW+hvYfwi1Wx6c0VlJ7oBDNHfFjcqkpNYU6CFaGBHUUJP4nT1gKmXdfLEqYb1mFZJnmK5nvnstFEn2m9lBvhpGUAQmwEN14yu3sGY2gqeHK4uGi4yuhdsxteYuJyt6ZFIcMxOkGToogdQgAByxD7jzYK4xdZwnDDvifJrfrXkVgBYSvmgVBbuLZUBLqNXCO/6xNMpo9LX5H9+em+335jkWt+rl5jt+GvrZgRekgrCR9Ll1K6O/wO74RzopBmD503Br5GE9YiZSEEEC8dIKILAWNovCK5CH6VIxYcf3XKA8awA2MQdnSCju42dS8zOYpcgw/VStAoDUicSVjee+rXemQUSwcV8Z7By7S7ZTqwAlh8mZJdrNRyZ0wGOWUITEs5FCQ2WG6Ad6pHQZJLt1dgtnnS4RtnOPrXKcAn+a9L2+AR+H2EKnVXllJ6W8XHBcwAwA0H9PVOrZkwbgpZFrhGfQDe+eziGtvTYC8bMwGA43xGngL3JGxuB5yrDr1dM952Xz8AcDQoRUJ5CLqP+eIGTXFxpkDL4i8LcESfYPfgbE6B43XfVx+viHc1LKnmQKrCkJI6AbPLZjsAuWIL50BVy2zvgMLwd5og5a4ik5gIvi2bc0f6hC5h5p5ahHEejm+tgQTQc//pWB4TXxIqv/U+18xm7tKnzP53cdYuSABdJJqNLTV7tL8zfWsJilLZdkWPF+wofU41vdRhiE7VLlkRMwDQMnpamh0sY16fBMoO3nrkeMXLdYWPA5oAAEEze9RmAa59elvUuoL9AAALVJOoLNhyfQqIc8YxqKJ/MyCXGIwB8693LuhK5ZgvNU2ec3qzce4/TNtadwIn0kL6ecj6crrBhmQvNAMALGNT0uzPMWZPR4Kwu42J9kl482+MfJsyMQfnXDTaVI7VTPTtyorAnHjwyOIYWi4CsTSeBO43Dtz0sSyIXrzMde7Gd5ndo4wJtfyvF4eHcQI8CC4ou5JI+McszzPqp3Ssn4nl3YMO83yKKUMKEaUnBdkcxylhpLo80jglQfgrbMPHKbllkLHQOBWsiBLB8HyViti+aEJKXlerKu69A/stO+fvzq7ze+Ly/WD1IoU95amRIBMzADBRLRnPLc0StixVJdjsXLaLMaNb4fJMAMC856w3kMX9zddQ7tH70WEGHQfe2tk/OI7ZD50lWrb8utyYw3Fw7XXh5a5jLdqN8SfM+Tofz1oMAGR17PE+Sp7quhuXddl65VPFY/inXdWt1+m1+ikpeikhLzfD+VhwI+Z4fqMx/NMu0HoFAQcWDItdzvvo5bZznTaS18CwpDOEbG5LkufGcdNl0+l1/lE2KBVEe7YVHAGiR0E2JwUxVVtvzgaSgaEiTRfmEzrOsnXmd1fziTvAPf1EPXE8vZ5CrqzMqnv/GXdO5p3xCp12cnzfapiFXqlKl4p+NzEDAN2qmy6euNHB4bMrVOnTmnuua8P7cj/uS40mADAni4g2AhtGHvsBNd0p54Sxq/sLAoCgebGrCQ8KnplFGqLs9kg1BMoR02oItu/HqKFwXoGjhpJcuddx6jomA4Hp6lAKwvVBuWQzUOC42eIYcLIy+yxwTvx9W+B0uoquhImcjrO9O4d3/nMiE09tRH14qEGQAPrvPx1pHWc53Jo/jnxkv8afuxz15FDTIAF0lGj41jpExt/M78pbS4aXs+Li1AhB//uHLm3ljx2rFqwuYgYAapnhSkDZDpaveLen1Y75WS7ATkgTAMCCGmqjAhOvXJoWLkGDAKADYkiUBVa5PgJsO2M3iNC/EISIQRrkOe8FupI7btcl+Za39aRx7GRnDR3hwcKNLGjM8XAu1izwaZ7bNRJZufg2PyBzG9xaItkbrKPiHs/tL4kt3qt3IiJVY8Q7/dcHLGpA/iPLs6f8f/7ursjwjx96t7834e7zojJ1SgYH8sjYg+B2sSPA8otDgp6skV+z85iJL1x1qgzvvoO74uYhgZRfpEDnKKUCPFbFryLaLSnvmcx3lJgjEm/QjiSCPwxzO9a/lVRi5vNJSqFIQ152ytqUpt6/Uq8238zUXFhF5gQXwJiOlbMKYJTRSdIFJd2ljp8cDuHHSJ/T+oL3sZGkLgIRCXW79HH7G7+feDSjdFeHip4DF8uizYs4rX6Y0UvyrCwjy4xASBnIcSYqqowXQFPrJ87QelYqKeR3PXoYPr+pS6ENRJDx0Rv/BGxqsqHENCUaKjAaktJhCMnJf1LNF0BAusO/CrFpCY5H6bR0KD1/xijINZde+7FHlz/+MXWDcOr6AYvqx20TnhjwZkXdcVU9kk8aH29LTl3UCE3EwWxREZ/EFPkq3TN7G6IJo0nLnRDbqRHwy1gQM32ZfoEpcYleglZxvj13Xc7KIHi/C6lwJOf0Jr79814hCEAm0iyUwDnaXnMokmxffiG03TPoaYtY7kat6xgDK3OCuOlkRxI5Uqwvlf32Z+uUEnFHuTFXCBT18f8Y7HOT6WTnbo9SWjBeC6a+7bHd9j3dRp/+CoJnWYPd8rXPngzFv1uOqAfCopmIrVQGPp8wFTUwCBYjwwjNxX1HWgWasyP2U2iPgGpsFh6wWByxRFs6Kb5Xe+37VEv2nT/27ArPuHb0jmSeXVzKO70YuOiH0wuCq9KUtfedvbgkvePL035zHQBgnIQvf0QxjXNpMe5S4tXec6hTYyXBak8i0d82MSscF5/KWuzQnt+aXujQyVeOPyIVpfYksvy7YWwNy8i1jN8/1qvCVWwuT4A7oWJX+QRWm/I4DaFxdMGE8XsF8gzGPOZYKFmFQCn2+BRzKYRFZh4GXi4eqn1JOMwUJqy7E9aEYtxkgni9TJQ0k7o0YNgIdzjZXCA5XBGqSV9yl4CJjYgFrxs1J+SEc6vH2rEhoQkfADVIHydwFg0eeR83WujTyH5u8B+XD9jmQZwvfbXOe4x0sG81Xhv5Jd1m5nK3wRcwcAnNeeIbWEETUUsi/g7aOoyPa+MAuQ717YIUTxx7JQ+2CQiJvDwPzyB4M2TeXF0w2KIyLoziUw4FDtIBXOeDgeHZK+jm0hO6br+r5QCSkmAN4t5f9JDkQzQYoMNc48Qx7QHvaXwuqu7Bm4boqWowheosliIJ0KQkksiViaf+SsiqpAnsvmrtb/oyvnn6esHuDSmahktgOJ3pY8/46LzK8kebfwBErrGJtf7rxdKF+ECexc78E7Fn82IxcnLJcJIYhT9byOndUze1e1Vxaj3OHN4ntb1+rdunN1yVb0E4zOL4CDOrtDQFj/9uDdPhCweGOHV6+feEeS/YRi2U7cbv93NXYmkKW/zzBDi9Z+6ADbt/76+dzGuDWiPdgnV/Iu8ThtQHtFpTbvGBZnlDAu3pBUwOIhYaerJ0HYBWlkJ3PboIkThCcTPPIyJwYQ8IIiF9gil/P/2jzvAsUHERIXqn0NWYi3STd4tpLW0CkEgdq0WlMCZvbzEhkoSHCgyglGeDgVv5/+3xVh0SFSBPy1t95A6QpXBzMS13mCwU5q3k8KxYNvL751KsjSQkMWGz5gwiiaWVmJqJu94bMfpxROqiIXDqD5I38GwWm1asbW5e+/6DUE8sN8uoaOLCWkizTxChzdpz3U39ZwnTFInBVqseWpxJ+G2qehy5OhEmKj97AqxsEnBCWiqTPwaFFObxFl0QBnTjAY1BQVbFwaNG63kidqkTZYuqeSTAM9M+pZ09ZDelvWZYb8iE41YuP6GxttsprAZI1/HU6+jnOwQH55mvnahvY/w1V2fTR8F32uXpoRhhoasra9gdRTD2qTMl/zOaizQGsLtHCiMFB5e+uYdJK3wwrBDdd4snK03Eaemu8QQ6kA5G94pfDY5mbPvalBPw/lhd9UvpRraZxowkDq3PZdOIGuRqrzev0Ok9Z6mU9yjcIHs/VEpuHlIXAWkrHUP5PjRZJbMj70O+xyO1I27J2PfW8iS9GCQGXHEISqnv7P947bZmj7jELvxpqD+4p3paHfL5mEI9gNjANc47AjdJoOk4ed1E+hD3zhqiBwjQtSwQdRFSVgJwEQSzBapmWvCc3QrUiJ2eX64GYkFAMz2Q6Dori4Lo7uiHC4e/8lX2/ST7/8y+vfvb/0E//3+8Zpzvtvf/WeB/X1192h0W4exbud8P6efuDypWfzlV4Gup8/aDXbFJ+ug/GzJw/gGhDLWx7SLE+iNo9BqPNqaU0GxmJZN2ToDWJ8341yzhC9bGs9R1ZH4teXvW1RgQp/GWruSAIZ2yvvkVG8jWRElQQvMq90NoGmxrjaKlHzdPxZ2LN71YziLHUqaex6KKBwdecryzdcvJjeHGbcJ4buCmq34jN2En3dDlmzbbqoqDRytTj6+m2MACnGzy8TX2iXKheI/vkgDzJj1NqAYsNAb0ePicHoHCus4Y0EQWtKshd42yMiJIZ9VHjMpNFwE7i+sbY0qHTtXw3BnKAjrQohM+bQOORMXYXlSZIwXiYp1DuiQabKYvwezoer79e9F+RlGBoUUNzE12gzXHpn1mIysgXCdBc9FVD+90mzEQOiTBYQXmWI8YekURpBjSlZfvGcrtTmi5m28GLwwCk5K9Rq/4lejeIZ404aeFu/qJcvLfQATpQDjofauAaiFDXspT9b6/CIIMfcazjXnDKEJRiblFilys6LZD6JwdpdM471bdNZq82I247kQ1LU6rstzEc+v4clUYr0rn4DmGuvtDOhQwti4oS+vvllZr4Iom0rRBfzKBfJd0YNBKBrF9XNPdVO+iqt9w44zUBjObLH1sCdxmPDYeN7z/l4W74AseKnxTXIEqrR9G+ZUvyuC7quxvbkWM9s/dq6su4cb9dwDc9VDQGdfd13CbR0jYuj23n8ErfrLCYVdcY/fy+SfkOhALe0rw6sTQcbIFfPsGV1vdkfpUH8+PF4c7ZiqOjrWn5dVfw1pLOJX3S44oolGKeYooQYu+yvWyOVue4hy8JM9zawkNuOIBQJfFz82IxAvhLKhH74emW8IpSk8F8YKPRqpKp/HQQf1psdQH7dVFSeGVQdZXSs2fjgceHSL/dZ3V/HP0mN/MlGW+Rl5TdOKmVY1xdslzWZjMPNJZXZ3evgpW8ifm2xXC6W6P/qiNGxnruxkciAlIrgowSeRsuoA0QN7fWMS8j4D/kG7cOvB8n7DPFQ4gPHcEhxDc9M0YmO6KrOECc1xCZfm0wkhGWPHebiMQBFzY941Q0igAWyZ4cU2MAWEy+cRdCADvN4ZCTa61nPoI8vbIuNc4ALh4i6C3Ei+AeURBR11iap0G7D2VEGi268A+Ur/RWJ+4UcOldjZiHDLsdAcMzyShcxJZ+FOIOQ0bscgZ5FpYbDY2ujEH+WeQQtL50ohFKS9fGJ8lXrSB0QvcHCQts2RjmfsCFEsC1QbG5yZieUJm3PCftKWUa5VYdPsEhsoazGerZw8w4tUmv+N/XTALIiUB3j4CC+sSW42OjpT0sxQ1yNiUaCFhgiY4JJtSABI/mhUdmJLzKNymMPBUc8OYHDZQOJA+EMw7kspAffdlA4YQ25Vr7hD5g44PX9pHT2fCDIiT+0q/MAyJ1KT7jftZkltHx480zTqxJlMcDDblcmTLFzvnNOCPrZSk5J0CfFpOynKUTFaPwnOUpLCpCzG3Oiyrq1s6iGjAfOME7Cu4erA5oQRSczrTDFHca+1r1N4ys174mUynXZ64ZoMAlJUCRFwzxm+LhrWLP9UdigDGip3SQbdKVsgoWg3CG3PAH/W+OvzH9Atmv7nbqKdQiwwUj8BdQP/Zq2tKCugfO97TX3l3ss0+gJx/W6XzBMpIMSMcrsNwFG1ItbKTqVoMPEoz6R5niFuLb6+Kna3T2AfTYQvgdsODfWvx4DE3MedK8dkxDQBMonB3Qdbk+9eWjn86596Pc+f9aLi9H8hs3ayefUDITszIBiCm3//bVw0S4yHAXCR/Ri9PTugQ3qObqWsYBMUgCCCfzSfvVbZzZ5U7yY+hM6PenQ0H2Y/CDocYtSMQ4Ns8KSIxN7IWrYpxFWA/6WAKEHznSwaZeZODXt6Ced5/OoHvuAYb+JmWaK+V5zgXwylZDfI+Xvt8Lti7z/XNO1tUTjGvapkFwtv4eL2pKYRu5nYJqhi+C06yzcX6xfQs3aiidlEAaGktSbKIsc2YhAH69/YvtxJMaC9OOjQVudBAwImNAzI3FlVqKybMgX7Ux4uR7By6AuaaT04afFgwt/g52emHof0pMpXMV6X08tC3CVZxrK0gGMBf2ZLbZ+tHOpUOWRIWk28ANk8RJF1/uxv4C/kGqRbZKb4Zsw4gbTMqrj3+G4Qjs6l5rtsmUnh4TmU0mDZHLxqxhiOhCuBinmQ60vZMEpKci3xUQfqAzKlmQgDY7QAdUY3FO8/IpS/z/Qbn9ba+bM53/yaKY0zgZPPRdjjwZ+cEfsnGNMzWmYzTjcodT6fnasfuGO1c7djTmqEHcsRxZGDN7GeVTkqtTlAUSQq5Jm/IqwopC78dPmf0v0x/SfakUvJZUryt/fFvvVwg2ZPcqgQFmF3dAEDACl4MiDg6bjqRVOfCNZ3dTecwsCs8UDV3Gq0VPl9Q9bRTRz1bflaDwG4vgjtEyJ3pLm6VT+BKu5bVFs/s/MsVmOLOfwAARYEbiZ9jg96wW7pA37nhcMTeKrgRJ96f5gSJgwK2CLEagQB7BR7IvHHA48ixBMBN/9t2AABVdYyy/EcfqnmM4i56arudbBLUDV+GARSgBpoiFBBtqOLeJZmKe/MAALZBYzkuV6BWPOMOqIPMNg1OnWzwEtS5A8oSd51vVN/CP+t3twTJ9HPtlG+tyjweA1UBp1/c+l+/i8QasApCYzKRUlfZY+Zn/uvlj6HOCKGr+N1bq7YBhMF07OTm+zb9s353y60wZxl8ntEh70iCCl33vfX/cvcpzmcn3Cqzwfz+y26CvXbw5sPV+RLyFWFyrH3bAG612fBk7pLZAF/OLTO8XX91d2+u1nymle7t4Qm6VRCVQhXoom4AwI+vATTU1HXJp1mdC6lt7lIOatoVHjDHnkZrxdAD5pSpNomL0BUvoj0iJpzpLvLsE7iS2nW1xWQ7/2YM5nbnPwDQiwO1J36CgI7Ybcqgl1w8WNAn8TcqYA5BAY4LYWu2/TgfphLfNWv3n2m875zyRvokRzwcPXiNyKHgTYEu6gIAzlkWsa9G/rsCpt52GPlfH+r0i/ihvlNsRc6z95H1PCDlm8a68FluzooaBs40CsU0dhQAAEyASpFb/DTElU94O50/KRkaWlE6kOzerQMAKCFqsCVchtd6yUJUQ/efkaNpNM993FT8sAhLZQ35n5E/ikP6p0sSjFW08DWv/3Rhxce7nfCoIBBwV8OlKx7nyev+0GmPufzRi0ffPaarHOribft2qZocgI4ynnc0fYJcb62fZ7y5frnv6Z/NZ89rlq2wJz759HD2lR9GPGSNyG1WGShTqqpigS7mBgBWpWpOo2GYVm4q+Dty4lS2lHOgynprpxrMpXh2hQfqIqZxfsUkzqtSl6bOkzihUdpFiABApGWtJFj1FEy00pJyHvrTFkg08K5/AEDrQDYkfpzknwU5he2lR2xUrujhRL3cFE+SvaIjpvccx2hzruRF2UReWRb4ru8IkTfFJ6mmtGSwxRG6mXecsuyPxq6JC8XquPJInwSqmau+DIbR8kgIgK+zd//MzctoiUumrmoGyWAvBIM5NLxqEVetFqngZhAKHj5kgpt7eQU17pbeSbNT25LPbw6B4KAtuCEOrEYa2B1hYFdkgU2n1VMjCaxAEDhwr/vSzK9sSeYbIwQchqdiPVWNBLAPAsCyTwgFzf56eiksMJ76i/6w8f2qlS491Y91S8izJ0qEbW91WTVZF3IALKaghC+G8kVgxQCCxXDRFABAXgDO3u6xE14ELhy0Y4/56JR8awLTkioZp04FXdu78gCA4xh1E2zhtqpzvjXd9uYfMdur5sZ2Sm8SPrbPg+2wijGBz7A2XaRmCGqxSZ2KmTT0BD4TCpr0hFWzt2TlnB+Re+cD78i92Rtx4hq5q5AX5ux+l1rF1G+dvQQqugxwzYzad9yQT9uWt5IiTlSjIZzqsAyeSFV98++6AQAVCgF4AbGymTGwc83d1VXAtoUApMMCWQDqNglc8rdCq/oQAYCWoXVBEmxqNvxa7RPuXuvfXa81Guu69x8AcBny9AY/XlucC2seB1xsQ3zTuuwULs/R3yaKa6mVUjxRkN7h1vt6pyzdCcoS43iqu+fWA06z62HXJOSKdz0hIS9izHs8QzX62gGAlEloiPmG5hma6LYbCeqCgpWGBFLXmwcAOAee4+DQecuqwWyxDIodrkiDuRXZKKvBQqIBNWqw1QNQLC+Ly1vWbJq8b6BfPqHOeRon4mHKYgjvyEQWs2bl+N2o/zef864iTn8iHp5qMDaAUI5OT+6tXopN9Aj0O5ffUK3cd8RJyoa4ZWGTo2xlxv+14Xw4H321HOk/Ik5ONR0bwC0PGx6lTzPWtamP5zNVhUmkiJOVMjGsSgwqdyjQRd0AwNw7/9CgbO4UkJGzm67GS2wLodDtFZXUUdWgmDaJWqH7+hABgIagxY0kWNXc5bnaJ8yq82+uwWnt/AcAtDLopviJC/Q1aw4BBnTFkzRTRYdM71lKreSl/AJf0ftwvb06G5SyfGiwtkPPEPrdJ/lnREg/qN9xTzHSN2N8q+wt5ArElORVEV5sAwAw+VRn47bp1RRUfedfvPxSKmeJqKrobmag9UhhWgPCWXL+rlBCZihDrKCE7cBZxKIktI7NBADAtAfpKkw1zFcJKt07TmqT7VzZyQDMipvr2QEAdgtlsYSSLcEuznQA2GRix4AtcFISKDZwzFoceMvjJ83eYU6BWvmXUiUTlPqqpK+q8mAkgdcTTOCn4xHkb+/8bN6sDM1c+Gg+6uvBx26kQ5492bHK4GU2GQIAN3eCxN00alMtxOykum6ZoZvt5Ngkqo4p5zuX8PGfFqrK4QqUgEK1ByRQMYCeHkQAAABpl/v0CqJA0tRe+990Nk08Mb35HwAYQHOQ/7OVyqrxltvcJt5yxtvEW7+k29glrdbdAyJ9ooUhC5bXxXxwEfZfNVeeB/k0uy+//Uov21bpBkHM5f8XXONFUlZujdrWzGJUg/zUhO5wDGMxItn5O1usOkiKZfx71vT9go/HDI+V8f9hnmfP0qPION3ptHy937vtdvf8fYB+BcgixnNVUm39MbESqDgIdhZilTLcn3NZPIhlzsaH2rSARRAGrTU023rXhS5oF+86O0yWpbB7gzF4ihdhUxLC09RPAQBJm0qOwnxe+SIcq9vOa+bDdRumqAKKe2/lE0ZdHgAwSK+mS2R1MZybZ3KjtjJmArm5Qba5gtxR0GB1QWnvUFRUIXUXTvN8cGdyYzVZ5bRZtn4UPnrycX6O+QcWaeLztH1FYGckbWqWN041euXkML+yG2mis7euWGtd51Td6QLVGQIAYw1+NRJ2FuAgm4kDVuPP706tGxr0yRcGn7270iGgrksCPoBTXoQw5wqf6S5OUxJtL4hl6x9vECwZD7v3HwAYCdru9X8WCZwab7vNJfHCGS+JF48srdITSvEJfM9E5RQq7U7Sl/IiCVNBl4RAwuxgoERBqd3tbjANpauCsWBFku7sagcAwioowG75IhZJwAzbRTwSiVxbSaqiarBKXx4AwPLwqqqhAo6bGpAtnnEKJCGzPQvSKxtSAmm0QaXGhfvFnbLkhYf43fksH/x8rCId5lgMQQ2ZSFXULJGCG/7n01O+HGciHd7UVmsAAQydngQ9zRYNj6C++Zzf0vk1daRJjg1xe7oGzSK8ZYvxl48s7P5ejzS5qdXWAG5v12xammYDRs/M++RTd0nbm0gTnj3JqUqkqnOmtQkcAEjf//hQO7K5ISCCs8vW+mWWhdS312FRbKBKXRJlAR17EegZ//9Md9G1a0UZub1oarbzb3pHNtTxdPX+AwADQnNN/2crRU3jObe5TbzljLeJtx7ZtkrPCLUs4A4Ih/tVi6nENs2mMupnV/mE5bl3981NbJkH7HmzYyeJyITZRv3qATRIETBxgtXHE6nXnh86fNFw5/H/fEz+V9F8BWBuJnk8IzBDrGQBKiTxOAKJwIKjm9P4XqATc3qaDjMcUru/ie+qc9l5ILqG7q6NtBlPR187mCWUiuCZFk/Xm2WEx53APsI0N6HMoqiM4EF1Cz6p8lTZJGG4SiH0ge7EzymCUxlYQEyrp+ulRLV6DyQN582vkuwpT9pm8AOUDZwls2ToafwK2VUD5Hj2NoQ1TkXiDNROwOrjZKiqOaag196SppK2vji5KwjhNsDPH57Ee4BbpHwbJwJu3vdT4Gb8Usrv0tPp8teSvyjZOfWw9K1AFVqkMNlrZUPW7AeiZ3CBOKtzahs1fg+mtnnhhIHRwSodWHOTbIEOCwGS5JtqkeDTVCtigcRRRZvIURYpIASYHN4t9QKkRUpAq/zqVO7W6XVS4c+Fiun5VJ1etQIGfC0FYHHMB9VkOOD7PSwsc9AcKTGG1O2vrwCSA7OK1bwWGoC/YuXq0He1OOOTIsE43aCqmLocC+auUs/TWfklqCxmcaM7mjk8asOeQajoUvkKsJtmLhd4p1om1PyG92oQCvykhumUUjSoEdHKjI0aZVvD8dWlEU8lmmtGOjGFk5rE1Y0SzPTZ8JEdb2glJ9s/+/IjXCg+h1DLGyD84HBvP37wfA9cezP8l65pt1SnzezN61cfoI7Eey0eJqI6mz/jel5C6z2VWfpCvYVJ8hYfeGiaAkS4btCav70fH48cK2xuOOhMGPkroagn5aEZBAZlJbchpMAbexbJXodhG/lrKqlkcVI1kkbbdaTbr42EWsbT1d2AqeCrTGkf0mU6NWUdlfxwmiP5W9kdvHUy+f2MaEHwMZn5Agp/oEy3bOeuhFSHMZTzAH2TsTQ3CL0Aa9bXqZkQkq4GbeNhALEVs7/UTcr8iXOxLUp3qn6qk3CDGx1YAwANQlGFcJUYwLBlwIR6G3LfmBJkru/EijZ0VJbShtGbY5iz+9PJtY0lWzMrN01Yp128da5S+VNkQ4/TTVVl8VJtrBu4vUKjFsjChnygOLNGo2U8cX4h6CZNhFRaq6JjdTri1DlGwdNGWvS30i+Z3kdeR/ezBwAMIv7yRiOVoVhDivVGRfn9ry2NYunCE/MXkLobYoK5UUNhLiNGCZWcWQc2XF03mki5Jw3lqlwBKkpxVQ3ldk4AlYBSmFxXeg1K0dlW+ojjF5E4s0Wyq6JZq8W7RdBskh7bMpNmF3dsJe4Q4kbC5SlF4RsZrCo9e1WFZ66qB7NWlf9ewSB3Sj351+UmRiuo3r/fMcjHEQlI5VQhrzpYEwsOzCmRtwHW9p3htb1+jzxeeuLvMQ2/z+RV6flSETHJgQo0d8r4FtVM2iq0t1t0gabLeZUhGuSj2+6l3TB8Bju3ZEMFz/8lSOVFxTr+VwcKwGn4Xmk/+CudASyv45Zx3ct4fQ/nnb6xO4PLVoNWxUxmY4FW6Fz2ZgBaab4fb24h77kVXUkD7MF7ESzU9qSeupdTI8aIDjRBcspVDLVlL74ES+3xPVX83Q/+KnIAzWJrquXdhkcj4Uk6d/awdljHC8FP45fhm9rT+ufYr0ref0cdAFZ38KMXK+Kf5an6Afi/gQGn4CmuGQSVf/0mebvqlut2GFNIBHCmaGr5FXxtGrc3G/OfiB+K40v8pct1jVUvSU8r6l5H9QVFCPsKSE2PCQCQbmBQax/TaamrKIG78k8sFEs3dMY6olhBWMBuoVijEImNBUB6bdh71OtMbTHXPtFc1rDS6TwgeCk5NrlpDwBIRl77ylmkT/zoFhSHNb0FauiIg/VTgYZaidIQYE5ewSqDWDWcOk9gIyV1YVcmI6ang3DGJCvG8Qa5xEorrRzbkGuryP6HACAukvWE+2bJ2KuOuzmA2ZEqVyRJ49r3qJHP3n4XR+a4O4O+4ZnVgmnL7E3AqAXEHsDQHWK7Sx1TWro6cGBJfRizCe/Z4XMOw2j+izl0Awi+6MNIQFU+c056Xs3oyfyw9DxozvovZtMN4BZ59eZsK89H/2RvkqzT50Rw294ar/5LNCWnOrUME3ut5laKYVDhNVAImQAAFaBte3hEBsulhCUFhAHJf7YLeKhBHZAjSSCAtdp2aLG4WFvYWAVee/d93DZwVSXIO2rYEEAAkAas8g+OIOE2x2D2B3Ev8EkknCOlGJraswqYUrASlmwK21401s1VPUHTv4y2gM/bR//P5R6KRzg0I6jSAI54JSXZ1QAHdpAfglKxmEGVpO63HATfCMCQAM7OkXxwPe0+gRVRQANgD5czBmT3fAAALqGorYCFngIixeEGjQmsDQt/fjW+gaV88687jgp10bKUgy1G0xdYXC2yRpPEgzSeW9q6IeNfNioEKZfiFPOYEhIHFrheJJlkyuOys1bFXEZcpVvGWoBBrhtpIhfTBxaqYATeDuUZ/6HlP2/R47g/pZ/lEqz1qaXm4WsT11zzMHzXF7wxDmdeaTp3k5PpFl+CU/6+lsfVD0dm9SY8fTAXo3EXsb9O3Kttre7VIMBab69p4fbSmerPBABIQSOYHpk+HkBd8k8Gih0MnREVFHscEhAYCobt7/hIaoFKjygAoGqQgiCiSYqi8jxKdrXYptjifz1+g2S2fABeKYqrafZpAwDu8XS2WpiiQT2Ctn6C6MJms2bLYFNc3DqwaSnVLoy3XJiiPdm6ogdVLbBBC9LE182JSlXg8tKTdmn6IruGHuVZaVBirmE4eyNpLvAKzHto8Ipy7ADGV+6BCAAOAq/DfcdhfD0dd8eFdn3eylWpEJDubHN4b7cwW9la7yda4bZvmzlSF7b/EeMywQ0X7t4kfGyXqYuwLvHgiambfVqHmAfOnspT+hLCRVNp8EqRE/JlaLK7ffz+q5cfX3Rxnv9wuMz/OqpCs1rbKwpaPOMLz7I/t8kEANgCrtv3OFe0JlWUkJIHGPVtI0U6g2dUlcCcqxS6NORKCtyWSKIBq7wI3wbqQh0CACAyEEQc8H0oq+emnJd4wXGNPbtRGwCYvme6TqsorOfiPDufxxVdYc3oQAuOOFtinGho05eaGpvxFyDOlHO97kxGZsVZewLH/mGEsyW75gLOdhfh3HB04ci8C4DRybGlGSfugQgA1g3ODPfdivGsu+3uSHKa8lWypQcr7VZ18O2iZpK2308Y0MHtjN/4GmrsZAZqqKOXPVJD9wmImQLd7BCbhMVkk2sWdMv+bIUPL3PiUlTYjWbo+L/Wy20AMQydkr29vIx8jn9ke5nren9xFG7I1nxettbfbQA3bGt4F5Ewc363NMyXiX9FGwF1o7aLTW/Wt65jXl1nQGr9QI/1hcfsTzaZAAATwLWeujV6igETCSh1+lXsTXefdYbisKIGvYCXJLE44JA2pt40vFhb7LWIkN6sEnK8iRI1s1AbAKiB2OKDFUHLZZcIRnOL1W5TAmlnfAJ05TZlwZ0frr2QYtAsXv3w59qIQVeKsL5XaE8VfLOf3eH6N6WHd/yo/3Neha3xodxIEodIgiQlIJMGKGlPR4uyW0O9w7VR6C7f4r/0bHoP7iXen6DOlww2rY17BcwNu0sp0sz+ChUNLbhJn3zzm7rcMOu6ad6x6VGNIy8H7/w3Q8Xw0/vUJorwS0iC32lEM6M3/+mXkDm6tAf/B+SWUPi8YNsfufOlHQYAqP35VZZPrZRsqaTv19/Wum3nSquadsm/6X34NTXYYefMdQO7cpXHYThxBYWrZvLTobZ4Oz4AgK1dlGKEKxqBG12VzX/PbpoZXopR5Lt7fppmLwsAsNifqF0ULp0eS3QWI7VHnNm50g4zrU4XF1fPEsTj49XBdcP7ks7U22pgu87pNSr14pqULl16y5NZOd+EBuWy0Vvoe0atpRvDl1GunGpuG8Dk0wICC7QePCpgNY03fOtNexjxZ5KPfa635EWqnd5FeBW7JgBk64A9t54dT8ArUcALBcMegoe0UKl2RIRaqwL7OgQAQNKCgkjHqi06RW/rXySiD4zgK+k1+vYAgL6t0k2qSAlTkD5Y1e4Bc2C25EwcnAPbkYlxmR9pUmAxoRRwg3mJJblX9sSGa1Ri+XwBYq7Cpc066NoVoc1xeHDXnSMWKcukLtadXlOWZY3zh+1sVpe5sjHFXLiK5TcKzxvebtG+xOlYs/gXw6lbyZ4ma01SV5tnGr78E/G9xNvVXaUbTl2di1AXJGS7REAGoys5lkwb6MMOQbpxenPqVhNd2KyViC8Qqc808zjWotcn5AECsCiqLjqZy160L2GVEA3zhDe78D/RztuzAph5+jklHV+BO0ecSq1fnDL4+eslIFnF2i5E5vobxiLmIAnkmNA0XfqO8jJVT+TgONhmj2ecQJU/Y534wUha0HC/BLq5zOaPTGA/V7+N5kImXDD3sKm9PPH+JV2vccqWUTsczDFML/prB5c36leuA/BFAZD2NMOyM6051eZ/de2FsVfdBDcedbq6n9R/2dMbau8oEwCcAwRsF28ImI9wdRWZH+JArtqt+7hHapF0E1a8jDBogZr3Z4GDOIKSQ3UWHLs21skpMz/QWKaFPsGralIDPIoMGj2nyDJNqiQtLx3IkTJeVkWJRXzZM6VQY78AII8FawXN1JzzSzS67Oi+D4dTok0DJcK7uxZelRQKXKO+gXJsBq9QIQyHbI7/MJ3WkoLXnikcRqZXnYmBm3/SNKrOAW07X05ILjRTmwqc3AEo/+1IRTh35eULZUhdF9Ifmu0xmwotORFn3BIA+bjSXk6QiFE0p4QH/TblNjOBGHtf7McPW3FOHG6nuX39nuqVDOpXDoxlVCr7FcDchg8Q+SGe4g/vNlKf0tqqntf7qugJLUmYCoGv5/Gblx+LfeGuJrFTs0kU58NRNlKJbtT/ft4ig+RKg9D6Hytk9JyFxwJUaI26W5zubmbTKR4u0PXxr0isTxH8nE8Rb7/urhDS7QwUuFTMtjrW6tAI2yVbjdyMtuJuhCu+eoykoVJcOmKJLk9M0WWFLboaxhhdRt0gz/cuZRPc5Qw77NzLyrah7Ehb4UAiwIehp6nTNaKaLmt00+Ukl3d5op1WAqRHP101oaBf/pqjWz8u6qoGH3W54KQuy2KkbdzU1T5+6hoQHNXlhqe6KsNVVl2wnAV/nGXaXhrZbB931dmGGx7MezI9u7n0KEsCsXAzFaRmkWi6G+u9LQdHCaRRDbUoH4bjWmFQOdD1fTG24em+1xM7pbh6HMDWjD+6CkcjJcetON+FHV6q5EJ9glrHOa2I6YGcKNSpIXEoJEAWb67RSFV2u2XCVKLpUrKq/86aGckcReJqBl74OZNtHfsiHAWtdTNrfSCm9teUdHzZ5aTdSqzB6eK9M0xZw5k+nXaXNt06IVjZ7pmqitWd6t8RAgCuHpi67OhiuAUkqJtlkBnY3VJDOD1eds7UkK35DwNTUzqtTWza2VN5WhVDuM0xT41pE4Z8e16yJZg8WLts91cXv50chvBCL6NeudXeLlJPkBMIQ+mghEGz/SgAgBZASo4hep7GrSCB1f4f1cNMi8NY+eBVj1rlZ6UuCAO1h25dpQZCJPVEwLYXQe7G3NUhAACSq8cnctcXLilQtf8iEegeE5TStwcAoGdelqokhb1IHxYrOwQNbsSZ7DYFq4uJwa5wg4q2EaO9ttwZwW1euUvZY1aE2aBo47GnvEiHi+d16s1d8bGN8MSc3ZK828SEZkDsti6nT1lezsXxSzzweLxS92rnSQDQnCJpFHbaDQAtCGqqmK+djnOXsqktjqjn243Pb9ssnvsqsz7vaqqwnxAAYAKMq5HrYtxbw5TdzM6ZEFBmYw9CdAIC1xAjdonxmgWNNMeZOv498uxPo37I330friFzGQJeBx0CxI56SjbxhDP2A7u367JTf9rwlACCzGdmfl11CBBQkNn+MHGJYz5TSycH8yDpkxNMkPnLKHNONbMEtZ8LcDstS3gwogRgpnExCgAwj2Yl8M73EEtivSpKqIv8ay6Ku+o842Hc/wbuCQOeULweicSbcYkSVNMnCgCoCWkbAZGuD+otDiT2NUh61X17AEDfVDd7VaSEXEsfLOsEjjkwOTkT186BLeuIcXsTQ7dLu751Np2IRbIre9doS0Yllpb9iVp2LRmrL4szHXUW5JfP/dqET8FXXFuHl/sAmZEeMjEaF4uMC7ysJLtp4Hb6SwCAu0JNN1zDdAcVsxyEafh/oxbyDrj28CPXXUfM6jupddZZbqa041WzaF/7K1dOCKPt+QAA5ga1jYQsiw4E2kM1kEICXu9kAQDgAkSUAiWyDyImnEnekH1LRZYuNyyWIRxF23i414p0Md9DJoiu4W6GbeDMiwbkE8aWJy+9kdpunzgBL+kcvWruxlxNwDFqbbPae3Mfc2G5BsJYMZYv2FQ/CgCwEQ+er85if+ABTgBlOs80DSgrDDQENCWSNAH2tN52leP6WdpS6JFEUbJSjGilNZEZX8ATer0bHgDg9IJSxI9SkCy6TaX+3yB5zMUanFFe0aYhpLlhV52We0tGJW1DBuiygluaJaP3/fa6difkdWINh5RYe9w69CgbH74hjLSPOcsUjR/nHzKP7mBW/JKr7ywQAjte7LbuQ0qEw/vEUmaSSIwQM8TA8ngVEELinScBANZNgix32g0AuDKERZiPpb18ievEUnbbsex8yV1DFQYFwcxOQgAAk4XYFsNRWFBGze3q1tEYvVoidnnaBrHLhzCh9NXQWOQjPRzzT3BHIFw79r3FkXy6NssZhx6vOWnZR78Gbwkd2HzXlhhRcKvUwt7uYyxCIcxiXxsGlvtRAACWUexjmE6QwKE8wMskhaO0WXbUdSmmZZefYbeFwZHAVftI57GYXU3t+hHTe+ufdQgAgBhbEiUm5rQmckk4c73aAACvCxCkUyoqFj+agzQct6ktOURIk+NiXRcRSKhZKaUD5k+ku3av7t0LNqOSq+JQ3FsSbKXFlE1Bl+RylSmbLq37zbWBBCuCq/GuQIlwBWwUAxFJwEMZKGJW6z0JABSZEJeddgMA3UtC8Vxf0jWGx5Q67piBVNVSRWC9g6IHh7WZEAC4nI5IrRyXFohyQ6OeKBEbnrZFbPgQNhSuhuASk+y17Weh4RWcD3CZjvzUfHeUGJF0quQWnslcLNAvFMoKb7ynTl5IAQB0uFXyUY9gipSu2wI6gwTdev7sCrdTGxxwezXSCc/NlUQBANaTch4LlkgP/rjXsvOJBWopHgAowjrjssPC15llrGSuE7fvSyXEl0GeNm3djXm9diGuqxChqHa6m+mkvZOOepXRkUdeusapr4PTHYybeluwumrDwJ6qR4RzCygBgE27s3Q3ANRBpX3uPRJey83cxe94Bw0KhkGb83Hqh3Ees/7sz30KfGJlg/6J34UkRoJDgCCA4vb4iH5Z3kH/p320njzWQgEAxa/vaG43dlpt1J8OG2zv0TAW6aJHKqUAAILGqjdNpYCJLRw0nkHLQbEGDWeTpFLUwaNJ2xYtZYe1BW2RAPKJBFmMBwBykCogL4ByBliPC8S4NRj9Bu2c+otY3T6iH3PCUY3PL7dkWD42dHL44OeXou+b1ZGFTJq6Ccimq1DTnWlcYAIAnAC1Y8BUWkiWg7A8/2+nBkLSIHOdM9MD5MpVDifWnBUUpuLKx5Uo+Md2p/wf7/peUxj+QmKmG+iqzNsKO09N1SmNWkNBy6anX0ngVXXW3Ak8ZjcLAMBygTPwXPb6VtaCxNW4zMtsV6/BzjGxqspAECru/kWVqmOFuEmr/jp61VxOWqrx1rWEqolMDVo0mviqOcHgo35PvieczfcQiSyed1WTa9nOl8/X+X1bxjG9xwi3525UvS+MfyTcPNZvQhg3AO6mUZcCAPggPfUecH1rgDX7eWl7pfazVcRf+9u+wYb9pY+0B0zhyanxHraxZNoLO+uuOgWnzNknyu1Zd6VQz/2LRAjXcYUlQm9PPAAguiupkhsRP0YeUTg0ijVNz7FeZKi42LxiVZcM92+NVdgBS81m8xGCkeVjb6cfG7jEGvkCIahq2eUAVN2TnnojsVQbN2FuQ+4fH5SLLitBZO+fVXQdLgCV/tj0sCcaouJQtgWfsgzJ7HAvg/BoM/TUcxe/Ff90JlYq8jTNPi6S0msKGfdrwv38qfuny4X359rf5QHgceNJJHCsXneGXOPuszcwQcbDW6HvYeTaHTvR1VCMDhpge6A8Qa/lCzgHsYUMKGmTFWGH6GMPaFdbj+iS45N+m23+J3LOERQZsDFs6iEVo+vuWsJm2cCQxeikGZXblCb8b1C8QG9uJkyQJfsENkAT/ETjhXIQbAHGVGFBZ7vitN3VJ6PAb9dD2NaNofPwDIubrN4Ln6BJUNh35Fcum67+xHsjRwAYM3/PaoVel9vZyiChUpyLMceOgp21HnLLKHjwPpY0d1xwBRiNQ6DDA7vCi+n5EBMlEA02kSOjCLzH2dTDU3JwiI2C3gwgKlEIArdHv/GE+NDAKoBHQtfHOSXA5Sp32aBd5aYWQ5rJol3QRhfit0TN9VVZc32OmuvYdpf6c1XWXHtON4ACt0P/lvSAFFgKwrHGSwVnenbi+QbUmNAubv3doABRQSNj55AYELo2SQaFJ6HmerCkmEfc+1jaeF7s2Rg5WIWnLeMb5Ps+LMOv7Ehmk/WT5YXWf8KiMisM2Lg5ULk2XPpZG+rwISlYGrDVxTh0d22ZKhK18mngCuds9Rwo7NJf0PFZPgPJLiA6rmlGvJgVLqraOtYpTUDOBtJBVFTHwyjcE5tR0eikpnyjrXDIq6zMwpdcM2UNSAgAmLniZkKzapDBWVSZ7PuifTgzmaAI8mly2QEa5BvmHwINaLp2/HB1sR5275tnZ4LSrwLYbjvB+I+5cONIFb9MI9c1MLl2XM3UUysXi0D+U3Ouly/1ibvYtfIjftnJqQTIBTxFCZB9UQGpa8ZLjYsAIP6KLvsKTvpkgnuv3I0UbaHLcXZChXK7Vq319Daz8iN8Y3SikrcU5YZ5QdXqolaB2BldfvBAxd7bjQIAsI+xigKxIp1ZlMqUf6p7Boy10d12nk2p/ynAVAuDqQBTFElTyz66fxcAwFC4PUk0dZkPdiQObUvU3v+B16SGG+IBAEsyUf6PNRfMHlmFE2taC4pqjC1Z8iO2JSXGdN5bBbXXkZPVD1g4J6ql6EJP3ZAzJwpwMBG9BI4dEKgB4EQ3rC5Mcsqo7z+/dfEYZeFyQ9vqNHi7u8kEAPUZUtPbUzEmUYuCQJyV7b4FLlzZW3EvUCg1jLZ9b1f7XUTi4szqZOwoDcoyvCFJq0W22iTpjICQGmRBO59sXdBm12+Gu8C3uXyZdO+z2CEmmu/oAiMxvCoGbK9mCT/cxcDe7x/ucRQAwBXZdTrNByopSABnOG4/t29v/mxqrv5yU7XBFG6qSpriw0Hdf/ECAIMosERUSjRF4XoczSZOaIujewDAKi1LJuVu8+MH1XhlnqeZfGBvAoaVeAyYqaV2cNLkPffwGHvsU//2kVw2XVkU4QbcnE8cwUBN0IQpFUa3bb2SylLVyEA1u23Qzi2VCQAbGJlSHVrKEGSjyygBd70Xy8RZ2KA/bXsqFXdd9qu48oQUEt/x7A8gxJC4mTr/SbN+MnjXJLlpjMIL2foOIF7T0pq2W7AZNjSlFABgoLbqpmENuAvPHj6blwWcxksN9KiTJD2qEi8AYGjqol3gbOJwT9/oHgCwG5Uqk6Lsj2h7lZMAUnxsbiUgaj29ZCVO4D5g9W9iJfX835rS1+Iq+fdQT/5ZfsAzvflfVR79/3JexeXdrk7JVlWdnkPllKGw2EQZtkahSR10kv3bNVZZ4NbqCFM/myitSsH4R5Xz3PnM73nXmEhTPL5m/cHPiT7fZCEHAIBxurSltDLa4OB/r2H12aYXWgCAMe6mcrkuBQy2JQ8081rX8dZXUmLqra9VE6lZd5V6o6CM/07d1ijI/r1vWPTap3H9hd4I/63liHqqz9MY4U2hpeChCykAQBV3WqUN3QxRGnTiOP1bRb8GrpE9c30Z7znYGIwey7bn+F2NUT0KIMwRy7sAwA6rxVVFx1xaYvRsIkELL8UDAFy4U/+wYGja5MKYyViAsbWUCOum7wh2AXoCCdTqCbras1ALHkxsbwBSAQENA1T06bFxfT/91sVj1AocDG3TEcjr3WQCAH0L0dztKSdLQiuCgDNbRSYWuMBaqSJr8ydaQ01tJAQApqr8eg1r18ExC91QlMNskyfLzIaL76/2hWebDX+1b88nkEC4auh6MlXxKOfnOazkAhis8rCcSGHiQd9JrI8IxoGKyv2lnU6Ep59Rj4/jKACAnqMS9d7J6VQ1oJpvpypmz1z51wfNGYMxaM743JIz6Cxhi+IBQHp3AQBsQ1OgJJpmGWh5JNXYluge4P6vSYob4gEAr2Ravou1W4Z53BOKcZre2W6UrCwTO71hu6QHNSekwgKz07zuzj2oWXEKzf9uxoPOJBTL80IPX6qE4j6CPjNROE1AoOYC52NhtWtOuDJqMSfhHzqLUbj1wLZ6hkRV2k0mAAjdkNq9PRW3SdQ+QSDeUnvZAhcOLVbcmSKniIl6CgEAXnVTTvZh7BRns05zmlGzTrvOFlmnt4aQYfZMmY/tpP98v2Blb7DuYkFRVrZHmyjtFw5S4cohM2g0kgIA6L0Dpx9btY8ipXNZwJvRoL65G9VR5c1qYq7r0so8nikXU8cyPrtigj9TjImuZ4EXABjgWmlRXdC2Ei84lDio7nstpxAPAIwey+ZnJ1AojzGqOYVKpsc+La6FrEdAVUuh4Vl1xUaSQFzfzVFOdocErjIy2nbtMPjhtbjDibqjZwmgRyXDJUTb1VQqy+izu/Gy25HvvEKZAFB6LCjqGKCyg6u79gyKPSdHPId77B9AvLuYwMEHw6ILkf5coB/V+gCiDYk8dM/3NFD8SO1i0AZk8I00RPTTgp7GDCfFt14fr5QCAKwN0o/N7UCRslENuAvPZdAIlTkwBOM0UJd4AYBAlRZVhj4v1Gc+sTjFYjwAEEgVEBZAOQOsxwViphqMfK87EV9Yq/wbrcbz6bF90BB9PtkKX8i77+bRn1YeuLXL4dsS4mZcXZeNU4SeXDQBAAzF3Aa3qAEXXP6xfi57ttjfDRz+onVt5oBq2RuFOpT9XlJeqiXzw58IXkRVyy3dNa9mifqqmHio9t9TLUfr60i8tnttUz0qxwZLG942rDWh+aePhvcRbEgB2ZZvtfG1qF5avbiR85kOE6xl2p3ifwTqn2fthfJVtWhhdPj6BcBZW9h/lJeZc6Re3avb+nRlxBXAtk06s7yn38X4AzkAgMlBduGv+fYdeG2p23nu4vfW3BTMPvO83n/MAgCoyFjj+l0X7Wi/7ONYi/1rps7LNO9rS5vyr8S6nT76x6Wdufp1cONsUaWWX04VKugIUkYmOB1Wy4RSpJWWFQeUOUKJy5DHp7FXXEALGEu9/bFI7T1v8iVMeZTA2NwIAw7kJ+SLdoxjH45Lw2IatWybhGwSh3D4ybdLfshRQuyICGS77GG0EBF6Ewkkp1imXkQYCGrVFHJH+aPkHJKhYJWLg9fJCfEQYulCmTgkIJuwK498ny61CsJqvPb+xxahackeuWaaFYydii3l3KeZTfTeqtBYG4asJDo52Q+7xupViOqr8Y4H64Qo9dejAACSK8WLVHqAShVrmgHFHPfAHAPzdVnq4AYwVtQptosod15Uvxa01TrszESmakjGGg7Q1wb+lUE26fmRItr/o39FSU+c1eyyl0U7SHDxy5JKaOl0Zg8vhx5Pl9/Kr77+9zOsMWmhgjPi2pCUUysxwwhXVZHhhItmAD4raTQaeBcA0Bg+tS8/FmevqWhr+K1HxuKrEs1b3qhMMtFfEw8AWF5ZvqIAbv4JF9CJKOyuRahZj2CjUKxFWLxAIkChWYt4u1rf1BBnWt/IrCEUUbxoEsigEVblvIippIAqWFO1Jk6RSD45EBeJNO2Ek5L9p4SaSNtyMUMS6aZrO3uM3ekpEwAGBBMy6h4ZZ9ojuJrQDO1vE0frrezmMT5pm/2EAIDL5W4EWWyO8xQ02OWZcaBhRWaPFxoSAmJS0CozZLYjSkY5iLNLkOUO8jwOb+sDtPjTmN2tYP7STYJk3eavHxpXyooFqsu3VK9WWFOqpaMWUgAAig29XacHayW5r0RrQJHvBkbIrLm5gMoMAmKJFwBYSCnRPsrQIPpQ4nriJUCN7gEAG+HtQimU/KSCfoASzRnwMmggxmtE90HAvhNEujs9/SBaTkRaYoTzhl3sPuCSwUQ2BtgZQeBKDu2jdgWba0HtCUbXgbru3HYX8bGnTABwC3Qto5rN2LVdgyagVCJQwhrpTK+e2IYwTggA7G0VDaIkbv2SG2BEZrMAfpBsssdBtIkwSJ4MbOkAJnyPRrj39d1O8P8wn0+kk/GPGfW9s62te3eAosxwQyylAACExqg3jDOBhJSbWzCZQUAp8QIATbPHRXMHJp+4nOpiPAAg0AbIoJRTgHq8kOp3HbCCFxgrAO6c7riL3WXs2Qbn8Tuf2BvfJGcNgbOqLqAybGNAZRhXz1Xmtuv0WrhQJgBQjweKWgao3GDrOU+FglubiZ+TtY3viRRTP2g7C/ojea5GtrK9FO4f0wMBIl2J23cA+mh6g+SD+6n+d6iHKMqV+L82o6xzP660PDNcEEopAACgWPWC1gQCYm5uQDKDDbnECwAUmKRoaNb3kHzigFqMBwBEUPZHtDjR3DToDQApNgDt+0LS12ydP0cWkf/d8Odo+3k3PSwuuP/387nzKGCzqzzw0nLM9aZpEfkKOwPfjZ0uK1CV+XDjBRMAYJY7U60NszGbnTh4hwUDyAW7hLdq98zPHm50rQ9Q3KFxszem6syH3eLXJ/vqGxp4pB/9yx6Q/n/VPx+qJ5x/f/z7R8zsaMcabx4PrdHQTNtUaaQrwplqRbiO8jRFi7cKu39SF4dq1Dckal4HmOCDKji2naSblkquhVw6p+kufSnn5drWFRtSue6f28vobWIpLWPJ3mVV+SY3yri90lQo3pNzfMB8XxXIbpH19FtOQLvyUXVrSoYO/+DsFRvWKmBSUSMhrDlAl34UAMBVQDh+emY3/UaJsQ8ojXj8Hxui4prrlmMEUtspqCrALkh5VRo7q+0EAAKao22uJFqoqKAmW92Z6DjhrqqqeUPxAMA0qF3+ObayJKDHbU6DqR/Gs8IweZC05H0CLtz3DbiiAnfAdskLN8CiOhG3wLBMoAMwKrPpBIzLjDoDM5XbulCbC5QJAFU0dXKoPbR08g720uweC8UPSpnwmYlZ7icEACwBB2/j0rfArHhmyyuUYZotyOytgWaxAmK7oL1wmOzA80qm/cNUwrhUuX8KwBlBXuAhO8XYP686MUnc+J0MjNV8Pef/YFWsm2k6RA19Yar2L9unNqUAABQQxk/P7HoqKDESgFLNT+LXhn1hsj6amyPNXC/IO1hX1AUABCYhOuizM4g6lLgIh/LumRuJBwDWt+8BmLjMI3tnts1J5krjZ5Baig/A2Q6i7TuAxfWYBVZsUXJyIAILcXmRCEZ2kbd+WSFCGkqkypLbDgdMBXJnWNj0wZmd0mlx7PLw+Is5yX0c2DbXPGM0+skEAPWRmD4+9R7PmBmPwLeCSbHARdPUMyuziG8fhMYJAYAx3T+ABG5jCn0QlJlyjidAp9kGmATCADg05wm+9THN7oPgjSkbEN1kNG/jOLXi7vZPxAyHZpdSAAAdBKseGleBPKhzc4Y4M8ij0aIuAOADsEUEzCcKTCkeAJjdtg8PY4AaRDeL1qfHAmXfDVrBA2gElg2BOe4id1otXRG8NpE8Nm7lnwQmJ6bJ1ivCR3rFrqS2WctY8Gp2e8I9xWKZAFCgNLVovYZgt8L5U3AZMSjpY6fn5VDYz0d/evLW3IfxoIwGjWYldhcUGMUDAaJbidv3BPrTLh8G1z5FIO50JbKV+N1O4J2ltu79tQKbYUNTSgEAFupEfbOT0COlgDNWgEeVmxNAZnAhFnUBgAWdFO29x3lAPpEgi/EAQA7EABXkiTMHVo1J67PvAqXgBlD/IVZ/Ezhh8N6Y4M8PC5+mKU16TVedH7UIfDibkQDQ4wTqM4CwrOx0duyUMK1DCDaYOBv/zkyieL2f014J/7DsRnRnQG/PGE2aBYgAd/oHcgf+3tkOYapdPNsFTGW038lzysI3noPVdxTFv7B4CyBocSTfUObZU9v84jP7xzeo8FayKOXEYEysJ3zKF0dK6DcYxhIJ2qxYa3L48DdZwL7M02nEmec1ysDd1r0xLtSOnMG1sMZelLXjHY+BvSMUMoeKY9kvg6rOGBAMC9upfdhhkfVSgyjg+PFt9SuDUEUfQWz6vQEAGgxTg7m/6o6FvzhMfdagKsifZ9QqL88CAMSqYYqX9LKdFf/rUvunQcFoZG46IIDD1SCGi8twxX3ohh8xLlVXBI4aYLHHpKmt3JtwEBxysmnYyE7HU0wn48RwQEAscKk5TRMUcd3w1pzbVlFkpYEig5PlgZ76+UpvlOPsO8807nYWWwGgAxyMYgbtSI5j23ypEEx/3zF8BdCukKjRPltvWoj/dbeysgkyWzdmprCbJV0AoAOrDVGOQF0NknKJ2XVuCcDSHgDAA99EQimdKdGsTBW3Hy00ls0DTVeDzYixgzSzDnMtAw8RzNGo98353QMpa0iBKQCL871YU8gBLKdFkQWOdq3gwEmttR04U2uNB87m/O0Dt7yxTABwAWc4VTd4qdZBA0wjVAlnSczOBYUAgPfsWcjHOLlgyRVMM2eW2doDYzQ3PNt8k6CVyT5/8ywvB8FqCAgezZOledRNF7inksPAYZU3R/8kna9fzS5Otcc5nQB+R3MFgMsbzKNwfq1/ICWB97zq8z4Pzfm1xgODPtc5qgsAyCpDlK+YMDA8Aw8llozXATC6BwAcqhQWSmnTkh3trLhCgnlY8+G+iAwfGCW7L5L6DEAHwidFwIcPFo9a/n1gR2iMl6a3hI6w84micyeWgHTuWctGOveuZSSdUcpui7sGWCwTAMSKU6oa1pzNDwa2LMoMAbePT/AoIQCwyUs/SNa4XhkCBCSVmcMH9YNAku1TwyYQFW1bAB4oc0vl4dDHUXafxh9AJx5/ot0oTEduBYAOBfEm88oe+zN3N8qSTWBBnZsLYGawIBV1AYACtEUGzCeaU1OMBwAAxvQQRDdB69Njg8o+BEC857/uABIUry52BNd4aepd6Aglnyg6t8cSkM6ds2ykc89ZRtK5z9ltctdoFcsEALFiWlXDmrn8YGDToswsPHs+7LvV5lF876IMXfO1irpnZFcA6PgU4+QcQBQ+kY/DQfUopOS2dhGmv9S8GIHPiK4A0EEz3mAe3v891n9pVAXyoMrNGcLMII+Gi7oAgA/AFgkgnyhOpRgPADSI6QGwbG7yDXlYNRatL/tg0Ao+gOpfxOpGHieQhnN4f/ZnTndT9DGi3WBsQ7isbdShR09rwx+zP1d1uyUAzgM4SC2P9MOc9F0vSt8Hr90+vi9MHHGDl0k/rl3za1GQstH67APo4ZGKyz01lAtrOHvGA/do2vOuk6h4MkMqxJvTtb55tLWndfSud8+7e2mSkNnCkXms+TMCwkAOhKFHgaG1+roDInRjlRsjvq7zVe+d1p7187SKh6gUgk/k7APQWG6oSJjKaGhfQ1eWBwRNr+GJoFseNux92v8si94N3Q8VzfGChix61a0XF/nySGjL4gkcMR+YmYSed8S6vsgQISIjOVuEGO6SWTZF/Ipraj2wt3aVieAjcSNOtpKJ3GMq/b5oWJkkOEn4n3n7QF+JOclnA8qjlyBYJm0kcBnoNaYYTbIpjU5js69PRKkGKJFkOHB2L0hi8O+12v6N9ATfAPHEgfIAy5wrH+rzzMtV8p5Y7EqPGyeiNHmSHyLM5EW773BLQ78spykkvul1YaMWW7c1/Ut4jaBCxbN11s7uMQFWhzTCAPYZ2+DgYInWDcuLHxcdhW2btf3hfrmHqhQu4Yhd+KLFBJbM5QHTbJcGflZKPiWVrfwjuQDMWYVW8hILkEZ0k5OuL3gKjFZc/fwDQGdjHfRnBrOc3plwTCXeGpdDI0kgOU4K4rPqUKMkekpGi1IiRJkcwxoQW+2xwanei0g9zuKRBTSSECgtUEsXXZGIMDrsOBsJiF3l2tpB8q707QLE5Bp5sfW1RpMJbSt59Agt4R9Q6YyUVD7atJLBCfwpWXtfAM7UhaS8XYSmgOj0zWnBAFSocR0flqvcBdnjFoFH0aR6TQG00ejaCGIWdszfTKmQz8Cl0YE0zKZ1/eSfe4hxOg8gSauvhuJXipwjYqdDGTGeWNKqd/cuMUO00glEmQ1vTqEnq4y8oYL+sWL9tKpXosvfaOjgbTQaB2Mh/NgevYxC+ETMDKWWK+hZmbRgFlq39S+jZtmQZ45GYsxNV0OXuGoUXfn9X7ZCqRNyLUi+ZxiG34yA2U2tESDNUH3EsP3cYqnUdkHCLPdpqzZYLKKmeAIxgPhENJGtWbSwSR3GqWF1xEeBZM6kB5nftkey1OZg8M30CJRNavJODZDWHljbgFkGnEz6L2dAqqnhyolkbVhZ/8aPtg2JlTMr6YZQlpsTS+0TfdjI0idUx/xDZrjBgxEJ56cw79il32WVwYbDH84hLW4KHJJb8rNwAjbQJxViRoUUQhfrV61H3iAq60ahD85yDaF0qBV9LThJN37u1Xv6BtfLcqiQkVx0Dd/WhiHG/zHY8SQOO5HEUBPp00T/mx1SwdV0uGQTBFdU6l/q3ooVW5c1alcXzoTq9Dksbyohple6OuCHxZFCLNCKd7qkrPUwBaPjvOIJw1Qb+Loy5/fil01IW86Nskt//7qAqyxDRizY7nucKoufe0aEuW/3bUzn/EpoRm3OJfH0y8ZqCRmSYNkWHSFYWQsPuD2yp+hzqQvJ0OQM4gjAjSTTtz9Yo+CGT12zmx6YEW7mEPWPFzh76Jr8YZ4GIfc4jl87lYHlAV8LtDeA6NYFuBJikfCo4+EKpYBh4VrPbj3TJqXbZfsUthK0iONsmc7Z5KAN7MKKsa90UvRYlMNDO/VfQBlL/dBO99JX8MM4249y/XjgeuIAwNAnobY4LNT7RN67g6z/jAw6MHNKHzYk2ohgHhwDzraZ9xs1vARQm3U80h93NaIHFfsOsp9WYAYkAST3H842n8xtlhJWQBY6gA4aAFi7dai8/nPiVfvzd/XXb+GP//I5j+O8iqy5K6YOylUodJSr3VG6/J91ISqVzvO+/ruR9ICAvraGSg68sVfZ1NsIgug0HU1b4j6nyXrOYNdbE+tnAqSK632VmscNl6DZt0xRGYbMJhEMTNkOiTyowBIMb+BA6Z1+nLw5O+MT471HihdDU+J52bF50ImYyDpjkct4wvXzessdVCKNxI9evmwX+9Q6RN/woprYirjzi37cMOEum6SoyO+tys/tTIrL2eYNwQmvzfKeEZo+Ck/HyYIgea7lFoJUytF92TylZBzSpBNodsXea5cXb+Iz27ffEG4tcTDPIK1i0vRTMee80ijwUzFNkANgpe1KuACJucvNeVs8qU8muKuIcpQZOEO9bqv2uAopFVGW5EeLhevseDzbZYxsxFPaW/OD2Vj7TN3nZZWx4qDEK8V/XRyHqUK7/o0riClfmOQRswnDh7Xnx2cjupJPs5RTaTI5lkRew/dEEHZFvsamLVA3oVkxnNAIpbXVW5x63oIXUesGzCTuzXvmzLTkfjcnAjpZxP/zfR79l4QGxtSMOgJQ3TgVpAK/C2hnZpnlGi0iG+UybA2s3lqYuAbGH2kY2ZkioyEjocH0Qnv/bxDFXVXbn2dLNem3AP6LPcBlPL3Bq5vI8XNdYpC7HzZRewWBWCveGenA78l96A0bzjIvbC5+1uo7FKD/yni3n/db1333Up/8tl09Dg68yE3494s8ftcWbGErfP3rFYbmZJeZV10h0xfofkHUPqdhg+7Nchk2x8hFg88HHynk5L5LrlsVVDhj7mGHs0fTPg8XbGn0bwhbU64WbOn43whsDa661tZ6NJpXOjm6M+7EFAWKCR0XJJl7A/0VUCKHBkPput5J4eyY+qXAIKvVS0oKWDOfKlau+07qnv5Vns7fflaexQFKwZcwdX34KFlFBYhMZDbrRpYKk08wSZg6N2Flxow8mlkEzij8KrpfcZXXDqm4i29KFqJ/dW4xvf6MNQsdf/8MALCYzapkceKvJS08rsDngJP/4rW4DevAGndU6PB3lHMnQ85klxQuTkQdzxH2xub7I9H3MQpH7dUz1RWaBPebOqJTwxzaFmebC2tHp74HdB6GeZcEQ4ZcWibNHMG8kUk/U9hr5L2LCVAN1q+Yf94v8/JjGr8saSYf8frKk9VTdjpGFelKgQzLu7wGSP0LDLC5lQbo+AsLsET1MiCPICR40kkDLnsk0GirSgOudiTQKO1KlwIay6u3Yxc3fKYfQsA3cxS4ulM4GL1puQpcykLY3lonBmPMP8AGWkcy8J8o5QmAYYZyUSGYb4VY/uoC1Sm7NFA0zXKZSDw+Wud0ePIeAGkTQ6nJUxyVQ5MKotwvApEbbISeGQPdQI2cXSnyb5ICoD8vuWbsVXagc12LZ4PNYVnYwFkkSFYXoUMOUYP/zdQXBQDely7GhIltiu9k9TTN4diymW8Rvbl4llY//9KjazUW1IUYTzvhNg1aVIgSHa83YvQEjVmhwfDxOomDe3Y95dKeEmN+fXbJPG+zhQF0dvgjqq+8RVbkMyQEmcK/BAwJ+SlKhszdkWNzp494jhKuqjyA7ZYr1zcBU1h2hdDKkkW6yuhBryavVPLejk9f5R5Zq1+8BsSYwjiuL9hz8VmCtDMfj6FPvOYLx0DZHMI4IoD9zeQvr6AfK2YX5IjJM6ec3IbMF5oBCa/dk6aBvUbdZaNZb6gdbxG+mvYoEQkEzmDX5wwl10bA0df8OjPpbJHfocehN7ky3axgBgIyPI/Ms1J8aao8BT01R4g+euQT/fl6RGupV4/0fe+D8C1dx08Ma5N+YYZJafzX8/bw9luO7+wP6WMle4zlNwUGsUpdVf8cLgCe0j4LIZki/uqvK49Q/00ReHW66lB0VSwqB7VpdlTLOuuolozWo+yM16NyRuxRemM2lJsh9rOGOM4KMgvSDg69ClP/aGUm/9G46X8UtwGMqt4WMEptEyAwBDng+ae/EkMnB4QpQyWgPwhTXLFDNssbUTJlORbKRDIrHM4EPcH6dASl9ep6tqtweJJKYkx1ownDziE46GJr/5UNW+HrzS4CQagJLdtwSkNnEUq25QL+GuxrpqjFgtuIbm7sD71QPscZkWE70sFwAuWNR7N1xoi3cldbYjf9yNyZDcqB0KkpF9Pk0lyuO3P5nDrrOeY1Vz0CAqVuKJNiz65mlw8bJK2FfB6HcGo447zTS+moXbQ8XhSJKoV+YECyCe6DlRUwcQpXDYSODow1qpO2MrqDJMXPKrn7qmwbkK1jIjhWdZpZ4In9WOPuaXSwYamMMT5QL3nvJXrTnMmhrilvOAdl2ZobJQtmttyBhSXWHmYB7q4YL9bpTjn6MYSEI45W2dxkwcYVo3MheWfgLGfwDY8lt76T8+S185H/tGVTS9iVdBR1SsywSH0Z3D8KdJW9vRN3pTd0u4rLGbqSjkLulDTrl8cxVr60JFsgtURu+vMnXq4UMi0xLFha8shK0Vuy7Cw+GRHHxJEx5i7Gym6UVc8NfQiFcnOTvU3KfWm5ZBRdT0bRt10aUZyPJRNhUqKgEDPZ0ihpm3CKWM60hMqWlszFwlIkz6pJLhZaQnqQWVHQEmUZ0BI5BWQcz0ky/l+OciaOu1WppsIwlVTMrLjI88kuShUV+VRQcRTmT/Rhk5KJZ6QrdGJFsiXGWZOyKQT1Lc3zhel9Y237PPlMUxVKkOXSaEII4LOIKHCG01jIdpZdfb1qdpFh81lkF18nVIBeNv5e1Y1dYk7xdTJtepY8N/6HMkG6RVnCVwxKbclfgsbmyiQuYZeoJVbo0zDn9XqCOPk77ykf1HjLf9DURqsIibw4M7W+Pc15QJKU3TJJQIKC0JVq4q4HBJQEjy0x+GeT9CWRmMUnPQsxj9EzhvT5xc2iP90mG9OCJ2Xqc8MULH0RgGr6Jo2B2RwOb5RohHlzQReXI37lm7mixh/yvPg0B9+T8CnJeU3+4DV6p0Cm4HVpCjc+AqE8wOsjHjYpIXj5/rplR0le3/URdHw5XsK6D6be0MD95EtBRFFo8JucjXoGPqyj6KPxMTPlEQtM62JQpFnqoN9MT7AWL5VYUcr7VZzAjsMsh9C10onjVBni7S+iWZOWV3jaouuJMiUlEAiD5AecpUQoj1KCcZ4yFQGfki/HDfKeWpyl4p27dT34ee2zkZffbvrlfbZ45kdkX66tbE+V4r+n/rzdYdMtUnrs58Q/j5nEvfHA9U0kohdC305OQ7qJy1BXVValUp6dEQ+M30FbziUyh/VTLON3VAmB8UVzTPF9jwPghIMy64EiehFmKEvyy6iFQAD5kSPTEv1siQTgoSYKWVCbUvVx569GfgBkWN4+KZINR140ZOCrFpZOAsRL79jQOsZdKd2Wcxcyz/f7Wnbdt0KNL1xta0loIJy/qtUpCpsYTnWZ65PwPtcySc20TvCyIIvDoiyJknEBr9IPe1Pwmo59xydlEYj+yN7LnF9OFRy4w1bxYY2m8CQBKuDDgQ01Gf9ZbkOTk2nTycuC7BQWZee67NImzqg/CdOgMCfhGlYTNZkep0ZkEoDKuKvRQQX1x1DEjG4Y5VsCvYoZU2qfET0YQFAHd4NEb1y4nS+uNZcEm4eUSr0p/LoB2FJomYIGgJ0BxZtjQ5hwSVYhX1UZRCcBfrUA1XAj0+O4DAUBI5I/IzeAqZlkhWq1+XXzGk1UjQx+GHY3mlY5mHpT+OUAMEPDkySKMxqfYlvPzEy1GgygkPsTxGD7KXoRai7R8rKezva5jJOfzJBoYo9a6S/kIz4qPnpgUnh8MH2c8ggmdEMPWx61nZxW5+W7+3VVjHyoPVDfED0lnCVDiC8gzoFSWx2kVs0Lp5KLP9P8VDKwZamATK8y9ipjQwHc6Uns2KmcP2uEgEhGxurzvEjIlyZmU7Opfm8qQVWrBp3MRYPaNfhkBOpXo2GwaVCzQeJI5u9qK0o9uNnean01IqSExqhB2Nj2hdvwf+GTZ4C9FNsHwvNS5Re10lmnV2upVov/rWhe23j9pq2lakS/ZWPdQnezrC8TcqU1P9ekipp+/x3obnvNhnol27Fan42gjLUSDYO2mHM0rpHn67qLTp76clL1QEFFC+qhZQhHxtgV+zh01zr6klL9TehVwYaeEo6EfTfxamzqS0olpFUDiCulsohyegGdO4pjVFFSqg5YsaFiRAVM6dnDsblr8zTvUDD4lpaqx2lVRsOSjMg4bwo4Mcx3l14AWA3MOM7X/5tPsKJtma7YtVmpaGnSXwiyLtiYh9KfAKFI7DWFH1LQsQfDoQ2bC9fhUldiCf0CNFtxxmluIjCvCPJJUp6AlvZwIeKeCvTQtpeywRlPttInRPCLbnn9MPPu/6fGgcu8Yw7uO6GKKQPM38V+7Ag03BcBBguXJ7NZbarjxp7MnRpYapEnTkVPj5M1RY+ocDKufkr+9HzNp3Lnc2sUF8m1JTarjz1/9mS1EbWvXhIZeOLAmqx+/vT8qXGt0QIVd+b06lY/P+Cjfc3yJ9MjZvzJ9PRkevXTc8TpyfSIFuE8EU7gD1wBmBnnyB993t0PL9HnSbMG/uplT8mJPcjyVzl7ACJni84lPw9Or3NA7ey+zci02KiopZ2/iH9tbX70cncL6Tmmd2nBdWNWyfcRFI98MbvZL8sah3Zb+z8EOl+9P8aVEFhyM6fm7sBaZ/ep7wf6CWbMLlD6MCGnK6xPj/PIMTt95btHfGl72Tfxpm49Hb3xupaJaAOrrZmdkPyiQbTr1Fae/QWvWswnFFE1kr6AHx7Cvh4r5GpYe4UfUKDQ+QmlFNWo/SoV/IFaAeUAAVAKyEAwCH+AjD6loZlYelq1KJDug+nfVVmM1YFLNWWcSXxcE4nCilg4rGN13oO+tl8S/i0S3D/PiekHiUV8VPc1+ZjA2dzLLhrOF9ZLcz12goA6dtvyy1P8q/Q/dd/o0wvFinW25ztdVRju0+JbQyUzJyMwI1ITASOElLzI2BipjXGn6p+1URg8WLA3SoGlNjkGsgQkIoXUaXgEMuNO65+zoR0APe07H8FgARwBCmSfv1BIGyNz/2nRW15I3Lacg5NNkRiKvkh/yZzsjuR5VEWbC2qbZI9ETxZgB/ACVIIcbnrvpKl9UnRQ2psosz7KMitljxk9xQQIHnpy5jGaxlwZaYeNwGLp9ebAhIgy76rxfH1xcFKnhnI7/mXz7G8OwJB23c5q7rmmsH29qqFb2X083XJbVz8eAQCSzkWKz9kUdNc5BvJDOSw/Q/FdnRe9F3jZfMqpbtTlfp5oQ4Ec8tQurWR2DfBPMFHC7S697wcewZkCGV/oiJHbZJBkIOoP7Tu/XnhbzLQLpnnZ07z0dNme1Woyd16tq8SSJtXr3z8DAKSQRUmK50qkJcVUaLWHhYUjUH7Znyu1lz7/9ewl6fkKYgMRGCskPQITAwjApZdORVRLQncoGqY9JhcoksCc4SD41h9TP37bwwdPFP/H+YiQok1G7mjTtfUAkyI7RRSHyjfoaPvIgxphdVCWD4JJE71/NBzw1jGXBkAKfamqe4l+0QAAulI2J926VqUigZOiENkotUdxY4EiWLGdnp/TR5BwG8K7TdciVskd6kiZoqKNxzDWm7aJDfDYwOcwSQ0IG9d1XiWIcdBl3PFMI9pqRMawrqB7Lw6/KUzEBmX9gZOFyq8XxfKj+hSPc39d+JYf3Ss2cy0ZAgxmyuAObk94lPEX37C2OdcXP0kMUGfGGOJcWFPvAvt46yaXDnY/DoKSJAM7fZdBAdOSEgydmpF+EuvudnRTU0jZPLRbB/G7OfYCNOCxLN9ykYGzILx4FcbxPAosXbj8r0vZuMgz85JqQ6PvnhdV+SugvJiWqvGWj31L4RYPDC8Xg3mlti3BbeGNcYhzxrqNM7BF9XR1My0Z4k6MaIBOJAjBTJ2jcGwpE6nPwDAOLMtBMASxI74WPRBnH59Inkhju+GPJCX+L19duPVJyZwtUYRU2z1heUc8NN4I3lUWY5FT6ME/DAbmVGA2cN+A0J7w7cUt+hA2BvyV7AufpasJWJaAYpC2L0bunwNz/KwH62TKJkWFQrSh95iNbdY4evkhB/cucWOZNrda2rJ4Ap+Wj4ZiGr3Bs1jgNdgqLlXhuWhoAAkdYcMaC7wB6/dEfDaLuQNkuOYytoAK5Ee8KbNucCFHe846ZzagTDWFtd+KzKg/6pUO8L1Gh3c7s7z088C5trnxP4HQry5eVYQIzAHYQq8zbUWPPCRNTfcLZLpTptMQ9Rd8czEtgVgxLnUeWBa9heLExavWUfcMJuTuVkSEAligEmDzQ6icraFu2DiTueFC40aYqFwMNFDEQh45mSfW8MYgcRBX0VLrYyaL6XOj9fEua+mz0frUneX1OWh96cnc+mbQ+kJkpn1ziA+cohzhm3zm3+b/TBTJQyQrZIqx1YlPNcrofvNxjNdiXFmT7aqEJVVWyHr1SOav4Lo6JHOUDfNv57tSJDdeERJ7bJIOrds8uno9fIuu82USXSBdN5s77BJ6uYD/fFIMQ5PzOHmKrjNz6Cw1yu0OgAYAsFaohC81SW66je5RiSoFNzM93ai7RNu8vRnQ7lQbdpcOdfeq3Y5rGpTc5V2yW+GmIKGSBhE3B1QNQiaLgWQ0CHdZC6RDg9id5UEuNMg9mRs0hQaZyEyhAZixCTzwbg/6/Vi9OZrUWIXFpp11Xk2tjYFyRsIpPNiWo7ufulRPEYOtDox5b117QC/zArriAp/Fr/8BorJ+xoPDn+0/z94BL3Gtkh8h7D/GUyjbssfX4s1ai1vPSnvl+VfyZnEOB1RGitY81E5Fm9lfBsJpaz2OzjDuGvyoOB0devONPZ5bU/G9GF/khkrDnFRlBQLB9k0wh0mgMHBCAABvgaBT/hBjgAgw90/tgDinrEO1zST7unWxc0xy6BbygaBYk9PNckBdUfbXnAE1Jll9+0h5iP+M8tP538eHH/SvS6J7GYZGHeiMR8aXIDUMky/5rGiYK/BzL2cmE2YX2Lo5Rllfy+BwoexM6uM0Ibm+c/ncZH26N3Hy1+mtPn5RlpvOPiKUHQ7UBgDUjePCzuvWyOCFjZGfmVfkb+T7/OQtD9Fd2MxijwnfXU7uqYpJ318sWnn58V19dK0suTBXzpUzPSv18OXPCCHVqxQ5SMMda682CZ1pI2US1pNUx4kVGbHgr06WZP4c1MeajMgIKeFN5sBE9Zx5IMS/T3X2mcnf1bogTBIPv6jcszoLc3nlXbzVK7VVy++gHTVrWY0G2RArt8ni73rp5F+iZxXewhUOXUnk8QF/GrZ+15Drbqtv7AaBp3AEXgVB9rYGcQVBO9sWZBME3W3zkNtIMGW2u1IkGBTXHhzEagp6kwno24N+TcSDYTF4+d83HKv1q/Uo/3QrLF9/XmRX1mQV8WemHPFXhNRmEWvq84AdC7T2OHgCmu6PASUGeVt0HPq1tRQb545v30VKgeP9StSyyY/1oG1oXBy19EYahJyFUKjWbq7nCil+m3K731MPDVCr96udOspyqbvFynn5jgBgLbY3vddrip35ctQn0Pp0r+9OmRsEx8jCthnq8907v0zmf32QCEuRyfEhQ959ppDpKinHoAYj4wS98fQ32WRRQDKfvKf8aned2DdPxkuKaglvoUndulaVXNkpKadkSIQW5a6yfOKAcoV2FUKFckq+38P5zX/WQ/S2FvF5KZ2VIAIYR7ywaRK6o6C9fslS6GvmUTH5qnDdilAgLu3kAM0qCu7+OwKAKZVOVRHfGysKuxfFsRzgvcN3nvnvft+MlHRJaGZds9PqmR1UX18G5wMoIVxWSfz8pi62hqh3ADQAAJEoIcFVEV/d5w==","base64")).toString()),rH}var nme=new Map([[Y.makeIdent(null,"fsevents").identHash,eme],[Y.makeIdent(null,"resolve").identHash,tme],[Y.makeIdent(null,"typescript").identHash,rme]]),qht={hooks:{registerPackageExtensions:async(t,e)=>{for(let[r,o]of $8)e(Y.parseDescriptor(r,!0),o)},getBuiltinPatch:async(t,e)=>{var n;let r="compat/";if(!e.startsWith(r))return;let o=Y.parseIdent(e.slice(r.length)),a=(n=nme.get(o.identHash))==null?void 0:n();return typeof a<"u"?a:null},reduceDependency:async(t,e,r,o)=>typeof nme.get(t.identHash)>"u"?t:Y.makeDescriptor(t,Y.makeRange({protocol:"patch:",source:Y.stringifyDescriptor(t),selector:`optional!builtin`,params:null}))}},jht=qht;var EH={};Yt(EH,{ConstraintsCheckCommand:()=>Ah,ConstraintsQueryCommand:()=>ch,ConstraintsSourceCommand:()=>uh,default:()=>dgt});Ke();Ke();c2();var dE=class{constructor(e){this.project=e}createEnvironment(){let e=new a2(["cwd","ident"]),r=new a2(["type","ident"]),o={manifestUpdates:new Map,reportedErrors:new Map};for(let a of this.project.workspaces){let n=Y.stringifyIdent(a.anchoredLocator),u=a.manifest.exportTo({}),A=(w,v,{caller:b=As.getCaller()}={})=>{let C=l2(w),R=Ye.getMapWithDefault(o.manifestUpdates,a.cwd),L=Ye.getMapWithDefault(R,C),_=Ye.getSetWithDefault(L,v);b!==null&&_.add(b)},p=w=>A(w,void 0,{caller:As.getCaller()}),h=w=>{Ye.getArrayWithDefault(o.reportedErrors,a.cwd).push(w)},E=e.insert({cwd:a.cwd,ident:n,manifest:u,set:A,unset:p,error:h});for(let w of Nt.allDependencies)for(let v of a.manifest[w].values()){let b=Y.stringifyIdent(v),C=()=>{A([w,b],void 0,{caller:As.getCaller()})},R=L=>{A([w,b],L,{caller:As.getCaller()})};r.insert({workspace:E,ident:b,range:v.range,type:w,update:R,delete:C,error:h})}}return{workspaces:e,dependencies:r,result:o}}async process(){let e=this.createEnvironment(),r={Yarn:{workspace:a=>e.workspaces.find(a)[0]??null,workspaces:a=>e.workspaces.find(a),dependencies:a=>e.dependencies.find(a)}},o=await this.project.loadUserConfig();return o!=null&&o.constraints?(await o.constraints(r),e.result):null}};Ke();Ke();_t();var ch=class extends ct{constructor(){super(...arguments);this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.query=fe.String()}async execute(){let{Constraints:r}=await Promise.resolve().then(()=>(h2(),p2)),o=await Xe.find(this.context.cwd,this.context.plugins),{project:a}=await St.find(o,this.context.cwd),n=await r.find(a),u=this.query;return u.endsWith(".")||(u=`${u}.`),(await Et.start({configuration:o,json:this.json,stdout:this.context.stdout},async p=>{for await(let h of n.query(u)){let E=Array.from(Object.entries(h)),w=E.length,v=E.reduce((b,[C])=>Math.max(b,C.length),0);for(let b=0;b(h2(),p2)),o=await Xe.find(this.context.cwd,this.context.plugins),{project:a}=await St.find(o,this.context.cwd),n=await r.find(a);this.context.stdout.write(this.verbose?n.fullSource:n.source)}};uh.paths=[["constraints","source"]],uh.usage=it.Usage({category:"Constraints-related commands",description:"print the source code for the constraints",details:"\n This command will print the Prolog source code used by the constraints engine. Adding the `-v,--verbose` flag will print the *full* source code, including the fact database automatically compiled from the workspace manifests.\n ",examples:[["Prints the source code","yarn constraints source"],["Print the source code and the fact database","yarn constraints source -v"]]});Ke();Ke();_t();c2();var Ah=class extends ct{constructor(){super(...arguments);this.fix=fe.Boolean("--fix",!1,{description:"Attempt to automatically fix unambiguous issues, following a multi-pass process"});this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd),a=await o.loadUserConfig(),n;if(a!=null&&a.constraints)n=new dE(o);else{let{Constraints:h}=await Promise.resolve().then(()=>(h2(),p2));n=await h.find(o)}let u={children:[]},A=!1,p=!1;for(let h=this.fix?10:1;h>0;--h){let E=await n.process();if(!E)break;let{changedWorkspaces:w,remainingErrors:v}=aQ(o,E,{fix:this.fix}),b=[];for(let[C,R]of w){let L=C.manifest.indent;C.manifest=new Nt,C.manifest.indent=L,C.manifest.load(R),b.push(C.persistManifest())}if(!(w.size>0&&h>1)){A=!1,p=!0;for(let[C,R]of v){let L=[];for(let V of R){let re=V.text.split(/\n/);V.fixable?(re[0]=`${ye.pretty(r,"\u2699","gray")} ${re[0]}`,A=!0):p=!1,L.push({value:ye.tuple(ye.Type.NO_HINT,re[0]),children:re.slice(1).map(oe=>({value:ye.tuple(ye.Type.NO_HINT,oe)}))})}let _={value:ye.tuple(ye.Type.LOCATOR,C.anchoredLocator),children:Ye.sortMap(L,V=>V.value[1])};u.children.push(_)}}}if(u.children.length===0)return 0;if(A){let h=p?`Those errors can all be fixed by running ${ye.pretty(r,"yarn constraints --fix",ye.Type.CODE)}`:`Errors prefixed by '\u2699' can be fixed by running ${ye.pretty(r,"yarn constraints --fix",ye.Type.CODE)}`;await Et.start({configuration:r,stdout:this.context.stdout,includeNames:!1,includeFooter:!1},async E=>{E.reportInfo(0,h),E.reportSeparator()})}return u.children=Ye.sortMap(u.children,h=>h.value[1]),Zo.emitTree(u,{configuration:r,stdout:this.context.stdout,json:this.json,separators:1}),1}};Ah.paths=[["constraints"]],Ah.usage=it.Usage({category:"Constraints-related commands",description:"check that the project constraints are met",details:` + This command will run constraints on your project and emit errors for each one that is found but isn't met. If any error is emitted the process will exit with a non-zero exit code. + + If the \`--fix\` flag is used, Yarn will attempt to automatically fix the issues the best it can, following a multi-pass process (with a maximum of 10 iterations). Some ambiguous patterns cannot be autofixed, in which case you'll have to manually specify the right resolution. + + For more information as to how to write constraints, please consult our dedicated page on our website: https://yarnpkg.com/features/constraints. + `,examples:[["Check that all constraints are satisfied","yarn constraints"],["Autofix all unmet constraints","yarn constraints --fix"]]});c2();var ggt={configuration:{enableConstraintsChecks:{description:"If true, constraints will run during installs",type:"BOOLEAN",default:!1},constraintsPath:{description:"The path of the constraints file.",type:"ABSOLUTE_PATH",default:"./constraints.pro"}},commands:[ch,uh,Ah],hooks:{async validateProjectAfterInstall(t,{reportError:e}){if(!t.configuration.get("enableConstraintsChecks"))return;let r=await t.loadUserConfig(),o;if(r!=null&&r.constraints)o=new dE(t);else{let{Constraints:u}=await Promise.resolve().then(()=>(h2(),p2));o=await u.find(t)}let a=await o.process();if(!a)return;let{remainingErrors:n}=aQ(t,a);n.size!==0&&e(84,`Constraint check failed; run ${ye.pretty(t.configuration,"yarn constraints",ye.Type.CODE)} for more details`)}}},dgt=ggt;var IH={};Yt(IH,{CreateCommand:()=>nm,DlxCommand:()=>fh,default:()=>ygt});Ke();_t();var nm=class extends ct{constructor(){super(...arguments);this.pkg=fe.String("-p,--package",{description:"The package to run the provided command from"});this.quiet=fe.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=fe.String();this.args=fe.Proxy()}async execute(){let r=[];this.pkg&&r.push("--package",this.pkg),this.quiet&&r.push("--quiet");let o=this.command.replace(/^(@[^@/]+)(@|$)/,"$1/create$2"),a=Y.parseDescriptor(o),n=a.name.match(/^create(-|$)/)?a:a.scope?Y.makeIdent(a.scope,`create-${a.name}`):Y.makeIdent(null,`create-${a.name}`),u=Y.stringifyIdent(n);return a.range!=="unknown"&&(u+=`@${a.range}`),this.cli.run(["dlx",...r,u,...this.args])}};nm.paths=[["create"]];Ke();Ke();bt();_t();var fh=class extends ct{constructor(){super(...arguments);this.packages=fe.Array("-p,--package",{description:"The package(s) to install before running the command"});this.quiet=fe.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=fe.String();this.args=fe.Proxy()}async execute(){return Xe.telemetry=null,await ae.mktempPromise(async r=>{let o=z.join(r,`dlx-${process.pid}`);await ae.mkdirPromise(o),await ae.writeFilePromise(z.join(o,"package.json"),`{} +`),await ae.writeFilePromise(z.join(o,"yarn.lock"),"");let a=z.join(o,".yarnrc.yml"),n=await Xe.findProjectCwd(this.context.cwd,Lr.lockfile),A={enableGlobalCache:!(await Xe.find(this.context.cwd,null,{strict:!1})).get("enableGlobalCache"),enableTelemetry:!1,logFilters:[{code:Vu(68),level:ye.LogLevel.Discard}]},p=n!==null?z.join(n,".yarnrc.yml"):null;p!==null&&ae.existsSync(p)?(await ae.copyFilePromise(p,a),await Xe.updateConfiguration(o,L=>{let _=Ye.toMerged(L,A);return Array.isArray(L.plugins)&&(_.plugins=L.plugins.map(V=>{let re=typeof V=="string"?V:V.path,oe=ue.isAbsolute(re)?re:ue.resolve(ue.fromPortablePath(n),re);return typeof V=="string"?oe:{path:oe,spec:V.spec}})),_})):await ae.writeJsonPromise(a,A);let h=this.packages??[this.command],E=Y.parseDescriptor(this.command).name,w=await this.cli.run(["add","--fixed","--",...h],{cwd:o,quiet:this.quiet});if(w!==0)return w;this.quiet||this.context.stdout.write(` +`);let v=await Xe.find(o,this.context.plugins),{project:b,workspace:C}=await St.find(v,o);if(C===null)throw new er(b.cwd,o);await b.restoreInstallState();let R=await sn.getWorkspaceAccessibleBinaries(C);return R.has(E)===!1&&R.size===1&&typeof this.packages>"u"&&(E=Array.from(R)[0][0]),await sn.executeWorkspaceAccessibleBinary(C,E,this.args,{packageAccessibleBinaries:R,cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}};fh.paths=[["dlx"]],fh.usage=it.Usage({description:"run a package in a temporary environment",details:"\n This command will install a package within a temporary environment, and run its binary script if it contains any. The binary will run within the current cwd.\n\n By default Yarn will download the package named `command`, but this can be changed through the use of the `-p,--package` flag which will instruct Yarn to still run the same command but from a different package.\n\n Using `yarn dlx` as a replacement of `yarn add` isn't recommended, as it makes your project non-deterministic (Yarn doesn't keep track of the packages installed through `dlx` - neither their name, nor their version).\n ",examples:[["Use create-react-app to create a new React app","yarn dlx create-react-app ./my-app"],["Install multiple packages for a single command",`yarn dlx -p typescript -p ts-node ts-node --transpile-only -e "console.log('hello!')"`]]});var mgt={commands:[nm,fh]},ygt=mgt;var vH={};Yt(vH,{ExecFetcher:()=>d2,ExecResolver:()=>m2,default:()=>Igt,execUtils:()=>AQ});Ke();Ke();bt();var hA="exec:";var AQ={};Yt(AQ,{loadGeneratorFile:()=>g2,makeLocator:()=>BH,makeSpec:()=>Nme,parseSpec:()=>wH});Ke();bt();function wH(t){let{params:e,selector:r}=Y.parseRange(t),o=ue.toPortablePath(r);return{parentLocator:e&&typeof e.locator=="string"?Y.parseLocator(e.locator):null,path:o}}function Nme({parentLocator:t,path:e,generatorHash:r,protocol:o}){let a=t!==null?{locator:Y.stringifyLocator(t)}:{},n=typeof r<"u"?{hash:r}:{};return Y.makeRange({protocol:o,source:e,selector:e,params:{...n,...a}})}function BH(t,{parentLocator:e,path:r,generatorHash:o,protocol:a}){return Y.makeLocator(t,Nme({parentLocator:e,path:r,generatorHash:o,protocol:a}))}async function g2(t,e,r){let{parentLocator:o,path:a}=Y.parseFileStyleRange(t,{protocol:e}),n=z.isAbsolute(a)?{packageFs:new An(wt.root),prefixPath:wt.dot,localPath:wt.root}:await r.fetcher.fetch(o,r),u=n.localPath?{packageFs:new An(wt.root),prefixPath:z.relative(wt.root,n.localPath)}:n;n!==u&&n.releaseFs&&n.releaseFs();let A=u.packageFs,p=z.join(u.prefixPath,a);return await A.readFilePromise(p,"utf8")}var d2=class{supports(e,r){return!!e.reference.startsWith(hA)}getLocalPath(e,r){let{parentLocator:o,path:a}=Y.parseFileStyleRange(e.reference,{protocol:hA});if(z.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:z.resolve(n,a)}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:Y.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:u}}async fetchFromDisk(e,r){let o=await g2(e.reference,hA,r);return ae.mktempPromise(async a=>{let n=z.join(a,"generator.js");return await ae.writeFilePromise(n,o),ae.mktempPromise(async u=>{if(await this.generatePackage(u,e,n,r),!ae.existsSync(z.join(u,"build")))throw new Error("The script should have generated a build directory");return await Ji.makeArchiveFromDirectory(z.join(u,"build"),{prefixPath:Y.getIdentVendorPath(e),compressionLevel:r.project.configuration.get("compressionLevel")})})})}async generatePackage(e,r,o,a){return await ae.mktempPromise(async n=>{let u=await sn.makeScriptEnv({project:a.project,binFolder:n}),A=z.join(e,"runtime.js");return await ae.mktempPromise(async p=>{let h=z.join(p,"buildfile.log"),E=z.join(e,"generator"),w=z.join(e,"build");await ae.mkdirPromise(E),await ae.mkdirPromise(w);let v={tempDir:ue.fromPortablePath(E),buildDir:ue.fromPortablePath(w),locator:Y.stringifyLocator(r)};await ae.writeFilePromise(A,` + // Expose 'Module' as a global variable + Object.defineProperty(global, 'Module', { + get: () => require('module'), + configurable: true, + enumerable: false, + }); + + // Expose non-hidden built-in modules as global variables + for (const name of Module.builtinModules.filter((name) => name !== 'module' && !name.startsWith('_'))) { + Object.defineProperty(global, name, { + get: () => require(name), + configurable: true, + enumerable: false, + }); + } + + // Expose the 'execEnv' global variable + Object.defineProperty(global, 'execEnv', { + value: { + ...${JSON.stringify(v)}, + }, + enumerable: true, + }); + `);let b=u.NODE_OPTIONS||"",C=/\s*--require\s+\S*\.pnp\.c?js\s*/g;b=b.replace(C," ").trim(),u.NODE_OPTIONS=b;let{stdout:R,stderr:L}=a.project.configuration.getSubprocessStreams(h,{header:`# This file contains the result of Yarn generating a package (${Y.stringifyLocator(r)}) +`,prefix:Y.prettyLocator(a.project.configuration,r),report:a.report}),{code:_}=await Mr.pipevp(process.execPath,["--require",ue.fromPortablePath(A),ue.fromPortablePath(o),Y.stringifyIdent(r)],{cwd:e,env:u,stdin:null,stdout:R,stderr:L});if(_!==0)throw ae.detachTemp(p),new Error(`Package generation failed (exit code ${_}, logs can be found here: ${ye.pretty(a.project.configuration,h,ye.Type.PATH)})`)})})}};Ke();Ke();var Cgt=2,m2=class{supportsDescriptor(e,r){return!!e.range.startsWith(hA)}supportsLocator(e,r){return!!e.reference.startsWith(hA)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return Y.bindDescriptor(e,{locator:Y.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:a,parentLocator:n}=wH(e.range);if(n===null)throw new Error("Assertion failed: The descriptor should have been bound");let u=await g2(Y.makeRange({protocol:hA,source:a,selector:a,params:{locator:Y.stringifyLocator(n)}}),hA,o.fetchOptions),A=bn.makeHash(`${Cgt}`,u).slice(0,6);return[BH(e,{parentLocator:n,path:a,generatorHash:A,protocol:hA})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await Ye.releaseAfterUseAsync(async()=>await Nt.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var Egt={fetchers:[d2],resolvers:[m2]},Igt=Egt;var SH={};Yt(SH,{FileFetcher:()=>I2,FileResolver:()=>w2,TarballFileFetcher:()=>B2,TarballFileResolver:()=>v2,default:()=>vgt,fileUtils:()=>im});Ke();bt();var EE=/^(?:[a-zA-Z]:[\\/]|\.{0,2}\/)/,y2=/^[^?]*\.(?:tar\.gz|tgz)(?:::.*)?$/,Mi="file:";var im={};Yt(im,{fetchArchiveFromLocator:()=>E2,makeArchiveFromLocator:()=>fQ,makeBufferFromLocator:()=>DH,makeLocator:()=>IE,makeSpec:()=>Lme,parseSpec:()=>C2});Ke();bt();function C2(t){let{params:e,selector:r}=Y.parseRange(t),o=ue.toPortablePath(r);return{parentLocator:e&&typeof e.locator=="string"?Y.parseLocator(e.locator):null,path:o}}function Lme({parentLocator:t,path:e,hash:r,protocol:o}){let a=t!==null?{locator:Y.stringifyLocator(t)}:{},n=typeof r<"u"?{hash:r}:{};return Y.makeRange({protocol:o,source:e,selector:e,params:{...n,...a}})}function IE(t,{parentLocator:e,path:r,hash:o,protocol:a}){return Y.makeLocator(t,Lme({parentLocator:e,path:r,hash:o,protocol:a}))}async function E2(t,e){let{parentLocator:r,path:o}=Y.parseFileStyleRange(t.reference,{protocol:Mi}),a=z.isAbsolute(o)?{packageFs:new An(wt.root),prefixPath:wt.dot,localPath:wt.root}:await e.fetcher.fetch(r,e),n=a.localPath?{packageFs:new An(wt.root),prefixPath:z.relative(wt.root,a.localPath)}:a;a!==n&&a.releaseFs&&a.releaseFs();let u=n.packageFs,A=z.join(n.prefixPath,o);return await Ye.releaseAfterUseAsync(async()=>await u.readFilePromise(A),n.releaseFs)}async function fQ(t,{protocol:e,fetchOptions:r,inMemory:o=!1}){let{parentLocator:a,path:n}=Y.parseFileStyleRange(t.reference,{protocol:e}),u=z.isAbsolute(n)?{packageFs:new An(wt.root),prefixPath:wt.dot,localPath:wt.root}:await r.fetcher.fetch(a,r),A=u.localPath?{packageFs:new An(wt.root),prefixPath:z.relative(wt.root,u.localPath)}:u;u!==A&&u.releaseFs&&u.releaseFs();let p=A.packageFs,h=z.join(A.prefixPath,n);return await Ye.releaseAfterUseAsync(async()=>await Ji.makeArchiveFromDirectory(h,{baseFs:p,prefixPath:Y.getIdentVendorPath(t),compressionLevel:r.project.configuration.get("compressionLevel"),inMemory:o}),A.releaseFs)}async function DH(t,{protocol:e,fetchOptions:r}){return(await fQ(t,{protocol:e,fetchOptions:r,inMemory:!0})).getBufferAndClose()}var I2=class{supports(e,r){return!!e.reference.startsWith(Mi)}getLocalPath(e,r){let{parentLocator:o,path:a}=Y.parseFileStyleRange(e.reference,{protocol:Mi});if(z.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:z.resolve(n,a)}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${Y.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:Y.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:u}}async fetchFromDisk(e,r){return fQ(e,{protocol:Mi,fetchOptions:r})}};Ke();Ke();var wgt=2,w2=class{supportsDescriptor(e,r){return e.range.match(EE)?!0:!!e.range.startsWith(Mi)}supportsLocator(e,r){return!!e.reference.startsWith(Mi)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return EE.test(e.range)&&(e=Y.makeDescriptor(e,`${Mi}${e.range}`)),Y.bindDescriptor(e,{locator:Y.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:a,parentLocator:n}=C2(e.range);if(n===null)throw new Error("Assertion failed: The descriptor should have been bound");let u=await DH(Y.makeLocator(e,Y.makeRange({protocol:Mi,source:a,selector:a,params:{locator:Y.stringifyLocator(n)}})),{protocol:Mi,fetchOptions:o.fetchOptions}),A=bn.makeHash(`${wgt}`,u).slice(0,6);return[IE(e,{parentLocator:n,path:a,hash:A,protocol:Mi})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await Ye.releaseAfterUseAsync(async()=>await Nt.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};Ke();var B2=class{supports(e,r){return y2.test(e.reference)?!!e.reference.startsWith(Mi):!1}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${Y.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:Y.getIdentVendorPath(e),checksum:u}}async fetchFromDisk(e,r){let o=await E2(e,r);return await Ji.convertToZip(o,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:Y.getIdentVendorPath(e),stripComponents:1})}};Ke();Ke();Ke();var v2=class{supportsDescriptor(e,r){return y2.test(e.range)?!!(e.range.startsWith(Mi)||EE.test(e.range)):!1}supportsLocator(e,r){return y2.test(e.reference)?!!e.reference.startsWith(Mi):!1}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return EE.test(e.range)&&(e=Y.makeDescriptor(e,`${Mi}${e.range}`)),Y.bindDescriptor(e,{locator:Y.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:a,parentLocator:n}=C2(e.range);if(n===null)throw new Error("Assertion failed: The descriptor should have been bound");let u=IE(e,{parentLocator:n,path:a,hash:"",protocol:Mi}),A=await E2(u,o.fetchOptions),p=bn.makeHash(A).slice(0,6);return[IE(e,{parentLocator:n,path:a,hash:p,protocol:Mi})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await Ye.releaseAfterUseAsync(async()=>await Nt.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var Bgt={fetchers:[B2,I2],resolvers:[v2,w2]},vgt=Bgt;var bH={};Yt(bH,{GithubFetcher:()=>D2,default:()=>Sgt,githubUtils:()=>pQ});Ke();bt();var pQ={};Yt(pQ,{invalidGithubUrlMessage:()=>Ume,isGithubUrl:()=>PH,parseGithubUrl:()=>xH});var Ome=tt(Ie("querystring")),Mme=[/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+)\/tarball\/([^/#]+)(?:#(.*))?$/,/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+?)(?:\.git)?(?:#(.*))?$/];function PH(t){return t?Mme.some(e=>!!t.match(e)):!1}function xH(t){let e;for(let A of Mme)if(e=t.match(A),e)break;if(!e)throw new Error(Ume(t));let[,r,o,a,n="master"]=e,{commit:u}=Ome.default.parse(n);return n=u||n.replace(/[^:]*:/,""),{auth:r,username:o,reponame:a,treeish:n}}function Ume(t){return`Input cannot be parsed as a valid GitHub URL ('${t}').`}var D2=class{supports(e,r){return!!PH(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${Y.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from GitHub`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:Y.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let o=await ln.get(this.getLocatorUrl(e,r),{configuration:r.project.configuration});return await ae.mktempPromise(async a=>{let n=new An(a);await Ji.extractArchiveTo(o,n,{stripComponents:1});let u=$o.splitRepoUrl(e.reference),A=z.join(a,"package.tgz");await sn.prepareExternalProject(a,A,{configuration:r.project.configuration,report:r.report,workspace:u.extra.workspace,locator:e});let p=await ae.readFilePromise(A);return await Ji.convertToZip(p,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:Y.getIdentVendorPath(e),stripComponents:1})})}getLocatorUrl(e,r){let{auth:o,username:a,reponame:n,treeish:u}=xH(e.reference);return`https://${o?`${o}@`:""}github.com/${a}/${n}/archive/${u}.tar.gz`}};var Dgt={hooks:{async fetchHostedRepository(t,e,r){if(t!==null)return t;let o=new D2;if(!o.supports(e,r))return null;try{return await o.fetch(e,r)}catch{return null}}}},Sgt=Dgt;var QH={};Yt(QH,{TarballHttpFetcher:()=>x2,TarballHttpResolver:()=>b2,default:()=>xgt});Ke();var S2=/^[^?]*\.(?:tar\.gz|tgz)(?:\?.*)?$/,P2=/^https?:/;var x2=class{supports(e,r){return S2.test(e.reference)?!!P2.test(e.reference):!1}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${Y.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:Y.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let o=await ln.get(e.reference,{configuration:r.project.configuration});return await Ji.convertToZip(o,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:Y.getIdentVendorPath(e),stripComponents:1})}};Ke();Ke();var b2=class{supportsDescriptor(e,r){return S2.test(e.range)?!!P2.test(e.range):!1}supportsLocator(e,r){return S2.test(e.reference)?!!P2.test(e.reference):!1}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){return[Y.convertDescriptorToLocator(e)]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await Ye.releaseAfterUseAsync(async()=>await Nt.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var Pgt={fetchers:[x2],resolvers:[b2]},xgt=Pgt;var kH={};Yt(kH,{InitCommand:()=>ph,default:()=>Qgt});Ke();Ke();bt();_t();var ph=class extends ct{constructor(){super(...arguments);this.private=fe.Boolean("-p,--private",!1,{description:"Initialize a private package"});this.workspace=fe.Boolean("-w,--workspace",!1,{description:"Initialize a workspace root with a `packages/` directory"});this.install=fe.String("-i,--install",!1,{tolerateBoolean:!0,description:"Initialize a package with a specific bundle that will be locked in the project"});this.name=fe.String("-n,--name",{description:"Initialize a package with the given name"});this.usev2=fe.Boolean("-2",!1,{hidden:!0});this.yes=fe.Boolean("-y,--yes",{hidden:!0})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),o=typeof this.install=="string"?this.install:this.usev2||this.install===!0?"latest":null;return o!==null?await this.executeProxy(r,o):await this.executeRegular(r)}async executeProxy(r,o){if(r.projectCwd!==null&&r.projectCwd!==this.context.cwd)throw new ot("Cannot use the --install flag from within a project subdirectory");ae.existsSync(this.context.cwd)||await ae.mkdirPromise(this.context.cwd,{recursive:!0});let a=z.join(this.context.cwd,r.get("lockfileFilename"));ae.existsSync(a)||await ae.writeFilePromise(a,"");let n=await this.cli.run(["set","version",o],{quiet:!0});if(n!==0)return n;let u=[];return this.private&&u.push("-p"),this.workspace&&u.push("-w"),this.name&&u.push(`-n=${this.name}`),this.yes&&u.push("-y"),await ae.mktempPromise(async A=>{let{code:p}=await Mr.pipevp("yarn",["init",...u],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await sn.makeScriptEnv({binFolder:A})});return p})}async executeRegular(r){let o=null;try{o=(await St.find(r,this.context.cwd)).project}catch{o=null}ae.existsSync(this.context.cwd)||await ae.mkdirPromise(this.context.cwd,{recursive:!0});let a=await Nt.tryFind(this.context.cwd),n=a??new Nt,u=Object.fromEntries(r.get("initFields").entries());n.load(u),n.name=n.name??Y.makeIdent(r.get("initScope"),this.name??z.basename(this.context.cwd)),n.packageManager=On&&Ye.isTaggedYarnVersion(On)?`yarn@${On}`:null,(!a&&this.workspace||this.private)&&(n.private=!0),this.workspace&&n.workspaceDefinitions.length===0&&(await ae.mkdirPromise(z.join(this.context.cwd,"packages"),{recursive:!0}),n.workspaceDefinitions=[{pattern:"packages/*"}]);let A={};n.exportTo(A);let p=z.join(this.context.cwd,Nt.fileName);await ae.changeFilePromise(p,`${JSON.stringify(A,null,2)} +`,{automaticNewlines:!0});let h=[p],E=z.join(this.context.cwd,"README.md");if(ae.existsSync(E)||(await ae.writeFilePromise(E,`# ${Y.stringifyIdent(n.name)} +`),h.push(E)),!o||o.cwd===this.context.cwd){let w=z.join(this.context.cwd,Lr.lockfile);ae.existsSync(w)||(await ae.writeFilePromise(w,""),h.push(w));let b=[".yarn/*","!.yarn/patches","!.yarn/plugins","!.yarn/releases","!.yarn/sdks","!.yarn/versions","","# Swap the comments on the following lines if you wish to use zero-installs","# In that case, don't forget to run `yarn config set enableGlobalCache false`!","# Documentation here: https://yarnpkg.com/features/zero-installs","","#!.yarn/cache",".pnp.*"].map(pe=>`${pe} +`).join(""),C=z.join(this.context.cwd,".gitignore");ae.existsSync(C)||(await ae.writeFilePromise(C,b),h.push(C));let L=["/.yarn/** linguist-vendored","/.yarn/releases/* binary","/.yarn/plugins/**/* binary","/.pnp.* binary linguist-generated"].map(pe=>`${pe} +`).join(""),_=z.join(this.context.cwd,".gitattributes");ae.existsSync(_)||(await ae.writeFilePromise(_,L),h.push(_));let V={["*"]:{endOfLine:"lf",insertFinalNewline:!0},["*.{js,json,yml}"]:{charset:"utf-8",indentStyle:"space",indentSize:2}};Ye.mergeIntoTarget(V,r.get("initEditorConfig"));let re=`root = true +`;for(let[pe,he]of Object.entries(V)){re+=` +[${pe}] +`;for(let[ve,ge]of Object.entries(he)){let le=ve.replace(/[A-Z]/g,Pe=>`_${Pe.toLowerCase()}`);re+=`${le} = ${ge} +`}}let oe=z.join(this.context.cwd,".editorconfig");ae.existsSync(oe)||(await ae.writeFilePromise(oe,re),h.push(oe)),await this.cli.run(["install"],{quiet:!0}),ae.existsSync(z.join(this.context.cwd,".git"))||(await Mr.execvp("git",["init"],{cwd:this.context.cwd}),await Mr.execvp("git",["add","--",...h],{cwd:this.context.cwd}),await Mr.execvp("git",["commit","--allow-empty","-m","First commit"],{cwd:this.context.cwd}))}}};ph.paths=[["init"]],ph.usage=it.Usage({description:"create a new package",details:"\n This command will setup a new package in your local directory.\n\n If the `-p,--private` or `-w,--workspace` options are set, the package will be private by default.\n\n If the `-w,--workspace` option is set, the package will be configured to accept a set of workspaces in the `packages/` directory.\n\n If the `-i,--install` option is given a value, Yarn will first download it using `yarn set version` and only then forward the init call to the newly downloaded bundle. Without arguments, the downloaded bundle will be `latest`.\n\n The initial settings of the manifest can be changed by using the `initScope` and `initFields` configuration values. Additionally, Yarn will generate an EditorConfig file whose rules can be altered via `initEditorConfig`, and will initialize a Git repository in the current directory.\n ",examples:[["Create a new package in the local directory","yarn init"],["Create a new private package in the local directory","yarn init -p"],["Create a new package and store the Yarn release inside","yarn init -i=latest"],["Create a new private package and defines it as a workspace root","yarn init -w"]]});var bgt={configuration:{initScope:{description:"Scope used when creating packages via the init command",type:"STRING",default:null},initFields:{description:"Additional fields to set when creating packages via the init command",type:"MAP",valueDefinition:{description:"",type:"ANY"}},initEditorConfig:{description:"Extra rules to define in the generator editorconfig",type:"MAP",valueDefinition:{description:"",type:"ANY"}}},commands:[ph]},Qgt=bgt;var Rq={};Yt(Rq,{SearchCommand:()=>yh,UpgradeInteractiveCommand:()=>Eh,default:()=>yIt});Ke();var _me=tt(Ie("os"));function wE({stdout:t}){if(_me.default.endianness()==="BE")throw new Error("Interactive commands cannot be used on big-endian systems because ink depends on yoga-layout-prebuilt which only supports little-endian architectures");if(!t.isTTY)throw new Error("Interactive commands can only be used inside a TTY environment")}_t();var Zye=tt(JH()),zH={appId:"OFCNCOG2CU",apiKey:"6fe4476ee5a1832882e326b506d14126",indexName:"npm-search"},Pmt=(0,Zye.default)(zH.appId,zH.apiKey).initIndex(zH.indexName),XH=async(t,e=0)=>await Pmt.search(t,{analyticsTags:["yarn-plugin-interactive-tools"],attributesToRetrieve:["name","version","owner","repository","humanDownloadsLast30Days"],page:e,hitsPerPage:10});var xB=["regular","dev","peer"],yh=class extends ct{async execute(){wE(this.context);let{Gem:e}=await Promise.resolve().then(()=>(tk(),wq)),{ScrollableItems:r}=await Promise.resolve().then(()=>(sk(),ik)),{useKeypress:o}=await Promise.resolve().then(()=>(DB(),pwe)),{useMinistore:a}=await Promise.resolve().then(()=>(xq(),Pq)),{renderForm:n}=await Promise.resolve().then(()=>(ck(),lk)),{default:u}=await Promise.resolve().then(()=>tt(Bwe())),{Box:A,Text:p}=await Promise.resolve().then(()=>tt(cc())),{default:h,useEffect:E,useState:w}=await Promise.resolve().then(()=>tt(en())),v=await Xe.find(this.context.cwd,this.context.plugins),b=()=>h.createElement(A,{flexDirection:"row"},h.createElement(A,{flexDirection:"column",width:48},h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},""),"/",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to move between packages.")),h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to select a package.")),h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," again to change the target."))),h.createElement(A,{flexDirection:"column"},h.createElement(A,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to install the selected packages.")),h.createElement(A,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to abort.")))),C=()=>h.createElement(h.Fragment,null,h.createElement(A,{width:15},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Owner")),h.createElement(A,{width:11},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Version")),h.createElement(A,{width:10},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Downloads"))),R=()=>h.createElement(A,{width:17},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Target")),L=({hit:ge,active:le})=>{let[Pe,g]=a(ge.name,null);o({active:le},(de,ne)=>{if(ne.name!=="space")return;if(!Pe){g(xB[0]);return}let Z=xB.indexOf(Pe)+1;Z===xB.length?g(null):g(xB[Z])},[Pe,g]);let De=Y.parseIdent(ge.name),Ce=Y.prettyIdent(v,De);return h.createElement(A,null,h.createElement(A,{width:45},h.createElement(p,{bold:!0,wrap:"wrap"},Ce)),h.createElement(A,{width:14,marginLeft:1},h.createElement(p,{bold:!0,wrap:"truncate"},ge.owner.name)),h.createElement(A,{width:10,marginLeft:1},h.createElement(p,{italic:!0,wrap:"truncate"},ge.version)),h.createElement(A,{width:16,marginLeft:1},h.createElement(p,null,ge.humanDownloadsLast30Days)))},_=({name:ge,active:le})=>{let[Pe]=a(ge,null),g=Y.parseIdent(ge);return h.createElement(A,null,h.createElement(A,{width:47},h.createElement(p,{bold:!0}," - ",Y.prettyIdent(v,g))),xB.map(De=>h.createElement(A,{key:De,width:14,marginLeft:1},h.createElement(p,null," ",h.createElement(e,{active:Pe===De})," ",h.createElement(p,{bold:!0},De)))))},V=()=>h.createElement(A,{marginTop:1},h.createElement(p,null,"Powered by Algolia.")),oe=await n(({useSubmit:ge})=>{let le=a();ge(le);let Pe=Array.from(le.keys()).filter(H=>le.get(H)!==null),[g,De]=w(""),[Ce,de]=w(0),[ne,Z]=w([]),me=H=>{H.match(/\t| /)||De(H)},be=async()=>{de(0);let H=await XH(g);H.query===g&&Z(H.hits)},ut=async()=>{let H=await XH(g,Ce+1);H.query===g&&H.page-1===Ce&&(de(H.page),Z([...ne,...H.hits]))};return E(()=>{g?be():Z([])},[g]),h.createElement(A,{flexDirection:"column"},h.createElement(b,null),h.createElement(A,{flexDirection:"row",marginTop:1},h.createElement(p,{bold:!0},"Search: "),h.createElement(A,{width:41},h.createElement(u,{value:g,onChange:me,placeholder:"i.e. babel, webpack, react...",showCursor:!1})),h.createElement(C,null)),ne.length?h.createElement(r,{radius:2,loop:!1,children:ne.map(H=>h.createElement(L,{key:H.name,hit:H,active:!1})),willReachEnd:ut}):h.createElement(p,{color:"gray"},"Start typing..."),h.createElement(A,{flexDirection:"row",marginTop:1},h.createElement(A,{width:49},h.createElement(p,{bold:!0},"Selected:")),h.createElement(R,null)),Pe.length?Pe.map(H=>h.createElement(_,{key:H,name:H,active:!1})):h.createElement(p,{color:"gray"},"No selected packages..."),h.createElement(V,null))},{},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof oe>"u")return 1;let pe=Array.from(oe.keys()).filter(ge=>oe.get(ge)==="regular"),he=Array.from(oe.keys()).filter(ge=>oe.get(ge)==="dev"),ve=Array.from(oe.keys()).filter(ge=>oe.get(ge)==="peer");return pe.length&&await this.cli.run(["add",...pe]),he.length&&await this.cli.run(["add","--dev",...he]),ve&&await this.cli.run(["add","--peer",...ve]),0}};yh.paths=[["search"]],yh.usage=it.Usage({category:"Interactive commands",description:"open the search interface",details:` + This command opens a fullscreen terminal interface where you can search for and install packages from the npm registry. + `,examples:[["Open the search window","yarn search"]]});Ke();_t();d_();var Qwe=tt(si()),bwe=/^((?:[\^~]|>=?)?)([0-9]+)(\.[0-9]+)(\.[0-9]+)((?:-\S+)?)$/,kwe=(t,e)=>t.length>0?[t.slice(0,e)].concat(kwe(t.slice(e),e)):[],Eh=class extends ct{async execute(){wE(this.context);let{ItemOptions:e}=await Promise.resolve().then(()=>(xwe(),Pwe)),{Pad:r}=await Promise.resolve().then(()=>(Fq(),Swe)),{ScrollableItems:o}=await Promise.resolve().then(()=>(sk(),ik)),{useMinistore:a}=await Promise.resolve().then(()=>(xq(),Pq)),{renderForm:n}=await Promise.resolve().then(()=>(ck(),lk)),{Box:u,Text:A}=await Promise.resolve().then(()=>tt(cc())),{default:p,useEffect:h,useRef:E,useState:w}=await Promise.resolve().then(()=>tt(en())),v=await Xe.find(this.context.cwd,this.context.plugins),{project:b,workspace:C}=await St.find(v,this.context.cwd),R=await Ur.find(v);if(!C)throw new er(b.cwd,this.context.cwd);await b.restoreInstallState({restoreResolutions:!1});let L=this.context.stdout.rows-7,_=(Ce,de)=>{let ne=bpe(Ce,de),Z="";for(let me of ne)me.added?Z+=ye.pretty(v,me.value,"green"):me.removed||(Z+=me.value);return Z},V=(Ce,de)=>{if(Ce===de)return de;let ne=Y.parseRange(Ce),Z=Y.parseRange(de),me=ne.selector.match(bwe),be=Z.selector.match(bwe);if(!me||!be)return _(Ce,de);let ut=["gray","red","yellow","green","magenta"],H=null,yt="";for(let Me=1;Me{let Z=await eu.fetchDescriptorFrom(Ce,ne,{project:b,cache:R,preserveModifier:de,workspace:C});return Z!==null?Z.range:Ce.range},oe=async Ce=>{let de=Qwe.default.valid(Ce.range)?`^${Ce.range}`:Ce.range,[ne,Z]=await Promise.all([re(Ce,Ce.range,de).catch(()=>null),re(Ce,Ce.range,"latest").catch(()=>null)]),me=[{value:null,label:Ce.range}];return ne&&ne!==Ce.range?me.push({value:ne,label:V(Ce.range,ne)}):me.push({value:null,label:""}),Z&&Z!==ne&&Z!==Ce.range?me.push({value:Z,label:V(Ce.range,Z)}):me.push({value:null,label:""}),me},pe=()=>p.createElement(u,{flexDirection:"row"},p.createElement(u,{flexDirection:"column",width:49},p.createElement(u,{marginLeft:1},p.createElement(A,null,"Press ",p.createElement(A,{bold:!0,color:"cyanBright"},""),"/",p.createElement(A,{bold:!0,color:"cyanBright"},"")," to select packages.")),p.createElement(u,{marginLeft:1},p.createElement(A,null,"Press ",p.createElement(A,{bold:!0,color:"cyanBright"},""),"/",p.createElement(A,{bold:!0,color:"cyanBright"},"")," to select versions."))),p.createElement(u,{flexDirection:"column"},p.createElement(u,{marginLeft:1},p.createElement(A,null,"Press ",p.createElement(A,{bold:!0,color:"cyanBright"},"")," to install.")),p.createElement(u,{marginLeft:1},p.createElement(A,null,"Press ",p.createElement(A,{bold:!0,color:"cyanBright"},"")," to abort.")))),he=()=>p.createElement(u,{flexDirection:"row",paddingTop:1,paddingBottom:1},p.createElement(u,{width:50},p.createElement(A,{bold:!0},p.createElement(A,{color:"greenBright"},"?")," Pick the packages you want to upgrade.")),p.createElement(u,{width:17},p.createElement(A,{bold:!0,underline:!0,color:"gray"},"Current")),p.createElement(u,{width:17},p.createElement(A,{bold:!0,underline:!0,color:"gray"},"Range")),p.createElement(u,{width:17},p.createElement(A,{bold:!0,underline:!0,color:"gray"},"Latest"))),ve=({active:Ce,descriptor:de,suggestions:ne})=>{let[Z,me]=a(de.descriptorHash,null),be=Y.stringifyIdent(de),ut=Math.max(0,45-be.length);return p.createElement(p.Fragment,null,p.createElement(u,null,p.createElement(u,{width:45},p.createElement(A,{bold:!0},Y.prettyIdent(v,de)),p.createElement(r,{active:Ce,length:ut})),p.createElement(e,{active:Ce,options:ne,value:Z,skewer:!0,onChange:me,sizes:[17,17,17]})))},ge=({dependencies:Ce})=>{let[de,ne]=w(Ce.map(()=>null)),Z=E(!0),me=async be=>{let ut=await oe(be);return ut.filter(H=>H.label!=="").length<=1?null:{descriptor:be,suggestions:ut}};return h(()=>()=>{Z.current=!1},[]),h(()=>{let be=Math.trunc(L*1.75),ut=Ce.slice(0,be),H=Ce.slice(be),yt=kwe(H,L),Me=ut.map(me).reduce(async(Te,Qe)=>{await Te;let _e=await Qe;_e!==null&&(!Z.current||ne(qe=>{let At=qe.findIndex(x=>x===null),Oe=[...qe];return Oe[At]=_e,Oe}))},Promise.resolve());yt.reduce((Te,Qe)=>Promise.all(Qe.map(_e=>Promise.resolve().then(()=>me(_e)))).then(async _e=>{_e=_e.filter(qe=>qe!==null),await Te,Z.current&&ne(qe=>{let At=qe.findIndex(Oe=>Oe===null);return qe.slice(0,At).concat(_e).concat(qe.slice(At+_e.length))})}),Me).then(()=>{Z.current&&ne(Te=>Te.filter(Qe=>Qe!==null))})},[]),de.length?p.createElement(o,{radius:L>>1,children:de.map((be,ut)=>be!==null?p.createElement(ve,{key:ut,active:!1,descriptor:be.descriptor,suggestions:be.suggestions}):p.createElement(A,{key:ut},"Loading..."))}):p.createElement(A,null,"No upgrades found")},Pe=await n(({useSubmit:Ce})=>{Ce(a());let de=new Map;for(let Z of b.workspaces)for(let me of["dependencies","devDependencies"])for(let be of Z.manifest[me].values())b.tryWorkspaceByDescriptor(be)===null&&de.set(be.descriptorHash,be);let ne=Ye.sortMap(de.values(),Z=>Y.stringifyDescriptor(Z));return p.createElement(u,{flexDirection:"column"},p.createElement(pe,null),p.createElement(he,null),p.createElement(ge,{dependencies:ne}))},{},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof Pe>"u")return 1;let g=!1;for(let Ce of b.workspaces)for(let de of["dependencies","devDependencies"]){let ne=Ce.manifest[de];for(let Z of ne.values()){let me=Pe.get(Z.descriptorHash);typeof me<"u"&&me!==null&&(ne.set(Z.identHash,Y.makeDescriptor(Z,me)),g=!0)}}return g?(await Et.start({configuration:v,stdout:this.context.stdout,includeLogs:!this.context.quiet},async Ce=>{await b.install({cache:R,report:Ce})})).exitCode():0}};Eh.paths=[["upgrade-interactive"]],Eh.usage=it.Usage({category:"Interactive commands",description:"open the upgrade interface",details:` + This command opens a fullscreen terminal interface where you can see any out of date packages used by your application, their status compared to the latest versions available on the remote registry, and select packages to upgrade. + `,examples:[["Open the upgrade window","yarn upgrade-interactive"]]});var mIt={commands:[yh,Eh]},yIt=mIt;var Tq={};Yt(Tq,{LinkFetcher:()=>QB,LinkResolver:()=>kB,PortalFetcher:()=>FB,PortalResolver:()=>RB,default:()=>EIt});Ke();bt();var ep="portal:",tp="link:";var QB=class{supports(e,r){return!!e.reference.startsWith(tp)}getLocalPath(e,r){let{parentLocator:o,path:a}=Y.parseFileStyleRange(e.reference,{protocol:tp});if(z.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:z.resolve(n,a)}async fetch(e,r){let{parentLocator:o,path:a}=Y.parseFileStyleRange(e.reference,{protocol:tp}),n=z.isAbsolute(a)?{packageFs:new An(wt.root),prefixPath:wt.dot,localPath:wt.root}:await r.fetcher.fetch(o,r),u=n.localPath?{packageFs:new An(wt.root),prefixPath:z.relative(wt.root,n.localPath),localPath:wt.root}:n;n!==u&&n.releaseFs&&n.releaseFs();let A=u.packageFs,p=z.resolve(u.localPath??u.packageFs.getRealPath(),u.prefixPath,a);return n.localPath?{packageFs:new An(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:wt.dot,discardFromLookup:!0,localPath:p}:{packageFs:new Gu(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:wt.dot,discardFromLookup:!0}}};Ke();bt();var kB=class{supportsDescriptor(e,r){return!!e.range.startsWith(tp)}supportsLocator(e,r){return!!e.reference.startsWith(tp)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return Y.bindDescriptor(e,{locator:Y.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=e.range.slice(tp.length);return[Y.makeLocator(e,`${tp}${ue.toPortablePath(a)}`)]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){return{...e,version:"0.0.0",languageName:r.project.configuration.get("defaultLanguageName"),linkType:"SOFT",conditions:null,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map}}};Ke();bt();var FB=class{supports(e,r){return!!e.reference.startsWith(ep)}getLocalPath(e,r){let{parentLocator:o,path:a}=Y.parseFileStyleRange(e.reference,{protocol:ep});if(z.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:z.resolve(n,a)}async fetch(e,r){let{parentLocator:o,path:a}=Y.parseFileStyleRange(e.reference,{protocol:ep}),n=z.isAbsolute(a)?{packageFs:new An(wt.root),prefixPath:wt.dot,localPath:wt.root}:await r.fetcher.fetch(o,r),u=n.localPath?{packageFs:new An(wt.root),prefixPath:z.relative(wt.root,n.localPath),localPath:wt.root}:n;n!==u&&n.releaseFs&&n.releaseFs();let A=u.packageFs,p=z.resolve(u.localPath??u.packageFs.getRealPath(),u.prefixPath,a);return n.localPath?{packageFs:new An(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:wt.dot,localPath:p}:{packageFs:new Gu(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:wt.dot}}};Ke();Ke();bt();var RB=class{supportsDescriptor(e,r){return!!e.range.startsWith(ep)}supportsLocator(e,r){return!!e.reference.startsWith(ep)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return Y.bindDescriptor(e,{locator:Y.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=e.range.slice(ep.length);return[Y.makeLocator(e,`${ep}${ue.toPortablePath(a)}`)]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await Ye.releaseAfterUseAsync(async()=>await Nt.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"SOFT",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var CIt={fetchers:[QB,FB],resolvers:[kB,RB]},EIt=CIt;var mj={};Yt(mj,{NodeModulesLinker:()=>JB,NodeModulesMode:()=>pj,PnpLooseLinker:()=>zB,default:()=>Owt});bt();Ke();bt();bt();var Lq=(t,e)=>`${t}@${e}`,Fwe=(t,e)=>{let r=e.indexOf("#"),o=r>=0?e.substring(r+1):e;return Lq(t,o)};var Nwe=(t,e={})=>{let r=e.debugLevel||Number(process.env.NM_DEBUG_LEVEL||-1),o=e.check||r>=9,a=e.hoistingLimits||new Map,n={check:o,debugLevel:r,hoistingLimits:a,fastLookupPossible:!0},u;n.debugLevel>=0&&(u=Date.now());let A=PIt(t,n),p=!1,h=0;do p=Oq(A,[A],new Set([A.locator]),new Map,n).anotherRoundNeeded,n.fastLookupPossible=!1,h++;while(p);if(n.debugLevel>=0&&console.log(`hoist time: ${Date.now()-u}ms, rounds: ${h}`),n.debugLevel>=1){let E=TB(A);if(Oq(A,[A],new Set([A.locator]),new Map,n).isGraphChanged)throw new Error(`The hoisting result is not terminal, prev tree: +${E}, next tree: +${TB(A)}`);let v=Lwe(A);if(v)throw new Error(`${v}, after hoisting finished: +${TB(A)}`)}return n.debugLevel>=2&&console.log(TB(A)),xIt(A)},IIt=t=>{let e=t[t.length-1],r=new Map,o=new Set,a=n=>{if(!o.has(n)){o.add(n);for(let u of n.hoistedDependencies.values())r.set(u.name,u);for(let u of n.dependencies.values())n.peerNames.has(u.name)||a(u)}};return a(e),r},wIt=t=>{let e=t[t.length-1],r=new Map,o=new Set,a=new Set,n=(u,A)=>{if(o.has(u))return;o.add(u);for(let h of u.hoistedDependencies.values())if(!A.has(h.name)){let E;for(let w of t)E=w.dependencies.get(h.name),E&&r.set(E.name,E)}let p=new Set;for(let h of u.dependencies.values())p.add(h.name);for(let h of u.dependencies.values())u.peerNames.has(h.name)||n(h,p)};return n(e,a),r},Rwe=(t,e)=>{if(e.decoupled)return e;let{name:r,references:o,ident:a,locator:n,dependencies:u,originalDependencies:A,hoistedDependencies:p,peerNames:h,reasons:E,isHoistBorder:w,hoistPriority:v,dependencyKind:b,hoistedFrom:C,hoistedTo:R}=e,L={name:r,references:new Set(o),ident:a,locator:n,dependencies:new Map(u),originalDependencies:new Map(A),hoistedDependencies:new Map(p),peerNames:new Set(h),reasons:new Map(E),decoupled:!0,isHoistBorder:w,hoistPriority:v,dependencyKind:b,hoistedFrom:new Map(C),hoistedTo:new Map(R)},_=L.dependencies.get(r);return _&&_.ident==L.ident&&L.dependencies.set(r,L),t.dependencies.set(L.name,L),L},BIt=(t,e)=>{let r=new Map([[t.name,[t.ident]]]);for(let a of t.dependencies.values())t.peerNames.has(a.name)||r.set(a.name,[a.ident]);let o=Array.from(e.keys());o.sort((a,n)=>{let u=e.get(a),A=e.get(n);return A.hoistPriority!==u.hoistPriority?A.hoistPriority-u.hoistPriority:A.peerDependents.size!==u.peerDependents.size?A.peerDependents.size-u.peerDependents.size:A.dependents.size-u.dependents.size});for(let a of o){let n=a.substring(0,a.indexOf("@",1)),u=a.substring(n.length+1);if(!t.peerNames.has(n)){let A=r.get(n);A||(A=[],r.set(n,A)),A.indexOf(u)<0&&A.push(u)}}return r},Nq=t=>{let e=new Set,r=(o,a=new Set)=>{if(!a.has(o)){a.add(o);for(let n of o.peerNames)if(!t.peerNames.has(n)){let u=t.dependencies.get(n);u&&!e.has(u)&&r(u,a)}e.add(o)}};for(let o of t.dependencies.values())t.peerNames.has(o.name)||r(o);return e},Oq=(t,e,r,o,a,n=new Set)=>{let u=e[e.length-1];if(n.has(u))return{anotherRoundNeeded:!1,isGraphChanged:!1};n.add(u);let A=bIt(u),p=BIt(u,A),h=t==u?new Map:a.fastLookupPossible?IIt(e):wIt(e),E,w=!1,v=!1,b=new Map(Array.from(p.entries()).map(([R,L])=>[R,L[0]])),C=new Map;do{let R=SIt(t,e,r,h,b,p,o,C,a);R.isGraphChanged&&(v=!0),R.anotherRoundNeeded&&(w=!0),E=!1;for(let[L,_]of p)_.length>1&&!u.dependencies.has(L)&&(b.delete(L),_.shift(),b.set(L,_[0]),E=!0)}while(E);for(let R of u.dependencies.values())if(!u.peerNames.has(R.name)&&!r.has(R.locator)){r.add(R.locator);let L=Oq(t,[...e,R],r,C,a);L.isGraphChanged&&(v=!0),L.anotherRoundNeeded&&(w=!0),r.delete(R.locator)}return{anotherRoundNeeded:w,isGraphChanged:v}},vIt=t=>{for(let[e,r]of t.dependencies)if(!t.peerNames.has(e)&&r.ident!==t.ident)return!0;return!1},DIt=(t,e,r,o,a,n,u,A,{outputReason:p,fastLookupPossible:h})=>{let E,w=null,v=new Set;p&&(E=`${Array.from(e).map(L=>eo(L)).join("\u2192")}`);let b=r[r.length-1],R=!(o.ident===b.ident);if(p&&!R&&(w="- self-reference"),R&&(R=o.dependencyKind!==1,p&&!R&&(w="- workspace")),R&&o.dependencyKind===2&&(R=!vIt(o),p&&!R&&(w="- external soft link with unhoisted dependencies")),R&&(R=b.dependencyKind!==1||b.hoistedFrom.has(o.name)||e.size===1,p&&!R&&(w=b.reasons.get(o.name))),R&&(R=!t.peerNames.has(o.name),p&&!R&&(w=`- cannot shadow peer: ${eo(t.originalDependencies.get(o.name).locator)} at ${E}`)),R){let L=!1,_=a.get(o.name);if(L=!_||_.ident===o.ident,p&&!L&&(w=`- filled by: ${eo(_.locator)} at ${E}`),L)for(let V=r.length-1;V>=1;V--){let oe=r[V].dependencies.get(o.name);if(oe&&oe.ident!==o.ident){L=!1;let pe=A.get(b);pe||(pe=new Set,A.set(b,pe)),pe.add(o.name),p&&(w=`- filled by ${eo(oe.locator)} at ${r.slice(0,V).map(he=>eo(he.locator)).join("\u2192")}`);break}}R=L}if(R&&(R=n.get(o.name)===o.ident,p&&!R&&(w=`- filled by: ${eo(u.get(o.name)[0])} at ${E}`)),R){let L=!0,_=new Set(o.peerNames);for(let V=r.length-1;V>=1;V--){let re=r[V];for(let oe of _){if(re.peerNames.has(oe)&&re.originalDependencies.has(oe))continue;let pe=re.dependencies.get(oe);pe&&t.dependencies.get(oe)!==pe&&(V===r.length-1?v.add(pe):(v=null,L=!1,p&&(w=`- peer dependency ${eo(pe.locator)} from parent ${eo(re.locator)} was not hoisted to ${E}`))),_.delete(oe)}if(!L)break}R=L}if(R&&!h)for(let L of o.hoistedDependencies.values()){let _=a.get(L.name)||t.dependencies.get(L.name);if(!_||L.ident!==_.ident){R=!1,p&&(w=`- previously hoisted dependency mismatch, needed: ${eo(L.locator)}, available: ${eo(_==null?void 0:_.locator)}`);break}}return v!==null&&v.size>0?{isHoistable:2,dependsOn:v,reason:w}:{isHoistable:R?0:1,reason:w}},uk=t=>`${t.name}@${t.locator}`,SIt=(t,e,r,o,a,n,u,A,p)=>{let h=e[e.length-1],E=new Set,w=!1,v=!1,b=(_,V,re,oe,pe)=>{if(E.has(oe))return;let he=[...V,uk(oe)],ve=[...re,uk(oe)],ge=new Map,le=new Map;for(let de of Nq(oe)){let ne=DIt(h,r,[h,..._,oe],de,o,a,n,A,{outputReason:p.debugLevel>=2,fastLookupPossible:p.fastLookupPossible});if(le.set(de,ne),ne.isHoistable===2)for(let Z of ne.dependsOn){let me=ge.get(Z.name)||new Set;me.add(de.name),ge.set(Z.name,me)}}let Pe=new Set,g=(de,ne,Z)=>{if(!Pe.has(de)){Pe.add(de),le.set(de,{isHoistable:1,reason:Z});for(let me of ge.get(de.name)||[])g(oe.dependencies.get(me),ne,p.debugLevel>=2?`- peer dependency ${eo(de.locator)} from parent ${eo(oe.locator)} was not hoisted`:"")}};for(let[de,ne]of le)ne.isHoistable===1&&g(de,ne,ne.reason);let De=!1;for(let de of le.keys())if(!Pe.has(de)){v=!0;let ne=u.get(oe);ne&&ne.has(de.name)&&(w=!0),De=!0,oe.dependencies.delete(de.name),oe.hoistedDependencies.set(de.name,de),oe.reasons.delete(de.name);let Z=h.dependencies.get(de.name);if(p.debugLevel>=2){let me=Array.from(V).concat([oe.locator]).map(ut=>eo(ut)).join("\u2192"),be=h.hoistedFrom.get(de.name);be||(be=[],h.hoistedFrom.set(de.name,be)),be.push(me),oe.hoistedTo.set(de.name,Array.from(e).map(ut=>eo(ut.locator)).join("\u2192"))}if(!Z)h.ident!==de.ident&&(h.dependencies.set(de.name,de),pe.add(de));else for(let me of de.references)Z.references.add(me)}if(oe.dependencyKind===2&&De&&(w=!0),p.check){let de=Lwe(t);if(de)throw new Error(`${de}, after hoisting dependencies of ${[h,..._,oe].map(ne=>eo(ne.locator)).join("\u2192")}: +${TB(t)}`)}let Ce=Nq(oe);for(let de of Ce)if(Pe.has(de)){let ne=le.get(de);if((a.get(de.name)===de.ident||!oe.reasons.has(de.name))&&ne.isHoistable!==0&&oe.reasons.set(de.name,ne.reason),!de.isHoistBorder&&ve.indexOf(uk(de))<0){E.add(oe);let me=Rwe(oe,de);b([..._,oe],he,ve,me,R),E.delete(oe)}}},C,R=new Set(Nq(h)),L=Array.from(e).map(_=>uk(_));do{C=R,R=new Set;for(let _ of C){if(_.locator===h.locator||_.isHoistBorder)continue;let V=Rwe(h,_);b([],Array.from(r),L,V,R)}}while(R.size>0);return{anotherRoundNeeded:w,isGraphChanged:v}},Lwe=t=>{let e=[],r=new Set,o=new Set,a=(n,u,A)=>{if(r.has(n)||(r.add(n),o.has(n)))return;let p=new Map(u);for(let h of n.dependencies.values())n.peerNames.has(h.name)||p.set(h.name,h);for(let h of n.originalDependencies.values()){let E=p.get(h.name),w=()=>`${Array.from(o).concat([n]).map(v=>eo(v.locator)).join("\u2192")}`;if(n.peerNames.has(h.name)){let v=u.get(h.name);(v!==E||!v||v.ident!==h.ident)&&e.push(`${w()} - broken peer promise: expected ${h.ident} but found ${v&&v.ident}`)}else{let v=A.hoistedFrom.get(n.name),b=n.hoistedTo.get(h.name),C=`${v?` hoisted from ${v.join(", ")}`:""}`,R=`${b?` hoisted to ${b}`:""}`,L=`${w()}${C}`;E?E.ident!==h.ident&&e.push(`${L} - broken require promise for ${h.name}${R}: expected ${h.ident}, but found: ${E.ident}`):e.push(`${L} - broken require promise: no required dependency ${h.name}${R} found`)}}o.add(n);for(let h of n.dependencies.values())n.peerNames.has(h.name)||a(h,p,n);o.delete(n)};return a(t,t.dependencies,t),e.join(` +`)},PIt=(t,e)=>{let{identName:r,name:o,reference:a,peerNames:n}=t,u={name:o,references:new Set([a]),locator:Lq(r,a),ident:Fwe(r,a),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(n),reasons:new Map,decoupled:!0,isHoistBorder:!0,hoistPriority:0,dependencyKind:1,hoistedFrom:new Map,hoistedTo:new Map},A=new Map([[t,u]]),p=(h,E)=>{let w=A.get(h),v=!!w;if(!w){let{name:b,identName:C,reference:R,peerNames:L,hoistPriority:_,dependencyKind:V}=h,re=e.hoistingLimits.get(E.locator);w={name:b,references:new Set([R]),locator:Lq(C,R),ident:Fwe(C,R),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(L),reasons:new Map,decoupled:!0,isHoistBorder:re?re.has(b):!1,hoistPriority:_||0,dependencyKind:V||0,hoistedFrom:new Map,hoistedTo:new Map},A.set(h,w)}if(E.dependencies.set(h.name,w),E.originalDependencies.set(h.name,w),v){let b=new Set,C=R=>{if(!b.has(R)){b.add(R),R.decoupled=!1;for(let L of R.dependencies.values())R.peerNames.has(L.name)||C(L)}};C(w)}else for(let b of h.dependencies)p(b,w)};for(let h of t.dependencies)p(h,u);return u},Mq=t=>t.substring(0,t.indexOf("@",1)),xIt=t=>{let e={name:t.name,identName:Mq(t.locator),references:new Set(t.references),dependencies:new Set},r=new Set([t]),o=(a,n,u)=>{let A=r.has(a),p;if(n===a)p=u;else{let{name:h,references:E,locator:w}=a;p={name:h,identName:Mq(w),references:E,dependencies:new Set}}if(u.dependencies.add(p),!A){r.add(a);for(let h of a.dependencies.values())a.peerNames.has(h.name)||o(h,a,p);r.delete(a)}};for(let a of t.dependencies.values())o(a,t,e);return e},bIt=t=>{let e=new Map,r=new Set([t]),o=u=>`${u.name}@${u.ident}`,a=u=>{let A=o(u),p=e.get(A);return p||(p={dependents:new Set,peerDependents:new Set,hoistPriority:0},e.set(A,p)),p},n=(u,A)=>{let p=!!r.has(A);if(a(A).dependents.add(u.ident),!p){r.add(A);for(let E of A.dependencies.values()){let w=a(E);w.hoistPriority=Math.max(w.hoistPriority,E.hoistPriority),A.peerNames.has(E.name)?w.peerDependents.add(A.ident):n(A,E)}}};for(let u of t.dependencies.values())t.peerNames.has(u.name)||n(t,u);return e},eo=t=>{if(!t)return"none";let e=t.indexOf("@",1),r=t.substring(0,e);r.endsWith("$wsroot$")&&(r=`wh:${r.replace("$wsroot$","")}`);let o=t.substring(e+1);if(o==="workspace:.")return".";if(o){let a=(o.indexOf("#")>0?o.split("#")[1]:o).replace("npm:","");return o.startsWith("virtual")&&(r=`v:${r}`),a.startsWith("workspace")&&(r=`w:${r}`,a=""),`${r}${a?`@${a}`:""}`}else return`${r}`},Twe=5e4,TB=t=>{let e=0,r=(a,n,u="")=>{if(e>Twe||n.has(a))return"";e++;let A=Array.from(a.dependencies.values()).sort((h,E)=>h.name===E.name?0:h.name>E.name?1:-1),p="";n.add(a);for(let h=0;h":"")+(v!==E.name?`a:${E.name}:`:"")+eo(E.locator)+(w?` ${w}`:"")} +`,p+=r(E,n,`${u}${hTwe?` +Tree is too large, part of the tree has been dunped +`:"")};var NB=(o=>(o.WORKSPACES="workspaces",o.DEPENDENCIES="dependencies",o.NONE="none",o))(NB||{}),Owe="node_modules",dm="$wsroot$";var LB=(t,e)=>{let{packageTree:r,hoistingLimits:o,errors:a,preserveSymlinksRequired:n}=kIt(t,e),u=null;if(a.length===0){let A=Nwe(r,{hoistingLimits:o});u=RIt(t,A,e)}return{tree:u,errors:a,preserveSymlinksRequired:n}},mA=t=>`${t.name}@${t.reference}`,_q=t=>{let e=new Map;for(let[r,o]of t.entries())if(!o.dirList){let a=e.get(o.locator);a||(a={target:o.target,linkType:o.linkType,locations:[],aliases:o.aliases},e.set(o.locator,a)),a.locations.push(r)}for(let r of e.values())r.locations=r.locations.sort((o,a)=>{let n=o.split(z.delimiter).length,u=a.split(z.delimiter).length;return a===o?0:n!==u?u-n:a>o?1:-1});return e},Mwe=(t,e)=>{let r=Y.isVirtualLocator(t)?Y.devirtualizeLocator(t):t,o=Y.isVirtualLocator(e)?Y.devirtualizeLocator(e):e;return Y.areLocatorsEqual(r,o)},Uq=(t,e,r,o)=>{if(t.linkType!=="SOFT")return!1;let a=ue.toPortablePath(r.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?r.resolveVirtual(t.packageLocation):t.packageLocation);return z.contains(o,a)===null},QIt=t=>{let e=t.getPackageInformation(t.topLevel);if(e===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");if(t.findPackageLocator(e.packageLocation)===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let o=ue.toPortablePath(e.packageLocation.slice(0,-1)),a=new Map,n={children:new Map},u=t.getDependencyTreeRoots(),A=new Map,p=new Set,h=(v,b)=>{let C=mA(v);if(p.has(C))return;p.add(C);let R=t.getPackageInformation(v);if(R){let L=b?mA(b):"";if(mA(v)!==L&&R.linkType==="SOFT"&&!Uq(R,v,t,o)){let _=Uwe(R,v,t);(!A.get(_)||v.reference.startsWith("workspace:"))&&A.set(_,v)}for(let[_,V]of R.packageDependencies)V!==null&&(R.packagePeers.has(_)||h(t.getLocator(_,V),v))}};for(let v of u)h(v,null);let E=o.split(z.sep);for(let v of A.values()){let b=t.getPackageInformation(v),R=ue.toPortablePath(b.packageLocation.slice(0,-1)).split(z.sep).slice(E.length),L=n;for(let _ of R){let V=L.children.get(_);V||(V={children:new Map},L.children.set(_,V)),L=V}L.workspaceLocator=v}let w=(v,b)=>{if(v.workspaceLocator){let C=mA(b),R=a.get(C);R||(R=new Set,a.set(C,R)),R.add(v.workspaceLocator)}for(let C of v.children.values())w(C,v.workspaceLocator||b)};for(let v of n.children.values())w(v,n.workspaceLocator);return a},kIt=(t,e)=>{let r=[],o=!1,a=new Map,n=QIt(t),u=t.getPackageInformation(t.topLevel);if(u===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");let A=t.findPackageLocator(u.packageLocation);if(A===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let p=ue.toPortablePath(u.packageLocation.slice(0,-1)),h={name:A.name,identName:A.name,reference:A.reference,peerNames:u.packagePeers,dependencies:new Set,dependencyKind:1},E=new Map,w=(b,C)=>`${mA(C)}:${b}`,v=(b,C,R,L,_,V,re,oe)=>{var de,ne;let pe=w(b,R),he=E.get(pe),ve=!!he;!ve&&R.name===A.name&&R.reference===A.reference&&(he=h,E.set(pe,h));let ge=Uq(C,R,t,p);if(!he){let Z=0;ge?Z=2:C.linkType==="SOFT"&&R.name.endsWith(dm)&&(Z=1),he={name:b,identName:R.name,reference:R.reference,dependencies:new Set,peerNames:Z===1?new Set:C.packagePeers,dependencyKind:Z},E.set(pe,he)}let le;if(ge?le=2:_.linkType==="SOFT"?le=1:le=0,he.hoistPriority=Math.max(he.hoistPriority||0,le),oe&&!ge){let Z=mA({name:L.identName,reference:L.reference}),me=a.get(Z)||new Set;a.set(Z,me),me.add(he.name)}let Pe=new Map(C.packageDependencies);if(e.project){let Z=e.project.workspacesByCwd.get(ue.toPortablePath(C.packageLocation.slice(0,-1)));if(Z){let me=new Set([...Array.from(Z.manifest.peerDependencies.values(),be=>Y.stringifyIdent(be)),...Array.from(Z.manifest.peerDependenciesMeta.keys())]);for(let be of me)Pe.has(be)||(Pe.set(be,V.get(be)||null),he.peerNames.add(be))}}let g=mA({name:R.name.replace(dm,""),reference:R.reference}),De=n.get(g);if(De)for(let Z of De)Pe.set(`${Z.name}${dm}`,Z.reference);(C!==_||C.linkType!=="SOFT"||!ge&&(!e.selfReferencesByCwd||e.selfReferencesByCwd.get(re)))&&L.dependencies.add(he);let Ce=R!==A&&C.linkType==="SOFT"&&!R.name.endsWith(dm)&&!ge;if(!ve&&!Ce){let Z=new Map;for(let[me,be]of Pe)if(be!==null){let ut=t.getLocator(me,be),H=t.getLocator(me.replace(dm,""),be),yt=t.getPackageInformation(H);if(yt===null)throw new Error("Assertion failed: Expected the package to have been registered");let Me=Uq(yt,ut,t,p);if(e.validateExternalSoftLinks&&e.project&&Me){yt.packageDependencies.size>0&&(o=!0);for(let[At,Oe]of yt.packageDependencies)if(Oe!==null){let x=Y.parseLocator(Array.isArray(Oe)?`${Oe[0]}@${Oe[1]}`:`${At}@${Oe}`);if(mA(x)!==mA(ut)){let I=Pe.get(At);if(I){let P=Y.parseLocator(Array.isArray(I)?`${I[0]}@${I[1]}`:`${At}@${I}`);Mwe(P,x)||r.push({messageName:71,text:`Cannot link ${Y.prettyIdent(e.project.configuration,Y.parseIdent(ut.name))} into ${Y.prettyLocator(e.project.configuration,Y.parseLocator(`${R.name}@${R.reference}`))} dependency ${Y.prettyLocator(e.project.configuration,x)} conflicts with parent dependency ${Y.prettyLocator(e.project.configuration,P)}`})}else{let P=Z.get(At);if(P){let y=P.target,F=Y.parseLocator(Array.isArray(y)?`${y[0]}@${y[1]}`:`${At}@${y}`);Mwe(F,x)||r.push({messageName:71,text:`Cannot link ${Y.prettyIdent(e.project.configuration,Y.parseIdent(ut.name))} into ${Y.prettyLocator(e.project.configuration,Y.parseLocator(`${R.name}@${R.reference}`))} dependency ${Y.prettyLocator(e.project.configuration,x)} conflicts with dependency ${Y.prettyLocator(e.project.configuration,F)} from sibling portal ${Y.prettyIdent(e.project.configuration,Y.parseIdent(P.portal.name))}`})}else Z.set(At,{target:x.reference,portal:ut})}}}}let Te=(de=e.hoistingLimitsByCwd)==null?void 0:de.get(re),Qe=Me?re:z.relative(p,ue.toPortablePath(yt.packageLocation))||wt.dot,_e=(ne=e.hoistingLimitsByCwd)==null?void 0:ne.get(Qe);v(me,yt,ut,he,C,Pe,Qe,Te==="dependencies"||_e==="dependencies"||_e==="workspaces")}}};return v(A.name,u,A,h,u,u.packageDependencies,wt.dot,!1),{packageTree:h,hoistingLimits:a,errors:r,preserveSymlinksRequired:o}};function Uwe(t,e,r){let o=r.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?r.resolveVirtual(t.packageLocation):t.packageLocation;return ue.toPortablePath(o||t.packageLocation)}function FIt(t,e,r){let o=e.getLocator(t.name.replace(dm,""),t.reference),a=e.getPackageInformation(o);if(a===null)throw new Error("Assertion failed: Expected the package to be registered");return r.pnpifyFs?{linkType:"SOFT",target:ue.toPortablePath(a.packageLocation)}:{linkType:a.linkType,target:Uwe(a,t,e)}}var RIt=(t,e,r)=>{let o=new Map,a=(E,w,v)=>{let{linkType:b,target:C}=FIt(E,t,r);return{locator:mA(E),nodePath:w,target:C,linkType:b,aliases:v}},n=E=>{let[w,v]=E.split("/");return v?{scope:Li(w),name:Li(v)}:{scope:null,name:Li(w)}},u=new Set,A=(E,w,v)=>{if(u.has(E))return;u.add(E);let b=Array.from(E.references).sort().join("#");for(let C of E.dependencies){let R=Array.from(C.references).sort().join("#");if(C.identName===E.identName&&R===b)continue;let L=Array.from(C.references).sort(),_={name:C.identName,reference:L[0]},{name:V,scope:re}=n(C.name),oe=re?[re,V]:[V],pe=z.join(w,Owe),he=z.join(pe,...oe),ve=`${v}/${_.name}`,ge=a(_,v,L.slice(1)),le=!1;if(ge.linkType==="SOFT"&&r.project){let g=r.project.workspacesByCwd.get(ge.target.slice(0,-1));le=!!(g&&!g.manifest.name)}let Pe=ge.linkType==="SOFT"&&he.startsWith(ge.target);if(!C.name.endsWith(dm)&&!le&&!Pe){let g=o.get(he);if(g){if(g.dirList)throw new Error(`Assertion failed: ${he} cannot merge dir node with leaf node`);{let de=Y.parseLocator(g.locator),ne=Y.parseLocator(ge.locator);if(g.linkType!==ge.linkType)throw new Error(`Assertion failed: ${he} cannot merge nodes with different link types ${g.nodePath}/${Y.stringifyLocator(de)} and ${v}/${Y.stringifyLocator(ne)}`);if(de.identHash!==ne.identHash)throw new Error(`Assertion failed: ${he} cannot merge nodes with different idents ${g.nodePath}/${Y.stringifyLocator(de)} and ${v}/s${Y.stringifyLocator(ne)}`);ge.aliases=[...ge.aliases,...g.aliases,Y.parseLocator(g.locator).reference]}}o.set(he,ge);let De=he.split("/"),Ce=De.indexOf(Owe);for(let de=De.length-1;Ce>=0&&de>Ce;de--){let ne=ue.toPortablePath(De.slice(0,de).join(z.sep)),Z=Li(De[de]),me=o.get(ne);if(!me)o.set(ne,{dirList:new Set([Z])});else if(me.dirList){if(me.dirList.has(Z))break;me.dirList.add(Z)}}}A(C,ge.linkType==="SOFT"?ge.target:he,ve)}},p=a({name:e.name,reference:Array.from(e.references)[0]},"",[]),h=p.target;return o.set(h,p),A(e,h,""),o};Ke();Ke();bt();bt();_c();_l();var sj={};Yt(sj,{PnpInstaller:()=>Em,PnpLinker:()=>Bh,UnplugCommand:()=>Dh,default:()=>uwt,getPnpPath:()=>vh,jsInstallUtils:()=>CA,pnpUtils:()=>VB,quotePathIfNeeded:()=>S1e});bt();var v1e=tt(si()),D1e=Ie("url");Ke();Ke();bt();bt();var _we={["DEFAULT"]:{collapsed:!1,next:{["*"]:"DEFAULT"}},["TOP_LEVEL"]:{collapsed:!1,next:{fallbackExclusionList:"FALLBACK_EXCLUSION_LIST",packageRegistryData:"PACKAGE_REGISTRY_DATA",["*"]:"DEFAULT"}},["FALLBACK_EXCLUSION_LIST"]:{collapsed:!1,next:{["*"]:"FALLBACK_EXCLUSION_ENTRIES"}},["FALLBACK_EXCLUSION_ENTRIES"]:{collapsed:!0,next:{["*"]:"FALLBACK_EXCLUSION_DATA"}},["FALLBACK_EXCLUSION_DATA"]:{collapsed:!0,next:{["*"]:"DEFAULT"}},["PACKAGE_REGISTRY_DATA"]:{collapsed:!1,next:{["*"]:"PACKAGE_REGISTRY_ENTRIES"}},["PACKAGE_REGISTRY_ENTRIES"]:{collapsed:!0,next:{["*"]:"PACKAGE_STORE_DATA"}},["PACKAGE_STORE_DATA"]:{collapsed:!1,next:{["*"]:"PACKAGE_STORE_ENTRIES"}},["PACKAGE_STORE_ENTRIES"]:{collapsed:!0,next:{["*"]:"PACKAGE_INFORMATION_DATA"}},["PACKAGE_INFORMATION_DATA"]:{collapsed:!1,next:{packageDependencies:"PACKAGE_DEPENDENCIES",["*"]:"DEFAULT"}},["PACKAGE_DEPENDENCIES"]:{collapsed:!1,next:{["*"]:"PACKAGE_DEPENDENCY"}},["PACKAGE_DEPENDENCY"]:{collapsed:!0,next:{["*"]:"DEFAULT"}}};function TIt(t,e,r){let o="";o+="[";for(let a=0,n=t.length;a"u"||(A!==0&&(a+=", "),a+=JSON.stringify(p),a+=": ",a+=Ak(p,h,e,r).replace(/^ +/g,""),A+=1)}return a+="}",a}function OIt(t,e,r){let o=Object.keys(t),a=`${r} `,n="";n+=r,n+=`{ +`;let u=0;for(let A=0,p=o.length;A"u"||(u!==0&&(n+=",",n+=` +`),n+=a,n+=JSON.stringify(h),n+=": ",n+=Ak(h,E,e,a).replace(/^ +/g,""),u+=1)}return u!==0&&(n+=` +`),n+=r,n+="}",n}function Ak(t,e,r,o){let{next:a}=_we[r],n=a[t]||a["*"];return Hwe(e,n,o)}function Hwe(t,e,r){let{collapsed:o}=_we[e];return Array.isArray(t)?o?TIt(t,e,r):NIt(t,e,r):typeof t=="object"&&t!==null?o?LIt(t,e,r):OIt(t,e,r):JSON.stringify(t)}function qwe(t){return Hwe(t,"TOP_LEVEL","")}function OB(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let o=[];for(let n of e)o.push(r.map(u=>n(u)));let a=r.map((n,u)=>u);return a.sort((n,u)=>{for(let A of o){let p=A[n]A[u]?1:0;if(p!==0)return p}return 0}),a.map(n=>r[n])}function MIt(t){let e=new Map,r=OB(t.fallbackExclusionList||[],[({name:o,reference:a})=>o,({name:o,reference:a})=>a]);for(let{name:o,reference:a}of r){let n=e.get(o);typeof n>"u"&&e.set(o,n=new Set),n.add(a)}return Array.from(e).map(([o,a])=>[o,Array.from(a)])}function UIt(t){return OB(t.fallbackPool||[],([e])=>e)}function _It(t){let e=[];for(let[r,o]of OB(t.packageRegistry,([a])=>a===null?"0":`1${a}`)){let a=[];e.push([r,a]);for(let[n,{packageLocation:u,packageDependencies:A,packagePeers:p,linkType:h,discardFromLookup:E}]of OB(o,([w])=>w===null?"0":`1${w}`)){let w=[];r!==null&&n!==null&&!A.has(r)&&w.push([r,n]);for(let[C,R]of OB(A.entries(),([L])=>L))w.push([C,R]);let v=p&&p.size>0?Array.from(p):void 0,b=E||void 0;a.push([n,{packageLocation:u,packageDependencies:w,packagePeers:v,linkType:h,discardFromLookup:b}])}}return e}function MB(t){return{__info:["This file is automatically generated. Do not touch it, or risk","your modifications being lost."],dependencyTreeRoots:t.dependencyTreeRoots,enableTopLevelFallback:t.enableTopLevelFallback||!1,ignorePatternData:t.ignorePattern||null,fallbackExclusionList:MIt(t),fallbackPool:UIt(t),packageRegistryData:_It(t)}}var Wwe=tt(Gwe());function Ywe(t,e){return[t?`${t} +`:"",`/* eslint-disable */ +`,`"use strict"; +`,` +`,e,` +`,(0,Wwe.default)()].join("")}function HIt(t){return JSON.stringify(t,null,2)}function qIt(t){return`'${t.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,`\\ +`)}'`}function jIt(t){return[`const RAW_RUNTIME_STATE = +`,`${qIt(qwe(t))}; + +`,`function $$SETUP_STATE(hydrateRuntimeState, basePath) { +`,` return hydrateRuntimeState(JSON.parse(RAW_RUNTIME_STATE), {basePath: basePath || __dirname}); +`,`} +`].join("")}function GIt(){return[`function $$SETUP_STATE(hydrateRuntimeState, basePath) { +`,` return hydrateRuntimeState(require(${JSON.stringify(`./${Lr.pnpData}`)}), {basePath: basePath || __dirname}); +`,`} +`].join("")}function Kwe(t){let e=MB(t),r=jIt(e);return Ywe(t.shebang,r)}function Vwe(t){let e=MB(t),r=GIt(),o=Ywe(t.shebang,r);return{dataFile:HIt(e),loaderFile:o}}bt();function qq(t,{basePath:e}){let r=ue.toPortablePath(e),o=z.resolve(r),a=t.ignorePatternData!==null?new RegExp(t.ignorePatternData):null,n=new Map,u=new Map(t.packageRegistryData.map(([w,v])=>[w,new Map(v.map(([b,C])=>{if(w===null!=(b===null))throw new Error("Assertion failed: The name and reference should be null, or neither should");let R=C.discardFromLookup??!1,L={name:w,reference:b},_=n.get(C.packageLocation);_?(_.discardFromLookup=_.discardFromLookup&&R,R||(_.locator=L)):n.set(C.packageLocation,{locator:L,discardFromLookup:R});let V=null;return[b,{packageDependencies:new Map(C.packageDependencies),packagePeers:new Set(C.packagePeers),linkType:C.linkType,discardFromLookup:R,get packageLocation(){return V||(V=z.join(o,C.packageLocation))}}]}))])),A=new Map(t.fallbackExclusionList.map(([w,v])=>[w,new Set(v)])),p=new Map(t.fallbackPool),h=t.dependencyTreeRoots,E=t.enableTopLevelFallback;return{basePath:r,dependencyTreeRoots:h,enableTopLevelFallback:E,fallbackExclusionList:A,fallbackPool:p,ignorePattern:a,packageLocatorsByLocations:n,packageRegistry:u}}bt();bt();var YB=Ie("module"),Cm=Ie("url"),Zq=Ie("util");var No=Ie("url");var Zwe=tt(Ie("assert"));var jq=Array.isArray,UB=JSON.stringify,_B=Object.getOwnPropertyNames,mm=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),Gq=(t,e)=>RegExp.prototype.exec.call(t,e),Wq=(t,...e)=>RegExp.prototype[Symbol.replace].apply(t,e),Ih=(t,...e)=>String.prototype.endsWith.apply(t,e),Yq=(t,...e)=>String.prototype.includes.apply(t,e),Kq=(t,...e)=>String.prototype.lastIndexOf.apply(t,e),HB=(t,...e)=>String.prototype.indexOf.apply(t,e),Jwe=(t,...e)=>String.prototype.replace.apply(t,e),wh=(t,...e)=>String.prototype.slice.apply(t,e),yA=(t,...e)=>String.prototype.startsWith.apply(t,e),zwe=Map,Xwe=JSON.parse;function qB(t,e,r){return class extends r{constructor(...o){super(e(...o)),this.code=t,this.name=`${r.name} [${t}]`}}}var $we=qB("ERR_PACKAGE_IMPORT_NOT_DEFINED",(t,e,r)=>`Package import specifier "${t}" is not defined${e?` in package ${e}package.json`:""} imported from ${r}`,TypeError),Vq=qB("ERR_INVALID_MODULE_SPECIFIER",(t,e,r=void 0)=>`Invalid module "${t}" ${e}${r?` imported from ${r}`:""}`,TypeError),e1e=qB("ERR_INVALID_PACKAGE_TARGET",(t,e,r,o=!1,a=void 0)=>{let n=typeof r=="string"&&!o&&r.length&&!yA(r,"./");return e==="."?((0,Zwe.default)(o===!1),`Invalid "exports" main target ${UB(r)} defined in the package config ${t}package.json${a?` imported from ${a}`:""}${n?'; targets must start with "./"':""}`):`Invalid "${o?"imports":"exports"}" target ${UB(r)} defined for '${e}' in the package config ${t}package.json${a?` imported from ${a}`:""}${n?'; targets must start with "./"':""}`},Error),jB=qB("ERR_INVALID_PACKAGE_CONFIG",(t,e,r)=>`Invalid package config ${t}${e?` while importing ${e}`:""}${r?`. ${r}`:""}`,Error),t1e=qB("ERR_PACKAGE_PATH_NOT_EXPORTED",(t,e,r=void 0)=>e==="."?`No "exports" main defined in ${t}package.json${r?` imported from ${r}`:""}`:`Package subpath '${e}' is not defined by "exports" in ${t}package.json${r?` imported from ${r}`:""}`,Error);var pk=Ie("url");function r1e(t,e){let r=Object.create(null);for(let o=0;oe):t+e}GB(r,t,o,u,a)}Gq(i1e,wh(t,2))!==null&&GB(r,t,o,u,a);let p=new URL(t,o),h=p.pathname,E=new URL(".",o).pathname;if(yA(h,E)||GB(r,t,o,u,a),e==="")return p;if(Gq(i1e,e)!==null){let w=n?Jwe(r,"*",()=>e):r+e;KIt(w,o,u,a)}return n?new URL(Wq(s1e,p.href,()=>e)):new URL(e,p)}function JIt(t){let e=+t;return`${e}`!==t?!1:e>=0&&e<4294967295}function ME(t,e,r,o,a,n,u,A){if(typeof e=="string")return VIt(e,r,o,t,a,n,u,A);if(jq(e)){if(e.length===0)return null;let p;for(let h=0;hn?-1:n>a||r===-1?1:o===-1||t.length>e.length?-1:e.length>t.length?1:0}function zIt(t,e,r){if(typeof t=="string"||jq(t))return!0;if(typeof t!="object"||t===null)return!1;let o=_B(t),a=!1,n=0;for(let u=0;u=h.length&&Ih(e,w)&&a1e(n,h)===1&&Kq(h,"*")===E&&(n=h,u=wh(e,E,e.length-w.length))}}if(n){let p=r[n],h=ME(t,p,u,n,o,!0,!1,a);return h==null&&Jq(e,t,o),h}Jq(e,t,o)}function c1e({name:t,base:e,conditions:r,readFileSyncFn:o}){if(t==="#"||yA(t,"#/")||Ih(t,"/")){let u="is not a valid internal imports specifier name";throw new Vq(t,u,(0,No.fileURLToPath)(e))}let a,n=n1e(e,o);if(n.exists){a=(0,No.pathToFileURL)(n.pjsonPath);let u=n.imports;if(u)if(mm(u,t)&&!Yq(t,"*")){let A=ME(a,u[t],"",t,e,!1,!0,r);if(A!=null)return A}else{let A="",p,h=_B(u);for(let E=0;E=w.length&&Ih(t,b)&&a1e(A,w)===1&&Kq(w,"*")===v&&(A=w,p=wh(t,v,t.length-b.length))}}if(A){let E=u[A],w=ME(a,E,p,A,e,!0,!0,r);if(w!=null)return w}}}YIt(t,a,e)}bt();var ZIt=new Set(["BUILTIN_NODE_RESOLUTION_FAILED","MISSING_DEPENDENCY","MISSING_PEER_DEPENDENCY","QUALIFIED_PATH_RESOLUTION_FAILED","UNDECLARED_DEPENDENCY"]);function Xi(t,e,r={},o){o??(o=ZIt.has(t)?"MODULE_NOT_FOUND":t);let a={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(e),{code:{...a,value:o},pnpCode:{...a,value:t},data:{...a,value:r}})}function Au(t){return ue.normalize(ue.fromPortablePath(t))}var p1e=tt(A1e());function h1e(t){return $It(),Xq[t]}var Xq;function $It(){Xq||(Xq={"--conditions":[],...f1e(ewt()),...f1e(process.execArgv)})}function f1e(t){return(0,p1e.default)({"--conditions":[String],"-C":"--conditions"},{argv:t,permissive:!0})}function ewt(){let t=[],e=twt(process.env.NODE_OPTIONS||"",t);return t.length,e}function twt(t,e){let r=[],o=!1,a=!0;for(let n=0;nparseInt(t,10)),DJt=fu>16||fu===16&&ym>=12,SJt=fu>17||fu===17&&ym>=5||fu===16&&ym>=15,PJt=fu>17||fu===17&&ym>=1||fu===16&&ym>14,g1e=fu>19||fu===19&&ym>=2||fu===18&&ym>=13;var rwt=new Set(d1e.Module.builtinModules||Object.keys(process.binding("natives"))),hk=t=>t.startsWith("node:")||rwt.has(t);function m1e(t){if(process.env.WATCH_REPORT_DEPENDENCIES&&process.send)if(t=t.map(e=>ue.fromPortablePath(pi.resolveVirtual(ue.toPortablePath(e)))),g1e)process.send({"watch:require":t});else for(let e of t)process.send({"watch:require":e})}function $q(t,e){let r=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,o=Number(process.env.PNP_DEBUG_LEVEL),a=/^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/,n=/^(\/|\.{1,2}(\/|$))/,u=/\/$/,A=/^\.{0,2}\//,p={name:null,reference:null},h=[],E=new Set;if(t.enableTopLevelFallback===!0&&h.push(p),e.compatibilityMode!==!1)for(let Me of["react-scripts","gatsby"]){let Te=t.packageRegistry.get(Me);if(Te)for(let Qe of Te.keys()){if(Qe===null)throw new Error("Assertion failed: This reference shouldn't be null");h.push({name:Me,reference:Qe})}}let{ignorePattern:w,packageRegistry:v,packageLocatorsByLocations:b}=t;function C(Me,Te){return{fn:Me,args:Te,error:null,result:null}}function R(Me){var At,Oe,x,I;let Te=((Oe=(At=process.stderr)==null?void 0:At.hasColors)==null?void 0:Oe.call(At))??process.stdout.isTTY,Qe=(P,y)=>`\x1B[${P}m${y}\x1B[0m`,_e=Me.error;console.error(_e?Qe("31;1",`\u2716 ${(x=Me.error)==null?void 0:x.message.replace(/\n.*/s,"")}`):Qe("33;1","\u203C Resolution")),Me.args.length>0&&console.error();for(let P of Me.args)console.error(` ${Qe("37;1","In \u2190")} ${(0,Zq.inspect)(P,{colors:Te,compact:!0})}`);Me.result&&(console.error(),console.error(` ${Qe("37;1","Out \u2192")} ${(0,Zq.inspect)(Me.result,{colors:Te,compact:!0})}`));let qe=((I=new Error().stack.match(/(?<=^ +)at.*/gm))==null?void 0:I.slice(2))??[];if(qe.length>0){console.error();for(let P of qe)console.error(` ${Qe("38;5;244",P)}`)}console.error()}function L(Me,Te){if(e.allowDebug===!1)return Te;if(Number.isFinite(o)){if(o>=2)return(...Qe)=>{let _e=C(Me,Qe);try{return _e.result=Te(...Qe)}catch(qe){throw _e.error=qe}finally{R(_e)}};if(o>=1)return(...Qe)=>{try{return Te(...Qe)}catch(_e){let qe=C(Me,Qe);throw qe.error=_e,R(qe),_e}}}return Te}function _(Me){let Te=g(Me);if(!Te)throw Xi("INTERNAL","Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)");return Te}function V(Me){if(Me.name===null)return!0;for(let Te of t.dependencyTreeRoots)if(Te.name===Me.name&&Te.reference===Me.reference)return!0;return!1}let re=new Set(["node","require",...h1e("--conditions")]);function oe(Me,Te=re,Qe){let _e=de(z.join(Me,"internal.js"),{resolveIgnored:!0,includeDiscardFromLookup:!0});if(_e===null)throw Xi("INTERNAL",`The locator that owns the "${Me}" path can't be found inside the dependency tree (this is probably an internal error)`);let{packageLocation:qe}=_(_e),At=z.join(qe,Lr.manifest);if(!e.fakeFs.existsSync(At))return null;let Oe=JSON.parse(e.fakeFs.readFileSync(At,"utf8"));if(Oe.exports==null)return null;let x=z.contains(qe,Me);if(x===null)throw Xi("INTERNAL","unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)");x!=="."&&!A.test(x)&&(x=`./${x}`);try{let I=l1e({packageJSONUrl:(0,Cm.pathToFileURL)(ue.fromPortablePath(At)),packageSubpath:x,exports:Oe.exports,base:Qe?(0,Cm.pathToFileURL)(ue.fromPortablePath(Qe)):null,conditions:Te});return ue.toPortablePath((0,Cm.fileURLToPath)(I))}catch(I){throw Xi("EXPORTS_RESOLUTION_FAILED",I.message,{unqualifiedPath:Au(Me),locator:_e,pkgJson:Oe,subpath:Au(x),conditions:Te},I.code)}}function pe(Me,Te,{extensions:Qe}){let _e;try{Te.push(Me),_e=e.fakeFs.statSync(Me)}catch{}if(_e&&!_e.isDirectory())return e.fakeFs.realpathSync(Me);if(_e&&_e.isDirectory()){let qe;try{qe=JSON.parse(e.fakeFs.readFileSync(z.join(Me,Lr.manifest),"utf8"))}catch{}let At;if(qe&&qe.main&&(At=z.resolve(Me,qe.main)),At&&At!==Me){let Oe=pe(At,Te,{extensions:Qe});if(Oe!==null)return Oe}}for(let qe=0,At=Qe.length;qe{let x=JSON.stringify(Oe.name);if(_e.has(x))return;_e.add(x);let I=De(Oe);for(let P of I)if(_(P).packagePeers.has(Me))qe(P);else{let F=Qe.get(P.name);typeof F>"u"&&Qe.set(P.name,F=new Set),F.add(P.reference)}};qe(Te);let At=[];for(let Oe of[...Qe.keys()].sort())for(let x of[...Qe.get(Oe)].sort())At.push({name:Oe,reference:x});return At}function de(Me,{resolveIgnored:Te=!1,includeDiscardFromLookup:Qe=!1}={}){if(ge(Me)&&!Te)return null;let _e=z.relative(t.basePath,Me);_e.match(n)||(_e=`./${_e}`),_e.endsWith("/")||(_e=`${_e}/`);do{let qe=b.get(_e);if(typeof qe>"u"||qe.discardFromLookup&&!Qe){_e=_e.substring(0,_e.lastIndexOf("/",_e.length-2)+1);continue}return qe.locator}while(_e!=="");return null}function ne(Me){try{return e.fakeFs.readFileSync(ue.toPortablePath(Me),"utf8")}catch(Te){if(Te.code==="ENOENT")return;throw Te}}function Z(Me,Te,{considerBuiltins:Qe=!0}={}){if(Me.startsWith("#"))throw new Error("resolveToUnqualified can not handle private import mappings");if(Me==="pnpapi")return ue.toPortablePath(e.pnpapiResolution);if(Qe&&hk(Me))return null;let _e=Au(Me),qe=Te&&Au(Te);if(Te&&ge(Te)&&(!z.isAbsolute(Me)||de(Me)===null)){let x=ve(Me,Te);if(x===!1)throw Xi("BUILTIN_NODE_RESOLUTION_FAILED",`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp) + +Require request: "${_e}" +Required by: ${qe} +`,{request:_e,issuer:qe});return ue.toPortablePath(x)}let At,Oe=Me.match(a);if(Oe){if(!Te)throw Xi("API_ERROR","The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:_e,issuer:qe});let[,x,I]=Oe,P=de(Te);if(!P){let Ne=ve(Me,Te);if(Ne===!1)throw Xi("BUILTIN_NODE_RESOLUTION_FAILED",`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree). + +Require path: "${_e}" +Required by: ${qe} +`,{request:_e,issuer:qe});return ue.toPortablePath(Ne)}let F=_(P).packageDependencies.get(x),J=null;if(F==null&&P.name!==null){let Ne=t.fallbackExclusionList.get(P.name);if(!Ne||!Ne.has(P.reference)){for(let ht=0,Ut=h.length;htV(st))?X=Xi("MISSING_PEER_DEPENDENCY",`${P.name} tried to access ${x} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound. + +Required package: ${x}${x!==_e?` (via "${_e}")`:""} +Required by: ${P.name}@${P.reference} (via ${qe}) +${Ne.map(st=>`Ancestor breaking the chain: ${st.name}@${st.reference} +`).join("")} +`,{request:_e,issuer:qe,issuerLocator:Object.assign({},P),dependencyName:x,brokenAncestors:Ne}):X=Xi("MISSING_PEER_DEPENDENCY",`${P.name} tried to access ${x} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound. + +Required package: ${x}${x!==_e?` (via "${_e}")`:""} +Required by: ${P.name}@${P.reference} (via ${qe}) + +${Ne.map(st=>`Ancestor breaking the chain: ${st.name}@${st.reference} +`).join("")} +`,{request:_e,issuer:qe,issuerLocator:Object.assign({},P),dependencyName:x,brokenAncestors:Ne})}else F===void 0&&(!Qe&&hk(Me)?V(P)?X=Xi("UNDECLARED_DEPENDENCY",`Your application tried to access ${x}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${x} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound. + +Required package: ${x}${x!==_e?` (via "${_e}")`:""} +Required by: ${qe} +`,{request:_e,issuer:qe,dependencyName:x}):X=Xi("UNDECLARED_DEPENDENCY",`${P.name} tried to access ${x}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${x} isn't otherwise declared in ${P.name}'s dependencies, this makes the require call ambiguous and unsound. + +Required package: ${x}${x!==_e?` (via "${_e}")`:""} +Required by: ${qe} +`,{request:_e,issuer:qe,issuerLocator:Object.assign({},P),dependencyName:x}):V(P)?X=Xi("UNDECLARED_DEPENDENCY",`Your application tried to access ${x}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound. + +Required package: ${x}${x!==_e?` (via "${_e}")`:""} +Required by: ${qe} +`,{request:_e,issuer:qe,dependencyName:x}):X=Xi("UNDECLARED_DEPENDENCY",`${P.name} tried to access ${x}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound. + +Required package: ${x}${x!==_e?` (via "${_e}")`:""} +Required by: ${P.name}@${P.reference} (via ${qe}) +`,{request:_e,issuer:qe,issuerLocator:Object.assign({},P),dependencyName:x}));if(F==null){if(J===null||X===null)throw X||new Error("Assertion failed: Expected an error to have been set");F=J;let Ne=X.message.replace(/\n.*/g,"");X.message=Ne,!E.has(Ne)&&o!==0&&(E.add(Ne),process.emitWarning(X))}let $=Array.isArray(F)?{name:F[0],reference:F[1]}:{name:x,reference:F},ie=_($);if(!ie.packageLocation)throw Xi("MISSING_DEPENDENCY",`A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod. + +Required package: ${$.name}@${$.reference}${$.name!==_e?` (via "${_e}")`:""} +Required by: ${P.name}@${P.reference} (via ${qe}) +`,{request:_e,issuer:qe,dependencyLocator:Object.assign({},$)});let ke=ie.packageLocation;I?At=z.join(ke,I):At=ke}else if(z.isAbsolute(Me))At=z.normalize(Me);else{if(!Te)throw Xi("API_ERROR","The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:_e,issuer:qe});let x=z.resolve(Te);Te.match(u)?At=z.normalize(z.join(x,Me)):At=z.normalize(z.join(z.dirname(x),Me))}return z.normalize(At)}function me(Me,Te,Qe=re,_e){if(n.test(Me))return Te;let qe=oe(Te,Qe,_e);return qe?z.normalize(qe):Te}function be(Me,{extensions:Te=Object.keys(YB.Module._extensions)}={}){let Qe=[],_e=pe(Me,Qe,{extensions:Te});if(_e)return z.normalize(_e);{m1e(Qe.map(Oe=>ue.fromPortablePath(Oe)));let qe=Au(Me),At=de(Me);if(At){let{packageLocation:Oe}=_(At),x=!0;try{e.fakeFs.accessSync(Oe)}catch(I){if((I==null?void 0:I.code)==="ENOENT")x=!1;else{let P=((I==null?void 0:I.message)??I??"empty exception thrown").replace(/^[A-Z]/,y=>y.toLowerCase());throw Xi("QUALIFIED_PATH_RESOLUTION_FAILED",`Required package exists but could not be accessed (${P}). + +Missing package: ${At.name}@${At.reference} +Expected package location: ${Au(Oe)} +`,{unqualifiedPath:qe,extensions:Te})}}if(!x){let I=Oe.includes("/unplugged/")?"Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).":"Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.";throw Xi("QUALIFIED_PATH_RESOLUTION_FAILED",`${I} + +Missing package: ${At.name}@${At.reference} +Expected package location: ${Au(Oe)} +`,{unqualifiedPath:qe,extensions:Te})}}throw Xi("QUALIFIED_PATH_RESOLUTION_FAILED",`Qualified path resolution failed: we looked for the following paths, but none could be accessed. + +Source path: ${qe} +${Qe.map(Oe=>`Not found: ${Au(Oe)} +`).join("")}`,{unqualifiedPath:qe,extensions:Te})}}function ut(Me,Te,Qe){if(!Te)throw new Error("Assertion failed: An issuer is required to resolve private import mappings");let _e=c1e({name:Me,base:(0,Cm.pathToFileURL)(ue.fromPortablePath(Te)),conditions:Qe.conditions??re,readFileSyncFn:ne});if(_e instanceof URL)return be(ue.toPortablePath((0,Cm.fileURLToPath)(_e)),{extensions:Qe.extensions});if(_e.startsWith("#"))throw new Error("Mapping from one private import to another isn't allowed");return H(_e,Te,Qe)}function H(Me,Te,Qe={}){try{if(Me.startsWith("#"))return ut(Me,Te,Qe);let{considerBuiltins:_e,extensions:qe,conditions:At}=Qe,Oe=Z(Me,Te,{considerBuiltins:_e});if(Me==="pnpapi")return Oe;if(Oe===null)return null;let x=()=>Te!==null?ge(Te):!1,I=(!_e||!hk(Me))&&!x()?me(Me,Oe,At,Te):Oe;return be(I,{extensions:qe})}catch(_e){throw Object.prototype.hasOwnProperty.call(_e,"pnpCode")&&Object.assign(_e.data,{request:Au(Me),issuer:Te&&Au(Te)}),_e}}function yt(Me){let Te=z.normalize(Me),Qe=pi.resolveVirtual(Te);return Qe!==Te?Qe:null}return{VERSIONS:le,topLevel:Pe,getLocator:(Me,Te)=>Array.isArray(Te)?{name:Te[0],reference:Te[1]}:{name:Me,reference:Te},getDependencyTreeRoots:()=>[...t.dependencyTreeRoots],getAllLocators(){let Me=[];for(let[Te,Qe]of v)for(let _e of Qe.keys())Te!==null&&_e!==null&&Me.push({name:Te,reference:_e});return Me},getPackageInformation:Me=>{let Te=g(Me);if(Te===null)return null;let Qe=ue.fromPortablePath(Te.packageLocation);return{...Te,packageLocation:Qe}},findPackageLocator:Me=>de(ue.toPortablePath(Me)),resolveToUnqualified:L("resolveToUnqualified",(Me,Te,Qe)=>{let _e=Te!==null?ue.toPortablePath(Te):null,qe=Z(ue.toPortablePath(Me),_e,Qe);return qe===null?null:ue.fromPortablePath(qe)}),resolveUnqualified:L("resolveUnqualified",(Me,Te)=>ue.fromPortablePath(be(ue.toPortablePath(Me),Te))),resolveRequest:L("resolveRequest",(Me,Te,Qe)=>{let _e=Te!==null?ue.toPortablePath(Te):null,qe=H(ue.toPortablePath(Me),_e,Qe);return qe===null?null:ue.fromPortablePath(qe)}),resolveVirtual:L("resolveVirtual",Me=>{let Te=yt(ue.toPortablePath(Me));return Te!==null?ue.fromPortablePath(Te):null})}}bt();var y1e=(t,e,r)=>{let o=MB(t),a=qq(o,{basePath:e}),n=ue.join(e,Lr.pnpCjs);return $q(a,{fakeFs:r,pnpapiResolution:n})};var tj=tt(E1e());_t();var CA={};Yt(CA,{checkAndReportManifestCompatibility:()=>w1e,checkManifestCompatibility:()=>I1e,extractBuildScripts:()=>gk,getExtractHint:()=>rj,hasBindingGyp:()=>nj});Ke();bt();function I1e(t){return Y.isPackageCompatible(t,As.getArchitectureSet())}function w1e(t,e,{configuration:r,report:o}){return I1e(t)?!0:(o==null||o.reportWarningOnce(76,`${Y.prettyLocator(r,t)} The ${As.getArchitectureName()} architecture is incompatible with this package, ${e} skipped.`),!1)}function gk(t,e,r,{configuration:o,report:a}){let n=[];for(let A of["preinstall","install","postinstall"])e.manifest.scripts.has(A)&&n.push([0,A]);return!e.manifest.scripts.has("install")&&e.misc.hasBindingGyp&&n.push([1,"node-gyp rebuild"]),n.length===0?[]:t.linkType!=="HARD"?(a==null||a.reportWarningOnce(6,`${Y.prettyLocator(o,t)} lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored.`),[]):r&&r.built===!1?(a==null||a.reportInfoOnce(5,`${Y.prettyLocator(o,t)} lists build scripts, but its build has been explicitly disabled through configuration.`),[]):!o.get("enableScripts")&&!r.built?(a==null||a.reportWarningOnce(4,`${Y.prettyLocator(o,t)} lists build scripts, but all build scripts have been disabled.`),[]):w1e(t,"build",{configuration:o,report:a})?n:[]}var iwt=new Set([".exe",".h",".hh",".hpp",".c",".cc",".cpp",".java",".jar",".node"]);function rj(t){return t.packageFs.getExtractHint({relevantExtensions:iwt})}function nj(t){let e=z.join(t.prefixPath,"binding.gyp");return t.packageFs.existsSync(e)}var VB={};Yt(VB,{getUnpluggedPath:()=>KB});Ke();bt();function KB(t,{configuration:e}){return z.resolve(e.get("pnpUnpluggedFolder"),Y.slugifyLocator(t))}var swt=new Set([Y.makeIdent(null,"open").identHash,Y.makeIdent(null,"opn").identHash]),Bh=class{constructor(){this.mode="strict";this.pnpCache=new Map}getCustomDataKey(){return JSON.stringify({name:"PnpLinker",version:2})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the PnP linker to be enabled");let o=vh(r.project).cjs;if(!ae.existsSync(o))throw new ot(`The project in ${ye.pretty(r.project.configuration,`${r.project.cwd}/package.json`,ye.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let a=Ye.getFactoryWithDefault(this.pnpCache,o,()=>Ye.dynamicRequire(o,{cachingStrategy:Ye.CachingStrategy.FsTime})),n={name:Y.stringifyIdent(e),reference:e.reference},u=a.getPackageInformation(n);if(!u)throw new ot(`Couldn't find ${Y.prettyLocator(r.project.configuration,e)} in the currently installed PnP map - running an install might help`);return ue.toPortablePath(u.packageLocation)}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let o=vh(r.project).cjs;if(!ae.existsSync(o))return null;let n=Ye.getFactoryWithDefault(this.pnpCache,o,()=>Ye.dynamicRequire(o,{cachingStrategy:Ye.CachingStrategy.FsTime})).findPackageLocator(ue.fromPortablePath(e));return n?Y.makeLocator(Y.parseIdent(n.name),n.reference):null}makeInstaller(e){return new Em(e)}isEnabled(e){return!(e.project.configuration.get("nodeLinker")!=="pnp"||e.project.configuration.get("pnpMode")!==this.mode)}},Em=class{constructor(e){this.opts=e;this.mode="strict";this.asyncActions=new Ye.AsyncActions(10);this.packageRegistry=new Map;this.virtualTemplates=new Map;this.isESMLoaderRequired=!1;this.customData={store:new Map};this.unpluggedPaths=new Set;this.opts=e}attachCustomData(e){this.customData=e}async installPackage(e,r,o){let a=Y.stringifyIdent(e),n=e.reference,u=!!this.opts.project.tryWorkspaceByLocator(e),A=Y.isVirtualLocator(e),p=e.peerDependencies.size>0&&!A,h=!p&&!u,E=!p&&e.linkType!=="SOFT",w,v;if(h||E){let re=A?Y.devirtualizeLocator(e):e;w=this.customData.store.get(re.locatorHash),typeof w>"u"&&(w=await owt(r),e.linkType==="HARD"&&this.customData.store.set(re.locatorHash,w)),w.manifest.type==="module"&&(this.isESMLoaderRequired=!0),v=this.opts.project.getDependencyMeta(re,e.version)}let b=h?gk(e,w,v,{configuration:this.opts.project.configuration,report:this.opts.report}):[],C=E?await this.unplugPackageIfNeeded(e,w,r,v,o):r.packageFs;if(z.isAbsolute(r.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${r.prefixPath}) to be relative to the parent`);let R=z.resolve(C.getRealPath(),r.prefixPath),L=ij(this.opts.project.cwd,R),_=new Map,V=new Set;if(A){for(let re of e.peerDependencies.values())_.set(Y.stringifyIdent(re),null),V.add(Y.stringifyIdent(re));if(!u){let re=Y.devirtualizeLocator(e);this.virtualTemplates.set(re.locatorHash,{location:ij(this.opts.project.cwd,pi.resolveVirtual(R)),locator:re})}}return Ye.getMapWithDefault(this.packageRegistry,a).set(n,{packageLocation:L,packageDependencies:_,packagePeers:V,linkType:e.linkType,discardFromLookup:r.discardFromLookup||!1}),{packageLocation:R,buildDirective:b.length>0?b:null}}async attachInternalDependencies(e,r){let o=this.getPackageInformation(e);for(let[a,n]of r){let u=Y.areIdentsEqual(a,n)?n.reference:[Y.stringifyIdent(n),n.reference];o.packageDependencies.set(Y.stringifyIdent(a),u)}}async attachExternalDependents(e,r){for(let o of r)this.getDiskInformation(o).packageDependencies.set(Y.stringifyIdent(e),e.reference)}async finalizeInstall(){if(this.opts.project.configuration.get("pnpMode")!==this.mode)return;let e=vh(this.opts.project);if(this.isEsmEnabled()||await ae.removePromise(e.esmLoader),this.opts.project.configuration.get("nodeLinker")!=="pnp"){await ae.removePromise(e.cjs),await ae.removePromise(e.data),await ae.removePromise(e.esmLoader),await ae.removePromise(this.opts.project.configuration.get("pnpUnpluggedFolder"));return}for(let{locator:E,location:w}of this.virtualTemplates.values())Ye.getMapWithDefault(this.packageRegistry,Y.stringifyIdent(E)).set(E.reference,{packageLocation:w,packageDependencies:new Map,packagePeers:new Set,linkType:"SOFT",discardFromLookup:!1});this.packageRegistry.set(null,new Map([[null,this.getPackageInformation(this.opts.project.topLevelWorkspace.anchoredLocator)]]));let r=this.opts.project.configuration.get("pnpFallbackMode"),o=this.opts.project.workspaces.map(({anchoredLocator:E})=>({name:Y.stringifyIdent(E),reference:E.reference})),a=r!=="none",n=[],u=new Map,A=Ye.buildIgnorePattern([".yarn/sdks/**",...this.opts.project.configuration.get("pnpIgnorePatterns")]),p=this.packageRegistry,h=this.opts.project.configuration.get("pnpShebang");if(r==="dependencies-only")for(let E of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(E)&&n.push({name:Y.stringifyIdent(E),reference:E.reference});return await this.asyncActions.wait(),await this.finalizeInstallWithPnp({dependencyTreeRoots:o,enableTopLevelFallback:a,fallbackExclusionList:n,fallbackPool:u,ignorePattern:A,packageRegistry:p,shebang:h}),{customData:this.customData}}async transformPnpSettings(e){}isEsmEnabled(){if(this.opts.project.configuration.sources.has("pnpEnableEsmLoader"))return this.opts.project.configuration.get("pnpEnableEsmLoader");if(this.isESMLoaderRequired)return!0;for(let e of this.opts.project.workspaces)if(e.manifest.type==="module")return!0;return!1}async finalizeInstallWithPnp(e){let r=vh(this.opts.project),o=await this.locateNodeModules(e.ignorePattern);if(o.length>0){this.opts.report.reportWarning(31,"One or more node_modules have been detected and will be removed. This operation may take some time.");for(let n of o)await ae.removePromise(n)}if(await this.transformPnpSettings(e),this.opts.project.configuration.get("pnpEnableInlining")){let n=Kwe(e);await ae.changeFilePromise(r.cjs,n,{automaticNewlines:!0,mode:493}),await ae.removePromise(r.data)}else{let{dataFile:n,loaderFile:u}=Vwe(e);await ae.changeFilePromise(r.cjs,u,{automaticNewlines:!0,mode:493}),await ae.changeFilePromise(r.data,n,{automaticNewlines:!0,mode:420})}this.isEsmEnabled()&&(this.opts.report.reportWarning(0,"ESM support for PnP uses the experimental loader API and is therefore experimental"),await ae.changeFilePromise(r.esmLoader,(0,tj.default)(),{automaticNewlines:!0,mode:420}));let a=this.opts.project.configuration.get("pnpUnpluggedFolder");if(this.unpluggedPaths.size===0)await ae.removePromise(a);else for(let n of await ae.readdirPromise(a)){let u=z.resolve(a,n);this.unpluggedPaths.has(u)||await ae.removePromise(u)}}async locateNodeModules(e){let r=[],o=e?new RegExp(e):null;for(let a of this.opts.project.workspaces){let n=z.join(a.cwd,"node_modules");if(o&&o.test(z.relative(this.opts.project.cwd,a.cwd))||!ae.existsSync(n))continue;let u=await ae.readdirPromise(n,{withFileTypes:!0}),A=u.filter(p=>!p.isDirectory()||p.name===".bin"||!p.name.startsWith("."));if(A.length===u.length)r.push(n);else for(let p of A)r.push(z.join(n,p.name))}return r}async unplugPackageIfNeeded(e,r,o,a,n){return this.shouldBeUnplugged(e,r,a)?this.unplugPackage(e,o,n):o.packageFs}shouldBeUnplugged(e,r,o){return typeof o.unplugged<"u"?o.unplugged:swt.has(e.identHash)||e.conditions!=null?!0:r.manifest.preferUnplugged!==null?r.manifest.preferUnplugged:!!(gk(e,r,o,{configuration:this.opts.project.configuration}).length>0||r.misc.extractHint)}async unplugPackage(e,r,o){let a=KB(e,{configuration:this.opts.project.configuration});return this.opts.project.disabledLocators.has(e.locatorHash)?new ju(a,{baseFs:r.packageFs,pathUtils:z}):(this.unpluggedPaths.add(a),o.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{let n=z.join(a,r.prefixPath,".ready");await ae.existsPromise(n)||(this.opts.project.storedBuildState.delete(e.locatorHash),await ae.mkdirPromise(a,{recursive:!0}),await ae.copyPromise(a,wt.dot,{baseFs:r.packageFs,overwrite:!1}),await ae.writeFilePromise(n,""))})),new An(a))}getPackageInformation(e){let r=Y.stringifyIdent(e),o=e.reference,a=this.packageRegistry.get(r);if(!a)throw new Error(`Assertion failed: The package information store should have been available (for ${Y.prettyIdent(this.opts.project.configuration,e)})`);let n=a.get(o);if(!n)throw new Error(`Assertion failed: The package information should have been available (for ${Y.prettyLocator(this.opts.project.configuration,e)})`);return n}getDiskInformation(e){let r=Ye.getMapWithDefault(this.packageRegistry,"@@disk"),o=ij(this.opts.project.cwd,e);return Ye.getFactoryWithDefault(r,o,()=>({packageLocation:o,packageDependencies:new Map,packagePeers:new Set,linkType:"SOFT",discardFromLookup:!1}))}};function ij(t,e){let r=z.relative(t,e);return r.match(/^\.{0,2}\//)||(r=`./${r}`),r.replace(/\/?$/,"/")}async function owt(t){let e=await Nt.tryFind(t.prefixPath,{baseFs:t.packageFs})??new Nt,r=new Set(["preinstall","install","postinstall"]);for(let o of e.scripts.keys())r.has(o)||e.scripts.delete(o);return{manifest:{scripts:e.scripts,preferUnplugged:e.preferUnplugged,type:e.type},misc:{extractHint:rj(t),hasBindingGyp:nj(t)}}}Ke();Ke();_t();var B1e=tt(Jo());var Dh=class extends ct{constructor(){super(...arguments);this.all=fe.Boolean("-A,--all",!1,{description:"Unplug direct dependencies from the entire project"});this.recursive=fe.Boolean("-R,--recursive",!1,{description:"Unplug both direct and transitive dependencies"});this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=fe.Rest()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Ur.find(r);if(!a)throw new er(o.cwd,this.context.cwd);if(r.get("nodeLinker")!=="pnp")throw new ot("This command can only be used if the `nodeLinker` option is set to `pnp`");await o.restoreInstallState();let u=new Set(this.patterns),A=this.patterns.map(b=>{let C=Y.parseDescriptor(b),R=C.range!=="unknown"?C:Y.makeDescriptor(C,"*");if(!Tr.validRange(R.range))throw new ot(`The range of the descriptor patterns must be a valid semver range (${Y.prettyDescriptor(r,R)})`);return L=>{let _=Y.stringifyIdent(L);return!B1e.default.isMatch(_,Y.stringifyIdent(R))||L.version&&!Tr.satisfiesWithPrereleases(L.version,R.range)?!1:(u.delete(b),!0)}}),p=()=>{let b=[];for(let C of o.storedPackages.values())!o.tryWorkspaceByLocator(C)&&!Y.isVirtualLocator(C)&&A.some(R=>R(C))&&b.push(C);return b},h=b=>{let C=new Set,R=[],L=(_,V)=>{if(!C.has(_.locatorHash)&&(C.add(_.locatorHash),!o.tryWorkspaceByLocator(_)&&A.some(re=>re(_))&&R.push(_),!(V>0&&!this.recursive)))for(let re of _.dependencies.values()){let oe=o.storedResolutions.get(re.descriptorHash);if(!oe)throw new Error("Assertion failed: The resolution should have been registered");let pe=o.storedPackages.get(oe);if(!pe)throw new Error("Assertion failed: The package should have been registered");L(pe,V+1)}};for(let _ of b)L(_.anchoredPackage,0);return R},E,w;if(this.all&&this.recursive?(E=p(),w="the project"):this.all?(E=h(o.workspaces),w="any workspace"):(E=h([a]),w="this workspace"),u.size>1)throw new ot(`Patterns ${ye.prettyList(r,u,ye.Type.CODE)} don't match any packages referenced by ${w}`);if(u.size>0)throw new ot(`Pattern ${ye.prettyList(r,u,ye.Type.CODE)} doesn't match any packages referenced by ${w}`);return E=Ye.sortMap(E,b=>Y.stringifyLocator(b)),(await Et.start({configuration:r,stdout:this.context.stdout,json:this.json},async b=>{for(let C of E){let R=C.version??"unknown",L=o.topLevelWorkspace.manifest.ensureDependencyMeta(Y.makeDescriptor(C,R));L.unplugged=!0,b.reportInfo(0,`Will unpack ${Y.prettyLocator(r,C)} to ${ye.pretty(r,KB(C,{configuration:r}),ye.Type.PATH)}`),b.reportJson({locator:Y.stringifyLocator(C),version:R})}await o.topLevelWorkspace.persistManifest(),b.reportSeparator(),await o.install({cache:n,report:b})})).exitCode()}};Dh.paths=[["unplug"]],Dh.usage=it.Usage({description:"force the unpacking of a list of packages",details:"\n This command will add the selectors matching the specified patterns to the list of packages that must be unplugged when installed.\n\n A package being unplugged means that instead of being referenced directly through its archive, it will be unpacked at install time in the directory configured via `pnpUnpluggedFolder`. Note that unpacking packages this way is generally not recommended because it'll make it harder to store your packages within the repository. However, it's a good approach to quickly and safely debug some packages, and can even sometimes be required depending on the context (for example when the package contains shellscripts).\n\n Running the command will set a persistent flag inside your top-level `package.json`, in the `dependenciesMeta` field. As such, to undo its effects, you'll need to revert the changes made to the manifest and run `yarn install` to apply the modification.\n\n By default, only direct dependencies from the current workspace are affected. If `-A,--all` is set, direct dependencies from the entire project are affected. Using the `-R,--recursive` flag will affect transitive dependencies as well as direct ones.\n\n This command accepts glob patterns inside the scope and name components (not the range). Make sure to escape the patterns to prevent your own shell from trying to expand them.\n ",examples:[["Unplug the lodash dependency from the active workspace","yarn unplug lodash"],["Unplug all instances of lodash referenced by any workspace","yarn unplug lodash -A"],["Unplug all instances of lodash referenced by the active workspace and its dependencies","yarn unplug lodash -R"],["Unplug all instances of lodash, anywhere","yarn unplug lodash -AR"],["Unplug one specific version of lodash","yarn unplug lodash@1.2.3"],["Unplug all packages with the `@babel` scope","yarn unplug '@babel/*'"],["Unplug all packages (only for testing, not recommended)","yarn unplug -R '*'"]]});var vh=t=>({cjs:z.join(t.cwd,Lr.pnpCjs),data:z.join(t.cwd,Lr.pnpData),esmLoader:z.join(t.cwd,Lr.pnpEsmLoader)}),S1e=t=>/\s/.test(t)?JSON.stringify(t):t;async function awt(t,e,r){let o=vh(t),a=`--require ${S1e(ue.fromPortablePath(o.cjs))}`;if(ae.existsSync(o.esmLoader)&&(a=`${a} --experimental-loader ${(0,D1e.pathToFileURL)(ue.fromPortablePath(o.esmLoader)).href}`),o.cjs.includes(" ")&&v1e.default.lt(process.versions.node,"12.0.0"))throw new Error(`Expected the build location to not include spaces when using Node < 12.0.0 (${process.versions.node})`);if(ae.existsSync(o.cjs)){let n=e.NODE_OPTIONS||"",u=/\s*--require\s+\S*\.pnp\.c?js\s*/g,A=/\s*--experimental-loader\s+\S*\.pnp\.loader\.mjs\s*/;n=n.replace(u," ").replace(A," ").trim(),n=n?`${a} ${n}`:a,e.NODE_OPTIONS=n}}async function lwt(t,e){let r=vh(t);e(r.cjs),e(r.data),e(r.esmLoader),e(t.configuration.get("pnpUnpluggedFolder"))}var cwt={hooks:{populateYarnPaths:lwt,setupScriptEnvironment:awt},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: "pnp", "node-modules"',type:"STRING",default:"pnp"},winLinkType:{description:"Whether Yarn should use Windows Junctions or symlinks when creating links on Windows.",type:"STRING",values:["junctions","symlinks"],default:"junctions"},pnpMode:{description:"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.",type:"STRING",default:"strict"},pnpShebang:{description:"String to prepend to the generated PnP script",type:"STRING",default:"#!/usr/bin/env node"},pnpIgnorePatterns:{description:"Array of glob patterns; files matching them will use the classic resolution",type:"STRING",default:[],isArray:!0},pnpEnableEsmLoader:{description:"If true, Yarn will generate an ESM loader (`.pnp.loader.mjs`). If this is not explicitly set Yarn tries to automatically detect whether ESM support is required.",type:"BOOLEAN",default:!1},pnpEnableInlining:{description:"If true, the PnP data will be inlined along with the generated loader",type:"BOOLEAN",default:!0},pnpFallbackMode:{description:"If true, the generated PnP loader will follow the top-level fallback rule",type:"STRING",default:"dependencies-only"},pnpUnpluggedFolder:{description:"Folder where the unplugged packages must be stored",type:"ABSOLUTE_PATH",default:"./.yarn/unplugged"}},linkers:[Bh],commands:[Dh]},uwt=cwt;var T1e=tt(k1e());_t();var fj=tt(Ie("crypto")),N1e=tt(Ie("fs")),L1e=1,vi="node_modules",dk=".bin",O1e=".yarn-state.yml",Pwt=1e3,pj=(o=>(o.CLASSIC="classic",o.HARDLINKS_LOCAL="hardlinks-local",o.HARDLINKS_GLOBAL="hardlinks-global",o))(pj||{}),JB=class{constructor(){this.installStateCache=new Map}getCustomDataKey(){return JSON.stringify({name:"NodeModulesLinker",version:3})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the node-modules linker to be enabled");let o=r.project.tryWorkspaceByLocator(e);if(o)return o.cwd;let a=await Ye.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await Aj(r.project,{unrollAliases:!0}));if(a===null)throw new ot("Couldn't find the node_modules state file - running an install might help (findPackageLocation)");let n=a.locatorMap.get(Y.stringifyLocator(e));if(!n){let p=new ot(`Couldn't find ${Y.prettyLocator(r.project.configuration,e)} in the currently installed node_modules map - running an install might help`);throw p.code="LOCATOR_NOT_INSTALLED",p}let u=n.locations.sort((p,h)=>p.split(z.sep).length-h.split(z.sep).length),A=z.join(r.project.configuration.startingCwd,vi);return u.find(p=>z.contains(A,p))||n.locations[0]}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let o=await Ye.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await Aj(r.project,{unrollAliases:!0}));if(o===null)return null;let{locationRoot:a,segments:n}=mk(z.resolve(e),{skipPrefix:r.project.cwd}),u=o.locationTree.get(a);if(!u)return null;let A=u.locator;for(let p of n){if(u=u.children.get(p),!u)break;A=u.locator||A}return Y.parseLocator(A)}makeInstaller(e){return new uj(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="node-modules"}},uj=class{constructor(e){this.opts=e;this.localStore=new Map;this.realLocatorChecksums=new Map;this.customData={store:new Map}}attachCustomData(e){this.customData=e}async installPackage(e,r){let o=z.resolve(r.packageFs.getRealPath(),r.prefixPath),a=this.customData.store.get(e.locatorHash);if(typeof a>"u"&&(a=await xwt(e,r),e.linkType==="HARD"&&this.customData.store.set(e.locatorHash,a)),!Y.isPackageCompatible(e,this.opts.project.configuration.getSupportedArchitectures()))return{packageLocation:null,buildDirective:null};let n=new Map,u=new Set;n.has(Y.stringifyIdent(e))||n.set(Y.stringifyIdent(e),e.reference);let A=e;if(Y.isVirtualLocator(e)){A=Y.devirtualizeLocator(e);for(let E of e.peerDependencies.values())n.set(Y.stringifyIdent(E),null),u.add(Y.stringifyIdent(E))}let p={packageLocation:`${ue.fromPortablePath(o)}/`,packageDependencies:n,packagePeers:u,linkType:e.linkType,discardFromLookup:r.discardFromLookup??!1};this.localStore.set(e.locatorHash,{pkg:e,customPackageData:a,dependencyMeta:this.opts.project.getDependencyMeta(e,e.version),pnpNode:p});let h=r.checksum?r.checksum.substring(r.checksum.indexOf("/")+1):null;return this.realLocatorChecksums.set(A.locatorHash,h),{packageLocation:o,buildDirective:null}}async attachInternalDependencies(e,r){let o=this.localStore.get(e.locatorHash);if(typeof o>"u")throw new Error("Assertion failed: Expected information object to have been registered");for(let[a,n]of r){let u=Y.areIdentsEqual(a,n)?n.reference:[Y.stringifyIdent(n),n.reference];o.pnpNode.packageDependencies.set(Y.stringifyIdent(a),u)}}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the node-modules linker")}async finalizeInstall(){if(this.opts.project.configuration.get("nodeLinker")!=="node-modules")return;let e=new pi({baseFs:new Ul({maxOpenFiles:80,readOnlyArchives:!0})}),r=await Aj(this.opts.project),o=this.opts.project.configuration.get("nmMode");(r===null||o!==r.nmMode)&&(this.opts.project.storedBuildState.clear(),r={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map,nmMode:o,mtimeMs:0});let a=new Map(this.opts.project.workspaces.map(v=>{var C;let b=this.opts.project.configuration.get("nmHoistingLimits");try{b=Ye.validateEnum(NB,((C=v.manifest.installConfig)==null?void 0:C.hoistingLimits)??b)}catch{let L=Y.prettyWorkspace(this.opts.project.configuration,v);this.opts.report.reportWarning(57,`${L}: Invalid 'installConfig.hoistingLimits' value. Expected one of ${Object.values(NB).join(", ")}, using default: "${b}"`)}return[v.relativeCwd,b]})),n=new Map(this.opts.project.workspaces.map(v=>{var C;let b=this.opts.project.configuration.get("nmSelfReferences");return b=((C=v.manifest.installConfig)==null?void 0:C.selfReferences)??b,[v.relativeCwd,b]})),u={VERSIONS:{std:1},topLevel:{name:null,reference:null},getLocator:(v,b)=>Array.isArray(b)?{name:b[0],reference:b[1]}:{name:v,reference:b},getDependencyTreeRoots:()=>this.opts.project.workspaces.map(v=>{let b=v.anchoredLocator;return{name:Y.stringifyIdent(v.locator),reference:b.reference}}),getPackageInformation:v=>{let b=v.reference===null?this.opts.project.topLevelWorkspace.anchoredLocator:Y.makeLocator(Y.parseIdent(v.name),v.reference),C=this.localStore.get(b.locatorHash);if(typeof C>"u")throw new Error("Assertion failed: Expected the package reference to have been registered");return C.pnpNode},findPackageLocator:v=>{let b=this.opts.project.tryWorkspaceByCwd(ue.toPortablePath(v));if(b!==null){let C=b.anchoredLocator;return{name:Y.stringifyIdent(C),reference:C.reference}}throw new Error("Assertion failed: Unimplemented")},resolveToUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveRequest:()=>{throw new Error("Assertion failed: Unimplemented")},resolveVirtual:v=>ue.fromPortablePath(pi.resolveVirtual(ue.toPortablePath(v)))},{tree:A,errors:p,preserveSymlinksRequired:h}=LB(u,{pnpifyFs:!1,validateExternalSoftLinks:!0,hoistingLimitsByCwd:a,project:this.opts.project,selfReferencesByCwd:n});if(!A){for(let{messageName:v,text:b}of p)this.opts.report.reportError(v,b);return}let E=_q(A);await Twt(r,E,{baseFs:e,project:this.opts.project,report:this.opts.report,realLocatorChecksums:this.realLocatorChecksums,loadManifest:async v=>{let b=Y.parseLocator(v),C=this.localStore.get(b.locatorHash);if(typeof C>"u")throw new Error("Assertion failed: Expected the slot to exist");return C.customPackageData.manifest}});let w=[];for(let[v,b]of E.entries()){if(H1e(v))continue;let C=Y.parseLocator(v),R=this.localStore.get(C.locatorHash);if(typeof R>"u")throw new Error("Assertion failed: Expected the slot to exist");if(this.opts.project.tryWorkspaceByLocator(R.pkg))continue;let L=CA.extractBuildScripts(R.pkg,R.customPackageData,R.dependencyMeta,{configuration:this.opts.project.configuration,report:this.opts.report});L.length!==0&&w.push({buildLocations:b.locations,locatorHash:C.locatorHash,buildDirective:L})}return h&&this.opts.report.reportWarning(72,`The application uses portals and that's why ${ye.pretty(this.opts.project.configuration,"--preserve-symlinks",ye.Type.CODE)} Node option is required for launching it`),{customData:this.customData,records:w}}};async function xwt(t,e){let r=await Nt.tryFind(e.prefixPath,{baseFs:e.packageFs})??new Nt,o=new Set(["preinstall","install","postinstall"]);for(let a of r.scripts.keys())o.has(a)||r.scripts.delete(a);return{manifest:{bin:r.bin,scripts:r.scripts},misc:{hasBindingGyp:CA.hasBindingGyp(e)}}}async function bwt(t,e,r,o,{installChangedByUser:a}){let n="";n+=`# Warning: This file is automatically generated. Removing it is fine, but will +`,n+=`# cause your node_modules installation to become invalidated. +`,n+=` +`,n+=`__metadata: +`,n+=` version: ${L1e} +`,n+=` nmMode: ${o.value} +`;let u=Array.from(e.keys()).sort(),A=Y.stringifyLocator(t.topLevelWorkspace.anchoredLocator);for(let E of u){let w=e.get(E);n+=` +`,n+=`${JSON.stringify(E)}: +`,n+=` locations: +`;for(let v of w.locations){let b=z.contains(t.cwd,v);if(b===null)throw new Error(`Assertion failed: Expected the path to be within the project (${v})`);n+=` - ${JSON.stringify(b)} +`}if(w.aliases.length>0){n+=` aliases: +`;for(let v of w.aliases)n+=` - ${JSON.stringify(v)} +`}if(E===A&&r.size>0){n+=` bin: +`;for(let[v,b]of r){let C=z.contains(t.cwd,v);if(C===null)throw new Error(`Assertion failed: Expected the path to be within the project (${v})`);n+=` ${JSON.stringify(C)}: +`;for(let[R,L]of b){let _=z.relative(z.join(v,vi),L);n+=` ${JSON.stringify(R)}: ${JSON.stringify(_)} +`}}}}let p=t.cwd,h=z.join(p,vi,O1e);a&&await ae.removePromise(h),await ae.changeFilePromise(h,n,{automaticNewlines:!0})}async function Aj(t,{unrollAliases:e=!1}={}){let r=t.cwd,o=z.join(r,vi,O1e),a;try{a=await ae.statPromise(o)}catch{}if(!a)return null;let n=Yi(await ae.readFilePromise(o,"utf8"));if(n.__metadata.version>L1e)return null;let u=n.__metadata.nmMode||"classic",A=new Map,p=new Map;delete n.__metadata;for(let[h,E]of Object.entries(n)){let w=E.locations.map(b=>z.join(r,b)),v=E.bin;if(v)for(let[b,C]of Object.entries(v)){let R=z.join(r,ue.toPortablePath(b)),L=Ye.getMapWithDefault(p,R);for(let[_,V]of Object.entries(C))L.set(Li(_),ue.toPortablePath([R,vi,V].join(z.sep)))}if(A.set(h,{target:wt.dot,linkType:"HARD",locations:w,aliases:E.aliases||[]}),e&&E.aliases)for(let b of E.aliases){let{scope:C,name:R}=Y.parseLocator(h),L=Y.makeLocator(Y.makeIdent(C,R),b),_=Y.stringifyLocator(L);A.set(_,{target:wt.dot,linkType:"HARD",locations:w,aliases:[]})}}return{locatorMap:A,binSymlinks:p,locationTree:M1e(A,{skipPrefix:t.cwd}),nmMode:u,mtimeMs:a.mtimeMs}}var _E=async(t,e)=>{if(t.split(z.sep).indexOf(vi)<0)throw new Error(`Assertion failed: trying to remove dir that doesn't contain node_modules: ${t}`);try{if(!e.innerLoop){let o=e.allowSymlink?await ae.statPromise(t):await ae.lstatPromise(t);if(e.allowSymlink&&!o.isDirectory()||!e.allowSymlink&&o.isSymbolicLink()){await ae.unlinkPromise(t);return}}let r=await ae.readdirPromise(t,{withFileTypes:!0});for(let o of r){let a=z.join(t,Li(o.name));o.isDirectory()?(o.name!==vi||e&&e.innerLoop)&&await _E(a,{innerLoop:!0,contentsOnly:!1}):await ae.unlinkPromise(a)}e.contentsOnly||await ae.rmdirPromise(t)}catch(r){if(r.code!=="ENOENT"&&r.code!=="ENOTEMPTY")throw r}},F1e=4,mk=(t,{skipPrefix:e})=>{let r=z.contains(e,t);if(r===null)throw new Error(`Assertion failed: Writing attempt prevented to ${t} which is outside project root: ${e}`);let o=r.split(z.sep).filter(p=>p!==""),a=o.indexOf(vi),n=o.slice(0,a).join(z.sep),u=z.join(e,n),A=o.slice(a);return{locationRoot:u,segments:A}},M1e=(t,{skipPrefix:e})=>{let r=new Map;if(t===null)return r;let o=()=>({children:new Map,linkType:"HARD"});for(let[a,n]of t.entries()){if(n.linkType==="SOFT"&&z.contains(e,n.target)!==null){let A=Ye.getFactoryWithDefault(r,n.target,o);A.locator=a,A.linkType=n.linkType}for(let u of n.locations){let{locationRoot:A,segments:p}=mk(u,{skipPrefix:e}),h=Ye.getFactoryWithDefault(r,A,o);for(let E=0;E{if(process.platform==="win32"&&r==="junctions"){let o;try{o=await ae.lstatPromise(t)}catch{}if(!o||o.isDirectory()){await ae.symlinkPromise(t,e,"junction");return}}await ae.symlinkPromise(z.relative(z.dirname(e),t),e)};async function U1e(t,e,r){let o=z.join(t,Li(`${fj.default.randomBytes(16).toString("hex")}.tmp`));try{await ae.writeFilePromise(o,r);try{await ae.linkPromise(o,e)}catch{}}finally{await ae.unlinkPromise(o)}}async function Qwt({srcPath:t,dstPath:e,entry:r,globalHardlinksStore:o,baseFs:a,nmMode:n}){if(r.kind===_1e.FILE){if(n.value==="hardlinks-global"&&o&&r.digest){let A=z.join(o,r.digest.substring(0,2),`${r.digest.substring(2)}.dat`),p;try{let h=await ae.statPromise(A);if(h&&(!r.mtimeMs||h.mtimeMs>r.mtimeMs||h.mtimeMs(o.FILE="file",o.DIRECTORY="directory",o.SYMLINK="symlink",o))(_1e||{}),kwt=async(t,e,{baseFs:r,globalHardlinksStore:o,nmMode:a,windowsLinkType:n,packageChecksum:u})=>{await ae.mkdirPromise(t,{recursive:!0});let A=async(E=wt.dot)=>{let w=z.join(e,E),v=await r.readdirPromise(w,{withFileTypes:!0}),b=new Map;for(let C of v){let R=z.join(E,C.name),L,_=z.join(w,C.name);if(C.isFile()){if(L={kind:"file",mode:(await r.lstatPromise(_)).mode},a.value==="hardlinks-global"){let V=await bn.checksumFile(_,{baseFs:r,algorithm:"sha1"});L.digest=V}}else if(C.isDirectory())L={kind:"directory"};else if(C.isSymbolicLink())L={kind:"symlink",symlinkTo:await r.readlinkPromise(_)};else throw new Error(`Unsupported file type (file: ${_}, mode: 0o${await r.statSync(_).mode.toString(8).padStart(6,"0")})`);if(b.set(R,L),C.isDirectory()&&R!==vi){let V=await A(R);for(let[re,oe]of V)b.set(re,oe)}}return b},p;if(a.value==="hardlinks-global"&&o&&u){let E=z.join(o,u.substring(0,2),`${u.substring(2)}.json`);try{p=new Map(Object.entries(JSON.parse(await ae.readFilePromise(E,"utf8"))))}catch{p=await A()}}else p=await A();let h=!1;for(let[E,w]of p){let v=z.join(e,E),b=z.join(t,E);if(w.kind==="directory")await ae.mkdirPromise(b,{recursive:!0});else if(w.kind==="file"){let C=w.mtimeMs;await Qwt({srcPath:v,dstPath:b,entry:w,nmMode:a,baseFs:r,globalHardlinksStore:o}),w.mtimeMs!==C&&(h=!0)}else w.kind==="symlink"&&await hj(z.resolve(z.dirname(b),w.symlinkTo),b,n)}if(a.value==="hardlinks-global"&&o&&h&&u){let E=z.join(o,u.substring(0,2),`${u.substring(2)}.json`);await ae.removePromise(E),await U1e(o,E,Buffer.from(JSON.stringify(Object.fromEntries(p))))}};function Fwt(t,e,r,o){let a=new Map,n=new Map,u=new Map,A=!1,p=(h,E,w,v,b)=>{let C=!0,R=z.join(h,E),L=new Set;if(E===vi||E.startsWith("@")){let V;try{V=ae.statSync(R)}catch{}C=!!V,V?V.mtimeMs>r?(A=!0,L=new Set(ae.readdirSync(R))):L=new Set(w.children.get(E).children.keys()):A=!0;let re=e.get(h);if(re){let oe=z.join(h,vi,dk),pe;try{pe=ae.statSync(oe)}catch{}if(!pe)A=!0;else if(pe.mtimeMs>r){A=!0;let he=new Set(ae.readdirSync(oe)),ve=new Map;n.set(h,ve);for(let[ge,le]of re)he.has(ge)&&ve.set(ge,le)}else n.set(h,re)}}else C=b.has(E);let _=w.children.get(E);if(C){let{linkType:V,locator:re}=_,oe={children:new Map,linkType:V,locator:re};if(v.children.set(E,oe),re){let pe=Ye.getSetWithDefault(u,re);pe.add(R),u.set(re,pe)}for(let pe of _.children.keys())p(R,pe,_,oe,L)}else _.locator&&o.storedBuildState.delete(Y.parseLocator(_.locator).locatorHash)};for(let[h,E]of t){let{linkType:w,locator:v}=E,b={children:new Map,linkType:w,locator:v};if(a.set(h,b),v){let C=Ye.getSetWithDefault(u,E.locator);C.add(h),u.set(E.locator,C)}E.children.has(vi)&&p(h,vi,E,b,new Set)}return{locationTree:a,binSymlinks:n,locatorLocations:u,installChangedByUser:A}}function H1e(t){let e=Y.parseDescriptor(t);return Y.isVirtualDescriptor(e)&&(e=Y.devirtualizeDescriptor(e)),e.range.startsWith("link:")}async function Rwt(t,e,r,{loadManifest:o}){let a=new Map;for(let[A,{locations:p}]of t){let h=H1e(A)?null:await o(A,p[0]),E=new Map;if(h)for(let[w,v]of h.bin){let b=z.join(p[0],v);v!==""&&ae.existsSync(b)&&E.set(w,v)}a.set(A,E)}let n=new Map,u=(A,p,h)=>{let E=new Map,w=z.contains(r,A);if(h.locator&&w!==null){let v=a.get(h.locator);for(let[b,C]of v){let R=z.join(A,ue.toPortablePath(C));E.set(Li(b),R)}for(let[b,C]of h.children){let R=z.join(A,b),L=u(R,R,C);L.size>0&&n.set(A,new Map([...n.get(A)||new Map,...L]))}}else for(let[v,b]of h.children){let C=u(z.join(A,v),p,b);for(let[R,L]of C)E.set(R,L)}return E};for(let[A,p]of e){let h=u(A,A,p);h.size>0&&n.set(A,new Map([...n.get(A)||new Map,...h]))}return n}var R1e=(t,e)=>{if(!t||!e)return t===e;let r=Y.parseLocator(t);Y.isVirtualLocator(r)&&(r=Y.devirtualizeLocator(r));let o=Y.parseLocator(e);return Y.isVirtualLocator(o)&&(o=Y.devirtualizeLocator(o)),Y.areLocatorsEqual(r,o)};function gj(t){return z.join(t.get("globalFolder"),"store")}async function Twt(t,e,{baseFs:r,project:o,report:a,loadManifest:n,realLocatorChecksums:u}){let A=z.join(o.cwd,vi),{locationTree:p,binSymlinks:h,locatorLocations:E,installChangedByUser:w}=Fwt(t.locationTree,t.binSymlinks,t.mtimeMs,o),v=M1e(e,{skipPrefix:o.cwd}),b=[],C=async({srcDir:le,dstDir:Pe,linkType:g,globalHardlinksStore:De,nmMode:Ce,windowsLinkType:de,packageChecksum:ne})=>{let Z=(async()=>{try{g==="SOFT"?(await ae.mkdirPromise(z.dirname(Pe),{recursive:!0}),await hj(z.resolve(le),Pe,de)):await kwt(Pe,le,{baseFs:r,globalHardlinksStore:De,nmMode:Ce,windowsLinkType:de,packageChecksum:ne})}catch(me){throw me.message=`While persisting ${le} -> ${Pe} ${me.message}`,me}finally{oe.tick()}})().then(()=>b.splice(b.indexOf(Z),1));b.push(Z),b.length>F1e&&await Promise.race(b)},R=async(le,Pe,g)=>{let De=(async()=>{let Ce=async(de,ne,Z)=>{try{Z.innerLoop||await ae.mkdirPromise(ne,{recursive:!0});let me=await ae.readdirPromise(de,{withFileTypes:!0});for(let be of me){if(!Z.innerLoop&&be.name===dk)continue;let ut=z.join(de,be.name),H=z.join(ne,be.name);be.isDirectory()?(be.name!==vi||Z&&Z.innerLoop)&&(await ae.mkdirPromise(H,{recursive:!0}),await Ce(ut,H,{...Z,innerLoop:!0})):ve.value==="hardlinks-local"||ve.value==="hardlinks-global"?await ae.linkPromise(ut,H):await ae.copyFilePromise(ut,H,N1e.default.constants.COPYFILE_FICLONE)}}catch(me){throw Z.innerLoop||(me.message=`While cloning ${de} -> ${ne} ${me.message}`),me}finally{Z.innerLoop||oe.tick()}};await Ce(le,Pe,g)})().then(()=>b.splice(b.indexOf(De),1));b.push(De),b.length>F1e&&await Promise.race(b)},L=async(le,Pe,g)=>{if(g)for(let[De,Ce]of Pe.children){let de=g.children.get(De);await L(z.join(le,De),Ce,de)}else{Pe.children.has(vi)&&await _E(z.join(le,vi),{contentsOnly:!1});let De=z.basename(le)===vi&&v.has(z.join(z.dirname(le),z.sep));await _E(le,{contentsOnly:le===A,allowSymlink:De})}};for(let[le,Pe]of p){let g=v.get(le);for(let[De,Ce]of Pe.children){if(De===".")continue;let de=g&&g.children.get(De),ne=z.join(le,De);await L(ne,Ce,de)}}let _=async(le,Pe,g)=>{if(g){R1e(Pe.locator,g.locator)||await _E(le,{contentsOnly:Pe.linkType==="HARD"});for(let[De,Ce]of Pe.children){let de=g.children.get(De);await _(z.join(le,De),Ce,de)}}else{Pe.children.has(vi)&&await _E(z.join(le,vi),{contentsOnly:!0});let De=z.basename(le)===vi&&v.has(z.join(z.dirname(le),z.sep));await _E(le,{contentsOnly:Pe.linkType==="HARD",allowSymlink:De})}};for(let[le,Pe]of v){let g=p.get(le);for(let[De,Ce]of Pe.children){if(De===".")continue;let de=g&&g.children.get(De);await _(z.join(le,De),Ce,de)}}let V=new Map,re=[];for(let[le,Pe]of E)for(let g of Pe){let{locationRoot:De,segments:Ce}=mk(g,{skipPrefix:o.cwd}),de=v.get(De),ne=De;if(de){for(let Z of Ce)if(ne=z.join(ne,Z),de=de.children.get(Z),!de)break;if(de){let Z=R1e(de.locator,le),me=e.get(de.locator),be=me.target,ut=ne,H=me.linkType;if(Z)V.has(be)||V.set(be,ut);else if(be!==ut){let yt=Y.parseLocator(de.locator);Y.isVirtualLocator(yt)&&(yt=Y.devirtualizeLocator(yt)),re.push({srcDir:be,dstDir:ut,linkType:H,realLocatorHash:yt.locatorHash})}}}}for(let[le,{locations:Pe}]of e.entries())for(let g of Pe){let{locationRoot:De,segments:Ce}=mk(g,{skipPrefix:o.cwd}),de=p.get(De),ne=v.get(De),Z=De,me=e.get(le),be=Y.parseLocator(le);Y.isVirtualLocator(be)&&(be=Y.devirtualizeLocator(be));let ut=be.locatorHash,H=me.target,yt=g;if(H===yt)continue;let Me=me.linkType;for(let Te of Ce)ne=ne.children.get(Te);if(!de)re.push({srcDir:H,dstDir:yt,linkType:Me,realLocatorHash:ut});else for(let Te of Ce)if(Z=z.join(Z,Te),de=de.children.get(Te),!de){re.push({srcDir:H,dstDir:yt,linkType:Me,realLocatorHash:ut});break}}let oe=Js.progressViaCounter(re.length),pe=a.reportProgress(oe),he=o.configuration.get("nmMode"),ve={value:he},ge=o.configuration.get("winLinkType");try{let le=ve.value==="hardlinks-global"?`${gj(o.configuration)}/v1`:null;if(le&&!await ae.existsPromise(le)){await ae.mkdirpPromise(le);for(let g=0;g<256;g++)await ae.mkdirPromise(z.join(le,g.toString(16).padStart(2,"0")))}for(let g of re)(g.linkType==="SOFT"||!V.has(g.srcDir))&&(V.set(g.srcDir,g.dstDir),await C({...g,globalHardlinksStore:le,nmMode:ve,windowsLinkType:ge,packageChecksum:u.get(g.realLocatorHash)||null}));await Promise.all(b),b.length=0;for(let g of re){let De=V.get(g.srcDir);g.linkType!=="SOFT"&&g.dstDir!==De&&await R(De,g.dstDir,{nmMode:ve})}await Promise.all(b),await ae.mkdirPromise(A,{recursive:!0});let Pe=await Rwt(e,v,o.cwd,{loadManifest:n});await Nwt(h,Pe,o.cwd,ge),await bwt(o,e,Pe,ve,{installChangedByUser:w}),he=="hardlinks-global"&&ve.value=="hardlinks-local"&&a.reportWarningOnce(74,"'nmMode' has been downgraded to 'hardlinks-local' due to global cache and install folder being on different devices")}finally{pe.stop()}}async function Nwt(t,e,r,o){for(let a of t.keys()){if(z.contains(r,a)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${a}`);if(!e.has(a)){let n=z.join(a,vi,dk);await ae.removePromise(n)}}for(let[a,n]of e){if(z.contains(r,a)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${a}`);let u=z.join(a,vi,dk),A=t.get(a)||new Map;await ae.mkdirPromise(u,{recursive:!0});for(let p of A.keys())n.has(p)||(await ae.removePromise(z.join(u,p)),process.platform==="win32"&&await ae.removePromise(z.join(u,Li(`${p}.cmd`))));for(let[p,h]of n){let E=A.get(p),w=z.join(u,p);E!==h&&(process.platform==="win32"?await(0,T1e.default)(ue.fromPortablePath(h),ue.fromPortablePath(w),{createPwshFile:!1}):(await ae.removePromise(w),await hj(h,w,o),z.contains(r,await ae.realpathPromise(h))!==null&&await ae.chmodPromise(h,493)))}}}Ke();bt();_c();var zB=class extends Bh{constructor(){super(...arguments);this.mode="loose"}makeInstaller(r){return new dj(r)}},dj=class extends Em{constructor(){super(...arguments);this.mode="loose"}async transformPnpSettings(r){let o=new pi({baseFs:new Ul({maxOpenFiles:80,readOnlyArchives:!0})}),a=y1e(r,this.opts.project.cwd,o),{tree:n,errors:u}=LB(a,{pnpifyFs:!1,project:this.opts.project});if(!n){for(let{messageName:w,text:v}of u)this.opts.report.reportError(w,v);return}let A=new Map;r.fallbackPool=A;let p=(w,v)=>{let b=Y.parseLocator(v.locator),C=Y.stringifyIdent(b);C===w?A.set(w,b.reference):A.set(w,[C,b.reference])},h=z.join(this.opts.project.cwd,Lr.nodeModules),E=n.get(h);if(!(typeof E>"u")){if("target"in E)throw new Error("Assertion failed: Expected the root junction point to be a directory");for(let w of E.dirList){let v=z.join(h,w),b=n.get(v);if(typeof b>"u")throw new Error("Assertion failed: Expected the child to have been registered");if("target"in b)p(w,b);else for(let C of b.dirList){let R=z.join(v,C),L=n.get(R);if(typeof L>"u")throw new Error("Assertion failed: Expected the subchild to have been registered");if("target"in L)p(`${w}/${C}`,L);else throw new Error("Assertion failed: Expected the leaf junction to be a package")}}}}};var Lwt={hooks:{cleanGlobalArtifacts:async t=>{let e=gj(t);await ae.removePromise(e)}},configuration:{nmHoistingLimits:{description:"Prevent packages to be hoisted past specific levels",type:"STRING",values:["workspaces","dependencies","none"],default:"none"},nmMode:{description:'If set to "hardlinks-local" Yarn will utilize hardlinks to reduce disk space consumption inside "node_modules" directories. With "hardlinks-global" Yarn will use global content addressable storage to reduce "node_modules" size across all the projects using this option.',type:"STRING",values:["classic","hardlinks-local","hardlinks-global"],default:"classic"},nmSelfReferences:{description:"If set to 'false' the workspace will not be allowed to require itself and corresponding self-referencing symlink will not be created",type:"BOOLEAN",default:!0}},linkers:[JB,zB]},Owt=Lwt;var hG={};Yt(hG,{NpmHttpFetcher:()=>ZB,NpmRemapResolver:()=>$B,NpmSemverFetcher:()=>yl,NpmSemverResolver:()=>ev,NpmTagResolver:()=>tv,default:()=>WBt,npmConfigUtils:()=>Wn,npmHttpUtils:()=>an,npmPublishUtils:()=>ZE});Ke();var Y1e=tt(si());var _n="npm:";var an={};Yt(an,{AuthType:()=>W1e,customPackageError:()=>np,del:()=>qwt,get:()=>pu,getIdentUrl:()=>Ph,handleInvalidAuthenticationError:()=>Sh,post:()=>_wt,put:()=>Hwt});Ke();Ke();var Ej=tt(z1()),G1e=Ie("url");var Wn={};Yt(Wn,{RegistryType:()=>q1e,getAuditRegistry:()=>Mwt,getAuthConfiguration:()=>Cj,getDefaultRegistry:()=>XB,getPublishRegistry:()=>Uwt,getRegistryConfiguration:()=>j1e,getScopeConfiguration:()=>yj,getScopeRegistry:()=>rp,normalizeRegistry:()=>EA});var q1e=(o=>(o.AUDIT_REGISTRY="npmAuditRegistry",o.FETCH_REGISTRY="npmRegistryServer",o.PUBLISH_REGISTRY="npmPublishRegistry",o))(q1e||{});function EA(t){return t.replace(/\/$/,"")}function Mwt({configuration:t}){return XB({configuration:t,type:"npmAuditRegistry"})}function Uwt(t,{configuration:e}){var r;return(r=t.publishConfig)!=null&&r.registry?EA(t.publishConfig.registry):t.name?rp(t.name.scope,{configuration:e,type:"npmPublishRegistry"}):XB({configuration:e,type:"npmPublishRegistry"})}function rp(t,{configuration:e,type:r="npmRegistryServer"}){let o=yj(t,{configuration:e});if(o===null)return XB({configuration:e,type:r});let a=o.get(r);return a===null?XB({configuration:e,type:r}):EA(a)}function XB({configuration:t,type:e="npmRegistryServer"}){let r=t.get(e);return EA(r!==null?r:t.get("npmRegistryServer"))}function j1e(t,{configuration:e}){let r=e.get("npmRegistries"),o=EA(t),a=r.get(o);if(typeof a<"u")return a;let n=r.get(o.replace(/^[a-z]+:/,""));return typeof n<"u"?n:null}function yj(t,{configuration:e}){if(t===null)return null;let o=e.get("npmScopes").get(t);return o||null}function Cj(t,{configuration:e,ident:r}){let o=r&&yj(r.scope,{configuration:e});return(o==null?void 0:o.get("npmAuthIdent"))||(o==null?void 0:o.get("npmAuthToken"))?o:j1e(t,{configuration:e})||e}var W1e=(a=>(a[a.NO_AUTH=0]="NO_AUTH",a[a.BEST_EFFORT=1]="BEST_EFFORT",a[a.CONFIGURATION=2]="CONFIGURATION",a[a.ALWAYS_AUTH=3]="ALWAYS_AUTH",a))(W1e||{});async function Sh(t,{attemptedAs:e,registry:r,headers:o,configuration:a}){var n,u;if(Ck(t))throw new Vt(41,"Invalid OTP token");if(((n=t.originalError)==null?void 0:n.name)==="HTTPError"&&((u=t.originalError)==null?void 0:u.response.statusCode)===401)throw new Vt(41,`Invalid authentication (${typeof e!="string"?`as ${await Gwt(r,o,{configuration:a})}`:`attempted as ${e}`})`)}function np(t,e){var o;let r=(o=t.response)==null?void 0:o.statusCode;return r?r===404?"Package not found":r>=500&&r<600?`The registry appears to be down (using a ${ye.applyHyperlink(e,"local cache","https://yarnpkg.com/advanced/lexicon#local-cache")} might have protected you against such outages)`:null:null}function Ph(t){return t.scope?`/@${t.scope}%2f${t.name}`:`/${t.name}`}async function pu(t,{configuration:e,headers:r,ident:o,authType:a,registry:n,...u}){if(o&&typeof n>"u"&&(n=rp(o.scope,{configuration:e})),o&&o.scope&&typeof a>"u"&&(a=1),typeof n!="string")throw new Error("Assertion failed: The registry should be a string");let A=await yk(n,{authType:a,configuration:e,ident:o});A&&(r={...r,authorization:A});try{return await ln.get(t.charAt(0)==="/"?`${n}${t}`:t,{configuration:e,headers:r,...u})}catch(p){throw await Sh(p,{registry:n,configuration:e,headers:r}),p}}async function _wt(t,e,{attemptedAs:r,configuration:o,headers:a,ident:n,authType:u=3,registry:A,otp:p,...h}){if(n&&typeof A>"u"&&(A=rp(n.scope,{configuration:o})),typeof A!="string")throw new Error("Assertion failed: The registry should be a string");let E=await yk(A,{authType:u,configuration:o,ident:n});E&&(a={...a,authorization:E}),p&&(a={...a,...HE(p)});try{return await ln.post(A+t,e,{configuration:o,headers:a,...h})}catch(w){if(!Ck(w)||p)throw await Sh(w,{attemptedAs:r,registry:A,configuration:o,headers:a}),w;p=await Ij(w,{configuration:o});let v={...a,...HE(p)};try{return await ln.post(`${A}${t}`,e,{configuration:o,headers:v,...h})}catch(b){throw await Sh(b,{attemptedAs:r,registry:A,configuration:o,headers:a}),b}}}async function Hwt(t,e,{attemptedAs:r,configuration:o,headers:a,ident:n,authType:u=3,registry:A,otp:p,...h}){if(n&&typeof A>"u"&&(A=rp(n.scope,{configuration:o})),typeof A!="string")throw new Error("Assertion failed: The registry should be a string");let E=await yk(A,{authType:u,configuration:o,ident:n});E&&(a={...a,authorization:E}),p&&(a={...a,...HE(p)});try{return await ln.put(A+t,e,{configuration:o,headers:a,...h})}catch(w){if(!Ck(w))throw await Sh(w,{attemptedAs:r,registry:A,configuration:o,headers:a}),w;p=await Ij(w,{configuration:o});let v={...a,...HE(p)};try{return await ln.put(`${A}${t}`,e,{configuration:o,headers:v,...h})}catch(b){throw await Sh(b,{attemptedAs:r,registry:A,configuration:o,headers:a}),b}}}async function qwt(t,{attemptedAs:e,configuration:r,headers:o,ident:a,authType:n=3,registry:u,otp:A,...p}){if(a&&typeof u>"u"&&(u=rp(a.scope,{configuration:r})),typeof u!="string")throw new Error("Assertion failed: The registry should be a string");let h=await yk(u,{authType:n,configuration:r,ident:a});h&&(o={...o,authorization:h}),A&&(o={...o,...HE(A)});try{return await ln.del(u+t,{configuration:r,headers:o,...p})}catch(E){if(!Ck(E)||A)throw await Sh(E,{attemptedAs:e,registry:u,configuration:r,headers:o}),E;A=await Ij(E,{configuration:r});let w={...o,...HE(A)};try{return await ln.del(`${u}${t}`,{configuration:r,headers:w,...p})}catch(v){throw await Sh(v,{attemptedAs:e,registry:u,configuration:r,headers:o}),v}}}async function yk(t,{authType:e=2,configuration:r,ident:o}){let a=Cj(t,{configuration:r,ident:o}),n=jwt(a,e);if(!n)return null;let u=await r.reduceHook(A=>A.getNpmAuthenticationHeader,void 0,t,{configuration:r,ident:o});if(u)return u;if(a.get("npmAuthToken"))return`Bearer ${a.get("npmAuthToken")}`;if(a.get("npmAuthIdent")){let A=a.get("npmAuthIdent");return A.includes(":")?`Basic ${Buffer.from(A).toString("base64")}`:`Basic ${A}`}if(n&&e!==1)throw new Vt(33,"No authentication configured for request");return null}function jwt(t,e){switch(e){case 2:return t.get("npmAlwaysAuth");case 1:case 3:return!0;case 0:return!1;default:throw new Error("Unreachable")}}async function Gwt(t,e,{configuration:r}){if(typeof e>"u"||typeof e.authorization>"u")return"an anonymous user";try{return(await ln.get(new G1e.URL(`${t}/-/whoami`).href,{configuration:r,headers:e,jsonResponse:!0})).username??"an unknown user"}catch{return"an unknown user"}}async function Ij(t,{configuration:e}){var a;let r=(a=t.originalError)==null?void 0:a.response.headers["npm-notice"];if(r&&(await Et.start({configuration:e,stdout:process.stdout,includeFooter:!1},async n=>{if(n.reportInfo(0,r.replace(/(https?:\/\/\S+)/g,ye.pretty(e,"$1",ye.Type.URL))),!process.env.YARN_IS_TEST_ENV){let u=r.match(/open (https?:\/\/\S+)/i);if(u&&As.openUrl){let{openNow:A}=await(0,Ej.prompt)({type:"confirm",name:"openNow",message:"Do you want to try to open this url now?",required:!0,initial:!0,onCancel:()=>process.exit(130)});A&&(await As.openUrl(u[1])||(n.reportSeparator(),n.reportWarning(0,"We failed to automatically open the url; you'll have to open it yourself in your browser of choice.")))}}}),process.stdout.write(` +`)),process.env.YARN_IS_TEST_ENV)return process.env.YARN_INJECT_NPM_2FA_TOKEN||"";let{otp:o}=await(0,Ej.prompt)({type:"password",name:"otp",message:"One-time password:",required:!0,onCancel:()=>process.exit(130)});return process.stdout.write(` +`),o}function Ck(t){var e,r;if(((e=t.originalError)==null?void 0:e.name)!=="HTTPError")return!1;try{return((r=t.originalError)==null?void 0:r.response.headers["www-authenticate"].split(/,\s*/).map(a=>a.toLowerCase())).includes("otp")}catch{return!1}}function HE(t){return{["npm-otp"]:t}}var ZB=class{supports(e,r){if(!e.reference.startsWith(_n))return!1;let{selector:o,params:a}=Y.parseRange(e.reference);return!(!Y1e.default.valid(o)||a===null||typeof a.__archiveUrl!="string")}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${Y.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:Y.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let{params:o}=Y.parseRange(e.reference);if(o===null||typeof o.__archiveUrl!="string")throw new Error("Assertion failed: The archiveUrl querystring parameter should have been available");let a=await pu(o.__archiveUrl,{customErrorMessage:np,configuration:r.project.configuration,ident:e});return await Ji.convertToZip(a,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:Y.getIdentVendorPath(e),stripComponents:1})}};Ke();var $B=class{supportsDescriptor(e,r){return!(!e.range.startsWith(_n)||!Y.tryParseDescriptor(e.range.slice(_n.length),!0))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){let o=r.project.configuration.normalizeDependency(Y.parseDescriptor(e.range.slice(_n.length),!0));return r.resolver.getResolutionDependencies(o,r)}async getCandidates(e,r,o){let a=o.project.configuration.normalizeDependency(Y.parseDescriptor(e.range.slice(_n.length),!0));return await o.resolver.getCandidates(a,r,o)}async getSatisfying(e,r,o,a){let n=a.project.configuration.normalizeDependency(Y.parseDescriptor(e.range.slice(_n.length),!0));return a.resolver.getSatisfying(n,r,o,a)}resolve(e,r){throw new Error("Unreachable")}};Ke();Ke();var K1e=tt(si()),V1e=Ie("url");var yl=class{supports(e,r){if(!e.reference.startsWith(_n))return!1;let o=new V1e.URL(e.reference);return!(!K1e.default.valid(o.pathname)||o.searchParams.has("__archiveUrl"))}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${Y.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote registry`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:Y.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let o;try{o=await pu(yl.getLocatorUrl(e),{customErrorMessage:np,configuration:r.project.configuration,ident:e})}catch{o=await pu(yl.getLocatorUrl(e).replace(/%2f/g,"/"),{customErrorMessage:np,configuration:r.project.configuration,ident:e})}return await Ji.convertToZip(o,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:Y.getIdentVendorPath(e),stripComponents:1})}static isConventionalTarballUrl(e,r,{configuration:o}){let a=rp(e.scope,{configuration:o}),n=yl.getLocatorUrl(e);return r=r.replace(/^https?:(\/\/(?:[^/]+\.)?npmjs.org(?:$|\/))/,"https:$1"),a=a.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r=r.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r===a+n||r===a+n.replace(/%2f/g,"/")}static getLocatorUrl(e){let r=Tr.clean(e.reference.slice(_n.length));if(r===null)throw new Vt(10,"The npm semver resolver got selected, but the version isn't semver");return`${Ph(e)}/-/${e.name}-${r}.tgz`}};Ke();Ke();Ke();var J1e=tt(si());var Ek=Y.makeIdent(null,"node-gyp"),Wwt=/\b(node-gyp|prebuild-install)\b/,ev=class{supportsDescriptor(e,r){return e.range.startsWith(_n)?!!Tr.validRange(e.range.slice(_n.length)):!1}supportsLocator(e,r){if(!e.reference.startsWith(_n))return!1;let{selector:o}=Y.parseRange(e.reference);return!!J1e.default.valid(o)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=Tr.validRange(e.range.slice(_n.length));if(a===null)throw new Error(`Expected a valid range, got ${e.range.slice(_n.length)}`);let n=await pu(Ph(e),{customErrorMessage:np,configuration:o.project.configuration,ident:e,jsonResponse:!0}),u=Ye.mapAndFilter(Object.keys(n.versions),h=>{try{let E=new Tr.SemVer(h);if(a.test(E))return E}catch{}return Ye.mapAndFilter.skip}),A=u.filter(h=>!n.versions[h.raw].deprecated),p=A.length>0?A:u;return p.sort((h,E)=>-h.compare(E)),p.map(h=>{let E=Y.makeLocator(e,`${_n}${h.raw}`),w=n.versions[h.raw].dist.tarball;return yl.isConventionalTarballUrl(E,w,{configuration:o.project.configuration})?E:Y.bindLocator(E,{__archiveUrl:w})})}async getSatisfying(e,r,o,a){let n=Tr.validRange(e.range.slice(_n.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(_n.length)}`);return{locators:Ye.mapAndFilter(o,p=>{if(p.identHash!==e.identHash)return Ye.mapAndFilter.skip;let h=Y.tryParseRange(p.reference,{requireProtocol:_n});if(!h)return Ye.mapAndFilter.skip;let E=new Tr.SemVer(h.selector);return n.test(E)?{locator:p,version:E}:Ye.mapAndFilter.skip}).sort((p,h)=>-p.version.compare(h.version)).map(({locator:p})=>p),sorted:!0}}async resolve(e,r){let{selector:o}=Y.parseRange(e.reference),a=Tr.clean(o);if(a===null)throw new Vt(10,"The npm semver resolver got selected, but the version isn't semver");let n=await pu(Ph(e),{customErrorMessage:np,configuration:r.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(n,"versions"))throw new Vt(15,'Registry returned invalid data for - missing "versions" field');if(!Object.prototype.hasOwnProperty.call(n.versions,a))throw new Vt(16,`Registry failed to return reference "${a}"`);let u=new Nt;if(u.load(n.versions[a]),!u.dependencies.has(Ek.identHash)&&!u.peerDependencies.has(Ek.identHash)){for(let A of u.scripts.values())if(A.match(Wwt)){u.dependencies.set(Ek.identHash,Y.makeDescriptor(Ek,"latest")),r.report.reportWarningOnce(32,`${Y.prettyLocator(r.project.configuration,e)}: Implicit dependencies on node-gyp are discouraged`);break}}if(typeof u.raw.deprecated=="string"&&u.raw.deprecated!==""){let A=Y.prettyLocator(r.project.configuration,e),p=u.raw.deprecated.match(/\S/)?`${A} is deprecated: ${u.raw.deprecated}`:`${A} is deprecated`;r.report.reportWarningOnce(61,p)}return{...e,version:a,languageName:"node",linkType:"HARD",conditions:u.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(u.dependencies),peerDependencies:u.peerDependencies,dependenciesMeta:u.dependenciesMeta,peerDependenciesMeta:u.peerDependenciesMeta,bin:u.bin}}};Ke();Ke();var z1e=tt(si());var tv=class{supportsDescriptor(e,r){return!(!e.range.startsWith(_n)||!QC.test(e.range.slice(_n.length)))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=e.range.slice(_n.length),n=await pu(Ph(e),{configuration:o.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(n,"dist-tags"))throw new Vt(15,'Registry returned invalid data - missing "dist-tags" field');let u=n["dist-tags"];if(!Object.prototype.hasOwnProperty.call(u,a))throw new Vt(16,`Registry failed to return tag "${a}"`);let A=u[a],p=Y.makeLocator(e,`${_n}${A}`),h=n.versions[A].dist.tarball;return yl.isConventionalTarballUrl(p,h,{configuration:o.project.configuration})?[p]:[Y.bindLocator(p,{__archiveUrl:h})]}async getSatisfying(e,r,o,a){var u;let n=[];for(let A of o){if(A.identHash!==e.identHash)continue;let p=Y.tryParseRange(A.reference,{requireProtocol:_n});if(!(!p||!z1e.default.valid(p.selector))){if((u=p.params)!=null&&u.__archiveUrl){let h=Y.makeRange({protocol:_n,selector:p.selector,source:null,params:null}),[E]=await this.getCandidates(Y.makeDescriptor(e,h),r,a);if(A.reference!==E.reference)continue}n.push(A)}}return{locators:n,sorted:!1}}async resolve(e,r){throw new Error("Unreachable")}};var ZE={};Yt(ZE,{getGitHead:()=>jBt,makePublishBody:()=>qBt});Ke();Ke();var cG={};Yt(cG,{PackCommand:()=>Lh,default:()=>vBt,packUtils:()=>BA});Ke();Ke();Ke();bt();_t();var BA={};Yt(BA,{genPackList:()=>jk,genPackStream:()=>lG,genPackageManifest:()=>PBe,hasPackScripts:()=>oG,prepareForPack:()=>aG});Ke();bt();var sG=tt(Jo()),DBe=tt(IBe()),SBe=Ie("zlib"),pBt=["/package.json","/readme","/readme.*","/license","/license.*","/licence","/licence.*","/changelog","/changelog.*"],hBt=["/package.tgz",".github",".git",".hg","node_modules",".npmignore",".gitignore",".#*",".DS_Store"];async function oG(t){return!!(sn.hasWorkspaceScript(t,"prepack")||sn.hasWorkspaceScript(t,"postpack"))}async function aG(t,{report:e},r){await sn.maybeExecuteWorkspaceLifecycleScript(t,"prepack",{report:e});try{let o=z.join(t.cwd,Nt.fileName);await ae.existsPromise(o)&&await t.manifest.loadFile(o,{baseFs:ae}),await r()}finally{await sn.maybeExecuteWorkspaceLifecycleScript(t,"postpack",{report:e})}}async function lG(t,e){var n;typeof e>"u"&&(e=await jk(t));let r=new Set;for(let u of((n=t.manifest.publishConfig)==null?void 0:n.executableFiles)??new Set)r.add(z.normalize(u));for(let u of t.manifest.bin.values())r.add(z.normalize(u));let o=DBe.default.pack();process.nextTick(async()=>{for(let u of e){let A=z.normalize(u),p=z.resolve(t.cwd,A),h=z.join("package",A),E=await ae.lstatPromise(p),w={name:h,mtime:new Date(Ii.SAFE_TIME*1e3)},v=r.has(A)?493:420,b,C,R=new Promise((_,V)=>{b=_,C=V}),L=_=>{_?C(_):b()};if(E.isFile()){let _;A==="package.json"?_=Buffer.from(JSON.stringify(await PBe(t),null,2)):_=await ae.readFilePromise(p),o.entry({...w,mode:v,type:"file"},_,L)}else E.isSymbolicLink()?o.entry({...w,mode:v,type:"symlink",linkname:await ae.readlinkPromise(p)},L):L(new Error(`Unsupported file type ${E.mode} for ${ue.fromPortablePath(A)}`));await R}o.finalize()});let a=(0,SBe.createGzip)();return o.pipe(a),a}async function PBe(t){let e=JSON.parse(JSON.stringify(t.manifest.raw));return await t.project.configuration.triggerHook(r=>r.beforeWorkspacePacking,t,e),e}async function jk(t){var w,v,b,C;let e=t.project,r=e.configuration,o={accept:[],reject:[]};for(let R of hBt)o.reject.push(R);for(let R of pBt)o.accept.push(R);o.reject.push(r.get("rcFilename"));let a=R=>{if(R===null||!R.startsWith(`${t.cwd}/`))return;let L=z.relative(t.cwd,R),_=z.resolve(wt.root,L);o.reject.push(_)};a(z.resolve(e.cwd,r.get("lockfileFilename"))),a(r.get("cacheFolder")),a(r.get("globalFolder")),a(r.get("installStatePath")),a(r.get("virtualFolder")),a(r.get("yarnPath")),await r.triggerHook(R=>R.populateYarnPaths,e,R=>{a(R)});for(let R of e.workspaces){let L=z.relative(t.cwd,R.cwd);L!==""&&!L.match(/^(\.\.)?\//)&&o.reject.push(`/${L}`)}let n={accept:[],reject:[]},u=((w=t.manifest.publishConfig)==null?void 0:w.main)??t.manifest.main,A=((v=t.manifest.publishConfig)==null?void 0:v.module)??t.manifest.module,p=((b=t.manifest.publishConfig)==null?void 0:b.browser)??t.manifest.browser,h=((C=t.manifest.publishConfig)==null?void 0:C.bin)??t.manifest.bin;u!=null&&n.accept.push(z.resolve(wt.root,u)),A!=null&&n.accept.push(z.resolve(wt.root,A)),typeof p=="string"&&n.accept.push(z.resolve(wt.root,p));for(let R of h.values())n.accept.push(z.resolve(wt.root,R));if(p instanceof Map)for(let[R,L]of p.entries())n.accept.push(z.resolve(wt.root,R)),typeof L=="string"&&n.accept.push(z.resolve(wt.root,L));let E=t.manifest.files!==null;if(E){n.reject.push("/*");for(let R of t.manifest.files)xBe(n.accept,R,{cwd:wt.root})}return await gBt(t.cwd,{hasExplicitFileList:E,globalList:o,ignoreList:n})}async function gBt(t,{hasExplicitFileList:e,globalList:r,ignoreList:o}){let a=[],n=new Gu(t),u=[[wt.root,[o]]];for(;u.length>0;){let[A,p]=u.pop(),h=await n.lstatPromise(A);if(!BBe(A,{globalList:r,ignoreLists:h.isDirectory()?null:p}))if(h.isDirectory()){let E=await n.readdirPromise(A),w=!1,v=!1;if(!e||A!==wt.root)for(let R of E)w=w||R===".gitignore",v=v||R===".npmignore";let b=v?await wBe(n,A,".npmignore"):w?await wBe(n,A,".gitignore"):null,C=b!==null?[b].concat(p):p;BBe(A,{globalList:r,ignoreLists:p})&&(C=[...p,{accept:[],reject:["**/*"]}]);for(let R of E)u.push([z.resolve(A,R),C])}else(h.isFile()||h.isSymbolicLink())&&a.push(z.relative(wt.root,A))}return a.sort()}async function wBe(t,e,r){let o={accept:[],reject:[]},a=await t.readFilePromise(z.join(e,r),"utf8");for(let n of a.split(/\n/g))xBe(o.reject,n,{cwd:e});return o}function dBt(t,{cwd:e}){let r=t[0]==="!";return r&&(t=t.slice(1)),t.match(/\.{0,1}\//)&&(t=z.resolve(e,t)),r&&(t=`!${t}`),t}function xBe(t,e,{cwd:r}){let o=e.trim();o===""||o[0]==="#"||t.push(dBt(o,{cwd:r}))}function BBe(t,{globalList:e,ignoreLists:r}){let o=qk(t,e.accept);if(o!==0)return o===2;let a=qk(t,e.reject);if(a!==0)return a===1;if(r!==null)for(let n of r){let u=qk(t,n.accept);if(u!==0)return u===2;let A=qk(t,n.reject);if(A!==0)return A===1}return!1}function qk(t,e){let r=e,o=[];for(let a=0;a{await aG(a,{report:p},async()=>{p.reportJson({base:ue.fromPortablePath(a.cwd)});let h=await jk(a);for(let E of h)p.reportInfo(null,ue.fromPortablePath(E)),p.reportJson({location:ue.fromPortablePath(E)});if(!this.dryRun){let E=await lG(a,h),w=ae.createWriteStream(u);E.pipe(w),await new Promise(v=>{w.on("finish",v)})}}),this.dryRun||(p.reportInfo(0,`Package archive generated in ${ye.pretty(r,u,ye.Type.PATH)}`),p.reportJson({output:ue.fromPortablePath(u)}))})).exitCode()}};Lh.paths=[["pack"]],Lh.usage=it.Usage({description:"generate a tarball from the active workspace",details:"\n This command will turn the active workspace into a compressed archive suitable for publishing. The archive will by default be stored at the root of the workspace (`package.tgz`).\n\n If the `-o,---out` is set the archive will be created at the specified path. The `%s` and `%v` variables can be used within the path and will be respectively replaced by the package name and version.\n ",examples:[["Create an archive from the active workspace","yarn pack"],["List the files that would be made part of the workspace's archive","yarn pack --dry-run"],["Name and output the archive in a dedicated folder","yarn pack --out /artifacts/%s-%v.tgz"]]});function mBt(t,{workspace:e}){let r=t.replace("%s",yBt(e)).replace("%v",CBt(e));return ue.toPortablePath(r)}function yBt(t){return t.manifest.name!==null?Y.slugifyIdent(t.manifest.name):"package"}function CBt(t){return t.manifest.version!==null?t.manifest.version:"unknown"}var EBt=["dependencies","devDependencies","peerDependencies"],IBt="workspace:",wBt=(t,e)=>{e.publishConfig&&(e.publishConfig.type&&(e.type=e.publishConfig.type),e.publishConfig.main&&(e.main=e.publishConfig.main),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.module&&(e.module=e.publishConfig.module),e.publishConfig.exports&&(e.exports=e.publishConfig.exports),e.publishConfig.imports&&(e.imports=e.publishConfig.imports),e.publishConfig.bin&&(e.bin=e.publishConfig.bin));let r=t.project;for(let o of EBt)for(let a of t.manifest.getForScope(o).values()){let n=r.tryWorkspaceByDescriptor(a),u=Y.parseRange(a.range);if(u.protocol===IBt)if(n===null){if(r.tryWorkspaceByIdent(a)===null)throw new Vt(21,`${Y.prettyDescriptor(r.configuration,a)}: No local workspace found for this range`)}else{let A;Y.areDescriptorsEqual(a,n.anchoredDescriptor)||u.selector==="*"?A=n.manifest.version??"0.0.0":u.selector==="~"||u.selector==="^"?A=`${u.selector}${n.manifest.version??"0.0.0"}`:A=u.selector;let p=o==="dependencies"?Y.makeDescriptor(a,"unknown"):null,h=p!==null&&t.manifest.ensureDependencyMeta(p).optional?"optionalDependencies":o;e[h][Y.stringifyIdent(a)]=A}}},BBt={hooks:{beforeWorkspacePacking:wBt},commands:[Lh]},vBt=BBt;var OBe=Ie("crypto"),MBe=tt(LBe()),UBe=Ie("url");async function qBt(t,e,{access:r,tag:o,registry:a,gitHead:n}){let u=t.project.configuration,A=t.manifest.name,p=t.manifest.version,h=Y.stringifyIdent(A),E=(0,OBe.createHash)("sha1").update(e).digest("hex"),w=MBe.default.fromData(e).toString();typeof r>"u"&&(t.manifest.publishConfig&&typeof t.manifest.publishConfig.access=="string"?r=t.manifest.publishConfig.access:u.get("npmPublishAccess")!==null?r=u.get("npmPublishAccess"):A.scope?r="restricted":r="public");let v=await BA.genPackageManifest(t),b=`${h}-${p}.tgz`,C=new UBe.URL(`${EA(a)}/${h}/-/${b}`);return{_id:h,_attachments:{[b]:{content_type:"application/octet-stream",data:e.toString("base64"),length:e.length}},name:h,access:r,["dist-tags"]:{[o]:p},versions:{[p]:{...v,_id:`${h}@${p}`,name:h,version:p,gitHead:n,dist:{shasum:E,integrity:w,tarball:C.toString()}}}}}async function jBt(t){try{let{stdout:e}=await Mr.execvp("git",["rev-parse","--revs-only","HEAD"],{cwd:t});return e.trim()===""?void 0:e.trim()}catch{return}}var pG={npmAlwaysAuth:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:"BOOLEAN",default:!1},npmAuthIdent:{description:"Authentication identity for the npm registry (_auth in npm and yarn v1)",type:"SECRET",default:null},npmAuthToken:{description:"Authentication token for the npm registry (_authToken in npm and yarn v1)",type:"SECRET",default:null}},_Be={npmAuditRegistry:{description:"Registry to query for audit reports",type:"STRING",default:null},npmPublishRegistry:{description:"Registry to push packages to",type:"STRING",default:null},npmRegistryServer:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:"STRING",default:"https://registry.yarnpkg.com"}},GBt={configuration:{...pG,..._Be,npmScopes:{description:"Settings per package scope",type:"MAP",valueDefinition:{description:"",type:"SHAPE",properties:{...pG,..._Be}}},npmRegistries:{description:"Settings per registry",type:"MAP",normalizeKeys:EA,valueDefinition:{description:"",type:"SHAPE",properties:{...pG}}}},fetchers:[ZB,yl],resolvers:[$B,ev,tv]},WBt=GBt;var wG={};Yt(wG,{NpmAuditCommand:()=>Mh,NpmInfoCommand:()=>Uh,NpmLoginCommand:()=>_h,NpmLogoutCommand:()=>Hh,NpmPublishCommand:()=>qh,NpmTagAddCommand:()=>Gh,NpmTagListCommand:()=>jh,NpmTagRemoveCommand:()=>Wh,NpmWhoamiCommand:()=>Yh,default:()=>evt,npmAuditUtils:()=>Yk});Ke();_t();var mv=tt(Jo());tl();var Gk=(o=>(o.All="all",o.Production="production",o.Development="development",o))(Gk||{}),Wk=(n=>(n.Info="info",n.Low="low",n.Moderate="moderate",n.High="high",n.Critical="critical",n))(Wk||{});var Yk={};Yt(Yk,{allSeverities:()=>$E,getDependencies:()=>yG,getReportTree:()=>dG,getRequires:()=>mG,isError:()=>gG});Ke();var $E=["info","low","moderate","high","critical"];function qBe(t,e){let r=[],o=new Set,a=u=>{o.has(u)||(o.add(u),r.push(u))};for(let u of e)a(u);let n=new Set;for(;r.length>0;){let u=r.shift(),A=t.storedResolutions.get(u);if(typeof A>"u")throw new Error("Assertion failed: Expected the resolution to have been registered");let p=t.storedPackages.get(A);if(!!p){n.add(u);for(let h of p.dependencies.values())a(h.descriptorHash)}}return n}function YBt(t,e){return new Set([...t].filter(r=>!e.has(r)))}function KBt(t,e,{all:r}){let o=r?t.workspaces:[e],a=o.map(v=>v.manifest),n=new Set(a.map(v=>[...v.dependencies].map(([b,C])=>b)).flat()),u=new Set(a.map(v=>[...v.devDependencies].map(([b,C])=>b)).flat()),A=o.map(v=>[...v.anchoredPackage.dependencies.values()]).flat(),p=A.filter(v=>n.has(v.identHash)).map(v=>v.descriptorHash),h=A.filter(v=>u.has(v.identHash)).map(v=>v.descriptorHash),E=qBe(t,p),w=qBe(t,h);return YBt(w,E)}function jBe(t){let e={};for(let r of t)e[Y.stringifyIdent(r)]=Y.parseRange(r.range).selector;return e}function GBe(t){if(typeof t>"u")return new Set($E);let e=$E.indexOf(t),r=$E.slice(e);return new Set(r)}function VBt(t,e){let r=GBe(e),o={};for(let a of r)o[a]=t[a];return o}function gG(t,e){let r=VBt(t,e);for(let o of Object.keys(r))if(r[o]??0>0)return!0;return!1}function dG(t,e){var n;let r={},o={children:r},a=Object.values(t.advisories);if(e!=null){let u=GBe(e);a=a.filter(A=>u.has(A.severity))}for(let u of Ye.sortMap(a,A=>A.module_name))r[u.module_name]={label:u.module_name,value:ye.tuple(ye.Type.RANGE,u.findings.map(A=>A.version).join(", ")),children:{ID:{label:"ID",value:ye.tuple(ye.Type.NUMBER,u.id)},Issue:{label:"Issue",value:ye.tuple(ye.Type.NO_HINT,u.title)},URL:{label:"URL",value:ye.tuple(ye.Type.URL,u.url)},Severity:{label:"Severity",value:ye.tuple(ye.Type.NO_HINT,u.severity)},["Vulnerable Versions"]:{label:"Vulnerable Versions",value:ye.tuple(ye.Type.RANGE,u.vulnerable_versions)},["Patched Versions"]:{label:"Patched Versions",value:ye.tuple(ye.Type.RANGE,u.patched_versions)},Via:{label:"Via",value:ye.tuple(ye.Type.NO_HINT,Array.from(new Set(u.findings.map(A=>A.paths).flat().map(A=>A.split(">")[0]))).join(", "))},Recommendation:{label:"Recommendation",value:ye.tuple(ye.Type.NO_HINT,(n=u.recommendation)==null?void 0:n.replace(/\n/g," "))}}};return o}function mG(t,e,{all:r,environment:o}){let a=r?t.workspaces:[e],n=["all","production"].includes(o),u=[];if(n)for(let h of a)for(let E of h.manifest.dependencies.values())u.push(E);let A=["all","development"].includes(o),p=[];if(A)for(let h of a)for(let E of h.manifest.devDependencies.values())p.push(E);return jBe([...u,...p].filter(h=>Y.parseRange(h.range).protocol===null))}function yG(t,e,{all:r}){let o=KBt(t,e,{all:r}),a={};for(let n of t.storedPackages.values())a[Y.stringifyIdent(n)]={version:n.version??"0.0.0",integrity:n.identHash,requires:jBe(n.dependencies.values()),dev:o.has(Y.convertLocatorToDescriptor(n).descriptorHash)};return a}var Mh=class extends ct{constructor(){super(...arguments);this.all=fe.Boolean("-A,--all",!1,{description:"Audit dependencies from all workspaces"});this.recursive=fe.Boolean("-R,--recursive",!1,{description:"Audit transitive dependencies as well"});this.environment=fe.String("--environment","all",{description:"Which environments to cover",validator:Gs(Gk)});this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.severity=fe.String("--severity","info",{description:"Minimal severity requested for packages to be displayed",validator:Gs(Wk)});this.excludes=fe.Array("--exclude",[],{description:"Array of glob patterns of packages to exclude from audit"});this.ignores=fe.Array("--ignore",[],{description:"Array of glob patterns of advisory ID's to ignore in the audit report"})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new er(o.cwd,this.context.cwd);await o.restoreInstallState();let n=mG(o,a,{all:this.all,environment:this.environment}),u=yG(o,a,{all:this.all});if(!this.recursive)for(let C of Object.keys(u))Object.prototype.hasOwnProperty.call(n,C)?u[C].requires={}:delete u[C];let A=Array.from(new Set([...r.get("npmAuditExcludePackages"),...this.excludes]));if(A){for(let C of Object.keys(n))mv.default.isMatch(C,A)&&delete n[C];for(let C of Object.keys(u))mv.default.isMatch(C,A)&&delete u[C];for(let C of Object.keys(u))for(let R of Object.keys(u[C].requires))mv.default.isMatch(R,A)&&delete u[C].requires[R]}let p={requires:n,dependencies:u},h=Wn.getAuditRegistry({configuration:r}),E,w=await pA.start({configuration:r,stdout:this.context.stdout},async()=>{E=await an.post("/-/npm/v1/security/audits/quick",p,{authType:an.AuthType.BEST_EFFORT,configuration:r,jsonResponse:!0,registry:h})});if(w.hasErrors())return w.exitCode();let v=Array.from(new Set([...r.get("npmAuditIgnoreAdvisories"),...this.ignores]));if(v){for(let C of Object.keys(E.advisories))if(mv.default.isMatch(C,v)){let R=E.advisories[C],L=0;R.findings.forEach(_=>L+=_.paths.length),E.metadata.vulnerabilities[R.severity]-=L,delete E.advisories[C]}}let b=gG(E.metadata.vulnerabilities,this.severity);return!this.json&&b?(Zo.emitTree(dG(E,this.severity),{configuration:r,json:this.json,stdout:this.context.stdout,separators:2}),1):(await Et.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async C=>{C.reportJson(E),b||C.reportInfo(1,"No audit suggestions")}),b?1:0)}};Mh.paths=[["npm","audit"]],Mh.usage=it.Usage({description:"perform a vulnerability audit against the installed packages",details:` + This command checks for known security reports on the packages you use. The reports are by default extracted from the npm registry, and may or may not be relevant to your actual program (not all vulnerabilities affect all code paths). + + For consistency with our other commands the default is to only check the direct dependencies for the active workspace. To extend this search to all workspaces, use \`-A,--all\`. To extend this search to both direct and transitive dependencies, use \`-R,--recursive\`. + + Applying the \`--severity\` flag will limit the audit table to vulnerabilities of the corresponding severity and above. Valid values are ${$E.map(r=>`\`${r}\``).join(", ")}. + + If the \`--json\` flag is set, Yarn will print the output exactly as received from the registry. Regardless of this flag, the process will exit with a non-zero exit code if a report is found for the selected packages. + + If certain packages produce false positives for a particular environment, the \`--exclude\` flag can be used to exclude any number of packages from the audit. This can also be set in the configuration file with the \`npmAuditExcludePackages\` option. + + If particular advisories are needed to be ignored, the \`--ignore\` flag can be used with Advisory ID's to ignore any number of advisories in the audit report. This can also be set in the configuration file with the \`npmAuditIgnoreAdvisories\` option. + + To understand the dependency tree requiring vulnerable packages, check the raw report with the \`--json\` flag or use \`yarn why \` to get more information as to who depends on them. + `,examples:[["Checks for known security issues with the installed packages. The output is a list of known issues.","yarn npm audit"],["Audit dependencies in all workspaces","yarn npm audit --all"],["Limit auditing to `dependencies` (excludes `devDependencies`)","yarn npm audit --environment production"],["Show audit report as valid JSON","yarn npm audit --json"],["Audit all direct and transitive dependencies","yarn npm audit --recursive"],["Output moderate (or more severe) vulnerabilities","yarn npm audit --severity moderate"],["Exclude certain packages","yarn npm audit --exclude package1 --exclude package2"],["Ignore specific advisories","yarn npm audit --ignore 1234567 --ignore 7654321"]]});Ke();Ke();bt();_t();var CG=tt(si()),EG=Ie("util"),Uh=class extends ct{constructor(){super(...arguments);this.fields=fe.String("-f,--fields",{description:"A comma-separated list of manifest fields that should be displayed"});this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.packages=fe.Rest()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd),a=typeof this.fields<"u"?new Set(["name",...this.fields.split(/\s*,\s*/)]):null,n=[],u=!1,A=await Et.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async p=>{for(let h of this.packages){let E;if(h==="."){let oe=o.topLevelWorkspace;if(!oe.manifest.name)throw new ot(`Missing ${ye.pretty(r,"name",ye.Type.CODE)} field in ${ue.fromPortablePath(z.join(oe.cwd,Lr.manifest))}`);E=Y.makeDescriptor(oe.manifest.name,"unknown")}else E=Y.parseDescriptor(h);let w=an.getIdentUrl(E),v=IG(await an.get(w,{configuration:r,ident:E,jsonResponse:!0,customErrorMessage:an.customPackageError})),b=Object.keys(v.versions).sort(CG.default.compareLoose),R=v["dist-tags"].latest||b[b.length-1],L=Tr.validRange(E.range);if(L){let oe=CG.default.maxSatisfying(b,L);oe!==null?R=oe:(p.reportWarning(0,`Unmet range ${Y.prettyRange(r,E.range)}; falling back to the latest version`),u=!0)}else Object.prototype.hasOwnProperty.call(v["dist-tags"],E.range)?R=v["dist-tags"][E.range]:E.range!=="unknown"&&(p.reportWarning(0,`Unknown tag ${Y.prettyRange(r,E.range)}; falling back to the latest version`),u=!0);let _=v.versions[R],V={...v,..._,version:R,versions:b},re;if(a!==null){re={};for(let oe of a){let pe=V[oe];if(typeof pe<"u")re[oe]=pe;else{p.reportWarning(1,`The ${ye.pretty(r,oe,ye.Type.CODE)} field doesn't exist inside ${Y.prettyIdent(r,E)}'s information`),u=!0;continue}}}else this.json||(delete V.dist,delete V.readme,delete V.users),re=V;p.reportJson(re),this.json||n.push(re)}});EG.inspect.styles.name="cyan";for(let p of n)(p!==n[0]||u)&&this.context.stdout.write(` +`),this.context.stdout.write(`${(0,EG.inspect)(p,{depth:1/0,colors:!0,compact:!1})} +`);return A.exitCode()}};Uh.paths=[["npm","info"]],Uh.usage=it.Usage({category:"Npm-related commands",description:"show information about a package",details:"\n This command fetches information about a package from the npm registry and prints it in a tree format.\n\n The package does not have to be installed locally, but needs to have been published (in particular, local changes will be ignored even for workspaces).\n\n Append `@` to the package argument to provide information specific to the latest version that satisfies the range or to the corresponding tagged version. If the range is invalid or if there is no version satisfying the range, the command will print a warning and fall back to the latest version.\n\n If the `-f,--fields` option is set, it's a comma-separated list of fields which will be used to only display part of the package information.\n\n By default, this command won't return the `dist`, `readme`, and `users` fields, since they are often very long. To explicitly request those fields, explicitly list them with the `--fields` flag or request the output in JSON mode.\n ",examples:[["Show all available information about react (except the `dist`, `readme`, and `users` fields)","yarn npm info react"],["Show all available information about react as valid JSON (including the `dist`, `readme`, and `users` fields)","yarn npm info react --json"],["Show all available information about react@16.12.0","yarn npm info react@16.12.0"],["Show all available information about react@next","yarn npm info react@next"],["Show the description of react","yarn npm info react --fields description"],["Show all available versions of react","yarn npm info react --fields versions"],["Show the readme of react","yarn npm info react --fields readme"],["Show a few fields of react","yarn npm info react --fields homepage,repository"]]});function IG(t){if(Array.isArray(t)){let e=[];for(let r of t)r=IG(r),r&&e.push(r);return e}else if(typeof t=="object"&&t!==null){let e={};for(let r of Object.keys(t)){if(r.startsWith("_"))continue;let o=IG(t[r]);o&&(e[r]=o)}return e}else return t||null}Ke();Ke();_t();var WBe=tt(z1()),_h=class extends ct{constructor(){super(...arguments);this.scope=fe.String("-s,--scope",{description:"Login to the registry configured for a given scope"});this.publish=fe.Boolean("--publish",!1,{description:"Login to the publish registry"})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),o=await Kk({configuration:r,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await Et.start({configuration:r,stdout:this.context.stdout,includeFooter:!1},async n=>{let u=await zBt({configuration:r,registry:o,report:n,stdin:this.context.stdin,stdout:this.context.stdout}),A=`/-/user/org.couchdb.user:${encodeURIComponent(u.name)}`,p=await an.put(A,u,{attemptedAs:u.name,configuration:r,registry:o,jsonResponse:!0,authType:an.AuthType.NO_AUTH});return await JBt(o,p.token,{configuration:r,scope:this.scope}),n.reportInfo(0,"Successfully logged in")})).exitCode()}};_h.paths=[["npm","login"]],_h.usage=it.Usage({category:"Npm-related commands",description:"store new login info to access the npm registry",details:"\n This command will ask you for your username, password, and 2FA One-Time-Password (when it applies). It will then modify your local configuration (in your home folder, never in the project itself) to reference the new tokens thus generated.\n\n Adding the `-s,--scope` flag will cause the authentication to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the authentication to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n ",examples:[["Login to the default registry","yarn npm login"],["Login to the registry linked to the @my-scope registry","yarn npm login --scope my-scope"],["Login to the publish registry for the current package","yarn npm login --publish"]]});async function Kk({scope:t,publish:e,configuration:r,cwd:o}){return t&&e?Wn.getScopeRegistry(t,{configuration:r,type:Wn.RegistryType.PUBLISH_REGISTRY}):t?Wn.getScopeRegistry(t,{configuration:r}):e?Wn.getPublishRegistry((await cE(r,o)).manifest,{configuration:r}):Wn.getDefaultRegistry({configuration:r})}async function JBt(t,e,{configuration:r,scope:o}){let a=u=>A=>{let p=Ye.isIndexableObject(A)?A:{},h=p[u],E=Ye.isIndexableObject(h)?h:{};return{...p,[u]:{...E,npmAuthToken:e}}},n=o?{npmScopes:a(o)}:{npmRegistries:a(t)};return await Xe.updateHomeConfiguration(n)}async function zBt({configuration:t,registry:e,report:r,stdin:o,stdout:a}){r.reportInfo(0,`Logging in to ${ye.pretty(t,e,ye.Type.URL)}`);let n=!1;if(e.match(/^https:\/\/npm\.pkg\.github\.com(\/|$)/)&&(r.reportInfo(0,"You seem to be using the GitHub Package Registry. Tokens must be generated with the 'repo', 'write:packages', and 'read:packages' permissions."),n=!0),r.reportSeparator(),process.env.YARN_IS_TEST_ENV)return{name:process.env.YARN_INJECT_NPM_USER||"",password:process.env.YARN_INJECT_NPM_PASSWORD||""};let{username:u,password:A}=await(0,WBe.prompt)([{type:"input",name:"username",message:"Username:",required:!0,onCancel:()=>process.exit(130),stdin:o,stdout:a},{type:"password",name:"password",message:n?"Token:":"Password:",required:!0,onCancel:()=>process.exit(130),stdin:o,stdout:a}]);return r.reportSeparator(),{name:u,password:A}}Ke();Ke();_t();var eI=new Set(["npmAuthIdent","npmAuthToken"]),Hh=class extends ct{constructor(){super(...arguments);this.scope=fe.String("-s,--scope",{description:"Logout of the registry configured for a given scope"});this.publish=fe.Boolean("--publish",!1,{description:"Logout of the publish registry"});this.all=fe.Boolean("-A,--all",!1,{description:"Logout of all registries"})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),o=async()=>{let n=await Kk({configuration:r,cwd:this.context.cwd,publish:this.publish,scope:this.scope}),u=await Xe.find(this.context.cwd,this.context.plugins),A=Y.makeIdent(this.scope??null,"pkg");return!Wn.getAuthConfiguration(n,{configuration:u,ident:A}).get("npmAuthToken")};return(await Et.start({configuration:r,stdout:this.context.stdout},async n=>{if(this.all&&(await ZBt(),n.reportInfo(0,"Successfully logged out from everything")),this.scope){await YBe("npmScopes",this.scope),await o()?n.reportInfo(0,`Successfully logged out from ${this.scope}`):n.reportWarning(0,"Scope authentication settings removed, but some other ones settings still apply to it");return}let u=await Kk({configuration:r,cwd:this.context.cwd,publish:this.publish});await YBe("npmRegistries",u),await o()?n.reportInfo(0,`Successfully logged out from ${u}`):n.reportWarning(0,"Registry authentication settings removed, but some other ones settings still apply to it")})).exitCode()}};Hh.paths=[["npm","logout"]],Hh.usage=it.Usage({category:"Npm-related commands",description:"logout of the npm registry",details:"\n This command will log you out by modifying your local configuration (in your home folder, never in the project itself) to delete all credentials linked to a registry.\n\n Adding the `-s,--scope` flag will cause the deletion to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the deletion to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n\n Adding the `-A,--all` flag will cause the deletion to be done against all registries and scopes.\n ",examples:[["Logout of the default registry","yarn npm logout"],["Logout of the @my-scope scope","yarn npm logout --scope my-scope"],["Logout of the publish registry for the current package","yarn npm logout --publish"],["Logout of all registries","yarn npm logout --all"]]});function XBt(t,e){let r=t[e];if(!Ye.isIndexableObject(r))return!1;let o=new Set(Object.keys(r));if([...eI].every(n=>!o.has(n)))return!1;for(let n of eI)o.delete(n);if(o.size===0)return t[e]=void 0,!0;let a={...r};for(let n of eI)delete a[n];return t[e]=a,!0}async function ZBt(){let t=e=>{let r=!1,o=Ye.isIndexableObject(e)?{...e}:{};o.npmAuthToken&&(delete o.npmAuthToken,r=!0);for(let a of Object.keys(o))XBt(o,a)&&(r=!0);if(Object.keys(o).length!==0)return r?o:e};return await Xe.updateHomeConfiguration({npmRegistries:t,npmScopes:t})}async function YBe(t,e){return await Xe.updateHomeConfiguration({[t]:r=>{let o=Ye.isIndexableObject(r)?r:{};if(!Object.prototype.hasOwnProperty.call(o,e))return r;let a=o[e],n=Ye.isIndexableObject(a)?a:{},u=new Set(Object.keys(n));if([...eI].every(p=>!u.has(p)))return r;for(let p of eI)u.delete(p);if(u.size===0)return Object.keys(o).length===1?void 0:{...o,[e]:void 0};let A={};for(let p of eI)A[p]=void 0;return{...o,[e]:{...n,...A}}}})}Ke();_t();var qh=class extends ct{constructor(){super(...arguments);this.access=fe.String("--access",{description:"The access for the published package (public or restricted)"});this.tag=fe.String("--tag","latest",{description:"The tag on the registry that the package should be attached to"});this.tolerateRepublish=fe.Boolean("--tolerate-republish",!1,{description:"Warn and exit when republishing an already existing version of a package"});this.otp=fe.String("--otp",{description:"The OTP token to use with the command"})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new er(o.cwd,this.context.cwd);if(a.manifest.private)throw new ot("Private workspaces cannot be published");if(a.manifest.name===null||a.manifest.version===null)throw new ot("Workspaces must have valid names and versions to be published on an external registry");await o.restoreInstallState();let n=a.manifest.name,u=a.manifest.version,A=Wn.getPublishRegistry(a.manifest,{configuration:r});return(await Et.start({configuration:r,stdout:this.context.stdout},async h=>{var E,w;if(this.tolerateRepublish)try{let v=await an.get(an.getIdentUrl(n),{configuration:r,registry:A,ident:n,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(v,"versions"))throw new Vt(15,'Registry returned invalid data for - missing "versions" field');if(Object.prototype.hasOwnProperty.call(v.versions,u)){h.reportWarning(0,`Registry already knows about version ${u}; skipping.`);return}}catch(v){if(((w=(E=v.originalError)==null?void 0:E.response)==null?void 0:w.statusCode)!==404)throw v}await sn.maybeExecuteWorkspaceLifecycleScript(a,"prepublish",{report:h}),await BA.prepareForPack(a,{report:h},async()=>{let v=await BA.genPackList(a);for(let _ of v)h.reportInfo(null,_);let b=await BA.genPackStream(a,v),C=await Ye.bufferStream(b),R=await ZE.getGitHead(a.cwd),L=await ZE.makePublishBody(a,C,{access:this.access,tag:this.tag,registry:A,gitHead:R});await an.put(an.getIdentUrl(n),L,{configuration:r,registry:A,ident:n,otp:this.otp,jsonResponse:!0})}),h.reportInfo(0,"Package archive published")})).exitCode()}};qh.paths=[["npm","publish"]],qh.usage=it.Usage({category:"Npm-related commands",description:"publish the active workspace to the npm registry",details:'\n This command will pack the active workspace into a fresh archive and upload it to the npm registry.\n\n The package will by default be attached to the `latest` tag on the registry, but this behavior can be overriden by using the `--tag` option.\n\n Note that for legacy reasons scoped packages are by default published with an access set to `restricted` (aka "private packages"). This requires you to register for a paid npm plan. In case you simply wish to publish a public scoped package to the registry (for free), just add the `--access public` flag. This behavior can be enabled by default through the `npmPublishAccess` settings.\n ',examples:[["Publish the active workspace","yarn npm publish"]]});Ke();_t();var KBe=tt(si());Ke();bt();_t();var jh=class extends ct{constructor(){super(...arguments);this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=fe.String({required:!1})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n;if(typeof this.package<"u")n=Y.parseIdent(this.package);else{if(!a)throw new er(o.cwd,this.context.cwd);if(!a.manifest.name)throw new ot(`Missing 'name' field in ${ue.fromPortablePath(z.join(a.cwd,Lr.manifest))}`);n=a.manifest.name}let u=await yv(n,r),p={children:Ye.sortMap(Object.entries(u),([h])=>h).map(([h,E])=>({value:ye.tuple(ye.Type.RESOLUTION,{descriptor:Y.makeDescriptor(n,h),locator:Y.makeLocator(n,E)})}))};return Zo.emitTree(p,{configuration:r,json:this.json,stdout:this.context.stdout})}};jh.paths=[["npm","tag","list"]],jh.usage=it.Usage({category:"Npm-related commands",description:"list all dist-tags of a package",details:` + This command will list all tags of a package from the npm registry. + + If the package is not specified, Yarn will default to the current workspace. + `,examples:[["List all tags of package `my-pkg`","yarn npm tag list my-pkg"]]});async function yv(t,e){let r=`/-/package${an.getIdentUrl(t)}/dist-tags`;return an.get(r,{configuration:e,ident:t,jsonResponse:!0,customErrorMessage:an.customPackageError})}var Gh=class extends ct{constructor(){super(...arguments);this.package=fe.String();this.tag=fe.String()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new er(o.cwd,this.context.cwd);let n=Y.parseDescriptor(this.package,!0),u=n.range;if(!KBe.default.valid(u))throw new ot(`The range ${ye.pretty(r,n.range,ye.Type.RANGE)} must be a valid semver version`);let A=Wn.getPublishRegistry(a.manifest,{configuration:r}),p=ye.pretty(r,n,ye.Type.IDENT),h=ye.pretty(r,u,ye.Type.RANGE),E=ye.pretty(r,this.tag,ye.Type.CODE);return(await Et.start({configuration:r,stdout:this.context.stdout},async v=>{let b=await yv(n,r);Object.prototype.hasOwnProperty.call(b,this.tag)&&b[this.tag]===u&&v.reportWarning(0,`Tag ${E} is already set to version ${h}`);let C=`/-/package${an.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await an.put(C,u,{configuration:r,registry:A,ident:n,jsonRequest:!0,jsonResponse:!0}),v.reportInfo(0,`Tag ${E} added to version ${h} of package ${p}`)})).exitCode()}};Gh.paths=[["npm","tag","add"]],Gh.usage=it.Usage({category:"Npm-related commands",description:"add a tag for a specific version of a package",details:` + This command will add a tag to the npm registry for a specific version of a package. If the tag already exists, it will be overwritten. + `,examples:[["Add a `beta` tag for version `2.3.4-beta.4` of package `my-pkg`","yarn npm tag add my-pkg@2.3.4-beta.4 beta"]]});Ke();_t();var Wh=class extends ct{constructor(){super(...arguments);this.package=fe.String();this.tag=fe.String()}async execute(){if(this.tag==="latest")throw new ot("The 'latest' tag cannot be removed.");let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new er(o.cwd,this.context.cwd);let n=Y.parseIdent(this.package),u=Wn.getPublishRegistry(a.manifest,{configuration:r}),A=ye.pretty(r,this.tag,ye.Type.CODE),p=ye.pretty(r,n,ye.Type.IDENT),h=await yv(n,r);if(!Object.prototype.hasOwnProperty.call(h,this.tag))throw new ot(`${A} is not a tag of package ${p}`);return(await Et.start({configuration:r,stdout:this.context.stdout},async w=>{let v=`/-/package${an.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await an.del(v,{configuration:r,registry:u,ident:n,jsonResponse:!0}),w.reportInfo(0,`Tag ${A} removed from package ${p}`)})).exitCode()}};Wh.paths=[["npm","tag","remove"]],Wh.usage=it.Usage({category:"Npm-related commands",description:"remove a tag from a package",details:` + This command will remove a tag from a package from the npm registry. + `,examples:[["Remove the `beta` tag from package `my-pkg`","yarn npm tag remove my-pkg beta"]]});Ke();Ke();_t();var Yh=class extends ct{constructor(){super(...arguments);this.scope=fe.String("-s,--scope",{description:"Print username for the registry configured for a given scope"});this.publish=fe.Boolean("--publish",!1,{description:"Print username for the publish registry"})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),o;return this.scope&&this.publish?o=Wn.getScopeRegistry(this.scope,{configuration:r,type:Wn.RegistryType.PUBLISH_REGISTRY}):this.scope?o=Wn.getScopeRegistry(this.scope,{configuration:r}):this.publish?o=Wn.getPublishRegistry((await cE(r,this.context.cwd)).manifest,{configuration:r}):o=Wn.getDefaultRegistry({configuration:r}),(await Et.start({configuration:r,stdout:this.context.stdout},async n=>{var A,p;let u;try{u=await an.get("/-/whoami",{configuration:r,registry:o,authType:an.AuthType.ALWAYS_AUTH,jsonResponse:!0,ident:this.scope?Y.makeIdent(this.scope,""):void 0})}catch(h){if(((A=h.response)==null?void 0:A.statusCode)===401||((p=h.response)==null?void 0:p.statusCode)===403){n.reportError(41,"Authentication failed - your credentials may have expired");return}else throw h}n.reportInfo(0,u.username)})).exitCode()}};Yh.paths=[["npm","whoami"]],Yh.usage=it.Usage({category:"Npm-related commands",description:"display the name of the authenticated user",details:"\n Print the username associated with the current authentication settings to the standard output.\n\n When using `-s,--scope`, the username printed will be the one that matches the authentication settings of the registry associated with the given scope (those settings can be overriden using the `npmRegistries` map, and the registry associated with the scope is configured via the `npmScopes` map).\n\n When using `--publish`, the registry we'll select will by default be the one used when publishing packages (`publishConfig.registry` or `npmPublishRegistry` if available, otherwise we'll fallback to the regular `npmRegistryServer`).\n ",examples:[["Print username for the default registry","yarn npm whoami"],["Print username for the registry on a given scope","yarn npm whoami --scope company"]]});var $Bt={configuration:{npmPublishAccess:{description:"Default access of the published packages",type:"STRING",default:null},npmAuditExcludePackages:{description:"Array of glob patterns of packages to exclude from npm audit",type:"STRING",default:[],isArray:!0},npmAuditIgnoreAdvisories:{description:"Array of glob patterns of advisory IDs to exclude from npm audit",type:"STRING",default:[],isArray:!0}},commands:[Mh,Uh,_h,Hh,qh,Gh,jh,Wh,Yh]},evt=$Bt;var bG={};Yt(bG,{PatchCommand:()=>Jh,PatchCommitCommand:()=>Vh,PatchFetcher:()=>Bv,PatchResolver:()=>vv,default:()=>yvt,patchUtils:()=>Pm});Ke();Ke();bt();_c();var Pm={};Yt(Pm,{applyPatchFile:()=>Jk,diffFolders:()=>PG,ensureUnpatchedDescriptor:()=>BG,ensureUnpatchedLocator:()=>Xk,extractPackageToDisk:()=>SG,extractPatchFlags:()=>eve,isParentRequired:()=>DG,isPatchDescriptor:()=>zk,isPatchLocator:()=>Kh,loadPatchFiles:()=>wv,makeDescriptor:()=>Zk,makeLocator:()=>vG,makePatchHash:()=>xG,parseDescriptor:()=>Ev,parseLocator:()=>Iv,parsePatchFile:()=>Cv,unpatchDescriptor:()=>gvt,unpatchLocator:()=>dvt});Ke();bt();Ke();bt();var tvt=/^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@.*/;function tI(t){return z.relative(wt.root,z.resolve(wt.root,ue.toPortablePath(t)))}function rvt(t){let e=t.trim().match(tvt);if(!e)throw new Error(`Bad header line: '${t}'`);return{original:{start:Math.max(Number(e[1]),1),length:Number(e[3]||1)},patched:{start:Math.max(Number(e[4]),1),length:Number(e[6]||1)}}}var nvt=420,ivt=493;var VBe=()=>({semverExclusivity:null,diffLineFromPath:null,diffLineToPath:null,oldMode:null,newMode:null,deletedFileMode:null,newFileMode:null,renameFrom:null,renameTo:null,beforeHash:null,afterHash:null,fromPath:null,toPath:null,hunks:null}),svt=t=>({header:rvt(t),parts:[]}),ovt={["@"]:"header",["-"]:"deletion",["+"]:"insertion",[" "]:"context",["\\"]:"pragma",undefined:"context"};function avt(t){let e=[],r=VBe(),o="parsing header",a=null,n=null;function u(){a&&(n&&(a.parts.push(n),n=null),r.hunks.push(a),a=null)}function A(){u(),e.push(r),r=VBe()}for(let p=0;p0?"patch":"mode change",V=null;switch(_){case"rename":{if(!E||!w)throw new Error("Bad parser state: rename from & to not given");e.push({type:"rename",semverExclusivity:o,fromPath:tI(E),toPath:tI(w)}),V=w}break;case"file deletion":{let re=a||C;if(!re)throw new Error("Bad parse state: no path given for file deletion");e.push({type:"file deletion",semverExclusivity:o,hunk:L&&L[0]||null,path:tI(re),mode:Vk(p),hash:v})}break;case"file creation":{let re=n||R;if(!re)throw new Error("Bad parse state: no path given for file creation");e.push({type:"file creation",semverExclusivity:o,hunk:L&&L[0]||null,path:tI(re),mode:Vk(h),hash:b})}break;case"patch":case"mode change":V=R||n;break;default:Ye.assertNever(_);break}V&&u&&A&&u!==A&&e.push({type:"mode change",semverExclusivity:o,path:tI(V),oldMode:Vk(u),newMode:Vk(A)}),V&&L&&L.length&&e.push({type:"patch",semverExclusivity:o,path:tI(V),hunks:L,beforeHash:v,afterHash:b})}if(e.length===0)throw new Error("Unable to parse patch file: No changes found. Make sure the patch is a valid UTF8 encoded string");return e}function Vk(t){let e=parseInt(t,8)&511;if(e!==nvt&&e!==ivt)throw new Error(`Unexpected file mode string: ${t}`);return e}function Cv(t){let e=t.split(/\n/g);return e[e.length-1]===""&&e.pop(),lvt(avt(e))}function cvt(t){let e=0,r=0;for(let{type:o,lines:a}of t.parts)switch(o){case"context":r+=a.length,e+=a.length;break;case"deletion":e+=a.length;break;case"insertion":r+=a.length;break;default:Ye.assertNever(o);break}if(e!==t.header.original.length||r!==t.header.patched.length){let o=a=>a<0?a:`+${a}`;throw new Error(`hunk header integrity check failed (expected @@ ${o(t.header.original.length)} ${o(t.header.patched.length)} @@, got @@ ${o(e)} ${o(r)} @@)`)}}Ke();bt();var rI=class extends Error{constructor(r,o){super(`Cannot apply hunk #${r+1}`);this.hunk=o}};async function nI(t,e,r){let o=await t.lstatPromise(e),a=await r();typeof a<"u"&&(e=a),await t.lutimesPromise(e,o.atime,o.mtime)}async function Jk(t,{baseFs:e=new xn,dryRun:r=!1,version:o=null}={}){for(let a of t)if(!(a.semverExclusivity!==null&&o!==null&&!Tr.satisfiesWithPrereleases(o,a.semverExclusivity)))switch(a.type){case"file deletion":if(r){if(!e.existsSync(a.path))throw new Error(`Trying to delete a file that doesn't exist: ${a.path}`)}else await nI(e,z.dirname(a.path),async()=>{await e.unlinkPromise(a.path)});break;case"rename":if(r){if(!e.existsSync(a.fromPath))throw new Error(`Trying to move a file that doesn't exist: ${a.fromPath}`)}else await nI(e,z.dirname(a.fromPath),async()=>{await nI(e,z.dirname(a.toPath),async()=>{await nI(e,a.fromPath,async()=>(await e.movePromise(a.fromPath,a.toPath),a.toPath))})});break;case"file creation":if(r){if(e.existsSync(a.path))throw new Error(`Trying to create a file that already exists: ${a.path}`)}else{let n=a.hunk?a.hunk.parts[0].lines.join(` +`)+(a.hunk.parts[0].noNewlineAtEndOfFile?"":` +`):"";await e.mkdirpPromise(z.dirname(a.path),{chmod:493,utimes:[Ii.SAFE_TIME,Ii.SAFE_TIME]}),await e.writeFilePromise(a.path,n,{mode:a.mode}),await e.utimesPromise(a.path,Ii.SAFE_TIME,Ii.SAFE_TIME)}break;case"patch":await nI(e,a.path,async()=>{await fvt(a,{baseFs:e,dryRun:r})});break;case"mode change":{let u=(await e.statPromise(a.path)).mode;if(JBe(a.newMode)!==JBe(u))continue;await nI(e,a.path,async()=>{await e.chmodPromise(a.path,a.newMode)})}break;default:Ye.assertNever(a);break}}function JBe(t){return(t&64)>0}function zBe(t){return t.replace(/\s+$/,"")}function Avt(t,e){return zBe(t)===zBe(e)}async function fvt({hunks:t,path:e},{baseFs:r,dryRun:o=!1}){let a=await r.statSync(e).mode,u=(await r.readFileSync(e,"utf8")).split(/\n/),A=[],p=0,h=0;for(let w of t){let v=Math.max(h,w.header.patched.start+p),b=Math.max(0,v-h),C=Math.max(0,u.length-v-w.header.original.length),R=Math.max(b,C),L=0,_=0,V=null;for(;L<=R;){if(L<=b&&(_=v-L,V=XBe(w,u,_),V!==null)){L=-L;break}if(L<=C&&(_=v+L,V=XBe(w,u,_),V!==null))break;L+=1}if(V===null)throw new rI(t.indexOf(w),w);A.push(V),p+=L,h=_+w.header.original.length}if(o)return;let E=0;for(let w of A)for(let v of w)switch(v.type){case"splice":{let b=v.index+E;u.splice(b,v.numToDelete,...v.linesToInsert),E+=v.linesToInsert.length-v.numToDelete}break;case"pop":u.pop();break;case"push":u.push(v.line);break;default:Ye.assertNever(v);break}await r.writeFilePromise(e,u.join(` +`),{mode:a})}function XBe(t,e,r){let o=[];for(let a of t.parts)switch(a.type){case"context":case"deletion":{for(let n of a.lines){let u=e[r];if(u==null||!Avt(u,n))return null;r+=1}a.type==="deletion"&&(o.push({type:"splice",index:r-a.lines.length,numToDelete:a.lines.length,linesToInsert:[]}),a.noNewlineAtEndOfFile&&o.push({type:"push",line:""}))}break;case"insertion":o.push({type:"splice",index:r,numToDelete:0,linesToInsert:a.lines}),a.noNewlineAtEndOfFile&&o.push({type:"pop"});break;default:Ye.assertNever(a.type);break}return o}var hvt=/^builtin<([^>]+)>$/;function iI(t,e){let{protocol:r,source:o,selector:a,params:n}=Y.parseRange(t);if(r!=="patch:")throw new Error("Invalid patch range");if(o===null)throw new Error("Patch locators must explicitly define their source");let u=a?a.split(/&/).map(E=>ue.toPortablePath(E)):[],A=n&&typeof n.locator=="string"?Y.parseLocator(n.locator):null,p=n&&typeof n.version=="string"?n.version:null,h=e(o);return{parentLocator:A,sourceItem:h,patchPaths:u,sourceVersion:p}}function zk(t){return t.range.startsWith("patch:")}function Kh(t){return t.reference.startsWith("patch:")}function Ev(t){let{sourceItem:e,...r}=iI(t.range,Y.parseDescriptor);return{...r,sourceDescriptor:e}}function Iv(t){let{sourceItem:e,...r}=iI(t.reference,Y.parseLocator);return{...r,sourceLocator:e}}function gvt(t){let{sourceItem:e}=iI(t.range,Y.parseDescriptor);return e}function dvt(t){let{sourceItem:e}=iI(t.reference,Y.parseLocator);return e}function BG(t){if(!zk(t))return t;let{sourceItem:e}=iI(t.range,Y.parseDescriptor);return e}function Xk(t){if(!Kh(t))return t;let{sourceItem:e}=iI(t.reference,Y.parseLocator);return e}function ZBe({parentLocator:t,sourceItem:e,patchPaths:r,sourceVersion:o,patchHash:a},n){let u=t!==null?{locator:Y.stringifyLocator(t)}:{},A=typeof o<"u"?{version:o}:{},p=typeof a<"u"?{hash:a}:{};return Y.makeRange({protocol:"patch:",source:n(e),selector:r.join("&"),params:{...A,...p,...u}})}function Zk(t,{parentLocator:e,sourceDescriptor:r,patchPaths:o}){return Y.makeDescriptor(t,ZBe({parentLocator:e,sourceItem:r,patchPaths:o},Y.stringifyDescriptor))}function vG(t,{parentLocator:e,sourcePackage:r,patchPaths:o,patchHash:a}){return Y.makeLocator(t,ZBe({parentLocator:e,sourceItem:r,sourceVersion:r.version,patchPaths:o,patchHash:a},Y.stringifyLocator))}function $Be({onAbsolute:t,onRelative:e,onProject:r,onBuiltin:o},a){let n=a.lastIndexOf("!");n!==-1&&(a=a.slice(n+1));let u=a.match(hvt);return u!==null?o(u[1]):a.startsWith("~/")?r(a.slice(2)):z.isAbsolute(a)?t(a):e(a)}function eve(t){let e=t.lastIndexOf("!");return{optional:(e!==-1?new Set(t.slice(0,e).split(/!/)):new Set).has("optional")}}function DG(t){return $Be({onAbsolute:()=>!1,onRelative:()=>!0,onProject:()=>!1,onBuiltin:()=>!1},t)}async function wv(t,e,r){let o=t!==null?await r.fetcher.fetch(t,r):null,a=o&&o.localPath?{packageFs:new An(wt.root),prefixPath:z.relative(wt.root,o.localPath)}:o;o&&o!==a&&o.releaseFs&&o.releaseFs();let n=await Ye.releaseAfterUseAsync(async()=>await Promise.all(e.map(async u=>{let A=eve(u),p=await $Be({onAbsolute:async h=>await ae.readFilePromise(h,"utf8"),onRelative:async h=>{if(a===null)throw new Error("Assertion failed: The parent locator should have been fetched");return await a.packageFs.readFilePromise(z.join(a.prefixPath,h),"utf8")},onProject:async h=>await ae.readFilePromise(z.join(r.project.cwd,h),"utf8"),onBuiltin:async h=>await r.project.configuration.firstHook(E=>E.getBuiltinPatch,r.project,h)},u);return{...A,source:p}})));for(let u of n)typeof u.source=="string"&&(u.source=u.source.replace(/\r\n?/g,` +`));return n}async function SG(t,{cache:e,project:r}){let o=r.storedPackages.get(t.locatorHash);if(typeof o>"u")throw new Error("Assertion failed: Expected the package to be registered");let a=Xk(t),n=r.storedChecksums,u=new xi,A=await ae.mktempPromise(),p=z.join(A,"source"),h=z.join(A,"user"),E=z.join(A,".yarn-patch.json"),w=r.configuration.makeFetcher(),v=[];try{let b,C;if(t.locatorHash===a.locatorHash){let R=await w.fetch(t,{cache:e,project:r,fetcher:w,checksums:n,report:u});v.push(()=>{var L;return(L=R.releaseFs)==null?void 0:L.call(R)}),b=R,C=R}else b=await w.fetch(t,{cache:e,project:r,fetcher:w,checksums:n,report:u}),v.push(()=>{var R;return(R=b.releaseFs)==null?void 0:R.call(b)}),C=await w.fetch(t,{cache:e,project:r,fetcher:w,checksums:n,report:u}),v.push(()=>{var R;return(R=C.releaseFs)==null?void 0:R.call(C)});await Promise.all([ae.copyPromise(p,b.prefixPath,{baseFs:b.packageFs}),ae.copyPromise(h,C.prefixPath,{baseFs:C.packageFs}),ae.writeJsonPromise(E,{locator:Y.stringifyLocator(t),version:o.version})])}finally{for(let b of v)b()}return ae.detachTemp(A),h}async function PG(t,e){let r=ue.fromPortablePath(t).replace(/\\/g,"/"),o=ue.fromPortablePath(e).replace(/\\/g,"/"),{stdout:a,stderr:n}=await Mr.execvp("git",["-c","core.safecrlf=false","diff","--src-prefix=a/","--dst-prefix=b/","--ignore-cr-at-eol","--full-index","--no-index","--no-renames","--text",r,o],{cwd:ue.toPortablePath(process.cwd()),env:{...process.env,GIT_CONFIG_NOSYSTEM:"1",HOME:"",XDG_CONFIG_HOME:"",USERPROFILE:""}});if(n.length>0)throw new Error(`Unable to diff directories. Make sure you have a recent version of 'git' available in PATH. +The following error was reported by 'git': +${n}`);let u=r.startsWith("/")?A=>A.slice(1):A=>A;return a.replace(new RegExp(`(a|b)(${Ye.escapeRegExp(`/${u(r)}/`)})`,"g"),"$1/").replace(new RegExp(`(a|b)${Ye.escapeRegExp(`/${u(o)}/`)}`,"g"),"$1/").replace(new RegExp(Ye.escapeRegExp(`${r}/`),"g"),"").replace(new RegExp(Ye.escapeRegExp(`${o}/`),"g"),"")}function xG(t,e){let r=[];for(let{source:o}of t){if(o===null)continue;let a=Cv(o);for(let n of a){let{semverExclusivity:u,...A}=n;u!==null&&e!==null&&!Tr.satisfiesWithPrereleases(e,u)||r.push(JSON.stringify(A))}}return bn.makeHash(`${3}`,...r).slice(0,6)}Ke();function tve(t,{configuration:e,report:r}){for(let o of t.parts)for(let a of o.lines)switch(o.type){case"context":r.reportInfo(null,` ${ye.pretty(e,a,"grey")}`);break;case"deletion":r.reportError(28,`- ${ye.pretty(e,a,ye.Type.REMOVED)}`);break;case"insertion":r.reportError(28,`+ ${ye.pretty(e,a,ye.Type.ADDED)}`);break;default:Ye.assertNever(o.type)}}var Bv=class{supports(e,r){return!!Kh(e)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${Y.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.patchPackage(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:Y.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:u}}async patchPackage(e,r){let{parentLocator:o,sourceLocator:a,sourceVersion:n,patchPaths:u}=Iv(e),A=await wv(o,u,r),p=await ae.mktempPromise(),h=z.join(p,"current.zip"),E=await r.fetcher.fetch(a,r),w=Y.getIdentVendorPath(e),v=new os(h,{create:!0,level:r.project.configuration.get("compressionLevel")});await Ye.releaseAfterUseAsync(async()=>{await v.copyPromise(w,E.prefixPath,{baseFs:E.packageFs,stableSort:!0})},E.releaseFs),v.saveAndClose();for(let{source:b,optional:C}of A){if(b===null)continue;let R=new os(h,{level:r.project.configuration.get("compressionLevel")}),L=new An(z.resolve(wt.root,w),{baseFs:R});try{await Jk(Cv(b),{baseFs:L,version:n})}catch(_){if(!(_ instanceof rI))throw _;let V=r.project.configuration.get("enableInlineHunks"),re=!V&&!C?" (set enableInlineHunks for details)":"",oe=`${Y.prettyLocator(r.project.configuration,e)}: ${_.message}${re}`,pe=he=>{!V||tve(_.hunk,{configuration:r.project.configuration,report:he})};if(R.discardAndClose(),C){r.report.reportWarningOnce(66,oe,{reportExtra:pe});continue}else throw new Vt(66,oe,pe)}R.saveAndClose()}return new os(h,{level:r.project.configuration.get("compressionLevel")})}};Ke();var vv=class{supportsDescriptor(e,r){return!!zk(e)}supportsLocator(e,r){return!!Kh(e)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){let{patchPaths:a}=Ev(e);return a.every(n=>!DG(n))?e:Y.bindDescriptor(e,{locator:Y.stringifyLocator(r)})}getResolutionDependencies(e,r){let{sourceDescriptor:o}=Ev(e);return{sourceDescriptor:r.project.configuration.normalizeDependency(o)}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{parentLocator:a,patchPaths:n}=Ev(e),u=await wv(a,n,o.fetchOptions),A=r.sourceDescriptor;if(typeof A>"u")throw new Error("Assertion failed: The dependency should have been resolved");let p=xG(u,A.version);return[vG(e,{parentLocator:a,sourcePackage:A,patchPaths:n,patchHash:p})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let{sourceLocator:o}=Iv(e);return{...await r.resolver.resolve(o,r),...e}}};Ke();bt();_t();var Vh=class extends ct{constructor(){super(...arguments);this.save=fe.Boolean("-s,--save",!1,{description:"Add the patch to your resolution entries"});this.patchFolder=fe.String()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new er(o.cwd,this.context.cwd);await o.restoreInstallState();let n=z.resolve(this.context.cwd,ue.toPortablePath(this.patchFolder)),u=z.join(n,"../source"),A=z.join(n,"../.yarn-patch.json");if(!ae.existsSync(u))throw new ot("The argument folder didn't get created by 'yarn patch'");let p=await PG(u,n),h=await ae.readJsonPromise(A),E=Y.parseLocator(h.locator,!0);if(!o.storedPackages.has(E.locatorHash))throw new ot("No package found in the project for the given locator");if(!this.save){this.context.stdout.write(p);return}let w=r.get("patchFolder"),v=z.join(w,`${Y.slugifyLocator(E)}.patch`);await ae.mkdirPromise(w,{recursive:!0}),await ae.writeFilePromise(v,p);let b=[],C=new Map;for(let R of o.storedPackages.values()){if(Y.isVirtualLocator(R))continue;let L=R.dependencies.get(E.identHash);if(!L)continue;let _=Y.ensureDevirtualizedDescriptor(L),V=BG(_),re=o.storedResolutions.get(V.descriptorHash);if(!re)throw new Error("Assertion failed: Expected the resolution to have been registered");if(!o.storedPackages.get(re))throw new Error("Assertion failed: Expected the package to have been registered");let pe=o.tryWorkspaceByLocator(R);if(pe)b.push(pe);else{let he=o.originalPackages.get(R.locatorHash);if(!he)throw new Error("Assertion failed: Expected the original package to have been registered");let ve=he.dependencies.get(L.identHash);if(!ve)throw new Error("Assertion failed: Expected the original dependency to have been registered");C.set(ve.descriptorHash,ve)}}for(let R of b)for(let L of Nt.hardDependencies){let _=R.manifest[L].get(E.identHash);if(!_)continue;let V=Zk(_,{parentLocator:null,sourceDescriptor:Y.convertLocatorToDescriptor(E),patchPaths:[z.join(Lr.home,z.relative(o.cwd,v))]});R.manifest[L].set(_.identHash,V)}for(let R of C.values()){let L=Zk(R,{parentLocator:null,sourceDescriptor:Y.convertLocatorToDescriptor(E),patchPaths:[z.join(Lr.home,z.relative(o.cwd,v))]});o.topLevelWorkspace.manifest.resolutions.push({pattern:{descriptor:{fullName:Y.stringifyIdent(L),description:R.range}},reference:L.range})}await o.persist()}};Vh.paths=[["patch-commit"]],Vh.usage=it.Usage({description:"generate a patch out of a directory",details:"\n By default, this will print a patchfile on stdout based on the diff between the folder passed in and the original version of the package. Such file is suitable for consumption with the `patch:` protocol.\n\n With the `-s,--save` option set, the patchfile won't be printed on stdout anymore and will instead be stored within a local file (by default kept within `.yarn/patches`, but configurable via the `patchFolder` setting). A `resolutions` entry will also be added to your top-level manifest, referencing the patched package via the `patch:` protocol.\n\n Note that only folders generated by `yarn patch` are accepted as valid input for `yarn patch-commit`.\n "});Ke();bt();_t();var Jh=class extends ct{constructor(){super(...arguments);this.update=fe.Boolean("-u,--update",!1,{description:"Reapply local patches that already apply to this packages"});this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=fe.String()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Ur.find(r);if(!a)throw new er(o.cwd,this.context.cwd);await o.restoreInstallState();let u=Y.parseLocator(this.package);if(u.reference==="unknown"){let A=Ye.mapAndFilter([...o.storedPackages.values()],p=>p.identHash!==u.identHash?Ye.mapAndFilter.skip:Y.isVirtualLocator(p)?Ye.mapAndFilter.skip:Kh(p)!==this.update?Ye.mapAndFilter.skip:p);if(A.length===0)throw new ot("No package found in the project for the given locator");if(A.length>1)throw new ot(`Multiple candidate packages found; explicitly choose one of them (use \`yarn why \` to get more information as to who depends on them): +${A.map(p=>` +- ${Y.prettyLocator(r,p)}`).join("")}`);u=A[0]}if(!o.storedPackages.has(u.locatorHash))throw new ot("No package found in the project for the given locator");await Et.start({configuration:r,json:this.json,stdout:this.context.stdout},async A=>{let p=Xk(u),h=await SG(u,{cache:n,project:o});A.reportJson({locator:Y.stringifyLocator(p),path:ue.fromPortablePath(h)});let E=this.update?" along with its current modifications":"";A.reportInfo(0,`Package ${Y.prettyLocator(r,p)} got extracted with success${E}!`),A.reportInfo(0,`You can now edit the following folder: ${ye.pretty(r,ue.fromPortablePath(h),"magenta")}`),A.reportInfo(0,`Once you are done run ${ye.pretty(r,`yarn patch-commit -s ${process.platform==="win32"?'"':""}${ue.fromPortablePath(h)}${process.platform==="win32"?'"':""}`,"cyan")} and Yarn will store a patchfile based on your changes.`)})}};Jh.paths=[["patch"]],Jh.usage=it.Usage({description:"prepare a package for patching",details:"\n This command will cause a package to be extracted in a temporary directory intended to be editable at will.\n\n Once you're done with your changes, run `yarn patch-commit -s ` (with `` being the temporary directory you received) to generate a patchfile and register it into your top-level manifest via the `patch:` protocol. Run `yarn patch-commit -h` for more details.\n\n Calling the command when you already have a patch won't import it by default (in other words, the default behavior is to reset existing patches). However, adding the `-u,--update` flag will import any current patch.\n "});var mvt={configuration:{enableInlineHunks:{description:"If true, the installs will print unmatched patch hunks",type:"BOOLEAN",default:!1},patchFolder:{description:"Folder where the patch files must be written",type:"ABSOLUTE_PATH",default:"./.yarn/patches"}},commands:[Vh,Jh],fetchers:[Bv],resolvers:[vv]},yvt=mvt;var FG={};Yt(FG,{PnpmLinker:()=>Dv,default:()=>Bvt});Ke();bt();_t();var Dv=class{getCustomDataKey(){return JSON.stringify({name:"PnpmLinker",version:3})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the pnpm linker to be enabled");let o=this.getCustomDataKey(),a=r.project.linkersCustomData.get(o);if(!a)throw new ot(`The project in ${ye.pretty(r.project.configuration,`${r.project.cwd}/package.json`,ye.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=a.pathsByLocator.get(e.locatorHash);if(typeof n>"u")throw new ot(`Couldn't find ${Y.prettyLocator(r.project.configuration,e)} in the currently installed pnpm map - running an install might help`);return n.packageLocation}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let o=this.getCustomDataKey(),a=r.project.linkersCustomData.get(o);if(!a)throw new ot(`The project in ${ye.pretty(r.project.configuration,`${r.project.cwd}/package.json`,ye.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=e.match(/(^.*\/node_modules\/(@[^/]*\/)?[^/]+)(\/.*$)/);if(n){let p=a.locatorByPath.get(n[1]);if(p)return p}let u=e,A=e;do{A=u,u=z.dirname(A);let p=a.locatorByPath.get(A);if(p)return p}while(u!==A);return null}makeInstaller(e){return new QG(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="pnpm"}},QG=class{constructor(e){this.opts=e;this.asyncActions=new Ye.AsyncActions(10);this.customData={pathsByLocator:new Map,locatorByPath:new Map};this.indexFolderPromise=fD(ae,{indexPath:z.join(e.project.configuration.get("globalFolder"),"index")})}attachCustomData(e){}async installPackage(e,r,o){switch(e.linkType){case"SOFT":return this.installPackageSoft(e,r,o);case"HARD":return this.installPackageHard(e,r,o)}throw new Error("Assertion failed: Unsupported package link type")}async installPackageSoft(e,r,o){let a=z.resolve(r.packageFs.getRealPath(),r.prefixPath),n=this.opts.project.tryWorkspaceByLocator(e)?z.join(a,Lr.nodeModules):null;return this.customData.pathsByLocator.set(e.locatorHash,{packageLocation:a,dependenciesLocation:n}),{packageLocation:a,buildDirective:null}}async installPackageHard(e,r,o){let a=Cvt(e,{project:this.opts.project}),n=a.packageLocation;this.customData.locatorByPath.set(n,Y.stringifyLocator(e)),this.customData.pathsByLocator.set(e.locatorHash,a),o.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{await ae.mkdirPromise(n,{recursive:!0}),await ae.copyPromise(n,r.prefixPath,{baseFs:r.packageFs,overwrite:!1,linkStrategy:{type:"HardlinkFromIndex",indexPath:await this.indexFolderPromise,autoRepair:!0}})}));let A=Y.isVirtualLocator(e)?Y.devirtualizeLocator(e):e,p={manifest:await Nt.tryFind(r.prefixPath,{baseFs:r.packageFs})??new Nt,misc:{hasBindingGyp:CA.hasBindingGyp(r)}},h=this.opts.project.getDependencyMeta(A,e.version),E=CA.extractBuildScripts(e,p,h,{configuration:this.opts.project.configuration,report:this.opts.report});return{packageLocation:n,buildDirective:E}}async attachInternalDependencies(e,r){if(this.opts.project.configuration.get("nodeLinker")!=="pnpm"||!rve(e,{project:this.opts.project}))return;let o=this.customData.pathsByLocator.get(e.locatorHash);if(typeof o>"u")throw new Error(`Assertion failed: Expected the package to have been registered (${Y.stringifyLocator(e)})`);let{dependenciesLocation:a}=o;!a||this.asyncActions.reduce(e.locatorHash,async n=>{await ae.mkdirPromise(a,{recursive:!0});let u=await Evt(a),A=new Map(u),p=[n],h=(w,v)=>{let b=v;rve(v,{project:this.opts.project})||(this.opts.report.reportWarningOnce(0,"The pnpm linker doesn't support providing different versions to workspaces' peer dependencies"),b=Y.devirtualizeLocator(v));let C=this.customData.pathsByLocator.get(b.locatorHash);if(typeof C>"u")throw new Error(`Assertion failed: Expected the package to have been registered (${Y.stringifyLocator(v)})`);let R=Y.stringifyIdent(w),L=z.join(a,R),_=z.relative(z.dirname(L),C.packageLocation),V=A.get(R);A.delete(R),p.push(Promise.resolve().then(async()=>{if(V){if(V.isSymbolicLink()&&await ae.readlinkPromise(L)===_)return;await ae.removePromise(L)}await ae.mkdirpPromise(z.dirname(L)),process.platform=="win32"&&this.opts.project.configuration.get("winLinkType")==="junctions"?await ae.symlinkPromise(C.packageLocation,L,"junction"):await ae.symlinkPromise(_,L)}))},E=!1;for(let[w,v]of r)w.identHash===e.identHash&&(E=!0),h(w,v);!E&&!this.opts.project.tryWorkspaceByLocator(e)&&h(Y.convertLocatorToDescriptor(e),e),p.push(Ivt(a,A)),await Promise.all(p)})}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the pnpm linker")}async finalizeInstall(){let e=ive(this.opts.project);if(this.opts.project.configuration.get("nodeLinker")!=="pnpm")await ae.removePromise(e);else{let r;try{r=new Set(await ae.readdirPromise(e))}catch{r=new Set}for(let{dependenciesLocation:o}of this.customData.pathsByLocator.values()){if(!o)continue;let a=z.contains(e,o);if(a===null)continue;let[n]=a.split(z.sep);r.delete(n)}await Promise.all([...r].map(async o=>{await ae.removePromise(z.join(e,o))}))}return await this.asyncActions.wait(),await kG(e),this.opts.project.configuration.get("nodeLinker")!=="node-modules"&&await kG(nve(this.opts.project)),{customData:this.customData}}};function nve(t){return z.join(t.cwd,Lr.nodeModules)}function ive(t){return z.join(nve(t),".store")}function Cvt(t,{project:e}){let r=Y.slugifyLocator(t),o=ive(e),a=z.join(o,r,"package"),n=z.join(o,r,Lr.nodeModules);return{packageLocation:a,dependenciesLocation:n}}function rve(t,{project:e}){return!Y.isVirtualLocator(t)||!e.tryWorkspaceByLocator(t)}async function Evt(t){let e=new Map,r=[];try{r=await ae.readdirPromise(t,{withFileTypes:!0})}catch(o){if(o.code!=="ENOENT")throw o}try{for(let o of r)if(!o.name.startsWith("."))if(o.name.startsWith("@")){let a=await ae.readdirPromise(z.join(t,o.name),{withFileTypes:!0});if(a.length===0)e.set(o.name,o);else for(let n of a)e.set(`${o.name}/${n.name}`,n)}else e.set(o.name,o)}catch(o){if(o.code!=="ENOENT")throw o}return e}async function Ivt(t,e){var a;let r=[],o=new Set;for(let n of e.keys()){r.push(ae.removePromise(z.join(t,n)));let u=(a=Y.tryParseIdent(n))==null?void 0:a.scope;u&&o.add(`@${u}`)}return Promise.all(r).then(()=>Promise.all([...o].map(n=>kG(z.join(t,n)))))}async function kG(t){try{await ae.rmdirPromise(t)}catch(e){if(e.code!=="ENOENT"&&e.code!=="ENOTEMPTY")throw e}}var wvt={linkers:[Dv]},Bvt=wvt;var MG={};Yt(MG,{StageCommand:()=>zh,default:()=>Tvt,stageUtils:()=>Pv});Ke();bt();_t();Ke();bt();var Pv={};Yt(Pv,{ActionType:()=>RG,checkConsensus:()=>$k,expandDirectory:()=>NG,findConsensus:()=>LG,findVcsRoot:()=>Sv,genCommitMessage:()=>OG,getCommitPrefix:()=>sve,isYarnFile:()=>TG});bt();var RG=(n=>(n[n.CREATE=0]="CREATE",n[n.DELETE=1]="DELETE",n[n.ADD=2]="ADD",n[n.REMOVE=3]="REMOVE",n[n.MODIFY=4]="MODIFY",n))(RG||{});async function Sv(t,{marker:e}){do if(!ae.existsSync(z.join(t,e)))t=z.dirname(t);else return t;while(t!=="/");return null}function TG(t,{roots:e,names:r}){if(r.has(z.basename(t)))return!0;do if(!e.has(t))t=z.dirname(t);else return!0;while(t!=="/");return!1}function NG(t){let e=[],r=[t];for(;r.length>0;){let o=r.pop(),a=ae.readdirSync(o);for(let n of a){let u=z.resolve(o,n);ae.lstatSync(u).isDirectory()?r.push(u):e.push(u)}}return e}function $k(t,e){let r=0,o=0;for(let a of t)a!=="wip"&&(e.test(a)?r+=1:o+=1);return r>=o}function LG(t){let e=$k(t,/^(\w\(\w+\):\s*)?\w+s/),r=$k(t,/^(\w\(\w+\):\s*)?[A-Z]/),o=$k(t,/^\w\(\w+\):/);return{useThirdPerson:e,useUpperCase:r,useComponent:o}}function sve(t){return t.useComponent?"chore(yarn): ":""}var vvt=new Map([[0,"create"],[1,"delete"],[2,"add"],[3,"remove"],[4,"update"]]);function OG(t,e){let r=sve(t),o=[],a=e.slice().sort((n,u)=>n[0]-u[0]);for(;a.length>0;){let[n,u]=a.shift(),A=vvt.get(n);t.useUpperCase&&o.length===0&&(A=`${A[0].toUpperCase()}${A.slice(1)}`),t.useThirdPerson&&(A+="s");let p=[u];for(;a.length>0&&a[0][0]===n;){let[,E]=a.shift();p.push(E)}p.sort();let h=p.shift();p.length===1?h+=" (and one other)":p.length>1&&(h+=` (and ${p.length} others)`),o.push(`${A} ${h}`)}return`${r}${o.join(", ")}`}var Dvt="Commit generated via `yarn stage`",Svt=11;async function ove(t){let{code:e,stdout:r}=await Mr.execvp("git",["log","-1","--pretty=format:%H"],{cwd:t});return e===0?r.trim():null}async function Pvt(t,e){let r=[],o=e.filter(h=>z.basename(h.path)==="package.json");for(let{action:h,path:E}of o){let w=z.relative(t,E);if(h===4){let v=await ove(t),{stdout:b}=await Mr.execvp("git",["show",`${v}:${w}`],{cwd:t,strict:!0}),C=await Nt.fromText(b),R=await Nt.fromFile(E),L=new Map([...R.dependencies,...R.devDependencies]),_=new Map([...C.dependencies,...C.devDependencies]);for(let[V,re]of _){let oe=Y.stringifyIdent(re),pe=L.get(V);pe?pe.range!==re.range&&r.push([4,`${oe} to ${pe.range}`]):r.push([3,oe])}for(let[V,re]of L)_.has(V)||r.push([2,Y.stringifyIdent(re)])}else if(h===0){let v=await Nt.fromFile(E);v.name?r.push([0,Y.stringifyIdent(v.name)]):r.push([0,"a package"])}else if(h===1){let v=await ove(t),{stdout:b}=await Mr.execvp("git",["show",`${v}:${w}`],{cwd:t,strict:!0}),C=await Nt.fromText(b);C.name?r.push([1,Y.stringifyIdent(C.name)]):r.push([1,"a package"])}else throw new Error("Assertion failed: Unsupported action type")}let{code:a,stdout:n}=await Mr.execvp("git",["log",`-${Svt}`,"--pretty=format:%s"],{cwd:t}),u=a===0?n.split(/\n/g).filter(h=>h!==""):[],A=LG(u);return OG(A,r)}var xvt={[0]:[" A ","?? "],[4]:[" M "],[1]:[" D "]},bvt={[0]:["A "],[4]:["M "],[1]:["D "]},ave={async findRoot(t){return await Sv(t,{marker:".git"})},async filterChanges(t,e,r,o){let{stdout:a}=await Mr.execvp("git",["status","-s"],{cwd:t,strict:!0}),n=a.toString().split(/\n/g),u=o!=null&&o.staged?bvt:xvt;return[].concat(...n.map(p=>{if(p==="")return[];let h=p.slice(0,3),E=z.resolve(t,p.slice(3));if(!(o!=null&&o.staged)&&h==="?? "&&p.endsWith("/"))return NG(E).map(w=>({action:0,path:w}));{let v=[0,4,1].find(b=>u[b].includes(h));return v!==void 0?[{action:v,path:E}]:[]}})).filter(p=>TG(p.path,{roots:e,names:r}))},async genCommitMessage(t,e){return await Pvt(t,e)},async makeStage(t,e){let r=e.map(o=>ue.fromPortablePath(o.path));await Mr.execvp("git",["add","--",...r],{cwd:t,strict:!0})},async makeCommit(t,e,r){let o=e.map(a=>ue.fromPortablePath(a.path));await Mr.execvp("git",["add","-N","--",...o],{cwd:t,strict:!0}),await Mr.execvp("git",["commit","-m",`${r} + +${Dvt} +`,"--",...o],{cwd:t,strict:!0})},async makeReset(t,e){let r=e.map(o=>ue.fromPortablePath(o.path));await Mr.execvp("git",["reset","HEAD","--",...r],{cwd:t,strict:!0})}};var lve={async findRoot(t){return await Sv(t,{marker:".hg"})},async filterChanges(t,e,r){return[]},async genCommitMessage(t,e){return""},async makeStage(t,e){},async makeCommit(t,e,r){},async makeReset(t,e){},async makeUpdate(t,e){}};var Qvt=[ave,lve],zh=class extends ct{constructor(){super(...arguments);this.commit=fe.Boolean("-c,--commit",!1,{description:"Commit the staged files"});this.reset=fe.Boolean("-r,--reset",!1,{description:"Remove all files from the staging area"});this.dryRun=fe.Boolean("-n,--dry-run",!1,{description:"Print the commit message and the list of modified files without staging / committing"});this.update=fe.Boolean("-u,--update",!1,{hidden:!0})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd),{driver:a,root:n}=await kvt(o.cwd),u=[r.get("cacheFolder"),r.get("globalFolder"),r.get("virtualFolder"),r.get("yarnPath")];await r.triggerHook(w=>w.populateYarnPaths,o,w=>{u.push(w)});let A=new Set;for(let w of u)for(let v of Fvt(n,w))A.add(v);let p=new Set([r.get("rcFilename"),r.get("lockfileFilename"),"package.json"]),h=await a.filterChanges(n,A,p),E=await a.genCommitMessage(n,h);if(this.dryRun)if(this.commit)this.context.stdout.write(`${E} +`);else for(let w of h)this.context.stdout.write(`${ue.fromPortablePath(w.path)} +`);else if(this.reset){let w=await a.filterChanges(n,A,p,{staged:!0});w.length===0?this.context.stdout.write("No staged changes found!"):await a.makeReset(n,w)}else h.length===0?this.context.stdout.write("No changes found!"):this.commit?await a.makeCommit(n,h,E):(await a.makeStage(n,h),this.context.stdout.write(E))}};zh.paths=[["stage"]],zh.usage=it.Usage({description:"add all yarn files to your vcs",details:"\n This command will add to your staging area the files belonging to Yarn (typically any modified `package.json` and `.yarnrc.yml` files, but also linker-generated files, cache data, etc). It will take your ignore list into account, so the cache files won't be added if the cache is ignored in a `.gitignore` file (assuming you use Git).\n\n Running `--reset` will instead remove them from the staging area (the changes will still be there, but won't be committed until you stage them back).\n\n Since the staging area is a non-existent concept in Mercurial, Yarn will always create a new commit when running this command on Mercurial repositories. You can get this behavior when using Git by using the `--commit` flag which will directly create a commit.\n ",examples:[["Adds all modified project files to the staging area","yarn stage"],["Creates a new commit containing all modified project files","yarn stage --commit"]]});async function kvt(t){let e=null,r=null;for(let o of Qvt)if((r=await o.findRoot(t))!==null){e=o;break}if(e===null||r===null)throw new ot("No stage driver has been found for your current project");return{driver:e,root:r}}function Fvt(t,e){let r=[];if(e===null)return r;for(;;){(e===t||e.startsWith(`${t}/`))&&r.push(e);let o;try{o=ae.statSync(e)}catch{break}if(o.isSymbolicLink())e=z.resolve(z.dirname(e),ae.readlinkSync(e));else break}return r}var Rvt={commands:[zh]},Tvt=Rvt;var UG={};Yt(UG,{default:()=>qvt});Ke();Ke();bt();var Ave=tt(si());Ke();var cve=tt(JH()),Nvt="e8e1bd300d860104bb8c58453ffa1eb4",Lvt="OFCNCOG2CU",uve=async(t,e)=>{var n;let r=Y.stringifyIdent(t),a=Ovt(e).initIndex("npm-search");try{return((n=(await a.getObject(r,{attributesToRetrieve:["types"]})).types)==null?void 0:n.ts)==="definitely-typed"}catch{return!1}},Ovt=t=>(0,cve.default)(Lvt,Nvt,{requester:{async send(r){try{let o=await ln.request(r.url,r.data||null,{configuration:t,headers:r.headers});return{content:o.body,isTimedOut:!1,status:o.statusCode}}catch(o){return{content:o.response.body,isTimedOut:!1,status:o.response.statusCode}}}}});var fve=t=>t.scope?`${t.scope}__${t.name}`:`${t.name}`,Mvt=async(t,e,r,o)=>{if(r.scope==="types")return;let{project:a}=t,{configuration:n}=a;if(!(n.get("tsEnableAutoTypes")??ae.existsSync(z.join(a.cwd,"tsconfig.json"))))return;let A=n.makeResolver(),p={project:a,resolver:A,report:new xi};if(!await uve(r,n))return;let E=fve(r),w=Y.parseRange(r.range).selector;if(!Tr.validRange(w)){let L=n.normalizeDependency(r),_=await A.getCandidates(L,{},p);w=Y.parseRange(_[0].reference).selector}let v=Ave.default.coerce(w);if(v===null)return;let b=`${eu.Modifier.CARET}${v.major}`,C=Y.makeDescriptor(Y.makeIdent("types",E),b),R=Ye.mapAndFind(a.workspaces,L=>{var oe,pe;let _=(oe=L.manifest.dependencies.get(r.identHash))==null?void 0:oe.descriptorHash,V=(pe=L.manifest.devDependencies.get(r.identHash))==null?void 0:pe.descriptorHash;if(_!==r.descriptorHash&&V!==r.descriptorHash)return Ye.mapAndFind.skip;let re=[];for(let he of Nt.allDependencies){let ve=L.manifest[he].get(C.identHash);typeof ve>"u"||re.push([he,ve])}return re.length===0?Ye.mapAndFind.skip:re});if(typeof R<"u")for(let[L,_]of R)t.manifest[L].set(_.identHash,_);else{try{let L=n.normalizeDependency(C);if((await A.getCandidates(L,{},p)).length===0)return}catch{return}t.manifest[eu.Target.DEVELOPMENT].set(C.identHash,C)}},Uvt=async(t,e,r)=>{if(r.scope==="types")return;let{project:o}=t,{configuration:a}=o;if(!(a.get("tsEnableAutoTypes")??ae.existsSync(z.join(o.cwd,"tsconfig.json"))))return;let u=fve(r),A=Y.makeIdent("types",u);for(let p of Nt.allDependencies)typeof t.manifest[p].get(A.identHash)>"u"||t.manifest[p].delete(A.identHash)},_vt=(t,e)=>{e.publishConfig&&e.publishConfig.typings&&(e.typings=e.publishConfig.typings),e.publishConfig&&e.publishConfig.types&&(e.types=e.publishConfig.types)},Hvt={configuration:{tsEnableAutoTypes:{description:"Whether Yarn should auto-install @types/ dependencies on 'yarn add'",type:"BOOLEAN",isNullable:!0,default:null}},hooks:{afterWorkspaceDependencyAddition:Mvt,afterWorkspaceDependencyRemoval:Uvt,beforeWorkspacePacking:_vt}},qvt=Hvt;var GG={};Yt(GG,{VersionApplyCommand:()=>Xh,VersionCheckCommand:()=>Zh,VersionCommand:()=>$h,default:()=>aDt,versionUtils:()=>lI});Ke();Ke();_t();var lI={};Yt(lI,{Decision:()=>oI,applyPrerelease:()=>yve,applyReleases:()=>jG,applyStrategy:()=>tF,clearVersionFiles:()=>_G,getUndecidedDependentWorkspaces:()=>bv,getUndecidedWorkspaces:()=>eF,openVersionFile:()=>aI,requireMoreDecisions:()=>iDt,resolveVersionFiles:()=>xv,suggestStrategy:()=>qG,updateVersionFiles:()=>HG,validateReleaseDecision:()=>sI});Ke();bt();_l();_t();var mve=tt(dve()),SA=tt(si()),nDt=/^(>=|[~^]|)(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/,oI=(u=>(u.UNDECIDED="undecided",u.DECLINE="decline",u.MAJOR="major",u.MINOR="minor",u.PATCH="patch",u.PRERELEASE="prerelease",u))(oI||{});function sI(t){let e=SA.default.valid(t);return e||Ye.validateEnum((0,mve.default)(oI,"UNDECIDED"),t)}async function xv(t,{prerelease:e=null}={}){let r=new Map,o=t.configuration.get("deferredVersionFolder");if(!ae.existsSync(o))return r;let a=await ae.readdirPromise(o);for(let n of a){if(!n.endsWith(".yml"))continue;let u=z.join(o,n),A=await ae.readFilePromise(u,"utf8"),p=Yi(A);for(let[h,E]of Object.entries(p.releases||{})){if(E==="decline")continue;let w=Y.parseIdent(h),v=t.tryWorkspaceByIdent(w);if(v===null)throw new Error(`Assertion failed: Expected a release definition file to only reference existing workspaces (${z.basename(u)} references ${h})`);if(v.manifest.version===null)throw new Error(`Assertion failed: Expected the workspace to have a version (${Y.prettyLocator(t.configuration,v.anchoredLocator)})`);let b=v.manifest.raw.stableVersion??v.manifest.version,C=r.get(v),R=tF(b,sI(E));if(R===null)throw new Error(`Assertion failed: Expected ${b} to support being bumped via strategy ${E}`);let L=typeof C<"u"?SA.default.gt(R,C)?R:C:R;r.set(v,L)}}return e&&(r=new Map([...r].map(([n,u])=>[n,yve(u,{current:n.manifest.version,prerelease:e})]))),r}async function _G(t){let e=t.configuration.get("deferredVersionFolder");!ae.existsSync(e)||await ae.removePromise(e)}async function HG(t,e){let r=new Set(e),o=t.configuration.get("deferredVersionFolder");if(!ae.existsSync(o))return;let a=await ae.readdirPromise(o);for(let n of a){if(!n.endsWith(".yml"))continue;let u=z.join(o,n),A=await ae.readFilePromise(u,"utf8"),p=Yi(A),h=p==null?void 0:p.releases;if(!!h){for(let E of Object.keys(h)){let w=Y.parseIdent(E),v=t.tryWorkspaceByIdent(w);(v===null||r.has(v))&&delete p.releases[E]}Object.keys(p.releases).length>0?await ae.changeFilePromise(u,wa(new wa.PreserveOrdering(p))):await ae.unlinkPromise(u)}}}async function aI(t,{allowEmpty:e=!1}={}){let r=t.configuration;if(r.projectCwd===null)throw new ot("This command can only be run from within a Yarn project");let o=await $o.fetchRoot(r.projectCwd),a=o!==null?await $o.fetchBase(o,{baseRefs:r.get("changesetBaseRefs")}):null,n=o!==null?await $o.fetchChangedFiles(o,{base:a.hash,project:t}):[],u=r.get("deferredVersionFolder"),A=n.filter(b=>z.contains(u,b)!==null);if(A.length>1)throw new ot(`Your current branch contains multiple versioning files; this isn't supported: +- ${A.map(b=>ue.fromPortablePath(b)).join(` +- `)}`);let p=new Set(Ye.mapAndFilter(n,b=>{let C=t.tryWorkspaceByFilePath(b);return C===null?Ye.mapAndFilter.skip:C}));if(A.length===0&&p.size===0&&!e)return null;let h=A.length===1?A[0]:z.join(u,`${bn.makeHash(Math.random().toString()).slice(0,8)}.yml`),E=ae.existsSync(h)?await ae.readFilePromise(h,"utf8"):"{}",w=Yi(E),v=new Map;for(let b of w.declined||[]){let C=Y.parseIdent(b),R=t.getWorkspaceByIdent(C);v.set(R,"decline")}for(let[b,C]of Object.entries(w.releases||{})){let R=Y.parseIdent(b),L=t.getWorkspaceByIdent(R);v.set(L,sI(C))}return{project:t,root:o,baseHash:a!==null?a.hash:null,baseTitle:a!==null?a.title:null,changedFiles:new Set(n),changedWorkspaces:p,releaseRoots:new Set([...p].filter(b=>b.manifest.version!==null)),releases:v,async saveAll(){let b={},C=[],R=[];for(let L of t.workspaces){if(L.manifest.version===null)continue;let _=Y.stringifyIdent(L.locator),V=v.get(L);V==="decline"?C.push(_):typeof V<"u"?b[_]=sI(V):p.has(L)&&R.push(_)}await ae.mkdirPromise(z.dirname(h),{recursive:!0}),await ae.changeFilePromise(h,wa(new wa.PreserveOrdering({releases:Object.keys(b).length>0?b:void 0,declined:C.length>0?C:void 0,undecided:R.length>0?R:void 0})))}}}function iDt(t){return eF(t).size>0||bv(t).length>0}function eF(t){let e=new Set;for(let r of t.changedWorkspaces)r.manifest.version!==null&&(t.releases.has(r)||e.add(r));return e}function bv(t,{include:e=new Set}={}){let r=[],o=new Map(Ye.mapAndFilter([...t.releases],([n,u])=>u==="decline"?Ye.mapAndFilter.skip:[n.anchoredLocator.locatorHash,n])),a=new Map(Ye.mapAndFilter([...t.releases],([n,u])=>u!=="decline"?Ye.mapAndFilter.skip:[n.anchoredLocator.locatorHash,n]));for(let n of t.project.workspaces)if(!(!e.has(n)&&(a.has(n.anchoredLocator.locatorHash)||o.has(n.anchoredLocator.locatorHash)))&&n.manifest.version!==null)for(let u of Nt.hardDependencies)for(let A of n.manifest.getForScope(u).values()){let p=t.project.tryWorkspaceByDescriptor(A);p!==null&&o.has(p.anchoredLocator.locatorHash)&&r.push([n,p])}return r}function qG(t,e){let r=SA.default.clean(e);for(let o of Object.values(oI))if(o!=="undecided"&&o!=="decline"&&SA.default.inc(t,o)===r)return o;return null}function tF(t,e){if(SA.default.valid(e))return e;if(t===null)throw new ot(`Cannot apply the release strategy "${e}" unless the workspace already has a valid version`);if(!SA.default.valid(t))throw new ot(`Cannot apply the release strategy "${e}" on a non-semver version (${t})`);let r=SA.default.inc(t,e);if(r===null)throw new ot(`Cannot apply the release strategy "${e}" on the specified version (${t})`);return r}function jG(t,e,{report:r}){let o=new Map;for(let a of t.workspaces)for(let n of Nt.allDependencies)for(let u of a.manifest[n].values()){let A=t.tryWorkspaceByDescriptor(u);if(A===null||!e.has(A))continue;Ye.getArrayWithDefault(o,A).push([a,n,u.identHash])}for(let[a,n]of e){let u=a.manifest.version;a.manifest.version=n,SA.default.prerelease(n)===null?delete a.manifest.raw.stableVersion:a.manifest.raw.stableVersion||(a.manifest.raw.stableVersion=u);let A=a.manifest.name!==null?Y.stringifyIdent(a.manifest.name):null;r.reportInfo(0,`${Y.prettyLocator(t.configuration,a.anchoredLocator)}: Bumped to ${n}`),r.reportJson({cwd:ue.fromPortablePath(a.cwd),ident:A,oldVersion:u,newVersion:n});let p=o.get(a);if(!(typeof p>"u"))for(let[h,E,w]of p){let v=h.manifest[E].get(w);if(typeof v>"u")throw new Error("Assertion failed: The dependency should have existed");let b=v.range,C=!1;if(b.startsWith(Gn.protocol)&&(b=b.slice(Gn.protocol.length),C=!0,b===a.relativeCwd))continue;let R=b.match(nDt);if(!R){r.reportWarning(0,`Couldn't auto-upgrade range ${b} (in ${Y.prettyLocator(t.configuration,h.anchoredLocator)})`);continue}let L=`${R[1]}${n}`;C&&(L=`${Gn.protocol}${L}`);let _=Y.makeDescriptor(v,L);h.manifest[E].set(w,_)}}}var sDt=new Map([["%n",{extract:t=>t.length>=1?[t[0],t.slice(1)]:null,generate:(t=0)=>`${t+1}`}]]);function yve(t,{current:e,prerelease:r}){let o=new SA.default.SemVer(e),a=o.prerelease.slice(),n=[];o.prerelease=[],o.format()!==t&&(a.length=0);let u=!0,A=r.split(/\./g);for(let p of A){let h=sDt.get(p);if(typeof h>"u")n.push(p),a[0]===p?a.shift():u=!1;else{let E=u?h.extract(a):null;E!==null&&typeof E[0]=="number"?(n.push(h.generate(E[0])),a=E[1]):(n.push(h.generate()),u=!1)}}return o.prerelease&&(o.prerelease=[]),`${t}-${n.join(".")}`}var Xh=class extends ct{constructor(){super(...arguments);this.all=fe.Boolean("--all",!1,{description:"Apply the deferred version changes on all workspaces"});this.dryRun=fe.Boolean("--dry-run",!1,{description:"Print the versions without actually generating the package archive"});this.prerelease=fe.String("--prerelease",{description:"Add a prerelease identifier to new versions",tolerateBoolean:!0});this.recursive=fe.Boolean("-R,--recursive",{description:"Release the transitive workspaces as well"});this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Ur.find(r);if(!a)throw new er(o.cwd,this.context.cwd);return await o.restoreInstallState({restoreResolutions:!1}),(await Et.start({configuration:r,json:this.json,stdout:this.context.stdout},async A=>{let p=this.prerelease?typeof this.prerelease!="boolean"?this.prerelease:"rc.%n":null,h=await xv(o,{prerelease:p}),E=new Map;if(this.all)E=h;else{let w=this.recursive?a.getRecursiveWorkspaceDependencies():[a];for(let v of w){let b=h.get(v);typeof b<"u"&&E.set(v,b)}}if(E.size===0){let w=h.size>0?" Did you want to add --all?":"";A.reportWarning(0,`The current workspace doesn't seem to require a version bump.${w}`);return}jG(o,E,{report:A}),this.dryRun||(p||(this.all?await _G(o):await HG(o,[...E.keys()])),A.reportSeparator(),await o.install({cache:n,report:A}))})).exitCode()}};Xh.paths=[["version","apply"]],Xh.usage=it.Usage({category:"Release-related commands",description:"apply all the deferred version bumps at once",details:` + This command will apply the deferred version changes and remove their definitions from the repository. + + Note that if \`--prerelease\` is set, the given prerelease identifier (by default \`rc.%d\`) will be used on all new versions and the version definitions will be kept as-is. + + By default only the current workspace will be bumped, but you can configure this behavior by using one of: + + - \`--recursive\` to also apply the version bump on its dependencies + - \`--all\` to apply the version bump on all packages in the repository + + Note that this command will also update the \`workspace:\` references across all your local workspaces, thus ensuring that they keep referring to the same workspaces even after the version bump. + `,examples:[["Apply the version change to the local workspace","yarn version apply"],["Apply the version change to all the workspaces in the local workspace","yarn version apply --all"]]});Ke();bt();_t();var rF=tt(si());var Zh=class extends ct{constructor(){super(...arguments);this.interactive=fe.Boolean("-i,--interactive",{description:"Open an interactive interface used to set version bumps"})}async execute(){return this.interactive?await this.executeInteractive():await this.executeStandard()}async executeInteractive(){wE(this.context);let{Gem:r}=await Promise.resolve().then(()=>(tk(),wq)),{ScrollableItems:o}=await Promise.resolve().then(()=>(sk(),ik)),{FocusRequest:a}=await Promise.resolve().then(()=>(vq(),gwe)),{useListInput:n}=await Promise.resolve().then(()=>(nk(),dwe)),{renderForm:u}=await Promise.resolve().then(()=>(ck(),lk)),{Box:A,Text:p}=await Promise.resolve().then(()=>tt(cc())),{default:h,useCallback:E,useState:w}=await Promise.resolve().then(()=>tt(en())),v=await Xe.find(this.context.cwd,this.context.plugins),{project:b,workspace:C}=await St.find(v,this.context.cwd);if(!C)throw new er(b.cwd,this.context.cwd);await b.restoreInstallState();let R=await aI(b);if(R===null||R.releaseRoots.size===0)return 0;if(R.root===null)throw new ot("This command can only be run on Git repositories");let L=()=>h.createElement(A,{flexDirection:"row",paddingBottom:1},h.createElement(A,{flexDirection:"column",width:60},h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},""),"/",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to select workspaces.")),h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},""),"/",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to select release strategies."))),h.createElement(A,{flexDirection:"column"},h.createElement(A,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to save.")),h.createElement(A,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to abort.")))),_=({workspace:ve,active:ge,decision:le,setDecision:Pe})=>{let g=ve.manifest.raw.stableVersion??ve.manifest.version;if(g===null)throw new Error(`Assertion failed: The version should have been set (${Y.prettyLocator(v,ve.anchoredLocator)})`);if(rF.default.prerelease(g)!==null)throw new Error(`Assertion failed: Prerelease identifiers shouldn't be found (${g})`);let De=["undecided","decline","patch","minor","major"];n(le,De,{active:ge,minus:"left",plus:"right",set:Pe});let Ce=le==="undecided"?h.createElement(p,{color:"yellow"},g):le==="decline"?h.createElement(p,{color:"green"},g):h.createElement(p,null,h.createElement(p,{color:"magenta"},g)," \u2192 ",h.createElement(p,{color:"green"},rF.default.valid(le)?le:rF.default.inc(g,le)));return h.createElement(A,{flexDirection:"column"},h.createElement(A,null,h.createElement(p,null,Y.prettyLocator(v,ve.anchoredLocator)," - ",Ce)),h.createElement(A,null,De.map(de=>h.createElement(A,{key:de,paddingLeft:2},h.createElement(p,null,h.createElement(r,{active:de===le})," ",de)))))},V=ve=>{let ge=new Set(R.releaseRoots),le=new Map([...ve].filter(([Pe])=>ge.has(Pe)));for(;;){let Pe=bv({project:R.project,releases:le}),g=!1;if(Pe.length>0){for(let[De]of Pe)if(!ge.has(De)){ge.add(De),g=!0;let Ce=ve.get(De);typeof Ce<"u"&&le.set(De,Ce)}}if(!g)break}return{relevantWorkspaces:ge,relevantReleases:le}},re=()=>{let[ve,ge]=w(()=>new Map(R.releases)),le=E((Pe,g)=>{let De=new Map(ve);g!=="undecided"?De.set(Pe,g):De.delete(Pe);let{relevantReleases:Ce}=V(De);ge(Ce)},[ve,ge]);return[ve,le]},oe=({workspaces:ve,releases:ge})=>{let le=[];le.push(`${ve.size} total`);let Pe=0,g=0;for(let De of ve){let Ce=ge.get(De);typeof Ce>"u"?g+=1:Ce!=="decline"&&(Pe+=1)}return le.push(`${Pe} release${Pe===1?"":"s"}`),le.push(`${g} remaining`),h.createElement(p,{color:"yellow"},le.join(", "))},he=await u(({useSubmit:ve})=>{let[ge,le]=re();ve(ge);let{relevantWorkspaces:Pe}=V(ge),g=new Set([...Pe].filter(ne=>!R.releaseRoots.has(ne))),[De,Ce]=w(0),de=E(ne=>{switch(ne){case a.BEFORE:Ce(De-1);break;case a.AFTER:Ce(De+1);break}},[De,Ce]);return h.createElement(A,{flexDirection:"column"},h.createElement(L,null),h.createElement(A,null,h.createElement(p,{wrap:"wrap"},"The following files have been modified in your local checkout.")),h.createElement(A,{flexDirection:"column",marginTop:1,paddingLeft:2},[...R.changedFiles].map(ne=>h.createElement(A,{key:ne},h.createElement(p,null,h.createElement(p,{color:"grey"},ue.fromPortablePath(R.root)),ue.sep,ue.relative(ue.fromPortablePath(R.root),ue.fromPortablePath(ne)))))),R.releaseRoots.size>0&&h.createElement(h.Fragment,null,h.createElement(A,{marginTop:1},h.createElement(p,{wrap:"wrap"},"Because of those files having been modified, the following workspaces may need to be released again (note that private workspaces are also shown here, because even though they won't be published, releasing them will allow us to flag their dependents for potential re-release):")),g.size>3?h.createElement(A,{marginTop:1},h.createElement(oe,{workspaces:R.releaseRoots,releases:ge})):null,h.createElement(A,{marginTop:1,flexDirection:"column"},h.createElement(o,{active:De%2===0,radius:1,size:2,onFocusRequest:de},[...R.releaseRoots].map(ne=>h.createElement(_,{key:ne.cwd,workspace:ne,decision:ge.get(ne)||"undecided",setDecision:Z=>le(ne,Z)}))))),g.size>0?h.createElement(h.Fragment,null,h.createElement(A,{marginTop:1},h.createElement(p,{wrap:"wrap"},"The following workspaces depend on other workspaces that have been marked for release, and thus may need to be released as well:")),h.createElement(A,null,h.createElement(p,null,"(Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to move the focus between the workspace groups.)")),g.size>5?h.createElement(A,{marginTop:1},h.createElement(oe,{workspaces:g,releases:ge})):null,h.createElement(A,{marginTop:1,flexDirection:"column"},h.createElement(o,{active:De%2===1,radius:2,size:2,onFocusRequest:de},[...g].map(ne=>h.createElement(_,{key:ne.cwd,workspace:ne,decision:ge.get(ne)||"undecided",setDecision:Z=>le(ne,Z)}))))):null)},{versionFile:R},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof he>"u")return 1;R.releases.clear();for(let[ve,ge]of he)R.releases.set(ve,ge);await R.saveAll()}async executeStandard(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new er(o.cwd,this.context.cwd);return await o.restoreInstallState(),(await Et.start({configuration:r,stdout:this.context.stdout},async u=>{let A=await aI(o);if(A===null||A.releaseRoots.size===0)return;if(A.root===null)throw new ot("This command can only be run on Git repositories");if(u.reportInfo(0,`Your PR was started right after ${ye.pretty(r,A.baseHash.slice(0,7),"yellow")} ${ye.pretty(r,A.baseTitle,"magenta")}`),A.changedFiles.size>0){u.reportInfo(0,"You have changed the following files since then:"),u.reportSeparator();for(let v of A.changedFiles)u.reportInfo(null,`${ye.pretty(r,ue.fromPortablePath(A.root),"gray")}${ue.sep}${ue.relative(ue.fromPortablePath(A.root),ue.fromPortablePath(v))}`)}let p=!1,h=!1,E=eF(A);if(E.size>0){p||u.reportSeparator();for(let v of E)u.reportError(0,`${Y.prettyLocator(r,v.anchoredLocator)} has been modified but doesn't have a release strategy attached`);p=!0}let w=bv(A);for(let[v,b]of w)h||u.reportSeparator(),u.reportError(0,`${Y.prettyLocator(r,v.anchoredLocator)} doesn't have a release strategy attached, but depends on ${Y.prettyWorkspace(r,b)} which is planned for release.`),h=!0;(p||h)&&(u.reportSeparator(),u.reportInfo(0,"This command detected that at least some workspaces have received modifications without explicit instructions as to how they had to be released (if needed)."),u.reportInfo(0,"To correct these errors, run `yarn version check --interactive` then follow the instructions."))})).exitCode()}};Zh.paths=[["version","check"]],Zh.usage=it.Usage({category:"Release-related commands",description:"check that all the relevant packages have been bumped",details:"\n **Warning:** This command currently requires Git.\n\n This command will check that all the packages covered by the files listed in argument have been properly bumped or declined to bump.\n\n In the case of a bump, the check will also cover transitive packages - meaning that should `Foo` be bumped, a package `Bar` depending on `Foo` will require a decision as to whether `Bar` will need to be bumped. This check doesn't cross packages that have declined to bump.\n\n In case no arguments are passed to the function, the list of modified files will be generated by comparing the HEAD against `master`.\n ",examples:[["Check whether the modified packages need a bump","yarn version check"]]});Ke();_t();var nF=tt(si());var $h=class extends ct{constructor(){super(...arguments);this.deferred=fe.Boolean("-d,--deferred",{description:"Prepare the version to be bumped during the next release cycle"});this.immediate=fe.Boolean("-i,--immediate",{description:"Bump the version immediately"});this.strategy=fe.String()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new er(o.cwd,this.context.cwd);let n=r.get("preferDeferredVersions");this.deferred&&(n=!0),this.immediate&&(n=!1);let u=nF.default.valid(this.strategy),A=this.strategy==="decline",p;if(u)if(a.manifest.version!==null){let E=qG(a.manifest.version,this.strategy);E!==null?p=E:p=this.strategy}else p=this.strategy;else{let E=a.manifest.version;if(!A){if(E===null)throw new ot("Can't bump the version if there wasn't a version to begin with - use 0.0.0 as initial version then run the command again.");if(typeof E!="string"||!nF.default.valid(E))throw new ot(`Can't bump the version (${E}) if it's not valid semver`)}p=sI(this.strategy)}if(!n){let w=(await xv(o)).get(a);if(typeof w<"u"&&p!=="decline"){let v=tF(a.manifest.version,p);if(nF.default.lt(v,w))throw new ot(`Can't bump the version to one that would be lower than the current deferred one (${w})`)}}let h=await aI(o,{allowEmpty:!0});return h.releases.set(a,p),await h.saveAll(),n?0:await this.cli.run(["version","apply"])}};$h.paths=[["version"]],$h.usage=it.Usage({category:"Release-related commands",description:"apply a new version to the current package",details:"\n This command will bump the version number for the given package, following the specified strategy:\n\n - If `major`, the first number from the semver range will be increased (`X.0.0`).\n - If `minor`, the second number from the semver range will be increased (`0.X.0`).\n - If `patch`, the third number from the semver range will be increased (`0.0.X`).\n - If prefixed by `pre` (`premajor`, ...), a `-0` suffix will be set (`0.0.0-0`).\n - If `prerelease`, the suffix will be increased (`0.0.0-X`); the third number from the semver range will also be increased if there was no suffix in the previous version.\n - If `decline`, the nonce will be increased for `yarn version check` to pass without version bump.\n - If a valid semver range, it will be used as new version.\n - If unspecified, Yarn will ask you for guidance.\n\n For more information about the `--deferred` flag, consult our documentation (https://yarnpkg.com/features/release-workflow#deferred-versioning).\n ",examples:[["Immediately bump the version to the next major","yarn version major"],["Prepare the version to be bumped to the next major","yarn version major --deferred"]]});var oDt={configuration:{deferredVersionFolder:{description:"Folder where are stored the versioning files",type:"ABSOLUTE_PATH",default:"./.yarn/versions"},preferDeferredVersions:{description:"If true, running `yarn version` will assume the `--deferred` flag unless `--immediate` is set",type:"BOOLEAN",default:!1}},commands:[Xh,Zh,$h]},aDt=oDt;var WG={};Yt(WG,{WorkspacesFocusCommand:()=>eg,WorkspacesForeachCommand:()=>tg,default:()=>uDt});Ke();Ke();_t();var eg=class extends ct{constructor(){super(...arguments);this.json=fe.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.production=fe.Boolean("--production",!1,{description:"Only install regular dependencies by omitting dev dependencies"});this.all=fe.Boolean("-A,--all",!1,{description:"Install the entire project"});this.workspaces=fe.Rest()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Ur.find(r);await o.restoreInstallState({restoreResolutions:!1});let u;if(this.all)u=new Set(o.workspaces);else if(this.workspaces.length===0){if(!a)throw new er(o.cwd,this.context.cwd);u=new Set([a])}else u=new Set(this.workspaces.map(p=>o.getWorkspaceByIdent(Y.parseIdent(p))));for(let p of u)for(let h of this.production?["dependencies"]:Nt.hardDependencies)for(let E of p.manifest.getForScope(h).values()){let w=o.tryWorkspaceByDescriptor(E);w!==null&&u.add(w)}for(let p of o.workspaces)u.has(p)?this.production&&p.manifest.devDependencies.clear():(p.manifest.installConfig=p.manifest.installConfig||{},p.manifest.installConfig.selfReferences=!1,p.manifest.dependencies.clear(),p.manifest.devDependencies.clear(),p.manifest.peerDependencies.clear(),p.manifest.scripts.clear());return(await Et.start({configuration:r,json:this.json,stdout:this.context.stdout,includeLogs:!0},async p=>{await o.install({cache:n,report:p,persistProject:!1})})).exitCode()}};eg.paths=[["workspaces","focus"]],eg.usage=it.Usage({category:"Workspace-related commands",description:"install a single workspace and its dependencies",details:"\n This command will run an install as if the specified workspaces (and all other workspaces they depend on) were the only ones in the project. If no workspaces are explicitly listed, the active one will be assumed.\n\n Note that this command is only very moderately useful when using zero-installs, since the cache will contain all the packages anyway - meaning that the only difference between a full install and a focused install would just be a few extra lines in the `.pnp.cjs` file, at the cost of introducing an extra complexity.\n\n If the `-A,--all` flag is set, the entire project will be installed. Combine with `--production` to replicate the old `yarn install --production`.\n "});Ke();Ke();Ke();_t();var xm=tt(Jo()),Eve=tt(rd());tl();var tg=class extends ct{constructor(){super(...arguments);this.recursive=fe.Boolean("-R,--recursive",!1,{description:"Find packages via dependencies/devDependencies instead of using the workspaces field"});this.from=fe.Array("--from",[],{description:"An array of glob pattern idents or paths from which to base any recursion"});this.all=fe.Boolean("-A,--all",!1,{description:"Run the command on all workspaces of a project"});this.verbose=fe.Boolean("-v,--verbose",{description:"Prefix each output line with the name of the originating workspace"});this.parallel=fe.Boolean("-p,--parallel",!1,{description:"Run the commands in parallel"});this.interlaced=fe.Boolean("-i,--interlaced",!1,{description:"Print the output of commands in real-time instead of buffering it"});this.jobs=fe.String("-j,--jobs",{description:"The maximum number of parallel tasks that the execution will be limited to; or `unlimited`",validator:LT([Gs(["unlimited"]),ed(NT(),[MT(),OT(1)])])});this.topological=fe.Boolean("-t,--topological",!1,{description:"Run the command after all workspaces it depends on (regular) have finished"});this.topologicalDev=fe.Boolean("--topological-dev",!1,{description:"Run the command after all workspaces it depends on (regular + dev) have finished"});this.include=fe.Array("--include",[],{description:"An array of glob pattern idents or paths; only matching workspaces will be traversed"});this.exclude=fe.Array("--exclude",[],{description:"An array of glob pattern idents or paths; matching workspaces won't be traversed"});this.publicOnly=fe.Boolean("--no-private",{description:"Avoid running the command on private workspaces"});this.since=fe.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.commandName=fe.String();this.args=fe.Proxy()}async execute(){let r=await Xe.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!this.all&&!a)throw new er(o.cwd,this.context.cwd);await o.restoreInstallState();let n=this.cli.process([this.commandName,...this.args]),u=n.path.length===1&&n.path[0]==="run"&&typeof n.scriptName<"u"?n.scriptName:null;if(n.path.length===0)throw new ot("Invalid subcommand name for iteration - use the 'run' keyword if you wish to execute a script");let A=this.all?o.topLevelWorkspace:a,p=this.since?Array.from(await $o.fetchChangedWorkspaces({ref:this.since,project:o})):[A,...this.from.length>0?A.getRecursiveWorkspaceChildren():[]],h=le=>xm.default.isMatch(Y.stringifyIdent(le.locator),this.from)||xm.default.isMatch(le.relativeCwd,this.from),E=this.from.length>0?p.filter(h):p,w=new Set([...E,...E.map(le=>[...this.recursive?this.since?le.getRecursiveWorkspaceDependents():le.getRecursiveWorkspaceDependencies():le.getRecursiveWorkspaceChildren()]).flat()]),v=[],b=!1;if(u!=null&&u.includes(":")){for(let le of o.workspaces)if(le.manifest.scripts.has(u)&&(b=!b,b===!1))break}for(let le of w)u&&!le.manifest.scripts.has(u)&&!b&&!(await sn.getWorkspaceAccessibleBinaries(le)).has(u)||u===process.env.npm_lifecycle_event&&le.cwd===a.cwd||this.include.length>0&&!xm.default.isMatch(Y.stringifyIdent(le.locator),this.include)&&!xm.default.isMatch(le.relativeCwd,this.include)||this.exclude.length>0&&(xm.default.isMatch(Y.stringifyIdent(le.locator),this.exclude)||xm.default.isMatch(le.relativeCwd,this.exclude))||this.publicOnly&&le.manifest.private===!0||v.push(le);let C=this.verbose??this.context.stdout.isTTY,R=this.parallel?this.jobs==="unlimited"?1/0:Number(this.jobs)||Math.ceil(As.availableParallelism()/2):1,L=R===1?!1:this.parallel,_=L?this.interlaced:!0,V=(0,Eve.default)(R),re=new Map,oe=new Set,pe=0,he=null,ve=!1,ge=await Et.start({configuration:r,stdout:this.context.stdout,includePrefix:!1},async le=>{let Pe=async(g,{commandIndex:De})=>{if(ve)return-1;!L&&C&&De>1&&le.reportSeparator();let Ce=lDt(g,{configuration:r,verbose:C,commandIndex:De}),[de,ne]=Cve(le,{prefix:Ce,interlaced:_}),[Z,me]=Cve(le,{prefix:Ce,interlaced:_});try{C&&le.reportInfo(null,`${Ce} Process started`);let be=Date.now(),ut=await this.cli.run([this.commandName,...this.args],{cwd:g.cwd,stdout:de,stderr:Z})||0;de.end(),Z.end(),await ne,await me;let H=Date.now();if(C){let yt=r.get("enableTimers")?`, completed in ${ye.pretty(r,H-be,ye.Type.DURATION)}`:"";le.reportInfo(null,`${Ce} Process exited (exit code ${ut})${yt}`)}return ut===130&&(ve=!0,he=ut),ut}catch(be){throw de.end(),Z.end(),await ne,await me,be}};for(let g of v)re.set(g.anchoredLocator.locatorHash,g);for(;re.size>0&&!le.hasErrors();){let g=[];for(let[de,ne]of re){if(oe.has(ne.anchoredDescriptor.descriptorHash))continue;let Z=!0;if(this.topological||this.topologicalDev){let me=this.topologicalDev?new Map([...ne.manifest.dependencies,...ne.manifest.devDependencies]):ne.manifest.dependencies;for(let be of me.values()){let ut=o.tryWorkspaceByDescriptor(be);if(Z=ut===null||!re.has(ut.anchoredLocator.locatorHash),!Z)break}}if(!!Z&&(oe.add(ne.anchoredDescriptor.descriptorHash),g.push(V(async()=>{let me=await Pe(ne,{commandIndex:++pe});return re.delete(de),oe.delete(ne.anchoredDescriptor.descriptorHash),me})),!L))break}if(g.length===0){let de=Array.from(re.values()).map(ne=>Y.prettyLocator(r,ne.anchoredLocator)).join(", ");le.reportError(3,`Dependency cycle detected (${de})`);return}let Ce=(await Promise.all(g)).find(de=>de!==0);he===null&&(he=typeof Ce<"u"?1:he),(this.topological||this.topologicalDev)&&typeof Ce<"u"&&le.reportError(0,"The command failed for workspaces that are depended upon by other workspaces; can't satisfy the dependency graph")}});return he!==null?he:ge.exitCode()}};tg.paths=[["workspaces","foreach"]],tg.usage=it.Usage({category:"Workspace-related commands",description:"run a command on all workspaces",details:"\n This command will run a given sub-command on current and all its descendant workspaces. Various flags can alter the exact behavior of the command:\n\n - If `-p,--parallel` is set, the commands will be ran in parallel; they'll by default be limited to a number of parallel tasks roughly equal to half your core number, but that can be overridden via `-j,--jobs`, or disabled by setting `-j unlimited`.\n\n - If `-p,--parallel` and `-i,--interlaced` are both set, Yarn will print the lines from the output as it receives them. If `-i,--interlaced` wasn't set, it would instead buffer the output from each process and print the resulting buffers only after their source processes have exited.\n\n - If `-t,--topological` is set, Yarn will only run the command after all workspaces that it depends on through the `dependencies` field have successfully finished executing. If `--topological-dev` is set, both the `dependencies` and `devDependencies` fields will be considered when figuring out the wait points.\n\n - If `-A,--all` is set, Yarn will run the command on all the workspaces of a project. By default yarn runs the command only on current and all its descendant workspaces.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If `--from` is set, Yarn will use the packages matching the 'from' glob as the starting point for any recursive search.\n\n - If `--since` is set, Yarn will only run the command on workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - The command may apply to only some workspaces through the use of `--include` which acts as a whitelist. The `--exclude` flag will do the opposite and will be a list of packages that mustn't execute the script. Both flags accept glob patterns (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n Adding the `-v,--verbose` flag (automatically enabled in interactive terminal environments) will cause Yarn to print more information; in particular the name of the workspace that generated the output will be printed at the front of each line.\n\n If the command is `run` and the script being run does not exist the child workspace will be skipped without error.\n ",examples:[["Publish current and all descendant packages","yarn workspaces foreach npm publish --tolerate-republish"],["Run build script on current and all descendant packages","yarn workspaces foreach run build"],["Run build script on current and all descendant packages in parallel, building package dependencies first","yarn workspaces foreach -pt run build"],["Run build script on several packages and all their dependencies, building dependencies first","yarn workspaces foreach -ptR --from '{workspace-a,workspace-b}' run build"]]});function Cve(t,{prefix:e,interlaced:r}){let o=t.createStreamReporter(e),a=new Ye.DefaultStream;a.pipe(o,{end:!1}),a.on("finish",()=>{o.end()});let n=new Promise(A=>{o.on("finish",()=>{A(a.active)})});if(r)return[a,n];let u=new Ye.BufferStream;return u.pipe(a,{end:!1}),u.on("finish",()=>{a.end()}),[u,n]}function lDt(t,{configuration:e,commandIndex:r,verbose:o}){if(!o)return null;let n=`[${Y.stringifyIdent(t.locator)}]:`,u=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],A=u[r%u.length];return ye.pretty(e,n,A)}var cDt={commands:[eg,tg]},uDt=cDt;var Jb=()=>({modules:new Map([["@yarnpkg/cli",W1],["@yarnpkg/core",G1],["@yarnpkg/fslib",MI],["@yarnpkg/libzip",_I],["@yarnpkg/parsers",VI],["@yarnpkg/shell",B1],["clipanion",nw],["semver",ADt],["typanion",Wo],["@yarnpkg/plugin-essentials",Z8],["@yarnpkg/plugin-compat",nH],["@yarnpkg/plugin-constraints",EH],["@yarnpkg/plugin-dlx",IH],["@yarnpkg/plugin-exec",vH],["@yarnpkg/plugin-file",SH],["@yarnpkg/plugin-git",X8],["@yarnpkg/plugin-github",bH],["@yarnpkg/plugin-http",QH],["@yarnpkg/plugin-init",kH],["@yarnpkg/plugin-interactive-tools",Rq],["@yarnpkg/plugin-link",Tq],["@yarnpkg/plugin-nm",mj],["@yarnpkg/plugin-npm",hG],["@yarnpkg/plugin-npm-cli",wG],["@yarnpkg/plugin-pack",cG],["@yarnpkg/plugin-patch",bG],["@yarnpkg/plugin-pnp",sj],["@yarnpkg/plugin-pnpm",FG],["@yarnpkg/plugin-stage",MG],["@yarnpkg/plugin-typescript",UG],["@yarnpkg/plugin-version",GG],["@yarnpkg/plugin-workspace-tools",WG]]),plugins:new Set(["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-constraints","@yarnpkg/plugin-dlx","@yarnpkg/plugin-exec","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-interactive-tools","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm","@yarnpkg/plugin-stage","@yarnpkg/plugin-typescript","@yarnpkg/plugin-version","@yarnpkg/plugin-workspace-tools"])});Vb({binaryVersion:On||"",pluginConfiguration:Jb()});})(); +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ +/*! + * buildToken + * Builds OAuth token prefix (helper function) + * + * @name buildToken + * @function + * @param {GitUrl} obj The parsed Git url object. + * @return {String} token prefix + */ +/*! + * fill-range + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Licensed under the MIT License. + */ +/*! + * is-extglob + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + */ +/*! + * is-glob + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ +/*! + * is-number + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Released under the MIT License. + */ +/*! + * is-windows + * + * Copyright © 2015-2018, Jon Schlinkert. + * Released under the MIT License. + */ +/*! + * to-regex-range + * + * Copyright (c) 2015-present, Jon Schlinkert. + * Released under the MIT License. + */ +/** + @license + Copyright (c) 2015, Rebecca Turner + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + */ +/** + @license + Copyright Joyent, Inc. and other Node contributors. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to permit + persons to whom the Software is furnished to do so, subject to the + following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +/** + @license + Copyright Node.js contributors. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. +*/ +/** + @license + The MIT License (MIT) + + Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ +/** @license React v0.18.0 + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +/** @license React v0.24.0 + * react-reconciler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +/** @license React v16.13.1 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/balpy/balancer-deployments/.yarn/versions/1dfc32f3.yml b/balpy/balancer-deployments/.yarn/versions/1dfc32f3.yml new file mode 100644 index 0000000..e69de29 diff --git a/balpy/balancer-deployments/.yarnrc.yml b/balpy/balancer-deployments/.yarnrc.yml new file mode 100644 index 0000000..fb73fdf --- /dev/null +++ b/balpy/balancer-deployments/.yarnrc.yml @@ -0,0 +1,5 @@ +nodeLinker: node-modules + +npmPublishAccess: public + +yarnPath: .yarn/releases/yarn-4.0.0-rc.42.cjs diff --git a/balpy/balancer-deployments/CHANGELOG.md b/balpy/balancer-deployments/CHANGELOG.md new file mode 100644 index 0000000..7305235 --- /dev/null +++ b/balpy/balancer-deployments/CHANGELOG.md @@ -0,0 +1,199 @@ +# Changelog + +## Unreleased + +### Breaking changes + +- The `20221205-l2-gauge-checkpointer` task was deleted and replaced with `20230527-l2-gauge-checkpointer`. The old task had not been used by anyone. + +### New Deployments + +- Deployed `TimelockAuthorizer` and `TimelockAuthorizerMigrator` to Goerli. +- Deployed `BatchRelayerLibrary` V5 to all networks. +- Deployed `L2BalancerPseudoMinter` to all networks except Ethereum. +- Deployed `VotingEscrowDelegationProxy` and `NullVotingEscrow` to all networks except Ethereum. +- Deployed `WeightedPoolFactory` V4 to all networks. +- Deployed `ComposableStablePoolFactory` V4 to all networks. +- Deployed `ChildChainGaugeFactory` and `ChildChainGauge` to all networks except Ethereum. +- Deployed `L2LayerZeroBridgeForwarder` to all networks except Ethereum. +- Deployed `ManagedPoolFactory` V2 to all networks. +- Deployed `AuthorizerWithAdaptorValidation` to all networks. +- Deployed `ERC4626LinearPoolFactoryV4` to Mainnet, Polygon, Optimism, Arbitrum and Avalanche. +- Deployed `YearnLinearPoolFactoryV2` to Mainnet, Polygon, Arbitrum and Optimism. +- Deployed `AaveLinearPoolFactoryV5` to all networks. +- Deployed `GearboxLinearPoolFactoryV2` to Mainnet. +- Deployed `SiloLinearPoolFactoryV2` to Goerli and Mainnet. +- Deployed `PolygonZkEVMRootGaugeFactory` to Mainnet. +- Deployed `VotingEscrowRemapper` and `OmniVotingEscrowAdaptor` to Goerli, Sepolia and Mainnet. +- Deployed `GaugeAdder` V4 to Goerli, Sepolia and Mainnet. +- Deployed `VeBoostV2` to Polygon, Arbitrum, Optimism, Gnosis, Avalanche, zkEVM and Base. +- Deployed `L2GaugeCheckpointer` to Mainnet. +- Deployed `GaugeWorkingBalanceHelper` to all networks. +- Deployed `AvalancheRootGaugeFactory` V2 to Mainnet. +- Deployed `BalancerPoolDataQueries` to all networks. +- Deployed `TimelockAuthorizer` to Goerli and Sepolia. +- Deployed `ComposableStablePoolFactory` V5 to all networks. +- Deployed `ChildChainGaugeCheckpointer` (Balancer relayer v5.1) to all networks except Ethereum. +- Deployed `ChainlinkRateProviderFactory` to all networks. +- Deployed `StakelessGaugeCheckpointer` V2 to Ethereum and Sepolia. +- Deployed `BaseRootGaugeFactory` to Mainnet. + +### Deprecations + +- Deprecated `20221202-timelock-authorizer`. +- Deprecated `20220916-batch-relayer-v4`. +- Deprecated `20230109-gauge-adder-v3`. +- Deprecated `20230206-aave-rebalanced-linear-pool-v4`. +- Deprecated `20230206-composable-stable-pool-v3`. +- Deprecated `20230206-erc4626-linear-pool-v3`. +- Deprecated `20230206-weighted-pool-v3`. +- Deprecated `20230213-gearbox-linear-pool`. +- Deprecated `20230213-yearn-linear-pool`. +- Deprecated `20230315-silo-linear-pool`. +- Deprecated `20230320-composable-stable-pool-v4`. +- Deprecated `20230316-avax-l2-balancer-pseudo-minter` and `20230316-avax-child-chain-gauge-factory-v2` (initial version for `L2BalancerPseudoMinter` and `ChildChainGaugeFactory` for Avalanche). +- Deprecated `20230527-l2-gauge-checkpointer`. +- Deprecated `20230529-avalanche-root-gauge-factory`. +- Deprecated `20230731-stakeless-gauge-checkpointer`. + +### New Networks + +- Deployed all L2 contracts to Avalanche. +- Deployed all contracts on Goerli to Sepolia. +- Deployed all L2 contracts to Polygon zkEVM. + +## 3.2.0 (2023-02-24) + +### New Deployments + +- Deployed `WeightedPoolFactory` v3 to all networks. +- Deployed `ComposableStablePoolFactory` v3 to all networks. +- Deployed `L2GaugeCheckpointer` to Mainnet. +- Deployed `VeBoostV2` to Mainnet. +- Deployed `NoProtocolFeeLiquidityBootstrappingPoolFactory` to Gnosis. +- Deployed `ERC4626LinearPoolFactory` to Gnosis. +- Deployed `UnbuttonAaveLinearPoolFactory` to Gnosis. +- Deployed `StablePoolFactory` to Gnosis. +- Deployed `WeightedPoolFactory` to Gnosis. +- Deployed `ComposableStablePoolFactory` to Gnosis. +- Deployed `PoolRecoveryHelper` to Gnosis. +- Deployed `AaveLinearPoolFactory` to Gnosis. +- Deployed `GaugeAdderV3` to Mainnet and Goerli. +- Deployed `TimelockAuthorizerTransitionMigrator` to Mainnet. +- Deployed `AaveLinearPoolV4` to all networks. +- Deployed `ERC4626LinearPoolFactory` to Mainnet, Goerli, Arbitrum, Polygon, and Optimism. +- Deployed `EulerLinearPoolFactory` to Mainnet and Goerli. +- Deployed `YearnLinearPoolFactory` to Mainnet, Goerli, Arbitrum, Polygon, and Optimism. +- Deployed `GearboxLinearPoolFactory` to Mainnet and Goerli. +- Deployed `ChildChainLiquidityGaugeFactory`, `ChildChainStreamer`, and `RewardsOnlyGauge` to Gnosis. +- Deployed `ChildChainGaugeTokenAdder` to Gnosis. +- Deployed `ChildChainGaugeRewardHelper` to Gnosis. +- Deployed `GnosisRootGaugeFactory` to Mainnet. +- Deployed `MerkleOrchard` V2 to Mainnet, Goerli, Arbitrum and Polygon. +- Deployed `SingleRecipientGaugeFactory` V2 to Mainnet and Goerli. +- Deployed `ProtocolIdRegistry` to Mainnet, Goerli, Arbitrum, Polygon, Optimism and Gnosis. + +### Deprecations + +- Deprecated `20221207-aave-rebalanced-linear-pool-v3`. +- Deprecated `20220425-unbutton-aave-linear-pool`. +- Deprecated `20220404-erc4626-linear-pool-v2`. +- Deprecated `20220325-gauge-adder`. +- Deprecated `20220628-gauge-adder-v2`. + +### Breaking Changes + +- The `20221115-aave-rebalanced-linear-pool` task was deleted and replaced with `20221207-aave-rebalanced-linear-pool-v3`. The old task had not been used by anyone. + +## 3.1.1 (2022-12-01) + +### Bugfixes + +- Fixed changelog. + +## 3.1.0 (2022-12-01) + +### New Deployments + +- Deployed core infrastructure (`Authorizer`, `Vault`, `AuthorizerAdaptor`, `ProtocolFeeWithdrawer`, `ProtocolFeePercentagesProvider`, `BalancerQueries` and `BatchRelayer`) to Gnosis and BNB. +- Deployed core Pool factories (`WeightedPoolFactory`, `ComposableStablePoolFactory`, `LiquidityBootstrappingPool`, `AaveLinearPool`) to BNB. +- Deployed `AuthorizerAdaptorEntrypoint` to all networks. +- Deployed `AaveLinearPoolFactory` to all networks. +- Deployed `PoolRecoveryHelper` to all networks. +- Deployed `ComposableStablePoolFactory` to all networks. +- Deployed `TimelockAuthorizer` to ethereum mainnet and goerli. + +### Deprecations + +- Deprecated `20211021-managed-pool` due to lacking features and not being expected to ever be used. A new version will be released soon. + +### API Changes + +- Made `getBalancerContractAbi`, `getBalancerContractBytecode`, `getBalancerContractAddress` and `getBalancerDeployment` synchronous rather than asynchronous functions. +- Added `getBalancerContractArtifact` which returns a artifact file for the contract in the same format used by Hardhat. +- Deprecated `getBalancerContractBytecode` in favour of `getBalancerContractArtifact`. +- Added `lookupBalancerContractByAddress` which returns the contract's name and the relevant deployment task if it is a tracked Balancer contract. + +## 3.0.0 (2022-10-25) + +### New Deployments + +- All deployments that occurred since September 2021, including Linear Pools, Liquidity Mining, Composable Stable Pools and Managed Pools. + +### Breaking Changes + +- Introduced the `deprecated` directory. Deployments may be moved to that directory in minor releases - this will not be considered a breaking change. + +## 2.3.0 (2021-09-24) + +### New Deployments + +- Deployed `InvestmentPoolFactory` to Mainnet, Polygon and Arbitrum. +- Deployed `MerkleRedeem` to Mainnet for VITA distribution. +- Deployed `MerkleRedeem` to Arbitrum for BAL distribution. + +## 2.2.0 (2021-09-15) + +### New Features + +- Added creation code in the `bytecode` directory of each task. +- Added `getBalancerContractBytecode` to get a contract's creation code, which makes deploying contracts easier to package users. + +## 2.1.3 (2021-08-30) + +### Fixes + +- Fixed inconsistent JSON file loading semantics. + +## 2.1.2 (2021-08-30) + +### Fixes + +- Fixed package paths in published contract loaders. + +## 2.1.1 (2021-08-25) + +### Fixes + +- Added `BalancerHelpers` to the Arbitrum deployment. + +## 2.1.0 (2021-08-24) + +### New Deployments + +- Deployed `Authorizer`, `Vault`, `WeightedPoolFactory`, `WeightedPool2TokensFactory`, `StablePoolFactory`, `LiquidityBootstrappingPoolFactory`, `MetaStablePoolFactory` on Arbitrum mainnet. + +## 2.0.0 (2021-08-24) + +### New Deployments + +- `StablePoolFactory` +- `LiquidityBootstrappingPoolFactory` +- `MetaStablePoolFactory` +- `MerkleRedeem` (for the LDO token) +- `LidoRelayer` +- `WstETHRateProvider` + +### Breaking Changes + +This release changes the directory structure of the package and introduces the concept of 'tasks'. Refer to [the readme](./README.md) for more information on where artifacts are located, and the different task IDs. diff --git a/balpy/balancer-deployments/DEPLOYING.md b/balpy/balancer-deployments/DEPLOYING.md new file mode 100644 index 0000000..1f092f1 --- /dev/null +++ b/balpy/balancer-deployments/DEPLOYING.md @@ -0,0 +1,161 @@ +# Deploying Balancer Contracts + +The deployments package aims to provide a robust mechanism to run and verify deployments on multiple networks. This document describes the rationale, what guarantees it provides, and how to create and run deployments. + +## Overview + +Each deployment unit is called a 'task'. Tasks have a unique ID, which is often prefixed with the date on which they were first executed (to e.g. differentiate the April 2021 deployment of Weighted Pools from the one deployed in July 2022, which might have wildly different behavior). + +A task is made up of multiple components: + +- one or multiple build information JSON files, located in the `build-info` directory. +- an `input.ts` file, containing information on dependencies and deployment parameters (which might differ across networks). +- an `index.ts` file, with the instructions for the actual deployment. +- the `artifact` directory, with JSON files extracted from the build information containing contracts' ABI, bytecode, and metadata. +- the `output` directory, with JSON files containing the deployment addresses of the tasks' contracts on each network. +- optional fork tests in the `test` directory. + +### Why `build-info` + +When Hardhat compiles a Solidity project, in addition to the traditional contract artifacts it also produces a special file in the `artifacts/build-info` directory, which includes all of the compilation inputs (full source code, compiler version and settings, etc.) and all of the compilation outputs (creation bytecode, ABI, AST, etc.). By storing this file in the repository and using it as the source of truth for deployments, we fully break the dependency on the source code and are able to modify it and update it after a deployment is created, while guaranteeing that all deployments of a given task will be identical (since they share the same build information). + +As part of our development process, we frequently alter the source code of contracts that have already been deployed, and keep no historical versions: the deployment data is fully stored in the build information file. + +## Creating Tasks + +To create a new task, these are the recommended steps: +- Create a new directory named after the task ID in the `tasks` directory +- Add an entry in the README file with the new task +- Write appropriate `input.ts` and `index.ts` files, which specify deployment arguments and steps respectively +- Populate `build-info` directory with compiled contracts data (see [Generating build info](#generating-build-info) section) +- Generate artifacts with ABI and bytecode from build info files (see [Generating ABI and bytecode files](#generating-artifact-files-with-abi-and-bytecode) section) + + +Inputs and task instructions are plain TypeScript files that call appropriate functions - there's no DSL. The recommended way to write them is to copy the structure from the `input.ts` and `index.ts` files from a similar task, and then edit those as needed. +The `output` and `artifact` directories will be automatically generated and populated. + +### Generating build info + +The build information should be generated on a clean commit, so that it can be verified by other parties. On the project directory, delete the `artifacts` directory and run `yarn hardhat compile` for a clean compilation. The file will then be located at `artifacts/build-info`, and it'll contain the data for all the contracts in the workspace. + +### Generating artifact files with ABI and bytecode + +To generate the artifacts from build info files: +- Copy the generated build info `json` inside `/pkg//artifacts/build-info` to the new `/pkg/deployments/tasks//build-info` directory. +- From the `deployments` workspace, run `extract-artifacts` task using the task ID as parameter. Optionally, the contract name and the target file can be specified if e.g. the contract name doesn't match the file name, or if the contract is present in more than one file with different compilation settings. For example: + +``` +yarn extract-artifacts --id 20221021-managed-pool --name ManagedPool --file ManagedPoolFactory +``` + +The `artifact` folder should have been populated with the created artifacts at this point. + +### Vyper Compilation + +Hardhat does not generate build information for Vyper contracts - those must be created manually. + +## Verifying Tasks + +There are three things to verify from a task: + +- the build information +- the inputs +- the deployment script + +The last two can be performed with simple manual inspection, that is, reviewing `input.ts` and `index.ts` and checking that they have sensible inputs and correct constructor arguments. + +In order to check the `build-info` contents, follow these steps: + +```bash +$ git checkout +$ cd # e.g. pkg/v2-pool-weighted +$ rm -rf artifacts # clean prior builds +$ yarn hardhat compile +$ diff artifacts/build-info/.json ../deployments/tasks//build-info/.json +``` + +The final `diff` command will produce no output if the build information files match. + +## Running Tasks + +### Prerequisites + +Tasks require an EOA private key to sign transactions with, an RPC endpoint to broadcast them, and an Etherscan API key to submit source code for verification. + +This data is accessed via the [`local-networks-config`](https://www.npmjs.com/package/hardhat-local-networks-config-plugin) Hardhat plugin, which expects a JSON file to be located at `~/.hardhat/networks.json` with the following contents (replace accordingly): + +```json +{ + "networks": { + "mainnet": { + "url": "https://mainnet.rpc.endpoint/myAPIKey", + "verificationAPIKey": "mainnet-etherscan-API-key" + }, + "polygon": { + "url": "https://polygon.rpc.endpoint/myAPIKey", + "verificationAPIKey": "polygon-etherscan-API-key" + }, + "arbitrum": { + "url": "https://arbitrum.rpc.endpoint/myAPIKey", + "verificationAPIKey": "arbitrum-etherscan-API-key" + }, + "optimism": { + "url": "https://optimism.rpc.endpoint/myAPIKey", + "verificationAPIKey": "optimism-etherscan-API-key" + }, + "gnosis": { + "url": "https://gnosis.rpc.endpoint/myAPIKey", + "verificationAPIKey": "gnosis-etherscan-API-key" + }, + "bsc": { + "url": "https://bsc.rpc.endpoint/myAPIKey", + "verificationAPIKey": "bsc-etherscan-API-key" + }, + "goerli": { + "url": "https://goerli.rpc.endpoint/myAPIKey", + "verificationAPIKey": "goerli-etherscan-API-key" + } + }, + "defaultConfig": { + "gasPrice": "auto", + "gasMultiplier": 1, + "accounts": ["0x-eoa-private-key"] + } +} +``` + +### `deploy` + +Once all prerequisites are met and the task is ready, its contracts can be deployed via the custom `deploy` Hardhat task, which can be run via: + +```bash +$ yarn hardhat deploy --id --network +``` + +Deployment addresses will be automatically saved to the appropriate file in the tasks's `output` directory, and source code submittted to Etherscan for verification[^1]. + +Further runs of the task will not attempt to redeploy contracts for which an output already exists: use the `--force` flag to do a redeployment. + +## Checking Deployments + +The deployments package is able to verify that the addresses found in the `output` directories correspond exactly to a run of the task as described by `index.ts`, using the inputs at `input.ts` and the data from the `build-info` directory. + +This can be done manually by running the `check-deployments` Hardhat task (`yarn hardhat check-deployments --network `), but it is also done automatically on CI. Like deployment, [this also requires access to an RPC endpoint](#prerequisites). + +## Running Tests + +Some tasks define fork tests, which consist of creating a local fork from a real network at a given block, running the task on said fork, and then performing tests. + +Unlike regular deployments, this requires access to an _archive node_ instead of a regular RPC endpoint. [Alchemy](https://www.alchemy.com/) provides access to these on their free tier. They are configured the same way as [regular deployment endpoints](#prerequisites) (it is possible to simply use the archive endpoint for all purposes, including contract deployment). + +Once that is set up, fork tests can be run: + +```bash +$ yarn test +``` + +### Writing Fork Tests + +These are fairly involved, as they use a lot of custom utilities related to loading other tasks, impersonating accounts, etc. The suggested way to write them is to copy one for a similar task and then edit as needed. + +[^1]: Etherscan verification typically fails the first time a task is run, as some time must pass for the newly deployed bytecode to be indexed by their servers. Running the task again should fix the issue. diff --git a/balpy/balancer-deployments/LICENSE b/balpy/balancer-deployments/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/balpy/balancer-deployments/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is 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. + + This program 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 this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/balpy/balancer-deployments/README.md b/balpy/balancer-deployments/README.md new file mode 100644 index 0000000..9a1d1a3 --- /dev/null +++ b/balpy/balancer-deployments/README.md @@ -0,0 +1,201 @@ +# Balancer + +# Balancer V2 Deployments + +[![NPM Package](https://img.shields.io/npm/v/@balancer-labs/v2-deployments.svg)](https://www.npmjs.org/package/@balancer-labs/v2-deployments) +[![GitHub Repository](https://img.shields.io/badge/github-deployments-lightgrey?logo=github)](https://github.com/balancer-labs/balancer-v2-monorepo/tree/master/pkg/deployments) + +This package contains the addresses and ABIs of all Balancer V2 deployed contracts for Ethereum mainnet, Polygon, Arbitrum, Optimism, Gnosis, BSC and Avalanche, as well as various test networks. Each deployment consists of a deployment script (called 'task'), inputs (script configuration, such as dependencies), outputs (typically contract addresses), ABIs and bytecode files of related contracts. + +Addresses and ABIs can be consumed from the package in JavaScript environments, or manually retrieved from the [GitHub](https://github.com/balancer-labs/balancer-v2-monorepo/tree/master/pkg/deployments) repository. + +Note that some protocol contracts are created dynamically: for example, `WeightedPool` contracts are deployed by the canonical `WeightedPoolFactory`. While the ABIs of these contracts are stored in the `abi` directory of each deployment, their addresses are not. Those can be retrieved by querying the on-chain state or processing emitted events. + +## Overview + +### Deploying Contracts + +For more information on how to create new deployments or run existing ones in new networks, head to the [deployment guide](DEPLOYING.md). + +### Installation + +```console +$ npm install @balancer-labs/v2-deployments +``` + +### Usage + +Import `@balancer-labs/v2-deployments` to access the different ABIs and deployed addresses. To see all current Task IDs and their associated contracts, head to [Active Deployments](#active-deployments). + +Past deployments that are currently not in use or have been superseded can be accessed in the [Deprecated Deployments](#deprecated-deployments) section. Use `deprecated/` as prefix when referring to a deprecated task ID. + +> ⚠️ Exercise care when interacting with deprecated deployments: there's often a very good reason why they're no longer active. +> +> You can find information on why each deployment has been deprecated in their corresponding readme file. + +--- + +- **async function getBalancerContract(taskID, contract, network)** + +Returns an [Ethers](https://docs.ethers.io/v5/) contract object for a canonical deployment (e.g. the Vault, or a Pool factory). + +_Note: requires using [Hardhat](https://hardhat.org/) with the [`hardhat-ethers`](https://hardhat.org/plugins/nomicfoundation-hardhat-ethers.html) plugin._ + +- **async function getBalancerContractAt(taskID, contract, address)** + +Returns an [Ethers](https://docs.ethers.io/v5/) contract object for a contract dynamically created at a known address (e.g. a Pool created from a factory). + +_Note: requires using [Hardhat](https://hardhat.org/) with the [`hardhat-ethers`](https://hardhat.org/plugins/nomicfoundation-hardhat-ethers.html) plugin._ + +- **function getBalancerContractAbi(taskID, contract)** + +Returns a contract's [ABI](https://docs.soliditylang.org/en/latest/abi-spec.html). + +- **function getBalancerContractBytecode(taskID, contract)** + +Returns a contract's [creation code](https://docs.soliditylang.org/en/latest/contracts.html#creating-contracts). + +- **function getBalancerContractAddress(taskID, contract, network)** + +Returns the address of a contract's canonical deployment. + +- **function getBalancerDeployment(taskID, network)** + +Returns an object with all contracts from a deployment and their addresses. + +## Active Deployments + +| Description | Task ID | +| ------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- | +| Authorizer, governance contract | [`20210418-authorizer`](./tasks/20210418-authorizer) | +| Vault, main protocol contract | [`20210418-vault`](./tasks/20210418-vault) | +| Rate Provider for wstETH | [`20210812-wsteth-rate-provider`](./tasks/20210812-wsteth-rate-provider) | +| Liquidity Bootstrapping Pools | [`20211202-no-protocol-fee-lbp`](./tasks/20211202-no-protocol-fee-lbp) | +| Authorizer Adaptor for extending governance | [`20220325-authorizer-adaptor`](./tasks/20220325-authorizer-adaptor) | +| Wallet for the BAL token | [`20220325-bal-token-holder-factory`](./tasks/20220325-bal-token-holder-factory) | +| Admin of the BAL token | [`20220325-balancer-token-admin`](./tasks/20220325-balancer-token-admin) | +| Liquidity Mining: veBAL, Gauge Controller and Minter | [`20220325-gauge-controller`](./tasks/20220325-gauge-controller) | +| Test Balancer Token | [`20220325-test-balancer-token`](./tasks/20220325-test-balancer-token) | +| Delegation of veBAL boosts | [`20220325-ve-delegation`](./tasks/20220325-ve-delegation) | +| Gauges on child networks (L2s and sidechains) | [`20220413-child-chain-gauge-factory`](./tasks/20220413-child-chain-gauge-factory) | +| veBAL Smart Wallet Checker | [`20220420-smart-wallet-checker`](./tasks/20220420-smart-wallet-checker) | +| Relayer with the fix for the Double Entrypoint issue | [`20220513-double-entrypoint-fix-relayer`](./tasks/20220513-double-entrypoint-fix-relayer) | +| Protocol Fee Withdrawer | [`20220517-protocol-fee-withdrawer`](./tasks/20220517-protocol-fee-withdrawer) | +| Child Chain Gauge Token Adder | [`20220527-child-chain-gauge-token-adder`](./tasks/20220527-child-chain-gauge-token-adder) | +| Preseeded Voting Escrow Delegation | [`20220530-preseeded-voting-escrow-delegation`](./tasks/20220530-preseeded-voting-escrow-delegation) | +| Distribution Scheduler for reward tokens on gauges | [`20220707-distribution-scheduler`](./tasks/20220707-distribution-scheduler) | +| Fee Distributor for veBAL holders V2 | [`20220714-fee-distributor-v2`](./tasks/20220714-fee-distributor-v2) | +| Swap, join and exit simulations (queries) | [`20220721-balancer-queries`](./tasks/20220721-balancer-queries) | +| Protocol fee percentages provider | [`20220725-protocol-fee-percentages-provider`](./tasks/20220725-protocol-fee-percentages-provider) | +| Child Chain Gauge Reward Helper | [`20220812-child-chain-reward-helper`](./tasks/20220812-child-chain-reward-helper) | +| Mainnet Staking Gauges V2 | [`20220822-mainnet-gauge-factory-v2`](./tasks/20220822-mainnet-gauge-factory-v2) | +| Arbitrum Root Gauges V2, for veBAL voting | [`20220823-arbitrum-root-gauge-factory-v2`](./tasks/20220823-arbitrum-root-gauge-factory-v2) | +| Optimism Root Gauges V2, for veBAL voting | [`20220823-optimism-root-gauge-factory-v2`](./tasks/20220823-optimism-root-gauge-factory-v2) | +| Polygon Root Gauges V2, for veBAL voting | [`20220823-polygon-root-gauge-factory-v2`](./tasks/20220823-polygon-root-gauge-factory-v2) | +| Pool Recovery Helper | [`20221123-pool-recovery-helper`](./tasks/20221123-pool-recovery-helper) | +| Authorizer Adaptor Entrypoint | [`20221124-authorizer-adaptor-entrypoint`](./tasks/20221124-authorizer-adaptor-entrypoint) | +| VeBoost V2 | [`20221205-veboost-v2`](./tasks/20221205-veboost-v2) | +| Linear Pools for Euler Tokens | [`20230208-euler-linear-pool`](./tasks/20230208-euler-linear-pool) | +| Single Recipient Stakeless Gauges V2 | [`20230215-single-recipient-gauge-factory`](./tasks/20230215-single-recipient-gauge-factory-v2) | +| Gnosis Root Gauge, for veBAL voting | [`20230217-gnosis-root-gauge-factory`](./tasks/20230217-gnosis-root-gauge-factory) | +| Merkle Orchard Distributor V2 | [`20230222-merkle-orchard-v2`](./tasks/20230222-merkle-orchard-v2) | +| Protocol ID registry | [`20230223-protocol-id-registry`](./tasks/20230223-protocol-id-registry) | +| Batch Relayer V5 | [`20230314-batch-relayer-v5`](./tasks/20230314-batch-relayer-v5) | +| L2 Balancer Pseudo Minter | [`20230316-l2-balancer-pseudo-minter`](./tasks/20230316-l2-balancer-pseudo-minter) | +| Child Chain Gauge Factory V2 | [`20230316-child-chain-gauge-factory-v2`](./tasks/20230316-child-chain-gauge-factory-v2) | +| L2 Voting Escrow Delegation Proxy | [`20230316-l2-ve-delegation-proxy`](./tasks/20230316-l2-ve-delegation-proxy) | +| Weighted Pool V4 | [`20230320-weighted-pool-v4`](./tasks/20230320-weighted-pool-v4) | +| L2 Layer0 Bridge Forwarder | [`20230404-l2-layer0-bridge-forwarder`](./tasks/20230404-l2-layer0-bridge-forwarder) | +| Linear Pools for ERC4626 Tokens V4 | [`20230409-erc4626-linear-pool-v4`](./tasks/20230409-erc4626-linear-pool-v4) | +| Linear Pools for Yearn Tokens V2 | [`20230409-yearn-linear-pool-v2`](./tasks/20230409-yearn-linear-pool-v2) | +| Linear Pools for Gearbox Tokens V2 | [`20230409-gearbox-linear-pool-v2`](./tasks/20230409-gearbox-linear-pool-v2) | +| Linear Pools for Aave aTokens V5 | [`20230410-aave-linear-pool-v5`](./tasks/20230410-aave-linear-pool-v5) | +| Linear Pools for Silo Tokens V2 | [`20230410-silo-linear-pool-v2`](./tasks/20230410-silo-linear-pool-v2) | +| Managed Pool V2 | [`20230411-managed-pool-v2`](./tasks/20230411-managed-pool-v2) | +| Authorizer with Adaptor Validation | [`20230414-authorizer-wrapper`](./tasks/20230414-authorizer-wrapper) | +| Voting Escrow Remapper | [`20230504-vebal-remapper`](./tasks/20230504-vebal-remapper) | +| Gauge Registrant V4 | [`20230519-gauge-adder-v4`](./tasks/20230519-gauge-adder-v4) | +| L2 VeBoost V2 | [`20230525-l2-veboost-v2`](./tasks/20230525-l2-veboost-v2) | +| Polygon ZkEVM Root Gauge, for veBAL voting | [`20230526-zkevm-root-gauge-factory`](./tasks/20230526-zkevm-root-gauge-factory) | +| Gauge Working Balance Helper | [`20230526-gauge-working-balance-helper`](./tasks/20230526-gauge-working-balance-helper) | +| Timelock Authorizer, governance contract | [`20230522-timelock-authorizer`](./tasks/20230522-timelock-authorizer) | +| Pool Data Queries for bulk operations | [`20230613-balancer-pool-data-queries`](./tasks/20230613-balancer-pool-data-queries) | +| Composable Stable Pools V5 | [`20230711-composable-stable-pool-v5`](./tasks/20230711-composable-stable-pool-v5) | +| L2 Child Chain Gauge Checkpointer (Relayer) | [`20230712-child-chain-gauge-checkpointer`](./tasks/20230712-child-chain-gauge-checkpointer) | +| Chainlink Rate Provider Factory | [`20230717-chainlink-rate-provider-factory`](./tasks/20230717-chainlink-rate-provider-factory) | +| Avalanche Root Gauge V2, for veBAL voting | [`20230811-avalanche-root-gauge-factory-v2`](./tasks/20230811-avalanche-root-gauge-factory-v2) | +| Base Root Gauge, for veBAL voting | [`20230911-base-root-gauge-factory`](./tasks/20230911-base-root-gauge-factory) | +| Stakeless Gauge Checkpointer V2 | [`20230915-stakeless-gauge-checkpointer-v2`](./tasks/20230915-stakeless-gauge-checkpointer-v2) | + +## Scripts + +These are deployments for script-like contracts (often called 'coordinators') which are typically granted some permission by Governance and then executed, after which they become useless. + +| Description | Task ID | +| --------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | +| Coordination of the veBAL deployment | [`20220325-veBAL-deployment-coordinator`](./tasks/scripts/20220325-veBAL-deployment-coordinator) | +| Coordination of setup of L2 gauges for veBAL system | [`20220415-veBAL-L2-gauge-setup-coordinator`](./tasks/scripts/20220415-veBAL-L2-gauge-setup-coordinator) | +| Coordination of veBAL gauges fix (Option 1) | [`20220418-veBAL-gauge-fix-coordinator`](./tasks/scripts/20220418-veBAL-gauge-fix-coordinator) | +| veBAL Smart Wallet Checker Coordinator | [`20220421-smart-wallet-checker-coordinator`](./tasks/scripts/20220421-smart-wallet-checker-coordinator) | +| Tribe BAL Minter Coordinator | [`20220606-tribe-bal-minter-coordinator`](./tasks/scripts/20220606-tribe-bal-minter-coordinator) | +| Coordination of the double entrypoint issue fix | [`20220610-snx-recovery-coordinator`](./tasks/scripts/20220610-snx-recovery-coordinator) | +| Coordination of the Gauge Adder migration | [`20220721-gauge-adder-migration-coordinator`](./tasks/scripts/20220721-gauge-adder-migration-coordinator) | +| Coordination of the Gauge Adder migration V2 --> V3 | [`20230109-gauge-adder-migration-v2-to-v3`](./tasks/scripts/20230109-gauge-adder-migration-v2-to-v3) | +| Timelock authorizer transition permission migration | [`20230130-ta-transition-migrator`](./tasks/scripts/20230130-ta-transition-migrator) | +| Coordination of the Gauge Adder migration V3 --> V4 | [`20230519-gauge-adder-migration-v3-to-v4`](./tasks/scripts/20230519-gauge-adder-migration-v3-to-v4) | + +## Deprecated Deployments + +These deployments have been deprecated because they're either outdated and have been replaced by newer versions, or because they no longer form part of the current infrastructure. **In almost all cases they should no longer be used,** and are only kept here for historical reasons. + +Go to each deprecated deployment's readme file to learn more about why it is deprecated, and what the replacement deployment is (if any). + +| Description | Task ID | +| --------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | +| Weighted Pools of up to 8 tokens | [`20210418-weighted-pool`](./tasks/deprecated/20210418-weighted-pool) | +| Stable Pools of up to 5 tokens | [`20210624-stable-pool`](./tasks/deprecated/20210624-stable-pool) | +| Liquidity Bootstrapping Pools of up to 4 tokens | [`20210721-liquidity-bootstrapping-pool`](./tasks/deprecated/20210721-liquidity-bootstrapping-pool) | +| Meta Stable Pools with 2 tokens and price oracle | [`20210727-meta-stable-pool`](./tasks/deprecated/20210727-meta-stable-pool) | +| Distributor contract for LDO rewards | [`20210811-ldo-merkle`](./tasks/deprecated/20210811-ldo-merkle) | +| Relayer for Lido stETH wrapping/unwrapping | [`20210812-lido-relayer`](./tasks/deprecated/20210812-lido-relayer) | +| Basic Investment Pools for few tokens | [`20210907-investment-pool`](./tasks/deprecated/20210907-investment-pool) | +| Distributor contract for arbitrum BAL rewards | [`20210913-bal-arbitrum-merkle`](./tasks/deprecated/20210913-bal-arbitrum-merkle) | +| Distributor contract for arbitrum MCB rewards | [`20210928-mcb-arbitrum-merkle`](./tasks/deprecated/20210928-mcb-arbitrum-merkle) | +| Merkle Orchard Distributor | [`20211012-merkle-orchard`](./tasks/deprecated/20211012-merkle-orchard) | +| Batch Relayer | [`20211203-batch-relayer`](./tasks/deprecated/20211203-batch-relayer) | +| Linear Pools for Aave aTokens | [`20211208-aave-linear-pool`](./tasks/deprecated/20211208-aave-linear-pool) | +| Preminted BPT Meta Stable Pools | [`20211208-stable-phantom-pool`](./tasks/deprecated/20211208-stable-phantom-pool) | +| Linear Pools for ERC4626 Tokens | [`20220304-erc4626-linear-pool`](./tasks/deprecated/20220304-erc4626-linear-pool) | +| Batch Relayer V2 | [`20220318-batch-relayer-v2`](./tasks/deprecated/20220318-batch-relayer-v2) | +| Mainnet Staking Gauges | [`20220325-mainnet-gauge-factory`](./tasks/deprecated/20220325-mainnet-gauge-factory) | +| Single Recipient Stakeless Gauges | [`20220325-single-recipient-gauge-factory`](./tasks/deprecated/20220325-single-recipient-gauge-factory) | +| Gauge Registrant | [`20220325-gauge-adder`](./tasks/deprecated/20220325-gauge-adder) | +| Linear Pools for ERC4626 Tokens V2 | [`20220404-erc4626-linear-pool-v2`](./tasks/deprecated/20220404-erc4626-linear-pool-v2) | +| Arbitrum Root Gauges, for veBAL voting | [`20220413-arbitrum-root-gauge-factory`](./tasks/deprecated/20220413-arbitrum-root-gauge-factory) | +| Polygon Root Gauges, for veBAL voting | [`20220413-polygon-root-gauge-factory`](./tasks/deprecated/20220413-polygon-root-gauge-factory) | +| Fee Distributor for veBAL holders | [`20220420-fee-distributor`](./tasks/deprecated/20220420-fee-distributor) | +| Linear Pools for Unbutton tokens | [`20220425-unbutton-aave-linear-pool`](./tasks/deprecated/20220425-unbutton-aave-linear-pool) | +| Stable Pools V2 of up to 5 tokens | [`20220609-stable-pool-v2`](./tasks/deprecated/20220609-stable-pool-v2) | +| Optimism Root Gauges, for veBAL voting | [`20220628-optimism-root-gauge-factory`](./tasks/deprecated/20220628-optimism-root-gauge-factory) | +| Gauge Registrant V2, supporting new networks | [`20220628-gauge-adder-v2`](./tasks/deprecated/20220628-gauge-adder-v2) | +| Batch Relayer V3 | [`20220720-batch-relayer-v3`](./tasks/deprecated/20220720-batch-relayer-v3) | +| Linear Pools for Aave aTokens (with rebalancing) V2 | [`20220817-aave-rebalanced-linear-pool`](./tasks/deprecated/20220817-aave-rebalanced-linear-pool) | +| Composable Stable Pools | [`20220906-composable-stable-pool`](./tasks/deprecated/20220906-composable-stable-pool) | +| Weighted Pool V2 | [`20220908-weighted-pool-v2`](./tasks/deprecated/20220908-weighted-pool-v2) | +| Batch Relayer V4 | [`20220916-batch-relayer-v4`](./tasks/deprecated/20220916-batch-relayer-v4) | +| Managed Pool | [`20221021-managed-pool`](./tasks/deprecated/20221021-managed-pool) | +| Composable Stable Pools V2 | [`20221122-composable-stable-pool-v2`](./tasks/deprecated/20221122-composable-stable-pool-v2) | +| Linear Pools for Aave aTokens (with rebalancing) V3 | [`20221207-aave-rebalanced-linear-pool-v3`](./tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3) | +| Gauge Registrant V3 | [`20230109-gauge-adder-v3`](./tasks/deprecated/20230109-gauge-adder-v3) | +| Weighted Pool V3 | [`20230206-weighted-pool-v3`](./tasks/deprecated/20230206-weighted-pool-v3) | +| Composable Stable Pools V3 | [`20230206-composable-stable-pool-v3`](./tasks/deprecated/20230206-composable-stable-pool-v3) | +| Timelock Authorizer, governance contract | [`20221202-timelock-authorizer`](./tasks/deprecated/20221202-timelock-authorizer) | +| Linear Pools for ERC4626 Tokens V3 | [`20230206-erc4626-linear-pool-v3`](./tasks/deprecated/20230206-erc4626-linear-pool-v3) | +| Linear Pools for Aave aTokens (with rebalancing) V4 | [`20230206-aave-rebalanced-linear-pool-v4`](./tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4) | +| Linear Pools for Yearn Tokens | [`20230213-yearn-linear-pool`](./tasks/deprecated/20230213-yearn-linear-pool) | +| Linear Pools for Gearbox Tokens | [`20230213-gearbox-linear-pool`](./tasks/deprecated/20230213-gearbox-linear-pool) | +| Linear Pools for Silo Tokens | [`20230315-silo-linear-pool`](./tasks/deprecated/20230315-silo-linear-pool) | +| Composable Stable Pools V4 | [`20230320-composable-stable-pool-v4`](./tasks/deprecated/20230320-composable-stable-pool-v4) | +| L2 Gauge Checkpointer | [`20230527-l2-gauge-checkpointer`](./tasks/deprecated/20230527-l2-gauge-checkpointer) | +| Avalanche Root Gauge, for veBAL voting | [`20230529-avalanche-root-gauge-factory`](./tasks/deprecated/20230529-avalanche-root-gauge-factory) | +| Stakeless Gauge Checkpointer | [`20230731-stakeless-gauge-checkpointer`](./tasks/deprecated/20230731-stakeless-gauge-checkpointer) | diff --git a/balpy/balancer-deployments/action-ids/arbitrum/action-ids.json b/balpy/balancer-deployments/action-ids/arbitrum/action-ids.json new file mode 100644 index 0000000..eb2b27d --- /dev/null +++ b/balpy/balancer-deployments/action-ids/arbitrum/action-ids.json @@ -0,0 +1,780 @@ +{ + "20210418-authorizer": { + "Authorizer": { + "useAdaptor": true, + "actionIds": { + "grantRole(bytes32,address)": "0x1ef5c69fb42c8b5e2b5b62d347e4b01e2bd2b06c6a1ed24f16feea7e4c06c789", + "grantRoles(bytes32[],address)": "0x5257338fa194f6b49cc67080da0e5b7e358c071435b0685f3c54a56c2443a782", + "grantRolesToMany(bytes32[],address[])": "0x706a27b56c6eb725a14ab67964f4b373d42463a602545e9608af07d7a0c49b95", + "renounceRole(bytes32,address)": "0xee697e99c48f0bd5fa98146df3b88e9d2abb8c5ae56f95a9ccd821b1fe06e52a", + "revokeRole(bytes32,address)": "0x0369d5794818ece66ac8eed5e358af4a5683e2918c4501e0097bc15083d10618", + "revokeRoles(bytes32[],address)": "0xa2a1a825ec91bc10557818d351facb316bb9898a7c47abdaf71d0921efeef751", + "revokeRolesFromMany(bytes32[],address[])": "0x4f8434ecaa0eee4369f8ba0801e92cb338293a04f12c19622e2eeb6f5c2f1d09" + } + } + }, + "20210418-vault": { + "Vault": { + "useAdaptor": false, + "actionIds": { + "batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)": "0x1282ab709b2b70070f829c46bc36f76b32ad4989fecb2fcb09a1b3ce00bbfc30", + "deregisterTokens(bytes32,address[])": "0xe4f8ff74aa05a4d54a06e035d5e86947bc6474f8d7b166ebeb49fc9178d28551", + "exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0xc149e88b59429ded7f601ab52ecd62331cac006ae07c16543439ed138dcb8d34", + "flashLoan(address,address[],uint256[],bytes)": "0x96ebe854ca6ab6242ad127dcd7809576513b0c64571e515cedd7b8885612c82d", + "joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x78ad1b68d148c070372f8643c4648efbb63c6a8a338f3c24714868e791367653", + "managePoolBalance((uint8,bytes32,address,uint256)[])": "0x7275fb98594b03dc36a7de69051058e9e2d05cabeb4fe7d9c87bc69f94d9d084", + "manageUserBalance((uint8,address,uint256,address,address)[])": "0xeba777d811cd36c06d540d7ff2ed18ed042fd67bbf7c9afcf88c818c7ee6b498", + "queryBatchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool))": "0xf5f701b3adfba2adad8f16a8be5a989593e42a2caa84c5c6e60b22143db65a2f", + "registerPool(uint8)": "0x956dfce4343a6be4df20714d3dc413ef59e73fa9995d3d247e7c8d12efd33ac2", + "registerTokens(bytes32,address[],address[])": "0xad5bd4a1cc4243b4d772a8a55d24792c1f57cc45eb97ed1291b82d96125a7626", + "setAuthorizer(address)": "0x1cbb503dcc0f4acaedf71a098211ff8b15a220fc26a6974a8d9deaab040fa6e0", + "setPaused(bool)": "0xb5593fe09464f360ecf835d5b9319ce69900ae1b29d13844b73c250b1f5f92fb", + "setRelayerApproval(address,address,bool)": "0x0014a06d322ff07fcc02b12f93eb77bb76e28cdee4fc0670b9dec98d24bbfec8", + "swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)": "0x7b8a1d293670124924a0f532213753b89db10bde737249d4540e9a03657d1aff" + } + }, + "ProtocolFeesCollector": { + "useAdaptor": false, + "actionIds": { + "setFlashLoanFeePercentage(uint256)": "0xbe2a180d5cc5d803a8eec4cea569989fc1c593d7eeadd1f262f360a68b0e842e", + "setSwapFeePercentage(uint256)": "0xb28b769768735d011b267f781c3be90bce51d5059ba015bc7a28b3e882fb2083", + "withdrawCollectedFees(address[],uint256[],address)": "0xb2b6e48fa160a7c887d9d7a68b6a9bb9d47d4953d33e07f3a39e175d75e97796" + } + } + }, + "20210418-weighted-pool": { + "WeightedPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address)": "0x50d3d314c7f930a2126dbaffffab70a9d8330e36084e704eff292ebcd57486ee" + } + }, + "WeightedPool2TokensFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256[],uint256,bool,address)": "0x6c2e2f6210abeac266f2b50c3a349519307f52819cc87cc7f8b6e5803dc88dbd" + } + }, + "WeightedPool2Tokens": { + "useAdaptor": false, + "factoryOutput": "0x5cEd962AfbFb7E13Fb215DeFc2b027678237AA3A", + "actionIds": { + "enableOracle()": "0x4467f407013739b22a1d9681a6ba3d542ffc0960f6b0ba068031063262211b1d", + "setPaused(bool)": "0x34e17221d754362d9310f78fc7d6c3a29762134a454c3dac85a328c779467d1e", + "setSwapFeePercentage(uint256)": "0x80d8e99e3b5fd50648b67ce84571603afc8ed8ea28310c743deef793d7a98d00" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0x61F101b8Aa517Fd4807A1E31B37e8899ecC390Bf", + "actionIds": { + "setPaused(bool)": "0xacd79fece79849ae1a4976901a4c2a22bc3489bd83836ad8fbd3e2b75efcae66", + "setSwapFeePercentage(uint256)": "0x6213e9042b9814b9567bde72d3c7a61372862c3ac88c2df77d3205221af6c871" + } + } + }, + "20210624-stable-pool": { + "StablePoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256,uint256,address)": "0x0f40643beab19bdcb815470b384b7e2358e780f25cef2ffb4e9c615973aeb3a4" + } + }, + "StablePool": { + "useAdaptor": false, + "factoryOutput": "0x5A5884FC31948D59DF2aEcCCa143dE900d49e1a3", + "actionIds": { + "setAssetManagerPoolConfig(address,bytes)": "0x543531ce427172687878b8b7c4953f77ca35f93d56bc5ffcada53982b0354e26", + "setPaused(bool)": "0xcbeed3b0cbfcf1ce5f42268f210b656a4076fa195f4c00f7eea0a643de889aa8", + "setSwapFeePercentage(uint256)": "0xbe1515c6c371fbc1aead7b0ed2f23f3bc176eb727e587494ac0055414c5b4c11", + "startAmplificationParameterUpdate(uint256,uint256)": "0x5e17ae1cf12bb5687db91810d22dafb70b8d05aa5e42310d0f6e467300e20077", + "stopAmplificationParameterUpdate()": "0x626821cc3a36dc57111047c78af64c430da2e604f1d676ab7f9209a98a63addd" + } + } + }, + "20210721-liquidity-bootstrapping-pool": { + "LiquidityBootstrappingPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address,bool)": "0x803e6b81fee024ccd085712b4bcd6741a50460eef16ac4d213ce52fa09ac31b4" + } + } + }, + "20210727-meta-stable-pool": { + "QueryProcessor": { + "useAdaptor": true, + "actionIds": {} + }, + "MetaStablePoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],uint256,bool,address)": "0xb4c579f809dd6177200d75553855f884f0d50ddf17b1906b182ae9873e6f751f" + } + } + }, + "20210907-investment-pool": { + "InvestmentPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address,bool,uint256)": "0xbc7226c4effd315aa7c12e3f33a10b7f7804b3c41b2e3b241bb6f700fd0b1a36" + } + } + }, + "20210913-bal-arbitrum-merkle": { + "MerkleRedeem": { + "useAdaptor": true, + "actionIds": { + "claimWeek(address,uint256,uint256,bytes32[])": "0xd92c40d5daec019bee17f4b61c6f29905e23bb7ef406cc751700baffc82b3a30", + "claimWeeks(address,(uint256,uint256,bytes32[])[])": "0xad0225b8f36d108a0b4b94fcefc162bb866b854df809f5745281c8694e6d37bc", + "claimWeeksToInternalBalance(address,(uint256,uint256,bytes32[])[])": "0x1a71f3e5ef203c4123a068cfbe8e002a0b22fe777cc507eb928430feb1cadbcf", + "claimWeeksWithCallback(address,address,bytes,(uint256,uint256,bytes32[])[])": "0xec1217f9c0d96fa75a9d6a62a38724780247f3de54e41e48952440369708c4d3", + "renounceOwnership()": "0xf75a63a20471dc46da3192be9d76e8f140a4f5507773da6d1384877662708caa", + "seedAllocations(uint256,bytes32,uint256)": "0x9bdc90c1a0da348c425f5a7f90163eaeec5bce689bdd65f6da637b5243714080", + "transferOwnership(address)": "0xc72ba8d6ded981d8f10ffe2bc3dbec65b5d9f5af87846080a8cface849d4198d" + } + } + }, + "20210928-mcb-arbitrum-merkle": { + "MerkleRedeem": { + "useAdaptor": true, + "actionIds": { + "claimWeek(address,uint256,uint256,bytes32[])": "0xd92c40d5daec019bee17f4b61c6f29905e23bb7ef406cc751700baffc82b3a30", + "claimWeeks(address,(uint256,uint256,bytes32[])[])": "0xad0225b8f36d108a0b4b94fcefc162bb866b854df809f5745281c8694e6d37bc", + "claimWeeksToInternalBalance(address,(uint256,uint256,bytes32[])[])": "0x1a71f3e5ef203c4123a068cfbe8e002a0b22fe777cc507eb928430feb1cadbcf", + "claimWeeksWithCallback(address,address,bytes,(uint256,uint256,bytes32[])[])": "0xec1217f9c0d96fa75a9d6a62a38724780247f3de54e41e48952440369708c4d3", + "renounceOwnership()": "0xf75a63a20471dc46da3192be9d76e8f140a4f5507773da6d1384877662708caa", + "seedAllocations(uint256,bytes32,uint256)": "0x9bdc90c1a0da348c425f5a7f90163eaeec5bce689bdd65f6da637b5243714080", + "transferOwnership(address)": "0xc72ba8d6ded981d8f10ffe2bc3dbec65b5d9f5af87846080a8cface849d4198d" + } + } + }, + "20211012-merkle-orchard": { + "MerkleOrchard": { + "useAdaptor": true, + "actionIds": { + "claimDistributions(address,(uint256,uint256,address,uint256,bytes32[])[],address[])": "0xb9e47465e3c91f1b517b82abcc660b2da4f7f51cdecf049832d2bdf2f9c720ef", + "claimDistributionsToInternalBalance(address,(uint256,uint256,address,uint256,bytes32[])[],address[])": "0x328242675138120714f734736471b5516d33052e24c9aa1e96f26fdb5a395df2", + "claimDistributionsWithCallback(address,(uint256,uint256,address,uint256,bytes32[])[],address[],address,bytes)": "0x049a76bd79f937a6027681f852c6d52aeb5851b2463387e41b6d6ee75a29628b", + "createDistribution(address,bytes32,uint256,uint256)": "0x9550f4a0ecfb899cb80e0892bea13433bca60d66f67a8a333a72cf16e4ad0826" + } + } + }, + "20211202-no-protocol-fee-lbp": { + "NoProtocolFeeLiquidityBootstrappingPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address,bool)": "0xd8cfd074bcf36f45dd4b61004a96d4e505c7d0bb425085a4f0bdbfe4b2e4ec1d", + "disable()": "0xdb0e2ca147bb165fcfd2631fb8cb87ab34aa8fb9d2a81e95334a207f753f0302" + } + } + }, + "20211208-aave-linear-pool": { + "AaveLinearPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address)": "0x09908e688a40dc4b8c32c18f58d5ca3d480d08ef6a355c3eb7dcbc24fc6ab78c" + } + } + }, + "20211208-stable-phantom-pool": { + "StablePhantomPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],uint256,address)": "0xef2e3b358c976cf7a45ceb2efde934926306eaf3d5849177dc7e96bbd37cee9a" + } + } + }, + "20220413-child-chain-gauge-factory": { + "RewardsOnlyGauge": { + "useAdaptor": true, + "actionIds": { + "claim_rewards()": "0x91968649430f7ae3ddd77961aae381ea7718e20aea3725fc16a92be8177a7980", + "claim_rewards(address)": "0x260da37aeebf8f3f8aa9f352c114ce7c9961629dfbab0299523e02301d92da90", + "claim_rewards(address,address)": "0xe3bd909dfff4cffaef97f4f375216900ec20e1690c9f8234ab9d00101675ec0f", + "claimable_reward_write(address,address)": "0xcabdd023e9447a3adcc4bce57d65e7217daa83357280ae721f2125c29250548f", + "deposit(uint256)": "0xc5471dc27ecb4078a3f2cc12480309d946f6984544369303bc9ff2bb1a8e303e", + "deposit(uint256,address)": "0xefc8635b1b670cab330cc5b82805765e708fe37f678bd6c79045c3a09ec255ad", + "deposit(uint256,address,bool)": "0xd01607501ac7ff9f0333a0cf6b89631e33c142a5d6028c5721aaafc325575ee1", + "initialize(address,address,bytes32)": "0xb4ed41dfe546463f7f0f26890be411481bfaa370c5a829490f3a1dfe370ed20c", + "set_rewards(address,bytes32,address[8])": "0x6164875d6ae7cbe0f88dcb6a153aeb65fec7e8fabf50f3e512288f01417a4d48", + "set_rewards_receiver(address)": "0xf0fcfa57d89e7197a1b15f9bc73c4b76cdc0a3d7dfb1a7fcda866dcfe1265379", + "withdraw(uint256)": "0xbbc15eb82e631a665042a77fc37ea62d0e86da7c60222ed9d17299ecc039f0a9", + "withdraw(uint256,bool)": "0x2d706d617dea033296e05fece9b9883d156af0c791564d55567b28527719c9e5" + } + }, + "ChildChainStreamer": { + "useAdaptor": true, + "actionIds": { + "add_reward(address,address,uint256)": "0x848a449d6f3fea1c1e229330f28bbd34ce15b8828b8e59f6b046fe937ef76b76", + "get_reward()": "0x171ce990a5ed1d99940af51adbd4e26a3ddaa9b7302fe25fa554486aaa008089", + "initialize(address)": "0xf45e66a97a1ecae694cbc4028dab3831c64e16a6b4ac8c3ac70e5a1c8c2e07a0", + "notify_reward_amount(address)": "0x89b7ba31942baff990c50eb0f3ab487a6fc09c45e0333af59e2cae0b87ad9b3a", + "remove_reward(address,address)": "0x546c4281647f2b3c050fe1bab2918fef4f7f3866355ea2180ef7e028c0e140e9", + "set_reward_distributor(address,address)": "0xa7ed295af0b197c9481510d6c8326ba2e2d17b2c1a89ab1834ac80de9220b60e", + "set_reward_duration(address,uint256)": "0xa5353c73d7c6795ddec772123acc4d086a6ec9c2a05a36b5b43a5b59970f0f1f" + } + }, + "ChildChainLiquidityGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address)": "0xcba3bd68b8c2df80d0366b2640dd6615b7d466b5d39d1f3de311ba249adbbbbf" + } + } + }, + "20220513-double-entrypoint-fix-relayer": { + "DoubleEntrypointFixRelayer": { + "useAdaptor": true, + "actionIds": { + "exitBTCStablePool()": "0x553972bfd862c3b6e75f9ed1c8dfe2283567fa138e1a222839160b4c7871dc07", + "exitSNXWeightedPool()": "0xdff93ec3fee47dfbf861082f9ac694d7d7384ad9a536898d01c5bcf670d74b4c", + "receiveFlashLoan(address[],uint256[],uint256[],bytes)": "0x757a91bb609ad64ea73b71a2559b9316e6d602ccec059b8222e9f71eb571d981", + "sweepDoubleEntrypointToken(address[])": "0x3096ce433697be976fa0dfa3fc624f565b29f78580c0bc64846a11075f3ac228", + "sweepSNXsBTC()": "0x42129b2b26bef7613f2fefde524d1301662b4f335f21e850e8ee673a7deafc64" + } + } + }, + "20220517-protocol-fee-withdrawer": { + "ProtocolFeesWithdrawer": { + "useAdaptor": false, + "actionIds": { + "allowlistToken(address)": "0x425681caa28e5b2396da34c8b4ec22b1ab2683d58d6dbc310d8985beeb8812f8", + "denylistToken(address)": "0xf2eeb5b536a9b3c485a4815e2bc32d58341045b2c6b8710f2a1e04e856789c3d", + "withdrawCollectedFees(address[],uint256[],address)": "0x93b1b7dba9fb074b573d5edb3c983e0490a00925f709289485f0c75988e100cf" + } + } + }, + "20220527-child-chain-gauge-token-adder": { + "ChildChainGaugeTokenAdder": { + "useAdaptor": false, + "actionIds": { + "addTokenToGauge(address,address,address)": "0x00970aa128369a6b7225384e0de035b547a6d56c2faeee4c3f3735de381d1ff7" + } + } + }, + "20220725-protocol-fee-percentages-provider": { + "ProtocolFeePercentagesProvider": { + "useAdaptor": false, + "actionIds": { + "registerFeeType(uint256,string,uint256,uint256)": "0x1b40fb690b0f2b74a4e5de0cc1146e8473a40bdf993d441a20b6b9e94f512687", + "setFeeTypePercentage(uint256,uint256)": "0xa0ace5c52c8f0974c521244ccf49a5a7166a9a6fcef623779b42d55fb2c5fbbe" + } + } + }, + "20220817-aave-rebalanced-linear-pool": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address)": "0x9884a8bb75633594a7e8217073d16c873f045f1db8a69ce0f80b8cb83135120d", + "disable()": "0xe59ccea4d4a98c33b7c0b3c05a3d65ff930273fa5ee03855a3104befc6d1d362" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x23ca0306b21ea71552b148cf3c4db4fc85ae1929", + "actionIds": { + "disableRecoveryMode()": "0xe4efb851c410e171273aee46d6939a91154b536e375e6fe59c09a4e617072339", + "enableRecoveryMode()": "0xa7508bde3c3d65fa21321ca35b2d1da564bc4a772cff9947de3c3e1a467e9dec", + "initialize()": "0x77e34c3fc0ed219fc36f3993130c9f1538b957fbfdf04ff340defa321742846f", + "pause()": "0x25ec546c5f4dfc2fe31ba04f5cf65a8098b35111075a5fd114ea3475e4254ac6", + "setAssetManagerPoolConfig(address,bytes)": "0xc89fefc03c7b123136ce9e4486e8e0dc53dfa76d9ccc1736b4077be9da0cd8d9", + "setSwapFeePercentage(uint256)": "0xe9d4a41f6bb25c8862c0c2c860268861488f862a3702115587343e3c3d6ea29a", + "setTargets(uint256,uint256)": "0x2095feae5b22289753af2b83be023818aa08f8d76f2083e5fb8a393a2c8a4836", + "unpause()": "0xb48ae0b045f774f177ab4b36d641b3bfaeb28e42f6da1a418a80f696f3a21703" + } + } + }, + "20220906-composable-stable-pool": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address)": "0x10844c1a2330e5c34663ec07b49abd83782bd03eec9462e77cb0564aacdd153c", + "disable()": "0xf3376f86bc88f72d48761be5427c44395f7ee6a01d0d984b27ccc4340b29a770" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0xcc98357eaf3e227bdef6b97780aae84bea9b02b0", + "actionIds": { + "disableRecoveryMode()": "0x6849898f08c7f64552f27ae1a4dfcc908200c4d6901ee3945a8c62dbf9cefb8f", + "enableRecoveryMode()": "0xcbe9cebc4f91f7165ea5e4f69b52df3f2ece32ffa2ea75701ece149b4ab59b28", + "pause()": "0x79ec0b88111fa72b837fed3ecc182ad192cf3f55a79781b1277a1c85a6908585", + "setAssetManagerPoolConfig(address,bytes)": "0xd1c25d865242bda8f50179af57fb9fca325ac95fddb36eff550fed2e2920cd9d", + "setSwapFeePercentage(uint256)": "0xe4ae7db31fa76b12846f2837e5b8ee34891b1b170470345521a088bd662e4571", + "setTokenRateCacheDuration(address,uint256)": "0x4a47f1fef434f3b446790d962ccfc76e173288678c0f10e49ea84f99711a4725", + "startAmplificationParameterUpdate(uint256,uint256)": "0x2620ee35568e28137005f8f175537badd5862933f53cc13eaf083bb5c06a043d", + "stopAmplificationParameterUpdate()": "0x75787838691ff488bcd08777a81793f36c82ac2a4fe7d8bdc74339f7aabd15ef", + "unpause()": "0xaf671adda59b68d2ffa622bd2572e3517e5ff29dc90dba711cb6099fc64c81b0", + "updateProtocolFeePercentageCache()": "0x974efa69649cbf5870801f25fe643288dcd50d9e1d74fdbef45276223bb207dd", + "updateTokenRateCache(address)": "0xba94473cd82358c264abf72a0a835df220e750ad54e22caed02e5c7a9c25dd6b" + } + } + }, + "20220609-stable-pool-v2": { + "StablePool": { + "useAdaptor": false, + "factoryOutput": "0x5ac311fb06c3bd30c87b4e13c079d17c94325ddd", + "actionIds": { + "disableRecoveryMode()": "0xbadcf7a93a8a95e4bda7a562332996ee4acb5fcde73e96bf75a8dff324279a3e", + "enableRecoveryMode()": "0x1180cd5efd53e784faf032ed74af8c1ca90ec2063bcc81ccb5df9cba24f7a844", + "pause()": "0x04ccb5df880f0c43989328e87fdd719eac6f7de76c3ead81630c2fd1686dec7f", + "setAssetManagerPoolConfig(address,bytes)": "0xb0844fe52b9250e1f76ccc9d217032e9f45c847f2644de22561a309cbc32280c", + "setSwapFeePercentage(uint256)": "0x79cf7f42fcb330293c1d98b9ac2db3a3122a615e3630596ebc2584c6bf0d1346", + "startAmplificationParameterUpdate(uint256,uint256)": "0x0dc09b40b8cf6fe6a29ebfed496944af74a8fb14ace7220c222e17e83b46fe09", + "stopAmplificationParameterUpdate()": "0x39a4eccad75e66b9c85b00fd5dcba46bc190f4391e3e6e9af1d74e6f242edba8", + "unpause()": "0x9813b514e1e9fc700c70a055e410a6cd7debdce839291f96213b804cd958e7f8" + } + } + }, + "20220908-weighted-pool-v2": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address)": "0xb0808cfb171b1052985f4fa8038ba322198f6361b2c0c320af3a310a7b9f03d0", + "disable()": "0x3fe7719468a7e48b37513ec7a41d9931375244942fe6c328691db3415d9517c1" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0x3dd0843a028c86e0b760b1a76929d1c5ef93a2dd", + "actionIds": { + "disableRecoveryMode()": "0x79819a7971b1e9f195beb8386adb931d405f6f037b2c0c6ac955e68569c01128", + "enableRecoveryMode()": "0xe677a5af244fbd50b51cf114dd0bdbf7b73c262382c7704c359c6c2148820d33", + "pause()": "0xcd7e0ee0107ef7cac4d00d3821101a9ba6f02158f7f4dd52693e82ad3c91e918", + "setAssetManagerPoolConfig(address,bytes)": "0xb4f5d67533236074d36881d864a2800bfe93f13921d54c1fd373894c4832a0df", + "setSwapFeePercentage(uint256)": "0xcf5e03a737e4f5ba6d13e23f893a1e0255b362d8ce22e9568e1565fcf92789c7", + "unpause()": "0x07b4fb5e12466b66136a430edadfe74892e0cbfc410f6268a2d1d24cc09a6e05", + "updateProtocolFeePercentageCache()": "0x17a40867ce1e1ecc681858d636ee089a349e5d886de539bd79a354d921649f0e" + } + } + }, + "20221123-pool-recovery-helper": { + "PoolRecoveryHelper": { + "useAdaptor": false, + "actionIds": { + "addPoolFactory(address)": "0xda62096c4d8f1d48218270a8cfece514fe2fb09e756e8d76aa98186a68f5c35c", + "enableRecoveryMode(address)": "0x586dc651a6be8b58209f3181edd6d0d9dd0079ff0e0bf4a20bc92b27d2aadcec", + "removePoolFactory(address)": "0xa450560b4243ca4b627c589e0f1f51c3022ac250bb247dc70009744aee0fe13b" + } + } + }, + "20221122-composable-stable-pool-v2": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address)": "0xb885d98b83d2e0ddc9cc87adabc0f64acbdac302d2545aebafdac0c52a43b892", + "disable()": "0x0a35dcf04fdcf4e2119802287b94a1cf758427e74e9bb450cb31af7c660d7735" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x373b347bc87998b151A5E9B6bB6ca692b766648a", + "actionIds": { + "disableRecoveryMode()": "0x85896342da44e8444ef54be6c4643b51c1e23270bb9ec1f0257cd03d72a80cb6", + "enableRecoveryMode()": "0x7d89412e7c8893c1c85589d68187b2ee925cd2d27c10393980897d1fa4346b0a", + "pause()": "0x6e25be22eb210da3359f4afb977d53109dad5ed4801e736bf6c5239e0028bd48", + "setAssetManagerPoolConfig(address,bytes)": "0x9036802291378e3a6933704d0ccba6f3c6729307d244cb77b7f84060cba99269", + "setSwapFeePercentage(uint256)": "0xdee20d81c6075dcc437dbaaf02d316ab255cfcae4a154e04b17abdebc70a5b48", + "setTokenRateCacheDuration(address,uint256)": "0x160a4f83bcc2f584446953fd8adf0bf96e625212ccf66900051418e8d19e7157", + "startAmplificationParameterUpdate(uint256,uint256)": "0xf766fa63021f6e696e70c339ab7246118c3da74fcbf80dbe6d603189209afed7", + "stopAmplificationParameterUpdate()": "0x1c36fdcc08f18f6fb33519d9491400a58c2c03b6f1222f8385cc36e6fb837110", + "unpause()": "0x09f210f1a6e3730856cd101645ba1c0594f63ca6ed48e7768b5421ae698858db", + "updateProtocolFeePercentageCache()": "0x69d8f3e0969c91e7a94fb45518733240410f56ff60cd304fbc5d13a5432ed71f", + "updateTokenRateCache(address)": "0x43e924739082162d0dfbe4b85270de4e7fe29526d812caeaa4797cf243c0bdfa" + } + } + }, + "20221021-managed-pool": { + "ManagedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create((string,string,address[],uint256[],address[],uint256,bool,bool,uint256,uint256),address)": "0x0becf11063e0bab3ba20ce688e996dc9656adfe73f7a3b0baa3e2c7ede18e682", + "disable()": "0x0ebf042d38f8e1bb630c3010c686232d7334f90360a82eb23623fd01fbe8e656" + } + } + }, + "20221207-aave-rebalanced-linear-pool-v3": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0x4ba05fdf5cffc5c7a72f197b00eff227bfe7a29a27c24cdcaaa1dfee7b514a65", + "disable()": "0x5fd274813b31ce95c712e49fe755d0b075329e0579e5f04cd7126ed1470d4354", + "registerProtocolId(uint256,string)": "0x37a89b4d8143fceff55b6582039f2a1e6cfed15dbcf485d5c56bbc1c6dcba101" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0xa612B6AeD2E7ca1A3a4f23FbcA9128461bBB7718", + "actionIds": { + "disableRecoveryMode()": "0x071c183e211c5696039e7d8f8432a12922c93c59a210fae756a3f03196b01e4b", + "enableRecoveryMode()": "0x9254542b345e99990640c1b9525771201fcd60edbe6ff1b6b4179bd86dcd5fbc", + "initialize()": "0xc46f6bb869dc3e73108ae5ff1202a70bcc84c97b6e489fd59e66ad8413cfe6a9", + "pause()": "0x36c26ad17c689895b3978b52a379d7e9c1dc125551458cb016a1ff29e5e53ef5", + "setSwapFeePercentage(uint256)": "0x73ecffaa7802224e9379a7afd6438b2d70a66adbc286e955db7929c017e130cc", + "setTargets(uint256,uint256)": "0x30e1f3886b07a3348ef1218d96b9d28f8182dc86760aee7a4a97a9c0ff134f92", + "unpause()": "0xa5af706283095db0b03341555fda661eec48458aea6d68c691fb79ac3a32d1a6" + } + } + }, + "20230206-weighted-pool-v3": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address)": "0xd744800e2972c47138cb383a6768623e7702bf3a0b65317d2c19b28f4a3315c1", + "disable()": "0x3f476d79932a277fc0be18747fc314f1db33802d38a900d529db018c01de81a4" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0x96d7e549eA1d810725e4Cd1f51ed6b4AE8496338", + "actionIds": { + "disableRecoveryMode()": "0x0fb35afbdd369d25e1e13986af342dd66f4af22e88628aded66fc015fddee9e6", + "enableRecoveryMode()": "0x1e3379f440ccd8ad4fbacfa446ce3de718eda1a091b271c9053bdedff90cdf1c", + "pause()": "0xbbb29600025604666f66b68dff00546068c5be9c0a5a0fbe825550f6c3519c27", + "setAssetManagerPoolConfig(address,bytes)": "0xb95f5b98bd07e4d04599ce86c098167e006c17e6ba6361af471921e17bba7943", + "setSwapFeePercentage(uint256)": "0x92253d002d63e0211f775527924e2891f18bb060ff2ab3be19c6b242bafa5fec", + "unpause()": "0xc63cb26356ca7568a4c7e1f64299258afccc08d128ca8ba23ed26f925f11fff5", + "updateProtocolFeePercentageCache()": "0xdba3aa6a087c0305069c474f3f03fb50e7b0b9136316d479ae6160be8a3478fd" + } + } + }, + "20230206-composable-stable-pool-v3": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address)": "0x2626b6a4aaf4e77b5188c60f13abbc36aab5f04a8e37ad668822cf8822335f98", + "disable()": "0xa23cd4468cbe8403f6163d16350699bab6b407aee02d6a29755b0cffa52dd023" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x231B05F3a92d578EFf772f2Ddf6DacFFB3609749", + "actionIds": { + "disableRecoveryMode()": "0x0585ff33fe95b333f37198850856b5b788891cbc6fd99c447b8d7625c94a33b9", + "enableRecoveryMode()": "0xe6321aecff7f0051958627890aa2a16d7221f860dfa3359a1cea6f4a3f87933e", + "pause()": "0xcf96d782d1bc8dd12869fb51374544f9c037fd559b8811972f35756f204c6012", + "setAssetManagerPoolConfig(address,bytes)": "0xf93e17aee53da927b143261020d05fa195b06a0f9a65831e95c7eee082d1e6e3", + "setSwapFeePercentage(uint256)": "0xc383be2c6e87a9b18ae919e677f011279a8d98346dbcd5cb326053f5f873b753", + "setTokenRateCacheDuration(address,uint256)": "0x709836a8faadee3ce9004075ac200f1094b93ca8afdf8642906fbc6712f3e3f0", + "startAmplificationParameterUpdate(uint256,uint256)": "0x79f0094a409615c52fb7491ca130145e7ec31efb578af4019db59e6636c07ebf", + "stopAmplificationParameterUpdate()": "0xfaede3ef05348eea541571b87b87560ae56292ed04fd5e08fcced4d41916dfb1", + "unpause()": "0xf1b6ee1177b46e3a1cf29bd60b8fc48b921e325648a3b1adbfef0eb41a8d2362", + "updateProtocolFeePercentageCache()": "0xc1b10cf511d7f7f3479dca6826b1ec803f4c532baca9aff7e785fc4bf1811d43", + "updateTokenRateCache(address)": "0x1f2c7d2bc8254cf359adb690d3063921e851bd341d0e177b9af17092a42047b0" + } + } + }, + "20230206-aave-rebalanced-linear-pool-v4": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0xb8b4b0c483a7df7565a5eb477ce3a197fe00c08f3f77e069e3e21cc176ae389f", + "disable()": "0x06efe7e891755c060de5033e398e2d4d9f1bc713591717209ef84b7e021bd154" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x11884dA90FB4221b3aa288a7741C51eC4Fc43B2f", + "actionIds": { + "disableRecoveryMode()": "0xd12b97e317782dac10c3547fc977708cf0a2ebe3621f880b6f89236e760278ee", + "enableRecoveryMode()": "0x63670b08ab971b7445722753ef5c4b1ddc64376a631cdb48e3c6eae5a5dfc951", + "initialize()": "0x85c408f18c02ca57e9c77ee2dc325adefcd36bae3773b5f6cc2f3c0cbfd8a964", + "pause()": "0x51530e1d909caf846c8075a98e41431ffe7e18eabf84b1f3ebade86b84547d30", + "setSwapFeePercentage(uint256)": "0x6e1c8947d790e79a7f8b6b195b2ec3231b6b9bd27a74f04b192aacd8e93f3660", + "setTargets(uint256,uint256)": "0xb78893595b75c70259cbe387580b752c333e0a52d40fb98d6bcdf4b54b0cef91", + "unpause()": "0x1c32f073a3a5d59bedde5824d20e95a52159bb8c4ef8e49dd1af982c91fa5e10" + } + } + }, + "20230206-erc4626-linear-pool-v3": { + "ERC4626LinearPool": { + "useAdaptor": false, + "factoryOutput": "0xf984eb2B8a7eF780245a797A2fCcd82f346409ca", + "actionIds": { + "disableRecoveryMode()": "0x541412e0bfa3ff92e78aaa6272dc265e37356c9a06ea99c41e507b841cbdaf39", + "enableRecoveryMode()": "0x1af047704bcfd3e1466e6f18e52a32f872a6efd426a13675bc2513e447b0238d", + "initialize()": "0x1e783661023b1e72d6a5ee068eefcb0b8dd5b23151336636e6a0e413f2203ad8", + "pause()": "0x343468c5eda28b04bd0d752d84a11bd0ba70d76ed5fc481e15de7f36b4937787", + "setSwapFeePercentage(uint256)": "0x4e369965828f3a76cdcb37d24a69a3ddf1f0bbfa9110f9978e25d804504b279f", + "setTargets(uint256,uint256)": "0x342f10e709ad2a053a4e5035c4b3b703fea94c19f458d3887a6323472f0e42cd", + "unpause()": "0x88750d9fe81cc28abdc1c823f271c75e76cbd232145d0e83e405ce7810dd187f" + } + }, + "ERC4626LinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0x98933eeecdc70ae1fe94f3986354960201f8e848e98bfaf2f496681643c38541", + "disable()": "0x5ec883ecf16774e6b304f1e06322669694ffb90c13167afeac8ed7b68ab0869e" + } + } + }, + "20230213-yearn-linear-pool": { + "YearnLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0xf9f63d615e094d1a17d5079ccc82af481a9e6c3bed8182d93a52a97e7fd53c92", + "disable()": "0x204435acb6f76b6cfa0ef594fc0e4379b943252865ff8edb9a6d07e718ca12e8" + } + }, + "YearnLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x81fc12c60ee5b753cf5fd0adc342dfb5f3817e32", + "actionIds": { + "disableRecoveryMode()": "0xdca56840c8d32b36c22da3ac14b5963d346a19c1c78d2e3b39b8923042d17a35", + "enableRecoveryMode()": "0x1405e4b6cd75de6c077cce8e10034aaac128c79249dbc582eb25e65516444573", + "initialize()": "0x7c397df7bbb811211ee715aafb283ff001e2ab092ae26da548c14765d856e62e", + "pause()": "0xd6c89f2c29695c6377f031dc3f62611dc4d99266ee8543d8a83a986fd179e6d9", + "setSwapFeePercentage(uint256)": "0x3e6c904353f81ad8c8ed1a0e926cebf468aeaba4c280147e2d32030a359746f5", + "setTargets(uint256,uint256)": "0x4cc8eb383f0521484d9a2bc36774c7eb2c8fcc5a9170f797b9509164f5e449fc", + "unpause()": "0xf9e3ecfb789b73003be5d7a16198362f67a321fceb87e62f5d9649474aa5ffa3" + } + } + }, + "20230223-protocol-id-registry": { + "ProtocolIdRegistry": { + "useAdaptor": false, + "actionIds": { + "registerProtocolId(uint256,string)": "0xfed0eb6041728fc141bad70d04446ff0e9c8289a4f53cc060addc832c914b44f", + "renameProtocolId(uint256,string)": "0xdc8681b640b547e98ee6f4d708df559b807526d976644c3aca24bc12c4f839c3" + } + } + }, + "20230320-weighted-pool-v4": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address,bytes32)": "0xe7a13335b40fd214b7f8ada8dab13cca00bdc08ca9e9f47f1fba66a1a3c55bf6", + "disable()": "0x06cafebf5a6142d1acfc442d8a4f2b4d40a7cdfa6c1311679adc8fd679a559a7" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0x129C6402FF88611Aa59BF2e14B39e091822e2C9c", + "actionIds": { + "disableRecoveryMode()": "0x3f9dc3da8a6332271be3fccd1a107fd3117a1a988666ff673241edc8c12279ac", + "enableRecoveryMode()": "0xe184fa0d5bfa8981c4a008826c1302ad4a0235d114bd82980681f620c748abc1", + "pause()": "0xd98740b6136649627930e4de42dd9232af00b3ded6023d9d9202b47f0356ff43", + "setAssetManagerPoolConfig(address,bytes)": "0x3e872a6ad12d1187c30b8c546282ff4a3873a6d9a0622adb2d0ff00aa116eacd", + "setSwapFeePercentage(uint256)": "0x70368640683195889d0f146ab060210f43fbb1c317a87bdf17a4dca8d8feed86", + "unpause()": "0x0705bb8a9cab37a9112e507fd5ea1950caa8b4873b253fba1c388e242cffb8bf", + "updateProtocolFeePercentageCache()": "0x634a48f15c9fbd33b539e47b521b56f76af45ede9ce090ee133b356047eab25c" + } + } + }, + "20230320-composable-stable-pool-v4": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address,bytes32)": "0x87d3bc632e96e2b243edfb7cd4d62f3abfa9ef04061a37fa3cf6996075847fdf", + "disable()": "0x2459196cb4ed0fe6ae2ab5497be53008d92acf640cb0174ce413b1e613d56e35" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0xFF7e6B102516e071dcDA763EE9D02c1515481db5", + "actionIds": { + "disableRecoveryMode()": "0x2cdef929bdc29c7b9ca832b8a8f62ce592fee150df38b736a8cab1d2918fc179", + "enableRecoveryMode()": "0xa7152bc948bf07e3c3fff4953f5f4962d845ee3261d784e6e9b31f160d99da54", + "pause()": "0x4af83a29926fe55935b85568f0f0cab066e294993eaba067cdef68541ccf0195", + "setAssetManagerPoolConfig(address,bytes)": "0x1a644f7f01f3fda4ab4c8b652966dafb72ed98b2b68f8eda935d9d61e0db9f49", + "setSwapFeePercentage(uint256)": "0x50ccb689033ea83f58a1b54b091916255bb56c2334a12ed908ecb06f72d2a688", + "setTokenRateCacheDuration(address,uint256)": "0x05c66da9aa7f126e8dc8688cfac90477d2313f3e95f1f687a854ebbd04b1c707", + "startAmplificationParameterUpdate(uint256,uint256)": "0x197a2915652227e96ce9367b8488b59f12fa838f0ae2381b1437dcf3992b8349", + "stopAmplificationParameterUpdate()": "0x76fe94a15b02391aba1fbac69e9d2f37f355fe1e5031c218535568ee6bb98219", + "unpause()": "0xbf4cdf0a5be5f79f3fb7f29d4a1d381a1c08e908f33b5278e9990f049966a856", + "updateProtocolFeePercentageCache()": "0x7358c6ff0c8c852475a57bf21160da4a2cb77eb7e2ab1a4aa5f02d6f5b3d0d1b", + "updateTokenRateCache(address)": "0xcf49109b14fa9ca29816c84518846bb5d842af249dfa349576b536aff13f7aed" + } + } + }, + "20230316-l2-balancer-pseudo-minter": { + "L2BalancerPseudoMinter": { + "useAdaptor": false, + "actionIds": { + "addGaugeFactory(address)": "0x57f5e3be3930b0a9235265a5237eb44d5ec61fe36999757360b72280c4dcd991", + "mint(address)": "0x811eacd9591c44395612943872618dcd3b7e229a4e3d24d928ef11c76ae38526", + "mintFor(address,address)": "0xcd80f6a4b0f0562e3a7f5cf068e77e058b13e25668f714113fa2ddccd46c2c5b", + "mintMany(address[])": "0x153e7e80e8d9b892a435a06f252609fa7d1ffc617f51ec5219f89cfa1964f658", + "mintManyFor(address[],address)": "0xae26c1c9ce9e34367c348e3101006a603e0afb4ccd3c48dfab0ea43f5e8cb2e6", + "mint_for(address,address)": "0x91e3efee72d472225500a26de1ef51d33de01b004ff47b8fecae1f24d4614ec9", + "mint_many(address[8])": "0x8ec625467f13d828b06a87ecc16088f496a086d22979fed5507e9659d2bcbc31", + "removeGaugeFactory(address)": "0xf7f296205bde7b062292a2fb0841c0fa9fc6ac5842c7293621a0a43ace56dfd8", + "setMinterApproval(address,bool)": "0x84d7b631160a79607f15ac18da97485febae775a7b84cfb133cc34b1158e8acf", + "setMinterApprovalWithSignature(address,bool,address,uint256,uint8,bytes32,bytes32)": "0x0bcd9bdf6d6ccb346ed348df52f9aab0ec5f65eb155d3dac66863758e22f03b5", + "toggle_approve_mint(address)": "0x42713add406aa0dcccb35d5796bf92612d35dc727fd3113644aa27a412e138bc" + } + } + }, + "20230316-l2-ve-delegation-proxy": { + "VotingEscrowDelegationProxy": { + "useAdaptor": false, + "actionIds": { + "killDelegation()": "0x45403ef9e8abf233f2c11ec0f9501f53b59666f9b83d1b2fb96987ff8a85f3c3", + "setDelegation(address)": "0xab668cacffdf6f785bcac395e15f5f5b4b109b0320004b24c7c39937e71d585c" + } + } + }, + "20230316-child-chain-gauge-factory-v2": { + "ChildChainGauge": { + "useAdaptor": true, + "actionIds": { + "add_reward(address,address)": "0x56245c361d1ed9e55e6f9889e49f36d9991761b712de544f847b557a84ccd62f", + "claim_rewards()": "0x91968649430f7ae3ddd77961aae381ea7718e20aea3725fc16a92be8177a7980", + "claim_rewards(address)": "0x260da37aeebf8f3f8aa9f352c114ce7c9961629dfbab0299523e02301d92da90", + "claim_rewards(address,address)": "0xe3bd909dfff4cffaef97f4f375216900ec20e1690c9f8234ab9d00101675ec0f", + "claim_rewards(address,address,uint256[])": "0x730de891a977f0b4b0c773fccf29c5f3aa7e7ca7fa8732820e3e140fabad49b1", + "claimable_tokens(address)": "0xf90a050f616da253267156fafbd98d4ca1f4ecc6737427e266c5740e7e275dfb", + "deposit(uint256)": "0xc5471dc27ecb4078a3f2cc12480309d946f6984544369303bc9ff2bb1a8e303e", + "deposit(uint256,address)": "0xefc8635b1b670cab330cc5b82805765e708fe37f678bd6c79045c3a09ec255ad", + "deposit_reward_token(address,uint256)": "0x887154fb599c6c6eae25fba523026c5516eb6871eb59b3b9158508d34170de4f", + "initialize(address,string)": "0x343cc63075dbfae7650b2495dbe04a157331c60346611d03b6785c5c01b051d7", + "killGauge()": "0x974ac973bc6a04f0e8fef896970a1341c374c2318927ec8e06c8183e8ffcdfbf", + "set_reward_distributor(address,address)": "0xa7ed295af0b197c9481510d6c8326ba2e2d17b2c1a89ab1834ac80de9220b60e", + "set_rewards_receiver(address)": "0xf0fcfa57d89e7197a1b15f9bc73c4b76cdc0a3d7dfb1a7fcda866dcfe1265379", + "unkillGauge()": "0xc84ffbb04eeb8135bc228f1b76e343cc34a6dcc1560ab3d545d8a8b8e6f1d7c1", + "user_checkpoint(address)": "0x53b3767c6a97d337d5350b6160b603f2cb60f2661b56e86e17b4ef6e4efb9b7e", + "withdraw(uint256)": "0xbbc15eb82e631a665042a77fc37ea62d0e86da7c60222ed9d17299ecc039f0a9", + "withdraw(uint256,address)": "0x7569754654bae77e0b1ab677e0dbbd815bd325eb86169569ac7a38223c9a782c" + } + }, + "ChildChainGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address)": "0xcba3bd68b8c2df80d0366b2640dd6615b7d466b5d39d1f3de311ba249adbbbbf" + } + } + }, + "20230404-l2-layer0-bridge-forwarder": { + "L2LayerZeroBridgeForwarder": { + "useAdaptor": false, + "actionIds": { + "onVeBalBridged(address)": "0xd622b0ec177e79a0f942186b7bd6c0610ec88eb190db68faf0c2f7c2acf6c604", + "onVeBalSupplyUpdate()": "0xc8a57790e7e0011a703c00d43eb37619a60efdb3f3246c8345d0ecb1216ed5c2", + "setDelegation(address)": "0xe2f9f5f4161b708368108245a00a69c69456c3e9a80abf446b95ddefad9b73ad" + } + } + }, + "20230411-managed-pool-v2": { + "ManagedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create((string,string,address[]),(address[],uint256[],uint256,bool,bool,uint256,uint256),address,bytes32)": "0xe94d4f88a6d6f3449cb1005093922f69f89d217744047dc35d72c8d5308743da", + "disable()": "0x8d305e761700b38cf2bc3f9e2c4ad60807e843cf2efd2415b902b1163f8f9a22" + } + }, + "ManagedPool": { + "useAdaptor": false, + "factoryOutput": "0xf5A71257B331C02dA1Eae52151C3d600f16B76F0", + "actionIds": { + "addAllowedAddress(address)": "0x73433598a6ee73c7da42fc96255eca1de0b23893b2bc2d21733b0a050833ac9e", + "addToken(address,address,uint256,uint256,address)": "0x6134115ebd2144e1396c11e6cb7fed3328910a7c664a97db3d24158ec0851d76", + "collectAumManagementFees()": "0x15d2d7f8f98ab6d0201baab09bc27ac56ec41e8412c6b7bbcd66a8288ca975bb", + "disableRecoveryMode()": "0x5610aeafaa3f5c4ef9b9b45ee9c0810b2f7bd64b7b504f19d1a8a3bde062a966", + "enableRecoveryMode()": "0xb213b9fefdba263a47d6449bab5d563a39489f656d504fd24d5b9efe6fe23a61", + "pause()": "0x6c331c074092fbc25cd1032630ed25155aa5b81afa1d296bf5a0f0e9e0c6e846", + "removeAllowedAddress(address)": "0x41c9971c941d0e80df0f20a1c1c8d1e452c3ff0fa21a358ca93597bd0fdb9b2e", + "removeToken(address,uint256,address)": "0x2aac7335b24cb356c448c5bdfa04e855ccb834ff2eb31ee642ed98bf5b55da7d", + "setCircuitBreakers(address[],uint256[],uint256[],uint256[])": "0x0d3695614536d3868050acf7e475735030ddf4bcdbcd3dbcce7c7d648a7506d1", + "setJoinExitEnabled(bool)": "0x9aa54bac17d6fc9f8f7c79d2df05640551bd4072f577edc0cbe1ec8a34062320", + "setManagementAumFeePercentage(uint256)": "0x861521052946742ab7716aff1b6da1a65f09c8e9ac1e69096065df97ac60fc3b", + "setMustAllowlistLPs(bool)": "0xb31f689047b3836141cdc301315bfbc52fcb02c416691c6f8f42df1045213b1d", + "setSwapEnabled(bool)": "0x49138bbfb6e77035aa89705fb88ef2078a99b65ae5b6c9ffc983408cae7acae1", + "unpause()": "0x2104a90e49b9d709bbc44eee47d6280b32101abfb2f670e77162a9c703c8888b", + "updateProtocolFeePercentageCache()": "0x68b5eab37b76e1b4faeb57ff15b38149c8e1e5d34d071e74017b9d8db64fa31d", + "updateSwapFeeGradually(uint256,uint256,uint256,uint256)": "0xa4964628ee2b4becfdda58941605326e7388ae792b6b4e00f021439a632bea16", + "updateWeightsGradually(uint256,uint256,address[],uint256[])": "0x28944fba3c44b5125d16d5192ec1f5e1861679336eb53b1c4343d8ae111bfb45" + } + } + }, + "20230409-yearn-linear-pool-v2": { + "YearnLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x16139156304943a93272b39b7f607eb93daf450c201c0653463c09efc326cb55", + "disable()": "0x66db2fcfa4b70b33f43f7867dfaa73830a40a9c21793ab4a4181017cec69c0f4" + } + }, + "YearnLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x1Fa7F727934226aedaB636D62a084931b97d366b", + "actionIds": { + "disableRecoveryMode()": "0xb145fd84f4974d3d49c79b4b53245b058f55c82d16b39f92eb6078d7b23dda5a", + "enableRecoveryMode()": "0xe92818032e649cabfbbf9828641b240d0c8a4ac9437a937f8e99c6b9f92d0fb8", + "initialize()": "0x91c1e443e2d5ce2adb9b069afb75d7086acdefc92c3bde241aa9953a15193594", + "pause()": "0x7da8797db7760574755019e2675d1f816315b7c76c7977ec6c618ffbc4f260b9", + "setSwapFeePercentage(uint256)": "0xb74250de83c56252b0309fc8272338dbe9fac2232b39897af72c3df142d55e20", + "setTargets(uint256,uint256)": "0x974302a1bc71ef8302d15789d6b2a06a3415d4387cce71f03fe386e816539c3a", + "unpause()": "0x53516223620bfff8119e1698f850e094e56ba2b2a8192bdc75032871b780dbce" + } + } + }, + "20230409-erc4626-linear-pool-v4": { + "ERC4626LinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x409e47a8558a01be36e1a8a19437d7b84ab051464be317d94fd900176d4cdd24", + "disable()": "0x5cdea6ae677e1afa17c4dba1377e544c6f83a79c1e3cc7341290a0e7d8a23251" + } + }, + "ERC4626LinearPool": { + "useAdaptor": false, + "factoryOutput": "0x3f53A862919ccFA023CB6AcE91378a79Fb0F6Bf5", + "actionIds": { + "disableRecoveryMode()": "0x941e9b49aed3636c8878b4543d0e1c7daf8c8f30f5c40cdd3e29ec535bf56865", + "enableRecoveryMode()": "0x04105ccf7d08e1e33d81a35a5ced3da44c613e81d864b1e22b1f3d54c5c37c8b", + "initialize()": "0x7a296249cadd263f26669889b9a4799312ec620abd9f53c512c6ab90fa6c7f27", + "pause()": "0x1df6fb8357a54c9e82f443013986d6c1fdfdd7561c49f474fe9000fa1ddfb5e1", + "setSwapFeePercentage(uint256)": "0x430c53d88f8da9ce15fbc710a70e95543153a914f3fd38afd4ded87b4d32b273", + "setTargets(uint256,uint256)": "0x11c6339e89e16488a1313c9f7051a3490329dc37abba0d7977c55cd5222a178e", + "unpause()": "0xf74465cbe241db69e323a9f2cacbe1d585228846cb0752024a9f87ed54dc2253" + } + } + }, + "20230410-aave-linear-pool-v5": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x607fbb5e53d8424622820e0c662de4582c3cdf7345f5f2628b23b3cca0eb6554", + "disable()": "0x6b623ee459a550297f0b0660446eef4dbf89e9d7e9d29addbbe907763506089b" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x19b1C92631405A0a9495ccbA0BeCF4f2e8e908bD", + "actionIds": { + "disableRecoveryMode()": "0x5f70a9fc7662de583295b84f0825dd4069a34c0ae1a6568e07a9bddb702da2fa", + "enableRecoveryMode()": "0xe5346592e9128cab4378e32315f1836824e56d46f901b9e6bafa554e72c9585a", + "initialize()": "0x1db8c8c23dbd96a8f1cd763d9ac5c31c85eef4fc2dd2ada5ff783d4bea302466", + "pause()": "0x2e3db35aff883a61c66722429d09c6fa8afb1b3fd23a906453a02c3ad7a5156c", + "setSwapFeePercentage(uint256)": "0xe2034e57b6e5473c618804022a6b6a56a83df1c39435869038988698f9137b73", + "setTargets(uint256,uint256)": "0x2342e50fb8143fdbef50d38a2b88596172ad4e0c57a39fdbf27bc56c02d3bba3", + "unpause()": "0xdbb204a60732a4043f722f29ca252ecf3d51f45ebc288cb852295d6c184ad304" + } + } + }, + "20230711-composable-stable-pool-v5": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool,uint256,address,bytes32)": "0x2fb86dd2b28db991fe6de68b70c6bc9ec785bde168604e7cdf1869ab5f952615", + "disable()": "0x063bbaf4b25095681176c8be04d41958e40ee88e0a6fe895a8d225cda9bd64ad" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0xd60020Ec34Ccf9A4385f917DE8F6956B77853ABF", + "actionIds": { + "disableRecoveryMode()": "0xc0255b53e66bf2965d8fbd2af1cec52f34060d539ff8dd3c96a8d6aaa678d109", + "enableRecoveryMode()": "0xa6c4d4b9774fc0afef75aa08e9c80377e0b5e5be609a4dafefe381cc580a9e7b", + "pause()": "0x998b893d641593fd3aa179e7641c4e0a7ead0e9f8d25df6d5637ab28d32e924e", + "setAssetManagerPoolConfig(address,bytes)": "0xf59b7db6990a3f3c9a46cc282691ce9aec2f2b74a596428f38eb6f76714f072c", + "setSwapFeePercentage(uint256)": "0xfab324385696857b52130b135e7e81f8b7f34382c9b27f254b6bca9a70fe0784", + "setTokenRateCacheDuration(address,uint256)": "0x694b0acbcabff7c3e9ac8b17ef7399638f853d4198f0da3e1c5ae0bfe013604c", + "startAmplificationParameterUpdate(uint256,uint256)": "0x3be753be2ced552d75d5556694d2012e157294f50103c95273191fb5a0209481", + "stopAmplificationParameterUpdate()": "0x9d2042bf873d984ff8ce2661c7f5854078b8bbf1d618d0509ec379533d3ba9af", + "unpause()": "0x2d9eb9c78c07e1f0176c822f435558eb983e49bea59fcc2dbc3a4d2513999d00", + "updateProtocolFeePercentageCache()": "0x384ae4f5d6ab22796c12b15a9694f08327a4811baba8c68627d7943dd59c6ee7", + "updateTokenRateCache(address)": "0x4d0bbbc942e929d248eeebbe33ab32b44a325731e42eaf11a74ab34cfda8515f" + } + } + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/action-ids/arbitrum/expected-collisions.json b/balpy/balancer-deployments/action-ids/arbitrum/expected-collisions.json new file mode 100644 index 0000000..0fddcfa --- /dev/null +++ b/balpy/balancer-deployments/action-ids/arbitrum/expected-collisions.json @@ -0,0 +1,226 @@ +{ + "0xd92c40d5daec019bee17f4b61c6f29905e23bb7ef406cc751700baffc82b3a30": [ + { + "taskId": "20210913-bal-arbitrum-merkle", + "contractName": "MerkleRedeem", + "signature": "claimWeek(address,uint256,uint256,bytes32[])", + "useAdaptor": true + }, + { + "taskId": "20210928-mcb-arbitrum-merkle", + "contractName": "MerkleRedeem", + "signature": "claimWeek(address,uint256,uint256,bytes32[])", + "useAdaptor": true + } + ], + "0xad0225b8f36d108a0b4b94fcefc162bb866b854df809f5745281c8694e6d37bc": [ + { + "taskId": "20210913-bal-arbitrum-merkle", + "contractName": "MerkleRedeem", + "signature": "claimWeeks(address,(uint256,uint256,bytes32[])[])", + "useAdaptor": true + }, + { + "taskId": "20210928-mcb-arbitrum-merkle", + "contractName": "MerkleRedeem", + "signature": "claimWeeks(address,(uint256,uint256,bytes32[])[])", + "useAdaptor": true + } + ], + "0x1a71f3e5ef203c4123a068cfbe8e002a0b22fe777cc507eb928430feb1cadbcf": [ + { + "taskId": "20210913-bal-arbitrum-merkle", + "contractName": "MerkleRedeem", + "signature": "claimWeeksToInternalBalance(address,(uint256,uint256,bytes32[])[])", + "useAdaptor": true + }, + { + "taskId": "20210928-mcb-arbitrum-merkle", + "contractName": "MerkleRedeem", + "signature": "claimWeeksToInternalBalance(address,(uint256,uint256,bytes32[])[])", + "useAdaptor": true + } + ], + "0xec1217f9c0d96fa75a9d6a62a38724780247f3de54e41e48952440369708c4d3": [ + { + "taskId": "20210913-bal-arbitrum-merkle", + "contractName": "MerkleRedeem", + "signature": "claimWeeksWithCallback(address,address,bytes,(uint256,uint256,bytes32[])[])", + "useAdaptor": true + }, + { + "taskId": "20210928-mcb-arbitrum-merkle", + "contractName": "MerkleRedeem", + "signature": "claimWeeksWithCallback(address,address,bytes,(uint256,uint256,bytes32[])[])", + "useAdaptor": true + } + ], + "0xf75a63a20471dc46da3192be9d76e8f140a4f5507773da6d1384877662708caa": [ + { + "taskId": "20210913-bal-arbitrum-merkle", + "contractName": "MerkleRedeem", + "signature": "renounceOwnership()", + "useAdaptor": true + }, + { + "taskId": "20210928-mcb-arbitrum-merkle", + "contractName": "MerkleRedeem", + "signature": "renounceOwnership()", + "useAdaptor": true + } + ], + "0x9bdc90c1a0da348c425f5a7f90163eaeec5bce689bdd65f6da637b5243714080": [ + { + "taskId": "20210913-bal-arbitrum-merkle", + "contractName": "MerkleRedeem", + "signature": "seedAllocations(uint256,bytes32,uint256)", + "useAdaptor": true + }, + { + "taskId": "20210928-mcb-arbitrum-merkle", + "contractName": "MerkleRedeem", + "signature": "seedAllocations(uint256,bytes32,uint256)", + "useAdaptor": true + } + ], + "0xc72ba8d6ded981d8f10ffe2bc3dbec65b5d9f5af87846080a8cface849d4198d": [ + { + "taskId": "20210913-bal-arbitrum-merkle", + "contractName": "MerkleRedeem", + "signature": "transferOwnership(address)", + "useAdaptor": true + }, + { + "taskId": "20210928-mcb-arbitrum-merkle", + "contractName": "MerkleRedeem", + "signature": "transferOwnership(address)", + "useAdaptor": true + } + ], + "0x91968649430f7ae3ddd77961aae381ea7718e20aea3725fc16a92be8177a7980": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "claim_rewards()", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards()", + "useAdaptor": true + } + ], + "0x260da37aeebf8f3f8aa9f352c114ce7c9961629dfbab0299523e02301d92da90": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "claim_rewards(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards(address)", + "useAdaptor": true + } + ], + "0xe3bd909dfff4cffaef97f4f375216900ec20e1690c9f8234ab9d00101675ec0f": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "claim_rewards(address,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards(address,address)", + "useAdaptor": true + } + ], + "0xc5471dc27ecb4078a3f2cc12480309d946f6984544369303bc9ff2bb1a8e303e": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "deposit(uint256)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "deposit(uint256)", + "useAdaptor": true + } + ], + "0xefc8635b1b670cab330cc5b82805765e708fe37f678bd6c79045c3a09ec255ad": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "deposit(uint256,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "deposit(uint256,address)", + "useAdaptor": true + } + ], + "0xf0fcfa57d89e7197a1b15f9bc73c4b76cdc0a3d7dfb1a7fcda866dcfe1265379": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "set_rewards_receiver(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "set_rewards_receiver(address)", + "useAdaptor": true + } + ], + "0xbbc15eb82e631a665042a77fc37ea62d0e86da7c60222ed9d17299ecc039f0a9": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "withdraw(uint256)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "withdraw(uint256)", + "useAdaptor": true + } + ], + "0xa7ed295af0b197c9481510d6c8326ba2e2d17b2c1a89ab1834ac80de9220b60e": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "ChildChainStreamer", + "signature": "set_reward_distributor(address,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "set_reward_distributor(address,address)", + "useAdaptor": true + } + ], + "0xcba3bd68b8c2df80d0366b2640dd6615b7d466b5d39d1f3de311ba249adbbbbf": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "ChildChainLiquidityGaugeFactory", + "signature": "create(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGaugeFactory", + "signature": "create(address)", + "useAdaptor": true + } + ] +} \ No newline at end of file diff --git a/balpy/balancer-deployments/action-ids/avalanche/action-ids.json b/balpy/balancer-deployments/action-ids/avalanche/action-ids.json new file mode 100644 index 0000000..0f66f0c --- /dev/null +++ b/balpy/balancer-deployments/action-ids/avalanche/action-ids.json @@ -0,0 +1,393 @@ +{ + "20210418-vault": { + "Vault": { + "useAdaptor": false, + "actionIds": { + "batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)": "0x1282ab709b2b70070f829c46bc36f76b32ad4989fecb2fcb09a1b3ce00bbfc30", + "deregisterTokens(bytes32,address[])": "0xe4f8ff74aa05a4d54a06e035d5e86947bc6474f8d7b166ebeb49fc9178d28551", + "exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0xc149e88b59429ded7f601ab52ecd62331cac006ae07c16543439ed138dcb8d34", + "flashLoan(address,address[],uint256[],bytes)": "0x96ebe854ca6ab6242ad127dcd7809576513b0c64571e515cedd7b8885612c82d", + "joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x78ad1b68d148c070372f8643c4648efbb63c6a8a338f3c24714868e791367653", + "managePoolBalance((uint8,bytes32,address,uint256)[])": "0x7275fb98594b03dc36a7de69051058e9e2d05cabeb4fe7d9c87bc69f94d9d084", + "manageUserBalance((uint8,address,uint256,address,address)[])": "0xeba777d811cd36c06d540d7ff2ed18ed042fd67bbf7c9afcf88c818c7ee6b498", + "queryBatchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool))": "0xf5f701b3adfba2adad8f16a8be5a989593e42a2caa84c5c6e60b22143db65a2f", + "registerPool(uint8)": "0x956dfce4343a6be4df20714d3dc413ef59e73fa9995d3d247e7c8d12efd33ac2", + "registerTokens(bytes32,address[],address[])": "0xad5bd4a1cc4243b4d772a8a55d24792c1f57cc45eb97ed1291b82d96125a7626", + "setAuthorizer(address)": "0x1cbb503dcc0f4acaedf71a098211ff8b15a220fc26a6974a8d9deaab040fa6e0", + "setPaused(bool)": "0xb5593fe09464f360ecf835d5b9319ce69900ae1b29d13844b73c250b1f5f92fb", + "setRelayerApproval(address,address,bool)": "0x0014a06d322ff07fcc02b12f93eb77bb76e28cdee4fc0670b9dec98d24bbfec8", + "swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)": "0x7b8a1d293670124924a0f532213753b89db10bde737249d4540e9a03657d1aff" + } + }, + "ProtocolFeesCollector": { + "useAdaptor": false, + "actionIds": { + "setFlashLoanFeePercentage(uint256)": "0xbe2a180d5cc5d803a8eec4cea569989fc1c593d7eeadd1f262f360a68b0e842e", + "setSwapFeePercentage(uint256)": "0xb28b769768735d011b267f781c3be90bce51d5059ba015bc7a28b3e882fb2083", + "withdrawCollectedFees(address[],uint256[],address)": "0xb2b6e48fa160a7c887d9d7a68b6a9bb9d47d4953d33e07f3a39e175d75e97796" + } + } + }, + "20211202-no-protocol-fee-lbp": { + "NoProtocolFeeLiquidityBootstrappingPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address,bool)": "0x803e6b81fee024ccd085712b4bcd6741a50460eef16ac4d213ce52fa09ac31b4", + "disable()": "0xf606602974ca80beb7071ceacbfd2e03a1d2bb9da2001eb3591a2c4bbbbc0d05" + } + } + }, + "20220413-child-chain-gauge-factory": { + "RewardsOnlyGauge": { + "useAdaptor": true, + "actionIds": { + "claim_rewards()": "0xcc81616174594bad0116a2a67a46f12ae8b8dbfcd5b5d85653f6a9f45a5fac2f", + "claim_rewards(address)": "0xe41be765d5cfad11c08db014eff2b4a8d61ef1cdb4e261ccbd8e6ea97547d17a", + "claim_rewards(address,address)": "0x2a5475c5eed3f53f037dcf0ea892bc00066b46567f46c5870d8b640cf1295e8d", + "claimable_reward_write(address,address)": "0x75afaa91b393d48e35295678887a711c02e89049bc323c34ab8f33ea93905d84", + "deposit(uint256)": "0xdb7a8a865c118c708b7b58aa81fcd9faf63dcde098724f59f3caa5b83ea396b9", + "deposit(uint256,address)": "0xfee5c147eaac04c90e63b7abbfd29e62c6d879a33809b505fdb94ef3eecbaf62", + "deposit(uint256,address,bool)": "0x046a9b844a27534f27fd127d4384be2c10c780b2de57e28433d37ebf2df3d8ac", + "initialize(address,address,bytes32)": "0xcbba0c70ea95cd50d0d43887d74c2eadf0e2da70f8006b6b03133cc511393b16", + "set_rewards(address,bytes32,address[8])": "0x1c28be0c862bdafa18acf2279aafab9a34df3943c134c0e5704d36c93608e671", + "set_rewards_receiver(address)": "0xf88d34e766f85b5f4d620e7d4166da3f9bdf13e6f68adbf890b136082b2916e1", + "withdraw(uint256)": "0x2946cd1bba50d122afcd4e50cb175bc14fd55a6df2e8ab74458327704b001e25", + "withdraw(uint256,bool)": "0x5fab59a064ea7fa938816c09376c09df37fa7a684d8e9f0af2b575c326a21f23" + } + }, + "ChildChainStreamer": { + "useAdaptor": true, + "actionIds": { + "add_reward(address,address,uint256)": "0xfd0982f03ae2f1b60e1a94dafa009aa791a8776bf56f7dcedd168a018b6a552f", + "get_reward()": "0x7ef0e867b22d9e0f26c12180ace9abda1bf81d6db74aae757d5810f8732e7f1e", + "initialize(address)": "0x9e7d1d7251d55fd618b3aa4a45df409c0772e5815f350ccdc477ff1f138e5aa4", + "notify_reward_amount(address)": "0x441f32030c75b51777e821d835e735a0bf9e2bb62d160680ef57e64c229218b1", + "remove_reward(address,address)": "0x6ff12a4164858fcba31510d8576d50825689dfa90773f37a08eec0bc8d7b888c", + "set_reward_distributor(address,address)": "0xce713085e9498c958964f4c64979785027e7a93323b68bca8e87296c696fa643", + "set_reward_duration(address,uint256)": "0x02c8d50e13f8c642176dd11071045c7954b0c485674723e03718910be72529fd" + } + }, + "ChildChainLiquidityGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address)": "0xc9dc065d0516a896cd89386058734c4819fe89854b021f97724dcd1ecbc72d8b" + } + } + }, + "20220517-protocol-fee-withdrawer": { + "ProtocolFeesWithdrawer": { + "useAdaptor": false, + "actionIds": { + "allowlistToken(address)": "0x1deb6bc68439c92b8383decd20cc8e1d54bc3a344bd5ea32c71ffc7c9c342e9b", + "denylistToken(address)": "0xf3eadfc5e658bb5d9308d4d7d2b30766bd48e5db7a3637a92428d39fb6b97645", + "withdrawCollectedFees(address[],uint256[],address)": "0x9b7cac7a6e50200d3ceb1372c25ac2f697fa4ba4495fb37091ffc35e5b4f8a42" + } + } + }, + "20220725-protocol-fee-percentages-provider": { + "ProtocolFeePercentagesProvider": { + "useAdaptor": false, + "actionIds": { + "registerFeeType(uint256,string,uint256,uint256)": "0x87608416e0cc3c0a215423f5fe19d9cfaaf80cbfc752636fe834fc0a8e65f11c", + "setFeeTypePercentage(uint256,uint256)": "0xf966da38fb72cb10be01d2ff406b1aeb9cdc62f757d0042e6ff6249f196221a1" + } + } + }, + "20221123-pool-recovery-helper": { + "PoolRecoveryHelper": { + "useAdaptor": false, + "actionIds": { + "addPoolFactory(address)": "0x90ce8036a67bbe2451d4f50ab7353343339db901728ae2de09928006819ee686", + "enableRecoveryMode(address)": "0xd803b6aadd1ec41e42e680b246ebc3f68425ee6cfba1883b53b8fd01e7f37c6b", + "removePoolFactory(address)": "0x25cbdd96392463c2c0b1e5a2db364a18327ef561b6ceeb4a444b694dbf2c7890" + } + } + }, + "20230206-weighted-pool-v3": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address)": "0x37bdd9fd10ea417e3ee0432bc9931583470babbdfba7fb234832953f5b12c876", + "disable()": "0xa245b13df0295c1966c341598370ff2b6a9e83bb687351570533e2f2e01938d5" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0xE867AD0a48e8f815DC0cda2CDb275e0F163A480b", + "actionIds": { + "disableRecoveryMode()": "0x57a99f3ed4c936dc3acc397e914c860702345856a9cca3a5be4c01fefa6a7674", + "enableRecoveryMode()": "0x83d23bd6c0e9f3f7ec0850008689e6079aa87b2f9766e7373bb3620222c3e0a3", + "pause()": "0x8861bb10ff289b57a4dd8aad423013bab2ba5baabf527453b7e5fe1078989c65", + "setAssetManagerPoolConfig(address,bytes)": "0x9f330840ebc2285574bb046c48056ab6c06da01e947ce9ebee468e7e4a6a2c3a", + "setSwapFeePercentage(uint256)": "0x17bd7cdcf8501c46510667aaa9187771e0d83831a3367ff4cf81c00eac71137c", + "unpause()": "0xbc2876200f27f600d66a842f0b3149abc29a5cab6ef63137d79db0036169107f", + "updateProtocolFeePercentageCache()": "0x5f506869a4e7d71cdd3300156e93255616486d8a28c659a096cac8055bdf1e6d" + } + } + }, + "20230320-weighted-pool-v4": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address,bytes32)": "0xaba9ffb17b2efad3b545708e13b3f91cbcb70f6b7de76f29d7a2bd85a0750f88", + "disable()": "0xd7acda26118b9ff06dd8526d0197d58c0c7ed83074be6d915bff2db42b5581ae" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0xb2b5B452d53401391155EA48C4451f6E9b0dD058", + "actionIds": { + "disableRecoveryMode()": "0xd674de2cecb3a543953d0844369358124e617428c5e1bbff8924a84e7e4128fa", + "enableRecoveryMode()": "0x8ceae9d0f076b4b0c529529f6bf11832835b93b533445c655b840015f7025e50", + "pause()": "0xb9c5dbd31b49d898a12157d05b5f59e61b30533c20fe266652c1017837135f0c", + "setAssetManagerPoolConfig(address,bytes)": "0x0bd65c98e2121df958fbdd053552dfab29367bac9f223d282f1c262c89328ff5", + "setSwapFeePercentage(uint256)": "0x32725667b078898f78f53e59f45eb1837b34a9469dbe36f9270b674247b23abf", + "unpause()": "0xb313b0fd78e09c18baecd229b1f60ba3e28af60010313a2eb6e955e3626d8972", + "updateProtocolFeePercentageCache()": "0x851e1de2f8d7c9460da7ecb3137551662eb032a7ac4475ead243e7f5efe9725e" + } + } + }, + "20230320-composable-stable-pool-v4": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address,bytes32)": "0xbe2a96d577f64ef2ba9a0d23f6b34f2588675b36737b0189cab778fe77051fd1", + "disable()": "0xb4738e79f724f5cf9554215b3249de2528482bb77b93844f5eff3f3c9e7126b4" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0xEa4643102dFC03d5e382e7827Bf767f6587E9965", + "actionIds": { + "disableRecoveryMode()": "0xe41196603a4830aa78064fa1ce052e42607bc0a162707e1ce030e7fd9757f0b1", + "enableRecoveryMode()": "0x5776af5dc57240aa03d458ceae96e374999c01c2f7a2978c07d2517447976b65", + "pause()": "0x0b6a61309c977bea4c341dc0c16ce4c5d8e7b682026f4d3c31478d882487909c", + "setAssetManagerPoolConfig(address,bytes)": "0x37fc3bbab5157ec061d8dd11e6a3934d70807ffc1ad9c3a2463225acd9156635", + "setSwapFeePercentage(uint256)": "0x9e71206909b5fab4c36eb9e667afb9a6dcc535260b4b0837056ab7f9ec68c0be", + "setTokenRateCacheDuration(address,uint256)": "0xc09f7fe1b68d08855f7b72e7eddb246605e918232a4400ce63f7ece75ef398f4", + "startAmplificationParameterUpdate(uint256,uint256)": "0x6ed13a1d3fd43b315b36c6d9fd4e057f6d796139fac2f11611b8a79076d0d0b1", + "stopAmplificationParameterUpdate()": "0xb629d427aabf3c9edfd7d759cfc460f0eb838f1b9989578f11c9b87720a368e6", + "unpause()": "0xa22629980c7499ea958706b6b8d9bc49db7688a3db040d0bc0533de63b49e692", + "updateProtocolFeePercentageCache()": "0x03be60818dbe8e0fd09d015378ce8f5de9a41f2085e18c76cecd9b63d5dd12ce", + "updateTokenRateCache(address)": "0x2c1edab6e5809a5ec2683655325c9e6eeba8d5e8d53d0376ce653cc3156d309f" + } + } + }, + "20230411-managed-pool-v2": { + "ManagedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create((string,string,address[]),(address[],uint256[],uint256,bool,bool,uint256,uint256),address,bytes32)": "0x23453746bf001a9ea3432109b510f1cd4f54694f1aa8e1170c99b9f13b59b9ce", + "disable()": "0xc286c677f812387602b94d5dee672097cae543d80e175977381fbdbcdb9b2c12" + } + }, + "ManagedPool": { + "useAdaptor": false, + "factoryOutput": "0x3Fb81f6FB0dd94c6fC7e138887f1CA4CDB5E2999", + "actionIds": { + "addAllowedAddress(address)": "0xf378e43e1d0f41267e0b6654f8f52e0ab432b1fb4f35b209d2e76608ef63eb14", + "addToken(address,address,uint256,uint256,address)": "0xd0ee11d8a1ceea2f635a0f85300fd29c169555e7afbe1e1ec8af2a839fc8c897", + "collectAumManagementFees()": "0x8fe49a28abbd6e0768bff9b995ac9ae53d20d29e816f262479fed23b5234178f", + "disableRecoveryMode()": "0xd21198f97672ee6118c9598a1b4c2053515bf28a40c4df5cf02365c4ff3d5ba7", + "enableRecoveryMode()": "0x2aa887a92d3d18f30f198214d2c197b7d148bb735c610372199c51c6a4866b86", + "pause()": "0xe67bef3cfb0ba409959647fa3d8ff78b267a1c13f5434c2f32219ced33fec922", + "removeAllowedAddress(address)": "0x5c2ff5dbb8961447fb961cdb72a3daab5060c22be92142959d891aad2d7702ea", + "removeToken(address,uint256,address)": "0xb6ae5f8149a45af827981911438d9f80de89bb7e65344e4d0fd1c446a7baa810", + "setCircuitBreakers(address[],uint256[],uint256[],uint256[])": "0x7dce1e9699088bce01cc32c9123e0363a28030fda9c9090b7e046555e0c53557", + "setJoinExitEnabled(bool)": "0xbdbe585a1a041cf18a0d049cf5d7108b4280a0dcaa88ed95b7d7fa6c8e0bcce9", + "setManagementAumFeePercentage(uint256)": "0x06ccd34ea00555e518b5d78aa5c38e84929422c7ed22f28feec12f7cf4157e7a", + "setMustAllowlistLPs(bool)": "0x2a0b8178de7be0484da36c4c3f754744cabe1365fa5554b19fd7dfcd10787529", + "setSwapEnabled(bool)": "0xe1f698ed05d0b787697be880739dea75901cd74e475ef4f38b0fc1067ef88a69", + "unpause()": "0xe43d68fde8cc8cb294d6ab5f297f0d8eca163f7650caee6be549c54527d5b994", + "updateProtocolFeePercentageCache()": "0x6c2d3375fd4cfa536f0e6c5aa8f1afa5d708d0865f30cad3943ff9c968de3b7d", + "updateSwapFeeGradually(uint256,uint256,uint256,uint256)": "0x25204deb977c00e240d2d353b31b645813fef504dfb1a726ea730eeb25e64cee", + "updateWeightsGradually(uint256,uint256,address[],uint256[])": "0xb699a7c9a044c8cc3420213d2b0b7a2daa070fca50add3f78af2791113a323ff" + } + } + }, + "20230316-avax-l2-balancer-pseudo-minter": { + "L2BalancerPseudoMinter": { + "useAdaptor": false, + "actionIds": { + "addGaugeFactory(address)": "0xb6da886ea1e01af4eeb5ab12c50050346b2216644901051e344fa47cb3f03dce", + "mint(address)": "0x213c0c7860e8db10e016ae613aab0b2aab10d7355d79111e3d2fe3d3c37b1136", + "mintFor(address,address)": "0x19f08d6afbdc9dfa646644385dde86662223b64407a2b63828f3fdbceb612244", + "mintMany(address[])": "0x22074be7b9f5446b40c6984d47e1f5f84a7ee90b9ba89a5b128cd42f471b1923", + "mintManyFor(address[],address)": "0xdd304054db8c8636a22aa7b2a3956f4cfa77f43b85b8563f68a42f34d40ce74b", + "mint_for(address,address)": "0x9432ca5abe771645b5be44c1482c73f781743ecd9823f95724e79d8c7bb3c292", + "mint_many(address[8])": "0x86453e3f73e4b6a71c9cfeb4d698b49972b187f884f330a517d650db3510fd73", + "removeGaugeFactory(address)": "0x9c1c3e342d13a9220468be9ab248ae98232151cbc402731b0325adb70c94652f", + "setMinterApproval(address,bool)": "0x66ad07505f343956f146e8224e7f06e30609461c1d6e08a2b29e3215cb7d51d5", + "setMinterApprovalWithSignature(address,bool,address,uint256,uint8,bytes32,bytes32)": "0x327e0216bd7bed1b83c655d16081b51dc6ea0875246d12e4139f7d9a13e71f05", + "toggle_approve_mint(address)": "0xec9bbd0dc06fff49a0187004478a9030c8b469067fa4f49f0d0b94bc3bc30d5a" + } + } + }, + "20230316-l2-ve-delegation-proxy": { + "VotingEscrowDelegationProxy": { + "useAdaptor": false, + "actionIds": { + "killDelegation()": "0x912151c4b4c2d56c1c12a3194aca37ab61610b470365313c464beb47f0ef9486", + "setDelegation(address)": "0xa1d71cc301546175f03bda02d1a4397c439df4116db7639596bf3b897a6a5293" + } + } + }, + "20230316-child-chain-gauge-factory-v2": { + "ChildChainGauge": { + "useAdaptor": true, + "actionIds": { + "add_reward(address,address)": "0xde6b942f89e9060258ffab001fdc0f8f8586641c2f0aa6a47ab427260a470059", + "claim_rewards()": "0xcc81616174594bad0116a2a67a46f12ae8b8dbfcd5b5d85653f6a9f45a5fac2f", + "claim_rewards(address)": "0xe41be765d5cfad11c08db014eff2b4a8d61ef1cdb4e261ccbd8e6ea97547d17a", + "claim_rewards(address,address)": "0x2a5475c5eed3f53f037dcf0ea892bc00066b46567f46c5870d8b640cf1295e8d", + "claim_rewards(address,address,uint256[])": "0xbe310d1b3796ddca6cf53459cad020bf96085725cef266423cb09eef0e395aa4", + "claimable_tokens(address)": "0xddb2e5eb8f7853bb83552651570c8b87b5e79cf7d8db23ead90e3109a9da4c13", + "deposit(uint256)": "0xdb7a8a865c118c708b7b58aa81fcd9faf63dcde098724f59f3caa5b83ea396b9", + "deposit(uint256,address)": "0xfee5c147eaac04c90e63b7abbfd29e62c6d879a33809b505fdb94ef3eecbaf62", + "deposit_reward_token(address,uint256)": "0xab0b9020e618692f256ca998e9958f5a0381801234d37a5a1545017e2488f542", + "initialize(address,string)": "0xc0e7c1f6cda94ca87c275bf4d063e10053b0ebbdea218d3710b9d522a4852023", + "killGauge()": "0x58a62240278232213392be311889725c8de77ca8633fa45a1b3fd119dbe8f153", + "set_reward_distributor(address,address)": "0xce713085e9498c958964f4c64979785027e7a93323b68bca8e87296c696fa643", + "set_rewards_receiver(address)": "0xf88d34e766f85b5f4d620e7d4166da3f9bdf13e6f68adbf890b136082b2916e1", + "unkillGauge()": "0xefc9aa1da5cd66f85fa5731c6b17ac1454039768bc72d02824d97e09d3eff790", + "user_checkpoint(address)": "0xe61e4a449660c19d22eee34923ff4af6ee513588593c3656f981ea1828862192", + "withdraw(uint256)": "0x2946cd1bba50d122afcd4e50cb175bc14fd55a6df2e8ab74458327704b001e25", + "withdraw(uint256,address)": "0xaccf36b10d9bc422a35c27e5b56d801f71d0e6b5452cf8264f29dfad7550cb3d" + } + }, + "ChildChainGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address)": "0xc9dc065d0516a896cd89386058734c4819fe89854b021f97724dcd1ecbc72d8b" + } + } + }, + "20230404-l2-layer0-bridge-forwarder": { + "L2LayerZeroBridgeForwarder": { + "useAdaptor": false, + "actionIds": { + "onVeBalBridged(address)": "0x2fdd9045fac30059763ebffb4a2d4e7fa8b5cd76025fab02024ed6a0c1d4c900", + "onVeBalSupplyUpdate()": "0x365c293f3c90209fef705aa0d5ebe674dae4aa40c1597648609934bbd532a5dc", + "setDelegation(address)": "0x5422f053f58d9a4e6081a50db3c4ee9352ac0d75c8a92eab99872c45145c00a9" + } + } + }, + "20230410-aave-linear-pool-v5": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0xe4650e316e629d72e447573d219606ce837ed2fbc2150e627ba3d727e038a06a", + "disable()": "0x627a2e247176a7cc72374908eeb1ee97159879e68e9a4dbce0144199d17c8a69" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0xA826a114B0c7dB4d1FF4a4BE845a78998c64564C", + "actionIds": { + "disableRecoveryMode()": "0x5bb448519433dd990fbb80eee9dde4a11f4bbac71b50ca2cde3ace8732df3d99", + "enableRecoveryMode()": "0x58bc56d9b84cb2e4efd84f56c7763228f92c6b4714a2cbe10c252384c8b5aa9f", + "initialize()": "0x29f8d77d681a35ae12cafc62f1cfbd34f4b86666f83cb9edd902a56b982930a6", + "pause()": "0x0c17c4a98fd69c4f4acbe101409c122417155d8b138eb16bdbdffe541de0355d", + "setSwapFeePercentage(uint256)": "0x46d03ee209073be69d372d41f744c1529b277254f22efebde5fbc8d6038e3bde", + "setTargets(uint256,uint256)": "0xa194a38f094d72bf8e03dde416d3522afc065785e96948ad893a514dcadfc401", + "unpause()": "0xb0aebee9949bb509c02de6c1f880c5a2bfe40676cdd8641f49895d70e5ad6245" + } + } + }, + "20230409-erc4626-linear-pool-v4": { + "ERC4626LinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x10c8e04d416bd25cb3a52b58323f9a32ef7af13f10e08706b8b07429a78fde45", + "disable()": "0x7c86cd148d8db45c3b501ebc46765f768002a524cfb99123f8f21c719f62e38c" + } + }, + "ERC4626LinearPool": { + "useAdaptor": false, + "factoryOutput": "0xEd3E2F496cbCd8e212192fb8D1499842f04A0D19", + "actionIds": { + "disableRecoveryMode()": "0xef8870acc88fde46bc14769a6c812a201d75f3b65c6ba31eb5c852833028db35", + "enableRecoveryMode()": "0xa2685f4f3b3ddc4fd9c791acbb59d64abb16a8597f810c7154b1b9b5a6c3b5a9", + "initialize()": "0x7dfc2d33cf535cbc0b43a96a883f4e75e1e79fd81931c0e7ffcb0bf677089c39", + "pause()": "0xeefb035cba9a13afe91cf64ecc5036868aa5cc5340cd7c5017def2049ac0b0ba", + "setSwapFeePercentage(uint256)": "0x6103010ac84a79eba6f8385214ddd4e50f4d1e8a2210023cfdf373b4bae5450c", + "setTargets(uint256,uint256)": "0x94e7c43729e6cb635126e5a736eaa1db1ee39400b329e3d1d9a9dda175f52b1f", + "unpause()": "0x478f9d4025883c9d3d66ec622c3d3e90ba16457a940fda57a1c149d8149f2c2b" + } + } + }, + "20230711-composable-stable-pool-v5": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool,uint256,address,bytes32)": "0xa01f2514c30c39d94420a9c6d83cdd6e80a2647ae93f8182ff697e33596c7d71", + "disable()": "0x1426567817459896eea032971802f23ffedf7dbce9ba83c56000f1f9616a25ed" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x9FD66B741ac546055E04E768Dd52edD33574D453", + "actionIds": { + "disableRecoveryMode()": "0xffb70f4f9562b3a5f8e82e3c9eeb43b6769d1af1086819e6881cb0456404ecc1", + "enableRecoveryMode()": "0x4fba353c4ff3db60adac7b39685b4c7079fa9c9080841748fc9ce74f8a1160b0", + "pause()": "0x2f33caac3ea80144501f854d7fc8870e770fe1ec5260b2f09d45014e4ae11b0c", + "setAssetManagerPoolConfig(address,bytes)": "0x1ba95a5d8b257ba1fea475be6dd05792861372cdac8dcb01f7333a17df33523b", + "setSwapFeePercentage(uint256)": "0x846447d11e52871f13911642f2df294a08a10c704fd3746ee2b8e99ef3dd802a", + "setTokenRateCacheDuration(address,uint256)": "0x6075f8fa881cd9ac9e2425a59a9bd60814c43aa81292f5178615855623493ade", + "startAmplificationParameterUpdate(uint256,uint256)": "0x61422cbfc16cfb61b82397377ab5165c6755ee7466a24630f4027d79453e83e5", + "stopAmplificationParameterUpdate()": "0x28dcd620872aaaed93f0363c5b4b038f3b1fcaba6944fb976d670390e56accd0", + "unpause()": "0x365d375eafb1c8f3986410350416a40123576029a230034c6617af41ffcb7e45", + "updateProtocolFeePercentageCache()": "0x93db15cdb362fb7e84ae400efbac0e6a9a34168c015d84e1fd7f6b01bf1bcf39", + "updateTokenRateCache(address)": "0x0328e975c367c4bfc7d51484d1411fae025b567dbe0ec7177ed495937f665fec" + } + } + }, + "20230316-l2-balancer-pseudo-minter": { + "L2BalancerPseudoMinter": { + "useAdaptor": false, + "actionIds": { + "addGaugeFactory(address)": "0xc5b13e35f09fd15aab1bed81874ea8815bd41e76d4a4e193c9f0d47d92f7f03a", + "mint(address)": "0xb1f849126d0b3fedcf2ebf3c69c13fead9ed097e497fd0a0c3ee098036c902cb", + "mintFor(address,address)": "0xdc542a88ce730fb4b33d3a4a4ed670077e21a76abbf853b78defb49267b0522b", + "mintMany(address[])": "0xa9773981483093e9573543a08df4f9d27ce835e9f9f5b2516c557bbfd164c798", + "mintManyFor(address[],address)": "0x8528d916d12a1720d8c2de81a6d4e4d4df0f02c860533660d9aff40dafc7b818", + "mint_for(address,address)": "0x9273451b9358c41a14b6337a0a0f32ceeb6a14f7b87bea8cc29bd501526e5f62", + "mint_many(address[8])": "0xf61eff017b49e565149ec1b8faedafb1570e5b8fe680001038190d128cfbd819", + "removeGaugeFactory(address)": "0x66b4119e4d2f6bbf78ea60c75d4851dcc34b3df5b9d90678d156e34a255f3c43", + "setMinterApproval(address,bool)": "0x91729113d978b1559aaf2480da04900665fc534e311a0053aada40aa87baffd4", + "setMinterApprovalWithSignature(address,bool,address,uint256,uint8,bytes32,bytes32)": "0x6721933bb7d27c655a7f71880d71af42a8570f59961d3a15aec6cd1288501dc9", + "toggle_approve_mint(address)": "0x91101e54d7fa8c933a80f22db9c2c24a6da11d056cd66acb4411ada0f1490a33" + } + } + }, + "20230316-avax-child-chain-gauge-factory-v2": { + "ChildChainGauge": { + "useAdaptor": true, + "actionIds": { + "add_reward(address,address)": "0xde6b942f89e9060258ffab001fdc0f8f8586641c2f0aa6a47ab427260a470059", + "claim_rewards()": "0xcc81616174594bad0116a2a67a46f12ae8b8dbfcd5b5d85653f6a9f45a5fac2f", + "claim_rewards(address)": "0xe41be765d5cfad11c08db014eff2b4a8d61ef1cdb4e261ccbd8e6ea97547d17a", + "claim_rewards(address,address)": "0x2a5475c5eed3f53f037dcf0ea892bc00066b46567f46c5870d8b640cf1295e8d", + "claim_rewards(address,address,uint256[])": "0xbe310d1b3796ddca6cf53459cad020bf96085725cef266423cb09eef0e395aa4", + "claimable_tokens(address)": "0xddb2e5eb8f7853bb83552651570c8b87b5e79cf7d8db23ead90e3109a9da4c13", + "deposit(uint256)": "0xdb7a8a865c118c708b7b58aa81fcd9faf63dcde098724f59f3caa5b83ea396b9", + "deposit(uint256,address)": "0xfee5c147eaac04c90e63b7abbfd29e62c6d879a33809b505fdb94ef3eecbaf62", + "deposit_reward_token(address,uint256)": "0xab0b9020e618692f256ca998e9958f5a0381801234d37a5a1545017e2488f542", + "initialize(address,string)": "0xc0e7c1f6cda94ca87c275bf4d063e10053b0ebbdea218d3710b9d522a4852023", + "killGauge()": "0x58a62240278232213392be311889725c8de77ca8633fa45a1b3fd119dbe8f153", + "set_reward_distributor(address,address)": "0xce713085e9498c958964f4c64979785027e7a93323b68bca8e87296c696fa643", + "set_rewards_receiver(address)": "0xf88d34e766f85b5f4d620e7d4166da3f9bdf13e6f68adbf890b136082b2916e1", + "unkillGauge()": "0xefc9aa1da5cd66f85fa5731c6b17ac1454039768bc72d02824d97e09d3eff790", + "user_checkpoint(address)": "0xe61e4a449660c19d22eee34923ff4af6ee513588593c3656f981ea1828862192", + "withdraw(uint256)": "0x2946cd1bba50d122afcd4e50cb175bc14fd55a6df2e8ab74458327704b001e25", + "withdraw(uint256,address)": "0xaccf36b10d9bc422a35c27e5b56d801f71d0e6b5452cf8264f29dfad7550cb3d" + } + }, + "ChildChainGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address)": "0xc9dc065d0516a896cd89386058734c4819fe89854b021f97724dcd1ecbc72d8b" + } + } + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/action-ids/avalanche/expected-collisions.json b/balpy/balancer-deployments/action-ids/avalanche/expected-collisions.json new file mode 100644 index 0000000..7c31116 --- /dev/null +++ b/balpy/balancer-deployments/action-ids/avalanche/expected-collisions.json @@ -0,0 +1,308 @@ +{ + "0xcc81616174594bad0116a2a67a46f12ae8b8dbfcd5b5d85653f6a9f45a5fac2f": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "claim_rewards()", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards()", + "useAdaptor": true + }, + { + "taskId": "20230316-avax-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards()", + "useAdaptor": true + } + ], + "0xe41be765d5cfad11c08db014eff2b4a8d61ef1cdb4e261ccbd8e6ea97547d17a": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "claim_rewards(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-avax-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards(address)", + "useAdaptor": true + } + ], + "0x2a5475c5eed3f53f037dcf0ea892bc00066b46567f46c5870d8b640cf1295e8d": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "claim_rewards(address,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards(address,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-avax-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards(address,address)", + "useAdaptor": true + } + ], + "0xdb7a8a865c118c708b7b58aa81fcd9faf63dcde098724f59f3caa5b83ea396b9": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "deposit(uint256)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "deposit(uint256)", + "useAdaptor": true + }, + { + "taskId": "20230316-avax-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "deposit(uint256)", + "useAdaptor": true + } + ], + "0xfee5c147eaac04c90e63b7abbfd29e62c6d879a33809b505fdb94ef3eecbaf62": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "deposit(uint256,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "deposit(uint256,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-avax-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "deposit(uint256,address)", + "useAdaptor": true + } + ], + "0xf88d34e766f85b5f4d620e7d4166da3f9bdf13e6f68adbf890b136082b2916e1": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "set_rewards_receiver(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "set_rewards_receiver(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-avax-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "set_rewards_receiver(address)", + "useAdaptor": true + } + ], + "0x2946cd1bba50d122afcd4e50cb175bc14fd55a6df2e8ab74458327704b001e25": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "withdraw(uint256)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "withdraw(uint256)", + "useAdaptor": true + }, + { + "taskId": "20230316-avax-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "withdraw(uint256)", + "useAdaptor": true + } + ], + "0xce713085e9498c958964f4c64979785027e7a93323b68bca8e87296c696fa643": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "ChildChainStreamer", + "signature": "set_reward_distributor(address,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "set_reward_distributor(address,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-avax-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "set_reward_distributor(address,address)", + "useAdaptor": true + } + ], + "0xc9dc065d0516a896cd89386058734c4819fe89854b021f97724dcd1ecbc72d8b": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "ChildChainLiquidityGaugeFactory", + "signature": "create(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGaugeFactory", + "signature": "create(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-avax-child-chain-gauge-factory-v2", + "contractName": "ChildChainGaugeFactory", + "signature": "create(address)", + "useAdaptor": true + } + ], + "0xde6b942f89e9060258ffab001fdc0f8f8586641c2f0aa6a47ab427260a470059": [ + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "add_reward(address,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-avax-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "add_reward(address,address)", + "useAdaptor": true + } + ], + "0xbe310d1b3796ddca6cf53459cad020bf96085725cef266423cb09eef0e395aa4": [ + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards(address,address,uint256[])", + "useAdaptor": true + }, + { + "taskId": "20230316-avax-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards(address,address,uint256[])", + "useAdaptor": true + } + ], + "0xddb2e5eb8f7853bb83552651570c8b87b5e79cf7d8db23ead90e3109a9da4c13": [ + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claimable_tokens(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-avax-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claimable_tokens(address)", + "useAdaptor": true + } + ], + "0xab0b9020e618692f256ca998e9958f5a0381801234d37a5a1545017e2488f542": [ + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "deposit_reward_token(address,uint256)", + "useAdaptor": true + }, + { + "taskId": "20230316-avax-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "deposit_reward_token(address,uint256)", + "useAdaptor": true + } + ], + "0xc0e7c1f6cda94ca87c275bf4d063e10053b0ebbdea218d3710b9d522a4852023": [ + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "initialize(address,string)", + "useAdaptor": true + }, + { + "taskId": "20230316-avax-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "initialize(address,string)", + "useAdaptor": true + } + ], + "0x58a62240278232213392be311889725c8de77ca8633fa45a1b3fd119dbe8f153": [ + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "killGauge()", + "useAdaptor": true + }, + { + "taskId": "20230316-avax-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "killGauge()", + "useAdaptor": true + } + ], + "0xefc9aa1da5cd66f85fa5731c6b17ac1454039768bc72d02824d97e09d3eff790": [ + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "unkillGauge()", + "useAdaptor": true + }, + { + "taskId": "20230316-avax-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "unkillGauge()", + "useAdaptor": true + } + ], + "0xe61e4a449660c19d22eee34923ff4af6ee513588593c3656f981ea1828862192": [ + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "user_checkpoint(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-avax-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "user_checkpoint(address)", + "useAdaptor": true + } + ], + "0xaccf36b10d9bc422a35c27e5b56d801f71d0e6b5452cf8264f29dfad7550cb3d": [ + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "withdraw(uint256,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-avax-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "withdraw(uint256,address)", + "useAdaptor": true + } + ] +} \ No newline at end of file diff --git a/balpy/balancer-deployments/action-ids/base/action-ids.json b/balpy/balancer-deployments/action-ids/base/action-ids.json new file mode 100644 index 0000000..eee7fec --- /dev/null +++ b/balpy/balancer-deployments/action-ids/base/action-ids.json @@ -0,0 +1,345 @@ +{ + "20210418-authorizer": { + "Authorizer": { + "useAdaptor": true, + "actionIds": { + "grantRole(bytes32,address)": "0x9d6b4d711aac0259be091c20c512f23cb3d09b31b93ae5661942dc15e00bb234", + "grantRoles(bytes32[],address)": "0x9e3d3cf6a2ca05bf958e517fb13ea9144402b3a9299de4c315d31d2f6ca7bb13", + "grantRolesToMany(bytes32[],address[])": "0x20a9ece8a3690ef0b63b22969e36b59b450ebfb8ffc41c850effa183609dc94d", + "renounceRole(bytes32,address)": "0xcc2b32b747ab9700200c8074c1fa503a7c618757c554b07055fae6246bb45134", + "revokeRole(bytes32,address)": "0x6495a1e9e81cfcf02cde824e83c6c342786d44e647236594b199e0d0eec91791", + "revokeRoles(bytes32[],address)": "0xb2e0620a8e0298ae5fd1acbec9e1999d9cd19a2d29c07003d49287dfaa14abb2", + "revokeRolesFromMany(bytes32[],address[])": "0x615203152a36c659e67b60d4d785a66d7a2c9cea4ae6a5bf04b7f20562725b49" + } + } + }, + "20210418-vault": { + "Vault": { + "useAdaptor": false, + "actionIds": { + "batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)": "0x1282ab709b2b70070f829c46bc36f76b32ad4989fecb2fcb09a1b3ce00bbfc30", + "deregisterTokens(bytes32,address[])": "0xe4f8ff74aa05a4d54a06e035d5e86947bc6474f8d7b166ebeb49fc9178d28551", + "exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0xc149e88b59429ded7f601ab52ecd62331cac006ae07c16543439ed138dcb8d34", + "flashLoan(address,address[],uint256[],bytes)": "0x96ebe854ca6ab6242ad127dcd7809576513b0c64571e515cedd7b8885612c82d", + "joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x78ad1b68d148c070372f8643c4648efbb63c6a8a338f3c24714868e791367653", + "managePoolBalance((uint8,bytes32,address,uint256)[])": "0x7275fb98594b03dc36a7de69051058e9e2d05cabeb4fe7d9c87bc69f94d9d084", + "manageUserBalance((uint8,address,uint256,address,address)[])": "0xeba777d811cd36c06d540d7ff2ed18ed042fd67bbf7c9afcf88c818c7ee6b498", + "queryBatchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool))": "0xf5f701b3adfba2adad8f16a8be5a989593e42a2caa84c5c6e60b22143db65a2f", + "registerPool(uint8)": "0x956dfce4343a6be4df20714d3dc413ef59e73fa9995d3d247e7c8d12efd33ac2", + "registerTokens(bytes32,address[],address[])": "0xad5bd4a1cc4243b4d772a8a55d24792c1f57cc45eb97ed1291b82d96125a7626", + "setAuthorizer(address)": "0x1cbb503dcc0f4acaedf71a098211ff8b15a220fc26a6974a8d9deaab040fa6e0", + "setPaused(bool)": "0xb5593fe09464f360ecf835d5b9319ce69900ae1b29d13844b73c250b1f5f92fb", + "setRelayerApproval(address,address,bool)": "0x0014a06d322ff07fcc02b12f93eb77bb76e28cdee4fc0670b9dec98d24bbfec8", + "swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)": "0x7b8a1d293670124924a0f532213753b89db10bde737249d4540e9a03657d1aff" + } + }, + "ProtocolFeesCollector": { + "useAdaptor": false, + "actionIds": { + "setFlashLoanFeePercentage(uint256)": "0xbe2a180d5cc5d803a8eec4cea569989fc1c593d7eeadd1f262f360a68b0e842e", + "setSwapFeePercentage(uint256)": "0xb28b769768735d011b267f781c3be90bce51d5059ba015bc7a28b3e882fb2083", + "withdrawCollectedFees(address[],uint256[],address)": "0xb2b6e48fa160a7c887d9d7a68b6a9bb9d47d4953d33e07f3a39e175d75e97796" + } + }, + "BalancerHelpers": { + "useAdaptor": true, + "actionIds": { + "queryExit(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x3fd33aebf9f8f6102a89b2b217859406c842286aacaa3153e34759e0f157c15b", + "queryJoin(bytes32,address,address,(address[],uint256[],bytes,bool))": "0xad45e57e01513da56b7032586652e12c2d5900e92b5a75ed4c6f8cfb9d2aa5a9" + } + } + }, + "20230316-l2-ve-delegation-proxy": { + "VotingEscrowDelegationProxy": { + "useAdaptor": false, + "actionIds": { + "killDelegation()": "0x587b0999c511694493485639d262789d9aada78c2050508953233225da5242d4", + "setDelegation(address)": "0x033f3ebfdc58141797e7786a8115159707118fe37ae8f6d7b98929e4465349fb" + } + } + }, + "20230316-l2-balancer-pseudo-minter": { + "L2BalancerPseudoMinter": { + "useAdaptor": false, + "actionIds": { + "addGaugeFactory(address)": "0xe26f8fdc1d4f5fb1b88969b7f3b9908b59db3a391dac6b94abb82fdb1e13194d", + "mint(address)": "0xb05f69e8656af4a0f434903beca6a730032b69c2f17ecc51d3d804f632cae36f", + "mintFor(address,address)": "0xb1e56d66ffdd2e079e0a9aecbcf433c6fb2d3eec2480fe7f57cbec0fa580fd20", + "mintMany(address[])": "0x8e2b930a2acaca6007dcbc2e05ebf8ec04d9289c30c091762a95f13a622a9214", + "mintManyFor(address[],address)": "0xcc7ceaac04963a4132b608b62129bfb6827dd7e5dc24b7899f95123b0f1b1f5c", + "mint_for(address,address)": "0xe004e0aebccec0e264defede1cc15167cbcfbcbfe296605dc5daad5012a7620d", + "mint_many(address[8])": "0xbb8f2b929e875246776b5060fcb1f25f9dd0c1d68cb0d3de0bb6025d39b96d61", + "removeGaugeFactory(address)": "0x3bb7477d7665759d8760be302797477ae7cc795ca4524510898b50be5df5fdb6", + "setMinterApproval(address,bool)": "0xd9cc88357cabc3b835991df2f812f1bd9882fac537137ff645c8cae0818ca88a", + "setMinterApprovalWithSignature(address,bool,address,uint256,uint8,bytes32,bytes32)": "0x28435ef953f1cb7c8f78b7ec1bc3d157cb85b02ac67d93bd056584cff3fda030", + "toggle_approve_mint(address)": "0xbb114477c34fbe2fc3242795179de7b8f3c8d60295a3d5414104f3913ee741cd" + } + } + }, + "20220725-protocol-fee-percentages-provider": { + "ProtocolFeePercentagesProvider": { + "useAdaptor": false, + "actionIds": { + "registerFeeType(uint256,string,uint256,uint256)": "0x6ebe14dd0a6df4fed73cd3448c56ca327e0e4a3f9b5dc46449b3e1b624c0ab5e", + "setFeeTypePercentage(uint256,uint256)": "0xa7a697ce17c1edf53a1754af59c8baa28cfcd12e0754ebe7be741c788cc6eb1d" + } + } + }, + "20230711-composable-stable-pool-v5": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool,uint256,address,bytes32)": "0x9aed215d37feaf9dd66895e658af56c3f412d4eab652c5ea5ab888aea192a1ab", + "disable()": "0xdaaee19ea07a42ead195d8bb23af2bef543fbc6c68646c53eac48ccce223ebd4" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x7F6E9d6a4093Af9d09bAE92d24bfE42Fc5369aE6", + "actionIds": { + "disableRecoveryMode()": "0xda47db3e3d7efeaeff787e4fc4d928b5c8b8721fbf1141a3f886d25b003daa53", + "enableRecoveryMode()": "0xe932f711f092053ab6fe1738927dfacaaf05f6678a02b1f4bca7e680b95acbe8", + "pause()": "0x891df90c5c3658e1ebd9ae73664a3921ffecb5a9fb19becfbeb1977bbd03316b", + "setAssetManagerPoolConfig(address,bytes)": "0x65e8067dfacae37cd64a9d4a1e9e2f683b9d32b546e1fdbbfb1c3c0609485e65", + "setSwapFeePercentage(uint256)": "0x54f4400937c49ea26409a0ee7262a49aea8d784bd16e12ac7e403ea500fe5d7e", + "setTokenRateCacheDuration(address,uint256)": "0x0e736ebebc84431297bd6ed2b3f59b1c26ccafc4c155139256e7132eb5830826", + "startAmplificationParameterUpdate(uint256,uint256)": "0x19453697f1a22fa9bd43b56478d27bf8d43290be524f46ffbb6ae41dc88948ed", + "stopAmplificationParameterUpdate()": "0xd0adf54c46ef81c9626969a3de810f8e445983f029319bc6caaf459eba91c1a3", + "unpause()": "0xbb163efa221c969d82ee7574faac5731119d3ea11e5faccefa5a3fd6ca636228", + "updateProtocolFeePercentageCache()": "0x24a3886f49019514758b99a62cada6fdfa394151ed333ee8b0ca12132c5605bf", + "updateTokenRateCache(address)": "0x2e90b38151e67959e2592dc08a970da438d34ca8d05914da7f1317d42564e66a" + } + } + }, + "20230320-weighted-pool-v4": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address,bytes32)": "0xb0e8e6255c3ed13ad8d1f4560991ea1ac11221516eb78b7b4c5a11bedb7f40f6", + "disable()": "0xa8ff4830c7bf9a4c5c71257a9e4272ae652308e2fadfe8e0b2b862f77ead95d7" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0xd9dbbfAA703f3C33838365aE00fE4EB22CdF8d46", + "actionIds": { + "disableRecoveryMode()": "0xad52bee7b730cd4172ab23f71a320a2904f076ce8d4188f6780d0f2ecfa89efe", + "enableRecoveryMode()": "0xadbf17d5cbdfa6f1473b5c3fae1de6e9959223e464815fc481499cd58a591bab", + "pause()": "0x0cce170c212bd2a0cb239b2e279b6a7527ddab4a9bfe5a6801db9f4e55b3f0df", + "setAssetManagerPoolConfig(address,bytes)": "0xb3244bec08dadad843cfbf72173520dd8818873128762649388067c141db875e", + "setSwapFeePercentage(uint256)": "0x82082fa8e750c32535c8828ada82d6f47fd7ec82740773fc3bb3f7eb88a11717", + "unpause()": "0x4e4fe7cf476c825592856ba53d68617ba8ed01ac847a26e1596010db4b9d1d59", + "updateProtocolFeePercentageCache()": "0x2d2a6f797eca8b5093f75472bd67b36e690fcdff529535d6e173a49c1d630259" + } + } + }, + "20220517-protocol-fee-withdrawer": { + "ProtocolFeesWithdrawer": { + "useAdaptor": false, + "actionIds": { + "allowlistToken(address)": "0x552ce62961f64c3c86fb085ecb60c9bf175b349ff762db0cb8eecb1528ec1350", + "denylistToken(address)": "0xd4d02fac00eec9b98c87b3cad7aa928f3de03afab5ef9b4a9c9d8e51a866f57e", + "withdrawCollectedFees(address[],uint256[],address)": "0xe4041b7c17d9c1871f2ba2855b724e8cdbb7c190bc2fbfaab37f914aa5ead4e9" + } + } + }, + "20221123-pool-recovery-helper": { + "PoolRecoveryHelper": { + "useAdaptor": false, + "actionIds": { + "addPoolFactory(address)": "0x1b92428da72954e7ad3b364e59fbb88fdbec99e68976683c4a272d59c3e157c7", + "enableRecoveryMode(address)": "0x68558bd9466bb4040805a016e46f550eb117b75f51508afb42011dc25f0201d1", + "removePoolFactory(address)": "0x3a5fbda603e92fb625ac204c5e4dc0e375c53b53fa42682287bdce2bca35a5dd" + } + } + }, + "20230223-protocol-id-registry": { + "ProtocolIdRegistry": { + "useAdaptor": false, + "actionIds": { + "registerProtocolId(uint256,string)": "0xe99afce61168d320ec93ef86518f2e0e3d8c360af8d08e02ed8dd11dd0e7ba01", + "renameProtocolId(uint256,string)": "0xe6687796e86abcc8eb0900861ae06a0a5b13fe61e2fe525abba33a1b685a6d86" + } + } + }, + "20230404-l2-layer0-bridge-forwarder": { + "L2LayerZeroBridgeForwarder": { + "useAdaptor": false, + "actionIds": { + "onVeBalBridged(address)": "0x312205e1d8027083258753a3c5fe482d2f468edad93dd4899b41d5c199f41160", + "onVeBalSupplyUpdate()": "0xfb1d561c47499918445cbb200022e32d499f8887f17d6190bd0534bb24b44d53", + "setDelegation(address)": "0x07976d67828ceefa4f25044e5410c4ad939546a1f8a9597b3d46741499d9d8f9" + } + } + }, + "20211202-no-protocol-fee-lbp": { + "NoProtocolFeeLiquidityBootstrappingPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address,bool)": "0xedcb50b71b340f166220359608f65f15204c893df6a0c422f9c0c83ce288c96d", + "disable()": "0x7f9f1c0ce60031b2efe78d00537ab2537cf4b0545ddbdff7f7621ae114895db3" + } + }, + "NoProtocolFeeLiquidityBootstrappingPool": { + "useAdaptor": false, + "factoryOutput": "0x71528afe250438e184b2deAF7947f0f45931DF3b", + "actionIds": { + "setAssetManagerPoolConfig(address,bytes)": "0x9f200d0717258b1c55d83606f3cfc8a0797bcc4f7c4beef2b2f187ca8ddea3d8", + "setPaused(bool)": "0xe646f931af16994201d070916da87ffc47c470c3dfa3d7039f9868ccc6c1426e", + "setSwapEnabled(bool)": "0x08420f66910c3f740c394bd13bfbbc86d7f1174e613a231f3180cb63e5edd36b", + "setSwapFeePercentage(uint256)": "0x79f8e0c1ceb474511814530cd1bf4538465956d49fd8f83a6634ec72e6e91adb", + "updateWeightsGradually(uint256,uint256,uint256[])": "0xfaf12ce176223c8d6f10d56c47eebe692f23595d93eb01086f6a393f80cd5d64" + } + } + }, + "20230409-erc4626-linear-pool-v4": { + "ERC4626LinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x3fc3dc1c5f5cb005807387601630bbe634ee91462a58a5d270d6a800766c4351", + "disable()": "0x3a974164b03a634d51c05b0322775609d8e50216de1c030b3840bbc63a2228a4" + } + }, + "ERC4626LinearPool": { + "useAdaptor": false, + "factoryOutput": "0x1CC2E10C486Ffb7228810B9c7C183d0CD92cdF44", + "actionIds": { + "disableRecoveryMode()": "0xe9268e0446137cba2446031258c4425ce0a1b88e65dfe3c031c4a7e8b32a1090", + "enableRecoveryMode()": "0x1f390a6bbefbf397ddd270894b05f728b32aa8fcfe7a254edeacf8543c7fffdf", + "initialize()": "0xde7054e395d56708b04c5a61f72cbf8ca8b29ea98ef9921df7824b6d20110b5e", + "pause()": "0x787ddd9e3759641f3bd348d3b62449470d43dd976a461ab987b2120963a72164", + "setSwapFeePercentage(uint256)": "0x9d318591426ef81869bafdd882644eabf74f1bb29f17f1f7625ceaeb7bf7014e", + "setTargets(uint256,uint256)": "0x7bad87ee9adce89c39ca6f50f383bb054fe8919b6238a928b0741e707443b4b1", + "unpause()": "0x585d7769914b13ad95f7b4b11b01a99b432db9c4669bf395592d3246b3060dd8" + } + } + }, + "20230409-gearbox-linear-pool-v2": { + "GearboxLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0xe45fe2b2dcbe080d6ea54ba007a482cf4c79bfd5bd981c08032ac06dc4a3933b", + "disable()": "0x9ddfaeb59ec91a3946f847e3d4a82332a9787c8b6c76e3073e4552cffe96a919" + } + }, + "GearboxLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x3c28a59356B473847AAa5e0b6F561636079213A6", + "actionIds": { + "disableRecoveryMode()": "0x02d657b3025ace8a16e25169c9f9fa54874f3a7790f7a7406adbc5f7c4a1f3b3", + "enableRecoveryMode()": "0xbae6301afc9430e95e6f4cfefe17850ed273dd8ace6e64a66b455d7e2f1c5de0", + "initialize()": "0xa4dfcfc025ad4092dc29c429a14d830bdbb58dca02728ea05e43234e288fef15", + "pause()": "0x4a4361641d901585c4fa979102d0b24a0ee5aa41b6fd013b52a7bc7192d2c9e0", + "setSwapFeePercentage(uint256)": "0xd27b2ac43e0623100afea54ac906bb9f0959b26cca33f836b228af779026310c", + "setTargets(uint256,uint256)": "0x20596e561f7373b0d1b94c593a358474e02401a7b56de09f5af901470e652c01", + "unpause()": "0x46c82b90d82d8ce9cd00f58c28c696c9f0358b23b30848156abb3d60fee98237" + } + } + }, + "20230409-yearn-linear-pool-v2": { + "YearnLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x084a58b88b7368c12160ac6390683e79066e18341a726649be0617b2290de1eb", + "disable()": "0x54d04f96e1384dacfbc4bb06d4876678ad3ba07c255782bd693bc9df4b367e24" + } + }, + "YearnLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x369877467FC3B6774DE4E11E0c0AbBdE70Eb40FD", + "actionIds": { + "disableRecoveryMode()": "0x75592082929dae331876cb056bc25ce93cd608544f81ba5f545ab00e3f21b3b1", + "enableRecoveryMode()": "0xe439de626f6f6121ebeb2d7f9b3ad6fdb8b2c645d3b1de4de1d2624bf95aea4b", + "initialize()": "0xbf4a71b5c6680ae41735a0fcc904a2680c559884f69007e9ff506f22e58bd206", + "pause()": "0x18d598983407d1a7c8ee21df73bf1fa9f89919b69f6a712b8521f5d82c211609", + "setSwapFeePercentage(uint256)": "0xe716f33bb1aed7ca21a3a428a38e0fec5f3ea274a3fa22d8171e5b5e849c7f03", + "setTargets(uint256,uint256)": "0xf8e0160362ea0d3bd75a137e0a65022b2a4db29686269ff6e2857f869f477f14", + "unpause()": "0xa471a387394e1dc5bee7ad4008368ea6aa1b823f9da6b59e31b6ae67eb7d91af" + } + } + }, + "20230410-aave-linear-pool-v5": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x3d0363fd8dce0a46081230eef85df634f31fd3a64254d4c1c18fc9dc9ddeef0c", + "disable()": "0xca1bf022f0a4111e9e6995ddb177d334178b978208cdf454fe8b8a81eaa50b1e" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x712e23a9B91Aa30EE7997d1c7a1a285d4C7912D1", + "actionIds": { + "disableRecoveryMode()": "0x8c130f1aa69605df50a90716d57e15a5a47dfb47d807ed838fb9e553213b920d", + "enableRecoveryMode()": "0x71485a098a59b05ec94c66ce65941514fde1427b10f7a920bef592a077d2e4f1", + "initialize()": "0x86881e3ebabadedc1e9555df67b385fd184b24088c4ec909b5a6637056f91040", + "pause()": "0xb8f99692f0cb1e9dbabcb6d9e154bf55ee4fc003eb5e75a94b3acd8c3628ec7e", + "setSwapFeePercentage(uint256)": "0xcb96c6dcd233b49f5decb6e39b3a91d415076c7d8c78ef46aad6e1823ba2dfde", + "setTargets(uint256,uint256)": "0xf037bfa1f407c134bc46cd288ab93d47b13cd73831c019707c6fed5162cf1b2d", + "unpause()": "0x60b772ea86235b35211d400b8c5ed739e3852c45ad4ff2682ca382f0e4259fe3" + } + } + }, + "20230411-managed-pool-v2": { + "ManagedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create((string,string,address[]),(address[],uint256[],uint256,bool,bool,uint256,uint256),address,bytes32)": "0xc197ba2f97d82f05dfc3427445bf57ca1041277916ca6370af9f89fb01c0d143", + "disable()": "0x32c99c7bebe997132d11c52792aa8f98dfe9af3d95068a00fb2839cced101ba5" + } + }, + "ManagedPool": { + "useAdaptor": false, + "factoryOutput": "0xE50AD96Af9370D05D3C1cE85F17C31557B29C4Ee", + "actionIds": { + "addAllowedAddress(address)": "0xd0dba6200e82b0df945981ffc3395d6ca55059811d0cbf12f9db202b2e09ba06", + "addToken(address,address,uint256,uint256,address)": "0x3b580060bf3d4c6f3609b0a4c7152d8210c85bee38d769f95d3bb78ae567041a", + "collectAumManagementFees()": "0xc85d18979689a227d0ed8ba14b05be06c5fc16ff86eab3c056e50a60c6f84479", + "disableRecoveryMode()": "0xbccd339e830f400638a97e96fa0dc2031fafe7bf3d1f11d60edd2ae1dcd67312", + "enableRecoveryMode()": "0x323573210e98fc815a7d8caa19fc8ffc709a296389c4a9cf54ea2c4a2cf945be", + "pause()": "0xe55f0ed468a8366ce0223a459aaa4103989d9a28ca371feafc378638c54fd44d", + "removeAllowedAddress(address)": "0x42ca74853b0ad7835193a8ef414d1e3de841841d7ab0bf4fad1c763ee340d3de", + "removeToken(address,uint256,address)": "0xfb4fd468aa0043d5b0394170471d6b9186e074bc217f85f621fed301c838c485", + "setCircuitBreakers(address[],uint256[],uint256[],uint256[])": "0xfbd198441a7644fe9cbe6628ba8f40a8ccf38cfba3c1d15c9e6651d3cb367aa0", + "setJoinExitEnabled(bool)": "0xee2a80dc3616c0dfad98abb7fd6a597e060e011d393c75c40e13e266876c4ba8", + "setManagementAumFeePercentage(uint256)": "0xbf93469718f3fe981a3ec0d94dd58c37ed19441d82d823ca467fef9f42566cc6", + "setMustAllowlistLPs(bool)": "0x6dce40c978f4ac7dc84e8be92ee553380c04f90d800060dbd82f4d8cfe9a26f2", + "setSwapEnabled(bool)": "0xc26e3292fbfeb4511318fefa32559c7aa12cfa976dd69a23e2192818565af2f4", + "unpause()": "0x2fff11c8057b51595dbdd0b8e2a665cec10b4d14c22715f391cf2571fd1496e3", + "updateProtocolFeePercentageCache()": "0x2bd708d25cfb27498599fd2de7f600bbc5c2377131b771e76b23cff6a4428fba", + "updateSwapFeeGradually(uint256,uint256,uint256,uint256)": "0xc5914607744a66b0cbe1eaa1205aaceb09d5c03b29d9e21606bd53d14ab64352", + "updateWeightsGradually(uint256,uint256,address[],uint256[])": "0x38af12b9b95b54ed829d415293bcef00d891aaab2b9aebcd15df73ca1add4134" + } + } + }, + "20230316-child-chain-gauge-factory-v2": { + "ChildChainGauge": { + "useAdaptor": true, + "actionIds": { + "add_reward(address,address)": "0xf88b0410ed2535c2978ede956e8b17ef2738d8d5f57956886f4e9b7b0d9fd157", + "claim_rewards()": "0xa72f8743bd0a67670b3ab34a11299e721b2195bcbf0e7fd359d02d2bd926eeab", + "claim_rewards(address)": "0xf73bab639117c5be0c73ab691ac1bdf4da6bee29207ab2e031d7a4f80c2c2ce8", + "claim_rewards(address,address)": "0x9992ba5e348ce33394b91ffcd49226629d962ce4ba17c7690483fd7578a6ea9e", + "claim_rewards(address,address,uint256[])": "0x6bbe510d716450759d2df252f39e33817cb9a28bb5497f47576ebb5add0a51c1", + "claimable_tokens(address)": "0x90153f83387a356ba6247d9dd93e5f2300337719b7d774dfe31a4dff87869bd3", + "deposit(uint256)": "0xd8fc42c9cb38a2ad98ccc72d4f8fe200714243fac8f8ae580513124f9425d0ec", + "deposit(uint256,address)": "0x73c7e316c6e0660d7e123fdd906c014fa2ea4f9c2796b935c44d6bb351567cb5", + "deposit_reward_token(address,uint256)": "0x411f9f23e8b9a995a426cab40be960a7bb61917faab34a3ef408748dcfafd926", + "initialize(address,string)": "0xb1ba98b0514b2576d943dad7a0b96f282d63a60a6c4ba0b91e4dc5ecf7166c2e", + "killGauge()": "0x5446409f03ee661de7af871f6ff6efc8bfbc9d1156baf9a9688d7e5a14b6f1c7", + "set_reward_distributor(address,address)": "0x82f054fdfa86620d25b289d7f068681a5224bcfc083243cdb49512fe1574a36f", + "set_rewards_receiver(address)": "0xd071341f2dc0114c168574040d406bee332801b9146b80cb1da2df56608f4fe3", + "unkillGauge()": "0xc03c3fe5a66578b48a41675e5a77e64295c9ea242a6807aa7d7c88808c4c50a8", + "user_checkpoint(address)": "0x938028126b494f561c7bedde7995c904fe89298610d36980dbbc3f27f9b01de6", + "withdraw(uint256)": "0x109e2cc97c606bbe44b84d9712388dbd58533b1e463c7362661dec4a624f1111", + "withdraw(uint256,address)": "0x7b0f2e7222f4b0cb56171f8a93e76ef268433fadfa6a577864251b2eb6fac4ad" + } + }, + "ChildChainGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address)": "0x32d549d94507c71b1d2298a1932b23fe97566433d85939ae4a5c9c796f5daf4d" + } + } + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/action-ids/bsc/action-ids.json b/balpy/balancer-deployments/action-ids/bsc/action-ids.json new file mode 100644 index 0000000..bc25d8d --- /dev/null +++ b/balpy/balancer-deployments/action-ids/bsc/action-ids.json @@ -0,0 +1,367 @@ +{ + "20210418-authorizer": { + "Authorizer": { + "useAdaptor": true, + "actionIds": { + "grantRole(bytes32,address)": "0xb234293161c1b859d2b938db46b83360f9f8a0604e4627897af3372e7bea7023", + "grantRoles(bytes32[],address)": "0x950c5d1fe716efd3bf98ac3df7d1ff7de356f767273600ffdfa0733d5835f365", + "grantRolesToMany(bytes32[],address[])": "0xdd368d47f1aa9aff0c837172b19e3f0d65912e58a454c7df78f0b8f3bc33737a", + "renounceRole(bytes32,address)": "0xbf61d98fb242246447696ebd1f35b9d9bda37b85df50e0f3be5cf12fa953cbb1", + "revokeRole(bytes32,address)": "0x9a8ae3905bafa8c795504a5d63e3c5222df20d321fd3a1e58e7e50d065486040", + "revokeRoles(bytes32[],address)": "0xe31645d18648d21105e586405ad1f228ce82b4616802004d034948ce7cadfcc6", + "revokeRolesFromMany(bytes32[],address[])": "0x0438433f7de1201fa9e87302ad9abbf08fae9722c2167b7bb5adfb6715fafc50" + } + } + }, + "20210418-vault": { + "Vault": { + "useAdaptor": false, + "actionIds": { + "batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)": "0x1282ab709b2b70070f829c46bc36f76b32ad4989fecb2fcb09a1b3ce00bbfc30", + "deregisterTokens(bytes32,address[])": "0xe4f8ff74aa05a4d54a06e035d5e86947bc6474f8d7b166ebeb49fc9178d28551", + "exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0xc149e88b59429ded7f601ab52ecd62331cac006ae07c16543439ed138dcb8d34", + "flashLoan(address,address[],uint256[],bytes)": "0x96ebe854ca6ab6242ad127dcd7809576513b0c64571e515cedd7b8885612c82d", + "joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x78ad1b68d148c070372f8643c4648efbb63c6a8a338f3c24714868e791367653", + "managePoolBalance((uint8,bytes32,address,uint256)[])": "0x7275fb98594b03dc36a7de69051058e9e2d05cabeb4fe7d9c87bc69f94d9d084", + "manageUserBalance((uint8,address,uint256,address,address)[])": "0xeba777d811cd36c06d540d7ff2ed18ed042fd67bbf7c9afcf88c818c7ee6b498", + "queryBatchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool))": "0xf5f701b3adfba2adad8f16a8be5a989593e42a2caa84c5c6e60b22143db65a2f", + "registerPool(uint8)": "0x956dfce4343a6be4df20714d3dc413ef59e73fa9995d3d247e7c8d12efd33ac2", + "registerTokens(bytes32,address[],address[])": "0xad5bd4a1cc4243b4d772a8a55d24792c1f57cc45eb97ed1291b82d96125a7626", + "setAuthorizer(address)": "0x1cbb503dcc0f4acaedf71a098211ff8b15a220fc26a6974a8d9deaab040fa6e0", + "setPaused(bool)": "0xb5593fe09464f360ecf835d5b9319ce69900ae1b29d13844b73c250b1f5f92fb", + "setRelayerApproval(address,address,bool)": "0x0014a06d322ff07fcc02b12f93eb77bb76e28cdee4fc0670b9dec98d24bbfec8", + "swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)": "0x7b8a1d293670124924a0f532213753b89db10bde737249d4540e9a03657d1aff" + } + }, + "ProtocolFeesCollector": { + "useAdaptor": false, + "actionIds": { + "setFlashLoanFeePercentage(uint256)": "0xbe2a180d5cc5d803a8eec4cea569989fc1c593d7eeadd1f262f360a68b0e842e", + "setSwapFeePercentage(uint256)": "0xb28b769768735d011b267f781c3be90bce51d5059ba015bc7a28b3e882fb2083", + "withdrawCollectedFees(address[],uint256[],address)": "0xb2b6e48fa160a7c887d9d7a68b6a9bb9d47d4953d33e07f3a39e175d75e97796" + } + } + }, + "20211202-no-protocol-fee-lbp": { + "NoProtocolFeeLiquidityBootstrappingPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address,bool)": "0xa8f890be66c62f07bf198717dc127aef6c9cc9fbafc2b3db6eb2c03b2a180aba", + "disable()": "0x9f637c196de3124bc0febbb78f206994fdb68c3f8fe8070b42230a76e14ece0b" + } + } + }, + "20220517-protocol-fee-withdrawer": { + "ProtocolFeesWithdrawer": { + "useAdaptor": false, + "actionIds": { + "allowlistToken(address)": "0x8c7a6f2cd3cfa4877f22b0e41d995b81fe28bf08e020358ca22a2a167d2734c1", + "denylistToken(address)": "0xab3ebe4416e9f394db15108c096a5a26c2aedd77c34e537053a0fa646e419460", + "withdrawCollectedFees(address[],uint256[],address)": "0xbb67e02622aa21e88697aa5532b7c2b5dd650128657154bb12e0df34cc0e9e42" + } + } + }, + "20220725-protocol-fee-percentages-provider": { + "ProtocolFeePercentagesProvider": { + "useAdaptor": false, + "actionIds": { + "registerFeeType(uint256,string,uint256,uint256)": "0xe4ea63df8d5dbbadf77c697643e4bc9747ea2f4db859692a56816eb3daaad675", + "setFeeTypePercentage(uint256,uint256)": "0xe9efc5cbd229cb0bb91a71989408142f014a23f2f95d104bb00a571767acd016" + } + } + }, + "20220817-aave-rebalanced-linear-pool": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address)": "0x63415969bc5875f98b8219d115c08be16bb6d2c9ae8710eaa52ae8a763523723", + "disable()": "0x8b2410bab3e0b5c331aee19b6b8738f3f932dedfc47accddd371dfcbd22bda93" + } + } + }, + "20220906-composable-stable-pool": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address)": "0xc8e454ce4b5f75ae5dcb79b0695d2b2d25efbe9b771869ef9625091787b572a9", + "disable()": "0x0a7c328c61ac04bc0e79818b5fa98658f18c222d04e7433de4d87fcbfa15e08e" + } + } + }, + "20220908-weighted-pool-v2": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address)": "0xc534ea9557d664a2b2ad46c506e0e844d93e3d6c4b55a83b8e923fc2dba301b4", + "disable()": "0xbe826ebecfd64701333db6557b090b44c6155461ce9aaf6efce57ad8dc12bd2e" + } + } + }, + "20221123-pool-recovery-helper": { + "PoolRecoveryHelper": { + "useAdaptor": false, + "actionIds": { + "addPoolFactory(address)": "0x90ce8036a67bbe2451d4f50ab7353343339db901728ae2de09928006819ee686", + "enableRecoveryMode(address)": "0xd803b6aadd1ec41e42e680b246ebc3f68425ee6cfba1883b53b8fd01e7f37c6b", + "removePoolFactory(address)": "0x25cbdd96392463c2c0b1e5a2db364a18327ef561b6ceeb4a444b694dbf2c7890" + } + } + }, + "20221122-composable-stable-pool-v2": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address)": "0xb885d98b83d2e0ddc9cc87adabc0f64acbdac302d2545aebafdac0c52a43b892", + "disable()": "0x0a35dcf04fdcf4e2119802287b94a1cf758427e74e9bb450cb31af7c660d7735" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x373b347bc87998b151A5E9B6bB6ca692b766648a", + "actionIds": { + "disableRecoveryMode()": "0x85896342da44e8444ef54be6c4643b51c1e23270bb9ec1f0257cd03d72a80cb6", + "enableRecoveryMode()": "0x7d89412e7c8893c1c85589d68187b2ee925cd2d27c10393980897d1fa4346b0a", + "pause()": "0x6e25be22eb210da3359f4afb977d53109dad5ed4801e736bf6c5239e0028bd48", + "setAssetManagerPoolConfig(address,bytes)": "0x9036802291378e3a6933704d0ccba6f3c6729307d244cb77b7f84060cba99269", + "setSwapFeePercentage(uint256)": "0xdee20d81c6075dcc437dbaaf02d316ab255cfcae4a154e04b17abdebc70a5b48", + "setTokenRateCacheDuration(address,uint256)": "0x160a4f83bcc2f584446953fd8adf0bf96e625212ccf66900051418e8d19e7157", + "startAmplificationParameterUpdate(uint256,uint256)": "0xf766fa63021f6e696e70c339ab7246118c3da74fcbf80dbe6d603189209afed7", + "stopAmplificationParameterUpdate()": "0x1c36fdcc08f18f6fb33519d9491400a58c2c03b6f1222f8385cc36e6fb837110", + "unpause()": "0x09f210f1a6e3730856cd101645ba1c0594f63ca6ed48e7768b5421ae698858db", + "updateProtocolFeePercentageCache()": "0x69d8f3e0969c91e7a94fb45518733240410f56ff60cd304fbc5d13a5432ed71f", + "updateTokenRateCache(address)": "0x43e924739082162d0dfbe4b85270de4e7fe29526d812caeaa4797cf243c0bdfa" + } + } + }, + "20221207-aave-rebalanced-linear-pool-v3": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0x2e45993f73c6b99f03b6568a3c5916a2f4e68e2481e0be684a649ffb1893abce", + "disable()": "0x9c74873793a68418b8da110d8a99f1c6e3efa166b53240cf31f5d2bfe71c7417", + "registerProtocolId(uint256,string)": "0x2fbed48fa7d7f10d33221a6e12464135346f5384940a319e03b68f22a8678c2c" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x1a505Ba1cA84D1A4dCF14c8E4866e556B060c974", + "actionIds": { + "disableRecoveryMode()": "0x72981756b9727d3bb3677cfa614719d4f300685ab446f385a83ddeb8db49b2a7", + "enableRecoveryMode()": "0xeb669fb79cf2879f1ab019458de02f50c206cc68013ecf2368bff67af32d40a3", + "initialize()": "0xc38aff7e7048f22b796de7865d39bb2805c113eb4492307cd96a57d657dd9a02", + "pause()": "0xe14bf1e50eb486406ec41aa78b453b9fe092ae7dd7a00562a72898d05b98bf0d", + "setSwapFeePercentage(uint256)": "0x036c6f89e54cd1274197f4c4c88b10f5569a8251b9ef8158b406b77144498368", + "setTargets(uint256,uint256)": "0x8236b11c74a188009e939de077339983ba2dfa1848f6343d3e86ddc8f186d756", + "unpause()": "0x373f5cc869a72c01152317e38d48c7d06d04e7ba73ad533c14f36d46211d2f2f" + } + } + }, + "20230206-weighted-pool-v3": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address)": "0x5eeb4f7efb07d7354e63b38e6318b5f9dc4a1968af1d48e2bc9cffc1397a4a01", + "disable()": "0x6ebb1e0415982ef3242b0bbf176df030ca1a284d04b18a182a68c6008076a359" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0x463957510888720f1EA65B599e996aaD4264206A", + "actionIds": { + "disableRecoveryMode()": "0x1d97aa38d7c8e7f564802cce35015d924dd35fbb9ea7747d5c039a64a0109638", + "enableRecoveryMode()": "0xf16ea9ea9a4f9adbfddf34a6196cf8cb38470454c6ad313f686b83175393e246", + "pause()": "0x77e7f91971cfc48a18da758e813abe98fd547bd578e509c4de7a2027f4dce3a8", + "setAssetManagerPoolConfig(address,bytes)": "0x7661f69643a5b5604268e82f8ba2cf2ea4a60b95e38bd5bbacaa16922606f4b8", + "setSwapFeePercentage(uint256)": "0xc4595c920c99e790d40666dd89abbe5e8b73b1b67f9fc0646efad42c96786d1c", + "unpause()": "0x6549c5b01dc41a26cbd8321f945d9aa016d1e35b736370bee54072c7b2bff8b1", + "updateProtocolFeePercentageCache()": "0x9a0d30eda3d493d259654a5e1c0aa23e180f4381deccb3388ff3a1ccb24f9eaa" + } + } + }, + "20230206-composable-stable-pool-v3": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address)": "0x83b6d631a974e0972ee228a0f693a0b298c5ae02947cf0a635e8baa08be9cee8", + "disable()": "0xf580e4f2c01bee4791aaea9928dc18c9078c7ae3cc53e9552eca9856a1f54d82" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0xB521E108c8aC5aD91Dc16d0001b7253D3B3beBC5", + "actionIds": { + "disableRecoveryMode()": "0x67ff0faaad9a132d036a774d7f7fe3f14a4e064cff2558ab49d30fdc78a50d3f", + "enableRecoveryMode()": "0xfa991f7d0880d78e4b47b07f3ff6683b2f9d0e3fff603c668cdb9abe50fb51c3", + "pause()": "0x2ea7e802ae182fe67da46013b89ae4976428ebe84ebd4c416779d4d016c1595a", + "setAssetManagerPoolConfig(address,bytes)": "0x94fd74dc161442bf18c54ad82c41cc489ea2a4859142271c0345d1328d422aa1", + "setSwapFeePercentage(uint256)": "0x42354d33adeea8f99dbaee456b6b5de0bf26c477dfc62ccbb099de167344f2e9", + "setTokenRateCacheDuration(address,uint256)": "0x9ea54fc0bfafc1cce65519d81c6f3aee255c3bcb697f9bc2bd170ce3fe37e801", + "startAmplificationParameterUpdate(uint256,uint256)": "0x727bdc137d268503f4afdd42ac5aa1b1a2e8daaba3f74e59b3eb8b58c3b8dda6", + "stopAmplificationParameterUpdate()": "0x4deb38eb5919f347cc436b745a7ed6ec2fef32d67be511083fd3c2040066188a", + "unpause()": "0x67e97bf15e68d82bd24b6ca6effe2ba86360512f9ca3e30d2d5bd62fe43b5a9e", + "updateProtocolFeePercentageCache()": "0xac499c33a853eb09873ac02634e4b4b0e5cf17a4683209cdd2e92c3f7c9fcfba", + "updateTokenRateCache(address)": "0x275cbc18a7de7b3bf3b98da0b8ef6843c7ffc55e2107146ef1ec4e5eb76c3cd4" + } + } + }, + "20230206-aave-rebalanced-linear-pool-v4": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0xb8b4b0c483a7df7565a5eb477ce3a197fe00c08f3f77e069e3e21cc176ae389f", + "disable()": "0x06efe7e891755c060de5033e398e2d4d9f1bc713591717209ef84b7e021bd154" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x11884dA90FB4221b3aa288a7741C51eC4Fc43B2f", + "actionIds": { + "disableRecoveryMode()": "0xd12b97e317782dac10c3547fc977708cf0a2ebe3621f880b6f89236e760278ee", + "enableRecoveryMode()": "0x63670b08ab971b7445722753ef5c4b1ddc64376a631cdb48e3c6eae5a5dfc951", + "initialize()": "0x85c408f18c02ca57e9c77ee2dc325adefcd36bae3773b5f6cc2f3c0cbfd8a964", + "pause()": "0x51530e1d909caf846c8075a98e41431ffe7e18eabf84b1f3ebade86b84547d30", + "setSwapFeePercentage(uint256)": "0x6e1c8947d790e79a7f8b6b195b2ec3231b6b9bd27a74f04b192aacd8e93f3660", + "setTargets(uint256,uint256)": "0xb78893595b75c70259cbe387580b752c333e0a52d40fb98d6bcdf4b54b0cef91", + "unpause()": "0x1c32f073a3a5d59bedde5824d20e95a52159bb8c4ef8e49dd1af982c91fa5e10" + } + } + }, + "20230320-weighted-pool-v4": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address,bytes32)": "0xaba9ffb17b2efad3b545708e13b3f91cbcb70f6b7de76f29d7a2bd85a0750f88", + "disable()": "0xd7acda26118b9ff06dd8526d0197d58c0c7ed83074be6d915bff2db42b5581ae" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0xE7eE2d64bCB1B2C915898E9DA0947DA1D413DCAF", + "actionIds": { + "disableRecoveryMode()": "0xd674de2cecb3a543953d0844369358124e617428c5e1bbff8924a84e7e4128fa", + "enableRecoveryMode()": "0x8ceae9d0f076b4b0c529529f6bf11832835b93b533445c655b840015f7025e50", + "pause()": "0xb9c5dbd31b49d898a12157d05b5f59e61b30533c20fe266652c1017837135f0c", + "setAssetManagerPoolConfig(address,bytes)": "0x0bd65c98e2121df958fbdd053552dfab29367bac9f223d282f1c262c89328ff5", + "setSwapFeePercentage(uint256)": "0x32725667b078898f78f53e59f45eb1837b34a9469dbe36f9270b674247b23abf", + "unpause()": "0xb313b0fd78e09c18baecd229b1f60ba3e28af60010313a2eb6e955e3626d8972", + "updateProtocolFeePercentageCache()": "0x851e1de2f8d7c9460da7ecb3137551662eb032a7ac4475ead243e7f5efe9725e" + } + } + }, + "20230320-composable-stable-pool-v4": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address,bytes32)": "0x0de6d43e3472be04e8d42c8a41d31e85d6a0973531a1bde49a5393ae99748e70", + "disable()": "0xdb0e2ca147bb165fcfd2631fb8cb87ab34aa8fb9d2a81e95334a207f753f0302" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x7C53dBf28a23faB07E322fb35eC53A296f548a45", + "actionIds": { + "disableRecoveryMode()": "0xf65bca6198c80a6fc89409c116db12c0427a0b571cd0d2ee5dd614145d006810", + "enableRecoveryMode()": "0xf7c36607b85de415dd5d9b2e4c47d42f2093d7338fc8af38b88070683da54da1", + "pause()": "0x6464a19f906714393234821d14f9899d08c3c32edac6ac68a28e8e2c444dc372", + "setAssetManagerPoolConfig(address,bytes)": "0x18e56c9f67c05b8b685755dffd4fc9910e67297943e0b6f65c721e1894e08325", + "setSwapFeePercentage(uint256)": "0xe92c5e92fd07c923b506e4ef7eb29972642a073312f496c812148a15bb6b8967", + "setTokenRateCacheDuration(address,uint256)": "0x8518c2cc23c81411457873cc4df8dd9f92946fb21b4b290e3e93467d3f7b4c64", + "startAmplificationParameterUpdate(uint256,uint256)": "0x3d1105ece259c9620b4c0b8c8a01554fdbf4efacfe00c648fa8f99a98c7c26bd", + "stopAmplificationParameterUpdate()": "0x39e75d95add118410df221d6d408e602d372ebc0e6657e596e87ab948b093408", + "unpause()": "0xefca407929bb10cd435a2424c97205e03c8a8757dcdc317cd8c166a0cf7b6067", + "updateProtocolFeePercentageCache()": "0xfec3941bcf00df950d453bfc0502e8ff5be0c6ec7e3486d9a755058a9ed084da", + "updateTokenRateCache(address)": "0x7890466ffba14a02f161e03ef49578067b54197c84285660df1bffe3173b8d70" + } + } + }, + "20230404-l2-layer0-bridge-forwarder": { + "L2LayerZeroBridgeForwarder": { + "useAdaptor": false, + "actionIds": { + "onVeBalBridged(address)": "0xbf0d09cc84c7a607cf0ca866bc5117237e67bf9a118c80f547c2924550c4a147", + "onVeBalSupplyUpdate()": "0xda65f8c06affd0d96c020297234c8620f4b588c1ef6ee036f36f5d5a0f5052f3", + "setDelegation(address)": "0x88d38b22d4165008cdd5f7e516bd0da3bc66f10a54e05105ff57385d7ca18f5f" + } + } + }, + "20230411-managed-pool-v2": { + "ManagedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create((string,string,address[]),(address[],uint256[],uint256,bool,bool,uint256,uint256),address,bytes32)": "0x4c552ed444f4c8ac2e22d8eb4ce47f3463aebafdd2b31c2a645fed5693bb2acf", + "disable()": "0xa8ff4830c7bf9a4c5c71257a9e4272ae652308e2fadfe8e0b2b862f77ead95d7" + } + }, + "ManagedPool": { + "useAdaptor": false, + "factoryOutput": "0x710A461Ea47AE36C45CBA8Cb6ce964e8A5cb87eD", + "actionIds": { + "addAllowedAddress(address)": "0xe59eedd462e75b9ed6dd1e6e6195cb8ed7114efddf34af9d57f1a65f0b4d2856", + "addToken(address,address,uint256,uint256,address)": "0xba672b22630cfea128fe0bf7f900324bc523c29acfbdd0070be15e0847ee603d", + "collectAumManagementFees()": "0x3e0923b8091b34e9ca82e2dd862129ac56526dcdd850d3435e15907e8f82122c", + "disableRecoveryMode()": "0xad52bee7b730cd4172ab23f71a320a2904f076ce8d4188f6780d0f2ecfa89efe", + "enableRecoveryMode()": "0xadbf17d5cbdfa6f1473b5c3fae1de6e9959223e464815fc481499cd58a591bab", + "pause()": "0x0cce170c212bd2a0cb239b2e279b6a7527ddab4a9bfe5a6801db9f4e55b3f0df", + "removeAllowedAddress(address)": "0xd842cceb41efd926a0a2b870e306d7f3da243b5cfd01603eb10fbb952f6140f4", + "removeToken(address,uint256,address)": "0x41d66024a564f612e8ab02af48f2c3b171143b9bc9d9b1c19d01396272bbcc43", + "setCircuitBreakers(address[],uint256[],uint256[],uint256[])": "0x8a5fc0bdf75306c997c2af7f172e777ecc547b1305285f849c630062b1a97867", + "setJoinExitEnabled(bool)": "0x19f4363634e1c9984ae5babee17556256984f377a726ed3189c0f9f069eee874", + "setManagementAumFeePercentage(uint256)": "0xd401e0a7dee470f422396c802e3c530979ead01f2e9258a30543b777fef25f2e", + "setMustAllowlistLPs(bool)": "0x8c4060ab469795e9a4ab31be0836cbf404f128cc76928d41b3359fc15654744f", + "setSwapEnabled(bool)": "0x638d7a30a8c0242399deb9b564eecf119a49343afeef8ffb1032a333871d8de8", + "unpause()": "0x4e4fe7cf476c825592856ba53d68617ba8ed01ac847a26e1596010db4b9d1d59", + "updateProtocolFeePercentageCache()": "0x2d2a6f797eca8b5093f75472bd67b36e690fcdff529535d6e173a49c1d630259", + "updateSwapFeeGradually(uint256,uint256,uint256,uint256)": "0xdee0c2896f4368efc620fb976f1b61b7695b6ee4cd188f3b2c5a707599eeba0d", + "updateWeightsGradually(uint256,uint256,address[],uint256[])": "0x2a79c82f7c154c34bc42a75aa3666a5ea936d4a04a2d894460acd7030f28e7b4" + } + } + }, + "20230410-aave-linear-pool-v5": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x05602476450e2d43024ae4d4a294477ce65642b47e0b5208c788661a62a280bf", + "disable()": "0x9681f538508ebc5c68d192b75a98236dad3231eff13540345bcaa7b9c78f662f" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x2Ba5fd37e71Ab2633602553BE7ad5A377D7ED31A", + "actionIds": { + "disableRecoveryMode()": "0x0dd4aaf1256cecd8ca610574bd48aca8a32c5f3361eab6e23ff3bd7c7e07597f", + "enableRecoveryMode()": "0x041360ca8218cc6b5f510cacd96d11e20ca2e4fa3d603a139de22ba11bfe9cb6", + "initialize()": "0x66679deb6806036033864e3f35e66aa17f0e8c8dc2e23a3c583f51de3c3b8cc4", + "pause()": "0xb26aa9dcb6aa2f7163021ee9bc4acb18631a3d6e885361ec8a7954cc15bb0207", + "setSwapFeePercentage(uint256)": "0xbef3dd179e0a554d0b7c4eb2c552d666066cbffe08410b2e2478cd0710e87c91", + "setTargets(uint256,uint256)": "0x1dada0ab7b3620810478f2c8c50610e4e10de06b1d19ec2130d76e836254455e", + "unpause()": "0x030246ab46ec921534a103ece38688dd3a5e99101a5a524213215577d72391cb" + } + } + }, + "20230711-composable-stable-pool-v5": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool,uint256,address,bytes32)": "0xfc2b336a571c86d524690acf8325feb222136fa019b9be07cfef26c3617d1b0e", + "disable()": "0x72a5df2a33143829e209d8720489edacfae688c4df61120a45ae57de8907b8b6" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x6bDa27339629e2d031F19555D3E44c205c31a13a", + "actionIds": { + "disableRecoveryMode()": "0xf577fe5c48c915029bb931318e79b5ca64c43651274e21ce1aab67d2e788d3e8", + "enableRecoveryMode()": "0x44d434d3ea0981fe425dad382aa75ce620f9e5dce00e0a2969ed14f07661ee49", + "pause()": "0xb7750310d09103e3c75b00c6e5d180fda6d19b4f67d557d06ff7eed56ecb20da", + "setAssetManagerPoolConfig(address,bytes)": "0x5e25f6a8eb0adf48421de0c0efd16e5d40a58b57ef7552a5fca8c2a07a2a8adc", + "setSwapFeePercentage(uint256)": "0xc025389c47b2bdbbfacb7c423e8832f41608d449d77e36b73317a600854cd61a", + "setTokenRateCacheDuration(address,uint256)": "0xfa0e0cd02a320b308d0f8876be7e42c31544577034846e4f4cc200ff115ec223", + "startAmplificationParameterUpdate(uint256,uint256)": "0xbf865f1c6f8d104fabfc55638d1622f92901741c27314f329670c51b54f3eded", + "stopAmplificationParameterUpdate()": "0x1a357d5b1643481255960a2981adcdd96069c98aff413a5e8387d5e199d34a64", + "unpause()": "0x6ddc6b3b7f3bc56ee081cd9d7a108eae8b6e444d4355b51a74913b695afe9017", + "updateProtocolFeePercentageCache()": "0xc92db40fb5288fa0cfb631b490b502d15d92abfbfc453fbddc289e38af9aae20", + "updateTokenRateCache(address)": "0x2ca162e3d659a7005b222f7665036721c203a8421b246b0f2aeebe13e48a1dfb" + } + } + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/action-ids/fantom/action-ids.json b/balpy/balancer-deployments/action-ids/fantom/action-ids.json new file mode 100644 index 0000000..bddb8fc --- /dev/null +++ b/balpy/balancer-deployments/action-ids/fantom/action-ids.json @@ -0,0 +1,52 @@ +{ + "20210418-vault": { + "Vault": { + "useAdaptor": false, + "actionIds": { + "batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)": "0x613346615cf0b67eb4dddb25974f638ea9054ffcba6253356eab0c0d6b2beee5", + "deregisterTokens(bytes32,address[])": "0x40a88a4d4208ce22e6f9279d454f391e99eb5f5c45161dc41f22a28375c00ce7", + "exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x1f49de385af1f787ffdbaa879dd9f69a291a44d65e3209396c0faeaf35165e42", + "flashLoan(address,address[],uint256[],bytes)": "0xed78cdc6e17c42a1dd1f9136fe40b12bf790b6ef16405ddb71c409beb0512772", + "joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0xe4f58b20b91d2aa26b17bf7b6d206053ef49c007c105db60c6c5b63ba61eb159", + "managePoolBalance((uint8,bytes32,address,uint256)[])": "0x5cd3ae1c2bb7376da46b0d1a38f51048a2d3b20780cf6f96795d2424f13aaad2", + "manageUserBalance((uint8,address,uint256,address,address)[])": "0xb9fe74424b9ef83062b3b19b2d4afff4e31d0ecee07c4d44f830f84db1d68415", + "queryBatchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool))": "0x659f3141dbdbc64b86ed2ebce6cb53be16c77f97ad8ecf6854bdbadc2b8bf6e0", + "registerPool(uint8)": "0x32adf8e96622c9f170a5bd69057f3f3acd6a57b2ffde1b7ee60a8ec638e77d26", + "registerTokens(bytes32,address[],address[])": "0xcfbbfb34caebcee01f914f8abd47ecb844db698ec2960993029f1ad76cee63a3", + "setAuthorizer(address)": "0xf41701137fd710c221d68f7103fd6a64c3914383f695636a59d588226646c9df", + "setPaused(bool)": "0x5bc378820edc8261ac3898ec88e8bee0d5f16fb9f6f71435a59f1a8010f8b677", + "setRelayerApproval(address,address,bool)": "0xcd0cc5c1132a8d963f443e6d4eace05e0fc29532dae743d2e03a7391a9b25ec1", + "swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)": "0x4f471780cf1bf482a126b1bde17518ff8d63bb1b35ec0e7ac2c594d1e62abc25" + } + }, + "ProtocolFeesCollector": { + "useAdaptor": false, + "actionIds": { + "setFlashLoanFeePercentage(uint256)": "0xdf9dc03a6ab1cf43cd556a9e3f5f91e7e6fe495dd7ae950689bf294fdbf699ed", + "setSwapFeePercentage(uint256)": "0xaa71aa88cd3944c17523ff0a64c6e533d8066ea755c4539194cb741182cb9ecc", + "withdrawCollectedFees(address[],uint256[],address)": "0x91a484dd2c010cdae861f168371dad11bcb6432aaf363ba69dc6d2abf56c7c20" + } + }, + "BalancerHelpers": { + "useAdaptor": true, + "actionIds": { + "queryExit(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x512b9a93fd57632fc35a0124b55602916796d411fc8c4a823f28cd78ba495ef2", + "queryJoin(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x55eb5e239a30128b882e2e463c0a776a7d5624023c57d2fe879e24f1afddf42b" + } + } + }, + "20210418-authorizer": { + "Authorizer": { + "useAdaptor": true, + "actionIds": { + "grantRole(bytes32,address)": "0x86b5f83c06d20c9d4735e35beb5eb5926f231219976e93a14741e51036265285", + "grantRoles(bytes32[],address)": "0x3abaed4e576fa8b4709de963b82a2c271bfbf32e2683ca9aa0fd334206b19f5b", + "grantRolesToMany(bytes32[],address[])": "0x7ccc4ffbf7a31a03bb8bb809993c2ced0b0da0ef010eb72b15602e99b84e2e42", + "renounceRole(bytes32,address)": "0x9bee1368d353cdf1019a4c0fe291e9dbc46f00510856443923c4e51d939fb069", + "revokeRole(bytes32,address)": "0x49aea02dbec1410fd8fb7de27e5250d6be519c1e5bf5bd29e057922218720df7", + "revokeRoles(bytes32[],address)": "0xf1a230ca8eaf24aefa82b0b85cd7fb19407feefcfb986c8a9d80a48922ddfab1", + "revokeRolesFromMany(bytes32[],address[])": "0x67b84c426d4bf6689457859eb80edae734f93248d30e247662e996f644eddd8a" + } + } + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/action-ids/gnosis/action-ids.json b/balpy/balancer-deployments/action-ids/gnosis/action-ids.json new file mode 100644 index 0000000..a04c501 --- /dev/null +++ b/balpy/balancer-deployments/action-ids/gnosis/action-ids.json @@ -0,0 +1,503 @@ +{ + "20210418-authorizer": { + "Authorizer": { + "useAdaptor": true, + "actionIds": { + "grantRole(bytes32,address)": "0x8f534e702b217e5e54d14acb1a963da2da0205e6da3fbf07bae02937585643f3", + "grantRoles(bytes32[],address)": "0x9d4b445ebe9d7dd8da3959b70388ef05848094bd7be603d9a8af45931c87f4cf", + "grantRolesToMany(bytes32[],address[])": "0x6a444ff66b43d430cdd0dace4fd0133a4d9b92ab229b082858f96ec042afc116", + "renounceRole(bytes32,address)": "0x97f8003ab4583df7fbf35514575ed47c1b43c122da62b731d17bd092af008cd7", + "revokeRole(bytes32,address)": "0x2662b1eb91a4dfc51a23b917c57870152310d397d670a30389530259838b3f5a", + "revokeRoles(bytes32[],address)": "0x9d462981d1fb25869d034ed3a80847569c60c659e5066a0eb005ca7e8fb37fac", + "revokeRolesFromMany(bytes32[],address[])": "0x8c9de7778fa69fce3ac891eae46ec7db74e7ef0d9b060d4b2cb79f797c645874" + } + } + }, + "20210418-vault": { + "Vault": { + "useAdaptor": false, + "actionIds": { + "batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)": "0x1282ab709b2b70070f829c46bc36f76b32ad4989fecb2fcb09a1b3ce00bbfc30", + "deregisterTokens(bytes32,address[])": "0xe4f8ff74aa05a4d54a06e035d5e86947bc6474f8d7b166ebeb49fc9178d28551", + "exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0xc149e88b59429ded7f601ab52ecd62331cac006ae07c16543439ed138dcb8d34", + "flashLoan(address,address[],uint256[],bytes)": "0x96ebe854ca6ab6242ad127dcd7809576513b0c64571e515cedd7b8885612c82d", + "joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x78ad1b68d148c070372f8643c4648efbb63c6a8a338f3c24714868e791367653", + "managePoolBalance((uint8,bytes32,address,uint256)[])": "0x7275fb98594b03dc36a7de69051058e9e2d05cabeb4fe7d9c87bc69f94d9d084", + "manageUserBalance((uint8,address,uint256,address,address)[])": "0xeba777d811cd36c06d540d7ff2ed18ed042fd67bbf7c9afcf88c818c7ee6b498", + "queryBatchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool))": "0xf5f701b3adfba2adad8f16a8be5a989593e42a2caa84c5c6e60b22143db65a2f", + "registerPool(uint8)": "0x956dfce4343a6be4df20714d3dc413ef59e73fa9995d3d247e7c8d12efd33ac2", + "registerTokens(bytes32,address[],address[])": "0xad5bd4a1cc4243b4d772a8a55d24792c1f57cc45eb97ed1291b82d96125a7626", + "setAuthorizer(address)": "0x1cbb503dcc0f4acaedf71a098211ff8b15a220fc26a6974a8d9deaab040fa6e0", + "setPaused(bool)": "0xb5593fe09464f360ecf835d5b9319ce69900ae1b29d13844b73c250b1f5f92fb", + "setRelayerApproval(address,address,bool)": "0x0014a06d322ff07fcc02b12f93eb77bb76e28cdee4fc0670b9dec98d24bbfec8", + "swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)": "0x7b8a1d293670124924a0f532213753b89db10bde737249d4540e9a03657d1aff" + } + }, + "ProtocolFeesCollector": { + "useAdaptor": false, + "actionIds": { + "setFlashLoanFeePercentage(uint256)": "0xbe2a180d5cc5d803a8eec4cea569989fc1c593d7eeadd1f262f360a68b0e842e", + "setSwapFeePercentage(uint256)": "0xb28b769768735d011b267f781c3be90bce51d5059ba015bc7a28b3e882fb2083", + "withdrawCollectedFees(address[],uint256[],address)": "0xb2b6e48fa160a7c887d9d7a68b6a9bb9d47d4953d33e07f3a39e175d75e97796" + } + }, + "BalancerHelpers": { + "useAdaptor": true, + "actionIds": { + "queryExit(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x2c2d48381025f2538d3009c98716f7e89c28225a73559252433caa24330885fb", + "queryJoin(bytes32,address,address,(address[],uint256[],bytes,bool))": "0xd972b0ea55e93f1ad627c0b544d12659dfd52456acc8e7899690b6bebca50994" + } + } + }, + "20220517-protocol-fee-withdrawer": { + "ProtocolFeesWithdrawer": { + "useAdaptor": false, + "actionIds": { + "allowlistToken(address)": "0xd156faa29828f1d77abbbf52c62dcba4870f2f2855640707e320e8c1b4cfddd2", + "denylistToken(address)": "0x6843b94f991c5dbdf5c0bd1ce79ce0de10b8e72ed8b70dbe019e3eda4079802a", + "withdrawCollectedFees(address[],uint256[],address)": "0xf6c9a5b5acca77f76aed5abd6f810c52c3ff5f4a8a40ee9e1bc09f85795e73da" + } + } + }, + "20220721-balancer-queries": { + "BalancerQueries": { + "useAdaptor": true, + "actionIds": { + "queryBatchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool))": "0x77d5bf2ce7d0fab708ed4c816f181e8f9ce7bb476eef69981b52fdf9c0a99929", + "queryExit(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x2c2d48381025f2538d3009c98716f7e89c28225a73559252433caa24330885fb", + "queryJoin(bytes32,address,address,(address[],uint256[],bytes,bool))": "0xd972b0ea55e93f1ad627c0b544d12659dfd52456acc8e7899690b6bebca50994", + "querySwap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool))": "0x23e849b0c61d08883bcec5984056a84de4844a25bedd5e7fc632775522b08ad9" + } + } + }, + "20220725-protocol-fee-percentages-provider": { + "ProtocolFeePercentagesProvider": { + "useAdaptor": false, + "actionIds": { + "registerFeeType(uint256,string,uint256,uint256)": "0x16a4f23f315de2ee156a3b37232abd6e8aa71d84c607f75d224ffd37d4178378", + "setFeeTypePercentage(uint256,uint256)": "0x77b2549a67e235e7bd37726ed4ebd404701323182a0028ea067bb8337e6e15a3" + } + } + }, + "20220908-weighted-pool-v2": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address)": "0x737b3eb524e40f471925572c70ba79fdfe3cf273844aa81f67552e060002da81", + "disable()": "0x0a7c328c61ac04bc0e79818b5fa98658f18c222d04e7433de4d87fcbfa15e08e" + } + } + }, + "20211202-no-protocol-fee-lbp": { + "NoProtocolFeeLiquidityBootstrappingPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address,bool)": "0x64a472fecada50f544efe7f4cf5c748a80d400544a9425c675ffb2e34d67f7f8", + "disable()": "0x0a35dcf04fdcf4e2119802287b94a1cf758427e74e9bb450cb31af7c660d7735" + } + } + }, + "20220404-erc4626-linear-pool-v2": { + "ERC4626LinearPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address)": "0xf9d27f783f06c33f198165d11f500f70ae99e14c6624f234cac46e1fc1978bec" + } + } + }, + "20220609-stable-pool-v2": { + "StablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,uint256,address)": "0x48453570be67198c7e351cbc0d8ae38840caccd425ed446800ad3fcd11308642", + "disable()": "0x06efe7e891755c060de5033e398e2d4d9f1bc713591717209ef84b7e021bd154" + } + } + }, + "20221122-composable-stable-pool-v2": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address)": "0xe52b283c4c0a52c8c69ec18fbd26e6695901ab956518a087c98fa3023d8b72d9", + "disable()": "0xa676b10c0a312087e255fee5692d8b31aec2a0839a91e715a43860c3e62437e3" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x707B7d4a1bAe449d546DCAb869256591bbB3d70b", + "actionIds": { + "disableRecoveryMode()": "0x478e7f53087deab85ae5870218c02821a6bafa4a75984797ac58cdfd513a385b", + "enableRecoveryMode()": "0x793ca26aa62caae6b2fb946bce982e9d0448354abd818cabb58abd0d04a3ef03", + "pause()": "0x21e53d020b912764bb3a437d64ccad86ad4b36334ab4933c92b4f7e20ec74c34", + "setAssetManagerPoolConfig(address,bytes)": "0x1a17c7ed7c4b51c2cf3591a02771ba34c774cc6399066d8ada37ba375a620c76", + "setSwapFeePercentage(uint256)": "0x60b21b2ae5a82434b74afd79abbbafb941197b06237922de3a54d36aaa9c4ea2", + "setTokenRateCacheDuration(address,uint256)": "0xe31d65e162602f6e8861401254d09d67128f6e5c011ce9fee7dfe3f5b02cebd7", + "startAmplificationParameterUpdate(uint256,uint256)": "0xd82b3ab66c70adebd687f4d69dae8b0abd33cacede07deb0c948dc2383f4aeb7", + "stopAmplificationParameterUpdate()": "0x8ab1e42805feb8214d075b216e36ee38c5f3064d5c2ada1d99aa9f63367a029d", + "unpause()": "0x48f45ecf6661caac6ac47a9195afd122325e5c7c3a348b20948083d9cd1b0bcf", + "updateProtocolFeePercentageCache()": "0xe6a8838a78aa2701d75624f03378c203901c2385d269d6ef3f0c8c3e7fb78ae3", + "updateTokenRateCache(address)": "0x7593829f05e636bada285755fdfb8d6806c9b0fc1f3d04e7fc931d7574b88d8d" + } + } + }, + "20221207-aave-rebalanced-linear-pool-v3": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0x4103c182dc4f1bf98e3f9d3a728ac96da85fe9b6e168da96cfe8b0564cf9f5d0", + "disable()": "0x12068567376f5214f735cd6e477a885e135c8964f6771112086ce1fda7cc475d", + "registerProtocolId(uint256,string)": "0xafaf4ce764706ff75bea937f87b0d04970292af6c75a3e1bc4045bb9777dfa65" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x581Ec1f5e7CeD12B186deaE32256AdB53BDd5B08", + "actionIds": { + "disableRecoveryMode()": "0x2918305da5aadaca85b718b266fbd7e7a878a5dcb1aa307b57811c84004f7b23", + "enableRecoveryMode()": "0x2b9e0eea2297118ae92c9c5b6b9ca813c821186c7eb196bd9893a4113354ec4e", + "initialize()": "0x945f53a3cbc62449ed64541978f5618251cc4ca8dbcc6f78f3447801d3b26cc8", + "pause()": "0xd919e97356fc5c0cb30e2fdb110ca94a297b955b06db82ee8d9d603c7f9d1989", + "setSwapFeePercentage(uint256)": "0x528c3020f2bd77511812b0aacb3cb91170124524cfdf0d4941db79d4ebf6ff72", + "setTargets(uint256,uint256)": "0xf0475ec32aacdcbce0baad5031052738f06d3cb8595863d3dd61fadd7a51365b", + "unpause()": "0x185a18e7d0123f2d672af9514ca30dbbc1ebc37c347e887255425f7310210efa" + } + } + }, + "20220425-unbutton-aave-linear-pool": { + "UnbuttonAaveLinearPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address)": "0xf9d27f783f06c33f198165d11f500f70ae99e14c6624f234cac46e1fc1978bec" + } + } + }, + "20221123-pool-recovery-helper": { + "PoolRecoveryHelper": { + "useAdaptor": false, + "actionIds": { + "addPoolFactory(address)": "0x27f2737d0304362f4d515085adcfa1319a27436bb556d75e8ce5216c8ad601be", + "enableRecoveryMode(address)": "0x32ae16017f0d7c12020f27aca68678c9a3e0fb6cafdb9580f61d3395225a48db", + "removePoolFactory(address)": "0xf73432698cd2e092161276906856b882c56056a85b0a0792733cc87cc6d49e57" + } + } + }, + "20230206-weighted-pool-v3": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address)": "0xc534ea9557d664a2b2ad46c506e0e844d93e3d6c4b55a83b8e923fc2dba301b4", + "disable()": "0xbe826ebecfd64701333db6557b090b44c6155461ce9aaf6efce57ad8dc12bd2e" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0xE051605A83dEAe38d26a7346B100EF1AC2ef8a0b", + "actionIds": { + "disableRecoveryMode()": "0x9023a208ea63197b4da99dc4a096d44fb3152b807b6e4d37f15239d9fff8beb2", + "enableRecoveryMode()": "0x2e31b466b15801536da90012c6e9916b3e0587c2d0b7c63328971c531b6ccf87", + "pause()": "0xbfd04f562f5ffcabe925c3bca0e8c47adfc4018a6ddeea8baaeccc502815f86d", + "setAssetManagerPoolConfig(address,bytes)": "0x21abb70d5dc9d589f905afa9933d0280c885b8fccc45427dcd7aaba1ff5fc615", + "setSwapFeePercentage(uint256)": "0xec5cf9ce37bce68429403f673d6dfd0a89d33d4af5960016f9a1bbd07c71be88", + "unpause()": "0x221069d5c4d75512385f4722d8f19772710de5e70ed39f4b97ee6797787e678f", + "updateProtocolFeePercentageCache()": "0x8f5716f90fa88ab80e1aa6f6e226aea38767cfb72561005e3ef45ef67828b422" + } + } + }, + "20230206-composable-stable-pool-v3": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address)": "0x55c896f5716f3534d43308bb6990f5497d7b5b57af0dd89db11470dd57388c6b", + "disable()": "0x9f637c196de3124bc0febbb78f206994fdb68c3f8fe8070b42230a76e14ece0b" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x07c896050dD6E273c199f06d7516F8A4A369d23A", + "actionIds": { + "disableRecoveryMode()": "0x4b0cfb0e3afde1903ef88f0072b490a0d78f1027a165371b1b4732daa84a9559", + "enableRecoveryMode()": "0xd6f4df0a512a29fa4cf2fcfbe4a0b5ea1266a4bbb1ab6fb5761205dbb038441f", + "pause()": "0xf5a74fe74a42c6fe47ddc84feffff02db467d464946b66b317ef6ceeb66bda38", + "setAssetManagerPoolConfig(address,bytes)": "0x20165844cf9e6c2a6f49b8a283d786c5aaa1d89c711042e31d2928eb36d23824", + "setSwapFeePercentage(uint256)": "0x49832d9b75ad868dbf821cf6ee67ab240ff87c62516d7ce788883fdb8845b215", + "setTokenRateCacheDuration(address,uint256)": "0x02c2a0f6c6251ab0610c2548b20e0967cc5ae385cd1109cf5f3d9ce72f722ee3", + "startAmplificationParameterUpdate(uint256,uint256)": "0x8b804839ef6ccdd1c81145961370ad18658e0bf277e9541fcac3915a5608b94d", + "stopAmplificationParameterUpdate()": "0xe0b032f405d9019d046250109c96eb24cf9ff8ed4694d761a65f6153000193c3", + "unpause()": "0xa4f38ba3cf0b1b3ea8bc7b3022ecc6976c184fbbe48d5bebcde37f1c03640b19", + "updateProtocolFeePercentageCache()": "0xff4395d1455f4a2bcb2fde056e750f2af69c000d9897ff5a0cbd87622db503d1", + "updateTokenRateCache(address)": "0xf1af6ce6368dfbb2b08fdf1c7b6ac9eb97f5a7df881c5193406c74c2e8a760ef" + } + } + }, + "20230206-aave-rebalanced-linear-pool-v4": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0x4ced0ffacf01dd754c6fb3dc32076ae0d36a588714792b909e8a58faa254bcd8", + "disable()": "0xf27a3cfffd6082308886cb5ef66425202d4b3180e84c6852d7d8109b4228a5ec" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x225E0047671939A8d78e08EBd692788Abe63f15c", + "actionIds": { + "disableRecoveryMode()": "0x9445e55417916b0075c7d42cc8d936bf87a2e04096fe6e29f17d1e2f80eb4123", + "enableRecoveryMode()": "0x55183eaafc9e607c22ca713ce26b115fe0e7e47216af41fcec2f0fff0d6f622a", + "initialize()": "0x61249c1cc033f0419e0b4556153f3f145175693c37ecd48224e031665842bb4f", + "pause()": "0x9fca6ce6b2733f09e22be866cbbfc8b9b4b6822e7ff1e1c9b5c10895e2bbb6b0", + "setSwapFeePercentage(uint256)": "0x2ae3adc781b5bd1b6741f6a0d64c69c177a309fa771c818a298f437b11e338a9", + "setTargets(uint256,uint256)": "0xc4f7c40d1a1c9c1b1f2c156f3cff7d927a45ed28ae5b64d1fb81ea8ca888ee95", + "unpause()": "0xdf74aa35ca13699649afd09db6086f7d5c7c8f820ce90357c4825b982a2cbafa" + } + } + }, + "20220413-child-chain-gauge-factory": { + "RewardsOnlyGauge": { + "useAdaptor": true, + "actionIds": { + "claim_rewards()": "0xcf0b2b6798f0926a93b908e27f332cfe675625416f0bb92ba5eba0210e8862ad", + "claim_rewards(address)": "0x148bace62efe321c95bf0889b402b31e98d5fdcc6ab4cb39b8098228a82d5c7f", + "claim_rewards(address,address)": "0x94551b28e4224ffdc70c9e7178f6ee9e48764fb50cf5635edd9bcf09d2df64c3", + "claimable_reward_write(address,address)": "0xfc679314994f093e3443cbe466b4000351be4d017dde5b9ee2f976d75895dd84", + "deposit(uint256)": "0xebd01fda981e6a2ce9baed03021c6bffe3678acf18bd69a03e20b91a8a7ea0f4", + "deposit(uint256,address)": "0x9b9e09750c8ed7d83806572801ddf623057c7e95ec15c1ea36c0670827095bed", + "deposit(uint256,address,bool)": "0xa7a296781ddbbfeee4f9ce8663551468770c83f65d153c064f9dbfeb70f02548", + "initialize(address,address,bytes32)": "0x160d6c7f4356bb088dfced82b71d12011d070259698cdaf9e8e3dc54a16d8f16", + "set_rewards(address,bytes32,address[8])": "0x04427096606d82eb0bae4dae90ee6092c33092524a75e0a2a806438943457a83", + "set_rewards_receiver(address)": "0x3b7c2782c806c66b41a98e6f998aa0056451d31e41d0f7d04238e0ed97a4350b", + "withdraw(uint256)": "0x2fbeeab59a2e8b7f4a4bb0d5b80177b8aef087f0063d317953cc3b9b3512136e", + "withdraw(uint256,bool)": "0x994c5c9162060c36fbbe4385f912f952d59113ec2bae61eed98052872009e2ed" + } + }, + "ChildChainStreamer": { + "useAdaptor": true, + "actionIds": { + "add_reward(address,address,uint256)": "0x1b89af5fd70d90b47a73a66d5c4b0f73ca01ea21b5a9c30d783f222b1452e562", + "get_reward()": "0x87643eb119a19e1654fb9d119137d30aad0d2132f799205e66c18d41476c3a2a", + "initialize(address)": "0x2b460a731f9534cd88c1e413cdbc71cdc845a51dfcb8d26d48bb7b70df49bb90", + "notify_reward_amount(address)": "0xf139842955587e7816c90b6d72792f2b7e6014d560464517094450df28164bc8", + "remove_reward(address,address)": "0x1da39327dd83225169af7d55dd9b3feb33fc61ab0a25ca6b8919596f356cbf94", + "set_reward_distributor(address,address)": "0x9d575f62420250ec382e1e8e262ddae46d0d6817fab9fde48f9c6efd068e5844", + "set_reward_duration(address,uint256)": "0x8437b3a9baec9691032f2656bf1874cdd89f3fbd8682005ca84f336686c7d48c" + } + }, + "ChildChainLiquidityGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address)": "0x9b9ebe5b6e53727fbefa2541e629822e72cd8c63c1e2911094b42bab112590a0" + } + } + }, + "20220527-child-chain-gauge-token-adder": { + "ChildChainGaugeTokenAdder": { + "useAdaptor": false, + "actionIds": { + "addTokenToGauge(address,address,address)": "0x1ff8dca7a9af725b8fde69703b657ae58c04e9a7153ef1025379deb0dda4f926" + } + } + }, + "20230223-protocol-id-registry": { + "ProtocolIdRegistry": { + "useAdaptor": false, + "actionIds": { + "registerProtocolId(uint256,string)": "0x0ed00e8835e2d2867dcdf863354062a805ff3fe1dabf44c0b68378c84c52616e", + "renameProtocolId(uint256,string)": "0xfb760772d39ec169b9e7cd49bccd8858c635114d103dea72a7a694d094e8930c" + } + } + }, + "20230320-weighted-pool-v4": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address,bytes32)": "0x189827ce924673a2e4444d2fda3c3aad7e86b0f6696f25847472b1f4c0a70dcc", + "disable()": "0xee4957b205e6db89fef568d9e8aa4fce4a9a8de50ccf9bf7bd611d8c9fa20a07" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0xd8752f9b0A2c2813796AbD2bE212A32FFd656EF1", + "actionIds": { + "disableRecoveryMode()": "0x29596d20dcc54c557d94ae57af84f08715a588be1d756198eec61a3dc368b6c1", + "enableRecoveryMode()": "0x1d8c9dcce0bb3a303ff9556ace00e75eb744769eeeac8c5beb115a1d697378bd", + "pause()": "0x424af7587d00b5e073c5d47ad47b564a6510fa9fb35fb0393c6e83f928227270", + "setAssetManagerPoolConfig(address,bytes)": "0x6c0551b25fbc86176f5d526bca650ca24aa057c956dc4ff69bf5432cf5958958", + "setSwapFeePercentage(uint256)": "0x0e439756a3aff035984c3a9be923d228a560b708849149e6384abd264011962a", + "unpause()": "0x7118b8b3fcf42fc65d6a4548438cc91635b07fc80a98fa1a6b4ea295bd137093", + "updateProtocolFeePercentageCache()": "0x217c096d00d656aeb4fbdce1b5e42248ed79db74d71bf938b42604ffb51d2350" + } + } + }, + "20230320-composable-stable-pool-v4": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address,bytes32)": "0x73957253fb35ee4fcad753d804456bc462e96cc7dc67a7eb02e7e573dfc820fd", + "disable()": "0x51d0341d2686f3ed15bf4f4b5745540b32c4723280e3eefa8dabcb4a366ab0d2" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0xf3678A0b54C61ccD88Ce321c2e07f87aC75F08B9", + "actionIds": { + "disableRecoveryMode()": "0x338ff79f4b040df80f9cbc5217e904e2c8dbb7fb58beb6100c837ffa25ab4197", + "enableRecoveryMode()": "0xb35863a581c2826e59cfa027d5228768a0fcc02c7497f27c05e435870fa4e34b", + "pause()": "0x21ea7ba7282a115973d24d0598646f2b24b98bfd5ed4811eafc19282ada7063c", + "setAssetManagerPoolConfig(address,bytes)": "0x96da418105a9d025b1b80d3de6243f5a519267f66caaa6a943b97030f6e2cabe", + "setSwapFeePercentage(uint256)": "0xceef6cf4faeffc4260dea255a7815f36c153816232b663a816c08b761ad73cbc", + "setTokenRateCacheDuration(address,uint256)": "0xa4cf3b6e755d1c52bedde1ca3a92b562e8fec558b3036cd5eeb2c17ce0cc2c6b", + "startAmplificationParameterUpdate(uint256,uint256)": "0x144167e496476037f70eaed5c87faa423fb69e52609d0b4ee48a8284784a800d", + "stopAmplificationParameterUpdate()": "0x6470d89bfdcc75143ff276dba3b9742eb1e31ae77d9c6e1330743a621d33e755", + "unpause()": "0xf4e188ddf87d79267ed947ffe3a55f04fe919821d4eaa22090db47a09c00ff85", + "updateProtocolFeePercentageCache()": "0x4f8203a797dc1109c3f31193e25858f7901ac10d7092bfcd7c8d3601c98fadb4", + "updateTokenRateCache(address)": "0x239964292fa5d300796b3b838154583011a75c01b290076f7fdf482801ef2d22" + } + } + }, + "20230316-l2-balancer-pseudo-minter": { + "L2BalancerPseudoMinter": { + "useAdaptor": false, + "actionIds": { + "addGaugeFactory(address)": "0xff178bcb549aae01d4613b3ca6c16f1fa42e808cd1bddd210756b3878cfa9268", + "mint(address)": "0x97f7f1b521a14f36f1c7cb36dfab49d74185ad3bc0c458fc32ba67da2966415e", + "mintFor(address,address)": "0x1fc80cfffac4b9527fe294eca5590653d06d60038a36d9dd27ff9b53f6dcd434", + "mintMany(address[])": "0xf7128ccdb3ffa73b88d0f9e71ade9dd02594ea2f47c885fe8b2365ac633386a8", + "mintManyFor(address[],address)": "0x7519e151f44d1b50737c56f72f4a1d480041dc4f697253693c8a9a6fe3d3e5d4", + "mint_for(address,address)": "0x016d43b0da0e71d158a5e321c48dca28ceac996bea655d07a4a50843437c63b9", + "mint_many(address[8])": "0x99ab5a231ad1a48dec22b7db9af36f172133086d2577443ad1ea87652490f368", + "removeGaugeFactory(address)": "0xc57999420bd10abd998589ff441a68d6eeb987ae3475a9b72dfb3549122dbd84", + "setMinterApproval(address,bool)": "0xdea7a6796e346eda189719616b222c3d819b8c1ae0ad63fdc055f5587444f6ff", + "setMinterApprovalWithSignature(address,bool,address,uint256,uint8,bytes32,bytes32)": "0x8e39642ab168f36bd60dbc1f0bd705dcd09de4ba7bb18a7fe3d4f2b4b9075b1a", + "toggle_approve_mint(address)": "0xa6150298594be9fdb9f3a836db79e2ac5d086a336f47e9d92a59b603efa92f3a" + } + } + }, + "20230316-l2-ve-delegation-proxy": { + "VotingEscrowDelegationProxy": { + "useAdaptor": false, + "actionIds": { + "killDelegation()": "0x9cb98e2303069731b519a5796159ef39c12e97c5d113d273c9ab8999a85d9e4f", + "setDelegation(address)": "0x61d367fdef9a156d543288bab90410760d120019702b0559ffb08a3075aa7d42" + } + } + }, + "20230316-child-chain-gauge-factory-v2": { + "ChildChainGauge": { + "useAdaptor": true, + "actionIds": { + "add_reward(address,address)": "0xc94195da697c94d4db5c313ab49b9ea64c8d69137624b163ba0e4540edfd0faf", + "claim_rewards()": "0xcf0b2b6798f0926a93b908e27f332cfe675625416f0bb92ba5eba0210e8862ad", + "claim_rewards(address)": "0x148bace62efe321c95bf0889b402b31e98d5fdcc6ab4cb39b8098228a82d5c7f", + "claim_rewards(address,address)": "0x94551b28e4224ffdc70c9e7178f6ee9e48764fb50cf5635edd9bcf09d2df64c3", + "claim_rewards(address,address,uint256[])": "0x434081a11e142e3f0479032c4e19f009cbb7bc38b678eefaad5d85e8ad4d4bc1", + "claimable_tokens(address)": "0xcbc01ad744252bfd1bd92c8416347f570de50588e83ca3f41151ff12282294f4", + "deposit(uint256)": "0xebd01fda981e6a2ce9baed03021c6bffe3678acf18bd69a03e20b91a8a7ea0f4", + "deposit(uint256,address)": "0x9b9e09750c8ed7d83806572801ddf623057c7e95ec15c1ea36c0670827095bed", + "deposit_reward_token(address,uint256)": "0x21380fb654397c5c8ef2da7e72d3f1fba75f641eac0456661fbd66e4cb0e430f", + "initialize(address,string)": "0xa1bc4ed4f6b2dad893b29de2f74c168de039c9c185df52b709f197c18901f9a5", + "killGauge()": "0x8037c51433ec7e1b24c1336802cdee94972d826a8f260c622ade11ec89877829", + "set_reward_distributor(address,address)": "0x9d575f62420250ec382e1e8e262ddae46d0d6817fab9fde48f9c6efd068e5844", + "set_rewards_receiver(address)": "0x3b7c2782c806c66b41a98e6f998aa0056451d31e41d0f7d04238e0ed97a4350b", + "unkillGauge()": "0x369ab802731b7a705c4b17c0a1ce3b0dcd2443784a8964630697ae5a707673b2", + "user_checkpoint(address)": "0x20929f17a62d4b1c503d54b4f8dc07b1b247aac613fcdfa7cf95d24eaf5e1352", + "withdraw(uint256)": "0x2fbeeab59a2e8b7f4a4bb0d5b80177b8aef087f0063d317953cc3b9b3512136e", + "withdraw(uint256,address)": "0x56b37309c50be4acbf1a5f2b9bcef0f6605d393dade7d542c6deae09a98c0766" + } + }, + "ChildChainGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address)": "0x9b9ebe5b6e53727fbefa2541e629822e72cd8c63c1e2911094b42bab112590a0" + } + } + }, + "20230404-l2-layer0-bridge-forwarder": { + "L2LayerZeroBridgeForwarder": { + "useAdaptor": false, + "actionIds": { + "onVeBalBridged(address)": "0xce2b3c1775dd4d071e247526336532cdf865e8ce5c03adcadc631f83b994d051", + "onVeBalSupplyUpdate()": "0x82aecea1e20156027af23b1224f4e58630ca673d7465ca993e84795281347811", + "setDelegation(address)": "0x42e1b079f84a2299c7a8c44b572da4fd8fe6062c79fcd44c200323c771c65bdb" + } + } + }, + "20230411-managed-pool-v2": { + "ManagedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create((string,string,address[]),(address[],uint256[],uint256,bool,bool,uint256,uint256),address,bytes32)": "0x3bb4fa58c635469d415e8d5e178ef78ff3f1aeef850fd229fb841cd6646a7776", + "disable()": "0xad5264d61ee90db6d19d6e36a2c93f6d23112459b8a494e489fa1b8f0b9fac38" + } + }, + "ManagedPool": { + "useAdaptor": false, + "factoryOutput": "0xc061361fDa32fF5b65F7D98aCC9a87349d3F0768", + "actionIds": { + "addAllowedAddress(address)": "0xae3a21d45d780f0912917fca114a0dbb0a52369d134f215a781dd0b5cb170a4f", + "addToken(address,address,uint256,uint256,address)": "0x2716ddb7affa761a25505a5a2475eebd03f2d2963fe8336c6184fe39a629612d", + "collectAumManagementFees()": "0x6c94287cb6c6b28f4f55c0419d28177ebd0325e5078fde777c4f45f661e5c6a2", + "disableRecoveryMode()": "0xb2af73aa4d2b082807ca3eee2d0f1404eb4bd2fa6e69cf52fcea761c3f37b5d0", + "enableRecoveryMode()": "0x46efbab063c0b0398c10c3e97d24a5263780379231f3ead5ac0eaf2e9cf8a318", + "pause()": "0x376ffebf3f39d793f8453bbf54f031a0b93c0455a242f89dc6c534b14016e7c5", + "removeAllowedAddress(address)": "0xcd23876f4cbe36975e1809e863af66a34abfa63be4f26d9a80faad9505c556ee", + "removeToken(address,uint256,address)": "0x405ca41b626290883e5d9a79d10f64c62c9cb46760aaf2261c92d6c0a497d533", + "setCircuitBreakers(address[],uint256[],uint256[],uint256[])": "0x325275527e82086c57a57241bd407a680275fb4ed0f7f7c929b59c00b4bc2299", + "setJoinExitEnabled(bool)": "0x15599e27c6387116c7c650818bae7aaddc2ba31b2b21f4af10a1bd7516c7110e", + "setManagementAumFeePercentage(uint256)": "0x6a54f867cef58dbed9615ce44a904e292be372d69fe416709876cc55fa99dd74", + "setMustAllowlistLPs(bool)": "0x52cc7bc5fd1892697bfb29cc827530010f84535b4c9f8ea962f478d2538538c9", + "setSwapEnabled(bool)": "0xd30808f0275d908d48a2f8690fbb9164fdf745a68a8c500748f15f0cceb62c57", + "unpause()": "0xd91831ebc42acd1099b238ce67465a2588e7621afb027e9ec1663222355037c1", + "updateProtocolFeePercentageCache()": "0x396dd9d2510c854bf06fa81a3f05fa720fab237f6041bb4c0edc4c0cf5a988db", + "updateSwapFeeGradually(uint256,uint256,uint256,uint256)": "0x1df8daa0f3b2e85e42cab681fa43182069fc189521fe3116516cb3a38caf49f5", + "updateWeightsGradually(uint256,uint256,address[],uint256[])": "0xc5c5ff596df7daeaf2310727f4ece9650c2de758637046a2366488661451ef61" + } + } + }, + "20230410-aave-linear-pool-v5": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x4b24a0fa7431b398970898b296328b82bc37d7a72904003e95bd15682ac3631f", + "disable()": "0x540a18483d139c6574abe9cc2f83f7d983b9e06eba4f560be96ef9504d4c9208" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x1AC55C31DaC78ca943CB8ebfCa5945ce09e036e2", + "actionIds": { + "disableRecoveryMode()": "0xfa622d172821d9fc7f1c07dd32678a73e16776f473232c5246ae2eba9dc27568", + "enableRecoveryMode()": "0x7461fb1ee70d064228f527e7d349d2429d9abb1a2ec29524519c9dd586f8f3c6", + "initialize()": "0x0119982710e8a37f33ece1c11f7b019c060cc6d23431578d22b1beef34643708", + "pause()": "0xa35728781c343f60b02e19dc90a50f0991daefdab1c5de541899d28dd065f7bf", + "setSwapFeePercentage(uint256)": "0xebcf876ca20204aac10dbecae7d6f0e45424ffc906585668776d5726b64f464a", + "setTargets(uint256,uint256)": "0x6b9adb82c7dca579c077378378d6545465281a86df1446c72ddf4c888f40e0b0", + "unpause()": "0xbc391e7298e7dfd01972421659778cab74ca955fb19fcd97709b550f86c1cc0d" + } + } + }, + "20230711-composable-stable-pool-v5": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool,uint256,address,bytes32)": "0xaadc4fc342b9d37032270d8adad7e12029667a841f7202b364cc1addd24a3ebc", + "disable()": "0x3dd110fd101a1be6115ceb811a85535de6c9c019360c7d67c022c48a3dd685d9" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0xa359b6BB0a89ED9f237C83f32fF05c658DA8b3aB", + "actionIds": { + "disableRecoveryMode()": "0x8f33b1eaf9e2f2523d32b89a23d1a83e1225eb96ef489fde9b81bc44c7e207c1", + "enableRecoveryMode()": "0x73c3332de64a6f7b137bea3255a221d779cc0f170ea4892ff0581faf799230ff", + "pause()": "0x04221c483f49fe794f5ce394e0ffc086722e106b9fef863610ccfbe1a019b997", + "setAssetManagerPoolConfig(address,bytes)": "0xe2baca23794dbc02728408bd1d35a1819f58f0e598d3c004e7b0429144b843da", + "setSwapFeePercentage(uint256)": "0x22627da2e7670aed1292420d5f0a2a49a7bd5992e0aef001702aa3285b5979b3", + "setTokenRateCacheDuration(address,uint256)": "0xed896fdd237f2b79e8ae80a5e3432dbc85b53ff7a8ba91ea17ba7b2716aaee0a", + "startAmplificationParameterUpdate(uint256,uint256)": "0x86f2cd537c832d7823d7b51e7f52288e383427c8c41180561f0f8054bc216f56", + "stopAmplificationParameterUpdate()": "0x0c055dc6cd1d6558914ef49c536f751680f8c413a3563007992801443bcca7a5", + "unpause()": "0xd0d6f7e787daf1d2a410263e88c280721498432203c7bf5a5378158634cf6561", + "updateProtocolFeePercentageCache()": "0x9187594b83654bfb251ccb4533c48404ca136281c3729b90c69ddd0859e0cf18", + "updateTokenRateCache(address)": "0x498630c10c1b0dad33cc41f56c2186da11a12259cd4b65c8a5922a04c9e902a4" + } + } + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/action-ids/gnosis/expected-collisions.json b/balpy/balancer-deployments/action-ids/gnosis/expected-collisions.json new file mode 100644 index 0000000..814c16e --- /dev/null +++ b/balpy/balancer-deployments/action-ids/gnosis/expected-collisions.json @@ -0,0 +1,170 @@ +{ + "0x2c2d48381025f2538d3009c98716f7e89c28225a73559252433caa24330885fb": [ + { + "taskId": "20210418-vault", + "contractName": "BalancerHelpers", + "signature": "queryExit(bytes32,address,address,(address[],uint256[],bytes,bool))", + "useAdaptor": true + }, + { + "taskId": "20220721-balancer-queries", + "contractName": "BalancerQueries", + "signature": "queryExit(bytes32,address,address,(address[],uint256[],bytes,bool))", + "useAdaptor": true + } + ], + "0xd972b0ea55e93f1ad627c0b544d12659dfd52456acc8e7899690b6bebca50994": [ + { + "taskId": "20210418-vault", + "contractName": "BalancerHelpers", + "signature": "queryJoin(bytes32,address,address,(address[],uint256[],bytes,bool))", + "useAdaptor": true + }, + { + "taskId": "20220721-balancer-queries", + "contractName": "BalancerQueries", + "signature": "queryJoin(bytes32,address,address,(address[],uint256[],bytes,bool))", + "useAdaptor": true + } + ], + "0xf9d27f783f06c33f198165d11f500f70ae99e14c6624f234cac46e1fc1978bec": [ + { + "taskId": "20220404-erc4626-linear-pool-v2", + "contractName": "ERC4626LinearPoolFactory", + "signature": "create(string,string,address,address,uint256,uint256,address)", + "useAdaptor": true + }, + { + "taskId": "20220425-unbutton-aave-linear-pool", + "contractName": "UnbuttonAaveLinearPoolFactory", + "signature": "create(string,string,address,address,uint256,uint256,address)", + "useAdaptor": true + } + ], + "0xcf0b2b6798f0926a93b908e27f332cfe675625416f0bb92ba5eba0210e8862ad": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "claim_rewards()", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards()", + "useAdaptor": true + } + ], + "0x148bace62efe321c95bf0889b402b31e98d5fdcc6ab4cb39b8098228a82d5c7f": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "claim_rewards(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards(address)", + "useAdaptor": true + } + ], + "0x94551b28e4224ffdc70c9e7178f6ee9e48764fb50cf5635edd9bcf09d2df64c3": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "claim_rewards(address,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards(address,address)", + "useAdaptor": true + } + ], + "0xebd01fda981e6a2ce9baed03021c6bffe3678acf18bd69a03e20b91a8a7ea0f4": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "deposit(uint256)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "deposit(uint256)", + "useAdaptor": true + } + ], + "0x9b9e09750c8ed7d83806572801ddf623057c7e95ec15c1ea36c0670827095bed": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "deposit(uint256,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "deposit(uint256,address)", + "useAdaptor": true + } + ], + "0x3b7c2782c806c66b41a98e6f998aa0056451d31e41d0f7d04238e0ed97a4350b": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "set_rewards_receiver(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "set_rewards_receiver(address)", + "useAdaptor": true + } + ], + "0x2fbeeab59a2e8b7f4a4bb0d5b80177b8aef087f0063d317953cc3b9b3512136e": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "withdraw(uint256)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "withdraw(uint256)", + "useAdaptor": true + } + ], + "0x9d575f62420250ec382e1e8e262ddae46d0d6817fab9fde48f9c6efd068e5844": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "ChildChainStreamer", + "signature": "set_reward_distributor(address,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "set_reward_distributor(address,address)", + "useAdaptor": true + } + ], + "0x9b9ebe5b6e53727fbefa2541e629822e72cd8c63c1e2911094b42bab112590a0": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "ChildChainLiquidityGaugeFactory", + "signature": "create(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGaugeFactory", + "signature": "create(address)", + "useAdaptor": true + } + ] +} \ No newline at end of file diff --git a/balpy/balancer-deployments/action-ids/goerli/action-ids.json b/balpy/balancer-deployments/action-ids/goerli/action-ids.json new file mode 100644 index 0000000..3cc0b3c --- /dev/null +++ b/balpy/balancer-deployments/action-ids/goerli/action-ids.json @@ -0,0 +1,1225 @@ +{ + "20210418-authorizer": { + "Authorizer": { + "useAdaptor": true, + "actionIds": { + "grantRole(bytes32,address)": "0x8ba5bbfc65500befee6f807951312220f05be14a619a4b27df3279d6d8cb23f7", + "grantRoles(bytes32[],address)": "0x710c9df8f02fb6ba4e287cf6e5eda74f97701316b4d1f21cc452a409cc13a88d", + "grantRolesToMany(bytes32[],address[])": "0x2ac259ac357403a0bc2af98019675dc6e2031c0d1a060fe7b706a93cf61647eb", + "renounceRole(bytes32,address)": "0x7cefce05d274ae00638cfb5ca5ff0d25243084c3ab8b9111cb0e80a845a97e33", + "revokeRole(bytes32,address)": "0xa69c55a3bf33c36d1357b5d2dd820ceb8f29cb3a5c638478e3f55ba7b541670b", + "revokeRoles(bytes32[],address)": "0x913325e9b0c6c2efad13fe52be9710339f381d205d9fca069e969199a54a90e4", + "revokeRolesFromMany(bytes32[],address[])": "0x6f5f9c958c69e30e37cb2f5f51d57cb07a4fe4ac1075c7632d4f4d5c1f5bcb76" + } + } + }, + "20210418-vault": { + "Vault": { + "useAdaptor": false, + "actionIds": { + "batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)": "0x1282ab709b2b70070f829c46bc36f76b32ad4989fecb2fcb09a1b3ce00bbfc30", + "deregisterTokens(bytes32,address[])": "0xe4f8ff74aa05a4d54a06e035d5e86947bc6474f8d7b166ebeb49fc9178d28551", + "exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0xc149e88b59429ded7f601ab52ecd62331cac006ae07c16543439ed138dcb8d34", + "flashLoan(address,address[],uint256[],bytes)": "0x96ebe854ca6ab6242ad127dcd7809576513b0c64571e515cedd7b8885612c82d", + "joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x78ad1b68d148c070372f8643c4648efbb63c6a8a338f3c24714868e791367653", + "managePoolBalance((uint8,bytes32,address,uint256)[])": "0x7275fb98594b03dc36a7de69051058e9e2d05cabeb4fe7d9c87bc69f94d9d084", + "manageUserBalance((uint8,address,uint256,address,address)[])": "0xeba777d811cd36c06d540d7ff2ed18ed042fd67bbf7c9afcf88c818c7ee6b498", + "queryBatchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool))": "0xf5f701b3adfba2adad8f16a8be5a989593e42a2caa84c5c6e60b22143db65a2f", + "registerPool(uint8)": "0x956dfce4343a6be4df20714d3dc413ef59e73fa9995d3d247e7c8d12efd33ac2", + "registerTokens(bytes32,address[],address[])": "0xad5bd4a1cc4243b4d772a8a55d24792c1f57cc45eb97ed1291b82d96125a7626", + "setAuthorizer(address)": "0x1cbb503dcc0f4acaedf71a098211ff8b15a220fc26a6974a8d9deaab040fa6e0", + "setPaused(bool)": "0xb5593fe09464f360ecf835d5b9319ce69900ae1b29d13844b73c250b1f5f92fb", + "setRelayerApproval(address,address,bool)": "0x0014a06d322ff07fcc02b12f93eb77bb76e28cdee4fc0670b9dec98d24bbfec8", + "swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)": "0x7b8a1d293670124924a0f532213753b89db10bde737249d4540e9a03657d1aff" + } + }, + "BalancerHelpers": { + "useAdaptor": true, + "actionIds": { + "queryExit(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x5ebb8bfc522fa6935093a8b6c35c25bd39a718b98465894011d4dc7d7b7dc96d", + "queryJoin(bytes32,address,address,(address[],uint256[],bytes,bool))": "0xdf491e1a1e1bc79886250d28697a9c09f85b669975a7a2e2b953b87132a3d1ae" + } + }, + "ProtocolFeesCollector": { + "useAdaptor": false, + "actionIds": { + "setFlashLoanFeePercentage(uint256)": "0xbe2a180d5cc5d803a8eec4cea569989fc1c593d7eeadd1f262f360a68b0e842e", + "setSwapFeePercentage(uint256)": "0xb28b769768735d011b267f781c3be90bce51d5059ba015bc7a28b3e882fb2083", + "withdrawCollectedFees(address[],uint256[],address)": "0xb2b6e48fa160a7c887d9d7a68b6a9bb9d47d4953d33e07f3a39e175d75e97796" + } + } + }, + "20210418-weighted-pool": { + "WeightedPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address)": "0x553514603e6f49137e025fc39b50f1240867c86f519db2bdcf67fb99e44d6794" + } + }, + "WeightedPool2TokensFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256[],uint256,bool,address)": "0x6610cfaf6ddccbc230415504a18ea3a0a1a4752322216aceb43cdc73d9ee1172" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0x0C3A264adb2D95e077277867ACc03320224c6b09", + "actionIds": { + "setPaused(bool)": "0x3c7de1d8a207c7901ec612f9f0f50957da016911a50d5c22bbe5c9f4f3392d95", + "setSwapFeePercentage(uint256)": "0x3697d13ee45583cf9c2c64a978ab5886bcd07ec2b851efbea2fced982b8f9596" + } + }, + "WeightedPool2Tokens": { + "useAdaptor": false, + "factoryOutput": "0xd0E43C99C05271Fa9FDF82281d4d1831A47BE81f", + "actionIds": { + "enableOracle()": "0xe543cb443264aa0734939fa06d9e6ade81d691ee5f27c2183c2a54a2c245c8b1", + "setPaused(bool)": "0x43f20c0b0ba9191edc765615b4aa9f5fc68be74185b79f813946e7bc9a9e1e38", + "setSwapFeePercentage(uint256)": "0xc065d550fa98abc242b6baf98e7b2063590675f1ddd81bdb9ea8d8f5c5d52f98" + } + } + }, + "20210812-wsteth-rate-provider": { + "WstETHRateProvider": { + "useAdaptor": true, + "actionIds": {} + } + }, + "20211202-no-protocol-fee-lbp": { + "NoProtocolFeeLiquidityBootstrappingPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address,bool)": "0x74182feb84818a2d0e5ed316275ae31631bdec6ce38492398affc4c52dec36cf", + "disable()": "0x73e484d8e6be4efe276f7962b312ac5e45277aa362fc0d67328aa643b5c8086b" + } + }, + "NoProtocolFeeLiquidityBootstrappingPool": { + "useAdaptor": false, + "factoryOutput": "0x90e492526C6885cb2D590eBafA07c3019d6A1A75", + "actionIds": { + "setAssetManagerPoolConfig(address,bytes)": "0xdb50cedbf0ddc4ef72d518659cb159bf10ef522022ddbd825468983b19d1437a", + "setPaused(bool)": "0x6bb77cd0f0aa0778bb18405dd81ba0dd36cfef9e0301ea97fcfa0d435f0c68e5", + "setSwapEnabled(bool)": "0x5d8292fc016fe02f403fc3a6897dc61b7b8aba97a3aeceac08d6950b8fc173b8", + "setSwapFeePercentage(uint256)": "0xef1485f9a4af8ef0d73feb5ce04b051a221042628d7b821cd55883e8accaa62e", + "updateWeightsGradually(uint256,uint256,uint256[])": "0xdeebad052cf52de2fc4a7776c135c36a8d8ada1d46a3bac6ff5722dea8c17f8d" + } + } + }, + "20211208-aave-linear-pool": { + "AaveLinearPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address)": "0xc656e762de524a52243bd0ad98fe0208a4b763e5b3406a525dd47ba8814c5e88" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x0595D1Df64279ddB51F1bdC405Fe2D0b4Cc86681", + "actionIds": { + "initialize()": "0x6775aade681eea3d902e337fd36cdf57bae34dac83ca8ed54c8d60ef42012e97", + "setAssetManagerPoolConfig(address,bytes)": "0xce9b4d2a8fa10e886bcc3a77c1fa4e9e395121b798ed40aa027f89cac3b9bedb", + "setPaused(bool)": "0xc4cc1f53624401aef9ff12039064be1c58b80580c5bec31c74a1ce6efadb15df", + "setSwapFeePercentage(uint256)": "0xc98899fd145316b968d8b13b11e6586b23aa92f0f00143e4920f9d9ab48f3b4b", + "setTargets(uint256,uint256)": "0xb3c34850e7016d8e3b6826031a24842d1f03ab9967b22041811a9e8b4cf46373" + } + } + }, + "20220325-balancer-token-admin": { + "BalancerTokenAdmin": { + "useAdaptor": false, + "actionIds": { + "activate()": "0x193789981465ebf36f4c335742c2f7d5eb973fae73b724abe4efb1677f374ba7", + "futureEpochTimeWrite()": "0x943003ac6b598ee44fb8d3ad6e99ce0d7656925772b6dc14e875a44e3206cffe", + "future_epoch_time_write()": "0x97b62f91f349df5e8b27c372c4f38eea910238e1f1105d9964d28cc47846afc9", + "mint(address,uint256)": "0x2315d78651468c46e4eb3cfca481a165fc94d355f1e38cb4e8c60fefdda8f86b", + "snapshot()": "0x96133dcf4672458fd010cde802d2f7f1fd5117d5bee5b993848b76059a4d205c", + "startEpochTimeWrite()": "0x9f94d4ba51d86a156ed0b444dd55c1e039180c1337671761af4a4c3896b7e87e", + "start_epoch_time_write()": "0xad288e6a19cb5f8a9cd2a1a2d199feb75af8fa2110d53c6fb30863401a8a75fa", + "updateMiningParameters()": "0xe40530cec7bcde930e3187dc3df3cb3aa749cf2a92d38738213ab8df46946975", + "update_mining_parameters()": "0x8e9993ffd4c8e77cc364583afe9088f0cb4a7bc34fc13d1b5e1a0da3d7e6b28b" + } + } + }, + "20220325-bal-token-holder-factory": { + "BALTokenHolderFactory": { + "useAdaptor": true, + "actionIds": { + "create(string)": "0x8ef8081bd06db2bfc78e1e67af0cb004036b902ad9c2d10b5a696acbe270be0e" + } + } + }, + "20220325-gauge-adder": { + "GaugeAdder": { + "useAdaptor": false, + "actionIds": { + "addArbitrumGauge(address)": "0x15b9b1632a6b213be2605774ec758d803ccbe6ccc63890b9c8d9db4919b52832", + "addEthereumGauge(address)": "0xce5365a1997f2bf34c1961ac02d4bf6ad23b9f44d4c14a217a4df348b0dfd4cf", + "addGaugeFactory(address,uint8)": "0xdbcad6167c0de7d6b6601c1dec0842ba362d74ff873f057e4af1cb5d1c096661", + "addPolygonGauge(address)": "0x809e834888be70d2521a7587ac1e1a90868b67632c47eb9ad77aa1181d33adba" + } + } + }, + "20220325-gauge-controller": { + "VotingEscrow": { + "useAdaptor": true, + "actionIds": { + "apply_smart_wallet_checker()": "0xaab3dcbbea6d6ade649059061ed3e599f6af4ef510107e1f3907a073c1f09244", + "checkpoint()": "0x7f4b0536efcbd917495f0d8e7a96852c08739243c797e73f00d32999233f8d5d", + "commit_smart_wallet_checker(address)": "0xb357d920f52d1caea37751040434f434523732c5394aaf902b7fdee1e7337cd6", + "create_lock(uint256,uint256)": "0xb5a50fa68b4af681e8892835fe15dd41aed649b61142f9e872550b12f48b9a8b", + "deposit_for(address,uint256)": "0x02f66fb8783709215fbed8d53e800025fb47917f905c4152cf4f4f53164a55bf", + "increase_amount(uint256)": "0x4708d2822d4cd81d156ca623cb8032ebc0d2cc86f535a70746dcfccac26deee8", + "increase_unlock_time(uint256)": "0xdfbd56765f93f8faf37d2f4c0b1723e150a581cf990aeb18841849472eb27011", + "withdraw()": "0x2b3b4fa6a68df8b10d11d722fc647bb7df5f41961ef99e65186463a0412c89a0" + } + }, + "GaugeController": { + "useAdaptor": true, + "actionIds": { + "add_gauge(address,int128)": "0xf0a77343972ffaea6782864c7880d1cee9576736637f7702cb0a922223208118", + "add_gauge(address,int128,uint256)": "0xaf6651b82c68c85c61ca1ebbae0a7ef9e0ea7394dfdd74ee3b066be3b00b5bec", + "add_type(string)": "0xddcafee4026801d086053d165ec6a6104729fc0990d0ef6513cb2c418f390236", + "add_type(string,uint256)": "0xb799cbcaf2184ce1ba2d895a50758a4942b871e9db63344a532b545651d69536", + "change_gauge_weight(address,uint256)": "0xf4026bb29355fe5b78b8cfbcc14f402a288ec32f152c4ef7abb23bf2ca67588b", + "change_type_weight(int128,uint256)": "0x152991b33a10294e25bee98ea5904acd66ba104e55686c0e5c2b7c60c8b5587a", + "checkpoint()": "0x7f4b0536efcbd917495f0d8e7a96852c08739243c797e73f00d32999233f8d5d", + "checkpoint_gauge(address)": "0x9222904d993363242fb82e9166e87557923d80c49fb55fcbf9b5b2659ec951e6", + "gauge_relative_weight_write(address)": "0x79a751d9eaa29c9aaf62b80a3eead6047e15f6f2392c4d9e9881e60db248d27a", + "gauge_relative_weight_write(address,uint256)": "0xee4a24da697f47a8ccb011cf99ad2ec4cf7a870e0f9944f9776e45ca57e41460", + "vote_for_gauge_weights(address,uint256)": "0x9f5dca5b5309fa7b0f0ab1970f812a709b266b9a7a2ce5089e1b4df4c306d1d8", + "vote_for_many_gauge_weights(address[8],uint256[8])": "0xc9b96f244387eba60f5c3e0ac657db04edd7cb29107cbb4400d2d156b7674911" + } + }, + "BalancerMinter": { + "useAdaptor": true, + "actionIds": { + "mint(address)": "0x8b517abef27225c5a0156eb4ea4027efa8c5fc7439b7c367534c0a4b21092b05", + "mintFor(address,address)": "0xc26b5a60a76f1df0dbb80baa1980d47d45fd61ee9320e336a833c9a928954a63", + "mintMany(address[])": "0xbf22b95498b441335acff6811e08a748ae377c63961d3f3fcfa40e13f99e738e", + "mintManyFor(address[],address)": "0xcf4e3f88f75cbbd4a9cae04907db8c9cfb435625419018d86f307dc7095a2527", + "mint_for(address,address)": "0x65402c88baf19eecbc13cdea2b377d3170bf5f6e31a84e4bf1d40eec17c7c4f8", + "mint_many(address[8])": "0xff37e2f51d99b98f9d1c6b0be6622f04c44f3b0655b53c581293bd88a245b8be", + "setMinterApproval(address,bool)": "0x6e49795d90d3b89052b94c6666b212117bb1d93d2981eb5410890112a3d3749b", + "setMinterApprovalWithSignature(address,bool,address,uint256,uint8,bytes32,bytes32)": "0xcbc9b7cc2b7fe1680077403c942f4666873f1c4d6499a1fe317aeb83fb4ed339", + "toggle_approve_mint(address)": "0x5047de1a225272ac18d8733ead13bf640fc94eea053e40352e5317d00ac89bfc" + } + } + }, + "20220325-mainnet-gauge-factory": { + "LiquidityGaugeV5": { + "useAdaptor": true, + "actionIds": { + "add_reward(address,address)": "0x6b5e3750e9adcbd4a75428ed3fc6d2d3fc8a52866660ad3778d3f8c33108edff", + "claim_rewards()": "0x9f596268ae1d840bffec6468f35868d6215d48830f5874204b4b5202ce5f037e", + "claim_rewards(address)": "0xc13be6a0bc76228878b765dc039dccf7a203e1b54c277e6c95a0e2adfd9b9768", + "claim_rewards(address,address)": "0x09cd18211fb6b5f5d35da164c1377daca07134e29471154cc4b268e635fa98ae", + "claimable_tokens(address)": "0xffe7f3a303586ecf807e0b512726ae165966960a1c571c9436ecb471f34789f7", + "deposit(uint256)": "0x96ae016c0a4c7f47195543b71764c67ffad0660f500b0bd178dcc31c9c77c7aa", + "deposit(uint256,address)": "0xf36a7bb219d21dfa1e55054181e8d0374dd108d24388e03731dc0d19761caf80", + "deposit(uint256,address,bool)": "0xb11918b6dac9f6ee7f9177c880d2f5ecea0c1f851d6846a012c98497ba9d11ce", + "deposit_reward_token(address,uint256)": "0xf581c7883fb0a72e34d13610759cdc6995d495bfcbfd7982d6e4b67f468f54d0", + "initialize(address)": "0x2071350ff2da59d3371768c9d51c341a241f4f772ba140c4aa97f151f298f2ce", + "kick(address)": "0x30594774a65a20af0ab69e7818f2b44db4ab171122a118c23a469cca3fe91397", + "killGauge()": "0x38f12558087095621293389b35508390a03d17855b55b2394ce67b3c47d4463d", + "set_reward_distributor(address,address)": "0x75f03d945d74639aa78784e5071604aa86c170a9f4c32bdf428231d560be70b7", + "set_rewards_receiver(address)": "0xcfbfe4d78681a144e3340201137411eee3ad0d0d99dbf387f55f321dfefa2340", + "unkillGauge()": "0x5e7938ef4e6a59634c9800645277831eda1a30b5efd9ec55235154211f9e2941", + "user_checkpoint(address)": "0xdd1c1c3bdba9af83567a294b444bfa43351dee295bdd2fe01a4ea28465a1cd9c", + "withdraw(uint256)": "0x97c58aaa7f1baf7f9ed7dc75b801e1b130bb834fd9ddf7ea7e152c9ffed6c21f", + "withdraw(uint256,bool)": "0xfd3383566837d1fe48201add6079241ede290ac9131b6e2d44dd6fa38e636a4c" + } + }, + "LiquidityGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address)": "0x11dac6d73575cf704c874437f6e2742b10f0b3a8cb903c585bdc799cab66c457" + } + } + }, + "20220325-single-recipient-gauge-factory": { + "SingleRecipientGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address)": "0x11dac6d73575cf704c874437f6e2742b10f0b3a8cb903c585bdc799cab66c457" + } + } + }, + "20220325-test-balancer-token": { + "TestBalancerToken": { + "useAdaptor": true, + "actionIds": { + "burn(uint256)": "0x833298360476618944f718981ab233082f5122f9f3e9028d063809d504e88d75", + "burnFrom(address,uint256)": "0xea35ff98d1c3a6304506b6976bd524adba83876a266b3d15c973ca605c86e114", + "grantRole(bytes32,address)": "0x8ba5bbfc65500befee6f807951312220f05be14a619a4b27df3279d6d8cb23f7", + "mint(address,uint256)": "0x2f8ae2ff3357611bc1603bc81d37cb23ad7c0dde22b7dad5bb81b1abea83aa5e", + "renounceRole(bytes32,address)": "0x7cefce05d274ae00638cfb5ca5ff0d25243084c3ab8b9111cb0e80a845a97e33", + "revokeRole(bytes32,address)": "0xa69c55a3bf33c36d1357b5d2dd820ceb8f29cb3a5c638478e3f55ba7b541670b", + "snapshot()": "0x7fdde278d798123eb8002ff80fdbd62b93c3e60a5d2c10041e06e4b9acd8c551" + } + } + }, + "20220325-ve-delegation": { + "VotingEscrowDelegation": { + "useAdaptor": true, + "actionIds": { + "batch_cancel_boosts(uint256[256])": "0x883f26e95df579fa682d038f27522a17d874346c18d9dbe2d502ef473e726580", + "batch_set_delegation_status(address,address[256],uint256[256])": "0xedd0ebabd9c0f1fa41a6d2054310ecb3bad17c3e576b34d1f7248e69281d37a9", + "burn(uint256)": "0x833298360476618944f718981ab233082f5122f9f3e9028d063809d504e88d75", + "cancel_boost(uint256)": "0x2b026cd495c98dd35b33bd5be496f7c57cba766b8fa2832ba428190d5d54395c", + "create_boost(address,address,int256,uint256,uint256,uint256)": "0x9e114ee25688c62b328b4af834f05fdff86eedde0d647e798ef48714279af25e", + "extend_boost(uint256,int256,uint256,uint256)": "0xddfb0ba9a402842551fa67e8f569543d4e9b070ca5395d6231f133f8bd940ea3", + "setApprovalForAll(address,bool)": "0x6b41b73de8753e4078cde2c682af18fea9a8d77a53d2ac78e22a3dfe521129e3", + "set_base_uri(string)": "0x78d5dd240bf6124d3e8e7c6918c9ebe9d901c97e695d2f9f58461fe1393c33b9", + "set_delegation_status(address,address,bool)": "0xb6ea2830f55c1f054aa739efb9bb246886c82431fed5d323d0ae7fe31c332ab9" + } + }, + "VotingEscrowDelegationProxy": { + "useAdaptor": false, + "actionIds": { + "killDelegation()": "0x3861c072d71f7edf2c9f007437f25c0ca70368b631ebef4b414ce2b5baedbf25", + "setDelegation(address)": "0x34ca00eedd53ffb79d208b3a006775f9adee47b8035872d5bf5b44660794e7b7" + } + } + }, + "20220404-erc4626-linear-pool-v2": { + "ERC4626LinearPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address)": "0xc656e762de524a52243bd0ad98fe0208a4b763e5b3406a525dd47ba8814c5e88" + } + } + }, + "20220413-child-chain-gauge-factory": { + "RewardsOnlyGauge": { + "useAdaptor": true, + "actionIds": { + "claim_rewards()": "0x9f596268ae1d840bffec6468f35868d6215d48830f5874204b4b5202ce5f037e", + "claim_rewards(address)": "0xc13be6a0bc76228878b765dc039dccf7a203e1b54c277e6c95a0e2adfd9b9768", + "claim_rewards(address,address)": "0x09cd18211fb6b5f5d35da164c1377daca07134e29471154cc4b268e635fa98ae", + "claimable_reward_write(address,address)": "0xb6174f5e6ff88de0909828998d663df5a46b9ff7e469b64f7a5006a77cfced7c", + "deposit(uint256)": "0x96ae016c0a4c7f47195543b71764c67ffad0660f500b0bd178dcc31c9c77c7aa", + "deposit(uint256,address)": "0xf36a7bb219d21dfa1e55054181e8d0374dd108d24388e03731dc0d19761caf80", + "deposit(uint256,address,bool)": "0xb11918b6dac9f6ee7f9177c880d2f5ecea0c1f851d6846a012c98497ba9d11ce", + "initialize(address,address,bytes32)": "0x09d6acb13dbd744865afb3eb8a3099a2c803dbe4813fcd7560562f92f6eeaa19", + "set_rewards(address,bytes32,address[8])": "0x7c4cf5a0ac6fc9276d27ebdc7332adc6fa710949dadde4209fb752001f83803c", + "set_rewards_receiver(address)": "0xcfbfe4d78681a144e3340201137411eee3ad0d0d99dbf387f55f321dfefa2340", + "withdraw(uint256)": "0x97c58aaa7f1baf7f9ed7dc75b801e1b130bb834fd9ddf7ea7e152c9ffed6c21f", + "withdraw(uint256,bool)": "0xfd3383566837d1fe48201add6079241ede290ac9131b6e2d44dd6fa38e636a4c" + } + }, + "ChildChainStreamer": { + "useAdaptor": true, + "actionIds": { + "add_reward(address,address,uint256)": "0x4c46ef2d11267c87a1bd5c957b5bab72957ad85e1e0250d36f461accd92a8d43", + "get_reward()": "0x6f10cad14ca89a2f6a5de012e24b76ae3a21c1062b847abf7c1542f39c3d305c", + "initialize(address)": "0x2071350ff2da59d3371768c9d51c341a241f4f772ba140c4aa97f151f298f2ce", + "notify_reward_amount(address)": "0xfd25808574944b94c1d869eed4f262e918e666eca0d337ee7a2cc9f146e8bc15", + "remove_reward(address,address)": "0x3daca63b7d8d897df0f4aa8ed320790890081c4eb4838a19756abb407e57e8b7", + "set_reward_distributor(address,address)": "0x75f03d945d74639aa78784e5071604aa86c170a9f4c32bdf428231d560be70b7", + "set_reward_duration(address,uint256)": "0xf8280426cc78d6ec08bfcf8ad3d308f093efd6068fd0e3ff8c6b9ea2eff45953" + } + }, + "ChildChainLiquidityGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address)": "0x11dac6d73575cf704c874437f6e2742b10f0b3a8cb903c585bdc799cab66c457" + } + } + }, + "20220420-fee-distributor": { + "FeeDistributor": { + "useAdaptor": true, + "actionIds": { + "checkpoint()": "0x7f4b0536efcbd917495f0d8e7a96852c08739243c797e73f00d32999233f8d5d", + "checkpointToken(address)": "0xad5cc01d75c9557c6761cedd6747cc49bf2bbee8a7e86e342e08ec8cce2d1424", + "checkpointTokens(address[])": "0x57588509fc9c7809dd451800137b52b71251b8f33eaefe0a4a20704d7a794d14", + "checkpointUser(address)": "0x63bc3bcd657781bdff8cf1b98efbb542ce506d17e769c801b781afed58711bfd", + "claimToken(address,address)": "0x00b4bd03de78c530508635a32da0ce07094513baf09fd6a44ad6f1a202115d41", + "claimTokens(address,address[])": "0x2456837bbeb6da646c6790300119cc05a25ecbf93c466b752edb2520e198bd37", + "depositToken(address,uint256)": "0x24a4418c40f7071f7d5c76dd936c391fea8819e36d109605e19363663622cb61", + "depositTokens(address[],uint256[])": "0x4721716053738fe68d3d5b293f1873c5f26f1a865cb53ccaa3f1527038428a7c" + } + } + }, + "20220420-smart-wallet-checker": { + "SmartWalletChecker": { + "useAdaptor": false, + "actionIds": { + "allowlistAddress(address)": "0x552cf8a9722ea54b6fc81eef9df54cbbb0bdd80c1bdacf23d965b7bf7bd9f431", + "denylistAddress(address)": "0xfa01325e2a9c77cda6b403aebfca7b8308d967df009e17ac6b42ba6d18088cfd" + } + } + }, + "20220425-unbutton-aave-linear-pool": { + "UnbuttonAaveLinearPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address)": "0xc656e762de524a52243bd0ad98fe0208a4b763e5b3406a525dd47ba8814c5e88" + } + } + }, + "20220513-double-entrypoint-fix-relayer": { + "DoubleEntrypointFixRelayer": { + "useAdaptor": true, + "actionIds": { + "exitBTCStablePool()": "0x4bb67a0b8e87539c0f4d27f93e5ee0007e614d3bb230bcb7672821d7a6359c05", + "exitSNXWeightedPool()": "0x431a1324309a102746dc2e80bd4e6a3337b549eeb3b667e88775fc99e8e7c0ed", + "receiveFlashLoan(address[],uint256[],uint256[],bytes)": "0x8e87e164a96f34e103e5e6bd84befdea379fe1f007f0929aba495fa057cad7c0", + "sweepDoubleEntrypointToken(address[])": "0x1551a07c7e1935f88645c168b758f3f2501555bb0e7871e3338e35c3e4d12207", + "sweepSNXsBTC()": "0x1b8c191c691887db7b20e77ce6c4b8a00c6c9f96129ce4069ab72171efe5d350" + } + } + }, + "20220517-protocol-fee-withdrawer": { + "ProtocolFeesWithdrawer": { + "useAdaptor": false, + "actionIds": { + "allowlistToken(address)": "0xd617925537850f2aa685c0571f7426668f2fc703728c1999c75cdf5feb9afa5f", + "denylistToken(address)": "0xba58dd9689420d7993c26c8eb0285e0c5ec4ed7d0b02ee4ca6fa3f05a38ee514", + "withdrawCollectedFees(address[],uint256[],address)": "0xaa5a0ba6d1f9627e6905842fe5a64690d039e96637fbf3530abd0960a03bf1a6" + } + } + }, + "20220527-child-chain-gauge-token-adder": { + "ChildChainGaugeTokenAdder": { + "useAdaptor": false, + "actionIds": { + "addTokenToGauge(address,address,address)": "0xe8dfb71fad50bca4fd4544a29f03fd3e427001d1f8a9dbee51fc32343c9c1565" + } + } + }, + "20220530-preseeded-voting-escrow-delegation": { + "PreseededVotingEscrowDelegation": { + "useAdaptor": true, + "actionIds": { + "batch_cancel_boosts(uint256[256])": "0x883f26e95df579fa682d038f27522a17d874346c18d9dbe2d502ef473e726580", + "batch_set_delegation_status(address,address[256],uint256[256])": "0xedd0ebabd9c0f1fa41a6d2054310ecb3bad17c3e576b34d1f7248e69281d37a9", + "burn(uint256)": "0x833298360476618944f718981ab233082f5122f9f3e9028d063809d504e88d75", + "cancel_boost(uint256)": "0x2b026cd495c98dd35b33bd5be496f7c57cba766b8fa2832ba428190d5d54395c", + "create_boost(address,address,int256,uint256,uint256,uint256)": "0x9e114ee25688c62b328b4af834f05fdff86eedde0d647e798ef48714279af25e", + "extend_boost(uint256,int256,uint256,uint256)": "0xddfb0ba9a402842551fa67e8f569543d4e9b070ca5395d6231f133f8bd940ea3", + "preseed()": "0xbb8b526e5ca65ae147d392dd6b66404f12dbd5e62051ea619824e92360275b33", + "setApprovalForAll(address,bool)": "0x6b41b73de8753e4078cde2c682af18fea9a8d77a53d2ac78e22a3dfe521129e3", + "set_base_uri(string)": "0x78d5dd240bf6124d3e8e7c6918c9ebe9d901c97e695d2f9f58461fe1393c33b9", + "set_delegation_status(address,address,bool)": "0xb6ea2830f55c1f054aa739efb9bb246886c82431fed5d323d0ae7fe31c332ab9" + } + } + }, + "20220609-stable-pool-v2": { + "StablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,uint256,address)": "0xb9085f0e152aa08e65a13143a0d934f7d75367ec7182f6a8235f5d8e384f304d", + "disable()": "0x77cdfcd3d960d401e3d568bff8b7f0945e31ae9641d0718ec4977ecdcdd1de88" + } + }, + "StablePool": { + "useAdaptor": false, + "factoryOutput": "0xD0202392E1D343F6044c948a0eD973C491D161bE", + "actionIds": { + "disableRecoveryMode()": "0xbeddcc61d9e74d16cd1a172a99da7cff352ca4cc12ae271195e47fb09850e92d", + "enableRecoveryMode()": "0x683d1fc164573282cc59a8ba6eeeb68e8398c46c49e9e9e7e27aca06030cebde", + "pause()": "0x246da17ee3fd3948c1af9b3a9aa78fcfd3c905a8e7c7de07bda9572a9567ee58", + "setAssetManagerPoolConfig(address,bytes)": "0xa6c469630ff877c7c4b3a5023afcd43729b665e3d51e1e3364c2761c6b5b8e62", + "setSwapFeePercentage(uint256)": "0xa4b44a665092a43cf7965604a301c38d259e053ca7917a1be72425addae34669", + "startAmplificationParameterUpdate(uint256,uint256)": "0xd348de02bc8575a84039df39b780b2b21a7f1f6c668a3d85b645d41c426babe7", + "stopAmplificationParameterUpdate()": "0x34b97f18db593fe163b694d4d4333ee5fde2759fe37e38ac0e001a2632d7b398", + "unpause()": "0x8fa2dfb4e879ecc3216c9ccbd45d098da5652ee41c3f98806869abeab4ecd3a3" + } + } + }, + "20210624-stable-pool": { + "StablePoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256,uint256,address)": "0x794bd840339a1c990b9a4f6e185fce6b1a82904f0b0127b77d0a3f8feffb3f53" + } + }, + "StablePool": { + "useAdaptor": false, + "factoryOutput": "0x8364eA6F920Ff06f7a597f6A6152c251223fB2cb", + "actionIds": { + "setAssetManagerPoolConfig(address,bytes)": "0xad09bdb092b3512e52a52dc7ea75a0eb39b577a037660c57655a00c5ecd86124", + "setPaused(bool)": "0xda86fa4a38c7f383ebd81a303e824d5979bbc01f57ca9369b74fbab87afc72b0", + "setSwapFeePercentage(uint256)": "0x222bfa0d7fb7c5c5467fd2d519e734926f71419404b17a9c9b54c1f1cbf2766f", + "startAmplificationParameterUpdate(uint256,uint256)": "0xb080e8681b82d9fcb9f50cc2d4f5ed5c81dd37d0c8492d93d3c506a7d625abf8", + "stopAmplificationParameterUpdate()": "0xf6a47f36895b547c6552082e4da70c3b8b0eb7a50755493e4828dab4b2a3ec69" + } + } + }, + "20210721-liquidity-bootstrapping-pool": { + "LiquidityBootstrappingPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address,bool)": "0x7a40642f67b694d37b10a810e0b2d4c42313813165bf202e9bdb71bb3cca5bc1" + } + }, + "LiquidityBootstrappingPool": { + "useAdaptor": false, + "factoryOutput": "0xb429eEE04808Cb51f539Fe74F055d45E662dD9CE", + "actionIds": { + "setAssetManagerPoolConfig(address,bytes)": "0x1cb132887c2b1ee82da38549caae798afbd067c4d2c146da4b065abbe544eccf", + "setPaused(bool)": "0x84ebcefe0a3d3211be33d8801f0cda0dc27c320e669b8020d36581ea279c2294", + "setSwapEnabled(bool)": "0x1d268a3eb97033208d002651cce851560d6e27ce495fafdbebac62fc55249acf", + "setSwapFeePercentage(uint256)": "0x17fabf3201a9ff4905ae768b3633b6b0899aa03a7f9091cbfe45af557612a9f0", + "updateWeightsGradually(uint256,uint256,uint256[])": "0x10d7bcb2d08a83726edcefa148437ad55df68f4cc8d29bea9121888f6c1013e6" + } + } + }, + "20210727-meta-stable-pool": { + "QueryProcessor": { + "useAdaptor": true, + "actionIds": {} + }, + "MetaStablePoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],uint256,bool,address)": "0xdaab595e43b5343677253fb0d4ea761620a702db2aab66342773b049b3ad0954" + } + }, + "MetaStablePool": { + "useAdaptor": false, + "factoryOutput": "0x945a00E88c662886241ce93D333009bEE2B3dF3F", + "actionIds": { + "enableOracle()": "0x896b1fdfbf4ad21b8d3b2b72755e7ac26498307bf4bc026f0491a6fabafc010a", + "setAssetManagerPoolConfig(address,bytes)": "0x12f94bd1e2d92c10611a454e07ffe6c3e90f8e1635d10bb0d6e40df10fa65371", + "setPaused(bool)": "0xc26030c751c86fb6372212840e98cb124f7ad80b1309370c26d04722bd3f521d", + "setPriceRateCacheDuration(address,uint256)": "0x804a5282047da9b43b60827f13ce6a65f639c663b92195169d58c98f06149aea", + "setSwapFeePercentage(uint256)": "0xad271d10da9b2d314c802852c706d58b29594c78ac081c0fe0df01f88eeca4d9", + "startAmplificationParameterUpdate(uint256,uint256)": "0xb6a9ea08808a9c851e4b1899f8c56c94cb5c85e14e2a78beda0d8f5380ca4982", + "stopAmplificationParameterUpdate()": "0xcab38416c7fb4c0c4b5d43de2d9f4f196f7db9f02b12e195c83595b75949a998", + "updatePriceRateCache(address)": "0xbd13ada2285231b0bf51e02946a8c9da96fe60f4913a9dc971de349c5d6c6ed3" + } + } + }, + "20210812-lido-relayer": { + "LidoRelayer": { + "useAdaptor": true, + "actionIds": { + "batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)": "0xf8cfe4da20fdead56b4dcc26b8ebb085a59db568e035c21dab6d266cee06c0ad", + "exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x1906fa7fdb370035b30e63059006853aada444936b7c2c9cdf605dda100f55ff", + "joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x141ec2d4a7c598739ed20a1097f9debcaaa34fb265da4dfc198a5347b552937f", + "swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)": "0xc2e30dab98891b52c4d094c48478e241794b318388f13948ca3692f24767e175" + } + } + }, + "20210907-investment-pool": { + "InvestmentPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address,bool,uint256)": "0x780bfc7c9cb638183a57ff76e9599100e2d6adb37cc38b809bb635d6e7cc3623" + } + } + }, + "20211012-merkle-orchard": { + "MerkleOrchard": { + "useAdaptor": true, + "actionIds": { + "claimDistributions(address,(uint256,uint256,address,uint256,bytes32[])[],address[])": "0x5b482736dd21f8b831945ea6633c1b28ca89a6478e8dbedda8accf8e681c09e0", + "claimDistributionsToInternalBalance(address,(uint256,uint256,address,uint256,bytes32[])[],address[])": "0x4a584cc8161d6bb12d57fc4b18a18435eeb5beb3bbb432aaddba4e2c2319265b", + "claimDistributionsWithCallback(address,(uint256,uint256,address,uint256,bytes32[])[],address[],address,bytes)": "0xcf3112b96140a3f56bc986eef4944027a67446801cbe0d21cf52c34ca01e7f4f", + "createDistribution(address,bytes32,uint256,uint256)": "0x590ed97670263f09fca9d1c8c7fa3124455a8b1918a4e74c78f642209c4a0c53" + } + } + }, + "20211208-stable-phantom-pool": { + "StablePhantomPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],uint256,address)": "0xb91ea0061e7815276c946c6c988ad8ae1d57c647f69c0b882ac35fc7759f97b8" + } + }, + "StablePhantomPool": { + "useAdaptor": false, + "factoryOutput": "0x13ACD41C585d7EbB4a9460f7C8f50BE60DC080Cd", + "actionIds": { + "setAssetManagerPoolConfig(address,bytes)": "0x6f3696a648da77a5479b71ddae746227c5f2a53c52351f64a143ac54d9aa0d85", + "setPaused(bool)": "0xe7db5dbdd6d346c339f945160cf3072726aa236fae72acc8b2faa9a7103a7f55", + "setSwapFeePercentage(uint256)": "0xf03f038e802d9001e1137114c3b515597399ce4967521cf034f35dbfba0c859f", + "setTokenRateCacheDuration(address,uint256)": "0x9d409791f3d7a5d09b8b50b4b38c524f6deef6afbe7dab9849d9286a65af6d0a", + "startAmplificationParameterUpdate(uint256,uint256)": "0xc48231c2c77c8abbff54a6bbdadf6bd0d6f045f49e297f48e2f992827e9c85a6", + "stopAmplificationParameterUpdate()": "0xfc9ed17b8caabb1c88c30e8f1a450f58387ddfe2e05dc2f9a97a907188e8cb06", + "updateCachedProtocolSwapFeePercentage()": "0x4890db536f242ac2d820e90ae431a3fda21253668fee81180e682cf0ee0635d7", + "updateTokenRateCache(address)": "0x221b98d4f1e57111067e7bb170cc147671aabbccdc71221be0a242a422c2f59c" + } + } + }, + "20220421-smart-wallet-checker-coordinator": { + "SmartWalletCheckerCoordinator": { + "useAdaptor": true, + "actionIds": { + "performFirstStage()": "0x2d1d4edc9a58a12384cc67f67380d836276f917640a875c51c38dd00e99ce743" + } + } + }, + "20220707-distribution-scheduler": { + "DistributionScheduler": { + "useAdaptor": true, + "actionIds": { + "scheduleDistribution(address,address,uint256,uint256)": "0x73d1abbe8fdc1eada717f73299f34b7217a71930114175a6cede25a4735d27b6", + "startDistributionForToken(address,address)": "0x5b56750a9db9bac83e09e56bb50b0420b86c5bb5255075f7d616ce3700ef771a", + "startDistributions(address)": "0xc0b53b0850f307966f922a3dd4dfa9956a28f9db59b76735e38aacf43b63b35b" + } + } + }, + "20220714-fee-distributor-v2": { + "FeeDistributor": { + "useAdaptor": true, + "actionIds": { + "checkpoint()": "0x7f4b0536efcbd917495f0d8e7a96852c08739243c797e73f00d32999233f8d5d", + "checkpointToken(address)": "0xad5cc01d75c9557c6761cedd6747cc49bf2bbee8a7e86e342e08ec8cce2d1424", + "checkpointTokens(address[])": "0x57588509fc9c7809dd451800137b52b71251b8f33eaefe0a4a20704d7a794d14", + "checkpointUser(address)": "0x63bc3bcd657781bdff8cf1b98efbb542ce506d17e769c801b781afed58711bfd", + "claimToken(address,address)": "0x00b4bd03de78c530508635a32da0ce07094513baf09fd6a44ad6f1a202115d41", + "claimTokens(address,address[])": "0x2456837bbeb6da646c6790300119cc05a25ecbf93c466b752edb2520e198bd37", + "depositToken(address,uint256)": "0x24a4418c40f7071f7d5c76dd936c391fea8819e36d109605e19363663622cb61", + "depositTokens(address[],uint256[])": "0x4721716053738fe68d3d5b293f1873c5f26f1a865cb53ccaa3f1527038428a7c", + "setOnlyCallerCheck(bool)": "0x2a0fc3ce2c92fc37ba51c3aef11d928dcaf3488be8978d243a8b84e6e980a504", + "setOnlyCallerCheckWithSignature(address,bool,bytes)": "0xa09ee85edd2695bd611eb6941808ca62eba50b0cb60778cb30ddb57edafc3415" + } + } + }, + "20220725-protocol-fee-percentages-provider": { + "ProtocolFeePercentagesProvider": { + "useAdaptor": false, + "actionIds": { + "registerFeeType(uint256,string,uint256,uint256)": "0x57d35b2b35f2327f31e3eb2ca76e6cfffa8b460b1504edfba7b5954bad1d364b", + "setFeeTypePercentage(uint256,uint256)": "0xb83d1e9cbef2b3d9321c1d0eb607a8f868eddc97d838926a6697e122b9aad078" + } + } + }, + "20220817-aave-rebalanced-linear-pool": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address)": "0x527e5a8917fef9f19f55ea7d3f9dc98c00e4836cf918d2af144d2ef91076a53c", + "disable()": "0x9f637c196de3124bc0febbb78f206994fdb68c3f8fe8070b42230a76e14ece0b" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x07c896050dd6e273c199f06d7516f8a4a369d23a", + "actionIds": { + "disableRecoveryMode()": "0x4b0cfb0e3afde1903ef88f0072b490a0d78f1027a165371b1b4732daa84a9559", + "enableRecoveryMode()": "0xd6f4df0a512a29fa4cf2fcfbe4a0b5ea1266a4bbb1ab6fb5761205dbb038441f", + "initialize()": "0x44366ad56a4f1e6acffb39c514200785009a251154f813acbfd16509a492cade", + "pause()": "0xf5a74fe74a42c6fe47ddc84feffff02db467d464946b66b317ef6ceeb66bda38", + "setAssetManagerPoolConfig(address,bytes)": "0x20165844cf9e6c2a6f49b8a283d786c5aaa1d89c711042e31d2928eb36d23824", + "setSwapFeePercentage(uint256)": "0x49832d9b75ad868dbf821cf6ee67ab240ff87c62516d7ce788883fdb8845b215", + "setTargets(uint256,uint256)": "0x7385bbbac73cd47b216da5217f45cf50ec5653dd6951e8272421d5aa8ff94df5", + "unpause()": "0xa4f38ba3cf0b1b3ea8bc7b3022ecc6976c184fbbe48d5bebcde37f1c03640b19" + } + } + }, + "20220906-composable-stable-pool": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address)": "0x82bdfa752365d3f5126fdab4bf91428ce34d78238bbb6dcc11479dc4b2cdd194", + "disable()": "0x41955c8033f6cd7940ef6365ebd59154af32f4949507ebeee4a6ec0c4ee86a9d" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x0c925fce89a22e36ebd9b3c6e0262234e853d2f6", + "actionIds": { + "disableRecoveryMode()": "0xb4d3deece0ede04bab030f8d23f019a3a603d97e849e1ee1e6a58226843bb105", + "enableRecoveryMode()": "0x14acd584474527fd64f2d0319e73c6b85aea75f00fef393230b71b2ca64344e7", + "pause()": "0xaa58fe403eae929c93788a7b35d0b821be0e3d7fb1b7469ba994ab140ff8aaa0", + "setAssetManagerPoolConfig(address,bytes)": "0xf46c96e0536003e817b9102af0b219ac1a9c3afb2b70234d215edce7b694f0d0", + "setSwapFeePercentage(uint256)": "0x6c470f23b0e66e93b1358c5c49ff26bb81599d24618da6b357d0dbcb138af65c", + "setTokenRateCacheDuration(address,uint256)": "0x3b5d75a18af8f3a6a098229d075e6c9d526a4d4d0597adacacb74808b6092bae", + "startAmplificationParameterUpdate(uint256,uint256)": "0x4d3bafe842e5d8995399b89f432b92c6dfa2f2e810dd0b8d1998c51f5461dbb4", + "stopAmplificationParameterUpdate()": "0x40f06a635db341b3605b05dcdc9a500b297b2f51257ca302bb3daca2c8f25142", + "unpause()": "0x9b6f869dbf8d0c39da20c2af3c85f617c20e0b648cf1e5d42218eabd85b83529", + "updateProtocolFeePercentageCache()": "0x2912cd1592153135ebbc808951155de9d15270d12029160f7fef7296833556c2", + "updateTokenRateCache(address)": "0xfe713ec0738ce39b0b3b024d3413551c716f10d9a2769fb68c44bd609c0ae2be" + } + } + }, + "20220822-mainnet-gauge-factory-v2": { + "LiquidityGaugeV5": { + "useAdaptor": true, + "actionIds": { + "add_reward(address,address)": "0x6b5e3750e9adcbd4a75428ed3fc6d2d3fc8a52866660ad3778d3f8c33108edff", + "claim_rewards()": "0x9f596268ae1d840bffec6468f35868d6215d48830f5874204b4b5202ce5f037e", + "claim_rewards(address)": "0xc13be6a0bc76228878b765dc039dccf7a203e1b54c277e6c95a0e2adfd9b9768", + "claim_rewards(address,address)": "0x09cd18211fb6b5f5d35da164c1377daca07134e29471154cc4b268e635fa98ae", + "claimable_tokens(address)": "0xffe7f3a303586ecf807e0b512726ae165966960a1c571c9436ecb471f34789f7", + "deposit(uint256)": "0x96ae016c0a4c7f47195543b71764c67ffad0660f500b0bd178dcc31c9c77c7aa", + "deposit(uint256,address)": "0xf36a7bb219d21dfa1e55054181e8d0374dd108d24388e03731dc0d19761caf80", + "deposit(uint256,address,bool)": "0xb11918b6dac9f6ee7f9177c880d2f5ecea0c1f851d6846a012c98497ba9d11ce", + "deposit_reward_token(address,uint256)": "0xf581c7883fb0a72e34d13610759cdc6995d495bfcbfd7982d6e4b67f468f54d0", + "initialize(address,uint256)": "0x62b3306a4d33f7c60114b6dbf8749e7ee0ec4a87b35c306c79ea9f1fb3884650", + "kick(address)": "0x30594774a65a20af0ab69e7818f2b44db4ab171122a118c23a469cca3fe91397", + "killGauge()": "0x38f12558087095621293389b35508390a03d17855b55b2394ce67b3c47d4463d", + "setRelativeWeightCap(uint256)": "0x53ded5c23d686756f2cc6a8feb053e1a98ea78534f788670216e0617a9cf7101", + "set_reward_distributor(address,address)": "0x75f03d945d74639aa78784e5071604aa86c170a9f4c32bdf428231d560be70b7", + "set_rewards_receiver(address)": "0xcfbfe4d78681a144e3340201137411eee3ad0d0d99dbf387f55f321dfefa2340", + "unkillGauge()": "0x5e7938ef4e6a59634c9800645277831eda1a30b5efd9ec55235154211f9e2941", + "user_checkpoint(address)": "0xdd1c1c3bdba9af83567a294b444bfa43351dee295bdd2fe01a4ea28465a1cd9c", + "withdraw(uint256)": "0x97c58aaa7f1baf7f9ed7dc75b801e1b130bb834fd9ddf7ea7e152c9ffed6c21f", + "withdraw(uint256,bool)": "0xfd3383566837d1fe48201add6079241ede290ac9131b6e2d44dd6fa38e636a4c" + } + } + }, + "20220908-weighted-pool-v2": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address)": "0x37bdd9fd10ea417e3ee0432bc9931583470babbdfba7fb234832953f5b12c876", + "disable()": "0xa245b13df0295c1966c341598370ff2b6a9e83bb687351570533e2f2e01938d5" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0x3f829a8303455cb36b7bcf3d1bdc18d5f6946aea", + "actionIds": { + "disableRecoveryMode()": "0x57a99f3ed4c936dc3acc397e914c860702345856a9cca3a5be4c01fefa6a7674", + "enableRecoveryMode()": "0x83d23bd6c0e9f3f7ec0850008689e6079aa87b2f9766e7373bb3620222c3e0a3", + "pause()": "0x8861bb10ff289b57a4dd8aad423013bab2ba5baabf527453b7e5fe1078989c65", + "setAssetManagerPoolConfig(address,bytes)": "0x9f330840ebc2285574bb046c48056ab6c06da01e947ce9ebee468e7e4a6a2c3a", + "setSwapFeePercentage(uint256)": "0x17bd7cdcf8501c46510667aaa9187771e0d83831a3367ff4cf81c00eac71137c", + "unpause()": "0xbc2876200f27f600d66a842f0b3149abc29a5cab6ef63137d79db0036169107f", + "updateProtocolFeePercentageCache()": "0x5f506869a4e7d71cdd3300156e93255616486d8a28c659a096cac8055bdf1e6d" + } + } + }, + "20221123-pool-recovery-helper": { + "PoolRecoveryHelper": { + "useAdaptor": false, + "actionIds": { + "addPoolFactory(address)": "0x1ef9ebf17e6cb20013888ccc67c7738c82a57e350ff8b2f45c4034a1c4fe7a82", + "enableRecoveryMode(address)": "0x94a599a04a3486414f2bc16589657fbd9e89bad629c52c12eac47282134f4d57", + "removePoolFactory(address)": "0xc0752596453bbce0bf94d874591e784b93cce5a01db369dcc137bbf8f497105b" + } + } + }, + "20221115-aave-rebalanced-linear-pool": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address)": "0xb0b54e4779ff9a37a30b4c8b342d2544a1b686d0bec33f0fa9867694ba3a57cd", + "disable()": "0xfe2cd5cd940ba4eb7434d46a67dd8c75a40a0cbd6601421d2d8b2d947b971ef3" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x88D07558470484c03d3bb44c3ECc36CAfCF43253", + "actionIds": { + "disableRecoveryMode()": "0xd525025938a7a57846d1702e0fe6ad1abaeaa5fe5dcd1d90e47058c4983b7340", + "enableRecoveryMode()": "0xef27dca346aa51238760b94ff3180dee990313a7f12834aa759a17d597603a30", + "initialize()": "0xc0deae184afb6d30dd114541559768404f53574210d142305bb1df9c2d924870", + "pause()": "0x08a07a28943b9fd03d078571cc4b142bc18c8ec7e0556e4562620c6e49162b28", + "setSwapFeePercentage(uint256)": "0x9ece5ed53c8547cc53b3f118eb0f4eeda2744827f0b128b6007ac28c3ff5fc06", + "setTargets(uint256,uint256)": "0x913ac1c232c89aeaa0021e2344973cb498de977a10e2038e67cdc9e74674ef13", + "unpause()": "0x4b11bfc905756d063392a926d9089f9f44694030a746d780cb78ac07d19c4c46" + } + } + }, + "20221122-composable-stable-pool-v2": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address)": "0xb885d98b83d2e0ddc9cc87adabc0f64acbdac302d2545aebafdac0c52a43b892", + "disable()": "0x0a35dcf04fdcf4e2119802287b94a1cf758427e74e9bb450cb31af7c660d7735" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x373b347bc87998b151A5E9B6bB6ca692b766648a", + "actionIds": { + "disableRecoveryMode()": "0x85896342da44e8444ef54be6c4643b51c1e23270bb9ec1f0257cd03d72a80cb6", + "enableRecoveryMode()": "0x7d89412e7c8893c1c85589d68187b2ee925cd2d27c10393980897d1fa4346b0a", + "pause()": "0x6e25be22eb210da3359f4afb977d53109dad5ed4801e736bf6c5239e0028bd48", + "setAssetManagerPoolConfig(address,bytes)": "0x9036802291378e3a6933704d0ccba6f3c6729307d244cb77b7f84060cba99269", + "setSwapFeePercentage(uint256)": "0xdee20d81c6075dcc437dbaaf02d316ab255cfcae4a154e04b17abdebc70a5b48", + "setTokenRateCacheDuration(address,uint256)": "0x160a4f83bcc2f584446953fd8adf0bf96e625212ccf66900051418e8d19e7157", + "startAmplificationParameterUpdate(uint256,uint256)": "0xf766fa63021f6e696e70c339ab7246118c3da74fcbf80dbe6d603189209afed7", + "stopAmplificationParameterUpdate()": "0x1c36fdcc08f18f6fb33519d9491400a58c2c03b6f1222f8385cc36e6fb837110", + "unpause()": "0x09f210f1a6e3730856cd101645ba1c0594f63ca6ed48e7768b5421ae698858db", + "updateProtocolFeePercentageCache()": "0x69d8f3e0969c91e7a94fb45518733240410f56ff60cd304fbc5d13a5432ed71f", + "updateTokenRateCache(address)": "0x43e924739082162d0dfbe4b85270de4e7fe29526d812caeaa4797cf243c0bdfa" + } + } + }, + "20221021-managed-pool": { + "ManagedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create((string,string,address[],uint256[],address[],uint256,bool,bool,uint256,uint256),address)": "0x36109068009b7f32260b11e16b4afd875bba8106abcebb01b586994398dcc8c2", + "disable()": "0xec29307f87abfc2b5468e96f3e9ecae58a8b7eaeac6c2438d75b5b4c102cc918" + } + }, + "ManagedPool": { + "useAdaptor": false, + "factoryOutput": "0xD9Ab28c518d4696068b855fc17717557D6E43dfF", + "actionIds": { + "addAllowedAddress(address)": "0xebb5b3a5fd02268f4736a66bcbbf3721df3f5b372006279ad5c77f83e103c89f", + "addToken(address,address,uint256,uint256,address)": "0x75438eb08ffe3209d3dd3918c2bdf48f0cd9a85945611baff3dfaa269a488dfd", + "collectAumManagementFees()": "0xb41a45f365d70dc0206ef962577441d8a1089f42f78c7a9fb96342ed5f7a7de0", + "disableRecoveryMode()": "0xd43ce57fce2ecee7ffca8e84092b15d153c91551ec8c5c677cc99c34e783117d", + "enableRecoveryMode()": "0x58199586e9c814bc8a60c9440242a98f511dad4b59c2aed23ec9da86f24ef65e", + "pause()": "0x77a033e002c9343d8e1e18812e85314b318f32e1039892999c5595299f1497fa", + "removeAllowedAddress(address)": "0xaa6e9c8eea8f80573294bf9e437c533a43dc985406cf5e90626042d6b4af215b", + "removeToken(address,uint256,address)": "0x0ee5e5657f1b36a5ef1f9d2bf10b0f47e3ff526be1b5b11c1e538966e0e3a928", + "setCircuitBreakers(address[],uint256[],uint256[],uint256[])": "0x13fe49ce305f9bd89e60d9eeb79c37c41b0ef1fc10224c776e3552cdcc365e8e", + "setManagementAumFeePercentage(uint256)": "0x02838d192158d528ae623942bf89de5ba0c50ecbf75d5cdee38e2e81ed08ab0f", + "setMustAllowlistLPs(bool)": "0xf5ba992f2e1bf91b6ab292baaeb5879c0d55af9226fca37e4990a40351fd8d0d", + "setSwapEnabled(bool)": "0x31edfcd86d0943c1bb9ad319aab48d804ac014d74896cb41dc107f91838aa86c", + "unpause()": "0x24082d9cb013626c5cbd5fd595ba953d5bee10116f12ccc7ae344f5d7702f81d", + "updateProtocolFeePercentageCache()": "0x7e1e8e8d5d18fa0cc750aabcad2df52f3a1899713763c5b88da9d5b80a70b260", + "updateSwapFeeGradually(uint256,uint256,uint256,uint256)": "0x0a516eca843d8d05114311061c268d74a0923bd7a6abfdca24967fda9fceeea0", + "updateWeightsGradually(uint256,uint256,address[],uint256[])": "0xbe5c83706433ff5361b40487ccc9731baff0d2bfc130396db71f2675dd7c96ea" + } + } + }, + "20221207-aave-rebalanced-linear-pool-v3": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0x66ae022bf9cd31733e59061a50d0f7c627f6316bb1a125a0de9bf968a55d244a", + "disable()": "0x5fbddc7202e623cdbdd685c7efd9379e079b47c18aa57d1ee7f06424c4f28bce", + "registerProtocolId(uint256,string)": "0x79aaf5dc79fea0eb5996787d9dcce474973bc3296a94db1170ca6e510e31e83d" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0xf93F6382913d1dE6Bdf683A94be8349751af8d59", + "actionIds": { + "disableRecoveryMode()": "0xa2138fd02ccb24f485e2b6730611aa424e44226d4a5302a3dce8fed99ead1bcd", + "enableRecoveryMode()": "0xa9164f9bc0af1bdd3fd7ed013211e2975f1ece4db4b8412660e67359e1fd8676", + "initialize()": "0xe91a8e0abac7d1e2e3d83d3abd0b8aec9c8e9fee07dc7ea19c2c2ab095f4baea", + "pause()": "0xfaf3bbb73a6190f02f8b035396f60d6af2aa730caf5d733f0c1a20ed1d232106", + "setSwapFeePercentage(uint256)": "0x35f0c2eb9996a2af84245248608d5dd48a52efb632ef26a94d71f5ceea1b7cdb", + "setTargets(uint256,uint256)": "0xc5abc980dc391fdf92ccd45ecdcf65db31eebf2765211a6d7113c77c84dfbaf3", + "unpause()": "0x734b96f255027244606af8384c68f6cb6773f089519277c2dd148bf21954ab90" + } + } + }, + "20230109-gauge-adder-v3": { + "GaugeAdder": { + "useAdaptor": false, + "actionIds": { + "addArbitrumGauge(address)": "0x96ff38090d2ed548492395d6d0149ea5b4421d71c2c3dd10f72f53f9bd45edda", + "addEthereumGauge(address)": "0xfcfb808c20096983bc85ee3b5b6aed175602a6a4ce74fa3f8f5187d34e1dba1c", + "addGaugeFactory(address,uint8)": "0x219b248d5bf3753cd21b9c0b700dea1fbab4235f8ee8d24cf41d833855fec117", + "addGnosisGauge(address)": "0xde0e249fc4cfa4b6153b12a35c645045eebba9e4ffad25ef5b72def766c46e23", + "addOptimismGauge(address)": "0x1fce0291bd19b4d377ab0d460c7363482933f3590df476c894f7bc94f8f900b8", + "addPolygonGauge(address)": "0xa79af7d75bf50fe3d19ae8537f3df157b608a7a3cff6bda2d970fbba470642ba", + "addZKSyncGauge(address)": "0xb4cefe9458423ef44656096dc0d1d04cfecf3df24dea1e05657f4b43bea0296d" + } + } + }, + "20230206-weighted-pool-v3": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address)": "0x5e28c1305086eb84159df4390efc2031b79a164bc2dce3e3ae08912f41a1fa54", + "disable()": "0x1f8f892407c2cb710506d8998efcf8f6709b3c0fbbddfed6494ef08b7467c62f" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0x0441ff033652bcEB75a011887F17B5dfC84Ddc6f", + "actionIds": { + "disableRecoveryMode()": "0x8d501e77af020f32c1679f4cbfd314fb02b3cb069916ba4a9d8b9dad2c4bf9cc", + "enableRecoveryMode()": "0xb1f17616596b3d2360ad06581e2bfca70cca3e1c29f629cd084fded06c061fc4", + "pause()": "0xc7cdb62ccea4a22a57d639c10da71a67acbaf7ab46c4508d0b9ecad84205babd", + "setAssetManagerPoolConfig(address,bytes)": "0x8f83d4658182d88f55f863844d354ff089459aec8967c83322d138bac30b3149", + "setSwapFeePercentage(uint256)": "0x3538d6d3dc0a61e256b030bcede35dfb4204bbc36452180e2d2f940d0ad35be7", + "unpause()": "0x26f158f951bade88b1b53b08de02e8a553a783332a43b06978d7c529f886a709", + "updateProtocolFeePercentageCache()": "0x3d1afd98f503391601036f3534b9ddd56f305678f9e25c8aa18baf666389be67" + } + } + }, + "20230206-composable-stable-pool-v3": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address)": "0xa0499989f0045b6c8fc7aa496c2172b053d3ed15124eedca31749cd5e29f2ada", + "disable()": "0xeedf83fdf967029f62d13d9d9102d27946945cb008bf326edfe2a4592c901659" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x2EF26d97B5870600BE341561298938c2e5df84f0", + "actionIds": { + "disableRecoveryMode()": "0xaf6f022f37dc5e877be30d820627d3c8bf7fe467076034a41ec92048973ba002", + "enableRecoveryMode()": "0xd6ebed127862549c3db449781ac9e80864eb794442effd53919d1c5ff820c431", + "pause()": "0xa27840506d37dc29759e536cc5c1d9757e80d9b1fa5548a1ca8619f33dd1072a", + "setAssetManagerPoolConfig(address,bytes)": "0x3397020917cfa9dadcf1e507b781c53b7f77b174ed85b5b12748ef5a6ae46722", + "setSwapFeePercentage(uint256)": "0xcc0b4f1263ce5d036eaa02e2e29bda7414b593c3f42a8aed4ad6c916edc1a565", + "setTokenRateCacheDuration(address,uint256)": "0x9bd7a3ed9d1fced64087af0c4015b1ed7adf5a068a84bbb0feec2aa73024f533", + "startAmplificationParameterUpdate(uint256,uint256)": "0xfa32fb6e69279c6a1376f910c7c71838dc2fce1ec3bab7d3b9580cdda3c70eae", + "stopAmplificationParameterUpdate()": "0x3a387b28ebb63c0b53c39cce6d9918e762408048d3f949a2f3f81c25805b7b61", + "unpause()": "0x8915665f458a61f28f8e8cf59a52457488207ba6b382536b63658892be082d27", + "updateProtocolFeePercentageCache()": "0xde0657f7ba5c70047b0aaead98b8ba2a9e3160a58febce65cf2406a531840658", + "updateTokenRateCache(address)": "0x1ff1e5781eca58df974b1c8ea055acf9aafd9a575d86b65afd7017c0bb89e9f5" + } + } + }, + "20230206-aave-rebalanced-linear-pool-v4": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0x48f384189ad09bc72945f9af0c3b9f0347149e0cc1698904ded7d0a043bac23c", + "disable()": "0xa676b10c0a312087e255fee5692d8b31aec2a0839a91e715a43860c3e62437e3" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x707B7d4a1bAe449d546DCAb869256591bbB3d70b", + "actionIds": { + "disableRecoveryMode()": "0x478e7f53087deab85ae5870218c02821a6bafa4a75984797ac58cdfd513a385b", + "enableRecoveryMode()": "0x793ca26aa62caae6b2fb946bce982e9d0448354abd818cabb58abd0d04a3ef03", + "initialize()": "0x2f65244978100209132b815e50c31fb1116667e93713f55d82aedcd053b8d5e8", + "pause()": "0x21e53d020b912764bb3a437d64ccad86ad4b36334ab4933c92b4f7e20ec74c34", + "setSwapFeePercentage(uint256)": "0x60b21b2ae5a82434b74afd79abbbafb941197b06237922de3a54d36aaa9c4ea2", + "setTargets(uint256,uint256)": "0x5f3bf9f13d0ced5f0a2e95b2b3895ea54fd785018a8c284129c0ca862ac51bf7", + "unpause()": "0x48f45ecf6661caac6ac47a9195afd122325e5c7c3a348b20948083d9cd1b0bcf" + } + } + }, + "20230206-erc4626-linear-pool-v3": { + "ERC4626LinearPool": { + "useAdaptor": false, + "factoryOutput": "0x744644537fB1AE7c4E05f6331e87126b4fd0C325", + "actionIds": { + "disableRecoveryMode()": "0x06b7e2ee35c184ec6fc790912c087b6d9ca6d0bb75bda506568437dc6e6906c5", + "enableRecoveryMode()": "0xe25045acabc1abf552c0dcd5018fd13e7cd8ba949462b700ceabe8994a1942f2", + "initialize()": "0xf513ceff2e109bf22a62c196933d2048ea4d6a736e02ddaa5d09426a10a19474", + "pause()": "0xb0f6c2862da36ce80cbdffb9b2cc00cdf582633cbdcfff2eb7e5ea8ecb01f875", + "setSwapFeePercentage(uint256)": "0xf21b4e33d4cdfde631d197fa55d249e1e60035e6c7c1df2370cd3fa1fe41e9f6", + "setTargets(uint256,uint256)": "0x8f4878c45f4fba971d7fd1b02d4587955049fd8aee388759a193b12e7ff19066", + "unpause()": "0x8b0f2658689375e62ca1acd8177fbc7757b85a060ab63014ea26c212e77d5d50" + } + }, + "ERC4626LinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0x5b6e6eaf9f36e041c0c1be0b258184112efa5b5204373e0e5c0adc8bde30cc5d", + "disable()": "0x08838cd8bcaa0749135876e6c07b6cf8b2b17d7651bc27d72118789d159d30a1" + } + } + }, + "20230208-euler-linear-pool": { + "EulerLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x43Fa2c00419F60e18966Aa043DEBd4701CB91B6d", + "actionIds": { + "disableRecoveryMode()": "0xcdbdee0d8755700385092bfc71468577a3f4d92e90eee08906454441eeb69625", + "enableRecoveryMode()": "0xbc3dae38c30f2686b160e7154a2d649e84222b9f9de4e3347380cd82f23771ad", + "initialize()": "0x16bdb45b2542c68f7b6fc8bb4475e011135821deaa7baee5b7933094f1af1073", + "pause()": "0x92740abcb256f64824759ca687fc8af1a6ba7900e201545f9b848d3e3daab488", + "setSwapFeePercentage(uint256)": "0xd41187a1d52918991b8e886e7e02dadf9f3899ff8134eaa5aa4e8f6a81dec3ab", + "setTargets(uint256,uint256)": "0x2c7bba59983418a55126cdd07a69d73a710ec5fa3366f5b12c369de97d43492e", + "unpause()": "0x3bd06a773652f06ff2bc008fa41cc79cc7028608b1c1d40254e0f441525e3b43" + } + }, + "EulerLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0x11873d44400e1fb523b61bf4042b8a4ebeaa4c2e16b1f7e38f03fc98ec187442", + "disable()": "0x3dcf6c9d1f7bcff6477a09e1a18ca76f56c83f7e055276096a5acdd3c24f022a" + } + } + }, + "20230213-yearn-linear-pool": { + "YearnLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0xb7b05836f6e2b6819026a3cc378e9ecab328e20f1caf2bcf209bc88058fb340c", + "disable()": "0xef0b02567a2c8640ef6b24a660c53d6549379176a38d7642297a26e4839aa8da" + } + }, + "YearnLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x6d2b8b4eba8ac88f8467d84be010d344bfbd90e2", + "actionIds": { + "disableRecoveryMode()": "0xd0fe29c5a1928591e7a5b135e73737eb51459c26c2c260c05addf7feab45aba2", + "enableRecoveryMode()": "0xc289bdc3ef3cd8006b0682c433d7da4afdc49f3349826aa86f0aee57609a218d", + "initialize()": "0x05233f004c0bf6495b96fbc293c804e64dec693adad2e71a067e34580f2124eb", + "pause()": "0x30f02fd4cbabd8bf847e2982d3a7b94f05897221ae344bb5ab44eccc667168d9", + "setSwapFeePercentage(uint256)": "0x83cbde74029c92eb4c584f3030d65fe81f90da484f5b48378368701837b8c2b8", + "setTargets(uint256,uint256)": "0xf63145480b94f72029c40ed5d1c4b0ae95c6c12c320091401c878daffcce09ca", + "unpause()": "0x83bcfaf42b92fe4feab39595778058da856aed7dccb6e0f6a8224a99367467a7" + } + } + }, + "20230213-gearbox-linear-pool": { + "GearboxLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0x600eb93b43e029e57b4811d227627bc84ced59cbb9b017220301f8fb9b0bf7f7", + "disable()": "0xa58dda9de18631d652109124d2a3cad89a4e4dadbdb8f15187ddda657f63650a" + } + }, + "GearboxLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x007e1830bcc05039c3926d6478f6b2912376e52e", + "actionIds": { + "disableRecoveryMode()": "0xfbb6d43a1a4b8f9e7e927d65ce8428f08b182a8fa9a84fe33e60060659d3a667", + "enableRecoveryMode()": "0xb76be8e742e4cb12126e4fc867333c0915425cba12ba2a9559f92a73d15eb430", + "initialize()": "0x68fc912eaeaf76df482b1d54a9cef62f939a21f3a725a266f489eb89e833aa3a", + "pause()": "0xe3aaafb3f2e202b308378b16091b9ad50c9c3748bc6953d3367ad4a864eac06e", + "setSwapFeePercentage(uint256)": "0xf096cdce611341da2a98a49ab1b3a60c60855de4dd6f42a33d3b6d23d86acee6", + "setTargets(uint256,uint256)": "0xc6c121c21372bdb7e9f07699dfdc2d0df5132e2d286afdcea9e6264f1566d402", + "unpause()": "0x383deff38933fd5c665bbd2744d463ec6cae2d3d3663e959b8fe4231d3b32c8b" + } + } + }, + "20230215-single-recipient-gauge-factory-v2": { + "SingleRecipientGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address,uint256,bool)": "0x48bb7b3af0371dc4fc46b1afc937bff3aba62f24e41a0e977dbf159548d47fcc" + } + }, + "SingleRecipientGauge": { + "useAdaptor": true, + "actionIds": { + "checkpoint()": "0x7f4b0536efcbd917495f0d8e7a96852c08739243c797e73f00d32999233f8d5d", + "initialize(address,uint256,bool,string)": "0xe5494c181b7f1227ef0a7734ac38ac1bd42162fcf1380306b1d111cdc5676086", + "killGauge()": "0x38f12558087095621293389b35508390a03d17855b55b2394ce67b3c47d4463d", + "setRelativeWeightCap(uint256)": "0x53ded5c23d686756f2cc6a8feb053e1a98ea78534f788670216e0617a9cf7101", + "unkillGauge()": "0x5e7938ef4e6a59634c9800645277831eda1a30b5efd9ec55235154211f9e2941" + } + } + }, + "20230223-protocol-id-registry": { + "ProtocolIdRegistry": { + "useAdaptor": false, + "actionIds": { + "registerProtocolId(uint256,string)": "0xdfc349d88d311b76af85f0bdc6a81be0e30485d488472e3813359f8e26fc1c95", + "renameProtocolId(uint256,string)": "0x397a10db2c15733cdb7c0fad6226786d83e216ed46c740257186765f4018bec5" + } + } + }, + "20230320-weighted-pool-v4": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address,bytes32)": "0xaba9ffb17b2efad3b545708e13b3f91cbcb70f6b7de76f29d7a2bd85a0750f88", + "disable()": "0xd7acda26118b9ff06dd8526d0197d58c0c7ed83074be6d915bff2db42b5581ae" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0x072ED560cc042d7aB1c080a9e4fA8C6f4858dEb3", + "actionIds": { + "disableRecoveryMode()": "0xd674de2cecb3a543953d0844369358124e617428c5e1bbff8924a84e7e4128fa", + "enableRecoveryMode()": "0x8ceae9d0f076b4b0c529529f6bf11832835b93b533445c655b840015f7025e50", + "pause()": "0xb9c5dbd31b49d898a12157d05b5f59e61b30533c20fe266652c1017837135f0c", + "setAssetManagerPoolConfig(address,bytes)": "0x0bd65c98e2121df958fbdd053552dfab29367bac9f223d282f1c262c89328ff5", + "setSwapFeePercentage(uint256)": "0x32725667b078898f78f53e59f45eb1837b34a9469dbe36f9270b674247b23abf", + "unpause()": "0xb313b0fd78e09c18baecd229b1f60ba3e28af60010313a2eb6e955e3626d8972", + "updateProtocolFeePercentageCache()": "0x851e1de2f8d7c9460da7ecb3137551662eb032a7ac4475ead243e7f5efe9725e" + } + } + }, + "20230320-composable-stable-pool-v4": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address,bytes32)": "0x0de6d43e3472be04e8d42c8a41d31e85d6a0973531a1bde49a5393ae99748e70", + "disable()": "0xdb0e2ca147bb165fcfd2631fb8cb87ab34aa8fb9d2a81e95334a207f753f0302" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x5D343D374A769D1AB102e0418a516DadB08A86E4", + "actionIds": { + "disableRecoveryMode()": "0xf65bca6198c80a6fc89409c116db12c0427a0b571cd0d2ee5dd614145d006810", + "enableRecoveryMode()": "0xf7c36607b85de415dd5d9b2e4c47d42f2093d7338fc8af38b88070683da54da1", + "pause()": "0x6464a19f906714393234821d14f9899d08c3c32edac6ac68a28e8e2c444dc372", + "setAssetManagerPoolConfig(address,bytes)": "0x18e56c9f67c05b8b685755dffd4fc9910e67297943e0b6f65c721e1894e08325", + "setSwapFeePercentage(uint256)": "0xe92c5e92fd07c923b506e4ef7eb29972642a073312f496c812148a15bb6b8967", + "setTokenRateCacheDuration(address,uint256)": "0x8518c2cc23c81411457873cc4df8dd9f92946fb21b4b290e3e93467d3f7b4c64", + "startAmplificationParameterUpdate(uint256,uint256)": "0x3d1105ece259c9620b4c0b8c8a01554fdbf4efacfe00c648fa8f99a98c7c26bd", + "stopAmplificationParameterUpdate()": "0x39e75d95add118410df221d6d408e602d372ebc0e6657e596e87ab948b093408", + "unpause()": "0xefca407929bb10cd435a2424c97205e03c8a8757dcdc317cd8c166a0cf7b6067", + "updateProtocolFeePercentageCache()": "0xfec3941bcf00df950d453bfc0502e8ff5be0c6ec7e3486d9a755058a9ed084da", + "updateTokenRateCache(address)": "0x7890466ffba14a02f161e03ef49578067b54197c84285660df1bffe3173b8d70" + } + } + }, + "20230316-l2-balancer-pseudo-minter": { + "L2BalancerPseudoMinter": { + "useAdaptor": false, + "actionIds": { + "addGaugeFactory(address)": "0x395452eddfaf475cccb315fe68df346df514a07264ba291edb128246b94a936a", + "mint(address)": "0xd759419275d7ef0509f7796f85f749c03d1b1ede6aa83603de86181622dc5ae2", + "mintFor(address,address)": "0x1913f7295521e22244fffd0820d96dccccfb12ef0883e0cdf0e172936a5726ac", + "mintMany(address[])": "0x7ec7bc0bded7496ad076f880c959d4f22ea8ff2cdaec65630f47d2ca239d57b1", + "mintManyFor(address[],address)": "0x6a361067be320e78f6609d1f55a0e58af7417c304b6f715eda9c4a1ed89c9079", + "mint_for(address,address)": "0x19269e4ba5a045643bcff1e66ed71fea728fc7d8aa35b5568a439d7f5851bc17", + "mint_many(address[8])": "0x1fae3cc35a1790a1dad0bbf9adb2d77f3b8c598e6c44fdffd44d2d827ed41a4c", + "removeGaugeFactory(address)": "0xd10a81975bf0c68340e10129804be1e3c504a51ac73f693f1905a66da6f067bd", + "setMinterApproval(address,bool)": "0xe2a35964068b527c74d9c2356d657b4bcb25f0a5187048aca8c5a3c4ad129ef1", + "setMinterApprovalWithSignature(address,bool,address,uint256,uint8,bytes32,bytes32)": "0x96054c75df7d3fc4e904c849c8c864a0588361a817a27372d1ecd9d3cadf9626", + "toggle_approve_mint(address)": "0xb467b598ed213da55735ff00766debce9e26658787daaf6d7f19f9d4e1a6af1d" + } + } + }, + "20230316-l2-ve-delegation-proxy": { + "VotingEscrowDelegationProxy": { + "useAdaptor": false, + "actionIds": { + "killDelegation()": "0x9cc42eef705ce46b44b8e690082030431c6a25a28007df6e9dec3d04ad47cb99", + "setDelegation(address)": "0xb37c54f1251a66c91992372dad9df4ea678283452056a1aa1e743b730d469cde" + } + } + }, + "20230316-child-chain-gauge-factory-v2": { + "ChildChainGauge": { + "useAdaptor": true, + "actionIds": { + "add_reward(address,address)": "0x6b5e3750e9adcbd4a75428ed3fc6d2d3fc8a52866660ad3778d3f8c33108edff", + "claim_rewards()": "0x9f596268ae1d840bffec6468f35868d6215d48830f5874204b4b5202ce5f037e", + "claim_rewards(address)": "0xc13be6a0bc76228878b765dc039dccf7a203e1b54c277e6c95a0e2adfd9b9768", + "claim_rewards(address,address)": "0x09cd18211fb6b5f5d35da164c1377daca07134e29471154cc4b268e635fa98ae", + "claim_rewards(address,address,uint256[])": "0x0729af46daf6dabf59a3d5ad95e5356968d3b8fcfa67aaf689cd6cff1e8ce0b3", + "claimable_tokens(address)": "0xffe7f3a303586ecf807e0b512726ae165966960a1c571c9436ecb471f34789f7", + "deposit(uint256)": "0x96ae016c0a4c7f47195543b71764c67ffad0660f500b0bd178dcc31c9c77c7aa", + "deposit(uint256,address)": "0xf36a7bb219d21dfa1e55054181e8d0374dd108d24388e03731dc0d19761caf80", + "deposit_reward_token(address,uint256)": "0xf581c7883fb0a72e34d13610759cdc6995d495bfcbfd7982d6e4b67f468f54d0", + "initialize(address,string)": "0x66d96386a3143cf96b092e412c726dda4fe3d777c7f7d56cfaac986acbff9f13", + "killGauge()": "0x38f12558087095621293389b35508390a03d17855b55b2394ce67b3c47d4463d", + "set_reward_distributor(address,address)": "0x75f03d945d74639aa78784e5071604aa86c170a9f4c32bdf428231d560be70b7", + "set_rewards_receiver(address)": "0xcfbfe4d78681a144e3340201137411eee3ad0d0d99dbf387f55f321dfefa2340", + "unkillGauge()": "0x5e7938ef4e6a59634c9800645277831eda1a30b5efd9ec55235154211f9e2941", + "user_checkpoint(address)": "0xdd1c1c3bdba9af83567a294b444bfa43351dee295bdd2fe01a4ea28465a1cd9c", + "withdraw(uint256)": "0x97c58aaa7f1baf7f9ed7dc75b801e1b130bb834fd9ddf7ea7e152c9ffed6c21f", + "withdraw(uint256,address)": "0x55c48a05f56a704d529dd5c12379d86f1ae0181c456826a4e1d8af0cdc9674fa" + } + }, + "ChildChainGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address)": "0x11dac6d73575cf704c874437f6e2742b10f0b3a8cb903c585bdc799cab66c457" + } + } + }, + "20230404-l2-layer0-bridge-forwarder": { + "L2LayerZeroBridgeForwarder": { + "useAdaptor": false, + "actionIds": { + "onVeBalBridged(address)": "0x8479390d09c5c301bdc0a009a112b46d49a8039bf633774c349ce215246437a7", + "onVeBalSupplyUpdate()": "0xd6dae96c8c48de0dd733a8158aefabd081233ab0a8a1674a5670aedb698fd7e8", + "setDelegation(address)": "0x2b1063482a56fcc1993bcf1ee2a264d8d49e7ce1e26e76544e5292ab97210119" + } + } + }, + "20230411-managed-pool-v2": { + "ManagedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create((string,string,address[]),(address[],uint256[],uint256,bool,bool,uint256,uint256),address,bytes32)": "0x23453746bf001a9ea3432109b510f1cd4f54694f1aa8e1170c99b9f13b59b9ce", + "disable()": "0xc286c677f812387602b94d5dee672097cae543d80e175977381fbdbcdb9b2c12" + } + }, + "ManagedPool": { + "useAdaptor": false, + "factoryOutput": "0xff79b51ec2934Dd1810a8e0325e3B08708720B26", + "actionIds": { + "addAllowedAddress(address)": "0xf378e43e1d0f41267e0b6654f8f52e0ab432b1fb4f35b209d2e76608ef63eb14", + "addToken(address,address,uint256,uint256,address)": "0xd0ee11d8a1ceea2f635a0f85300fd29c169555e7afbe1e1ec8af2a839fc8c897", + "collectAumManagementFees()": "0x8fe49a28abbd6e0768bff9b995ac9ae53d20d29e816f262479fed23b5234178f", + "disableRecoveryMode()": "0xd21198f97672ee6118c9598a1b4c2053515bf28a40c4df5cf02365c4ff3d5ba7", + "enableRecoveryMode()": "0x2aa887a92d3d18f30f198214d2c197b7d148bb735c610372199c51c6a4866b86", + "pause()": "0xe67bef3cfb0ba409959647fa3d8ff78b267a1c13f5434c2f32219ced33fec922", + "removeAllowedAddress(address)": "0x5c2ff5dbb8961447fb961cdb72a3daab5060c22be92142959d891aad2d7702ea", + "removeToken(address,uint256,address)": "0xb6ae5f8149a45af827981911438d9f80de89bb7e65344e4d0fd1c446a7baa810", + "setCircuitBreakers(address[],uint256[],uint256[],uint256[])": "0x7dce1e9699088bce01cc32c9123e0363a28030fda9c9090b7e046555e0c53557", + "setJoinExitEnabled(bool)": "0xbdbe585a1a041cf18a0d049cf5d7108b4280a0dcaa88ed95b7d7fa6c8e0bcce9", + "setManagementAumFeePercentage(uint256)": "0x06ccd34ea00555e518b5d78aa5c38e84929422c7ed22f28feec12f7cf4157e7a", + "setMustAllowlistLPs(bool)": "0x2a0b8178de7be0484da36c4c3f754744cabe1365fa5554b19fd7dfcd10787529", + "setSwapEnabled(bool)": "0xe1f698ed05d0b787697be880739dea75901cd74e475ef4f38b0fc1067ef88a69", + "unpause()": "0xe43d68fde8cc8cb294d6ab5f297f0d8eca163f7650caee6be549c54527d5b994", + "updateProtocolFeePercentageCache()": "0x6c2d3375fd4cfa536f0e6c5aa8f1afa5d708d0865f30cad3943ff9c968de3b7d", + "updateSwapFeeGradually(uint256,uint256,uint256,uint256)": "0x25204deb977c00e240d2d353b31b645813fef504dfb1a726ea730eeb25e64cee", + "updateWeightsGradually(uint256,uint256,address[],uint256[])": "0xb699a7c9a044c8cc3420213d2b0b7a2daa070fca50add3f78af2791113a323ff" + } + } + }, + "20230410-silo-linear-pool-v2": { + "SiloLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x789ea751234ff1839c748ecb96428f32e9c8de45450224875f355481ec6c7299", + "disable()": "0x47e8a5958daa66e88bf7bcf93443d73f6c4bb321885ca9a01569e8eae8f33980" + } + }, + "SiloLinearPool": { + "useAdaptor": false, + "factoryOutput": "0xBbb66a4fFf47701EC6c528dB615f5E7bF1AbDAAF", + "actionIds": { + "disableRecoveryMode()": "0x66b44fbf0d8d48ecebffdd9dc7b8594b5045c91e1e5d0f2fdce30e3accf5d527", + "enableRecoveryMode()": "0x06cb32b17d9f08cd8306293c50cc0bd2bd67d76a5796dd4cfe11ed09a2b530cf", + "initialize()": "0x55a0c4f556f25f2959e0477bbd7541a77e0bed72f1f40d49dd05881084422528", + "pause()": "0xf833a4c1e409f6816b61ca3f1230accced8b0bc9357d4dce006ac12794f4cf76", + "setSwapFeePercentage(uint256)": "0xa303347c9568c1152386bd4ece63ffa34cac9ee6e614439ffedcd00f1726de7f", + "setTargets(uint256,uint256)": "0x7ec37d6b6d858c0f02e7ff91861f95608de186f6dc49eac73cebe4c7d15e101d", + "unpause()": "0xfb57a136e204a181f8afab1372a54a09e9d92991264bb29f18cca64f757a2183" + } + } + }, + "20230504-vebal-remapper": { + "OmniVotingEscrowAdaptor": { + "useAdaptor": false, + "actionIds": { + "sendUserBalance(address,uint16,address)": "0x641dcbb91cd1b31f2a88c00afa708b3e1795971aad86da8e54f1c35da1e893dc", + "setAdapterParams(bytes)": "0x54c66f0926db043fd8e623ad2f5f286822e0505918e9a64d6ff6b2533148baef", + "setOmniVotingEscrow(address)": "0x051999085ef95e994d249982784051930228fa5b1555e4b6191f4e2d87ef70c4", + "setUseZero(bool)": "0x96cd69bdf8f32f9f13e2d10e9db83cf181e08962cc1e7a8523f1f9f8c22c0f16", + "setZeroPaymentAddress(address)": "0xfa08331f0860684717f0e3fa283f539e186d06f3a9f1c1d7ce29a4f4f68afaac" + } + }, + "VotingEscrowRemapper": { + "useAdaptor": false, + "actionIds": { + "clearNetworkRemapping(address,uint16)": "0x7b7c92c672641828bf2f4df4e0b965901c6663327175bae3624367b3bd5349af", + "setNetworkRemapping(address,address,uint16)": "0x8c0a581cdeeec87a2d8c3a2e9af12c67550db43f33a7f4f239be2ca970cd332a", + "setNetworkRemappingManager(address,address)": "0xd6aa04e37affe1a66309250024fad872cec43e5e59e0b03ab48e00abb896af64" + } + } + }, + "20230519-gauge-adder-v4": { + "GaugeAdder": { + "useAdaptor": false, + "actionIds": { + "addGauge(address,string)": "0xb91f8258ff7a455e938586aaf08529139b3cfa12abba3e2ecd1e26f05cdace85", + "addGaugeType(string)": "0x327cb7809eede7aefe16ba8f0c2fade6c85db3e0061edfb13e2992e7971dfe07", + "setGaugeFactory(address,string)": "0xdf8ecbb99f99528d797417e432920eddd8440d68968addc08d161523d25729aa" + } + } + }, + "20230711-composable-stable-pool-v5": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool,uint256,address,bytes32)": "0xaadc4fc342b9d37032270d8adad7e12029667a841f7202b364cc1addd24a3ebc", + "disable()": "0x3dd110fd101a1be6115ceb811a85535de6c9c019360c7d67c022c48a3dd685d9" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x21cb3534c12E956a600cB3102b825686D10888e7", + "actionIds": { + "disableRecoveryMode()": "0x8f33b1eaf9e2f2523d32b89a23d1a83e1225eb96ef489fde9b81bc44c7e207c1", + "enableRecoveryMode()": "0x73c3332de64a6f7b137bea3255a221d779cc0f170ea4892ff0581faf799230ff", + "pause()": "0x04221c483f49fe794f5ce394e0ffc086722e106b9fef863610ccfbe1a019b997", + "setAssetManagerPoolConfig(address,bytes)": "0xe2baca23794dbc02728408bd1d35a1819f58f0e598d3c004e7b0429144b843da", + "setSwapFeePercentage(uint256)": "0x22627da2e7670aed1292420d5f0a2a49a7bd5992e0aef001702aa3285b5979b3", + "setTokenRateCacheDuration(address,uint256)": "0xed896fdd237f2b79e8ae80a5e3432dbc85b53ff7a8ba91ea17ba7b2716aaee0a", + "startAmplificationParameterUpdate(uint256,uint256)": "0x86f2cd537c832d7823d7b51e7f52288e383427c8c41180561f0f8054bc216f56", + "stopAmplificationParameterUpdate()": "0x0c055dc6cd1d6558914ef49c536f751680f8c413a3563007992801443bcca7a5", + "unpause()": "0xd0d6f7e787daf1d2a410263e88c280721498432203c7bf5a5378158634cf6561", + "updateProtocolFeePercentageCache()": "0x9187594b83654bfb251ccb4533c48404ca136281c3729b90c69ddd0859e0cf18", + "updateTokenRateCache(address)": "0x498630c10c1b0dad33cc41f56c2186da11a12259cd4b65c8a5922a04c9e902a4" + } + } + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/action-ids/goerli/expected-collisions.json b/balpy/balancer-deployments/action-ids/goerli/expected-collisions.json new file mode 100644 index 0000000..656ae2c --- /dev/null +++ b/balpy/balancer-deployments/action-ids/goerli/expected-collisions.json @@ -0,0 +1,774 @@ +{ + "0x8ba5bbfc65500befee6f807951312220f05be14a619a4b27df3279d6d8cb23f7": [ + { + "taskId": "20210418-authorizer", + "contractName": "Authorizer", + "signature": "grantRole(bytes32,address)", + "useAdaptor": true + }, + { + "taskId": "20220325-test-balancer-token", + "contractName": "TestBalancerToken", + "signature": "grantRole(bytes32,address)", + "useAdaptor": true + } + ], + "0x7cefce05d274ae00638cfb5ca5ff0d25243084c3ab8b9111cb0e80a845a97e33": [ + { + "taskId": "20210418-authorizer", + "contractName": "Authorizer", + "signature": "renounceRole(bytes32,address)", + "useAdaptor": true + }, + { + "taskId": "20220325-test-balancer-token", + "contractName": "TestBalancerToken", + "signature": "renounceRole(bytes32,address)", + "useAdaptor": true + } + ], + "0xa69c55a3bf33c36d1357b5d2dd820ceb8f29cb3a5c638478e3f55ba7b541670b": [ + { + "taskId": "20210418-authorizer", + "contractName": "Authorizer", + "signature": "revokeRole(bytes32,address)", + "useAdaptor": true + }, + { + "taskId": "20220325-test-balancer-token", + "contractName": "TestBalancerToken", + "signature": "revokeRole(bytes32,address)", + "useAdaptor": true + } + ], + "0xc656e762de524a52243bd0ad98fe0208a4b763e5b3406a525dd47ba8814c5e88": [ + { + "taskId": "20211208-aave-linear-pool", + "contractName": "AaveLinearPoolFactory", + "signature": "create(string,string,address,address,uint256,uint256,address)", + "useAdaptor": true + }, + { + "taskId": "20220404-erc4626-linear-pool-v2", + "contractName": "ERC4626LinearPoolFactory", + "signature": "create(string,string,address,address,uint256,uint256,address)", + "useAdaptor": true + }, + { + "taskId": "20220425-unbutton-aave-linear-pool", + "contractName": "UnbuttonAaveLinearPoolFactory", + "signature": "create(string,string,address,address,uint256,uint256,address)", + "useAdaptor": true + } + ], + "0x7f4b0536efcbd917495f0d8e7a96852c08739243c797e73f00d32999233f8d5d": [ + { + "taskId": "20220325-gauge-controller", + "contractName": "VotingEscrow", + "signature": "checkpoint()", + "useAdaptor": true + }, + { + "taskId": "20220325-gauge-controller", + "contractName": "GaugeController", + "signature": "checkpoint()", + "useAdaptor": true + }, + { + "taskId": "20220420-fee-distributor", + "contractName": "FeeDistributor", + "signature": "checkpoint()", + "useAdaptor": true + }, + { + "taskId": "20220714-fee-distributor-v2", + "contractName": "FeeDistributor", + "signature": "checkpoint()", + "useAdaptor": true + }, + { + "taskId": "20230215-single-recipient-gauge-factory-v2", + "contractName": "SingleRecipientGauge", + "signature": "checkpoint()", + "useAdaptor": true + } + ], + "0x6b5e3750e9adcbd4a75428ed3fc6d2d3fc8a52866660ad3778d3f8c33108edff": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "add_reward(address,address)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "add_reward(address,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "add_reward(address,address)", + "useAdaptor": true + } + ], + "0x9f596268ae1d840bffec6468f35868d6215d48830f5874204b4b5202ce5f037e": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "claim_rewards()", + "useAdaptor": true + }, + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "claim_rewards()", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "claim_rewards()", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards()", + "useAdaptor": true + } + ], + "0xc13be6a0bc76228878b765dc039dccf7a203e1b54c277e6c95a0e2adfd9b9768": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "claim_rewards(address)", + "useAdaptor": true + }, + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "claim_rewards(address)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "claim_rewards(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards(address)", + "useAdaptor": true + } + ], + "0x09cd18211fb6b5f5d35da164c1377daca07134e29471154cc4b268e635fa98ae": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "claim_rewards(address,address)", + "useAdaptor": true + }, + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "claim_rewards(address,address)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "claim_rewards(address,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards(address,address)", + "useAdaptor": true + } + ], + "0xffe7f3a303586ecf807e0b512726ae165966960a1c571c9436ecb471f34789f7": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "claimable_tokens(address)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "claimable_tokens(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claimable_tokens(address)", + "useAdaptor": true + } + ], + "0x96ae016c0a4c7f47195543b71764c67ffad0660f500b0bd178dcc31c9c77c7aa": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "deposit(uint256)", + "useAdaptor": true + }, + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "deposit(uint256)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "deposit(uint256)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "deposit(uint256)", + "useAdaptor": true + } + ], + "0xf36a7bb219d21dfa1e55054181e8d0374dd108d24388e03731dc0d19761caf80": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "deposit(uint256,address)", + "useAdaptor": true + }, + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "deposit(uint256,address)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "deposit(uint256,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "deposit(uint256,address)", + "useAdaptor": true + } + ], + "0xb11918b6dac9f6ee7f9177c880d2f5ecea0c1f851d6846a012c98497ba9d11ce": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "deposit(uint256,address,bool)", + "useAdaptor": true + }, + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "deposit(uint256,address,bool)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "deposit(uint256,address,bool)", + "useAdaptor": true + } + ], + "0xf581c7883fb0a72e34d13610759cdc6995d495bfcbfd7982d6e4b67f468f54d0": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "deposit_reward_token(address,uint256)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "deposit_reward_token(address,uint256)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "deposit_reward_token(address,uint256)", + "useAdaptor": true + } + ], + "0x2071350ff2da59d3371768c9d51c341a241f4f772ba140c4aa97f151f298f2ce": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "initialize(address)", + "useAdaptor": true + }, + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "ChildChainStreamer", + "signature": "initialize(address)", + "useAdaptor": true + } + ], + "0x30594774a65a20af0ab69e7818f2b44db4ab171122a118c23a469cca3fe91397": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "kick(address)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "kick(address)", + "useAdaptor": true + } + ], + "0x38f12558087095621293389b35508390a03d17855b55b2394ce67b3c47d4463d": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "killGauge()", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "killGauge()", + "useAdaptor": true + }, + { + "taskId": "20230215-single-recipient-gauge-factory-v2", + "contractName": "SingleRecipientGauge", + "signature": "killGauge()", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "killGauge()", + "useAdaptor": true + } + ], + "0x75f03d945d74639aa78784e5071604aa86c170a9f4c32bdf428231d560be70b7": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "set_reward_distributor(address,address)", + "useAdaptor": true + }, + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "ChildChainStreamer", + "signature": "set_reward_distributor(address,address)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "set_reward_distributor(address,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "set_reward_distributor(address,address)", + "useAdaptor": true + } + ], + "0xcfbfe4d78681a144e3340201137411eee3ad0d0d99dbf387f55f321dfefa2340": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "set_rewards_receiver(address)", + "useAdaptor": true + }, + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "set_rewards_receiver(address)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "set_rewards_receiver(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "set_rewards_receiver(address)", + "useAdaptor": true + } + ], + "0x5e7938ef4e6a59634c9800645277831eda1a30b5efd9ec55235154211f9e2941": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "unkillGauge()", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "unkillGauge()", + "useAdaptor": true + }, + { + "taskId": "20230215-single-recipient-gauge-factory-v2", + "contractName": "SingleRecipientGauge", + "signature": "unkillGauge()", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "unkillGauge()", + "useAdaptor": true + } + ], + "0xdd1c1c3bdba9af83567a294b444bfa43351dee295bdd2fe01a4ea28465a1cd9c": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "user_checkpoint(address)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "user_checkpoint(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "user_checkpoint(address)", + "useAdaptor": true + } + ], + "0x97c58aaa7f1baf7f9ed7dc75b801e1b130bb834fd9ddf7ea7e152c9ffed6c21f": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "withdraw(uint256)", + "useAdaptor": true + }, + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "withdraw(uint256)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "withdraw(uint256)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "withdraw(uint256)", + "useAdaptor": true + } + ], + "0xfd3383566837d1fe48201add6079241ede290ac9131b6e2d44dd6fa38e636a4c": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "withdraw(uint256,bool)", + "useAdaptor": true + }, + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "withdraw(uint256,bool)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "withdraw(uint256,bool)", + "useAdaptor": true + } + ], + "0x11dac6d73575cf704c874437f6e2742b10f0b3a8cb903c585bdc799cab66c457": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeFactory", + "signature": "create(address)", + "useAdaptor": true + }, + { + "taskId": "20220325-single-recipient-gauge-factory", + "contractName": "SingleRecipientGaugeFactory", + "signature": "create(address)", + "useAdaptor": true + }, + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "ChildChainLiquidityGaugeFactory", + "signature": "create(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGaugeFactory", + "signature": "create(address)", + "useAdaptor": true + } + ], + "0x833298360476618944f718981ab233082f5122f9f3e9028d063809d504e88d75": [ + { + "taskId": "20220325-test-balancer-token", + "contractName": "TestBalancerToken", + "signature": "burn(uint256)", + "useAdaptor": true + }, + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "burn(uint256)", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "burn(uint256)", + "useAdaptor": true + } + ], + "0x883f26e95df579fa682d038f27522a17d874346c18d9dbe2d502ef473e726580": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "batch_cancel_boosts(uint256[256])", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "batch_cancel_boosts(uint256[256])", + "useAdaptor": true + } + ], + "0xedd0ebabd9c0f1fa41a6d2054310ecb3bad17c3e576b34d1f7248e69281d37a9": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "batch_set_delegation_status(address,address[256],uint256[256])", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "batch_set_delegation_status(address,address[256],uint256[256])", + "useAdaptor": true + } + ], + "0x2b026cd495c98dd35b33bd5be496f7c57cba766b8fa2832ba428190d5d54395c": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "cancel_boost(uint256)", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "cancel_boost(uint256)", + "useAdaptor": true + } + ], + "0x9e114ee25688c62b328b4af834f05fdff86eedde0d647e798ef48714279af25e": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "create_boost(address,address,int256,uint256,uint256,uint256)", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "create_boost(address,address,int256,uint256,uint256,uint256)", + "useAdaptor": true + } + ], + "0xddfb0ba9a402842551fa67e8f569543d4e9b070ca5395d6231f133f8bd940ea3": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "extend_boost(uint256,int256,uint256,uint256)", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "extend_boost(uint256,int256,uint256,uint256)", + "useAdaptor": true + } + ], + "0x6b41b73de8753e4078cde2c682af18fea9a8d77a53d2ac78e22a3dfe521129e3": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "setApprovalForAll(address,bool)", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "setApprovalForAll(address,bool)", + "useAdaptor": true + } + ], + "0x78d5dd240bf6124d3e8e7c6918c9ebe9d901c97e695d2f9f58461fe1393c33b9": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "set_base_uri(string)", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "set_base_uri(string)", + "useAdaptor": true + } + ], + "0xb6ea2830f55c1f054aa739efb9bb246886c82431fed5d323d0ae7fe31c332ab9": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "set_delegation_status(address,address,bool)", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "set_delegation_status(address,address,bool)", + "useAdaptor": true + } + ], + "0xad5cc01d75c9557c6761cedd6747cc49bf2bbee8a7e86e342e08ec8cce2d1424": [ + { + "taskId": "20220420-fee-distributor", + "contractName": "FeeDistributor", + "signature": "checkpointToken(address)", + "useAdaptor": true + }, + { + "taskId": "20220714-fee-distributor-v2", + "contractName": "FeeDistributor", + "signature": "checkpointToken(address)", + "useAdaptor": true + } + ], + "0x57588509fc9c7809dd451800137b52b71251b8f33eaefe0a4a20704d7a794d14": [ + { + "taskId": "20220420-fee-distributor", + "contractName": "FeeDistributor", + "signature": "checkpointTokens(address[])", + "useAdaptor": true + }, + { + "taskId": "20220714-fee-distributor-v2", + "contractName": "FeeDistributor", + "signature": "checkpointTokens(address[])", + "useAdaptor": true + } + ], + "0x63bc3bcd657781bdff8cf1b98efbb542ce506d17e769c801b781afed58711bfd": [ + { + "taskId": "20220420-fee-distributor", + "contractName": "FeeDistributor", + "signature": "checkpointUser(address)", + "useAdaptor": true + }, + { + "taskId": "20220714-fee-distributor-v2", + "contractName": "FeeDistributor", + "signature": "checkpointUser(address)", + "useAdaptor": true + } + ], + "0x00b4bd03de78c530508635a32da0ce07094513baf09fd6a44ad6f1a202115d41": [ + { + "taskId": "20220420-fee-distributor", + "contractName": "FeeDistributor", + "signature": "claimToken(address,address)", + "useAdaptor": true + }, + { + "taskId": "20220714-fee-distributor-v2", + "contractName": "FeeDistributor", + "signature": "claimToken(address,address)", + "useAdaptor": true + } + ], + "0x2456837bbeb6da646c6790300119cc05a25ecbf93c466b752edb2520e198bd37": [ + { + "taskId": "20220420-fee-distributor", + "contractName": "FeeDistributor", + "signature": "claimTokens(address,address[])", + "useAdaptor": true + }, + { + "taskId": "20220714-fee-distributor-v2", + "contractName": "FeeDistributor", + "signature": "claimTokens(address,address[])", + "useAdaptor": true + } + ], + "0x24a4418c40f7071f7d5c76dd936c391fea8819e36d109605e19363663622cb61": [ + { + "taskId": "20220420-fee-distributor", + "contractName": "FeeDistributor", + "signature": "depositToken(address,uint256)", + "useAdaptor": true + }, + { + "taskId": "20220714-fee-distributor-v2", + "contractName": "FeeDistributor", + "signature": "depositToken(address,uint256)", + "useAdaptor": true + } + ], + "0x4721716053738fe68d3d5b293f1873c5f26f1a865cb53ccaa3f1527038428a7c": [ + { + "taskId": "20220420-fee-distributor", + "contractName": "FeeDistributor", + "signature": "depositTokens(address[],uint256[])", + "useAdaptor": true + }, + { + "taskId": "20220714-fee-distributor-v2", + "contractName": "FeeDistributor", + "signature": "depositTokens(address[],uint256[])", + "useAdaptor": true + } + ], + "0x53ded5c23d686756f2cc6a8feb053e1a98ea78534f788670216e0617a9cf7101": [ + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "setRelativeWeightCap(uint256)", + "useAdaptor": true + }, + { + "taskId": "20230215-single-recipient-gauge-factory-v2", + "contractName": "SingleRecipientGauge", + "signature": "setRelativeWeightCap(uint256)", + "useAdaptor": true + } + ] +} \ No newline at end of file diff --git a/balpy/balancer-deployments/action-ids/ignored-functions.json b/balpy/balancer-deployments/action-ids/ignored-functions.json new file mode 100644 index 0000000..a523f8d --- /dev/null +++ b/balpy/balancer-deployments/action-ids/ignored-functions.json @@ -0,0 +1,22 @@ +{ + "ignoredFunctions": [ + "approve(address,uint256)", + "transfer(address,uint256)", + "transferFrom(address,address,uint256)", + "safeTransferFrom(address,address,uint256)", + "safeTransferFrom(address,address,uint256,bytes)", + "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)", + "decreaseApproval(address,uint256)", + "increaseApproval(address,uint256)", + "decreaseAllowance(address,uint256)", + "increaseAllowance(address,uint256)", + "onExitPool(bytes32,address,address,uint256[],uint256,uint256,bytes)", + "onJoinPool(bytes32,address,address,uint256[],uint256,uint256,bytes)", + "queryExit(bytes32,address,address,uint256[],uint256,uint256,bytes)", + "queryJoin(bytes32,address,address,uint256[],uint256,uint256,bytes)", + "onSwap((uint8,address,address,uint256,bytes32,uint256,address,address,bytes),uint256,uint256)", + "onSwap((uint8,address,address,uint256,bytes32,uint256,address,address,bytes),uint256[],uint256,uint256)", + "performAction(address,bytes)", + "multicall(bytes[])" + ] +} diff --git a/balpy/balancer-deployments/action-ids/mainnet/action-ids.json b/balpy/balancer-deployments/action-ids/mainnet/action-ids.json new file mode 100644 index 0000000..ca74a4b --- /dev/null +++ b/balpy/balancer-deployments/action-ids/mainnet/action-ids.json @@ -0,0 +1,1470 @@ +{ + "20210418-authorizer": { + "Authorizer": { + "useAdaptor": true, + "actionIds": { + "grantRole(bytes32,address)": "0x3b5aa417f440ce599b5fcebc425f7ea46ff4c105a0c529a180642cb6b1740346", + "grantRoles(bytes32[],address)": "0x27a96293b7f504e5fa28c9a799467561bbcb1bc08277f60d3d1140f315e54ec6", + "grantRolesToMany(bytes32[],address[])": "0x0a754de8c17cd28fc6dbb29f41c51150449409f1a6ee78e889013d476b890238", + "renounceRole(bytes32,address)": "0x46bd31898e4be3efd0e0127e710aa0427308b6220bb5b8286230d4f7a596f0cb", + "revokeRole(bytes32,address)": "0x2b2ed92fb51ba70a0a86c61efb68d77cc578f6f7ef30933df5d5506f8bf537b2", + "revokeRoles(bytes32[],address)": "0xc89adbc6dae79ab0bb0416f93f4416270b446ecd58147c38b5e923ddca936766", + "revokeRolesFromMany(bytes32[],address[])": "0x9ebe3bdeeba42f0d5055085e3f83fabdd85ca79f011278cd51814b75d0f522b3" + } + } + }, + "20210418-vault": { + "Vault": { + "useAdaptor": false, + "actionIds": { + "batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)": "0x1282ab709b2b70070f829c46bc36f76b32ad4989fecb2fcb09a1b3ce00bbfc30", + "deregisterTokens(bytes32,address[])": "0xe4f8ff74aa05a4d54a06e035d5e86947bc6474f8d7b166ebeb49fc9178d28551", + "exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0xc149e88b59429ded7f601ab52ecd62331cac006ae07c16543439ed138dcb8d34", + "flashLoan(address,address[],uint256[],bytes)": "0x96ebe854ca6ab6242ad127dcd7809576513b0c64571e515cedd7b8885612c82d", + "joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x78ad1b68d148c070372f8643c4648efbb63c6a8a338f3c24714868e791367653", + "managePoolBalance((uint8,bytes32,address,uint256)[])": "0x7275fb98594b03dc36a7de69051058e9e2d05cabeb4fe7d9c87bc69f94d9d084", + "manageUserBalance((uint8,address,uint256,address,address)[])": "0xeba777d811cd36c06d540d7ff2ed18ed042fd67bbf7c9afcf88c818c7ee6b498", + "queryBatchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool))": "0xf5f701b3adfba2adad8f16a8be5a989593e42a2caa84c5c6e60b22143db65a2f", + "registerPool(uint8)": "0x956dfce4343a6be4df20714d3dc413ef59e73fa9995d3d247e7c8d12efd33ac2", + "registerTokens(bytes32,address[],address[])": "0xad5bd4a1cc4243b4d772a8a55d24792c1f57cc45eb97ed1291b82d96125a7626", + "setAuthorizer(address)": "0x1cbb503dcc0f4acaedf71a098211ff8b15a220fc26a6974a8d9deaab040fa6e0", + "setPaused(bool)": "0xb5593fe09464f360ecf835d5b9319ce69900ae1b29d13844b73c250b1f5f92fb", + "setRelayerApproval(address,address,bool)": "0x0014a06d322ff07fcc02b12f93eb77bb76e28cdee4fc0670b9dec98d24bbfec8", + "swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)": "0x7b8a1d293670124924a0f532213753b89db10bde737249d4540e9a03657d1aff" + } + }, + "BalancerHelpers": { + "useAdaptor": true, + "actionIds": { + "queryExit(bytes32,address,address,(address[],uint256[],bytes,bool))": "0xb0850f445323ec6662629ef0cdc2dc8c7e5d5d83978f7a784a2898758be1f2c2", + "queryJoin(bytes32,address,address,(address[],uint256[],bytes,bool))": "0xf3d4a64f9e0923252136cba0230f182b2f699934c190943d25149f1cafce8ce2" + } + }, + "ProtocolFeesCollector": { + "useAdaptor": false, + "actionIds": { + "setFlashLoanFeePercentage(uint256)": "0xbe2a180d5cc5d803a8eec4cea569989fc1c593d7eeadd1f262f360a68b0e842e", + "setSwapFeePercentage(uint256)": "0xb28b769768735d011b267f781c3be90bce51d5059ba015bc7a28b3e882fb2083", + "withdrawCollectedFees(address[],uint256[],address)": "0xb2b6e48fa160a7c887d9d7a68b6a9bb9d47d4953d33e07f3a39e175d75e97796" + } + } + }, + "20210418-weighted-pool": { + "WeightedPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address)": "0x4d5282066a5fda3f5736198513ee33edf792164c299f2e59fbb6f6c7040ce7ad" + } + }, + "WeightedPool2TokensFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256[],uint256,bool,address)": "0x52df70aac861355cfd394f6f8947bfab3c6f1738478300ecc0a35cc1632d8995" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0xa69ad41BBD9303f2c165d19b5564325Da72c7224", + "actionIds": { + "setPaused(bool)": "0x3c7de1d8a207c7901ec612f9f0f50957da016911a50d5c22bbe5c9f4f3392d95", + "setSwapFeePercentage(uint256)": "0x3697d13ee45583cf9c2c64a978ab5886bcd07ec2b851efbea2fced982b8f9596" + } + }, + "WeightedPool2Tokens": { + "useAdaptor": false, + "factoryOutput": "0xc29562b045D80fD77c69Bec09541F5c16fe20d9d", + "actionIds": { + "enableOracle()": "0xe543cb443264aa0734939fa06d9e6ade81d691ee5f27c2183c2a54a2c245c8b1", + "setPaused(bool)": "0x43f20c0b0ba9191edc765615b4aa9f5fc68be74185b79f813946e7bc9a9e1e38", + "setSwapFeePercentage(uint256)": "0xc065d550fa98abc242b6baf98e7b2063590675f1ddd81bdb9ea8d8f5c5d52f98" + } + } + }, + "20210624-stable-pool": { + "StablePoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256,uint256,address)": "0xef125e2073fd815c55c2f04fed98ba5218e2082ace09e017398ea7e1cdb2cb35" + } + }, + "StablePool": { + "useAdaptor": false, + "factoryOutput": "0x6641A8c1d33bd3deC8DD85E69C63CAFb5bf36388", + "actionIds": { + "setAssetManagerPoolConfig(address,bytes)": "0x605335b210e41aa6abf3dcc7ede4da40480fec68dc8eb118d499fa010783bddd", + "setPaused(bool)": "0x97270598fa4177db8fa1b289b1a781d6ae7a6e1f87fe4c03f6a0c07990014bb8", + "setSwapFeePercentage(uint256)": "0x7b09f4b61ccfe85436161b0223489b187d9f9158c542b5e6105df147afc78aca", + "startAmplificationParameterUpdate(uint256,uint256)": "0x8c9b4c1f53b968f62f656d48126bd856c38b0d879974dff5b5d6055c0d2917d4", + "stopAmplificationParameterUpdate()": "0xc787be37f98a254065bf8678258de57ce53a2d6814c519063f3003dd9f92dfc3" + } + } + }, + "20210721-liquidity-bootstrapping-pool": { + "LiquidityBootstrappingPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address,bool)": "0xbe1e0934823cee657ae4c9d763780b556f6dc57a287137a2ce26ef70f771c203" + } + }, + "LiquidityBootstrappingPool": { + "useAdaptor": false, + "factoryOutput": "0x6FC73B9d624b543f8B6b88FC3CE627877Ff169Ee", + "actionIds": { + "setAssetManagerPoolConfig(address,bytes)": "0xd3d88853c901e2581060bf590a0ed48da57ca3ccbe89f748d828c282dc40e1b6", + "setPaused(bool)": "0x0546471589e6cc8d242057938789941d762b4cf0186a74658ae0f81866138734", + "setSwapEnabled(bool)": "0xc86f763ebb824c76acdae97561cae60573473dd0e0addb83f0d142f12b0a5d59", + "setSwapFeePercentage(uint256)": "0xf472b63b0e5e0ef0eedf49fb6dcb108ff97950c4394d78409c9251ea89c943da", + "updateWeightsGradually(uint256,uint256,uint256[])": "0xf1c73f7bc5b3a33181b70ef054dd876b584d652e288fcd6fd2bf02d7b9c61cf0" + } + } + }, + "20210727-meta-stable-pool": { + "QueryProcessor": { + "useAdaptor": true, + "actionIds": {} + }, + "MetaStablePoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],uint256,bool,address)": "0x35a3db544cfbcb07e2aa5288331e259147eb73fa71abbf042d2e30f883336c9f" + } + }, + "MetaStablePool": { + "useAdaptor": false, + "factoryOutput": "0x851523A36690bF267BbFEC389C823072D82921a9", + "actionIds": { + "enableOracle()": "0x9bb0ceafb44194dec6a47c23126dfed1662c42d573398f0f4af21aee3757b88e", + "setAssetManagerPoolConfig(address,bytes)": "0x287ba3992c230585d4856a43c953df4b6d09d8e3890f9291cc2633628e9d01cd", + "setPaused(bool)": "0xa9d5a531fd849052f92ebf9cbe5ae801a82bbc0ffd854f4dcd44c663d4a11ec8", + "setPriceRateCacheDuration(address,uint256)": "0xc8cec43a5d5eea46edca69d90b740e59c583c81a2a8fc493bb9428e720af8bba", + "setSwapFeePercentage(uint256)": "0x15d3918ca8f9895d8906a780f5f402d32707bada7b1b5e7b21b7351257103a35", + "startAmplificationParameterUpdate(uint256,uint256)": "0xc108e87eca9f3a0e9a9db0b708e6b15a70c3d0859b02723a7cc4b5ca1fb9fc28", + "stopAmplificationParameterUpdate()": "0x2f17310a7a479b437515eb1917c45a5f8d1fc7035462cfc7c7c43825dec621b5", + "updatePriceRateCache(address)": "0x2660c857c9d8d37ecd99d93ddcc0228cf852373a4a76f8eb9b958ea0a0ec6e68" + } + } + }, + "20210811-ldo-merkle": { + "MerkleRedeem": { + "useAdaptor": true, + "actionIds": { + "claimWeek(address,uint256,uint256,bytes32[])": "0x190215af95d85aed123d88a5a308c3605798a93182fe9aa47e888a456c59b12b", + "claimWeeks(address,(uint256,uint256,bytes32[])[])": "0x24248ad6b9be2522d91cae72104629b7c57ac683e9e5bedc9b63bbc54423edab", + "claimWeeksToInternalBalance(address,(uint256,uint256,bytes32[])[])": "0x6d36262bcfd476e173efd00cd5be7495d11c6f6f2c1d01d32db5a5b1f162b4fb", + "claimWeeksWithCallback(address,address,bytes,(uint256,uint256,bytes32[])[])": "0x88a0b63d1c455206528a698a9e793133b7049bcbb26d1e7c81f04c068eaf8e16", + "renounceOwnership()": "0x858742bdbe585ec0acbf6ceb781210df449541e2b00806ecaa2936ad9b152193", + "seedAllocations(uint256,bytes32,uint256)": "0x0f7d9db492e826138d1f07e98394f3b70a74c5b8959def367243224610a20b6b", + "transferOwnership(address)": "0xa6b1c7cea3e8e35e77cd79fb2e81d17bd8655f01e5f71269cdfb8fac58ad52ea" + } + } + }, + "20210812-lido-relayer": { + "LidoRelayer": { + "useAdaptor": true, + "actionIds": { + "batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)": "0xc3ef0caf01ca4e8de0b09bd7a65cb1eedf3acfb62313e3d430f35fa496adb22d", + "exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x98dcef85670041cd02e471de781cd5158f4d4dece67f3e660db31548d63bff91", + "joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x632c55094ef8995a26074905e17db30f937ecdab014cbbdc5839cfe031199405", + "swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)": "0xa7dcb2573b52b4dcc7de73e0917155f523c796d5012eb817bbad496849602510" + } + } + }, + "20210812-wsteth-rate-provider": { + "WstETHRateProvider": { + "useAdaptor": true, + "actionIds": {} + } + }, + "20210907-investment-pool": { + "InvestmentPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address,bool,uint256)": "0xb4d5b96b20908201024f5175a555aff829236b7605db02daffbf2a17f4ca2b57" + } + }, + "InvestmentPool": { + "useAdaptor": false, + "factoryOutput": "0x3B40D7d5AE25dF2561944dD68b252016c4c7B280", + "actionIds": { + "setAssetManagerPoolConfig(address,bytes)": "0x8ede97683b1fadf663e65daaaef500256ae3643c68c6a4b77e4a84b6035d28a4", + "setPaused(bool)": "0x39794bfb631976145dd5645f5c903aa2b443f72f15e99d1b7413294703d56380", + "setSwapEnabled(bool)": "0x0e86e31bfd78ac23d9fbebeb5305bbfc7d666c0602cc1e74194140c651c5c904", + "setSwapFeePercentage(uint256)": "0x72696c3624ff2400c3580f888cdfc372de1ec9ecba65f61ae7d06752d0181f3a", + "updateWeightsGradually(uint256,uint256,uint256[])": "0x63c0eaeb06b0089842f2fe3ea983921782387e90d36d385cc683ab874153113b", + "withdrawCollectedManagementFees(address)": "0xd9628fe78fc2a5e864832482b704caf2b03cd52c227663a96aa302ac9bd2f15c" + } + } + }, + "20211012-merkle-orchard": { + "MerkleOrchard": { + "useAdaptor": true, + "actionIds": { + "claimDistributions(address,(uint256,uint256,address,uint256,bytes32[])[],address[])": "0x95ae77365b40f8e7f35e43b7f403fe8a992f08321289678fbef64d8e0cc410c7", + "claimDistributionsToInternalBalance(address,(uint256,uint256,address,uint256,bytes32[])[],address[])": "0xb1dd2f16c338f7cecccd5ce613e1ad7cd4f7c5408b675d032cf7c411eba2debf", + "claimDistributionsWithCallback(address,(uint256,uint256,address,uint256,bytes32[])[],address[],address,bytes)": "0x860b7842a97ec464ad09199f82fe42aa6d0680bc5797097cc1147660649a5858", + "createDistribution(address,bytes32,uint256,uint256)": "0x8bd6f4c1c5052c1d553c85e11bb6addbb2a47edf967f3c9d4f0f9f69b94b9269" + } + } + }, + "20211202-no-protocol-fee-lbp": { + "NoProtocolFeeLiquidityBootstrappingPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address,bool)": "0x803e6b81fee024ccd085712b4bcd6741a50460eef16ac4d213ce52fa09ac31b4", + "disable()": "0xf606602974ca80beb7071ceacbfd2e03a1d2bb9da2001eb3591a2c4bbbbc0d05" + } + }, + "NoProtocolFeeLiquidityBootstrappingPool": { + "useAdaptor": false, + "factoryOutput": "0x8485b36623632fFA5E486008DF4d0B6d363DEFdB", + "actionIds": { + "setAssetManagerPoolConfig(address,bytes)": "0xc4ca135a8ee3a202cf58d5dc78331892fb4ddeb709bdf799280ee671b8649a9a", + "setPaused(bool)": "0x33651f97c60f5c9bae32e34d4affa67d26b9b3bb7fe727a08b22d54e60dc9e0a", + "setSwapEnabled(bool)": "0xd7d5ce1b6761a937c49998a490a4c72f5914155c09b54c3ae59633610d5a8638", + "setSwapFeePercentage(uint256)": "0xb6202de0535d339310cb6bbbe84445fab2c4f3560adc56dfa561ec6867d2d5c0", + "updateWeightsGradually(uint256,uint256,uint256[])": "0x93387e6b11da4ff55581ebe54e26f0ebd5f03aaa4240346b7422c7d1fd4a785f" + } + } + }, + "20211208-aave-linear-pool": { + "AaveLinearPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address)": "0x57ae3d5ec3fd0db73a6bce9004759ef4fe0b634368367ea70a82a52f85766856" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x2BBf681cC4eb09218BEe85EA2a5d3D13Fa40fC0C", + "actionIds": { + "initialize()": "0xab6d34fdbf316df0accee9b1f95b88568c4c91d0a4c9dd6357953630cecff574", + "setAssetManagerPoolConfig(address,bytes)": "0x31dcd6f29ec351a2381f60f2870ff242ec9b61ca3eb9193fd07c6de719efce7c", + "setPaused(bool)": "0x5bcdcc8d471eea0c6345d3dd65ad4997a32054e1e0672b780a9b6c36df0166a3", + "setSwapFeePercentage(uint256)": "0x2256d78edacd087428321791a930d4f9fd7acf56e8862187466f1caf179c1a08", + "setTargets(uint256,uint256)": "0x1e3ce02b9d143fb44dc00c908d6b454553cf1c8c48e54090fa1f5fdd18a8e6b9" + } + } + }, + "20211208-stable-phantom-pool": { + "StablePhantomPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],uint256,address)": "0x4661be5958d49f2da7605eb2c0a30a732295eb8789629f2b4688f865ef9e54b0" + } + }, + "StablePhantomPool": { + "useAdaptor": false, + "factoryOutput": "0xd997f35c9b1281b82c8928039d14cddab5e13c20", + "actionIds": { + "setAssetManagerPoolConfig(address,bytes)": "0xe81fd208be056efa0b46ec592476cb6961cda6e45eb5fa7dc44d0ece445bee36", + "setPaused(bool)": "0xbdac75576424959cffc7f91ec4674a05fd1c62bedcbcbce9dab046c58c881950", + "setSwapFeePercentage(uint256)": "0x36e042f590f2c5d0d8959cc373c8b1681f70f84e9656be8dd0eae652e01de4eb", + "setTokenRateCacheDuration(address,uint256)": "0xe4814396e9db5314024c424f43d6a129829efad6c545df373b226431cbcadbd3", + "startAmplificationParameterUpdate(uint256,uint256)": "0xfe1bd34ab8503474f86b5b36c5ea3e3575d3f1ea45eb1fb759b91b5cc4eac1e1", + "stopAmplificationParameterUpdate()": "0x4f37434f57ce76a752b6a952570d046ec875f494e05243dab1f3c92f673d0cb2", + "updateCachedProtocolSwapFeePercentage()": "0xc48a17424b6d527a0b4f030e4df5e7eff52b4aae6f76a306b55f91c27cccc1c2", + "updateTokenRateCache(address)": "0x1cb934b52b3cf6cb3594cc25b72e1d6861cd41e4fc12bb5f10bfa52b10fa170e" + } + } + }, + "20220325-bal-token-holder-factory": { + "BALTokenHolderFactory": { + "useAdaptor": true, + "actionIds": { + "create(string)": "0x7e2a611da0e37d29a1311cfd160515e281fa0f10786532d2e1e9edbf6dc2cf25" + } + } + }, + "20220325-balancer-token-admin": { + "BalancerTokenAdmin": { + "useAdaptor": false, + "actionIds": { + "activate()": "0x96932b9555c49f1a3a7fb90d4b1ea803f16e02e14a6b942202a84e5f6b65d5c4", + "futureEpochTimeWrite()": "0xacec8794d76ea5ac05e70cc226ec08ab372e5c2f91d03bf812d6d477bce2fc55", + "future_epoch_time_write()": "0x0d053a6eb924c2f3101bbfb858515595f6c7bf9744b42585e184d63e0215ca3b", + "mint(address,uint256)": "0xdddd30813da50fda5faba482fd2937d0c6165d2faf027d3dfbd1554f3d7d47ff", + "snapshot()": "0xd16ddeeb857bd4a971b77edc25dce4c97464c7037c6f19031efbdd5aa020a982", + "startEpochTimeWrite()": "0x7d0e96f9537a6548c968d9cdd0ca4c587d4200eb6ca086ae6e06a2239888c8fa", + "start_epoch_time_write()": "0x743a33bed996bd473f43b7e6e7a2664fadae00e210998d7f6d10105ba0029e92", + "updateMiningParameters()": "0x805045d11a7322c048bac41e9109e7626cd55848c9692280004e1fd415f02b03", + "update_mining_parameters()": "0x549e45fa6aa6cd42bb228ec77c4371112ca8fe7a82e8578ec45667e6e19f69f9" + } + } + }, + "20220325-gauge-adder": { + "GaugeAdder": { + "useAdaptor": false, + "actionIds": { + "addArbitrumGauge(address)": "0x72c4c054ad03b4f5f0ba716c30d74c6f27fafb105c850cb59e2b6fec32a42f2f", + "addEthereumGauge(address)": "0x5dce9596402d216d8b1fa2b9f8e18b0dc1b5c81f96e0827c6cc83eba6e2205d4", + "addGaugeFactory(address,uint8)": "0xe7e04566e98397eb5971a061d01c547d4426ac0ad65a48c60b2e99c4e0b603f5", + "addPolygonGauge(address)": "0xeb223764963bceacbb06d72a3697801c2460ddf95b2ec410d2641d69249d466f" + } + } + }, + "20220325-gauge-controller": { + "VotingEscrow": { + "useAdaptor": true, + "actionIds": { + "apply_smart_wallet_checker()": "0x362c40676152e5e365b673f8e0f21d42b9b21cb4e590a31bffe9702e28daf57f", + "checkpoint()": "0x3f63974a377ba4713661ede455bceda6686a0395f8b8ed8701ad1f13bb926c4d", + "commit_smart_wallet_checker(address)": "0x673e197e292370881f837a2629e6b9465a718919e834c0439bf0a6b5a99208d7", + "create_lock(uint256,uint256)": "0x7a65d2571a863338b6b67133d16a6f34d2f6f767d68b2075a17d2cb55829f4e0", + "deposit_for(address,uint256)": "0xcc4fe236aef84d8f5b767aeec407a9b7044820a84bc36f4ad1fc5ed77242431f", + "increase_amount(uint256)": "0x3e8c85a5e48c26d1099ad7f7b0536350ba17a692f1ad7521c38da216bc15df16", + "increase_unlock_time(uint256)": "0x3500a199bdb45f136f1d405ca92cb75123068aee4b48b8b9619411ed54774925", + "withdraw()": "0xfd3d28da2c60bed3a295d0fbf7ace73209538ecae675345a2cbb8cea86230961" + } + }, + "GaugeController": { + "useAdaptor": true, + "actionIds": { + "add_gauge(address,int128)": "0xf49d7ffb5922642adc9f29cfb52b2214e81e0b0e54e9cd1e9f70439f0011f368", + "add_gauge(address,int128,uint256)": "0x4815e18447bbe865d37590f7139c1d33834daae29c0237713c830abd39138f2a", + "add_type(string)": "0xf2ee0d27f2db1beff84c982e994a8c6c7e084d634c0340c962ea5cd955ce4ad8", + "add_type(string,uint256)": "0x7fe04d1c717433ce5bbdf785d6e90266f2bae99766c9d503ff47cec967167136", + "change_gauge_weight(address,uint256)": "0x82d0eebdd5af3f70be16f2783cfd8e46f5b69b3850b32e51754850dd2803cd75", + "change_type_weight(int128,uint256)": "0x12f9e00ab442287a40f2a49944d8ccc3ecfe7182b318de57a2045d3506e570e5", + "checkpoint()": "0x3f63974a377ba4713661ede455bceda6686a0395f8b8ed8701ad1f13bb926c4d", + "checkpoint_gauge(address)": "0x6ed13b7fb8b0936628e6ae340d3e5ad9c3ad27e64a7fee414b9b8cef97102da8", + "gauge_relative_weight_write(address)": "0xaa74ccbe29682daa9559b762def411f38ca755385d4e978d7f0bc4f681bc9e7d", + "gauge_relative_weight_write(address,uint256)": "0x96bfa427f948d89377ef175ce011d6f2797e337e3dc95f0cf674fb0f61183ac4", + "vote_for_gauge_weights(address,uint256)": "0x4786dd5b560a739b32a5e34ac232376398604980243f61664e5d1d7e9d0896e0", + "vote_for_many_gauge_weights(address[8],uint256[8])": "0x84b506057644d8fba8915c2061e09653f8d5a336015d912cd60c5ff9a48d9701" + } + }, + "BalancerMinter": { + "useAdaptor": true, + "actionIds": { + "mint(address)": "0x4b99b4c639246e5f40ee15ce22303dc04dfcce701efc6ae2c4f7c32b1443917e", + "mintFor(address,address)": "0xbf6ea21000214e3cc31ebda92637bd5200364323a5778bc72c4482a9d219ccbc", + "mintMany(address[])": "0x18ecba24ca8f9b10e3994ebfe0a2a6424857ef579608307b847215fcb61257f7", + "mintManyFor(address[],address)": "0xcb2f2be152fe893a409091099320600046107553c30d3e1bc40973b0c548a446", + "mint_for(address,address)": "0x7ea169e78a61bd50b57b3abf2205a2267fe5074a2c4a7ea399d25b392a3a1b4c", + "mint_many(address[8])": "0xdee4dd02f4eee8cea0144fc659b727664862677023a9593e82171efc526cd28d", + "setMinterApproval(address,bool)": "0xf531d3bbe8603698363ff6180c4053280b563202830610d50354822ad0f75a21", + "setMinterApprovalWithSignature(address,bool,address,uint256,uint8,bytes32,bytes32)": "0x489e15b1ce5814f173be8a6b43d0bfd46a22516131efc5ea7c93790b926362e3", + "toggle_approve_mint(address)": "0xf0f283eff4307a699fbc54a666dd8b9dfe4afcb685416680b53c8518d3901dc7" + } + } + }, + "20220325-mainnet-gauge-factory": { + "LiquidityGaugeV5": { + "useAdaptor": true, + "actionIds": { + "add_reward(address,address)": "0x3bf29175652a3f0fac5abb715d0b7fe2e7b597e2e2eff555dac6b21a20a7c83e", + "claim_rewards()": "0xa1fcfa4f107b70052cfbb2e460d99c96f9b18c1197671fe00ab59c32adcddbeb", + "claim_rewards(address)": "0x1c866c9ea7b119a642f593024ced6088dbde65d041e5d3e826b9ad49b949a64b", + "claim_rewards(address,address)": "0x17b18f02fd5498a6aba17d20977b1a8a08f888d821999613fee42f9f9acb0bd9", + "claimable_tokens(address)": "0x507b520ac43f322b79e43a63eaa5b80ca89ac2c5b63970fa4b6242a23a9e8aa2", + "deposit(uint256)": "0x514b6f05525a3f31c3bde60d063e91e88204c5cdc5b35934513f911943b97fcc", + "deposit(uint256,address)": "0x360a8a15589674642b2125956d96757fc2f06ff1b968333271de16a20e01df05", + "deposit(uint256,address,bool)": "0x7572a9d124a97112d9e0f610651c79f13cf257bea3a71e38663b8a23875a2241", + "deposit_reward_token(address,uint256)": "0xb70966c80d8727484d7d85b65c022ce136cadffc1aa72bd6362cd9e160598bf9", + "initialize(address)": "0x7cd4c1de57fa031316e3b61c1bca9160d4feb774986a819a7c4c04dc66d7d21e", + "kick(address)": "0x5d4f8bc2dd6ae588be27076524fbf4fc2a833c466ab107fda2e84bf2f59bc0ca", + "killGauge()": "0xec1d467d9ab03a0079c22a89037209f5763aec973897ea763e2cf25d71a5f12e", + "set_reward_distributor(address,address)": "0xd0090a09f425bba74e6c801fba7c6d15b44147ab0bd319e40076ce07e95168b6", + "set_rewards_receiver(address)": "0x1b288a1f96e75e2fda7a0c1ac5c35a7fd2c5e2e5c425c32152ae01f82545e2da", + "unkillGauge()": "0x076e9815202aa39577192023cfa569d6504b003183b2bc13cd0046523dfa23ea", + "user_checkpoint(address)": "0x3aaa120451be1d03b5f871d8f553636453af4ac4fed808c66c169c212b199436", + "withdraw(uint256)": "0xec9d6185ed79aed8edc19bc6fc25ca544504ab0970d25b191e5279100224502a", + "withdraw(uint256,bool)": "0xb69fa1eb7b5ac6d9f3d5b8707460dc80b1f871eb64473f46b1aaaed1002aec60" + } + }, + "LiquidityGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address)": "0xaa40669e74603d8e708eac95e60f78c35d5af4f59afdb700675f38c6534809f7" + } + } + }, + "20220325-single-recipient-gauge-factory": { + "SingleRecipientGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address)": "0xaa40669e74603d8e708eac95e60f78c35d5af4f59afdb700675f38c6534809f7" + } + }, + "SingleRecipientGauge": { + "useAdaptor": true, + "actionIds": { + "checkpoint()": "0x3f63974a377ba4713661ede455bceda6686a0395f8b8ed8701ad1f13bb926c4d", + "initialize(address)": "0x7cd4c1de57fa031316e3b61c1bca9160d4feb774986a819a7c4c04dc66d7d21e", + "killGauge()": "0xec1d467d9ab03a0079c22a89037209f5763aec973897ea763e2cf25d71a5f12e", + "unkillGauge()": "0x076e9815202aa39577192023cfa569d6504b003183b2bc13cd0046523dfa23ea" + } + } + }, + "20220325-ve-delegation": { + "VotingEscrowDelegation": { + "useAdaptor": true, + "actionIds": { + "batch_cancel_boosts(uint256[256])": "0x7361fe0e46cb276b41a98d4cd9737cc306ad42ab0b7acc664d99a8b0d4abc452", + "batch_set_delegation_status(address,address[256],uint256[256])": "0xcd3fec4da938be5771576fbd5ed3c07305517a176aad2a4257eda4a558c0ac27", + "burn(uint256)": "0xc82564c94b7d050939678c3432d24cc0bd077332b2831096f1a13bddf76cd4ea", + "cancel_boost(uint256)": "0x482e4412b4beb34200f82812026fbaa4f0cb609d547edabc2983bfdc89ddedcd", + "create_boost(address,address,int256,uint256,uint256,uint256)": "0xce9c580a1e3377595db533643f032e9d7bf9544e31d696c48a16e797fa82d5ce", + "extend_boost(uint256,int256,uint256,uint256)": "0x2f8a062f8344cfe8574e9e6c67d0f3748802f02a2af653df71d38fb8ebd0bdde", + "setApprovalForAll(address,bool)": "0x5082362308cf6060c96bdc9e34bcef0083316c7ea918f43666dccae67654e0d0", + "set_base_uri(string)": "0xeb64a3bdaa01387bfd7d1ce9cdddd6dbace525fca48858752f25b9bd5593a094", + "set_delegation_status(address,address,bool)": "0x6c714a4a280d2590fd368ce54a96f8d00d5e1c39e055865d883d61c3c9ebd1c5" + } + }, + "VotingEscrowDelegationProxy": { + "useAdaptor": false, + "actionIds": { + "killDelegation()": "0xed06749120ed28db0c65713005c016309499b1e45241675b64e14f1c6fb2dc1b", + "setDelegation(address)": "0xac0fcdc4520d7bde1c58bbefd7c8dd39aaf382a20c27991134c14fe63d2c96f3" + } + } + }, + "20220325-veBAL-deployment-coordinator": { + "veBALDeploymentCoordinator": { + "useAdaptor": true, + "actionIds": { + "performFirstStage()": "0xfae7a7297ab00ab24fb5a8c8b6dc308f1313e04bcfb997828c66cbed13627ea1", + "performSecondStage()": "0x8590f6c87bdb4c6e318a57ac14cfd44d71eafd37a1231eebe4d2bebe289fc705", + "performThirdStage()": "0x0aad00acf36dd9648dc9f83caf2ec248cf656efa6f2c593df6b7bf3a41082fbe" + } + } + }, + "20220413-arbitrum-root-gauge-factory": { + "ArbitrumRootGaugeFactory": { + "useAdaptor": false, + "actionIds": { + "create(address)": "0x91f73138418e304f7c24e6d7e831c4d7e51d2b871a14fe25d3a8e7b1365f6515", + "setArbitrumFees(uint64,uint64,uint64)": "0x8b2c6767a8c426408240798cd82acf7ba6091320da176d0b1ab39e99fd5c409d" + } + }, + "ArbitrumRootGauge": { + "useAdaptor": true, + "actionIds": { + "checkpoint()": "0x3f63974a377ba4713661ede455bceda6686a0395f8b8ed8701ad1f13bb926c4d", + "initialize(address)": "0x7cd4c1de57fa031316e3b61c1bca9160d4feb774986a819a7c4c04dc66d7d21e", + "killGauge()": "0xec1d467d9ab03a0079c22a89037209f5763aec973897ea763e2cf25d71a5f12e", + "unkillGauge()": "0x076e9815202aa39577192023cfa569d6504b003183b2bc13cd0046523dfa23ea" + } + } + }, + "20220413-polygon-root-gauge-factory": { + "PolygonRootGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address)": "0xaa40669e74603d8e708eac95e60f78c35d5af4f59afdb700675f38c6534809f7" + } + }, + "PolygonRootGauge": { + "useAdaptor": true, + "actionIds": { + "checkpoint()": "0x3f63974a377ba4713661ede455bceda6686a0395f8b8ed8701ad1f13bb926c4d", + "initialize(address)": "0x7cd4c1de57fa031316e3b61c1bca9160d4feb774986a819a7c4c04dc66d7d21e", + "killGauge()": "0xec1d467d9ab03a0079c22a89037209f5763aec973897ea763e2cf25d71a5f12e", + "unkillGauge()": "0x076e9815202aa39577192023cfa569d6504b003183b2bc13cd0046523dfa23ea" + } + } + }, + "20220415-veBAL-L2-gauge-setup-coordinator": { + "veBALL2GaugeSetupCoordinator": { + "useAdaptor": true, + "actionIds": { + "performFirstStage()": "0xfae7a7297ab00ab24fb5a8c8b6dc308f1313e04bcfb997828c66cbed13627ea1", + "performSecondStage()": "0x8590f6c87bdb4c6e318a57ac14cfd44d71eafd37a1231eebe4d2bebe289fc705" + } + } + }, + "20220418-veBAL-gauge-fix-coordinator": { + "veBALGaugeFixCoordinator": { + "useAdaptor": true, + "actionIds": { + "performFirstStage()": "0xfae7a7297ab00ab24fb5a8c8b6dc308f1313e04bcfb997828c66cbed13627ea1" + } + } + }, + "20220420-fee-distributor": { + "FeeDistributor": { + "useAdaptor": true, + "actionIds": { + "checkpoint()": "0x3f63974a377ba4713661ede455bceda6686a0395f8b8ed8701ad1f13bb926c4d", + "checkpointToken(address)": "0x84f74b497b7b8786ad28575751bcba78a869980750e3e59d9f753ecd753e7d50", + "checkpointTokens(address[])": "0x7e339947ebceb8dcc3475abfefba6050fd835e6d1eff9b9e9678e810d369682e", + "checkpointUser(address)": "0x9ccd42be79895ab5d68baf1ceb99044358d23c13dc7fd911b5af3d528ee8da8c", + "claimToken(address,address)": "0x3f0bd81e3d4307c9d877450060e9f456cdce2cd0dcc13c55435ca418fad441af", + "claimTokens(address,address[])": "0x2a02b42776ae382b5868eddf4a925d0eec90785dde1a5d48aaa55cd7cb9cf37a", + "depositToken(address,uint256)": "0xdf028848b388713ac0b5fd66beb36b7e230fb62844ad43ed9e894034570ecb71", + "depositTokens(address[],uint256[])": "0x683bdec204c4a35996ebfb23eea0f4f62343598147ef9bf5a43fabbd0e9ed8d0" + } + } + }, + "20220420-smart-wallet-checker": { + "SmartWalletChecker": { + "useAdaptor": false, + "actionIds": { + "allowlistAddress(address)": "0x453b670b2708db1ba5df1da1d48add0564558624efac456e43e9c9fff99d51af", + "denylistAddress(address)": "0x43cd68bd7db0472f3fac100d3f402a603c8ab62e816feff20dbe3ec6c6e61b89" + } + } + }, + "20220421-smart-wallet-checker-coordinator": { + "SmartWalletCheckerCoordinator": { + "useAdaptor": true, + "actionIds": { + "performFirstStage()": "0xfae7a7297ab00ab24fb5a8c8b6dc308f1313e04bcfb997828c66cbed13627ea1" + } + } + }, + "20220513-double-entrypoint-fix-relayer": { + "DoubleEntrypointFixRelayer": { + "useAdaptor": true, + "actionIds": { + "exitBTCStablePool()": "0xc3c57d80acf8fa377fb865720f7ee10ad4aca7109b303fbb71d2908ca6844744", + "exitSNXWeightedPool()": "0xe6817433212f634fbe74775c5a6d479ff55bb4cada528cc35724754b3e5d9bf7", + "receiveFlashLoan(address[],uint256[],uint256[],bytes)": "0x6d9f128845c731272c63ac23b090d6ac72ef10b7eb6e4c5eb279bebf0e7b5c59", + "sweepDoubleEntrypointToken(address[])": "0x08538fe199982f8b4355d4f2bdb1394308786ab97d5f72629add67d66fd516c5", + "sweepSNXsBTC()": "0x1961e53f2732b026e902916369409c15c33ad87401cb826c58c3ef5ee3544dd2" + } + } + }, + "20220517-protocol-fee-withdrawer": { + "ProtocolFeesWithdrawer": { + "useAdaptor": false, + "actionIds": { + "allowlistToken(address)": "0x64676378163864956da1a2c55238f9af1e66855685e9c35cc521066b55f468c4", + "denylistToken(address)": "0xa5a62b55fdf9496f8e1b3feba479423a4349b385bd444f893b3cd4cf9387ce3f", + "withdrawCollectedFees(address[],uint256[],address)": "0x826ac7ce861f2a54e071e6c724653757fdd1259804eb1ca7f040aa1cd09923fe" + } + } + }, + "20220530-preseeded-voting-escrow-delegation": { + "PreseededVotingEscrowDelegation": { + "useAdaptor": true, + "actionIds": { + "batch_cancel_boosts(uint256[256])": "0x7361fe0e46cb276b41a98d4cd9737cc306ad42ab0b7acc664d99a8b0d4abc452", + "batch_set_delegation_status(address,address[256],uint256[256])": "0xcd3fec4da938be5771576fbd5ed3c07305517a176aad2a4257eda4a558c0ac27", + "burn(uint256)": "0xc82564c94b7d050939678c3432d24cc0bd077332b2831096f1a13bddf76cd4ea", + "cancel_boost(uint256)": "0x482e4412b4beb34200f82812026fbaa4f0cb609d547edabc2983bfdc89ddedcd", + "create_boost(address,address,int256,uint256,uint256,uint256)": "0xce9c580a1e3377595db533643f032e9d7bf9544e31d696c48a16e797fa82d5ce", + "extend_boost(uint256,int256,uint256,uint256)": "0x2f8a062f8344cfe8574e9e6c67d0f3748802f02a2af653df71d38fb8ebd0bdde", + "preseed()": "0x309fcfd1a0ff2f78ea637d18cad11ac7949e25a09f2d7c5b69b9d4cce2cdb745", + "setApprovalForAll(address,bool)": "0x5082362308cf6060c96bdc9e34bcef0083316c7ea918f43666dccae67654e0d0", + "set_base_uri(string)": "0xeb64a3bdaa01387bfd7d1ce9cdddd6dbace525fca48858752f25b9bd5593a094", + "set_delegation_status(address,address,bool)": "0x6c714a4a280d2590fd368ce54a96f8d00d5e1c39e055865d883d61c3c9ebd1c5" + } + } + }, + "20220609-stable-pool-v2": { + "StablePool": { + "useAdaptor": false, + "factoryOutput": "0x2d011aDf89f0576C9B722c28269FcB5D50C2d179", + "actionIds": { + "disableRecoveryMode()": "0x79819a7971b1e9f195beb8386adb931d405f6f037b2c0c6ac955e68569c01128", + "enableRecoveryMode()": "0xe677a5af244fbd50b51cf114dd0bdbf7b73c262382c7704c359c6c2148820d33", + "pause()": "0xcd7e0ee0107ef7cac4d00d3821101a9ba6f02158f7f4dd52693e82ad3c91e918", + "setAssetManagerPoolConfig(address,bytes)": "0xb4f5d67533236074d36881d864a2800bfe93f13921d54c1fd373894c4832a0df", + "setSwapFeePercentage(uint256)": "0xcf5e03a737e4f5ba6d13e23f893a1e0255b362d8ce22e9568e1565fcf92789c7", + "startAmplificationParameterUpdate(uint256,uint256)": "0xcad4ec1d64970817394bee6f75af4645fb72ba5b88902c4c155ce82aab0a3a5a", + "stopAmplificationParameterUpdate()": "0xe5a9dede86018292d3cd547db825db489579eedbf2eebd3694ab93e912c1fae5", + "unpause()": "0x07b4fb5e12466b66136a430edadfe74892e0cbfc410f6268a2d1d24cc09a6e05" + } + } + }, + "20220404-erc4626-linear-pool-v2": { + "ERC4626LinearPool": { + "useAdaptor": false, + "factoryOutput": "0xb0F75E97A114A4EB4a425eDc48990e6760726709", + "actionIds": { + "initialize()": "0x9b2fa0d42c19f1dc95f6e44002978e37339777d7e71fd3d42a4066d93e4deb5e", + "setAssetManagerPoolConfig(address,bytes)": "0x3baef9657cec1bbb4fd4445b46071a8428aaaef07e20c5527f19835a3951a1d7", + "setPaused(bool)": "0x454e3e323a395178b43f22b136dc1c2c25f3f193c11a944ce3de9a1b1f9f3389", + "setSwapFeePercentage(uint256)": "0x26d5c069f3666699e0fe94626b94bf5bc2a311d3265e773c4a81c9a12c9731ca", + "setTargets(uint256,uint256)": "0x742dd28e4a604e9a5a791e1708221230de313f7fdf28172ebd4f8e8d3407b1e8" + } + } + }, + "20220628-gauge-adder-v2": { + "GaugeAdder": { + "useAdaptor": false, + "actionIds": { + "addArbitrumGauge(address)": "0x82c7bc265be8c8190319e29a314f8c32e62b98bbc9c39defff06a42b34557191", + "addEthereumGauge(address)": "0x77238124388523487417c8ad8cec25726833e50ca5cab74a4924470fee49ae5d", + "addGaugeFactory(address,uint8)": "0xaf9696666cd7f5e2ffb6abcf1a60f195cf8c7a99e7c63db98d14948fd4855f06", + "addGnosisGauge(address)": "0x54fb09230d22d562ca08f02012ba6c83735ceca23da387a85969e1d8602e6209", + "addOptimismGauge(address)": "0xc63b7b73283233470a85ad7ec28f772b7571c0f6ba90d506999809c2e25a7da6", + "addPolygonGauge(address)": "0x5c62111a5fb2cd09521d2805fb5080f8db7f341691a1e38c34a5ededb8f8bfd3", + "addZKSyncGauge(address)": "0xa4316d4b75fe3bdf53b4f8d8251adb2dc5e213f09a2ece3c11e0726fb1799063" + } + } + }, + "20220628-optimism-root-gauge-factory": { + "OptimismRootGaugeFactory": { + "useAdaptor": false, + "actionIds": { + "create(address)": "0xa2882493d12953b0ba758d53f8f10e58edabb8ce768788c41b8754d9d7b3e9d8", + "setOptimismGasLimit(uint32)": "0xc89b780137460c1010bc938658c3b615990dd348e27ff1d095be12e6fe617f64" + } + }, + "OptimismRootGauge": { + "useAdaptor": true, + "actionIds": { + "checkpoint()": "0x3f63974a377ba4713661ede455bceda6686a0395f8b8ed8701ad1f13bb926c4d", + "initialize(address)": "0x7cd4c1de57fa031316e3b61c1bca9160d4feb774986a819a7c4c04dc66d7d21e", + "killGauge()": "0xec1d467d9ab03a0079c22a89037209f5763aec973897ea763e2cf25d71a5f12e", + "unkillGauge()": "0x076e9815202aa39577192023cfa569d6504b003183b2bc13cd0046523dfa23ea" + } + } + }, + "20220707-distribution-scheduler": { + "DistributionScheduler": { + "useAdaptor": true, + "actionIds": { + "scheduleDistribution(address,address,uint256,uint256)": "0x78b9d18aecaef104543c2c0a83f669b307a2caf6916e3f67db526200ff23dadc", + "startDistributionForToken(address,address)": "0x0beb101788410c70b157a708569fb30c6f34e8fe821fa8b574dd0cef1900045b", + "startDistributions(address)": "0x37818fdb4cb8ffb00dd0ad7286a89f1d12a83269d7af8eb6f915140403fc8f04" + } + } + }, + "20220714-fee-distributor-v2": { + "FeeDistributor": { + "useAdaptor": true, + "actionIds": { + "checkpoint()": "0x3f63974a377ba4713661ede455bceda6686a0395f8b8ed8701ad1f13bb926c4d", + "checkpointToken(address)": "0x84f74b497b7b8786ad28575751bcba78a869980750e3e59d9f753ecd753e7d50", + "checkpointTokens(address[])": "0x7e339947ebceb8dcc3475abfefba6050fd835e6d1eff9b9e9678e810d369682e", + "checkpointUser(address)": "0x9ccd42be79895ab5d68baf1ceb99044358d23c13dc7fd911b5af3d528ee8da8c", + "claimToken(address,address)": "0x3f0bd81e3d4307c9d877450060e9f456cdce2cd0dcc13c55435ca418fad441af", + "claimTokens(address,address[])": "0x2a02b42776ae382b5868eddf4a925d0eec90785dde1a5d48aaa55cd7cb9cf37a", + "depositToken(address,uint256)": "0xdf028848b388713ac0b5fd66beb36b7e230fb62844ad43ed9e894034570ecb71", + "depositTokens(address[],uint256[])": "0x683bdec204c4a35996ebfb23eea0f4f62343598147ef9bf5a43fabbd0e9ed8d0", + "setOnlyCallerCheck(bool)": "0x8d64b78bf73ff6f57b6c2db19905917825de771752190fd9d99d852acfa360eb", + "setOnlyCallerCheckWithSignature(address,bool,bytes)": "0x54b5a7c13c04005e425e936705297503e6c8d31f1413b2763d27845ef03eb0d1" + } + } + }, + "20220721-gauge-adder-migration-coordinator": { + "GaugeAdderMigrationCoordinator": { + "useAdaptor": false, + "actionIds": { + "performNextStage()": "0x945b1637627fa36f3bb618b74050045ffa67875ffd8acd04f5135f3463ab9880", + "registerStages()": "0x08900d9a13d156ace75a5694772406e876e8f8f25d35af7a7639c1a95a2c2689" + } + } + }, + "20220725-protocol-fee-percentages-provider": { + "ProtocolFeePercentagesProvider": { + "useAdaptor": false, + "actionIds": { + "registerFeeType(uint256,string,uint256,uint256)": "0xea4fb97482a3b85cb09eec586a19d8312e0b7694206008dd04f50c0f4b3d10eb", + "setFeeTypePercentage(uint256,uint256)": "0x4907aec017cb19a28528e722251b40fd7c5eadd4f4a0f0c6a9bca9888f8a0b7f" + } + } + }, + "20220817-aave-rebalanced-linear-pool": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address)": "0x51edc015a97c77d2c943f6978e18733b906a87e178cc693613bd3171069d69d6", + "disable()": "0x3e267929c3c1127f9bceabc2030c138022fba40f8c0a47c9407fe74e2d026aaa" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x82698aeCc9E28e9Bb27608Bd52cF57f704BD1B83", + "actionIds": { + "disableRecoveryMode()": "0x09ba2d4d28952dd802d9ac8a44ec23d3f4d96756f0cf8dd889bdffa83c63963e", + "enableRecoveryMode()": "0xd6a9f64d81e7c22127c3fb002e0a42508528898232c353fc3d33cd259ea1de7b", + "initialize()": "0x0d60b3f7a47a5582726287b6c2c3358ca12edbd21c3a3e369faf41370887302f", + "pause()": "0x8d329099a8220fbd27ff3cf304a4cb1dae32335654ec5115c3a643ac0e623418", + "setAssetManagerPoolConfig(address,bytes)": "0x3b15b07b96fc9ab0d0063b41c23ad482cf211b4a5e62d36af4fa9cb6c02af23d", + "setSwapFeePercentage(uint256)": "0x7fad14fae895c80a37148957909942740cfbc0ddc5676b975d9893577ba7cd17", + "setTargets(uint256,uint256)": "0xef008574ca41f2b6033a54a73ad6adc382165acd85b6f76f8456d9946b299a16", + "unpause()": "0xa738fa584fff6afe4e319db36f7f5270924047e5e2c04a1712cbfc082e3fd078" + } + } + }, + "20220906-composable-stable-pool": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address)": "0x323e14d201c95908670514e1b31e5c4a1fbe96478900e001291ed51dcb188be8", + "disable()": "0x01ee3a6016d5465e99b86344d2748c65cf0a9ac3f45aab103f59f5d3864d5f74" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0xa13a9247ea42d743238089903570127dda72fe44", + "actionIds": { + "disableRecoveryMode()": "0xdcae01a1d3143e115458cda9b816ea278dd5daf08d9b6d3ec668632aa7b82dad", + "enableRecoveryMode()": "0xf6ef25118c39f2bdb1d07df32f8b885c2bb50bddc0ab9594195de1e669da06c1", + "pause()": "0xc0d91e75884e4ce70f827133990e1c6ee501b41ad3096d25bce3c04d2976c3e7", + "setAssetManagerPoolConfig(address,bytes)": "0x79a7ec1a52f9874cd67b3ba064ae7675db5c7a905968a068e6fedb1e53382a71", + "setSwapFeePercentage(uint256)": "0x6c3a14f10cbcc5a3f4d0e4e8ad279e7a842735ab188e2b13fb84c6542cc3320c", + "setTokenRateCacheDuration(address,uint256)": "0x950f47d4c7cbd9a3b68b5ab354673981827bd5e9a7b8e5cf4057f8bd547b675f", + "startAmplificationParameterUpdate(uint256,uint256)": "0xf27148d3f1da6319bd754a52acd00b2fc3fa6474241d2398c6d58e8ac0cd9539", + "stopAmplificationParameterUpdate()": "0xc30e3272c4933a085c95b84fca44f1a9b3d43e3e560b7b1fac0a6b2c9bbda16f", + "unpause()": "0x84163b5cca492497c5fa264018819677910a8022689972cc54566d8667dbce68", + "updateProtocolFeePercentageCache()": "0x577eed395ca31adf7bd415fe3e820cf74f6220b3eaad0d25c56780303f1c9b7b", + "updateTokenRateCache(address)": "0xc60ed6691a5c9c103fca904c28e9e77fe4e1c4ec5ea2f8839e367d47ab7b6c3f" + } + } + }, + "20220822-mainnet-gauge-factory-v2": { + "LiquidityGaugeV5": { + "useAdaptor": true, + "actionIds": { + "add_reward(address,address)": "0x3bf29175652a3f0fac5abb715d0b7fe2e7b597e2e2eff555dac6b21a20a7c83e", + "claim_rewards()": "0xa1fcfa4f107b70052cfbb2e460d99c96f9b18c1197671fe00ab59c32adcddbeb", + "claim_rewards(address)": "0x1c866c9ea7b119a642f593024ced6088dbde65d041e5d3e826b9ad49b949a64b", + "claim_rewards(address,address)": "0x17b18f02fd5498a6aba17d20977b1a8a08f888d821999613fee42f9f9acb0bd9", + "claimable_tokens(address)": "0x507b520ac43f322b79e43a63eaa5b80ca89ac2c5b63970fa4b6242a23a9e8aa2", + "deposit(uint256)": "0x514b6f05525a3f31c3bde60d063e91e88204c5cdc5b35934513f911943b97fcc", + "deposit(uint256,address)": "0x360a8a15589674642b2125956d96757fc2f06ff1b968333271de16a20e01df05", + "deposit(uint256,address,bool)": "0x7572a9d124a97112d9e0f610651c79f13cf257bea3a71e38663b8a23875a2241", + "deposit_reward_token(address,uint256)": "0xb70966c80d8727484d7d85b65c022ce136cadffc1aa72bd6362cd9e160598bf9", + "initialize(address,uint256)": "0xa7eb8749bae4020b0007b643972b60456da2b6b92fa6b583c7277fc2dea05a39", + "kick(address)": "0x5d4f8bc2dd6ae588be27076524fbf4fc2a833c466ab107fda2e84bf2f59bc0ca", + "killGauge()": "0xec1d467d9ab03a0079c22a89037209f5763aec973897ea763e2cf25d71a5f12e", + "setRelativeWeightCap(uint256)": "0xae60dce27f51ce5815357b9f6b40f200557867f8222262a1646c005d09b7dfba", + "set_reward_distributor(address,address)": "0xd0090a09f425bba74e6c801fba7c6d15b44147ab0bd319e40076ce07e95168b6", + "set_rewards_receiver(address)": "0x1b288a1f96e75e2fda7a0c1ac5c35a7fd2c5e2e5c425c32152ae01f82545e2da", + "unkillGauge()": "0x076e9815202aa39577192023cfa569d6504b003183b2bc13cd0046523dfa23ea", + "user_checkpoint(address)": "0x3aaa120451be1d03b5f871d8f553636453af4ac4fed808c66c169c212b199436", + "withdraw(uint256)": "0xec9d6185ed79aed8edc19bc6fc25ca544504ab0970d25b191e5279100224502a", + "withdraw(uint256,bool)": "0xb69fa1eb7b5ac6d9f3d5b8707460dc80b1f871eb64473f46b1aaaed1002aec60" + } + } + }, + "20220823-optimism-root-gauge-factory-v2": { + "OptimismRootGauge": { + "useAdaptor": true, + "actionIds": { + "checkpoint()": "0x3f63974a377ba4713661ede455bceda6686a0395f8b8ed8701ad1f13bb926c4d", + "initialize(address,uint256)": "0xa7eb8749bae4020b0007b643972b60456da2b6b92fa6b583c7277fc2dea05a39", + "killGauge()": "0xec1d467d9ab03a0079c22a89037209f5763aec973897ea763e2cf25d71a5f12e", + "setRelativeWeightCap(uint256)": "0xae60dce27f51ce5815357b9f6b40f200557867f8222262a1646c005d09b7dfba", + "unkillGauge()": "0x076e9815202aa39577192023cfa569d6504b003183b2bc13cd0046523dfa23ea" + } + } + }, + "20220823-arbitrum-root-gauge-factory-v2": { + "ArbitrumRootGaugeFactory": { + "useAdaptor": false, + "actionIds": { + "create(address,uint256)": "0x913025a8b073b3bbce553fdc0021545af9dfa573aa8dd3274a1d2dc91a4911b8", + "setArbitrumFees(uint64,uint64,uint64)": "0xd5799f5a62cdbcebada0c4ff21f7a0d82cfc1ad293c79f597c27bd1c03ad100b" + } + }, + "ArbitrumRootGauge": { + "useAdaptor": true, + "factoryOutput": "0x6337949cbC4825Bbd09242c811770F6F6fee9FfC", + "actionIds": { + "checkpoint()": "0x3f63974a377ba4713661ede455bceda6686a0395f8b8ed8701ad1f13bb926c4d", + "initialize(address,uint256)": "0xa7eb8749bae4020b0007b643972b60456da2b6b92fa6b583c7277fc2dea05a39", + "killGauge()": "0xec1d467d9ab03a0079c22a89037209f5763aec973897ea763e2cf25d71a5f12e", + "setRelativeWeightCap(uint256)": "0xae60dce27f51ce5815357b9f6b40f200557867f8222262a1646c005d09b7dfba", + "unkillGauge()": "0x076e9815202aa39577192023cfa569d6504b003183b2bc13cd0046523dfa23ea" + } + } + }, + "20220823-polygon-root-gauge-factory-v2": { + "PolygonRootGauge": { + "useAdaptor": true, + "actionIds": { + "checkpoint()": "0x3f63974a377ba4713661ede455bceda6686a0395f8b8ed8701ad1f13bb926c4d", + "initialize(address,uint256)": "0xa7eb8749bae4020b0007b643972b60456da2b6b92fa6b583c7277fc2dea05a39", + "killGauge()": "0xec1d467d9ab03a0079c22a89037209f5763aec973897ea763e2cf25d71a5f12e", + "setRelativeWeightCap(uint256)": "0xae60dce27f51ce5815357b9f6b40f200557867f8222262a1646c005d09b7dfba", + "unkillGauge()": "0x076e9815202aa39577192023cfa569d6504b003183b2bc13cd0046523dfa23ea" + } + } + }, + "20220908-weighted-pool-v2": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address)": "0xee8ef5aaf155416a3121a48124ddd4f8bf3d48a8e1ba915527b1c80b2fe83077", + "disable()": "0xeae3596b8b5bae060064acf8a71056c6213df46004277a4b87eef8ab5675cbb8" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0x6a5ead5433a50472642cd268e584dafa5a394490", + "actionIds": { + "disableRecoveryMode()": "0xaaad3675a606937790c1c181bde95a1617960fae150a82e7636e44a77df1d842", + "enableRecoveryMode()": "0x55abd0742bbd2833fbad5758d69eacae7376eacf1d04bcdfe8f77321d0673677", + "pause()": "0x8186826062c35b40965262f49014e5ca45b7064fba48b12107613bce22571a99", + "setAssetManagerPoolConfig(address,bytes)": "0x990e6775e1d840c6da5e9cb8073bba1cdcb69edc9311b80b0e4bde8441ebc2bb", + "setSwapFeePercentage(uint256)": "0x78e9adfe5f05d7114a59d0870d78971192f871f57bb36e2aff2edbe75d425844", + "unpause()": "0x0d9dbee65c669ef9d726a603957e4a610b40b2662eba759efbedfe87216ec751", + "updateProtocolFeePercentageCache()": "0x0cf9564bf75d93e4dbfdebc0b29f8ef8bed3f63a500cee9801d9961a8e9a71a5" + } + } + }, + "20221021-managed-pool": { + "ManagedPool": { + "useAdaptor": false, + "factoryOutput": "0x1201FAa7258A48b820619dD57Cd8FdEb25D49b2c", + "actionIds": { + "addAllowedAddress(address)": "0xf785443fce86bf27ac344256af4e7a870b17dd9b85a1ba634118a81960129358", + "addToken(address,address,uint256,uint256,address)": "0x9754fde95162280a890c1ebc7a9ebcbf6af007b58db6ceb49d47c2f5eb9cf6f6", + "collectAumManagementFees()": "0x5a78d18d7b902b65adc6ec3f3d58a3b0549c66e69632adf5f0a0085519422f55", + "disableRecoveryMode()": "0x8b53d43ab61c14ae66239259b7a674da533c4447b6a14aff9ce25edbd5374944", + "enableRecoveryMode()": "0xf86e8300ce0886736fe2c84ad15f478ef766be40dd0b2558c51e21854946395d", + "pause()": "0x12a6d81ce43511e2c59c814fd98e086a91a567ab538799e040230fb960713fc3", + "removeAllowedAddress(address)": "0x862dd6a39314eac3d86ba28a2091ade65f09de9587b52025f9fff7edc78ebd7b", + "removeToken(address,uint256,address)": "0xfad6c172de4d60503b15c54c305cd128a614721cc79886f30d55e73efa8a6602", + "setCircuitBreakers(address[],uint256[],uint256[],uint256[])": "0xce3253c6e7ca8bd5331b5ebf3d6853e9b37d98831343d8edeb128e372f71e3ff", + "setManagementAumFeePercentage(uint256)": "0x68ae8c260ac3cd5a2367369b9938c6875380c20bdc245d6fd60b9d7eb7cdea2d", + "setMustAllowlistLPs(bool)": "0x7631ccb8743edc2b680dc3c96e4114a450030ea774b69aa7042b9edb7d2c6e6b", + "setSwapEnabled(bool)": "0x7da30f23e058a2411b91ae20bed2ce4800f0ff06087c535a053247446092b5d6", + "unpause()": "0xa6f1ef4081cd051cd6294dbc5ac629362d45e5daa4c2fbb03f119556c0712b0e", + "updateProtocolFeePercentageCache()": "0x0bd681d626d8c03f2d98bc37a4f61ce7a31176d46d1f990ab59eee9ad7a2aa77", + "updateSwapFeeGradually(uint256,uint256,uint256,uint256)": "0x9336863d6f3367786d95c0101e4dd59aa92bad26a8918641832ac1a81af52862", + "updateWeightsGradually(uint256,uint256,address[],uint256[])": "0x2fd23b6836b83328c91987f3e547981395f3ee36b5038a2134e448a76b5d97cf" + } + }, + "ManagedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create((string,string,address[],uint256[],address[],uint256,bool,bool,uint256,uint256),address)": "0x01ed6b1d1a76460295cf1325534f6c4bd3fc1f8717cd0cf9733f493a0821da71", + "disable()": "0xa010f28803768154a04542ff29718c73ff40e307b10e5f39fbdff6c90db7b4ec" + } + } + }, + "20221123-pool-recovery-helper": { + "PoolRecoveryHelper": { + "useAdaptor": false, + "actionIds": { + "addPoolFactory(address)": "0xbc33dd383590d6f85727901da00e6971ba3af5561e93a485f41a82a94137cf47", + "enableRecoveryMode(address)": "0x7004ffafae71ebf8ca75d0161b7818dd31e726c2d57bfa02b045adf08e9f8a06", + "removePoolFactory(address)": "0x2ee7ebfa3c3d2e030256ae85768e5434350a58e9284ac5bec2d6b7efa01819e3" + } + } + }, + "20221122-composable-stable-pool-v2": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address)": "0xb885d98b83d2e0ddc9cc87adabc0f64acbdac302d2545aebafdac0c52a43b892", + "disable()": "0x0a35dcf04fdcf4e2119802287b94a1cf758427e74e9bb450cb31af7c660d7735" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x373b347bc87998b151A5E9B6bB6ca692b766648a", + "actionIds": { + "disableRecoveryMode()": "0x85896342da44e8444ef54be6c4643b51c1e23270bb9ec1f0257cd03d72a80cb6", + "enableRecoveryMode()": "0x7d89412e7c8893c1c85589d68187b2ee925cd2d27c10393980897d1fa4346b0a", + "pause()": "0x6e25be22eb210da3359f4afb977d53109dad5ed4801e736bf6c5239e0028bd48", + "setAssetManagerPoolConfig(address,bytes)": "0x9036802291378e3a6933704d0ccba6f3c6729307d244cb77b7f84060cba99269", + "setSwapFeePercentage(uint256)": "0xdee20d81c6075dcc437dbaaf02d316ab255cfcae4a154e04b17abdebc70a5b48", + "setTokenRateCacheDuration(address,uint256)": "0x160a4f83bcc2f584446953fd8adf0bf96e625212ccf66900051418e8d19e7157", + "startAmplificationParameterUpdate(uint256,uint256)": "0xf766fa63021f6e696e70c339ab7246118c3da74fcbf80dbe6d603189209afed7", + "stopAmplificationParameterUpdate()": "0x1c36fdcc08f18f6fb33519d9491400a58c2c03b6f1222f8385cc36e6fb837110", + "unpause()": "0x09f210f1a6e3730856cd101645ba1c0594f63ca6ed48e7768b5421ae698858db", + "updateProtocolFeePercentageCache()": "0x69d8f3e0969c91e7a94fb45518733240410f56ff60cd304fbc5d13a5432ed71f", + "updateTokenRateCache(address)": "0x43e924739082162d0dfbe4b85270de4e7fe29526d812caeaa4797cf243c0bdfa" + } + } + }, + "20221207-aave-rebalanced-linear-pool-v3": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0x40992ae2d77c13a65040d0daeb0d5e687bc43b24edae567157416b200572a84a", + "disable()": "0xe718df4ad5522c83ea7c41eb474c22b1633a63b63398fc1dd156aadd736f240b", + "registerProtocolId(uint256,string)": "0x1fbaa49bd55771ae77b7a4eb7b33359b86e1c7e31b5feb68b3424f0fe16a33fe" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x813E3fE1761f714c502d1d2d3a7CCEB33f37F59D", + "actionIds": { + "disableRecoveryMode()": "0x2b10ec0dbbd35659497c7098afad3cce5283f8f88a7f61b315d8f89cdbb01e94", + "enableRecoveryMode()": "0x2b6d1e52ace885330e9fb8ae5dbc0452c2d858503324de1e21f5a562e577c1bb", + "initialize()": "0x75254669a72089bc0de777829938515525263b804d8e8e84601b0b032b399d5a", + "pause()": "0xf5f9da0b2c7bdd36d75f7aed12f5bf3c762b456216eec5b59d90e3d39b1b2a54", + "setSwapFeePercentage(uint256)": "0xde877a83ca1028d5d97cb32831a9a47c7cd89191ed186056b5d46fd2e1b8da13", + "setTargets(uint256,uint256)": "0x5ad8825215c80ebf073af69356f8884ed25e93885c40281490201de2cc9b17ab", + "unpause()": "0x171c4403310dcf2f5a19d0457d93bf7da5a29be80ee45a3679ac3c87044fe67a" + } + } + }, + "20230109-gauge-adder-v3": { + "GaugeAdder": { + "useAdaptor": false, + "actionIds": { + "addArbitrumGauge(address)": "0xdca97fd0f6129deaed487ba2e3adf2d101e747ebf894b46fdb04bd68d60422d3", + "addEthereumGauge(address)": "0xfaa3c2be9a62d3c8de73be6c928a01c6a72184079459d23038b9e8cfb595c53a", + "addGaugeFactory(address,uint8)": "0x7a5157ce41a8a6bce3e7ae5491c0093d8e6d4b300ead2d30448565adce898f35", + "addGnosisGauge(address)": "0xe818738e338905496f604a2a26c7ca754558870a3810786cfbb89ae28d262dc5", + "addOptimismGauge(address)": "0x5c33d959f965f7cc61c2a953580cba4a6dee2f215ea40204e1e341f78148cc72", + "addPolygonGauge(address)": "0x9f58ae98f000a216e5a453fc8c3d3a3f72618e31af052cefea0990095359181c", + "addZKSyncGauge(address)": "0x010cab59e1860b78f8f67210e267d2c06d77c17b4529f007c7c8acee11ea2fe0" + } + } + }, + "20230206-weighted-pool-v3": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address)": "0xf7f34ca4320c2bad22724cf902cb738bb541e23fb06f1c2810e30bf9084560bb", + "disable()": "0x0df3339673f8356288d97461676bb443e5def15e6d6e8321add702ef77075160" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0x1576d472d82A72a1Ec7C57FcA770BD752D124A62", + "actionIds": { + "disableRecoveryMode()": "0xd1cab845861601849b43df194d75e16c676ee31cf20296f392e9d44dd3793ef3", + "enableRecoveryMode()": "0xa53ffba9aa2195cd7646f9cbaca0985f432bded3dd5319916afc5ec395f280d7", + "pause()": "0x33b06cb79113c1c80d5db0ad41675a5368e7ec0ba8a2fd4d6328524a984d465b", + "setAssetManagerPoolConfig(address,bytes)": "0x0a8f338f2af6dc52cb887f98ac7bbc19ac7a810e444be3bac58ecf5caa7bb61d", + "setSwapFeePercentage(uint256)": "0xd8638fc873fb8c5c0e67c437099a19eb0546fb439dab8babff44196f11d44831", + "unpause()": "0xc91fc6da8a1f3f2f374e4d09d6275e1b0e99c32523edd916c3db8aeebe0c6d05", + "updateProtocolFeePercentageCache()": "0x6a41c5a91e72af66df2f75c388bb150b57556d305ba2ac5b791478870b4b94fb" + } + } + }, + "20230206-composable-stable-pool-v3": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address)": "0xadfda06d5388bdc4b663b995fd3cb0d9a90fb73240c9966b80dbe2254472d67e", + "disable()": "0x3fad985e82b2b68120f2bbe4c05b3bcbb41b29519eaa63fb25cb25833043f1e8" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x222bc81C6F3C17e9e9Aba47a12f55a1Dea42f163", + "actionIds": { + "disableRecoveryMode()": "0xa35b682012cf580f34e9cd41e4bf1c0210b6ebfc1a952fb582842c0e23b8c069", + "enableRecoveryMode()": "0x8c91ddec262ae544d56464e260d0b840239949d86149c139510d5e399a30099f", + "pause()": "0xa4d7ff702c3f830a7ce937a195bfb05c081c0c36a462ed72bfbf721bc5a3f462", + "setAssetManagerPoolConfig(address,bytes)": "0xfc40229f83883177008c2f162e907e89fba038d6f1cb5b64c08d2135a5bb5509", + "setSwapFeePercentage(uint256)": "0x1a88f724f61d4985675e65a2ba85b2a985d250dac00d27e06303f4cdabc906ae", + "setTokenRateCacheDuration(address,uint256)": "0x2d8a0dc8170e2251ed6ab59cc43a981d1e05511d06a8c65226eb06278e3ae231", + "startAmplificationParameterUpdate(uint256,uint256)": "0xe560c24a44460de963ea8e6716dd635144e8c4991c131b63dd9e956b1f1415b8", + "stopAmplificationParameterUpdate()": "0x36e63b457adcc8834537417d275eec404708707f4fbe63097f15e865dc3e2847", + "unpause()": "0xe33a2391eb71810245486b6aaaa199626c6dedcad3511f1708816cf395514713", + "updateProtocolFeePercentageCache()": "0x931f16f28b2fbaf6326d0a498fdb514458b12bc954e28b2f4fd45369e84b9354", + "updateTokenRateCache(address)": "0xa45b3817be69283e48b590151aa33c454f162e520261a3dd248ffee7c58f1020" + } + } + }, + "20230206-aave-rebalanced-linear-pool-v4": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0x3d9db88a550500a75f3d2494ce59e0848720d2362d6e6fe7fac304714d54e1e0", + "disable()": "0x50f3f826f5b6f34e6b9291e41967ce5c8f5cbd998ab8b3f740cf2bb02e2e6ea0" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x331d50e0b00fc1C32742F151E56B9B616227E23E", + "actionIds": { + "disableRecoveryMode()": "0x0462c9b84b87fb6c25d52862b1a17b86e48ee92d7d5a7136304e1195efca03d6", + "enableRecoveryMode()": "0x2bc44d8579fe2d1f63f141dac41a22e6058aafb6bdc0e141d647d08ad50e2b0a", + "initialize()": "0x469e6bee9e3f90ca90d656654a75e13200e3a78ca51a589923cfb451acbde585", + "pause()": "0x4c0e8aa6e2b05a19aefb892998330bff4b68f678770e82ef361d646c908463aa", + "setSwapFeePercentage(uint256)": "0xdc4d63c40d0a7a13b082c0bfcc25b1ad5b79ab783d81da5dca1cdc51c2a64ac6", + "setTargets(uint256,uint256)": "0xc5fa0b5a00f4912a6fcf5435bcb7507106a6a5b7923a95a167496a6de8a7b658", + "unpause()": "0x2e5245cba48d81cf8bf5758329449410e07df5abc19e1f7a8c770ddc39d3e8a8" + } + } + }, + "20230206-erc4626-linear-pool-v3": { + "ERC4626LinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0x2ade4ba0e9b92ee5b27f97f7cb9b8412bf5d4bad0f7b83b34efd964c3bcf409d", + "disable()": "0xb1bb0315049487d8b225a40fc17d5a02647e84002cfa5b11eda57b967629f72c" + } + }, + "ERC4626LinearPool": { + "useAdaptor": false, + "factoryOutput": "0xfeF969638C52899f91781f1Be594aF6f40B99BAd", + "actionIds": { + "disableRecoveryMode()": "0xab16f8806195c2717e850506d6c858cb12c882c668564f3c1b6731068783272f", + "enableRecoveryMode()": "0x650376aebfe02b35334f3ae96d46b9e5659baa84220d58312d9d2e2920ec9f1d", + "initialize()": "0xe9b329af10e94b6894103233c888c0a8c3cbefd21401d16e19bcfce0ea8bed6f", + "pause()": "0x4b30a773b13a4e650bf9220bd12ad34272192036659373a62363dbb94e08f523", + "setSwapFeePercentage(uint256)": "0xf0498ccb15b689c1257a638831837f9a1a6e21c1530e7b0c4f9e0fa6af0651c9", + "setTargets(uint256,uint256)": "0x98ac729537b2c4aea25f652542bb7769f700500018ca6a9f9879466f75194838", + "unpause()": "0xb8a2ce31e605b78815daec498fcc52002a37a783fb454b9fe0e4925444699e6a" + } + } + }, + "20230208-euler-linear-pool": { + "EulerLinearPool": { + "useAdaptor": false, + "factoryOutput": "0xDEC02e6642e2c999aF429F5cE944653CAd15e093", + "actionIds": { + "disableRecoveryMode()": "0x96f03c8a74f7dd50da19854ff59638ec83927c186dc3ea7a87253f1bdfa76c20", + "enableRecoveryMode()": "0xd269952fc957849d80da7d2dee21410055532f5209b87829c7e70e53c0cbdb70", + "initialize()": "0x83095be82a6ab22c54db03ed53185781ddc76c9b12d9a011d5ee0f3e16958017", + "pause()": "0xb4cb52710958874af2680e9d5d4a9cb17e6923502cb7e86f3ae557c6349b3f3f", + "setSwapFeePercentage(uint256)": "0xb6bd869a6825ba2f1c9eba4c1d907dd5791b335cebd7f401b5f5efb9340a4450", + "setTargets(uint256,uint256)": "0x3c41e27d020ed56c209b202d47efeb4484e52537c3e6ec646e8ba1c123ea16cf", + "unpause()": "0xba620d90bf43ed4e28d08953a56a063710cfccbbc468b90ec556433bb1b0b27f" + } + }, + "EulerLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0xe4593f0a47b99a973e0da350bc3a7789d82418aa5eeda2d454dbe4fd08cad0c4", + "disable()": "0xdf42af2dd96057a6f29e617c9d6c389e3ac79347b2e4d0b06b8d33cd7e15c40b" + } + } + }, + "20230213-yearn-linear-pool": { + "YearnLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0x1dbbb55d4b8809b485b085e9f2e8cf8e40d2ff5ae1454ebd8f1f102833e51cfb", + "disable()": "0xc6d41c26426784c7fab7298da04eab2259046b3c7c8351286ee364e4e0a3bd1e" + } + }, + "YearnLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x0a0fb4ff697de5ac5b6770cd8ee1b72af80b57cf", + "actionIds": { + "disableRecoveryMode()": "0x5873adbb834097e9d186636f9dac7001961b977239253df7a48eaa03aa925a0f", + "enableRecoveryMode()": "0xd3f06ece971762157e9c58797051a03bb62d731bdf05ea4de799b7223f9463c2", + "initialize()": "0xa58018579f76743a9c0731db36cb724d25ab2cc84afee8c9709c7192e62dcc76", + "pause()": "0x28da776fe35421e73cb82c5704ae38109542d5c0aaf15ca67d64c86a488b35bb", + "setSwapFeePercentage(uint256)": "0xafb360e583a4ccc8e9935d214a3031628a34797c2f2a1d2f52505137a54c5796", + "setTargets(uint256,uint256)": "0x44c2c324db39782f28032ff6aa4234a8ed6d95a11e194006e5b63213abdd209f", + "unpause()": "0x1392aa43340535c0fd7a443967a0f1ea139820c50b1d288f12408f09f6aa99ac" + } + } + }, + "20230213-gearbox-linear-pool": { + "GearboxLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0x6242ae61daf46c9c72658da98e2add98111aa5ab5109a959a8ece6b67151c4a2", + "disable()": "0xa29d20c33a203d4663b49d6135fd5876558c9bf107a898f7a0e95357ec2e42b1" + } + }, + "GearboxLinearPool": { + "useAdaptor": false, + "factoryOutput": "0xa8b103a10a94f4f2d7ed2fdcd5545e8075573307", + "actionIds": { + "disableRecoveryMode()": "0xd5b1778103a97109e43688a0ce75e4a077ccc4283072773e2c518b553818a3ef", + "enableRecoveryMode()": "0xa32a74d0340eda2bd1a7c5ec04d47e7a95f472e66d159ecf6e21d957a5a003a9", + "initialize()": "0x92a60060d9e3ed67fadd7bfc4b5aaff703e1137145452b316fc0f7504a7bd33e", + "pause()": "0x9cda239a3e7706826ca862a1ce0eea1cd5b9ee8a6bb2b9fb219b949f4d33e333", + "setSwapFeePercentage(uint256)": "0x69f726d607e0cfd6af767f629799bd33e396b1bad79f46a94a8d88a1ab08abbe", + "setTargets(uint256,uint256)": "0x48860201a4ce2338c9b0cd0a11ef9bffea1ee89bf1f610a71e12a2817be310ec", + "unpause()": "0x439afd39c403a6dd6a49bf720adf1b2e9759270143ce87854a59794a104fe596" + } + } + }, + "20230217-gnosis-root-gauge-factory": { + "GnosisRootGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address,uint256)": "0x817de1d55149f9976836222b163cd53ade05fea9f5ade499b4572e14d3561d6e" + } + }, + "GnosisRootGauge": { + "useAdaptor": true, + "actionIds": { + "checkpoint()": "0x3f63974a377ba4713661ede455bceda6686a0395f8b8ed8701ad1f13bb926c4d", + "initialize(address,uint256)": "0xa7eb8749bae4020b0007b643972b60456da2b6b92fa6b583c7277fc2dea05a39", + "killGauge()": "0xec1d467d9ab03a0079c22a89037209f5763aec973897ea763e2cf25d71a5f12e", + "setRelativeWeightCap(uint256)": "0xae60dce27f51ce5815357b9f6b40f200557867f8222262a1646c005d09b7dfba", + "unkillGauge()": "0x076e9815202aa39577192023cfa569d6504b003183b2bc13cd0046523dfa23ea" + } + } + }, + "20230215-single-recipient-gauge-factory-v2": { + "SingleRecipientGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address,uint256,bool)": "0x3e237ec96a5f978764d578c4f87c027ba38e169b9a934bd6a8ea5eda7a8db483" + } + }, + "SingleRecipientGauge": { + "useAdaptor": true, + "actionIds": { + "checkpoint()": "0x3f63974a377ba4713661ede455bceda6686a0395f8b8ed8701ad1f13bb926c4d", + "initialize(address,uint256,bool,string)": "0x0b6a82f31eef5601eb17b673333b6abd4afcb2798fe1469615dd09ece28dbc2a", + "killGauge()": "0xec1d467d9ab03a0079c22a89037209f5763aec973897ea763e2cf25d71a5f12e", + "setRelativeWeightCap(uint256)": "0xae60dce27f51ce5815357b9f6b40f200557867f8222262a1646c005d09b7dfba", + "unkillGauge()": "0x076e9815202aa39577192023cfa569d6504b003183b2bc13cd0046523dfa23ea" + } + } + }, + "20230223-protocol-id-registry": { + "ProtocolIdRegistry": { + "useAdaptor": false, + "actionIds": { + "registerProtocolId(uint256,string)": "0x09a880cf3d54a213316bf4d92d60e72ba0ab61a639fce84378eefb9a63d6abd5", + "renameProtocolId(uint256,string)": "0x4f3dee5b767f91b4faa9979f01808dd2490fde931a9eb355d5f8e0187826dade" + } + } + }, + "20230320-weighted-pool-v4": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address,bytes32)": "0x4417e6f94c8c2fadc1189a5acbf7fc2e33aa168757242f85c6be1656ff55c346", + "disable()": "0x493661c8d8cc29f86981a64d4fbc5cec0d83e973a00ccf48867d9d565577cc43" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0x8055b8C947De30130BC1Ec750C8F345a50006B23", + "actionIds": { + "disableRecoveryMode()": "0x883ac0fb54f0b07161f4c1d1132c7179cf4fd457dec4d2cf15af62bfe93d6402", + "enableRecoveryMode()": "0xa311a2d0d64a462699773489c804dc8760412f0ab9958da8d266a409200a8947", + "pause()": "0xf027a6de0f5fcff0e202ce375789440fe96671a3d602f11b72666eb3b3e0835f", + "setAssetManagerPoolConfig(address,bytes)": "0xa99bcb81a68912327342dd424823d66b781d92c14f40e0bffcfc451ea31a7640", + "setSwapFeePercentage(uint256)": "0xa5547190e3d59f2bfeb4174ca3454b2f2acaeed644bc7ad7018014516f73f2bd", + "unpause()": "0x29ed4a0b00e6139b4f19870234b9da712aa8aeb2c7d7bca307501aef6dc5f9bc", + "updateProtocolFeePercentageCache()": "0xae03ea22200ab4167b86f57a6d7e7e0a0f21d198003a6a85e16785c495177695" + } + } + }, + "20230320-composable-stable-pool-v4": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address,bytes32)": "0x51151b7209841cb00aa747a9303d6add8208743a4fd1fe521a40f219ff16b8cd", + "disable()": "0xe31225bb7818ffa444c35f1c3b7dd416438415dcdd675d609ea6343c1a1111ad" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x5537f945D8c3FCFDc1b8DECEEBD220FAD26aFdA8", + "actionIds": { + "disableRecoveryMode()": "0xb6f4ab951143da625c0c25d6eca1ce9e007e3139abfd9cfec3a301bad7238e15", + "enableRecoveryMode()": "0x97b984f4d02757894d110e636f8e8fcdb03099f5c473e4f494496f3eff253cde", + "pause()": "0x409c04f28f6c508db18cec1f9381aa1dced3dc1f8fa8113485974bcb9664c57b", + "setAssetManagerPoolConfig(address,bytes)": "0x779f8571538a29f97e59bef95bb3bd7f23febe87aefa74ef0ca85e588fac8c64", + "setSwapFeePercentage(uint256)": "0x0acc45f3ac7c04369514ee383aad82d5c1eef484fbf9ca5f6d87ad5c5859da40", + "setTokenRateCacheDuration(address,uint256)": "0x580d9dec69d61b7108da40ab904d4be7a5e16f2df68d238b0eb800b5feadf552", + "startAmplificationParameterUpdate(uint256,uint256)": "0xa67ca78c7311cd47624917626fa335f80b4bd4290a39d66dbe5fa4e9c75e09c4", + "stopAmplificationParameterUpdate()": "0x682fca1bedeeef7829d348be1ad1b4374173ca952cf181baff30e5249425ce8b", + "unpause()": "0x1cb06d97ee314d3b8fdf493000365a4fff3f9f7c6df8cd0d35b2c37448743b44", + "updateProtocolFeePercentageCache()": "0x32dc9e5bf0bd3790d398b79fa1d1e43b333822cd21435a991aa36f40ad724f3f", + "updateTokenRateCache(address)": "0x18ec3f2cac6eb42b69df82ae92de2578ccff66bcbf6efc9c12398ea3ca6411a4" + } + } + }, + "20230411-managed-pool-v2": { + "ManagedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create((string,string,address[]),(address[],uint256[],uint256,bool,bool,uint256,uint256),address,bytes32)": "0xc1b4c55cd931f1e3ed4398df4f997d325d9bc768d77c69fa2f0ea307fc6e29ed", + "disable()": "0x3a8726e9b397a00fc6ba5b2cb40716b9844deceaeb064d72a63d4d2f149d9e2a" + } + }, + "ManagedPool": { + "useAdaptor": false, + "factoryOutput": "0xD0cbF6765997b7CA7Be6440F5E305B2ec7B96065", + "actionIds": { + "addAllowedAddress(address)": "0x65e907580e0500f5e74faffb080998aa292a7586f50c52b43dab83ee6ce8fc6a", + "addToken(address,address,uint256,uint256,address)": "0x4f21bda14c8b0bb567f9ba853406e423d6a5d6c7038fc1016fa7cdd0a8e05ab4", + "collectAumManagementFees()": "0x63a93b103bcd34d924e80ac030149a1e0432c4363e5a26a8511d6b1a0bc0478b", + "disableRecoveryMode()": "0x056ec9879aba05c8772209c666fc240a283f5f516f1ab4539ff6750ad3f40861", + "enableRecoveryMode()": "0xfab707b8c3c30c3593808e391f0e18aad40b6e8621b45494988ca0a31a55aff5", + "pause()": "0x93d028247647bd545d7dfbf7369348eca5dc45b20bf8bdb759610f808016af1b", + "removeAllowedAddress(address)": "0xb5f31537db49799057205a53261c5575410eab1b5fa2b61367a2efbc8462dfd3", + "removeToken(address,uint256,address)": "0x2303cd1ca835954ada2b5ed52d91bd76ef2ee46aaad48a39e29747a0e74e51c9", + "setCircuitBreakers(address[],uint256[],uint256[],uint256[])": "0x1e2a12fb01744285f42e031e66d9ae4322d88880ff100a5f861bac6c61e41e52", + "setJoinExitEnabled(bool)": "0x2806b2f833f123bbd27b2a17ecacc8c1c0453d1ef7c52e119e81e9725022390c", + "setManagementAumFeePercentage(uint256)": "0x4d1cb25ff55ff78028550397aff44b9e314e2cb5bc3d47f12952270bc4cfdc6a", + "setMustAllowlistLPs(bool)": "0xf4c7b622e37edf9cf45c1de51da69d2505cad4ddf5ef9d5277d048d4a8238328", + "setSwapEnabled(bool)": "0xdf510f5e891b99d9da6f68c848bd3dc0a05055e34c0c812fbc1a38366a8fb15c", + "unpause()": "0xf8e34ed94447e3c084c64b540cdb110e1ebffe1e601369accee64294c6153cf6", + "updateProtocolFeePercentageCache()": "0xa0510b3d23de2aa856fa89cff55f243c570b3a4419ecc532853c32e4175d6ba6", + "updateSwapFeeGradually(uint256,uint256,uint256,uint256)": "0x4b21d3fce50bb4b768d6f878a6498fd7839cd231c0abdd2272a5484dd0eb905f", + "updateWeightsGradually(uint256,uint256,address[],uint256[])": "0xc190da9e735fd438c73158ff1808c577b8b08fde4fbb8ad17ab4ce2f91f67215" + } + } + }, + "20230409-yearn-linear-pool-v2": { + "YearnLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0xa212609bae97a167c5c465a792af9267f9af11f48bac5b1f3622302da35cdee6", + "disable()": "0x811fd661839b93538ac3d909ccceb9891e6b47ee6e71d0871fb62da2d3b484cc" + } + }, + "YearnLinearPool": { + "useAdaptor": false, + "factoryOutput": "0xAC5B4EF7eDe2F2843a704E96dcAA637F4BA3Dc3f", + "actionIds": { + "disableRecoveryMode()": "0x591a17eb2cfcfb9c46bc914beabe5e72b148a01206bc779c16d87fb1ed84ba82", + "enableRecoveryMode()": "0x256eccbca05f769e9349017e92e50ee5d1801d9afbbaf9f6986f61d8ccfb6cb0", + "initialize()": "0x1581ece04c8a9c8c2b3cf76b96f529160258f5bc0e2d85867ae4bfa5c8acb64d", + "pause()": "0x8b150ea30fbe0118f4af39209fe69ed20bcfde20eefb28ff25899e34c5f9f0f5", + "setSwapFeePercentage(uint256)": "0x479aa48247a9811620c0d80d6cb740bbc8d9424523952ff24ff7e07f3d10f955", + "setTargets(uint256,uint256)": "0x4673448eaa2b93f1384adf0af721394d754d2bd69f9d18a3f01ba7f4ea6f500c", + "unpause()": "0xdfdfc106571f842403f0df559a47f4a783ed29695fd1e4bca9b51e067e50d7ce" + } + } + }, + "20230409-erc4626-linear-pool-v4": { + "ERC4626LinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0xdb2525439ee1656aa0e8f28cf70607fdd3842689cf01a34c18f2523824408758", + "disable()": "0x3dcf6c9d1f7bcff6477a09e1a18ca76f56c83f7e055276096a5acdd3c24f022a" + } + }, + "ERC4626LinearPool": { + "useAdaptor": false, + "factoryOutput": "0x9516a2d25958EdB8da246a320f2c7d94A0DBe25d", + "actionIds": { + "disableRecoveryMode()": "0xcdbdee0d8755700385092bfc71468577a3f4d92e90eee08906454441eeb69625", + "enableRecoveryMode()": "0xbc3dae38c30f2686b160e7154a2d649e84222b9f9de4e3347380cd82f23771ad", + "initialize()": "0x16bdb45b2542c68f7b6fc8bb4475e011135821deaa7baee5b7933094f1af1073", + "pause()": "0x92740abcb256f64824759ca687fc8af1a6ba7900e201545f9b848d3e3daab488", + "setSwapFeePercentage(uint256)": "0xd41187a1d52918991b8e886e7e02dadf9f3899ff8134eaa5aa4e8f6a81dec3ab", + "setTargets(uint256,uint256)": "0x2c7bba59983418a55126cdd07a69d73a710ec5fa3366f5b12c369de97d43492e", + "unpause()": "0x3bd06a773652f06ff2bc008fa41cc79cc7028608b1c1d40254e0f441525e3b43" + } + } + }, + "20230410-silo-linear-pool-v2": { + "SiloLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x579e77e7dee3833bc6d34a93171e6f1f0bee546d49589e2cc8feb17a4ed9d09e", + "disable()": "0x821049bb6ef72deac25b0e490181aaefac3d90d182e80bca5c3f65f46efc4f5a" + } + }, + "SiloLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x74CBfAF94A3577c539a9dCEE9870A6349a33b34f", + "actionIds": { + "disableRecoveryMode()": "0xe847f977cd8e10478255ec80b009d4a8fae02c522668d069338bf02a560da410", + "enableRecoveryMode()": "0x034ee1ea95f848440061786bb02a338bc9a003951046d1386ab163bf1fb70192", + "initialize()": "0xd91dcb993a34e4ffc1e9f08d5bad6c52bf7eee6053339986e011ea57e272a599", + "pause()": "0x7b287abc448e5afd5a48345f9648865a2bbe004d466ea8d591e05682400ca48d", + "setSwapFeePercentage(uint256)": "0xf7939f1289f961848c0a92aaeff509b21549a13102c87a1c7925a11395ae7d91", + "setTargets(uint256,uint256)": "0x40ec418a16c99e189ca5a9d18950f34ffeb1ff1cc484566f9b178c59f304bf31", + "unpause()": "0x948a5c55387a33ee9ad6c3237293509060e9e98e09c39580a4fd0e8ac3b79abc" + } + } + }, + "20230409-gearbox-linear-pool-v2": { + "GearboxLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x1c5e7cff761a77802389e64fec732eac00d74dce8d6f8b454377f0a626990f4f", + "disable()": "0x57b420cd0179ca826befca79e15b477a14fa8df7bd71e0bddbc60060e4d8de5c" + } + }, + "GearboxLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x0d05Aac44aC7Dd3c7ba5d50Be93EB884A057d234", + "actionIds": { + "disableRecoveryMode()": "0xd9483945f8db426a7e8d9739e1d216d99aa55e950dcb36b6b09ba3eb5fd43a9a", + "enableRecoveryMode()": "0x6576d422b86632e2199a13b9ed43bb27cfa9a1e2f521809e4a9efaa1853c5c1c", + "initialize()": "0x007fb4fd88ff3d12b29755399e9b8d0cecd3f6f65287c0b77bea31e2dab651dd", + "pause()": "0xc9ce9f716205eba29c6af3ed2bd373ffa9f597d05d26415731204217a539c2ba", + "setSwapFeePercentage(uint256)": "0x0724bafdb03f8d97bf0372ebba73684e8da490a627cc54840323b96c0f8a54d7", + "setTargets(uint256,uint256)": "0x4b312672200c08d2c4cf1f7d13db3ff0e024832e23c8b2de5c0b1f6e63cb29ca", + "unpause()": "0x9fbcef66358f7ec1047261be97e63eb957da8d0ec14f4ea177ba232f6df62bc1" + } + } + }, + "20230410-aave-linear-pool-v5": { + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x4cE277Df0FeB5B4d07a0ca2ADCf5326E4005239d", + "actionIds": { + "disableRecoveryMode()": "0x9bc87a8eb9cc99699c942d367413b64cec46fec372b850ceb1e92dd404262f54", + "enableRecoveryMode()": "0x4e4c0dff3668c7cab151f99058e4bb3470cdb320ea5c7584fdf29c1bef04a196", + "initialize()": "0x4f24cb4b21a337f37a0cf8e23f719559f3a53d773c439a83d4af0ae9cc3600e0", + "pause()": "0x6de4e265ea76d035e89a589a1a6a280934f6fc3ebb5d4cf453a2e589d0fdb4bc", + "setSwapFeePercentage(uint256)": "0x24d685d4b3197ce4efaf94536add3319b1d449f6501b4e29b5365aa0a4defa71", + "setTargets(uint256,uint256)": "0x4dfd0a62feee8bdacf3d08393f0afa366dfb2d19ae771c9f9d206ccbe5d45202", + "unpause()": "0x3b402ece9ccc332bfef4c9624def91acae25d1361f0808a1db4e84b29fb4d3df" + } + }, + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0xaf947869f4f3a0e0363abd32db76969213326c9b60ffff5a505902700c42ffc4", + "disable()": "0xcc2b10c657509434d44ea360695df848ccc5e8a27438dd62f0ae87b147224965" + } + } + }, + "20230526-zkevm-root-gauge-factory": { + "PolygonZkEVMRootGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address,uint256)": "0x817de1d55149f9976836222b163cd53ade05fea9f5ade499b4572e14d3561d6e" + } + }, + "PolygonZkEVMRootGauge": { + "useAdaptor": true, + "actionIds": { + "checkpoint()": "0x3f63974a377ba4713661ede455bceda6686a0395f8b8ed8701ad1f13bb926c4d", + "initialize(address,uint256)": "0xa7eb8749bae4020b0007b643972b60456da2b6b92fa6b583c7277fc2dea05a39", + "killGauge()": "0xec1d467d9ab03a0079c22a89037209f5763aec973897ea763e2cf25d71a5f12e", + "setRelativeWeightCap(uint256)": "0xae60dce27f51ce5815357b9f6b40f200557867f8222262a1646c005d09b7dfba", + "unkillGauge()": "0x076e9815202aa39577192023cfa569d6504b003183b2bc13cd0046523dfa23ea" + } + } + }, + "20230504-vebal-remapper": { + "OmniVotingEscrowAdaptor": { + "useAdaptor": false, + "actionIds": { + "sendUserBalance(address,uint16,address)": "0xe6bd930b919474f80aa7e6ef7b6023d43fd49eeac1fd6665525383ced0441c95", + "setAdapterParams(bytes)": "0xe328d2657bafde36e59625f80f41c74de687ccee4942f370e85b0366c831967d", + "setOmniVotingEscrow(address)": "0xaecef2a08acfa6437c6cad5d0aad2bd0172fec6050bd95d13aa5450c25aaa391", + "setUseZero(bool)": "0xcfcc23f0d0144b21618e0d1938fb0254a665ca4f35591323ae915c0a1d00e80f", + "setZeroPaymentAddress(address)": "0x2793e2362f816c53d200c46eaac0844c04ef9aec5016105fbe2efd65a802be29" + } + }, + "VotingEscrowRemapper": { + "useAdaptor": false, + "actionIds": { + "clearNetworkRemapping(address,uint16)": "0x70d896d8af9031c99d4aa3e6324b33b163bd79a55200b048ef2656f29aad738c", + "setNetworkRemapping(address,address,uint16)": "0x020b90ada54354853c5e3fc54dc3af0fc9b0cd545f312b800fd0fbde2e47a14d", + "setNetworkRemappingManager(address,address)": "0x6bb341db03eede206e544c654a59ef89eea83bc65fada2cfeeaf18c5c0f76ac0" + } + } + }, + "20230519-gauge-adder-v4": { + "GaugeAdder": { + "useAdaptor": false, + "actionIds": { + "addGauge(address,string)": "0x83dc5eaaade2c71d34c71bd21fe617f5f6d83bf53bd9d886d00c756e386b8cd1", + "addGaugeType(string)": "0x2960d085c4c968d7cad55c0da3f97014525b948fdce990ecaef4e832b5f0b151", + "setGaugeFactory(address,string)": "0x3f44776af02a9227991da37715b44e45db40735e216b3ab33144859bb6737166" + } + } + }, + "20230527-l2-gauge-checkpointer": { + "L2GaugeCheckpointer": { + "useAdaptor": false, + "actionIds": { + "addGauges(string,address[])": "0xf04824af360d2eaf35009710de9dd8111fccade72de8f1033342f96a53fee5dc", + "addGaugesWithVerifiedType(string,address[])": "0x1b6c47bfcba58391eb7c8e74ea3c377e0d6c62825a6184d59c4478e225110fd4", + "checkpointGaugesAboveRelativeWeight(uint256)": "0x54a75b87402f413febdc962618c1897225cd2aabf1b5b159e72187b61d28b419", + "checkpointGaugesOfTypeAboveRelativeWeight(string,uint256)": "0x6379ef621e9360d66c706ba7cf1ca6ba747313347d7f11586ed2510ab0187ff1", + "checkpointSingleGauge(string,address)": "0x573e195a87af10f159d9c6a9f450549f8e57433d9ba76a8bc5c109c81c74fb13", + "removeGauges(string,address[])": "0x55566cb4e0ccd22ac860f52d3981d1999e5c5abf014314ef837b5b6da7b25a2e" + } + } + }, + "20230529-avalanche-root-gauge-factory": { + "AvalancheRootGaugeFactory": { + "useAdaptor": false, + "actionIds": { + "create(address,uint256)": "0xef55231281d75552d7a09d4ec5c5887068bb8197d9111dee358b45cfc10d7951", + "setAvalancheBridgeLimits(uint256,uint256)": "0x1a18ad8cf4b6aef8d28c715ad5644514bec15690a30b000bc7ccd6bd68acaca2" + } + }, + "AvalancheRootGauge": { + "useAdaptor": true, + "actionIds": { + "checkpoint()": "0x3f63974a377ba4713661ede455bceda6686a0395f8b8ed8701ad1f13bb926c4d", + "initialize(address,uint256)": "0xa7eb8749bae4020b0007b643972b60456da2b6b92fa6b583c7277fc2dea05a39", + "killGauge()": "0xec1d467d9ab03a0079c22a89037209f5763aec973897ea763e2cf25d71a5f12e", + "setRelativeWeightCap(uint256)": "0xae60dce27f51ce5815357b9f6b40f200557867f8222262a1646c005d09b7dfba", + "unkillGauge()": "0x076e9815202aa39577192023cfa569d6504b003183b2bc13cd0046523dfa23ea" + } + } + }, + "20230711-composable-stable-pool-v5": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool,uint256,address,bytes32)": "0x86f1ab596c40f152a34aaff5983979d3de09356a303a15af89b0aabb8b8526fb", + "disable()": "0xceeb84f98e049989237e570ba87203572b1ba663061d817739b66a9fb08a7901" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x20356663C17D31549d1210379749E2aE36722D8f", + "actionIds": { + "disableRecoveryMode()": "0x004ed6bc39c7b1141c8d34bc8c481dde189197c700d070129e6f6a3cbbfdce9f", + "enableRecoveryMode()": "0x9a645ed7f1bf603a8f6a44b2227b47a0355b902e65abb9d45e60bbc7e220992f", + "pause()": "0xbb09fe1ad67eb7a320ad9131d81ea3835e51215410ea5d5866bc516003d06287", + "setAssetManagerPoolConfig(address,bytes)": "0x34c5ab3275e5ac75e17ba7dfdeb0d7ebfbfb813cb3d1b608a3d93f1fa75e6e0d", + "setSwapFeePercentage(uint256)": "0x42bc3b76ebdb675c6f7836b464d27c7517e14b05dc08bb944a4837563fc805ca", + "setTokenRateCacheDuration(address,uint256)": "0x4bb7796cbdc90c45e85adef80563ca8f377e879de799e82e437abab49a63ebc3", + "startAmplificationParameterUpdate(uint256,uint256)": "0x6bf9f64e8755a240cd5604ab5cabd4a1eed020059be9a1a64be071859f023276", + "stopAmplificationParameterUpdate()": "0xd5e70e51651eb5be66f83b01794f74b5dbb417b607bf0425c5c5d3aa7386b38b", + "unpause()": "0x1279ddb5bff5184643057feb45413adb8d9bd0836bc750c0f79cedb37c060ca1", + "updateProtocolFeePercentageCache()": "0x2be4d7bdb2e2ecbd85fc7dba1ff652a701786f44c3735fa4a10ec0e04cb74752", + "updateTokenRateCache(address)": "0x2bb772ea44877929e766a106b034c5cd65414309e05150845082444794577b34" + } + } + }, + "20230731-stakeless-gauge-checkpointer": { + "StakelessGaugeCheckpointer": { + "useAdaptor": false, + "actionIds": { + "addGauges(string,address[])": "0xb618e3fb703584d3a1025aabf97fb7b986b2b666e3d3dae5b89e399c250c1c93", + "addGaugesWithVerifiedType(string,address[])": "0x44a49a1e60182181a387c557dae431aa77fe501cd972be1020c9f287096a061f", + "checkpointGaugesAboveRelativeWeight(uint256)": "0x59f33b7b8fd2d385978a0a7d4e69c0c5e242b45fff1cdc9e622cec1453f995cf", + "checkpointGaugesOfTypeAboveRelativeWeight(string,uint256)": "0x5b6b4784f400eead34eedf74f3bf87ea6bf96920af067f2bb94f4ff0f04288d1", + "checkpointMultipleGauges(string[],address[])": "0xa8d6a28512db4a2a7327e3dff08e39e31efc2292dc0eb9bcc70d0820b7ed34a7", + "checkpointSingleGauge(string,address)": "0x5d2abc4ad6367f4bfb67f6d501620b781c5d35a2e021c2ab4dd8befcab17e8fa", + "removeGauges(string,address[])": "0xfee7000015bfc10d718c5bd11e7573986e6b8283ddcac0f5b6016ece5249711c" + } + } + }, + "20230811-avalanche-root-gauge-factory-v2": { + "AvalancheRootGaugeFactory": { + "useAdaptor": false, + "actionIds": { + "create(address,uint256)": "0xfad22b622975a1bc89c6cb88a9d9d6928401bf2a4e7d18536101f9b42ec7515b" + } + }, + "AvalancheRootGauge": { + "useAdaptor": true, + "actionIds": { + "checkpoint()": "0x3f63974a377ba4713661ede455bceda6686a0395f8b8ed8701ad1f13bb926c4d", + "initialize(address,uint256)": "0xa7eb8749bae4020b0007b643972b60456da2b6b92fa6b583c7277fc2dea05a39", + "killGauge()": "0xec1d467d9ab03a0079c22a89037209f5763aec973897ea763e2cf25d71a5f12e", + "setRelativeWeightCap(uint256)": "0xae60dce27f51ce5815357b9f6b40f200557867f8222262a1646c005d09b7dfba", + "unkillGauge()": "0x076e9815202aa39577192023cfa569d6504b003183b2bc13cd0046523dfa23ea" + } + } + }, + "20230911-base-root-gauge-factory": { + "BaseRootGaugeFactory": { + "useAdaptor": false, + "actionIds": { + "create(address,uint256)": "0x691118ddf5c498a47b894826264afd0d259a9e6e81049aca1b722c973117bffc" + } + }, + "BaseRootGauge": { + "useAdaptor": true, + "actionIds": { + "checkpoint()": "0x3f63974a377ba4713661ede455bceda6686a0395f8b8ed8701ad1f13bb926c4d", + "initialize(address,uint256)": "0xa7eb8749bae4020b0007b643972b60456da2b6b92fa6b583c7277fc2dea05a39", + "killGauge()": "0xec1d467d9ab03a0079c22a89037209f5763aec973897ea763e2cf25d71a5f12e", + "setRelativeWeightCap(uint256)": "0xae60dce27f51ce5815357b9f6b40f200557867f8222262a1646c005d09b7dfba", + "unkillGauge()": "0x076e9815202aa39577192023cfa569d6504b003183b2bc13cd0046523dfa23ea" + } + } + }, + "20230915-stakeless-gauge-checkpointer-v2": { + "StakelessGaugeCheckpointer": { + "useAdaptor": false, + "actionIds": { + "addGauges(string,address[])": "0x8e09948549180ad7218065115c91ebf280d177eaa1de0bb80ab5e67826a07c74", + "addGaugesWithVerifiedType(string,address[])": "0x54f43cdb53a74c7bd91359b21ad8cd82a6a41b6ff8718aea74f1d2b9292c6b41", + "checkpointAllGaugesAboveRelativeWeight(uint256)": "0xeef817bea9f90865dd4acb941142fb31df8b000ef923f2cb76311eb0d2dbe051", + "checkpointGaugesOfTypesAboveRelativeWeight(string[],uint256)": "0x24163807447322f9698ca1e49185cf5a4ceb7cd4f1faf39b575d0e4f85bf92ad", + "checkpointMultipleGauges(string[],address[])": "0x9d73b38f541a984ada9a198ce8abb57063f37c6bd342d460c4d441a88f5b87f8", + "checkpointMultipleGaugesOfMatchingType(string,address[])": "0x9910a03e643d74a769f0213e8467fd2777647f3325c8c62148dc6f62012dea7e", + "checkpointSingleGauge(string,address)": "0x216e5ad6741d942f184cec39f3dd6d2db1ff0c877b9804953d281a23fc6e9811", + "removeGauges(string,address[])": "0x925200f5f95b4131609c62d42944f8e9b0bfef74d062ef3b3e469eb09b4baebe" + } + } + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/action-ids/mainnet/expected-collisions.json b/balpy/balancer-deployments/action-ids/mainnet/expected-collisions.json new file mode 100644 index 0000000..7dddeac --- /dev/null +++ b/balpy/balancer-deployments/action-ids/mainnet/expected-collisions.json @@ -0,0 +1,948 @@ +{ + "0x3f63974a377ba4713661ede455bceda6686a0395f8b8ed8701ad1f13bb926c4d": [ + { + "taskId": "20220325-gauge-controller", + "contractName": "VotingEscrow", + "signature": "checkpoint()", + "useAdaptor": true + }, + { + "taskId": "20220325-gauge-controller", + "contractName": "GaugeController", + "signature": "checkpoint()", + "useAdaptor": true + }, + { + "taskId": "20220325-single-recipient-gauge-factory", + "contractName": "SingleRecipientGauge", + "signature": "checkpoint()", + "useAdaptor": true + }, + { + "taskId": "20220413-arbitrum-root-gauge-factory", + "contractName": "ArbitrumRootGauge", + "signature": "checkpoint()", + "useAdaptor": true + }, + { + "taskId": "20220413-polygon-root-gauge-factory", + "contractName": "PolygonRootGauge", + "signature": "checkpoint()", + "useAdaptor": true + }, + { + "taskId": "20220420-fee-distributor", + "contractName": "FeeDistributor", + "signature": "checkpoint()", + "useAdaptor": true + }, + { + "taskId": "20220628-optimism-root-gauge-factory", + "contractName": "OptimismRootGauge", + "signature": "checkpoint()", + "useAdaptor": true + }, + { + "taskId": "20220714-fee-distributor-v2", + "contractName": "FeeDistributor", + "signature": "checkpoint()", + "useAdaptor": true + }, + { + "taskId": "20220823-optimism-root-gauge-factory-v2", + "contractName": "OptimismRootGauge", + "signature": "checkpoint()", + "useAdaptor": true + }, + { + "taskId": "20220823-arbitrum-root-gauge-factory-v2", + "contractName": "ArbitrumRootGauge", + "signature": "checkpoint()", + "useAdaptor": true + }, + { + "taskId": "20220823-polygon-root-gauge-factory-v2", + "contractName": "PolygonRootGauge", + "signature": "checkpoint()", + "useAdaptor": true + }, + { + "taskId": "20230217-gnosis-root-gauge-factory", + "contractName": "GnosisRootGauge", + "signature": "checkpoint()", + "useAdaptor": true + }, + { + "taskId": "20230215-single-recipient-gauge-factory-v2", + "contractName": "SingleRecipientGauge", + "signature": "checkpoint()", + "useAdaptor": true + }, + { + "taskId": "20230526-zkevm-root-gauge-factory", + "contractName": "PolygonZkEVMRootGauge", + "signature": "checkpoint()", + "useAdaptor": true + }, + { + "taskId": "20230529-avalanche-root-gauge-factory", + "contractName": "AvalancheRootGauge", + "signature": "checkpoint()", + "useAdaptor": true + }, + { + "taskId": "20230811-avalanche-root-gauge-factory-v2", + "contractName": "AvalancheRootGauge", + "signature": "checkpoint()", + "useAdaptor": true + }, + { + "taskId": "20230911-base-root-gauge-factory", + "contractName": "BaseRootGauge", + "signature": "checkpoint()", + "useAdaptor": true + } + ], + "0x3bf29175652a3f0fac5abb715d0b7fe2e7b597e2e2eff555dac6b21a20a7c83e": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "add_reward(address,address)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "add_reward(address,address)", + "useAdaptor": true + } + ], + "0xa1fcfa4f107b70052cfbb2e460d99c96f9b18c1197671fe00ab59c32adcddbeb": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "claim_rewards()", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "claim_rewards()", + "useAdaptor": true + } + ], + "0x1c866c9ea7b119a642f593024ced6088dbde65d041e5d3e826b9ad49b949a64b": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "claim_rewards(address)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "claim_rewards(address)", + "useAdaptor": true + } + ], + "0x17b18f02fd5498a6aba17d20977b1a8a08f888d821999613fee42f9f9acb0bd9": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "claim_rewards(address,address)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "claim_rewards(address,address)", + "useAdaptor": true + } + ], + "0x507b520ac43f322b79e43a63eaa5b80ca89ac2c5b63970fa4b6242a23a9e8aa2": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "claimable_tokens(address)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "claimable_tokens(address)", + "useAdaptor": true + } + ], + "0x514b6f05525a3f31c3bde60d063e91e88204c5cdc5b35934513f911943b97fcc": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "deposit(uint256)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "deposit(uint256)", + "useAdaptor": true + } + ], + "0x360a8a15589674642b2125956d96757fc2f06ff1b968333271de16a20e01df05": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "deposit(uint256,address)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "deposit(uint256,address)", + "useAdaptor": true + } + ], + "0x7572a9d124a97112d9e0f610651c79f13cf257bea3a71e38663b8a23875a2241": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "deposit(uint256,address,bool)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "deposit(uint256,address,bool)", + "useAdaptor": true + } + ], + "0xb70966c80d8727484d7d85b65c022ce136cadffc1aa72bd6362cd9e160598bf9": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "deposit_reward_token(address,uint256)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "deposit_reward_token(address,uint256)", + "useAdaptor": true + } + ], + "0x7cd4c1de57fa031316e3b61c1bca9160d4feb774986a819a7c4c04dc66d7d21e": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "initialize(address)", + "useAdaptor": true + }, + { + "taskId": "20220325-single-recipient-gauge-factory", + "contractName": "SingleRecipientGauge", + "signature": "initialize(address)", + "useAdaptor": true + }, + { + "taskId": "20220413-arbitrum-root-gauge-factory", + "contractName": "ArbitrumRootGauge", + "signature": "initialize(address)", + "useAdaptor": true + }, + { + "taskId": "20220413-polygon-root-gauge-factory", + "contractName": "PolygonRootGauge", + "signature": "initialize(address)", + "useAdaptor": true + }, + { + "taskId": "20220628-optimism-root-gauge-factory", + "contractName": "OptimismRootGauge", + "signature": "initialize(address)", + "useAdaptor": true + } + ], + "0x5d4f8bc2dd6ae588be27076524fbf4fc2a833c466ab107fda2e84bf2f59bc0ca": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "kick(address)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "kick(address)", + "useAdaptor": true + } + ], + "0xec1d467d9ab03a0079c22a89037209f5763aec973897ea763e2cf25d71a5f12e": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "killGauge()", + "useAdaptor": true + }, + { + "taskId": "20220325-single-recipient-gauge-factory", + "contractName": "SingleRecipientGauge", + "signature": "killGauge()", + "useAdaptor": true + }, + { + "taskId": "20220413-arbitrum-root-gauge-factory", + "contractName": "ArbitrumRootGauge", + "signature": "killGauge()", + "useAdaptor": true + }, + { + "taskId": "20220413-polygon-root-gauge-factory", + "contractName": "PolygonRootGauge", + "signature": "killGauge()", + "useAdaptor": true + }, + { + "taskId": "20220628-optimism-root-gauge-factory", + "contractName": "OptimismRootGauge", + "signature": "killGauge()", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "killGauge()", + "useAdaptor": true + }, + { + "taskId": "20220823-optimism-root-gauge-factory-v2", + "contractName": "OptimismRootGauge", + "signature": "killGauge()", + "useAdaptor": true + }, + { + "taskId": "20220823-arbitrum-root-gauge-factory-v2", + "contractName": "ArbitrumRootGauge", + "signature": "killGauge()", + "useAdaptor": true + }, + { + "taskId": "20220823-polygon-root-gauge-factory-v2", + "contractName": "PolygonRootGauge", + "signature": "killGauge()", + "useAdaptor": true + }, + { + "taskId": "20230217-gnosis-root-gauge-factory", + "contractName": "GnosisRootGauge", + "signature": "killGauge()", + "useAdaptor": true + }, + { + "taskId": "20230215-single-recipient-gauge-factory-v2", + "contractName": "SingleRecipientGauge", + "signature": "killGauge()", + "useAdaptor": true + }, + { + "taskId": "20230526-zkevm-root-gauge-factory", + "contractName": "PolygonZkEVMRootGauge", + "signature": "killGauge()", + "useAdaptor": true + }, + { + "taskId": "20230529-avalanche-root-gauge-factory", + "contractName": "AvalancheRootGauge", + "signature": "killGauge()", + "useAdaptor": true + }, + { + "taskId": "20230811-avalanche-root-gauge-factory-v2", + "contractName": "AvalancheRootGauge", + "signature": "killGauge()", + "useAdaptor": true + }, + { + "taskId": "20230911-base-root-gauge-factory", + "contractName": "BaseRootGauge", + "signature": "killGauge()", + "useAdaptor": true + } + ], + "0xd0090a09f425bba74e6c801fba7c6d15b44147ab0bd319e40076ce07e95168b6": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "set_reward_distributor(address,address)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "set_reward_distributor(address,address)", + "useAdaptor": true + } + ], + "0x1b288a1f96e75e2fda7a0c1ac5c35a7fd2c5e2e5c425c32152ae01f82545e2da": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "set_rewards_receiver(address)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "set_rewards_receiver(address)", + "useAdaptor": true + } + ], + "0x076e9815202aa39577192023cfa569d6504b003183b2bc13cd0046523dfa23ea": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "unkillGauge()", + "useAdaptor": true + }, + { + "taskId": "20220325-single-recipient-gauge-factory", + "contractName": "SingleRecipientGauge", + "signature": "unkillGauge()", + "useAdaptor": true + }, + { + "taskId": "20220413-arbitrum-root-gauge-factory", + "contractName": "ArbitrumRootGauge", + "signature": "unkillGauge()", + "useAdaptor": true + }, + { + "taskId": "20220413-polygon-root-gauge-factory", + "contractName": "PolygonRootGauge", + "signature": "unkillGauge()", + "useAdaptor": true + }, + { + "taskId": "20220628-optimism-root-gauge-factory", + "contractName": "OptimismRootGauge", + "signature": "unkillGauge()", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "unkillGauge()", + "useAdaptor": true + }, + { + "taskId": "20220823-optimism-root-gauge-factory-v2", + "contractName": "OptimismRootGauge", + "signature": "unkillGauge()", + "useAdaptor": true + }, + { + "taskId": "20220823-arbitrum-root-gauge-factory-v2", + "contractName": "ArbitrumRootGauge", + "signature": "unkillGauge()", + "useAdaptor": true + }, + { + "taskId": "20220823-polygon-root-gauge-factory-v2", + "contractName": "PolygonRootGauge", + "signature": "unkillGauge()", + "useAdaptor": true + }, + { + "taskId": "20230217-gnosis-root-gauge-factory", + "contractName": "GnosisRootGauge", + "signature": "unkillGauge()", + "useAdaptor": true + }, + { + "taskId": "20230215-single-recipient-gauge-factory-v2", + "contractName": "SingleRecipientGauge", + "signature": "unkillGauge()", + "useAdaptor": true + }, + { + "taskId": "20230526-zkevm-root-gauge-factory", + "contractName": "PolygonZkEVMRootGauge", + "signature": "unkillGauge()", + "useAdaptor": true + }, + { + "taskId": "20230529-avalanche-root-gauge-factory", + "contractName": "AvalancheRootGauge", + "signature": "unkillGauge()", + "useAdaptor": true + }, + { + "taskId": "20230811-avalanche-root-gauge-factory-v2", + "contractName": "AvalancheRootGauge", + "signature": "unkillGauge()", + "useAdaptor": true + }, + { + "taskId": "20230911-base-root-gauge-factory", + "contractName": "BaseRootGauge", + "signature": "unkillGauge()", + "useAdaptor": true + } + ], + "0x3aaa120451be1d03b5f871d8f553636453af4ac4fed808c66c169c212b199436": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "user_checkpoint(address)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "user_checkpoint(address)", + "useAdaptor": true + } + ], + "0xec9d6185ed79aed8edc19bc6fc25ca544504ab0970d25b191e5279100224502a": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "withdraw(uint256)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "withdraw(uint256)", + "useAdaptor": true + } + ], + "0xb69fa1eb7b5ac6d9f3d5b8707460dc80b1f871eb64473f46b1aaaed1002aec60": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeV5", + "signature": "withdraw(uint256,bool)", + "useAdaptor": true + }, + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "withdraw(uint256,bool)", + "useAdaptor": true + } + ], + "0xaa40669e74603d8e708eac95e60f78c35d5af4f59afdb700675f38c6534809f7": [ + { + "taskId": "20220325-mainnet-gauge-factory", + "contractName": "LiquidityGaugeFactory", + "signature": "create(address)", + "useAdaptor": true + }, + { + "taskId": "20220325-single-recipient-gauge-factory", + "contractName": "SingleRecipientGaugeFactory", + "signature": "create(address)", + "useAdaptor": true + }, + { + "taskId": "20220413-polygon-root-gauge-factory", + "contractName": "PolygonRootGaugeFactory", + "signature": "create(address)", + "useAdaptor": true + } + ], + "0x7361fe0e46cb276b41a98d4cd9737cc306ad42ab0b7acc664d99a8b0d4abc452": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "batch_cancel_boosts(uint256[256])", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "batch_cancel_boosts(uint256[256])", + "useAdaptor": true + } + ], + "0xcd3fec4da938be5771576fbd5ed3c07305517a176aad2a4257eda4a558c0ac27": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "batch_set_delegation_status(address,address[256],uint256[256])", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "batch_set_delegation_status(address,address[256],uint256[256])", + "useAdaptor": true + } + ], + "0xc82564c94b7d050939678c3432d24cc0bd077332b2831096f1a13bddf76cd4ea": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "burn(uint256)", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "burn(uint256)", + "useAdaptor": true + } + ], + "0x482e4412b4beb34200f82812026fbaa4f0cb609d547edabc2983bfdc89ddedcd": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "cancel_boost(uint256)", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "cancel_boost(uint256)", + "useAdaptor": true + } + ], + "0xce9c580a1e3377595db533643f032e9d7bf9544e31d696c48a16e797fa82d5ce": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "create_boost(address,address,int256,uint256,uint256,uint256)", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "create_boost(address,address,int256,uint256,uint256,uint256)", + "useAdaptor": true + } + ], + "0x2f8a062f8344cfe8574e9e6c67d0f3748802f02a2af653df71d38fb8ebd0bdde": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "extend_boost(uint256,int256,uint256,uint256)", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "extend_boost(uint256,int256,uint256,uint256)", + "useAdaptor": true + } + ], + "0x5082362308cf6060c96bdc9e34bcef0083316c7ea918f43666dccae67654e0d0": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "setApprovalForAll(address,bool)", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "setApprovalForAll(address,bool)", + "useAdaptor": true + } + ], + "0xeb64a3bdaa01387bfd7d1ce9cdddd6dbace525fca48858752f25b9bd5593a094": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "set_base_uri(string)", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "set_base_uri(string)", + "useAdaptor": true + } + ], + "0x6c714a4a280d2590fd368ce54a96f8d00d5e1c39e055865d883d61c3c9ebd1c5": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "set_delegation_status(address,address,bool)", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "set_delegation_status(address,address,bool)", + "useAdaptor": true + } + ], + "0xfae7a7297ab00ab24fb5a8c8b6dc308f1313e04bcfb997828c66cbed13627ea1": [ + { + "taskId": "20220325-veBAL-deployment-coordinator", + "contractName": "veBALDeploymentCoordinator", + "signature": "performFirstStage()", + "useAdaptor": true + }, + { + "taskId": "20220415-veBAL-L2-gauge-setup-coordinator", + "contractName": "veBALL2GaugeSetupCoordinator", + "signature": "performFirstStage()", + "useAdaptor": true + }, + { + "taskId": "20220418-veBAL-gauge-fix-coordinator", + "contractName": "veBALGaugeFixCoordinator", + "signature": "performFirstStage()", + "useAdaptor": true + }, + { + "taskId": "20220421-smart-wallet-checker-coordinator", + "contractName": "SmartWalletCheckerCoordinator", + "signature": "performFirstStage()", + "useAdaptor": true + } + ], + "0x8590f6c87bdb4c6e318a57ac14cfd44d71eafd37a1231eebe4d2bebe289fc705": [ + { + "taskId": "20220325-veBAL-deployment-coordinator", + "contractName": "veBALDeploymentCoordinator", + "signature": "performSecondStage()", + "useAdaptor": true + }, + { + "taskId": "20220415-veBAL-L2-gauge-setup-coordinator", + "contractName": "veBALL2GaugeSetupCoordinator", + "signature": "performSecondStage()", + "useAdaptor": true + } + ], + "0x84f74b497b7b8786ad28575751bcba78a869980750e3e59d9f753ecd753e7d50": [ + { + "taskId": "20220420-fee-distributor", + "contractName": "FeeDistributor", + "signature": "checkpointToken(address)", + "useAdaptor": true + }, + { + "taskId": "20220714-fee-distributor-v2", + "contractName": "FeeDistributor", + "signature": "checkpointToken(address)", + "useAdaptor": true + } + ], + "0x7e339947ebceb8dcc3475abfefba6050fd835e6d1eff9b9e9678e810d369682e": [ + { + "taskId": "20220420-fee-distributor", + "contractName": "FeeDistributor", + "signature": "checkpointTokens(address[])", + "useAdaptor": true + }, + { + "taskId": "20220714-fee-distributor-v2", + "contractName": "FeeDistributor", + "signature": "checkpointTokens(address[])", + "useAdaptor": true + } + ], + "0x9ccd42be79895ab5d68baf1ceb99044358d23c13dc7fd911b5af3d528ee8da8c": [ + { + "taskId": "20220420-fee-distributor", + "contractName": "FeeDistributor", + "signature": "checkpointUser(address)", + "useAdaptor": true + }, + { + "taskId": "20220714-fee-distributor-v2", + "contractName": "FeeDistributor", + "signature": "checkpointUser(address)", + "useAdaptor": true + } + ], + "0x3f0bd81e3d4307c9d877450060e9f456cdce2cd0dcc13c55435ca418fad441af": [ + { + "taskId": "20220420-fee-distributor", + "contractName": "FeeDistributor", + "signature": "claimToken(address,address)", + "useAdaptor": true + }, + { + "taskId": "20220714-fee-distributor-v2", + "contractName": "FeeDistributor", + "signature": "claimToken(address,address)", + "useAdaptor": true + } + ], + "0x2a02b42776ae382b5868eddf4a925d0eec90785dde1a5d48aaa55cd7cb9cf37a": [ + { + "taskId": "20220420-fee-distributor", + "contractName": "FeeDistributor", + "signature": "claimTokens(address,address[])", + "useAdaptor": true + }, + { + "taskId": "20220714-fee-distributor-v2", + "contractName": "FeeDistributor", + "signature": "claimTokens(address,address[])", + "useAdaptor": true + } + ], + "0xdf028848b388713ac0b5fd66beb36b7e230fb62844ad43ed9e894034570ecb71": [ + { + "taskId": "20220420-fee-distributor", + "contractName": "FeeDistributor", + "signature": "depositToken(address,uint256)", + "useAdaptor": true + }, + { + "taskId": "20220714-fee-distributor-v2", + "contractName": "FeeDistributor", + "signature": "depositToken(address,uint256)", + "useAdaptor": true + } + ], + "0x683bdec204c4a35996ebfb23eea0f4f62343598147ef9bf5a43fabbd0e9ed8d0": [ + { + "taskId": "20220420-fee-distributor", + "contractName": "FeeDistributor", + "signature": "depositTokens(address[],uint256[])", + "useAdaptor": true + }, + { + "taskId": "20220714-fee-distributor-v2", + "contractName": "FeeDistributor", + "signature": "depositTokens(address[],uint256[])", + "useAdaptor": true + } + ], + "0xa7eb8749bae4020b0007b643972b60456da2b6b92fa6b583c7277fc2dea05a39": [ + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "initialize(address,uint256)", + "useAdaptor": true + }, + { + "taskId": "20220823-optimism-root-gauge-factory-v2", + "contractName": "OptimismRootGauge", + "signature": "initialize(address,uint256)", + "useAdaptor": true + }, + { + "taskId": "20220823-arbitrum-root-gauge-factory-v2", + "contractName": "ArbitrumRootGauge", + "signature": "initialize(address,uint256)", + "useAdaptor": true + }, + { + "taskId": "20220823-polygon-root-gauge-factory-v2", + "contractName": "PolygonRootGauge", + "signature": "initialize(address,uint256)", + "useAdaptor": true + }, + { + "taskId": "20230217-gnosis-root-gauge-factory", + "contractName": "GnosisRootGauge", + "signature": "initialize(address,uint256)", + "useAdaptor": true + }, + { + "taskId": "20230526-zkevm-root-gauge-factory", + "contractName": "PolygonZkEVMRootGauge", + "signature": "initialize(address,uint256)", + "useAdaptor": true + }, + { + "taskId": "20230529-avalanche-root-gauge-factory", + "contractName": "AvalancheRootGauge", + "signature": "initialize(address,uint256)", + "useAdaptor": true + }, + { + "taskId": "20230811-avalanche-root-gauge-factory-v2", + "contractName": "AvalancheRootGauge", + "signature": "initialize(address,uint256)", + "useAdaptor": true + }, + { + "taskId": "20230911-base-root-gauge-factory", + "contractName": "BaseRootGauge", + "signature": "initialize(address,uint256)", + "useAdaptor": true + } + ], + "0xae60dce27f51ce5815357b9f6b40f200557867f8222262a1646c005d09b7dfba": [ + { + "taskId": "20220822-mainnet-gauge-factory-v2", + "contractName": "LiquidityGaugeV5", + "signature": "setRelativeWeightCap(uint256)", + "useAdaptor": true + }, + { + "taskId": "20220823-optimism-root-gauge-factory-v2", + "contractName": "OptimismRootGauge", + "signature": "setRelativeWeightCap(uint256)", + "useAdaptor": true + }, + { + "taskId": "20220823-arbitrum-root-gauge-factory-v2", + "contractName": "ArbitrumRootGauge", + "signature": "setRelativeWeightCap(uint256)", + "useAdaptor": true + }, + { + "taskId": "20220823-polygon-root-gauge-factory-v2", + "contractName": "PolygonRootGauge", + "signature": "setRelativeWeightCap(uint256)", + "useAdaptor": true + }, + { + "taskId": "20230217-gnosis-root-gauge-factory", + "contractName": "GnosisRootGauge", + "signature": "setRelativeWeightCap(uint256)", + "useAdaptor": true + }, + { + "taskId": "20230215-single-recipient-gauge-factory-v2", + "contractName": "SingleRecipientGauge", + "signature": "setRelativeWeightCap(uint256)", + "useAdaptor": true + }, + { + "taskId": "20230526-zkevm-root-gauge-factory", + "contractName": "PolygonZkEVMRootGauge", + "signature": "setRelativeWeightCap(uint256)", + "useAdaptor": true + }, + { + "taskId": "20230529-avalanche-root-gauge-factory", + "contractName": "AvalancheRootGauge", + "signature": "setRelativeWeightCap(uint256)", + "useAdaptor": true + }, + { + "taskId": "20230811-avalanche-root-gauge-factory-v2", + "contractName": "AvalancheRootGauge", + "signature": "setRelativeWeightCap(uint256)", + "useAdaptor": true + }, + { + "taskId": "20230911-base-root-gauge-factory", + "contractName": "BaseRootGauge", + "signature": "setRelativeWeightCap(uint256)", + "useAdaptor": true + } + ], + "0x817de1d55149f9976836222b163cd53ade05fea9f5ade499b4572e14d3561d6e": [ + { + "taskId": "20230217-gnosis-root-gauge-factory", + "contractName": "GnosisRootGaugeFactory", + "signature": "create(address,uint256)", + "useAdaptor": true + }, + { + "taskId": "20230526-zkevm-root-gauge-factory", + "contractName": "PolygonZkEVMRootGaugeFactory", + "signature": "create(address,uint256)", + "useAdaptor": true + } + ] +} \ No newline at end of file diff --git a/balpy/balancer-deployments/action-ids/mode/action-ids.json b/balpy/balancer-deployments/action-ids/mode/action-ids.json new file mode 100644 index 0000000..b6b82cd --- /dev/null +++ b/balpy/balancer-deployments/action-ids/mode/action-ids.json @@ -0,0 +1,271 @@ +{ + "20210418-authorizer": { + "Authorizer": { + "useAdaptor": true, + "actionIds": { + "grantRole(bytes32,address)": "0xdf8dac4c610c04d1c026c24a34eed1d5278784a12e495053d1644a6c3f1f409b", + "grantRoles(bytes32[],address)": "0x75dffffe89db3decbdcd9fe2adccd7eb23c84ece701921a6c17bfa5e54b19fab", + "grantRolesToMany(bytes32[],address[])": "0x4cbedcc70a408356865abcfa1f37a5a6952d7dc5b2dc95a61d4e34a011a120f5", + "renounceRole(bytes32,address)": "0x25ee4b047da85861c0f923b823fc50f8e515dab0e37abc7c43f2a5ea6a1138eb", + "revokeRole(bytes32,address)": "0x65173819177b6b5c0992b3212c17ca3958ea6edbf929d2eb2f1a3005ce71b1b3", + "revokeRoles(bytes32[],address)": "0xcbaf40370f394823befdc12d8bdf2f9c70bf866f295253403ffbfbfa5645be4d", + "revokeRolesFromMany(bytes32[],address[])": "0xe4f6b27978af2cf814873502f54bca9229c821837b2c0b2b342c8d9d9701c5d7" + } + } + }, + "20210418-vault": { + "Vault": { + "useAdaptor": false, + "actionIds": { + "batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)": "0x1282ab709b2b70070f829c46bc36f76b32ad4989fecb2fcb09a1b3ce00bbfc30", + "deregisterTokens(bytes32,address[])": "0xe4f8ff74aa05a4d54a06e035d5e86947bc6474f8d7b166ebeb49fc9178d28551", + "exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0xc149e88b59429ded7f601ab52ecd62331cac006ae07c16543439ed138dcb8d34", + "flashLoan(address,address[],uint256[],bytes)": "0x96ebe854ca6ab6242ad127dcd7809576513b0c64571e515cedd7b8885612c82d", + "joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x78ad1b68d148c070372f8643c4648efbb63c6a8a338f3c24714868e791367653", + "managePoolBalance((uint8,bytes32,address,uint256)[])": "0x7275fb98594b03dc36a7de69051058e9e2d05cabeb4fe7d9c87bc69f94d9d084", + "manageUserBalance((uint8,address,uint256,address,address)[])": "0xeba777d811cd36c06d540d7ff2ed18ed042fd67bbf7c9afcf88c818c7ee6b498", + "queryBatchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool))": "0xf5f701b3adfba2adad8f16a8be5a989593e42a2caa84c5c6e60b22143db65a2f", + "registerPool(uint8)": "0x956dfce4343a6be4df20714d3dc413ef59e73fa9995d3d247e7c8d12efd33ac2", + "registerTokens(bytes32,address[],address[])": "0xad5bd4a1cc4243b4d772a8a55d24792c1f57cc45eb97ed1291b82d96125a7626", + "setAuthorizer(address)": "0x1cbb503dcc0f4acaedf71a098211ff8b15a220fc26a6974a8d9deaab040fa6e0", + "setPaused(bool)": "0xb5593fe09464f360ecf835d5b9319ce69900ae1b29d13844b73c250b1f5f92fb", + "setRelayerApproval(address,address,bool)": "0x0014a06d322ff07fcc02b12f93eb77bb76e28cdee4fc0670b9dec98d24bbfec8", + "swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)": "0x7b8a1d293670124924a0f532213753b89db10bde737249d4540e9a03657d1aff" + } + }, + "ProtocolFeesCollector": { + "useAdaptor": false, + "actionIds": { + "setFlashLoanFeePercentage(uint256)": "0xbe2a180d5cc5d803a8eec4cea569989fc1c593d7eeadd1f262f360a68b0e842e", + "setSwapFeePercentage(uint256)": "0xb28b769768735d011b267f781c3be90bce51d5059ba015bc7a28b3e882fb2083", + "withdrawCollectedFees(address[],uint256[],address)": "0xb2b6e48fa160a7c887d9d7a68b6a9bb9d47d4953d33e07f3a39e175d75e97796" + } + }, + "BalancerHelpers": { + "useAdaptor": true, + "actionIds": { + "queryExit(bytes32,address,address,(address[],uint256[],bytes,bool))": "0xba73e1903ac720c1bb67c4851b689ceb5ab0f9da5e713e5c7fe5ba8767672bc1", + "queryJoin(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x967128b0a0c8d7bc03e4eda1875c4e7a9071005ab433bb24d9c4ee1a81fc75ab" + } + } + }, + "20211202-no-protocol-fee-lbp": { + "NoProtocolFeeLiquidityBootstrappingPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address,bool)": "0xedc48a80566802836037435fb568ae80a9ab4a14b2a6bc28abc8fc4bf75a6585", + "disable()": "0x1426567817459896eea032971802f23ffedf7dbce9ba83c56000f1f9616a25ed" + } + }, + "NoProtocolFeeLiquidityBootstrappingPool": { + "useAdaptor": false, + "factoryOutput": "0x197868C915E50cD7eB34EB2F56009E0BF9aa09EB", + "actionIds": { + "setAssetManagerPoolConfig(address,bytes)": "0x1ba95a5d8b257ba1fea475be6dd05792861372cdac8dcb01f7333a17df33523b", + "setPaused(bool)": "0x15678e67eeb343f2391c74a9504c09ec00a7d99bcb772fb6d4dd98dbb6ae90c9", + "setSwapEnabled(bool)": "0xfd7b15747696c0216c9e19dc142f8b5677c704b79a8dd14416277f79e18f51ec", + "setSwapFeePercentage(uint256)": "0x846447d11e52871f13911642f2df294a08a10c704fd3746ee2b8e99ef3dd802a", + "updateWeightsGradually(uint256,uint256,uint256[])": "0x71b6bb1366164b9eb6552b480e14fab0ea699941d6c87d4d57e8e1aa418af5f6" + } + } + }, + "20220517-protocol-fee-withdrawer": { + "ProtocolFeesWithdrawer": { + "useAdaptor": false, + "actionIds": { + "allowlistToken(address)": "0xfcaa4e032215ae08d7ddbe2b6fa9e1238e9145985a4e7ec72b4ca19d630f23b6", + "denylistToken(address)": "0xb402f1c527ae841a6ab9272b0b11576bb706145b9e1857103b96b31606cb995a", + "withdrawCollectedFees(address[],uint256[],address)": "0x000dfb61af4938ab97859cfdca0fcf16419f15e36c90216b41d5e38d72ef208e" + } + } + }, + "20220725-protocol-fee-percentages-provider": { + "ProtocolFeePercentagesProvider": { + "useAdaptor": false, + "actionIds": { + "registerFeeType(uint256,string,uint256,uint256)": "0x76a94c625b0feffae92816a97ef0d42c3c1e55d271bffe62805e16fc2206011c", + "setFeeTypePercentage(uint256,uint256)": "0x1c81700c4527c26bb9aa170d0053c053b25de1492f19267ac6be7f8c62ef5569" + } + } + }, + "20221123-pool-recovery-helper": { + "PoolRecoveryHelper": { + "useAdaptor": false, + "actionIds": { + "addPoolFactory(address)": "0x921076734257eb232f70b5aff2cae0f998b4e1aa7a55ae3a0af1ce8629c33da9", + "enableRecoveryMode(address)": "0xbf8cb9aefe2156a61c14e2d4b66c359a00681bdd9c281905c58337ab27fb5e31", + "removePoolFactory(address)": "0x8cda99fc04bda5395d59be6ecac7c4311f4b7fd26fdc0a111934a1aeb5c4637f" + } + } + }, + "20230223-protocol-id-registry": { + "ProtocolIdRegistry": { + "useAdaptor": false, + "actionIds": { + "registerProtocolId(uint256,string)": "0xcdf8a72988961264bb6330f6907f1a0833ad472cbc1d9522cc8e23d8b6e7fbb9", + "renameProtocolId(uint256,string)": "0xb484eabe5a2eb23a030770c8418e6b7ac968a740108f25f9360bc2bae2c41e4c" + } + } + }, + "20230316-child-chain-gauge-factory-v2": { + "ChildChainGauge": { + "useAdaptor": true, + "actionIds": { + "add_reward(address,address)": "0xf27822b70ee081744165c05eea053ce08242fb70b8c76d0839da1cf7a4f5fa01", + "claim_rewards()": "0x0d9692307648b505fa731d62045fed474bcd867e8a75eb20ff7c63daeb45f082", + "claim_rewards(address)": "0xf2c761c056794ab38810b888b0e5bdfc78396f1f14d268bfa30dabb1df10dea5", + "claim_rewards(address,address)": "0xed4a78b72bd43e0df2f4b6804f483adb971177fb6d6da0b303b84850f2a6b700", + "claim_rewards(address,address,uint256[])": "0xe867b9501b9c98a1a114122c202165e0f8998f8a052baefe0fcd1bf8bb3a9e91", + "claimable_tokens(address)": "0x1713de504f2e05cbe494b718dd47ec88d4f9a32b4dc8de2199feef5e4e5495b5", + "deposit(uint256)": "0x93dc451842cdb2d39f3632a87afc112a3681c793a93ebc6fd80311bee5e95014", + "deposit(uint256,address)": "0x4acdc2124f52afa6dd744a821c28b9423367d2f65f179c793a018ed65d719037", + "deposit_reward_token(address,uint256)": "0xd6b798714d8ea75e2fe24c9d15f01dc589a2c62f3c7e00b6888de658aabc0897", + "initialize(address,string)": "0xc495147f17252f6cb65160d3a965599d57968619609c29967b76b76ec66bb506", + "killGauge()": "0x61a056d849339fca8a658d3e0a62317a13e0577e602c3c0ad0e9b4bba1b4229e", + "set_reward_distributor(address,address)": "0x603ba459e5bfca68c1b7b9babc9136a997eaffd125b314a7ca705cb943e36c3d", + "set_rewards_receiver(address)": "0x45a31f678c95926def9d137c078cc32c856abab82a059783a6ec0e1d87e8e2a4", + "unkillGauge()": "0x7fa1faff84bf26bd22b205c672a4955c8857229fdf35006c1de4b9de88ffad80", + "user_checkpoint(address)": "0x8e7c10e2b7675abaebf368dd6c4955a3955b99d6f13c79ff541c1d5c1767be75", + "withdraw(uint256)": "0xb7b10b005d4564e1409341811aa52bf4b67bd9a954b31e21cabbdcf81004b803", + "withdraw(uint256,address)": "0xbc4b04f9fd700e1d156e58b5149dce0fa134dd23c9deeb56151761d249e20aa2" + } + }, + "ChildChainGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address)": "0xfee74d3c6771dcfcae4f4d9117bbada0d862f492d47823c0815f7502c7b8044c" + } + } + }, + "20230316-l2-balancer-pseudo-minter": { + "L2BalancerPseudoMinter": { + "useAdaptor": false, + "actionIds": { + "addGaugeFactory(address)": "0xc62030304ed47ad6c73df117390460e9a9eb89545f65e50808e1fd1a529e8dce", + "mint(address)": "0x6647f44670ca7e6c9a771525139e2458de6296e59967642f8a4faf794c0bcecb", + "mintFor(address,address)": "0x0424c81df560520cbf689b272d5d16128293a0d16a38fb9e933ea07a4c92d764", + "mintMany(address[])": "0xed1de903e85a3ea0483ce524c085d2a5a7dddf4e8a4efeecd95a155550b51a50", + "mintManyFor(address[],address)": "0x1368a6157cbf2fc453fcb43b78e2fbc894c4ddc94761ab91d3f6e479ec250026", + "mint_for(address,address)": "0x5bb09d1f4abd867ad7d0b9820019b6ba462b9491ab3eb98948aba30350b01738", + "mint_many(address[8])": "0x0619620320e912118584aef65b4f25550fa92422c45e3192aeff6afc8345f3e1", + "removeGaugeFactory(address)": "0xb285561980f0172d463cdf1aeeaaa1ccf927e4187d9fb7d3ac455d5b5aca5389", + "setMinterApproval(address,bool)": "0x50787e4ce8f9b2d7e0c141238cde45485d2dbc404c4a60300a2b779f2c05660a", + "setMinterApprovalWithSignature(address,bool,address,uint256,uint8,bytes32,bytes32)": "0x3703de5d4c5b4110d564b7971bd74b50a565e9fff27aad4aea642de689c2b9c3", + "toggle_approve_mint(address)": "0x2cf8e6112777ae7878944ad191a844ca626471be335cd63943a9bcc0e67ebecf" + } + } + }, + "20230316-l2-ve-delegation-proxy": { + "NullVotingEscrow": { + "useAdaptor": true, + "actionIds": {} + }, + "VotingEscrowDelegationProxy": { + "useAdaptor": false, + "actionIds": { + "killDelegation()": "0x5eef9a52b0de25da88a4e26aadaaa0e98345cffdfd3bc369f219ffb6aaaae952", + "setDelegation(address)": "0x2ce3bc6cc21821706703a9082d137a91ae532f5991bfe34f6116b09beef315c3" + } + } + }, + "20230320-weighted-pool-v4": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address,bytes32)": "0x66a8999dc0fac2718fd309f6d363f3e7255bd3f33a3ca26bcca3114f68d0b1d8", + "disable()": "0xd9801dfe2a5b9b3b528585abebb08cd61b35502437c6bec85414ff7aaa387f84" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0xCb528CFe5EfC65a77901d20B3E899Ecd9A8190b7", + "actionIds": { + "disableRecoveryMode()": "0x89ce0fb3fd125d40bdba888621c31de76a4e1f9ee5584606f5b9576764441ff1", + "enableRecoveryMode()": "0xf0136d1b61d53c1164668375458dd86685a88c5324271349ace94b5f2743a932", + "pause()": "0x7533f5ec889e599162d5b62c7931b402430fe4e92f30ca02054986fc9ba5f0d5", + "setAssetManagerPoolConfig(address,bytes)": "0x36c8c25132638b118635a23a245ee0e13d27ad4032586a51fcba14a37bfa7ba4", + "setSwapFeePercentage(uint256)": "0xa1d496e6430b89d0d1db0f2a465fa90c6869e0fa261764f9ded0fc763c7fe5a6", + "unpause()": "0xb63543fd6735d975f46866207408fedcbec717a7f42c80767557da128faa102d", + "updateProtocolFeePercentageCache()": "0x5e31e9065c7698243608f7fba86cb8d95bfbd876d3d32e3802af7290271eee08" + } + } + }, + "20230411-managed-pool-v2": { + "ManagedPoolAddRemoveTokenLib": { + "useAdaptor": true, + "actionIds": {} + }, + "CircuitBreakerLib": { + "useAdaptor": true, + "actionIds": {} + }, + "ManagedPoolAmmLib": { + "useAdaptor": true, + "actionIds": {} + }, + "ExternalWeightedMath": { + "useAdaptor": true, + "actionIds": {} + }, + "RecoveryModeHelper": { + "useAdaptor": true, + "actionIds": {} + }, + "ManagedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create((string,string,address[]),(address[],uint256[],uint256,bool,bool,uint256,uint256),address,bytes32)": "0x1fcb2656a406c87f461a87a1b4c2b23ebc74385776e2355a125d56a1b4c4197a", + "disable()": "0x209075578b0c6819e5f117c0e9c4cafdfb4bac956e8ea969ff11fb444cd95b08" + } + }, + "ManagedPool": { + "useAdaptor": false, + "factoryOutput": "0xB227B52B20a755B8b724c63E8Ac8d42Ff0FD64Fd", + "actionIds": { + "addAllowedAddress(address)": "0x4acfc6d6c9e3fb9d74d3f46d039d686de255450c294130ab4f8ee646c64323f8", + "addToken(address,address,uint256,uint256,address)": "0xbfd93b41c58e1e25835ae8404b1b8654c99a4635a4051e93d0aa006754e540b6", + "collectAumManagementFees()": "0x7d904159241a8dde0eda5d796627eac783dd86a0ad493fe556c40a69dee55d4e", + "disableRecoveryMode()": "0xb4b8b756b9cc9f73e9debc41c8f8a805f6f964192d26d6f1bf764f147279bc8b", + "enableRecoveryMode()": "0x7f42c77cb4b9f8e5f51b922886e6f62e00feaf246cccf2927a0f00dd3150e1ae", + "pause()": "0xb4dacaceeadf349e2eaf81fae99db22f312f7b8d19bd3aa0aae4d74e8c40460a", + "removeAllowedAddress(address)": "0x5bad9b89e68b56e7130195ead5f061b476c458516f4ac51c2d1374383cfa3b01", + "removeToken(address,uint256,address)": "0x808e03940ff9e8d0d81d1877d4063e9ad88d4abbb181e2a01ae935c4c7ff6a25", + "setCircuitBreakers(address[],uint256[],uint256[],uint256[])": "0x4058e9c3150af81b84943f4e7adcb9cbde58ff3ec179678d95f983cccc2d7c68", + "setJoinExitEnabled(bool)": "0x5ac1ad74c60a8f405242e1cb58baf174673ecf7ef6f2521ff671203bcc170bb8", + "setManagementAumFeePercentage(uint256)": "0x8f462eb0af3bb82df990966fc8167202e721814974733d3dd6d10a55569bc30f", + "setMustAllowlistLPs(bool)": "0xf226835d85be0e3e2cfc23537ba229cac0c775765454c59cc7e99177ea21e936", + "setSwapEnabled(bool)": "0x6958507be77ff642d1453d38339351a343ef84ceb64bd2b3e62c8ae04a0b41cc", + "unpause()": "0x86078096bf00c620888f75fefc7995876dbc9d3989a6a53e6fdd6c6de92d6397", + "updateProtocolFeePercentageCache()": "0xc626e2a3337b4fec269bd52e00229175e172988373a96bfea4742ad7fbfe42cd", + "updateSwapFeeGradually(uint256,uint256,uint256,uint256)": "0x677f65cc53832dc395d51de7d84d915235ea242d920e5300c89b3ce28bae29fa", + "updateWeightsGradually(uint256,uint256,address[],uint256[])": "0x19ff273a678f719b0564696bb5c39a2ed5ba53378c4123c77a16ee1a89d34d68" + } + } + }, + "20240223-composable-stable-pool-v6": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool,uint256,address,bytes32)": "0x4166ceb779aaf4f06bc623243744677131711ad24b8e33d7538ddc428039bb61", + "disable()": "0x4d30cbc2e28f426257db0dd64beff2e6fd04e66b7453e947fecc1cf4d0b4eef7" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0xaFCFA565B8e00A3b3EB789dfa19261ed7DCA42C7", + "actionIds": { + "disableRecoveryMode()": "0x78e171b83fd24ae6c171f11e0f0f0684eefe774a0808464f4e60c9621fd7fd06", + "enableRecoveryMode()": "0xccaf05adf78d1e0bda037c9eaa020571023c007befc81506bbe8ae647cdf260c", + "pause()": "0x7610899afab87ac343d3033932882e61b78ae3df6c6ca132e39b607f1761c624", + "setAssetManagerPoolConfig(address,bytes)": "0x6b6c98d475b23bfbe13f0133b34e5e708aa6a62dd3d6d95d3f2b662237cef11d", + "setSwapFeePercentage(uint256)": "0xa78f1cb63d3f446e1e9b8487adb64f8eb62fb54ea65fcacb2c71bd3984818985", + "setTokenRateCacheDuration(address,uint256)": "0x62efee17f2de6e78f0bc71735263f13d91e97413dbbfbd5cd8e72873e5c3590a", + "startAmplificationParameterUpdate(uint256,uint256)": "0xe14e689f3fefda81a75d35b8e900ec0af04143ad3c43dfc6f460cfb0a45815f6", + "stopAmplificationParameterUpdate()": "0x9a098720ece757a23df7742e3f16c6ad6e0610120f10c8edbd6ac53cd9b7c951", + "unpause()": "0x1296ab3911286328377839092754e201ed9b3eb43b03feac563f3120804555a5", + "updateProtocolFeePercentageCache()": "0xd1493daaccc52413773f7780816057526a9253db2588f3ee697a7b32c019ab34", + "updateTokenRateCache(address)": "0x0de31dd9b4271162a24ad9c87f73dcf5433e4b45a183ff0efe7a8983b0ed1a1c" + } + } + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/action-ids/optimism/action-ids.json b/balpy/balancer-deployments/action-ids/optimism/action-ids.json new file mode 100644 index 0000000..878b043 --- /dev/null +++ b/balpy/balancer-deployments/action-ids/optimism/action-ids.json @@ -0,0 +1,698 @@ +{ + "20210418-authorizer": { + "Authorizer": { + "useAdaptor": true, + "actionIds": { + "grantRole(bytes32,address)": "0x3b5aa417f440ce599b5fcebc425f7ea46ff4c105a0c529a180642cb6b1740346", + "grantRoles(bytes32[],address)": "0x27a96293b7f504e5fa28c9a799467561bbcb1bc08277f60d3d1140f315e54ec6", + "grantRolesToMany(bytes32[],address[])": "0x0a754de8c17cd28fc6dbb29f41c51150449409f1a6ee78e889013d476b890238", + "renounceRole(bytes32,address)": "0x46bd31898e4be3efd0e0127e710aa0427308b6220bb5b8286230d4f7a596f0cb", + "revokeRole(bytes32,address)": "0x2b2ed92fb51ba70a0a86c61efb68d77cc578f6f7ef30933df5d5506f8bf537b2", + "revokeRoles(bytes32[],address)": "0xc89adbc6dae79ab0bb0416f93f4416270b446ecd58147c38b5e923ddca936766", + "revokeRolesFromMany(bytes32[],address[])": "0x9ebe3bdeeba42f0d5055085e3f83fabdd85ca79f011278cd51814b75d0f522b3" + } + } + }, + "20210418-vault": { + "Vault": { + "useAdaptor": false, + "actionIds": { + "batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)": "0x1282ab709b2b70070f829c46bc36f76b32ad4989fecb2fcb09a1b3ce00bbfc30", + "deregisterTokens(bytes32,address[])": "0xe4f8ff74aa05a4d54a06e035d5e86947bc6474f8d7b166ebeb49fc9178d28551", + "exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0xc149e88b59429ded7f601ab52ecd62331cac006ae07c16543439ed138dcb8d34", + "flashLoan(address,address[],uint256[],bytes)": "0x96ebe854ca6ab6242ad127dcd7809576513b0c64571e515cedd7b8885612c82d", + "joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x78ad1b68d148c070372f8643c4648efbb63c6a8a338f3c24714868e791367653", + "managePoolBalance((uint8,bytes32,address,uint256)[])": "0x7275fb98594b03dc36a7de69051058e9e2d05cabeb4fe7d9c87bc69f94d9d084", + "manageUserBalance((uint8,address,uint256,address,address)[])": "0xeba777d811cd36c06d540d7ff2ed18ed042fd67bbf7c9afcf88c818c7ee6b498", + "queryBatchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool))": "0xf5f701b3adfba2adad8f16a8be5a989593e42a2caa84c5c6e60b22143db65a2f", + "registerPool(uint8)": "0x956dfce4343a6be4df20714d3dc413ef59e73fa9995d3d247e7c8d12efd33ac2", + "registerTokens(bytes32,address[],address[])": "0xad5bd4a1cc4243b4d772a8a55d24792c1f57cc45eb97ed1291b82d96125a7626", + "setAuthorizer(address)": "0x1cbb503dcc0f4acaedf71a098211ff8b15a220fc26a6974a8d9deaab040fa6e0", + "setPaused(bool)": "0xb5593fe09464f360ecf835d5b9319ce69900ae1b29d13844b73c250b1f5f92fb", + "setRelayerApproval(address,address,bool)": "0x0014a06d322ff07fcc02b12f93eb77bb76e28cdee4fc0670b9dec98d24bbfec8", + "swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)": "0x7b8a1d293670124924a0f532213753b89db10bde737249d4540e9a03657d1aff" + } + }, + "ProtocolFeesCollector": { + "useAdaptor": false, + "actionIds": { + "setFlashLoanFeePercentage(uint256)": "0xbe2a180d5cc5d803a8eec4cea569989fc1c593d7eeadd1f262f360a68b0e842e", + "setSwapFeePercentage(uint256)": "0xb28b769768735d011b267f781c3be90bce51d5059ba015bc7a28b3e882fb2083", + "withdrawCollectedFees(address[],uint256[],address)": "0xb2b6e48fa160a7c887d9d7a68b6a9bb9d47d4953d33e07f3a39e175d75e97796" + } + } + }, + "20210418-weighted-pool": { + "WeightedPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address)": "0x4d5282066a5fda3f5736198513ee33edf792164c299f2e59fbb6f6c7040ce7ad" + } + }, + "WeightedPool2TokensFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256[],uint256,bool,address)": "0x52df70aac861355cfd394f6f8947bfab3c6f1738478300ecc0a35cc1632d8995" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0x34A81e8956BF20b7448b31990A2c06F96830a6e4", + "actionIds": { + "setPaused(bool)": "0xb175321bb12100f9cd00c1e223f12597e71012d08487d09c03745d7e8b6bfa6e", + "setSwapFeePercentage(uint256)": "0xce2ff98f438259b5f78b8cf5818e70fcc2ff35b13dc38356616b1431cea9726e" + } + }, + "WeightedPool2Tokens": { + "useAdaptor": false, + "factoryOutput": "0x0A54996Ce9cEAA449Cde73dA6aA0368bfe3df6Dc", + "actionIds": { + "enableOracle()": "0x13abbbfd4f15a79011552decbdb20dbc44fac4fe252ef9175b56316630226b18", + "setPaused(bool)": "0x33651f97c60f5c9bae32e34d4affa67d26b9b3bb7fe727a08b22d54e60dc9e0a", + "setSwapFeePercentage(uint256)": "0xb6202de0535d339310cb6bbbe84445fab2c4f3560adc56dfa561ec6867d2d5c0" + } + } + }, + "20210624-stable-pool": { + "StablePoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256,uint256,address)": "0xef125e2073fd815c55c2f04fed98ba5218e2082ace09e017398ea7e1cdb2cb35" + } + } + }, + "20210727-meta-stable-pool": { + "QueryProcessor": { + "useAdaptor": true, + "actionIds": {} + }, + "MetaStablePoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],uint256,bool,address)": "0x35a3db544cfbcb07e2aa5288331e259147eb73fa71abbf042d2e30f883336c9f" + } + } + }, + "20211202-no-protocol-fee-lbp": { + "NoProtocolFeeLiquidityBootstrappingPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address,bool)": "0x49c10fad4fc863968eb513ff0ef990b8a5f4c5f9eda659d2dcc2a3bd03493805", + "disable()": "0x0a7c328c61ac04bc0e79818b5fa98658f18c222d04e7433de4d87fcbfa15e08e" + } + } + }, + "20220413-child-chain-gauge-factory": { + "RewardsOnlyGauge": { + "useAdaptor": true, + "actionIds": { + "claim_rewards()": "0xa1fcfa4f107b70052cfbb2e460d99c96f9b18c1197671fe00ab59c32adcddbeb", + "claim_rewards(address)": "0x1c866c9ea7b119a642f593024ced6088dbde65d041e5d3e826b9ad49b949a64b", + "claim_rewards(address,address)": "0x17b18f02fd5498a6aba17d20977b1a8a08f888d821999613fee42f9f9acb0bd9", + "claimable_reward_write(address,address)": "0x0ae6cb447a316668297b7077e3d07e7df1d2001bdc89167b0d0a9a7b7414e713", + "deposit(uint256)": "0x514b6f05525a3f31c3bde60d063e91e88204c5cdc5b35934513f911943b97fcc", + "deposit(uint256,address)": "0x360a8a15589674642b2125956d96757fc2f06ff1b968333271de16a20e01df05", + "deposit(uint256,address,bool)": "0x7572a9d124a97112d9e0f610651c79f13cf257bea3a71e38663b8a23875a2241", + "initialize(address,address,bytes32)": "0x239fe96ab7982152599e758a36dc414951eb8be491da93c1d24063d06bd4cbcd", + "set_rewards(address,bytes32,address[8])": "0x62ec7b8b11ad5ac9716cef94d52c76a2f61556acd1ef19368ac7513db9e75225", + "set_rewards_receiver(address)": "0x1b288a1f96e75e2fda7a0c1ac5c35a7fd2c5e2e5c425c32152ae01f82545e2da", + "withdraw(uint256)": "0xec9d6185ed79aed8edc19bc6fc25ca544504ab0970d25b191e5279100224502a", + "withdraw(uint256,bool)": "0xb69fa1eb7b5ac6d9f3d5b8707460dc80b1f871eb64473f46b1aaaed1002aec60" + } + }, + "ChildChainStreamer": { + "useAdaptor": true, + "actionIds": { + "add_reward(address,address,uint256)": "0xd54fd445a35e651b63eff303ec1fb15f5c5580b4b544f052cf3ecfe323092632", + "get_reward()": "0x88548165e54d29b8d637ac6d66d01f08681055cffe227c13bf9010cb83e78bc7", + "initialize(address)": "0x7cd4c1de57fa031316e3b61c1bca9160d4feb774986a819a7c4c04dc66d7d21e", + "notify_reward_amount(address)": "0xf5567e3e06eaf06daf0617f0048403b4fc0af19ead758a00eaa16d1506419816", + "remove_reward(address,address)": "0xa3e34c8935c49392f922e4123bdf4c7807d3c75e449fd63564ede2e3991bdbb6", + "set_reward_distributor(address,address)": "0xd0090a09f425bba74e6c801fba7c6d15b44147ab0bd319e40076ce07e95168b6", + "set_reward_duration(address,uint256)": "0xb6d04e1ff9fac8831d9201ea45174f6def27864ee365a0681556639dbcde2921" + } + }, + "ChildChainLiquidityGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address)": "0xaa40669e74603d8e708eac95e60f78c35d5af4f59afdb700675f38c6534809f7" + } + } + }, + "20220513-double-entrypoint-fix-relayer": { + "DoubleEntrypointFixRelayer": { + "useAdaptor": true, + "actionIds": { + "exitBTCStablePool()": "0xc3c57d80acf8fa377fb865720f7ee10ad4aca7109b303fbb71d2908ca6844744", + "exitSNXWeightedPool()": "0xe6817433212f634fbe74775c5a6d479ff55bb4cada528cc35724754b3e5d9bf7", + "receiveFlashLoan(address[],uint256[],uint256[],bytes)": "0x6d9f128845c731272c63ac23b090d6ac72ef10b7eb6e4c5eb279bebf0e7b5c59", + "sweepDoubleEntrypointToken(address[])": "0x08538fe199982f8b4355d4f2bdb1394308786ab97d5f72629add67d66fd516c5", + "sweepSNXsBTC()": "0x1961e53f2732b026e902916369409c15c33ad87401cb826c58c3ef5ee3544dd2" + } + } + }, + "20220517-protocol-fee-withdrawer": { + "ProtocolFeesWithdrawer": { + "useAdaptor": false, + "actionIds": { + "allowlistToken(address)": "0x0a8e2a23b91a13bdf94c180701d084c4233e04d4eff553c5a73cff98fe039754", + "denylistToken(address)": "0x6d2a96701a73b0171686ba194f8740bc430fc26e275013152220068d0ed9e25d", + "withdrawCollectedFees(address[],uint256[],address)": "0x5a57bdde85c7a823e064d8cdc9a9a1b617f739068ec8925eaf6a562aa22513c6" + } + } + }, + "20220527-child-chain-gauge-token-adder": { + "ChildChainGaugeTokenAdder": { + "useAdaptor": false, + "actionIds": { + "addTokenToGauge(address,address,address)": "0x14a22df2f48794cc8009e6215dc76bacfcaae723197c4f76e9199c9cdd581377" + } + } + }, + "20220725-protocol-fee-percentages-provider": { + "ProtocolFeePercentagesProvider": { + "useAdaptor": false, + "actionIds": { + "registerFeeType(uint256,string,uint256,uint256)": "0x2dd199aecbb0ff497737b0957b8021a15b5c1a270756648140c7f04264494572", + "setFeeTypePercentage(uint256,uint256)": "0xc590d1824cb11a50f3d081768a616d291aa32f60faa7f4a4be551885a96e2eea" + } + } + }, + "20220817-aave-rebalanced-linear-pool": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address)": "0x91295eba4573d35616fee30fe6fe06f89be94136d2dd6658bb36c93577b21b01", + "disable()": "0xe55819ea19bc69b0b5b19180d8847296d579facecfbe27ba16d7d9940aca0ae5" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x5d8955a2068ee6d1f7ab17640301219afa4b526f", + "actionIds": { + "disableRecoveryMode()": "0xa6f6c0637d53c2ae238b3e5208c5de62946d38555cb39d58f50559de237454b1", + "enableRecoveryMode()": "0xc8a0a3c76e0956fd4bcf641c17b55624b061cc98a564e20c7970df98ecadb154", + "initialize()": "0xbdc6f16f4d931798de70549be3562d2c01d5c0d2d559d729f2cc9f24a7d1e790", + "pause()": "0x6e961d95077acbe45f054b20b277b2e56ab7d35ba632f0d71a7ea1b48ca3e7e9", + "setAssetManagerPoolConfig(address,bytes)": "0xb19d99a0a5d4b9ab67b150ca7c763e5c08eea8ee711457b60b6c07a29de3b64f", + "setSwapFeePercentage(uint256)": "0xb440521601245c504e842f9580cabe88c3718e8eccd49f4a077b092ad010a967", + "setTargets(uint256,uint256)": "0xc01b11d5a2f4ee957997d10342772e3140603f0dad8741f7407662573682daf7", + "unpause()": "0x7e82eda3057396200811c8c0ece0c5638d4f2a78645f9d05fd0da9072dc4815f" + } + } + }, + "20220906-composable-stable-pool": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address)": "0x1118ad8f5b5bbeda2680575f94dd15ba613cef4276661f1ddc543c1db3f54fe6", + "disable()": "0xd9049e35b4af4ed3a308c76cd91b94baafcc84b2e3c4c87ca20f97a24553dc7c" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0xb0f2c34b9cd5c377c5efbba3b31e67114810cbc8", + "actionIds": { + "disableRecoveryMode()": "0x53a0625529c519f2e4a706b874baf30797466df455c9d39cd3ee19e6fe5bc6e2", + "enableRecoveryMode()": "0xa0bf4d17d2c334481887d815db60045ccbed929ffaf7204b103fdaf02da1165e", + "pause()": "0x24036eb62ce524727fa4253487ef43a97e2bd42a6f6bf456ff50b9a09b96d838", + "setAssetManagerPoolConfig(address,bytes)": "0xccd1df38c5828c2419224239d070559fe93e56abf830b77499263708261b2658", + "setSwapFeePercentage(uint256)": "0x2baf3a8f288df76fcdcd2f9c11612a657bc07e81330e7f074029fa913611f158", + "setTokenRateCacheDuration(address,uint256)": "0x5abd0bceadc99cb62ce42fd6ce77e71684c547d6aaa38c1b9e1a62028d768fb4", + "startAmplificationParameterUpdate(uint256,uint256)": "0xfcae3618cacd4c3af6de6aadff6ac4384bda88ca6cf84f0439d41fb42ac8f11a", + "stopAmplificationParameterUpdate()": "0x9c85d51b1b6e480e73aa9f45e2b871785cc22222e7ffc027a52442ae9189db8d", + "unpause()": "0x88c9a0ef2efbcdd94d87b8288e91f7c579a09deb7803626ba60f51b9ceff17a6", + "updateProtocolFeePercentageCache()": "0x0c793afce87230324a7ba4b959576732e44fafe69e09ec9a18f21871231ce5b4", + "updateTokenRateCache(address)": "0x41c1657dbe7835e73d0371d165adc1a4bfac00d1a1e72d16028edcbcda5b7541" + } + } + }, + "20220609-stable-pool-v2": { + "StablePool": { + "useAdaptor": false, + "factoryOutput": "0x373643b17cd80e37675c8c98ef774efe6ca0b4de", + "actionIds": { + "disableRecoveryMode()": "0xa63beb312bf0411cf097af9cb3eaf049c51b14bd825a7785d2c302dd86b2308e", + "enableRecoveryMode()": "0xffb4d1e214cc6f7057669be86655319b480f41da3bc3105df0bd6893d42edc87", + "pause()": "0x7429c2d41bc7a05c55e40594ea45baf06875efddcd3e790323daba58a7471f18", + "setAssetManagerPoolConfig(address,bytes)": "0x62185e18ea65d4eb14e014332d3dd2a2c6e9fe30fb3e8b972e7a0719e1ba1692", + "setSwapFeePercentage(uint256)": "0x3bfa65d5e7045105007909f604a094c296e7647b0a0d077c3567b06a8807cffd", + "startAmplificationParameterUpdate(uint256,uint256)": "0x54b956df6ebebde109e89d5774d06eb7f574f998effb944e2616b50cbec54225", + "stopAmplificationParameterUpdate()": "0x199befbc09ac2a04a737f858447d5557b711631b334a0f05c035d2933574fce8", + "unpause()": "0xf119550f558b5b1397b8e2c2f46007895fb892d231743995953ff4ef6680f5e6" + } + } + }, + "20220908-weighted-pool-v2": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address)": "0x78571c2eb76387848301af2e50774bef1f0439897d1dd184a461f3d1683fb46c", + "disable()": "0xd4ae13aabe91757433371fb0d525905322d5e3740940202001198863e187377c" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0x3fdb6fb126521a28f06893f9629da12f7b7266eb", + "actionIds": { + "disableRecoveryMode()": "0x3a8b3bbe8df2948cfc06e4b7b335ca6dfb798508bde253ac68284c93be77bd49", + "enableRecoveryMode()": "0x72ac4e6734d7f5c8438012f806375e41f179f0b682e4a0f03a91a82daed5e459", + "pause()": "0x897a1ee59e4d0b821d46063828abab4edd6d658624bd23f3a6b989c43f2d8d65", + "setAssetManagerPoolConfig(address,bytes)": "0xc6ae8e89de7fce9f4872f577a6a119cd1ea7676e5ad47a595dc6501e5c672889", + "setSwapFeePercentage(uint256)": "0x4bd4157a0323126ccef71ca39c40a84db211a5c4c50d0173d5ebe4a3cb36feee", + "unpause()": "0x2e2cf7b47a4a1b7e96a76ee5562b3d59c729f8f23d4eb5cc3e7229a80f031d64", + "updateProtocolFeePercentageCache()": "0xf8c9a66979c9271e8fa1d7bd49f8e2080f9e644b6938710b122aaa0b398c7ebf" + } + } + }, + "20221123-pool-recovery-helper": { + "PoolRecoveryHelper": { + "useAdaptor": false, + "actionIds": { + "addPoolFactory(address)": "0x9e87510ecbff1f510fd37073c7c39868559afdb91e4876854c8b6b0e3d2cb6fb", + "enableRecoveryMode(address)": "0xe8bba8219634110ef69d6d15bfc74c5b482c9ff60d90dcdda3fe59eb24d5fdae", + "removePoolFactory(address)": "0x4c27b95c60e628aa279735e55e6480657fc5766bb0b6b583b8ecccbc07930c1d" + } + } + }, + "20221122-composable-stable-pool-v2": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address)": "0xb885d98b83d2e0ddc9cc87adabc0f64acbdac302d2545aebafdac0c52a43b892", + "disable()": "0x0a35dcf04fdcf4e2119802287b94a1cf758427e74e9bb450cb31af7c660d7735" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x373b347bc87998b151A5E9B6bB6ca692b766648a", + "actionIds": { + "disableRecoveryMode()": "0x85896342da44e8444ef54be6c4643b51c1e23270bb9ec1f0257cd03d72a80cb6", + "enableRecoveryMode()": "0x7d89412e7c8893c1c85589d68187b2ee925cd2d27c10393980897d1fa4346b0a", + "pause()": "0x6e25be22eb210da3359f4afb977d53109dad5ed4801e736bf6c5239e0028bd48", + "setAssetManagerPoolConfig(address,bytes)": "0x9036802291378e3a6933704d0ccba6f3c6729307d244cb77b7f84060cba99269", + "setSwapFeePercentage(uint256)": "0xdee20d81c6075dcc437dbaaf02d316ab255cfcae4a154e04b17abdebc70a5b48", + "setTokenRateCacheDuration(address,uint256)": "0x160a4f83bcc2f584446953fd8adf0bf96e625212ccf66900051418e8d19e7157", + "startAmplificationParameterUpdate(uint256,uint256)": "0xf766fa63021f6e696e70c339ab7246118c3da74fcbf80dbe6d603189209afed7", + "stopAmplificationParameterUpdate()": "0x1c36fdcc08f18f6fb33519d9491400a58c2c03b6f1222f8385cc36e6fb837110", + "unpause()": "0x09f210f1a6e3730856cd101645ba1c0594f63ca6ed48e7768b5421ae698858db", + "updateProtocolFeePercentageCache()": "0x69d8f3e0969c91e7a94fb45518733240410f56ff60cd304fbc5d13a5432ed71f", + "updateTokenRateCache(address)": "0x43e924739082162d0dfbe4b85270de4e7fe29526d812caeaa4797cf243c0bdfa" + } + } + }, + "20221021-managed-pool": { + "ManagedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create((string,string,address[],uint256[],address[],uint256,bool,bool,uint256,uint256),address)": "0x0becf11063e0bab3ba20ce688e996dc9656adfe73f7a3b0baa3e2c7ede18e682", + "disable()": "0x0ebf042d38f8e1bb630c3010c686232d7334f90360a82eb23623fd01fbe8e656" + } + } + }, + "20221207-aave-rebalanced-linear-pool-v3": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0x38b883099fbd33fd954fa7e0de4326294f176875a41fb85d2788c4a8100daf5d", + "disable()": "0x172535154ede905cf4b057c617cce7d530c0610210d393844d71da28ac0e1e96", + "registerProtocolId(uint256,string)": "0x985f241aafe103ef1072d85ac04df3a1fcf8e70c7e927161e5af5b68230c4874" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x5936497ffE0dBA0eF272D6301D65c0122862971A", + "actionIds": { + "disableRecoveryMode()": "0x9f805171725fa1f7f726413cca1ad5b51cbee7f61cb6097b0d7e588b6f45f7f1", + "enableRecoveryMode()": "0xe18eea66114e2e0e12f1e9f3b2fe78cb4ad2d3ddaec1f1f6ba90e376f42a3081", + "initialize()": "0x50cdc12c7c117e9f4b2fc1164e072a15baced604036216828dd478eb9a44fac2", + "pause()": "0xbba2e2bb4f5be8c77ecb346ad336ca9543ea7676f7086861ad3b2ad35b2f390d", + "setSwapFeePercentage(uint256)": "0x6c5346ca15ccd00778193dddd7c8da217c5c12e615b6063e00a7babeb4a4d7f0", + "setTargets(uint256,uint256)": "0x537ad0e8837903b77de95719d1bc8ac9dbb2bdc6fd8c31924cca86546a687a5d", + "unpause()": "0x05802222b7d960ab1f63cad762f7e124da068ebebfc9562414fa6542099a8a1f" + } + } + }, + "20230206-weighted-pool-v3": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address)": "0xe973b3f05d3b4c6a5a2af274aecd64387721b9a534307b0a316604a550cdb758", + "disable()": "0x3e97e0a2e6079577d465a9e3898ed6097ed0c661cb291f58991b80599b0e5558" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0xbC99aa9bD55d3f8431Ecec24Da03AEc1D6e62754", + "actionIds": { + "disableRecoveryMode()": "0x94d058c565b594a202b88b57a685b093db0fd3406b926f2033a3443a6d8e1b50", + "enableRecoveryMode()": "0x076ec7596fb2fd56057ab4b4ab843852ee914ca3095f9cdf46a79085b266a748", + "pause()": "0xae409b1e306416a87e8d92b1a08f860798e5e882c8785f185db2e2a310793aa1", + "setAssetManagerPoolConfig(address,bytes)": "0xb7717287b79017879300e5791b01dd961afacf0697dd81cd10618c6f010d0ad9", + "setSwapFeePercentage(uint256)": "0x0173d9c9c500f721f528e83cd89297298d530857b46dc4adb8fe329905f4f773", + "unpause()": "0x91e749c8e401323a27a6db0790f1721cbaf6825a3aa707c7ffe3a8506bcab46e", + "updateProtocolFeePercentageCache()": "0xe13b0237dc6790c83d68f522ca166fca9864f8e4c32c3557beb0ae8c46f61958" + } + } + }, + "20230206-composable-stable-pool-v3": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address)": "0x8d0f79dbc2bb491e0559fc7605366a83b43492a719ba9248e49d7a93577c770e", + "disable()": "0xe59ccea4d4a98c33b7c0b3c05a3d65ff930273fa5ee03855a3104befc6d1d362" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x9BF7c3b63c77b4B4F2717776F15A4bec1b532a28", + "actionIds": { + "disableRecoveryMode()": "0xe4efb851c410e171273aee46d6939a91154b536e375e6fe59c09a4e617072339", + "enableRecoveryMode()": "0xa7508bde3c3d65fa21321ca35b2d1da564bc4a772cff9947de3c3e1a467e9dec", + "pause()": "0x25ec546c5f4dfc2fe31ba04f5cf65a8098b35111075a5fd114ea3475e4254ac6", + "setAssetManagerPoolConfig(address,bytes)": "0xc89fefc03c7b123136ce9e4486e8e0dc53dfa76d9ccc1736b4077be9da0cd8d9", + "setSwapFeePercentage(uint256)": "0xe9d4a41f6bb25c8862c0c2c860268861488f862a3702115587343e3c3d6ea29a", + "setTokenRateCacheDuration(address,uint256)": "0xcd7b76c2dbd4367571ef4a7df496fbea49304707b87c272b9b3c2f9bd149b713", + "startAmplificationParameterUpdate(uint256,uint256)": "0xe0788d96bd3d5c93d8ca894a720bf55835562c15aea8eba5cfb15c2c73bd5652", + "stopAmplificationParameterUpdate()": "0x063ab569eba76f955edb79b6f9d647bf9772872dc688a6449689ad4d2d5b5ca3", + "unpause()": "0xb48ae0b045f774f177ab4b36d641b3bfaeb28e42f6da1a418a80f696f3a21703", + "updateProtocolFeePercentageCache()": "0x19477050be1a6af45c4be55d1a7a6d49a53962f9d9124d33dce13b959674b209", + "updateTokenRateCache(address)": "0x8677b00a9d6aded566d9491fea9d15dffffe9fa3facdacc0ac8b0f4a35052ac5" + } + } + }, + "20230206-aave-rebalanced-linear-pool-v4": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0xb8b4b0c483a7df7565a5eb477ce3a197fe00c08f3f77e069e3e21cc176ae389f", + "disable()": "0x06efe7e891755c060de5033e398e2d4d9f1bc713591717209ef84b7e021bd154" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x11884dA90FB4221b3aa288a7741C51eC4Fc43B2f", + "actionIds": { + "disableRecoveryMode()": "0xd12b97e317782dac10c3547fc977708cf0a2ebe3621f880b6f89236e760278ee", + "enableRecoveryMode()": "0x63670b08ab971b7445722753ef5c4b1ddc64376a631cdb48e3c6eae5a5dfc951", + "initialize()": "0x85c408f18c02ca57e9c77ee2dc325adefcd36bae3773b5f6cc2f3c0cbfd8a964", + "pause()": "0x51530e1d909caf846c8075a98e41431ffe7e18eabf84b1f3ebade86b84547d30", + "setSwapFeePercentage(uint256)": "0x6e1c8947d790e79a7f8b6b195b2ec3231b6b9bd27a74f04b192aacd8e93f3660", + "setTargets(uint256,uint256)": "0xb78893595b75c70259cbe387580b752c333e0a52d40fb98d6bcdf4b54b0cef91", + "unpause()": "0x1c32f073a3a5d59bedde5824d20e95a52159bb8c4ef8e49dd1af982c91fa5e10" + } + } + }, + "20230206-erc4626-linear-pool-v3": { + "ERC4626LinearPool": { + "useAdaptor": false, + "factoryOutput": "0xf984eb2B8a7eF780245a797A2fCcd82f346409ca", + "actionIds": { + "disableRecoveryMode()": "0x541412e0bfa3ff92e78aaa6272dc265e37356c9a06ea99c41e507b841cbdaf39", + "enableRecoveryMode()": "0x1af047704bcfd3e1466e6f18e52a32f872a6efd426a13675bc2513e447b0238d", + "initialize()": "0x1e783661023b1e72d6a5ee068eefcb0b8dd5b23151336636e6a0e413f2203ad8", + "pause()": "0x343468c5eda28b04bd0d752d84a11bd0ba70d76ed5fc481e15de7f36b4937787", + "setSwapFeePercentage(uint256)": "0x4e369965828f3a76cdcb37d24a69a3ddf1f0bbfa9110f9978e25d804504b279f", + "setTargets(uint256,uint256)": "0x342f10e709ad2a053a4e5035c4b3b703fea94c19f458d3887a6323472f0e42cd", + "unpause()": "0x88750d9fe81cc28abdc1c823f271c75e76cbd232145d0e83e405ce7810dd187f" + } + }, + "ERC4626LinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0x98933eeecdc70ae1fe94f3986354960201f8e848e98bfaf2f496681643c38541", + "disable()": "0x5ec883ecf16774e6b304f1e06322669694ffb90c13167afeac8ed7b68ab0869e" + } + } + }, + "20230213-yearn-linear-pool": { + "YearnLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0xf9f63d615e094d1a17d5079ccc82af481a9e6c3bed8182d93a52a97e7fd53c92", + "disable()": "0x204435acb6f76b6cfa0ef594fc0e4379b943252865ff8edb9a6d07e718ca12e8" + } + }, + "YearnLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x81fc12c60ee5b753cf5fd0adc342dfb5f3817e32", + "actionIds": { + "disableRecoveryMode()": "0xdca56840c8d32b36c22da3ac14b5963d346a19c1c78d2e3b39b8923042d17a35", + "enableRecoveryMode()": "0x1405e4b6cd75de6c077cce8e10034aaac128c79249dbc582eb25e65516444573", + "initialize()": "0x7c397df7bbb811211ee715aafb283ff001e2ab092ae26da548c14765d856e62e", + "pause()": "0xd6c89f2c29695c6377f031dc3f62611dc4d99266ee8543d8a83a986fd179e6d9", + "setSwapFeePercentage(uint256)": "0x3e6c904353f81ad8c8ed1a0e926cebf468aeaba4c280147e2d32030a359746f5", + "setTargets(uint256,uint256)": "0x4cc8eb383f0521484d9a2bc36774c7eb2c8fcc5a9170f797b9509164f5e449fc", + "unpause()": "0xf9e3ecfb789b73003be5d7a16198362f67a321fceb87e62f5d9649474aa5ffa3" + } + } + }, + "20230223-protocol-id-registry": { + "ProtocolIdRegistry": { + "useAdaptor": false, + "actionIds": { + "registerProtocolId(uint256,string)": "0x176a1b54ac0ba4509b1a508223c85146627bbe203b18b2beaa28b6992b3b021d", + "renameProtocolId(uint256,string)": "0x8630bf555a7a5baabd493fc2afc07b7baa6ea598eaea016acd0d926a6a6962fa" + } + } + }, + "20230320-weighted-pool-v4": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address,bytes32)": "0xaba9ffb17b2efad3b545708e13b3f91cbcb70f6b7de76f29d7a2bd85a0750f88", + "disable()": "0xd7acda26118b9ff06dd8526d0197d58c0c7ed83074be6d915bff2db42b5581ae" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0x62F5f9a446d198E8E4c84eE56e5217416720EdAF", + "actionIds": { + "disableRecoveryMode()": "0xd674de2cecb3a543953d0844369358124e617428c5e1bbff8924a84e7e4128fa", + "enableRecoveryMode()": "0x8ceae9d0f076b4b0c529529f6bf11832835b93b533445c655b840015f7025e50", + "pause()": "0xb9c5dbd31b49d898a12157d05b5f59e61b30533c20fe266652c1017837135f0c", + "setAssetManagerPoolConfig(address,bytes)": "0x0bd65c98e2121df958fbdd053552dfab29367bac9f223d282f1c262c89328ff5", + "setSwapFeePercentage(uint256)": "0x32725667b078898f78f53e59f45eb1837b34a9469dbe36f9270b674247b23abf", + "unpause()": "0xb313b0fd78e09c18baecd229b1f60ba3e28af60010313a2eb6e955e3626d8972", + "updateProtocolFeePercentageCache()": "0x851e1de2f8d7c9460da7ecb3137551662eb032a7ac4475ead243e7f5efe9725e" + } + } + }, + "20230320-composable-stable-pool-v4": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address,bytes32)": "0x0de6d43e3472be04e8d42c8a41d31e85d6a0973531a1bde49a5393ae99748e70", + "disable()": "0xdb0e2ca147bb165fcfd2631fb8cb87ab34aa8fb9d2a81e95334a207f753f0302" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x11A4cF51Bb0Bb4D925CAdFDA61FcDA952d64889C", + "actionIds": { + "disableRecoveryMode()": "0xf65bca6198c80a6fc89409c116db12c0427a0b571cd0d2ee5dd614145d006810", + "enableRecoveryMode()": "0xf7c36607b85de415dd5d9b2e4c47d42f2093d7338fc8af38b88070683da54da1", + "pause()": "0x6464a19f906714393234821d14f9899d08c3c32edac6ac68a28e8e2c444dc372", + "setAssetManagerPoolConfig(address,bytes)": "0x18e56c9f67c05b8b685755dffd4fc9910e67297943e0b6f65c721e1894e08325", + "setSwapFeePercentage(uint256)": "0xe92c5e92fd07c923b506e4ef7eb29972642a073312f496c812148a15bb6b8967", + "setTokenRateCacheDuration(address,uint256)": "0x8518c2cc23c81411457873cc4df8dd9f92946fb21b4b290e3e93467d3f7b4c64", + "startAmplificationParameterUpdate(uint256,uint256)": "0x3d1105ece259c9620b4c0b8c8a01554fdbf4efacfe00c648fa8f99a98c7c26bd", + "stopAmplificationParameterUpdate()": "0x39e75d95add118410df221d6d408e602d372ebc0e6657e596e87ab948b093408", + "unpause()": "0xefca407929bb10cd435a2424c97205e03c8a8757dcdc317cd8c166a0cf7b6067", + "updateProtocolFeePercentageCache()": "0xfec3941bcf00df950d453bfc0502e8ff5be0c6ec7e3486d9a755058a9ed084da", + "updateTokenRateCache(address)": "0x7890466ffba14a02f161e03ef49578067b54197c84285660df1bffe3173b8d70" + } + } + }, + "20230316-l2-balancer-pseudo-minter": { + "L2BalancerPseudoMinter": { + "useAdaptor": false, + "actionIds": { + "addGaugeFactory(address)": "0x212ccfca4a02e0eff2a0a5029495a2697d4efa7a8e95cdbf30e2f38c40ca648f", + "mint(address)": "0xc4220b92a3f3a76fc6b82a6882901b5e736a24ec64debdb1ee9e71db1678f242", + "mintFor(address,address)": "0xa36cc85f1b6b44cad3bfacb73c78dfac650451971dedd278a3b471e7eaadaf2b", + "mintMany(address[])": "0x5e3c0727bbfecb4e06e43c78c31f7c5c2fc724ada6ca8b9becb9f8aac311f3a9", + "mintManyFor(address[],address)": "0xf005d864cfd04d1bda43af3fc18045c128dc2e556eebee3575319db87268581f", + "mint_for(address,address)": "0xa5563895eed4dfc1476d098262e7a4615d48480b37accfa9289199fce2d05399", + "mint_many(address[8])": "0xee3c6ad65a9283df465f038d29abe221b042b84ef103d9cab6d87f011677df96", + "removeGaugeFactory(address)": "0x5ce414c4549758bdc4c0ae4e7cd63422c8e8ae66ddfa5c9489ffaa892c44641c", + "setMinterApproval(address,bool)": "0x13b837037a0df69c5dd4f1990d032d56918417a445cae421bb7535cc69102f6a", + "setMinterApprovalWithSignature(address,bool,address,uint256,uint8,bytes32,bytes32)": "0xa5eb8ec108bc468097db2b7a4d991eddab1c639bbd593c7c3a85fcda08f376e2", + "toggle_approve_mint(address)": "0xff13ffee455a62442453906b5612437f3e3d593014f199f5ecf0b3c099014a59" + } + } + }, + "20230316-l2-ve-delegation-proxy": { + "VotingEscrowDelegationProxy": { + "useAdaptor": false, + "actionIds": { + "killDelegation()": "0x19d5330ec7541613bfeac7333d1d25761171a198bba9c350ba0a731f24e8eb87", + "setDelegation(address)": "0x17391f0660d4c41d3e09aeb10b8c06f82f48919ea50dbfe36aaed62ad681d8eb" + } + } + }, + "20230316-child-chain-gauge-factory-v2": { + "ChildChainGauge": { + "useAdaptor": true, + "actionIds": { + "add_reward(address,address)": "0x3bf29175652a3f0fac5abb715d0b7fe2e7b597e2e2eff555dac6b21a20a7c83e", + "claim_rewards()": "0xa1fcfa4f107b70052cfbb2e460d99c96f9b18c1197671fe00ab59c32adcddbeb", + "claim_rewards(address)": "0x1c866c9ea7b119a642f593024ced6088dbde65d041e5d3e826b9ad49b949a64b", + "claim_rewards(address,address)": "0x17b18f02fd5498a6aba17d20977b1a8a08f888d821999613fee42f9f9acb0bd9", + "claim_rewards(address,address,uint256[])": "0xd60d094e1e23fd6be6037a12199618843b9d0607abd1affd90757400c45c294e", + "claimable_tokens(address)": "0x507b520ac43f322b79e43a63eaa5b80ca89ac2c5b63970fa4b6242a23a9e8aa2", + "deposit(uint256)": "0x514b6f05525a3f31c3bde60d063e91e88204c5cdc5b35934513f911943b97fcc", + "deposit(uint256,address)": "0x360a8a15589674642b2125956d96757fc2f06ff1b968333271de16a20e01df05", + "deposit_reward_token(address,uint256)": "0xb70966c80d8727484d7d85b65c022ce136cadffc1aa72bd6362cd9e160598bf9", + "initialize(address,string)": "0x9909b4741ca460d20e8d6981af6839df93c668821447afaca66c860be83d8036", + "killGauge()": "0xec1d467d9ab03a0079c22a89037209f5763aec973897ea763e2cf25d71a5f12e", + "set_reward_distributor(address,address)": "0xd0090a09f425bba74e6c801fba7c6d15b44147ab0bd319e40076ce07e95168b6", + "set_rewards_receiver(address)": "0x1b288a1f96e75e2fda7a0c1ac5c35a7fd2c5e2e5c425c32152ae01f82545e2da", + "unkillGauge()": "0x076e9815202aa39577192023cfa569d6504b003183b2bc13cd0046523dfa23ea", + "user_checkpoint(address)": "0x3aaa120451be1d03b5f871d8f553636453af4ac4fed808c66c169c212b199436", + "withdraw(uint256)": "0xec9d6185ed79aed8edc19bc6fc25ca544504ab0970d25b191e5279100224502a", + "withdraw(uint256,address)": "0x74676d56488cb1032fc50a7d73aaaf9a81057aaf55ff704c7d39863c2637273f" + } + }, + "ChildChainGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address)": "0xaa40669e74603d8e708eac95e60f78c35d5af4f59afdb700675f38c6534809f7" + } + } + }, + "20230404-l2-layer0-bridge-forwarder": { + "L2LayerZeroBridgeForwarder": { + "useAdaptor": false, + "actionIds": { + "onVeBalBridged(address)": "0xd81ac172d51a510842026834f21c9544b7ea768b7b61400cec297367131b9848", + "onVeBalSupplyUpdate()": "0xcdb5f64d75a32dd4156cb6209c150a7b8d12b603fcc5bf6d3221590e909726c1", + "setDelegation(address)": "0x3aab06ac6308ffd4900e4d6527bfef91db18ee615170093c5bd9e94b5bee6239" + } + } + }, + "20230411-managed-pool-v2": { + "ManagedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create((string,string,address[]),(address[],uint256[],uint256,bool,bool,uint256,uint256),address,bytes32)": "0x4c552ed444f4c8ac2e22d8eb4ce47f3463aebafdd2b31c2a645fed5693bb2acf", + "disable()": "0xa8ff4830c7bf9a4c5c71257a9e4272ae652308e2fadfe8e0b2b862f77ead95d7" + } + }, + "ManagedPool": { + "useAdaptor": false, + "factoryOutput": "0xb4AF4fdd49da2A2BA9522EAdCF86D407a69f19c8", + "actionIds": { + "addAllowedAddress(address)": "0xe59eedd462e75b9ed6dd1e6e6195cb8ed7114efddf34af9d57f1a65f0b4d2856", + "addToken(address,address,uint256,uint256,address)": "0xba672b22630cfea128fe0bf7f900324bc523c29acfbdd0070be15e0847ee603d", + "collectAumManagementFees()": "0x3e0923b8091b34e9ca82e2dd862129ac56526dcdd850d3435e15907e8f82122c", + "disableRecoveryMode()": "0xad52bee7b730cd4172ab23f71a320a2904f076ce8d4188f6780d0f2ecfa89efe", + "enableRecoveryMode()": "0xadbf17d5cbdfa6f1473b5c3fae1de6e9959223e464815fc481499cd58a591bab", + "pause()": "0x0cce170c212bd2a0cb239b2e279b6a7527ddab4a9bfe5a6801db9f4e55b3f0df", + "removeAllowedAddress(address)": "0xd842cceb41efd926a0a2b870e306d7f3da243b5cfd01603eb10fbb952f6140f4", + "removeToken(address,uint256,address)": "0x41d66024a564f612e8ab02af48f2c3b171143b9bc9d9b1c19d01396272bbcc43", + "setCircuitBreakers(address[],uint256[],uint256[],uint256[])": "0x8a5fc0bdf75306c997c2af7f172e777ecc547b1305285f849c630062b1a97867", + "setJoinExitEnabled(bool)": "0x19f4363634e1c9984ae5babee17556256984f377a726ed3189c0f9f069eee874", + "setManagementAumFeePercentage(uint256)": "0xd401e0a7dee470f422396c802e3c530979ead01f2e9258a30543b777fef25f2e", + "setMustAllowlistLPs(bool)": "0x8c4060ab469795e9a4ab31be0836cbf404f128cc76928d41b3359fc15654744f", + "setSwapEnabled(bool)": "0x638d7a30a8c0242399deb9b564eecf119a49343afeef8ffb1032a333871d8de8", + "unpause()": "0x4e4fe7cf476c825592856ba53d68617ba8ed01ac847a26e1596010db4b9d1d59", + "updateProtocolFeePercentageCache()": "0x2d2a6f797eca8b5093f75472bd67b36e690fcdff529535d6e173a49c1d630259", + "updateSwapFeeGradually(uint256,uint256,uint256,uint256)": "0xdee0c2896f4368efc620fb976f1b61b7695b6ee4cd188f3b2c5a707599eeba0d", + "updateWeightsGradually(uint256,uint256,address[],uint256[])": "0x2a79c82f7c154c34bc42a75aa3666a5ea936d4a04a2d894460acd7030f28e7b4" + } + } + }, + "20230409-yearn-linear-pool-v2": { + "YearnLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x16139156304943a93272b39b7f607eb93daf450c201c0653463c09efc326cb55", + "disable()": "0x66db2fcfa4b70b33f43f7867dfaa73830a40a9c21793ab4a4181017cec69c0f4" + } + }, + "YearnLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x34557eF500Bfc060B8e3f2DA58EF725Bb7D32202", + "actionIds": { + "disableRecoveryMode()": "0xb145fd84f4974d3d49c79b4b53245b058f55c82d16b39f92eb6078d7b23dda5a", + "enableRecoveryMode()": "0xe92818032e649cabfbbf9828641b240d0c8a4ac9437a937f8e99c6b9f92d0fb8", + "initialize()": "0x91c1e443e2d5ce2adb9b069afb75d7086acdefc92c3bde241aa9953a15193594", + "pause()": "0x7da8797db7760574755019e2675d1f816315b7c76c7977ec6c618ffbc4f260b9", + "setSwapFeePercentage(uint256)": "0xb74250de83c56252b0309fc8272338dbe9fac2232b39897af72c3df142d55e20", + "setTargets(uint256,uint256)": "0x974302a1bc71ef8302d15789d6b2a06a3415d4387cce71f03fe386e816539c3a", + "unpause()": "0x53516223620bfff8119e1698f850e094e56ba2b2a8192bdc75032871b780dbce" + } + } + }, + "20230409-erc4626-linear-pool-v4": { + "ERC4626LinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x409e47a8558a01be36e1a8a19437d7b84ab051464be317d94fd900176d4cdd24", + "disable()": "0x5cdea6ae677e1afa17c4dba1377e544c6f83a79c1e3cc7341290a0e7d8a23251" + } + }, + "ERC4626LinearPool": { + "useAdaptor": false, + "factoryOutput": "0x2DA61Ef3Cdcb97efb0f7099c02527fabFe94Dee5", + "actionIds": { + "disableRecoveryMode()": "0x941e9b49aed3636c8878b4543d0e1c7daf8c8f30f5c40cdd3e29ec535bf56865", + "enableRecoveryMode()": "0x04105ccf7d08e1e33d81a35a5ced3da44c613e81d864b1e22b1f3d54c5c37c8b", + "initialize()": "0x7a296249cadd263f26669889b9a4799312ec620abd9f53c512c6ab90fa6c7f27", + "pause()": "0x1df6fb8357a54c9e82f443013986d6c1fdfdd7561c49f474fe9000fa1ddfb5e1", + "setSwapFeePercentage(uint256)": "0x430c53d88f8da9ce15fbc710a70e95543153a914f3fd38afd4ded87b4d32b273", + "setTargets(uint256,uint256)": "0x11c6339e89e16488a1313c9f7051a3490329dc37abba0d7977c55cd5222a178e", + "unpause()": "0xf74465cbe241db69e323a9f2cacbe1d585228846cb0752024a9f87ed54dc2253" + } + } + }, + "20230410-aave-linear-pool-v5": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x607fbb5e53d8424622820e0c662de4582c3cdf7345f5f2628b23b3cca0eb6554", + "disable()": "0x6b623ee459a550297f0b0660446eef4dbf89e9d7e9d29addbbe907763506089b" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x45d37982784F022A9864748b4E8750e1e7019604", + "actionIds": { + "disableRecoveryMode()": "0x5f70a9fc7662de583295b84f0825dd4069a34c0ae1a6568e07a9bddb702da2fa", + "enableRecoveryMode()": "0xe5346592e9128cab4378e32315f1836824e56d46f901b9e6bafa554e72c9585a", + "initialize()": "0x1db8c8c23dbd96a8f1cd763d9ac5c31c85eef4fc2dd2ada5ff783d4bea302466", + "pause()": "0x2e3db35aff883a61c66722429d09c6fa8afb1b3fd23a906453a02c3ad7a5156c", + "setSwapFeePercentage(uint256)": "0xe2034e57b6e5473c618804022a6b6a56a83df1c39435869038988698f9137b73", + "setTargets(uint256,uint256)": "0x2342e50fb8143fdbef50d38a2b88596172ad4e0c57a39fdbf27bc56c02d3bba3", + "unpause()": "0xdbb204a60732a4043f722f29ca252ecf3d51f45ebc288cb852295d6c184ad304" + } + } + }, + "20230711-composable-stable-pool-v5": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool,uint256,address,bytes32)": "0x086aa2cb4b1ffbcfe512fa21361a0ba95dd3081889037f2f312f17c14db6a2f0", + "disable()": "0x209075578b0c6819e5f117c0e9c4cafdfb4bac956e8ea969ff11fb444cd95b08" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x77A0Df59d1d73B12B07Bcded0611279D8801ee96", + "actionIds": { + "disableRecoveryMode()": "0xb4b8b756b9cc9f73e9debc41c8f8a805f6f964192d26d6f1bf764f147279bc8b", + "enableRecoveryMode()": "0x7f42c77cb4b9f8e5f51b922886e6f62e00feaf246cccf2927a0f00dd3150e1ae", + "pause()": "0xb4dacaceeadf349e2eaf81fae99db22f312f7b8d19bd3aa0aae4d74e8c40460a", + "setAssetManagerPoolConfig(address,bytes)": "0xd6feed724bbde91cebb818cac62ac796c6476e1ce80d1265168455e40a397634", + "setSwapFeePercentage(uint256)": "0x167c1baf0159e423e633f0a68e1025918332919ade802b33759880576cb2c50d", + "setTokenRateCacheDuration(address,uint256)": "0x85c28efb27b7c3746e840a2974145d09ca9d292a5b531a4f84ff66a9924d9b39", + "startAmplificationParameterUpdate(uint256,uint256)": "0xadd685e44755d3d511a26b97a7c40f42354f1e494795ad163dd79e22da45026e", + "stopAmplificationParameterUpdate()": "0xdbfdeb1d2ce00232fda29f8069f731deb70f0e1438aa8a1e35e89eac02403c23", + "unpause()": "0x86078096bf00c620888f75fefc7995876dbc9d3989a6a53e6fdd6c6de92d6397", + "updateProtocolFeePercentageCache()": "0xc626e2a3337b4fec269bd52e00229175e172988373a96bfea4742ad7fbfe42cd", + "updateTokenRateCache(address)": "0x1b8cd7565ea9fba03d7a5f091e9d568dd674455569b4c72c379d25e9ba32d36c" + } + } + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/action-ids/optimism/expected-collisions.json b/balpy/balancer-deployments/action-ids/optimism/expected-collisions.json new file mode 100644 index 0000000..c9e8648 --- /dev/null +++ b/balpy/balancer-deployments/action-ids/optimism/expected-collisions.json @@ -0,0 +1,128 @@ +{ + "0xa1fcfa4f107b70052cfbb2e460d99c96f9b18c1197671fe00ab59c32adcddbeb": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "claim_rewards()", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards()", + "useAdaptor": true + } + ], + "0x1c866c9ea7b119a642f593024ced6088dbde65d041e5d3e826b9ad49b949a64b": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "claim_rewards(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards(address)", + "useAdaptor": true + } + ], + "0x17b18f02fd5498a6aba17d20977b1a8a08f888d821999613fee42f9f9acb0bd9": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "claim_rewards(address,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards(address,address)", + "useAdaptor": true + } + ], + "0x514b6f05525a3f31c3bde60d063e91e88204c5cdc5b35934513f911943b97fcc": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "deposit(uint256)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "deposit(uint256)", + "useAdaptor": true + } + ], + "0x360a8a15589674642b2125956d96757fc2f06ff1b968333271de16a20e01df05": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "deposit(uint256,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "deposit(uint256,address)", + "useAdaptor": true + } + ], + "0x1b288a1f96e75e2fda7a0c1ac5c35a7fd2c5e2e5c425c32152ae01f82545e2da": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "set_rewards_receiver(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "set_rewards_receiver(address)", + "useAdaptor": true + } + ], + "0xec9d6185ed79aed8edc19bc6fc25ca544504ab0970d25b191e5279100224502a": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "withdraw(uint256)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "withdraw(uint256)", + "useAdaptor": true + } + ], + "0xd0090a09f425bba74e6c801fba7c6d15b44147ab0bd319e40076ce07e95168b6": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "ChildChainStreamer", + "signature": "set_reward_distributor(address,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "set_reward_distributor(address,address)", + "useAdaptor": true + } + ], + "0xaa40669e74603d8e708eac95e60f78c35d5af4f59afdb700675f38c6534809f7": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "ChildChainLiquidityGaugeFactory", + "signature": "create(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGaugeFactory", + "signature": "create(address)", + "useAdaptor": true + } + ] +} \ No newline at end of file diff --git a/balpy/balancer-deployments/action-ids/polygon/action-ids.json b/balpy/balancer-deployments/action-ids/polygon/action-ids.json new file mode 100644 index 0000000..b419604 --- /dev/null +++ b/balpy/balancer-deployments/action-ids/polygon/action-ids.json @@ -0,0 +1,833 @@ +{ + "20210418-authorizer": { + "Authorizer": { + "useAdaptor": true, + "actionIds": { + "grantRole(bytes32,address)": "0xe59a9cc9b57a582dbcf5c684afa7c09a0dc15e945ef27825b40038bafc5c4e94", + "grantRoles(bytes32[],address)": "0x2726554b1a5c815e580a0564456be7b5671b4d8fcc81f449ddce6ecddeb3b41c", + "grantRolesToMany(bytes32[],address[])": "0xd94beed4fbfb74c162e59e847c45429b4cd6f097036736781bee42d8b4e6fd6d", + "renounceRole(bytes32,address)": "0x67ae50adbadca1acc740f8b39241850aaba00fdb784cf7f2e47f9d58913aad4d", + "revokeRole(bytes32,address)": "0xb9e816cbf1fd38fc4113f0876fc22c3c707bccc5ddf86c96283b5486228cc635", + "revokeRoles(bytes32[],address)": "0x444fcc4e52481c6af1640e62661e519afe48ba5eb4fceabe456202d873d70614", + "revokeRolesFromMany(bytes32[],address[])": "0xe2184d31f18690b48ef940925244f7bc335c43b53631b64a768a12ea2f4bbafe" + } + } + }, + "20210418-vault": { + "Vault": { + "useAdaptor": false, + "actionIds": { + "batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)": "0x1282ab709b2b70070f829c46bc36f76b32ad4989fecb2fcb09a1b3ce00bbfc30", + "deregisterTokens(bytes32,address[])": "0xe4f8ff74aa05a4d54a06e035d5e86947bc6474f8d7b166ebeb49fc9178d28551", + "exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0xc149e88b59429ded7f601ab52ecd62331cac006ae07c16543439ed138dcb8d34", + "flashLoan(address,address[],uint256[],bytes)": "0x96ebe854ca6ab6242ad127dcd7809576513b0c64571e515cedd7b8885612c82d", + "joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x78ad1b68d148c070372f8643c4648efbb63c6a8a338f3c24714868e791367653", + "managePoolBalance((uint8,bytes32,address,uint256)[])": "0x7275fb98594b03dc36a7de69051058e9e2d05cabeb4fe7d9c87bc69f94d9d084", + "manageUserBalance((uint8,address,uint256,address,address)[])": "0xeba777d811cd36c06d540d7ff2ed18ed042fd67bbf7c9afcf88c818c7ee6b498", + "queryBatchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool))": "0xf5f701b3adfba2adad8f16a8be5a989593e42a2caa84c5c6e60b22143db65a2f", + "registerPool(uint8)": "0x956dfce4343a6be4df20714d3dc413ef59e73fa9995d3d247e7c8d12efd33ac2", + "registerTokens(bytes32,address[],address[])": "0xad5bd4a1cc4243b4d772a8a55d24792c1f57cc45eb97ed1291b82d96125a7626", + "setAuthorizer(address)": "0x1cbb503dcc0f4acaedf71a098211ff8b15a220fc26a6974a8d9deaab040fa6e0", + "setPaused(bool)": "0xb5593fe09464f360ecf835d5b9319ce69900ae1b29d13844b73c250b1f5f92fb", + "setRelayerApproval(address,address,bool)": "0x0014a06d322ff07fcc02b12f93eb77bb76e28cdee4fc0670b9dec98d24bbfec8", + "swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)": "0x7b8a1d293670124924a0f532213753b89db10bde737249d4540e9a03657d1aff" + } + }, + "ProtocolFeesCollector": { + "useAdaptor": false, + "actionIds": { + "setFlashLoanFeePercentage(uint256)": "0xbe2a180d5cc5d803a8eec4cea569989fc1c593d7eeadd1f262f360a68b0e842e", + "setSwapFeePercentage(uint256)": "0xb28b769768735d011b267f781c3be90bce51d5059ba015bc7a28b3e882fb2083", + "withdrawCollectedFees(address[],uint256[],address)": "0xb2b6e48fa160a7c887d9d7a68b6a9bb9d47d4953d33e07f3a39e175d75e97796" + } + } + }, + "20210418-weighted-pool": { + "WeightedPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address)": "0xe500747fd1d2b0b5ea8afd32f9802792c43baec4d8d01b322e74ee663075e23c" + } + }, + "WeightedPool2TokensFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256[],uint256,bool,address)": "0xacf2d4c06c0f6f28bf37910233fd69d0822e405ecb07685d994afccb4a753c21" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0xCCb2C152BD853379b7F8d12b5b1Ee1682a9EED34", + "actionIds": { + "setPaused(bool)": "0x3c7de1d8a207c7901ec612f9f0f50957da016911a50d5c22bbe5c9f4f3392d95", + "setSwapFeePercentage(uint256)": "0x3697d13ee45583cf9c2c64a978ab5886bcd07ec2b851efbea2fced982b8f9596" + } + }, + "WeightedPool2Tokens": { + "useAdaptor": false, + "factoryOutput": "0x9F1F16B025F703eE985B58cEd48dAf93daD2f7EF", + "actionIds": { + "enableOracle()": "0xe543cb443264aa0734939fa06d9e6ade81d691ee5f27c2183c2a54a2c245c8b1", + "setPaused(bool)": "0x43f20c0b0ba9191edc765615b4aa9f5fc68be74185b79f813946e7bc9a9e1e38", + "setSwapFeePercentage(uint256)": "0xc065d550fa98abc242b6baf98e7b2063590675f1ddd81bdb9ea8d8f5c5d52f98" + } + } + }, + "20210624-stable-pool": { + "StablePoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256,uint256,address)": "0x24c1ce6a38931ed2e9a7db6296d348efbb2777b33ec38fb14b57f29701dda2ca" + } + }, + "StablePool": { + "useAdaptor": false, + "factoryOutput": "0x32C471dD7ED2df5D62C6fc498fe6293fbfd66597", + "actionIds": { + "setAssetManagerPoolConfig(address,bytes)": "0x605335b210e41aa6abf3dcc7ede4da40480fec68dc8eb118d499fa010783bddd", + "setPaused(bool)": "0x97270598fa4177db8fa1b289b1a781d6ae7a6e1f87fe4c03f6a0c07990014bb8", + "setSwapFeePercentage(uint256)": "0x7b09f4b61ccfe85436161b0223489b187d9f9158c542b5e6105df147afc78aca", + "startAmplificationParameterUpdate(uint256,uint256)": "0x8c9b4c1f53b968f62f656d48126bd856c38b0d879974dff5b5d6055c0d2917d4", + "stopAmplificationParameterUpdate()": "0xc787be37f98a254065bf8678258de57ce53a2d6814c519063f3003dd9f92dfc3" + } + } + }, + "20210721-liquidity-bootstrapping-pool": { + "LiquidityBootstrappingPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address,bool)": "0xa8f890be66c62f07bf198717dc127aef6c9cc9fbafc2b3db6eb2c03b2a180aba" + } + }, + "LiquidityBootstrappingPool": { + "useAdaptor": false, + "factoryOutput": "0xf45a6e93DE4d3DCd6cE05d7ABC3B3665e397BB5D", + "actionIds": { + "setAssetManagerPoolConfig(address,bytes)": "0xd3d88853c901e2581060bf590a0ed48da57ca3ccbe89f748d828c282dc40e1b6", + "setPaused(bool)": "0x0546471589e6cc8d242057938789941d762b4cf0186a74658ae0f81866138734", + "setSwapEnabled(bool)": "0xc86f763ebb824c76acdae97561cae60573473dd0e0addb83f0d142f12b0a5d59", + "setSwapFeePercentage(uint256)": "0xf472b63b0e5e0ef0eedf49fb6dcb108ff97950c4394d78409c9251ea89c943da", + "updateWeightsGradually(uint256,uint256,uint256[])": "0xf1c73f7bc5b3a33181b70ef054dd876b584d652e288fcd6fd2bf02d7b9c61cf0" + } + } + }, + "20210727-meta-stable-pool": { + "QueryProcessor": { + "useAdaptor": true, + "actionIds": {} + }, + "MetaStablePoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],uint256,bool,address)": "0x53b275af72c08826755a37670feb2498799e93accbe09ab78b3ffd2ca5af30a2" + } + }, + "MetaStablePool": { + "useAdaptor": false, + "factoryOutput": "0xC17636e36398602dd37Bb5d1B3a9008c7629005f", + "actionIds": { + "enableOracle()": "0xe9ce7912cef35356af9e6fe2f74e7db29ae4048f06230c7abf973669cfd81b0a", + "setAssetManagerPoolConfig(address,bytes)": "0x346bbd103487616e43ad4426647c4ea8c1679ae34b804472e8381851b68df68b", + "setPaused(bool)": "0xb175321bb12100f9cd00c1e223f12597e71012d08487d09c03745d7e8b6bfa6e", + "setPriceRateCacheDuration(address,uint256)": "0x126e98a631e7fef0d7726b6184cdc93213837514cf93f422b71e3548eb3a5f7f", + "setSwapFeePercentage(uint256)": "0xce2ff98f438259b5f78b8cf5818e70fcc2ff35b13dc38356616b1431cea9726e", + "startAmplificationParameterUpdate(uint256,uint256)": "0x4a5335097f75ce0343ed07c66342c9a6d5b34cd71451545e40430882c5136cfe", + "stopAmplificationParameterUpdate()": "0xe3e737cbdba086ac765746aadfd83769e92e0415cdde864c27803829d15a97d0", + "updatePriceRateCache(address)": "0xaa509da7385e33b5a660313d5306edd65de9d8cfef0b8f497302aea07eff3938" + } + } + }, + "20210907-investment-pool": { + "InvestmentPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address,bool,uint256)": "0x0db6d61a48fade7d0796ef73bf36390a527f54e13950af4c28a8236037471834" + } + }, + "InvestmentPool": { + "useAdaptor": false, + "factoryOutput": "0x95A28a3be5ed7b5bfc01C804fA33877853527756", + "actionIds": { + "setAssetManagerPoolConfig(address,bytes)": "0x3198180bf4b949c0230328311ed9c44e45edf3f301ab72ec4d72db4aad6b6418", + "setPaused(bool)": "0x6e84d531e4d5c13375c0f1c4b4e872111aeccf9d85b22f47c0e78dea085514f9", + "setSwapEnabled(bool)": "0x877fd7bfde32dd7caec22b5336a4aac23f5254420df0c8c27137cb83a283a45d", + "setSwapFeePercentage(uint256)": "0x594c8893e09351e14d4db7d5f587381915923bdbe69921847a3fe00329607c89", + "updateWeightsGradually(uint256,uint256,uint256[])": "0x55e906387632340265f352a836e4fd7a8af37473f6d20a9b7a9854d4c09afac0", + "withdrawCollectedManagementFees(address)": "0xe1bfc0ba5180b36c24fe745b19eaa1a48cf79d2a780d27ee486d965d6bff3b28" + } + } + }, + "20211012-merkle-orchard": { + "MerkleOrchard": { + "useAdaptor": true, + "actionIds": { + "claimDistributions(address,(uint256,uint256,address,uint256,bytes32[])[],address[])": "0xe381cda4d2ca927e25608ad24ec883cc75d08d9374742ba3dd35e6c835395c05", + "claimDistributionsToInternalBalance(address,(uint256,uint256,address,uint256,bytes32[])[],address[])": "0xbaa9dcaf47345217a79c2c8a8f140f8b2badfdf7367b98e8c24fe0c7f378a53a", + "claimDistributionsWithCallback(address,(uint256,uint256,address,uint256,bytes32[])[],address[],address,bytes)": "0x0cbefa0934b1c6f04c4bf4a9d637672bb82b798cce2075c21febe660fc4b9c7e", + "createDistribution(address,bytes32,uint256,uint256)": "0xa369d775e6c662693550a792d97ccd0fd24537b88566684960dcd066499aa6da" + } + } + }, + "20211202-no-protocol-fee-lbp": { + "NoProtocolFeeLiquidityBootstrappingPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address,bool)": "0x37c2014a7328b3a3d5f8dd3dab1fe40ee420c0f6e93b10c102d356bacb8fe610", + "disable()": "0xb0a6b3bde8254edafc10fca316f1cb1817679f510f629d5a8e37d0f2cf79ad0a" + } + }, + "NoProtocolFeeLiquidityBootstrappingPool": { + "useAdaptor": false, + "factoryOutput": "0x5D22EAd06031f19e9D3e07d72cB0AD620D3184ba", + "actionIds": { + "setAssetManagerPoolConfig(address,bytes)": "0x3144c21b253a4de69f832f6e94b8edb10bd6d9471d61175c6c217fc9158cd718", + "setPaused(bool)": "0x24cfd63e3bdb5c3ecc41cb0ad14564a2e0e789c77b31269eea92231cb21d8c5c", + "setSwapEnabled(bool)": "0xcb0b4973cc64620f02c05a653f3ede22c0f6dfc19065ddb7297d5d75dfbba4d9", + "setSwapFeePercentage(uint256)": "0x6a109619aaae7dae2a5a6b6d17ac23526bb148468a961e97c70e9f11ecdda463", + "updateWeightsGradually(uint256,uint256,uint256[])": "0xc24b922fd97831708c9fa964b5986e8dee408fd82c1fa4cb85737a42c2f2a2b6" + } + } + }, + "20211208-aave-linear-pool": { + "AaveLinearPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address)": "0x527e5a8917fef9f19f55ea7d3f9dc98c00e4836cf918d2af144d2ef91076a53c" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x0503Dd6b2D3Dd463c9BeF67fB5156870Af63393E", + "actionIds": { + "initialize()": "0x09041991bbfec3c802aaa649c92bad03812001d7ff845ffe5106da62ad3ff22a", + "setAssetManagerPoolConfig(address,bytes)": "0x6ed3ab730abc868939ac1e6504c80858fd8376493ac852cc1681abe2fe1ccc4a", + "setPaused(bool)": "0xd06706585931d27d86f0857d74f590f3519447f07ae2294a25747da7c53b429c", + "setSwapFeePercentage(uint256)": "0xe6167761e1f45f3f8129b4cb8756e924c73a5c94bee1dc35e64a8614b94f61ae", + "setTargets(uint256,uint256)": "0xf875b1c51b68896b3ff368c3133dd43eeafb9385f5c2542556132bcefd14bda0" + } + } + }, + "20211208-stable-phantom-pool": { + "StablePhantomPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],uint256,address)": "0xbb16582de061b248700cf47968d34f49dc0dc43f845069e118aa32567c5c0831" + } + }, + "StablePhantomPool": { + "useAdaptor": false, + "factoryOutput": "0xF48f01DCB2CbB3ee1f6AaB0e742c2D3941039d56", + "actionIds": { + "setAssetManagerPoolConfig(address,bytes)": "0x21abb70d5dc9d589f905afa9933d0280c885b8fccc45427dcd7aaba1ff5fc615", + "setPaused(bool)": "0xf4a9e6488b7ab071451f503da0627e39e230d8312105a235dfd85fb6a3e4c761", + "setSwapFeePercentage(uint256)": "0xec5cf9ce37bce68429403f673d6dfd0a89d33d4af5960016f9a1bbd07c71be88", + "setTokenRateCacheDuration(address,uint256)": "0x579f77dd22d399844f256b587a3c7e07f170f2bb099f1c0bc2a98bed1fb7e7b5", + "startAmplificationParameterUpdate(uint256,uint256)": "0x3f8959a782d757bebe4c4ec22bfffbaa46fa7e4daa5612a66844f463232af8ef", + "stopAmplificationParameterUpdate()": "0x8c7c272e72489a761317148bf859a4d8103c1cdc4405654fe608ca3e027231e3", + "updateCachedProtocolSwapFeePercentage()": "0xcdbe276ae5ee5399eb766a6f2e244b3537e4624735293180d6733eee8a5c2c80", + "updateTokenRateCache(address)": "0x87ab40bea728bfd0c39e96f9ac47ef867b490f1f4973a6fd4bddee886b59ea96" + } + } + }, + "20220304-erc4626-linear-pool": { + "ERC4626LinearPoolFactory": { + "useAdaptor": true, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address)": "0x527e5a8917fef9f19f55ea7d3f9dc98c00e4836cf918d2af144d2ef91076a53c" + } + } + }, + "20220413-child-chain-gauge-factory": { + "RewardsOnlyGauge": { + "useAdaptor": true, + "actionIds": { + "claim_rewards()": "0x3e45197c029b241e01ec787908e5cacec9ce62d1230009fc362a356331131b5a", + "claim_rewards(address)": "0x582a057ac2a6af38d6210cf82d397b1a8e37d0057c9e3c048a431bea266574fb", + "claim_rewards(address,address)": "0x1b4a46b44f0b40250b0e39d8dd6d3e554f4cb2b54e4b930f619f1e9e2a5a13a5", + "claimable_reward_write(address,address)": "0xf97d2bf6fab77f2a6ed4ad3b16a22ecde44a3b3dec8f917e2c2420a0fabce190", + "deposit(uint256)": "0x959d4174ac0236341e6fd7f85e7fed11948a27fa51e44b1ddeb6486b90e908c1", + "deposit(uint256,address)": "0x570301d2863e5329b64ec737327d88ae17e23af8794ab92d9fccadea1e14c674", + "deposit(uint256,address,bool)": "0x91a1db727b8b3b3a81b3d8f0651b15096b1667019d0b1d49a8a6f70f96d3bd3a", + "initialize(address,address,bytes32)": "0x9244b413aa0cdf08258a01746c64d82ef25548de3a4248426ba72722ac497589", + "set_rewards(address,bytes32,address[8])": "0x233b2a2aac7549ea477be4a1eb94890848d61b5a2a458718e2bc1bfed9730018", + "set_rewards_receiver(address)": "0x1b83016646b0a4e0aaf521a2aa574b2a62c83d1d10567379de1dec1c02bd7b1c", + "withdraw(uint256)": "0x7e797160239fadbf43f7b4403f0b147757d6a9fe58eeefb888121e0c481f146b", + "withdraw(uint256,bool)": "0x7d97440cd733f2bd2bb7a1ed6d5b6cc2839286024d41e9172afc39fe064de44c" + } + }, + "ChildChainStreamer": { + "useAdaptor": true, + "actionIds": { + "add_reward(address,address,uint256)": "0x7cb72b76789ff7bc3d3bf438294fb22e9ab21b8ab33ef92bde5343ffbefae722", + "get_reward()": "0x99350d4ed21b0cd23551e116ba11c9076516dae52e72b1e6515f1b814a0a0894", + "initialize(address)": "0x649ab732f16542ab55721320b43c5b06b6055eab5064f547eb6f4ddb666a90ea", + "notify_reward_amount(address)": "0xf51a91e622462fd20895f082afda26cd4c20640d7492e8ce2840c1e7ee1b437f", + "remove_reward(address,address)": "0xdb6cb9008a1484202480ee24439400cf0ffe8c253ffb4b79072cbd38085a3afe", + "set_reward_distributor(address,address)": "0x363cf2bd771efe16bd206d33a549d4698c4ad202ea6b5bf693722fbe151140a6", + "set_reward_duration(address,uint256)": "0x45033ebb127656beeb1694195c29e319352ca53c6adbc6d5e3938b027b658eb7" + } + }, + "ChildChainLiquidityGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address)": "0x322d97a0df341a88bf3c100fe4bbda28c2c8a55985af0612371aeba6af9222e6" + } + } + }, + "20220513-double-entrypoint-fix-relayer": { + "DoubleEntrypointFixRelayer": { + "useAdaptor": true, + "actionIds": { + "exitBTCStablePool()": "0x084ce57837d80dbf01ac6f56be968aca5e46d8037b0bb4f4f7380ff3c28c68ec", + "exitSNXWeightedPool()": "0x5c8eeba60a1b81138b29ec36a6ac3ebd19b4d7ff24bfaa667c6394e3f58c1b9f", + "receiveFlashLoan(address[],uint256[],uint256[],bytes)": "0x4ad32c6708690fff4a575b065cb13de4cb090229cd5974027cf30a57764e11fb", + "sweepDoubleEntrypointToken(address[])": "0x7187cb62d21139c153655ed00e33c76451d7609e429791486976b3769ffea0e7", + "sweepSNXsBTC()": "0xebbe6a11503f907fa7423a02db944e72209332a083cd2cf2c2f33ca95d945452" + } + } + }, + "20220517-protocol-fee-withdrawer": { + "ProtocolFeesWithdrawer": { + "useAdaptor": false, + "actionIds": { + "allowlistToken(address)": "0xfc3786761d181147e2cad6d0513c7bc4100de6c20556df3d496e4f22e1982936", + "denylistToken(address)": "0xde944634152f598012cd1450bbe9e21e2e88a57fc7e578a54e47cbc6ccdf1c54", + "withdrawCollectedFees(address[],uint256[],address)": "0x25995e0bfb9b837ed9e3ed24df7d42689be47c45073cc1953bb0836b292faa13" + } + } + }, + "20220527-child-chain-gauge-token-adder": { + "ChildChainGaugeTokenAdder": { + "useAdaptor": false, + "actionIds": { + "addTokenToGauge(address,address,address)": "0x32982283bd3250ac03256468501ad749885a55561f6e27111ff7f9a661aca5b5" + } + } + }, + "20220609-stable-pool-v2": { + "StablePool": { + "useAdaptor": false, + "factoryOutput": "0x2492b06d0c980c5a480c72c20e6791eb27e92b24", + "actionIds": { + "disableRecoveryMode()": "0x9a75633684f46373afa0321f17b63d180ad14769e593a39d366f886cedd8aed9", + "enableRecoveryMode()": "0x5f885eb315b27808fb10c09a039a003bcd0237ce86daea98044bdd64ffda6c8f", + "pause()": "0x613ffed6eb1ba1939b5c17ccf03605c58e8e5ffe2dac247008b0745f46742b1e", + "setAssetManagerPoolConfig(address,bytes)": "0xe4ae61b2aa6d0b20f452dbd9069b42c0952dbfaa7fb9c06d52a2dc23f09dceab", + "setSwapFeePercentage(uint256)": "0xdb0c4ed39b25abe74530d93d30f2b418aca586eeb088f33f8e60a329c85ab416", + "startAmplificationParameterUpdate(uint256,uint256)": "0x6d786d3ad1eb20d5ef842a68b717816a3d39c32518c7e5299cfbe3c13dbe9b44", + "stopAmplificationParameterUpdate()": "0xf9b395e34aa1203b9c9554e60674b6d5d6bbe3779e7f00b2ea059cd1598eb951", + "unpause()": "0x7f6bd4bd70f6f1c6dd46c968f1f18654335e5982f0fe39921ac7bb906bdc0d09" + } + } + }, + "20220725-protocol-fee-percentages-provider": { + "ProtocolFeePercentagesProvider": { + "useAdaptor": false, + "actionIds": { + "registerFeeType(uint256,string,uint256,uint256)": "0x11c8eb4bb882401bba6b09d3f868bcd28cff5a8fb203c2114cbe9a93fb368639", + "setFeeTypePercentage(uint256,uint256)": "0x716d6b6afc33d645e9c2c78937fc28afcca38a4ef927fb307679e9709b73214e" + } + } + }, + "20220817-aave-rebalanced-linear-pool": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address)": "0x8fda700a5fcbbb75a246bf9ac81c622dd1333deb933f22756acbb20735c91b65", + "disable()": "0x3fe7719468a7e48b37513ec7a41d9931375244942fe6c328691db3415d9517c1" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x3dd0843a028c86e0b760b1a76929d1c5ef93a2dd", + "actionIds": { + "disableRecoveryMode()": "0x79819a7971b1e9f195beb8386adb931d405f6f037b2c0c6ac955e68569c01128", + "enableRecoveryMode()": "0xe677a5af244fbd50b51cf114dd0bdbf7b73c262382c7704c359c6c2148820d33", + "initialize()": "0x9efceb78fee6be2bd09391027e55e84d409ab25840279fe28a421cec66b737f6", + "pause()": "0xcd7e0ee0107ef7cac4d00d3821101a9ba6f02158f7f4dd52693e82ad3c91e918", + "setAssetManagerPoolConfig(address,bytes)": "0xb4f5d67533236074d36881d864a2800bfe93f13921d54c1fd373894c4832a0df", + "setSwapFeePercentage(uint256)": "0xcf5e03a737e4f5ba6d13e23f893a1e0255b362d8ce22e9568e1565fcf92789c7", + "setTargets(uint256,uint256)": "0x6acd4f21c434de03ec54c117c6044204a513d0adac665ede4c7206f56f907ef7", + "unpause()": "0x07b4fb5e12466b66136a430edadfe74892e0cbfc410f6268a2d1d24cc09a6e05" + } + } + }, + "20220906-composable-stable-pool": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address)": "0xac270fb749fd9a51eef52a88b6f3ed9bff7b4583e23c43d6e1d3af956f1e414d", + "disable()": "0xaf3fe6e5b6bbb29a53c0f862834c8a8482ce9eec9ca87870453658b7b91cb0bd" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0xb553c155f95ab42b674d6fe501693e30d54a47e2", + "actionIds": { + "disableRecoveryMode()": "0x2bd529cf8062fa0ff07c2054e5dc654a104415c2ae171092c450a88c9ff098a9", + "enableRecoveryMode()": "0xcd992f1bd63b3928b4bd25a59ac9561f702f6a144e2ec542a0f923ddffb79722", + "pause()": "0x683b1640a6f688e1239a6db76d85c0fe9ba55f59f16d3eb5aa6a1334db1094e1", + "setAssetManagerPoolConfig(address,bytes)": "0x7c7bcf5450d42a1d0e2155c2adc70c8d26e62ff1cf11b213e8b4218c4c64409b", + "setSwapFeePercentage(uint256)": "0xa301b9c1ebd296e579cdbb2d99698e23f8197f41880e33215a5936b204b2b971", + "setTokenRateCacheDuration(address,uint256)": "0xa8ac31ec9b3ba2ce31c0ddb542ed7e55340831bdb845c17cf097fd61fc7aef25", + "startAmplificationParameterUpdate(uint256,uint256)": "0xda1cd80b6b12e9440e721792bb510d7ad97ed348a085958a3fd42793e7c27212", + "stopAmplificationParameterUpdate()": "0xcaadef57f99e617f3e276e1298e60ff3e2675ac2ca36fe6f58b5694b474085b4", + "unpause()": "0xdf4c7d59eac8c4273e06ef113253dad4c057e7f417cbad854bb92ead12ba571a", + "updateProtocolFeePercentageCache()": "0x8cfb6267f7b1feab6fd8e30aa74d47f26eb1b76486acfbf8fdaaef1c3ffa8e5b", + "updateTokenRateCache(address)": "0xdd87e51aeeaddb8db3f62cc664e902f1a1d33568d64f3801dc26a8b38896d576" + } + } + }, + "20220908-weighted-pool-v2": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address)": "0x37d5bd497797736b798902e303ce7e0f11ac7e886e7836d655acd164981ac18b", + "disable()": "0xce80f9efd4a00ee7b33d10af79a2dff2b6ab479280ce5362f4af29578ef02140" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0x9d75cc71555ddabcb89b52c818c2c689e2191401", + "actionIds": { + "disableRecoveryMode()": "0xd086c9ab22831a7851394ba9beea0e7ae5ead76ba43389a772380f17500e4443", + "enableRecoveryMode()": "0x9436cac93d8367398a12c7c8d6f93997dbc9979098589424940bead9f87bcb59", + "pause()": "0x63e97b007d0002c1d8124c406a492a688ea47aab63f29c79341723af6dd548e8", + "setAssetManagerPoolConfig(address,bytes)": "0xa7cc6f54a9c741779422b5c93448356ef2aa96e5116710f9dd4d09770544a555", + "setSwapFeePercentage(uint256)": "0x0cdf946c050f680a2bbec467e09e41ceaf108b331b1d5b902c9fa45f9e2d944a", + "unpause()": "0x0b7e09d72aed371e7c79bbb37d5629dd5938bf8beabbb9993bdd6d2d66d7e138", + "updateProtocolFeePercentageCache()": "0x3458d00f8cd2dc187f8f8d0196edf704a6114c3b0576b5cf8ef74108844c048c" + } + } + }, + "20221123-pool-recovery-helper": { + "PoolRecoveryHelper": { + "useAdaptor": false, + "actionIds": { + "addPoolFactory(address)": "0xf8c9fae4bc5fe8eb74e5f0fb4987c5acea8dc1f798738132ea5a3ac3e5018eeb", + "enableRecoveryMode(address)": "0x95d96e954bec90700258ac46bca2b29cba9dcd5222fa2f23c664587a2c6326c6", + "removePoolFactory(address)": "0xea0664145ce82f191154e8809da2fda36a9dcb1175dea294fc0e712e6f1ea6ad" + } + } + }, + "20221122-composable-stable-pool-v2": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address)": "0xb885d98b83d2e0ddc9cc87adabc0f64acbdac302d2545aebafdac0c52a43b892", + "disable()": "0x0a35dcf04fdcf4e2119802287b94a1cf758427e74e9bb450cb31af7c660d7735" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x373b347bc87998b151A5E9B6bB6ca692b766648a", + "actionIds": { + "disableRecoveryMode()": "0x85896342da44e8444ef54be6c4643b51c1e23270bb9ec1f0257cd03d72a80cb6", + "enableRecoveryMode()": "0x7d89412e7c8893c1c85589d68187b2ee925cd2d27c10393980897d1fa4346b0a", + "pause()": "0x6e25be22eb210da3359f4afb977d53109dad5ed4801e736bf6c5239e0028bd48", + "setAssetManagerPoolConfig(address,bytes)": "0x9036802291378e3a6933704d0ccba6f3c6729307d244cb77b7f84060cba99269", + "setSwapFeePercentage(uint256)": "0xdee20d81c6075dcc437dbaaf02d316ab255cfcae4a154e04b17abdebc70a5b48", + "setTokenRateCacheDuration(address,uint256)": "0x160a4f83bcc2f584446953fd8adf0bf96e625212ccf66900051418e8d19e7157", + "startAmplificationParameterUpdate(uint256,uint256)": "0xf766fa63021f6e696e70c339ab7246118c3da74fcbf80dbe6d603189209afed7", + "stopAmplificationParameterUpdate()": "0x1c36fdcc08f18f6fb33519d9491400a58c2c03b6f1222f8385cc36e6fb837110", + "unpause()": "0x09f210f1a6e3730856cd101645ba1c0594f63ca6ed48e7768b5421ae698858db", + "updateProtocolFeePercentageCache()": "0x69d8f3e0969c91e7a94fb45518733240410f56ff60cd304fbc5d13a5432ed71f", + "updateTokenRateCache(address)": "0x43e924739082162d0dfbe4b85270de4e7fe29526d812caeaa4797cf243c0bdfa" + } + } + }, + "20221021-managed-pool": { + "ManagedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create((string,string,address[],uint256[],address[],uint256,bool,bool,uint256,uint256),address)": "0x01ed6b1d1a76460295cf1325534f6c4bd3fc1f8717cd0cf9733f493a0821da71", + "disable()": "0xa010f28803768154a04542ff29718c73ff40e307b10e5f39fbdff6c90db7b4ec" + } + } + }, + "20221207-aave-rebalanced-linear-pool-v3": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0xbc3e22d8b1a2d6d1a60a129e997fa40eebe65ec35fce6b59cca609bc76f817f9", + "disable()": "0x09c9add3c0433de33f2eeac68a5aea247cf793af4087a152235bb1603ceef18f", + "registerProtocolId(uint256,string)": "0xbabdd79a230446ceb1df12a409ffedfe44f7731b98f65777f9616b01ded4cb3d" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0xFA2C0bd8327C99db5bdE4c9e9E5cbF30946351bb", + "actionIds": { + "disableRecoveryMode()": "0x62a086af2fa221dd697ad84caf8f8038336adfcc8ace47097d0588d3e6489fc0", + "enableRecoveryMode()": "0x5579254c3f7f17c9b8391f66410d96f9b07745b8bc7345be7e1ad8041f5be9a7", + "initialize()": "0xc1d95692c1f2ce4ff57e15a64357cfd5b0d5e48ea84fcb2c829a04c24a8f53f3", + "pause()": "0x1e2d1b3651196fa2729df8f4963db2ed9bc96483e8b65cc53b5f1635ab43172c", + "setSwapFeePercentage(uint256)": "0xe394b2cb2735d79c37d9ecfa53d15f9a14d3efb3441bc280f9d85d024eeeec09", + "setTargets(uint256,uint256)": "0xaaa1fe1ff08037655b4bc3c4f195e6415dcaff9ee6e209eb290234f33f6b0194", + "unpause()": "0x81af155e8e304e0b2ede232ebc6724ca7971bc381c149030c7708ddb417c694a" + } + } + }, + "20230206-weighted-pool-v3": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address)": "0x0162b05e9de4055ced3dfa33e2cd212cc8b555005948a6ba9608d6b572919800", + "disable()": "0x18be448c0c01ad4576befd4f6bce2abf1214dc50697f946a487657e3c3c66947" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0x93ECf386cD53718aF16a09C325a56D1bB60aDc37", + "actionIds": { + "disableRecoveryMode()": "0x70ea65bcadbec99c10058d43f9acdc9a5ad05cde666b7d0065818feb763e7cb2", + "enableRecoveryMode()": "0x8e751c9d2a2e4de88b6c71094d5a2b18be451801333ea94579761179bc9b9ef9", + "pause()": "0xb251963ecd27d2fe81c17cdd47c025b03bdc56bd9138b8556a747d1112d8c01b", + "setAssetManagerPoolConfig(address,bytes)": "0x95342b1e99835cc25076e6c420b1f77d005ea4ad409a04bf31392dbaf42c5095", + "setSwapFeePercentage(uint256)": "0x22f3e304ab030be776b205711d7ba79f146b07726b10c5e9d29c24dacc09c140", + "unpause()": "0x7d4014ec05d656c5230f9e332ccf5fb6e4928e7b9d6341e323ae7685ae8d6351", + "updateProtocolFeePercentageCache()": "0xc79b85a5bc34408f5f39427fb14686bd2592e8e8fc85c1ebb7dea402d98abc9c" + } + } + }, + "20230206-composable-stable-pool-v3": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address)": "0x8f1840cbb71e36693db1b537f6069b0a805b0ed2154b9bb7c396ac0e57706fde", + "disable()": "0x9592bbf1ef6b5256ed5698e4cf4610375a5e984fa05ddb8a9c6f2e411f2d0d1e" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0xeff1d57A28167E6982DCa1D63321810400f73929", + "actionIds": { + "disableRecoveryMode()": "0x3f743640e5e338ede5771590dab93e6860616f4318ca6d5a578c84be2c329844", + "enableRecoveryMode()": "0x4645b2fd612d1e3d4f7cbd5f68df6511f4dedfcba83090853604d4fbf33f467d", + "pause()": "0xf3018734e770ecf7082ee926a91cef5bd218b62d081217bf47f5a67ea7a1e80e", + "setAssetManagerPoolConfig(address,bytes)": "0xd41e80e3e296556e204a11b36a3c6c60040f2b7ea76caae2168c96a75b0a6105", + "setSwapFeePercentage(uint256)": "0xf6c13c09ddba8f114fe2b23ff442766dca7a9bf303adfde386f20ac38c749733", + "setTokenRateCacheDuration(address,uint256)": "0xc5be0c5701dc762d9ff25d816978ed0e0ee5e199211676c540ed08b6b4d6a4ff", + "startAmplificationParameterUpdate(uint256,uint256)": "0x1eeda74ac7741bce16788e080c79c907c79419e41281fa442cc39f8d148a8773", + "stopAmplificationParameterUpdate()": "0xe202c405a4ff60ae0c38dea8bbb722ee570a1c89487598e7fc4ede5248a527c7", + "unpause()": "0x808edf9cb9aa28bbe24707f82ac290679fc55ecdcf35ccddda77130f24781607", + "updateProtocolFeePercentageCache()": "0x7eac9d5fa2945ee22f160a4c04a86a408cb903868e206211207336ac5fac0620", + "updateTokenRateCache(address)": "0xade7055deebb6b22c267d265d1705ef0ac92207b74b405de6fe239b63380341d" + } + } + }, + "20230206-aave-rebalanced-linear-pool-v4": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0xb8b4b0c483a7df7565a5eb477ce3a197fe00c08f3f77e069e3e21cc176ae389f", + "disable()": "0x06efe7e891755c060de5033e398e2d4d9f1bc713591717209ef84b7e021bd154" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x11884dA90FB4221b3aa288a7741C51eC4Fc43B2f", + "actionIds": { + "disableRecoveryMode()": "0xd12b97e317782dac10c3547fc977708cf0a2ebe3621f880b6f89236e760278ee", + "enableRecoveryMode()": "0x63670b08ab971b7445722753ef5c4b1ddc64376a631cdb48e3c6eae5a5dfc951", + "initialize()": "0x85c408f18c02ca57e9c77ee2dc325adefcd36bae3773b5f6cc2f3c0cbfd8a964", + "pause()": "0x51530e1d909caf846c8075a98e41431ffe7e18eabf84b1f3ebade86b84547d30", + "setSwapFeePercentage(uint256)": "0x6e1c8947d790e79a7f8b6b195b2ec3231b6b9bd27a74f04b192aacd8e93f3660", + "setTargets(uint256,uint256)": "0xb78893595b75c70259cbe387580b752c333e0a52d40fb98d6bcdf4b54b0cef91", + "unpause()": "0x1c32f073a3a5d59bedde5824d20e95a52159bb8c4ef8e49dd1af982c91fa5e10" + } + } + }, + "20230206-erc4626-linear-pool-v3": { + "ERC4626LinearPool": { + "useAdaptor": false, + "factoryOutput": "0xf984eb2B8a7eF780245a797A2fCcd82f346409ca", + "actionIds": { + "disableRecoveryMode()": "0x541412e0bfa3ff92e78aaa6272dc265e37356c9a06ea99c41e507b841cbdaf39", + "enableRecoveryMode()": "0x1af047704bcfd3e1466e6f18e52a32f872a6efd426a13675bc2513e447b0238d", + "initialize()": "0x1e783661023b1e72d6a5ee068eefcb0b8dd5b23151336636e6a0e413f2203ad8", + "pause()": "0x343468c5eda28b04bd0d752d84a11bd0ba70d76ed5fc481e15de7f36b4937787", + "setSwapFeePercentage(uint256)": "0x4e369965828f3a76cdcb37d24a69a3ddf1f0bbfa9110f9978e25d804504b279f", + "setTargets(uint256,uint256)": "0x342f10e709ad2a053a4e5035c4b3b703fea94c19f458d3887a6323472f0e42cd", + "unpause()": "0x88750d9fe81cc28abdc1c823f271c75e76cbd232145d0e83e405ce7810dd187f" + } + }, + "ERC4626LinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0x98933eeecdc70ae1fe94f3986354960201f8e848e98bfaf2f496681643c38541", + "disable()": "0x5ec883ecf16774e6b304f1e06322669694ffb90c13167afeac8ed7b68ab0869e" + } + } + }, + "20230213-yearn-linear-pool": { + "YearnLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256)": "0x3bf7b6c22bd9527c849c18005dbfef17350cd3b198d882f3bb5d758455da7ed6", + "disable()": "0x6b623ee459a550297f0b0660446eef4dbf89e9d7e9d29addbbe907763506089b" + } + }, + "YearnLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x0320c1c5b6df19a194d48882aaec1c72940081d9", + "actionIds": { + "disableRecoveryMode()": "0x5f70a9fc7662de583295b84f0825dd4069a34c0ae1a6568e07a9bddb702da2fa", + "enableRecoveryMode()": "0xe5346592e9128cab4378e32315f1836824e56d46f901b9e6bafa554e72c9585a", + "initialize()": "0x1db8c8c23dbd96a8f1cd763d9ac5c31c85eef4fc2dd2ada5ff783d4bea302466", + "pause()": "0x2e3db35aff883a61c66722429d09c6fa8afb1b3fd23a906453a02c3ad7a5156c", + "setSwapFeePercentage(uint256)": "0xe2034e57b6e5473c618804022a6b6a56a83df1c39435869038988698f9137b73", + "setTargets(uint256,uint256)": "0x2342e50fb8143fdbef50d38a2b88596172ad4e0c57a39fdbf27bc56c02d3bba3", + "unpause()": "0xdbb204a60732a4043f722f29ca252ecf3d51f45ebc288cb852295d6c184ad304" + } + } + }, + "20230223-protocol-id-registry": { + "ProtocolIdRegistry": { + "useAdaptor": false, + "actionIds": { + "registerProtocolId(uint256,string)": "0x8f64bed4b4e908316d1d51abae6d2ca2c0f6ac132d219882be578341027b587b", + "renameProtocolId(uint256,string)": "0x5dd6754fa5d8d56f6177c0265c35ab00ee57aa8a190975f1fba56a18796f0aeb" + } + } + }, + "20230320-weighted-pool-v4": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address,bytes32)": "0x77f1a1fa3b8874e7dc663ffc7de608510eca9818dde6154ff3ae45b76c90b4f1", + "disable()": "0xbcd976054e605d08b3c0674552476261b198b61b307ff1b8b5dda320cf3f6027" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0xb77E03655ee894AadE216A83D05511A9F9895126", + "actionIds": { + "disableRecoveryMode()": "0x70d81f1b0f71c8c3037ee34b69ad6980888bab8b2e32959f8c6aac274a7f10cb", + "enableRecoveryMode()": "0x2ea86ec12cc48f7c7a247493f2eadbe33029a24816226ba4c7ac4b4087949c4a", + "pause()": "0x0334e3e272e2cd5eb2537ae08beca8f9d1665f0ce03a7026b1dfc8665ffe12af", + "setAssetManagerPoolConfig(address,bytes)": "0x4df2cc388a3aaf2db1e6145fbcd7a8765ba84076c412cdb4f6e91a571989755b", + "setSwapFeePercentage(uint256)": "0x0ad9662eb9978d490b9f9bc897a15af8892817d0c299cb8ec0c624cccd6b192d", + "unpause()": "0xd12081181421e08da0b054d43a49f11cb4bc2e6a1cde6c5dbe520df960387815", + "updateProtocolFeePercentageCache()": "0xdec051b02f54fc55ffcf3aeffa01f5f81f09ca8b89c49adda346a8ca98610cff" + } + } + }, + "20230320-composable-stable-pool-v4": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address,bytes32)": "0x33af939ea471d50ab63d5f0ff7fb6303771dde01fac79bbba883086aa2d408f3", + "disable()": "0xa544127d0ad449e0603bfabd973ce71e16260ff91463b98f8e17ca841b863671" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x0f25823cF786b78696b16536e2F2B9835289AB51", + "actionIds": { + "disableRecoveryMode()": "0xdb63b0c040446fcfa9503943eff986bc051fb5e7cb8f83a8bcebb7115c535b60", + "enableRecoveryMode()": "0x237ec20a8fc896e2ccd593e146cfb897d33a3aec61da4c3a35d5d91e5ff3c5f3", + "pause()": "0xad24869d8e59d11e376f5dd5087c9c3e7ecf500f6aa2f0272120b16e2bd1a1ce", + "setAssetManagerPoolConfig(address,bytes)": "0xe153a58befd116fa3e481b4c8e5e5b145a353b90786be52455763eb3dbedef03", + "setSwapFeePercentage(uint256)": "0xdc4f292a9c37b8bfbaf2dc78ff4d2a53114e770bcb186a21957939f01ffbfe6b", + "setTokenRateCacheDuration(address,uint256)": "0x3e0806e59012604f6624320b8c3da0a7d88ad794101eddc8c3e038cad5be4b81", + "startAmplificationParameterUpdate(uint256,uint256)": "0x3dc055c2eb0eb929c7bf4eec68903547110bbb0c41c81959c15b122062ce5703", + "stopAmplificationParameterUpdate()": "0xe394fbc4dc19aef582d4ee54bbbddddca8bffe39a3af34cb2e8ba09b2bf43b46", + "unpause()": "0x549648c2f87197cbc2d5a76225eadef764b4829f2bfae8471a5f29a9503a38f0", + "updateProtocolFeePercentageCache()": "0x0cbcf1e7e7b724b042f41f6295e097e1c7f316edc107a22cc2d6297e73d5a878", + "updateTokenRateCache(address)": "0xbdabbd5364be45f6a0e1939b36b1f1c2acf9998843a6eeea7c0466a6c8c58cd1" + } + } + }, + "20230316-l2-balancer-pseudo-minter": { + "L2BalancerPseudoMinter": { + "useAdaptor": false, + "actionIds": { + "addGaugeFactory(address)": "0x71b144ace6b2cd2762fedff00a9e45c9b7b742ee590f9d593c61e48b6c9ad790", + "mint(address)": "0x6e7eb27394c8783d3cf3a812720b63d5f91333421593e6e36495ba719bcb5032", + "mintFor(address,address)": "0x3f4055068632f12496744c3f128b0c2edeeef0f477bc16c6e01bdaa3985e7430", + "mintMany(address[])": "0x4d38bf03e56037a31f2a97d7292257d2cb55f85cabc3c23c149b538424f6bb85", + "mintManyFor(address[],address)": "0x2a05b8d96ca3a60f61ec1ef142355a601269a69b0dfd43db7b705e082a988080", + "mint_for(address,address)": "0x7ec77596608ef055482d5573c9c678ceb476ce87f10fc7baff1bce7b07f56be7", + "mint_many(address[8])": "0xe91ab36ab0c8caea67192b217c9f93b9ec47f5af2a81955661b4fb9950a153ef", + "removeGaugeFactory(address)": "0x901a6765ca0c95ded97655a17fa640878a0e4e93b0bd4f30e6754af42bc816b1", + "setMinterApproval(address,bool)": "0x137238e6103bef3e9bbcd06c78b66dffd767b5e578ef27c4192589a15f2bd71e", + "setMinterApprovalWithSignature(address,bool,address,uint256,uint8,bytes32,bytes32)": "0x1c18fc05607eb7cc9ada96baf6d90287e575938e372f80a610e95cc41cfb55d9", + "toggle_approve_mint(address)": "0x74868bba926298fede28d9bab420d7ccdde8e91aa2de5e98cc02a728928eb56a" + } + } + }, + "20230316-l2-ve-delegation-proxy": { + "VotingEscrowDelegationProxy": { + "useAdaptor": false, + "actionIds": { + "killDelegation()": "0x3ae72cdb6fc13b14b2c684bf0575c21a5da9a0878d64d5f6c8ac4836d436352d", + "setDelegation(address)": "0xd2a18eaab6c28631d421edd953f276d757b0a3c5f5460535105596ed38d938d4" + } + } + }, + "20230316-child-chain-gauge-factory-v2": { + "ChildChainGauge": { + "useAdaptor": true, + "actionIds": { + "add_reward(address,address)": "0x728b7c90958572ff4fc88088c34b65ed64230c82afe8611d4d44d39d0845c264", + "claim_rewards()": "0x3e45197c029b241e01ec787908e5cacec9ce62d1230009fc362a356331131b5a", + "claim_rewards(address)": "0x582a057ac2a6af38d6210cf82d397b1a8e37d0057c9e3c048a431bea266574fb", + "claim_rewards(address,address)": "0x1b4a46b44f0b40250b0e39d8dd6d3e554f4cb2b54e4b930f619f1e9e2a5a13a5", + "claim_rewards(address,address,uint256[])": "0xa1e3931098b633bc15978a9aff86f40e2d4529b2dfded3f5a18e9b27ca208968", + "claimable_tokens(address)": "0x4f9befe46135eeffe74dac931c52343031699ac09ba9951a58318fe8bf4951b4", + "deposit(uint256)": "0x959d4174ac0236341e6fd7f85e7fed11948a27fa51e44b1ddeb6486b90e908c1", + "deposit(uint256,address)": "0x570301d2863e5329b64ec737327d88ae17e23af8794ab92d9fccadea1e14c674", + "deposit_reward_token(address,uint256)": "0x214d6a5713bd0628cbd2707ee38de217de6aa6b3b643a23856b54610378bef8b", + "initialize(address,string)": "0x025d120a4fbeed992e730d63785a64d1508cc27d8f3428d69855e8c3bd8b9879", + "killGauge()": "0xf5029a1805994fddc6acb767a187483c1701b6e59a3a1d77a72e81227854c627", + "set_reward_distributor(address,address)": "0x363cf2bd771efe16bd206d33a549d4698c4ad202ea6b5bf693722fbe151140a6", + "set_rewards_receiver(address)": "0x1b83016646b0a4e0aaf521a2aa574b2a62c83d1d10567379de1dec1c02bd7b1c", + "unkillGauge()": "0xc723d22351aad8e4fad6b35889cee4483b119dbdb84e24486362a4abbd615b17", + "user_checkpoint(address)": "0xdf5becbf0d2c5234e079adac50076832392db0dbf98b3e05dd468edd04f26be2", + "withdraw(uint256)": "0x7e797160239fadbf43f7b4403f0b147757d6a9fe58eeefb888121e0c481f146b", + "withdraw(uint256,address)": "0xb2da5027f7e2ba8317301ba24b12d95d39ea4ec45b34c0ec35a9f7eaeb8833a4" + } + }, + "ChildChainGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address)": "0x322d97a0df341a88bf3c100fe4bbda28c2c8a55985af0612371aeba6af9222e6" + } + } + }, + "20230404-l2-layer0-bridge-forwarder": { + "L2LayerZeroBridgeForwarder": { + "useAdaptor": false, + "actionIds": { + "onVeBalBridged(address)": "0xbfb224f590dbe2bdfedef2adf975eae2811cbf8cde53743ca5b0bf81afbd3521", + "onVeBalSupplyUpdate()": "0x80dd8300722cda4a6ab46082a6f7676bf5d6c899353060a59725a65c4eeeb29e", + "setDelegation(address)": "0xd6a35019d9e5286b643336bfabaa3b0deb93e7a134249c1853bb33fb81ca46bd" + } + } + }, + "20230411-managed-pool-v2": { + "ManagedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create((string,string,address[]),(address[],uint256[],uint256,bool,bool,uint256,uint256),address,bytes32)": "0x9b85b505c7b8dfad20692dc273012373948069084f8caf3e2beb28e31ef87ffd", + "disable()": "0x855759a5f9e9b4b303700b2720e91e78c453fd1a58be9c84122ad342d492a99e" + } + }, + "ManagedPool": { + "useAdaptor": false, + "factoryOutput": "0x074eFD7806e6c28e8b6611075b1Aa62c6c408090", + "actionIds": { + "addAllowedAddress(address)": "0x53e52f448e276b550efb63d444847f38985c71fa49d550dfb6af3bb758bc84e5", + "addToken(address,address,uint256,uint256,address)": "0xd7d57cd2469e751ffa33965fc2e90fd0b784e665dedd00ad6ba693529d7ecc7b", + "collectAumManagementFees()": "0x5f63e6cf6c53bc965d76b1b394287b8a147d703c6fc1de13245d3b34d781f29c", + "disableRecoveryMode()": "0x45a97c5fc72812a7486337d47dc5954592be9b8a7e8eedc618b07df7f9022002", + "enableRecoveryMode()": "0x356381b4c3ae04ffd3d8778286ace45849220e97b1397a1deb1fbcffdbf294d8", + "pause()": "0xfa21c40c9cc6c92667996b0306f905fe8138de4a48895627c3e23ae693e13c14", + "removeAllowedAddress(address)": "0x55bd6b31cd6d62dde952234fb8038a58646a90086899d960719da09b2e4dd47b", + "removeToken(address,uint256,address)": "0x6947f8e8cd9a0aa883317d540010457850965122af4b2e19c390d3f6cc5219f2", + "setCircuitBreakers(address[],uint256[],uint256[],uint256[])": "0x2cbca048411da39c5220af77e330142b105d38f602b44c7112f7baea54753aa7", + "setJoinExitEnabled(bool)": "0x818d1ff9d385d8b4c97acbe4515f283fe0f3f64f431af69bd31764c44c25c66b", + "setManagementAumFeePercentage(uint256)": "0x31f491aba97b18d75dd04ee3b7b5b32f66c4f15df25ad756dabb8c1057875c99", + "setMustAllowlistLPs(bool)": "0xeebd0448b7b38c7b307ff671f7a988c39ad2e80bb1739161879704b6b580d481", + "setSwapEnabled(bool)": "0x79800b92a848a71501ea2f051f561cb2de812ae08bf4cd6b56a547e548cf597a", + "unpause()": "0xf2e385b075359f17e9db14accdf6b9f4103b04dee2b2180ac73d9df74c5ac55e", + "updateProtocolFeePercentageCache()": "0x1a8c000c58a15edb1b1e5e0f8acae9a69cdc32827a36d2723306b6c40e47d513", + "updateSwapFeeGradually(uint256,uint256,uint256,uint256)": "0x5340eb2aa807942e77bdd894c8872a6ba021684832c86c995dcbac3698cfa765", + "updateWeightsGradually(uint256,uint256,address[],uint256[])": "0x5eb69fd587e32f9abb7693dfb52b92ecd1a708335fc4c5e5ebd012115ad2a7e1" + } + } + }, + "20230409-yearn-linear-pool-v2": { + "YearnLinearPool": { + "useAdaptor": false, + "factoryOutput": "0xdae301690004946424E41051aCe1791083be42a1", + "actionIds": { + "disableRecoveryMode()": "0x9bc87a8eb9cc99699c942d367413b64cec46fec372b850ceb1e92dd404262f54", + "enableRecoveryMode()": "0x4e4c0dff3668c7cab151f99058e4bb3470cdb320ea5c7584fdf29c1bef04a196", + "initialize()": "0x4f24cb4b21a337f37a0cf8e23f719559f3a53d773c439a83d4af0ae9cc3600e0", + "pause()": "0x6de4e265ea76d035e89a589a1a6a280934f6fc3ebb5d4cf453a2e589d0fdb4bc", + "setSwapFeePercentage(uint256)": "0x24d685d4b3197ce4efaf94536add3319b1d449f6501b4e29b5365aa0a4defa71", + "setTargets(uint256,uint256)": "0x4dfd0a62feee8bdacf3d08393f0afa366dfb2d19ae771c9f9d206ccbe5d45202", + "unpause()": "0x3b402ece9ccc332bfef4c9624def91acae25d1361f0808a1db4e84b29fb4d3df" + } + }, + "YearnLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0xaf947869f4f3a0e0363abd32db76969213326c9b60ffff5a505902700c42ffc4", + "disable()": "0xcc2b10c657509434d44ea360695df848ccc5e8a27438dd62f0ae87b147224965" + } + } + }, + "20230409-erc4626-linear-pool-v4": { + "ERC4626LinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x96c00cee5f23c01714b5e57e259a1c31641e672eee5651a4eb0e71b4fc5f24f8", + "disable()": "0x04add3612b5eacdfcdfd76721e5a8c64fa27447ca2e7471d7a8eb367740462e0" + } + }, + "ERC4626LinearPool": { + "useAdaptor": false, + "factoryOutput": "0xc55eC796A4dEBE625d95436a3531f4950b11bdcf", + "actionIds": { + "disableRecoveryMode()": "0xa7c8b49644727da31a35a048233a99825f3b136e1e3d0471005b4669bea0be01", + "enableRecoveryMode()": "0x0ab8486492d2c210b3e25cbe0edc6da056cb86a87d97e1505c437891d0feeb8a", + "initialize()": "0xbdf92e696c3c1976ead921ee734615809bd2fcefea0a9ca7f0340c1ca5473670", + "pause()": "0x900d676b02cc16ed6fb55deda4c1fd5d404fe928336a39685fe16808565a1ba5", + "setSwapFeePercentage(uint256)": "0xe1afc8536d46588e42d553c6d54fc45fa8a579ee70d6955bd4eda71cf8892c77", + "setTargets(uint256,uint256)": "0xeaef47449a416a9bfb2deedb72095ad8e87e585b1673098647a2d5afba27843b", + "unpause()": "0x6eb2fe59bb99c4b1a1a0e24aa492309a26f1a6e54e90fb6003e3da3a7ea62337" + } + } + }, + "20230410-aave-linear-pool-v5": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x4e5458fb5b4d37aa13cf16596c2c795f8ad3fbf1e6a57f58376b1e55519560a5", + "disable()": "0x2ae506b369e2f6eedec062e22693d622cc0ac89b1430f29816fc5513156223c6" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x0889b240A5876aae745Ac19f1771853671dC5d36", + "actionIds": { + "disableRecoveryMode()": "0x9d7dcdac80240446f8ddeba7bb48f71050110d5348b283937c81d407cc71db1c", + "enableRecoveryMode()": "0x2702eaf4dd3129a963b411073e79e54b4810837c737bfa553cf21c7628be4564", + "initialize()": "0x1a9cb0e33afc877cd6977ab9c213da1c157064c5eab48b6e4ba7156b8a9d672b", + "pause()": "0x5ecef7668309699a26afb3349f1d64db694a6d211d7306128795d0f409d08076", + "setSwapFeePercentage(uint256)": "0x1969df6358bc97bc5e8735ef854618289d0135f964426f4f34d78eaa7d078a16", + "setTargets(uint256,uint256)": "0xf5a8e359029ddcb834519348eb7904a82bab363d7e75f3de00bbee8e0b94ea44", + "unpause()": "0x957556913bbcfe2da983b45d1b424cb89ec07a01651bb2bddbe02efecc5359ec" + } + } + }, + "20230711-composable-stable-pool-v5": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool,uint256,address,bytes32)": "0xde3af29ab169dfb983eca98bb7de9b58ff4fbd0f3915d3f88530d3b8431405b9", + "disable()": "0x740f4332364e3e7815877d3129b935f10ce37584e973ed33b93e793000a1c263" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0xD35325DfC0B02718a41De7c94Ac9FC10D0AD5624", + "actionIds": { + "disableRecoveryMode()": "0xacd6e3cd60fe4741be79438b5d7599a59db6fe321838b1aafd090cb76ac6a5d0", + "enableRecoveryMode()": "0x2ac3edb051b1334473999eeea35bc4ff0f87e8c066b66f6940819629a2ccf820", + "pause()": "0x91ce64502d2ca1550ea11bbfcdc5a965e2646c09818313a851c0eeb71cedbb1d", + "setAssetManagerPoolConfig(address,bytes)": "0xc010b17018d461e3279f54624ba8ec20912946429d81a83ca3fdee941afc347f", + "setSwapFeePercentage(uint256)": "0x8e9ee99533bd178c1573e352145db0eeb33e8722b92d1d6fbc1de799b41f180c", + "setTokenRateCacheDuration(address,uint256)": "0x7c981b9a247e1c2143443a980c324fd10ff33f01988adb6be52550038b42861b", + "startAmplificationParameterUpdate(uint256,uint256)": "0x38db2dc993d272984aa505f0b59a8b6aac970193c0e50bfa5e8ba503c053a2a5", + "stopAmplificationParameterUpdate()": "0xbb90aa662dea36fc9db5c97eafcf6a4379941e6e2675d8c1bc1416a42b77db25", + "unpause()": "0x5cc5a51e0ffb55e071240deb95334dd258105f32733d4e9e207af1b8e3d0cc7c", + "updateProtocolFeePercentageCache()": "0xc375be0d632d985bcecff0c0dd97c3fc1ebeb263a8684a2f60a0aa0d01afcbc6", + "updateTokenRateCache(address)": "0x8ae3a82b7f55fd5c056020e1e6f472239fd188cdcb230d474e788fdf39420d42" + } + } + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/action-ids/polygon/expected-collisions.json b/balpy/balancer-deployments/action-ids/polygon/expected-collisions.json new file mode 100644 index 0000000..34d2f20 --- /dev/null +++ b/balpy/balancer-deployments/action-ids/polygon/expected-collisions.json @@ -0,0 +1,142 @@ +{ + "0x527e5a8917fef9f19f55ea7d3f9dc98c00e4836cf918d2af144d2ef91076a53c": [ + { + "taskId": "20211208-aave-linear-pool", + "contractName": "AaveLinearPoolFactory", + "signature": "create(string,string,address,address,uint256,uint256,address)", + "useAdaptor": true + }, + { + "taskId": "20220304-erc4626-linear-pool", + "contractName": "ERC4626LinearPoolFactory", + "signature": "create(string,string,address,address,uint256,uint256,address)", + "useAdaptor": true + } + ], + "0x3e45197c029b241e01ec787908e5cacec9ce62d1230009fc362a356331131b5a": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "claim_rewards()", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards()", + "useAdaptor": true + } + ], + "0x582a057ac2a6af38d6210cf82d397b1a8e37d0057c9e3c048a431bea266574fb": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "claim_rewards(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards(address)", + "useAdaptor": true + } + ], + "0x1b4a46b44f0b40250b0e39d8dd6d3e554f4cb2b54e4b930f619f1e9e2a5a13a5": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "claim_rewards(address,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "claim_rewards(address,address)", + "useAdaptor": true + } + ], + "0x959d4174ac0236341e6fd7f85e7fed11948a27fa51e44b1ddeb6486b90e908c1": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "deposit(uint256)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "deposit(uint256)", + "useAdaptor": true + } + ], + "0x570301d2863e5329b64ec737327d88ae17e23af8794ab92d9fccadea1e14c674": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "deposit(uint256,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "deposit(uint256,address)", + "useAdaptor": true + } + ], + "0x1b83016646b0a4e0aaf521a2aa574b2a62c83d1d10567379de1dec1c02bd7b1c": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "set_rewards_receiver(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "set_rewards_receiver(address)", + "useAdaptor": true + } + ], + "0x7e797160239fadbf43f7b4403f0b147757d6a9fe58eeefb888121e0c481f146b": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "RewardsOnlyGauge", + "signature": "withdraw(uint256)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "withdraw(uint256)", + "useAdaptor": true + } + ], + "0x363cf2bd771efe16bd206d33a549d4698c4ad202ea6b5bf693722fbe151140a6": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "ChildChainStreamer", + "signature": "set_reward_distributor(address,address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGauge", + "signature": "set_reward_distributor(address,address)", + "useAdaptor": true + } + ], + "0x322d97a0df341a88bf3c100fe4bbda28c2c8a55985af0612371aeba6af9222e6": [ + { + "taskId": "20220413-child-chain-gauge-factory", + "contractName": "ChildChainLiquidityGaugeFactory", + "signature": "create(address)", + "useAdaptor": true + }, + { + "taskId": "20230316-child-chain-gauge-factory-v2", + "contractName": "ChildChainGaugeFactory", + "signature": "create(address)", + "useAdaptor": true + } + ] +} \ No newline at end of file diff --git a/balpy/balancer-deployments/action-ids/sepolia/action-ids.json b/balpy/balancer-deployments/action-ids/sepolia/action-ids.json new file mode 100644 index 0000000..9f72ca8 --- /dev/null +++ b/balpy/balancer-deployments/action-ids/sepolia/action-ids.json @@ -0,0 +1,579 @@ +{ + "20210418-vault": { + "Vault": { + "useAdaptor": false, + "actionIds": { + "batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)": "0x1282ab709b2b70070f829c46bc36f76b32ad4989fecb2fcb09a1b3ce00bbfc30", + "deregisterTokens(bytes32,address[])": "0xe4f8ff74aa05a4d54a06e035d5e86947bc6474f8d7b166ebeb49fc9178d28551", + "exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0xc149e88b59429ded7f601ab52ecd62331cac006ae07c16543439ed138dcb8d34", + "flashLoan(address,address[],uint256[],bytes)": "0x96ebe854ca6ab6242ad127dcd7809576513b0c64571e515cedd7b8885612c82d", + "joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x78ad1b68d148c070372f8643c4648efbb63c6a8a338f3c24714868e791367653", + "managePoolBalance((uint8,bytes32,address,uint256)[])": "0x7275fb98594b03dc36a7de69051058e9e2d05cabeb4fe7d9c87bc69f94d9d084", + "manageUserBalance((uint8,address,uint256,address,address)[])": "0xeba777d811cd36c06d540d7ff2ed18ed042fd67bbf7c9afcf88c818c7ee6b498", + "queryBatchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool))": "0xf5f701b3adfba2adad8f16a8be5a989593e42a2caa84c5c6e60b22143db65a2f", + "registerPool(uint8)": "0x956dfce4343a6be4df20714d3dc413ef59e73fa9995d3d247e7c8d12efd33ac2", + "registerTokens(bytes32,address[],address[])": "0xad5bd4a1cc4243b4d772a8a55d24792c1f57cc45eb97ed1291b82d96125a7626", + "setAuthorizer(address)": "0x1cbb503dcc0f4acaedf71a098211ff8b15a220fc26a6974a8d9deaab040fa6e0", + "setPaused(bool)": "0xb5593fe09464f360ecf835d5b9319ce69900ae1b29d13844b73c250b1f5f92fb", + "setRelayerApproval(address,address,bool)": "0x0014a06d322ff07fcc02b12f93eb77bb76e28cdee4fc0670b9dec98d24bbfec8", + "swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)": "0x7b8a1d293670124924a0f532213753b89db10bde737249d4540e9a03657d1aff" + } + }, + "ProtocolFeesCollector": { + "useAdaptor": false, + "actionIds": { + "setFlashLoanFeePercentage(uint256)": "0xbe2a180d5cc5d803a8eec4cea569989fc1c593d7eeadd1f262f360a68b0e842e", + "setSwapFeePercentage(uint256)": "0xb28b769768735d011b267f781c3be90bce51d5059ba015bc7a28b3e882fb2083", + "withdrawCollectedFees(address[],uint256[],address)": "0xb2b6e48fa160a7c887d9d7a68b6a9bb9d47d4953d33e07f3a39e175d75e97796" + } + }, + "BalancerHelpers": { + "useAdaptor": true, + "actionIds": { + "queryExit(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x7f07ad84ce964c68be83d85c5e1f1deeaef9be0fff6e04313952413485f43f5c", + "queryJoin(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x672fb3f0e8a340e3fb8702457aa4ca5df06547b389d1b676ac5d02a8e28e6a51" + } + } + }, + "20211202-no-protocol-fee-lbp": { + "NoProtocolFeeLiquidityBootstrappingPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address,bool)": "0x0c3d2aaf4b915fe98b3cc8d077e5300455aba3fba02cb97178763edc58e4b422", + "disable()": "0xaaca8c0bc7eb9707e436b61086714bd0b55b4f174ac505a2bcbbe9ba2289c825" + } + }, + "NoProtocolFeeLiquidityBootstrappingPool": { + "useAdaptor": false, + "factoryOutput": "0xe90472ffc41D7Ddf8E3B456bBA748e3F22c59C6f", + "actionIds": { + "setAssetManagerPoolConfig(address,bytes)": "0xc50b70116bc58f31d376da460e18db97904b5c7e23e3052e1554e7ae43cf9038", + "setPaused(bool)": "0x67bc8e5ce7b4e29d4e4ce922a2e2e213fca860a8b72a10633548d746575e8052", + "setSwapEnabled(bool)": "0x1091fd5eb0c10d4fa426c318f48151c334a44ee9dc9c0d4202604c52d5cb786b", + "setSwapFeePercentage(uint256)": "0x3999b0db0d2ef920ef246cfa91965491c51e4bdca89c43c76ff5f76a802e0112", + "updateWeightsGradually(uint256,uint256,uint256[])": "0x7b5e69fcc1e02d24efcae3d0c48a7c07317d74e49e2412e0d15bb5f638fffe1c" + } + } + }, + "20220325-balancer-token-admin": { + "BalancerTokenAdmin": { + "useAdaptor": false, + "actionIds": { + "activate()": "0x2d0528f7c04271f8e26bbd500cd365397fa9d6f19d94d83905fa90d03df4d8b7", + "futureEpochTimeWrite()": "0x0bf63edbe51328fed2dde2e84a0704117c48b2870ae6e27907f092051cee9669", + "future_epoch_time_write()": "0x11c198bbe5729b1825fe592d2895cf3f676a15cfea8a75ec1a07a30db8a1f5f5", + "mint(address,uint256)": "0x504baaf96c678c93b68ca6c03922803f5a23101336eea2d6ea27b8b86059f257", + "snapshot()": "0xd604f9c832f168646f27b4d66fef7ffcc72c2c52b25bf1b53bb2b9d84ad7f448", + "startEpochTimeWrite()": "0xfc40c0d865a1633b2d815c74678c33b0d3f47ef0f8be14b82835b4827c154886", + "start_epoch_time_write()": "0x3162b3721b6ee685678cc72568349184ae0cb3601c0d33571d5f98ab7fd930b0", + "updateMiningParameters()": "0xc18a2542501a35fe6acee2653709289ee324b38c3ba44d94496832eb23355ff9", + "update_mining_parameters()": "0x8691431e86f063e98c1fa0b883d49eb6a752b7b626b249cf8c0704cc429870a6" + } + } + }, + "20220325-gauge-controller": { + "VotingEscrow": { + "useAdaptor": true, + "actionIds": { + "apply_smart_wallet_checker()": "0x5ec1e4fc7b095ded207161155c47fc79e74d04f6ec67addff7d9e6a3e0b0c0dd", + "checkpoint()": "0xa19680da38f352c62327b29ad629216e0168a977564e1ca005c02ac291f86f92", + "commit_smart_wallet_checker(address)": "0x205469f5cc55d981b8eeb1b14073b29504f1eb31e9aa5ce13558bb28e7ad4532", + "create_lock(uint256,uint256)": "0xc4acc10c439026ccfb17feefb2f7a9e24a07162f0fede5cb2cf646c4012a76bf", + "deposit_for(address,uint256)": "0x4949596f0a508c1ef411db24073a06dbda8b5e1e8a37c951e54188128789b194", + "increase_amount(uint256)": "0x968e8439edeccacdfdbe0d38b5bfdb37451c260d2ce471fab3516842b5499feb", + "increase_unlock_time(uint256)": "0xd4f2f179fde3c5d5445edc34ac0bea397f96cf86b21c8594b37ca6dd12f1d614", + "withdraw()": "0xe5bd00a0347d50f01160ede5c9f49164111bc98c736a888e89ac2fbe93665d8b" + } + }, + "GaugeController": { + "useAdaptor": true, + "actionIds": { + "add_gauge(address,int128)": "0x55f1ffb8528d2f64e7785cadb1d935a2bc01dcdb7b93db62bef21fd12cc493c2", + "add_gauge(address,int128,uint256)": "0xdbdac60bd2a4bb437f186e20beb701eb38cc48a3b442c4520849f494969282c6", + "add_type(string)": "0xb02d2f0808812c4ef5a66a4b83df0e6a5f0d3a21900556e1808bf834c41af6c6", + "add_type(string,uint256)": "0xf1db5552c911608aee9eca30f1ef3632f153af1293386b1535d02eeea1ddb489", + "change_gauge_weight(address,uint256)": "0x9550f010a29ea9bad6fb138e92a994aebbb715cc2c98d978b02f403fa55d0758", + "change_type_weight(int128,uint256)": "0x3d679df2218f97925b84308eba8609ffb1fc5d0e18c31413a84272f9722e54cd", + "checkpoint()": "0xa19680da38f352c62327b29ad629216e0168a977564e1ca005c02ac291f86f92", + "checkpoint_gauge(address)": "0x89d492516c7f0230f12e904811ab2be05026bd405d8c3598bcfcf40ea061d8a8", + "gauge_relative_weight_write(address)": "0x89f46ffd6c09d08b49cd9d9d900ae4711b21c476d8f9b843c65ef1c15e1b4d58", + "gauge_relative_weight_write(address,uint256)": "0xc032a5844ddd9f15d48b99a937c261fe9ebd8fbb4237b407075ead3a6de1bf3e", + "vote_for_gauge_weights(address,uint256)": "0x10794159c1dcc5dae1a1bd42c39ea66073f3e53b3fd5fb7efe4d91b2f5751f2b", + "vote_for_many_gauge_weights(address[8],uint256[8])": "0xe2c031a56d74fd3f9c14a597c2e2f68ab2deecf145536eade36514aace1428c7" + } + }, + "BalancerMinter": { + "useAdaptor": true, + "actionIds": { + "mint(address)": "0xee2d89935e242a0232af738fb7b204e46d7e51881d093925be973aa3f255a900", + "mintFor(address,address)": "0x6ef1b29ccd9cceb39af0a22283611e74677b615e8ae1ac777b43de9f416d044d", + "mintMany(address[])": "0x8177bc605c6414f59419c7ef992a1e2c45497bbe6808cb357dcc6560d3f9626a", + "mintManyFor(address[],address)": "0x65d8bca9374e302e778f6aff7225a3f0e242ea4bdb04d6baf07a27bfa1d2000a", + "mint_for(address,address)": "0x80b82c89c295f79521954b612d50a377869a14d205b15637695192788d6b3d8d", + "mint_many(address[8])": "0xf2c7d41c02aae4e557115272c28a6056d6fff072be576315b805715ee4daf4e0", + "setMinterApproval(address,bool)": "0xcab6b354b7ebf9ec7b7e60e60cdfb35ba44b18a47c9243399550449eebf7765c", + "setMinterApprovalWithSignature(address,bool,address,uint256,uint8,bytes32,bytes32)": "0x0e29bc07e3a173665f6298597fdea4f8487b2a1c5ee1df2a5255bef0b41ceab1", + "toggle_approve_mint(address)": "0xc5efe30d07388340e6b6983001b6fd6a3da21bdc63157006eb969acfedd787e7" + } + } + }, + "20220325-ve-delegation": { + "VotingEscrowDelegation": { + "useAdaptor": true, + "actionIds": { + "batch_cancel_boosts(uint256[256])": "0x7fd83e94eb583ac22fb64de77167e03cb9adcea2673a275acd6674e4cc7cdaeb", + "batch_set_delegation_status(address,address[256],uint256[256])": "0x2272d0eaf618ed175e90cca68201cb3b36c1d1bb23970fd99e67ae682ac82a3a", + "burn(uint256)": "0xcc84253e32ef139d0876d179dab988d8f82fdc546d4b7f6858cd413ce875b3be", + "cancel_boost(uint256)": "0xf5837929d0afde6661b5c6939e59b9f65c8cfbc6a7fb9104b2d9b51bab0674b3", + "create_boost(address,address,int256,uint256,uint256,uint256)": "0xfcf8fca7bf09a756a509c56e356738bcbc8eb3a7bc3889c278b7b27a1ac4b83e", + "extend_boost(uint256,int256,uint256,uint256)": "0xa0e8c60ed43efa645f1b1a42196b3b6b6e2579f13f5b66d05fac821891380cda", + "setApprovalForAll(address,bool)": "0x7226cad1c437502bd55f74d70a4afb5dbb123bad342bcd800b7e9f81292d93ce", + "set_base_uri(string)": "0xfdc0d3b7bf0016c3a810d689b17792d1b67fe2ccb91c8900c1a925b1d10077d4", + "set_delegation_status(address,address,bool)": "0x2e186eefd30d98d5abdad30eeb474e885a9e1daf5738a75fab4f94c106d948a9" + } + }, + "VotingEscrowDelegationProxy": { + "useAdaptor": false, + "actionIds": { + "killDelegation()": "0xc7c1b90eebb50671a50c2a0f6065d695915202e6f8d9192acbc82e0487f8d704", + "setDelegation(address)": "0x9db73f473bffd0ddda1480f41895d1c57f8d1a3d23456f31dbfb7e3f12392bfa" + } + } + }, + "20220420-smart-wallet-checker": { + "SmartWalletChecker": { + "useAdaptor": false, + "actionIds": { + "allowlistAddress(address)": "0x16c29cc2ff29f318666ee5ca529f256e302522ac0f41cd5e248d90678288756c", + "denylistAddress(address)": "0x01ab1c44b821c5a483b540e449de9b2c7374c3f4a99cccddf6213bb0b2c82ff5" + } + } + }, + "20220517-protocol-fee-withdrawer": { + "ProtocolFeesWithdrawer": { + "useAdaptor": false, + "actionIds": { + "allowlistToken(address)": "0x662d0d3b7320cad53b7f81e19da4222f73d94e3cf6d9b04027f2ddc7f1b3caf2", + "denylistToken(address)": "0x582e10774b99f4f7e2c3aa5bd7ad12034017c03909ec36841536fa94fa703e80", + "withdrawCollectedFees(address[],uint256[],address)": "0x7ca4efe72b04296465b751e5dbd7598a2dba855cafef6004b3c952bf43487685" + } + } + }, + "20220530-preseeded-voting-escrow-delegation": { + "PreseededVotingEscrowDelegation": { + "useAdaptor": true, + "actionIds": { + "batch_cancel_boosts(uint256[256])": "0x7fd83e94eb583ac22fb64de77167e03cb9adcea2673a275acd6674e4cc7cdaeb", + "batch_set_delegation_status(address,address[256],uint256[256])": "0x2272d0eaf618ed175e90cca68201cb3b36c1d1bb23970fd99e67ae682ac82a3a", + "burn(uint256)": "0xcc84253e32ef139d0876d179dab988d8f82fdc546d4b7f6858cd413ce875b3be", + "cancel_boost(uint256)": "0xf5837929d0afde6661b5c6939e59b9f65c8cfbc6a7fb9104b2d9b51bab0674b3", + "create_boost(address,address,int256,uint256,uint256,uint256)": "0xfcf8fca7bf09a756a509c56e356738bcbc8eb3a7bc3889c278b7b27a1ac4b83e", + "extend_boost(uint256,int256,uint256,uint256)": "0xa0e8c60ed43efa645f1b1a42196b3b6b6e2579f13f5b66d05fac821891380cda", + "preseed()": "0xf8e20f793e79aa1a612c3483513ebef1cb425dc219b19a140617c5b5c600f701", + "setApprovalForAll(address,bool)": "0x7226cad1c437502bd55f74d70a4afb5dbb123bad342bcd800b7e9f81292d93ce", + "set_base_uri(string)": "0xfdc0d3b7bf0016c3a810d689b17792d1b67fe2ccb91c8900c1a925b1d10077d4", + "set_delegation_status(address,address,bool)": "0x2e186eefd30d98d5abdad30eeb474e885a9e1daf5738a75fab4f94c106d948a9" + } + } + }, + "20220725-protocol-fee-percentages-provider": { + "ProtocolFeePercentagesProvider": { + "useAdaptor": false, + "actionIds": { + "registerFeeType(uint256,string,uint256,uint256)": "0x436389772101f36c82c9d26cb8ca7b7398211e38b2d394e380d43d6d4fa8027c", + "setFeeTypePercentage(uint256,uint256)": "0x8560db79be0c16c4273e143ce62ad6a198d391fda59a26fa371930c6c02a6194" + } + } + }, + "20220822-mainnet-gauge-factory-v2": { + "LiquidityGaugeV5": { + "useAdaptor": true, + "actionIds": { + "add_reward(address,address)": "0xdc8b557d7b464894c525e5de06257694247b2b789b4948326752177399475439", + "claim_rewards()": "0xb6f59366d2aa97f8c51f5caa13a58d14c495bebc0eb0a0e28510abfca37a3a2e", + "claim_rewards(address)": "0x8b9eff478b7309b9a7d94d1d412efe93bdb13fb2d10aaf5720ef2e62b78255b9", + "claim_rewards(address,address)": "0x1955a1320fc9f42b0922cfbd95a80125a5405e15605221bb7fabb26b8b96400e", + "claimable_tokens(address)": "0x18e453090a9493f46652183f2481aba603cdcb546380ec49b63ca94c66e4e3a4", + "deposit(uint256)": "0xf40ea6655a4d362dc07ea4bd44a45b140953914b7fb570d01571a0113ed0f16b", + "deposit(uint256,address)": "0xebb91db92ed5cab426d18c44b88b939f8edc0867dee7c6183a1748f1929cab0e", + "deposit(uint256,address,bool)": "0x436fcc243ded921052be4acfb36fbcf4ae7f5771a22ef5e1f25d2ac057885f57", + "deposit_reward_token(address,uint256)": "0x4190fc8ffb7740e8eaa9f45bb3f1bb96644606d40c48ea1c2bacde6daa119f1f", + "initialize(address,uint256)": "0xc643fddeed96f34efad4fef589188d8f14387c60ca2ad59d33e0dc3efd85caa2", + "kick(address)": "0xb6fff9fe69aec4f98ba565d0110f551d0f8da8381391b8f1dc7c43e7a7352eea", + "killGauge()": "0x9e97ccce1d835516e8fbd06e4c9f8f7746593762c8d6346a45a57f4ba03ce926", + "setRelativeWeightCap(uint256)": "0x3b2b9d87161388370bfd791bf7a16ebb7ce03597d969b2ffb9d1e46b20c894a4", + "set_reward_distributor(address,address)": "0xa68f8859aea0e52f285bf8615e8d0b1c2421e59f342cfea2e496bb19738e86ea", + "set_rewards_receiver(address)": "0x9441a83056fd8a7562bc4257190480b77612a9df71e2ab381f9caecfa55a1232", + "unkillGauge()": "0x45e4233e809912849663a4a9242094c0741101b98b3b48d84e2f4aaa512ce1d9", + "user_checkpoint(address)": "0x49e1492ab9c1843df63e654a11e9369ecf82a1bf370798fddfdfc8a59d46b1cb", + "withdraw(uint256)": "0x4168d719ac96c4fb5e1b45bd6dba558e3f3b2125aa3d4523f2f419818453c3a4", + "withdraw(uint256,bool)": "0x9c07677c89e5cd77125ff34ff07c693e7155872eafa2743f8103c07681b8b31c" + } + }, + "LiquidityGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address,uint256)": "0x747aac6d8b661ee94c255706053d43ee80abb5a1887af7ab3fb69d2906f1c49f" + } + } + }, + "20221123-pool-recovery-helper": { + "PoolRecoveryHelper": { + "useAdaptor": false, + "actionIds": { + "addPoolFactory(address)": "0x11aafbc50824ed8c67d59d613571a293af85e7671bdc70208ab54f3f91894c1b", + "enableRecoveryMode(address)": "0x8df4afa3468a9f7f4f69b55d2f676838d3ade421a7ab03e6054a29185f77ebf4", + "removePoolFactory(address)": "0xe2d639ca9081c247085ef698f95fd110f1e743908f287238636d4d5b95d11542" + } + } + }, + "20230109-gauge-adder-v3": { + "GaugeAdder": { + "useAdaptor": false, + "actionIds": { + "addArbitrumGauge(address)": "0x52cfb9b535c4f172d8fce6a24b9ad4c783e83d49123401fe0133ef10e8b11090", + "addEthereumGauge(address)": "0xbd34b29ecc772fb83c95a2bb01b836b52372bf3bd8c3e3233f0e10f3c8f17a08", + "addGaugeFactory(address,uint8)": "0xc3514dfff9c8b425094bdeeb373915c52aa3e59586f90be81bc1429e791b2121", + "addGnosisGauge(address)": "0x0ec20eedb8aacadfa4deab1bf3c99e11f66c0288cbd2eb82098bb9b3378485fa", + "addOptimismGauge(address)": "0x266e1329f723cd42f90ff058d1c8175f554cc446b97a17d31980e4ac444775b4", + "addPolygonGauge(address)": "0x8a57f7a110858aa5d30e6157ac8e831462f7f7e3f5c20dd0c8f0ca14ebb3ffb5", + "addZKSyncGauge(address)": "0x962cd164270c460324dff3a3746658eb18f152ba90d7ba773531e6b6a8dfac94" + } + } + }, + "20230223-protocol-id-registry": { + "ProtocolIdRegistry": { + "useAdaptor": false, + "actionIds": { + "registerProtocolId(uint256,string)": "0xc26e21fc0aba43b199202ad3de0ba39a17c1006c1f7b3791ca2a3b9f86a4f0b9", + "renameProtocolId(uint256,string)": "0x717d11aa4cee062d5f4a3262a493c6cb8b8d7985b98d3a3fd2f80631feb89968" + } + } + }, + "20230316-l2-ve-delegation-proxy": { + "VotingEscrowDelegationProxy": { + "useAdaptor": false, + "actionIds": { + "killDelegation()": "0x587b0999c511694493485639d262789d9aada78c2050508953233225da5242d4", + "setDelegation(address)": "0x033f3ebfdc58141797e7786a8115159707118fe37ae8f6d7b98929e4465349fb" + } + } + }, + "20230316-l2-balancer-pseudo-minter": { + "L2BalancerPseudoMinter": { + "useAdaptor": false, + "actionIds": { + "addGaugeFactory(address)": "0x8df4d209e3818fc96a60498ba4c8a9eaa8b01ce06f738f7467a5154acf092b63", + "mint(address)": "0x55be814c1369fae72337186e52aa32571bfcd2703f3eef99a34a565936117646", + "mintFor(address,address)": "0xb7490a7f809aa4d7d8d3d76a052ae775ddaa66f0e5027d0c5f12697cc0dc42e0", + "mintMany(address[])": "0x1ac9fd64dce3367ce92242d5b9970c3ae063a121e24cff29335d2444bfc92202", + "mintManyFor(address[],address)": "0x55d8591c908869c4d2b9f003a268b2e8354f4b46ba8bb565a37218be15712906", + "mint_for(address,address)": "0x822d0ca8da7c8521c3559d3a5453b7873ff7d0d1b4cb009bc111a4bfbd05edb9", + "mint_many(address[8])": "0xfcf7b3a78f475afca32cfd9d5b9588219c42be10f29ddffa5cfb00c74cfcbecb", + "removeGaugeFactory(address)": "0x7db24189c618e486646b59474c0641efdee8ad627a64e36b3378d1e81421b020", + "setMinterApproval(address,bool)": "0xd6df174b77e1cdae64eb55ad732a7c88c5d2afe0a52d5d68aa478fa6bdf558cd", + "setMinterApprovalWithSignature(address,bool,address,uint256,uint8,bytes32,bytes32)": "0x7ad31d312b8dfe4cb7c0a00f2f2f2f87b0a522828de11332092988af938ceb93", + "toggle_approve_mint(address)": "0x4f8c74927fecd4c0ddd2a43f61fa32cb8558d16c57771b8ca3a988be940cf9a1" + } + } + }, + "20230320-composable-stable-pool-v4": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address,bytes32)": "0x94b2db09bec810613e4f5881b1340e8ff799b3b98226cda70c9fc85b98d83dbb", + "disable()": "0xd6bdffde0c0f4629c184b342184d8b1562a2b30538a0ed2db21133618c4ffd6e" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0xA8D865FE1D68a405B29f884358468c9B52d4841d", + "actionIds": { + "disableRecoveryMode()": "0xd0b221ab5c77372697da10c050db2341c6a4e6a1f55f3fa158d8f079af5340c2", + "enableRecoveryMode()": "0x161a806b97d5dfce1a75ae395bd80795753e928027acb2a1e94e616655c2198a", + "pause()": "0x9f0e349d2cc5c4c98f50c1c4f14a91b8b0b6de930820177cfde10fb740d9d6bf", + "setAssetManagerPoolConfig(address,bytes)": "0x10f0adb0525666fae429e30ca8a3c979302e85ee762f80224cfa8ff9482e8652", + "setSwapFeePercentage(uint256)": "0x4c98bc4361ffe530410feb2bfd57375dba895e56ebce42931823cb7195f73ee1", + "setTokenRateCacheDuration(address,uint256)": "0xb85601d50a47deef769871d0e232e8935e43d9359e37ca885149aebf9d07f760", + "startAmplificationParameterUpdate(uint256,uint256)": "0xcbfd8f6e5398209a94928511c08ac4e069705186008019eaa40e59b5d94d33f3", + "stopAmplificationParameterUpdate()": "0x84347a81ef5ce8001be939c196486f0b1ef76cc84895ca48de7601087609bfef", + "unpause()": "0x6ba2e5b0563a6eac5ee82914cfedaa6cbbeb45e599b76a97ce2b55e057bf6954", + "updateProtocolFeePercentageCache()": "0xa3c3e5f9f38fbd717a54829d1680d888484afff3644a8cd5cdd53acdd1cd51b8", + "updateTokenRateCache(address)": "0x50462fbba88650d6cc7b1e63c901c7d1e27e21540747e7e1fd0a853743fb482e" + } + } + }, + "20230320-weighted-pool-v4": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address,bytes32)": "0xd7e621dfc10c41f6fee7e9580d7bdea1ae6cebc8110f786556e4b32ff25e5c7e", + "disable()": "0x37f25bab0efec022e38c7c0b93ab912c47089ef4f1d87c750370287b557b91d5" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0xf7a7E1F48FA43cb7919Ff4Eb362c5bE78092dF4A", + "actionIds": { + "disableRecoveryMode()": "0xa5ba0e311a3708a10687898ef46b0dd0961a416c936ebc6bcef6d4658d30a06e", + "enableRecoveryMode()": "0x8eadd4190575e75c3ae8ad47bb4e2e3cd17acdd612c3e1739fff31258a955497", + "pause()": "0xdfc04db1b31202d7d7432709d528f744ede86e736321252704e27eb736a0d76d", + "setAssetManagerPoolConfig(address,bytes)": "0xb16e39cbb5069d2095bb504b9c1aff5ddf481c95437700623fcea1b1d75f89b6", + "setSwapFeePercentage(uint256)": "0xa651d4dc4b981274239f397ae52d18d82d644b824a331060ad204e7a2cd9e29e", + "unpause()": "0xa0ae470310e9af5d5af1fc389e357476f09edaa25ef7d00fbcf835dfb55396b2", + "updateProtocolFeePercentageCache()": "0xed265992bd4e9d6f14f5f76ea0881d072e92c0f5b7971678cca207a1a2fc03a8" + } + } + }, + "20230404-l2-layer0-bridge-forwarder": { + "L2LayerZeroBridgeForwarder": { + "useAdaptor": false, + "actionIds": { + "onVeBalBridged(address)": "0x8479309aa603374a9d258fe76d7264fb12353953517e5644e128c25e47a1afc1", + "onVeBalSupplyUpdate()": "0x9dbfb36e90c55e213c04cfcee795134e6e9802dfc1c21a3119b9dd6e5a53d5dd", + "setDelegation(address)": "0xe1a833117678417df5b0aeb8002f897e410d84f7a8f1906e355a97151a3f38a9" + } + } + }, + "20230409-erc4626-linear-pool-v4": { + "ERC4626LinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x9223d37d681875dc921beed09b6f8121b04d7c598ca96d387885a075aded46b5", + "disable()": "0x0ffb09646d80ce4403872912e5375eb2b45a42596dd7b15987250ed9e493981f" + } + }, + "ERC4626LinearPool": { + "useAdaptor": false, + "factoryOutput": "0x0c2EAd6F2Dc2A9385187023F4cec5925337B330f", + "actionIds": { + "disableRecoveryMode()": "0x5d9564681f2650087ada14b5b42f499273c551eab670336f44ce257caa16274f", + "enableRecoveryMode()": "0x3da54306f133c29c3a7c5e793d8cc0c5e36cd47b6ad985881fc16e82840050d1", + "initialize()": "0x936d19a4ec20e498b0a4640e33a4dd69c5b008ef9349dcd9a06e7b872661f478", + "pause()": "0xe0291b90cd2f7a6aa8cbb14b530940281e44aaca8519e76977fe42ae5adf1d6c", + "setSwapFeePercentage(uint256)": "0x3c1f3295bf0c70c8c34bf54d21a21169150c277198210999725082ee25609f9d", + "setTargets(uint256,uint256)": "0x18e36c8ebf7c7478ab7c00402ae126e8f074b7291aeb962358ac29296c1dc65a", + "unpause()": "0x03e562335a22c12460740456e5799e10b51a20a4e6a17a6d2fd03085433c69bc" + } + } + }, + "20230409-gearbox-linear-pool-v2": { + "GearboxLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0xad0b49b8601e3b2d6ec0b0bff0c95d99223ddf2a3963d6f1113cd3ef8f4c2f84", + "disable()": "0xdaaee19ea07a42ead195d8bb23af2bef543fbc6c68646c53eac48ccce223ebd4" + } + }, + "GearboxLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x112a7b7ca66E6963C49BC523A415F7D8CDB806B9", + "actionIds": { + "disableRecoveryMode()": "0xda47db3e3d7efeaeff787e4fc4d928b5c8b8721fbf1141a3f886d25b003daa53", + "enableRecoveryMode()": "0xe932f711f092053ab6fe1738927dfacaaf05f6678a02b1f4bca7e680b95acbe8", + "initialize()": "0x18caf3fe791e837d8802980d9b142880ec4f2d2a91fc295997cebe652347f2f7", + "pause()": "0x891df90c5c3658e1ebd9ae73664a3921ffecb5a9fb19becfbeb1977bbd03316b", + "setSwapFeePercentage(uint256)": "0x54f4400937c49ea26409a0ee7262a49aea8d784bd16e12ac7e403ea500fe5d7e", + "setTargets(uint256,uint256)": "0xb00908e890cb5d1998a4a0568e5be94544c71fc7b6e51fb86e743bda0ad0be89", + "unpause()": "0xbb163efa221c969d82ee7574faac5731119d3ea11e5faccefa5a3fd6ca636228" + } + } + }, + "20230409-yearn-linear-pool-v2": { + "YearnLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x8848d00821263aa3af7488cca20836e0a2feb2ebbbfaa9ad7aac36bde5874ba6", + "disable()": "0x10309793b09e12627079870d7f870d5a2219783ec92c520a7546889043208676" + } + }, + "YearnLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x016B7366F76aa2794097798B90CF239796AEff8d", + "actionIds": { + "disableRecoveryMode()": "0xb25d7418112243a3a03180af65c9a3fe2cd4672de2805564cd78f582fc19e2e8", + "enableRecoveryMode()": "0x4f044d8f0adc7f5b8c95b66b566f0d053c7caf29f9fd772983f18f028661add0", + "initialize()": "0xac5e13b199771697533859a332b23cc3bbd831c6c03d43690ea5f1cb2042fd47", + "pause()": "0xee0d2e17e33eeb7464ec559e266a11ed839e591bdea61056525c0d42c0b1d00c", + "setSwapFeePercentage(uint256)": "0xae4e99077736de6f65e6b4485f9d0a1a6677f98f43705fad3d185425575a07e5", + "setTargets(uint256,uint256)": "0xb338d6b1c3aaeff44fa180b0bdfc08ec71541eb913a7b1966a2e7d11ae3e61d9", + "unpause()": "0xcfaaed94fdccb23b062615f816085aa58890f6ce8cd871435b11de55d73758a3" + } + } + }, + "20230410-aave-linear-pool-v5": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0xe836dc8b9031e116ee50f37551bb0adcf2916c72e7a2d9304e3ca082eca1b69b", + "disable()": "0xad5264d61ee90db6d19d6e36a2c93f6d23112459b8a494e489fa1b8f0b9fac38" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0xE4EfD99f3C03778ba913Eb578C599329634e2bd7", + "actionIds": { + "disableRecoveryMode()": "0xb2af73aa4d2b082807ca3eee2d0f1404eb4bd2fa6e69cf52fcea761c3f37b5d0", + "enableRecoveryMode()": "0x46efbab063c0b0398c10c3e97d24a5263780379231f3ead5ac0eaf2e9cf8a318", + "initialize()": "0x20399a822cb3741cffe986fe576e6d65536d7fcc1a98784c5f39f3101b8ec57d", + "pause()": "0x376ffebf3f39d793f8453bbf54f031a0b93c0455a242f89dc6c534b14016e7c5", + "setSwapFeePercentage(uint256)": "0x8d42976b17cd3fcc68fb84ff3c85d5eaecf426a37a68f6b2a0689ea42aa21011", + "setTargets(uint256,uint256)": "0x861292859f72c128e404d3ecdfcf16faea9c871c34cb0feeb2fe0554cc846146", + "unpause()": "0xd91831ebc42acd1099b238ce67465a2588e7621afb027e9ec1663222355037c1" + } + } + }, + "20230410-silo-linear-pool-v2": { + "SiloLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x8a97eaec27793d16bb93455c858e62975a7de11ad9804eb09c311dc4e8011586", + "disable()": "0x8d305e761700b38cf2bc3f9e2c4ad60807e843cf2efd2415b902b1163f8f9a22" + } + }, + "SiloLinearPool": { + "useAdaptor": false, + "factoryOutput": "0xA149CF2D795AaB83a15673f5Beade9361e4e3F65", + "actionIds": { + "disableRecoveryMode()": "0x5610aeafaa3f5c4ef9b9b45ee9c0810b2f7bd64b7b504f19d1a8a3bde062a966", + "enableRecoveryMode()": "0xb213b9fefdba263a47d6449bab5d563a39489f656d504fd24d5b9efe6fe23a61", + "initialize()": "0xc69b26447f8c0e7be3af16e8bc4ca7bb0429d1a1c3d1747335e1d5639ae8255b", + "pause()": "0x6c331c074092fbc25cd1032630ed25155aa5b81afa1d296bf5a0f0e9e0c6e846", + "setSwapFeePercentage(uint256)": "0xcf555cc0ffe0f3255e6e21b7f9236c3c9fa8f7bbeb3c8796df9d3b5b6b630f1b", + "setTargets(uint256,uint256)": "0x2cf7b5ae7644e204e356ce4ad82a85e2f49285924e0a7be16c7d5e64ffe4e147", + "unpause()": "0x2104a90e49b9d709bbc44eee47d6280b32101abfb2f670e77162a9c703c8888b" + } + } + }, + "20230411-managed-pool-v2": { + "ManagedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create((string,string,address[]),(address[],uint256[],uint256,bool,bool,uint256,uint256),address,bytes32)": "0x76b1d9cdd9022dd3a61e77a0e3dde643be3398f712f33d885dfaa31df1b299c5", + "disable()": "0x317174624b62277ac5ff8119b276b924dc9db1c85abaac41fb582dc8b53293d6" + } + }, + "ManagedPool": { + "useAdaptor": false, + "factoryOutput": "0xE458224CA8d6605c87b73E92aa5CB7A4e77770f3", + "actionIds": { + "addAllowedAddress(address)": "0x3d988dd7cc261402c6d98119ea597aab1f0e2db754cf39cd85d958ac3d5911ae", + "addToken(address,address,uint256,uint256,address)": "0xd29c9452cce7e71d82d4ca56ca58bf725aa10ce5169e67d31792b5d573f8669e", + "collectAumManagementFees()": "0x857a85b3cc62c4986be007ce796ad88d3e79a6271f6a38ba1cedf3a19f503118", + "disableRecoveryMode()": "0x914f8d0fea409af281f24377202f4479091da115e5b465657196e8759f5411b1", + "enableRecoveryMode()": "0x9d41b20e31524ba083cba95296101954cf162c1794a6122546fecdb16faa174f", + "pause()": "0x82f21f0ce0761b042e52faf4c364561335f19284200747cde1e8674a8694fc5f", + "removeAllowedAddress(address)": "0x1e2994f49eda4fa02a71ce34cb94d8ba1997dd41017cd0a86f4978f36be0513e", + "removeToken(address,uint256,address)": "0x33c99e511c0ae7df48cf172244baaf5177a0a45f2e740d3da03b460eae424b09", + "setCircuitBreakers(address[],uint256[],uint256[],uint256[])": "0x7dbfafe45dffdb0f161a0f1714348d05a5ff06aefe4ed3f894b505bb9d5f23fc", + "setJoinExitEnabled(bool)": "0x9d65883dff29bbb429d9f9e866243b40e40da57bf09fbf282e4dd6ef9a750f4b", + "setManagementAumFeePercentage(uint256)": "0x1a21ef312e2459570eb7d131f26d29613b68a1c99682a2dddce0ebde8025b81b", + "setMustAllowlistLPs(bool)": "0x128673b743343429067a8d7e946201b9f072a8e914c623bf8181c9bfd46ec3b3", + "setSwapEnabled(bool)": "0xa42a1b403d712ecdb2d65a31271497626c5c3719b60ebebc5268a5bf40bdf8c0", + "unpause()": "0xb35c85cf44d3ad9099add161bf31c0fdb28dcac3c4fa5c31da4a4eabe28abbe9", + "updateProtocolFeePercentageCache()": "0x9b1082c9aefd6e580ec824ce392cb617a55c74d9cf9024558dd6010fe85f0b44", + "updateSwapFeeGradually(uint256,uint256,uint256,uint256)": "0x505d9fdab989cf5bb2ac88dc2df29aa3e08bdf9ff64008ff38b52394fb430fff", + "updateWeightsGradually(uint256,uint256,address[],uint256[])": "0x476df22730bbcd2cf34500a13848383574fb02b18e6d83ea155fe8d6d58e14b1" + } + } + }, + "20210418-authorizer": { + "Authorizer": { + "useAdaptor": true, + "actionIds": { + "grantRole(bytes32,address)": "0xf62d50a5df5afc8449ee4f87c229ab86e5877a244d9ffcb824f98f500a10391e", + "grantRoles(bytes32[],address)": "0x2c43e5d2a67bff453c155e70c4f15197dd1d191c8070a350b0a507e14fe1a67f", + "grantRolesToMany(bytes32[],address[])": "0x0075e46524aa4a7327df21c5661b9775bf60a858aec549e8342228cecdb88dc9", + "renounceRole(bytes32,address)": "0xccd2805331f71a09077687e812b1f9dcfdc58f04620214cc8c055f4b47df8c1d", + "revokeRole(bytes32,address)": "0x82548eb49024443d7e580f26f7fde7b9241e334e3106c192f7cf31dc96e0d50e", + "revokeRoles(bytes32[],address)": "0xfe70bf9269c6a2c477d47975628b7a2ed8ae42fe2161255d3054bb62f8f350f2", + "revokeRolesFromMany(bytes32[],address[])": "0x0033144b33b8042bf633629e4c271cfcf8ef41fce453bbab55bbe8af50fd1f3c" + } + } + }, + "20230504-vebal-remapper": { + "OmniVotingEscrowAdaptor": { + "useAdaptor": false, + "actionIds": { + "sendUserBalance(address,uint16,address)": "0x9e0138c7503999432f96a07d16070dd82b2d2f4b83ba0d8929345aabae2bdc9d", + "setAdapterParams(bytes)": "0x166b7d39605e6c0b90d43774990cf351a53a006b3d9b686a453142de3fbea628", + "setOmniVotingEscrow(address)": "0x3ba753a2de5539879f481488cfc216f3fe3397789e5a944d17e61c3fbd569981", + "setUseZero(bool)": "0xb5b7827cc778f4b4d8a0c0f40a66b0338ec17825f6f035d25e81906b69b92c69", + "setZeroPaymentAddress(address)": "0x80a0ca6da9a96e84e5e55d5e9ba7c848aab6861998f0ae43d507d8f8835cd7b1" + } + }, + "VotingEscrowRemapper": { + "useAdaptor": false, + "actionIds": { + "clearNetworkRemapping(address,uint16)": "0x1f7187f86d9ee8e2b87edac1a3891dfd160ec1e204abc8d27b3c5a843c700659", + "setNetworkRemapping(address,address,uint16)": "0x72ef4700b259dd2ee174066e36133c7d9d455495b52ea8735aa955bba69ffee1", + "setNetworkRemappingManager(address,address)": "0xd2b0db71f202c1fe58ac19654ff20bc1979580e3bde8170f82eb11b3a1f773a0" + } + } + }, + "20230519-gauge-adder-v4": { + "GaugeAdder": { + "useAdaptor": false, + "actionIds": { + "addGauge(address,string)": "0x8953309e9807defd47d7dd7082b416598f957184ccea67f597b3697b65edbcca", + "addGaugeType(string)": "0xa639de4f3447b93bb6f4a7e0195ea7e42e5b9816bbd4bfb3e8d8e3ca917c1522", + "setGaugeFactory(address,string)": "0x7f8caf4a00b7cbdfc7ad11ff555235a685a67afdf0b96c9cb673c2eceb0eb401" + } + } + }, + "20230711-composable-stable-pool-v5": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool,uint256,address,bytes32)": "0x0c3f598dc7aa481ed45cb1777811fd5ab1839d9d61acb838d9f7345e0fd27810", + "disable()": "0x5da10df3725113f161d0a34f95f3192adf5711a72f9997042802ca4deaab8536" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0xE24Aba051aaeB07f981bD449f4B0b3250e08d4fB", + "actionIds": { + "disableRecoveryMode()": "0x5e56eeabf8d8b240c47776cdcabd5813d724add62624e9504e6f9e2b29d97d64", + "enableRecoveryMode()": "0xd468524a938c019e3151a98b97796e4be103fd97a3ce97c72e9d2d1944646b7e", + "pause()": "0xd253462a2f12666193252586ea1e77029f695cb7c6dfd30d3fdd9ef478b79dda", + "setAssetManagerPoolConfig(address,bytes)": "0x36694e5d254902fb5cabd2fcad4a8bdfb0355cbe6dcc1bbf59629c51a4dce7b1", + "setSwapFeePercentage(uint256)": "0xd23bddda33fa9d1407edb5855cf10ea390c7be853e70f212a20399a6c3920147", + "setTokenRateCacheDuration(address,uint256)": "0xbf11773e1faf5ddddd67d00182cf727a3092304f7fbc7619f8416387c8399402", + "startAmplificationParameterUpdate(uint256,uint256)": "0x9ea85fed68d52971e9cec4a1518fee8d7390fc495a433d9888f2d796c9319667", + "stopAmplificationParameterUpdate()": "0x50202409d347666142c640cd4ba725490ad98410f68f6c38ca4d5f6f4ad5cd73", + "unpause()": "0x2cfc3e8a9d2d7f1f7c2f90bde789cf8f8e7d2a057d0916fb55f5120a9e932eb5", + "updateProtocolFeePercentageCache()": "0x30ee37222d9c416e0fcf6dd37b6e0fb8d51f0108f1013758ea419909e001238e", + "updateTokenRateCache(address)": "0xa61915a6a08fd242acb4f68477be1b7f619a6038e3d3e9830f4c8e4044270542" + } + } + }, + "20230731-stakeless-gauge-checkpointer": { + "StakelessGaugeCheckpointer": { + "useAdaptor": false, + "actionIds": { + "addGauges(string,address[])": "0xfb5e569a8fded8509b8f07683a408ae649905de2b4b5a23621091145471c2537", + "addGaugesWithVerifiedType(string,address[])": "0x516e0b4b978cc577a90225512d3d6da9b9621c8bebdfb96229418f24f758eb18", + "checkpointGaugesAboveRelativeWeight(uint256)": "0x52ff9128f3c90fc493e200f0a4e0813631a9cc6644126e0cc5b1b1b9f6fcfc9c", + "checkpointGaugesOfTypeAboveRelativeWeight(string,uint256)": "0x5544730b2837275dbdc92e72bdff78b0f0ae9c1d7444ad723ea8ab02be1d2af9", + "checkpointMultipleGauges(string[],address[])": "0x16914633867733033c39f475ea86e45152bea73352660ce0cc56d068c4925b69", + "checkpointSingleGauge(string,address)": "0x53b1331ae0637068394da3bf779b66ffa030fa63396b9e4585fa759385a9e5d5", + "removeGauges(string,address[])": "0x5ffb7b84f97324ae02f37b6c4ca4558f8eb509a560ca8868087a5c64278f23d2" + } + } + }, + "20230915-stakeless-gauge-checkpointer-v2": { + "StakelessGaugeCheckpointer": { + "useAdaptor": false, + "actionIds": { + "addGauges(string,address[])": "0xc95d3ad2c3312c8ea5b8aaf0f3dde4fceb2afd5f7902c01034f81b17027b45b6", + "addGaugesWithVerifiedType(string,address[])": "0x04aa570fe83bc6077c318bf2123835160ead27dbffa8fb50c088de73cd414d03", + "checkpointAllGaugesAboveRelativeWeight(uint256)": "0x344e0f6b0d7665ce6c8684c11b7097d0bbb4e518e39eeeef0d48b9c72bfc0276", + "checkpointGaugesOfTypesAboveRelativeWeight(string[],uint256)": "0xdb96afea6e0027b68e987f10c7611eb3e236dc83d27e05efede6b80c5837fc10", + "checkpointMultipleGauges(string[],address[])": "0xb5da45177833df9e8eb9de30d50cdd0481ca473ea88789969ddb82d117bcbbda", + "checkpointMultipleGaugesOfMatchingType(string,address[])": "0xb9a1c3e3d9b75ce2d77ca777367e91fbd19117dd8ab54ac4df2341058d6ffa5a", + "checkpointSingleGauge(string,address)": "0x7f5601aaf83c543109540061beb071a2df24fbfc92447d6865a719857c26592c", + "removeGauges(string,address[])": "0x8893551f3687759577a63e3bb2353198881cc5e60fc93eb79a26f7560a927326" + } + } + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/action-ids/sepolia/expected-collisions.json b/balpy/balancer-deployments/action-ids/sepolia/expected-collisions.json new file mode 100644 index 0000000..4f53cee --- /dev/null +++ b/balpy/balancer-deployments/action-ids/sepolia/expected-collisions.json @@ -0,0 +1,142 @@ +{ + "0xa19680da38f352c62327b29ad629216e0168a977564e1ca005c02ac291f86f92": [ + { + "taskId": "20220325-gauge-controller", + "contractName": "VotingEscrow", + "signature": "checkpoint()", + "useAdaptor": true + }, + { + "taskId": "20220325-gauge-controller", + "contractName": "GaugeController", + "signature": "checkpoint()", + "useAdaptor": true + } + ], + "0x7fd83e94eb583ac22fb64de77167e03cb9adcea2673a275acd6674e4cc7cdaeb": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "batch_cancel_boosts(uint256[256])", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "batch_cancel_boosts(uint256[256])", + "useAdaptor": true + } + ], + "0x2272d0eaf618ed175e90cca68201cb3b36c1d1bb23970fd99e67ae682ac82a3a": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "batch_set_delegation_status(address,address[256],uint256[256])", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "batch_set_delegation_status(address,address[256],uint256[256])", + "useAdaptor": true + } + ], + "0xcc84253e32ef139d0876d179dab988d8f82fdc546d4b7f6858cd413ce875b3be": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "burn(uint256)", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "burn(uint256)", + "useAdaptor": true + } + ], + "0xf5837929d0afde6661b5c6939e59b9f65c8cfbc6a7fb9104b2d9b51bab0674b3": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "cancel_boost(uint256)", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "cancel_boost(uint256)", + "useAdaptor": true + } + ], + "0xfcf8fca7bf09a756a509c56e356738bcbc8eb3a7bc3889c278b7b27a1ac4b83e": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "create_boost(address,address,int256,uint256,uint256,uint256)", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "create_boost(address,address,int256,uint256,uint256,uint256)", + "useAdaptor": true + } + ], + "0xa0e8c60ed43efa645f1b1a42196b3b6b6e2579f13f5b66d05fac821891380cda": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "extend_boost(uint256,int256,uint256,uint256)", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "extend_boost(uint256,int256,uint256,uint256)", + "useAdaptor": true + } + ], + "0x7226cad1c437502bd55f74d70a4afb5dbb123bad342bcd800b7e9f81292d93ce": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "setApprovalForAll(address,bool)", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "setApprovalForAll(address,bool)", + "useAdaptor": true + } + ], + "0xfdc0d3b7bf0016c3a810d689b17792d1b67fe2ccb91c8900c1a925b1d10077d4": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "set_base_uri(string)", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "set_base_uri(string)", + "useAdaptor": true + } + ], + "0x2e186eefd30d98d5abdad30eeb474e885a9e1daf5738a75fab4f94c106d948a9": [ + { + "taskId": "20220325-ve-delegation", + "contractName": "VotingEscrowDelegation", + "signature": "set_delegation_status(address,address,bool)", + "useAdaptor": true + }, + { + "taskId": "20220530-preseeded-voting-escrow-delegation", + "contractName": "PreseededVotingEscrowDelegation", + "signature": "set_delegation_status(address,address,bool)", + "useAdaptor": true + } + ] +} \ No newline at end of file diff --git a/balpy/balancer-deployments/action-ids/zkevm/action-ids.json b/balpy/balancer-deployments/action-ids/zkevm/action-ids.json new file mode 100644 index 0000000..ed56992 --- /dev/null +++ b/balpy/balancer-deployments/action-ids/zkevm/action-ids.json @@ -0,0 +1,357 @@ +{ + "20210418-vault": { + "Vault": { + "useAdaptor": false, + "actionIds": { + "batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)": "0x1282ab709b2b70070f829c46bc36f76b32ad4989fecb2fcb09a1b3ce00bbfc30", + "deregisterTokens(bytes32,address[])": "0xe4f8ff74aa05a4d54a06e035d5e86947bc6474f8d7b166ebeb49fc9178d28551", + "exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0xc149e88b59429ded7f601ab52ecd62331cac006ae07c16543439ed138dcb8d34", + "flashLoan(address,address[],uint256[],bytes)": "0x96ebe854ca6ab6242ad127dcd7809576513b0c64571e515cedd7b8885612c82d", + "joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x78ad1b68d148c070372f8643c4648efbb63c6a8a338f3c24714868e791367653", + "managePoolBalance((uint8,bytes32,address,uint256)[])": "0x7275fb98594b03dc36a7de69051058e9e2d05cabeb4fe7d9c87bc69f94d9d084", + "manageUserBalance((uint8,address,uint256,address,address)[])": "0xeba777d811cd36c06d540d7ff2ed18ed042fd67bbf7c9afcf88c818c7ee6b498", + "queryBatchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool))": "0xf5f701b3adfba2adad8f16a8be5a989593e42a2caa84c5c6e60b22143db65a2f", + "registerPool(uint8)": "0x956dfce4343a6be4df20714d3dc413ef59e73fa9995d3d247e7c8d12efd33ac2", + "registerTokens(bytes32,address[],address[])": "0xad5bd4a1cc4243b4d772a8a55d24792c1f57cc45eb97ed1291b82d96125a7626", + "setAuthorizer(address)": "0x1cbb503dcc0f4acaedf71a098211ff8b15a220fc26a6974a8d9deaab040fa6e0", + "setPaused(bool)": "0xb5593fe09464f360ecf835d5b9319ce69900ae1b29d13844b73c250b1f5f92fb", + "setRelayerApproval(address,address,bool)": "0x0014a06d322ff07fcc02b12f93eb77bb76e28cdee4fc0670b9dec98d24bbfec8", + "swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)": "0x7b8a1d293670124924a0f532213753b89db10bde737249d4540e9a03657d1aff" + } + }, + "ProtocolFeesCollector": { + "useAdaptor": false, + "actionIds": { + "setFlashLoanFeePercentage(uint256)": "0xbe2a180d5cc5d803a8eec4cea569989fc1c593d7eeadd1f262f360a68b0e842e", + "setSwapFeePercentage(uint256)": "0xb28b769768735d011b267f781c3be90bce51d5059ba015bc7a28b3e882fb2083", + "withdrawCollectedFees(address[],uint256[],address)": "0xb2b6e48fa160a7c887d9d7a68b6a9bb9d47d4953d33e07f3a39e175d75e97796" + } + }, + "BalancerHelpers": { + "useAdaptor": true, + "actionIds": { + "queryExit(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x7f07ad84ce964c68be83d85c5e1f1deeaef9be0fff6e04313952413485f43f5c", + "queryJoin(bytes32,address,address,(address[],uint256[],bytes,bool))": "0x672fb3f0e8a340e3fb8702457aa4ca5df06547b389d1b676ac5d02a8e28e6a51" + } + } + }, + "20220517-protocol-fee-withdrawer": { + "ProtocolFeesWithdrawer": { + "useAdaptor": false, + "actionIds": { + "allowlistToken(address)": "0x25cc916136334320c6d82ecbd69a943394467276dbdf1f20b4af66c9a36bae60", + "denylistToken(address)": "0xdbc8f1f973e905b408bd874b7b2dd4ac3a8b6d6494b51da5c28de0ec4ac21791", + "withdrawCollectedFees(address[],uint256[],address)": "0xcd3768eb08cdc2de2d040f74fb351ccbef01df1d042fa8033e12f224ecc27c4d" + } + } + }, + "20220725-protocol-fee-percentages-provider": { + "ProtocolFeePercentagesProvider": { + "useAdaptor": false, + "actionIds": { + "registerFeeType(uint256,string,uint256,uint256)": "0x513273384d162134cbddebfdd19eaccc8ed68f0bfb272d86004994059f8ee5cd", + "setFeeTypePercentage(uint256,uint256)": "0xbeb10dd1f094c0751dc69e30b35c3f37cee8a9303f6e7380c83d31adcba39ea8" + } + } + }, + "20221123-pool-recovery-helper": { + "PoolRecoveryHelper": { + "useAdaptor": false, + "actionIds": { + "addPoolFactory(address)": "0x4133838a02bd2b8ed714d2c6f9b67c9edc60b2a48cdffca2fc4908545c9ea168", + "enableRecoveryMode(address)": "0xdfdbe7662360ae5df79cca0062bf6d6782893c588a127d7475f7386ccfb5e300", + "removePoolFactory(address)": "0xe54abf8b88dbe1bc275b3ffd3f7ab1b0ad3541db2664b78940b7fb9c05526bf2" + } + } + }, + "20230223-protocol-id-registry": { + "ProtocolIdRegistry": { + "useAdaptor": false, + "actionIds": { + "registerProtocolId(uint256,string)": "0xc26e21fc0aba43b199202ad3de0ba39a17c1006c1f7b3791ca2a3b9f86a4f0b9", + "renameProtocolId(uint256,string)": "0x717d11aa4cee062d5f4a3262a493c6cb8b8d7985b98d3a3fd2f80631feb89968" + } + } + }, + "20230316-l2-balancer-pseudo-minter": { + "L2BalancerPseudoMinter": { + "useAdaptor": false, + "actionIds": { + "addGaugeFactory(address)": "0x28eae42992658aefe28d2ca017a285a62376e3196f2ea3207d6e25d2dd31822d", + "mint(address)": "0xd2befe177e6e3253225004914b943520931ee96e5b0d1ac88f786a26802a10f3", + "mintFor(address,address)": "0xd0d85b5a5fe3242a38da8d45a4ecd52f3688c6d54902274aec81ff77969f1f29", + "mintMany(address[])": "0x2a50f4ec9c54564d4fe112308da7d1b4da07c8c2d34bed22395e24d7029421fa", + "mintManyFor(address[],address)": "0x747c1067722d4120f2fa6459268a4b2b90a4cadee4ab76185eced8433e4da72c", + "mint_for(address,address)": "0xee713be922d58c7cacf738f3aeb278344e56b4ef9ddad676aac7c55b522700aa", + "mint_many(address[8])": "0xfe0c17e1eb821ca09cae67037248210bc5e26c06264525f4b629a2dc4afd2554", + "removeGaugeFactory(address)": "0xacaad4083b3ef2d7b832a0342e80dd1cf818cd7c6187334641979e49fe84eed6", + "setMinterApproval(address,bool)": "0x2e7ce463e49a26dc0df87a005531fb620f5ae5f460260511c2752f91492c0b99", + "setMinterApprovalWithSignature(address,bool,address,uint256,uint8,bytes32,bytes32)": "0x608204836bbe70de3ba4810f37d885895fa4b4da207f14177ea086f1fb81301a", + "toggle_approve_mint(address)": "0x0d88c62e936c56cc12d4a647e7f2d4540996810b214126f97350fe5af4a4238b" + } + } + }, + "20230316-l2-ve-delegation-proxy": { + "VotingEscrowDelegationProxy": { + "useAdaptor": false, + "actionIds": { + "killDelegation()": "0xedccfb801ed1c13b38c94234009230c1e6a858e4c477518138cb0bfd611db5c2", + "setDelegation(address)": "0xe1a833117678417df5b0aeb8002f897e410d84f7a8f1906e355a97151a3f38a9" + } + } + }, + "20230404-l2-layer0-bridge-forwarder": { + "L2LayerZeroBridgeForwarder": { + "useAdaptor": false, + "actionIds": { + "onVeBalBridged(address)": "0x1957793a6ccaf5efd269cfbce1366e32bf91e994ebb4ef05fdfd9a85ea839741", + "onVeBalSupplyUpdate()": "0x840ed1b7b1460cc8b17b12cfa577f83baa920a208a4b118ccaf397891140dc11", + "setDelegation(address)": "0x10767a41bcb10819360753ff746241aae84129cd6703d9bab377fb9442f91571" + } + } + }, + "20211202-no-protocol-fee-lbp": { + "NoProtocolFeeLiquidityBootstrappingPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],uint256,address,bool)": "0x1fd10449f2ebec7e18b61ef6df2c49d9ea830ad4a9f53d847e19cf3809169aeb", + "disable()": "0xb4738e79f724f5cf9554215b3249de2528482bb77b93844f5eff3f3c9e7126b4" + } + }, + "NoProtocolFeeLiquidityBootstrappingPool": { + "useAdaptor": false, + "factoryOutput": "0x3c87FF3e9307dbEbfAe720E04C6439e49f79BF9B", + "actionIds": { + "setAssetManagerPoolConfig(address,bytes)": "0x37fc3bbab5157ec061d8dd11e6a3934d70807ffc1ad9c3a2463225acd9156635", + "setPaused(bool)": "0x624dd4b04f97504cad964d1dd43ecd241b6d89c1529091cfedfd80e9d6b80d99", + "setSwapEnabled(bool)": "0x9e1b0e353ad3d764d2e8b0f40b39af75cb35e14e63e753d3a4a62859ea5f9084", + "setSwapFeePercentage(uint256)": "0x9e71206909b5fab4c36eb9e667afb9a6dcc535260b4b0837056ab7f9ec68c0be", + "updateWeightsGradually(uint256,uint256,uint256[])": "0x927aa107ec7cf1bf8a315b8359a8978aa4b2a79049e36480d845075f53fa5c1e" + } + } + }, + "20230320-weighted-pool-v4": { + "WeightedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256[],address[],uint256,address,bytes32)": "0x4d7d7e878e35a8f5e9ec398466d6e7e2ab2891ce18edee0b47f7b6e8ee26a8e9", + "disable()": "0xc286c677f812387602b94d5dee672097cae543d80e175977381fbdbcdb9b2c12" + } + }, + "WeightedPool": { + "useAdaptor": false, + "factoryOutput": "0x78385153d2f356C87001F09BB5424137c618D38b", + "actionIds": { + "disableRecoveryMode()": "0xd21198f97672ee6118c9598a1b4c2053515bf28a40c4df5cf02365c4ff3d5ba7", + "enableRecoveryMode()": "0x2aa887a92d3d18f30f198214d2c197b7d148bb735c610372199c51c6a4866b86", + "pause()": "0xe67bef3cfb0ba409959647fa3d8ff78b267a1c13f5434c2f32219ced33fec922", + "setAssetManagerPoolConfig(address,bytes)": "0x0b99df5869c21b886ed768aeb050782947f66e077bafd829b617e3ceb10b2118", + "setSwapFeePercentage(uint256)": "0xdf1065695aeed28f2f774ad5c0032a5d8fb873b2c325e8204d3ec2076d913779", + "unpause()": "0xe43d68fde8cc8cb294d6ab5f297f0d8eca163f7650caee6be549c54527d5b994", + "updateProtocolFeePercentageCache()": "0x6c2d3375fd4cfa536f0e6c5aa8f1afa5d708d0865f30cad3943ff9c968de3b7d" + } + } + }, + "20230320-composable-stable-pool-v4": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool[],uint256,address,bytes32)": "0x6d27232eae89adc6d2222864bad7d9e879526c15786cd017b34c998d1d98d2fe", + "disable()": "0x8d305e761700b38cf2bc3f9e2c4ad60807e843cf2efd2415b902b1163f8f9a22" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x6f5F794A3CeF904b8517C4c311DE2FA837Ff24a0", + "actionIds": { + "disableRecoveryMode()": "0x5610aeafaa3f5c4ef9b9b45ee9c0810b2f7bd64b7b504f19d1a8a3bde062a966", + "enableRecoveryMode()": "0xb213b9fefdba263a47d6449bab5d563a39489f656d504fd24d5b9efe6fe23a61", + "pause()": "0x6c331c074092fbc25cd1032630ed25155aa5b81afa1d296bf5a0f0e9e0c6e846", + "setAssetManagerPoolConfig(address,bytes)": "0x1aa23af92476079e5f064e12e1bf7652acc3043342d68bd26521afe48c4f41e2", + "setSwapFeePercentage(uint256)": "0xcf555cc0ffe0f3255e6e21b7f9236c3c9fa8f7bbeb3c8796df9d3b5b6b630f1b", + "setTokenRateCacheDuration(address,uint256)": "0xb56db1d3fcc3ae3614e049f605dd7f4d5d9e33d63253ac144e2bcc2521e8fb7d", + "startAmplificationParameterUpdate(uint256,uint256)": "0x3005acc2387c9b240d98175714c97d50f7215ed66a79cafb014a53b74250b3a7", + "stopAmplificationParameterUpdate()": "0xc5cc9cd4aa2b8c41b752cd191bc035c569522e23523abd0cc53c6a229165589f", + "unpause()": "0x2104a90e49b9d709bbc44eee47d6280b32101abfb2f670e77162a9c703c8888b", + "updateProtocolFeePercentageCache()": "0x68b5eab37b76e1b4faeb57ff15b38149c8e1e5d34d071e74017b9d8db64fa31d", + "updateTokenRateCache(address)": "0xed8878ec7192b55c44e47c3e567c9ee3cf035e1d0f26282833c92df6a7827de9" + } + } + }, + "20230409-erc4626-linear-pool-v4": { + "ERC4626LinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x1d026cc73f77be49f729c4eedb28720fb03b85aa3067ac388e06a07ac18e6347", + "disable()": "0x5b9fa6724045ae552732087c24c3eabd3d760a41440cf37d3646a5325241b40f" + } + }, + "ERC4626LinearPool": { + "useAdaptor": false, + "factoryOutput": "0xac4b72c01072A52b73ca71105504F1372eFcCE0d", + "actionIds": { + "disableRecoveryMode()": "0x53495a1d611e770731313aca7b8a0aab991136f84be8de72c1991c51dd1565fd", + "enableRecoveryMode()": "0xecb7a0b42168ed1b4327ddb3a6fc128facd2fd4c066e2d9d5817452f5f445a4c", + "initialize()": "0xc710347392b426a58c1f9a108a05976f9ebb2ce41122d895b271e3f8de05b46a", + "pause()": "0xca88ea7c3ad439ada200e7ec242c17b97994dda6cc1d6c944b4efbea82b7e479", + "setSwapFeePercentage(uint256)": "0x4223f854b20ca267ff7b134cf89c74ad7ad53e42dcef38dd11350fa25e3d83ae", + "setTargets(uint256,uint256)": "0x30329a0bf89785c711811ca02c5e649b59ef6706cd7e707ff91290a62f22996d", + "unpause()": "0x3a1293a1a9f5f03b54982e3c4d5267b8b9ab7e66779ec01f419486193f6ac3a7" + } + } + }, + "20230410-aave-linear-pool-v5": { + "AaveLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x720962477f23a1df202e721910f2f179f9bab3c9bdca8fbaadb9756133a8e516", + "disable()": "0x7dc4d368b1715140a72ae8d3535a67a2a12cf4671cad76b40860d2d66d514303" + } + }, + "AaveLinearPool": { + "useAdaptor": false, + "factoryOutput": "0xbFD65c6160CFd638A85C645e6e6d8ACac5Dac935", + "actionIds": { + "disableRecoveryMode()": "0x03ee74ce42a97719c3b9390f8772edabd26f908b2fdb04c90147ad60f66b045c", + "enableRecoveryMode()": "0x226f4cdd3b2ef4ab0d183f2b048476bdf13ac41bc5d16b620a5c9801f07284c1", + "initialize()": "0xbabe68e5048e2fe5ab701fe79522f602ad52d73c934ab4b3be2fb970f4a98e45", + "pause()": "0xfb4212380dd0e89902957b9e27258f6ca18cb800e3669b8603b6904ac59e98dc", + "setSwapFeePercentage(uint256)": "0xb851a779bb251247ffc9b445a0fac56af908e4560fe43517739bb79e73f94ddc", + "setTargets(uint256,uint256)": "0xe3fccd861cb8896c55052a07fa6c8a620343c50e5b7971d6a5ea70a41feb7e93", + "unpause()": "0xfca19aa17a5bd4a84e0d63973e2027d256efa8ad1ca928b66abb0514bff8f3e3" + } + } + }, + "20230409-gearbox-linear-pool-v2": { + "GearboxLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x3d0363fd8dce0a46081230eef85df634f31fd3a64254d4c1c18fc9dc9ddeef0c", + "disable()": "0xca1bf022f0a4111e9e6995ddb177d334178b978208cdf454fe8b8a81eaa50b1e" + } + }, + "GearboxLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x32f03464FdF909FDf3798f87Ff3712b10c59bd86", + "actionIds": { + "disableRecoveryMode()": "0x8c130f1aa69605df50a90716d57e15a5a47dfb47d807ed838fb9e553213b920d", + "enableRecoveryMode()": "0x71485a098a59b05ec94c66ce65941514fde1427b10f7a920bef592a077d2e4f1", + "initialize()": "0x86881e3ebabadedc1e9555df67b385fd184b24088c4ec909b5a6637056f91040", + "pause()": "0xb8f99692f0cb1e9dbabcb6d9e154bf55ee4fc003eb5e75a94b3acd8c3628ec7e", + "setSwapFeePercentage(uint256)": "0xcb96c6dcd233b49f5decb6e39b3a91d415076c7d8c78ef46aad6e1823ba2dfde", + "setTargets(uint256,uint256)": "0xf037bfa1f407c134bc46cd288ab93d47b13cd73831c019707c6fed5162cf1b2d", + "unpause()": "0x60b772ea86235b35211d400b8c5ed739e3852c45ad4ff2682ca382f0e4259fe3" + } + } + }, + "20230409-yearn-linear-pool-v2": { + "YearnLinearPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address,address,uint256,uint256,address,uint256,bytes32)": "0x084a58b88b7368c12160ac6390683e79066e18341a726649be0617b2290de1eb", + "disable()": "0x54d04f96e1384dacfbc4bb06d4876678ad3ba07c255782bd693bc9df4b367e24" + } + }, + "YearnLinearPool": { + "useAdaptor": false, + "factoryOutput": "0x02c9DCB975262719A61f9B40bDf0987eAD9Add3a", + "actionIds": { + "disableRecoveryMode()": "0x75592082929dae331876cb056bc25ce93cd608544f81ba5f545ab00e3f21b3b1", + "enableRecoveryMode()": "0xe439de626f6f6121ebeb2d7f9b3ad6fdb8b2c645d3b1de4de1d2624bf95aea4b", + "initialize()": "0xbf4a71b5c6680ae41735a0fcc904a2680c559884f69007e9ff506f22e58bd206", + "pause()": "0x18d598983407d1a7c8ee21df73bf1fa9f89919b69f6a712b8521f5d82c211609", + "setSwapFeePercentage(uint256)": "0xe716f33bb1aed7ca21a3a428a38e0fec5f3ea274a3fa22d8171e5b5e849c7f03", + "setTargets(uint256,uint256)": "0xf8e0160362ea0d3bd75a137e0a65022b2a4db29686269ff6e2857f869f477f14", + "unpause()": "0xa471a387394e1dc5bee7ad4008368ea6aa1b823f9da6b59e31b6ae67eb7d91af" + } + } + }, + "20230411-managed-pool-v2": { + "ManagedPoolFactory": { + "useAdaptor": false, + "actionIds": { + "create((string,string,address[]),(address[],uint256[],uint256,bool,bool,uint256,uint256),address,bytes32)": "0xc93ab71902e1553380e3ca020d942b9cfa5076b08ceb73a4d0a88e3c0f3663a3", + "disable()": "0x7dc87d34e4d9603c093467dcbbf3a46c73c3cc593d90bd69353bfef0be8e12a4" + } + }, + "ManagedPool": { + "useAdaptor": false, + "factoryOutput": "0x522Ee506a2f63D0AE1D79D6F5Dbd9d0bCA32C866", + "actionIds": { + "addAllowedAddress(address)": "0x534cdc92e22b95219e2df782294439582e6f3c02414da4862102de98d9c0dd5f", + "addToken(address,address,uint256,uint256,address)": "0xb20dd36894dd1acd00e3976341495025c00af306d76ae11c7f9f8e4a8e944cfd", + "collectAumManagementFees()": "0x288a9f14994d85f7a873b43f295cc9620217d5dfd9667c864318869b88036d67", + "disableRecoveryMode()": "0x139157661d7306dfef54865ceffc7c5cc46a2235a2474933eba1fc5a139fa6b0", + "enableRecoveryMode()": "0x3ce3b3d8a6d2e5a3432dba62d502f9309c00298258a5c2a68371fca06e6ea0dd", + "pause()": "0xfb08e1536837d0f69d82dc0a71f05d5e9ea8b7cfb7b429091b10dd68dadb2256", + "removeAllowedAddress(address)": "0x85f750a12b50de96341c3034930f7836a7c4a1882b2bd5df11dedb6fdebfb8a9", + "removeToken(address,uint256,address)": "0x84409d18c862845e2d247a37aa674d3fa7b74e6d062360825e7dec5fddda018c", + "setCircuitBreakers(address[],uint256[],uint256[],uint256[])": "0x5727a41e82e82ae704a11a49d69873bbd4d85c305225c34df9ee3bcad166c2b0", + "setJoinExitEnabled(bool)": "0xa2b22ec5e976f1e720431179da39d8fcae0cb72c2bb1c425c1922660d57be45f", + "setManagementAumFeePercentage(uint256)": "0x01127f0ffb86b2f924bbbd0384ba4d9e37f00dfeffdfbc26dcf03254caa837b9", + "setMustAllowlistLPs(bool)": "0x5eb6fa75a1c8cfbf36696366a4a0d30b78d3b0a52344d67882b55f5cfda790a8", + "setSwapEnabled(bool)": "0x7abd9316f4fc57a8645b8dab43dd2644a2c3d0b2712da043d8c13002c80cb5bb", + "unpause()": "0x1cb3b4e4b14146a4f1e504a9e46a440311d67f0ca4cf3b0247cc05ba2b370857", + "updateProtocolFeePercentageCache()": "0x67f550662fd2d95f1903396c4b60b8d90d64071a9074265a109f515300a0bfcc", + "updateSwapFeeGradually(uint256,uint256,uint256,uint256)": "0x347ff4790ac9e05448408a9ec7b9196eda2c56dcac49e60f3ae62a4d6373ea7a", + "updateWeightsGradually(uint256,uint256,address[],uint256[])": "0xc5ff99ce5757113f760bc6e99a143316d277ffada1a3f3a26f6d5d4ad5f41014" + } + } + }, + "20230316-child-chain-gauge-factory-v2": { + "ChildChainGauge": { + "useAdaptor": true, + "actionIds": { + "add_reward(address,address)": "0xdc8b557d7b464894c525e5de06257694247b2b789b4948326752177399475439", + "claim_rewards()": "0xb6f59366d2aa97f8c51f5caa13a58d14c495bebc0eb0a0e28510abfca37a3a2e", + "claim_rewards(address)": "0x8b9eff478b7309b9a7d94d1d412efe93bdb13fb2d10aaf5720ef2e62b78255b9", + "claim_rewards(address,address)": "0x1955a1320fc9f42b0922cfbd95a80125a5405e15605221bb7fabb26b8b96400e", + "claim_rewards(address,address,uint256[])": "0xe887449415e100f9f97b96340bda8581b8ad93c71f95ba89b3fe764c225adc6e", + "claimable_tokens(address)": "0x18e453090a9493f46652183f2481aba603cdcb546380ec49b63ca94c66e4e3a4", + "deposit(uint256)": "0xf40ea6655a4d362dc07ea4bd44a45b140953914b7fb570d01571a0113ed0f16b", + "deposit(uint256,address)": "0xebb91db92ed5cab426d18c44b88b939f8edc0867dee7c6183a1748f1929cab0e", + "deposit_reward_token(address,uint256)": "0x4190fc8ffb7740e8eaa9f45bb3f1bb96644606d40c48ea1c2bacde6daa119f1f", + "initialize(address,string)": "0x9b1f40be84d6d04d2653b3e123afaa45655dbae369a8a38f48a46223f7d2f1f2", + "killGauge()": "0x9e97ccce1d835516e8fbd06e4c9f8f7746593762c8d6346a45a57f4ba03ce926", + "set_reward_distributor(address,address)": "0xa68f8859aea0e52f285bf8615e8d0b1c2421e59f342cfea2e496bb19738e86ea", + "set_rewards_receiver(address)": "0x9441a83056fd8a7562bc4257190480b77612a9df71e2ab381f9caecfa55a1232", + "unkillGauge()": "0x45e4233e809912849663a4a9242094c0741101b98b3b48d84e2f4aaa512ce1d9", + "user_checkpoint(address)": "0x49e1492ab9c1843df63e654a11e9369ecf82a1bf370798fddfdfc8a59d46b1cb", + "withdraw(uint256)": "0x4168d719ac96c4fb5e1b45bd6dba558e3f3b2125aa3d4523f2f419818453c3a4", + "withdraw(uint256,address)": "0x3b452f3ad44aec9c5e4ad80b67eb9640443374855b98c59cc625a04c6f69fe8e" + } + }, + "ChildChainGaugeFactory": { + "useAdaptor": true, + "actionIds": { + "create(address)": "0x14a2261d8bb9c0b22ebe56ba52be71de38b2c7b03e83195a6d08cf1f8c4a7f69" + } + } + }, + "20230711-composable-stable-pool-v5": { + "ComposableStablePoolFactory": { + "useAdaptor": false, + "actionIds": { + "create(string,string,address[],uint256,address[],uint256[],bool,uint256,address,bytes32)": "0xec55a48979fccaafa3f4f81d987cc5aa26dfa67ce20b1cf608c13cc65459ed2f", + "disable()": "0x0ebf042d38f8e1bb630c3010c686232d7334f90360a82eb23623fd01fbe8e656" + } + }, + "ComposableStablePool": { + "useAdaptor": false, + "factoryOutput": "0x7682e108Cd89d86303625c8478c21Ff86f401166", + "actionIds": { + "disableRecoveryMode()": "0xcfd45e344ead8485b80a5f9da66791663c8306984e9c6dc12eda2ee747cce604", + "enableRecoveryMode()": "0x6fa5acf6e6e303c2d281bf1af5f4d83642a125c5a3308cdf67e956bec276b69e", + "pause()": "0xa5d55e5978cb5ab0a8b23eed8889931ca33b54522edde10e348f4f96d35f0b35", + "setAssetManagerPoolConfig(address,bytes)": "0x1a08d4fef97815fd30114a34ff1dbaa267e682388735fb00569f31d02a4d0d9e", + "setSwapFeePercentage(uint256)": "0x04dd8b85ae9bff95ec24f18269d23bd2d04784d5f5d8b35261545b82ed754a85", + "setTokenRateCacheDuration(address,uint256)": "0x7b56c5989d833cd81dc8cdee3b496b2e2cdda79cf4d997ef95af7935fa9b95c9", + "startAmplificationParameterUpdate(uint256,uint256)": "0x1307ea331d8ab1feffafb967ddf20c66fd92ce496eda1de129a4608d4b40f313", + "stopAmplificationParameterUpdate()": "0xbd408e756684e5ea83089ee33aa05ce9410b392967bffc71c11fb394026e7a09", + "unpause()": "0x5e9c83a38e2aa43bce79848361fda74693ac9eca5e6ff6cf2ad39c86ecdfceb1", + "updateProtocolFeePercentageCache()": "0xa35ca9dc4af67afbb6992c78233d02daa500481d3cfed81539f595ce19bc505d", + "updateTokenRateCache(address)": "0x9226ad212b6e5d50f04b34634f2363e4ccbe08b7d4d3e9b8ec0733a66655af3b" + } + } + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/addresses/.supported-networks.json b/balpy/balancer-deployments/addresses/.supported-networks.json new file mode 100644 index 0000000..7f61328 --- /dev/null +++ b/balpy/balancer-deployments/addresses/.supported-networks.json @@ -0,0 +1,54 @@ +{ + "mainnet": { + "chainId": 1, + "block-explorer": "https://etherscan.io" + }, + "arbitrum": { + "chainId": 42161, + "block-explorer": "https://arbiscan.io" + }, + "avalanche": { + "chainId": 43114, + "block-explorer": "https://snowtrace.io" + }, + "bsc": { + "chainId": 56, + "block-explorer": "https://bscscan.com" + }, + "gnosis": { + "chainId": 100, + "block-explorer": "https://gnosisscan.io" + }, + "goerli": { + "chainId": 5, + "block-explorer": "https://goerli.etherscan.io" + }, + "optimism": { + "chainId": 10, + "block-explorer": "https://optimistic.etherscan.io" + }, + "polygon": { + "chainId": 137, + "block-explorer": "https://polygonscan.com" + }, + "sepolia": { + "chainId": 11155111, + "block-explorer": "https://sepolia.etherscan.io" + }, + "zkevm": { + "chainId": 1101, + "block-explorer": "https://zkevm.polygonscan.com" + }, + "base": { + "chainId": 8453, + "block-explorer": "https://basescan.org" + }, + "mode":{ + "chainId": 34443, + "block-explorer": "https://modescan.io/" + }, + "fantom": { + "chainId": 250, + "block-explorer": "https://ftmscan.com" + } +} diff --git a/balpy/balancer-deployments/addresses/arbitrum.json b/balpy/balancer-deployments/addresses/arbitrum.json new file mode 100644 index 0000000..99a699d --- /dev/null +++ b/balpy/balancer-deployments/addresses/arbitrum.json @@ -0,0 +1,731 @@ +{ + "20210418-authorizer": { + "contracts": [ + { + "name": "Authorizer", + "address": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" + } + ], + "status": "ACTIVE" + }, + "20210418-vault": { + "contracts": [ + { + "name": "Vault", + "address": "0xBA12222222228d8Ba445958a75a0704d566BF2C8" + }, + { + "name": "BalancerHelpers", + "address": "0x77d46184d22CA6a3726a2F500c776767b6A3d6Ab" + }, + { + "name": "ProtocolFeesCollector", + "address": "0xce88686553686DA562CE7Cea497CE749DA109f9F" + } + ], + "status": "ACTIVE" + }, + "20210418-weighted-pool": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0x7dFdEF5f355096603419239CE743BfaF1120312B" + }, + { + "name": "WeightedPool2TokensFactory", + "address": "0xCF0a32Bbef8F064969F21f7e02328FB577382018" + } + ], + "status": "DEPRECATED" + }, + "20210624-stable-pool": { + "contracts": [ + { + "name": "StablePoolFactory", + "address": "0x2433477A10FC5d31B9513C638F19eE85CaED53Fd" + } + ], + "status": "DEPRECATED" + }, + "20210721-liquidity-bootstrapping-pool": { + "contracts": [ + { + "name": "LiquidityBootstrappingPoolFactory", + "address": "0x142B9666a0a3A30477b052962ddA81547E7029ab" + } + ], + "status": "DEPRECATED" + }, + "20210727-meta-stable-pool": { + "contracts": [ + { + "name": "QueryProcessor", + "address": "0x6783995f91A3D7f7C24B523669488F96cCa88d31" + }, + { + "name": "MetaStablePoolFactory", + "address": "0xEBFD5681977E38Af65A7487DC70B8221D089cCAD" + } + ], + "status": "DEPRECATED" + }, + "20210907-investment-pool": { + "contracts": [ + { + "name": "InvestmentPoolFactory", + "address": "0xaCd615B3705B9c880E4E7293f1030B34e57B4c1c" + } + ], + "status": "DEPRECATED" + }, + "20210913-bal-arbitrum-merkle": { + "contracts": [ + { + "name": "MerkleRedeem", + "address": "0x6bd0B17713aaa29A2d7c9A39dDc120114f9fD809" + } + ], + "status": "DEPRECATED" + }, + "20210928-mcb-arbitrum-merkle": { + "contracts": [ + { + "name": "MerkleRedeem", + "address": "0xC6bD2497332d24094eC16a7261eec5C412B5a2C1" + } + ], + "status": "DEPRECATED" + }, + "20211012-merkle-orchard": { + "contracts": [ + { + "name": "MerkleOrchard", + "address": "0x751A0bC0e3f75b38e01Cf25bFCE7fF36DE1C87DE" + } + ], + "status": "DEPRECATED" + }, + "20211202-no-protocol-fee-lbp": { + "contracts": [ + { + "name": "NoProtocolFeeLiquidityBootstrappingPoolFactory", + "address": "0x1802953277FD955f9a254B80Aa0582f193cF1d77" + } + ], + "status": "ACTIVE" + }, + "20211203-batch-relayer": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x72D07D7DcA67b8A406aD1Ec34ce969c90bFEE768" + }, + { + "name": "BalancerRelayer", + "address": "0x466262c2a275aB106E54D95B5B04603e12b58cA1" + } + ], + "status": "DEPRECATED" + }, + "20211208-aave-linear-pool": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0xdcdbf71A870cc60C6F9B621E28a7D3Ffd6Dd4965" + } + ], + "status": "DEPRECATED" + }, + "20211208-stable-phantom-pool": { + "contracts": [ + { + "name": "StablePhantomPoolFactory", + "address": "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca" + } + ], + "status": "DEPRECATED" + }, + "20220318-batch-relayer-v2": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x1554ee754707D5C93b7934AF404747Aba521Aaf2" + }, + { + "name": "BalancerRelayer", + "address": "0x440eC9C8b78518D420E6fb6c6c838421F28BC280" + } + ], + "status": "DEPRECATED" + }, + "20220325-authorizer-adaptor": { + "contracts": [ + { + "name": "AuthorizerAdaptor", + "address": "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e" + } + ], + "status": "ACTIVE" + }, + "20220404-erc4626-linear-pool-v2": { + "contracts": [ + { + "name": "ERC4626LinearPoolFactory", + "address": "0x2794953110874981a0d301286c986992022A62a1" + } + ], + "status": "DEPRECATED" + }, + "20220413-child-chain-gauge-factory": { + "contracts": [ + { + "name": "RewardsOnlyGauge", + "address": "0x41B953164995c11C81DA73D212ED8Af25741b7Ac" + }, + { + "name": "ChildChainStreamer", + "address": "0xD7FAD3bd59D6477cbe1BE7f646F7f1BA25b230f8" + }, + { + "name": "ChildChainLiquidityGaugeFactory", + "address": "0xb08E16cFc07C684dAA2f93C70323BAdb2A6CBFd2" + } + ], + "status": "ACTIVE" + }, + "20220425-unbutton-aave-linear-pool": { + "contracts": [ + { + "name": "UnbuttonAaveLinearPoolFactory", + "address": "0x8878f1273466157a79570DdE1A42130e551B6EAd" + } + ], + "status": "DEPRECATED" + }, + "20220513-double-entrypoint-fix-relayer": { + "contracts": [ + { + "name": "DoubleEntrypointFixRelayer", + "address": "0x8E5698dC4897DC12243c8642e77B4f21349Db97C" + } + ], + "status": "ACTIVE" + }, + "20220517-protocol-fee-withdrawer": { + "contracts": [ + { + "name": "ProtocolFeesWithdrawer", + "address": "0x70Bbd023481788e443472e123AB963e5EBF58D06" + } + ], + "status": "ACTIVE" + }, + "20220527-child-chain-gauge-token-adder": { + "contracts": [ + { + "name": "ChildChainGaugeTokenAdder", + "address": "0xbfD9769b061E57e478690299011A028194D66e3C" + } + ], + "status": "ACTIVE" + }, + "20220609-stable-pool-v2": { + "contracts": [ + { + "name": "StablePoolFactory", + "address": "0xEF44D6786b2b4d544b7850Fe67CE6381626Bf2D6" + } + ], + "status": "DEPRECATED" + }, + "20220720-batch-relayer-v3": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x4f4269F7008430860693aeDB86b0C55962D6E9b7" + }, + { + "name": "BalancerRelayer", + "address": "0x42E49B48573c725ee32d2579060Ed06894f97002" + } + ], + "status": "DEPRECATED" + }, + "20220721-balancer-queries": { + "contracts": [ + { + "name": "BalancerQueries", + "address": "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5" + } + ], + "status": "ACTIVE" + }, + "20220725-protocol-fee-percentages-provider": { + "contracts": [ + { + "name": "ProtocolFeePercentagesProvider", + "address": "0x5ef4c5352882b10893b70DbcaA0C000965bd23c5" + } + ], + "status": "ACTIVE" + }, + "20220812-child-chain-reward-helper": { + "contracts": [ + { + "name": "ChildChainGaugeRewardHelper", + "address": "0xA0DAbEBAAd1b243BBb243f933013d560819eB66f" + } + ], + "status": "ACTIVE" + }, + "20220817-aave-rebalanced-linear-pool": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0xe2E901AB09f37884BA31622dF3Ca7FC19AA443Be" + } + ], + "status": "DEPRECATED" + }, + "20220906-composable-stable-pool": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0xaEb406b0E430BF5Ea2Dc0B9Fe62E4E53f74B3a33" + } + ], + "status": "DEPRECATED" + }, + "20220908-weighted-pool-v2": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0x8df6EfEc5547e31B0eb7d1291B511FF8a2bf987c" + } + ], + "status": "DEPRECATED" + }, + "20220916-batch-relayer-v4": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x967F7AdD4Fd5AF0553B7A45F225ec26EDD699E61" + }, + { + "name": "BalancerRelayer", + "address": "0x5bf3B7c14b10f16939d63Bd679264A1Aa951B4D5" + } + ], + "status": "DEPRECATED" + }, + "20221021-managed-pool": { + "contracts": [ + { + "name": "ManagedPoolAddRemoveTokenLib", + "address": "0xF24917fB88261a37Cc57F686eBC831a5c0B9fD39" + }, + { + "name": "CircuitBreakerLib", + "address": "0xE42FFA682A26EF8F25891db4882932711D42e467" + }, + { + "name": "ManagedPoolFactory", + "address": "0x956CCab09898C0AF2aCa5e6C229c3aD4E93d9288" + } + ], + "status": "DEPRECATED" + }, + "20221122-composable-stable-pool-v2": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x85a80afee867aDf27B50BdB7b76DA70f1E853062" + }, + { + "name": "MockComposableStablePool", + "address": "0x373b347bc87998b151A5E9B6bB6ca692b766648a" + } + ], + "status": "DEPRECATED" + }, + "20221123-pool-recovery-helper": { + "contracts": [ + { + "name": "PoolRecoveryHelper", + "address": "0xb5e56CC3d2e38e53b1166175C59e921A37cDC1E2" + } + ], + "status": "ACTIVE" + }, + "20221124-authorizer-adaptor-entrypoint": { + "contracts": [ + { + "name": "AuthorizerAdaptorEntrypoint", + "address": "0x97207B095e4D5C9a6e4cfbfcd2C3358E03B90c4A" + } + ], + "status": "ACTIVE" + }, + "20221207-aave-rebalanced-linear-pool-v3": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0xa2D801064652A269D92EE2A59F3261155ec66830" + }, + { + "name": "MockAaveLendingPool", + "address": "0xAB093cd16e765b5B23D34030aaFaF026558e0A19" + }, + { + "name": "MockStaticAToken", + "address": "0x16ba924752EF283C7946db8A122a6742AA35C1DC" + }, + { + "name": "MockAaveLinearPool", + "address": "0xa612B6AeD2E7ca1A3a4f23FbcA9128461bBB7718" + } + ], + "status": "DEPRECATED" + }, + "20230206-aave-rebalanced-linear-pool-v4": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0xf23b4DB826DbA14c0e857029dfF076b1c0264843" + }, + { + "name": "MockAaveLendingPool", + "address": "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6" + }, + { + "name": "MockStaticAToken", + "address": "0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88" + }, + { + "name": "MockAaveLinearPool", + "address": "0x11884dA90FB4221b3aa288a7741C51eC4Fc43B2f" + } + ], + "status": "DEPRECATED" + }, + "20230206-composable-stable-pool-v3": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x1c99324EDC771c82A0DCCB780CC7DDA0045E50e7" + }, + { + "name": "MockComposableStablePool", + "address": "0x231B05F3a92d578EFf772f2Ddf6DacFFB3609749" + } + ], + "status": "DEPRECATED" + }, + "20230206-erc4626-linear-pool-v3": { + "contracts": [ + { + "name": "ERC4626LinearPoolFactory", + "address": "0xa3B9515A9c557455BC53F7a535A85219b59e8B2E" + }, + { + "name": "MockERC4626Token", + "address": "0x62aaB12865d7281048c337D53a4dde9d770321E6" + }, + { + "name": "MockERC4626LinearPool", + "address": "0xf984eb2B8a7eF780245a797A2fCcd82f346409ca" + } + ], + "status": "DEPRECATED" + }, + "20230206-weighted-pool-v3": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0xf1665E19bc105BE4EDD3739F88315cC699cc5b65" + }, + { + "name": "MockWeightedPool", + "address": "0x96d7e549eA1d810725e4Cd1f51ed6b4AE8496338" + } + ], + "status": "DEPRECATED" + }, + "20230213-yearn-linear-pool": { + "contracts": [ + { + "name": "YearnLinearPoolFactory", + "address": "0xD8B6b96c88ad626EB6209c4876e3B14f45f8803A" + }, + { + "name": "MockYearnTokenVault", + "address": "0x1b986138a4F2aA538E79fdEC222dad93F8d66703" + }, + { + "name": "MockYearnLinearPool", + "address": "0x81fC12C60ee5b753cf5fD0ADC342dFb5f3817E32" + } + ], + "status": "DEPRECATED" + }, + "20230222-merkle-orchard-v2": { + "contracts": [ + { + "name": "MerkleOrchard", + "address": "0x9805dcfD25e6De36bad8fe9D3Fe2c9b44B764102" + } + ], + "status": "ACTIVE" + }, + "20230223-protocol-id-registry": { + "contracts": [ + { + "name": "ProtocolIdRegistry", + "address": "0x5cF4928a3205728bd12830E1840F7DB85c62a4B9" + } + ], + "status": "ACTIVE" + }, + "20230314-batch-relayer-v5": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0xD87F44Df0159DC78029AB9CA7D7e57E7249F5ACD" + }, + { + "name": "BalancerRelayer", + "address": "0x598ce0f1ab64B27256759ef99d883EE51138b9bd" + } + ], + "status": "ACTIVE" + }, + "20230316-child-chain-gauge-factory-v2": { + "contracts": [ + { + "name": "ChildChainGauge", + "address": "0xa523f47A933D5020b23629dDf689695AA94612Dc" + }, + { + "name": "ChildChainGaugeFactory", + "address": "0x6817149cb753BF529565B4D023d7507eD2ff4Bc0" + } + ], + "status": "ACTIVE" + }, + "20230316-l2-balancer-pseudo-minter": { + "contracts": [ + { + "name": "L2BalancerPseudoMinter", + "address": "0xc3ccacE87f6d3A81724075ADcb5ddd85a8A1bB68" + } + ], + "status": "ACTIVE" + }, + "20230316-l2-ve-delegation-proxy": { + "contracts": [ + { + "name": "NullVotingEscrow", + "address": "0x9dA18982a33FD0c7051B19F0d7C76F2d5E7e017c" + }, + { + "name": "VotingEscrowDelegationProxy", + "address": "0x81cFAE226343B24BA12EC6521Db2C79E7aeeb310" + } + ], + "status": "ACTIVE" + }, + "20230320-composable-stable-pool-v4": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x2498A2B0d6462d2260EAC50aE1C3e03F4829BA95" + }, + { + "name": "MockComposableStablePool", + "address": "0xFF7e6B102516e071dcDA763EE9D02c1515481db5" + } + ], + "status": "DEPRECATED" + }, + "20230320-weighted-pool-v4": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0xc7E5ED1054A24Ef31D827E6F86caA58B3Bc168d7" + }, + { + "name": "MockWeightedPool", + "address": "0x129C6402FF88611Aa59BF2e14B39e091822e2C9c" + } + ], + "status": "ACTIVE" + }, + "20230404-l2-layer0-bridge-forwarder": { + "contracts": [ + { + "name": "L2LayerZeroBridgeForwarder", + "address": "0x12Ca9De662A7Bf5Dc89e034a5083eF751B08EDe7" + } + ], + "status": "ACTIVE" + }, + "20230409-erc4626-linear-pool-v4": { + "contracts": [ + { + "name": "ERC4626LinearPoolFactory", + "address": "0x7ADbdabaA80F654568421887c12F09E0C7BD9629" + }, + { + "name": "MockERC4626Token", + "address": "0x4bE0E4d6184348c5BA845a4010528CFC779610b8" + }, + { + "name": "MockERC4626LinearPool", + "address": "0x3f53A862919ccFA023CB6AcE91378a79Fb0F6Bf5" + } + ], + "status": "ACTIVE" + }, + "20230409-yearn-linear-pool-v2": { + "contracts": [ + { + "name": "YearnLinearPoolFactory", + "address": "0x19DFEF0a828EEC0c85FbB335aa65437417390b85" + }, + { + "name": "MockYearnTokenVault", + "address": "0xb15608d28eb43378A7e7780aDD3fE9bC132bAf40" + }, + { + "name": "MockYearnLinearPool", + "address": "0x1Fa7F727934226aedaB636D62a084931b97d366b" + } + ], + "status": "ACTIVE" + }, + "20230410-aave-linear-pool-v5": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0x7396f99B48e7436b152427bfA3DD6Aa8C7C6d05B" + }, + { + "name": "MockAaveLendingPool", + "address": "0x533a16F90E7d3Ca31dbc608E5EC54967710F0D2A" + }, + { + "name": "MockStaticAToken", + "address": "0x8b7854708c0C54f9D7d1FF351D4F84E6dE0E134C" + }, + { + "name": "MockAaveLinearPool", + "address": "0x19b1C92631405A0a9495ccbA0BeCF4f2e8e908bD" + } + ], + "status": "ACTIVE" + }, + "20230411-managed-pool-v2": { + "contracts": [ + { + "name": "ManagedPoolAddRemoveTokenLib", + "address": "0xA69E0Ccf150a29369D8Bbc0B3f510849dB7E8EEE" + }, + { + "name": "CircuitBreakerLib", + "address": "0xDF9B5B00Ef9bca66e9902Bd813dB14e4343Be025" + }, + { + "name": "ManagedPoolAmmLib", + "address": "0x300Ab2038EAc391f26D9F895dc61F8F66a548833" + }, + { + "name": "ExternalWeightedMath", + "address": "0x03F3Fb107e74F2EAC9358862E91ad3c692712054" + }, + { + "name": "RecoveryModeHelper", + "address": "0x682f0dDBFd41D1272982f64a499Fb62d80e27589" + }, + { + "name": "ManagedPoolFactory", + "address": "0x8eA89804145c007e7D226001A96955ad53836087" + }, + { + "name": "MockManagedPool", + "address": "0xf5A71257B331C02dA1Eae52151C3d600f16B76F0" + } + ], + "status": "ACTIVE" + }, + "20230414-authorizer-wrapper": { + "contracts": [ + { + "name": "AuthorizerWithAdaptorValidation", + "address": "0x6B1Da720Be2D11d95177ccFc40A917c2688f396c" + } + ], + "status": "ACTIVE" + }, + "20230525-l2-veboost-v2": { + "contracts": [ + { + "name": "VeBoostV2", + "address": "0x6B5dA774890Db7B7b96C6f44e6a4b0F657399E2e" + } + ], + "status": "ACTIVE" + }, + "20230526-gauge-working-balance-helper": { + "contracts": [ + { + "name": "GaugeWorkingBalanceHelper", + "address": "0xEa924b45a3fcDAAdf4E5cFB1665823B8F8F2039B" + } + ], + "status": "ACTIVE" + }, + "20230613-balancer-pool-data-queries": { + "contracts": [ + { + "name": "BalancerPoolDataQueries", + "address": "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089" + } + ], + "status": "ACTIVE" + }, + "20230711-composable-stable-pool-v5": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0xA8920455934Da4D853faac1f94Fe7bEf72943eF1" + }, + { + "name": "MockComposableStablePool", + "address": "0xd60020Ec34Ccf9A4385f917DE8F6956B77853ABF" + } + ], + "status": "ACTIVE" + }, + "20230712-child-chain-gauge-checkpointer": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x96484f2aBF5e58b15176dbF1A799627B53F13B6d" + }, + { + "name": "BalancerRelayer", + "address": "0xFE1862BdCAf17ADf2D83eEb0Da98dAE04492F4f7" + } + ], + "status": "ACTIVE" + }, + "20230717-chainlink-rate-provider-factory": { + "contracts": [ + { + "name": "ChainlinkRateProviderFactory", + "address": "0x5DbAd78818D4c8958EfF2d5b95b28385A22113Cd" + } + ], + "status": "ACTIVE" + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/addresses/avalanche.json b/balpy/balancer-deployments/addresses/avalanche.json new file mode 100644 index 0000000..8e42147 --- /dev/null +++ b/balpy/balancer-deployments/addresses/avalanche.json @@ -0,0 +1,382 @@ +{ + "20210418-authorizer": { + "contracts": [ + { + "name": "Authorizer", + "address": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" + } + ], + "status": "ACTIVE" + }, + "20210418-vault": { + "contracts": [ + { + "name": "Vault", + "address": "0xBA12222222228d8Ba445958a75a0704d566BF2C8" + }, + { + "name": "ProtocolFeesCollector", + "address": "0xce88686553686DA562CE7Cea497CE749DA109f9F" + }, + { + "name": "BalancerHelpers", + "address": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9" + } + ], + "status": "ACTIVE" + }, + "20211202-no-protocol-fee-lbp": { + "contracts": [ + { + "name": "NoProtocolFeeLiquidityBootstrappingPoolFactory", + "address": "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e" + } + ], + "status": "ACTIVE" + }, + "20220325-authorizer-adaptor": { + "contracts": [ + { + "name": "AuthorizerAdaptor", + "address": "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca" + } + ], + "status": "ACTIVE" + }, + "20220517-protocol-fee-withdrawer": { + "contracts": [ + { + "name": "ProtocolFeesWithdrawer", + "address": "0x8F42aDBbA1B16EaAE3BB5754915E0D06059aDd75" + } + ], + "status": "ACTIVE" + }, + "20220707-distribution-scheduler": { + "contracts": [ + { + "name": "DistributionScheduler", + "address": "0xC128a9954e6c874eA3d62ce62B468bA073093F25" + } + ], + "status": "ACTIVE" + }, + "20220721-balancer-queries": { + "contracts": [ + { + "name": "BalancerQueries", + "address": "0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD" + } + ], + "status": "ACTIVE" + }, + "20220725-protocol-fee-percentages-provider": { + "contracts": [ + { + "name": "ProtocolFeePercentagesProvider", + "address": "0x239e55F427D44C3cc793f49bFB507ebe76638a2b" + } + ], + "status": "ACTIVE" + }, + "20220812-child-chain-reward-helper": { + "contracts": [ + { + "name": "ChildChainGaugeRewardHelper", + "address": "0x2E96068b3D5B5BAE3D7515da4A1D2E52d08A2647" + } + ], + "status": "ACTIVE" + }, + "20220916-batch-relayer-v4": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x6f5a2eE11E7a772AeB5114A20d0D7c0ff61EB8A0" + }, + { + "name": "BalancerRelayer", + "address": "0x9A7b723101ba5A4672960A3b65840AB3b7805048" + } + ], + "status": "DEPRECATED" + }, + "20221123-pool-recovery-helper": { + "contracts": [ + { + "name": "PoolRecoveryHelper", + "address": "0x3b8cA519122CdD8efb272b0D3085453404B25bD0" + } + ], + "status": "ACTIVE" + }, + "20221124-authorizer-adaptor-entrypoint": { + "contracts": [ + { + "name": "AuthorizerAdaptorEntrypoint", + "address": "0x4E7bBd911cf1EFa442BC1b2e9Ea01ffE785412EC" + } + ], + "status": "ACTIVE" + }, + "20230206-weighted-pool-v3": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0x94f68b54191F62f781Fe8298A8A5Fa3ed772d227" + }, + { + "name": "MockWeightedPool", + "address": "0xE867AD0a48e8f815DC0cda2CDb275e0F163A480b" + } + ], + "status": "DEPRECATED" + }, + "20230314-batch-relayer-v5": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B" + }, + { + "name": "BalancerRelayer", + "address": "0x03F1ab8b19bcE21EB06C364aEc9e40322572a1e9" + } + ], + "status": "ACTIVE" + }, + "20230316-avax-child-chain-gauge-factory-v2": { + "contracts": [ + { + "name": "ChildChainGauge", + "address": "0x4b7b369989e613ff2C65768B7Cf930cC927F901E" + }, + { + "name": "ChildChainGaugeFactory", + "address": "0x161f4014C27773840ccb4EC1957113e6DD028846" + } + ], + "status": "DEPRECATED" + }, + "20230316-avax-l2-balancer-pseudo-minter": { + "contracts": [ + { + "name": "L2BalancerPseudoMinter", + "address": "0xEa924b45a3fcDAAdf4E5cFB1665823B8F8F2039B" + } + ], + "status": "DEPRECATED" + }, + "20230316-child-chain-gauge-factory-v2": { + "contracts": [ + { + "name": "ChildChainGauge", + "address": "0x4132f7AcC9dB7A6cF7BE2Dd3A9DC8b30C7E6E6c8" + }, + { + "name": "ChildChainGaugeFactory", + "address": "0xf23b4DB826DbA14c0e857029dfF076b1c0264843" + } + ], + "status": "ACTIVE" + }, + "20230316-l2-balancer-pseudo-minter": { + "contracts": [ + { + "name": "L2BalancerPseudoMinter", + "address": "0x85a80afee867aDf27B50BdB7b76DA70f1E853062" + } + ], + "status": "ACTIVE" + }, + "20230316-l2-ve-delegation-proxy": { + "contracts": [ + { + "name": "NullVotingEscrow", + "address": "0x6B1Da720Be2D11d95177ccFc40A917c2688f396c" + }, + { + "name": "VotingEscrowDelegationProxy", + "address": "0x0c6052254551EAe3ECac77B01DFcf1025418828f" + } + ], + "status": "ACTIVE" + }, + "20230320-composable-stable-pool-v4": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x3B1eb8EB7b43882b385aB30533D9A2BeF9052a98" + }, + { + "name": "MockComposableStablePool", + "address": "0xEa4643102dFC03d5e382e7827Bf767f6587E9965" + } + ], + "status": "DEPRECATED" + }, + "20230320-weighted-pool-v4": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a" + }, + { + "name": "MockWeightedPool", + "address": "0xb2b5B452d53401391155EA48C4451f6E9b0dD058" + } + ], + "status": "ACTIVE" + }, + "20230404-l2-layer0-bridge-forwarder": { + "contracts": [ + { + "name": "L2LayerZeroBridgeForwarder", + "address": "0x4638ab64022927C9bD5947607459D13f57f1551C" + } + ], + "status": "ACTIVE" + }, + "20230409-erc4626-linear-pool-v4": { + "contracts": [ + { + "name": "ERC4626LinearPoolFactory", + "address": "0x4507d91Cd2C0D51D9B4F30Bf0B93AFC938A70BA5" + }, + { + "name": "MockERC4626Token", + "address": "0x2EbE41E1aa44D61c206A94474932dADC7D3FD9E3" + }, + { + "name": "MockERC4626LinearPool", + "address": "0xEd3E2F496cbCd8e212192fb8D1499842f04A0D19" + } + ], + "status": "ACTIVE" + }, + "20230410-aave-linear-pool-v5": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0x6caf662b573F577DE01165d2d38D1910bba41F8A" + }, + { + "name": "MockAaveLendingPool", + "address": "0x57EA28A99394978D060E483477C0Fd9fb9aFa96c" + }, + { + "name": "MockStaticAToken", + "address": "0xD8B6b96c88ad626EB6209c4876e3B14f45f8803A" + }, + { + "name": "MockAaveLinearPool", + "address": "0xA826a114B0c7dB4d1FF4a4BE845a78998c64564C" + } + ], + "status": "ACTIVE" + }, + "20230411-managed-pool-v2": { + "contracts": [ + { + "name": "ManagedPoolAddRemoveTokenLib", + "address": "0xAcf05BE5134d64d150d153818F8C67EE36996650" + }, + { + "name": "CircuitBreakerLib", + "address": "0x9129E834e15eA19b6069e8f08a8EcFc13686B8dC" + }, + { + "name": "ManagedPoolAmmLib", + "address": "0xA69E0Ccf150a29369D8Bbc0B3f510849dB7E8EEE" + }, + { + "name": "ExternalWeightedMath", + "address": "0xDF9B5B00Ef9bca66e9902Bd813dB14e4343Be025" + }, + { + "name": "RecoveryModeHelper", + "address": "0x300Ab2038EAc391f26D9F895dc61F8F66a548833" + }, + { + "name": "ManagedPoolFactory", + "address": "0x03F3Fb107e74F2EAC9358862E91ad3c692712054" + }, + { + "name": "MockManagedPool", + "address": "0x3Fb81f6FB0dd94c6fC7e138887f1CA4CDB5E2999" + } + ], + "status": "ACTIVE" + }, + "20230414-authorizer-wrapper": { + "contracts": [ + { + "name": "AuthorizerWithAdaptorValidation", + "address": "0x8df317a729fcaA260306d7de28888932cb579b88" + } + ], + "status": "ACTIVE" + }, + "20230525-l2-veboost-v2": { + "contracts": [ + { + "name": "VeBoostV2", + "address": "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5" + } + ], + "status": "ACTIVE" + }, + "20230526-gauge-working-balance-helper": { + "contracts": [ + { + "name": "GaugeWorkingBalanceHelper", + "address": "0x687b8C9b41E01Be8B591725fac5d5f52D0564d79" + } + ], + "status": "ACTIVE" + }, + "20230613-balancer-pool-data-queries": { + "contracts": [ + { + "name": "BalancerPoolDataQueries", + "address": "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089" + } + ], + "status": "ACTIVE" + }, + "20230711-composable-stable-pool-v5": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0xE42FFA682A26EF8F25891db4882932711D42e467" + }, + { + "name": "MockComposableStablePool", + "address": "0x9FD66B741ac546055E04E768Dd52edD33574D453" + } + ], + "status": "ACTIVE" + }, + "20230712-child-chain-gauge-checkpointer": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x36caC20dd805d128c1a6Dd16eeA845C574b5A17C" + }, + { + "name": "BalancerRelayer", + "address": "0xE63e90EeC6860a0Bc163BB26f7333cbE55559fb5" + } + ], + "status": "ACTIVE" + }, + "20230717-chainlink-rate-provider-factory": { + "contracts": [ + { + "name": "ChainlinkRateProviderFactory", + "address": "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6" + } + ], + "status": "ACTIVE" + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/addresses/base.json b/balpy/balancer-deployments/addresses/base.json new file mode 100644 index 0000000..36cfd03 --- /dev/null +++ b/balpy/balancer-deployments/addresses/base.json @@ -0,0 +1,363 @@ +{ + "20210418-authorizer": { + "contracts": [ + { + "name": "Authorizer", + "address": "0x809B79b53F18E9bc08A961ED4678B901aC93213a" + } + ], + "status": "ACTIVE" + }, + "20210418-vault": { + "contracts": [ + { + "name": "Vault", + "address": "0xBA12222222228d8Ba445958a75a0704d566BF2C8" + }, + { + "name": "ProtocolFeesCollector", + "address": "0xce88686553686DA562CE7Cea497CE749DA109f9F" + }, + { + "name": "BalancerHelpers", + "address": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9" + } + ], + "status": "ACTIVE" + }, + "20211202-no-protocol-fee-lbp": { + "contracts": [ + { + "name": "NoProtocolFeeLiquidityBootstrappingPoolFactory", + "address": "0x0c6052254551EAe3ECac77B01DFcf1025418828f" + }, + { + "name": "MockLiquidityBootstrappingPool", + "address": "0x71528afe250438e184b2deAF7947f0f45931DF3b" + } + ], + "status": "ACTIVE" + }, + "20220325-authorizer-adaptor": { + "contracts": [ + { + "name": "AuthorizerAdaptor", + "address": "0x6CaD2ea22BFA7F4C14Aae92E47F510Cd5C509bc7" + } + ], + "status": "ACTIVE" + }, + "20220325-test-balancer-token": { + "contracts": [ + { + "name": "TestBalancerToken", + "address": "0xA1Fa945425eD2e08Acb932E000bCc2f21B21588A" + } + ], + "status": "ACTIVE" + }, + "20220517-protocol-fee-withdrawer": { + "contracts": [ + { + "name": "ProtocolFeesWithdrawer", + "address": "0xAcf05BE5134d64d150d153818F8C67EE36996650" + } + ], + "status": "ACTIVE" + }, + "20220721-balancer-queries": { + "contracts": [ + { + "name": "BalancerQueries", + "address": "0x300Ab2038EAc391f26D9F895dc61F8F66a548833" + } + ], + "status": "ACTIVE" + }, + "20220725-protocol-fee-percentages-provider": { + "contracts": [ + { + "name": "ProtocolFeePercentagesProvider", + "address": "0xDEd7Fef7D8eCdcB74F22f0169e1A9EC696e6695d" + } + ], + "status": "ACTIVE" + }, + "20221123-pool-recovery-helper": { + "contracts": [ + { + "name": "PoolRecoveryHelper", + "address": "0x03F3Fb107e74F2EAC9358862E91ad3c692712054" + } + ], + "status": "ACTIVE" + }, + "20221124-authorizer-adaptor-entrypoint": { + "contracts": [ + { + "name": "AuthorizerAdaptorEntrypoint", + "address": "0x9129E834e15eA19b6069e8f08a8EcFc13686B8dC" + } + ], + "status": "ACTIVE" + }, + "20230223-protocol-id-registry": { + "contracts": [ + { + "name": "ProtocolIdRegistry", + "address": "0x682f0dDBFd41D1272982f64a499Fb62d80e27589" + } + ], + "status": "ACTIVE" + }, + "20230314-batch-relayer-v5": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0xDF9B5B00Ef9bca66e9902Bd813dB14e4343Be025" + }, + { + "name": "BalancerRelayer", + "address": "0x76f7204B62f554b79d444588EDac9dfA7032c71a" + } + ], + "status": "ACTIVE" + }, + "20230316-child-chain-gauge-factory-v2": { + "contracts": [ + { + "name": "ChildChainGauge", + "address": "0x9f7E65887413a8497b87bA2058cE6E4Ef4B37013" + }, + { + "name": "ChildChainGaugeFactory", + "address": "0xb1a4FE1C6d25a0DDAb47431A92A723dd71d9021f" + } + ], + "status": "ACTIVE" + }, + "20230316-l2-balancer-pseudo-minter": { + "contracts": [ + { + "name": "L2BalancerPseudoMinter", + "address": "0x0c5538098EBe88175078972F514C9e101D325D4F" + } + ], + "status": "ACTIVE" + }, + "20230316-l2-ve-delegation-proxy": { + "contracts": [ + { + "name": "NullVotingEscrow", + "address": "0x475D18169BE8a89357A9ee3Ab00ca386d20fA229" + }, + { + "name": "VotingEscrowDelegationProxy", + "address": "0xD87F44Df0159DC78029AB9CA7D7e57E7249F5ACD" + } + ], + "status": "ACTIVE" + }, + "20230320-weighted-pool-v4": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0x4C32a8a8fDa4E24139B51b456B42290f51d6A1c4" + }, + { + "name": "MockWeightedPool", + "address": "0xd9dbbfAA703f3C33838365aE00fE4EB22CdF8d46" + } + ], + "status": "ACTIVE" + }, + "20230404-l2-layer0-bridge-forwarder": { + "contracts": [ + { + "name": "L2LayerZeroBridgeForwarder", + "address": "0x8eA89804145c007e7D226001A96955ad53836087" + } + ], + "status": "ACTIVE" + }, + "20230409-erc4626-linear-pool-v4": { + "contracts": [ + { + "name": "ERC4626LinearPoolFactory", + "address": "0x161f4014C27773840ccb4EC1957113e6DD028846" + }, + { + "name": "MockERC4626Token", + "address": "0x4638ab64022927C9bD5947607459D13f57f1551C" + }, + { + "name": "MockERC4626LinearPool", + "address": "0x1CC2E10C486Ffb7228810B9c7C183d0CD92cdF44" + } + ], + "status": "ACTIVE" + }, + "20230409-gearbox-linear-pool-v2": { + "contracts": [ + { + "name": "GearboxLinearPoolFactory", + "address": "0x9Dd32684176638D977883448A4c914311c07bd62" + }, + { + "name": "MockGearboxVault", + "address": "0x79e435875cCee3Cd9e8da23fE34F9A011d05EA6C" + }, + { + "name": "MockGearboxDieselToken", + "address": "0xb521dD5C8e13fE202626CaC98873FEA2b7760cE4" + }, + { + "name": "MockGearboxLinearPool", + "address": "0x3c28a59356B473847AAa5e0b6F561636079213A6" + } + ], + "status": "ACTIVE" + }, + "20230409-yearn-linear-pool-v2": { + "contracts": [ + { + "name": "YearnLinearPoolFactory", + "address": "0x44d33798dddCdAbc93Fe6a40C80588033Dc502d3" + }, + { + "name": "MockYearnTokenVault", + "address": "0xDBf7B9F1d2Bfba14e42709f84dda3187eE410e38" + }, + { + "name": "MockYearnLinearPool", + "address": "0x369877467FC3B6774DE4E11E0c0AbBdE70Eb40FD" + } + ], + "status": "ACTIVE" + }, + "20230410-aave-linear-pool-v5": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0x687b8C9b41E01Be8B591725fac5d5f52D0564d79" + }, + { + "name": "MockAaveLendingPool", + "address": "0x88ED12A90142fDBFe2a28f7d5b48927254C7e760" + }, + { + "name": "MockStaticAToken", + "address": "0x698CaED853bE9cEA96C268f565e2b61D3b2BcDA4" + }, + { + "name": "MockAaveLinearPool", + "address": "0x712e23a9B91Aa30EE7997d1c7a1a285d4C7912D1" + } + ], + "status": "ACTIVE" + }, + "20230411-managed-pool-v2": { + "contracts": [ + { + "name": "ManagedPoolAddRemoveTokenLib", + "address": "0xb19382073c7A0aDdbb56Ac6AF1808Fa49e377B75" + }, + { + "name": "CircuitBreakerLib", + "address": "0xEF454a7B3f965D3f6723E462405246f8Cd865425" + }, + { + "name": "ManagedPoolAmmLib", + "address": "0x7d2248F194755DCa9A1887099394F39476d28C9a" + }, + { + "name": "ExternalWeightedMath", + "address": "0x7920BFa1b2041911b354747CA7A6cDD2dfC50Cfd" + }, + { + "name": "RecoveryModeHelper", + "address": "0x313a8D36b1d90a4cba3A505fDc3480C3870bE053" + }, + { + "name": "ManagedPoolFactory", + "address": "0x9a62C91626d39D0216b3959112f9D4678E20134d" + }, + { + "name": "MockManagedPool", + "address": "0xE50AD96Af9370D05D3C1cE85F17C31557B29C4Ee" + } + ], + "status": "ACTIVE" + }, + "20230414-authorizer-wrapper": { + "contracts": [ + { + "name": "AuthorizerWithAdaptorValidation", + "address": "0xA69E0Ccf150a29369D8Bbc0B3f510849dB7E8EEE" + } + ], + "status": "ACTIVE" + }, + "20230525-l2-veboost-v2": { + "contracts": [ + { + "name": "VeBoostV2", + "address": "0xE42FFA682A26EF8F25891db4882932711D42e467" + } + ], + "status": "ACTIVE" + }, + "20230526-gauge-working-balance-helper": { + "contracts": [ + { + "name": "GaugeWorkingBalanceHelper", + "address": "0xa7d524046ef89de9F8e4f2d7B029f66cCB738d48" + } + ], + "status": "ACTIVE" + }, + "20230613-balancer-pool-data-queries": { + "contracts": [ + { + "name": "BalancerPoolDataQueries", + "address": "0x6B1Da720Be2D11d95177ccFc40A917c2688f396c" + } + ], + "status": "ACTIVE" + }, + "20230711-composable-stable-pool-v5": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x8df317a729fcaA260306d7de28888932cb579b88" + }, + { + "name": "MockComposableStablePool", + "address": "0x7F6E9d6a4093Af9d09bAE92d24bfE42Fc5369aE6" + } + ], + "status": "ACTIVE" + }, + "20230712-child-chain-gauge-checkpointer": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0xaf779e58dafb4307b998C7b3C9D3f788DFc80632" + }, + { + "name": "BalancerRelayer", + "address": "0x7B25d5712fB49627534012327E46455b3fF7b26C" + } + ], + "status": "ACTIVE" + }, + "20230717-chainlink-rate-provider-factory": { + "contracts": [ + { + "name": "ChainlinkRateProviderFactory", + "address": "0x0A973B6DB16C2ded41dC91691Cc347BEb0e2442B" + } + ], + "status": "ACTIVE" + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/addresses/bsc.json b/balpy/balancer-deployments/addresses/bsc.json new file mode 100644 index 0000000..2ff9265 --- /dev/null +++ b/balpy/balancer-deployments/addresses/bsc.json @@ -0,0 +1,367 @@ +{ + "20210418-authorizer": { + "contracts": [ + { + "name": "Authorizer", + "address": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" + } + ], + "status": "ACTIVE" + }, + "20210418-vault": { + "contracts": [ + { + "name": "Vault", + "address": "0xBA12222222228d8Ba445958a75a0704d566BF2C8" + }, + { + "name": "ProtocolFeesCollector", + "address": "0xce88686553686DA562CE7Cea497CE749DA109f9F" + }, + { + "name": "BalancerHelpers", + "address": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9" + } + ], + "status": "ACTIVE" + }, + "20211202-no-protocol-fee-lbp": { + "contracts": [ + { + "name": "NoProtocolFeeLiquidityBootstrappingPoolFactory", + "address": "0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD" + } + ], + "status": "ACTIVE" + }, + "20220325-authorizer-adaptor": { + "contracts": [ + { + "name": "AuthorizerAdaptor", + "address": "0x41B953164995c11C81DA73D212ED8Af25741b7Ac" + } + ], + "status": "ACTIVE" + }, + "20220517-protocol-fee-withdrawer": { + "contracts": [ + { + "name": "ProtocolFeesWithdrawer", + "address": "0xD7FAD3bd59D6477cbe1BE7f646F7f1BA25b230f8" + } + ], + "status": "ACTIVE" + }, + "20220721-balancer-queries": { + "contracts": [ + { + "name": "BalancerQueries", + "address": "0x239e55F427D44C3cc793f49bFB507ebe76638a2b" + } + ], + "status": "ACTIVE" + }, + "20220725-protocol-fee-percentages-provider": { + "contracts": [ + { + "name": "ProtocolFeePercentagesProvider", + "address": "0xb08E16cFc07C684dAA2f93C70323BAdb2A6CBFd2" + } + ], + "status": "ACTIVE" + }, + "20220817-aave-rebalanced-linear-pool": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0x2E96068b3D5B5BAE3D7515da4A1D2E52d08A2647" + } + ], + "status": "DEPRECATED" + }, + "20220906-composable-stable-pool": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0xf302f9F50958c5593770FDf4d4812309fF77414f" + } + ], + "status": "DEPRECATED" + }, + "20220908-weighted-pool-v2": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0xC128a9954e6c874eA3d62ce62B468bA073093F25" + } + ], + "status": "DEPRECATED" + }, + "20220916-batch-relayer-v4": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x8F42aDBbA1B16EaAE3BB5754915E0D06059aDd75" + }, + { + "name": "BalancerRelayer", + "address": "0x4574ccBcC09A00C9eE55fB92Fe353699A4fA800e" + } + ], + "status": "DEPRECATED" + }, + "20221122-composable-stable-pool-v2": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x85a80afee867aDf27B50BdB7b76DA70f1E853062" + }, + { + "name": "MockComposableStablePool", + "address": "0x373b347bc87998b151A5E9B6bB6ca692b766648a" + } + ], + "status": "DEPRECATED" + }, + "20221123-pool-recovery-helper": { + "contracts": [ + { + "name": "PoolRecoveryHelper", + "address": "0x3b8cA519122CdD8efb272b0D3085453404B25bD0" + } + ], + "status": "ACTIVE" + }, + "20221124-authorizer-adaptor-entrypoint": { + "contracts": [ + { + "name": "AuthorizerAdaptorEntrypoint", + "address": "0xeb151668006CD04DAdD098AFd0a82e78F77076c3" + } + ], + "status": "ACTIVE" + }, + "20221207-aave-rebalanced-linear-pool-v3": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0x1cbbE6cEa5E4fE7D69c586b4e362A646DEEf105d" + }, + { + "name": "MockAaveLendingPool", + "address": "0x4C4287b07d293E361281bCeEe8715c8CDeB64E34" + }, + { + "name": "MockStaticAToken", + "address": "0x6d471c05f8A99Bd8f991467A8283e3DC968b8D7c" + }, + { + "name": "MockAaveLinearPool", + "address": "0x1a505Ba1cA84D1A4dCF14c8E4866e556B060c974" + } + ], + "status": "DEPRECATED" + }, + "20230206-aave-rebalanced-linear-pool-v4": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0xf23b4DB826DbA14c0e857029dfF076b1c0264843" + }, + { + "name": "MockAaveLendingPool", + "address": "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6" + }, + { + "name": "MockStaticAToken", + "address": "0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88" + }, + { + "name": "MockAaveLinearPool", + "address": "0x11884dA90FB4221b3aa288a7741C51eC4Fc43B2f" + } + ], + "status": "DEPRECATED" + }, + "20230206-composable-stable-pool-v3": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0xacAaC3e6D6Df918Bf3c809DFC7d42de0e4a72d4C" + }, + { + "name": "MockComposableStablePool", + "address": "0xB521E108c8aC5aD91Dc16d0001b7253D3B3beBC5" + } + ], + "status": "DEPRECATED" + }, + "20230206-weighted-pool-v3": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0x6e4cF292C5349c79cCd66349c3Ed56357dD11B46" + }, + { + "name": "MockWeightedPool", + "address": "0x463957510888720f1EA65B599e996aaD4264206A" + } + ], + "status": "DEPRECATED" + }, + "20230314-batch-relayer-v5": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B" + }, + { + "name": "BalancerRelayer", + "address": "0x03F1ab8b19bcE21EB06C364aEc9e40322572a1e9" + } + ], + "status": "ACTIVE" + }, + "20230320-composable-stable-pool-v4": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x1802953277FD955f9a254B80Aa0582f193cF1d77" + }, + { + "name": "MockComposableStablePool", + "address": "0x7C53dBf28a23faB07E322fb35eC53A296f548a45" + } + ], + "status": "DEPRECATED" + }, + "20230320-weighted-pool-v4": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a" + }, + { + "name": "MockWeightedPool", + "address": "0xE7eE2d64bCB1B2C915898E9DA0947DA1D413DCAF" + } + ], + "status": "ACTIVE" + }, + "20230404-l2-layer0-bridge-forwarder": { + "contracts": [ + { + "name": "L2LayerZeroBridgeForwarder", + "address": "0x20AabBC59F3cE58e0ef931380d8Bf2A6fE681019" + } + ], + "status": "ACTIVE" + }, + "20230410-aave-linear-pool-v5": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0xE605Dbe1cA85dCdb8F43CEfA427f3B0fC06f6ba6" + }, + { + "name": "MockAaveLendingPool", + "address": "0x5F43FBa61f63Fa6bFF101a0A0458cEA917f6B347" + }, + { + "name": "MockStaticAToken", + "address": "0xC101dcA301a4011C1F925e9622e749e550a1B667" + }, + { + "name": "MockAaveLinearPool", + "address": "0x2Ba5fd37e71Ab2633602553BE7ad5A377D7ED31A" + } + ], + "status": "ACTIVE" + }, + "20230411-managed-pool-v2": { + "contracts": [ + { + "name": "ManagedPoolAddRemoveTokenLib", + "address": "0x59562f93c447656F6E4799fC1FC7c3d977C3324F" + }, + { + "name": "CircuitBreakerLib", + "address": "0x2498A2B0d6462d2260EAC50aE1C3e03F4829BA95" + }, + { + "name": "ManagedPoolAmmLib", + "address": "0xDEd7Fef7D8eCdcB74F22f0169e1A9EC696e6695d" + }, + { + "name": "ExternalWeightedMath", + "address": "0x8df317a729fcaA260306d7de28888932cb579b88" + }, + { + "name": "RecoveryModeHelper", + "address": "0x3B1eb8EB7b43882b385aB30533D9A2BeF9052a98" + }, + { + "name": "ManagedPoolFactory", + "address": "0x4C32a8a8fDa4E24139B51b456B42290f51d6A1c4" + }, + { + "name": "MockManagedPool", + "address": "0x710A461Ea47AE36C45CBA8Cb6ce964e8A5cb87eD" + } + ], + "status": "ACTIVE" + }, + "20230414-authorizer-wrapper": { + "contracts": [ + { + "name": "AuthorizerWithAdaptorValidation", + "address": "0xAcf05BE5134d64d150d153818F8C67EE36996650" + } + ], + "status": "ACTIVE" + }, + "20230613-balancer-pool-data-queries": { + "contracts": [ + { + "name": "BalancerPoolDataQueries", + "address": "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089" + } + ], + "status": "ACTIVE" + }, + "20230711-composable-stable-pool-v5": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x4fb47126Fa83A8734991E41B942Ac29A3266C968" + }, + { + "name": "MockComposableStablePool", + "address": "0x6bDa27339629e2d031F19555D3E44c205c31a13a" + } + ], + "status": "ACTIVE" + }, + "20230712-child-chain-gauge-checkpointer": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0xa523f47A933D5020b23629dDf689695AA94612Dc" + }, + { + "name": "BalancerRelayer", + "address": "0xF27D53f21d024643d50de50183932F17638229F6" + } + ], + "status": "ACTIVE" + }, + "20230717-chainlink-rate-provider-factory": { + "contracts": [ + { + "name": "ChainlinkRateProviderFactory", + "address": "0x6817149cb753BF529565B4D023d7507eD2ff4Bc0" + } + ], + "status": "ACTIVE" + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/addresses/fantom.json b/balpy/balancer-deployments/addresses/fantom.json new file mode 100644 index 0000000..bf2a5ee --- /dev/null +++ b/balpy/balancer-deployments/addresses/fantom.json @@ -0,0 +1,55 @@ +{ + "20210418-authorizer": { + "contracts": [ + { + "name": "Authorizer", + "address": "0x974D3FF709D84Ba44cde3257C0B5B0b14C081Ce9" + } + ], + "status": "ACTIVE" + }, + "20210418-vault": { + "contracts": [ + { + "name": "Vault", + "address": "0x20dd72Ed959b6147912C2e529F0a0C651c33c9ce" + }, + { + "name": "ProtocolFeesCollector", + "address": "0xC6920d3a369E7c8BD1A22DbE385e11d1F7aF948F" + }, + { + "name": "BalancerHelpers", + "address": "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a" + } + ], + "status": "ACTIVE" + }, + "20220325-authorizer-adaptor": { + "contracts": [ + { + "name": "AuthorizerAdaptor", + "address": "0xf7D5DcE55E6D47852F054697BAB6A1B48A00ddbd" + } + ], + "status": "ACTIVE" + }, + "20220325-test-balancer-token": { + "contracts": [ + { + "name": "TestBalancerToken", + "address": "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B" + } + ], + "status": "ACTIVE" + }, + "20220721-balancer-queries": { + "contracts": [ + { + "name": "BalancerQueries", + "address": "0x1B0A42663DF1edeA171cD8732d288a81EFfF6d23" + } + ], + "status": "ACTIVE" + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/addresses/gnosis.json b/balpy/balancer-deployments/addresses/gnosis.json new file mode 100644 index 0000000..a03a50f --- /dev/null +++ b/balpy/balancer-deployments/addresses/gnosis.json @@ -0,0 +1,473 @@ +{ + "20210418-authorizer": { + "contracts": [ + { + "name": "Authorizer", + "address": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" + } + ], + "status": "ACTIVE" + }, + "20210418-vault": { + "contracts": [ + { + "name": "Vault", + "address": "0xBA12222222228d8Ba445958a75a0704d566BF2C8" + }, + { + "name": "ProtocolFeesCollector", + "address": "0xce88686553686DA562CE7Cea497CE749DA109f9F" + }, + { + "name": "BalancerHelpers", + "address": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9" + } + ], + "status": "ACTIVE" + }, + "20211202-no-protocol-fee-lbp": { + "contracts": [ + { + "name": "NoProtocolFeeLiquidityBootstrappingPoolFactory", + "address": "0x85a80afee867aDf27B50BdB7b76DA70f1E853062" + } + ], + "status": "ACTIVE" + }, + "20220325-authorizer-adaptor": { + "contracts": [ + { + "name": "AuthorizerAdaptor", + "address": "0x5aDDCCa35b7A0D07C74063c48700C8590E87864E" + } + ], + "status": "ACTIVE" + }, + "20220404-erc4626-linear-pool-v2": { + "contracts": [ + { + "name": "ERC4626LinearPoolFactory", + "address": "0x4132f7AcC9dB7A6cF7BE2Dd3A9DC8b30C7E6E6c8" + } + ], + "status": "DEPRECATED" + }, + "20220413-child-chain-gauge-factory": { + "contracts": [ + { + "name": "RewardsOnlyGauge", + "address": "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B" + }, + { + "name": "ChildChainStreamer", + "address": "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a" + }, + { + "name": "ChildChainLiquidityGaugeFactory", + "address": "0x809B79b53F18E9bc08A961ED4678B901aC93213a" + } + ], + "status": "ACTIVE" + }, + "20220425-unbutton-aave-linear-pool": { + "contracts": [ + { + "name": "UnbuttonAaveLinearPoolFactory", + "address": "0x4fb47126Fa83A8734991E41B942Ac29A3266C968" + } + ], + "status": "DEPRECATED" + }, + "20220517-protocol-fee-withdrawer": { + "contracts": [ + { + "name": "ProtocolFeesWithdrawer", + "address": "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca" + } + ], + "status": "ACTIVE" + }, + "20220527-child-chain-gauge-token-adder": { + "contracts": [ + { + "name": "ChildChainGaugeTokenAdder", + "address": "0x1802953277FD955f9a254B80Aa0582f193cF1d77" + } + ], + "status": "ACTIVE" + }, + "20220609-stable-pool-v2": { + "contracts": [ + { + "name": "StablePoolFactory", + "address": "0xf23b4DB826DbA14c0e857029dfF076b1c0264843" + } + ], + "status": "DEPRECATED" + }, + "20220721-balancer-queries": { + "contracts": [ + { + "name": "BalancerQueries", + "address": "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e" + } + ], + "status": "ACTIVE" + }, + "20220725-protocol-fee-percentages-provider": { + "contracts": [ + { + "name": "ProtocolFeePercentagesProvider", + "address": "0x41B953164995c11C81DA73D212ED8Af25741b7Ac" + } + ], + "status": "ACTIVE" + }, + "20220812-child-chain-reward-helper": { + "contracts": [ + { + "name": "ChildChainGaugeRewardHelper", + "address": "0xf7D5DcE55E6D47852F054697BAB6A1B48A00ddbd" + } + ], + "status": "ACTIVE" + }, + "20220908-weighted-pool-v2": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0xf302f9F50958c5593770FDf4d4812309fF77414f" + } + ], + "status": "DEPRECATED" + }, + "20220916-batch-relayer-v4": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0xD7FAD3bd59D6477cbe1BE7f646F7f1BA25b230f8" + }, + { + "name": "BalancerRelayer", + "address": "0xeF606F58A4FD0fCcb066c6203d0994694d3eB2D3" + } + ], + "status": "DEPRECATED" + }, + "20221122-composable-stable-pool-v2": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6" + }, + { + "name": "MockComposableStablePool", + "address": "0x707B7d4a1bAe449d546DCAb869256591bbB3d70b" + } + ], + "status": "DEPRECATED" + }, + "20221123-pool-recovery-helper": { + "contracts": [ + { + "name": "PoolRecoveryHelper", + "address": "0xc3ccacE87f6d3A81724075ADcb5ddd85a8A1bB68" + } + ], + "status": "ACTIVE" + }, + "20221124-authorizer-adaptor-entrypoint": { + "contracts": [ + { + "name": "AuthorizerAdaptorEntrypoint", + "address": "0x8F42aDBbA1B16EaAE3BB5754915E0D06059aDd75" + } + ], + "status": "ACTIVE" + }, + "20221207-aave-rebalanced-linear-pool-v3": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0x9dd5Db2d38b50bEF682cE532bCca5DfD203915E1" + }, + { + "name": "MockAaveLendingPool", + "address": "0x9805dcfD25e6De36bad8fe9D3Fe2c9b44B764102" + }, + { + "name": "MockStaticAToken", + "address": "0x5cF4928a3205728bd12830E1840F7DB85c62a4B9" + }, + { + "name": "MockAaveLinearPool", + "address": "0x581Ec1f5e7CeD12B186deaE32256AdB53BDd5B08" + } + ], + "status": "DEPRECATED" + }, + "20230206-aave-rebalanced-linear-pool-v4": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0x9dA18982a33FD0c7051B19F0d7C76F2d5E7e017c" + }, + { + "name": "MockAaveLendingPool", + "address": "0x81cFAE226343B24BA12EC6521Db2C79E7aeeb310" + }, + { + "name": "MockStaticAToken", + "address": "0xa523f47A933D5020b23629dDf689695AA94612Dc" + }, + { + "name": "MockAaveLinearPool", + "address": "0x225E0047671939A8d78e08EBd692788Abe63f15c" + } + ], + "status": "DEPRECATED" + }, + "20230206-composable-stable-pool-v3": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD" + }, + { + "name": "MockComposableStablePool", + "address": "0x07c896050dD6E273c199f06d7516F8A4A369d23A" + } + ], + "status": "DEPRECATED" + }, + "20230206-weighted-pool-v3": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0xC128a9954e6c874eA3d62ce62B468bA073093F25" + }, + { + "name": "MockWeightedPool", + "address": "0xE051605A83dEAe38d26a7346B100EF1AC2ef8a0b" + } + ], + "status": "DEPRECATED" + }, + "20230223-protocol-id-registry": { + "contracts": [ + { + "name": "ProtocolIdRegistry", + "address": "0x6B5dA774890Db7B7b96C6f44e6a4b0F657399E2e" + } + ], + "status": "ACTIVE" + }, + "20230314-batch-relayer-v5": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0xb9aD3466cdd42015cc05d4804DC68D562b6a2065" + }, + { + "name": "BalancerRelayer", + "address": "0x3536fD480CA495Ac91E698A703248A8915c137a3" + } + ], + "status": "ACTIVE" + }, + "20230316-child-chain-gauge-factory-v2": { + "contracts": [ + { + "name": "ChildChainGauge", + "address": "0x96484f2aBF5e58b15176dbF1A799627B53F13B6d" + }, + { + "name": "ChildChainGaugeFactory", + "address": "0x83E443EF4f9963C77bd860f94500075556668cb8" + } + ], + "status": "ACTIVE" + }, + "20230316-l2-balancer-pseudo-minter": { + "contracts": [ + { + "name": "L2BalancerPseudoMinter", + "address": "0xA8920455934Da4D853faac1f94Fe7bEf72943eF1" + } + ], + "status": "ACTIVE" + }, + "20230316-l2-ve-delegation-proxy": { + "contracts": [ + { + "name": "NullVotingEscrow", + "address": "0x013D4382F291be5688AFBcc741Ee8A24C66B2C92" + }, + { + "name": "VotingEscrowDelegationProxy", + "address": "0x7A2535f5fB47b8e44c02Ef5D9990588313fe8F05" + } + ], + "status": "ACTIVE" + }, + "20230320-composable-stable-pool-v4": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0xD87F44Df0159DC78029AB9CA7D7e57E7249F5ACD" + }, + { + "name": "MockComposableStablePool", + "address": "0xf3678A0b54C61ccD88Ce321c2e07f87aC75F08B9" + } + ], + "status": "DEPRECATED" + }, + "20230320-weighted-pool-v4": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0x6CaD2ea22BFA7F4C14Aae92E47F510Cd5C509bc7" + }, + { + "name": "MockWeightedPool", + "address": "0xd8752f9b0A2c2813796AbD2bE212A32FFd656EF1" + } + ], + "status": "ACTIVE" + }, + "20230404-l2-layer0-bridge-forwarder": { + "contracts": [ + { + "name": "L2LayerZeroBridgeForwarder", + "address": "0xeb151668006CD04DAdD098AFd0a82e78F77076c3" + } + ], + "status": "ACTIVE" + }, + "20230410-aave-linear-pool-v5": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0x62aaB12865d7281048c337D53a4dde9d770321E6" + }, + { + "name": "MockAaveLendingPool", + "address": "0x040dBA12Bb3D5C0A73ddfe84C220Be3ddBA06966" + }, + { + "name": "MockStaticAToken", + "address": "0x35d8f4a4C0E95f3d925CB4CbBbf513a0172eD8A4" + }, + { + "name": "MockAaveLinearPool", + "address": "0x1AC55C31DaC78ca943CB8ebfCa5945ce09e036e2" + } + ], + "status": "ACTIVE" + }, + "20230411-managed-pool-v2": { + "contracts": [ + { + "name": "ManagedPoolAddRemoveTokenLib", + "address": "0x4C32a8a8fDa4E24139B51b456B42290f51d6A1c4" + }, + { + "name": "CircuitBreakerLib", + "address": "0x54f8F9d28e26Fa5864cfA80f50A5Df95fD85f46a" + }, + { + "name": "ManagedPoolAmmLib", + "address": "0xAcf05BE5134d64d150d153818F8C67EE36996650" + }, + { + "name": "ExternalWeightedMath", + "address": "0x9129E834e15eA19b6069e8f08a8EcFc13686B8dC" + }, + { + "name": "RecoveryModeHelper", + "address": "0xA69E0Ccf150a29369D8Bbc0B3f510849dB7E8EEE" + }, + { + "name": "ManagedPoolFactory", + "address": "0xDF9B5B00Ef9bca66e9902Bd813dB14e4343Be025" + }, + { + "name": "MockManagedPool", + "address": "0xc061361fDa32fF5b65F7D98aCC9a87349d3F0768" + } + ], + "status": "ACTIVE" + }, + "20230414-authorizer-wrapper": { + "contracts": [ + { + "name": "AuthorizerWithAdaptorValidation", + "address": "0x03F3Fb107e74F2EAC9358862E91ad3c692712054" + } + ], + "status": "ACTIVE" + }, + "20230525-l2-veboost-v2": { + "contracts": [ + { + "name": "VeBoostV2", + "address": "0x5DbAd78818D4c8958EfF2d5b95b28385A22113Cd" + } + ], + "status": "ACTIVE" + }, + "20230526-gauge-working-balance-helper": { + "contracts": [ + { + "name": "GaugeWorkingBalanceHelper", + "address": "0x682f0dDBFd41D1272982f64a499Fb62d80e27589" + } + ], + "status": "ACTIVE" + }, + "20230613-balancer-pool-data-queries": { + "contracts": [ + { + "name": "BalancerPoolDataQueries", + "address": "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089" + } + ], + "status": "ACTIVE" + }, + "20230711-composable-stable-pool-v5": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x4bdCc2fb18AEb9e2d281b0278D946445070EAda7" + }, + { + "name": "MockComposableStablePool", + "address": "0xa359b6BB0a89ED9f237C83f32fF05c658DA8b3aB" + } + ], + "status": "ACTIVE" + }, + "20230712-child-chain-gauge-checkpointer": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x1702067424096F07A60e62cceE3dE9420068492D" + }, + { + "name": "BalancerRelayer", + "address": "0xd488810DaAdD52C5892663FEA4e0bcb71eF744cB" + } + ], + "status": "ACTIVE" + }, + "20230717-chainlink-rate-provider-factory": { + "contracts": [ + { + "name": "ChainlinkRateProviderFactory", + "address": "0xDB8d758BCb971e482B2C45f7F8a7740283A1bd3A" + } + ], + "status": "ACTIVE" + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/addresses/goerli.json b/balpy/balancer-deployments/addresses/goerli.json new file mode 100644 index 0000000..6ba4554 --- /dev/null +++ b/balpy/balancer-deployments/addresses/goerli.json @@ -0,0 +1,1002 @@ +{ + "20210418-authorizer": { + "contracts": [ + { + "name": "Authorizer", + "address": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" + } + ], + "status": "ACTIVE" + }, + "20210418-vault": { + "contracts": [ + { + "name": "Vault", + "address": "0xBA12222222228d8Ba445958a75a0704d566BF2C8" + }, + { + "name": "BalancerHelpers", + "address": "0x5aDDCCa35b7A0D07C74063c48700C8590E87864E" + }, + { + "name": "ProtocolFeesCollector", + "address": "0xce88686553686DA562CE7Cea497CE749DA109f9F" + } + ], + "status": "ACTIVE" + }, + "20210418-weighted-pool": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9" + }, + { + "name": "WeightedPool2TokensFactory", + "address": "0xA5bf2ddF098bb0Ef6d120C98217dD6B141c74EE0" + } + ], + "status": "DEPRECATED" + }, + "20210624-stable-pool": { + "contracts": [ + { + "name": "StablePoolFactory", + "address": "0x44afeb87c871D8fEA9398a026DeA2BD3A13F5769" + } + ], + "status": "DEPRECATED" + }, + "20210721-liquidity-bootstrapping-pool": { + "contracts": [ + { + "name": "LiquidityBootstrappingPoolFactory", + "address": "0xb48Cc42C45d262534e46d5965a9Ac496F1B7a830" + } + ], + "status": "DEPRECATED" + }, + "20210727-meta-stable-pool": { + "contracts": [ + { + "name": "QueryProcessor", + "address": "0xf97c7788d2D74b12CbAb2Efa0c69a44280211457" + }, + { + "name": "MetaStablePoolFactory", + "address": "0xA55F73E2281c60206ba43A3590dB07B8955832Be" + } + ], + "status": "DEPRECATED" + }, + "20210812-lido-relayer": { + "contracts": [ + { + "name": "LidoRelayer", + "address": "0xdc10e8f47B6858E32218E01db224795235872B19" + } + ], + "status": "DEPRECATED" + }, + "20210812-wsteth-rate-provider": { + "contracts": [ + { + "name": "WstETHRateProvider", + "address": "0x80a94F458491CA88F09767E58a92FD23Cbf1196F" + } + ], + "status": "ACTIVE" + }, + "20210907-investment-pool": { + "contracts": [ + { + "name": "InvestmentPoolFactory", + "address": "0x3C9F788131A26329A689Bd951b5aCb4454669487" + } + ], + "status": "DEPRECATED" + }, + "20211012-merkle-orchard": { + "contracts": [ + { + "name": "MerkleOrchard", + "address": "0x35b50C7955e7D0E8298e043C9F4dCDef737b9f5a" + } + ], + "status": "DEPRECATED" + }, + "20211202-no-protocol-fee-lbp": { + "contracts": [ + { + "name": "NoProtocolFeeLiquidityBootstrappingPoolFactory", + "address": "0xB0C726778C3AE4B3454D85557A48e8fa502bDD6A" + } + ], + "status": "ACTIVE" + }, + "20211203-batch-relayer": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0xFB2f4CE9843E1069CC1F9d76e0236d6dFF2b1eeA" + }, + { + "name": "BalancerRelayer", + "address": "0x8002d3e5875b38C5B03da83aeB430dC63E047F62" + } + ], + "status": "DEPRECATED" + }, + "20211208-aave-linear-pool": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0x94470C12fc192e071F12Fec1152861608CE01562" + } + ], + "status": "DEPRECATED" + }, + "20211208-stable-phantom-pool": { + "contracts": [ + { + "name": "StablePhantomPoolFactory", + "address": "0x41E9036AE350baEDCC7107760A020Dca3c0731ec" + } + ], + "status": "DEPRECATED" + }, + "20220318-batch-relayer-v2": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x10aF508f3b0e067Dd5eA3149A003457F49C8bB69" + }, + { + "name": "BalancerRelayer", + "address": "0x12A39C1A0d17f354d02670961DEf678223Aa15Da" + } + ], + "status": "DEPRECATED" + }, + "20220325-authorizer-adaptor": { + "contracts": [ + { + "name": "AuthorizerAdaptor", + "address": "0x5D90225De345eE24d1d2B6F45DE90B056F5265A1" + } + ], + "status": "ACTIVE" + }, + "20220325-bal-token-holder-factory": { + "contracts": [ + { + "name": "BALTokenHolderFactory", + "address": "0x45E617B07021B97407367624648d1A0A358a751A" + } + ], + "status": "ACTIVE" + }, + "20220325-balancer-token-admin": { + "contracts": [ + { + "name": "BalancerTokenAdmin", + "address": "0x0F32D7D830E20809Bcb9071581A696135dD472B7" + } + ], + "status": "ACTIVE" + }, + "20220325-gauge-adder": { + "contracts": [ + { + "name": "GaugeAdder", + "address": "0x0Df18b22fB1DD4c1D4bfBF783A8acF0758979328" + } + ], + "status": "DEPRECATED" + }, + "20220325-gauge-controller": { + "contracts": [ + { + "name": "VotingEscrow", + "address": "0x33A99Dcc4C85C014cf12626959111D5898bbCAbF" + }, + { + "name": "GaugeController", + "address": "0xBB1CE49b16d55A1f2c6e88102f32144C7334B116" + }, + { + "name": "BalancerMinter", + "address": "0xdf0399539A72E2689B8B2DD53C3C2A0883879fDd" + } + ], + "status": "ACTIVE" + }, + "20220325-mainnet-gauge-factory": { + "contracts": [ + { + "name": "LiquidityGaugeV5", + "address": "0xfE734760aD346d4013FD597c4f4a897aef332128" + }, + { + "name": "LiquidityGaugeFactory", + "address": "0x224E808FBD9e491Be8988B8A0451FBF777C81B8A" + } + ], + "status": "DEPRECATED" + }, + "20220325-single-recipient-gauge-factory": { + "contracts": [ + { + "name": "SingleRecipientGaugeFactory", + "address": "0xd14FFA46C211eac64338c27549c3312380f850Fa" + }, + { + "name": "SingleRecipientGauge", + "address": "0x5825120665066E3B54D1B21ce45889aff5d41f62" + } + ], + "status": "DEPRECATED" + }, + "20220325-test-balancer-token": { + "contracts": [ + { + "name": "TestBalancerToken", + "address": "0xfA8449189744799aD2AcE7e0EBAC8BB7575eff47" + } + ], + "status": "ACTIVE" + }, + "20220325-ve-delegation": { + "contracts": [ + { + "name": "VotingEscrowDelegation", + "address": "0xcfF73979321788d59a6170fF012730dB2087f31c" + }, + { + "name": "VotingEscrowDelegationProxy", + "address": "0xA1F107D1cD709514AE8A914eCB757E95f9cedB31" + } + ], + "status": "ACTIVE" + }, + "20220404-erc4626-linear-pool-v2": { + "contracts": [ + { + "name": "ERC4626LinearPoolFactory", + "address": "0xdc15A3C5D16413C1C1F75Db0f75c4ae2a4104650" + } + ], + "status": "DEPRECATED" + }, + "20220413-child-chain-gauge-factory": { + "contracts": [ + { + "name": "RewardsOnlyGauge", + "address": "0x40Bd3fAef4268EA40F4c372D7f0A44C3EFaAA6b1" + }, + { + "name": "ChildChainStreamer", + "address": "0x5B5B72D76B68f4Bb1d2A10EF0fc77711f8Ec7ed0" + }, + { + "name": "ChildChainLiquidityGaugeFactory", + "address": "0x393B918Cc2Ffa238732E83dD4eE52343f57d767b" + } + ], + "status": "ACTIVE" + }, + "20220420-fee-distributor": { + "contracts": [ + { + "name": "FeeDistributor", + "address": "0x7F91dcdE02F72b478Dc73cB21730cAcA907c8c44" + } + ], + "status": "DEPRECATED" + }, + "20220420-smart-wallet-checker": { + "contracts": [ + { + "name": "SmartWalletChecker", + "address": "0x1b6DF1fF5db99F8a8A04D38f7478BAB056Fa35A7" + } + ], + "status": "ACTIVE" + }, + "20220421-smart-wallet-checker-coordinator": { + "contracts": [ + { + "name": "SmartWalletCheckerCoordinator", + "address": "0x194F864aF5a7F224E9E79Cf110cC5B4e36e2ddFc" + } + ], + "status": "SCRIPT" + }, + "20220425-unbutton-aave-linear-pool": { + "contracts": [ + { + "name": "UnbuttonAaveLinearPoolFactory", + "address": "0x4b9A00DD766DB94Df48C2901C321174a5cE75529" + } + ], + "status": "DEPRECATED" + }, + "20220513-double-entrypoint-fix-relayer": { + "contracts": [ + { + "name": "DoubleEntrypointFixRelayer", + "address": "0xBe9458ab5B6F289e524410141c8d5E20A6b035fe" + } + ], + "status": "ACTIVE" + }, + "20220517-protocol-fee-withdrawer": { + "contracts": [ + { + "name": "ProtocolFeesWithdrawer", + "address": "0x85153B639a35d6e6CF8B291Aca237FbE67377154" + } + ], + "status": "ACTIVE" + }, + "20220527-child-chain-gauge-token-adder": { + "contracts": [ + { + "name": "ChildChainGaugeTokenAdder", + "address": "0x55B18f514D7f0C6C886d0C23Ac72dF5D3B5F8850" + } + ], + "status": "ACTIVE" + }, + "20220530-preseeded-voting-escrow-delegation": { + "contracts": [ + { + "name": "PreseededVotingEscrowDelegation", + "address": "0x7AF980bDBc36D21CE228EfABCCA35707566A2be5" + } + ], + "status": "ACTIVE" + }, + "20220609-stable-pool-v2": { + "contracts": [ + { + "name": "StablePoolFactory", + "address": "0xD360B8afb3d7463bE823bE1Ec3c33aA173EbE86e" + } + ], + "status": "DEPRECATED" + }, + "20220628-gauge-adder-v2": { + "contracts": [ + { + "name": "GaugeAdder", + "address": "0x42bAF6db21250fa76d015621D2F6DF172858A5cb" + } + ], + "status": "DEPRECATED" + }, + "20220707-distribution-scheduler": { + "contracts": [ + { + "name": "DistributionScheduler", + "address": "0x05a0BF0540F346b6Dac25550738343BEb51C0f65" + } + ], + "status": "ACTIVE" + }, + "20220714-fee-distributor-v2": { + "contracts": [ + { + "name": "FeeDistributor", + "address": "0x42B67611B208E2e9b4CC975F6D74c87b865aE066" + } + ], + "status": "ACTIVE" + }, + "20220720-batch-relayer-v3": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0xdcdbf71A870cc60C6F9B621E28a7D3Ffd6Dd4965" + }, + { + "name": "BalancerRelayer", + "address": "0x7b9B6f094DC2Bd1c12024b0D9CC63d6993Be1888" + } + ], + "status": "DEPRECATED" + }, + "20220721-balancer-queries": { + "contracts": [ + { + "name": "BalancerQueries", + "address": "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5" + } + ], + "status": "ACTIVE" + }, + "20220725-protocol-fee-percentages-provider": { + "contracts": [ + { + "name": "ProtocolFeePercentagesProvider", + "address": "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e" + } + ], + "status": "ACTIVE" + }, + "20220812-child-chain-reward-helper": { + "contracts": [ + { + "name": "ChildChainGaugeRewardHelper", + "address": "0xC128a9954e6c874eA3d62ce62B468bA073093F25" + } + ], + "status": "ACTIVE" + }, + "20220817-aave-rebalanced-linear-pool": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD" + } + ], + "status": "DEPRECATED" + }, + "20220822-mainnet-gauge-factory-v2": { + "contracts": [ + { + "name": "LiquidityGaugeV5", + "address": "0x2E96068b3D5B5BAE3D7515da4A1D2E52d08A2647" + }, + { + "name": "LiquidityGaugeFactory", + "address": "0x3b8cA519122CdD8efb272b0D3085453404B25bD0" + } + ], + "status": "ACTIVE" + }, + "20220906-composable-stable-pool": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0xB848f50141F3D4255b37aC288C25C109104F2158" + } + ], + "status": "DEPRECATED" + }, + "20220908-weighted-pool-v2": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0x94f68b54191F62f781Fe8298A8A5Fa3ed772d227" + } + ], + "status": "DEPRECATED" + }, + "20220916-batch-relayer-v4": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0xeb151668006CD04DAdD098AFd0a82e78F77076c3" + }, + { + "name": "BalancerRelayer", + "address": "0x00e695aA8000df01B8DC8401B4C34Fba5D56BBb2" + } + ], + "status": "DEPRECATED" + }, + "20221021-managed-pool": { + "contracts": [ + { + "name": "ManagedPoolAddRemoveTokenLib", + "address": "0x0343311A33994a3d27273505560ED73dC2BD0Db3" + }, + { + "name": "CircuitBreakerLib", + "address": "0x782640c4e71F523152AE0942ee7589fB24c8367D" + }, + { + "name": "ManagedPoolFactory", + "address": "0x3EAd2FdcBEE244d9fA5b8d233EfedD34Bb7D2434" + } + ], + "status": "DEPRECATED" + }, + "20221122-composable-stable-pool-v2": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x85a80afee867aDf27B50BdB7b76DA70f1E853062" + }, + { + "name": "MockComposableStablePool", + "address": "0x373b347bc87998b151A5E9B6bB6ca692b766648a" + } + ], + "status": "DEPRECATED" + }, + "20221123-pool-recovery-helper": { + "contracts": [ + { + "name": "PoolRecoveryHelper", + "address": "0x1cbbE6cEa5E4fE7D69c586b4e362A646DEEf105d" + } + ], + "status": "ACTIVE" + }, + "20221124-authorizer-adaptor-entrypoint": { + "contracts": [ + { + "name": "AuthorizerAdaptorEntrypoint", + "address": "0xacAaC3e6D6Df918Bf3c809DFC7d42de0e4a72d4C" + } + ], + "status": "ACTIVE" + }, + "20221202-timelock-authorizer": { + "contracts": [ + { + "name": "TimelockAuthorizerMigrator", + "address": "0xee47ef369CDa5a65639D7794b70a4d247826DdF3" + }, + { + "name": "TimelockAuthorizer", + "address": "0x5D21A65b6Ec0687f471891257F1DA25ab8be6153" + } + ], + "status": "DEPRECATED" + }, + "20221205-veboost-v2": { + "contracts": [ + { + "name": "VeBoostV2", + "address": "0xd13AFc362F619b840C8f4AaC1D957cE219eF37Ca" + } + ], + "status": "ACTIVE" + }, + "20221207-aave-rebalanced-linear-pool-v3": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0x70Bbd023481788e443472e123AB963e5EBF58D06" + }, + { + "name": "MockAaveLendingPool", + "address": "0xBF6d7e9a6db814D2856c9e2f83442f60f9D40738" + }, + { + "name": "MockStaticAToken", + "address": "0xAAda0aF3FA5C819145dA760bab8F180DaeeA8514" + }, + { + "name": "MockAaveLinearPool", + "address": "0xf93F6382913d1dE6Bdf683A94be8349751af8d59" + } + ], + "status": "DEPRECATED" + }, + "20230109-gauge-adder-v3": { + "contracts": [ + { + "name": "GaugeAdder", + "address": "0xBd35248F8325DD1cB2bBf9D01E80A6bb99a792Dd" + } + ], + "status": "DEPRECATED" + }, + "20230206-aave-rebalanced-linear-pool-v4": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6" + }, + { + "name": "MockAaveLendingPool", + "address": "0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88" + }, + { + "name": "MockStaticAToken", + "address": "0x9dd5Db2d38b50bEF682cE532bCca5DfD203915E1" + }, + { + "name": "MockAaveLinearPool", + "address": "0x707B7d4a1bAe449d546DCAb869256591bbB3d70b" + } + ], + "status": "DEPRECATED" + }, + "20230206-composable-stable-pool-v3": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0xbfD9769b061E57e478690299011A028194D66e3C" + }, + { + "name": "MockComposableStablePool", + "address": "0x2EF26d97B5870600BE341561298938c2e5df84f0" + } + ], + "status": "DEPRECATED" + }, + "20230206-erc4626-linear-pool-v3": { + "contracts": [ + { + "name": "ERC4626LinearPoolFactory", + "address": "0xBa240C856498e2d7a70AF4911AaFae0D6b565a5B" + }, + { + "name": "MockERC4626Token", + "address": "0xa1C22168262fbaf5a87b9Aa6A13122BE630085E9" + }, + { + "name": "MockERC4626LinearPool", + "address": "0x744644537fB1AE7c4E05f6331e87126b4fd0C325" + } + ], + "status": "DEPRECATED" + }, + "20230206-weighted-pool-v3": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0x26575A44755E0aaa969FDda1E4291Df22C5624Ea" + }, + { + "name": "MockWeightedPool", + "address": "0x0441ff033652bcEB75a011887F17B5dfC84Ddc6f" + } + ], + "status": "DEPRECATED" + }, + "20230208-euler-linear-pool": { + "contracts": [ + { + "name": "EulerLinearPoolFactory", + "address": "0x813EE7a840CE909E7Fea2117A44a90b8063bd4fd" + }, + { + "name": "MockEulerToken", + "address": "0xB99eDc4b289B0F2284fCF3f66884191BdCe29624" + }, + { + "name": "MockEulerLinearPool", + "address": "0x43Fa2c00419F60e18966Aa043DEBd4701CB91B6d" + } + ], + "status": "ACTIVE" + }, + "20230213-gearbox-linear-pool": { + "contracts": [ + { + "name": "GearboxLinearPoolFactory", + "address": "0x806E02Dea8d4a0882caD9fA3Fa75B212328692dE" + }, + { + "name": "MockGearboxVault", + "address": "0xa496bE32F7C9Abc49E8ba91A23d37cF6fA58651B" + }, + { + "name": "MockGearboxDieselToken", + "address": "0x4E11AEec21baF1660b1a46472963cB3DA7811C89" + }, + { + "name": "MockGearboxLinearPool", + "address": "0x007E1830BcC05039c3926d6478F6B2912376e52E" + } + ], + "status": "DEPRECATED" + }, + "20230213-yearn-linear-pool": { + "contracts": [ + { + "name": "YearnLinearPoolFactory", + "address": "0x2a12a248f9b56cE6e7fAbA62D1bBA8735FB513F9" + }, + { + "name": "MockYearnTokenVault", + "address": "0x057Cf03e3E0EC8D5a5FaFb3A0fC99a0aA0C1989e" + }, + { + "name": "MockYearnLinearPool", + "address": "0x6D2b8b4EBa8ac88F8467D84bE010d344bFBD90e2" + } + ], + "status": "DEPRECATED" + }, + "20230215-single-recipient-gauge-factory-v2": { + "contracts": [ + { + "name": "SingleRecipientGaugeFactory", + "address": "0xE3881627B8DeeBCCF9c23B291430a549Fc0bE5F7" + }, + { + "name": "SingleRecipientGauge", + "address": "0x0e9aDdc34F93BCcB45D1F744B9F9301285C5b48F" + } + ], + "status": "ACTIVE" + }, + "20230222-merkle-orchard-v2": { + "contracts": [ + { + "name": "MerkleOrchard", + "address": "0x5cF4928a3205728bd12830E1840F7DB85c62a4B9" + } + ], + "status": "ACTIVE" + }, + "20230223-protocol-id-registry": { + "contracts": [ + { + "name": "ProtocolIdRegistry", + "address": "0x4fb47126Fa83A8734991E41B942Ac29A3266C968" + } + ], + "status": "ACTIVE" + }, + "20230314-batch-relayer-v5": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B" + }, + { + "name": "BalancerRelayer", + "address": "0x03F1ab8b19bcE21EB06C364aEc9e40322572a1e9" + } + ], + "status": "ACTIVE" + }, + "20230315-silo-linear-pool": { + "contracts": [ + { + "name": "SiloLinearPoolFactory", + "address": "0x18C100415988bEF4354EfFAd1188d1c22041B046" + }, + { + "name": "MockSiloRepository", + "address": "0xac190662aD9b53A4E6D4CD321dbf5d3ECD0E29b0" + }, + { + "name": "MockSilo", + "address": "0x144245D4223FC7e4D463401a30522C960298a16e" + }, + { + "name": "MockShareToken", + "address": "0x3eFCeb450fb799f67cd97cDC27a0F4Cd7B02B63B" + }, + { + "name": "MockSiloLinearPool", + "address": "0x58cA9F130d2e27EC94d19e53a6BEb2C4084f2638" + } + ], + "status": "DEPRECATED" + }, + "20230316-child-chain-gauge-factory-v2": { + "contracts": [ + { + "name": "ChildChainGauge", + "address": "0x6B5dA774890Db7B7b96C6f44e6a4b0F657399E2e" + }, + { + "name": "ChildChainGaugeFactory", + "address": "0x7Ba29fE8E83dd6097A7298075C4AFfdBda3121cC" + } + ], + "status": "ACTIVE" + }, + "20230316-l2-balancer-pseudo-minter": { + "contracts": [ + { + "name": "L2BalancerPseudoMinter", + "address": "0x81cFAE226343B24BA12EC6521Db2C79E7aeeb310" + } + ], + "status": "ACTIVE" + }, + "20230316-l2-ve-delegation-proxy": { + "contracts": [ + { + "name": "NullVotingEscrow", + "address": "0xa523f47A933D5020b23629dDf689695AA94612Dc" + }, + { + "name": "VotingEscrowDelegationProxy", + "address": "0x6817149cb753BF529565B4D023d7507eD2ff4Bc0" + } + ], + "status": "ACTIVE" + }, + "20230320-composable-stable-pool-v4": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x1802953277FD955f9a254B80Aa0582f193cF1d77" + }, + { + "name": "MockComposableStablePool", + "address": "0x5D343D374A769D1AB102e0418a516DadB08A86E4" + } + ], + "status": "DEPRECATED" + }, + "20230320-weighted-pool-v4": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a" + }, + { + "name": "MockWeightedPool", + "address": "0x072ED560cc042d7aB1c080a9e4fA8C6f4858dEb3" + } + ], + "status": "ACTIVE" + }, + "20230404-l2-layer0-bridge-forwarder": { + "contracts": [ + { + "name": "L2LayerZeroBridgeForwarder", + "address": "0xEF44D6786b2b4d544b7850Fe67CE6381626Bf2D6" + } + ], + "status": "ACTIVE" + }, + "20230410-silo-linear-pool-v2": { + "contracts": [ + { + "name": "SiloLinearPoolFactory", + "address": "0x30FD8a0f7009F50616aFDaB4aF91a0A2Ef4eaE49" + }, + { + "name": "MockSiloRepository", + "address": "0x7153De1A6d71360F07017838c28dEcA0d6C03e2a" + }, + { + "name": "MockSilo", + "address": "0xa7A7e22398622bf71fF31DAe5355EC7843b13806" + }, + { + "name": "MockShareToken", + "address": "0xB8BDCbF8ccf443D055d5Ffe1d8154fAc8187fC94" + }, + { + "name": "MockSiloLinearPool", + "address": "0xBbb66a4fFf47701EC6c528dB615f5E7bF1AbDAAF" + } + ], + "status": "ACTIVE" + }, + "20230411-managed-pool-v2": { + "contracts": [ + { + "name": "ManagedPoolAddRemoveTokenLib", + "address": "0xAcf05BE5134d64d150d153818F8C67EE36996650" + }, + { + "name": "CircuitBreakerLib", + "address": "0x9129E834e15eA19b6069e8f08a8EcFc13686B8dC" + }, + { + "name": "ManagedPoolAmmLib", + "address": "0xA69E0Ccf150a29369D8Bbc0B3f510849dB7E8EEE" + }, + { + "name": "ExternalWeightedMath", + "address": "0xDF9B5B00Ef9bca66e9902Bd813dB14e4343Be025" + }, + { + "name": "RecoveryModeHelper", + "address": "0x300Ab2038EAc391f26D9F895dc61F8F66a548833" + }, + { + "name": "ManagedPoolFactory", + "address": "0x03F3Fb107e74F2EAC9358862E91ad3c692712054" + }, + { + "name": "MockManagedPool", + "address": "0xff79b51ec2934Dd1810a8e0325e3B08708720B26" + } + ], + "status": "ACTIVE" + }, + "20230414-authorizer-wrapper": { + "contracts": [ + { + "name": "AuthorizerWithAdaptorValidation", + "address": "0x8eA89804145c007e7D226001A96955ad53836087" + } + ], + "status": "ACTIVE" + }, + "20230504-vebal-remapper": { + "contracts": [ + { + "name": "OmniVotingEscrowAdaptor", + "address": "0x83E443EF4f9963C77bd860f94500075556668cb8" + }, + { + "name": "VotingEscrowRemapper", + "address": "0x5DbAd78818D4c8958EfF2d5b95b28385A22113Cd" + } + ], + "status": "ACTIVE" + }, + "20230519-gauge-adder-v4": { + "contracts": [ + { + "name": "GaugeAdder", + "address": "0x3f170631ed9821Ca51A59D996aB095162438DC10" + } + ], + "status": "ACTIVE" + }, + "20230522-timelock-authorizer": { + "contracts": [ + { + "name": "TimelockAuthorizerMigrator", + "address": "0xaD89051bEd8d96f045E8912aE1672c6C0bF8a85E" + }, + { + "name": "TimelockAuthorizer", + "address": "0x68056E4234A6Aa4dB6fE66E93703fd90669a8697" + } + ], + "status": "ACTIVE" + }, + "20230526-gauge-working-balance-helper": { + "contracts": [ + { + "name": "GaugeWorkingBalanceHelper", + "address": "0xa7d524046ef89de9F8e4f2d7B029f66cCB738d48" + } + ], + "status": "ACTIVE" + }, + "20230613-balancer-pool-data-queries": { + "contracts": [ + { + "name": "BalancerPoolDataQueries", + "address": "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089" + } + ], + "status": "ACTIVE" + }, + "20230711-composable-stable-pool-v5": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x4bdCc2fb18AEb9e2d281b0278D946445070EAda7" + }, + { + "name": "MockComposableStablePool", + "address": "0x21cb3534c12E956a600cB3102b825686D10888e7" + } + ], + "status": "ACTIVE" + }, + "20230712-child-chain-gauge-checkpointer": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x1702067424096F07A60e62cceE3dE9420068492D" + }, + { + "name": "BalancerRelayer", + "address": "0xd488810DaAdD52C5892663FEA4e0bcb71eF744cB" + } + ], + "status": "ACTIVE" + }, + "20230717-chainlink-rate-provider-factory": { + "contracts": [ + { + "name": "ChainlinkRateProviderFactory", + "address": "0xDB8d758BCb971e482B2C45f7F8a7740283A1bd3A" + } + ], + "status": "ACTIVE" + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/addresses/mainnet.json b/balpy/balancer-deployments/addresses/mainnet.json new file mode 100644 index 0000000..94cba84 --- /dev/null +++ b/balpy/balancer-deployments/addresses/mainnet.json @@ -0,0 +1,1224 @@ +{ + "20210418-authorizer": { + "contracts": [ + { + "name": "Authorizer", + "address": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" + } + ], + "status": "ACTIVE" + }, + "20210418-vault": { + "contracts": [ + { + "name": "Vault", + "address": "0xBA12222222228d8Ba445958a75a0704d566BF2C8" + }, + { + "name": "BalancerHelpers", + "address": "0x5aDDCCa35b7A0D07C74063c48700C8590E87864E" + }, + { + "name": "ProtocolFeesCollector", + "address": "0xce88686553686DA562CE7Cea497CE749DA109f9F" + } + ], + "status": "ACTIVE" + }, + "20210418-weighted-pool": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9" + }, + { + "name": "WeightedPool2TokensFactory", + "address": "0xA5bf2ddF098bb0Ef6d120C98217dD6B141c74EE0" + } + ], + "status": "DEPRECATED" + }, + "20210624-stable-pool": { + "contracts": [ + { + "name": "StablePoolFactory", + "address": "0xc66Ba2B6595D3613CCab350C886aCE23866EDe24" + } + ], + "status": "DEPRECATED" + }, + "20210721-liquidity-bootstrapping-pool": { + "contracts": [ + { + "name": "LiquidityBootstrappingPoolFactory", + "address": "0x751A0bC0e3f75b38e01Cf25bFCE7fF36DE1C87DE" + } + ], + "status": "DEPRECATED" + }, + "20210727-meta-stable-pool": { + "contracts": [ + { + "name": "QueryProcessor", + "address": "0x469b58680774AAc9Ad66447eFB4EF634756A2cC5" + }, + { + "name": "MetaStablePoolFactory", + "address": "0x67d27634E44793fE63c467035E31ea8635117cd4" + } + ], + "status": "DEPRECATED" + }, + "20210811-ldo-merkle": { + "contracts": [ + { + "name": "MerkleRedeem", + "address": "0x884226c9f7b7205f607922E0431419276a64CF8f" + } + ], + "status": "DEPRECATED" + }, + "20210812-lido-relayer": { + "contracts": [ + { + "name": "LidoRelayer", + "address": "0xdcdbf71A870cc60C6F9B621E28a7D3Ffd6Dd4965" + } + ], + "status": "DEPRECATED" + }, + "20210812-wsteth-rate-provider": { + "contracts": [ + { + "name": "WstETHRateProvider", + "address": "0x72D07D7DcA67b8A406aD1Ec34ce969c90bFEE768" + } + ], + "status": "ACTIVE" + }, + "20210907-investment-pool": { + "contracts": [ + { + "name": "InvestmentPoolFactory", + "address": "0x48767F9F868a4A7b86A90736632F6E44C2df7fa9" + } + ], + "status": "DEPRECATED" + }, + "20211012-merkle-orchard": { + "contracts": [ + { + "name": "MerkleOrchard", + "address": "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca" + } + ], + "status": "DEPRECATED" + }, + "20211202-no-protocol-fee-lbp": { + "contracts": [ + { + "name": "NoProtocolFeeLiquidityBootstrappingPoolFactory", + "address": "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e" + } + ], + "status": "ACTIVE" + }, + "20211203-batch-relayer": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x41B953164995c11C81DA73D212ED8Af25741b7Ac" + }, + { + "name": "BalancerRelayer", + "address": "0xAc9f49eF3ab0BbC929f7b1bb0A17E1Fca5786251" + } + ], + "status": "DEPRECATED" + }, + "20211208-aave-linear-pool": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0xD7FAD3bd59D6477cbe1BE7f646F7f1BA25b230f8" + } + ], + "status": "DEPRECATED" + }, + "20211208-stable-phantom-pool": { + "contracts": [ + { + "name": "StablePhantomPoolFactory", + "address": "0xb08E16cFc07C684dAA2f93C70323BAdb2A6CBFd2" + } + ], + "status": "DEPRECATED" + }, + "20220318-batch-relayer-v2": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0xd45369c11870e2057D5be17Cc106d32Ea416F7c4" + }, + { + "name": "BalancerRelayer", + "address": "0x51CC53375A8920aE54C0561E73a9d0423A74832e" + } + ], + "status": "DEPRECATED" + }, + "20220325-authorizer-adaptor": { + "contracts": [ + { + "name": "AuthorizerAdaptor", + "address": "0x8F42aDBbA1B16EaAE3BB5754915E0D06059aDd75" + } + ], + "status": "ACTIVE" + }, + "20220325-bal-token-holder-factory": { + "contracts": [ + { + "name": "BALTokenHolderFactory", + "address": "0xB848f50141F3D4255b37aC288C25C109104F2158" + } + ], + "status": "ACTIVE" + }, + "20220325-balancer-token-admin": { + "contracts": [ + { + "name": "BalancerTokenAdmin", + "address": "0xf302f9F50958c5593770FDf4d4812309fF77414f" + } + ], + "status": "ACTIVE" + }, + "20220325-gauge-adder": { + "contracts": [ + { + "name": "GaugeAdder", + "address": "0xEd5ba579bB5D516263ff6E1C10fcAc1040075Fe2" + } + ], + "status": "DEPRECATED" + }, + "20220325-gauge-controller": { + "contracts": [ + { + "name": "VotingEscrow", + "address": "0xC128a9954e6c874eA3d62ce62B468bA073093F25" + }, + { + "name": "GaugeController", + "address": "0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD" + }, + { + "name": "BalancerMinter", + "address": "0x239e55F427D44C3cc793f49bFB507ebe76638a2b" + } + ], + "status": "ACTIVE" + }, + "20220325-mainnet-gauge-factory": { + "contracts": [ + { + "name": "LiquidityGaugeV5", + "address": "0x3b8cA519122CdD8efb272b0D3085453404B25bD0" + }, + { + "name": "LiquidityGaugeFactory", + "address": "0x4E7bBd911cf1EFa442BC1b2e9Ea01ffE785412EC" + } + ], + "status": "DEPRECATED" + }, + "20220325-single-recipient-gauge-factory": { + "contracts": [ + { + "name": "SingleRecipientGaugeFactory", + "address": "0x94f68b54191F62f781Fe8298A8A5Fa3ed772d227" + }, + { + "name": "SingleRecipientGauge", + "address": "0x5D3d2D18148baAcE45D09254513BcF2C548C4480" + } + ], + "status": "DEPRECATED" + }, + "20220325-ve-delegation": { + "contracts": [ + { + "name": "VotingEscrowDelegation", + "address": "0x2E96068b3D5B5BAE3D7515da4A1D2E52d08A2647" + }, + { + "name": "VotingEscrowDelegationProxy", + "address": "0x6f5a2eE11E7a772AeB5114A20d0D7c0ff61EB8A0" + } + ], + "status": "ACTIVE" + }, + "20220325-veBAL-deployment-coordinator": { + "contracts": [ + { + "name": "veBALDeploymentCoordinator", + "address": "0xeb151668006CD04DAdD098AFd0a82e78F77076c3" + } + ], + "status": "SCRIPT" + }, + "20220404-erc4626-linear-pool-v2": { + "contracts": [ + { + "name": "ERC4626LinearPoolFactory", + "address": "0xE061bF85648e9FA7b59394668CfEef980aEc4c66" + } + ], + "status": "DEPRECATED" + }, + "20220413-arbitrum-root-gauge-factory": { + "contracts": [ + { + "name": "ArbitrumRootGaugeFactory", + "address": "0xad901309d9e9DbC5Df19c84f729f429F0189a633" + }, + { + "name": "ArbitrumRootGauge", + "address": "0x715C777C6149C31A75D0d29633bbBE0A14370bDC" + } + ], + "status": "DEPRECATED" + }, + "20220413-polygon-root-gauge-factory": { + "contracts": [ + { + "name": "PolygonRootGaugeFactory", + "address": "0x4C4287b07d293E361281bCeEe8715c8CDeB64E34" + }, + { + "name": "PolygonRootGauge", + "address": "0xe53D8f8aAaFD95FCc7196E393EC5a907Df44495E" + } + ], + "status": "DEPRECATED" + }, + "20220415-veBAL-L2-gauge-setup-coordinator": { + "contracts": [ + { + "name": "veBALL2GaugeSetupCoordinator", + "address": "0xd13AFc362F619b840C8f4AaC1D957cE219eF37Ca" + } + ], + "status": "SCRIPT" + }, + "20220418-veBAL-gauge-fix-coordinator": { + "contracts": [ + { + "name": "veBALGaugeFixCoordinator", + "address": "0xee47ef369CDa5a65639D7794b70a4d247826DdF3" + } + ], + "status": "SCRIPT" + }, + "20220420-fee-distributor": { + "contracts": [ + { + "name": "FeeDistributor", + "address": "0x26743984e3357eFC59f2fd6C1aFDC310335a61c9" + } + ], + "status": "DEPRECATED" + }, + "20220420-smart-wallet-checker": { + "contracts": [ + { + "name": "SmartWalletChecker", + "address": "0x7869296Efd0a76872fEE62A058C8fBca5c1c826C" + } + ], + "status": "ACTIVE" + }, + "20220421-smart-wallet-checker-coordinator": { + "contracts": [ + { + "name": "SmartWalletCheckerCoordinator", + "address": "0x26575A44755E0aaa969FDda1E4291Df22C5624Ea" + } + ], + "status": "SCRIPT" + }, + "20220425-unbutton-aave-linear-pool": { + "contracts": [ + { + "name": "UnbuttonAaveLinearPoolFactory", + "address": "0x9588c26142e345f1A0d005CfC0C6DF29A8Fa010C" + } + ], + "status": "DEPRECATED" + }, + "20220513-double-entrypoint-fix-relayer": { + "contracts": [ + { + "name": "DoubleEntrypointFixRelayer", + "address": "0xcA96C4f198d343E251b1a01F3EBA061ef3DA73C1" + } + ], + "status": "ACTIVE" + }, + "20220517-protocol-fee-withdrawer": { + "contracts": [ + { + "name": "ProtocolFeesWithdrawer", + "address": "0x5ef4c5352882b10893b70DbcaA0C000965bd23c5" + } + ], + "status": "ACTIVE" + }, + "20220530-preseeded-voting-escrow-delegation": { + "contracts": [ + { + "name": "PreseededVotingEscrowDelegation", + "address": "0xB496FF44746A8693A060FafD984Da41B253f6790" + } + ], + "status": "ACTIVE" + }, + "20220606-tribe-bal-minter-coordinator": { + "contracts": [ + { + "name": "TribeBALMinterCoordinator", + "address": "0x34ac9f7ebA9213C827fE5Abf5b09A16F4D0cC69b" + } + ], + "status": "SCRIPT" + }, + "20220609-stable-pool-v2": { + "contracts": [ + { + "name": "StablePoolFactory", + "address": "0x8df6EfEc5547e31B0eb7d1291B511FF8a2bf987c" + } + ], + "status": "DEPRECATED" + }, + "20220610-snx-recovery-coordinator": { + "contracts": [ + { + "name": "SNXRecoveryCoordinator", + "address": "0x56a1bAf2f7A163CE66067f0062DA60930dd0CB31" + } + ], + "status": "SCRIPT" + }, + "20220628-gauge-adder-v2": { + "contracts": [ + { + "name": "GaugeAdder", + "address": "0x2fFB7B215Ae7F088eC2530C7aa8E1B24E398f26a" + } + ], + "status": "DEPRECATED" + }, + "20220628-optimism-root-gauge-factory": { + "contracts": [ + { + "name": "OptimismRootGaugeFactory", + "address": "0x3083A1C455ff38d39e58Dbac5040f465cF73C5c8" + }, + { + "name": "OptimismRootGauge", + "address": "0xcA734aD0b286EA7dD6367a504a48FB75cd12a97F" + } + ], + "status": "DEPRECATED" + }, + "20220707-distribution-scheduler": { + "contracts": [ + { + "name": "DistributionScheduler", + "address": "0xBd35248F8325DD1cB2bBf9D01E80A6bb99a792Dd" + } + ], + "status": "ACTIVE" + }, + "20220714-fee-distributor-v2": { + "contracts": [ + { + "name": "FeeDistributor", + "address": "0xD3cf852898b21fc233251427c2DC93d3d604F3BB" + } + ], + "status": "ACTIVE" + }, + "20220720-batch-relayer-v3": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0xD966d712F470067B60D37246404D6DFe5Bf0B419" + }, + { + "name": "BalancerRelayer", + "address": "0x886A3Ec7bcC508B8795990B60Fa21f85F9dB7948" + } + ], + "status": "DEPRECATED" + }, + "20220721-balancer-queries": { + "contracts": [ + { + "name": "BalancerQueries", + "address": "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5" + } + ], + "status": "ACTIVE" + }, + "20220721-gauge-adder-migration-coordinator": { + "contracts": [ + { + "name": "GaugeAdderMigrationCoordinator", + "address": "0x1B57f637Ce3408f1f834b0b70f9A595b062DAea7" + } + ], + "status": "SCRIPT" + }, + "20220725-protocol-fee-percentages-provider": { + "contracts": [ + { + "name": "ProtocolFeePercentagesProvider", + "address": "0x97207B095e4D5C9a6e4cfbfcd2C3358E03B90c4A" + } + ], + "status": "ACTIVE" + }, + "20220817-aave-rebalanced-linear-pool": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0x6A0AC04f5C2A10297D5FA79FA6358837a8770041" + } + ], + "status": "DEPRECATED" + }, + "20220822-mainnet-gauge-factory-v2": { + "contracts": [ + { + "name": "LiquidityGaugeV5", + "address": "0xe5F96070CA00cd54795416B1a4b4c2403231c548" + }, + { + "name": "LiquidityGaugeFactory", + "address": "0xf1665E19bc105BE4EDD3739F88315cC699cc5b65" + } + ], + "status": "ACTIVE" + }, + "20220823-arbitrum-root-gauge-factory-v2": { + "contracts": [ + { + "name": "ArbitrumRootGaugeFactory", + "address": "0x1c99324EDC771c82A0DCCB780CC7DDA0045E50e7" + }, + { + "name": "ArbitrumRootGauge", + "address": "0x6337949cbC4825Bbd09242c811770F6F6fee9FfC" + } + ], + "status": "ACTIVE" + }, + "20220823-optimism-root-gauge-factory-v2": { + "contracts": [ + { + "name": "OptimismRootGaugeFactory", + "address": "0x866D4B65694c66fbFD15Dd6fa933D0A6b3940A36" + }, + { + "name": "OptimismRootGauge", + "address": "0xBC230b1a66A138cD9cFC7b352390025978dFAdde" + } + ], + "status": "ACTIVE" + }, + "20220823-polygon-root-gauge-factory-v2": { + "contracts": [ + { + "name": "PolygonRootGaugeFactory", + "address": "0xa98Bce70c92aD2ef3288dbcd659bC0d6b62f8F13" + }, + { + "name": "PolygonRootGauge", + "address": "0xfeb1A24C2752E53576133cdb718F25bC64eBDD52" + } + ], + "status": "ACTIVE" + }, + "20220906-composable-stable-pool": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0xf9ac7B9dF2b3454E841110CcE5550bD5AC6f875F" + } + ], + "status": "DEPRECATED" + }, + "20220908-weighted-pool-v2": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0xcC508a455F5b0073973107Db6a878DdBDab957bC" + } + ], + "status": "DEPRECATED" + }, + "20220916-batch-relayer-v4": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0xd02992266BB6a6324A3aB8B62FeCBc9a3C58d1F9" + }, + { + "name": "BalancerRelayer", + "address": "0x2536dfeeCB7A0397CF98eDaDA8486254533b1aFA" + } + ], + "status": "DEPRECATED" + }, + "20221021-managed-pool": { + "contracts": [ + { + "name": "ManagedPoolAddRemoveTokenLib", + "address": "0xE42FFA682A26EF8F25891db4882932711D42e467" + }, + { + "name": "CircuitBreakerLib", + "address": "0x956CCab09898C0AF2aCa5e6C229c3aD4E93d9288" + }, + { + "name": "ManagedPoolFactory", + "address": "0x9Ac3E70dB606659Bf32D4BdFbb687AD193FD1F5B" + } + ], + "status": "DEPRECATED" + }, + "20221122-composable-stable-pool-v2": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x85a80afee867aDf27B50BdB7b76DA70f1E853062" + }, + { + "name": "MockComposableStablePool", + "address": "0x373b347bc87998b151A5E9B6bB6ca692b766648a" + } + ], + "status": "DEPRECATED" + }, + "20221123-pool-recovery-helper": { + "contracts": [ + { + "name": "PoolRecoveryHelper", + "address": "0x1b300C86980a5195bCF49bD419A068D98dC133Db" + } + ], + "status": "ACTIVE" + }, + "20221124-authorizer-adaptor-entrypoint": { + "contracts": [ + { + "name": "AuthorizerAdaptorEntrypoint", + "address": "0xf5dECDB1f3d1ee384908Fbe16D2F0348AE43a9eA" + } + ], + "status": "ACTIVE" + }, + "20221202-timelock-authorizer": { + "contracts": [ + { + "name": "TimelockAuthorizerMigrator", + "address": "0xf8ee6f1F9B54F9b2C192D703ea2d22112cBC062b" + }, + { + "name": "TimelockAuthorizer", + "address": "0x9E3cD0606Db55ac68845bB60121847823712ae05" + } + ], + "status": "DEPRECATED" + }, + "20221205-veboost-v2": { + "contracts": [ + { + "name": "VeBoostV2", + "address": "0x67F8DF125B796B05895a6dc8Ecf944b9556ecb0B" + } + ], + "status": "ACTIVE" + }, + "20221207-aave-rebalanced-linear-pool-v3": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0x7d833FEF5BB92ddb578DA85fc0c35cD5Cc00Fb3e" + }, + { + "name": "MockAaveLendingPool", + "address": "0x9061D0D56F162D3de7f855828A34ace1eEd3a5BE" + }, + { + "name": "MockStaticAToken", + "address": "0xf9F5E0f3f74F57755a8c8be7b2FeDcAa40673080" + }, + { + "name": "MockAaveLinearPool", + "address": "0x813E3fE1761f714c502d1d2d3a7CCEB33f37F59D" + } + ], + "status": "DEPRECATED" + }, + "20230109-gauge-adder-migration-v2-to-v3": { + "contracts": [ + { + "name": "GaugeAdderMigrationCoordinator", + "address": "0xE0f34c6AD719e6877062B7D97E12c61c096509AF" + } + ], + "status": "SCRIPT" + }, + "20230109-gauge-adder-v3": { + "contracts": [ + { + "name": "GaugeAdder", + "address": "0x5efBb12F01f27F0E020565866effC1dA491E91A4" + } + ], + "status": "DEPRECATED" + }, + "20230130-ta-transition-migrator": { + "contracts": [ + { + "name": "TimelockAuthorizerTransitionMigrator", + "address": "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6" + } + ], + "status": "SCRIPT" + }, + "20230206-aave-rebalanced-linear-pool-v4": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88" + }, + { + "name": "MockAaveLendingPool", + "address": "0x9dd5Db2d38b50bEF682cE532bCca5DfD203915E1" + }, + { + "name": "MockStaticAToken", + "address": "0x9805dcfD25e6De36bad8fe9D3Fe2c9b44B764102" + }, + { + "name": "MockAaveLinearPool", + "address": "0x331d50e0b00fc1C32742F151E56B9B616227E23E" + } + ], + "status": "DEPRECATED" + }, + "20230206-composable-stable-pool-v3": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0xdba127fBc23fb20F5929C546af220A991b5C6e01" + }, + { + "name": "MockComposableStablePool", + "address": "0x222bc81C6F3C17e9e9Aba47a12f55a1Dea42f163" + } + ], + "status": "DEPRECATED" + }, + "20230206-erc4626-linear-pool-v3": { + "contracts": [ + { + "name": "ERC4626LinearPoolFactory", + "address": "0x67A25ca2350Ebf4a0C475cA74C257C94a373b828" + }, + { + "name": "MockERC4626Token", + "address": "0xE605Dbe1cA85dCdb8F43CEfA427f3B0fC06f6ba6" + }, + { + "name": "MockERC4626LinearPool", + "address": "0xfeF969638C52899f91781f1Be594aF6f40B99BAd" + } + ], + "status": "DEPRECATED" + }, + "20230206-weighted-pool-v3": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0x5Dd94Da3644DDD055fcf6B3E1aa310Bb7801EB8b" + }, + { + "name": "MockWeightedPool", + "address": "0x1576d472d82A72a1Ec7C57FcA770BD752D124A62" + } + ], + "status": "DEPRECATED" + }, + "20230208-euler-linear-pool": { + "contracts": [ + { + "name": "EulerLinearPoolFactory", + "address": "0x5F43FBa61f63Fa6bFF101a0A0458cEA917f6B347" + }, + { + "name": "MockEulerToken", + "address": "0xC101dcA301a4011C1F925e9622e749e550a1B667" + }, + { + "name": "MockEulerLinearPool", + "address": "0xDEC02e6642e2c999aF429F5cE944653CAd15e093" + } + ], + "status": "ACTIVE" + }, + "20230213-gearbox-linear-pool": { + "contracts": [ + { + "name": "GearboxLinearPoolFactory", + "address": "0x2EbE41E1aa44D61c206A94474932dADC7D3FD9E3" + }, + { + "name": "MockGearboxVault", + "address": "0x7ADbdabaA80F654568421887c12F09E0C7BD9629" + }, + { + "name": "MockGearboxDieselToken", + "address": "0x4bE0E4d6184348c5BA845a4010528CFC779610b8" + }, + { + "name": "MockGearboxLinearPool", + "address": "0xa8b103A10A94f4f2D7Ed2FdCd5545E8075573307" + } + ], + "status": "DEPRECATED" + }, + "20230213-yearn-linear-pool": { + "contracts": [ + { + "name": "YearnLinearPoolFactory", + "address": "0x8b7854708c0C54f9D7d1FF351D4F84E6dE0E134C" + }, + { + "name": "MockYearnTokenVault", + "address": "0x5C5fCf8fBd4cd563cED27e7D066b88ee20E1867A" + }, + { + "name": "MockYearnLinearPool", + "address": "0x0a0fb4ff697de5ac5b6770cd8ee1b72af80b57cf" + } + ], + "status": "DEPRECATED" + }, + "20230215-single-recipient-gauge-factory-v2": { + "contracts": [ + { + "name": "SingleRecipientGaugeFactory", + "address": "0x4fb47126Fa83A8734991E41B942Ac29A3266C968" + }, + { + "name": "SingleRecipientGauge", + "address": "0xb2007B8B7E0260042517f635CFd8E6dD2Dd7f007" + } + ], + "status": "ACTIVE" + }, + "20230217-gnosis-root-gauge-factory": { + "contracts": [ + { + "name": "GnosisRootGaugeFactory", + "address": "0x2a18B396829bc29F66a1E59fAdd7a0269A6605E8" + }, + { + "name": "GnosisRootGauge", + "address": "0x05277CE7D1e365d660624612d8b8b9B55bFD4518" + } + ], + "status": "ACTIVE" + }, + "20230222-merkle-orchard-v2": { + "contracts": [ + { + "name": "MerkleOrchard", + "address": "0xE3881627B8DeeBCCF9c23B291430a549Fc0bE5F7" + } + ], + "status": "ACTIVE" + }, + "20230223-protocol-id-registry": { + "contracts": [ + { + "name": "ProtocolIdRegistry", + "address": "0xc3ccacE87f6d3A81724075ADcb5ddd85a8A1bB68" + } + ], + "status": "ACTIVE" + }, + "20230314-batch-relayer-v5": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0xf77018c0d817dA22caDbDf504C00c0d32cE1e5C2" + }, + { + "name": "BalancerRelayer", + "address": "0xfeA793Aa415061C483D2390414275AD314B3F621" + } + ], + "status": "ACTIVE" + }, + "20230315-silo-linear-pool": { + "contracts": [ + { + "name": "SiloLinearPoolFactory", + "address": "0xfd1c0e6f02f71842b6ffF7CdC7A017eE1Fd3CdAC" + }, + { + "name": "MockSiloRepository", + "address": "0xdB6dF721A6E7Fdb97363079B01F107860Ac156F9" + }, + { + "name": "MockSilo", + "address": "0xE719Aef17468c7e10c0c205be62C990754DFF7E5" + }, + { + "name": "MockShareToken", + "address": "0xBc4099300E69Ff4e52F3b18728054EF00449b9e5" + }, + { + "name": "MockSiloLinearPool", + "address": "0x395d8A1D9aD82B5ABE558F8AbbFe183B27138af4" + } + ], + "status": "DEPRECATED" + }, + "20230320-composable-stable-pool-v4": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0xfADa0f4547AB2de89D1304A668C39B3E09Aa7c76" + }, + { + "name": "MockComposableStablePool", + "address": "0x5537f945D8c3FCFDc1b8DECEEBD220FAD26aFdA8" + } + ], + "status": "DEPRECATED" + }, + "20230320-weighted-pool-v4": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0x897888115Ada5773E02aA29F775430BFB5F34c51" + }, + { + "name": "MockWeightedPool", + "address": "0x8055b8C947De30130BC1Ec750C8F345a50006B23" + } + ], + "status": "ACTIVE" + }, + "20230409-erc4626-linear-pool-v4": { + "contracts": [ + { + "name": "ERC4626LinearPoolFactory", + "address": "0x813EE7a840CE909E7Fea2117A44a90b8063bd4fd" + }, + { + "name": "MockERC4626Token", + "address": "0xB99eDc4b289B0F2284fCF3f66884191BdCe29624" + }, + { + "name": "MockERC4626LinearPool", + "address": "0x9516a2d25958EdB8da246a320f2c7d94A0DBe25d" + } + ], + "status": "ACTIVE" + }, + "20230409-gearbox-linear-pool-v2": { + "contracts": [ + { + "name": "GearboxLinearPoolFactory", + "address": "0x39A79EB449Fc05C92c39aA6f0e9BfaC03BE8dE5B" + }, + { + "name": "MockGearboxVault", + "address": "0xC7B779AB638b7A59f490ac95199502343a81E006" + }, + { + "name": "MockGearboxDieselToken", + "address": "0xb7A32B67AAdB3866cC5c2FaBc6C6aB8a9027c3c1" + }, + { + "name": "MockGearboxLinearPool", + "address": "0x0d05Aac44aC7Dd3c7ba5d50Be93EB884A057d234" + } + ], + "status": "ACTIVE" + }, + "20230409-yearn-linear-pool-v2": { + "contracts": [ + { + "name": "YearnLinearPoolFactory", + "address": "0x5F5222Ffa40F2AEd6380D022184D6ea67C776eE0" + }, + { + "name": "MockYearnTokenVault", + "address": "0x806E02Dea8d4a0882caD9fA3Fa75B212328692dE" + }, + { + "name": "MockYearnLinearPool", + "address": "0xAC5B4EF7eDe2F2843a704E96dcAA637F4BA3Dc3f" + } + ], + "status": "ACTIVE" + }, + "20230410-aave-linear-pool-v5": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0x0b576c1245F479506e7C8bbc4dB4db07C1CD31F9" + }, + { + "name": "MockAaveLendingPool", + "address": "0x28fa1E40011aDF98898E8243B2a48BB21EbF0C29" + }, + { + "name": "MockStaticAToken", + "address": "0x1F3C910c416eD2340150281C5eB93325C38817A1" + }, + { + "name": "MockAaveLinearPool", + "address": "0x4cE277Df0FeB5B4d07a0ca2ADCf5326E4005239d" + } + ], + "status": "ACTIVE" + }, + "20230410-silo-linear-pool-v2": { + "contracts": [ + { + "name": "SiloLinearPoolFactory", + "address": "0x4E11AEec21baF1660b1a46472963cB3DA7811C89" + }, + { + "name": "MockSiloRepository", + "address": "0x8E2DfC5E111dbe14E9d725210b9342688Dd51c6c" + }, + { + "name": "MockSilo", + "address": "0x66c94AE8D795E98F69Ca65FFaC87B38B17Be3ca2" + }, + { + "name": "MockShareToken", + "address": "0x192E67544694a7bAA2DeA94f9B1Df58BB3395A12" + }, + { + "name": "MockSiloLinearPool", + "address": "0x74CBfAF94A3577c539a9dCEE9870A6349a33b34f" + } + ], + "status": "ACTIVE" + }, + "20230411-managed-pool-v2": { + "contracts": [ + { + "name": "ManagedPoolAddRemoveTokenLib", + "address": "0x4148bf5B0688eD0a87F317c6534Cb841f503349e" + }, + { + "name": "CircuitBreakerLib", + "address": "0x4967b3353Cdf9E5C67421a3890d35f2f3BB50527" + }, + { + "name": "ManagedPoolAmmLib", + "address": "0xb37646ACBb1A91287721B2CdBe01BA0DbA5E57A2" + }, + { + "name": "ExternalWeightedMath", + "address": "0x3db89f0CA3b388f2BcDbccD2ff8E13C22459CF75" + }, + { + "name": "RecoveryModeHelper", + "address": "0x7827108Af2fd9910EA7cf361d9b827941FA7D809" + }, + { + "name": "ManagedPoolFactory", + "address": "0xBF904F9F340745B4f0c4702c7B6Ab1e808eA6b93" + }, + { + "name": "MockManagedPool", + "address": "0xD0cbF6765997b7CA7Be6440F5E305B2ec7B96065" + } + ], + "status": "ACTIVE" + }, + "20230414-authorizer-wrapper": { + "contracts": [ + { + "name": "AuthorizerWithAdaptorValidation", + "address": "0x6048A8c631Fb7e77EcA533Cf9C29784e482391e7" + } + ], + "status": "ACTIVE" + }, + "20230504-vebal-remapper": { + "contracts": [ + { + "name": "OmniVotingEscrowAdaptor", + "address": "0x96484f2aBF5e58b15176dbF1A799627B53F13B6d" + }, + { + "name": "VotingEscrowRemapper", + "address": "0x83E443EF4f9963C77bd860f94500075556668cb8" + } + ], + "status": "ACTIVE" + }, + "20230519-gauge-adder-migration-v3-to-v4": { + "contracts": [ + { + "name": "GaugeAdderMigrationCoordinator", + "address": "0x3f170631ed9821Ca51A59D996aB095162438DC10" + } + ], + "status": "SCRIPT" + }, + "20230519-gauge-adder-v4": { + "contracts": [ + { + "name": "GaugeAdder", + "address": "0x5DbAd78818D4c8958EfF2d5b95b28385A22113Cd" + } + ], + "status": "ACTIVE" + }, + "20230526-gauge-working-balance-helper": { + "contracts": [ + { + "name": "GaugeWorkingBalanceHelper", + "address": "0xdAB2583911E872a00A851fB80dCC78a4B46BA57c" + } + ], + "status": "ACTIVE" + }, + "20230526-zkevm-root-gauge-factory": { + "contracts": [ + { + "name": "PolygonZkEVMRootGaugeFactory", + "address": "0x9bF951848288cCD87d06FaC426150262cD3447De" + }, + { + "name": "PolygonZkEVMRootGauge", + "address": "0x45bF48D996d22afc9BC150DF7FB4d13A49088602" + } + ], + "status": "ACTIVE" + }, + "20230527-l2-gauge-checkpointer": { + "contracts": [ + { + "name": "L2GaugeCheckpointer", + "address": "0x343688C5cB92115a52cA485af7f62B4B7A2e9CcC" + } + ], + "status": "DEPRECATED" + }, + "20230529-avalanche-root-gauge-factory": { + "contracts": [ + { + "name": "AvalancheRootGaugeFactory", + "address": "0x10f3e79911A490aa5B5D5CDA6F111029c4Eab5AC" + }, + { + "name": "AvalancheRootGauge", + "address": "0xc57b4BE50BF6BBe5f6a4fE379DA342B32b37bF2f" + } + ], + "status": "DEPRECATED" + }, + "20230613-balancer-pool-data-queries": { + "contracts": [ + { + "name": "BalancerPoolDataQueries", + "address": "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089" + } + ], + "status": "ACTIVE" + }, + "20230711-composable-stable-pool-v5": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0xDB8d758BCb971e482B2C45f7F8a7740283A1bd3A" + }, + { + "name": "MockComposableStablePool", + "address": "0x20356663C17D31549d1210379749E2aE36722D8f" + } + ], + "status": "ACTIVE" + }, + "20230717-chainlink-rate-provider-factory": { + "contracts": [ + { + "name": "ChainlinkRateProviderFactory", + "address": "0x1311Fbc9F60359639174c1e7cC2032DbDb5Cc4d1" + } + ], + "status": "ACTIVE" + }, + "20230731-stakeless-gauge-checkpointer": { + "contracts": [ + { + "name": "StakelessGaugeCheckpointer", + "address": "0x0f08eEf2C785AA5e7539684aF04755dEC1347b7c" + } + ], + "status": "DEPRECATED" + }, + "20230811-avalanche-root-gauge-factory-v2": { + "contracts": [ + { + "name": "AvalancheRootGaugeFactory", + "address": "0x22625eEDd92c81a219A83e1dc48f88d54786B017" + }, + { + "name": "AvalancheRootGauge", + "address": "0x3Eae4a1c2E36870A006E816930d9f55DF0a72a13" + } + ], + "status": "ACTIVE" + }, + "20230911-base-root-gauge-factory": { + "contracts": [ + { + "name": "BaseRootGaugeFactory", + "address": "0x8e3B64b3737097F283E965869e3503AA20F31E4D" + }, + { + "name": "BaseRootGauge", + "address": "0x9a4d642b9876231BB9062559521A48097abFe6CB" + } + ], + "status": "ACTIVE" + }, + "20230915-stakeless-gauge-checkpointer-v2": { + "contracts": [ + { + "name": "StakelessGaugeCheckpointer", + "address": "0x0C8f71D19f87c0bD1b9baD2484EcC3388D5DbB98" + } + ], + "status": "ACTIVE" + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/addresses/mode.json b/balpy/balancer-deployments/addresses/mode.json new file mode 100644 index 0000000..441501f --- /dev/null +++ b/balpy/balancer-deployments/addresses/mode.json @@ -0,0 +1,262 @@ +{ + "20210418-authorizer": { + "contracts": [ + { + "name": "Authorizer", + "address": "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5" + } + ], + "status": "ACTIVE", + "version": "v2" + }, + "20210418-vault": { + "contracts": [ + { + "name": "Vault", + "address": "0xBA12222222228d8Ba445958a75a0704d566BF2C8" + }, + { + "name": "ProtocolFeesCollector", + "address": "0xce88686553686DA562CE7Cea497CE749DA109f9F" + }, + { + "name": "BalancerHelpers", + "address": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9" + } + ], + "status": "ACTIVE", + "version": "v2" + }, + "20211202-no-protocol-fee-lbp": { + "contracts": [ + { + "name": "NoProtocolFeeLiquidityBootstrappingPoolFactory", + "address": "0xE42FFA682A26EF8F25891db4882932711D42e467" + }, + { + "name": "MockLiquidityBootstrappingPool", + "address": "0x197868C915E50cD7eB34EB2F56009E0BF9aa09EB" + } + ], + "status": "ACTIVE", + "version": "v2" + }, + "20220325-authorizer-adaptor": { + "contracts": [ + { + "name": "AuthorizerAdaptor", + "address": "0xf23b4DB826DbA14c0e857029dfF076b1c0264843" + } + ], + "status": "ACTIVE", + "version": "v2" + }, + "20220517-protocol-fee-withdrawer": { + "contracts": [ + { + "name": "ProtocolFeesWithdrawer", + "address": "0x9Ac3E70dB606659Bf32D4BdFbb687AD193FD1F5B" + } + ], + "status": "ACTIVE", + "version": "v2" + }, + "20220721-balancer-queries": { + "contracts": [ + { + "name": "BalancerQueries", + "address": "0x36caC20dd805d128c1a6Dd16eeA845C574b5A17C" + } + ], + "status": "ACTIVE", + "version": "v2" + }, + "20220725-protocol-fee-percentages-provider": { + "contracts": [ + { + "name": "ProtocolFeePercentagesProvider", + "address": "0x85a80afee867aDf27B50BdB7b76DA70f1E853062" + } + ], + "status": "ACTIVE", + "version": "v2" + }, + "20221123-pool-recovery-helper": { + "contracts": [ + { + "name": "PoolRecoveryHelper", + "address": "0x4132f7AcC9dB7A6cF7BE2Dd3A9DC8b30C7E6E6c8" + } + ], + "status": "ACTIVE", + "version": "v2" + }, + "20221124-authorizer-adaptor-entrypoint": { + "contracts": [ + { + "name": "AuthorizerAdaptorEntrypoint", + "address": "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6" + } + ], + "status": "ACTIVE", + "version": "v2" + }, + "20230223-protocol-id-registry": { + "contracts": [ + { + "name": "ProtocolIdRegistry", + "address": "0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88" + } + ], + "status": "ACTIVE", + "version": "v2" + }, + "20230316-child-chain-gauge-factory-v2": { + "contracts": [ + { + "name": "ChildChainGauge", + "address": "0xE3881627B8DeeBCCF9c23B291430a549Fc0bE5F7" + }, + { + "name": "ChildChainGaugeFactory", + "address": "0x4fb47126Fa83A8734991E41B942Ac29A3266C968" + } + ], + "status": "ACTIVE", + "version": "v2" + }, + "20230316-l2-balancer-pseudo-minter": { + "contracts": [ + { + "name": "L2BalancerPseudoMinter", + "address": "0x5cF4928a3205728bd12830E1840F7DB85c62a4B9" + } + ], + "status": "ACTIVE", + "version": "v2" + }, + "20230316-l2-ve-delegation-proxy": { + "contracts": [ + { + "name": "NullVotingEscrow", + "address": "0x9dd5Db2d38b50bEF682cE532bCca5DfD203915E1" + }, + { + "name": "VotingEscrowDelegationProxy", + "address": "0x9805dcfD25e6De36bad8fe9D3Fe2c9b44B764102" + } + ], + "status": "ACTIVE", + "version": "v2" + }, + "20230320-weighted-pool-v4": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0xc3ccacE87f6d3A81724075ADcb5ddd85a8A1bB68" + }, + { + "name": "MockWeightedPool", + "address": "0xCb528CFe5EfC65a77901d20B3E899Ecd9A8190b7" + } + ], + "status": "ACTIVE", + "version": "v2" + }, + "20230411-managed-pool-v2": { + "contracts": [ + { + "name": "ManagedPoolAddRemoveTokenLib", + "address": "0x81cFAE226343B24BA12EC6521Db2C79E7aeeb310" + }, + { + "name": "CircuitBreakerLib", + "address": "0xa523f47A933D5020b23629dDf689695AA94612Dc" + }, + { + "name": "ManagedPoolAmmLib", + "address": "0x6817149cb753BF529565B4D023d7507eD2ff4Bc0" + }, + { + "name": "ExternalWeightedMath", + "address": "0x6B5dA774890Db7B7b96C6f44e6a4b0F657399E2e" + }, + { + "name": "RecoveryModeHelper", + "address": "0x7Ba29fE8E83dd6097A7298075C4AFfdBda3121cC" + }, + { + "name": "ManagedPoolFactory", + "address": "0x043A2daD730d585C44FB79D2614F295D2d625412" + }, + { + "name": "MockManagedPool", + "address": "0xB227B52B20a755B8b724c63E8Ac8d42Ff0FD64Fd" + } + ], + "status": "ACTIVE", + "version": "v2" + }, + "20230414-authorizer-wrapper": { + "contracts": [ + { + "name": "AuthorizerWithAdaptorValidation", + "address": "0x013D4382F291be5688AFBcc741Ee8A24C66B2C92" + } + ], + "status": "ACTIVE", + "version": "v2" + }, + "20230613-balancer-pool-data-queries": { + "contracts": [ + { + "name": "BalancerPoolDataQueries", + "address": "0x7A2535f5fB47b8e44c02Ef5D9990588313fe8F05" + } + ], + "status": "ACTIVE", + "version": "v2" + }, + "20230717-chainlink-rate-provider-factory": { + "contracts": [ + { + "name": "ChainlinkRateProviderFactory", + "address": "0x96484f2aBF5e58b15176dbF1A799627B53F13B6d" + } + ], + "status": "ACTIVE", + "version": "v2" + }, + "20231031-batch-relayer-v6": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x662112B8CB18889e81459b92CA0f894a2ef2c1B8" + }, + { + "name": "BatchRelayerQueryLibrary", + "address": "0x4DdFc173C8F67808AE8F7913DccFfa6bdBFE5b0e" + }, + { + "name": "BalancerRelayer", + "address": "0xb541765F540447646A9545E0A4800A0Bacf9E13D" + } + ], + "status": "ACTIVE", + "version": "v2" + }, + "20240223-composable-stable-pool-v6": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x5DbAd78818D4c8958EfF2d5b95b28385A22113Cd" + }, + { + "name": "MockComposableStablePool", + "address": "0xaFCFA565B8e00A3b3EB789dfa19261ed7DCA42C7" + } + ], + "status": "ACTIVE", + "version": "v2" + } + } \ No newline at end of file diff --git a/balpy/balancer-deployments/addresses/optimism.json b/balpy/balancer-deployments/addresses/optimism.json new file mode 100644 index 0000000..b06d894 --- /dev/null +++ b/balpy/balancer-deployments/addresses/optimism.json @@ -0,0 +1,642 @@ +{ + "20210418-authorizer": { + "contracts": [ + { + "name": "Authorizer", + "address": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" + } + ], + "status": "ACTIVE" + }, + "20210418-vault": { + "contracts": [ + { + "name": "Vault", + "address": "0xBA12222222228d8Ba445958a75a0704d566BF2C8" + }, + { + "name": "BalancerHelpers", + "address": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9" + }, + { + "name": "ProtocolFeesCollector", + "address": "0xce88686553686DA562CE7Cea497CE749DA109f9F" + } + ], + "status": "ACTIVE" + }, + "20210418-weighted-pool": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca" + }, + { + "name": "WeightedPool2TokensFactory", + "address": "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e" + } + ], + "status": "DEPRECATED" + }, + "20210624-stable-pool": { + "contracts": [ + { + "name": "StablePoolFactory", + "address": "0x41B953164995c11C81DA73D212ED8Af25741b7Ac" + } + ], + "status": "DEPRECATED" + }, + "20210727-meta-stable-pool": { + "contracts": [ + { + "name": "QueryProcessor", + "address": "0xD7FAD3bd59D6477cbe1BE7f646F7f1BA25b230f8" + }, + { + "name": "MetaStablePoolFactory", + "address": "0xb08E16cFc07C684dAA2f93C70323BAdb2A6CBFd2" + } + ], + "status": "DEPRECATED" + }, + "20211202-no-protocol-fee-lbp": { + "contracts": [ + { + "name": "NoProtocolFeeLiquidityBootstrappingPoolFactory", + "address": "0xf302f9F50958c5593770FDf4d4812309fF77414f" + } + ], + "status": "ACTIVE" + }, + "20220325-authorizer-adaptor": { + "contracts": [ + { + "name": "AuthorizerAdaptor", + "address": "0x8F42aDBbA1B16EaAE3BB5754915E0D06059aDd75" + } + ], + "status": "ACTIVE" + }, + "20220404-erc4626-linear-pool-v2": { + "contracts": [ + { + "name": "ERC4626LinearPoolFactory", + "address": "0x4C4287b07d293E361281bCeEe8715c8CDeB64E34" + } + ], + "status": "DEPRECATED" + }, + "20220413-child-chain-gauge-factory": { + "contracts": [ + { + "name": "RewardsOnlyGauge", + "address": "0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD" + }, + { + "name": "ChildChainStreamer", + "address": "0x239e55F427D44C3cc793f49bFB507ebe76638a2b" + }, + { + "name": "ChildChainLiquidityGaugeFactory", + "address": "0x2E96068b3D5B5BAE3D7515da4A1D2E52d08A2647" + } + ], + "status": "ACTIVE" + }, + "20220425-unbutton-aave-linear-pool": { + "contracts": [ + { + "name": "UnbuttonAaveLinearPoolFactory", + "address": "0x6d471c05f8A99Bd8f991467A8283e3DC968b8D7c" + } + ], + "status": "DEPRECATED" + }, + "20220513-double-entrypoint-fix-relayer": { + "contracts": [ + { + "name": "DoubleEntrypointFixRelayer", + "address": "0x3b8cA519122CdD8efb272b0D3085453404B25bD0" + } + ], + "status": "ACTIVE" + }, + "20220517-protocol-fee-withdrawer": { + "contracts": [ + { + "name": "ProtocolFeesWithdrawer", + "address": "0xC128a9954e6c874eA3d62ce62B468bA073093F25" + } + ], + "status": "ACTIVE" + }, + "20220527-child-chain-gauge-token-adder": { + "contracts": [ + { + "name": "ChildChainGaugeTokenAdder", + "address": "0x6f5a2eE11E7a772AeB5114A20d0D7c0ff61EB8A0" + } + ], + "status": "ACTIVE" + }, + "20220609-stable-pool-v2": { + "contracts": [ + { + "name": "StablePoolFactory", + "address": "0xeb151668006CD04DAdD098AFd0a82e78F77076c3" + } + ], + "status": "DEPRECATED" + }, + "20220610-snx-recovery-coordinator": { + "contracts": [ + { + "name": "SNXRecoveryCoordinator", + "address": "0x1cbbE6cEa5E4fE7D69c586b4e362A646DEEf105d" + } + ], + "status": "SCRIPT" + }, + "20220720-batch-relayer-v3": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x5c89d9E1A668d0B39F4EC242F280bdDd445C633c" + }, + { + "name": "BalancerRelayer", + "address": "0x195CcCBE464EF9073d1f7A1ba1C9Bf0f56dfFFff" + } + ], + "status": "DEPRECATED" + }, + "20220721-balancer-queries": { + "contracts": [ + { + "name": "BalancerQueries", + "address": "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5" + } + ], + "status": "ACTIVE" + }, + "20220725-protocol-fee-percentages-provider": { + "contracts": [ + { + "name": "ProtocolFeePercentagesProvider", + "address": "0xacAaC3e6D6Df918Bf3c809DFC7d42de0e4a72d4C" + } + ], + "status": "ACTIVE" + }, + "20220812-child-chain-reward-helper": { + "contracts": [ + { + "name": "ChildChainGaugeRewardHelper", + "address": "0x8aB784368A1883DA90D8513b48801e2Db1cb2D5D" + } + ], + "status": "ACTIVE" + }, + "20220817-aave-rebalanced-linear-pool": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0x994086630773dC6cB54D3A5E0Ef0963532789E75" + } + ], + "status": "DEPRECATED" + }, + "20220906-composable-stable-pool": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0xf145caFB67081895EE80eB7c04A30Cf87f07b745" + } + ], + "status": "DEPRECATED" + }, + "20220908-weighted-pool-v2": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0xad901309d9e9DbC5Df19c84f729f429F0189a633" + } + ], + "status": "DEPRECATED" + }, + "20220916-batch-relayer-v4": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x8E5698dC4897DC12243c8642e77B4f21349Db97C" + }, + { + "name": "BalancerRelayer", + "address": "0x1a58897Ab366082028ced3740900ecBD765Af738" + } + ], + "status": "DEPRECATED" + }, + "20221021-managed-pool": { + "contracts": [ + { + "name": "ManagedPoolAddRemoveTokenLib", + "address": "0xF24917fB88261a37Cc57F686eBC831a5c0B9fD39" + }, + { + "name": "CircuitBreakerLib", + "address": "0xE42FFA682A26EF8F25891db4882932711D42e467" + }, + { + "name": "ManagedPoolFactory", + "address": "0x956CCab09898C0AF2aCa5e6C229c3aD4E93d9288" + } + ], + "status": "DEPRECATED" + }, + "20221122-composable-stable-pool-v2": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x85a80afee867aDf27B50BdB7b76DA70f1E853062" + }, + { + "name": "MockComposableStablePool", + "address": "0x373b347bc87998b151A5E9B6bB6ca692b766648a" + } + ], + "status": "DEPRECATED" + }, + "20221123-pool-recovery-helper": { + "contracts": [ + { + "name": "PoolRecoveryHelper", + "address": "0x26743984e3357eFC59f2fd6C1aFDC310335a61c9" + } + ], + "status": "ACTIVE" + }, + "20221124-authorizer-adaptor-entrypoint": { + "contracts": [ + { + "name": "AuthorizerAdaptorEntrypoint", + "address": "0xed86ff0c507D3AF5F35d3523B77C17415FCfFaCb" + } + ], + "status": "ACTIVE" + }, + "20221207-aave-rebalanced-linear-pool-v3": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0xAd3CC7852382C09fdCE54784292c6aB7fb9Df917" + }, + { + "name": "MockAaveLendingPool", + "address": "0x56017074321ce77E2F88F2233830f5b29d4cf595" + }, + { + "name": "MockStaticAToken", + "address": "0xcA96C4f198d343E251b1a01F3EBA061ef3DA73C1" + }, + { + "name": "MockAaveLinearPool", + "address": "0x5936497ffE0dBA0eF272D6301D65c0122862971A" + } + ], + "status": "DEPRECATED" + }, + "20230206-aave-rebalanced-linear-pool-v4": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0xf23b4DB826DbA14c0e857029dfF076b1c0264843" + }, + { + "name": "MockAaveLendingPool", + "address": "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6" + }, + { + "name": "MockStaticAToken", + "address": "0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88" + }, + { + "name": "MockAaveLinearPool", + "address": "0x11884dA90FB4221b3aa288a7741C51eC4Fc43B2f" + } + ], + "status": "DEPRECATED" + }, + "20230206-composable-stable-pool-v3": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0xe2E901AB09f37884BA31622dF3Ca7FC19AA443Be" + }, + { + "name": "MockComposableStablePool", + "address": "0x9BF7c3b63c77b4B4F2717776F15A4bec1b532a28" + } + ], + "status": "DEPRECATED" + }, + "20230206-erc4626-linear-pool-v3": { + "contracts": [ + { + "name": "ERC4626LinearPoolFactory", + "address": "0xa3B9515A9c557455BC53F7a535A85219b59e8B2E" + }, + { + "name": "MockERC4626Token", + "address": "0x62aaB12865d7281048c337D53a4dde9d770321E6" + }, + { + "name": "MockERC4626LinearPool", + "address": "0xf984eb2B8a7eF780245a797A2fCcd82f346409ca" + } + ], + "status": "DEPRECATED" + }, + "20230206-weighted-pool-v3": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0xA0DAbEBAAd1b243BBb243f933013d560819eB66f" + }, + { + "name": "MockWeightedPool", + "address": "0xbC99aa9bD55d3f8431Ecec24Da03AEc1D6e62754" + } + ], + "status": "DEPRECATED" + }, + "20230213-yearn-linear-pool": { + "contracts": [ + { + "name": "YearnLinearPoolFactory", + "address": "0xD8B6b96c88ad626EB6209c4876e3B14f45f8803A" + }, + { + "name": "MockYearnTokenVault", + "address": "0x1b986138a4F2aA538E79fdEC222dad93F8d66703" + }, + { + "name": "MockYearnLinearPool", + "address": "0x81fC12C60ee5b753cf5fD0ADC342dFb5f3817E32" + } + ], + "status": "DEPRECATED" + }, + "20230223-protocol-id-registry": { + "contracts": [ + { + "name": "ProtocolIdRegistry", + "address": "0x9805dcfD25e6De36bad8fe9D3Fe2c9b44B764102" + } + ], + "status": "ACTIVE" + }, + "20230314-batch-relayer-v5": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B" + }, + { + "name": "BalancerRelayer", + "address": "0x03F1ab8b19bcE21EB06C364aEc9e40322572a1e9" + } + ], + "status": "ACTIVE" + }, + "20230316-child-chain-gauge-factory-v2": { + "contracts": [ + { + "name": "ChildChainGauge", + "address": "0x81cFAE226343B24BA12EC6521Db2C79E7aeeb310" + }, + { + "name": "ChildChainGaugeFactory", + "address": "0xa523f47A933D5020b23629dDf689695AA94612Dc" + } + ], + "status": "ACTIVE" + }, + "20230316-l2-balancer-pseudo-minter": { + "contracts": [ + { + "name": "L2BalancerPseudoMinter", + "address": "0x4fb47126Fa83A8734991E41B942Ac29A3266C968" + } + ], + "status": "ACTIVE" + }, + "20230316-l2-ve-delegation-proxy": { + "contracts": [ + { + "name": "NullVotingEscrow", + "address": "0xc3ccacE87f6d3A81724075ADcb5ddd85a8A1bB68" + }, + { + "name": "VotingEscrowDelegationProxy", + "address": "0x9dA18982a33FD0c7051B19F0d7C76F2d5E7e017c" + } + ], + "status": "ACTIVE" + }, + "20230320-composable-stable-pool-v4": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x1802953277FD955f9a254B80Aa0582f193cF1d77" + }, + { + "name": "MockComposableStablePool", + "address": "0x11A4cF51Bb0Bb4D925CAdFDA61FcDA952d64889C" + } + ], + "status": "DEPRECATED" + }, + "20230320-weighted-pool-v4": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a" + }, + { + "name": "MockWeightedPool", + "address": "0x62F5f9a446d198E8E4c84eE56e5217416720EdAF" + } + ], + "status": "ACTIVE" + }, + "20230404-l2-layer0-bridge-forwarder": { + "contracts": [ + { + "name": "L2LayerZeroBridgeForwarder", + "address": "0xbef13D1e54D0c79DA8B0AD704883E1Cea7EB2100" + } + ], + "status": "ACTIVE" + }, + "20230409-erc4626-linear-pool-v4": { + "contracts": [ + { + "name": "ERC4626LinearPoolFactory", + "address": "0x7ADbdabaA80F654568421887c12F09E0C7BD9629" + }, + { + "name": "MockERC4626Token", + "address": "0x4bE0E4d6184348c5BA845a4010528CFC779610b8" + }, + { + "name": "MockERC4626LinearPool", + "address": "0x2DA61Ef3Cdcb97efb0f7099c02527fabFe94Dee5" + } + ], + "status": "ACTIVE" + }, + "20230409-yearn-linear-pool-v2": { + "contracts": [ + { + "name": "YearnLinearPoolFactory", + "address": "0x19DFEF0a828EEC0c85FbB335aa65437417390b85" + }, + { + "name": "MockYearnTokenVault", + "address": "0xb15608d28eb43378A7e7780aDD3fE9bC132bAf40" + }, + { + "name": "MockYearnLinearPool", + "address": "0x34557eF500Bfc060B8e3f2DA58EF725Bb7D32202" + } + ], + "status": "ACTIVE" + }, + "20230410-aave-linear-pool-v5": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0x7396f99B48e7436b152427bfA3DD6Aa8C7C6d05B" + }, + { + "name": "MockAaveLendingPool", + "address": "0x533a16F90E7d3Ca31dbc608E5EC54967710F0D2A" + }, + { + "name": "MockStaticAToken", + "address": "0x8b7854708c0C54f9D7d1FF351D4F84E6dE0E134C" + }, + { + "name": "MockAaveLinearPool", + "address": "0x45d37982784F022A9864748b4E8750e1e7019604" + } + ], + "status": "ACTIVE" + }, + "20230411-managed-pool-v2": { + "contracts": [ + { + "name": "ManagedPoolAddRemoveTokenLib", + "address": "0x59562f93c447656F6E4799fC1FC7c3d977C3324F" + }, + { + "name": "CircuitBreakerLib", + "address": "0x2498A2B0d6462d2260EAC50aE1C3e03F4829BA95" + }, + { + "name": "ManagedPoolAmmLib", + "address": "0xDEd7Fef7D8eCdcB74F22f0169e1A9EC696e6695d" + }, + { + "name": "ExternalWeightedMath", + "address": "0x8df317a729fcaA260306d7de28888932cb579b88" + }, + { + "name": "RecoveryModeHelper", + "address": "0x3B1eb8EB7b43882b385aB30533D9A2BeF9052a98" + }, + { + "name": "ManagedPoolFactory", + "address": "0x4C32a8a8fDa4E24139B51b456B42290f51d6A1c4" + }, + { + "name": "MockManagedPool", + "address": "0xb4AF4fdd49da2A2BA9522EAdCF86D407a69f19c8" + } + ], + "status": "ACTIVE" + }, + "20230414-authorizer-wrapper": { + "contracts": [ + { + "name": "AuthorizerWithAdaptorValidation", + "address": "0xAcf05BE5134d64d150d153818F8C67EE36996650" + } + ], + "status": "ACTIVE" + }, + "20230525-l2-veboost-v2": { + "contracts": [ + { + "name": "VeBoostV2", + "address": "0x6817149cb753BF529565B4D023d7507eD2ff4Bc0" + } + ], + "status": "ACTIVE" + }, + "20230526-gauge-working-balance-helper": { + "contracts": [ + { + "name": "GaugeWorkingBalanceHelper", + "address": "0x9129E834e15eA19b6069e8f08a8EcFc13686B8dC" + } + ], + "status": "ACTIVE" + }, + "20230613-balancer-pool-data-queries": { + "contracts": [ + { + "name": "BalancerPoolDataQueries", + "address": "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089" + } + ], + "status": "ACTIVE" + }, + "20230711-composable-stable-pool-v5": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x043A2daD730d585C44FB79D2614F295D2d625412" + }, + { + "name": "MockComposableStablePool", + "address": "0x77A0Df59d1d73B12B07Bcded0611279D8801ee96" + } + ], + "status": "ACTIVE" + }, + "20230712-child-chain-gauge-checkpointer": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x96484f2aBF5e58b15176dbF1A799627B53F13B6d" + }, + { + "name": "BalancerRelayer", + "address": "0xFE1862BdCAf17ADf2D83eEb0Da98dAE04492F4f7" + } + ], + "status": "ACTIVE" + }, + "20230717-chainlink-rate-provider-factory": { + "contracts": [ + { + "name": "ChainlinkRateProviderFactory", + "address": "0x83E443EF4f9963C77bd860f94500075556668cb8" + } + ], + "status": "ACTIVE" + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/addresses/polygon.json b/balpy/balancer-deployments/addresses/polygon.json new file mode 100644 index 0000000..fddf03e --- /dev/null +++ b/balpy/balancer-deployments/addresses/polygon.json @@ -0,0 +1,722 @@ +{ + "20210418-authorizer": { + "contracts": [ + { + "name": "Authorizer", + "address": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" + } + ], + "status": "ACTIVE" + }, + "20210418-vault": { + "contracts": [ + { + "name": "Vault", + "address": "0xBA12222222228d8Ba445958a75a0704d566BF2C8" + }, + { + "name": "BalancerHelpers", + "address": "0x239e55F427D44C3cc793f49bFB507ebe76638a2b" + }, + { + "name": "ProtocolFeesCollector", + "address": "0xce88686553686DA562CE7Cea497CE749DA109f9F" + } + ], + "status": "ACTIVE" + }, + "20210418-weighted-pool": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9" + }, + { + "name": "WeightedPool2TokensFactory", + "address": "0xA5bf2ddF098bb0Ef6d120C98217dD6B141c74EE0" + } + ], + "status": "DEPRECATED" + }, + "20210624-stable-pool": { + "contracts": [ + { + "name": "StablePoolFactory", + "address": "0xc66Ba2B6595D3613CCab350C886aCE23866EDe24" + } + ], + "status": "DEPRECATED" + }, + "20210721-liquidity-bootstrapping-pool": { + "contracts": [ + { + "name": "LiquidityBootstrappingPoolFactory", + "address": "0x751A0bC0e3f75b38e01Cf25bFCE7fF36DE1C87DE" + } + ], + "status": "DEPRECATED" + }, + "20210727-meta-stable-pool": { + "contracts": [ + { + "name": "QueryProcessor", + "address": "0x72D07D7DcA67b8A406aD1Ec34ce969c90bFEE768" + }, + { + "name": "MetaStablePoolFactory", + "address": "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca" + } + ], + "status": "DEPRECATED" + }, + "20210907-investment-pool": { + "contracts": [ + { + "name": "InvestmentPoolFactory", + "address": "0x0f7bb7ce7b6ed9366F9b6B910AdeFE72dC538193" + } + ], + "status": "DEPRECATED" + }, + "20211012-merkle-orchard": { + "contracts": [ + { + "name": "MerkleOrchard", + "address": "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e" + } + ], + "status": "DEPRECATED" + }, + "20211202-no-protocol-fee-lbp": { + "contracts": [ + { + "name": "NoProtocolFeeLiquidityBootstrappingPoolFactory", + "address": "0x41B953164995c11C81DA73D212ED8Af25741b7Ac" + } + ], + "status": "ACTIVE" + }, + "20211203-batch-relayer": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x8F42aDBbA1B16EaAE3BB5754915E0D06059aDd75" + }, + { + "name": "BalancerRelayer", + "address": "0x4574ccBcC09A00C9eE55fB92Fe353699A4fA800e" + } + ], + "status": "DEPRECATED" + }, + "20211208-aave-linear-pool": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0xf302f9F50958c5593770FDf4d4812309fF77414f" + } + ], + "status": "DEPRECATED" + }, + "20211208-stable-phantom-pool": { + "contracts": [ + { + "name": "StablePhantomPoolFactory", + "address": "0xC128a9954e6c874eA3d62ce62B468bA073093F25" + } + ], + "status": "DEPRECATED" + }, + "20220304-erc4626-linear-pool": { + "contracts": [ + { + "name": "ERC4626LinearPoolFactory", + "address": "0xC6bD2497332d24094eC16a7261eec5C412B5a2C1" + } + ], + "status": "DEPRECATED" + }, + "20220318-batch-relayer-v2": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0xC4eD21Aa0Bec959ED7e4A83B2CD46dd00a0205dA" + }, + { + "name": "BalancerRelayer", + "address": "0xF537dDd7f4cc72C6C08866b62EAe9378f1F62da8" + } + ], + "status": "DEPRECATED" + }, + "20220325-authorizer-adaptor": { + "contracts": [ + { + "name": "AuthorizerAdaptor", + "address": "0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD" + } + ], + "status": "ACTIVE" + }, + "20220404-erc4626-linear-pool-v2": { + "contracts": [ + { + "name": "ERC4626LinearPoolFactory", + "address": "0x6637dA12881f66dC7E42b8879B0a79faF43C9be2" + } + ], + "status": "DEPRECATED" + }, + "20220413-child-chain-gauge-factory": { + "contracts": [ + { + "name": "RewardsOnlyGauge", + "address": "0x2E96068b3D5B5BAE3D7515da4A1D2E52d08A2647" + }, + { + "name": "ChildChainStreamer", + "address": "0x6f5a2eE11E7a772AeB5114A20d0D7c0ff61EB8A0" + }, + { + "name": "ChildChainLiquidityGaugeFactory", + "address": "0x3b8cA519122CdD8efb272b0D3085453404B25bD0" + } + ], + "status": "ACTIVE" + }, + "20220425-unbutton-aave-linear-pool": { + "contracts": [ + { + "name": "UnbuttonAaveLinearPoolFactory", + "address": "0x6bAF5Fa330F2d7C59f2bB57cF4b2C927B7f160d2" + } + ], + "status": "DEPRECATED" + }, + "20220513-double-entrypoint-fix-relayer": { + "contracts": [ + { + "name": "DoubleEntrypointFixRelayer", + "address": "0x79d0011892fe558FC5a4ec7D4Ca5db59069f460f" + } + ], + "status": "ACTIVE" + }, + "20220517-protocol-fee-withdrawer": { + "contracts": [ + { + "name": "ProtocolFeesWithdrawer", + "address": "0xEF44D6786b2b4d544b7850Fe67CE6381626Bf2D6" + } + ], + "status": "ACTIVE" + }, + "20220527-child-chain-gauge-token-adder": { + "contracts": [ + { + "name": "ChildChainGaugeTokenAdder", + "address": "0x1554ee754707D5C93b7934AF404747Aba521Aaf2" + } + ], + "status": "ACTIVE" + }, + "20220609-stable-pool-v2": { + "contracts": [ + { + "name": "StablePoolFactory", + "address": "0xcA96C4f198d343E251b1a01F3EBA061ef3DA73C1" + } + ], + "status": "DEPRECATED" + }, + "20220720-batch-relayer-v3": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x5ef4c5352882b10893b70DbcaA0C000965bd23c5" + }, + { + "name": "BalancerRelayer", + "address": "0xcf6a66E32dCa0e26AcC3426b851FD8aCbF12Dac7" + } + ], + "status": "DEPRECATED" + }, + "20220721-balancer-queries": { + "contracts": [ + { + "name": "BalancerQueries", + "address": "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5" + } + ], + "status": "ACTIVE" + }, + "20220725-protocol-fee-percentages-provider": { + "contracts": [ + { + "name": "ProtocolFeePercentagesProvider", + "address": "0x42AC0e6FA47385D55Aff070d79eF0079868C48a6" + } + ], + "status": "ACTIVE" + }, + "20220812-child-chain-reward-helper": { + "contracts": [ + { + "name": "ChildChainGaugeRewardHelper", + "address": "0xaEb406b0E430BF5Ea2Dc0B9Fe62E4E53f74B3a33" + } + ], + "status": "ACTIVE" + }, + "20220817-aave-rebalanced-linear-pool": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0x8df6EfEc5547e31B0eb7d1291B511FF8a2bf987c" + } + ], + "status": "DEPRECATED" + }, + "20220906-composable-stable-pool": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x136FD06Fa01eCF624C7F2B3CB15742c1339dC2c4" + } + ], + "status": "DEPRECATED" + }, + "20220908-weighted-pool-v2": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0x0e39C3D9b2ec765eFd9c5c70BB290B1fCD8536E3" + } + ], + "status": "DEPRECATED" + }, + "20220916-batch-relayer-v4": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x156C628135327F41748D8c8802fC043870714E9a" + }, + { + "name": "BalancerRelayer", + "address": "0x28A224d9d398a1eBB7BA69BCA515898966Bb1B6b" + } + ], + "status": "DEPRECATED" + }, + "20221021-managed-pool": { + "contracts": [ + { + "name": "ManagedPoolAddRemoveTokenLib", + "address": "0xE42FFA682A26EF8F25891db4882932711D42e467" + }, + { + "name": "CircuitBreakerLib", + "address": "0x956CCab09898C0AF2aCa5e6C229c3aD4E93d9288" + }, + { + "name": "ManagedPoolFactory", + "address": "0x9Ac3E70dB606659Bf32D4BdFbb687AD193FD1F5B" + } + ], + "status": "DEPRECATED" + }, + "20221122-composable-stable-pool-v2": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x85a80afee867aDf27B50BdB7b76DA70f1E853062" + }, + { + "name": "MockComposableStablePool", + "address": "0x373b347bc87998b151A5E9B6bB6ca692b766648a" + } + ], + "status": "DEPRECATED" + }, + "20221123-pool-recovery-helper": { + "contracts": [ + { + "name": "PoolRecoveryHelper", + "address": "0x495F696430F4A51F7fcB98FbE68a9Cb7A07fB1bA" + } + ], + "status": "ACTIVE" + }, + "20221124-authorizer-adaptor-entrypoint": { + "contracts": [ + { + "name": "AuthorizerAdaptorEntrypoint", + "address": "0xAB093cd16e765b5B23D34030aaFaF026558e0A19" + } + ], + "status": "ACTIVE" + }, + "20221207-aave-rebalanced-linear-pool-v3": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0x35c425234DC42e7402f54cC54573f77842963a56" + }, + { + "name": "MockAaveLendingPool", + "address": "0x1bbfa323155526F54EEc458571Bb5A75e0c41507" + }, + { + "name": "MockStaticAToken", + "address": "0xD487eec3EF2Be7a3d06D37F406d878DC7c50deEF" + }, + { + "name": "MockAaveLinearPool", + "address": "0xFA2C0bd8327C99db5bdE4c9e9E5cbF30946351bb" + } + ], + "status": "DEPRECATED" + }, + "20230206-aave-rebalanced-linear-pool-v4": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0xf23b4DB826DbA14c0e857029dfF076b1c0264843" + }, + { + "name": "MockAaveLendingPool", + "address": "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6" + }, + { + "name": "MockStaticAToken", + "address": "0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88" + }, + { + "name": "MockAaveLinearPool", + "address": "0x11884dA90FB4221b3aa288a7741C51eC4Fc43B2f" + } + ], + "status": "DEPRECATED" + }, + "20230206-composable-stable-pool-v3": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x7bc6C0E73EDAa66eF3F6E2f27b0EE8661834c6C9" + }, + { + "name": "MockComposableStablePool", + "address": "0xeff1d57A28167E6982DCa1D63321810400f73929" + } + ], + "status": "DEPRECATED" + }, + "20230206-erc4626-linear-pool-v3": { + "contracts": [ + { + "name": "ERC4626LinearPoolFactory", + "address": "0xa3B9515A9c557455BC53F7a535A85219b59e8B2E" + }, + { + "name": "MockERC4626Token", + "address": "0x040dBA12Bb3D5C0A73ddfe84C220Be3ddBA06966" + }, + { + "name": "MockERC4626LinearPool", + "address": "0xf984eb2B8a7eF780245a797A2fCcd82f346409ca" + } + ], + "status": "DEPRECATED" + }, + "20230206-weighted-pool-v3": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0x82e4cFaef85b1B6299935340c964C942280327f4" + }, + { + "name": "MockWeightedPool", + "address": "0x93ECf386cD53718aF16a09C325a56D1bB60aDc37" + } + ], + "status": "DEPRECATED" + }, + "20230213-yearn-linear-pool": { + "contracts": [ + { + "name": "YearnLinearPoolFactory", + "address": "0x7396f99B48e7436b152427bfA3DD6Aa8C7C6d05B" + }, + { + "name": "MockYearnTokenVault", + "address": "0x533a16F90E7d3Ca31dbc608E5EC54967710F0D2A" + }, + { + "name": "MockYearnLinearPool", + "address": "0x0320C1C5B6df19A194D48882aaEC1c72940081D9" + } + ], + "status": "DEPRECATED" + }, + "20230222-merkle-orchard-v2": { + "contracts": [ + { + "name": "MerkleOrchard", + "address": "0xc3ccacE87f6d3A81724075ADcb5ddd85a8A1bB68" + } + ], + "status": "ACTIVE" + }, + "20230223-protocol-id-registry": { + "contracts": [ + { + "name": "ProtocolIdRegistry", + "address": "0xa523f47A933D5020b23629dDf689695AA94612Dc" + } + ], + "status": "ACTIVE" + }, + "20230314-batch-relayer-v5": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x4271de2595c3d85d2D455C5778adF2d7Ad54322C" + }, + { + "name": "BalancerRelayer", + "address": "0xd18d5D377eb23362e54Fa496597d7E962d56C554" + } + ], + "status": "ACTIVE" + }, + "20230316-child-chain-gauge-factory-v2": { + "contracts": [ + { + "name": "ChildChainGauge", + "address": "0xc9b36096f5201ea332Db35d6D195774ea0D5988f" + }, + { + "name": "ChildChainGaugeFactory", + "address": "0x22625eEDd92c81a219A83e1dc48f88d54786B017" + } + ], + "status": "ACTIVE" + }, + "20230316-l2-balancer-pseudo-minter": { + "contracts": [ + { + "name": "L2BalancerPseudoMinter", + "address": "0x47B489bf5836f83ABD928C316F8e39bC0587B020" + } + ], + "status": "ACTIVE" + }, + "20230316-l2-ve-delegation-proxy": { + "contracts": [ + { + "name": "NullVotingEscrow", + "address": "0x1311Fbc9F60359639174c1e7cC2032DbDb5Cc4d1" + }, + { + "name": "VotingEscrowDelegationProxy", + "address": "0x0f08eEf2C785AA5e7539684aF04755dEC1347b7c" + } + ], + "status": "ACTIVE" + }, + "20230320-composable-stable-pool-v4": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x6Ab5549bBd766A43aFb687776ad8466F8b42f777" + }, + { + "name": "MockComposableStablePool", + "address": "0x0f25823cF786b78696b16536e2F2B9835289AB51" + } + ], + "status": "DEPRECATED" + }, + "20230320-weighted-pool-v4": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0xFc8a407Bba312ac761D8BFe04CE1201904842B76" + }, + { + "name": "MockWeightedPool", + "address": "0xb77E03655ee894AadE216A83D05511A9F9895126" + } + ], + "status": "ACTIVE" + }, + "20230404-l2-layer0-bridge-forwarder": { + "contracts": [ + { + "name": "L2LayerZeroBridgeForwarder", + "address": "0xB98F54A74590a6e681fF664b2Fa22EBfFe1a929E" + } + ], + "status": "ACTIVE" + }, + "20230409-erc4626-linear-pool-v4": { + "contracts": [ + { + "name": "ERC4626LinearPoolFactory", + "address": "0x5C5fCf8fBd4cd563cED27e7D066b88ee20E1867A" + }, + { + "name": "MockERC4626Token", + "address": "0x19DFEF0a828EEC0c85FbB335aa65437417390b85" + }, + { + "name": "MockERC4626LinearPool", + "address": "0xc55eC796A4dEBE625d95436a3531f4950b11bdcf" + } + ], + "status": "ACTIVE" + }, + "20230409-yearn-linear-pool-v2": { + "contracts": [ + { + "name": "YearnLinearPoolFactory", + "address": "0x0b576c1245F479506e7C8bbc4dB4db07C1CD31F9" + }, + { + "name": "MockYearnTokenVault", + "address": "0x28fa1E40011aDF98898E8243B2a48BB21EbF0C29" + }, + { + "name": "MockYearnLinearPool", + "address": "0xdae301690004946424E41051aCe1791083be42a1" + } + ], + "status": "ACTIVE" + }, + "20230410-aave-linear-pool-v5": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0xAB2372275809E15198A7968C7f324053867cdB0C" + }, + { + "name": "MockAaveLendingPool", + "address": "0x0Df6bb26533EB86F371B1F70EeCdD955420523C6" + }, + { + "name": "MockStaticAToken", + "address": "0xE72B2780D3C57F781Bd4E8572E200CD7E9A447C2" + }, + { + "name": "MockAaveLinearPool", + "address": "0x0889b240A5876aae745Ac19f1771853671dC5d36" + } + ], + "status": "ACTIVE" + }, + "20230411-managed-pool-v2": { + "contracts": [ + { + "name": "ManagedPoolAddRemoveTokenLib", + "address": "0xf553bf40DB86c35f3058434039D51Aad29c6180b" + }, + { + "name": "CircuitBreakerLib", + "address": "0xEDFd0A7005A7c72c44Ff13bEa370c86A9D11beE1" + }, + { + "name": "ManagedPoolAmmLib", + "address": "0xCEFD59EedAFA9EE8Ccda1AaF944088E68B5BD890" + }, + { + "name": "ExternalWeightedMath", + "address": "0x72EbAFDdC4C7d3EB702c81295D90A8B29F008a03" + }, + { + "name": "RecoveryModeHelper", + "address": "0x1eb79551CA0e83EC145608BC39a0c7F10cA21Aa5" + }, + { + "name": "ManagedPoolFactory", + "address": "0xB8Dfa4fd0F083de2B7EDc0D5eeD5E684e54bA45D" + }, + { + "name": "MockManagedPool", + "address": "0x074eFD7806e6c28e8b6611075b1Aa62c6c408090" + } + ], + "status": "ACTIVE" + }, + "20230414-authorizer-wrapper": { + "contracts": [ + { + "name": "AuthorizerWithAdaptorValidation", + "address": "0x020301b0a99EFB6816B41007765Fb577259eC418" + } + ], + "status": "ACTIVE" + }, + "20230525-l2-veboost-v2": { + "contracts": [ + { + "name": "VeBoostV2", + "address": "0xD961E30156C2E0D0d925A0De45f931CB7815e970" + } + ], + "status": "ACTIVE" + }, + "20230526-gauge-working-balance-helper": { + "contracts": [ + { + "name": "GaugeWorkingBalanceHelper", + "address": "0x08fd003D8F1892D4EC684E6C3EE0128081be461b" + } + ], + "status": "ACTIVE" + }, + "20230613-balancer-pool-data-queries": { + "contracts": [ + { + "name": "BalancerPoolDataQueries", + "address": "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089" + } + ], + "status": "ACTIVE" + }, + "20230711-composable-stable-pool-v5": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0xe2fa4e1d17725e72dcdAfe943Ecf45dF4B9E285b" + }, + { + "name": "MockComposableStablePool", + "address": "0xD35325DfC0B02718a41De7c94Ac9FC10D0AD5624" + } + ], + "status": "ACTIVE" + }, + "20230712-child-chain-gauge-checkpointer": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x268E2EE1413D768b6e2dc3F5a4ddc9Ae03d9AF42" + }, + { + "name": "BalancerRelayer", + "address": "0xe4f1878eC9710846E2B529C1b5037F8bA94583b1" + } + ], + "status": "ACTIVE" + }, + "20230717-chainlink-rate-provider-factory": { + "contracts": [ + { + "name": "ChainlinkRateProviderFactory", + "address": "0xa3b370092aeb56770B23315252aB5E16DAcBF62B" + } + ], + "status": "ACTIVE" + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/addresses/sepolia.json b/balpy/balancer-deployments/addresses/sepolia.json new file mode 100644 index 0000000..d19c1c1 --- /dev/null +++ b/balpy/balancer-deployments/addresses/sepolia.json @@ -0,0 +1,564 @@ +{ + "20210418-authorizer": { + "contracts": [ + { + "name": "Authorizer", + "address": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" + } + ], + "status": "ACTIVE" + }, + "20210418-vault": { + "contracts": [ + { + "name": "Vault", + "address": "0xBA12222222228d8Ba445958a75a0704d566BF2C8" + }, + { + "name": "ProtocolFeesCollector", + "address": "0xce88686553686DA562CE7Cea497CE749DA109f9F" + }, + { + "name": "BalancerHelpers", + "address": "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca" + } + ], + "status": "ACTIVE" + }, + "20211202-no-protocol-fee-lbp": { + "contracts": [ + { + "name": "NoProtocolFeeLiquidityBootstrappingPoolFactory", + "address": "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B" + }, + { + "name": "MockLiquidityBootstrappingPool", + "address": "0xe90472ffc41D7Ddf8E3B456bBA748e3F22c59C6f" + } + ], + "status": "ACTIVE" + }, + "20220325-authorizer-adaptor": { + "contracts": [ + { + "name": "AuthorizerAdaptor", + "address": "0xdcdbf71A870cc60C6F9B621E28a7D3Ffd6Dd4965" + } + ], + "status": "ACTIVE" + }, + "20220325-bal-token-holder-factory": { + "contracts": [ + { + "name": "BALTokenHolderFactory", + "address": "0xEF454a7B3f965D3f6723E462405246f8Cd865425" + } + ], + "status": "ACTIVE" + }, + "20220325-balancer-token-admin": { + "contracts": [ + { + "name": "BalancerTokenAdmin", + "address": "0x7d2248F194755DCa9A1887099394F39476d28C9a" + } + ], + "status": "ACTIVE" + }, + "20220325-gauge-controller": { + "contracts": [ + { + "name": "VotingEscrow", + "address": "0x150A72e4D4d81BbF045565E232c50Ed0931ad795" + }, + { + "name": "GaugeController", + "address": "0x577e5993B9Cc480F07F98B5Ebd055604bd9071C4" + }, + { + "name": "BalancerMinter", + "address": "0x1783Cd84b3d01854A96B4eD5843753C2CcbD574A" + } + ], + "status": "ACTIVE" + }, + "20220325-test-balancer-token": { + "contracts": [ + { + "name": "TestBalancerToken", + "address": "0xb19382073c7A0aDdbb56Ac6AF1808Fa49e377B75" + } + ], + "status": "ACTIVE" + }, + "20220325-ve-delegation": { + "contracts": [ + { + "name": "VotingEscrowDelegation", + "address": "0x0c5538098EBe88175078972F514C9e101D325D4F" + }, + { + "name": "VotingEscrowDelegationProxy", + "address": "0x9f7E65887413a8497b87bA2058cE6E4Ef4B37013" + } + ], + "status": "ACTIVE" + }, + "20220420-smart-wallet-checker": { + "contracts": [ + { + "name": "SmartWalletChecker", + "address": "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a" + } + ], + "status": "ACTIVE" + }, + "20220517-protocol-fee-withdrawer": { + "contracts": [ + { + "name": "ProtocolFeesWithdrawer", + "address": "0x809B79b53F18E9bc08A961ED4678B901aC93213a" + } + ], + "status": "ACTIVE" + }, + "20220530-preseeded-voting-escrow-delegation": { + "contracts": [ + { + "name": "PreseededVotingEscrowDelegation", + "address": "0xb1a4FE1C6d25a0DDAb47431A92A723dd71d9021f" + } + ], + "status": "ACTIVE" + }, + "20220714-fee-distributor-v2": { + "contracts": [ + { + "name": "FeeDistributor", + "address": "0xA6971317Fb06c76Ef731601C64433a4846fCa707" + } + ], + "status": "ACTIVE" + }, + "20220721-balancer-queries": { + "contracts": [ + { + "name": "BalancerQueries", + "address": "0x1802953277FD955f9a254B80Aa0582f193cF1d77" + } + ], + "status": "ACTIVE" + }, + "20220725-protocol-fee-percentages-provider": { + "contracts": [ + { + "name": "ProtocolFeePercentagesProvider", + "address": "0xf7D5DcE55E6D47852F054697BAB6A1B48A00ddbd" + } + ], + "status": "ACTIVE" + }, + "20220822-mainnet-gauge-factory-v2": { + "contracts": [ + { + "name": "LiquidityGaugeV5", + "address": "0x82416Ce6eA7dD4923d4A3ED70a79B4A432a382C4" + }, + { + "name": "LiquidityGaugeFactory", + "address": "0x2FF226CD12C80511a641A6101F071d853A4e5363" + } + ], + "status": "ACTIVE" + }, + "20221123-pool-recovery-helper": { + "contracts": [ + { + "name": "PoolRecoveryHelper", + "address": "0x1b6F057520B4e826271D47b8bdab98E35Af17E59" + } + ], + "status": "ACTIVE" + }, + "20221124-authorizer-adaptor-entrypoint": { + "contracts": [ + { + "name": "AuthorizerAdaptorEntrypoint", + "address": "0xb9aD3466cdd42015cc05d4804DC68D562b6a2065" + } + ], + "status": "ACTIVE" + }, + "20221205-veboost-v2": { + "contracts": [ + { + "name": "VeBoostV2", + "address": "0x927906bbAc747c13c75F6447FE8abb490EAB456C" + } + ], + "status": "ACTIVE" + }, + "20230109-gauge-adder-v3": { + "contracts": [ + { + "name": "GaugeAdder", + "address": "0x1DF32616fb1bBaEd07f42F1a1EfD1D0E232AcB4a" + } + ], + "status": "DEPRECATED" + }, + "20230215-single-recipient-gauge-factory-v2": { + "contracts": [ + { + "name": "SingleRecipientGaugeFactory", + "address": "0x7EE4D172Ae50C627a1BFA9A99E1260C54dA26fdF" + }, + { + "name": "SingleRecipientGauge", + "address": "0x9a5ddDE7056ceFFb03D9962c4549Ac1C4ad1F985" + } + ], + "status": "ACTIVE" + }, + "20230223-protocol-id-registry": { + "contracts": [ + { + "name": "ProtocolIdRegistry", + "address": "0x6CaD2ea22BFA7F4C14Aae92E47F510Cd5C509bc7" + } + ], + "status": "ACTIVE" + }, + "20230314-batch-relayer-v5": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x5F6848976C2914403B425F18B589A65772F082E3" + }, + { + "name": "BalancerRelayer", + "address": "0x6d5342d716c13d9a3F072a2B11498624ADe27f90" + } + ], + "status": "ACTIVE" + }, + "20230316-child-chain-gauge-factory-v2": { + "contracts": [ + { + "name": "ChildChainGauge", + "address": "0xC49Ca921c4CD1117162eAEEc0ee969649997950c" + }, + { + "name": "ChildChainGaugeFactory", + "address": "0xC370cD86d5488c1788b62f11b09adb0C47F47440" + } + ], + "status": "ACTIVE" + }, + "20230316-l2-balancer-pseudo-minter": { + "contracts": [ + { + "name": "L2BalancerPseudoMinter", + "address": "0xb51f7fFc97CeDFb6922e8B9Bbf3eF7575fafD630" + } + ], + "status": "ACTIVE" + }, + "20230316-l2-ve-delegation-proxy": { + "contracts": [ + { + "name": "NullVotingEscrow", + "address": "0x475D18169BE8a89357A9ee3Ab00ca386d20fA229" + }, + { + "name": "VotingEscrowDelegationProxy", + "address": "0xD87F44Df0159DC78029AB9CA7D7e57E7249F5ACD" + } + ], + "status": "ACTIVE" + }, + "20230320-composable-stable-pool-v4": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0xA3fd20E29358c056B727657E83DFd139abBC9924" + }, + { + "name": "MockComposableStablePool", + "address": "0xA8D865FE1D68a405B29f884358468c9B52d4841d" + } + ], + "status": "DEPRECATED" + }, + "20230320-weighted-pool-v4": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0x7920BFa1b2041911b354747CA7A6cDD2dfC50Cfd" + }, + { + "name": "MockWeightedPool", + "address": "0xf7a7E1F48FA43cb7919Ff4Eb362c5bE78092dF4A" + } + ], + "status": "ACTIVE" + }, + "20230404-l2-layer0-bridge-forwarder": { + "contracts": [ + { + "name": "L2LayerZeroBridgeForwarder", + "address": "0xc7E5ED1054A24Ef31D827E6F86caA58B3Bc168d7" + } + ], + "status": "ACTIVE" + }, + "20230409-erc4626-linear-pool-v4": { + "contracts": [ + { + "name": "ERC4626LinearPoolFactory", + "address": "0x59562f93c447656F6E4799fC1FC7c3d977C3324F" + }, + { + "name": "MockERC4626Token", + "address": "0x2498A2B0d6462d2260EAC50aE1C3e03F4829BA95" + }, + { + "name": "MockERC4626LinearPool", + "address": "0x0c2EAd6F2Dc2A9385187023F4cec5925337B330f" + } + ], + "status": "ACTIVE" + }, + "20230409-gearbox-linear-pool-v2": { + "contracts": [ + { + "name": "GearboxLinearPoolFactory", + "address": "0x8df317a729fcaA260306d7de28888932cb579b88" + }, + { + "name": "MockGearboxVault", + "address": "0x3B1eb8EB7b43882b385aB30533D9A2BeF9052a98" + }, + { + "name": "MockGearboxDieselToken", + "address": "0x4C32a8a8fDa4E24139B51b456B42290f51d6A1c4" + }, + { + "name": "MockGearboxLinearPool", + "address": "0x112a7b7ca66E6963C49BC523A415F7D8CDB806B9" + } + ], + "status": "ACTIVE" + }, + "20230409-yearn-linear-pool-v2": { + "contracts": [ + { + "name": "YearnLinearPoolFactory", + "address": "0xAcf05BE5134d64d150d153818F8C67EE36996650" + }, + { + "name": "MockYearnTokenVault", + "address": "0x9129E834e15eA19b6069e8f08a8EcFc13686B8dC" + }, + { + "name": "MockYearnLinearPool", + "address": "0x016B7366F76aa2794097798B90CF239796AEff8d" + } + ], + "status": "ACTIVE" + }, + "20230410-aave-linear-pool-v5": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0xDF9B5B00Ef9bca66e9902Bd813dB14e4343Be025" + }, + { + "name": "MockAaveLendingPool", + "address": "0x300Ab2038EAc391f26D9F895dc61F8F66a548833" + }, + { + "name": "MockStaticAToken", + "address": "0x03F3Fb107e74F2EAC9358862E91ad3c692712054" + }, + { + "name": "MockAaveLinearPool", + "address": "0xE4EfD99f3C03778ba913Eb578C599329634e2bd7" + } + ], + "status": "ACTIVE" + }, + "20230410-silo-linear-pool-v2": { + "contracts": [ + { + "name": "SiloLinearPoolFactory", + "address": "0x8eA89804145c007e7D226001A96955ad53836087" + }, + { + "name": "MockSiloRepository", + "address": "0xa7d524046ef89de9F8e4f2d7B029f66cCB738d48" + }, + { + "name": "MockSilo", + "address": "0x6B1Da720Be2D11d95177ccFc40A917c2688f396c" + }, + { + "name": "MockShareToken", + "address": "0x0c6052254551EAe3ECac77B01DFcf1025418828f" + }, + { + "name": "MockSiloLinearPool", + "address": "0xA149CF2D795AaB83a15673f5Beade9361e4e3F65" + } + ], + "status": "ACTIVE" + }, + "20230411-managed-pool-v2": { + "contracts": [ + { + "name": "ManagedPoolAddRemoveTokenLib", + "address": "0xc7416E4f3715467dDcf28dc409A9483b2E4D4F43" + }, + { + "name": "CircuitBreakerLib", + "address": "0x4C0C450bEdB9282A7a54fCB316c285E85A8c0265" + }, + { + "name": "ManagedPoolAmmLib", + "address": "0xa30aDE89E6af5b0Ca515cd78e44f9aD0c63989b2" + }, + { + "name": "ExternalWeightedMath", + "address": "0x8246e571d88ACd1346179Cc3641DE87Fe3544d7A" + }, + { + "name": "RecoveryModeHelper", + "address": "0x5419e785b83Ad3539D3a8741C0ABb77D90d8784E" + }, + { + "name": "ManagedPoolFactory", + "address": "0x63e179C5b6d54B2c2e36b9cE4085EF5A8C86D50c" + }, + { + "name": "MockManagedPool", + "address": "0xE458224CA8d6605c87b73E92aa5CB7A4e77770f3" + } + ], + "status": "ACTIVE" + }, + "20230414-authorizer-wrapper": { + "contracts": [ + { + "name": "AuthorizerWithAdaptorValidation", + "address": "0xb521dD5C8e13fE202626CaC98873FEA2b7760cE4" + } + ], + "status": "ACTIVE" + }, + "20230504-vebal-remapper": { + "contracts": [ + { + "name": "OmniVotingEscrowAdaptor", + "address": "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5" + }, + { + "name": "VotingEscrowRemapper", + "address": "0xF24917fB88261a37Cc57F686eBC831a5c0B9fD39" + } + ], + "status": "ACTIVE" + }, + "20230519-gauge-adder-v4": { + "contracts": [ + { + "name": "GaugeAdder", + "address": "0xE42FFA682A26EF8F25891db4882932711D42e467" + } + ], + "status": "ACTIVE" + }, + "20230522-timelock-authorizer": { + "contracts": [ + { + "name": "TimelockAuthorizerMigrator", + "address": "0x6eaD84Af26E997D27998Fc9f8614e8a19BB93938" + }, + { + "name": "TimelockAuthorizer", + "address": "0xDe615cc5712B4954BeB613BCF32E61C137Cc64f9" + } + ], + "status": "ACTIVE" + }, + "20230526-gauge-working-balance-helper": { + "contracts": [ + { + "name": "GaugeWorkingBalanceHelper", + "address": "0x2E4aBED3362A622C5f712bB183005A476b146bd3" + } + ], + "status": "ACTIVE" + }, + "20230613-balancer-pool-data-queries": { + "contracts": [ + { + "name": "BalancerPoolDataQueries", + "address": "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089" + } + ], + "status": "ACTIVE" + }, + "20230711-composable-stable-pool-v5": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0xa523f47A933D5020b23629dDf689695AA94612Dc" + }, + { + "name": "MockComposableStablePool", + "address": "0xE24Aba051aaeB07f981bD449f4B0b3250e08d4fB" + } + ], + "status": "ACTIVE" + }, + "20230712-child-chain-gauge-checkpointer": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x043A2daD730d585C44FB79D2614F295D2d625412" + }, + { + "name": "BalancerRelayer", + "address": "0xBeA696c7761734d9e66f4F372EB35059C1aeD1e0" + } + ], + "status": "ACTIVE" + }, + "20230717-chainlink-rate-provider-factory": { + "contracts": [ + { + "name": "ChainlinkRateProviderFactory", + "address": "0xA8920455934Da4D853faac1f94Fe7bEf72943eF1" + } + ], + "status": "ACTIVE" + }, + "20230731-stakeless-gauge-checkpointer": { + "contracts": [ + { + "name": "StakelessGaugeCheckpointer", + "address": "0x96484f2aBF5e58b15176dbF1A799627B53F13B6d" + } + ], + "status": "DEPRECATED" + }, + "20230915-stakeless-gauge-checkpointer-v2": { + "contracts": [ + { + "name": "StakelessGaugeCheckpointer", + "address": "0x268E2EE1413D768b6e2dc3F5a4ddc9Ae03d9AF42" + } + ], + "status": "ACTIVE" + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/addresses/zkevm.json b/balpy/balancer-deployments/addresses/zkevm.json new file mode 100644 index 0000000..20cca28 --- /dev/null +++ b/balpy/balancer-deployments/addresses/zkevm.json @@ -0,0 +1,367 @@ +{ + "20210418-authorizer": { + "contracts": [ + { + "name": "Authorizer", + "address": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" + } + ], + "status": "ACTIVE" + }, + "20210418-vault": { + "contracts": [ + { + "name": "Vault", + "address": "0xBA12222222228d8Ba445958a75a0704d566BF2C8" + }, + { + "name": "ProtocolFeesCollector", + "address": "0xce88686553686DA562CE7Cea497CE749DA109f9F" + }, + { + "name": "BalancerHelpers", + "address": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9" + } + ], + "status": "ACTIVE" + }, + "20211202-no-protocol-fee-lbp": { + "contracts": [ + { + "name": "NoProtocolFeeLiquidityBootstrappingPoolFactory", + "address": "0x3B1eb8EB7b43882b385aB30533D9A2BeF9052a98" + }, + { + "name": "MockLiquidityBootstrappingPool", + "address": "0x3c87FF3e9307dbEbfAe720E04C6439e49f79BF9B" + } + ], + "status": "ACTIVE" + }, + "20220325-authorizer-adaptor": { + "contracts": [ + { + "name": "AuthorizerAdaptor", + "address": "0xdcdbf71A870cc60C6F9B621E28a7D3Ffd6Dd4965" + } + ], + "status": "ACTIVE" + }, + "20220517-protocol-fee-withdrawer": { + "contracts": [ + { + "name": "ProtocolFeesWithdrawer", + "address": "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a" + } + ], + "status": "ACTIVE" + }, + "20220721-balancer-queries": { + "contracts": [ + { + "name": "BalancerQueries", + "address": "0x809B79b53F18E9bc08A961ED4678B901aC93213a" + } + ], + "status": "ACTIVE" + }, + "20220725-protocol-fee-percentages-provider": { + "contracts": [ + { + "name": "ProtocolFeePercentagesProvider", + "address": "0x1802953277FD955f9a254B80Aa0582f193cF1d77" + } + ], + "status": "ACTIVE" + }, + "20221123-pool-recovery-helper": { + "contracts": [ + { + "name": "PoolRecoveryHelper", + "address": "0xf7D5DcE55E6D47852F054697BAB6A1B48A00ddbd" + } + ], + "status": "ACTIVE" + }, + "20221124-authorizer-adaptor-entrypoint": { + "contracts": [ + { + "name": "AuthorizerAdaptorEntrypoint", + "address": "0xb9aD3466cdd42015cc05d4804DC68D562b6a2065" + } + ], + "status": "ACTIVE" + }, + "20230223-protocol-id-registry": { + "contracts": [ + { + "name": "ProtocolIdRegistry", + "address": "0x6CaD2ea22BFA7F4C14Aae92E47F510Cd5C509bc7" + } + ], + "status": "ACTIVE" + }, + "20230314-batch-relayer-v5": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x54f8F9d28e26Fa5864cfA80f50A5Df95fD85f46a" + }, + { + "name": "BalancerRelayer", + "address": "0x4678731DC41142A902a114aC5B2F77b63f4a259D" + } + ], + "status": "ACTIVE" + }, + "20230316-child-chain-gauge-factory-v2": { + "contracts": [ + { + "name": "ChildChainGauge", + "address": "0x59562f93c447656F6E4799fC1FC7c3d977C3324F" + }, + { + "name": "ChildChainGaugeFactory", + "address": "0x2498A2B0d6462d2260EAC50aE1C3e03F4829BA95" + } + ], + "status": "ACTIVE" + }, + "20230316-l2-balancer-pseudo-minter": { + "contracts": [ + { + "name": "L2BalancerPseudoMinter", + "address": "0x475D18169BE8a89357A9ee3Ab00ca386d20fA229" + } + ], + "status": "ACTIVE" + }, + "20230316-l2-ve-delegation-proxy": { + "contracts": [ + { + "name": "NullVotingEscrow", + "address": "0xD87F44Df0159DC78029AB9CA7D7e57E7249F5ACD" + }, + { + "name": "VotingEscrowDelegationProxy", + "address": "0xc7E5ED1054A24Ef31D827E6F86caA58B3Bc168d7" + } + ], + "status": "ACTIVE" + }, + "20230320-composable-stable-pool-v4": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x8eA89804145c007e7D226001A96955ad53836087" + }, + { + "name": "MockComposableStablePool", + "address": "0x6f5F794A3CeF904b8517C4c311DE2FA837Ff24a0" + } + ], + "status": "DEPRECATED" + }, + "20230320-weighted-pool-v4": { + "contracts": [ + { + "name": "WeightedPoolFactory", + "address": "0x03F3Fb107e74F2EAC9358862E91ad3c692712054" + }, + { + "name": "MockWeightedPool", + "address": "0x78385153d2f356C87001F09BB5424137c618D38b" + } + ], + "status": "ACTIVE" + }, + "20230404-l2-layer0-bridge-forwarder": { + "contracts": [ + { + "name": "L2LayerZeroBridgeForwarder", + "address": "0xDEd7Fef7D8eCdcB74F22f0169e1A9EC696e6695d" + } + ], + "status": "ACTIVE" + }, + "20230409-erc4626-linear-pool-v4": { + "contracts": [ + { + "name": "ERC4626LinearPoolFactory", + "address": "0x6B1Da720Be2D11d95177ccFc40A917c2688f396c" + }, + { + "name": "MockERC4626Token", + "address": "0x0c6052254551EAe3ECac77B01DFcf1025418828f" + }, + { + "name": "MockERC4626LinearPool", + "address": "0xac4b72c01072A52b73ca71105504F1372eFcCE0d" + } + ], + "status": "ACTIVE" + }, + "20230409-gearbox-linear-pool-v2": { + "contracts": [ + { + "name": "GearboxLinearPoolFactory", + "address": "0x687b8C9b41E01Be8B591725fac5d5f52D0564d79" + }, + { + "name": "MockGearboxVault", + "address": "0x88ED12A90142fDBFe2a28f7d5b48927254C7e760" + }, + { + "name": "MockGearboxDieselToken", + "address": "0x698CaED853bE9cEA96C268f565e2b61D3b2BcDA4" + }, + { + "name": "MockGearboxLinearPool", + "address": "0x32f03464FdF909FDf3798f87Ff3712b10c59bd86" + } + ], + "status": "ACTIVE" + }, + "20230409-yearn-linear-pool-v2": { + "contracts": [ + { + "name": "YearnLinearPoolFactory", + "address": "0x44d33798dddCdAbc93Fe6a40C80588033Dc502d3" + }, + { + "name": "MockYearnTokenVault", + "address": "0xDBf7B9F1d2Bfba14e42709f84dda3187eE410e38" + }, + { + "name": "MockYearnLinearPool", + "address": "0x02c9DCB975262719A61f9B40bDf0987eAD9Add3a" + } + ], + "status": "ACTIVE" + }, + "20230410-aave-linear-pool-v5": { + "contracts": [ + { + "name": "AaveLinearPoolFactory", + "address": "0x4b7b369989e613ff2C65768B7Cf930cC927F901E" + }, + { + "name": "MockAaveLendingPool", + "address": "0x161f4014C27773840ccb4EC1957113e6DD028846" + }, + { + "name": "MockStaticAToken", + "address": "0x4638ab64022927C9bD5947607459D13f57f1551C" + }, + { + "name": "MockAaveLinearPool", + "address": "0xbFD65c6160CFd638A85C645e6e6d8ACac5Dac935" + } + ], + "status": "ACTIVE" + }, + "20230411-managed-pool-v2": { + "contracts": [ + { + "name": "ManagedPoolAddRemoveTokenLib", + "address": "0xAcf05BE5134d64d150d153818F8C67EE36996650" + }, + { + "name": "CircuitBreakerLib", + "address": "0x9129E834e15eA19b6069e8f08a8EcFc13686B8dC" + }, + { + "name": "ManagedPoolAmmLib", + "address": "0xA69E0Ccf150a29369D8Bbc0B3f510849dB7E8EEE" + }, + { + "name": "ExternalWeightedMath", + "address": "0xDF9B5B00Ef9bca66e9902Bd813dB14e4343Be025" + }, + { + "name": "RecoveryModeHelper", + "address": "0x300Ab2038EAc391f26D9F895dc61F8F66a548833" + }, + { + "name": "ManagedPoolFactory", + "address": "0xaf779e58dafb4307b998C7b3C9D3f788DFc80632" + }, + { + "name": "MockManagedPool", + "address": "0x522Ee506a2f63D0AE1D79D6F5Dbd9d0bCA32C866" + } + ], + "status": "ACTIVE" + }, + "20230414-authorizer-wrapper": { + "contracts": [ + { + "name": "AuthorizerWithAdaptorValidation", + "address": "0x8df317a729fcaA260306d7de28888932cb579b88" + } + ], + "status": "ACTIVE" + }, + "20230525-l2-veboost-v2": { + "contracts": [ + { + "name": "VeBoostV2", + "address": "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5" + } + ], + "status": "ACTIVE" + }, + "20230526-gauge-working-balance-helper": { + "contracts": [ + { + "name": "GaugeWorkingBalanceHelper", + "address": "0xEF454a7B3f965D3f6723E462405246f8Cd865425" + } + ], + "status": "ACTIVE" + }, + "20230613-balancer-pool-data-queries": { + "contracts": [ + { + "name": "BalancerPoolDataQueries", + "address": "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089" + } + ], + "status": "ACTIVE" + }, + "20230711-composable-stable-pool-v5": { + "contracts": [ + { + "name": "ComposableStablePoolFactory", + "address": "0x956CCab09898C0AF2aCa5e6C229c3aD4E93d9288" + }, + { + "name": "MockComposableStablePool", + "address": "0x7682e108Cd89d86303625c8478c21Ff86f401166" + } + ], + "status": "ACTIVE" + }, + "20230712-child-chain-gauge-checkpointer": { + "contracts": [ + { + "name": "BatchRelayerLibrary", + "address": "0x85a80afee867aDf27B50BdB7b76DA70f1E853062" + }, + { + "name": "BalancerRelayer", + "address": "0x20E6Fe801Aa275e199AA253F48E6B0C612E4e1C4" + } + ], + "status": "ACTIVE" + }, + "20230717-chainlink-rate-provider-factory": { + "contracts": [ + { + "name": "ChainlinkRateProviderFactory", + "address": "0x4132f7AcC9dB7A6cF7BE2Dd3A9DC8b30C7E6E6c8" + } + ], + "status": "ACTIVE" + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/ci/prepare-config.ts b/balpy/balancer-deployments/ci/prepare-config.ts new file mode 100644 index 0000000..5f41c15 --- /dev/null +++ b/balpy/balancer-deployments/ci/prepare-config.ts @@ -0,0 +1,59 @@ +import path from 'path'; +import { homedir } from 'os'; +import { mkdirSync, writeFileSync } from 'fs'; + +const HH_CONFIG_FILENAME = `${homedir()}/.hardhat/networks.json`; + +if (process.env.CI) { + const content = `{ + "networks": { + "mainnet": { + "url": "${process.env.MAINNET_RPC_ENDPOINT}" + }, + "polygon": { + "url": "${process.env.POLYGON_RPC_ENDPOINT}" + }, + "arbitrum": { + "url": "${process.env.ARBITRUM_RPC_ENDPOINT}" + }, + "optimism": { + "url": "${process.env.OPTIMISM_RPC_ENDPOINT}" + }, + "gnosis": { + "url": "${process.env.GNOSIS_RPC_ENDPOINT}" + }, + "bsc": { + "url": "${process.env.BINANCE_RPC_ENDPOINT}" + }, + "avalanche": { + "url": "${process.env.AVALANCHE_RPC_ENDPOINT}" + }, + "zkevm": { + "url": "${process.env.ZKEVM_RPC_ENDPOINT}" + }, + "goerli": { + "url": "${process.env.GOERLI_RPC_ENDPOINT}" + }, + "sepolia": { + "url": "${process.env.SEPOLIA_RPC_ENDPOINT}" + }, + "zkevm": { + "url": "${process.env.ZKEVM_RPC_ENDPOINT}" + }, + "base": { + "url": "${process.env.BASE_RPC_ENDPOINT}" + }, + "fantom": { + "url": "${process.env.FANTOM_RPC_ENDPOINT}" + } + }, + "defaultConfig": { + "gasPrice": "auto", + "gasMultiplier": 1, + "accounts": [] + } + }`; + + mkdirSync(path.dirname(HH_CONFIG_FILENAME), { recursive: true }); + writeFileSync(HH_CONFIG_FILENAME, content); +} diff --git a/balpy/balancer-deployments/deployment-txs/arbitrum.json b/balpy/balancer-deployments/deployment-txs/arbitrum.json new file mode 100644 index 0000000..8aeb6fe --- /dev/null +++ b/balpy/balancer-deployments/deployment-txs/arbitrum.json @@ -0,0 +1,107 @@ +{ + "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6": "0x7b3fcae6346e179585d978bd668f9ba3f38c1473539b7c5b882ec0840abcc053", + "0xBA12222222228d8Ba445958a75a0704d566BF2C8": "0xe2c3826bd7b15ef8d338038769fe6140a44f1957a36b0f27ab321ab6c68d5a8e", + "0x77d46184d22CA6a3726a2F500c776767b6A3d6Ab": "0x996464aac6a6a48cdae7cb169e0efc3d04889b1636cf89a4318f59829d9f27c7", + "0x7dFdEF5f355096603419239CE743BfaF1120312B": "0xb9eb192adbb1374bc0a9bdc84a277ad16e453b4e99cd7c4dc9cc4e26bb49abcd", + "0xCF0a32Bbef8F064969F21f7e02328FB577382018": "0x2954ec1554573e4a5742339c6cee64bdaa356691133f6246b937c53eb9a1fe08", + "0x2433477A10FC5d31B9513C638F19eE85CaED53Fd": "0xa8bf235a1d214c3d0e4f5a911d5bbdfe4867633479a3a28de2887f7b1cc4bfda", + "0x142B9666a0a3A30477b052962ddA81547E7029ab": "0xbebca560e1273fa68732ec9ef74269f6d8da29a075f2163b533c3269e643bd55", + "0x6783995f91A3D7f7C24B523669488F96cCa88d31": "0xfe4fbcd08f0f651bb364b95a1322f5ce00534ce79254c52590794fe7e823d113", + "0xEBFD5681977E38Af65A7487DC70B8221D089cCAD": "0x72c3b9f5ebeed96152d5d24be4ec9d2b9ab78fdb30e5c29eb010726a3bcb4b18", + "0xaCd615B3705B9c880E4E7293f1030B34e57B4c1c": "0xf59be5478219cf485f4220f00bd10739fc622079648f9ed9a5936d1f906a0961", + "0x6bd0B17713aaa29A2d7c9A39dDc120114f9fD809": "0x056cdfa8cf5ef7bb593bdf6d27420cbe72488693c475b45b6ab5ec02be359253", + "0xC6bD2497332d24094eC16a7261eec5C412B5a2C1": "0xd6b03d5713021f99166c075191303cb61c9aaf6594228dd970fdebbb6b4172bf", + "0x751A0bC0e3f75b38e01Cf25bFCE7fF36DE1C87DE": "0x982f829ea1e2036e281eccf042e71a51596dd6139bf073fdaa9bc9846ee03e11", + "0x1802953277FD955f9a254B80Aa0582f193cF1d77": "0x5265176961ba08450afc1d7c7d34321da11b2f1f106a7d652e6c11d923caed24", + "0x72D07D7DcA67b8A406aD1Ec34ce969c90bFEE768": "0x6454d866290db7a5a06267f2a5d56f149afd34711cb775c9bb9d1165cc9aff4f", + "0x466262c2a275aB106E54D95B5B04603e12b58cA1": "0x6454d866290db7a5a06267f2a5d56f149afd34711cb775c9bb9d1165cc9aff4f", + "0xdcdbf71A870cc60C6F9B621E28a7D3Ffd6Dd4965": "0xda011757a321c9aa39e9e101b9715b271afb2ab08f83e841f45be73305d62f2f", + "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca": "0x68a6896cde23164d676e8ff76bd9f8f9e33459a4fa3ab3a6045270df0c163ca0", + "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e": "0xaa67a9303702af7b51bacaf6c70046c037467d0d06eec418575a97c7ab8c9013", + "0x41B953164995c11C81DA73D212ED8Af25741b7Ac": "0xe8ffee8416ffb7839940cb2e20231c0966125f6da05f93105e1244db436acfd3", + "0xD7FAD3bd59D6477cbe1BE7f646F7f1BA25b230f8": "0xda0bb268c70d47b0b2bca617db6afacdcc70f8967a6983a30af4ed20b5a7480a", + "0xb08E16cFc07C684dAA2f93C70323BAdb2A6CBFd2": "0x4cc294e3e988adc1d0f0244451426583284f5270acb865f87ac55e18fe405874", + "0x8E5698dC4897DC12243c8642e77B4f21349Db97C": "0x88cce60b9ac6ef8842840f583bce4a3bd3299975999c9aa492a08db8a451526f", + "0x70Bbd023481788e443472e123AB963e5EBF58D06": "0x24208edcde0bc29a7531f930cb348d08a5ed98e55e4c76677d9acd7123eedd28", + "0xbfD9769b061E57e478690299011A028194D66e3C": "0xf912ff41f3cc3a7bdf77f33e3fbe723034705357cc03d1bb72dc075f3a3c6fe0", + "0xEF44D6786b2b4d544b7850Fe67CE6381626Bf2D6": "0x7b8c4f8d0b8aeb88302dc7e2f55f903a2ec942591525ab873b6ba25a687fb7b1", + "0x2794953110874981a0d301286c986992022A62a1": "0xf5d70e181558b6dc1358e6f61a3e32f82418548822224d1ffb09fb08fba56fe0", + "0x1554ee754707D5C93b7934AF404747Aba521Aaf2": "0x7887ea935993768039953a56ebe7ba4ac5bf627de8b1ed0502c492ffbf30c579", + "0x8878f1273466157a79570DdE1A42130e551B6EAd": "0x7446a4b76f1976a49562e63d059f7b2fd2635adba8a0c3bd556fe65ccc1bd5ef", + "0x4f4269F7008430860693aeDB86b0C55962D6E9b7": "0x19b1b189804af1d2d7b516846ed1bed81936760bdde4a36b74811501c697bbd6", + "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5": "0x710d93aab52b6c10197eab20f9d6db1af3931f9890233d8832268291ef2f54b3", + "0x5ef4c5352882b10893b70DbcaA0C000965bd23c5": "0xbc9d8127b5c39816b24486a35b8ef9eb3687d8e343f963af5a4feaed34fdc5fd", + "0xA0DAbEBAAd1b243BBb243f933013d560819eB66f": "0xefb8d9da6daf08dd54a337d9bbf053217bc06077eecfca03e8571abb0d2c20df", + "0xe2E901AB09f37884BA31622dF3Ca7FC19AA443Be": "0xec419da1095c1b65955b8ac18a1ebd2152d4cf354cd3dd54a7f3d6f7785bcc39", + "0x44A41fE82c9539C1aadaBEE5B9C3f327eba5C8a3": "0xad9eef9e87626c2d624f09bd965f45b5a710c64982c9149e0e051cfb1ee1fa56", + "0xaEb406b0E430BF5Ea2Dc0B9Fe62E4E53f74B3a33": "0x53b706c3e9acd88acb603f41079a5682a13939a4f11a0e91a593ec956a72b9a8", + "0x8df6EfEc5547e31B0eb7d1291B511FF8a2bf987c": "0xbf2d8c39fa4f25f8d3ce820500e855e7e64d3df64c34d604d47bd515ea8cc60b", + "0x967F7AdD4Fd5AF0553B7A45F225ec26EDD699E61": "0x3c38c8a820a5cdc12fa54202daca4442649edd1681050ba12b953380089bde96", + "0xF24917fB88261a37Cc57F686eBC831a5c0B9fD39": "0xd191889b381361ff8865b141d0ed2fa65788797bbaa4b02cbf79af6f14380ef6", + "0xE42FFA682A26EF8F25891db4882932711D42e467": "0x74f6c00a05e03ad7198e46da49ea7a3ff967ad09c28c2d0f9c621875bef45563", + "0x956CCab09898C0AF2aCa5e6C229c3aD4E93d9288": "0xfd62e320837fab6a8a8998c6c8e0753e17a0d40f423c3f7da2f552ddbeda962e", + "0xb5e56CC3d2e38e53b1166175C59e921A37cDC1E2": "0x88bf865e0fba617d51261bbc276e350e2d8f26ce02344e2af44c2ec0f285e94b", + "0x1B57f637Ce3408f1f834b0b70f9A595b062DAea7": "0xaa1351f8cd2a3c8d852f2d7f505a606a10b65907d0a2f6d3726e271fdbd95a0c", + "0xe7234Ab7854285bb0D68A26f3d2f2087C6057825": "0x9400dc8e1ba81d2ee18f8fe028d72efcfccf13bc20abe080665c37fa4854865f", + "0x22be81ecAe87F1Ae1db9e17d6B072f846e07FC45": "0xe9b5136d028f25b36a1fd9d3634371342c02d42ab2c154bdec7c5fcfdcb678e1", + "0x77f0e64Faf0FDeAF0b632919214ba142f0478424": "0x435785d8f00490bcf06d4b99d8efd965dafd6b0cc5d0b097ac17a3cf798661ec", + "0x97207B095e4D5C9a6e4cfbfcd2C3358E03B90c4A": "0x5fe116d6c6499d960c5b19e7a5a06f5a5f99a2afe50312c450279f8907350c4f", + "0x85a80afee867aDf27B50BdB7b76DA70f1E853062": "0xbf9b7d93793f8b35bbd77be94dd9a16d982f7168280265aa7f02a7402f63fc42", + "0x373b347bc87998b151A5E9B6bB6ca692b766648a": "0xdd699704f42562c13f30f7ff41243d012a78dcde4d21396b90a5209416ad8ec6", + "0xa2D801064652A269D92EE2A59F3261155ec66830": "0xc317dc6f27b53e7e3677a0d19f34a1cf4239afa16ee64337f785afa9549d4646", + "0xAB093cd16e765b5B23D34030aaFaF026558e0A19": "0x0c35ced00d544f6c1467e0145df7735a46457c043a909dcb8d0622b474237bf3", + "0x16ba924752EF283C7946db8A122a6742AA35C1DC": "0xbd1470931e128d7ef81184f7828244ee5655be8f433badba01f2ea989f206948", + "0xa612B6AeD2E7ca1A3a4f23FbcA9128461bBB7718": "0xa8699f09498f3ba37f02ed16e1c3aabf017df4469353a51818d021216098858c", + "0xf1665E19bc105BE4EDD3739F88315cC699cc5b65": "0x3fca2c6aff691ab378683c33a6be01909ef67a33b0e7eb7df597f65f44f796d6", + "0x1c99324EDC771c82A0DCCB780CC7DDA0045E50e7": "0x9a7ee6afd9881c043c1e2a4f5a0018340cbc44856beb7b8130429cb863c2bbca", + "0x96d7e549eA1d810725e4Cd1f51ed6b4AE8496338": "0x03fdf18ea7a0e9635a3b546e09971d2cfb469764e53b7bc807758f8d416e066c", + "0x231B05F3a92d578EFf772f2Ddf6DacFFB3609749": "0x0999a6dec4d174b59e52c18e1f7bb07678204913b699a81b0a486408ce2fe35a", + "0xf23b4DB826DbA14c0e857029dfF076b1c0264843": "0x3828c2fac21f80ec2f109d3860f5ba6310c4f78afc1c6f250ced42e62045cd4b", + "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6": "0xf08571787eaf5b8503d4b27ff211b418f449a54e812b01cddb03e5ca6a84b2e6", + "0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88": "0xf61b74c373d7638847174e13c66256d683bddcbce2a17e0cb92d5c03047da91e", + "0x11884dA90FB4221b3aa288a7741C51eC4Fc43B2f": "0x115fca74954fef4e1095dda7f5f135ddcec18595d464c03b22d7defeccaf7841", + "0xa3B9515A9c557455BC53F7a535A85219b59e8B2E": "0x5f5e96da236f9d7012244dae2f684438ebaa96715128276c00de2a17a08ac67b", + "0x62aaB12865d7281048c337D53a4dde9d770321E6": "0x7afc764eb720cac3d6f40e3b598701efc39ef698e0df7099e887d8fdcab89110", + "0xf984eb2B8a7eF780245a797A2fCcd82f346409ca": "0xe1362b1f99fd73a43764dd2603d889f45f30c1e7caf79e116c664031e644a9e2", + "0xD8B6b96c88ad626EB6209c4876e3B14f45f8803A": "0xe06537ec05f957f95aa6fcbea0bc97ba9803dd5a6da44ebd6065a8afcc22110b", + "0x1b986138a4F2aA538E79fdEC222dad93F8d66703": "0x5eacbc5003a10bc0165719540f854a39ca21c4c9bb9f9f04c43cc9fe71b890fa", + "0x81fC12C60ee5b753cf5fD0ADC342dFb5f3817E32": "0xb84c93d5a4d9fb29f2ffaef19196df98bc1a9efe4d315b5403fd98a70d7a833e", + "0x9805dcfD25e6De36bad8fe9D3Fe2c9b44B764102": "0xc3275920013511826a944f24364cd21b01400705c9e948bc5189e387bd3ffa6b", + "0x5cF4928a3205728bd12830E1840F7DB85c62a4B9": "0xcd449e707abec082f310a3fc0dcbd42be1d5cd2ccbee6f61818d0817eb2fd6bf", + "0xD87F44Df0159DC78029AB9CA7D7e57E7249F5ACD": "0x3c81a8b4d4f5b9dbc3e4bfcf069daa2dbe6083018f4297890149afc8ecf17738", + "0xc7E5ED1054A24Ef31D827E6F86caA58B3Bc168d7": "0x167fe7eb776d1be36b21402d8ae120088c393e28ae7ca0bd1defac84e0f2848b", + "0x129C6402FF88611Aa59BF2e14B39e091822e2C9c": "0x2e80f31d18cd4ba4b517e6ade5547c4775179b2e3c8f762eeafd174023974990", + "0x2498A2B0d6462d2260EAC50aE1C3e03F4829BA95": "0x91bd39816946b7a08e0adbeb2f550d7a31e3a3336439ebc00f999c0455db170f", + "0xFF7e6B102516e071dcDA763EE9D02c1515481db5": "0xab8abe5b095879698a4b3eb8b3fe454f9f9dad61121d8e18c394b056cba87df1", + "0xc3ccacE87f6d3A81724075ADcb5ddd85a8A1bB68": "0xea6aa692a130393adee3cfa644c6140b7ec6fb4e4c59e726d8048c1cc66b92ce", + "0x9dA18982a33FD0c7051B19F0d7C76F2d5E7e017c": "0xc214bbaaa45bfd67453a47caf3841cb3618e96157c842c8976f80cba31b14396", + "0x81cFAE226343B24BA12EC6521Db2C79E7aeeb310": "0x6b3472efb43ca4bf2a73c767bbd250caef4da21c66849f77e085a98b2e7d15ba", + "0xa523f47A933D5020b23629dDf689695AA94612Dc": "0x61810eba3fdf1f7e1490dcb2322909f65bcd23eb95ff23040a9b7a614569fdbb", + "0x6817149cb753BF529565B4D023d7507eD2ff4Bc0": "0xe5c75ef317212901cb64bbac65ccb8ccd4bfd4628aa2b31699d67668a7871aef", + "0x12Ca9De662A7Bf5Dc89e034a5083eF751B08EDe7": "0x6f1ebd4f94d378ad1ba74691e12c49775f40283db1a8c921f49940bf94fce3d7", + "0xA69E0Ccf150a29369D8Bbc0B3f510849dB7E8EEE": "0xae1afaec70af79f8ba7f5be04d365eb0d36838075315d45478f936de70a3cdd1", + "0xDF9B5B00Ef9bca66e9902Bd813dB14e4343Be025": "0x9ff3c0feedc0d01da3d74a7c4af680c8a26d4b1b42ca7ce21c064d96d95d33a3", + "0x300Ab2038EAc391f26D9F895dc61F8F66a548833": "0x4ab65b6d26ca58fd472542e92f925968d71e9c86f66383484e813e4fd5def594", + "0x03F3Fb107e74F2EAC9358862E91ad3c692712054": "0xa4d53978e6f8d8a3f6db129ef6ec7bd7d2e35ba49bc24f2466780df8ab1dca99", + "0x682f0dDBFd41D1272982f64a499Fb62d80e27589": "0x2e4446dd07e2690eec8d2517e65935e670803f3d6b2e2677386681be248c7cbb", + "0x8eA89804145c007e7D226001A96955ad53836087": "0xcb471219a257a7107947c3e97478cded98792ec63a467c0792dd9a054bb79f9e", + "0xf5A71257B331C02dA1Eae52151C3d600f16B76F0": "0xad52a9e2f17daa0a790592658904cba9e76f66cdcb01e3b5f528db2fa5e1ad62", + "0x6B1Da720Be2D11d95177ccFc40A917c2688f396c": "0x9bec7f1de3cd32d29c1e9e29c0d2abb5843ab24afd0e9cbc4da64e71eecd1374", + "0x19DFEF0a828EEC0c85FbB335aa65437417390b85": "0x4023e5f7bc05cba393ccfb26be775a3c6bd91b77dbe0565ddd8f3b703be6260b", + "0xb15608d28eb43378A7e7780aDD3fE9bC132bAf40": "0x3936179faac824012944d05a3106f81c37115bcc95df333fae5b031ba2566a4d", + "0x1Fa7F727934226aedaB636D62a084931b97d366b": "0xbc90ce23fc39279e32b265d14ae79f1423375801427de947368d60b137921589", + "0x7ADbdabaA80F654568421887c12F09E0C7BD9629": "0x444b6646bff4858cec3fd57d43ef37b467affb01b58a2b4b960903dcce1b9c24", + "0x4bE0E4d6184348c5BA845a4010528CFC779610b8": "0x5732895d2fbcdd43e0fdbb85b6bc0fcf60522124bd3410d8ce82b02f17533b5c", + "0x3f53A862919ccFA023CB6AcE91378a79Fb0F6Bf5": "0x5e0f2e9fea9b740e886c77032ae6a90c1f6927d9f5b47a0f0bb04b40b920d1e1", + "0x7396f99B48e7436b152427bfA3DD6Aa8C7C6d05B": "0x9b30a9a7c0d03e6ced24bdd6ba36d452ac6b78166c8aa14bd308b5bb3f3252e2", + "0x533a16F90E7d3Ca31dbc608E5EC54967710F0D2A": "0x721083a031f42a4af1d65f5a063c86f39378dad705783206dae70bed24f01290", + "0x8b7854708c0C54f9D7d1FF351D4F84E6dE0E134C": "0x24899b161748b590bd25ac24b797cddc92c9b53ef4dd178a62cf87ee05281494", + "0x19b1C92631405A0a9495ccbA0BeCF4f2e8e908bD": "0x7e28c009ba0e292513d8d9e555ef7e6a9f24278cc7caa238e0aee53969a431a4", + "0x6B5dA774890Db7B7b96C6f44e6a4b0F657399E2e": "0x737f36914ad96262649d1dfc91823cb7341cadf63369c3e68c2821ed5c00adb1", + "0xEa924b45a3fcDAAdf4E5cFB1665823B8F8F2039B": "0x438d9ca4e0e40641ea1073e925d69571ebf0b9c327f45237cc83e88b8d8c4173", + "0xA8920455934Da4D853faac1f94Fe7bEf72943eF1": "0x567e1060088fdfb00e3ab58bda969e02b5af894a48504e5b07a45419cbf69e21", + "0xd60020Ec34Ccf9A4385f917DE8F6956B77853ABF": "0xcd407f2dd85b04bc0470c30816c76a4bfb10afe25a375d3cd60154bcfc3d53dd", + "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089": "0xb305c64747995fccf10d26c15c1f85d8b4bd441fe9f000ad62157d6c091641d5", + "0x96484f2aBF5e58b15176dbF1A799627B53F13B6d": "0xdc2e9ebb55f7cd3418f7a7e091401fd49bba44a90e5d59cdf7c5f02ab7cee4d6", + "0x5DbAd78818D4c8958EfF2d5b95b28385A22113Cd": "0x9d94ebdc30e11d4e20ee8ba0cc2eba5df421735df85a96b147ff667a83659ae5" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/deployment-txs/avalanche.json b/balpy/balancer-deployments/deployment-txs/avalanche.json new file mode 100644 index 0000000..dae1e3f --- /dev/null +++ b/balpy/balancer-deployments/deployment-txs/avalanche.json @@ -0,0 +1,58 @@ +{ + "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6": "0x43a3e6c3f9337d0ef6cae3ee8a1f5030a932c15fe0e8f39c4dbbff5fce54829c", + "0xA1f998a5775Cd85f33039a9b5C29b09097D211f3": "0xb914e84efb1dc9eb23f6224a072343f7ff9a0944d64a487c7664edad56295ada", + "0xdFCeA9088c8A88A76FF74892C1457C17dfeef9C1": "0x5b7078270ed5e9e874c00b62ca1089c0f7173d18cceaa7c8bc1dfff9efe31ab9", + "0xA1Fa945425eD2e08Acb932E000bCc2f21B21588A": "0x5e901fc05790d0dc1987d01d0a6dbf072a8922413a75bf2fabe7b0c55e9dfa8c", + "0xBA12222222228d8Ba445958a75a0704d566BF2C8": "0xc49af0372feb032e0edbba6988410304566b1fd65546c01ced620ac3c934120f", + "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9": "0xd640ad9a706b1c8bb38a136d068f3c4590005bc2e855bcfb53c78c01dece4415", + "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca": "0x64f90b099a0e36b62f8044b8e717fbc5b88f27e298a1229f69f44690b0d00e1a", + "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e": "0x33a75d83436ae9fcda4b4986713417bf3dc80d9ceb8d2541817846b1ac579d9f", + "0x8F42aDBbA1B16EaAE3BB5754915E0D06059aDd75": "0xcf32b5d16350e8eae02701a6414d8787060c693b42f2aea577fa384f5fb3e8e6", + "0xC128a9954e6c874eA3d62ce62B468bA073093F25": "0x2c0d9fba6f613ae5ea9b0b80d1baec0af770e0e70ca75b2fff77d101770a431c", + "0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD": "0xf484e1efde47209bad5f72642bcb8d8e2a4092a5036434724ffa2d039e93a1bf", + "0x239e55F427D44C3cc793f49bFB507ebe76638a2b": "0x839e53c8aaf877b783fbc65c4e1577b2d1bac6bcb9aea64a0924f5c17e3d9a61", + "0x2E96068b3D5B5BAE3D7515da4A1D2E52d08A2647": "0xc52555e56e3d5fc773d329f79925e2dc1d51352bbfbd08c772ace901d5cad879", + "0x6f5a2eE11E7a772AeB5114A20d0D7c0ff61EB8A0": "0x53fdbf4d7a790b1f6fafc7fd24b2896915ec314af2f99647436cc900da18de18", + "0x3b8cA519122CdD8efb272b0D3085453404B25bD0": "0x0fe3e7bbcb39c8539c973589f13088de387be0cb67939899494230c9e77ea029", + "0x4E7bBd911cf1EFa442BC1b2e9Ea01ffE785412EC": "0x59d28d6d6d9887dd0c00f0bdc04a25d90f6d0f8f52d39eb66a81379b3ed293bc", + "0xEd5ba579bB5D516263ff6E1C10fcAc1040075Fe2": "0x30b2750936583e35aa468d17b161d9f04e5c7c5b94fd8d7b8b3d88f98061a898", + "0xd1434a6EceF783461eAd26BAC15Af0709D5734b0": "0xe84ea704c3fd0baaa2e98a85c0e171b2622dbe8506c74fd78c3dda3f896164c1", + "0x94f68b54191F62f781Fe8298A8A5Fa3ed772d227": "0xdf2c77743cc9287df2022cd6c5f9209ecfecde07371717ab0427d96042a88640", + "0xE867AD0a48e8f815DC0cda2CDb275e0F163A480b": "0xeeede9c3d51ea5526ebf7ad511a7bb45ee62cc6fed7932d48a91d29022276cb3", + "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B": "0xa1b91fb60815887e8be0ad56f0a2fb3fbc7c9644158591d5895a83123aea9972", + "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a": "0xa3fc8aab3b9baba3905045a53e52a47daafe79d4aa26d4fef5c51f3840aa55fa", + "0xb2b5B452d53401391155EA48C4451f6E9b0dD058": "0x1abfa796c8fc4cd0abde1e781b2bc66b3aede330b4bf839f665238dde068b054", + "0x8df317a729fcaA260306d7de28888932cb579b88": "0xa918a3292fca9f0f3e6d291c12af51f5163096fae1d7d58dce6d820fd41b9f53", + "0x3B1eb8EB7b43882b385aB30533D9A2BeF9052a98": "0x7b396102e767ec5f2bc06fb2c9d7fb704d0ddc537c04f28cb538c6de7cc4261e", + "0xEa4643102dFC03d5e382e7827Bf767f6587E9965": "0x058e5dab728fd0b341f6b13ea13984821a9fec8473e26df44b61cfeb504ad84f", + "0xAcf05BE5134d64d150d153818F8C67EE36996650": "0xeabeadd805c03b1489fb86bbb72e53b9d29cf3224b7d34d0f00e9901173a2179", + "0x9129E834e15eA19b6069e8f08a8EcFc13686B8dC": "0x4d1f813b92b3f04be086237c8bf013dcd8ea89326b56fd3912948b5bd672ef63", + "0xA69E0Ccf150a29369D8Bbc0B3f510849dB7E8EEE": "0xf5d664b4ba29d8c1c8606c2b4fe9a2525e204742287a95d1f70060599cdfa8d2", + "0xDF9B5B00Ef9bca66e9902Bd813dB14e4343Be025": "0xb2ce2cd106a7b32b71b338ecf75595332acd4cacff7fc87cfed0b3a152979fc4", + "0x300Ab2038EAc391f26D9F895dc61F8F66a548833": "0x92ec16f99d42467dc46860dd6a7d9bafa45c3b82a6f6238b0633473a8e3f7a10", + "0x03F3Fb107e74F2EAC9358862E91ad3c692712054": "0xc070486373b3fa3e7de540d506f52e2749f71223a9e96325846a16b91ad6241e", + "0x3Fb81f6FB0dd94c6fC7e138887f1CA4CDB5E2999": "0x2863b94b65665436e4e59b08cd6cb49df9043caa2dd83194871ae0ffa690449f", + "0x6B1Da720Be2D11d95177ccFc40A917c2688f396c": "0xe4664f2493fee9247e8d94fe72c5b29bf07972f5674181b115bc0e27dd8eceb2", + "0x0c6052254551EAe3ECac77B01DFcf1025418828f": "0x1da23a0d9e72bbd9ee0bcceedb940117b5e6d2765404019e39452e3104c4025d", + "0xEa924b45a3fcDAAdf4E5cFB1665823B8F8F2039B": "0xaa444624b93708cc951be1459f31bd9bf7f90b4c676e54eb79edd10200e7dfce", + "0x4b7b369989e613ff2C65768B7Cf930cC927F901E": "0x99ae7f566339328aba167a253c2d8c7817aa04879d7fd9a58c702ad1c028203c", + "0x161f4014C27773840ccb4EC1957113e6DD028846": "0x2292f77a8dfa1386d3e5a001d1c814e345b395e7c1ca4b0b87c81bb38cf9a1e6", + "0x4638ab64022927C9bD5947607459D13f57f1551C": "0x93a5e0a3199f70ed910e59ec4cf2e11ea766b07b66a2e4dfec590e02dae22b2f", + "0x6caf662b573F577DE01165d2d38D1910bba41F8A": "0xe6da5ff95682ae217b060d5b0899e34015966c06e95ae5179708c016ff3e8a51", + "0x57EA28A99394978D060E483477C0Fd9fb9aFa96c": "0xd23966e7f541a6231f154002651fa683e75e63f6548646c1492670c4b5f242f7", + "0xD8B6b96c88ad626EB6209c4876e3B14f45f8803A": "0x9b244629df54d1f002a060dd5c7ebbfb8eaa8a422e05489c5ea9ef567dabe3f3", + "0xA826a114B0c7dB4d1FF4a4BE845a78998c64564C": "0xf137340008c7897487853f68d28f2c37cbb4aed67e31feaac10c9f9e43687c89", + "0x4507d91Cd2C0D51D9B4F30Bf0B93AFC938A70BA5": "0xa656ee18d900a5f5819f3e70f1f45bb201c95976aa545d194a73c3bec590c055", + "0x2EbE41E1aa44D61c206A94474932dADC7D3FD9E3": "0x339bd8ef98247d12ffc8eb586710648100eb255e1f8ff2c705aa91ad8affddfe", + "0xEd3E2F496cbCd8e212192fb8D1499842f04A0D19": "0x174068905d431373eaba56267351448814b0ec85bfbd263c29bfb0fa00bfd2c7", + "0x687b8C9b41E01Be8B591725fac5d5f52D0564d79": "0xfbb7fb13230ee6b6dbb56d78d4d98a7de26a6c0cf9acf580d8dfe0a6d0d67db6", + "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5": "0x57b0e25fee976fd94c87125d32f7d9c280dddb51b38eb959f67328caddc70be1", + "0xE42FFA682A26EF8F25891db4882932711D42e467": "0x000659feb0831fc511f5c2ad12f3b2d466152b753c805fcb06e848701fd1b4b7", + "0x9FD66B741ac546055E04E768Dd52edD33574D453": "0x2e7397a1c8c34862196a0c8861018971560f1e53c1e447674af354685ec0ec75", + "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089": "0xeb22d31341ada7b78ff342ab16d3a8f5aee6a59b7b308b91df14c124a67289f6", + "0x85a80afee867aDf27B50BdB7b76DA70f1E853062": "0x8a411ddf12f1c5fc3f9d2977cbf6acd5f1f93585338663866aaf195de9190e52", + "0x4132f7AcC9dB7A6cF7BE2Dd3A9DC8b30C7E6E6c8": "0x91692230f4387f34c19cbf178d21d314e9bfcd3f87131182ef258b47fcc5c170", + "0xf23b4DB826DbA14c0e857029dfF076b1c0264843": "0x953db3dab598c93521a3328724fdcb382339f183e7e4fdaaccf1b63b94567e96", + "0x36caC20dd805d128c1a6Dd16eeA845C574b5A17C": "0xea5666c98e53723d3f2f794fddc63aabf10e8ec91ba84d96963f9d535d985e91", + "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6": "0x98f5e020e44143c890b635ccdf772758bbb3d902d7ca797f3d042ff7635d5d04" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/deployment-txs/base.json b/balpy/balancer-deployments/deployment-txs/base.json new file mode 100644 index 0000000..0601eda --- /dev/null +++ b/balpy/balancer-deployments/deployment-txs/base.json @@ -0,0 +1,53 @@ +{ + "0x809B79b53F18E9bc08A961ED4678B901aC93213a": "0xb6a3a5af45121879d79595998c3e0d2a131bc8cbc116074822b7a8a52195e4c0", + "0xA1Fa945425eD2e08Acb932E000bCc2f21B21588A": "0x73e096f36593fac5149ef2a330fad6d48d0f640c8b4a1cb65a9c90ca52ef4f5e", + "0xBA12222222228d8Ba445958a75a0704d566BF2C8": "0x0dc2e3d436424f2f038774805116896d31828c0bf3795a6901337bdec4e0dff6", + "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9": "0x5b05fdf99962af8be94bb0fa18bf69f879171850c77a98fc3c8144aa36aa8157", + "0x6CaD2ea22BFA7F4C14Aae92E47F510Cd5C509bc7": "0xd4e943b9159f6e51a05390773671c9f58097ff67d109972d857e11348c46d402", + "0x475D18169BE8a89357A9ee3Ab00ca386d20fA229": "0xf487e3fdce5432401107aab5ae8da48f8171ea5d213696a1b16d82204026c07d", + "0xD87F44Df0159DC78029AB9CA7D7e57E7249F5ACD": "0x9dccb6c220142ca82a501dc05c095bb1857f7590240d2f1b111646cd8fb89369", + "0xDEd7Fef7D8eCdcB74F22f0169e1A9EC696e6695d": "0xf0c4a054dfa0b565bd612d0239d8522fbbc49610753bc3fcaa2f549bccd82969", + "0x8df317a729fcaA260306d7de28888932cb579b88": "0x1d291ba796b0397d73581b17695cf0e53e61551e419c43d11d81198b00c2bfd3", + "0x7F6E9d6a4093Af9d09bAE92d24bfE42Fc5369aE6": "0xd58a0a1e616cccab89a941eee9f9c92505f36890366677277ef06636becd4eb5", + "0x4C32a8a8fDa4E24139B51b456B42290f51d6A1c4": "0x0732d3a45a3233a134d6e0e72a00ca7a971d82cdc51f71477892ac517bf0d4c9", + "0xd9dbbfAA703f3C33838365aE00fE4EB22CdF8d46": "0xff7fab85ef3434cfc3de60a2aa7abaab8b3562f85dbb846ae2f52e1ed1e0f898", + "0xAcf05BE5134d64d150d153818F8C67EE36996650": "0x5d1a6592bb97920a237d6c2f4e2bef92aeb59f2d56d2db01c0c071ad01c941f5", + "0x9129E834e15eA19b6069e8f08a8EcFc13686B8dC": "0xfabd283f9fbe8cc47c761bc40e9e2d014290fba4ed164e66f123f8de749ac212", + "0xA69E0Ccf150a29369D8Bbc0B3f510849dB7E8EEE": "0x4c869ff47cdecf6f70b0f3694ebaa8f26c484a9af5436da360479a653a81b8a7", + "0xDF9B5B00Ef9bca66e9902Bd813dB14e4343Be025": "0x7d5381f540feec4237b4a353dad4c0d9f288fbe98699b948265071f2485aba07", + "0x300Ab2038EAc391f26D9F895dc61F8F66a548833": "0x425d04ee79511c17d06cd96fe1df9e0727f7e7d46b31f36ecaa044ada6a0d29a", + "0x03F3Fb107e74F2EAC9358862E91ad3c692712054": "0x245418cbc4f3db52084fae39dbea5cefe8300fd0f3258726bd52086a32217891", + "0x682f0dDBFd41D1272982f64a499Fb62d80e27589": "0xdf1f7fc69055f6502ebeec2a2db6556e3f11b95281b72a62862200e2d6fe625a", + "0x8eA89804145c007e7D226001A96955ad53836087": "0x09c54498ddfb8ff74904b8ac028a456a4bf8628355b1100c6262c54bed2e1cfe", + "0xa7d524046ef89de9F8e4f2d7B029f66cCB738d48": "0x5c1ad72e9c3ababb23214607bb2274f6c8da6d700f628430f19ee947bf79970e", + "0x6B1Da720Be2D11d95177ccFc40A917c2688f396c": "0x9e09267bc68798793700ffe05f9697b32948e1fbdf3397be22a523e055fa9929", + "0x0c6052254551EAe3ECac77B01DFcf1025418828f": "0x0529de9dbe772f4b4f48da93ae2c2d2c46e3d3221ced9e0c4063a7a5bc47e874", + "0x71528afe250438e184b2deAF7947f0f45931DF3b": "0xdc1727acbf01ace17bbe6ca4fae9fcbbeced935ef386c38215f16decaaa0f3f3", + "0x161f4014C27773840ccb4EC1957113e6DD028846": "0x565a125426de866dd9a33c30e7dc5d7e6b4d7610bb1d8944315d703240321389", + "0x4638ab64022927C9bD5947607459D13f57f1551C": "0xf65eb3027ddadb2e533070528d1dc219abb65748b50596745d6572fa06f00646", + "0x1CC2E10C486Ffb7228810B9c7C183d0CD92cdF44": "0x409a4a467fcad05f47f8deee638d698e058bc36854c932f3a571cfdc3dd78a40", + "0x687b8C9b41E01Be8B591725fac5d5f52D0564d79": "0xd71efe5856c4bf48742963d213d4e014d14ce8723b027245c593989a06f7a2d1", + "0x88ED12A90142fDBFe2a28f7d5b48927254C7e760": "0x2f3ce16b45d8b66294cf19c1e1ce81cee70b9f157c6f141d6b076593d386b8e3", + "0x698CaED853bE9cEA96C268f565e2b61D3b2BcDA4": "0xa6bab493ba33020a210c7a8c5b524fa13ba08f69d91c060063e35a29908b5e76", + "0x712e23a9B91Aa30EE7997d1c7a1a285d4C7912D1": "0x2afdad34bf1e499205302bb0802f5cfacf3db2275a4f3ca978796e0f54211e9a", + "0x44d33798dddCdAbc93Fe6a40C80588033Dc502d3": "0xd75e6a2b698db8e21f0500073ef558b232bec7dfab7908ecbafd99f45474240f", + "0xDBf7B9F1d2Bfba14e42709f84dda3187eE410e38": "0xcf4bbe036cdc50d3754bac5c98718b7d9bc40534cb277467d24e9df3c5ad21fb", + "0x369877467FC3B6774DE4E11E0c0AbBdE70Eb40FD": "0x0262976c98dca636d6c969d212db76f9c159b1f752ab440a823ffb3fcf3f5b49", + "0xaf779e58dafb4307b998C7b3C9D3f788DFc80632": "0x2e402abaa45b3815b5f81a62de9021db6bf10a8ab93fa81b2f370e11c47172e7", + "0x0A973B6DB16C2ded41dC91691Cc347BEb0e2442B": "0xdb275c012bc328510dba46b0db07a826aa3fc9355ead66a4ae47715131b799eb", + "0x9Dd32684176638D977883448A4c914311c07bd62": "0xb58d0ee2cd912e1692c946587e1825b857ec9f69ec825315a456d922e819a65f", + "0x79e435875cCee3Cd9e8da23fE34F9A011d05EA6C": "0x23e08a6f020f202f731a3a8bad8a38a64f6de878ecb74b7bc4c511792d2ec229", + "0xb521dD5C8e13fE202626CaC98873FEA2b7760cE4": "0x5824cd45012ad9a41d35685528cd5bc08277cc4868903549551ab077fe87544f", + "0x3c28a59356B473847AAa5e0b6F561636079213A6": "0x96b4a76957bcdfe134c36be78f4e6fc0d46b7f1d8633921c0cea751b62a3893a", + "0xb19382073c7A0aDdbb56Ac6AF1808Fa49e377B75": "0x6fe1a8185195b7f0fbeffa471c1df74f65a7ef8d0ef9db805feebf9e724de424", + "0xEF454a7B3f965D3f6723E462405246f8Cd865425": "0x1d52de25e79c34bfc3c630866e7e0d864117ba379d81ba70b4f7f781ac24c141", + "0x7d2248F194755DCa9A1887099394F39476d28C9a": "0x967858a969a045e0bbd15a85537159329de214146168dc2df16ac1efeccf9f9a", + "0x7920BFa1b2041911b354747CA7A6cDD2dfC50Cfd": "0x3e63ee21efb9e24af82e0d8c77f596c351a1289c5667a49128fe8a63f8ae6656", + "0x313a8D36b1d90a4cba3A505fDc3480C3870bE053": "0x1707c5a1038c1909531611deab785395e3d78248c08ab684b3e934bd35a93acf", + "0x9a62C91626d39D0216b3959112f9D4678E20134d": "0x1bb6d81817574c553e3f65fababc0b0310aeceb3b5a8c567f4271ceda052fa3b", + "0xE50AD96Af9370D05D3C1cE85F17C31557B29C4Ee": "0xd79a9e12b5575c7a6c30e735eda2b0f3e76d36273bf864b7a3f5798be473a201", + "0x0c5538098EBe88175078972F514C9e101D325D4F": "0x00fb951b772ede880b280c42f277114d17ebc62eb7db7f8f858583358fb6f2c4", + "0x9f7E65887413a8497b87bA2058cE6E4Ef4B37013": "0xdfbd2bd1df2191d73ee34210f24d886f7d6b9c29a7b86dc15249dc804dcfcd38", + "0xb1a4FE1C6d25a0DDAb47431A92A723dd71d9021f": "0x0bed227a5de010878ca78a0b457cd6cb58df5d491163ee8c339304e163d19889", + "0xE42FFA682A26EF8F25891db4882932711D42e467": "0xe4e40a72bd07b1f5ecda4500a9d7a82ba148972319d12760b5db67974b3e56ff" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/deployment-txs/bsc.json b/balpy/balancer-deployments/deployment-txs/bsc.json new file mode 100644 index 0000000..6cb541a --- /dev/null +++ b/balpy/balancer-deployments/deployment-txs/bsc.json @@ -0,0 +1,59 @@ +{ + "0xBA12222222228d8Ba445958a75a0704d566BF2C8": "0x1de8caa6c54ff9a25600e26d80865d84c9cc4d33c2b98611240529ee7de5cd74", + "0xce88686553686DA562CE7Cea497CE749DA109f9F": "0x1de8caa6c54ff9a25600e26d80865d84c9cc4d33c2b98611240529ee7de5cd74", + "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9": "0x4450804fb53396d1f555e9f69a6bacf27602547e4b95a63f70ac821352db37de", + "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6": "0xe4b97de787b6c4868c1ba3c027801af0fcf56bdccd23f11b3a6871954301a6be", + "0x239e55F427D44C3cc793f49bFB507ebe76638a2b": "0x084244738a2e9394e96abcbf2abf874f039c2198f8e74cd7714fce57ce1f19ba", + "0xC128a9954e6c874eA3d62ce62B468bA073093F25": "0x5d16dd9647a25c7a19dcdf21d7713a68670a4f9f9c012f5e8189b468b326a2ea", + "0x8F42aDBbA1B16EaAE3BB5754915E0D06059aDd75": "0x0352fa61f9f0d4bb1ad1844608a3d3129a25d4f7715413e9798e5f302314d75f", + "0x4574ccBcC09A00C9eE55fB92Fe353699A4fA800e": "0x0352fa61f9f0d4bb1ad1844608a3d3129a25d4f7715413e9798e5f302314d75f", + "0x41B953164995c11C81DA73D212ED8Af25741b7Ac": "0xd3133fd7378f992cf243f9d96f6da3c1732a383bf05a6302fd7f71058b83dc77", + "0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD": "0x8b964b97e6091bd41c93002c558d49adc26b8b31d2b30f3a33babbbbe8c55f47", + "0xf302f9F50958c5593770FDf4d4812309fF77414f": "0x6c6e1c72c91c75714f698049f1c7b66d8f2baced54e0dd2522dfadff27b5ccf1", + "0xD7FAD3bd59D6477cbe1BE7f646F7f1BA25b230f8": "0x991626bf991c6d13e048021817ed7063acf7363b887caf59be9295063fae5dda", + "0x2E96068b3D5B5BAE3D7515da4A1D2E52d08A2647": "0x0a1d0126d0f98a0f59ec6871812860a1277b6341a9460f2e87e1b233f2619c22", + "0xb08E16cFc07C684dAA2f93C70323BAdb2A6CBFd2": "0x435a144cb5e2d6a034c7a7f60f33d3901d8f674e185133e417c9087659a51204", + "0x3b8cA519122CdD8efb272b0D3085453404B25bD0": "0x8c201d75a5443b8c69457ab670c266c262c77d4126f28c83accb0fb62c5164b3", + "0x4E7bBd911cf1EFa442BC1b2e9Ea01ffE785412EC": "0x3fe398e134b2db4cbd7d819cee11d871ef205e4e9da2fbbf139e48fb47f8c394", + "0xEd5ba579bB5D516263ff6E1C10fcAc1040075Fe2": "0x13773340f332fb34ccc7c196f06835c08dd2ba1845c00ce4f7d4dda39a75841d", + "0xB848f50141F3D4255b37aC288C25C109104F2158": "0x64ebd54c5ffd514d3e6f0f1fbb6cb8ff4c2d1d95bdc59bc6d7ba658d68ddd769", + "0x4ca6AC0509E6381Ca7CD872a6cdC0Fbf00600Fa1": "0x9737a061a12946a6d53467816dd413ccdc7b54158935e0625553ff60cd464315", + "0xeb151668006CD04DAdD098AFd0a82e78F77076c3": "0x241d8e5ff7fc8dfc460808dbf17f1a886c971dd493bcc1f673f523b9dd0cdc9d", + "0x85a80afee867aDf27B50BdB7b76DA70f1E853062": "0xe823ced163b8e95e360ec8bdc97448730e38a200e0d6b53105bb069dae661f25", + "0x373b347bc87998b151A5E9B6bB6ca692b766648a": "0x80ae2ad141f6494e8fce0d930f15df349e63341cef273393718cca242b5f7a6d", + "0x1cbbE6cEa5E4fE7D69c586b4e362A646DEEf105d": "0x311d6cc7e57fdf51d3550538f213bff46d819e48454b497ac69b3b2dff396f37", + "0x4C4287b07d293E361281bCeEe8715c8CDeB64E34": "0xf4f27837ddf68a7533d3c86c67ec8457f44745af037f0737eb495390edc909d1", + "0x6d471c05f8A99Bd8f991467A8283e3DC968b8D7c": "0x4bf1ce7590b918174f6b7d6c7295d40b73eb888083f541985353eebbd9698d32", + "0x1a505Ba1cA84D1A4dCF14c8E4866e556B060c974": "0x13625ca3a2ff1ad221897cb41c63b61f114ba156c9d4b7ae4e08d38e13891899", + "0x6e4cF292C5349c79cCd66349c3Ed56357dD11B46": "0x91107b9581e18ec0a4a575d4713bdd7b1fc08656c35522d216307930aa4de7b6", + "0xacAaC3e6D6Df918Bf3c809DFC7d42de0e4a72d4C": "0xfe0c47c2b124a059d11704c1bd1815dcc554834ae0c2d11c433946226015619f", + "0x463957510888720f1EA65B599e996aaD4264206A": "0x3a8fda1221f39aa87cf272959c9fb2375e95e17cbc7b8d56a7f02bf82f67043b", + "0xB521E108c8aC5aD91Dc16d0001b7253D3B3beBC5": "0x791814786fa491e0f8b2277682ba065e19826a554bbede9b048a87706999afee", + "0xf23b4DB826DbA14c0e857029dfF076b1c0264843": "0x2128b35d786a8083e1afc854de79d03555d3544356e9e04ece7e02f4cb2dc2e1", + "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6": "0x5c60e885058c13fd168ff9b7abf3169f06ce1988dac70bb1add3614485e33dc7", + "0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88": "0xc967a66e651493b06034b2943a658f15116b0b8e280b28c6127c03f27e7ca5e7", + "0x11884dA90FB4221b3aa288a7741C51eC4Fc43B2f": "0xe7b88b09a953c43321f8ef60ad9f3d3c157f63c3ca5b47ea437667a085a9742b", + "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B": "0x2f147f913b39154e851470f3c2b41f21e5aae11b520a8f58b1f62ba8b3c1f411", + "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a": "0xc7fada60761e3240332c4cbd169633f1828b2a15de23f0148db9d121afebbb4b", + "0xE7eE2d64bCB1B2C915898E9DA0947DA1D413DCAF": "0xcad2a552e1c1e2d0f3963d20af0baffa632b9485ee2bc2704ada9e1760f69591", + "0x1802953277FD955f9a254B80Aa0582f193cF1d77": "0x2819b490b5e04e27d66476730411df8e572bc33038aa869a370ecfa852de0cbf", + "0x7C53dBf28a23faB07E322fb35eC53A296f548a45": "0x50bcd7c3291dfae6ed8806dcfc0f73319eaadcf861ddb56391b9a9e86fd59b83", + "0x20AabBC59F3cE58e0ef931380d8Bf2A6fE681019": "0x20423b94477c698215f497ad09e91fdcd14df06857049c4df0fea0fd16082f91", + "0x59562f93c447656F6E4799fC1FC7c3d977C3324F": "0x8fcec9a9cddfb1753933a3997f0cdb7b98a176e0c81fa55bcff92d89b1873e44", + "0x2498A2B0d6462d2260EAC50aE1C3e03F4829BA95": "0xfabed4ea2dd0d6f8f2b3444d5186e140bf5e3dd2056dc1f94227cd0eaaa99692", + "0xDEd7Fef7D8eCdcB74F22f0169e1A9EC696e6695d": "0x68a6f3c9904d63963ab36836d23885f76d0f1c1cf797cda44c268b031e59a116", + "0x8df317a729fcaA260306d7de28888932cb579b88": "0x9477949e838699c08f97bb865a1041db4a8bbc9a69330bb5107b8879458614d9", + "0x3B1eb8EB7b43882b385aB30533D9A2BeF9052a98": "0x42a65ab208cae4df7a3b6145c0c92e18a6bfc2d981f2245e0d44fa4c34cfb07c", + "0x4C32a8a8fDa4E24139B51b456B42290f51d6A1c4": "0xfe743326897d35abf0f444844ccec1b190fbdd8e5c0290c27c3633539716aa53", + "0x710A461Ea47AE36C45CBA8Cb6ce964e8A5cb87eD": "0x9836463db8cc68ca99cef2d03f14f18a47ca1a61be4271b503605d8c5172910a", + "0xAcf05BE5134d64d150d153818F8C67EE36996650": "0xf81d1deaf29d2e80f2e700373edf55562050f2c5bd798186d35a2e97c0e12e8b", + "0xE605Dbe1cA85dCdb8F43CEfA427f3B0fC06f6ba6": "0x49be6f1a60a92f7fcf7d274c56f5a809e972bd0ac2cbdc203af0aea080bc14f3", + "0x5F43FBa61f63Fa6bFF101a0A0458cEA917f6B347": "0xe6b6edd2e8343cddc006f1bd91ac7aabdb74b50cf1e2703b34ff49154781ce93", + "0xC101dcA301a4011C1F925e9622e749e550a1B667": "0xafb99e829f00dd531327cccddb10e06fe7a557ec083924f3ed1590210c19d79d", + "0x2Ba5fd37e71Ab2633602553BE7ad5A377D7ED31A": "0x5baf40a671b1dfb3b15da114af2efa45e4458de003714d569b3d0ac124c5d653", + "0x4fb47126Fa83A8734991E41B942Ac29A3266C968": "0x5bdfed936f82800e80543d5212cb287dceebb52c29133838acbe7e148bf1a447", + "0x6bDa27339629e2d031F19555D3E44c205c31a13a": "0x67c2c47cb8be94fdf3b171e364e6ccbe154533781cd01a5ef67e88ecfff848de", + "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089": "0x01baf60a77f2ae4854f3a242785ba2505f7e7643dda38428ee5011bbc59d91b8", + "0xa523f47A933D5020b23629dDf689695AA94612Dc": "0x2467bf82429af738c99ef18db714842a589234c45e6dfa8150b263b69a091f12", + "0x6817149cb753BF529565B4D023d7507eD2ff4Bc0": "0x6c228eda588ea0acac47f32cd6ee95734d31b26d530d665199b40d7d43423692" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/deployment-txs/fantom.json b/balpy/balancer-deployments/deployment-txs/fantom.json new file mode 100644 index 0000000..e1a72a2 --- /dev/null +++ b/balpy/balancer-deployments/deployment-txs/fantom.json @@ -0,0 +1,9 @@ +{ + "0x974D3FF709D84Ba44cde3257C0B5B0b14C081Ce9": "0x9b3ec8fe9f5daace7799b75f609893586674a43c075780704efd66e8a4f9cddc", + "0x20dd72Ed959b6147912C2e529F0a0C651c33c9ce": "0xf20fda67cd02d4c925b21e7e03a1a005d87c5cf565fe0038618e8976952d84ac", + "0xC6920d3a369E7c8BD1A22DbE385e11d1F7aF948F": "0xf20fda67cd02d4c925b21e7e03a1a005d87c5cf565fe0038618e8976952d84ac", + "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a": "0xcfd907698d30a8c99a857573944ba512f41041f00b4a80107075532531181afe", + "0xf7D5DcE55E6D47852F054697BAB6A1B48A00ddbd": "0xc29b723ff783a778ce0ef6a7f43040a720e134af0e03547f5d94fc3045844d62", + "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B": "0x04ce127af1d5addc67295c7e2d5375ed9ea8bc4a2ace73b2f3507ddcefb18a06", + "0x1B0A42663DF1edeA171cD8732d288a81EFfF6d23": "0x020b022f0f0392cc765afb9cf140137721c4029d45d89251943f5416224f2a97" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/deployment-txs/gnosis.json b/balpy/balancer-deployments/deployment-txs/gnosis.json new file mode 100644 index 0000000..74181d2 --- /dev/null +++ b/balpy/balancer-deployments/deployment-txs/gnosis.json @@ -0,0 +1,69 @@ +{ + "0xBA12222222228d8Ba445958a75a0704d566BF2C8": "0x21947751661e1b9197492f22779af1f5175b71dc7057869e5a8593141d40edf1", + "0xce88686553686DA562CE7Cea497CE749DA109f9F": "0x21947751661e1b9197492f22779af1f5175b71dc7057869e5a8593141d40edf1", + "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9": "0x6f0f049ca10159d79929ebcfb2f33060fedf9c2fc4c88cd76bfc528ae5883ee2", + "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6": "0x9da39e9402b3e67748907c961cb3e1823b718d5cdad6a82608083b7c96152406", + "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e": "0x5beb3051d393aac24cb236dc850c644f345af65c4927030bd1033403e2f2e503", + "0xD7FAD3bd59D6477cbe1BE7f646F7f1BA25b230f8": "0xa73549d6c273de359e12409303d364b45475111ad51074dfdf712d7396c3b7b1", + "0xeF606F58A4FD0fCcb066c6203d0994694d3eB2D3": "0xa73549d6c273de359e12409303d364b45475111ad51074dfdf712d7396c3b7b1", + "0x5aDDCCa35b7A0D07C74063c48700C8590E87864E": "0x9e1e23355a424ddb6fd4a313fa90a594f03799eb33cb825291c5231c9b59f119", + "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca": "0x816a4a7a91b0e0e9b6c059679d9e3238d1b262b6858ddc068b4accfb969071de", + "0x41B953164995c11C81DA73D212ED8Af25741b7Ac": "0x7f8604819232f1fcf17af9627975367b2b9c01cb97d27518348f8fbb98d7ccad", + "0x8F42aDBbA1B16EaAE3BB5754915E0D06059aDd75": "0x125b85b96ba628ecf87c452e55f2760109d63fcfad7051d1534c4daa63fb5305", + "0xf302f9F50958c5593770FDf4d4812309fF77414f": "0xa3467dfc41e61cd0fe77cb185f87d44cfccb8f6590a9089ac98d97dc62d5023f", + "0x85a80afee867aDf27B50BdB7b76DA70f1E853062": "0xbd56fefdb27e4ff1c0852e405f78311d6bc2befabaf6c87a405ab19de8c1506a", + "0x4132f7AcC9dB7A6cF7BE2Dd3A9DC8b30C7E6E6c8": "0x584280b863a4c36d12dcc8cbefc560dafb43147ca6b8aaa7bf5d6cd5dfa2ddca", + "0xf23b4DB826DbA14c0e857029dfF076b1c0264843": "0xe062237f0c8583375b10cf514d091781bfcd52d9ababbd324180770a5efbc6b1", + "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6": "0xf3a3ecdff7604ba29fee72912e9c646632ecaf7d62b28ebbead8aa89dc401b47", + "0x707B7d4a1bAe449d546DCAb869256591bbB3d70b": "0x0df2697f1993e5cfaf1b6a76cd58c648cc2f67863f38dea0d0ee1b8f844ad647", + "0x9dd5Db2d38b50bEF682cE532bCca5DfD203915E1": "0x61e9c3d0bd91ad094c0ab4c9fe32514c4a602684bc30846f507a8153867be972", + "0x9805dcfD25e6De36bad8fe9D3Fe2c9b44B764102": "0xab1ed0ecdeadd2a32382e4e2b13df929f4e74c8d4269415e7ba51ac0eca2b912", + "0x5cF4928a3205728bd12830E1840F7DB85c62a4B9": "0x50eef6b86769f4b399fad903b90cc07d6e3f8893a39a5b6cd26e4a9d8219c6f2", + "0x581Ec1f5e7CeD12B186deaE32256AdB53BDd5B08": "0xd0cb3ba0b190576923032623c48f751a3b48e21292bc545c50066c922ff1da18", + "0x4fb47126Fa83A8734991E41B942Ac29A3266C968": "0x511cb23dcb4e0fe5af4963e894a38bfecd46269e6782fe4b44656366be44782a", + "0xc3ccacE87f6d3A81724075ADcb5ddd85a8A1bB68": "0x7b93966bc03249316ed472efe1a59fe91d3142434fadec59464e5b02dcc61ca5", + "0xC128a9954e6c874eA3d62ce62B468bA073093F25": "0x2ac3d873b6f43de6dd77525c7e5b68a8fc3a1dee40303e1b6a680b0285b26091", + "0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD": "0x2abd7c865f8ab432b340f7de897192c677ffa254908fdec14091e0cd06962963", + "0xE051605A83dEAe38d26a7346B100EF1AC2ef8a0b": "0x8c703c64213eef703eec525d0a99f9b8cabe112f2447f07ff95dbc87a86444f9", + "0x07c896050dD6E273c199f06d7516F8A4A369d23A": "0xdb6f2d2d5fd149e1b3740be6d68355e9840ff9fdcf8d9b6ca44f6eaeff35a215", + "0x9dA18982a33FD0c7051B19F0d7C76F2d5E7e017c": "0xc74d928df8de9708af0bdfa2c7b3b93878607526d284198f80b99a66f9b9a962", + "0x81cFAE226343B24BA12EC6521Db2C79E7aeeb310": "0xd4e87f76ecb6694c1674394bed6a6966a44a9ef51070cdd0c0dac10127d48b21", + "0xa523f47A933D5020b23629dDf689695AA94612Dc": "0x57f4c8f873326e46c2d6d12292f4edacfe8a37cb8741a7c74517cb8169561f4d", + "0x225E0047671939A8d78e08EBd692788Abe63f15c": "0x3df7be933012947dcb6e428c658cd48cefafbc81d2be7cceaa8fdcc012ca6522", + "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B": "0x47ada806e4429c0e3a6e728b05bb72a0a75feb43385c24d4da442edaeb944f05", + "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a": "0xf1b6844ed66ea8b26e126184356bd33b52ebf9edb5bdfb8040f8bb72849f759d", + "0x809B79b53F18E9bc08A961ED4678B901aC93213a": "0x80b812c2b44d29e5e6c5275ece19ca506933f63002890a733ec38f925e6aee97", + "0x1802953277FD955f9a254B80Aa0582f193cF1d77": "0x8841a2e11814f4aee93c4017caae38708e77c45bdeec863c94d0f4aba4c36af8", + "0xf7D5DcE55E6D47852F054697BAB6A1B48A00ddbd": "0x492086f1411ee12a2e072c61bd0b52ab5141cd1950300580b367437b5220b5d7", + "0x6B5dA774890Db7B7b96C6f44e6a4b0F657399E2e": "0x4497a34da0a65c3bedacafcdf38a1faed169792bed3aa823d42602a0d198fa0e", + "0xb9aD3466cdd42015cc05d4804DC68D562b6a2065": "0x14f351703d6e5f208bd5d6e011535b08159609ef7a9bdd24101385ff5a2d1f0f", + "0x6CaD2ea22BFA7F4C14Aae92E47F510Cd5C509bc7": "0xcb6768bd92add227d46668357291e1d67c864769d353f9f0041c59ad2a3b21bf", + "0xd8752f9b0A2c2813796AbD2bE212A32FFd656EF1": "0xb41ce8cab67ac0bd4c26a23438702abc6cddf5a4656193543ecc52e8c4abcb3d", + "0xD87F44Df0159DC78029AB9CA7D7e57E7249F5ACD": "0x2739416da7e44add08bdfb5e4e5a29ca981383b97162748887efcc5c1241b2f1", + "0xf3678A0b54C61ccD88Ce321c2e07f87aC75F08B9": "0x5433098c3bab330a27136103aac9b3bed89de3cbb143b86b5c6b5221e5579289", + "0xA8920455934Da4D853faac1f94Fe7bEf72943eF1": "0xd97fd6efb700a6181ec462f59ce24b373004adf19025b78bcb55e9768fc004e8", + "0x013D4382F291be5688AFBcc741Ee8A24C66B2C92": "0x58acc665b6f72647526329dbcc5fd31d9e2a9d46aa710e9e1ce93eb0776d9bb4", + "0x7A2535f5fB47b8e44c02Ef5D9990588313fe8F05": "0xd33271f84d9b45fed2031cbc53f5370400fe086a030da57d99037cebd2d10dbb", + "0x96484f2aBF5e58b15176dbF1A799627B53F13B6d": "0x7b707b43bf06c08387c07bd3efa411304129faa959d62100c9860f1227258855", + "0x83E443EF4f9963C77bd860f94500075556668cb8": "0x9f8de23e7ae78fcd8b7821595470910b7a861791aacb650c62adb643a552dee8", + "0xeb151668006CD04DAdD098AFd0a82e78F77076c3": "0x030d00bfd70db19e3205f7c21ab13fbd1b6aca988cc58b810e00027ac07d492d", + "0x4C32a8a8fDa4E24139B51b456B42290f51d6A1c4": "0x43633e412586f1537205f37bdaf1e7cc28296d8162b4d59ace6f5eaca4a195c9", + "0x54f8F9d28e26Fa5864cfA80f50A5Df95fD85f46a": "0x3deb731788cbd5df88f105e3eb6238eff2dca4f40d2760359c63114f9a77d3d7", + "0xAcf05BE5134d64d150d153818F8C67EE36996650": "0x2d11cfc42e8c2cb6c0bd55dfd2a9af1458ee6d30af89ac08076e10f05beded59", + "0x9129E834e15eA19b6069e8f08a8EcFc13686B8dC": "0x0336f4e63566959dfa8395dd14694a3aade6a490246105fe185ebee0b86e465c", + "0xA69E0Ccf150a29369D8Bbc0B3f510849dB7E8EEE": "0x9243951944edb8bc823c8d386fa393b27edb01c56dc071cf67b5018dc4daa320", + "0xDF9B5B00Ef9bca66e9902Bd813dB14e4343Be025": "0xa90687a9aa069123c4a3e4cd5759afb2d672a5656cf497f07c5ee428548f3f12", + "0xc061361fDa32fF5b65F7D98aCC9a87349d3F0768": "0x196561364f4d83202697bbe3e64332ae431d2655afb46260db8f5bb831eedc0f", + "0x03F3Fb107e74F2EAC9358862E91ad3c692712054": "0xd5fcccdd85ba51820476982fbdc90174cdde94dabc1902f71af34b53c0a36add", + "0x62aaB12865d7281048c337D53a4dde9d770321E6": "0xede358dd2b7eda340a6b658babf879ef3dc015922107fb2ac88842d448e81f3c", + "0x040dBA12Bb3D5C0A73ddfe84C220Be3ddBA06966": "0x8fd98df44a30c25606fa62bb2482db53cba56c7cd9dfcda18fa0ada73215dd27", + "0x35d8f4a4C0E95f3d925CB4CbBbf513a0172eD8A4": "0x6534aa7576caa0b882fdc4c30a87c9599d1e44f70cf99c932b6562f8b54692b5", + "0x1AC55C31DaC78ca943CB8ebfCa5945ce09e036e2": "0x50158d2b89cfc6546f290ac3fa8dbc42695045aeeb0b8be4658395fa72026944", + "0x5DbAd78818D4c8958EfF2d5b95b28385A22113Cd": "0xefa9e1a3520e48ef0027fdfc32768190c69de4842f1371327f3a6e96c177ef92", + "0x682f0dDBFd41D1272982f64a499Fb62d80e27589": "0x2f6926c3c0ab0b2438d08cc937a13ef9454eeb9e3fea897eca1ba26d72be60dc", + "0x4bdCc2fb18AEb9e2d281b0278D946445070EAda7": "0xcbf18b5a0d1f1fca9b30d08ab77d8554567c3bffa7efdd3add273073d20bb1e2", + "0xa359b6BB0a89ED9f237C83f32fF05c658DA8b3aB": "0xdea5bdb3efbc3d2472e75ba5d3d70efde628b78ef4d99f0260940f6723e7570d", + "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089": "0xfdb63e6be459203287cfb8647de40611c4f6795c48fae2ac0736b5b3a59bc890", + "0x1702067424096F07A60e62cceE3dE9420068492D": "0x3df0d8483fce43d11c813032ecdb5c8e0c34354ab7cdf80abe1a50fc708c0079", + "0xDB8d758BCb971e482B2C45f7F8a7740283A1bd3A": "0xdcde98dee90abc1083b789ce69a4f433bdad3e86c4b1b2ea3e35edd10d892f97" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/deployment-txs/goerli.json b/balpy/balancer-deployments/deployment-txs/goerli.json new file mode 100644 index 0000000..e35f13b --- /dev/null +++ b/balpy/balancer-deployments/deployment-txs/goerli.json @@ -0,0 +1,148 @@ +{ + "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6": "0xe25363bf5037b94088c02a522d43ab1bb3f50a5438b501291d5a230e61c33288", + "0xBA12222222228d8Ba445958a75a0704d566BF2C8": "0x116a2c379d6e496f7848d5704ed3fe0c6e1caa841dd1cac10f631b7bc71b0ec5", + "0x5aDDCCa35b7A0D07C74063c48700C8590E87864E": "0x8ea4d20a3aa5fde9c1b75c5dfcda90d1355deee85051c3f1a02de905255e4ad0", + "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9": "0x0ce1710e896fb090a2387e94a31e1ac40f3005de30388a63c44381f2c900d732", + "0xA5bf2ddF098bb0Ef6d120C98217dD6B141c74EE0": "0x5d5aa13cce6f81c36c69ad5aae6f5cb9cc6f8605a5eb1dc99815b5d74ae0796a", + "0xb48Cc42C45d262534e46d5965a9Ac496F1B7a830": "0x7dcb9e2026789e194e6e78605ac6a65e00392ba5d73e084d468e3dfbb188ea70", + "0xf97c7788d2D74b12CbAb2Efa0c69a44280211457": "0x19d080b20890c558bfded824a4b96a66f780990e3b2327d0e63681992f71f099", + "0xA55F73E2281c60206ba43A3590dB07B8955832Be": "0x3626bf5702c9ea4fc775317fd37772e3a4164e6dd659fa8c5fc3297b0f53794c", + "0xdc10e8f47B6858E32218E01db224795235872B19": "0x0dadfcf0ab7b549c2fcf89a96ce7fc35dacd0674f6cb9a5a643bc105607a5e47", + "0x80a94F458491CA88F09767E58a92FD23Cbf1196F": "0x25633ed58913a17869ef373e819191b9203e1cc4f2c0286510ce394d9a0e7a67", + "0x35b50C7955e7D0E8298e043C9F4dCDef737b9f5a": "0xac9fbd2659e3745e95fabcc54047f603555f67ad8562099179786e51aebd336b", + "0xB0C726778C3AE4B3454D85557A48e8fa502bDD6A": "0x278e68794c90221334e251974d65bbd7733f5fd7ef2617c978bf7c817828ce8d", + "0xFB2f4CE9843E1069CC1F9d76e0236d6dFF2b1eeA": "0x1d75d62f277873fc63a762e44e0954922dc4333d3810f0060ffb31a9a0c1c4bd", + "0x8002d3e5875b38C5B03da83aeB430dC63E047F62": "0x1d75d62f277873fc63a762e44e0954922dc4333d3810f0060ffb31a9a0c1c4bd", + "0x94470C12fc192e071F12Fec1152861608CE01562": "0x097f5bfe2bff8f5ff425adda027189d32abb6bb80328c0d3bbed1b090174259e", + "0x41E9036AE350baEDCC7107760A020Dca3c0731ec": "0xbcf55ac3102f9cf9dc64456658c8f4f62ed509e086f73f60f718d24a0abcc1b8", + "0x5D90225De345eE24d1d2B6F45DE90B056F5265A1": "0xf5e3238ce080fb428aa9863685318e5fd921a76e0b005502f73fc023f6114a9e", + "0x45E617B07021B97407367624648d1A0A358a751A": "0x18652edf794d89b1acf5ddda9bd68a48d11c2aeadaa4a0b6596db6749c113ace", + "0x0F32D7D830E20809Bcb9071581A696135dD472B7": "0xc6978bd102de876dc3f9a4e59405447f536e39c58cec2a117c763dabdf30bc05", + "0x0Df18b22fB1DD4c1D4bfBF783A8acF0758979328": "0x5da2bc919a6ecc0f74a1794726931448d54bc9c588529c2d6ab63959bfb9e212", + "0x33A99Dcc4C85C014cf12626959111D5898bbCAbF": "0x172ba908936fabe43044de42694598c9e0923500eabfebede6c97112005b255e", + "0xBB1CE49b16d55A1f2c6e88102f32144C7334B116": "0x1bc729c9985648b7785d46fb806ceff3e32d1ef9963e664af7a5ba15d0b73b23", + "0xdf0399539A72E2689B8B2DD53C3C2A0883879fDd": "0xc3a1c157b17d5526490004967d54b69f178b7323742ad2e773ea23a682879ed6", + "0xfE734760aD346d4013FD597c4f4a897aef332128": "0x655915f12f18a8ac5c625c6cd5c21e19f92db8144910f378a739a1af27c0cde9", + "0x224E808FBD9e491Be8988B8A0451FBF777C81B8A": "0x2d5d9089caf830b09e6ab586b56b140e6e0ab28d2d2070425bfb97ada9c95d08", + "0xd14FFA46C211eac64338c27549c3312380f850Fa": "0xa552176f1c626fdb1109bde8daed0bd6746d495142ce72dbfb8f350d6e8d24fe", + "0xfA8449189744799aD2AcE7e0EBAC8BB7575eff47": "0xcaa6737410d382a6bfc68a56e2beaee72066b45bd8bff6145ffaef7fe64a2eb5", + "0xcfF73979321788d59a6170fF012730dB2087f31c": "0xada2b37e88df1f8fec66d0a9e597dafe88ab67debe2d540981d312c77cbbed18", + "0xA1F107D1cD709514AE8A914eCB757E95f9cedB31": "0x1492cf1340213afff31989aa27e61d0fa36bbcb20f40c16eb9b07de7827ac8d7", + "0x7F91dcdE02F72b478Dc73cB21730cAcA907c8c44": "0x88608af7fe5828eccb5344e1bf77a0fc01320c151c5f33890e9ce1a00f32054f", + "0x3C9F788131A26329A689Bd951b5aCb4454669487": "0x8e17c705aa991bd383957d0228ccd8c7e958c624ba4b4e2a50c30bd83520a74c", + "0x44afeb87c871D8fEA9398a026DeA2BD3A13F5769": "0x4d8719fd92229abef303e47f3133155089b5ec4aff53524bca3a0b42936e458b", + "0x10aF508f3b0e067Dd5eA3149A003457F49C8bB69": "0x3b605a0526dcb018cd4b8e7929420bd88f096bf6cd1a2f088d16faf10da712f3", + "0xdc15A3C5D16413C1C1F75Db0f75c4ae2a4104650": "0x18a318bf36aa3f4dbc94a94e2c2c70cafe2adc5552befac2b2d1eb3e21466359", + "0x40Bd3fAef4268EA40F4c372D7f0A44C3EFaAA6b1": "0xa47e8f54280d7c50eb61ee96421528dc660427dd3cacd3261aa28a1858aef612", + "0x5B5B72D76B68f4Bb1d2A10EF0fc77711f8Ec7ed0": "0x60ace616b174dce9e9d7c42825017cdd6628c4918bbfdcd5c6d8055802ed1d8a", + "0x393B918Cc2Ffa238732E83dD4eE52343f57d767b": "0x33c85b30aa2b9d14a56771d418a3f46582992d16057f4ea8150a955ae943ea55", + "0x1b6DF1fF5db99F8a8A04D38f7478BAB056Fa35A7": "0xa13f14565a5f285f9c0671c1e76359706415a7b762e7b06c9b8810cda8a41262", + "0x194F864aF5a7F224E9E79Cf110cC5B4e36e2ddFc": "0x347948a460173d947c71b2e4eb025ef98cb0f539ba197d2066fcd691207bb78c", + "0xbD84e83b164aaCa0E2DABf3Aa27a9B7A1d62d200": "0xed07522077fde611744796f0ae0cca88397ffe2387bd63c2c1ee2fa92e58d6a7", + "0x4b9A00DD766DB94Df48C2901C321174a5cE75529": "0x209d2ce45874c905dcf465b19b81a97938293f53591a2a8d767c45c8135ef041", + "0xBe9458ab5B6F289e524410141c8d5E20A6b035fe": "0x68f958c53eb9a4dc4aaf6d1e68750dfbc039f07eb037626c059b632c6a86ef02", + "0x85153B639a35d6e6CF8B291Aca237FbE67377154": "0xdde4bf6b32a2d8e1d0aafc8bf3e82a4b27f4396a29c892424d2a2a795bfa2f83", + "0x55B18f514D7f0C6C886d0C23Ac72dF5D3B5F8850": "0xb6b77224dbcc967aa835559cae1e72326be9aa6a95fdef01d9b8b019d96c2f61", + "0xD360B8afb3d7463bE823bE1Ec3c33aA173EbE86e": "0x71bdf2cb1d2cf4c1521d82f6821aa0bee2c144252c3ae0dd7d651cb5bbcbc860", + "0x42bAF6db21250fa76d015621D2F6DF172858A5cb": "0x00a32364bd6b3d17765be8f260ae3817dece638fa65eacb3a0b4ce91c67d5c38", + "0x7AF980bDBc36D21CE228EfABCCA35707566A2be5": "0xf4d174c73337af3e4a8ccc2b8bed061da453aae54981339f6cc9d0ac48d39192", + "0xdcdbf71A870cc60C6F9B621E28a7D3Ffd6Dd4965": "0xb31d328ffbc7383c81a42bfd1fd4420ec2f63cc36e5cf21f9bc7bb229db99654", + "0x05a0BF0540F346b6Dac25550738343BEb51C0f65": "0x7c2d19d0869a29e27f14fd8d48ba252cb1ec1a0869aa9d7d1e573d135c6c9f2b", + "0x42B67611B208E2e9b4CC975F6D74c87b865aE066": "0x33aced7fdeff6f9cbce8343370eaf2e771a607fbd06f3106c6fe5629390a232f", + "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5": "0xf8820b414b66d93b430590fc09ec262e374c404fddd3920cdc5ec4869f1f2352", + "0x8F42aDBbA1B16EaAE3BB5754915E0D06059aDd75": "0x3254ef870ff30a8affc11de1408ef686798c2dc7796ad95803bd30ccdba52e0d", + "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e": "0xc2a0b14c5dac2b550e98f6c07f7fabed073fd0cacd7536910191152189ffd07f", + "0xD7FAD3bd59D6477cbe1BE7f646F7f1BA25b230f8": "0x50dc987d79951ea16cb07ce44189c1a51253454fb7a6f50290f84709b880ac17", + "0xC128a9954e6c874eA3d62ce62B468bA073093F25": "0x75d95195e938dd905b7be5f26447dafcadf9442fa3a54e03937595265f506320", + "0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD": "0xecf621288b707681d22c618755d93c8abfab7fa75aef9921785591df86e9b04f", + "0x239e55F427D44C3cc793f49bFB507ebe76638a2b": "0x8ec7c85803a4abcc59d8620b1c6401624e0d988eaedea8eaa1858dce13766b5a", + "0xB848f50141F3D4255b37aC288C25C109104F2158": "0x068e47605db29b7f9e5a8ba8bc7075fe3beab9801b4891b8656d6845f6477721", + "0x2E96068b3D5B5BAE3D7515da4A1D2E52d08A2647": "0x848ef78b49a4f66dc2e73c344491a4b37b213a5e5da30f5fafafdefa9807c1ca", + "0x3b8cA519122CdD8efb272b0D3085453404B25bD0": "0xf4281462a669f2e6a10ffcee1e24e60ce807acc8cfd8fc86697050b99035f0d0", + "0x94f68b54191F62f781Fe8298A8A5Fa3ed772d227": "0x1c7435e7341b103f10e662e200b1c3a7623787630c905406c0682a7d2dd8ee16", + "0x992b827a42ac301DF16Fedb3eBbEA59AC1DC35DE": "0xe8f2ba298653b7b0f2d0a778384f03829ff5a35dad4e97b0e3cc104d7d72ec84", + "0xeb151668006CD04DAdD098AFd0a82e78F77076c3": "0x4916a4f2b241e5ed5075d934842df58275ee6f92fea68ca76e8877ca155bdff0", + "0x0343311A33994a3d27273505560ED73dC2BD0Db3": "0x2b3222cf5fb2c705bd3dda23f54f7e99909a7cf1a1134ea5aa759b851cb9ad01", + "0x782640c4e71F523152AE0942ee7589fB24c8367D": "0x8533c10822c5afcb97ccd307194b69ff6d00d908ebff7fef90daae9ed4fa8b56", + "0x3EAd2FdcBEE244d9fA5b8d233EfedD34Bb7D2434": "0x784dca0358a2919f8d3f420eda9a89c328843364ac112fc0acaf494c9c4a0c4b", + "0x1cbbE6cEa5E4fE7D69c586b4e362A646DEEf105d": "0x170290f6b39219649d631453af9d9fddb59d711b6ec65afa3d3f61280cae808e", + "0x4C4287b07d293E361281bCeEe8715c8CDeB64E34": "0x52be397c5953b761bb814614f35c944ef260931d0fa86d3753392017304313f0", + "0x6d471c05f8A99Bd8f991467A8283e3DC968b8D7c": "0xb1e1d97e5074f2e6dee8234979a4557a8deb2d20109f03cce70cb795e5725fad", + "0x5c89d9E1A668d0B39F4EC242F280bdDd445C633c": "0x95d526d4a4329b3ee91e0376813dbefa8286f27152164a8c876ca7d85c6b39ea", + "0x88D07558470484c03d3bb44c3ECc36CAfCF43253": "0x9bc4424ec5f304980eb798c71d152722af83f561e0e5cd2653f7667b0802bbdd", + "0xacAaC3e6D6Df918Bf3c809DFC7d42de0e4a72d4C": "0x9aa8cff640c2a1992c0ad8732b202adada780c2ffb659dc1a31a2a92777fc14e", + "0x8aB784368A1883DA90D8513b48801e2Db1cb2D5D": "0xe908907a76ca9187729a78ef2814cee5481819a914340db4882522386c7890b9", + "0x994086630773dC6cB54D3A5E0Ef0963532789E75": "0xb90d6cea041058605a596a7b988f3b0f08cfb457fb332e4cc53708f336ed86bc", + "0x8E5698dC4897DC12243c8642e77B4f21349Db97C": "0x3e8485ee25b828946c7aea95388214d7d208d85b50e96860e4a8e00afa6daa74", + "0xee47ef369CDa5a65639D7794b70a4d247826DdF3": "0x2e73806eba95a16ee3009eb8da077d1faa39db65ad2b6b63a114b1c10dba4352", + "0x85a80afee867aDf27B50BdB7b76DA70f1E853062": "0x652709f2f555d1d38febfd567abf9b4bd0fcccda6ad0eb0341c540730bc6f740", + "0x373b347bc87998b151A5E9B6bB6ca692b766648a": "0xb0f85bd0cb95451e8dc26d4956699a16cd7ad47d3c0f1a952de77e937af17a8c", + "0xf23b4DB826DbA14c0e857029dfF076b1c0264843": "0xd97f6363f6067ff3dc12a8748d2c8307256d07532428e549db5e2c5b1e5a9788", + "0xd13AFc362F619b840C8f4AaC1D957cE219eF37Ca": "0xeb4e8cf2670cbbc96d137146fbc05435e88b7d7126f472dc099549f01297feb2", + "0x70Bbd023481788e443472e123AB963e5EBF58D06": "0x8f7f3040ee33b83c4ed3f4598003d5ead88c99088f97721cc967398ee30fef9a", + "0xBF6d7e9a6db814D2856c9e2f83442f60f9D40738": "0x4ee29ce0fb71dd61f93520cf0c2d17c917e92a8741e43d6e04a1b65f5e76c8b6", + "0xAAda0aF3FA5C819145dA760bab8F180DaeeA8514": "0xa8a84019f8cbe7e04514bf34eb31d36b0939bb9cafd609ffb8ec08bf43eb4bb3", + "0xf93F6382913d1dE6Bdf683A94be8349751af8d59": "0xd98701640cf6c489ed8eb33241027659a52dd2a83d4fd11c3aedc8cef0e00206", + "0xBd35248F8325DD1cB2bBf9D01E80A6bb99a792Dd": "0xe7e2fc74e9ae186fbeaa0add2355bca6a0b7d1ae7e2d5a9f648ac77fd8ac6ad4", + "0x26575A44755E0aaa969FDda1E4291Df22C5624Ea": "0x20850573d9efcb8882046d116bc241f8ff9a5d925fcfa345441facb852366e74", + "0xbfD9769b061E57e478690299011A028194D66e3C": "0x63fe0afaaf0df4f197ea7681e99a899bed9fb0b9b3508441998dc3bbc75abef1", + "0x2EF26d97B5870600BE341561298938c2e5df84f0": "0x02453dcdf100ede2ccc583127b007ad7d288b14e5a84e4e7a16aa64e4ff734a4", + "0x0441ff033652bcEB75a011887F17B5dfC84Ddc6f": "0x0d28017d62cac4358ce3b915e5aa7553948a99f25aa52ff6cda200c47ceccd4c", + "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6": "0x96e1482753943da73148a80f638c10df70f2911cc815c4d77e3b33901215ff09", + "0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88": "0x54cef807364403ccae1109625a2dba7c8f3d85219a0baed7599b185e63a2dd96", + "0x9dd5Db2d38b50bEF682cE532bCca5DfD203915E1": "0x125e1d7e094875fb74dde84fc95e0796209d3fa566ef32b97499c3c160660eed", + "0x707B7d4a1bAe449d546DCAb869256591bbB3d70b": "0xcd6b070d5cbb9617e7dc30f1d0198151978869a14b6f7316319dce436b08e1f3", + "0x813EE7a840CE909E7Fea2117A44a90b8063bd4fd": "0xfcfbcdfb01e67d5db1b8a92a11c79b324dcdf1f7c09285fecb1d3317f6f01fe3", + "0xB99eDc4b289B0F2284fCF3f66884191BdCe29624": "0xb9c8abba9c304c66c87a077cba0e41db02da9db8fa8a11d7de24007e0e14708c", + "0x43Fa2c00419F60e18966Aa043DEBd4701CB91B6d": "0xef97cbd77c6e9962ff0390b50d34256795d5de8966f19be6e947fa34dbcecfd4", + "0xBa240C856498e2d7a70AF4911AaFae0D6b565a5B": "0xa1965a30f3af82bcc27bead2cba81992c2e85ad641417c84a3f8b908295be902", + "0xa1C22168262fbaf5a87b9Aa6A13122BE630085E9": "0x232ca24dff13b2ec02799804cea309215555e3cbdafd6f7898cc5bf117fe9de5", + "0x744644537fB1AE7c4E05f6331e87126b4fd0C325": "0x89c200013b4b5ee1a28083641b8b7ef2f4d92dcb9395fff20d8235f0a6679729", + "0x2a12a248f9b56cE6e7fAbA62D1bBA8735FB513F9": "0x463e6bb59fcc0c46c27deb96c772763db6776b6ed11e9060323e0b6964f572f4", + "0x057Cf03e3E0EC8D5a5FaFb3A0fC99a0aA0C1989e": "0x3be39c987c5e56e4de947c6d3ec3bafc5ca6666e327eb574484433229aee6279", + "0x6D2b8b4EBa8ac88F8467D84bE010d344bFBD90e2": "0x4fb94c7715b0723034ea0613d736c3f881634ef23ec80c640496bb9ce29730f5", + "0x806E02Dea8d4a0882caD9fA3Fa75B212328692dE": "0x9872ee58373d91f13ffbd66f0ece0286282cb08aebcf8797782a092e63e8a028", + "0xa496bE32F7C9Abc49E8ba91A23d37cF6fA58651B": "0x1a6cdcbd03a299be326d70b1d8b6ac85cf916f72fac2b0812fc005b4ec856c28", + "0x4E11AEec21baF1660b1a46472963cB3DA7811C89": "0x0fc54f588b1ea6234e10733c0adfb359a3362aadcfe22011d90c02ee13e967d8", + "0x007E1830BcC05039c3926d6478F6B2912376e52E": "0x310b96192aaeee4dfe488f0839c27beda84b1db99680d62515054e9c9cbb9e57", + "0x5cF4928a3205728bd12830E1840F7DB85c62a4B9": "0x22b963a32722c8a39b124b2c6c23c6494b8eb4483e13df2ba0112a8d993b0ee4", + "0xE3881627B8DeeBCCF9c23B291430a549Fc0bE5F7": "0xa01ee6d2fdb0d1cd878ac577154ca526159d04a125569546f71e041de11803a3", + "0x4fb47126Fa83A8734991E41B942Ac29A3266C968": "0xf37b39771c6c15d920a0f267f1539b0a5b85988abb6f1da74a84ecdb42634f71", + "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B": "0x97b229ec32c9d5baca0271149e063a1052ba032dc8c5d5f200a38d57d3f95e74", + "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a": "0xf573046881049ffeb65210adc5b76f41adbd2202f46593d22767e8bbd6c6198d", + "0x072ED560cc042d7aB1c080a9e4fA8C6f4858dEb3": "0xe8bd9e1a97000c26ac83ce8eee3e9c406368f2b3d2f3f32b185253f82880c6dd", + "0x1802953277FD955f9a254B80Aa0582f193cF1d77": "0xeb7c53925dfc372103b956df39bdc7b7360485838e451e74ce715cd13a65624a", + "0x5D343D374A769D1AB102e0418a516DadB08A86E4": "0x6331443c8fd3cfa3271206a461994139e22b733c02d6252675c9897d8677b1c3", + "0x81cFAE226343B24BA12EC6521Db2C79E7aeeb310": "0xfa7617dd94a3c0a1cb565904b10b1e36b3e73fb242a15c7dd877572601408e5e", + "0xa523f47A933D5020b23629dDf689695AA94612Dc": "0xbac489f06d389d27555cd7a07e03652b324bde00ce8db65a5cf63f0e7ea3d7e8", + "0x6817149cb753BF529565B4D023d7507eD2ff4Bc0": "0x6504a6adff2db180244a0c7396c60c9ede2f6274c27cd614d03a2d348539edc2", + "0x6B5dA774890Db7B7b96C6f44e6a4b0F657399E2e": "0x8fe7dc58cda6469e880cd840c078bb01991d8b32d82a8643243f036e3a516a22", + "0x7Ba29fE8E83dd6097A7298075C4AFfdBda3121cC": "0xefae73eda892b77d6f0347a3ceab8f027f16f7f29c0aee59a82be40dadf730d4", + "0x7159c4b96bfCfCA232355B55778e85Cf9E245192": "0xd211a922a8c31cfbd6dcecc24f339cf636e3678d7e43382e9d3ac672a23bca39", + "0xEF44D6786b2b4d544b7850Fe67CE6381626Bf2D6": "0xc195d46fc578a51247b7cce77f431d10aada4010c32b3044ac7bc65f9e1ad407", + "0xAcf05BE5134d64d150d153818F8C67EE36996650": "0xbe212798869c3548e98ec807b9929507bb73492322093ffa5c865b6fc471f655", + "0x9129E834e15eA19b6069e8f08a8EcFc13686B8dC": "0x1a0450f8c48731f4e848c95d007940bc79783312bb33166d9c18150ee79ead80", + "0xA69E0Ccf150a29369D8Bbc0B3f510849dB7E8EEE": "0x07f33ffef48301ed02cf36ea3c35464f5bc6e7762dc0ff435b3212d639a2da06", + "0xDF9B5B00Ef9bca66e9902Bd813dB14e4343Be025": "0xf84ce167d3093be660ac137cde58f5695a1965714a768eaf4229383d49d9dd40", + "0x300Ab2038EAc391f26D9F895dc61F8F66a548833": "0x617fd46655d8b44d10ef99e5885f4d3d4b286e4a375b703da4c5f40d6477c6bd", + "0x03F3Fb107e74F2EAC9358862E91ad3c692712054": "0x12ac8c96f1b3122e48cca574a3651b72521dc491facf92d67b3baa5699a8fc94", + "0xff79b51ec2934Dd1810a8e0325e3B08708720B26": "0x71695e901a85acf82407f2e3fb8ee454e96aa05c1b9072b2bf15edbd88e2f1f7", + "0x8eA89804145c007e7D226001A96955ad53836087": "0x40f8781f06bd7f5b9e0bbf6bc6df2fdc099c1bd8f1a208aa9805dd40a389e904", + "0x30FD8a0f7009F50616aFDaB4aF91a0A2Ef4eaE49": "0x3739dc19544b1462a06da8bc0f6caa00c6bebfd1f5e41334059b96870f1ff9a6", + "0x7153De1A6d71360F07017838c28dEcA0d6C03e2a": "0xe53d478a3873b03d085beee455cf983328cf027c17c1e6a527629eaf8cb0c40e", + "0xa7A7e22398622bf71fF31DAe5355EC7843b13806": "0xea2a5c5d0035571ebaa59bc377e969e699d24f006f7d3fe3841ce3dd3d64a7c1", + "0xB8BDCbF8ccf443D055d5Ffe1d8154fAc8187fC94": "0x12d7887a0f80e049565b195082d6d349d03723b584448efe4d2523596af56049", + "0xBbb66a4fFf47701EC6c528dB615f5E7bF1AbDAAF": "0xa45f4b9e387b832fb747ffda30d1b4659b902902cf859bafb01641d901edaf8f", + "0x18C100415988bEF4354EfFAd1188d1c22041B046": "0x12c159cab8984d798aa33fa3d4e74b288863c666e5e0c3e465cac192de0f0d3b", + "0x58cA9F130d2e27EC94d19e53a6BEb2C4084f2638": "0xa429a1bb69d9abe852945b63b6f0422be16bd2b099a81e28633b6b30cbb6c334", + "0x83E443EF4f9963C77bd860f94500075556668cb8": "0x361de400c7ebdf7f675149fcad06180c9cfeb3175be9d28451a35a6eb7f0f879", + "0x5DbAd78818D4c8958EfF2d5b95b28385A22113Cd": "0x97cff400ae9011bc12fbb2839129fa1d3d31059ba2fe2873637348ab69ab3061", + "0x3f170631ed9821Ca51A59D996aB095162438DC10": "0x1f98174071bbc5ec22cba6772f17cc023977e16d6d7a668709aaa26965e6b651", + "0xa7d524046ef89de9F8e4f2d7B029f66cCB738d48": "0xf95f77eac96ce3a342d62225351986754605402333cc87e861ba76a0d3da94a1", + "0x4bdCc2fb18AEb9e2d281b0278D946445070EAda7": "0xbe4b6a7cc3849da725fdb5699432646e051e275b1058b83e97d62d595abd23e7", + "0x21cb3534c12E956a600cB3102b825686D10888e7": "0x2ee4340fb592c1c3e222b9fc06101d2d133ce734862a85e041427b51fd7ca5ec", + "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089": "0x6564b03fdcf7c6bb98659ab5f2aacb0a5953a8a71f457b7ebe8b53fc129c3161", + "0x1702067424096F07A60e62cceE3dE9420068492D": "0xdf57d3529fe002b2c49e3783ea581b1bf4ec9ceec246dc501b719c374ed4411a", + "0xDB8d758BCb971e482B2C45f7F8a7740283A1bd3A": "0x040a10d5f7827a064985e4dd6f980c491a8d5d99ed29edbf914ba9197b9346f1", + "0xaD89051bEd8d96f045E8912aE1672c6C0bF8a85E": "0x5e02d6001484c74f527d45128ee91864452623f5b67a997fcec9e079a8be2234" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/deployment-txs/mainnet.json b/balpy/balancer-deployments/deployment-txs/mainnet.json new file mode 100644 index 0000000..b1ae2d8 --- /dev/null +++ b/balpy/balancer-deployments/deployment-txs/mainnet.json @@ -0,0 +1,167 @@ +{ + "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6": "0x3a5218c06f36fed9c4965c75215e87423280317b757d65ef117f4ed69003396a", + "0xBA12222222228d8Ba445958a75a0704d566BF2C8": "0x28c44bb10d469cbd42accf97bd00b73eabbace138e9d44593e851231fbed1cb7", + "0x5aDDCCa35b7A0D07C74063c48700C8590E87864E": "0xe15a5392004f685dd4158ec2ab1cca8d8e5f88403d860cd67bda2f9d0174792d", + "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9": "0x0f9bb3624c185b4e107eaf9176170d2dc9cb1c48d0f070ed18416864b3202792", + "0xA5bf2ddF098bb0Ef6d120C98217dD6B141c74EE0": "0xf40c05058422d730b7035c254f8b765722935a5d3003ac37b13a61860adbaf08", + "0xc66Ba2B6595D3613CCab350C886aCE23866EDe24": "0xfd417511f3902a304cca51023e8e771de22ffa7f30b9c8650ec5757328ab89a6", + "0x751A0bC0e3f75b38e01Cf25bFCE7fF36DE1C87DE": "0x665ac1c7c5290d70154d9dfc1d91dc2562b143aaa9e8a77aa13e7053e4fe9b7c", + "0x469b58680774AAc9Ad66447eFB4EF634756A2cC5": "0xa92ef420fff995b2301a726263915ea36b8a6fedd1d846e4f14ad83cc91dbc13", + "0x67d27634E44793fE63c467035E31ea8635117cd4": "0xa2853807340e33ffa078cf0d10c3a2cca64eab9580301dbc1e377d8c89bb85b6", + "0x884226c9f7b7205f607922E0431419276a64CF8f": "0xabf1b308e42ca2278d02ff8926ca370de063f8b57fe39d34314a7dff5cd665ea", + "0xdcdbf71A870cc60C6F9B621E28a7D3Ffd6Dd4965": "0xec051c846a6304a3b54d749d66528c14a419cde7ca121fc19cc77ed329cb4d16", + "0x72D07D7DcA67b8A406aD1Ec34ce969c90bFEE768": "0xafc4be6dbb487ed0ccceff4cc8861238dcefc1345113eadad241d8db259e2dba", + "0x48767F9F868a4A7b86A90736632F6E44C2df7fa9": "0xc7e6346bbb2d42232f4cc9bd8fcdbd683280980105bf185252d598a89054aff7", + "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca": "0x7e9e1fa17eff872c9851ed2982ff3080d37e67f2bddf04edbe5cff4c742cf8a6", + "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e": "0x298381e567ff6643d9b32e8e7e9ff0f04a80929dce3e004f6fa1a0104b2b69c3", + "0x41B953164995c11C81DA73D212ED8Af25741b7Ac": "0x29c6eaa234ddeaefc409f2320b754024be5391b979b0b17f4a83c92e3e25eb91", + "0xAc9f49eF3ab0BbC929f7b1bb0A17E1Fca5786251": "0x29c6eaa234ddeaefc409f2320b754024be5391b979b0b17f4a83c92e3e25eb91", + "0xD7FAD3bd59D6477cbe1BE7f646F7f1BA25b230f8": "0xfcbfecc2d7c2451697886d851c98ff56e209a89e166d1695679dd8a20d2c6a43", + "0xb08E16cFc07C684dAA2f93C70323BAdb2A6CBFd2": "0xa471b8caf95fe5973d4f44add6a91f256256df40a9a9edfb0334fbf6e9b8667e", + "0x8F42aDBbA1B16EaAE3BB5754915E0D06059aDd75": "0x7ec850d8e902502b3cb858ece419676b6cbbd60f83c60bfb41b382966722e3da", + "0xB848f50141F3D4255b37aC288C25C109104F2158": "0x607f7a2bed19231fc091a7eb700c2c9147ddc8c70b9772b1760241be8a7f4923", + "0xf302f9F50958c5593770FDf4d4812309fF77414f": "0x047203586713d67546164610f02639334668a42eb5772aadbca008f39f21c63e", + "0xEd5ba579bB5D516263ff6E1C10fcAc1040075Fe2": "0xeb8d5a5f8029d6a8372ddda5351cd0d6700aac36c15e12925365ef2f8c24ec1a", + "0xC128a9954e6c874eA3d62ce62B468bA073093F25": "0x3d421900747b1793d12c516b9d20057327a1057b76a56b98b0556d18d70571f3", + "0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD": "0x69d0355862729073f8d25ef9d6d3ecaa1f001f7e339a465430326c931125b3c6", + "0x239e55F427D44C3cc793f49bFB507ebe76638a2b": "0x591e5a729dc85e3e0edd2d63ce93a7aac26ed5ec3878c73664ea5d4547f0aa98", + "0x3b8cA519122CdD8efb272b0D3085453404B25bD0": "0xc9828a540619b902ee2aa87058072a2dc70cd9d8c209737af6c5a2dfabf2b4a1", + "0x4E7bBd911cf1EFa442BC1b2e9Ea01ffE785412EC": "0x69b9fe9b5530d8640cb66546dffd7deeca2bdf40e005caf3049836fa031b640d", + "0x94f68b54191F62f781Fe8298A8A5Fa3ed772d227": "0xe4268aa3fbd18072c7bd95ab145b3c955af635997d5c8aff3c766f1ab5cb8b6f", + "0x2E96068b3D5B5BAE3D7515da4A1D2E52d08A2647": "0x2c487a62e22d713058dfabb7f8789f8ecfd5a2ef0ef3536418ab8f5ae39c1fe6", + "0x6f5a2eE11E7a772AeB5114A20d0D7c0ff61EB8A0": "0xfde583d7c4d839a7537156385e2b393cc9c3180af840629a284f753bcaabb8b3", + "0xeb151668006CD04DAdD098AFd0a82e78F77076c3": "0x9ebade9014815039f26be04abb8997b5113ebc1fa6ce808f3235e45b565d4bd1", + "0xad901309d9e9DbC5Df19c84f729f429F0189a633": "0x8562ca63b19952e67ea14b1b5d3e7a9bf3fce96df80474adb7d88ead72cb6db8", + "0x4C4287b07d293E361281bCeEe8715c8CDeB64E34": "0xcc3044f91aed68a5811d2b180b5a21528592bbf5eacf2108647957ab7dc25dbe", + "0xd13AFc362F619b840C8f4AaC1D957cE219eF37Ca": "0xb13a53bfb7ccc38c5a75f512d457549599cd39326a39ac45809c70c4460af7cc", + "0xee47ef369CDa5a65639D7794b70a4d247826DdF3": "0x84276e933a6ae7454a88631197fa98ba0ddcb39df11cc9c4f42642fb8220cfeb", + "0x26743984e3357eFC59f2fd6C1aFDC310335a61c9": "0x0068bb058c0222bb2c929a75c1a383c0c3916cec8a5219970f0d1600320ef49f", + "0x7869296Efd0a76872fEE62A058C8fBca5c1c826C": "0x46783d6a0e5389f7a90e0fffb1f09f3471c3debdb76ab06259d418c8de26fbd8", + "0x26575A44755E0aaa969FDda1E4291Df22C5624Ea": "0xb0ffe270598f3fe8ee36726d3a8910ac14eba29c429c96013548acb72a421855", + "0xbfD9769b061E57e478690299011A028194D66e3C": "0xb331661982566c968a83472b84ef2a49f617444d47454dfd26313a6c9b61540c", + "0xcA96C4f198d343E251b1a01F3EBA061ef3DA73C1": "0x0dd98227681a13fde11f9943b285bfdd8b3ad67d12f0ead07a17f483a99de7ff", + "0x5ef4c5352882b10893b70DbcaA0C000965bd23c5": "0x6aa7d8c816f1fe9e4f1be5c1ebbf85ea2327502229a036a37f12d5dc13c51e4a", + "0x44A41fE82c9539C1aadaBEE5B9C3f327eba5C8a3": "0xc4a32921f1858ba91d1704e80a0c2f27dbc5d85f0e7569d43bf5cacc12844ca2", + "0x34ac9f7ebA9213C827fE5Abf5b09A16F4D0cC69b": "0xa6506769a55df818e9bbd545d26a1b9e0083714c3d8e8753d4657851a3b1769c", + "0xB496FF44746A8693A060FafD984Da41B253f6790": "0x59f6dc69332e7c05bdd3400861d9fe6e84e06c2fb2075f1c36835f69117ac7a5", + "0x8df6EfEc5547e31B0eb7d1291B511FF8a2bf987c": "0xef36451947ebd97b72278face57a53806e90071f4c902259db2db41d0c9a143d", + "0x56a1bAf2f7A163CE66067f0062DA60930dd0CB31": "0xd2c13024f44d81f6172b505796c7372da384cdcef88d8ca800e5cb5a1bf286b8", + "0xE061bF85648e9FA7b59394668CfEef980aEc4c66": "0x42c1def229cfdc5c8dd0ea312f35e5501375c1748b8afb16805de18710184608", + "0xd45369c11870e2057D5be17Cc106d32Ea416F7c4": "0xdcd6eecbc2b1fe9b38554e945169875f044d6e172bd11706de7dadbfb9018bbd", + "0x2fFB7B215Ae7F088eC2530C7aa8E1B24E398f26a": "0xbe7835791b0989f62b246c8fb8abd0c2ad42aefd21f2f7cff38d440a9a8dd9dc", + "0x9588c26142e345f1A0d005CfC0C6DF29A8Fa010C": "0xa13a909fad8dafac3f8d309418aa8dc0f036e47b3f52a9ba7fb47d905fac11fa", + "0x3083A1C455ff38d39e58Dbac5040f465cF73C5c8": "0xf0328cf6727cb365162b10c18c80e01529cee4c8d22b51827e6834f11c7f2157", + "0xBd35248F8325DD1cB2bBf9D01E80A6bb99a792Dd": "0xbbc57a524fb34090a46c20371d7b4aedab217a9928aabbcbec05621acb16bb0b", + "0xD3cf852898b21fc233251427c2DC93d3d604F3BB": "0xcb6302e5a3c4fb38fb0e7f0c5fcee1894287f879aee29a7338577ed61ed51ed9", + "0x1B57f637Ce3408f1f834b0b70f9A595b062DAea7": "0xd7af52581fe7bef17495259fe3af4efd0bdcf29ac4291e305984e997889cc628", + "0xD966d712F470067B60D37246404D6DFe5Bf0B419": "0x5bafe8ecf91630d92c1066c87ef30130b455535e00d74282a18328ddb30643bc", + "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5": "0x30799534f3a0ab8c7fa492b88b56e9354152ffaddad15415184a3926c0dd9b09", + "0x97207B095e4D5C9a6e4cfbfcd2C3358E03B90c4A": "0xb903f8ba66f446c11d9a44c3bfd27a39dfe4e27e3e2ba8a88cf3e73625114862", + "0x657dEe983987E1A79A996D972fE68411AeF05e8D": "0xaf83b4bebc6a276fd0579ce281ac7ad86459a35fefa2627c9a56a98ba0e4b997", + "0x6A0AC04f5C2A10297D5FA79FA6358837a8770041": "0xa20d7dc195ecdce2cf1870351872d4322a59d5e8467134d41c9815eb41e81761", + "0xDc6d62ae091ea77331542042A72e5E38B188837C": "0x1671d9cc20db1fc2ddcc965d27be6d512ac3f1bc33ef338f29026b9adf5b6528", + "0xf9ac7B9dF2b3454E841110CcE5550bD5AC6f875F": "0x3b9e93ae050e59b3ca3657958ca30d1fd13fbc43208f8f0aa01ae992294f9961", + "0xe5F96070CA00cd54795416B1a4b4c2403231c548": "0xfd36f2ba3f92cfdae39aad73a84aa5c64182ee728da313559da0c6e00035cd78", + "0xf1665E19bc105BE4EDD3739F88315cC699cc5b65": "0xf01b94a0fbbaa2c3c77b88dac38cf7ace5969bafa8702ee3c085f373e46f2751", + "0x866D4B65694c66fbFD15Dd6fa933D0A6b3940A36": "0xfe9343c5f8457996f1ae1e218e80cbfe28e582cb9d12271b1e6c024b89f11ef0", + "0x1c99324EDC771c82A0DCCB780CC7DDA0045E50e7": "0xb248cc9ba244d101fefb51f6b273bd91692aa83288b07d44af9628b0c15ddb23", + "0xa98Bce70c92aD2ef3288dbcd659bC0d6b62f8F13": "0xd10a4b1d88388a71099e19d1e3546607d232372d3e35fc8b16a5b6ced1c46b77", + "0xcC508a455F5b0073973107Db6a878DdBDab957bC": "0x43fec4d228a0ed7c9c8d94da33b5bd5a30dd812630d89235f8b0222b35d33cab", + "0xd02992266BB6a6324A3aB8B62FeCBc9a3C58d1F9": "0x9baceeb46c623adbada0d1a9e11648ab45458ff6da68512c0b79911466db944a", + "0xE42FFA682A26EF8F25891db4882932711D42e467": "0x447c11f7d7bc815e5091fbdb9f4f8da2dda992a30c2e89842c0d064a0ad431cf", + "0x956CCab09898C0AF2aCa5e6C229c3aD4E93d9288": "0xd65fbf3812b39a9a54654cb7194ae384bdf3bd19892b8f8b373fc786145de25d", + "0x9Ac3E70dB606659Bf32D4BdFbb687AD193FD1F5B": "0xfc75cac0abd94100ce2b1ab803235823c6e885000e6661d30cbe1ff71f253fb6", + "0x1b300C86980a5195bCF49bD419A068D98dC133Db": "0xd6f3ccf6522ddef2c8dd40495b32e6bdfd5733f49be3595eb53d29cea3bba7c0", + "0xb5a0a6bceCB2988bb348c2546BbA9c2bD9A04A1e": "0xa13d3b47c0d354e7b9bd343aeeb9fa4ec452995b476f75e11afb0f41cd6ec3a4", + "0xc40e9101993ce134411e86E1bCB3Ffc27019CD13": "0x9236a1dbf9dea844b733b9f5b357a5c7f35f1cce8fafa469da956d70a18d49ca", + "0xbA54bb8a7E0eefe160164d00c06A4F2ee8459a5f": "0x1ed9e1aab7bf1d49815562b2ce5f24e2a514507810cbd7ccd56ffed9bd07322d", + "0xe23D111cb71414830B93F078977B7f53A5e996eE": "0x0a7b279b9185e7a9b6f8de49247d8362cbb8837fb7afe08e4b8f4baa45a2b997", + "0xf5dECDB1f3d1ee384908Fbe16D2F0348AE43a9eA": "0xfe4e542bea9a1508ba030bb73cd7e44c03dc80f585adbb6d578a04a171d6bcf4", + "0xfBF475f236b58A1F2c0A98BcF29033ef4C30bD7c": "0xfe9f6e3f6ce99d0b07bbeb8ab6eaed28575de360edbff9bfc79f38052626c5ad", + "0xf8ee6f1F9B54F9b2C192D703ea2d22112cBC062b": "0x20eb23f4393fd592240ec788f44fb9658cc6ef487b88398e9b76c910294c4eae", + "0x85a80afee867aDf27B50BdB7b76DA70f1E853062": "0x0042954a30f282acd402606c83163c95fc6e0484a56b87dee0d9685cd0de1662", + "0x373b347bc87998b151A5E9B6bB6ca692b766648a": "0x8a92b6e8db14842aaf6a3c4de54627887798189a306243f6cb1387724fde96f7", + "0xf23b4DB826DbA14c0e857029dfF076b1c0264843": "0x6381ca48c4967cca2373acbbd4f4e6c6f22d0f73d6fae93528ad14834d10c99a", + "0x67F8DF125B796B05895a6dc8Ecf944b9556ecb0B": "0xa4c9c16a06c031280b888274d73278fc2df88febebbede26fab617623b512873", + "0x7d833FEF5BB92ddb578DA85fc0c35cD5Cc00Fb3e": "0xe1df5ec1487c0fcbcb75bdd75061a74c79e7a018afdf5bc56e34f4110e01474a", + "0x9061D0D56F162D3de7f855828A34ace1eEd3a5BE": "0xc7cbc039f6a104a6e1200a88c5cccb3139c1747220f42894a001db06d9f5b4f0", + "0x813E3fE1761f714c502d1d2d3a7CCEB33f37F59D": "0x5ebcbab9eb41175b464fcf87f470a43eb8869c78900b49031449032b74f8347f", + "0x5efBb12F01f27F0E020565866effC1dA491E91A4": "0x38ce36142893562cd963b78e3ce5510970fdb01d01e62edef13aed2b59b507cd", + "0xE0f34c6AD719e6877062B7D97E12c61c096509AF": "0xa1bce9f7ad80953e61dbf01bdf66c2343028d47984396136edc86997e79b3a81", + "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6": "0xf48ab6b5e39eaa889ea4d07bcc2616f86c5ab061320d2d20e0b9ee064e426e9d", + "0x5Dd94Da3644DDD055fcf6B3E1aa310Bb7801EB8b": "0x39f357b78c03954f0bcee2288bf3b223f454816c141ef20399a7bf38057254c4", + "0xdba127fBc23fb20F5929C546af220A991b5C6e01": "0xd8c9ba758cb318beb0c9525b7621280a22b6dfe02cf725a3ece0718598f260ef", + "0x1576d472d82A72a1Ec7C57FcA770BD752D124A62": "0xed8cfdf17294c227023a1083f1d0ee385873a6458a7132e3a251ca4cd33621f0", + "0x222bc81C6F3C17e9e9Aba47a12f55a1Dea42f163": "0x83fb41bb8a64dc323255fc3a98d544fbd88a37e6447054c7b4dd16fc6251feac", + "0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88": "0xf0095526cce34b49572211fa94d9709c8db471997ac9055a8cf784317c308b6c", + "0x9dd5Db2d38b50bEF682cE532bCca5DfD203915E1": "0x442b1c2b92368134b9ec9314fc1817bde336645525d2b2d932890eba6ab7c202", + "0x9805dcfD25e6De36bad8fe9D3Fe2c9b44B764102": "0x3b6aeeb120b95dcbc1653b79ec05b5ac046aec3b50893df9d7adc42fefabef69", + "0x331d50e0b00fc1C32742F151E56B9B616227E23E": "0x03a375ae4403b5a429fe641d4276f3181c712ed7efe3b96d8dd3211640585125", + "0x5F43FBa61f63Fa6bFF101a0A0458cEA917f6B347": "0xd3b6b43f7176d0f63bdff10abbc1eb1c92a798498d624473289f7a488f5ff0d4", + "0xC101dcA301a4011C1F925e9622e749e550a1B667": "0xfe696e8feb40bf4325c5a1e0a9dd6c23377e1b75f1496d47eae887eb5ce3da71", + "0xDEC02e6642e2c999aF429F5cE944653CAd15e093": "0xd639c8a6c3a553d47fd7f3d384ec4bc50a2cd6dfb2c3135b7f5db49d73c15df2", + "0x67A25ca2350Ebf4a0C475cA74C257C94a373b828": "0xf252d24fcb350febba5b414dcdf93a6b08e558e384a19bf88abaf8b0dde58d14", + "0xE605Dbe1cA85dCdb8F43CEfA427f3B0fC06f6ba6": "0xb8151a4af682703443a331e769d6d92a04844ea2793b9dcf496811c0158d6d5b", + "0xfeF969638C52899f91781f1Be594aF6f40B99BAd": "0x0185d2c92cd50d4315d37583cb8d82dd3dac9789cbd7234dc3f23f3c5012f97c", + "0x8b7854708c0C54f9D7d1FF351D4F84E6dE0E134C": "0x331345aa4f578011cce1da22b99e9a6a2621b9639ec717b03039804db907ee7d", + "0x5C5fCf8fBd4cd563cED27e7D066b88ee20E1867A": "0x06a3bff68e9adca73f109504e87b9275ec85d636b8efe2d826393fb6f5feb2a0", + "0x0a0fb4ff697de5ac5b6770cd8ee1b72af80b57cf": "0x2e1093e3895799bafd5a62fd9af48574f13e9ce4bfa95e578318cf4ea60a4e40", + "0x2EbE41E1aa44D61c206A94474932dADC7D3FD9E3": "0x4689e78f003d28479c686dadb8b6974060592290f8fcd830825e17d30c489d34", + "0x7ADbdabaA80F654568421887c12F09E0C7BD9629": "0xb77ba9915d371bf13c481d2aafbc15b9e233b7eafa617a5ce82ce5cef02d3f06", + "0x4bE0E4d6184348c5BA845a4010528CFC779610b8": "0x5191b7045939daf4b815aee31e7dda463e05b39a6e0271098417619992f4fa5e", + "0xa8b103A10A94f4f2D7Ed2FdCd5545E8075573307": "0xa57858f93f1511fe92250c2dec7340faa69dc55f1327ee9291c888dc3b6a8234", + "0x2a18B396829bc29F66a1E59fAdd7a0269A6605E8": "0xbdd20d395f0af20c81f988e61479c6f31862b8a33584ca0b44de7d874aaef0e4", + "0xE3881627B8DeeBCCF9c23B291430a549Fc0bE5F7": "0xeb6c4323430f003893b40da3b19b8f624831eacc627dbdc30cc212db26807482", + "0x4fb47126Fa83A8734991E41B942Ac29A3266C968": "0xe50c6c6cf7a08c64b5a2d7207a11c8c6a4d527ceac99958089c2dc65a5057583", + "0xc3ccacE87f6d3A81724075ADcb5ddd85a8A1bB68": "0x962bb503a1c0d823cd5156807e5ef54041035c67f9cbc7ba402a0ae1bd9d3713", + "0xf77018c0d817dA22caDbDf504C00c0d32cE1e5C2": "0x4499dba276c9851029704e3ecd815fa6c0d1e7ee1330f7d498749133711171d4", + "0x897888115Ada5773E02aA29F775430BFB5F34c51": "0xa5e6d73befaacc6fff0a4b99fd4eaee58f49949bcfb8262d91c78f24667fbfc9", + "0x8055b8C947De30130BC1Ec750C8F345a50006B23": "0x3ae08d6ff86737a64827855af810f7ee9ee208ff8e6d8c916495d09a83282c8a", + "0xfADa0f4547AB2de89D1304A668C39B3E09Aa7c76": "0x3b61da162f3414c376cfe8b38d57ca6ba3c40b24446029ddab1187f4ae7c2bd7", + "0x5537f945D8c3FCFDc1b8DECEEBD220FAD26aFdA8": "0x112d86c1cbe9451a65fa63edd4b0d7c009f93fbf32a06050d800ed1e4af46caa", + "0x4148bf5B0688eD0a87F317c6534Cb841f503349e": "0x3723ff6732c168d3ada9c65f63f3dfe1968a1c60cd01fcb7d6cf57fa8697568b", + "0x4967b3353Cdf9E5C67421a3890d35f2f3BB50527": "0x1155f3da5d945892625ddc7ce4c916abe08bd2b26a4d56bcff6d31c4fbdca74c", + "0xb37646ACBb1A91287721B2CdBe01BA0DbA5E57A2": "0x372a60f61b32d9dcdbf6bfe4b88b13749e31cb1dd3332bc2f5d00b6d22c65d23", + "0x3db89f0CA3b388f2BcDbccD2ff8E13C22459CF75": "0x31a7e9a23c7282e160b433dd7601a4a4183406ed6917549ae9bac0342d5b8d1e", + "0x7827108Af2fd9910EA7cf361d9b827941FA7D809": "0x02e4d600acf189ba389436c4d7e71ecd4e67957bf6092cd7e83fb7c530f7468b", + "0xBF904F9F340745B4f0c4702c7B6Ab1e808eA6b93": "0xc01050fa1f801ed1e3191f3072c95f7d1b7152c489d8fbdd3d056a15df69118e", + "0xD0cbF6765997b7CA7Be6440F5E305B2ec7B96065": "0x649ac12525bbac417f312ac74849f44b2defd24f58128d305ebf32de3733f913", + "0x6048A8c631Fb7e77EcA533Cf9C29784e482391e7": "0xe56fb40ba3f1fbb432bb60fc69becfcbc0182e58cbae67282e90dd68af8987e1", + "0x5F5222Ffa40F2AEd6380D022184D6ea67C776eE0": "0xaf9a42ef6dbebaf5173b397e1037f0351165ca3de72df814b57e96da248e634f", + "0x806E02Dea8d4a0882caD9fA3Fa75B212328692dE": "0xd13c17f5e68cc3a906a165ddd1971a7180aad1a1f5ffdf2088ac4920048b6b0a", + "0xAC5B4EF7eDe2F2843a704E96dcAA637F4BA3Dc3f": "0x497aa03ce84d236c183204ddfc6762c8e4158da1ebc5e7e18e7f6cceaa497a2a", + "0x813EE7a840CE909E7Fea2117A44a90b8063bd4fd": "0xe322a18133c4d21e2e1991d6cbee8b8b1ec2b8c4ad985306eab466e3a1028d47", + "0xB99eDc4b289B0F2284fCF3f66884191BdCe29624": "0xce188e6da79811501d063b8a67e30573e52d775c8776196e0dbd0e3a53fdf3cb", + "0x9516a2d25958EdB8da246a320f2c7d94A0DBe25d": "0x756e81cea4cf725c738bcef3852ad57687156b561574cad3e2956e6cb48da5e6", + "0x4E11AEec21baF1660b1a46472963cB3DA7811C89": "0x9e149aa6ceba392f450fa508265fc0f175e80ad6214a43dc78c491d106502a17", + "0x8E2DfC5E111dbe14E9d725210b9342688Dd51c6c": "0x6401ee8ea281f342ec0f97dfc73f2c0d38cb3cb3e3438cfd14bf826af0e9b408", + "0x66c94AE8D795E98F69Ca65FFaC87B38B17Be3ca2": "0x87688e5c75077f5482332367003c573fb807e004936482dc4693b69a9937b9d2", + "0x192E67544694a7bAA2DeA94f9B1Df58BB3395A12": "0x80ae868eb47eb0069d760c07eb8c99b481c3f0a550a0e08f914e2fa6ec63b8d7", + "0x74CBfAF94A3577c539a9dCEE9870A6349a33b34f": "0x215c9f4256ab450368132f4063611ae8cdd98e80bea7e44ecf0600ed1d757018", + "0x39A79EB449Fc05C92c39aA6f0e9BfaC03BE8dE5B": "0xfb8c689d33192512e82ada96e5e99751e41973029bd5d4b6f0eda1a584baefb3", + "0xC7B779AB638b7A59f490ac95199502343a81E006": "0xf5cb7a24c1de3ac80b84e5aa98f0c3ac54c5cf8c49c9d63e3323eb98e6ecc01c", + "0xb7A32B67AAdB3866cC5c2FaBc6C6aB8a9027c3c1": "0x10cbf99d8a08112ba08c29a287b803272cbe4d50ec8447f6d93ac2005bc70cae", + "0x0d05Aac44aC7Dd3c7ba5d50Be93EB884A057d234": "0x9f8cb91df524d0592893bbab7ac6c53f3fb8a25dfea6e51765faad80e5152ef5", + "0x0b576c1245F479506e7C8bbc4dB4db07C1CD31F9": "0x3b69a75057df7968722339480b4af0d20f7c2e936f2239f1ef09d0597b98065b", + "0x28fa1E40011aDF98898E8243B2a48BB21EbF0C29": "0x28bc5df08269a468452fac0aafc7dfd2b6e4fa6955f159985f140de3409cee1e", + "0x1F3C910c416eD2340150281C5eB93325C38817A1": "0x61ca9b3fdd3daf0e473239200bac39a949933aee2986e5796e9b69880154ba0b", + "0x4cE277Df0FeB5B4d07a0ca2ADCf5326E4005239d": "0xda940e86debbd0edcd4b845cbb8f9572603e84ac9072905121b85c30bd736ce2", + "0xfd1c0e6f02f71842b6ffF7CdC7A017eE1Fd3CdAC": "0x105e807200ba5a5250d1ddbd19547253177a97e2f6927b082a7949be61168f33", + "0x395d8A1D9aD82B5ABE558F8AbbFe183B27138af4": "0x59b3ee43960d2220a773fa7389e01030a77bb113a06a69c59a3c60f8ab98e898", + "0x9bF951848288cCD87d06FaC426150262cD3447De": "0xe62da98c3723f035aa6a031fc7ce70a0af84986e9069d8b02d071a5598d6aaf4", + "0x96484f2aBF5e58b15176dbF1A799627B53F13B6d": "0x4a2087ec834487918dbb385bb79fd56a90f13a5df2bdb70f7d7a1b72d558de49", + "0x83E443EF4f9963C77bd860f94500075556668cb8": "0xb6a83f7c828a30038c778f15b206181fee54c6d5f9c7374e934384e0757b698c", + "0x5DbAd78818D4c8958EfF2d5b95b28385A22113Cd": "0xfed4c1727a7c811375bfbccd16ff13fd29185a0eeb5770b03002b1b4f7a63f08", + "0x3f170631ed9821Ca51A59D996aB095162438DC10": "0xc3c1941d227ba2b434c6b6ed6ec69c907e12bd72537ab2f966273e8d574a767d", + "0x343688C5cB92115a52cA485af7f62B4B7A2e9CcC": "0x5a743148eaee22d5f83df94218e78b71c50991b59653e2896b0953a448ecdc69", + "0xdAB2583911E872a00A851fB80dCC78a4B46BA57c": "0xd7b81a2f7dcb1199db87e093a8b6ce9da949ba209430a4aa9af8514e4299e258", + "0x10f3e79911A490aa5B5D5CDA6F111029c4Eab5AC": "0xf89b6edd81ba6326aab2689b7de723b553c4c4d85a4768d55418a66b7e2f0c52", + "0xDB8d758BCb971e482B2C45f7F8a7740283A1bd3A": "0x1fc28221925959c0713d04d9f9159255927ebb94b7fa76e4795db0e365643c07", + "0x20356663C17D31549d1210379749E2aE36722D8f": "0x822653ae905ab40f51f46c7b8185ba9a4aa06e674789f87dd26d0d11b26dc7c9", + "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089": "0x805dcdd53cfdb3f5b577055d0d27a4a12430688446e8a4aa7fc5ed182f4163ae", + "0x1311Fbc9F60359639174c1e7cC2032DbDb5Cc4d1": "0x18aacffa46a74d9404f46a9e3f32225e6ee0fdef600e8d49ae8f432b624a0191", + "0x0f08eEf2C785AA5e7539684aF04755dEC1347b7c": "0xfe9d1446e6aa9da0b90799e925b92a3230e44cf32cc2126a210921fa38e273c1", + "0x22625eEDd92c81a219A83e1dc48f88d54786B017": "0xd84e11274a092df611319bac402f3dc904a44914beb21262977df392ddfb45db", + "0x8e3B64b3737097F283E965869e3503AA20F31E4D": "0xfdbc9b3b61033dc338dbca98286f2f1c5ef6948590d54749025bd9532f10550d", + "0x0C8f71D19f87c0bD1b9baD2484EcC3388D5DbB98": "0x7ef4c0cfe11b7b15a602f7fbfcfbebaf551220f06fe108054490195b4766260f" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/deployment-txs/optimism.json b/balpy/balancer-deployments/deployment-txs/optimism.json new file mode 100644 index 0000000..00487be --- /dev/null +++ b/balpy/balancer-deployments/deployment-txs/optimism.json @@ -0,0 +1,97 @@ +{ + "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6": "0x86c386207f3c5fd1f909aa1af7d140c9aaace9ede25b270312268cc629479682", + "0xBA12222222228d8Ba445958a75a0704d566BF2C8": "0xa03cb990595df9eed6c5db17a09468cab534aed5f5589a06c0bb3d19dd2f7ce9", + "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9": "0x2a9a9870e2a3cbd7f696bea5a2a24105725757ca318805c08868269a01011f07", + "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca": "0xd5754950d47179d822ea976a8b2af82ffa80e992cf0660b02c0c218359cc8987", + "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e": "0xc9bfd52a242c6aabe7e9ee8ff1c03a89ca6e15ebd0296b0f6aa8398243961beb", + "0x41B953164995c11C81DA73D212ED8Af25741b7Ac": "0xe070ab051451f885f8e4c9e33d9776465fe71f91f370fea57c77550155175e4d", + "0xD7FAD3bd59D6477cbe1BE7f646F7f1BA25b230f8": "0x2bfc5f5af74273160748c9ae7f969775d17276fc50eaa2adf9f61455573d0612", + "0xb08E16cFc07C684dAA2f93C70323BAdb2A6CBFd2": "0x14cf5c6f55ba12c120c66940758d6f67ee04316f07d0abaf352ab4571b41fc1a", + "0xf302f9F50958c5593770FDf4d4812309fF77414f": "0x14fb43f051eebdec645abf0125e52348dc875b0887b689f8db026d75f9c78dda", + "0x8F42aDBbA1B16EaAE3BB5754915E0D06059aDd75": "0xec800daf64f1abbe293ce34cc8d1b6bb6fcbc33670bc673716561b5732a00b40", + "0xC128a9954e6c874eA3d62ce62B468bA073093F25": "0x21a4f21d09ee04fe14ac711a5f50b27f2778cfb5684c9d032a9b245863a5757d", + "0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD": "0xfb71889d57045db0aec9b04edd004182c1936953af5971cc3425e279b858131c", + "0x239e55F427D44C3cc793f49bFB507ebe76638a2b": "0x3e2e8f872ce1da6aaf754e9dbdfff23edd131ac4abfb78816770f7048ceb131a", + "0x2E96068b3D5B5BAE3D7515da4A1D2E52d08A2647": "0x4afed3f4aaa2e32a3313db5fe5e42faf54b4d59f8003bed8316914510c4112f7", + "0x6f5a2eE11E7a772AeB5114A20d0D7c0ff61EB8A0": "0x9a762ae159d522f74eb8d8db2fa44212f0443e367af1dfa35b2df36d57dcea4a", + "0x3b8cA519122CdD8efb272b0D3085453404B25bD0": "0x0cd0f2bb04267150db212a9c2ce11c7690dbf390332c9b3d44bea304ce755236", + "0xeb151668006CD04DAdD098AFd0a82e78F77076c3": "0xcf9f0bd731ded0e513708200df28ac11d17246fb53fc852cddedf590e41c9c03", + "0x1cbbE6cEa5E4fE7D69c586b4e362A646DEEf105d": "0x8cc51fe78f9a2510db31586e253d0f5b7b4018b2bfaffc63e73849c860ff6d30", + "0x4C4287b07d293E361281bCeEe8715c8CDeB64E34": "0x74fae6f32ee83dc477f7cef6cba00102720bb9c8d487fde77a12794d6cff9592", + "0x6d471c05f8A99Bd8f991467A8283e3DC968b8D7c": "0x26871d199e20f27cab19c1248b8378feaf8f1cd052c1aa23b3eafdeadfd0b776", + "0x5c89d9E1A668d0B39F4EC242F280bdDd445C633c": "0x79c7d4e9bb3cdf24d9cd2e32813255a978e05c68e25615615f8756d1a652e0a7", + "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5": "0xf3b2aaf3e12c7de0987dc99a26242b227b9bc055342dda2e013dab0657d6f9f1", + "0xacAaC3e6D6Df918Bf3c809DFC7d42de0e4a72d4C": "0x92cb8b071f59c0f292aa878b2d236d0c602c07bbc72cd0511b0b7c7bf3ee6142", + "0x8aB784368A1883DA90D8513b48801e2Db1cb2D5D": "0xc1259148af7bf9e61ca86191a8f5b064f19c070799758f8b9b450643ba11de65", + "0x994086630773dC6cB54D3A5E0Ef0963532789E75": "0x4f161e34f6147e58817bc80cd72e2d2d5441de5a0e5cf6b2ccbc522299d0f37c", + "0x7C71313d3b84728cA0FD4cDaD8c86067E3548dCe": "0xaef3143054041b59b02d6237b44ff8e7e98583e6ec1ca93aadd23426baf992a6", + "0xf145caFB67081895EE80eB7c04A30Cf87f07b745": "0xad2f330ad865dc7955376a3d9733486b38c53ba0d4757ad4e1b63b105401c506", + "0xad901309d9e9DbC5Df19c84f729f429F0189a633": "0x13c8ae0bb7d9c0ce002c1bcf21b3fd45fb972388136ece517440946ff002945c", + "0x8E5698dC4897DC12243c8642e77B4f21349Db97C": "0x8cb79395a864e31b0166e5cb1c3fa3e72e6bd08a6155a4c98f04f921db545b9b", + "0xF24917fB88261a37Cc57F686eBC831a5c0B9fD39": "0x8b47dd2297032288077e69b9c6d3aee4f41fefde74f37f78dd39b828cdd6087a", + "0xE42FFA682A26EF8F25891db4882932711D42e467": "0x00da0b65c7b09ff1b65621a5a2c460a15b490b191e6b1205336b765b3e555ce0", + "0x956CCab09898C0AF2aCa5e6C229c3aD4E93d9288": "0xf1849a1a909cda7fac063292c682dd3f306956983313ee0dfac2f16175318878", + "0x26743984e3357eFC59f2fd6C1aFDC310335a61c9": "0x2b298f1bbd7a9911d96ee92b0eb96435b74a174888d72eb9d92ff011676be36e", + "0x9Bf6468Facac0F71C7ecA8D71a5Fb5f65bdAb319": "0x6a76b3ffd083f448319ba52872090555d6768d13e7227e78d06132aa653db863", + "0xcd7F93C86f30B90a181f81934FA4f281c7bfF246": "0xb17f18b0355ac8b17055797a1c99ba03e1793f46a94dcc64d40e659842d83535", + "0x5D5629FC838f5eA67d14264b7316FFD4294b0998": "0xac93065a10dabb9c5e41e56fef85eea79b157d022beaffb5cba90a746ab125e6", + "0x6dDBcF8886B7741D9AE60B9e9950F9F56543Ae54": "0xbf8b9508643ceef102bc4fcaf5c4699574061161d36163afd2e248fe6b8f2b1c", + "0xed86ff0c507D3AF5F35d3523B77C17415FCfFaCb": "0xefb058cbe562f0bc7687ddb67ca2f01c65d5e91238e2b5819da3c25a3410cca5", + "0x85a80afee867aDf27B50BdB7b76DA70f1E853062": "0x9b837ca1df43b6674e2fda993d68a7a82a17dab2949faa20c4a7c893dc821e27", + "0x373b347bc87998b151A5E9B6bB6ca692b766648a": "0x4e07aee77080dc6e868e4aa06e77ea58763277a0205f175df2b5c6fd2302f205", + "0xAd3CC7852382C09fdCE54784292c6aB7fb9Df917": "0x0eb98d203d3dc0b1f43d26e75d247f15183754f9fc7c0b667156fddea66c107e", + "0x56017074321ce77E2F88F2233830f5b29d4cf595": "0xb8cf07e1bbd52dc2dd81e8b564311aa917f04bcdf5376a2f6016b39da9900ec3", + "0xcA96C4f198d343E251b1a01F3EBA061ef3DA73C1": "0xa2c90866bf537e97c0549c3f9938aebc12d255806f197bbe4366afc57f074c72", + "0x5936497ffE0dBA0eF272D6301D65c0122862971A": "0xf40650ac932e7e9f54316861eff90f84896e66d59d79d8b9cd05eaf10231fa7d", + "0xA0DAbEBAAd1b243BBb243f933013d560819eB66f": "0xc5e79fb00b9a8e2c89b136aae0be098e58f8e832ede13e8079213a75c9cd9c08", + "0xe2E901AB09f37884BA31622dF3Ca7FC19AA443Be": "0x2bb1c3fbf1f370c6e20ecda36b555de1a4426340908055c4274823e31f92210e", + "0xbC99aa9bD55d3f8431Ecec24Da03AEc1D6e62754": "0xb03349ebbdc7b30704d10edfee550125f49c56360c7b934234015d782bd4920c", + "0x9BF7c3b63c77b4B4F2717776F15A4bec1b532a28": "0xd8f2f67de1b47767d461c44970719a13149ebff60cb26acb83a4d674d2b129bb", + "0xf23b4DB826DbA14c0e857029dfF076b1c0264843": "0x2e04095bd7221844ccd24f648293a35d056872f93f812ce976c6438c46dae507", + "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6": "0x0b78002fd12176365866dac2df2f5712526caad77ab67181de426b612016d775", + "0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88": "0x970d49e73496ec1f42f62f8799ec8108ca16ccef317564082cab238d3652fc46", + "0x11884dA90FB4221b3aa288a7741C51eC4Fc43B2f": "0x589b93f2ef59d5cbf790f8e9ce93f0e04a44d203ae083049e77e4847858119a0", + "0xa3B9515A9c557455BC53F7a535A85219b59e8B2E": "0xb26d404f51ac83b124d589fe994907207729383c9cf1900e8f5a0bfd1caf5485", + "0x62aaB12865d7281048c337D53a4dde9d770321E6": "0xde2a47b98d6775913f1886df1ca3724fcf50313a3275cf8c056c7e03e161063b", + "0xf984eb2B8a7eF780245a797A2fCcd82f346409ca": "0xe8f449195279a9adcd285cea7d94b6bf78d750a598b15b8b86a041e60ad50e60", + "0xD8B6b96c88ad626EB6209c4876e3B14f45f8803A": "0x55376047abd6ba634aa064e36d6040c71b6a5384806aaee98b9163caf2d57beb", + "0x1b986138a4F2aA538E79fdEC222dad93F8d66703": "0x07ae9c0dbc787fe6feca3e400942488666153d5035f93499c890ddb9daae1baa", + "0x81fC12C60ee5b753cf5fD0ADC342dFb5f3817E32": "0x0a6fbcbd7edf5be43e009ca4fdd1b1aa4164db63172ee3d38e192b1a5e1d9d07", + "0x9805dcfD25e6De36bad8fe9D3Fe2c9b44B764102": "0x221ce06f69c884719aef4273bcb939a943014e49acadf69b2667b5c05e426c54", + "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B": "0xa89704a106e1116f62f620d2ff6fd3583daae0744636fc945cac14e086d63da3", + "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a": "0xad915050179db368e43703f3ee1ec55ff5e5e5e0268c15f8839c9f360caf7b0b", + "0x62F5f9a446d198E8E4c84eE56e5217416720EdAF": "0x45b2936e66b030397d61c49c76f5c5602993a6964f4739d4254c670fa34d25fc", + "0x1802953277FD955f9a254B80Aa0582f193cF1d77": "0x5d6c515442188eb4af83524618333c0fbdab0df809af01c4e7a9e380f1841199", + "0x11A4cF51Bb0Bb4D925CAdFDA61FcDA952d64889C": "0x67229fb949215144e3d5cd677252665792bc1daf4181a1bfbe6da165209fe741", + "0x4fb47126Fa83A8734991E41B942Ac29A3266C968": "0x71eb05412fad9fb9c7582e4e8d62d5288b1230412c409b0c60a093888ee47085", + "0xc3ccacE87f6d3A81724075ADcb5ddd85a8A1bB68": "0xd4b35aa13bacba852a9fe9391287640f525603e728e33828ce7c54b2c2504f99", + "0x9dA18982a33FD0c7051B19F0d7C76F2d5E7e017c": "0x44a89f7686e7fd43a5d5f9bf5514f241121578662143e19300e0731407e66ed7", + "0x81cFAE226343B24BA12EC6521Db2C79E7aeeb310": "0x7afe6fd9c1cff2e0f561ee327a201ea6f612866d6ed87a0ac52765e465c27946", + "0xa523f47A933D5020b23629dDf689695AA94612Dc": "0x7515c98129e75ecc496d396d4e430134777781b822aeb31f0d2147a3bdbe8c66", + "0xbef13D1e54D0c79DA8B0AD704883E1Cea7EB2100": "0x9223abec3910360583a4776d972571cc2f9c0eeaef135dfbe6f6a5c604002c95", + "0x59562f93c447656F6E4799fC1FC7c3d977C3324F": "0xa17e993634a180e6dda42af4182f6b6d2547f9006ec181b296f9a6bbc11b0afa", + "0x2498A2B0d6462d2260EAC50aE1C3e03F4829BA95": "0x0eb96b9103b4e777672afa941c3a4b0b651655f061c49055eae8b6ffabbbc540", + "0xDEd7Fef7D8eCdcB74F22f0169e1A9EC696e6695d": "0x3bc4e04e1fded425b1c68c243b3956514a222ce5e4d1220b8b479bd4a4a30d5a", + "0x8df317a729fcaA260306d7de28888932cb579b88": "0x4184ba9ace5bff1778b4e6dc56142c1a47541119aca5290f1623f947e4ca245a", + "0x3B1eb8EB7b43882b385aB30533D9A2BeF9052a98": "0xed48214e7b6ffc53febd32853a7e686eb14250adfc0bc85135d863f58758de69", + "0x4C32a8a8fDa4E24139B51b456B42290f51d6A1c4": "0x443779c6c9316cc9980aeb550eff927ecbbf6b7ad0207d8cb38c448a5b7a2286", + "0xb4AF4fdd49da2A2BA9522EAdCF86D407a69f19c8": "0xa6c8de5accb30361eb5c1fb33107ca741116da53887f3f1a29c791e80639011a", + "0xAcf05BE5134d64d150d153818F8C67EE36996650": "0x0f49be6c1e1ff9408cddc6f35654cf9c6bb0cb26a45f6814c964fd82b53606ce", + "0x19DFEF0a828EEC0c85FbB335aa65437417390b85": "0xd8f144981fa0c4dda4e9f70cf41f4530e6b25e576127972c57b08c6f75507869", + "0xb15608d28eb43378A7e7780aDD3fE9bC132bAf40": "0xf6ebaaca26ac33e696fddc02a3791a7b2317bedc7c7e990191da756cc57de2a2", + "0x34557eF500Bfc060B8e3f2DA58EF725Bb7D32202": "0x34557a0e88eb7fdc37022de7563813f00755f17e67ed0de6fb5f3f8b68a8baf1", + "0x7ADbdabaA80F654568421887c12F09E0C7BD9629": "0x4d3721f78f72de16a071665852675f50309729c18593380cecd3027c3d78167e", + "0x4bE0E4d6184348c5BA845a4010528CFC779610b8": "0xcb345834a4aeb6d2990f03947d81b8264ad16724c79ea597c011943934b24508", + "0x2DA61Ef3Cdcb97efb0f7099c02527fabFe94Dee5": "0x9dd6600fd7267869758d3027ad8f06d1fca03c9886a08a1f92b735cf166f5d0c", + "0x7396f99B48e7436b152427bfA3DD6Aa8C7C6d05B": "0x864e851e3f6389772ed61b9b74c490feeab072b7400e51e72c0a8d83a3869af2", + "0x533a16F90E7d3Ca31dbc608E5EC54967710F0D2A": "0xd27e8010dd3644b71f1f6bf9f1731501852b71c18b84c08793f5fd81084f1b61", + "0x8b7854708c0C54f9D7d1FF351D4F84E6dE0E134C": "0x0be0a5bcf47c67936412b33bd2b30731bf3f75f21002aefcb2764f54e8179895", + "0x45d37982784F022A9864748b4E8750e1e7019604": "0x4b585c98bd80aef1542c2b8fc2f6d991a46913f1fc9bc668d33f1cfc39678998", + "0x6817149cb753BF529565B4D023d7507eD2ff4Bc0": "0x4a041e74253291317facfb3067cbb9e84cdb4ed2bd575f37d3eec3788f48178a", + "0x9129E834e15eA19b6069e8f08a8EcFc13686B8dC": "0x1f638807b7c486b8bab17e99bf0a5f2e20eca634ceee6ea9de7b2cac8aa522ba", + "0x043A2daD730d585C44FB79D2614F295D2d625412": "0xa141b35dbbb18154e2452b1ae6ab7d82a6555724a878b5fccff40e18c8ae3484", + "0x77A0Df59d1d73B12B07Bcded0611279D8801ee96": "0x945db7c037f0b391414255331c349c52604785a4b98792de99ecc1d20112a94f", + "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089": "0xc6359ecab6b9dd2130d208f52fab059e59d0b425b780e4458d040f57e2a6d17b", + "0x96484f2aBF5e58b15176dbF1A799627B53F13B6d": "0x8dd20101e9b3c16c8675fe6e177c750d29dac93c190dbe521bab59e99d345e57", + "0x83E443EF4f9963C77bd860f94500075556668cb8": "0x6be69a855504cbd233f9fd4ec075910860a89389cfc18aa23a084f8e15f2d4b7" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/deployment-txs/polygon.json b/balpy/balancer-deployments/deployment-txs/polygon.json new file mode 100644 index 0000000..5eff163 --- /dev/null +++ b/balpy/balancer-deployments/deployment-txs/polygon.json @@ -0,0 +1,107 @@ +{ + "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6": "0x9c7f532cf201c66263472d58f51f684c32772c65946cf4603acf5d616c9a9b26", + "0xBA12222222228d8Ba445958a75a0704d566BF2C8": "0x66f275a2ed102a5b679c0894ced62c4ebcb2a65336d086a916eb83bd1fe5c8d2", + "0x239e55F427D44C3cc793f49bFB507ebe76638a2b": "0x5fa1d8faf728a0f85b1cfa30d870626836a1e5112a623cb9aebd0b1d1f7f7e37", + "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9": "0xb8ac851249cc95bc0943ef0732d28bbd53b0b36c7dd808372666acd8c5f26e1c", + "0xA5bf2ddF098bb0Ef6d120C98217dD6B141c74EE0": "0x04bf3059d000a25344c1b909145a25ddf8cf2a15bc8b67817e2b9804f4ec4b45", + "0xc66Ba2B6595D3613CCab350C886aCE23866EDe24": "0xe8b338d741aa425ea88f2af40f49d8ad4f35fd813782435572050285340cb3bc", + "0x751A0bC0e3f75b38e01Cf25bFCE7fF36DE1C87DE": "0xd9b5b9a9e6ea17a87f85574e93577e3646c9c2f9c8f38644f936949e6c853288", + "0x72D07D7DcA67b8A406aD1Ec34ce969c90bFEE768": "0xb2f024ad83c6736b96d14609971aa2008bc42514652a914d7504b1d8fc113a28", + "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca": "0x9190ab08e310fcb48530ff5d66b2a3a5c4bd11ec92b1972b7ac95d658dad3468", + "0x0f7bb7ce7b6ed9366F9b6B910AdeFE72dC538193": "0x4125c200427389136bf4cba98d98a7d3dcd2bd3c7e86890482cb95d4dc8f19ee", + "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e": "0x26badd37f9f856cdc98b7d1477ae4848fe662394c8ee063d79312edf5d430b1f", + "0x41B953164995c11C81DA73D212ED8Af25741b7Ac": "0x125bc007a86d771f8dc8f5fa1017de6e5a11162a458a72f25814503404bbeb0b", + "0x8F42aDBbA1B16EaAE3BB5754915E0D06059aDd75": "0x109bbf663c133d925fdab8072f7924b0ef6834ec1684ca87ab7259f9186f81c2", + "0x4574ccBcC09A00C9eE55fB92Fe353699A4fA800e": "0x109bbf663c133d925fdab8072f7924b0ef6834ec1684ca87ab7259f9186f81c2", + "0xf302f9F50958c5593770FDf4d4812309fF77414f": "0xb7bea0d00e08e28a5a671029fe33613917c4145d029cf16fdde3c547463c1dad", + "0xC128a9954e6c874eA3d62ce62B468bA073093F25": "0xed2511a4aa8a7cb5b9ac49085e8b6b3d5441aff71b4a35ea51839c96459c5fb2", + "0xC6bD2497332d24094eC16a7261eec5C412B5a2C1": "0x7aea2c2335ce8f03fba621e1452c18042ca7d438edd010da28860508ecf77f63", + "0xC4eD21Aa0Bec959ED7e4A83B2CD46dd00a0205dA": "0x9d35c0c3511946c41b5883f4139d64027fd573f7029f5a0f20031a71d6ab496f", + "0xF537dDd7f4cc72C6C08866b62EAe9378f1F62da8": "0x9d35c0c3511946c41b5883f4139d64027fd573f7029f5a0f20031a71d6ab496f", + "0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD": "0x495474096c2a5d3d50022fcb99cd9b7ffce8229d45983189b921385c7e81a793", + "0x2E96068b3D5B5BAE3D7515da4A1D2E52d08A2647": "0x196010acc09202c349955de4f3770f1f5afd31fb628cd530693346a3d0b61c68", + "0x6f5a2eE11E7a772AeB5114A20d0D7c0ff61EB8A0": "0xd65c967cef05ee6ec051dda9274433ff1f9e46f57c831b9ad63ccb3dff66edcf", + "0x3b8cA519122CdD8efb272b0D3085453404B25bD0": "0x0dcff784ada6e0e4e21db3da70e09545d31c3e425cf028df7d1289f914a7f1d5", + "0x79d0011892fe558FC5a4ec7D4Ca5db59069f460f": "0x58c8f5e410528c1142d50ea574606d6dada84995f9825a7b88fd578321e17bfa", + "0xEF44D6786b2b4d544b7850Fe67CE6381626Bf2D6": "0x10fe0c38814c13801d3403502567ed387ab0b5cabcda83d9552386f2e1ad80ee", + "0x1554ee754707D5C93b7934AF404747Aba521Aaf2": "0xf1599f6a83cf415868282f9d4051e35a75840507a89d5d2a9c465f061485b388", + "0xcA96C4f198d343E251b1a01F3EBA061ef3DA73C1": "0xa2c41d014791888a29a9491204446c1b9b2f5dee3f3eb31ad03f290259067b44", + "0x6637dA12881f66dC7E42b8879B0a79faF43C9be2": "0x1a74822081ed94e9a4a0fbf81994f0207eb21ecef1e5944ca655648e9cc690da", + "0x6bAF5Fa330F2d7C59f2bB57cF4b2C927B7f160d2": "0x2955a36352d8e678a6e221c13db9a6ae9c88fea6cb115fd046f93ce41f881040", + "0x5ef4c5352882b10893b70DbcaA0C000965bd23c5": "0x4b4ddc4ceafa144df2f7eb88290aaa24db8c7922d68bb63439895fc52eaf83bf", + "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5": "0x0b74f5c230f9b7df8c7a7f0d1ebd5e6c3fab51a67a9bcc8f05c350180041682e", + "0x42AC0e6FA47385D55Aff070d79eF0079868C48a6": "0x1a6f3cc3e15a628eaf323b5d7a3578d497ce8fcfb8952273d20d8084621fb31f", + "0xaEb406b0E430BF5Ea2Dc0B9Fe62E4E53f74B3a33": "0x13e145eb41511f3a9b0f4777fa60af0e17b2ab2122b68b3abcf57263e0a5c551", + "0x8df6EfEc5547e31B0eb7d1291B511FF8a2bf987c": "0x92bed1d00f3d5b9af1ff01c5a75b766da20edc3a081507b20d20371d39100d53", + "0x967F7AdD4Fd5AF0553B7A45F225ec26EDD699E61": "0x5ed686152661e4c05d6a12fe6d5f25f8da52792f5683cf45a63b9188cefe1671", + "0x136FD06Fa01eCF624C7F2B3CB15742c1339dC2c4": "0xe5d908be686056f1519663a407167c088924f60d29c799ec74438b9de891989e", + "0x0e39C3D9b2ec765eFd9c5c70BB290B1fCD8536E3": "0x922802781ec30161bba0d4b3f85aa9fd6f12d69c8a66fe86c649c6baf03ec0d6", + "0x156C628135327F41748D8c8802fC043870714E9a": "0x3aac2b2d95de235b0c06188a2a5690763f4d494c1d76595fcfc108af9cddbcc1", + "0xE42FFA682A26EF8F25891db4882932711D42e467": "0x68d13e8e757be2e648d7201ab1b459ee97bd1bb32805538685f3046bf824525c", + "0x956CCab09898C0AF2aCa5e6C229c3aD4E93d9288": "0x7c77dab38a3257cd78eae76c1e043795034825b463fe35aba9647644017c00d3", + "0x9Ac3E70dB606659Bf32D4BdFbb687AD193FD1F5B": "0xb1f61ecdb383ce0b2417c675200d66a98b780f9c859cf23c862949b1a9160131", + "0x495F696430F4A51F7fcB98FbE68a9Cb7A07fB1bA": "0x4d9a95e63eb9ac91b895c12d7019cf123c6460e87afc7e37e9eb995b2579ba80", + "0x94522C4586cb15E08AFF943545Fb2c8Ca7f508cE": "0x4fdb72d901c59194d4876d4182714d305baa5ecee63008967ee88c19eb887d17", + "0x6c7F4D97269eCE163fd08D5C2584A21E4a33934c": "0x52ac3439e1b90875e0c6db0e68d4799a4e995e9cb21d32dcdac9b1110aaf5f2e", + "0x97207B095e4D5C9a6e4cfbfcd2C3358E03B90c4A": "0x7f1fbd5c40163ea748ac04a5c98091d7b0a49172fee1c218c781869c71f2c515", + "0xfCCcB77A946b6a3BD59d149F083B5BfbB8004D6D": "0x02892846ae164b28197598f113ee5c701f77aab7d4bd2eee941a3640f6e6e66b", + "0xAB093cd16e765b5B23D34030aaFaF026558e0A19": "0x5bfda7dda2c1f2b7624d0be4874b66b51150f9df7a623cab05c539a8570a15e0", + "0x85a80afee867aDf27B50BdB7b76DA70f1E853062": "0xcf445054380c5c71bc1d1a6332087517a11ea1508d8ae5f29968c8d34dc3f6ba", + "0x373b347bc87998b151A5E9B6bB6ca692b766648a": "0xcd52e6ba3e2f475603234e3a6e5a87fac839a8d039eca6c3f31da5d7b20cbaa8", + "0x35c425234DC42e7402f54cC54573f77842963a56": "0x52da511e17096c6ede27470cf314630c8441bdcdee2e39b671c005ac57b901ff", + "0x1bbfa323155526F54EEc458571Bb5A75e0c41507": "0x32e79c3ebf56c27b14304476cc610ea11de05865bff032d7adf6543cd69fc82a", + "0xD487eec3EF2Be7a3d06D37F406d878DC7c50deEF": "0x10a3115249bac78938acf3682d352ad6ba5da0a4b81de1609b9ceba43fcb6966", + "0xFA2C0bd8327C99db5bdE4c9e9E5cbF30946351bb": "0x9f246123242dbf445122e3abc13846a30eead98cd5769ad7f1210ff948341f23", + "0x82e4cFaef85b1B6299935340c964C942280327f4": "0x2bc079c0e725f43670898b474afedf38462feee72ef8e874a1efcec0736672fc", + "0x7bc6C0E73EDAa66eF3F6E2f27b0EE8661834c6C9": "0xb189a45eac7ea59c0bb638b5ae6c4c93f9877f31ce826e96b792a9154e7a32a7", + "0x93ECf386cD53718aF16a09C325a56D1bB60aDc37": "0xafd498a85b99248e957da6bdb7810d607c5e1b72bf9d69663746dfd9e0a94a90", + "0xeff1d57A28167E6982DCa1D63321810400f73929": "0xe088848d4502e564c261094421f6e7e159540f86f952c9ac9dc216b76c01b951", + "0xf23b4DB826DbA14c0e857029dfF076b1c0264843": "0x9de45b5cae94e8c505878722e370b87fb210eeb61bcefc804cb8a81bd1edcd60", + "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6": "0x5961edc334d6cd0d903e55bc8c8273923f2e7431629badc77f58d786565fda3e", + "0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88": "0xe9e2323135bb856bb572998655cdf3cba8049e9727832abf7c9fb99c66ef9600", + "0x11884dA90FB4221b3aa288a7741C51eC4Fc43B2f": "0xbc51a51efdd10d21ad83d70cdfbebebd95734f0add7124ec1f614abd3ee44dbd", + "0xa3B9515A9c557455BC53F7a535A85219b59e8B2E": "0x251d4ca291f258fe9c047014eced2c694db5edca2c3822ef2ecc45a177949ccc", + "0x040dBA12Bb3D5C0A73ddfe84C220Be3ddBA06966": "0x939009ad58718cb4cef67a415ab68ebd75e758aae1e2ebed0c2f76c7c47416af", + "0xf984eb2B8a7eF780245a797A2fCcd82f346409ca": "0x712a9b42042fd82ad1857e8dbe74a6d5bd0594f83c48bd93fd588990f28637eb", + "0x7396f99B48e7436b152427bfA3DD6Aa8C7C6d05B": "0x5a8203f65ab879ca6b1107a8b22667d29e29a41e1266a6a5935d9a145b36568f", + "0x533a16F90E7d3Ca31dbc608E5EC54967710F0D2A": "0xc38a9ee749170e298a46a6d2a792c33e6cda96ea53ef29ba0748105aebda863c", + "0x0320C1C5B6df19A194D48882aaEC1c72940081D9": "0x6dd9d5d3a6ca6291bafd4da510b2411adccd9a5f00ec2c6f416a26ec7aa1703a", + "0xc3ccacE87f6d3A81724075ADcb5ddd85a8A1bB68": "0x85aaf2b0a15a1d548e72bfa26298d27a384c40011730858814a21db5983b81be", + "0xa523f47A933D5020b23629dDf689695AA94612Dc": "0x5f2cbd0d6f6ddc32166c6d10372ca73f03de1d6e92f557e399605e22240ada6e", + "0x4271de2595c3d85d2D455C5778adF2d7Ad54322C": "0x5806c38105cff6e69701bc0e63603f0c46a026a1ef1ba9570a4f13b32e619185", + "0xFc8a407Bba312ac761D8BFe04CE1201904842B76": "0x65e6b13231c2c5656357005a9e419ad6697178ae74eda1ea7522ecdafcf77136", + "0xb77E03655ee894AadE216A83D05511A9F9895126": "0x59ce259246702ac98b790868ce17c52c63228a488310a77fadbe12bca54683d5", + "0x6Ab5549bBd766A43aFb687776ad8466F8b42f777": "0x2cea6a0683e67ebdb7d4a1cf1ad303126c5f228f05f8c9e2ccafdb1f5a024376", + "0x0f25823cF786b78696b16536e2F2B9835289AB51": "0xa56b9702b257d75d86c4d494f574f105929abc9be9ad16e4428430b0bb621086", + "0x47B489bf5836f83ABD928C316F8e39bC0587B020": "0x664317550048967740785a4b4bebcd98dce2e8d68313ee1e4358e28ca87744b6", + "0x1311Fbc9F60359639174c1e7cC2032DbDb5Cc4d1": "0x25b5eca7f9b577bea2ba152503afa632a497fb523424467854df7f35cf3031c1", + "0x0f08eEf2C785AA5e7539684aF04755dEC1347b7c": "0x56efaf59fe07dc99bce552418567fe8fc0b4ad4da7065948595f8a243446095c", + "0xc9b36096f5201ea332Db35d6D195774ea0D5988f": "0x43f98328c285908c03e9bbcbe03fe88123c249e60ce78825fde05a0441166171", + "0x22625eEDd92c81a219A83e1dc48f88d54786B017": "0xdf70ba12273e9bc62d4c70de2d677b6ed247871dc9bb7b36f09198843e062ab9", + "0xB98F54A74590a6e681fF664b2Fa22EBfFe1a929E": "0x3372aedb668e0a6ff7ae8d9e4402452e2bedfcb9db5ecc2d6bccc093d5573de5", + "0xf553bf40DB86c35f3058434039D51Aad29c6180b": "0xa143074615098e06f9b042c0c737b90f3a9926ef15f60ca685ae0bc41e3a8f14", + "0xEDFd0A7005A7c72c44Ff13bEa370c86A9D11beE1": "0x6c805c98deb013e1f78d66f9a70e330c94c6bdc510fdc1903cc9d3b2ce6d7848", + "0xCEFD59EedAFA9EE8Ccda1AaF944088E68B5BD890": "0x9fae5852fe59a936511949ed7c3cb330946468a64b135ebfa25d94096127103d", + "0x72EbAFDdC4C7d3EB702c81295D90A8B29F008a03": "0x9cffd5e753fb7079aa01c6a96933a2ca1c078a7900cbb1a12c85fb9892f4acca", + "0x1eb79551CA0e83EC145608BC39a0c7F10cA21Aa5": "0xe992aeeae03e74c410d1c1adaa2f07e7d3deb9d5e4b592985095e6bf61465daf", + "0xB8Dfa4fd0F083de2B7EDc0D5eeD5E684e54bA45D": "0xcf849db42c9ef17cdd16ff8b0f27cc538de2483676ccd8adf39616e37743a554", + "0x074eFD7806e6c28e8b6611075b1Aa62c6c408090": "0xac55fa2fb9d9a20012572f6c0774dc76f95c9a4cde5ee7a1c228b73a65d49e83", + "0x020301b0a99EFB6816B41007765Fb577259eC418": "0xdf83ff5c50008f551bbdf8445e7fc6f72c343ceef94e4526ad493c956894df4d", + "0x0b576c1245F479506e7C8bbc4dB4db07C1CD31F9": "0x84b9d44ab0bdedaf141a43af7843f6460caa50188e0a605a3990b27287aa2837", + "0x28fa1E40011aDF98898E8243B2a48BB21EbF0C29": "0x91dad5e2f452effcdafdd4b6f0fcbfafdaf28a3eb57d98302718d571790e112e", + "0xdae301690004946424E41051aCe1791083be42a1": "0xd1ff4b1a64a4a26a5de3eb33dd50d4c701e937ebd71510321f8cc57f13064de1", + "0x5C5fCf8fBd4cd563cED27e7D066b88ee20E1867A": "0xb86561ebd3c4cacc431186046d5c90e56fa080508d5273225368f21060cbcab7", + "0x19DFEF0a828EEC0c85FbB335aa65437417390b85": "0x4bc8de94424732ac9a92c64307679c9fda7d4fe2cca5fb09dc105b462a35669a", + "0xc55eC796A4dEBE625d95436a3531f4950b11bdcf": "0x4ab9c07eb8dcc4c492943b75ccb7bfaed7ba6358b79d7587c6215a5cc137d8c1", + "0xAB2372275809E15198A7968C7f324053867cdB0C": "0x23dcffd6cecdb698f7c961728666638b33dcc09a8acacbea12a4e4d07469d68d", + "0x0Df6bb26533EB86F371B1F70EeCdD955420523C6": "0xe275e71ae29f5b0e7fed9cf188624aebdf88fe1c75c5f0eb004ab48797cfb134", + "0xE72B2780D3C57F781Bd4E8572E200CD7E9A447C2": "0x612368aad6699ea08f274c2913ef530807d314f4075bc4769132ee8fc03ac792", + "0x0889b240A5876aae745Ac19f1771853671dC5d36": "0x0a36297bf67c2ddf54e35d2989ebd2837026b8ad3909614c64976b3500e48a7c", + "0xD961E30156C2E0D0d925A0De45f931CB7815e970": "0x8e730d6ab4dc3c38bb663fb17ee02cb395dbf8e674070357d65f0db1d4468018", + "0x08fd003D8F1892D4EC684E6C3EE0128081be461b": "0x0d1683e84a1578e4173242659f7ff1b85efb16f4cf4f3e0ba6804ebabd18d52a", + "0xe2fa4e1d17725e72dcdAfe943Ecf45dF4B9E285b": "0xa3d9a1cf00eaca469d6f9ec2fb836bbbfdfbc3b0eeadc07619bb9e695bfdecb8", + "0xD35325DfC0B02718a41De7c94Ac9FC10D0AD5624": "0xee7ca79e67ad74a9e0aec531fb565887906f2fdca581c74e03bccecd3416d99f", + "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089": "0xf7ffd79f049d84005d971d87aac749684e2cf7bcd5d9be016b6824a789cca006", + "0x268E2EE1413D768b6e2dc3F5a4ddc9Ae03d9AF42": "0x63b21d1c5741323d547b1a370fa9e0bd7945dae34b6442c107da425db93dbf0f", + "0xa3b370092aeb56770B23315252aB5E16DAcBF62B": "0x32a0d4b22c69b174ad62578ac8f9c7d367262baabb26576fbcc28bbe06e00b4a" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/deployment-txs/sepolia.json b/balpy/balancer-deployments/deployment-txs/sepolia.json new file mode 100644 index 0000000..2cfb1d4 --- /dev/null +++ b/balpy/balancer-deployments/deployment-txs/sepolia.json @@ -0,0 +1,82 @@ +{ + "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6": "0x9e0daaeebe76f1005e633a4b024d213651dbce9471192ed1b7eb43bc144b312b", + "0xA1f998a5775Cd85f33039a9b5C29b09097D211f3": "0x0e688c1379cf065f87be79d454e4001eabaadad1d491b8ec4185f24d707a7862", + "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca": "0xcabd88cab4312556e813d4c9985b4196c5e19258fd8340666612bbb771a7ea21", + "0xA1Fa945425eD2e08Acb932E000bCc2f21B21588A": "0xd4920e66cbc40b5d783bc64f9ede5256fd768cde4d54cc83909c4ece61203885", + "0xBA12222222228d8Ba445958a75a0704d566BF2C8": "0xb22509c6725dd69a975ecb96a0c594901eeee6a279cc66d9d5191022a7039ee6", + "0xdcdbf71A870cc60C6F9B621E28a7D3Ffd6Dd4965": "0xa16468ca21766dc56ba33f4c9303e3cd491410ad9df3e7541ad2f0c0087aa1d2", + "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B": "0xe0e8feb509a8aa8a1eaa0b0c4b34395ff2fd880fb854fbeeccc0af1826e395c9", + "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a": "0x22c3d9bcdd925fb313941d7a114ef048631f93ad0d1cb44ff19f942f3566ef06", + "0x809B79b53F18E9bc08A961ED4678B901aC93213a": "0xad350af7bca47b03629c7247252df7b669357c8f6e789bd22262bbfa288c03b5", + "0x1802953277FD955f9a254B80Aa0582f193cF1d77": "0x8b1b1229f6066b4f14a3f8a992270a9663ef1af4e5407ec7c06ce8d6dfc9a462", + "0xf7D5DcE55E6D47852F054697BAB6A1B48A00ddbd": "0xf51015996cd020eb52fe8c4f91bebbde180777cf413c4c624f5d126179f502e8", + "0xb9aD3466cdd42015cc05d4804DC68D562b6a2065": "0xcc1188c99c638759a58261da918a693b06d29786a1bc28c2827a6dd7e451db40", + "0x6CaD2ea22BFA7F4C14Aae92E47F510Cd5C509bc7": "0x123db7a4bc379b46c64368d5e8d05101ff615e525ff773d22237a7d9856ab995", + "0x475D18169BE8a89357A9ee3Ab00ca386d20fA229": "0xf364b900f18c02244149649fda6030d6cd55fc687009a9b078a2db3890eefa0a", + "0xD87F44Df0159DC78029AB9CA7D7e57E7249F5ACD": "0x879959dda05a93b080073f101174ba8b741b423734170f0c8259bf0e1f4855e1", + "0xc7E5ED1054A24Ef31D827E6F86caA58B3Bc168d7": "0x37b26193fb89136b266d0b598ce65051da4102236ac4e87abf5ffa8fd3e675c5", + "0x59562f93c447656F6E4799fC1FC7c3d977C3324F": "0xd3c9f405f04152c27593e0aad4f2a0eba4e5e3764a1e15454e64d14ef9f5be89", + "0x2498A2B0d6462d2260EAC50aE1C3e03F4829BA95": "0xf85029e4eb8ecb090a3097d79f77f912900590f320821ba582685d6d9495d591", + "0x0c2EAd6F2Dc2A9385187023F4cec5925337B330f": "0x9e05a9d9e95fac519e1c3246fd3ceb2fba2da6c5d02f695adfa3b9a8e6b08486", + "0x8df317a729fcaA260306d7de28888932cb579b88": "0x09c02ded5fb414c8ee73a1126a6210ff89fd2a277e48615380a84e3b63f13fdc", + "0x3B1eb8EB7b43882b385aB30533D9A2BeF9052a98": "0xf545c109f9d59f2643cdc87263a5489c07a44163a0c574fb4f1a4fae609ee7cc", + "0x4C32a8a8fDa4E24139B51b456B42290f51d6A1c4": "0x1c3fa2afa52540a1551e6b823048c4e692450a8addde4865bd40836df87576a2", + "0x112a7b7ca66E6963C49BC523A415F7D8CDB806B9": "0x91652a5488c022f70d6c6356577e88f1064a5444f6a41108a434bb9d6ebd6f59", + "0xAcf05BE5134d64d150d153818F8C67EE36996650": "0x8065cbd4ceab325e948619fafb36c944b35157039f92646662db10b401e4ebe3", + "0x9129E834e15eA19b6069e8f08a8EcFc13686B8dC": "0x80fabe46862748f1c31bc3dc1c00dddd6cabcf0a6b55e87dd2576d7b02758c7e", + "0x016B7366F76aa2794097798B90CF239796AEff8d": "0xa3770dd5e882d6b7a59fc9890c80d2bee0bd33d620ea81113003375ff7951c44", + "0xDF9B5B00Ef9bca66e9902Bd813dB14e4343Be025": "0x830a05afff5fe9118097b9df05808af96afcce2590c1641b53313dae80b6ea85", + "0x300Ab2038EAc391f26D9F895dc61F8F66a548833": "0x4c6bc33f8d2abfe6b49a7983bd2c4f01b73aabaf5ed876a9436157015c66fcd9", + "0x03F3Fb107e74F2EAC9358862E91ad3c692712054": "0xd5a46371cf7cdd4d87bf931c7111796b8b8a49c1a71986466bb85704291abe10", + "0xE4EfD99f3C03778ba913Eb578C599329634e2bd7": "0xb357cca5ccd9d3f25dcd8cdc80bee8ae3ffa235ac5141e0dd849c9a93622653a", + "0x8eA89804145c007e7D226001A96955ad53836087": "0x98c66ac092821937b2557e7be5d6e6306aa8afe2a98bac92c01bb55577a10895", + "0xa7d524046ef89de9F8e4f2d7B029f66cCB738d48": "0x434f02ee6385e618a974c2f2e0f4ad1ffcec67f73045bbacf88b43e89d845b9b", + "0x6B1Da720Be2D11d95177ccFc40A917c2688f396c": "0x7f557ac6a4a5fa3bda69748d5ddfb5a25ce7acc6a00df532076c4cd39c21fc43", + "0x0c6052254551EAe3ECac77B01DFcf1025418828f": "0x61410e5841b332f789919ab5d6a8b758cf7dead6bc4356066e8f36f5ad6ba046", + "0xA149CF2D795AaB83a15673f5Beade9361e4e3F65": "0x9f4e687eb674809fc484c8d84809ad4720be665ca764d3e8b76d8e518a1476b2", + "0xb521dD5C8e13fE202626CaC98873FEA2b7760cE4": "0x18d6e266e8406177141d6a6c4667462ae5b74c6ab73ce0726a122eec27cc6b01", + "0xb19382073c7A0aDdbb56Ac6AF1808Fa49e377B75": "0xcb093746391c981910858f6c1d8846292e825b68bd31526d24ad563de10de471", + "0xEF454a7B3f965D3f6723E462405246f8Cd865425": "0x6460d864b376a272a4ea6b78a73f9da89193b7adea64699062f912ef5a0114e7", + "0x7d2248F194755DCa9A1887099394F39476d28C9a": "0x6b4bffe2060157561d81cb56d5ca86d623e17531e9d0ef4a5d73c182982095ca", + "0x7920BFa1b2041911b354747CA7A6cDD2dfC50Cfd": "0x7dd392b586f1cdecfc635e7dd40ee1444a7836772811e59321fd4873ecfdf3eb", + "0xf7a7E1F48FA43cb7919Ff4Eb362c5bE78092dF4A": "0xad2a75061fffab8cb083444dce4ab3b5ecce4d28f1a9313d0b81103274aea805", + "0x150A72e4D4d81BbF045565E232c50Ed0931ad795": "0xcb515bef1e24846e82759246dc3991f243b36f18db2f5d4fd93c1d77fcee7ffd", + "0x577e5993B9Cc480F07F98B5Ebd055604bd9071C4": "0xc45e0f084f37e88211e255c3b01db464cf9a33117eff7f7e78fd2c4322477c05", + "0x1783Cd84b3d01854A96B4eD5843753C2CcbD574A": "0xf9aa281e8cf8e64e675ed8f2fdc61056603ab3541d5a0ea20c35148ae9e2dd54", + "0x0c5538098EBe88175078972F514C9e101D325D4F": "0xe8e3fb25f55d43e3a9faa18e62968822490ba1f0bb3db2778c22fa6652547b87", + "0x9f7E65887413a8497b87bA2058cE6E4Ef4B37013": "0xb43c2f642d6d707eaf95131943bb373256c30ee04615c86d5987e2b8a3e102f9", + "0xb1a4FE1C6d25a0DDAb47431A92A723dd71d9021f": "0x59ee089a050c6baae42727eb75e0b09b3c69c568f446fc0cb5ccc5e5d13939ec", + "0x82416Ce6eA7dD4923d4A3ED70a79B4A432a382C4": "0xd719637c595f09e7ad8fe1f8011c3b335b8263befd62696eb6cf1f0156aeeb92", + "0x2FF226CD12C80511a641A6101F071d853A4e5363": "0xe8fb01b8fc7db2c001a852c333eace28984e80a140c76ac90022da442173da31", + "0x1b6F057520B4e826271D47b8bdab98E35Af17E59": "0x220e8ed698153b864fe680333d63fa443608bb8af58e7b2613f4f3851fac2c85", + "0x927906bbAc747c13c75F6447FE8abb490EAB456C": "0xba3fdde9ed3caff33186c3490671869d752dcaaa7cf19623d67ad1afc139817f", + "0x1DF32616fb1bBaEd07f42F1a1EfD1D0E232AcB4a": "0xc0667d523f282b30a8927af0c48643135278d1b51d3b589532e0f9ecef1cf1bb", + "0x7EE4D172Ae50C627a1BFA9A99E1260C54dA26fdF": "0xa266e2c05f2c8ec1d62abc4d86901bfac365bf9b2abe4ca67d81a3b874a69a5a", + "0x5F6848976C2914403B425F18B589A65772F082E3": "0x1116d43bed2ffd1cdf0963c797493c8175ec8603b074a8df8f063a25348eec52", + "0xb51f7fFc97CeDFb6922e8B9Bbf3eF7575fafD630": "0xa6a2c498e717fdab0bfce9889bcff618fd17a6a6ca76c515962332e3e6ec6d8e", + "0xC49Ca921c4CD1117162eAEEc0ee969649997950c": "0xac063794fe75e855ff91af3578912257645b2a0859767f02c6f3c656adb5f45c", + "0xC370cD86d5488c1788b62f11b09adb0C47F47440": "0x2137abc615f250b0ffc07c429aa6680fb9661c926620217f269b477d14ce744e", + "0xA3fd20E29358c056B727657E83DFd139abBC9924": "0x9313a59ad9a95f2518076cbf4d0dc5f312e0b013a43a7ea4821cae2aa7a50aa2", + "0xA8D865FE1D68a405B29f884358468c9B52d4841d": "0xdee545debf200fbaa1c3177de514e8cc58b33c67cf36f7f0f8d69c723d49f248", + "0xc7416E4f3715467dDcf28dc409A9483b2E4D4F43": "0x4382ca9e715543f08f3858fe43a8d950d292502fecfe3ac583738a536c377613", + "0x4C0C450bEdB9282A7a54fCB316c285E85A8c0265": "0xd474d624e1fb19645f14b29cb1c7e40be1b9df42997e50dd73fdc16ebaf0ec51", + "0xa30aDE89E6af5b0Ca515cd78e44f9aD0c63989b2": "0x5a90e3c001e9ea5d645fe32b20f048956d811639562b677d484fce17fff89a98", + "0x8246e571d88ACd1346179Cc3641DE87Fe3544d7A": "0x0f797a3ad660535fc33cf315d56a5c3f659abb57eac72b6f312ab913a0f243a3", + "0x5419e785b83Ad3539D3a8741C0ABb77D90d8784E": "0x1ba29fd2b78ff7a161f64c282b56bc1c876b2ddcc54fcb6bf28bd3fba5a6d394", + "0x63e179C5b6d54B2c2e36b9cE4085EF5A8C86D50c": "0xc70a59cd4d903e90791d0bd3010a53b5ccb1303cbab45b410692358ad403f01c", + "0xE458224CA8d6605c87b73E92aa5CB7A4e77770f3": "0x989aa5b26975c8b1bff50011a0ba288bdadfcfcfa3655cb7242fb5023b1899ed", + "0xe90472ffc41D7Ddf8E3B456bBA748e3F22c59C6f": "0x6a8d45e8f7eb76240ff05c6f293644bfac1b918133e12660cf868d09b3f261ec", + "0xA6971317Fb06c76Ef731601C64433a4846fCa707": "0x0ae01315c7fb4ef7133ddeefc2cd7f88ae4adbc00ee286e43ff60f41e086be75", + "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5": "0xbf0219dd6b785ad0886580df6f5037521577de42b820795e5143d37ef363e585", + "0xF24917fB88261a37Cc57F686eBC831a5c0B9fD39": "0xb40dad5a458cc2bd629bba67371918492c94c83c8b3de74d3a713e6815c30dbc", + "0xE42FFA682A26EF8F25891db4882932711D42e467": "0x1e8c8148d633121c470b0f75bccba192c136a8d5ab79566fce2acc7b5cb8d71e", + "0x2E4aBED3362A622C5f712bB183005A476b146bd3": "0x8951c1eaddde26830eafa7dd49aa3cccad20afb9c9e18bbd0b955f47526c4006", + "0xa523f47A933D5020b23629dDf689695AA94612Dc": "0x2c155dde7c480929991dd2a3344d9fdd20252f235370d46d0887b151dc0416bd", + "0xE24Aba051aaeB07f981bD449f4B0b3250e08d4fB": "0xef4e6ccd8487232a6b564c6493e9574a0312ad9c3c6b18f1709231eaf9b24acb", + "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089": "0xba6d3c63bffa7a59e0c2b131b8d012435e353bbdd26836e17947b94f55f6f70c", + "0x043A2daD730d585C44FB79D2614F295D2d625412": "0xc4bed425eb7e9d0bd919e8242fe5c00f2af5e8a21a2b4adb3f08971cecf8cc7c", + "0xA8920455934Da4D853faac1f94Fe7bEf72943eF1": "0x7dcddceac8e89e078b600a7ef5542486a6d65df603a82bbd01baf04db5a825fb", + "0x96484f2aBF5e58b15176dbF1A799627B53F13B6d": "0x40028652237393d5c9f9106b82f6bfe17a06e165a2590229246057366279e50d", + "0x268E2EE1413D768b6e2dc3F5a4ddc9Ae03d9AF42": "0x066799b931f617a9cfaa52943b88a1e960451e2330111cd98e62c43d13f01ec2", + "0x6eaD84Af26E997D27998Fc9f8614e8a19BB93938": "0x875cc6b2d50607d669d3365533db0f05fc4e57ee61bf72f8d9b3cc5aecad7369" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/deployment-txs/zkevm.json b/balpy/balancer-deployments/deployment-txs/zkevm.json new file mode 100644 index 0000000..9d651d2 --- /dev/null +++ b/balpy/balancer-deployments/deployment-txs/zkevm.json @@ -0,0 +1,54 @@ +{ + "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6": "0x51c6be6118d3c4dfdd11fc8e3c095957177803ebff4ef8c8be99a9ee25c8803f", + "0xBA12222222228d8Ba445958a75a0704d566BF2C8": "0xa80c03b9686ffdc01427af963f442ac51a7e64aad21b657f6126fe388a4835b6", + "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9": "0x0e26d50111e7e0f9a8576b1fa487849551371c213ccf429e2295a55cc7863701", + "0xdcdbf71A870cc60C6F9B621E28a7D3Ffd6Dd4965": "0x6d5429cbd889552093fa471e656c0304346fd85f28e408f8db58419315c29b46", + "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a": "0x1dc21f8984c00a8ef1ace28fec392ce1bea3aa4a7456bfa51e8bce06b98208b2", + "0x809B79b53F18E9bc08A961ED4678B901aC93213a": "0x2b977fbca811ef13c082907c25b373e32d3a45a385fc9418bf322bd482cbcabd", + "0x1802953277FD955f9a254B80Aa0582f193cF1d77": "0x09915b5e5e3b553fa3d85975b0eed0d3533354d9554b17f47e90cb5238227bbd", + "0xf7D5DcE55E6D47852F054697BAB6A1B48A00ddbd": "0xe7818e2160e2aebf8cc88deb8cb3d16c514026fd008ab700377b586630329963", + "0xb9aD3466cdd42015cc05d4804DC68D562b6a2065": "0xc06ecf323db248ff24f29e598e9f26dd04da736dd51aed2d4983f759744ab490", + "0x6CaD2ea22BFA7F4C14Aae92E47F510Cd5C509bc7": "0xee4b2678bb1f8a73cb374f3dbf84f6cc9c14cd13d4c3dbe7aaaac1d49f368df4", + "0x475D18169BE8a89357A9ee3Ab00ca386d20fA229": "0x7acf575a16dbf19236246ab95ea104aad97411d8d94dc7eb3cf4e548d7ebbf84", + "0xD87F44Df0159DC78029AB9CA7D7e57E7249F5ACD": "0xe224b3e8b99de057159281a198fe9f86bba0545cfa98f467638306a188c46439", + "0xc7E5ED1054A24Ef31D827E6F86caA58B3Bc168d7": "0xf1a5d7967f0dc3deed50f3aa59c8dc89d07b8adea0af62c4b59e14a1f9425a2a", + "0x59562f93c447656F6E4799fC1FC7c3d977C3324F": "0x26e886dcfef763a45e47f20324304ca6e06d9b66e7b2b5b92aa5c9c3fead7a00", + "0x2498A2B0d6462d2260EAC50aE1C3e03F4829BA95": "0xafa057ee3239bf5f250c35f466b121698e23118111a9379548a54f9fbea6b26f", + "0xDEd7Fef7D8eCdcB74F22f0169e1A9EC696e6695d": "0x803c2edd9b33b8804357449470689013e50b40c9ae58463a67db3de8ce00e012", + "0x8df317a729fcaA260306d7de28888932cb579b88": "0x821d94ffe76442b08b98aab8c356bbe131c2dd15638577eae384f0f9cf387758", + "0x3B1eb8EB7b43882b385aB30533D9A2BeF9052a98": "0xb089889a259d0acbbd5de9865589d01426687aa879e3f68f0f8b49082ddfd736", + "0x3c87FF3e9307dbEbfAe720E04C6439e49f79BF9B": "0xfed87d3fe18cfda4ac3db890d942a39a2ad4063cb95e1e143e2b665304369aa4", + "0x54f8F9d28e26Fa5864cfA80f50A5Df95fD85f46a": "0x43361078b23cc808eae70adc8fea6f718e9444af322bba65c246ceb879afc3d7", + "0xAcf05BE5134d64d150d153818F8C67EE36996650": "0xa040f12768e3bc76f8f12e6a52d8572224987634fc32b5c3f78ba8887947cb15", + "0x9129E834e15eA19b6069e8f08a8EcFc13686B8dC": "0x998a6132617ff4f6f1b4c40e8b3839ca86017eff3ac0c8855687eef7c044ce56", + "0xA69E0Ccf150a29369D8Bbc0B3f510849dB7E8EEE": "0xea4f591ffde13e2454d64789dfbdcd7114a8fd8d694fd04904f7ce70e9b6a24d", + "0xDF9B5B00Ef9bca66e9902Bd813dB14e4343Be025": "0x854d9b74dd95cbe681f458a2a68fe50c285208d92d6f4f78309757347b73dcc0", + "0x300Ab2038EAc391f26D9F895dc61F8F66a548833": "0xe0cd62de2facc36b0ebd3da63079abf13843761629c1e0e7d439676ab4a4389d", + "0x03F3Fb107e74F2EAC9358862E91ad3c692712054": "0x9e631b9e7836bc80c613e83533a2b41e102d109c1b7f9d01fe458d5d90c5cc78", + "0x78385153d2f356C87001F09BB5424137c618D38b": "0xda8a4c3282c272e127a1d5751ccb585173c889314db3950ca0ee65d95f11d178", + "0x8eA89804145c007e7D226001A96955ad53836087": "0xac4399bd094532ab98560b43b1bedcc91633aafe97474454c510a9f0f05ab7bf", + "0x6f5F794A3CeF904b8517C4c311DE2FA837Ff24a0": "0x84d20ee76f9b3d6b778101d73f97bc986e75c8abe09bde41738153d539edf993", + "0x6B1Da720Be2D11d95177ccFc40A917c2688f396c": "0xf55d49766f8a2185f9ba54bf752146ce71e7c6cf361f22d039a8129ac665a61c", + "0x0c6052254551EAe3ECac77B01DFcf1025418828f": "0xb4c059f7ac82f355bea7422b9ca1522bfac816396463a5be821187c5d3ed2fad", + "0xac4b72c01072A52b73ca71105504F1372eFcCE0d": "0xda903fe3a73cdb5c5f42a6606f95f38fcb6b39673f33ac8acd5c06539933f7d0", + "0x4b7b369989e613ff2C65768B7Cf930cC927F901E": "0xff056ea767cb8671c1db09f546812d28b657f545af328fe74a1e26baba6d621d", + "0x161f4014C27773840ccb4EC1957113e6DD028846": "0x3aad794841c5886732606eff12f93f32042f80bdf41dd77aba754e613337145c", + "0x4638ab64022927C9bD5947607459D13f57f1551C": "0xcdea7c1b04044213a42424c2a14b74a8bade7001df6c3ab2d632ff336ad57f55", + "0xbFD65c6160CFd638A85C645e6e6d8ACac5Dac935": "0x0d8418e7d712d316421531dc0a0023dcbd2f9f5ee16797c93b4ac46c8d924424", + "0x687b8C9b41E01Be8B591725fac5d5f52D0564d79": "0x24192bc65ec90732acfc189b3f10e920ee8a9c259a8d34dbbacdcefd431ad1ca", + "0x88ED12A90142fDBFe2a28f7d5b48927254C7e760": "0xeb2513c8aa5f6cc3aff74fc51225e5be3dbadeb0bf623c0ea9d716b4081d508c", + "0x698CaED853bE9cEA96C268f565e2b61D3b2BcDA4": "0x52f7271e5d148f26da9b3e98163a99b381cc1d34c38fa23eeb56eed2a14b5786", + "0x32f03464FdF909FDf3798f87Ff3712b10c59bd86": "0xd2865022877a4f26b67c242ed9cb6d146b5b6e1a5eae8d617b61894cc91a2a4a", + "0x44d33798dddCdAbc93Fe6a40C80588033Dc502d3": "0x75274619991ef1b107c2b6b9d41fde05ba903ee23675008d7686097d6d6bd149", + "0xDBf7B9F1d2Bfba14e42709f84dda3187eE410e38": "0x78697d10dd869d04bc8b99082670b8908efd54c92db3b4561e782c0edca8a908", + "0x02c9DCB975262719A61f9B40bDf0987eAD9Add3a": "0x64250575ea31aecabb1d6f3d2cb3aa04df91072d6c3aa209108dba7630d0703d", + "0xaf779e58dafb4307b998C7b3C9D3f788DFc80632": "0x6ba68826878ffc8c5e7e9437e36c8c4145ccecd3b3816f15f9e9e07ab64e4610", + "0x522Ee506a2f63D0AE1D79D6F5Dbd9d0bCA32C866": "0xa79615f44a51744d7a88727c21cc2f2b32914cf06443e9299e83d7e67e8f67ec", + "0xEF454a7B3f965D3f6723E462405246f8Cd865425": "0xc67442b954b3bccff60bd9be4e34162db73b393eb5a42dfff9a793b48e0f5581", + "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5": "0x6de4c45bdbae63f43f8e6c7a98f14886e5c9a1c9209d3027dd84eb09d316322c", + "0x956CCab09898C0AF2aCa5e6C229c3aD4E93d9288": "0xbc3767b1d7160745b5a639f64b7b2e1ce846ccb4d752f1671de2c3f69e356ac8", + "0x7682e108Cd89d86303625c8478c21Ff86f401166": "0x4500a03073083022825d2b4ca917a61aabe4ce548e5e08347c31d3d3cec9c8fc", + "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089": "0xb1edcb48a2d058a6954a2f7e9748413009a3e71e6fa766a8e92f36dceb5a561a", + "0x85a80afee867aDf27B50BdB7b76DA70f1E853062": "0x03f89cc9f24f9cf499c7cacc8bfe6b58ec10b0c2eb9f35bf93884156a0b36565", + "0x4132f7AcC9dB7A6cF7BE2Dd3A9DC8b30C7E6E6c8": "0xe868e012256f6fdf2c453012871555dc97e06388cf1b2252ad1ec6ffff4b3a31" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/hardhat.config.ts b/balpy/balancer-deployments/hardhat.config.ts new file mode 100644 index 0000000..911eee1 --- /dev/null +++ b/balpy/balancer-deployments/hardhat.config.ts @@ -0,0 +1,358 @@ +import '@nomiclabs/hardhat-ethers'; +import '@nomiclabs/hardhat-vyper'; +import '@nomiclabs/hardhat-waffle'; +import 'hardhat-local-networks-config-plugin'; +import 'hardhat-ignore-warnings'; +import 'tsconfig-paths/register'; + +import './src/helpers/setupTests'; + +import { task } from 'hardhat/config'; +import { TASK_TEST } from 'hardhat/builtin-tasks/task-names'; +import { HardhatRuntimeEnvironment } from 'hardhat/types'; + +import path from 'path'; +import { existsSync, readdirSync, readFileSync, statSync } from 'fs'; + +import { checkArtifact, extractArtifact } from './src/artifact'; +import test from './src/test'; +import Task, { TaskMode } from './src/task'; +import Verifier from './src/verifier'; +import logger, { Logger } from './src/logger'; +import { + checkActionIds, + checkActionIdUniqueness, + saveActionIds, + getActionIdInfo, + fetchTheGraphPermissions, +} from './src/actionId'; +import { checkContractDeploymentAddresses, saveContractDeploymentAddresses } from './src/network'; + +const THEGRAPHURLS: { [key: string]: string } = { + goerli: 'https://api.thegraph.com/subgraphs/name/balancer-labs/balancer-authorizer-goerli', +}; + +task('deploy', 'Run deployment task') + .addParam('id', 'Deployment task ID') + .addFlag('force', 'Ignore previous deployments') + .addOptionalParam('key', 'Etherscan API key to verify contracts') + .setAction( + async (args: { id: string; force?: boolean; key?: string; verbose?: boolean }, hre: HardhatRuntimeEnvironment) => { + Logger.setDefaults(false, args.verbose || false); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const apiKey = args.key ?? (hre.config.networks[hre.network.name] as any).verificationAPIKey; + const verifier = apiKey ? new Verifier(hre.network, apiKey) : undefined; + await new Task(args.id, TaskMode.LIVE, hre.network.name, verifier).run(args); + } + ); + +task('verify-contract', `Verify a task's deployment on a block explorer`) + .addParam('id', 'Deployment task ID') + .addParam('name', 'Contract name') + .addParam('address', 'Contract address') + .addParam('args', 'ABI-encoded constructor arguments') + .addOptionalParam('key', 'Etherscan API key to verify contracts') + .setAction( + async ( + args: { id: string; name: string; address: string; key: string; args: string; verbose?: boolean }, + hre: HardhatRuntimeEnvironment + ) => { + Logger.setDefaults(false, args.verbose || false); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const apiKey = args.key ?? (hre.config.networks[hre.network.name] as any).verificationAPIKey; + const verifier = apiKey ? new Verifier(hre.network, apiKey) : undefined; + + // Contracts can only be verified in Live mode + await new Task(args.id, TaskMode.LIVE, hre.network.name, verifier).verify(args.name, args.address, args.args); + } + ); + +task('extract-artifacts', `Extract contract artifacts from their build-info`) + .addOptionalParam('id', 'Specific task ID') + .addOptionalParam('file', 'Target build-info file name') + .addOptionalParam('name', 'Contract name') + .setAction(async (args: { id?: string; file?: string; name?: string; verbose?: boolean }) => { + Logger.setDefaults(false, args.verbose || false); + + if (args.id) { + const task = new Task(args.id, TaskMode.READ_ONLY); + extractArtifact(task, args.file, args.name); + } else { + for (const taskID of Task.getAllTaskIds()) { + const task = new Task(taskID, TaskMode.READ_ONLY); + extractArtifact(task, args.file, args.name); + } + } + }); + +task('check-deployments', `Check that all tasks' deployments correspond to their build-info and inputs`) + .addOptionalParam('id', 'Specific task ID') + .setAction(async (args: { id?: string; force?: boolean; verbose?: boolean }, hre: HardhatRuntimeEnvironment) => { + // The force argument above is actually not passed (and not required or used in CHECK mode), but it is the easiest + // way to address type issues. + + Logger.setDefaults(false, args.verbose || false); + logger.log(`Checking deployments for ${hre.network.name}...`, ''); + + if (args.id) { + await new Task(args.id, TaskMode.CHECK, hre.network.name).run(args); + } else { + for (const taskID of Task.getAllTaskIds()) { + if (taskID.startsWith('00000000-')) { + continue; + } + + const task = new Task(taskID, TaskMode.CHECK, hre.network.name); + const outputDir = path.resolve(task.dir(), 'output'); + + if (existsSync(outputDir) && statSync(outputDir).isDirectory()) { + const outputFiles = readdirSync(outputDir); + if (outputFiles.some((outputFile) => outputFile.includes(hre.network.name))) { + // Not all tasks have outputs for all networks, so we skip those that don't + await task.run(args); + } + } + } + } + }); + +task('check-artifacts', `check that contract artifacts correspond to their build-info`) + .addOptionalParam('id', 'Specific task ID') + .setAction(async (args: { id?: string; verbose?: boolean }) => { + Logger.setDefaults(false, args.verbose || false); + + if (args.id) { + const task = new Task(args.id, TaskMode.READ_ONLY); + checkArtifact(task); + } else { + for (const taskID of Task.getAllTaskIds()) { + const task = new Task(taskID, TaskMode.READ_ONLY); + checkArtifact(task); + } + } + }); + +task('save-action-ids', `Print the action IDs for a particular contract and checks their uniqueness`) + .addOptionalParam('id', 'Specific task ID') + .addOptionalParam('name', 'Contract name') + .addOptionalParam('address', 'Address of Pool created from a factory') + .setAction( + async (args: { id: string; name: string; address?: string; verbose?: boolean }, hre: HardhatRuntimeEnvironment) => { + async function saveActionIdsTask( + args: { id: string; name: string; address?: string; verbose?: boolean }, + hre: HardhatRuntimeEnvironment + ) { + Logger.setDefaults(false, args.verbose || false); + + // The user is calculating action IDs for a contract which isn't included in the task outputs. + // Most likely this is for a pool which is to be deployed from a factory contract deployed as part of the task. + if (args.address) { + if (!args.id || !args.name) { + throw new Error( + "Provided an address for Pool created from a factory but didn't specify task or contract name." + ); + } + const task = new Task(args.id, TaskMode.READ_ONLY, hre.network.name); + await saveActionIds(task, args.name, args.address); + return; + } + + // The user is calculating the action IDs for a particular task or contract within a particular task. + if (args.id && args.name) { + const task = new Task(args.id, TaskMode.READ_ONLY, hre.network.name); + await saveActionIds(task, args.name); + return; + } + + async function generateActionIdsForTask(taskId: string): Promise { + const task = new Task(taskId, TaskMode.READ_ONLY, hre.network.name); + const outputDir = path.resolve(task.dir(), 'output'); + + if (existsSync(outputDir) && statSync(outputDir).isDirectory()) { + for (const outputFile of readdirSync(outputDir)) { + const outputFilePath = path.resolve(outputDir, outputFile); + if (outputFile.includes(hre.network.name) && statSync(outputFilePath).isFile()) { + const fileContents = JSON.parse(readFileSync(outputFilePath).toString()); + const contractNames = Object.keys(fileContents); + + for (const contractName of contractNames) { + await saveActionIds(task, contractName); + } + } + } + } + } + + if (args.id) { + await generateActionIdsForTask(args.id); + return; + } + + // We're calculating action IDs for whichever contracts we can pull enough information from disk for. + // This will calculate action IDs for any contracts which are a named output from a task. + for (const taskID of Task.getAllTaskIds()) { + await generateActionIdsForTask(taskID); + } + } + + await saveActionIdsTask(args, hre); + checkActionIdUniqueness(hre.network.name); + } + ); + +task('check-action-ids', `Check that contract action-ids correspond the expected values`) + .addOptionalParam('id', 'Specific task ID') + .setAction(async (args: { id?: string; verbose?: boolean }, hre: HardhatRuntimeEnvironment) => { + Logger.setDefaults(false, args.verbose || false); + logger.log(`Checking action IDs for ${hre.network.name}...`, ''); + + if (args.id) { + const task = new Task(args.id, TaskMode.READ_ONLY, hre.network.name); + await checkActionIds(task); + } else { + for (const taskID of Task.getAllTaskIds()) { + const task = new Task(taskID, TaskMode.READ_ONLY, hre.network.name); + await checkActionIds(task); + } + } + checkActionIdUniqueness(hre.network.name); + }); + +task('get-action-id-info', `Returns all the matches for the given actionId`) + .addPositionalParam('id', 'ActionId to use for the lookup') + .setAction(async (args: { id: string; verbose?: boolean }, hre: HardhatRuntimeEnvironment) => { + Logger.setDefaults(false, args.verbose || false); + logger.info(`Looking for action ID info on ${hre.network.name}...`); + + const actionIdInfo = await getActionIdInfo(args.id, hre.network.name); + if (actionIdInfo) { + logger.log(`Found the following matches:`, ''); + logger.log(JSON.stringify(actionIdInfo, null, 2), ''); + } else { + logger.log(`No entries found for the actionId`, ''); + } + }); + +task('get-action-ids-info', `Reconstructs all the permissions from TheGraph AP and action-ids files`).setAction( + async (args: { verbose?: boolean }, hre: HardhatRuntimeEnvironment) => { + Logger.setDefaults(false, args.verbose || false); + logger.log(`Fetching permissions using TheGraph API on ${hre.network.name}...`, ''); + + const permissions = await fetchTheGraphPermissions(THEGRAPHURLS[hre.network.name]); + + const infos = ( + await Promise.all(permissions.map((permission) => getActionIdInfo(permission.action.id, hre.network.name))) + ).map((info, index) => ({ + ...info, + grantee: permissions[index].account, + actionId: permissions[index].action.id, + txHash: permissions[index].txHash, + })); + logger.log(`Found the following matches:`, ''); + process.stdout.write(JSON.stringify(infos, null, 2)); + } +); + +task('build-address-lookup', `Build a lookup table from contract addresses to the relevant deployment`).setAction( + async (args: { verbose?: boolean }, hre: HardhatRuntimeEnvironment) => { + Logger.setDefaults(false, args.verbose || false); + if (hre.network.name === 'hardhat') { + logger.warn(`invalid network: ${hre.network.name}`); + return; + } + + // Create Task objects, excluding tokens tasks. + const tasks = Task.getAllTaskIds() + .filter((taskId) => !taskId.startsWith('00000000-')) + .map((taskId) => new Task(taskId, TaskMode.READ_ONLY, hre.network.name)); + + saveContractDeploymentAddresses(tasks, hre.network.name); + logger.success(`Address lookup generated for network ${hre.network.name}`); + } +); + +task( + 'check-address-lookup', + `Check whether the existing lookup table from contract addresses to the relevant deployments is correct` +).setAction(async (args: { verbose?: boolean }, hre: HardhatRuntimeEnvironment) => { + Logger.setDefaults(false, args.verbose || false); + if (hre.network.name === 'hardhat') { + logger.warn(`invalid network: ${hre.network.name}`); + return; + } + + // Create Task objects, excluding tokens tasks. + const tasks = Task.getAllTaskIds() + .filter((taskId) => !taskId.startsWith('00000000-')) + .map((taskId) => new Task(taskId, TaskMode.READ_ONLY, hre.network.name)); + + const addressLookupFileOk = checkContractDeploymentAddresses(tasks, hre.network.name); + if (!addressLookupFileOk) { + throw new Error( + `Address lookup file is incorrect for network ${hre.network.name}. Please run 'build-address-lookup' to regenerate it` + ); + } else { + logger.success(`Address lookup file is correct for network ${hre.network.name}`); + } +}); + +task(TASK_TEST).addOptionalParam('id', 'Specific task ID of the fork test to run.').setAction(test); + +export default { + mocha: { + timeout: 600000, + }, + solidity: { + version: '0.7.1', + settings: { + optimizer: { + enabled: true, + runs: 9999, + }, + }, + }, + vyper: { + compilers: [{ version: '0.3.1' }, { version: '0.3.3' }], + }, + paths: { + artifacts: './src/helpers/.hardhat/artifacts', + cache: './src/helpers/.hardhat/cache', + sources: './src/helpers/contracts', + }, + warnings: { + '*': { + 'shadowing-opcode': 'off', + default: 'error', + }, + }, + etherscan: { + customChains: [ + { + network: 'zkemv', + chainId: 1101, + urls: { + apiURL: 'https://api-zkevm.polygonscan.com/api', + browserURL: 'https://zkevm.polygonscan.com/', + }, + }, + { + network: 'base', + chainId: 8453, + urls: { + apiURL: 'https://api.basescan.org/api', + browserURL: 'https://basescan.org/', + }, + }, + { + network: 'fantom', + chainId: 250, + urls: { + apiURL: 'https://api.ftmscan.com/api', + browserURL: 'https://ftmscan.com', + }, + }, + ], + }, +}; diff --git a/balpy/balancer-deployments/index.ts b/balpy/balancer-deployments/index.ts new file mode 100644 index 0000000..507fbb6 --- /dev/null +++ b/balpy/balancer-deployments/index.ts @@ -0,0 +1,117 @@ +import { Contract } from '@ethersproject/contracts'; +import { Artifact } from 'hardhat/types'; + +/** + * @dev Returns the task id and contract name for a canonical contract deployed on a specific network. + * Throws if the address doesn't match any known Balancer deployment. + * @param address Address of the contract to be fetched + * @param network Name of the network looking the deployment for (e.g. mainnet, polygon, goerli, etc) + */ +export function lookupBalancerContractByAddress(address: string, network: string): { task: string; name: string } { + // eslint-disable-next-line @typescript-eslint/no-var-requires + const networkAddresses = require(getBalancerContractAddresses(network)); + const deploymentInfo = networkAddresses[address]; + if (deploymentInfo === undefined) { + throw new Error(`Unable to connect ${address} to any Balancer deployment on ${network}`); + } + return deploymentInfo; +} + +/** + * @dev Creates an ethers Contract object for a canonical contract deployed on a specific network + * @param task ID of the task to fetch the deployed contract + * @param contract Name of the contract to be fetched + * @param network Name of the network looking the deployment for (e.g. mainnet, polygon, goerli, etc) + */ +export async function getBalancerContract(task: string, contract: string, network: string): Promise { + const address = await getBalancerContractAddress(task, contract, network); + return getBalancerContractAt(task, contract, address); +} + +/** + * @dev Creates an ethers Contract object from a dynamically created contract at a known address + * @param task ID of the task to fetch the deployed contract + * @param contract Name of the contract to be fetched + * @param address Address of the contract to be fetched + */ +export async function getBalancerContractAt(task: string, contract: string, address: string): Promise { + const artifact = getBalancerContractArtifact(task, contract); + return new Contract(address, artifact.abi); +} + +/** + * @dev Returns the contract's artifact from a specific task + * @param task ID of the task to look the ABI of the required contract + * @param contract Name of the contract to looking the ABI of + */ +export function getBalancerContractArtifact(task: string, contract: string): Artifact { + return require(getBalancerContractArtifactPath(task, contract)); +} + +/** + * @dev Returns the ABI for a contract from a specific task + * @param task ID of the task to look the ABI of the required contract + * @param contract Name of the contract to be fetched. + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function getBalancerContractAbi(task: string, contract: string): any[] { + const artifact = getBalancerContractArtifact(task, contract); + return artifact.abi; +} + +/** + * @deprecated + * @dev Returns the contract's creation code of for a specific task + * @param task ID of the task to look the creation code of the required contract + * @param contract Name of the contract to looking the creation code of + */ +export function getBalancerContractBytecode(task: string, contract: string): string { + const artifact = getBalancerContractArtifact(task, contract); + return artifact.bytecode; +} + +/** + * @dev Returns the contract address of a deployed contract for a specific task on a network + * @param task ID of the task looking the deployment for + * @param contract Name of the contract to fetched the address of + * @param network Name of the network looking the deployment for (e.g. mainnet, polygon, goerli, etc) + */ +export function getBalancerContractAddress(task: string, contract: string, network: string): string { + const output = getBalancerDeployment(task, network); + return output[contract]; +} + +/** + * @dev Returns the deployment output for a specific task on a network + * @param task ID of the task to look the deployment output of the required network + * @param network Name of the network looking the deployment output for (e.g. mainnet, polygon, goerli, etc) + */ +export function getBalancerDeployment(task: string, network: string): { [key: string]: string } { + return require(getBalancerDeploymentPath(task, network)); +} + +/** + * @dev Returns the path of a contract's artifact from a specific task + * @param task ID of the task to look the path of the artifact the required contract + * @param contract Name of the contract to look the path of it's creation code + */ +function getBalancerContractArtifactPath(task: string, contract: string): string { + return `@balancer-labs/v2-deployments/dist/tasks/${task}/artifact/${contract}.json`; +} + +/** + * @dev Returns the deployment path for a specific task on a network + * @param task ID of the task to look the deployment path for the required network + * @param network Name of the network looking the deployment path for (e.g. mainnet, polygon, goerli, etc) + */ +function getBalancerDeploymentPath(task: string, network: string): string { + return `@balancer-labs/v2-deployments/dist/tasks/${task}/output/${network}.json`; +} + +/** + * @dev Returns the path for the list of Balancer contract addresses on a network + * @param network Name of the network looking the deployment path for (e.g. mainnet, polygon, goerli, etc) + */ +function getBalancerContractAddresses(network: string): string { + return `@balancer-labs/v2-deployments/dist/addresses/${network}.json`; +} diff --git a/balpy/balancer-deployments/logo.svg b/balpy/balancer-deployments/logo.svg new file mode 100644 index 0000000..c7c8c67 --- /dev/null +++ b/balpy/balancer-deployments/logo.svg @@ -0,0 +1,13 @@ + + + Pebble Transparent Hi res White Copy@2x + + + + + + + + + + \ No newline at end of file diff --git a/balpy/balancer-deployments/mlc_config.json b/balpy/balancer-deployments/mlc_config.json new file mode 100644 index 0000000..7c48451 --- /dev/null +++ b/balpy/balancer-deployments/mlc_config.json @@ -0,0 +1,10 @@ +{ + "ignorePatterns": [{ + "pattern": "^https://etherscan.io" + }], + "timeout": "20s", + "retryOn429": true, + "retryCount": 5, + "fallbackRetryDelay": "30s", + "aliveStatusCodes": [200, 206] +} diff --git a/balpy/balancer-deployments/package.json b/balpy/balancer-deployments/package.json new file mode 100644 index 0000000..8d23788 --- /dev/null +++ b/balpy/balancer-deployments/package.json @@ -0,0 +1,84 @@ +{ + "name": "@balancer-labs/v2-deployments", + "version": "3.2.0", + "description": "Addresses and ABIs of all Balancer V2 deployed contracts", + "license": "GPL-3.0-only", + "homepage": "https://github.com/balancer/balancer-deployments/#readme", + "repository": { + "type": "git", + "url": "https://github.com/balancer-labs/balancer-deployments.git" + }, + "bugs": { + "url": "https://github.com/balancer-labs/balancer-deployments/issues" + }, + "main": "dist/index.js", + "module": "dist/index.esm.js", + "browser": "dist/index.umd.js", + "typings": "dist/index.d.ts", + "files": [ + "/dist/index.*", + "/dist/{addresses,tasks}/**/*" + ], + "scripts": { + "build": "yarn compile", + "compile": "tsc && hardhat compile && rm -rf artifacts/build-info", + "check": "yarn check-artifacts && yarn check-deployments", + "check-artifacts": "hardhat check-artifacts", + "check-network-deployments": "hardhat check-deployments --network", + "check-deployments": "hardhat check-deployments --network mainnet && hardhat check-deployments --network polygon && hardhat check-deployments --network arbitrum && hardhat check-deployments --network optimism && hardhat check-deployments --network goerli && hardhat check-deployments --network bsc && hardhat check-deployments --network avalanche && hardhat check-deployments --network zkevm && hardhat check-deployments --network base && hardhat check-deployments --network fantom && hardhat check-deployments --network sepolia", + "check-network-action-ids": "hardhat check-action-ids --network", + "check-action-ids": "hardhat check-action-ids --network mainnet && hardhat check-action-ids --network polygon && hardhat check-action-ids --network arbitrum && hardhat check-action-ids --network optimism && hardhat check-action-ids --network bsc && hardhat check-action-ids --network avalanche && hardhat check-action-ids --network zkevm && hardhat check-action-ids --network base && hardhat check-action-ids --network fantom && hardhat check-action-ids --network sepolia", + "extract-artifacts": "hardhat extract-artifacts", + "build-address-lookup": "hardhat build-address-lookup --network mainnet && hardhat build-address-lookup --network polygon && hardhat build-address-lookup --network arbitrum && hardhat build-address-lookup --network optimism && hardhat build-address-lookup --network gnosis && hardhat build-address-lookup --network bsc && hardhat build-address-lookup --network avalanche && hardhat build-address-lookup --network zkevm && hardhat build-address-lookup --network base && hardhat build-address-lookup --network fantom && hardhat build-address-lookup --network goerli && hardhat build-address-lookup --network sepolia", + "check-address-lookup": "hardhat check-address-lookup --network mainnet && hardhat check-address-lookup --network polygon && hardhat check-address-lookup --network arbitrum && hardhat check-address-lookup --network optimism && hardhat check-address-lookup --network gnosis && hardhat check-address-lookup --network bsc && hardhat check-address-lookup --network avalanche && hardhat check-address-lookup --network zkevm && hardhat check-address-lookup --network base && hardhat check-address-lookup --network fantom && hardhat check-address-lookup --network goerli && hardhat check-address-lookup --network sepolia", + "lint": "yarn lint:solidity && yarn lint:typescript", + "lint:solidity": "solhint 'src/helpers/contracts/**/*.sol'", + "lint:typescript": "NODE_NO_WARNINGS=1 eslint . --ext .ts --ignore-path ./.eslintignore --max-warnings 0", + "prepack": "yarn build", + "test": "yarn build && hardhat test ./tasks/**/test/*.ts", + "ci:prepare-config": "ts-node ci/prepare-config.ts" + }, + "devDependencies": { + "@balancer-labs/v2-interfaces": "latest", + "@balancer-labs/v2-solidity-utils": "^3.0.2", + "@ethersproject/contracts": "^5.0.0", + "@nomicfoundation/hardhat-network-helpers": "^1.0.6", + "@nomiclabs/hardhat-ethers": "^2.2.1", + "@nomiclabs/hardhat-etherscan": "^3.1.2", + "@nomiclabs/hardhat-vyper": "^3.0.3", + "@nomiclabs/hardhat-waffle": "^2.0.5", + "@solidity-parser/parser": "^0.14.5", + "@types/chai": "^4", + "@types/lodash": "^4.14.186", + "@types/lodash.range": "^3.2.7", + "@types/mocha": "^10", + "@types/node": "^14.14.31", + "@types/node-fetch": "^2.6.2", + "@typescript-eslint/eslint-plugin": "^5.41.0", + "@typescript-eslint/parser": "^5.41.0", + "chai": "^4.3.6", + "chalk": "^4.1.2", + "decimal.js": "^10.4.3", + "eslint": "^8.26.0", + "eslint-plugin-mocha-no-only": "^1.1.1", + "eslint-plugin-prettier": "^4.2.1", + "ethereum-waffle": "^3.4.4", + "ethereumjs-util": "^7.1.5", + "ethers": "^5.7.2", + "graphql": "^16.6.0", + "graphql-request": "^5.2.0", + "hardhat": "^2.12.5", + "hardhat-ignore-warnings": "^0.2.8", + "hardhat-local-networks-config-plugin": "^0.0.6", + "lodash.range": "^3.2.0", + "mocha": "^10.2.0", + "node-fetch": "^2.6.7", + "prettier": "^2.7.1", + "prettier-plugin-solidity": "v1.0.0-alpha.59", + "solhint": "^3.2.0", + "solhint-plugin-prettier": "^0.0.4", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.1.2", + "typescript": "^4.3.2" + } +} diff --git a/balpy/balancer-deployments/src/actionId.ts b/balpy/balancer-deployments/src/actionId.ts new file mode 100644 index 0000000..05eb188 --- /dev/null +++ b/balpy/balancer-deployments/src/actionId.ts @@ -0,0 +1,298 @@ +import { FunctionFragment, Interface } from '@ethersproject/abi'; +import { Contract } from '@ethersproject/contracts'; +import fs from 'fs'; +import { padEnd } from 'lodash'; +import path from 'path'; +import logger from './logger'; +import { request, gql } from 'graphql-request'; + +import Task, { TaskMode } from './task'; + +export const ACTION_ID_DIRECTORY = path.join(__dirname, '../action-ids'); + +export type RoleData = { + role: string; + grantee: string; + target: string; +}; + +// Define a type alias with a more meaningful name +export type ActionIdData = Record; + +export type TaskActionIds = Record; + +export type ContractActionIdData = { useAdaptor: boolean; factoryOutput?: string; actionIds: ActionIdData }; + +export type ActionIdInfo = { + taskId: string; + contractName: string; + signature: string; + useAdaptor: boolean; +}; + +interface TheGraphPermissionEntry { + id: string; + account: string; + action: { + id: string; + }; + txHash: string; +} + +function safeReadJsonFile(filePath: string): Record { + const fileExists = fs.existsSync(filePath) && fs.statSync(filePath).isFile(); + + return fileExists ? JSON.parse(fs.readFileSync(filePath).toString()) : {}; +} + +export function getTaskActionIds(task: Task): TaskActionIds { + const filePath = path.join(ACTION_ID_DIRECTORY, task.network, 'action-ids.json'); + const actionIdFileContents = safeReadJsonFile(filePath); + return actionIdFileContents[task.id]; +} + +export async function saveActionIds(task: Task, contractName: string, factoryOutput?: string): Promise { + logger.log(`Generating action IDs for ${contractName} of ${task.id}`, ''); + + const { useAdaptor, actionIds } = await getActionIds(task, contractName, factoryOutput); + + const actionIdsDir = path.join(ACTION_ID_DIRECTORY, task.network); + if (!fs.existsSync(actionIdsDir)) fs.mkdirSync(actionIdsDir, { recursive: true }); + + const filePath = path.join(actionIdsDir, 'action-ids.json'); + + // Load the existing content if any exists. + const newFileContents = safeReadJsonFile(filePath); + + // Write the new entry. + newFileContents[task.id] = newFileContents[task.id] ?? {}; + newFileContents[task.id][contractName] = { useAdaptor, factoryOutput, actionIds }; + + fs.writeFileSync(filePath, JSON.stringify(newFileContents, null, 2)); +} + +export async function checkActionIds(task: Task): Promise { + const taskActionIdData = getTaskActionIds(task); + if (taskActionIdData === undefined) return; + + for (const [contractName, actionIdData] of Object.entries(taskActionIdData)) { + const { useAdaptor: expectedUseAdaptor, actionIds: expectedActionIds } = await getActionIds( + task, + contractName, + actionIdData.factoryOutput + ); + + const adaptorUsageMatch = actionIdData.useAdaptor === expectedUseAdaptor; + const actionIdsMatch = Object.entries(expectedActionIds).every( + ([signature, expectedActionId]) => actionIdData.actionIds[signature] === expectedActionId + ); + if (adaptorUsageMatch && actionIdsMatch) { + logger.success(`Verified recorded action IDs of contract '${contractName}' of task '${task.id}'`); + } else { + throw Error( + `The recorded action IDs for '${contractName}' of task '${task.id}' does not match those calculated from onchain` + ); + } + } +} + +export function checkActionIdUniqueness(network: string): void { + const actionIdsDir = path.join(ACTION_ID_DIRECTORY, network); + + const filePath = path.join(actionIdsDir, 'action-ids.json'); + const actionIdFileContents = safeReadJsonFile(filePath); + + const duplicateActionIdsMapping = getDuplicateActionIds(actionIdFileContents); + + const expectedCollisionsFilePath = path.join(actionIdsDir, 'expected-collisions.json'); + const expectedDuplicateActionIdsMapping = safeReadJsonFile(expectedCollisionsFilePath); + + if (JSON.stringify(duplicateActionIdsMapping) === JSON.stringify(expectedDuplicateActionIdsMapping)) { + logger.success(`Verified that no contracts unexpectedly share action IDs for ${network}`); + } else { + for (const [actionId, instances] of Object.entries(duplicateActionIdsMapping)) { + if (JSON.stringify(instances) === JSON.stringify(expectedDuplicateActionIdsMapping[actionId])) { + // We expect some collisions of actionIds for cases where contracts share the same signature, + // such as those using the AuthorizerAdaptor. If the collisions *exactly* match those in the + // expected list, we can ignore them. + continue; + } + + // If there are unexpected collisions while running `save-action-ids`, this will generate detailed + // warning messages. Follow the instructions below to update the `expected-collisions` file. + logger.warn(`${instances.length} contracts share the action ID: ${actionId}`); + for (const [index, actionIdInfo] of instances.entries()) { + const prefix = ` ${index + 1}: ${actionIdInfo.contractName}::${actionIdInfo.signature}`; + logger.warn(`${padEnd(prefix, 100)}(${actionIdInfo.taskId})`); + } + } + + // Write a file called `updated-expected-collisions`, with new entries added to resolve the warnings. + // + // If there is no `expected-collisions` file for this network, simply review the new file to ensure the + // additions are valid, then rename `updated-expected-collisions` to `expected-collisions`. + // If there is already an`expected-collisions` file, check the diff, then replace the old file with this one. + // + // Never make manual changes to the `expected-collisions` file, as this might result in "unsorted" + // entries that cause `save-action-ids` to fail with no warnings. + // + // After renaming or replacing the collisions file, running `save-action-ids` again should + // produce no warnings. + fs.writeFileSync( + path.join(actionIdsDir, 'updated-expected-collisions.json'), + JSON.stringify(duplicateActionIdsMapping, null, 2) + ); + throw Error(`There exist two duplicated action IDs across two separate contracts`); + } +} + +export async function getActionIds( + task: Task, + contractName: string, + factoryOutput?: string +): Promise<{ useAdaptor: boolean; actionIds: ActionIdData }> { + const artifact = task.artifact(contractName); + + const { ignoredFunctions } = safeReadJsonFile(path.join(ACTION_ID_DIRECTORY, 'ignored-functions.json')); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const contractInterface = new Interface(artifact.abi as any); + const contractFunctions = Object.entries(contractInterface.functions) + .filter(([, func]) => ['nonpayable', 'payable'].includes(func.stateMutability)) + .filter(([, func]) => !ignoredFunctions.includes(func.format())) + .sort(([sigA], [sigB]) => (sigA < sigB ? -1 : 1)); // Sort functions alphabetically. + + const { useAdaptor, actionIdSource } = await getActionIdSource(task, contractName, factoryOutput); + const actionIds = await getActionIdsFromSource(contractFunctions, actionIdSource); + + return { useAdaptor, actionIds }; +} + +async function getActionIdSource( + task: Task, + contractName: string, + factoryOutput?: string +): Promise<{ useAdaptor: boolean; actionIdSource: Contract }> { + const artifact = task.artifact(contractName); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const contractInterface = new Interface(artifact.abi as any); + + // Not all contracts use the Authorizer directly for authentication. + // Only if it has the `getActionId` function does it use the Authorizer directly. + // Contracts without this function either are permissionless or use another method such as the AuthorizerAdaptor. + const contractIsAuthorizerAware = Object.values(contractInterface.functions).some( + (func) => func.name === 'getActionId' + ); + + if (contractIsAuthorizerAware) { + if (factoryOutput) { + await checkFactoryOutput(task, contractName, factoryOutput); + return { useAdaptor: false, actionIdSource: await task.instanceAt(contractName, factoryOutput) }; + } else { + return { useAdaptor: false, actionIdSource: await task.deployedInstance(contractName) }; + } + } else { + const adaptorTask = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY, task.network); + return { useAdaptor: true, actionIdSource: await adaptorTask.deployedInstance('AuthorizerAdaptor') }; + } +} + +async function getActionIdsFromSource( + contractFunctions: [string, FunctionFragment][], + actionIdSource: Contract +): Promise { + const functionActionIds = await Promise.all( + contractFunctions.map(async ([signature, contractFunction]) => { + const functionSelector = Interface.getSighash(contractFunction); + return [signature, await actionIdSource.getActionId(functionSelector)] as [string, string]; + }) + ); + + return Object.fromEntries(functionActionIds); +} + +function getDuplicateActionIds(actionIdFileContents: Record): Record { + // Reverse the mapping of `contractName -> signature -> actionId` to be `actionId -> [contractName, signature][]`. + // This simplifies checking for duplicate actionIds to just reading the length of the arrays. + const actionIdsMapping: Record = Object.entries(actionIdFileContents) + .flatMap(([taskId, taskData]) => + Object.entries(taskData).flatMap(([contractName, contractData]) => + Object.entries(contractData.actionIds).map<[string, ActionIdInfo]>(([signature, actionId]) => [ + actionId, + { taskId, contractName, signature, useAdaptor: contractData.useAdaptor }, + ]) + ) + ) + .reduce((acc: Record, [actionId, actionIdInfo]) => { + acc[actionId] = acc[actionId] ?? []; + acc[actionId].push(actionIdInfo); + return acc; + }, {}); + + const duplicateActionIdsMapping = Object.fromEntries( + Object.entries(actionIdsMapping).filter(([, instances]) => instances.length > 1) + ); + + return duplicateActionIdsMapping; +} + +async function checkFactoryOutput(task: Task, contractName: string, factoryOutput: string) { + // We must check that the factory output is actually an instance of the expected contract type. This is + // not trivial due to usage of immutable and lack of knowledge of constructor arguments. However, this scenario + // only arises with Pools created from factories, all of which share a useful property: their factory contract + // name is Factory, and they all have a function called 'isPoolFromFactory' we can use for this. + + const factory = await task.deployedInstance(`${contractName}Factory`); + if (!(await factory.isPoolFromFactory(factoryOutput))) { + throw Error(`The contract at ${factoryOutput} is not an instance of a ${contractName}`); + } +} + +/** Returns full info for a given actionId and network */ +export async function getActionIdInfo(actionId: string, network: string): Promise { + // read network JSON file from action-ids dir + const tasks = safeReadJsonFile(path.join(ACTION_ID_DIRECTORY, network, 'action-ids.json')); + // filter all the entries which have the same actionId + // and map them to an array of ActionIdInfo + const entries = Object.entries(tasks) + .filter(([, taskData]) => + Object.values(taskData).some((contractData) => + Object.entries(contractData.actionIds).some(([, hash]) => hash == actionId) + ) + ) + .map(([taskId, taskData]) => { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const contracts = Object.entries(taskData).filter(([, contractData]) => + Object.entries(contractData.actionIds).some(([, hash]) => hash == actionId) + )!; + return contracts.map(([contractName, contractData]) => ({ + taskId, + contractName, + useAdaptor: contractData.useAdaptor, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + signature: Object.entries(contractData.actionIds).find(([, hash]) => hash == actionId)![0], + actionId, + })); + }) + .flat(); + // we return first entry because all the collisions are verified by scripts + return entries[0]; +} + +export async function fetchTheGraphPermissions(url: string): Promise { + const query = gql` + query { + permissions { + id + account + action { + id + } + txHash + } + } + `; + + const data = await request<{ permissions: TheGraphPermissionEntry[] }>(url, query); + return data.permissions; +} diff --git a/balpy/balancer-deployments/src/artifact.ts b/balpy/balancer-deployments/src/artifact.ts new file mode 100644 index 0000000..4313eff --- /dev/null +++ b/balpy/balancer-deployments/src/artifact.ts @@ -0,0 +1,160 @@ +import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from 'fs'; +import { Artifact, CompilerOutputContract } from 'hardhat/types'; +import path from 'path'; +import logger from './logger'; +import Task from './task'; +import fs from 'fs'; + +/** + * Extracts the artifact for the matching contract. + * @param task - The task for which to extract the artifacts. + * @param file - Name of the file within `build-info` where to look for the contract. All files within `build-info` + * directory will be checked if undefined. + * @param contract - Name of the contract to match. Filename shall be used if undefined. + */ +export function extractArtifact(task: Task, file?: string, contract?: string): void { + const buildInfoDirectory = path.resolve(task.dir(), 'build-info'); + if (existsSync(buildInfoDirectory) && statSync(buildInfoDirectory).isDirectory()) { + if (file) { + _extractArtifact(task, file, contract); + } else { + for (const buildInfoFileName of readdirSync(buildInfoDirectory)) { + const fileName = path.parse(buildInfoFileName).name; + _extractArtifact(task, fileName, contract); + } + } + } +} + +function _extractArtifact(task: Task, file: string, contract?: string) { + contract = contract ?? file; + const artifact = task.artifact(contract, file); + writeContractArtifact(task, contract, artifact); + logger.success(`Artifacts created for ${contract} contract found in ${file} build-info file`); +} + +/** + * Checks that the artifact files for `task` matches what is contained in the build-info file. + * @param task - The task for which to check artifact integrity. + */ +export function checkArtifact(task: Task): void { + let readmeLines: string[] = []; + + const filePath = path.join(task.dir(), `readme.md`); + const readmeFileExists = fs.existsSync(filePath) && fs.statSync(filePath).isFile(); + if (readmeFileExists) { + const readmeContents = fs.readFileSync(filePath).toString(); + readmeLines = readmeContents.split('\n'); + } + + const buildInfoDirectory = path.resolve(task.dir(), 'build-info'); + if (existsSync(buildInfoDirectory) && statSync(buildInfoDirectory).isDirectory()) { + for (const buildInfoFileName of readdirSync(buildInfoDirectory)) { + const fileName = path.parse(buildInfoFileName).name; + const contractName = fileName; + + const expectedArtifact = task.artifact(contractName, fileName); + const actualArtifact = readContractArtifact(task, contractName); + + const artifactMatch = JSON.stringify(actualArtifact) === JSON.stringify(expectedArtifact); + if (artifactMatch) { + logger.success(`Verified artifact integrity of contract '${contractName}' of task '${task.id}'`); + + // Since this is an *artifact* check, don't fail if there is no readme at all (mixing concerns). + // If there is a readme, it must contain a link to all artifacts, though. + if (readmeFileExists) { + checkReadmeArtifactLink(task, contractName, readmeLines); + } + } else { + throw Error( + `The artifact for contract '${contractName}' of task '${task.id}' does not match the contents of its build-info` + ); + } + } + } +} + +/** + * Ensure there is a readme with the expected link to the artifact file (and no invalid ones). + */ +function checkReadmeArtifactLink(task: Task, contractName: string, readmeLines: string[]): void { + const expectedContent = `- [\`${contractName}\` artifact](./artifact/${contractName}.json)`; + const linkFound = readmeLines.find((line) => line.toLowerCase() == expectedContent.toLowerCase()) !== undefined; + + if (linkFound) { + logger.success(`Verified artifact link for contract '${contractName}' of task '${task.id}'`); + } else { + throw Error(`Missing or malformed artifact link for contract '${contractName}' of task '${task.id}'`); + } +} + +/** + * Read the saved artifact for the contract `contractName`. + */ +function readContractArtifact(task: Task, contractName: string): Artifact | null { + // Read contract ABI from file + const artifactFilePath = path.resolve(task.dir(), 'artifact', `${contractName}.json`); + const artifactFileExists = existsSync(artifactFilePath) && statSync(artifactFilePath).isFile(); + const artifact = artifactFileExists ? JSON.parse(readFileSync(artifactFilePath).toString()) : null; + + return artifact; +} + +/** + * Write the ABI and bytecode for the contract `contractName` to the ABI and bytecode files. + */ +function writeContractArtifact(task: Task, contractName: string, artifact: Artifact): void { + const artifactDirectory = path.resolve(task.dir(), 'artifact'); + if (!existsSync(artifactDirectory)) { + mkdirSync(artifactDirectory); + } + const abiFilePath = path.resolve(artifactDirectory, `${contractName}.json`); + writeFileSync(abiFilePath, JSON.stringify(artifact, null, 2)); +} + +// The code below is copied from the `hardhat-core` package +// https://github.com/NomicFoundation/hardhat/blob/080a25a7e188311d7e56366e1dae669db81aa2d7/packages/hardhat-core/src/internal/artifacts.ts#L870-L918 + +const ARTIFACT_FORMAT_VERSION = 'hh-sol-artifact-1'; + +/** + * Retrieves an artifact for the given `contractName` from the compilation output. + * + * @param sourceName The contract's source name. + * @param contractName the contract's name. + * @param contractOutput the contract's compilation output as emitted by `solc`. + */ +export function getArtifactFromContractOutput( + sourceName: string, + contractName: string, + contractOutput: CompilerOutputContract +): Artifact { + const evmBytecode = contractOutput.evm && contractOutput.evm.bytecode; + let bytecode: string = evmBytecode && evmBytecode.object ? evmBytecode.object : ''; + + if (bytecode.slice(0, 2).toLowerCase() !== '0x') { + bytecode = `0x${bytecode}`; + } + + const evmDeployedBytecode = contractOutput.evm && contractOutput.evm.deployedBytecode; + let deployedBytecode: string = evmDeployedBytecode && evmDeployedBytecode.object ? evmDeployedBytecode.object : ''; + + if (deployedBytecode.slice(0, 2).toLowerCase() !== '0x') { + deployedBytecode = `0x${deployedBytecode}`; + } + + const linkReferences = evmBytecode && evmBytecode.linkReferences ? evmBytecode.linkReferences : {}; + const deployedLinkReferences = + evmDeployedBytecode && evmDeployedBytecode.linkReferences ? evmDeployedBytecode.linkReferences : {}; + + return { + _format: ARTIFACT_FORMAT_VERSION, + contractName, + sourceName, + abi: contractOutput.abi, + bytecode, + deployedBytecode, + linkReferences, + deployedLinkReferences, + }; +} diff --git a/balpy/balancer-deployments/src/buildinfo.ts b/balpy/balancer-deployments/src/buildinfo.ts new file mode 100644 index 0000000..d8bebf4 --- /dev/null +++ b/balpy/balancer-deployments/src/buildinfo.ts @@ -0,0 +1,19 @@ +import { BuildInfo } from 'hardhat/types'; + +export function findContractSourceName(buildInfo: BuildInfo, contractName: string): string { + const names = getAllFullyQualifiedNames(buildInfo); + const contractMatches = names.filter((name) => name.contractName === contractName); + if (contractMatches.length === 0) + throw Error(`Could not find a source file for the requested contract ${contractName}`); + if (contractMatches.length > 1) throw Error(`More than one source file was found to match ${contractName}`); + return contractMatches[0].sourceName; +} + +export function getAllFullyQualifiedNames(buildInfo: BuildInfo): Array<{ sourceName: string; contractName: string }> { + const contracts = buildInfo.output.contracts; + return Object.keys(contracts).reduce((names: { sourceName: string; contractName: string }[], sourceName) => { + const contractsNames = Object.keys(contracts[sourceName]); + const qualifiedNames = contractsNames.map((contractName) => ({ sourceName, contractName })); + return names.concat(qualifiedNames); + }, []); +} diff --git a/balpy/balancer-deployments/src/contracts.ts b/balpy/balancer-deployments/src/contracts.ts new file mode 100644 index 0000000..7e81932 --- /dev/null +++ b/balpy/balancer-deployments/src/contracts.ts @@ -0,0 +1,57 @@ +import { Contract } from 'ethers'; +import { Artifacts } from 'hardhat/internal/artifacts'; + +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; + +import { getSigner } from './signers'; +import { Artifact, Libraries, Param } from './types'; +import path from 'path'; +import * as Config from '../hardhat.config'; + +export async function deploy( + contract: Artifact | string, + args: Array = [], + from?: SignerWithAddress, + libs?: Libraries +): Promise { + if (!args) args = []; + if (!from) from = await getSigner(); + + const artifact: Artifact = typeof contract === 'string' ? getArtifact(contract) : contract; + + const { ethers } = await import('hardhat'); + const factory = await ethers.getContractFactoryFromArtifact(artifact, { libraries: libs }); + const deployment = await factory.connect(from).deploy(...args); + return deployment.deployed(); +} + +export async function instanceAt(contract: Artifact | string, address: string): Promise { + const artifact: Artifact = typeof contract === 'string' ? getArtifact(contract) : contract; + + const { ethers } = await import('hardhat'); + return ethers.getContractAt(artifact.abi, address); +} + +export async function deploymentTxData(artifact: Artifact, args: Array = [], libs?: Libraries): Promise { + const { ethers } = await import('hardhat'); + const factory = await ethers.getContractFactoryFromArtifact(artifact, { libraries: libs }); + + const { data } = factory.getDeployTransaction(...args); + if (data === undefined) throw new Error('Deploy transaction with no data. Something is very wrong'); + + return data.toString(); +} + +export function getArtifact(contract: string): Artifact { + let artifactsPath: string; + if (!contract.includes('/')) { + artifactsPath = path.resolve(Config.default.paths.artifacts); + } else { + const packageName = `@balancer-labs/${contract.split('/')[0]}`; + const packagePath = path.dirname(require.resolve(`${packageName}/package.json`)); + artifactsPath = `${packagePath}/artifacts`; + } + + const artifacts = new Artifacts(artifactsPath); + return artifacts.readArtifactSync(contract.split('/').slice(-1)[0]); +} diff --git a/balpy/balancer-deployments/src/forkTests.ts b/balpy/balancer-deployments/src/forkTests.ts new file mode 100644 index 0000000..2f954a1 --- /dev/null +++ b/balpy/balancer-deployments/src/forkTests.ts @@ -0,0 +1,42 @@ +import hre from 'hardhat'; + +import { HttpNetworkConfig, HardhatNetworkConfig } from 'hardhat/types'; +import { Network } from './types'; + +export function describeForkTest(name: string, forkNetwork: Network, blockNumber: number, callback: () => void): void { + describe(name, () => { + _describeBody(forkNetwork, blockNumber, callback); + }); +} + +describeForkTest.only = function (name: string, forkNetwork: Network, blockNumber: number, callback: () => void): void { + // eslint-disable-next-line mocha-no-only/mocha-no-only + describe.only(name, () => { + _describeBody(forkNetwork, blockNumber, callback); + }); +}; + +describeForkTest.skip = function (name: string, forkNetwork: Network, blockNumber: number, callback: () => void): void { + describe.skip(name, () => { + _describeBody(forkNetwork, blockNumber, callback); + }); +}; + +function _describeBody(forkNetwork: Network, blockNumber: number, callback: () => void) { + before('setup fork test', async () => { + const forkingNetworkName = Object.keys(hre.config.networks).find((networkName) => networkName === forkNetwork); + if (!forkingNetworkName) throw Error(`Could not find a config for network ${forkNetwork} to be forked`); + + const forkingNetworkConfig = hre.config.networks[forkingNetworkName] as HttpNetworkConfig; + if (!forkingNetworkConfig.url) throw Error(`Could not find a RPC url in network config for ${forkingNetworkName}`); + + await hre.network.provider.request({ + method: 'hardhat_reset', + params: [{ forking: { jsonRpcUrl: forkingNetworkConfig.url, blockNumber } }], + }); + + const config = hre.network.config as HardhatNetworkConfig; + config.forking = { enabled: true, blockNumber, url: forkingNetworkConfig.url, httpHeaders: {} }; + }); + callback(); +} diff --git a/balpy/balancer-deployments/src/helpers/constants.ts b/balpy/balancer-deployments/src/helpers/constants.ts new file mode 100644 index 0000000..97e5d06 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/constants.ts @@ -0,0 +1,32 @@ +import { BigNumber, ethers } from 'ethers'; +import { maxUint, maxInt, minInt } from './numbers'; + +export const MAX_UINT256: BigNumber = maxUint(256); +export const MAX_UINT112: BigNumber = maxUint(112); +export const MAX_UINT96: BigNumber = maxUint(96); +export const MAX_UINT10: BigNumber = maxUint(10); +export const MAX_UINT31: BigNumber = maxUint(31); +export const MAX_UINT32: BigNumber = maxUint(32); +export const MAX_UINT64: BigNumber = maxUint(64); + +export const MIN_INT22: BigNumber = minInt(22); +export const MAX_INT22: BigNumber = maxInt(22); +export const MIN_INT53: BigNumber = minInt(53); +export const MAX_INT53: BigNumber = maxInt(53); +export const MIN_INT256: BigNumber = minInt(256); +export const MAX_INT256: BigNumber = maxInt(256); + +export const ANY_ADDRESS = '0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF'; +export const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'; +export const ZERO_BYTES32 = '0x0000000000000000000000000000000000000000000000000000000000000000'; +export const ONES_BYTES32 = '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'; + +export const MAX_GAS_LIMIT = 8e6; +export const MAX_WEIGHTED_TOKENS = 100; + +export const DELEGATE_OWNER = '0xBA1BA1ba1BA1bA1bA1Ba1BA1ba1BA1bA1ba1ba1B'; + +// This is not quite a constant, but it fits here given we also have ZERO_ADDRESS, etc. +export function randomAddress(): string { + return ethers.Wallet.createRandom().address; +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/ILayerZeroBALProxy.sol b/balpy/balancer-deployments/src/helpers/contracts/ILayerZeroBALProxy.sol new file mode 100644 index 0000000..184e6d7 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/ILayerZeroBALProxy.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +/** + * @dev Partial interface for LayerZero BAL proxy. + */ +interface ILayerZeroBALProxy { + /// @dev Emitted when `_amount` tokens are moved from the sender `_from` to (`_dstChainId`, `_toAddress`) + event SendToChain(uint16 indexed _dstChainId, address indexed _from, bytes32 indexed _toAddress, uint256 _amount); + + function owner() external view returns (address); + + function setUseCustomAdapterParams(bool) external; +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/MaliciousQueryReverter.sol b/balpy/balancer-deployments/src/helpers/contracts/MaliciousQueryReverter.sol new file mode 100644 index 0000000..93dd84a --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/MaliciousQueryReverter.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; + +contract MaliciousQueryReverter { + enum RevertType { DoNotRevert, NonMalicious, MaliciousSwapQuery, MaliciousJoinExitQuery } + + RevertType public revertType = RevertType.DoNotRevert; + + function setRevertType(RevertType newRevertType) external { + revertType = newRevertType; + } + + function maybeRevertMaliciously() public view { + if (revertType == RevertType.NonMalicious) { + revert("NON_MALICIOUS_REVERT"); + } else if (revertType == RevertType.MaliciousSwapQuery) { + spoofSwapQueryRevert(); + } else if (revertType == RevertType.MaliciousJoinExitQuery) { + spoofJoinExitQueryRevert(); + } + } + + function spoofJoinExitQueryRevert() public pure { + uint256[] memory tokenAmounts = new uint256[](2); + tokenAmounts[0] = 1; + tokenAmounts[1] = 2; + + uint256 bptAmount = 420; + + // solhint-disable-next-line no-inline-assembly + assembly { + // We will return a raw representation of `bptAmount` and `tokenAmounts` in memory, which is composed of + // a 32-byte uint256, followed by a 32-byte for the array length, and finally the 32-byte uint256 values + // Because revert expects a size in bytes, we multiply the array length (stored at `tokenAmounts`) by 32 + let size := mul(mload(tokenAmounts), 32) + + // We store the `bptAmount` in the previous slot to the `tokenAmounts` array. We can make sure there + // will be at least one available slot due to how the memory scratch space works. + // We can safely overwrite whatever is stored in this slot as we will revert immediately after that. + let start := sub(tokenAmounts, 0x20) + mstore(start, bptAmount) + + // We send one extra value for the error signature "QueryError(uint256,uint256[])" which is 0x43adbafb + // We use the previous slot to `bptAmount`. + mstore(sub(start, 0x20), 0x0000000000000000000000000000000000000000000000000000000043adbafb) + start := sub(start, 0x04) + + // When copying from `tokenAmounts` into returndata, we copy the additional 68 bytes to also return + // the `bptAmount`, the array's length, and the error signature. + revert(start, add(size, 68)) + } + } + + function spoofSwapQueryRevert() public pure { + int256[] memory deltas = new int256[](2); + deltas[0] = 1; + deltas[1] = 2; + + // solhint-disable-next-line no-inline-assembly + assembly { + // We will return a raw representation of the array in memory, which is composed of a 32 byte length, + // followed by the 32 byte int256 values. Because revert expects a size in bytes, we multiply the array + // length (stored at `deltas`) by 32. + let size := mul(mload(deltas), 32) + + // We send one extra value for the error signature "QueryError(int256[])" which is 0xfa61cc12. + // We store it in the previous slot to the `deltas` array. We know there will be at least one available + // slot due to how the memory scratch space works. + // We can safely overwrite whatever is stored in this slot as we will revert immediately after that. + mstore(sub(deltas, 0x20), 0x00000000000000000000000000000000000000000000000000000000fa61cc12) + let start := sub(deltas, 0x04) + + // When copying from `deltas` into returndata, we copy an additional 36 bytes to also return the array's + // length and the error signature. + revert(start, add(size, 36)) + } + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/MockAaveLendingPool.sol b/balpy/balancer-deployments/src/helpers/contracts/MockAaveLendingPool.sol new file mode 100644 index 0000000..bc8261c --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/MockAaveLendingPool.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; + +import "./MaliciousQueryReverter.sol"; + +import "./TestToken.sol"; + +contract MockAaveLendingPool is MaliciousQueryReverter { + uint256 private _rate = 1e27; + + function getReserveNormalizedIncome(address) external view returns (uint256) { + maybeRevertMaliciously(); + return _rate; + } + + function setReserveNormalizedIncome(uint256 newRate) external { + _rate = newRate; + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/MockBaseSilo.sol b/balpy/balancer-deployments/src/helpers/contracts/MockBaseSilo.sol new file mode 100644 index 0000000..1a2c55b --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/MockBaseSilo.sol @@ -0,0 +1,178 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +import "@balancer-labs/v2-solidity-utils/contracts/openzeppelin/ERC20.sol"; + +import "./MaliciousQueryReverter.sol"; + +interface IBaseSilo { + enum AssetStatus { Undefined, Active, Removed } + + /// Storage struct that holds all required data for a single token market + struct AssetStorage { + // Token that represents a share in totalDeposits of Silo + address collateralToken; + // Token that represents a share in collateralOnlyDeposits of Silo + address collateralOnlyToken; + // Token that represents a share in totalBorrowAmount of Silo + address debtToken; + // COLLATERAL: Amount of asset token that has been deposited to Silo with interest earned by depositors. + // It also includes token amount that has been borrowed. + uint256 totalDeposits; + // COLLATERAL ONLY: Amount of asset token that has been deposited to Silo that can be ONLY used + // as collateral. These deposits do NOT earn interest and CANNOT be borrowed. + uint256 collateralOnlyDeposits; + // DEBT: Amount of asset token that has been borrowed with accrued interest. + uint256 totalBorrowAmount; + } + + /// @dev Storage struct that holds data related to fees and interest + struct AssetInterestData { + // Total amount of already harvested protocol fees + uint256 harvestedProtocolFees; + // Total amount (ever growing) of asset token that has been earned by the protocol from + // generated interest. + uint256 protocolFees; + // Timestamp of the last time `interestRate` has been updated in storage. + uint64 interestRateTimestamp; + // True if asset was removed from the protocol. If so, deposit and borrow functions are disabled + // for that asset + AssetStatus status; + } + + /** + * @dev returns the asset storage struct + * @dev AssetStorage struct contains necessary information for calculating shareToken exchange rates + */ + function assetStorage(address _asset) external view returns (AssetStorage memory); + + /** + * @dev returns the interest data struct + * @dev Interest data struct helps us update necessary asset storage data closer to the time that it is + * updated on Silo's protocol during deposits and withdraws + */ + function interestData(address _asset) external view returns (AssetInterestData memory); + + /// @notice Get Silo Repository contract address + /// @return Silo Repository contract address + function siloRepository() external view returns (address); +} + +interface ISilo is IBaseSilo { + /** + * @dev Deposits funds into the Silo + * @param _asset The address of the token to withdraw + * @param _amount The amount of the token to withdraw + * @param _collateralOnly: True means your shareToken is protected (cannot be swapped for interest) + */ + function deposit( + address _asset, + uint256 _amount, + bool _collateralOnly + ) external returns (uint256 collateralAmount, uint256 collateralShare); + + /** + * @dev Withdraws funds from the Silo + * @param _asset The address of the token to withdraw + * @param _amount The amount of the token to withdraw + * @param _collateralOnly: True means your shareToken is protected (cannot be swapped for interest) + */ + function withdraw( + address _asset, + uint256 _amount, + bool _collateralOnly + ) external returns (uint256 withdrawnAmount, uint256 withdrawnShare); +} + +contract MockBaseSilo is MaliciousQueryReverter { + // asset address for which Silo was created + address private immutable _siloAsset; + + address private immutable _siloRepository; + + /// @dev asset => AssetStorage + mapping(address => IBaseSilo.AssetStorage) private _assetStorage; + + /// @dev asset => AssetInterestData + mapping(address => IBaseSilo.AssetInterestData) private _interestData; + + constructor(address siloRepository, address siloAsset) { + _siloRepository = siloRepository; + _siloAsset = siloAsset; + } + + function assetStorage(address _asset) external view returns (IBaseSilo.AssetStorage memory) { + maybeRevertMaliciously(); + IBaseSilo.AssetStorage memory assetMapping = _assetStorage[_asset]; + return assetMapping; + } + + function interestData(address _asset) external view returns (IBaseSilo.AssetInterestData memory) { + maybeRevertMaliciously(); + return _interestData[_asset]; + } + + function siloAsset() external view returns (address) { + maybeRevertMaliciously(); + return _siloAsset; + } + + function siloRepository() external view returns (address) { + maybeRevertMaliciously(); + return _siloRepository; + } + + function setAssetStorage( + address interestBearingAsset, + address collateralToken, + address collateralOnlyToken, + address debtToken, + uint256 totalDeposits, + uint256 collateralOnlyDeposits, + uint256 totalBorrowAmount + ) external { + maybeRevertMaliciously(); + IBaseSilo.AssetStorage memory storageValue = IBaseSilo.AssetStorage( + collateralToken, + collateralOnlyToken, + debtToken, + totalDeposits, + collateralOnlyDeposits, + totalBorrowAmount + ); + + _assetStorage[interestBearingAsset] = storageValue; + } + + function setInterestData( + address interestBearingAsset, + uint256 harvestedProtocolFees, + uint256 protocolFees, + uint64 interestRateTimestamp, + IBaseSilo.AssetStatus status + ) external { + maybeRevertMaliciously(); + IBaseSilo.AssetInterestData memory interestValue = IBaseSilo.AssetInterestData( + harvestedProtocolFees, + protocolFees, + interestRateTimestamp, + status + ); + + _interestData[interestBearingAsset] = interestValue; + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/MockERC4626Token.sol b/balpy/balancer-deployments/src/helpers/contracts/MockERC4626Token.sol new file mode 100644 index 0000000..4056dd4 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/MockERC4626Token.sol @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; + +import "@balancer-labs/v2-interfaces/contracts/pool-linear/IERC4626.sol"; +import "./MaliciousQueryReverter.sol"; + +import "./TestToken.sol"; +import "@balancer-labs/v2-solidity-utils/contracts/math/FixedPoint.sol"; +import "@balancer-labs/v2-solidity-utils/contracts/math/Math.sol"; + +contract MockERC4626Token is TestToken, IERC4626, MaliciousQueryReverter { + using FixedPoint for uint256; + + // rate of assets per share scaled to 1e18 + uint256 private _rate = 1e18; + uint256 private _scaleAssetsToFP; + uint256 private _scaleSharesToFP; + uint256 private _totalAssets; + address private immutable _asset; + + constructor( + string memory name, + string memory symbol, + uint8 decimals, + address asset + ) TestToken(name, symbol, decimals) { + _asset = asset; + + uint256 assetDecimals = TestToken(asset).decimals(); + uint256 assetDecimalsDifference = Math.sub(18, assetDecimals); + _scaleAssetsToFP = FixedPoint.ONE * 10**assetDecimalsDifference; + + uint256 shareDecimalsDifference = Math.sub(18, uint256(decimals)); + _scaleSharesToFP = FixedPoint.ONE * 10**shareDecimalsDifference; + } + + function setRate(uint256 newRate) external { + _rate = newRate; + } + + function totalAssets() external view override returns (uint256) { + return _totalAssets; + } + + function asset() external view override returns (address) { + return _asset; + } + + function convertToAssets(uint256 shares) external view override returns (uint256) { + return _convertToAssets(shares); + } + + function convertToShares(uint256 assets) external view override returns (uint256) { + return _convertToShares(assets); + } + + function deposit(uint256 assets, address receiver) external override returns (uint256) { + uint256 shares = _convertToShares(assets); + _mint(receiver, shares); + _totalAssets = _totalAssets.add(assets); + return shares; + } + + function redeem( + uint256 shares, + address, + address owner + ) external override returns (uint256) { + uint256 assets = _convertToAssets(shares); + _burn(owner, shares); + _totalAssets = _totalAssets.sub(assets); + return assets; + } + + function previewMint(uint256 shares) external view override returns (uint256) { + maybeRevertMaliciously(); + uint256 assetsInShareDecimals = shares.divDown(_rate); + uint256 assets = assetsInShareDecimals.mulDown(_scaleSharesToFP).divUp(_scaleAssetsToFP); + return assets; + } + + function _convertToAssets(uint256 shares) private view returns (uint256) { + maybeRevertMaliciously(); + uint256 assetsInShareDecimals = shares.mulDown(_rate); + uint256 assets = assetsInShareDecimals.mulDown(_scaleSharesToFP).divDown(_scaleAssetsToFP); + return assets; + } + + function _convertToShares(uint256 assets) private view returns (uint256) { + maybeRevertMaliciously(); + uint256 sharesInAssetDecimals = assets.divDown(_rate); + uint256 shares = sharesInAssetDecimals.mulDown(_scaleAssetsToFP).divDown(_scaleSharesToFP); + return shares; + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/MockEulerToken.sol b/balpy/balancer-deployments/src/helpers/contracts/MockEulerToken.sol new file mode 100644 index 0000000..16ba6f2 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/MockEulerToken.sol @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; + +// has many ERC20 and additional functions +import "./MaliciousQueryReverter.sol"; +import "./TestToken.sol"; + +contract MockEulerToken is TestToken, MaliciousQueryReverter { + // from Euler docs: + // in order to invest an asset to earn interest, you need to `deposit` into an eToken + + // Since the LinearPool deposits into Euler it could technically also borrow? but this would lock + // liquidity of the LinearPool + + // since this contracts is a TestToken is already has the approve method. Meaning, the caller + // can approve the MockEulerToken + + // TestToken already has approve. Meaning: Euler Market + // is able to transfer tokens from the vault + + uint256 public exchangeRateMultiplier; + + // solhint-disable-next-line var-name-mixedcase + address public immutable ASSET; + + constructor( + string memory name, + string memory symbol, + uint8 decimals, + address asset + ) TestToken(name, symbol, decimals) { + exchangeRateMultiplier = 1; + ASSET = asset; + } + + function convertBalanceToUnderlying(uint256 balance) external view returns (uint256) { + maybeRevertMaliciously(); + return balance * exchangeRateMultiplier; + } + + function setExchangeRateMultiplier(uint256 _exchangeRateMultiplier) external { + require(_exchangeRateMultiplier < 3, "Cannot set exchangeRateMultiplier bigger 3"); + exchangeRateMultiplier = _exchangeRateMultiplier; + } + + function underlyingAsset() external view returns (address) { + return ASSET; + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/MockGearboxDieselToken.sol b/balpy/balancer-deployments/src/helpers/contracts/MockGearboxDieselToken.sol new file mode 100644 index 0000000..e062b65 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/MockGearboxDieselToken.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; + +import "./TestToken.sol"; + +contract MockGearboxDieselToken is TestToken { + address private immutable _gearboxVault; + + constructor( + string memory name, + string memory symbol, + uint8 decimals, + address gearboxVaultAddress + ) TestToken(name, symbol, decimals) { + _gearboxVault = gearboxVaultAddress; + } + + function owner() external view returns (address) { + return address(_gearboxVault); + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/MockGearboxVault.sol b/balpy/balancer-deployments/src/helpers/contracts/MockGearboxVault.sol new file mode 100644 index 0000000..62b6cbc --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/MockGearboxVault.sol @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; + +import "./MaliciousQueryReverter.sol"; +import "@balancer-labs/v2-solidity-utils/contracts/math/FixedPoint.sol"; + +contract MockGearboxVault is MaliciousQueryReverter { + using FixedPoint for uint256; + + address private immutable _asset; + uint256 private _rate = 1e27; + + constructor(address underlyingAsset) { + _asset = underlyingAsset; + } + + function underlyingToken() external view returns (address) { + return _asset; + } + + // solhint-disable-next-line func-name-mixedcase + function getDieselRate_RAY() external view returns (uint256) { + maybeRevertMaliciously(); + return _rate; + } + + function setRate(uint256 rate) external { + _rate = rate; + } + + function fromDiesel(uint256 amountDiesel) external view returns (uint256) { + return amountDiesel.mulDown(_rate) / 10**9; + } + + function addLiquidity( + uint256, + address, + uint256 + ) external pure { + // solhint-disable-previous-line no-empty-blocks + } + + function removeLiquidity(uint256, address) external pure { + // solhint-disable-previous-line no-empty-blocks + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/MockInterestRateModel.sol b/balpy/balancer-deployments/src/helpers/contracts/MockInterestRateModel.sol new file mode 100644 index 0000000..7dfa367 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/MockInterestRateModel.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +import "./MaliciousQueryReverter.sol"; + +contract MockInterestRateModel is MaliciousQueryReverter { + uint256 private _rcomp; + uint256 private _rcur; + + constructor(uint256 comp, uint256 cur) { + _rcomp = comp; + _rcur = cur; + } + + function getCompoundInterestRate( + address, /* _silo */ + address, /* _asset */ + uint256 /* _blockTimestamp */ + ) external view returns (uint256 rcomp) { + maybeRevertMaliciously(); + return _rcomp; + } + + function getCurrentInterestRate( + address, /* _silo */ + address, /* _asset */ + uint256 /* _blockTimestamp */ + ) external view returns (uint256 rcur) { + return _rcur; + } + + function setCompoundInterestRate(uint256 rate) external { + maybeRevertMaliciously(); + _rcomp = rate; + } + + function setCurrentInterestRate(uint256 rate) external { + maybeRevertMaliciously(); + _rcur = rate; + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/MockL2VotingEscrow.sol b/balpy/balancer-deployments/src/helpers/contracts/MockL2VotingEscrow.sol new file mode 100644 index 0000000..a5e33a7 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/MockL2VotingEscrow.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; + +import "@balancer-labs/v2-interfaces/contracts/solidity-utils/openzeppelin/IERC20.sol"; +import "@balancer-labs/v2-interfaces/contracts/solidity-utils/helpers/BalancerErrors.sol"; + +contract MockL2VotingEscrow is IERC20 { + mapping(address => uint256) private _balances; + uint256 private _totalSupply; + + function totalSupply() external view override returns (uint256) { + return _totalSupply; + } + + function balanceOf(address user) external view override returns (uint256) { + return _balances[user]; + } + + // solhint-disable-next-line func-name-mixedcase + function adjusted_balance_of(address user) external view returns (uint256) { + return _balances[user]; + } + + function allowance(address, address user) external view override returns (uint256) { + return _balances[user]; + } + + function approve(address, uint256) external pure override returns (bool) { + _revert(Errors.UNIMPLEMENTED); + } + + function transfer(address, uint256) external pure override returns (bool) { + _revert(Errors.UNIMPLEMENTED); + } + + // solhint-disable-next-line func-name-mixedcase + function create_lock(uint256 value, uint256) external { + // Note that we don't do any time decay here + _balances[msg.sender] += value; + _totalSupply += value; + } + + function transferFrom( + address, + address, + uint256 + ) external pure override returns (bool) { + _revert(Errors.UNIMPLEMENTED); + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/MockOmniVotingEscrow.sol b/balpy/balancer-deployments/src/helpers/contracts/MockOmniVotingEscrow.sol new file mode 100644 index 0000000..6b63049 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/MockOmniVotingEscrow.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +contract MockOmniVotingEscrow { + event SendUserBalance(address user, uint16 chainId, address refundAddress); + + uint256 private _nativeFee; + uint256 private _zroFee; + + function estimateSendUserBalance( + uint16, + bool, + bytes calldata + ) external view returns (uint256 nativeFee, uint256 zroFee) { + return (_nativeFee, _zroFee); + } + + // solhint-disable no-unused-vars + function sendUserBalance( + address _user, + uint16 _dstChainId, + address payable _refundAddress, + address, + bytes memory + ) external payable { + emit SendUserBalance(_user, _dstChainId, _refundAddress); + } + + function setNativeFee(uint256 nativeFee) external { + _nativeFee = nativeFee; + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/MockRateProvider.sol b/balpy/balancer-deployments/src/helpers/contracts/MockRateProvider.sol new file mode 100644 index 0000000..2eeb5ba --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/MockRateProvider.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; + +import "@balancer-labs/v2-interfaces/contracts/pool-utils/IRateProvider.sol"; + +contract MockRateProvider is IRateProvider { + function getRate() external pure override returns (uint256) { + return 1e18; + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/MockShareToken.sol b/balpy/balancer-deployments/src/helpers/contracts/MockShareToken.sol new file mode 100644 index 0000000..798e54f --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/MockShareToken.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see .pragma solidity ^0.7.0; +pragma solidity ^0.7.0; + +import "./MaliciousQueryReverter.sol"; +import "./TestToken.sol"; + +contract MockShareToken is TestToken, MaliciousQueryReverter { + address private immutable _silo; + address private immutable _asset; + uint256 private _supply; + + /// @dev Token is always deployed for specific Silo and asset + /// @param name token name + /// @param symbol token symbol + /// @param silo Silo address for which tokens was deployed + /// @param asset asset for which this tokens was deployed + constructor( + string memory name, + string memory symbol, + address silo, + address asset, + uint8 decimals + ) TestToken(name, symbol, decimals) { + _silo = address(silo); + _asset = asset; + } + + function asset() external view returns (address) { + maybeRevertMaliciously(); + return _asset; + } + + function silo() external view returns (address) { + maybeRevertMaliciously(); + return _silo; + } + + function totalSupply() public view override returns (uint256) { + maybeRevertMaliciously(); + return _supply; + } + + function setTotalSupply(uint256 supply) public { + _supply = supply; + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/MockSilo.sol b/balpy/balancer-deployments/src/helpers/contracts/MockSilo.sol new file mode 100644 index 0000000..34d1913 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/MockSilo.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +import "./MockBaseSilo.sol"; + +contract MockSilo is MockBaseSilo { + constructor(address _siloRepository, address _siloAsset) MockBaseSilo(_siloRepository, _siloAsset) { + // solhint-disable-previous-line no-empty-blocks + } + + function deposit( + address, /* _asset */ + uint256, /* _amount */ + bool /* _collateralOnly */ + ) external pure returns (uint256 collateralAmount, uint256 collateralShare) { + return (0, 0); + } + + function withdraw( + address, /* _asset */ + uint256, /* _amount */ + bool /* _collateralOnly */ + ) external pure returns (uint256 withdrawnAmount, uint256 withdrawnShare) { + return (0, 0); + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/MockSiloRepository.sol b/balpy/balancer-deployments/src/helpers/contracts/MockSiloRepository.sol new file mode 100644 index 0000000..d433e5b --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/MockSiloRepository.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +import "./MockInterestRateModel.sol"; +import "./MaliciousQueryReverter.sol"; + +contract MockSiloRepository is MaliciousQueryReverter { + uint256 private _protocolShareFee; + MockInterestRateModel private immutable _mockModel; + + constructor(uint256 compoundRate, uint256 currentRate) { + _mockModel = new MockInterestRateModel(compoundRate, currentRate); + } + + function getInterestRateModel( + address, /* silo */ + address /* asset */ + ) external view returns (address) { + maybeRevertMaliciously(); + return address(_mockModel); + } + + function protocolShareFee() external view returns (uint256) { + maybeRevertMaliciously(); + return _protocolShareFee; + } + + function setProtocolShareFee(uint256 shareFee) external { + _protocolShareFee = shareFee; + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/MockStaticAToken.sol b/balpy/balancer-deployments/src/helpers/contracts/MockStaticAToken.sol new file mode 100644 index 0000000..0fadb62 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/MockStaticAToken.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; + +import "./TestToken.sol"; + +contract MockStaticAToken is TestToken { + // solhint-disable-next-line var-name-mixedcase + address private immutable _ASSET; + address private immutable _lendingPool; + + constructor( + string memory name, + string memory symbol, + uint8 decimals, + address underlyingAsset, + address lendingPool + ) TestToken(name, symbol, decimals) { + _ASSET = underlyingAsset; + _lendingPool = lendingPool; + } + + // solhint-disable-next-line func-name-mixedcase + function ASSET() external view returns (address) { + return _ASSET; + } + + // solhint-disable-next-line func-name-mixedcase + function LENDING_POOL() external view returns (address) { + return _lendingPool; + } + + function rate() external pure returns (uint256) { + revert("Should not call this"); + } + + function deposit( + address, + uint256, + uint16, + bool + ) external pure returns (uint256) { + return 0; + } + + function withdraw( + address, + uint256, + bool + ) external pure returns (uint256, uint256) { + return (0, 0); + } + + function staticToDynamicAmount(uint256 amount) external pure returns (uint256) { + return amount; + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/MockVE.sol b/balpy/balancer-deployments/src/helpers/contracts/MockVE.sol new file mode 100644 index 0000000..155b460 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/MockVE.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; + +import "./TestToken.sol"; + +// For compatibility, we're keeping the same function names as in the original Curve code, including the mixed-case +// naming convention. +// solhint-disable var-name-mixedcase + +contract MockVE is TestToken { + mapping(address => uint256) public locked__end; + + constructor() TestToken("Mock Bridged VE", "mveBAL", 18) { + // solhint-disable-previous-line no-empty-blocks + } + + function setLockedEnd(address user, uint256 end) external { + locked__end[user] = end; + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/MockVeDelegation.sol b/balpy/balancer-deployments/src/helpers/contracts/MockVeDelegation.sol new file mode 100644 index 0000000..43059e5 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/MockVeDelegation.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; + +import "@balancer-labs/v2-interfaces/contracts/liquidity-mining/IVeDelegation.sol"; +import "./TestToken.sol"; + +// For compatibility, we're keeping the same function names as in the original Curve code, including the mixed-case +// naming convention. +// solhint-disable func-name-mixedcase + +contract MockVeDelegation is IVeDelegation, TestToken { + constructor() TestToken("Mock VE delegation", "dveBAL", 18) { + // solhint-disable-previous-line no-empty-blocks + } + + function adjusted_balance_of(address user) external view override returns (uint256) { + return balanceOf(user); + } + + function totalSupply() public view override(ERC20, IVeDelegation) returns (uint256) { + return ERC20.totalSupply(); + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/MockYearnTokenVault.sol b/balpy/balancer-deployments/src/helpers/contracts/MockYearnTokenVault.sol new file mode 100644 index 0000000..11aa302 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/MockYearnTokenVault.sol @@ -0,0 +1,104 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; + +import "./MaliciousQueryReverter.sol"; +import "./TestToken.sol"; + +//we're unable to implement IYearnTokenVault because it defines the decimals function, which collides with +//the TestToken ERC20 implementation +contract MockYearnTokenVault is TestToken, MaliciousQueryReverter { + address private immutable _token; + + uint256 private _lastReport; + uint256 private _lockedProfit; + uint256 private _lockedProfitDegradation; + uint256 private _totalAssets; + + constructor( + string memory name, + string memory symbol, + uint8 decimals, + address underlyingAsset + ) TestToken(name, symbol, decimals) { + _token = underlyingAsset; + _lockedProfitDegradation = 1e18; + } + + function token() external view returns (address) { + return _token; + } + + function pricePerShare() public view returns (uint256) { + maybeRevertMaliciously(); + + uint256 supply = totalSupply(); + if (supply == 0) { + return 10**decimals(); + } else { + return (10**decimals() * _totalAssets) / supply; + } + } + + function deposit(uint256 _amount, address recipient) public returns (uint256) { + ERC20(_token).transferFrom(msg.sender, address(this), _amount); + + uint256 amountToMint = (_amount * 10**decimals()) / pricePerShare(); + _mint(recipient, amountToMint); + + return amountToMint; + } + + function withdraw(uint256 maxShares, address recipient) public returns (uint256) { + _burn(msg.sender, maxShares); + + uint256 amountToReturn = (maxShares * pricePerShare()) / 10**decimals(); + ERC20(_token).transfer(recipient, amountToReturn); + + return amountToReturn; + } + + function lastReport() external view returns (uint256) { + maybeRevertMaliciously(); + // Doesn't change, but read from storage anyway just to simulate gas cost. + return _lastReport; + } + + function lockedProfit() external view returns (uint256) { + maybeRevertMaliciously(); + // Doesn't change, but read from storage anyway just to simulate gas cost. + return _lockedProfit; + } + + function lockedProfitDegradation() external view returns (uint256) { + maybeRevertMaliciously(); + // Doesn't change, but read from storage anyway just to simulate gas cost. + return _lockedProfitDegradation; + } + + function totalAssets() external view returns (uint256) { + maybeRevertMaliciously(); + return _totalAssets; + } + + function setTotalAssets(uint256 _newTotalAssets) public { + _totalAssets = _newTotalAssets; + } + + function totalSupply() public view virtual override returns (uint256) { + maybeRevertMaliciously(); + return super.totalSupply(); + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/ReadOnlyReentrancyAttackerAaveLP.sol b/balpy/balancer-deployments/src/helpers/contracts/ReadOnlyReentrancyAttackerAaveLP.sol new file mode 100644 index 0000000..9fdbdd2 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/ReadOnlyReentrancyAttackerAaveLP.sol @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +import "@balancer-labs/v2-interfaces/contracts/vault/IVault.sol"; +import "@balancer-labs/v2-interfaces/contracts/pool-linear/ILinearPool.sol"; + +import "@balancer-labs/v2-solidity-utils/contracts/helpers/ERC20Helpers.sol"; +import "@balancer-labs/v2-solidity-utils/contracts/math/FixedPoint.sol"; + +/** + * @notice Performs a read-only reentrancy attack on a target linear pool, making use of the `receive` callback + * in the middle of a Vault operation. + */ +contract ReadOnlyReentrancyAttackerAaveLP { + using FixedPoint for uint256; + + enum AttackType { SET_TARGETS, SET_SWAP_FEE } + + uint8 public constant RECOVERY_MODE_EXIT_KIND = 255; + + uint256 private constant _LOWER_TARGET = 20e18; + uint256 private constant _UPPER_TARGET = 500e18; + uint256 private constant _SWAP_FEE_PERCENTAGE = 1e16; + + IVault private immutable _vault; + AttackType private _attackType; + ILinearPool private _pool; + + constructor(IVault vault) { + _vault = vault; + } + + /** + * @dev Starts attack on target pool. Since LinearPool attacks are permissioned and regular joins and exits are + * disabled, the attacker contract must be the owner (or be granted permissions to perform the calls). + * + * It is possible to enter the Vault with a RecoveryMode exit - but `_handleRemainingEth` is only called if the + * Vault is requested to unwrap WETH, which requires a target pool that contains WETH. + * For the AAVE specialization the token pair should then be WETH and waWETH, but waETH doesn't seem to comply with + * the required interface (namely the `LENDING_POOL` function, which is not present). + * waETH: https://etherscan.io/token/0x7580345ebc7defd34fc886cbd5ffb1adebf2f6d6#code. + * + * However, if you do an internal balance deposit of ETH, it will enter the Vault through user balance, + * and trigger the callback. This isn't a practical attack (nothing will be out of sync in the pool + * during it), but it verifies the reentrancy protection. + * + * @param pool Pool to attack. + * @param attackType Type of attack; determines which vulnerable pool function to call. + * @param ethAmount Amount of ETH to deposit + */ + function startAttack( + ILinearPool pool, + AttackType attackType, + uint256 ethAmount + ) external payable { + _attackType = attackType; + _pool = pool; + + IVault.UserBalanceOp[] memory ops = new IVault.UserBalanceOp[](1); + ops[0].kind = IVault.UserBalanceOpKind.DEPOSIT_INTERNAL; + // asset defaults to 0 (ETH sentinel value) + ops[0].amount = ethAmount; + ops[0].sender = address(this); + ops[0].recipient = payable(address(this)); + + _vault.manageUserBalance{ value: msg.value }(ops); + } + + receive() external payable { + _reenterAttack(); + } + + function _reenterAttack() internal { + AttackType attackType = _attackType; + ILinearPool pool = _pool; + + if (attackType == AttackType.SET_TARGETS) { + pool.setTargets(_LOWER_TARGET, _UPPER_TARGET); + } else if (attackType == AttackType.SET_SWAP_FEE) { + pool.setSwapFeePercentage(_SWAP_FEE_PERCENTAGE); + } + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/ReadOnlyReentrancyAttackerCSP.sol b/balpy/balancer-deployments/src/helpers/contracts/ReadOnlyReentrancyAttackerCSP.sol new file mode 100644 index 0000000..cf644fa --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/ReadOnlyReentrancyAttackerCSP.sol @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +import "@balancer-labs/v2-interfaces/contracts/vault/IVault.sol"; +import "@balancer-labs/v2-interfaces/contracts/pool-utils/IProtocolFeeCache.sol"; +import "@balancer-labs/v2-interfaces/contracts/pool-utils/IRateProvider.sol"; +import "@balancer-labs/v2-interfaces/contracts/pool-utils/IRateProviderPool.sol"; +import "@balancer-labs/v2-interfaces/contracts/pool-utils/IRecoveryMode.sol"; +import "@balancer-labs/v2-interfaces/contracts/pool-stable/IComposableStablePoolRates.sol"; + +/** + * @notice Performs a read-only reentrancy attack on a target composable stable pool, making use of the `receive` + * callback hook in the middle of a join operation. + */ +contract ReadOnlyReentrancyAttackerCSP { + enum AttackType { + DISABLE_RECOVERY_MODE, + UPDATE_PROTOCOL_FEE_CACHE, + UPDATE_TOKEN_RATE_CACHE, + SET_TOKEN_RATE_CACHE_DURATION + } + + IVault private immutable _vault; + AttackType private _attackType; + bytes32 private _poolId; + address private _tokenWithProvider; + + constructor(IVault vault) { + _vault = vault; + } + + /** + * @dev Starts attack on target pool. + * The contract needs to have the necessary funds as specified in the given `IVault.JoinPoolRequest` (i.e. the + * correct tokens and quantities) before this function is called. + * + * This function must be called with a non-zero ETH value. + * If `attackType` is `UPDATE_TOKEN_RATE_CACHE` or `SET_TOKEN_RATE_CACHE_DURATION`, at least one of the tokens + * in the pool should have a working rate provider; otherwise the function will revert. + * + * @param poolId Pool ID to attack. + * @param joinPoolRequest Join request, compatible with pool ID. Token amounts can be anything that triggers + * a valid join in the pool. + * @param attackType Type of attack; determines which vulnerable pool function to call. + */ + function startAttack( + bytes32 poolId, + IVault.JoinPoolRequest memory joinPoolRequest, + AttackType attackType + ) external payable { + _attackType = attackType; + _poolId = poolId; + _tokenWithProvider = address(0); + + uint256 assetsLength = joinPoolRequest.assets.length; + IVault vault = _vault; + for (uint256 i = 0; i < assetsLength; ++i) { + IERC20 asset = IERC20(address(joinPoolRequest.assets[i])); + asset.approve(address(vault), joinPoolRequest.maxAmountsIn[i]); + } + + if (_needsRateProvider(attackType)) { + (address pool, ) = _vault.getPool(_poolId); + + IRateProvider[] memory rateProviders = IRateProviderPool(pool).getRateProviders(); + for (uint256 i = 0; i < rateProviders.length; ++i) { + address rateProvider = address(rateProviders[i]); + if (rateProvider != address(0)) { + _tokenWithProvider = address(joinPoolRequest.assets[i]); + break; + } + } + require(_tokenWithProvider != address(0), "None of the pool tokens has a rate provider"); + } + + vault.joinPool{ value: msg.value }(poolId, address(this), address(this), joinPoolRequest); + } + + receive() external payable { + _reenterAttack(); + } + + function _reenterAttack() internal { + AttackType attackType = _attackType; + (address pool, ) = _vault.getPool(_poolId); + + if (attackType == AttackType.DISABLE_RECOVERY_MODE) { + IRecoveryMode(pool).disableRecoveryMode(); + } else if (attackType == AttackType.UPDATE_PROTOCOL_FEE_CACHE) { + IProtocolFeeCache(pool).updateProtocolFeePercentageCache(); + } else if (attackType == AttackType.UPDATE_TOKEN_RATE_CACHE) { + require(_tokenWithProvider != address(0), "Token to update not set"); + IComposableStablePoolRates(pool).updateTokenRateCache(IERC20(_tokenWithProvider)); + } else if (attackType == AttackType.SET_TOKEN_RATE_CACHE_DURATION) { + require(_tokenWithProvider != address(0), "Token to update not set"); + IComposableStablePoolRates(pool).setTokenRateCacheDuration(IERC20(_tokenWithProvider), 1); + } + } + + function _needsRateProvider(AttackType attackType) private pure returns (bool) { + return + attackType == AttackType.UPDATE_TOKEN_RATE_CACHE || attackType == AttackType.SET_TOKEN_RATE_CACHE_DURATION; + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/ReadOnlyReentrancyAttackerEP.sol b/balpy/balancer-deployments/src/helpers/contracts/ReadOnlyReentrancyAttackerEP.sol new file mode 100644 index 0000000..9952022 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/ReadOnlyReentrancyAttackerEP.sol @@ -0,0 +1,101 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +import "@balancer-labs/v2-interfaces/contracts/vault/IVault.sol"; +import "@balancer-labs/v2-interfaces/contracts/pool-linear/ILinearPool.sol"; + +import "@balancer-labs/v2-solidity-utils/contracts/helpers/ERC20Helpers.sol"; +import "@balancer-labs/v2-solidity-utils/contracts/math/FixedPoint.sol"; + +/** + * @notice Performs a read-only reentrancy attack on a target linear pool, making use of the `receive` hook + * in the middle of a Vault operation. + */ +contract ReadOnlyReentrancyAttackerEP { + using FixedPoint for uint256; + + enum AttackType { SET_TARGETS, SET_SWAP_FEE } + + uint8 public constant RECOVERY_MODE_EXIT_KIND = 255; + + uint256 private constant _LOWER_TARGET = 20e18; + uint256 private constant _UPPER_TARGET = 500e18; + uint256 private constant _SWAP_FEE_PERCENTAGE = 1e16; + + IVault private immutable _vault; + AttackType private _attackType; + ILinearPool private _pool; + + constructor(IVault vault) { + _vault = vault; + } + + /** + * @dev Starts attack on target pool. Since LinearPool attacks can only be called by the owner, + * and regular joins and exits are disabled, the attacker contract must be the owner. + * + * It is possible to enter the Vault with a RecoveryMode exit, but in order to trigger the callback, + * the pool token must be WETH, so that we can request the Vault to unwrap to ETH by passing in the + * sentinel value for ETH (0), instead of the address of WETH. + * + * Since WETH is not an "underlying" Euler token, trying to create a pool with WETH will fail with + * TOKENS_MISMATCH, so we really cannot perform the WETH attack on this pool (i.e., technically it's + * not vulnerable at present: but theoretically could become so in the future if a WETH-compatible + * toekn were added). For completeness, we verify that it inherits reentrancy protection from base + * LinearPool. + * + * Though we cannot do an exit with ETH, if you do an internal balance deposit of ETH, it will enter + * the Vault through user balance, and trigger the callback. This isn't a practical attack (nothing + * will be out of sync in the pool during it), but it verifies the reentrancy protection. + * + * @param pool Pool to attack. + * @param attackType Type of attack; determines which vulnerable pool function to call. + * @param ethAmount Amount of ETH to deposit + */ + function startAttack( + ILinearPool pool, + AttackType attackType, + uint256 ethAmount + ) external payable { + _attackType = attackType; + _pool = pool; + + IVault.UserBalanceOp[] memory ops = new IVault.UserBalanceOp[](1); + ops[0].kind = IVault.UserBalanceOpKind.DEPOSIT_INTERNAL; + // asset defaults to 0 (ETH sentinel value) + ops[0].amount = ethAmount; + ops[0].sender = address(this); + ops[0].recipient = payable(address(this)); + + _vault.manageUserBalance{ value: msg.value }(ops); + } + + receive() external payable { + _reenterAttack(); + } + + function _reenterAttack() internal { + AttackType attackType = _attackType; + ILinearPool pool = _pool; + + if (attackType == AttackType.SET_TARGETS) { + pool.setTargets(_LOWER_TARGET, _UPPER_TARGET); + } else if (attackType == AttackType.SET_SWAP_FEE) { + pool.setSwapFeePercentage(_SWAP_FEE_PERCENTAGE); + } + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/ReadOnlyReentrancyAttackerLP.sol b/balpy/balancer-deployments/src/helpers/contracts/ReadOnlyReentrancyAttackerLP.sol new file mode 100644 index 0000000..98612ab --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/ReadOnlyReentrancyAttackerLP.sol @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +import "@balancer-labs/v2-interfaces/contracts/vault/IVault.sol"; +import "@balancer-labs/v2-interfaces/contracts/pool-linear/ILinearPool.sol"; + +import "@balancer-labs/v2-solidity-utils/contracts/helpers/ERC20Helpers.sol"; +import "@balancer-labs/v2-solidity-utils/contracts/math/FixedPoint.sol"; + +/** + * @notice Performs a read-only reentrancy attack on a target linear pool, making use of the `receive` callback hook + * in the middle of an exit operation. + */ +contract ReadOnlyReentrancyAttackerLP { + using FixedPoint for uint256; + + enum AttackType { SET_TARGETS, SET_SWAP_FEE } + + uint8 public constant RECOVERY_MODE_EXIT_KIND = 255; + + uint256 private constant _LOWER_TARGET = 20e18; + uint256 private constant _UPPER_TARGET = 500e18; + uint256 private constant _SWAP_FEE_PERCENTAGE = 1e16; + + IVault private immutable _vault; + AttackType private _attackType; + ILinearPool private _pool; + + constructor(IVault vault) { + _vault = vault; + } + + /** + * @dev Starts attack on target pool. Since LinearPool regular joins and exits are disabled, the attacker contract + * must use RecoveryMode exit to perform the attack in a Vault context. + * + * The pool must have WETH, and the exit request must include the sentinel value (`address(0)`) so that the vault + * unwraps the token on the way out, effectively triggering the `receive` callback in this contract. + * + * Finally, the attacker needs to have permission to call the target functions (`setTargets` and + * `setSwapFeePercentage`) before the attack starts. + * + * @param pool Pool to attack. + * @param attackType Type of attack; determines which vulnerable pool function to call. + * @param bptAmountIn Amount of BPT to exit with (exchanged for WETH, unwrapped to ETH) + */ + function startAttack( + ILinearPool pool, + AttackType attackType, + uint256 bptAmountIn + ) external payable { + _attackType = attackType; + _pool = pool; + IVault vault = _vault; + IERC20 weth = vault.WETH(); + bytes32 poolId = pool.getPoolId(); + + bytes memory userData = abi.encode(RECOVERY_MODE_EXIT_KIND, bptAmountIn); + (IERC20[] memory tokens, , ) = vault.getPoolTokens(poolId); + + uint256 i = 0; + for (i = 0; i < tokens.length; ++i) { + if (tokens[i] == weth) { + tokens[i] = IERC20(address(0)); // This is the sentinel value to unwrap WETH. + break; + } + } + require(i < tokens.length, "Pool does not contain WETH"); + + IVault.ExitPoolRequest memory exitPoolRequest = IVault.ExitPoolRequest( + _asIAsset(tokens), + new uint256[](tokens.length), + userData, + false + ); + + vault.exitPool(poolId, address(this), address(this), exitPoolRequest); + } + + receive() external payable { + _reenterAttack(); + } + + function _reenterAttack() internal { + AttackType attackType = _attackType; + ILinearPool pool = _pool; + + if (attackType == AttackType.SET_TARGETS) { + pool.setTargets(_LOWER_TARGET, _UPPER_TARGET); + } else if (attackType == AttackType.SET_SWAP_FEE) { + pool.setSwapFeePercentage(_SWAP_FEE_PERCENTAGE); + } + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/ReadOnlyReentrancyAttackerMP.sol b/balpy/balancer-deployments/src/helpers/contracts/ReadOnlyReentrancyAttackerMP.sol new file mode 100644 index 0000000..562a3a1 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/ReadOnlyReentrancyAttackerMP.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +import "@balancer-labs/v2-interfaces/contracts/vault/IVault.sol"; +import "@balancer-labs/v2-interfaces/contracts/pool-utils/IProtocolFeeCache.sol"; +import "@balancer-labs/v2-interfaces/contracts/pool-utils/IManagedPool.sol"; + +/** + * @notice Performs a read-only reentrancy attack on a target weighted pool, making use of the `receive` callback hook + * in the middle of a join operation. + */ +contract ReadOnlyReentrancyAttackerMP { + enum AttackType { + SET_MANAGEMENT_AUM_FEE, + COLLECT_AUM_MANAGEMENT_FEES, + ADD_TOKEN, + REMOVE_TOKEN, + UPDATE_PROTOCOL_FEE_CACHE + } + + IVault private immutable _vault; + AttackType private _attackType; + bytes32 private _poolId; + + constructor(IVault vault) { + _vault = vault; + } + + /** + * @dev Starts attack on target pool. + * The contract needs to have the necessary funds as specified in the given `IVault.JoinPoolRequest` (i.e. the + * correct tokens and quantities) before this function is called. + * + * This function must be called with a non-zero ETH value. + * + * @param poolId Pool ID to attack. + * @param joinPoolRequest Join request, compatible with pool ID. Token amounts can be anything that triggers + * a valid join in the pool. + * @param attackType Type of attack; determines which vulnerable pool function to call. + */ + function startAttack( + bytes32 poolId, + IVault.JoinPoolRequest memory joinPoolRequest, + AttackType attackType + ) external payable { + require(msg.value > 0, "Insufficient ETH"); + _attackType = attackType; + _poolId = poolId; + + uint256 assetsLength = joinPoolRequest.assets.length; + IVault vault = _vault; + for (uint256 i = 0; i < assetsLength; ++i) { + IERC20 asset = IERC20(address(joinPoolRequest.assets[i])); + asset.approve(address(vault), joinPoolRequest.maxAmountsIn[i]); + } + + vault.joinPool{ value: msg.value }(poolId, address(this), address(this), joinPoolRequest); + } + + receive() external payable { + _reenterAttack(); + } + + function _reenterAttack() internal { + AttackType attackType = _attackType; + (address pool, ) = _vault.getPool(_poolId); + + if (attackType == AttackType.SET_MANAGEMENT_AUM_FEE) { + uint256 aumFeePercentage = 50e16; // 50% + + IManagedPool(pool).setManagementAumFeePercentage(aumFeePercentage); + } else if (attackType == AttackType.COLLECT_AUM_MANAGEMENT_FEES) { + IManagedPool(pool).collectAumManagementFees(); + } else if (attackType == AttackType.ADD_TOKEN) { + IERC20 weth = IERC20(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); + uint256 tokenWeight = 1e16; // 1% + address recipient = address(this); + + IManagedPool(pool).addToken(weth, address(0), tokenWeight, 0, recipient); + } else if (attackType == AttackType.REMOVE_TOKEN) { + (IERC20[] memory tokens, , ) = _vault.getPoolTokens(_poolId); + address sender = address(this); + + IManagedPool(pool).removeToken(tokens[1], 0, sender); + } else if (attackType == AttackType.UPDATE_PROTOCOL_FEE_CACHE) { + IProtocolFeeCache(pool).updateProtocolFeePercentageCache(); + } + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/ReadOnlyReentrancyAttackerWP.sol b/balpy/balancer-deployments/src/helpers/contracts/ReadOnlyReentrancyAttackerWP.sol new file mode 100644 index 0000000..7996ce9 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/ReadOnlyReentrancyAttackerWP.sol @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +import "@balancer-labs/v2-interfaces/contracts/vault/IVault.sol"; +import "@balancer-labs/v2-interfaces/contracts/pool-utils/IRecoveryMode.sol"; +import "@balancer-labs/v2-interfaces/contracts/pool-utils/IProtocolFeeCache.sol"; + +/** + * @notice Performs a read-only reentrancy attack on a target weighted pool, making use of the `receive` callback hook + * in the middle of a join operation. + */ +contract ReadOnlyReentrancyAttackerWP { + enum AttackType { DISABLE_RECOVERY_MODE, UPDATE_PROTOCOL_FEE_CACHE } + + IVault private immutable _vault; + AttackType private _attackType; + bytes32 private _poolId; + + constructor(IVault vault) { + _vault = vault; + } + + /** + * @dev Starts attack on target pool. + * The contract needs to have the necessary funds as specified in the given `IVault.JoinPoolRequest` (i.e. the + * correct tokens and quantities) before this function is called. + * + * This function must be called with a non-zero ETH value. + * + * @param poolId Pool ID to attack. + * @param joinPoolRequest Join request, compatible with pool ID. Token amounts can be anything that triggers + * a valid join in the pool. + * @param attackType Type of attack; determines which vulnerable pool function to call. + */ + function startAttack( + bytes32 poolId, + IVault.JoinPoolRequest memory joinPoolRequest, + AttackType attackType + ) external payable { + require(msg.value > 0, "Insufficient ETH"); + _attackType = attackType; + _poolId = poolId; + + uint256 assetsLength = joinPoolRequest.assets.length; + IVault vault = _vault; + for (uint256 i = 0; i < assetsLength; ++i) { + IERC20 asset = IERC20(address(joinPoolRequest.assets[i])); + asset.approve(address(vault), joinPoolRequest.maxAmountsIn[i]); + } + + vault.joinPool{ value: msg.value }(poolId, address(this), address(this), joinPoolRequest); + } + + receive() external payable { + _reenterAttack(); + } + + function _reenterAttack() internal { + AttackType attackType = _attackType; + (address pool, ) = _vault.getPool(_poolId); + + if (attackType == AttackType.DISABLE_RECOVERY_MODE) { + IRecoveryMode(pool).disableRecoveryMode(); + } else if (attackType == AttackType.UPDATE_PROTOCOL_FEE_CACHE) { + IProtocolFeeCache(pool).updateProtocolFeePercentageCache(); + } + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/TestToken.sol b/balpy/balancer-deployments/src/helpers/contracts/TestToken.sol new file mode 100644 index 0000000..d0c4e81 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/TestToken.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity ^0.7.0; + +import "@balancer-labs/v2-solidity-utils/contracts/openzeppelin/ERC20Burnable.sol"; +import "@balancer-labs/v2-solidity-utils/contracts/openzeppelin/ERC20Permit.sol"; +import "@balancer-labs/v2-solidity-utils/contracts/openzeppelin/ERC20.sol"; + +contract TestToken is ERC20, ERC20Burnable, ERC20Permit { + constructor( + string memory name, + string memory symbol, + uint8 decimals + ) ERC20(name, symbol) ERC20Permit(name) { + _setupDecimals(decimals); + } + + function mint(address recipient, uint256 amount) external { + _mint(recipient, amount); + } + + // burnWithoutAllowance was created to allow burn of token without approval. Example of use: + // + // MockGearboxVault.sol can't use burnFrom function (from ERC20Burnable) in unit tests, since + // MockGearboxVault doesn't have permission to burn relayer wrapped tokens and relayer is not a Signer + function burnWithoutAllowance(address sender, uint256 amount) external { + _burn(sender, amount); + } +} diff --git a/balpy/balancer-deployments/src/helpers/contracts/VeBoostV2.vy b/balpy/balancer-deployments/src/helpers/contracts/VeBoostV2.vy new file mode 100644 index 0000000..da000fb --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/contracts/VeBoostV2.vy @@ -0,0 +1,397 @@ +# @version 0.3.3 +""" +@title Boost Delegation V2 +@author CurveFi +""" + + +event Approval: + _owner: indexed(address) + _spender: indexed(address) + _value: uint256 + +event Transfer: + _from: indexed(address) + _to: indexed(address) + _value: uint256 + +event Boost: + _from: indexed(address) + _to: indexed(address) + _bias: uint256 + _slope: uint256 + _start: uint256 + +event Migrate: + _token_id: indexed(uint256) + + +interface BoostV1: + def ownerOf(_token_id: uint256) -> address: view + def token_boost(_token_id: uint256) -> int256: view + def token_expiry(_token_id: uint256) -> uint256: view + +interface VotingEscrow: + def balanceOf(_user: address) -> uint256: view + def totalSupply() -> uint256: view + def locked__end(_user: address) -> uint256: view + +interface ERC1271: + def isValidSignature(_hash: bytes32, _signature: Bytes[65]) -> bytes32: view + +struct Point: + bias: uint256 + slope: uint256 + ts: uint256 + + +NAME: constant(String[32]) = "Vote-Escrowed Boost" +SYMBOL: constant(String[8]) = "veBoost" +VERSION: constant(String[8]) = "v2.0.0" + +EIP712_TYPEHASH: constant(bytes32) = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)") +PERMIT_TYPEHASH: constant(bytes32) = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)") + +# keccak256("isValidSignature(bytes32,bytes)")[:4] << 224 +ERC1271_MAGIC_VAL: constant(bytes32) = 0x1626ba7e00000000000000000000000000000000000000000000000000000000 + + +WEEK: constant(uint256) = 86400 * 7 + + +BOOST_V1: immutable(address) +DOMAIN_SEPARATOR: immutable(bytes32) +VE: immutable(address) + + +allowance: public(HashMap[address, HashMap[address, uint256]]) +nonces: public(HashMap[address, uint256]) + +delegated: public(HashMap[address, Point]) +delegated_slope_changes: public(HashMap[address, HashMap[uint256, uint256]]) + +received: public(HashMap[address, Point]) +received_slope_changes: public(HashMap[address, HashMap[uint256, uint256]]) + +migrated: public(HashMap[uint256, bool]) + + +@external +def __init__(_boost_v1: address, _ve: address): + BOOST_V1 = _boost_v1 + DOMAIN_SEPARATOR = keccak256(_abi_encode(EIP712_TYPEHASH, keccak256(NAME), keccak256(VERSION), chain.id, self)) + VE = _ve + + log Transfer(ZERO_ADDRESS, msg.sender, 0) + + +@view +@internal +def _checkpoint_read(_user: address, _delegated: bool) -> Point: + point: Point = empty(Point) + + if _delegated: + point = self.delegated[_user] + else: + point = self.received[_user] + + if point.ts == 0: + point.ts = block.timestamp + + if point.ts == block.timestamp: + return point + + ts: uint256 = (point.ts / WEEK) * WEEK + for _ in range(255): + ts += WEEK + + dslope: uint256 = 0 + if block.timestamp < ts: + ts = block.timestamp + else: + if _delegated: + dslope = self.delegated_slope_changes[_user][ts] + else: + dslope = self.received_slope_changes[_user][ts] + + point.bias -= point.slope * (ts - point.ts) + point.slope -= dslope + point.ts = ts + + if ts == block.timestamp: + break + + return point + + +@internal +def _checkpoint_write(_user: address, _delegated: bool) -> Point: + point: Point = empty(Point) + + if _delegated: + point = self.delegated[_user] + else: + point = self.received[_user] + + if point.ts == 0: + point.ts = block.timestamp + + if point.ts == block.timestamp: + return point + + dbias: uint256 = 0 + ts: uint256 = (point.ts / WEEK) * WEEK + for _ in range(255): + ts += WEEK + + dslope: uint256 = 0 + if block.timestamp < ts: + ts = block.timestamp + else: + if _delegated: + dslope = self.delegated_slope_changes[_user][ts] + else: + dslope = self.received_slope_changes[_user][ts] + + amount: uint256 = point.slope * (ts - point.ts) + + dbias += amount + point.bias -= amount + point.slope -= dslope + point.ts = ts + + if ts == block.timestamp: + break + + if _delegated == False and dbias != 0: # received boost + log Transfer(_user, ZERO_ADDRESS, dbias) + + return point + + +@view +@internal +def _balance_of(_user: address) -> uint256: + amount: uint256 = VotingEscrow(VE).balanceOf(_user) + + point: Point = self._checkpoint_read(_user, True) + amount -= (point.bias - point.slope * (block.timestamp - point.ts)) + + point = self._checkpoint_read(_user, False) + amount += (point.bias - point.slope * (block.timestamp - point.ts)) + return amount + + +@internal +def _boost(_from: address, _to: address, _amount: uint256, _endtime: uint256): + assert _to not in [_from, ZERO_ADDRESS] + assert _amount != 0 + assert _endtime > block.timestamp + assert _endtime % WEEK == 0 + assert _endtime <= VotingEscrow(VE).locked__end(_from) + + # checkpoint delegated point + point: Point = self._checkpoint_write(_from, True) + assert _amount <= VotingEscrow(VE).balanceOf(_from) - (point.bias - point.slope * (block.timestamp - point.ts)) + + # calculate slope and bias being added + slope: uint256 = _amount / (_endtime - block.timestamp) + bias: uint256 = slope * (_endtime - block.timestamp) + + # update delegated point + point.bias += bias + point.slope += slope + + # store updated values + self.delegated[_from] = point + self.delegated_slope_changes[_from][_endtime] += slope + + # update received amount + point = self._checkpoint_write(_to, False) + point.bias += bias + point.slope += slope + + # store updated values + self.received[_to] = point + self.received_slope_changes[_to][_endtime] += slope + + log Transfer(_from, _to, _amount) + log Boost(_from, _to, bias, slope, block.timestamp) + + # also checkpoint received and delegated + self.received[_from] = self._checkpoint_write(_from, False) + self.delegated[_to] = self._checkpoint_write(_to, True) + + +@external +def boost(_to: address, _amount: uint256, _endtime: uint256, _from: address = msg.sender): + # reduce approval if necessary + if _from != msg.sender: + allowance: uint256 = self.allowance[_from][msg.sender] + if allowance != MAX_UINT256: + self.allowance[_from][msg.sender] = allowance - _amount + log Approval(_from, msg.sender, allowance - _amount) + + self._boost(_from, _to, _amount, _endtime) + +@internal +def _migrate(_token_id: uint256): + assert not self.migrated[_token_id] + + self._boost( + convert(shift(_token_id, -96), address), # from + BoostV1(BOOST_V1).ownerOf(_token_id), # to + convert(BoostV1(BOOST_V1).token_boost(_token_id), uint256), # amount + BoostV1(BOOST_V1).token_expiry(_token_id), # expiry + ) + + self.migrated[_token_id] = True + log Migrate(_token_id) + +@external +def migrate(_token_id: uint256): + self._migrate(_token_id) + +@external +def migrate_many(_token_ids: uint256[16]): + for i in range(16): + if _token_ids[i] == 0: + break + self._migrate(_token_ids[i]) + +@external +def checkpoint_user(_user: address): + self.delegated[_user] = self._checkpoint_write(_user, True) + self.received[_user] = self._checkpoint_write(_user, False) + + +@external +def approve(_spender: address, _value: uint256) -> bool: + self.allowance[msg.sender][_spender] = _value + + log Approval(msg.sender, _spender, _value) + return True + + +@external +def permit(_owner: address, _spender: address, _value: uint256, _deadline: uint256, _v: uint8, _r: bytes32, _s: bytes32) -> bool: + assert block.timestamp <= _deadline, 'EXPIRED_SIGNATURE' + + nonce: uint256 = self.nonces[_owner] + digest: bytes32 = keccak256( + concat( + b"\x19\x01", + DOMAIN_SEPARATOR, + keccak256(_abi_encode(PERMIT_TYPEHASH, _owner, _spender, _value, nonce, _deadline)) + ) + ) + + if _owner.is_contract: + sig: Bytes[65] = concat(_abi_encode(_r, _s), slice(convert(_v, bytes32), 31, 1)) + # reentrancy not a concern since this is a staticcall + assert ERC1271(_owner).isValidSignature(digest, sig) == ERC1271_MAGIC_VAL, 'INVALID_SIGNATURE' + else: + assert ecrecover(digest, convert(_v, uint256), convert(_r, uint256), convert(_s, uint256)) == _owner and _owner != ZERO_ADDRESS, 'INVALID_SIGNATURE' + + self.allowance[_owner][_spender] = _value + self.nonces[_owner] = nonce + 1 + + log Approval(_owner, _spender, _value) + return True + + +@external +def increaseAllowance(_spender: address, _added_value: uint256) -> bool: + allowance: uint256 = self.allowance[msg.sender][_spender] + _added_value + self.allowance[msg.sender][_spender] = allowance + + log Approval(msg.sender, _spender, allowance) + return True + + +@external +def decreaseAllowance(_spender: address, _subtracted_value: uint256) -> bool: + allowance: uint256 = self.allowance[msg.sender][_spender] - _subtracted_value + self.allowance[msg.sender][_spender] = allowance + + log Approval(msg.sender, _spender, allowance) + return True + + +@view +@external +def balanceOf(_user: address) -> uint256: + return self._balance_of(_user) + + +@view +@external +def adjusted_balance_of(_user: address) -> uint256: + return self._balance_of(_user) + + +@view +@external +def totalSupply() -> uint256: + return VotingEscrow(VE).totalSupply() + + +@view +@external +def delegated_balance(_user: address) -> uint256: + point: Point = self._checkpoint_read(_user, True) + return point.bias - point.slope * (block.timestamp - point.ts) + + +@view +@external +def received_balance(_user: address) -> uint256: + point: Point = self._checkpoint_read(_user, False) + return point.bias - point.slope * (block.timestamp - point.ts) + + +@view +@external +def delegable_balance(_user: address) -> uint256: + point: Point = self._checkpoint_read(_user, True) + return VotingEscrow(VE).balanceOf(_user) - (point.bias - point.slope * (block.timestamp - point.ts)) + + +@pure +@external +def name() -> String[32]: + return NAME + + +@pure +@external +def symbol() -> String[8]: + return SYMBOL + + +@pure +@external +def decimals() -> uint8: + return 18 + + +@pure +@external +def BOOST_V1() -> address: + return BOOST_V1 + +@pure +@external +def version() -> String[8]: + return VERSION + +@pure +@external +def DOMAIN_SEPARATOR() -> bytes32: + return DOMAIN_SEPARATOR + + +@pure +@external +def VE() -> address: + return VE diff --git a/balpy/balancer-deployments/src/helpers/expectEvent.ts b/balpy/balancer-deployments/src/helpers/expectEvent.ts new file mode 100644 index 0000000..b45c14f --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/expectEvent.ts @@ -0,0 +1,152 @@ +import { expect } from 'chai'; +import { BigNumber, ContractReceipt } from 'ethers'; +import { Interface, LogDescription } from 'ethers/lib/utils'; + +// Ported from @openzeppelin/test-helpers to use with Ethers. The Test Helpers don't +// yet have Typescript typings, so we're being lax about them here. +// See https://github.com/OpenZeppelin/openzeppelin-test-helpers/issues/122 + +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export function inReceipt(receipt: ContractReceipt, eventName: string, eventArgs = {}): any { + if (receipt.events == undefined) { + throw new Error('No events found in receipt'); + } + + const events = receipt.events.filter((e) => e.event === eventName); + expect(events.length > 0).to.equal(true, `No '${eventName}' events found`); + + const exceptions: Array = []; + const event = events.find(function (e) { + for (const [k, v] of Object.entries(eventArgs)) { + try { + if (e.args == undefined) { + throw new Error('Event has no arguments'); + } + + contains(e.args, k, v); + } catch (error) { + exceptions.push(String(error)); + return false; + } + } + return true; + }); + + if (event === undefined) { + // Each event entry may have failed to match for different reasons, + // throw the first one + throw exceptions[0]; + } + + return event; +} + +/** + * Throws error if the given receipt does not contain a set of events with specific arguments. + * Expecting a specific amount of events from a particular address is optional. + * @param receipt Receipt to analyze. + * @param emitter Interface of the contract emitting the event(s). + * @param eventName Name of the event(s). + * @param eventArgs Arguments of the event(s). This does not need to be a complete list; as long as the event contains + * the specified ones, the function will not throw. + * @param address Contract address that emits the event(s). If undefined, the logs will not be filtered by address. + * @param amount Number of expected events that match all the specified conditions. If not specified, at least one is + * expected. + * @returns First matching event if the amount is not specified; all matching events otherwise. + */ +export function inIndirectReceipt( + receipt: ContractReceipt, + emitter: Interface, + eventName: string, + eventArgs = {}, + address?: string, + amount?: number +): any { + const expectedEvents = arrayFromIndirectReceipt(receipt, emitter, eventName, address); + if (amount === undefined) { + expect(expectedEvents.length > 0).to.equal(true, `No '${eventName}' events found`); + } else { + expect(expectedEvents.length).to.equal( + amount, + `${expectedEvents.length} '${eventName}' events found; expected ${amount}` + ); + } + + const exceptions: Array = []; + const filteredEvents = expectedEvents.filter(function (e) { + for (const [k, v] of Object.entries(eventArgs)) { + try { + if (e.args == undefined) { + throw new Error('Event has no arguments'); + } + + contains(e.args, k, v); + } catch (error) { + exceptions.push(String(error)); + return false; + } + } + return true; + }); + + // Each event entry may have failed to match for different reasons; in case of failure we throw the first one. + if (amount === undefined) { + // If amount is undefined, we don't care about the number of events. If no events were found, we throw. + if (filteredEvents.length === 0) { + throw exceptions[0]; + } + return filteredEvents[0]; // In this case we just return the first appearance. This is backwards compatible. + } else { + // If amount was defined, we want the filtered events length to match the events length. If it doesn't, we throw. + if (filteredEvents.length !== expectedEvents.length) { + throw exceptions[0]; + } + return filteredEvents; // In this case we care about all of the events, so we return them all. + } +} + +export function notEmitted(receipt: ContractReceipt, eventName: string): void { + if (receipt.events != undefined) { + const events = receipt.events.filter((e) => e.event === eventName); + expect(events.length > 0).to.equal(false, `'${eventName}' event found`); + } +} + +function arrayFromIndirectReceipt( + receipt: ContractReceipt, + emitter: Interface, + eventName: string, + address?: string +): any[] { + const decodedEvents = receipt.logs + .filter((log) => (address ? log.address.toLowerCase() === address.toLowerCase() : true)) + .map((log) => { + try { + return emitter.parseLog(log); + } catch { + return undefined; + } + }) + .filter((e): e is LogDescription => e !== undefined); + + return decodedEvents.filter((event) => event.name === eventName); +} + +function contains(args: { [key: string]: any | undefined }, key: string, value: any) { + expect(key in args).to.equal(true, `Event argument '${key}' not found`); + + if (value === null) { + expect(args[key]).to.equal(null, `expected event argument '${key}' to be null but got ${args[key]}`); + } else if (BigNumber.isBigNumber(args[key]) || BigNumber.isBigNumber(value)) { + const actual = BigNumber.isBigNumber(args[key]) ? args[key].toString() : args[key]; + const expected = BigNumber.isBigNumber(value) ? value.toString() : value; + + expect(args[key]).to.equal(value, `expected event argument '${key}' to have value ${expected} but got ${actual}`); + } else { + expect(args[key]).to.be.deep.equal( + value, + `expected event argument '${key}' to have value ${value} but got ${args[key]}` + ); + } +} diff --git a/balpy/balancer-deployments/src/helpers/expectTransfer.ts b/balpy/balancer-deployments/src/helpers/expectTransfer.ts new file mode 100644 index 0000000..8dbf102 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/expectTransfer.ts @@ -0,0 +1,28 @@ +import { BigNumberish, ContractReceipt } from 'ethers'; +import * as expectEvent from './expectEvent'; +import { Interface } from 'ethers/lib/utils'; +import { Account } from './models/types/types'; +import { ZERO_ADDRESS } from './constants'; + +export function expectTransferEvent( + receipt: ContractReceipt, + args: { from?: string; to?: string; value?: BigNumberish }, + token: Account + // eslint-disable-next-line @typescript-eslint/no-explicit-any +): any { + if (receipt.to.toLowerCase() === toAddress(token).toLowerCase()) { + return expectEvent.inReceipt(receipt, 'Transfer', args); + } + return expectEvent.inIndirectReceipt( + receipt, + new Interface(['event Transfer(address indexed from, address indexed to, uint256 value)']), + 'Transfer', + args, + toAddress(token) + ); +} + +function toAddress(to?: Account): string { + if (!to) return ZERO_ADDRESS; + return typeof to === 'string' ? to : to.address; +} diff --git a/balpy/balancer-deployments/src/helpers/merkleTree.ts b/balpy/balancer-deployments/src/helpers/merkleTree.ts new file mode 100644 index 0000000..9e85bf6 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/merkleTree.ts @@ -0,0 +1,144 @@ +import { keccak256, keccakFromString, bufferToHex } from 'ethereumjs-util'; +import { utils } from 'ethers'; + +/* eslint-disable */ + +// Merkle tree called with 32 byte hex values +export class MerkleTree { + elements: Buffer[]; + layers: any[]; + + constructor(elements: string[]) { + this.elements = elements.filter((el) => el).map((el) => Buffer.from(utils.arrayify(el))); + + // Sort elements + this.elements.sort(Buffer.compare); + // Deduplicate elements + this.elements = this.bufDedup(this.elements); + + // Create layers + this.layers = this.getLayers(this.elements); + } + + getLayers(elements: Buffer[]) { + if (elements.length === 0) { + return [['']]; + } + + const layers: any[] = []; + layers.push(elements); + + // Get next layer until we reach the root + while (layers[layers.length - 1].length > 1) { + layers.push(this.getNextLayer(layers[layers.length - 1])); + } + + return layers; + } + + getNextLayer(elements: Buffer[]) { + return elements.reduce((layer: any, el: any, idx: number, arr: any[]) => { + if (idx % 2 === 0) { + // Hash the current element with its pair element + layer.push(this.combinedHash(el, arr[idx + 1])); + } + + return layer; + }, []); + } + + combinedHash(first: string, second: string): Buffer | String { + if (!first) { + return second; + } + if (!second) { + return first; + } + + return keccak256(this.sortAndConcat(first, second)); + } + + getRoot() { + return this.layers[this.layers.length - 1][0]; + } + + getHexRoot() { + return bufferToHex(this.getRoot()); + } + + getProof(el: Buffer) { + let idx = this.bufIndexOf(el, this.elements); + + if (idx === -1) { + throw new Error('Element does not exist in Merkle tree'); + } + + return this.layers.reduce((proof, layer) => { + const pairElement = this.getPairElement(idx, layer); + + if (pairElement) { + proof.push(pairElement); + } + + idx = Math.floor(idx / 2); + + return proof; + }, []); + } + + // external call - convert to buffer + getHexProof(_el: any) { + const el = Buffer.from(utils.arrayify(_el)); + + const proof = this.getProof(el); + + return this.bufArrToHexArr(proof); + } + + getPairElement(idx: number, layer: any) { + const pairIdx = idx % 2 === 0 ? idx + 1 : idx - 1; + + if (pairIdx < layer.length) { + return layer[pairIdx]; + } else { + return null; + } + } + + bufIndexOf(el: Buffer | string, arr: Buffer[]) { + let hash; + + // Convert element to 32 byte hash if it is not one already + if (el.length !== 32 || !Buffer.isBuffer(el)) { + hash = keccakFromString(el as string); + } else { + hash = el as Buffer; + } + + for (let i = 0; i < arr.length; i++) { + if (hash.equals(arr[i])) { + return i; + } + } + + return -1; + } + + bufDedup(elements: Buffer[]) { + return elements.filter((el, idx: number) => { + return idx === 0 || !elements[idx - 1].equals(el); + }); + } + + bufArrToHexArr(arr: Buffer[]) { + if (arr.some((el) => !Buffer.isBuffer(el))) { + throw new Error('Array is not an array of buffers'); + } + + return arr.map((el: Buffer) => '0x' + el.toString('hex')); + } + + sortAndConcat(...args: any[]) { + return Buffer.concat([...args].sort(Buffer.compare)); + } +} diff --git a/balpy/balancer-deployments/src/helpers/models/authorizer/TimelockAuthorizer.ts b/balpy/balancer-deployments/src/helpers/models/authorizer/TimelockAuthorizer.ts new file mode 100644 index 0000000..4bc5f0a --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/models/authorizer/TimelockAuthorizer.ts @@ -0,0 +1,312 @@ +import { Interface } from 'ethers/lib/utils'; +import { BigNumber, Contract, ContractTransaction } from 'ethers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; + +import * as expectEvent from '@helpers/expectEvent'; +import { BigNumberish } from '@helpers/numbers'; +import { ANY_ADDRESS } from '@helpers/constants'; +import { advanceToTimestamp } from '@helpers/time'; + +import TimelockAuthorizerDeployer from './TimelockAuthorizerDeployer'; +import { TimelockAuthorizerDeployment } from './types'; +import { Account, NAry, TxParams } from '../types/types'; + +export default class TimelockAuthorizer { + static EVERYWHERE = ANY_ADDRESS; + + instance: Contract; + root: SignerWithAddress; + + static async create(deployment: TimelockAuthorizerDeployment = {}): Promise { + return TimelockAuthorizerDeployer.deploy(deployment); + } + + constructor(instance: Contract, root: SignerWithAddress) { + this.instance = instance; + this.root = root; + } + + get address(): string { + return this.instance.address; + } + + get interface(): Interface { + return this.instance.interface; + } + + async hasPermission(action: string, account: Account, where: Account): Promise { + return this.instance.hasPermission(action, this.toAddress(account), this.toAddress(where)); + } + + async getPermissionId(action: string, account: Account, where: Account): Promise { + return this.instance.getPermissionId(action, this.toAddress(account), this.toAddress(where)); + } + + async isRoot(account: Account): Promise { + return this.instance.isRoot(this.toAddress(account)); + } + + async isPendingRoot(account: Account): Promise { + return this.instance.isPendingRoot(this.toAddress(account)); + } + + async isExecutor(scheduledExecutionId: BigNumberish, account: Account): Promise { + return this.instance.isExecutor(scheduledExecutionId, this.toAddress(account)); + } + + async isCanceler(scheduledExecutionId: BigNumberish, account: Account): Promise { + return this.instance.isCanceler(scheduledExecutionId, this.toAddress(account)); + } + + async delay(action: string): Promise { + return this.instance.getActionIdDelay(action); + } + + async getActionIdRevokeDelay(actionId: string): Promise { + return this.instance.getActionIdRevokeDelay(actionId); + } + + async getActionIdGrantDelay(actionId: string): Promise { + return this.instance.getActionIdGrantDelay(actionId); + } + + async getScheduledExecution(id: BigNumberish): Promise<{ + executed: boolean; + cancelled: boolean; + protected: boolean; + executableAt: BigNumber; + data: string; + where: string; + }> { + return this.instance.getScheduledExecution(id); + } + + async canPerform(action: string, account: Account, where: Account): Promise { + return this.instance.canPerform(action, this.toAddress(account), this.toAddress(where)); + } + + async isGranter(actionId: string, account: Account, where: Account): Promise { + return this.instance.isGranter(actionId, this.toAddress(account), this.toAddress(where)); + } + + async isRevoker(account: Account, where: Account): Promise { + return this.instance.isRevoker(this.toAddress(account), this.toAddress(where)); + } + + async scheduleRootChange(root: Account, executors: Account[], params?: TxParams): Promise { + const receipt = await this.with(params).scheduleRootChange(this.toAddress(root), this.toAddresses(executors)); + const event = expectEvent.inReceipt(await receipt.wait(), 'RootChangeScheduled', { + newRoot: this.toAddress(root), + }); + return event.args.scheduledExecutionId; + } + + async claimRoot(params?: TxParams): Promise { + return this.with(params).claimRoot(); + } + + async scheduleDelayChange( + action: string, + delay: BigNumberish, + executors: Account[], + params?: TxParams + ): Promise { + const receipt = await this.with(params).scheduleDelayChange(action, delay, this.toAddresses(executors)); + const event = expectEvent.inReceipt(await receipt.wait(), 'DelayChangeScheduled', { + actionId: action, + newDelay: delay, + }); + return event.args.scheduledExecutionId; + } + + async scheduleGrantDelayChange( + action: string, + delay: BigNumberish, + executors: Account[], + params?: TxParams + ): Promise { + const receipt = await this.with(params).scheduleGrantDelayChange(action, delay, this.toAddresses(executors)); + const event = expectEvent.inReceipt(await receipt.wait(), 'GrantDelayChangeScheduled', { + actionId: action, + newDelay: delay, + }); + return event.args.scheduledExecutionId; + } + + async scheduleRevokeDelayChange( + action: string, + delay: BigNumberish, + executors: Account[], + params?: TxParams + ): Promise { + const receipt = await this.with(params).scheduleRevokeDelayChange(action, delay, this.toAddresses(executors)); + const event = expectEvent.inReceipt(await receipt.wait(), 'RevokeDelayChangeScheduled', { + actionId: action, + newDelay: delay, + }); + return event.args.scheduledExecutionId; + } + + async schedule(where: Account, data: string, executors: Account[], params?: TxParams): Promise { + const receipt = await this.with(params).schedule(this.toAddress(where), data, this.toAddresses(executors)); + const event = expectEvent.inReceipt(await receipt.wait(), 'ExecutionScheduled'); + return event.args.scheduledExecutionId; + } + + async scheduleGrantPermission( + action: string, + account: Account, + where: Account, + executors: Account[], + params?: TxParams + ): Promise { + const receipt = await this.with(params).scheduleGrantPermission( + action, + this.toAddress(account), + this.toAddress(where), + this.toAddresses(executors) + ); + + const event = expectEvent.inReceipt(await receipt.wait(), 'GrantPermissionScheduled', { + actionId: action, + account: this.toAddress(account), + where: this.toAddress(where), + }); + return event.args.scheduledExecutionId; + } + + async scheduleRevokePermission( + action: string, + account: Account, + where: Account, + executors: Account[], + params?: TxParams + ): Promise { + const receipt = await this.with(params).scheduleRevokePermission( + action, + this.toAddress(account), + this.toAddress(where), + this.toAddresses(executors) + ); + + const event = expectEvent.inReceipt(await receipt.wait(), 'RevokePermissionScheduled', { + actionId: action, + account: this.toAddress(account), + where: this.toAddress(where), + }); + return event.args.scheduledExecutionId; + } + + async execute(id: BigNumberish, params?: TxParams): Promise { + return this.with(params).execute(id); + } + + async cancel(id: BigNumberish, params?: TxParams): Promise { + return this.with(params).cancel(id); + } + + async addCanceler( + scheduledExecutionId: BigNumberish, + account: Account, + params?: TxParams + ): Promise { + return this.with(params).addCanceler(scheduledExecutionId, this.toAddress(account)); + } + + async removeCanceler( + scheduledExecutionId: BigNumberish, + account: Account, + params?: TxParams + ): Promise { + return this.with(params).removeCanceler(scheduledExecutionId, this.toAddress(account)); + } + + async addGranter(action: string, account: Account, where: Account, params?: TxParams): Promise { + return this.with(params).addGranter(action, this.toAddress(account), this.toAddress(where)); + } + + async removeGranter( + action: string, + account: Account, + wheres: Account, + params?: TxParams + ): Promise { + return this.with(params).removeGranter(action, this.toAddress(account), this.toAddress(wheres)); + } + + async addRevoker(account: Account, where: Account, params?: TxParams): Promise { + return this.with(params).addRevoker(this.toAddress(account), this.toAddress(where)); + } + + async removeRevoker(account: Account, wheres: Account, params?: TxParams): Promise { + return this.with(params).removeRevoker(this.toAddress(account), this.toAddress(wheres)); + } + + async grantPermission( + action: string, + account: Account, + where: Account, + params?: TxParams + ): Promise { + return this.with(params).grantPermission(action, this.toAddress(account), this.toAddress(where)); + } + + async revokePermission( + action: string, + account: Account, + where: Account, + params?: TxParams + ): Promise { + return this.with(params).revokePermission(action, this.toAddress(account), this.toAddress(where)); + } + + async renouncePermission(action: string, where: Account, params?: TxParams): Promise { + return this.with(params).renouncePermission(action, this.toAddress(where)); + } + + async grantPermissionGlobally(action: string, account: Account, params?: TxParams): Promise { + return this.with(params).grantPermission(action, this.toAddress(account), TimelockAuthorizer.EVERYWHERE); + } + + async revokePermissionGlobally(action: string, account: Account, params?: TxParams): Promise { + return this.with(params).revokePermission(action, this.toAddress(account), TimelockAuthorizer.EVERYWHERE); + } + + async renouncePermissionGlobally(action: string, params: TxParams): Promise { + return this.with(params).renouncePermission(action, TimelockAuthorizer.EVERYWHERE); + } + + async scheduleAndExecuteDelayChange(action: string, delay: number, params?: TxParams): Promise { + const id = await this.scheduleDelayChange(action, delay, [], params); + await advanceToTimestamp((await this.getScheduledExecution(id)).executableAt); + await this.execute(id); + } + + async scheduleAndExecuteGrantDelayChange(action: string, delay: number, params?: TxParams): Promise { + const id = await this.scheduleGrantDelayChange(action, delay, [], params); + await advanceToTimestamp((await this.getScheduledExecution(id)).executableAt); + await this.execute(id); + } + + async scheduleAndExecuteRevokeDelayChange(action: string, delay: number, params?: TxParams): Promise { + const id = await this.scheduleRevokeDelayChange(action, delay, [], params); + await advanceToTimestamp((await this.getScheduledExecution(id)).executableAt); + await this.execute(id); + } + + toAddress(account: Account): string { + return typeof account === 'string' ? account : account.address; + } + + toAddresses(accounts: NAry): string[] { + return this.toList(accounts).map(this.toAddress); + } + + toList(items: NAry): T[] { + return Array.isArray(items) ? items : [items]; + } + + with(params: TxParams = {}): Contract { + return params.from ? this.instance.connect(params.from) : this.instance; + } +} diff --git a/balpy/balancer-deployments/src/helpers/models/authorizer/TimelockAuthorizerDeployer.ts b/balpy/balancer-deployments/src/helpers/models/authorizer/TimelockAuthorizerDeployer.ts new file mode 100644 index 0000000..eb072cf --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/models/authorizer/TimelockAuthorizerDeployer.ts @@ -0,0 +1,26 @@ +import { ethers } from 'hardhat'; + +import { MONTH } from '@helpers/time'; +import { deploy } from '@src'; +import { TimelockAuthorizerDeployment } from './types'; + +import TimelockAuthorizer from './TimelockAuthorizer'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import { Account } from '../types/types'; + +export default { + async deploy(deployment: TimelockAuthorizerDeployment): Promise { + const root = deployment.root || deployment.from || (await ethers.getSigners())[0]; + const nextRoot = deployment.nextRoot || ZERO_ADDRESS; + const rootTransferDelay = deployment.rootTransferDelay || MONTH; + const entrypoint = await deploy('MockAuthorizerAdaptorEntrypoint'); + const args = [toAddress(root), toAddress(nextRoot), entrypoint.address, rootTransferDelay]; + const instance = await deploy('TimelockAuthorizer', args); + return new TimelockAuthorizer(instance, root); + }, +}; + +function toAddress(to?: Account): string { + if (!to) return ZERO_ADDRESS; + return typeof to === 'string' ? to : to.address; +} diff --git a/balpy/balancer-deployments/src/helpers/models/authorizer/types.ts b/balpy/balancer-deployments/src/helpers/models/authorizer/types.ts new file mode 100644 index 0000000..48d9bc9 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/models/authorizer/types.ts @@ -0,0 +1,12 @@ +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; + +import { Account } from '../types/types'; +import { BigNumberish } from '../../numbers'; + +export type TimelockAuthorizerDeployment = { + vault?: Account; + root?: SignerWithAddress; + nextRoot?: Account; + rootTransferDelay?: BigNumberish; + from?: SignerWithAddress; +}; diff --git a/balpy/balancer-deployments/src/helpers/models/misc/actions.ts b/balpy/balancer-deployments/src/helpers/models/misc/actions.ts new file mode 100644 index 0000000..ab1b882 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/models/misc/actions.ts @@ -0,0 +1,7 @@ +import { Contract } from 'ethers'; +import { Interface } from 'ethers/lib/utils'; + +export const actionId = (instance: Contract, method: string, contractInterface?: Interface): Promise => { + const selector = (contractInterface ?? instance.interface).getSighash(method); + return instance.getActionId(selector); +}; diff --git a/balpy/balancer-deployments/src/helpers/models/misc/signatures.ts b/balpy/balancer-deployments/src/helpers/models/misc/signatures.ts new file mode 100644 index 0000000..45048e0 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/models/misc/signatures.ts @@ -0,0 +1,222 @@ +import { MaxUint256 as MAX_DEADLINE } from '@ethersproject/constants'; +import { Contract } from '@ethersproject/contracts'; +import { hexValue, hexZeroPad, splitSignature } from '@ethersproject/bytes'; +import { BigNumber, BigNumberish } from '@ethersproject/bignumber'; +import { Signer, TypedDataSigner } from '@ethersproject/abstract-signer'; + +export type Account = string | Signer | Contract; + +export async function accountToAddress(account: Account): Promise { + if (typeof account == 'string') return account; + if (Signer.isSigner(account)) return account.getAddress(); + if (account.address) return account.address; + throw new Error('Could not read account address'); +} + +export enum RelayerAction { + JoinPool = 'JoinPool', + ExitPool = 'ExitPool', + Swap = 'Swap', + BatchSwap = 'BatchSwap', + SetRelayerApproval = 'SetRelayerApproval', +} + +export class RelayerAuthorization { + /** + * Cannot be constructed. + */ + private constructor() { + // eslint-disable-next-line @typescript-eslint/no-empty-function + } + + static encodeCalldataAuthorization = (calldata: string, deadline: BigNumberish, signature: string): string => { + const encodedDeadline = hexZeroPad(hexValue(deadline), 32).slice(2); + const { v, r, s } = splitSignature(signature); + const encodedV = hexZeroPad(hexValue(v), 32).slice(2); + const encodedR = r.slice(2); + const encodedS = s.slice(2); + return `${calldata}${encodedDeadline}${encodedV}${encodedR}${encodedS}`; + }; + + static signJoinAuthorization = ( + validator: Contract, + user: Signer & TypedDataSigner, + allowedSender: Account, + allowedCalldata: string, + deadline?: BigNumberish, + nonce?: BigNumberish + ): Promise => + RelayerAuthorization.signAuthorizationFor( + RelayerAction.JoinPool, + validator, + user, + allowedSender, + allowedCalldata, + deadline, + nonce + ); + + static signExitAuthorization = ( + validator: Contract, + user: Signer & TypedDataSigner, + allowedSender: Account, + allowedCalldata: string, + deadline?: BigNumberish, + nonce?: BigNumberish + ): Promise => + RelayerAuthorization.signAuthorizationFor( + RelayerAction.ExitPool, + validator, + user, + allowedSender, + allowedCalldata, + deadline, + nonce + ); + + static signSwapAuthorization = ( + validator: Contract, + user: Signer & TypedDataSigner, + allowedSender: Account, + allowedCalldata: string, + deadline?: BigNumberish, + nonce?: BigNumberish + ): Promise => + RelayerAuthorization.signAuthorizationFor( + RelayerAction.Swap, + validator, + user, + allowedSender, + allowedCalldata, + deadline, + nonce + ); + + static signBatchSwapAuthorization = ( + validator: Contract, + user: Signer & TypedDataSigner, + allowedSender: Account, + allowedCalldata: string, + deadline?: BigNumberish, + nonce?: BigNumberish + ): Promise => + RelayerAuthorization.signAuthorizationFor( + RelayerAction.BatchSwap, + validator, + user, + allowedSender, + allowedCalldata, + deadline, + nonce + ); + + static signSetRelayerApprovalAuthorization = ( + validator: Contract, + user: Signer & TypedDataSigner, + allowedSender: Account, + allowedCalldata: string, + deadline?: BigNumberish, + nonce?: BigNumberish + ): Promise => + RelayerAuthorization.signAuthorizationFor( + RelayerAction.SetRelayerApproval, + validator, + user, + allowedSender, + allowedCalldata, + deadline, + nonce + ); + + static signAuthorizationFor = async ( + type: RelayerAction, + validator: Contract, + user: Signer & TypedDataSigner, + allowedSender: Account, + allowedCalldata: string, + deadline: BigNumberish = MAX_DEADLINE, + nonce?: BigNumberish + ): Promise => { + const { chainId } = await validator.provider.getNetwork(); + if (!nonce) { + const userAddress = await user.getAddress(); + nonce = (await validator.getNextNonce(userAddress)) as BigNumberish; + } + + const domain = { + name: 'Balancer V2 Vault', + version: '1', + chainId, + verifyingContract: validator.address, + }; + + const types = { + [type]: [ + { name: 'calldata', type: 'bytes' }, + { name: 'sender', type: 'address' }, + { name: 'nonce', type: 'uint256' }, + { name: 'deadline', type: 'uint256' }, + ], + }; + + const value = { + calldata: allowedCalldata, + sender: await accountToAddress(allowedSender), + nonce: nonce.toString(), + deadline: deadline.toString(), + }; + + return user._signTypedData(domain, types, value); + }; +} + +export class BalancerMinterAuthorization { + /** + * Cannot be constructed. + */ + private constructor() { + // eslint-disable-next-line @typescript-eslint/no-empty-function + } + + static signSetMinterApproval = async ( + minterContract: Contract, + minter: Account, + approval: boolean, + user: Signer & TypedDataSigner, + deadline: BigNumberish = MAX_DEADLINE, + nonce?: BigNumberish + ): Promise<{ v: number; r: string; s: string; deadline: BigNumber }> => { + const { chainId } = await minterContract.provider.getNetwork(); + if (!nonce) { + const userAddress = await user.getAddress(); + nonce = (await minterContract.getNextNonce(userAddress)) as BigNumberish; + } + + const domain = { + name: 'Balancer Minter', + version: '1', + chainId, + verifyingContract: minterContract.address, + }; + + const types = { + SetMinterApproval: [ + { name: 'minter', type: 'address' }, + { name: 'approval', type: 'bool' }, + { name: 'nonce', type: 'uint256' }, + { name: 'deadline', type: 'uint256' }, + ], + }; + + const value = { + minter: await accountToAddress(minter), + approval, + nonce: nonce.toString(), + deadline: deadline.toString(), + }; + + const signature = await user._signTypedData(domain, types, value); + + return { ...splitSignature(signature), deadline: BigNumber.from(deadline) }; + }; +} diff --git a/balpy/balancer-deployments/src/helpers/models/pools/stable/encoder.ts b/balpy/balancer-deployments/src/helpers/models/pools/stable/encoder.ts new file mode 100644 index 0000000..299ef36 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/models/pools/stable/encoder.ts @@ -0,0 +1,89 @@ +import { defaultAbiCoder } from '@ethersproject/abi'; +import { BigNumberish } from '@ethersproject/bignumber'; + +export enum StablePoolJoinKind { + INIT = 0, + EXACT_TOKENS_IN_FOR_BPT_OUT, + TOKEN_IN_FOR_EXACT_BPT_OUT, + ALL_TOKENS_IN_FOR_EXACT_BPT_OUT, +} + +export enum StablePoolExitKind { + EXACT_BPT_IN_FOR_ONE_TOKEN_OUT = 0, + BPT_IN_FOR_EXACT_TOKENS_OUT, + EXACT_BPT_IN_FOR_ALL_TOKENS_OUT, +} + +export class StablePoolEncoder { + /** + * Cannot be constructed. + */ + private constructor() { + // eslint-disable-next-line @typescript-eslint/no-empty-function + } + + /** + * Encodes the userData parameter for providing the initial liquidity to a StablePool + * @param initialBalances - the amounts of tokens to send to the pool to form the initial balances + */ + static joinInit = (amountsIn: BigNumberish[]): string => + defaultAbiCoder.encode(['uint256', 'uint256[]'], [StablePoolJoinKind.INIT, amountsIn]); + + /** + * Encodes the userData parameter for joining a StablePool with exact token inputs + * @param amountsIn - the amounts each of token to deposit in the pool as liquidity + * @param minimumBPT - the minimum acceptable BPT to receive in return for deposited tokens + */ + static joinExactTokensInForBPTOut = (amountsIn: BigNumberish[], minimumBPT: BigNumberish): string => + defaultAbiCoder.encode( + ['uint256', 'uint256[]', 'uint256'], + [StablePoolJoinKind.EXACT_TOKENS_IN_FOR_BPT_OUT, amountsIn, minimumBPT] + ); + + /** + * Encodes the userData parameter for joining a StablePool with to receive an exact amount of BPT + * @param bptAmountOut - the amount of BPT to be minted + * @param enterTokenIndex - the index of the token to be provided as liquidity + */ + static joinTokenInForExactBPTOut = (bptAmountOut: BigNumberish, enterTokenIndex: number): string => + defaultAbiCoder.encode( + ['uint256', 'uint256', 'uint256'], + [StablePoolJoinKind.TOKEN_IN_FOR_EXACT_BPT_OUT, bptAmountOut, enterTokenIndex] + ); + + /** + * Encodes the userData parameter for joining a StablePool proportionally + * @param bptAmountOut - the amount of BPT to be minted + */ + static joinAllTokensInForExactBptOut = (bptAmountOut: BigNumberish): string => + defaultAbiCoder.encode(['uint256', 'uint256'], [StablePoolJoinKind.ALL_TOKENS_IN_FOR_EXACT_BPT_OUT, bptAmountOut]); + + /** + * Encodes the userData parameter for exiting a StablePool by removing a single token in return for an exact amount of BPT + * @param bptAmountIn - the amount of BPT to be burned + * @param exitTokenIndex - the index of the token to removed from the pool + */ + static exitExactBPTInForOneTokenOut = (bptAmountIn: BigNumberish, exitTokenIndex: number): string => + defaultAbiCoder.encode( + ['uint256', 'uint256', 'uint256'], + [StablePoolExitKind.EXACT_BPT_IN_FOR_ONE_TOKEN_OUT, bptAmountIn, exitTokenIndex] + ); + + /** + * Encodes the userData parameter for exiting a StablePool by removing exact amounts of tokens + * @param amountsOut - the amounts of each token to be withdrawn from the pool + * @param maxBPTAmountIn - the minimum acceptable BPT to burn in return for withdrawn tokens + */ + static exitBPTInForExactTokensOut = (amountsOut: BigNumberish[], maxBPTAmountIn: BigNumberish): string => + defaultAbiCoder.encode( + ['uint256', 'uint256[]', 'uint256'], + [StablePoolExitKind.BPT_IN_FOR_EXACT_TOKENS_OUT, amountsOut, maxBPTAmountIn] + ); + + /** + * Encodes the userData parameter for exiting a StablePool proportionally + * @param bptAmountIn - the amount of BPT to burn in exchange for withdrawn tokens + */ + static exitExactBptInForTokensOut = (bptAmountIn: BigNumberish): string => + defaultAbiCoder.encode(['uint256', 'uint256'], [StablePoolExitKind.EXACT_BPT_IN_FOR_ALL_TOKENS_OUT, bptAmountIn]); +} diff --git a/balpy/balancer-deployments/src/helpers/models/pools/stable/math.ts b/balpy/balancer-deployments/src/helpers/models/pools/stable/math.ts new file mode 100644 index 0000000..5b512aa --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/models/pools/stable/math.ts @@ -0,0 +1,392 @@ +import { Decimal } from 'decimal.js'; +import { BigNumber } from 'ethers'; + +import { BigNumberish, decimal, bn, fp, fromFp, toFp } from '../../../numbers'; + +export function calculateInvariant(fpRawBalances: BigNumberish[], amplificationParameter: BigNumberish): BigNumber { + return calculateApproxInvariant(fpRawBalances, amplificationParameter); +} + +export function calculateApproxInvariant( + fpRawBalances: BigNumberish[], + amplificationParameter: BigNumberish +): BigNumber { + const totalCoins = fpRawBalances.length; + const balances = fpRawBalances.map(fromFp); + + const sum = balances.reduce((a, b) => a.add(b), decimal(0)); + + if (sum.isZero()) { + return bn(0); + } + + let inv = sum; + let prevInv = decimal(0); + const ampTimesTotal = decimal(amplificationParameter).mul(totalCoins); + + for (let i = 0; i < 255; i++) { + let P_D = balances[0].mul(totalCoins); + for (let j = 1; j < totalCoins; j++) { + P_D = P_D.mul(balances[j]).mul(totalCoins).div(inv); + } + + prevInv = inv; + inv = decimal(totalCoins) + .mul(inv) + .mul(inv) + .add(ampTimesTotal.mul(sum).mul(P_D)) + .div(decimal(totalCoins).add(1).mul(inv).add(ampTimesTotal.sub(1).mul(P_D))); + + // converge with precision of integer 1 + if (inv.gt(prevInv)) { + if (fp(inv).sub(fp(prevInv)).lte(1)) { + break; + } + } else if (fp(prevInv).sub(fp(inv)).lte(1)) { + break; + } + } + + return fp(inv); +} + +export function calculateAnalyticalInvariantForTwoTokens( + fpRawBalances: BigNumberish[], + amplificationParameter: BigNumberish +): BigNumber { + if (fpRawBalances.length !== 2) { + throw 'Analytical invariant is solved only for 2 balances'; + } + + const sum = fpRawBalances.reduce((a: Decimal, b: BigNumberish) => a.add(fromFp(b)), decimal(0)); + const prod = fpRawBalances.reduce((a: Decimal, b: BigNumberish) => a.mul(fromFp(b)), decimal(1)); + + // The amplification parameter equals to: A n^(n-1), where A is the amplification coefficient + const amplificationCoefficient = decimal(amplificationParameter).div(2); + + //Q + const q = amplificationCoefficient.mul(-16).mul(sum).mul(prod); + + //P + const p = amplificationCoefficient.minus(decimal(1).div(4)).mul(16).mul(prod); + + //C + const c = q + .pow(2) + .div(4) + .add(p.pow(3).div(27)) + .pow(1 / 2) + .minus(q.div(2)) + .pow(1 / 3); + + const invariant = c.minus(p.div(c.mul(3))); + return fp(invariant); +} + +export function calcOutGivenIn( + fpBalances: BigNumberish[], + amplificationParameter: BigNumberish, + tokenIndexIn: number, + tokenIndexOut: number, + fpTokenAmountIn: BigNumberish +): Decimal { + const invariant = fromFp(calculateInvariant(fpBalances, amplificationParameter)); + + const balances = fpBalances.map(fromFp); + balances[tokenIndexIn] = balances[tokenIndexIn].add(fromFp(fpTokenAmountIn)); + + const finalBalanceOut = _getTokenBalanceGivenInvariantAndAllOtherBalances( + balances, + decimal(amplificationParameter), + invariant, + tokenIndexOut + ); + + return toFp(balances[tokenIndexOut].sub(finalBalanceOut)); +} + +export function calcInGivenOut( + fpBalances: BigNumberish[], + amplificationParameter: BigNumberish, + tokenIndexIn: number, + tokenIndexOut: number, + fpTokenAmountOut: BigNumberish +): Decimal { + const invariant = fromFp(calculateInvariant(fpBalances, amplificationParameter)); + + const balances = fpBalances.map(fromFp); + balances[tokenIndexOut] = balances[tokenIndexOut].sub(fromFp(fpTokenAmountOut)); + + const finalBalanceIn = _getTokenBalanceGivenInvariantAndAllOtherBalances( + balances, + decimal(amplificationParameter), + invariant, + tokenIndexIn + ); + + return toFp(finalBalanceIn.sub(balances[tokenIndexIn])); +} + +export function calcBptOutGivenExactTokensIn( + fpBalances: BigNumberish[], + amplificationParameter: BigNumberish, + fpAmountsIn: BigNumberish[], + fpBptTotalSupply: BigNumberish, + fpCurrentInvariant: BigNumberish, + fpSwapFeePercentage: BigNumberish +): BigNumberish { + // Get current invariant + const currentInvariant = fromFp(fpCurrentInvariant); + + const balances = fpBalances.map(fromFp); + const amountsIn = fpAmountsIn.map(fromFp); + + // First calculate the sum of all token balances which will be used to calculate + // the current weights of each token relative to the sum of all balances + const sumBalances = balances.reduce((a: Decimal, b: Decimal) => a.add(b), decimal(0)); + + // Calculate the weighted balance ratio without considering fees + const balanceRatiosWithFee = []; + // The weighted sum of token balance rations sans fee + let invariantRatioWithFees = decimal(0); + for (let i = 0; i < balances.length; i++) { + const currentWeight = balances[i].div(sumBalances); + balanceRatiosWithFee[i] = balances[i].add(amountsIn[i]).div(balances[i]); + invariantRatioWithFees = invariantRatioWithFees.add(balanceRatiosWithFee[i].mul(currentWeight)); + } + + // Second loop to calculate new amounts in taking into account the fee on the % excess + for (let i = 0; i < balances.length; i++) { + let amountInWithoutFee; + + // Check if the balance ratio is greater than the ideal ratio to charge fees or not + if (balanceRatiosWithFee[i].gt(invariantRatioWithFees)) { + const nonTaxableAmount = balances[i].mul(invariantRatioWithFees.sub(1)); + const taxableAmount = amountsIn[i].sub(nonTaxableAmount); + amountInWithoutFee = nonTaxableAmount.add(taxableAmount.mul(decimal(1).sub(fromFp(fpSwapFeePercentage)))); + } else { + amountInWithoutFee = amountsIn[i]; + } + + balances[i] = balances[i].add(amountInWithoutFee); + } + + // Calculate the new invariant, taking swap fees into account + const newInvariant = fromFp(calculateInvariant(balances.map(fp), amplificationParameter)); + const invariantRatio = newInvariant.div(currentInvariant); + + if (invariantRatio.gt(1)) { + return fp(fromFp(fpBptTotalSupply).mul(invariantRatio.sub(1))); + } else { + return bn(0); + } +} + +export function calcTokenInGivenExactBptOut( + tokenIndex: number, + fpBalances: BigNumberish[], + amplificationParameter: BigNumberish, + fpBptAmountOut: BigNumberish, + fpBptTotalSupply: BigNumberish, + fpCurrentInvariant: BigNumberish, + fpSwapFeePercentage: BigNumberish +): BigNumberish { + // Calculate new invariant + const newInvariant = fromFp(bn(fpBptTotalSupply).add(fpBptAmountOut)) + .div(fromFp(fpBptTotalSupply)) + .mul(fromFp(fpCurrentInvariant)); + + // First calculate the sum of all token balances which will be used to calculate + // the current weight of token + const balances = fpBalances.map(fromFp); + const sumBalances = balances.reduce((a: Decimal, b: Decimal) => a.add(b), decimal(0)); + + // Calculate amount in without fee. + const newBalanceTokenIndex = _getTokenBalanceGivenInvariantAndAllOtherBalances( + balances, + amplificationParameter, + newInvariant, + tokenIndex + ); + + const amountInWithoutFee = newBalanceTokenIndex.sub(balances[tokenIndex]); + + // We can now compute how much extra balance is being deposited and used in virtual swaps, and charge swap fees + // accordingly. + const currentWeight = balances[tokenIndex].div(sumBalances); + const taxablePercentage = currentWeight.gt(1) ? 0 : decimal(1).sub(currentWeight); + const taxableAmount = amountInWithoutFee.mul(taxablePercentage); + const nonTaxableAmount = amountInWithoutFee.sub(taxableAmount); + + const bptOut = nonTaxableAmount.add(taxableAmount.div(decimal(1).sub(fromFp(fpSwapFeePercentage)))); + + return fp(bptOut); +} + +export function calcBptInGivenExactTokensOut( + fpBalances: BigNumberish[], + amplificationParameter: BigNumberish, + fpAmountsOut: BigNumberish[], + fpBptTotalSupply: BigNumberish, + fpCurrentInvariant: BigNumberish, + fpSwapFeePercentage: BigNumberish +): BigNumber { + // Get current invariant + const currentInvariant = fromFp(fpCurrentInvariant); + + const balances = fpBalances.map(fromFp); + const amountsOut = fpAmountsOut.map(fromFp); + + // First calculate the sum of all token balances which will be used to calculate + // the current weight of token + const sumBalances = balances.reduce((a: Decimal, b: Decimal) => a.add(b), decimal(0)); + + // Calculate the weighted balance ratio without considering fees + const balanceRatiosWithoutFee = []; + let invariantRatioWithoutFees = decimal(0); + for (let i = 0; i < balances.length; i++) { + const currentWeight = balances[i].div(sumBalances); + balanceRatiosWithoutFee[i] = balances[i].sub(amountsOut[i]).div(balances[i]); + invariantRatioWithoutFees = invariantRatioWithoutFees.add(balanceRatiosWithoutFee[i].mul(currentWeight)); + } + + // Second loop to calculate new amounts in taking into account the fee on the % excess + for (let i = 0; i < balances.length; i++) { + // Swap fees are typically charged on 'token in', but there is no 'token in' here, so we apply it to + // 'token out'. This results in slightly larger price impact. + + let amountOutWithFee; + if (invariantRatioWithoutFees.gt(balanceRatiosWithoutFee[i])) { + const invariantRatioComplement = invariantRatioWithoutFees.gt(1) + ? decimal(0) + : decimal(1).sub(invariantRatioWithoutFees); + const nonTaxableAmount = balances[i].mul(invariantRatioComplement); + const taxableAmount = amountsOut[i].sub(nonTaxableAmount); + amountOutWithFee = nonTaxableAmount.add(taxableAmount.div(decimal(1).sub(fromFp(fpSwapFeePercentage)))); + } else { + amountOutWithFee = amountsOut[i]; + } + + balances[i] = balances[i].sub(amountOutWithFee); + } + + // get new invariant taking into account swap fees + const newInvariant = fromFp(calculateInvariant(balances.map(fp), amplificationParameter)); + + // return amountBPTIn + const invariantRatio = newInvariant.div(currentInvariant); + const invariantRatioComplement = invariantRatio.lt(1) ? decimal(1).sub(invariantRatio) : decimal(0); + return fp(fromFp(fpBptTotalSupply).mul(invariantRatioComplement)); +} + +export function calcTokenOutGivenExactBptIn( + tokenIndex: number, + fpBalances: BigNumberish[], + amplificationParameter: BigNumberish, + fpBptAmountIn: BigNumberish, + fpBptTotalSupply: BigNumberish, + fpCurrentInvariant: BigNumberish, + fpSwapFeePercentage: BigNumberish +): BigNumberish { + // Calculate new invariant + const newInvariant = fromFp(bn(fpBptTotalSupply).sub(fpBptAmountIn)) + .div(fromFp(fpBptTotalSupply)) + .mul(fromFp(fpCurrentInvariant)); + + // First calculate the sum of all token balances which will be used to calculate + // the current weight of token + const balances = fpBalances.map(fromFp); + const sumBalances = balances.reduce((a: Decimal, b: Decimal) => a.add(b), decimal(0)); + + // get amountOutBeforeFee + const newBalanceTokenIndex = _getTokenBalanceGivenInvariantAndAllOtherBalances( + balances, + amplificationParameter, + newInvariant, + tokenIndex + ); + const amountOutWithoutFee = balances[tokenIndex].sub(newBalanceTokenIndex); + + // We can now compute how much excess balance is being withdrawn as a result of the virtual swaps, which result + // in swap fees. + const currentWeight = balances[tokenIndex].div(sumBalances); + const taxablePercentage = currentWeight.gt(1) ? decimal(0) : decimal(1).sub(currentWeight); + + // Swap fees are typically charged on 'token in', but there is no 'token in' here, so we apply it + // to 'token out'. This results in slightly larger price impact. Fees are rounded up. + const taxableAmount = amountOutWithoutFee.mul(taxablePercentage); + const nonTaxableAmount = amountOutWithoutFee.sub(taxableAmount); + const tokenOut = nonTaxableAmount.add(taxableAmount.mul(decimal(1).sub(fromFp(fpSwapFeePercentage)))); + return fp(tokenOut); +} + +export function calculateOneTokenSwapFeeAmount( + fpBalances: BigNumberish[], + amplificationParameter: BigNumberish, + lastInvariant: BigNumberish, + tokenIndex: number +): Decimal { + const balances = fpBalances.map(fromFp); + + const finalBalanceFeeToken = _getTokenBalanceGivenInvariantAndAllOtherBalances( + balances, + decimal(amplificationParameter), + fromFp(lastInvariant), + tokenIndex + ); + + if (finalBalanceFeeToken.gt(balances[tokenIndex])) { + return decimal(0); + } + + return toFp(balances[tokenIndex].sub(finalBalanceFeeToken)); +} + +// The amp factor input must be a number: *not* multiplied by the precision +export function getTokenBalanceGivenInvariantAndAllOtherBalances( + amp: number, + fpBalances: BigNumber[], + fpInvariant: BigNumber, + tokenIndex: number +): BigNumber { + const invariant = fromFp(fpInvariant); + const balances = fpBalances.map(fromFp); + return fp(_getTokenBalanceGivenInvariantAndAllOtherBalances(balances, decimal(amp), invariant, tokenIndex)); +} + +function _getTokenBalanceGivenInvariantAndAllOtherBalances( + balances: Decimal[], + amplificationParameter: Decimal | BigNumberish, + invariant: Decimal, + tokenIndex: number +): Decimal { + let sum = decimal(0); + let mul = decimal(1); + const numTokens = balances.length; + + for (let i = 0; i < numTokens; i++) { + if (i != tokenIndex) { + sum = sum.add(balances[i]); + mul = mul.mul(balances[i]); + } + } + + // const a = 1; + amplificationParameter = decimal(amplificationParameter); + const b = invariant.div(amplificationParameter.mul(numTokens)).add(sum).sub(invariant); + const c = invariant + .pow(numTokens + 1) + .mul(-1) + .div( + amplificationParameter.mul( + decimal(numTokens) + .pow(numTokens + 1) + .mul(mul) + ) + ); + + return b + .mul(-1) + .add(b.pow(2).sub(c.mul(4)).squareRoot()) + .div(2); +} diff --git a/balpy/balancer-deployments/src/helpers/models/pools/utils/encoder.ts b/balpy/balancer-deployments/src/helpers/models/pools/utils/encoder.ts new file mode 100644 index 0000000..d02ab90 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/models/pools/utils/encoder.ts @@ -0,0 +1,25 @@ +import { defaultAbiCoder } from '@ethersproject/abi'; +import { BigNumberish } from '@ethersproject/bignumber'; + +// RECOVERY_MODE must match BasePoolUserData.RECOVERY_MODE_EXIT_KIND, the value that +// (Legacy)BasePool uses to detect the special exit enabled in recovery mode. +export enum BasePoolExitKind { + RECOVERY_MODE = 255, +} + +export class BasePoolEncoder { + /** + * Cannot be constructed. + */ + private constructor() { + // eslint-disable-next-line @typescript-eslint/no-empty-function + } + + /** + * Encodes the userData parameter for exiting any Pool in recovery mode, by removing tokens in return for + * an exact amount of BPT + * @param bptAmountIn - the amount of BPT to be burned + */ + static recoveryModeExit = (bptAmountIn: BigNumberish): string => + defaultAbiCoder.encode(['uint256', 'uint256'], [BasePoolExitKind.RECOVERY_MODE, bptAmountIn]); +} diff --git a/balpy/balancer-deployments/src/helpers/models/pools/weighted/encoder.ts b/balpy/balancer-deployments/src/helpers/models/pools/weighted/encoder.ts new file mode 100644 index 0000000..f8645de --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/models/pools/weighted/encoder.ts @@ -0,0 +1,110 @@ +import { defaultAbiCoder } from '@ethersproject/abi'; +import { BigNumberish } from '@ethersproject/bignumber'; + +export enum WeightedPoolJoinKind { + INIT = 0, + EXACT_TOKENS_IN_FOR_BPT_OUT, + TOKEN_IN_FOR_EXACT_BPT_OUT, + ALL_TOKENS_IN_FOR_EXACT_BPT_OUT, + ADD_TOKEN, +} + +export enum WeightedPoolExitKind { + EXACT_BPT_IN_FOR_ONE_TOKEN_OUT = 0, + EXACT_BPT_IN_FOR_TOKENS_OUT, + BPT_IN_FOR_EXACT_TOKENS_OUT, + REMOVE_TOKEN, +} + +export class WeightedPoolEncoder { + /** + * Cannot be constructed. + */ + private constructor() { + // eslint-disable-next-line @typescript-eslint/no-empty-function + } + + /** + * Encodes the userData parameter for providing the initial liquidity to a WeightedPool + * @param initialBalances - the amounts of tokens to send to the pool to form the initial balances + */ + static joinInit = (amountsIn: BigNumberish[]): string => + defaultAbiCoder.encode(['uint256', 'uint256[]'], [WeightedPoolJoinKind.INIT, amountsIn]); + + /** + * Encodes the userData parameter for joining a WeightedPool with exact token inputs + * @param amountsIn - the amounts each of token to deposit in the pool as liquidity + * @param minimumBPT - the minimum acceptable BPT to receive in return for deposited tokens + */ + static joinExactTokensInForBPTOut = (amountsIn: BigNumberish[], minimumBPT: BigNumberish): string => + defaultAbiCoder.encode( + ['uint256', 'uint256[]', 'uint256'], + [WeightedPoolJoinKind.EXACT_TOKENS_IN_FOR_BPT_OUT, amountsIn, minimumBPT] + ); + + /** + * Encodes the userData parameter for joining a WeightedPool with a single token to receive an exact amount of BPT + * @param bptAmountOut - the amount of BPT to be minted + * @param enterTokenIndex - the index of the token to be provided as liquidity + */ + static joinTokenInForExactBPTOut = (bptAmountOut: BigNumberish, enterTokenIndex: number): string => + defaultAbiCoder.encode( + ['uint256', 'uint256', 'uint256'], + [WeightedPoolJoinKind.TOKEN_IN_FOR_EXACT_BPT_OUT, bptAmountOut, enterTokenIndex] + ); + + /** + * Encodes the userData parameter for joining a WeightedPool proportionally to receive an exact amount of BPT + * @param bptAmountOut - the amount of BPT to be minted + */ + static joinAllTokensInForExactBPTOut = (bptAmountOut: BigNumberish): string => + defaultAbiCoder.encode( + ['uint256', 'uint256'], + [WeightedPoolJoinKind.ALL_TOKENS_IN_FOR_EXACT_BPT_OUT, bptAmountOut] + ); + + /** + * Encodes the userData parameter for exiting a WeightedPool by removing a single token in return for an exact amount of BPT + * @param bptAmountIn - the amount of BPT to be burned + * @param enterTokenIndex - the index of the token to removed from the pool + */ + static exitExactBPTInForOneTokenOut = (bptAmountIn: BigNumberish, exitTokenIndex: number): string => + defaultAbiCoder.encode( + ['uint256', 'uint256', 'uint256'], + [WeightedPoolExitKind.EXACT_BPT_IN_FOR_ONE_TOKEN_OUT, bptAmountIn, exitTokenIndex] + ); + + /** + * Encodes the userData parameter for exiting a WeightedPool by removing tokens in return for an exact amount of BPT + * @param bptAmountIn - the amount of BPT to be burned + */ + static exitExactBPTInForTokensOut = (bptAmountIn: BigNumberish): string => + defaultAbiCoder.encode(['uint256', 'uint256'], [WeightedPoolExitKind.EXACT_BPT_IN_FOR_TOKENS_OUT, bptAmountIn]); + + /** + * Encodes the userData parameter for exiting a WeightedPool by removing exact amounts of tokens + * @param amountsOut - the amounts of each token to be withdrawn from the pool + * @param maxBPTAmountIn - the minimum acceptable BPT to burn in return for withdrawn tokens + */ + static exitBPTInForExactTokensOut = (amountsOut: BigNumberish[], maxBPTAmountIn: BigNumberish): string => + defaultAbiCoder.encode( + ['uint256', 'uint256[]', 'uint256'], + [WeightedPoolExitKind.BPT_IN_FOR_EXACT_TOKENS_OUT, amountsOut, maxBPTAmountIn] + ); +} + +export class ManagedPoolEncoder { + /** + * Cannot be constructed. + */ + private constructor() { + // eslint-disable-next-line @typescript-eslint/no-empty-function + } + + /** + * Encodes the userData parameter for exiting a ManagedPool to remove a token. + * This can only be done by the pool owner. + */ + static exitForRemoveToken = (tokenIndex: BigNumberish): string => + defaultAbiCoder.encode(['uint256', 'uint256'], [WeightedPoolExitKind.REMOVE_TOKEN, tokenIndex]); +} diff --git a/balpy/balancer-deployments/src/helpers/models/pools/weighted/math.ts b/balpy/balancer-deployments/src/helpers/models/pools/weighted/math.ts new file mode 100644 index 0000000..85bff50 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/models/pools/weighted/math.ts @@ -0,0 +1,237 @@ +import { Decimal } from 'decimal.js'; +import { BigNumber } from 'ethers'; + +import { BigNumberish, bn, decimal, fp, fromFp, toFp, fpMul, fpDiv, FP_ONE, FP_100_PCT } from '../../../numbers'; + +export function calculateInvariant(fpRawBalances: BigNumberish[], fpRawWeights: BigNumberish[]): BigNumber { + const normalizedWeights = fpRawWeights.map(fromFp); + const balances = fpRawBalances.map(decimal); + const invariant = balances.reduce((inv, balance, i) => inv.mul(balance.pow(normalizedWeights[i])), decimal(1)); + return bn(invariant); +} + +export function calcOutGivenIn( + fpBalanceIn: BigNumberish, + fpWeightIn: BigNumberish, + fpBalanceOut: BigNumberish, + fpWeightOut: BigNumberish, + fpAmountIn: BigNumberish +): Decimal { + const newBalance = fromFp(fpBalanceIn).add(fromFp(fpAmountIn)); + const base = fromFp(fpBalanceIn).div(newBalance); + const exponent = fromFp(fpWeightIn).div(fromFp(fpWeightOut)); + const ratio = decimal(1).sub(base.pow(exponent)); + return toFp(fromFp(fpBalanceOut).mul(ratio)); +} + +export function calcInGivenOut( + fpBalanceIn: BigNumberish, + fpWeightIn: BigNumberish, + fpBalanceOut: BigNumberish, + fpWeightOut: BigNumberish, + fpAmountOut: BigNumberish +): Decimal { + const newBalance = fromFp(fpBalanceOut).sub(fromFp(fpAmountOut)); + const base = fromFp(fpBalanceOut).div(newBalance); + const exponent = fromFp(fpWeightOut).div(fromFp(fpWeightIn)); + const ratio = base.pow(exponent).sub(1); + return toFp(fromFp(fpBalanceIn).mul(ratio)); +} + +export function calcBptOutGivenExactTokensIn( + fpBalances: BigNumberish[], + fpWeights: BigNumberish[], + fpAmountsIn: BigNumberish[], + fpBptTotalSupply: BigNumberish, + fpSwapFeePercentage: BigNumberish +): BigNumberish { + const weights = fpWeights.map(fromFp); + const balances = fpBalances.map(fromFp); + const amountsIn = fpAmountsIn.map(fromFp); + const bptTotalSupply = fromFp(fpBptTotalSupply); + + const balanceRatiosWithFee = []; + let invariantRatioWithFees = decimal(0); + for (let i = 0; i < balances.length; i++) { + balanceRatiosWithFee[i] = balances[i].add(amountsIn[i]).div(balances[i]); + invariantRatioWithFees = invariantRatioWithFees.add(balanceRatiosWithFee[i].mul(weights[i])); + } + + let invariantRatio = decimal(1); + for (let i = 0; i < balances.length; i++) { + let amountInWithoutFee; + + if (balanceRatiosWithFee[i].gt(invariantRatioWithFees)) { + const nonTaxableAmount = balances[i].mul(invariantRatioWithFees.sub(1)); + const taxableAmount = amountsIn[i].sub(nonTaxableAmount); + amountInWithoutFee = nonTaxableAmount.add(taxableAmount.mul(decimal(1).sub(fromFp(fpSwapFeePercentage)))); + } else { + amountInWithoutFee = amountsIn[i]; + } + + const tokenBalanceRatio = balances[i].add(amountInWithoutFee).div(balances[i]); + + invariantRatio = invariantRatio.mul(tokenBalanceRatio.pow(weights[i])); + } + + const bptOut = bptTotalSupply.mul(invariantRatio.sub(1)); + return fp(bptOut); +} + +export function calcTokenInGivenExactBptOut( + tokenIndex: number, + fpBalances: BigNumberish[], + fpWeights: BigNumberish[], + fpBptAmountOut: BigNumberish, + fpBptTotalSupply: BigNumberish, + fpSwapFeePercentage: BigNumberish +): BigNumberish { + const bptAmountOut = fromFp(fpBptAmountOut); + const bptTotalSupply = fromFp(fpBptTotalSupply); + const weight = fromFp(fpWeights[tokenIndex]); + const balance = fpBalances.map(fromFp)[tokenIndex]; + const swapFeePercentage = fromFp(fpSwapFeePercentage); + + const invariantRatio = bptTotalSupply.add(bptAmountOut).div(bptTotalSupply); + const tokenBalanceRatio = invariantRatio.pow(decimal(1).div(weight)); + const tokenBalancePercentageExcess = decimal(1).sub(weight); + const amountInAfterFee = balance.mul(tokenBalanceRatio.sub(decimal(1))); + + const amountIn = amountInAfterFee.div(decimal(1).sub(tokenBalancePercentageExcess.mul(swapFeePercentage))); + return fp(amountIn); +} + +export function calcBptInGivenExactTokensOut( + fpBalances: BigNumber[], + fpWeights: BigNumber[], + fpAmountsOut: BigNumber[], + fpBptTotalSupply: BigNumber, + fpSwapFeePercentage: BigNumber +): BigNumber { + const swapFeePercentage = fromFp(fpSwapFeePercentage); + const weights = fpWeights.map(fromFp); + const balances = fpBalances.map(fromFp); + const amountsOut = fpAmountsOut.map(fromFp); + const bptTotalSupply = fromFp(fpBptTotalSupply); + + const balanceRatiosWithoutFee = []; + let weightedBalanceRatio = decimal(0); + for (let i = 0; i < balances.length; i++) { + const balanceRatioWithoutFee = balances[i].sub(amountsOut[i]).div(balances[i]); + balanceRatiosWithoutFee.push(balanceRatioWithoutFee); + weightedBalanceRatio = weightedBalanceRatio.add(balanceRatioWithoutFee.mul(weights[i])); + } + + let invariantRatio = decimal(1); + for (let i = 0; i < balances.length; i++) { + const tokenBalancePercentageExcess = weightedBalanceRatio.lte(balanceRatiosWithoutFee[i]) + ? 0 + : weightedBalanceRatio.sub(balanceRatiosWithoutFee[i]).div(decimal(1).sub(balanceRatiosWithoutFee[i])); + + const amountOutBeforeFee = amountsOut[i].div(decimal(1).sub(swapFeePercentage.mul(tokenBalancePercentageExcess))); + const tokenBalanceRatio = decimal(1).sub(amountOutBeforeFee.div(balances[i])); + invariantRatio = invariantRatio.mul(tokenBalanceRatio.pow(weights[i])); + } + + const bptIn = bptTotalSupply.mul(decimal(1).sub(invariantRatio)); + return fp(bptIn); +} + +export function calcTokenOutGivenExactBptIn( + tokenIndex: number, + fpBalances: BigNumberish[], + fpWeights: BigNumberish[], + fpBptAmountIn: BigNumberish, + fpBptTotalSupply: BigNumberish, + fpSwapFeePercentage: BigNumberish +): BigNumberish { + const bptAmountIn = fromFp(fpBptAmountIn); + const bptTotalSupply = fromFp(fpBptTotalSupply); + const swapFeePercentage = fromFp(fpSwapFeePercentage); + const weight = fromFp(fpWeights[tokenIndex]); + const balance = fpBalances.map(fromFp)[tokenIndex]; + + const invariantRatio = bptTotalSupply.sub(bptAmountIn).div(bptTotalSupply); + const tokenBalanceRatio = invariantRatio.pow(decimal(1).div(weight)); + const tokenBalancePercentageExcess = decimal(1).sub(weight); + const amountOutBeforeFee = balance.mul(decimal(1).sub(tokenBalanceRatio)); + + const amountOut = amountOutBeforeFee.mul(decimal(1).sub(tokenBalancePercentageExcess.mul(swapFeePercentage))); + return fp(amountOut); +} + +export function calcTokensOutGivenExactBptIn( + fpBalances: BigNumberish[], + fpBptAmountIn: BigNumberish, + fpBptTotalSupply: BigNumberish +): BigNumber[] { + const balances = fpBalances.map(fromFp); + const bptRatio = fromFp(fpBptAmountIn).div(fromFp(fpBptTotalSupply)); + const amountsOut = balances.map((balance) => balance.mul(bptRatio)); + return amountsOut.map(fp); +} + +export function calculateOneTokenSwapFeeAmount( + fpBalances: BigNumberish[], + fpWeights: BigNumberish[], + lastInvariant: BigNumberish, + tokenIndex: number +): Decimal { + const balance = fpBalances.map(fromFp)[tokenIndex]; + const weight = fromFp(fpWeights[tokenIndex]); + const exponent = decimal(1).div(weight); + const currentInvariant = calculateInvariant(fpBalances, fpWeights); + const invariantRatio = decimal(lastInvariant).div(decimal(currentInvariant)); + const accruedFees = balance.mul(decimal(1).sub(invariantRatio.pow(exponent))); + + return toFp(accruedFees); +} + +export function calculateBPTSwapFeeAmount( + fpInvariantGrowthRatio: BigNumberish, + preSupply: BigNumberish, + postSupply: BigNumberish, + fpProtocolSwapFeePercentage: BigNumberish +): BigNumber { + const supplyGrowthRatio = fpDiv(postSupply, preSupply); + + if (bn(fpInvariantGrowthRatio).lte(supplyGrowthRatio)) { + return bn(0); + } + const swapFeePercentage = FP_100_PCT.sub(fpDiv(supplyGrowthRatio, fpInvariantGrowthRatio)); + const k = fpMul(swapFeePercentage, fpProtocolSwapFeePercentage); + + const numerator = bn(postSupply).mul(k); + const denominator = FP_ONE.sub(k); + + return numerator.div(denominator); +} + +export function calculateMaxOneTokenSwapFeeAmount( + fpBalances: BigNumberish[], + fpWeights: BigNumberish[], + fpMinInvariantRatio: BigNumberish, + tokenIndex: number +): Decimal { + const balance = fpBalances.map(fromFp)[tokenIndex]; + const weight = fromFp(fpWeights[tokenIndex]); + + const exponent = decimal(1).div(weight); + const maxAccruedFees = balance.mul(decimal(1).sub(fromFp(fpMinInvariantRatio).pow(exponent))); + + return toFp(maxAccruedFees); +} + +export function calculateSpotPrice(fpBalances: BigNumberish[], fpWeights: BigNumberish[]): BigNumber { + const numerator = fromFp(fpBalances[0]).div(fromFp(fpWeights[0])); + const denominator = fromFp(fpBalances[1]).div(fromFp(fpWeights[1])); + return bn(toFp(numerator.div(denominator)).toFixed(0)); +} + +export function calculateBPTPrice( + fpBalance: BigNumberish, + fpWeight: BigNumberish, + totalSupply: BigNumberish +): BigNumber { + return bn(toFp(fromFp(fpBalance).div(fromFp(fpWeight)).div(fromFp(totalSupply))).toFixed(0)); +} diff --git a/balpy/balancer-deployments/src/helpers/models/pools/weighted/normalizedWeights.ts b/balpy/balancer-deployments/src/helpers/models/pools/weighted/normalizedWeights.ts new file mode 100644 index 0000000..05966ae --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/models/pools/weighted/normalizedWeights.ts @@ -0,0 +1,45 @@ +import { BigNumber, BigNumberish } from '@ethersproject/bignumber'; +import { Zero, WeiPerEther as ONE } from '@ethersproject/constants'; + +// Should match MAX_WEIGHTED_TOKENS from v2-helpers/constants +// Including would introduce a dependency +const MaxWeightedTokens = 100; + +/** + * Normalize an array of token weights to ensure they sum to `1e18` + * @param weights - an array of token weights to be normalized + * @returns an equivalent set of normalized weights + */ +export function toNormalizedWeights(weights: BigNumber[]): BigNumber[] { + // When the number is exactly equal to the max, normalizing with common inputs + // leads to a value < 0.01, which reverts. In this case fill in the weights exactly. + if (weights.length == MaxWeightedTokens) { + return Array(MaxWeightedTokens).fill(ONE.div(MaxWeightedTokens)); + } + + const sum = weights.reduce((total, weight) => total.add(weight), Zero); + if (sum.eq(ONE)) return weights; + + const normalizedWeights = []; + let normalizedSum = Zero; + for (let index = 0; index < weights.length; index++) { + if (index < weights.length - 1) { + normalizedWeights[index] = weights[index].mul(ONE).div(sum); + normalizedSum = normalizedSum.add(normalizedWeights[index]); + } else { + normalizedWeights[index] = ONE.sub(normalizedSum); + } + } + + return normalizedWeights; +} + +/** + * Check whether a set of weights are normalized + * @param weights - an array of potentially unnormalized weights + * @returns a boolean of whether the weights are normalized + */ +export const isNormalizedWeights = (weights: BigNumberish[]): boolean => { + const totalWeight = weights.reduce((total: BigNumber, weight) => total.add(weight), Zero); + return totalWeight.eq(ONE); +}; diff --git a/balpy/balancer-deployments/src/helpers/models/types/types.ts b/balpy/balancer-deployments/src/helpers/models/types/types.ts new file mode 100644 index 0000000..748db7b --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/models/types/types.ts @@ -0,0 +1,160 @@ +import { Contract } from 'ethers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { BigNumberish } from '@ethersproject/bignumber'; + +export type NAry = T | Array; + +export type Account = string | SignerWithAddress | Contract | { address: string }; + +export type TxParams = { + from?: SignerWithAddress; +}; + +export enum PoolSpecialization { + GeneralPool = 0, + MinimalSwapInfoPool, + TwoTokenPool, +} + +export type FundManagement = { + sender: string; + fromInternalBalance: boolean; + recipient: string; + toInternalBalance: boolean; +}; + +// Swaps + +export enum SwapKind { + GivenIn = 0, + GivenOut, +} + +export type SingleSwap = { + poolId: string; + kind: SwapKind; + assetIn: string; + assetOut: string; + amount: BigNumberish; + userData: string; +}; + +export type Swap = { + kind: SwapKind; + singleSwap: SingleSwap; + limit: BigNumberish; + deadline: BigNumberish; +}; + +export type BatchSwapStep = { + poolId: string; + assetInIndex: number; + assetOutIndex: number; + amount: BigNumberish; + userData: string; +}; + +export type BatchSwap = { + kind: SwapKind; + swaps: BatchSwapStep[]; + assets: string[]; + funds: FundManagement; + limits: BigNumberish[]; + deadline: BigNumberish; +}; + +export type SwapRequest = { + kind: SwapKind; + tokenIn: string; + tokenOut: string; + amount: BigNumberish; + poolId: string; + lastChangeBlock: BigNumberish; + from: string; + to: string; + userData: string; +}; + +// Joins + +export type JoinPoolRequest = { + assets: string[]; + maxAmountsIn: BigNumberish[]; + userData: string; + fromInternalBalance: boolean; +}; + +// Exit + +export type ExitPoolRequest = { + assets: string[]; + minAmountsOut: BigNumberish[]; + userData: string; + toInternalBalance: boolean; +}; + +// Balance Operations + +export enum UserBalanceOpKind { + DepositInternal = 0, + WithdrawInternal, + TransferInternal, + TransferExternal, +} + +export type UserBalanceOp = { + kind: UserBalanceOpKind; + asset: string; + amount: BigNumberish; + sender: string; + recipient: string; +}; + +export enum PoolBalanceOpKind { + Withdraw = 0, + Deposit = 1, + Update = 2, +} + +export type PoolBalanceOp = { + kind: PoolBalanceOpKind; + poolId: string; + token: string; + amount: BigNumberish; +}; + +// Stakeless gauges + +export enum GaugeType { + LiquidityMiningCommittee = 0, + veBAL, + Ethereum, + Polygon, + Arbitrum, + Optimism, + Gnosis, + ZkSync, +} + +export type ManagedPoolParams = { + name: string; + symbol: string; + assetManagers: string[]; +}; + +export type ManagedPoolSettingsParams = { + tokens: string[]; + normalizedWeights: BigNumberish[]; + swapFeePercentage: BigNumberish; + swapEnabledOnStart: boolean; + mustAllowlistLPs: boolean; + managementAumFeePercentage: BigNumberish; + aumFeeId: BigNumberish; +}; + +export enum ProtocolFee { + SWAP = 0, + FLASH_LOAN = 1, + YIELD = 2, + AUM = 3, +} diff --git a/balpy/balancer-deployments/src/helpers/numbers.ts b/balpy/balancer-deployments/src/helpers/numbers.ts new file mode 100644 index 0000000..d18071c --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/numbers.ts @@ -0,0 +1,138 @@ +import { Decimal } from 'decimal.js'; +import { BigNumber } from 'ethers'; + +import _BN from 'bn.js'; + +export { BigNumber }; + +const SCALING_FACTOR = 1e18; + +export type BigNumberish = string | number | BigNumber; + +export const decimal = (x: BigNumberish | Decimal): Decimal => new Decimal(x.toString()); + +export const fp = (x: BigNumberish | Decimal): BigNumber => bn(toFp(x)); + +export const toFp = (x: BigNumberish | Decimal): Decimal => decimal(x).mul(SCALING_FACTOR); + +export const fromFp = (x: BigNumberish | Decimal): Decimal => decimal(x).div(SCALING_FACTOR); + +export const bn = (x: BigNumberish | Decimal): BigNumber => { + if (BigNumber.isBigNumber(x)) return x; + const stringified = parseScientific(x.toString()); + const integer = stringified.split('.')[0]; + return BigNumber.from(integer); +}; + +export const negate = (x: BigNumberish): BigNumber => { + // Ethers does not expose the .notn function from bn.js, so we must use it ourselves + return bn(new _BN(bn(x).toString()).notn(256).toString()); +}; + +export const maxUint = (e: number): BigNumber => bn(2).pow(e).sub(1); + +export const maxInt = (e: number): BigNumber => bn(2).pow(bn(e).sub(1)).sub(1); + +export const minInt = (e: number): BigNumber => bn(2).pow(bn(e).sub(1)).mul(-1); + +export const pct = (x: BigNumberish, pct: BigNumberish): BigNumber => bn(decimal(x).mul(decimal(pct))); + +export const max = (a: BigNumberish, b: BigNumberish): BigNumber => { + a = bn(a); + b = bn(b); + + return a.gt(b) ? a : b; +}; + +export const min = (a: BigNumberish, b: BigNumberish): BigNumber => { + a = bn(a); + b = bn(b); + + return a.lt(b) ? a : b; +}; + +export const bnSum = (bnArr: BigNumberish[]): BigNumber => { + return bn(bnArr.reduce((prev, curr) => bn(prev).add(bn(curr)), 0)); +}; + +export const arrayAdd = (arrA: BigNumberish[], arrB: BigNumberish[]): BigNumber[] => + arrA.map((a, i) => bn(a).add(bn(arrB[i]))); + +export const arrayFpMul = (arrA: BigNumberish[], arrB: BigNumberish[]): BigNumber[] => + arrA.map((a, i) => fpMul(a, arrB[i])); + +export const arraySub = (arrA: BigNumberish[], arrB: BigNumberish[]): BigNumber[] => + arrA.map((a, i) => bn(a).sub(bn(arrB[i]))); + +export const fpMul = (a: BigNumberish, b: BigNumberish): BigNumber => bn(a).mul(b).div(FP_SCALING_FACTOR); + +export const fpDiv = (a: BigNumberish, b: BigNumberish): BigNumber => bn(a).mul(FP_SCALING_FACTOR).div(b); + +export const divCeil = (x: BigNumber, y: BigNumber): BigNumber => + // ceil(x/y) == (x + y - 1) / y + x.add(y).sub(1).div(y); + +const FP_SCALING_FACTOR = bn(SCALING_FACTOR); +export const FP_ZERO = fp(0); +export const FP_ONE = fp(1); +export const FP_100_PCT = fp(1); + +export function printGas(gas: number | BigNumber): string { + if (typeof gas !== 'number') { + gas = gas.toNumber(); + } + + return `${(gas / 1000).toFixed(1)}k`; +} + +export function scaleUp(n: BigNumber, scalingFactor: BigNumber): BigNumber { + if (scalingFactor == bn(1)) { + return n; + } + + return n.mul(scalingFactor); +} + +export function scaleDown(n: BigNumber, scalingFactor: BigNumber): BigNumber { + if (scalingFactor == bn(1)) { + return n; + } + + return n.div(scalingFactor); +} + +function parseScientific(num: string): string { + // If the number is not in scientific notation return it as it is + if (!/\d+\.?\d*e[+-]*\d+/i.test(num)) return num; + + // Remove the sign + const numberSign = Math.sign(Number(num)); + num = Math.abs(Number(num)).toString(); + + // Parse into coefficient and exponent + const [coefficient, exponent] = num.toLowerCase().split('e'); + let zeros = Math.abs(Number(exponent)); + const exponentSign = Math.sign(Number(exponent)); + const [integer, decimals] = (coefficient.indexOf('.') != -1 ? coefficient : `${coefficient}.`).split('.'); + + if (exponentSign === -1) { + zeros -= integer.length; + num = + zeros < 0 + ? integer.slice(0, zeros) + '.' + integer.slice(zeros) + decimals + : '0.' + '0'.repeat(zeros) + integer + decimals; + } else { + if (decimals) zeros -= decimals.length; + num = + zeros < 0 + ? integer + decimals.slice(0, zeros) + '.' + decimals.slice(zeros) + : integer + decimals + '0'.repeat(zeros); + } + + return numberSign < 0 ? '-' + num : num; +} + +export function randomFromInterval(min: number, max: number): number { + // min and max included + return Math.random() * (max - min) + min; +} diff --git a/balpy/balancer-deployments/src/helpers/relativeError.ts b/balpy/balancer-deployments/src/helpers/relativeError.ts new file mode 100644 index 0000000..a477294 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/relativeError.ts @@ -0,0 +1,46 @@ +import { expect } from 'chai'; +import { Decimal } from 'decimal.js'; +import { BigNumberish, bn, pct } from './numbers'; + +export function expectEqualWithError(actual: BigNumberish, expected: BigNumberish, error: BigNumberish = 0.001): void { + actual = bn(actual); + expected = bn(expected); + const acceptedError = pct(expected, error); + + if (actual.gte(0)) { + expect(actual).to.be.at.least(expected.sub(acceptedError)); + expect(actual).to.be.at.most(expected.add(acceptedError)); + } else { + expect(actual).to.be.at.most(expected.sub(acceptedError)); + expect(actual).to.be.at.least(expected.add(acceptedError)); + } +} + +export function expectArrayEqualWithError( + actual: Array, + expected: Array, + error: BigNumberish = 0.001 +): void { + expect(actual.length).to.be.eq(expected.length); + for (let i = 0; i < actual.length; i++) { + expectEqualWithError(actual[i], expected[i], error); + } +} + +export function expectLessThanOrEqualWithError( + actual: BigNumberish, + expected: BigNumberish, + error: BigNumberish = 0.001 +): void { + actual = bn(actual); + expected = bn(expected); + const minimumValue = expected.sub(pct(expected, error)); + + expect(actual).to.be.at.most(expected); + expect(actual).to.be.at.least(minimumValue); +} + +export function expectRelativeError(actual: Decimal, expected: Decimal, maxRelativeError: Decimal): void { + const lessThanOrEqualTo = actual.dividedBy(expected).sub(1).abs().lessThanOrEqualTo(maxRelativeError); + expect(lessThanOrEqualTo, 'Relative error too big').to.be.true; +} diff --git a/balpy/balancer-deployments/src/helpers/setupTests.ts b/balpy/balancer-deployments/src/helpers/setupTests.ts new file mode 100644 index 0000000..5c9691f --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/setupTests.ts @@ -0,0 +1,121 @@ +import { AsyncFunc } from 'mocha'; +import { BigNumber } from 'ethers'; +import chai, { expect } from 'chai'; + +import { NAry } from './models/types/types'; +import { ZERO_ADDRESS } from './constants'; +import { BigNumberish, bn, fp } from './numbers'; +import { expectEqualWithError, expectLessThanOrEqualWithError } from './relativeError'; + +import { sharedBeforeEach } from './sharedBeforeEach'; + +/* eslint-disable @typescript-eslint/ban-ts-comment */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +declare global { + // eslint-disable-next-line @typescript-eslint/no-namespace + export namespace Chai { + interface Assertion { + zero: void; + zeros: void; + zeroAddress: void; + equalFp(value: BigNumberish): void; + lteWithError(value: NAry, error?: BigNumberish): void; + equalWithError(value: NAry, error?: BigNumberish): void; + almostEqual(value: NAry, error?: BigNumberish): void; + almostEqualFp(value: NAry, error?: BigNumberish): void; + } + } + + function sharedBeforeEach(fn: AsyncFunc): void; + function sharedBeforeEach(name: string, fn: AsyncFunc): void; +} + +global.sharedBeforeEach = (nameOrFn: string | AsyncFunc, maybeFn?: AsyncFunc): void => { + sharedBeforeEach(nameOrFn, maybeFn); +}; + +chai.use(function (chai, utils) { + const { Assertion } = chai; + + Assertion.addProperty('zero', function () { + new Assertion(this._obj).to.be.equal(bn(0)); + }); + + Assertion.addProperty('zeros', function () { + const obj = this._obj; + const expectedValue = Array(obj.length).fill(bn(0)); + new Assertion(obj).to.be.deep.equal(expectedValue); + }); + + Assertion.addProperty('zeroAddress', function () { + new Assertion(this._obj).to.be.equal(ZERO_ADDRESS); + }); + + Assertion.addMethod('equalFp', function (expectedValue: BigNumberish) { + expect(this._obj).to.be.equal(fp(expectedValue)); + }); + + Assertion.addMethod('equalWithError', function (expectedValue: NAry, error?: BigNumberish) { + if (Array.isArray(expectedValue)) { + const actual: BigNumberish[] = this._obj; + actual.forEach((actual, i) => expectEqualWithError(actual, expectedValue[i], error)); + } else { + expectEqualWithError(this._obj, expectedValue, error); + } + }); + + Assertion.addMethod('lteWithError', function (expectedValue: NAry, error?: BigNumberish) { + if (Array.isArray(expectedValue)) { + const actual: BigNumberish[] = this._obj; + actual.forEach((actual, i) => expectLessThanOrEqualWithError(actual, expectedValue[i], error)); + } else { + expectLessThanOrEqualWithError(this._obj, expectedValue, error); + } + }); + + Assertion.addMethod('almostEqual', function (expectedValue: NAry, error?: BigNumberish) { + if (Array.isArray(expectedValue)) { + const actuals: BigNumberish[] = this._obj; + actuals.forEach((actual, i) => expectEqualWithError(actual, expectedValue[i], error)); + } else { + expectEqualWithError(this._obj, expectedValue, error); + } + }); + + Assertion.addMethod('almostEqualFp', function (expectedValue: NAry, error?: BigNumberish) { + if (Array.isArray(expectedValue)) { + const actuals: BigNumberish[] = this._obj; + actuals.forEach((actual, i) => expectEqualWithError(actual, fp(expectedValue[i]), error)); + } else { + expectEqualWithError(this._obj, fp(expectedValue), error); + } + }); + + ['eq', 'equal', 'equals'].forEach((fn: string) => { + Assertion.overwriteMethod(fn, function (_super) { + return function (this: any, expected: any) { + const actual = utils.flag(this, 'object'); + if ( + utils.flag(this, 'deep') && + Array.isArray(actual) && + Array.isArray(expected) && + actual.length === expected.length && + (actual.some(BigNumber.isBigNumber) || expected.some(BigNumber.isBigNumber)) + ) { + const equal = actual.every((value: any, i: number) => BigNumber.from(value).eq(expected[i])); + this.assert( + equal, + `Expected "[${expected}]" to be deeply equal [${actual}]`, + `Expected "[${expected}]" NOT to be deeply equal [${actual}]`, + expected, + actual + ); + } else { + // eslint-disable-next-line prefer-rest-params + _super.apply(this, arguments); + } + }; + }); + }); +}); diff --git a/balpy/balancer-deployments/src/helpers/sharedBeforeEach.ts b/balpy/balancer-deployments/src/helpers/sharedBeforeEach.ts new file mode 100644 index 0000000..c476ac5 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/sharedBeforeEach.ts @@ -0,0 +1,51 @@ +import { AsyncFunc } from 'mocha'; +import { takeSnapshot, SnapshotRestorer } from '@nomicfoundation/hardhat-network-helpers'; + +const SNAPSHOTS: Array = []; + +/** + * This Mocha helper acts as a `beforeEach`, but executes the initializer + * just once. It internally uses Hardhat Network and Ganache's snapshots + * and revert instead of re-executing the initializer. + * + * Note that after the last test is run, the state doesn't get reverted. + * + * @param nameOrFn A title that's included in all the hooks that this helper uses. + * @param maybeFn The initializer to be run before the tests. + */ +export function sharedBeforeEach(nameOrFn: string | AsyncFunc, maybeFn?: AsyncFunc): void { + const name = typeof nameOrFn === 'string' ? nameOrFn : undefined; + const fn = typeof nameOrFn === 'function' ? nameOrFn : (maybeFn as AsyncFunc); + + let initialized = false; + + beforeEach(wrapWithTitle(name, 'Running shared before each or reverting'), async function () { + if (!initialized) { + const prevSnapshot = SNAPSHOTS.pop(); + if (prevSnapshot !== undefined) { + await prevSnapshot.restore(); + SNAPSHOTS.push(await takeSnapshot()); + } + + await fn.call(this); + + SNAPSHOTS.push(await takeSnapshot()); + initialized = true; + } else { + const shapshot = SNAPSHOTS.pop(); + if (shapshot === undefined) throw Error('Missing sharedBeforeEach snapshot'); + await shapshot.restore(); + SNAPSHOTS.push(await takeSnapshot()); + } + }); + + after(async function () { + if (initialized) { + SNAPSHOTS.pop(); + } + }); +} + +function wrapWithTitle(title: string | undefined, str: string): string { + return title === undefined ? str : `${title} at step "${str}"`; +} diff --git a/balpy/balancer-deployments/src/helpers/time.ts b/balpy/balancer-deployments/src/helpers/time.ts new file mode 100644 index 0000000..ddb1f50 --- /dev/null +++ b/balpy/balancer-deployments/src/helpers/time.ts @@ -0,0 +1,46 @@ +import { BigNumber, ContractReceipt } from 'ethers'; +import { ethers } from 'hardhat'; + +import { BigNumberish, bn } from './numbers'; + +import { time } from '@nomicfoundation/hardhat-network-helpers'; + +export const currentTimestamp = async (): Promise => { + return bn(await time.latest()); +}; + +export const currentWeekTimestamp = async (): Promise => { + return (await currentTimestamp()).div(WEEK).mul(WEEK); +}; + +export const fromNow = async (seconds: number): Promise => { + const now = await currentTimestamp(); + return now.add(seconds); +}; + +export const advanceTime = async (seconds: BigNumberish): Promise => { + await time.increase(seconds); +}; + +export const advanceToTimestamp = async (timestamp: BigNumberish): Promise => { + await time.increaseTo(timestamp); +}; + +export const setNextBlockTimestamp = async (timestamp: BigNumberish): Promise => { + await time.setNextBlockTimestamp(timestamp); +}; + +export const lastBlockNumber = async (): Promise => await time.latestBlock(); + +export const receiptTimestamp = async (receipt: ContractReceipt | Promise): Promise => { + const blockHash = (await receipt).blockHash; + const block = await ethers.provider.getBlock(blockHash); + return block.timestamp; +}; + +export const SECOND = 1; +export const MINUTE = SECOND * 60; +export const HOUR = MINUTE * 60; +export const DAY = HOUR * 24; +export const WEEK = DAY * 7; +export const MONTH = DAY * 30; diff --git a/balpy/balancer-deployments/src/index.ts b/balpy/balancer-deployments/src/index.ts new file mode 100644 index 0000000..971d0bd --- /dev/null +++ b/balpy/balancer-deployments/src/index.ts @@ -0,0 +1,9 @@ +export * from './forkTests'; +export * from './signers'; +export * from './task'; +export * from './test'; +export * from './types'; +export * from './network'; +export * from './contracts'; + +export { default as Task } from './task'; diff --git a/balpy/balancer-deployments/src/logger.ts b/balpy/balancer-deployments/src/logger.ts new file mode 100644 index 0000000..774554a --- /dev/null +++ b/balpy/balancer-deployments/src/logger.ts @@ -0,0 +1,52 @@ +import chalk from 'chalk'; + +const DEFAULTS = { + verbose: false, + silent: true, +}; + +export class Logger { + actor: string; + color: string; + + static setDefaults(silent: boolean, verbose: boolean): void { + DEFAULTS.silent = silent; + DEFAULTS.verbose = verbose; + } + + constructor(actor = '', color = 'white') { + this.actor = actor; + this.color = color; + } + + info(msg: string): void { + if (!DEFAULTS.verbose) return; + this.log(msg, '️ ', 'white'); + } + + success(msg: string): void { + this.log(msg, '✅', 'green'); + } + + warn(msg: string, error?: Error): void { + this.log(msg, '⚠️ ', 'yellow'); + if (error) console.error(error); + } + + error(msg: string, error?: Error): void { + this.log(msg, '🚨', 'red'); + if (error) console.error(error); + } + + log(msg: string, emoji: string, color = 'white'): void { + if (DEFAULTS.silent) return; + let formattedMessage = chalk.keyword(color)(`${emoji} ${msg}`); + if (DEFAULTS.verbose) { + const formattedPrefix = chalk.keyword(this.color)(`[${this.actor}]`); + formattedMessage = `${formattedPrefix} ${formattedMessage}`; + } + console.error(formattedMessage); + } +} + +export default new Logger(); diff --git a/balpy/balancer-deployments/src/network.ts b/balpy/balancer-deployments/src/network.ts new file mode 100644 index 0000000..dbd227d --- /dev/null +++ b/balpy/balancer-deployments/src/network.ts @@ -0,0 +1,116 @@ +import fs from 'fs'; +import path from 'path'; +import Task, { TaskStatus } from './task'; + +import { Network } from './types'; + +const DEPLOYMENT_TXS_DIRECTORY = path.resolve(__dirname, '../deployment-txs'); +const CONTRACT_ADDRESSES_DIRECTORY = path.resolve(__dirname, '../addresses'); + +export function saveContractDeploymentTransactionHash( + deployedAddress: string, + deploymentTransactionHash: string, + network: Network +): void { + if (network === 'hardhat') return; + + const filePath = path.join(DEPLOYMENT_TXS_DIRECTORY, `${network}.json`); + const fileExists = fs.existsSync(filePath) && fs.statSync(filePath).isFile(); + + // Load the existing content if any exists. + const newFileContents: Record = fileExists ? JSON.parse(fs.readFileSync(filePath).toString()) : {}; + + // Write the new entry. + newFileContents[deployedAddress] = deploymentTransactionHash; + + fs.writeFileSync(filePath, JSON.stringify(newFileContents, null, 2)); +} + +export function getContractDeploymentTransactionHash(deployedAddress: string, network: Network): string { + const filePath = path.join(DEPLOYMENT_TXS_DIRECTORY, `${network}.json`); + const fileExists = fs.existsSync(filePath) && fs.statSync(filePath).isFile(); + if (!fileExists) { + throw Error(`Could not find file for deployment transaction hashes for network '${network}'`); + } + + const deploymentTxs: Record = JSON.parse(fs.readFileSync(filePath).toString()); + const txHash = deploymentTxs[deployedAddress]; + if (txHash === undefined) { + throw Error(`No transaction hash for contract ${deployedAddress} on network '${network}'`); + } + + return txHash; +} + +/** + * Saves a file with the canonical deployment addresses for all tasks in a given network. + */ +export function saveContractDeploymentAddresses(tasks: Task[], network: string): void { + if (network === 'hardhat') return; + + const allTaskEntries = buildContractDeploymentAddressesEntries(tasks); + const filePath = path.join(CONTRACT_ADDRESSES_DIRECTORY, `${network}.json`); + + fs.writeFileSync(filePath, _stringifyEntries(allTaskEntries)); +} + +/** + * Builds an object that maps task IDs to deployment info for all given tasks. + * The resulting format reads as follows: + * : { + * contracts: [ + * { + * name: , + * address: + * }, + * (...) + * ], + * status: + * }, + * (...) + */ +export function buildContractDeploymentAddressesEntries(tasks: Task[]): object { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let allTaskEntries = {} as any; + + for (const task of tasks) { + const taskEntries = Object.entries(task.output({ ensure: false })) + .map(([name, address]) => [{ name, address }]) + .flat(); + + // Some tasks do not have outputs for every network, so we just skip them. + if (taskEntries.length == 0) { + continue; + } + + allTaskEntries = { + ...allTaskEntries, + [task.id]: { + contracts: [...taskEntries], + status: TaskStatus[task.getStatus()], + }, + }; + } + + return allTaskEntries; +} + +/** + * Returns true if the existing deployment addresses file stored in `CONTRACT_ADDRESSES_DIRECTORY` matches the + * canonical one for the given network; false otherwise. + */ +export function checkContractDeploymentAddresses(tasks: Task[], network: string): boolean { + const allTaskEntries = buildContractDeploymentAddressesEntries(tasks); + + const filePath = path.join(CONTRACT_ADDRESSES_DIRECTORY, `${network}.json`); + const fileExists = fs.existsSync(filePath) && fs.statSync(filePath).isFile(); + + // Load the existing content if any exists. + const existingFileContents: string = fileExists ? fs.readFileSync(filePath).toString() : ''; + + return _stringifyEntries(allTaskEntries) === existingFileContents; +} + +function _stringifyEntries(entries: object): string { + return JSON.stringify(entries, null, 2); +} diff --git a/balpy/balancer-deployments/src/signers.ts b/balpy/balancer-deployments/src/signers.ts new file mode 100644 index 0000000..683cc0f --- /dev/null +++ b/balpy/balancer-deployments/src/signers.ts @@ -0,0 +1,27 @@ +import { BigNumber } from 'ethers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; + +import { impersonateAccount, setBalance as setAccountBalance } from '@nomicfoundation/hardhat-network-helpers'; +import { fp } from './helpers/numbers'; + +export async function getSigners(): Promise { + const { ethers } = await import('hardhat'); + return ethers.getSigners(); +} + +export async function getSigner(index = 0): Promise { + return (await getSigners())[index]; +} + +export async function impersonate(address: string, balance = fp(100)): Promise { + await impersonateAccount(address); + await setBalance(address, balance); + + const { ethers } = await import('hardhat'); + const signer = ethers.provider.getSigner(address); + return SignerWithAddress.create(signer); +} + +export async function setBalance(address: string, balance: BigNumber): Promise { + await setAccountBalance(address, balance); +} diff --git a/balpy/balancer-deployments/src/task.ts b/balpy/balancer-deployments/src/task.ts new file mode 100644 index 0000000..be0222b --- /dev/null +++ b/balpy/balancer-deployments/src/task.ts @@ -0,0 +1,443 @@ +import fs from 'fs'; +import path, { extname } from 'path'; +import { BuildInfo, CompilerOutputContract } from 'hardhat/types'; +import { Contract } from 'ethers'; +import { getContractAddress } from '@ethersproject/address'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; + +import logger from './logger'; +import Verifier from './verifier'; +import { deploy, deploymentTxData, instanceAt } from './contracts'; + +import { + NETWORKS, + Network, + Libraries, + Artifact, + Input, + Output, + Param, + RawInputKeyValue, + RawOutput, + TaskRunOptions, +} from './types'; +import { getContractDeploymentTransactionHash, saveContractDeploymentTransactionHash } from './network'; +import { getTaskActionIds } from './actionId'; +import { getArtifactFromContractOutput } from './artifact'; + +const TASKS_DIRECTORY = path.resolve(__dirname, '../tasks'); +const DEPRECATED_DIRECTORY = path.join(TASKS_DIRECTORY, 'deprecated'); +const SCRIPTS_DIRECTORY = path.join(TASKS_DIRECTORY, 'scripts'); + +export enum TaskMode { + LIVE, // Deploys and saves outputs + TEST, // Deploys but saves to test output + CHECK, // Checks past deployments on deploy + READ_ONLY, // Fails on deploy +} + +export enum TaskStatus { + ACTIVE, + DEPRECATED, + SCRIPT, +} + +/* eslint-disable @typescript-eslint/no-var-requires */ + +export default class Task { + id: string; + mode: TaskMode; + + _network?: Network; + _verifier?: Verifier; + + constructor(idAlias: string, mode: TaskMode, network?: Network, verifier?: Verifier) { + if (network && !NETWORKS.includes(network)) throw Error(`Unknown network ${network}`); + this.id = this._findTaskId(idAlias); + this.mode = mode; + this._network = network; + this._verifier = verifier; + } + + get network(): string { + if (!this._network) throw Error('No network defined'); + return this._network; + } + + set network(name: Network) { + this._network = name; + } + + async instanceAt(name: string, address: string): Promise { + return instanceAt(this.artifact(name), address); + } + + async deployedInstance(name: string): Promise { + const address = this.output()[name]; + if (!address) throw Error(`Could not find deployed address for ${name}`); + return this.instanceAt(name, address); + } + + async inputInstance(artifactName: string, inputName: string): Promise { + const rawInput = this.rawInput(); + const input = rawInput[inputName]; + if (!this._isTask(input)) throw Error(`Cannot access to non-task input ${inputName}`); + const task = input as Task; + task.network = this.network; + const address = this._parseRawInput(rawInput)[inputName]; + return task.instanceAt(artifactName, address); + } + + async deployAndVerify( + name: string, + args: Array = [], + from?: SignerWithAddress, + force?: boolean, + libs?: Libraries + ): Promise { + if (this.mode == TaskMode.CHECK) { + return await this.check(name, args, libs); + } + + const instance = await this.deploy(name, args, from, force, libs); + + await this.verify(name, instance.address, args, libs); + return instance; + } + + async deploy( + name: string, + args: Array = [], + from?: SignerWithAddress, + force?: boolean, + libs?: Libraries + ): Promise { + if (this.mode == TaskMode.CHECK) { + return await this.check(name, args, libs); + } + + if (this.mode !== TaskMode.LIVE && this.mode !== TaskMode.TEST) { + throw Error(`Cannot deploy in tasks of mode ${TaskMode[this.mode]}`); + } + + let instance: Contract; + const output = this.output({ ensure: false }); + if (force || !output[name]) { + instance = await deploy(this.artifact(name), args, from, libs); + this.save({ [name]: instance }); + logger.success(`Deployed ${name} at ${instance.address}`); + + if (this.mode === TaskMode.LIVE) { + saveContractDeploymentTransactionHash(instance.address, instance.deployTransaction.hash, this.network); + } + } else { + logger.info(`${name} already deployed at ${output[name]}`); + instance = await this.instanceAt(name, output[name]); + } + + return instance; + } + + async verify( + name: string, + address: string, + constructorArguments: string | unknown[], + libs?: Libraries + ): Promise { + if (this.mode !== TaskMode.LIVE) { + return; + } + + try { + if (!this._verifier) return logger.warn('Skipping contract verification, no verifier defined'); + const url = await this._verifier.call(this, name, address, constructorArguments, libs); + logger.success(`Verified contract ${name} at ${url}`); + } catch (error) { + logger.error(`Failed trying to verify ${name} at ${address}: ${error}`); + } + } + + async check(name: string, args: Array = [], libs?: Libraries): Promise { + // There are multiple approaches to checking that a deployed contract matches known source code. A naive approach + // is to check for a match in the runtime code, but that doesn't account for actions taken during construction, + // including calls, storage writes, and setting immutable state variables. Since immutable state variables modify + // the runtime code, it can actually be quite tricky to produce matching runtime code. + // + // What we do instead is check for both runtime code and constructor execution (including constructor arguments) by + // looking at the transaction in which the contract was deployed, which can be found in the /deployment-txs directory. + // The data of this transaction will be the contract creation code followed by the abi-encoded constructor arguments, + // which we can compare against what the task would attempt to deploy. In this way, we are testing the task's build + // info, inputs and deployment code. + // + // The only thing we're not checking is what account deployed the contract, but our code does not have dependencies + // on the deployer. + + const { ethers } = await import('hardhat'); + + const deployedAddress = this.output()[name]; + const deploymentTxHash = getContractDeploymentTransactionHash(deployedAddress, this.network); + const deploymentTx = await ethers.provider.getTransaction(deploymentTxHash); + + const expectedDeploymentAddress = getContractAddress(deploymentTx); + if (deployedAddress !== expectedDeploymentAddress) { + throw Error( + `The stated deployment address of '${name}' on network '${this.network}' of task '${this.id}' (${deployedAddress}) does not match the address which would be deployed by the transaction ${deploymentTxHash} (which instead deploys to ${expectedDeploymentAddress})` + ); + } + + const expectedDeploymentTxData = await deploymentTxData(this.artifact(name), args, libs); + if (deploymentTx.data === expectedDeploymentTxData) { + logger.success(`Verified contract '${name}' on network '${this.network}' of task '${this.id}'`); + } else { + throw Error( + `The build info and inputs for contract '${name}' on network '${this.network}' of task '${this.id}' does not match the data used to deploy address ${deployedAddress}` + ); + } + + // We need to return an instance so that the task may carry on, potentially using this as input of future + // deployments. + return this.instanceAt(name, deployedAddress); + } + + async run(options: TaskRunOptions = {}): Promise { + const taskPath = this._fileAt(this.dir(), 'index.ts'); + const task = require(taskPath).default; + await task(this, options); + } + + dir(): string { + if (!this.id) throw Error('Please provide a task deployment ID to run'); + + // The task might be deprecated, so it may not exist in the main directory. We first look there, but don't require + // that the directory exists. + + const nonDeprecatedDir = this._dirAt(TASKS_DIRECTORY, this.id, false); + if (this._existsDir(nonDeprecatedDir)) { + return nonDeprecatedDir; + } + + const deprecatedDir = this._dirAt(DEPRECATED_DIRECTORY, this.id, false); + if (this._existsDir(deprecatedDir)) { + return deprecatedDir; + } + + const scriptsDir = this._dirAt(SCRIPTS_DIRECTORY, this.id, false); + if (this._existsDir(scriptsDir)) { + return scriptsDir; + } + + throw Error(`Could not find a directory at ${nonDeprecatedDir}, ${deprecatedDir} or ${scriptsDir}`); + } + + buildInfo(fileName: string): BuildInfo { + const buildInfoDir = this._dirAt(this.dir(), 'build-info'); + const artifactFile = this._fileAt(buildInfoDir, `${extname(fileName) ? fileName : `${fileName}.json`}`); + return JSON.parse(fs.readFileSync(artifactFile).toString()); + } + + buildInfos(): Array { + const buildInfoDir = this._dirAt(this.dir(), 'build-info'); + return fs.readdirSync(buildInfoDir).map((fileName) => this.buildInfo(fileName)); + } + + artifact(contractName: string, fileName?: string): Artifact { + const buildInfoDir = this._dirAt(this.dir(), 'build-info'); + fileName = fileName ?? contractName; + + const builds: { + [sourceName: string]: { [contractName: string]: CompilerOutputContract }; + } = this._existsFile(path.join(buildInfoDir, `${fileName}.json`)) + ? this.buildInfo(fileName).output.contracts + : this.buildInfos().reduce((result, info: BuildInfo) => ({ ...result, ...info.output.contracts }), {}); + + const sourceName = Object.keys(builds).find((sourceName) => + Object.keys(builds[sourceName]).find((key) => key === contractName) + ); + + if (!sourceName) throw Error(`Could not find artifact for ${contractName}`); + return getArtifactFromContractOutput(sourceName, contractName, builds[sourceName][contractName]); + } + + actionId(contractName: string, signature: string): string { + const taskActionIds = getTaskActionIds(this); + if (taskActionIds === undefined) throw new Error('Could not find action IDs for task'); + const contractInfo = taskActionIds[contractName]; + if (contractInfo === undefined) + throw new Error(`Could not find action IDs for contract ${contractName} on task ${this.id}`); + const actionIds = taskActionIds[contractName].actionIds; + if (actionIds[signature] === undefined) + throw new Error(`Could not find function ${contractName}.${signature} on task ${this.id}`); + return actionIds[signature]; + } + + rawInput(): RawInputKeyValue { + const taskInputPath = this._fileAt(this.dir(), 'input.ts'); + const rawInput = require(taskInputPath).default; + const globalInput = { ...rawInput }; + NETWORKS.forEach((network) => delete globalInput[network]); + const networkInput = rawInput[this.network] || {}; + return { ...globalInput, ...networkInput }; + } + + input(): Input { + return this._parseRawInput(this.rawInput()); + } + + output({ ensure = true, network }: { ensure?: boolean; network?: Network } = {}): Output { + if (network === undefined) { + network = this.mode !== TaskMode.TEST ? this.network : 'test'; + } + + const taskOutputDir = this._dirAt(this.dir(), 'output', ensure); + const taskOutputFile = this._fileAt(taskOutputDir, `${network}.json`, ensure); + return this._read(taskOutputFile); + } + + save(rawOutput: RawOutput): void { + const output = this._parseRawOutput(rawOutput); + + if (this.mode === TaskMode.CHECK) { + // `save` is only called by `deploy` (which only happens in LIVE and TEST modes), or manually for contracts that + // are deployed by other contracts (e.g. Batch Relayer Entrypoints). Therefore, by testing for CHECK mode we can + // identify this second type of contracts, and check them by comparing the saved address to the address that the + // task would attempt to save. + this._checkManuallySavedArtifacts(output); + } else if (this.mode === TaskMode.LIVE || this.mode === TaskMode.TEST) { + this._save(output); + } + } + + getStatus(): TaskStatus { + const taskDirectory = this.dir(); + if (taskDirectory === path.join(TASKS_DIRECTORY, this.id)) { + return TaskStatus.ACTIVE; + } else if (taskDirectory === path.join(DEPRECATED_DIRECTORY, this.id)) { + return TaskStatus.DEPRECATED; + } else if (taskDirectory === path.join(SCRIPTS_DIRECTORY, this.id)) { + return TaskStatus.SCRIPT; + } + + throw new Error('Unknown task status'); + } + + private _checkManuallySavedArtifacts(output: Output) { + for (const name of Object.keys(output)) { + const expectedAddress = this.output()[name]; + const actualAddress = output[name]; + if (actualAddress === expectedAddress) { + logger.success(`Verified contract '${name}' on network '${this.network}' of task '${this.id}'`); + } else { + throw Error( + `The stated deployment address of '${name}' on network '${this.network}' of task '${this.id}' (${actualAddress}) does not match the expected address (${expectedAddress})` + ); + } + } + } + + private _save(output: Output) { + const taskOutputDir = this._dirAt(this.dir(), 'output', false); + if (!fs.existsSync(taskOutputDir)) fs.mkdirSync(taskOutputDir); + + const outputFile = this.mode === TaskMode.LIVE ? `${this.network}.json` : 'test.json'; + const taskOutputFile = this._fileAt(taskOutputDir, outputFile, false); + const previousOutput = this._read(taskOutputFile); + + const finalOutput = { ...previousOutput, ...output }; + this._write(taskOutputFile, finalOutput); + } + + private _parseRawInput(rawInput: RawInputKeyValue): Input { + return Object.keys(rawInput).reduce((input: Input, key: Network | string) => { + const item = rawInput[key]; + + if (!this._isTask(item)) { + // Non-task inputs are simply their value + input[key] = item; + } else { + // For task inputs, we query the output file with the name of the key in the input object. For example, given + // { 'BalancerHelpers': new Task('20210418-vault', TaskMode.READ_ONLY) } + // the input value will be the output of name 'BalancerHelpers' of said task. + const task = item as Task; + const output = task.output({ network: this.network }); + + if (output[key] === undefined) { + throw Error(`No '${key}' value for task ${task.id} in output of network ${this.network}`); + } + + input[key] = output[key]; + } + + return input; + }, {}); + } + + private _parseRawOutput(rawOutput: RawOutput): Output { + return Object.keys(rawOutput).reduce((output: Output, key: string) => { + const value = rawOutput[key]; + output[key] = typeof value === 'string' ? value : value.address; + return output; + }, {}); + } + + private _read(path: string): Output { + return fs.existsSync(path) ? JSON.parse(fs.readFileSync(path).toString()) : {}; + } + + private _write(path: string, output: Output): void { + const finalOutputJSON = JSON.stringify(output, null, 2); + fs.writeFileSync(path, finalOutputJSON); + } + + private _fileAt(base: string, name: string, ensure = true): string { + const filePath = path.join(base, name); + if (ensure && !this._existsFile(filePath)) throw Error(`Could not find a file at ${filePath}`); + return filePath; + } + + private _dirAt(base: string, name: string, ensure = true): string { + const dirPath = path.join(base, name); + if (ensure && !this._existsDir(dirPath)) throw Error(`Could not find a directory at ${dirPath}`); + return dirPath; + } + + private _existsFile(filePath: string): boolean { + return fs.existsSync(filePath) && fs.statSync(filePath).isFile(); + } + + private _existsDir(dirPath: string): boolean { + return fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory(); + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private _isTask(object: any): boolean { + return object.constructor.name == 'Task'; + } + + private _findTaskId(idAlias: string): string { + const matches = Task.getAllTaskIds().filter((taskDirName) => taskDirName.includes(idAlias)); + + if (matches.length == 1) { + return matches[0]; + } else { + if (matches.length == 0) { + throw Error(`Found no matching directory for task alias '${idAlias}'`); + } else { + throw Error( + `Multiple matching directories for task alias '${idAlias}', candidates are: \n${matches.join('\n')}` + ); + } + } + } + + /** + * Return all directories inside the top 3 fixed task directories in a flat, sorted array. + */ + static getAllTaskIds(): string[] { + // Some operating systems may insert hidden files that should not be listed, so we just look for directories when + // reading the file system. + return [TASKS_DIRECTORY, DEPRECATED_DIRECTORY, SCRIPTS_DIRECTORY] + .map((dir) => fs.readdirSync(dir).filter((fileName) => fs.lstatSync(path.resolve(dir, fileName)).isDirectory())) + .flat() + .sort(); + } +} diff --git a/balpy/balancer-deployments/src/test.ts b/balpy/balancer-deployments/src/test.ts new file mode 100644 index 0000000..3a1cd1f --- /dev/null +++ b/balpy/balancer-deployments/src/test.ts @@ -0,0 +1,25 @@ +import { RunSuperFunction, HardhatRuntimeEnvironment, HttpNetworkConfig, HardhatNetworkConfig } from 'hardhat/types'; + +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ + +export default async function (args: any, hre: HardhatRuntimeEnvironment, run: RunSuperFunction): Promise { + console.log('Running fork tests...'); + if (args.id) { + args.testFiles = args.testFiles.filter((file: string) => file.includes(args.id)); + } + await run(args); +} + +export function getForkedNetwork(hre: HardhatRuntimeEnvironment): string { + const config = hre.network.config as HardhatNetworkConfig; + if (!config.forking || !config.forking.url) throw Error(`No forks found on network ${hre.network.name}`); + + const network = Object.entries(hre.config.networks).find(([, networkConfig]) => { + const httpNetworkConfig = networkConfig as HttpNetworkConfig; + return httpNetworkConfig.url && httpNetworkConfig.url === config?.forking?.url; + }); + + if (!network) throw Error(`No network found matching fork from ${config.forking.url}`); + return network[0]; +} diff --git a/balpy/balancer-deployments/src/types.ts b/balpy/balancer-deployments/src/types.ts new file mode 100644 index 0000000..1c01fe2 --- /dev/null +++ b/balpy/balancer-deployments/src/types.ts @@ -0,0 +1,55 @@ +import { Contract, BigNumber } from 'ethers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; + +export { Artifact, Libraries } from 'hardhat/types'; + +import Task from './task'; + +export const NETWORKS = [ + 'goerli', + 'mainnet', + 'polygon', + 'arbitrum', + 'optimism', + 'gnosis', + 'bsc', + 'avalanche', + 'zkevm', + 'sepolia', + 'base', + 'fantom', +]; + +export type Network = (typeof NETWORKS)[number]; + +export type TaskRunOptions = { + force?: boolean; + from?: SignerWithAddress; +}; + +export type NAry = T | Array; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type Param = boolean | string | number | BigNumber | any; + +export type Input = { + [key: string]: NAry; +}; + +export type RawInputByNetwork = { + [key in Network]: RawInputKeyValue; +}; + +export type RawInputKeyValue = { + [key: string]: NAry | Output | Task; +}; + +export type RawInput = RawInputKeyValue | RawInputByNetwork; + +export type Output = { + [key: string]: string; +}; + +export type RawOutput = { + [key: string]: string | Contract; +}; diff --git a/balpy/balancer-deployments/src/verifier.ts b/balpy/balancer-deployments/src/verifier.ts new file mode 100644 index 0000000..1496901 --- /dev/null +++ b/balpy/balancer-deployments/src/verifier.ts @@ -0,0 +1,265 @@ +import fetch, { Response } from 'node-fetch'; +import { BuildInfo, CompilerInput, Network } from 'hardhat/types'; + +import { getLongVersion } from '@nomiclabs/hardhat-etherscan/dist/src/solc/version'; +import { encodeArguments } from '@nomiclabs/hardhat-etherscan/dist/src/ABIEncoder'; +import { getLibraryLinks, Libraries } from '@nomiclabs/hardhat-etherscan/dist/src/solc/libraries'; +import { chainConfig } from '@nomiclabs/hardhat-etherscan/dist/src/ChainConfig'; + +import hardhatConfig from '../hardhat.config'; + +import { + Bytecode, + ContractInformation, + extractMatchingContractInformation, +} from '@nomiclabs/hardhat-etherscan/dist/src/solc/bytecode'; + +import { getEtherscanEndpoints, retrieveContractBytecode } from '@nomiclabs/hardhat-etherscan/dist/src/network/prober'; + +import { + toVerifyRequest, + toCheckStatusRequest, + EtherscanVerifyRequest, +} from '@nomiclabs/hardhat-etherscan/dist/src/etherscan/EtherscanVerifyContractRequest'; + +import { + delay, + EtherscanResponse, + getVerificationStatus, +} from '@nomiclabs/hardhat-etherscan/dist/src/etherscan/EtherscanService'; + +import { EtherscanNetworkEntry } from '@nomiclabs/hardhat-etherscan/dist/src/types'; + +import * as parser from '@solidity-parser/parser'; + +import Task from './task'; +import logger from './logger'; +import { findContractSourceName, getAllFullyQualifiedNames } from './buildinfo'; + +const MAX_VERIFICATION_INTENTS = 3; + +export default class Verifier { + apiKey: string; + network: Network; + + constructor(_network: Network, _apiKey: string) { + this.network = _network; + this.apiKey = _apiKey; + } + + async call( + task: Task, + name: string, + address: string, + constructorArguments: string | unknown[], + libraries: Libraries = {}, + intent = 1 + ): Promise { + const response = await this.verify(task, name, address, constructorArguments, libraries); + + if (response.isVerificationSuccess()) { + const etherscanEndpoints = await getEtherscanEndpoints( + this.network.provider, + this.network.name, + chainConfig, + hardhatConfig.etherscan.customChains ?? [] + ); + + const contractURL = new URL(`/address/${address}#code`, etherscanEndpoints.urls.browserURL); + return contractURL.toString(); + } else if (intent < MAX_VERIFICATION_INTENTS && response.isBytecodeMissingInNetworkError()) { + logger.info(`Could not find deployed bytecode in network, retrying ${intent++}/${MAX_VERIFICATION_INTENTS}...`); + delay(5000); + return this.call(task, name, address, constructorArguments, libraries, intent++); + } else { + throw new Error(`The contract verification failed. Reason: ${response.message}`); + } + } + + private async verify( + task: Task, + name: string, + address: string, + args: string | unknown[], + libraries: Libraries = {} + ): Promise { + const deployedBytecodeHex = await retrieveContractBytecode(address, this.network.provider, this.network.name); + const deployedBytecode = new Bytecode(deployedBytecodeHex); + const buildInfos = await task.buildInfos(); + const buildInfo = this.findBuildInfoWithContract(buildInfos, name); + buildInfo.input = this.trimmedBuildInfoInput(name, buildInfo.input); + + const sourceName = findContractSourceName(buildInfo, name); + const contractInformation = await extractMatchingContractInformation(sourceName, name, buildInfo, deployedBytecode); + if (!contractInformation) throw Error('Could not find a bytecode matching the requested contract'); + + const { libraryLinks } = await getLibraryLinks(contractInformation, libraries); + contractInformation.libraryLinks = libraryLinks; + + const deployArgumentsEncoded = + typeof args == 'string' + ? args + : await encodeArguments( + contractInformation.contract.abi, + contractInformation.sourceName, + contractInformation.contractName, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + args as any[] + ); + + const solcFullVersion = await getLongVersion(contractInformation.solcVersion); + + const etherscanEndpoints = await getEtherscanEndpoints( + this.network.provider, + this.network.name, + chainConfig, + hardhatConfig.etherscan.customChains ?? [] + ); + + const verificationStatus = await this.attemptVerification( + etherscanEndpoints, + contractInformation, + address, + this.apiKey, + buildInfo.input, + solcFullVersion, + deployArgumentsEncoded + ); + + if (verificationStatus.isVerificationSuccess()) return verificationStatus; + throw new Error(`The contract verification failed. Reason: ${verificationStatus.message}`); + } + + private async attemptVerification( + etherscanEndpoints: EtherscanNetworkEntry, + contractInformation: ContractInformation, + contractAddress: string, + etherscanAPIKey: string, + compilerInput: CompilerInput, + solcFullVersion: string, + deployArgumentsEncoded: string + ): Promise { + compilerInput.settings.libraries = contractInformation.libraryLinks; + const request = toVerifyRequest({ + apiKey: etherscanAPIKey, + contractAddress, + sourceCode: JSON.stringify(compilerInput), + sourceName: contractInformation.sourceName, + contractName: contractInformation.contractName, + compilerVersion: solcFullVersion, + constructorArguments: deployArgumentsEncoded, + }); + + const response = await this.verifyContract(etherscanEndpoints.urls.apiURL, request); + const pollRequest = toCheckStatusRequest({ apiKey: etherscanAPIKey, guid: response.message }); + + await delay(700); + const verificationStatus = await getVerificationStatus(etherscanEndpoints.urls.apiURL, pollRequest); + + if (verificationStatus.isVerificationFailure() || verificationStatus.isVerificationSuccess()) { + return verificationStatus; + } + + throw new Error(`The API responded with an unexpected message: ${verificationStatus.message}`); + } + + private async verifyContract(url: string, req: EtherscanVerifyRequest): Promise { + const parameters = new URLSearchParams({ ...req }); + const requestDetails = { method: 'post', body: parameters }; + + let response: Response; + try { + response = await fetch(url, requestDetails); + } catch (error: unknown) { + throw Error(`Failed to send verification request. Reason: ${(error as Error).message}`); + } + + if (!response.ok) { + const responseText = await response.text(); + throw Error(`Failed to send verification request.\nHTTP code: ${response.status}.\nResponse: ${responseText}`); + } + + const etherscanResponse = new EtherscanResponse(await response.json()); + if (!etherscanResponse.isOk()) throw Error(etherscanResponse.message); + return etherscanResponse; + } + + private findBuildInfoWithContract(buildInfos: BuildInfo[], contractName: string): BuildInfo { + const found = buildInfos.find((buildInfo) => + getAllFullyQualifiedNames(buildInfo).some((name) => name.contractName === contractName) + ); + + if (found === undefined) { + throw Error(`Could not find a build info for contract ${contractName}`); + } else { + return found; + } + } + + // Trims the inputs of the build info to only keep imported files, avoiding submitting unnecessary source files for + // verification (e.g. mocks). This is required because Hardhat compiles entire projects at once, resulting in a single + // huge build info. + private trimmedBuildInfoInput(contractName: string, input: CompilerInput): CompilerInput { + // First we find all sources imported from our contract + const sourceName = this.getContractSourceName(contractName, input); + const importedSourceNames = this.getContractImportedSourceNames( + sourceName, + input, + new Set().add(sourceName) + ); + + // Then, we keep only those inputs. This method also preserves the order of the files, which may be important in + // some versions of solc. + return { + ...input, + sources: Object.keys(input.sources) + .filter((source) => importedSourceNames.has(source)) + .map((source) => ({ [source]: input.sources[source] })) + .reduce((previous, current) => Object.assign(previous, current), {}), + }; + } + + private getAbsoluteSourcePath(relativeSourcePath: string, input: CompilerInput): string { + // We're not actually converting from relative to absolute but rather guessing: we'll extract the filename from the + // relative path, and then look for a source name in the inputs that matches it. + const contractName = (relativeSourcePath.match(/.*\/(\w*)\.sol/) as RegExpMatchArray)[1]; + return this.getContractSourceName(contractName, input); + } + + private getContractSourceName(contractName: string, input: CompilerInput): string { + const absoluteSourcePath = Object.keys(input.sources).find((absoluteSourcePath) => + absoluteSourcePath.includes(`/${contractName}.sol`) + ); + + if (absoluteSourcePath === undefined) { + throw new Error(`Could not find source name for ${contractName}`); + } + + return absoluteSourcePath; + } + + private getContractImportedSourceNames( + sourceName: string, + input: CompilerInput, + previousSourceNames: Set + ): Set { + const ast = parser.parse(input.sources[sourceName].content); + parser.visit(ast, { + ImportDirective: (node) => { + // Imported paths might be relative, so we convert them to absolute + const importedSourceName = this.getAbsoluteSourcePath(node.path, input); + + if (!previousSourceNames.has(importedSourceName)) { + // New source! + previousSourceNames = this.getContractImportedSourceNames( + importedSourceName, + input, + new Set(previousSourceNames).add(importedSourceName) + ); + } + }, + }); + + return previousSourceNames; + } +} diff --git a/balpy/balancer-deployments/tasks/00000000-tokens/output/arbitrum.json b/balpy/balancer-deployments/tasks/00000000-tokens/output/arbitrum.json new file mode 100644 index 0000000..a754a9f --- /dev/null +++ b/balpy/balancer-deployments/tasks/00000000-tokens/output/arbitrum.json @@ -0,0 +1,4 @@ +{ + "BAL": "0x040d1EdC9569d4Bab2D15287Dc5A4F10F56a56B8", + "WETH": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1" +} diff --git a/balpy/balancer-deployments/tasks/00000000-tokens/output/avalanche.json b/balpy/balancer-deployments/tasks/00000000-tokens/output/avalanche.json new file mode 100644 index 0000000..eddcdf5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/00000000-tokens/output/avalanche.json @@ -0,0 +1,4 @@ +{ + "BAL": "0xE15bCB9E0EA69e6aB9FA080c4c4A5632896298C3", + "WETH": "0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7" +} diff --git a/balpy/balancer-deployments/tasks/00000000-tokens/output/base.json b/balpy/balancer-deployments/tasks/00000000-tokens/output/base.json new file mode 100644 index 0000000..cbf6a02 --- /dev/null +++ b/balpy/balancer-deployments/tasks/00000000-tokens/output/base.json @@ -0,0 +1,4 @@ +{ + "BAL": "0x4158734d47fc9692176b5085e0f52ee0da5d47f1", + "WETH": "0x4200000000000000000000000000000000000006" +} diff --git a/balpy/balancer-deployments/tasks/00000000-tokens/output/bsc.json b/balpy/balancer-deployments/tasks/00000000-tokens/output/bsc.json new file mode 100644 index 0000000..6615940 --- /dev/null +++ b/balpy/balancer-deployments/tasks/00000000-tokens/output/bsc.json @@ -0,0 +1,4 @@ +{ + "WETH": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", + "BAL": "0xf9815ea1a246401d2ebf2185f207d7db579a2500" +} diff --git a/balpy/balancer-deployments/tasks/00000000-tokens/output/fantom.json b/balpy/balancer-deployments/tasks/00000000-tokens/output/fantom.json new file mode 100644 index 0000000..4569afa --- /dev/null +++ b/balpy/balancer-deployments/tasks/00000000-tokens/output/fantom.json @@ -0,0 +1,4 @@ +{ + "BAL": "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B", + "WETH": "0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/00000000-tokens/output/gnosis.json b/balpy/balancer-deployments/tasks/00000000-tokens/output/gnosis.json new file mode 100644 index 0000000..63ab0d4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/00000000-tokens/output/gnosis.json @@ -0,0 +1,4 @@ +{ + "BAL": "0x7eF541E2a22058048904fE5744f9c7E4C57AF717", + "WETH": "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d" +} diff --git a/balpy/balancer-deployments/tasks/00000000-tokens/output/goerli.json b/balpy/balancer-deployments/tasks/00000000-tokens/output/goerli.json new file mode 100644 index 0000000..bc793ee --- /dev/null +++ b/balpy/balancer-deployments/tasks/00000000-tokens/output/goerli.json @@ -0,0 +1,4 @@ +{ + "BAL": "0xfA8449189744799aD2AcE7e0EBAC8BB7575eff47", + "WETH": "0xdFCeA9088c8A88A76FF74892C1457C17dfeef9C1" +} diff --git a/balpy/balancer-deployments/tasks/00000000-tokens/output/mainnet.json b/balpy/balancer-deployments/tasks/00000000-tokens/output/mainnet.json new file mode 100644 index 0000000..1fc6c7c --- /dev/null +++ b/balpy/balancer-deployments/tasks/00000000-tokens/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "BAL": "0xba100000625a3754423978a60c9317c58a424e3D", + "WETH": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" +} diff --git a/balpy/balancer-deployments/tasks/00000000-tokens/output/optimism.json b/balpy/balancer-deployments/tasks/00000000-tokens/output/optimism.json new file mode 100644 index 0000000..532e98e --- /dev/null +++ b/balpy/balancer-deployments/tasks/00000000-tokens/output/optimism.json @@ -0,0 +1,4 @@ +{ + "BAL": "0xFE8B128bA8C78aabC59d4c64cEE7fF28e9379921", + "WETH": "0x4200000000000000000000000000000000000006" +} diff --git a/balpy/balancer-deployments/tasks/00000000-tokens/output/polygon.json b/balpy/balancer-deployments/tasks/00000000-tokens/output/polygon.json new file mode 100644 index 0000000..bb848d7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/00000000-tokens/output/polygon.json @@ -0,0 +1,4 @@ +{ + "BAL": "0x9a71012B13CA4d3D0Cdc72A177DF3ef03b0E76A3", + "WETH": "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270" +} diff --git a/balpy/balancer-deployments/tasks/00000000-tokens/output/sepolia.json b/balpy/balancer-deployments/tasks/00000000-tokens/output/sepolia.json new file mode 100644 index 0000000..07ca2a6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/00000000-tokens/output/sepolia.json @@ -0,0 +1,4 @@ +{ + "BAL": "0xb19382073c7A0aDdbb56Ac6AF1808Fa49e377B75", + "WETH": "0x7b79995e5f793a07bc00c21412e50ecae098e7f9" +} diff --git a/balpy/balancer-deployments/tasks/00000000-tokens/output/zkevm.json b/balpy/balancer-deployments/tasks/00000000-tokens/output/zkevm.json new file mode 100644 index 0000000..55b79d5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/00000000-tokens/output/zkevm.json @@ -0,0 +1,4 @@ +{ + "WETH": "0x4F9A0e7FD2Bf6067db6994CF12E4495Df938E6e9", + "BAL": "0x120eF59b80774F02211563834d8E3b72cb1649d6" +} diff --git a/balpy/balancer-deployments/tasks/00000000-tokens/readme.md b/balpy/balancer-deployments/tasks/00000000-tokens/readme.md new file mode 100644 index 0000000..6fce157 --- /dev/null +++ b/balpy/balancer-deployments/tasks/00000000-tokens/readme.md @@ -0,0 +1,5 @@ +# Tokens + +This is not a real task, but rather a collection of token addresses that are useful so that they can be referenced in other tasks. The tokens included are WETH and BAL. + +Not all networks use ETH as their native token: in these, WETH really represents the wrapped native token. Examples include WMATIC in Polygon, WBNB in Binance and WXDAI in Gnosis. diff --git a/balpy/balancer-deployments/tasks/20210418-authorizer/artifact/Authorizer.json b/balpy/balancer-deployments/tasks/20210418-authorizer/artifact/Authorizer.json new file mode 100644 index 0000000..dee0a67 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-authorizer/artifact/Authorizer.json @@ -0,0 +1,351 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Authorizer", + "sourceName": "contracts/vault/Authorizer.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "canPerform", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "roles", + "type": "bytes32[]" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRoles", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "roles", + "type": "bytes32[]" + }, + { + "internalType": "address[]", + "name": "accounts", + "type": "address[]" + } + ], + "name": "grantRolesToMany", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "roles", + "type": "bytes32[]" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRoles", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "roles", + "type": "bytes32[]" + }, + { + "internalType": "address[]", + "name": "accounts", + "type": "address[]" + } + ], + "name": "revokeRolesFromMany", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50604051610e1d380380610e1d8339818101604052602081101561003357600080fd5b5051610040600082610046565b5061013d565b6100508282610054565b5050565b6000828152602081815260409091206100769183906108946100b7821b17901c565b156100505760405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d90600090a45050565b60006100c3838361011c565b61011257508154600180820184556000848152602080822090930180546001600160a01b0319166001600160a01b03861690811790915585549082528286019093526040902091909155610116565b5060005b92915050565b6001600160a01b031660009081526001919091016020526040902054151590565b610cd18061014c6000396000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c8063988360a31161008c578063a73cb2ab11610066578063a73cb2ab1461044b578063ca15c87314610572578063d547741f1461058f578063fcd7627e146105c8576100df565b8063988360a3146103475780639be2a88414610402578063a217fddf14610443576100df565b806336568abe116100bd57806336568abe146102755780639010d07c146102ae57806391d14854146102fa576100df565b806318b2cde9146100e4578063248a9ca31461020d5780632f2ff15d1461023c575b600080fd5b61020b600480360360408110156100fa57600080fd5b81019060208101813564010000000081111561011557600080fd5b82018360208201111561012757600080fd5b8035906020019184602083028401116401000000008311171561014957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561019957600080fd5b8201836020820111156101ab57600080fd5b803590602001918460208302840111640100000000831117156101cd57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610683945050505050565b005b61022a6004803603602081101561022357600080fd5b50356106d8565b60408051918252519081900360200190f35b61020b6004803603604081101561025257600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166106ed565b61020b6004803603604081101561028b57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16610723565b6102d1600480360360408110156102c457600080fd5b5080359060200135610751565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6103336004803603604081101561031057600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16610772565b604080519115158252519081900360200190f35b61020b6004803603604081101561035d57600080fd5b81019060208101813564010000000081111561037857600080fd5b82018360208201111561038a57600080fd5b803590602001918460208302840111640100000000831117156103ac57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505050903573ffffffffffffffffffffffffffffffffffffffff16915061078a9050565b6103336004803603606081101561041857600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff602082013581169160400135166107bb565b61022a6107cf565b61020b6004803603604081101561046157600080fd5b81019060208101813564010000000081111561047c57600080fd5b82018360208201111561048e57600080fd5b803590602001918460208302840111640100000000831117156104b057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561050057600080fd5b82018360208201111561051257600080fd5b8035906020019184602083028401116401000000008311171561053457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506107d4945050505050565b61022a6004803603602081101561058857600080fd5b5035610824565b61020b600480360360408110156105a557600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff1661083b565b61020b600480360360408110156105de57600080fd5b8101906020810181356401000000008111156105f957600080fd5b82018360208201111561060b57600080fd5b8035906020019184602083028401116401000000008311171561062d57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505050903573ffffffffffffffffffffffffffffffffffffffff1691506108639050565b61068f8251825161091c565b60005b82518110156106d3576106cb8382815181106106aa57fe5b60200260200101518383815181106106be57fe5b602002602001015161083b565b600101610692565b505050565b60009081526020819052604090206002015490565b6000828152602081905260409020600201546107159061070d9033610772565b6101a6610925565b61071f8282610933565b5050565b61074773ffffffffffffffffffffffffffffffffffffffff821633146101a8610925565b61071f8282610999565b600082815260208190526040812061076990836109ff565b90505b92915050565b60008281526020819052604081206107699083610a1b565b60005b82518110156106d3576107b38382815181106107a557fe5b60200260200101518361083b565b60010161078d565b60006107c78484610772565b949350505050565b600081565b6107e08251825161091c565b60005b82518110156106d35761081c8382815181106107fb57fe5b602002602001015183838151811061080f57fe5b60200260200101516106ed565b6001016107e3565b600081815260208190526040812061076c90610a49565b6000828152602081905260409020600201546107479061085b9033610772565b6101a7610925565b60005b82518110156106d35761088c83828151811061087e57fe5b6020026020010151836106ed565b600101610866565b60006108a08383610a1b565b61091457508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86169081179091558554908252828601909352604090209190915561076c565b50600061076c565b61071f81831460675b8161071f5761071f81610a4d565b600082815260208190526040902061094b9082610894565b1561071f57604051339073ffffffffffffffffffffffffffffffffffffffff83169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d90600090a45050565b60008281526020819052604090206109b19082610aba565b1561071f57604051339073ffffffffffffffffffffffffffffffffffffffff83169084907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90600090a45050565b8154600090610a119083106064610925565b6107698383610c61565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001919091016020526040902054151590565b5490565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120548015610c575783547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083019190810190600090879083908110610b2257fe5b600091825260209091200154875473ffffffffffffffffffffffffffffffffffffffff90911691508190889085908110610b5857fe5b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055918316815260018981019092526040902090840190558654879080610bc657fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff8816825260018981019091526040822091909155945061076c9350505050565b600091505061076c565b6000826000018281548110610c7257fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16939250505056fea2646970667358221220dfe715d2cd44c733089f2c396b8ba6a91ca4ec5b907632f366d4d8a9814a53d364736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100df5760003560e01c8063988360a31161008c578063a73cb2ab11610066578063a73cb2ab1461044b578063ca15c87314610572578063d547741f1461058f578063fcd7627e146105c8576100df565b8063988360a3146103475780639be2a88414610402578063a217fddf14610443576100df565b806336568abe116100bd57806336568abe146102755780639010d07c146102ae57806391d14854146102fa576100df565b806318b2cde9146100e4578063248a9ca31461020d5780632f2ff15d1461023c575b600080fd5b61020b600480360360408110156100fa57600080fd5b81019060208101813564010000000081111561011557600080fd5b82018360208201111561012757600080fd5b8035906020019184602083028401116401000000008311171561014957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561019957600080fd5b8201836020820111156101ab57600080fd5b803590602001918460208302840111640100000000831117156101cd57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610683945050505050565b005b61022a6004803603602081101561022357600080fd5b50356106d8565b60408051918252519081900360200190f35b61020b6004803603604081101561025257600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166106ed565b61020b6004803603604081101561028b57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16610723565b6102d1600480360360408110156102c457600080fd5b5080359060200135610751565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6103336004803603604081101561031057600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16610772565b604080519115158252519081900360200190f35b61020b6004803603604081101561035d57600080fd5b81019060208101813564010000000081111561037857600080fd5b82018360208201111561038a57600080fd5b803590602001918460208302840111640100000000831117156103ac57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505050903573ffffffffffffffffffffffffffffffffffffffff16915061078a9050565b6103336004803603606081101561041857600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff602082013581169160400135166107bb565b61022a6107cf565b61020b6004803603604081101561046157600080fd5b81019060208101813564010000000081111561047c57600080fd5b82018360208201111561048e57600080fd5b803590602001918460208302840111640100000000831117156104b057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561050057600080fd5b82018360208201111561051257600080fd5b8035906020019184602083028401116401000000008311171561053457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506107d4945050505050565b61022a6004803603602081101561058857600080fd5b5035610824565b61020b600480360360408110156105a557600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff1661083b565b61020b600480360360408110156105de57600080fd5b8101906020810181356401000000008111156105f957600080fd5b82018360208201111561060b57600080fd5b8035906020019184602083028401116401000000008311171561062d57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505050903573ffffffffffffffffffffffffffffffffffffffff1691506108639050565b61068f8251825161091c565b60005b82518110156106d3576106cb8382815181106106aa57fe5b60200260200101518383815181106106be57fe5b602002602001015161083b565b600101610692565b505050565b60009081526020819052604090206002015490565b6000828152602081905260409020600201546107159061070d9033610772565b6101a6610925565b61071f8282610933565b5050565b61074773ffffffffffffffffffffffffffffffffffffffff821633146101a8610925565b61071f8282610999565b600082815260208190526040812061076990836109ff565b90505b92915050565b60008281526020819052604081206107699083610a1b565b60005b82518110156106d3576107b38382815181106107a557fe5b60200260200101518361083b565b60010161078d565b60006107c78484610772565b949350505050565b600081565b6107e08251825161091c565b60005b82518110156106d35761081c8382815181106107fb57fe5b602002602001015183838151811061080f57fe5b60200260200101516106ed565b6001016107e3565b600081815260208190526040812061076c90610a49565b6000828152602081905260409020600201546107479061085b9033610772565b6101a7610925565b60005b82518110156106d35761088c83828151811061087e57fe5b6020026020010151836106ed565b600101610866565b60006108a08383610a1b565b61091457508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86169081179091558554908252828601909352604090209190915561076c565b50600061076c565b61071f81831460675b8161071f5761071f81610a4d565b600082815260208190526040902061094b9082610894565b1561071f57604051339073ffffffffffffffffffffffffffffffffffffffff83169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d90600090a45050565b60008281526020819052604090206109b19082610aba565b1561071f57604051339073ffffffffffffffffffffffffffffffffffffffff83169084907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90600090a45050565b8154600090610a119083106064610925565b6107698383610c61565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001919091016020526040902054151590565b5490565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120548015610c575783547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083019190810190600090879083908110610b2257fe5b600091825260209091200154875473ffffffffffffffffffffffffffffffffffffffff90911691508190889085908110610b5857fe5b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055918316815260018981019092526040902090840190558654879080610bc657fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff8816825260018981019091526040822091909155945061076c9350505050565b600091505061076c565b6000826000018281548110610c7257fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16939250505056fea2646970667358221220dfe715d2cd44c733089f2c396b8ba6a91ca4ec5b907632f366d4d8a9814a53d364736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-authorizer/index.ts b/balpy/balancer-deployments/tasks/20210418-authorizer/index.ts new file mode 100644 index 0000000..5463f59 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-authorizer/index.ts @@ -0,0 +1,8 @@ +import { Task, TaskRunOptions } from '@src'; +import { AuthorizerDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as AuthorizerDeployment; + const args = [input.admin]; + await task.deployAndVerify('Authorizer', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20210418-authorizer/input.ts b/balpy/balancer-deployments/tasks/20210418-authorizer/input.ts new file mode 100644 index 0000000..9def0d4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-authorizer/input.ts @@ -0,0 +1,45 @@ +export type AuthorizerDeployment = { + admin: string; +}; + +export default { + kovan: { + admin: '0xE0a171587b1Cae546E069A943EDa96916F5EE977', + }, + mainnet: { + admin: '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f', + }, + polygon: { + admin: '0xd2bD536ADB0198f74D5f4f2Bd4Fe68Bae1e1Ba80', + }, + arbitrum: { + admin: '0x6207ed574152496c9B072C24FD87cE9cd9E17320', + }, + optimism: { + admin: '0xFB2ac3989B6AD0e043a8958004484d6BAAb2c6Ab', + }, + gnosis: { + admin: '0x2a5AEcE0bb9EfFD7608213AE1745873385515c18', + }, + bsc: { + admin: '0x58099b94e660bBe19848547F6c5d76DcA7282E45', + }, + avalanche: { + admin: '0x17b11FF13e2d7bAb2648182dFD1f1cfa0E4C7cf3', + }, + zkevm: { + admin: '0x2f237e7643a3bF6Ef265dd6FCBcd26a7Cc38dbAa', + }, + goerli: { + admin: '0xE0a171587b1Cae546E069A943EDa96916F5EE977', + }, + sepolia: { + admin: '0x171C0fF5943CE5f133130436A29bF61E26516003', + }, + base: { + admin: '0xC40DCFB13651e64C8551007aa57F9260827B6462', + }, + fantom: { + admin: '0x4fbe899d37fb7514adf2f41B0630E018Ec275a0C', + }, +}; diff --git a/balpy/balancer-deployments/tasks/20210418-authorizer/output/arbitrum.json b/balpy/balancer-deployments/tasks/20210418-authorizer/output/arbitrum.json new file mode 100644 index 0000000..7387059 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-authorizer/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "Authorizer": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" +} diff --git a/balpy/balancer-deployments/tasks/20210418-authorizer/output/avalanche.json b/balpy/balancer-deployments/tasks/20210418-authorizer/output/avalanche.json new file mode 100644 index 0000000..c4d48e5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-authorizer/output/avalanche.json @@ -0,0 +1,3 @@ +{ + "Authorizer": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-authorizer/output/base.json b/balpy/balancer-deployments/tasks/20210418-authorizer/output/base.json new file mode 100644 index 0000000..fc9fc2f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-authorizer/output/base.json @@ -0,0 +1,3 @@ +{ + "Authorizer": "0x809B79b53F18E9bc08A961ED4678B901aC93213a" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-authorizer/output/bsc.json b/balpy/balancer-deployments/tasks/20210418-authorizer/output/bsc.json new file mode 100644 index 0000000..7387059 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-authorizer/output/bsc.json @@ -0,0 +1,3 @@ +{ + "Authorizer": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" +} diff --git a/balpy/balancer-deployments/tasks/20210418-authorizer/output/fantom.json b/balpy/balancer-deployments/tasks/20210418-authorizer/output/fantom.json new file mode 100644 index 0000000..d474925 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-authorizer/output/fantom.json @@ -0,0 +1,3 @@ +{ + "Authorizer": "0x974D3FF709D84Ba44cde3257C0B5B0b14C081Ce9" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-authorizer/output/gnosis.json b/balpy/balancer-deployments/tasks/20210418-authorizer/output/gnosis.json new file mode 100644 index 0000000..7387059 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-authorizer/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "Authorizer": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" +} diff --git a/balpy/balancer-deployments/tasks/20210418-authorizer/output/goerli.json b/balpy/balancer-deployments/tasks/20210418-authorizer/output/goerli.json new file mode 100644 index 0000000..c4d48e5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-authorizer/output/goerli.json @@ -0,0 +1,3 @@ +{ + "Authorizer": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-authorizer/output/kovan.json b/balpy/balancer-deployments/tasks/20210418-authorizer/output/kovan.json new file mode 100644 index 0000000..c4d48e5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-authorizer/output/kovan.json @@ -0,0 +1,3 @@ +{ + "Authorizer": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-authorizer/output/mainnet.json b/balpy/balancer-deployments/tasks/20210418-authorizer/output/mainnet.json new file mode 100644 index 0000000..c4d48e5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-authorizer/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "Authorizer": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-authorizer/output/mode.json b/balpy/balancer-deployments/tasks/20210418-authorizer/output/mode.json new file mode 100644 index 0000000..9900f98 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-authorizer/output/mode.json @@ -0,0 +1,4 @@ +{ + "Authorizer": "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5" +} + \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-authorizer/output/optimism.json b/balpy/balancer-deployments/tasks/20210418-authorizer/output/optimism.json new file mode 100644 index 0000000..7387059 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-authorizer/output/optimism.json @@ -0,0 +1,3 @@ +{ + "Authorizer": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" +} diff --git a/balpy/balancer-deployments/tasks/20210418-authorizer/output/polygon.json b/balpy/balancer-deployments/tasks/20210418-authorizer/output/polygon.json new file mode 100644 index 0000000..c4d48e5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-authorizer/output/polygon.json @@ -0,0 +1,3 @@ +{ + "Authorizer": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-authorizer/output/rinkeby.json b/balpy/balancer-deployments/tasks/20210418-authorizer/output/rinkeby.json new file mode 100644 index 0000000..c4d48e5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-authorizer/output/rinkeby.json @@ -0,0 +1,3 @@ +{ + "Authorizer": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-authorizer/output/sepolia.json b/balpy/balancer-deployments/tasks/20210418-authorizer/output/sepolia.json new file mode 100644 index 0000000..c4d48e5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-authorizer/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "Authorizer": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-authorizer/output/zkevm.json b/balpy/balancer-deployments/tasks/20210418-authorizer/output/zkevm.json new file mode 100644 index 0000000..7387059 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-authorizer/output/zkevm.json @@ -0,0 +1,3 @@ +{ + "Authorizer": "0xA331D84eC860Bf466b4CdCcFb4aC09a1B43F3aE6" +} diff --git a/balpy/balancer-deployments/tasks/20210418-authorizer/readme.md b/balpy/balancer-deployments/tasks/20210418-authorizer/readme.md new file mode 100644 index 0000000..ac1322e --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-authorizer/readme.md @@ -0,0 +1,21 @@ +# 2021-04-18 Authorizer + +Initial version of the Authorizer contract, which powers Balancer governance. + +This contract is expected to be eventually replaced by one with a) native support for timelocks and b) more granular roles, that is, being able to grant powers over a subset of related contracts. These development efforts are tracked [here](https://github.com/balancer-labs/balancer-v2-monorepo/milestone/4). + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Fantom mainnet addresses](./output/fantom.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`Authorizer` artifact](./artifact/Authorizer.json) diff --git a/balpy/balancer-deployments/tasks/20210418-vault/artifact/BalancerHelpers.json b/balpy/balancer-deployments/tasks/20210418-vault/artifact/BalancerHelpers.json new file mode 100644 index 0000000..fb2880d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-vault/artifact/BalancerHelpers.json @@ -0,0 +1,157 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BalancerHelpers", + "sourceName": "contracts/lib/helpers/BalancerHelpers.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "_vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "minAmountsOut", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.ExitPoolRequest", + "name": "request", + "type": "tuple" + } + ], + "name": "queryExit", + "outputs": [ + { + "internalType": "uint256", + "name": "bptIn", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "maxAmountsIn", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.JoinPoolRequest", + "name": "request", + "type": "tuple" + } + ], + "name": "queryJoin", + "outputs": [ + { + "internalType": "uint256", + "name": "bptOut", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "vault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60c060405234801561001057600080fd5b5060405161100f38038061100f83398101604081905261002f916100bf565b806001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561006857600080fd5b505afa15801561007c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100a091906100bf565b6001600160601b0319606091821b811660805291901b1660a0526100fa565b6000602082840312156100d0578081fd5b81516100db816100e2565b9392505050565b6001600160a01b03811681146100f757600080fd5b50565b60805160601c60a05160601c610ed461013b6000398060a0528061016352806103545280610417528061051e52806105905250806108585250610ed46000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80639ebbf05d14610046578063c7b2c52c14610070578063fbfa77cf14610083575b600080fd5b610059610054366004610c5d565b610098565b604051610067929190610e11565b60405180910390f35b61005961007e366004610bf3565b61034c565b61008b61051c565b6040516100679190610df0565b6000606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f6c00927886040518263ffffffff1660e01b81526004016100f79190610d2c565b604080518083038186803b15801561010e57600080fd5b505afa158015610122573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101469190610aeb565b5090506060600061015b898760000151610540565b9150915060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156101c757600080fd5b505afa1580156101db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101ff9190610c72565b90508373ffffffffffffffffffffffffffffffffffffffff166387ec68178b8b8b87878773ffffffffffffffffffffffffffffffffffffffff166355c676286040518163ffffffff1660e01b815260040160206040518083038186803b15801561026857600080fd5b505afa15801561027c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102a09190610c95565b8e604001516040518863ffffffff1660e01b81526004016102c79796959493929190610d35565b600060405180830381600087803b1580156102e157600080fd5b505af11580156102f5573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261033b9190810190610cad565b909b909a5098505050505050505050565b6000606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f6c00927886040518263ffffffff1660e01b81526004016103ab9190610d2c565b604080518083038186803b1580156103c257600080fd5b505afa1580156103d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fa9190610aeb565b5090506060600061040f898760000151610540565b9150915060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561047b57600080fd5b505afa15801561048f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b39190610c72565b90508373ffffffffffffffffffffffffffffffffffffffff16636028bfd48b8b8b87878773ffffffffffffffffffffffffffffffffffffffff166355c676286040518163ffffffff1660e01b815260040160206040518083038186803b15801561026857600080fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b60606000606080610550856106d2565b6040517ff94d466800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f94d4668906105c5908990600401610d2c565b60006040518083038186803b1580156105dd57600080fd5b505afa1580156105f1573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526106379190810190610b27565b8251845192975090955091935061064e9190610782565b60005b82518110156106c857600083828151811061066857fe5b602002602001015190506106bf83838151811061068157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610208610793565b50600101610651565b5050509250929050565b606080825167ffffffffffffffff811180156106ed57600080fd5b50604051908082528060200260200182016040528015610717578160200160208202803683370190505b50905060005b835181101561077b5761074284828151811061073557fe5b60200260200101516107a1565b82828151811061074e57fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161071d565b5092915050565b61078f8183146067610793565b5050565b8161078f5761078f816107cc565b60006107ac82610839565b6107be576107b982610853565b6107c6565b6107c6610856565b92915050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b73ffffffffffffffffffffffffffffffffffffffff161590565b90565b7f000000000000000000000000000000000000000000000000000000000000000090565b600082601f83011261088a578081fd5b813561089d61089882610e59565b610e32565b8181529150602080830190848101818402860182018710156108be57600080fd5b60005b848110156108e65781356108d481610e79565b845292820192908201906001016108c1565b505050505092915050565b600082601f830112610901578081fd5b813561090f61089882610e59565b81815291506020808301908481018184028601820187101561093057600080fd5b60005b848110156108e657813584529282019290820190600101610933565b600082601f83011261095f578081fd5b815161096d61089882610e59565b81815291506020808301908481018184028601820187101561098e57600080fd5b60005b848110156108e657815184529282019290820190600101610991565b803580151581146107c657600080fd5b600082601f8301126109cd578081fd5b813567ffffffffffffffff8111156109e3578182fd5b610a1460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610e32565b9150808252836020828501011115610a2b57600080fd5b8060208401602084013760009082016020015292915050565b600060808284031215610a55578081fd5b610a5f6080610e32565b9050813567ffffffffffffffff80821115610a7957600080fd5b610a858583860161087a565b83526020840135915080821115610a9b57600080fd5b610aa7858386016108f1565b60208401526040840135915080821115610ac057600080fd5b50610acd848285016109bd565b604083015250610ae083606084016109ad565b606082015292915050565b60008060408385031215610afd578182fd5b8251610b0881610e79565b602084015190925060038110610b1c578182fd5b809150509250929050565b600080600060608486031215610b3b578081fd5b835167ffffffffffffffff80821115610b52578283fd5b818601915086601f830112610b65578283fd5b8151610b7361089882610e59565b80828252602080830192508086018b828387028901011115610b93578788fd5b8796505b84871015610bbe578051610baa81610e79565b845260019690960195928101928101610b97565b508901519097509350505080821115610bd5578283fd5b50610be28682870161094f565b925050604084015190509250925092565b60008060008060808587031215610c08578081fd5b843593506020850135610c1a81610e79565b92506040850135610c2a81610e79565b9150606085013567ffffffffffffffff811115610c45578182fd5b610c5187828801610a44565b91505092959194509250565b60008060008060808587031215610c08578384fd5b600060208284031215610c83578081fd5b8151610c8e81610e79565b9392505050565b600060208284031215610ca6578081fd5b5051919050565b60008060408385031215610cbf578182fd5b82519150602083015167ffffffffffffffff811115610cdc578182fd5b610ce88582860161094f565b9150509250929050565b6000815180845260208085019450808401835b83811015610d2157815187529582019590820190600101610d05565b509495945050505050565b90815260200190565b6000888252602073ffffffffffffffffffffffffffffffffffffffff808a168285015280891660408501525060e06060840152610d7560e0840188610cf2565b8660808501528560a085015283810360c08501528451808252835b81811015610dab578681018401518382018501528301610d90565b81811115610dbb57848483850101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600083825260406020830152610e2a6040830184610cf2565b949350505050565b60405181810167ffffffffffffffff81118282101715610e5157600080fd5b604052919050565b600067ffffffffffffffff821115610e6f578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff81168114610e9b57600080fd5b5056fea26469706673582212202c73b5978a67e397fc9cfd493e858b7f5860760cb31c1f827e6638c411b5594364736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80639ebbf05d14610046578063c7b2c52c14610070578063fbfa77cf14610083575b600080fd5b610059610054366004610c5d565b610098565b604051610067929190610e11565b60405180910390f35b61005961007e366004610bf3565b61034c565b61008b61051c565b6040516100679190610df0565b6000606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f6c00927886040518263ffffffff1660e01b81526004016100f79190610d2c565b604080518083038186803b15801561010e57600080fd5b505afa158015610122573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101469190610aeb565b5090506060600061015b898760000151610540565b9150915060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156101c757600080fd5b505afa1580156101db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101ff9190610c72565b90508373ffffffffffffffffffffffffffffffffffffffff166387ec68178b8b8b87878773ffffffffffffffffffffffffffffffffffffffff166355c676286040518163ffffffff1660e01b815260040160206040518083038186803b15801561026857600080fd5b505afa15801561027c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102a09190610c95565b8e604001516040518863ffffffff1660e01b81526004016102c79796959493929190610d35565b600060405180830381600087803b1580156102e157600080fd5b505af11580156102f5573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261033b9190810190610cad565b909b909a5098505050505050505050565b6000606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f6c00927886040518263ffffffff1660e01b81526004016103ab9190610d2c565b604080518083038186803b1580156103c257600080fd5b505afa1580156103d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fa9190610aeb565b5090506060600061040f898760000151610540565b9150915060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561047b57600080fd5b505afa15801561048f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b39190610c72565b90508373ffffffffffffffffffffffffffffffffffffffff16636028bfd48b8b8b87878773ffffffffffffffffffffffffffffffffffffffff166355c676286040518163ffffffff1660e01b815260040160206040518083038186803b15801561026857600080fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b60606000606080610550856106d2565b6040517ff94d466800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f94d4668906105c5908990600401610d2c565b60006040518083038186803b1580156105dd57600080fd5b505afa1580156105f1573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526106379190810190610b27565b8251845192975090955091935061064e9190610782565b60005b82518110156106c857600083828151811061066857fe5b602002602001015190506106bf83838151811061068157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610208610793565b50600101610651565b5050509250929050565b606080825167ffffffffffffffff811180156106ed57600080fd5b50604051908082528060200260200182016040528015610717578160200160208202803683370190505b50905060005b835181101561077b5761074284828151811061073557fe5b60200260200101516107a1565b82828151811061074e57fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161071d565b5092915050565b61078f8183146067610793565b5050565b8161078f5761078f816107cc565b60006107ac82610839565b6107be576107b982610853565b6107c6565b6107c6610856565b92915050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b73ffffffffffffffffffffffffffffffffffffffff161590565b90565b7f000000000000000000000000000000000000000000000000000000000000000090565b600082601f83011261088a578081fd5b813561089d61089882610e59565b610e32565b8181529150602080830190848101818402860182018710156108be57600080fd5b60005b848110156108e65781356108d481610e79565b845292820192908201906001016108c1565b505050505092915050565b600082601f830112610901578081fd5b813561090f61089882610e59565b81815291506020808301908481018184028601820187101561093057600080fd5b60005b848110156108e657813584529282019290820190600101610933565b600082601f83011261095f578081fd5b815161096d61089882610e59565b81815291506020808301908481018184028601820187101561098e57600080fd5b60005b848110156108e657815184529282019290820190600101610991565b803580151581146107c657600080fd5b600082601f8301126109cd578081fd5b813567ffffffffffffffff8111156109e3578182fd5b610a1460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610e32565b9150808252836020828501011115610a2b57600080fd5b8060208401602084013760009082016020015292915050565b600060808284031215610a55578081fd5b610a5f6080610e32565b9050813567ffffffffffffffff80821115610a7957600080fd5b610a858583860161087a565b83526020840135915080821115610a9b57600080fd5b610aa7858386016108f1565b60208401526040840135915080821115610ac057600080fd5b50610acd848285016109bd565b604083015250610ae083606084016109ad565b606082015292915050565b60008060408385031215610afd578182fd5b8251610b0881610e79565b602084015190925060038110610b1c578182fd5b809150509250929050565b600080600060608486031215610b3b578081fd5b835167ffffffffffffffff80821115610b52578283fd5b818601915086601f830112610b65578283fd5b8151610b7361089882610e59565b80828252602080830192508086018b828387028901011115610b93578788fd5b8796505b84871015610bbe578051610baa81610e79565b845260019690960195928101928101610b97565b508901519097509350505080821115610bd5578283fd5b50610be28682870161094f565b925050604084015190509250925092565b60008060008060808587031215610c08578081fd5b843593506020850135610c1a81610e79565b92506040850135610c2a81610e79565b9150606085013567ffffffffffffffff811115610c45578182fd5b610c5187828801610a44565b91505092959194509250565b60008060008060808587031215610c08578384fd5b600060208284031215610c83578081fd5b8151610c8e81610e79565b9392505050565b600060208284031215610ca6578081fd5b5051919050565b60008060408385031215610cbf578182fd5b82519150602083015167ffffffffffffffff811115610cdc578182fd5b610ce88582860161094f565b9150509250929050565b6000815180845260208085019450808401835b83811015610d2157815187529582019590820190600101610d05565b509495945050505050565b90815260200190565b6000888252602073ffffffffffffffffffffffffffffffffffffffff808a168285015280891660408501525060e06060840152610d7560e0840188610cf2565b8660808501528560a085015283810360c08501528451808252835b81811015610dab578681018401518382018501528301610d90565b81811115610dbb57848483850101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600083825260406020830152610e2a6040830184610cf2565b949350505050565b60405181810167ffffffffffffffff81118282101715610e5157600080fd5b604052919050565b600067ffffffffffffffff821115610e6f578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff81168114610e9b57600080fd5b5056fea26469706673582212202c73b5978a67e397fc9cfd493e858b7f5860760cb31c1f827e6638c411b5594364736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-vault/artifact/Vault.json b/balpy/balancer-deployments/tasks/20210418-vault/artifact/Vault.json new file mode 100644 index 0000000..d45441e --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-vault/artifact/Vault.json @@ -0,0 +1,1188 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Vault", + "sourceName": "contracts/vault/Vault.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IAuthorizer", + "name": "authorizer", + "type": "address" + }, + { + "internalType": "contract IWETH", + "name": "weth", + "type": "address" + }, + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IAuthorizer", + "name": "newAuthorizer", + "type": "address" + } + ], + "name": "AuthorizerChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ExternalBalanceTransfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IFlashLoanRecipient", + "name": "recipient", + "type": "address" + }, + { + "indexed": true, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "feeAmount", + "type": "uint256" + } + ], + "name": "FlashLoan", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "int256", + "name": "delta", + "type": "int256" + } + ], + "name": "InternalBalanceChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "paused", + "type": "bool" + } + ], + "name": "PausedStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "liquidityProvider", + "type": "address" + }, + { + "indexed": false, + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "int256[]", + "name": "deltas", + "type": "int256[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "protocolFeeAmounts", + "type": "uint256[]" + } + ], + "name": "PoolBalanceChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "assetManager", + "type": "address" + }, + { + "indexed": true, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "int256", + "name": "cashDelta", + "type": "int256" + }, + { + "indexed": false, + "internalType": "int256", + "name": "managedDelta", + "type": "int256" + } + ], + "name": "PoolBalanceManaged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "poolAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "enum IVault.PoolSpecialization", + "name": "specialization", + "type": "uint8" + } + ], + "name": "PoolRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "relayer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "RelayerApprovalChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "contract IERC20", + "name": "tokenIn", + "type": "address" + }, + { + "indexed": true, + "internalType": "contract IERC20", + "name": "tokenOut", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + } + ], + "name": "Swap", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "TokensDeregistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "address[]", + "name": "assetManagers", + "type": "address[]" + } + ], + "name": "TokensRegistered", + "type": "event" + }, + { + "inputs": [], + "name": "WETH", + "outputs": [ + { + "internalType": "contract IWETH", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "assetInIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "assetOutIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IVault.BatchSwapStep[]", + "name": "swaps", + "type": "tuple[]" + }, + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + }, + { + "internalType": "int256[]", + "name": "limits", + "type": "int256[]" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "batchSwap", + "outputs": [ + { + "internalType": "int256[]", + "name": "assetDeltas", + "type": "int256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "deregisterTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "minAmountsOut", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.ExitPoolRequest", + "name": "request", + "type": "tuple" + } + ], + "name": "exitPool", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IFlashLoanRecipient", + "name": "recipient", + "type": "address" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "flashLoan", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "getInternalBalance", + "outputs": [ + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "getNextNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPausedState", + "outputs": [ + { + "internalType": "bool", + "name": "paused", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "pauseWindowEndTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodEndTime", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + } + ], + "name": "getPool", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "enum IVault.PoolSpecialization", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "getPoolTokenInfo", + "outputs": [ + { + "internalType": "uint256", + "name": "cash", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "managed", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "assetManager", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + } + ], + "name": "getPoolTokens", + "outputs": [ + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeesCollector", + "outputs": [ + { + "internalType": "contract ProtocolFeesCollector", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "address", + "name": "relayer", + "type": "address" + } + ], + "name": "hasApprovedRelayer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "maxAmountsIn", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.JoinPoolRequest", + "name": "request", + "type": "tuple" + } + ], + "name": "joinPool", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.PoolBalanceOpKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct IVault.PoolBalanceOp[]", + "name": "ops", + "type": "tuple[]" + } + ], + "name": "managePoolBalance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.UserBalanceOpKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IAsset", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + } + ], + "internalType": "struct IVault.UserBalanceOp[]", + "name": "ops", + "type": "tuple[]" + } + ], + "name": "manageUserBalance", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "assetInIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "assetOutIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IVault.BatchSwapStep[]", + "name": "swaps", + "type": "tuple[]" + }, + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + } + ], + "name": "queryBatchSwap", + "outputs": [ + { + "internalType": "int256[]", + "name": "", + "type": "int256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IVault.PoolSpecialization", + "name": "specialization", + "type": "uint8" + } + ], + "name": "registerPool", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "address[]", + "name": "assetManagers", + "type": "address[]" + } + ], + "name": "registerTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IAuthorizer", + "name": "newAuthorizer", + "type": "address" + } + ], + "name": "setAuthorizer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "paused", + "type": "bool" + } + ], + "name": "setPaused", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "relayer", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setRelayerApproval", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IAsset", + "name": "assetIn", + "type": "address" + }, + { + "internalType": "contract IAsset", + "name": "assetOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IVault.SingleSwap", + "name": "singleSwap", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "limit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swap", + "outputs": [ + { + "internalType": "uint256", + "name": "amountCalculated", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x6101806040523480156200001257600080fd5b5060405162006ed638038062006ed6833981016040819052620000359162000253565b8382826040518060400160405280601181526020017010985b185b98d95c88158c8815985d5b1d607a1b81525080604051806040016040528060018152602001603160f81b815250306001600160a01b031660001b89806001600160a01b03166080816001600160a01b031660601b815250505030604051620000b89062000245565b620000c491906200029f565b604051809103906000f080158015620000e1573d6000803e3d6000fd5b5060601b6001600160601b03191660a052600160005560c052815160209283012060e052805191012061010052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61012052620001486276a70083111561019462000181565b6200015c62278d0082111561019562000181565b429091016101408190520161016052620001768162000196565b5050505050620002cc565b8162000192576200019281620001f2565b5050565b6040516001600160a01b038216907f94b979b6831a51293e2641426f97747feed46f17779fed9cd18d1ecefcfe92ef90600090a2600380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b610be680620062f083390190565b6000806000806080858703121562000269578384fd5b84516200027681620002b3565b60208601519094506200028981620002b3565b6040860151606090960151949790965092505050565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114620002c957600080fd5b50565b60805160601c60a05160601c60c05160e05161010051610120516101405161016051615fc06200033060003980611aed525080611ac952508061289f5250806128e15250806128c05250806110fd5250806113b15250806105285250615fc06000f3fe6080604052600436106101a55760003560e01c8063945bcec9116100e1578063e6c460921161008a578063f84d066e11610064578063f84d066e1461048a578063f94d4668146104aa578063fa6e671d146104d9578063fec90d72146104f9576101d3565b8063e6c4609214610427578063ed24911d14610447578063f6c009271461045c576101d3565b8063b05f8e48116100bb578063b05f8e48146103cf578063b95cac28146103ff578063d2946c2b14610412576101d3565b8063945bcec914610385578063aaabadc514610398578063ad5c4648146103ba576101d3565b806352bbbe291161014e5780637d3aeb96116101285780637d3aeb9614610305578063851c1bb3146103255780638bdb39131461034557806390193b7c14610365576101d3565b806352bbbe29146102b25780635c38449e146102c557806366a9c7d2146102e5576101d3565b80630f5a6efa1161017f5780630f5a6efa1461024157806316c38b3c1461026e5780631c0de0511461028e576101d3565b8063058a628f146101d857806309b2760f146101f85780630e8e3e841461022e576101d3565b366101d3576101d16101b5610526565b6001600160a01b0316336001600160a01b03161461020661054b565b005b600080fd5b3480156101e457600080fd5b506101d16101f3366004615157565b61055d565b34801561020457600080fd5b506102186102133660046156e6565b610581565b6040516102259190615d3e565b60405180910390f35b6101d161023c36600461531e565b610634565b34801561024d57600080fd5b5061026161025c3660046151f5565b610770565b6040516102259190615d08565b34801561027a57600080fd5b506101d161028936600461545c565b610806565b34801561029a57600080fd5b506102a361081f565b60405161022593929190615d26565b6102186102c036600461588f565b610848565b3480156102d157600080fd5b506101d16102e036600461565b565b6109e9565b3480156102f157600080fd5b506101d1610300366004615545565b610e06565b34801561031157600080fd5b506101d1610320366004615516565b610fa5565b34801561033157600080fd5b50610218610340366004615633565b6110f9565b34801561035157600080fd5b506101d16103603660046154ac565b61114b565b34801561037157600080fd5b50610218610380366004615157565b611161565b610261610393366004615786565b61117c565b3480156103a457600080fd5b506103ad6112b0565b6040516102259190615b63565b3480156103c657600080fd5b506103ad6112c4565b3480156103db57600080fd5b506103ef6103ea36600461560f565b6112d3565b6040516102259493929190615eb9565b6101d161040d3660046154ac565b611396565b34801561041e57600080fd5b506103ad6113af565b34801561043357600080fd5b506101d1610442366004615243565b6113d3565b34801561045357600080fd5b506102186114ef565b34801561046857600080fd5b5061047c610477366004615494565b6114f9565b604051610225929190615b9b565b34801561049657600080fd5b506102616104a5366004615702565b611523565b3480156104b657600080fd5b506104ca6104c5366004615494565b611620565b60405161022593929190615cd2565b3480156104e557600080fd5b506101d16104f43660046151ab565b611654565b34801561050557600080fd5b50610519610514366004615173565b6116e6565b6040516102259190615d1b565b7f00000000000000000000000000000000000000000000000000000000000000005b90565b8161055957610559816116fb565b5050565b610565611768565b61056d611781565b610576816117af565b61057e611822565b50565b600061058b611768565b610593611829565b60006105a2338460065461183e565b6000818152600560205260409020549091506105c49060ff16156101f461054b565b60008181526005602052604090819020805460ff1916600190811790915560068054909101905551339082907f3c13bc30b8e878c53fd2a36b679409c073afd75950be43d8858768e956fbc20e9061061d908790615e3a565b60405180910390a3905061062f611822565b919050565b61063c611768565b6000806000805b845181101561075b5760008060008060006106718a878151811061066357fe5b60200260200101518961187d565b9c50939850919650945092509050600185600381111561068d57fe5b14156106a45761069f848383866118f5565b61074a565b866106b6576106b1611829565b600196505b60008560038111156106c457fe5b14156106f5576106d684838386611918565b6106df84611938565b1561069f576106ee8984611945565b985061074a565b61070a61070185611938565b1561020761054b565b600061071585610548565b9050600286600381111561072557fe5b141561073c5761073781848487611957565b610748565b61074881848487611970565b505b505060019093019250610643915050565b50610765836119de565b50505061057e611822565b6060815167ffffffffffffffff8111801561078a57600080fd5b506040519080825280602002602001820160405280156107b4578160200160208202803683370190505b50905060005b82518110156107ff576107e0848483815181106107d357fe5b6020026020010151611a01565b8282815181106107ec57fe5b60209081029190910101526001016107ba565b5092915050565b61080e611768565b610816611781565b61057681611a2c565b600080600061082c611aaa565b159250610837611ac7565b9150610841611aeb565b9050909192565b6000610852611768565b61085a611829565b835161086581611b0f565b610874834211156101fc61054b565b61088760008760800151116101fe61054b565b60006108968760400151611b41565b905060006108a78860600151611b41565b90506108ca816001600160a01b0316836001600160a01b031614156101fd61054b565b6108d2614ce1565b885160808201526020890151819060018111156108eb57fe5b908160018111156108f857fe5b9052506001600160a01b03808416602083015282811660408084019190915260808b0151606084015260a08b01516101008401528951821660c08401528901511660e082015260008061094a83611b66565b9198509250905061098160008c60200151600181111561096657fe5b146109745789831115610979565b898210155b6101fb61054b565b6109998b60400151838c600001518d60200151611c5a565b6109b18b60600151828c604001518d60600151611d38565b6109d36109c18c60400151611938565b6109cc5760006109ce565b825b6119de565b5050505050506109e1611822565b949350505050565b6109f1611768565b6109f9611829565b610a0583518351611e12565b6060835167ffffffffffffffff81118015610a1f57600080fd5b50604051908082528060200260200182016040528015610a49578160200160208202803683370190505b5090506060845167ffffffffffffffff81118015610a6657600080fd5b50604051908082528060200260200182016040528015610a90578160200160208202803683370190505b5090506000805b8651811015610c09576000878281518110610aae57fe5b602002602001015190506000878381518110610ac657fe5b60200260200101519050610b11846001600160a01b0316836001600160a01b03161160006001600160a01b0316846001600160a01b031614610b09576066610b0c565b60685b61054b565b819350816001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610b409190615b63565b60206040518083038186803b158015610b5857600080fd5b505afa158015610b6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b909190615968565b858481518110610b9c57fe5b602002602001018181525050610bb181611e1f565b868481518110610bbd57fe5b602002602001018181525050610beb81868581518110610bd957fe5b6020026020010151101561021061054b565b610bff6001600160a01b0383168b83611ea6565b5050600101610a97565b506040517ff04f27070000000000000000000000000000000000000000000000000000000081526001600160a01b0388169063f04f270790610c55908990899088908a90600401615c85565b600060405180830381600087803b158015610c6f57600080fd5b505af1158015610c83573d6000803e3d6000fd5b5050505060005b8651811015610df4576000878281518110610ca157fe5b602002602001015190506000848381518110610cb957fe5b602002602001015190506000826001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610cf19190615b63565b60206040518083038186803b158015610d0957600080fd5b505afa158015610d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d419190615968565b9050610d528282101561020361054b565b60008282039050610d7b888681518110610d6857fe5b602002602001015182101561025a61054b565b610d858482611f11565b836001600160a01b03168c6001600160a01b03167f0d7d75e01ab95780d3cd1c8ec0dd6c2ce19e3a20427eec8bf53283b6fb8e95f08c8881518110610dc657fe5b602002602001015184604051610ddd929190615e4d565b60405180910390a350505050806001019050610c8a565b50505050610e00611822565b50505050565b610e0e611768565b610e16611829565b82610e2081611f33565b610e2c83518351611e12565b60005b8351811015610eca576000848281518110610e4657fe5b60200260200101519050610e7260006001600160a01b0316826001600160a01b0316141561013561054b565b838281518110610e7e57fe5b6020908102919091018101516000888152600a835260408082206001600160a01b0395861683529093529190912080546001600160a01b03191692909116919091179055600101610e2f565b506000610ed685611f64565b90506002816002811115610ee657fe5b1415610f3457610efc845160021461020c61054b565b610f2f8585600081518110610f0d57fe5b602002602001015186600181518110610f2257fe5b6020026020010151611f7e565b610f5c565b6001816002811115610f4257fe5b1415610f5257610f2f858561202a565b610f5c8585612082565b847ff5847d3f2197b16cdcd2098ec95d0905cd1abdaf415f07bb7cef2bba8ac5dec48585604051610f8e929190615bed565b60405180910390a25050610fa0611822565b505050565b610fad611768565b610fb5611829565b81610fbf81611f33565b6000610fca84611f64565b90506002816002811115610fda57fe5b141561102857610ff0835160021461020c61054b565b611023848460008151811061100157fe5b60200260200101518560018151811061101657fe5b60200260200101516120d7565b611050565b600181600281111561103657fe5b1415611046576110238484612145565b61105084846121ff565b60005b83518110156110b657600a6000868152602001908152602001600020600085838151811061107d57fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002080546001600160a01b0319169055600101611053565b50837f7dcdc6d02ef40c7c1a7046a011b058bd7f988fa14e20a66344f9d4e60657d610846040516110e79190615bda565b60405180910390a25050610559611822565b60007f00000000000000000000000000000000000000000000000000000000000000008260405160200161112e929190615ac2565b604051602081830303815290604052805190602001209050919050565b610e00600185858561115c86612262565b61226e565b6001600160a01b031660009081526002602052604090205490565b6060611186611768565b61118e611829565b835161119981611b0f565b6111a8834211156101fc61054b565b6111b486518551611e12565b6111c08787878b6123f4565b91506000805b87518110156112925760008882815181106111dd57fe5b6020026020010151905060008583815181106111f557fe5b6020026020010151905061122188848151811061120e57fe5b60200260200101518213156101fb61054b565b600081131561126157885160208a015182916112409185918491611c5a565b61124983611938565b1561125b576112588582611945565b94505b50611288565b600081121561128857600081600003905061128683828c604001518d60600151611d38565b505b50506001016111c6565b5061129c816119de565b50506112a6611822565b9695505050505050565b60035461010090046001600160a01b031690565b60006112ce610526565b905090565b600080600080856112e381612683565b6000806112ef89611f64565b905060028160028111156112ff57fe5b14156113165761130f89896126a1565b9150611341565b600181600281111561132457fe5b14156113345761130f898961271b565b61133e8989612789565b91505b61134a826127a1565b9650611355826127b4565b9550611360826127ca565b6000998a52600a60209081526040808c206001600160a01b039b8c168d5290915290992054969995989796909616955050505050565b61139e611829565b610e00600085858561115c86612262565b7f000000000000000000000000000000000000000000000000000000000000000090565b6113db611768565b6113e3611829565b6113eb614d31565b60005b82518110156114e55782818151811061140357fe5b6020026020010151915060008260200151905061141f81612683565b604083015161143961143183836127d0565b61020961054b565b6000828152600a602090815260408083206001600160a01b03858116855292529091205461146c911633146101f661054b565b835160608501516000806114828487878661282c565b91509150846001600160a01b0316336001600160a01b0316877f6edcaf6241105b4c94c2efdbf3a6b12458eb3d07be3a0e81d24b13c44045fe7a85856040516114cc929190615e4d565b60405180910390a45050505050508060010190506113ee565b505061057e611822565b60006112ce61289b565b6000808261150681612683565b61150f84612938565b61151885611f64565b925092505b50915091565b60603330146115f6576000306001600160a01b0316600036604051611549929190615ada565b6000604051808303816000865af19150503d8060008114611586576040519150601f19603f3d011682016040523d82523d6000602084013e61158b565b606091505b50509050806000811461159a57fe5b60046000803e6000516001600160e01b0319167ffa61cc120000000000000000000000000000000000000000000000000000000081146115de573d6000803e3d6000fd5b50602060005260043d0380600460203e602081016000f35b6060611604858585896123f4565b9050602081510263fa61cc126020830352600482036024820181fd5b60608060008361162f81612683565b606061163a8661293e565b9095509050611648816129a0565b95979096509350505050565b61165c611768565b611664611829565b8261166e81611b0f565b6001600160a01b0384811660008181526004602090815260408083209488168084529490915290819020805460ff1916861515179055519091907f46961fdb4502b646d5095fba7600486a8ac05041d55cdf0f16ed677180b5cad8906116d5908690615d1b565b60405180910390a350610fa0611822565b60006116f28383612a4f565b90505b92915050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b61177a6002600054141561019061054b565b6002600055565b60006117986000356001600160e01b0319166110f9565b905061057e6117a78233612a7d565b61019161054b565b6040516001600160a01b038216907f94b979b6831a51293e2641426f97747feed46f17779fed9cd18d1ecefcfe92ef90600090a2600380546001600160a01b03909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b6001600055565b61183c611834611aaa565b61019261054b565b565b600069ffffffffffffffffffff8216605084600281111561185b57fe5b901b17606085901b6bffffffffffffffffffffffff19161790505b9392505050565b600080600080600080600088606001519050336001600160a01b0316816001600160a01b0316146118cf57876118ba576118b5611781565b600197505b6118cf6118c78233612a4f565b6101f761054b565b885160208a015160408b01516080909b0151919b909a9992985090965090945092505050565b61190a8361190286611b41565b836000612b20565b50610e008482846000611d38565b61192b8261192586611b41565b83612b76565b610e008482856000611c5a565b6001600160a01b03161590565b60008282016116f2848210158361054b565b6119648385836000612b20565b50610e00828583612b76565b8015610e005761198b6001600160a01b038516848484612ba6565b826001600160a01b0316846001600160a01b03167f540a1a3f28340caec336c81d8d7b3df139ee5cdc1839a4f283d7ebb7eaae2d5c84846040516119d0929190615bc1565b60405180910390a350505050565b6119ed8134101561020461054b565b348190038015610559576105593382612bc7565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b8015611a4c57611a47611a3d611ac7565b421061019361054b565b611a61565b611a61611a57611aeb565b42106101a961054b565b6003805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611a9f908390615d1b565b60405180910390a150565b6000611ab4611aeb565b4211806112ce57505060035460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b336001600160a01b0382161461057e57611b27611781565b611b318133612a4f565b61057e5761057e816101f7612c41565b6000611b4c82611938565b611b5e57611b5982610548565b6116f5565b6116f5610526565b600080600080611b798560800151612938565b90506000611b8a8660800151611f64565b90506002816002811115611b9a57fe5b1415611bb157611baa8683612c75565b9450611bdc565b6001816002811115611bbf57fe5b1415611bcf57611baa8683612d25565b611bd98683612db8565b94505b611bef8660000151876060015187612ff7565b809450819550505085604001516001600160a01b031686602001516001600160a01b031687608001517f2170c741c41531aec20e7c107c24eecfdd15e69c9bb0a8dd37b1840b9e0b207b8787604051611c49929190615e4d565b60405180910390a450509193909250565b82611c6457610e00565b611c6d84611938565b15611cee57611c7f811561020261054b565b611c8e8347101561020461054b565b611c96610526565b6001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015611cd057600080fd5b505af1158015611ce4573d6000803e3d6000fd5b5050505050610e00565b6000611cf985610548565b90508115611d16576000611d108483876001612b20565b90940393505b8315611d3157611d316001600160a01b038216843087612ba6565b5050505050565b82611d4257610e00565b611d4b84611938565b15611ddb57611d5d811561020261054b565b611d65610526565b6001600160a01b0316632e1a7d4d846040518263ffffffff1660e01b8152600401611d909190615d3e565b600060405180830381600087803b158015611daa57600080fd5b505af1158015611dbe573d6000803e3d6000fd5b50611dd6925050506001600160a01b03831684612bc7565b610e00565b6000611de685610548565b90508115611dfe57611df9838286612b76565b611d31565b611d316001600160a01b0382168486611ea6565b610559818314606761054b565b600080611e2a6113af565b6001600160a01b031663d877845c6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e6257600080fd5b505afa158015611e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9a9190615968565b90506118768382613025565b610fa08363a9059cbb60e01b8484604051602401611ec5929190615bc1565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b031990931692909217909152613072565b801561055957610559611f226113af565b6001600160a01b0384169083611ea6565b611f3c81612683565b61057e611f4882612938565b6001600160a01b0316336001600160a01b0316146101f561054b565b600061ffff605083901c166116f5600382106101f461054b565b611f9f816001600160a01b0316836001600160a01b0316141561020a61054b565b611fbe816001600160a01b0316836001600160a01b031610606661054b565b60008381526009602052604090208054611ffb906001600160a01b0316158015611ff3575060018201546001600160a01b0316155b61020b61054b565b80546001600160a01b039384166001600160a01b03199182161782556001909101805492909316911617905550565b6000828152600860205260408120905b8251811015610e0057600061206b84838151811061205457fe5b60200260200101518461311290919063ffffffff16565b90506120798161020a61054b565b5060010161203a565b6000828152600160205260408120905b8251811015610e005760006120c08483815181106120ac57fe5b602090810291909101015184906000613175565b90506120ce8161020a61054b565b50600101612092565b60008060006120e7868686613222565b9250925092506121116120f9846132e9565b80156121095750612109836132e9565b61020d61054b565b600095865260096020526040862080546001600160a01b031990811682556001909101805490911690559490945550505050565b6000828152600860205260408120905b8251811015610e0057600083828151811061216c57fe5b602002602001015190506121b8612109600760008881526020019081526020016000206000846001600160a01b03166001600160a01b03168152602001908152602001600020546132e9565b60008581526007602090815260408083206001600160a01b038516845290915281208190556121e7848361330b565b90506121f58161020961054b565b5050600101612155565b6000828152600160205260408120905b8251811015610e0057600083828151811061222657fe5b60200260200101519050600061223c8483613412565b905061224a612109826132e9565b6122548483613421565b50505080600101905061220f565b61226a614d5a565b5090565b612276611768565b8361228081612683565b8361228a81611b0f565b61229e836000015151846020015151611e12565b60606122ad84600001516134c3565b905060606122bb8883613552565b905060608060606122d08c8c8c8c8c896135e3565b92509250925060006122e18c611f64565b905060028160028111156122f157fe5b1415612359576123548c8760008151811061230857fe5b60200260200101518660008151811061231d57fe5b60200260200101518960018151811061233257fe5b60200260200101518860018151811061234757fe5b60200260200101516137a8565b612382565b600181600281111561236757fe5b1415612378576123548c87866137e7565b6123828c85613854565b6000808e600181111561239157fe5b1490508b6001600160a01b03168d7fe5ce249087ce04f05a957192435400fd97868dba0e6a4b4c049abf8af80dae78896123cb888661389d565b876040516123db93929190615c4c565b60405180910390a3505050505050505050611d31611822565b6060835167ffffffffffffffff8111801561240e57600080fd5b50604051908082528060200260200182016040528015612438578160200160208202803683370190505b509050612443614d84565b61244b614ce1565b60008060005b89518110156126765789818151811061246657fe5b6020026020010151945060008951866020015110801561248a575089518660400151105b905061249781606461054b565b60006124b98b8860200151815181106124ac57fe5b6020026020010151611b41565b905060006124d08c8960400151815181106124ac57fe5b90506124f3816001600160a01b0316836001600160a01b031614156101fd61054b565b60608801516125435761250b600085116101fe61054b565b60006125188b8484613945565b6001600160a01b0316876001600160a01b031614905061253a816101ff61054b565b50606088018590525b87516080880152868a600181111561255757fe5b9081600181111561256457fe5b9052506001600160a01b0380831660208901528181166040808a01919091526060808b0151908a015260808a01516101008a01528c51821660c08a01528c01511660e08801526000806125b689611b66565b919850925090506125c88c8585613967565b97506125fc6125d683613981565b8c8c60200151815181106125e657fe5b60200260200101516139b190919063ffffffff16565b8b8b602001518151811061260c57fe5b60200260200101818152505061264a61262482613981565b8c8c604001518151811061263457fe5b60200260200101516139e590919063ffffffff16565b8b8b604001518151811061265a57fe5b6020026020010181815250505050505050806001019050612451565b5050505050949350505050565b60008181526005602052604090205461057e9060ff166101f461054b565b60008060008060006126b287613a19565b945094509450945050836001600160a01b0316866001600160a01b031614156126e157829450505050506116f5565b816001600160a01b0316866001600160a01b031614156127065793506116f592505050565b6127116102096116fb565b5050505092915050565b60008281526007602090815260408083206001600160a01b03851684529091528120548161274882613a8f565b80612766575060008581526008602052604090206127669085613aa1565b9050806127815761277685612683565b6127816102096116fb565b509392505050565b60008281526001602052604081206109e18184613412565b6dffffffffffffffffffffffffffff1690565b60701c6dffffffffffffffffffffffffffff1690565b60e01c90565b6000806127dc84611f64565b905060028160028111156127ec57fe5b1415612804576127fc8484613ac2565b9150506116f5565b600181600281111561281257fe5b1415612822576127fc8484613b13565b6127fc8484613b2b565b600080600061283a86611f64565b9050600087600281111561284a57fe5b14156128665761285c86828787613b43565b9250925050612892565b600187600281111561287457fe5b14156128865761285c86828787613bbe565b61285c86828787613c3a565b94509492505050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612908613c9d565b3060405160200161291d959493929190615df0565b60405160208183030381529060405280519060200120905090565b60601c90565b606080600061294c84611f64565b9050600281600281111561295c57fe5b14156129755761296b84613ca1565b925092505061299b565b600181600281111561298357fe5b14156129925761296b84613dd6565b61296b84613efd565b915091565b60606000825167ffffffffffffffff811180156129bc57600080fd5b506040519080825280602002602001820160405280156129e6578160200160208202803683370190505b5091506000905060005b825181101561151d576000848281518110612a0757fe5b60200260200101519050612a1a81613ff9565b848381518110612a2657fe5b602002602001018181525050612a4483612a3f836127ca565b614014565b9250506001016129f0565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b6003546040517f9be2a88400000000000000000000000000000000000000000000000000000000815260009161010090046001600160a01b031690639be2a88490612ad090869086903090600401615d47565b60206040518083038186803b158015612ae857600080fd5b505afa158015612afc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f29190615478565b600080612b2d8686611a01565b9050612b468380612b3e5750848210155b61020161054b565b612b50818561402b565b9150818103612b6c878783612b6487613981565b60000361403a565b5050949350505050565b6000612b828484611a01565b90506000612b908284611945565b9050611d31858583612ba187613981565b61403a565b610e00846323b872dd60e01b858585604051602401611ec593929190615b77565b612bd6814710156101a361054b565b6000826001600160a01b031682604051612bef90610548565b60006040518083038185875af1925050503d8060008114612c2c576040519150601f19603f3d011682016040523d82523d6000602084013e612c31565b606091505b50509050610fa0816101a461054b565b6001600160a01b0382166000908152600260205260409020805460018101909155610fa0612c6f8483614095565b8361054b565b600080600080612c92866080015187602001518860400151613222565b92509250925060008087604001516001600160a01b031688602001516001600160a01b03161015612cc7575083905082612ccd565b50829050835b612cd9888884846141bb565b60408b015160208c01519199509294509092506001600160a01b03918216911610612d0d57612d0881836142d1565b612d17565b612d1782826142d1565b909255509295945050505050565b600080612d3a8460800151856020015161271b565b90506000612d508560800151866040015161271b565b9050612d5e858584846141bb565b6080880180516000908152600760208181526040808420828e01516001600160a01b03908116865290835281852098909855935183529081528282209a830151909516815298909352919096209590955550929392505050565b60808201516000908152600160209081526040822090840151829182918290612de290839061430c565b90506000612dfd88604001518461430c90919063ffffffff16565b9050811580612e0a575080155b15612e2757612e1c8860800151612683565b612e276102096116fb565b60001991820191016000612e3a8461432b565b905060608167ffffffffffffffff81118015612e5557600080fd5b50604051908082528060200260200182016040528015612e7f578160200160208202803683370190505b50600060a08c018190529091505b82811015612eff576000612ea1878361432f565b9050612eac81613ff9565b838381518110612eb857fe5b602002602001018181525050612ed58c60a00151612a3f836127ca565b60a08d015281861415612eea57809850612ef6565b84821415612ef6578097505b50600101612e8d565b506040517f01ec954a0000000000000000000000000000000000000000000000000000000081526001600160a01b038a16906301ec954a90612f4b908d90859089908990600401615e5b565b602060405180830381600087803b158015612f6557600080fd5b505af1158015612f79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9d9190615968565b9750600080612fb58c600001518d606001518c612ff7565b9092509050612fc48983614345565b9850612fd08882614376565b9750612fdd87878b61438c565b612fe887868a61438c565b50505050505050505092915050565b6000808085600181111561300757fe5b141561301757508290508161301d565b50819050825b935093915050565b600082820261304984158061304257508385838161303f57fe5b04145b600361054b565b806130585760009150506116f5565b670de0b6b3a76400006000198201046001019150506116f5565b60006060836001600160a01b03168360405161308e9190615aea565b6000604051808303816000865af19150503d80600081146130cb576040519150601f19603f3d011682016040523d82523d6000602084013e6130d0565b606091505b509150915060008214156130e8573d6000803e3d6000fd5b610e0081516000148061310a57508180602001905181019061310a9190615478565b6101a261054b565b600061311e8383613aa1565b61316d57508154600180820184556000848152602080822090930180546001600160a01b0319166001600160a01b038616908117909155855490825282860190935260409020919091556116f5565b5060006116f5565b6001600160a01b03821660009081526002840160205260408120548061320257505082546040805180820182526001600160a01b03858116808352602080840187815260008781526001808c018452878220965187546001600160a01b03191696169590951786559051948401949094559482018089559083526002880190945291902091909155611876565b600019016000908152600180860160205260408220018390559050611876565b600080600080600061323487876143a4565b91509150600061324483836143d5565b60008a81526009602090815260408083208484526002019091528120805460018201549197509293509061327783613a8f565b80613286575061328682613a8f565b806132a757506132968c87613ac2565b80156132a757506132a78c86613ac2565b9050806132c2576132b78c612683565b6132c26102096116fb565b6132cc8383614408565b98506132d8838361442d565b975050505050505093509350939050565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161590565b6001600160a01b03811660009081526001830160205260408120548015613408578354600019808301919081019060009087908390811061334857fe5b60009182526020909120015487546001600160a01b039091169150819088908590811061337157fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559183168152600189810190925260409020908401905586548790806133ba57fe5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03881682526001898101909152604082209190915594506116f59350505050565b60009150506116f5565b60006116f28383610209614444565b6001600160a01b0381166000908152600283016020526040812054801561340857835460001990810160008181526001878101602090815260408084209587018452808420865481546001600160a01b03199081166001600160a01b0392831617835588860180549387019390935588548216875260028d018086528488209a909a5588541690975584905593895593871682529390925281205590506116f5565b606080825167ffffffffffffffff811180156134de57600080fd5b50604051908082528060200260200182016040528015613508578160200160208202803683370190505b50905060005b83518110156107ff576135268482815181106124ac57fe5b82828151811061353257fe5b6001600160a01b039092166020928302919091019091015260010161350e565b60608060606135608561293e565b9150915061357082518551611e12565b613580600083511161020f61054b565b60005b82518110156135da576135d285828151811061359b57fe5b60200260200101516001600160a01b03168483815181106135b857fe5b60200260200101516001600160a01b03161461020861054b565b600101613583565b50949350505050565b60608060608060006135f4866129a0565b9150915060006136038b612938565b905060008c600181111561361357fe5b146136b657806001600160a01b03166374f3b0098c8c8c8787613634614481565b8f604001516040518863ffffffff1660e01b815260040161365b9796959493929190615d66565b600060405180830381600087803b15801561367557600080fd5b505af1158015613689573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526136b19190810190615405565b61374f565b806001600160a01b031663d5c096c48c8c8c87876136d2614481565b8f604001516040518863ffffffff1660e01b81526004016136f99796959493929190615d66565b600060405180830381600087803b15801561371357600080fd5b505af1158015613727573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261374f9190810190615405565b80955081965050506137658751865186516144fb565b60008c600181111561377357fe5b1461378a576137858989898888614513565b613797565b6137978a8989888861465a565b955050505096509650969350505050565b60006137b485846143d5565b600087815260096020908152604080832084845260020190915290209091506137dd85846142d1565b9055505050505050565b60005b8251811015610e00578181815181106137ff57fe5b602002602001015160076000868152602001908152602001600020600085848151811061382857fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020556001016137ea565b6000828152600160205260408120905b8251811015610e00576138958184838151811061387d57fe5b60200260200101518461438c9092919063ffffffff16565b600101613864565b6060825167ffffffffffffffff811180156138b757600080fd5b506040519080825280602002602001820160405280156138e1578160200160208202803683370190505b50905060005b83518110156107ff57826139115783818151811061390157fe5b6020026020010151600003613926565b83818151811061391d57fe5b60200260200101515b82828151811061393257fe5b60209081029190910101526001016138e7565b60008084600181111561395457fe5b1461395f57816109e1565b509092915050565b60008084600181111561397657fe5b146107ff57826109e1565b600061226a7f800000000000000000000000000000000000000000000000000000000000000083106101a561054b565b60008282016116f28284128015906139c95750848212155b806139de57506000841280156139de57508482125b600061054b565b60008183036116f28284128015906139fd5750848213155b80613a125750600084128015613a1257508482135b600161054b565b6000818152600960205260408120805460018201546001600160a01b0391821692849290911690829081613a4d86856143d5565b6000818152600284016020526040902080546001820154919950919250613a748282614408565b9650613a80828261442d565b94505050505091939590929450565b6000613a9a826132e9565b1592915050565b6001600160a01b031660009081526001919091016020526040902054151590565b600082815260096020526040812080546001600160a01b0384811691161480613afa575060018101546001600160a01b038481169116145b80156109e1575050506001600160a01b03161515919050565b60008281526008602052604081206109e18184613aa1565b60008281526001602052604081206109e181846147d0565b6000806002856002811115613b5457fe5b1415613b6a57613b658685856147f1565b613b94565b6001856002811115613b7857fe5b1415613b8957613b658685856147ff565b613b9486858561480d565b8215613bae57613bae6001600160a01b0385163385611ea6565b5050600081900394909350915050565b6000806002856002811115613bcf57fe5b1415613be557613be086858561481b565b613c0f565b6001856002811115613bf357fe5b1415613c0457613be0868585614829565b613c0f868585614837565b8215613c2a57613c2a6001600160a01b038516333086612ba6565b5090946000869003945092505050565b6000806002856002811115613c4b57fe5b1415613c6357613c5c868585614845565b9050613c90565b6001856002811115613c7157fe5b1415613c8257613c5c868585614855565b613c8d868585614865565b90505b6000915094509492505050565b4690565b606080600080600080613cb387613a19565b92975090955093509150506001600160a01b0384161580613cdb57506001600160a01b038216155b15613d04575050604080516000808252602082019081528183019092529450925061299b915050565b60408051600280825260608201835290916020830190803683370190505095508386600081518110613d3257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508186600181518110613d6057fe5b6001600160a01b03929092166020928302919091018201526040805160028082526060820183529092909190830190803683370190505094508285600081518110613da757fe5b6020026020010181815250508085600181518110613dc157fe5b60200260200101818152505050505050915091565b60008181526008602052604090206060908190613df28161432b565b67ffffffffffffffff81118015613e0857600080fd5b50604051908082528060200260200182016040528015613e32578160200160208202803683370190505b509250825167ffffffffffffffff81118015613e4d57600080fd5b50604051908082528060200260200182016040528015613e77578160200160208202803683370190505b50915060005b8351811015613ef6576000613e928383614875565b905080858381518110613ea157fe5b6001600160a01b03928316602091820292909201810191909152600088815260078252604080822093851682529290915220548451859084908110613ee257fe5b602090810291909101015250600101613e7d565b5050915091565b60008181526001602052604090206060908190613f198161432b565b67ffffffffffffffff81118015613f2f57600080fd5b50604051908082528060200260200182016040528015613f59578160200160208202803683370190505b509250825167ffffffffffffffff81118015613f7457600080fd5b50604051908082528060200260200182016040528015613f9e578160200160208202803683370190505b50915060005b8351811015613ef657613fb782826148a2565b858381518110613fc357fe5b60200260200101858481518110613fd657fe5b60209081029190910101919091526001600160a01b039091169052600101613fa4565b6000614004826127b4565b61400d836127a1565b0192915050565b60008183101561402457816116f2565b5090919050565b600081831061402457816116f2565b6001600160a01b038085166000818152600b602090815260408083209488168084529490915290819020859055517f18e1ea4139e68413d7d08aa752e71568e36b2c5bf940893314c2c5b01eaa0c42906119d0908590615d3e565b6000806140a06148c6565b9050428110156140b45760009150506116f5565b60006140be6148d2565b9050806140d0576000925050506116f5565b6000816140db6149e3565b80516020918201206040516140f7939233918a91899101615dc4565b604051602081830303815290604052805190602001209050600061411a82614a32565b90506000806000614129614a4e565b9250925092506000600185858585604051600081526020016040526040516141549493929190615e1c565b6020604051602081039080840390855afa158015614176573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906141ac57508a6001600160a01b0316816001600160a01b0316145b9b9a5050505050505050505050565b6000806000806141ca86613ff9565b905060006141d786613ff9565b90506141ee6141e5886127ca565b612a3f886127ca565b60a08a01526040517f9d2c110c0000000000000000000000000000000000000000000000000000000081526001600160a01b03891690639d2c110c9061423c908c9086908690600401615e94565b602060405180830381600087803b15801561425657600080fd5b505af115801561426a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061428e9190615968565b92506000806142a68b600001518c6060015187612ff7565b90925090506142b58983614345565b96506142c18882614376565b9550505050509450945094915050565b6000806142e96142e0856127ca565b612a3f856127ca565b90506109e16142f7856127a1565b614300856127a1565b8363ffffffff16614a75565b6001600160a01b03166000908152600291909101602052604090205490565b5490565b6000908152600191820160205260409020015490565b60008061435b83614355866127a1565b90611945565b90506000614368856127b4565b9050436112a6838383614a83565b60008061435b83614386866127a1565b90614abc565b60009182526001928301602052604090912090910155565b600080826001600160a01b0316846001600160a01b0316106143c75782846143ca565b83835b915091509250929050565b600082826040516020016143ea929190615b06565b60405160208183030381529060405280519060200120905092915050565b60006116f2614416846127a1565b61441f846127a1565b614428866127ca565b614a83565b60006116f261443b846127b4565b61441f846127b4565b6001600160a01b038216600090815260028401602052604081205461446b8115158461054b565b614478856001830361432f565b95945050505050565b600061448b6113af565b6001600160a01b03166355c676286040518163ffffffff1660e01b815260040160206040518083038186803b1580156144c357600080fd5b505afa1580156144d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ce9190615968565b610fa0828414801561450c57508183145b606761054b565b6060835167ffffffffffffffff8111801561452d57600080fd5b50604051908082528060200260200182016040528015614557578160200160208202803683370190505b50905060005b85515181101561465057600084828151811061457557fe5b602002602001015190506145a58760200151838151811061459257fe5b60200260200101518210156101f961054b565b6000876000015183815181106145b757fe5b602002602001015190506145d181838b8b60600151611d38565b60008584815181106145df57fe5b602002602001015190506145fb6145f583611b41565b82611f11565b61462a6146088483611945565b89868151811061461457fe5b602002602001015161437690919063ffffffff16565b85858151811061463657fe5b60200260200101818152505050505080600101905061455d565b5095945050505050565b60606000845167ffffffffffffffff8111801561467657600080fd5b506040519080825280602002602001820160405280156146a0578160200160208202803683370190505b50915060005b8651518110156147c65760008582815181106146be57fe5b602002602001015190506146ee886020015183815181106146db57fe5b60200260200101518211156101fa61054b565b60008860000151838151811061470057fe5b6020026020010151905061471a81838c8c60600151611c5a565b61472381611938565b15614735576147328483611945565b93505b600086848151811061474357fe5b602002602001015190506147596145f583611b41565b80831015614778576147738382038a868151811061461457fe5b6147a0565b6147a08184038a868151811061478a57fe5b602002602001015161434590919063ffffffff16565b8685815181106147ac57fe5b6020026020010181815250505050508060010190506146a6565b50614650816119de565b6001600160a01b031660009081526002919091016020526040902054151590565b610e008383614ad284614b0d565b610e008383614ad284614bb8565b610e008383614ad284614c13565b610e008383614c6284614b0d565b610e008383614c6284614bb8565b610e008383614c6284614c13565b60006109e18484614c8385614b0d565b60006109e18484614c8385614bb8565b60006109e18484614c8385614c13565b600082600001828154811061488657fe5b6000918252602090912001546001600160a01b03169392505050565b600090815260019182016020526040902080549101546001600160a01b0390911691565b60006112ce6000614c9d565b6000803560e01c8063b95cac28811461491a57638bdb39138114614942576352bbbe29811461496a5763945bcec981146149925763fa6e671d81146149ba57600092506149de565b7f3f7b71252bd19113ff48c19c6e004a9bcfcca320a0d74d58e85877cbd7dcae5892506149de565b7f8bbc57f66ea936902f50a71ce12b92c43f3c5340bb40c27c4e90ab84eeae335392506149de565b7fe192dcbc143b1e244ad73b813fd3c097b832ad260a157340b4e5e5beda067abe92506149de565b7f9bfc43a4d98313c6766986ffd7c916c7481566d9f224c6819af0a53388aced3a92506149de565b7fa3f865aa351e51cfeb40f5178d1564bb629fe9030b83caf6361d1baaf5b90b5a92505b505090565b60606000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505050608010156105485760803603815290565b6000614a3c61289b565b8260405160200161112e929190615b2d565b6000806000614a5d6020614c9d565b9250614a696040614c9d565b91506108416060614c9d565b60e01b60709190911b010190565b6000838301614ab1858210801590614aa957506e01000000000000000000000000000082105b61020e61054b565b614478858585614a75565b6000614acc83831115600161054b565b50900390565b600080614ae283614386866127a1565b90506000614af384614355876127b4565b90506000614b00866127ca565b90506112a6838383614a83565b6000806000806000614b1e89613a19565b9450509350935093506000836001600160a01b0316896001600160a01b03161415614b69576000614b5384898b63ffffffff16565b9050614b5f8185614ca7565b9093509050614b8b565b6000614b7983898b63ffffffff16565b9050614b858184614ca7565b90925090505b614b9583836142d1565b8555614ba18383614cc3565b600190950194909455509192505050949350505050565b600080614bc5868661271b565b90506000614bd782858763ffffffff16565b60008881526007602090815260408083206001600160a01b038b16845290915290208190559050614c088183614ca7565b979650505050505050565b600084815260016020526040812081614c2c8287613412565b90506000614c3e82868863ffffffff16565b9050614c4b838883613175565b50614c568183614ca7565b98975050505050505050565b600080614c7283614355866127a1565b90506000614af384614386876127b4565b600080614c8f846127a1565b905043614478828583614a83565b3601607f19013590565b6000614cb2826127b4565b614cbb846127b4565b039392505050565b60006116f2614cd1846127b4565b614cda846127b4565b6000614a75565b60408051610120810190915280600081526000602082018190526040820181905260608083018290526080830182905260a0830182905260c0830182905260e08301919091526101009091015290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040518060a0016040528060008019168152602001600081526020016000815260200160008152602001606081525090565b80356116f581615f5a565b600082601f830112614dd1578081fd5b8135614de4614ddf82615f04565b615edd565b818152915060208083019084810181840286018201871015614e0557600080fd5b60005b84811015614e2d578135614e1b81615f5a565b84529282019290820190600101614e08565b505050505092915050565b600082601f830112614e48578081fd5b8135614e56614ddf82615f04565b818152915060208083019084810160005b84811015614e2d578135870160a080601f19838c03011215614e8857600080fd5b614e9181615edd565b85830135815260408084013587830152606080850135828401526080915081850135818401525082840135925067ffffffffffffffff831115614ed357600080fd5b614ee18c8885870101614fc0565b90820152865250509282019290820190600101614e67565b600082601f830112614f09578081fd5b8135614f17614ddf82615f04565b818152915060208083019084810181840286018201871015614f3857600080fd5b60005b84811015614e2d57813584529282019290820190600101614f3b565b600082601f830112614f67578081fd5b8151614f75614ddf82615f04565b818152915060208083019084810181840286018201871015614f9657600080fd5b60005b84811015614e2d57815184529282019290820190600101614f99565b80356116f581615f6f565b600082601f830112614fd0578081fd5b813567ffffffffffffffff811115614fe6578182fd5b614ff9601f8201601f1916602001615edd565b915080825283602082850101111561501057600080fd5b8060208401602084013760009082016020015292915050565b80356116f581615f7d565b8035600281106116f557600080fd5b8035600481106116f557600080fd5b600060808284031215615063578081fd5b61506d6080615edd565b9050813567ffffffffffffffff8082111561508757600080fd5b61509385838601614dc1565b835260208401359150808211156150a957600080fd5b6150b585838601614ef9565b602084015260408401359150808211156150ce57600080fd5b506150db84828501614fc0565b6040830152506150ee8360608401614fb5565b606082015292915050565b60006080828403121561510a578081fd5b6151146080615edd565b9050813561512181615f5a565b8152602082013561513181615f6f565b6020820152604082013561514481615f5a565b604082015260608201356150ee81615f6f565b600060208284031215615168578081fd5b81356116f281615f5a565b60008060408385031215615185578081fd5b823561519081615f5a565b915060208301356151a081615f5a565b809150509250929050565b6000806000606084860312156151bf578081fd5b83356151ca81615f5a565b925060208401356151da81615f5a565b915060408401356151ea81615f6f565b809150509250925092565b60008060408385031215615207578182fd5b823561521281615f5a565b9150602083013567ffffffffffffffff81111561522d578182fd5b61523985828601614dc1565b9150509250929050565b60006020808385031215615255578182fd5b823567ffffffffffffffff81111561526b578283fd5b8301601f8101851361527b578283fd5b8035615289614ddf82615f04565b818152838101908385016080808502860187018a10156152a7578788fd5b8795505b848610156153105780828b0312156152c1578788fd5b6152ca81615edd565b6152d48b84615029565b8152878301358882015260406152ec8c828601614db6565b908201526060838101359082015284526001959095019492860192908101906152ab565b509098975050505050505050565b60006020808385031215615330578182fd5b823567ffffffffffffffff811115615346578283fd5b8301601f81018513615356578283fd5b8035615364614ddf82615f04565b8181528381019083850160a0808502860187018a1015615382578788fd5b8795505b848610156153105780828b03121561539c578788fd5b6153a581615edd565b6153af8b84615043565b81526153bd8b898501614db6565b818901526040838101359082015260606153d98c828601614db6565b9082015260806153eb8c858301614db6565b908201528452600195909501949286019290810190615386565b60008060408385031215615417578182fd5b825167ffffffffffffffff8082111561542e578384fd5b61543a86838701614f57565b9350602085015191508082111561544f578283fd5b5061523985828601614f57565b60006020828403121561546d578081fd5b81356116f281615f6f565b600060208284031215615489578081fd5b81516116f281615f6f565b6000602082840312156154a5578081fd5b5035919050565b600080600080608085870312156154c1578182fd5b8435935060208501356154d381615f5a565b925060408501356154e381615f5a565b9150606085013567ffffffffffffffff8111156154fe578182fd5b61550a87828801615052565b91505092959194509250565b60008060408385031215615528578182fd5b82359150602083013567ffffffffffffffff81111561522d578182fd5b600080600060608486031215615559578081fd5b8335925060208085013567ffffffffffffffff80821115615578578384fd5b61558488838901614dc1565b94506040870135915080821115615599578384fd5b508501601f810187136155aa578283fd5b80356155b8614ddf82615f04565b81815283810190838501858402850186018b10156155d4578687fd5b8694505b838510156155ff5780356155eb81615f5a565b8352600194909401939185019185016155d8565b5080955050505050509250925092565b60008060408385031215615621578182fd5b8235915060208301356151a081615f5a565b600060208284031215615644578081fd5b81356001600160e01b0319811681146116f2578182fd5b60008060008060808587031215615670578182fd5b843561567b81615f5a565b9350602085013567ffffffffffffffff80821115615697578384fd5b6156a388838901614dc1565b945060408701359150808211156156b8578384fd5b6156c488838901614ef9565b935060608701359150808211156156d9578283fd5b5061550a87828801614fc0565b6000602082840312156156f7578081fd5b81356116f281615f7d565b60008060008060e08587031215615717578182fd5b6157218686615034565b9350602085013567ffffffffffffffff8082111561573d578384fd5b61574988838901614e38565b9450604087013591508082111561575e578384fd5b5061576b87828801614dc1565b92505061577b86606087016150f9565b905092959194509250565b600080600080600080610120878903121561579f578384fd5b6157a98888615034565b955060208088013567ffffffffffffffff808211156157c6578687fd5b6157d28b838c01614e38565b975060408a01359150808211156157e7578687fd5b6157f38b838c01614dc1565b96506158028b60608c016150f9565b955060e08a0135915080821115615817578485fd5b508801601f81018a13615828578384fd5b8035615836614ddf82615f04565b81815283810190838501858402850186018e1015615852578788fd5b8794505b83851015615874578035835260019490940193918501918501615856565b50809650505050505061010087013590509295509295509295565b60008060008060e085870312156158a4578182fd5b843567ffffffffffffffff808211156158bb578384fd5b9086019060c082890312156158ce578384fd5b6158d860c0615edd565b823581526158e98960208501615034565b602082015260408301356158fc81615f5a565b604082015261590e8960608501614db6565b60608201526080830135608082015260a08301358281111561592e578586fd5b61593a8a828601614fc0565b60a08301525080965050505061595386602087016150f9565b939693955050505060a08201359160c0013590565b600060208284031215615979578081fd5b5051919050565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156159c55781516001600160a01b0316875295820195908201906001016159a0565b509495945050505050565b6000815180845260208085019450808401835b838110156159c5578151875295820195908201906001016159e3565b60008151808452615a17816020860160208601615f24565b601f01601f19169290920160200192915050565b6000610120825160028110615a3c57fe5b808552506020830151615a526020860182615980565b506040830151615a656040860182615980565b50606083015160608501526080830151608085015260a083015160a085015260c0830151615a9660c0860182615980565b5060e0830151615aa960e0860182615980565b506101008084015182828701526112a6838701826159ff565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b60008251615afc818460208701615f24565b9190910192915050565b6bffffffffffffffffffffffff19606093841b811682529190921b16601482015260280190565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b038316815260408101615bb483615f50565b8260208301529392505050565b6001600160a01b03929092168252602082015260400190565b6000602082526116f2602083018461598d565b600060408252615c00604083018561598d565b828103602084810191909152845180835285820192820190845b81811015615c3f5784516001600160a01b031683529383019391830191600101615c1a565b5090979650505050505050565b600060608252615c5f606083018661598d565b8281036020840152615c7181866159d0565b905082810360408401526112a681856159d0565b600060808252615c98608083018761598d565b8281036020840152615caa81876159d0565b90508281036040840152615cbe81866159d0565b90508281036060840152614c0881856159ff565b600060608252615ce5606083018661598d565b8281036020840152615cf781866159d0565b915050826040830152949350505050565b6000602082526116f260208301846159d0565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b60008882526001600160a01b03808916602084015280881660408401525060e06060830152615d9860e08301876159d0565b8560808401528460a084015282810360c0840152615db681856159ff565b9a9950505050505050505050565b94855260208501939093526001600160a01b039190911660408401526060830152608082015260a00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b93845260ff9290921660208401526040830152606082015260800190565b60208101615e4783615f50565b91905290565b918252602082015260400190565b600060808252615e6e6080830187615a2b565b8281036020840152615e8081876159d0565b604084019590955250506060015292915050565b600060608252615ea76060830186615a2b565b60208301949094525060400152919050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60405181810167ffffffffffffffff81118282101715615efc57600080fd5b604052919050565b600067ffffffffffffffff821115615f1a578081fd5b5060209081020190565b60005b83811015615f3f578181015183820152602001615f27565b83811115610e005750506000910152565b6003811061057e57fe5b6001600160a01b038116811461057e57600080fd5b801515811461057e57600080fd5b6003811061057e57600080fdfea2646970667358221220201e4f926e390fed8dd5318c58846af735c2bebc61b80693ae936a5fe76dcf1464736f6c6343000701003360c060405234801561001057600080fd5b50604051610be6380380610be683398101604081905261002f9161004d565b30608052600160005560601b6001600160601b03191660a05261007b565b60006020828403121561005e578081fd5b81516001600160a01b0381168114610074578182fd5b9392505050565b60805160a05160601c610b406100a66000398061041352806105495250806102a75250610b406000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c8063851c1bb311610076578063d877845c1161005b578063d877845c14610129578063e42abf3514610131578063fbfa77cf14610151576100a3565b8063851c1bb314610101578063aaabadc514610114576100a3565b806338e9922e146100a857806355c67628146100bd5780636b6b9f69146100db5780636daefab6146100ee575b600080fd5b6100bb6100b636600461099c565b610159565b005b6100c56101b8565b6040516100d29190610aa6565b60405180910390f35b6100bb6100e936600461099c565b6101be565b6100bb6100fc3660046107d1565b610211565b6100c561010f366004610924565b6102a3565b61011c6102f5565b6040516100d29190610a35565b6100c5610304565b61014461013f366004610852565b61030a565b6040516100d29190610a62565b61011c610411565b610161610435565b6101786706f05b59d3b2000082111561025861047e565b60018190556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906101ad908390610aa6565b60405180910390a150565b60015490565b6101c6610435565b6101dc662386f26fc1000082111561025961047e565b60028190556040517f5a0b7386237e7f07fa741efc64e59c9387d2cccafec760efed4d53387f20e19a906101ad908390610aa6565b610219610490565b610221610435565b61022b84836104a9565b60005b8481101561029357600086868381811061024457fe5b90506020020160208101906102599190610980565b9050600085858481811061026957fe5b6020029190910135915061028990506001600160a01b03831685836104b6565b505060010161022e565b5061029c61053e565b5050505050565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016102d89291906109cc565b604051602081830303815290604052805190602001209050919050565b60006102ff610545565b905090565b60025490565b6060815167ffffffffffffffff8111801561032457600080fd5b5060405190808252806020026020018201604052801561034e578160200160208202803683370190505b50905060005b825181101561040b5782818151811061036957fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161039c9190610a35565b60206040518083038186803b1580156103b457600080fd5b505afa1580156103c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ec91906109b4565b8282815181106103f857fe5b6020908102919091010152600101610354565b50919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006104646000357fffffffff00000000000000000000000000000000000000000000000000000000166102a3565b905061047b61047382336105d8565b61019161047e565b50565b8161048c5761048c8161066a565b5050565b6104a26002600054141561019061047e565b6002600055565b61048c818314606761047e565b6105398363a9059cbb60e01b84846040516024016104d5929190610a49565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526106d7565b505050565b6001600055565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156105a057600080fd5b505afa1580156105b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ff9190610964565b60006105e2610545565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161061193929190610aaf565b60206040518083038186803b15801561062957600080fd5b505afa15801561063d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066191906108fd565b90505b92915050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b60006060836001600160a01b0316836040516106f391906109fc565b6000604051808303816000865af19150503d8060008114610730576040519150601f19603f3d011682016040523d82523d6000602084013e610735565b606091505b5091509150600082141561074d573d6000803e3d6000fd5b61077781516000148061076f57508180602001905181019061076f91906108fd565b6101a261047e565b50505050565b60008083601f84011261078e578182fd5b50813567ffffffffffffffff8111156107a5578182fd5b60208301915083602080830285010111156107bf57600080fd5b9250929050565b803561066481610af5565b6000806000806000606086880312156107e8578081fd5b853567ffffffffffffffff808211156107ff578283fd5b61080b89838a0161077d565b90975095506020880135915080821115610823578283fd5b506108308882890161077d565b909450925050604086013561084481610af5565b809150509295509295909350565b60006020808385031215610864578182fd5b823567ffffffffffffffff8082111561087b578384fd5b818501915085601f83011261088e578384fd5b81358181111561089c578485fd5b83810291506108ac848301610ace565b8181528481019084860184860187018a10156108c6578788fd5b8795505b838610156108f0576108dc8a826107c6565b8352600195909501949186019186016108ca565b5098975050505050505050565b60006020828403121561090e578081fd5b8151801515811461091d578182fd5b9392505050565b600060208284031215610935578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461091d578182fd5b600060208284031215610975578081fd5b815161091d81610af5565b600060208284031215610991578081fd5b813561091d81610af5565b6000602082840312156109ad578081fd5b5035919050565b6000602082840312156109c5578081fd5b5051919050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60008251815b81811015610a1c5760208186018101518583015201610a02565b81811115610a2a5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015610a9a57835183529284019291840191600101610a7e565b50909695505050505050565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b60405181810167ffffffffffffffff81118282101715610aed57600080fd5b604052919050565b6001600160a01b038116811461047b57600080fdfea2646970667358221220be72bdf8e7a3c38606c5f954fbe2d77798347aaa1cfb76fe77ec2f6c245d24bc64736f6c63430007010033", + "deployedBytecode": "0x6080604052600436106101a55760003560e01c8063945bcec9116100e1578063e6c460921161008a578063f84d066e11610064578063f84d066e1461048a578063f94d4668146104aa578063fa6e671d146104d9578063fec90d72146104f9576101d3565b8063e6c4609214610427578063ed24911d14610447578063f6c009271461045c576101d3565b8063b05f8e48116100bb578063b05f8e48146103cf578063b95cac28146103ff578063d2946c2b14610412576101d3565b8063945bcec914610385578063aaabadc514610398578063ad5c4648146103ba576101d3565b806352bbbe291161014e5780637d3aeb96116101285780637d3aeb9614610305578063851c1bb3146103255780638bdb39131461034557806390193b7c14610365576101d3565b806352bbbe29146102b25780635c38449e146102c557806366a9c7d2146102e5576101d3565b80630f5a6efa1161017f5780630f5a6efa1461024157806316c38b3c1461026e5780631c0de0511461028e576101d3565b8063058a628f146101d857806309b2760f146101f85780630e8e3e841461022e576101d3565b366101d3576101d16101b5610526565b6001600160a01b0316336001600160a01b03161461020661054b565b005b600080fd5b3480156101e457600080fd5b506101d16101f3366004615157565b61055d565b34801561020457600080fd5b506102186102133660046156e6565b610581565b6040516102259190615d3e565b60405180910390f35b6101d161023c36600461531e565b610634565b34801561024d57600080fd5b5061026161025c3660046151f5565b610770565b6040516102259190615d08565b34801561027a57600080fd5b506101d161028936600461545c565b610806565b34801561029a57600080fd5b506102a361081f565b60405161022593929190615d26565b6102186102c036600461588f565b610848565b3480156102d157600080fd5b506101d16102e036600461565b565b6109e9565b3480156102f157600080fd5b506101d1610300366004615545565b610e06565b34801561031157600080fd5b506101d1610320366004615516565b610fa5565b34801561033157600080fd5b50610218610340366004615633565b6110f9565b34801561035157600080fd5b506101d16103603660046154ac565b61114b565b34801561037157600080fd5b50610218610380366004615157565b611161565b610261610393366004615786565b61117c565b3480156103a457600080fd5b506103ad6112b0565b6040516102259190615b63565b3480156103c657600080fd5b506103ad6112c4565b3480156103db57600080fd5b506103ef6103ea36600461560f565b6112d3565b6040516102259493929190615eb9565b6101d161040d3660046154ac565b611396565b34801561041e57600080fd5b506103ad6113af565b34801561043357600080fd5b506101d1610442366004615243565b6113d3565b34801561045357600080fd5b506102186114ef565b34801561046857600080fd5b5061047c610477366004615494565b6114f9565b604051610225929190615b9b565b34801561049657600080fd5b506102616104a5366004615702565b611523565b3480156104b657600080fd5b506104ca6104c5366004615494565b611620565b60405161022593929190615cd2565b3480156104e557600080fd5b506101d16104f43660046151ab565b611654565b34801561050557600080fd5b50610519610514366004615173565b6116e6565b6040516102259190615d1b565b7f00000000000000000000000000000000000000000000000000000000000000005b90565b8161055957610559816116fb565b5050565b610565611768565b61056d611781565b610576816117af565b61057e611822565b50565b600061058b611768565b610593611829565b60006105a2338460065461183e565b6000818152600560205260409020549091506105c49060ff16156101f461054b565b60008181526005602052604090819020805460ff1916600190811790915560068054909101905551339082907f3c13bc30b8e878c53fd2a36b679409c073afd75950be43d8858768e956fbc20e9061061d908790615e3a565b60405180910390a3905061062f611822565b919050565b61063c611768565b6000806000805b845181101561075b5760008060008060006106718a878151811061066357fe5b60200260200101518961187d565b9c50939850919650945092509050600185600381111561068d57fe5b14156106a45761069f848383866118f5565b61074a565b866106b6576106b1611829565b600196505b60008560038111156106c457fe5b14156106f5576106d684838386611918565b6106df84611938565b1561069f576106ee8984611945565b985061074a565b61070a61070185611938565b1561020761054b565b600061071585610548565b9050600286600381111561072557fe5b141561073c5761073781848487611957565b610748565b61074881848487611970565b505b505060019093019250610643915050565b50610765836119de565b50505061057e611822565b6060815167ffffffffffffffff8111801561078a57600080fd5b506040519080825280602002602001820160405280156107b4578160200160208202803683370190505b50905060005b82518110156107ff576107e0848483815181106107d357fe5b6020026020010151611a01565b8282815181106107ec57fe5b60209081029190910101526001016107ba565b5092915050565b61080e611768565b610816611781565b61057681611a2c565b600080600061082c611aaa565b159250610837611ac7565b9150610841611aeb565b9050909192565b6000610852611768565b61085a611829565b835161086581611b0f565b610874834211156101fc61054b565b61088760008760800151116101fe61054b565b60006108968760400151611b41565b905060006108a78860600151611b41565b90506108ca816001600160a01b0316836001600160a01b031614156101fd61054b565b6108d2614ce1565b885160808201526020890151819060018111156108eb57fe5b908160018111156108f857fe5b9052506001600160a01b03808416602083015282811660408084019190915260808b0151606084015260a08b01516101008401528951821660c08401528901511660e082015260008061094a83611b66565b9198509250905061098160008c60200151600181111561096657fe5b146109745789831115610979565b898210155b6101fb61054b565b6109998b60400151838c600001518d60200151611c5a565b6109b18b60600151828c604001518d60600151611d38565b6109d36109c18c60400151611938565b6109cc5760006109ce565b825b6119de565b5050505050506109e1611822565b949350505050565b6109f1611768565b6109f9611829565b610a0583518351611e12565b6060835167ffffffffffffffff81118015610a1f57600080fd5b50604051908082528060200260200182016040528015610a49578160200160208202803683370190505b5090506060845167ffffffffffffffff81118015610a6657600080fd5b50604051908082528060200260200182016040528015610a90578160200160208202803683370190505b5090506000805b8651811015610c09576000878281518110610aae57fe5b602002602001015190506000878381518110610ac657fe5b60200260200101519050610b11846001600160a01b0316836001600160a01b03161160006001600160a01b0316846001600160a01b031614610b09576066610b0c565b60685b61054b565b819350816001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610b409190615b63565b60206040518083038186803b158015610b5857600080fd5b505afa158015610b6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b909190615968565b858481518110610b9c57fe5b602002602001018181525050610bb181611e1f565b868481518110610bbd57fe5b602002602001018181525050610beb81868581518110610bd957fe5b6020026020010151101561021061054b565b610bff6001600160a01b0383168b83611ea6565b5050600101610a97565b506040517ff04f27070000000000000000000000000000000000000000000000000000000081526001600160a01b0388169063f04f270790610c55908990899088908a90600401615c85565b600060405180830381600087803b158015610c6f57600080fd5b505af1158015610c83573d6000803e3d6000fd5b5050505060005b8651811015610df4576000878281518110610ca157fe5b602002602001015190506000848381518110610cb957fe5b602002602001015190506000826001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610cf19190615b63565b60206040518083038186803b158015610d0957600080fd5b505afa158015610d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d419190615968565b9050610d528282101561020361054b565b60008282039050610d7b888681518110610d6857fe5b602002602001015182101561025a61054b565b610d858482611f11565b836001600160a01b03168c6001600160a01b03167f0d7d75e01ab95780d3cd1c8ec0dd6c2ce19e3a20427eec8bf53283b6fb8e95f08c8881518110610dc657fe5b602002602001015184604051610ddd929190615e4d565b60405180910390a350505050806001019050610c8a565b50505050610e00611822565b50505050565b610e0e611768565b610e16611829565b82610e2081611f33565b610e2c83518351611e12565b60005b8351811015610eca576000848281518110610e4657fe5b60200260200101519050610e7260006001600160a01b0316826001600160a01b0316141561013561054b565b838281518110610e7e57fe5b6020908102919091018101516000888152600a835260408082206001600160a01b0395861683529093529190912080546001600160a01b03191692909116919091179055600101610e2f565b506000610ed685611f64565b90506002816002811115610ee657fe5b1415610f3457610efc845160021461020c61054b565b610f2f8585600081518110610f0d57fe5b602002602001015186600181518110610f2257fe5b6020026020010151611f7e565b610f5c565b6001816002811115610f4257fe5b1415610f5257610f2f858561202a565b610f5c8585612082565b847ff5847d3f2197b16cdcd2098ec95d0905cd1abdaf415f07bb7cef2bba8ac5dec48585604051610f8e929190615bed565b60405180910390a25050610fa0611822565b505050565b610fad611768565b610fb5611829565b81610fbf81611f33565b6000610fca84611f64565b90506002816002811115610fda57fe5b141561102857610ff0835160021461020c61054b565b611023848460008151811061100157fe5b60200260200101518560018151811061101657fe5b60200260200101516120d7565b611050565b600181600281111561103657fe5b1415611046576110238484612145565b61105084846121ff565b60005b83518110156110b657600a6000868152602001908152602001600020600085838151811061107d57fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002080546001600160a01b0319169055600101611053565b50837f7dcdc6d02ef40c7c1a7046a011b058bd7f988fa14e20a66344f9d4e60657d610846040516110e79190615bda565b60405180910390a25050610559611822565b60007f00000000000000000000000000000000000000000000000000000000000000008260405160200161112e929190615ac2565b604051602081830303815290604052805190602001209050919050565b610e00600185858561115c86612262565b61226e565b6001600160a01b031660009081526002602052604090205490565b6060611186611768565b61118e611829565b835161119981611b0f565b6111a8834211156101fc61054b565b6111b486518551611e12565b6111c08787878b6123f4565b91506000805b87518110156112925760008882815181106111dd57fe5b6020026020010151905060008583815181106111f557fe5b6020026020010151905061122188848151811061120e57fe5b60200260200101518213156101fb61054b565b600081131561126157885160208a015182916112409185918491611c5a565b61124983611938565b1561125b576112588582611945565b94505b50611288565b600081121561128857600081600003905061128683828c604001518d60600151611d38565b505b50506001016111c6565b5061129c816119de565b50506112a6611822565b9695505050505050565b60035461010090046001600160a01b031690565b60006112ce610526565b905090565b600080600080856112e381612683565b6000806112ef89611f64565b905060028160028111156112ff57fe5b14156113165761130f89896126a1565b9150611341565b600181600281111561132457fe5b14156113345761130f898961271b565b61133e8989612789565b91505b61134a826127a1565b9650611355826127b4565b9550611360826127ca565b6000998a52600a60209081526040808c206001600160a01b039b8c168d5290915290992054969995989796909616955050505050565b61139e611829565b610e00600085858561115c86612262565b7f000000000000000000000000000000000000000000000000000000000000000090565b6113db611768565b6113e3611829565b6113eb614d31565b60005b82518110156114e55782818151811061140357fe5b6020026020010151915060008260200151905061141f81612683565b604083015161143961143183836127d0565b61020961054b565b6000828152600a602090815260408083206001600160a01b03858116855292529091205461146c911633146101f661054b565b835160608501516000806114828487878661282c565b91509150846001600160a01b0316336001600160a01b0316877f6edcaf6241105b4c94c2efdbf3a6b12458eb3d07be3a0e81d24b13c44045fe7a85856040516114cc929190615e4d565b60405180910390a45050505050508060010190506113ee565b505061057e611822565b60006112ce61289b565b6000808261150681612683565b61150f84612938565b61151885611f64565b925092505b50915091565b60603330146115f6576000306001600160a01b0316600036604051611549929190615ada565b6000604051808303816000865af19150503d8060008114611586576040519150601f19603f3d011682016040523d82523d6000602084013e61158b565b606091505b50509050806000811461159a57fe5b60046000803e6000516001600160e01b0319167ffa61cc120000000000000000000000000000000000000000000000000000000081146115de573d6000803e3d6000fd5b50602060005260043d0380600460203e602081016000f35b6060611604858585896123f4565b9050602081510263fa61cc126020830352600482036024820181fd5b60608060008361162f81612683565b606061163a8661293e565b9095509050611648816129a0565b95979096509350505050565b61165c611768565b611664611829565b8261166e81611b0f565b6001600160a01b0384811660008181526004602090815260408083209488168084529490915290819020805460ff1916861515179055519091907f46961fdb4502b646d5095fba7600486a8ac05041d55cdf0f16ed677180b5cad8906116d5908690615d1b565b60405180910390a350610fa0611822565b60006116f28383612a4f565b90505b92915050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b61177a6002600054141561019061054b565b6002600055565b60006117986000356001600160e01b0319166110f9565b905061057e6117a78233612a7d565b61019161054b565b6040516001600160a01b038216907f94b979b6831a51293e2641426f97747feed46f17779fed9cd18d1ecefcfe92ef90600090a2600380546001600160a01b03909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b6001600055565b61183c611834611aaa565b61019261054b565b565b600069ffffffffffffffffffff8216605084600281111561185b57fe5b901b17606085901b6bffffffffffffffffffffffff19161790505b9392505050565b600080600080600080600088606001519050336001600160a01b0316816001600160a01b0316146118cf57876118ba576118b5611781565b600197505b6118cf6118c78233612a4f565b6101f761054b565b885160208a015160408b01516080909b0151919b909a9992985090965090945092505050565b61190a8361190286611b41565b836000612b20565b50610e008482846000611d38565b61192b8261192586611b41565b83612b76565b610e008482856000611c5a565b6001600160a01b03161590565b60008282016116f2848210158361054b565b6119648385836000612b20565b50610e00828583612b76565b8015610e005761198b6001600160a01b038516848484612ba6565b826001600160a01b0316846001600160a01b03167f540a1a3f28340caec336c81d8d7b3df139ee5cdc1839a4f283d7ebb7eaae2d5c84846040516119d0929190615bc1565b60405180910390a350505050565b6119ed8134101561020461054b565b348190038015610559576105593382612bc7565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b8015611a4c57611a47611a3d611ac7565b421061019361054b565b611a61565b611a61611a57611aeb565b42106101a961054b565b6003805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611a9f908390615d1b565b60405180910390a150565b6000611ab4611aeb565b4211806112ce57505060035460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b336001600160a01b0382161461057e57611b27611781565b611b318133612a4f565b61057e5761057e816101f7612c41565b6000611b4c82611938565b611b5e57611b5982610548565b6116f5565b6116f5610526565b600080600080611b798560800151612938565b90506000611b8a8660800151611f64565b90506002816002811115611b9a57fe5b1415611bb157611baa8683612c75565b9450611bdc565b6001816002811115611bbf57fe5b1415611bcf57611baa8683612d25565b611bd98683612db8565b94505b611bef8660000151876060015187612ff7565b809450819550505085604001516001600160a01b031686602001516001600160a01b031687608001517f2170c741c41531aec20e7c107c24eecfdd15e69c9bb0a8dd37b1840b9e0b207b8787604051611c49929190615e4d565b60405180910390a450509193909250565b82611c6457610e00565b611c6d84611938565b15611cee57611c7f811561020261054b565b611c8e8347101561020461054b565b611c96610526565b6001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015611cd057600080fd5b505af1158015611ce4573d6000803e3d6000fd5b5050505050610e00565b6000611cf985610548565b90508115611d16576000611d108483876001612b20565b90940393505b8315611d3157611d316001600160a01b038216843087612ba6565b5050505050565b82611d4257610e00565b611d4b84611938565b15611ddb57611d5d811561020261054b565b611d65610526565b6001600160a01b0316632e1a7d4d846040518263ffffffff1660e01b8152600401611d909190615d3e565b600060405180830381600087803b158015611daa57600080fd5b505af1158015611dbe573d6000803e3d6000fd5b50611dd6925050506001600160a01b03831684612bc7565b610e00565b6000611de685610548565b90508115611dfe57611df9838286612b76565b611d31565b611d316001600160a01b0382168486611ea6565b610559818314606761054b565b600080611e2a6113af565b6001600160a01b031663d877845c6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e6257600080fd5b505afa158015611e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9a9190615968565b90506118768382613025565b610fa08363a9059cbb60e01b8484604051602401611ec5929190615bc1565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b031990931692909217909152613072565b801561055957610559611f226113af565b6001600160a01b0384169083611ea6565b611f3c81612683565b61057e611f4882612938565b6001600160a01b0316336001600160a01b0316146101f561054b565b600061ffff605083901c166116f5600382106101f461054b565b611f9f816001600160a01b0316836001600160a01b0316141561020a61054b565b611fbe816001600160a01b0316836001600160a01b031610606661054b565b60008381526009602052604090208054611ffb906001600160a01b0316158015611ff3575060018201546001600160a01b0316155b61020b61054b565b80546001600160a01b039384166001600160a01b03199182161782556001909101805492909316911617905550565b6000828152600860205260408120905b8251811015610e0057600061206b84838151811061205457fe5b60200260200101518461311290919063ffffffff16565b90506120798161020a61054b565b5060010161203a565b6000828152600160205260408120905b8251811015610e005760006120c08483815181106120ac57fe5b602090810291909101015184906000613175565b90506120ce8161020a61054b565b50600101612092565b60008060006120e7868686613222565b9250925092506121116120f9846132e9565b80156121095750612109836132e9565b61020d61054b565b600095865260096020526040862080546001600160a01b031990811682556001909101805490911690559490945550505050565b6000828152600860205260408120905b8251811015610e0057600083828151811061216c57fe5b602002602001015190506121b8612109600760008881526020019081526020016000206000846001600160a01b03166001600160a01b03168152602001908152602001600020546132e9565b60008581526007602090815260408083206001600160a01b038516845290915281208190556121e7848361330b565b90506121f58161020961054b565b5050600101612155565b6000828152600160205260408120905b8251811015610e0057600083828151811061222657fe5b60200260200101519050600061223c8483613412565b905061224a612109826132e9565b6122548483613421565b50505080600101905061220f565b61226a614d5a565b5090565b612276611768565b8361228081612683565b8361228a81611b0f565b61229e836000015151846020015151611e12565b60606122ad84600001516134c3565b905060606122bb8883613552565b905060608060606122d08c8c8c8c8c896135e3565b92509250925060006122e18c611f64565b905060028160028111156122f157fe5b1415612359576123548c8760008151811061230857fe5b60200260200101518660008151811061231d57fe5b60200260200101518960018151811061233257fe5b60200260200101518860018151811061234757fe5b60200260200101516137a8565b612382565b600181600281111561236757fe5b1415612378576123548c87866137e7565b6123828c85613854565b6000808e600181111561239157fe5b1490508b6001600160a01b03168d7fe5ce249087ce04f05a957192435400fd97868dba0e6a4b4c049abf8af80dae78896123cb888661389d565b876040516123db93929190615c4c565b60405180910390a3505050505050505050611d31611822565b6060835167ffffffffffffffff8111801561240e57600080fd5b50604051908082528060200260200182016040528015612438578160200160208202803683370190505b509050612443614d84565b61244b614ce1565b60008060005b89518110156126765789818151811061246657fe5b6020026020010151945060008951866020015110801561248a575089518660400151105b905061249781606461054b565b60006124b98b8860200151815181106124ac57fe5b6020026020010151611b41565b905060006124d08c8960400151815181106124ac57fe5b90506124f3816001600160a01b0316836001600160a01b031614156101fd61054b565b60608801516125435761250b600085116101fe61054b565b60006125188b8484613945565b6001600160a01b0316876001600160a01b031614905061253a816101ff61054b565b50606088018590525b87516080880152868a600181111561255757fe5b9081600181111561256457fe5b9052506001600160a01b0380831660208901528181166040808a01919091526060808b0151908a015260808a01516101008a01528c51821660c08a01528c01511660e08801526000806125b689611b66565b919850925090506125c88c8585613967565b97506125fc6125d683613981565b8c8c60200151815181106125e657fe5b60200260200101516139b190919063ffffffff16565b8b8b602001518151811061260c57fe5b60200260200101818152505061264a61262482613981565b8c8c604001518151811061263457fe5b60200260200101516139e590919063ffffffff16565b8b8b604001518151811061265a57fe5b6020026020010181815250505050505050806001019050612451565b5050505050949350505050565b60008181526005602052604090205461057e9060ff166101f461054b565b60008060008060006126b287613a19565b945094509450945050836001600160a01b0316866001600160a01b031614156126e157829450505050506116f5565b816001600160a01b0316866001600160a01b031614156127065793506116f592505050565b6127116102096116fb565b5050505092915050565b60008281526007602090815260408083206001600160a01b03851684529091528120548161274882613a8f565b80612766575060008581526008602052604090206127669085613aa1565b9050806127815761277685612683565b6127816102096116fb565b509392505050565b60008281526001602052604081206109e18184613412565b6dffffffffffffffffffffffffffff1690565b60701c6dffffffffffffffffffffffffffff1690565b60e01c90565b6000806127dc84611f64565b905060028160028111156127ec57fe5b1415612804576127fc8484613ac2565b9150506116f5565b600181600281111561281257fe5b1415612822576127fc8484613b13565b6127fc8484613b2b565b600080600061283a86611f64565b9050600087600281111561284a57fe5b14156128665761285c86828787613b43565b9250925050612892565b600187600281111561287457fe5b14156128865761285c86828787613bbe565b61285c86828787613c3a565b94509492505050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612908613c9d565b3060405160200161291d959493929190615df0565b60405160208183030381529060405280519060200120905090565b60601c90565b606080600061294c84611f64565b9050600281600281111561295c57fe5b14156129755761296b84613ca1565b925092505061299b565b600181600281111561298357fe5b14156129925761296b84613dd6565b61296b84613efd565b915091565b60606000825167ffffffffffffffff811180156129bc57600080fd5b506040519080825280602002602001820160405280156129e6578160200160208202803683370190505b5091506000905060005b825181101561151d576000848281518110612a0757fe5b60200260200101519050612a1a81613ff9565b848381518110612a2657fe5b602002602001018181525050612a4483612a3f836127ca565b614014565b9250506001016129f0565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b6003546040517f9be2a88400000000000000000000000000000000000000000000000000000000815260009161010090046001600160a01b031690639be2a88490612ad090869086903090600401615d47565b60206040518083038186803b158015612ae857600080fd5b505afa158015612afc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f29190615478565b600080612b2d8686611a01565b9050612b468380612b3e5750848210155b61020161054b565b612b50818561402b565b9150818103612b6c878783612b6487613981565b60000361403a565b5050949350505050565b6000612b828484611a01565b90506000612b908284611945565b9050611d31858583612ba187613981565b61403a565b610e00846323b872dd60e01b858585604051602401611ec593929190615b77565b612bd6814710156101a361054b565b6000826001600160a01b031682604051612bef90610548565b60006040518083038185875af1925050503d8060008114612c2c576040519150601f19603f3d011682016040523d82523d6000602084013e612c31565b606091505b50509050610fa0816101a461054b565b6001600160a01b0382166000908152600260205260409020805460018101909155610fa0612c6f8483614095565b8361054b565b600080600080612c92866080015187602001518860400151613222565b92509250925060008087604001516001600160a01b031688602001516001600160a01b03161015612cc7575083905082612ccd565b50829050835b612cd9888884846141bb565b60408b015160208c01519199509294509092506001600160a01b03918216911610612d0d57612d0881836142d1565b612d17565b612d1782826142d1565b909255509295945050505050565b600080612d3a8460800151856020015161271b565b90506000612d508560800151866040015161271b565b9050612d5e858584846141bb565b6080880180516000908152600760208181526040808420828e01516001600160a01b03908116865290835281852098909855935183529081528282209a830151909516815298909352919096209590955550929392505050565b60808201516000908152600160209081526040822090840151829182918290612de290839061430c565b90506000612dfd88604001518461430c90919063ffffffff16565b9050811580612e0a575080155b15612e2757612e1c8860800151612683565b612e276102096116fb565b60001991820191016000612e3a8461432b565b905060608167ffffffffffffffff81118015612e5557600080fd5b50604051908082528060200260200182016040528015612e7f578160200160208202803683370190505b50600060a08c018190529091505b82811015612eff576000612ea1878361432f565b9050612eac81613ff9565b838381518110612eb857fe5b602002602001018181525050612ed58c60a00151612a3f836127ca565b60a08d015281861415612eea57809850612ef6565b84821415612ef6578097505b50600101612e8d565b506040517f01ec954a0000000000000000000000000000000000000000000000000000000081526001600160a01b038a16906301ec954a90612f4b908d90859089908990600401615e5b565b602060405180830381600087803b158015612f6557600080fd5b505af1158015612f79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9d9190615968565b9750600080612fb58c600001518d606001518c612ff7565b9092509050612fc48983614345565b9850612fd08882614376565b9750612fdd87878b61438c565b612fe887868a61438c565b50505050505050505092915050565b6000808085600181111561300757fe5b141561301757508290508161301d565b50819050825b935093915050565b600082820261304984158061304257508385838161303f57fe5b04145b600361054b565b806130585760009150506116f5565b670de0b6b3a76400006000198201046001019150506116f5565b60006060836001600160a01b03168360405161308e9190615aea565b6000604051808303816000865af19150503d80600081146130cb576040519150601f19603f3d011682016040523d82523d6000602084013e6130d0565b606091505b509150915060008214156130e8573d6000803e3d6000fd5b610e0081516000148061310a57508180602001905181019061310a9190615478565b6101a261054b565b600061311e8383613aa1565b61316d57508154600180820184556000848152602080822090930180546001600160a01b0319166001600160a01b038616908117909155855490825282860190935260409020919091556116f5565b5060006116f5565b6001600160a01b03821660009081526002840160205260408120548061320257505082546040805180820182526001600160a01b03858116808352602080840187815260008781526001808c018452878220965187546001600160a01b03191696169590951786559051948401949094559482018089559083526002880190945291902091909155611876565b600019016000908152600180860160205260408220018390559050611876565b600080600080600061323487876143a4565b91509150600061324483836143d5565b60008a81526009602090815260408083208484526002019091528120805460018201549197509293509061327783613a8f565b80613286575061328682613a8f565b806132a757506132968c87613ac2565b80156132a757506132a78c86613ac2565b9050806132c2576132b78c612683565b6132c26102096116fb565b6132cc8383614408565b98506132d8838361442d565b975050505050505093509350939050565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161590565b6001600160a01b03811660009081526001830160205260408120548015613408578354600019808301919081019060009087908390811061334857fe5b60009182526020909120015487546001600160a01b039091169150819088908590811061337157fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559183168152600189810190925260409020908401905586548790806133ba57fe5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03881682526001898101909152604082209190915594506116f59350505050565b60009150506116f5565b60006116f28383610209614444565b6001600160a01b0381166000908152600283016020526040812054801561340857835460001990810160008181526001878101602090815260408084209587018452808420865481546001600160a01b03199081166001600160a01b0392831617835588860180549387019390935588548216875260028d018086528488209a909a5588541690975584905593895593871682529390925281205590506116f5565b606080825167ffffffffffffffff811180156134de57600080fd5b50604051908082528060200260200182016040528015613508578160200160208202803683370190505b50905060005b83518110156107ff576135268482815181106124ac57fe5b82828151811061353257fe5b6001600160a01b039092166020928302919091019091015260010161350e565b60608060606135608561293e565b9150915061357082518551611e12565b613580600083511161020f61054b565b60005b82518110156135da576135d285828151811061359b57fe5b60200260200101516001600160a01b03168483815181106135b857fe5b60200260200101516001600160a01b03161461020861054b565b600101613583565b50949350505050565b60608060608060006135f4866129a0565b9150915060006136038b612938565b905060008c600181111561361357fe5b146136b657806001600160a01b03166374f3b0098c8c8c8787613634614481565b8f604001516040518863ffffffff1660e01b815260040161365b9796959493929190615d66565b600060405180830381600087803b15801561367557600080fd5b505af1158015613689573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526136b19190810190615405565b61374f565b806001600160a01b031663d5c096c48c8c8c87876136d2614481565b8f604001516040518863ffffffff1660e01b81526004016136f99796959493929190615d66565b600060405180830381600087803b15801561371357600080fd5b505af1158015613727573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261374f9190810190615405565b80955081965050506137658751865186516144fb565b60008c600181111561377357fe5b1461378a576137858989898888614513565b613797565b6137978a8989888861465a565b955050505096509650969350505050565b60006137b485846143d5565b600087815260096020908152604080832084845260020190915290209091506137dd85846142d1565b9055505050505050565b60005b8251811015610e00578181815181106137ff57fe5b602002602001015160076000868152602001908152602001600020600085848151811061382857fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020556001016137ea565b6000828152600160205260408120905b8251811015610e00576138958184838151811061387d57fe5b60200260200101518461438c9092919063ffffffff16565b600101613864565b6060825167ffffffffffffffff811180156138b757600080fd5b506040519080825280602002602001820160405280156138e1578160200160208202803683370190505b50905060005b83518110156107ff57826139115783818151811061390157fe5b6020026020010151600003613926565b83818151811061391d57fe5b60200260200101515b82828151811061393257fe5b60209081029190910101526001016138e7565b60008084600181111561395457fe5b1461395f57816109e1565b509092915050565b60008084600181111561397657fe5b146107ff57826109e1565b600061226a7f800000000000000000000000000000000000000000000000000000000000000083106101a561054b565b60008282016116f28284128015906139c95750848212155b806139de57506000841280156139de57508482125b600061054b565b60008183036116f28284128015906139fd5750848213155b80613a125750600084128015613a1257508482135b600161054b565b6000818152600960205260408120805460018201546001600160a01b0391821692849290911690829081613a4d86856143d5565b6000818152600284016020526040902080546001820154919950919250613a748282614408565b9650613a80828261442d565b94505050505091939590929450565b6000613a9a826132e9565b1592915050565b6001600160a01b031660009081526001919091016020526040902054151590565b600082815260096020526040812080546001600160a01b0384811691161480613afa575060018101546001600160a01b038481169116145b80156109e1575050506001600160a01b03161515919050565b60008281526008602052604081206109e18184613aa1565b60008281526001602052604081206109e181846147d0565b6000806002856002811115613b5457fe5b1415613b6a57613b658685856147f1565b613b94565b6001856002811115613b7857fe5b1415613b8957613b658685856147ff565b613b9486858561480d565b8215613bae57613bae6001600160a01b0385163385611ea6565b5050600081900394909350915050565b6000806002856002811115613bcf57fe5b1415613be557613be086858561481b565b613c0f565b6001856002811115613bf357fe5b1415613c0457613be0868585614829565b613c0f868585614837565b8215613c2a57613c2a6001600160a01b038516333086612ba6565b5090946000869003945092505050565b6000806002856002811115613c4b57fe5b1415613c6357613c5c868585614845565b9050613c90565b6001856002811115613c7157fe5b1415613c8257613c5c868585614855565b613c8d868585614865565b90505b6000915094509492505050565b4690565b606080600080600080613cb387613a19565b92975090955093509150506001600160a01b0384161580613cdb57506001600160a01b038216155b15613d04575050604080516000808252602082019081528183019092529450925061299b915050565b60408051600280825260608201835290916020830190803683370190505095508386600081518110613d3257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508186600181518110613d6057fe5b6001600160a01b03929092166020928302919091018201526040805160028082526060820183529092909190830190803683370190505094508285600081518110613da757fe5b6020026020010181815250508085600181518110613dc157fe5b60200260200101818152505050505050915091565b60008181526008602052604090206060908190613df28161432b565b67ffffffffffffffff81118015613e0857600080fd5b50604051908082528060200260200182016040528015613e32578160200160208202803683370190505b509250825167ffffffffffffffff81118015613e4d57600080fd5b50604051908082528060200260200182016040528015613e77578160200160208202803683370190505b50915060005b8351811015613ef6576000613e928383614875565b905080858381518110613ea157fe5b6001600160a01b03928316602091820292909201810191909152600088815260078252604080822093851682529290915220548451859084908110613ee257fe5b602090810291909101015250600101613e7d565b5050915091565b60008181526001602052604090206060908190613f198161432b565b67ffffffffffffffff81118015613f2f57600080fd5b50604051908082528060200260200182016040528015613f59578160200160208202803683370190505b509250825167ffffffffffffffff81118015613f7457600080fd5b50604051908082528060200260200182016040528015613f9e578160200160208202803683370190505b50915060005b8351811015613ef657613fb782826148a2565b858381518110613fc357fe5b60200260200101858481518110613fd657fe5b60209081029190910101919091526001600160a01b039091169052600101613fa4565b6000614004826127b4565b61400d836127a1565b0192915050565b60008183101561402457816116f2565b5090919050565b600081831061402457816116f2565b6001600160a01b038085166000818152600b602090815260408083209488168084529490915290819020859055517f18e1ea4139e68413d7d08aa752e71568e36b2c5bf940893314c2c5b01eaa0c42906119d0908590615d3e565b6000806140a06148c6565b9050428110156140b45760009150506116f5565b60006140be6148d2565b9050806140d0576000925050506116f5565b6000816140db6149e3565b80516020918201206040516140f7939233918a91899101615dc4565b604051602081830303815290604052805190602001209050600061411a82614a32565b90506000806000614129614a4e565b9250925092506000600185858585604051600081526020016040526040516141549493929190615e1c565b6020604051602081039080840390855afa158015614176573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906141ac57508a6001600160a01b0316816001600160a01b0316145b9b9a5050505050505050505050565b6000806000806141ca86613ff9565b905060006141d786613ff9565b90506141ee6141e5886127ca565b612a3f886127ca565b60a08a01526040517f9d2c110c0000000000000000000000000000000000000000000000000000000081526001600160a01b03891690639d2c110c9061423c908c9086908690600401615e94565b602060405180830381600087803b15801561425657600080fd5b505af115801561426a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061428e9190615968565b92506000806142a68b600001518c6060015187612ff7565b90925090506142b58983614345565b96506142c18882614376565b9550505050509450945094915050565b6000806142e96142e0856127ca565b612a3f856127ca565b90506109e16142f7856127a1565b614300856127a1565b8363ffffffff16614a75565b6001600160a01b03166000908152600291909101602052604090205490565b5490565b6000908152600191820160205260409020015490565b60008061435b83614355866127a1565b90611945565b90506000614368856127b4565b9050436112a6838383614a83565b60008061435b83614386866127a1565b90614abc565b60009182526001928301602052604090912090910155565b600080826001600160a01b0316846001600160a01b0316106143c75782846143ca565b83835b915091509250929050565b600082826040516020016143ea929190615b06565b60405160208183030381529060405280519060200120905092915050565b60006116f2614416846127a1565b61441f846127a1565b614428866127ca565b614a83565b60006116f261443b846127b4565b61441f846127b4565b6001600160a01b038216600090815260028401602052604081205461446b8115158461054b565b614478856001830361432f565b95945050505050565b600061448b6113af565b6001600160a01b03166355c676286040518163ffffffff1660e01b815260040160206040518083038186803b1580156144c357600080fd5b505afa1580156144d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ce9190615968565b610fa0828414801561450c57508183145b606761054b565b6060835167ffffffffffffffff8111801561452d57600080fd5b50604051908082528060200260200182016040528015614557578160200160208202803683370190505b50905060005b85515181101561465057600084828151811061457557fe5b602002602001015190506145a58760200151838151811061459257fe5b60200260200101518210156101f961054b565b6000876000015183815181106145b757fe5b602002602001015190506145d181838b8b60600151611d38565b60008584815181106145df57fe5b602002602001015190506145fb6145f583611b41565b82611f11565b61462a6146088483611945565b89868151811061461457fe5b602002602001015161437690919063ffffffff16565b85858151811061463657fe5b60200260200101818152505050505080600101905061455d565b5095945050505050565b60606000845167ffffffffffffffff8111801561467657600080fd5b506040519080825280602002602001820160405280156146a0578160200160208202803683370190505b50915060005b8651518110156147c65760008582815181106146be57fe5b602002602001015190506146ee886020015183815181106146db57fe5b60200260200101518211156101fa61054b565b60008860000151838151811061470057fe5b6020026020010151905061471a81838c8c60600151611c5a565b61472381611938565b15614735576147328483611945565b93505b600086848151811061474357fe5b602002602001015190506147596145f583611b41565b80831015614778576147738382038a868151811061461457fe5b6147a0565b6147a08184038a868151811061478a57fe5b602002602001015161434590919063ffffffff16565b8685815181106147ac57fe5b6020026020010181815250505050508060010190506146a6565b50614650816119de565b6001600160a01b031660009081526002919091016020526040902054151590565b610e008383614ad284614b0d565b610e008383614ad284614bb8565b610e008383614ad284614c13565b610e008383614c6284614b0d565b610e008383614c6284614bb8565b610e008383614c6284614c13565b60006109e18484614c8385614b0d565b60006109e18484614c8385614bb8565b60006109e18484614c8385614c13565b600082600001828154811061488657fe5b6000918252602090912001546001600160a01b03169392505050565b600090815260019182016020526040902080549101546001600160a01b0390911691565b60006112ce6000614c9d565b6000803560e01c8063b95cac28811461491a57638bdb39138114614942576352bbbe29811461496a5763945bcec981146149925763fa6e671d81146149ba57600092506149de565b7f3f7b71252bd19113ff48c19c6e004a9bcfcca320a0d74d58e85877cbd7dcae5892506149de565b7f8bbc57f66ea936902f50a71ce12b92c43f3c5340bb40c27c4e90ab84eeae335392506149de565b7fe192dcbc143b1e244ad73b813fd3c097b832ad260a157340b4e5e5beda067abe92506149de565b7f9bfc43a4d98313c6766986ffd7c916c7481566d9f224c6819af0a53388aced3a92506149de565b7fa3f865aa351e51cfeb40f5178d1564bb629fe9030b83caf6361d1baaf5b90b5a92505b505090565b60606000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505050608010156105485760803603815290565b6000614a3c61289b565b8260405160200161112e929190615b2d565b6000806000614a5d6020614c9d565b9250614a696040614c9d565b91506108416060614c9d565b60e01b60709190911b010190565b6000838301614ab1858210801590614aa957506e01000000000000000000000000000082105b61020e61054b565b614478858585614a75565b6000614acc83831115600161054b565b50900390565b600080614ae283614386866127a1565b90506000614af384614355876127b4565b90506000614b00866127ca565b90506112a6838383614a83565b6000806000806000614b1e89613a19565b9450509350935093506000836001600160a01b0316896001600160a01b03161415614b69576000614b5384898b63ffffffff16565b9050614b5f8185614ca7565b9093509050614b8b565b6000614b7983898b63ffffffff16565b9050614b858184614ca7565b90925090505b614b9583836142d1565b8555614ba18383614cc3565b600190950194909455509192505050949350505050565b600080614bc5868661271b565b90506000614bd782858763ffffffff16565b60008881526007602090815260408083206001600160a01b038b16845290915290208190559050614c088183614ca7565b979650505050505050565b600084815260016020526040812081614c2c8287613412565b90506000614c3e82868863ffffffff16565b9050614c4b838883613175565b50614c568183614ca7565b98975050505050505050565b600080614c7283614355866127a1565b90506000614af384614386876127b4565b600080614c8f846127a1565b905043614478828583614a83565b3601607f19013590565b6000614cb2826127b4565b614cbb846127b4565b039392505050565b60006116f2614cd1846127b4565b614cda846127b4565b6000614a75565b60408051610120810190915280600081526000602082018190526040820181905260608083018290526080830182905260a0830182905260c0830182905260e08301919091526101009091015290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040518060a0016040528060008019168152602001600081526020016000815260200160008152602001606081525090565b80356116f581615f5a565b600082601f830112614dd1578081fd5b8135614de4614ddf82615f04565b615edd565b818152915060208083019084810181840286018201871015614e0557600080fd5b60005b84811015614e2d578135614e1b81615f5a565b84529282019290820190600101614e08565b505050505092915050565b600082601f830112614e48578081fd5b8135614e56614ddf82615f04565b818152915060208083019084810160005b84811015614e2d578135870160a080601f19838c03011215614e8857600080fd5b614e9181615edd565b85830135815260408084013587830152606080850135828401526080915081850135818401525082840135925067ffffffffffffffff831115614ed357600080fd5b614ee18c8885870101614fc0565b90820152865250509282019290820190600101614e67565b600082601f830112614f09578081fd5b8135614f17614ddf82615f04565b818152915060208083019084810181840286018201871015614f3857600080fd5b60005b84811015614e2d57813584529282019290820190600101614f3b565b600082601f830112614f67578081fd5b8151614f75614ddf82615f04565b818152915060208083019084810181840286018201871015614f9657600080fd5b60005b84811015614e2d57815184529282019290820190600101614f99565b80356116f581615f6f565b600082601f830112614fd0578081fd5b813567ffffffffffffffff811115614fe6578182fd5b614ff9601f8201601f1916602001615edd565b915080825283602082850101111561501057600080fd5b8060208401602084013760009082016020015292915050565b80356116f581615f7d565b8035600281106116f557600080fd5b8035600481106116f557600080fd5b600060808284031215615063578081fd5b61506d6080615edd565b9050813567ffffffffffffffff8082111561508757600080fd5b61509385838601614dc1565b835260208401359150808211156150a957600080fd5b6150b585838601614ef9565b602084015260408401359150808211156150ce57600080fd5b506150db84828501614fc0565b6040830152506150ee8360608401614fb5565b606082015292915050565b60006080828403121561510a578081fd5b6151146080615edd565b9050813561512181615f5a565b8152602082013561513181615f6f565b6020820152604082013561514481615f5a565b604082015260608201356150ee81615f6f565b600060208284031215615168578081fd5b81356116f281615f5a565b60008060408385031215615185578081fd5b823561519081615f5a565b915060208301356151a081615f5a565b809150509250929050565b6000806000606084860312156151bf578081fd5b83356151ca81615f5a565b925060208401356151da81615f5a565b915060408401356151ea81615f6f565b809150509250925092565b60008060408385031215615207578182fd5b823561521281615f5a565b9150602083013567ffffffffffffffff81111561522d578182fd5b61523985828601614dc1565b9150509250929050565b60006020808385031215615255578182fd5b823567ffffffffffffffff81111561526b578283fd5b8301601f8101851361527b578283fd5b8035615289614ddf82615f04565b818152838101908385016080808502860187018a10156152a7578788fd5b8795505b848610156153105780828b0312156152c1578788fd5b6152ca81615edd565b6152d48b84615029565b8152878301358882015260406152ec8c828601614db6565b908201526060838101359082015284526001959095019492860192908101906152ab565b509098975050505050505050565b60006020808385031215615330578182fd5b823567ffffffffffffffff811115615346578283fd5b8301601f81018513615356578283fd5b8035615364614ddf82615f04565b8181528381019083850160a0808502860187018a1015615382578788fd5b8795505b848610156153105780828b03121561539c578788fd5b6153a581615edd565b6153af8b84615043565b81526153bd8b898501614db6565b818901526040838101359082015260606153d98c828601614db6565b9082015260806153eb8c858301614db6565b908201528452600195909501949286019290810190615386565b60008060408385031215615417578182fd5b825167ffffffffffffffff8082111561542e578384fd5b61543a86838701614f57565b9350602085015191508082111561544f578283fd5b5061523985828601614f57565b60006020828403121561546d578081fd5b81356116f281615f6f565b600060208284031215615489578081fd5b81516116f281615f6f565b6000602082840312156154a5578081fd5b5035919050565b600080600080608085870312156154c1578182fd5b8435935060208501356154d381615f5a565b925060408501356154e381615f5a565b9150606085013567ffffffffffffffff8111156154fe578182fd5b61550a87828801615052565b91505092959194509250565b60008060408385031215615528578182fd5b82359150602083013567ffffffffffffffff81111561522d578182fd5b600080600060608486031215615559578081fd5b8335925060208085013567ffffffffffffffff80821115615578578384fd5b61558488838901614dc1565b94506040870135915080821115615599578384fd5b508501601f810187136155aa578283fd5b80356155b8614ddf82615f04565b81815283810190838501858402850186018b10156155d4578687fd5b8694505b838510156155ff5780356155eb81615f5a565b8352600194909401939185019185016155d8565b5080955050505050509250925092565b60008060408385031215615621578182fd5b8235915060208301356151a081615f5a565b600060208284031215615644578081fd5b81356001600160e01b0319811681146116f2578182fd5b60008060008060808587031215615670578182fd5b843561567b81615f5a565b9350602085013567ffffffffffffffff80821115615697578384fd5b6156a388838901614dc1565b945060408701359150808211156156b8578384fd5b6156c488838901614ef9565b935060608701359150808211156156d9578283fd5b5061550a87828801614fc0565b6000602082840312156156f7578081fd5b81356116f281615f7d565b60008060008060e08587031215615717578182fd5b6157218686615034565b9350602085013567ffffffffffffffff8082111561573d578384fd5b61574988838901614e38565b9450604087013591508082111561575e578384fd5b5061576b87828801614dc1565b92505061577b86606087016150f9565b905092959194509250565b600080600080600080610120878903121561579f578384fd5b6157a98888615034565b955060208088013567ffffffffffffffff808211156157c6578687fd5b6157d28b838c01614e38565b975060408a01359150808211156157e7578687fd5b6157f38b838c01614dc1565b96506158028b60608c016150f9565b955060e08a0135915080821115615817578485fd5b508801601f81018a13615828578384fd5b8035615836614ddf82615f04565b81815283810190838501858402850186018e1015615852578788fd5b8794505b83851015615874578035835260019490940193918501918501615856565b50809650505050505061010087013590509295509295509295565b60008060008060e085870312156158a4578182fd5b843567ffffffffffffffff808211156158bb578384fd5b9086019060c082890312156158ce578384fd5b6158d860c0615edd565b823581526158e98960208501615034565b602082015260408301356158fc81615f5a565b604082015261590e8960608501614db6565b60608201526080830135608082015260a08301358281111561592e578586fd5b61593a8a828601614fc0565b60a08301525080965050505061595386602087016150f9565b939693955050505060a08201359160c0013590565b600060208284031215615979578081fd5b5051919050565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156159c55781516001600160a01b0316875295820195908201906001016159a0565b509495945050505050565b6000815180845260208085019450808401835b838110156159c5578151875295820195908201906001016159e3565b60008151808452615a17816020860160208601615f24565b601f01601f19169290920160200192915050565b6000610120825160028110615a3c57fe5b808552506020830151615a526020860182615980565b506040830151615a656040860182615980565b50606083015160608501526080830151608085015260a083015160a085015260c0830151615a9660c0860182615980565b5060e0830151615aa960e0860182615980565b506101008084015182828701526112a6838701826159ff565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b60008251615afc818460208701615f24565b9190910192915050565b6bffffffffffffffffffffffff19606093841b811682529190921b16601482015260280190565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b038316815260408101615bb483615f50565b8260208301529392505050565b6001600160a01b03929092168252602082015260400190565b6000602082526116f2602083018461598d565b600060408252615c00604083018561598d565b828103602084810191909152845180835285820192820190845b81811015615c3f5784516001600160a01b031683529383019391830191600101615c1a565b5090979650505050505050565b600060608252615c5f606083018661598d565b8281036020840152615c7181866159d0565b905082810360408401526112a681856159d0565b600060808252615c98608083018761598d565b8281036020840152615caa81876159d0565b90508281036040840152615cbe81866159d0565b90508281036060840152614c0881856159ff565b600060608252615ce5606083018661598d565b8281036020840152615cf781866159d0565b915050826040830152949350505050565b6000602082526116f260208301846159d0565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b60008882526001600160a01b03808916602084015280881660408401525060e06060830152615d9860e08301876159d0565b8560808401528460a084015282810360c0840152615db681856159ff565b9a9950505050505050505050565b94855260208501939093526001600160a01b039190911660408401526060830152608082015260a00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b93845260ff9290921660208401526040830152606082015260800190565b60208101615e4783615f50565b91905290565b918252602082015260400190565b600060808252615e6e6080830187615a2b565b8281036020840152615e8081876159d0565b604084019590955250506060015292915050565b600060608252615ea76060830186615a2b565b60208301949094525060400152919050565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60405181810167ffffffffffffffff81118282101715615efc57600080fd5b604052919050565b600067ffffffffffffffff821115615f1a578081fd5b5060209081020190565b60005b83811015615f3f578181015183820152602001615f27565b83811115610e005750506000910152565b6003811061057e57fe5b6001600160a01b038116811461057e57600080fd5b801515811461057e57600080fd5b6003811061057e57600080fdfea2646970667358221220201e4f926e390fed8dd5318c58846af735c2bebc61b80693ae936a5fe76dcf1464736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-vault/index.ts b/balpy/balancer-deployments/tasks/20210418-vault/index.ts new file mode 100644 index 0000000..7180a20 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-vault/index.ts @@ -0,0 +1,17 @@ +import { VaultDeployment } from './input'; +import { Task, TaskRunOptions } from '@src'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as VaultDeployment; + const vaultArgs = [input.Authorizer, input.WETH, input.pauseWindowDuration, input.bufferPeriodDuration]; + const vault = await task.deployAndVerify('Vault', vaultArgs, from, force); + + // The vault automatically also deploys the protocol fees collector: we must verify it + const feeCollector = await vault.getProtocolFeesCollector(); + const feeCollectorArgs = [vault.address]; // See ProtocolFeesCollector constructor + await task.verify('ProtocolFeesCollector', feeCollector, feeCollectorArgs); + await task.save({ ProtocolFeesCollector: feeCollector }); + + const helpersArgs = [vault.address]; + await task.deployAndVerify('BalancerHelpers', helpersArgs, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20210418-vault/input.ts b/balpy/balancer-deployments/tasks/20210418-vault/input.ts new file mode 100644 index 0000000..a18798a --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-vault/input.ts @@ -0,0 +1,19 @@ +import { Task, TaskMode } from '@src'; +import { MONTH } from '@helpers/time'; + +export type VaultDeployment = { + Authorizer: string; + WETH: string; + pauseWindowDuration: number; + bufferPeriodDuration: number; +}; + +const Authorizer = new Task('20210418-authorizer', TaskMode.READ_ONLY); +const WETH = new Task('00000000-tokens', TaskMode.READ_ONLY); + +export default { + Authorizer, + pauseWindowDuration: 3 * MONTH, + bufferPeriodDuration: MONTH, + WETH, +}; diff --git a/balpy/balancer-deployments/tasks/20210418-vault/output/arbitrum.json b/balpy/balancer-deployments/tasks/20210418-vault/output/arbitrum.json new file mode 100644 index 0000000..c48edd4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-vault/output/arbitrum.json @@ -0,0 +1,5 @@ +{ + "Vault": "0xBA12222222228d8Ba445958a75a0704d566BF2C8", + "BalancerHelpers": "0x77d46184d22CA6a3726a2F500c776767b6A3d6Ab", + "ProtocolFeesCollector": "0xce88686553686DA562CE7Cea497CE749DA109f9F" +} diff --git a/balpy/balancer-deployments/tasks/20210418-vault/output/avalanche.json b/balpy/balancer-deployments/tasks/20210418-vault/output/avalanche.json new file mode 100644 index 0000000..475c158 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-vault/output/avalanche.json @@ -0,0 +1,5 @@ +{ + "Vault": "0xBA12222222228d8Ba445958a75a0704d566BF2C8", + "ProtocolFeesCollector": "0xce88686553686DA562CE7Cea497CE749DA109f9F", + "BalancerHelpers": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-vault/output/base.json b/balpy/balancer-deployments/tasks/20210418-vault/output/base.json new file mode 100644 index 0000000..475c158 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-vault/output/base.json @@ -0,0 +1,5 @@ +{ + "Vault": "0xBA12222222228d8Ba445958a75a0704d566BF2C8", + "ProtocolFeesCollector": "0xce88686553686DA562CE7Cea497CE749DA109f9F", + "BalancerHelpers": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-vault/output/bsc.json b/balpy/balancer-deployments/tasks/20210418-vault/output/bsc.json new file mode 100644 index 0000000..5041d78 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-vault/output/bsc.json @@ -0,0 +1,5 @@ +{ + "Vault": "0xBA12222222228d8Ba445958a75a0704d566BF2C8", + "ProtocolFeesCollector": "0xce88686553686DA562CE7Cea497CE749DA109f9F", + "BalancerHelpers": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9" +} diff --git a/balpy/balancer-deployments/tasks/20210418-vault/output/fantom.json b/balpy/balancer-deployments/tasks/20210418-vault/output/fantom.json new file mode 100644 index 0000000..3c0e2b7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-vault/output/fantom.json @@ -0,0 +1,5 @@ +{ + "Vault": "0x20dd72Ed959b6147912C2e529F0a0C651c33c9ce", + "ProtocolFeesCollector": "0xC6920d3a369E7c8BD1A22DbE385e11d1F7aF948F", + "BalancerHelpers": "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-vault/output/gnosis.json b/balpy/balancer-deployments/tasks/20210418-vault/output/gnosis.json new file mode 100644 index 0000000..475c158 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-vault/output/gnosis.json @@ -0,0 +1,5 @@ +{ + "Vault": "0xBA12222222228d8Ba445958a75a0704d566BF2C8", + "ProtocolFeesCollector": "0xce88686553686DA562CE7Cea497CE749DA109f9F", + "BalancerHelpers": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-vault/output/goerli.json b/balpy/balancer-deployments/tasks/20210418-vault/output/goerli.json new file mode 100644 index 0000000..fd2d341 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-vault/output/goerli.json @@ -0,0 +1,5 @@ +{ + "Vault": "0xBA12222222228d8Ba445958a75a0704d566BF2C8", + "BalancerHelpers": "0x5aDDCCa35b7A0D07C74063c48700C8590E87864E", + "ProtocolFeesCollector": "0xce88686553686DA562CE7Cea497CE749DA109f9F" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-vault/output/kovan.json b/balpy/balancer-deployments/tasks/20210418-vault/output/kovan.json new file mode 100644 index 0000000..db37909 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-vault/output/kovan.json @@ -0,0 +1,5 @@ +{ + "Vault": "0xBA12222222228d8Ba445958a75a0704d566BF2C8", + "BalancerHelpers": "0x94905e703fEAd7f0fD0eEe355D267eE909784e6d", + "ProtocolFeesCollector": "0xce88686553686DA562CE7Cea497CE749DA109f9F" +} diff --git a/balpy/balancer-deployments/tasks/20210418-vault/output/mainnet.json b/balpy/balancer-deployments/tasks/20210418-vault/output/mainnet.json new file mode 100644 index 0000000..609ec8f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-vault/output/mainnet.json @@ -0,0 +1,5 @@ +{ + "Vault": "0xBA12222222228d8Ba445958a75a0704d566BF2C8", + "BalancerHelpers": "0x5aDDCCa35b7A0D07C74063c48700C8590E87864E", + "ProtocolFeesCollector": "0xce88686553686DA562CE7Cea497CE749DA109f9F" +} diff --git a/balpy/balancer-deployments/tasks/20210418-vault/output/mode.json b/balpy/balancer-deployments/tasks/20210418-vault/output/mode.json new file mode 100644 index 0000000..7d00be8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-vault/output/mode.json @@ -0,0 +1,6 @@ +{ + "Vault": "0xBA12222222228d8Ba445958a75a0704d566BF2C8", + "BalancerHelpers": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9", + "ProtocolFeesCollector": "0xce88686553686DA562CE7Cea497CE749DA109f9F" +} + \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-vault/output/optimism.json b/balpy/balancer-deployments/tasks/20210418-vault/output/optimism.json new file mode 100644 index 0000000..9ac5883 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-vault/output/optimism.json @@ -0,0 +1,5 @@ +{ + "Vault": "0xBA12222222228d8Ba445958a75a0704d566BF2C8", + "BalancerHelpers": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9", + "ProtocolFeesCollector": "0xce88686553686DA562CE7Cea497CE749DA109f9F" +} diff --git a/balpy/balancer-deployments/tasks/20210418-vault/output/polygon.json b/balpy/balancer-deployments/tasks/20210418-vault/output/polygon.json new file mode 100644 index 0000000..e93f3a7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-vault/output/polygon.json @@ -0,0 +1,5 @@ +{ + "Vault": "0xBA12222222228d8Ba445958a75a0704d566BF2C8", + "BalancerHelpers": "0x239e55F427D44C3cc793f49bFB507ebe76638a2b", + "ProtocolFeesCollector": "0xce88686553686DA562CE7Cea497CE749DA109f9F" +} diff --git a/balpy/balancer-deployments/tasks/20210418-vault/output/rinkeby.json b/balpy/balancer-deployments/tasks/20210418-vault/output/rinkeby.json new file mode 100644 index 0000000..f1027a1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-vault/output/rinkeby.json @@ -0,0 +1,4 @@ +{ + "Vault": "0xBA12222222228d8Ba445958a75a0704d566BF2C8", + "BalancerHelpers": "0x5aDDCCa35b7A0D07C74063c48700C8590E87864E" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-vault/output/sepolia.json b/balpy/balancer-deployments/tasks/20210418-vault/output/sepolia.json new file mode 100644 index 0000000..f299607 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-vault/output/sepolia.json @@ -0,0 +1,5 @@ +{ + "Vault": "0xBA12222222228d8Ba445958a75a0704d566BF2C8", + "ProtocolFeesCollector": "0xce88686553686DA562CE7Cea497CE749DA109f9F", + "BalancerHelpers": "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-vault/output/zkevm.json b/balpy/balancer-deployments/tasks/20210418-vault/output/zkevm.json new file mode 100644 index 0000000..475c158 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-vault/output/zkevm.json @@ -0,0 +1,5 @@ +{ + "Vault": "0xBA12222222228d8Ba445958a75a0704d566BF2C8", + "ProtocolFeesCollector": "0xce88686553686DA562CE7Cea497CE749DA109f9F", + "BalancerHelpers": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210418-vault/readme.md b/balpy/balancer-deployments/tasks/20210418-vault/readme.md new file mode 100644 index 0000000..21c5ef9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210418-vault/readme.md @@ -0,0 +1,24 @@ +# 2021-04-18 Vault + +Deployment of the Vault, Balancer V2's core contract. + +Note that the Authorizer used in the Vault's original deployment may change over time: the current Authorizer should be retrieved by calling `vault.getAuthorizer()` instead. + +Aditionally, the `WETH` argument may represent different things in different network: on Ethereum mainnet it is the [`WETH` contract](https://etherscan.io/address/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2), whereas e.g. in Polygon mainnet it is the [`WMATIC` contract](https://polygonscan.com/address/0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270). + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Fantom mainnet addresses](./output/fantom.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`Vault` artifact](./artifact/Vault.json) +- [`BalancerHelpers` artifact](./artifact/BalancerHelpers.json) diff --git a/balpy/balancer-deployments/tasks/20210812-wsteth-rate-provider/artifact/WstETHRateProvider.json b/balpy/balancer-deployments/tasks/20210812-wsteth-rate-provider/artifact/WstETHRateProvider.json new file mode 100644 index 0000000..e6f7b58 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210812-wsteth-rate-provider/artifact/WstETHRateProvider.json @@ -0,0 +1,48 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "WstETHRateProvider", + "sourceName": "contracts/WstETHRateProvider.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IwstETH", + "name": "_wstETH", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "getRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "wstETH", + "outputs": [ + { + "internalType": "contract IwstETH", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a060405234801561001057600080fd5b506040516101e33803806101e38339818101604052602081101561003357600080fd5b5051606081901b6001600160601b0319166080526001600160a01b031661017961006a600039806088528060ae52506101796000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80634aa07e641461003b578063679aefce1461006c575b600080fd5b610043610086565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6100746100aa565b60408051918252519081900360200190f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663035faf826040518163ffffffff1660e01b815260040160206040518083038186803b15801561011257600080fd5b505afa158015610126573d6000803e3d6000fd5b505050506040513d602081101561013c57600080fd5b505190509056fea2646970667358221220ea76cab9de832dbe7dd8e95e2f7455ec90d1a6e7f91a1e03ec840a8393d33dbc64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80634aa07e641461003b578063679aefce1461006c575b600080fd5b610043610086565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6100746100aa565b60408051918252519081900360200190f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663035faf826040518163ffffffff1660e01b815260040160206040518083038186803b15801561011257600080fd5b505afa158015610126573d6000803e3d6000fd5b505050506040513d602081101561013c57600080fd5b505190509056fea2646970667358221220ea76cab9de832dbe7dd8e95e2f7455ec90d1a6e7f91a1e03ec840a8393d33dbc64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20210812-wsteth-rate-provider/index.ts b/balpy/balancer-deployments/tasks/20210812-wsteth-rate-provider/index.ts new file mode 100644 index 0000000..7531e1a --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210812-wsteth-rate-provider/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { WstETHRateProviderDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as WstETHRateProviderDeployment; + + const rateProviderArgs = [input.wstETH]; + await task.deployAndVerify('WstETHRateProvider', rateProviderArgs, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20210812-wsteth-rate-provider/input.ts b/balpy/balancer-deployments/tasks/20210812-wsteth-rate-provider/input.ts new file mode 100644 index 0000000..02b3443 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210812-wsteth-rate-provider/input.ts @@ -0,0 +1,15 @@ +export type WstETHRateProviderDeployment = { + wstETH: string; +}; + +export default { + mainnet: { + wstETH: '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0', + }, + kovan: { + wstETH: '0xA387B91e393cFB9356A460370842BC8dBB2F29aF', + }, + goerli: { + wstETH: '0x6320cD32aA674d2898A68ec82e869385Fc5f7E2f', + }, +}; diff --git a/balpy/balancer-deployments/tasks/20210812-wsteth-rate-provider/output/goerli.json b/balpy/balancer-deployments/tasks/20210812-wsteth-rate-provider/output/goerli.json new file mode 100644 index 0000000..9248026 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210812-wsteth-rate-provider/output/goerli.json @@ -0,0 +1,3 @@ +{ + "WstETHRateProvider": "0x80a94F458491CA88F09767E58a92FD23Cbf1196F" +} diff --git a/balpy/balancer-deployments/tasks/20210812-wsteth-rate-provider/output/kovan.json b/balpy/balancer-deployments/tasks/20210812-wsteth-rate-provider/output/kovan.json new file mode 100644 index 0000000..34d1ac3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210812-wsteth-rate-provider/output/kovan.json @@ -0,0 +1,3 @@ +{ + "WstETHRateProvider": "0xD7FAD3bd59D6477cbe1BE7f646F7f1BA25b230f8" +} diff --git a/balpy/balancer-deployments/tasks/20210812-wsteth-rate-provider/output/mainnet.json b/balpy/balancer-deployments/tasks/20210812-wsteth-rate-provider/output/mainnet.json new file mode 100644 index 0000000..9abca31 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210812-wsteth-rate-provider/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "WstETHRateProvider": "0x72D07D7DcA67b8A406aD1Ec34ce969c90bFEE768" +} diff --git a/balpy/balancer-deployments/tasks/20210812-wsteth-rate-provider/readme.md b/balpy/balancer-deployments/tasks/20210812-wsteth-rate-provider/readme.md new file mode 100644 index 0000000..b96eac7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20210812-wsteth-rate-provider/readme.md @@ -0,0 +1,9 @@ +# 2021-08-12 - WstETH Rate Provider + +Deployment of the `WstETHRateProvider`, for using wstETH in Meta Stable Pools. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`WstETHRateProvider` artifact](./artifact/WstETHRateProvider.json) diff --git a/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/artifact/NoProtocolFeeLiquidityBootstrappingPoolFactory.json b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/artifact/NoProtocolFeeLiquidityBootstrappingPoolFactory.json new file mode 100644 index 0000000..3fcb840 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/artifact/NoProtocolFeeLiquidityBootstrappingPoolFactory.json @@ -0,0 +1,210 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "NoProtocolFeeLiquidityBootstrappingPoolFactory", + "sourceName": "contracts/smart/NoProtocolFeeLiquidityBootstrappingPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "weights", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "bool", + "name": "swapEnabledOnStart", + "type": "bool" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101606040523480156200001257600080fd5b506040516200711b3803806200711b8339810160408190526200003591620001c8565b80604051806020016200004890620001ba565b601f1982820381018352601f90910116604052306080528051819060006002820460c0819052808303610100819052818552909150836200009581620000fe602090811b620003b417901c565b60601b6001600160601b03191660a0528285018051838252620000c482620000fe602090811b620003b417901c565b6001600160601b0319606091821b811660e0529690935290529590951b90911661012052505050426276a700016101405250620001f89050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506200014c6001600160a01b03831615156101ac62000152565b50919050565b816200016357620001638162000167565b5050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b616086806200109583390190565b600060208284031215620001da578081fd5b81516001600160a01b0381168114620001f1578182fd5b9392505050565b60805160a05160601c60c05160e05160601c610100516101205160601c61014051610e316200026460003980610249528061027252508061039252508061041b5250806101ad528061049752508061043c52508061018c52806104735250806103425250610e316000f3fe608060405234801561001057600080fd5b50600436106100a25760003560e01c80632f2770db116100765780636c57f5a91161005b5780636c57f5a91461013b578063851c1bb3146101435780638d928af814610163576100a2565b80632f2770db146101115780636634b7531461011b576100a2565b8062c194db146100a7578063174481fa146100c557806323679719146100db5780632da47c40146100fb575b600080fd5b6100af61016b565b6040516100bc9190610c73565b60405180910390f35b6100cd61018a565b6040516100bc929190610c0c565b6100ee6100e9366004610a23565b6101d0565b6040516100bc9190610beb565b610103610243565b6040516100bc929190610d5d565b6101196102ad565b005b61012e61012936600461098f565b61030a565b6040516100bc9190610c33565b61012e610335565b6101566101513660046109c7565b61033e565b6040516100bc9190610c3e565b6100ee610390565b606061018560405180602001604052806000815250610413565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b6001546000906101e59060ff161560d36104ec565b6000806101f0610243565b915091506102356101ff610390565b8b8b8b8b8b88888d8d6040516020016102219a99989796959493929190610c86565b6040516020818303038152906040526104fe565b9a9950505050505050505050565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561029f57807f000000000000000000000000000000000000000000000000000000000000000003925062278d0091506102a8565b60009250600091505b509091565b6102b5610589565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b60015460ff1690565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610373929190610bbb565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061040d73ffffffffffffffffffffffffffffffffffffffff831615156101ac6104ec565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016104de8183866105d2565b505050505050505050919050565b816104fa576104fa8161064c565b5050565b60008061050a836106b9565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b60006105b86000357fffffffff000000000000000000000000000000000000000000000000000000001661033e565b90506105cf6105c78233610701565b6101916104ec565b50565b5b602081106106105781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016105d3565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600060606106c683610413565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff81166106fa573d6000803e3d6000fd5b9392505050565b600061070b610390565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561075057600080fd5b505afa158015610764573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107889190610a07565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b81526004016107c493929190610c47565b60206040518083038186803b1580156107dc57600080fd5b505afa1580156107f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081491906109ab565b90505b92915050565b803561081781610dcb565b600082601f830112610838578081fd5b813561084b61084682610d92565b610d6b565b81815291506020808301908481018184028601820187101561086c57600080fd5b60005b8481101561089457813561088281610dcb565b8452928201929082019060010161086f565b505050505092915050565b600082601f8301126108af578081fd5b81356108bd61084682610d92565b8181529150602080830190848101818402860182018710156108de57600080fd5b60005b84811015610894578135845292820192908201906001016108e1565b803561081781610ded565b600082601f830112610918578081fd5b813567ffffffffffffffff81111561092e578182fd5b61095f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610d6b565b915080825283602082850101111561097657600080fd5b8060208401602084013760009082016020015292915050565b6000602082840312156109a0578081fd5b81356106fa81610dcb565b6000602082840312156109bc578081fd5b81516106fa81610ded565b6000602082840312156109d8578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146106fa578182fd5b600060208284031215610a18578081fd5b81516106fa81610dcb565b600080600080600080600060e0888a031215610a3d578283fd5b873567ffffffffffffffff80821115610a54578485fd5b610a608b838c01610908565b985060208a0135915080821115610a75578485fd5b610a818b838c01610908565b975060408a0135915080821115610a96578485fd5b610aa28b838c01610828565b965060608a0135915080821115610ab7578485fd5b50610ac48a828b0161089f565b94505060808801359250610adb8960a08a0161081d565b9150610aea8960c08a016108fd565b905092959891949750929550565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208085019450808401835b83811015610b4157815187529582019590820190600101610b25565b509495945050505050565b15159052565b60008151808452815b81811015610b7757602081850181015186830182015201610b5b565b81811115610b885782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b6000602082526108146020830184610b52565b600061014073ffffffffffffffffffffffffffffffffffffffff8d16835260208181850152610cb78285018e610b52565b91508382036040850152610ccb828d610b52565b84810360608601528b51808252828d01935090820190845b81811015610d0757610cf58551610db2565b83529383019391830191600101610ce3565b50508481036080860152610d1b818c610b12565b93505050508660a08301528560c08301528460e0830152610d40610100830185610af8565b610d4e610120830184610b4c565b9b9a5050505050505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610d8a57600080fd5b604052919050565b600067ffffffffffffffff821115610da8578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff811681146105cf57600080fd5b80151581146105cf57600080fdfea2646970667358221220c36e9fd0abdd6de45fc245d638cd075eb7c99ceea829eba32c1028982f902aeb64736f6c634300070100336102e06040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b5060405162006086380380620060868339810160408190526200005a9162000d5c565b89898989898989898989898989898a516001600160401b03811180156200008057600080fd5b50604051908082528060200260200182016040528015620000ab578160200160208202803683370190505b5089898989888651600214620000c3576001620000c6565b60025b8989898989898989828289898180604051806040016040528060018152602001603160f81b815250848489336001600160a01b031660001b806080818152505050806001600160a01b031660a0816001600160a01b031660601b815250505081600390805190602001906200013d92919062000b14565b5080516200015390600490602084019062000b14565b50506005805460ff1916601217905550815160209283012060c052805191012060e05250507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6101005250620001b26276a70083111561019462000525565b620001c662278d0082111561019562000525565b4290910161014081905201610160528551620001e8906002111560c862000525565b62000202620001f66200053a565b8751111560c962000525565b62000218866200053f60201b62000e971760201c565b62000223846200054b565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f9062000254908d9060040162000f71565b602060405180830381600087803b1580156200026f57600080fd5b505af115801562000284573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002aa919062000d43565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002df9084908b908b9060040162000ed5565b600060405180830381600087803b158015620002fa57600080fd5b505af11580156200030f573d6000803e3d6000fd5b505050508a6001600160a01b0316610180816001600160a01b031660601b81525050806101a0818152505050505050505050505050505050505050505050506001600a8190555060008751905062000374818851620005d760201b62000ea11760201c565b6101c0819052875188906000906200038857fe5b60200260200101516001600160a01b03166101e0816001600160a01b031660601b8152505087600181518110620003bb57fe5b60200260200101516001600160a01b0316610200816001600160a01b031660601b8152505060028111620003f157600062000408565b87600281518110620003ff57fe5b60200260200101515b60601b6001600160601b03191661022052600381116200042a57600062000441565b876003815181106200043857fe5b60200260200101515b6001600160a01b0316610240816001600160a01b031660601b8152505062000484886000815181106200047057fe5b6020026020010151620005e660201b60201c565b6102605287516200049d90899060019081106200047057fe5b6102805260028111620004b2576000620004c4565b620004c4886002815181106200047057fe5b6102a05260038111620004d9576000620004eb565b620004eb886003815181106200047057fe5b6102c05242620004fe81808a8062000692565b620005098362000820565b5050505050505050505050505050505050505050505062001038565b816200053657620005368162000874565b5050565b600490565b806200053681620008c7565b6200056064e8d4a5100082101560cb62000525565b6200057867016345785d8a000082111560ca62000525565b620005978160c06008546200095460201b62000eae179092919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90620005cc90839062000f86565b60405180910390a150565b62000536828214606762000525565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200062357600080fd5b505afa15801562000638573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200065e919062000e6b565b60ff16905060006200067d6012836200096960201b62000ec41760201c565b600a0a670de0b6b3a764000002949350505050565b600b546000805b835181101562000783576000848281518110620006b257fe5b60200260200101519050620006da662386f26fc1000082101561012e6200052560201b60201c565b6200075b620006f4826200098660201b62000eda1760201c565b8360100260800162000746620007298a87815181106200071057fe5b6020026020010151620009c760201b62000efa1760201c565b86601f0260040189620009f460201b62000f16179092919060201c565b62000a0660201b62000f28179092919060201c565b935062000777818462000a1660201b62000f381790919060201c565b92505060010162000699565b506200079c670de0b6b3a7640000821461013462000525565b620007d58560e0620007c08960c08762000a3160201b62000f4a179092919060201c565b62000a3160201b62000f4a179092919060201c565b600b556040517f0f3631f9dab08169d1db21c6dc5f32536fb2b0a6b9bb5330d71c52132f968be0906200081090889088908890889062000f8f565b60405180910390a1505050505050565b6200083f816000600b5462000a4360201b62000f5c179092919060201c565b600b556040517f5a9e84f78f7957cb4ed7478eb0fcad35ee4ecbe2e0f298420b28a3955392573f90620005cc90839062000eca565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600281511015620008d85762000951565b600081600081518110620008e857fe5b602002602001015190506000600190505b82518110156200094e5760008382815181106200091257fe5b6020026020010151905062000943816001600160a01b0316846001600160a01b03161060656200052560201b60201c565b9150600101620008f9565b50505b50565b6001600160401b03811b1992909216911b1790565b60006200097b83831115600162000525565b508082035b92915050565b600062000980670de0b6b3a7640000620009b361ffff80168562000a6c60201b62000f831790919060201c565b62000ac160201b62000fef1790919060201c565b600062000980670de0b6b3a7640000620009b3637fffffff8562000a6c60201b62000f831790919060201c565b637fffffff811b1992909216911b1790565b61ffff811b1992909216911b1790565b600082820162000a2a848210158362000525565b9392505050565b63ffffffff811b1992909216911b1790565b60006001821b198416828462000a5b57600062000a5e565b60015b60ff16901b17949350505050565b600082820262000a9484158062000a8c57508385838162000a8957fe5b04145b600362000525565b8062000aa557600091505062000980565b670de0b6b3a764000060001982015b0460010191505062000980565b600062000ad2821515600462000525565b8262000ae15750600062000980565b670de0b6b3a76400008381029062000b079085838162000afd57fe5b0414600562000525565b82600182038162000ab457fe5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000b5757805160ff191683800117855562000b87565b8280016001018555821562000b87579182015b8281111562000b8757825182559160200191906001019062000b6a565b5062000b9592915062000b99565b5090565b5b8082111562000b95576000815560010162000b9a565b8051620009808162001022565b600082601f83011262000bce578081fd5b815162000be562000bdf8262000ff6565b62000fcf565b81815291506020808301908481018184028601820187101562000c0757600080fd5b60005b8481101562000c3357815162000c208162001022565b8452928201929082019060010162000c0a565b505050505092915050565b600082601f83011262000c4f578081fd5b815162000c6062000bdf8262000ff6565b81815291506020808301908481018184028601820187101562000c8257600080fd5b60005b8481101562000c335781518452928201929082019060010162000c85565b805180151581146200098057600080fd5b600082601f83011262000cc5578081fd5b81516001600160401b0381111562000cdb578182fd5b602062000cf1601f8301601f1916820162000fcf565b9250818352848183860101111562000d0857600080fd5b60005b8281101562000d2857848101820151848201830152810162000d0b565b8281111562000d3a5760008284860101525b50505092915050565b60006020828403121562000d55578081fd5b5051919050565b6000806000806000806000806000806101408b8d03121562000d7c578586fd5b62000d888c8c62000bb0565b60208c0151909a506001600160401b038082111562000da5578788fd5b62000db38e838f0162000cb4565b9a5060408d015191508082111562000dc9578788fd5b62000dd78e838f0162000cb4565b995060608d015191508082111562000ded578788fd5b62000dfb8e838f0162000bbd565b985060808d015191508082111562000e11578788fd5b5062000e208d828e0162000c3e565b96505060a08b0151945060c08b0151935060e08b0151925062000e488c6101008d0162000bb0565b915062000e5a8c6101208d0162000ca3565b90509295989b9194979a5092959850565b60006020828403121562000e7d578081fd5b815160ff8116811462000a2a578182fd5b6000815180845260208085019450808401835b8381101562000ebf5781518752958201959082019060010162000ea1565b509495945050505050565b901515815260200190565b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000f215762000f0e855162001016565b8352938301939183019160010162000ef9565b505084810360408601528551808252908201925081860190845b8181101562000f635762000f50835162001016565b8552938301939183019160010162000f3b565b509298975050505050505050565b602081016003831062000f8057fe5b91905290565b90815260200190565b60008582528460208301526080604083015262000fb0608083018562000e8e565b828103606084015262000fc4818562000e8e565b979650505050505050565b6040518181016001600160401b038111828210171562000fee57600080fd5b604052919050565b60006001600160401b038211156200100c578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146200095157600080fd5b60805160a05160601c60c05160e051610100516101205161014051610160516101805160601c6101a0516101c0516101e05160601c6102005160601c6102205160601c6102405160601c61026051610280516102a0516102c051614f486200113e6000398061131c5280611f1e5250806112d95280611ebd5250806112965280611e5c5250806112455280611dfb525080611ee35280612e89525080611e825280612e47525080611e215280612e05525080611dc05280612dc3525080611580525080610716525080610a355250806111c75250806111a3525080610d1252508061144c52508061148e52508061146d525080610a1152508061099b5250614f486000f3fe608060405234801561001057600080fd5b50600436106102925760003560e01c806374f3b009116101605780639d2c110c116100d8578063d505accf1161008c578063dd62ed3e11610071578063dd62ed3e14610508578063e01af92c1461051b578063f89f27ed1461052e57610292565b8063d505accf146104e2578063d5c096c4146104f557610292565b8063a9059cbb116100bd578063a9059cbb146104bf578063aaabadc5146104d2578063c0ff1a15146104da57610292565b80639d2c110c14610499578063a457c2d7146104ac57610292565b806387ec68171161012f5780638d928af8116101145780638d928af81461048157806395d89b41146104895780639b02cdde1461049157610292565b806387ec681714610459578063893d20e81461046c57610292565b806374f3b009146103fb5780637beed2201461041c5780637ecebe0014610433578063851c1bb31461044657610292565b806338e9922e1161020e57806350dd6ed9116101c25780636028bfd4116101a75780636028bfd4146103bf578063679aefce146103e057806370a08231146103e857610292565b806350dd6ed9146103a457806355c67628146103b757610292565b806339509351116101f357806339509351146103765780633e5692051461038957806347bc4d921461039c57610292565b806338e9922e1461035b57806338fff2d01461036e57610292565b80631c0de0511161026557806323b872dd1161024a57806323b872dd1461032b578063313ce5671461033e5780633644e5151461035357610292565b80631c0de051146102ff5780631dd746ea1461031657610292565b806306fdde0314610297578063095ea7b3146102b557806316c38b3c146102d557806318160ddd146102ea575b600080fd5b61029f610536565b6040516102ac9190614e11565b60405180910390f35b6102c86102c33660046146a8565b6105eb565b6040516102ac9190614d18565b6102e86102e336600461479f565b610602565b005b6102f2610616565b6040516102ac9190614d3b565b61030761061c565b6040516102ac93929190614d23565b61031e610645565b6040516102ac9190614ce0565b6102c86103393660046145f3565b610654565b6103466106e8565b6040516102ac9190614e8d565b6102f26106f1565b6102e8610369366004614b2b565b6106fb565b6102f2610714565b6102c86103843660046146a8565b610738565b6102e8610397366004614b43565b610773565b6102c86107da565b6102e86103b23660046148d6565b6107ea565b6102f2610808565b6103d26103cd3660046147d7565b610819565b6040516102ac929190614e24565b6102f2610850565b6102f26103f636600461459f565b61087b565b61040e6104093660046147d7565b61089a565b6040516102ac929190614cf3565b6104246108bd565b6040516102ac93929190614e3d565b6102f261044136600461459f565b61097c565b6102f261045436600461487a565b610997565b6103d26104673660046147d7565b6109e9565b610474610a0f565b6040516102ac9190614ccc565b610474610a33565b61029f610a57565b6102f2610ad6565b6102f26104a7366004614a2f565b610adc565b6102c86104ba3660046146a8565b610bc3565b6102c86104cd3660046146a8565b610c01565b610474610c0e565b6102f2610c18565b6102e86104f0366004614633565b610cdd565b61040e6105033660046147d7565b610e26565b6102f26105163660046145bb565b610e39565b6102e861052936600461479f565b610e64565b61031e610e8d565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105e05780601f106105b5576101008083540402835291602001916105e0565b820191906000526020600020905b8154815290600101906020018083116105c357829003601f168201915b505050505090505b90565b60006105f833848461103a565b5060015b92915050565b61060a6110a2565b610613816110e8565b50565b60025490565b6000806000610629611184565b1592506106346111a1565b915061063e6111c5565b9050909192565b606061064f6111e9565b905090565b6000806106618533610e39565b9050610685336001600160a01b038716148061067d5750838210155b61019e61135a565b610690858585611368565b336001600160a01b038616148015906106c957507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114155b156106db576106db853385840361103a565b60019150505b9392505050565b60055460ff1690565b600061064f611448565b6107036110a2565b61070b6114e5565b610613816114fa565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916105f891859061076e9086610f38565b61103a565b61077b6110a2565b6107836114e5565b61078b611565565b61079d61079661157e565b8251610ea1565b426107a881856115a2565b93506107b98385111561014661135a565b6107cc84846107c66115b9565b856116cd565b506107d56117e2565b505050565b600b5460009061064f90826117e9565b6107f26110a2565b6107fa6114e5565b61080482826117f3565b5050565b60085460009061064f9060c061190b565b6000606061082f865161082a61157e565b610ea1565b610844898989898989896119196119e9611a4a565b97509795505050505050565b600061064f61085d610616565b610875610868610c18565b61087061157e565b611bda565b90611bf4565b6001600160a01b0381166000908152602081905260409020545b919050565b6060806108ad8989898989600089611c3c565b9150915097509795505050505050565b600b5460009081906060906108d38160c0611cdf565b93506108e08160e0611cdf565b925060006108ec61157e565b90508067ffffffffffffffff8111801561090557600080fd5b5060405190808252806020026020018201604052801561092f578160200160208202803683370190505b50925060005b81811015610974576109556109508460806010850201611ce9565b611cf1565b84828151811061096157fe5b6020908102919091010152600101610935565b505050909192565b6001600160a01b031660009081526006602052604090205490565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016109cc929190614c56565b604051602081830303815290604052805190602001209050919050565b600060606109fa865161082a61157e565b61084489898989898989611d0b611d5b611a4a565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105e05780601f106105b5576101008083540402835291602001916105e0565b60095490565b600080610aec8560200151611dbc565b90506000610afd8660400151611dbc565b9050600086516001811115610b0e57fe5b1415610b7457610b218660600151611f4d565b6060870152610b308583611f6e565b9450610b3c8482611f6e565b9350610b4c866060015183611f6e565b60608701526000610b5e878787611f7a565b9050610b6a8183611fa2565b93505050506106e1565b610b7e8583611f6e565b9450610b8a8482611f6e565b9350610b9a866060015182611f6e565b60608701526000610bac878787611fae565b9050610bb88184611fc6565b9050610b6a81611fd2565b600080610bd03385610e39565b9050808310610bea57610be53385600061103a565b610bf7565b610bf7338585840361103a565b5060019392505050565b60006105f8338484611368565b600061064f611ff8565b60006060610c24610a33565b6001600160a01b031663f94d4668610c3a610714565b6040518263ffffffff1660e01b8152600401610c569190614d3b565b60006040518083038186803b158015610c6e57600080fd5b505afa158015610c82573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610caa91908101906146d3565b50915050610cbf81610cba6111e9565b612072565b6060610cc96120d3565b509050610cd68183612151565b9250505090565b610ceb8442111560d161135a565b6001600160a01b0387166000908152600660209081526040808320549051909291610d42917f0000000000000000000000000000000000000000000000000000000000000000918c918c918c9188918d9101614d63565b6040516020818303038152906040528051906020012090506000610d65826121c3565b9050600060018288888860405160008152602001604052604051610d8c9493929190614df3565b6020604051602081039080840390855afa158015610dae573d6000803e3d6000fd5b5050604051601f1901519150610df090506001600160a01b03821615801590610de857508b6001600160a01b0316826001600160a01b0316145b6101f861135a565b6001600160a01b038b166000908152600660205260409020600185019055610e198b8b8b61103a565b5050505050505050505050565b6060806108ad89898989896000896121df565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610e6c6110a2565b610e746114e5565b610e7c611565565b610e8581612304565b6106136117e2565b606061064f6115b9565b8061080481612346565b610804818314606761135a565b67ffffffffffffffff811b1992909216911b1790565b6000610ed483831115600161135a565b50900390565b60006105fc670de0b6b3a7640000610ef48461ffff610f83565b90610fef565b60006105fc670de0b6b3a7640000610ef484637fffffff610f83565b637fffffff811b1992909216911b1790565b61ffff811b1992909216911b1790565b60008282016106e1848210158361135a565b63ffffffff811b1992909216911b1790565b60006001821b1984168284610f72576000610f75565b60015b60ff16901b17949350505050565b6000828202610fa7841580610fa0575083858381610f9d57fe5b04145b600361135a565b80610fb65760009150506105fc565b670de0b6b3a76400007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b046001019150506105fc565b6000610ffe821515600461135a565b8261100b575060006105fc565b670de0b6b3a76400008381029061102e9085838161102557fe5b0414600561135a565b826001820381610fe357fe5b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611095908590614d3b565b60405180910390a3505050565b60006110d16000357fffffffff0000000000000000000000000000000000000000000000000000000016610997565b90506106136110e082336123bf565b61019161135a565b8015611108576111036110f96111a1565b421061019361135a565b61111d565b61111d6111136111c5565b42106101a961135a565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611179908390614d18565b60405180910390a150565b600061118e6111c5565b42118061064f57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b606060006111f561157e565b905060608167ffffffffffffffff8111801561121057600080fd5b5060405190808252806020026020018201604052801561123a578160200160208202803683370190505b5090508115611282577f00000000000000000000000000000000000000000000000000000000000000008160008151811061127157fe5b60200260200101818152505061128b565b91506105e89050565b6001821115611282577f0000000000000000000000000000000000000000000000000000000000000000816001815181106112c257fe5b6020026020010181815250506002821115611282577f00000000000000000000000000000000000000000000000000000000000000008160028151811061130557fe5b6020026020010181815250506003821115611282577f00000000000000000000000000000000000000000000000000000000000000008160038151811061134857fe5b60200260200101818152505091505090565b8161080457610804816124af565b61137f6001600160a01b038416151561019861135a565b6113966001600160a01b038316151561019961135a565b6113a18383836107d5565b6001600160a01b0383166000908152602081905260409020546113c790826101a061251c565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546113f69082610f38565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611095908590614d3b565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006114b5612532565b306040516020016114ca959493929190614d97565b60405160208183030381529060405280519060200120905090565b6114f86114f0611184565b61019261135a565b565b61150d64e8d4a5100082101560cb61135a565b61152367016345785d8a000082111560ca61135a565b600854611532908260c0610eae565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611179908390614d3b565b6115776002600a54141561019061135a565b6002600a55565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000818310156115b257816106e1565b5090919050565b606060006115c561157e565b905060608167ffffffffffffffff811180156115e057600080fd5b5060405190808252806020026020018201604052801561160a578160200160208202803683370190505b50600b5490915061161c600082612536565b8260008151811061162957fe5b602002602001018181525050611640600182612536565b8260018151811061164d57fe5b602002602001018181525050826002141561166c575091506105e89050565b611677600282612536565b8260028151811061168457fe5b60200260200101818152505082600314156116a3575091506105e89050565b6116ae600382612536565b826003815181106116bb57fe5b60209081029190910101525091505090565b600b546000805b83518110156117695760008482815181106116eb57fe5b6020026020010151905061170b662386f26fc1000082101561012e61135a565b61175261171782610eda565b8360100260800161174b61173d8a878151811061173057fe5b6020026020010151610efa565b88906004601f890201610f16565b9190610f28565b935061175e8382610f38565b9250506001016116d4565b50611780670de0b6b3a7640000821461013461135a565b6117998560e0611792858a60c0610f4a565b9190610f4a565b600b556040517f0f3631f9dab08169d1db21c6dc5f32536fb2b0a6b9bb5330d71c52132f968be0906117d2908890889088908890614e5c565b60405180910390a1505050505050565b6001600a55565b1c60019081161490565b60006117fd610714565b90506000611809610a33565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b8152600401611836929190614ddc565b60806040518083038186803b15801561184e57600080fd5b505afa158015611862573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118869190614b91565b6040517f18e736d40000000000000000000000000000000000000000000000000000000081529094506001600160a01b03851693506318e736d492506118d3915085908790600401614dc3565b600060405180830381600087803b1580156118ed57600080fd5b505af1158015611901573d6000803e3d6000fd5b5050505050505050565b1c67ffffffffffffffff1690565b60006060806060600061192a6120d3565b91509150611936611184565b1561196e576000611947838c612151565b90506119598b8484600954858e61258c565b93506119688b85610ec461263b565b506119ba565b61197661157e565b67ffffffffffffffff8111801561198c57600080fd5b506040519080825280602002602001820160405280156119b6578160200160208202803683370190505b5092505b6119c68a8389896126a6565b90955093506119d68a8584612715565b6009555050985098509895505050505050565b60005b6119f461157e565b8110156107d557611a2b838281518110611a0a57fe5b6020026020010151838381518110611a1e57fe5b6020026020010151611bf4565b838281518110611a3757fe5b60209081029190910101526001016119ec565b333014611b39576000306001600160a01b0316600036604051611a6e929190614c86565b6000604051808303816000865af19150503d8060008114611aab576040519150601f19603f3d011682016040523d82523d6000602084013e611ab0565b606091505b505090508060008114611abf57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611b1b573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b6060611b436111e9565b9050611b4f8782612072565b60006060611b678c8c8c8c8c8c898d8d63ffffffff16565b5091509150611b7a81848663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08301526020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b60008282026106e1841580610fa0575083858381610f9d57fe5b6000611c03821515600461135a565b82611c10575060006105fc565b670de0b6b3a764000083810290611c2a9085838161102557fe5b828181611c3357fe5b049150506105fc565b60608088611c66611c4b610a33565b6001600160a01b0316336001600160a01b03161460cd61135a565b611c7b611c71610714565b82146101f461135a565b6060611c856111e9565b9050611c918882612072565b6000606080611ca68e8e8e8e8e8e8a8f611919565b925092509250611cb68d8461272e565b611cc082856119e9565b611cca81856119e9565b909550935050505b5097509795505050505050565b1c63ffffffff1690565b1c61ffff1690565b60006105fc61ffff610ef484670de0b6b3a7640000610f83565b6000606080611d37611d1b610a0f565b6001600160a01b03168b6001600160a01b03161461014861135a565b611d478b8b8b8b8b8b8b8b612738565b925092509250985098509895505050505050565b60005b611d6661157e565b8110156107d557611d9d838281518110611d7c57fe5b6020026020010151838381518110611d9057fe5b6020026020010151610fef565b838281518110611da957fe5b6020908102919091010152600101611d5e565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e1f57507f0000000000000000000000000000000000000000000000000000000000000000610895565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e8057507f0000000000000000000000000000000000000000000000000000000000000000610895565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611ee157507f0000000000000000000000000000000000000000000000000000000000000000610895565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611f4257507f0000000000000000000000000000000000000000000000000000000000000000610895565b6108956101356124af565b600080611f62611f5b610808565b8490610f83565b90506106e18382610ec4565b60006106e183836127be565b6000611f8f611f876107da565b61014761135a565b611f9a8484846127ea565b949350505050565b60006106e18383611bf4565b6000611fbb611f876107da565b611f9a84848461281d565b60006106e18383610fef565b60006105fc611ff1611fe2610808565b670de0b6b3a764000090610ec4565b8390610fef565b6000612002610a33565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561203a57600080fd5b505afa15801561204e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064f91906148ba565b60005b61207d61157e565b8110156107d5576120b483828151811061209357fe5b60200260200101518383815181106120a757fe5b60200260200101516127be565b8382815181106120c057fe5b6020908102919091010152600101612075565b606060006120df6115b9565b9150600090506000826000815181106120f457fe5b602002602001015190506000600190505b835181101561214b578184828151811061211b57fe5b602002602001015111156121435780925083818151811061213857fe5b602002602001015191505b600101612105565b50509091565b670de0b6b3a764000060005b83518110156121b3576121a96121a285838151811061217857fe5b602002602001015185848151811061218c57fe5b602002602001015161285090919063ffffffff16565b83906127be565b915060010161215d565b506105fc6000821161013761135a565b60006121cd611448565b826040516020016109cc929190614c96565b606080886121ee611c4b610a33565b6121f9611c71610714565b60606122036111e9565b905061220d610616565b6122b457600060606122228d8d8d868b61289f565b91509150612237620f424083101560cc61135a565b6122456000620f42406128e5565b6122548b620f424084036128e5565b61225e8184611d5b565b8061226761157e565b67ffffffffffffffff8111801561227d57600080fd5b506040519080825280602002602001820160405280156122a7578160200160208202803683370190505b5095509550505050611cd2565b6122be8882612072565b60006060806122d38e8e8e8e8e8e8a8f611d0b565b9250925092506122e38c846128e5565b6122ed8285611d5b565b6122f781856119e9565b9095509350611cd2915050565b600b5461231390826000610f5c565b600b556040517f5a9e84f78f7957cb4ed7478eb0fcad35ee4ecbe2e0f298420b28a3955392573f90611179908390614d18565b60028151101561235557610613565b60008160008151811061236457fe5b602002602001015190506000600190505b82518110156107d557600083828151811061238c57fe5b602002602001015190506123b5816001600160a01b0316846001600160a01b031610606561135a565b9150600101612375565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6123de610a0f565b6001600160a01b0316141580156123f957506123f9836128ef565b1561242157612406610a0f565b6001600160a01b0316336001600160a01b03161490506105fc565b612429611ff8565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161245893929190614d44565b60206040518083038186803b15801561247057600080fd5b505afa158015612484573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a891906147bb565b90506105fc565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600061252b848411158361135a565b5050900390565b4690565b60008061255161254c846004601f88020161295d565b612967565b905060006125686109508560806010890201611ce9565b9050600061257585612983565b9050612582838383612a02565b9695505050505050565b60608061259761157e565b67ffffffffffffffff811180156125ad57600080fd5b506040519080825280602002602001820160405280156125d7578160200160208202803683370190505b509050826125e6579050612582565b6126198887815181106125f557fe5b602002602001015188888151811061260957fe5b6020026020010151878787612a76565b81878151811061262557fe5b6020908102919091010152979650505050505050565b60005b61264661157e565b8110156126a05761268184828151811061265c57fe5b602002602001015184838151811061267057fe5b60200260200101518463ffffffff16565b84828151811061268d57fe5b602090810291909101015260010161263e565b50505050565b6000606060006126b584612afe565b905060008160028111156126c557fe5b14156126e0576126d6878786612b14565b925092505061270c565b60018160028111156126ee57fe5b14156126fe576126d68785612bf7565b6126d687878787612c29565b505b94509492505050565b60006127248484610ec461263b565b611f9a8285612151565b6108048282612c98565b60006060806127456114e5565b606060006127516120d3565b915091506000612761838c612151565b905060606127758c8585600954868f61258c565b90506127848c82610ec461263b565b600060606127948e878d8d612d54565b915091506127a38e8288612daf565b60095590975095509350505050985098509895505050505050565b60008282026127d8841580610fa0575083858381610f9d57fe5b670de0b6b3a764000090049392505050565b60006127f46114e5565b611f9a836128058660200151612dbe565b846128138860400151612dbe565b8860600151612ee0565b60006128276114e5565b611f9a836128388660200151612dbe565b846128468860400151612dbe565b8860600151612f4d565b60008061285d8484612fc3565b9050600061287761287083612710610f83565b6001610f38565b90508082101561288c576000925050506105fc565b6128968282610ec4565b925050506105fc565b600060606128ca6128ae610a0f565b6001600160a01b0316876001600160a01b03161461014861135a565b6128d787878787876130f6565b915091509550959350505050565b610804828261318a565b600061291a7fe01af92c00000000000000000000000000000000000000000000000000000000610997565b82148061294e575061294b7f3e56920500000000000000000000000000000000000000000000000000000000610997565b82145b806105fc57506105fc82613218565b1c637fffffff1690565b60006105fc637fffffff610ef484670de0b6b3a7640000610f83565b600042816129928460c0611cdf565b905060006129a18560e0611cdf565b9050808311156129be57670de0b6b3a76400009350505050610895565b818310156129d25760009350505050610895565b81810382840381156129ed576129e88183611bf4565b6129f7565b670de0b6b3a76400005b979650505050505050565b6000811580612a1057508284145b15612a1c5750826106e1565b670de0b6b3a76400008210612a325750816106e1565b82841115612a5c576000612a48838587036127be565b9050612a548582610ec4565b9150506106e1565b6000612a6a838686036127be565b9050612a548582610f38565b6000838311612a8757506000612af5565b6000612a938585610fef565b90506000612aa9670de0b6b3a764000088611bf4565b9050612abd826709b6e64a8ec600006115a2565b91506000612acb838361327c565b90506000612ae2612adb836132a8565b8b906127be565b9050612aee81876127be565b9450505050505b95945050505050565b6000818060200190518101906105fc9190614924565b60006060612b206114e5565b600080612b2c856132ce565b91509150612b44612b3b61157e565b8210606461135a565b6060612b4e61157e565b67ffffffffffffffff81118015612b6457600080fd5b50604051908082528060200260200182016040528015612b8e578160200160208202803683370190505b509050612bd2888381518110612ba057fe5b6020026020010151888481518110612bb457fe5b602002602001015185612bc5610616565b612bcd610808565b6132f0565b818381518110612bde57fe5b6020908102919091010152919791965090945050505050565b600060606000612c06846133b0565b90506060612c1c8683612c17610616565b6133c6565b9196919550909350505050565b60006060612c356114e5565b60606000612c4285613478565b91509150612c53825161082a61157e565b612c5d8287612072565b6000612c7a898985612c6d610616565b612c75610808565b613490565b9050612c8a8282111560cf61135a565b989197509095505050505050565b612caf6001600160a01b038316151561019b61135a565b612cbb826000836107d5565b6001600160a01b038216600090815260208190526040902054612ce190826101a161251c565b6001600160a01b038316600090815260208190526040902055600254612d0790826136be565b6002556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612d48908590614d3b565b60405180910390a35050565b600060606000612d6384612afe565b90506001816002811115612d7357fe5b1415612d85576126d6878787876136cc565b6002816002811115612d9357fe5b1415612da4576126d6878786613729565b61270a6101366124af565b60006127248484610f3861263b565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161415612e0357506000612ed4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161415612e4557506001612ed4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161415612e8757506002612ed4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161415612ec957506003612ed4565b612ed46101356124af565b6106e181600b54612536565b6000612f02612ef787670429d069189e00006127be565b83111561013061135a565b6000612f0e8784610f38565b90506000612f1c8883610fef565b90506000612f2a8887611bf4565b90506000612f38838361327c565b9050612aee612f46826132a8565b89906127be565b6000612f6f612f6485670429d069189e00006127be565b83111561013161135a565b6000612f85612f7e8685610ec4565b8690610fef565b90506000612f938588610fef565b90506000612fa1838361327c565b90506000612fb782670de0b6b3a7640000610ec4565b9050612aee8a82610f83565b600081612fd95750670de0b6b3a76400006105fc565b82612fe6575060006105fc565b6130137f80000000000000000000000000000000000000000000000000000000000000008410600661135a565b82613039770bce5086492111aea88f4bb1ca6bcf584181ea8059f765328410600761135a565b826000670c7d713b49da00008313801561305a5750670f43fc2c04ee000083125b1561309157600061306a846137d6565b9050670de0b6b3a764000080820784020583670de0b6b3a76400008305020191505061309f565b8161309b8461390d565b0290505b670de0b6b3a764000090056130ed7ffffffffffffffffffffffffffffffffffffffffffffffffdc702bd3a30fc000082128015906130e6575068070c1cc73b00c800008213155b600861135a565b61258281613cad565b600060606131026114e5565b600061310d84612afe565b9050613128600082600281111561312057fe5b1460ce61135a565b60606131338561417d565b905061314061079661157e565b61314a8187612072565b60606131546120d3565b50905060006131638284612151565b905060006131738261087061157e565b600992909255509a91995090975050505050505050565b613196600083836107d5565b6002546131a39082610f38565b6002556001600160a01b0382166000908152602081905260409020546131c99082610f38565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612d48908590614d3b565b60006132437f38e9922e00000000000000000000000000000000000000000000000000000000610997565b8214806105fc57506132747f50dd6ed900000000000000000000000000000000000000000000000000000000610997565b909114919050565b6000806132898484612fc3565b9050600061329c61287083612710610f83565b9050612af58282610f38565b6000670de0b6b3a764000082106132c05760006105fc565b50670de0b6b3a76400000390565b600080828060200190518101906132e591906149b4565b909590945092505050565b60008061330184610ef48188610ec4565b905061331a6709b6e64a8ec6000082101561013261135a565b6000613338613331670de0b6b3a764000089611bf4565b839061327c565b9050600061334f613348836132a8565b8a906127be565b9050600061335c896132a8565b9050600061336a8383610f83565b905060006133788483610ec4565b90506133a0613399613392670de0b6b3a76400008b610ec4565b84906127be565b8290610f38565b9c9b505050505050505050505050565b6000818060200190518101906106e19190614987565b606060006133d48484611bf4565b90506060855167ffffffffffffffff811180156133f057600080fd5b5060405190808252806020026020018201604052801561341a578160200160208202803683370190505b50905060005b865181101561346e5761344f8388838151811061343957fe5b60200260200101516127be90919063ffffffff16565b82828151811061345b57fe5b6020908102919091010152600101613420565b5095945050505050565b60606000828060200190518101906132e59190614940565b60006060845167ffffffffffffffff811180156134ac57600080fd5b506040519080825280602002602001820160405280156134d6578160200160208202803683370190505b5090506000805b885181101561359b576135368982815181106134f557fe5b6020026020010151610ef489848151811061350c57fe5b60200260200101518c858151811061352057fe5b6020026020010151610ec490919063ffffffff16565b83828151811061354257fe5b60200260200101818152505061359161358a89838151811061356057fe5b602002602001015185848151811061357457fe5b6020026020010151610f8390919063ffffffff16565b8390610f38565b91506001016134dd565b50670de0b6b3a764000060005b895181101561369d5760008482815181106135bf57fe5b602002602001015184111561361f5760006135e86135dc866132a8565b8d858151811061343957fe5b905060006135fc828c868151811061352057fe5b905061361661358a611ff1670de0b6b3a76400008c610ec4565b92505050613636565b88828151811061362b57fe5b602002602001015190505b600061365f8c848151811061364757fe5b6020026020010151610875848f878151811061352057fe5b905061369161368a8c858151811061367357fe5b60200260200101518361285090919063ffffffff16565b85906127be565b935050506001016135a8565b506136b16136aa826132a8565b8790610f83565b9998505050505050505050565b60006106e18383600161251c565b600060608060006136dc85613478565b915091506136f26136eb61157e565b8351610ea1565b6136fc8287612072565b600061371989898561370c610616565b613714610808565b614193565b9050612c8a8282101560d061135a565b60006060600080613739856132ce565b91509150613748612b3b61157e565b606061375261157e565b67ffffffffffffffff8111801561376857600080fd5b50604051908082528060200260200182016040528015613792578160200160208202803683370190505b509050612bd28883815181106137a457fe5b60200260200101518884815181106137b857fe5b6020026020010151856137c9610616565b6137d1610808565b6143a5565b670de0b6b3a7640000026000806ec097ce7bc90715b34b9f1000000000808401907fffffffffffffffffffffffffffffffffff3f68318436f8ea4cb460f0000000008501028161382257fe5b05905060006ec097ce7bc90715b34b9f100000000082800205905081806ec097ce7bc90715b34b9f100000000081840205915060038205016ec097ce7bc90715b34b9f100000000082840205915060058205016ec097ce7bc90715b34b9f100000000082840205915060078205016ec097ce7bc90715b34b9f100000000082840205915060098205016ec097ce7bc90715b34b9f1000000000828402059150600b8205016ec097ce7bc90715b34b9f1000000000828402059150600d8205016ec097ce7bc90715b34b9f1000000000828402059150600f826002919005919091010295945050505050565b6000670de0b6b3a764000082121561394a57613940826ec097ce7bc90715b34b9f10000000008161393a57fe5b0561390d565b6000039050610895565b60007e1600ef3172e58d2e933ec884fde10064c63b5372d805e203c0000000000000831261399b57770195e54c5dd42177f53a27172fa9ec630262827000000000830592506806f05b59d3b2000000015b73011798004d755d3c8bc8e03204cf44619e00000083126139d3576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff00840008312613a1b576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a7008312613a56576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf8508312613a8d57693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e28312613ac457690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d038312613af95768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb417461211108312613b2457680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d8312613b59576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f17757889379378312613b8e576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b2866038312613bc2576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac8312613bf6576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b600068056bc75e2d63100000840168056bc75e2d631000008086030281613c1957fe5b059050600068056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b6000613cf27ffffffffffffffffffffffffffffffffffffffffffffffffdc702bd3a30fc00008312158015613ceb575068070c1cc73b00c800008313155b600961135a565b6000821215613d2657613d0782600003613cad565b6ec097ce7bc90715b34b9f100000000081613d1e57fe5b059050610895565b60006806f05b59d3b20000008312613d7c57507ffffffffffffffffffffffffffffffffffffffffffffffff90fa4a62c4e00000090910190770195e54c5dd42177f53a27172fa9ec630262827000000000613dc8565b6803782dace9d90000008312613dc457507ffffffffffffffffffffffffffffffffffffffffffffffffc87d2531627000000909101906b1425982cf597cd205cef7380613dc8565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac620000008412613e2e577fffffffffffffffffffffffffffffffffffffffffffffff5287143a539e0000009093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d6310000008412613e80577fffffffffffffffffffffffffffffffffffffffffffffffa9438a1d29cf0000009093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b188000008412613ed0577fffffffffffffffffffffffffffffffffffffffffffffffd4a1c50e94e78000009093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c4000008412613f20577fffffffffffffffffffffffffffffffffffffffffffffffea50e2874a73c000009093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac62000008412613f6f577ffffffffffffffffffffffffffffffffffffffffffffffff5287143a539e000009093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d631000008412613fbe577ffffffffffffffffffffffffffffffffffffffffffffffffa9438a1d29cf000009093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b1880000841261400d577ffffffffffffffffffffffffffffffffffffffffffffffffd4a1c50e94e7800009093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c40000841261405c577ffffffffffffffffffffffffffffffffffffffffffffffffea50e2874a73c00009093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b6060818060200190518101906106e191906149ea565b60006060845167ffffffffffffffff811180156141af57600080fd5b506040519080825280602002602001820160405280156141d9578160200160208202803683370190505b5090506000805b8851811015614281576142398982815181106141f857fe5b602002602001015161087589848151811061420f57fe5b60200260200101518c858151811061422357fe5b6020026020010151610f3890919063ffffffff16565b83828151811061424557fe5b60200260200101818152505061427761358a89838151811061426357fe5b602002602001015185848151811061343957fe5b91506001016141e0565b50670de0b6b3a764000060005b8951811015614362576000838583815181106142a657fe5b602002602001015111156143025760006142cb6135dc86670de0b6b3a7640000610ec4565b905060006142df828c868151811061352057fe5b90506142f961358a6121a2670de0b6b3a76400008c610ec4565b92505050614319565b88828151811061430e57fe5b602002602001015190505b60006143428c848151811061432a57fe5b6020026020010151610875848f878151811061422357fe5b905061435661368a8c858151811061367357fe5b9350505060010161428e565b50670de0b6b3a76400008111156143995761438f61438882670de0b6b3a7640000610ec4565b87906127be565b9350505050612af5565b60009350505050612af5565b6000806143b684610ef48188610f38565b90506143cf6729a2241af62c000082111561013361135a565b60006143e6613331670de0b6b3a764000089610fef565b905060006144066143ff83670de0b6b3a7640000610ec4565b8a90610f83565b90506000614413896132a8565b905060006144218383610f83565b9050600061442f8483610ec4565b90506133a0613399614449670de0b6b3a76400008b610ec4565b8490610fef565b80356105fc81614ee2565b600082601f83011261446b578081fd5b813561447e61447982614ec2565b614e9b565b81815291506020808301908481018184028601820187101561449f57600080fd5b60005b848110156144be578135845292820192908201906001016144a2565b505050505092915050565b600082601f8301126144d9578081fd5b81516144e761447982614ec2565b81815291506020808301908481018184028601820187101561450857600080fd5b60005b848110156144be5781518452928201929082019060010161450b565b600082601f830112614537578081fd5b813567ffffffffffffffff81111561454d578182fd5b6145606020601f19601f84011601614e9b565b915080825283602082850101111561457757600080fd5b8060208401602084013760009082016020015292915050565b8035600281106105fc57600080fd5b6000602082840312156145b0578081fd5b81356106e181614ee2565b600080604083850312156145cd578081fd5b82356145d881614ee2565b915060208301356145e881614ee2565b809150509250929050565b600080600060608486031215614607578081fd5b833561461281614ee2565b9250602084013561462281614ee2565b929592945050506040919091013590565b600080600080600080600060e0888a03121561464d578283fd5b873561465881614ee2565b9650602088013561466881614ee2565b95506040880135945060608801359350608088013560ff8116811461468b578384fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156146ba578182fd5b82356146c581614ee2565b946020939093013593505050565b6000806000606084860312156146e7578081fd5b835167ffffffffffffffff808211156146fe578283fd5b818601915086601f830112614711578283fd5b815161471f61447982614ec2565b80828252602080830192508086018b82838702890101111561473f578788fd5b8796505b8487101561476a57805161475681614ee2565b845260019690960195928101928101614743565b508901519097509350505080821115614781578283fd5b5061478e868287016144c9565b925050604084015190509250925092565b6000602082840312156147b0578081fd5b81356106e181614ef7565b6000602082840312156147cc578081fd5b81516106e181614ef7565b600080600080600080600060e0888a0312156147f1578081fd5b87359650602088013561480381614ee2565b9550604088013561481381614ee2565b9450606088013567ffffffffffffffff8082111561482f578283fd5b61483b8b838c0161445b565b955060808a0135945060a08a0135935060c08a013591508082111561485e578283fd5b5061486b8a828b01614527565b91505092959891949750929550565b60006020828403121561488b578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146106e1578182fd5b6000602082840312156148cb578081fd5b81516106e181614ee2565b600080604083850312156148e8578182fd5b82356148f381614ee2565b9150602083013567ffffffffffffffff81111561490e578182fd5b61491a85828601614527565b9150509250929050565b600060208284031215614935578081fd5b81516106e181614f05565b600080600060608486031215614954578081fd5b835161495f81614f05565b602085015190935067ffffffffffffffff81111561497b578182fd5b61478e868287016144c9565b60008060408385031215614999578182fd5b82516149a481614f05565b6020939093015192949293505050565b6000806000606084860312156149c8578081fd5b83516149d381614f05565b602085015160409095015190969495509392505050565b600080604083850312156149fc578182fd5b8251614a0781614f05565b602084015190925067ffffffffffffffff811115614a23578182fd5b61491a858286016144c9565b600080600060608486031215614a43578081fd5b833567ffffffffffffffff80821115614a5a578283fd5b8186019150610120808389031215614a70578384fd5b614a7981614e9b565b9050614a858884614590565b8152614a948860208501614450565b6020820152614aa68860408501614450565b6040820152606083013560608201526080830135608082015260a083013560a0820152614ad68860c08501614450565b60c0820152614ae88860e08501614450565b60e08201526101008084013583811115614b00578586fd5b614b0c8a828701614527565b9183019190915250976020870135975060409096013595945050505050565b600060208284031215614b3c578081fd5b5035919050565b600080600060608486031215614b57578081fd5b8335925060208401359150604084013567ffffffffffffffff811115614b7b578182fd5b614b878682870161445b565b9150509250925092565b60008060008060808587031215614ba6578182fd5b8451935060208501519250604085015191506060850151614bc681614ee2565b939692955090935050565b6000815180845260208085019450808401835b83811015614c0057815187529582019590820190600101614be4565b509495945050505050565b60008151808452815b81811015614c3057602081850181015186830182015201614c14565b81811115614c415782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6000602082526106e16020830184614bd1565b600060408252614d066040830185614bd1565b8281036020840152612af58185614bd1565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b600083825260406020830152611f9a6040830184614c0b565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526106e16020830184614c0b565b600083825260406020830152611f9a6040830184614bd1565b600084825283602083015260606040830152612af56060830184614bd1565b600085825284602083015260806040830152614e7b6080830185614bd1565b82810360608401526129f78185614bd1565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715614eba57600080fd5b604052919050565b600067ffffffffffffffff821115614ed8578081fd5b5060209081020190565b6001600160a01b038116811461061357600080fd5b801515811461061357600080fd5b6003811061061357600080fdfea2646970667358221220a5897244a1f4e9204983271ed4a7d57c09d1ef76e8b605f0151680b0f7bfeaef64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a25760003560e01c80632f2770db116100765780636c57f5a91161005b5780636c57f5a91461013b578063851c1bb3146101435780638d928af814610163576100a2565b80632f2770db146101115780636634b7531461011b576100a2565b8062c194db146100a7578063174481fa146100c557806323679719146100db5780632da47c40146100fb575b600080fd5b6100af61016b565b6040516100bc9190610c73565b60405180910390f35b6100cd61018a565b6040516100bc929190610c0c565b6100ee6100e9366004610a23565b6101d0565b6040516100bc9190610beb565b610103610243565b6040516100bc929190610d5d565b6101196102ad565b005b61012e61012936600461098f565b61030a565b6040516100bc9190610c33565b61012e610335565b6101566101513660046109c7565b61033e565b6040516100bc9190610c3e565b6100ee610390565b606061018560405180602001604052806000815250610413565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b6001546000906101e59060ff161560d36104ec565b6000806101f0610243565b915091506102356101ff610390565b8b8b8b8b8b88888d8d6040516020016102219a99989796959493929190610c86565b6040516020818303038152906040526104fe565b9a9950505050505050505050565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561029f57807f000000000000000000000000000000000000000000000000000000000000000003925062278d0091506102a8565b60009250600091505b509091565b6102b5610589565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b60015460ff1690565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610373929190610bbb565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061040d73ffffffffffffffffffffffffffffffffffffffff831615156101ac6104ec565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016104de8183866105d2565b505050505050505050919050565b816104fa576104fa8161064c565b5050565b60008061050a836106b9565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b60006105b86000357fffffffff000000000000000000000000000000000000000000000000000000001661033e565b90506105cf6105c78233610701565b6101916104ec565b50565b5b602081106106105781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016105d3565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600060606106c683610413565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff81166106fa573d6000803e3d6000fd5b9392505050565b600061070b610390565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561075057600080fd5b505afa158015610764573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107889190610a07565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b81526004016107c493929190610c47565b60206040518083038186803b1580156107dc57600080fd5b505afa1580156107f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081491906109ab565b90505b92915050565b803561081781610dcb565b600082601f830112610838578081fd5b813561084b61084682610d92565b610d6b565b81815291506020808301908481018184028601820187101561086c57600080fd5b60005b8481101561089457813561088281610dcb565b8452928201929082019060010161086f565b505050505092915050565b600082601f8301126108af578081fd5b81356108bd61084682610d92565b8181529150602080830190848101818402860182018710156108de57600080fd5b60005b84811015610894578135845292820192908201906001016108e1565b803561081781610ded565b600082601f830112610918578081fd5b813567ffffffffffffffff81111561092e578182fd5b61095f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610d6b565b915080825283602082850101111561097657600080fd5b8060208401602084013760009082016020015292915050565b6000602082840312156109a0578081fd5b81356106fa81610dcb565b6000602082840312156109bc578081fd5b81516106fa81610ded565b6000602082840312156109d8578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146106fa578182fd5b600060208284031215610a18578081fd5b81516106fa81610dcb565b600080600080600080600060e0888a031215610a3d578283fd5b873567ffffffffffffffff80821115610a54578485fd5b610a608b838c01610908565b985060208a0135915080821115610a75578485fd5b610a818b838c01610908565b975060408a0135915080821115610a96578485fd5b610aa28b838c01610828565b965060608a0135915080821115610ab7578485fd5b50610ac48a828b0161089f565b94505060808801359250610adb8960a08a0161081d565b9150610aea8960c08a016108fd565b905092959891949750929550565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208085019450808401835b83811015610b4157815187529582019590820190600101610b25565b509495945050505050565b15159052565b60008151808452815b81811015610b7757602081850181015186830182015201610b5b565b81811115610b885782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b6000602082526108146020830184610b52565b600061014073ffffffffffffffffffffffffffffffffffffffff8d16835260208181850152610cb78285018e610b52565b91508382036040850152610ccb828d610b52565b84810360608601528b51808252828d01935090820190845b81811015610d0757610cf58551610db2565b83529383019391830191600101610ce3565b50508481036080860152610d1b818c610b12565b93505050508660a08301528560c08301528460e0830152610d40610100830185610af8565b610d4e610120830184610b4c565b9b9a5050505050505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610d8a57600080fd5b604052919050565b600067ffffffffffffffff821115610da8578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff811681146105cf57600080fd5b80151581146105cf57600080fdfea2646970667358221220c36e9fd0abdd6de45fc245d638cd075eb7c99ceea829eba32c1028982f902aeb64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/index.ts b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/index.ts new file mode 100644 index 0000000..ac6c747 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/index.ts @@ -0,0 +1,82 @@ +import { ethers } from 'hardhat'; +import { NoProtocolFeeLiquidityBootstrappingPoolDeployment } from './input'; +import { Task, TaskMode, TaskRunOptions } from '@src'; +import { bn, fp } from '@helpers/numbers'; +import * as expectEvent from '@helpers/expectEvent'; +import { getContractDeploymentTransactionHash, saveContractDeploymentTransactionHash } from '@src'; +import { ZERO_ADDRESS } from '@helpers/constants'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as NoProtocolFeeLiquidityBootstrappingPoolDeployment; + const args = [input.Vault]; + const factory = await task.deployAndVerify('NoProtocolFeeLiquidityBootstrappingPoolFactory', args, from, force); + + if (task.mode === TaskMode.LIVE) { + // We also create a Pool using the factory and verify it, to let us compute their action IDs and so that future + // Pools are automatically verified. We however don't run any of this code in CHECK mode, since we don't care about + // the contracts deployed here. The action IDs will be checked to be correct via a different mechanism. + const newPoolParams = { + name: 'DO NOT USE - Mock LiquidityBootstrappingPool Pool', + symbol: 'TEST', + tokens: [input.WETH, input.BAL].sort(function (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()); + }), + weights: [fp(0.8), fp(0.2)], + swapFeePercentage: bn(1e12), + swapEnabledOnStart: true, + owner: ZERO_ADDRESS, + }; + + // This mimics the logic inside task.deploy + if (force || !task.output({ ensure: false })['MockLiquidityBootstrappingPool']) { + const poolCreationReceipt = await ( + await factory.create( + newPoolParams.name, + newPoolParams.symbol, + newPoolParams.tokens, + newPoolParams.weights, + newPoolParams.swapFeePercentage, + newPoolParams.owner, + newPoolParams.swapEnabledOnStart + ) + ).wait(); + const event = expectEvent.inReceipt(poolCreationReceipt, 'PoolCreated'); + const mockPoolAddress = event.args.pool; + + await saveContractDeploymentTransactionHash(mockPoolAddress, poolCreationReceipt.transactionHash, task.network); + await task.save({ MockLiquidityBootstrappingPool: mockPoolAddress }); + } + + const mockPool = await task.instanceAt( + 'LiquidityBootstrappingPool', + task.output()['MockLiquidityBootstrappingPool'] + ); + + // In order to verify the Pool's code, we need to complete its constructor arguments by computing the factory + // provided arguments (pause durations). + + // The durations require knowing when the Pool was created, so we look for the timestamp of its creation block. + const txHash = await getContractDeploymentTransactionHash(mockPool.address, task.network); + const tx = await ethers.provider.getTransactionReceipt(txHash); + const poolCreationBlock = await ethers.provider.getBlock(tx.blockNumber); + + // With those and the period end times, we can compute the durations. + const { pauseWindowEndTime, bufferPeriodEndTime } = await mockPool.getPausedState(); + const pauseWindowDuration = pauseWindowEndTime.sub(poolCreationBlock.timestamp); + const bufferPeriodDuration = bufferPeriodEndTime.sub(poolCreationBlock.timestamp).sub(pauseWindowDuration); + + // We are now ready to verify the Pool + await task.verify('LiquidityBootstrappingPool', mockPool.address, [ + input.Vault, + newPoolParams.name, + newPoolParams.symbol, + newPoolParams.tokens, + newPoolParams.weights, + newPoolParams.swapFeePercentage, + pauseWindowDuration, + bufferPeriodDuration, + newPoolParams.owner, + newPoolParams.swapEnabledOnStart, + ]); + } +}; diff --git a/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/input.ts b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/input.ts new file mode 100644 index 0000000..98c2bea --- /dev/null +++ b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/input.ts @@ -0,0 +1,17 @@ +import { Task, TaskMode } from '@src'; + +export type NoProtocolFeeLiquidityBootstrappingPoolDeployment = { + Vault: string; + WETH: string; + BAL: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const WETH = new Task('00000000-tokens', TaskMode.READ_ONLY); +const BAL = new Task('00000000-tokens', TaskMode.READ_ONLY); + +export default { + Vault, + WETH, + BAL, +}; diff --git a/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/arbitrum.json b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/arbitrum.json new file mode 100644 index 0000000..4701b20 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "NoProtocolFeeLiquidityBootstrappingPoolFactory": "0x1802953277FD955f9a254B80Aa0582f193cF1d77" +} diff --git a/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/avalanche.json b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/avalanche.json new file mode 100644 index 0000000..62bda68 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/avalanche.json @@ -0,0 +1,3 @@ +{ + "NoProtocolFeeLiquidityBootstrappingPoolFactory": "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/base.json b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/base.json new file mode 100644 index 0000000..22b5398 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/base.json @@ -0,0 +1,4 @@ +{ + "NoProtocolFeeLiquidityBootstrappingPoolFactory": "0x0c6052254551EAe3ECac77B01DFcf1025418828f", + "MockLiquidityBootstrappingPool": "0x71528afe250438e184b2deAF7947f0f45931DF3b" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/bsc.json b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/bsc.json new file mode 100644 index 0000000..9395f97 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/bsc.json @@ -0,0 +1,3 @@ +{ + "NoProtocolFeeLiquidityBootstrappingPoolFactory": "0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD" +} diff --git a/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/gnosis.json b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/gnosis.json new file mode 100644 index 0000000..fb7f825 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "NoProtocolFeeLiquidityBootstrappingPoolFactory": "0x85a80afee867aDf27B50BdB7b76DA70f1E853062" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/goerli.json b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/goerli.json new file mode 100644 index 0000000..828af7c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/goerli.json @@ -0,0 +1,3 @@ +{ + "NoProtocolFeeLiquidityBootstrappingPoolFactory": "0xB0C726778C3AE4B3454D85557A48e8fa502bDD6A" +} diff --git a/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/kovan.json b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/kovan.json new file mode 100644 index 0000000..d9d10c9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/kovan.json @@ -0,0 +1,3 @@ +{ + "NoProtocolFeeLiquidityBootstrappingPoolFactory": "0x1B57f637Ce3408f1f834b0b70f9A595b062DAea7" +} diff --git a/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/mainnet.json b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/mainnet.json new file mode 100644 index 0000000..3e7f406 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "NoProtocolFeeLiquidityBootstrappingPoolFactory": "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e" +} diff --git a/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/mode.json b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/mode.json new file mode 100644 index 0000000..f5e2676 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/mode.json @@ -0,0 +1,4 @@ +{ + "NoProtocolFeeLiquidityBootstrappingPoolFactory": "0xE42FFA682A26EF8F25891db4882932711D42e467" +} + \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/optimism.json b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/optimism.json new file mode 100644 index 0000000..0860f9f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/optimism.json @@ -0,0 +1,3 @@ +{ + "NoProtocolFeeLiquidityBootstrappingPoolFactory": "0xf302f9F50958c5593770FDf4d4812309fF77414f" +} diff --git a/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/polygon.json b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/polygon.json new file mode 100644 index 0000000..97425a0 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/polygon.json @@ -0,0 +1,3 @@ +{ + "NoProtocolFeeLiquidityBootstrappingPoolFactory": "0x41B953164995c11C81DA73D212ED8Af25741b7Ac" +} diff --git a/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/rinkeby.json b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/rinkeby.json new file mode 100644 index 0000000..97425a0 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/rinkeby.json @@ -0,0 +1,3 @@ +{ + "NoProtocolFeeLiquidityBootstrappingPoolFactory": "0x41B953164995c11C81DA73D212ED8Af25741b7Ac" +} diff --git a/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/sepolia.json b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/sepolia.json new file mode 100644 index 0000000..f377c29 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/sepolia.json @@ -0,0 +1,4 @@ +{ + "NoProtocolFeeLiquidityBootstrappingPoolFactory": "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B", + "MockLiquidityBootstrappingPool": "0xe90472ffc41D7Ddf8E3B456bBA748e3F22c59C6f" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/zkevm.json b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/zkevm.json new file mode 100644 index 0000000..77a746b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/output/zkevm.json @@ -0,0 +1,4 @@ +{ + "NoProtocolFeeLiquidityBootstrappingPoolFactory": "0x3B1eb8EB7b43882b385aB30533D9A2BeF9052a98", + "MockLiquidityBootstrappingPool": "0x3c87FF3e9307dbEbfAe720E04C6439e49f79BF9B" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/readme.md b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/readme.md new file mode 100644 index 0000000..0b25013 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/readme.md @@ -0,0 +1,18 @@ +# 2021-12-02 - Liquidity Bootstrapping Pool with no Protocol Fees + +Deployment of the `NoProtocolFeeLiquidityBootstrappingPool`, for Liquidity Bootstrapping Pools of up to 4 tokens that ignore protocol fees. This is a temporary Pool factory that will be used until a version that properly reimplements protocol fees is released. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`NoProtocolFeeLiquidityBootstrappingPoolFactory` artifact](./artifact/NoProtocolFeeLiquidityBootstrappingPoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/test/task.fork.ts b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/test/task.fork.ts new file mode 100644 index 0000000..d377165 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20211202-no-protocol-fee-lbp/test/task.fork.ts @@ -0,0 +1,175 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; + +import { WeightedPoolEncoder } from '@helpers/models/pools/weighted/encoder'; +import { SwapKind } from '@helpers/models/types/types'; +import * as expectEvent from '@helpers/expectEvent'; +import { fp } from '@helpers/numbers'; +import { MAX_UINT256 } from '@helpers/constants'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { calculateInvariant } from '@helpers/models/pools/weighted/math'; +import { expectEqualWithError } from '@helpers/relativeError'; +import { advanceToTimestamp, currentTimestamp, DAY, MINUTE, MONTH } from '@helpers/time'; + +import { actionId } from '@helpers/models/misc/actions'; + +import { describeForkTest, getSigner, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; + +describeForkTest('NoProtocolFeeLiquidityBootstrappingPoolFactory', 'mainnet', 14850000, function () { + let owner: SignerWithAddress, whale: SignerWithAddress; + let pool: Contract, factory: Contract, vault: Contract, usdc: Contract, dai: Contract; + + let task: Task; + + const DAI = '0x6b175474e89094c44da98b954eedeac495271d0f'; + const USDC = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'; + + const tokens = [DAI, USDC]; + const initialWeights = [fp(0.9), fp(0.1)]; + const swapFeePercentage = fp(0.01); + const swapEnabledOnStart = true; + + const weightChangeDuration = MONTH; + const endWeights = [fp(0.2), fp(0.8)]; + let endTime: BigNumber; + + const initialBalanceDAI = fp(9e6); // 9:1 DAI:USDC ratio + const initialBalanceUSDC = fp(1e6).div(1e12); // 6 digits + const initialBalances = [initialBalanceDAI, initialBalanceUSDC]; + + const LARGE_TOKEN_HOLDER = '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503'; + + before('run task', async () => { + task = new Task('20211202-no-protocol-fee-lbp', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('NoProtocolFeeLiquidityBootstrappingPoolFactory'); + }); + + before('load signers', async () => { + owner = await getSigner(); + whale = await impersonate(LARGE_TOKEN_HOLDER); + }); + + before('load vault and tokens', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.instanceAt('Vault', await factory.getVault()); + dai = await task.instanceAt('IERC20', DAI); + usdc = await task.instanceAt('IERC20', USDC); + }); + + it('deploy a liquidity bootstrapping pool', async () => { + const tx = await factory.create( + 'LBP', + 'LBPT', + tokens, + initialWeights, + swapFeePercentage, + owner.address, + swapEnabledOnStart + ); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await task.instanceAt('NoProtocolFeeLiquidityBootstrappingPool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + const poolId = pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + }); + + it('initialize a liquidity bootstrapping pool from the owner', async () => { + // Only the owner can seed the pool, so we send them tokens from the whale + await dai.connect(whale).transfer(owner.address, initialBalanceDAI); + await usdc.connect(whale).transfer(owner.address, initialBalanceUSDC); + + // Approve the Vault to join + await dai.connect(owner).approve(vault.address, MAX_UINT256); + await usdc.connect(owner).approve(vault.address, MAX_UINT256); + + const poolId = await pool.getPoolId(); + const userData = WeightedPoolEncoder.joinInit(initialBalances); + await vault.connect(owner).joinPool(poolId, owner.address, owner.address, { + assets: tokens, + maxAmountsIn: initialBalances, + fromInternalBalance: false, + userData, + }); + + const scaledBalances = [initialBalanceDAI, initialBalanceUSDC.mul(1e12)]; + // Initial BPT is the invariant multiplied by the number of tokens + const expectedInvariant = calculateInvariant(scaledBalances, initialWeights).mul(tokens.length); + + expectEqualWithError(await pool.balanceOf(owner.address), expectedInvariant, 0.001); + }); + + it('can swap in a liquidity bootstrapping pool', async () => { + const amount = fp(500); // Small relative to Pool balance - should have zero price impact + await dai.connect(whale).approve(vault.address, amount); + + const poolId = await pool.getPoolId(); + + const whaleUSDCBalanceBefore = await usdc.balanceOf(whale.address); + + await vault + .connect(whale) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: DAI, assetOut: USDC, amount, userData: '0x' }, + { sender: whale.address, recipient: whale.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + const whaleUSDCBalanceAfter = await usdc.balanceOf(whale.address); + + // Assert pool swap + const expectedUSDC = amount.div(1e12); + expectEqualWithError(whaleUSDCBalanceAfter.sub(whaleUSDCBalanceBefore), expectedUSDC, 0.1); + }); + + it('initial weights are correct', async () => { + // Weights are not exact due to being stored in fewer bits + expect(await pool.getNormalizedWeights()).to.equalWithError(initialWeights, 0.0001); + }); + + it('owner can start a gradual weight change', async () => { + const startTime = (await currentTimestamp()).add(DAY); + endTime = startTime.add(weightChangeDuration); + + const tx = await pool.connect(owner).updateWeightsGradually(startTime, endTime, endWeights); + + expectEvent.inReceipt(await tx.wait(), 'GradualWeightUpdateScheduled'); + + const params = await pool.getGradualWeightUpdateParams(); + + expect(params.startTime).to.equal(startTime); + expect(params.endTime).to.equal(endTime); + expect(params.endWeights).to.equalWithError(endWeights, 0.0001); + }); + + it('weights fully change once the time expires', async () => { + await advanceToTimestamp(endTime.add(MINUTE)); + + // Weights are not exact due to being stored in fewer bits + expect(await pool.getNormalizedWeights()).to.equalWithError(endWeights, 0.0001); + }); + + it('authorized accounts can disable the factory', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + const authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + + const DEFAULT_ADMIN_ROLE = await authorizer.DEFAULT_ADMIN_ROLE(); + const admin = await impersonate(await authorizer.getRoleMember(DEFAULT_ADMIN_ROLE, 0)); + + await authorizer.connect(admin).grantRole(await actionId(factory, 'disable'), admin.address); + await factory.connect(admin).disable(); + + expect(await factory.isDisabled()).to.equal(true); + }); + + it('disabling prevents pool creation', async () => { + await expect( + factory.create('LBP', 'LBPT', tokens, initialWeights, swapFeePercentage, owner.address, swapEnabledOnStart) + ).to.be.revertedWith('BAL#211'); // Errors.DISABLED + }); +}); diff --git a/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/artifact/AuthorizerAdaptor.json b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/artifact/AuthorizerAdaptor.json new file mode 100644 index 0000000..8dc8229 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/artifact/AuthorizerAdaptor.json @@ -0,0 +1,91 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "AuthorizerAdaptor", + "sourceName": "contracts/admin/AuthorizerAdaptor.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "performAction", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x60c060405234801561001057600080fd5b506040516106d33803806106d38339818101604052602081101561003357600080fd5b50516001600055306080526001600160601b031960609190911b1660a05260805160a05160601c61065c610077600039806102ff525080610292525061065c6000f3fe60806040526004361061003f5760003560e01c80634036176a14610044578063851c1bb3146101465780638d928af8146101a4578063aaabadc5146101e2575b600080fd5b6100d16004803603604081101561005a57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516919081019060408101602082013564010000000081111561009257600080fd5b8201836020820111156100a457600080fd5b803590602001918460018302840111640100000000831117156100c657600080fd5b5090925090506101f7565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561010b5781810151838201526020016100f3565b50505050905090810190601f1680156101385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015257600080fd5b506101926004803603602081101561016957600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661028c565b60408051918252519081900360200190f35b3480156101b057600080fd5b506101b96102fd565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101ee57600080fd5b506101b9610321565b60606102016103a1565b60643561022261021a6102138361028c565b33886103ba565b610191610484565b61027a84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505073ffffffffffffffffffffffffffffffffffffffff881691905034610496565b915050610285610582565b9392505050565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061032b6102fd565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561037057600080fd5b505afa158015610384573d6000803e3d6000fd5b505050506040513d602081101561039a57600080fd5b5051905090565b6103b360026000541415610190610484565b6002600055565b60006103c4610321565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848585856040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b15801561045057600080fd5b505afa158015610464573d6000803e3d6000fd5b505050506040513d602081101561047a57600080fd5b5051949350505050565b816104925761049281610589565b5050565b6060600060608573ffffffffffffffffffffffffffffffffffffffff1684866040518082805190602001908083835b6020831061050257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016104c5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610564576040519150601f19603f3d011682016040523d82523d6000602084013e610569565b606091505b509150915061057882826105f6565b9695505050505050565b6001600055565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b60608215610605575080610620565b8151156106155781518083602001fd5b6106206101ae610589565b9291505056fea2646970667358221220432ead8cf18160030ece90e93ff9b634a890798ea5b68dd04455d55daef78a8f64736f6c63430007010033", + "deployedBytecode": "0x60806040526004361061003f5760003560e01c80634036176a14610044578063851c1bb3146101465780638d928af8146101a4578063aaabadc5146101e2575b600080fd5b6100d16004803603604081101561005a57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516919081019060408101602082013564010000000081111561009257600080fd5b8201836020820111156100a457600080fd5b803590602001918460018302840111640100000000831117156100c657600080fd5b5090925090506101f7565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561010b5781810151838201526020016100f3565b50505050905090810190601f1680156101385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015257600080fd5b506101926004803603602081101561016957600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661028c565b60408051918252519081900360200190f35b3480156101b057600080fd5b506101b96102fd565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101ee57600080fd5b506101b9610321565b60606102016103a1565b60643561022261021a6102138361028c565b33886103ba565b610191610484565b61027a84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505073ffffffffffffffffffffffffffffffffffffffff881691905034610496565b915050610285610582565b9392505050565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061032b6102fd565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561037057600080fd5b505afa158015610384573d6000803e3d6000fd5b505050506040513d602081101561039a57600080fd5b5051905090565b6103b360026000541415610190610484565b6002600055565b60006103c4610321565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848585856040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b15801561045057600080fd5b505afa158015610464573d6000803e3d6000fd5b505050506040513d602081101561047a57600080fd5b5051949350505050565b816104925761049281610589565b5050565b6060600060608573ffffffffffffffffffffffffffffffffffffffff1684866040518082805190602001908083835b6020831061050257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016104c5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610564576040519150601f19603f3d011682016040523d82523d6000602084013e610569565b606091505b509150915061057882826105f6565b9695505050505050565b6001600055565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b60608215610605575080610620565b8151156106155781518083602001fd5b6106206101ae610589565b9291505056fea2646970667358221220432ead8cf18160030ece90e93ff9b634a890798ea5b68dd04455d55daef78a8f64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/index.ts b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/index.ts new file mode 100644 index 0000000..213fd80 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { AuthorizerAdaptorDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as AuthorizerAdaptorDeployment; + + const args = [input.Vault]; + await task.deployAndVerify('AuthorizerAdaptor', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/input.ts b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/input.ts new file mode 100644 index 0000000..6f65416 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type AuthorizerAdaptorDeployment = { + Vault: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, +}; diff --git a/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/arbitrum.json b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/arbitrum.json new file mode 100644 index 0000000..7d8e5d3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptor": "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e" +} diff --git a/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/avalanche.json b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/avalanche.json new file mode 100644 index 0000000..d792399 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/avalanche.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptor": "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/base.json b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/base.json new file mode 100644 index 0000000..eb8d065 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/base.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptor": "0x6CaD2ea22BFA7F4C14Aae92E47F510Cd5C509bc7" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/bsc.json b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/bsc.json new file mode 100644 index 0000000..e24b724 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/bsc.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptor": "0x41B953164995c11C81DA73D212ED8Af25741b7Ac" +} diff --git a/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/fantom.json b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/fantom.json new file mode 100644 index 0000000..b6137c3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/fantom.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptor": "0xf7D5DcE55E6D47852F054697BAB6A1B48A00ddbd" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/gnosis.json b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/gnosis.json new file mode 100644 index 0000000..8ae3a8f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptor": "0x5aDDCCa35b7A0D07C74063c48700C8590E87864E" +} diff --git a/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/goerli.json b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/goerli.json new file mode 100644 index 0000000..f6d9af9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/goerli.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptor": "0x5D90225De345eE24d1d2B6F45DE90B056F5265A1" +} diff --git a/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/kovan.json b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/kovan.json new file mode 100644 index 0000000..2b0ff34 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/kovan.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptor": "0x97207B095e4D5C9a6e4cfbfcd2C3358E03B90c4A" +} diff --git a/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/mainnet.json b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/mainnet.json new file mode 100644 index 0000000..ab73b59 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptor": "0x8F42aDBbA1B16EaAE3BB5754915E0D06059aDd75" +} diff --git a/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/mode.json b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/mode.json new file mode 100644 index 0000000..cd5d639 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/mode.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptor": "0xf23b4DB826DbA14c0e857029dfF076b1c0264843" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/optimism.json b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/optimism.json new file mode 100644 index 0000000..ab73b59 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/optimism.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptor": "0x8F42aDBbA1B16EaAE3BB5754915E0D06059aDd75" +} diff --git a/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/polygon.json b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/polygon.json new file mode 100644 index 0000000..e11d8b0 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/polygon.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptor": "0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD" +} diff --git a/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/sepolia.json b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/sepolia.json new file mode 100644 index 0000000..9965082 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptor": "0xdcdbf71A870cc60C6F9B621E28a7D3Ffd6Dd4965" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/zkevm.json b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/zkevm.json new file mode 100644 index 0000000..9965082 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/output/zkevm.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptor": "0xdcdbf71A870cc60C6F9B621E28a7D3Ffd6Dd4965" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/readme.md b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/readme.md new file mode 100644 index 0000000..9e3274a --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-authorizer-adaptor/readme.md @@ -0,0 +1,21 @@ +# 2022-03-25 - Authorizer Adaptor + +Deployment of the `AuthorizerAdaptor`, a gateway contract which allows compatibility between the Authorizer and systems which rely on having a single administrator address. + +The adaptor may then be the admin for these systems and acts as a proxy forwarding on calls subject to the caller's permissions on the Authorizer. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Fantom mainnet addresses](./output/fantom.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`AuthorizerAdaptor` artifact](./artifact/AuthorizerAdaptor.json) diff --git a/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/artifact/BALTokenHolderFactory.json b/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/artifact/BALTokenHolderFactory.json new file mode 100644 index 0000000..2721da9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/artifact/BALTokenHolderFactory.json @@ -0,0 +1,110 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BALTokenHolderFactory", + "sourceName": "contracts/BALTokenHolderFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IBalancerToken", + "name": "balancerToken", + "type": "address" + }, + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract BALTokenHolder", + "name": "balTokenHolder", + "type": "address" + }, + { + "indexed": false, + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "BALTokenHolderCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract IBALTokenHolder", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getBalancerToken", + "outputs": [ + { + "internalType": "contract IBalancerToken", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "holder", + "type": "address" + } + ], + "name": "isHolderFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60c060405234801561001057600080fd5b50604051610f1c380380610f1c8339818101604052604081101561003357600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c610e9e61007e600039806101a45250806103a45250610e9e6000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806336390717146100515780638d928af814610098578063b6a46b3b146100c9578063c00396991461016f575b600080fd5b6100846004803603602081101561006757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610177565b604080519115158252519081900360200190f35b6100a06101a2565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6100a0600480360360208110156100df57600080fd5b8101906020810181356401000000008111156100fa57600080fd5b82018360208201111561010c57600080fd5b8035906020019184600183028401116401000000008311171561012e57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506101c6945050505050565b6100a06103a2565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000806101d16103a2565b6101d96101a2565b846040516101e6906103c6565b808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610258578181015183820152602001610240565b50505050905090810190601f1680156102855780820380516001836020036101000a031916815260200191505b50945050505050604051809103906000f0801580156102a8573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff811660008181526020818152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055805193845283820181815288519185019190915287519495507f59750620eb9a4ec5e0719f2a764a31cf79c10817ba43fd86384231337e71db94948694899490936060850192908601918190849084905b83811015610361578181015183820152602001610349565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a192915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a95806103d48339019056fe60e060405234801561001057600080fd5b50604051610a95380380610a958339818101604052606081101561003357600080fd5b8151602083015160408085018051915193959294830192918464010000000082111561005e57600080fd5b90830190602082018581111561007357600080fd5b825164010000000081118282018810171561008d57600080fd5b82525081516020918201929091019080838360005b838110156100ba5781810151838201526020016100a2565b50505050905090810190601f1680156100e75780820380516001836020036101000a031916815260200191505b50604052505030608052506001600160601b0319606084811b821660a05283901b1660c052805161011f906000906020840190610128565b505050506101bb565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061016957805160ff1916838001178555610196565b82800160010185558215610196579182015b8281111561019657825182559160200191906001019061017b565b506101a29291506101a6565b5090565b5b808211156101a257600081556001016101a7565b60805160a05160601c60c05160601c61089e6101f76000398061041f52508061033e52806104c352806105075250806102c9525061089e6000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80638d928af81161005b5780638d928af814610195578063aaabadc5146101c6578063c0039699146101ce578063c1075329146101d65761007d565b806317d7de7c14610082578063851c1bb3146100ff5780638b6ca32c14610150575b600080fd5b61008a61020f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100c45781810151838201526020016100ac565b50505050905090810190601f1680156100f15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013e6004803603602081101561011557600080fd5b50357fffffffff00000000000000000000000000000000000000000000000000000000166102c3565b60408051918252519081900360200190f35b6101936004803603606081101561016657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610334565b005b61019d61041d565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61019d610441565b61019d6104c1565b610193600480360360408110156101ec57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356104e5565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156102b95780601f1061028e576101008083540402835291602001916102b9565b820191906000526020600020905b81548152906001019060200180831161029c57829003601f168201915b5050505050905090565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b61033c610532565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156103f757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616e6e6f742073776565702042414c00000000000000000000000000000000604482015290519081900360640190fd5b61041873ffffffffffffffffffffffffffffffffffffffff8416838361057b565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061044b61041d565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561049057600080fd5b505afa1580156104a4573d6000803e3d6000fd5b505050506040513d60208110156104ba57600080fd5b5051905090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6104ed610532565b61052e73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016838361057b565b5050565b60006105616000357fffffffff00000000000000000000000000000000000000000000000000000000166102c3565b90506105786105708233610608565b6101916106d1565b50565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526104189084906106df565b6000610612610441565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b15801561069e57600080fd5b505afa1580156106b2573d6000803e3d6000fd5b505050506040513d60208110156106c857600080fd5b50519392505050565b8161052e5761052e816107fb565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b6020831061074857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161070b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146107aa576040519150601f19603f3d011682016040523d82523d6000602084013e6107af565b606091505b509150915060008214156107c7573d6000803e3d6000fd5b6107f58151600014806107ed57508180602001905160208110156107ea57600080fd5b50515b6101a26106d1565b50505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fdfea26469706673582212205a8a43a7cbfa9ff6e66e83727518c787c38d36ffbb4744b6d3f058a83c609ee464736f6c63430007010033a26469706673582212205d88c307be0c679d023c0d862eda14589cf380fc64a01ae587b23d67ff9e649764736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806336390717146100515780638d928af814610098578063b6a46b3b146100c9578063c00396991461016f575b600080fd5b6100846004803603602081101561006757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610177565b604080519115158252519081900360200190f35b6100a06101a2565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6100a0600480360360208110156100df57600080fd5b8101906020810181356401000000008111156100fa57600080fd5b82018360208201111561010c57600080fd5b8035906020019184600183028401116401000000008311171561012e57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506101c6945050505050565b6100a06103a2565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000806101d16103a2565b6101d96101a2565b846040516101e6906103c6565b808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610258578181015183820152602001610240565b50505050905090810190601f1680156102855780820380516001836020036101000a031916815260200191505b50945050505050604051809103906000f0801580156102a8573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff811660008181526020818152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055805193845283820181815288519185019190915287519495507f59750620eb9a4ec5e0719f2a764a31cf79c10817ba43fd86384231337e71db94948694899490936060850192908601918190849084905b83811015610361578181015183820152602001610349565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a192915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a95806103d48339019056fe60e060405234801561001057600080fd5b50604051610a95380380610a958339818101604052606081101561003357600080fd5b8151602083015160408085018051915193959294830192918464010000000082111561005e57600080fd5b90830190602082018581111561007357600080fd5b825164010000000081118282018810171561008d57600080fd5b82525081516020918201929091019080838360005b838110156100ba5781810151838201526020016100a2565b50505050905090810190601f1680156100e75780820380516001836020036101000a031916815260200191505b50604052505030608052506001600160601b0319606084811b821660a05283901b1660c052805161011f906000906020840190610128565b505050506101bb565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061016957805160ff1916838001178555610196565b82800160010185558215610196579182015b8281111561019657825182559160200191906001019061017b565b506101a29291506101a6565b5090565b5b808211156101a257600081556001016101a7565b60805160a05160601c60c05160601c61089e6101f76000398061041f52508061033e52806104c352806105075250806102c9525061089e6000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80638d928af81161005b5780638d928af814610195578063aaabadc5146101c6578063c0039699146101ce578063c1075329146101d65761007d565b806317d7de7c14610082578063851c1bb3146100ff5780638b6ca32c14610150575b600080fd5b61008a61020f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100c45781810151838201526020016100ac565b50505050905090810190601f1680156100f15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013e6004803603602081101561011557600080fd5b50357fffffffff00000000000000000000000000000000000000000000000000000000166102c3565b60408051918252519081900360200190f35b6101936004803603606081101561016657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610334565b005b61019d61041d565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61019d610441565b61019d6104c1565b610193600480360360408110156101ec57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356104e5565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156102b95780601f1061028e576101008083540402835291602001916102b9565b820191906000526020600020905b81548152906001019060200180831161029c57829003601f168201915b5050505050905090565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b61033c610532565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156103f757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616e6e6f742073776565702042414c00000000000000000000000000000000604482015290519081900360640190fd5b61041873ffffffffffffffffffffffffffffffffffffffff8416838361057b565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061044b61041d565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561049057600080fd5b505afa1580156104a4573d6000803e3d6000fd5b505050506040513d60208110156104ba57600080fd5b5051905090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6104ed610532565b61052e73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016838361057b565b5050565b60006105616000357fffffffff00000000000000000000000000000000000000000000000000000000166102c3565b90506105786105708233610608565b6101916106d1565b50565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526104189084906106df565b6000610612610441565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b15801561069e57600080fd5b505afa1580156106b2573d6000803e3d6000fd5b505050506040513d60208110156106c857600080fd5b50519392505050565b8161052e5761052e816107fb565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b6020831061074857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161070b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146107aa576040519150601f19603f3d011682016040523d82523d6000602084013e6107af565b606091505b509150915060008214156107c7573d6000803e3d6000fd5b6107f58151600014806107ed57508180602001905160208110156107ea57600080fd5b50515b6101a26106d1565b50505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fdfea26469706673582212205a8a43a7cbfa9ff6e66e83727518c787c38d36ffbb4744b6d3f058a83c609ee464736f6c63430007010033a26469706673582212205d88c307be0c679d023c0d862eda14589cf380fc64a01ae587b23d67ff9e649764736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/index.ts b/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/index.ts new file mode 100644 index 0000000..834262a --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { BalTokenHolderFactoryDelegationDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as BalTokenHolderFactoryDelegationDeployment; + + const args = [input.BAL, input.Vault]; + await task.deployAndVerify('BALTokenHolderFactory', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/input.ts b/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/input.ts new file mode 100644 index 0000000..514a104 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/input.ts @@ -0,0 +1,25 @@ +import { Task, TaskMode } from '@src'; + +export type BalTokenHolderFactoryDelegationDeployment = { + Vault: string; + BAL: string; +}; + +const TestBALTask = new Task('20220325-test-balancer-token', TaskMode.READ_ONLY); +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, + mainnet: { + BAL: '0xba100000625a3754423978a60c9317c58a424e3D', + }, + kovan: { + BAL: TestBALTask.output({ network: 'kovan' }).TestBalancerToken, + }, + goerli: { + BAL: TestBALTask.output({ network: 'goerli' }).TestBalancerToken, + }, + sepolia: { + BAL: TestBALTask.output({ network: 'sepolia' }).TestBalancerToken, + }, +}; diff --git a/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/output/goerli.json b/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/output/goerli.json new file mode 100644 index 0000000..c36af05 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/output/goerli.json @@ -0,0 +1,3 @@ +{ + "BALTokenHolderFactory": "0x45E617B07021B97407367624648d1A0A358a751A" +} diff --git a/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/output/kovan.json b/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/output/kovan.json new file mode 100644 index 0000000..95acf63 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/output/kovan.json @@ -0,0 +1,3 @@ +{ + "BALTokenHolderFactory": "0xa98Bce70c92aD2ef3288dbcd659bC0d6b62f8F13" +} diff --git a/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/output/mainnet.json b/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/output/mainnet.json new file mode 100644 index 0000000..f4a7acf --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "BALTokenHolderFactory": "0xB848f50141F3D4255b37aC288C25C109104F2158" +} diff --git a/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/output/sepolia.json b/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/output/sepolia.json new file mode 100644 index 0000000..193e022 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "BALTokenHolderFactory": "0xEF454a7B3f965D3f6723E462405246f8Cd865425" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/readme.md b/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/readme.md new file mode 100644 index 0000000..b0d8d90 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-bal-token-holder-factory/readme.md @@ -0,0 +1,10 @@ +# 2022-03-25 - BAL Token Holder Factory + +Deployment of `BALTokenHolderFactory` which deploys simple contracts which holds BAL tokens such that only addresses specified by Balancer governance may withdraw them. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`BALTokenHolderFactory` artifact](./artifact/BALTokenHolderFactory.json) diff --git a/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/artifact/BalancerTokenAdmin.json b/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/artifact/BalancerTokenAdmin.json new file mode 100644 index 0000000..b1e9842 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/artifact/BalancerTokenAdmin.json @@ -0,0 +1,406 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BalancerTokenAdmin", + "sourceName": "contracts/BalancerTokenAdmin.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IBalancerToken", + "name": "balancerToken", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "rate", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "supply", + "type": "uint256" + } + ], + "name": "MiningParametersUpdated", + "type": "event" + }, + { + "inputs": [], + "name": "INITIAL_RATE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RATE_DENOMINATOR", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RATE_REDUCTION_COEFFICIENT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RATE_REDUCTION_TIME", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "activate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "available_supply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "futureEpochTimeWrite", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "future_epoch_time_write", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAvailableSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBalancerToken", + "outputs": [ + { + "internalType": "contract IBalancerToken", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getFutureEpochTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getInflationRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMiningEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStartEpochSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStartEpochTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + } + ], + "name": "mintableInTimeframe", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + } + ], + "name": "mintable_in_timeframe", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "snapshot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "startEpochTimeWrite", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "start_epoch_time_write", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "updateMiningParameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "update_mining_parameters", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60e060405260001960025534801561001657600080fd5b506040516120503803806120508339818101604052604081101561003957600080fd5b5080516020909101513060805260016000556001600160601b0319606091821b811660c05291901b1660a05260805160a05160601c60c05160601c611f3c610114600039806103d052806104a6528061055e528061062052806106d2528061077e5280610874528061093052806109935280610a3f5280610b355280610bf15280610c545280610d015280610dc55280610ecd5280610f2e528061106852806111625280611211528061130252806113f35280611562528061163752806117a552806118b952508061177952508061170c5250611f3c6000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c8063851c1bb3116100f9578063b87b561611610097578063c3b03fa811610071578063c3b03fa8146102fb578063cb626ae21461031e578063d43b40fa1461031e578063d725a9ca146102fb576101b9565b8063b87b5616146102eb578063c0039699146102f3578063c167d1cd146101f2576101b9565b8063a228bced116100d3578063a228bced146102db578063aaabadc5146102e3578063adc4cf43146102db578063b26b238e146101fa576101b9565b8063851c1bb3146102635780638d928af8146102a25780639711715a146102d3576101b9565b80632c4e722e116101665780634dbac733116101405780634dbac7331461024b57806355f74176146102535780637efad8e01461025b578063819df2c414610202576101b9565b80632c4e722e1461020257806340c10f191461020a5780634d2fa41314610243576101b9565b806321609bbf1161019757806321609bbf146101ea57806324f92a25146101f2578063277dbafb146101fa576101b9565b8063087905c9146101be5780630dfbdce4146101d85780630f15f4c0146101e0575b600080fd5b6101c6610326565b60408051918252519081900360200190f35b6101c661032d565b6101e8610346565b005b6101c66114f9565b6101c6611505565b6101c661150f565b6101c6611527565b6101e86004803603604081101561022057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561152d565b6101c66116e2565b6101c66116e8565b6101c66116f4565b6101c66116fa565b6101c66004803603602081101561027957600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016611706565b6102aa611777565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101e861179b565b6101c6611825565b6102aa61182f565b6101c66118af565b6102aa6118b7565b6101c66004803603604081101561031157600080fd5b50803590602001356118db565b6101e86118ee565b6001545b90565b600254600090610341906301e1338061195b565b905090565b61034e61196d565b610356611986565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600254146103cc576040805162461bcd60e51b815260206004820152601160248201527f416c726561647920616374697661746564000000000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d53913936040518163ffffffff1660e01b815260040160206040518083038186803b15801561043457600080fd5b505afa158015610448573d6000803e3d6000fd5b505050506040513d602081101561045e57600080fd5b5051604080517f7028e2cd000000000000000000000000000000000000000000000000000000008152905191925060009173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691637028e2cd916004808301926020929190829003018186803b1580156104ec57600080fd5b505afa158015610500573d6000803e3d6000fd5b505050506040513d602081101561051657600080fd5b5051604080517fa217fddf000000000000000000000000000000000000000000000000000000008152905191925060009173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163a217fddf916004808301926020929190829003018186803b1580156105a457600080fd5b505afa1580156105b8573d6000803e3d6000fd5b505050506040513d60208110156105ce57600080fd5b5051604080517f91d1485400000000000000000000000000000000000000000000000000000000815260048101839052306024820152905191925073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916391d1485491604480820192602092909190829003018186803b15801561066757600080fd5b505afa15801561067b573d6000803e3d6000fd5b505050506040513d602081101561069157600080fd5b50516106ce5760405162461bcd60e51b8152600401808060200182810382526022815260200180611e6e6022913960400191505060405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca15c873856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561074157600080fd5b505afa158015610755573d6000803e3d6000fd5b505050506040513d602081101561076b57600080fd5b5051905060005b818110156108e25760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639010d07c8760006040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156107f657600080fd5b505afa15801561080a573d6000803e3d6000fd5b505050506040513d602081101561082057600080fd5b5051604080517fd547741f0000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff808416602483015291519293507f00000000000000000000000000000000000000000000000000000000000000009091169163d547741f9160448082019260009290919082900301818387803b1580156108be57600080fd5b505af11580156108d2573d6000803e3d6000fd5b5050505050806001019050610772565b50604080517f2f2ff15d00000000000000000000000000000000000000000000000000000000815260048101869052306024820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691632f2ff15d91604480830192600092919082900301818387803b15801561097757600080fd5b505af115801561098b573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca15c873856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610a0257600080fd5b505afa158015610a16573d6000803e3d6000fd5b505050506040513d6020811015610a2c57600080fd5b5051905060005b81811015610ba35760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639010d07c8760006040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015610ab757600080fd5b505afa158015610acb573d6000803e3d6000fd5b505050506040513d6020811015610ae157600080fd5b5051604080517fd547741f0000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff808416602483015291519293507f00000000000000000000000000000000000000000000000000000000000000009091169163d547741f9160448082019260009290919082900301818387803b158015610b7f57600080fd5b505af1158015610b93573d6000803e3d6000fd5b5050505050806001019050610a33565b50604080517f2f2ff15d00000000000000000000000000000000000000000000000000000000815260048101869052306024820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691632f2ff15d91604480830192600092919082900301818387803b158015610c3857600080fd5b505af1158015610c4c573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca15c873856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610cc357600080fd5b505afa158015610cd7573d6000803e3d6000fd5b505050506040513d6020811015610ced57600080fd5b505190506000805b82811015610e7f5760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639010d07c88856040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015610d7857600080fd5b505afa158015610d8c573d6000803e3d6000fd5b505050506040513d6020811015610da257600080fd5b5051905073ffffffffffffffffffffffffffffffffffffffff81163014610e71577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d547741f88836040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b158015610e5457600080fd5b505af1158015610e68573d6000803e3d6000fd5b50505050610e76565b600192505b50600101610cf5565b50604080517fd547741f00000000000000000000000000000000000000000000000000000000815260048101879052306024820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163d547741f91604480830192600092919082900301818387803b158015610f1457600080fd5b505af1158015610f28573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca15c873866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610f9d57600080fd5b505afa158015610fb1573d6000803e3d6000fd5b505050506040513d6020811015610fc757600080fd5b50511561101b576040805162461bcd60e51b815260206004820181905260248201527f416464726573732065786973747320776974682061646d696e20726967687473604482015290519081900360640190fd5b604080517f91d1485400000000000000000000000000000000000000000000000000000000815260048101899052306024820152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916391d14854916044808301926020929190829003018186803b1580156110ae57600080fd5b505afa1580156110c2573d6000803e3d6000fd5b505050506040513d60208110156110d857600080fd5b50516111155760405162461bcd60e51b8152600401808060200182810382526022815260200180611ee56022913960400191505060405180910390fd5b604080517f91d1485400000000000000000000000000000000000000000000000000000000815260048101889052306024820152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916391d14854916044808301926020929190829003018186803b1580156111a857600080fd5b505afa1580156111bc573d6000803e3d6000fd5b505050506040513d60208110156111d257600080fd5b505161120f5760405162461bcd60e51b8152600401808060200182810382526027815260200180611e906027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca15c873886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561128057600080fd5b505afa158015611294573d6000803e3d6000fd5b505050506040513d60208110156112aa57600080fd5b5051600114611300576040805162461bcd60e51b815260206004820152601660248201527f4d756c7469706c65206d696e7465727320657869737400000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca15c873876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561137157600080fd5b505afa158015611385573d6000803e3d6000fd5b505050506040513d602081101561139b57600080fd5b50516001146113f1576040805162461bcd60e51b815260206004820152601b60248201527f4d756c7469706c6520736e617073686f74746572732065786973740000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561145757600080fd5b505afa15801561146b573d6000803e3d6000fd5b505050506040513d602081101561148157600080fd5b50516003554260025562093a80691eb4773b6d1318a00000046004557fa96ad9a0b81b29565fbe231714a2f2c152b759e603c91bf87144a3f61944f0a562093a80691eb4773b6d1318a000006003546040805193909204835260208301528051918290030190a1505050505050506114f76119cf565b565b671080e992061ab30081565b60006103416119d6565b60006103416301e13380611521611a10565b9061195b565b60045490565b611535611986565b600254611546906301e1338061195b565b421061155457611554611a3c565b61155c6119d6565b6115f8827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115c657600080fd5b505afa1580156115da573d6000803e3d6000fd5b505050506040513d60208110156115f057600080fd5b50519061195b565b11156116355760405162461bcd60e51b815260040180806020018281038252602e815260200180611eb7602e913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f1983836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156116c657600080fd5b505af11580156116da573d6000803e3d6000fd5b505050505050565b60025490565b670353c226d6c6f58081565b60035490565b670de0b6b3a764000081565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6117a3611986565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639711715a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561180b57600080fd5b505af115801561181f573d6000803e3d6000fd5b50505050565b6000610341611a10565b6000611839611777565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561187e57600080fd5b505afa158015611892573d6000803e3d6000fd5b505050506040513d60208110156118a857600080fd5b5051905090565b6301e1338081565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006118e78383611af8565b9392505050565b6002546118ff906301e1338061195b565b421015611953576040805162461bcd60e51b815260206004820152601a60248201527f45706f636820686173206e6f742066696e697368656420796574000000000000604482015290519081900360640190fd5b6114f7611a3c565b60008282016118e78482101583611ce5565b61197f60026000541415610190611ce5565b6002600055565b60006119b56000357fffffffff0000000000000000000000000000000000000000000000000000000016611706565b90506119cc6119c48233611cf7565b610191611ce5565b50565b6001600055565b6000806119fa6004546119f460025442611dc090919063ffffffff16565b90611dd6565b600354909150611a0a908261195b565b91505090565b600254600090611a24816301e1338061195b565b421061034157611a32611a3c565b505060025461032a565b6004546000611a5b611a52836301e13380611dd6565b6003549061195b565b9050611a81671080e992061ab300611a7b84670de0b6b3a7640000611dd6565b90611dfa565b9150611a986001805461195b90919063ffffffff16565b600155600254611aac906301e1338061195b565b60025560048290556003819055604080518381526020810183905281517fa96ad9a0b81b29565fbe231714a2f2c152b759e603c91bf87144a3f61944f0a5929181900390910190a15050565b600081831115611b4f576040805162461bcd60e51b815260206004820152600b60248201527f7374617274203e20656e64000000000000000000000000000000000000000000604482015290519081900360640190fd5b600254600454611b63826301e1338061195b565b841115611b9b57611b78826301e1338061195b565b9150611b98671080e992061ab300611a7b83670de0b6b3a7640000611dd6565b90505b611ba9826301e1338061195b565b841115611bfd576040805162461bcd60e51b815260206004820152601160248201527f746f6f2066617220696e20667574757265000000000000000000000000000000604482015290519081900360640190fd5b6000805b6103e7811015611cdb57838610611c915785611c21856301e1338061195b565b811115611c3957611c36856301e1338061195b565b90505b87611c48866301e1338061195b565b8110611c55575050611cdb565b85811015611c605750845b611c7e611c77611c708484611dc0565b8790611dd6565b859061195b565b9350858910611c8e575050611cdb565b50505b611c9f846301e13380611dc0565b9350611cbf670de0b6b3a7640000611a7b85671080e992061ab300611dd6565b9250670353c226d6c6f580831115611cd357fe5b600101611c01565b5095945050505050565b81611cf357611cf381611e1a565b5050565b6000611d0161182f565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b158015611d8d57600080fd5b505afa158015611da1573d6000803e3d6000fd5b505050506040513d6020811015611db757600080fd5b50519392505050565b6000611dd0838311156001611ce5565b50900390565b60008282026118e7841580611df3575083858381611df057fe5b04145b6003611ce5565b6000611e098215156004611ce5565b818381611e1257fe5b049392505050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fdfe42616c616e636572546f6b656e41646d696e206973206e6f7420616e2061646d696e42616c616e636572546f6b656e41646d696e206973206e6f74206120736e617073686f747465724d696e7420616d6f756e7420657863656564732072656d61696e696e6720617661696c61626c6520737570706c7942616c616e636572546f6b656e41646d696e206973206e6f742061206d696e746572a26469706673582212207cb2164b73fb9dc993246bda3c01dd6ad4d3788b15443ce3c9d688c15dbacbb664736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101b95760003560e01c8063851c1bb3116100f9578063b87b561611610097578063c3b03fa811610071578063c3b03fa8146102fb578063cb626ae21461031e578063d43b40fa1461031e578063d725a9ca146102fb576101b9565b8063b87b5616146102eb578063c0039699146102f3578063c167d1cd146101f2576101b9565b8063a228bced116100d3578063a228bced146102db578063aaabadc5146102e3578063adc4cf43146102db578063b26b238e146101fa576101b9565b8063851c1bb3146102635780638d928af8146102a25780639711715a146102d3576101b9565b80632c4e722e116101665780634dbac733116101405780634dbac7331461024b57806355f74176146102535780637efad8e01461025b578063819df2c414610202576101b9565b80632c4e722e1461020257806340c10f191461020a5780634d2fa41314610243576101b9565b806321609bbf1161019757806321609bbf146101ea57806324f92a25146101f2578063277dbafb146101fa576101b9565b8063087905c9146101be5780630dfbdce4146101d85780630f15f4c0146101e0575b600080fd5b6101c6610326565b60408051918252519081900360200190f35b6101c661032d565b6101e8610346565b005b6101c66114f9565b6101c6611505565b6101c661150f565b6101c6611527565b6101e86004803603604081101561022057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561152d565b6101c66116e2565b6101c66116e8565b6101c66116f4565b6101c66116fa565b6101c66004803603602081101561027957600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016611706565b6102aa611777565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101e861179b565b6101c6611825565b6102aa61182f565b6101c66118af565b6102aa6118b7565b6101c66004803603604081101561031157600080fd5b50803590602001356118db565b6101e86118ee565b6001545b90565b600254600090610341906301e1338061195b565b905090565b61034e61196d565b610356611986565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600254146103cc576040805162461bcd60e51b815260206004820152601160248201527f416c726561647920616374697661746564000000000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d53913936040518163ffffffff1660e01b815260040160206040518083038186803b15801561043457600080fd5b505afa158015610448573d6000803e3d6000fd5b505050506040513d602081101561045e57600080fd5b5051604080517f7028e2cd000000000000000000000000000000000000000000000000000000008152905191925060009173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691637028e2cd916004808301926020929190829003018186803b1580156104ec57600080fd5b505afa158015610500573d6000803e3d6000fd5b505050506040513d602081101561051657600080fd5b5051604080517fa217fddf000000000000000000000000000000000000000000000000000000008152905191925060009173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163a217fddf916004808301926020929190829003018186803b1580156105a457600080fd5b505afa1580156105b8573d6000803e3d6000fd5b505050506040513d60208110156105ce57600080fd5b5051604080517f91d1485400000000000000000000000000000000000000000000000000000000815260048101839052306024820152905191925073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916391d1485491604480820192602092909190829003018186803b15801561066757600080fd5b505afa15801561067b573d6000803e3d6000fd5b505050506040513d602081101561069157600080fd5b50516106ce5760405162461bcd60e51b8152600401808060200182810382526022815260200180611e6e6022913960400191505060405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca15c873856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561074157600080fd5b505afa158015610755573d6000803e3d6000fd5b505050506040513d602081101561076b57600080fd5b5051905060005b818110156108e25760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639010d07c8760006040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156107f657600080fd5b505afa15801561080a573d6000803e3d6000fd5b505050506040513d602081101561082057600080fd5b5051604080517fd547741f0000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff808416602483015291519293507f00000000000000000000000000000000000000000000000000000000000000009091169163d547741f9160448082019260009290919082900301818387803b1580156108be57600080fd5b505af11580156108d2573d6000803e3d6000fd5b5050505050806001019050610772565b50604080517f2f2ff15d00000000000000000000000000000000000000000000000000000000815260048101869052306024820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691632f2ff15d91604480830192600092919082900301818387803b15801561097757600080fd5b505af115801561098b573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca15c873856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610a0257600080fd5b505afa158015610a16573d6000803e3d6000fd5b505050506040513d6020811015610a2c57600080fd5b5051905060005b81811015610ba35760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639010d07c8760006040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015610ab757600080fd5b505afa158015610acb573d6000803e3d6000fd5b505050506040513d6020811015610ae157600080fd5b5051604080517fd547741f0000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff808416602483015291519293507f00000000000000000000000000000000000000000000000000000000000000009091169163d547741f9160448082019260009290919082900301818387803b158015610b7f57600080fd5b505af1158015610b93573d6000803e3d6000fd5b5050505050806001019050610a33565b50604080517f2f2ff15d00000000000000000000000000000000000000000000000000000000815260048101869052306024820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691632f2ff15d91604480830192600092919082900301818387803b158015610c3857600080fd5b505af1158015610c4c573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca15c873856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610cc357600080fd5b505afa158015610cd7573d6000803e3d6000fd5b505050506040513d6020811015610ced57600080fd5b505190506000805b82811015610e7f5760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639010d07c88856040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015610d7857600080fd5b505afa158015610d8c573d6000803e3d6000fd5b505050506040513d6020811015610da257600080fd5b5051905073ffffffffffffffffffffffffffffffffffffffff81163014610e71577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d547741f88836040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b158015610e5457600080fd5b505af1158015610e68573d6000803e3d6000fd5b50505050610e76565b600192505b50600101610cf5565b50604080517fd547741f00000000000000000000000000000000000000000000000000000000815260048101879052306024820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163d547741f91604480830192600092919082900301818387803b158015610f1457600080fd5b505af1158015610f28573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca15c873866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610f9d57600080fd5b505afa158015610fb1573d6000803e3d6000fd5b505050506040513d6020811015610fc757600080fd5b50511561101b576040805162461bcd60e51b815260206004820181905260248201527f416464726573732065786973747320776974682061646d696e20726967687473604482015290519081900360640190fd5b604080517f91d1485400000000000000000000000000000000000000000000000000000000815260048101899052306024820152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916391d14854916044808301926020929190829003018186803b1580156110ae57600080fd5b505afa1580156110c2573d6000803e3d6000fd5b505050506040513d60208110156110d857600080fd5b50516111155760405162461bcd60e51b8152600401808060200182810382526022815260200180611ee56022913960400191505060405180910390fd5b604080517f91d1485400000000000000000000000000000000000000000000000000000000815260048101889052306024820152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916391d14854916044808301926020929190829003018186803b1580156111a857600080fd5b505afa1580156111bc573d6000803e3d6000fd5b505050506040513d60208110156111d257600080fd5b505161120f5760405162461bcd60e51b8152600401808060200182810382526027815260200180611e906027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca15c873886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561128057600080fd5b505afa158015611294573d6000803e3d6000fd5b505050506040513d60208110156112aa57600080fd5b5051600114611300576040805162461bcd60e51b815260206004820152601660248201527f4d756c7469706c65206d696e7465727320657869737400000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca15c873876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561137157600080fd5b505afa158015611385573d6000803e3d6000fd5b505050506040513d602081101561139b57600080fd5b50516001146113f1576040805162461bcd60e51b815260206004820152601b60248201527f4d756c7469706c6520736e617073686f74746572732065786973740000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561145757600080fd5b505afa15801561146b573d6000803e3d6000fd5b505050506040513d602081101561148157600080fd5b50516003554260025562093a80691eb4773b6d1318a00000046004557fa96ad9a0b81b29565fbe231714a2f2c152b759e603c91bf87144a3f61944f0a562093a80691eb4773b6d1318a000006003546040805193909204835260208301528051918290030190a1505050505050506114f76119cf565b565b671080e992061ab30081565b60006103416119d6565b60006103416301e13380611521611a10565b9061195b565b60045490565b611535611986565b600254611546906301e1338061195b565b421061155457611554611a3c565b61155c6119d6565b6115f8827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115c657600080fd5b505afa1580156115da573d6000803e3d6000fd5b505050506040513d60208110156115f057600080fd5b50519061195b565b11156116355760405162461bcd60e51b815260040180806020018281038252602e815260200180611eb7602e913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f1983836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156116c657600080fd5b505af11580156116da573d6000803e3d6000fd5b505050505050565b60025490565b670353c226d6c6f58081565b60035490565b670de0b6b3a764000081565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6117a3611986565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639711715a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561180b57600080fd5b505af115801561181f573d6000803e3d6000fd5b50505050565b6000610341611a10565b6000611839611777565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561187e57600080fd5b505afa158015611892573d6000803e3d6000fd5b505050506040513d60208110156118a857600080fd5b5051905090565b6301e1338081565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006118e78383611af8565b9392505050565b6002546118ff906301e1338061195b565b421015611953576040805162461bcd60e51b815260206004820152601a60248201527f45706f636820686173206e6f742066696e697368656420796574000000000000604482015290519081900360640190fd5b6114f7611a3c565b60008282016118e78482101583611ce5565b61197f60026000541415610190611ce5565b6002600055565b60006119b56000357fffffffff0000000000000000000000000000000000000000000000000000000016611706565b90506119cc6119c48233611cf7565b610191611ce5565b50565b6001600055565b6000806119fa6004546119f460025442611dc090919063ffffffff16565b90611dd6565b600354909150611a0a908261195b565b91505090565b600254600090611a24816301e1338061195b565b421061034157611a32611a3c565b505060025461032a565b6004546000611a5b611a52836301e13380611dd6565b6003549061195b565b9050611a81671080e992061ab300611a7b84670de0b6b3a7640000611dd6565b90611dfa565b9150611a986001805461195b90919063ffffffff16565b600155600254611aac906301e1338061195b565b60025560048290556003819055604080518381526020810183905281517fa96ad9a0b81b29565fbe231714a2f2c152b759e603c91bf87144a3f61944f0a5929181900390910190a15050565b600081831115611b4f576040805162461bcd60e51b815260206004820152600b60248201527f7374617274203e20656e64000000000000000000000000000000000000000000604482015290519081900360640190fd5b600254600454611b63826301e1338061195b565b841115611b9b57611b78826301e1338061195b565b9150611b98671080e992061ab300611a7b83670de0b6b3a7640000611dd6565b90505b611ba9826301e1338061195b565b841115611bfd576040805162461bcd60e51b815260206004820152601160248201527f746f6f2066617220696e20667574757265000000000000000000000000000000604482015290519081900360640190fd5b6000805b6103e7811015611cdb57838610611c915785611c21856301e1338061195b565b811115611c3957611c36856301e1338061195b565b90505b87611c48866301e1338061195b565b8110611c55575050611cdb565b85811015611c605750845b611c7e611c77611c708484611dc0565b8790611dd6565b859061195b565b9350858910611c8e575050611cdb565b50505b611c9f846301e13380611dc0565b9350611cbf670de0b6b3a7640000611a7b85671080e992061ab300611dd6565b9250670353c226d6c6f580831115611cd357fe5b600101611c01565b5095945050505050565b81611cf357611cf381611e1a565b5050565b6000611d0161182f565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b158015611d8d57600080fd5b505afa158015611da1573d6000803e3d6000fd5b505050506040513d6020811015611db757600080fd5b50519392505050565b6000611dd0838311156001611ce5565b50900390565b60008282026118e7841580611df3575083858381611df057fe5b04145b6003611ce5565b6000611e098215156004611ce5565b818381611e1257fe5b049392505050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fdfe42616c616e636572546f6b656e41646d696e206973206e6f7420616e2061646d696e42616c616e636572546f6b656e41646d696e206973206e6f74206120736e617073686f747465724d696e7420616d6f756e7420657863656564732072656d61696e696e6720617661696c61626c6520737570706c7942616c616e636572546f6b656e41646d696e206973206e6f742061206d696e746572a26469706673582212207cb2164b73fb9dc993246bda3c01dd6ad4d3788b15443ce3c9d688c15dbacbb664736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/bal_supply.md b/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/bal_supply.md new file mode 100644 index 0000000..f922baf --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/bal_supply.md @@ -0,0 +1,124 @@ +# Expected BAL supply under the veBAL system + +| Date | Supply | +| -------- | -------- | +| March 28 2022 | 48,982,143 | +| March 28 2023 | 56,190,714 | +| March 27 2024 | 62,548,492 | +| March 27 2025 | 67,894,724 | +| March 27 2026 | 72,390,352 | +| March 27 2027 | 76,170,709 | +| March 26 2028 | 79,349,598 | +| March 26 2029 | 82,022,714 | +| March 26 2030 | 84,270,528 | +| March 26 2031 | 86,160,706 | +| March 25 2032 | 87,750,151 | +| March 25 2033 | 89,086,709 | +| March 25 2034 | 90,210,616 | +| March 25 2035 | 91,155,705 | +| March 24 2036 | 91,950,427 | +| March 24 2037 | 92,618,706 | +| March 24 2038 | 93,180,660 | +| March 24 2039 | 93,653,204 | +| March 23 2040 | 94,050,565 | +| March 23 2041 | 94,384,705 | +| March 23 2042 | 94,665,682 | +| March 23 2043 | 94,901,954 | +| March 22 2044 | 95,100,634 | +| March 22 2045 | 95,267,704 | +| March 22 2046 | 95,408,193 | +| March 22 2047 | 95,526,329 | +| March 21 2048 | 95,625,669 | +| March 21 2049 | 95,709,204 | +| March 21 2050 | 95,779,448 | +| March 21 2051 | 95,838,516 | +| March 20 2052 | 95,888,186 | +| March 20 2053 | 95,929,954 | +| March 20 2054 | 95,965,076 | +| March 20 2055 | 95,994,610 | +| March 19 2056 | 96,019,445 | +| March 19 2057 | 96,040,329 | +| March 19 2058 | 96,057,890 | +| March 19 2059 | 96,072,657 | +| March 18 2060 | 96,085,074 | +| March 18 2061 | 96,095,516 | +| March 18 2062 | 96,104,297 | +| March 18 2063 | 96,111,680 | +| March 17 2064 | 96,117,889 | +| March 17 2065 | 96,123,110 | +| March 17 2066 | 96,127,500 | +| March 17 2067 | 96,131,192 | +| March 16 2068 | 96,134,296 | +| March 16 2069 | 96,136,907 | +| March 16 2070 | 96,139,102 | +| March 16 2071 | 96,140,948 | +| March 15 2072 | 96,142,500 | +| March 15 2073 | 96,143,805 | +| March 15 2074 | 96,144,903 | +| March 15 2075 | 96,145,826 | +| March 14 2076 | 96,146,602 | +| March 14 2077 | 96,147,254 | +| March 14 2078 | 96,147,803 | +| March 14 2079 | 96,148,265 | +| March 13 2080 | 96,148,653 | +| March 13 2081 | 96,148,979 | +| March 13 2082 | 96,149,253 | +| March 13 2083 | 96,149,484 | +| March 12 2084 | 96,149,678 | +| March 12 2085 | 96,149,841 | +| March 12 2086 | 96,149,978 | +| March 12 2087 | 96,150,094 | +| March 11 2088 | 96,150,191 | +| March 11 2089 | 96,150,272 | +| March 11 2090 | 96,150,341 | +| March 11 2091 | 96,150,399 | +| March 10 2092 | 96,150,447 | +| March 10 2093 | 96,150,488 | +| March 10 2094 | 96,150,522 | +| March 10 2095 | 96,150,551 | +| March 9 2096 | 96,150,575 | +| March 9 2097 | 96,150,596 | +| March 9 2098 | 96,150,613 | +| March 9 2099 | 96,150,627 | +| March 9 2100 | 96,150,639 | +| March 9 2101 | 96,150,650 | +| March 9 2102 | 96,150,658 | +| March 9 2103 | 96,150,665 | +| March 8 2104 | 96,150,672 | +| March 8 2105 | 96,150,677 | +| March 8 2106 | 96,150,681 | +| March 8 2107 | 96,150,685 | +| March 7 2108 | 96,150,688 | +| March 7 2109 | 96,150,690 | +| March 7 2110 | 96,150,692 | +| March 7 2111 | 96,150,694 | +| March 6 2112 | 96,150,696 | +| March 6 2113 | 96,150,697 | +| March 6 2114 | 96,150,698 | +| March 6 2115 | 96,150,699 | +| March 5 2116 | 96,150,700 | +| March 5 2117 | 96,150,700 | +| March 5 2118 | 96,150,701 | +| March 5 2119 | 96,150,701 | +| March 4 2120 | 96,150,702 | +| March 4 2121 | 96,150,702 | +| March 4 2122 | 96,150,702 | +| March 4 2123 | 96,150,702 | +| March 3 2124 | 96,150,703 | +| March 3 2125 | 96,150,703 | +| March 3 2126 | 96,150,703 | +| March 3 2127 | 96,150,703 | +| March 2 2128 | 96,150,703 | +| March 2 2129 | 96,150,703 | +| March 2 2130 | 96,150,703 | +| March 2 2131 | 96,150,703 | +| March 1 2132 | 96,150,703 | +| March 1 2133 | 96,150,703 | +| March 1 2134 | 96,150,703 | +| March 1 2135 | 96,150,703 | +| February 29 2136 | 96,150,703 | +| February 28 2137 | 96,150,703 | +| February 28 2138 | 96,150,703 | +| February 28 2139 | 96,150,703 | +| February 28 2140 | 96,150,703 | +| February 27 2141 | 96,150,704 | diff --git a/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/index.ts b/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/index.ts new file mode 100644 index 0000000..3060866 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { BalancerTokenAdminDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as BalancerTokenAdminDeployment; + + const args = [input.Vault, input.BAL]; + await task.deployAndVerify('BalancerTokenAdmin', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/input.ts b/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/input.ts new file mode 100644 index 0000000..fc2727f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/input.ts @@ -0,0 +1,25 @@ +import { Task, TaskMode } from '@src'; + +export type BalancerTokenAdminDeployment = { + BAL: string; + Vault: string; +}; + +const TestBALTask = new Task('20220325-test-balancer-token', TaskMode.READ_ONLY); +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, + mainnet: { + BAL: '0xba100000625a3754423978a60c9317c58a424e3D', + }, + kovan: { + BAL: TestBALTask.output({ network: 'kovan' }).TestBalancerToken, + }, + goerli: { + BAL: TestBALTask.output({ network: 'goerli' }).TestBalancerToken, + }, + sepolia: { + BAL: TestBALTask.output({ network: 'sepolia' }).TestBalancerToken, + }, +}; diff --git a/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/output/goerli.json b/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/output/goerli.json new file mode 100644 index 0000000..5769e5e --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/output/goerli.json @@ -0,0 +1,3 @@ +{ + "BalancerTokenAdmin": "0x0F32D7D830E20809Bcb9071581A696135dD472B7" +} diff --git a/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/output/kovan.json b/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/output/kovan.json new file mode 100644 index 0000000..27d8819 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/output/kovan.json @@ -0,0 +1,3 @@ +{ + "BalancerTokenAdmin": "0xAB093cd16e765b5B23D34030aaFaF026558e0A19" +} diff --git a/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/output/mainnet.json b/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/output/mainnet.json new file mode 100644 index 0000000..004eb9b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "BalancerTokenAdmin": "0xf302f9F50958c5593770FDf4d4812309fF77414f" +} diff --git a/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/output/sepolia.json b/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/output/sepolia.json new file mode 100644 index 0000000..8f48f8b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "BalancerTokenAdmin": "0x7d2248F194755DCa9A1887099394F39476d28C9a" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/readme.md b/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/readme.md new file mode 100644 index 0000000..8f0bebb --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-balancer-token-admin/readme.md @@ -0,0 +1,10 @@ +# 2022-03-25 - Balancer Token Admin + +Deployment of the `BalancerTokenAdmin`, for enforcing a specified BAL emission rate onchain. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`BalancerTokenAdmin` artifact](./artifact/BalancerTokenAdmin.json) diff --git a/balpy/balancer-deployments/tasks/20220325-gauge-controller/artifact/BalancerMinter.json b/balpy/balancer-deployments/tasks/20220325-gauge-controller/artifact/BalancerMinter.json new file mode 100644 index 0000000..d697662 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-gauge-controller/artifact/BalancerMinter.json @@ -0,0 +1,411 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BalancerMinter", + "sourceName": "contracts/BalancerMinter.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IBalancerTokenAdmin", + "name": "tokenAdmin", + "type": "address" + }, + { + "internalType": "contract IGaugeController", + "name": "gaugeController", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "gauge", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "minted", + "type": "uint256" + } + ], + "name": "Minted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approval", + "type": "bool" + } + ], + "name": "MinterApprovalSet", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "allowed_to_mint_for", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBalancerToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBalancerTokenAdmin", + "outputs": [ + { + "internalType": "contract IBalancerTokenAdmin", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeController", + "outputs": [ + { + "internalType": "contract IGaugeController", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "getMinterApproval", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "getNextNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "mintFor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "gauges", + "type": "address[]" + } + ], + "name": "mintMany", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "gauges", + "type": "address[]" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "mintManyFor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "mint_for", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[8]", + "name": "gauges", + "type": "address[8]" + } + ], + "name": "mint_many", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "minted", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "internalType": "bool", + "name": "approval", + "type": "bool" + } + ], + "name": "setMinterApproval", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "internalType": "bool", + "name": "approval", + "type": "bool" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "setMinterApprovalWithSignature", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + } + ], + "name": "toggle_approve_mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101606040527fc87351a089bbdc3b2b9299d2ce29f08fd982826b275b3642939a2f7fdd8153806101405234801561003657600080fd5b506040516114d53803806114d58339818101604052604081101561005957600080fd5b508051602091820151604080518082018252600f81526e2130b630b731b2b91026b4b73a32b960891b818601908152825180840184526001808252603160f81b828901908152600091909155925190912060805251902060a0527f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c052805163c003969960e01b81529051929391926001600160a01b0385169263c00396999260048082019391829003018186803b15801561011557600080fd5b505afa158015610129573d6000803e3d6000fd5b505050506040513d602081101561013f57600080fd5b50516001600160601b0319606091821b811660e05292811b8316610100521b166101205260805160a05160c05160e05160601c6101005160601c6101205160601c610140516113076101ce600039806108e45250806106375280610eea525080610ae95280610be55280610cf552508061081e525080610e10525080610e52525080610e3152506113076000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c80638b752bb0116100b2578063c003969911610081578063dd289d6011610066578063dd289d601461047f578063e6dec36f146104b2578063ed24911d146104ba5761011b565b8063c003969914610419578063c6542794146104215761011b565b80638b752bb01461038e57806390193b7c146103c9578063a0990033146102a0578063a51e1904146103fc5761011b565b80633c543bc6116100ee5780633c543bc6146102a057806358de9ade146102ef5780636a627842146103205780637504a15d146103535761011b565b80630de54ba01461012057806327f18ae31461015d578063397ada21146101985780633b9f73841461021a575b600080fd5b61015b6004803603604081101561013657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013515156104c2565b005b61015b6004803603604081101561017357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166104d1565b610208600480360360208110156101ae57600080fd5b8101906020810181356401000000008111156101c957600080fd5b8201836020820111156101db57600080fd5b803590602001918460208302840111640100000000831117156101fd57600080fd5b509092509050610526565b60408051918252519081900360200190f35b6102086004803603604081101561023057600080fd5b81019060208101813564010000000081111561024b57600080fd5b82018360208201111561025d57600080fd5b8035906020019184602083028401116401000000008311171561027f57600080fd5b91935091503573ffffffffffffffffffffffffffffffffffffffff1661054b565b6102db600480360360408110156102b657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166105fa565b604080519115158252519081900360200190f35b6102f7610635565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6102086004803603602081101561033657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610659565b6102086004803603604081101561036957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602001351661067c565b610208600480360360408110156103a457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610719565b610208600480360360208110156103df57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610751565b61015b600480360361010081101561041357600080fd5b50610779565b6102f761081c565b61015b600480360360e081101561043757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101351515916040820135169060608101359060ff6080820135169060a08101359060c00135610840565b61015b6004803603602081101561049557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610aa7565b6102f7610ae7565b610208610b0b565b6104cd823383610b1a565b5050565b6104d9610bb6565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff161561051e5761051c8282610bcf565b505b6104cd610c92565b6000610530610bb6565b61053b838333610c99565b9050610545610c92565b92915050565b6000610555610bb6565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290205460ff166105de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061128d6023913960400191505060405180910390fd5b6105e9848484610c99565b90506105f3610c92565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610663610bb6565b61066d8233610bcf565b9050610677610c92565b919050565b6000610686610bb6565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290205460ff1661070f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061128d6023913960400191505060405180910390fd5b61053b8383610bcf565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b610781610bb6565b60005b600881101561081057600082826008811061079b57fe5b602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156107d757610810565b6108078282600881106107e657fe5b602002013573ffffffffffffffffffffffffffffffffffffffff1633610bcf565b50600101610784565b50610819610c92565b50565b7f000000000000000000000000000000000000000000000000000000000000000090565b4284116108ae57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5369676e61747572652065787069726564000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff808616600090815260036020908152604080832080546001810190915581517f000000000000000000000000000000000000000000000000000000000000000081850152948c16858301528a151560608601526080850181905260a08086018a90528251808703909101815260c0909501909152835193909101929092209061094b82610da5565b9050600060018288888860405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156109a9573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a2457508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610a8f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e76616c6964207369676e6174757265000000000000000000000000000000604482015290519081900360640190fd5b610a9a8b8a8c610b1a565b5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020908152604080832033845290915290205461081990829060ff16156104c2565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610b15610e0c565b905090565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155825190815291519293927fa3ffb51320bbca4e61e7423e3c97dd7bd7e31b6ea7429eb26ef92780e84572a09281900390910190a3505050565b610bc860026000541415610190610ed7565b6002600055565b6000610bdb8383610ee5565b90508015610545577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f1983836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015610c7457600080fd5b505af1158015610c88573d6000803e3d6000fd5b5050505092915050565b6001600055565b600082815b81811015610cec57610ce2610cdb878784818110610cb857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1686610ee5565b84906111ea565b9250600101610c9e565b508115610d9d577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f1984846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015610d8457600080fd5b505af1158015610d98573d6000803e3d6000fd5b505050505b509392505050565b6000610daf610e0c565b8260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e796111fc565b30604051602001808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405160208183030381529060405280519060200120905090565b816104cd576104cd81611200565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633f9095b7856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610f6f57600080fd5b505afa158015610f83573d6000803e3d6000fd5b505050506040513d6020811015610f9957600080fd5b5051600f0b1215610ff5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806112b06022913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16634b820093836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561105e57600080fd5b505af1158015611072573d6000803e3d6000fd5b505050506040513d602081101561108857600080fd5b5050604080517f0940070700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015291516000928616916309400707916024808301926020929190829003018186803b1580156110fb57600080fd5b505afa15801561110f573d6000803e3d6000fd5b505050506040513d602081101561112557600080fd5b505173ffffffffffffffffffffffffffffffffffffffff80851660009081526001602090815260408083209389168352929052205490915061116890829061126d565b915081156111e35773ffffffffffffffffffffffffffffffffffffffff80841660008181526001602090815260408083209489168084529482529182902085905581519384528301849052805191927f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0929081900390910190a25b5092915050565b60008282016105f38482101583610ed7565b4690565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b60006105f38383600160006112858484111583610ed7565b505090039056fe43616c6c6572206e6f7420616c6c6f77656420746f206d696e7420666f722075736572476175676520646f6573206e6f74206578697374206f6e20436f6e74726f6c6c6572a2646970667358221220587cd49e37f22072725c57ae56a3bd92e4eed3038ece21302b71f0ade552372464736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061011b5760003560e01c80638b752bb0116100b2578063c003969911610081578063dd289d6011610066578063dd289d601461047f578063e6dec36f146104b2578063ed24911d146104ba5761011b565b8063c003969914610419578063c6542794146104215761011b565b80638b752bb01461038e57806390193b7c146103c9578063a0990033146102a0578063a51e1904146103fc5761011b565b80633c543bc6116100ee5780633c543bc6146102a057806358de9ade146102ef5780636a627842146103205780637504a15d146103535761011b565b80630de54ba01461012057806327f18ae31461015d578063397ada21146101985780633b9f73841461021a575b600080fd5b61015b6004803603604081101561013657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013515156104c2565b005b61015b6004803603604081101561017357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166104d1565b610208600480360360208110156101ae57600080fd5b8101906020810181356401000000008111156101c957600080fd5b8201836020820111156101db57600080fd5b803590602001918460208302840111640100000000831117156101fd57600080fd5b509092509050610526565b60408051918252519081900360200190f35b6102086004803603604081101561023057600080fd5b81019060208101813564010000000081111561024b57600080fd5b82018360208201111561025d57600080fd5b8035906020019184602083028401116401000000008311171561027f57600080fd5b91935091503573ffffffffffffffffffffffffffffffffffffffff1661054b565b6102db600480360360408110156102b657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166105fa565b604080519115158252519081900360200190f35b6102f7610635565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6102086004803603602081101561033657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610659565b6102086004803603604081101561036957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602001351661067c565b610208600480360360408110156103a457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610719565b610208600480360360208110156103df57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610751565b61015b600480360361010081101561041357600080fd5b50610779565b6102f761081c565b61015b600480360360e081101561043757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101351515916040820135169060608101359060ff6080820135169060a08101359060c00135610840565b61015b6004803603602081101561049557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610aa7565b6102f7610ae7565b610208610b0b565b6104cd823383610b1a565b5050565b6104d9610bb6565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff161561051e5761051c8282610bcf565b505b6104cd610c92565b6000610530610bb6565b61053b838333610c99565b9050610545610c92565b92915050565b6000610555610bb6565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290205460ff166105de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061128d6023913960400191505060405180910390fd5b6105e9848484610c99565b90506105f3610c92565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610663610bb6565b61066d8233610bcf565b9050610677610c92565b919050565b6000610686610bb6565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290205460ff1661070f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061128d6023913960400191505060405180910390fd5b61053b8383610bcf565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b610781610bb6565b60005b600881101561081057600082826008811061079b57fe5b602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156107d757610810565b6108078282600881106107e657fe5b602002013573ffffffffffffffffffffffffffffffffffffffff1633610bcf565b50600101610784565b50610819610c92565b50565b7f000000000000000000000000000000000000000000000000000000000000000090565b4284116108ae57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5369676e61747572652065787069726564000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff808616600090815260036020908152604080832080546001810190915581517f000000000000000000000000000000000000000000000000000000000000000081850152948c16858301528a151560608601526080850181905260a08086018a90528251808703909101815260c0909501909152835193909101929092209061094b82610da5565b9050600060018288888860405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156109a9573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610a2457508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610a8f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e76616c6964207369676e6174757265000000000000000000000000000000604482015290519081900360640190fd5b610a9a8b8a8c610b1a565b5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020908152604080832033845290915290205461081990829060ff16156104c2565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610b15610e0c565b905090565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155825190815291519293927fa3ffb51320bbca4e61e7423e3c97dd7bd7e31b6ea7429eb26ef92780e84572a09281900390910190a3505050565b610bc860026000541415610190610ed7565b6002600055565b6000610bdb8383610ee5565b90508015610545577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f1983836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015610c7457600080fd5b505af1158015610c88573d6000803e3d6000fd5b5050505092915050565b6001600055565b600082815b81811015610cec57610ce2610cdb878784818110610cb857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1686610ee5565b84906111ea565b9250600101610c9e565b508115610d9d577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f1984846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015610d8457600080fd5b505af1158015610d98573d6000803e3d6000fd5b505050505b509392505050565b6000610daf610e0c565b8260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e796111fc565b30604051602001808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405160208183030381529060405280519060200120905090565b816104cd576104cd81611200565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633f9095b7856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610f6f57600080fd5b505afa158015610f83573d6000803e3d6000fd5b505050506040513d6020811015610f9957600080fd5b5051600f0b1215610ff5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806112b06022913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16634b820093836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561105e57600080fd5b505af1158015611072573d6000803e3d6000fd5b505050506040513d602081101561108857600080fd5b5050604080517f0940070700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015291516000928616916309400707916024808301926020929190829003018186803b1580156110fb57600080fd5b505afa15801561110f573d6000803e3d6000fd5b505050506040513d602081101561112557600080fd5b505173ffffffffffffffffffffffffffffffffffffffff80851660009081526001602090815260408083209389168352929052205490915061116890829061126d565b915081156111e35773ffffffffffffffffffffffffffffffffffffffff80841660008181526001602090815260408083209489168084529482529182902085905581519384528301849052805191927f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0929081900390910190a25b5092915050565b60008282016105f38482101583610ed7565b4690565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b60006105f38383600160006112858484111583610ed7565b505090039056fe43616c6c6572206e6f7420616c6c6f77656420746f206d696e7420666f722075736572476175676520646f6573206e6f74206578697374206f6e20436f6e74726f6c6c6572a2646970667358221220587cd49e37f22072725c57ae56a3bd92e4eed3038ece21302b71f0ade552372464736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-gauge-controller/artifact/GaugeController.json b/balpy/balancer-deployments/tasks/20220325-gauge-controller/artifact/GaugeController.json new file mode 100644 index 0000000..01e37ab --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-gauge-controller/artifact/GaugeController.json @@ -0,0 +1,796 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GaugeController", + "sourceName": "@balancer-labs/liquidity-mining/contracts/GaugeController.vy", + "abi": [ + { + "name": "AddType", + "inputs": [ + { + "name": "name", + "type": "string", + "indexed": false + }, + { + "name": "type_id", + "type": "int128", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "NewTypeWeight", + "inputs": [ + { + "name": "type_id", + "type": "int128", + "indexed": false + }, + { + "name": "time", + "type": "uint256", + "indexed": false + }, + { + "name": "weight", + "type": "uint256", + "indexed": false + }, + { + "name": "total_weight", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "NewGaugeWeight", + "inputs": [ + { + "name": "gauge_address", + "type": "address", + "indexed": false + }, + { + "name": "time", + "type": "uint256", + "indexed": false + }, + { + "name": "weight", + "type": "uint256", + "indexed": false + }, + { + "name": "total_weight", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "VoteForGauge", + "inputs": [ + { + "name": "time", + "type": "uint256", + "indexed": false + }, + { + "name": "user", + "type": "address", + "indexed": false + }, + { + "name": "gauge_addr", + "type": "address", + "indexed": false + }, + { + "name": "weight", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "NewGauge", + "inputs": [ + { + "name": "addr", + "type": "address", + "indexed": false + }, + { + "name": "gauge_type", + "type": "int128", + "indexed": false + }, + { + "name": "weight", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "stateMutability": "nonpayable", + "type": "constructor", + "inputs": [ + { + "name": "_voting_escrow", + "type": "address" + }, + { + "name": "_authorizer_adaptor", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "token", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "voting_escrow", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "admin", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "gauge_exists", + "inputs": [ + { + "name": "_addr", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "gauge_types", + "inputs": [ + { + "name": "_addr", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "int128" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "add_gauge", + "inputs": [ + { + "name": "addr", + "type": "address" + }, + { + "name": "gauge_type", + "type": "int128" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "add_gauge", + "inputs": [ + { + "name": "addr", + "type": "address" + }, + { + "name": "gauge_type", + "type": "int128" + }, + { + "name": "weight", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "checkpoint", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "checkpoint_gauge", + "inputs": [ + { + "name": "addr", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "gauge_relative_weight", + "inputs": [ + { + "name": "addr", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "gauge_relative_weight", + "inputs": [ + { + "name": "addr", + "type": "address" + }, + { + "name": "time", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "gauge_relative_weight_write", + "inputs": [ + { + "name": "addr", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "gauge_relative_weight_write", + "inputs": [ + { + "name": "addr", + "type": "address" + }, + { + "name": "time", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "add_type", + "inputs": [ + { + "name": "_name", + "type": "string" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "add_type", + "inputs": [ + { + "name": "_name", + "type": "string" + }, + { + "name": "weight", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "change_type_weight", + "inputs": [ + { + "name": "type_id", + "type": "int128" + }, + { + "name": "weight", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "change_gauge_weight", + "inputs": [ + { + "name": "addr", + "type": "address" + }, + { + "name": "weight", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "vote_for_many_gauge_weights", + "inputs": [ + { + "name": "_gauge_addrs", + "type": "address[8]" + }, + { + "name": "_user_weight", + "type": "uint256[8]" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "vote_for_gauge_weights", + "inputs": [ + { + "name": "_gauge_addr", + "type": "address" + }, + { + "name": "_user_weight", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "get_gauge_weight", + "inputs": [ + { + "name": "addr", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "get_type_weight", + "inputs": [ + { + "name": "type_id", + "type": "int128" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "get_total_weight", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "get_weights_sum_per_type", + "inputs": [ + { + "name": "type_id", + "type": "int128" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "n_gauge_types", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "int128" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "n_gauges", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "int128" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "gauge_type_names", + "inputs": [ + { + "name": "arg0", + "type": "int128" + } + ], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "gauges", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "vote_user_slopes", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "components": [ + { + "name": "slope", + "type": "uint256" + }, + { + "name": "power", + "type": "uint256" + }, + { + "name": "end", + "type": "uint256" + } + ] + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "vote_user_power", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "last_user_vote", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "points_weight", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "components": [ + { + "name": "bias", + "type": "uint256" + }, + { + "name": "slope", + "type": "uint256" + } + ] + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "time_weight", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "points_sum", + "inputs": [ + { + "name": "arg0", + "type": "int128" + }, + { + "name": "arg1", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "components": [ + { + "name": "bias", + "type": "uint256" + }, + { + "name": "slope", + "type": "uint256" + } + ] + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "time_sum", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "points_total", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "time_total", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "points_type_weight", + "inputs": [ + { + "name": "arg0", + "type": "int128" + }, + { + "name": "arg1", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "time_type_weight", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + } + ], + "bytecode": "0x60206124046080396080518060a01c6123ff5760e05260206020612404016080396080518060a01c6123ff5761010052600060e051146123ff57600061010051146123ff5763fc0c546a610120526020610120600461013c60e0515afa61006b573d600060003e3d6000fd5b601f3d11156123ff57610120518060a01c6123ff576101605260e0516101205261010051610140524262093a808082049050905062093a808082028215828483041417156123ff5790509050637735940e556123c356600436101561000d57610de2565b60046000601c37600051346122fc5763fc0c546a811861003c5760206060380360803960805160e052602060e0f35b63dfe05031811861005c5760206040380360803960805160e052602060e0f35b63f851a440811861007c5760206020380360803960805160e052602060e0f35b6361df1bf981186100bf576004358060a01c6122fc5760e052633b9aca0460e05160a0526080526040608020546101005260006101005113610120526020610120f35b633f9095b78118610120576004358060a01c6122fc5760e052633b9aca0460e05160a05260805260406080205461010052600061010051146122fc576101005160018082038060801d81607f1d186122fc5790509050610120526020610120f35b633a04f90081186101365760006102e052610149565b6318dfe921811861041e576044356102e0525b6004358060a01c6122fc576102a0526024358060801d81607f1d186122fc576102c05260206020380360803960805133186122fc5760006102c051121561019157600061019a565b6001546102c051125b156122fc57633b9aca046102a05160a0526080526040608020546122fc57600254610300526103005160018082018060801d81607f1d186122fc57905090506002556102a051600161030051633b9aca008110156122fc5702600401556102c05160018082018060801d81607f1d186122fc5790509050633b9aca046102a05160a0526080526040608020554262093a8081818301106122fc578082019050905062093a808082049050905062093a808082028215828483041417156122fc57905090506103205260006102e0511115610387576102c05160e052610280610360610de8565b61036051610340526102c05160e05261029a610380610eee565b61038051610360526102ad6103a06110a4565b6103a051610380526102e0516103605181818301106122fc5780820190509050633b9aca0b6102c05160a05260805260406080206103205160a0526080526040608020556103205160016102c051633b9aca008110156122fc5702633b9aca0d015561038051610340516102e0518082028215828483041417156122fc579050905081818301106122fc5780820190509050637735940d6103205160a05260805260406080205561032051637735940e556102e051633b9aca086102a05160a05260805260406080206103205160a0526080526040608020555b60016102c051633b9aca008110156122fc5702633b9aca0d01546103c4576103205160016102c051633b9aca008110156122fc5702633b9aca0d01555b61032051633b9aca0a6102a05160a0526080526040608020557ffd55b3191f9c9dd92f4f134dd700e7d76f6a0c836a08687023d6d38f03ebd8776102a051610340526102c051610360526102e051610380526060610340a1005b63c2c4c5c1811861043a576104346102a06110a4565b6102a050005b63615e5237811861047b576004358060a01c6122fc576102a0526102a05160e0526104666102c061128d565b6102c0506104756102c06110a4565b6102c050005b636207d866811861049057426101e0526104a3565b63d3078c9481186104db576024356101e0525b6004358060a01c6122fc576101c0526101c05160e0526101e051610100526104cc610200611439565b61020051610220526020610220f35b6395cfcec381186104f057426102c052610503565b636472eee18118610560576024356102c0525b6004358060a01c6122fc576102a0526102a05160e0526105246102e061128d565b6102e0506105336102e06110a4565b6102e0506102a05160e0526102c051610100526105516102e0611439565b6102e051610300526020610300f35b6326e56d5e811861057657600061044052610589565b6392d0d23281186106ee57602435610440525b60043560040160408135116122fc5780803560200180826103e03750505060206020380360803960805133186122fc57600154610460526103e08060036104605160a0526080526040608020602082510160c060006003818352015b8260c05160200211156105f757610616565b60c05160200285015160c05185015581516001018083528114156105e5575b5050505050506104605160018082018060801d81607f1d186122fc5790509050600155600061044051146106ec57610460516102a052610440516102c05261065c611567565b7f6fbe76157c712f16b5a3c44ed48baa04e3450bc3fab0c020e848aca72bbccc84610480806040808252808301806103e080516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090508101905060208201915061046051825290509050610480a15b005b63db1ca2608118610738576004358060801d81607f1d186122fc576103e05260206020380360803960805133186122fc576103e0516102a0526024356102c052610736611567565b005b63d4d2646e811861077d576004358060a01c6122fc576104405260206020380360803960805133186122fc57610440516102a0526024356102c05261077b6116f9565b005b632e4e99a18118610885576004358060a01c6122fc57610600526024358060a01c6122fc57610620526044358060a01c6122fc57610640526064358060a01c6122fc57610660526084358060a01c6122fc576106805260a4358060a01c6122fc576106a05260c4358060a01c6122fc576106c05260e4358060a01c6122fc576106e0526000546122fc57600160005561070060006008818352015b6106006107005160088110156122fc5760200201516108365761087c565b336102a0526106006107005160088110156122fc5760200201516102c0526020610700510261010401356102e05261086c611941565b8151600101808352811415610818575b50506000600055005b63d713632881186108bd576004358060a01c6122fc5761060052336102a052610600516102c0526024356102e0526108bb611941565b005b634e791a3a8118610914576004358060a01c6122fc5760e052633b9aca0860e05160a0526080526040608020633b9aca0a60e05160a05260805260406080205460a052608052604060802054610100526020610100f35b6372fdccfa8118610975576004358060801d81607f1d186122fc5760e052637735940f60e05160a0526080526040608020600160e051633b9aca008110156122fc57026377359410015460a052608052604060802054610100526020610100f35b636977ff9281186109a057637735940d637735940e5460a05260805260406080205460e052602060e0f35b636f214a6a8118610a01576004358060801d81607f1d186122fc5760e052633b9aca0b60e05160a0526080526040608020600160e051633b9aca008110156122fc5702633b9aca0d015460a052608052604060802054610100526020610100f35b639fba03a18118610a185760015460e052602060e0f35b63e93841d08118610a2f5760025460e052602060e0f35b63d958a8fc8118610af8576004358060801d81607f1d186122fc5760e052610100806020808252600360e05160a052608052604060802081840180828082602082540160c060006003818352015b8260c0516020021115610a8f57610aae565b60c05185015460c0516020028501528151600101808352811415610a7d575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f82010390509050905090508101905090509050610100f35b63b05391878118610b22576001600435633b9aca008110156122fc57026004015460e052602060e0f35b630f467f988118610b8c576004358060a01c6122fc5760e0526024358060a01c6122fc5761010052633b9aca0560e05160a05260805260406080206101005160a0526080526040608020805461012052600181015461014052600281015461016052506060610120f35b63411e74b58118610bc4576004358060a01c6122fc5760e052633b9aca0660e05160a052608052604060802054610100526020610100f35b637e418fa08118610c1a576004358060a01c6122fc5760e0526024358060a01c6122fc5761010052633b9aca0760e05160a05260805260406080206101005160a052608052604060802054610120526020610120f35b63edba52738118610c6b576004358060a01c6122fc5760e052633b9aca0860e05160a052608052604060802060243560a0526080526040608020805461010052600181015461012052506040610100f35b63a4d7a2508118610ca3576004358060a01c6122fc5760e052633b9aca0a60e05160a052608052604060802054610100526020610100f35b63a9b48c018118610cf9576004358060801d81607f1d186122fc5760e052633b9aca0b60e05160a052608052604060802060243560a0526080526040608020805461010052600181015461012052506040610100f35b635a5491588118610d26576001600435633b9aca008110156122fc5702633b9aca0d015460e052602060e0f35b631142916b8118610d4e57637735940d60043560a05260805260406080205460e052602060e0f35b63513872bd8118610d6857637735940e5460e052602060e0f35b63afd2bb498118610db3576004358060801d81607f1d186122fc5760e052637735940f60e05160a052608052604060802060243560a052608052604060802054610100526020610100f35b6351ce6b598118610de0576001600435633b9aca008110156122fc57026377359410015460e052602060e0f35b505b60006000fd5b600160e051633b9aca008110156122fc5702637735941001546101005260006101005111610e1e576000815250610eec56610eec565b637735940f60e05160a05260805260406080206101005160a0526080526040608020546101205261014060006101f4818352015b42610100511115610e6257610ede565b610100805162093a8081818301106122fc578082019050905081525061012051637735940f60e05160a05260805260406080206101005160a05260805260406080205542610100511115610ece5761010051600160e051633b9aca008110156122fc5702637735941001555b8151600101808352811415610e52575b505061012051815250610eec565b565b600160e051633b9aca008110156122fc5702633b9aca0d01546101005260006101005111610f245760008152506110a2566110a2565b633b9aca0b60e05160a05260805260406080206101005160a05260805260406080208054610120526001810154610140525061016060006101f4818352015b42610100511115610f7357611094565b610100805162093a8081818301106122fc57808201905090508152506101405162093a808082028215828483041417156122fc579050905061018052610180516101205111610fcd57600061012052600061014052611029565b6101208051610180518082106122fc5780820390509050815250633b9aca0c60e05160a05260805260406080206101005160a0526080526040608020546101a05261014080516101a0518082106122fc57808203905090508152505b633b9aca0b60e05160a05260805260406080206101005160a052608052604060802061012051815561014051600182015550426101005111156110845761010051600160e051633b9aca008110156122fc5702633b9aca0d01555b8151600101808352811415610f63575b5050610120518152506110a2565b565b637735940e546101c0526001546101e052426101c05111156110db576101c0805162093a808082106122fc57808203905090508152505b637735940d6101c05160a0526080526040608020546102005261022060006064818352015b6101e05161022051186111125761114e565b6102205160e052611124610240610eee565b610240506102205160e05261113a610240610de8565b610240508151600101808352811415611100575b505061022060006101f4818352015b426101c051111561116d57611282565b6101c0805162093a8081818301106122fc578082019050905081525060006102005261024060006064818352015b6101e05161024051186111ad57611241565b633b9aca0b6102405160a05260805260406080206101c05160a05260805260406080205461026052637735940f6102405160a05260805260406080206101c05160a05260805260406080205461028052610200805161026051610280518082028215828483041417156122fc579050905081818301106122fc5780820190509050815250815160010180835281141561119b575b505061020051637735940d6101c05160a052608052604060802055426101c0511115611272576101c051637735940e555b815160010180835281141561115d575b505061020051815250565b633b9aca0a60e05160a05260805260406080205461010052600061010051116112be57600081525061143756611437565b633b9aca0860e05160a05260805260406080206101005160a05260805260406080208054610120526001810154610140525061016060006101f4818352015b4261010051111561130d57611429565b610100805162093a8081818301106122fc57808201905090508152506101405162093a808082028215828483041417156122fc579050905061018052610180516101205111611367576000610120526000610140526113c3565b6101208051610180518082106122fc5780820390509050815250633b9aca0960e05160a05260805260406080206101005160a0526080526040608020546101a05261014080516101a0518082106122fc57808203905090508152505b633b9aca0860e05160a05260805260406080206101005160a052608052604060802061012051815561014051600182015550426101005111156114195761010051633b9aca0a60e05160a0526080526040608020555b81516001018083528114156112fd575b505061012051815250611437565b565b6101005162093a808082049050905062093a808082028215828483041417156122fc579050905061012052637735940d6101205160a052608052604060802054610140526000610140511161149657600081525061156556611565565b633b9aca0460e05160a05260805260406080205460018082038060801d81607f1d186122fc579050905061016052637735940f6101605160a05260805260406080206101205160a05260805260406080205461018052633b9aca0860e05160a05260805260406080206101205160a0526080526040608020546101a052670de0b6b3a7640000610180518082028215828483041417156122fc57905090506101a0518082028215828483041417156122fc5790509050610140518080156122fc57820490509050815250611565565b565b6102a05160e052611579610300610de8565b610300516102e0526102a05160e052611593610320610eee565b61032051610300526115a66103406110a4565b61034051610320524262093a8081818301106122fc578082019050905062093a808082049050905062093a808082028215828483041417156122fc57905090506103405261032051610300516102c0518082028215828483041417156122fc579050905081818301106122fc5780820190509050610300516102e0518082028215828483041417156122fc57905090508082106122fc57808203905090506103205261032051637735940d6103405160a0526080526040608020556102c051637735940f6102a05160a05260805260406080206103405160a05260805260406080205561034051637735940e556103405160016102a051633b9aca008110156122fc5702637735941001557e170bcdc909b6ac6e12d020fe8942256312cdcd555fb6d712899eba56d2f9016102a0516103605261034051610380526102c0516103a052610320516103c0526080610360a1565b633b9aca046102a05160a05260805260406080205460018082038060801d81607f1d186122fc57905090506102e0526102a05160e05261173a61032061128d565b61032051610300526102e05160e052611754610340610de8565b61034051610320526102e05160e05261176e610360610eee565b61036051610340526117816103806110a4565b61038051610360524262093a8081818301106122fc578082019050905062093a808082049050905062093a808082028215828483041417156122fc5790509050610380526102c051633b9aca086102a05160a05260805260406080206103805160a05260805260406080205561038051633b9aca0a6102a05160a052608052604060802055610340516102c05181818301106122fc5780820190509050610300518082106122fc57808203905090506103a0526103a051633b9aca0b6102e05160a05260805260406080206103805160a0526080526040608020556103805160016102e051633b9aca008110156122fc5702633b9aca0d0155610360516103a051610320518082028215828483041417156122fc579050905081818301106122fc578082019050905061034051610320518082028215828483041417156122fc57905090508082106122fc57808203905090506103605261036051637735940d6103805160a05260805260406080205561038051637735940e557f54c0cf3647e6cdb2fc0a7876e60ba77563fceedf2e06c01c597f8dccb9e6bd726102a0516103c052426103e0526102c05161040052610360516104205260806103c0a1565b637c74a174610320526102a051610340526020610320602461033c6020604038036080396080515afa611979573d600060003e3d6000fd5b601f3d11156122fc5761032051600081126122fc576103005263adc63589610340526102a051610360526020610340602461035c6020604038036080396080515afa6119ca573d600060003e3d6000fd5b601f3d11156122fc576103405161032052600254610340524262093a8081818301106122fc578082019050905062093a808082049050905062093a808082028215828483041417156122fc579050905061036052610360516103205111611aa2576020610380527f596f757220746f6b656e206c6f636b206578706972657320746f6f20736f6f6e6103a0526103805061038051806103a001818260206001820306601f82010390500336823750506308c379a0610340526020610360526103805160206001820306601f820103905060440161035cfd5b60006102e0511015611ab5576000611abf565b6127106102e05111155b611b3a57601e610380527f596f75207573656420616c6c20796f757220766f74696e6720706f77657200006103a0526103805061038051806103a001818260206001820306601f82010390500336823750506308c379a0610340526020610360526103805160206001820306601f820103905060440161035cfd5b633b9aca076102a05160a05260805260406080206102c05160a052608052604060802054620d2f0081818301106122fc5780820190509050421015611bf0576014610380527f43616e6e6f7420766f746520736f206f6674656e0000000000000000000000006103a0526103805061038051806103a001818260206001820306601f82010390500336823750506308c379a0610340526020610360526103805160206001820306601f820103905060440161035cfd5b633b9aca046102c05160a05260805260406080205460018082038060801d81607f1d186122fc5790509050610380526000610380511215611ca257600f6103a0527f4761756765206e6f7420616464656400000000000000000000000000000000006103c0526103a0506103a051806103c001818260206001820306601f82010390500336823750506308c379a0610360526020610380526103a05160206001820306601f820103905060440161037cfd5b633b9aca056102a05160a05260805260406080206102c05160a052608052604060802080546103a05260018101546103c05260028101546103e05250600061040052610360516103e0511115611d0d576103e051610360518082106122fc5780820390509050610400525b6103a051610400518082028215828483041417156122fc579050905061042052610300516102e0518082028215828483041417156122fc579050905061271080820490509050610440526102e05161046052610320516104805261032051610360518082106122fc57808203905090506104a052610440516104a0518082028215828483041417156122fc57905090506104c052633b9aca066102a05160a0526080526040608020546104e0526104e0516104605181818301106122fc57808201905090506103c0518082106122fc57808203905090506104e0526104e051633b9aca066102a05160a05260805260406080205560006104e0511015611e14576000611e1e565b6127106104e05111155b611e99576013610500527f5573656420746f6f206d75636820706f776572000000000000000000000000006105205261050050610500518061052001818260206001820306601f82010390500336823750506308c379a06104c05260206104e0526105005160206001820306601f82010390506044016104dcfd5b6102c05160e052611eab61052061128d565b61052051610500526001633b9aca086102c05160a05260805260406080206103605160a05260805260406080200154610520526103805160e052611ef0610560610eee565b61056051610540526001633b9aca0b6103805160a05260805260406080206103605160a0526080526040608020015461056052610500516104c05181818301106122fc578082019050905061042051808210611f4c5781611f4e565b805b90509050610420518082106122fc5780820390509050633b9aca086102c05160a05260805260406080206103605160a052608052604060802055610540516104c05181818301106122fc578082019050905061042051808210611fb15781611fb3565b805b90509050610420518082106122fc5780820390509050633b9aca0b6103805160a05260805260406080206103605160a052608052604060802055610360516103e0511161207d576001633b9aca086102c05160a05260805260406080206103605160a05260805260406080200180546104405181818301106122fc57808201905090508155506001633b9aca0b6103805160a05260805260406080206103605160a05260805260406080200180546104405181818301106122fc578082019050905081555061214e565b610520516104405181818301106122fc57808201905090506103a0518082106120a657816120a8565b805b905090506103a0518082106122fc57808203905090506001633b9aca086102c05160a05260805260406080206103605160a05260805260406080200155610560516104405181818301106122fc57808201905090506103a05180821061210e5781612110565b805b905090506103a0518082106122fc57808203905090506001633b9aca0b6103805160a05260805260406080206103605160a052608052604060802001555b426103e05111156121ce57633b9aca096102c05160a05260805260406080206103e05160a052608052604060802080546103a0518082106122fc5780820390509050815550633b9aca0c6103805160a05260805260406080206103e05160a052608052604060802080546103a0518082106122fc57808203905090508155505b633b9aca096102c05160a05260805260406080206104805160a052608052604060802080546104405181818301106122fc5780820190509050815550633b9aca0c6103805160a05260805260406080206104805160a052608052604060802080546104405181818301106122fc57808201905090508155506122516105806110a4565b61058050633b9aca056102a05160a05260805260406080206102c05160a05260805260406080206104405181556104605160018201556104805160028201555042633b9aca076102a05160a05260805260406080206102c05160a0526080526040608020557f45ca9a4c8d0119eb329e580d28fe689e484e1be230da8037ade9547d2d25cc9142610580526102a0516105a0526102c0516105c0526102e0516105e0526080610580a1565b600080fd5b6100c26123c3036100c2610180396100c26123c30361012051816101a0015261014051816101c001526101605181610180015280606001610180f35b600080fd", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-gauge-controller/artifact/VotingEscrow.json b/balpy/balancer-deployments/tasks/20220325-gauge-controller/artifact/VotingEscrow.json new file mode 100644 index 0000000..44f8eb0 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-gauge-controller/artifact/VotingEscrow.json @@ -0,0 +1,597 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "VotingEscrow", + "sourceName": "@balancer-labs/liquidity-mining/contracts/VotingEscrow.vy", + "abi": [ + { + "name": "Deposit", + "inputs": [ + { + "name": "provider", + "type": "address", + "indexed": true + }, + { + "name": "value", + "type": "uint256", + "indexed": false + }, + { + "name": "locktime", + "type": "uint256", + "indexed": true + }, + { + "name": "type", + "type": "int128", + "indexed": false + }, + { + "name": "ts", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Withdraw", + "inputs": [ + { + "name": "provider", + "type": "address", + "indexed": true + }, + { + "name": "value", + "type": "uint256", + "indexed": false + }, + { + "name": "ts", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Supply", + "inputs": [ + { + "name": "prevSupply", + "type": "uint256", + "indexed": false + }, + { + "name": "supply", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "stateMutability": "nonpayable", + "type": "constructor", + "inputs": [ + { + "name": "token_addr", + "type": "address" + }, + { + "name": "_name", + "type": "string" + }, + { + "name": "_symbol", + "type": "string" + }, + { + "name": "_authorizer_adaptor", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "token", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "decimals", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "admin", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "commit_smart_wallet_checker", + "inputs": [ + { + "name": "addr", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "apply_smart_wallet_checker", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "get_last_user_slope", + "inputs": [ + { + "name": "addr", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "int128" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "user_point_history__ts", + "inputs": [ + { + "name": "_addr", + "type": "address" + }, + { + "name": "_idx", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "locked__end", + "inputs": [ + { + "name": "_addr", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "checkpoint", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit_for", + "inputs": [ + { + "name": "_addr", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "create_lock", + "inputs": [ + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_unlock_time", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "increase_amount", + "inputs": [ + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "increase_unlock_time", + "inputs": [ + { + "name": "_unlock_time", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "withdraw", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "addr", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "addr", + "type": "address" + }, + { + "name": "_t", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "balanceOfAt", + "inputs": [ + { + "name": "addr", + "type": "address" + }, + { + "name": "_block", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "totalSupply", + "inputs": [ + { + "name": "t", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "totalSupplyAt", + "inputs": [ + { + "name": "_block", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "supply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "locked", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "components": [ + { + "name": "amount", + "type": "int128" + }, + { + "name": "end", + "type": "uint256" + } + ] + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "epoch", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "point_history", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "components": [ + { + "name": "bias", + "type": "int128" + }, + { + "name": "slope", + "type": "int128" + }, + { + "name": "ts", + "type": "uint256" + }, + { + "name": "blk", + "type": "uint256" + } + ] + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "user_point_history", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "components": [ + { + "name": "bias", + "type": "int128" + }, + { + "name": "slope", + "type": "int128" + }, + { + "name": "ts", + "type": "uint256" + }, + { + "name": "blk", + "type": "uint256" + } + ] + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "user_point_epoch", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "slope_changes", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "int128" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "future_smart_wallet_checker", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "smart_wallet_checker", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + } + ], + "bytecode": "0x60206127ba6080396080518060a01c6127b55760e052602060206127ba016080396080516127ba016040602082608039608051116127b55780602081608039608051602001808261010039505050602060406127ba016080396080516127ba016020602082608039608051116127b55780602081608039608051602001808261016039505050602060606127ba016080396080518060a01c6127b5576101a05260006101a051146127b55760e0516101c0526101a0516101e052436007554260065563313ce567610220526020610220600461023c60e0515afa6100e8573d600060003e3d6000fd5b601f3d11156127b557610220516102005260ff61020051116127b557610100805160200180610220828460045afa90505050610160805160200180610280828460045afa90505050610200516102c05261274856600436101561000d57611766565b60046000601c37600051346126065763fc0c546a811861003d576020610100380360803960805160e052602060e0f35b6306fdde0381186100ae5760e080602080825260c0380381840180826020816080396080516020018082843950508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090509050810190509050905060e0f35b6395d89b41811861011f5760e08060208082526060380381840180826020816080396080516020018082843950508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090509050810190509050905060e0f35b63313ce567811861013f5760206020380360803960805160e052602060e0f35b63f851a440811861015f57602060e0380360803960805160e052602060e0f35b6357f901e2811861019e576004358060a01c6126065760e052602060e0380360803960805133186126065760e0516c050c783eb9b5c840000000000755005b638e5b490f81186101db57602060e038036080396080513318612606576c050c783eb9b5c8400000000007546c050c783eb9b5c840000000000855005b637c74a1748118610254576004358060a01c6126065760e0526c050c783eb9b5c840000000000560e05160a052608052604060802054610100526001600461010051633b9aca0081101561260657026c050c783eb9b5c840000000000460e05160a0526080526040608020010154610120526020610120f35b63da020a1881186102ab576004358060a01c6126065760e05260026004602435633b9aca0081101561260657026c050c783eb9b5c840000000000460e05160a0526080526040608020010154610100526020610100f35b63adc6358981186102e3576004358060a01c6126065760e0526001600260e05160a05260805260406080200154610100526020610100f35b63c2c4c5c1811861030b57600060e0526040366101003760403661014037610309611877565b005b633a46273e81186104d0576004358060a01c612606576106605260005461260657600160005560026106605160a052608052604060802080546106805260018101546106a052506000602435111561260657600061068051136103df5760166106c0527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b426106a051116104855760246106c0527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686106e0527f6472617700000000000000000000000000000000000000000000000000000000610700526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b61066051610480526024356104a05260006104c05260026106605160a052608052604060802080546104e052600181015461050052506000610520526104c9611f66565b6000600055005b6365fc3873811861073c576000546126065760016000553360e0526104f361176c565b60243562093a808082049050905062093a8080820282158284830414171561260657905090506106605260023360a052608052604060802080546106805260018101546106a05250600060043511156126065761068051156105c65760196106c0527f5769746864726177206f6c6420746f6b656e73206669727374000000000000006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b42610660511161066c5760266106c0527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e20746865206106e0527f6675747572650000000000000000000000000000000000000000000000000000610700526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b426301e133808181830110612606578082019050905061066051111561070357601d6106c0527f566f74696e67206c6f636b2063616e20626520312079656172206d61780000006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b33610480526004356104a052610660516104c052610680516104e0526106a05161050052600161052052610735611f66565b6000600055005b634957677c81186108e7576000546126065760016000553360e05261075f61176c565b60023360a05260805260406080208054610660526001810154610680525060006004351115612606576000610660511361080a5760166106a0527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006106c0526106a0506106a051806106c001818260206001820306601f82010390500336823750506308c379a0610660526020610680526106a05160206001820306601f820103905060440161067cfd5b4261068051116108b05760246106a0527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686106c0527f64726177000000000000000000000000000000000000000000000000000000006106e0526106a0506106a051806106c001818260206001820306601f82010390500336823750506308c379a0610660526020610680526106a05160206001820306601f820103905060440161067cfd5b33610480526004356104a05260006104c052610660516104e05261068051610500526002610520526108e0611f66565b6000600055005b63eff7a6128118610ba8576000546126065760016000553360e05261090a61176c565b60023360a05260805260406080208054610660526001810154610680525060043562093a808082049050905062093a8080820282158284830414171561260657905090506106a0524261068051116109d357600c6106c0527f4c6f636b206578706972656400000000000000000000000000000000000000006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b60006106605113610a555760116106c0527f4e6f7468696e67206973206c6f636b65640000000000000000000000000000006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b610680516106a05111610ad957601f6106c0527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b426301e13380818183011061260657808201905090506106a0511115610b7057601d6106c0527f566f74696e67206c6f636b2063616e20626520312079656172206d61780000006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b336104805260006104a0526106a0516104c052610660516104e0526106805161050052600361052052610ba1611f66565b6000600055005b633ccfd60b8118610dcc5760005461260657600160005560023360a052608052604060802080546104805260018101546104a052506104a051421015610c5f5760166104c0527f546865206c6f636b206469646e277420657870697265000000000000000000006104e0526104c0506104c051806104e001818260206001820306601f82010390500336823750506308c379a06104805260206104a0526104c05160206001820306601f820103905060440161049cfd5b6104805160008112612606576104c052610480516104e0526104a0516105005260006104a05260006104805260023360a05260805260406080206104805181556104a05160018201555060015461052052610520516104c05180821061260657808203905090506001553360e0526104e05161010052610500516101205261048051610140526104a05161016052610cf5611877565b63a9059cbb6105405233610560526104c051610580526020610540604461055c6000602061010038036080396080515af1610d35573d600060003e3d6000fd5b601f3d111561260657610540511561260657337ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5686104c0516105405242610560526040610540a27f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c6105205161054052610520516104c0518082106126065780820390509050610560526040610540a16000600055005b6370a082318118610de157426101e052610df3565b62fdd58e8118610f6f576024356101e0525b6004358060a01c612606576101c052600061020052426101e05118610e39576c050c783eb9b5c84000000000056101c05160a05260805260406080205461020052610e7e565b6101c05160e0526101e051610100526c050c783eb9b5c84000000000056101c05160a05260805260406080205461012052610e756102206123ad565b61022051610200525b6102005115610f5d57600461020051633b9aca0081101561260657026c050c783eb9b5c84000000000046101c05160a052608052604060802001805461022052600181015461024052600281015461026052600381015461028052506102208051610240516101e05161026051808210612606578082039050905080607f1c612606578082028060801d81607f1d1861260657905090508082038060801d81607f1d1861260657905090508152506000610220511215610f3f576000610220525b6102205160008112612606576102a05260206102a0610f6d56610f6d565b6000610220526020610220610f6d565bf35b634ee2cd7e8118611258576004358060a01c612606576101c0524360243511612606576101c05160e052602435610100526c050c783eb9b5c84000000000056101c05160a05260805260406080205461012052610fcd6102006122cb565b610200516101e05260046101e051633b9aca0081101561260657026c050c783eb9b5c84000000000046101c05160a052608052604060802001805461020052600181015461022052600281015461024052600381015461026052506003546102805260243560e05261028051610100526110486102c061212b565b6102c0516102a05260046102a0516c01431e0fae6d7217caa0000000811015612606570260040180546102c05260018101546102e0526002810154610300526003810154610320525060403661034037610280516102a051106110d85743610320518082106126065780820390509050610340524261030051808210612606578082039050905061036052611160565b60046102a0516001818183011061260657808201905090506c01431e0fae6d7217caa0000000811015612606570260040180546103805260018101546103a05260028101546103c05260038101546103e052506103e051610320518082106126065780820390509050610340526103c051610300518082106126065780820390509050610360525b6103005161038052600061034051146111ca5761038080516103605160243561032051808210612606578082039050905080820282158284830414171561260657905090506103405180801561260657820490509050818183011061260657808201905090508152505b6102008051610220516103805161024051808210612606578082039050905080607f1c612606578082028060801d81607f1d1861260657905090508082038060801d81607f1d186126065790509050815250600061020051121561123c5760006103a05260206103a061125656611256565b6102005160008112612606576103a05260206103a0611256565bf35b6318160ddd811861126d574261026052611280565b63bd85b039811861136257600435610260525b60006102805242610260511861129c57600354610280526112be565b6102605160e052600354610100526112b56102a06121fb565b6102a051610280525b6102805115611350576004610280516c01431e0fae6d7217caa0000000811015612606570260040180546102a05260018101546102c05260028101546102e052600381015461030052506102a05160e0526102c051610100526102e051610120526103005161014052610260516101605261133a61032061248f565b6103205161034052602061034061136056611360565b60006102a05260206102a0611360565bf35b63981b24d0811861157d574360043511612606576003546102605260043560e05261026051610100526113966102a061212b565b6102a051610280526004610280516c01431e0fae6d7217caa0000000811015612606570260040180546102a05260018101546102c05260028101546102e052600381015461030052506000610320526102605161028051106114615743610300511461152857600435610300518082106126065780820390509050426102e05180821061260657808203905090508082028215828483041417156126065790509050436103005180821061260657808203905090508080156126065782049050905061032052611528565b6004610280516001818183011061260657808201905090506c01431e0fae6d7217caa0000000811015612606570260040180546103405260018101546103605260028101546103805260038101546103a052506103a051610300511461152857600435610300518082106126065780820390509050610380516102e051808210612606578082039050905080820282158284830414171561260657905090506103a05161030051808210612606578082039050905080801561260657820490509050610320525b6102a05160e0526102c051610100526102e0516101205261030051610140526102e05161032051818183011061260657808201905090506101605261156e61034061248f565b61034051610360526020610360f35b63047fc9aa81186115945760015460e052602060e0f35b63cbf9fe5f81186115d4576004358060a01c6126065760e052600260e05160a0526080526040608020805461010052600181015461012052506040610100f35b63900cf0cf81186115eb5760035460e052602060e0f35b63d1febfb9811861163b5760046004356c01431e0fae6d7217caa00000008110156126065702600401805460e05260018101546101005260028101546101205260038101546101405250608060e0f35b6328d09d4781186116ac576004358060a01c6126065760e0526004602435633b9aca0081101561260657026c050c783eb9b5c840000000000460e05160a052608052604060802001805461010052600181015461012052600281015461014052600381015461016052506080610100f35b63010ae75781186116ed576004358060a01c6126065760e0526c050c783eb9b5c840000000000560e05160a052608052604060802054610100526020610100f35b6371197484811861171e576c050c783eb9b5c840000000000660043560a05260805260406080205460e052602060e0f35b638ff36fd18118611741576c050c783eb9b5c84000000000075460e052602060e0f35b637175d4f78118611764576c050c783eb9b5c84000000000085460e052602060e0f35b505b60006000fd5b3260e05114611875576c050c783eb9b5c84000000000085461010052600061010051146117db5763c23697a86101205260e051610140526020610120602461013c6000610100515af16117c4573d600060003e3d6000fd5b601f3d11156126065761012051156117db57611875565b6025610120527f536d61727420636f6e7472616374206465706f7369746f7273206e6f7420616c610140527f6c6f7765640000000000000000000000000000000000000000000000000000006101605261012050610120518061014001818260206001820306601f82010390500336823750506308c379a060e0526020610100526101205160206001820306601f820103905060440160fcfd5b565b61014036610180376003546102c052600060e051146119e8574261012051116118a15760006118a9565b600061010051135b1561190757610100516301e133808082058060801d81607f1d1861260657905090506101a0526101a0516101205142808210612606578082039050905080607f1c612606578082028060801d81607f1d186126065790509050610180525b426101605111611918576000611920565b600061014051135b1561197e57610140516301e133808082058060801d81607f1d18612606579050905061022052610220516101605142808210612606578082039050905080607f1c612606578082028060801d81607f1d186126065790509050610200525b6c050c783eb9b5c84000000000066101205160a05260805260406080205461028052600061016051146119e8576101205161016051186119c557610280516102a0526119e8565b6c050c783eb9b5c84000000000066101605160a0526080526040608020546102a0525b6040366102e0374261032052436103405260006102c0511115611a475760046102c0516c01431e0fae6d7217caa0000000811015612606570260040180546102e052600181015461030052600281015461032052600381015461034052505b61032051610360526102e05161038052610300516103a052610320516103c052610340516103e05260006104005261032051421115611ad557670de0b6b3a76400004361034051808210612606578082039050905080820282158284830414171561260657905090504261032051808210612606578082039050905080801561260657820490509050610400525b6103605162093a808082049050905062093a80808202821582848304141715612606579050905061042052610440600060ff818352015b610420805162093a8081818301106126065780820190509050815250600061046052426104205111611b5f576c050c783eb9b5c84000000000066104205160a05260805260406080205461046052611b65565b42610420525b6102e08051610300516104205161036051808210612606578082039050905080607f1c612606578082028060801d81607f1d1861260657905090508082038060801d81607f1d1861260657905090508152506103008051610460518082018060801d81607f1d18612606579050905081525060006102e0511215611bea5760006102e0525b6000610300511215611bfd576000610300525b610420516103605261042051610320526103e05161040051610420516103c05180821061260657808203905090508082028215828483041417156126065790509050670de0b6b3a76400008082049050905081818301106126065780820190509050610340526102c08051600181818301106126065780820190509050815250426104205118611c95574361034052611ce756611cd7565b60046102c0516c01431e0fae6d7217caa000000081101561260657026004016102e0518155610300516001820155610320516002820155610340516003820155505b8151600101808352811415611b0c575b50506102c051600355600060e05114611d90576103008051610220516101a0518082038060801d81607f1d1861260657905090508082018060801d81607f1d1861260657905090508152506102e0805161020051610180518082038060801d81607f1d1861260657905090508082018060801d81607f1d1861260657905090508152506000610300511215611d7d576000610300525b60006102e0511215611d905760006102e0525b60046102c0516c01431e0fae6d7217caa000000081101561260657026004016102e051815561030051600182015561032051600282015561034051600382015550600060e05114611f645742610120511115611e575761028080516101a0518082018060801d81607f1d186126065790509050815250610120516101605118611e34576102808051610220518082038060801d81607f1d1861260657905090508152505b610280516c050c783eb9b5c84000000000066101205160a0526080526040608020555b42610160511115611eb35761012051610160511115611eb3576102a08051610220518082038060801d81607f1d1861260657905090508152506102a0516c050c783eb9b5c84000000000066101605160a0526080526040608020555b6c050c783eb9b5c840000000000560e05160a05260805260406080205460018181830110612606578082019050905061044052610440516c050c783eb9b5c840000000000560e05160a05260805260406080205542610240524361026052600461044051633b9aca0081101561260657026c050c783eb9b5c840000000000460e05160a052608052604060802001610200518155610220516001820155610240516002820155610260516003820155505b565b6104e05161054052610500516105605260015461058052610580516104a05181818301106126065780820190509050600155610540516105a052610560516105c05261054080516104a05180607f1c612606578082018060801d81607f1d18612606579050905081525060006104c05114611fe4576104c051610560525b60026104805160a0526080526040608020610540518155610560516001820155506104805160e0526105a051610100526105c0516101205261054051610140526105605161016052612034611877565b60006104a0511461209a576323b872dd6105e052610480516106005230610620526104a0516106405260206105e060646105fc6000602061010038036080396080515af1612087573d600060003e3d6000fd5b601f3d1115612606576105e05115612606575b61056051610480517f4566dfc29f6f11d13a418c26a02bef7c28bae749d4de47e4e6a7cddea6730d596104a0516105e0526105205161060052426106205260606105e0a37f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c610580516105e052610580516104a051818183011061260657808201905090506106005260406105e0a1565b600061012052610100516101405261016060006080818352015b610140516101205110612157576121f0565b6101205161014051818183011061260657808201905090506001818183011061260657808201905090506002808204905090506101805260e05160036004610180516c01431e0fae6d7217caa00000008110156126065702600401015411156121d7576101805160018082106126065780820390509050610140526121e0565b61018051610120525b8151600101808352811415612145575b505061012051815250565b600061012052610100516101405261016060006080818352015b610140516101205110612227576122c0565b6101205161014051818183011061260657808201905090506001818183011061260657808201905090506002808204905090506101805260e05160026004610180516c01431e0fae6d7217caa00000008110156126065702600401015411156122a7576101805160018082106126065780820390509050610140526122b0565b61018051610120525b8151600101808352811415612215575b505061012051815250565b600061014052610120516101605261018060006080818352015b6101605161014051106122f7576123a2565b6101405161016051818183011061260657808201905090506001818183011061260657808201905090506002808204905090506101a05261010051600360046101a051633b9aca0081101561260657026c050c783eb9b5c840000000000460e05160a05260805260406080200101541115612389576101a0516001808210612606578082039050905061016052612392565b6101a051610140525b81516001018083528114156122e5575b505061014051815250565b600061014052610120516101605261018060006080818352015b6101605161014051106123d957612484565b6101405161016051818183011061260657808201905090506001818183011061260657808201905090506002808204905090506101a05261010051600260046101a051633b9aca0081101561260657026c050c783eb9b5c840000000000460e05160a0526080526040608020010154111561246b576101a0516001808210612606578082039050905061016052612474565b6101a051610140525b81516001018083528114156123c7575b505061014051815250565b60e05161018052610100516101a052610120516101c052610140516101e0526101c05162093a808082049050905062093a80808202821582848304141715612606579050905061020052610220600060ff818352015b610200805162093a808181830110612606578082019050905081525060006102405261016051610200511161253b576c050c783eb9b5c84000000000066102005160a05260805260406080205461024052612544565b61016051610200525b61018080516101a051610200516101c051808210612606578082039050905080607f1c612606578082028060801d81607f1d1861260657905090508082038060801d81607f1d1861260657905090508152506101605161020051186125a8576125e0565b6101a08051610240518082018060801d81607f1d186126065790509050815250610200516101c05281516001018083528114156124e5575b505060006101805112156125f5576000610180525b610180516000811261260657815250565b600080fd5b61013d6127480361013d6102e03961013d612748036101c051816102e001526101e0518161030001526102208051602001808361032001828460045afa905050506102808051602001808361038001828460045afa905050506102c051816103c0015280610100016102e0f35b600080fd", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-gauge-controller/index.ts b/balpy/balancer-deployments/tasks/20220325-gauge-controller/index.ts new file mode 100644 index 0000000..ed0350e --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-gauge-controller/index.ts @@ -0,0 +1,15 @@ +import { Task, TaskRunOptions } from '@src'; +import { GaugeSystemDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as GaugeSystemDeployment; + + const veBALArgs = [input.BPT, 'Vote Escrowed Balancer BPT', 'veBAL', input.AuthorizerAdaptor]; + const veBAL = await task.deploy('VotingEscrow', veBALArgs, from, force); + + const gaugeControllerArgs = [veBAL.address, input.AuthorizerAdaptor]; + const gaugeController = await task.deploy('GaugeController', gaugeControllerArgs, from, force); + + const minterArgs = [input.BalancerTokenAdmin, gaugeController.address]; + await task.deploy('BalancerMinter', minterArgs, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20220325-gauge-controller/input.ts b/balpy/balancer-deployments/tasks/20220325-gauge-controller/input.ts new file mode 100644 index 0000000..d4ebbbf --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-gauge-controller/input.ts @@ -0,0 +1,27 @@ +import { Task, TaskMode } from '@src'; + +export type GaugeSystemDeployment = { + BPT: string; + BalancerTokenAdmin: string; + AuthorizerAdaptor: string; +}; + +const AuthorizerAdaptor = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY); +const BalancerTokenAdmin = new Task('20220325-balancer-token-admin', TaskMode.READ_ONLY); + +export default { + AuthorizerAdaptor, + BalancerTokenAdmin, + mainnet: { + BPT: '0x5c6Ee304399DBdB9C8Ef030aB642B10820DB8F56', // BPT of the canonical 80-20 BAL-WETH Pool + }, + kovan: { + BPT: '0xDC2EcFDf2688f92c85064bE0b929693ACC6dBcA6', // BPT of an 80-20 BAL-WETH Pool using test BAL + }, + goerli: { + BPT: '0xf8a0623ab66F985EfFc1C69D05F1af4BaDB01b00', // BPT of an 80-20 BAL-WETH Pool using test BAL + }, + sepolia: { + BPT: '0x650C15c9CFc6063e5046813f079774f56946dF21', // BPT of an 80-20 BAL-WETH Pool using test BAL + }, +}; diff --git a/balpy/balancer-deployments/tasks/20220325-gauge-controller/output/goerli.json b/balpy/balancer-deployments/tasks/20220325-gauge-controller/output/goerli.json new file mode 100644 index 0000000..7247055 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-gauge-controller/output/goerli.json @@ -0,0 +1,5 @@ +{ + "VotingEscrow": "0x33A99Dcc4C85C014cf12626959111D5898bbCAbF", + "GaugeController": "0xBB1CE49b16d55A1f2c6e88102f32144C7334B116", + "BalancerMinter": "0xdf0399539A72E2689B8B2DD53C3C2A0883879fDd" +} diff --git a/balpy/balancer-deployments/tasks/20220325-gauge-controller/output/kovan.json b/balpy/balancer-deployments/tasks/20220325-gauge-controller/output/kovan.json new file mode 100644 index 0000000..7973afe --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-gauge-controller/output/kovan.json @@ -0,0 +1,5 @@ +{ + "VotingEscrow": "0x16ba924752EF283C7946db8A122a6742AA35C1DC", + "GaugeController": "0x35c425234DC42e7402f54cC54573f77842963a56", + "BalancerMinter": "0x1bbfa323155526F54EEc458571Bb5A75e0c41507" +} diff --git a/balpy/balancer-deployments/tasks/20220325-gauge-controller/output/mainnet.json b/balpy/balancer-deployments/tasks/20220325-gauge-controller/output/mainnet.json new file mode 100644 index 0000000..e58f976 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-gauge-controller/output/mainnet.json @@ -0,0 +1,5 @@ +{ + "VotingEscrow": "0xC128a9954e6c874eA3d62ce62B468bA073093F25", + "GaugeController": "0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD", + "BalancerMinter": "0x239e55F427D44C3cc793f49bFB507ebe76638a2b" +} diff --git a/balpy/balancer-deployments/tasks/20220325-gauge-controller/output/sepolia.json b/balpy/balancer-deployments/tasks/20220325-gauge-controller/output/sepolia.json new file mode 100644 index 0000000..e5c1146 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-gauge-controller/output/sepolia.json @@ -0,0 +1,5 @@ +{ + "VotingEscrow": "0x150A72e4D4d81BbF045565E232c50Ed0931ad795", + "GaugeController": "0x577e5993B9Cc480F07F98B5Ebd055604bd9071C4", + "BalancerMinter": "0x1783Cd84b3d01854A96B4eD5843753C2CcbD574A" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-gauge-controller/readme.md b/balpy/balancer-deployments/tasks/20220325-gauge-controller/readme.md new file mode 100644 index 0000000..b25a017 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-gauge-controller/readme.md @@ -0,0 +1,12 @@ +# 2022-03-25 - Gauge Controller + +Deployment of the `VotingEscrow`, which allows users to stake 80/20 BAL/WETH BPT to receive veBAL. Holding veBAL gives voting powers on the `GaugeController`, to direct BAL emissions to pool gauges. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`VotingEscrow` artifact](./artifact/VotingEscrow.json) +- [`GaugeController` artifact](./artifact/GaugeController.json) +- [`BalancerMinter` artifact](./artifact/BalancerMinter.json) diff --git a/balpy/balancer-deployments/tasks/20220325-test-balancer-token/artifact/TestBalancerToken.json b/balpy/balancer-deployments/tasks/20220325-test-balancer-token/artifact/TestBalancerToken.json new file mode 100644 index 0000000..58a4c6a --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-test-balancer-token/artifact/TestBalancerToken.json @@ -0,0 +1,700 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TestBalancerToken", + "sourceName": "contracts/test/TestBalancerToken.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "Snapshot", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MINTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SNAPSHOT_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burnFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "snapshot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101006040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960e0523480156200003657600080fd5b5060405162001b0838038062001b08833981810160405260608110156200005c57600080fd5b8151602083018051604051929492938301929190846401000000008211156200008457600080fd5b9083019060208201858111156200009a57600080fd5b8251640100000000811182820188101715620000b557600080fd5b82525081516020918201929091019080838360005b83811015620000e4578181015183820152602001620000ca565b50505050905090810190601f168015620001125780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200013657600080fd5b9083019060208201858111156200014c57600080fd5b82516401000000008111828201881017156200016757600080fd5b82525081516020918201929091019080838360005b83811015620001965781810151838201526020016200017c565b50505050905090810190601f168015620001c45780820380516001836020036101000a031916815260200191505b506040525050508180604051806040016040528060018152602001603160f81b8152508484816004908051906020019062000201929190620003f7565b50805162000217906005906020840190620003f7565b50506006805460ff1916601290811790915583516020948501206080528251929093019190912060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c052620002729150620002e0565b6200027f600084620002f6565b620002ab7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a684620002f6565b620002d77f5fdbd35e8da83ee755d5e62a539e5ed7f47126abede0b8b10f9ea43dc6eed07f84620002f6565b50505062000493565b6006805460ff191660ff92909216919091179055565b62000302828262000306565b5050565b6000828152602081815260409091206200032b91839062000df26200036d821b17901c565b15620003025760405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d90600090a45050565b60006200037b8383620003d6565b620003cc57508154600180820184556000848152602080822090930180546001600160a01b0319166001600160a01b03861690811790915585549082528286019093526040902091909155620003d0565b5060005b92915050565b6001600160a01b031660009081526001919091016020526040902054151590565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200043a57805160ff19168380011785556200046a565b828001600101855582156200046a579182015b828111156200046a5782518255916020019190600101906200044d565b50620004789291506200047c565b5090565b5b808211156200047857600081556001016200047d565b60805160a05160c05160e05161163f620004c960003980610bd352508061102c52508061106e52508061104d525061163f6000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806379cc6790116100f9578063a457c2d711610097578063d505accf11610071578063d505accf14610560578063d5391393146105b1578063d547741f146105b9578063dd62ed3e146105e5576101c4565b8063a457c2d7146104eb578063a9059cbb14610517578063ca15c87314610543576101c4565b806391d14854116100d357806391d14854146104a757806395d89b41146104d35780639711715a146104db578063a217fddf146104e3576101c4565b806379cc6790146104165780637ecebe00146104425780639010d07c14610468576101c4565b80633644e5151161016657806340c10f191161014057806340c10f191461039f57806342966c68146103cb5780637028e2cd146103e857806370a08231146103f0576101c4565b80633644e5151461033f57806336568abe146103475780633950935114610373576101c4565b806323b872dd116101a257806323b872dd146102a0578063248a9ca3146102d65780632f2ff15d146102f3578063313ce56714610321576101c4565b806306fdde03146101c9578063095ea7b31461024657806318160ddd14610286575b600080fd5b6101d1610613565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561020b5781810151838201526020016101f3565b50505050905090810190601f1680156102385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102726004803603604081101561025c57600080fd5b506001600160a01b0381351690602001356106c7565b604080519115158252519081900360200190f35b61028e6106de565b60408051918252519081900360200190f35b610272600480360360608110156102b657600080fd5b506001600160a01b038135811691602081013590911690604001356106e4565b61028e600480360360208110156102ec57600080fd5b5035610738565b61031f6004803603604081101561030957600080fd5b50803590602001356001600160a01b031661074d565b005b6103296107cc565b6040805160ff9092168252519081900360200190f35b61028e6107d5565b61031f6004803603604081101561035d57600080fd5b50803590602001356001600160a01b03166107e4565b6102726004803603604081101561038957600080fd5b506001600160a01b03813516906020013561084f565b61031f600480360360408110156103b557600080fd5b506001600160a01b038135169060200135610885565b61031f600480360360208110156103e157600080fd5b5035610924565b61028e610931565b61028e6004803603602081101561040657600080fd5b50356001600160a01b0316610955565b61031f6004803603604081101561042c57600080fd5b506001600160a01b038135169060200135610970565b61028e6004803603602081101561045857600080fd5b50356001600160a01b03166109a6565b61048b6004803603604081101561047e57600080fd5b50803590602001356109c1565b604080516001600160a01b039092168252519081900360200190f35b610272600480360360408110156104bd57600080fd5b50803590602001356001600160a01b03166109e0565b6101d16109f8565b61031f610a77565b61028e610b42565b6102726004803603604081101561050157600080fd5b506001600160a01b038135169060200135610b47565b6102726004803603604081101561052d57600080fd5b506001600160a01b038135169060200135610b80565b61028e6004803603602081101561055957600080fd5b5035610b8d565b61031f600480360360e081101561057657600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610ba4565b61028e610d32565b61031f600480360360408110156105cf57600080fd5b50803590602001356001600160a01b0316610d56565b61028e600480360360408110156105fb57600080fd5b506001600160a01b0381358116916020013516610dc7565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106bd5780601f10610692576101008083540402835291602001916106bd565b820191906000526020600020905b8154815290600101906020018083116106a057829003601f168201915b5050505050905090565b60006106d4338484610e6d565b5060015b92915050565b60035490565b60006106f1848484610ecf565b6001600160a01b03841660009081526002602090815260408083203380855292529091205461072e918691610729908661019e610fb9565b610e6d565b5060019392505050565b60009081526020819052604090206002015490565b60008281526020819052604090206002015461076990336109e0565b6107be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061157c602f913960400191505060405180910390fd5b6107c88282610fcf565b5050565b60065460ff1690565b60006107df611028565b905090565b6001600160a01b0381163314610845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806115db602f913960400191505060405180910390fd5b6107c882826110e6565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916106d4918590610729908661113f565b6108af7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336109e0565b61091a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4e4f545f4d494e54455200000000000000000000000000000000000000000000604482015290519081900360640190fd5b6107c88282611151565b61092e33826111e8565b50565b7f5fdbd35e8da83ee755d5e62a539e5ed7f47126abede0b8b10f9ea43dc6eed07f81565b6001600160a01b031660009081526001602052604090205490565b600061098a826101a16109838633610dc7565b9190610fb9565b9050610997833383610e6d565b6109a183836111e8565b505050565b6001600160a01b031660009081526007602052604090205490565b60008281526020819052604081206109d9908361129f565b9392505050565b60008281526020819052604081206109d990836112bb565b60058054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106bd5780601f10610692576101008083540402835291602001916106bd565b610aa17f5fdbd35e8da83ee755d5e62a539e5ed7f47126abede0b8b10f9ea43dc6eed07f336109e0565b610b0c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e4f545f534e415053484f545445520000000000000000000000000000000000604482015290519081900360640190fd5b604080516000815290517f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb679181900360200190a1565b600081565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916106d4918590610729908661019f610fb9565b60006106d4338484610ecf565b60008181526020819052604081206106d8906112dc565b610bb28442111560d16112e0565b6001600160a01b0380881660008181526007602090815260408083205481517f00000000000000000000000000000000000000000000000000000000000000008185015280830195909552948b166060850152608084018a905260a0840185905260c08085018a90528151808603909101815260e09094019052825192019190912090610c3e826112ee565b9050600060018288888860405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610c9c573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150610cfc90506001600160a01b03821615801590610cf457508b6001600160a01b0316826001600160a01b0316145b6101f86112e0565b6001600160a01b038b166000908152600760205260409020600185019055610d258b8b8b610e6d565b5050505050505050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b600082815260208190526040902060020154610d7290336109e0565b610845576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806115ab6030913960400191505060405180910390fd5b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6000610dfe83836112bb565b610e6557508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038616908117909155855490825282860190935260409020919091556106d8565b5060006106d8565b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b610ee66001600160a01b03841615156101986112e0565b610efd6001600160a01b03831615156101996112e0565b610f088383836109a1565b6001600160a01b038316600090815260016020526040902054610f2e90826101a0610fb9565b6001600160a01b038085166000908152600160205260408082209390935590841681522054610f5d908261113f565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000610fc884841115836112e0565b5050900390565b6000828152602081905260409020610fe79082610df2565b156107c85760405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d90600090a45050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611095611355565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b031681526020019550505050505060405160208183030381529060405280519060200120905090565b60008281526020819052604090206110fe9082611359565b156107c85760405133906001600160a01b0383169084907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90600090a45050565b60008282016109d984821015836112e0565b61115d600083836109a1565b60035461116a908261113f565b6003556001600160a01b038216600090815260016020526040902054611190908261113f565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6111ff6001600160a01b038316151561019b6112e0565b61120b826000836109a1565b6001600160a01b03821660009081526001602052604090205461123190826101b2610fb9565b6001600160a01b03831660009081526001602052604090205560035461125790826114d3565b6003556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b81546000906112b190831060646112e0565b6109d983836114e1565b6001600160a01b031660009081526001919091016020526040902054151590565b5490565b816107c8576107c88161150e565b60006112f8611028565b8260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b4690565b6001600160a01b038116600090815260018301602052604081205480156114c95783547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808301910180821461143b5760008660000182815481106113ba57fe5b60009182526020909120015487546001600160a01b03909116915081908890859081106113e357fe5b600091825260208083209190910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0394851617905592909116815260018881019092526040902090830190555b855486908061144657fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559092019092556001600160a01b03871682526001888101909152604082209190915593506106d892505050565b60009150506106d8565b60006109d983836001610fb9565b60008260000182815481106114f257fe5b6000918252602090912001546001600160a01b03169392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fdfe416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e74416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b65416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a26469706673582212202e95df132e8b80d62eb4d43b771505084f4dcd47ccd74e5ef4e71079b4175ee664736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806379cc6790116100f9578063a457c2d711610097578063d505accf11610071578063d505accf14610560578063d5391393146105b1578063d547741f146105b9578063dd62ed3e146105e5576101c4565b8063a457c2d7146104eb578063a9059cbb14610517578063ca15c87314610543576101c4565b806391d14854116100d357806391d14854146104a757806395d89b41146104d35780639711715a146104db578063a217fddf146104e3576101c4565b806379cc6790146104165780637ecebe00146104425780639010d07c14610468576101c4565b80633644e5151161016657806340c10f191161014057806340c10f191461039f57806342966c68146103cb5780637028e2cd146103e857806370a08231146103f0576101c4565b80633644e5151461033f57806336568abe146103475780633950935114610373576101c4565b806323b872dd116101a257806323b872dd146102a0578063248a9ca3146102d65780632f2ff15d146102f3578063313ce56714610321576101c4565b806306fdde03146101c9578063095ea7b31461024657806318160ddd14610286575b600080fd5b6101d1610613565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561020b5781810151838201526020016101f3565b50505050905090810190601f1680156102385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102726004803603604081101561025c57600080fd5b506001600160a01b0381351690602001356106c7565b604080519115158252519081900360200190f35b61028e6106de565b60408051918252519081900360200190f35b610272600480360360608110156102b657600080fd5b506001600160a01b038135811691602081013590911690604001356106e4565b61028e600480360360208110156102ec57600080fd5b5035610738565b61031f6004803603604081101561030957600080fd5b50803590602001356001600160a01b031661074d565b005b6103296107cc565b6040805160ff9092168252519081900360200190f35b61028e6107d5565b61031f6004803603604081101561035d57600080fd5b50803590602001356001600160a01b03166107e4565b6102726004803603604081101561038957600080fd5b506001600160a01b03813516906020013561084f565b61031f600480360360408110156103b557600080fd5b506001600160a01b038135169060200135610885565b61031f600480360360208110156103e157600080fd5b5035610924565b61028e610931565b61028e6004803603602081101561040657600080fd5b50356001600160a01b0316610955565b61031f6004803603604081101561042c57600080fd5b506001600160a01b038135169060200135610970565b61028e6004803603602081101561045857600080fd5b50356001600160a01b03166109a6565b61048b6004803603604081101561047e57600080fd5b50803590602001356109c1565b604080516001600160a01b039092168252519081900360200190f35b610272600480360360408110156104bd57600080fd5b50803590602001356001600160a01b03166109e0565b6101d16109f8565b61031f610a77565b61028e610b42565b6102726004803603604081101561050157600080fd5b506001600160a01b038135169060200135610b47565b6102726004803603604081101561052d57600080fd5b506001600160a01b038135169060200135610b80565b61028e6004803603602081101561055957600080fd5b5035610b8d565b61031f600480360360e081101561057657600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610ba4565b61028e610d32565b61031f600480360360408110156105cf57600080fd5b50803590602001356001600160a01b0316610d56565b61028e600480360360408110156105fb57600080fd5b506001600160a01b0381358116916020013516610dc7565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106bd5780601f10610692576101008083540402835291602001916106bd565b820191906000526020600020905b8154815290600101906020018083116106a057829003601f168201915b5050505050905090565b60006106d4338484610e6d565b5060015b92915050565b60035490565b60006106f1848484610ecf565b6001600160a01b03841660009081526002602090815260408083203380855292529091205461072e918691610729908661019e610fb9565b610e6d565b5060019392505050565b60009081526020819052604090206002015490565b60008281526020819052604090206002015461076990336109e0565b6107be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061157c602f913960400191505060405180910390fd5b6107c88282610fcf565b5050565b60065460ff1690565b60006107df611028565b905090565b6001600160a01b0381163314610845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806115db602f913960400191505060405180910390fd5b6107c882826110e6565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916106d4918590610729908661113f565b6108af7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336109e0565b61091a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4e4f545f4d494e54455200000000000000000000000000000000000000000000604482015290519081900360640190fd5b6107c88282611151565b61092e33826111e8565b50565b7f5fdbd35e8da83ee755d5e62a539e5ed7f47126abede0b8b10f9ea43dc6eed07f81565b6001600160a01b031660009081526001602052604090205490565b600061098a826101a16109838633610dc7565b9190610fb9565b9050610997833383610e6d565b6109a183836111e8565b505050565b6001600160a01b031660009081526007602052604090205490565b60008281526020819052604081206109d9908361129f565b9392505050565b60008281526020819052604081206109d990836112bb565b60058054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106bd5780601f10610692576101008083540402835291602001916106bd565b610aa17f5fdbd35e8da83ee755d5e62a539e5ed7f47126abede0b8b10f9ea43dc6eed07f336109e0565b610b0c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e4f545f534e415053484f545445520000000000000000000000000000000000604482015290519081900360640190fd5b604080516000815290517f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb679181900360200190a1565b600081565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916106d4918590610729908661019f610fb9565b60006106d4338484610ecf565b60008181526020819052604081206106d8906112dc565b610bb28442111560d16112e0565b6001600160a01b0380881660008181526007602090815260408083205481517f00000000000000000000000000000000000000000000000000000000000000008185015280830195909552948b166060850152608084018a905260a0840185905260c08085018a90528151808603909101815260e09094019052825192019190912090610c3e826112ee565b9050600060018288888860405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610c9c573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150610cfc90506001600160a01b03821615801590610cf457508b6001600160a01b0316826001600160a01b0316145b6101f86112e0565b6001600160a01b038b166000908152600760205260409020600185019055610d258b8b8b610e6d565b5050505050505050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b600082815260208190526040902060020154610d7290336109e0565b610845576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806115ab6030913960400191505060405180910390fd5b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6000610dfe83836112bb565b610e6557508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038616908117909155855490825282860190935260409020919091556106d8565b5060006106d8565b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b610ee66001600160a01b03841615156101986112e0565b610efd6001600160a01b03831615156101996112e0565b610f088383836109a1565b6001600160a01b038316600090815260016020526040902054610f2e90826101a0610fb9565b6001600160a01b038085166000908152600160205260408082209390935590841681522054610f5d908261113f565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000610fc884841115836112e0565b5050900390565b6000828152602081905260409020610fe79082610df2565b156107c85760405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d90600090a45050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611095611355565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b031681526020019550505050505060405160208183030381529060405280519060200120905090565b60008281526020819052604090206110fe9082611359565b156107c85760405133906001600160a01b0383169084907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90600090a45050565b60008282016109d984821015836112e0565b61115d600083836109a1565b60035461116a908261113f565b6003556001600160a01b038216600090815260016020526040902054611190908261113f565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6111ff6001600160a01b038316151561019b6112e0565b61120b826000836109a1565b6001600160a01b03821660009081526001602052604090205461123190826101b2610fb9565b6001600160a01b03831660009081526001602052604090205560035461125790826114d3565b6003556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b81546000906112b190831060646112e0565b6109d983836114e1565b6001600160a01b031660009081526001919091016020526040902054151590565b5490565b816107c8576107c88161150e565b60006112f8611028565b8260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b4690565b6001600160a01b038116600090815260018301602052604081205480156114c95783547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808301910180821461143b5760008660000182815481106113ba57fe5b60009182526020909120015487546001600160a01b03909116915081908890859081106113e357fe5b600091825260208083209190910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0394851617905592909116815260018881019092526040902090830190555b855486908061144657fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559092019092556001600160a01b03871682526001888101909152604082209190915593506106d892505050565b60009150506106d8565b60006109d983836001610fb9565b60008260000182815481106114f257fe5b6000918252602090912001546001600160a01b03169392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fdfe416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e74416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b65416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a26469706673582212202e95df132e8b80d62eb4d43b771505084f4dcd47ccd74e5ef4e71079b4175ee664736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-test-balancer-token/index.ts b/balpy/balancer-deployments/tasks/20220325-test-balancer-token/index.ts new file mode 100644 index 0000000..dfe36d5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-test-balancer-token/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { TestBalancerTokenDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as TestBalancerTokenDeployment; + + const args = [input.Admin, 'Balancer Governance Token', 'BAL']; + await task.deployAndVerify('TestBalancerToken', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20220325-test-balancer-token/input.ts b/balpy/balancer-deployments/tasks/20220325-test-balancer-token/input.ts new file mode 100644 index 0000000..df970eb --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-test-balancer-token/input.ts @@ -0,0 +1,21 @@ +export type TestBalancerTokenDeployment = { + Admin: string; +}; + +export default { + kovan: { + Admin: '0x77777512272eDA91589b62FC8506E607DEA0BB08', + }, + goerli: { + Admin: '0xE0a171587b1Cae546E069A943EDa96916F5EE977', + }, + sepolia: { + Admin: '0x171C0fF5943CE5f133130436A29bF61E26516003', + }, + base: { + Admin: '0xC40DCFB13651e64C8551007aa57F9260827B6462', + }, + fantom: { + Admin: '0x9d0327954009C59eD70Dc98b7726e911879d4D92', + }, +}; diff --git a/balpy/balancer-deployments/tasks/20220325-test-balancer-token/output/base.json b/balpy/balancer-deployments/tasks/20220325-test-balancer-token/output/base.json new file mode 100644 index 0000000..a14d9ec --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-test-balancer-token/output/base.json @@ -0,0 +1,3 @@ +{ + "TestBalancerToken": "0xA1Fa945425eD2e08Acb932E000bCc2f21B21588A" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-test-balancer-token/output/fantom.json b/balpy/balancer-deployments/tasks/20220325-test-balancer-token/output/fantom.json new file mode 100644 index 0000000..cc08a8a --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-test-balancer-token/output/fantom.json @@ -0,0 +1,3 @@ +{ + "TestBalancerToken": "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-test-balancer-token/output/goerli.json b/balpy/balancer-deployments/tasks/20220325-test-balancer-token/output/goerli.json new file mode 100644 index 0000000..899221c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-test-balancer-token/output/goerli.json @@ -0,0 +1,3 @@ +{ + "TestBalancerToken": "0xfA8449189744799aD2AcE7e0EBAC8BB7575eff47" +} diff --git a/balpy/balancer-deployments/tasks/20220325-test-balancer-token/output/kovan.json b/balpy/balancer-deployments/tasks/20220325-test-balancer-token/output/kovan.json new file mode 100644 index 0000000..ec5b0c4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-test-balancer-token/output/kovan.json @@ -0,0 +1,3 @@ +{ + "TestBalancerToken": "0xa2D801064652A269D92EE2A59F3261155ec66830" +} diff --git a/balpy/balancer-deployments/tasks/20220325-test-balancer-token/output/sepolia.json b/balpy/balancer-deployments/tasks/20220325-test-balancer-token/output/sepolia.json new file mode 100644 index 0000000..025bd56 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-test-balancer-token/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "TestBalancerToken": "0xb19382073c7A0aDdbb56Ac6AF1808Fa49e377B75" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-test-balancer-token/readme.md b/balpy/balancer-deployments/tasks/20220325-test-balancer-token/readme.md new file mode 100644 index 0000000..0b087fa --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-test-balancer-token/readme.md @@ -0,0 +1,11 @@ +# 2022-03-25 - Test Balancer Token + +Deployment of the `TestBalancerToken`, for replicating the BAL token's access control scheme on testnets + +## Useful Files + +- [Base mainnet addresses](./output/base.json) +- [Fantom mainnet addresses](./output/fantom.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`TestBalancerToken` artifact](./artifact/TestBalancerToken.json) diff --git a/balpy/balancer-deployments/tasks/20220325-ve-delegation/artifact/VotingEscrowDelegation.json b/balpy/balancer-deployments/tasks/20220325-ve-delegation/artifact/VotingEscrowDelegation.json new file mode 100644 index 0000000..838bb95 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-ve-delegation/artifact/VotingEscrowDelegation.json @@ -0,0 +1,946 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "VotingEscrowDelegation", + "sourceName": "@balancer-labs/liquidity-mining/contracts/VotingEscrowDelegation.vy", + "abi": [ + { + "name": "Approval", + "inputs": [ + { + "name": "_owner", + "type": "address", + "indexed": true + }, + { + "name": "_approved", + "type": "address", + "indexed": true + }, + { + "name": "_token_id", + "type": "uint256", + "indexed": true + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "ApprovalForAll", + "inputs": [ + { + "name": "_owner", + "type": "address", + "indexed": true + }, + { + "name": "_operator", + "type": "address", + "indexed": true + }, + { + "name": "_approved", + "type": "bool", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Transfer", + "inputs": [ + { + "name": "_from", + "type": "address", + "indexed": true + }, + { + "name": "_to", + "type": "address", + "indexed": true + }, + { + "name": "_token_id", + "type": "uint256", + "indexed": true + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "BurnBoost", + "inputs": [ + { + "name": "_delegator", + "type": "address", + "indexed": true + }, + { + "name": "_receiver", + "type": "address", + "indexed": true + }, + { + "name": "_token_id", + "type": "uint256", + "indexed": true + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "DelegateBoost", + "inputs": [ + { + "name": "_delegator", + "type": "address", + "indexed": true + }, + { + "name": "_receiver", + "type": "address", + "indexed": true + }, + { + "name": "_token_id", + "type": "uint256", + "indexed": true + }, + { + "name": "_amount", + "type": "uint256", + "indexed": false + }, + { + "name": "_cancel_time", + "type": "uint256", + "indexed": false + }, + { + "name": "_expire_time", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "ExtendBoost", + "inputs": [ + { + "name": "_delegator", + "type": "address", + "indexed": true + }, + { + "name": "_receiver", + "type": "address", + "indexed": true + }, + { + "name": "_token_id", + "type": "uint256", + "indexed": true + }, + { + "name": "_amount", + "type": "uint256", + "indexed": false + }, + { + "name": "_expire_time", + "type": "uint256", + "indexed": false + }, + { + "name": "_cancel_time", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "TransferBoost", + "inputs": [ + { + "name": "_from", + "type": "address", + "indexed": true + }, + { + "name": "_to", + "type": "address", + "indexed": true + }, + { + "name": "_token_id", + "type": "uint256", + "indexed": true + }, + { + "name": "_amount", + "type": "uint256", + "indexed": false + }, + { + "name": "_expire_time", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "GreyListUpdated", + "inputs": [ + { + "name": "_receiver", + "type": "address", + "indexed": true + }, + { + "name": "_delegator", + "type": "address", + "indexed": true + }, + { + "name": "_status", + "type": "bool", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "stateMutability": "nonpayable", + "type": "constructor", + "inputs": [ + { + "name": "_voting_escrow", + "type": "address" + }, + { + "name": "_name", + "type": "string" + }, + { + "name": "_symbol", + "type": "string" + }, + { + "name": "_base_uri", + "type": "string" + }, + { + "name": "_authorizer_adaptor", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "admin", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "_approved", + "type": "address" + }, + { + "name": "_token_id", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_token_id", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_token_id", + "type": "uint256" + }, + { + "name": "_data", + "type": "bytes" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "setApprovalForAll", + "inputs": [ + { + "name": "_operator", + "type": "address" + }, + { + "name": "_approved", + "type": "bool" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_token_id", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "tokenURI", + "inputs": [ + { + "name": "_token_id", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "burn", + "inputs": [ + { + "name": "_token_id", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "create_boost", + "inputs": [ + { + "name": "_delegator", + "type": "address" + }, + { + "name": "_receiver", + "type": "address" + }, + { + "name": "_percentage", + "type": "int256" + }, + { + "name": "_cancel_time", + "type": "uint256" + }, + { + "name": "_expire_time", + "type": "uint256" + }, + { + "name": "_id", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "extend_boost", + "inputs": [ + { + "name": "_token_id", + "type": "uint256" + }, + { + "name": "_percentage", + "type": "int256" + }, + { + "name": "_expire_time", + "type": "uint256" + }, + { + "name": "_cancel_time", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "cancel_boost", + "inputs": [ + { + "name": "_token_id", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "batch_cancel_boosts", + "inputs": [ + { + "name": "_token_ids", + "type": "uint256[256]" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "set_delegation_status", + "inputs": [ + { + "name": "_receiver", + "type": "address" + }, + { + "name": "_delegator", + "type": "address" + }, + { + "name": "_status", + "type": "bool" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "batch_set_delegation_status", + "inputs": [ + { + "name": "_receiver", + "type": "address" + }, + { + "name": "_delegators", + "type": "address[256]" + }, + { + "name": "_status", + "type": "uint256[256]" + } + ], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "adjusted_balance_of", + "inputs": [ + { + "name": "_account", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "delegated_boost", + "inputs": [ + { + "name": "_account", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "received_boost", + "inputs": [ + { + "name": "_account", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "token_boost", + "inputs": [ + { + "name": "_token_id", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "int256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "token_expiry", + "inputs": [ + { + "name": "_token_id", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "token_cancel_time", + "inputs": [ + { + "name": "_token_id", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "calc_boost_bias_slope", + "inputs": [ + { + "name": "_delegator", + "type": "address" + }, + { + "name": "_percentage", + "type": "int256" + }, + { + "name": "_expire_time", + "type": "int256" + } + ], + "outputs": [ + { + "name": "", + "type": "int256" + }, + { + "name": "", + "type": "int256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "calc_boost_bias_slope", + "inputs": [ + { + "name": "_delegator", + "type": "address" + }, + { + "name": "_percentage", + "type": "int256" + }, + { + "name": "_expire_time", + "type": "int256" + }, + { + "name": "_extend_token_id", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "int256" + }, + { + "name": "", + "type": "int256" + } + ] + }, + { + "stateMutability": "pure", + "type": "function", + "name": "get_token_id", + "inputs": [ + { + "name": "_delegator", + "type": "address" + }, + { + "name": "_id", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "set_base_uri", + "inputs": [ + { + "name": "_base_uri", + "type": "string" + } + ], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "getApproved", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "isApprovedForAll", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "ownerOf", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "base_uri", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "tokenByIndex", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "tokenOfOwnerByIndex", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "token_of_delegator_by_index", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "total_minted", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "account_expiries", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "grey_list", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + } + ], + "bytecode": "0x6020614af76080396080518060a01c614af25760e05260206020614af701608039608051614af701602060208260803960805111614af2578060208160803960805160200180826101003950505060206040614af701608039608051614af701602060208260803960805111614af2578060208160803960805160200180826101403950505060206060614af701608039608051614af701608060208260803960805111614af2578060208160803960805160200180826101803950505060206080614af7016080396080518060a01c614af2576102205260e051610240526102205161026052610100806004602082510160c060006002818352015b8260c051602002111561010e5761012d565b60c05160200285015160c05185015581516001018083528114156100fc575b505050505050610140806006602082510160c060006002818352015b8260c051602002111561015b5761017a565b60c05160200285015160c0518501558151600101808352811415610149575b505050505050610180806008602082510160c060006005818352015b8260c05160200211156101a8576101c7565b60c05160200285015160c0518501558151600101808352811415610196575b505050505050614ac056600436101561000d57612fe0565b60046000601c37600051346148e95763f851a440811861003c5760206020380360803960805160e052602060e0f35b63095ea7b381186100c0576004358060a01c6148e95761014052600360243560a0526080526040608020546101605261016051331861007c57600161009b565b60026101605160a05260805260406080203360a0526080526040608020545b156148e9576101605160e0526101405161010052602435610120526100be612fe6565b005b6342842e0e81186100ec5760006114e0526114e08051602001806104c0828460045afa90505050610117565b63b88d4fde81186102a3576064356004016110008135116148e95780803560200180826104c0375050505b6004358060a01c6148e957610480526024358060a01c6148e9576104a0523360e0526044356101005261014b611500613030565b61150051156148e95761048051610300526104a051610320526044356103405261017361406d565b60006104a0513b11156102a15763150b7a02611520526115408060803382526020820191506104805182526020820191506044358252602082019150808252808301806104c080516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f82010390509050905081015050505060206115206110a461153c60006104a0515af1610227573d600060003e3d6000fd5b601f3d11156148e95761152051611500526004611620527f150b7a0200000000000000000000000000000000000000000000000000000000611640526116206020015160006004602082066115c0016020828401116148e9576020806115e08261150060045afa50508181529050905060200151186148e9575b005b63a22cb4658118610321576004358060a01c6148e95760e0526024358060011c6148e957610100526101005160023360a052608052604060802060e05160a05260805260406080205560e051337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3161010051610120526020610120a3005b6323b872dd811861038a576004358060a01c6148e957610480526024358060a01c6148e9576104a0523360e052604435610100526103606104c0613030565b6104c051156148e95761048051610300526104a051610320526044356103405261038861406d565b005b63c87b56dd811861048d576104a080602080825260006008600181016020836103a00101825460c060006004818352015b8260c05160200211156103cd576103ec565b60c05185015460c05160200285015281516001018083528114156103bb575b50505050508054820191505060043560e05261040961032061467a565b610320604e806020846103a00101826020850160045afa505080518201915050806103a0526103a09050818401808280516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050905081019050905090506104a0f35b6342966c688118610595573360e052600435610100526104ae610300613030565b61030051156148e957601160043560a0526080526040608020546103005260006103005114610584576103005160e0526104e9610360613f24565b6103608051610320526020810151610340525060043560601c8060a01c6148e95761036052600360043560a0526080526040608020546103805260043560e0526103605161010052610380516101205261032051610140526103405161016052610551613b3c565b60043561038051610360517f64ddd743466fd725d437a06c1600041c3a8e6566a51cbfb4b73ee501db94657460006103a0a45b60043561028052610593613814565b005b63f18124d78118610a2c576004358060a01c6148e9576102c0526024358060a01c6148e9576102e0526102c05133186105cf5760016105ee565b60026102c05160a05260805260406080203360a0526080526040608020545b156148e95760843562093a808082049050905062093a808082028215828483041417156148e9579050905061030052600260106102c05160a052608052604060802001546103205261032051700100000000000000000000000000000000808206905090506103405261034051610685577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610340525b610340514210156148e957600060443513156148e957612710604435136148e95761030051606435116148e9574262093a8081818301106148e9578082019050905061030051106148e95763adc63589610360526102c051610380526020610360602461037c6020604038036080396080515afa610708573d600060003e3d6000fd5b601f3d11156148e9576103605161030051116148e9576c0100000000000000000000000060a43510156148e9576102c05160601b60a43581818301106148e95780820190509050610360526102e05161028052610360516102a05261076b6138e8565b60106102c05160a05260805260406080205460e05261078b6103c0613f24565b6103c080516103805260208101516103a0525042600160ff1b8110156148e9576103c0526103a0516103c051808202600160ff1b82141560001984141517156148e9578215828483051417156148e957905090506103805180820182811260008312168382121560008412151617156148e957905090506103e0526044356370a08231610420526102c051610440526020610420602461043c6020604038036080396080515afa610841573d600060003e3d6000fd5b601f3d11156148e957610420516103e05180820382811360008312168382131560008412151617156148e95790509050808202600160ff1b82141560001984141517156148e9578215828483051417156148e95790509050612710808205905090506104005260006104005113156148e9576103c05160e052610400516101005261030051600160ff1b8110156148e957610120526108e1610420613f93565b61042080516103805260208101516103a0525060006103a05112156148e9576103605160e0526102c051610100526102e0516101205261038051610140526103a0516101605260643561018052610300516101a05261093e6139b0565b610340516103005110156109555761030051610340525b6103205160801c6104205260146102c05160a05260805260406080206103005160a05260805260406080208054600181818301106148e9578082019050905081555061042051600181818301106148e9578082019050905060801b6103405181818301106148e95780820190509050600260106102c05160a05260805260406080200155610360516102e0516102c0517f94be29eae3a624a5241431d7a0daf467ac52ecf3071f7a028d5b2adc802b213d61040051600081126148e9576104405260643561046052608435610480526060610440a4005b63d47dd2648118610fb05760043560601c8060a01c6148e95761030052600360043560a05260805260406080205461032052610300513318610a6f576001610a8e565b60026103005160a05260805260406080203360a0526080526040608020545b156148e957600061032051146148e957600060243513156148e957612710602435136148e957601160043560a052608052604060802080546103405260018101546103605260028101546103805260038101546103a0525060443562093a808082049050905062093a808082028215828483041417156148e957905090506103c0526103c051606435116148e9574262093a8081818301106148e957808201905090506103c051106148e95763adc635896103e052610300516104005260206103e060246103fc6020604038036080396080515afa610b72573d600060003e3d6000fd5b601f3d11156148e9576103e0516103c051116148e9576103405160e052610b9a610420613f24565b61042080516103e0526020810151610400525042600160ff1b8110156148e957610420526104005161042051808202600160ff1b82141560001984141517156148e9578215828483051417156148e957905090506103e05180820182811260008312168382121560008412151617156148e95790509050610440526103a0516103c051106148e95761036051700100000000000000000000000000000000808206905090506064351015610c53576103a05142106148e9575b60043560e052610300516101005261032051610120526103e051610140526104005161016052610c81613b3c565b600260106103005160a052608052604060802001546104605261046051700100000000000000000000000000000000808206905090506104805261048051610ce9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610480525b610480514210156148e95760106103005160a05260805260406080205460e052610d146104a0613f24565b6104a080516103e052602081015161040052506104005161042051808202600160ff1b82141560001984141517156148e9578215828483051417156148e957905090506103e05180820182811260008312168382121560008412151617156148e957905090506104a0526024356370a082316104e052610300516105005260206104e060246104fc6020604038036080396080515afa610db9573d600060003e3d6000fd5b601f3d11156148e9576104e0516104a05180820382811360008312168382131560008412151617156148e95790509050808202600160ff1b82141560001984141517156148e9578215828483051417156148e95790509050612710808205905090506104c05260006104c05113156148e957610440516104c051126148e9576104205160e0526104c051610100526103c051600160ff1b8110156148e95761012052610e666104e0613f93565b6104e080516103e0526020810151610400525060006104005112156148e95760043560e052610300516101005261032051610120526103e051610140526104005161016052606435610180526103c0516101a052610ec26139b0565b610480516103c0511015610ed9576103c051610480525b6104605160801c6104e05260146103005160a05260805260406080206103c05160a05260805260406080208054600181818301106148e957808201905090508155506104e051600181818301106148e9578082019050905060801b6104805181818301106148e95780820190509050600260106103005160a0526080526040608020015560043561032051610300517f3a64a6e1360126485cdd1af7816469a376b21ae1de281a20c42c1d06968552866104c051600081126148e957610500526103c05161052052606435610540526060610500a4005b63a53ae7638118610fd157600435610300523361032052610fcf6143a8565b005b63dcd03345811861102e576104c06000610100818352015b60206104c05102600401356104a0526104a0516110055761102a565b6104a05161030052336103205261101a6143a8565b8151600101808352811415610fe9575b5050005b630c40519781186110bc576004358060a01c6148e957610160526024358060a01c6148e957610180526044358060011c6148e9576101a052610160513318611077576001611096565b60026101605160a05260805260406080203360a0526080526040608020545b156148e9576101605160e05261018051610100526101a051610120526110ba61461e565b005b6390546fbe8118612179576004358060a01c6148e957610160526024358060a01c6148e957610180526044358060a01c6148e9576101a0526064358060a01c6148e9576101c0526084358060a01c6148e9576101e05260a4358060a01c6148e9576102005260c4358060a01c6148e9576102205260e4358060a01c6148e95761024052610104358060a01c6148e95761026052610124358060a01c6148e95761028052610144358060a01c6148e9576102a052610164358060a01c6148e9576102c052610184358060a01c6148e9576102e0526101a4358060a01c6148e957610300526101c4358060a01c6148e957610320526101e4358060a01c6148e95761034052610204358060a01c6148e95761036052610224358060a01c6148e95761038052610244358060a01c6148e9576103a052610264358060a01c6148e9576103c052610284358060a01c6148e9576103e0526102a4358060a01c6148e957610400526102c4358060a01c6148e957610420526102e4358060a01c6148e95761044052610304358060a01c6148e95761046052610324358060a01c6148e95761048052610344358060a01c6148e9576104a052610364358060a01c6148e9576104c052610384358060a01c6148e9576104e0526103a4358060a01c6148e957610500526103c4358060a01c6148e957610520526103e4358060a01c6148e95761054052610404358060a01c6148e95761056052610424358060a01c6148e95761058052610444358060a01c6148e9576105a052610464358060a01c6148e9576105c052610484358060a01c6148e9576105e0526104a4358060a01c6148e957610600526104c4358060a01c6148e957610620526104e4358060a01c6148e95761064052610504358060a01c6148e95761066052610524358060a01c6148e95761068052610544358060a01c6148e9576106a052610564358060a01c6148e9576106c052610584358060a01c6148e9576106e0526105a4358060a01c6148e957610700526105c4358060a01c6148e957610720526105e4358060a01c6148e95761074052610604358060a01c6148e95761076052610624358060a01c6148e95761078052610644358060a01c6148e9576107a052610664358060a01c6148e9576107c052610684358060a01c6148e9576107e0526106a4358060a01c6148e957610800526106c4358060a01c6148e957610820526106e4358060a01c6148e95761084052610704358060a01c6148e95761086052610724358060a01c6148e95761088052610744358060a01c6148e9576108a052610764358060a01c6148e9576108c052610784358060a01c6148e9576108e0526107a4358060a01c6148e957610900526107c4358060a01c6148e957610920526107e4358060a01c6148e95761094052610804358060a01c6148e95761096052610824358060a01c6148e95761098052610844358060a01c6148e9576109a052610864358060a01c6148e9576109c052610884358060a01c6148e9576109e0526108a4358060a01c6148e957610a00526108c4358060a01c6148e957610a20526108e4358060a01c6148e957610a4052610904358060a01c6148e957610a6052610924358060a01c6148e957610a8052610944358060a01c6148e957610aa052610964358060a01c6148e957610ac052610984358060a01c6148e957610ae0526109a4358060a01c6148e957610b00526109c4358060a01c6148e957610b20526109e4358060a01c6148e957610b4052610a04358060a01c6148e957610b6052610a24358060a01c6148e957610b8052610a44358060a01c6148e957610ba052610a64358060a01c6148e957610bc052610a84358060a01c6148e957610be052610aa4358060a01c6148e957610c0052610ac4358060a01c6148e957610c2052610ae4358060a01c6148e957610c4052610b04358060a01c6148e957610c6052610b24358060a01c6148e957610c8052610b44358060a01c6148e957610ca052610b64358060a01c6148e957610cc052610b84358060a01c6148e957610ce052610ba4358060a01c6148e957610d0052610bc4358060a01c6148e957610d2052610be4358060a01c6148e957610d4052610c04358060a01c6148e957610d6052610c24358060a01c6148e957610d8052610c44358060a01c6148e957610da052610c64358060a01c6148e957610dc052610c84358060a01c6148e957610de052610ca4358060a01c6148e957610e0052610cc4358060a01c6148e957610e2052610ce4358060a01c6148e957610e4052610d04358060a01c6148e957610e6052610d24358060a01c6148e957610e8052610d44358060a01c6148e957610ea052610d64358060a01c6148e957610ec052610d84358060a01c6148e957610ee052610da4358060a01c6148e957610f0052610dc4358060a01c6148e957610f2052610de4358060a01c6148e957610f4052610e04358060a01c6148e957610f6052610e24358060a01c6148e957610f8052610e44358060a01c6148e957610fa052610e64358060a01c6148e957610fc052610e84358060a01c6148e957610fe052610ea4358060a01c6148e95761100052610ec4358060a01c6148e95761102052610ee4358060a01c6148e95761104052610f04358060a01c6148e95761106052610f24358060a01c6148e95761108052610f44358060a01c6148e9576110a052610f64358060a01c6148e9576110c052610f84358060a01c6148e9576110e052610fa4358060a01c6148e95761110052610fc4358060a01c6148e95761112052610fe4358060a01c6148e95761114052611004358060a01c6148e95761116052611024358060a01c6148e95761118052611044358060a01c6148e9576111a052611064358060a01c6148e9576111c052611084358060a01c6148e9576111e0526110a4358060a01c6148e957611200526110c4358060a01c6148e957611220526110e4358060a01c6148e95761124052611104358060a01c6148e95761126052611124358060a01c6148e95761128052611144358060a01c6148e9576112a052611164358060a01c6148e9576112c052611184358060a01c6148e9576112e0526111a4358060a01c6148e957611300526111c4358060a01c6148e957611320526111e4358060a01c6148e95761134052611204358060a01c6148e95761136052611224358060a01c6148e95761138052611244358060a01c6148e9576113a052611264358060a01c6148e9576113c052611284358060a01c6148e9576113e0526112a4358060a01c6148e957611400526112c4358060a01c6148e957611420526112e4358060a01c6148e95761144052611304358060a01c6148e95761146052611324358060a01c6148e95761148052611344358060a01c6148e9576114a052611364358060a01c6148e9576114c052611384358060a01c6148e9576114e0526113a4358060a01c6148e957611500526113c4358060a01c6148e957611520526113e4358060a01c6148e95761154052611404358060a01c6148e95761156052611424358060a01c6148e95761158052611444358060a01c6148e9576115a052611464358060a01c6148e9576115c052611484358060a01c6148e9576115e0526114a4358060a01c6148e957611600526114c4358060a01c6148e957611620526114e4358060a01c6148e95761164052611504358060a01c6148e95761166052611524358060a01c6148e95761168052611544358060a01c6148e9576116a052611564358060a01c6148e9576116c052611584358060a01c6148e9576116e0526115a4358060a01c6148e957611700526115c4358060a01c6148e957611720526115e4358060a01c6148e95761174052611604358060a01c6148e95761176052611624358060a01c6148e95761178052611644358060a01c6148e9576117a052611664358060a01c6148e9576117c052611684358060a01c6148e9576117e0526116a4358060a01c6148e957611800526116c4358060a01c6148e957611820526116e4358060a01c6148e95761184052611704358060a01c6148e95761186052611724358060a01c6148e95761188052611744358060a01c6148e9576118a052611764358060a01c6148e9576118c052611784358060a01c6148e9576118e0526117a4358060a01c6148e957611900526117c4358060a01c6148e957611920526117e4358060a01c6148e95761194052611804358060a01c6148e95761196052611824358060a01c6148e95761198052611844358060a01c6148e9576119a052611864358060a01c6148e9576119c052611884358060a01c6148e9576119e0526118a4358060a01c6148e957611a00526118c4358060a01c6148e957611a20526118e4358060a01c6148e957611a4052611904358060a01c6148e957611a6052611924358060a01c6148e957611a8052611944358060a01c6148e957611aa052611964358060a01c6148e957611ac052611984358060a01c6148e957611ae0526119a4358060a01c6148e957611b00526119c4358060a01c6148e957611b20526119e4358060a01c6148e957611b4052611a04358060a01c6148e957611b6052611a24358060a01c6148e957611b8052611a44358060a01c6148e957611ba052611a64358060a01c6148e957611bc052611a84358060a01c6148e957611be052611aa4358060a01c6148e957611c0052611ac4358060a01c6148e957611c2052611ae4358060a01c6148e957611c4052611b04358060a01c6148e957611c6052611b24358060a01c6148e957611c8052611b44358060a01c6148e957611ca052611b64358060a01c6148e957611cc052611b84358060a01c6148e957611ce052611ba4358060a01c6148e957611d0052611bc4358060a01c6148e957611d2052611be4358060a01c6148e957611d4052611c04358060a01c6148e957611d6052611c24358060a01c6148e957611d8052611c44358060a01c6148e957611da052611c64358060a01c6148e957611dc052611c84358060a01c6148e957611de052611ca4358060a01c6148e957611e0052611cc4358060a01c6148e957611e2052611ce4358060a01c6148e957611e4052611d04358060a01c6148e957611e6052611d24358060a01c6148e957611e8052611d44358060a01c6148e957611ea052611d64358060a01c6148e957611ec052611d84358060a01c6148e957611ee052611da4358060a01c6148e957611f0052611dc4358060a01c6148e957611f2052611de4358060a01c6148e957611f4052611e04358060a01c6148e957611f6052611e24358060a01c6148e957611f8052611e44358060a01c6148e957611fa052611e64358060a01c6148e957611fc052611e84358060a01c6148e957611fe052611ea4358060a01c6148e95761200052611ec4358060a01c6148e95761202052611ee4358060a01c6148e95761204052611f04358060a01c6148e95761206052611f24358060a01c6148e95761208052611f44358060a01c6148e9576120a052611f64358060a01c6148e9576120c052611f84358060a01c6148e9576120e052611fa4358060a01c6148e95761210052611fc4358060a01c6148e95761212052611fe4358060a01c6148e95761214052612004358060a01c6148e957612160526101605133186120e05760016120ff565b60026101605160a05260805260406080203360a0526080526040608020545b156148e9576121806000610100818352015b6001602061218051026120240135111561212a57612175565b6101605160e052610180612180516101008110156148e95760200201516101005260206121805102612024013515156101205261216561461e565b8151600101808352811415612111575b5050005b63bbf7408a811861242f576004358060a01c6148e95761010052600260106101005160a05260805260406080200154700100000000000000000000000000000000808206905090506101205260006101205114156121d85760006121df565b4261012051105b156121f457600061014052602061014061242d565b6370a082316101605261010051610180526020610160602461017c6020604038036080396080515afa61222c573d600060003e3d6000fd5b601f3d11156148e957610160516101405260106101005160a052608052604060802080546101605260018101546101805260028101546101a0525042600160ff1b8110156148e9576101c05260006101605114612342576101605160e052612295610220613f24565b61022080516101e052602081015161020052506101408051610200516101c051808202600160ff1b82141560001984141517156148e9578215828483051417156148e957905090506101e05180820182811260008312168382121560008412151617156148e957905090506000811261230e578061231d565b8060000381146148e957806000035b905080820382811360008312168382131560008412151617156148e957905090508152505b60006101805114612402576101805160e05261235f610220613f24565b61022080516101e052602081015161020052506101408051610200516101c051808202600160ff1b82141560001984141517156148e9578215828483051417156148e957905090506101e05180820182811260008312168382121560008412151617156148e9579050905060008082126123d957816123db565b805b9050905080820182811260008312168382121560008412151617156148e957905090508152505b6101405160008082126124155781612417565b805b90509050600081126148e9576101e05260206101e05bf35b63c06a5b558118612512576004358060a01c6148e9576101005260106101005160a05260805260406080205460e052612469610160613f24565b6101608051610120526020810151610140525042600160ff1b8110156148e957610160526101405161016051808202600160ff1b82141560001984141517156148e9578215828483051417156148e957905090506101205180820182811260008312168382121560008412151617156148e95790509050600081126124ee57806124fd565b8060000381146148e957806000035b9050600081126148e957610180526020610180f35b63a98b81e081186125ee576004358060a01c6148e95761010052600160106101005160a0526080526040608020015460e05261254f610160613f24565b6101608051610120526020810151610140525042600160ff1b8110156148e957610160526101405161016051808202600160ff1b82141560001984141517156148e9578215828483051417156148e957905090506101205180820182811260008312168382121560008412151617156148e9579050905060008082126125d557816125d7565b805b90509050600081126148e957610180526020610180f35b63f01e4f0b811861269a57601160043560a05260805260406080205460e052612618610140613f24565b6101408051610100526020810151610120525042600160ff1b8110156148e957610140526101205161014051808202600160ff1b82141560001984141517156148e9578215828483051417156148e957905090506101005180820182811260008312168382121560008412151617156148e95790509050610160526020610160f35b636d1ac9b581186126c2576003601160043560a0526080526040608020015460e052602060e0f35b63f2f60c958118612703576001601160043560a052608052604060802001547001000000000000000000000000000000008082069050905060e052602060e0f35b63058351fb81186127195760006101205261272c565b63f2f6418f8118612a7857606435610120525b6004358060a01c6148e9576101005242600160ff1b8110156148e95761014052600060243513156148e957612710602435136148e9576101405162093a8081818301126148e9578082019050905060443513156148e95763adc6358961018052610100516101a0526020610180602461019c6020604038036080396080515afa6127bb573d600060003e3d6000fd5b601f3d11156148e95761018051600160ff1b8110156148e9576101605261016051604435136148e95760106101005160a05260805260406080205461018052600061012051141561280d576000612822565b610100516101205160601c8060a01c6148e957145b1561285057610180805160116101205160a0526080526040608020548082106148e957808203905090508152505b6101805160e0526128626101e0613f24565b6101e080516101a05260208101516101c052506101c05161014051808202600160ff1b82141560001984141517156148e9578215828483051417156148e957905090506101a05180820182811260008312168382121560008412151617156148e957905090506101e05260006101e051126148e9576024356370a082316102205261010051610240526020610220602461023c6020604038036080396080515afa612912573d600060003e3d6000fd5b601f3d11156148e957610220516101e05180820382811360008312168382131560008412151617156148e95790509050808202600160ff1b82141560001984141517156148e9578215828483051417156148e95790509050612710808205905090506102005260006102005113156148e957610200517f80000000000000000000000000000000000000000000000000000000000000008113156148e9576000036044356101405180820382811360008312168382131560008412151617156148e95790509050600160ff1b82141560001982141517156148e9578080156148e9578205905090506102205260006102205112156148e957610200516102205161014051808202600160ff1b82141560001984141517156148e9578215828483051417156148e9579050905080820382811360008312168382131560008412151617156148e9579050905061024052610240516102605261022051610280526040610260f35b6302a968258118612acc576004358060a01c6148e95760e0526c0100000000000000000000000060243510156148e95760e05160601b60243581818301106148e95780820190509050610100526020610100f35b63af1c52118118612b545760043560040160808135116148e957808035602001808260e03750505060206020380360803960805133186148e95760e0806008602082510160c060006005818352015b8260c0516020021115612b2d57612b4c565b60c05160200285015160c0518501558151600101808352811415612b1b575b505050505050005b6370a082318118612b89576004358060a01c6148e95760e052600060e05160a052608052604060802054610100526020610100f35b63081812fc8118612bae57600160043560a05260805260406080205460e052602060e0f35b63e985e9c58118612c01576004358060a01c6148e95760e0526024358060a01c6148e95761010052600260e05160a05260805260406080206101005160a052608052604060802054610120526020610120f35b636352211e8118612c2657600360043560a05260805260406080205460e052602060e0f35b6306fdde038118612cc95760e08060208082528083018060048082602082540160c060006002818352015b8260c0516020021115612c6357612c82565b60c05185015460c0516020028501528151600101808352811415612c51575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810190509050905060e0f35b6395d89b418118612d6c5760e08060208082528083018060068082602082540160c060006002818352015b8260c0516020021115612d0657612d25565b60c05185015460c0516020028501528151600101808352811415612cf4575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810190509050905060e0f35b63786f29108118612e0f5760e08060208082528083018060088082602082540160c060006005818352015b8260c0516020021115612da957612dc8565b60c05185015460c0516020028501528151600101808352811415612d97575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810190509050905060e0f35b6318160ddd8118612e2657600d5460e052602060e0f35b634f6ccce78118612e4b57600e60043560a05260805260406080205460e052602060e0f35b632f745c598118612eaf576004358060a01c6148e95760e05260016024357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156148e95702600f60e05160a05260805260406080200154610100526020610100f35b6332accbe68118612f13576004358060a01c6148e95760e05260016024357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156148e95702601260e05160a05260805260406080200154610100526020610100f35b63e47b270b8118612f48576004358060a01c6148e95760e052601360e05160a052608052604060802054610100526020610100f35b63734e06948118612f8b576004358060a01c6148e95760e052601460e05160a052608052604060802060243560a052608052604060802054610100526020610100f35b63d91981888118612fde576004358060a01c6148e95760e0526024358060a01c6148e95761010052601560e05160a05260805260406080206101005160a052608052604060802054610120526020610120f35b505b60006000fd5b6101005160016101205160a052608052604060802055610120516101005160e0517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256000610140a4565b60036101005160a052608052604060802054610120526101205160e0511861305957600161309b565b60016101005160a05260805260406080205460e0511861307a57600161309b565b60026101205160a052608052604060802060e05160a0526080526040608020545b815250565b6101205160601c8060a01c6148e95761014052600260116101205160a05260805260406080200154610160526101605170010000000000000000000000000000000080820690509050610180526101605160801c6101a052600160116101205160a0526080526040608020015460801c6101c05260e051156136c057610100511561330857600060e05160a0526080526040608020546101e0526101e05161018051146132345760016101e0517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156148e95702600f60e05160a0526080526040608020015461020052600260116102005160a0526080526040608020015461022052610220517001000000000000000000000000000000008082049050905060801b6101805181818301106148e95780820190509050600260116102005160a05260805260406080200155610200516001610180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156148e95702600f60e05160a052608052604060802001555b600060016101e0517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156148e95702600f60e05160a0526080526040608020015560006101005160a05260805260406080205461018052610120516001610180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156148e95702600f6101005160a052608052604060802001556101a05160801b6101805181818301106148e95780820190509050600260116101205160a05260805260406080200155613812565b600d546101e052600060e05160a0526080526040608020546102005260136101405160a05260805260406080205460018082106148e95780820390509050610220526101e0516101a051146133e657600e6101e05160a05260805260406080205461024052600260116102405160a05260805260406080200154610260526101a05160801b610260517001000000000000000000000000000000008082069050905081818301106148e95780820190509050600260116102405160a0526080526040608020015561024051600e6101a05160a0526080526040608020555b6000600e6101e05160a0526080526040608020556102005161018051146134f4576001610200517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156148e95702600f60e05160a0526080526040608020015461024052600260116102405160a0526080526040608020015461026052610260517001000000000000000000000000000000008082049050905060801b6101805181818301106148e95780820190509050600260116102405160a05260805260406080200155610240516001610180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156148e95702600f60e05160a052608052604060802001555b60006001610200517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156148e95702600f60e05160a052608052604060802001556000600260116101205160a05260805260406080200155610220516101c0511461364a576001610220517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156148e9570260126101405160a0526080526040608020015461024052600160116102405160a05260805260406080200154610260526101c05160801b610260517001000000000000000000000000000000008082069050905081818301106148e95780820190509050600160116102405160a052608052604060802001556102405160016101c0517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156148e9570260126101405160a052608052604060802001555b60006001610220517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156148e9570260126101405160a052608052604060802001556000600160116101205160a052608052604060802001556102205160136101405160a052608052604060802055613812565b60006101005160a05260805260406080205461018052600d546101a0526101a05160801b6101805181818301106148e957808201905090506101605260136101405160a0526080526040608020546101c05261012051600e6101a05160a052608052604060802055610120516001610180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156148e95702600f6101005160a0526080526040608020015561016051600260116101205160a052608052604060802001556101c05160801b600160116101205160a052608052604060802001556101205160016101c0517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156148e9570260126101405160a052608052604060802001556101c051600181818301106148e9578082019050905060136101405160a0526080526040608020555b565b60036102805160a0526080526040608020546102a0526102a05160e0526000610100526102805161012052613847612fe6565b60006102a05160a0526080526040608020805460018082106148e95780820390509050815550600060036102805160a052608052604060802055600d805460018082106148e957808203905090508155506102a05160e05260006101005261028051610120526138b56130a0565b6102805160006102a0517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60006102c0a4565b600061028051146148e95760036102a05160a0526080526040608020546148e957600060e05261028051610100526102a051610120526139266130a0565b60006102805160a05260805260406080208054600181818301106148e957808201905090508155506102805160036102a05160a052608052604060802055600d8054600181818301106148e957808201905090508155506102a0516102805160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60006102c0a4565b60156101205160a0526080526040608020600060a0526080526040608020546101c05260156101205160a05260805260406080206101005160a0526080526040608020546101e0526101e0516101c051186148e95761014051600081126148e95760801b6101605160008112613a265780613a35565b8060000381146148e957806000035b9050600081126148e95781818301106148e957808201905090506102005260106101005160a052608052604060802080546102005181818301106148e95780820190509050815550600160106101205160a05260805260406080200180546102005181818301106148e95780820190509050815550601160e05160a0526080526040608020805461022052600181015461024052600281015461026052600381015461028052506102005161022052610240516101805181818301106148e95780820190509050610240526101a05161028052601160e05160a052608052604060802061022051815561024051600182015561026051600282015561028051600382015550565b601160e05160a052608052604060802080546101805260018101546101a05260028101546101c05260038101546101e052506101e0516102005261020051613b8357613e7b565b60106101005160a05260805260406080208054610180518082106148e95780820390509050815550600160106101205160a0526080526040608020018054610180518082106148e957808203905090508155506000610180526101a0517001000000000000000000000000000000008082049050905060801b6101a05260006101e052601160e05160a05260805260406080206101805181556101a05160018201556101c05160028201556101e051600382015550600260106101005160a05260805260406080200154610220526102205170010000000000000000000000000000000080820690509050610240526102205160801c60018082106148e957808203905090506102605260146101005160a05260805260406080206102005160a052608052604060802054610280526000610260511415613cc5576000613cdf565b610240516102005118613cdc576102805115613cdf565b60005b613cf65761026051613e1557600061024052613e15565b6102a06001610200818352015b6102006102a05118613d8657601a6102c0527f4661696c656420746f2066696e64206e657874206578706972790000000000006102e0526102c0506102c051806102e001818260206001820306601f82010390500336823750506308c379a06102805260206102a0526102c05160206001820306601f820103905060440161029cfd5b6102005162093a806102a051600181818301106148e957808201905090508082028215828483041417156148e9579050905081818301106148e957808201905090506102c052600060146101005160a05260805260406080206102c05160a0526080526040608020541115613e02576102c05161024052613e12565b8151600101808352811415613d03575b50505b6102605160801b6102405181818301106148e95780820190509050600260106101005160a052608052604060802001556102805160018082106148e9578082039050905060146101005160a05260805260406080206102005160a0526080526040608020555b565b61012051600081126148e95760801b6101405160008112613e9e5780613ead565b8060000381146148e957806000035b9050600081126148e95781818301106148e95780820190509050610160526001601060e05160a0526080526040608020018054610160518082106148e95780820390509050815550600160106101005160a05260805260406080200180546101605181818301106148e95780820190509050815550565b60e05160801c600160ff1b8110156148e957815260e05170010000000000000000000000000000000080820690509050600160ff1b8110156148e9577f80000000000000000000000000000000000000000000000000000000000000008113156148e957600003602082015250565b610100517f80000000000000000000000000000000000000000000000000000000000000008113156148e9576000036101205160e05180820382811360008312168382131560008412151617156148e95790509050600160ff1b82141560001982141517156148e9578080156148e95782059050905061014052610100516101405160e051808202600160ff1b82141560001984141517156148e9578215828483051417156148e9579050905080820382811360008312168382131560008412151617156148e95790509050815261014051602082015250565b6103005160036103405160a052608052604060802054186148e957600061032051146148e9576103405160601c8060a01c6148e9576103605260156103205160a0526080526040608020600060a0526080526040608020546103805260156103205160a05260805260406080206103605160a0526080526040608020546103a0526103a05161038051186148e9576103005160e0526000610100526103405161012052614118612fe6565b60006103005160a0526080526040608020805460018082106148e957808203905090508155506103005160e0526103205161010052610340516101205261415d6130a0565b60006103205160a05260805260406080208054600181818301106148e957808201905090508155506103205160036103405160a05260805260406080205560116103405160a05260805260406080205460e0526141bb610400613f24565b61040080516103c05260208101516103e052506103e05142600160ff1b8110156148e957808202600160ff1b82141560001984141517156148e9578215828483051417156148e957905090506103c05180820182811260008312168382121560008412151617156148e9579050905061040052600061040051136142a0576103405160e052610360516101005261030051610120526103c051610140526103e05161016052614268613b3c565b6103405161030051610360517f64ddd743466fd725d437a06c1600041c3a8e6566a51cbfb4b73ee501db9465746000610420a4614373565b6103005160e05261032051610100526103c051610120526103e051610140526142c7613e7d565b6103c0517f80000000000000000000000000000000000000000000000000000000000000008113156148e9576000036103e051600160ff1b82141560001982141517156148e9578080156148e957820590509050600081126148e957610420526103405161032051610300517fd28879082858412c80e7b7b81ccad936afca475871f7ba9d041dec51298e941661040051600081126148e9576104405261042051610460526040610440a45b6103405161032051610300517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000610420a4565b60036103005160a05260805260406080205461034052600061034051146148e9576103005160601c8060a01c6148e9576103605260116103005160a052608052604060802080546103805260018101546103a05260028101546103c05260038101546103e052506103805160e052614421610440613f24565b610440805161040052602081015161042052506104205142600160ff1b8110156148e957808202600160ff1b82141560001984141517156148e9578215828483051417156148e957905090506104005180820182811260008312168382121560008412151617156148e95790509050610440526103405161032051186144a85760016144dd565b60026103405160a05260805260406080206103205160a0526080526040608020546144da5760006104405113156144dd565b60015b6145ba576103605161032051186144f5576001614517565b60026103605160a05260805260406080206103205160a0526080526040608020545b61459657600c610460527f4e6f7420616c6c6f7765642100000000000000000000000000000000000000006104805261046050610460518061048001818260206001820306601f82010390500336823750506308c379a0610420526020610440526104605160206001820306601f820103905060440161043cfd6145ba565b426103a05170010000000000000000000000000000000080820690509050116148e9575b6103005160e05261036051610100526103405161012052610400516101405261042051610160526145e9613b3c565b6103005161034051610360517f64ddd743466fd725d437a06c1600041c3a8e6566a51cbfb4b73ee501db9465746000610460a4565b61012051601560e05160a05260805260406080206101005160a0526080526040608020556101005160e0517f80dbbd5de59fe1d8e1586e8b741b335479764458933d96f4272b3003653751a461012051610140526020610140a3565b60e0516146c7576001610100527f30000000000000000000000000000000000000000000000000000000000000006101205261010080516020018083828460045afa9050905050506148e7565b600061018052610180805160200180610100828460045afa90505050604e610180526101a06000604e818352015b604e61018051186147295760e051604e6101a05110156148e9576101a051600a0a8080156148e9578204905090501561472c565b60005b1561473a576101a051610180525b60e051604e604d6101a0518082106148e9578082039050905010156148e957604d6101a0518082106148e95780820390509050600a0a8080156148e957820490509050600a80820690509050603081818301106148e957808201905090506101c052601f600160208206610220016020828401116148e957602080610240826101c060045afa5050818152905090508051602001806101e0828460045afa905050506000610100604e806020846102200101826020850160045afa5050805182019150506101e06001806020846102200101826020850160045afa50508051820191505080610220526102205050604e6102c06102205161024060045afa614847573d600060003e3d6000fd5b6102a0604e3d80821161485a578161485c565b805b905090508152805160200180610100828460045afa9050505081516001018083528114156146f5575050604e610180518082106148e9578082039050905061018051602082066101a00161010051828401116148e957604e806101c0826020602088068803016101000160045afa50508181529050905080516020018083828460045afa9050905050505b565b600080fd5b6101d2614ac0036101d2610280396101d2614ac0036102405181610280015261026051816102a0015280604001610280f35b600080fd", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-ve-delegation/artifact/VotingEscrowDelegationProxy.json b/balpy/balancer-deployments/tasks/20220325-ve-delegation/artifact/VotingEscrowDelegationProxy.json new file mode 100644 index 0000000..b8c4d71 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-ve-delegation/artifact/VotingEscrowDelegationProxy.json @@ -0,0 +1,174 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "VotingEscrowDelegationProxy", + "sourceName": "contracts/VotingEscrowDelegationProxy.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "votingEscrow", + "type": "address" + }, + { + "internalType": "contract IVeDelegation", + "name": "delegation", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "DelegationImplementationUpdated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "adjustedBalanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "adjusted_balance_of", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDelegationImplementation", + "outputs": [ + { + "internalType": "contract IVeDelegation", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVotingEscrow", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "killDelegation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVeDelegation", + "name": "delegation", + "type": "address" + } + ], + "name": "setDelegation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60e060405234801561001057600080fd5b5060405161083c38038061083c8339818101604052606081101561003357600080fd5b5080516020820151604090920151306080819052606083811b6001600160601b031990811660a0529085901b1660c052600080546001600160a01b0319166001600160a01b03938416178155909392821692919091169061078a906100b29039806101b452806104a25250806102d2525080610265525061078a6000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c8063851c1bb311610076578063aaabadc51161005b578063aaabadc514610177578063bbf7408a146100d9578063e6b3e7041461017f576100a3565b8063851c1bb3146101305780638d928af81461016f576100a3565b806308b0308a146100a857806325798418146100d957806363408a901461011e5780636448a3ab14610126575b600080fd5b6100b06101b2565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61010c600480360360208110156100ef57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166101d6565b60408051918252519081900360200190f35b6100b06101e9565b61012e610205565b005b61010c6004803603602081101561014657600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661025f565b6100b06102d0565b6100b06102f4565b61012e6004803603602081101561019557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610374565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006101e182610481565b90505b919050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b61020d6105f6565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556040517fb2f6d9cc189e4fc02519ab5ba6d9455bedc32091e375e8a6383ed45f40653e74908290a2565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006102fe6102d0565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561034357600080fd5b505afa158015610357573d6000803e3d6000fd5b505050506040513d602081101561036d57600080fd5b5051905090565b61037c6105f6565b604080517fbbf7408a000000000000000000000000000000000000000000000000000000008152336004820152905173ffffffffffffffffffffffffffffffffffffffff83169163bbf7408a916024808301926020929190829003018186803b1580156103e857600080fd5b505afa1580156103fc573d6000803e3d6000fd5b505050506040513d602081101561041257600080fd5b5050600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917fb2f6d9cc189e4fc02519ab5ba6d9455bedc32091e375e8a6383ed45f40653e7491a250565b6000805473ffffffffffffffffffffffffffffffffffffffff168061055c577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561052757600080fd5b505afa15801561053b573d6000803e3d6000fd5b505050506040513d602081101561055157600080fd5b505191506101e49050565b8073ffffffffffffffffffffffffffffffffffffffff1663bbf7408a846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156105c357600080fd5b505afa1580156105d7573d6000803e3d6000fd5b505050506040513d60208110156105ed57600080fd5b50519392505050565b60006106256000357fffffffff000000000000000000000000000000000000000000000000000000001661025f565b905061063c610634823361063f565b6101916106d5565b50565b60006106496102f4565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b1580156105c357600080fd5b816106e3576106e3816106e7565b5050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fdfea26469706673582212209154314af17040c72cbb41915ce040bf89b156f7b590efe015ffed1a4d2f2f9264736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a35760003560e01c8063851c1bb311610076578063aaabadc51161005b578063aaabadc514610177578063bbf7408a146100d9578063e6b3e7041461017f576100a3565b8063851c1bb3146101305780638d928af81461016f576100a3565b806308b0308a146100a857806325798418146100d957806363408a901461011e5780636448a3ab14610126575b600080fd5b6100b06101b2565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61010c600480360360208110156100ef57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166101d6565b60408051918252519081900360200190f35b6100b06101e9565b61012e610205565b005b61010c6004803603602081101561014657600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661025f565b6100b06102d0565b6100b06102f4565b61012e6004803603602081101561019557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610374565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006101e182610481565b90505b919050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b61020d6105f6565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556040517fb2f6d9cc189e4fc02519ab5ba6d9455bedc32091e375e8a6383ed45f40653e74908290a2565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006102fe6102d0565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561034357600080fd5b505afa158015610357573d6000803e3d6000fd5b505050506040513d602081101561036d57600080fd5b5051905090565b61037c6105f6565b604080517fbbf7408a000000000000000000000000000000000000000000000000000000008152336004820152905173ffffffffffffffffffffffffffffffffffffffff83169163bbf7408a916024808301926020929190829003018186803b1580156103e857600080fd5b505afa1580156103fc573d6000803e3d6000fd5b505050506040513d602081101561041257600080fd5b5050600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917fb2f6d9cc189e4fc02519ab5ba6d9455bedc32091e375e8a6383ed45f40653e7491a250565b6000805473ffffffffffffffffffffffffffffffffffffffff168061055c577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561052757600080fd5b505afa15801561053b573d6000803e3d6000fd5b505050506040513d602081101561055157600080fd5b505191506101e49050565b8073ffffffffffffffffffffffffffffffffffffffff1663bbf7408a846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156105c357600080fd5b505afa1580156105d7573d6000803e3d6000fd5b505050506040513d60208110156105ed57600080fd5b50519392505050565b60006106256000357fffffffff000000000000000000000000000000000000000000000000000000001661025f565b905061063c610634823361063f565b6101916106d5565b50565b60006106496102f4565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b1580156105c357600080fd5b816106e3576106e3816106e7565b5050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fdfea26469706673582212209154314af17040c72cbb41915ce040bf89b156f7b590efe015ffed1a4d2f2f9264736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-ve-delegation/index.ts b/balpy/balancer-deployments/tasks/20220325-ve-delegation/index.ts new file mode 100644 index 0000000..5645374 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-ve-delegation/index.ts @@ -0,0 +1,12 @@ +import { Task, TaskRunOptions } from '@src'; +import { VotingEscrowDelegationDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as VotingEscrowDelegationDeployment; + + const args = [input.VotingEscrow, 'VotingEscrow Delegation', 'veBoost', '', input.AuthorizerAdaptor]; + const votingEscrowDelegation = await task.deploy('VotingEscrowDelegation', args, from); + + const proxyArgs = [input.Vault, input.VotingEscrow, votingEscrowDelegation.address]; + await task.deployAndVerify('VotingEscrowDelegationProxy', proxyArgs, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20220325-ve-delegation/input.ts b/balpy/balancer-deployments/tasks/20220325-ve-delegation/input.ts new file mode 100644 index 0000000..8cdfb31 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-ve-delegation/input.ts @@ -0,0 +1,17 @@ +import { Task, TaskMode } from '@src'; + +export type VotingEscrowDelegationDeployment = { + Vault: string; + AuthorizerAdaptor: string; + VotingEscrow: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const AuthorizerAdaptor = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY); +const VotingEscrow = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); + +export default { + Vault, + AuthorizerAdaptor, + VotingEscrow, +}; diff --git a/balpy/balancer-deployments/tasks/20220325-ve-delegation/output/goerli.json b/balpy/balancer-deployments/tasks/20220325-ve-delegation/output/goerli.json new file mode 100644 index 0000000..059719d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-ve-delegation/output/goerli.json @@ -0,0 +1,4 @@ +{ + "VotingEscrowDelegation": "0xcfF73979321788d59a6170fF012730dB2087f31c", + "VotingEscrowDelegationProxy": "0xA1F107D1cD709514AE8A914eCB757E95f9cedB31" +} diff --git a/balpy/balancer-deployments/tasks/20220325-ve-delegation/output/kovan.json b/balpy/balancer-deployments/tasks/20220325-ve-delegation/output/kovan.json new file mode 100644 index 0000000..371cc72 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-ve-delegation/output/kovan.json @@ -0,0 +1,4 @@ +{ + "VotingEscrowDelegation": "0xDc6d62ae091ea77331542042A72e5E38B188837C", + "VotingEscrowDelegationProxy": "0x98D0d0a65cBeCCaa647a5a95cf27Cf2f00E1231C" +} diff --git a/balpy/balancer-deployments/tasks/20220325-ve-delegation/output/mainnet.json b/balpy/balancer-deployments/tasks/20220325-ve-delegation/output/mainnet.json new file mode 100644 index 0000000..011ea60 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-ve-delegation/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "VotingEscrowDelegation": "0x2E96068b3D5B5BAE3D7515da4A1D2E52d08A2647", + "VotingEscrowDelegationProxy": "0x6f5a2eE11E7a772AeB5114A20d0D7c0ff61EB8A0" +} diff --git a/balpy/balancer-deployments/tasks/20220325-ve-delegation/output/sepolia.json b/balpy/balancer-deployments/tasks/20220325-ve-delegation/output/sepolia.json new file mode 100644 index 0000000..09fdd25 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-ve-delegation/output/sepolia.json @@ -0,0 +1,4 @@ +{ + "VotingEscrowDelegation": "0x0c5538098EBe88175078972F514C9e101D325D4F", + "VotingEscrowDelegationProxy": "0x9f7E65887413a8497b87bA2058cE6E4Ef4B37013" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220325-ve-delegation/readme.md b/balpy/balancer-deployments/tasks/20220325-ve-delegation/readme.md new file mode 100644 index 0000000..d705632 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220325-ve-delegation/readme.md @@ -0,0 +1,11 @@ +# 2022-03-25 - Voting Escrow Delegation + +Deployment of `VotingEscrowDelegation`, for delegation of veBAL-related boosts. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`VotingEscrowDelegation` artifact](./artifact/VotingEscrowDelegation.json) +- [`VotingEscrowDelegationProxy` artifact](./artifact/VotingEscrowDelegationProxy.json) diff --git a/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/artifact/ChildChainLiquidityGaugeFactory.json b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/artifact/ChildChainLiquidityGaugeFactory.json new file mode 100644 index 0000000..942a0b6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/artifact/ChildChainLiquidityGaugeFactory.json @@ -0,0 +1,211 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ChildChainLiquidityGaugeFactory", + "sourceName": "contracts/gauges/ChildChainLiquidityGaugeFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract ILiquidityGauge", + "name": "gauge", + "type": "address" + }, + { + "internalType": "contract IChildChainStreamer", + "name": "childChainStreamer", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "gauge", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "streamer", + "type": "address" + } + ], + "name": "RewardsOnlyGaugeCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getChildChainStreamerImplementation", + "outputs": [ + { + "internalType": "contract IChildChainStreamer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeImplementation", + "outputs": [ + { + "internalType": "contract ILiquidityGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "getGaugePool", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "getGaugeStreamer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "getPoolGauge", + "outputs": [ + { + "internalType": "contract ILiquidityGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "getPoolStreamer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "isGaugeFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "streamer", + "type": "address" + } + ], + "name": "isStreamerFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60c060405234801561001057600080fd5b5060405161088338038061088383398101604081905261002f9161004d565b6001600160601b0319606092831b8116608052911b1660a05261009e565b6000806040838503121561005f578182fd5b825161006a81610086565b602084015190925061007b81610086565b809150509250929050565b6001600160a01b038116811461009b57600080fd5b50565b60805160601c60a05160601c6107b26100d1600039806102e3528061057e52508061016252806102b652506107b26000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c80639ed9331811610076578063cbda93271161005b578063cbda932714610125578063ce3cc8bd14610145578063f9e0a13e14610158576100a3565b80639ed93318146100ff578063a8ea687514610112576100a3565b806339312dee146100a8578063744a65dd146100c65780638a4ffeb0146100d957806390b20087146100ec575b600080fd5b6100b0610160565b6040516100bd919061068c565b60405180910390f35b6100b06100d436600461064d565b610184565b6100b06100e736600461064d565b61020c565b6100b06100fa36600461064d565b61021a565b6100b061010d36600461064d565b610245565b6100b061012036600461064d565b6104fb565b61013861013336600461064d565b610526565b6040516100bd91906106de565b61013861015336600461064d565b610551565b6100b061057c565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008173ffffffffffffffffffffffffffffffffffffffff166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b1580156101cc57600080fd5b505afa1580156101e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102049190610670565b90505b919050565b60006102046100fa836104fb565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600360205260409020541690565b73ffffffffffffffffffffffffffffffffffffffff818116600090815260026020526040812054909116156102af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102a6906106e9565b60405180910390fd5b60006102da7f00000000000000000000000000000000000000000000000000000000000000006105a0565b905060006103077f00000000000000000000000000000000000000000000000000000000000000006105a0565b6040517fc4d66de800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063c4d66de89061035c90859060040161068c565b600060405180830381600087803b15801561037657600080fd5b505af115801561038a573d6000803e3d6000fd5b50506040517f6133f98500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169250636133f98591506103e89087908590631afe22a6906004016106ad565b600060405180830381600087803b15801561040257600080fd5b505af1158015610416573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff82811660008181526020818152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558885168084526002835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116871790915585855260039093529281902080549587169590921694909417905591517f887aaf82b8cf747396674afdce22a170d9e18895da73bbe1a63055fdfc8dd6b5906104ec90859061068c565b60405180910390a35092915050565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600260205260409020541690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff8116610207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102a690610720565b60006020828403121561065e578081fd5b813561066981610757565b9392505050565b600060208284031215610681578081fd5b815161066981610757565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b901515815260200190565b60208082526014908201527f476175676520616c726561647920657869737473000000000000000000000000604082015260600190565b60208082526016908201527f455243313136373a20637265617465206661696c656400000000000000000000604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff8116811461077957600080fd5b5056fea2646970667358221220824c333d3a539aba6353c02e270dd84e4a2f91358dd95658e06b316c1a12a91464736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a35760003560e01c80639ed9331811610076578063cbda93271161005b578063cbda932714610125578063ce3cc8bd14610145578063f9e0a13e14610158576100a3565b80639ed93318146100ff578063a8ea687514610112576100a3565b806339312dee146100a8578063744a65dd146100c65780638a4ffeb0146100d957806390b20087146100ec575b600080fd5b6100b0610160565b6040516100bd919061068c565b60405180910390f35b6100b06100d436600461064d565b610184565b6100b06100e736600461064d565b61020c565b6100b06100fa36600461064d565b61021a565b6100b061010d36600461064d565b610245565b6100b061012036600461064d565b6104fb565b61013861013336600461064d565b610526565b6040516100bd91906106de565b61013861015336600461064d565b610551565b6100b061057c565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008173ffffffffffffffffffffffffffffffffffffffff166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b1580156101cc57600080fd5b505afa1580156101e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102049190610670565b90505b919050565b60006102046100fa836104fb565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600360205260409020541690565b73ffffffffffffffffffffffffffffffffffffffff818116600090815260026020526040812054909116156102af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102a6906106e9565b60405180910390fd5b60006102da7f00000000000000000000000000000000000000000000000000000000000000006105a0565b905060006103077f00000000000000000000000000000000000000000000000000000000000000006105a0565b6040517fc4d66de800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063c4d66de89061035c90859060040161068c565b600060405180830381600087803b15801561037657600080fd5b505af115801561038a573d6000803e3d6000fd5b50506040517f6133f98500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169250636133f98591506103e89087908590631afe22a6906004016106ad565b600060405180830381600087803b15801561040257600080fd5b505af1158015610416573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff82811660008181526020818152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558885168084526002835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116871790915585855260039093529281902080549587169590921694909417905591517f887aaf82b8cf747396674afdce22a170d9e18895da73bbe1a63055fdfc8dd6b5906104ec90859061068c565b60405180910390a35092915050565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600260205260409020541690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff8116610207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102a690610720565b60006020828403121561065e578081fd5b813561066981610757565b9392505050565b600060208284031215610681578081fd5b815161066981610757565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b901515815260200190565b60208082526014908201527f476175676520616c726561647920657869737473000000000000000000000000604082015260600190565b60208082526016908201527f455243313136373a20637265617465206661696c656400000000000000000000604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff8116811461077957600080fd5b5056fea2646970667358221220824c333d3a539aba6353c02e270dd84e4a2f91358dd95658e06b316c1a12a91464736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/artifact/ChildChainStreamer.json b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/artifact/ChildChainStreamer.json new file mode 100644 index 0000000..70d536d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/artifact/ChildChainStreamer.json @@ -0,0 +1,255 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ChildChainStreamer", + "sourceName": "@balancer-labs/liquidity-mining/contracts/ChildChainStreamer.vy", + "abi": [ + { + "name": "RewardDistributorUpdated", + "inputs": [ + { + "name": "reward_token", + "type": "address", + "indexed": true + }, + { + "name": "distributor", + "type": "address", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "RewardDurationUpdated", + "inputs": [ + { + "name": "reward_token", + "type": "address", + "indexed": true + }, + { + "name": "duration", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "stateMutability": "nonpayable", + "type": "constructor", + "inputs": [ + { + "name": "_bal_token", + "type": "address" + }, + { + "name": "_authorizerAdaptor", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "add_reward", + "inputs": [ + { + "name": "_token", + "type": "address" + }, + { + "name": "_distributor", + "type": "address" + }, + { + "name": "_duration", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "remove_reward", + "inputs": [ + { + "name": "_token", + "type": "address" + }, + { + "name": "_recipient", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "get_reward", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "notify_reward_amount", + "inputs": [ + { + "name": "_token", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "set_reward_duration", + "inputs": [ + { + "name": "_token", + "type": "address" + }, + { + "name": "_duration", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "set_reward_distributor", + "inputs": [ + { + "name": "_token", + "type": "address" + }, + { + "name": "_distributor", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "reward_receiver", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_receiver", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_tokens", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_count", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_data", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "components": [ + { + "name": "distributor", + "type": "address" + }, + { + "name": "period_finish", + "type": "uint256" + }, + { + "name": "rate", + "type": "uint256" + }, + { + "name": "duration", + "type": "uint256" + }, + { + "name": "received", + "type": "uint256" + }, + { + "name": "paid", + "type": "uint256" + } + ] + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "last_update_time", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + } + ], + "bytecode": "0x6020610e176080396080518060a01c610e125760e05260206020610e17016080396080518060a01c610e12576101005260e05161012052610100516101405261dead600055610de056600436101561000d57610a8d565b60046000601c3760005134610d925763661ab0b28118610077576004358060a01c610d9257610180526024358060a01c610d92576101a0526020602038036080396080513318610d92576101805160e0526101a0516101005260443561012052610075610a93565b005b63393e582b81186103ac576004358060a01c610d925760e0526024358060a01c610d9257610100526020602038036080396080513318610d92576000600a60e05160a052608052604060802054141561013f576016610120527f52657761726420746f6b656e206e6f74206164646564000000000000000000006101405261012050610120518061014001818260206001820306601f82010390500336823750506308c379a060e0526020610100526101205160206001820306601f820103905060440160fcfd5b600a60e05160a0526080526040608020600081556000600182015560006002820155600060038201556000600482015560006005820155506370a082316101405230610160526020610140602461015c60e0515afa6101a3573d600060003e3d6000fd5b601f3d1115610d9257610140516101205260006004610180527fa9059cbb000000000000000000000000000000000000000000000000000000006101a0526101806004806020846101c00101826020850160045afa505080518201915050610100516020826101c0010152602081019050610120516020826101c0010152602081019050806101c0526101c0505060206102606101c0516101e0600060e0515af1610253573d600060003e3d6000fd5b61024060203d8082116102665781610268565b805b905090508152805160200180610140828460045afa90505050600061014051146102a757610160516101405181816020036008021c9050905015610d92575b6009546001808210610d925780820390509050610180526101a060006008818352015b60e05160016101a0516008811015610d9257026001015418610393576001610180516008811015610d9257026001015460016101a0516008811015610d9257026001015560006001610180516008811015610d925702600101556101805160095560e0517f1df95772db25c427e0df149fe4cd5b7c2e970e096ee7305ff86f6e1167281d7b60006101c05260206101c0a260e0517f2c59073844bbfca50d5cce6497d479fe434747687af5de022514e5a0c8ba479c60006101c05260206101c0a25050506103aa565b81516001018083528114156102ca57505060006000fd5b005b631afe22a6811861041257600b546102a0526102e060006008818352015b6102e051600101546102c0526102c0516103e35761040a565b6102c05160e0526102a051610100526103fa610bea565b81516001018083528114156103ca575b505042600b55005b63a4f6af7081186107ac576004358060a01c610d92576102a052600b546102c05260006102e05261032060006008818352015b6103205160010154610300526103005161045e57610725565b6103005160e0526102c05161010052610475610bea565b6102a0516103005118610715576004600a6103005160a0526080526040608020015461034052610340516005600a6103005160a05260805260406080200154808210610d925780820390509050610360526370a082316103a052306103c05260206103a060246103bc610300515afa6104f3573d600060003e3d6000fd5b601f3d1115610d92576103a0516103805261036051610380511115610715576103805161036051808210610d9257808203905090506103a0526003600a6103005160a052608052604060802001546103c0526001600a6103005160a0526080526040608020015442101561068c57600a6102a05160a05260805260406080205433146105f057601a6103e0527f52657761726420706572696f64207374696c6c20616374697665000000000000610400526103e0506103e0518061040001818260206001820306601f82010390500336823750506308c379a06103a05260206103c0526103e05160206001820306601f82010390506044016103bcfd5b6001600a6103005160a0526080526040608020015442808210610d9257808203905090506103e0526103e0516002600a6103005160a05260805260406080200154808202821582848304141715610d925790509050610400526103a051610400518181830110610d9257808201905090506103c051808015610d92578204905090506002600a6103005160a052608052604060802001556106b7565b6103a0516103c051808015610d92578204905090506002600a6103005160a052608052604060802001555b426103c0518181830110610d9257808201905090506001600a6103005160a05260805260406080200155610340516103a0518181830110610d9257808201905090506004600a6103005160a0526080526040608020015560016102e0525b8151600101808352811415610445575b50506102e0516107a657601e610300527f496e76616c696420746f6b656e206f72206e6f206e65772072657761726400006103205261030050610300518061032001818260206001820306601f82010390500336823750506308c379a06102c05260206102e0526103005160206001820306601f82010390506044016102dcfd5b42600b55005b63d88449ee81186108b4576004358060a01c610d925760e052600a60e05160a0526080526040608020543318610d92576001600a60e05160a05260805260406080200154421161086a57601a610100527f52657761726420706572696f64207374696c6c206163746976650000000000006101205261010050610100518061012001818260206001820306601f82010390500336823750506308c379a060c052602060e0526101005160206001820306601f820103905060440160dcfd5b6024356003600a60e05160a0526080526040608020015560e0517f2c59073844bbfca50d5cce6497d479fe434747687af5de022514e5a0c8ba479c602435610100526020610100a2005b63058a3a248118610957576004358060a01c610d925760e0526024358060a01c610d925761010052600a60e05160a05260805260406080205433186108fa576001610909565b60206020380360803960805133145b15610d925761010051600a60e05160a05260805260406080205560e0517f1df95772db25c427e0df149fe4cd5b7c2e970e096ee7305ff86f6e1167281d7b61010051610120526020610120a2005b63c4d66de881186109bb576004358060a01c610d925761018052600054610d925760006101805114610d92576101805160005560206040380360803960805160e0526020602038036080396080516101005262093a80610120526109b9610a93565b005b63b618ba6281186109d25760005460e052602060e0f35b6354c49fe981186109f95760016004356008811015610d9257026001015460e052602060e0f35b63963c94b98118610a105760095460e052602060e0f35b6348e9c65e8118610a74576004358060a01c610d925760e052600a60e05160a052608052604060802080546101005260018101546101205260028101546101405260038101546101605260048101546101805260058101546101a0525060c0610100f35b63629d46c28118610a8b57600b5460e052602060e0f35b505b60006000fd5b600a60e05160a05260805260406080205415610b2057601a610140527f52657761726420746f6b656e20616c72656164792061646465640000000000006101605261014050610140518061016001818260206001820306601f82010390500336823750506308c379a0610100526020610120526101405160206001820306601f820103905060440161011cfd5b6009546101405260e0516001610140516008811015610d925702600101556101405160018181830110610d92578082019050905060095561010051600a60e05160a052608052604060802055610120516003600a60e05160a0526080526040608020015560e0517f1df95772db25c427e0df149fe4cd5b7c2e970e096ee7305ff86f6e1167281d7b61010051610160526020610160a260e0517f2c59073844bbfca50d5cce6497d479fe434747687af5de022514e5a0c8ba479c61012051610160526020610160a2565b426001600a60e05160a05260805260406080200154808211610c0c5781610c0e565b805b905090506101205261010051610120511115610d90576101205161010051808210610d9257808203905090506002600a60e05160a05260805260406080200154808202821582848304141715610d925790509050610140526000610140511115610d90576005600a60e05160a0526080526040608020018054610140518181830110610d925780820190509050815550600060046101a0527fa9059cbb000000000000000000000000000000000000000000000000000000006101c0526101a06004806020846101e00101826020850160045afa5050805182019150506000546020826101e0010152602081019050610140516020826101e0010152602081019050806101e0526101e0505060206102806101e051610200600060e0515af1610d3c573d600060003e3d6000fd5b61026060203d808211610d4f5781610d51565b805b905090508152805160200180610160828460045afa9050505060006101605114610d9057610180516101605181816020036008021c9050905015610d92575b565b600080fd5b610049610de00361004961016039610049610de003610120518161016001526101405181610180015280604001610160f35b600080fd", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/artifact/RewardsOnlyGauge.json b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/artifact/RewardsOnlyGauge.json new file mode 100644 index 0000000..4065fab --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/artifact/RewardsOnlyGauge.json @@ -0,0 +1,791 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "RewardsOnlyGauge", + "sourceName": "@balancer-labs/liquidity-mining/contracts/RewardsOnlyGauge.vy", + "abi": [ + { + "name": "Deposit", + "inputs": [ + { + "name": "provider", + "type": "address", + "indexed": true + }, + { + "name": "value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Withdraw", + "inputs": [ + { + "name": "provider", + "type": "address", + "indexed": true + }, + { + "name": "value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Transfer", + "inputs": [ + { + "name": "_from", + "type": "address", + "indexed": true + }, + { + "name": "_to", + "type": "address", + "indexed": true + }, + { + "name": "_value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Approval", + "inputs": [ + { + "name": "_owner", + "type": "address", + "indexed": true + }, + { + "name": "_spender", + "type": "address", + "indexed": true + }, + { + "name": "_value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "stateMutability": "nonpayable", + "type": "constructor", + "inputs": [ + { + "name": "_bal_token", + "type": "address" + }, + { + "name": "_vault", + "type": "address" + }, + { + "name": "_authorizerAdaptor", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "decimals", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "version", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_contract", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "last_claim", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "claimed_reward", + "inputs": [ + { + "name": "_addr", + "type": "address" + }, + { + "name": "_token", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "claimable_reward", + "inputs": [ + { + "name": "_addr", + "type": "address" + }, + { + "name": "_token", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_data", + "inputs": [ + { + "name": "_token", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "components": [ + { + "name": "token", + "type": "address" + }, + { + "name": "distributor", + "type": "address" + }, + { + "name": "period_finish", + "type": "uint256" + }, + { + "name": "rate", + "type": "uint256" + }, + { + "name": "last_update", + "type": "uint256" + }, + { + "name": "integral", + "type": "uint256" + } + ] + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claimable_reward_write", + "inputs": [ + { + "name": "_addr", + "type": "address" + }, + { + "name": "_token", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "set_rewards_receiver", + "inputs": [ + { + "name": "_receiver", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claim_rewards", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claim_rewards", + "inputs": [ + { + "name": "_addr", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claim_rewards", + "inputs": [ + { + "name": "_addr", + "type": "address" + }, + { + "name": "_receiver", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit", + "inputs": [ + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit", + "inputs": [ + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_addr", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit", + "inputs": [ + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_addr", + "type": "address" + }, + { + "name": "_claim_rewards", + "type": "bool" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "withdraw", + "inputs": [ + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "withdraw", + "inputs": [ + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_claim_rewards", + "type": "bool" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "transfer", + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "allowance", + "inputs": [ + { + "name": "owner", + "type": "address" + }, + { + "name": "spender", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "permit", + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_deadline", + "type": "uint256" + }, + { + "name": "_v", + "type": "uint8" + }, + { + "name": "_r", + "type": "bytes32" + }, + { + "name": "_s", + "type": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "increaseAllowance", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_added_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "decreaseAllowance", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_subtracted_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "set_rewards", + "inputs": [ + { + "name": "_reward_contract", + "type": "address" + }, + { + "name": "_claim_sig", + "type": "bytes32" + }, + { + "name": "_reward_tokens", + "type": "address[8]" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "_lp_token", + "type": "address" + }, + { + "name": "_reward_contract", + "type": "address" + }, + { + "name": "_claim_sig", + "type": "bytes32" + } + ], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "lp_token", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "DOMAIN_SEPARATOR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "nonces", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_tokens", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_balances", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "rewards_receiver", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "claim_sig", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_integral", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_integral_for", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + } + ], + "bytecode": "0x60206120dd6080396080518060a01c6120d85760e052602060206120dd016080396080518060a01c6120d85761010052602060406120dd016080396080518060a01c6120d8576101205260e051610140526101005161016052610120516101805261dead60015561209c56600436101561000d57611714565b60046000601c376000513461202c5763313ce567811861003257601260e052602060e0f35b6354fd4d5081186100cc57610120806020808252600660e0527f76312e302e3000000000000000000000000000000000000000000000000000006101005260e0818401808280516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f82010390509050905090508101905090509050610120f35b63bf88a6ff811861010857600d5474010000000000000000000000000000000000000000808206905090508060a01c61202c5760e052602060e0f35b633488bd19811861012257600d5460a01c60e052602060e0f35b63e77e7437811861018e576004358060a01c61202c5760e0526024358060a01c61202c5761010052601c60e05160a05260805260406080206101005160a05260805260406080205470010000000000000000000000000000000080820690509050610120526020610120f35b6333fd6f7481186101e4576004358060a01c61202c5760e0526024358060a01c61202c5761010052601c60e05160a05260805260406080206101005160a05260805260406080205460801c610120526020610120f35b6348e9c65e811861031c576004358060a01c61202c5760e052600d5474010000000000000000000000000000000000000000808206905090508060a01c61202c57610100526348e9c65e6101e05260e0516102005260c06101e060246101fc610100515afa610258573d600060003e3d6000fd5b60bf3d111561202c576101e080518060a01c61202c576101205260208101516101405260408101516101605260608101516101805260808101516101a05260a08101516101c0525063629d46c2610200526020610200600461021c610100515afa6102c8573d600060003e3d6000fd5b601f3d111561202c57610200516101e05260e051610200526101205161022052610140516102405261016051610260526101e05161028052601a60e05160a0526080526040608020546102a05260c0610200f35b6359b7e40981186103b1576004358060a01c61202c57610420526024358060a01c61202c576104405260005461202c5760016000556000600e541461037d576104205160e0526003546101005260006101205260006101405261037d61177e565b601c6104205160a05260805260406080206104405160a05260805260406080205460801c6104605260206104606000600055f35b63bdf9811681186103de576004358060a01c61202c5760e05260e05160173360a052608052604060802055005b63e6f1daf281186103f9573361042052600061044052610448565b6384e9bd7e811861041e576004358060a01c61202c5761042052600061044052610448565b639faceb1b8118610495576004358060a01c61202c57610420526024358060a01c61202c57610440525b60005461202c5760016000556000610440511461046a5733610420511861202c575b6104205160e05260035461010052600161012052610440516101405261048e61177e565b6000600055005b63b6b55f2581186104b05733610420526000610440526104ff565b636e553f6581186104d5576024358060a01c61202c57610420526000610440526104ff565b6383df67478118610683576024358060a01c61202c57610420526044358060011c61202c57610440525b60005461202c57600160005560006004351461061657600d5474010000000000000000000000000000000000000000808206905090508060a01c61202c5761046052600354610480526104205160e0526104805161010052610440516101205260006101405261056d61177e565b6104808051600435818183011061202c578082019050905081525060026104205160a052608052604060802054600435818183011061202c57808201905090506104a0526104a05160026104205160a052608052604060802055610480516003556323b872dd6104c052336104e05230610500526004356105205260206104c060646104dc60006001545af1610608573d600060003e3d6000fd5b601f3d111561202c576104c0505b610420517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c600435610460526020610460a26104205160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600435610460526020610460a36000600055005b632e1a7d4d8118610699576000610420526106b4565b6338d074368118610820576024358060011c61202c57610420525b60005461202c5760016000556000600435146107b957600d5474010000000000000000000000000000000000000000808206905090508060a01c61202c5761044052600354610460523360e0526104605161010052610420516101205260006101405261071f61177e565b610460805160043580821061202c578082039050905081525060023360a05260805260406080205460043580821061202c5780820390509050610480526104805160023360a0526080526040608020556104605160035563a9059cbb6104a052336104c0526004356104e05260206104a060446104bc60006001545af16107ab573d600060003e3d6000fd5b601f3d111561202c576104a0505b337f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364600435610440526020610440a26000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600435610440526020610440a36000600055005b63a9059cbb8118610874576004358060a01c61202c576104e05260005461202c57600160005533610420526104e0516104405260243561046052610862611d2a565b60016105005260206105006000600055f35b6323b872dd8118610957576004358060a01c61202c576104e0526024358060a01c61202c576105005260005461202c5760016000556104e05160e05233610100526108c061054061171a565b61054051610520527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6105205114610926576105205160443580821061202c578082039050905060046104e05160a05260805260406080203360a0526080526040608020555b6104e05161042052610500516104405260443561046052610945611d2a565b60016105405260206105406000600055f35b63dd62ed3e81186109a9576004358060a01c61202c57610120526024358060a01c61202c57610140526101205160e052610140516101005261099a61016061171a565b61016051610180526020610180f35b63095ea7b38118610a21576004358060a01c61202c5760e05260243560043360a052608052604060802060e05160a05260805260406080205560e051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602435610100526020610100a36001610100526020610100f35b63d505accf8118610d8e576004358060a01c61202c5760e0526024358060a01c61202c57610100526084358060081c61202c5761012052600060e0511461202c57606435421161202c57600c60e05160a0526080526040608020546101405260006002610400527f1901000000000000000000000000000000000000000000000000000000000000610420526104006002806020846106000101826020850160045afa505080518201915050600b546020826106000101526020810190507f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96105405260e0516105605261010051610580526044356105a052610140516105c0526064356105e05260c0610520526105208051602082012090506020826106000101526020810190508061060052610600905080516020820120905061016052600060e0513b11610ba25760e0516101605161018052610120516101a052604060a46101c03760206080608061018060015afa506080511861202c57610d02565b600060a4356102205260c435610240526040610200526102006040806020846102c00101826020850160045afa505080518201915050601f6001602082066102600160208284011161202c576020806102808261012060045afa5050818152905090506001806020846102c00101826020850160045afa505080518201915050806102c0526102c09050805160200180610180828460045afa905050507f1626ba7e00000000000000000000000000000000000000000000000000000000631626ba7e610200526102208060406101605182526020820191508082528083018061018080516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810150505050602061020060c461021c60e0515afa610cef573d600060003e3d6000fd5b601f3d111561202c57610200511861202c575b604435600460e05160a05260805260406080206101005160a052608052604060802055610140516001818183011061202c5780820190509050600c60e05160a0526080526040608020556101005160e0517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925604435610180526020610180a36001610180526020610180f35b63395093518118610e3d576004358060a01c61202c57610120523360e0526101205161010052610dbf61016061171a565b61016051602435818183011061202c5780820190509050610140526101405160043360a05260805260406080206101205160a05260805260406080205561012051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92561014051610160526020610160a36001610160526020610160f35b63a457c2d78118610eea576004358060a01c61202c57610120523360e0526101205161010052610e6e61016061171a565b6101605160243580821061202c5780820390509050610140526101405160043360a05260805260406080206101205160a05260805260406080205561012051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92561014051610160526020610160a36001610160526020610160f35b6347d2d5d38118610ffa576004358060a01c61202c57610620526044358060a01c61202c57610640526064358060a01c61202c57610660526084358060a01c61202c576106805260a4358060a01c61202c576106a05260c4358060a01c61202c576106c05260e4358060a01c61202c576106e052610104358060a01c61202c5761070052610124358060a01c61202c576107205260005461202c576001600055602060203803608039608051331861202c5761062051610420526024356104405261064051610460526106605161048052610680516104a0526106a0516104c0526106c0516104e0526106e0516105005261070051610520526107205161054052610ff3611e66565b6000600055005b636133f9858118611361576004358060a01c61202c57610620526024358060a01c61202c576106405260015461202c576000610620511461202c57610620516001556395d89b416106a05260606106a060046106bc610620515afa611064573d600060003e3d6000fd5b603f3d111561202c576106a0516106a001601a81511161202c5780805160200180610660828460045afa90509050505060006009610700527f42616c616e636572200000000000000000000000000000000000000000000000610720526107006009806020846107800101826020850160045afa5050805182019150506106606020806020846107800101826020850160045afa5050805182019150506014610740527f205265776172644761756765204465706f736974000000000000000000000000610760526107406014806020846107800101826020850160045afa505080518201915050806107805261078090508051602001806106a0828460045afa905050506106a0806005602082510160c060006003818352015b8260c0516020021115611191576111b0565b60c05160200285015160c051850155815160010180835281141561117f575b50505050505060006106606020806020846107400101826020850160045afa5050805182019150506006610700527f2d67617567650000000000000000000000000000000000000000000000000000610720526107006006806020846107400101826020850160045afa50508051820191505080610740526107409050806008602082510160c060006003818352015b8260c051602002111561125257611271565b60c05160200285015160c0518501558151600101808352811415611240575b5050505050507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6107e0526106a0805160208201209050610800527f15124d26d1272f8d4d5266a24ca397811f414b8cd05a53b26b745f63af5ae2fc610820524661084052306108605260a06107c0526107c0805160208201209050600b5561010036610700376020606038036080396080516107005261064051610420526044356104405261070051610460526107205161048052610740516104a052610760516104c052610780516104e0526107a051610500526107c051610520526107e0516105405261135f611e66565b005b6382c6306681186113785760015460e052602060e0f35b6370a0823181186113ad576004358060a01c61202c5760e052600260e05160a052608052604060802054610100526020610100f35b6318160ddd81186113c45760035460e052602060e0f35b6306fdde0381186114675760e08060208082528083018060058082602082540160c060006003818352015b8260c051602002111561140157611420565b60c05185015460c05160200285015281516001018083528114156113ef575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810190509050905060e0f35b6395d89b41811861150a5760e08060208082528083018060088082602082540160c060006003818352015b8260c05160200211156114a4576114c3565b60c05185015460c0516020028501528151600101808352811415611492575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810190509050905060e0f35b633644e515811861152157600b5460e052602060e0f35b637ecebe008118611556576004358060a01c61202c5760e052600c60e05160a052608052604060802054610100526020610100f35b6354c49fe9811861157d576001600435600881101561202c5702600e015460e052602060e0f35b63fe9e217881186115b2576004358060a01c61202c5760e052601660e05160a052608052604060802054610100526020610100f35b6301ddabf181186115e7576004358060a01c61202c5760e052601760e05160a052608052604060802054610100526020610100f35b63b7aca568811861168a5760e08060208082528083018060188082602082540160c060006002818352015b8260c051602002111561162457611643565b60c05185015460c0516020028501528151600101808352811415611612575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810190509050905060e0f35b6373861fb381186116bf576004358060a01c61202c5760e052601a60e05160a052608052604060802054610100526020610100f35b63f05cc0588118611712576004358060a01c61202c5760e0526024358060a01c61202c5761010052601b60e05160a05260805260406080206101005160a052608052604060802054610120526020610120f35b505b60006000fd5b6020604038036080396080516101005118611758577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81525061177c565b600460e05160a05260805260406080206101005160a0526080526040608020548152505b565b600d546101605260006101005114156117985760006117c8565b60006101605114156117ab5760006117c8565b6101605160a01c610e10818183011061202c578082019050905042115b15611889576101605174010000000000000000000000000000000000000000808206905090508060a01c61202c57610180526018806101a0602082540160c060006002818352015b8260c051602002111561182257611841565b60c05185015460c0516020028501528151600101808352811415611810575b5050505050506101a050600060006101a0516101c06000610180515af161186d573d600060003e3d6000fd5b610180514260a01b818183011061202c5780820190509050600d555b6101405161018052610120516118a05760006118a6565b61018051155b156118d057601760e05160a05260805260406080205461018052610180516118d05760e051610180525b600260e05160a0526080526040608020546101a0526101c060006008818352015b60016101c051600881101561202c5702600e01546101e0526101e05161191657611d26565b60006102005260006101005114611a12576370a082316102405230610260526020610240602461025c6101e0515afa611954573d600060003e3d6000fd5b601f3d111561202c576102405161022052670de0b6b3a76400006102205160166101e05160a05260805260406080205480821061202c578082039050905080820282158284830414171561202c57905090506101005180801561202c57820490509050610200526102205160166101e05160a05260805260406080205560e051611a125760006102005114611d1657601a6101e05160a0526080526040608020805461020051818183011061202c5780820190509050815550611d16565b601a6101e05160a05260805260406080205461020051818183011061202c57808201905090506102205260006102005114611a5e5761022051601a6101e05160a0526080526040608020555b601b6101e05160a052608052604060802060e05160a0526080526040608020546102405260006102605261022051610240511015611afd5761022051601b6101e05160a052608052604060802060e05160a0526080526040608020556101a051610220516102405180821061202c578082039050905080820282158284830414171561202c5790509050670de0b6b3a764000080820490509050610260525b601c60e05160a05260805260406080206101e05160a052608052604060802054610280526102805160801c61026051818183011061202c57808201905090506102a05260006102a0511115611d165761028051700100000000000000000000000000000000808206905090506102c05261012051611bc1576000610260511115611d16576102c0516102a05160801b818183011061202c5780820190509050601c60e05160a05260805260406080206101e05160a052608052604060802055611d16565b60006004610320527fa9059cbb00000000000000000000000000000000000000000000000000000000610340526103206004806020846103600101826020850160045afa505080518201915050610180516020826103600101526020810190506102a0516020826103600101526020810190508061036052610360505060206104006103605161038060006101e0515af1611c61573d600060003e3d6000fd5b6103e060203d808211611c745781611c76565b805b9050905081528051602001806102e0828460045afa9050505060006102e05114611cb557610300516102e05181816020036008021c905090501561202c575b60166101e05160a052608052604060802080546102a05180821061202c57808203905090508155506102c0516102a051818183011061202c5780820190509050601c60e05160a05260805260406080206101e05160a0526080526040608020555b81516001018083528114156118f1575b5050565b600d5474010000000000000000000000000000000000000000808206905090508060a01c61202c576104805260006104605114611e2d576003546104a0526104205160e0526104a05161010052600061012052600061014052611d8b61177e565b60026104205160a0526080526040608020546104605180821061202c57808203905090506104c0526104c05160026104205160a0526080526040608020556104405160e0526104a05161010052600061012052600061014052611dec61177e565b60026104405160a05260805260406080205461046051818183011061202c57808201905090506104c0526104c05160026104405160a0526080526040608020555b61044051610420517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610460516104a05260206104a0a3565b60015461056052600d5474010000000000000000000000000000000000000000808206905090508060a01c61202c57610580526003546105a052600060e0526105a05161010052600061012052600061014052611ec161177e565b60006104205114611ee5576000610460511461202c576000610420513b111561202c575b61042051600d55601c6004602082066105c00160208284011161202c576020806105e08261044060045afa505081815290509050806018602082510160c060006002818352015b8260c0516020021115611f3e57611f5d565b60c05160200285015160c0518501558151600101808352811415611f2c575b5050505050506105c060006008818352015b60016105c051600881101561202c5702600e01546105e0526104606105c051600881101561202c5760200201516106005260006105e0511415611fde576000610600511415611fc157611ffc56611fec565b6106005160016105c051600881101561202c5702600e0155611fec565b610600516105e0511861202c575b8151600101808352811415611f6f575b50506000610420511461202a57600060e0526105a0516101005260006101205260006101405261202a61177e565b565b600080fd5b61006b61209c0361006b6101a03961006b61209c0361014051816101a0015261016051816101c0015261018051816101e00152806060016101a0f35b600080fd", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/index.ts b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/index.ts new file mode 100644 index 0000000..0f9b0a2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/index.ts @@ -0,0 +1,15 @@ +import { Task, TaskRunOptions } from '@src'; +import { ChildChainLiquidityGaugeFactoryDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as ChildChainLiquidityGaugeFactoryDeployment; + + const gaugeArgs = [input.BAL, input.Vault, input.AuthorizerAdaptor]; + const gaugeImplementation = await task.deploy('RewardsOnlyGauge', gaugeArgs, from, force); + + const streamerArgs = [input.BAL, input.AuthorizerAdaptor]; + const streamerImplementation = await task.deploy('ChildChainStreamer', streamerArgs, from, force); + + const factoryArgs = [gaugeImplementation.address, streamerImplementation.address]; + await task.deployAndVerify('ChildChainLiquidityGaugeFactory', factoryArgs, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/input.ts b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/input.ts new file mode 100644 index 0000000..a17cb99 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/input.ts @@ -0,0 +1,17 @@ +import { Task, TaskMode } from '@src'; + +export type ChildChainLiquidityGaugeFactoryDeployment = { + AuthorizerAdaptor: string; + BAL: string; + Vault: string; +}; + +const AuthorizerAdaptor = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY); +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BAL = new Task('00000000-tokens', TaskMode.READ_ONLY); + +export default { + AuthorizerAdaptor, + Vault, + BAL, +}; diff --git a/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/output/arbitrum.json b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/output/arbitrum.json new file mode 100644 index 0000000..a3e3321 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/output/arbitrum.json @@ -0,0 +1,5 @@ +{ + "RewardsOnlyGauge": "0x41B953164995c11C81DA73D212ED8Af25741b7Ac", + "ChildChainStreamer": "0xD7FAD3bd59D6477cbe1BE7f646F7f1BA25b230f8", + "ChildChainLiquidityGaugeFactory": "0xb08E16cFc07C684dAA2f93C70323BAdb2A6CBFd2" +} diff --git a/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/output/gnosis.json b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/output/gnosis.json new file mode 100644 index 0000000..3460b08 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/output/gnosis.json @@ -0,0 +1,5 @@ +{ + "RewardsOnlyGauge": "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B", + "ChildChainStreamer": "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a", + "ChildChainLiquidityGaugeFactory": "0x809B79b53F18E9bc08A961ED4678B901aC93213a" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/output/goerli.json b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/output/goerli.json new file mode 100644 index 0000000..1d4d253 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/output/goerli.json @@ -0,0 +1,5 @@ +{ + "RewardsOnlyGauge": "0x40Bd3fAef4268EA40F4c372D7f0A44C3EFaAA6b1", + "ChildChainStreamer": "0x5B5B72D76B68f4Bb1d2A10EF0fc77711f8Ec7ed0", + "ChildChainLiquidityGaugeFactory": "0x393B918Cc2Ffa238732E83dD4eE52343f57d767b" +} diff --git a/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/output/kovan.json b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/output/kovan.json new file mode 100644 index 0000000..a4743d8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/output/kovan.json @@ -0,0 +1,5 @@ +{ + "RewardsOnlyGauge": "0x868543Bb787317632F94fCfe8eB85406B123590C", + "ChildChainStreamer": "0x4De578134995bEA8480D7696946217f356339Ab8", + "ChildChainLiquidityGaugeFactory": "0xf9ac7B9dF2b3454E841110CcE5550bD5AC6f875F" +} diff --git a/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/output/optimism.json b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/output/optimism.json new file mode 100644 index 0000000..ccc4be7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/output/optimism.json @@ -0,0 +1,5 @@ +{ + "RewardsOnlyGauge": "0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD", + "ChildChainStreamer": "0x239e55F427D44C3cc793f49bFB507ebe76638a2b", + "ChildChainLiquidityGaugeFactory": "0x2E96068b3D5B5BAE3D7515da4A1D2E52d08A2647" +} diff --git a/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/output/polygon.json b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/output/polygon.json new file mode 100644 index 0000000..32e5ac1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/output/polygon.json @@ -0,0 +1,5 @@ +{ + "RewardsOnlyGauge": "0x2E96068b3D5B5BAE3D7515da4A1D2E52d08A2647", + "ChildChainStreamer": "0x6f5a2eE11E7a772AeB5114A20d0D7c0ff61EB8A0", + "ChildChainLiquidityGaugeFactory": "0x3b8cA519122CdD8efb272b0D3085453404B25bD0" +} diff --git a/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/readme.md b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/readme.md new file mode 100644 index 0000000..429c9ee --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220413-child-chain-gauge-factory/readme.md @@ -0,0 +1,14 @@ +# 2022-04-13 - Child Chain Liquidity Gauge Factory + +Deployment of the `ChildChainLiquidityGaugeFactory`, for liquidity gauges to be used with pools on networks other than Ethereum. + +## Useful Files + +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`ChildChainStreamer` artifact](./artifact/ChildChainStreamer.json) +- [`RewardsOnlyGauge` artifact](./artifact/RewardsOnlyGauge.json) +- [`ChildChainLiquidityGaugeFactory` artifact](./artifact/ChildChainLiquidityGaugeFactory.json) diff --git a/balpy/balancer-deployments/tasks/20220420-smart-wallet-checker/artifact/SmartWalletChecker.json b/balpy/balancer-deployments/tasks/20220420-smart-wallet-checker/artifact/SmartWalletChecker.json new file mode 100644 index 0000000..7120dd6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220420-smart-wallet-checker/artifact/SmartWalletChecker.json @@ -0,0 +1,175 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SmartWalletChecker", + "sourceName": "contracts/SmartWalletChecker.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "address[]", + "name": "initialAllowedAddresses", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "name": "ContractAddressAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "name": "ContractAddressRemoved", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "name": "allowlistAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "name": "check", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "name": "denylistAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getAllowlistedAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAllowlistedAddressesLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60c060405234801561001057600080fd5b50604051610bcb380380610bcb8339818101604052604081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825186602082028301116401000000008211171561008c57600080fd5b82525081516020918201928201910280838360005b838110156100b95781810151838201526020016100a1565b505050509190910160405250503060805250506001600160601b0319606083901b1660a052805160005b818110156101155761010d8382815181106100fa57fe5b602002602001015161011e60201b60201c565b6001016100e3565b5050505061024c565b6101368160006101c660201b61040d1790919060201c565b610187576040805162461bcd60e51b815260206004820152601b60248201527f4164647265737320616c726561647920616c6c6f776c69737465640000000000604482015290519081900360640190fd5b604080516001600160a01b038316815290517fc1fafd2633d2190fbc0bd1e0e993dc44495d77bd7a5bc0a4951b5edb0d58254e9181900360200190a150565b60006101d2838361022b565b61022157508154600180820184556000848152602080822090930180546001600160a01b0319166001600160a01b03861690811790915585549082528286019093526040902091909155610225565b5060005b92915050565b6001600160a01b031660009081526001919091016020526040902054151590565b60805160a05160601c6109596102726000398061027052508061020352506109596000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063aaabadc51161005b578063aaabadc514610161578063c23697a814610169578063c7abf7e2146101b0578063f191aad0146101b857610088565b80632ee7ca641461008d578063851c1bb3146100d35780638d928af814610124578063a5ee4e711461012c575b600080fd5b6100aa600480360360208110156100a357600080fd5b50356101eb565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610112600480360360208110156100e957600080fd5b50357fffffffff00000000000000000000000000000000000000000000000000000000166101fd565b60408051918252519081900360200190f35b6100aa61026e565b61015f6004803603602081101561014257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610292565b005b6100aa61035c565b61019c6004803603602081101561017f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166103dc565b604080519115158252519081900360200190f35b6101126103e8565b61015f600480360360208110156101ce57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166103f9565b60006101f78183610496565b92915050565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b61029a6104b9565b6102a56000826104ff565b61031057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f41646472657373206973206e6f7420616c6c6f776c6973746564000000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517f6b7e0fe40ab6dde83349106ff5b5ce7689d5912a704a21a972034191d182de329181900360200190a150565b600061036661026e565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156103ab57600080fd5b505afa1580156103bf573d6000803e3d6000fd5b505050506040513d60208110156103d557600080fd5b5051905090565b60006101f781836106ad565b60006103f460006106db565b905090565b6104016104b9565b61040a816106df565b50565b600061041983836106ad565b61048d57508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155855490825282860190935260409020919091556101f7565b50600092915050565b81546000906104a890831060646107a1565b6104b283836107b3565b9392505050565b60006104e86000357fffffffff00000000000000000000000000000000000000000000000000000000166101fd565b905061040a6104f782336107ed565b6101916107a1565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205480156106a35783547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808301910180821461060857600086600001828154811061056d57fe5b600091825260209091200154875473ffffffffffffffffffffffffffffffffffffffff909116915081908890859081106105a357fe5b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff94851617905592909116815260018881019092526040902090830190555b855486908061061357fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff871682526001888101909152604082209190915593506101f792505050565b60009150506101f7565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001919091016020526040902054151590565b5490565b6106ea60008261040d565b61075557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4164647265737320616c726561647920616c6c6f776c69737465640000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517fc1fafd2633d2190fbc0bd1e0e993dc44495d77bd7a5bc0a4951b5edb0d58254e9181900360200190a150565b816107af576107af816108b6565b5050565b60008260000182815481106107c457fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169392505050565b60006107f761035c565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b15801561088357600080fd5b505afa158015610897573d6000803e3d6000fd5b505050506040513d60208110156108ad57600080fd5b50519392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fdfea2646970667358221220e3e34d3520c216839fccf9b621b0c368bce598377298a3775c7a16aacf9bb97064736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063aaabadc51161005b578063aaabadc514610161578063c23697a814610169578063c7abf7e2146101b0578063f191aad0146101b857610088565b80632ee7ca641461008d578063851c1bb3146100d35780638d928af814610124578063a5ee4e711461012c575b600080fd5b6100aa600480360360208110156100a357600080fd5b50356101eb565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610112600480360360208110156100e957600080fd5b50357fffffffff00000000000000000000000000000000000000000000000000000000166101fd565b60408051918252519081900360200190f35b6100aa61026e565b61015f6004803603602081101561014257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610292565b005b6100aa61035c565b61019c6004803603602081101561017f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166103dc565b604080519115158252519081900360200190f35b6101126103e8565b61015f600480360360208110156101ce57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166103f9565b60006101f78183610496565b92915050565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b61029a6104b9565b6102a56000826104ff565b61031057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f41646472657373206973206e6f7420616c6c6f776c6973746564000000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517f6b7e0fe40ab6dde83349106ff5b5ce7689d5912a704a21a972034191d182de329181900360200190a150565b600061036661026e565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156103ab57600080fd5b505afa1580156103bf573d6000803e3d6000fd5b505050506040513d60208110156103d557600080fd5b5051905090565b60006101f781836106ad565b60006103f460006106db565b905090565b6104016104b9565b61040a816106df565b50565b600061041983836106ad565b61048d57508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155855490825282860190935260409020919091556101f7565b50600092915050565b81546000906104a890831060646107a1565b6104b283836107b3565b9392505050565b60006104e86000357fffffffff00000000000000000000000000000000000000000000000000000000166101fd565b905061040a6104f782336107ed565b6101916107a1565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205480156106a35783547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808301910180821461060857600086600001828154811061056d57fe5b600091825260209091200154875473ffffffffffffffffffffffffffffffffffffffff909116915081908890859081106105a357fe5b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff94851617905592909116815260018881019092526040902090830190555b855486908061061357fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff871682526001888101909152604082209190915593506101f792505050565b60009150506101f7565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001919091016020526040902054151590565b5490565b6106ea60008261040d565b61075557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4164647265737320616c726561647920616c6c6f776c69737465640000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517fc1fafd2633d2190fbc0bd1e0e993dc44495d77bd7a5bc0a4951b5edb0d58254e9181900360200190a150565b816107af576107af816108b6565b5050565b60008260000182815481106107c457fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169392505050565b60006107f761035c565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b15801561088357600080fd5b505afa158015610897573d6000803e3d6000fd5b505050506040513d60208110156108ad57600080fd5b50519392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fdfea2646970667358221220e3e34d3520c216839fccf9b621b0c368bce598377298a3775c7a16aacf9bb97064736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220420-smart-wallet-checker/index.ts b/balpy/balancer-deployments/tasks/20220420-smart-wallet-checker/index.ts new file mode 100644 index 0000000..db65c8d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220420-smart-wallet-checker/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { SmartWalletCheckerDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as SmartWalletCheckerDeployment; + + const args = [input.Vault, input.InitialAllowedAddresses]; + await task.deployAndVerify('SmartWalletChecker', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20220420-smart-wallet-checker/input.ts b/balpy/balancer-deployments/tasks/20220420-smart-wallet-checker/input.ts new file mode 100644 index 0000000..0f08b29 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220420-smart-wallet-checker/input.ts @@ -0,0 +1,22 @@ +import { Task, TaskMode } from '@src'; + +export type SmartWalletCheckerDeployment = { + Vault: string; + InitialAllowedAddresses: string[]; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, + mainnet: { + // TribeDAO's contract, from https://vote.balancer.fi/#/proposal/0xece898cf86f930dd150f622a4ccb1fa41900e67b3cebeb4fc7c5a4acbb0e0148 + InitialAllowedAddresses: ['0xc4EAc760C2C631eE0b064E39888b89158ff808B2'], + }, + goerli: { + InitialAllowedAddresses: [], + }, + sepolia: { + InitialAllowedAddresses: [], + }, +}; diff --git a/balpy/balancer-deployments/tasks/20220420-smart-wallet-checker/output/goerli.json b/balpy/balancer-deployments/tasks/20220420-smart-wallet-checker/output/goerli.json new file mode 100644 index 0000000..09bb3b2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220420-smart-wallet-checker/output/goerli.json @@ -0,0 +1,3 @@ +{ + "SmartWalletChecker": "0x1b6DF1fF5db99F8a8A04D38f7478BAB056Fa35A7" +} diff --git a/balpy/balancer-deployments/tasks/20220420-smart-wallet-checker/output/mainnet.json b/balpy/balancer-deployments/tasks/20220420-smart-wallet-checker/output/mainnet.json new file mode 100644 index 0000000..9a32c16 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220420-smart-wallet-checker/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "SmartWalletChecker": "0x7869296Efd0a76872fEE62A058C8fBca5c1c826C" +} diff --git a/balpy/balancer-deployments/tasks/20220420-smart-wallet-checker/output/sepolia.json b/balpy/balancer-deployments/tasks/20220420-smart-wallet-checker/output/sepolia.json new file mode 100644 index 0000000..b5c7fce --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220420-smart-wallet-checker/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "SmartWalletChecker": "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220420-smart-wallet-checker/readme.md b/balpy/balancer-deployments/tasks/20220420-smart-wallet-checker/readme.md new file mode 100644 index 0000000..31e38aa --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220420-smart-wallet-checker/readme.md @@ -0,0 +1,10 @@ +# 2022-04-20 - Smart Wallet Checker + +Deployment of the `SmartWalletChecker`, responsible allowlisting select contracts to be able to mint veBAL. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`SmartWalletChecker` artifact](./artifact/SmartWalletChecker.json) diff --git a/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/artifact/DoubleEntrypointFixRelayer.json b/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/artifact/DoubleEntrypointFixRelayer.json new file mode 100644 index 0000000..7c7e2b5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/artifact/DoubleEntrypointFixRelayer.json @@ -0,0 +1,240 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "DoubleEntrypointFixRelayer", + "sourceName": "contracts/relayer/special/DoubleEntrypointFixRelayer.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "BTC_STABLE_POOL_ADDRESS", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "BTC_STABLE_POOL_ID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SNX", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SNX_IMPLEMENTATION", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SNX_WEIGHTED_POOL_ADDRESS", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SNX_WEIGHTED_POOL_ID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WETH", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "exitBTCStablePool", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "exitSNXWeightedPool", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "receiveFlashLoan", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renBTC", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "sBTC", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "sBTC_IMPLEMENTATION", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "sweepDoubleEntrypointToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "sweepSNXsBTC", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "wBTC", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60c06040523480156200001157600080fd5b5060405162001b4338038062001b438339810160408190526200003491620000dd565b806001600160a01b03166080816001600160a01b031660601b81525050806001600160a01b031663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200008b57600080fd5b505afa158015620000a0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000c69190620000dd565b60601b6001600160601b03191660a052506200011c565b600060208284031215620000ef578081fd5b8151620000fc8162000103565b9392505050565b6001600160a01b03811681146200011957600080fd5b50565b60805160601c60a05160601c6119da620001696000398061077c5280610ccf52806110e252508061025c528061033c5280610a505280610f595280610f86528061111352506119da6000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c80639b452931116100b2578063e043f56f11610081578063e8d6101e11610066578063e8d6101e146101c0578063f04f2707146101c8578063fd6ea58d146101db5761011b565b8063e043f56f146101b0578063e4231540146101b85761011b565b80639b45293114610190578063a2abb55f14610198578063ad5c4648146101a0578063cbc87782146101a85761011b565b80635fbc1031116100ee5780635fbc10311461017057806369af9c7e146101785780636ad3aaa4146101805780638d928af8146101885761011b565b80630306ae12146101205780630a5e13dc146101355780635dc80bd0146101535780635f5fb03614610168575b600080fd5b61013361012e366004611468565b6101e3565b005b61013d6103ab565b60405161014a91906116d9565b60405180910390f35b61015b6103c3565b60405161014a919061176c565b6101336103e7565b61013d6105ad565b6101336105c5565b61013d610a36565b61013d610a4e565b61013d610a72565b61013d610a8a565b61013d610aa2565b610133610aba565b61013d610eea565b61015b610f02565b61013d610f26565b6101336101d63660046114a3565b610f3e565b61013d610ffa565b6060815167ffffffffffffffff811180156101fd57600080fd5b50604051908082528060200260200182016040528015610227578160200160208202803683370190505b5090508160008151811061023757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040161029791906116d9565b60206040518083038186803b1580156102af57600080fd5b505afa1580156102c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e791906115d6565b816000815181106102f457fe5b60209081029190910101526040517f5c38449e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635c38449e906103759030908690869060040161186f565b600060405180830381600087803b15801561038f57600080fd5b505af11580156103a3573d6000803e3d6000fd5b505050505050565b73072f14b85add63488ddad88f855fda4a99d6ac9b81565b7f072f14b85add63488ddad88f855fda4a99d6ac9b00020000000000000000002781565b604080516002808252606080830184529260208301908036833701905050905073639032d3900875a4cf4960ad6b9ee441657aa93c8160008151811061042957fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f8160018151811061048557fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506104c8816101e3565b60408051600280825260608083018452926020830190803683370190505090507318fcc34bdeaaf9e3b69d2500343527c0c995b1d68160008151811061050a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073fe18be6b3bd88a2d2a7f928d00292e7a9963cfc68160018151811061056657fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506105a9816101e3565b5050565b73eb4c2781e4eba804ce9a9803c67d0893436bb27d81565b604080516002808252606080830184529260208301908036833701905050905073c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f8160008151811061060757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061066357fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073072f14b85add63488ddad88f855fda4a99d6ac9b906370a08231906106db9033906004016116d9565b60206040518083038186803b1580156106f357600080fd5b505afa158015610707573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072b91906115d6565b6040517f70a082310000000000000000000000000000000000000000000000000000000081529091506107f99073c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f9081906370a08231906107a4907f0000000000000000000000000000000000000000000000000000000000000000906004016116d9565b60206040518083038186803b1580156107bc57600080fd5b505afa1580156107d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f491906115d6565b611012565b606060018260405160200161080f92919061190a565b6040516020818303038152906040529050610828611344565b604051806080016040528061083c86611173565b8152602001855167ffffffffffffffff8111801561085957600080fd5b50604051908082528060200260200182016040528015610883578160200160208202803683370190505b508152602081018490526000604090910152905061089f610a4e565b6040517f8bdb391300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9190911690638bdb391390610919907f072f14b85add63488ddad88f855fda4a99d6ac9b00020000000000000000002790339081908790600401611775565b600060405180830381600087803b15801561093357600080fd5b505af1158015610947573d6000803e3d6000fd5b50506040805160028082526060808301845294509092509060208301908036833701905050905073639032d3900875a4cf4960ad6b9ee441657aa93c8160008151811061099057fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f816001815181106109ec57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610a2f816101e3565b5050505050565b7318fcc34bdeaaf9e3b69d2500343527c0c995b1d681565b7f000000000000000000000000000000000000000000000000000000000000000090565b732260fac5e5542a773aa44fbcfedf7c193bc2c59981565b73639032d3900875a4cf4960ad6b9ee441657aa93c81565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60408051600380825260808201909252606091602082018380368337019050509050732260fac5e5542a773aa44fbcfedf7c193bc2c59981600081518110610afe57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073eb4c2781e4eba804ce9a9803c67d0893436bb27d81600181518110610b5a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073fe18be6b3bd88a2d2a7f928d00292e7a9963cfc681600281518110610bb657fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073feadd389a5c427952d8fdb8057d6c8ba1156cc56906370a0823190610c2e9033906004016116d9565b60206040518083038186803b158015610c4657600080fd5b505afa158015610c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7e91906115d6565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152909150610cf79073fe18be6b3bd88a2d2a7f928d00292e7a9963cfc69081906370a08231906107a4907f0000000000000000000000000000000000000000000000000000000000000000906004016116d9565b6060600182604051602001610d0d9291906118f2565b6040516020818303038152906040529050610d26611344565b6040518060800160405280610d3a86611173565b8152602001855167ffffffffffffffff81118015610d5757600080fd5b50604051908082528060200260200182016040528015610d81578160200160208202803683370190505b5081526020810184905260006040909101529050610d9d610a4e565b6040517f8bdb391300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9190911690638bdb391390610e17907ffeadd389a5c427952d8fdb8057d6c8ba1156cc5600000000000000000000006690339081908790600401611775565b600060405180830381600087803b158015610e3157600080fd5b505af1158015610e45573d6000803e3d6000fd5b5050604080516002808252606080830184529450909250906020830190803683370190505090507318fcc34bdeaaf9e3b69d2500343527c0c995b1d681600081518110610e8e57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073fe18be6b3bd88a2d2a7f928d00292e7a9963cfc6816001815181106109ec57fe5b73fe18be6b3bd88a2d2a7f928d00292e7a9963cfc681565b7ffeadd389a5c427952d8fdb8057d6c8ba1156cc5600000000000000000000006681565b73c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f81565b610f813373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161460cd611176565b610ff47f000000000000000000000000000000000000000000000000000000000000000084600081518110610fb257fe5b602002602001015186600081518110610fc757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166111849092919063ffffffff16565b50505050565b73feadd389a5c427952d8fdb8057d6c8ba1156cc5681565b60408051600180825281830190925260609160208083019080368337019050509050828160008151811061104257fe5b73ffffffffffffffffffffffffffffffffffffffff9290921660209283029190910190910152604080516001808252818301909252606091816020016020820280368337019050509050828160008151811061109a57fe5b60209081029190910101526040517f6daefab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636daefab69061113b90859085907f000000000000000000000000000000000000000000000000000000000000000090600401611720565b600060405180830381600087803b15801561115557600080fd5b505af1158015611169573d6000803e3d6000fd5b5050505050505050565b90565b816105a9576105a98161122a565b6112258363a9059cbb60e01b84846040516024016111a39291906116fa565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611297565b505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516112c091906116bd565b6000604051808303816000865af19150503d80600081146112fd576040519150601f19603f3d011682016040523d82523d6000602084013e611302565b606091505b5091509150600082141561131a573d6000803e3d6000fd5b610ff481516000148061133c57508180602001905181019061133c91906115af565b6101a2611176565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b600082601f83011261137e578081fd5b813561139161138c8261193f565b611918565b8181529150602080830190848101818402860182018710156113b257600080fd5b6000805b858110156113f357823573ffffffffffffffffffffffffffffffffffffffff811681146113e1578283fd5b855293830193918301916001016113b6565b50505050505092915050565b600082601f83011261140f578081fd5b813561141d61138c8261193f565b81815291506020808301908481018184028601820187101561143e57600080fd5b60005b8481101561145d57813584529282019290820190600101611441565b505050505092915050565b600060208284031215611479578081fd5b813567ffffffffffffffff81111561148f578182fd5b61149b8482850161136e565b949350505050565b600080600080608085870312156114b8578283fd5b843567ffffffffffffffff808211156114cf578485fd5b6114db8883890161136e565b95506020915081870135818111156114f1578586fd5b6114fd89828a016113ff565b955050604087013581811115611511578485fd5b61151d89828a016113ff565b945050606087013581811115611531578384fd5b8701601f81018913611541578384fd5b80358281111561154f578485fd5b61157f847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611918565b92508083528984828401011115611594578485fd5b80848301858501378201909201929092525092959194509250565b6000602082840312156115c0578081fd5b815180151581146115cf578182fd5b9392505050565b6000602082840312156115e7578081fd5b5051919050565b6000815180845260208085019450808401835b8381101561163357815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101611601565b509495945050505050565b6000815180845260208085019450808401835b8381101561163357815187529582019590820190600101611651565b15159052565b6000815180845261168b816020860160208601611978565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082516116cf818460208701611978565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60006060825261173360608301866115ee565b8281036020840152611745818661163e565b91505073ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b90815260200190565b6000858252602073ffffffffffffffffffffffffffffffffffffffff8087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156117f3576117dd845161195f565b82529284019260019290920191908401906117cb565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a0870152611831818561163e565b935050506040850151818584030160c086015261184e8382611673565b92505050606084015161186460e085018261166d565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff851682526080602083015261189e60808301856115ee565b82810360408401526118b0818561163e565b8381036060909401939093525050600281527f307800000000000000000000000000000000000000000000000000000000000060208201526040019392505050565b604081016003841061190057fe5b9281526020015290565b604081016004841061190057fe5b60405181810167ffffffffffffffff8111828210171561193757600080fd5b604052919050565b600067ffffffffffffffff821115611955578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff1690565b60005b8381101561199357818101518382015260200161197b565b83811115610ff4575050600091015256fea2646970667358221220a8b39b560690e7ee753c7480df80cf6eb53ee6c5df51377a0a3f5f322f510a1d64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061011b5760003560e01c80639b452931116100b2578063e043f56f11610081578063e8d6101e11610066578063e8d6101e146101c0578063f04f2707146101c8578063fd6ea58d146101db5761011b565b8063e043f56f146101b0578063e4231540146101b85761011b565b80639b45293114610190578063a2abb55f14610198578063ad5c4648146101a0578063cbc87782146101a85761011b565b80635fbc1031116100ee5780635fbc10311461017057806369af9c7e146101785780636ad3aaa4146101805780638d928af8146101885761011b565b80630306ae12146101205780630a5e13dc146101355780635dc80bd0146101535780635f5fb03614610168575b600080fd5b61013361012e366004611468565b6101e3565b005b61013d6103ab565b60405161014a91906116d9565b60405180910390f35b61015b6103c3565b60405161014a919061176c565b6101336103e7565b61013d6105ad565b6101336105c5565b61013d610a36565b61013d610a4e565b61013d610a72565b61013d610a8a565b61013d610aa2565b610133610aba565b61013d610eea565b61015b610f02565b61013d610f26565b6101336101d63660046114a3565b610f3e565b61013d610ffa565b6060815167ffffffffffffffff811180156101fd57600080fd5b50604051908082528060200260200182016040528015610227578160200160208202803683370190505b5090508160008151811061023757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040161029791906116d9565b60206040518083038186803b1580156102af57600080fd5b505afa1580156102c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e791906115d6565b816000815181106102f457fe5b60209081029190910101526040517f5c38449e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635c38449e906103759030908690869060040161186f565b600060405180830381600087803b15801561038f57600080fd5b505af11580156103a3573d6000803e3d6000fd5b505050505050565b73072f14b85add63488ddad88f855fda4a99d6ac9b81565b7f072f14b85add63488ddad88f855fda4a99d6ac9b00020000000000000000002781565b604080516002808252606080830184529260208301908036833701905050905073639032d3900875a4cf4960ad6b9ee441657aa93c8160008151811061042957fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f8160018151811061048557fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506104c8816101e3565b60408051600280825260608083018452926020830190803683370190505090507318fcc34bdeaaf9e3b69d2500343527c0c995b1d68160008151811061050a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073fe18be6b3bd88a2d2a7f928d00292e7a9963cfc68160018151811061056657fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506105a9816101e3565b5050565b73eb4c2781e4eba804ce9a9803c67d0893436bb27d81565b604080516002808252606080830184529260208301908036833701905050905073c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f8160008151811061060757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061066357fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073072f14b85add63488ddad88f855fda4a99d6ac9b906370a08231906106db9033906004016116d9565b60206040518083038186803b1580156106f357600080fd5b505afa158015610707573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072b91906115d6565b6040517f70a082310000000000000000000000000000000000000000000000000000000081529091506107f99073c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f9081906370a08231906107a4907f0000000000000000000000000000000000000000000000000000000000000000906004016116d9565b60206040518083038186803b1580156107bc57600080fd5b505afa1580156107d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f491906115d6565b611012565b606060018260405160200161080f92919061190a565b6040516020818303038152906040529050610828611344565b604051806080016040528061083c86611173565b8152602001855167ffffffffffffffff8111801561085957600080fd5b50604051908082528060200260200182016040528015610883578160200160208202803683370190505b508152602081018490526000604090910152905061089f610a4e565b6040517f8bdb391300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9190911690638bdb391390610919907f072f14b85add63488ddad88f855fda4a99d6ac9b00020000000000000000002790339081908790600401611775565b600060405180830381600087803b15801561093357600080fd5b505af1158015610947573d6000803e3d6000fd5b50506040805160028082526060808301845294509092509060208301908036833701905050905073639032d3900875a4cf4960ad6b9ee441657aa93c8160008151811061099057fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f816001815181106109ec57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610a2f816101e3565b5050505050565b7318fcc34bdeaaf9e3b69d2500343527c0c995b1d681565b7f000000000000000000000000000000000000000000000000000000000000000090565b732260fac5e5542a773aa44fbcfedf7c193bc2c59981565b73639032d3900875a4cf4960ad6b9ee441657aa93c81565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60408051600380825260808201909252606091602082018380368337019050509050732260fac5e5542a773aa44fbcfedf7c193bc2c59981600081518110610afe57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073eb4c2781e4eba804ce9a9803c67d0893436bb27d81600181518110610b5a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073fe18be6b3bd88a2d2a7f928d00292e7a9963cfc681600281518110610bb657fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073feadd389a5c427952d8fdb8057d6c8ba1156cc56906370a0823190610c2e9033906004016116d9565b60206040518083038186803b158015610c4657600080fd5b505afa158015610c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7e91906115d6565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152909150610cf79073fe18be6b3bd88a2d2a7f928d00292e7a9963cfc69081906370a08231906107a4907f0000000000000000000000000000000000000000000000000000000000000000906004016116d9565b6060600182604051602001610d0d9291906118f2565b6040516020818303038152906040529050610d26611344565b6040518060800160405280610d3a86611173565b8152602001855167ffffffffffffffff81118015610d5757600080fd5b50604051908082528060200260200182016040528015610d81578160200160208202803683370190505b5081526020810184905260006040909101529050610d9d610a4e565b6040517f8bdb391300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9190911690638bdb391390610e17907ffeadd389a5c427952d8fdb8057d6c8ba1156cc5600000000000000000000006690339081908790600401611775565b600060405180830381600087803b158015610e3157600080fd5b505af1158015610e45573d6000803e3d6000fd5b5050604080516002808252606080830184529450909250906020830190803683370190505090507318fcc34bdeaaf9e3b69d2500343527c0c995b1d681600081518110610e8e57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073fe18be6b3bd88a2d2a7f928d00292e7a9963cfc6816001815181106109ec57fe5b73fe18be6b3bd88a2d2a7f928d00292e7a9963cfc681565b7ffeadd389a5c427952d8fdb8057d6c8ba1156cc5600000000000000000000006681565b73c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f81565b610f813373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161460cd611176565b610ff47f000000000000000000000000000000000000000000000000000000000000000084600081518110610fb257fe5b602002602001015186600081518110610fc757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166111849092919063ffffffff16565b50505050565b73feadd389a5c427952d8fdb8057d6c8ba1156cc5681565b60408051600180825281830190925260609160208083019080368337019050509050828160008151811061104257fe5b73ffffffffffffffffffffffffffffffffffffffff9290921660209283029190910190910152604080516001808252818301909252606091816020016020820280368337019050509050828160008151811061109a57fe5b60209081029190910101526040517f6daefab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636daefab69061113b90859085907f000000000000000000000000000000000000000000000000000000000000000090600401611720565b600060405180830381600087803b15801561115557600080fd5b505af1158015611169573d6000803e3d6000fd5b5050505050505050565b90565b816105a9576105a98161122a565b6112258363a9059cbb60e01b84846040516024016111a39291906116fa565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611297565b505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516112c091906116bd565b6000604051808303816000865af19150503d80600081146112fd576040519150601f19603f3d011682016040523d82523d6000602084013e611302565b606091505b5091509150600082141561131a573d6000803e3d6000fd5b610ff481516000148061133c57508180602001905181019061133c91906115af565b6101a2611176565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b600082601f83011261137e578081fd5b813561139161138c8261193f565b611918565b8181529150602080830190848101818402860182018710156113b257600080fd5b6000805b858110156113f357823573ffffffffffffffffffffffffffffffffffffffff811681146113e1578283fd5b855293830193918301916001016113b6565b50505050505092915050565b600082601f83011261140f578081fd5b813561141d61138c8261193f565b81815291506020808301908481018184028601820187101561143e57600080fd5b60005b8481101561145d57813584529282019290820190600101611441565b505050505092915050565b600060208284031215611479578081fd5b813567ffffffffffffffff81111561148f578182fd5b61149b8482850161136e565b949350505050565b600080600080608085870312156114b8578283fd5b843567ffffffffffffffff808211156114cf578485fd5b6114db8883890161136e565b95506020915081870135818111156114f1578586fd5b6114fd89828a016113ff565b955050604087013581811115611511578485fd5b61151d89828a016113ff565b945050606087013581811115611531578384fd5b8701601f81018913611541578384fd5b80358281111561154f578485fd5b61157f847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611918565b92508083528984828401011115611594578485fd5b80848301858501378201909201929092525092959194509250565b6000602082840312156115c0578081fd5b815180151581146115cf578182fd5b9392505050565b6000602082840312156115e7578081fd5b5051919050565b6000815180845260208085019450808401835b8381101561163357815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101611601565b509495945050505050565b6000815180845260208085019450808401835b8381101561163357815187529582019590820190600101611651565b15159052565b6000815180845261168b816020860160208601611978565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082516116cf818460208701611978565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60006060825261173360608301866115ee565b8281036020840152611745818661163e565b91505073ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b90815260200190565b6000858252602073ffffffffffffffffffffffffffffffffffffffff8087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156117f3576117dd845161195f565b82529284019260019290920191908401906117cb565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a0870152611831818561163e565b935050506040850151818584030160c086015261184e8382611673565b92505050606084015161186460e085018261166d565b509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff851682526080602083015261189e60808301856115ee565b82810360408401526118b0818561163e565b8381036060909401939093525050600281527f307800000000000000000000000000000000000000000000000000000000000060208201526040019392505050565b604081016003841061190057fe5b9281526020015290565b604081016004841061190057fe5b60405181810167ffffffffffffffff8111828210171561193757600080fd5b604052919050565b600067ffffffffffffffff821115611955578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff1690565b60005b8381101561199357818101518382015260200161197b565b83811115610ff4575050600091015256fea2646970667358221220a8b39b560690e7ee753c7480df80cf6eb53ee6c5df51377a0a3f5f322f510a1d64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/index.ts b/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/index.ts new file mode 100644 index 0000000..9143ea3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { DoubleEntrypointFixRelayerDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as DoubleEntrypointFixRelayerDeployment; + + const args = [input.Vault]; + await task.deployAndVerify('DoubleEntrypointFixRelayer', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/input.ts b/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/input.ts new file mode 100644 index 0000000..c2919fb --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type DoubleEntrypointFixRelayerDeployment = { + Vault: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, +}; diff --git a/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/output/arbitrum.json b/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/output/arbitrum.json new file mode 100644 index 0000000..472ba76 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "DoubleEntrypointFixRelayer": "0x8E5698dC4897DC12243c8642e77B4f21349Db97C" +} diff --git a/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/output/goerli.json b/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/output/goerli.json new file mode 100644 index 0000000..3a9e679 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/output/goerli.json @@ -0,0 +1,3 @@ +{ + "DoubleEntrypointFixRelayer": "0xBe9458ab5B6F289e524410141c8d5E20A6b035fe" +} diff --git a/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/output/mainnet.json b/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/output/mainnet.json new file mode 100644 index 0000000..ce667c6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "DoubleEntrypointFixRelayer": "0xcA96C4f198d343E251b1a01F3EBA061ef3DA73C1" +} diff --git a/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/output/optimism.json b/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/output/optimism.json new file mode 100644 index 0000000..d37e32d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/output/optimism.json @@ -0,0 +1,3 @@ +{ + "DoubleEntrypointFixRelayer": "0x3b8cA519122CdD8efb272b0D3085453404B25bD0" +} diff --git a/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/output/polygon.json b/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/output/polygon.json new file mode 100644 index 0000000..3c1d4e2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/output/polygon.json @@ -0,0 +1,3 @@ +{ + "DoubleEntrypointFixRelayer": "0x79d0011892fe558FC5a4ec7D4Ca5db59069f460f" +} diff --git a/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/readme.md b/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/readme.md new file mode 100644 index 0000000..d58d6d4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/readme.md @@ -0,0 +1,14 @@ +# 2022-05-13 - Double Entrypoint Fix Relayer + +Deployment of the Double Entrypoint Fix Relayer, which is used to safely sweep funds into the Protocol Fee Collector, and then lets LPs exit the related pools proportionally. See [the forum post](https://forum.balancer.fi/t/medium-severity-bug-found/3161) for more information. + +The relayer is mostly useful on mainnet, as it included mainnet hardcoded addresses, but deployments on Polygon and Arbitrum were also made in case the sweeping functionality is required at a moment's notice. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`DoubleEntrypointFixRelayer` artifact](./artifact/DoubleEntrypointFixRelayer.json) diff --git a/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/test/task.fork.ts b/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/test/task.fork.ts new file mode 100644 index 0000000..690197a --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220513-double-entrypoint-fix-relayer/test/task.fork.ts @@ -0,0 +1,168 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import { defaultAbiCoder } from '@ethersproject/abi'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { actionId } from '@helpers/models/misc/actions'; +import { WeightedPoolEncoder } from '@helpers/models/pools/weighted/encoder'; + +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; + +describeForkTest('DoubleEntrypointFixRelayer', 'mainnet', 14770592, function () { + let govMultisig: SignerWithAddress; + let btcBptHolder: SignerWithAddress, snxBptHolder: SignerWithAddress; + let relayer: Contract; + + let vault: Contract, balancerHelpers: Contract, authorizer: Contract, protocolFeesCollector: Contract; + let wBTCContract: Contract, renBTCContract: Contract, sBTCContract: Contract; + let wethContract: Contract, snxContract: Contract; + + let task: Task; + + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + const BTC_STABLE_POOL_GAUGE = '0x57d40FF4cF7441A04A05628911F57bb940B6C238'; + const SNX_WEIGHTED_POOL_GAUGE = '0x605eA53472A496c3d483869Fe8F355c12E861e19'; + + const BTC_STABLE_POOL_ID = '0xfeadd389a5c427952d8fdb8057d6c8ba1156cc56000000000000000000000066'; + const BTC_STABLE_POOL_ADDRESS = '0xFeadd389a5c427952D8fdb8057D6C8ba1156cC56'; + const wBTC = '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599'; + const renBTC = '0xeb4c2781e4eba804ce9a9803c67d0893436bb27d'; + const sBTC = '0xfe18be6b3bd88a2d2a7f928d00292e7a9963cfc6'; + const sBTC_IMPLEMENTATION = '0x18FcC34bdEaaF9E3b69D2500343527c0c995b1d6'; + + const SNX_WEIGHTED_POOL_ID = '0x072f14b85add63488ddad88f855fda4a99d6ac9b000200000000000000000027'; + const SNX_WEIGHTED_POOL_ADDRESS = '0x072f14B85ADd63488DDaD88f855Fda4A99d6aC9B'; + const WETH = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'; + const SNX = '0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F'; + const SNX_IMPLEMENTATION = '0x639032d3900875a4cf4960aD6b9ee441657aA93C'; + + before('run task', async () => { + task = new Task('20220513-double-entrypoint-fix-relayer', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + relayer = await task.deployedInstance('DoubleEntrypointFixRelayer'); + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.deployedInstance('Vault'); + balancerHelpers = await vaultTask.deployedInstance('BalancerHelpers'); + protocolFeesCollector = await vaultTask.instanceAt('ProtocolFeesCollector', await vault.getProtocolFeesCollector()); + + // We reuse this task as it contains an ABI for an ERC20 token + const testBALTokenTask = new Task('20220325-test-balancer-token', TaskMode.READ_ONLY, getForkedNetwork(hre)); + wBTCContract = await testBALTokenTask.instanceAt('TestBalancerToken', wBTC); + renBTCContract = await testBALTokenTask.instanceAt('TestBalancerToken', renBTC); + sBTCContract = await testBALTokenTask.instanceAt('TestBalancerToken', sBTC); + wethContract = await testBALTokenTask.instanceAt('TestBalancerToken', WETH); + snxContract = await testBALTokenTask.instanceAt('TestBalancerToken', SNX); + }); + + before('grant permissions', async () => { + govMultisig = await impersonate(GOV_MULTISIG); + + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + + // Gov approval for relayer + const exitPoolRole = await actionId(vault, 'exitPool'); + const withdrawCollectedFeesRole = await actionId(protocolFeesCollector, 'withdrawCollectedFees'); + await authorizer.connect(govMultisig).grantRoles([exitPoolRole, withdrawCollectedFeesRole], relayer.address); + + // User approval for relayer + btcBptHolder = await impersonate(BTC_STABLE_POOL_GAUGE); + await vault.connect(btcBptHolder).setRelayerApproval(btcBptHolder.address, relayer.address, true); + + snxBptHolder = await impersonate(SNX_WEIGHTED_POOL_GAUGE); + await vault.connect(snxBptHolder).setRelayerApproval(snxBptHolder.address, relayer.address, true); + }); + + it('sweeps sBTC', async () => { + const vaultBalanceBefore = await sBTCContract.balanceOf(vault.address); + const protocolFeesCollectorBalanceBefore = await sBTCContract.balanceOf(protocolFeesCollector.address); + + await relayer.sweepDoubleEntrypointToken([sBTC_IMPLEMENTATION, sBTC]); + + const vaultBalanceAfter = await sBTCContract.balanceOf(vault.address); + const protocolFeesCollectorBalanceAfter = await sBTCContract.balanceOf(protocolFeesCollector.address); + + expect(vaultBalanceAfter).to.be.eq(0); + expect(protocolFeesCollectorBalanceAfter.sub(protocolFeesCollectorBalanceBefore)).to.be.eq(vaultBalanceBefore); + }); + + it('exits from the sBTC pool', async () => { + const testBALTokenTask = new Task('20220325-test-balancer-token', TaskMode.READ_ONLY, getForkedNetwork(hre)); + const poolContract = await testBALTokenTask.instanceAt('TestBalancerToken', BTC_STABLE_POOL_ADDRESS); + const EXACT_BPT_IN_FOR_TOKENS_OUT = 1; + + const [, expectedAmountsOut] = await balancerHelpers.callStatic.queryExit( + BTC_STABLE_POOL_ID, + btcBptHolder.address, + btcBptHolder.address, + { + assets: [wBTC, renBTC, sBTC], + minAmountsOut: [0, 0, 0], + // The helper used to encode user data has been removed; this is how it was encoded in the original fork test. + userData: defaultAbiCoder.encode( + ['uint256', 'uint256'], + [EXACT_BPT_IN_FOR_TOKENS_OUT, await poolContract.balanceOf(btcBptHolder.address)] + ), + toInternalBalance: false, + } + ); + + await relayer.connect(btcBptHolder).exitBTCStablePool(); + + const actualAmountsOut = await Promise.all( + [wBTCContract, renBTCContract, sBTCContract].map((token) => token.balanceOf(btcBptHolder.address)) + ); + + expect(await poolContract.balanceOf(btcBptHolder.address)).to.be.eq(0); + expect(expectedAmountsOut).to.be.deep.eq(actualAmountsOut); + + const vaultBalanceAfter = await sBTCContract.balanceOf(vault.address); + expect(vaultBalanceAfter).to.be.eq(0); + }); + + it('sweeps SNX', async () => { + const vaultBalanceBefore = await snxContract.balanceOf(vault.address); + const protocolFeesCollectorBalanceBefore = await snxContract.balanceOf(protocolFeesCollector.address); + + await relayer.sweepDoubleEntrypointToken([SNX_IMPLEMENTATION, SNX]); + + const vaultBalanceAfter = await snxContract.balanceOf(vault.address); + const protocolFeesCollectorBalanceAfter = await snxContract.balanceOf(protocolFeesCollector.address); + + expect(vaultBalanceAfter).to.be.eq(0); + expect(protocolFeesCollectorBalanceAfter.sub(protocolFeesCollectorBalanceBefore)).to.be.eq(vaultBalanceBefore); + }); + + it('exits from the SNX pool', async () => { + const testBALTokenTask = new Task('20220325-test-balancer-token', TaskMode.READ_ONLY, getForkedNetwork(hre)); + const poolContract = await testBALTokenTask.instanceAt('TestBalancerToken', SNX_WEIGHTED_POOL_ADDRESS); + + const [, expectedAmountsOut] = await balancerHelpers.callStatic.queryExit( + SNX_WEIGHTED_POOL_ID, + snxBptHolder.address, + snxBptHolder.address, + { + assets: [SNX, WETH], + minAmountsOut: [0, 0], + userData: WeightedPoolEncoder.exitExactBPTInForTokensOut(await poolContract.balanceOf(snxBptHolder.address)), + toInternalBalance: false, + } + ); + + await relayer.connect(snxBptHolder).exitSNXWeightedPool(); + + const actualAmountsOut = await Promise.all( + [snxContract, wethContract].map((token) => token.balanceOf(snxBptHolder.address)) + ); + + expect(await poolContract.balanceOf(snxBptHolder.address)).to.be.eq(0); + expect(expectedAmountsOut).to.be.deep.eq(actualAmountsOut); + + const vaultBalanceAfter = await snxContract.balanceOf(vault.address); + expect(vaultBalanceAfter).to.be.eq(0); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/artifact/ProtocolFeesWithdrawer.json b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/artifact/ProtocolFeesWithdrawer.json new file mode 100644 index 0000000..e5b99ac --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/artifact/ProtocolFeesWithdrawer.json @@ -0,0 +1,230 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ProtocolFeesWithdrawer", + "sourceName": "contracts/ProtocolFeesWithdrawer.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IERC20[]", + "name": "initialDeniedTokens", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "TokenAllowlisted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "TokenDenylisted", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "allowlistToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "denylistToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getDenylistedToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDenylistedTokensLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeesCollector", + "outputs": [ + { + "internalType": "contract IProtocolFeesCollector", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "isWithdrawableToken", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "isWithdrawableTokens", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "withdrawCollectedFees", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60e06040523480156200001157600080fd5b506040516200104238038062001042833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82518660208202830111640100000000821117156200009357600080fd5b82525081516020918201928201910280838360005b83811015620000c2578181015183820152602001620000a8565b50505050919091016040818152306080526001600160601b0319606089901b1660a05263d2946c2b60e01b8252516001600160a01b038816955063d2946c2b945060048083019450602093509091829003018186803b1580156200012557600080fd5b505afa1580156200013a573d6000803e3d6000fd5b505050506040513d60208110156200015157600080fd5b505160601b6001600160601b03191660c052805160005b818110156200019f57620001968382815181106200018257fe5b6020026020010151620001a960201b60201c565b60010162000168565b50505050620002df565b620001c48160006200025560201b620007b91790919060201c565b62000216576040805162461bcd60e51b815260206004820152601860248201527f546f6b656e20616c72656164792064656e796c69737465640000000000000000604482015290519081900360640190fd5b604080516001600160a01b038316815290517ff1a0f8a2f72d5da4064fe8bb9f78d485b757edfbd004465e56f102f2b8ab6edb9181900360200190a150565b6000620002638383620002be565b620002b457508154600180820184556000848152602080822090930180546001600160a01b0319166001600160a01b03861690811790915585549082528286019093526040902091909155620002b8565b5060005b92915050565b6001600160a01b031660009081526001919091016020526040902054151590565b60805160a05160601c60c05160601c610d2b62000317600039806103f952806106c152508061059752508061052a5250610d2b6000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063a21dfaee11610081578063d2946c2b1161005b578063d2946c2b14610324578063de0b27c91461032c578063fd3a0cdd1461035f576100c9565b8063a21dfaee14610265578063aaabadc5146102e9578063cdf0e934146102f1576100c9565b8063851c1bb3116100b2578063851c1bb3146101db5780638d928af81461022c5780638dd26fc61461025d576100c9565b8063194d810f146100ce5780636daefab614610103575b600080fd5b610101600480360360208110156100e457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661037c565b005b6101016004803603606081101561011957600080fd5b81019060208101813564010000000081111561013457600080fd5b82018360208201111561014657600080fd5b8035906020019184602083028401116401000000008311171561016857600080fd5b91939092909160208101903564010000000081111561018657600080fd5b82018360208201111561019857600080fd5b803590602001918460208302840111640100000000831117156101ba57600080fd5b91935091503573ffffffffffffffffffffffffffffffffffffffff16610390565b61021a600480360360208110156101f157600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016610524565b60408051918252519081900360200190f35b610234610595565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61021a6105b9565b6102d56004803603602081101561027b57600080fd5b81019060208101813564010000000081111561029657600080fd5b8201836020820111156102a857600080fd5b803590602001918460208302840111640100000000831117156102ca57600080fd5b5090925090506105ca565b604080519115158252519081900360200190f35b61023461062c565b6102d56004803603602081101561030757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166106ac565b6102346106bf565b6101016004803603602081101561034257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166106e3565b6102346004803603602081101561037557600080fd5b50356107ad565b610384610841565b61038d81610887565b50565b610398610841565b6103a285856105ca565b6103f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180610ccf6027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636daefab686868686866040518663ffffffff1660e01b81526004018080602001806020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381038352888882818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169091018481038352868152602090810191508790870280828437600081840152601f19601f820116905080830192505050975050505050505050600060405180830381600087803b15801561050557600080fd5b505af1158015610519573d6000803e3d6000fd5b505050505050505050565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006105c56000610949565b905090565b600081815b8181101561061f576106088585838181106105e657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166106ac565b61061757600092505050610626565b6001016105cf565b5060019150505b92915050565b6000610636610595565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561067b57600080fd5b505afa15801561068f573d6000803e3d6000fd5b505050506040513d60208110156106a557600080fd5b5051905090565b60006106b8818361094d565b1592915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6106eb610841565b6106f660008261097b565b61076157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f546f6b656e206973206e6f742064656e796c6973746564000000000000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517fecc8f38812b30ead07c6cdc6aa7b0eb8d42772335216e06122f7e821db6852589181900360200190a150565b60006106268183610b29565b60006107c5838361094d565b61083957508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915585549082528286019093526040902091909155610626565b506000610626565b60006108706000357fffffffff0000000000000000000000000000000000000000000000000000000016610524565b905061038d61087f8233610b4c565b610191610c15565b6108926000826107b9565b6108fd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f546f6b656e20616c72656164792064656e796c69737465640000000000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517ff1a0f8a2f72d5da4064fe8bb9f78d485b757edfbd004465e56f102f2b8ab6edb9181900360200190a150565b5490565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001919091016020526040902054151590565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120548015610b1f5783547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083019101808214610a845760008660000182815481106109e957fe5b600091825260209091200154875473ffffffffffffffffffffffffffffffffffffffff90911691508190889085908110610a1f57fe5b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff94851617905592909116815260018881019092526040902090830190555b8554869080610a8f57fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff8716825260018881019091526040822091909155935061062692505050565b6000915050610626565b8154600090610b3b9083106064610c15565b610b458383610c27565b9392505050565b6000610b5661062c565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b158015610be257600080fd5b505afa158015610bf6573d6000803e3d6000fd5b505050506040513d6020811015610c0c57600080fd5b50519392505050565b81610c2357610c2381610c61565b5050565b6000826000018281548110610c3857fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fdfe417474656d7074696e6720746f2077697468647261772064656e796c697374656420746f6b656ea26469706673582212201a94212c9bfba33337b6a725b53b23d89d6a7f9a7cfb769ff67c9886e699f37064736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063a21dfaee11610081578063d2946c2b1161005b578063d2946c2b14610324578063de0b27c91461032c578063fd3a0cdd1461035f576100c9565b8063a21dfaee14610265578063aaabadc5146102e9578063cdf0e934146102f1576100c9565b8063851c1bb3116100b2578063851c1bb3146101db5780638d928af81461022c5780638dd26fc61461025d576100c9565b8063194d810f146100ce5780636daefab614610103575b600080fd5b610101600480360360208110156100e457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661037c565b005b6101016004803603606081101561011957600080fd5b81019060208101813564010000000081111561013457600080fd5b82018360208201111561014657600080fd5b8035906020019184602083028401116401000000008311171561016857600080fd5b91939092909160208101903564010000000081111561018657600080fd5b82018360208201111561019857600080fd5b803590602001918460208302840111640100000000831117156101ba57600080fd5b91935091503573ffffffffffffffffffffffffffffffffffffffff16610390565b61021a600480360360208110156101f157600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016610524565b60408051918252519081900360200190f35b610234610595565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61021a6105b9565b6102d56004803603602081101561027b57600080fd5b81019060208101813564010000000081111561029657600080fd5b8201836020820111156102a857600080fd5b803590602001918460208302840111640100000000831117156102ca57600080fd5b5090925090506105ca565b604080519115158252519081900360200190f35b61023461062c565b6102d56004803603602081101561030757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166106ac565b6102346106bf565b6101016004803603602081101561034257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166106e3565b6102346004803603602081101561037557600080fd5b50356107ad565b610384610841565b61038d81610887565b50565b610398610841565b6103a285856105ca565b6103f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180610ccf6027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636daefab686868686866040518663ffffffff1660e01b81526004018080602001806020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381038352888882818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169091018481038352868152602090810191508790870280828437600081840152601f19601f820116905080830192505050975050505050505050600060405180830381600087803b15801561050557600080fd5b505af1158015610519573d6000803e3d6000fd5b505050505050505050565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006105c56000610949565b905090565b600081815b8181101561061f576106088585838181106105e657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166106ac565b61061757600092505050610626565b6001016105cf565b5060019150505b92915050565b6000610636610595565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561067b57600080fd5b505afa15801561068f573d6000803e3d6000fd5b505050506040513d60208110156106a557600080fd5b5051905090565b60006106b8818361094d565b1592915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6106eb610841565b6106f660008261097b565b61076157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f546f6b656e206973206e6f742064656e796c6973746564000000000000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517fecc8f38812b30ead07c6cdc6aa7b0eb8d42772335216e06122f7e821db6852589181900360200190a150565b60006106268183610b29565b60006107c5838361094d565b61083957508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915585549082528286019093526040902091909155610626565b506000610626565b60006108706000357fffffffff0000000000000000000000000000000000000000000000000000000016610524565b905061038d61087f8233610b4c565b610191610c15565b6108926000826107b9565b6108fd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f546f6b656e20616c72656164792064656e796c69737465640000000000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517ff1a0f8a2f72d5da4064fe8bb9f78d485b757edfbd004465e56f102f2b8ab6edb9181900360200190a150565b5490565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001919091016020526040902054151590565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120548015610b1f5783547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083019101808214610a845760008660000182815481106109e957fe5b600091825260209091200154875473ffffffffffffffffffffffffffffffffffffffff90911691508190889085908110610a1f57fe5b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff94851617905592909116815260018881019092526040902090830190555b8554869080610a8f57fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff8716825260018881019091526040822091909155935061062692505050565b6000915050610626565b8154600090610b3b9083106064610c15565b610b458383610c27565b9392505050565b6000610b5661062c565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b158015610be257600080fd5b505afa158015610bf6573d6000803e3d6000fd5b505050506040513d6020811015610c0c57600080fd5b50519392505050565b81610c2357610c2381610c61565b5050565b6000826000018281548110610c3857fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fdfe417474656d7074696e6720746f2077697468647261772064656e796c697374656420746f6b656ea26469706673582212201a94212c9bfba33337b6a725b53b23d89d6a7f9a7cfb769ff67c9886e699f37064736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/index.ts b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/index.ts new file mode 100644 index 0000000..c868155 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { ProtocolFeesWithdrawerDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as ProtocolFeesWithdrawerDeployment; + + const args = [input.Vault, input.InitialDeniedTokens]; + await task.deployAndVerify('ProtocolFeesWithdrawer', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/input.ts b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/input.ts new file mode 100644 index 0000000..93dfa9f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/input.ts @@ -0,0 +1,50 @@ +import { Task, TaskMode } from '@src'; + +export type ProtocolFeesWithdrawerDeployment = { + Vault: string; + InitialDeniedTokens: string[]; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, + mainnet: { + InitialDeniedTokens: [ + '0xfe18be6b3bd88a2d2a7f928d00292e7a9963cfc6', // sBTC + '0x18FcC34bdEaaF9E3b69D2500343527c0c995b1d6', // sBTC (Implementation) + '0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F', // SNX + '0x931933807c4c808657b6016f9e539486e7b5d374', // SNX (Implementation) + ], + }, + polygon: { + InitialDeniedTokens: [], + }, + arbitrum: { + InitialDeniedTokens: [], + }, + optimism: { + InitialDeniedTokens: [], + }, + gnosis: { + InitialDeniedTokens: [], + }, + bsc: { + InitialDeniedTokens: [], + }, + avalanche: { + InitialDeniedTokens: [], + }, + zkevm: { + InitialDeniedTokens: [], + }, + base: { + InitialDeniedTokens: [], + }, + goerli: { + InitialDeniedTokens: [], + }, + sepolia: { + InitialDeniedTokens: [], + }, +}; diff --git a/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/arbitrum.json b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/arbitrum.json new file mode 100644 index 0000000..925efc7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeesWithdrawer": "0x70Bbd023481788e443472e123AB963e5EBF58D06" +} diff --git a/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/avalanche.json b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/avalanche.json new file mode 100644 index 0000000..9309ac2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/avalanche.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeesWithdrawer": "0x8F42aDBbA1B16EaAE3BB5754915E0D06059aDd75" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/base.json b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/base.json new file mode 100644 index 0000000..1ad11a7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/base.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeesWithdrawer": "0xAcf05BE5134d64d150d153818F8C67EE36996650" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/bsc.json b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/bsc.json new file mode 100644 index 0000000..a90da24 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/bsc.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeesWithdrawer": "0xD7FAD3bd59D6477cbe1BE7f646F7f1BA25b230f8" +} diff --git a/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/gnosis.json b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/gnosis.json new file mode 100644 index 0000000..64b476d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeesWithdrawer": "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca" +} diff --git a/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/goerli.json b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/goerli.json new file mode 100644 index 0000000..373c082 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/goerli.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeesWithdrawer": "0x85153B639a35d6e6CF8B291Aca237FbE67377154" +} diff --git a/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/mainnet.json b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/mainnet.json new file mode 100644 index 0000000..b221589 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeesWithdrawer": "0x5ef4c5352882b10893b70DbcaA0C000965bd23c5" +} diff --git a/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/mode.json b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/mode.json new file mode 100644 index 0000000..820f10b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/mode.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeesWithdrawer": "0x9Ac3E70dB606659Bf32D4BdFbb687AD193FD1F5B" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/optimism.json b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/optimism.json new file mode 100644 index 0000000..0b43cdf --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/optimism.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeesWithdrawer": "0xC128a9954e6c874eA3d62ce62B468bA073093F25" +} diff --git a/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/polygon.json b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/polygon.json new file mode 100644 index 0000000..73d9cb9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/polygon.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeesWithdrawer": "0xEF44D6786b2b4d544b7850Fe67CE6381626Bf2D6" +} diff --git a/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/sepolia.json b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/sepolia.json new file mode 100644 index 0000000..4c390c1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeesWithdrawer": "0x809B79b53F18E9bc08A961ED4678B901aC93213a" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/zkevm.json b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/zkevm.json new file mode 100644 index 0000000..38ea612 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/output/zkevm.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeesWithdrawer": "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/readme.md b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/readme.md new file mode 100644 index 0000000..ae1dae3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220517-protocol-fee-withdrawer/readme.md @@ -0,0 +1,20 @@ +# 2022-05-17 - Protocol Fee Withdrawer + +Deployment of the Protocol Fee Withdrawer, which is used to prevent any withdrawals of certain tokens from the Protocol Fee Collector. This is useful for certain situations where the Protocol Fee Collector holds tokens which should not be treated as regular protocol fees. + +See [the Double Entrypoint Fix Relayer](../20220513-double-entrypoint-fix-relayer/) for information on an example of a situation where this is necessary. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`ProtocolFeesWithdrawer` artifact](./artifact/ProtocolFeesWithdrawer.json) diff --git a/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/artifact/ChildChainGaugeTokenAdder.json b/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/artifact/ChildChainGaugeTokenAdder.json new file mode 100644 index 0000000..3d7ba36 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/artifact/ChildChainGaugeTokenAdder.json @@ -0,0 +1,108 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ChildChainGaugeTokenAdder", + "sourceName": "contracts/admin/ChildChainGaugeTokenAdder.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IChildChainLiquidityGaugeFactory", + "name": "gaugeFactory", + "type": "address" + }, + { + "internalType": "contract IAuthorizerAdaptor", + "name": "authorizerAdaptor", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "contract IRewardsOnlyGauge", + "name": "gauge", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "rewardToken", + "type": "address" + }, + { + "internalType": "address", + "name": "distributor", + "type": "address" + } + ], + "name": "addTokenToGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizerAdaptor", + "outputs": [ + { + "internalType": "contract IAuthorizerAdaptor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x61010060405234801561001157600080fd5b50604051610e97380380610e97833981016040819052610030916100cd565b806001600160a01b0316638d928af86040518163ffffffff1660e01b815260040160206040518083038186803b15801561006957600080fd5b505afa15801561007d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100a19190610106565b306080526001600160601b0319606091821b811660a05291811b821660c0529190911b1660e052610141565b600080604083850312156100df578182fd5b82516100ea81610129565b60208401519092506100fb81610129565b809150509250929050565b600060208284031215610117578081fd5b815161012281610129565b9392505050565b6001600160a01b038116811461013e57600080fd5b50565b60805160a05160601c60c05160601c60e05160601c610d0a61018d60003980610216528061031a52508061058d52806105fa528061077a52508061012352508060d35250610d0a6000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c8063aaabadc511610050578063aaabadc5146100aa578063d411ee4d146100b2578063e758d36b146100c757610067565b8063851c1bb31461006c5780638d928af814610095575b600080fd5b61007f61007a366004610952565b6100cf565b60405161008c9190610b54565b60405180910390f35b61009d610121565b60405161008c9190610ac5565b61009d610145565b6100c56100c0366004610a4b565b6101d1565b005b61009d61058b565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610104929190610a95565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061014f610121565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561019457600080fd5b505afa1580156101a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101cc9190610916565b905090565b6101d96105af565b6040517fce3cc8bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ce3cc8bd9061024b908690600401610ac5565b60206040518083038186803b15801561026357600080fd5b505afa158015610277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029b9190610932565b6102da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d190610c4f565b60405180910390fd5b6040517f90b2008700000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906390b200879061034f908790600401610ac5565b60206040518083038186803b15801561036757600080fd5b505afa15801561037b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061039f9190610916565b90508373ffffffffffffffffffffffffffffffffffffffff1663bf88a6ff6040518163ffffffff1660e01b815260040160206040518083038186803b1580156103e757600080fd5b505afa1580156103fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041f9190610916565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610483576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d190610c18565b61048e8184846105f8565b6104966108f7565b60005b6008811015610578576040517f54c49fe900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906354c49fe9906104f4908490600401610b54565b60206040518083038186803b15801561050c57600080fd5b505afa158015610520573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105449190610916565b82826008811061055057fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020929092020152600101610499565b50610584858383610760565b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006105de6000357fffffffff00000000000000000000000000000000000000000000000000000000166100cf565b90506105f56105ed82336107db565b610191610878565b50565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634036176a8463661ab0b260e01b858562093a8060405160240161065593929190610be7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b90921682526106e69291600401610ae6565b600060405180830381600087803b15801561070057600080fd5b505af1158015610714573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261075a9190810190610992565b50505050565b60405173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690634036176a9085907f47d2d5d30000000000000000000000000000000000000000000000000000000090610655908790631afe22a6908890602401610b89565b60006107e5610145565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040161082193929190610b5d565b60206040518083038186803b15801561083957600080fd5b505afa15801561084d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108719190610932565b9392505050565b81610886576108868161088a565b5050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6040518061010001604052806008906020820280368337509192915050565b600060208284031215610927578081fd5b815161087181610cb2565b600060208284031215610943578081fd5b81518015158114610871578182fd5b600060208284031215610963578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610871578182fd5b6000602082840312156109a3578081fd5b815167ffffffffffffffff808211156109ba578283fd5b818401915084601f8301126109cd578283fd5b8151818111156109db578384fd5b60405160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401168201018181108482111715610a19578586fd5b604052818152838201602001871015610a30578485fd5b610a41826020830160208701610c86565b9695505050505050565b600080600060608486031215610a5f578182fd5b8335610a6a81610cb2565b92506020840135610a7a81610cb2565b91506040840135610a8a81610cb2565b809150509250925092565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff84168252604060208301528251806040840152610b21816060850160208701610c86565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006101408201905073ffffffffffffffffffffffffffffffffffffffff808616835260208581850152604084018560005b6008811015610bda578151851683529183019190830190600101610bbb565b5050505050949350505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b6020808252601b908201527f4e6f74206f726967696e616c2067617567652073747265616d65720000000000604082015260600190565b6020808252600d908201527f496e76616c696420676175676500000000000000000000000000000000000000604082015260600190565b60005b83811015610ca1578181015183820152602001610c89565b8381111561075a5750506000910152565b73ffffffffffffffffffffffffffffffffffffffff811681146105f557600080fdfea2646970667358221220bed565676fadcba70cee2ec746a35ec25216de48e621946c30699a81e3ef777164736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c8063aaabadc511610050578063aaabadc5146100aa578063d411ee4d146100b2578063e758d36b146100c757610067565b8063851c1bb31461006c5780638d928af814610095575b600080fd5b61007f61007a366004610952565b6100cf565b60405161008c9190610b54565b60405180910390f35b61009d610121565b60405161008c9190610ac5565b61009d610145565b6100c56100c0366004610a4b565b6101d1565b005b61009d61058b565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610104929190610a95565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061014f610121565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561019457600080fd5b505afa1580156101a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101cc9190610916565b905090565b6101d96105af565b6040517fce3cc8bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ce3cc8bd9061024b908690600401610ac5565b60206040518083038186803b15801561026357600080fd5b505afa158015610277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029b9190610932565b6102da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d190610c4f565b60405180910390fd5b6040517f90b2008700000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906390b200879061034f908790600401610ac5565b60206040518083038186803b15801561036757600080fd5b505afa15801561037b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061039f9190610916565b90508373ffffffffffffffffffffffffffffffffffffffff1663bf88a6ff6040518163ffffffff1660e01b815260040160206040518083038186803b1580156103e757600080fd5b505afa1580156103fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041f9190610916565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610483576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d190610c18565b61048e8184846105f8565b6104966108f7565b60005b6008811015610578576040517f54c49fe900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906354c49fe9906104f4908490600401610b54565b60206040518083038186803b15801561050c57600080fd5b505afa158015610520573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105449190610916565b82826008811061055057fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020929092020152600101610499565b50610584858383610760565b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006105de6000357fffffffff00000000000000000000000000000000000000000000000000000000166100cf565b90506105f56105ed82336107db565b610191610878565b50565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634036176a8463661ab0b260e01b858562093a8060405160240161065593929190610be7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b90921682526106e69291600401610ae6565b600060405180830381600087803b15801561070057600080fd5b505af1158015610714573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261075a9190810190610992565b50505050565b60405173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690634036176a9085907f47d2d5d30000000000000000000000000000000000000000000000000000000090610655908790631afe22a6908890602401610b89565b60006107e5610145565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040161082193929190610b5d565b60206040518083038186803b15801561083957600080fd5b505afa15801561084d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108719190610932565b9392505050565b81610886576108868161088a565b5050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6040518061010001604052806008906020820280368337509192915050565b600060208284031215610927578081fd5b815161087181610cb2565b600060208284031215610943578081fd5b81518015158114610871578182fd5b600060208284031215610963578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610871578182fd5b6000602082840312156109a3578081fd5b815167ffffffffffffffff808211156109ba578283fd5b818401915084601f8301126109cd578283fd5b8151818111156109db578384fd5b60405160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401168201018181108482111715610a19578586fd5b604052818152838201602001871015610a30578485fd5b610a41826020830160208701610c86565b9695505050505050565b600080600060608486031215610a5f578182fd5b8335610a6a81610cb2565b92506020840135610a7a81610cb2565b91506040840135610a8a81610cb2565b809150509250925092565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff84168252604060208301528251806040840152610b21816060850160208701610c86565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006101408201905073ffffffffffffffffffffffffffffffffffffffff808616835260208581850152604084018560005b6008811015610bda578151851683529183019190830190600101610bbb565b5050505050949350505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b6020808252601b908201527f4e6f74206f726967696e616c2067617567652073747265616d65720000000000604082015260600190565b6020808252600d908201527f496e76616c696420676175676500000000000000000000000000000000000000604082015260600190565b60005b83811015610ca1578181015183820152602001610c89565b8381111561075a5750506000910152565b73ffffffffffffffffffffffffffffffffffffffff811681146105f557600080fdfea2646970667358221220bed565676fadcba70cee2ec746a35ec25216de48e621946c30699a81e3ef777164736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/index.ts b/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/index.ts new file mode 100644 index 0000000..1be7c6e --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { ChildChainGaugeTokenAdderDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as ChildChainGaugeTokenAdderDeployment; + + const args = [input.ChildChainLiquidityGaugeFactory, input.AuthorizerAdaptor]; + await task.deployAndVerify('ChildChainGaugeTokenAdder', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/input.ts b/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/input.ts new file mode 100644 index 0000000..8108ae5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/input.ts @@ -0,0 +1,14 @@ +import { Task, TaskMode } from '@src'; + +export type ChildChainGaugeTokenAdderDeployment = { + ChildChainLiquidityGaugeFactory: string; + AuthorizerAdaptor: string; +}; + +const ChildChainLiquidityGaugeFactory = new Task('20220413-child-chain-gauge-factory', TaskMode.READ_ONLY); +const AuthorizerAdaptor = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY); + +export default { + ChildChainLiquidityGaugeFactory, + AuthorizerAdaptor, +}; diff --git a/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/output/arbitrum.json b/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/output/arbitrum.json new file mode 100644 index 0000000..933f2c7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "ChildChainGaugeTokenAdder": "0xbfD9769b061E57e478690299011A028194D66e3C" +} diff --git a/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/output/gnosis.json b/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/output/gnosis.json new file mode 100644 index 0000000..ad24697 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "ChildChainGaugeTokenAdder": "0x1802953277FD955f9a254B80Aa0582f193cF1d77" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/output/goerli.json b/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/output/goerli.json new file mode 100644 index 0000000..dbdfc49 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/output/goerli.json @@ -0,0 +1,3 @@ +{ + "ChildChainGaugeTokenAdder": "0x55B18f514D7f0C6C886d0C23Ac72dF5D3B5F8850" +} diff --git a/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/output/optimism.json b/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/output/optimism.json new file mode 100644 index 0000000..ef994a0 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/output/optimism.json @@ -0,0 +1,3 @@ +{ + "ChildChainGaugeTokenAdder": "0x6f5a2eE11E7a772AeB5114A20d0D7c0ff61EB8A0" +} diff --git a/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/output/polygon.json b/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/output/polygon.json new file mode 100644 index 0000000..f22bb80 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/output/polygon.json @@ -0,0 +1,3 @@ +{ + "ChildChainGaugeTokenAdder": "0x1554ee754707D5C93b7934AF404747Aba521Aaf2" +} diff --git a/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/readme.md b/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/readme.md new file mode 100644 index 0000000..3054729 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220527-child-chain-gauge-token-adder/readme.md @@ -0,0 +1,12 @@ +# 2022-05-27 - Child Chain Gauge Token Adder + +Deployment of the Child Chain Gauge Token Adder, which is used to add reward tokens to Rewards Only Gauges, the standard child chain gauge. Unlike the L1 liquidity gauges, we need this in child chains as Rewards Only Gauges are composed of gauge and streamer, and both need to be kept in sync. + +## Useful Files + +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`ChildChainGaugeTokenAdder` artifact](./artifact/ChildChainGaugeTokenAdder.json) diff --git a/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/artifact/PreseededVotingEscrowDelegation.json b/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/artifact/PreseededVotingEscrowDelegation.json new file mode 100644 index 0000000..fd1863c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/artifact/PreseededVotingEscrowDelegation.json @@ -0,0 +1,1079 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PreseededVotingEscrowDelegation", + "sourceName": "@balancer-labs/liquidity-mining/contracts/PreseededVotingEscrowDelegation.vy", + "abi": [ + { + "name": "Approval", + "inputs": [ + { + "name": "_owner", + "type": "address", + "indexed": true + }, + { + "name": "_approved", + "type": "address", + "indexed": true + }, + { + "name": "_token_id", + "type": "uint256", + "indexed": true + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "ApprovalForAll", + "inputs": [ + { + "name": "_owner", + "type": "address", + "indexed": true + }, + { + "name": "_operator", + "type": "address", + "indexed": true + }, + { + "name": "_approved", + "type": "bool", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Transfer", + "inputs": [ + { + "name": "_from", + "type": "address", + "indexed": true + }, + { + "name": "_to", + "type": "address", + "indexed": true + }, + { + "name": "_token_id", + "type": "uint256", + "indexed": true + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "BurnBoost", + "inputs": [ + { + "name": "_delegator", + "type": "address", + "indexed": true + }, + { + "name": "_receiver", + "type": "address", + "indexed": true + }, + { + "name": "_token_id", + "type": "uint256", + "indexed": true + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "DelegateBoost", + "inputs": [ + { + "name": "_delegator", + "type": "address", + "indexed": true + }, + { + "name": "_receiver", + "type": "address", + "indexed": true + }, + { + "name": "_token_id", + "type": "uint256", + "indexed": true + }, + { + "name": "_amount", + "type": "uint256", + "indexed": false + }, + { + "name": "_cancel_time", + "type": "uint256", + "indexed": false + }, + { + "name": "_expire_time", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "ExtendBoost", + "inputs": [ + { + "name": "_delegator", + "type": "address", + "indexed": true + }, + { + "name": "_receiver", + "type": "address", + "indexed": true + }, + { + "name": "_token_id", + "type": "uint256", + "indexed": true + }, + { + "name": "_amount", + "type": "uint256", + "indexed": false + }, + { + "name": "_expire_time", + "type": "uint256", + "indexed": false + }, + { + "name": "_cancel_time", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "TransferBoost", + "inputs": [ + { + "name": "_from", + "type": "address", + "indexed": true + }, + { + "name": "_to", + "type": "address", + "indexed": true + }, + { + "name": "_token_id", + "type": "uint256", + "indexed": true + }, + { + "name": "_amount", + "type": "uint256", + "indexed": false + }, + { + "name": "_expire_time", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "GreyListUpdated", + "inputs": [ + { + "name": "_receiver", + "type": "address", + "indexed": true + }, + { + "name": "_delegator", + "type": "address", + "indexed": true + }, + { + "name": "_status", + "type": "bool", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "stateMutability": "nonpayable", + "type": "constructor", + "inputs": [ + { + "name": "_voting_escrow", + "type": "address" + }, + { + "name": "_name", + "type": "string" + }, + { + "name": "_symbol", + "type": "string" + }, + { + "name": "_base_uri", + "type": "string" + }, + { + "name": "_authorizer_adaptor", + "type": "address" + }, + { + "name": "_preseeded_boost_calls", + "type": "tuple[10]", + "components": [ + { + "name": "delegator", + "type": "address" + }, + { + "name": "receiver", + "type": "address" + }, + { + "name": "percentage", + "type": "int256" + }, + { + "name": "cancel_time", + "type": "uint256" + }, + { + "name": "expire_time", + "type": "uint256" + }, + { + "name": "id", + "type": "uint256" + } + ] + }, + { + "name": "_preseeded_approval_calls", + "type": "tuple[10]", + "components": [ + { + "name": "operator", + "type": "address" + }, + { + "name": "delegator", + "type": "address" + } + ] + } + ], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "admin", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "_approved", + "type": "address" + }, + { + "name": "_token_id", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_token_id", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "safeTransferFrom", + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_token_id", + "type": "uint256" + }, + { + "name": "_data", + "type": "bytes" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "setApprovalForAll", + "inputs": [ + { + "name": "_operator", + "type": "address" + }, + { + "name": "_approved", + "type": "bool" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_token_id", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "tokenURI", + "inputs": [ + { + "name": "_token_id", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "burn", + "inputs": [ + { + "name": "_token_id", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "create_boost", + "inputs": [ + { + "name": "_delegator", + "type": "address" + }, + { + "name": "_receiver", + "type": "address" + }, + { + "name": "_percentage", + "type": "int256" + }, + { + "name": "_cancel_time", + "type": "uint256" + }, + { + "name": "_expire_time", + "type": "uint256" + }, + { + "name": "_id", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "extend_boost", + "inputs": [ + { + "name": "_token_id", + "type": "uint256" + }, + { + "name": "_percentage", + "type": "int256" + }, + { + "name": "_expire_time", + "type": "uint256" + }, + { + "name": "_cancel_time", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "cancel_boost", + "inputs": [ + { + "name": "_token_id", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "batch_cancel_boosts", + "inputs": [ + { + "name": "_token_ids", + "type": "uint256[256]" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "set_delegation_status", + "inputs": [ + { + "name": "_receiver", + "type": "address" + }, + { + "name": "_delegator", + "type": "address" + }, + { + "name": "_status", + "type": "bool" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "batch_set_delegation_status", + "inputs": [ + { + "name": "_receiver", + "type": "address" + }, + { + "name": "_delegators", + "type": "address[256]" + }, + { + "name": "_status", + "type": "uint256[256]" + } + ], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "adjusted_balance_of", + "inputs": [ + { + "name": "_account", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "delegated_boost", + "inputs": [ + { + "name": "_account", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "received_boost", + "inputs": [ + { + "name": "_account", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "token_boost", + "inputs": [ + { + "name": "_token_id", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "int256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "token_expiry", + "inputs": [ + { + "name": "_token_id", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "token_cancel_time", + "inputs": [ + { + "name": "_token_id", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "calc_boost_bias_slope", + "inputs": [ + { + "name": "_delegator", + "type": "address" + }, + { + "name": "_percentage", + "type": "int256" + }, + { + "name": "_expire_time", + "type": "int256" + } + ], + "outputs": [ + { + "name": "", + "type": "int256" + }, + { + "name": "", + "type": "int256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "calc_boost_bias_slope", + "inputs": [ + { + "name": "_delegator", + "type": "address" + }, + { + "name": "_percentage", + "type": "int256" + }, + { + "name": "_expire_time", + "type": "int256" + }, + { + "name": "_extend_token_id", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "int256" + }, + { + "name": "", + "type": "int256" + } + ] + }, + { + "stateMutability": "pure", + "type": "function", + "name": "get_token_id", + "inputs": [ + { + "name": "_delegator", + "type": "address" + }, + { + "name": "_id", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "set_base_uri", + "inputs": [ + { + "name": "_base_uri", + "type": "string" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "preseed", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "getApproved", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "isApprovedForAll", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "ownerOf", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "base_uri", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "tokenByIndex", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "tokenOfOwnerByIndex", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "token_of_delegator_by_index", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "total_minted", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "account_expiries", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "grey_list", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "preseeded", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "preseeded_boost_calls", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "components": [ + { + "name": "delegator", + "type": "address" + }, + { + "name": "receiver", + "type": "address" + }, + { + "name": "percentage", + "type": "int256" + }, + { + "name": "cancel_time", + "type": "uint256" + }, + { + "name": "expire_time", + "type": "uint256" + }, + { + "name": "id", + "type": "uint256" + } + ] + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "preseeded_approval_calls", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "components": [ + { + "name": "operator", + "type": "address" + }, + { + "name": "delegator", + "type": "address" + } + ] + } + ] + } + ], + "bytecode": "0x602061573a6080396080518060a01c6157355760e0526020602061573a0160803960805161573a0160206020826080396080511161573557806020816080396080516020018082610100395050506020604061573a0160803960805161573a0160206020826080396080511161573557806020816080396080516020018082610140395050506020606061573a0160803960805161573a0160806020826080396080511161573557806020816080396080516020018082610180395050506020608061573a016080396080518060a01c615735576102205260a061573a01610240816020816080396080518060a01c6157355782526020602082016080396080518060a01c615735576020830152602060408201608039608051604083015260206060820160803960805160608301526020608082016080396080516080830152602060a0820160803960805160a0830152505061030060c082016020816080396080518060a01c6157355782526020602082016080396080518060a01c615735576020830152602060408201608039608051604083015260206060820160803960805160608301526020608082016080396080516080830152602060a0820160803960805160a083015250506103c061018082016020816080396080518060a01c6157355782526020602082016080396080518060a01c615735576020830152602060408201608039608051604083015260206060820160803960805160608301526020608082016080396080516080830152602060a0820160803960805160a0830152505061048061024082016020816080396080518060a01c6157355782526020602082016080396080518060a01c615735576020830152602060408201608039608051604083015260206060820160803960805160608301526020608082016080396080516080830152602060a0820160803960805160a0830152505061054061030082016020816080396080518060a01c6157355782526020602082016080396080518060a01c615735576020830152602060408201608039608051604083015260206060820160803960805160608301526020608082016080396080516080830152602060a0820160803960805160a083015250506106006103c082016020816080396080518060a01c6157355782526020602082016080396080518060a01c615735576020830152602060408201608039608051604083015260206060820160803960805160608301526020608082016080396080516080830152602060a0820160803960805160a083015250506106c061048082016020816080396080518060a01c6157355782526020602082016080396080518060a01c615735576020830152602060408201608039608051604083015260206060820160803960805160608301526020608082016080396080516080830152602060a0820160803960805160a0830152505061078061054082016020816080396080518060a01c6157355782526020602082016080396080518060a01c615735576020830152602060408201608039608051604083015260206060820160803960805160608301526020608082016080396080516080830152602060a0820160803960805160a0830152505061084061060082016020816080396080518060a01c6157355782526020602082016080396080518060a01c615735576020830152602060408201608039608051604083015260206060820160803960805160608301526020608082016080396080516080830152602060a0820160803960805160a083015250506109006106c082016020816080396080518060a01c6157355782526020602082016080396080518060a01c615735576020830152602060408201608039608051604083015260206060820160803960805160608301526020608082016080396080516080830152602060a0820160803960805160a083015250505061082061573a016109c0816020816080396080518060a01c6157355782526020602082016080396080518060a01c6157355760208301525050610a00604082016020816080396080518060a01c6157355782526020602082016080396080518060a01c6157355760208301525050610a40608082016020816080396080518060a01c6157355782526020602082016080396080518060a01c6157355760208301525050610a8060c082016020816080396080518060a01c6157355782526020602082016080396080518060a01c6157355760208301525050610ac061010082016020816080396080518060a01c6157355782526020602082016080396080518060a01c6157355760208301525050610b0061014082016020816080396080518060a01c6157355782526020602082016080396080518060a01c6157355760208301525050610b4061018082016020816080396080518060a01c6157355782526020602082016080396080518060a01c6157355760208301525050610b806101c082016020816080396080518060a01c6157355782526020602082016080396080518060a01c6157355760208301525050610bc061020082016020816080396080518060a01c6157355782526020602082016080396080518060a01c6157355760208301525050610c0061024082016020816080396080518060a01c6157355782526020602082016080396080518060a01c61573557602083015250505060e051610c405261022051610c6052610100806004602082510160c060006002818352015b8260c05160200211156107f157610810565b60c05160200285015160c05185015581516001018083528114156107df575b505050505050610140806006602082510160c060006002818352015b8260c051602002111561083e5761085d565b60c05160200285015160c051850155815160010180835281141561082c575b505050505050610180806008602082510160c060006005818352015b8260c051602002111561088b576108aa565b60c05160200285015160c0518501558151600101808352811415610879575b5050505050506017610240805182556020810151600183015560408101516002830155606081015160038301556080810151600483015560a081015160058301555050601d610300805182556020810151600183015560408101516002830155606081015160038301556080810151600483015560a08101516005830155505060236103c0805182556020810151600183015560408101516002830155606081015160038301556080810151600483015560a0810151600583015550506029610480805182556020810151600183015560408101516002830155606081015160038301556080810151600483015560a081015160058301555050602f610540805182556020810151600183015560408101516002830155606081015160038301556080810151600483015560a0810151600583015550506035610600805182556020810151600183015560408101516002830155606081015160038301556080810151600483015560a081015160058301555050603b6106c0805182556020810151600183015560408101516002830155606081015160038301556080810151600483015560a0810151600583015550506041610780805182556020810151600183015560408101516002830155606081015160038301556080810151600483015560a0810151600583015550506047610840805182556020810151600183015560408101516002830155606081015160038301556080810151600483015560a081015160058301555050604d610900805182556020810151600183015560408101516002830155606081015160038301556080810151600483015560a08101516005830155505060536109c0805182556020810151600183015550506055610a00805182556020810151600183015550506057610a40805182556020810151600183015550506059610a8080518255602081015160018301555050605b610ac080518255602081015160018301555050605d610b0080518255602081015160018301555050605f610b40805182556020810151600183015550506061610b80805182556020810151600183015550506063610bc0805182556020810151600183015550506065610c008051825560208101516001830155505061570356600436101561000d57612d6d565b60046000601c3760005134614b155763f851a440811861003c5760206020380360803960805160e052602060e0f35b63095ea7b381186100c0576004358060a01c614b155761014052600360243560a0526080526040608020546101605261016051331861007c57600161009b565b60026101605160a05260805260406080203360a0526080526040608020545b15614b15576101605160e0526101405161010052602435610120526100be612d73565b005b6342842e0e81186100ec5760006114e0526114e08051602001806104c0828460045afa90505050610117565b63b88d4fde81186102a357606435600401611000813511614b155780803560200180826104c0375050505b6004358060a01c614b1557610480526024358060a01c614b15576104a0523360e0526044356101005261014b611500612dbd565b6115005115614b155761048051610300526104a0516103205260443561034052610173613dfa565b60006104a0513b11156102a15763150b7a02611520526115408060803382526020820191506104805182526020820191506044358252602082019150808252808301806104c080516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f82010390509050905081015050505060206115206110a461153c60006104a0515af1610227573d600060003e3d6000fd5b601f3d1115614b155761152051611500526004611620527f150b7a0200000000000000000000000000000000000000000000000000000000611640526116206020015160006004602082066115c001602082840111614b15576020806115e08261150060045afa5050818152905090506020015118614b15575b005b63a22cb46581186102ea576004358060a01c614b1557610160526024358060011c614b1557610180523360e052610160516101005261018051610120526102e8614676565b005b6323b872dd8118610353576004358060a01c614b1557610480526024358060a01c614b15576104a0523360e052604435610100526103296104c0612dbd565b6104c05115614b155761048051610300526104a0516103205260443561034052610351613dfa565b005b63c87b56dd8118610456576104a080602080825260006008600181016020836103a00101825460c060006004818352015b8260c0516020021115610396576103b5565b60c05185015460c0516020028501528151600101808352811415610384575b50505050508054820191505060043560e0526103d2610320614407565b610320604e806020846103a00101826020850160045afa505080518201915050806103a0526103a09050818401808280516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050905081019050905090506104a0f35b6342966c68811861055e573360e05260043561010052610477610300612dbd565b6103005115614b1557601160043560a052608052604060802054610300526000610300511461054d576103005160e0526104b2610360613cb1565b6103608051610320526020810151610340525060043560601c8060a01c614b155761036052600360043560a0526080526040608020546103805260043560e052610360516101005261038051610120526103205161014052610340516101605261051a6138c9565b60043561038051610360517f64ddd743466fd725d437a06c1600041c3a8e6566a51cbfb4b73ee501db94657460006103a0a45b6004356102805261055c6135a1565b005b63f18124d781186105f2576004358060a01c614b1557610520526024358060a01c614b1557610540526105205133186105985760016105b7565b60026105205160a05260805260406080203360a0526080526040608020545b15614b1557610520516102c052610540516102e05260443561030052606435610320526084356103405260a435610360526105f06146d2565b005b63d47dd2648118610b765760043560601c8060a01c614b155761030052600360043560a05260805260406080205461032052610300513318610635576001610654565b60026103005160a05260805260406080203360a0526080526040608020545b15614b155760006103205114614b155760006024351315614b155761271060243513614b1557601160043560a052608052604060802080546103405260018101546103605260028101546103805260038101546103a0525060443562093a808082049050905062093a80808202821582848304141715614b1557905090506103c0526103c05160643511614b15574262093a808181830110614b1557808201905090506103c05110614b155763adc635896103e052610300516104005260206103e060246103fc6020604038036080396080515afa610738573d600060003e3d6000fd5b601f3d1115614b15576103e0516103c05111614b15576103405160e052610760610420613cb1565b61042080516103e0526020810151610400525042600160ff1b811015614b1557610420526104005161042051808202600160ff1b8214156000198414151715614b1557821582848305141715614b1557905090506103e0518082018281126000831216838212156000841215161715614b155790509050610440526103a0516103c05110614b155761036051700100000000000000000000000000000000808206905090506064351015610819576103a0514210614b15575b60043560e052610300516101005261032051610120526103e0516101405261040051610160526108476138c9565b600260106103005160a0526080526040608020015461046052610460517001000000000000000000000000000000008082069050905061048052610480516108af577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610480525b61048051421015614b155760106103005160a05260805260406080205460e0526108da6104a0613cb1565b6104a080516103e052602081015161040052506104005161042051808202600160ff1b8214156000198414151715614b1557821582848305141715614b1557905090506103e0518082018281126000831216838212156000841215161715614b1557905090506104a0526024356370a082316104e052610300516105005260206104e060246104fc6020604038036080396080515afa61097f573d600060003e3d6000fd5b601f3d1115614b15576104e0516104a0518082038281136000831216838213156000841215161715614b155790509050808202600160ff1b8214156000198414151715614b1557821582848305141715614b155790509050612710808205905090506104c05260006104c0511315614b1557610440516104c05112614b15576104205160e0526104c051610100526103c051600160ff1b811015614b155761012052610a2c6104e0613d20565b6104e080516103e052602081015161040052506000610400511215614b155760043560e052610300516101005261032051610120526103e051610140526104005161016052606435610180526103c0516101a052610a8861373d565b610480516103c0511015610a9f576103c051610480525b6104605160801c6104e05260146103005160a05260805260406080206103c05160a0526080526040608020805460018181830110614b1557808201905090508155506104e05160018181830110614b15578082019050905060801b610480518181830110614b155780820190509050600260106103005160a0526080526040608020015560043561032051610300517f3a64a6e1360126485cdd1af7816469a376b21ae1de281a20c42c1d06968552866104c05160008112614b1557610500526103c05161052052606435610540526060610500a4005b63a53ae7638118610b9757600435610300523361032052610b95614135565b005b63dcd033458118610bf4576104c06000610100818352015b60206104c05102600401356104a0526104a051610bcb57610bf0565b6104a051610300523361032052610be0614135565b8151600101808352811415610baf575b5050005b630c4051978118610c82576004358060a01c614b1557610160526024358060a01c614b1557610180526044358060011c614b15576101a052610160513318610c3d576001610c5c565b60026101605160a05260805260406080203360a0526080526040608020545b15614b15576101605160e05261018051610100526101a05161012052610c806143ab565b005b6390546fbe8118611d3f576004358060a01c614b1557610160526024358060a01c614b1557610180526044358060a01c614b15576101a0526064358060a01c614b15576101c0526084358060a01c614b15576101e05260a4358060a01c614b15576102005260c4358060a01c614b15576102205260e4358060a01c614b155761024052610104358060a01c614b155761026052610124358060a01c614b155761028052610144358060a01c614b15576102a052610164358060a01c614b15576102c052610184358060a01c614b15576102e0526101a4358060a01c614b1557610300526101c4358060a01c614b1557610320526101e4358060a01c614b155761034052610204358060a01c614b155761036052610224358060a01c614b155761038052610244358060a01c614b15576103a052610264358060a01c614b15576103c052610284358060a01c614b15576103e0526102a4358060a01c614b1557610400526102c4358060a01c614b1557610420526102e4358060a01c614b155761044052610304358060a01c614b155761046052610324358060a01c614b155761048052610344358060a01c614b15576104a052610364358060a01c614b15576104c052610384358060a01c614b15576104e0526103a4358060a01c614b1557610500526103c4358060a01c614b1557610520526103e4358060a01c614b155761054052610404358060a01c614b155761056052610424358060a01c614b155761058052610444358060a01c614b15576105a052610464358060a01c614b15576105c052610484358060a01c614b15576105e0526104a4358060a01c614b1557610600526104c4358060a01c614b1557610620526104e4358060a01c614b155761064052610504358060a01c614b155761066052610524358060a01c614b155761068052610544358060a01c614b15576106a052610564358060a01c614b15576106c052610584358060a01c614b15576106e0526105a4358060a01c614b1557610700526105c4358060a01c614b1557610720526105e4358060a01c614b155761074052610604358060a01c614b155761076052610624358060a01c614b155761078052610644358060a01c614b15576107a052610664358060a01c614b15576107c052610684358060a01c614b15576107e0526106a4358060a01c614b1557610800526106c4358060a01c614b1557610820526106e4358060a01c614b155761084052610704358060a01c614b155761086052610724358060a01c614b155761088052610744358060a01c614b15576108a052610764358060a01c614b15576108c052610784358060a01c614b15576108e0526107a4358060a01c614b1557610900526107c4358060a01c614b1557610920526107e4358060a01c614b155761094052610804358060a01c614b155761096052610824358060a01c614b155761098052610844358060a01c614b15576109a052610864358060a01c614b15576109c052610884358060a01c614b15576109e0526108a4358060a01c614b1557610a00526108c4358060a01c614b1557610a20526108e4358060a01c614b1557610a4052610904358060a01c614b1557610a6052610924358060a01c614b1557610a8052610944358060a01c614b1557610aa052610964358060a01c614b1557610ac052610984358060a01c614b1557610ae0526109a4358060a01c614b1557610b00526109c4358060a01c614b1557610b20526109e4358060a01c614b1557610b4052610a04358060a01c614b1557610b6052610a24358060a01c614b1557610b8052610a44358060a01c614b1557610ba052610a64358060a01c614b1557610bc052610a84358060a01c614b1557610be052610aa4358060a01c614b1557610c0052610ac4358060a01c614b1557610c2052610ae4358060a01c614b1557610c4052610b04358060a01c614b1557610c6052610b24358060a01c614b1557610c8052610b44358060a01c614b1557610ca052610b64358060a01c614b1557610cc052610b84358060a01c614b1557610ce052610ba4358060a01c614b1557610d0052610bc4358060a01c614b1557610d2052610be4358060a01c614b1557610d4052610c04358060a01c614b1557610d6052610c24358060a01c614b1557610d8052610c44358060a01c614b1557610da052610c64358060a01c614b1557610dc052610c84358060a01c614b1557610de052610ca4358060a01c614b1557610e0052610cc4358060a01c614b1557610e2052610ce4358060a01c614b1557610e4052610d04358060a01c614b1557610e6052610d24358060a01c614b1557610e8052610d44358060a01c614b1557610ea052610d64358060a01c614b1557610ec052610d84358060a01c614b1557610ee052610da4358060a01c614b1557610f0052610dc4358060a01c614b1557610f2052610de4358060a01c614b1557610f4052610e04358060a01c614b1557610f6052610e24358060a01c614b1557610f8052610e44358060a01c614b1557610fa052610e64358060a01c614b1557610fc052610e84358060a01c614b1557610fe052610ea4358060a01c614b155761100052610ec4358060a01c614b155761102052610ee4358060a01c614b155761104052610f04358060a01c614b155761106052610f24358060a01c614b155761108052610f44358060a01c614b15576110a052610f64358060a01c614b15576110c052610f84358060a01c614b15576110e052610fa4358060a01c614b155761110052610fc4358060a01c614b155761112052610fe4358060a01c614b155761114052611004358060a01c614b155761116052611024358060a01c614b155761118052611044358060a01c614b15576111a052611064358060a01c614b15576111c052611084358060a01c614b15576111e0526110a4358060a01c614b1557611200526110c4358060a01c614b1557611220526110e4358060a01c614b155761124052611104358060a01c614b155761126052611124358060a01c614b155761128052611144358060a01c614b15576112a052611164358060a01c614b15576112c052611184358060a01c614b15576112e0526111a4358060a01c614b1557611300526111c4358060a01c614b1557611320526111e4358060a01c614b155761134052611204358060a01c614b155761136052611224358060a01c614b155761138052611244358060a01c614b15576113a052611264358060a01c614b15576113c052611284358060a01c614b15576113e0526112a4358060a01c614b1557611400526112c4358060a01c614b1557611420526112e4358060a01c614b155761144052611304358060a01c614b155761146052611324358060a01c614b155761148052611344358060a01c614b15576114a052611364358060a01c614b15576114c052611384358060a01c614b15576114e0526113a4358060a01c614b1557611500526113c4358060a01c614b1557611520526113e4358060a01c614b155761154052611404358060a01c614b155761156052611424358060a01c614b155761158052611444358060a01c614b15576115a052611464358060a01c614b15576115c052611484358060a01c614b15576115e0526114a4358060a01c614b1557611600526114c4358060a01c614b1557611620526114e4358060a01c614b155761164052611504358060a01c614b155761166052611524358060a01c614b155761168052611544358060a01c614b15576116a052611564358060a01c614b15576116c052611584358060a01c614b15576116e0526115a4358060a01c614b1557611700526115c4358060a01c614b1557611720526115e4358060a01c614b155761174052611604358060a01c614b155761176052611624358060a01c614b155761178052611644358060a01c614b15576117a052611664358060a01c614b15576117c052611684358060a01c614b15576117e0526116a4358060a01c614b1557611800526116c4358060a01c614b1557611820526116e4358060a01c614b155761184052611704358060a01c614b155761186052611724358060a01c614b155761188052611744358060a01c614b15576118a052611764358060a01c614b15576118c052611784358060a01c614b15576118e0526117a4358060a01c614b1557611900526117c4358060a01c614b1557611920526117e4358060a01c614b155761194052611804358060a01c614b155761196052611824358060a01c614b155761198052611844358060a01c614b15576119a052611864358060a01c614b15576119c052611884358060a01c614b15576119e0526118a4358060a01c614b1557611a00526118c4358060a01c614b1557611a20526118e4358060a01c614b1557611a4052611904358060a01c614b1557611a6052611924358060a01c614b1557611a8052611944358060a01c614b1557611aa052611964358060a01c614b1557611ac052611984358060a01c614b1557611ae0526119a4358060a01c614b1557611b00526119c4358060a01c614b1557611b20526119e4358060a01c614b1557611b4052611a04358060a01c614b1557611b6052611a24358060a01c614b1557611b8052611a44358060a01c614b1557611ba052611a64358060a01c614b1557611bc052611a84358060a01c614b1557611be052611aa4358060a01c614b1557611c0052611ac4358060a01c614b1557611c2052611ae4358060a01c614b1557611c4052611b04358060a01c614b1557611c6052611b24358060a01c614b1557611c8052611b44358060a01c614b1557611ca052611b64358060a01c614b1557611cc052611b84358060a01c614b1557611ce052611ba4358060a01c614b1557611d0052611bc4358060a01c614b1557611d2052611be4358060a01c614b1557611d4052611c04358060a01c614b1557611d6052611c24358060a01c614b1557611d8052611c44358060a01c614b1557611da052611c64358060a01c614b1557611dc052611c84358060a01c614b1557611de052611ca4358060a01c614b1557611e0052611cc4358060a01c614b1557611e2052611ce4358060a01c614b1557611e4052611d04358060a01c614b1557611e6052611d24358060a01c614b1557611e8052611d44358060a01c614b1557611ea052611d64358060a01c614b1557611ec052611d84358060a01c614b1557611ee052611da4358060a01c614b1557611f0052611dc4358060a01c614b1557611f2052611de4358060a01c614b1557611f4052611e04358060a01c614b1557611f6052611e24358060a01c614b1557611f8052611e44358060a01c614b1557611fa052611e64358060a01c614b1557611fc052611e84358060a01c614b1557611fe052611ea4358060a01c614b155761200052611ec4358060a01c614b155761202052611ee4358060a01c614b155761204052611f04358060a01c614b155761206052611f24358060a01c614b155761208052611f44358060a01c614b15576120a052611f64358060a01c614b15576120c052611f84358060a01c614b15576120e052611fa4358060a01c614b155761210052611fc4358060a01c614b155761212052611fe4358060a01c614b155761214052612004358060a01c614b155761216052610160513318611ca6576001611cc5565b60026101605160a05260805260406080203360a0526080526040608020545b15614b15576121806000610100818352015b60016020612180510261202401351115611cf057611d3b565b6101605160e05261018061218051610100811015614b1557602002015161010052602061218051026120240135151561012052611d2b6143ab565b8151600101808352811415611cd7575b5050005b63bbf7408a8118611ff5576004358060a01c614b155761010052600260106101005160a0526080526040608020015470010000000000000000000000000000000080820690509050610120526000610120511415611d9e576000611da5565b4261012051105b15611dba576000610140526020610140611ff3565b6370a082316101605261010051610180526020610160602461017c6020604038036080396080515afa611df2573d600060003e3d6000fd5b601f3d1115614b1557610160516101405260106101005160a052608052604060802080546101605260018101546101805260028101546101a0525042600160ff1b811015614b15576101c05260006101605114611f08576101605160e052611e5b610220613cb1565b61022080516101e052602081015161020052506101408051610200516101c051808202600160ff1b8214156000198414151715614b1557821582848305141715614b1557905090506101e0518082018281126000831216838212156000841215161715614b15579050905060008112611ed45780611ee3565b806000038114614b1557806000035b90508082038281136000831216838213156000841215161715614b1557905090508152505b60006101805114611fc8576101805160e052611f25610220613cb1565b61022080516101e052602081015161020052506101408051610200516101c051808202600160ff1b8214156000198414151715614b1557821582848305141715614b1557905090506101e0518082018281126000831216838212156000841215161715614b1557905090506000808212611f9f5781611fa1565b805b905090508082018281126000831216838212156000841215161715614b1557905090508152505b610140516000808212611fdb5781611fdd565b805b9050905060008112614b15576101e05260206101e05bf35b63c06a5b5581186120d8576004358060a01c614b15576101005260106101005160a05260805260406080205460e05261202f610160613cb1565b6101608051610120526020810151610140525042600160ff1b811015614b1557610160526101405161016051808202600160ff1b8214156000198414151715614b1557821582848305141715614b155790509050610120518082018281126000831216838212156000841215161715614b155790509050600081126120b457806120c3565b806000038114614b1557806000035b905060008112614b1557610180526020610180f35b63a98b81e081186121b4576004358060a01c614b155761010052600160106101005160a0526080526040608020015460e052612115610160613cb1565b6101608051610120526020810151610140525042600160ff1b811015614b1557610160526101405161016051808202600160ff1b8214156000198414151715614b1557821582848305141715614b155790509050610120518082018281126000831216838212156000841215161715614b155790509050600080821261219b578161219d565b805b9050905060008112614b1557610180526020610180f35b63f01e4f0b811861226057601160043560a05260805260406080205460e0526121de610140613cb1565b6101408051610100526020810151610120525042600160ff1b811015614b1557610140526101205161014051808202600160ff1b8214156000198414151715614b1557821582848305141715614b155790509050610100518082018281126000831216838212156000841215161715614b155790509050610160526020610160f35b636d1ac9b58118612288576003601160043560a0526080526040608020015460e052602060e0f35b63f2f60c9581186122c9576001601160043560a052608052604060802001547001000000000000000000000000000000008082069050905060e052602060e0f35b63058351fb81186122df576000610120526122f2565b63f2f6418f811861263e57606435610120525b6004358060a01c614b15576101005242600160ff1b811015614b15576101405260006024351315614b155761271060243513614b15576101405162093a808181830112614b1557808201905090506044351315614b155763adc6358961018052610100516101a0526020610180602461019c6020604038036080396080515afa612381573d600060003e3d6000fd5b601f3d1115614b155761018051600160ff1b811015614b1557610160526101605160443513614b155760106101005160a0526080526040608020546101805260006101205114156123d35760006123e8565b610100516101205160601c8060a01c614b1557145b1561241657610180805160116101205160a052608052604060802054808210614b1557808203905090508152505b6101805160e0526124286101e0613cb1565b6101e080516101a05260208101516101c052506101c05161014051808202600160ff1b8214156000198414151715614b1557821582848305141715614b1557905090506101a0518082018281126000831216838212156000841215161715614b1557905090506101e05260006101e05112614b15576024356370a082316102205261010051610240526020610220602461023c6020604038036080396080515afa6124d8573d600060003e3d6000fd5b601f3d1115614b1557610220516101e0518082038281136000831216838213156000841215161715614b155790509050808202600160ff1b8214156000198414151715614b1557821582848305141715614b15579050905061271080820590509050610200526000610200511315614b1557610200517f8000000000000000000000000000000000000000000000000000000000000000811315614b1557600003604435610140518082038281136000831216838213156000841215161715614b155790509050600160ff1b8214156000198214151715614b1557808015614b1557820590509050610220526000610220511215614b1557610200516102205161014051808202600160ff1b8214156000198414151715614b1557821582848305141715614b1557905090508082038281136000831216838213156000841215161715614b15579050905061024052610240516102605261022051610280526040610260f35b6302a968258118612692576004358060a01c614b155760e0526c010000000000000000000000006024351015614b155760e05160601b6024358181830110614b155780820190509050610100526020610100f35b63af1c5211811861271a576004356004016080813511614b1557808035602001808260e0375050506020602038036080396080513318614b155760e0806008602082510160c060006005818352015b8260c05160200211156126f357612712565b60c05160200285015160c05185015581516001018083528114156126e1575b505050505050005b63e46f43e2811861284257601654614b155760016016556105206000600a818352015b600661052051600a811015614b15570260170180546105405260018101546105605260028101546105805260038101546105a05260048101546105c05260058101546105e05250600061054051146127c757610540516102c052610560516102e05261058051610300526105a051610320526105c051610340526105e051610360526127c76146d2565b815160010180835281141561273d5750506105206000600a818352015b600261052051600a811015614b155702605301805461054052600181015461056052506000610560511461282f576105605160e052610540516101005260016101205261282f614676565b81516001018083528114156127e4575050005b6370a082318118612877576004358060a01c614b155760e052600060e05160a052608052604060802054610100526020610100f35b63081812fc811861289c57600160043560a05260805260406080205460e052602060e0f35b63e985e9c581186128ef576004358060a01c614b155760e0526024358060a01c614b155761010052600260e05160a05260805260406080206101005160a052608052604060802054610120526020610120f35b636352211e811861291457600360043560a05260805260406080205460e052602060e0f35b6306fdde0381186129b75760e08060208082528083018060048082602082540160c060006002818352015b8260c051602002111561295157612970565b60c05185015460c051602002850152815160010180835281141561293f575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810190509050905060e0f35b6395d89b418118612a5a5760e08060208082528083018060068082602082540160c060006002818352015b8260c05160200211156129f457612a13565b60c05185015460c05160200285015281516001018083528114156129e2575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810190509050905060e0f35b63786f29108118612afd5760e08060208082528083018060088082602082540160c060006005818352015b8260c0516020021115612a9757612ab6565b60c05185015460c0516020028501528151600101808352811415612a85575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810190509050905060e0f35b6318160ddd8118612b1457600d5460e052602060e0f35b634f6ccce78118612b3957600e60043560a05260805260406080205460e052602060e0f35b632f745c598118612b9d576004358060a01c614b155760e05260016024357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015614b155702600f60e05160a05260805260406080200154610100526020610100f35b6332accbe68118612c01576004358060a01c614b155760e05260016024357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015614b155702601260e05160a05260805260406080200154610100526020610100f35b63e47b270b8118612c36576004358060a01c614b155760e052601360e05160a052608052604060802054610100526020610100f35b63734e06948118612c79576004358060a01c614b155760e052601460e05160a052608052604060802060243560a052608052604060802054610100526020610100f35b63d91981888118612ccc576004358060a01c614b155760e0526024358060a01c614b155761010052601560e05160a05260805260406080206101005160a052608052604060802054610120526020610120f35b638bb1c7bc8118612ce35760165460e052602060e0f35b63717525438118612d39576006600435600a811015614b155702601701805460e0526001810154610100526002810154610120526003810154610140526004810154610160526005810154610180525060c060e0f35b63fe1d714f8118612d6b576002600435600a811015614b155702605301805460e05260018101546101005250604060e0f35b505b60006000fd5b6101005160016101205160a052608052604060802055610120516101005160e0517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256000610140a4565b60036101005160a052608052604060802054610120526101205160e05118612de6576001612e28565b60016101005160a05260805260406080205460e05118612e07576001612e28565b60026101205160a052608052604060802060e05160a0526080526040608020545b815250565b6101205160601c8060a01c614b155761014052600260116101205160a05260805260406080200154610160526101605170010000000000000000000000000000000080820690509050610180526101605160801c6101a052600160116101205160a0526080526040608020015460801c6101c05260e0511561344d57610100511561309557600060e05160a0526080526040608020546101e0526101e0516101805114612fc15760016101e0517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015614b155702600f60e05160a0526080526040608020015461020052600260116102005160a0526080526040608020015461022052610220517001000000000000000000000000000000008082049050905060801b610180518181830110614b155780820190509050600260116102005160a05260805260406080200155610200516001610180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015614b155702600f60e05160a052608052604060802001555b600060016101e0517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015614b155702600f60e05160a0526080526040608020015560006101005160a05260805260406080205461018052610120516001610180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015614b155702600f6101005160a052608052604060802001556101a05160801b610180518181830110614b155780820190509050600260116101205160a0526080526040608020015561359f565b600d546101e052600060e05160a0526080526040608020546102005260136101405160a0526080526040608020546001808210614b155780820390509050610220526101e0516101a0511461317357600e6101e05160a05260805260406080205461024052600260116102405160a05260805260406080200154610260526101a05160801b61026051700100000000000000000000000000000000808206905090508181830110614b155780820190509050600260116102405160a0526080526040608020015561024051600e6101a05160a0526080526040608020555b6000600e6101e05160a052608052604060802055610200516101805114613281576001610200517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015614b155702600f60e05160a0526080526040608020015461024052600260116102405160a0526080526040608020015461026052610260517001000000000000000000000000000000008082049050905060801b610180518181830110614b155780820190509050600260116102405160a05260805260406080200155610240516001610180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015614b155702600f60e05160a052608052604060802001555b60006001610200517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015614b155702600f60e05160a052608052604060802001556000600260116101205160a05260805260406080200155610220516101c051146133d7576001610220517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015614b15570260126101405160a0526080526040608020015461024052600160116102405160a05260805260406080200154610260526101c05160801b61026051700100000000000000000000000000000000808206905090508181830110614b155780820190509050600160116102405160a052608052604060802001556102405160016101c0517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015614b15570260126101405160a052608052604060802001555b60006001610220517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015614b15570260126101405160a052608052604060802001556000600160116101205160a052608052604060802001556102205160136101405160a05260805260406080205561359f565b60006101005160a05260805260406080205461018052600d546101a0526101a05160801b610180518181830110614b1557808201905090506101605260136101405160a0526080526040608020546101c05261012051600e6101a05160a052608052604060802055610120516001610180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015614b155702600f6101005160a0526080526040608020015561016051600260116101205160a052608052604060802001556101c05160801b600160116101205160a052608052604060802001556101205160016101c0517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015614b15570260126101405160a052608052604060802001556101c05160018181830110614b15578082019050905060136101405160a0526080526040608020555b565b60036102805160a0526080526040608020546102a0526102a05160e05260006101005261028051610120526135d4612d73565b60006102a05160a052608052604060802080546001808210614b155780820390509050815550600060036102805160a052608052604060802055600d80546001808210614b1557808203905090508155506102a05160e0526000610100526102805161012052613642612e2d565b6102805160006102a0517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60006102c0a4565b60006102805114614b155760036102a05160a052608052604060802054614b1557600060e05261028051610100526102a051610120526136b3612e2d565b60006102805160a0526080526040608020805460018181830110614b1557808201905090508155506102805160036102a05160a052608052604060802055600d805460018181830110614b1557808201905090508155506102a0516102805160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60006102c0a4565b60156101205160a0526080526040608020600060a0526080526040608020546101c05260156101205160a05260805260406080206101005160a0526080526040608020546101e0526101e0516101c05118614b15576101405160008112614b155760801b61016051600081126137b357806137c2565b806000038114614b1557806000035b905060008112614b15578181830110614b1557808201905090506102005260106101005160a05260805260406080208054610200518181830110614b155780820190509050815550600160106101205160a0526080526040608020018054610200518181830110614b155780820190509050815550601160e05160a052608052604060802080546102205260018101546102405260028101546102605260038101546102805250610200516102205261024051610180518181830110614b155780820190509050610240526101a05161028052601160e05160a052608052604060802061022051815561024051600182015561026051600282015561028051600382015550565b601160e05160a052608052604060802080546101805260018101546101a05260028101546101c05260038101546101e052506101e051610200526102005161391057613c08565b60106101005160a0526080526040608020805461018051808210614b155780820390509050815550600160106101205160a052608052604060802001805461018051808210614b1557808203905090508155506000610180526101a0517001000000000000000000000000000000008082049050905060801b6101a05260006101e052601160e05160a05260805260406080206101805181556101a05160018201556101c05160028201556101e051600382015550600260106101005160a05260805260406080200154610220526102205170010000000000000000000000000000000080820690509050610240526102205160801c6001808210614b1557808203905090506102605260146101005160a05260805260406080206102005160a0526080526040608020546001808210614b155780820390509050610280526000610260511415613a62576000613a7c565b610240516102005118613a79576102805115613a7c565b60005b613a935761026051613bb257600061024052613bb2565b6102a06000610201818352015b6102006102a05118613b2357601a6102c0527f4661696c656420746f2066696e64206e657874206578706972790000000000006102e0526102c0506102c051806102e001818260206001820306601f82010390500336823750506308c379a06102805260206102a0526102c05160206001820306601f820103905060440161029cfd5b6102005162093a806102a05160018181830110614b155780820190509050808202821582848304141715614b1557905090508181830110614b1557808201905090506102c052600060146101005160a05260805260406080206102c05160a0526080526040608020541115613b9f576102c05161024052613baf565b8151600101808352811415613aa0575b50505b6102605160801b610240518181830110614b155780820190509050600260106101005160a052608052604060802001556102805160146101005160a05260805260406080206102005160a0526080526040608020555b565b6101205160008112614b155760801b6101405160008112613c2b5780613c3a565b806000038114614b1557806000035b905060008112614b15578181830110614b155780820190509050610160526001601060e05160a052608052604060802001805461016051808210614b155780820390509050815550600160106101005160a0526080526040608020018054610160518181830110614b155780820190509050815550565b60e05160801c600160ff1b811015614b1557815260e05170010000000000000000000000000000000080820690509050600160ff1b811015614b15577f8000000000000000000000000000000000000000000000000000000000000000811315614b1557600003602082015250565b610100517f8000000000000000000000000000000000000000000000000000000000000000811315614b15576000036101205160e0518082038281136000831216838213156000841215161715614b155790509050600160ff1b8214156000198214151715614b1557808015614b155782059050905061014052610100516101405160e051808202600160ff1b8214156000198414151715614b1557821582848305141715614b1557905090508082038281136000831216838213156000841215161715614b155790509050815261014051602082015250565b6103005160036103405160a05260805260406080205418614b155760006103205114614b15576103405160601c8060a01c614b15576103605260156103205160a0526080526040608020600060a0526080526040608020546103805260156103205160a05260805260406080206103605160a0526080526040608020546103a0526103a0516103805118614b15576103005160e0526000610100526103405161012052613ea5612d73565b60006103005160a052608052604060802080546001808210614b1557808203905090508155506103005160e05261032051610100526103405161012052613eea612e2d565b60006103205160a0526080526040608020805460018181830110614b1557808201905090508155506103205160036103405160a05260805260406080205560116103405160a05260805260406080205460e052613f48610400613cb1565b61040080516103c05260208101516103e052506103e05142600160ff1b811015614b1557808202600160ff1b8214156000198414151715614b1557821582848305141715614b1557905090506103c0518082018281126000831216838212156000841215161715614b155790509050610400526000610400511361402d576103405160e052610360516101005261030051610120526103c051610140526103e05161016052613ff56138c9565b6103405161030051610360517f64ddd743466fd725d437a06c1600041c3a8e6566a51cbfb4b73ee501db9465746000610420a4614100565b6103005160e05261032051610100526103c051610120526103e05161014052614054613c0a565b6103c0517f8000000000000000000000000000000000000000000000000000000000000000811315614b15576000036103e051600160ff1b8214156000198214151715614b1557808015614b155782059050905060008112614b1557610420526103405161032051610300517fd28879082858412c80e7b7b81ccad936afca475871f7ba9d041dec51298e94166104005160008112614b15576104405261042051610460526040610440a45b6103405161032051610300517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000610420a4565b60036103005160a0526080526040608020546103405260006103405114614b15576103005160601c8060a01c614b15576103605260116103005160a052608052604060802080546103805260018101546103a05260028101546103c05260038101546103e052506103805160e0526141ae610440613cb1565b610440805161040052602081015161042052506104205142600160ff1b811015614b1557808202600160ff1b8214156000198414151715614b1557821582848305141715614b155790509050610400518082018281126000831216838212156000841215161715614b1557905090506104405261034051610320511861423557600161426a565b60026103405160a05260805260406080206103205160a05260805260406080205461426757600061044051131561426a565b60015b614347576103605161032051186142825760016142a4565b60026103605160a05260805260406080206103205160a0526080526040608020545b61432357600c610460527f4e6f7420616c6c6f7765642100000000000000000000000000000000000000006104805261046050610460518061048001818260206001820306601f82010390500336823750506308c379a0610420526020610440526104605160206001820306601f820103905060440161043cfd614347565b426103a0517001000000000000000000000000000000008082069050905011614b15575b6103005160e05261036051610100526103405161012052610400516101405261042051610160526143766138c9565b6103005161034051610360517f64ddd743466fd725d437a06c1600041c3a8e6566a51cbfb4b73ee501db9465746000610460a4565b61012051601560e05160a05260805260406080206101005160a0526080526040608020556101005160e0517f80dbbd5de59fe1d8e1586e8b741b335479764458933d96f4272b3003653751a461012051610140526020610140a3565b60e051614454576001610100527f30000000000000000000000000000000000000000000000000000000000000006101205261010080516020018083828460045afa905090505050614674565b600061018052610180805160200180610100828460045afa90505050604e610180526101a06000604e818352015b604e61018051186144b65760e051604e6101a0511015614b15576101a051600a0a808015614b1557820490509050156144b9565b60005b156144c7576101a051610180525b60e051604e604d6101a051808210614b1557808203905090501015614b1557604d6101a051808210614b155780820390509050600a0a808015614b1557820490509050600a8082069050905060308181830110614b1557808201905090506101c052601f60016020820661022001602082840111614b1557602080610240826101c060045afa5050818152905090508051602001806101e0828460045afa905050506000610100604e806020846102200101826020850160045afa5050805182019150506101e06001806020846102200101826020850160045afa50508051820191505080610220526102205050604e6102c06102205161024060045afa6145d4573d600060003e3d6000fd5b6102a0604e3d8082116145e757816145e9565b805b905090508152805160200180610100828460045afa905050508151600101808352811415614482575050604e61018051808210614b15578082039050905061018051602082066101a0016101005182840111614b1557604e806101c0826020602088068803016101000160045afa50508181529050905080516020018083828460045afa9050905050505b565b61012051600260e05160a05260805260406080206101005160a0526080526040608020556101005160e0517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3161012051610140526020610140a3565b6103405162093a808082049050905062093a80808202821582848304141715614b15579050905061038052600260106102c05160a052608052604060802001546103a0526103a051700100000000000000000000000000000000808206905090506103c0526103c051614765577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6103c0525b6103c051421015614b15576000610300511315614b15576127106103005113614b1557610380516103205111614b15574262093a808181830110614b1557808201905090506103805110614b155763adc635896103e0526102c0516104005260206103e060246103fc6020604038036080396080515afa6147eb573d600060003e3d6000fd5b601f3d1115614b15576103e0516103805111614b15576c01000000000000000000000000610360511015614b15576102c05160601b610360518181830110614b1557808201905090506103e0526102e051610280526103e0516102a052614850613675565b60106102c05160a05260805260406080205460e052614870610440613cb1565b6104408051610400526020810151610420525042600160ff1b811015614b1557610440526104205161044051808202600160ff1b8214156000198414151715614b1557821582848305141715614b155790509050610400518082018281126000831216838212156000841215161715614b15579050905061046052610300516370a082316104a0526102c0516104c05260206104a060246104bc6020604038036080396080515afa614927573d600060003e3d6000fd5b601f3d1115614b15576104a051610460518082038281136000831216838213156000841215161715614b155790509050808202600160ff1b8214156000198414151715614b1557821582848305141715614b15579050905061271080820590509050610480526000610480511315614b15576104405160e052610480516101005261038051600160ff1b811015614b1557610120526149c76104a0613d20565b6104a0805161040052602081015161042052506000610420511215614b15576103e05160e0526102c051610100526102e05161012052610400516101405261042051610160526103205161018052610380516101a052614a2561373d565b6103c051610380511015614a3c57610380516103c0525b6103a05160801c6104a05260146102c05160a05260805260406080206103805160a0526080526040608020805460018181830110614b1557808201905090508155506104a05160018181830110614b15578082019050905060801b6103c0518181830110614b155780820190509050600260106102c05160a052608052604060802001556103e0516102e0516102c0517f94be29eae3a624a5241431d7a0daf467ac52ecf3071f7a028d5b2adc802b213d6104805160008112614b15576104c052610320516104e052610340516105005260606104c0a4565b600080fd5b610be961570303610be9610c8039610be961570303610c405181610c800152610c605181610ca0015280604001610c80f35b600080fd", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/index.ts b/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/index.ts new file mode 100644 index 0000000..13832f5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/index.ts @@ -0,0 +1,34 @@ +import { Task, TaskRunOptions } from '@src'; +import { PreseededVotingEscrowDelegationDeployment } from './input'; + +const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as PreseededVotingEscrowDelegationDeployment; + + const args = [ + input.VotingEscrow, + 'VotingEscrow Delegation', + 'veBoost', + '', + input.AuthorizerAdaptor, + input.PreseededBoostCalls.concat( + new Array<(typeof input.PreseededBoostCalls)[number]>(10 - input.PreseededBoostCalls.length).fill({ + delegator: ZERO_ADDRESS, + receiver: ZERO_ADDRESS, + percentage: 0, + cancel_time: 0, + expire_time: 0, + id: 0, + }) + ), + input.PreseededApprovalCalls.concat( + new Array<(typeof input.PreseededApprovalCalls)[number]>(10 - input.PreseededApprovalCalls.length).fill({ + operator: ZERO_ADDRESS, + delegator: ZERO_ADDRESS, + }) + ), + ]; + + await task.deploy('PreseededVotingEscrowDelegation', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/input.ts b/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/input.ts new file mode 100644 index 0000000..1bb3302 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/input.ts @@ -0,0 +1,87 @@ +import { Task, TaskMode } from '@src'; + +type CreateBoostCall = { + delegator: string; + receiver: string; + percentage: number; + cancel_time: number; + expire_time: number; + id: number; +}; + +type SetApprovalForAllCall = { + operator: string; + delegator: string; +}; + +export type PreseededVotingEscrowDelegationDeployment = { + VotingEscrow: string; + AuthorizerAdaptor: string; + PreseededBoostCalls: CreateBoostCall[]; + PreseededApprovalCalls: SetApprovalForAllCall[]; +}; + +const VotingEscrow = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); +const AuthorizerAdaptor = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY); + +export default { + VotingEscrow, + AuthorizerAdaptor, + mainnet: { + PreseededBoostCalls: [ + { + // tx: 0x511697e1ab960ffb225254f12d2992287a3784ade116f60ca171d842e074c2d9 + delegator: '0x7f01D9b227593E033bf8d6FC86e634d27aa85568', + receiver: '0x3A11F4c84688a1264690d696D8D807a25Ee02dd2', + percentage: 10000, + cancel_time: 0, + expire_time: 1680739200, + id: 0, + }, + { + // tx: 0x278cd32c77aa9ff54cf1adff5e977b944a1d577bbd7513e81bd78b95dde3f59a + delegator: '0xc2593E6A71130e7525Ec3e64ba7795827086dF0a', + receiver: '0x8e430636c5Dc436Cc5A91A0CFF6eD2fA782987Bb', + percentage: 10000, + cancel_time: 0, + expire_time: 1680739200, + id: 0, + }, + { + // tx: 0xb1647dfc30b6d3b102802412124a72389eed5e9e9c2f848830ed646d79f25d5a + delegator: '0xeF9A40F0ce782108233b6A5d8fef08C89B01A7BD', + receiver: '0x0bf1D0dd1d1E2993F36aB6DD6dE5302E2f369871', + percentage: 10000, + cancel_time: 0, + expire_time: 1678616754, + id: 0, + }, + // The boost from tx 0x19f0b43e423d61977c1acf2f9b48969080cf47319ff568744c6916f655f109d4 was cancelled in tx + // 0xe3219f55fd8d7a08e08f804f8b32c821f7fd9d3d377abfe4594e83f6e2ae34b3, so we skip it. + { + // tx: 0x90dfc0b1c9a0da622dda509ce5ac9e1bc07f4ac24b246fddb0a60a593edf94cb + delegator: '0x0035Fc5208eF989c28d47e552E92b0C507D2B318', + receiver: '0x3217b819EA2d25f1982BaE5dD9C8Fe4C6D546bfC', + percentage: 10000, + cancel_time: 0, + expire_time: 1684368000, + id: 0, + }, + ], + PreseededApprovalCalls: [ + { + // See https://forum.balancer.fi/t/tribe-dao-boost-delegation/3218 + operator: '0x66977Ce30049CD0e443216Bf26377966c3A109E2', + delegator: '0xc4EAc760C2C631eE0b064E39888b89158ff808B2', + }, + ], + }, + goerli: { + PreseededBoostCalls: [], + PreseededApprovalCalls: [], + }, + sepolia: { + PreseededBoostCalls: [], + PreseededApprovalCalls: [], + }, +}; diff --git a/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/output/goerli.json b/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/output/goerli.json new file mode 100644 index 0000000..bf72af0 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/output/goerli.json @@ -0,0 +1,3 @@ +{ + "PreseededVotingEscrowDelegation": "0x7AF980bDBc36D21CE228EfABCCA35707566A2be5" +} diff --git a/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/output/mainnet.json b/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/output/mainnet.json new file mode 100644 index 0000000..c70d525 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "PreseededVotingEscrowDelegation": "0xB496FF44746A8693A060FafD984Da41B253f6790" +} diff --git a/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/output/sepolia.json b/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/output/sepolia.json new file mode 100644 index 0000000..aa27fac --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "PreseededVotingEscrowDelegation": "0xb1a4FE1C6d25a0DDAb47431A92A723dd71d9021f" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/readme.md b/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/readme.md new file mode 100644 index 0000000..097dc2f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/readme.md @@ -0,0 +1,12 @@ +# 2022-05-30 - Preseeded Voting Escrow Delegation + +Deployment of the Preseeded Voting Escrow Delegation, a replacement for the original Voting Escrow Delegation. This implementation is identical to the first one, except an account has been approved to act in Tribe DAO's stead, and it has been preseeded with all boosts previously created. + +See [the Tribe DAO proposal](https://forum.balancer.fi/t/tribe-dao-boost-delegation/3218) for more context. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`PreseededVotingEscrowDelegation` artifact](./artifact/PreseededVotingEscrowDelegation.json) diff --git a/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/test/test.fork.ts b/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/test/test.fork.ts new file mode 100644 index 0000000..dedb3df --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220530-preseeded-voting-escrow-delegation/test/test.fork.ts @@ -0,0 +1,124 @@ +import hre from 'hardhat'; +import { BigNumber, Contract } from 'ethers'; +import { expect } from 'chai'; + +import * as expectEvent from '@helpers/expectEvent'; + +import { ZERO_ADDRESS } from '@helpers/constants'; +import { range } from 'lodash'; +import { actionId } from '@helpers/models/misc/actions'; +import { fromNow, MONTH } from '@helpers/time'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; + +import { describeForkTest, getSigner, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; + +describeForkTest('PreseededVotingEscrowDelegation', 'mainnet', 14850000, function () { + let oldDelegation: Contract; + let receiver: SignerWithAddress; + let delegation: Contract; + + let task: Task; + + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + + before('run task', async () => { + task = new Task('20220530-preseeded-voting-escrow-delegation', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + delegation = await task.deployedInstance('PreseededVotingEscrowDelegation'); + }); + + before('setup signers', async () => { + receiver = await getSigner(1); + }); + + it('proxy can be migrated to delegation', async () => { + const delegationProxyTask = new Task('20220325-ve-delegation', TaskMode.READ_ONLY, getForkedNetwork(hre)); + + const delegationProxy = await delegationProxyTask.deployedInstance('VotingEscrowDelegationProxy'); + oldDelegation = await delegationProxyTask.instanceAt( + 'VotingEscrowDelegation', + await delegationProxy.getDelegationImplementation() + ); + + const authorizer = await new Task( + '20210418-authorizer', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ).deployedInstance('Authorizer'); + + const govMultisig = await impersonate(GOV_MULTISIG); + await authorizer + .connect(govMultisig) + .grantRole(await actionId(delegationProxy, 'setDelegation'), govMultisig.address); + + await delegationProxy.connect(govMultisig).setDelegation(delegation.address); + }); + + it('preseeds boosts and approvals', async () => { + const receipt = await (await delegation.preseed()).wait(); + + for (const i in range(10)) { + const boostCall = await delegation.preseeded_boost_calls(i); + if (boostCall.delegator != ZERO_ADDRESS) { + expectEvent.inReceipt(receipt, 'DelegateBoost', { + _delegator: boostCall.delegator, + _receiver: boostCall.receiver, + _cancel_time: boostCall.cancel_time, + _expire_time: boostCall.expire_time, + }); + } + + const approvalCall = await delegation.preseeded_approval_calls(i); + if (approvalCall.delegator != ZERO_ADDRESS) { + expectEvent.inReceipt(receipt, 'ApprovalForAll', { + _owner: approvalCall.delegator, + _operator: approvalCall.operator, + _approved: true, + }); + } + } + }); + + it('mints boosts for all accounts that had a boost', async () => { + const oldTotalSupply = await oldDelegation.totalSupply(); + let cancelledTokens = 0; + + for (const i in range(oldTotalSupply)) { + const id = await oldDelegation.tokenByIndex(i); + + // Any cancelled boosts will still show up in the token enumeration (as the token is not burned), but will have a + // zero expiration time. We simply skip those, since cancelled boosts are not recreated in the preseeded contract. + if (((await oldDelegation.token_expiry(id)) as BigNumber).isZero()) { + cancelledTokens += 1; + continue; + } + + expect(await oldDelegation.ownerOf(id)).to.equal(await delegation.ownerOf(id)); + expect(await oldDelegation.token_expiry(id)).to.equal(await delegation.token_expiry(id)); + expect(await oldDelegation.token_cancel_time(id)).to.equal(await delegation.token_cancel_time(id)); + + // Ideally we'd also check delegator and boost amount, but there's no easy way to get the delegator, and boost + // amounts might not match if the delegator has locked more veBAL after the boost creation, resulting in the + // preseeded delegation using that extra veBAL in the new boost. + } + + expect(await delegation.totalSupply()).to.equal(oldTotalSupply.sub(cancelledTokens)); + }); + + it('the Tribe operator can create boosts for the DAO', async () => { + // From https://forum.balancer.fi/t/tribe-dao-boost-delegation/3218 + const TRIBE_DAO = '0xc4EAc760C2C631eE0b064E39888b89158ff808B2'; + const TRIBE_OPERATOR = '0x66977ce30049cd0e443216bf26377966c3a109e2'; + + const operator = await impersonate(TRIBE_OPERATOR); + + const receipt = await ( + await delegation.connect(operator).create_boost(TRIBE_DAO, receiver.address, 1000, 0, await fromNow(MONTH), 0) + ).wait(); + + expectEvent.inReceipt(receipt, 'DelegateBoost', { + _delegator: TRIBE_DAO, + _receiver: receiver.address, + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20220707-distribution-scheduler/artifact/DistributionScheduler.json b/balpy/balancer-deployments/tasks/20220707-distribution-scheduler/artifact/DistributionScheduler.json new file mode 100644 index 0000000..447da4b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220707-distribution-scheduler/artifact/DistributionScheduler.json @@ -0,0 +1,164 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "DistributionScheduler", + "sourceName": "contracts/admin/DistributionScheduler.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IRewardTokenDistributor", + "name": "gauge", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "getPendingRewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRewardTokenDistributor", + "name": "gauge", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "getPendingRewardsAt", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRewardTokenDistributor", + "name": "gauge", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "getRewardNode", + "outputs": [ + { + "components": [ + { + "internalType": "uint224", + "name": "amount", + "type": "uint224" + }, + { + "internalType": "uint32", + "name": "nextTimestamp", + "type": "uint32" + } + ], + "internalType": "struct DistributionScheduler.RewardNode", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRewardTokenDistributor", + "name": "gauge", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + } + ], + "name": "scheduleDistribution", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRewardTokenDistributor", + "name": "gauge", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "startDistributionForToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRewardTokenDistributor", + "name": "gauge", + "type": "address" + } + ], + "name": "startDistributions", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5061142b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100715760003560e01c8063974e98a611610050578063974e98a6146100d4578063d85b7a61146100e7578063e2962564146100fa57610071565b806289fac3146100765780637a27db571461008b57806380723ab3146100b4575b600080fd5b610089610084366004610ea5565b61010d565b005b61009e610099366004610ec1565b6102c2565b6040516100ab91906113c7565b60405180910390f35b6100c76100c2366004610ef9565b6102d6565b6040516100ab919061138c565b6100896100e2366004610f39565b610367565b6100896100f5366004610ec1565b61068e565b61009e610108366004610ef9565b61084a565b60005b60088110156102be576040517f54c49fe900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8416906354c49fe99061016e9085906004016113c7565b60206040518083038186803b15801561018657600080fd5b505afa15801561019a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101be9190610e89565b905073ffffffffffffffffffffffffffffffffffffffff81166101e157506102be565b6040517f48e9c65e00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8516906348e9c65e906102369085906004016110cf565b60c06040518083038186803b15801561024e57600080fd5b505afa158015610262573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102869190610f7e565b60200151905073ffffffffffffffffffffffffffffffffffffffff81163014156102b4576102b4848361068e565b5050600101610110565b5050565b60006102cf83834261084a565b9392505050565b6102de610e52565b6000806102eb8686610881565b81526020808201929092526040908101600090812063ffffffff958616825283528190208151808301909252547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811682527c01000000000000000000000000000000000000000000000000000000009004909316908301525092915050565b600082116103aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a19061123e565b60405180910390fd5b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115610400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a1906111aa565b63ffffffff81111561043e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a19061129b565b6040517f48e9c65e00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906348e9c65e906104939087906004016110cf565b60c06040518083038186803b1580156104ab57600080fd5b505afa1580156104bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e39190610f7e565b60200151905073ffffffffffffffffffffffffffffffffffffffff8116610536576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a1906110f0565b73ffffffffffffffffffffffffffffffffffffffff81163014610585576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a19061132f565b428210156105bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a1906112d2565b6105c8826108b4565b8214610600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a19061114d565b6301e133804283031115610640576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a1906111e1565b61066273ffffffffffffffffffffffffffffffffffffffff85163330866108c0565b6106876000806106728888610881565b81526020019081526020016000208385610969565b5050505050565b600080600061069d8585610881565b815260200190815260200160002090506000806106ba8342610c77565b6000808052602086905260409081902080547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c010000000000000000000000000000000000000000000000000000000063ffffffff861602179055517f095ea7b3000000000000000000000000000000000000000000000000000000008152919350915073ffffffffffffffffffffffffffffffffffffffff85169063095ea7b39061076a90889085906004016110a9565b602060405180830381600087803b15801561078457600080fd5b505af1158015610798573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107bc9190610e69565b506040517f93f7aa6700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616906393f7aa679061081190879085906004016110a9565b600060405180830381600087803b15801561082b57600080fd5b505af115801561083f573d6000803e3d6000fd5b505050505050505050565b60008060008061085a8787610881565b8152602001908152602001600020905060006108768285610c77565b979650505050505050565b6000828260405160200161089692919061103e565b60405160208183030381529060405280519060200120905092915050565b62093a80908190040290565b610963846323b872dd60e01b8585856040516024016108e193929190611078565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610d3a565b50505050565b6000808052602084905260408120547c0100000000000000000000000000000000000000000000000000000000900463ffffffff165b8063ffffffff168463ffffffff161180156109bf575063ffffffff811615155b15610a055763ffffffff8082166000908152602087905260409020549192507c01000000000000000000000000000000000000000000000000000000009091041661099f565b63ffffffff8116610acf5763ffffffff8083166000908152602087815260408083208054858a167c01000000000000000000000000000000000000000000000000000000008181027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff93841617909355835180850185528a83168152808601878152918752948c905292909420925183549251909516029383167fffffffff000000000000000000000000000000000000000000000000000000009190911617909116919091179055610687565b8363ffffffff168163ffffffff161415610bbc5763ffffffff81166000908152602086905260409020547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081168185160190811115610b57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a1906111aa565b63ffffffff8216600090815260208790526040902080547fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216919091179055610687565b6040805180820182527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff948516815263ffffffff92831660208083019182529684166000818152989097528288209151825491517fffffffff000000000000000000000000000000000000000000000000000000009092169087161786167c0100000000000000000000000000000000000000000000000000000000918516820217909155929091168552909320805490911692909102919091179055565b60008080526020839052604081205481907c0100000000000000000000000000000000000000000000000000000000900463ffffffff16815b8163ffffffff168510158015610ccb575063ffffffff821615155b15610d2f5763ffffffff9182166000908152602087905260409020547c01000000000000000000000000000000000000000000000000000000008104909216917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1601610cb0565b909590945092505050565b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051610d639190611005565b6000604051808303816000865af19150503d8060008114610da0576040519150601f19603f3d011682016040523d82523d6000602084013e610da5565b606091505b50915091506000821415610dbd573d6000803e3d6000fd5b610963815160001480610ddf575081806020019051810190610ddf9190610e69565b6101a2816102be577f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818104828106603090810160101b848706949093060160081b92909201016642414c230000300160c81b6044526102be91606490fd5b604080518082019091526000808252602082015290565b600060208284031215610e7a578081fd5b815180151581146102cf578182fd5b600060208284031215610e9a578081fd5b81516102cf816113d0565b600060208284031215610eb6578081fd5b81356102cf816113d0565b60008060408385031215610ed3578081fd5b8235610ede816113d0565b91506020830135610eee816113d0565b809150509250929050565b600080600060608486031215610f0d578081fd5b8335610f18816113d0565b92506020840135610f28816113d0565b929592945050506040919091013590565b60008060008060808587031215610f4e578081fd5b8435610f59816113d0565b93506020850135610f69816113d0565b93969395505050506040820135916060013590565b600060c08284031215610f8f578081fd5b60405160c0810181811067ffffffffffffffff82111715610fae578283fd5b6040528251610fbc816113d0565b81526020830151610fcc816113d0565b8060208301525060408301516040820152606083015160608201526080830151608082015260a083015160a08201528091505092915050565b60008251815b81811015611025576020818601810151858301520161100b565b818111156110335782828501525b509190910192915050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606093841b811682529190921b16601482015260280190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60208082526024908201527f52657761726420746f6b656e20646f6573206e6f74206578697374206f6e206760408201527f6175676500000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526034908201527f446973747269627574696f6e206d75737420737461727420617420746865206260408201527f6567696e6e696e67206f6620746865207765656b000000000000000000000000606082015260800190565b60208082526016908201527f52657761726420616d6f756e74206f766572666c6f7700000000000000000000604082015260600190565b60208082526024908201527f446973747269627574696f6e20746f6f2066617220696e746f2074686520667560408201527f7475726500000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f4d7573742070726f76696465206e6f6e2d7a65726f206e756d626572206f662060408201527f746f6b656e730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f5265776172642074696d657374616d70206f766572666c6f7700000000000000604082015260600190565b60208082526031908201527f446973747269627574696f6e2063616e206f6e6c79206265207363686564756c60408201527f656420666f722074686520667574757265000000000000000000000000000000606082015260800190565b60208082526037908201527f446973747269627574696f6e5363686564756c6572206973206e6f742072657760408201527f61726420746f6b656e2773206469737472696275746f72000000000000000000606082015260800190565b81517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260209182015163ffffffff169181019190915260400190565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff811681146113f257600080fd5b5056fea26469706673582212208a138f3a7db5d701333013bf5355448ba1518afe256f218d923b7412febeffb564736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100715760003560e01c8063974e98a611610050578063974e98a6146100d4578063d85b7a61146100e7578063e2962564146100fa57610071565b806289fac3146100765780637a27db571461008b57806380723ab3146100b4575b600080fd5b610089610084366004610ea5565b61010d565b005b61009e610099366004610ec1565b6102c2565b6040516100ab91906113c7565b60405180910390f35b6100c76100c2366004610ef9565b6102d6565b6040516100ab919061138c565b6100896100e2366004610f39565b610367565b6100896100f5366004610ec1565b61068e565b61009e610108366004610ef9565b61084a565b60005b60088110156102be576040517f54c49fe900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8416906354c49fe99061016e9085906004016113c7565b60206040518083038186803b15801561018657600080fd5b505afa15801561019a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101be9190610e89565b905073ffffffffffffffffffffffffffffffffffffffff81166101e157506102be565b6040517f48e9c65e00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8516906348e9c65e906102369085906004016110cf565b60c06040518083038186803b15801561024e57600080fd5b505afa158015610262573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102869190610f7e565b60200151905073ffffffffffffffffffffffffffffffffffffffff81163014156102b4576102b4848361068e565b5050600101610110565b5050565b60006102cf83834261084a565b9392505050565b6102de610e52565b6000806102eb8686610881565b81526020808201929092526040908101600090812063ffffffff958616825283528190208151808301909252547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811682527c01000000000000000000000000000000000000000000000000000000009004909316908301525092915050565b600082116103aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a19061123e565b60405180910390fd5b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115610400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a1906111aa565b63ffffffff81111561043e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a19061129b565b6040517f48e9c65e00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906348e9c65e906104939087906004016110cf565b60c06040518083038186803b1580156104ab57600080fd5b505afa1580156104bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e39190610f7e565b60200151905073ffffffffffffffffffffffffffffffffffffffff8116610536576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a1906110f0565b73ffffffffffffffffffffffffffffffffffffffff81163014610585576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a19061132f565b428210156105bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a1906112d2565b6105c8826108b4565b8214610600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a19061114d565b6301e133804283031115610640576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a1906111e1565b61066273ffffffffffffffffffffffffffffffffffffffff85163330866108c0565b6106876000806106728888610881565b81526020019081526020016000208385610969565b5050505050565b600080600061069d8585610881565b815260200190815260200160002090506000806106ba8342610c77565b6000808052602086905260409081902080547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c010000000000000000000000000000000000000000000000000000000063ffffffff861602179055517f095ea7b3000000000000000000000000000000000000000000000000000000008152919350915073ffffffffffffffffffffffffffffffffffffffff85169063095ea7b39061076a90889085906004016110a9565b602060405180830381600087803b15801561078457600080fd5b505af1158015610798573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107bc9190610e69565b506040517f93f7aa6700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616906393f7aa679061081190879085906004016110a9565b600060405180830381600087803b15801561082b57600080fd5b505af115801561083f573d6000803e3d6000fd5b505050505050505050565b60008060008061085a8787610881565b8152602001908152602001600020905060006108768285610c77565b979650505050505050565b6000828260405160200161089692919061103e565b60405160208183030381529060405280519060200120905092915050565b62093a80908190040290565b610963846323b872dd60e01b8585856040516024016108e193929190611078565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610d3a565b50505050565b6000808052602084905260408120547c0100000000000000000000000000000000000000000000000000000000900463ffffffff165b8063ffffffff168463ffffffff161180156109bf575063ffffffff811615155b15610a055763ffffffff8082166000908152602087905260409020549192507c01000000000000000000000000000000000000000000000000000000009091041661099f565b63ffffffff8116610acf5763ffffffff8083166000908152602087815260408083208054858a167c01000000000000000000000000000000000000000000000000000000008181027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff93841617909355835180850185528a83168152808601878152918752948c905292909420925183549251909516029383167fffffffff000000000000000000000000000000000000000000000000000000009190911617909116919091179055610687565b8363ffffffff168163ffffffff161415610bbc5763ffffffff81166000908152602086905260409020547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081168185160190811115610b57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a1906111aa565b63ffffffff8216600090815260208790526040902080547fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216919091179055610687565b6040805180820182527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff948516815263ffffffff92831660208083019182529684166000818152989097528288209151825491517fffffffff000000000000000000000000000000000000000000000000000000009092169087161786167c0100000000000000000000000000000000000000000000000000000000918516820217909155929091168552909320805490911692909102919091179055565b60008080526020839052604081205481907c0100000000000000000000000000000000000000000000000000000000900463ffffffff16815b8163ffffffff168510158015610ccb575063ffffffff821615155b15610d2f5763ffffffff9182166000908152602087905260409020547c01000000000000000000000000000000000000000000000000000000008104909216917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1601610cb0565b909590945092505050565b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051610d639190611005565b6000604051808303816000865af19150503d8060008114610da0576040519150601f19603f3d011682016040523d82523d6000602084013e610da5565b606091505b50915091506000821415610dbd573d6000803e3d6000fd5b610963815160001480610ddf575081806020019051810190610ddf9190610e69565b6101a2816102be577f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818104828106603090810160101b848706949093060160081b92909201016642414c230000300160c81b6044526102be91606490fd5b604080518082019091526000808252602082015290565b600060208284031215610e7a578081fd5b815180151581146102cf578182fd5b600060208284031215610e9a578081fd5b81516102cf816113d0565b600060208284031215610eb6578081fd5b81356102cf816113d0565b60008060408385031215610ed3578081fd5b8235610ede816113d0565b91506020830135610eee816113d0565b809150509250929050565b600080600060608486031215610f0d578081fd5b8335610f18816113d0565b92506020840135610f28816113d0565b929592945050506040919091013590565b60008060008060808587031215610f4e578081fd5b8435610f59816113d0565b93506020850135610f69816113d0565b93969395505050506040820135916060013590565b600060c08284031215610f8f578081fd5b60405160c0810181811067ffffffffffffffff82111715610fae578283fd5b6040528251610fbc816113d0565b81526020830151610fcc816113d0565b8060208301525060408301516040820152606083015160608201526080830151608082015260a083015160a08201528091505092915050565b60008251815b81811015611025576020818601810151858301520161100b565b818111156110335782828501525b509190910192915050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606093841b811682529190921b16601482015260280190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60208082526024908201527f52657761726420746f6b656e20646f6573206e6f74206578697374206f6e206760408201527f6175676500000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526034908201527f446973747269627574696f6e206d75737420737461727420617420746865206260408201527f6567696e6e696e67206f6620746865207765656b000000000000000000000000606082015260800190565b60208082526016908201527f52657761726420616d6f756e74206f766572666c6f7700000000000000000000604082015260600190565b60208082526024908201527f446973747269627574696f6e20746f6f2066617220696e746f2074686520667560408201527f7475726500000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f4d7573742070726f76696465206e6f6e2d7a65726f206e756d626572206f662060408201527f746f6b656e730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f5265776172642074696d657374616d70206f766572666c6f7700000000000000604082015260600190565b60208082526031908201527f446973747269627574696f6e2063616e206f6e6c79206265207363686564756c60408201527f656420666f722074686520667574757265000000000000000000000000000000606082015260800190565b60208082526037908201527f446973747269627574696f6e5363686564756c6572206973206e6f742072657760408201527f61726420746f6b656e2773206469737472696275746f72000000000000000000606082015260800190565b81517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260209182015163ffffffff169181019190915260400190565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff811681146113f257600080fd5b5056fea26469706673582212208a138f3a7db5d701333013bf5355448ba1518afe256f218d923b7412febeffb564736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220707-distribution-scheduler/index.ts b/balpy/balancer-deployments/tasks/20220707-distribution-scheduler/index.ts new file mode 100644 index 0000000..9f04754 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220707-distribution-scheduler/index.ts @@ -0,0 +1,5 @@ +import { Task, TaskRunOptions } from '@src'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + await task.deployAndVerify('DistributionScheduler', [], from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20220707-distribution-scheduler/output/avalanche.json b/balpy/balancer-deployments/tasks/20220707-distribution-scheduler/output/avalanche.json new file mode 100644 index 0000000..d2058ed --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220707-distribution-scheduler/output/avalanche.json @@ -0,0 +1,3 @@ +{ + "DistributionScheduler": "0xC128a9954e6c874eA3d62ce62B468bA073093F25" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220707-distribution-scheduler/output/goerli.json b/balpy/balancer-deployments/tasks/20220707-distribution-scheduler/output/goerli.json new file mode 100644 index 0000000..94cca1b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220707-distribution-scheduler/output/goerli.json @@ -0,0 +1,3 @@ +{ + "DistributionScheduler": "0x05a0BF0540F346b6Dac25550738343BEb51C0f65" +} diff --git a/balpy/balancer-deployments/tasks/20220707-distribution-scheduler/output/mainnet.json b/balpy/balancer-deployments/tasks/20220707-distribution-scheduler/output/mainnet.json new file mode 100644 index 0000000..85f40d8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220707-distribution-scheduler/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "DistributionScheduler": "0xBd35248F8325DD1cB2bBf9D01E80A6bb99a792Dd" +} diff --git a/balpy/balancer-deployments/tasks/20220707-distribution-scheduler/readme.md b/balpy/balancer-deployments/tasks/20220707-distribution-scheduler/readme.md new file mode 100644 index 0000000..48bed43 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220707-distribution-scheduler/readme.md @@ -0,0 +1,10 @@ +# 2022-07-07 - Distribution Scheduler + +Deployment of the `DistributionScheduler`, which can be used to schedule token distributions to gauges in advance, making operations simpler. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`DistributionScheduler` artifact](./artifact/DistributionScheduler.json) diff --git a/balpy/balancer-deployments/tasks/20220707-distribution-scheduler/test/test.fork.ts b/balpy/balancer-deployments/tasks/20220707-distribution-scheduler/test/test.fork.ts new file mode 100644 index 0000000..d1255ec --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220707-distribution-scheduler/test/test.fork.ts @@ -0,0 +1,128 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import { bn, fp } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { advanceTime, currentWeekTimestamp, MONTH, WEEK } from '@helpers/time'; +import { expectTransferEvent } from '@helpers/expectTransfer'; + +import { MAX_UINT256 } from '@helpers/constants'; + +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; + +describeForkTest('DistributionScheduler', 'mainnet', 14850000, function () { + let lmCommittee: SignerWithAddress, distributor: SignerWithAddress; + let scheduler: Contract, gauge: Contract, DAI: Contract, USDC: Contract; + + let task: Task; + + const LM_COMMITTEE_ADDRESS = '0xc38c5f97B34E175FFd35407fc91a937300E33860'; + const DISTRIBUTOR_ADDRESS = '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503'; // Owns DAI and USDC + + const DAI_ADDRESS = '0x6b175474e89094c44da98b954eedeac495271d0f'; + const USDC_ADDRESS = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'; + + const daiWeeklyAmount = fp(42); + const usdcWeeklyAmount = bn(1337e6); // USDC has 6 tokens + + const GAUGE_ADDRESS = '0x4E3c048BE671852277Ad6ce29Fd5207aA12fabff'; + + before('run task', async () => { + task = new Task('20220707-distribution-scheduler', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + scheduler = await task.instanceAt('DistributionScheduler', task.output({ network: 'test' }).DistributionScheduler); + }); + + before('setup accounts', async () => { + lmCommittee = await impersonate(LM_COMMITTEE_ADDRESS); + distributor = await impersonate(DISTRIBUTOR_ADDRESS); + }); + + before('setup contracts', async () => { + // We reuse this task as it contains an ABI similar to the one in real ERC20 tokens + const testBALTokenTask = new Task('20220325-test-balancer-token', TaskMode.READ_ONLY, getForkedNetwork(hre)); + DAI = await testBALTokenTask.instanceAt('TestBalancerToken', DAI_ADDRESS); + USDC = await testBALTokenTask.instanceAt('TestBalancerToken', USDC_ADDRESS); + + const gaugeFactoryTask = new Task('20220325-mainnet-gauge-factory', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gauge = await gaugeFactoryTask.instanceAt('LiquidityGaugeV5', GAUGE_ADDRESS); + }); + + before('add reward tokens to gauge', async () => { + const authorizerAdaptorTask = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY, getForkedNetwork(hre)); + const authorizerAdaptor = await authorizerAdaptorTask.instanceAt( + 'AuthorizerAdaptor', + authorizerAdaptorTask.output({ network: 'mainnet' }).AuthorizerAdaptor + ); + + await Promise.all( + [DAI, USDC].map((token) => + authorizerAdaptor.connect(lmCommittee).performAction( + gauge.address, + // Note that we need to make the scheduler the distributor + gauge.interface.encodeFunctionData('add_reward', [token.address, scheduler.address]) + ) + ) + ); + + expect(await gauge.reward_count()).to.equal(2); + }); + + before('approve tokens', async () => { + await USDC.connect(distributor).approve(scheduler.address, MAX_UINT256); + await DAI.connect(distributor).approve(scheduler.address, MAX_UINT256); + }); + + it('schedules rewards', async () => { + const nextWeek = (await currentWeekTimestamp()).add(WEEK); + + await scheduler.connect(distributor).scheduleDistribution(gauge.address, DAI.address, daiWeeklyAmount, nextWeek); + + await scheduler.connect(distributor).scheduleDistribution(gauge.address, USDC.address, usdcWeeklyAmount, nextWeek); + await scheduler + .connect(distributor) + .scheduleDistribution(gauge.address, USDC.address, usdcWeeklyAmount, nextWeek.add(WEEK)); + + // Fist week + expect(await scheduler.getPendingRewardsAt(gauge.address, DAI.address, nextWeek)).to.equal(daiWeeklyAmount); + expect(await scheduler.getPendingRewardsAt(gauge.address, USDC.address, nextWeek)).to.equal(usdcWeeklyAmount); + + // Second week + expect(await scheduler.getPendingRewardsAt(gauge.address, USDC.address, nextWeek.add(WEEK))).to.equal( + usdcWeeklyAmount.mul(2) + ); + }); + + it('does not distribute rewards until the scheduled time arrives', async () => { + const daiBalanceBefore = await DAI.balanceOf(scheduler.address); + const usdcBalanceBefore = await USDC.balanceOf(scheduler.address); + + await scheduler.startDistributions(gauge.address); + + const daiBalanceAfter = await DAI.balanceOf(scheduler.address); + const usdcBalanceAfter = await USDC.balanceOf(scheduler.address); + + expect(daiBalanceAfter).to.equal(daiBalanceBefore); + expect(usdcBalanceAfter).to.equal(usdcBalanceBefore); + }); + + it('distributes rewards', async () => { + await advanceTime((await currentWeekTimestamp()).add(MONTH)); + const tx = await scheduler.startDistributions(gauge.address); + + // Ideally we'd look for events on the gauge as it processes the deposit, but deposit_reward_token emits no events. + + expectTransferEvent( + await tx.wait(), + { from: scheduler.address, to: gauge.address, value: daiWeeklyAmount }, + DAI.address + ); + + expectTransferEvent( + await tx.wait(), + { from: scheduler.address, to: gauge.address, value: usdcWeeklyAmount.mul(2) }, + USDC.address + ); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/artifact/FeeDistributor.json b/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/artifact/FeeDistributor.json new file mode 100644 index 0000000..2d31ae7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/artifact/FeeDistributor.json @@ -0,0 +1,493 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "FeeDistributor", + "sourceName": "contracts/fee-distribution/FeeDistributor.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVotingEscrow", + "name": "votingEscrow", + "type": "address" + }, + { + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "OnlyCallerOptIn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lastCheckpointTimestamp", + "type": "uint256" + } + ], + "name": "TokenCheckpointed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "userTokenTimeCursor", + "type": "uint256" + } + ], + "name": "TokensClaimed", + "type": "event" + }, + { + "inputs": [], + "name": "checkpoint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "checkpointToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "checkpointTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "checkpointUser", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "claimToken", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "claimTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "depositToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "name": "depositTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getNextNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTimeCursor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "getTokenLastBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "getTokenTimeCursor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "getTokensDistributedInWeek", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "getTotalSupplyAtTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "getUserBalanceAtTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "getUserTimeCursor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "getUserTokenTimeCursor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVotingEscrow", + "outputs": [ + { + "internalType": "contract IVotingEscrow", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "isOnlyCallerEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "setOnlyCallerCheck", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "bool", + "name": "enabled", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "name": "setOnlyCallerCheckWithSignature", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101206040523480156200001257600080fd5b5060405162002977380380620029778339810160408190526200003591620001d0565b604080518082018252600e81526d2332b2a234b9ba3934b13aba37b960911b602080830191825283518085019094526001808552603160f81b9185019182529251909120608052915190912060a0527f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c0526002556001600160601b0319606083901b1660e052620000c881620001c4565b90506000620000d742620001c4565b905080821015620001055760405162461bcd60e51b8152600401620000fc9062000223565b60405180910390fd5b80821415620001b35760405163bd85b03960e01b81526000906001600160a01b0385169063bd85b039906200013f908590600401620002a0565b60206040518083038186803b1580156200015857600080fd5b505afa1580156200016d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019391906200020a565b11620001b35760405162461bcd60e51b8152600401620000fc9062000258565b5061010081905260035550620002a9565b62093a80908190040290565b60008060408385031215620001e3578182fd5b82516001600160a01b0381168114620001fa578283fd5b6020939093015192949293505050565b6000602082840312156200021c578081fd5b5051919050565b6020808252818101527f43616e6e6f74207374617274206265666f72652063757272656e74207765656b604082015260600190565b60208082526028908201527f5a65726f20746f74616c20737570706c7920726573756c747320696e206c6f736040820152677420746f6b656e7360c01b606082015260800190565b90815260200190565b60805160a05160c05160e05160601c6101005161265e62000319600039806109ab5280610b0a5280610b6f5280610eec52508061033e52806108cd5280610a7a5280610c825280611453528061152752806119bc5250806118805250806118c25250806118a1525061265e6000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c806390193b7c116100d8578063ca31879d1161008c578063e811f44b11610066578063e811f44b1461030e578063ed24911d14610321578063fcaa54ee1461032957610182565b8063ca31879d146102d5578063d3dc4ca1146102e8578063de681faf146102fb57610182565b8063a1648aa5116100bd578063a1648aa51461029a578063acbc1428146102ba578063c2c4c5c1146102cd57610182565b806390193b7c14610274578063905d10ac1461028757610182565b80634f3c50901161013a57806382aa5ad41161011457806382aa5ad414610239578063876e69a114610241578063887204671461025457610182565b80634f3c5090146102005780637b8d6221146102135780638050a7ee1461022657610182565b80632308805b1161016b5780632308805b146101ba578063338b5dea146101da5780633902b9bc146101ed57610182565b806308b0308a1461018757806314866e08146101a5575b600080fd5b61018f61033c565b60405161019c91906122df565b60405180910390f35b6101b86101b3366004611f44565b610360565b005b6101cd6101c8366004611f44565b61037c565b60405161019c91906123f8565b6101b86101e83660046120ba565b6103ca565b6101b86101fb366004611f44565b610416565b6101cd61020e36600461225d565b610429565b6101b8610221366004612125565b61043b565b6101cd610234366004612082565b61051e565b6101cd610533565b6101cd61024f366004611f44565b610539565b610267610262366004611f60565b610577565b60405161019c91906123b5565b6101cd610282366004611f44565b61065a565b6101b86102953660046120e5565b610682565b6102ad6102a8366004611f44565b6106b7565b60405161019c91906123ed565b6101cd6102c8366004611f44565b6106e2565b6101b8610720565b6101cd6102e3366004612082565b61073a565b6101cd6102f63660046120ba565b610782565b6101cd6103093660046120ba565b6107b7565b6101b861031c36600461218e565b6107ec565b6101cd6107f6565b6101b8610337366004611fb3565b610805565b7f000000000000000000000000000000000000000000000000000000000000000090565b610368610876565b6103718161088d565b610379610e5d565b50565b73ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1690565b6103d2610876565b6103dd826000610e64565b6103ff73ffffffffffffffffffffffffffffffffffffffff831633308461128e565b61040a826001610e64565b610412610e5d565b5050565b61041e610876565b610371816001610e64565b60009081526004602052604090205490565b610443610876565b61044d8382611331565b8260005b8181101561050e5761048486868381811061046857fe5b905060200201602081019061047d9190611f44565b6000610e64565b6104db333086868581811061049557fe5b905060200201358989868181106104a857fe5b90506020020160208101906104bd9190611f44565b73ffffffffffffffffffffffffffffffffffffffff1692919061128e565b6105068686838181106104ea57fe5b90506020020160208101906104ff9190611f44565b6001610e64565b600101610451565b5050610518610e5d565b50505050565b600061052a838361133e565b90505b92915050565b60035490565b73ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205468010000000000000000900467ffffffffffffffff1690565b6060610581610876565b8361058b816113d6565b610593611428565b61059c8561088d565b8260608167ffffffffffffffff811180156105b657600080fd5b506040519080825280602002602001820160405280156105e0578160200160208202803683370190505b50905060005b82811015610646576105fd87878381811061046857fe5b6106278888888481811061060d57fe5b90506020020160208101906106229190611f44565b6115d2565b82828151811061063357fe5b60209081029190910101526001016105e6565b5092505050610653610e5d565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61068a610876565b8060005b818110156106ad576106a58484838181106104ea57fe5b60010161068e565b5050610412610e5d565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205468010000000000000000900467ffffffffffffffff1690565b610728610876565b610730611428565b610738610e5d565b565b6000610744610876565b8261074e816113d6565b610756611428565b61075f8461088d565b61076a836000610e64565b600061077685856115d2565b9250505061052d610e5d565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600660209081526040808320938352929052205490565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600860209081526040808320938352929052205490565b61037933826117ef565b600061080061187c565b905090565b60007fbd291ffccec065968fe20c5f8debdad73ab50837733f357eeae8814178015a9084846108338761065a565b6040516020016108469493929190612401565b60405160208183030381529060405280519060200120905061086c8482846101f8611919565b61051884846117ef565b610887600280541415610190611946565b60028055565b6040517f010ae75700000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063010ae757906109029085906004016122df565b60206040518083038186803b15801561091a57600080fd5b505afa15801561092e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109529190612275565b90508061095f5750610379565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600760205260408120805490916801000000000000000090910467ffffffffffffffff1690816109d9576109d2857f0000000000000000000000000000000000000000000000000000000000000000600087611954565b9050610a2c565b4282106109e95750505050610379565b50815470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1660148185031115610a2c57610a2985838387611954565b90505b80610a35575060015b610a3d611ebb565b6040517f28d09d4700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906328d09d4790610ab1908990869060040161238f565b60806040518083038186803b158015610ac957600080fd5b505afa158015610add573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b019190612206565b905082610bd5577f00000000000000000000000000000000000000000000000000000000000000004211610b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6190612548565b60405180910390fd5b610ba07f0000000000000000000000000000000000000000000000000000000000000000610b9b8360400151611a75565b611a85565b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff821617855592505b610bdd611ebb565b60005b6032811015610dc25782604001518510158015610bfd5750868411155b15610d115760018401935082915086841115610c455760405180608001604052806000600f0b81526020016000600f0b81526020016000815260200160008152509250610d0c565b6040517f28d09d4700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906328d09d4790610cb9908b90889060040161238f565b60806040518083038186803b158015610cd157600080fd5b505afa158015610ce5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d099190612206565b92505b610dba565b428510610d1d57610dc2565b6000826040015186039050600081846020015102600f0b8460000151600f0b13610d48576000610d59565b81846020015102846000015103600f0b5b905080158015610d6857508886115b15610d7f57610d7642611a75565b96505050610dc2565b73ffffffffffffffffffffffffffffffffffffffff8a1660009081526008602090815260408083208a84529091529020555062093a80909401935b600101610be0565b505083546fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9290920167ffffffffffffffff90811670010000000000000000000000000000000002929092177fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff1668010000000000000000939092169290920217909155505050565b6001600255565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600560205260408120805490916801000000000000000090910467ffffffffffffffff169081610f4857429150610eb642611a9c565b83547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff919091161783557f00000000000000000000000000000000000000000000000000000000000000004211610f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6190612548565b610f9a565b814203905083610f9a576000610f5d83611a9c565b610f6642611a9c565b14905060006201518042610f7942611a75565b03109050818015610f88575080155b15610f97575050505050610412565b50505b82547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000004267ffffffffffffffff16021783556040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8716906370a082319061102c9030906004016122df565b60206040518083038186803b15801561104457600080fd5b505afa158015611058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107c9190612275565b84549091506000906110b590839070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16611aa8565b9050806110c6575050505050610412565b6fffffffffffffffffffffffffffffffff821115611110576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6190612511565b84546fffffffffffffffffffffffffffffffff808416700100000000000000000000000000000000029116178555600061114985611a9c565b73ffffffffffffffffffffffffffffffffffffffff8916600090815260066020526040812091925090815b6014811015611246578362093a80019250824210156111e4578615801561119a57508742145b156111b85760008481526020839052604090208054860190556111df565b868842038602816111c557fe5b600086815260208590526040902080549290910490910190555b611246565b861580156111f157508783145b1561120f576000848152602083905260409020805486019055611236565b8688840386028161121c57fe5b600086815260208590526040902080549290910490910190555b9196508692508291600101611174565b507f9b7f1a85a4c9b4e59e1b6527d9969c50cdfb3a1a467d0c4a51fb0ed8bf07f1308a858960405161127a939291906124e3565b60405180910390a150505050505050505050565b610518846323b872dd60e01b8585856040516024016112af93929190612300565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611ab6565b6104128183146067611946565b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600960209081526040808320938516835292905290812054801561138057905061052d565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260076020908152604080832054938716835260059091529020546113ce9167ffffffffffffffff9081169116611a85565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff1615610379576103793373ffffffffffffffffffffffffffffffffffffffff831614610191611946565b600354600061143642611a9c565b90508082118061144557504281145b15611451575050610738565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c2c4c5c16040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156114b957600080fd5b505af11580156114cd573d6000803e3d6000fd5b5050505060005b60148110156115cb57818311156114ea576115cb565b6040517fbd85b03900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063bd85b0399061155c9086906004016123f8565b60206040518083038186803b15801561157457600080fd5b505afa158015611588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ac9190612275565b60008481526004602052604090205562093a80909201916001016114d4565b5050600355565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260056020526040812081611602858561133e565b60035473ffffffffffffffffffffffffffffffffffffffff8716600090815260076020526040812054929350916116829161165c91611657919068010000000000000000900467ffffffffffffffff16611b63565b611a75565b845461167d9068010000000000000000900467ffffffffffffffff16611a9c565b611b63565b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600660209081526040808320938b16835260089091528120929350909190805b6014811015611713578486106116d457611713565b600086815260046020908152604080832054868352818420549288905292205402816116fc57fe5b62093a8097909701960491909101906001016116bf565b5073ffffffffffffffffffffffffffffffffffffffff808a166000908152600960209081526040808320938c1683529290522085905580156117e35785546fffffffffffffffffffffffffffffffff700100000000000000000000000000000000808304821684900382160291161786556117a573ffffffffffffffffffffffffffffffffffffffff89168a83611b72565b7fff097c7d8b1957a4ff09ef1361b5fb54dcede3941ba836d0beb9d10bec725de6898983886040516117da9493929190612359565b60405180910390a15b98975050505050505050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016831515179055517fac9874a7a931a3f5c9f202c6d9cf40de5d21506993c9f9c38ca8265add89584c906118709084908490612331565b60405180910390a15050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006118e9611b96565b306040516020016118fe959493929190612434565b60405160208183030381529060405280519060200120905090565b6105188484847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85611b9a565b816104125761041281611bfe565b60008282825b6080811015611a695781831061196f57611a69565b600282840181010461197f611ebb565b6040517f28d09d4700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906328d09d47906119f3908d90869060040161238f565b60806040518083038186803b158015611a0b57600080fd5b505afa158015611a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a439190612206565b905088816040015111611a5857819450611a5f565b6001820393505b505060010161195a565b50909695505050505050565b600061052d62093a7f8301611a9c565b600081831015611a95578161052a565b5090919050565b62093a80908190040290565b600061052a83836001611c6b565b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051611adf919061228d565b6000604051808303816000865af19150503d8060008114611b1c576040519150601f19603f3d011682016040523d82523d6000602084013e611b21565b606091505b50915091506000821415611b39573d6000803e3d6000fd5b610518815160001480611b5b575081806020019051810190611b5b91906121aa565b6101a2611946565b6000818310611a95578161052a565b611b918363a9059cbb60e01b84846040516024016112af92919061238f565b505050565b4690565b6000611ba585611c81565b9050611bbb611bb5878387611cba565b83611946565b611bca428410156101b8611946565b50505073ffffffffffffffffffffffffffffffffffffffff9092166000908152602081905260409020805460010190555050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6000611c7a8484111583611946565b5050900390565b6000611c8b61187c565b82604051602001611c9d9291906122a9565b604051602081830303815290604052805190602001209050919050565b6000611cdb8473ffffffffffffffffffffffffffffffffffffffff16611dc2565b15611db0576040517f1626ba7e000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff861690631626ba7e90611d36908790879060040161246d565b60206040518083038186803b158015611d4e57600080fd5b505afa158015611d62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8691906121c6565b7fffffffff0000000000000000000000000000000000000000000000000000000016149050610653565b611dbb848484611dc8565b9050610653565b3b151590565b6000611dda82516041146101b9611946565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190611e139089908590889088906124c5565b6020604051602081039080840390855afa158015611e35573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906117e357508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161498975050505050505050565b60405180608001604052806000600f0b81526020016000600f0b815260200160008152602001600081525090565b60008083601f840112611efa578182fd5b50813567ffffffffffffffff811115611f11578182fd5b6020830191508360208083028501011115611f2b57600080fd5b9250929050565b8051600f81900b811461052d57600080fd5b600060208284031215611f55578081fd5b8135610653816125f8565b600080600060408486031215611f74578182fd5b8335611f7f816125f8565b9250602084013567ffffffffffffffff811115611f9a578283fd5b611fa686828701611ee9565b9497909650939450505050565b600080600060608486031215611fc7578283fd5b8335611fd2816125f8565b9250602084810135611fe38161261a565b9250604085013567ffffffffffffffff80821115611fff578384fd5b818701915087601f830112612012578384fd5b813581811115612020578485fd5b612050847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016125a5565b91508082528884828501011115612065578485fd5b808484018584013784848284010152508093505050509250925092565b60008060408385031215612094578182fd5b823561209f816125f8565b915060208301356120af816125f8565b809150509250929050565b600080604083850312156120cc578182fd5b82356120d7816125f8565b946020939093013593505050565b600080602083850312156120f7578182fd5b823567ffffffffffffffff81111561210d578283fd5b61211985828601611ee9565b90969095509350505050565b6000806000806040858703121561213a578081fd5b843567ffffffffffffffff80821115612151578283fd5b61215d88838901611ee9565b90965094506020870135915080821115612175578283fd5b5061218287828801611ee9565b95989497509550505050565b60006020828403121561219f578081fd5b81356106538161261a565b6000602082840312156121bb578081fd5b81516106538161261a565b6000602082840312156121d7578081fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610653578182fd5b600060808284031215612217578081fd5b61222160806125a5565b61222b8484611f32565b815261223a8460208501611f32565b602082015260408301516040820152606083015160608201528091505092915050565b60006020828403121561226e578081fd5b5035919050565b600060208284031215612286578081fd5b5051919050565b6000825161229f8184602087016125cc565b9190910192915050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152606081019190915260800190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015611a69578351835292840192918401916001016123d1565b901515815260200190565b90815260200190565b93845273ffffffffffffffffffffffffffffffffffffffff92909216602084015215156040830152606082015260800190565b94855260208501939093526040840191909152606083015273ffffffffffffffffffffffffffffffffffffffff16608082015260a00190565b60008382526040602083015282518060408401526124928160608501602087016125cc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b93845260ff9290921660208401526040830152606082015260800190565b73ffffffffffffffffffffffffffffffffffffffff9390931683526020830191909152604082015260600190565b6020808252601e908201527f4d6178696d756d20746f6b656e2062616c616e63652065786365656465640000604082015260600190565b60208082526024908201527f46656520646973747269627574696f6e20686173206e6f74207374617274656460408201527f2079657400000000000000000000000000000000000000000000000000000000606082015260800190565b60405181810167ffffffffffffffff811182821017156125c457600080fd5b604052919050565b60005b838110156125e75781810151838201526020016125cf565b838111156105185750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461037957600080fd5b801515811461037957600080fdfea26469706673582212206e91ba3bf7fae396c65faebeef9a2ad330d9087256688eb7df956fb362f6a77264736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101825760003560e01c806390193b7c116100d8578063ca31879d1161008c578063e811f44b11610066578063e811f44b1461030e578063ed24911d14610321578063fcaa54ee1461032957610182565b8063ca31879d146102d5578063d3dc4ca1146102e8578063de681faf146102fb57610182565b8063a1648aa5116100bd578063a1648aa51461029a578063acbc1428146102ba578063c2c4c5c1146102cd57610182565b806390193b7c14610274578063905d10ac1461028757610182565b80634f3c50901161013a57806382aa5ad41161011457806382aa5ad414610239578063876e69a114610241578063887204671461025457610182565b80634f3c5090146102005780637b8d6221146102135780638050a7ee1461022657610182565b80632308805b1161016b5780632308805b146101ba578063338b5dea146101da5780633902b9bc146101ed57610182565b806308b0308a1461018757806314866e08146101a5575b600080fd5b61018f61033c565b60405161019c91906122df565b60405180910390f35b6101b86101b3366004611f44565b610360565b005b6101cd6101c8366004611f44565b61037c565b60405161019c91906123f8565b6101b86101e83660046120ba565b6103ca565b6101b86101fb366004611f44565b610416565b6101cd61020e36600461225d565b610429565b6101b8610221366004612125565b61043b565b6101cd610234366004612082565b61051e565b6101cd610533565b6101cd61024f366004611f44565b610539565b610267610262366004611f60565b610577565b60405161019c91906123b5565b6101cd610282366004611f44565b61065a565b6101b86102953660046120e5565b610682565b6102ad6102a8366004611f44565b6106b7565b60405161019c91906123ed565b6101cd6102c8366004611f44565b6106e2565b6101b8610720565b6101cd6102e3366004612082565b61073a565b6101cd6102f63660046120ba565b610782565b6101cd6103093660046120ba565b6107b7565b6101b861031c36600461218e565b6107ec565b6101cd6107f6565b6101b8610337366004611fb3565b610805565b7f000000000000000000000000000000000000000000000000000000000000000090565b610368610876565b6103718161088d565b610379610e5d565b50565b73ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1690565b6103d2610876565b6103dd826000610e64565b6103ff73ffffffffffffffffffffffffffffffffffffffff831633308461128e565b61040a826001610e64565b610412610e5d565b5050565b61041e610876565b610371816001610e64565b60009081526004602052604090205490565b610443610876565b61044d8382611331565b8260005b8181101561050e5761048486868381811061046857fe5b905060200201602081019061047d9190611f44565b6000610e64565b6104db333086868581811061049557fe5b905060200201358989868181106104a857fe5b90506020020160208101906104bd9190611f44565b73ffffffffffffffffffffffffffffffffffffffff1692919061128e565b6105068686838181106104ea57fe5b90506020020160208101906104ff9190611f44565b6001610e64565b600101610451565b5050610518610e5d565b50505050565b600061052a838361133e565b90505b92915050565b60035490565b73ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205468010000000000000000900467ffffffffffffffff1690565b6060610581610876565b8361058b816113d6565b610593611428565b61059c8561088d565b8260608167ffffffffffffffff811180156105b657600080fd5b506040519080825280602002602001820160405280156105e0578160200160208202803683370190505b50905060005b82811015610646576105fd87878381811061046857fe5b6106278888888481811061060d57fe5b90506020020160208101906106229190611f44565b6115d2565b82828151811061063357fe5b60209081029190910101526001016105e6565b5092505050610653610e5d565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61068a610876565b8060005b818110156106ad576106a58484838181106104ea57fe5b60010161068e565b5050610412610e5d565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205468010000000000000000900467ffffffffffffffff1690565b610728610876565b610730611428565b610738610e5d565b565b6000610744610876565b8261074e816113d6565b610756611428565b61075f8461088d565b61076a836000610e64565b600061077685856115d2565b9250505061052d610e5d565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600660209081526040808320938352929052205490565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600860209081526040808320938352929052205490565b61037933826117ef565b600061080061187c565b905090565b60007fbd291ffccec065968fe20c5f8debdad73ab50837733f357eeae8814178015a9084846108338761065a565b6040516020016108469493929190612401565b60405160208183030381529060405280519060200120905061086c8482846101f8611919565b61051884846117ef565b610887600280541415610190611946565b60028055565b6040517f010ae75700000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063010ae757906109029085906004016122df565b60206040518083038186803b15801561091a57600080fd5b505afa15801561092e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109529190612275565b90508061095f5750610379565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600760205260408120805490916801000000000000000090910467ffffffffffffffff1690816109d9576109d2857f0000000000000000000000000000000000000000000000000000000000000000600087611954565b9050610a2c565b4282106109e95750505050610379565b50815470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1660148185031115610a2c57610a2985838387611954565b90505b80610a35575060015b610a3d611ebb565b6040517f28d09d4700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906328d09d4790610ab1908990869060040161238f565b60806040518083038186803b158015610ac957600080fd5b505afa158015610add573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b019190612206565b905082610bd5577f00000000000000000000000000000000000000000000000000000000000000004211610b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6190612548565b60405180910390fd5b610ba07f0000000000000000000000000000000000000000000000000000000000000000610b9b8360400151611a75565b611a85565b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff821617855592505b610bdd611ebb565b60005b6032811015610dc25782604001518510158015610bfd5750868411155b15610d115760018401935082915086841115610c455760405180608001604052806000600f0b81526020016000600f0b81526020016000815260200160008152509250610d0c565b6040517f28d09d4700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906328d09d4790610cb9908b90889060040161238f565b60806040518083038186803b158015610cd157600080fd5b505afa158015610ce5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d099190612206565b92505b610dba565b428510610d1d57610dc2565b6000826040015186039050600081846020015102600f0b8460000151600f0b13610d48576000610d59565b81846020015102846000015103600f0b5b905080158015610d6857508886115b15610d7f57610d7642611a75565b96505050610dc2565b73ffffffffffffffffffffffffffffffffffffffff8a1660009081526008602090815260408083208a84529091529020555062093a80909401935b600101610be0565b505083546fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9290920167ffffffffffffffff90811670010000000000000000000000000000000002929092177fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff1668010000000000000000939092169290920217909155505050565b6001600255565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600560205260408120805490916801000000000000000090910467ffffffffffffffff169081610f4857429150610eb642611a9c565b83547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff919091161783557f00000000000000000000000000000000000000000000000000000000000000004211610f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6190612548565b610f9a565b814203905083610f9a576000610f5d83611a9c565b610f6642611a9c565b14905060006201518042610f7942611a75565b03109050818015610f88575080155b15610f97575050505050610412565b50505b82547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000004267ffffffffffffffff16021783556040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8716906370a082319061102c9030906004016122df565b60206040518083038186803b15801561104457600080fd5b505afa158015611058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107c9190612275565b84549091506000906110b590839070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16611aa8565b9050806110c6575050505050610412565b6fffffffffffffffffffffffffffffffff821115611110576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6190612511565b84546fffffffffffffffffffffffffffffffff808416700100000000000000000000000000000000029116178555600061114985611a9c565b73ffffffffffffffffffffffffffffffffffffffff8916600090815260066020526040812091925090815b6014811015611246578362093a80019250824210156111e4578615801561119a57508742145b156111b85760008481526020839052604090208054860190556111df565b868842038602816111c557fe5b600086815260208590526040902080549290910490910190555b611246565b861580156111f157508783145b1561120f576000848152602083905260409020805486019055611236565b8688840386028161121c57fe5b600086815260208590526040902080549290910490910190555b9196508692508291600101611174565b507f9b7f1a85a4c9b4e59e1b6527d9969c50cdfb3a1a467d0c4a51fb0ed8bf07f1308a858960405161127a939291906124e3565b60405180910390a150505050505050505050565b610518846323b872dd60e01b8585856040516024016112af93929190612300565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611ab6565b6104128183146067611946565b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600960209081526040808320938516835292905290812054801561138057905061052d565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260076020908152604080832054938716835260059091529020546113ce9167ffffffffffffffff9081169116611a85565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff1615610379576103793373ffffffffffffffffffffffffffffffffffffffff831614610191611946565b600354600061143642611a9c565b90508082118061144557504281145b15611451575050610738565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c2c4c5c16040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156114b957600080fd5b505af11580156114cd573d6000803e3d6000fd5b5050505060005b60148110156115cb57818311156114ea576115cb565b6040517fbd85b03900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063bd85b0399061155c9086906004016123f8565b60206040518083038186803b15801561157457600080fd5b505afa158015611588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ac9190612275565b60008481526004602052604090205562093a80909201916001016114d4565b5050600355565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260056020526040812081611602858561133e565b60035473ffffffffffffffffffffffffffffffffffffffff8716600090815260076020526040812054929350916116829161165c91611657919068010000000000000000900467ffffffffffffffff16611b63565b611a75565b845461167d9068010000000000000000900467ffffffffffffffff16611a9c565b611b63565b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600660209081526040808320938b16835260089091528120929350909190805b6014811015611713578486106116d457611713565b600086815260046020908152604080832054868352818420549288905292205402816116fc57fe5b62093a8097909701960491909101906001016116bf565b5073ffffffffffffffffffffffffffffffffffffffff808a166000908152600960209081526040808320938c1683529290522085905580156117e35785546fffffffffffffffffffffffffffffffff700100000000000000000000000000000000808304821684900382160291161786556117a573ffffffffffffffffffffffffffffffffffffffff89168a83611b72565b7fff097c7d8b1957a4ff09ef1361b5fb54dcede3941ba836d0beb9d10bec725de6898983886040516117da9493929190612359565b60405180910390a15b98975050505050505050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016831515179055517fac9874a7a931a3f5c9f202c6d9cf40de5d21506993c9f9c38ca8265add89584c906118709084908490612331565b60405180910390a15050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006118e9611b96565b306040516020016118fe959493929190612434565b60405160208183030381529060405280519060200120905090565b6105188484847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85611b9a565b816104125761041281611bfe565b60008282825b6080811015611a695781831061196f57611a69565b600282840181010461197f611ebb565b6040517f28d09d4700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906328d09d47906119f3908d90869060040161238f565b60806040518083038186803b158015611a0b57600080fd5b505afa158015611a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a439190612206565b905088816040015111611a5857819450611a5f565b6001820393505b505060010161195a565b50909695505050505050565b600061052d62093a7f8301611a9c565b600081831015611a95578161052a565b5090919050565b62093a80908190040290565b600061052a83836001611c6b565b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051611adf919061228d565b6000604051808303816000865af19150503d8060008114611b1c576040519150601f19603f3d011682016040523d82523d6000602084013e611b21565b606091505b50915091506000821415611b39573d6000803e3d6000fd5b610518815160001480611b5b575081806020019051810190611b5b91906121aa565b6101a2611946565b6000818310611a95578161052a565b611b918363a9059cbb60e01b84846040516024016112af92919061238f565b505050565b4690565b6000611ba585611c81565b9050611bbb611bb5878387611cba565b83611946565b611bca428410156101b8611946565b50505073ffffffffffffffffffffffffffffffffffffffff9092166000908152602081905260409020805460010190555050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6000611c7a8484111583611946565b5050900390565b6000611c8b61187c565b82604051602001611c9d9291906122a9565b604051602081830303815290604052805190602001209050919050565b6000611cdb8473ffffffffffffffffffffffffffffffffffffffff16611dc2565b15611db0576040517f1626ba7e000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff861690631626ba7e90611d36908790879060040161246d565b60206040518083038186803b158015611d4e57600080fd5b505afa158015611d62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8691906121c6565b7fffffffff0000000000000000000000000000000000000000000000000000000016149050610653565b611dbb848484611dc8565b9050610653565b3b151590565b6000611dda82516041146101b9611946565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190611e139089908590889088906124c5565b6020604051602081039080840390855afa158015611e35573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906117e357508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161498975050505050505050565b60405180608001604052806000600f0b81526020016000600f0b815260200160008152602001600081525090565b60008083601f840112611efa578182fd5b50813567ffffffffffffffff811115611f11578182fd5b6020830191508360208083028501011115611f2b57600080fd5b9250929050565b8051600f81900b811461052d57600080fd5b600060208284031215611f55578081fd5b8135610653816125f8565b600080600060408486031215611f74578182fd5b8335611f7f816125f8565b9250602084013567ffffffffffffffff811115611f9a578283fd5b611fa686828701611ee9565b9497909650939450505050565b600080600060608486031215611fc7578283fd5b8335611fd2816125f8565b9250602084810135611fe38161261a565b9250604085013567ffffffffffffffff80821115611fff578384fd5b818701915087601f830112612012578384fd5b813581811115612020578485fd5b612050847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016125a5565b91508082528884828501011115612065578485fd5b808484018584013784848284010152508093505050509250925092565b60008060408385031215612094578182fd5b823561209f816125f8565b915060208301356120af816125f8565b809150509250929050565b600080604083850312156120cc578182fd5b82356120d7816125f8565b946020939093013593505050565b600080602083850312156120f7578182fd5b823567ffffffffffffffff81111561210d578283fd5b61211985828601611ee9565b90969095509350505050565b6000806000806040858703121561213a578081fd5b843567ffffffffffffffff80821115612151578283fd5b61215d88838901611ee9565b90965094506020870135915080821115612175578283fd5b5061218287828801611ee9565b95989497509550505050565b60006020828403121561219f578081fd5b81356106538161261a565b6000602082840312156121bb578081fd5b81516106538161261a565b6000602082840312156121d7578081fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610653578182fd5b600060808284031215612217578081fd5b61222160806125a5565b61222b8484611f32565b815261223a8460208501611f32565b602082015260408301516040820152606083015160608201528091505092915050565b60006020828403121561226e578081fd5b5035919050565b600060208284031215612286578081fd5b5051919050565b6000825161229f8184602087016125cc565b9190910192915050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152606081019190915260800190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015611a69578351835292840192918401916001016123d1565b901515815260200190565b90815260200190565b93845273ffffffffffffffffffffffffffffffffffffffff92909216602084015215156040830152606082015260800190565b94855260208501939093526040840191909152606083015273ffffffffffffffffffffffffffffffffffffffff16608082015260a00190565b60008382526040602083015282518060408401526124928160608501602087016125cc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b93845260ff9290921660208401526040830152606082015260800190565b73ffffffffffffffffffffffffffffffffffffffff9390931683526020830191909152604082015260600190565b6020808252601e908201527f4d6178696d756d20746f6b656e2062616c616e63652065786365656465640000604082015260600190565b60208082526024908201527f46656520646973747269627574696f6e20686173206e6f74207374617274656460408201527f2079657400000000000000000000000000000000000000000000000000000000606082015260800190565b60405181810167ffffffffffffffff811182821017156125c457600080fd5b604052919050565b60005b838110156125e75781810151838201526020016125cf565b838111156105185750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461037957600080fd5b801515811461037957600080fdfea26469706673582212206e91ba3bf7fae396c65faebeef9a2ad330d9087256688eb7df956fb362f6a77264736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/index.ts b/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/index.ts new file mode 100644 index 0000000..717c301 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { FeeDistributorDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as FeeDistributorDeployment; + + const args = [input.VotingEscrow, input.startTime]; + await task.deployAndVerify('FeeDistributor', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/input.ts b/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/input.ts new file mode 100644 index 0000000..349cf7b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/input.ts @@ -0,0 +1,21 @@ +import { Task, TaskMode } from '@src'; + +export type FeeDistributorDeployment = { + VotingEscrow: string; + startTime: number; +}; + +const VotingEscrow = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); + +export default { + VotingEscrow, + mainnet: { + startTime: 1657756800, // Thursday, July 14 2022 00:00:00 UTC + }, + goerli: { + startTime: 1657756800, // Thursday, July 14 2022 00:00:00 UTC + }, + sepolia: { + startTime: 1683763200, // Thursday, May 11 2023 00:00:00 UTC + }, +}; diff --git a/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/output/goerli.json b/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/output/goerli.json new file mode 100644 index 0000000..2a9dbad --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/output/goerli.json @@ -0,0 +1,3 @@ +{ + "FeeDistributor": "0x42B67611B208E2e9b4CC975F6D74c87b865aE066" +} diff --git a/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/output/mainnet.json b/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/output/mainnet.json new file mode 100644 index 0000000..cfa6abc --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "FeeDistributor": "0xD3cf852898b21fc233251427c2DC93d3d604F3BB" +} diff --git a/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/output/sepolia.json b/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/output/sepolia.json new file mode 100644 index 0000000..37732ab --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "FeeDistributor": "0xA6971317Fb06c76Ef731601C64433a4846fCa707" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/readme.md b/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/readme.md new file mode 100644 index 0000000..d43a862 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/readme.md @@ -0,0 +1,11 @@ +# 2022-07-14 - Fee Distributor v2 + +Deployment of a version of FeeDistributor, responsible for distributing tokens to veBAL holders. +This version contains some bugfixes, and lets users (both EOAs and contracts) prevent others from initiating their claim process. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`FeeDistributor` artifact](./artifact/FeeDistributor.json) diff --git a/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/test/test.fork.ts b/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/test/test.fork.ts new file mode 100644 index 0000000..1c94162 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220714-fee-distributor-v2/test/test.fork.ts @@ -0,0 +1,244 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; + +import { bn, fp } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { advanceToTimestamp, currentWeekTimestamp, DAY, HOUR, WEEK } from '@helpers/time'; +import * as expectEvent from '@helpers/expectEvent'; + +import { expectTransferEvent } from '@helpers/expectTransfer'; +import { _TypedDataEncoder } from 'ethers/lib/utils'; + +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; + +describeForkTest('FeeDistributor', 'mainnet', 15130000, function () { + let veBALHolder: SignerWithAddress, + veBALHolder2: SignerWithAddress, + feeCollector: SignerWithAddress, + voterProxyAdmin: SignerWithAddress; + let distributor: Contract; + + let VEBAL: Contract, BAL: Contract, WETH: Contract, voterProxy: Contract; + + let task: Task; + + const VEBAL_HOLDER = '0xA2e7002E0FFC42e4228292D67C13a81FDd191870'; + const VEBAL_HOLDER_2 = '0x49a2dcc237a65cc1f412ed47e0594602f6141936'; + const PROTOCOL_FEE_COLLECTOR = '0xce88686553686da562ce7cea497ce749da109f9f'; + const VOTER_PROXY_ADMIN = '0x7818a1da7bd1e64c199029e86ba244a9798eee10'; + + const BAL_ADDRESS = '0xba100000625a3754423978a60c9317c58a424e3D'; + const WETH_ADDRESS = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'; + const VOTER_PROXY_ADDRESS = '0xaf52695e1bb01a16d33d7194c28c42b10e0dbec2'; + + const balAmount = fp(42); + const wethAmount = fp(5); + + let firstWeek: BigNumber; + + before('run task', async () => { + task = new Task('20220714-fee-distributor-v2', TaskMode.TEST, getForkedNetwork(hre)); + await advanceToTimestamp(1657756800 + HOUR); + await task.run({ force: true }); + distributor = await task.instanceAt('FeeDistributor', task.output({ network: 'test' }).FeeDistributor); + }); + + before('setup accounts', async () => { + veBALHolder = await impersonate(VEBAL_HOLDER); + veBALHolder2 = await impersonate(VEBAL_HOLDER_2); + feeCollector = await impersonate(PROTOCOL_FEE_COLLECTOR); + voterProxyAdmin = await impersonate(VOTER_PROXY_ADMIN); + }); + + before('setup contracts', async () => { + const veBALTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + VEBAL = await veBALTask.instanceAt('VotingEscrow', await veBALTask.output({ network: 'mainnet' }).VotingEscrow); + + // We reuse this task as it contains an ABI similar to the one in real ERC20 tokens + const testBALTokenTask = new Task('20220325-test-balancer-token', TaskMode.READ_ONLY, getForkedNetwork(hre)); + BAL = await testBALTokenTask.instanceAt('TestBalancerToken', BAL_ADDRESS); + WETH = await testBALTokenTask.instanceAt('TestBalancerToken', WETH_ADDRESS); + }); + + // These tests are the same as in the 20220420-fee-distributor task. + describe('claims', () => { + context('in the first week', () => { + before(async () => { + firstWeek = bn(task.input().startTime); + await advanceToTimestamp(firstWeek.add(DAY)); + }); + + context('with BAL distributed', () => { + before('send BAL to distribute', async () => { + await BAL.connect(feeCollector).approve(distributor.address, balAmount); + await distributor.connect(feeCollector).depositToken(BAL.address, balAmount); + }); + + it('veBAL holders cannot yet claim tokens', async () => { + const balancesBefore = await Promise.all([BAL, WETH].map((token) => token.balanceOf(veBALHolder.address))); + const tx = await distributor.claimTokens(veBALHolder.address, [BAL.address, WETH.address]); + const balancesAfter = await Promise.all([BAL, WETH].map((token) => token.balanceOf(veBALHolder.address))); + + expectEvent.notEmitted(await tx.wait(), 'TokensClaimed'); + + expect(balancesAfter).to.deep.equal(balancesBefore); + }); + }); + }); + + context('in the second week', () => { + before('advance time', async () => { + // 1 day into the second week + await advanceToTimestamp(firstWeek.add(WEEK).add(DAY)); + }); + + context('with WETH distributed', () => { + before('send BAL to distribute', async () => { + await BAL.connect(feeCollector).approve(distributor.address, balAmount.mul(3)); + await distributor.connect(feeCollector).depositToken(BAL.address, balAmount.mul(3)); + }); + + before('send WETH to distribute', async () => { + await WETH.connect(feeCollector).approve(distributor.address, wethAmount); + await distributor.connect(feeCollector).depositToken(WETH.address, wethAmount); + }); + + it('veBAL holders can claim BAL and not WETH', async () => { + const holderFirstWeekBalance = await VEBAL['balanceOf(address,uint256)'](veBALHolder.address, firstWeek); + const firstWeekSupply = await VEBAL['totalSupply(uint256)'](firstWeek); + const expectedBALAmount = balAmount.mul(holderFirstWeekBalance).div(firstWeekSupply); + + const wethBalanceBefore = await WETH.balanceOf(veBALHolder.address); + const tx = await distributor.claimTokens(veBALHolder.address, [BAL.address, WETH.address]); + const wethBalanceAfter = await WETH.balanceOf(veBALHolder.address); + + expectTransferEvent( + await tx.wait(), + { from: distributor.address, to: veBALHolder.address, value: expectedBALAmount }, + BAL.address + ); + expect(wethBalanceAfter).to.equal(wethBalanceBefore); + }); + }); + }); + + context('in the third week', () => { + before('advance time', async () => { + // 1 day into the third week + await advanceToTimestamp(firstWeek.add(2 * WEEK).add(DAY)); + }); + + it('veBAL holders can claim BAL and WETH', async () => { + const secondWeek = firstWeek.add(WEEK); + const holderSecondWeekBalance = await VEBAL['balanceOf(address,uint256)'](veBALHolder.address, secondWeek); + const secondWeekSupply = await VEBAL['totalSupply(uint256)'](secondWeek); + + const expectedBALAmount = balAmount.mul(3).mul(holderSecondWeekBalance).div(secondWeekSupply); + const expectedWETHAmount = wethAmount.mul(holderSecondWeekBalance).div(secondWeekSupply); + + const tx = await distributor.claimTokens(veBALHolder.address, [BAL.address, WETH.address]); + + expectTransferEvent( + await tx.wait(), + { from: distributor.address, to: veBALHolder.address, value: expectedBALAmount }, + BAL.address + ); + + expectTransferEvent( + await tx.wait(), + { from: distributor.address, to: veBALHolder.address, value: expectedWETHAmount }, + WETH.address + ); + }); + + it('veBAL holders can claim all the BAL and WETH at once', async () => { + const holderFirstWeekBalance = await VEBAL['balanceOf(address,uint256)'](veBALHolder2.address, firstWeek); + const firstWeekSupply = await VEBAL['totalSupply(uint256)'](firstWeek); + const balFirstWeekAmount = balAmount.mul(holderFirstWeekBalance).div(firstWeekSupply); + + const secondWeek = firstWeek.add(WEEK); + const holderSecondWeekBalance = await VEBAL['balanceOf(address,uint256)'](veBALHolder2.address, secondWeek); + const secondWeekSupply = await VEBAL['totalSupply(uint256)'](secondWeek); + const balSecondWeekAmount = balAmount.mul(3).mul(holderSecondWeekBalance).div(secondWeekSupply); + + const expectedBALAmount = balFirstWeekAmount.add(balSecondWeekAmount); + const expectedWETHAmount = wethAmount.mul(holderSecondWeekBalance).div(secondWeekSupply); + + const tx = await distributor.claimTokens(veBALHolder2.address, [BAL.address, WETH.address]); + + expectTransferEvent( + await tx.wait(), + { from: distributor.address, to: veBALHolder2.address, value: expectedBALAmount }, + BAL.address + ); + + expectTransferEvent( + await tx.wait(), + { from: distributor.address, to: veBALHolder2.address, value: expectedWETHAmount }, + WETH.address + ); + }); + }); + }); + + describe('only caller check', () => { + before('setup voter proxy', async () => { + const voterProxyABI = new ethers.utils.Interface([ + 'function isValidSignature(bytes32 _hash, bytes) view returns (bytes4)', + 'function setVote(bytes32 _hash, bool _valid)', + 'function claimFees(address _distroContract, address _token) returns (uint256)', + ]).format(); + + voterProxy = await ethers.getContractAt(voterProxyABI, VOTER_PROXY_ADDRESS); + // VoterProxy contract doesn't actually use the signature; only voting with the right hash matters. + // This hash is the distributor's outcome when enabling the caller check form the VoterProxy with the first + // available nonce. + + const domain = { + name: 'FeeDistributor', + version: '1', + chainId: (await distributor.provider.getNetwork()).chainId, + verifyingContract: distributor.address, + }; + + const types = { + SetOnlyCallerCheck: [ + { name: 'user', type: 'address' }, + { name: 'enabled', type: 'bool' }, + { name: 'nonce', type: 'uint256' }, + ], + }; + + const values = { + user: voterProxy.address, + enabled: true, + nonce: (await distributor.getNextNonce(voterProxy.address)).toString(), + }; + + await voterProxy.connect(voterProxyAdmin).setVote(_TypedDataEncoder.hash(domain, types, values), true); + await distributor.connect(voterProxyAdmin).setOnlyCallerCheckWithSignature(voterProxy.address, true, '0x'); + }); + + context('in the third week, when every token is claimable', () => { + before(async () => { + firstWeek = await currentWeekTimestamp(); + await advanceToTimestamp(firstWeek.add(2 * WEEK).add(DAY)); + }); + + it('other account cannot claim for voter proxy', async () => { + await expect(distributor.claimTokens(voterProxy.address, [BAL.address, WETH.address])).to.be.revertedWith( + 'BAL#401' + ); + }); + + it('voter proxy can claim fees', async () => { + await expect(voterProxy.connect(voterProxyAdmin).claimFees(distributor.address, BAL.address)).to.not.be + .reverted; + + await expect(voterProxy.connect(voterProxyAdmin).claimFees(distributor.address, WETH.address)).to.not.be + .reverted; + }); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20220721-balancer-queries/artifact/BalancerQueries.json b/balpy/balancer-deployments/tasks/20220721-balancer-queries/artifact/BalancerQueries.json new file mode 100644 index 0000000..1f81fff --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220721-balancer-queries/artifact/BalancerQueries.json @@ -0,0 +1,318 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BalancerQueries", + "sourceName": "contracts/BalancerQueries.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "_vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "assetInIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "assetOutIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IVault.BatchSwapStep[]", + "name": "swaps", + "type": "tuple[]" + }, + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + } + ], + "name": "queryBatchSwap", + "outputs": [ + { + "internalType": "int256[]", + "name": "assetDeltas", + "type": "int256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "minAmountsOut", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.ExitPoolRequest", + "name": "request", + "type": "tuple" + } + ], + "name": "queryExit", + "outputs": [ + { + "internalType": "uint256", + "name": "bptIn", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "maxAmountsIn", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.JoinPoolRequest", + "name": "request", + "type": "tuple" + } + ], + "name": "queryJoin", + "outputs": [ + { + "internalType": "uint256", + "name": "bptOut", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IAsset", + "name": "assetIn", + "type": "address" + }, + { + "internalType": "contract IAsset", + "name": "assetOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IVault.SingleSwap", + "name": "singleSwap", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + } + ], + "name": "querySwap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "vault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60c06040523480156200001157600080fd5b5060405162001844380380620018448339810160408190526200003491620000c9565b806001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006e57600080fd5b505afa15801562000083573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000a99190620000c9565b6001600160601b0319606091821b811660805291901b1660a05262000108565b600060208284031215620000db578081fd5b8151620000e881620000ef565b9392505050565b6001600160a01b03811681146200010557600080fd5b50565b60805160601c60a05160601c6116ef620001556000398061010652806101c9528061039c528061045f5280610693528061080b52806108a75280610919525080610bbd52506116ef6000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c8063e969f6b311610050578063e969f6b3146100a9578063f84d066e146100c9578063fbfa77cf146100e957610067565b80639ebbf05d1461006c578063c7b2c52c14610096575b600080fd5b61007f61007a366004611072565b6100fe565b60405161008d929190611622565b60405180910390f35b61007f6100a4366004611072565b610394565b6100bc6100b7366004611235565b610564565b60405161008d91906114ae565b6100dc6100d73660046110ff565b6107cb565b60405161008d919061146a565b6100f16108a5565b60405161008d9190611522565b6000606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f6c00927886040518263ffffffff1660e01b815260040161015d91906114ae565b604080518083038186803b15801561017457600080fd5b505afa158015610188573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101ac9190610eda565b509050606060006101c18987600001516108c9565b9150915060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561022d57600080fd5b505afa158015610241573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026591906110dc565b90508373ffffffffffffffffffffffffffffffffffffffff166387ec68178b8b8b87878773ffffffffffffffffffffffffffffffffffffffff166355c676286040518163ffffffff1660e01b815260040160206040518083038186803b1580156102ce57600080fd5b505afa1580156102e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030691906112ff565b8e604001516040518863ffffffff1660e01b815260040161032d97969594939291906114b7565b600060405180830381600087803b15801561034757600080fd5b505af115801561035b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103839190810190611317565b909b909a5098505050505050505050565b6000606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f6c00927886040518263ffffffff1660e01b81526004016103f391906114ae565b604080518083038186803b15801561040a57600080fd5b505afa15801561041e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104429190610eda565b509050606060006104578987600001516108c9565b9150915060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156104c357600080fd5b505afa1580156104d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104fb91906110dc565b90508373ffffffffffffffffffffffffffffffffffffffff16636028bfd48b8b8b87878773ffffffffffffffffffffffffffffffffffffffff166355c676286040518163ffffffff1660e01b815260040160206040518083038186803b1580156102ce57600080fd5b604080516002808252606080830184526000939092919060208301908036833701905050905083604001518160008151811061059c57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508360600151816001815181106105e857fe5b73ffffffffffffffffffffffffffffffffffffffff9290921660209283029190910190910152604080516001808252818301909252606091816020015b61062d610bdf565b8152602001906001900390816106255790505090506040518060a00160405280866000015181526020016000815260200160018152602001866080015181526020018660a001518152508160008151811061068457fe5b602002602001018190525060607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f84d066e87602001518486896040518563ffffffff1660e01b81526004016106f49493929190611543565b600060405180830381600087803b15801561070e57600080fd5b505af1158015610722573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261074a9190810190610fe2565b905060008660200151600181111561075e57fe5b14156107aa5761078860008260018151811061077657fe5b602002602001015113156103e7610a3d565b8060018151811061079557fe5b602002602001015160000393505050506107c5565b806000815181106107b757fe5b602002602001015193505050505b92915050565b6040517ff84d066e00000000000000000000000000000000000000000000000000000000815260609073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f84d066e90610846908890889088908890600401611543565b600060405180830381600087803b15801561086057600080fd5b505af1158015610874573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261089c9190810190610fe2565b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606060006060806108d985610a4f565b6040517ff94d466800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f94d46689061094e9089906004016114ae565b60006040518083038186803b15801561096657600080fd5b505afa15801561097a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109a29190810190610f16565b825184519297509095509193506109b99190610aff565b60005b8251811015610a335760008382815181106109d357fe5b60200260200101519050610a2a8383815181106109ec57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610208610a3d565b506001016109bc565b5050509250929050565b81610a4b57610a4b81610b0c565b5050565b606080825167ffffffffffffffff81118015610a6a57600080fd5b50604051908082528060200260200182016040528015610a94578160200160208202803683370190505b50905060005b8351811015610af857610abf848281518110610ab257fe5b6020026020010151610b79565b828281518110610acb57fe5b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600101610a9a565b5092915050565b610a4b8183146067610a3d565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6000610b8482610b9e565b610b9657610b9182610bb8565b6107c5565b6107c5610bbb565b73ffffffffffffffffffffffffffffffffffffffff161590565b90565b7f000000000000000000000000000000000000000000000000000000000000000090565b6040518060a0016040528060008019168152602001600081526020016000815260200160008152602001606081525090565b600082601f830112610c21578081fd5b8135610c34610c2f8261166a565b611643565b818152915060208083019084810181840286018201871015610c5557600080fd5b60005b84811015610c7d578135610c6b81611697565b84529282019290820190600101610c58565b505050505092915050565b600082601f830112610c98578081fd5b8135610ca6610c2f8261166a565b818152915060208083019084810181840286018201871015610cc757600080fd5b60005b84811015610c7d57813584529282019290820190600101610cca565b600082601f830112610cf6578081fd5b8151610d04610c2f8261166a565b818152915060208083019084810181840286018201871015610d2557600080fd5b60005b84811015610c7d57815184529282019290820190600101610d28565b803580151581146107c557600080fd5b600082601f830112610d64578081fd5b813567ffffffffffffffff811115610d7a578182fd5b610d8d6020601f19601f84011601611643565b9150808252836020828501011115610da457600080fd5b8060208401602084013760009082016020015292915050565b80356107c581611697565b8035600281106107c557600080fd5b600060808284031215610de8578081fd5b610df26080611643565b9050813567ffffffffffffffff80821115610e0c57600080fd5b610e1885838601610c11565b83526020840135915080821115610e2e57600080fd5b610e3a85838601610c88565b60208401526040840135915080821115610e5357600080fd5b50610e6084828501610d54565b604083015250610e738360608401610d44565b606082015292915050565b600060808284031215610e8f578081fd5b610e996080611643565b90508135610ea681611697565b8152610eb58360208401610d44565b60208201526040820135610ec881611697565b6040820152610e738360608401610d44565b60008060408385031215610eec578182fd5b8251610ef781611697565b602084015190925060038110610f0b578182fd5b809150509250929050565b600080600060608486031215610f2a578081fd5b835167ffffffffffffffff80821115610f41578283fd5b818601915086601f830112610f54578283fd5b8151610f62610c2f8261166a565b80828252602080830192508086018b828387028901011115610f82578788fd5b8796505b84871015610fad578051610f9981611697565b845260019690960195928101928101610f86565b508901519097509350505080821115610fc4578283fd5b50610fd186828701610ce6565b925050604084015190509250925092565b60006020808385031215610ff4578182fd5b825167ffffffffffffffff81111561100a578283fd5b8301601f8101851361101a578283fd5b8051611028610c2f8261166a565b8181528381019083850185840285018601891015611044578687fd5b8694505b83851015611066578051835260019490940193918501918501611048565b50979650505050505050565b60008060008060808587031215611087578182fd5b84359350602085013561109981611697565b925060408501356110a981611697565b9150606085013567ffffffffffffffff8111156110c4578182fd5b6110d087828801610dd7565b91505092959194509250565b6000602082840312156110ed578081fd5b81516110f881611697565b9392505050565b60008060008060e08587031215611114578182fd5b61111e8686610dc8565b9350602085013567ffffffffffffffff8082111561113a578384fd5b818701915087601f83011261114d578384fd5b61115a610c2f833561166a565b82358152602080820191908401865b85358110156111f4578135860160a0601f19828f03011215611189578889fd5b61119360a0611643565b6020820135815260408201356020820152606082013560408201526080820135606082015260a0820135878111156111c9578a8bfd5b6111d88f602083860101610d54565b6080830152508552506020938401939190910190600101611169565b509096505050604087013591508082111561120d578384fd5b5061121a87828801610c11565b92505061122a8660608701610e7e565b905092959194509250565b60008060a08385031215611247578182fd5b823567ffffffffffffffff8082111561125e578384fd5b9084019060c08287031215611271578384fd5b61127b60c0611643565b8235815261128c8760208501610dc8565b6020820152604083013561129f81611697565b60408201526112b18760608501610dbd565b60608201526080830135608082015260a0830135828111156112d1578586fd5b6112dd88828601610d54565b60a0830152508094505050506112f68460208501610e7e565b90509250929050565b600060208284031215611310578081fd5b5051919050565b60008060408385031215611329578182fd5b82519150602083015167ffffffffffffffff811115611346578182fd5b61135285828601610ce6565b9150509250929050565b6000815180845260208085019450808401835b838110156113a157815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010161136f565b509495945050505050565b6000815180845260208085019450808401835b838110156113a1578151875295820195908201906001016113bf565b60008151808452815b81811015611400576020818501810151868301820152016113e4565b818111156114115782602083870101525b50601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6020808252825182820181905260009190848201906040850190845b818110156114a257835183529284019291840191600101611486565b50909695505050505050565b90815260200190565b600088825273ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525060e060608301526114f660e08301876113ac565b8560808401528460a084015282810360c084015261151481856113db565b9a9950505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600060e082016115528761168a565b868352602060e08185015281875180845261010093508386019150838382028701019350828901855b828110156115fb578786037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000184528151805187528581015186880152604080820151908801526060808201519088015260809081015160a0918801829052906115e7818901836113db565b97505050928401929084019060010161157b565b50505050508281036040840152611612818661135c565b91505061089c6060830184611426565b60008382526040602083015261163b60408301846113ac565b949350505050565b60405181810167ffffffffffffffff8111828210171561166257600080fd5b604052919050565b600067ffffffffffffffff821115611680578081fd5b5060209081020190565b6002811061169457fe5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461169457600080fdfea26469706673582212207e1e917863f9f7dc841fb54e83125d1b7e455ab10a76af98d72aaf0a1494cfb264736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c8063e969f6b311610050578063e969f6b3146100a9578063f84d066e146100c9578063fbfa77cf146100e957610067565b80639ebbf05d1461006c578063c7b2c52c14610096575b600080fd5b61007f61007a366004611072565b6100fe565b60405161008d929190611622565b60405180910390f35b61007f6100a4366004611072565b610394565b6100bc6100b7366004611235565b610564565b60405161008d91906114ae565b6100dc6100d73660046110ff565b6107cb565b60405161008d919061146a565b6100f16108a5565b60405161008d9190611522565b6000606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f6c00927886040518263ffffffff1660e01b815260040161015d91906114ae565b604080518083038186803b15801561017457600080fd5b505afa158015610188573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101ac9190610eda565b509050606060006101c18987600001516108c9565b9150915060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561022d57600080fd5b505afa158015610241573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026591906110dc565b90508373ffffffffffffffffffffffffffffffffffffffff166387ec68178b8b8b87878773ffffffffffffffffffffffffffffffffffffffff166355c676286040518163ffffffff1660e01b815260040160206040518083038186803b1580156102ce57600080fd5b505afa1580156102e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030691906112ff565b8e604001516040518863ffffffff1660e01b815260040161032d97969594939291906114b7565b600060405180830381600087803b15801561034757600080fd5b505af115801561035b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103839190810190611317565b909b909a5098505050505050505050565b6000606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f6c00927886040518263ffffffff1660e01b81526004016103f391906114ae565b604080518083038186803b15801561040a57600080fd5b505afa15801561041e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104429190610eda565b509050606060006104578987600001516108c9565b9150915060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156104c357600080fd5b505afa1580156104d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104fb91906110dc565b90508373ffffffffffffffffffffffffffffffffffffffff16636028bfd48b8b8b87878773ffffffffffffffffffffffffffffffffffffffff166355c676286040518163ffffffff1660e01b815260040160206040518083038186803b1580156102ce57600080fd5b604080516002808252606080830184526000939092919060208301908036833701905050905083604001518160008151811061059c57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508360600151816001815181106105e857fe5b73ffffffffffffffffffffffffffffffffffffffff9290921660209283029190910190910152604080516001808252818301909252606091816020015b61062d610bdf565b8152602001906001900390816106255790505090506040518060a00160405280866000015181526020016000815260200160018152602001866080015181526020018660a001518152508160008151811061068457fe5b602002602001018190525060607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f84d066e87602001518486896040518563ffffffff1660e01b81526004016106f49493929190611543565b600060405180830381600087803b15801561070e57600080fd5b505af1158015610722573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261074a9190810190610fe2565b905060008660200151600181111561075e57fe5b14156107aa5761078860008260018151811061077657fe5b602002602001015113156103e7610a3d565b8060018151811061079557fe5b602002602001015160000393505050506107c5565b806000815181106107b757fe5b602002602001015193505050505b92915050565b6040517ff84d066e00000000000000000000000000000000000000000000000000000000815260609073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f84d066e90610846908890889088908890600401611543565b600060405180830381600087803b15801561086057600080fd5b505af1158015610874573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261089c9190810190610fe2565b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606060006060806108d985610a4f565b6040517ff94d466800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f94d46689061094e9089906004016114ae565b60006040518083038186803b15801561096657600080fd5b505afa15801561097a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109a29190810190610f16565b825184519297509095509193506109b99190610aff565b60005b8251811015610a335760008382815181106109d357fe5b60200260200101519050610a2a8383815181106109ec57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610208610a3d565b506001016109bc565b5050509250929050565b81610a4b57610a4b81610b0c565b5050565b606080825167ffffffffffffffff81118015610a6a57600080fd5b50604051908082528060200260200182016040528015610a94578160200160208202803683370190505b50905060005b8351811015610af857610abf848281518110610ab257fe5b6020026020010151610b79565b828281518110610acb57fe5b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600101610a9a565b5092915050565b610a4b8183146067610a3d565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6000610b8482610b9e565b610b9657610b9182610bb8565b6107c5565b6107c5610bbb565b73ffffffffffffffffffffffffffffffffffffffff161590565b90565b7f000000000000000000000000000000000000000000000000000000000000000090565b6040518060a0016040528060008019168152602001600081526020016000815260200160008152602001606081525090565b600082601f830112610c21578081fd5b8135610c34610c2f8261166a565b611643565b818152915060208083019084810181840286018201871015610c5557600080fd5b60005b84811015610c7d578135610c6b81611697565b84529282019290820190600101610c58565b505050505092915050565b600082601f830112610c98578081fd5b8135610ca6610c2f8261166a565b818152915060208083019084810181840286018201871015610cc757600080fd5b60005b84811015610c7d57813584529282019290820190600101610cca565b600082601f830112610cf6578081fd5b8151610d04610c2f8261166a565b818152915060208083019084810181840286018201871015610d2557600080fd5b60005b84811015610c7d57815184529282019290820190600101610d28565b803580151581146107c557600080fd5b600082601f830112610d64578081fd5b813567ffffffffffffffff811115610d7a578182fd5b610d8d6020601f19601f84011601611643565b9150808252836020828501011115610da457600080fd5b8060208401602084013760009082016020015292915050565b80356107c581611697565b8035600281106107c557600080fd5b600060808284031215610de8578081fd5b610df26080611643565b9050813567ffffffffffffffff80821115610e0c57600080fd5b610e1885838601610c11565b83526020840135915080821115610e2e57600080fd5b610e3a85838601610c88565b60208401526040840135915080821115610e5357600080fd5b50610e6084828501610d54565b604083015250610e738360608401610d44565b606082015292915050565b600060808284031215610e8f578081fd5b610e996080611643565b90508135610ea681611697565b8152610eb58360208401610d44565b60208201526040820135610ec881611697565b6040820152610e738360608401610d44565b60008060408385031215610eec578182fd5b8251610ef781611697565b602084015190925060038110610f0b578182fd5b809150509250929050565b600080600060608486031215610f2a578081fd5b835167ffffffffffffffff80821115610f41578283fd5b818601915086601f830112610f54578283fd5b8151610f62610c2f8261166a565b80828252602080830192508086018b828387028901011115610f82578788fd5b8796505b84871015610fad578051610f9981611697565b845260019690960195928101928101610f86565b508901519097509350505080821115610fc4578283fd5b50610fd186828701610ce6565b925050604084015190509250925092565b60006020808385031215610ff4578182fd5b825167ffffffffffffffff81111561100a578283fd5b8301601f8101851361101a578283fd5b8051611028610c2f8261166a565b8181528381019083850185840285018601891015611044578687fd5b8694505b83851015611066578051835260019490940193918501918501611048565b50979650505050505050565b60008060008060808587031215611087578182fd5b84359350602085013561109981611697565b925060408501356110a981611697565b9150606085013567ffffffffffffffff8111156110c4578182fd5b6110d087828801610dd7565b91505092959194509250565b6000602082840312156110ed578081fd5b81516110f881611697565b9392505050565b60008060008060e08587031215611114578182fd5b61111e8686610dc8565b9350602085013567ffffffffffffffff8082111561113a578384fd5b818701915087601f83011261114d578384fd5b61115a610c2f833561166a565b82358152602080820191908401865b85358110156111f4578135860160a0601f19828f03011215611189578889fd5b61119360a0611643565b6020820135815260408201356020820152606082013560408201526080820135606082015260a0820135878111156111c9578a8bfd5b6111d88f602083860101610d54565b6080830152508552506020938401939190910190600101611169565b509096505050604087013591508082111561120d578384fd5b5061121a87828801610c11565b92505061122a8660608701610e7e565b905092959194509250565b60008060a08385031215611247578182fd5b823567ffffffffffffffff8082111561125e578384fd5b9084019060c08287031215611271578384fd5b61127b60c0611643565b8235815261128c8760208501610dc8565b6020820152604083013561129f81611697565b60408201526112b18760608501610dbd565b60608201526080830135608082015260a0830135828111156112d1578586fd5b6112dd88828601610d54565b60a0830152508094505050506112f68460208501610e7e565b90509250929050565b600060208284031215611310578081fd5b5051919050565b60008060408385031215611329578182fd5b82519150602083015167ffffffffffffffff811115611346578182fd5b61135285828601610ce6565b9150509250929050565b6000815180845260208085019450808401835b838110156113a157815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010161136f565b509495945050505050565b6000815180845260208085019450808401835b838110156113a1578151875295820195908201906001016113bf565b60008151808452815b81811015611400576020818501810151868301820152016113e4565b818111156114115782602083870101525b50601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6020808252825182820181905260009190848201906040850190845b818110156114a257835183529284019291840191600101611486565b50909695505050505050565b90815260200190565b600088825273ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525060e060608301526114f660e08301876113ac565b8560808401528460a084015282810360c084015261151481856113db565b9a9950505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600060e082016115528761168a565b868352602060e08185015281875180845261010093508386019150838382028701019350828901855b828110156115fb578786037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000184528151805187528581015186880152604080820151908801526060808201519088015260809081015160a0918801829052906115e7818901836113db565b97505050928401929084019060010161157b565b50505050508281036040840152611612818661135c565b91505061089c6060830184611426565b60008382526040602083015261163b60408301846113ac565b949350505050565b60405181810167ffffffffffffffff8111828210171561166257600080fd5b604052919050565b600067ffffffffffffffff821115611680578081fd5b5060209081020190565b6002811061169457fe5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461169457600080fdfea26469706673582212207e1e917863f9f7dc841fb54e83125d1b7e455ab10a76af98d72aaf0a1494cfb264736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220721-balancer-queries/index.ts b/balpy/balancer-deployments/tasks/20220721-balancer-queries/index.ts new file mode 100644 index 0000000..0651f4f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220721-balancer-queries/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { BalancerQueriesDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as BalancerQueriesDeployment; + + const args = [input.Vault]; + await task.deployAndVerify('BalancerQueries', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20220721-balancer-queries/input.ts b/balpy/balancer-deployments/tasks/20220721-balancer-queries/input.ts new file mode 100644 index 0000000..d3b4377 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220721-balancer-queries/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type BalancerQueriesDeployment = { + Vault: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, +}; diff --git a/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/arbitrum.json b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/arbitrum.json new file mode 100644 index 0000000..2dfd757 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "BalancerQueries": "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5" +} diff --git a/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/avalanche.json b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/avalanche.json new file mode 100644 index 0000000..9f3be4f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/avalanche.json @@ -0,0 +1,3 @@ +{ + "BalancerQueries": "0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/base.json b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/base.json new file mode 100644 index 0000000..7ed468d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/base.json @@ -0,0 +1,3 @@ +{ + "BalancerQueries": "0x300Ab2038EAc391f26D9F895dc61F8F66a548833" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/bsc.json b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/bsc.json new file mode 100644 index 0000000..9c4c1d3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/bsc.json @@ -0,0 +1,3 @@ +{ + "BalancerQueries": "0x239e55F427D44C3cc793f49bFB507ebe76638a2b" +} diff --git a/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/fantom.json b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/fantom.json new file mode 100644 index 0000000..5b44248 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/fantom.json @@ -0,0 +1,3 @@ +{ + "BalancerQueries": "0x1B0A42663DF1edeA171cD8732d288a81EFfF6d23" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/gnosis.json b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/gnosis.json new file mode 100644 index 0000000..a7527df --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "BalancerQueries": "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e" +} diff --git a/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/goerli.json b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/goerli.json new file mode 100644 index 0000000..2dfd757 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/goerli.json @@ -0,0 +1,3 @@ +{ + "BalancerQueries": "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5" +} diff --git a/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/mainnet.json b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/mainnet.json new file mode 100644 index 0000000..2dfd757 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "BalancerQueries": "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5" +} diff --git a/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/mode.json b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/mode.json new file mode 100644 index 0000000..167d665 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/mode.json @@ -0,0 +1,3 @@ +{ + "BalancerQueries": "0x36caC20dd805d128c1a6Dd16eeA845C574b5A17C" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/optimism.json b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/optimism.json new file mode 100644 index 0000000..2dfd757 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/optimism.json @@ -0,0 +1,3 @@ +{ + "BalancerQueries": "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5" +} diff --git a/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/polygon.json b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/polygon.json new file mode 100644 index 0000000..2dfd757 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/polygon.json @@ -0,0 +1,3 @@ +{ + "BalancerQueries": "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5" +} diff --git a/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/sepolia.json b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/sepolia.json new file mode 100644 index 0000000..6717946 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "BalancerQueries": "0x1802953277FD955f9a254B80Aa0582f193cF1d77" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/zkevm.json b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/zkevm.json new file mode 100644 index 0000000..1f24f4f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220721-balancer-queries/output/zkevm.json @@ -0,0 +1,3 @@ +{ + "BalancerQueries": "0x809B79b53F18E9bc08A961ED4678B901aC93213a" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220721-balancer-queries/readme.md b/balpy/balancer-deployments/tasks/20220721-balancer-queries/readme.md new file mode 100644 index 0000000..93e2e74 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220721-balancer-queries/readme.md @@ -0,0 +1,20 @@ +# 2022-07-21 - Balancer Queries + +Deployment of the `BalancerQueries` contract. It provides a way to perform queries on swaps, joins and exits, simulating these operations and returning the exact +result they would have if called on the Vault given the current state. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Fantom mainnet addresses](./output/fantom.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`BalancerQueries` artifact](./artifact/BalancerQueries.json) diff --git a/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/artifact/ProtocolFeePercentagesProvider.json b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/artifact/ProtocolFeePercentagesProvider.json new file mode 100644 index 0000000..b27b356 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/artifact/ProtocolFeePercentagesProvider.json @@ -0,0 +1,267 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ProtocolFeePercentagesProvider", + "sourceName": "contracts/ProtocolFeePercentagesProvider.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "uint256", + "name": "maxYieldValue", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxAUMValue", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "feeType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "percentage", + "type": "uint256" + } + ], + "name": "ProtocolFeePercentageChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "feeType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "maximumPercentage", + "type": "uint256" + } + ], + "name": "ProtocolFeeTypeRegistered", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "feeType", + "type": "uint256" + } + ], + "name": "getFeeTypeMaximumPercentage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "feeType", + "type": "uint256" + } + ], + "name": "getFeeTypeName", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "feeType", + "type": "uint256" + } + ], + "name": "getFeeTypePercentage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "feeType", + "type": "uint256" + } + ], + "name": "isValidFeeType", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "feeType", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "isValidFeeTypePercentage", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "feeType", + "type": "uint256" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint256", + "name": "maximumValue", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "initialValue", + "type": "uint256" + } + ], + "name": "registerFeeType", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "feeType", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newValue", + "type": "uint256" + } + ], + "name": "setFeeTypePercentage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60e06040523480156200001157600080fd5b50604051620018453803806200184583398101604081905262000034916200057d565b306080526001600160601b0319606084901b1660a0526040805163d2946c2b60e01b815290516000916001600160a01b0386169163d2946c2b91600480820192602092909190829003018186803b1580156200008f57600080fd5b505afa158015620000a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000ca919062000557565b6001600160601b0319606082901b1660c052604080518082019091526005815264165a595b1960da1b60208201529091506200010c9060029085600062000277565b6200015760036040518060400160405280601781526020017f41737365747320556e646572204d616e6167656d656e740000000000000000008152508460006200027760201b60201c565b7fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5805460ff60801b1916600160801b1790556040805180820190915260048152630537761760e41b6020828101918252600080805290529051620001dd917fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb691620004c5565b507fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d805460ff60801b1916600160801b17905560408051808201909152600a815269233630b9b4102637b0b760b11b602082810191825260016000908152905290516200026c917fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7e91620004c5565b5050505050620006a4565b600082118015620002905750670de0b6b3a76400008211155b620002b85760405162461bcd60e51b8152600401620002af906200064b565b60405180910390fd5b81811115620002db5760405162461bcd60e51b8152600401620002af9062000614565b6040518060800160405280620002fc836200043f60201b620009031760201c565b6001600160401b0316815260200162000320846200043f60201b620009031760201c565b6001600160401b03908116825260016020808401829052604093840188905260008981528082528490208551815487840151968801511515600160801b0260ff60801b199787166801000000000000000002600160401b600160801b0319939097166001600160401b03199092169190911791909116949094179490941692909217835560608401518051620003bf93928501929190910190620004c5565b50905050837fe07086969b318280a21b104288d59a9c26c15ccdc203744dfe88e76b56810a768484604051620003f7929190620005b6565b60405180910390a2837f34cd0fbe9e7d58e0835610336eda810722864e47a9b1f5dc5c8f976c13c384d38260405162000431919062000682565b60405180910390a250505050565b6000620004596001600160401b038311156101ba6200045d565b5090565b816200046e576200046e8162000472565b5050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200050857805160ff191683800117855562000538565b8280016001018555821562000538579182015b82811115620005385782518255916020019190600101906200051b565b50620004599291505b8082111562000459576000815560010162000541565b60006020828403121562000569578081fd5b815162000576816200068b565b9392505050565b60008060006060848603121562000592578182fd5b83516200059f816200068b565b602085015160409095015190969495509392505050565b6000604082528351806040840152815b81811015620005e55760208187018101516060868401015201620005c6565b81811115620005f75782606083860101525b50602083019390935250601f91909101601f191601606001919050565b6020808252601a908201527f496e76616c696420696e697469616c2070657263656e74616765000000000000604082015260600190565b6020808252601e908201527f496e76616c6964206d6178696d756d206665652070657263656e746167650000604082015260600190565b90815260200190565b6001600160a01b0381168114620006a157600080fd5b50565b60805160a05160601c60c05160601c61115f620006e6600039806101fc52806102aa52806103fa52806104ac5250806107525250806106d9525061115f6000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c8063851c1bb3116100765780638d928af81161005b5780638d928af81461016d578063aaabadc514610182578063b661eda11461018a576100be565b8063851c1bb314610147578063868897a01461015a576100be565b80635e2cae4c116100a75780635e2cae4c146101015780637268d6ce1461011457806374735e0b14610127576100be565b80631a7c3263146100c35780634d44f0e9146100ec575b600080fd5b6100d66100d1366004610dc6565b6101aa565b6040516100e39190610f8b565b60405180910390f35b6100ff6100fa366004610ec6565b610330565b005b6100d661010f366004610dc6565b61056d565b6100ff610122366004610df6565b610608565b61013a610135366004610ec6565b61067f565b6040516100e39190610f80565b6100d6610155366004610d52565b6106d5565b61013a610168366004610dc6565b610727565b610175610750565b6040516100e39190610fc0565b610175610774565b61019d610198366004610dc6565b610800565b6040516100e39190610fe1565b6000816101b681610727565b6101f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ec906110bb565b60405180910390fd5b8261029f577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166355c676286040518163ffffffff1660e01b815260040160206040518083038186803b15801561026057600080fd5b505afa158015610274573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102989190610dde565b915061032a565b600183141561030e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d877845c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561026057600080fd5b60008381526020819052604090205467ffffffffffffffff1691505b50919050565b8161033a81610727565b610370576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ec906110bb565b610378610920565b610382838361067f565b6103b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ec906110f2565b82610466576040517f38e9922e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338e9922e9061042f908590600401610f8b565b600060405180830381600087803b15801561044957600080fd5b505af115801561045d573d6000803e3d6000fd5b50505050610530565b60018314156104e1576040517f6b6b9f6900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636b6b9f699061042f908590600401610f8b565b6104ea82610903565b600084815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff929092169190911790555b827f34cd0fbe9e7d58e0835610336eda810722864e47a9b1f5dc5c8f976c13c384d3836040516105609190610f8b565b60405180910390a2505050565b60008161057981610727565b6105af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ec906110bb565b826105c4576706f05b59d3b20000915061032a565b60018314156105dc57662386f26fc10000915061032a565b60008381526020819052604090205468010000000000000000900467ffffffffffffffff16915061032a565b610610610920565b600084815260208190526040902054700100000000000000000000000000000000900460ff161561066d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ec9061104d565b61067984848484610969565b50505050565b60008261068b81610727565b6106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ec906110bb565b6106ca8461056d565b909211159392505050565b60007f00000000000000000000000000000000000000000000000000000000000000008260405160200161070a929190610f50565b604051602081830303815290604052805190602001209050919050565b600090815260208190526040902054700100000000000000000000000000000000900460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061077e610750565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156107c357600080fd5b505afa1580156107d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fb9190610d92565b905090565b60608161080c81610727565b610842576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ec906110bb565b60008381526020818152604091829020600190810180548451600293821615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911692909204601f8101849004840283018401909452838252909290918301828280156108f65780601f106108cb576101008083540402835291602001916108f6565b820191906000526020600020905b8154815290600101906020018083116108d957829003601f168201915b5050505050915050919050565b600061091c67ffffffffffffffff8311156101ba610b8c565b5090565b600061094f6000357fffffffff00000000000000000000000000000000000000000000000000000000166106d5565b905061096661095e8233610b9e565b610191610b8c565b50565b6000821180156109815750670de0b6b3a76400008211155b6109b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ec90611084565b818111156109f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ec90611016565b6040518060800160405280610a0583610903565b67ffffffffffffffff168152602001610a1d84610903565b67ffffffffffffffff908116825260016020808401829052604093840188905260008981528082528490208551815487840151968801511515700100000000000000000000000000000000027fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff97871668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff939097167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092169190911791909116949094179490941692909217835560608401518051610b1093928501929190910190610ca8565b50905050837fe07086969b318280a21b104288d59a9c26c15ccdc203744dfe88e76b56810a768484604051610b46929190610ff4565b60405180910390a2837f34cd0fbe9e7d58e0835610336eda810722864e47a9b1f5dc5c8f976c13c384d382604051610b7e9190610f8b565b60405180910390a250505050565b81610b9a57610b9a81610c3b565b5050565b6000610ba8610774565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401610be493929190610f94565b60206040518083038186803b158015610bfc57600080fd5b505afa158015610c10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c349190610d32565b9392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610ce957805160ff1916838001178555610d16565b82800160010185558215610d16579182015b82811115610d16578251825591602001919060010190610cfb565b5061091c9291505b8082111561091c5760008155600101610d1e565b600060208284031215610d43578081fd5b81518015158114610c34578182fd5b600060208284031215610d63578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c34578182fd5b600060208284031215610da3578081fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610c34578182fd5b600060208284031215610dd7578081fd5b5035919050565b600060208284031215610def578081fd5b5051919050565b60008060008060808587031215610e0b578283fd5b8435935060208086013567ffffffffffffffff80821115610e2a578586fd5b818801915088601f830112610e3d578586fd5b813581811115610e4b578687fd5b604051847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401168201018181108482111715610e88578889fd5b60405281815283820185018b1015610e9e578788fd5b8185850186830137908101909301959095525093969395505050506040820135916060013590565b60008060408385031215610ed8578182fd5b50508035926020909101359150565b60008151808452815b81811015610f0c57602081850181015186830182015201610ef0565b81811115610f1d5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600060208252610c346020830184610ee7565b6000604082526110076040830185610ee7565b90508260208301529392505050565b6020808252601a908201527f496e76616c696420696e697469616c2070657263656e74616765000000000000604082015260600190565b6020808252601b908201527f466565207479706520616c726561647920726567697374657265640000000000604082015260600190565b6020808252601e908201527f496e76616c6964206d6178696d756d206665652070657263656e746167650000604082015260600190565b60208082526015908201527f4e6f6e2d6578697374656e742066656520747970650000000000000000000000604082015260600190565b60208082526016908201527f496e76616c6964206665652070657263656e746167650000000000000000000060408201526060019056fea2646970667358221220d4a176c051c464be7919ab1d23118a88aeda536f331e1c75cf625c9f1b3ae71064736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100be5760003560e01c8063851c1bb3116100765780638d928af81161005b5780638d928af81461016d578063aaabadc514610182578063b661eda11461018a576100be565b8063851c1bb314610147578063868897a01461015a576100be565b80635e2cae4c116100a75780635e2cae4c146101015780637268d6ce1461011457806374735e0b14610127576100be565b80631a7c3263146100c35780634d44f0e9146100ec575b600080fd5b6100d66100d1366004610dc6565b6101aa565b6040516100e39190610f8b565b60405180910390f35b6100ff6100fa366004610ec6565b610330565b005b6100d661010f366004610dc6565b61056d565b6100ff610122366004610df6565b610608565b61013a610135366004610ec6565b61067f565b6040516100e39190610f80565b6100d6610155366004610d52565b6106d5565b61013a610168366004610dc6565b610727565b610175610750565b6040516100e39190610fc0565b610175610774565b61019d610198366004610dc6565b610800565b6040516100e39190610fe1565b6000816101b681610727565b6101f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ec906110bb565b60405180910390fd5b8261029f577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166355c676286040518163ffffffff1660e01b815260040160206040518083038186803b15801561026057600080fd5b505afa158015610274573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102989190610dde565b915061032a565b600183141561030e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d877845c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561026057600080fd5b60008381526020819052604090205467ffffffffffffffff1691505b50919050565b8161033a81610727565b610370576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ec906110bb565b610378610920565b610382838361067f565b6103b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ec906110f2565b82610466576040517f38e9922e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906338e9922e9061042f908590600401610f8b565b600060405180830381600087803b15801561044957600080fd5b505af115801561045d573d6000803e3d6000fd5b50505050610530565b60018314156104e1576040517f6b6b9f6900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636b6b9f699061042f908590600401610f8b565b6104ea82610903565b600084815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff929092169190911790555b827f34cd0fbe9e7d58e0835610336eda810722864e47a9b1f5dc5c8f976c13c384d3836040516105609190610f8b565b60405180910390a2505050565b60008161057981610727565b6105af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ec906110bb565b826105c4576706f05b59d3b20000915061032a565b60018314156105dc57662386f26fc10000915061032a565b60008381526020819052604090205468010000000000000000900467ffffffffffffffff16915061032a565b610610610920565b600084815260208190526040902054700100000000000000000000000000000000900460ff161561066d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ec9061104d565b61067984848484610969565b50505050565b60008261068b81610727565b6106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ec906110bb565b6106ca8461056d565b909211159392505050565b60007f00000000000000000000000000000000000000000000000000000000000000008260405160200161070a929190610f50565b604051602081830303815290604052805190602001209050919050565b600090815260208190526040902054700100000000000000000000000000000000900460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061077e610750565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156107c357600080fd5b505afa1580156107d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fb9190610d92565b905090565b60608161080c81610727565b610842576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ec906110bb565b60008381526020818152604091829020600190810180548451600293821615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911692909204601f8101849004840283018401909452838252909290918301828280156108f65780601f106108cb576101008083540402835291602001916108f6565b820191906000526020600020905b8154815290600101906020018083116108d957829003601f168201915b5050505050915050919050565b600061091c67ffffffffffffffff8311156101ba610b8c565b5090565b600061094f6000357fffffffff00000000000000000000000000000000000000000000000000000000166106d5565b905061096661095e8233610b9e565b610191610b8c565b50565b6000821180156109815750670de0b6b3a76400008211155b6109b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ec90611084565b818111156109f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ec90611016565b6040518060800160405280610a0583610903565b67ffffffffffffffff168152602001610a1d84610903565b67ffffffffffffffff908116825260016020808401829052604093840188905260008981528082528490208551815487840151968801511515700100000000000000000000000000000000027fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff97871668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff939097167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092169190911791909116949094179490941692909217835560608401518051610b1093928501929190910190610ca8565b50905050837fe07086969b318280a21b104288d59a9c26c15ccdc203744dfe88e76b56810a768484604051610b46929190610ff4565b60405180910390a2837f34cd0fbe9e7d58e0835610336eda810722864e47a9b1f5dc5c8f976c13c384d382604051610b7e9190610f8b565b60405180910390a250505050565b81610b9a57610b9a81610c3b565b5050565b6000610ba8610774565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401610be493929190610f94565b60206040518083038186803b158015610bfc57600080fd5b505afa158015610c10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c349190610d32565b9392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610ce957805160ff1916838001178555610d16565b82800160010185558215610d16579182015b82811115610d16578251825591602001919060010190610cfb565b5061091c9291505b8082111561091c5760008155600101610d1e565b600060208284031215610d43578081fd5b81518015158114610c34578182fd5b600060208284031215610d63578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c34578182fd5b600060208284031215610da3578081fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610c34578182fd5b600060208284031215610dd7578081fd5b5035919050565b600060208284031215610def578081fd5b5051919050565b60008060008060808587031215610e0b578283fd5b8435935060208086013567ffffffffffffffff80821115610e2a578586fd5b818801915088601f830112610e3d578586fd5b813581811115610e4b578687fd5b604051847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401168201018181108482111715610e88578889fd5b60405281815283820185018b1015610e9e578788fd5b8185850186830137908101909301959095525093969395505050506040820135916060013590565b60008060408385031215610ed8578182fd5b50508035926020909101359150565b60008151808452815b81811015610f0c57602081850181015186830182015201610ef0565b81811115610f1d5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600060208252610c346020830184610ee7565b6000604082526110076040830185610ee7565b90508260208301529392505050565b6020808252601a908201527f496e76616c696420696e697469616c2070657263656e74616765000000000000604082015260600190565b6020808252601b908201527f466565207479706520616c726561647920726567697374657265640000000000604082015260600190565b6020808252601e908201527f496e76616c6964206d6178696d756d206665652070657263656e746167650000604082015260600190565b60208082526015908201527f4e6f6e2d6578697374656e742066656520747970650000000000000000000000604082015260600190565b60208082526016908201527f496e76616c6964206665652070657263656e746167650000000000000000000060408201526060019056fea2646970667358221220d4a176c051c464be7919ab1d23118a88aeda536f331e1c75cf625c9f1b3ae71064736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/index.ts b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/index.ts new file mode 100644 index 0000000..21e8d2f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { ProtocolFeePercentagesProviderDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as ProtocolFeePercentagesProviderDeployment; + + const args = [input.Vault, input.maxYieldValue, input.maxAUMValue]; + await task.deployAndVerify('ProtocolFeePercentagesProvider', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/input.ts b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/input.ts new file mode 100644 index 0000000..029e10c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/input.ts @@ -0,0 +1,19 @@ +import { fp } from '@helpers/numbers'; +import { Task, TaskMode } from '@src'; +import { BigNumber } from 'ethers'; + +export type ProtocolFeePercentagesProviderDeployment = { + Vault: string; + maxYieldValue: BigNumber; + maxAUMValue: BigNumber; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const maxYieldValue = fp(0.5); +const maxAUMValue = fp(0.5); + +export default { + Vault, + maxYieldValue, + maxAUMValue, +}; diff --git a/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/arbitrum.json b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/arbitrum.json new file mode 100644 index 0000000..aff08ba --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeePercentagesProvider": "0x5ef4c5352882b10893b70DbcaA0C000965bd23c5" +} diff --git a/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/avalanche.json b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/avalanche.json new file mode 100644 index 0000000..eb1d584 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/avalanche.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeePercentagesProvider": "0x239e55F427D44C3cc793f49bFB507ebe76638a2b" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/base.json b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/base.json new file mode 100644 index 0000000..ef255e2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/base.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeePercentagesProvider": "0xDEd7Fef7D8eCdcB74F22f0169e1A9EC696e6695d" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/bsc.json b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/bsc.json new file mode 100644 index 0000000..e299646 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/bsc.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeePercentagesProvider": "0xb08E16cFc07C684dAA2f93C70323BAdb2A6CBFd2" +} diff --git a/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/gnosis.json b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/gnosis.json new file mode 100644 index 0000000..c35fa8f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeePercentagesProvider": "0x41B953164995c11C81DA73D212ED8Af25741b7Ac" +} diff --git a/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/goerli.json b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/goerli.json new file mode 100644 index 0000000..0469cea --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/goerli.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeePercentagesProvider": "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e" +} diff --git a/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/mainnet.json b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/mainnet.json new file mode 100644 index 0000000..b4709aa --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeePercentagesProvider": "0x97207B095e4D5C9a6e4cfbfcd2C3358E03B90c4A" +} diff --git a/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/mode.json b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/mode.json new file mode 100644 index 0000000..411f6f0 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/mode.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeePercentagesProvider": "0x85a80afee867aDf27B50BdB7b76DA70f1E853062" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/optimism.json b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/optimism.json new file mode 100644 index 0000000..3fe1764 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/optimism.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeePercentagesProvider": "0xacAaC3e6D6Df918Bf3c809DFC7d42de0e4a72d4C" +} diff --git a/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/polygon.json b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/polygon.json new file mode 100644 index 0000000..5390caa --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/polygon.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeePercentagesProvider": "0x42AC0e6FA47385D55Aff070d79eF0079868C48a6" +} diff --git a/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/sepolia.json b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/sepolia.json new file mode 100644 index 0000000..6b4ade3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeePercentagesProvider": "0xf7D5DcE55E6D47852F054697BAB6A1B48A00ddbd" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/zkevm.json b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/zkevm.json new file mode 100644 index 0000000..28e6dda --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/output/zkevm.json @@ -0,0 +1,3 @@ +{ + "ProtocolFeePercentagesProvider": "0x1802953277FD955f9a254B80Aa0582f193cF1d77" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/readme.md b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/readme.md new file mode 100644 index 0000000..b80f3f9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/readme.md @@ -0,0 +1,18 @@ +# 2022-07-25 - Protocol Fee Percentages Provider + +Deployment of the `ProtocolFeePercentagesProvider` contract. It provides a convenient way to access Protocol Fee percentages, i.e. how much the protocol charges for performing certain actions. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`ProtocolFeePercentagesProvider` artifact](./artifact/ProtocolFeePercentagesProvider.json) diff --git a/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/test/task.fork.ts b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/test/task.fork.ts new file mode 100644 index 0000000..9265a53 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220725-protocol-fee-percentages-provider/test/task.fork.ts @@ -0,0 +1,90 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import { BigNumber, fp } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; + +import { actionId } from '@helpers/models/misc/actions'; + +import { describeForkTest, getSigner, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; + +describeForkTest('ProtocolFeePercentagesProvider', 'mainnet', 15130000, function () { + let admin: SignerWithAddress; + let protocolFeePercentagesProvider: Contract; + let vault: Contract, authorizer: Contract, feesCollector: Contract; + + let task: Task; + + enum FeeType { + Swap = 0, + FlashLoan = 1, + Yield = 2, + AUM = 3, + } + + before('run task', async () => { + task = new Task('20220725-protocol-fee-percentages-provider', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + protocolFeePercentagesProvider = await task.deployedInstance('ProtocolFeePercentagesProvider'); + }); + + before('setup accounts', async () => { + admin = await getSigner(0); + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.deployedInstance('Vault'); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + feesCollector = await vaultTask.instanceAt('ProtocolFeesCollector', await vault.getProtocolFeesCollector()); + }); + + before('setup admin', async () => { + const DEFAULT_ADMIN_ROLE = await authorizer.DEFAULT_ADMIN_ROLE(); + admin = await impersonate(await authorizer.getRoleMember(DEFAULT_ADMIN_ROLE, 0)); + }); + + context('without permissions', () => { + itRevertsSettingFee(FeeType.Yield, fp(0.0157)); + + itRevertsSettingFee(FeeType.Swap, fp(0.0126)); + }); + + context('with setFeeTypePercentage permission', () => { + before('grant setFeePercentage permission to admin', async () => { + await authorizer + .connect(admin) + .grantRole(await actionId(protocolFeePercentagesProvider, 'setFeeTypePercentage'), admin.address); + }); + + itSetsFeeCorrectly(FeeType.Yield, fp(0.1537)); + + itRevertsSettingFee(FeeType.Swap, fp(0.0857)); + + context('with swapFeePercentage permission', () => { + before('grant setSwapFeePercentage permission to fees provider', async () => { + await authorizer + .connect(admin) + .grantRole(await actionId(feesCollector, 'setSwapFeePercentage'), protocolFeePercentagesProvider.address); + }); + + itSetsFeeCorrectly(FeeType.Swap, fp(0.0951)); + }); + }); + + function itSetsFeeCorrectly(feeType: FeeType, fee: BigNumber): void { + it(`set ${FeeType[feeType]} fee`, async () => { + await protocolFeePercentagesProvider.connect(admin).setFeeTypePercentage(feeType, fee); + expect(await protocolFeePercentagesProvider.getFeeTypePercentage(feeType)).to.be.eq(fee); + }); + } + + function itRevertsSettingFee(feeType: FeeType, fee: BigNumber): void { + it(`revert setting ${FeeType[feeType]} fee`, async () => { + expect(protocolFeePercentagesProvider.connect(admin).setFeeTypePercentage(feeType, fee)).to.be.revertedWith( + 'BAL#401' + ); + }); + } +}); diff --git a/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/artifact/ChildChainGaugeRewardHelper.json b/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/artifact/ChildChainGaugeRewardHelper.json new file mode 100644 index 0000000..0617abc --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/artifact/ChildChainGaugeRewardHelper.json @@ -0,0 +1,89 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ChildChainGaugeRewardHelper", + "sourceName": "contracts/gauges/ChildChainGaugeRewardHelper.sol", + "abi": [ + { + "inputs": [], + "name": "CLAIM_FREQUENCY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRewardsOnlyGauge", + "name": "gauge", + "type": "address" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "claimRewardsFromGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRewardsOnlyGauge[]", + "name": "gauges", + "type": "address[]" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "claimRewardsFromGauges", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IRewardsOnlyGauge", + "name": "gauge", + "type": "address" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "getPendingRewards", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b506105ed806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80635db749491461005157806371d5065c1461007a578063c2ec33b51461008f578063ff98f88d146100a2575b600080fd5b61006461005f3660046104ea565b6100aa565b6040516100719190610589565b60405180910390f35b61008d6100883660046104b2565b610237565b005b61008d61009d3660046103f3565b610245565b610064610288565b60008373ffffffffffffffffffffffffffffffffffffffff1663bf88a6ff6040518163ffffffff1660e01b815260040160206040518083038186803b1580156100f257600080fd5b505afa158015610106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061012a9190610473565b73ffffffffffffffffffffffffffffffffffffffff16631afe22a66040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561017157600080fd5b505af1158015610185573d6000803e3d6000fd5b50506040517f59b7e40900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871692506359b7e40991506101dd9086908690600401610562565b602060405180830381600087803b1580156101f757600080fd5b505af115801561020b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061022f9190610529565b949350505050565b610241828261028e565b5050565b60005b828110156102825761027a84848381811061025f57fe5b90506020020160208101906102749190610496565b8361028e565b600101610248565b50505050565b610e1081565b8173ffffffffffffffffffffffffffffffffffffffff1663bf88a6ff6040518163ffffffff1660e01b815260040160206040518083038186803b1580156102d457600080fd5b505afa1580156102e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030c9190610473565b73ffffffffffffffffffffffffffffffffffffffff16631afe22a66040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561035357600080fd5b505af1158015610367573d6000803e3d6000fd5b50506040517f84e9bd7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851692506384e9bd7e91506103bd908490600401610541565b600060405180830381600087803b1580156103d757600080fd5b505af11580156103eb573d6000803e3d6000fd5b505050505050565b600080600060408486031215610407578283fd5b833567ffffffffffffffff8082111561041e578485fd5b818601915086601f830112610431578485fd5b81358181111561043f578586fd5b8760208083028501011115610452578586fd5b6020928301955093505084013561046881610592565b809150509250925092565b600060208284031215610484578081fd5b815161048f81610592565b9392505050565b6000602082840312156104a7578081fd5b813561048f81610592565b600080604083850312156104c4578182fd5b82356104cf81610592565b915060208301356104df81610592565b809150509250929050565b6000806000606084860312156104fe578283fd5b833561050981610592565b9250602084013561051981610592565b9150604084013561046881610592565b60006020828403121561053a578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff811681146105b457600080fd5b5056fea2646970667358221220618a016f9f5f617a2dc22c26b5f542fba6f244a263be60b7ec1b49e36bce326564736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80635db749491461005157806371d5065c1461007a578063c2ec33b51461008f578063ff98f88d146100a2575b600080fd5b61006461005f3660046104ea565b6100aa565b6040516100719190610589565b60405180910390f35b61008d6100883660046104b2565b610237565b005b61008d61009d3660046103f3565b610245565b610064610288565b60008373ffffffffffffffffffffffffffffffffffffffff1663bf88a6ff6040518163ffffffff1660e01b815260040160206040518083038186803b1580156100f257600080fd5b505afa158015610106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061012a9190610473565b73ffffffffffffffffffffffffffffffffffffffff16631afe22a66040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561017157600080fd5b505af1158015610185573d6000803e3d6000fd5b50506040517f59b7e40900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871692506359b7e40991506101dd9086908690600401610562565b602060405180830381600087803b1580156101f757600080fd5b505af115801561020b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061022f9190610529565b949350505050565b610241828261028e565b5050565b60005b828110156102825761027a84848381811061025f57fe5b90506020020160208101906102749190610496565b8361028e565b600101610248565b50505050565b610e1081565b8173ffffffffffffffffffffffffffffffffffffffff1663bf88a6ff6040518163ffffffff1660e01b815260040160206040518083038186803b1580156102d457600080fd5b505afa1580156102e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030c9190610473565b73ffffffffffffffffffffffffffffffffffffffff16631afe22a66040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561035357600080fd5b505af1158015610367573d6000803e3d6000fd5b50506040517f84e9bd7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851692506384e9bd7e91506103bd908490600401610541565b600060405180830381600087803b1580156103d757600080fd5b505af11580156103eb573d6000803e3d6000fd5b505050505050565b600080600060408486031215610407578283fd5b833567ffffffffffffffff8082111561041e578485fd5b818601915086601f830112610431578485fd5b81358181111561043f578586fd5b8760208083028501011115610452578586fd5b6020928301955093505084013561046881610592565b809150509250925092565b600060208284031215610484578081fd5b815161048f81610592565b9392505050565b6000602082840312156104a7578081fd5b813561048f81610592565b600080604083850312156104c4578182fd5b82356104cf81610592565b915060208301356104df81610592565b809150509250929050565b6000806000606084860312156104fe578283fd5b833561050981610592565b9250602084013561051981610592565b9150604084013561046881610592565b60006020828403121561053a578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff811681146105b457600080fd5b5056fea2646970667358221220618a016f9f5f617a2dc22c26b5f542fba6f244a263be60b7ec1b49e36bce326564736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/index.ts b/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/index.ts new file mode 100644 index 0000000..93193bd --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/index.ts @@ -0,0 +1,5 @@ +import { Task, TaskRunOptions } from '@src'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + await task.deployAndVerify('ChildChainGaugeRewardHelper', [], from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/output/arbitrum.json b/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/output/arbitrum.json new file mode 100644 index 0000000..e2e97a1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "ChildChainGaugeRewardHelper": "0xA0DAbEBAAd1b243BBb243f933013d560819eB66f" +} diff --git a/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/output/avalanche.json b/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/output/avalanche.json new file mode 100644 index 0000000..1ed873b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/output/avalanche.json @@ -0,0 +1,3 @@ +{ + "ChildChainGaugeRewardHelper": "0x2E96068b3D5B5BAE3D7515da4A1D2E52d08A2647" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/output/gnosis.json b/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/output/gnosis.json new file mode 100644 index 0000000..bb27e03 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "ChildChainGaugeRewardHelper": "0xf7D5DcE55E6D47852F054697BAB6A1B48A00ddbd" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/output/goerli.json b/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/output/goerli.json new file mode 100644 index 0000000..4962fc4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/output/goerli.json @@ -0,0 +1,3 @@ +{ + "ChildChainGaugeRewardHelper": "0xC128a9954e6c874eA3d62ce62B468bA073093F25" +} diff --git a/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/output/optimism.json b/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/output/optimism.json new file mode 100644 index 0000000..0f7711f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/output/optimism.json @@ -0,0 +1,3 @@ +{ + "ChildChainGaugeRewardHelper": "0x8aB784368A1883DA90D8513b48801e2Db1cb2D5D" +} diff --git a/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/output/polygon.json b/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/output/polygon.json new file mode 100644 index 0000000..fd5bf04 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/output/polygon.json @@ -0,0 +1,3 @@ +{ + "ChildChainGaugeRewardHelper": "0xaEb406b0E430BF5Ea2Dc0B9Fe62E4E53f74B3a33" +} diff --git a/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/readme.md b/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/readme.md new file mode 100644 index 0000000..84e5180 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220812-child-chain-reward-helper/readme.md @@ -0,0 +1,13 @@ +# 2022-08-12 - Child Chain Gauge Reward Helper + +Deployment of the `ChildChainGaugeRewardHelper`, a helper contract that can be used to both query and claim child chain gauge tokens instantly, without waiting for the standard one-hour period. + +## Useful Files + +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`ChildChainGaugeRewardHelper` artifact](./artifact/ChildChainGaugeRewardHelper.json) diff --git a/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/artifact/LiquidityGaugeFactory.json b/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/artifact/LiquidityGaugeFactory.json new file mode 100644 index 0000000..ed5b1ce --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/artifact/LiquidityGaugeFactory.json @@ -0,0 +1,91 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "LiquidityGaugeFactory", + "sourceName": "contracts/gauges/ethereum/LiquidityGaugeFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IStakingLiquidityGauge", + "name": "gauge", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "GaugeCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + }, + { + "internalType": "uint256", + "name": "relativeWeightCap", + "type": "uint256" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeImplementation", + "outputs": [ + { + "internalType": "contract ILiquidityGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "isGaugeFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5060405161049c38038061049c83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b61040b806100916000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80630ecaea731461004657806339312dee1461006f578063ce3cc8bd14610077575b600080fd5b610059610054366004610322565b610097565b604051610066919061034c565b60405180910390f35b610059610135565b61008a610085366004610300565b610151565b6040516100669190610393565b6000806100a2610180565b6040517fcd6dc68700000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063cd6dc687906100f9908790879060040161036d565b600060405180830381600087803b15801561011357600080fd5b505af1158015610127573d6000803e3d6000fd5b509293505050505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff165b919050565b6000805481906101a59073ffffffffffffffffffffffffffffffffffffffff16610226565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff811661017b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d39061039e565b60405180910390fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461012f57600080fd5b600060208284031215610311578081fd5b61031b83836102dc565b9392505050565b60008060408385031215610334578081fd5b61033e84846102dc565b946020939093013593505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b60208082526016908201527f455243313136373a20637265617465206661696c65640000000000000000000060408201526060019056fea26469706673582212209ffe9af57bfc53bc361c02d5fbc8fdfc432a2be95afb2fe86dc05ba2cbb2402a64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80630ecaea731461004657806339312dee1461006f578063ce3cc8bd14610077575b600080fd5b610059610054366004610322565b610097565b604051610066919061034c565b60405180910390f35b610059610135565b61008a610085366004610300565b610151565b6040516100669190610393565b6000806100a2610180565b6040517fcd6dc68700000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063cd6dc687906100f9908790879060040161036d565b600060405180830381600087803b15801561011357600080fd5b505af1158015610127573d6000803e3d6000fd5b509293505050505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff165b919050565b6000805481906101a59073ffffffffffffffffffffffffffffffffffffffff16610226565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff811661017b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d39061039e565b60405180910390fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461012f57600080fd5b600060208284031215610311578081fd5b61031b83836102dc565b9392505050565b60008060408385031215610334578081fd5b61033e84846102dc565b946020939093013593505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b60208082526016908201527f455243313136373a20637265617465206661696c65640000000000000000000060408201526060019056fea26469706673582212209ffe9af57bfc53bc361c02d5fbc8fdfc432a2be95afb2fe86dc05ba2cbb2402a64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/artifact/LiquidityGaugeV5.json b/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/artifact/LiquidityGaugeV5.json new file mode 100644 index 0000000..c6f3480 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/artifact/LiquidityGaugeV5.json @@ -0,0 +1,1084 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "LiquidityGaugeV5", + "sourceName": "@balancer-labs/liquidity-mining/contracts/LiquidityGaugeV5.vy", + "abi": [ + { + "name": "Deposit", + "inputs": [ + { + "name": "provider", + "type": "address", + "indexed": true + }, + { + "name": "value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Withdraw", + "inputs": [ + { + "name": "provider", + "type": "address", + "indexed": true + }, + { + "name": "value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "UpdateLiquidityLimit", + "inputs": [ + { + "name": "user", + "type": "address", + "indexed": true + }, + { + "name": "original_balance", + "type": "uint256", + "indexed": false + }, + { + "name": "original_supply", + "type": "uint256", + "indexed": false + }, + { + "name": "working_balance", + "type": "uint256", + "indexed": false + }, + { + "name": "working_supply", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Transfer", + "inputs": [ + { + "name": "_from", + "type": "address", + "indexed": true + }, + { + "name": "_to", + "type": "address", + "indexed": true + }, + { + "name": "_value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Approval", + "inputs": [ + { + "name": "_owner", + "type": "address", + "indexed": true + }, + { + "name": "_spender", + "type": "address", + "indexed": true + }, + { + "name": "_value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "RewardDistributorUpdated", + "inputs": [ + { + "name": "reward_token", + "type": "address", + "indexed": true + }, + { + "name": "distributor", + "type": "address", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "RelativeWeightCapChanged", + "inputs": [ + { + "name": "new_relative_weight_cap", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "stateMutability": "nonpayable", + "type": "constructor", + "inputs": [ + { + "name": "minter", + "type": "address" + }, + { + "name": "veBoostProxy", + "type": "address" + }, + { + "name": "authorizerAdaptor", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit", + "inputs": [ + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit", + "inputs": [ + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_addr", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit", + "inputs": [ + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_addr", + "type": "address" + }, + { + "name": "_claim_rewards", + "type": "bool" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "withdraw", + "inputs": [ + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "withdraw", + "inputs": [ + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_claim_rewards", + "type": "bool" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claim_rewards", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claim_rewards", + "inputs": [ + { + "name": "_addr", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claim_rewards", + "inputs": [ + { + "name": "_addr", + "type": "address" + }, + { + "name": "_receiver", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "transfer", + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "permit", + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_deadline", + "type": "uint256" + }, + { + "name": "_v", + "type": "uint8" + }, + { + "name": "_r", + "type": "bytes32" + }, + { + "name": "_s", + "type": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "increaseAllowance", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_added_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "decreaseAllowance", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_subtracted_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "user_checkpoint", + "inputs": [ + { + "name": "addr", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "set_rewards_receiver", + "inputs": [ + { + "name": "_receiver", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "kick", + "inputs": [ + { + "name": "addr", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit_reward_token", + "inputs": [ + { + "name": "_reward_token", + "type": "address" + }, + { + "name": "_amount", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "add_reward", + "inputs": [ + { + "name": "_reward_token", + "type": "address" + }, + { + "name": "_distributor", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "set_reward_distributor", + "inputs": [ + { + "name": "_reward_token", + "type": "address" + }, + { + "name": "_distributor", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "killGauge", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "unkillGauge", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "claimed_reward", + "inputs": [ + { + "name": "_addr", + "type": "address" + }, + { + "name": "_token", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "claimable_reward", + "inputs": [ + { + "name": "_user", + "type": "address" + }, + { + "name": "_reward_token", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claimable_tokens", + "inputs": [ + { + "name": "addr", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_checkpoint", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "future_epoch_time", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "inflation_rate", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "decimals", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "version", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "allowance", + "inputs": [ + { + "name": "owner", + "type": "address" + }, + { + "name": "spender", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "_lp_token", + "type": "address" + }, + { + "name": "relative_weight_cap", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "setRelativeWeightCap", + "inputs": [ + { + "name": "relative_weight_cap", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "getRelativeWeightCap", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "getCappedRelativeWeight", + "inputs": [ + { + "name": "time", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "pure", + "type": "function", + "name": "getMaxRelativeWeightCap", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "DOMAIN_SEPARATOR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "nonces", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "lp_token", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "is_killed", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_count", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_data", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "components": [ + { + "name": "token", + "type": "address" + }, + { + "name": "distributor", + "type": "address" + }, + { + "name": "period_finish", + "type": "uint256" + }, + { + "name": "rate", + "type": "uint256" + }, + { + "name": "last_update", + "type": "uint256" + }, + { + "name": "integral", + "type": "uint256" + } + ] + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "rewards_receiver", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_integral_for", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "working_balances", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "working_supply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_inv_supply_of", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_checkpoint_of", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_fraction", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "period", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "int128" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_tokens", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "period_timestamp", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_inv_supply", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + } + ], + "bytecode": "0x6020612fa26080396080518060a01c612f9d5760e05260206020612fa2016080396080518060a01c612f9d576101005260206040612fa2016080396080518060a01c612f9d57610120526358de9ade610160526020610160600461017c60e0515afa610070573d600060003e3d6000fd5b601f3d1115612f9d57610160518060a01c612f9d576101405263e6dec36f610180526020610180600461019c60e0515afa6100b0573d600060003e3d6000fd5b601f3d1115612f9d57610180518060a01c612f9d57610160526101605161018052638d928af86101a05260206101a060046101bc610160515afa6100f9573d600060003e3d6000fd5b601f3d1115612f9d576101a0518060a01c612f9d576101e052610120516101a052610140516101c05260e0516102005263dfe05031610220526020610220600461023c610140515afa610151573d600060003e3d6000fd5b601f3d1115612f9d57610220518060a01c612f9d5761026052610100516102205261dead600c55612f3956600436101561000d57611edd565b60046000601c3760005134612db75763b6b55f258118610037573361040052600061042052610086565b636e553f65811861005c576024358060a01c612db75761040052600061042052610086565b6383df67478118610221576024358060a01c612db757610400526044358060011c612db757610420525b600054612db757600160005561040051610160526100a2611fb7565b6000600435146101b4576000600f541415610440526002546104605261044051156100ec576104005160e052610460516101005261042051610120526000610140526100ec612529565b61046080516004358181830110612db7578082019050905081525060016104005160a0526080526040608020546004358181830110612db75780820190509050610480526104805160016104005160a052608052604060802055610460516002556104005160e0526104805161010052610460516101205261016c612956565b6323b872dd6104a052336104c052306104e0526004356105005260206104a060646104bc6000600c545af16101a6573d600060003e3d6000fd5b601f3d1115612db7576104a0505b610400517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c600435610440526020610440a26104005160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600435610440526020610440a36000600055005b632e1a7d4d811861023757600061040052610252565b6338d0743681186103cf576024358060011c612db757610400525b600054612db7576001600055336101605261026b611fb7565b600060043514610368576000600f541415610420526002546104405261042051156102b2573360e052610440516101005261040051610120526000610140526102b2612529565b6104408051600435808210612db7578082039050905081525060013360a052608052604060802054600435808210612db75780820390509050610460526104605160013360a052608052604060802055610440516002553360e05261046051610100526104405161012052610325612956565b63a9059cbb61048052336104a0526004356104c0526020610480604461049c6000600c545af161035a573d600060003e3d6000fd5b601f3d1115612db757610480505b337f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364600435610420526020610420a26000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600435610420526020610420a36000600055005b63e6f1daf281186103ea573361040052600061042052610439565b6384e9bd7e811861040f576004358060a01c612db75761040052600061042052610439565b639faceb1b8118610486576004358060a01c612db757610400526024358060a01c612db757610420525b600054612db75760016000556000610420511461045b57336104005118612db7575b6104005160e05260025461010052600161012052610420516101405261047f612529565b6000600055005b6323b872dd8118610569576004358060a01c612db7576104c0526024358060a01c612db7576104e052600054612db75760016000556104c05160e05233610100526104d2610520611ee3565b61052051610500527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61050051146105385761050051604435808210612db7578082039050905060036104c05160a05260805260406080203360a0526080526040608020555b6104c051610400526104e0516104205260443561044052610557612b40565b60016105205260206105206000600055f35b63a9059cbb81186105bd576004358060a01c612db7576104c052600054612db757600160005533610400526104c05161042052602435610440526105ab612b40565b60016104e05260206104e06000600055f35b63095ea7b38118610635576004358060a01c612db75760e05260243560033360a052608052604060802060e05160a05260805260406080205560e051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602435610100526020610100a36001610100526020610100f35b63d505accf81186109a2576004358060a01c612db75760e0526024358060a01c612db757610100526084358060081c612db75761012052600060e05114612db7576064354211612db757600b60e05160a0526080526040608020546101405260006002610400527f1901000000000000000000000000000000000000000000000000000000000000610420526104006002806020846106000101826020850160045afa505080518201915050600a546020826106000101526020810190507f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96105405260e0516105605261010051610580526044356105a052610140516105c0526064356105e05260c0610520526105208051602082012090506020826106000101526020810190508061060052610600905080516020820120905061016052600060e0513b116107b65760e0516101605161018052610120516101a052604060a46101c03760206080608061018060015afa5060805118612db757610916565b600060a4356102205260c435610240526040610200526102006040806020846102c00101826020850160045afa505080518201915050601f60016020820661026001602082840111612db7576020806102808261012060045afa5050818152905090506001806020846102c00101826020850160045afa505080518201915050806102c0526102c09050805160200180610180828460045afa905050507f1626ba7e00000000000000000000000000000000000000000000000000000000631626ba7e610200526102208060406101605182526020820191508082528083018061018080516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810150505050602061020060c461021c60e0515afa610903573d600060003e3d6000fd5b601f3d1115612db7576102005118612db7575b604435600360e05160a05260805260406080206101005160a0526080526040608020556101405160018181830110612db75780820190509050600b60e05160a0526080526040608020556101005160e0517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925604435610180526020610180a36001610180526020610180f35b63395093518118610a51576004358060a01c612db757610120523360e05261012051610100526109d3610160611ee3565b610160516024358181830110612db75780820190509050610140526101405160033360a05260805260406080206101205160a05260805260406080205561012051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92561014051610160526020610160a36001610160526020610160f35b63a457c2d78118610afe576004358060a01c612db757610120523360e0526101205161010052610a82610160611ee3565b61016051602435808210612db75780820390509050610140526101405160033360a05260805260406080206101205160a05260805260406080205561012051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92561014051610160526020610160a36001610160526020610160f35b634b8200938118610bc3576004358060a01c612db7576103405261034051610380526020606038036080396080516103a05260006103605261036060c060006002818352015b60c05160200261038001513318610b5e5760018352610b6e565b8151600101808352811415610b44575b5050506103605115612db7576103405161016052610b8a611fb7565b6103405160e05260016103405160a0526080526040608020546101005260025461012052610bb6612956565b6001610360526020610360f35b63bdf981168118610bf0576004358060a01c612db75760e05260e05160113360a052608052604060802055005b6396c551758118610da1576004358060a01c612db7576103405260176103405160a0526080526040608020546103605263da020a186103e052610340516104005263010ae7576103a052610340516103c05260206103a060246103bc6020604038036080396080515afa610c69573d600060003e3d6000fd5b601f3d1115612db7576103a0516104205260206103e060446103fc6020604038036080396080515afa610ca1573d600060003e3d6000fd5b601f3d1115612db7576103e0516103805260016103405160a0526080526040608020546103a0526370a082316104005261034051610420526020610400602461041c6020604038036080396080515afa610d00573d600060003e3d6000fd5b601f3d1115612db7576104005115610d2057610360516103805111610d23565b60015b15612db7576103a0516028808202821582848304141715612db7579050905060648082049050905060146103405160a0526080526040608020541115612db7576103405161016052610d73611fb7565b6103405160e05260016103405160a0526080526040608020546101005260025461012052610d9f612956565b005b6393f7aa678118610fb3576004358060a01c612db75761040052600054612db7576001600055600160106104005160a052608052604060802001543318612db757600060e05260025461010052600061012052600061014052610e02612529565b6323b872dd6104645260043361048452306104a4526024356104c45260600161046052610460506020610520610460516104806000610400515af1610e4c573d600060003e3d6000fd5b61050060203d808211610e5f5781610e61565b805b905090508152805160200180610420828460045afa9050505060006104205114610ea057610440516104205181816020036008021c9050905015612db7575b600260106104005160a052608052604060802001546104605261046051421015610f48576104605142808210612db757808203905090506104805261048051600360106104005160a05260805260406080200154808202821582848304141715612db757905090506104a0526024356104a0518181830110612db7578082019050905062093a8080820490509050600360106104005160a05260805260406080200155610f6c565b60243562093a8080820490509050600360106104005160a052608052604060802001555b42600460106104005160a052608052604060802001554262093a808181830110612db75780820190509050600260106104005160a052608052604060802001556000600055005b63e8de0d4d811861109f576004358060a01c612db75760e0526024358060a01c612db7576101005260006101005114612db757602060a038036080396080513318612db757600f54610120526008610120511015612db7576001601060e05160a05260805260406080200154612db757610100516001601060e05160a0526080526040608020015560e0516001610120516008811015612db75702601a01556101205160018181830110612db75780820190509050600f5560e0517f1df95772db25c427e0df149fe4cd5b7c2e970e096ee7305ff86f6e1167281d7b61010051610140526020610140a2005b63058a3a248118611166576004358060a01c612db75760e0526024358060a01c612db757610100526001601060e05160a05260805260406080200154610120526101205133186110f05760016110ff565b602060a0380360803960805133145b15612db75760006101205114612db75760006101005114612db757610100516001601060e05160a0526080526040608020015560e0517f1df95772db25c427e0df149fe4cd5b7c2e970e096ee7305ff86f6e1167281d7b61010051610140526020610140a2005b63ab8f0945811861118a57602060a038036080396080513318612db7576001600d55005b63d34fb26781186111ae57602060a038036080396080513318612db7576000600d55005b63e77e7437811861121a576004358060a01c612db75760e0526024358060a01c612db75761010052601360e05160a05260805260406080206101005160a05260805260406080205470010000000000000000000000000000000080820690509050610120526020610120f35b6333fd6f7481186113ee576004358060a01c612db75760e0526024358060a01c612db75761010052600560106101005160a052608052604060802001546101205260025461014052600061014051146113395742600260106101005160a052608052604060802001548082116112905781611292565b805b905090506101605261016051600460106101005160a05260805260406080200154808210612db7578082039050905061018052610120805161018051600360106101005160a05260805260406080200154808202821582848304141715612db75790509050670de0b6b3a7640000808202821582848304141715612db7579050905061014051808015612db7578204905090508181830110612db757808201905090508152505b60126101005160a052608052604060802060e05160a05260805260406080205461016052600160e05160a0526080526040608020546101205161016051808210612db75780820390509050808202821582848304141715612db75790509050670de0b6b3a76400008082049050905061018052601360e05160a05260805260406080206101005160a05260805260406080205460801c610180518181830110612db757808201905090506101a05260206101a0f35b6333134583811861148d576004358060a01c612db757610340526103405161016052611418611fb7565b60186103405160a052608052604060802054638b752bb0610360526103405161038052306103a0526020610360604461037c6020606038036080396080515afa611467573d600060003e3d6000fd5b601f3d1115612db75761036051808210612db757808203905090506103c05260206103c0f35b63d31f3f6d81186114c05760016019546c01431e0fae6d7217caa0000000811015612db757026022015460e052602060e0f35b63be5d1be981186114da57600e5460d81c60e052602060e0f35b63180692d0811861151557600e547b010000000000000000000000000000000000000000000000000000008082069050905060e052602060e0f35b63313ce567811861152b57601260e052602060e0f35b6354fd4d5081186115c557610120806020808252600660e0527f76352e302e3000000000000000000000000000000000000000000000000000006101005260e0818401808280516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f82010390509050905090508101905090509050610120f35b63dd62ed3e8118611617576004358060a01c612db757610120526024358060a01c612db757610140526101205160e0526101405161010052611608610160611ee3565b61016051610180526020610180f35b63cd6dc6878118611999576004358060a01c612db75761016052600c54612db75761016051600c556395d89b416101c05260606101c060046101dc610160515afa611667573d600060003e3d6000fd5b603f3d1115612db7576101c0516101c0016020815111612db75780805160200180610180828460045afa90509050505060006009610220527f42616c616e636572200000000000000000000000000000000000000000000000610240526102206009806020846102a00101826020850160045afa5050805182019150506101806020806020846102a00101826020850160045afa505080518201915050600e610260527f204761756765204465706f73697400000000000000000000000000000000000061028052610260600e806020846102a00101826020850160045afa505080518201915050806102a0526102a090508051602001806101c0828460045afa905050506101c0806004602082510160c060006003818352015b8260c0516020021115611794576117b3565b60c05160200285015160c0518501558151600101808352811415611782575b50505050505060006101806020806020846102600101826020850160045afa5050805182019150506006610220527f2d67617567650000000000000000000000000000000000000000000000000000610240526102206006806020846102600101826020850160045afa50508051820191505080610260526102609050806007602082510160c060006003818352015b8260c051602002111561185557611874565b60c05160200285015160c0518501558151600101808352811415611843575b5050505050507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610300526101c0805160208201209050610320527f572f01d824885a118d5d21c74542f263b131d2897955c62a721594f1d7c3b2e2610340524661036052306103805260a06102e0526102e0805160208201209050600a554260225563b26b238e610220526020610220600461023c6000602060e038036080396080515af1611929573d600060003e3d6000fd5b601f3d1115612db7576102205160d81b632c4e722e610260526020610260600461027c602060e038036080396080515afa611969573d600060003e3d6000fd5b601f3d1115612db757610260518181830110612db75780820190509050600e5560243560e052611997612cca565b005b6310d3eb0481186119c657602060a038036080396080513318612db75760043560e0526119c4612cca565b005b6383f5c39b81186119e9576c02863c1f5cdae42000000000225460e052602060e0f35b6314e956f58118611a145760043560e052611a05610160611f47565b61016051610180526020610180f35b633547bc7d8118611a3157670de0b6b3a764000060e052602060e0f35b6370a082318118611a66576004358060a01c612db75760e052600160e05160a052608052604060802054610100526020610100f35b6318160ddd8118611a7d5760025460e052602060e0f35b6306fdde038118611b205760e08060208082528083018060048082602082540160c060006003818352015b8260c0516020021115611aba57611ad9565b60c05185015460c0516020028501528151600101808352811415611aa8575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810190509050905060e0f35b6395d89b418118611bc35760e08060208082528083018060078082602082540160c060006003818352015b8260c0516020021115611b5d57611b7c565b60c05185015460c0516020028501528151600101808352811415611b4b575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810190509050905060e0f35b633644e5158118611bda57600a5460e052602060e0f35b637ecebe008118611c0f576004358060a01c612db75760e052600b60e05160a052608052604060802054610100526020610100f35b6382c630668118611c2657600c5460e052602060e0f35b639c868ac08118611c3d57600d5460e052602060e0f35b63963c94b98118611c5457600f5460e052602060e0f35b6348e9c65e8118611cb8576004358060a01c612db75760e052601060e05160a052608052604060802080546101005260018101546101205260028101546101405260038101546101605260048101546101805260058101546101a0525060c0610100f35b6301ddabf18118611ced576004358060a01c612db75760e052601160e05160a052608052604060802054610100526020610100f35b63f05cc0588118611d40576004358060a01c612db75760e0526024358060a01c612db75761010052601260e05160a05260805260406080206101005160a052608052604060802054610120526020610120f35b6313ecb1ca8118611d75576004358060a01c612db75760e052601460e05160a052608052604060802054610100526020610100f35b6317e280898118611d8c5760155460e052602060e0f35b63de263bfa8118611dc1576004358060a01c612db75760e052601660e05160a052608052604060802054610100526020610100f35b639bd324f28118611df6576004358060a01c612db75760e052601760e05160a052608052604060802054610100526020610100f35b63094007078118611e2b576004358060a01c612db75760e052601860e05160a052608052604060802054610100526020610100f35b63ef78d4fd8118611e425760195460e052602060e0f35b6354c49fe98118611e695760016004356008811015612db75702601a015460e052602060e0f35b637598108c8118611e9c5760016004356c01431e0fae6d7217caa0000000811015612db757026022015460e052602060e0f35b63fec8ee0c8118611edb5760016004356c01431e0fae6d7217caa0000000811015612db757026c01431e0fae6d72100000000022015460e052602060e0f35b505b60006000fd5b602060c038036080396080516101005118611f21577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815250611f45565b600360e05160a05260805260406080206101005160a0526080526040608020548152505b565b63d3078c9461010052306101205260e051610140526020610100604461011c6020608038036080396080515afa611f83573d600060003e3d6000fd5b601f3d1115612db757610100516c02863c1f5cdae420000000002254808211611fac5781611fae565b805b90509050815250565b601954610180526001610180516c01431e0fae6d7217caa0000000811015612db75702602201546101a0526001610180516c01431e0fae6d7217caa0000000811015612db757026c01431e0fae6d7210000000002201546101c052600e546101e0526101e0517b0100000000000000000000000000000000000000000000000000000080820690509050610200526101e05160d81c6102205261020051610240526101a051610220511061210057632c4e722e610260526020610260600461027c602060e038036080396080515afa612095573d600060003e3d6000fd5b601f3d1115612db757610260516102405263b26b238e610260526020610260600461027c6000602060e038036080396080515af16120d8573d600060003e3d6000fd5b601f3d1115612db7576102605160d81b610240518181830110612db75780820190509050600e555b600d5415612115576000610200526000610240525b6101a051421115612400576015546102605263615e523761028052306102a0526020608038036080396080513b15612db75760006000602461029c60006020608038036080396080515af161216f573d600060003e3d6000fd5b6101a051610280526101a05162093a808181830110612db7578082019050905062093a808082049050905062093a80808202821582848304141715612db75790509050428082116121c057816121c2565b805b905090506102a0526102c060006101f4818352015b6102a05161028051808210612db757808203905090506102e0526102805162093a808082049050905062093a80808202821582848304141715612db7579050905060e052612226610320611f47565b610320516103005260006102605111156123a6576102805161022051101561224f576000612259565b6102a05161022051105b6122bf576101c080516102005161030051808202821582848304141715612db757905090506102e051808202821582848304141715612db7579050905061026051808015612db7578204905090508181830110612db757808201905090508152506123a6565b6101c080516102005161030051808202821582848304141715612db757905090506102205161028051808210612db75780820390509050808202821582848304141715612db7579050905061026051808015612db7578204905090508181830110612db7578082019050905081525061024051610200526101c080516102005161030051808202821582848304141715612db757905090506102a05161022051808210612db75780820390509050808202821582848304141715612db7579050905061026051808015612db7578204905090508181830110612db757808201905090508152505b426102a051186123b5576123fd565b6102a051610280526102a05162093a808181830110612db75780820190509050428082116123e357816123e5565b805b905090506102a05281516001018083528114156121d7575b50505b610180805160018082018060801d81607f1d18612db7579050905081525061018051601955426001610180516c01431e0fae6d7217caa0000000811015612db75702602201556101c0516001610180516c01431e0fae6d7217caa0000000811015612db757026c01431e0fae6d72100000000022015560146101605160a0526080526040608020546102605260186101605160a05260805260406080208054610260516101c05160166101605160a052608052604060802054808210612db75780820390509050808202821582848304141715612db75790509050670de0b6b3a7640000808204905090508181830110612db757808201905090508155506101c05160166101605160a0526080526040608020554260176101605160a052608052604060802055565b6000610160526101405161018052600060e0511461259557600160e05160a052608052604060802054610160526101205161256557600061256b565b61014051155b1561259557601160e05160a05260805260406080205461018052610180516125955760e051610180525b600f546101a0526101c060006008818352015b6101a0516101c051186125ba57612952565b60016101c0516008811015612db75702601a01546101e052600560106101e05160a052608052604060802001546102005242600260106101e05160a0526080526040608020015480821161260e5781612610565b805b905090506102205261022051600460106101e05160a05260805260406080200154808210612db7578082039050905061024052600061024051146126ff5761022051600460106101e05160a05260805260406080200155600061010051146126ff57610200805161024051600360106101e05160a05260805260406080200154808202821582848304141715612db75790509050670de0b6b3a7640000808202821582848304141715612db7579050905061010051808015612db7578204905090508181830110612db7578082019050905081525061020051600560106101e05160a052608052604060802001555b600060e051146129425760126101e05160a052608052604060802060e05160a05260805260406080205461026052600061028052610200516102605110156127a8576102005160126101e05160a052608052604060802060e05160a052608052604060802055610160516102005161026051808210612db75780820390509050808202821582848304141715612db75790509050670de0b6b3a764000080820490509050610280525b601360e05160a05260805260406080206101e05160a0526080526040608020546102a0526102a05160801c610280518181830110612db757808201905090506102c05260006102c0511115612942576102a051700100000000000000000000000000000000808206905090506102e0526101205161286c576000610280511115612942576102e0516102c05160801b8181830110612db75780820190509050601360e05160a05260805260406080206101e05160a052608052604060802055612942565b63a9059cbb61034452600461018051610364526102c05161038452604001610340526103405060206103e06103405161036060006101e0515af16128b5573d600060003e3d6000fd5b6103c060203d8082116128c857816128ca565b805b905090508152805160200180610300828460045afa905050506000610300511461290957610320516103005181816020036008021c9050905015612db7575b6102e0516102c0518181830110612db75780820190509050601360e05160a05260805260406080206101e05160a0526080526040608020555b81516001018083528114156125a8575b5050565b63bbf7408a6101605260e051610180526020610160602461017c6020602038036080396080515afa61298d573d600060003e3d6000fd5b601f3d1115612db75761016051610140526318160ddd610180526020610180600461019c6020604038036080396080515afa6129ce573d600060003e3d6000fd5b601f3d1115612db7576101805161016052610100516028808202821582848304141715612db75790509050606480820490509050610180526000610160511115612a775761018080516101205161014051808202821582848304141715612db7579050905061016051808015612db757820490509050603c808202821582848304141715612db757905090506064808204905090508181830110612db757808201905090508152505b6101005161018051808211612a8c5781612a8e565b805b9050905061018052601460e05160a0526080526040608020546101a05261018051601460e05160a052608052604060802055601554610180518181830110612db757808201905090506101a051808210612db757808203905090506101c0526101c05160155560e0517f7ecd84343f76a23d2227290e0288da3251b045541698e575a5515af4f04197a3610100516101e052610120516102005261018051610220526101c0516102405260806101e0a2565b6104005161016052612b50611fb7565b6104205161016052612b60611fb7565b60006104405114612c9157600254610460526000600f541415610480526104805115612ba9576104005160e0526104605161010052600061012052600061014052612ba9612529565b60016104005160a05260805260406080205461044051808210612db757808203905090506104a0526104a05160016104005160a0526080526040608020556104005160e0526104a051610100526104605161012052612c06612956565b6104805115612c32576104205160e0526104605161010052600061012052600061014052612c32612529565b60016104205160a052608052604060802054610440518181830110612db757808201905090506104a0526104a05160016104205160a0526080526040608020556104205160e0526104a051610100526104605161012052612c91612956565b61042051610400517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61044051610460526020610460a3565b670de0b6b3a764000060e0511115612d75576034610100527f52656c61746976652077656967687420636170206578636565647320616c6c6f610120527f776564206162736f6c757465206d6178696d756d0000000000000000000000006101405261010050610100518061012001818260206001820306601f82010390500336823750506308c379a060c052602060e0526101005160206001820306601f820103905060440160dcfd5b60e0516c02863c1f5cdae4200000000022557f13e45870490f54cea50d245930d12102c72b502641ef6850d0b15a8c92decfb260e051610100526020610100a1565b600080fd5b61017d612f390361017d6102803961017d612f3903610180518161028001526101a051816102c001526101c051816102e001526101e051816102a001526102005181610300015261022051816103400152610260518161032001528060e001610280f35b600080fd", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/index.ts b/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/index.ts new file mode 100644 index 0000000..4c4f2da --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/index.ts @@ -0,0 +1,12 @@ +import { Task, TaskRunOptions } from '@src'; +import { LiquidityGaugeFactoryDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as LiquidityGaugeFactoryDeployment; + + const gaugeImplementationArgs = [input.BalancerMinter, input.VotingEscrowDelegationProxy, input.AuthorizerAdaptor]; + const gaugeImplementation = await task.deploy('LiquidityGaugeV5', gaugeImplementationArgs, from, force); + + const args = [gaugeImplementation.address]; + await task.deployAndVerify('LiquidityGaugeFactory', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/input.ts b/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/input.ts new file mode 100644 index 0000000..a47df3a --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/input.ts @@ -0,0 +1,17 @@ +import { Task, TaskMode } from '@src'; + +export type LiquidityGaugeFactoryDeployment = { + AuthorizerAdaptor: string; + BalancerMinter: string; + VotingEscrowDelegationProxy: string; +}; + +const AuthorizerAdaptor = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY); +const BalancerMinter = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); +const VotingEscrowDelegationProxy = new Task('20220325-ve-delegation', TaskMode.READ_ONLY); + +export default { + AuthorizerAdaptor, + BalancerMinter, + VotingEscrowDelegationProxy, +}; diff --git a/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/output/goerli.json b/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/output/goerli.json new file mode 100644 index 0000000..ffcb83f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/output/goerli.json @@ -0,0 +1,4 @@ +{ + "LiquidityGaugeV5": "0x2E96068b3D5B5BAE3D7515da4A1D2E52d08A2647", + "LiquidityGaugeFactory": "0x3b8cA519122CdD8efb272b0D3085453404B25bD0" +} diff --git a/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/output/mainnet.json b/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/output/mainnet.json new file mode 100644 index 0000000..20b5e13 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "LiquidityGaugeV5": "0xe5F96070CA00cd54795416B1a4b4c2403231c548", + "LiquidityGaugeFactory": "0xf1665E19bc105BE4EDD3739F88315cC699cc5b65" +} diff --git a/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/output/sepolia.json b/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/output/sepolia.json new file mode 100644 index 0000000..2144dc9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/output/sepolia.json @@ -0,0 +1,4 @@ +{ + "LiquidityGaugeV5": "0x82416Ce6eA7dD4923d4A3ED70a79B4A432a382C4", + "LiquidityGaugeFactory": "0x2FF226CD12C80511a641A6101F071d853A4e5363" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/readme.md b/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/readme.md new file mode 100644 index 0000000..93415db --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/readme.md @@ -0,0 +1,11 @@ +# 2022-08-22 - Liquidity Gauge Factory V2 + +Deployment of the `LiquidityGaugeFactory`, for liquidity gauges to be used with pools on mainnet. This updated version includes caps on the relative weight (allocated emissions) for each gauge. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`LiquidityGaugeV5` artifact](./artifact/LiquidityGaugeV5.json) +- [`LiquidityGaugeFactory` artifact](./artifact/LiquidityGaugeFactory.json) diff --git a/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/test/task.fork.ts b/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/test/task.fork.ts new file mode 100644 index 0000000..5ee67ac --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220822-mainnet-gauge-factory-v2/test/task.fork.ts @@ -0,0 +1,216 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import { BigNumber, fp } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { advanceTime, advanceToTimestamp, currentTimestamp, currentWeekTimestamp, DAY, WEEK } from '@helpers/time'; +import * as expectEvent from '@helpers/expectEvent'; + +import { expectEqualWithError } from '@helpers/relativeError'; +import { expectTransferEvent } from '@helpers/expectTransfer'; +import { MAX_UINT256, ZERO_ADDRESS } from '@helpers/constants'; +import { range } from 'lodash'; +import { actionId } from '@helpers/models/misc/actions'; + +import { describeForkTest, getSigner, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; + +describeForkTest('LiquidityGaugeFactoryV2', 'mainnet', 15397200, function () { + let veBALHolder: SignerWithAddress, admin: SignerWithAddress, lpTokenHolder: SignerWithAddress; + let factory: Contract, gauge: Contract; + let vault: Contract, + authorizer: Contract, + BALTokenAdmin: Contract, + gaugeController: Contract, + gaugeAdder: Contract, + lpToken: Contract, + balancerMinter: Contract; + + let BAL: string; + + let task: Task; + + const VEBAL_HOLDER = '0xd519D5704B41511951C8CF9f65Fee9AB9beF2611'; + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + + const LP_TOKEN = '0xbc5F4f9332d8415AAf31180Ab4661c9141CC84E4'; + const LP_TOKEN_HOLDER = '0x24Dd242c3c4061b1fCaA5119af608B56afBaEA95'; + + const weightCap = fp(0.001); + + before('run task', async () => { + task = new Task('20220822-mainnet-gauge-factory-v2', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('LiquidityGaugeFactory'); + }); + + before('advance time', async () => { + // This causes all voting cooldowns to expire, letting the veBAL holder vote again + await advanceTime(DAY * 12); + }); + + before('setup accounts', async () => { + admin = await getSigner(0); + veBALHolder = await impersonate(VEBAL_HOLDER); + lpTokenHolder = await impersonate(LP_TOKEN_HOLDER); + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.instanceAt('Vault', vaultTask.output({ network: 'mainnet' }).Vault); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + + const gaugeAdderTask = new Task('20220628-gauge-adder-v2', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeAdder = await gaugeAdderTask.instanceAt( + 'GaugeAdder', + gaugeAdderTask.output({ network: 'mainnet' }).GaugeAdder + ); + + const balancerTokenAdminTask = new Task('20220325-balancer-token-admin', TaskMode.READ_ONLY, getForkedNetwork(hre)); + BALTokenAdmin = await balancerTokenAdminTask.instanceAt( + 'BalancerTokenAdmin', + balancerTokenAdminTask.output({ network: 'mainnet' }).BalancerTokenAdmin + ); + + BAL = await BALTokenAdmin.getBalancerToken(); + + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeController = await gaugeControllerTask.instanceAt( + 'GaugeController', + gaugeControllerTask.output({ network: 'mainnet' }).GaugeController + ); + + balancerMinter = await gaugeControllerTask.instanceAt( + 'BalancerMinter', + gaugeControllerTask.output({ network: 'mainnet' }).BalancerMinter + ); + + // We use test balancer token to make use of the ERC-20 interface. + const testBALTokenTask = new Task('20220325-test-balancer-token', TaskMode.READ_ONLY, getForkedNetwork(hre)); + lpToken = await testBALTokenTask.instanceAt('TestBalancerToken', LP_TOKEN); + }); + + it('create gauge', async () => { + const tx = await factory.create(LP_TOKEN, weightCap); + const event = expectEvent.inReceipt(await tx.wait(), 'GaugeCreated'); + + gauge = await task.instanceAt('LiquidityGaugeV5', event.args.gauge); + expect(await gauge.lp_token()).to.equal(LP_TOKEN); + + expect(await factory.isGaugeFromFactory(gauge.address)).to.be.true; + }); + + it('grant permissions', async () => { + // We need to grant permission to the admin to add the LiquidityGaugeFactory to the GaugeAdder, and also to add + // gauges from said factory to the GaugeController. + const govMultisig = await impersonate(GOV_MULTISIG); + + await Promise.all( + ['addGaugeFactory', 'addEthereumGauge'].map( + async (method) => + await authorizer.connect(govMultisig).grantRole(await actionId(gaugeAdder, method), admin.address) + ) + ); + }); + + it('add gauge to gauge controller', async () => { + await gaugeAdder.connect(admin).addGaugeFactory(factory.address, 2); // Ethereum is type 2. + await gaugeAdder.connect(admin).addEthereumGauge(gauge.address); + + expect(await gaugeController.gauge_exists(gauge.address)).to.be.true; + }); + + it('stake LP tokens in gauge', async () => { + await lpToken.connect(lpTokenHolder).approve(gauge.address, MAX_UINT256); + await gauge.connect(lpTokenHolder)['deposit(uint256)'](await lpToken.balanceOf(lpTokenHolder.address)); + }); + + it('vote for gauge so that weight is above cap', async () => { + expect(await gaugeController.get_gauge_weight(gauge.address)).to.equal(0); + expect(await gauge.getCappedRelativeWeight(await currentTimestamp())).to.equal(0); + + // Max voting power is 10k points + await gaugeController.connect(veBALHolder).vote_for_gauge_weights(gauge.address, 10000); + + // We now need to go through an epoch for the votes to be locked in + await advanceTime(DAY * 8); + + await gaugeController.checkpoint(); + // Gauge weight is equal to the cap, and controller weight for the gauge is greater than the cap. + expect( + await gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, await currentWeekTimestamp()) + ).to.be.gt(weightCap); + expect(await gauge.getCappedRelativeWeight(await currentTimestamp())).to.equal(weightCap); + }); + + it('mint & bridge tokens', async () => { + // For simplicty, we're going to move to the end of the week so that we mint a full week's worth of tokens. + const firstMintWeekTimestamp = await currentWeekTimestamp(); + await advanceToTimestamp(firstMintWeekTimestamp.add(WEEK)); + + const tx = await balancerMinter.connect(lpTokenHolder).mint(gauge.address); + const event = expectTransferEvent( + await tx.wait(), + { + from: ZERO_ADDRESS, + to: lpTokenHolder.address, + }, + BAL + ); + + // The amount of tokens minted should equal the weekly emissions rate times the relative weight of the gauge. + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + + // Note that we use the cap instead of the weight, since we're testing a scenario in which the weight is larger than + // the cap. + const expectedGaugeEmissions = weeklyRate.mul(weightCap).div(fp(1)); + + // Since the LP token holder is the only account staking in the gauge, they'll receive the full amount destined to + // the gauge. + const actualEmissions = event.args.value; + expectEqualWithError(actualEmissions, expectedGaugeEmissions, 0.001); + }); + + it('mint multiple weeks', async () => { + // Since we're at the beginning of a week, we can simply advance a whole number of weeks for them to be complete. + const numberOfWeeks = 5; + await advanceTime(WEEK * numberOfWeeks); + + await gaugeController.checkpoint_gauge(gauge.address); + + const weekTimestamp = await currentWeekTimestamp(); + + // We can query the relative weight of the gauge for each of the weeks that have passed + const relativeWeights: BigNumber[] = await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, weekTimestamp.sub(WEEK * weekIndex)) + ) + ); + + // We require that they're all above the cap for simplicity - this lets us use the cap as each week's weight (and + // also tests cap behavior). + for (const relativeWeight of relativeWeights) { + expect(relativeWeight).to.be.gt(weightCap); + } + + const tx = await balancerMinter.connect(lpTokenHolder).mint(gauge.address); + const event = expectTransferEvent( + await tx.wait(), + { + from: ZERO_ADDRESS, + to: lpTokenHolder.address, + }, + BAL + ); + + // The amount of tokens allocated to the gauge should equal the sum of the weekly emissions rate times the weight + // cap. + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + const expectedGaugeEmissions = weeklyRate.mul(numberOfWeeks).mul(weightCap).div(fp(1)); + + // Since the LP token holder is the only account staking in the gauge, they'll receive the full amount destined to + // the gauge. + const actualEmissions = event.args.value; + expectEqualWithError(actualEmissions, expectedGaugeEmissions, 0.001); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20220823-arbitrum-root-gauge-factory-v2/artifact/ArbitrumRootGauge.json b/balpy/balancer-deployments/tasks/20220823-arbitrum-root-gauge-factory-v2/artifact/ArbitrumRootGauge.json new file mode 100644 index 0000000..2154932 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220823-arbitrum-root-gauge-factory-v2/artifact/ArbitrumRootGauge.json @@ -0,0 +1,239 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ArbitrumRootGauge", + "sourceName": "contracts/gauges/arbitrum/ArbitrumRootGauge.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IBalancerMinter", + "name": "minter", + "type": "address" + }, + { + "internalType": "contract IGatewayRouter", + "name": "gatewayRouter", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "periodTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "periodEmissions", + "type": "uint256" + } + ], + "name": "Checkpoint", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "new_relative_weight_cap", + "type": "uint256" + } + ], + "name": "RelativeWeightCapChanged", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_RELATIVE_WEIGHT_CAP", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "checkpoint", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "time", + "type": "uint256" + } + ], + "name": "getCappedRelativeWeight", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRecipient", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRelativeWeightCap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTotalBridgeCost", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "relativeWeightCap", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "integrate_fraction", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "is_killed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "killGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "relativeWeightCap", + "type": "uint256" + } + ], + "name": "setRelativeWeightCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unkillGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "user_checkpoint", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x6101e06040523480156200001257600080fd5b506040516200196d3803806200196d833981810160405260408110156200003857600080fd5b508051602091820151600160009081556040805163e6dec36f60e01b815290519394929385936001600160a01b0385169263e6dec36f9260048083019392829003018186803b1580156200008b57600080fd5b505afa158015620000a0573d6000803e3d6000fd5b505050506040513d6020811015620000b757600080fd5b50516040805163c003969960e01b815290519192506000916001600160a01b0384169163c0039699916004808301926020929190829003018186803b1580156200010057600080fd5b505afa15801562000115573d6000803e3d6000fd5b505050506040513d60208110156200012c57600080fd5b505160408051632c6f4d6f60e11b815290519192506000916001600160a01b038616916358de9ade916004808301926020929190829003018186803b1580156200017557600080fd5b505afa1580156200018a573d6000803e3d6000fd5b505050506040513d6020811015620001a157600080fd5b50516001600160601b0319606084811b821660805285811b821660a05286811b821660c05282901b1660e052604080516303e1469160e61b815290519192506001600160a01b0383169163f851a44091600480820192602092909190829003018186803b1580156200021257600080fd5b505afa15801562000227573d6000803e3d6000fd5b505050506040513d60208110156200023e57600080fd5b505160601b6001600160601b0319166101005260408051635c3dab0b60e11b815290516001600160a01b0385169163b87b5616916004808301926020929190829003018186803b1580156200029257600080fd5b505afa158015620002a7573d6000803e3d6000fd5b505050506040513d6020811015620002be57600080fd5b505161012052604080516321609bbf60e01b815290516001600160a01b038516916321609bbf916004808301926020929190829003018186803b1580156200030557600080fd5b505afa1580156200031a573d6000803e3d6000fd5b505050506040513d60208110156200033157600080fd5b505161014052604080516303f7d6c760e51b815290516001600160a01b03851691637efad8e0916004808301926020929190829003018186803b1580156200037857600080fd5b505afa1580156200038d573d6000803e3d6000fd5b505050506040513d6020811015620003a457600080fd5b505161016052505060001960025550506040805163c003969960e01b815290516001600160a01b038084169263bda009fe929186169163c003969991600480820192602092909190829003018186803b1580156200040157600080fd5b505afa15801562000416573d6000803e3d6000fd5b505050506040513d60208110156200042d57600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b039092166004830152516024808301926020929190829003018186803b1580156200047557600080fd5b505afa1580156200048a573d6000803e3d6000fd5b505050506040513d6020811015620004a157600080fd5b50516001600160601b0319606091821b81166101805291811b9091166101a05233901b6101c0525060805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205161014051610160516101805160601c6101a05160601c6101c05160601c6113e862000585600039806106005280610de5525080610eeb525080610cff5250806108d25250806108b1525080610834528061091e525080610383528061053f52806106d95280610b0d52508061042252806107c2525080610a14525080611121528061121e525080610cc35280610f2852506113e86000f3fe6080604052600436106100d25760003560e01c80639c868ac01161007f578063b024522511610059578063b024522514610265578063c2c4c5c11461027a578063cd6dc68714610282578063d34fb267146102c8576100d2565b80639c868ac0146102265780639f8676711461023b578063ab8f094514610250576100d2565b80631b88094d116100b05780631b88094d1461017f5780634b820093146101bd57806383f5c39b14610211576100d2565b806309400707146100d757806310d3eb041461012957806314e956f514610155575b600080fd5b3480156100e357600080fd5b50610117600480360360208110156100fa57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166102dd565b60408051918252519081900360200190f35b34801561013557600080fd5b506101536004803603602081101561014c57600080fd5b503561036b565b005b34801561016157600080fd5b506101176004803603602081101561017857600080fd5b503561041b565b34801561018b57600080fd5b506101946104e9565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101c957600080fd5b506101fd600480360360208110156101e057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610506565b604080519115158252519081900360200190f35b34801561021d57600080fd5b5061011761050c565b34801561023257600080fd5b506101fd610512565b34801561024757600080fd5b5061011761051b565b34801561025c57600080fd5b50610153610527565b34801561027157600080fd5b506101176105f8565b6101fd6106b7565b34801561028e57600080fd5b50610153600480360360408110156102a557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610aa4565b3480156102d457600080fd5b50610153610af5565b600073ffffffffffffffffffffffffffffffffffffffff8216301461036357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060045490565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461040f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b61041881610bc3565b50565b60006104e37f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9430856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b1580156104af57600080fd5b505afa1580156104c3573d6000803e3d6000fd5b505050506040513d60208110156104d957600080fd5b5051600654610c5f565b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff165b90565b50600190565b60065490565b60055460ff1690565b670de0b6b3a764000081565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146105cb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000806000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ac8288c06040518163ffffffff1660e01b815260040160606040518083038186803b15801561066457600080fd5b505afa158015610678573d6000803e3d6000fd5b505050506040513d606081101561068e57600080fd5b508051602082015160409092015190945090925090506106af838383610c77565b935050505090565b60006106c1610c7d565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461076557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b6002546000610772610c96565b905080821015610a9657604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b15801561080957600080fd5b505af115801561081d573d6000803e3d6000fd5b5050600180546003549590910194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff018110156109a9578481111561086e576109a9565b62093a8081026000806108808361041b565b905082851015801561089657508262093a800185105b1561094f57828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008902816108fa57fe5b04975062093a80819003670de0b6b3a7640000838a02820260018b905560038990557f000000000000000000000000000000000000000000000000000000000000000090980197049390930192506109649050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a250939093019250600101610856565b506002849055600480548301905581158015906109c9575060055460ff16155b15610a9257604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b158015610a5c57600080fd5b505af1158015610a70573d6000803e3d6000fd5b505050506040513d6020811015610a8657600080fd5b50610a92905082610cc1565b5050505b6001925050506105036110a7565b610aad816110ae565b50600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610b9957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b670de0b6b3a7640000811115610c24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061135b6034913960400191505060405180910390fd5b60068190556040805182815290517f13e45870490f54cea50d245930d12102c72b502641ef6850d0b15a8c92decfb29181900360200190a150565b6000818310610c6e5781610c70565b825b9392505050565b91020190565b610c8f600260005414156101906112c0565b6002600055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610d7257600080fd5b505af1158015610d86573d6000803e3d6000fd5b505050506040513d6020811015610d9c57600080fd5b5050604080517fac8288c000000000000000000000000000000000000000000000000000000000815290516000918291829173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163ac8288c091600480820192606092909190829003018186803b158015610e2c57600080fd5b505afa158015610e40573d6000803e3d6000fd5b505050506040513d6060811015610e5657600080fd5b508051602082015160409092015190945090925090506000610e79848484610c77565b9050803414610ee957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f496e636f7272656374206d73672e76616c756520706173736564000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d2ce7d65827f0000000000000000000000000000000000000000000000000000000000000000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16898989896040516020018082815260200180602001828103825260008152602001602001925050506040516020818303038152906040526040518863ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561103757818101518382015260200161101f565b50505050905090810190601f1680156110645780820380516001836020036101000a031916815260200191505b509750505050505050506000604051808303818588803b15801561108757600080fd5b505af115801561109b573d6000803e3d6000fd5b50505050505050505050565b6001600055565b6002541561111d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561118557600080fd5b505afa158015611199573d6000803e3d6000fd5b505050506040513d60208110156111af57600080fd5b5051905080611209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061138f6024913960400191505060405180910390fd5b6001819055611216610c96565b6002819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561128457600080fd5b505af1158015611298573d6000803e3d6000fd5b505050506040513d60208110156112ae57600080fd5b50516003556112bc82610bc3565b5050565b816112bc577f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526112bc918391610418917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fdfe52656c61746976652077656967687420636170206578636565647320616c6c6f776564206162736f6c757465206d6178696d756d42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a2646970667358221220b2e9c5db1495f489c7a69335aad0b2496a1a094c2b54e35295f6260efcf9876464736f6c63430007010033", + "deployedBytecode": "0x6080604052600436106100d25760003560e01c80639c868ac01161007f578063b024522511610059578063b024522514610265578063c2c4c5c11461027a578063cd6dc68714610282578063d34fb267146102c8576100d2565b80639c868ac0146102265780639f8676711461023b578063ab8f094514610250576100d2565b80631b88094d116100b05780631b88094d1461017f5780634b820093146101bd57806383f5c39b14610211576100d2565b806309400707146100d757806310d3eb041461012957806314e956f514610155575b600080fd5b3480156100e357600080fd5b50610117600480360360208110156100fa57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166102dd565b60408051918252519081900360200190f35b34801561013557600080fd5b506101536004803603602081101561014c57600080fd5b503561036b565b005b34801561016157600080fd5b506101176004803603602081101561017857600080fd5b503561041b565b34801561018b57600080fd5b506101946104e9565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101c957600080fd5b506101fd600480360360208110156101e057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610506565b604080519115158252519081900360200190f35b34801561021d57600080fd5b5061011761050c565b34801561023257600080fd5b506101fd610512565b34801561024757600080fd5b5061011761051b565b34801561025c57600080fd5b50610153610527565b34801561027157600080fd5b506101176105f8565b6101fd6106b7565b34801561028e57600080fd5b50610153600480360360408110156102a557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610aa4565b3480156102d457600080fd5b50610153610af5565b600073ffffffffffffffffffffffffffffffffffffffff8216301461036357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060045490565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461040f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b61041881610bc3565b50565b60006104e37f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9430856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b1580156104af57600080fd5b505afa1580156104c3573d6000803e3d6000fd5b505050506040513d60208110156104d957600080fd5b5051600654610c5f565b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff165b90565b50600190565b60065490565b60055460ff1690565b670de0b6b3a764000081565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146105cb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000806000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ac8288c06040518163ffffffff1660e01b815260040160606040518083038186803b15801561066457600080fd5b505afa158015610678573d6000803e3d6000fd5b505050506040513d606081101561068e57600080fd5b508051602082015160409092015190945090925090506106af838383610c77565b935050505090565b60006106c1610c7d565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461076557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b6002546000610772610c96565b905080821015610a9657604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b15801561080957600080fd5b505af115801561081d573d6000803e3d6000fd5b5050600180546003549590910194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff018110156109a9578481111561086e576109a9565b62093a8081026000806108808361041b565b905082851015801561089657508262093a800185105b1561094f57828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008902816108fa57fe5b04975062093a80819003670de0b6b3a7640000838a02820260018b905560038990557f000000000000000000000000000000000000000000000000000000000000000090980197049390930192506109649050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a250939093019250600101610856565b506002849055600480548301905581158015906109c9575060055460ff16155b15610a9257604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b158015610a5c57600080fd5b505af1158015610a70573d6000803e3d6000fd5b505050506040513d6020811015610a8657600080fd5b50610a92905082610cc1565b5050505b6001925050506105036110a7565b610aad816110ae565b50600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610b9957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b670de0b6b3a7640000811115610c24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061135b6034913960400191505060405180910390fd5b60068190556040805182815290517f13e45870490f54cea50d245930d12102c72b502641ef6850d0b15a8c92decfb29181900360200190a150565b6000818310610c6e5781610c70565b825b9392505050565b91020190565b610c8f600260005414156101906112c0565b6002600055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610d7257600080fd5b505af1158015610d86573d6000803e3d6000fd5b505050506040513d6020811015610d9c57600080fd5b5050604080517fac8288c000000000000000000000000000000000000000000000000000000000815290516000918291829173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163ac8288c091600480820192606092909190829003018186803b158015610e2c57600080fd5b505afa158015610e40573d6000803e3d6000fd5b505050506040513d6060811015610e5657600080fd5b508051602082015160409092015190945090925090506000610e79848484610c77565b9050803414610ee957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f496e636f7272656374206d73672e76616c756520706173736564000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d2ce7d65827f0000000000000000000000000000000000000000000000000000000000000000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16898989896040516020018082815260200180602001828103825260008152602001602001925050506040516020818303038152906040526040518863ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561103757818101518382015260200161101f565b50505050905090810190601f1680156110645780820380516001836020036101000a031916815260200191505b509750505050505050506000604051808303818588803b15801561108757600080fd5b505af115801561109b573d6000803e3d6000fd5b50505050505050505050565b6001600055565b6002541561111d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561118557600080fd5b505afa158015611199573d6000803e3d6000fd5b505050506040513d60208110156111af57600080fd5b5051905080611209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061138f6024913960400191505060405180910390fd5b6001819055611216610c96565b6002819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561128457600080fd5b505af1158015611298573d6000803e3d6000fd5b505050506040513d60208110156112ae57600080fd5b50516003556112bc82610bc3565b5050565b816112bc577f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526112bc918391610418917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fdfe52656c61746976652077656967687420636170206578636565647320616c6c6f776564206162736f6c757465206d6178696d756d42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a2646970667358221220b2e9c5db1495f489c7a69335aad0b2496a1a094c2b54e35295f6260efcf9876464736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220823-arbitrum-root-gauge-factory-v2/artifact/ArbitrumRootGaugeFactory.json b/balpy/balancer-deployments/tasks/20220823-arbitrum-root-gauge-factory-v2/artifact/ArbitrumRootGaugeFactory.json new file mode 100644 index 0000000..fd1562f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220823-arbitrum-root-gauge-factory-v2/artifact/ArbitrumRootGaugeFactory.json @@ -0,0 +1,232 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ArbitrumRootGaugeFactory", + "sourceName": "contracts/gauges/arbitrum/ArbitrumRootGaugeFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IBalancerMinter", + "name": "minter", + "type": "address" + }, + { + "internalType": "contract IGatewayRouter", + "name": "gatewayRouter", + "type": "address" + }, + { + "internalType": "uint64", + "name": "gasLimit", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "gasPrice", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "maxSubmissionCost", + "type": "uint64" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "gasPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "maxSubmissionCost", + "type": "uint256" + } + ], + "name": "ArbitrumFeesModified", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "GaugeCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "relativeWeightCap", + "type": "uint256" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getArbitrumFees", + "outputs": [ + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "gasPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxSubmissionCost", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeImplementation", + "outputs": [ + { + "internalType": "contract ILiquidityGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "isGaugeFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "gasLimit", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "gasPrice", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "maxSubmissionCost", + "type": "uint64" + } + ], + "name": "setArbitrumFees", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60c060405234801561001057600080fd5b50604051620025453803806200254583398101604081905261003191610135565b85306001600160a01b031660001b868660405161004d9061010a565b6100589291906101b3565b604051809103906000f080158015610074573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905560805260601b6001600160601b03191660a052600280546001600160401b0319166001600160401b0394851617600160401b600160801b031916680100000000000000009385169390930292909217600160801b600160c01b031916600160801b9190931602919091179055506101e5915050565b61196d8062000bd883390190565b80516001600160401b038116811461012f57600080fd5b92915050565b60008060008060008060c0878903121561014d578182fd5b8651610158816101cd565b6020880151909650610169816101cd565b604088015190955061017a816101cd565b93506101898860608901610118565b92506101988860808901610118565b91506101a78860a08901610118565b90509295509295509295565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03811681146101e257600080fd5b50565b60805160a05160601c6109cc6200020c600039806102495250806101f852506109cc6000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063aaabadc51161005b578063aaabadc5146100e6578063ac8288c0146100ee578063ce3cc8bd14610105578063e9bde6041461012557610088565b80630ecaea731461008d57806339312dee146100b6578063851c1bb3146100be5780638d928af8146100de575b600080fd5b6100a061009b366004610760565b61013a565b6040516100ad919061087c565b60405180910390f35b6100a06101d8565b6100d16100cc3660046107ab565b6101f4565b6040516100ad91906108ce565b6100a0610247565b6100a061026b565b6100f66102f7565b6040516100ad9392919061093a565b610118610113366004610744565b610330565b6040516100ad91906108c3565b610138610133366004610807565b61035b565b005b600080610145610449565b6040517fcd6dc68700000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063cd6dc6879061019c908790879060040161089d565b600060405180830381600087803b1580156101b657600080fd5b505af11580156101ca573d6000803e3d6000fd5b509293505050505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60007f00000000000000000000000000000000000000000000000000000000000000008260405160200161022992919061084c565b6040516020818303038152906040528051906020012090505b919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610275610247565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156102ba57600080fd5b505afa1580156102ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f291906107eb565b905090565b60025467ffffffffffffffff80821692680100000000000000008304821692700100000000000000000000000000000000900490911690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b6103636104ef565b600280547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff858116919091177fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000085831602177fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff16700100000000000000000000000000000000918416919091021790556040517f3db8f737ebeecf95c5dc9b279051cab0e7b70a8e3d63148b38faafcf7d42314e9061043c90859085908590610950565b60405180910390a1505050565b60008054819061046e9073ffffffffffffffffffffffffffffffffffffffff16610538565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b600061051e6000357fffffffff00000000000000000000000000000000000000000000000000000000166101f4565b905061053561052d82336105ee565b61019161068b565b50565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff8116610242576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e590610903565b60405180910390fd5b60006105f861026b565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401610634939291906108d7565b60206040518083038186803b15801561064c57600080fd5b505afa158015610660573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610684919061078b565b9392505050565b81610699576106998161069d565b5050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b604452610535917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b803567ffffffffffffffff811681146101d257600080fd5b600060208284031215610755578081fd5b813561068481610974565b60008060408385031215610772578081fd5b823561077d81610974565b946020939093013593505050565b60006020828403121561079c578081fd5b81518015158114610684578182fd5b6000602082840312156107bc578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610684578182fd5b6000602082840312156107fc578081fd5b815161068481610974565b60008060006060848603121561081b578081fd5b610825858561072c565b9250610834856020860161072c565b9150610843856040860161072c565b90509250925092565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60208082526016908201527f455243313136373a20637265617465206661696c656400000000000000000000604082015260600190565b9283526020830191909152604082015260600190565b67ffffffffffffffff93841681529183166020830152909116604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff8116811461053557600080fdfea2646970667358221220fa64280ec4aa87a8d96c7130973a29cbb692278e2709c4392de844306b06600264736f6c634300070100336101e06040523480156200001257600080fd5b506040516200196d3803806200196d833981810160405260408110156200003857600080fd5b508051602091820151600160009081556040805163e6dec36f60e01b815290519394929385936001600160a01b0385169263e6dec36f9260048083019392829003018186803b1580156200008b57600080fd5b505afa158015620000a0573d6000803e3d6000fd5b505050506040513d6020811015620000b757600080fd5b50516040805163c003969960e01b815290519192506000916001600160a01b0384169163c0039699916004808301926020929190829003018186803b1580156200010057600080fd5b505afa15801562000115573d6000803e3d6000fd5b505050506040513d60208110156200012c57600080fd5b505160408051632c6f4d6f60e11b815290519192506000916001600160a01b038616916358de9ade916004808301926020929190829003018186803b1580156200017557600080fd5b505afa1580156200018a573d6000803e3d6000fd5b505050506040513d6020811015620001a157600080fd5b50516001600160601b0319606084811b821660805285811b821660a05286811b821660c05282901b1660e052604080516303e1469160e61b815290519192506001600160a01b0383169163f851a44091600480820192602092909190829003018186803b1580156200021257600080fd5b505afa15801562000227573d6000803e3d6000fd5b505050506040513d60208110156200023e57600080fd5b505160601b6001600160601b0319166101005260408051635c3dab0b60e11b815290516001600160a01b0385169163b87b5616916004808301926020929190829003018186803b1580156200029257600080fd5b505afa158015620002a7573d6000803e3d6000fd5b505050506040513d6020811015620002be57600080fd5b505161012052604080516321609bbf60e01b815290516001600160a01b038516916321609bbf916004808301926020929190829003018186803b1580156200030557600080fd5b505afa1580156200031a573d6000803e3d6000fd5b505050506040513d60208110156200033157600080fd5b505161014052604080516303f7d6c760e51b815290516001600160a01b03851691637efad8e0916004808301926020929190829003018186803b1580156200037857600080fd5b505afa1580156200038d573d6000803e3d6000fd5b505050506040513d6020811015620003a457600080fd5b505161016052505060001960025550506040805163c003969960e01b815290516001600160a01b038084169263bda009fe929186169163c003969991600480820192602092909190829003018186803b1580156200040157600080fd5b505afa15801562000416573d6000803e3d6000fd5b505050506040513d60208110156200042d57600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b039092166004830152516024808301926020929190829003018186803b1580156200047557600080fd5b505afa1580156200048a573d6000803e3d6000fd5b505050506040513d6020811015620004a157600080fd5b50516001600160601b0319606091821b81166101805291811b9091166101a05233901b6101c0525060805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205161014051610160516101805160601c6101a05160601c6101c05160601c6113e862000585600039806106005280610de5525080610eeb525080610cff5250806108d25250806108b1525080610834528061091e525080610383528061053f52806106d95280610b0d52508061042252806107c2525080610a14525080611121528061121e525080610cc35280610f2852506113e86000f3fe6080604052600436106100d25760003560e01c80639c868ac01161007f578063b024522511610059578063b024522514610265578063c2c4c5c11461027a578063cd6dc68714610282578063d34fb267146102c8576100d2565b80639c868ac0146102265780639f8676711461023b578063ab8f094514610250576100d2565b80631b88094d116100b05780631b88094d1461017f5780634b820093146101bd57806383f5c39b14610211576100d2565b806309400707146100d757806310d3eb041461012957806314e956f514610155575b600080fd5b3480156100e357600080fd5b50610117600480360360208110156100fa57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166102dd565b60408051918252519081900360200190f35b34801561013557600080fd5b506101536004803603602081101561014c57600080fd5b503561036b565b005b34801561016157600080fd5b506101176004803603602081101561017857600080fd5b503561041b565b34801561018b57600080fd5b506101946104e9565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101c957600080fd5b506101fd600480360360208110156101e057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610506565b604080519115158252519081900360200190f35b34801561021d57600080fd5b5061011761050c565b34801561023257600080fd5b506101fd610512565b34801561024757600080fd5b5061011761051b565b34801561025c57600080fd5b50610153610527565b34801561027157600080fd5b506101176105f8565b6101fd6106b7565b34801561028e57600080fd5b50610153600480360360408110156102a557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610aa4565b3480156102d457600080fd5b50610153610af5565b600073ffffffffffffffffffffffffffffffffffffffff8216301461036357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060045490565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461040f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b61041881610bc3565b50565b60006104e37f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9430856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b1580156104af57600080fd5b505afa1580156104c3573d6000803e3d6000fd5b505050506040513d60208110156104d957600080fd5b5051600654610c5f565b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff165b90565b50600190565b60065490565b60055460ff1690565b670de0b6b3a764000081565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146105cb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000806000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ac8288c06040518163ffffffff1660e01b815260040160606040518083038186803b15801561066457600080fd5b505afa158015610678573d6000803e3d6000fd5b505050506040513d606081101561068e57600080fd5b508051602082015160409092015190945090925090506106af838383610c77565b935050505090565b60006106c1610c7d565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461076557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b6002546000610772610c96565b905080821015610a9657604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b15801561080957600080fd5b505af115801561081d573d6000803e3d6000fd5b5050600180546003549590910194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff018110156109a9578481111561086e576109a9565b62093a8081026000806108808361041b565b905082851015801561089657508262093a800185105b1561094f57828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008902816108fa57fe5b04975062093a80819003670de0b6b3a7640000838a02820260018b905560038990557f000000000000000000000000000000000000000000000000000000000000000090980197049390930192506109649050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a250939093019250600101610856565b506002849055600480548301905581158015906109c9575060055460ff16155b15610a9257604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b158015610a5c57600080fd5b505af1158015610a70573d6000803e3d6000fd5b505050506040513d6020811015610a8657600080fd5b50610a92905082610cc1565b5050505b6001925050506105036110a7565b610aad816110ae565b50600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610b9957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b670de0b6b3a7640000811115610c24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061135b6034913960400191505060405180910390fd5b60068190556040805182815290517f13e45870490f54cea50d245930d12102c72b502641ef6850d0b15a8c92decfb29181900360200190a150565b6000818310610c6e5781610c70565b825b9392505050565b91020190565b610c8f600260005414156101906112c0565b6002600055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610d7257600080fd5b505af1158015610d86573d6000803e3d6000fd5b505050506040513d6020811015610d9c57600080fd5b5050604080517fac8288c000000000000000000000000000000000000000000000000000000000815290516000918291829173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163ac8288c091600480820192606092909190829003018186803b158015610e2c57600080fd5b505afa158015610e40573d6000803e3d6000fd5b505050506040513d6060811015610e5657600080fd5b508051602082015160409092015190945090925090506000610e79848484610c77565b9050803414610ee957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f496e636f7272656374206d73672e76616c756520706173736564000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d2ce7d65827f0000000000000000000000000000000000000000000000000000000000000000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16898989896040516020018082815260200180602001828103825260008152602001602001925050506040516020818303038152906040526040518863ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561103757818101518382015260200161101f565b50505050905090810190601f1680156110645780820380516001836020036101000a031916815260200191505b509750505050505050506000604051808303818588803b15801561108757600080fd5b505af115801561109b573d6000803e3d6000fd5b50505050505050505050565b6001600055565b6002541561111d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561118557600080fd5b505afa158015611199573d6000803e3d6000fd5b505050506040513d60208110156111af57600080fd5b5051905080611209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061138f6024913960400191505060405180910390fd5b6001819055611216610c96565b6002819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561128457600080fd5b505af1158015611298573d6000803e3d6000fd5b505050506040513d60208110156112ae57600080fd5b50516003556112bc82610bc3565b5050565b816112bc577f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526112bc918391610418917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fdfe52656c61746976652077656967687420636170206578636565647320616c6c6f776564206162736f6c757465206d6178696d756d42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a2646970667358221220b2e9c5db1495f489c7a69335aad0b2496a1a094c2b54e35295f6260efcf9876464736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063aaabadc51161005b578063aaabadc5146100e6578063ac8288c0146100ee578063ce3cc8bd14610105578063e9bde6041461012557610088565b80630ecaea731461008d57806339312dee146100b6578063851c1bb3146100be5780638d928af8146100de575b600080fd5b6100a061009b366004610760565b61013a565b6040516100ad919061087c565b60405180910390f35b6100a06101d8565b6100d16100cc3660046107ab565b6101f4565b6040516100ad91906108ce565b6100a0610247565b6100a061026b565b6100f66102f7565b6040516100ad9392919061093a565b610118610113366004610744565b610330565b6040516100ad91906108c3565b610138610133366004610807565b61035b565b005b600080610145610449565b6040517fcd6dc68700000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063cd6dc6879061019c908790879060040161089d565b600060405180830381600087803b1580156101b657600080fd5b505af11580156101ca573d6000803e3d6000fd5b509293505050505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60007f00000000000000000000000000000000000000000000000000000000000000008260405160200161022992919061084c565b6040516020818303038152906040528051906020012090505b919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610275610247565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156102ba57600080fd5b505afa1580156102ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f291906107eb565b905090565b60025467ffffffffffffffff80821692680100000000000000008304821692700100000000000000000000000000000000900490911690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b6103636104ef565b600280547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff858116919091177fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000085831602177fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff16700100000000000000000000000000000000918416919091021790556040517f3db8f737ebeecf95c5dc9b279051cab0e7b70a8e3d63148b38faafcf7d42314e9061043c90859085908590610950565b60405180910390a1505050565b60008054819061046e9073ffffffffffffffffffffffffffffffffffffffff16610538565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b600061051e6000357fffffffff00000000000000000000000000000000000000000000000000000000166101f4565b905061053561052d82336105ee565b61019161068b565b50565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff8116610242576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e590610903565b60405180910390fd5b60006105f861026b565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401610634939291906108d7565b60206040518083038186803b15801561064c57600080fd5b505afa158015610660573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610684919061078b565b9392505050565b81610699576106998161069d565b5050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b604452610535917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b803567ffffffffffffffff811681146101d257600080fd5b600060208284031215610755578081fd5b813561068481610974565b60008060408385031215610772578081fd5b823561077d81610974565b946020939093013593505050565b60006020828403121561079c578081fd5b81518015158114610684578182fd5b6000602082840312156107bc578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610684578182fd5b6000602082840312156107fc578081fd5b815161068481610974565b60008060006060848603121561081b578081fd5b610825858561072c565b9250610834856020860161072c565b9150610843856040860161072c565b90509250925092565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60208082526016908201527f455243313136373a20637265617465206661696c656400000000000000000000604082015260600190565b9283526020830191909152604082015260600190565b67ffffffffffffffff93841681529183166020830152909116604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff8116811461053557600080fdfea2646970667358221220fa64280ec4aa87a8d96c7130973a29cbb692278e2709c4392de844306b06600264736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220823-arbitrum-root-gauge-factory-v2/index.ts b/balpy/balancer-deployments/tasks/20220823-arbitrum-root-gauge-factory-v2/index.ts new file mode 100644 index 0000000..4c222cd --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220823-arbitrum-root-gauge-factory-v2/index.ts @@ -0,0 +1,21 @@ +import { Task, TaskRunOptions } from '@src'; +import { ArbitrumRootGaugeFactoryDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as ArbitrumRootGaugeFactoryDeployment; + + const args = [ + input.Vault, + input.BalancerMinter, + input.GatewayRouter, + input.GasLimit, + input.GasPrice, + input.MaxSubmissionCost, + ]; + + const factory = await task.deployAndVerify('ArbitrumRootGaugeFactory', args, from, force); + + const implementation = await factory.getGaugeImplementation(); + await task.verify('ArbitrumRootGauge', implementation, [input.BalancerMinter, input.GatewayRouter]); + await task.save({ ArbitrumRootGauge: implementation }); +}; diff --git a/balpy/balancer-deployments/tasks/20220823-arbitrum-root-gauge-factory-v2/input.ts b/balpy/balancer-deployments/tasks/20220823-arbitrum-root-gauge-factory-v2/input.ts new file mode 100644 index 0000000..f369c95 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220823-arbitrum-root-gauge-factory-v2/input.ts @@ -0,0 +1,27 @@ +import { Task, TaskMode } from '@src'; + +export type ArbitrumRootGaugeFactoryDeployment = { + Vault: string; + BalancerMinter: string; + GatewayRouter: string; + GasLimit: number; + GasPrice: number; + MaxSubmissionCost: number; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerMinter = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); + +export default { + mainnet: { + Vault, + BalancerMinter, + // From https://developer.offchainlabs.com/docs/useful_addresses#token-bridge + GatewayRouter: '0x72Ce9c846789fdB6fC1f34aC4AD25Dd9ef7031ef', + // The following values (along with the GatewayRouter) were retrieved at deployment time from Curve's + // arbitrum-tricrypto gauge, located at 0x9044E12fB1732f88ed0c93cfa5E9bB9bD2990cE5. + GasLimit: 1000000, + GasPrice: 1990000000, + MaxSubmissionCost: 10000000000000, + }, +}; diff --git a/balpy/balancer-deployments/tasks/20220823-arbitrum-root-gauge-factory-v2/output/mainnet.json b/balpy/balancer-deployments/tasks/20220823-arbitrum-root-gauge-factory-v2/output/mainnet.json new file mode 100644 index 0000000..f8c634c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220823-arbitrum-root-gauge-factory-v2/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "ArbitrumRootGaugeFactory": "0x1c99324EDC771c82A0DCCB780CC7DDA0045E50e7", + "ArbitrumRootGauge": "0x6337949cbC4825Bbd09242c811770F6F6fee9FfC" +} diff --git a/balpy/balancer-deployments/tasks/20220823-arbitrum-root-gauge-factory-v2/readme.md b/balpy/balancer-deployments/tasks/20220823-arbitrum-root-gauge-factory-v2/readme.md new file mode 100644 index 0000000..89427c8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220823-arbitrum-root-gauge-factory-v2/readme.md @@ -0,0 +1,9 @@ +# 2022-08-23 - Arbitrum Root Gauge Factory V2 + +Deployment of the `ArbitrumRootGaugeFactory`, for stakeless gauges that bridge funds to their Arbitrum counterparts. This updated version includes caps on the relative weight (allocated emissions) for each gauge. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [`ArbitrumRootGauge` artifact](./artifact/ArbitrumRootGauge.json) +- [`ArbitrumRootGaugeFactory` artifact](./artifact/ArbitrumRootGaugeFactory.json) diff --git a/balpy/balancer-deployments/tasks/20220823-arbitrum-root-gauge-factory-v2/test/task.fork.ts b/balpy/balancer-deployments/tasks/20220823-arbitrum-root-gauge-factory-v2/test/task.fork.ts new file mode 100644 index 0000000..18bfe16 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220823-arbitrum-root-gauge-factory-v2/test/task.fork.ts @@ -0,0 +1,260 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import { BigNumber, fp, FP_ONE } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { advanceTime, currentTimestamp, currentWeekTimestamp, DAY, WEEK } from '@helpers/time'; +import * as expectEvent from '@helpers/expectEvent'; + +import { expectEqualWithError } from '@helpers/relativeError'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import { range } from 'lodash'; +import { expectTransferEvent } from '@helpers/expectTransfer'; +import { actionId } from '@helpers/models/misc/actions'; + +import { describeForkTest, getSigner, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; + +describeForkTest('ArbitrumRootGaugeFactoryV2', 'mainnet', 15397200, function () { + let veBALHolder: SignerWithAddress, admin: SignerWithAddress, recipient: SignerWithAddress; + let factory: Contract, gauge: Contract; + let vault: Contract, + authorizer: Contract, + authorizerAdaptor: Contract, + BALTokenAdmin: Contract, + gaugeController: Contract, + gaugeAdder: Contract; + let BAL: string; + + let task: Task; + + const VEBAL_HOLDER = '0xd519D5704B41511951C8CF9f65Fee9AB9beF2611'; + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + + const weightCap = fp(0.001); + + before('run task', async () => { + task = new Task('20220823-arbitrum-root-gauge-factory-v2', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('ArbitrumRootGaugeFactory'); + }); + + before('advance time', async () => { + // This causes all voting cooldowns to expire, letting the veBAL holder vote again + await advanceTime(DAY * 12); + }); + + before('setup accounts', async () => { + admin = await getSigner(0); + recipient = await getSigner(1); + + veBALHolder = await impersonate(VEBAL_HOLDER); + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.instanceAt('Vault', vaultTask.output({ network: 'mainnet' }).Vault); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + + const authorizerAdaptorTask = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizerAdaptor = await authorizerAdaptorTask.instanceAt( + 'AuthorizerAdaptor', + authorizerAdaptorTask.output({ network: 'mainnet' }).AuthorizerAdaptor + ); + + const gaugeAdderTask = new Task('20220628-gauge-adder-v2', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeAdder = await gaugeAdderTask.instanceAt( + 'GaugeAdder', + gaugeAdderTask.output({ network: 'mainnet' }).GaugeAdder + ); + + const balancerTokenAdminTask = new Task('20220325-balancer-token-admin', TaskMode.READ_ONLY, getForkedNetwork(hre)); + BALTokenAdmin = await balancerTokenAdminTask.instanceAt( + 'BalancerTokenAdmin', + balancerTokenAdminTask.output({ network: 'mainnet' }).BalancerTokenAdmin + ); + + BAL = await BALTokenAdmin.getBalancerToken(); + + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeController = await gaugeControllerTask.instanceAt( + 'GaugeController', + gaugeControllerTask.output({ network: 'mainnet' }).GaugeController + ); + }); + + it('create gauge', async () => { + const tx = await factory.create(recipient.address, weightCap); + const event = expectEvent.inReceipt(await tx.wait(), 'GaugeCreated'); + + gauge = await task.instanceAt('ArbitrumRootGauge', event.args.gauge); + + expect(await factory.isGaugeFromFactory(gauge.address)).to.be.true; + }); + + it('grant permissions', async () => { + // We need to grant permission to the admin to add the Arbitrum factory to the GaugeAdder, and also to then add + // gauges from said factory to the GaugeController. + const govMultisig = await impersonate(GOV_MULTISIG); + + await Promise.all( + ['addGaugeFactory', 'addArbitrumGauge'].map( + async (method) => + await authorizer.connect(govMultisig).grantRole(await actionId(gaugeAdder, method), admin.address) + ) + ); + + // We also need to grant permissions to mint in the gauges, which is done via the Authorizer Adaptor + await authorizer + .connect(govMultisig) + .grantRole(await authorizerAdaptor.getActionId(gauge.interface.getSighash('checkpoint')), admin.address); + }); + + it('add gauge to gauge controller', async () => { + await gaugeAdder.connect(admin).addGaugeFactory(factory.address, 4); // Arbitrum is Gauge Type 4 + await gaugeAdder.connect(admin).addArbitrumGauge(gauge.address); + + expect(await gaugeController.gauge_exists(gauge.address)).to.be.true; + }); + + it('vote for gauge', async () => { + expect(await gaugeController.get_gauge_weight(gauge.address)).to.equal(0); + expect(await gauge.getCappedRelativeWeight(await currentTimestamp())).to.equal(0); + + await gaugeController.connect(veBALHolder).vote_for_gauge_weights(gauge.address, 10000); // Max voting power is 10k points + + // We now need to go through an epoch for the votes to be locked in + await advanceTime(DAY * 8); + + await gaugeController.checkpoint(); + // Gauge weight is equal to the cap, and controller weight for the gauge is greater than the cap. + expect( + await gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, await currentWeekTimestamp()) + ).to.be.gt(weightCap); + expect(await gauge.getCappedRelativeWeight(await currentTimestamp())).to.equal(weightCap); + }); + + it('mint & bridge tokens', async () => { + // The gauge has votes for this week, and it will mint the first batch of tokens. We store the current gauge + // relative weight, as it will change as time goes by due to vote decay. + const firstMintWeekTimestamp = await currentWeekTimestamp(); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + + // Even though the gauge has relative weight, it cannot mint yet as it needs for the epoch to finish + const bridgeETH = await gauge.getTotalBridgeCost(); + const zeroMintTx = await authorizerAdaptor + .connect(admin) + .performAction(gauge.address, calldata, { value: bridgeETH }); + expectEvent.inIndirectReceipt(await zeroMintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp.sub(WEEK), // Process past week, which had zero votes + periodEmissions: 0, + }); + // No token transfers are performed if the emissions are zero, but we can't test for a lack of those + + await advanceTime(WEEK); + + // The gauge should now mint and send all minted tokens to the Arbitrum bridge + const mintTx = await authorizerAdaptor.connect(admin).performAction(gauge.address, calldata, { value: bridgeETH }); + const event = expectEvent.inIndirectReceipt(await mintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp, + }); + const actualEmissions = event.args.periodEmissions; + + // The amount of tokens minted should equal the weekly emissions rate times the relative weight of the gauge + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + + // Note that instead of the weight, we use the cap (since we expect for the weight to be larger than the cap) + const expectedEmissions = weightCap.mul(weeklyRate).div(FP_ONE); + expectEqualWithError(actualEmissions, expectedEmissions, 0.001); + + // Tokens are minted for the gauge + expectTransferEvent( + await mintTx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + value: actualEmissions, + }, + BAL + ); + + // And the gauge then deposits those in the predicate via the bridge mechanism + const bridgeInterface = new ethers.utils.Interface([ + 'event DepositInitiated(address l1Token, address indexed from, address indexed to, uint256 indexed sequenceNumber, uint256 amount)', + ]); + + expectEvent.inIndirectReceipt(await mintTx.wait(), bridgeInterface, 'DepositInitiated', { + from: gauge.address, + to: recipient.address, + l1Token: BAL, + amount: actualEmissions, + }); + }); + + it('mint multiple weeks', async () => { + const numberOfWeeks = 5; + await advanceTime(WEEK * numberOfWeeks); + await gaugeController.checkpoint_gauge(gauge.address); + + const weekTimestamp = await currentWeekTimestamp(); + + // We can query the relative weight of the gauge for each of the weeks that have passed + const relativeWeights: BigNumber[] = await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, weekTimestamp.sub(WEEK * weekIndex)) + ) + ); + + // We require that they're all above the cap for simplicity - this lets us use the cap as each week's weight (and + // also tests cap behavior). + for (const relativeWeight of relativeWeights) { + expect(relativeWeight).to.be.gt(weightCap); + } + + // The amount of tokens allocated to the gauge should equal the sum of the weekly emissions rate times the weight + // cap. + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + + // Note that instead of the weight, we use the cap (since we expect for the weight to be larger than the cap) + const expectedEmissions = weightCap.mul(numberOfWeeks).mul(weeklyRate).div(FP_ONE); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + const tx = await authorizerAdaptor + .connect(admin) + .performAction(gauge.address, calldata, { value: await gauge.getTotalBridgeCost() }); + + await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + expectEvent.inIndirectReceipt(await tx.wait(), gauge.interface, 'Checkpoint', { + periodTime: weekTimestamp.sub(WEEK * weekIndex), + }) + ) + ); + + // Tokens are minted for the gauge + const transferEvent = expectTransferEvent( + await tx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + }, + BAL + ); + + expect(transferEvent.args.value).to.be.almostEqual(expectedEmissions); + + // And the gauge then deposits those in the predicate via the bridge mechanism + const bridgeInterface = new ethers.utils.Interface([ + 'event DepositInitiated(address l1Token, address indexed from, address indexed to, uint256 indexed sequenceNumber, uint256 amount)', + ]); + + const depositEvent = expectEvent.inIndirectReceipt(await tx.wait(), bridgeInterface, 'DepositInitiated', { + from: gauge.address, + to: recipient.address, + l1Token: BAL, + }); + + expect(depositEvent.args.amount).to.be.almostEqual(expectedEmissions); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20220823-optimism-root-gauge-factory-v2/artifact/OptimismRootGauge.json b/balpy/balancer-deployments/tasks/20220823-optimism-root-gauge-factory-v2/artifact/OptimismRootGauge.json new file mode 100644 index 0000000..fe42c8d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220823-optimism-root-gauge-factory-v2/artifact/OptimismRootGauge.json @@ -0,0 +1,257 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "OptimismRootGauge", + "sourceName": "contracts/gauges/optimism/OptimismRootGauge.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IBalancerMinter", + "name": "minter", + "type": "address" + }, + { + "internalType": "contract IL1StandardBridge", + "name": "optimismL1StandardBridge", + "type": "address" + }, + { + "internalType": "address", + "name": "optimismBal", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "periodTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "periodEmissions", + "type": "uint256" + } + ], + "name": "Checkpoint", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "new_relative_weight_cap", + "type": "uint256" + } + ], + "name": "RelativeWeightCapChanged", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_RELATIVE_WEIGHT_CAP", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "checkpoint", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "time", + "type": "uint256" + } + ], + "name": "getCappedRelativeWeight", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOptimismBal", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOptimismBridge", + "outputs": [ + { + "internalType": "contract IL1StandardBridge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRecipient", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRelativeWeightCap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "relativeWeightCap", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "integrate_fraction", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "is_killed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "killGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "relativeWeightCap", + "type": "uint256" + } + ], + "name": "setRelativeWeightCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unkillGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "user_checkpoint", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x6101e06040523480156200001257600080fd5b506040516200173438038062001734833981810160405260608110156200003857600080fd5b50805160208083015160409384015160016000908155855163e6dec36f60e01b81529551949592949193869391926001600160a01b0385169263e6dec36f926004808301939192829003018186803b1580156200009457600080fd5b505afa158015620000a9573d6000803e3d6000fd5b505050506040513d6020811015620000c057600080fd5b50516040805163c003969960e01b815290519192506000916001600160a01b0384169163c0039699916004808301926020929190829003018186803b1580156200010957600080fd5b505afa1580156200011e573d6000803e3d6000fd5b505050506040513d60208110156200013557600080fd5b505160408051632c6f4d6f60e11b815290519192506000916001600160a01b038616916358de9ade916004808301926020929190829003018186803b1580156200017e57600080fd5b505afa15801562000193573d6000803e3d6000fd5b505050506040513d6020811015620001aa57600080fd5b50516001600160601b0319606084811b821660805285811b821660a05286811b821660c05282901b1660e052604080516303e1469160e61b815290519192506001600160a01b0383169163f851a44091600480820192602092909190829003018186803b1580156200021b57600080fd5b505afa15801562000230573d6000803e3d6000fd5b505050506040513d60208110156200024757600080fd5b505160601b6001600160601b0319166101005260408051635c3dab0b60e11b815290516001600160a01b0385169163b87b5616916004808301926020929190829003018186803b1580156200029b57600080fd5b505afa158015620002b0573d6000803e3d6000fd5b505050506040513d6020811015620002c757600080fd5b505161012052604080516321609bbf60e01b815290516001600160a01b038516916321609bbf916004808301926020929190829003018186803b1580156200030e57600080fd5b505afa15801562000323573d6000803e3d6000fd5b505050506040513d60208110156200033a57600080fd5b505161014052604080516303f7d6c760e51b815290516001600160a01b03851691637efad8e0916004808301926020929190829003018186803b1580156200038157600080fd5b505afa15801562000396573d6000803e3d6000fd5b505050506040513d6020811015620003ad57600080fd5b505161016052505060001960025550506001600160601b0319606092831b81166101805290821b166101a05233901b6101c0525060805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205161014051610160516101805160601c6101a05160601c6101c05160601c61128d620004a760003980610df85250806105525280610dd05250806105285280610ca25280610d8452508061087b52508061085a5250806107dd52806108c75250806103a352806105a752806106825280610ab6525080610442528061076b5250806109bd525080610fc652806110c3525080610c665280610dae525061128d6000f3fe6080604052600436106100dd5760003560e01c806383f5c39b1161007f578063ab8f094511610059578063ab8f094514610285578063c2c4c5c11461029a578063cd6dc687146102a2578063d34fb267146102e8576100dd565b806383f5c39b146102465780639c868ac01461025b5780639f86767114610270576100dd565b80631b88094d116100bb5780631b88094d1461018a5780632d8411af146101c85780634b820093146101dd57806360b630c414610231576100dd565b806309400707146100e257806310d3eb041461013457806314e956f514610160575b600080fd5b3480156100ee57600080fd5b506101226004803603602081101561010557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166102fd565b60408051918252519081900360200190f35b34801561014057600080fd5b5061015e6004803603602081101561015757600080fd5b503561038b565b005b34801561016c57600080fd5b506101226004803603602081101561018357600080fd5b503561043b565b34801561019657600080fd5b5061019f610509565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101d457600080fd5b5061019f610526565b3480156101e957600080fd5b5061021d6004803603602081101561020057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661054a565b604080519115158252519081900360200190f35b34801561023d57600080fd5b5061019f610550565b34801561025257600080fd5b50610122610574565b34801561026757600080fd5b5061021d61057a565b34801561027c57600080fd5b50610122610583565b34801561029157600080fd5b5061015e61058f565b61021d610660565b3480156102ae57600080fd5b5061015e600480360360408110156102c557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610a4d565b3480156102f457600080fd5b5061015e610a9e565b600073ffffffffffffffffffffffffffffffffffffffff8216301461038357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060045490565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461042f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b61043881610b6c565b50565b60006105037f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9430856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b1580156104cf57600080fd5b505afa1580156104e3573d6000803e3d6000fd5b505050506040513d60208110156104f957600080fd5b5051600654610c08565b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff165b90565b7f000000000000000000000000000000000000000000000000000000000000000090565b50600190565b7f000000000000000000000000000000000000000000000000000000000000000090565b60065490565b60055460ff1690565b670de0b6b3a764000081565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461063357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600061066a610c20565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461070e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600254600061071b610c39565b905080821015610a3f57604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b1580156107b257600080fd5b505af11580156107c6573d6000803e3d6000fd5b5050600180546003549590910194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff01811015610952578481111561081757610952565b62093a8081026000806108298361043b565b905082851015801561083f57508262093a800185105b156108f857828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008902816108a357fe5b04975062093a80819003670de0b6b3a7640000838a02820260018b905560038990557f0000000000000000000000000000000000000000000000000000000000000000909801970493909301925061090d9050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a2509390930192506001016107ff565b50600284905560048054830190558115801590610972575060055460ff16155b15610a3b57604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b158015610a0557600080fd5b505af1158015610a19573d6000803e3d6000fd5b505050506040513d6020811015610a2f57600080fd5b50610a3b905082610c64565b5050505b600192505050610523610f4c565b610a5681610f53565b50600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610b4257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b670de0b6b3a7640000811115610bcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806112006034913960400191505060405180910390fd5b60068190556040805182815290517f13e45870490f54cea50d245930d12102c72b502641ef6850d0b15a8c92decfb29181900360200190a150565b6000818310610c175781610c19565b825b9392505050565b610c3260026000541415610190611165565b6002600055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610d1557600080fd5b505af1158015610d29573d6000803e3d6000fd5b505050506040513d6020811015610d3f57600080fd5b5050600754604080517fa0566e72000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081169363838b2520937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000939283169288927f00000000000000000000000000000000000000000000000000000000000000009091169163a0566e7291600480820192602092909190829003018186803b158015610e4157600080fd5b505afa158015610e55573d6000803e3d6000fd5b505050506040513d6020811015610e6b57600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b16815273ffffffffffffffffffffffffffffffffffffffff96871660048201529486166024860152929094166044840152606483015263ffffffff909216608482015260c060a4820152600260c48201527f307800000000000000000000000000000000000000000000000000000000000060e4820152905161010480830192600092919082900301818387803b158015610f3157600080fd5b505af1158015610f45573d6000803e3d6000fd5b5050505050565b6001600055565b60025415610fc257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561102a57600080fd5b505afa15801561103e573d6000803e3d6000fd5b505050506040513d602081101561105457600080fd5b50519050806110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806112346024913960400191505060405180910390fd5b60018190556110bb610c39565b6002819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561112957600080fd5b505af115801561113d573d6000803e3d6000fd5b505050506040513d602081101561115357600080fd5b505160035561116182610b6c565b5050565b81611161577f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b604452611161918391610438917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fdfe52656c61746976652077656967687420636170206578636565647320616c6c6f776564206162736f6c757465206d6178696d756d42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a2646970667358221220ff2a9706b745306b49870563444d784a952596a63e92724a8efdf40bc53bd50e64736f6c63430007010033", + "deployedBytecode": "0x6080604052600436106100dd5760003560e01c806383f5c39b1161007f578063ab8f094511610059578063ab8f094514610285578063c2c4c5c11461029a578063cd6dc687146102a2578063d34fb267146102e8576100dd565b806383f5c39b146102465780639c868ac01461025b5780639f86767114610270576100dd565b80631b88094d116100bb5780631b88094d1461018a5780632d8411af146101c85780634b820093146101dd57806360b630c414610231576100dd565b806309400707146100e257806310d3eb041461013457806314e956f514610160575b600080fd5b3480156100ee57600080fd5b506101226004803603602081101561010557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166102fd565b60408051918252519081900360200190f35b34801561014057600080fd5b5061015e6004803603602081101561015757600080fd5b503561038b565b005b34801561016c57600080fd5b506101226004803603602081101561018357600080fd5b503561043b565b34801561019657600080fd5b5061019f610509565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101d457600080fd5b5061019f610526565b3480156101e957600080fd5b5061021d6004803603602081101561020057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661054a565b604080519115158252519081900360200190f35b34801561023d57600080fd5b5061019f610550565b34801561025257600080fd5b50610122610574565b34801561026757600080fd5b5061021d61057a565b34801561027c57600080fd5b50610122610583565b34801561029157600080fd5b5061015e61058f565b61021d610660565b3480156102ae57600080fd5b5061015e600480360360408110156102c557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610a4d565b3480156102f457600080fd5b5061015e610a9e565b600073ffffffffffffffffffffffffffffffffffffffff8216301461038357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060045490565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461042f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b61043881610b6c565b50565b60006105037f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9430856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b1580156104cf57600080fd5b505afa1580156104e3573d6000803e3d6000fd5b505050506040513d60208110156104f957600080fd5b5051600654610c08565b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff165b90565b7f000000000000000000000000000000000000000000000000000000000000000090565b50600190565b7f000000000000000000000000000000000000000000000000000000000000000090565b60065490565b60055460ff1690565b670de0b6b3a764000081565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461063357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600061066a610c20565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461070e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600254600061071b610c39565b905080821015610a3f57604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b1580156107b257600080fd5b505af11580156107c6573d6000803e3d6000fd5b5050600180546003549590910194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff01811015610952578481111561081757610952565b62093a8081026000806108298361043b565b905082851015801561083f57508262093a800185105b156108f857828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008902816108a357fe5b04975062093a80819003670de0b6b3a7640000838a02820260018b905560038990557f0000000000000000000000000000000000000000000000000000000000000000909801970493909301925061090d9050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a2509390930192506001016107ff565b50600284905560048054830190558115801590610972575060055460ff16155b15610a3b57604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b158015610a0557600080fd5b505af1158015610a19573d6000803e3d6000fd5b505050506040513d6020811015610a2f57600080fd5b50610a3b905082610c64565b5050505b600192505050610523610f4c565b610a5681610f53565b50600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610b4257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b670de0b6b3a7640000811115610bcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806112006034913960400191505060405180910390fd5b60068190556040805182815290517f13e45870490f54cea50d245930d12102c72b502641ef6850d0b15a8c92decfb29181900360200190a150565b6000818310610c175781610c19565b825b9392505050565b610c3260026000541415610190611165565b6002600055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610d1557600080fd5b505af1158015610d29573d6000803e3d6000fd5b505050506040513d6020811015610d3f57600080fd5b5050600754604080517fa0566e72000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081169363838b2520937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000939283169288927f00000000000000000000000000000000000000000000000000000000000000009091169163a0566e7291600480820192602092909190829003018186803b158015610e4157600080fd5b505afa158015610e55573d6000803e3d6000fd5b505050506040513d6020811015610e6b57600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b16815273ffffffffffffffffffffffffffffffffffffffff96871660048201529486166024860152929094166044840152606483015263ffffffff909216608482015260c060a4820152600260c48201527f307800000000000000000000000000000000000000000000000000000000000060e4820152905161010480830192600092919082900301818387803b158015610f3157600080fd5b505af1158015610f45573d6000803e3d6000fd5b5050505050565b6001600055565b60025415610fc257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561102a57600080fd5b505afa15801561103e573d6000803e3d6000fd5b505050506040513d602081101561105457600080fd5b50519050806110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806112346024913960400191505060405180910390fd5b60018190556110bb610c39565b6002819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561112957600080fd5b505af115801561113d573d6000803e3d6000fd5b505050506040513d602081101561115357600080fd5b505160035561116182610b6c565b5050565b81611161577f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b604452611161918391610438917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fdfe52656c61746976652077656967687420636170206578636565647320616c6c6f776564206162736f6c757465206d6178696d756d42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a2646970667358221220ff2a9706b745306b49870563444d784a952596a63e92724a8efdf40bc53bd50e64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220823-optimism-root-gauge-factory-v2/artifact/OptimismRootGaugeFactory.json b/balpy/balancer-deployments/tasks/20220823-optimism-root-gauge-factory-v2/artifact/OptimismRootGaugeFactory.json new file mode 100644 index 0000000..acc5d64 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220823-optimism-root-gauge-factory-v2/artifact/OptimismRootGaugeFactory.json @@ -0,0 +1,195 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "OptimismRootGaugeFactory", + "sourceName": "contracts/gauges/optimism/OptimismRootGaugeFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IBalancerMinter", + "name": "minter", + "type": "address" + }, + { + "internalType": "contract IL1StandardBridge", + "name": "optimismL1StandardBridge", + "type": "address" + }, + { + "internalType": "address", + "name": "optimismBal", + "type": "address" + }, + { + "internalType": "uint32", + "name": "gasLimit", + "type": "uint32" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "GaugeCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + } + ], + "name": "OptimismGasLimitModified", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "relativeWeightCap", + "type": "uint256" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeImplementation", + "outputs": [ + { + "internalType": "contract ILiquidityGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOptimismGasLimit", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "isGaugeFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "gasLimit", + "type": "uint32" + } + ], + "name": "setOptimismGasLimit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60c060405234801561001057600080fd5b506040516121a83803806121a883398101604081905261002f916100d9565b84306001600160a01b031660001b85858560405161004c906100cc565b61005893929190610155565b604051809103906000f080158015610074573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905560805260601b6001600160601b03191660a0526002805463ffffffff191663ffffffff929092169190911790555061019092505050565b61173480610a7483390190565b600080600080600060a086880312156100f0578081fd5b85516100fb81610178565b602087015190955061010c81610178565b604087015190945061011d81610178565b606087015190935061012e81610178565b608087015190925063ffffffff81168114610147578182fd5b809150509295509295909350565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b038116811461018d57600080fd5b50565b60805160a05160601c6108be6101b6600039806102455250806101f452506108be6000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063a0566e721161005b578063a0566e72146100e6578063aaabadc5146100fb578063bf5fa77214610103578063ce3cc8bd1461011857610088565b80630ecaea731461008d57806339312dee146100b6578063851c1bb3146100be5780638d928af8146100de575b600080fd5b6100a061009b36600461069c565b610138565b6040516100ad9190610797565b60405180910390f35b6100a06101d4565b6100d16100cc3660046106e7565b6101f0565b6040516100ad91906107e9565b6100a0610243565b6100ee610267565b6040516100ad9190610855565b6100a0610273565b610116610111366004610743565b6102ff565b005b61012b610126366004610680565b610372565b6040516100ad91906107de565b60008061014361039d565b6040517fcd6dc68700000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063cd6dc6879061019a90879087906004016107b8565b600060405180830381600087803b1580156101b457600080fd5b505af11580156101c8573d6000803e3d6000fd5b50929695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610225929190610767565b6040516020818303038152906040528051906020012090505b919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025463ffffffff1690565b600061027d610243565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156102c257600080fd5b505afa1580156102d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102fa9190610727565b905090565b610307610443565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff83161790556040517f7c1820748876489d9c02f32c788d21f7a0719b00e777eca80532dd5d77c481ce90610367908390610855565b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b6000805481906103c29073ffffffffffffffffffffffffffffffffffffffff1661048c565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006104726000357fffffffff00000000000000000000000000000000000000000000000000000000166101f0565b90506104896104818233610542565b6101916105df565b50565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff811661023e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105399061081e565b60405180910390fd5b600061054c610273565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401610588939291906107f2565b60206040518083038186803b1580156105a057600080fd5b505afa1580156105b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d891906106c7565b9392505050565b816105ed576105ed816105f1565b5050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b604452610489917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b600060208284031215610691578081fd5b81356105d881610866565b600080604083850312156106ae578081fd5b82356106b981610866565b946020939093013593505050565b6000602082840312156106d8578081fd5b815180151581146105d8578182fd5b6000602082840312156106f8578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146105d8578182fd5b600060208284031215610738578081fd5b81516105d881610866565b600060208284031215610754578081fd5b813563ffffffff811681146105d8578182fd5b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60208082526016908201527f455243313136373a20637265617465206661696c656400000000000000000000604082015260600190565b63ffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff8116811461048957600080fdfea264697066735822122029568a79d12c7078d206712a02bc1593672ab36c94eb5b9f4536fe6d6f56790964736f6c634300070100336101e06040523480156200001257600080fd5b506040516200173438038062001734833981810160405260608110156200003857600080fd5b50805160208083015160409384015160016000908155855163e6dec36f60e01b81529551949592949193869391926001600160a01b0385169263e6dec36f926004808301939192829003018186803b1580156200009457600080fd5b505afa158015620000a9573d6000803e3d6000fd5b505050506040513d6020811015620000c057600080fd5b50516040805163c003969960e01b815290519192506000916001600160a01b0384169163c0039699916004808301926020929190829003018186803b1580156200010957600080fd5b505afa1580156200011e573d6000803e3d6000fd5b505050506040513d60208110156200013557600080fd5b505160408051632c6f4d6f60e11b815290519192506000916001600160a01b038616916358de9ade916004808301926020929190829003018186803b1580156200017e57600080fd5b505afa15801562000193573d6000803e3d6000fd5b505050506040513d6020811015620001aa57600080fd5b50516001600160601b0319606084811b821660805285811b821660a05286811b821660c05282901b1660e052604080516303e1469160e61b815290519192506001600160a01b0383169163f851a44091600480820192602092909190829003018186803b1580156200021b57600080fd5b505afa15801562000230573d6000803e3d6000fd5b505050506040513d60208110156200024757600080fd5b505160601b6001600160601b0319166101005260408051635c3dab0b60e11b815290516001600160a01b0385169163b87b5616916004808301926020929190829003018186803b1580156200029b57600080fd5b505afa158015620002b0573d6000803e3d6000fd5b505050506040513d6020811015620002c757600080fd5b505161012052604080516321609bbf60e01b815290516001600160a01b038516916321609bbf916004808301926020929190829003018186803b1580156200030e57600080fd5b505afa15801562000323573d6000803e3d6000fd5b505050506040513d60208110156200033a57600080fd5b505161014052604080516303f7d6c760e51b815290516001600160a01b03851691637efad8e0916004808301926020929190829003018186803b1580156200038157600080fd5b505afa15801562000396573d6000803e3d6000fd5b505050506040513d6020811015620003ad57600080fd5b505161016052505060001960025550506001600160601b0319606092831b81166101805290821b166101a05233901b6101c0525060805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205161014051610160516101805160601c6101a05160601c6101c05160601c61128d620004a760003980610df85250806105525280610dd05250806105285280610ca25280610d8452508061087b52508061085a5250806107dd52806108c75250806103a352806105a752806106825280610ab6525080610442528061076b5250806109bd525080610fc652806110c3525080610c665280610dae525061128d6000f3fe6080604052600436106100dd5760003560e01c806383f5c39b1161007f578063ab8f094511610059578063ab8f094514610285578063c2c4c5c11461029a578063cd6dc687146102a2578063d34fb267146102e8576100dd565b806383f5c39b146102465780639c868ac01461025b5780639f86767114610270576100dd565b80631b88094d116100bb5780631b88094d1461018a5780632d8411af146101c85780634b820093146101dd57806360b630c414610231576100dd565b806309400707146100e257806310d3eb041461013457806314e956f514610160575b600080fd5b3480156100ee57600080fd5b506101226004803603602081101561010557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166102fd565b60408051918252519081900360200190f35b34801561014057600080fd5b5061015e6004803603602081101561015757600080fd5b503561038b565b005b34801561016c57600080fd5b506101226004803603602081101561018357600080fd5b503561043b565b34801561019657600080fd5b5061019f610509565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101d457600080fd5b5061019f610526565b3480156101e957600080fd5b5061021d6004803603602081101561020057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661054a565b604080519115158252519081900360200190f35b34801561023d57600080fd5b5061019f610550565b34801561025257600080fd5b50610122610574565b34801561026757600080fd5b5061021d61057a565b34801561027c57600080fd5b50610122610583565b34801561029157600080fd5b5061015e61058f565b61021d610660565b3480156102ae57600080fd5b5061015e600480360360408110156102c557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610a4d565b3480156102f457600080fd5b5061015e610a9e565b600073ffffffffffffffffffffffffffffffffffffffff8216301461038357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060045490565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461042f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b61043881610b6c565b50565b60006105037f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9430856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b1580156104cf57600080fd5b505afa1580156104e3573d6000803e3d6000fd5b505050506040513d60208110156104f957600080fd5b5051600654610c08565b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff165b90565b7f000000000000000000000000000000000000000000000000000000000000000090565b50600190565b7f000000000000000000000000000000000000000000000000000000000000000090565b60065490565b60055460ff1690565b670de0b6b3a764000081565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461063357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600061066a610c20565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461070e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600254600061071b610c39565b905080821015610a3f57604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b1580156107b257600080fd5b505af11580156107c6573d6000803e3d6000fd5b5050600180546003549590910194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff01811015610952578481111561081757610952565b62093a8081026000806108298361043b565b905082851015801561083f57508262093a800185105b156108f857828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008902816108a357fe5b04975062093a80819003670de0b6b3a7640000838a02820260018b905560038990557f0000000000000000000000000000000000000000000000000000000000000000909801970493909301925061090d9050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a2509390930192506001016107ff565b50600284905560048054830190558115801590610972575060055460ff16155b15610a3b57604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b158015610a0557600080fd5b505af1158015610a19573d6000803e3d6000fd5b505050506040513d6020811015610a2f57600080fd5b50610a3b905082610c64565b5050505b600192505050610523610f4c565b610a5681610f53565b50600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610b4257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b670de0b6b3a7640000811115610bcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806112006034913960400191505060405180910390fd5b60068190556040805182815290517f13e45870490f54cea50d245930d12102c72b502641ef6850d0b15a8c92decfb29181900360200190a150565b6000818310610c175781610c19565b825b9392505050565b610c3260026000541415610190611165565b6002600055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610d1557600080fd5b505af1158015610d29573d6000803e3d6000fd5b505050506040513d6020811015610d3f57600080fd5b5050600754604080517fa0566e72000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081169363838b2520937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000939283169288927f00000000000000000000000000000000000000000000000000000000000000009091169163a0566e7291600480820192602092909190829003018186803b158015610e4157600080fd5b505afa158015610e55573d6000803e3d6000fd5b505050506040513d6020811015610e6b57600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b16815273ffffffffffffffffffffffffffffffffffffffff96871660048201529486166024860152929094166044840152606483015263ffffffff909216608482015260c060a4820152600260c48201527f307800000000000000000000000000000000000000000000000000000000000060e4820152905161010480830192600092919082900301818387803b158015610f3157600080fd5b505af1158015610f45573d6000803e3d6000fd5b5050505050565b6001600055565b60025415610fc257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561102a57600080fd5b505afa15801561103e573d6000803e3d6000fd5b505050506040513d602081101561105457600080fd5b50519050806110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806112346024913960400191505060405180910390fd5b60018190556110bb610c39565b6002819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561112957600080fd5b505af115801561113d573d6000803e3d6000fd5b505050506040513d602081101561115357600080fd5b505160035561116182610b6c565b5050565b81611161577f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b604452611161918391610438917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fdfe52656c61746976652077656967687420636170206578636565647320616c6c6f776564206162736f6c757465206d6178696d756d42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a2646970667358221220ff2a9706b745306b49870563444d784a952596a63e92724a8efdf40bc53bd50e64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063a0566e721161005b578063a0566e72146100e6578063aaabadc5146100fb578063bf5fa77214610103578063ce3cc8bd1461011857610088565b80630ecaea731461008d57806339312dee146100b6578063851c1bb3146100be5780638d928af8146100de575b600080fd5b6100a061009b36600461069c565b610138565b6040516100ad9190610797565b60405180910390f35b6100a06101d4565b6100d16100cc3660046106e7565b6101f0565b6040516100ad91906107e9565b6100a0610243565b6100ee610267565b6040516100ad9190610855565b6100a0610273565b610116610111366004610743565b6102ff565b005b61012b610126366004610680565b610372565b6040516100ad91906107de565b60008061014361039d565b6040517fcd6dc68700000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063cd6dc6879061019a90879087906004016107b8565b600060405180830381600087803b1580156101b457600080fd5b505af11580156101c8573d6000803e3d6000fd5b50929695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610225929190610767565b6040516020818303038152906040528051906020012090505b919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025463ffffffff1690565b600061027d610243565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156102c257600080fd5b505afa1580156102d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102fa9190610727565b905090565b610307610443565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff83161790556040517f7c1820748876489d9c02f32c788d21f7a0719b00e777eca80532dd5d77c481ce90610367908390610855565b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b6000805481906103c29073ffffffffffffffffffffffffffffffffffffffff1661048c565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006104726000357fffffffff00000000000000000000000000000000000000000000000000000000166101f0565b90506104896104818233610542565b6101916105df565b50565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff811661023e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105399061081e565b60405180910390fd5b600061054c610273565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401610588939291906107f2565b60206040518083038186803b1580156105a057600080fd5b505afa1580156105b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d891906106c7565b9392505050565b816105ed576105ed816105f1565b5050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b604452610489917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b600060208284031215610691578081fd5b81356105d881610866565b600080604083850312156106ae578081fd5b82356106b981610866565b946020939093013593505050565b6000602082840312156106d8578081fd5b815180151581146105d8578182fd5b6000602082840312156106f8578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146105d8578182fd5b600060208284031215610738578081fd5b81516105d881610866565b600060208284031215610754578081fd5b813563ffffffff811681146105d8578182fd5b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60208082526016908201527f455243313136373a20637265617465206661696c656400000000000000000000604082015260600190565b63ffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff8116811461048957600080fdfea264697066735822122029568a79d12c7078d206712a02bc1593672ab36c94eb5b9f4536fe6d6f56790964736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220823-optimism-root-gauge-factory-v2/index.ts b/balpy/balancer-deployments/tasks/20220823-optimism-root-gauge-factory-v2/index.ts new file mode 100644 index 0000000..5ca344b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220823-optimism-root-gauge-factory-v2/index.ts @@ -0,0 +1,18 @@ +import { Task, TaskRunOptions } from '@src'; +import { OptimismRootGaugeFactoryDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as OptimismRootGaugeFactoryDeployment; + + const args = [input.Vault, input.BalancerMinter, input.L1StandardBridge, input.OptimismBAL, input.GasLimit]; + + const factory = await task.deployAndVerify('OptimismRootGaugeFactory', args, from, force); + + const implementation = await factory.getGaugeImplementation(); + await task.verify('OptimismRootGauge', implementation, [ + input.BalancerMinter, + input.L1StandardBridge, + input.OptimismBAL, + ]); + await task.save({ OptimismRootGauge: implementation }); +}; diff --git a/balpy/balancer-deployments/tasks/20220823-optimism-root-gauge-factory-v2/input.ts b/balpy/balancer-deployments/tasks/20220823-optimism-root-gauge-factory-v2/input.ts new file mode 100644 index 0000000..477f833 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220823-optimism-root-gauge-factory-v2/input.ts @@ -0,0 +1,29 @@ +import { Task, TaskMode } from '@src'; + +export type OptimismRootGaugeFactoryDeployment = { + Vault: string; + BalancerMinter: string; + OptimismBAL: string; + L1StandardBridge: string; + GasLimit: number; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerMinter = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); + +export default { + mainnet: { + Vault, + BalancerMinter, + // There is no strictly canonical BAL on Optimism (The bridge supports a one-to-many L1-to-L2 tokens relationship) + // so we can't read this from onchain. This token holds all of Optimism's BAL TVL currently. + // https://optimistic.etherscan.io/token/0xFE8B128bA8C78aabC59d4c64cEE7fF28e9379921 + OptimismBAL: '0xFE8B128bA8C78aabC59d4c64cEE7fF28e9379921', + // Can't find a source for this but its BAL holding match up with the total supply of BAL on Optimism. + L1StandardBridge: '0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1', + // This value is the current maximum amount of gas which doesn't trigger the spam prevention mechanism. + // https://github.com/ethereum-optimism/optimism/blob/68fc3fed54390ab42e5444c0091a6231fb5191c4/packages/contracts/contracts/L1/rollup/CanonicalTransactionChain.sol#L38 + // Value can be read at: https://etherscan.io/address/0x5e4e65926ba27467555eb562121fac00d24e9dd2#readContract + GasLimit: 1920000, + }, +}; diff --git a/balpy/balancer-deployments/tasks/20220823-optimism-root-gauge-factory-v2/output/mainnet.json b/balpy/balancer-deployments/tasks/20220823-optimism-root-gauge-factory-v2/output/mainnet.json new file mode 100644 index 0000000..1ce7518 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220823-optimism-root-gauge-factory-v2/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "OptimismRootGaugeFactory": "0x866D4B65694c66fbFD15Dd6fa933D0A6b3940A36", + "OptimismRootGauge": "0xBC230b1a66A138cD9cFC7b352390025978dFAdde" +} diff --git a/balpy/balancer-deployments/tasks/20220823-optimism-root-gauge-factory-v2/readme.md b/balpy/balancer-deployments/tasks/20220823-optimism-root-gauge-factory-v2/readme.md new file mode 100644 index 0000000..106ce5c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220823-optimism-root-gauge-factory-v2/readme.md @@ -0,0 +1,9 @@ +# 2022-08-23 - Optimism Root Gauge Factory V2 + +Deployment of the `OptimismRootGaugeFactory`, for stakeless gauges that bridge funds to their Optimism counterparts. This updated version includes caps on the relative weight (allocated emissions) for each gauge. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [`OptimismRootGauge` artifact](./artifact/OptimismRootGauge.json) +- [`OptimismRootGaugeFactory` artifact](./artifact/OptimismRootGaugeFactory.json) diff --git a/balpy/balancer-deployments/tasks/20220823-optimism-root-gauge-factory-v2/test/task.fork.ts b/balpy/balancer-deployments/tasks/20220823-optimism-root-gauge-factory-v2/test/task.fork.ts new file mode 100644 index 0000000..8ef9fe3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220823-optimism-root-gauge-factory-v2/test/task.fork.ts @@ -0,0 +1,246 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import { BigNumber, fp, FP_ONE } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { advanceTime, currentTimestamp, currentWeekTimestamp, DAY, WEEK } from '@helpers/time'; +import * as expectEvent from '@helpers/expectEvent'; + +import { expectEqualWithError } from '@helpers/relativeError'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import { range } from 'lodash'; +import { expectTransferEvent } from '@helpers/expectTransfer'; +import { actionId } from '@helpers/models/misc/actions'; + +import { describeForkTest, getSigner, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; + +describeForkTest('OptimismRootGaugeFactoryV2', 'mainnet', 15397200, function () { + let veBALHolder: SignerWithAddress, admin: SignerWithAddress, recipient: SignerWithAddress; + let factory: Contract, gauge: Contract; + let vault: Contract, + authorizer: Contract, + authorizerAdaptor: Contract, + BALTokenAdmin: Contract, + gaugeController: Contract, + gaugeAdder: Contract; + let BAL: string; + + let task: Task; + let OptimismBAL: string; + + const VEBAL_HOLDER = '0xd519D5704B41511951C8CF9f65Fee9AB9beF2611'; + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + + const weightCap = fp(0.001); + + before('run task', async () => { + task = new Task('20220823-optimism-root-gauge-factory-v2', TaskMode.TEST, getForkedNetwork(hre)); + ({ OptimismBAL } = task.input()); + await task.run({ force: true }); + factory = await task.deployedInstance('OptimismRootGaugeFactory'); + }); + + before('advance time', async () => { + // This causes all voting cooldowns to expire, letting the veBAL holder vote again + await advanceTime(DAY * 12); + }); + + before('setup accounts', async () => { + admin = await getSigner(0); + recipient = await getSigner(1); + + veBALHolder = await impersonate(VEBAL_HOLDER); + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.deployedInstance('Vault'); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + + const authorizerAdaptorTask = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizerAdaptor = await authorizerAdaptorTask.deployedInstance('AuthorizerAdaptor'); + + const gaugeAdderTask = new Task('20220628-gauge-adder-v2', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeAdder = await gaugeAdderTask.deployedInstance('GaugeAdder'); + + const balancerTokenAdminTask = new Task('20220325-balancer-token-admin', TaskMode.READ_ONLY, getForkedNetwork(hre)); + BALTokenAdmin = await balancerTokenAdminTask.deployedInstance('BalancerTokenAdmin'); + + BAL = await BALTokenAdmin.getBalancerToken(); + + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeController = await gaugeControllerTask.deployedInstance('GaugeController'); + }); + + it('create gauge', async () => { + const tx = await factory.create(recipient.address, weightCap); + const event = expectEvent.inReceipt(await tx.wait(), 'GaugeCreated'); + + gauge = await task.instanceAt('OptimismRootGauge', event.args.gauge); + + expect(await factory.isGaugeFromFactory(gauge.address)).to.be.true; + }); + + it('grant permissions', async () => { + // We need to grant permission to the admin to add the Optimism factory to the GaugeAdder, and also to then add + // gauges from said factory to the GaugeController. + const govMultisig = await impersonate(GOV_MULTISIG); + + await Promise.all( + ['addGaugeFactory', 'addOptimismGauge'].map( + async (method) => + await authorizer.connect(govMultisig).grantRole(await actionId(gaugeAdder, method), admin.address) + ) + ); + + // We also need to grant permissions to mint in the gauges, which is done via the Authorizer Adaptor + await authorizer + .connect(govMultisig) + .grantRole(await authorizerAdaptor.getActionId(gauge.interface.getSighash('checkpoint')), admin.address); + }); + + it('add gauge to gauge controller', async () => { + await gaugeAdder.connect(admin).addGaugeFactory(factory.address, 5); // Optimism is Gauge Type 5 + await gaugeAdder.connect(admin).addOptimismGauge(gauge.address); + + expect(await gaugeController.gauge_exists(gauge.address)).to.be.true; + }); + + it('vote for gauge', async () => { + expect(await gaugeController.get_gauge_weight(gauge.address)).to.equal(0); + expect(await gauge.getCappedRelativeWeight(await currentTimestamp())).to.equal(0); + + await gaugeController.connect(veBALHolder).vote_for_gauge_weights(gauge.address, 10000); // Max voting power is 10k points + + // We now need to go through an epoch for the votes to be locked in + await advanceTime(DAY * 8); + + await gaugeController.checkpoint(); + // Gauge weight is equal to the cap, and controller weight for the gauge is greater than the cap. + expect( + await gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, await currentWeekTimestamp()) + ).to.be.gt(weightCap); + expect(await gauge.getCappedRelativeWeight(await currentTimestamp())).to.equal(weightCap); + }); + + it('mint & bridge tokens', async () => { + // The gauge has votes for this week, and it will mint the first batch of tokens. We store the current gauge + // relative weight, as it will change as time goes by due to vote decay. + const firstMintWeekTimestamp = await currentWeekTimestamp(); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + + // Even though the gauge has relative weight, it cannot mint yet as it needs for the epoch to finish + const zeroMintTx = await authorizerAdaptor.connect(admin).performAction(gauge.address, calldata); + expectEvent.inIndirectReceipt(await zeroMintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp.sub(WEEK), // Process past week, which had zero votes + periodEmissions: 0, + }); + // No token transfers are performed if the emissions are zero, but we can't test for a lack of those + + await advanceTime(WEEK); + + // The gauge should now mint and send all minted tokens to the Arbitrum bridge + const mintTx = await authorizerAdaptor.connect(admin).performAction(gauge.address, calldata); + const event = expectEvent.inIndirectReceipt(await mintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp, + }); + const actualEmissions = event.args.periodEmissions; + + // The amount of tokens minted should equal the weekly emissions rate times the relative weight of the gauge + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + + // Note that instead of the weight, we use the cap (since we expect for the weight to be larger than the cap) + const expectedEmissions = weightCap.mul(weeklyRate).div(FP_ONE); + expectEqualWithError(actualEmissions, expectedEmissions, 0.001); + + // Tokens are minted for the gauge + expectTransferEvent( + await mintTx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + value: actualEmissions, + }, + BAL + ); + + // And the gauge then deposits those in the predicate via the bridge mechanism + const bridgeInterface = new ethers.utils.Interface([ + 'event ERC20DepositInitiated(address indexed _l1Token, address indexed _l2Token, address indexed _from, address _to, uint256 _amount, bytes _data)', + ]); + + expectEvent.inIndirectReceipt(await mintTx.wait(), bridgeInterface, 'ERC20DepositInitiated', { + _l1Token: BAL, + _l2Token: OptimismBAL, + _from: gauge.address, + _to: recipient.address, + _amount: actualEmissions, + }); + }); + + it('mint multiple weeks', async () => { + const numberOfWeeks = 5; + await advanceTime(WEEK * numberOfWeeks); + await gaugeController.checkpoint_gauge(gauge.address); + + const weekTimestamp = await currentWeekTimestamp(); + + // We can query the relative weight of the gauge for each of the weeks that have passed + const relativeWeights: BigNumber[] = await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, weekTimestamp.sub(WEEK * weekIndex)) + ) + ); + + // We require that they're all above the cap for simplicity - this lets us use the cap as each week's weight (and + // also tests cap behavior). + for (const relativeWeight of relativeWeights) { + expect(relativeWeight).to.be.gt(weightCap); + } + + // The amount of tokens allocated to the gauge should equal the sum of the weekly emissions rate times the weight + // cap. + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + // Note that instead of the weight, we use the cap (since we expect for the weight to be larger than the cap) + const expectedEmissions = weightCap.mul(numberOfWeeks).mul(weeklyRate).div(FP_ONE); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + const tx = await authorizerAdaptor.connect(admin).performAction(gauge.address, calldata); + + await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + expectEvent.inIndirectReceipt(await tx.wait(), gauge.interface, 'Checkpoint', { + periodTime: weekTimestamp.sub(WEEK * weekIndex), + }) + ) + ); + + // Tokens are minted for the gauge + const transferEvent = expectTransferEvent( + await tx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + }, + BAL + ); + + expect(transferEvent.args.value).to.be.almostEqual(expectedEmissions); + + // And the gauge then deposits those in the predicate via the bridge mechanism + const bridgeInterface = new ethers.utils.Interface([ + 'event ERC20DepositInitiated(address indexed _l1Token, address indexed _l2Token, address indexed _from, address _to, uint256 _amount, bytes _data)', + ]); + + const depositEvent = expectEvent.inIndirectReceipt(await tx.wait(), bridgeInterface, 'ERC20DepositInitiated', { + _l1Token: BAL, + _l2Token: OptimismBAL, + _from: gauge.address, + _to: recipient.address, + }); + + expect(depositEvent.args._amount).to.be.almostEqual(expectedEmissions); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20220823-polygon-root-gauge-factory-v2/artifact/PolygonRootGauge.json b/balpy/balancer-deployments/tasks/20220823-polygon-root-gauge-factory-v2/artifact/PolygonRootGauge.json new file mode 100644 index 0000000..e4f363b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220823-polygon-root-gauge-factory-v2/artifact/PolygonRootGauge.json @@ -0,0 +1,257 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonRootGauge", + "sourceName": "contracts/gauges/polygon/PolygonRootGauge.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IBalancerMinter", + "name": "minter", + "type": "address" + }, + { + "internalType": "contract IPolygonRootChainManager", + "name": "polygonRootChainManager", + "type": "address" + }, + { + "internalType": "address", + "name": "polygonERC20Predicate", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "periodTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "periodEmissions", + "type": "uint256" + } + ], + "name": "Checkpoint", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "new_relative_weight_cap", + "type": "uint256" + } + ], + "name": "RelativeWeightCapChanged", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_RELATIVE_WEIGHT_CAP", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "checkpoint", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "time", + "type": "uint256" + } + ], + "name": "getCappedRelativeWeight", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPolygonBridge", + "outputs": [ + { + "internalType": "contract IPolygonRootChainManager", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPolygonERC20Predicate", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRecipient", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRelativeWeightCap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "relativeWeightCap", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "integrate_fraction", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "is_killed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "killGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "relativeWeightCap", + "type": "uint256" + } + ], + "name": "setRelativeWeightCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unkillGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "user_checkpoint", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x6101c06040523480156200001257600080fd5b506040516200166b3803806200166b833981810160405260608110156200003857600080fd5b50805160208083015160409384015160016000908155855163e6dec36f60e01b81529551949592949193869391926001600160a01b0385169263e6dec36f926004808301939192829003018186803b1580156200009457600080fd5b505afa158015620000a9573d6000803e3d6000fd5b505050506040513d6020811015620000c057600080fd5b50516040805163c003969960e01b815290519192506000916001600160a01b0384169163c0039699916004808301926020929190829003018186803b1580156200010957600080fd5b505afa1580156200011e573d6000803e3d6000fd5b505050506040513d60208110156200013557600080fd5b505160408051632c6f4d6f60e11b815290519192506000916001600160a01b038616916358de9ade916004808301926020929190829003018186803b1580156200017e57600080fd5b505afa15801562000193573d6000803e3d6000fd5b505050506040513d6020811015620001aa57600080fd5b50516001600160601b0319606084811b821660805285811b821660a05286811b821660c05282901b1660e052604080516303e1469160e61b815290519192506001600160a01b0383169163f851a44091600480820192602092909190829003018186803b1580156200021b57600080fd5b505afa15801562000230573d6000803e3d6000fd5b505050506040513d60208110156200024757600080fd5b505160601b6001600160601b0319166101005260408051635c3dab0b60e11b815290516001600160a01b0385169163b87b5616916004808301926020929190829003018186803b1580156200029b57600080fd5b505afa158015620002b0573d6000803e3d6000fd5b505050506040513d6020811015620002c757600080fd5b505161012052604080516321609bbf60e01b815290516001600160a01b038516916321609bbf916004808301926020929190829003018186803b1580156200030e57600080fd5b505afa15801562000323573d6000803e3d6000fd5b505050506040513d60208110156200033a57600080fd5b505161014052604080516303f7d6c760e51b815290516001600160a01b03851691637efad8e0916004808301926020929190829003018186803b1580156200038157600080fd5b505afa15801562000396573d6000803e3d6000fd5b505050506040513d6020811015620003ad57600080fd5b505161016052505060001960025550506001600160601b0319606092831b811661018052911b166101a0525060805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205161014051610160516101805160601c6101a05160601c6111de6200048d60003980610b4a5280610ca2525080610b265280610de0525080610833525080610812525080610795528061087f5250806103a3528061055f528061063a5280610a6e5250806104425280610723525080610975525080610f175280611014525080610c665280610da552506111de6000f3fe6080604052600436106100dd5760003560e01c80639f8676711161007f578063cd6dc68711610059578063cd6dc68714610278578063d34fb267146102be578063fe022cc9146102d3578063fe33859e146102e8576100dd565b80639f86767114610246578063ab8f09451461025b578063c2c4c5c114610270576100dd565b80631b88094d116100bb5780631b88094d1461018a5780634b820093146101c857806383f5c39b1461021c5780639c868ac014610231576100dd565b806309400707146100e257806310d3eb041461013457806314e956f514610160575b600080fd5b3480156100ee57600080fd5b506101226004803603602081101561010557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166102fd565b60408051918252519081900360200190f35b34801561014057600080fd5b5061015e6004803603602081101561015757600080fd5b503561038b565b005b34801561016c57600080fd5b506101226004803603602081101561018357600080fd5b503561043b565b34801561019657600080fd5b5061019f610509565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101d457600080fd5b50610208600480360360208110156101eb57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610526565b604080519115158252519081900360200190f35b34801561022857600080fd5b5061012261052c565b34801561023d57600080fd5b50610208610532565b34801561025257600080fd5b5061012261053b565b34801561026757600080fd5b5061015e610547565b610208610618565b34801561028457600080fd5b5061015e6004803603604081101561029b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610a05565b3480156102ca57600080fd5b5061015e610a56565b3480156102df57600080fd5b5061019f610b24565b3480156102f457600080fd5b5061019f610b48565b600073ffffffffffffffffffffffffffffffffffffffff8216301461038357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060045490565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461042f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b61043881610b6c565b50565b60006105037f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9430856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b1580156104cf57600080fd5b505afa1580156104e3573d6000803e3d6000fd5b505050506040513d60208110156104f957600080fd5b5051600654610c08565b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff165b90565b50600190565b60065490565b60055460ff1690565b670de0b6b3a764000081565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146105eb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610622610c20565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106c657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b60025460006106d3610c39565b9050808210156109f757604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b15801561076a57600080fd5b505af115801561077e573d6000803e3d6000fd5b5050600180546003549590910194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff0181101561090a57848111156107cf5761090a565b62093a8081026000806107e18361043b565b90508285101580156107f757508262093a800185105b156108b057828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000089028161085b57fe5b04975062093a80819003670de0b6b3a7640000838a02820260018b905560038990557f000000000000000000000000000000000000000000000000000000000000000090980197049390930192506108c59050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a2509390930192506001016107b7565b5060028490556004805483019055811580159061092a575060055460ff16155b156109f357604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b1580156109bd57600080fd5b505af11580156109d1573d6000803e3d6000fd5b505050506040513d60208110156109e757600080fd5b506109f3905082610c64565b5050505b600192505050610523610e9d565b610a0e81610ea4565b50600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610afa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b670de0b6b3a7640000811115610bcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806111516034913960400191505060405180910390fd5b60068190556040805182815290517f13e45870490f54cea50d245930d12102c72b502641ef6850d0b15a8c92decfb29181900360200190a150565b6000818310610c175781610c19565b825b9392505050565b610c32600260005414156101906110b6565b6002600055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610d1557600080fd5b505af1158015610d29573d6000803e3d6000fd5b505050506040513d6020811015610d3f57600080fd5b5050600754604080516020808201859052825180830382018152828401938490527fe3dec8fb0000000000000000000000000000000000000000000000000000000090935273ffffffffffffffffffffffffffffffffffffffff938416604483018181527f00000000000000000000000000000000000000000000000000000000000000008087166064860152606060848601908152865160a487015286517f00000000000000000000000000000000000000000000000000000000000000009098169763e3dec8fb9794969295919260c4019185019080838360005b83811015610e34578181015183820152602001610e1c565b50505050905090810190601f168015610e615780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015610e8257600080fd5b505af1158015610e96573d6000803e3d6000fd5b5050505050565b6001600055565b60025415610f1357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f7b57600080fd5b505afa158015610f8f573d6000803e3d6000fd5b505050506040513d6020811015610fa557600080fd5b5051905080610fff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806111856024913960400191505060405180910390fd5b600181905561100c610c39565b6002819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561107a57600080fd5b505af115801561108e573d6000803e3d6000fd5b505050506040513d60208110156110a457600080fd5b50516003556110b282610b6c565b5050565b816110b2577f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526110b2918391610438917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fdfe52656c61746976652077656967687420636170206578636565647320616c6c6f776564206162736f6c757465206d6178696d756d42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a26469706673582212206ad35df5d7e0be9e2afe95eae3d417fdd8cfe136e0b275abda752f660a95125d64736f6c63430007010033", + "deployedBytecode": "0x6080604052600436106100dd5760003560e01c80639f8676711161007f578063cd6dc68711610059578063cd6dc68714610278578063d34fb267146102be578063fe022cc9146102d3578063fe33859e146102e8576100dd565b80639f86767114610246578063ab8f09451461025b578063c2c4c5c114610270576100dd565b80631b88094d116100bb5780631b88094d1461018a5780634b820093146101c857806383f5c39b1461021c5780639c868ac014610231576100dd565b806309400707146100e257806310d3eb041461013457806314e956f514610160575b600080fd5b3480156100ee57600080fd5b506101226004803603602081101561010557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166102fd565b60408051918252519081900360200190f35b34801561014057600080fd5b5061015e6004803603602081101561015757600080fd5b503561038b565b005b34801561016c57600080fd5b506101226004803603602081101561018357600080fd5b503561043b565b34801561019657600080fd5b5061019f610509565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101d457600080fd5b50610208600480360360208110156101eb57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610526565b604080519115158252519081900360200190f35b34801561022857600080fd5b5061012261052c565b34801561023d57600080fd5b50610208610532565b34801561025257600080fd5b5061012261053b565b34801561026757600080fd5b5061015e610547565b610208610618565b34801561028457600080fd5b5061015e6004803603604081101561029b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610a05565b3480156102ca57600080fd5b5061015e610a56565b3480156102df57600080fd5b5061019f610b24565b3480156102f457600080fd5b5061019f610b48565b600073ffffffffffffffffffffffffffffffffffffffff8216301461038357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060045490565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461042f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b61043881610b6c565b50565b60006105037f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9430856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b1580156104cf57600080fd5b505afa1580156104e3573d6000803e3d6000fd5b505050506040513d60208110156104f957600080fd5b5051600654610c08565b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff165b90565b50600190565b60065490565b60055460ff1690565b670de0b6b3a764000081565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146105eb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610622610c20565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106c657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b60025460006106d3610c39565b9050808210156109f757604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b15801561076a57600080fd5b505af115801561077e573d6000803e3d6000fd5b5050600180546003549590910194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff0181101561090a57848111156107cf5761090a565b62093a8081026000806107e18361043b565b90508285101580156107f757508262093a800185105b156108b057828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000089028161085b57fe5b04975062093a80819003670de0b6b3a7640000838a02820260018b905560038990557f000000000000000000000000000000000000000000000000000000000000000090980197049390930192506108c59050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a2509390930192506001016107b7565b5060028490556004805483019055811580159061092a575060055460ff16155b156109f357604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b1580156109bd57600080fd5b505af11580156109d1573d6000803e3d6000fd5b505050506040513d60208110156109e757600080fd5b506109f3905082610c64565b5050505b600192505050610523610e9d565b610a0e81610ea4565b50600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610afa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b670de0b6b3a7640000811115610bcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806111516034913960400191505060405180910390fd5b60068190556040805182815290517f13e45870490f54cea50d245930d12102c72b502641ef6850d0b15a8c92decfb29181900360200190a150565b6000818310610c175781610c19565b825b9392505050565b610c32600260005414156101906110b6565b6002600055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610d1557600080fd5b505af1158015610d29573d6000803e3d6000fd5b505050506040513d6020811015610d3f57600080fd5b5050600754604080516020808201859052825180830382018152828401938490527fe3dec8fb0000000000000000000000000000000000000000000000000000000090935273ffffffffffffffffffffffffffffffffffffffff938416604483018181527f00000000000000000000000000000000000000000000000000000000000000008087166064860152606060848601908152865160a487015286517f00000000000000000000000000000000000000000000000000000000000000009098169763e3dec8fb9794969295919260c4019185019080838360005b83811015610e34578181015183820152602001610e1c565b50505050905090810190601f168015610e615780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015610e8257600080fd5b505af1158015610e96573d6000803e3d6000fd5b5050505050565b6001600055565b60025415610f1357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f7b57600080fd5b505afa158015610f8f573d6000803e3d6000fd5b505050506040513d6020811015610fa557600080fd5b5051905080610fff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806111856024913960400191505060405180910390fd5b600181905561100c610c39565b6002819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561107a57600080fd5b505af115801561108e573d6000803e3d6000fd5b505050506040513d60208110156110a457600080fd5b50516003556110b282610b6c565b5050565b816110b2577f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526110b2918391610438917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fdfe52656c61746976652077656967687420636170206578636565647320616c6c6f776564206162736f6c757465206d6178696d756d42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a26469706673582212206ad35df5d7e0be9e2afe95eae3d417fdd8cfe136e0b275abda752f660a95125d64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220823-polygon-root-gauge-factory-v2/artifact/PolygonRootGaugeFactory.json b/balpy/balancer-deployments/tasks/20220823-polygon-root-gauge-factory-v2/artifact/PolygonRootGaugeFactory.json new file mode 100644 index 0000000..c6699d4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220823-polygon-root-gauge-factory-v2/artifact/PolygonRootGaugeFactory.json @@ -0,0 +1,101 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonRootGaugeFactory", + "sourceName": "contracts/gauges/polygon/PolygonRootGaugeFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IBalancerMinter", + "name": "minter", + "type": "address" + }, + { + "internalType": "contract IPolygonRootChainManager", + "name": "polygonRootChainManager", + "type": "address" + }, + { + "internalType": "address", + "name": "polygonERC20Predicate", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "GaugeCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "relativeWeightCap", + "type": "uint256" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeImplementation", + "outputs": [ + { + "internalType": "contract ILiquidityGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "isGaugeFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50604051611ba9380380611ba983398101604081905261002f9161009d565b82828260405161003e90610090565b61004a939291906100e9565b604051809103906000f080158015610066573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905550610124915050565b61166b8061053e83390190565b6000806000606084860312156100b1578283fd5b83516100bc8161010c565b60208501519093506100cd8161010c565b60408501519092506100de8161010c565b809150509250925092565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b038116811461012157600080fd5b50565b61040b806101336000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80630ecaea731461004657806339312dee1461006f578063ce3cc8bd14610077575b600080fd5b610059610054366004610322565b610097565b604051610066919061034c565b60405180910390f35b610059610135565b61008a610085366004610300565b610151565b6040516100669190610393565b6000806100a2610180565b6040517fcd6dc68700000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063cd6dc687906100f9908790879060040161036d565b600060405180830381600087803b15801561011357600080fd5b505af1158015610127573d6000803e3d6000fd5b509293505050505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff165b919050565b6000805481906101a59073ffffffffffffffffffffffffffffffffffffffff16610226565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff811661017b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d39061039e565b60405180910390fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461012f57600080fd5b600060208284031215610311578081fd5b61031b83836102dc565b9392505050565b60008060408385031215610334578081fd5b61033e84846102dc565b946020939093013593505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b60208082526016908201527f455243313136373a20637265617465206661696c65640000000000000000000060408201526060019056fea264697066735822122021d2afd83ba0639e62931740baaac1970665ed026d32e37ff0ef33d2e3b2a82c64736f6c634300070100336101c06040523480156200001257600080fd5b506040516200166b3803806200166b833981810160405260608110156200003857600080fd5b50805160208083015160409384015160016000908155855163e6dec36f60e01b81529551949592949193869391926001600160a01b0385169263e6dec36f926004808301939192829003018186803b1580156200009457600080fd5b505afa158015620000a9573d6000803e3d6000fd5b505050506040513d6020811015620000c057600080fd5b50516040805163c003969960e01b815290519192506000916001600160a01b0384169163c0039699916004808301926020929190829003018186803b1580156200010957600080fd5b505afa1580156200011e573d6000803e3d6000fd5b505050506040513d60208110156200013557600080fd5b505160408051632c6f4d6f60e11b815290519192506000916001600160a01b038616916358de9ade916004808301926020929190829003018186803b1580156200017e57600080fd5b505afa15801562000193573d6000803e3d6000fd5b505050506040513d6020811015620001aa57600080fd5b50516001600160601b0319606084811b821660805285811b821660a05286811b821660c05282901b1660e052604080516303e1469160e61b815290519192506001600160a01b0383169163f851a44091600480820192602092909190829003018186803b1580156200021b57600080fd5b505afa15801562000230573d6000803e3d6000fd5b505050506040513d60208110156200024757600080fd5b505160601b6001600160601b0319166101005260408051635c3dab0b60e11b815290516001600160a01b0385169163b87b5616916004808301926020929190829003018186803b1580156200029b57600080fd5b505afa158015620002b0573d6000803e3d6000fd5b505050506040513d6020811015620002c757600080fd5b505161012052604080516321609bbf60e01b815290516001600160a01b038516916321609bbf916004808301926020929190829003018186803b1580156200030e57600080fd5b505afa15801562000323573d6000803e3d6000fd5b505050506040513d60208110156200033a57600080fd5b505161014052604080516303f7d6c760e51b815290516001600160a01b03851691637efad8e0916004808301926020929190829003018186803b1580156200038157600080fd5b505afa15801562000396573d6000803e3d6000fd5b505050506040513d6020811015620003ad57600080fd5b505161016052505060001960025550506001600160601b0319606092831b811661018052911b166101a0525060805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205161014051610160516101805160601c6101a05160601c6111de6200048d60003980610b4a5280610ca2525080610b265280610de0525080610833525080610812525080610795528061087f5250806103a3528061055f528061063a5280610a6e5250806104425280610723525080610975525080610f175280611014525080610c665280610da552506111de6000f3fe6080604052600436106100dd5760003560e01c80639f8676711161007f578063cd6dc68711610059578063cd6dc68714610278578063d34fb267146102be578063fe022cc9146102d3578063fe33859e146102e8576100dd565b80639f86767114610246578063ab8f09451461025b578063c2c4c5c114610270576100dd565b80631b88094d116100bb5780631b88094d1461018a5780634b820093146101c857806383f5c39b1461021c5780639c868ac014610231576100dd565b806309400707146100e257806310d3eb041461013457806314e956f514610160575b600080fd5b3480156100ee57600080fd5b506101226004803603602081101561010557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166102fd565b60408051918252519081900360200190f35b34801561014057600080fd5b5061015e6004803603602081101561015757600080fd5b503561038b565b005b34801561016c57600080fd5b506101226004803603602081101561018357600080fd5b503561043b565b34801561019657600080fd5b5061019f610509565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101d457600080fd5b50610208600480360360208110156101eb57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610526565b604080519115158252519081900360200190f35b34801561022857600080fd5b5061012261052c565b34801561023d57600080fd5b50610208610532565b34801561025257600080fd5b5061012261053b565b34801561026757600080fd5b5061015e610547565b610208610618565b34801561028457600080fd5b5061015e6004803603604081101561029b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610a05565b3480156102ca57600080fd5b5061015e610a56565b3480156102df57600080fd5b5061019f610b24565b3480156102f457600080fd5b5061019f610b48565b600073ffffffffffffffffffffffffffffffffffffffff8216301461038357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060045490565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461042f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b61043881610b6c565b50565b60006105037f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9430856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b1580156104cf57600080fd5b505afa1580156104e3573d6000803e3d6000fd5b505050506040513d60208110156104f957600080fd5b5051600654610c08565b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff165b90565b50600190565b60065490565b60055460ff1690565b670de0b6b3a764000081565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146105eb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610622610c20565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106c657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b60025460006106d3610c39565b9050808210156109f757604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b15801561076a57600080fd5b505af115801561077e573d6000803e3d6000fd5b5050600180546003549590910194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff0181101561090a57848111156107cf5761090a565b62093a8081026000806107e18361043b565b90508285101580156107f757508262093a800185105b156108b057828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000089028161085b57fe5b04975062093a80819003670de0b6b3a7640000838a02820260018b905560038990557f000000000000000000000000000000000000000000000000000000000000000090980197049390930192506108c59050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a2509390930192506001016107b7565b5060028490556004805483019055811580159061092a575060055460ff16155b156109f357604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b1580156109bd57600080fd5b505af11580156109d1573d6000803e3d6000fd5b505050506040513d60208110156109e757600080fd5b506109f3905082610c64565b5050505b600192505050610523610e9d565b610a0e81610ea4565b50600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610afa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b670de0b6b3a7640000811115610bcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806111516034913960400191505060405180910390fd5b60068190556040805182815290517f13e45870490f54cea50d245930d12102c72b502641ef6850d0b15a8c92decfb29181900360200190a150565b6000818310610c175781610c19565b825b9392505050565b610c32600260005414156101906110b6565b6002600055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610d1557600080fd5b505af1158015610d29573d6000803e3d6000fd5b505050506040513d6020811015610d3f57600080fd5b5050600754604080516020808201859052825180830382018152828401938490527fe3dec8fb0000000000000000000000000000000000000000000000000000000090935273ffffffffffffffffffffffffffffffffffffffff938416604483018181527f00000000000000000000000000000000000000000000000000000000000000008087166064860152606060848601908152865160a487015286517f00000000000000000000000000000000000000000000000000000000000000009098169763e3dec8fb9794969295919260c4019185019080838360005b83811015610e34578181015183820152602001610e1c565b50505050905090810190601f168015610e615780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015610e8257600080fd5b505af1158015610e96573d6000803e3d6000fd5b5050505050565b6001600055565b60025415610f1357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f7b57600080fd5b505afa158015610f8f573d6000803e3d6000fd5b505050506040513d6020811015610fa557600080fd5b5051905080610fff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806111856024913960400191505060405180910390fd5b600181905561100c610c39565b6002819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561107a57600080fd5b505af115801561108e573d6000803e3d6000fd5b505050506040513d60208110156110a457600080fd5b50516003556110b282610b6c565b5050565b816110b2577f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526110b2918391610438917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fdfe52656c61746976652077656967687420636170206578636565647320616c6c6f776564206162736f6c757465206d6178696d756d42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a26469706673582212206ad35df5d7e0be9e2afe95eae3d417fdd8cfe136e0b275abda752f660a95125d64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80630ecaea731461004657806339312dee1461006f578063ce3cc8bd14610077575b600080fd5b610059610054366004610322565b610097565b604051610066919061034c565b60405180910390f35b610059610135565b61008a610085366004610300565b610151565b6040516100669190610393565b6000806100a2610180565b6040517fcd6dc68700000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063cd6dc687906100f9908790879060040161036d565b600060405180830381600087803b15801561011357600080fd5b505af1158015610127573d6000803e3d6000fd5b509293505050505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff165b919050565b6000805481906101a59073ffffffffffffffffffffffffffffffffffffffff16610226565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff811661017b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d39061039e565b60405180910390fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461012f57600080fd5b600060208284031215610311578081fd5b61031b83836102dc565b9392505050565b60008060408385031215610334578081fd5b61033e84846102dc565b946020939093013593505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b60208082526016908201527f455243313136373a20637265617465206661696c65640000000000000000000060408201526060019056fea264697066735822122021d2afd83ba0639e62931740baaac1970665ed026d32e37ff0ef33d2e3b2a82c64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20220823-polygon-root-gauge-factory-v2/index.ts b/balpy/balancer-deployments/tasks/20220823-polygon-root-gauge-factory-v2/index.ts new file mode 100644 index 0000000..3f19c1b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220823-polygon-root-gauge-factory-v2/index.ts @@ -0,0 +1,13 @@ +import { Task, TaskRunOptions } from '@src'; +import { PolygonRootGaugeFactoryDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as PolygonRootGaugeFactoryDeployment; + + const args = [input.BalancerMinter, input.PolygonRootChainManager, input.PolygonERC20Predicate]; + const factory = await task.deployAndVerify('PolygonRootGaugeFactory', args, from, force); + + const implementation = await factory.getGaugeImplementation(); + await task.verify('PolygonRootGauge', implementation, args); + await task.save({ PolygonRootGauge: implementation }); +}; diff --git a/balpy/balancer-deployments/tasks/20220823-polygon-root-gauge-factory-v2/input.ts b/balpy/balancer-deployments/tasks/20220823-polygon-root-gauge-factory-v2/input.ts new file mode 100644 index 0000000..be99579 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220823-polygon-root-gauge-factory-v2/input.ts @@ -0,0 +1,22 @@ +import { Task, TaskMode } from '@src'; + +export type PolygonRootGaugeFactoryDeployment = { + BalancerMinter: string; + PolygonRootChainManager: string; + PolygonERC20Predicate: string; +}; + +const BalancerMinter = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); + +export default { + mainnet: { + BalancerMinter, + // From https://static.matic.network/network/mainnet/v1/index.json, which is linked by the main documentation at + // https://docs.polygon.technology/docs/develop/ethereum-polygon/pos/deployment. Note that the docs instruct to use + // the Proxy addresses. + // These values match the ones hardcoded in the original Curve contracts (deployment addresses can be found at + // https://curve.readthedocs.io/ref-addresses.html#pools-and-gauges, e.g. 0x060e386eCfBacf42Aa72171Af9EFe17b3993fC4F) + PolygonRootChainManager: '0xA0c68C638235ee32657e8f720a23ceC1bFc77C77', + PolygonERC20Predicate: '0x40ec5B33f54e0E8A33A975908C5BA1c14e5BbbDf', + }, +}; diff --git a/balpy/balancer-deployments/tasks/20220823-polygon-root-gauge-factory-v2/output/mainnet.json b/balpy/balancer-deployments/tasks/20220823-polygon-root-gauge-factory-v2/output/mainnet.json new file mode 100644 index 0000000..ebee8a3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220823-polygon-root-gauge-factory-v2/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "PolygonRootGaugeFactory": "0xa98Bce70c92aD2ef3288dbcd659bC0d6b62f8F13", + "PolygonRootGauge": "0xfeb1A24C2752E53576133cdb718F25bC64eBDD52" +} diff --git a/balpy/balancer-deployments/tasks/20220823-polygon-root-gauge-factory-v2/readme.md b/balpy/balancer-deployments/tasks/20220823-polygon-root-gauge-factory-v2/readme.md new file mode 100644 index 0000000..18a798e --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220823-polygon-root-gauge-factory-v2/readme.md @@ -0,0 +1,9 @@ +# 2022-08-23 - Polygon Root Gauge Factory V2 + +Deployment of the `PolygonRootGaugeFactory`, for stakeless gauges that bridge funds to their Polygon counterparts. This updated version includes caps on the relative weight (allocated emissions) for each gauge. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [`PolygonRootGauge` artifact](./artifact/PolygonRootGauge.json) +- [`PolygonRootGaugeFactory` artifact](./artifact/PolygonRootGaugeFactory.json) diff --git a/balpy/balancer-deployments/tasks/20220823-polygon-root-gauge-factory-v2/test/task.fork.ts b/balpy/balancer-deployments/tasks/20220823-polygon-root-gauge-factory-v2/test/task.fork.ts new file mode 100644 index 0000000..0ebf1b0 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20220823-polygon-root-gauge-factory-v2/test/task.fork.ts @@ -0,0 +1,254 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { range } from 'lodash'; + +import { BigNumber, fp, FP_ONE } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { advanceTime, currentTimestamp, currentWeekTimestamp, DAY, WEEK } from '@helpers/time'; +import * as expectEvent from '@helpers/expectEvent'; +import { expectTransferEvent } from '@helpers/expectTransfer'; + +import { expectEqualWithError } from '@helpers/relativeError'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import { actionId } from '@helpers/models/misc/actions'; + +import { getSigner, impersonate, getForkedNetwork, Task, TaskMode, describeForkTest } from '@src'; + +describeForkTest('PolygonRootGaugeFactoryV2', 'mainnet', 15397200, function () { + let veBALHolder: SignerWithAddress, admin: SignerWithAddress, recipient: SignerWithAddress; + let factory: Contract, gauge: Contract; + let vault: Contract, + authorizer: Contract, + authorizerAdaptor: Contract, + BALTokenAdmin: Contract, + gaugeController: Contract, + gaugeAdder: Contract; + let BAL: string; + + let task: Task; + + const VEBAL_HOLDER = '0xd519D5704B41511951C8CF9f65Fee9AB9beF2611'; + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + + const weightCap = fp(0.001); + + before('run task', async () => { + task = new Task('20220823-polygon-root-gauge-factory-v2', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('PolygonRootGaugeFactory'); + }); + + before('advance time', async () => { + // This causes all voting cooldowns to expire, letting the veBAL holder vote again + await advanceTime(DAY * 12); + }); + + before('setup accounts', async () => { + admin = await getSigner(0); + recipient = await getSigner(1); + + veBALHolder = await impersonate(VEBAL_HOLDER); + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.instanceAt('Vault', vaultTask.output({ network: 'mainnet' }).Vault); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + + const authorizerAdaptorTask = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizerAdaptor = await authorizerAdaptorTask.instanceAt( + 'AuthorizerAdaptor', + authorizerAdaptorTask.output({ network: 'mainnet' }).AuthorizerAdaptor + ); + + const gaugeAdderTask = new Task('20220628-gauge-adder-v2', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeAdder = await gaugeAdderTask.instanceAt( + 'GaugeAdder', + gaugeAdderTask.output({ network: 'mainnet' }).GaugeAdder + ); + + const balancerTokenAdminTask = new Task('20220325-balancer-token-admin', TaskMode.READ_ONLY, getForkedNetwork(hre)); + BALTokenAdmin = await balancerTokenAdminTask.instanceAt( + 'BalancerTokenAdmin', + balancerTokenAdminTask.output({ network: 'mainnet' }).BalancerTokenAdmin + ); + + BAL = await BALTokenAdmin.getBalancerToken(); + + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeController = await gaugeControllerTask.instanceAt( + 'GaugeController', + gaugeControllerTask.output({ network: 'mainnet' }).GaugeController + ); + }); + + it('create gauge', async () => { + const tx = await factory.create(recipient.address, weightCap); + const event = expectEvent.inReceipt(await tx.wait(), 'GaugeCreated'); + + gauge = await task.instanceAt('PolygonRootGauge', event.args.gauge); + + expect(await factory.isGaugeFromFactory(gauge.address)).to.be.true; + }); + + it('grant permissions', async () => { + // We need to grant permission to the admin to add the Polygon factory to the GaugeAdder, and also to then add + // gauges from said factory to the GaugeController. + const govMultisig = await impersonate(GOV_MULTISIG); + + await Promise.all( + ['addGaugeFactory', 'addPolygonGauge'].map( + async (method) => + await authorizer.connect(govMultisig).grantRole(await actionId(gaugeAdder, method), admin.address) + ) + ); + + // We also need to grant permissions to mint in the gauges, which is done via the Authorizer Adaptor + await authorizer + .connect(govMultisig) + .grantRole(await authorizerAdaptor.getActionId(gauge.interface.getSighash('checkpoint')), admin.address); + }); + + it('add gauge to gauge controller', async () => { + await gaugeAdder.connect(admin).addGaugeFactory(factory.address, 3); // Polygon is Gauge Type 3 + await gaugeAdder.connect(admin).addPolygonGauge(gauge.address); + + expect(await gaugeController.gauge_exists(gauge.address)).to.be.true; + }); + + it('vote for gauge', async () => { + expect(await gaugeController.get_gauge_weight(gauge.address)).to.equal(0); + expect(await gauge.getCappedRelativeWeight(await currentTimestamp())).to.equal(0); + + await gaugeController.connect(veBALHolder).vote_for_gauge_weights(gauge.address, 10000); // Max voting power is 10k points + + // We now need to go through an epoch for the votes to be locked in + await advanceTime(DAY * 8); + + await gaugeController.checkpoint(); + // Gauge weight is equal to the cap, and controller weight for the gauge is greater than the cap. + expect( + await gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, await currentWeekTimestamp()) + ).to.be.gt(weightCap); + expect(await gauge.getCappedRelativeWeight(await currentTimestamp())).to.equal(weightCap); + }); + + it('mint & bridge tokens', async () => { + // The gauge has votes for this week, and it will mint the first batch of tokens. We store the current gauge + // relative weight, as it will change as time goes by due to vote decay. + const firstMintWeekTimestamp = await currentWeekTimestamp(); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + + // Even though the gauge has relative weight, it cannot mint yet as it needs for the epoch to finish + const zeroMintTx = await authorizerAdaptor.connect(admin).performAction(gauge.address, calldata); + expectEvent.inIndirectReceipt(await zeroMintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp.sub(WEEK), // Process past week, which had zero votes + periodEmissions: 0, + }); + // No token transfers are performed if the emissions are zero, but we can't test for a lack of those + + await advanceTime(WEEK); + + // The gauge should now mint and send all minted tokens to the Polygon bridge + const mintTx = await authorizerAdaptor.connect(admin).performAction(gauge.address, calldata); + const event = expectEvent.inIndirectReceipt(await mintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp, + }); + const actualEmissions = event.args.periodEmissions; + + // The amount of tokens minted should equal the weekly emissions rate times the relative weight of the gauge + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + + // Note that instead of the weight, we use the cap (since we expect for the weight to be larger than the cap) + const expectedEmissions = weightCap.mul(weeklyRate).div(FP_ONE); + expectEqualWithError(actualEmissions, expectedEmissions, 0.001); + + // Tokens are minted for the gauge + expectTransferEvent( + await mintTx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + value: actualEmissions, + }, + BAL + ); + + // And the gauge then deposits those in the predicate via the bridge mechanism + const bridgeInterface = new ethers.utils.Interface([ + 'event LockedERC20(address indexed depositor, address indexed depositReceiver, address indexed rootToken, uint256 amount)', + ]); + + expectEvent.inIndirectReceipt(await mintTx.wait(), bridgeInterface, 'LockedERC20', { + depositor: gauge.address, + depositReceiver: recipient.address, + rootToken: BAL, + amount: actualEmissions, + }); + }); + + it('mint multiple weeks', async () => { + const numberOfWeeks = 5; + await advanceTime(WEEK * numberOfWeeks); + await gaugeController.checkpoint_gauge(gauge.address); + + const weekTimestamp = await currentWeekTimestamp(); + + // We can query the relative weight of the gauge for each of the weeks that have passed + const relativeWeights: BigNumber[] = await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, weekTimestamp.sub(WEEK * weekIndex)) + ) + ); + + // We require that they're all above the cap for simplicity - this lets us use the cap as each week's weight (and + // also tests cap behavior). + for (const relativeWeight of relativeWeights) { + expect(relativeWeight).to.be.gt(weightCap); + } + + // The amount of tokens minted should equal the sum of the weekly emissions rate times the relative weight of the + // gauge (this assumes we're not crossing an emissions rate epoch so that the inflation remains constant). + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + // Note that instead of the weight, we use the cap (since we expect for the weight to be larger than the cap) + const expectedEmissions = weightCap.mul(numberOfWeeks).mul(weeklyRate).div(FP_ONE); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + const tx = await authorizerAdaptor.connect(admin).performAction(gauge.address, calldata); + + await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + expectEvent.inIndirectReceipt(await tx.wait(), gauge.interface, 'Checkpoint', { + periodTime: weekTimestamp.sub(WEEK * weekIndex), + }) + ) + ); + + // Tokens are minted for the gauge + const transferEvent = expectTransferEvent( + await tx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + }, + BAL + ); + + expect(transferEvent.args.value).to.be.almostEqual(expectedEmissions); + + // And the gauge then deposits those in the predicate via the bridge mechanism + const bridgeInterface = new ethers.utils.Interface([ + 'event LockedERC20(address indexed depositor, address indexed depositReceiver, address indexed rootToken, uint256 amount)', + ]); + + const depositEvent = expectEvent.inIndirectReceipt(await tx.wait(), bridgeInterface, 'LockedERC20', { + depositor: gauge.address, + depositReceiver: recipient.address, + rootToken: BAL, + }); + + expect(depositEvent.args.amount).to.be.almostEqual(expectedEmissions); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/artifact/PoolRecoveryHelper.json b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/artifact/PoolRecoveryHelper.json new file mode 100644 index 0000000..84ead81 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/artifact/PoolRecoveryHelper.json @@ -0,0 +1,162 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PoolRecoveryHelper", + "sourceName": "contracts/PoolRecoveryHelper.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "address[]", + "name": "initialFactories", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "factory", + "type": "address" + } + ], + "name": "addPoolFactory", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "enableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getFactoryAtIndex", + "outputs": [ + { + "internalType": "contract IBasePoolFactory", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getFactoryCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromKnownFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "factory", + "type": "address" + } + ], + "name": "removePoolFactory", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60c06040523480156200001157600080fd5b506040516200112e3803806200112e833981016040819052620000349162000157565b306080526001600160601b0319606083901b1660a05260005b8151811015620000b757620000868282815181106200006857fe5b60200260200101516000620000c060201b620006981790919060201c565b620000ae5760405162461bcd60e51b8152600401620000a59062000225565b60405180910390fd5b6001016200004d565b5050506200029c565b6000620000ce838362000129565b6200011f57508154600180820184556000848152602080822090930180546001600160a01b0319166001600160a01b0386169081179091558554908252828601909352604090209190915562000123565b5060005b92915050565b6001600160a01b031660009081526001919091016020526040902054151590565b8051620001238162000283565b600080604083850312156200016a578182fd5b8251620001778162000283565b602084810151919350906001600160401b038082111562000196578384fd5b818601915086601f830112620001aa578384fd5b815181811115620001b9578485fd5b8381029150620001cb8483016200025c565b8181528481019084860184860187018b1015620001e6578788fd5b8795505b838610156200021457620001ff8b826200014a565b835260019590950194918601918601620001ea565b508096505050505050509250929050565b60208082526019908201527f4475706c696361746520696e697469616c20666163746f727900000000000000604082015260600190565b6040518181016001600160401b03811182821017156200027b57600080fd5b604052919050565b6001600160a01b03811681146200029957600080fd5b50565b60805160a05160601c610e6b620002c3600039806102fe5250806102ae5250610e6b6000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c8063a587bbe111610076578063d10474341161005b578063d104743414610136578063dc3f574e1461013e578063dc867b7914610151576100a3565b8063a587bbe11461011b578063aaabadc51461012e576100a3565b806326e54479146100a85780633a987dfa146100bd578063851c1bb3146100e65780638d928af814610106575b600080fd5b6100bb6100b6366004610ae6565b610164565b005b6100d06100cb366004610ae6565b6101b9565b6040516100dd9190610caa565b60405180910390f35b6100f96100f4366004610bcd565b6102aa565b6040516100dd9190610cb5565b61010e6102fc565b6040516100dd9190610c89565b61010e610129366004610c29565b610320565b61010e610332565b6100f96103be565b6100bb61014c366004610ae6565b6103ca565b6100bb61015f366004610ae6565b61064f565b61016c610721565b610177600082610767565b6101b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ad90610d21565b60405180910390fd5b50565b6000806101c66000610915565b905060005b8181101561029e5760006101df8183610919565b6040517f6634b75300000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff821690636634b75390610234908890600401610c89565b60206040518083038186803b15801561024c57600080fd5b505afa158015610260573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102849190610bad565b1561029557600193505050506102a5565b506001016101cb565b5060009150505b919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016102df929190610c59565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061032c8183610953565b92915050565b600061033c6102fc565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561038157600080fd5b505afa158015610395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b99190610c0d565b905090565b60006103b96000610915565b6103d3816101b9565b610409576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ad90610cea565b60608173ffffffffffffffffffffffffffffffffffffffff1663238a2d596040518163ffffffff1660e01b815260040160006040518083038186803b15801561045157600080fd5b505afa158015610465573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526104ab9190810190610b02565b905060005b815181101561061c57600073ffffffffffffffffffffffffffffffffffffffff168282815181106104dd57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16146106145781818151811061050c57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b15801561055957600080fd5b505afa9250505080156105a7575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526105a491810190610c41565b60015b610612578273ffffffffffffffffffffffffffffffffffffffff166354a844ba6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105f357600080fd5b505af1158015610607573d6000803e3d6000fd5b5050505050506101b6565b505b6001016104b0565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ad90610d8f565b610657610721565b610662600082610698565b6101b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ad90610d58565b60006106a48383610976565b61071857508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86169081179091558554908252828601909352604090209190915561032c565b50600092915050565b60006107506000357fffffffff00000000000000000000000000000000000000000000000000000000166102aa565b90506101b661075f82336109a4565b610191610a3a565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600183016020526040812054801561090b5783547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80830191018082146108705760008660000182815481106107d557fe5b600091825260209091200154875473ffffffffffffffffffffffffffffffffffffffff9091169150819088908590811061080b57fe5b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff94851617905592909116815260018881019092526040902090830190555b855486908061087b57fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff8716825260018881019091526040822091909155935061032c92505050565b600091505061032c565b5490565b600082600001828154811061092a57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169392505050565b81546000906109659083106064610a3a565b61096f8383610919565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001919091016020526040902054151590565b60006109ae610332565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b81526004016109ea93929190610cbe565b60206040518083038186803b158015610a0257600080fd5b505afa158015610a16573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096f9190610bad565b81610a4857610a4881610a4c565b5050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526101b6917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b805161032c81610e13565b600060208284031215610af7578081fd5b813561096f81610e13565b60006020808385031215610b14578182fd5b825167ffffffffffffffff80821115610b2b578384fd5b818501915085601f830112610b3e578384fd5b815181811115610b4c578485fd5b8381029150610b5c848301610dec565b8181528481019084860184860187018a1015610b76578788fd5b8795505b83861015610ba057610b8c8a82610adb565b835260019590950194918601918601610b7a565b5098975050505050505050565b600060208284031215610bbe578081fd5b8151801515811461096f578182fd5b600060208284031215610bde578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461096f578182fd5b600060208284031215610c1e578081fd5b815161096f81610e13565b600060208284031215610c3a578081fd5b5035919050565b600060208284031215610c52578081fd5b5051919050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b6020808252601e908201527f506f6f6c206973206e6f742066726f6d206b6e6f776e20666163746f72790000604082015260600190565b60208082526014908201527f4e6f6e2d6578697374656e7420666163746f7279000000000000000000000000604082015260600190565b60208082526011908201527f4475706c696361746520666163746f7279000000000000000000000000000000604082015260600190565b60208082526023908201527f506f6f6c277320726174652070726f76696465727320646f206e6f742072657660408201527f6572740000000000000000000000000000000000000000000000000000000000606082015260800190565b60405181810167ffffffffffffffff81118282101715610e0b57600080fd5b604052919050565b73ffffffffffffffffffffffffffffffffffffffff811681146101b657600080fdfea26469706673582212204a4ddb678100ac3d28b3cc7a63dd5c7ebd98961521f276072a8d3a453b9caa8564736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a35760003560e01c8063a587bbe111610076578063d10474341161005b578063d104743414610136578063dc3f574e1461013e578063dc867b7914610151576100a3565b8063a587bbe11461011b578063aaabadc51461012e576100a3565b806326e54479146100a85780633a987dfa146100bd578063851c1bb3146100e65780638d928af814610106575b600080fd5b6100bb6100b6366004610ae6565b610164565b005b6100d06100cb366004610ae6565b6101b9565b6040516100dd9190610caa565b60405180910390f35b6100f96100f4366004610bcd565b6102aa565b6040516100dd9190610cb5565b61010e6102fc565b6040516100dd9190610c89565b61010e610129366004610c29565b610320565b61010e610332565b6100f96103be565b6100bb61014c366004610ae6565b6103ca565b6100bb61015f366004610ae6565b61064f565b61016c610721565b610177600082610767565b6101b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ad90610d21565b60405180910390fd5b50565b6000806101c66000610915565b905060005b8181101561029e5760006101df8183610919565b6040517f6634b75300000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff821690636634b75390610234908890600401610c89565b60206040518083038186803b15801561024c57600080fd5b505afa158015610260573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102849190610bad565b1561029557600193505050506102a5565b506001016101cb565b5060009150505b919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016102df929190610c59565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061032c8183610953565b92915050565b600061033c6102fc565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561038157600080fd5b505afa158015610395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b99190610c0d565b905090565b60006103b96000610915565b6103d3816101b9565b610409576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ad90610cea565b60608173ffffffffffffffffffffffffffffffffffffffff1663238a2d596040518163ffffffff1660e01b815260040160006040518083038186803b15801561045157600080fd5b505afa158015610465573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526104ab9190810190610b02565b905060005b815181101561061c57600073ffffffffffffffffffffffffffffffffffffffff168282815181106104dd57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16146106145781818151811061050c57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b15801561055957600080fd5b505afa9250505080156105a7575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526105a491810190610c41565b60015b610612578273ffffffffffffffffffffffffffffffffffffffff166354a844ba6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105f357600080fd5b505af1158015610607573d6000803e3d6000fd5b5050505050506101b6565b505b6001016104b0565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ad90610d8f565b610657610721565b610662600082610698565b6101b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ad90610d58565b60006106a48383610976565b61071857508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86169081179091558554908252828601909352604090209190915561032c565b50600092915050565b60006107506000357fffffffff00000000000000000000000000000000000000000000000000000000166102aa565b90506101b661075f82336109a4565b610191610a3a565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600183016020526040812054801561090b5783547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80830191018082146108705760008660000182815481106107d557fe5b600091825260209091200154875473ffffffffffffffffffffffffffffffffffffffff9091169150819088908590811061080b57fe5b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff94851617905592909116815260018881019092526040902090830190555b855486908061087b57fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff8716825260018881019091526040822091909155935061032c92505050565b600091505061032c565b5490565b600082600001828154811061092a57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169392505050565b81546000906109659083106064610a3a565b61096f8383610919565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001919091016020526040902054151590565b60006109ae610332565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b81526004016109ea93929190610cbe565b60206040518083038186803b158015610a0257600080fd5b505afa158015610a16573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096f9190610bad565b81610a4857610a4881610a4c565b5050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526101b6917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b805161032c81610e13565b600060208284031215610af7578081fd5b813561096f81610e13565b60006020808385031215610b14578182fd5b825167ffffffffffffffff80821115610b2b578384fd5b818501915085601f830112610b3e578384fd5b815181811115610b4c578485fd5b8381029150610b5c848301610dec565b8181528481019084860184860187018a1015610b76578788fd5b8795505b83861015610ba057610b8c8a82610adb565b835260019590950194918601918601610b7a565b5098975050505050505050565b600060208284031215610bbe578081fd5b8151801515811461096f578182fd5b600060208284031215610bde578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461096f578182fd5b600060208284031215610c1e578081fd5b815161096f81610e13565b600060208284031215610c3a578081fd5b5035919050565b600060208284031215610c52578081fd5b5051919050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b6020808252601e908201527f506f6f6c206973206e6f742066726f6d206b6e6f776e20666163746f72790000604082015260600190565b60208082526014908201527f4e6f6e2d6578697374656e7420666163746f7279000000000000000000000000604082015260600190565b60208082526011908201527f4475706c696361746520666163746f7279000000000000000000000000000000604082015260600190565b60208082526023908201527f506f6f6c277320726174652070726f76696465727320646f206e6f742072657660408201527f6572740000000000000000000000000000000000000000000000000000000000606082015260800190565b60405181810167ffffffffffffffff81118282101715610e0b57600080fd5b604052919050565b73ffffffffffffffffffffffffffffffffffffffff811681146101b657600080fdfea26469706673582212204a4ddb678100ac3d28b3cc7a63dd5c7ebd98961521f276072a8d3a453b9caa8564736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/index.ts b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/index.ts new file mode 100644 index 0000000..3753cc8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { PoolRecoveryHelperDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as PoolRecoveryHelperDeployment; + + const args = [input.Vault, input.InitialFactories]; + await task.deployAndVerify('PoolRecoveryHelper', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/input.ts b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/input.ts new file mode 100644 index 0000000..564e6e3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/input.ts @@ -0,0 +1,69 @@ +import { Task, TaskMode } from '@src'; + +export type PoolRecoveryHelperDeployment = { + Vault: string; + InitialFactories: Array; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const ComposableStablePoolFactoryTask = new Task('20220906-composable-stable-pool', TaskMode.READ_ONLY); +const ComposableStablePoolFactoryV2Task = new Task('20221122-composable-stable-pool-v2', TaskMode.READ_ONLY); +const WeightedPoolFactoryTask = new Task('20220908-weighted-pool-v2', TaskMode.READ_ONLY); + +export default { + Vault, + mainnet: { + InitialFactories: [ + ComposableStablePoolFactoryTask.output({ network: 'mainnet' }).ComposableStablePoolFactory, + WeightedPoolFactoryTask.output({ network: 'mainnet' }).WeightedPoolFactory, + ], + }, + goerli: { + InitialFactories: [ + ComposableStablePoolFactoryTask.output({ network: 'goerli' }).ComposableStablePoolFactory, + WeightedPoolFactoryTask.output({ network: 'goerli' }).WeightedPoolFactory, + ], + }, + polygon: { + InitialFactories: [ + ComposableStablePoolFactoryTask.output({ network: 'polygon' }).ComposableStablePoolFactory, + WeightedPoolFactoryTask.output({ network: 'polygon' }).WeightedPoolFactory, + ], + }, + arbitrum: { + InitialFactories: [ + ComposableStablePoolFactoryTask.output({ network: 'arbitrum' }).ComposableStablePoolFactory, + WeightedPoolFactoryTask.output({ network: 'arbitrum' }).WeightedPoolFactory, + ], + }, + optimism: { + InitialFactories: [ + ComposableStablePoolFactoryTask.output({ network: 'optimism' }).ComposableStablePoolFactory, + WeightedPoolFactoryTask.output({ network: 'optimism' }).WeightedPoolFactory, + ], + }, + bsc: { + InitialFactories: [ + ComposableStablePoolFactoryTask.output({ network: 'bsc' }).ComposableStablePoolFactory, + WeightedPoolFactoryTask.output({ network: 'bsc' }).WeightedPoolFactory, + ], + }, + gnosis: { + InitialFactories: [ + ComposableStablePoolFactoryV2Task.output({ network: 'gnosis' }).ComposableStablePoolFactory, + WeightedPoolFactoryTask.output({ network: 'gnosis' }).WeightedPoolFactory, + ], + }, + avalanche: { + InitialFactories: [], + }, + zkevm: { + InitialFactories: [], + }, + sepolia: { + InitialFactories: [], + }, + base: { + InitialFactories: [], + }, +}; diff --git a/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/arbitrum.json b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/arbitrum.json new file mode 100644 index 0000000..93e1147 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "PoolRecoveryHelper": "0xb5e56CC3d2e38e53b1166175C59e921A37cDC1E2" +} diff --git a/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/avalanche.json b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/avalanche.json new file mode 100644 index 0000000..394d79d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/avalanche.json @@ -0,0 +1,3 @@ +{ + "PoolRecoveryHelper": "0x3b8cA519122CdD8efb272b0D3085453404B25bD0" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/base.json b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/base.json new file mode 100644 index 0000000..971988d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/base.json @@ -0,0 +1,3 @@ +{ + "PoolRecoveryHelper": "0x03F3Fb107e74F2EAC9358862E91ad3c692712054" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/bsc.json b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/bsc.json new file mode 100644 index 0000000..280a402 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/bsc.json @@ -0,0 +1,3 @@ +{ + "PoolRecoveryHelper": "0x3b8cA519122CdD8efb272b0D3085453404B25bD0" +} diff --git a/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/gnosis.json b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/gnosis.json new file mode 100644 index 0000000..00a22ec --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "PoolRecoveryHelper": "0xc3ccacE87f6d3A81724075ADcb5ddd85a8A1bB68" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/goerli.json b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/goerli.json new file mode 100644 index 0000000..3306205 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/goerli.json @@ -0,0 +1,3 @@ +{ + "PoolRecoveryHelper": "0x1cbbE6cEa5E4fE7D69c586b4e362A646DEEf105d" +} diff --git a/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/mainnet.json b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/mainnet.json new file mode 100644 index 0000000..6767057 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "PoolRecoveryHelper": "0x1b300C86980a5195bCF49bD419A068D98dC133Db" +} diff --git a/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/mode.json b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/mode.json new file mode 100644 index 0000000..6187e73 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/mode.json @@ -0,0 +1,3 @@ +{ + "PoolRecoveryHelper": "0x4132f7AcC9dB7A6cF7BE2Dd3A9DC8b30C7E6E6c8" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/optimism.json b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/optimism.json new file mode 100644 index 0000000..f81f9f1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/optimism.json @@ -0,0 +1,3 @@ +{ + "PoolRecoveryHelper": "0x26743984e3357eFC59f2fd6C1aFDC310335a61c9" +} diff --git a/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/polygon.json b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/polygon.json new file mode 100644 index 0000000..bfdda3d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/polygon.json @@ -0,0 +1,3 @@ +{ + "PoolRecoveryHelper": "0x495F696430F4A51F7fcB98FbE68a9Cb7A07fB1bA" +} diff --git a/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/sepolia.json b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/sepolia.json new file mode 100644 index 0000000..b4488b4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "PoolRecoveryHelper": "0x1b6F057520B4e826271D47b8bdab98E35Af17E59" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/zkevm.json b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/zkevm.json new file mode 100644 index 0000000..181ea45 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/output/zkevm.json @@ -0,0 +1,3 @@ +{ + "PoolRecoveryHelper": "0xf7D5DcE55E6D47852F054697BAB6A1B48A00ddbd" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/readme.md b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/readme.md new file mode 100644 index 0000000..3bde70d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/readme.md @@ -0,0 +1,18 @@ +# 2022-11-22 - Pool Recovery Helper + +Deployment of the `PoolRecoveryHelper`, which provides a permissionless way to make Pools enter Recovery Mode, provided one of their Rate Providers is failing.. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`PoolRecoveryHelper` artifact](./artifact/PoolRecoveryHelper.json) diff --git a/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/test/test.fork.ts b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/test/test.fork.ts new file mode 100644 index 0000000..943be77 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221123-pool-recovery-helper/test/test.fork.ts @@ -0,0 +1,97 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { actionId } from '@helpers/models/misc/actions'; +import { ZERO_ADDRESS } from '@helpers/constants'; + +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode, getSigner } from '@src'; +import { setCode } from '@nomicfoundation/hardhat-network-helpers'; +import { Interface } from '@ethersproject/abi'; + +describeForkTest('PoolRecoveryHelper', 'mainnet', 15998800, function () { + let task: Task; + + let helper: Contract; + let operator: SignerWithAddress, admin: SignerWithAddress; + let authorizer: Contract; + + const POOL_STABLE = '0xbD482fFb3E6E50dC1c437557C3Bea2B68f3683Ee'; // From ComposableStablePoolFactory + const POOL_WEIGHTED = '0xe340EBfcAA544da8bB1Ee9005F1a346D50Ec422e'; // From WeightedPoolFactory + + before('run task', async () => { + task = new Task('20221123-pool-recovery-helper', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + helper = await task.deployedInstance('PoolRecoveryHelper'); + }); + + before('load vault', async () => { + const authorizerTask = new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizer = await authorizerTask.deployedInstance('Authorizer'); + }); + + before('load signers', async () => { + // We impersonate an account with the default admin role in order to be able to grant permissions. This assumes + // such an account exists. + admin = await impersonate(await authorizer.getRoleMember(await authorizer.DEFAULT_ADMIN_ROLE(), 0)); + operator = await getSigner(); + }); + + before('approve helper at the authorizer', async () => { + const selector = new Interface(task.artifact('IRecoveryMode').abi).getSighash('enableRecoveryMode()'); + + const actionIds = await Promise.all( + [POOL_STABLE, POOL_WEIGHTED].map(async (poolAddress) => { + const pool = await task.instanceAt('IAuthentication', poolAddress); + return await pool.getActionId(selector); + }) + ); + + // Grant helper permission to enable recovery mode + await authorizer.connect(admin).grantRoles(actionIds, helper.address); + }); + + before('approve operator at the authorizer', async () => { + const actionIds = await Promise.all( + ['addPoolFactory', 'removePoolFactory'].map(async (method) => actionId(helper, method)) + ); + await authorizer.connect(admin).grantRoles(actionIds, operator.address); + }); + context('with ComposableStablePool', () => { + itWorksWithPool(POOL_STABLE); + }); + + context('with WeightedPool', () => { + itWorksWithPool(POOL_WEIGHTED); + }); + + function itWorksWithPool(poolAddress: string) { + it('recognizes pools from the initial factories', async () => { + expect(await helper.isPoolFromKnownFactory(poolAddress)).to.equal(true); + }); + + it("reverts if the pool rate providers don't revert", async () => { + await expect(helper.enableRecoveryMode(poolAddress)).to.be.revertedWith("Pool's rate providers do not revert"); + }); + + it('puts the pool in recovery mode if one of the rate providers reverts', async () => { + // We get the first non-zero rate provider of the Pool, and replace it with a mock one that reverts + const rateProviderPool = await task.instanceAt('IRateProviderPool', poolAddress); + const rateProviders: string[] = await rateProviderPool.getRateProviders(); + const mockedRateProvider: string = rateProviders.filter((provider) => provider !== ZERO_ADDRESS)[0]; + + // Make sure there's at least one rate provider + expect(mockedRateProvider).to.not.equal(undefined); + + await setCode(mockedRateProvider, (await task.artifact('MockRevertingRateProvider')).deployedBytecode); + const mockLendingPool = await task.instanceAt('MockRevertingRateProvider', mockedRateProvider); + await mockLendingPool.setRevertOnGetRate(true); + + await helper.enableRecoveryMode(poolAddress); + + const recoveryModePool = await task.instanceAt('IRecoveryMode', poolAddress); + expect(await recoveryModePool.inRecoveryMode()).to.equal(true); + }); + } +}); diff --git a/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/artifact/AuthorizerAdaptorEntrypoint.json b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/artifact/AuthorizerAdaptorEntrypoint.json new file mode 100644 index 0000000..6122ec8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/artifact/AuthorizerAdaptorEntrypoint.json @@ -0,0 +1,164 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "AuthorizerAdaptorEntrypoint", + "sourceName": "contracts/admin/AuthorizerAdaptorEntrypoint.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IAuthorizerAdaptor", + "name": "adaptor", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + }, + { + "indexed": true, + "internalType": "address", + "name": "caller", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "ActionPerformed", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "canPerform", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizerAdaptor", + "outputs": [ + { + "internalType": "contract IAuthorizerAdaptor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "performAction", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x60c060405234801561001057600080fd5b50604051610a54380380610a548339818101604052602081101561003357600080fd5b50516001600160601b0319606082901b16608052604080516311b2515f60e31b815290516001600160a01b03831691638d928af8916004808301926020929190829003018186803b15801561008757600080fd5b505afa15801561009b573d6000803e3d6000fd5b505050506040513d60208110156100b157600080fd5b5051606081811b6001600160601b03191660a052608051901c91506001600160a01b03166109626100f2600039806106e252508061085052506109626000f3fe6080604052600436106100655760003560e01c80639be2a884116100435780639be2a88414610208578063aaabadc51461026a578063e758d36b1461027f57610065565b80634036176a1461006a578063851c1bb31461016c5780638d928af8146101ca575b600080fd5b6100f76004803603604081101561008057600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691908101906040810160208201356401000000008111156100b857600080fd5b8201836020820111156100ca57600080fd5b803590602001918460018302840111640100000000831117156100ec57600080fd5b509092509050610294565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610131578181015183820152602001610119565b50505050905090810190601f16801561015e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561017857600080fd5b506101b86004803603602081101561018f57600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016610635565b60408051918252519081900360200190f35b3480156101d657600080fd5b506101df6106e0565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561021457600080fd5b506102566004803603606081101561022b57600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff60208201358116916040013516610704565b604080519115158252519081900360200190f35b34801561027657600080fd5b506101df6107ce565b34801561028b57600080fd5b506101df61084e565b60606102a560048310156069610872565b60006018848460038181106102b657fe5b909101357fff000000000000000000000000000000000000000000000000000000000000001690911c90506010858560028181106102f057fe5b909101357fff000000000000000000000000000000000000000000000000000000000000001690911c905060088686600181811061032a57fe5b909101357fff000000000000000000000000000000000000000000000000000000000000001690911c9050868660008161036057fe5b9050013560f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191617171790506103af6103a76103a083610635565b3388610704565b610191610872565b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167fd4634f1cb58f0ea9cb6e1838192e5c3077115fcc17f0f6af3db4757114f42739878760405180806020018281038252848482818152602001925080828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039550909350505050a461048361084e565b73ffffffffffffffffffffffffffffffffffffffff16634036176a348787876040518563ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff168152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509450505050506000604051808303818588803b15801561051f57600080fd5b505af1158015610533573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052602081101561057b57600080fd5b810190808051604051939291908464010000000082111561059b57600080fd5b9083019060208201858111156105b057600080fd5b82516401000000008111828201881017156105ca57600080fd5b82525081516020918201929091019080838360005b838110156105f75781810151838201526020016105df565b50505050905090810190601f1680156106245780820380516001836020036101000a031916815260200191505b506040525050509150509392505050565b600061063f61084e565b73ffffffffffffffffffffffffffffffffffffffff1663851c1bb3836040518263ffffffff1660e01b815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060206040518083038186803b1580156106ae57600080fd5b505afa1580156106c2573d6000803e3d6000fd5b505050506040513d60208110156106d857600080fd5b505192915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061070e6107ce565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848585856040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b15801561079a57600080fd5b505afa1580156107ae573d6000803e3d6000fd5b505050506040513d60208110156107c457600080fd5b5051949350505050565b60006107d86106e0565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561081d57600080fd5b505afa158015610831573d6000803e3d6000fd5b505050506040513d602081101561084757600080fd5b5051905090565b7f000000000000000000000000000000000000000000000000000000000000000090565b816108805761088081610884565b5050565b6108ae817f42414c00000000000000000000000000000000000000000000000000000000006108b1565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fdfea264697066735822122020e2f841d7e5ba859b7ec6dac34054a652ec1da205223c9b88cd38ff4bce169c64736f6c63430007010033", + "deployedBytecode": "0x6080604052600436106100655760003560e01c80639be2a884116100435780639be2a88414610208578063aaabadc51461026a578063e758d36b1461027f57610065565b80634036176a1461006a578063851c1bb31461016c5780638d928af8146101ca575b600080fd5b6100f76004803603604081101561008057600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691908101906040810160208201356401000000008111156100b857600080fd5b8201836020820111156100ca57600080fd5b803590602001918460018302840111640100000000831117156100ec57600080fd5b509092509050610294565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610131578181015183820152602001610119565b50505050905090810190601f16801561015e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561017857600080fd5b506101b86004803603602081101561018f57600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016610635565b60408051918252519081900360200190f35b3480156101d657600080fd5b506101df6106e0565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561021457600080fd5b506102566004803603606081101561022b57600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff60208201358116916040013516610704565b604080519115158252519081900360200190f35b34801561027657600080fd5b506101df6107ce565b34801561028b57600080fd5b506101df61084e565b60606102a560048310156069610872565b60006018848460038181106102b657fe5b909101357fff000000000000000000000000000000000000000000000000000000000000001690911c90506010858560028181106102f057fe5b909101357fff000000000000000000000000000000000000000000000000000000000000001690911c905060088686600181811061032a57fe5b909101357fff000000000000000000000000000000000000000000000000000000000000001690911c9050868660008161036057fe5b9050013560f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191617171790506103af6103a76103a083610635565b3388610704565b610191610872565b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167fd4634f1cb58f0ea9cb6e1838192e5c3077115fcc17f0f6af3db4757114f42739878760405180806020018281038252848482818152602001925080828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039550909350505050a461048361084e565b73ffffffffffffffffffffffffffffffffffffffff16634036176a348787876040518563ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff168152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509450505050506000604051808303818588803b15801561051f57600080fd5b505af1158015610533573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052602081101561057b57600080fd5b810190808051604051939291908464010000000082111561059b57600080fd5b9083019060208201858111156105b057600080fd5b82516401000000008111828201881017156105ca57600080fd5b82525081516020918201929091019080838360005b838110156105f75781810151838201526020016105df565b50505050905090810190601f1680156106245780820380516001836020036101000a031916815260200191505b506040525050509150509392505050565b600061063f61084e565b73ffffffffffffffffffffffffffffffffffffffff1663851c1bb3836040518263ffffffff1660e01b815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060206040518083038186803b1580156106ae57600080fd5b505afa1580156106c2573d6000803e3d6000fd5b505050506040513d60208110156106d857600080fd5b505192915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061070e6107ce565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848585856040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b15801561079a57600080fd5b505afa1580156107ae573d6000803e3d6000fd5b505050506040513d60208110156107c457600080fd5b5051949350505050565b60006107d86106e0565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561081d57600080fd5b505afa158015610831573d6000803e3d6000fd5b505050506040513d602081101561084757600080fd5b5051905090565b7f000000000000000000000000000000000000000000000000000000000000000090565b816108805761088081610884565b5050565b6108ae817f42414c00000000000000000000000000000000000000000000000000000000006108b1565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fdfea264697066735822122020e2f841d7e5ba859b7ec6dac34054a652ec1da205223c9b88cd38ff4bce169c64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/index.ts b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/index.ts new file mode 100644 index 0000000..b825453 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { AuthorizerAdaptorEntrypointDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as AuthorizerAdaptorEntrypointDeployment; + + const args = [input.AuthorizerAdaptor]; + await task.deployAndVerify('AuthorizerAdaptorEntrypoint', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/input.ts b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/input.ts new file mode 100644 index 0000000..3777926 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type AuthorizerAdaptorEntrypointDeployment = { + AuthorizerAdaptor: string; +}; + +const AuthorizerAdaptor = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY); + +export default { + AuthorizerAdaptor, +}; diff --git a/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/arbitrum.json b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/arbitrum.json new file mode 100644 index 0000000..4de9fa9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptorEntrypoint": "0x97207B095e4D5C9a6e4cfbfcd2C3358E03B90c4A" +} diff --git a/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/avalanche.json b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/avalanche.json new file mode 100644 index 0000000..a49bb02 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/avalanche.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptorEntrypoint": "0x4E7bBd911cf1EFa442BC1b2e9Ea01ffE785412EC" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/base.json b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/base.json new file mode 100644 index 0000000..10a6753 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/base.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptorEntrypoint": "0x9129E834e15eA19b6069e8f08a8EcFc13686B8dC" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/bsc.json b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/bsc.json new file mode 100644 index 0000000..09ebe2b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/bsc.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptorEntrypoint": "0xeb151668006CD04DAdD098AFd0a82e78F77076c3" +} diff --git a/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/gnosis.json b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/gnosis.json new file mode 100644 index 0000000..3e94150 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptorEntrypoint": "0x8F42aDBbA1B16EaAE3BB5754915E0D06059aDd75" +} diff --git a/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/goerli.json b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/goerli.json new file mode 100644 index 0000000..89ae296 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/goerli.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptorEntrypoint": "0xacAaC3e6D6Df918Bf3c809DFC7d42de0e4a72d4C" +} diff --git a/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/mainnet.json b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/mainnet.json new file mode 100644 index 0000000..e797f84 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptorEntrypoint": "0xf5dECDB1f3d1ee384908Fbe16D2F0348AE43a9eA" +} diff --git a/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/mode.json b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/mode.json new file mode 100644 index 0000000..c04e0d5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/mode.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptorEntrypoint": "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/optimism.json b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/optimism.json new file mode 100644 index 0000000..f61c37f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/optimism.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptorEntrypoint": "0xed86ff0c507D3AF5F35d3523B77C17415FCfFaCb" +} diff --git a/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/polygon.json b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/polygon.json new file mode 100644 index 0000000..dc32ad6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/polygon.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptorEntrypoint": "0xAB093cd16e765b5B23D34030aaFaF026558e0A19" +} diff --git a/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/sepolia.json b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/sepolia.json new file mode 100644 index 0000000..8f6e696 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptorEntrypoint": "0xb9aD3466cdd42015cc05d4804DC68D562b6a2065" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/zkevm.json b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/zkevm.json new file mode 100644 index 0000000..8f6e696 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/output/zkevm.json @@ -0,0 +1,3 @@ +{ + "AuthorizerAdaptorEntrypoint": "0xb9aD3466cdd42015cc05d4804DC68D562b6a2065" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/readme.md b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/readme.md new file mode 100644 index 0000000..d896f13 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/readme.md @@ -0,0 +1,18 @@ +# 2022-11-24 - Authorizer Adaptor Entrypoint + +Deployment of the `AuthorizerAdaptorEntrypoint`, a gateway contract created to address a critical bug found in the `AuthorizerAdaptor` that could lead to unintended escalation of privileges. This contract ensures correct interactions with the adaptor and the system of permissions behind it by working in combination with `TimelockAuthorizer` so that all Adaptor calls made through the Entrypoint check for permissions correctly, while any not made via the Entrypoint fail. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`AuthorizerAdaptorEntrypoint` artifact](./artifact/AuthorizerAdaptorEntrypoint.json) diff --git a/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/test/task.fork.ts b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/test/task.fork.ts new file mode 100644 index 0000000..27914f4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221124-authorizer-adaptor-entrypoint/test/task.fork.ts @@ -0,0 +1,45 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { describeForkTest, getForkedNetwork, Task, TaskMode } from '@src'; + +describeForkTest('AuthorizerAdaptorEntrypoint', 'mainnet', 16041900, function () { + let adaptorEntrypoint: Contract, vault: Contract, authorizerAdaptor: Contract, authorizer: Contract; + + let task: Task; + + before('run task', async () => { + task = new Task('20221124-authorizer-adaptor-entrypoint', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + adaptorEntrypoint = await task.deployedInstance('AuthorizerAdaptorEntrypoint'); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + authorizer = await new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance( + 'Authorizer' + ); + authorizerAdaptor = await new Task( + '20220325-authorizer-adaptor', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ).deployedInstance('AuthorizerAdaptor'); + }); + + describe('constructor', () => { + it('checks vault address', async () => { + const entrypointVault = await adaptorEntrypoint.getVault(); + expect(entrypointVault).to.equal(vault.address); + }); + + it('checks authorizer address', async () => { + const entrypointAuthorizer = await adaptorEntrypoint.getAuthorizer(); + expect(entrypointAuthorizer).to.equal(authorizer.address); + }); + + it('checks authorizer adaptor address', async () => { + const entrypointAuthorizerAdaptor = await adaptorEntrypoint.getAuthorizerAdaptor(); + expect(entrypointAuthorizerAdaptor).to.equal(authorizerAdaptor.address); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20221205-veboost-v2/artifact/VeBoostV2.json b/balpy/balancer-deployments/tasks/20221205-veboost-v2/artifact/VeBoostV2.json new file mode 100644 index 0000000..5322618 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221205-veboost-v2/artifact/VeBoostV2.json @@ -0,0 +1,638 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "VeBoostV2", + "sourceName": "@balancer-labs/liquidity-mining/contracts/VeBoostV2.vy", + "abi": [ + { + "name": "Approval", + "inputs": [ + { + "name": "_owner", + "type": "address", + "indexed": true + }, + { + "name": "_spender", + "type": "address", + "indexed": true + }, + { + "name": "_value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Transfer", + "inputs": [ + { + "name": "_from", + "type": "address", + "indexed": true + }, + { + "name": "_to", + "type": "address", + "indexed": true + }, + { + "name": "_value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Boost", + "inputs": [ + { + "name": "_from", + "type": "address", + "indexed": true + }, + { + "name": "_to", + "type": "address", + "indexed": true + }, + { + "name": "_bias", + "type": "uint256", + "indexed": false + }, + { + "name": "_slope", + "type": "uint256", + "indexed": false + }, + { + "name": "_start", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Migrate", + "inputs": [ + { + "name": "_token_id", + "type": "uint256", + "indexed": true + } + ], + "anonymous": false, + "type": "event" + }, + { + "stateMutability": "nonpayable", + "type": "constructor", + "inputs": [ + { + "name": "_boost_v1", + "type": "address" + }, + { + "name": "_ve", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "boost", + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_amount", + "type": "uint256" + }, + { + "name": "_endtime", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "boost", + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_amount", + "type": "uint256" + }, + { + "name": "_endtime", + "type": "uint256" + }, + { + "name": "_from", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "migrate", + "inputs": [ + { + "name": "_token_id", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "migrate_many", + "inputs": [ + { + "name": "_token_ids", + "type": "uint256[16]" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "checkpoint_user", + "inputs": [ + { + "name": "_user", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "permit", + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_deadline", + "type": "uint256" + }, + { + "name": "_v", + "type": "uint8" + }, + { + "name": "_r", + "type": "bytes32" + }, + { + "name": "_s", + "type": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "increaseAllowance", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_added_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "decreaseAllowance", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_subtracted_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "_user", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "adjusted_balance_of", + "inputs": [ + { + "name": "_user", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "delegated_balance", + "inputs": [ + { + "name": "_user", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "received_balance", + "inputs": [ + { + "name": "_user", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "delegable_balance", + "inputs": [ + { + "name": "_user", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "pure", + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "pure", + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "pure", + "type": "function", + "name": "decimals", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8" + } + ] + }, + { + "stateMutability": "pure", + "type": "function", + "name": "BOOST_V1", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "pure", + "type": "function", + "name": "version", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "pure", + "type": "function", + "name": "DOMAIN_SEPARATOR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ] + }, + { + "stateMutability": "pure", + "type": "function", + "name": "VE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "allowance", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "nonces", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "delegated", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "components": [ + { + "name": "bias", + "type": "uint256" + }, + { + "name": "slope", + "type": "uint256" + }, + { + "name": "ts", + "type": "uint256" + } + ] + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "delegated_slope_changes", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "received", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "components": [ + { + "name": "bias", + "type": "uint256" + }, + { + "name": "slope", + "type": "uint256" + }, + { + "name": "ts", + "type": "uint256" + } + ] + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "received_slope_changes", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "migrated", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + } + ], + "bytecode": "0x6020611bb26000396000518060a01c611bad576040526020611bd26000396000518060a01c611bad576060526040516300001a97527f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610160527f576a762e50ddf4c74071046cf7b508f5d87c41676ea1b6c8bf07aba60e5b6306610180527fd61c1033330c368dfc371f5b1e7133f4794e104642e5a3c87aba7a6a3441c8ff6101a052466101c052306101e05260a0610140526101408051602082012090506300001ab7526060516300001ad7523360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600060805260206080a3611a97610115630000000039611a976060016300000000f3600436101561000d57610f31565b60003560e01c34611a925763a2114cdb811861002d573361032052610048565b63b4b3c2498118610154576064358060a01c611a9257610320525b6004358060a01c611a92576103005233610320511461012c57600061032051602052600052604060002080336020526000526040600020905054610340527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610340511461012c5761034051602435808210611a92578082039050905060006103205160205260005260406000208033602052600052604060002090505533610320517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92561034051602435808210611a925780820390509050610360526020610360a35b6103205161018052610300516101a0526024356101c0526044356101e0526101526114d4565b005b63454b06088118610170576004356103005261016e611930565b005b638ce8dd9781186101d25760006010905b80610400526020610400516010811015611a925702600401356101a3576101ce565b6020610400516010811015611a92570260040135610300526101c3611930565b600101818118610181575b5050005b637de680618118610278576004358060a01c611a92576101805260026101805160205260005260406000206101805160405260016060526102146101a0611116565b6101a0805182556020810151600183015560408101516002830155505060046101805160205260005260406000206101805160405260006060526102596101a0611116565b6101a08051825560208101516001830155604081015160028301555050005b63095ea7b381186102ef576004358060a01c611a92576040526024356000336020526000526040600020806040516020526000526040600020905055604051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560243560605260206060a3600160605260206060f35b63d505accf811861076b576004358060a01c611a92576040526024358060a01c611a92576060526084358060081c611a925760805260643542111561038b57601160a0527f455850495245445f5349474e415455524500000000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b600160405160205260005260406000205460a05260006002610360527f1901000000000000000000000000000000000000000000000000000000000000610380526103608051602082018361058001815181525050808301925050506020611ab76000396000518161058001526020810190507f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96104a0526040516104c0526060516104e0526044356105005260a051610520526064356105405260c0610480526104808051602082012090508161058001526020810190508061056052610560905080516020820120905060c05260006040513b116105375760405160c051610180526080516101a05260a4356101c05260c4356101e05260206000608061018060015afa50600051186104c657600060405114156104c9565b60005b6106e3576011610220527f494e56414c49445f5349474e4154555245000000000000000000000000000000610240526102205061022051806102400181600003601f1636823750506308c379a06101e052602061020052601f19601f6102205101166044016101fcfd6106e3565b600060a4356101805260c4356101a05260406101605261016080516020820183610240018281848460045afa90505050808301925050506080516101c0526101c06020602011611a9257601f81018051610200525060016101e0526101e090508051602082018361024001815181525050808301925050508061022052610220905080518060e0526020820181610100838360045afa9050905050507f1626ba7e00000000000000000000000000000000000000000000000000000000631626ba7e61016052604060c05161018052806101a052806101800160e0518082526020820181818361010060045afa90505050805180602083010181600003601f163682375050601f19601f82516020010116905081015050602061016060c461017c6040515afa61066c573d600060003e3d6000fd5b60203d10611a925761016051146106e3576011610240527f494e56414c49445f5349474e4154555245000000000000000000000000000000610260526102405061024051806102600181600003601f1636823750506308c379a061020052602061022052601f19601f61024051011660440161021cfd5b6044356000604051602052600052604060002080606051602052600052604060002090505560a05160018181830110611a92578082019050905060016040516020526000526040600020556060516040517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560443560e052602060e0a3600160e052602060e0f35b63395093518118610818576004358060a01c611a925760405260003360205260005260406000208060405160205260005260406000209050546024358181830110611a9257808201905090506060526060516000336020526000526040600020806040516020526000526040600020905055604051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560605160805260206080a3600160805260206080f35b63a457c2d781186108c3576004358060a01c611a92576040526000336020526000526040600020806040516020526000526040600020905054602435808210611a9257808203905090506060526060516000336020526000526040600020806040516020526000526040600020905055604051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560605160805260206080a3600160805260206080f35b6370a0823181186108f7576004358060a01c611a925761024052602061024051610140526108f2610260611376565b610260f35b63bbf7408a811861092b576004358060a01c611a92576102405260206102405161014052610926610260611376565b610260f35b6318160ddd81186109705760206318160ddd604052602060406004605c6020611ad76000396000515afa610964573d600060003e3d6000fd5b60203d10611a92576040f35b630a767cc68118610a05576004358060a01c611a9257610140526101405160405260016060526109a16101c0610f37565b6101c080516101605260208101516101805260408101516101a052506101605161018051426101a051808210611a925780820390509050808202821582848304141715611a925790509050808210611a9257808203905090506101c05260206101c0f35b6322c18bb68118610a9a576004358060a01c611a925761014052610140516040526000606052610a366101c0610f37565b6101c080516101605260208101516101805260408101516101a052506101605161018051426101a051808210611a925780820390509050808202821582848304141715611a925790509050808210611a9257808203905090506101c05260206101c0f35b63ca8309468118610b80576004358060a01c611a925761014052610140516040526001606052610acb6101c0610f37565b6101c080516101605260208101516101805260408101516101a052506370a082316101c052610140516101e05260206101c060246101dc6020611ad76000396000515afa610b1e573d600060003e3d6000fd5b60203d10611a92576101c0516101605161018051426101a051808210611a925780820390509050808202821582848304141715611a925790509050808210611a925780820390509050808210611a925780820390509050610200526020610200f35b6306fdde038118610c005760208060805260136040527f566f74652d457363726f77656420426f6f7374000000000000000000000000006060526040816080018151808252602083016020830181518152505050805180602083010181600003601f163682375050601f19601f8251602001011690509050810190506080f35b6395d89b418118610c805760208060805260076040527f7665426f6f7374000000000000000000000000000000000000000000000000006060526040816080018151808252602083016020830181518152505050805180602083010181600003601f163682375050601f19601f8251602001011690509050810190506080f35b63313ce5678118610c9657601260405260206040f35b635d14140a8118610cb5576020611a9760003960005160405260206040f35b6354fd4d508118610d355760208060805260066040527f76322e302e3000000000000000000000000000000000000000000000000000006060526040816080018151808252602083016020830181518152505050805180602083010181600003601f163682375050601f19601f8251602001011690509050810190506080f35b633644e5158118610d54576020611ab760003960005160405260206040f35b63c863657d8118610d73576020611ad760003960005160405260206040f35b63dd62ed3e8118610dc5576004358060a01c611a92576040526024358060a01c611a92576060526000604051602052600052604060002080606051602052600052604060002090505460805260206080f35b637ecebe008118610df8576004358060a01c611a9257604052600160405160205260005260406000205460605260206060f35b63f3598ad98118610e3d576004358060a01c611a92576040526002604051602052600052604060002080546060526001810154608052600281015460a0525060606060f35b63356a46808118610e81576004358060a01c611a92576040526003604051602052600052604060002080602435602052600052604060002090505460605260206060f35b63df0cb9348118610ec6576004358060a01c611a92576040526004604051602052600052604060002080546060526001810154608052600281015460a0525060606060f35b635ad600c98118610f0a576004358060a01c611a92576040526005604051602052600052604060002080602435602052600052604060002090505460605260206060f35b630e359f168118610f2f57600660043560205260005260406000205460405260206040f35b505b60006000fd5b606036608037606051610f6f57600460405160205260005260406000208054608052600181015460a052600281015460c05250610f96565b600260405160205260005260406000208054608052600181015460a052600281015460c052505b60c051610fa2574260c0525b4260c05118610fc657608051815260a051602082015260c051604082015250611114565b60c05162093a808082049050905062093a80808202821582848304141715611a92579050905060e052600060ff905b806101005260e05162093a808181830110611a92578082019050905060e05260006101205260e05142106110805760605161105557600560405160205260005260406000208060e051602052600052604060002090505461012052611085565b600360405160205260005260406000208060e051602052600052604060002090505461012052611085565b4260e0525b60805160a05160e05160c051808210611a925780820390509050808202821582848304141715611a925790509050808210611a92578082039050905060805260a05161012051808210611a92578082039050905060a05260e05160c0524260e051186110f0576110fb565b600101818118610ff5575b5050608051815260a051602082015260c0516040820152505b565b60603660803760605161114e57600460405160205260005260406000208054608052600181015460a052600281015460c05250611175565b600260405160205260005260406000208054608052600181015460a052600281015460c052505b60c051611181574260c0525b4260c051186111a557608051815260a051602082015260c051604082015250611374565b600060e05260c05162093a808082049050905062093a80808202821582848304141715611a92579050905061010052600060ff905b80610120526101005162093a808181830110611a9257808201905090506101005260006101405261010051421061126a5760605161123e57600560405160205260005260406000208061010051602052600052604060002090505461014052611270565b600360405160205260005260406000208061010051602052600052604060002090505461014052611270565b42610100525b60a0516101005160c051808210611a925780820390509050808202821582848304141715611a9257905090506101605260e051610160518181830110611a92578082019050905060e05260805161016051808210611a92578082039050905060805260a05161014051808210611a92578082039050905060a0526101005160c0524261010051186113005761130b565b6001018181186111da575b50506060511561131c576000611324565b600060e05114155b1561135d5760006040517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60e051610120526020610120a35b608051815260a051602082015260c0516040820152505b565b6370a0823161018052610140516101a0526020610180602461019c6020611ad76000396000515afa6113ad573d600060003e3d6000fd5b60203d10611a925761018051610160526101405160405260016060526113d46101e0610f37565b6101e080516101805260208101516101a05260408101516101c0525061016051610180516101a051426101c051808210611a925780820390509050808202821582848304141715611a925790509050808210611a925780820390509050808210611a9257808203905090506101605261014051604052600060605261145a6101e0610f37565b6101e080516101805260208101516101a05260408101516101c0525061016051610180516101a051426101c051808210611a925780820390509050808202821582848304141715611a925790509050808210611a9257808203905090508181830110611a9257808201905090506101605261016051815250565b6101a051610180516102205260006102405260016102005260006002905b602081026102200151831861150c57600061020052611517565b6001018181186114f2575b505061020051905015611a925760006101c05114611a9257426101e0511115611a92576101e05162093a8080820690509050611a925763adc635896102005261018051610220526020610200602461021c6020611ad76000396000515afa611584573d600060003e3d6000fd5b60203d10611a9257610200516101e05111611a92576101805160405260016060526115b0610260611116565b610260805161020052602081015161022052604081015161024052506370a082316102605261018051610280526020610260602461027c6020611ad76000396000515afa611603573d600060003e3d6000fd5b60203d10611a92576102605161020051610220514261024051808210611a925780820390509050808202821582848304141715611a925790509050808210611a925780820390509050808210611a9257808203905090506101c05111611a92576101c0516101e05142808210611a925780820390509050808015611a925782049050905061026052610260516101e05142808210611a925780820390509050808202821582848304141715611a9257905090506102805261020051610280518181830110611a9257808201905090506102005261022051610260518181830110611a925780820190509050610220526002610180516020526000526040600020610200518155610220516001820155610240516002820155506003610180516020526000526040600020806101e051602052600052604060002090508054610260518181830110611a9257808201905090508155506101a051604052600060605261176f6102a0611116565b6102a08051610200526020810151610220526040810151610240525061020051610280518181830110611a9257808201905090506102005261022051610260518181830110611a9257808201905090506102205260046101a05160205260005260406000206102005181556102205160018201556102405160028201555060056101a0516020526000526040600020806101e051602052600052604060002090508054610260518181830110611a9257808201905090508155506101a051610180517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6101c0516102a05260206102a0a36101a051610180517f9c0aa947e19ab1e2400ff167e2cb40414b570fdaf31ab646a16749ca3c4301ad610280516102a052610260516102c052426102e05260606102a0a360046101805160205260005260406000206101805160405260006060526118cc6102a0611116565b6102a0805182556020810151600183015560408101516002830155505060026101a05160205260005260406000206101a05160405260016060526119116102a0611116565b6102a08051825560208101516001830155604081015160028301555050565b600661030051602052600052604060002054611a92576103005160601c8060a01c611a925761018052636352211e6103205261030051610340526020610320602461033c6020611a976000396000515afa611990573d600060003e3d6000fd5b60203d10611a9257610320518060a01c611a925761036052610360516101a05263f01e4f0b61038052610300516103a0526020610380602461039c6020611a976000396000515afa6119e7573d600060003e3d6000fd5b60203d10611a9257610380518060008112611a925790506101c052636d1ac9b56103c052610300516103e05260206103c060246103dc6020611a976000396000515afa611a39573d600060003e3d6000fd5b60203d10611a92576103c0516101e052611a516114d4565b6001600661030051602052600052604060002055610300517fd5837b673ffaac69230366d3f7eb7cb2ba2b9fd8f2d4e9d0f5e92d3756b1d5466000610320a2565b600080fd005b600080fd", + "deployedBytecode": "0x600436101561000d57610f31565b60003560e01c34611a925763a2114cdb811861002d573361032052610048565b63b4b3c2498118610154576064358060a01c611a9257610320525b6004358060a01c611a92576103005233610320511461012c57600061032051602052600052604060002080336020526000526040600020905054610340527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610340511461012c5761034051602435808210611a92578082039050905060006103205160205260005260406000208033602052600052604060002090505533610320517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92561034051602435808210611a925780820390509050610360526020610360a35b6103205161018052610300516101a0526024356101c0526044356101e0526101526114d4565b005b63454b06088118610170576004356103005261016e611930565b005b638ce8dd9781186101d25760006010905b80610400526020610400516010811015611a925702600401356101a3576101ce565b6020610400516010811015611a92570260040135610300526101c3611930565b600101818118610181575b5050005b637de680618118610278576004358060a01c611a92576101805260026101805160205260005260406000206101805160405260016060526102146101a0611116565b6101a0805182556020810151600183015560408101516002830155505060046101805160205260005260406000206101805160405260006060526102596101a0611116565b6101a08051825560208101516001830155604081015160028301555050005b63095ea7b381186102ef576004358060a01c611a92576040526024356000336020526000526040600020806040516020526000526040600020905055604051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560243560605260206060a3600160605260206060f35b63d505accf811861076b576004358060a01c611a92576040526024358060a01c611a92576060526084358060081c611a925760805260643542111561038b57601160a0527f455850495245445f5349474e415455524500000000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b600160405160205260005260406000205460a05260006002610360527f1901000000000000000000000000000000000000000000000000000000000000610380526103608051602082018361058001815181525050808301925050506020611ab76000396000518161058001526020810190507f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96104a0526040516104c0526060516104e0526044356105005260a051610520526064356105405260c0610480526104808051602082012090508161058001526020810190508061056052610560905080516020820120905060c05260006040513b116105375760405160c051610180526080516101a05260a4356101c05260c4356101e05260206000608061018060015afa50600051186104c657600060405114156104c9565b60005b6106e3576011610220527f494e56414c49445f5349474e4154555245000000000000000000000000000000610240526102205061022051806102400181600003601f1636823750506308c379a06101e052602061020052601f19601f6102205101166044016101fcfd6106e3565b600060a4356101805260c4356101a05260406101605261016080516020820183610240018281848460045afa90505050808301925050506080516101c0526101c06020602011611a9257601f81018051610200525060016101e0526101e090508051602082018361024001815181525050808301925050508061022052610220905080518060e0526020820181610100838360045afa9050905050507f1626ba7e00000000000000000000000000000000000000000000000000000000631626ba7e61016052604060c05161018052806101a052806101800160e0518082526020820181818361010060045afa90505050805180602083010181600003601f163682375050601f19601f82516020010116905081015050602061016060c461017c6040515afa61066c573d600060003e3d6000fd5b60203d10611a925761016051146106e3576011610240527f494e56414c49445f5349474e4154555245000000000000000000000000000000610260526102405061024051806102600181600003601f1636823750506308c379a061020052602061022052601f19601f61024051011660440161021cfd5b6044356000604051602052600052604060002080606051602052600052604060002090505560a05160018181830110611a92578082019050905060016040516020526000526040600020556060516040517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560443560e052602060e0a3600160e052602060e0f35b63395093518118610818576004358060a01c611a925760405260003360205260005260406000208060405160205260005260406000209050546024358181830110611a9257808201905090506060526060516000336020526000526040600020806040516020526000526040600020905055604051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560605160805260206080a3600160805260206080f35b63a457c2d781186108c3576004358060a01c611a92576040526000336020526000526040600020806040516020526000526040600020905054602435808210611a9257808203905090506060526060516000336020526000526040600020806040516020526000526040600020905055604051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560605160805260206080a3600160805260206080f35b6370a0823181186108f7576004358060a01c611a925761024052602061024051610140526108f2610260611376565b610260f35b63bbf7408a811861092b576004358060a01c611a92576102405260206102405161014052610926610260611376565b610260f35b6318160ddd81186109705760206318160ddd604052602060406004605c6020611ad76000396000515afa610964573d600060003e3d6000fd5b60203d10611a92576040f35b630a767cc68118610a05576004358060a01c611a9257610140526101405160405260016060526109a16101c0610f37565b6101c080516101605260208101516101805260408101516101a052506101605161018051426101a051808210611a925780820390509050808202821582848304141715611a925790509050808210611a9257808203905090506101c05260206101c0f35b6322c18bb68118610a9a576004358060a01c611a925761014052610140516040526000606052610a366101c0610f37565b6101c080516101605260208101516101805260408101516101a052506101605161018051426101a051808210611a925780820390509050808202821582848304141715611a925790509050808210611a9257808203905090506101c05260206101c0f35b63ca8309468118610b80576004358060a01c611a925761014052610140516040526001606052610acb6101c0610f37565b6101c080516101605260208101516101805260408101516101a052506370a082316101c052610140516101e05260206101c060246101dc6020611ad76000396000515afa610b1e573d600060003e3d6000fd5b60203d10611a92576101c0516101605161018051426101a051808210611a925780820390509050808202821582848304141715611a925790509050808210611a925780820390509050808210611a925780820390509050610200526020610200f35b6306fdde038118610c005760208060805260136040527f566f74652d457363726f77656420426f6f7374000000000000000000000000006060526040816080018151808252602083016020830181518152505050805180602083010181600003601f163682375050601f19601f8251602001011690509050810190506080f35b6395d89b418118610c805760208060805260076040527f7665426f6f7374000000000000000000000000000000000000000000000000006060526040816080018151808252602083016020830181518152505050805180602083010181600003601f163682375050601f19601f8251602001011690509050810190506080f35b63313ce5678118610c9657601260405260206040f35b635d14140a8118610cb5576020611a9760003960005160405260206040f35b6354fd4d508118610d355760208060805260066040527f76322e302e3000000000000000000000000000000000000000000000000000006060526040816080018151808252602083016020830181518152505050805180602083010181600003601f163682375050601f19601f8251602001011690509050810190506080f35b633644e5158118610d54576020611ab760003960005160405260206040f35b63c863657d8118610d73576020611ad760003960005160405260206040f35b63dd62ed3e8118610dc5576004358060a01c611a92576040526024358060a01c611a92576060526000604051602052600052604060002080606051602052600052604060002090505460805260206080f35b637ecebe008118610df8576004358060a01c611a9257604052600160405160205260005260406000205460605260206060f35b63f3598ad98118610e3d576004358060a01c611a92576040526002604051602052600052604060002080546060526001810154608052600281015460a0525060606060f35b63356a46808118610e81576004358060a01c611a92576040526003604051602052600052604060002080602435602052600052604060002090505460605260206060f35b63df0cb9348118610ec6576004358060a01c611a92576040526004604051602052600052604060002080546060526001810154608052600281015460a0525060606060f35b635ad600c98118610f0a576004358060a01c611a92576040526005604051602052600052604060002080602435602052600052604060002090505460605260206060f35b630e359f168118610f2f57600660043560205260005260406000205460405260206040f35b505b60006000fd5b606036608037606051610f6f57600460405160205260005260406000208054608052600181015460a052600281015460c05250610f96565b600260405160205260005260406000208054608052600181015460a052600281015460c052505b60c051610fa2574260c0525b4260c05118610fc657608051815260a051602082015260c051604082015250611114565b60c05162093a808082049050905062093a80808202821582848304141715611a92579050905060e052600060ff905b806101005260e05162093a808181830110611a92578082019050905060e05260006101205260e05142106110805760605161105557600560405160205260005260406000208060e051602052600052604060002090505461012052611085565b600360405160205260005260406000208060e051602052600052604060002090505461012052611085565b4260e0525b60805160a05160e05160c051808210611a925780820390509050808202821582848304141715611a925790509050808210611a92578082039050905060805260a05161012051808210611a92578082039050905060a05260e05160c0524260e051186110f0576110fb565b600101818118610ff5575b5050608051815260a051602082015260c0516040820152505b565b60603660803760605161114e57600460405160205260005260406000208054608052600181015460a052600281015460c05250611175565b600260405160205260005260406000208054608052600181015460a052600281015460c052505b60c051611181574260c0525b4260c051186111a557608051815260a051602082015260c051604082015250611374565b600060e05260c05162093a808082049050905062093a80808202821582848304141715611a92579050905061010052600060ff905b80610120526101005162093a808181830110611a9257808201905090506101005260006101405261010051421061126a5760605161123e57600560405160205260005260406000208061010051602052600052604060002090505461014052611270565b600360405160205260005260406000208061010051602052600052604060002090505461014052611270565b42610100525b60a0516101005160c051808210611a925780820390509050808202821582848304141715611a9257905090506101605260e051610160518181830110611a92578082019050905060e05260805161016051808210611a92578082039050905060805260a05161014051808210611a92578082039050905060a0526101005160c0524261010051186113005761130b565b6001018181186111da575b50506060511561131c576000611324565b600060e05114155b1561135d5760006040517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60e051610120526020610120a35b608051815260a051602082015260c0516040820152505b565b6370a0823161018052610140516101a0526020610180602461019c6020611ad76000396000515afa6113ad573d600060003e3d6000fd5b60203d10611a925761018051610160526101405160405260016060526113d46101e0610f37565b6101e080516101805260208101516101a05260408101516101c0525061016051610180516101a051426101c051808210611a925780820390509050808202821582848304141715611a925790509050808210611a925780820390509050808210611a9257808203905090506101605261014051604052600060605261145a6101e0610f37565b6101e080516101805260208101516101a05260408101516101c0525061016051610180516101a051426101c051808210611a925780820390509050808202821582848304141715611a925790509050808210611a9257808203905090508181830110611a9257808201905090506101605261016051815250565b6101a051610180516102205260006102405260016102005260006002905b602081026102200151831861150c57600061020052611517565b6001018181186114f2575b505061020051905015611a925760006101c05114611a9257426101e0511115611a92576101e05162093a8080820690509050611a925763adc635896102005261018051610220526020610200602461021c6020611ad76000396000515afa611584573d600060003e3d6000fd5b60203d10611a9257610200516101e05111611a92576101805160405260016060526115b0610260611116565b610260805161020052602081015161022052604081015161024052506370a082316102605261018051610280526020610260602461027c6020611ad76000396000515afa611603573d600060003e3d6000fd5b60203d10611a92576102605161020051610220514261024051808210611a925780820390509050808202821582848304141715611a925790509050808210611a925780820390509050808210611a9257808203905090506101c05111611a92576101c0516101e05142808210611a925780820390509050808015611a925782049050905061026052610260516101e05142808210611a925780820390509050808202821582848304141715611a9257905090506102805261020051610280518181830110611a9257808201905090506102005261022051610260518181830110611a925780820190509050610220526002610180516020526000526040600020610200518155610220516001820155610240516002820155506003610180516020526000526040600020806101e051602052600052604060002090508054610260518181830110611a9257808201905090508155506101a051604052600060605261176f6102a0611116565b6102a08051610200526020810151610220526040810151610240525061020051610280518181830110611a9257808201905090506102005261022051610260518181830110611a9257808201905090506102205260046101a05160205260005260406000206102005181556102205160018201556102405160028201555060056101a0516020526000526040600020806101e051602052600052604060002090508054610260518181830110611a9257808201905090508155506101a051610180517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6101c0516102a05260206102a0a36101a051610180517f9c0aa947e19ab1e2400ff167e2cb40414b570fdaf31ab646a16749ca3c4301ad610280516102a052610260516102c052426102e05260606102a0a360046101805160205260005260406000206101805160405260006060526118cc6102a0611116565b6102a0805182556020810151600183015560408101516002830155505060026101a05160205260005260406000206101a05160405260016060526119116102a0611116565b6102a08051825560208101516001830155604081015160028301555050565b600661030051602052600052604060002054611a92576103005160601c8060a01c611a925761018052636352211e6103205261030051610340526020610320602461033c6020611a976000396000515afa611990573d600060003e3d6000fd5b60203d10611a9257610320518060a01c611a925761036052610360516101a05263f01e4f0b61038052610300516103a0526020610380602461039c6020611a976000396000515afa6119e7573d600060003e3d6000fd5b60203d10611a9257610380518060008112611a925790506101c052636d1ac9b56103c052610300516103e05260206103c060246103dc6020611a976000396000515afa611a39573d600060003e3d6000fd5b60203d10611a92576103c0516101e052611a516114d4565b6001600661030051602052600052604060002055610300517fd5837b673ffaac69230366d3f7eb7cb2ba2b9fd8f2d4e9d0f5e92d3756b1d5466000610320a2565b600080fd", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20221205-veboost-v2/index.ts b/balpy/balancer-deployments/tasks/20221205-veboost-v2/index.ts new file mode 100644 index 0000000..9560391 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221205-veboost-v2/index.ts @@ -0,0 +1,10 @@ +import { Task, TaskRunOptions } from '@src'; +import { VeBoostV2Deployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as VeBoostV2Deployment; + + const args = [input.PreseededVotingEscrowDelegation, input.VotingEscrow]; + + await task.deploy('VeBoostV2', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20221205-veboost-v2/input.ts b/balpy/balancer-deployments/tasks/20221205-veboost-v2/input.ts new file mode 100644 index 0000000..317fae6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221205-veboost-v2/input.ts @@ -0,0 +1,14 @@ +import { Task, TaskMode } from '@src'; + +export type VeBoostV2Deployment = { + PreseededVotingEscrowDelegation: string; + VotingEscrow: string; +}; + +const VotingEscrow = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); +const PreseededVotingEscrowDelegation = new Task('20220530-preseeded-voting-escrow-delegation', TaskMode.READ_ONLY); + +export default { + VotingEscrow, + PreseededVotingEscrowDelegation, +}; diff --git a/balpy/balancer-deployments/tasks/20221205-veboost-v2/output/goerli.json b/balpy/balancer-deployments/tasks/20221205-veboost-v2/output/goerli.json new file mode 100644 index 0000000..7358752 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221205-veboost-v2/output/goerli.json @@ -0,0 +1,3 @@ +{ + "VeBoostV2": "0xd13AFc362F619b840C8f4AaC1D957cE219eF37Ca" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20221205-veboost-v2/output/mainnet.json b/balpy/balancer-deployments/tasks/20221205-veboost-v2/output/mainnet.json new file mode 100644 index 0000000..ef4dc74 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221205-veboost-v2/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "VeBoostV2": "0x67F8DF125B796B05895a6dc8Ecf944b9556ecb0B" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20221205-veboost-v2/output/sepolia.json b/balpy/balancer-deployments/tasks/20221205-veboost-v2/output/sepolia.json new file mode 100644 index 0000000..841e0a6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221205-veboost-v2/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "VeBoostV2": "0x927906bbAc747c13c75F6447FE8abb490EAB456C" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20221205-veboost-v2/readme.md b/balpy/balancer-deployments/tasks/20221205-veboost-v2/readme.md new file mode 100644 index 0000000..f327515 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221205-veboost-v2/readme.md @@ -0,0 +1,10 @@ +# 2022-12-05 - veBoost V2 + +Deployment of the veBoostV2, a replacement for the [`PreseededVotingEscrowDelegation`](../20220530-preseeded-voting-escrow-delegation). This simplifies the boost contract greatly and allows integration with [Paladin's](https://paladin.vote/) boost market. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`VeBoostV2` artifact](./artifact/VeBoostV2.json) \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20221205-veboost-v2/test/test.fork.ts b/balpy/balancer-deployments/tasks/20221205-veboost-v2/test/test.fork.ts new file mode 100644 index 0000000..7e35137 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20221205-veboost-v2/test/test.fork.ts @@ -0,0 +1,97 @@ +import hre from 'hardhat'; +import { Contract } from 'ethers'; +import { expect } from 'chai'; + +import { ZERO_BYTES32 } from '@helpers/constants'; + +import { actionId } from '@helpers/models/misc/actions'; + +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; + +describeForkTest('veBoostV2', 'mainnet', 16110000, function () { + let oldDelegation: Contract; + let delegation: Contract; + + let task: Task; + + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + + const existingBoosts: string[] = [ + '0x7f01d9b227593e033bf8d6fc86e634d27aa85568000000000000000000000000', + '0xc2593e6a71130e7525ec3e64ba7795827086df0a000000000000000000000000', + '0xef9a40f0ce782108233b6a5d8fef08c89b01a7bd000000000000000000000000', + '0x0035fc5208ef989c28d47e552e92b0c507d2b318000000000000000000000000', + '0xc4eac760c2c631ee0b064e39888b89158ff808b2000000000000000000005abf', + ]; + + before('run task', async () => { + task = new Task('20221205-veboost-v2', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + delegation = await task.deployedInstance('VeBoostV2'); + + oldDelegation = await new Task( + '20220530-preseeded-voting-escrow-delegation', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ).deployedInstance('PreseededVotingEscrowDelegation'); + }); + + it('no unexpected boosts exist on old veBoost contract', async () => { + const totalSupply = await oldDelegation.totalSupply(); + expect(existingBoosts.length).to.be.eq(totalSupply); + }); + + it('proxy can be migrated to delegation', async () => { + const delegationProxy = await new Task( + '20220325-ve-delegation', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ).deployedInstance('VotingEscrowDelegationProxy'); + + const authorizer = await new Task( + '20210418-authorizer', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ).deployedInstance('Authorizer'); + + const govMultisig = await impersonate(GOV_MULTISIG); + await authorizer + .connect(govMultisig) + .grantRole(await actionId(delegationProxy, 'setDelegation'), govMultisig.address); + + await delegationProxy.connect(govMultisig).setDelegation(delegation.address); + + expect(await delegationProxy.getDelegationImplementation()).to.be.eq(delegation.address); + }); + + it('allows existing boosts to be migrated', async () => { + const migrateArgs = Array.from({ length: 16 }, (_, i) => existingBoosts[i] ?? ZERO_BYTES32); + + await delegation.migrate_many(migrateArgs); + + for (const tokenId of existingBoosts) { + expect(await delegation.migrated(tokenId)).to.be.true; + } + }); + + it('adjusted balances should be unchanged', async () => { + for (const tokenId of existingBoosts) { + const boostSender = tokenId.slice(0, 42); + const preMigrationAdjustedBalanceSender = await oldDelegation.adjusted_balance_of(boostSender); + const postMigrationAdjustedBalanceSender = await oldDelegation.adjusted_balance_of(boostSender); + expect(postMigrationAdjustedBalanceSender).to.be.eq(preMigrationAdjustedBalanceSender); + + const boostReceiver = await oldDelegation.ownerOf(tokenId); + const preMigrationAdjustedBalanceReceiver = await oldDelegation.adjusted_balance_of(boostReceiver); + const postMigrationAdjustedBalanceReceiver = await oldDelegation.adjusted_balance_of(boostReceiver); + + expect(postMigrationAdjustedBalanceReceiver).to.be.eq(preMigrationAdjustedBalanceReceiver); + + // Assumes that senders and receivers are 1:1. + const delegatedBalance = await delegation.delegated_balance(boostSender); + const receivedBalance = await delegation.received_balance(boostReceiver); + expect(delegatedBalance).to.be.gt(0); + expect(delegatedBalance).to.be.eq(receivedBalance); + } + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/artifact/EulerLinearPool.json b/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/artifact/EulerLinearPool.json new file mode 100644 index 0000000..f289bdf --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/artifact/EulerLinearPool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"components": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20", "name": "mainToken", "type": "address"}, {"internalType": "contract IERC20", "name": "wrappedToken", "type": "address"}, {"internalType": "address", "name": "assetManager", "type": "address"}, {"internalType": "uint256", "name": "upperTarget", "type": "uint256"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "string", "name": "version", "type": "string"}], "internalType": "struct EulerLinearPool.ConstructorArgs", "name": "args", "type": "tuple"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "enabled", "type": "bool"}], "name": "RecoveryModeStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "lowerTarget", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "upperTarget", "type": "uint256"}], "name": "TargetsSet", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "disableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "enableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getBptIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "pure", "type": "function"}, {"inputs": [], "name": "getDomainSeparator", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMainIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMainToken", "outputs": [{"internalType": "contract IERC20", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "getNextNonce", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getProtocolFeesCollector", "outputs": [{"internalType": "contract IProtocolFeesCollector", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getScalingFactors", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getTargets", "outputs": [{"internalType": "uint256", "name": "lowerTarget", "type": "uint256"}, {"internalType": "uint256", "name": "upperTarget", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVirtualSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedToken", "outputs": [{"internalType": "contract IERC20", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedTokenRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "inRecoveryMode", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "dueProtocolFees", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "dueProtocolFees", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "indexIn", "type": "uint256"}, {"internalType": "uint256", "name": "indexOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256", "name": "balanceTokenIn", "type": "uint256"}, {"internalType": "uint256", "name": "balanceTokenOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "newLowerTarget", "type": "uint256"}, {"internalType": "uint256", "name": "newUpperTarget", "type": "uint256"}], "name": "setTargets", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "version", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/artifact/EulerLinearPoolFactory.json b/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/artifact/EulerLinearPoolFactory.json new file mode 100644 index 0000000..984843b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/artifact/EulerLinearPoolFactory.json @@ -0,0 +1,347 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "EulerLinearPoolFactory", + "sourceName": "contracts/euler-linear-pool/EulerLinearPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "contract IBalancerQueries", + "name": "queries", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "poolVersion", + "type": "string" + }, + { + "internalType": "uint256", + "name": "initialPauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_eulerProtocol", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "EulerLinearPoolCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract LinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "eulerProtocol", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastCreatedPool", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeePercentagesProvider", + "outputs": [ + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6102006040523480156200001257600080fd5b50604051620096c1380380620096c18339810160408190526200003591620003d0565b87878484604051806020016200004b906200027f565b601f1982820381018352601f909101166040528951839083908790309085908f906200007f9060009060208401906200028d565b505080516002810460a081905280820360e081905281845283620000af81620001a0602090811b62000b5617901c565b60601b6001600160601b0319166080528285018051838252620000de82620001a0602090811b62000b5617901c565b6001600160601b0319606091821b811660c0529690935290526101009590955250509290911b909116610120525062000121630163f500831115610194620001f4565b620001356276a700821115610195620001f4565b610140829052610160524201610180525050506001600160601b0319606091821b81166101a05260016003559088901b166101c052508351620001809060069060208701906200028d565b5060601b6001600160601b0319166101e05250620004b895505050505050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001ee6001600160a01b03831615156101ac620001f4565b50919050565b816200020557620002058162000209565b5050565b6200021b816210905360ea1b6200021e565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b61598b8062003d3683390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002d057805160ff191683800117855562000300565b8280016001018555821562000300579182015b8281111562000300578251825591602001919060010190620002e3565b506200030e92915062000312565b5090565b5b808211156200030e576000815560010162000313565b600082601f8301126200033a578081fd5b81516001600160401b038082111562000351578283fd5b6040516020601f8401601f191682018101838111838210171562000373578586fd5b806040525081945083825286818588010111156200039057600080fd5b600092505b83831015620003b4578583018101518284018201529182019162000395565b83831115620003c65760008185840101525b5050505092915050565b600080600080600080600080610100898b031215620003ed578384fd5b8851620003fa81620004a2565b60208a01519098506200040d81620004a2565b60408a01519097506200042081620004a2565b60608a01519096506001600160401b03808211156200043d578586fd5b6200044b8c838d0162000329565b965060808b015191508082111562000461578586fd5b50620004708b828c0162000329565b94505060a0890151925060c0890151915060e08901516200049181620004a2565b809150509295985092959890939650565b6001600160a01b03811681146200021b57600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405161016051610180516101a05160601c6101c05160601c6101e05160601c6137d2620005646000398061044852806106d05280610a855250806106af52508061053e5250806102a152806102cb5250806102ef525050806105b6525080610564525080610bbf5250806102785280610c3b525080610be05250806102575280610c1752506137d26000f3fe60806040523480156200001157600080fd5b50600436106200010b5760003560e01c80635ed3128211620000a5578063851c1bb3116200006f578063851c1bb314620001e35780638d928af81462000209578063aaabadc51462000213578063df8af989146200021d576200010b565b80635ed31282146200019f5780636634b75314620001a95780636c57f5a914620001cf578063739238d614620001d9576200010b565b80632f2770db11620000e75780632f2770db14620001665780633f819b6f14620001725780635208fc2b146200017c57806354fd4d501462000195576200010b565b8062c194db1462000110578063174481fa14620001325780632da47c40146200014c575b600080fd5b6200011a62000234565b6040516200012991906200159a565b60405180910390f35b6200013c62000255565b6040516200012992919062001533565b620001566200029b565b6040516200012992919062001820565b6200017062000324565b005b6200011a6200038e565b6200018662000446565b60405162000129919062001512565b6200011a6200046a565b62000186620004ec565b620001c0620001ba3660046200129c565b62000508565b6040516200012991906200155a565b620001c062000533565b620001866200053c565b620001fa620001f4366004620012fc565b62000560565b60405162000129919062001565565b62000186620005b4565b62000186620005d8565b620001866200022e3660046200133e565b62000665565b6060620002506040518060200160405280600081525062000bb7565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200031657807f00000000000000000000000000000000000000000000000000000000000000000392507f000000000000000000000000000000000000000000000000000000000000000091506200031f565b60009250600091505b509091565b6200032e62000c92565b6200033862000ce1565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156200043c5780601f1062000410576101008083540402835291602001916200043c565b820191906000526020600020905b8154815290600101906020018083116200041e57829003601f168201915b5050505050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156200043c5780601f1062000410576101008083540402835291602001916200043c565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f00000000000000000000000000000000000000000000000000000000000000008260405160200162000597929190620014af565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000620005e4620005b4565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200062a57600080fd5b505afa1580156200063f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002509190620012bb565b60006200067162000cfa565b600480546001810190915560405160609062000690602082016200113d565b601f1982820381018352601f90910116604052620006ad620005b4565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040516020016200070393929190620015af565b60408051601f1981840301815290829052620007239291602001620014df565b604051602081830303815290604052905060006200074983838051906020012062000d15565b9050600080620007586200029b565b91509150620007666200114b565b62000770620005b4565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508e81602001819052508d81604001819052508c816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508a8160c0018181525050898160e0018181525050828161010001818152505081816101200181815250508881610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050620008ce6200038e565b6101608201526040516000906200090490620008ef90849060200162001718565b60405160208183030381529060405262000d2b565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200094f57600080fd5b505af115801562000964573d6000803e3d6000fd5b505050506000620009786000898962000d80565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614620009eb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009e290620016aa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16635208fc2b6040518163ffffffff1660e01b815260040160206040518083038186803b15801562000a3257600080fd5b505afa15801562000a47573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a6d9190620012bb565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161462000af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009e29062001616565b6040518a9073ffffffffffffffffffffffffffffffffffffffff8416907fde3939ceca101461fd7e389705020a1f8b1518edb75d05284b21aa270354c3dc90600090a350965050505050505062000b4a62000e5e565b98975050505050505050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000bb173ffffffffffffffffffffffffffffffffffffffff831615156101ac62000e65565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000c8481838662000e7a565b505050505050505050919050565b600062000cc36000357fffffffff000000000000000000000000000000000000000000000000000000001662000560565b905062000cde62000cd5823362000ed8565b61019162000e65565b50565b62000cf862000cef62000533565b1560d362000e65565b565b62000d0e6002600354141561019062000e65565b6002600355565b600062000d2483833062000f76565b9392505050565b60008062000d398362000fb7565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790559392505050565b6000808447101562000dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009e290620015df565b825162000dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009e290620016e1565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009e29062001673565b949350505050565b6001600355565b8162000e765762000e768162001052565b5050565b5b6020811062000e9c578151835260209283019290910190601f190162000e7b565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000ee4620005d8565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000f22939291906200156e565b60206040518083038186803b15801562000f3b57600080fd5b505afa15801562000f50573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d249190620012da565b60008060ff60f81b83868660405160200162000f9694939291906200144b565b60408051808303601f19018152919052805160209091012095945050505050565b600062000fc362000ce1565b600062000fd0836200107e565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b62000cde817f42414c0000000000000000000000000000000000000000000000000000000000620010c2565b600060606200108d8362000bb7565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811662000d24573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611f18806200188583390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f8301126200122b578081fd5b813567ffffffffffffffff8082111562001243578283fd5b6040516020601f19601f850116820101818110838211171562001264578485fd5b6040528281529250828483016020018610156200128057600080fd5b8260208601602083013760006020848301015250505092915050565b600060208284031215620012ae578081fd5b813562000d248162001861565b600060208284031215620012cd578081fd5b815162000d248162001861565b600060208284031215620012ec578081fd5b8151801515811462000d24578182fd5b6000602082840312156200130e578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811462000d24578182fd5b600080600080600080600080610100898b0312156200135b578384fd5b883567ffffffffffffffff8082111562001373578586fd5b620013818c838d016200121a565b995060208b013591508082111562001397578586fd5b50620013a68b828c016200121a565b9750506040890135620013b98162001861565b95506060890135620013cb8162001861565b94506080890135935060a0890135925060c0890135620013eb8162001861565b8092505060e089013590509295985092959890939650565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620014378160208601602086016200182e565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60008351620014f38184602088016200182e565b835190830190620015098183602088016200182e565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000d2460208301846200141d565b73ffffffffffffffffffffffffffffffffffffffff93841681529183166020830152909116604082015260600190565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526025908201527f526562616c616e636572206e6f74206177617265206f662065756c657250726f60408201527f746f636f6c000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b6000602082526200172e60208301845162001403565b60208301516101808060408501526200174c6101a08501836200141d565b91506040850151601f19808685030160608701526200176c84836200141d565b93506060870151915062001784608087018362001403565b608087015191506200179a60a087018362001403565b60a08701519150620017b060c087018362001403565b60c087015160e0878101919091528701516101008088019190915287015161012080880191909152870151610140808801919091528701519150610160620017fb8188018462001403565b8701518685039091018387015290506200181683826200141d565b9695505050505050565b918252602082015260400190565b60005b838110156200184b57818101518382015260200162001831565b838111156200185b576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000cde57600080fdfe6101806040523480156200001257600080fd5b5060405162001f1838038062001f18833981016040819052620000359162000470565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000386565b8383826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620001259190810190620003ac565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000457565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000457565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000386565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000386565b6001600160601b0319606091821b811660e05292811b83166101205290811b8216610140529290921b909116610160525062000503915050565b60006020828403121562000398578081fd5b8151620003a581620004ea565b9392505050565b60006020808385031215620003bf578182fd5b82516001600160401b0380821115620003d6578384fd5b818501915085601f830112620003ea578384fd5b815181811115620003f9578485fd5b83810291506200040b848301620004c3565b8181528481019084860184860187018a101562000426578788fd5b8795505b838610156200044a5780518352600195909501949186019186016200042a565b5098975050505050505050565b60006020828403121562000469578081fd5b5051919050565b60008060006060848603121562000485578182fd5b83516200049281620004ea565b6020850151909350620004a581620004ea565b6040850151909250620004b881620004ea565b809150509250925092565b6040518181016001600160401b0381118282101715620004e257600080fd5b604052919050565b6001600160a01b03811681146200050057600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c6101605160601c611920620005f86000398060e352806111d5525080610540528061085852508061016a5280610c4b528061101052806110725250806103f65250806104a352806105d0528061077f52806109235280610cf95280610dbe528061110b528061123752508061012152806101c7528061046752806106035280610668528061070952806107bb52806108e852806111b35250806101a6528061043952806107515280610ab45280610b935280610e985280610f7752508060ac528061034052506119206000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063026b1d5f1461005157806321c281911461006f5780635208fc2b1461008f578063df633d8d14610097575b600080fd5b6100596100aa565b6040516100669190611648565b60405180910390f35b61008261007d366004611506565b6100ce565b6040516100669190611889565b6100596100e1565b6100826100a5366004611522565b610105565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100d982610159565b90505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061014973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610290565b61015283610159565b9392505050565b600080610164610339565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401610203929190611794565b60806040518083038186803b15801561021b57600080fd5b505afa15801561022f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025391906115a8565b5050509050818110156102755761026c81830385610422565b925050506100dc565b818111156102895761026c8282038561073a565b5050919050565b610333846323b872dd60e01b8585856040516024016102b193929190611690565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610948565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b1580156103a357600080fd5b505afa1580156103b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103db9190611585565b9150915060006002828401816103ed57fe5b04905061041a817f00000000000000000000000000000000000000000000000000000000000000006109f5565b935050505090565b600061042c611453565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506105006114b6565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061057790869086906004016117c6565b602060405180830381600087803b15801561059157600080fd5b505af11580156105a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c9919061156d565b90506105f57f000000000000000000000000000000000000000000000000000000000000000082610a48565b6105fe81610cb9565b6106287f000000000000000000000000000000000000000000000000000000000000000087610e2c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a082319061069d903090600401611648565b60206040518083038186803b1580156106b557600080fd5b505afa1580156106c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ed919061156d565b905061073073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001687836110a7565b9695505050505050565b6000610744611453565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506108186114b6565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061088f90869086906004016117c6565b602060405180830381600087803b1580156108a957600080fd5b505af11580156108bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e1919061156d565b905061090d7f000000000000000000000000000000000000000000000000000000000000000087610a48565b61091e610919826110cb565b611199565b6106287f000000000000000000000000000000000000000000000000000000000000000082610e2c565b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051610971919061162c565b6000604051808303816000865af19150503d80600081146109ae576040519150601f19603f3d011682016040523d82523d6000602084013e6109b3565b606091505b509150915060008214156109cb573d6000803e3d6000fd5b6103338151600014806109ed5750818060200190518101906109ed919061154d565b6101a26112a4565b6000610a0482151560046112a4565b670de0b6b3a76400008302610a36841580610a2f5750670de0b6b3a7640000858381610a2c57fe5b04145b60056112a4565b828181610a3f57fe5b04949350505050565b6040805160028082526060828101909352816020015b610a666114dd565b815260200190600190039081610a5e579050509050600081600081518110610a8a57fe5b6020026020010151600001906002811115610aa157fe5b90816002811115610aae57fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610ae057fe5b602002602001015160200181815250508181600081518110610afe57fe5b602002602001015160600181815250508281600081518110610b1c57fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b6957fe5b6020026020010151600001906002811115610b8057fe5b90816002811115610b8d57fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610bbf57fe5b60200260200101516020018181525050600081600181518110610bde57fe5b602002602001015160600181815250508281600181518110610bfc57fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c82908490600401611710565b600060405180830381600087803b158015610c9c57600080fd5b505af1158015610cb0573d6000803e3d6000fd5b50505050505050565b6040517f010ad6d100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063010ad6d190610d2e908590600401611889565b60206040518083038186803b158015610d4657600080fd5b505afa158015610d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7e919061156d565b6040517f441a3e7000000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063441a3e7090610df69060009085906004016117b8565b600060405180830381600087803b158015610e1057600080fd5b505af1158015610e24573d6000803e3d6000fd5b505050505050565b6040805160028082526060828101909352816020015b610e4a6114dd565b815260200190600190039081610e42579050509050600281600081518110610e6e57fe5b6020026020010151600001906002811115610e8557fe5b90816002811115610e9257fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610ec457fe5b602002602001015160200181815250508181600081518110610ee257fe5b602002602001015160600181815250508281600081518110610f0057fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610f4d57fe5b6020026020010151600001906002811115610f6457fe5b90816002811115610f7157fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610fa357fe5b602002602001015160200181815250508181600181518110610fc157fe5b602002602001015160600181815250508281600181518110610fdf57fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff9182166040909101526110359084167f0000000000000000000000000000000000000000000000000000000000000000846112b6565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c82908490600401611710565b6110c68363a9059cbb60e01b84846040516024016102b19291906116ea565b505050565b6040517f010ad6d100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063010ad6d190611140908590600401611889565b60206040518083038186803b15801561115857600080fd5b505afa15801561116c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611190919061156d565b60010192915050565b6111fa73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f0000000000000000000000000000000000000000000000000000000000000000836112b6565b6040517fe2bbb15800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e2bbb1589061126f9060009085906004016117b8565b600060405180830381600087803b15801561128957600080fd5b505af115801561129d573d6000803e3d6000fd5b5050505050565b816112b2576112b2816113ab565b5050565b801580159061136757506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e906113149030908690600401611669565b60206040518083038186803b15801561132c57600080fd5b505afa158015611340573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611364919061156d565b15155b1561138c5761138c8363095ea7b360e01b8460006040516024016102b19291906116c1565b6110c68363095ea7b360e01b84846040516024016102b19291906116ea565b6113d5817f42414c00000000000000000000000000000000000000000000000000000000006113d8565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b600060208284031215611517578081fd5b8135610152816118c8565b60008060408385031215611534578081fd5b823561153f816118c8565b946020939093013593505050565b60006020828403121561155e578081fd5b81518015158114610152578182fd5b60006020828403121561157e578081fd5b5051919050565b60008060408385031215611597578182fd5b505080516020909101519092909150565b600080600080608085870312156115bd578182fd5b84519350602085015192506040850151915060608501516115dd816118c8565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161163e818460208701611892565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561178757815180516003811061174357fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff1686860152606090810151908501526080909301929085019060010161172d565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b918252602082015260400190565b600060a08252835160a083015260208401516117e1816118be565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c061014084015280518061016085015261018061184d8282870160208601611892565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061015260208301846115e8565b90815260200190565b60005b838110156118ad578181015183820152602001611895565b838111156103335750506000910152565b600281106113d557fe5b73ffffffffffffffffffffffffffffffffffffffff811681146113d557600080fdfea26469706673582212201e159ab0035a167cadb43e6e3d42a37057cf3eaa63771a32ec057c13a75b2f8564736f6c63430007010033a264697066735822122018472618193b41b5aaed0a3de515ac4052e765e3c00aab4be2f06bcd872dcf1464736f6c634300070100336102c06040523480156200001257600080fd5b506040516200598b3803806200598b833981016040819052620000359162000df2565b6101608101518151602083015160408401516060850151608086015160c087015162000061886200047d565b60e08901516101008a01516101208b01516101408c01518a6200009e8160006200008c8c8c62000506565b89620005b760201b620014241760201c565b8b8b86868686838387878b86336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000ed92919062000c7b565b5080516200010390600490602084019062000c7b565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001829050630163f50083111561019462000785565b620001966276a70082111561019562000785565b4291909101610140819052016101605260601b6001600160601b031916610180526101a08690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000db3565b6001600160a01b03166101c0816001600160a01b031660601b8152505050505050505050876001600160a01b03166101e0816001600160a01b031660601b81525050866001600160a01b0316610200816001600160a01b031660601b81525050866001600160a01b0316886001600160a01b031610620002bb576002620002be565b60015b60ff16610220526001600160a01b0380881690891610620002e1576001620002e4565b60025b60ff1661024052620002f6886200079a565b6102605262000305876200079a565b6102805260006200031889828962000846565b620003238562000940565b50508a51620003469a506009995060208c019850965062000c7b95505050505050565b5050620003ec81608001516001600160a01b0316637158da7c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038a57600080fd5b505afa1580156200039f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003c5919062000db3565b6001600160a01b031682606001516001600160a01b0316146102086200078560201b60201c565b600081606001516001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200042c57600080fd5b505afa15801562000441573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000467919062000f49565b60ff16602403600a0a6102a052506200106f9050565b6040805160028082526060808301845292839291906020830190803683370190505090508260a0015181600081518110620004b457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260a0015181600181518110620004e757fe5b6001600160a01b03909216602092830291909101909101529050919050565b60408051600280825260608281019093526001600160a01b0384811690861610918391816020016020820280368337019050509050816200054857836200054a565b845b816000815181106200055857fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508162000585578462000587565b835b816001815181106200059557fe5b6001600160a01b03909216602092830291909101909101529150505b92915050565b6000620005cf83620009cf60201b620015d91760201c565b606083516001016001600160401b0381118015620005ec57600080fd5b5060405190808252806020026020018201604052801562000617578160200160208202803683370190505b50905030816000815181106200062957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156200069c578481815181106200066357fe5b60200260200101518282600101815181106200067b57fe5b6001600160a01b03909216602092830291909101909101526001016200064c565b50606083516001016001600160401b0381118015620006ba57600080fd5b50604051908082528060200260200182016040528015620006e5578160200160208202803683370190505b509050600081600081518110620006f857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156200076b578481815181106200073257fe5b60200260200101518282600101815181106200074a57fe5b6001600160a01b03909216602092830291909101909101526001016200071b565b506200077a87878484620009db565b979650505050505050565b816200079657620007968162000ad5565b5050565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620007d757600080fd5b505afa158015620007ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000812919062000f49565b60ff16905060006200083160128362000aea60201b620015e71760201c565b600a0a670de0b6b3a764000002949350505050565b620008578183111561014c62000785565b620008746b0de0b6b39983494c589c000082111561014d62000785565b6200088e670de0b6b3a7640000825b061561016162000785565b620008a2670de0b6b3a76400008362000883565b620008f1670de0b6b3a7640000820460406020620008db670de0b6b3a764000087600854919004602080620015fd62000b02821b17811c565b62000b0260201b620015fd17909392919060201c565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d12809062000933908590859062001018565b60405180910390a2505050565b6200095564e8d4a5100082101560cb62000785565b6200096d67016345785d8a000082111560ca62000785565b6200098f8160c0603f60085462000b0260201b620015fd17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90620009c49083906200100f565b60405180910390a150565b80620007968162000b27565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040162000a0c919062000ffa565b602060405180830381600087803b15801562000a2757600080fd5b505af115801562000a3c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a62919062000dd9565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000a979084908890889060040162000f6c565b600060405180830381600087803b15801562000ab257600080fd5b505af115801562000ac7573d6000803e3d6000fd5b509298975050505050505050565b62000ae7816210905360ea1b62000bb3565b50565b600062000afc83831115600162000785565b50900390565b600062000b1184848462000c14565b506001901b60001901811b1992909216911b1790565b60028151101562000b385762000ae7565b60008160008151811062000b4857fe5b602002602001015190506000600190505b825181101562000bae57600083828151811062000b7257fe5b6020026020010151905062000ba3816001600160a01b0316846001600160a01b03161060656200078560201b60201c565b915060010162000b59565b505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b62000c256101008310606462000785565b62000c5e6001821015801562000c56575062000c5260ff846101000362000c6f60201b620016201760201c565b8211155b606462000785565b62000bae83821c156101b462000785565b80820390821102900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000cbe57805160ff191683800117855562000cee565b8280016001018555821562000cee579182015b8281111562000cee57825182559160200191906001019062000cd1565b5062000cfc92915062000d00565b5090565b5b8082111562000cfc576000815560010162000d01565b8051620005b18162001059565b600082601f83011262000d35578081fd5b81516001600160401b0381111562000d4b578182fd5b602062000d61601f8301601f1916820162001026565b9250818352848183860101111562000d7857600080fd5b60005b8281101562000d9857848101820151848201830152810162000d7b565b8281111562000daa5760008284860101525b50505092915050565b60006020828403121562000dc5578081fd5b815162000dd28162001059565b9392505050565b60006020828403121562000deb578081fd5b5051919050565b60006020828403121562000e04578081fd5b81516001600160401b038082111562000e1b578283fd5b818401915061018080838703121562000e32578384fd5b62000e3d8162001026565b905062000e4b868462000d17565b815260208301518281111562000e5f578485fd5b62000e6d8782860162000d24565b60208301525060408301518281111562000e85578485fd5b62000e938782860162000d24565b60408301525062000ea8866060850162000d17565b606082015262000ebc866080850162000d17565b608082015262000ed08660a0850162000d17565b60a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014062000f128782860162000d17565b90820152610160838101518381111562000f2a578586fd5b62000f388882870162000d24565b918301919091525095945050505050565b60006020828403121562000f5b578081fd5b815160ff8116811462000dd2578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000fb85762000fa585516200104d565b8352938301939183019160010162000f90565b505084810360408601528551808252908201925081860190845b8181101562000ac75762000fe783516200104d565b8552938301939183019160010162000fd2565b60208101600383106200100957fe5b91905290565b90815260200190565b918252602082015260400190565b6040518181016001600160401b03811182821017156200104557600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b038116811462000ae757600080fd5b60805160a05160c05160e0516101005160601c6101205160601c61014051610160516101805160601c6101a0516101c05160601c6101e05160601c6102005160601c610220516102405161026051610280516102a05161478562001206600039806118595250806107f45250806107905280612a8c525080610718528061081c5280610c515280612f07528061309052806131c852806132d3528061345052806135885250806107b252806109bc5280610c175280612ed35280613015528061305c52806131525280613194528061329f52806133da528061341c528061351252806135545250806113f852806126f652806127c25280612ab25280612e885280612fa1528061325552806133665250806109e052806110ee5280611abc5280611b5b52806126ad52806127795280612a515280612e495280612f4b52806130de52806132165280613317528061349e5250806111cc5250806109495250508061181d5250806117f9525080610fd1525080610fad525080610f5d5250806123ea52508061242c52508061240b52506147856000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e3660046140b9565b610608565b604051610350919061444c565b60405180910390f35b610361610668565b6040516103509190614690565b61038161037c366004613e8b565b6106ff565b6040516103509190614429565b610343610716565b61034361073a565b6103a6610740565b60405161035093929190614434565b6103bd610769565b60405161035091906143f1565b6103816103d8366004613ddb565b610877565b6103e56108ed565b60405161035091906146ca565b6103436108f6565b61040d610408366004614176565b610905565b005b610343610947565b610381610425366004613e8b565b61096b565b61040d6109a6565b6103436109ba565b6104426109de565b6040516103509190614346565b61040d610a02565b610361610a56565b610343610ab7565b61047a610475366004613fba565b610aca565b6040516103509291906146a3565b610490610ae8565b6040516103509291906146bc565b610343610b26565b6103436104b4366004613d87565b610cbb565b6104cc6104c7366004613fba565b610cda565b604051610350929190614404565b6103436104e8366004613d87565b610d9c565b61040d610da7565b610343610f42565b61040d610f47565b61034361051336600461405d565b610f59565b610442610fab565b610442610fcf565b610343610536366004613d87565b610ff3565b61036161100e565b61034361055136600461412a565b61106f565b61040d61056436600461418e565b6110a8565b610381610577366004613e8b565b61111a565b61038161058a366004613e8b565b611158565b610442611165565b61038161116f565b61040d611180565b6104426111ca565b61040d6105bd366004613e1b565b6111ee565b6104cc6105d0366004613fba565b61126f565b6103436105e3366004613da3565b611306565b610343611343565b6103436113ec565b6104426113f6565b61034361141a565b6000846080015161063561061a610fcf565b6001600160a01b0316336001600160a01b03161460cd61162c565b61064a610640610947565b82146101f461162c565b61065261163a565b61065e8686868661164d565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b505050505090505b90565b600061070c338484611772565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074d6117da565b1592506107586117f7565b915061076261181b565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107db57fe5b6020026020010181815250506108196107f261183f565b7f000000000000000000000000000000000000000000000000000000000000000090611926565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084557fe5b602002602001018181525050670de0b6b3a76400008160008151811061086757fe5b6020908102919091010152905090565b6000806108848533611306565b90506108a8336001600160a01b03871614806108a05750838210155b61019e61162c565b6108b385858561195e565b336001600160a01b038616148015906108ce57506000198114155b156108e0576108e08533858403611772565b60019150505b9392505050565b60055460ff1690565b60006109006113ec565b905090565b61090d611a3e565b610915611a87565b600080610920610ae8565b915091506109396109318383611a97565b61014f61162c565b61094283611b9e565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070c9185906109a19086611c16565b611772565b6109ae611a3e565b6109b86000611c28565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a0a611a3e565b610a12611cb9565b610a1c6001611ccd565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4c9190614429565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906109009060c0603f611d0f565b60006060610adc888785611d1e611d35565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0582602080611d0f565b029250670de0b6b3a7640000610b1e8260406020611d0f565b029150509091565b600080610b31610947565b90506060610b3d610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b68919061444c565b60006040518083038186803b158015610b8057600080fd5b505afa158015610b94573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbc9190810190613eb6565b50915050610bd181610bcc610769565b611e9c565b600080610bdc610ae8565b91509150610be8613af8565b6040518060600160405280610bfb610ab7565b81526020018481526020018381525090506000610c87610c4e867f000000000000000000000000000000000000000000000000000000000000000081518110610c4057fe5b602002602001015184611f05565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7a57fe5b6020026020010151611f66565b9050610cb0610ca986600081518110610c9c57fe5b6020026020010151611f72565b8290611f86565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce961061a610fcf565b610cf4610640610947565b6000610cff85611fdd565b15610d2757610d0c61200c565b610d1e88610d1861073a565b8761201f565b94509050610d3f565b610d2f61163a565b610d3a8a8987611d1e565b945090505b610d498a82612115565b835167ffffffffffffffff81118015610d6157600080fd5b50604051908082528060200260200182016040528015610d8b578160200160208202803683370190505b509250505097509795505050505050565b600061071082610ff3565b6000610db1610947565b90506060610dbd610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de8919061444c565b60006040518083038186803b158015610e0057600080fd5b505afa158015610e14573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3c9190810190613eb6565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e8057fe5b602002602001018181525050610e94613b19565b6040518060800160405280610ea8856106fc565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed9610fcf565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f0a9493929190614474565b600060405180830381600087803b158015610f2457600080fd5b505af1158015610f38573d6000803e3d6000fd5b5050505050505050565b600090565b610f4f611a3e565b6109b86001611c28565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8e9291906142d0565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108161061a610fcf565b61108c610640610947565b61109461163a565b61109f85858561211f565b95945050505050565b6110b0611a3e565b6110b8611a87565b6000806110c3610ae8565b915091506110d46109318383611a97565b6110e96110e18585611a97565b61015761162c565b6111147f0000000000000000000000000000000000000000000000000000000000000000858561212c565b50505050565b6000806111273385611306565b90508083106111415761113c33856000611772565b61114e565b61114e3385858403611772565b5060019392505050565b600061070c33848461195e565b6000610900612202565b6008546000906109009060ff61227c565b611188611a3e565b61119061200c565b61119a6000611ccd565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4c9190614429565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121d8c610ff3565b8960405160200161123396959493929190614561565b604051602081830303815290604052805190602001209050611264888261125b878787612283565b886101f86122c2565b610f38888888611772565b6060808861127e61061a610fcf565b611289610640610947565b600061129361163a565b61129b61073a565b6112ed576112aa8a8a87612319565b945090506112c36112b9610f42565b82101560cc61162c565b6112d560006112d0610f42565b6123b1565b6112e8896112e1610f42565b83036123b1565b610d49565b6112f88a8987611d1e565b94509050610d4989826123b1565b6000611310610fcf565b6001600160a01b0316826001600160a01b031614156113325750600019610710565b61133c83836123bb565b9050610710565b6000806000611350610fcf565b6001600160a01b031663b05f8e48611366610947565b306040518363ffffffff1660e01b8152600401611384929190614647565b60806040518083038186803b15801561139c57600080fd5b505afa1580156113b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d491906141af565b5050915091506113e5818301611f72565b9250505090565b60006109006123e6565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061090061183f565b600061142f836115d9565b6060835160010167ffffffffffffffff8111801561144c57600080fd5b50604051908082528060200260200182016040528015611476578160200160208202803683370190505b509050308160008151811061148757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f6578481815181106114bf57fe5b60200260200101518282600101815181106114d657fe5b6001600160a01b03909216602092830291909101909101526001016114aa565b506060835160010167ffffffffffffffff8111801561151457600080fd5b5060405190808252806020026020018201604052801561153e578160200160208202803683370190505b50905060008160008151811061155057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115bf5784818151811061158857fe5b602002602001015182826001018151811061159f57fe5b6001600160a01b0390921660209283029190910190910152600101611573565b506115cc87878484612483565b925050505b949350505050565b806115e38161258c565b5050565b60006115f783831115600161162c565b50900390565b600061160a848484612605565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e3576115e38161264b565b6109b86116456117da565b61019261162c565b60006116696003841080156116625750600383105b606461162c565b6060611673610769565b905061167f8582611e9c565b60008061168a610ae8565b91509150611696613af8565b60405180606001604052806116a9610ab7565b81526020810185905260400183905290506000895160018111156116c957fe5b141561172d576116f089606001518589815181106116e357fe5b6020026020010151612675565b60608a015260006117028a8a84612681565b90506117218186898151811061171457fe5b6020026020010151612748565b955050505050506115d1565b61174189606001518588815181106116e357fe5b60608a015260006117538a8a84612754565b905061172181868a8151811061176557fe5b6020026020010151612809565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cd90859061444c565b60405180910390a3505050565b60006117e461181b565b42118061090057505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006118496113f6565b6001600160a01b031663010ad6d17f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401611894919061444c565b60206040518083038186803b1580156118ac57600080fd5b505afa9250505080156118dc575060408051601f3d908101601f191682019092526118d991810190613fa2565b60015b61191f573d80801561190a576040519150601f19603f3d011682016040523d82523d6000602084013e61190f565b606091505b5061191981612815565b506106fc565b90506106fc565b600082820261194a84158061194357508385838161194057fe5b04145b600361162c565b670de0b6b3a7640000815b04949350505050565b6119756001600160a01b038416151561019861162c565b61198c6001600160a01b038316151561019961162c565b611997838383610942565b6001600160a01b0383166000908152602081905260409020546119bd90826101a061289c565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119ec9082611c16565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cd90859061444c565b6000611a6d6000357fffffffff0000000000000000000000000000000000000000000000000000000016610f59565b9050611a84611a7c82336128b2565b61019161162c565b50565b6109b8611a92610fcf565b61299b565b6000806000611aa4610fcf565b6001600160a01b031663b05f8e48611aba610947565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611af8929190614647565b60806040518083038186803b158015611b1057600080fd5b505afa158015611b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4891906141af565b5050915091506000611b84828401611b7f7f0000000000000000000000000000000000000000000000000000000000000000612a4d565b612675565b905085811015801561065e57509390931115949350505050565b611bb164e8d4a5100082101560cb61162c565b611bc767016345785d8a000082111560ca61162c565b600854611bd8908260c0603f6115fd565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611c0b90839061444c565b60405180910390a150565b60008282016108e6848210158361162c565b8015611c4857611c43611c396117f7565b421061019361162c565b611c5d565b611c5d611c5361181b565b42106101a961162c565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611c0b908390614429565b6109b8611cc461116f565b156101b561162c565b600854611cdc908260ff612b27565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611c0b908390614429565b6001901b6000190191901c1690565b60006060611d2d6103e661264b565b935093915050565b333014611e24576000306001600160a01b0316600036604051611d59929190614300565b6000604051808303816000865af19150503d8060008114611d96576040519150601f19603f3d011682016040523d82523d6000602084013e611d9b565b606091505b505090508060008114611daa57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611e06573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611e378686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611eab908290612b36565b60005b8181101561111457611ee6848281518110611ec557fe5b6020026020010151848381518110611ed957fe5b6020026020010151611926565b848281518110611ef257fe5b6020908102919091010152600101611eae565b60008160200151831015611f3e5781516020830151600091611f2a9186900390611926565b9050611f3684826115e7565b915050610710565b81604001518311611f50575081610710565b81516040830151600091611f2a91860390611926565b60006108e68383611c16565b600061071082611f8061073a565b906115e7565b6000611f95821515600461162c565b670de0b6b3a76400008302611fc7841580611fc05750670de0b6b3a7640000858381611fbd57fe5b04145b600561162c565b6001836001830304018115150291505092915050565b6000808251118015610710575060ff80168280602001905181019061200291906141ef565b60ff161492915050565b6109b861201761116f565b6101b661162c565b60006060600061202e84612b43565b90506060865167ffffffffffffffff8111801561204a57600080fd5b50604051908082528060200260200182016040528015612074578160200160208202803683370190505b5090506000612081610f42565b90506000612094898381518110610c9c57fe5b905060006120a28583612b59565b905060005b8a5181101561210457838114156120bf5760006120e5565b6120e5828c83815181106120cf57fe5b602002602001015161192690919063ffffffff16565b8582815181106120f157fe5b60209081029190910101526001016120a7565b509399929850919650505050505050565b6115e38282612b99565b60006108e66103e661264b565b61213b8183111561014c61162c565b6121566b0de0b6b39983494c589c000082111561014d61162c565b61216e670de0b6b3a7640000825b061561016161162c565b612180670de0b6b3a764000083612164565b6121b5670de0b6b3a76400008204604060206121ad670de0b6b3a7640000876008549190046020806115fd565b9291906115fd565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121f590859085906146bc565b60405180910390a2505050565b600061220c610fcf565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561224457600080fd5b505afa158015612258573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610900919061409d565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b60006122cd85612c65565b90506122e36122dd878387612c81565b8361162c565b6122f2428410156101b861162c565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606123346001600160a01b038616301461015661162c565b61234b6001600160a01b038516301461015661162c565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff8160008151811061239a57fe5b602090810291909101015290969095509350505050565b6115e38282612d30565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612453612dc3565b3060405160200161246895949392919061461b565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016124b2919061467c565b602060405180830381600087803b1580156124cc57600080fd5b505af11580156124e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125049190613fa2565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d29061255090849088908890600401614595565b600060405180830381600087803b15801561256a57600080fd5b505af115801561257e573d6000803e3d6000fd5b509298975050505050505050565b60028151101561259b57611a84565b6000816000815181106125aa57fe5b602002602001015190506000600190505b82518110156109425760008382815181106125d257fe5b602002602001015190506125fb816001600160a01b0316846001600160a01b031610606561162c565b91506001016125bb565b6126146101008310606461162c565b61263c60018210158015611662575061263260ff8461010003611620565b821115606461162c565b61094283821c156101b461162c565b611a84817f42414c0000000000000000000000000000000000000000000000000000000000612dc7565b60006108e68383611926565b60208301516000906001600160a01b03163014156126ab576126a4848484612e42565b90506108e6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b031614156126f4576126a4848484612f9a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b0316141561273d576126a48484846130d7565b6108e661013561264b565b60006108e68383612b59565b60408301516000906001600160a01b0316301415612777576126a484848461320f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127c0576126a484848461335f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b0316141561273d576126a4848484613497565b60006108e68383611f86565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417612890578160208401fd5b506115e361016561264b565b60006128ab848411158361162c565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128d1610fab565b6001600160a01b0316141580156128ec57506128ec836135cf565b15612914576128f9610fab565b6001600160a01b0316336001600160a01b0316149050610710565b61291c612202565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161294b93929190614455565b60206040518083038186803b15801561296357600080fd5b505afa158015612977573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133c9190613f82565b604080516000808252602082019092526060916129ce565b6129bb613b43565b8152602001906001900390816129b35790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e8490612a1790849060040161435a565b600060405180830381600087803b158015612a3157600080fd5b505af1158015612a45573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612ab057507f0000000000000000000000000000000000000000000000000000000000000000610cd5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612afc57612af56107f261183f565b9050610cd5565b6001600160a01b038216301415612b1c5750670de0b6b3a7640000610cd5565b610cd561013561264b565b6001811b1992909216911b1790565b6115e3818314606761162c565b6000818060200190518101906108e6919061420b565b6000612b68821515600461162c565b670de0b6b3a76400008302612b90841580611fc05750670de0b6b3a7640000858381611fbd57fe5b82818161195557fe5b612bb06001600160a01b038316151561019b61162c565b612bbc82600083610942565b6001600160a01b038216600090815260208190526040902054612be290826101b261289c565b6001600160a01b038316600090815260208190526040902055612c15612c1082612c0a61073a565b90613633565b613641565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c59919061444c565b60405180910390a35050565b6000612c6f6123e6565b82604051602001610f8e929190614310565b6000612c9382516041146101b961162c565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612ccc90899085908890889061465e565b6020604051602081039080840390855afa158015612cee573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612d245750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612d3c60008383610942565b612d51612c1082612d4b61073a565b90611c16565b6001600160a01b038216600090815260208190526040902054612d749082611c16565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c5990859061444c565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612ec87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162c565b6115d18460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612efc57fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f3057fe5b6020026020010151612f4887600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612f8e57613646612f92565b6136a45b63ffffffff16565b6000612ff67f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec0575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b031630146130515761304c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061303e57fe5b60200260200101518461370d565b6115d1565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061308557fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130b957fe5b60200260200101516130d187600081518110610c9c57fe5b8661373d565b60006131337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec0575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b031630146131895761304c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061317b57fe5b6020026020010151846137a3565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131bd57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106131f157fe5b602002602001015161320987600081518110610c9c57fe5b866137e3565b60006132947f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162c565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132c857fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106132fc57fe5b602002602001015161331487600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461335a5761384a612f92565b6138a1565b60006133bb7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec0575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b031630146134115761304c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061340357fe5b60200260200101518461390b565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061344557fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061347957fe5b602002602001015161349187600081518110610c9c57fe5b86613935565b60006134f37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec0575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b031630146135495761304c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061353b57fe5b602002602001015184613984565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061357d57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106135b157fe5b60200260200101516135c987600081518110610c9c57fe5b866139b9565b60006135fa7f9f11080e00000000000000000000000000000000000000000000000000000000610f59565b821480610710575061362b7f38e9922e00000000000000000000000000000000000000000000000000000000610f59565b909114919050565b60006108e68383600161289c565b600255565b6000806136538684611f05565b905060006136618287611f66565b9050600061366f868a6115e7565b9050600061368a84611f806136848587613a0d565b8a613a27565b905061369688826115e7565b9a9950505050505050505050565b6000806136b18684611f05565b905060006136bf8287611f66565b905060006136d66136d0838b613a0d565b87613a48565b905060006136e484836115e7565b905060006136f28288613a68565b90506136fe8a826115e7565b9b9a5050505050505050505050565b60008061371a8484611f05565b9050600061373161372b8688611c16565b85611f05565b905061065e81836115e7565b6000826137555761374e8683611f05565b905061109f565b60006137618684611f05565b9050600061377261372b888a611c16565b9050600061378082846115e7565b9050600061378e8489611f66565b905061369661379d8884613a0d565b82613a48565b6000806137b08484611f05565b905060006137be82876115e7565b905060006137cc8286613a68565b90506137d886826115e7565b979650505050505050565b6000826137f157508461109f565b60006137fd8684611f05565b9050600061380b8287611f66565b90506000613819878a611c16565b905060006138278483611f66565b9050600061383e6138388984613a0d565b85613a48565b90506136fe81896115e7565b60008261385857508461109f565b60006138648684611f05565b905060006138728287611f66565b90506000613880868a611c16565b9050600061389584611f806136848587613a0d565b905061369681896115e7565b6000826138b25761374e8683613a68565b60006138be8684611f05565b905060006138cc8287611f66565b905060006138e36138dd838b613a0d565b87613a27565b905060006138f18483611c16565b905060006138ff8288613a68565b90506136fe818b6115e7565b6000806139188484611f05565b9050600061392961372b86886115e7565b905061065e82826115e7565b6000806139428684611f05565b9050600061395361372b888a6115e7565b9050600061396183836115e7565b9050600061396f8489611f66565b905061369661397e8884613a0d565b82613a27565b6000806139918484611f05565b9050600061399f8287611c16565b905060006139ad8286613a68565b90506137d881876115e7565b6000806139c68684611f05565b905060006139d48287611f66565b905060006139e2878a6115e7565b905060006139f08483611f66565b90506000613a016138388984613a0d565b90506136fe88826115e7565b60008282026108e684158061194357508385838161194057fe5b6000613a36821515600461162c565b50811515600019909201046001010290565b6000613a57821515600461162c565b818381613a6057fe5b049392505050565b60008160200151831015613ab157815161133c90613a8f90670de0b6b3a764000090611c16565b60208401518451613aab91613aa49190611926565b8690611c16565b90612b59565b81604001518311613ac3575081610710565b815161133c90613adc90670de0b6b3a7640000906115e7565b60408401518451613aab91613af19190611926565b86906115e7565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b80356107108161472b565b600082601f830112613b8e578081fd5b8135613ba1613b9c826146ff565b6146d8565b818152915060208083019084810181840286018201871015613bc257600080fd5b60005b84811015613be157813584529282019290820190600101613bc5565b505050505092915050565b600082601f830112613bfc578081fd5b8151613c0a613b9c826146ff565b818152915060208083019084810181840286018201871015613c2b57600080fd5b60005b84811015613be157815184529282019290820190600101613c2e565b600082601f830112613c5a578081fd5b813567ffffffffffffffff811115613c70578182fd5b613c836020601f19601f840116016146d8565b9150808252836020828501011115613c9a57600080fd5b8060208401602084013760009082016020015292915050565b80356002811061071057600080fd5b6000610120808385031215613cd5578182fd5b613cde816146d8565b915050613ceb8383613cb3565b8152613cfa8360208401613b73565b6020820152613d0c8360408401613b73565b6040820152606082013560608201526080820135608082015260a082013560a0820152613d3c8360c08401613b73565b60c0820152613d4e8360e08401613b73565b60e08201526101008083013567ffffffffffffffff811115613d6f57600080fd5b613d7b85828601613c4a565b82840152505092915050565b600060208284031215613d98578081fd5b81356108e68161472b565b60008060408385031215613db5578081fd5b8235613dc08161472b565b91506020830135613dd08161472b565b809150509250929050565b600080600060608486031215613def578081fd5b8335613dfa8161472b565b92506020840135613e0a8161472b565b929592945050506040919091013590565b600080600080600080600060e0888a031215613e35578283fd5b8735613e408161472b565b96506020880135613e508161472b565b955060408801359450606088013593506080880135613e6e81614740565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613e9d578182fd5b8235613ea88161472b565b946020939093013593505050565b600080600060608486031215613eca578081fd5b835167ffffffffffffffff80821115613ee1578283fd5b818601915086601f830112613ef4578283fd5b8151613f02613b9c826146ff565b80828252602080830192508086018b828387028901011115613f22578788fd5b8796505b84871015613f4d578051613f398161472b565b845260019690960195928101928101613f26565b508901519097509350505080821115613f64578283fd5b50613f7186828701613bec565b925050604084015190509250925092565b600060208284031215613f93578081fd5b815180151581146108e6578182fd5b600060208284031215613fb3578081fd5b5051919050565b600080600080600080600060e0888a031215613fd4578081fd5b873596506020880135613fe68161472b565b95506040880135613ff68161472b565b9450606088013567ffffffffffffffff80821115614012578283fd5b61401e8b838c01613b7e565b955060808a0135945060a08a0135935060c08a0135915080821115614041578283fd5b5061404e8a828b01613c4a565b91505092959891949750929550565b60006020828403121561406e578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e6578182fd5b6000602082840312156140ae578081fd5b81516108e68161472b565b600080600080608085870312156140ce578182fd5b843567ffffffffffffffff808211156140e5578384fd5b6140f188838901613cc2565b95506020870135915080821115614106578384fd5b5061411387828801613b7e565b949794965050505060408301359260600135919050565b60008060006060848603121561413e578081fd5b833567ffffffffffffffff811115614154578182fd5b61416086828701613cc2565b9660208601359650604090950135949350505050565b600060208284031215614187578081fd5b5035919050565b600080604083850312156141a0578182fd5b50508035926020909101359150565b600080600080608085870312156141c4578182fd5b84519350602085015192506040850151915060608501516141e48161472b565b939692955090935050565b600060208284031215614200578081fd5b81516108e681614740565b6000806040838503121561421d578182fd5b825161422881614740565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b8381101561427457815187529582019590820190600101614258565b509495945050505050565b15159052565b60008151808452815b818110156142aa5760208185018101518683018201520161428e565b818111156142bb5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b828110156143e457815180516004811061438d57fe5b85528087015161439f88870182614238565b5085810151868601526060808201516143ba82880182614238565b5050608090810151906143cf86820183614238565b505060a0939093019290850190600101614377565b5091979650505050505050565b6000602082526108e66020830184614245565b6000604082526144176040830185614245565b828103602084015261109f8185614245565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156144e5576144cf845161471f565b82529284019260019290920191908401906144bd565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a08701526145238185614245565b935050506040850151818584030160c08601526145408382614285565b92505050606084015161455660e085018261427f565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b818110156145dd576145cb855161471f565b835293830193918301916001016145b9565b505084810360408601528551808252908201925081860190845b8181101561257e57614609835161471f565b855293830193918301916001016145f7565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016003831061468a57fe5b91905290565b6000602082526108e66020830184614285565b6000838252604060208301526115d16040830184614245565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156146f757600080fd5b604052919050565b600067ffffffffffffffff821115614715578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114611a8457600080fd5b60ff81168114611a8457600080fdfea2646970667358221220b1bdac894bd3edacff647344ce0bdb1303852afae82897f0620afc1cf39183a364736f6c63430007010033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b50600436106200010b5760003560e01c80635ed3128211620000a5578063851c1bb3116200006f578063851c1bb314620001e35780638d928af81462000209578063aaabadc51462000213578063df8af989146200021d576200010b565b80635ed31282146200019f5780636634b75314620001a95780636c57f5a914620001cf578063739238d614620001d9576200010b565b80632f2770db11620000e75780632f2770db14620001665780633f819b6f14620001725780635208fc2b146200017c57806354fd4d501462000195576200010b565b8062c194db1462000110578063174481fa14620001325780632da47c40146200014c575b600080fd5b6200011a62000234565b6040516200012991906200159a565b60405180910390f35b6200013c62000255565b6040516200012992919062001533565b620001566200029b565b6040516200012992919062001820565b6200017062000324565b005b6200011a6200038e565b6200018662000446565b60405162000129919062001512565b6200011a6200046a565b62000186620004ec565b620001c0620001ba3660046200129c565b62000508565b6040516200012991906200155a565b620001c062000533565b620001866200053c565b620001fa620001f4366004620012fc565b62000560565b60405162000129919062001565565b62000186620005b4565b62000186620005d8565b620001866200022e3660046200133e565b62000665565b6060620002506040518060200160405280600081525062000bb7565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200031657807f00000000000000000000000000000000000000000000000000000000000000000392507f000000000000000000000000000000000000000000000000000000000000000091506200031f565b60009250600091505b509091565b6200032e62000c92565b6200033862000ce1565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156200043c5780601f1062000410576101008083540402835291602001916200043c565b820191906000526020600020905b8154815290600101906020018083116200041e57829003601f168201915b5050505050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156200043c5780601f1062000410576101008083540402835291602001916200043c565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f00000000000000000000000000000000000000000000000000000000000000008260405160200162000597929190620014af565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000620005e4620005b4565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200062a57600080fd5b505afa1580156200063f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002509190620012bb565b60006200067162000cfa565b600480546001810190915560405160609062000690602082016200113d565b601f1982820381018352601f90910116604052620006ad620005b4565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040516020016200070393929190620015af565b60408051601f1981840301815290829052620007239291602001620014df565b604051602081830303815290604052905060006200074983838051906020012062000d15565b9050600080620007586200029b565b91509150620007666200114b565b62000770620005b4565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508e81602001819052508d81604001819052508c816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508a8160c0018181525050898160e0018181525050828161010001818152505081816101200181815250508881610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050620008ce6200038e565b6101608201526040516000906200090490620008ef90849060200162001718565b60405160208183030381529060405262000d2b565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200094f57600080fd5b505af115801562000964573d6000803e3d6000fd5b505050506000620009786000898962000d80565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614620009eb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009e290620016aa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16635208fc2b6040518163ffffffff1660e01b815260040160206040518083038186803b15801562000a3257600080fd5b505afa15801562000a47573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a6d9190620012bb565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161462000af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009e29062001616565b6040518a9073ffffffffffffffffffffffffffffffffffffffff8416907fde3939ceca101461fd7e389705020a1f8b1518edb75d05284b21aa270354c3dc90600090a350965050505050505062000b4a62000e5e565b98975050505050505050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000bb173ffffffffffffffffffffffffffffffffffffffff831615156101ac62000e65565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000c8481838662000e7a565b505050505050505050919050565b600062000cc36000357fffffffff000000000000000000000000000000000000000000000000000000001662000560565b905062000cde62000cd5823362000ed8565b61019162000e65565b50565b62000cf862000cef62000533565b1560d362000e65565b565b62000d0e6002600354141561019062000e65565b6002600355565b600062000d2483833062000f76565b9392505050565b60008062000d398362000fb7565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790559392505050565b6000808447101562000dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009e290620015df565b825162000dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009e290620016e1565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009e29062001673565b949350505050565b6001600355565b8162000e765762000e768162001052565b5050565b5b6020811062000e9c578151835260209283019290910190601f190162000e7b565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000ee4620005d8565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000f22939291906200156e565b60206040518083038186803b15801562000f3b57600080fd5b505afa15801562000f50573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d249190620012da565b60008060ff60f81b83868660405160200162000f9694939291906200144b565b60408051808303601f19018152919052805160209091012095945050505050565b600062000fc362000ce1565b600062000fd0836200107e565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b62000cde817f42414c0000000000000000000000000000000000000000000000000000000000620010c2565b600060606200108d8362000bb7565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811662000d24573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611f18806200188583390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f8301126200122b578081fd5b813567ffffffffffffffff8082111562001243578283fd5b6040516020601f19601f850116820101818110838211171562001264578485fd5b6040528281529250828483016020018610156200128057600080fd5b8260208601602083013760006020848301015250505092915050565b600060208284031215620012ae578081fd5b813562000d248162001861565b600060208284031215620012cd578081fd5b815162000d248162001861565b600060208284031215620012ec578081fd5b8151801515811462000d24578182fd5b6000602082840312156200130e578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811462000d24578182fd5b600080600080600080600080610100898b0312156200135b578384fd5b883567ffffffffffffffff8082111562001373578586fd5b620013818c838d016200121a565b995060208b013591508082111562001397578586fd5b50620013a68b828c016200121a565b9750506040890135620013b98162001861565b95506060890135620013cb8162001861565b94506080890135935060a0890135925060c0890135620013eb8162001861565b8092505060e089013590509295985092959890939650565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620014378160208601602086016200182e565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60008351620014f38184602088016200182e565b835190830190620015098183602088016200182e565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000d2460208301846200141d565b73ffffffffffffffffffffffffffffffffffffffff93841681529183166020830152909116604082015260600190565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526025908201527f526562616c616e636572206e6f74206177617265206f662065756c657250726f60408201527f746f636f6c000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b6000602082526200172e60208301845162001403565b60208301516101808060408501526200174c6101a08501836200141d565b91506040850151601f19808685030160608701526200176c84836200141d565b93506060870151915062001784608087018362001403565b608087015191506200179a60a087018362001403565b60a08701519150620017b060c087018362001403565b60c087015160e0878101919091528701516101008088019190915287015161012080880191909152870151610140808801919091528701519150610160620017fb8188018462001403565b8701518685039091018387015290506200181683826200141d565b9695505050505050565b918252602082015260400190565b60005b838110156200184b57818101518382015260200162001831565b838111156200185b576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000cde57600080fdfe6101806040523480156200001257600080fd5b5060405162001f1838038062001f18833981016040819052620000359162000470565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000386565b8383826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620001259190810190620003ac565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000457565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000457565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000386565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000386565b6001600160601b0319606091821b811660e05292811b83166101205290811b8216610140529290921b909116610160525062000503915050565b60006020828403121562000398578081fd5b8151620003a581620004ea565b9392505050565b60006020808385031215620003bf578182fd5b82516001600160401b0380821115620003d6578384fd5b818501915085601f830112620003ea578384fd5b815181811115620003f9578485fd5b83810291506200040b848301620004c3565b8181528481019084860184860187018a101562000426578788fd5b8795505b838610156200044a5780518352600195909501949186019186016200042a565b5098975050505050505050565b60006020828403121562000469578081fd5b5051919050565b60008060006060848603121562000485578182fd5b83516200049281620004ea565b6020850151909350620004a581620004ea565b6040850151909250620004b881620004ea565b809150509250925092565b6040518181016001600160401b0381118282101715620004e257600080fd5b604052919050565b6001600160a01b03811681146200050057600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c6101605160601c611920620005f86000398060e352806111d5525080610540528061085852508061016a5280610c4b528061101052806110725250806103f65250806104a352806105d0528061077f52806109235280610cf95280610dbe528061110b528061123752508061012152806101c7528061046752806106035280610668528061070952806107bb52806108e852806111b35250806101a6528061043952806107515280610ab45280610b935280610e985280610f7752508060ac528061034052506119206000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063026b1d5f1461005157806321c281911461006f5780635208fc2b1461008f578063df633d8d14610097575b600080fd5b6100596100aa565b6040516100669190611648565b60405180910390f35b61008261007d366004611506565b6100ce565b6040516100669190611889565b6100596100e1565b6100826100a5366004611522565b610105565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100d982610159565b90505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061014973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610290565b61015283610159565b9392505050565b600080610164610339565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401610203929190611794565b60806040518083038186803b15801561021b57600080fd5b505afa15801561022f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025391906115a8565b5050509050818110156102755761026c81830385610422565b925050506100dc565b818111156102895761026c8282038561073a565b5050919050565b610333846323b872dd60e01b8585856040516024016102b193929190611690565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610948565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b1580156103a357600080fd5b505afa1580156103b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103db9190611585565b9150915060006002828401816103ed57fe5b04905061041a817f00000000000000000000000000000000000000000000000000000000000000006109f5565b935050505090565b600061042c611453565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506105006114b6565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061057790869086906004016117c6565b602060405180830381600087803b15801561059157600080fd5b505af11580156105a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c9919061156d565b90506105f57f000000000000000000000000000000000000000000000000000000000000000082610a48565b6105fe81610cb9565b6106287f000000000000000000000000000000000000000000000000000000000000000087610e2c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a082319061069d903090600401611648565b60206040518083038186803b1580156106b557600080fd5b505afa1580156106c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ed919061156d565b905061073073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001687836110a7565b9695505050505050565b6000610744611453565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506108186114b6565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061088f90869086906004016117c6565b602060405180830381600087803b1580156108a957600080fd5b505af11580156108bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e1919061156d565b905061090d7f000000000000000000000000000000000000000000000000000000000000000087610a48565b61091e610919826110cb565b611199565b6106287f000000000000000000000000000000000000000000000000000000000000000082610e2c565b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051610971919061162c565b6000604051808303816000865af19150503d80600081146109ae576040519150601f19603f3d011682016040523d82523d6000602084013e6109b3565b606091505b509150915060008214156109cb573d6000803e3d6000fd5b6103338151600014806109ed5750818060200190518101906109ed919061154d565b6101a26112a4565b6000610a0482151560046112a4565b670de0b6b3a76400008302610a36841580610a2f5750670de0b6b3a7640000858381610a2c57fe5b04145b60056112a4565b828181610a3f57fe5b04949350505050565b6040805160028082526060828101909352816020015b610a666114dd565b815260200190600190039081610a5e579050509050600081600081518110610a8a57fe5b6020026020010151600001906002811115610aa157fe5b90816002811115610aae57fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610ae057fe5b602002602001015160200181815250508181600081518110610afe57fe5b602002602001015160600181815250508281600081518110610b1c57fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b6957fe5b6020026020010151600001906002811115610b8057fe5b90816002811115610b8d57fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610bbf57fe5b60200260200101516020018181525050600081600181518110610bde57fe5b602002602001015160600181815250508281600181518110610bfc57fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c82908490600401611710565b600060405180830381600087803b158015610c9c57600080fd5b505af1158015610cb0573d6000803e3d6000fd5b50505050505050565b6040517f010ad6d100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063010ad6d190610d2e908590600401611889565b60206040518083038186803b158015610d4657600080fd5b505afa158015610d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7e919061156d565b6040517f441a3e7000000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063441a3e7090610df69060009085906004016117b8565b600060405180830381600087803b158015610e1057600080fd5b505af1158015610e24573d6000803e3d6000fd5b505050505050565b6040805160028082526060828101909352816020015b610e4a6114dd565b815260200190600190039081610e42579050509050600281600081518110610e6e57fe5b6020026020010151600001906002811115610e8557fe5b90816002811115610e9257fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610ec457fe5b602002602001015160200181815250508181600081518110610ee257fe5b602002602001015160600181815250508281600081518110610f0057fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610f4d57fe5b6020026020010151600001906002811115610f6457fe5b90816002811115610f7157fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610fa357fe5b602002602001015160200181815250508181600181518110610fc157fe5b602002602001015160600181815250508281600181518110610fdf57fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff9182166040909101526110359084167f0000000000000000000000000000000000000000000000000000000000000000846112b6565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c82908490600401611710565b6110c68363a9059cbb60e01b84846040516024016102b19291906116ea565b505050565b6040517f010ad6d100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063010ad6d190611140908590600401611889565b60206040518083038186803b15801561115857600080fd5b505afa15801561116c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611190919061156d565b60010192915050565b6111fa73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f0000000000000000000000000000000000000000000000000000000000000000836112b6565b6040517fe2bbb15800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e2bbb1589061126f9060009085906004016117b8565b600060405180830381600087803b15801561128957600080fd5b505af115801561129d573d6000803e3d6000fd5b5050505050565b816112b2576112b2816113ab565b5050565b801580159061136757506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e906113149030908690600401611669565b60206040518083038186803b15801561132c57600080fd5b505afa158015611340573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611364919061156d565b15155b1561138c5761138c8363095ea7b360e01b8460006040516024016102b19291906116c1565b6110c68363095ea7b360e01b84846040516024016102b19291906116ea565b6113d5817f42414c00000000000000000000000000000000000000000000000000000000006113d8565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b600060208284031215611517578081fd5b8135610152816118c8565b60008060408385031215611534578081fd5b823561153f816118c8565b946020939093013593505050565b60006020828403121561155e578081fd5b81518015158114610152578182fd5b60006020828403121561157e578081fd5b5051919050565b60008060408385031215611597578182fd5b505080516020909101519092909150565b600080600080608085870312156115bd578182fd5b84519350602085015192506040850151915060608501516115dd816118c8565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161163e818460208701611892565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561178757815180516003811061174357fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff1686860152606090810151908501526080909301929085019060010161172d565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b918252602082015260400190565b600060a08252835160a083015260208401516117e1816118be565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c061014084015280518061016085015261018061184d8282870160208601611892565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061015260208301846115e8565b90815260200190565b60005b838110156118ad578181015183820152602001611895565b838111156103335750506000910152565b600281106113d557fe5b73ffffffffffffffffffffffffffffffffffffffff811681146113d557600080fdfea26469706673582212201e159ab0035a167cadb43e6e3d42a37057cf3eaa63771a32ec057c13a75b2f8564736f6c63430007010033a264697066735822122018472618193b41b5aaed0a3de515ac4052e765e3c00aab4be2f06bcd872dcf1464736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/index.ts b/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/index.ts new file mode 100644 index 0000000..46403b8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/index.ts @@ -0,0 +1,107 @@ +import { bn } from '@helpers/numbers'; +import { Task, TaskMode, TaskRunOptions } from '@src'; +import { EulerLinearPoolDeployment } from './input'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import * as expectEvent from '@helpers/expectEvent'; +import { ethers } from 'hardhat'; +import { getContractDeploymentTransactionHash, saveContractDeploymentTransactionHash } from '@src'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as EulerLinearPoolDeployment; + const args = [ + input.Vault, + input.ProtocolFeePercentagesProvider, + input.BalancerQueries, + input.FactoryVersion, + input.PoolVersion, + input.InitialPauseWindowDuration, + input.BufferPeriodDuration, + input.EulerProtocol, + ]; + + const factory = await task.deployAndVerify('EulerLinearPoolFactory', args, from, force); + + if (task.mode === TaskMode.LIVE) { + // We also create a Pool using the factory and verify it, to let us compute their action IDs and so that future + // Pools are automatically verified. We however don't run any of this code in CHECK mode, since we don't care about + // the contracts deployed here. The action IDs will be checked to be correct via a different mechanism. + + // EulerLinearPools require an Euler Token + const mockEulerTokenArgs = ['DO NOT USE - Mock Euler Token', 'TEST', 18, input.WETH]; + const mockEulerToken = await task.deployAndVerify('MockEulerToken', mockEulerTokenArgs, from, force); + + // The assetManager, pauseWindowDuration and bufferPeriodDuration will be filled in later, but we need to declare + // them here to appease the type system. Those are constructor arguments, but automatically provided by the factory. + const mockPoolArgs = { + vault: input.Vault, + name: 'DO NOT USE - Mock Linear Pool', + symbol: 'TEST', + mainToken: input.WETH, + wrappedToken: mockEulerToken.address, + assetManager: undefined, + upperTarget: 0, + pauseWindowDuration: undefined, + bufferPeriodDuration: undefined, + swapFeePercentage: bn(1e12), + owner: ZERO_ADDRESS, + version: input.PoolVersion, + }; + + // This mimics the logic inside task.deploy + if (force || !task.output({ ensure: false })['MockEulerLinearPool']) { + const PROTOCOL_ID = 0; + + const poolCreationReceipt = await ( + await factory.create( + mockPoolArgs.name, + mockPoolArgs.symbol, + mockPoolArgs.mainToken, + mockPoolArgs.wrappedToken, + mockPoolArgs.upperTarget, + mockPoolArgs.swapFeePercentage, + mockPoolArgs.owner, + PROTOCOL_ID + ) + ).wait(); + const event = expectEvent.inReceipt(poolCreationReceipt, 'PoolCreated'); + const mockPoolAddress = event.args.pool; + + await saveContractDeploymentTransactionHash(mockPoolAddress, poolCreationReceipt.transactionHash, task.network); + await task.save({ MockEulerLinearPool: mockPoolAddress }); + } + + const mockPool = await task.instanceAt('EulerLinearPool', task.output()['MockEulerLinearPool']); + + // In order to verify the Pool's code, we need to complete its constructor arguments by computing the factory + // provided arguments (asset manager and pause durations). + + // The asset manager is found by querying the Vault + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, task.network); + const vault = await vaultTask.deployedInstance('Vault'); + + const { assetManager: assetManagerAddress } = await vault.getPoolTokenInfo(await mockPool.getPoolId(), input.WETH); + mockPoolArgs.assetManager = assetManagerAddress; + + // The durations require knowing when the Pool was created, so we look for the timestamp of its creation block. + const txHash = await getContractDeploymentTransactionHash(mockPool.address, task.network); + const tx = await ethers.provider.getTransactionReceipt(txHash); + const poolCreationBlock = await ethers.provider.getBlock(tx.blockNumber); + + // With those and the period end times, we can compute the durations. + const { pauseWindowEndTime, bufferPeriodEndTime } = await mockPool.getPausedState(); + mockPoolArgs.pauseWindowDuration = pauseWindowEndTime.sub(poolCreationBlock.timestamp); + mockPoolArgs.bufferPeriodDuration = bufferPeriodEndTime + .sub(poolCreationBlock.timestamp) + .sub(mockPoolArgs.pauseWindowDuration); + + // We are now ready to verify the Pool + await task.verify('EulerLinearPool', mockPool.address, [mockPoolArgs]); + + // We can also verify the Asset Manager + await task.verify('EulerLinearPoolRebalancer', assetManagerAddress, [ + input.Vault, + input.BalancerQueries, + input.EulerProtocol, + ]); + } +}; diff --git a/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/input.ts b/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/input.ts new file mode 100644 index 0000000..229439b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/input.ts @@ -0,0 +1,33 @@ +import { Task, TaskMode } from '@src'; +import { MONTH } from '@helpers/time'; + +export type EulerLinearPoolDeployment = { + Vault: string; + BalancerQueries: string; + ProtocolFeePercentagesProvider: string; + WETH: string; + FactoryVersion: string; + PoolVersion: string; + InitialPauseWindowDuration: number; + BufferPeriodDuration: number; + EulerProtocol: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerQueries = new Task('20220721-balancer-queries', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); +const WETH = new Task('00000000-tokens', TaskMode.READ_ONLY); + +const BaseVersion = { version: 1, deployment: '20230208-euler-linear-pool' }; + +export default { + Vault, + BalancerQueries, + ProtocolFeePercentagesProvider, + WETH, + FactoryVersion: JSON.stringify({ name: 'EulerLinearPoolFactory', ...BaseVersion }), + PoolVersion: JSON.stringify({ name: 'EulerLinearPool', ...BaseVersion }), + InitialPauseWindowDuration: MONTH * 3, + BufferPeriodDuration: MONTH, + EulerProtocol: '0x27182842E098f60e3D576794A5bFFb0777E025d3', +}; diff --git a/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/output/goerli.json b/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/output/goerli.json new file mode 100644 index 0000000..3ab0157 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/output/goerli.json @@ -0,0 +1,5 @@ +{ + "EulerLinearPoolFactory": "0x813EE7a840CE909E7Fea2117A44a90b8063bd4fd", + "MockEulerToken": "0xB99eDc4b289B0F2284fCF3f66884191BdCe29624", + "MockEulerLinearPool": "0x43Fa2c00419F60e18966Aa043DEBd4701CB91B6d" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/output/mainnet.json b/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/output/mainnet.json new file mode 100644 index 0000000..0a60a14 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/output/mainnet.json @@ -0,0 +1,5 @@ +{ + "EulerLinearPoolFactory": "0x5F43FBa61f63Fa6bFF101a0A0458cEA917f6B347", + "MockEulerToken": "0xC101dcA301a4011C1F925e9622e749e550a1B667", + "MockEulerLinearPool": "0xDEC02e6642e2c999aF429F5cE944653CAd15e093" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/readme.md b/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/readme.md new file mode 100644 index 0000000..5edae95 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/readme.md @@ -0,0 +1,9 @@ +# 2023-02-08 - Euler Linear Pool + +First deployment of the `EulerLinearPoolFactory`, for Linear Pools with an Euler yield-bearing token. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`EulerLinearPoolFactory` artifact](./artifact/EulerLinearPoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/test/task.fork.ts b/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/test/task.fork.ts new file mode 100644 index 0000000..b7a58dc --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230208-euler-linear-pool/test/task.fork.ts @@ -0,0 +1,409 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; +import { setCode } from '@nomicfoundation/hardhat-network-helpers'; +import * as expectEvent from '@helpers/expectEvent'; +import { bn, fp, FP_ONE } from '@helpers/numbers'; +import { MAX_UINT256 } from '@helpers/constants'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; + +import { impersonate, getForkedNetwork, Task, TaskMode, getSigners } from '@src'; +import { describeForkTest } from '@src'; +import { deploy, instanceAt, getArtifact } from '@src'; + +export enum SwapKind { + GivenIn = 0, + GivenOut, +} + +describeForkTest('EulerLinearPoolFactory', 'mainnet', 16550500, function () { + let owner: SignerWithAddress, holder: SignerWithAddress, other: SignerWithAddress; + let vault: Contract, mainToken: Contract; + let factory: Contract; + let rebalancer: Contract; + + let task: Task; + + const USDC = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'; + const eUSDC = '0xEb91861f8A4e1C12333F42DCE8fB0Ecdc28dA716'; + const EULER_PROTOCOL = '0x27182842E098f60e3D576794A5bFFb0777E025d3'; + const USDC_SCALING = bn(1e12); // USDC has 6 decimals, so its scaling factor is 1e12 + const USDC_HOLDER = '0x55FE002aefF02F77364de339a1292923A15844B8'; + + const SWAP_FEE_PERCENTAGE = fp(0.01); // 1% + + // The targets are set using 18 decimals, even if the token has fewer (as is the case for USDC); + const INITIAL_UPPER_TARGET = fp(1e7); + + // The initial midpoint (upper target / 2) must be between the final lower and upper targets + const FINAL_LOWER_TARGET = fp(0.2e7); + const FINAL_UPPER_TARGET = fp(5e7); + + const PROTOCOL_ID = 0; + + enum AttackType { + SET_TARGETS, + SET_SWAP_FEE, + } + + let pool: Contract; + let poolId: string; + + before('run task', async () => { + task = new Task('20230208-euler-linear-pool', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('EulerLinearPoolFactory'); + }); + + before('load signers', async () => { + [, owner, other] = await getSigners(); + + holder = await impersonate(USDC_HOLDER, fp(100)); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + + mainToken = await task.instanceAt('IERC20', USDC); + await mainToken.connect(holder).approve(vault.address, MAX_UINT256); + }); + + enum LinearPoolState { + BALANCED, + MAIN_EXCESS, + MAIN_LACK, + } + + function itRebalancesThePool(expectedState: LinearPoolState) { + it('rebalance the pool', async () => { + const { lowerTarget, upperTarget } = await pool.getTargets(); + + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + + let fees; + if (scaledCash.gt(upperTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_EXCESS); + + const excess = scaledCash.sub(upperTarget); + fees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else if (scaledCash.lt(lowerTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_LACK); + + const lack = lowerTarget.sub(scaledCash); + fees = lack.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else { + expect(expectedState).to.equal(LinearPoolState.BALANCED); + + fees = 0; + } + + const initialRecipientMainBalance = await mainToken.balanceOf(other.address); + if (expectedState != LinearPoolState.BALANCED) { + await rebalancer.connect(holder).rebalance(other.address); + } else { + await rebalancer.connect(holder).rebalanceWithExtraMain(other.address, 5); + } + const finalRecipientMainBalance = await mainToken.balanceOf(other.address); + + if (fees > 0) { + // The recipient of the rebalance call should get the fees that were collected (though there's some rounding + // error in the main-wrapped conversion). + expect(finalRecipientMainBalance.sub(initialRecipientMainBalance)).to.be.almostEqual( + fees.div(USDC_SCALING), + 0.00000001 + ); + } else { + // The recipient of the rebalance call will get any extra main tokens that were not utilized. + expect(finalRecipientMainBalance).to.be.almostEqual(initialRecipientMainBalance, 0.00000001); + } + + const mainInfo = await vault.getPoolTokenInfo(poolId, USDC); + + const expectedMainBalance = lowerTarget.add(upperTarget).div(2); + expect(mainInfo.cash.mul(USDC_SCALING)).to.equal(expectedMainBalance); + expect(mainInfo.managed).to.equal(0); + }); + } + + describe('create and check getters', () => { + it('deploy a linear pool', async () => { + const tx = await factory.create( + '', + '', + USDC, + eUSDC, + INITIAL_UPPER_TARGET, + SWAP_FEE_PERCENTAGE, + owner.address, + PROTOCOL_ID + ); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await task.instanceAt('EulerLinearPool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + const { assetManager } = await vault.getPoolTokenInfo(poolId, USDC); // We could query for either frxEth or eulerToken + rebalancer = await task.instanceAt('EulerLinearPoolRebalancer', assetManager); + + await mainToken.connect(holder).approve(rebalancer.address, MAX_UINT256); // To send extra main on rebalance + }); + + it('check factory version', async () => { + const expectedFactoryVersion = { + name: 'EulerLinearPoolFactory', + version: 1, + deployment: '20230208-euler-linear-pool', + }; + + expect(await factory.version()).to.equal(JSON.stringify(expectedFactoryVersion)); + }); + + it('check factory aware of EULER_PROTOCOL', async () => { + expect(await factory.eulerProtocol()).to.equal(EULER_PROTOCOL); + }); + + it('check Rebalancer aware of EULER_PROTOCOL', async () => { + expect(await rebalancer.eulerProtocol()).to.equal(EULER_PROTOCOL); + }); + + it('check pool version', async () => { + const expectedPoolVersion = { + name: 'EulerLinearPool', + version: 1, + deployment: '20230208-euler-linear-pool', + }; + + expect(await pool.version()).to.equal(JSON.stringify(expectedPoolVersion)); + }); + }); + + describe('join, and rebalance', () => { + it('join the pool', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const joinAmount = INITIAL_UPPER_TARGET.mul(2).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: USDC, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert join amount - some fees will be collected as we're going over the upper target. + const excess = joinAmount.mul(USDC_SCALING).sub(INITIAL_UPPER_TARGET); + const joinCollectedFees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + + const expectedBPT = joinAmount.mul(USDC_SCALING).sub(joinCollectedFees); + expect(await pool.balanceOf(holder.address)).to.equal(expectedBPT); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + + it('set final targets', async () => { + await pool.connect(owner).setTargets(FINAL_LOWER_TARGET, FINAL_UPPER_TARGET); + }); + }); + + describe('generate excess of main token and rebalance', () => { + it('deposit main tokens', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const { upperTarget } = await pool.getTargets(); + const joinAmount = upperTarget.mul(5).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: USDC, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + }); + + describe('generate lack of main token and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to withdraw enough man token to bring the Pool below its lower target, which will let us later + // rebalance. + + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_LACK); + }); + + describe('join below upper target and rebalance', () => { + it('deposit main tokens', async () => { + // We're going to join with few tokens, causing the Pool to not reach its upper target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const joinAmount = midpoint.div(100).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: USDC, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('exit above lower target and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to exit with few tokens, causing for the Pool to not reach its lower target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const exitAmount = midpoint.div(100).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalance repeatedly', () => { + itRebalancesThePool(LinearPoolState.BALANCED); + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalancer query protection', async () => { + it('reverts with a malicious lending pool', async () => { + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + + await setCode(eUSDC, getArtifact('MockEulerToken').deployedBytecode); + const mockLendingPool = await instanceAt('MockEulerToken', eUSDC); + + await mockLendingPool.setRevertType(2); // Type 2 is malicious swap query revert + await expect(rebalancer.rebalance(other.address)).to.be.revertedWith('BAL#357'); // MALICIOUS_QUERY_REVERT + }); + }); + + describe('read-only reentrancy protection', () => { + let attacker: Contract; + + before('deploy attacker', async () => { + attacker = await deploy('ReadOnlyReentrancyAttackerEP', [vault.address]); + }); + + async function performAttack(attackType: AttackType, ethAmount: BigNumber, expectRevert: boolean) { + // To trigger the callback and revert, send more than we need for the deposit + // If we send just enough, there will be no "extra" ETH, and it won't trigger the callback and attack + const amountToSend = expectRevert ? ethAmount.add(1) : ethAmount; + + const attack = attacker.startAttack(pool.address, attackType, ethAmount, { value: amountToSend }); + if (expectRevert) { + await expect(attack).to.be.revertedWith('BAL#420'); + } else { + await expect(attack).to.not.be.reverted; + } + } + + function itPerformsAttack(expectRevert: boolean) { + const action = expectRevert ? 'triggers' : 'does not trigger'; + + context('set targets', () => { + it(`${action} the set targets attack`, async () => { + await performAttack(AttackType.SET_TARGETS, fp(1), expectRevert); + }); + }); + + context('set swap fee', () => { + it(`${action} the set swap fee attack`, async () => { + await performAttack(AttackType.SET_SWAP_FEE, fp(1), expectRevert); + }); + }); + } + + context('when exactly enough ETH is sent', () => { + itPerformsAttack(false); + }); + + context('when too much ETH is sent', () => { + itPerformsAttack(true); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/artifact/SingleRecipientGauge.json b/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/artifact/SingleRecipientGauge.json new file mode 100644 index 0000000..dfc8e6c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/artifact/SingleRecipientGauge.json @@ -0,0 +1,257 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SingleRecipientGauge", + "sourceName": "contracts/gauges/ethereum/SingleRecipientGauge.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IBalancerMinter", + "name": "minter", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "periodTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "periodEmissions", + "type": "uint256" + } + ], + "name": "Checkpoint", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "new_relative_weight_cap", + "type": "uint256" + } + ], + "name": "RelativeWeightCapChanged", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_RELATIVE_WEIGHT_CAP", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "checkpoint", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "time", + "type": "uint256" + } + ], + "name": "getCappedRelativeWeight", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRecipient", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRelativeWeightCap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "relativeWeightCap", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "feeDistributorRecipient", + "type": "bool" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "integrate_fraction", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isRecipientFeeDistributor", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "is_killed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "killGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "relativeWeightCap", + "type": "uint256" + } + ], + "name": "setRelativeWeightCap", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unkillGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "user_checkpoint", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101806040523480156200001257600080fd5b5060405162001c0d38038062001c0d833981810160405260208110156200003857600080fd5b505160408051602081019091526000815281906200005681620003cb565b50600180819055506000816001600160a01b031663e6dec36f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200009a57600080fd5b505afa158015620000af573d6000803e3d6000fd5b505050506040513d6020811015620000c657600080fd5b50516040805163c003969960e01b815290519192506000916001600160a01b0384169163c0039699916004808301926020929190829003018186803b1580156200010f57600080fd5b505afa15801562000124573d6000803e3d6000fd5b505050506040513d60208110156200013b57600080fd5b505160408051632c6f4d6f60e11b815290519192506000916001600160a01b038616916358de9ade916004808301926020929190829003018186803b1580156200018457600080fd5b505afa15801562000199573d6000803e3d6000fd5b505050506040513d6020811015620001b057600080fd5b50516001600160601b0319606084811b821660805285811b821660a05286811b821660c05282901b1660e052604080516303e1469160e61b815290519192506001600160a01b0383169163f851a44091600480820192602092909190829003018186803b1580156200022157600080fd5b505afa15801562000236573d6000803e3d6000fd5b505050506040513d60208110156200024d57600080fd5b505160601b6001600160601b0319166101005260408051635c3dab0b60e11b815290516001600160a01b0385169163b87b5616916004808301926020929190829003018186803b158015620002a157600080fd5b505afa158015620002b6573d6000803e3d6000fd5b505050506040513d6020811015620002cd57600080fd5b505161012052604080516321609bbf60e01b815290516001600160a01b038516916321609bbf916004808301926020929190829003018186803b1580156200031457600080fd5b505afa15801562000329573d6000803e3d6000fd5b505050506040513d60208110156200034057600080fd5b505161014052604080516303f7d6c760e51b815290516001600160a01b03851691637efad8e0916004808301926020929190829003018186803b1580156200038757600080fd5b505afa1580156200039c573d6000803e3d6000fd5b505050506040513d6020811015620003b357600080fd5b50516101605250506000196003555062000480915050565b8051620003e0906000906020840190620003e4565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200042757805160ff191683800117855562000457565b8280016001018555821562000457579182015b82811115620004575782518255916020019190600101906200043a565b506200046592915062000469565b5090565b5b808211156200046557600081556001016200046a565b60805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205161014051610160516116f86200051560003980610aab525080610a8a525080610a0d5280610af752508061054552806107d652806108b15280610c955250806105e4528061099a525080610bed525080610dbe5280610ebb52508061108f52806110d4528061117e52506116f86000f3fe6080604052600436106100dd5760003560e01c806383f5c39b1161007f5780639f867671116100595780639f867671146103c3578063ab8f0945146103d8578063c2c4c5c1146103ed578063d34fb267146103f5576100dd565b806383f5c39b1461038457806395d666c8146103995780639c868ac0146103ae576100dd565b806314e956f5116100bb57806314e956f51461023e5780631b88094d146102685780634b820093146102a657806354fd4d50146102fa576100dd565b806306b70aa2146100e257806309400707146101c257806310d3eb0414610214575b600080fd5b3480156100ee57600080fd5b506101c06004803603608081101561010557600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359160408201351515919081019060808101606082013564010000000081111561014b57600080fd5b82018360208201111561015d57600080fd5b8035906020019184600183028401116401000000008311171561017f57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061040a945050505050565b005b3480156101ce57600080fd5b50610202600480360360208110156101e557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661049f565b60408051918252519081900360200190f35b34801561022057600080fd5b506101c06004803603602081101561023757600080fd5b503561052d565b34801561024a57600080fd5b506102026004803603602081101561026157600080fd5b50356105dd565b34801561027457600080fd5b5061027d6106ab565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156102b257600080fd5b506102e6600480360360208110156102c957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166106c8565b604080519115158252519081900360200190f35b34801561030657600080fd5b5061030f6106ce565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610349578181015183820152602001610331565b50505050905090810190601f1680156103765780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561039057600080fd5b50610202610782565b3480156103a557600080fd5b506102e6610788565b3480156103ba57600080fd5b506102e66107a9565b3480156103cf57600080fd5b506102026107b2565b3480156103e457600080fd5b506101c06107be565b6102e661088f565b34801561040157600080fd5b506101c0610c7d565b61041383610d4b565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000008415150217905561049981610f5d565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff8216301461052557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060055490565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146105d157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b6105da81610f70565b50565b60006106a57f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9430856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561067157600080fd5b505afa158015610685573d6000803e3d6000fd5b505050506040513d602081101561069b57600080fd5b505160075461100c565b92915050565b60085473ffffffffffffffffffffffffffffffffffffffff165b90565b50600190565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107785780601f1061074d57610100808354040283529160200191610778565b820191906000526020600020905b81548152906001019060200180831161075b57829003601f168201915b5050505050905090565b60075490565b60085474010000000000000000000000000000000000000000900460ff1690565b60065460ff1690565b670de0b6b3a764000081565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461086257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610899611018565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461093d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600354600061094a611031565b905080821015610c6f57604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b1580156109e157600080fd5b505af11580156109f5573d6000803e3d6000fd5b505060025460045460019590950194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff01811015610b825784811115610a4757610b82565b62093a808102600080610a59836105dd565b9050828510158015610a6f57508262093a800185105b15610b2857828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000890281610ad357fe5b04975062093a80819003670de0b6b3a7640000838a02820260028b905560048990557f00000000000000000000000000000000000000000000000000000000000000009098019704939093019250610b3d9050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a250939093019250600101610a2f565b50600384905560058054830190558115801590610ba2575060065460ff16155b15610c6b57604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b158015610c3557600080fd5b505af1158015610c49573d6000803e3d6000fd5b505050506040513d6020811015610c5f57600080fd5b50610c6b90508261105c565b5050505b6001925050506106c56111a5565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610d2157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60035415610dba57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e2257600080fd5b505afa158015610e36573d6000803e3d6000fd5b505050506040513d6020811015610e4c57600080fd5b5051905080610ea6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061169f6024913960400191505060405180910390fd5b6002819055610eb3611031565b6003819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f2157600080fd5b505af1158015610f35573d6000803e3d6000fd5b505050506040513d6020811015610f4b57600080fd5b5051600455610f5982610f70565b5050565b8051610f599060009060208401906115d7565b670de0b6b3a7640000811115610fd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061166b6034913960400191505060405180910390fd5b60078190556040805182815290517f13e45870490f54cea50d245930d12102c72b502641ef6850d0b15a8c92decfb29181900360200190a150565b80820390821102900390565b61102a600260015414156101906111ab565b6002600155565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b60006110666106ab565b9050611070610788565b15611164576110b673ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001682846111b9565b8073ffffffffffffffffffffffffffffffffffffffff1663338b5dea7f0000000000000000000000000000000000000000000000000000000000000000846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561114757600080fd5b505af115801561115b573d6000803e3d6000fd5b50505050610f59565b610f5973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016828461138f565b60018055565b81610f5957610f598161141c565b80158015906112685750604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561123957600080fd5b505afa15801561124d573d6000803e3d6000fd5b505050506040513d602081101561126357600080fd5b505115155b156112fd576040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260006044808301919091528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b3000000000000000000000000000000000000000000000000000000001790526112fd908490611446565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b30000000000000000000000000000000000000000000000000000000017905261138a908490611446565b505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261138a908490611446565b6105da817f42414c000000000000000000000000000000000000000000000000000000000061155c565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b602083106114af57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611472565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611511576040519150601f19603f3d011682016040523d82523d6000602084013e611516565b606091505b5091509150600082141561152e573d6000803e3d6000fd5b610499815160001480611554575081806020019051602081101561155157600080fd5b50515b6101a26111ab565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061161857805160ff1916838001178555611645565b82800160010185558215611645579182015b8281111561164557825182559160200191906001019061162a565b50611651929150611655565b5090565b5b80821115611651576000815560010161165656fe52656c61746976652077656967687420636170206578636565647320616c6c6f776564206162736f6c757465206d6178696d756d42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a264697066735822122062d953bc3bca98f64a5c2fba7f3ef7662c96586a7accb923c6fcb4e756be4fd864736f6c63430007010033", + "deployedBytecode": "0x6080604052600436106100dd5760003560e01c806383f5c39b1161007f5780639f867671116100595780639f867671146103c3578063ab8f0945146103d8578063c2c4c5c1146103ed578063d34fb267146103f5576100dd565b806383f5c39b1461038457806395d666c8146103995780639c868ac0146103ae576100dd565b806314e956f5116100bb57806314e956f51461023e5780631b88094d146102685780634b820093146102a657806354fd4d50146102fa576100dd565b806306b70aa2146100e257806309400707146101c257806310d3eb0414610214575b600080fd5b3480156100ee57600080fd5b506101c06004803603608081101561010557600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359160408201351515919081019060808101606082013564010000000081111561014b57600080fd5b82018360208201111561015d57600080fd5b8035906020019184600183028401116401000000008311171561017f57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061040a945050505050565b005b3480156101ce57600080fd5b50610202600480360360208110156101e557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661049f565b60408051918252519081900360200190f35b34801561022057600080fd5b506101c06004803603602081101561023757600080fd5b503561052d565b34801561024a57600080fd5b506102026004803603602081101561026157600080fd5b50356105dd565b34801561027457600080fd5b5061027d6106ab565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156102b257600080fd5b506102e6600480360360208110156102c957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166106c8565b604080519115158252519081900360200190f35b34801561030657600080fd5b5061030f6106ce565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610349578181015183820152602001610331565b50505050905090810190601f1680156103765780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561039057600080fd5b50610202610782565b3480156103a557600080fd5b506102e6610788565b3480156103ba57600080fd5b506102e66107a9565b3480156103cf57600080fd5b506102026107b2565b3480156103e457600080fd5b506101c06107be565b6102e661088f565b34801561040157600080fd5b506101c0610c7d565b61041383610d4b565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000008415150217905561049981610f5d565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff8216301461052557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060055490565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146105d157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b6105da81610f70565b50565b60006106a57f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9430856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561067157600080fd5b505afa158015610685573d6000803e3d6000fd5b505050506040513d602081101561069b57600080fd5b505160075461100c565b92915050565b60085473ffffffffffffffffffffffffffffffffffffffff165b90565b50600190565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107785780601f1061074d57610100808354040283529160200191610778565b820191906000526020600020905b81548152906001019060200180831161075b57829003601f168201915b5050505050905090565b60075490565b60085474010000000000000000000000000000000000000000900460ff1690565b60065460ff1690565b670de0b6b3a764000081565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461086257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610899611018565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461093d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600354600061094a611031565b905080821015610c6f57604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b1580156109e157600080fd5b505af11580156109f5573d6000803e3d6000fd5b505060025460045460019590950194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff01811015610b825784811115610a4757610b82565b62093a808102600080610a59836105dd565b9050828510158015610a6f57508262093a800185105b15610b2857828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000890281610ad357fe5b04975062093a80819003670de0b6b3a7640000838a02820260028b905560048990557f00000000000000000000000000000000000000000000000000000000000000009098019704939093019250610b3d9050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a250939093019250600101610a2f565b50600384905560058054830190558115801590610ba2575060065460ff16155b15610c6b57604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b158015610c3557600080fd5b505af1158015610c49573d6000803e3d6000fd5b505050506040513d6020811015610c5f57600080fd5b50610c6b90508261105c565b5050505b6001925050506106c56111a5565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610d2157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60035415610dba57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e2257600080fd5b505afa158015610e36573d6000803e3d6000fd5b505050506040513d6020811015610e4c57600080fd5b5051905080610ea6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061169f6024913960400191505060405180910390fd5b6002819055610eb3611031565b6003819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f2157600080fd5b505af1158015610f35573d6000803e3d6000fd5b505050506040513d6020811015610f4b57600080fd5b5051600455610f5982610f70565b5050565b8051610f599060009060208401906115d7565b670de0b6b3a7640000811115610fd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061166b6034913960400191505060405180910390fd5b60078190556040805182815290517f13e45870490f54cea50d245930d12102c72b502641ef6850d0b15a8c92decfb29181900360200190a150565b80820390821102900390565b61102a600260015414156101906111ab565b6002600155565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b60006110666106ab565b9050611070610788565b15611164576110b673ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001682846111b9565b8073ffffffffffffffffffffffffffffffffffffffff1663338b5dea7f0000000000000000000000000000000000000000000000000000000000000000846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561114757600080fd5b505af115801561115b573d6000803e3d6000fd5b50505050610f59565b610f5973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016828461138f565b60018055565b81610f5957610f598161141c565b80158015906112685750604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561123957600080fd5b505afa15801561124d573d6000803e3d6000fd5b505050506040513d602081101561126357600080fd5b505115155b156112fd576040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260006044808301919091528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b3000000000000000000000000000000000000000000000000000000001790526112fd908490611446565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b30000000000000000000000000000000000000000000000000000000017905261138a908490611446565b505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261138a908490611446565b6105da817f42414c000000000000000000000000000000000000000000000000000000000061155c565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b602083106114af57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611472565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611511576040519150601f19603f3d011682016040523d82523d6000602084013e611516565b606091505b5091509150600082141561152e573d6000803e3d6000fd5b610499815160001480611554575081806020019051602081101561155157600080fd5b50515b6101a26111ab565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061161857805160ff1916838001178555611645565b82800160010185558215611645579182015b8281111561164557825182559160200191906001019061162a565b50611651929150611655565b5090565b5b80821115611651576000815560010161165656fe52656c61746976652077656967687420636170206578636565647320616c6c6f776564206162736f6c757465206d6178696d756d42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a264697066735822122062d953bc3bca98f64a5c2fba7f3ef7662c96586a7accb923c6fcb4e756be4fd864736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/artifact/SingleRecipientGaugeFactory.json b/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/artifact/SingleRecipientGaugeFactory.json new file mode 100644 index 0000000..36155ea --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/artifact/SingleRecipientGaugeFactory.json @@ -0,0 +1,132 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SingleRecipientGaugeFactory", + "sourceName": "contracts/gauges/ethereum/SingleRecipientGaugeFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IBalancerMinter", + "name": "minter", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "productVersion", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "GaugeCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "relativeWeightCap", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "feeDistributorRecipient", + "type": "bool" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeImplementation", + "outputs": [ + { + "internalType": "contract ILiquidityGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProductVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "isGaugeFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50604051620024e0380380620024e083398101604081905261003191610204565b8260405161003e906100c3565b6100489190610282565b604051809103906000f080158015610064573d6000803e3d6000fd5b508261006f816100ac565b50600180546001600160a01b0319166001600160a01b039290921691909117905580516100a39060039060208401906100d1565b50505050610296565b80516100bf9060009060208401906100d1565b5050565b611c0d80620008d383390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061011257805160ff191683800117855561013f565b8280016001018555821561013f579182015b8281111561013f578251825591602001919060010190610124565b5061014b92915061014f565b5090565b5b8082111561014b5760008155600101610150565b600082601f830112610174578081fd5b81516001600160401b038082111561018a578283fd5b6040516020601f8401601f19168201810183811183821017156101ab578586fd5b806040525081945083825286818588010111156101c757600080fd5b600092505b838310156101e957858301810151828401820152918201916101cc565b838311156101fa5760008185840101525b5050505092915050565b600080600060608486031215610218578283fd5b83516001600160a01b038116811461022e578384fd5b60208501519093506001600160401b038082111561024a578384fd5b61025687838801610164565b9350604086015191508082111561026b578283fd5b5061027886828701610164565b9150509250925092565b6001600160a01b0391909116815260200190565b61062d80620002a66000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c806354fd4d501161005057806354fd4d501461009f57806358e4e2d7146100a7578063ce3cc8bd146100ba57610067565b806318d6186f1461006c57806339312dee1461008a575b600080fd5b6100746100da565b60405161008191906105ad565b60405180910390f35b61009261018e565b604051610081919061053a565b6100746101aa565b6100926100b536600461048d565b610229565b6100cd6100c836600461046b565b6102b7565b60405161008191906105a2565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156101845780601f1061015957610100808354040283529160200191610184565b820191906000526020600020905b81548152906001019060200180831161016757829003601f168201915b5050505050905090565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156101845780601f1061015957610100808354040283529160200191610184565b6000806102346102e6565b90508073ffffffffffffffffffffffffffffffffffffffff166306b70aa286868661025d6100da565b6040518563ffffffff1660e01b815260040161027c949392919061055b565b600060405180830381600087803b15801561029657600080fd5b505af11580156102aa573d6000803e3d6000fd5b5092979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526002602052604090205460ff165b919050565b600154600090819061030d9073ffffffffffffffffffffffffffffffffffffffff1661038b565b73ffffffffffffffffffffffffffffffffffffffff811660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff81166102e1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610438906105c0565b60405180910390fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461046557600080fd5b92915050565b60006020828403121561047c578081fd5b6104868383610441565b9392505050565b6000806000606084860312156104a1578182fd5b6104ab8585610441565b925060208401359150604084013580151581146104c6578182fd5b809150509250925092565b60008151808452815b818110156104f6576020818501810151868301820152016104da565b818111156105075782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff8616825284602083015283151560408301526080606083015261059860808301846104d1565b9695505050505050565b901515815260200190565b60006020825261048660208301846104d1565b60208082526016908201527f455243313136373a20637265617465206661696c65640000000000000000000060408201526060019056fea264697066735822122055a6b2ed9ad4cceef8a7a02d42cbb3992ef1eb95402e2ddbc5f31cd5543feafc64736f6c634300070100336101806040523480156200001257600080fd5b5060405162001c0d38038062001c0d833981810160405260208110156200003857600080fd5b505160408051602081019091526000815281906200005681620003cb565b50600180819055506000816001600160a01b031663e6dec36f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200009a57600080fd5b505afa158015620000af573d6000803e3d6000fd5b505050506040513d6020811015620000c657600080fd5b50516040805163c003969960e01b815290519192506000916001600160a01b0384169163c0039699916004808301926020929190829003018186803b1580156200010f57600080fd5b505afa15801562000124573d6000803e3d6000fd5b505050506040513d60208110156200013b57600080fd5b505160408051632c6f4d6f60e11b815290519192506000916001600160a01b038616916358de9ade916004808301926020929190829003018186803b1580156200018457600080fd5b505afa15801562000199573d6000803e3d6000fd5b505050506040513d6020811015620001b057600080fd5b50516001600160601b0319606084811b821660805285811b821660a05286811b821660c05282901b1660e052604080516303e1469160e61b815290519192506001600160a01b0383169163f851a44091600480820192602092909190829003018186803b1580156200022157600080fd5b505afa15801562000236573d6000803e3d6000fd5b505050506040513d60208110156200024d57600080fd5b505160601b6001600160601b0319166101005260408051635c3dab0b60e11b815290516001600160a01b0385169163b87b5616916004808301926020929190829003018186803b158015620002a157600080fd5b505afa158015620002b6573d6000803e3d6000fd5b505050506040513d6020811015620002cd57600080fd5b505161012052604080516321609bbf60e01b815290516001600160a01b038516916321609bbf916004808301926020929190829003018186803b1580156200031457600080fd5b505afa15801562000329573d6000803e3d6000fd5b505050506040513d60208110156200034057600080fd5b505161014052604080516303f7d6c760e51b815290516001600160a01b03851691637efad8e0916004808301926020929190829003018186803b1580156200038757600080fd5b505afa1580156200039c573d6000803e3d6000fd5b505050506040513d6020811015620003b357600080fd5b50516101605250506000196003555062000480915050565b8051620003e0906000906020840190620003e4565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200042757805160ff191683800117855562000457565b8280016001018555821562000457579182015b82811115620004575782518255916020019190600101906200043a565b506200046592915062000469565b5090565b5b808211156200046557600081556001016200046a565b60805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205161014051610160516116f86200051560003980610aab525080610a8a525080610a0d5280610af752508061054552806107d652806108b15280610c955250806105e4528061099a525080610bed525080610dbe5280610ebb52508061108f52806110d4528061117e52506116f86000f3fe6080604052600436106100dd5760003560e01c806383f5c39b1161007f5780639f867671116100595780639f867671146103c3578063ab8f0945146103d8578063c2c4c5c1146103ed578063d34fb267146103f5576100dd565b806383f5c39b1461038457806395d666c8146103995780639c868ac0146103ae576100dd565b806314e956f5116100bb57806314e956f51461023e5780631b88094d146102685780634b820093146102a657806354fd4d50146102fa576100dd565b806306b70aa2146100e257806309400707146101c257806310d3eb0414610214575b600080fd5b3480156100ee57600080fd5b506101c06004803603608081101561010557600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359160408201351515919081019060808101606082013564010000000081111561014b57600080fd5b82018360208201111561015d57600080fd5b8035906020019184600183028401116401000000008311171561017f57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061040a945050505050565b005b3480156101ce57600080fd5b50610202600480360360208110156101e557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661049f565b60408051918252519081900360200190f35b34801561022057600080fd5b506101c06004803603602081101561023757600080fd5b503561052d565b34801561024a57600080fd5b506102026004803603602081101561026157600080fd5b50356105dd565b34801561027457600080fd5b5061027d6106ab565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156102b257600080fd5b506102e6600480360360208110156102c957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166106c8565b604080519115158252519081900360200190f35b34801561030657600080fd5b5061030f6106ce565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610349578181015183820152602001610331565b50505050905090810190601f1680156103765780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561039057600080fd5b50610202610782565b3480156103a557600080fd5b506102e6610788565b3480156103ba57600080fd5b506102e66107a9565b3480156103cf57600080fd5b506102026107b2565b3480156103e457600080fd5b506101c06107be565b6102e661088f565b34801561040157600080fd5b506101c0610c7d565b61041383610d4b565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000008415150217905561049981610f5d565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff8216301461052557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060055490565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146105d157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b6105da81610f70565b50565b60006106a57f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9430856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561067157600080fd5b505afa158015610685573d6000803e3d6000fd5b505050506040513d602081101561069b57600080fd5b505160075461100c565b92915050565b60085473ffffffffffffffffffffffffffffffffffffffff165b90565b50600190565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107785780601f1061074d57610100808354040283529160200191610778565b820191906000526020600020905b81548152906001019060200180831161075b57829003601f168201915b5050505050905090565b60075490565b60085474010000000000000000000000000000000000000000900460ff1690565b60065460ff1690565b670de0b6b3a764000081565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461086257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610899611018565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461093d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600354600061094a611031565b905080821015610c6f57604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b1580156109e157600080fd5b505af11580156109f5573d6000803e3d6000fd5b505060025460045460019590950194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff01811015610b825784811115610a4757610b82565b62093a808102600080610a59836105dd565b9050828510158015610a6f57508262093a800185105b15610b2857828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000890281610ad357fe5b04975062093a80819003670de0b6b3a7640000838a02820260028b905560048990557f00000000000000000000000000000000000000000000000000000000000000009098019704939093019250610b3d9050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a250939093019250600101610a2f565b50600384905560058054830190558115801590610ba2575060065460ff16155b15610c6b57604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b158015610c3557600080fd5b505af1158015610c49573d6000803e3d6000fd5b505050506040513d6020811015610c5f57600080fd5b50610c6b90508261105c565b5050505b6001925050506106c56111a5565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610d2157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60035415610dba57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e2257600080fd5b505afa158015610e36573d6000803e3d6000fd5b505050506040513d6020811015610e4c57600080fd5b5051905080610ea6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061169f6024913960400191505060405180910390fd5b6002819055610eb3611031565b6003819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f2157600080fd5b505af1158015610f35573d6000803e3d6000fd5b505050506040513d6020811015610f4b57600080fd5b5051600455610f5982610f70565b5050565b8051610f599060009060208401906115d7565b670de0b6b3a7640000811115610fd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061166b6034913960400191505060405180910390fd5b60078190556040805182815290517f13e45870490f54cea50d245930d12102c72b502641ef6850d0b15a8c92decfb29181900360200190a150565b80820390821102900390565b61102a600260015414156101906111ab565b6002600155565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b60006110666106ab565b9050611070610788565b15611164576110b673ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001682846111b9565b8073ffffffffffffffffffffffffffffffffffffffff1663338b5dea7f0000000000000000000000000000000000000000000000000000000000000000846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561114757600080fd5b505af115801561115b573d6000803e3d6000fd5b50505050610f59565b610f5973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016828461138f565b60018055565b81610f5957610f598161141c565b80158015906112685750604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561123957600080fd5b505afa15801561124d573d6000803e3d6000fd5b505050506040513d602081101561126357600080fd5b505115155b156112fd576040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260006044808301919091528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b3000000000000000000000000000000000000000000000000000000001790526112fd908490611446565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b30000000000000000000000000000000000000000000000000000000017905261138a908490611446565b505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261138a908490611446565b6105da817f42414c000000000000000000000000000000000000000000000000000000000061155c565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b602083106114af57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611472565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611511576040519150601f19603f3d011682016040523d82523d6000602084013e611516565b606091505b5091509150600082141561152e573d6000803e3d6000fd5b610499815160001480611554575081806020019051602081101561155157600080fd5b50515b6101a26111ab565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061161857805160ff1916838001178555611645565b82800160010185558215611645579182015b8281111561164557825182559160200191906001019061162a565b50611651929150611655565b5090565b5b80821115611651576000815560010161165656fe52656c61746976652077656967687420636170206578636565647320616c6c6f776564206162736f6c757465206d6178696d756d42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a264697066735822122062d953bc3bca98f64a5c2fba7f3ef7662c96586a7accb923c6fcb4e756be4fd864736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c806354fd4d501161005057806354fd4d501461009f57806358e4e2d7146100a7578063ce3cc8bd146100ba57610067565b806318d6186f1461006c57806339312dee1461008a575b600080fd5b6100746100da565b60405161008191906105ad565b60405180910390f35b61009261018e565b604051610081919061053a565b6100746101aa565b6100926100b536600461048d565b610229565b6100cd6100c836600461046b565b6102b7565b60405161008191906105a2565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156101845780601f1061015957610100808354040283529160200191610184565b820191906000526020600020905b81548152906001019060200180831161016757829003601f168201915b5050505050905090565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156101845780601f1061015957610100808354040283529160200191610184565b6000806102346102e6565b90508073ffffffffffffffffffffffffffffffffffffffff166306b70aa286868661025d6100da565b6040518563ffffffff1660e01b815260040161027c949392919061055b565b600060405180830381600087803b15801561029657600080fd5b505af11580156102aa573d6000803e3d6000fd5b5092979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526002602052604090205460ff165b919050565b600154600090819061030d9073ffffffffffffffffffffffffffffffffffffffff1661038b565b73ffffffffffffffffffffffffffffffffffffffff811660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff81166102e1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610438906105c0565b60405180910390fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461046557600080fd5b92915050565b60006020828403121561047c578081fd5b6104868383610441565b9392505050565b6000806000606084860312156104a1578182fd5b6104ab8585610441565b925060208401359150604084013580151581146104c6578182fd5b809150509250925092565b60008151808452815b818110156104f6576020818501810151868301820152016104da565b818111156105075782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff8616825284602083015283151560408301526080606083015261059860808301846104d1565b9695505050505050565b901515815260200190565b60006020825261048660208301846104d1565b60208082526016908201527f455243313136373a20637265617465206661696c65640000000000000000000060408201526060019056fea264697066735822122055a6b2ed9ad4cceef8a7a02d42cbb3992ef1eb95402e2ddbc5f31cd5543feafc64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/index.ts b/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/index.ts new file mode 100644 index 0000000..abcff5f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/index.ts @@ -0,0 +1,13 @@ +import { Task, TaskRunOptions } from '@src'; +import { SingleRecipientGaugeFactoryDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as SingleRecipientGaugeFactoryDeployment; + + const args = [input.BalancerMinter, input.FactoryVersion, input.GaugeVersion]; + const factory = await task.deployAndVerify('SingleRecipientGaugeFactory', args, from, force); + + const implementation = await factory.getGaugeImplementation(); + await task.verify('SingleRecipientGauge', implementation, [input.BalancerMinter]); + await task.save({ SingleRecipientGauge: implementation }); +}; diff --git a/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/input.ts b/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/input.ts new file mode 100644 index 0000000..9172925 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/input.ts @@ -0,0 +1,16 @@ +import { Task, TaskMode } from '@src'; + +export type SingleRecipientGaugeFactoryDeployment = { + BalancerMinter: string; + FactoryVersion: string; + GaugeVersion: string; +}; + +const BalancerMinter = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); +const BaseVersion = { version: 2, deployment: '20230215-single-recipient-gauge-factory-v2' }; + +export default { + BalancerMinter, + FactoryVersion: JSON.stringify({ name: 'SingleRecipientGaugeFactory', ...BaseVersion }), + GaugeVersion: JSON.stringify({ name: 'SingleRecipientGauge', ...BaseVersion }), +}; diff --git a/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/output/goerli.json b/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/output/goerli.json new file mode 100644 index 0000000..39b5c9d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/output/goerli.json @@ -0,0 +1,4 @@ +{ + "SingleRecipientGaugeFactory": "0xE3881627B8DeeBCCF9c23B291430a549Fc0bE5F7", + "SingleRecipientGauge": "0x0e9aDdc34F93BCcB45D1F744B9F9301285C5b48F" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/output/mainnet.json b/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/output/mainnet.json new file mode 100644 index 0000000..6e7d1a5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "SingleRecipientGaugeFactory": "0x4fb47126Fa83A8734991E41B942Ac29A3266C968", + "SingleRecipientGauge": "0xb2007B8B7E0260042517f635CFd8E6dD2Dd7f007" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/output/sepolia.json b/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/output/sepolia.json new file mode 100644 index 0000000..4003964 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/output/sepolia.json @@ -0,0 +1,4 @@ +{ + "SingleRecipientGaugeFactory": "0x7EE4D172Ae50C627a1BFA9A99E1260C54dA26fdF", + "SingleRecipientGauge": "0x9a5ddDE7056ceFFb03D9962c4549Ac1C4ad1F985" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/readme.md b/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/readme.md new file mode 100644 index 0000000..3f6d71d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/readme.md @@ -0,0 +1,14 @@ +# 2023-02-15 - Single Recipient Gauge Factory V2 + +Deployment of the `SingleRecipientGaugeFactory`, for liquidity gauges which forward their entire BAL allowance onto a single address. +This version adds a weight cap to single recipient gauges, and supersedes [single recipient gauge factory V1](../deprecated/20220325-single-recipient-gauge-factory/). + +Additionally, this version also supports the recipient implementing the `depositToken` function (from the `FeeDistributor` interface), directly depositing the tokens in such a distributor instead of requiring a manual step after minting. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`SingleRecipientGaugeFactory` artifact](./artifact/SingleRecipientGaugeFactory.json) +- [`SingleRecipientGauge` artifact](./artifact/SingleRecipientGauge.json) diff --git a/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/test/task.fork.ts b/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/test/task.fork.ts new file mode 100644 index 0000000..f9729d5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230215-single-recipient-gauge-factory-v2/test/task.fork.ts @@ -0,0 +1,352 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { takeSnapshot, SnapshotRestorer } from '@nomicfoundation/hardhat-network-helpers'; + +import { BigNumber, FP_ONE, fp } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { advanceTime, currentTimestamp, currentWeekTimestamp, DAY, MONTH, WEEK } from '@helpers/time'; +import * as expectEvent from '@helpers/expectEvent'; + +import { expectEqualWithError } from '@helpers/relativeError'; +import { expectTransferEvent } from '@helpers/expectTransfer'; +import { MAX_UINT256, ZERO_ADDRESS } from '@helpers/constants'; +import { range } from 'lodash'; + +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode, getSigners } from '@src'; +import { WeightedPoolEncoder } from '@helpers/models/pools/weighted/encoder'; + +describeForkTest('SingleRecipientGaugeFactory V2', 'mainnet', 16686000, function () { + let admin: SignerWithAddress, other: SignerWithAddress, balWhale: SignerWithAddress; + let vault: Contract, + authorizer: Contract, + authorizerAdaptor: Contract, + bal80weth20Pool: Contract, + BALTokenAdmin: Contract, + gaugeController: Contract, + balToken: Contract, + veBAL: Contract, + factory: Contract, + gauge: Contract; + + let BAL: string; + + let task: Task; + + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + + const BAL_WHALE = '0x740a4AEEfb44484853AA96aB12545FC0290805F3'; + const BAL80WETH20_POOL = '0x5c6Ee304399DBdB9C8Ef030aB642B10820DB8F56'; + + const weightCap = fp(0.001); + + before('run task', async () => { + task = new Task('20230215-single-recipient-gauge-factory-v2', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('SingleRecipientGaugeFactory'); + }); + + before('advance time', async () => { + // This causes all voting cooldowns to expire, letting the veBAL holder vote again + await advanceTime(DAY * 12); + }); + + before('setup accounts', async () => { + [, admin, other] = await getSigners(); + balWhale = await impersonate(BAL_WHALE, fp(10000)); + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.deployedInstance('Vault'); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + + const authorizerAdaptorTask = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizerAdaptor = await authorizerAdaptorTask.deployedInstance('AuthorizerAdaptor'); + + const weightedPoolTask = new Task('20210418-weighted-pool', TaskMode.READ_ONLY, getForkedNetwork(hre)); + bal80weth20Pool = await weightedPoolTask.instanceAt('WeightedPool2Tokens', BAL80WETH20_POOL); + + const balancerTokenAdminTask = new Task('20220325-balancer-token-admin', TaskMode.READ_ONLY, getForkedNetwork(hre)); + BALTokenAdmin = await balancerTokenAdminTask.deployedInstance('BalancerTokenAdmin'); + + BAL = await BALTokenAdmin.getBalancerToken(); + + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeController = await gaugeControllerTask.deployedInstance('GaugeController'); + veBAL = await gaugeControllerTask.deployedInstance('VotingEscrow'); + + // We use test balancer token to make use of the ERC-20 interface. + const testBALTokenTask = new Task('20220325-test-balancer-token', TaskMode.READ_ONLY, getForkedNetwork(hre)); + balToken = await testBALTokenTask.instanceAt('TestBalancerToken', BAL); + }); + + before('get veBAL from BAL', async () => { + const ethToJoin = fp(100); + await balToken.connect(balWhale).approve(vault.address, MAX_UINT256); + const poolId = await bal80weth20Pool.getPoolId(); + + await vault.connect(balWhale).joinPool( + poolId, + balWhale.address, + balWhale.address, + { + assets: [BAL, ZERO_ADDRESS], // Using sentinel value to join with ETH instead of WETH. + maxAmountsIn: [MAX_UINT256, MAX_UINT256], + fromInternalBalance: false, + userData: WeightedPoolEncoder.joinExactTokensInForBPTOut( + [await balToken.balanceOf(balWhale.address), ethToJoin], + 0 + ), + }, + { value: ethToJoin } + ); + + await bal80weth20Pool.connect(balWhale).approve(veBAL.address, MAX_UINT256); + const currentTime = await currentTimestamp(); + await veBAL + .connect(balWhale) + .create_lock(await bal80weth20Pool.balanceOf(balWhale.address), currentTime.add(MONTH * 12)); + }); + + // This block number is close to an epoch change, so we first move to the next one and update the emission rates + // in the BAL token admin. This is not strictly necessary, but completing the whole test within the same epoch + // simplifies the math for the expected emissions down below. + before('update balancer token admin rate', async () => { + await advanceTime(WEEK * 5); + await BALTokenAdmin.update_mining_parameters(); + }); + + enum RecipientMode { + BasicRecipient, + FeeDistributorRecipient, + } + + describe('getters', () => { + const expectedGaugeVersion = { + name: 'SingleRecipientGauge', + version: 2, + deployment: '20230215-single-recipient-gauge-factory-v2', + }; + + it('check gauge version', async () => { + const tx = await factory.create(ZERO_ADDRESS, fp(0), false); + const event = expectEvent.inReceipt(await tx.wait(), 'GaugeCreated'); + const gauge = await task.instanceAt('SingleRecipientGauge', event.args.gauge); + expect(await gauge.version()).to.equal(JSON.stringify(expectedGaugeVersion)); + }); + + it('check gauge version from factory', async () => { + expect(await factory.getProductVersion()).to.equal(JSON.stringify(expectedGaugeVersion)); + }); + + it('check factory version', async () => { + const expectedFactoryVersion = { + name: 'SingleRecipientGaugeFactory', + version: 2, + deployment: '20230215-single-recipient-gauge-factory-v2', + }; + + expect(await factory.version()).to.equal(JSON.stringify(expectedFactoryVersion)); + }); + }); + + context('with a basic recipient', () => { + itWorksLikeACappedSingleRecipientGauge(RecipientMode.BasicRecipient); + }); + + context('with a FeeDistributor recipient', () => { + itWorksLikeACappedSingleRecipientGauge(RecipientMode.FeeDistributorRecipient); + }); + + function itWorksLikeACappedSingleRecipientGauge(mode: RecipientMode) { + // We're going to create gauges, vote for them, have time pass, etc. Because of that, we take a snapshot before we + // do any of that, and restore it at the end. + let snapshot: SnapshotRestorer; + + before(async () => { + snapshot = await takeSnapshot(); + }); + + after(async () => { + await snapshot.restore(); + }); + + let recipient: string; + before(() => { + if (mode == RecipientMode.BasicRecipient) { + recipient = other.address; + } else { + const feeDistributorTask = new Task('20220714-fee-distributor-v2', TaskMode.READ_ONLY, getForkedNetwork(hre)); + recipient = feeDistributorTask.output({ network: 'mainnet' }).FeeDistributor; + } + }); + + it('create gauge', async () => { + // We use an EOA as the single recipient; in practice it will probably be a contract. + const tx = await factory.create(recipient, weightCap, mode == RecipientMode.FeeDistributorRecipient); + + const event = expectEvent.inReceipt(await tx.wait(), 'GaugeCreated'); + + gauge = await task.instanceAt('SingleRecipientGauge', event.args.gauge); + expect(await gauge.getRecipient()).to.equal(recipient); + expect(await gauge.isRecipientFeeDistributor()).to.equal(mode == RecipientMode.FeeDistributorRecipient); + + expect(await factory.isGaugeFromFactory(gauge.address)).to.be.true; + }); + + it('grant permissions', async () => { + // We are not using the GaugeAdder at the moment, so gauges shall be added to the gauge controller directly. + // Therefore, we just grant the admin the permission to add the gauge to the controller, and perform a checkpoint. + const govMultisig = await impersonate(GOV_MULTISIG); + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + await authorizer + .connect(govMultisig) + .grantRole(gaugeControllerTask.actionId('GaugeController', 'add_gauge(address,int128)'), admin.address); + + await authorizer + .connect(govMultisig) + .grantRole(await authorizerAdaptor.getActionId(gauge.interface.getSighash('checkpoint')), admin.address); + }); + + it('add gauge to gauge controller directly via AuthorizerAdaptor', async () => { + // Using 2 as Ethereum gauge type, but it could be any of the existing types since they all have the same + // relative weight in the controller. + const calldata = gaugeController.interface.encodeFunctionData('add_gauge(address,int128)', [gauge.address, 2]); + await authorizerAdaptor.connect(admin).performAction(gaugeController.address, calldata); + + expect(await gaugeController.gauge_exists(gauge.address)).to.be.true; + }); + + it('vote for gauge so that weight is above cap', async () => { + expect(await gaugeController.get_gauge_weight(gauge.address)).to.equal(0); + expect(await gauge.getCappedRelativeWeight(await currentTimestamp())).to.equal(0); + + // Max voting power is 10k points + await gaugeController.connect(balWhale).vote_for_gauge_weights(gauge.address, 10000); + + // We now need to go through an epoch for the votes to be locked in + await advanceTime(DAY * 8); + + await gaugeController.checkpoint(); + // Gauge weight is equal to the cap, and controller weight for the gauge is greater than the cap. + expect( + await gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, await currentWeekTimestamp()) + ).to.be.gt(weightCap); + expect(await gauge.getCappedRelativeWeight(await currentTimestamp())).to.equal(weightCap); + }); + + it('mint & transfer tokens', async () => { + // The gauge has votes for this week, and it will mint the first batch of tokens. We store the current gauge + // relative weight, as it will change as time goes by due to vote decay. + const firstMintWeekTimestamp = await currentWeekTimestamp(); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + + const zeroMintTx = await authorizerAdaptor.connect(admin).performAction(gauge.address, calldata); + expectEvent.inIndirectReceipt(await zeroMintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp.sub(WEEK), // Process past week, which had zero votes + periodEmissions: 0, + }); + // No token transfers are performed if the emissions are zero, but we can't test for a lack of those + + await advanceTime(WEEK); + + // The gauge should now mint and send all minted tokens to the Arbitrum bridge + const mintTx = await authorizerAdaptor.connect(admin).performAction(gauge.address, calldata); + const event = expectEvent.inIndirectReceipt(await mintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp, + }); + const actualEmissions = event.args.periodEmissions; + + // The amount of tokens minted should equal the weekly emissions rate times the relative weight of the gauge + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + + // Note that instead of the weight, we use the cap (since we expect for the weight to be larger than the cap) + const expectedEmissions = weightCap.mul(weeklyRate).div(FP_ONE); + expectEqualWithError(actualEmissions, expectedEmissions, 0.001); + + // Tokens are minted for the gauge + expectTransferEvent( + await mintTx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + value: actualEmissions, + }, + BAL + ); + + // And then forwarded to the recipient + expectTransferEvent( + await mintTx.wait(), + { + from: gauge.address, + to: recipient, + value: actualEmissions, + }, + BAL + ); + }); + + it('mint multiple weeks', async () => { + const numberOfWeeks = 5; + await advanceTime(WEEK * numberOfWeeks); + await gaugeController.checkpoint_gauge(gauge.address); + + const weekTimestamp = await currentWeekTimestamp(); + + // We can query the relative weight of the gauge for each of the weeks that have passed + const relativeWeights: BigNumber[] = await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, weekTimestamp.sub(WEEK * weekIndex)) + ) + ); + + // We require that they're all above the cap for simplicity - this lets us use the cap as each week's weight (and + // also tests cap behavior). + for (const relativeWeight of relativeWeights) { + expect(relativeWeight).to.be.gt(weightCap); + } + + // The amount of tokens minted should equal the sum of the weekly emissions rate times the relative weight of the + // gauge (this assumes we're not crossing an emissions rate epoch so that the inflation remains constant). + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + // Note that instead of the weight, we use the cap (since we expect for the weight to be larger than the cap) + const expectedEmissions = weightCap.mul(numberOfWeeks).mul(weeklyRate).div(FP_ONE); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + const tx = await authorizerAdaptor.connect(admin).performAction(gauge.address, calldata); + + await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + expectEvent.inIndirectReceipt(await tx.wait(), gauge.interface, 'Checkpoint', { + periodTime: weekTimestamp.sub(WEEK * weekIndex), + }) + ) + ); + + // Tokens are minted for the gauge + const gaugeTransferEvent = expectTransferEvent( + await tx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + }, + BAL + ); + expect(gaugeTransferEvent.args.value).to.be.almostEqual(expectedEmissions); + + // And then forwarded to the recipient + expectTransferEvent( + await tx.wait(), + { + from: gauge.address, + to: recipient, + value: gaugeTransferEvent.args.value, + }, + BAL + ); + }); + } +}); diff --git a/balpy/balancer-deployments/tasks/20230217-gnosis-root-gauge-factory/artifact/GnosisRootGaugeFactory.json b/balpy/balancer-deployments/tasks/20230217-gnosis-root-gauge-factory/artifact/GnosisRootGaugeFactory.json new file mode 100644 index 0000000..685fe8a --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230217-gnosis-root-gauge-factory/artifact/GnosisRootGaugeFactory.json @@ -0,0 +1,96 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GnosisRootGaugeFactory", + "sourceName": "contracts/gauges/gnosis/GnosisRootGaugeFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IBalancerMinter", + "name": "minter", + "type": "address" + }, + { + "internalType": "contract IGnosisBridge", + "name": "gnosisBridge", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "GaugeCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "relativeWeightCap", + "type": "uint256" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeImplementation", + "outputs": [ + { + "internalType": "contract ILiquidityGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "isGaugeFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b506040516119e33803806119e38339818101604052604081101561003357600080fd5b5080516020909101516040518290829061004c906100a8565b6001600160a01b03928316815291166020820152604080519182900301906000f08015801561007f573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b0392909216919091179055506100b59050565b6115818061046283390190565b61039e806100c46000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80630ecaea731461004657806339312dee146100a8578063ce3cc8bd146100b0575b600080fd5b61007f6004803603604081101561005c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356100f7565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61007f610195565b6100e3600480360360208110156100c657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166101b1565b604080519115158252519081900360200190f35b6000806101026101e0565b90508073ffffffffffffffffffffffffffffffffffffffff1663cd6dc68785856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561017557600080fd5b505af1158015610189573d6000803e3d6000fd5b50929695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff165b919050565b6000805481906102059073ffffffffffffffffffffffffffffffffffffffff16610286565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff81166101db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f455243313136373a20637265617465206661696c656400000000000000000000604482015290519081900360640190fdfea2646970667358221220231818eb8ffaa79cc74f33b508e390b994f12719e0894efd0f4f15f7f821bd0864736f6c634300070100336101a06040523480156200001257600080fd5b506040516200158138038062001581833981810160405260408110156200003857600080fd5b508051602091820151600160009081556040805163e6dec36f60e01b815290519394929385936001600160a01b0385169263e6dec36f9260048083019392829003018186803b1580156200008b57600080fd5b505afa158015620000a0573d6000803e3d6000fd5b505050506040513d6020811015620000b757600080fd5b50516040805163c003969960e01b815290519192506000916001600160a01b0384169163c0039699916004808301926020929190829003018186803b1580156200010057600080fd5b505afa15801562000115573d6000803e3d6000fd5b505050506040513d60208110156200012c57600080fd5b505160408051632c6f4d6f60e11b815290519192506000916001600160a01b038616916358de9ade916004808301926020929190829003018186803b1580156200017557600080fd5b505afa1580156200018a573d6000803e3d6000fd5b505050506040513d6020811015620001a157600080fd5b50516001600160601b0319606084811b821660805285811b821660a05286811b821660c05282901b1660e052604080516303e1469160e61b815290519192506001600160a01b0383169163f851a44091600480820192602092909190829003018186803b1580156200021257600080fd5b505afa15801562000227573d6000803e3d6000fd5b505050506040513d60208110156200023e57600080fd5b505160601b6001600160601b0319166101005260408051635c3dab0b60e11b815290516001600160a01b0385169163b87b5616916004808301926020929190829003018186803b1580156200029257600080fd5b505afa158015620002a7573d6000803e3d6000fd5b505050506040513d6020811015620002be57600080fd5b505161012052604080516321609bbf60e01b815290516001600160a01b038516916321609bbf916004808301926020929190829003018186803b1580156200030557600080fd5b505afa1580156200031a573d6000803e3d6000fd5b505050506040513d60208110156200033157600080fd5b505161014052604080516303f7d6c760e51b815290516001600160a01b03851691637efad8e0916004808301926020929190829003018186803b1580156200037857600080fd5b505afa1580156200038d573d6000803e3d6000fd5b505050506040513d6020811015620003a457600080fd5b505161016052505060001960025550506001600160601b031960609190911b16610180525060805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205161014051610160516101805160601c61111162000470600039806105fa5280610c525280610d6b5250806108375250806108165250806107995280610883525080610383528061053f528061063e5280610a725250806104225280610727525080610979525080610e4a5280610f47525080610c165280610d3252506111116000f3fe6080604052600436106100d25760003560e01c80639c868ac01161007f578063ae35ebfb11610059578063ae35ebfb14610265578063c2c4c5c11461027a578063cd6dc68714610282578063d34fb267146102c8576100d2565b80639c868ac0146102265780639f8676711461023b578063ab8f094514610250576100d2565b80631b88094d116100b05780631b88094d1461017f5780634b820093146101bd57806383f5c39b14610211576100d2565b806309400707146100d757806310d3eb041461012957806314e956f514610155575b600080fd5b3480156100e357600080fd5b50610117600480360360208110156100fa57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166102dd565b60408051918252519081900360200190f35b34801561013557600080fd5b506101536004803603602081101561014c57600080fd5b503561036b565b005b34801561016157600080fd5b506101176004803603602081101561017857600080fd5b503561041b565b34801561018b57600080fd5b506101946104e9565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101c957600080fd5b506101fd600480360360208110156101e057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610506565b604080519115158252519081900360200190f35b34801561021d57600080fd5b5061011761050c565b34801561023257600080fd5b506101fd610512565b34801561024757600080fd5b5061011761051b565b34801561025c57600080fd5b50610153610527565b34801561027157600080fd5b506101946105f8565b6101fd61061c565b34801561028e57600080fd5b50610153600480360360408110156102a557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610a09565b3480156102d457600080fd5b50610153610a5a565b600073ffffffffffffffffffffffffffffffffffffffff8216301461036357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060045490565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461040f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b61041881610b28565b50565b60006104e37f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9430856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b1580156104af57600080fd5b505afa1580156104c3573d6000803e3d6000fd5b505050506040513d60208110156104d957600080fd5b5051600654610bc4565b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff165b90565b50600190565b60065490565b60055460ff1690565b670de0b6b3a764000081565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146105cb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610626610bd0565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106ca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b60025460006106d7610be9565b9050808210156109fb57604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b15801561076e57600080fd5b505af1158015610782573d6000803e3d6000fd5b5050600180546003549590910194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff0181101561090e57848111156107d35761090e565b62093a8081026000806107e58361041b565b90508285101580156107fb57508262093a800185105b156108b457828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000089028161085f57fe5b04975062093a80819003670de0b6b3a7640000838a02820260018b905560038990557f000000000000000000000000000000000000000000000000000000000000000090980197049390930192506108c99050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a2509390930192506001016107bb565b5060028490556004805483019055811580159061092e575060055460ff16155b156109f757604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b1580156109c157600080fd5b505af11580156109d5573d6000803e3d6000fd5b505050506040513d60208110156109eb57600080fd5b506109f7905082610c14565b5050505b600192505050610503610dd0565b610a1281610dd7565b50600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610afe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b670de0b6b3a7640000811115610b89576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806110846034913960400191505060405180910390fd5b60068190556040805182815290517f13e45870490f54cea50d245930d12102c72b502641ef6850d0b15a8c92decfb29181900360200190a150565b80820390821102900390565b610be260026000541415610190610fe9565b6002600055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610cc557600080fd5b505af1158015610cd9573d6000803e3d6000fd5b505050506040513d6020811015610cef57600080fd5b5050600754604080517fad58bdd100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015292831660248201526044810184905290517f00000000000000000000000000000000000000000000000000000000000000009092169163ad58bdd19160648082019260009290919082900301818387803b158015610db557600080fd5b505af1158015610dc9573d6000803e3d6000fd5b5050505050565b6001600055565b60025415610e4657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610eae57600080fd5b505afa158015610ec2573d6000803e3d6000fd5b505050506040513d6020811015610ed857600080fd5b5051905080610f32576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806110b86024913960400191505060405180910390fd5b6001819055610f3f610be9565b6002819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610fad57600080fd5b505af1158015610fc1573d6000803e3d6000fd5b505050506040513d6020811015610fd757600080fd5b5051600355610fe582610b28565b5050565b81610fe5577f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b604452610fe5918391610418917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fdfe52656c61746976652077656967687420636170206578636565647320616c6c6f776564206162736f6c757465206d6178696d756d42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a26469706673582212207fd48c516478e0541d586fd93ad8c2252c504a829cddc6a4fc5f1fdb33aae09264736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80630ecaea731461004657806339312dee146100a8578063ce3cc8bd146100b0575b600080fd5b61007f6004803603604081101561005c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356100f7565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61007f610195565b6100e3600480360360208110156100c657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166101b1565b604080519115158252519081900360200190f35b6000806101026101e0565b90508073ffffffffffffffffffffffffffffffffffffffff1663cd6dc68785856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561017557600080fd5b505af1158015610189573d6000803e3d6000fd5b50929695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff165b919050565b6000805481906102059073ffffffffffffffffffffffffffffffffffffffff16610286565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff81166101db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f455243313136373a20637265617465206661696c656400000000000000000000604482015290519081900360640190fdfea2646970667358221220231818eb8ffaa79cc74f33b508e390b994f12719e0894efd0f4f15f7f821bd0864736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230217-gnosis-root-gauge-factory/index.ts b/balpy/balancer-deployments/tasks/20230217-gnosis-root-gauge-factory/index.ts new file mode 100644 index 0000000..624d5a8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230217-gnosis-root-gauge-factory/index.ts @@ -0,0 +1,14 @@ +import { Task, TaskRunOptions } from '@src'; +import { GnosisRootGaugeFactoryDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as GnosisRootGaugeFactoryDeployment; + + const args = [input.BalancerMinter, input.GnosisBridge]; + + const factory = await task.deployAndVerify('GnosisRootGaugeFactory', args, from, force); + + const implementation = await factory.getGaugeImplementation(); + await task.verify('GnosisRootGauge', implementation, [input.BalancerMinter, input.GnosisBridge]); + await task.save({ GnosisRootGauge: implementation }); +}; diff --git a/balpy/balancer-deployments/tasks/20230217-gnosis-root-gauge-factory/input.ts b/balpy/balancer-deployments/tasks/20230217-gnosis-root-gauge-factory/input.ts new file mode 100644 index 0000000..062d386 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230217-gnosis-root-gauge-factory/input.ts @@ -0,0 +1,17 @@ +import { Task, TaskMode } from '@src'; + +export type GnosisRootGaugeFactoryDeployment = { + BalancerMinter: string; + GnosisBridge: string; +}; + +const BalancerMinter = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); + +export default { + mainnet: { + BalancerMinter, + // This contract is the "Mediator" contract listed at the below link: + // https://docs.tokenbridge.net/eth-xdai-amb-bridge/multi-token-extension + GnosisBridge: '0x88ad09518695c6c3712ac10a214be5109a655671', + }, +}; diff --git a/balpy/balancer-deployments/tasks/20230217-gnosis-root-gauge-factory/output/mainnet.json b/balpy/balancer-deployments/tasks/20230217-gnosis-root-gauge-factory/output/mainnet.json new file mode 100644 index 0000000..f218881 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230217-gnosis-root-gauge-factory/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "GnosisRootGaugeFactory": "0x2a18B396829bc29F66a1E59fAdd7a0269A6605E8", + "GnosisRootGauge": "0x05277CE7D1e365d660624612d8b8b9B55bFD4518" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230217-gnosis-root-gauge-factory/readme.md b/balpy/balancer-deployments/tasks/20230217-gnosis-root-gauge-factory/readme.md new file mode 100644 index 0000000..7e72747 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230217-gnosis-root-gauge-factory/readme.md @@ -0,0 +1,8 @@ +# 2023-02-17 - Gnosis Root Gauge Factory + +Deployment of the `GnosisRootGaugeFactory`, for stakeless gauges that bridge funds to their Gnosis counterparts. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [`GnosisRootGaugeFactory` artifact](./artifact/GnosisRootGaugeFactory.json) diff --git a/balpy/balancer-deployments/tasks/20230217-gnosis-root-gauge-factory/test/task.fork.ts b/balpy/balancer-deployments/tasks/20230217-gnosis-root-gauge-factory/test/task.fork.ts new file mode 100644 index 0000000..db1b7a5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230217-gnosis-root-gauge-factory/test/task.fork.ts @@ -0,0 +1,315 @@ +import hre, { ethers } from 'hardhat'; +import { defaultAbiCoder } from '@ethersproject/abi'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { GaugeType } from '@helpers/models/types/types'; +import { BigNumber, fp, FP_ONE } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { advanceTime, currentTimestamp, currentWeekTimestamp, DAY, WEEK, MONTH } from '@helpers/time'; +import * as expectEvent from '@helpers/expectEvent'; + +import { Task, TaskMode } from '@src'; +import { getForkedNetwork } from '@src'; +import { getSigner, impersonate } from '@src'; +import { expectEqualWithError } from '@helpers/relativeError'; +import { ZERO_ADDRESS, MAX_UINT256 } from '@helpers/constants'; +import { range } from 'lodash'; +import { expectTransferEvent } from '@helpers/expectTransfer'; +import { describeForkTest } from '@src'; +import { WeightedPoolEncoder } from '@helpers/models/pools/weighted/encoder'; + +describeForkTest('GnosisRootGaugeFactory', 'mainnet', 16627100, function () { + let veBALHolder: SignerWithAddress, admin: SignerWithAddress, recipient: SignerWithAddress; + let factory: Contract, gauge: Contract; + let vault: Contract, + authorizer: Contract, + authorizerAdaptor: Contract, + BALTokenAdmin: Contract, + gaugeController: Contract, + veBAL: Contract, + bal80weth20Pool: Contract; + let BAL: string; + let task: Task; + + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + + const VEBAL_POOL = '0x5c6ee304399dbdb9c8ef030ab642b10820db8f56'; + const VAULT_BOUNTY = fp(1000); + + const weightCap = fp(0.001); + + before('run task', async () => { + task = new Task('20230217-gnosis-root-gauge-factory', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('GnosisRootGaugeFactory'); + }); + + before('advance time', async () => { + // This causes all voting cooldowns to expire, letting the veBAL holder vote again + await advanceTime(DAY * 12); + }); + + before('setup accounts', async () => { + admin = await getSigner(0); + recipient = await getSigner(1); + + veBALHolder = await impersonate((await getSigner(2)).address, VAULT_BOUNTY.add(fp(5))); // plus gas + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.deployedInstance('Vault'); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + + const authorizerAdaptorTask = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizerAdaptor = await authorizerAdaptorTask.deployedInstance('AuthorizerAdaptor'); + + const balancerTokenAdminTask = new Task('20220325-balancer-token-admin', TaskMode.READ_ONLY, getForkedNetwork(hre)); + BALTokenAdmin = await balancerTokenAdminTask.deployedInstance('BalancerTokenAdmin'); + + BAL = await BALTokenAdmin.getBalancerToken(); + + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeController = await gaugeControllerTask.deployedInstance('GaugeController'); + }); + + before('update balancer token admin rate', async () => { + // We move forward past the BAL minting epoch, so that it doesn't fall in the middle of the 'multiple weeks' test, + // resulting in variable rates. + + await advanceTime(WEEK * 5); + await BALTokenAdmin.update_mining_parameters(); + }); + + before('create veBAL whale', async () => { + const veBALTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + veBAL = await veBALTask.instanceAt('VotingEscrow', veBALTask.output({ network: 'mainnet' }).VotingEscrow); + + const weightedPoolTask = new Task('20210418-weighted-pool', TaskMode.READ_ONLY, getForkedNetwork(hre)); + bal80weth20Pool = await weightedPoolTask.instanceAt('WeightedPool2Tokens', VEBAL_POOL); + + const poolId = await bal80weth20Pool.getPoolId(); + + await vault.connect(veBALHolder).joinPool( + poolId, + veBALHolder.address, + veBALHolder.address, + { + assets: [BAL, ZERO_ADDRESS], + maxAmountsIn: [0, VAULT_BOUNTY], + fromInternalBalance: false, + userData: WeightedPoolEncoder.joinExactTokensInForBPTOut([0, VAULT_BOUNTY], 0), + }, + { value: VAULT_BOUNTY } + ); + + await bal80weth20Pool.connect(veBALHolder).approve(veBAL.address, MAX_UINT256); + const currentTime = await currentTimestamp(); + await veBAL + .connect(veBALHolder) + .create_lock(await bal80weth20Pool.balanceOf(veBALHolder.address), currentTime.add(MONTH * 12)); + }); + + it('create gauge', async () => { + const tx = await factory.create(recipient.address, weightCap); + const event = expectEvent.inReceipt(await tx.wait(), 'GaugeCreated'); + + gauge = await task.instanceAt('GnosisRootGauge', event.args.gauge); + + expect(await factory.isGaugeFromFactory(gauge.address)).to.be.true; + expect(await gauge.getRecipient()).to.equal(recipient.address); + }); + + it('grant permissions', async () => { + // We need to grant permission to the admin to add gauges to the GaugeController. + const govMultisig = await impersonate(GOV_MULTISIG, fp(100)); + + await authorizer + .connect(govMultisig) + .grantRole(await authorizerAdaptor.getActionId(gauge.interface.getSighash('checkpoint')), admin.address); + + await authorizer + .connect(govMultisig) + .grantRole( + await authorizerAdaptor.getActionId(gaugeController.interface.getSighash('add_type(string,uint256)')), + admin.address + ); + + await authorizer + .connect(govMultisig) + .grantRole( + await authorizerAdaptor.getActionId(gaugeController.interface.getSighash('add_gauge(address,int128)')), + admin.address + ); + }); + + it('add gauge to gauge controller', async () => { + // Add gauge directly through the controller, since we can't use GaugeAdder V3 without the TimelockAuthorizer + + await authorizerAdaptor + .connect(admin) + .performAction( + gaugeController.address, + gaugeController.interface.encodeFunctionData('add_type(string,uint256)', ['Gnosis', 1]) + ); + + await authorizerAdaptor + .connect(admin) + .performAction( + gaugeController.address, + gaugeController.interface.encodeFunctionData('add_gauge(address,int128)', [gauge.address, GaugeType.Gnosis]) + ); + + expect(await gaugeController.gauge_exists(gauge.address)).to.be.true; + }); + + it('vote for gauge', async () => { + expect(await gaugeController.get_gauge_weight(gauge.address)).to.equal(0); + expect(await gauge.getCappedRelativeWeight(await currentTimestamp())).to.equal(0); + + await gaugeController.connect(veBALHolder).vote_for_gauge_weights(gauge.address, 10000); // Max voting power is 10k points + + // We now need to go through an epoch for the votes to be locked in + await advanceTime(DAY * 8); + + await gaugeController.checkpoint(); + + // Gauge weight is equal to the cap, and controller weight for the gauge is greater than the cap. + expect( + await gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, await currentWeekTimestamp()) + ).to.be.gt(weightCap); + expect(await gauge.getCappedRelativeWeight(await currentTimestamp())).to.equal(weightCap); + }); + + it('mint & bridge tokens', async () => { + // The gauge has votes for this week, and it will mint the first batch of tokens. We store the current gauge + // relative weight, as it will change as time goes by due to vote decay. + const firstMintWeekTimestamp = await currentWeekTimestamp(); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + + // Even though the gauge has relative weight, it cannot mint yet as it needs for the epoch to finish + const zeroMintTx = await authorizerAdaptor.connect(admin).performAction(gauge.address, calldata); + expectEvent.inIndirectReceipt(await zeroMintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp.sub(WEEK), // Process past week, which had zero votes + periodEmissions: 0, + }); + // No token transfers are performed if the emissions are zero, but we can't test for a lack of those + + await advanceTime(WEEK); + + // The gauge should now mint and send all minted tokens to the Gnosis bridge + const mintTx = await authorizerAdaptor.connect(admin).performAction(gauge.address, calldata); + const event = expectEvent.inIndirectReceipt(await mintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp, + }); + const actualEmissions = event.args.periodEmissions; + + // The amount of tokens minted should equal the weekly emissions rate times the relative weight of the gauge + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + + const expectedEmissions = weightCap.mul(weeklyRate).div(FP_ONE); + expectEqualWithError(actualEmissions, expectedEmissions, 0.001); + + // Tokens are minted for the gauge + expectTransferEvent( + await mintTx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + value: actualEmissions, + }, + BAL + ); + + // And the gauge then deposits those in the predicate via the bridge mechanism + const bridgeInterface = new ethers.utils.Interface([ + 'event TokensBridgingInitiated(address indexed token, address indexed sender, uint256 value, bytes32 indexed messageId)', + ]); + + expectEvent.inIndirectReceipt(await mintTx.wait(), bridgeInterface, 'TokensBridgingInitiated', { + token: BAL, + sender: gauge.address, + value: actualEmissions, + }); + }); + + it('mint multiple weeks', async () => { + const numberOfWeeks = 5; + await advanceTime(WEEK * numberOfWeeks); + await gaugeController.checkpoint_gauge(gauge.address); + + const weekTimestamp = await currentWeekTimestamp(); + + // We can query the relative weight of the gauge for each of the weeks that have passed + const relativeWeights: BigNumber[] = await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, weekTimestamp.sub(WEEK * weekIndex)) + ) + ); + + // We require that they're all above the cap for simplicity - this lets us use the cap as each week's weight (and + // also tests cap behavior). + for (const relativeWeight of relativeWeights) { + expect(relativeWeight).to.be.gt(weightCap); + } + + // The amount of tokens minted should equal the sum of the weekly emissions rate times the relative weight of the + // gauge (this assumes we're not crossing an emissions rate epoch so that the inflation remains constant). + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + const expectedEmissions = weightCap.mul(numberOfWeeks).mul(weeklyRate).div(FP_ONE); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + const tx = await authorizerAdaptor.connect(admin).performAction(gauge.address, calldata); + + await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + expectEvent.inIndirectReceipt(await tx.wait(), gauge.interface, 'Checkpoint', { + periodTime: weekTimestamp.sub(WEEK * weekIndex), + }) + ) + ); + + // Tokens are minted for the gauge + const transferEvent = expectTransferEvent( + await tx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + }, + BAL + ); + + expect(transferEvent.args.value).to.be.almostEqual(expectedEmissions); + + // And the gauge then deposits those in the predicate via the bridge mechanism + const bridgeInterface = new ethers.utils.Interface([ + 'event TokensBridgingInitiated(address indexed token, address indexed sender, uint256 value, bytes32 indexed messageId)', + ]); + + const depositEvent = expectEvent.inIndirectReceipt(await tx.wait(), bridgeInterface, 'TokensBridgingInitiated', { + token: BAL, + sender: gauge.address, + }); + + expect(depositEvent.args.value).to.be.almostEqual(expectedEmissions); + + // The TokensBridgingInitiated event unfortunately doesn't include the L2 recipient address, so we check that by + // looking at some of the data encoded in the UserRequestForAffirmation event. Said data is relatively complicated, + // but the last bytes seem to be the ABI encoding of (token, recipient, amount). This is based on the event at index + // 261 of mainnet transaction 0x6a0dcbf72db757f83bf1c9b42e5f940c31e3240479614635fcbe5a5f72091692. + const ambInterface = new ethers.utils.Interface([ + 'event UserRequestForAffirmation(bytes32 indexed messageId, bytes encodedData)', + ]); + + const userRequestEvent = expectEvent.inIndirectReceipt(await tx.wait(), ambInterface, 'UserRequestForAffirmation'); + + const expectedPartialEncodedData = defaultAbiCoder.encode( + ['address', 'address', 'uint256'], + [BAL, recipient.address, depositEvent.args.value] + ); + + // Remove the leading 0x when testing for substring inclusion + expect(userRequestEvent.args.encodedData).to.include(expectedPartialEncodedData.slice(2)); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/artifact/MerkleOrchard.json b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/artifact/MerkleOrchard.json new file mode 100644 index 0000000..467f934 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/artifact/MerkleOrchard.json @@ -0,0 +1,458 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "MerkleOrchard", + "sourceName": "contracts/MerkleOrchard.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "distributor", + "type": "address" + }, + { + "indexed": true, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "distributionId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "merkleRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "DistributionAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "distributor", + "type": "address" + }, + { + "indexed": true, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "distributionId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "claimer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "DistributionClaimed", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "claimer", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "distributionId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "address", + "name": "distributor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenIndex", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "internalType": "struct MerkleOrchard.Claim[]", + "name": "claims", + "type": "tuple[]" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "claimDistributions", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "claimer", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "distributionId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "address", + "name": "distributor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenIndex", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "internalType": "struct MerkleOrchard.Claim[]", + "name": "claims", + "type": "tuple[]" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "claimDistributionsToInternalBalance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "claimer", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "distributionId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "address", + "name": "distributor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenIndex", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "internalType": "struct MerkleOrchard.Claim[]", + "name": "claims", + "type": "tuple[]" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "contract IDistributorCallback", + "name": "callbackContract", + "type": "address" + }, + { + "internalType": "bytes", + "name": "callbackData", + "type": "bytes" + } + ], + "name": "claimDistributionsWithCallback", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "merkleRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "distributionId", + "type": "uint256" + } + ], + "name": "createDistribution", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "distributor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "distributionId", + "type": "uint256" + } + ], + "name": "getDistributionRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "distributor", + "type": "address" + } + ], + "name": "getNextDistributionId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "distributor", + "type": "address" + } + ], + "name": "getRemainingBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "distributor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "distributionId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "claimer", + "type": "address" + } + ], + "name": "isClaimed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "distributor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "distributionId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "claimer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "claimedBalance", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "name": "verifyClaim", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a060405234801561001057600080fd5b506040516118fe3803806118fe83398101604081905261002f91610044565b60601b6001600160601b031916608052610072565b600060208284031215610055578081fd5b81516001600160a01b038116811461006b578182fd5b9392505050565b60805160601c61186f61008f600039806102dc525061186f6000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c80638d928af811610076578063ece123541161005b578063ece123541461016f578063fb97812814610182578063fea7364914610195576100be565b80638d928af814610147578063a68d1e9d1461015c576100be565b806362c8b7c9116100a757806362c8b7c91461010157806381ae8541146101145780638bf3e45714610134576100be565b80632b630140146100c3578063515ac052146100d8575b600080fd5b6100d66100d1366004611114565b6101a8565b005b6100eb6100e6366004611301565b6101bb565b6040516100f891906115d0565b60405180910390f35b6100eb61010f366004611353565b610226565b610127610122366004611289565b61024e565b6040516100f891906115db565b6100d6610142366004611114565b610274565b61014f6102da565b6040516100f89190611631565b6100d661016a366004611187565b6102fe565b6100d661017d3660046113d8565b6103e9565b610127610190366004611289565b6106a2565b6101276101a33660046112c1565b6106c6565b6101b68384848460006106f7565b505050565b60008060006101c985610a9a565b9150915060006101d98888610aa8565b600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8916845282528083209583529490529290922054600190911b161515915050949350505050565b6000806102338888610aa8565b90506102428187878787610adb565b98975050505050505050565b60008061025b8484610aa8565b6000908152600360205260409020549150505b92915050565b3373ffffffffffffffffffffffffffffffffffffffff8416146102cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c390611754565b60405180910390fd5b6101b68384848460016106f7565b7f000000000000000000000000000000000000000000000000000000000000000090565b3373ffffffffffffffffffffffffffffffffffffffff87161461034d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c390611754565b61035b8684878760016106f7565b6040517f55c524c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906355c524c1906103af90859085906004016115e4565b600060405180830381600087803b1580156103c957600080fd5b505af11580156103dd573d6000803e3d6000fd5b50505050505050505050565b3360006103f68683610aa8565b6000818152602081905260409020549091508314806104215750600081815260208190526040902054155b610457576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c390611652565b61047973ffffffffffffffffffffffffffffffffffffffff8716833087610b56565b8573ffffffffffffffffffffffffffffffffffffffff1663095ea7b361049d6102da565b866040518363ffffffff1660e01b81526004016104bb929190611513565b602060405180830381600087803b1580156104d557600080fd5b505af11580156104e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050d9190611262565b50604080516001808252818301909252606091816020015b61052d610ed8565b8152602001906001900390816105255750506040805160a081018252600080825273ffffffffffffffffffffffffffffffffffffffff8b1660208301529181018890523060608201819052608082015282519293509183919061058c57fe5b602002602001018190525061059f6102da565b73ffffffffffffffffffffffffffffffffffffffff16630e8e3e84826040518263ffffffff1660e01b81526004016105d79190611539565b600060405180830381600087803b1580156105f157600080fd5b505af1158015610605573d6000803e3d6000fd5b505050600083815260036020908152604080832080548a019055600180835281842089855283528184208b9055868452918390529182902090870190555173ffffffffffffffffffffffffffffffffffffffff808a1692508516907f24a80c4e3ef74c732b163bfb2decfbe077a51aef3b708c93f8ef3dd06fc3ea7c906106919088908b908b906117b7565b60405180910390a350505050505050565b6000806106af8484610aa8565b600090815260208190526040902054949350505050565b6000806106d38585610aa8565b60009081526001602090815260408083208684529091529020549150509392505050565b6060825167ffffffffffffffff8111801561071157600080fd5b5060405190808252806020026020018201604052801561073b578160200160208202803683370190505b509050610746610f08565b60005b85518110156108ec5785818151811061075e57fe5b602002602001015191506000806107788460000151610a9a565b9150915060006107a38886606001518151811061079157fe5b60200260200101518660400151610aa8565b90506001821b6107b5828d8684610bff565b6107c3828760200151610cb3565b6107dc8287600001518e89602001518a60800151610adb565b610812576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c39061171d565b85602001518787606001518151811061082757fe5b6020026020010181815101915081815250508b73ffffffffffffffffffffffffffffffffffffffff168987606001518151811061086057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16876040015173ffffffffffffffffffffffffffffffffffffffff167ff3f33f2319d28d6a1402aa9e6ca0ae16d3ada035d576b3b8074b422aaa03b69889600001518f8b602001516040516108d49392919061178b565b60405180910390a45050600190920191506107499050565b506000836108fb5760016108fe565b60025b90506060855167ffffffffffffffff8111801561091a57600080fd5b5060405190808252806020026020018201604052801561095457816020015b610941610ed8565b8152602001906001900390816109395790505b50905060005b8651811015610a1c576040518060a0016040528084600381111561097a57fe5b815260200188838151811061098b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018683815181106109ba57fe5b602002602001015181526020013073ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff16815250828281518110610a0957fe5b602090810291909101015260010161095a565b50610a256102da565b73ffffffffffffffffffffffffffffffffffffffff16630e8e3e84826040518263ffffffff1660e01b8152600401610a5d9190611539565b600060405180830381600087803b158015610a7757600080fd5b505af1158015610a8b573d6000803e3d6000fd5b50505050505050505050505050565b61010081049160ff90911690565b60008282604051602001610abd9291906114a8565b60405160208183030381529060405280519060200120905092915050565b6000808484604051602001610af192919061142c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008a8152600184528281208a8252909352912054909150610b4b90849083610d14565b979650505050505050565b610bf9846323b872dd60e01b858585604051602401610b77939291906114e2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610db1565b50505050565b600084815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452825280832085845290915290205481811615610c71576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c390611689565b600094855260026020908152604080872073ffffffffffffffffffffffffffffffffffffffff9096168752948152848620938652929092529190922091179055565b600082815260036020526040902054811115610cfb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c3906116c0565b6000918252600360205260409091208054919091039055565b600081815b8551811015610da6576000868281518110610d3057fe5b60200260200101519050808311610d71578281604051602001610d54929190611461565b604051602081830303815290604052805190602001209250610d9d565b8083604051602001610d84929190611461565b6040516020818303038152906040528051906020012092505b50600101610d19565b509092149392505050565b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051610dda919061146f565b6000604051808303816000865af19150503d8060008114610e17576040519150601f19603f3d011682016040523d82523d6000602084013e610e1c565b606091505b50915091506000821415610e34573d6000803e3d6000fd5b610bf9815160001480610e56575081806020019051810190610e569190611262565b6101a281610e6757610e6781610e6b565b5050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b6040518060a001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b803561026e81611814565b600082601f830112610f68578081fd5b8135610f7b610f76826117f4565b6117cd565b818152915060208083019084810181840286018201871015610f9c57600080fd5b60005b84811015610fbb57813584529282019290820190600101610f9f565b505050505092915050565b600082601f830112610fd6578081fd5b8135610fe4610f76826117f4565b81815291506020808301908481018184028601820187101561100557600080fd5b60005b84811015610fbb57813561101b81611814565b84529282019290820190600101611008565b600082601f83011261103d578081fd5b813561104b610f76826117f4565b818152915060208083019084810160005b84811015610fbb578135870160a0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561109b57600080fd5b6110a4816117cd565b8583013581526040808401358783015260606110c28d828701610f4d565b828401526080915081850135818401525082840135925067ffffffffffffffff8311156110ee57600080fd5b6110fc8c8885870101610f58565b9082015286525050928201929082019060010161105c565b600080600060608486031215611128578283fd5b833561113381611814565b9250602084013567ffffffffffffffff8082111561114f578384fd5b61115b8783880161102d565b93506040860135915080821115611170578283fd5b5061117d86828701610fc6565b9150509250925092565b60008060008060008060a0878903121561119f578182fd5b86356111aa81611814565b9550602087013567ffffffffffffffff808211156111c6578384fd5b6111d28a838b0161102d565b965060408901359150808211156111e7578384fd5b6111f38a838b01610fc6565b95506060890135915061120582611814565b9093506080880135908082111561121a578384fd5b818901915089601f83011261122d578384fd5b81358181111561123b578485fd5b8a602082850101111561124c578485fd5b6020830194508093505050509295509295509295565b600060208284031215611273578081fd5b81518015158114611282578182fd5b9392505050565b6000806040838503121561129b578182fd5b82356112a681611814565b915060208301356112b681611814565b809150509250929050565b6000806000606084860312156112d5578283fd5b83356112e081611814565b925060208401356112f081611814565b929592945050506040919091013590565b60008060008060808587031215611316578384fd5b843561132181611814565b9350602085013561133181611814565b925060408501359150606085013561134881611814565b939692955090935050565b60008060008060008060c0878903121561136b578182fd5b863561137681611814565b9550602087013561138681611814565b945060408701359350606087013561139d81611814565b92506080870135915060a087013567ffffffffffffffff8111156113bf578182fd5b6113cb89828a01610f58565b9150509295509295509295565b600080600080608085870312156113ed578182fd5b84356113f881611814565b966020860135965060408601359560600135945092505050565b73ffffffffffffffffffffffffffffffffffffffff169052565b60609290921b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168252601482015260340190565b918252602082015260400190565b60008251815b8181101561148f5760208186018101518583015201611475565b8181111561149d5782828501525b509190910192915050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606093841b811682529190921b16601482015260280190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b828110156115c357815180516004811061156c57fe5b85528087015161157e88870182611412565b50858101518686015260608082015161159982880182611412565b5050608090810151906115ae86820183611412565b505060a0939093019290850190600101611556565b5091979650505050505050565b901515815260200190565b90815260200190565b60006020825282602083015282846040840137818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60208082526017908201527f696e76616c696420646973747269627574696f6e204944000000000000000000604082015260600190565b60208082526012908201527f63616e6e6f7420636c61696d2074776963650000000000000000000000000000604082015260600190565b60208082526037908201527f6469737472696275746f72206861736e27742070726f7669646564207375666660408201527f696369656e7420746f6b656e7320666f7220636c61696d000000000000000000606082015260800190565b60208082526016908201527f696e636f7272656374206d65726b6c652070726f6f6600000000000000000000604082015260600190565b6020808252601b908201527f75736572206d75737420636c61696d206f776e2062616c616e63650000000000604082015260600190565b92835273ffffffffffffffffffffffffffffffffffffffff919091166020830152604082015260600190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff811182821017156117ec57600080fd5b604052919050565b600067ffffffffffffffff82111561180a578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff8116811461183657600080fd5b5056fea264697066735822122049716b4e8fcc2f0204a76e048a56845fb4229db0b0ede50964734901df638dc564736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100be5760003560e01c80638d928af811610076578063ece123541161005b578063ece123541461016f578063fb97812814610182578063fea7364914610195576100be565b80638d928af814610147578063a68d1e9d1461015c576100be565b806362c8b7c9116100a757806362c8b7c91461010157806381ae8541146101145780638bf3e45714610134576100be565b80632b630140146100c3578063515ac052146100d8575b600080fd5b6100d66100d1366004611114565b6101a8565b005b6100eb6100e6366004611301565b6101bb565b6040516100f891906115d0565b60405180910390f35b6100eb61010f366004611353565b610226565b610127610122366004611289565b61024e565b6040516100f891906115db565b6100d6610142366004611114565b610274565b61014f6102da565b6040516100f89190611631565b6100d661016a366004611187565b6102fe565b6100d661017d3660046113d8565b6103e9565b610127610190366004611289565b6106a2565b6101276101a33660046112c1565b6106c6565b6101b68384848460006106f7565b505050565b60008060006101c985610a9a565b9150915060006101d98888610aa8565b600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8916845282528083209583529490529290922054600190911b161515915050949350505050565b6000806102338888610aa8565b90506102428187878787610adb565b98975050505050505050565b60008061025b8484610aa8565b6000908152600360205260409020549150505b92915050565b3373ffffffffffffffffffffffffffffffffffffffff8416146102cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c390611754565b60405180910390fd5b6101b68384848460016106f7565b7f000000000000000000000000000000000000000000000000000000000000000090565b3373ffffffffffffffffffffffffffffffffffffffff87161461034d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c390611754565b61035b8684878760016106f7565b6040517f55c524c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906355c524c1906103af90859085906004016115e4565b600060405180830381600087803b1580156103c957600080fd5b505af11580156103dd573d6000803e3d6000fd5b50505050505050505050565b3360006103f68683610aa8565b6000818152602081905260409020549091508314806104215750600081815260208190526040902054155b610457576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c390611652565b61047973ffffffffffffffffffffffffffffffffffffffff8716833087610b56565b8573ffffffffffffffffffffffffffffffffffffffff1663095ea7b361049d6102da565b866040518363ffffffff1660e01b81526004016104bb929190611513565b602060405180830381600087803b1580156104d557600080fd5b505af11580156104e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050d9190611262565b50604080516001808252818301909252606091816020015b61052d610ed8565b8152602001906001900390816105255750506040805160a081018252600080825273ffffffffffffffffffffffffffffffffffffffff8b1660208301529181018890523060608201819052608082015282519293509183919061058c57fe5b602002602001018190525061059f6102da565b73ffffffffffffffffffffffffffffffffffffffff16630e8e3e84826040518263ffffffff1660e01b81526004016105d79190611539565b600060405180830381600087803b1580156105f157600080fd5b505af1158015610605573d6000803e3d6000fd5b505050600083815260036020908152604080832080548a019055600180835281842089855283528184208b9055868452918390529182902090870190555173ffffffffffffffffffffffffffffffffffffffff808a1692508516907f24a80c4e3ef74c732b163bfb2decfbe077a51aef3b708c93f8ef3dd06fc3ea7c906106919088908b908b906117b7565b60405180910390a350505050505050565b6000806106af8484610aa8565b600090815260208190526040902054949350505050565b6000806106d38585610aa8565b60009081526001602090815260408083208684529091529020549150509392505050565b6060825167ffffffffffffffff8111801561071157600080fd5b5060405190808252806020026020018201604052801561073b578160200160208202803683370190505b509050610746610f08565b60005b85518110156108ec5785818151811061075e57fe5b602002602001015191506000806107788460000151610a9a565b9150915060006107a38886606001518151811061079157fe5b60200260200101518660400151610aa8565b90506001821b6107b5828d8684610bff565b6107c3828760200151610cb3565b6107dc8287600001518e89602001518a60800151610adb565b610812576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c39061171d565b85602001518787606001518151811061082757fe5b6020026020010181815101915081815250508b73ffffffffffffffffffffffffffffffffffffffff168987606001518151811061086057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16876040015173ffffffffffffffffffffffffffffffffffffffff167ff3f33f2319d28d6a1402aa9e6ca0ae16d3ada035d576b3b8074b422aaa03b69889600001518f8b602001516040516108d49392919061178b565b60405180910390a45050600190920191506107499050565b506000836108fb5760016108fe565b60025b90506060855167ffffffffffffffff8111801561091a57600080fd5b5060405190808252806020026020018201604052801561095457816020015b610941610ed8565b8152602001906001900390816109395790505b50905060005b8651811015610a1c576040518060a0016040528084600381111561097a57fe5b815260200188838151811061098b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018683815181106109ba57fe5b602002602001015181526020013073ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff16815250828281518110610a0957fe5b602090810291909101015260010161095a565b50610a256102da565b73ffffffffffffffffffffffffffffffffffffffff16630e8e3e84826040518263ffffffff1660e01b8152600401610a5d9190611539565b600060405180830381600087803b158015610a7757600080fd5b505af1158015610a8b573d6000803e3d6000fd5b50505050505050505050505050565b61010081049160ff90911690565b60008282604051602001610abd9291906114a8565b60405160208183030381529060405280519060200120905092915050565b6000808484604051602001610af192919061142c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008a8152600184528281208a8252909352912054909150610b4b90849083610d14565b979650505050505050565b610bf9846323b872dd60e01b858585604051602401610b77939291906114e2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610db1565b50505050565b600084815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452825280832085845290915290205481811615610c71576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c390611689565b600094855260026020908152604080872073ffffffffffffffffffffffffffffffffffffffff9096168752948152848620938652929092529190922091179055565b600082815260036020526040902054811115610cfb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c3906116c0565b6000918252600360205260409091208054919091039055565b600081815b8551811015610da6576000868281518110610d3057fe5b60200260200101519050808311610d71578281604051602001610d54929190611461565b604051602081830303815290604052805190602001209250610d9d565b8083604051602001610d84929190611461565b6040516020818303038152906040528051906020012092505b50600101610d19565b509092149392505050565b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051610dda919061146f565b6000604051808303816000865af19150503d8060008114610e17576040519150601f19603f3d011682016040523d82523d6000602084013e610e1c565b606091505b50915091506000821415610e34573d6000803e3d6000fd5b610bf9815160001480610e56575081806020019051810190610e569190611262565b6101a281610e6757610e6781610e6b565b5050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b6040518060a001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b803561026e81611814565b600082601f830112610f68578081fd5b8135610f7b610f76826117f4565b6117cd565b818152915060208083019084810181840286018201871015610f9c57600080fd5b60005b84811015610fbb57813584529282019290820190600101610f9f565b505050505092915050565b600082601f830112610fd6578081fd5b8135610fe4610f76826117f4565b81815291506020808301908481018184028601820187101561100557600080fd5b60005b84811015610fbb57813561101b81611814565b84529282019290820190600101611008565b600082601f83011261103d578081fd5b813561104b610f76826117f4565b818152915060208083019084810160005b84811015610fbb578135870160a0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561109b57600080fd5b6110a4816117cd565b8583013581526040808401358783015260606110c28d828701610f4d565b828401526080915081850135818401525082840135925067ffffffffffffffff8311156110ee57600080fd5b6110fc8c8885870101610f58565b9082015286525050928201929082019060010161105c565b600080600060608486031215611128578283fd5b833561113381611814565b9250602084013567ffffffffffffffff8082111561114f578384fd5b61115b8783880161102d565b93506040860135915080821115611170578283fd5b5061117d86828701610fc6565b9150509250925092565b60008060008060008060a0878903121561119f578182fd5b86356111aa81611814565b9550602087013567ffffffffffffffff808211156111c6578384fd5b6111d28a838b0161102d565b965060408901359150808211156111e7578384fd5b6111f38a838b01610fc6565b95506060890135915061120582611814565b9093506080880135908082111561121a578384fd5b818901915089601f83011261122d578384fd5b81358181111561123b578485fd5b8a602082850101111561124c578485fd5b6020830194508093505050509295509295509295565b600060208284031215611273578081fd5b81518015158114611282578182fd5b9392505050565b6000806040838503121561129b578182fd5b82356112a681611814565b915060208301356112b681611814565b809150509250929050565b6000806000606084860312156112d5578283fd5b83356112e081611814565b925060208401356112f081611814565b929592945050506040919091013590565b60008060008060808587031215611316578384fd5b843561132181611814565b9350602085013561133181611814565b925060408501359150606085013561134881611814565b939692955090935050565b60008060008060008060c0878903121561136b578182fd5b863561137681611814565b9550602087013561138681611814565b945060408701359350606087013561139d81611814565b92506080870135915060a087013567ffffffffffffffff8111156113bf578182fd5b6113cb89828a01610f58565b9150509295509295509295565b600080600080608085870312156113ed578182fd5b84356113f881611814565b966020860135965060408601359560600135945092505050565b73ffffffffffffffffffffffffffffffffffffffff169052565b60609290921b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168252601482015260340190565b918252602082015260400190565b60008251815b8181101561148f5760208186018101518583015201611475565b8181111561149d5782828501525b509190910192915050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606093841b811682529190921b16601482015260280190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b828110156115c357815180516004811061156c57fe5b85528087015161157e88870182611412565b50858101518686015260608082015161159982880182611412565b5050608090810151906115ae86820183611412565b505060a0939093019290850190600101611556565b5091979650505050505050565b901515815260200190565b90815260200190565b60006020825282602083015282846040840137818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60208082526017908201527f696e76616c696420646973747269627574696f6e204944000000000000000000604082015260600190565b60208082526012908201527f63616e6e6f7420636c61696d2074776963650000000000000000000000000000604082015260600190565b60208082526037908201527f6469737472696275746f72206861736e27742070726f7669646564207375666660408201527f696369656e7420746f6b656e7320666f7220636c61696d000000000000000000606082015260800190565b60208082526016908201527f696e636f7272656374206d65726b6c652070726f6f6600000000000000000000604082015260600190565b6020808252601b908201527f75736572206d75737420636c61696d206f776e2062616c616e63650000000000604082015260600190565b92835273ffffffffffffffffffffffffffffffffffffffff919091166020830152604082015260600190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff811182821017156117ec57600080fd5b604052919050565b600067ffffffffffffffff82111561180a578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff8116811461183657600080fd5b5056fea264697066735822122049716b4e8fcc2f0204a76e048a56845fb4229db0b0ede50964734901df638dc564736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/index.ts b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/index.ts new file mode 100644 index 0000000..c96a450 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { MerkleOrchardDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as MerkleOrchardDeployment; + + const merkleOrchardArgs = [input.Vault]; + await task.deployAndVerify('MerkleOrchard', merkleOrchardArgs, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/input.ts b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/input.ts new file mode 100644 index 0000000..85b4e3f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type MerkleOrchardDeployment = { + Vault: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, +}; diff --git a/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/output/arbitrum.json b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/output/arbitrum.json new file mode 100644 index 0000000..f54a506 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "MerkleOrchard": "0x9805dcfD25e6De36bad8fe9D3Fe2c9b44B764102" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/output/goerli.json b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/output/goerli.json new file mode 100644 index 0000000..b40df24 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/output/goerli.json @@ -0,0 +1,3 @@ +{ + "MerkleOrchard": "0x5cF4928a3205728bd12830E1840F7DB85c62a4B9" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/output/mainnet.json b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/output/mainnet.json new file mode 100644 index 0000000..f42d979 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "MerkleOrchard": "0xE3881627B8DeeBCCF9c23B291430a549Fc0bE5F7" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/output/polygon.json b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/output/polygon.json new file mode 100644 index 0000000..5123154 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/output/polygon.json @@ -0,0 +1,3 @@ +{ + "MerkleOrchard": "0xc3ccacE87f6d3A81724075ADcb5ddd85a8A1bB68" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/readme.md b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/readme.md new file mode 100644 index 0000000..a07179f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/readme.md @@ -0,0 +1,12 @@ +# 2023-02-22 - Merkle Orchard V2 + +Patch deployment of the `MerkleOrchard`, to distribute tokens via Merkle Trees. +This release supersedes [Merkle Orchard V1](../deprecated/20211012-merkle-orchard/), fixing the double-claim issue described in [this report](https://medium.com/immunefi/balancer-logic-error-bugfix-review-74f5edca8b1a). + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`MerkleOrchard` artifact](./artifact/MerkleOrchard.json) diff --git a/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/test/data/ldo-claims.json b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/test/data/ldo-claims.json new file mode 100644 index 0000000..ae1b52f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/test/data/ldo-claims.json @@ -0,0 +1,135 @@ +{ + "0x00861fEFCfEF0a542b0a6c90ce1eE575e257A6C7": "1.79943629", + "0x019c8F08C5D93d59311C067A42f966420B19aB03": "21.98006796", + "0x0444538cDFEd27287B98888DD02e691A244642a2": "3.01258692", + "0x0498377429405c7747AdC1769b3F4855Ee9e2558": "0.05950451", + "0x04d728fBD2C039F416Fe16783c2C9a6F8Da0a6E8": "0.52807364", + "0x058F8A007335235B73089bFE0Cdc720dD57cE6c5": "0.47769904", + "0x07A2E516993972eCd674058e173f02694617E233": "200.55365256", + "0x08E86424142D0de800D42B929aC287776833A5E7": "7.76406445", + "0x0A15C9ee2013A4Bc16749cAd63e41bc957DfE463": "2.99615488", + "0x0D67C040FC41a0e354466fb4f8d57730886D34Ef": "144.17998350", + "0x0D84AFe255126a04591BC9CFf2Cdc592B416F0d4": "83.53112376", + "0x0FfB516e3F3490C1BF2a237bff3d1f37a23731b4": "17.83504993", + "0x0a57B6be45698C083794169c1601F9244b6b3C6F": "0.18095649", + "0x0c06E0737e81666023bA2a4A10693e93277Cbbf1": "3.67933293", + "0x11d113E9a19Cb49c404CdC69B7c5A0D8403dD74b": "0.90347964", + "0x1440C9c385963Fa34406235d2632D6c98a63b116": "0.01159820", + "0x1688c305320adEa9f0D2c3330836BeE8e183bA78": "112.79103716", + "0x1853dc4fbFe3B29012Ac6dF6ca44B4fCa0aA1959": "11.64950842", + "0x192f3600a0B6f3705390601694057787E4F85EE9": "12.41315144", + "0x1F93b58fb2cF33CfB68E73E94aD6dD7829b1586D": "1.20005127", + "0x1e9B50040E373b387d596B366132be53Fe3FC667": "29.11035471", + "0x21029e6F6E062999d2321508294fFde48223119D": "31.78904533", + "0x22Cd4027b8Af39de8eB8809588a60b8EF067eF76": "1.42592270", + "0x22E2CD9c773d2E311B97E2f22E2877d44853C0Cb": "0.93549450", + "0x22b9B11ddEc4E5759Ca4216e45a7b7e7E2a7D04F": "7.17212272", + "0x22fC4482844911650D9DED9f05459287e22bD261": "0.38835819", + "0x2638C7f0CC688DE57442cfd76fcd76e9740ac66d": "18.60112069", + "0x265ce0D83B938f4eD6FeB6863718A92BB8474864": "0.59500715", + "0x2A0eDFeaa394A28a513039eb6D67c9e90851b9B9": "59.30649520", + "0x30Ec65d8Db998d959d5da9C52440675eAB82fa4f": "23.10560249", + "0x314426339Db1f662637F9F79aa1274A9AD1e3405": "209.63033381", + "0x33D66941465ac776C38096cb1bc496C673aE7390": "47.03026738", + "0x340157cd645Ed84CEcec32C10DAeDb63d331A72a": "198.92455433", + "0x34b8BC1b38ce5A84E093Dca5deFA211ab48f7f8b": "18.17109012", + "0x350D833d18B26c2692FF4854b060Dd3e4B71B03C": "1.19199636", + "0x3681E33e88dd16C0cea1CDD0a3f64c60b326D609": "24.74867308", + "0x38F52f3B2e39a80a19d4d26bb4bAE62Ba7f49136": "9.97870489", + "0x391cEe42a336a282002c44b2999e5353aa72118D": "1.44642287", + "0x3F26485efF772595248e74F30cadF4f144B55f58": "1.56024412", + "0x439b388FaA6e3aeE0989DeDCA8dF054f29f01553": "2.78496127", + "0x43CB54C706FaF6780dd89cc9186F8DABFAD1834c": "38.02980152", + "0x454208F71EBC2454cdB6C6E35f66D583548f86b0": "0.00789209", + "0x47d8cA631960AC79691574064C600534A6879Fa8": "0.96234359", + "0x4aD0b6838Da1430bCd1f664C8a0A7F06b72dbAfA": "89.04279924", + "0x4d73EF089CD9B59405eb303e08B76a4e8da3a1C9": "405.74254824", + "0x508Ab791Ef641605D40F02702a515809A3468aA2": "30.06230344", + "0x529d3513D95DA3b06fC76b2cBaBBCD9e9AeA8F69": "0.23184835", + "0x554E48984822A0d0C93B5567C20CdBD7946e9aaE": "14.19999717", + "0x56E094616618E5275E04CA9339E0Df1c2Aa77Cf4": "14.90742595", + "0x5B647d8e367b2fe105c94cf293C0539F49AFD2df": "9.67778003", + "0x5C2f8D10cd01b4d9500c4a4C087E18130Ad05D97": "106.91065363", + "0x5a8581c123500b0209F0dC650196164E93D4e5b1": "21.50314987", + "0x5b1A6e4d69aE0760b23a0C78dCF8f179343D23D5": "2.88090022", + "0x5e242C306ed40fe63c4DcD58Ccd590Cd8CCD8964": "24.08299038", + "0x5f87EBB3474D4F048283E85bd6585A4dd7e1cde9": "11.97556773", + "0x618f2d5932b4d29bda43A96Be1eEF390E1916e24": "142.85815686", + "0x624eD28e12d3d010929cb2A400af73656D1f13dc": "527.34756767", + "0x64aE36eeaC5BF9c1F4b7Cc6F0Fa32bBa19aaF9Bc": "129.49628973", + "0x65C7eB62242920D4E6941d4a8Ff0d2519EBcFaf7": "9.62935541", + "0x688f522d9cEc260619A02849Faf3fd3C9B9cD879": "0.01118316", + "0x6F1Dde2EFAe685Bed35052360d08CB2E2EC2E295": "383.56018556", + "0x6b02f4fFb5C83211C73Db9249f635DFbFA613bAf": "35.29339103", + "0x6c1Cb6986c947f44016406947b0fcC15ba3170B8": "278820.75420958", + "0x6fC7eD2385372A18bEB5827b00A3A1f47519a3D1": "60.31924696", + "0x74e2f04DEF059397d4a3382Fd4a85dF062D75bF4": "0.59163120", + "0x752C3597935f6955F94197c0C7152377043ce63D": "4.96938875", + "0x783596B9504Ef2752EFB2d4Aed248fDCb0d9FDab": "75.54187479", + "0x79d665DB3CAdD6743c03542FFF840e740b3c17D2": "19.95222002", + "0x7B4e874561089DaEb12Bc2B138099cf46D282E48": "0.00744064", + "0x7BfeA1979e58AA73beB34D4577272B5Ba16479fD": "701.18049948", + "0x7C632B90CC7698F6dC9e3AAB900a62B30Da4B7b5": "61.63887778", + "0x7E1C8fEF68a87F7BdDf4ae644Fe4D6e6362F5fF1": "2.37686061", + "0x839B878873998F02cE2f5c6D78d1B0842e58F192": "4.67953710", + "0x84EaF06A85F498D4192946880307f9271d59304D": "0.11351444", + "0x8627425d8B3c16d16683a1E1e17ff00A2596E05f": "1981.74861173", + "0x864d69e84BCBf88dc63c0333501B1db5D3fDBf28": "31.18369719", + "0x865f529F429Bd2500260F7A5A2530dC2e205f2B8": "594.05473362", + "0x8740D9eC65b40bE5EbB84BD22607e81260fe3a3a": "65.60525826", + "0x878958E947c81b48Ef943757EAC7600D21868AEa": "22.13756811", + "0x8944f9a71b356B55614AA91C59DE555CB673174B": "316.05739803", + "0x89f14f9064B4FeA39Ac8E09713F0a301d587dFF8": "8.91405588", + "0x9238eCCf6655eCD14426d2c47042B24AB3AE017c": "29.94648907", + "0x940e44635a32b74834a9274c5903A471000f063A": "0.94489424", + "0x962Bd5956199E70c87eED52A4cDEEa413dE9235B": "0.14493419", + "0x98e7967e2236308a51C5E2AC01d532F883E38f6a": "168.19513744", + "0x99633348EC470009e844fBa25cE6F9B52685bF66": "0.12892164", + "0x9A4B0dA9E8e5c7135cd7188Bd2e84DAc513C594b": "10.47199945", + "0x9C14ca2486E824eCcC0e0f95969D1DF22DA9D207": "0.05886205", + "0x9E0787A1A50B40d59D877A0F914ABD0C6a2Ae9B6": "2.69309199", + "0xA54867D4787313505612d1940a1064472b857863": "22.94076455", + "0xA6194A11d73C4Afd3bcfF68F6f1C371126937fD5": "2.65267119", + "0xAF5Bbc583CA4F754A419747e25983E8F7d759D4b": "0.13779228", + "0xAba19F6bB8676F897AdCBbA7C9905fD536Ef52AA": "6.34986322", + "0xAfB93285E08148caa7c2262E21dE2d3D172C8461": "96.50260514", + "0xB290f2F3FAd4E540D0550985951Cdad2711ac34A": "0.01386439", + "0xB55a03124f60433E7563573CABb611D939935253": "0.00233589", + "0xBAa171CED7189ff3849A63de52B772Ca96E29779": "2.57192278", + "0xC7B42F99c63126B22858f4eEd636f805CFe82c91": "0.59260441", + "0xC9FBbCcfE2aA4FB5AB9e81b176823C0A03049c73": "0.08735245", + "0xCe1e01DE2836801dA9A1B1cBcC4A81D46C29F9de": "1.24010445", + "0xD02d2F7aDcD5bcc154da06f4EACCE2bb0895Daf9": "191.66008771", + "0xD180F4a27779B9ae1F15BCb06fD0eB70e0116E8A": "8.02159809", + "0xD6c93cF8D0cEDac485dE133A833Bb3351f6B8795": "0.59992635", + "0xDF9B913aF6949f0a4B106A8A47c0Cbc9CE16Cef8": "0.23404043", + "0xDdE5f491322591FCa7894bf4186440a0d1892A2d": "184.35490203", + "0xE2043B460e15B0ED323777D9E6F6063cBa307203": "2.52356107", + "0xE2Cd88CE80eF83C2687E796eeDb8325831CE4d7D": "11.86232574", + "0xE644caf5654f9DD1dfb89adb44d63FDDe2685080": "0.08395639", + "0xE88a3deD867a330cFf49770920276511D6584416": "1.18656343", + "0xE8c8f12cCB61fD25EcC5E391E99f69a971526C99": "0.89163120", + "0xED6Ed9B5F796ac7c1169F43A0bD20c4D1A282875": "11.88083118", + "0xEE3aA48A09fc048C4eEE2097304CE379eF141957": "1.17807362", + "0xEbd2929292Ee3fcED307F91B66698957D862009d": "22.01074383", + "0xF5303a21d88492Cbeb6f8935c9FCF1108f3239bE": "0.68790773", + "0xF6577F0644cF4c705EE0d1C3a26a849D0E2DeaC0": "11.70342089", + "0xFc0C791A1C352497A069232d1C22f265737f00DD": "0.00002425", + "0xa86DCFa24ab0b8885c9017f73FF63c117f0806B8": "37.80255563", + "0xaa9F7096DdD4A45D91c4EAB76Cf0715dC02fEA76": "1.31117119", + "0xabe85bbe82c95b35d0403963a04eAA0432271601": "6.97627831", + "0xb2A1110d77534Dba0B2B512658A0A8DcD9e271Ec": "16.42831973", + "0xb4AaE31F259A3f1E23aDE494F2b905eD67c5addf": "95.14339736", + "0xc20Ac10581C752f75354A0EB573C2A8512C4DA2a": "14.05413995", + "0xc7846e9C7bE6370E65A4e6ad22366B1387731EDA": "10.66044225", + "0xd2ECDA23ec965aa233C5A479619E602fafBa1d8e": "6.00012195", + "0xd3bA9402e76eC8f26B913A07EF432e91933A3BBa": "0.70108862", + "0xde6EA9A2992df0DFa3Ca5Cf09F9f7c2592930342": "0.03685548", + "0xe0673dc0c90F364C8f33C9e26223BB4238251F50": "43.09386656", + "0xe32b8238bca33a3Cd019C69e27942f2E78B46BCc": "129.72303119", + "0xe3C9E09E49F75d7EC947484abf74579Ea5aa0e18": "159.04818293", + "0xe696A968796D04F7e7Cf6217dfDc231C3BdeaE97": "64.65877133", + "0xe70CE88ec6B39B56D7abA987674CE2fAc67bf296": "28.58044459", + "0xeE014609ef9e09776Ac5Fe00bDBfeF57bCdeFEbB": "0.90163489", + "0xfbaBD7A2f65E7EFd4e7E9fa4485ACC3c9cac27ad": "12.45342729" +} diff --git a/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/test/merkleTree.ts b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/test/merkleTree.ts new file mode 100644 index 0000000..5fdf1a6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/test/merkleTree.ts @@ -0,0 +1,147 @@ +import { ethers } from 'hardhat'; + +/* eslint-disable */ + +// Merkle tree called with 32 byte hex values +export class MerkleTree { + elements: Buffer[]; + layers: any[]; + + constructor(elements: string[]) { + this.elements = elements.filter((el) => el).map((el) => this._stringToBuffer(el)); + + // Sort elements + this.elements.sort(Buffer.compare); + // Deduplicate elements + this.elements = this.bufDedup(this.elements); + + // Create layers + this.layers = this.getLayers(this.elements); + } + + getLayers(elements: Buffer[]) { + if (elements.length === 0) { + return [['']]; + } + + const layers: any[] = []; + layers.push(elements); + + // Get next layer until we reach the root + while (layers[layers.length - 1].length > 1) { + layers.push(this.getNextLayer(layers[layers.length - 1])); + } + + return layers; + } + + getNextLayer(elements: Buffer[]) { + return elements.reduce((layer: any, el: any, idx: number, arr: any[]) => { + if (idx % 2 === 0) { + // Hash the current element with its pair element + layer.push(this.combinedHash(el, arr[idx + 1])); + } + + return layer; + }, []); + } + + combinedHash(first: string, second: string): Buffer | String { + if (!first) { + return second; + } + if (!second) { + return first; + } + + return this._stringToBuffer(ethers.utils.keccak256(this.sortAndConcat(first, second))); + } + + getRoot() { + return this.layers[this.layers.length - 1][0]; + } + + getHexRoot() { + return '0x'.concat(this.getRoot().toString('hex')); + } + + getProof(el: Buffer) { + let idx = this.bufIndexOf(el, this.elements); + + if (idx === -1) { + throw new Error('Element does not exist in Merkle tree'); + } + + return this.layers.reduce((proof, layer) => { + const pairElement = this.getPairElement(idx, layer); + + if (pairElement) { + proof.push(pairElement); + } + + idx = Math.floor(idx / 2); + + return proof; + }, []); + } + + // external call - convert to buffer + getHexProof(_el: any) { + const el = Buffer.from(ethers.utils.arrayify(_el)); + + const proof = this.getProof(el); + + return this.bufArrToHexArr(proof); + } + + getPairElement(idx: number, layer: any) { + const pairIdx = idx % 2 === 0 ? idx + 1 : idx - 1; + + if (pairIdx < layer.length) { + return layer[pairIdx]; + } else { + return null; + } + } + + bufIndexOf(el: Buffer | string, arr: Buffer[]) { + let hash; + + // Convert element to 32 byte hash if it is not one already + if (el.length !== 32 || !Buffer.isBuffer(el)) { + hash = this._stringToBuffer(ethers.utils.keccak256(el as string)); + } else { + hash = el as Buffer; + } + + for (let i = 0; i < arr.length; i++) { + if (hash.equals(arr[i])) { + return i; + } + } + + return -1; + } + + bufDedup(elements: Buffer[]) { + return elements.filter((el, idx: number) => { + return idx === 0 || !elements[idx - 1].equals(el); + }); + } + + bufArrToHexArr(arr: Buffer[]) { + if (arr.some((el) => !Buffer.isBuffer(el))) { + throw new Error('Array is not an array of buffers'); + } + + return arr.map((el: Buffer) => '0x' + el.toString('hex')); + } + + sortAndConcat(...args: any[]) { + return Buffer.concat([...args].sort(Buffer.compare)); + } + + _stringToBuffer(str: string): Buffer { + return Buffer.from(ethers.utils.arrayify(str)); + } +} diff --git a/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/test/test.fork.ts b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/test/test.fork.ts new file mode 100644 index 0000000..82367b8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230222-merkle-orchard-v2/test/test.fork.ts @@ -0,0 +1,149 @@ +import fs from 'fs'; +import path from 'path'; + +import hre from 'hardhat'; +import { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; + +import { bn, fp } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { expectTransferEvent } from '@helpers/expectTransfer'; + +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; +import { MerkleTree } from './merkleTree'; + +describeForkTest('MerkleOrchard V2', 'mainnet', 16684000, function () { + let distributor: SignerWithAddress; + let merkleOrchard: Contract; + let ldoToken: Contract; + + let task: Task; + + const LDO_ADDRESS = '0x5A98FcBEA516Cf06857215779Fd812CA3beF1B32'; + // Root taken from https://github.com/balancer-labs/bal-mining-scripts/blob/incident-response/reports/_incident-response/_roots-lido.json. + const LDO_ROOT = '0x748ae6b1a5704a0711f56bd6b109627ab0d39ae6c0eee11d85450fba7979c8ec'; + + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + + const elements: string[] = []; + const pendingClaims: PendingClaim[] = []; + let merkleTree: MerkleTree; + let distributorLdoBalance: BigNumber; + + type PendingClaim = { + address: string; + amount: BigNumber; + }; + + before('run task', async () => { + task = new Task('20230222-merkle-orchard-v2', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + merkleOrchard = await task.deployedInstance('MerkleOrchard'); + }); + + before('setup accounts', async () => { + [, distributor] = await ethers.getSigners(); + distributor = await impersonate(GOV_MULTISIG, fp(10)); + }); + + before('setup contracts', async () => { + // We use test balancer token to make use of the ERC-20 interface. + const testBALTokenTask = new Task('20220325-test-balancer-token', TaskMode.READ_ONLY, getForkedNetwork(hre)); + ldoToken = await testBALTokenTask.instanceAt('TestBalancerToken', LDO_ADDRESS); + }); + + before('compute merkle tree', async () => { + // Data taken from https://github.com/balancer-labs/bal-mining-scripts/blob/incident-response/reports/_incident-response/1/__ethereum_0x5a98fcbea516cf06857215779fd812ca3bef1b32.json. + const filePath = path.join(task.dir(), 'test/data/ldo-claims.json'); + + const ldoClaims = JSON.parse(fs.readFileSync(filePath, 'utf-8')); + let totalClaimableAmount = bn(0); + Object.entries(ldoClaims).forEach(([address, amount]) => { + const amountFp = fp(Number(amount)); + totalClaimableAmount = totalClaimableAmount.add(amountFp); + pendingClaims.push({ address, amount: amountFp }); + elements.push(encodeElement(address, amountFp)); + }); + merkleTree = new MerkleTree(elements); + const root = merkleTree.getHexRoot(); + await expect(root).to.be.eq(LDO_ROOT); + + // Distributor LDO balance is slightly less than total balance calculated from pending claims. + distributorLdoBalance = await ldoToken.balanceOf(distributor.address); + expect(distributorLdoBalance).to.be.equalWithError(totalClaimableAmount); + }); + + it('stores an allocation', async () => { + await ldoToken.connect(distributor).approve(merkleOrchard.address, distributorLdoBalance); + await merkleOrchard.connect(distributor).createDistribution(LDO_ADDRESS, LDO_ROOT, distributorLdoBalance, bn(1)); + + const proof = merkleTree.getHexProof(elements[0]); + + const result = await merkleOrchard.verifyClaim( + LDO_ADDRESS, + distributor.address, + 1, + pendingClaims[0].address, + pendingClaims[0].amount, + proof + ); + expect(result).to.equal(true); + }); + + it('allows the user to claim a single distribution', async () => { + const claimerId = 13; + const claim = pendingClaims[claimerId]; + const merkleProof = merkleTree.getHexProof(elements[claimerId]); + + const claimer = await impersonate(claim.address, fp(10)); + const claims = [ + { + distributionId: bn(1), + balance: claim.amount, + distributor: distributor.address, + tokenIndex: 0, + merkleProof, + }, + ]; + + const tx = await merkleOrchard.connect(claimer).claimDistributions(claimer.address, claims, [LDO_ADDRESS]); + await expectTransferEvent( + await tx.wait(), + { from: await merkleOrchard.getVault(), to: claimer.address, value: claim.amount }, + ldoToken + ); + }); + + it('reverts when claiming twice in the same transaction', async () => { + const claimerId = 17; + const claim = pendingClaims[claimerId]; + const merkleProof = merkleTree.getHexProof(elements[claimerId]); + + const claimer = await impersonate(claim.address, fp(10)); + const claims = [ + { + distributionId: bn(1), + balance: claim.amount, + distributor: distributor.address, + tokenIndex: 0, + merkleProof, + }, + { + distributionId: bn(1), + balance: claim.amount, + distributor: distributor.address, + tokenIndex: 0, + merkleProof, + }, + ]; + + await expect( + merkleOrchard.connect(claimer).claimDistributions(claimer.address, claims, [LDO_ADDRESS]) + ).to.be.revertedWith('cannot claim twice'); + }); + + function encodeElement(address: string, balance: BigNumber): string { + return ethers.utils.solidityKeccak256(['address', 'uint'], [address, balance]); + } +}); diff --git a/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/artifact/ProtocolIdRegistry.json b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/artifact/ProtocolIdRegistry.json new file mode 100644 index 0000000..bd3754b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/artifact/ProtocolIdRegistry.json @@ -0,0 +1,179 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ProtocolIdRegistry", + "sourceName": "contracts/ProtocolIdRegistry.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "ProtocolIdRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "ProtocolIdRenamed", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "getProtocolName", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "isValidProtocolId", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "registerProtocolId", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "newName", + "type": "string" + } + ], + "name": "renameProtocolId", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60c06040523480156200001157600080fd5b506040516200109e3803806200109e833981016040819052620000349162000565565b306080526001600160601b0319606082901b1660a0526040805180820190915260078152664161766520763160c81b60208201526200007690600090620003e7565b620000a860016040518060400160405280600781526020016620b0bb32903b1960c91b815250620003e760201b60201c565b620000da6002604051806040016040528060078152602001664161766520763360c81b815250620003e760201b60201c565b6200010f60036040518060400160405280600a815260200169082dae0d8caccdee4e8d60b31b815250620003e760201b60201c565b6200013f600460405180604001604052806005815260200164426565667960d81b815250620003e760201b60201c565b6040805180820190915260058082526422bab632b960d91b60208301526200016791620003e7565b6200019960066040518060400160405280600781526020016608ecac2e4c4def60cb1b815250620003e760201b60201c565b620001c860076040518060400160405280600481526020016349646c6560e01b815250620003e760201b60201c565b620001f96008604051806040016040528060068152602001654d6f7270686f60d01b815250620003e760201b60201c565b6200022b6009604051806040016040528060078152602001661498591a585b9d60ca1b815250620003e760201b60201c565b6200025c600a604051806040016040528060068152602001652932b0b832b960d11b815250620003e760201b60201c565b6200028b600b6040518060400160405280600481526020016353696c6f60e01b815250620003e760201b60201c565b620002be600c60405180604001604052806008815260200167537461726761746560c01b815250620003e760201b60201c565b620002ef600d6040518060400160405280600681526020016553747572647960d01b815250620003e760201b60201c565b62000321600e604051806040016040528060078152602001665465737365726160c81b815250620003e760201b60201c565b62000350600f604051806040016040528060048152602001635465747560e01b815250620003e760201b60201c565b620003806010604051806040016040528060058152602001642cb2b0b93760d91b815250620003e760201b60201c565b620003b06011604051806040016040528060058152602001644d6964617360d81b815250620003e760201b60201c565b620003e0601260405180604001604052806005815260200164416761766560d81b815250620003e760201b60201c565b5062000622565b620003f282620004b1565b156200041b5760405162461bcd60e51b81526004016200041290620005eb565b60405180910390fd5b60408051808201825282815260016020808301919091526000858152808252929092208151805192939192620004559284920190620004c9565b50602091909101516001909101805460ff191691151591909117905560405182907f55a433acac236e2d53f9f11a1f18341ef96abb545a8e67b6c72e705c5464d7e290620004a590849062000595565b60405180910390a25050565b60009081526020819052604090206001015460ff1690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200050c57805160ff19168380011785556200053c565b828001600101855582156200053c579182015b828111156200053c5782518255916020019190600101906200051f565b506200054a9291506200054e565b5090565b5b808211156200054a57600081556001016200054f565b60006020828403121562000577578081fd5b81516001600160a01b03811681146200058e578182fd5b9392505050565b6000602080835283518082850152825b81811015620005c357858101830151858201604001528201620005a5565b81811115620005d55783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601e908201527f50726f746f636f6c20494420616c726561647920726567697374657265640000604082015260600190565b60805160a05160601c610a5562000649600039806101c45250806101745250610a556000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063851c1bb31161005b578063851c1bb3146100d35780638d928af8146100f3578063a2de104114610108578063aaabadc5146101285761007d565b80633585c4da146100825780633cae580a146100975780637f5d9817146100c0575b600080fd5b6100956100903660046107b5565b610130565b005b6100aa6100a536600461079d565b610146565b6040516100b791906108a8565b60405180910390f35b6100956100ce3660046107b5565b61015e565b6100e66100e1366004610729565b610170565b6040516100b791906108b3565b6100fb6101c2565b6040516100b791906108e8565b61011b61011636600461079d565b6101e6565b6040516100b79190610909565b6100fb6102ed565b610138610379565b61014282826103c2565b5050565b60009081526020819052604090206001015460ff1690565b610166610379565b610142828261045b565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016101a5929190610878565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6060816101f281610146565b610231576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610228906109e8565b60405180910390fd5b6000838152602081815260409182902080548351601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600186161502019093169290920491820184900484028101840190945280845290918301828280156102e05780601f106102b5576101008083540402835291602001916102e0565b820191906000526020600020905b8154815290600101906020018083116102c357829003601f168201915b5050505050915050919050565b60006102f76101c2565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561033c57600080fd5b505afa158015610350573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103749190610769565b905090565b60006103a86000357fffffffff0000000000000000000000000000000000000000000000000000000016610170565b90506103bf6103b7823361053f565b6101916105dc565b50565b6103cb82610146565b610401576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610228906109b1565b600082815260208181526040909120825161041e92840190610676565b50817f16e48aff252ad873213968111088e9dc04ca70fb770c5b5f6fdb74dfe40992158260405161044f9190610909565b60405180910390a25050565b61046482610146565b1561049b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102289061097a565b604080518082018252828152600160208083019190915260008581528082529290922081518051929391926104d39284920190610676565b5060209190910151600190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560405182907f55a433acac236e2d53f9f11a1f18341ef96abb545a8e67b6c72e705c5464d7e29061044f908490610909565b60006105496102ed565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401610585939291906108bc565b60206040518083038186803b15801561059d57600080fd5b505afa1580156105b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d59190610709565b9392505050565b81610142577f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526101429183916103bf917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106106b757805160ff19168380011785556106e4565b828001600101855582156106e4579182015b828111156106e45782518255916020019190600101906106c9565b506106f09291506106f4565b5090565b5b808211156106f057600081556001016106f5565b60006020828403121561071a578081fd5b815180151581146105d5578182fd5b60006020828403121561073a578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146105d5578182fd5b60006020828403121561077a578081fd5b815173ffffffffffffffffffffffffffffffffffffffff811681146105d5578182fd5b6000602082840312156107ae578081fd5b5035919050565b600080604083850312156107c7578081fd5b8235915060208084013567ffffffffffffffff808211156107e6578384fd5b818601915086601f8301126107f9578384fd5b813581811115610807578485fd5b604051847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401168201018181108482111715610844578687fd5b604052818152838201850189101561085a578586fd5b81858501868301378585838301015280955050505050509250929050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6000602080835283518082850152825b8181101561093557858101830151858201604001528201610919565b818111156109465783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6020808252601e908201527f50726f746f636f6c20494420616c726561647920726567697374657265640000604082015260600190565b6020808252601a908201527f50726f746f636f6c204944206e6f742072656769737465726564000000000000604082015260600190565b60208082526018908201527f4e6f6e2d6578697374656e742070726f746f636f6c204944000000000000000060408201526060019056fea2646970667358221220b6a6a4542b1812cff32f5c38fcfe438ef2b4025dadf9a88a36fff10b1fc78bd364736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063851c1bb31161005b578063851c1bb3146100d35780638d928af8146100f3578063a2de104114610108578063aaabadc5146101285761007d565b80633585c4da146100825780633cae580a146100975780637f5d9817146100c0575b600080fd5b6100956100903660046107b5565b610130565b005b6100aa6100a536600461079d565b610146565b6040516100b791906108a8565b60405180910390f35b6100956100ce3660046107b5565b61015e565b6100e66100e1366004610729565b610170565b6040516100b791906108b3565b6100fb6101c2565b6040516100b791906108e8565b61011b61011636600461079d565b6101e6565b6040516100b79190610909565b6100fb6102ed565b610138610379565b61014282826103c2565b5050565b60009081526020819052604090206001015460ff1690565b610166610379565b610142828261045b565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016101a5929190610878565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6060816101f281610146565b610231576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610228906109e8565b60405180910390fd5b6000838152602081815260409182902080548351601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600186161502019093169290920491820184900484028101840190945280845290918301828280156102e05780601f106102b5576101008083540402835291602001916102e0565b820191906000526020600020905b8154815290600101906020018083116102c357829003601f168201915b5050505050915050919050565b60006102f76101c2565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561033c57600080fd5b505afa158015610350573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103749190610769565b905090565b60006103a86000357fffffffff0000000000000000000000000000000000000000000000000000000016610170565b90506103bf6103b7823361053f565b6101916105dc565b50565b6103cb82610146565b610401576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610228906109b1565b600082815260208181526040909120825161041e92840190610676565b50817f16e48aff252ad873213968111088e9dc04ca70fb770c5b5f6fdb74dfe40992158260405161044f9190610909565b60405180910390a25050565b61046482610146565b1561049b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102289061097a565b604080518082018252828152600160208083019190915260008581528082529290922081518051929391926104d39284920190610676565b5060209190910151600190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560405182907f55a433acac236e2d53f9f11a1f18341ef96abb545a8e67b6c72e705c5464d7e29061044f908490610909565b60006105496102ed565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401610585939291906108bc565b60206040518083038186803b15801561059d57600080fd5b505afa1580156105b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d59190610709565b9392505050565b81610142577f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526101429183916103bf917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106106b757805160ff19168380011785556106e4565b828001600101855582156106e4579182015b828111156106e45782518255916020019190600101906106c9565b506106f09291506106f4565b5090565b5b808211156106f057600081556001016106f5565b60006020828403121561071a578081fd5b815180151581146105d5578182fd5b60006020828403121561073a578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146105d5578182fd5b60006020828403121561077a578081fd5b815173ffffffffffffffffffffffffffffffffffffffff811681146105d5578182fd5b6000602082840312156107ae578081fd5b5035919050565b600080604083850312156107c7578081fd5b8235915060208084013567ffffffffffffffff808211156107e6578384fd5b818601915086601f8301126107f9578384fd5b813581811115610807578485fd5b604051847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401168201018181108482111715610844578687fd5b604052818152838201850189101561085a578586fd5b81858501868301378585838301015280955050505050509250929050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6000602080835283518082850152825b8181101561093557858101830151858201604001528201610919565b818111156109465783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6020808252601e908201527f50726f746f636f6c20494420616c726561647920726567697374657265640000604082015260600190565b6020808252601a908201527f50726f746f636f6c204944206e6f742072656769737465726564000000000000604082015260600190565b60208082526018908201527f4e6f6e2d6578697374656e742070726f746f636f6c204944000000000000000060408201526060019056fea2646970667358221220b6a6a4542b1812cff32f5c38fcfe438ef2b4025dadf9a88a36fff10b1fc78bd364736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/index.ts b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/index.ts new file mode 100644 index 0000000..de9842d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { ProtocolIdRegistryDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as ProtocolIdRegistryDeployment; + + const args = [input.Vault]; + await task.deployAndVerify('ProtocolIdRegistry', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/input.ts b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/input.ts new file mode 100644 index 0000000..f0369eb --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type ProtocolIdRegistryDeployment = { + Vault: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, +}; diff --git a/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/arbitrum.json b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/arbitrum.json new file mode 100644 index 0000000..a671699 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "ProtocolIdRegistry": "0x5cF4928a3205728bd12830E1840F7DB85c62a4B9" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/base.json b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/base.json new file mode 100644 index 0000000..9fa30df --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/base.json @@ -0,0 +1,3 @@ +{ + "ProtocolIdRegistry": "0x682f0dDBFd41D1272982f64a499Fb62d80e27589" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/gnosis.json b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/gnosis.json new file mode 100644 index 0000000..f01116a --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "ProtocolIdRegistry": "0x6B5dA774890Db7B7b96C6f44e6a4b0F657399E2e" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/goerli.json b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/goerli.json new file mode 100644 index 0000000..30c8ff8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/goerli.json @@ -0,0 +1,3 @@ +{ + "ProtocolIdRegistry": "0x4fb47126Fa83A8734991E41B942Ac29A3266C968" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/mainnet.json b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/mainnet.json new file mode 100644 index 0000000..960c698 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "ProtocolIdRegistry": "0xc3ccacE87f6d3A81724075ADcb5ddd85a8A1bB68" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/mode.json b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/mode.json new file mode 100644 index 0000000..189bd52 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/mode.json @@ -0,0 +1,3 @@ +{ + "ProtocolIdRegistry": "0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/optimism.json b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/optimism.json new file mode 100644 index 0000000..43a4186 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/optimism.json @@ -0,0 +1,3 @@ +{ + "ProtocolIdRegistry": "0x9805dcfD25e6De36bad8fe9D3Fe2c9b44B764102" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/polygon.json b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/polygon.json new file mode 100644 index 0000000..35954fd --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/polygon.json @@ -0,0 +1,3 @@ +{ + "ProtocolIdRegistry": "0xa523f47A933D5020b23629dDf689695AA94612Dc" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/sepolia.json b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/sepolia.json new file mode 100644 index 0000000..0827565 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "ProtocolIdRegistry": "0x6CaD2ea22BFA7F4C14Aae92E47F510Cd5C509bc7" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/zkevm.json b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/zkevm.json new file mode 100644 index 0000000..0827565 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/output/zkevm.json @@ -0,0 +1,3 @@ +{ + "ProtocolIdRegistry": "0x6CaD2ea22BFA7F4C14Aae92E47F510Cd5C509bc7" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/readme.md b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/readme.md new file mode 100644 index 0000000..92a201b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/readme.md @@ -0,0 +1,16 @@ +# 2023-02-23 - Protocol ID Registry + +Deployment of the `ProtocolIdRegistry` contract, which keeps track of valid partner protocol IDs and names on-chain. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`ProtocolIdRegistry` artifact](./artifact/ProtocolIdRegistry.json) diff --git a/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/test/task.fork.ts b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/test/task.fork.ts new file mode 100644 index 0000000..5c92bea --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230223-protocol-id-registry/test/task.fork.ts @@ -0,0 +1,78 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import { fp } from '@helpers/numbers'; +import { actionId } from '@helpers/models/misc/actions'; + +import { describeForkTest } from '@src'; +import { Task, TaskMode } from '@src'; +import { getForkedNetwork } from '@src'; +import { impersonate } from '@src'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; + +describeForkTest('ProtocolIdRegistry', 'mainnet', 16691900, function () { + let vault: Contract, authorizer: Contract; + let protocolIdRegistry: Contract; + let admin: SignerWithAddress, other: SignerWithAddress; + + let task: Task; + + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + + before('run task', async () => { + task = new Task('20230223-protocol-id-registry', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + protocolIdRegistry = await task.deployedInstance('ProtocolIdRegistry'); + }); + + before('setup accounts', async () => { + [, other, admin] = await ethers.getSigners(); + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.deployedInstance('Vault'); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + }); + + before('grant register and rename permissions to admin', async () => { + const govMultisig = await impersonate(GOV_MULTISIG, fp(100)); + + await authorizer + .connect(govMultisig) + .grantRole(await actionId(protocolIdRegistry, 'registerProtocolId'), admin.address); + await authorizer + .connect(govMultisig) + .grantRole(await actionId(protocolIdRegistry, 'renameProtocolId'), admin.address); + }); + + it('gets default protocol IDs', async () => { + expect(await protocolIdRegistry.isValidProtocolId(0)).to.be.true; + expect(await protocolIdRegistry.getProtocolName(0)).to.be.eq('Aave v1'); + + expect(await protocolIdRegistry.isValidProtocolId(18)).to.be.true; + expect(await protocolIdRegistry.getProtocolName(18)).to.be.eq('Agave'); + + expect(await protocolIdRegistry.isValidProtocolId(19)).to.be.false; + }); + + it('reverts when adding or renaming protocol IDs without permission', async () => { + await expect(protocolIdRegistry.connect(other).registerProtocolId(20, 'test')).to.be.revertedWith('BAL#401'); + await expect(protocolIdRegistry.connect(other).renameProtocolId(1, 'test')).to.be.revertedWith('BAL#401'); + }); + + it('adds new protocols', async () => { + await protocolIdRegistry.connect(admin).registerProtocolId(20, 'new protocol'); + + expect(await protocolIdRegistry.isValidProtocolId(20)).to.be.true; + expect(await protocolIdRegistry.getProtocolName(20)).to.be.eq('new protocol'); + }); + + it('renames existing protocols', async () => { + await protocolIdRegistry.connect(admin).renameProtocolId(20, 'new protocol V2'); + + expect(await protocolIdRegistry.isValidProtocolId(20)).to.be.true; + expect(await protocolIdRegistry.getProtocolName(20)).to.be.eq('new protocol V2'); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/artifact/BatchRelayerLibrary.json b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/artifact/BatchRelayerLibrary.json new file mode 100644 index 0000000..197e5a5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/artifact/BatchRelayerLibrary.json @@ -0,0 +1,1494 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BatchRelayerLibrary", + "sourceName": "contracts/BatchRelayerLibrary.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wstETH", + "type": "address" + }, + { + "internalType": "contract IBalancerMinter", + "name": "minter", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approveVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "assetInIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "assetOutIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IVault.BatchSwapStep[]", + "name": "swaps", + "type": "tuple[]" + }, + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + }, + { + "internalType": "int256[]", + "name": "limits", + "type": "int256[]" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "key", + "type": "uint256" + } + ], + "internalType": "struct VaultActions.OutputReference[]", + "name": "outputReferences", + "type": "tuple[]" + } + ], + "name": "batchSwap", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "enum VaultActions.PoolKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "minAmountsOut", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.ExitPoolRequest", + "name": "request", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "key", + "type": "uint256" + } + ], + "internalType": "struct VaultActions.OutputReference[]", + "name": "outputReferences", + "type": "tuple[]" + } + ], + "name": "exitPool", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStakingLiquidityGauge[]", + "name": "gauges", + "type": "address[]" + } + ], + "name": "gaugeClaimRewards", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStakingLiquidityGauge", + "name": "gauge", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "gaugeDeposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "gauges", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "gaugeMint", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "approval", + "type": "bool" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "gaugeSetMinterApproval", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStakingLiquidityGauge", + "name": "gauge", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "gaugeWithdraw", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "getEntrypoint", + "outputs": [ + { + "internalType": "contract IBalancerRelayer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "enum VaultActions.PoolKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "maxAmountsIn", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.JoinPoolRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "joinPool", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.UserBalanceOpKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IAsset", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + } + ], + "internalType": "struct IVault.UserBalanceOp[]", + "name": "ops", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "manageUserBalance", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "ref", + "type": "uint256" + } + ], + "name": "peekChainedReferenceValue", + "outputs": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "relayer", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "authorisation", + "type": "bytes" + } + ], + "name": "setRelayerApproval", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "stakeETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "stakeETHAndWrap", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IAsset", + "name": "assetIn", + "type": "address" + }, + { + "internalType": "contract IAsset", + "name": "assetOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IVault.SingleSwap", + "name": "singleSwap", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "limit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "swap", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStaticATokenLM", + "name": "staticToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "toUnderlying", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapAaveStaticToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ICToken", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapCompoundV2", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC4626", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapERC4626", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IEulerToken", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapEuler", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGearboxDieselToken", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "dieselAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapGearbox", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IReaperTokenVault", + "name": "vaultToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapReaperVaultToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IShareToken", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapShareToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITetuSmartVault", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapTetu", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IUnbuttonToken", + "name": "wrapperToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapUnbuttonToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapWstETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IYearnTokenVault", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapYearn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20Permit", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "vaultPermit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20PermitDAI", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "holder", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "vaultPermitDAI", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStaticATokenLM", + "name": "staticToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "fromUnderlying", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapAaveDynamicToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ICToken", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapCompoundV2", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC4626", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapERC4626", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IEulerToken", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "eulerProtocol", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapEuler", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGearboxDieselToken", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "mainAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapGearbox", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IReaperTokenVault", + "name": "vaultToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapReaperVaultToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IShareToken", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapShareToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapStETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITetuSmartVault", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapTetu", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IUnbuttonToken", + "name": "wrapperToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "uAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapUnbuttonToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IYearnTokenVault", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapYearn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x6101606040527fae1dc54057af8e8e5ce068cdd4383149c7efcb30e8fb95b592ee1594367fb50960e0523480156200003657600080fd5b50604051620065a5380380620065a5833981016040819052620000599162000209565b818184806001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200009657600080fd5b505afa158015620000ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d191906200025c565b6001600160601b0319606091821b81166080529082901b1660a05260405181903090620000fe90620001fb565b6200010b92919062000282565b604051809103906000f08015801562000128573d6000803e3d6000fd5b506001600160601b0319606091821b811660c05292901b90911661010052506001600160a01b0381166200015e576000620001d5565b806001600160a01b031663c1fe3e486040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200019a57600080fd5b505af1158015620001af573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d591906200025c565b6001600160601b0319606091821b81166101205291901b166101405250620002b5915050565b6107878062005e1e83390190565b6000806000606084860312156200021e578283fd5b83516200022b816200029c565b60208501519093506200023e816200029c565b604085015190925062000251816200029c565b809150509250925092565b6000602082840312156200026e578081fd5b81516200027b816200029c565b9392505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0381168114620002b257600080fd5b50565b60805160601c60a05160601c60c05160601c60e0516101005160601c6101205160601c6101405160601c615acc62000352600039806106b6528061075f528061078a5280610be35280610c0f5280610cb2528061308d52806130b9525080610bc25280610ecd5280610f71528061315c52508061128b52806122ff525080613a4b52508061216d52508061226d52806123f6525050615acc6000f3fe6080604052600436106102c65760003560e01c80637bc008f511610179578063abf6d399116100d6578063db4c0e911161008a578063efe6910811610064578063efe69108146105b9578063f3cab685146105cc578063f4dd54b0146105f9576102c6565b8063db4c0e9114610580578063e8210e3c14610593578063ecc02637146105a6576102c6565b8063b6d24737116100bb578063b6d2473714610547578063d293f2901461055a578063d80952d51461056d576102c6565b8063abf6d39914610521578063b064b37614610534576102c6565b80638d64cfbc1161012d5780638fe4624f116101125780638fe4624f146104e8578063941e849b146104fb578063959fc17a1461050e576102c6565b80638d64cfbc146104c05780638d928af8146104d3576102c6565b806380db15bd1161015e57806380db15bd146104875780638b35ac8d1461049a5780638c57198b146104ad576102c6565b80637bc008f5146104495780637fd0e5d51461045c576102c6565b8063433b08651161022757806352b88746116101db57806365ca4804116101c057806365ca4804146104105780636d307ea8146104235780637ab6e03c14610436576102c6565b806352b88746146103ea578063611b90dd146103fd576102c6565b80634e9d9bab1161020c5780634e9d9bab146103b15780634f06a70b146103c45780635001fe75146103d7576102c6565b8063433b08651461038b57806344b6ac741461039e576102c6565b80632c25efe11161027e5780632e6272ea116102635780632e6272ea14610352578063311c5c57146103655780633f85d39014610378576102c6565b80632c25efe11461032c5780632cbec84e1461033f576102c6565b8063138fdc2c116102af578063138fdc2c146102f357806318369446146103065780631c98244114610319576102c6565b80630e248fea146102cb5780631089e5e3146102e0575b600080fd5b6102de6102d93660046146ba565b61060c565b005b6102de6102ee36600461463c565b6106a7565b6102de6103013660046149eb565b6107b1565b6102de610314366004614d7e565b6109b4565b6102de61032736600461456a565b610bbd565b6102de61033a3660046149eb565b610ce0565b6102de61034d36600461463c565b610ebe565b6102de610360366004614e7a565b610f98565b6102de6103733660046149eb565b6110b8565b6102de610386366004614670565b611258565b6102de610399366004614c1c565b611322565b6102de6103ac3660046149eb565b61154b565b6102de6103bf3660046149eb565b6116ca565b6102de6103d23660046149eb565b611925565b6102de6103e53660046149eb565b611a36565b6102de6103f8366004614b5f565b611bc1565b6102de61040b3660046149eb565b611d65565b6102de61041e366004614bcc565b611e08565b6102de6104313660046149eb565b611f26565b6102de610444366004614c1c565b611f61565b6102de610457366004614bcc565b612067565b34801561046857600080fd5b5061047161216b565b60405161047e91906151e0565b60405180910390f35b6102de6104953660046145af565b61218f565b6102de6104a83660046149eb565b612293565b6102de6104bb36600461484f565b6122cf565b6102de6104ce366004614ac6565b61237a565b3480156104df57600080fd5b506104716123f4565b6102de6104f636600461495b565b612418565b6102de6105093660046149eb565b612642565b6102de61051c366004614a45565b61278d565b6102de61052f3660046149eb565b61280a565b6102de6105423660046149eb565b6128bd565b6102de610555366004614b34565b612a00565b6102de6105683660046149eb565b612a3a565b6102de61057b3660046148b2565b612afa565b6102de61058e36600461456a565b613088565b6102de6105a13660046149eb565b613183565b6102de6105b436600461478a565b6131be565b6102de6105c73660046149eb565b6132b6565b3480156105d857600080fd5b506105ec6105e7366004614f68565b6132f5565b60405161047e919061592f565b6102de6106073660046149eb565b613307565b8060005b818110156106a15783838281811061062457fe5b90506020020160208101906106399190614532565b6001600160a01b03166384e9bd7e336040518263ffffffff1660e01b815260040161066491906151e0565b600060405180830381600087803b15801561067e57600080fd5b505af1158015610692573d6000803e3d6000fd5b50505050806001019050610610565b50505050565b6106b082613433565b915060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b0e38900846040518263ffffffff1660e01b8152600401610700919061592f565b60206040518083038186803b15801561071857600080fd5b505afa15801561072c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107509190614f80565b90506107856001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001684613459565b6106a17f00000000000000000000000000000000000000000000000000000000000000008583856134d8565b6000856001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156107ec57600080fd5b505afa158015610800573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610824919061454e565b90506000816001600160a01b0316632495a5996040518163ffffffff1660e01b815260040160206040518083038186803b15801561086157600080fd5b505afa158015610875573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610899919061454e565b90506108a781838689613506565b6040517f9aa5d4620000000000000000000000000000000000000000000000000000000081529094506001600160a01b03831690639aa5d462906108f4908790899060009060040161596e565b600060405180830381600087803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050506109ab83836001600160a01b0316634d778ad1876040518263ffffffff1660e01b8152600401610956919061592f565b60206040518083038186803b15801561096e57600080fd5b505afa158015610982573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a69190614f80565b613531565b50505050505050565b336109c26020890189614532565b6001600160a01b031614806109eb5750306109e06020890189614532565b6001600160a01b0316145b610a105760405162461bcd60e51b8152600401610a0790615791565b60405180910390fd5b60005b8a51811015610a755760008b8281518110610a2a57fe5b6020026020010151606001519050610a4181613549565b15610a6c57610a4f81613590565b8c8381518110610a5b57fe5b602002602001015160600181815250505b50600101610a13565b506060610a806123f4565b6001600160a01b031663945bcec9858e8e8e8e8e8e8e8e6040518a63ffffffff1660e01b8152600401610aba989796959493929190615651565b6000604051808303818588803b158015610ad357600080fd5b505af1158015610ae7573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052610b1091908101906146fa565b905060005b82811015610bae57610b3b848483818110610b2c57fe5b90506040020160200135613549565b610b575760405162461bcd60e51b8152600401610a079061586d565b610ba6848483818110610b6657fe5b90506040020160200135610ba184878786818110610b8057fe5b9050604002016000013581518110610b9457fe5b60200260200101516135bb565b6135c7565b600101610b15565b50505050505050505050505050565b610c097f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008487613506565b915060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ea598cb0846040518263ffffffff1660e01b8152600401610c59919061592f565b602060405180830381600087803b158015610c7357600080fd5b505af1158015610c87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cab9190614f80565b9050610cd97f00000000000000000000000000000000000000000000000000000000000000008583856134d8565b5050505050565b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610d1b57600080fd5b505afa158015610d2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d53919061454e565b9050610d6181878588613506565b6040517fa0712d680000000000000000000000000000000000000000000000000000000081529093506001600160a01b0387169063a0712d6890610da990869060040161592f565b602060405180830381600087803b158015610dc357600080fd5b505af1158015610dd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfb9190614f80565b15610e185760405162461bcd60e51b8152600401610a07906157ff565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038816906370a0823190610e609030906004016151e0565b60206040518083038186803b158015610e7857600080fd5b505afa158015610e8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb09190614f80565b90506109ab878683866134d8565b610ec782613433565b915060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a1903eab84306040518363ffffffff1660e01b8152600401610f1891906151e0565b6020604051808303818588803b158015610f3157600080fd5b505af1158015610f45573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610f6a9190614f80565b90506106a17f00000000000000000000000000000000000000000000000000000000000000008583856134d8565b33610fa66020870187614532565b6001600160a01b03161480610fcf575030610fc46020870187614532565b6001600160a01b0316145b610feb5760405162461bcd60e51b8152600401610a0790615791565b610ff88660800151613549565b156110105761100a8660800151613590565b60808701525b600061101a6123f4565b6001600160a01b03166352bbbe2984898989896040518663ffffffff1660e01b815260040161104c94939291906158a4565b6020604051808303818588803b15801561106557600080fd5b505af1158015611079573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061109e9190614f80565b90506110a982613549565b156109ab576109ab82826135c7565b6110c38583866135da565b91506000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561110057600080fd5b505afa158015611114573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611138919061454e565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081529091506001600160a01b03871690632e1a7d4d9061118090869060040161592f565b600060405180830381600087803b15801561119a57600080fd5b505af11580156111ae573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b03841691506370a08231906111fa9030906004016151e0565b60206040518083038186803b15801561121257600080fd5b505afa158015611226573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124a9190614f80565b90506109ab828683866134d8565b6040517f3b9f73840000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633b9f7384906112c490879087903390600401615407565b602060405180830381600087803b1580156112de57600080fd5b505af11580156112f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113169190614f80565b90506106a18282613531565b61132b83613549565b1561133c5761133983613590565b92505b6000826113bb57866001600160a01b03166351c0e0616040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561137e57600080fd5b505af1158015611392573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b6919061454e565b61142e565b866001600160a01b0316634800d97f6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156113f657600080fd5b505af115801561140a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142e919061454e565b90506001600160a01b0386163014611473576001600160a01b03861633146114685760405162461bcd60e51b8152600401610a0790615791565b611473868286613626565b6114876001600160a01b03821688866136c2565b6040517f2f2cab870000000000000000000000000000000000000000000000000000000081526000906001600160a01b03891690632f2cab87906114d5908990899086908a906004016153db565b602060405180830381600087803b1580156114ef57600080fd5b505af1158015611503573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115279190614f80565b905061153283613549565b156115415761154183826135c7565b5050505050505050565b6115568583866135da565b91506000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561159357600080fd5b505afa1580156115a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115cb919061454e565b6040517fdb006a750000000000000000000000000000000000000000000000000000000081529091506001600160a01b0387169063db006a759061161390869060040161592f565b602060405180830381600087803b15801561162d57600080fd5b505af1158015611641573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116659190614f80565b156116825760405162461bcd60e51b8152600401610a079061575a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038316906370a08231906111fa9030906004016151e0565b6116d58583866135da565b91506000856001600160a01b031663eb3beb296040518163ffffffff1660e01b815260040160206040518083038186803b15801561171257600080fd5b505afa158015611726573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174a919061454e565b90506000866001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561178757600080fd5b505afa15801561179b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117bf919061454e565b6040517fead5d3590000000000000000000000000000000000000000000000000000000081529091506001600160a01b0383169063ead5d3599061182c9084907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff906000906004016153b8565b6040805180830381600087803b15801561184557600080fd5b505af1158015611859573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187d9190614f98565b50506040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038316906370a08231906118c79030906004016151e0565b60206040518083038186803b1580156118df57600080fd5b505afa1580156118f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119179190614f80565b9050611541828783876134d8565b6000856001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561196057600080fd5b505afa158015611974573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611998919061454e565b90506119a681878588613506565b92506000866001600160a01b0316636e553f6585876040518363ffffffff1660e01b81526004016119d8929190615938565b602060405180830381600087803b1580156119f257600080fd5b505af1158015611a06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2a9190614f80565b90506109ab8382613531565b6000856001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a7157600080fd5b505afa158015611a85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa9919061454e565b90506000866001600160a01b031663eb3beb296040518163ffffffff1660e01b815260040160206040518083038186803b158015611ae657600080fd5b505afa158015611afa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1e919061454e565b9050611b2c82828689613506565b93506000816001600160a01b031663fbf178db84888860006040518563ffffffff1660e01b8152600401611b63949392919061528c565b6040805180830381600087803b158015611b7c57600080fd5b505af1158015611b90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb49190614f98565b9150506115418482613531565b6000866001600160a01b0316637158da7c6040518163ffffffff1660e01b815260040160206040518083038186803b158015611bfc57600080fd5b505afa158015611c10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c34919061454e565b9050611c4281878588613506565b6040517fe2bbb1580000000000000000000000000000000000000000000000000000000081529093506001600160a01b0388169063e2bbb15890611c8d9060009087906004016151d2565b600060405180830381600087803b158015611ca757600080fd5b505af1158015611cbb573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b038a1691506370a0823190611d079030906004016151e0565b60206040518083038186803b158015611d1f57600080fd5b505afa158015611d33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d579190614f80565b9050611541888683866134d8565b611d708583866135da565b91506000856001600160a01b031663ea785a5e85856040518363ffffffff1660e01b8152600401611da292919061539f565b602060405180830381600087803b158015611dbc57600080fd5b505af1158015611dd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df49190614f80565b9050611e008282613531565b505050505050565b611e138482856135da565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081529091506001600160a01b03851690632e1a7d4d90611e5b90849060040161592f565b600060405180830381600087803b158015611e7557600080fd5b505af1158015611e89573d6000803e3d6000fd5b505050506001600160a01b03821630146106a1576000846001600160a01b03166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b158015611ed857600080fd5b505afa158015611eec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f10919061454e565b9050610cd96001600160a01b038216848461380e565b6000856001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561196057600080fd5b611f6a83613549565b15611f7b57611f7883613590565b92505b6001600160a01b0385163014611fbe576001600160a01b0385163314611fb35760405162461bcd60e51b8152600401610a0790615791565b611fbe858785613626565b6040517fead5d3590000000000000000000000000000000000000000000000000000000081526000906001600160a01b0388169063ead5d3599061200a908890889088906004016153b8565b6040805180830381600087803b15801561202357600080fd5b505af1158015612037573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205b9190614f98565b9150506110a982613549565b6000846001600160a01b03166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b1580156120a257600080fd5b505afa1580156120b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120da919061454e565b90506120e881868487613506565b6040517f6e553f650000000000000000000000000000000000000000000000000000000081529092506001600160a01b03861690636e553f65906121329085908790600401615938565b600060405180830381600087803b15801561214c57600080fd5b505af1158015612160573d6000803e3d6000fd5b505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b0384163014806121a4575082155b6121c05760405162461bcd60e51b8152600401610a07906157c8565b606063fa6e671d60e01b3386866040516024016121df939291906151f4565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909516949094179093525161224e9286918691016151ad565b60408051601f198184030181529190529050611e006001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168261382d565b61229e8583866135da565b91506000856001600160a01b031662f714ce84866040518363ffffffff1660e01b8152600401611da2929190615938565b6040517fc65427940000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c6542794906123409030908a908a908a908a908a908a9060040161533f565b600060405180830381600087803b15801561235a57600080fd5b505af115801561236e573d6000803e3d6000fd5b50505050505050505050565b866001600160a01b031663d505accf876123926123f4565b88888888886040518863ffffffff1660e01b81526004016123b997969594939291906152fe565b600060405180830381600087803b1580156123d357600080fd5b505af11580156123e7573d6000803e3d6000fd5b5050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b03851633148061243757506001600160a01b03851630145b6124535760405162461bcd60e51b8152600401610a0790615791565b600061245e886138a7565b9050600061246b83613549565b61247657600061250b565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038316906370a08231906124bb9089906004016151e0565b60206040518083038186803b1580156124d357600080fd5b505afa1580156124e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250b9190614f80565b905061251b8886604001516138ad565b60408601526125286123f4565b6001600160a01b031663b95cac28858b8a8a8a6040518663ffffffff1660e01b815260040161255a94939291906155ab565b6000604051808303818588803b15801561257357600080fd5b505af1158015612587573d6000803e3d6000fd5b505050505061259583613549565b15612160576040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038416906370a08231906125e2908a906004016151e0565b60206040518083038186803b1580156125fa57600080fd5b505afa15801561260e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126329190614f80565b905061236e84610ba18385613934565b61264d8583866135da565b6040517f441a3e700000000000000000000000000000000000000000000000000000000081529092506001600160a01b0386169063441a3e70906126b8906000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff906004016151d2565b600060405180830381600087803b1580156126d257600080fd5b505af11580156126e6573d6000803e3d6000fd5b505050506000856001600160a01b0316637158da7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561272557600080fd5b505afa158015612739573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275d919061454e565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016111fa91906151e0565b876001600160a01b0316638fcbaf0c886127a56123f4565b8989898989896040518963ffffffff1660e01b81526004016127ce9897969594939291906152b5565b600060405180830381600087803b1580156127e857600080fd5b505af11580156127fc573d6000803e3d6000fd5b505050505050505050505050565b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561284557600080fd5b505afa158015612859573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287d919061454e565b905061288b81878588613506565b92506000866001600160a01b0316632f4f21e286866040518363ffffffff1660e01b81526004016119d892919061539f565b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156128f857600080fd5b505afa15801561290c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612930919061454e565b905061293e81878588613506565b6040517fb6b55f250000000000000000000000000000000000000000000000000000000081529093506001600160a01b0387169063b6b55f259061298690869060040161592f565b600060405180830381600087803b1580156129a057600080fd5b505af11580156129b4573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b03891691506370a0823190610e609030906004016151e0565b612a0981613549565b15612a1a57612a1781613590565b90505b612a36612a256123f4565b6001600160a01b03841690836136c2565b5050565b612a458583866135da565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081529092506001600160a01b03861690632e1a7d4d90612a8d90859060040161592f565b600060405180830381600087803b158015612aa757600080fd5b505af1158015612abb573d6000803e3d6000fd5b505050506000856001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561272557600080fd5b6001600160a01b038516331480612b1957506001600160a01b03851630145b612b355760405162461bcd60e51b8152600401610a0790615791565b60608167ffffffffffffffff81118015612b4e57600080fd5b50604051908082528060200260200182016040528015612b78578160200160208202803683370190505b50905060608267ffffffffffffffff81118015612b9457600080fd5b50604051908082528060200260200182016040528015612bbe578160200160208202803683370190505b50905060005b83811015612d2e57612bdb858583818110610b2c57fe5b612bf75760405162461bcd60e51b8152600401610a079061586d565b8551600090868684818110612c0857fe5b9050604002016000013581518110612c1c57fe5b60200260200101519050866060015115612c6a57612c398161394a565b848381518110612c4557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050612d25565b612c738161394d565b612d0057612c808161394a565b6001600160a01b03166370a08231896040518263ffffffff1660e01b8152600401612cab91906151e0565b60206040518083038186803b158015612cc357600080fd5b505afa158015612cd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cfb9190614f80565b612d0c565b876001600160a01b0316315b838381518110612d1857fe5b6020026020010181815250505b50600101612bc4565b50846060015115612dc557612d416123f4565b6001600160a01b0316630f5a6efa87846040518363ffffffff1660e01b8152600401612d6e929190615218565b60006040518083038186803b158015612d8657600080fd5b505afa158015612d9a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612dc29190810190614800565b90505b612dd388866040015161395a565b6040860152612de06123f4565b6001600160a01b0316638bdb39138a8989896040518563ffffffff1660e01b8152600401612e1194939291906155ab565b600060405180830381600087803b158015612e2b57600080fd5b505af1158015612e3f573d6000803e3d6000fd5b50606092508591505067ffffffffffffffff81118015612e5e57600080fd5b50604051908082528060200260200182016040528015612e88578160200160208202803683370190505b509050856060015115612f2557612e9d6123f4565b6001600160a01b0316630f5a6efa88856040518363ffffffff1660e01b8152600401612eca929190615218565b60006040518083038186803b158015612ee257600080fd5b505afa158015612ef6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612f1e9190810190614800565b9050613023565b60005b84811015613021578651600090878784818110612f4157fe5b9050604002016000013581518110612f5557fe5b60200260200101519050612f688161394d565b612ff557612f758161394a565b6001600160a01b03166370a082318a6040518263ffffffff1660e01b8152600401612fa091906151e0565b60206040518083038186803b158015612fb857600080fd5b505afa158015612fcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff09190614f80565b613001565b886001600160a01b0316315b83838151811061300d57fe5b602090810291909101015250600101612f28565b505b60005b848110156123e75761308086868381811061303d57fe5b90506040020160200135610ba185848151811061305657fe5b602002602001015185858151811061306a57fe5b602002602001015161393490919063ffffffff16565b600101613026565b6130b37f000000000000000000000000000000000000000000000000000000000000000083866135da565b915060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663de0e9a3e846040518263ffffffff1660e01b8152600401613103919061592f565b602060405180830381600087803b15801561311d57600080fd5b505af1158015613131573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131559190614f80565b9050610cd97f00000000000000000000000000000000000000000000000000000000000000008583856134d8565b6000856001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156128f857600080fd5b60005b8281101561325257338484838181106131d657fe5b905060a0020160600160208101906131ee9190614532565b6001600160a01b0316148061322e57503084848381811061320b57fe5b905060a0020160600160208101906132239190614532565b6001600160a01b0316145b61324a5760405162461bcd60e51b8152600401610a0790615791565b6001016131c1565b5061325b6123f4565b6001600160a01b0316630e8e3e848285856040518463ffffffff1660e01b8152600401613289929190615467565b6000604051808303818588803b1580156132a257600080fd5b505af1158015611541573d6000803e3d6000fd5b6132c18583866135da565b91506000856001600160a01b031663ba0876528486306040518463ffffffff1660e01b8152600401611da29392919061594f565b6000613300826139d0565b9392505050565b6133128583866135da565b91506000856001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561334f57600080fd5b505afa158015613363573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613387919061454e565b6040517f05fe138b0000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906305fe138b906133d19086908890600401615938565b600060405180830381600087803b1580156133eb57600080fd5b505af11580156133ff573d6000803e3d6000fd5b50505050611e0082826001600160a01b0316635427c938866040518263ffffffff1660e01b8152600401610956919061592f565b600061343e82613549565b6134485781613451565b61345182613590565b90505b919050565b613468814710156101a36139e7565b6000826001600160a01b0316826040516134819061394a565b60006040518083038185875af1925050503d80600081146134be576040519150601f19603f3d011682016040523d82523d6000602084013e6134c3565b606091505b505090506134d3816101a46139e7565b505050565b6001600160a01b03831630146134fc576134fc6001600160a01b038516848461380e565b6106a18183613531565b60006135138584846135da565b90506135296001600160a01b03861685836136c2565b949350505050565b61353a82613549565b15612a3657612a3682826135c7565b7ffff0000000000000000000000000000000000000000000000000000000000000167fba100000000000000000000000000000000000000000000000000000000000001490565b600080600061359e846139d0565b915091506135ab846139f5565b1561330057600082559392505050565b60ff81901d9081180390565b60006135d283613a3c565b919091555050565b60006135e583613433565b90506001600160a01b0382163014613300576001600160a01b038216331461361f5760405162461bcd60e51b8152600401610a0790615791565b6133008285835b80613630576134d3565b60408051600180825281830190925260609160208083019080368337019050509050828160008151811061366057fe5b6001600160a01b03929092166020928302919091019091015260408051600180825281830190925260609181602001602082028036833701905050905082816000815181106136ab57fe5b602002602001018181525050610cd9858383613a9a565b801580159061376657506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063dd62ed3e906137139030908690600401615272565b60206040518083038186803b15801561372b57600080fd5b505afa15801561373f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137639190614f80565b15155b156137ef576137ef8363095ea7b360e01b84600060405160240161378b929190615383565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613bd4565b6134d38363095ea7b360e01b848460405160240161378b92919061539f565b6134d38363a9059cbb60e01b848460405160240161378b92919061539f565b606060006060846001600160a01b03168460405161384b9190615191565b6000604051808303816000865af19150503d8060008114613888576040519150601f19603f3d011682016040523d82523d6000602084013e61388d565b606091505b509150915061389c8282613c74565b925050505b92915050565b60601c90565b606060008360038111156138bd57fe5b14156138d3576138cc82613c9e565b90506138a1565b60018360038111156138e157fe5b14806138f8575060028360038111156138f657fe5b145b8061390e5750600383600381111561390c57fe5b145b1561391c576138cc82613c9e565b60405162461bcd60e51b8152600401610a0790615836565b60006139448383111560016139e7565b50900390565b90565b6001600160a01b03161590565b6060600083600381111561396a57fe5b1415613979576138cc82613cdb565b600183600381111561398757fe5b1415613996576138cc82613d24565b60028360038111156139a457fe5b14156139b3576138cc82613d6a565b60038360038111156139c157fe5b141561391c576138cc82613d96565b6000806139dc83613a3c565b915081549050915091565b81612a3657612a3681613dc9565b7fffff000000000000000000000000000000000000000000000000000000000000167fba100000000000000000000000000000000000000000000000000000000000001490565b60006001613a4983613df6565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001613a7b9291906151d2565b60408051808303601f1901815291905280516020909101200392915050565b6060825167ffffffffffffffff81118015613ab457600080fd5b50604051908082528060200260200182016040528015613aee57816020015b613adb614125565b815260200190600190039081613ad35790505b50905060005b8351811015613b86576040805160a081019091528060038152602001858381518110613b1c57fe5b60200260200101516001600160a01b03168152602001848381518110613b3e57fe5b60200260200101518152602001866001600160a01b03168152602001306001600160a01b0316815250828281518110613b7357fe5b6020908102919091010152600101613af4565b50613b8f6123f4565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b8152600401613bba9190615515565b600060405180830381600087803b1580156132a257600080fd5b60006060836001600160a01b031683604051613bf09190615191565b6000604051808303816000865af19150503d8060008114613c2d576040519150601f19603f3d011682016040523d82523d6000602084013e613c32565b606091505b50915091506000821415613c4a573d6000803e3d6000fd5b6106a1815160001480613c6c575081806020019051810190613c6c9190614833565b6101a26139e7565b60608215613c835750806138a1565b815115613c935781518083602001fd5b6138a16101ae613dc9565b60606000613cab83613e19565b90506001816003811115613cbb57fe5b1415613cd257613cca83613e2f565b915050613454565b82915050613454565b60606000613ce883613e81565b90506000816002811115613cf857fe5b1415613d0757613cca83613e97565b6001816002811115613d1557fe5b1415613cd257613cca83613efa565b60606000613d3183613e81565b6002811115613d3c57fe5b905060ff8116613d5057613cca8382613f4d565b60015b60ff168160ff161415613cd257613cca8382613faf565b60606000613d7783613e81565b6002811115613d8257fe5b905060ff8116613cd257613cca8382613f4d565b60606000613da383613e81565b6002811115613dae57fe5b905060ff8116613dc257613cca8382613f4d565b6002613d53565b613df3817f42414c000000000000000000000000000000000000000000000000000000000061400a565b50565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b6000818060200190518101906134519190614d0a565b6060806000613e3d8461406b565b91509150613e4a8261408e565b613e545783613529565b60018282604051602001613e6a9392919061561f565b604051602081830303815290604052949350505050565b6000818060200190518101906134519190614c8b565b6060600080613ea5846140f8565b91509150613eb282613549565b15613ef057613ec082613590565b915060008282604051602001613ed8939291906155fe565b60405160208183030381529060405292505050613454565b8392505050613454565b60606000613f078361410f565b9050613f1281613549565b15613cd257613f2081613590565b9050600181604051602001613f369291906155e7565b604051602081830303815290604052915050613454565b6060600080613f5b856140f8565b91509150613f6882613549565b15613fa557613f7682613590565b9150838282604051602001613f8d939291906159a0565b604051602081830303815290604052925050506138a1565b84925050506138a1565b60606000613fbc8461410f565b9050613fc781613549565b1561400157613fd581613590565b90508281604051602001613fea92919061598d565b6040516020818303038152906040529150506138a1565b839150506138a1565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60606000828060200190518101906140839190614d26565b909590945092505050565b600080805b83518110156140f15760008482815181106140aa57fe5b602002602001015190506140bd81613549565b156140e8576140cb81613590565b8583815181106140d757fe5b602002602001018181525050600192505b50600101614093565b5092915050565b600080828060200190518101906140839190614cd4565b6000818060200190518101906133009190614ca7565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b80356138a181615a59565b60008083601f840112614171578182fd5b50813567ffffffffffffffff811115614188578182fd5b60208301915083602080830285010111156141a257600080fd5b9250929050565b600082601f8301126141b9578081fd5b81356141cc6141c7826159e2565b6159bb565b8181529150602080830190848101818402860182018710156141ed57600080fd5b60005b8481101561421557813561420381615a59565b845292820192908201906001016141f0565b505050505092915050565b600082601f830112614230578081fd5b813561423e6141c7826159e2565b818152915060208083019084810160005b84811015614215578135870160a080601f19838c0301121561427057600080fd5b614279816159bb565b85830135815260408084013587830152606080850135828401526080915081850135818401525082840135925067ffffffffffffffff8311156142bb57600080fd5b6142c98c88858701016143eb565b9082015286525050928201929082019060010161424f565b60008083601f8401126142f2578182fd5b50813567ffffffffffffffff811115614309578182fd5b6020830191508360206040830285010111156141a257600080fd5b600082601f830112614334578081fd5b81356143426141c7826159e2565b81815291506020808301908481018184028601820187101561436357600080fd5b60005b8481101561421557813584529282019290820190600101614366565b600082601f830112614392578081fd5b81516143a06141c7826159e2565b8181529150602080830190848101818402860182018710156143c157600080fd5b60005b84811015614215578151845292820192908201906001016143c4565b80356138a181615a6e565b600082601f8301126143fb578081fd5b813567ffffffffffffffff811115614411578182fd5b6144246020601f19601f840116016159bb565b915080825283602082850101111561443b57600080fd5b8060208401602084013760009082016020015292915050565b8035600281106138a157600080fd5b600060808284031215614474578081fd5b61447e60806159bb565b9050813567ffffffffffffffff8082111561449857600080fd5b6144a4858386016141a9565b835260208401359150808211156144ba57600080fd5b6144c685838601614324565b602084015260408401359150808211156144df57600080fd5b506144ec848285016143eb565b6040830152506144ff83606084016143e0565b606082015292915050565b60006080828403121561451b578081fd5b50919050565b803560ff811681146138a157600080fd5b600060208284031215614543578081fd5b813561330081615a59565b60006020828403121561455f578081fd5b815161330081615a59565b6000806000806080858703121561457f578283fd5b843561458a81615a59565b9350602085013561459a81615a59565b93969395505050506040820135916060013590565b600080600080606085870312156145c4578182fd5b84356145cf81615a59565b935060208501356145df81615a6e565b9250604085013567ffffffffffffffff808211156145fb578384fd5b818701915087601f83011261460e578384fd5b81358181111561461c578485fd5b88602082850101111561462d578485fd5b95989497505060200194505050565b600080600060608486031215614650578081fd5b833561465b81615a59565b95602085013595506040909401359392505050565b600080600060408486031215614684578081fd5b833567ffffffffffffffff81111561469a578182fd5b6146a686828701614160565b909790965060209590950135949350505050565b600080602083850312156146cc578182fd5b823567ffffffffffffffff8111156146e2578283fd5b6146ee85828601614160565b90969095509350505050565b6000602080838503121561470c578182fd5b825167ffffffffffffffff811115614722578283fd5b8301601f81018513614732578283fd5b80516147406141c7826159e2565b818152838101908385018584028501860189101561475c578687fd5b8694505b8385101561477e578051835260019490940193918501918501614760565b50979650505050505050565b60008060006040848603121561479e578081fd5b833567ffffffffffffffff808211156147b5578283fd5b818601915086601f8301126147c8578283fd5b8135818111156147d6578384fd5b87602060a0830285010111156147ea578384fd5b6020928301989097509590910135949350505050565b600060208284031215614811578081fd5b815167ffffffffffffffff811115614827578182fd5b61352984828501614382565b600060208284031215614844578081fd5b815161330081615a6e565b60008060008060008060c08789031215614867578384fd5b863561487281615a6e565b9550602087013561488281615a59565b9450604087013593506148988860608901614521565b92506080870135915060a087013590509295509295509295565b600080600080600080600060c0888a0312156148cc578485fd5b8735965060208801356148de81615a89565b955060408801356148ee81615a59565b945060608801356148fe81615a59565b9350608088013567ffffffffffffffff8082111561491a578283fd5b6149268b838c01614463565b945060a08a013591508082111561493b578283fd5b506149488a828b016142e1565b989b979a50959850939692959293505050565b600080600080600080600060e0888a031215614975578081fd5b87359650602088013561498781615a89565b9550604088013561499781615a59565b945060608801356149a781615a59565b9350608088013567ffffffffffffffff8111156149c2578182fd5b6149ce8a828b01614463565b93505060a0880135915060c0880135905092959891949750929550565b600080600080600060a08688031215614a02578283fd5b8535614a0d81615a59565b94506020860135614a1d81615a59565b93506040860135614a2d81615a59565b94979396509394606081013594506080013592915050565b600080600080600080600080610100898b031215614a61578182fd5b8835614a6c81615a59565b97506020890135614a7c81615a59565b965060408901359550606089013594506080890135614a9a81615a6e565b9350614aa98a60a08b01614521565b925060c0890135915060e089013590509295985092959890939650565b600080600080600080600060e0888a031215614ae0578081fd5b8735614aeb81615a59565b96506020880135614afb81615a59565b95506040880135945060608801359350614b188960808a01614521565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215614b46578182fd5b8235614b5181615a59565b946020939093013593505050565b60008060008060008060c08789031215614b77578384fd5b8635614b8281615a59565b95506020870135614b9281615a59565b94506040870135614ba281615a59565b93506060870135614bb281615a59565b9598949750929560808101359460a0909101359350915050565b60008060008060808587031215614be1578182fd5b8435614bec81615a59565b93506020850135614bfc81615a59565b92506040850135614c0c81615a59565b9396929550929360600135925050565b60008060008060008060c08789031215614c34578384fd5b8635614c3f81615a59565b95506020870135614c4f81615a59565b94506040870135614c5f81615a59565b9350606087013592506080870135614c7681615a6e565b8092505060a087013590509295509295509295565b600060208284031215614c9c578081fd5b815161330081615a7c565b60008060408385031215614cb9578182fd5b8251614cc481615a7c565b6020939093015192949293505050565b600080600060608486031215614ce8578081fd5b8351614cf381615a7c565b602085015160409095015190969495509392505050565b600060208284031215614d1b578081fd5b815161330081615a89565b600080600060608486031215614d3a578081fd5b8351614d4581615a89565b602085015190935067ffffffffffffffff811115614d61578182fd5b614d6d86828701614382565b925050604084015190509250925092565b60008060008060008060008060008060006101608c8e031215614d9f578485fd5b614da98d8d614454565b9a5067ffffffffffffffff8060208e01351115614dc4578586fd5b614dd48e60208f01358f01614220565b9a508060408e01351115614de6578586fd5b614df68e60408f01358f01614160565b909a509850614e088e60608f0161450a565b97508060e08e01351115614e1a578586fd5b614e2a8e60e08f01358f01614160565b90975095506101008d013594506101208d013593506101408d0135811015614e50578283fd5b50614e628d6101408e01358e016142e1565b81935080925050509295989b509295989b9093969950565b6000806000806000806101208789031215614e93578384fd5b863567ffffffffffffffff80821115614eaa578586fd5b9088019060c0828b031215614ebd578586fd5b614ec760c06159bb565b82358152614ed88b60208501614454565b60208201526040830135614eeb81615a59565b6040820152614efd8b60608501614155565b60608201526080830135608082015260a083013582811115614f1d578788fd5b614f298c8286016143eb565b60a083015250809850505050614f42886020890161450a565b959895975050505060a08401359360c08101359360e08201359350610100909101359150565b600060208284031215614f79578081fd5b5035919050565b600060208284031215614f91578081fd5b5051919050565b60008060408385031215614faa578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b60008284526020808501945082825b85811015615005578135614fea81615a59565b6001600160a01b031687529582019590820190600101614fd7565b509495945050505050565b60008284526020808501945082825b858110156150055781358752958201959082019060010161501f565b6000815180845260208085019450808401835b838110156150055781518752958201959082019060010161504e565b15159052565b60008151808452615088816020860160208601615a0f565b601f01601f19169290920160200192915050565b8051608080845281519084018190526000916020919082019060a0860190845b818110156150e15783516001600160a01b0316835292840192918401916001016150bc565b5050828501519150858103838701526150fa818361503b565b92505050604083015184820360408601526151158282615070565b915050606083015161512a606086018261506a565b509392505050565b803561513d81615a59565b6001600160a01b03908116835260208201359061515982615a6e565b901515602084015260408201359061517082615a59565b166040830152606081013561518481615a6e565b8015156060840152505050565b600082516151a3818460208701615a0f565b9190910192915050565b600084516151bf818460208901615a0f565b8201838582379092019182525092915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000604082016001600160a01b03808616845260206040818601528286518085526060870191508288019450855b81811015615264578551851683529483019491830191600101615246565b509098975050505050505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0394851681529290931660208301526040820152901515606082015260800190565b6001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b0397881681529515156020870152939095166040850152606084019190915260ff16608083015260a082019290925260c081019190915260e00190565b6001600160a01b0392909216825260ff16602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b6001600160a01b03949094168452602084019290925261ffff1660408301521515606082015260800190565b6040808252810183905260008460608301825b8681101561544a576020833561542f81615a59565b6001600160a01b03168352928301929091019060010161541a565b5080925050506001600160a01b0383166020830152949350505050565b6020808252818101839052600090604080840186845b8781101561550857813561549081615a89565b61549981615a45565b8352818501356154a881615a59565b6001600160a01b031683860152818401358484015260606154cb81840184615a02565b6154d782860182614fbb565b505060806154e781840184615a02565b6154f382860182614fbb565b505060a092830192919091019060010161547d565b5090979650505050505050565b602080825282518282018190526000919060409081850190868401855b8281101561559e578151805161554781615a45565b8552808701516001600160a01b031687860152858101518686015260608082015161557482880182614fbb565b50506080908101519061558986820183614fbb565b505060a0939093019290850190600101615532565b5091979650505050505050565b60008582526001600160a01b038086166020840152808516604084015250608060608301526155dd608083018461509c565b9695505050505050565b604081016155f484615a3b565b9281526020015290565b6060810161560b85615a3b565b938152602081019290925260409091015290565b600061562a85615a45565b84825260606020830152615641606083018561503b565b9050826040830152949350505050565b60006101208083016156628c615a4f565b8b84526020808501929092528a5190819052610140808501928281028601909101918c8201855b82811015615709578785037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec00186528151805186528481015185870152604080820151908701526060808201519087015260809081015160a0918701829052906156f581880183615070565b978601979650505090830190600101615689565b505050508381036040850152615720818a8c614fc8565b9150506157306060840188615132565b82810360e0840152615743818688615010565b915050826101008301529998505050505050505050565b60208082526011908201527f756e7772617070696e67206661696c6564000000000000000000000000000000604082015260600190565b60208082526010908201527f496e636f72726563742073656e64657200000000000000000000000000000000604082015260600190565b6020808252601f908201527f52656c617965722063616e206f6e6c7920617070726f766520697473656c6600604082015260600190565b6020808252600f908201527f7772617070696e67206661696c65640000000000000000000000000000000000604082015260600190565b60208082526013908201527f554e48414e444c45445f504f4f4c5f4b494e4400000000000000000000000000604082015260600190565b60208082526019908201527f696e76616c696420636861696e6564207265666572656e636500000000000000604082015260600190565b600060e08252855160e083015260208601516158bf81615a4f565b61010083015260408601516001600160a01b03908116610120840152606087015116610140830152608086015161016083015260a086015160c061018084015261590d6101a0840182615070565b91505061591d6020830186615132565b60a082019390935260c0015292915050565b90815260200190565b9182526001600160a01b0316602082015260400190565b9283526001600160a01b03918216602084015216604082015260600190565b9283526001600160a01b03919091166020830152604082015260600190565b60ff929092168252602082015260400190565b60ff9390931683526020830191909152604082015260600190565b60405181810167ffffffffffffffff811182821017156159da57600080fd5b604052919050565b600067ffffffffffffffff8211156159f8578081fd5b5060209081020190565b6000823561330081615a59565b60005b83811015615a2a578181015183820152602001615a12565b838111156106a15750506000910152565b60038110613df357fe5b60048110613df357fe5b60028110613df357fe5b6001600160a01b0381168114613df357600080fd5b8015158114613df357600080fd5b60038110613df357600080fd5b60048110613df357600080fdfea26469706673582212206cde45f42c79b2b8c9ddfed64000d7c1dfd987a23d0836b6c5f058b54bb6762064736f6c6343000701003360c060405234801561001057600080fd5b5060405161078738038061078783398101604081905261002f91610052565b60016000556001600160601b0319606092831b8116608052911b1660a0526100a3565b60008060408385031215610064578182fd5b825161006f8161008b565b60208401519092506100808161008b565b809150509250929050565b6001600160a01b03811681146100a057600080fd5b50565b60805160601c60a05160601c6106b36100d46000398060fc528061020f5250806058528061012052506106b36000f3fe6080604052600436106100385760003560e01c80637678922e146100885780638d928af8146100b3578063ac9650d8146100c857610083565b36610083576100813373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146102066100e8565b005b600080fd5b34801561009457600080fd5b5061009d6100fa565b6040516100aa919061050e565b60405180910390f35b3480156100bf57600080fd5b5061009d61011e565b6100db6100d6366004610480565b610142565b6040516100aa919061052f565b816100f6576100f68161026e565b5050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b606061014c61029b565b8167ffffffffffffffff8111801561016357600080fd5b5060405190808252806020026020018201604052801561019757816020015b60608152602001906001900390816101825790505b50905060005b82811015610257576102388484838181106101b457fe5b90506020028101906101c691906105e3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929150506102b4565b82828151811061024457fe5b602090810291909101015260010161019d565b50610260610337565b610268610348565b92915050565b610298817f42414c000000000000000000000000000000000000000000000000000000000061034f565b50565b6102ad600260005414156101906100e8565b6002600055565b6060600060608473ffffffffffffffffffffffffffffffffffffffff16846040516102df91906104ef565b600060405180830381855af49150503d806000811461031a576040519150601f19603f3d011682016040523d82523d6000602084013e61031f565b606091505b509150915061032e82826103ca565b95945050505050565b4780156102985761029833826103f4565b6001600055565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b606082156103d9575080610268565b8151156103e95781518083602001fd5b6102686101ae61026e565b610403814710156101a36100e8565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516104299061050b565b60006040518083038185875af1925050503d8060008114610466576040519150601f19603f3d011682016040523d82523d6000602084013e61046b565b606091505b5050905061047b816101a46100e8565b505050565b60008060208385031215610492578182fd5b823567ffffffffffffffff808211156104a9578384fd5b818501915085601f8301126104bc578384fd5b8135818111156104ca578485fd5b86602080830285010111156104dd578485fd5b60209290920196919550909350505050565b6000825161050181846020870161064d565b9190910192915050565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156105d6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845281518051808752610599818989018a850161064d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01695909501860194509285019290850190600101610554565b5092979650505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610617578283fd5b83018035915067ffffffffffffffff821115610631578283fd5b60200191503681900382131561064657600080fd5b9250929050565b60005b83811015610668578181015183820152602001610650565b83811115610677576000848401525b5050505056fea26469706673582212201120b234fb57d56607056c92dd83b5cf9c324b095090d2b5b628463e9259399564736f6c63430007010033", + "deployedBytecode": "0x6080604052600436106102c65760003560e01c80637bc008f511610179578063abf6d399116100d6578063db4c0e911161008a578063efe6910811610064578063efe69108146105b9578063f3cab685146105cc578063f4dd54b0146105f9576102c6565b8063db4c0e9114610580578063e8210e3c14610593578063ecc02637146105a6576102c6565b8063b6d24737116100bb578063b6d2473714610547578063d293f2901461055a578063d80952d51461056d576102c6565b8063abf6d39914610521578063b064b37614610534576102c6565b80638d64cfbc1161012d5780638fe4624f116101125780638fe4624f146104e8578063941e849b146104fb578063959fc17a1461050e576102c6565b80638d64cfbc146104c05780638d928af8146104d3576102c6565b806380db15bd1161015e57806380db15bd146104875780638b35ac8d1461049a5780638c57198b146104ad576102c6565b80637bc008f5146104495780637fd0e5d51461045c576102c6565b8063433b08651161022757806352b88746116101db57806365ca4804116101c057806365ca4804146104105780636d307ea8146104235780637ab6e03c14610436576102c6565b806352b88746146103ea578063611b90dd146103fd576102c6565b80634e9d9bab1161020c5780634e9d9bab146103b15780634f06a70b146103c45780635001fe75146103d7576102c6565b8063433b08651461038b57806344b6ac741461039e576102c6565b80632c25efe11161027e5780632e6272ea116102635780632e6272ea14610352578063311c5c57146103655780633f85d39014610378576102c6565b80632c25efe11461032c5780632cbec84e1461033f576102c6565b8063138fdc2c116102af578063138fdc2c146102f357806318369446146103065780631c98244114610319576102c6565b80630e248fea146102cb5780631089e5e3146102e0575b600080fd5b6102de6102d93660046146ba565b61060c565b005b6102de6102ee36600461463c565b6106a7565b6102de6103013660046149eb565b6107b1565b6102de610314366004614d7e565b6109b4565b6102de61032736600461456a565b610bbd565b6102de61033a3660046149eb565b610ce0565b6102de61034d36600461463c565b610ebe565b6102de610360366004614e7a565b610f98565b6102de6103733660046149eb565b6110b8565b6102de610386366004614670565b611258565b6102de610399366004614c1c565b611322565b6102de6103ac3660046149eb565b61154b565b6102de6103bf3660046149eb565b6116ca565b6102de6103d23660046149eb565b611925565b6102de6103e53660046149eb565b611a36565b6102de6103f8366004614b5f565b611bc1565b6102de61040b3660046149eb565b611d65565b6102de61041e366004614bcc565b611e08565b6102de6104313660046149eb565b611f26565b6102de610444366004614c1c565b611f61565b6102de610457366004614bcc565b612067565b34801561046857600080fd5b5061047161216b565b60405161047e91906151e0565b60405180910390f35b6102de6104953660046145af565b61218f565b6102de6104a83660046149eb565b612293565b6102de6104bb36600461484f565b6122cf565b6102de6104ce366004614ac6565b61237a565b3480156104df57600080fd5b506104716123f4565b6102de6104f636600461495b565b612418565b6102de6105093660046149eb565b612642565b6102de61051c366004614a45565b61278d565b6102de61052f3660046149eb565b61280a565b6102de6105423660046149eb565b6128bd565b6102de610555366004614b34565b612a00565b6102de6105683660046149eb565b612a3a565b6102de61057b3660046148b2565b612afa565b6102de61058e36600461456a565b613088565b6102de6105a13660046149eb565b613183565b6102de6105b436600461478a565b6131be565b6102de6105c73660046149eb565b6132b6565b3480156105d857600080fd5b506105ec6105e7366004614f68565b6132f5565b60405161047e919061592f565b6102de6106073660046149eb565b613307565b8060005b818110156106a15783838281811061062457fe5b90506020020160208101906106399190614532565b6001600160a01b03166384e9bd7e336040518263ffffffff1660e01b815260040161066491906151e0565b600060405180830381600087803b15801561067e57600080fd5b505af1158015610692573d6000803e3d6000fd5b50505050806001019050610610565b50505050565b6106b082613433565b915060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b0e38900846040518263ffffffff1660e01b8152600401610700919061592f565b60206040518083038186803b15801561071857600080fd5b505afa15801561072c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107509190614f80565b90506107856001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001684613459565b6106a17f00000000000000000000000000000000000000000000000000000000000000008583856134d8565b6000856001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156107ec57600080fd5b505afa158015610800573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610824919061454e565b90506000816001600160a01b0316632495a5996040518163ffffffff1660e01b815260040160206040518083038186803b15801561086157600080fd5b505afa158015610875573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610899919061454e565b90506108a781838689613506565b6040517f9aa5d4620000000000000000000000000000000000000000000000000000000081529094506001600160a01b03831690639aa5d462906108f4908790899060009060040161596e565b600060405180830381600087803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050506109ab83836001600160a01b0316634d778ad1876040518263ffffffff1660e01b8152600401610956919061592f565b60206040518083038186803b15801561096e57600080fd5b505afa158015610982573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a69190614f80565b613531565b50505050505050565b336109c26020890189614532565b6001600160a01b031614806109eb5750306109e06020890189614532565b6001600160a01b0316145b610a105760405162461bcd60e51b8152600401610a0790615791565b60405180910390fd5b60005b8a51811015610a755760008b8281518110610a2a57fe5b6020026020010151606001519050610a4181613549565b15610a6c57610a4f81613590565b8c8381518110610a5b57fe5b602002602001015160600181815250505b50600101610a13565b506060610a806123f4565b6001600160a01b031663945bcec9858e8e8e8e8e8e8e8e6040518a63ffffffff1660e01b8152600401610aba989796959493929190615651565b6000604051808303818588803b158015610ad357600080fd5b505af1158015610ae7573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052610b1091908101906146fa565b905060005b82811015610bae57610b3b848483818110610b2c57fe5b90506040020160200135613549565b610b575760405162461bcd60e51b8152600401610a079061586d565b610ba6848483818110610b6657fe5b90506040020160200135610ba184878786818110610b8057fe5b9050604002016000013581518110610b9457fe5b60200260200101516135bb565b6135c7565b600101610b15565b50505050505050505050505050565b610c097f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008487613506565b915060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ea598cb0846040518263ffffffff1660e01b8152600401610c59919061592f565b602060405180830381600087803b158015610c7357600080fd5b505af1158015610c87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cab9190614f80565b9050610cd97f00000000000000000000000000000000000000000000000000000000000000008583856134d8565b5050505050565b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610d1b57600080fd5b505afa158015610d2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d53919061454e565b9050610d6181878588613506565b6040517fa0712d680000000000000000000000000000000000000000000000000000000081529093506001600160a01b0387169063a0712d6890610da990869060040161592f565b602060405180830381600087803b158015610dc357600080fd5b505af1158015610dd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfb9190614f80565b15610e185760405162461bcd60e51b8152600401610a07906157ff565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038816906370a0823190610e609030906004016151e0565b60206040518083038186803b158015610e7857600080fd5b505afa158015610e8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb09190614f80565b90506109ab878683866134d8565b610ec782613433565b915060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a1903eab84306040518363ffffffff1660e01b8152600401610f1891906151e0565b6020604051808303818588803b158015610f3157600080fd5b505af1158015610f45573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610f6a9190614f80565b90506106a17f00000000000000000000000000000000000000000000000000000000000000008583856134d8565b33610fa66020870187614532565b6001600160a01b03161480610fcf575030610fc46020870187614532565b6001600160a01b0316145b610feb5760405162461bcd60e51b8152600401610a0790615791565b610ff88660800151613549565b156110105761100a8660800151613590565b60808701525b600061101a6123f4565b6001600160a01b03166352bbbe2984898989896040518663ffffffff1660e01b815260040161104c94939291906158a4565b6020604051808303818588803b15801561106557600080fd5b505af1158015611079573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061109e9190614f80565b90506110a982613549565b156109ab576109ab82826135c7565b6110c38583866135da565b91506000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561110057600080fd5b505afa158015611114573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611138919061454e565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081529091506001600160a01b03871690632e1a7d4d9061118090869060040161592f565b600060405180830381600087803b15801561119a57600080fd5b505af11580156111ae573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b03841691506370a08231906111fa9030906004016151e0565b60206040518083038186803b15801561121257600080fd5b505afa158015611226573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124a9190614f80565b90506109ab828683866134d8565b6040517f3b9f73840000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633b9f7384906112c490879087903390600401615407565b602060405180830381600087803b1580156112de57600080fd5b505af11580156112f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113169190614f80565b90506106a18282613531565b61132b83613549565b1561133c5761133983613590565b92505b6000826113bb57866001600160a01b03166351c0e0616040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561137e57600080fd5b505af1158015611392573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b6919061454e565b61142e565b866001600160a01b0316634800d97f6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156113f657600080fd5b505af115801561140a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142e919061454e565b90506001600160a01b0386163014611473576001600160a01b03861633146114685760405162461bcd60e51b8152600401610a0790615791565b611473868286613626565b6114876001600160a01b03821688866136c2565b6040517f2f2cab870000000000000000000000000000000000000000000000000000000081526000906001600160a01b03891690632f2cab87906114d5908990899086908a906004016153db565b602060405180830381600087803b1580156114ef57600080fd5b505af1158015611503573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115279190614f80565b905061153283613549565b156115415761154183826135c7565b5050505050505050565b6115568583866135da565b91506000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561159357600080fd5b505afa1580156115a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115cb919061454e565b6040517fdb006a750000000000000000000000000000000000000000000000000000000081529091506001600160a01b0387169063db006a759061161390869060040161592f565b602060405180830381600087803b15801561162d57600080fd5b505af1158015611641573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116659190614f80565b156116825760405162461bcd60e51b8152600401610a079061575a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038316906370a08231906111fa9030906004016151e0565b6116d58583866135da565b91506000856001600160a01b031663eb3beb296040518163ffffffff1660e01b815260040160206040518083038186803b15801561171257600080fd5b505afa158015611726573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174a919061454e565b90506000866001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561178757600080fd5b505afa15801561179b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117bf919061454e565b6040517fead5d3590000000000000000000000000000000000000000000000000000000081529091506001600160a01b0383169063ead5d3599061182c9084907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff906000906004016153b8565b6040805180830381600087803b15801561184557600080fd5b505af1158015611859573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187d9190614f98565b50506040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038316906370a08231906118c79030906004016151e0565b60206040518083038186803b1580156118df57600080fd5b505afa1580156118f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119179190614f80565b9050611541828783876134d8565b6000856001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561196057600080fd5b505afa158015611974573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611998919061454e565b90506119a681878588613506565b92506000866001600160a01b0316636e553f6585876040518363ffffffff1660e01b81526004016119d8929190615938565b602060405180830381600087803b1580156119f257600080fd5b505af1158015611a06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2a9190614f80565b90506109ab8382613531565b6000856001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a7157600080fd5b505afa158015611a85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa9919061454e565b90506000866001600160a01b031663eb3beb296040518163ffffffff1660e01b815260040160206040518083038186803b158015611ae657600080fd5b505afa158015611afa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1e919061454e565b9050611b2c82828689613506565b93506000816001600160a01b031663fbf178db84888860006040518563ffffffff1660e01b8152600401611b63949392919061528c565b6040805180830381600087803b158015611b7c57600080fd5b505af1158015611b90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb49190614f98565b9150506115418482613531565b6000866001600160a01b0316637158da7c6040518163ffffffff1660e01b815260040160206040518083038186803b158015611bfc57600080fd5b505afa158015611c10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c34919061454e565b9050611c4281878588613506565b6040517fe2bbb1580000000000000000000000000000000000000000000000000000000081529093506001600160a01b0388169063e2bbb15890611c8d9060009087906004016151d2565b600060405180830381600087803b158015611ca757600080fd5b505af1158015611cbb573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b038a1691506370a0823190611d079030906004016151e0565b60206040518083038186803b158015611d1f57600080fd5b505afa158015611d33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d579190614f80565b9050611541888683866134d8565b611d708583866135da565b91506000856001600160a01b031663ea785a5e85856040518363ffffffff1660e01b8152600401611da292919061539f565b602060405180830381600087803b158015611dbc57600080fd5b505af1158015611dd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df49190614f80565b9050611e008282613531565b505050505050565b611e138482856135da565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081529091506001600160a01b03851690632e1a7d4d90611e5b90849060040161592f565b600060405180830381600087803b158015611e7557600080fd5b505af1158015611e89573d6000803e3d6000fd5b505050506001600160a01b03821630146106a1576000846001600160a01b03166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b158015611ed857600080fd5b505afa158015611eec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f10919061454e565b9050610cd96001600160a01b038216848461380e565b6000856001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561196057600080fd5b611f6a83613549565b15611f7b57611f7883613590565b92505b6001600160a01b0385163014611fbe576001600160a01b0385163314611fb35760405162461bcd60e51b8152600401610a0790615791565b611fbe858785613626565b6040517fead5d3590000000000000000000000000000000000000000000000000000000081526000906001600160a01b0388169063ead5d3599061200a908890889088906004016153b8565b6040805180830381600087803b15801561202357600080fd5b505af1158015612037573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205b9190614f98565b9150506110a982613549565b6000846001600160a01b03166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b1580156120a257600080fd5b505afa1580156120b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120da919061454e565b90506120e881868487613506565b6040517f6e553f650000000000000000000000000000000000000000000000000000000081529092506001600160a01b03861690636e553f65906121329085908790600401615938565b600060405180830381600087803b15801561214c57600080fd5b505af1158015612160573d6000803e3d6000fd5b505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b0384163014806121a4575082155b6121c05760405162461bcd60e51b8152600401610a07906157c8565b606063fa6e671d60e01b3386866040516024016121df939291906151f4565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909516949094179093525161224e9286918691016151ad565b60408051601f198184030181529190529050611e006001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168261382d565b61229e8583866135da565b91506000856001600160a01b031662f714ce84866040518363ffffffff1660e01b8152600401611da2929190615938565b6040517fc65427940000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c6542794906123409030908a908a908a908a908a908a9060040161533f565b600060405180830381600087803b15801561235a57600080fd5b505af115801561236e573d6000803e3d6000fd5b50505050505050505050565b866001600160a01b031663d505accf876123926123f4565b88888888886040518863ffffffff1660e01b81526004016123b997969594939291906152fe565b600060405180830381600087803b1580156123d357600080fd5b505af11580156123e7573d6000803e3d6000fd5b5050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b03851633148061243757506001600160a01b03851630145b6124535760405162461bcd60e51b8152600401610a0790615791565b600061245e886138a7565b9050600061246b83613549565b61247657600061250b565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038316906370a08231906124bb9089906004016151e0565b60206040518083038186803b1580156124d357600080fd5b505afa1580156124e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250b9190614f80565b905061251b8886604001516138ad565b60408601526125286123f4565b6001600160a01b031663b95cac28858b8a8a8a6040518663ffffffff1660e01b815260040161255a94939291906155ab565b6000604051808303818588803b15801561257357600080fd5b505af1158015612587573d6000803e3d6000fd5b505050505061259583613549565b15612160576040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038416906370a08231906125e2908a906004016151e0565b60206040518083038186803b1580156125fa57600080fd5b505afa15801561260e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126329190614f80565b905061236e84610ba18385613934565b61264d8583866135da565b6040517f441a3e700000000000000000000000000000000000000000000000000000000081529092506001600160a01b0386169063441a3e70906126b8906000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff906004016151d2565b600060405180830381600087803b1580156126d257600080fd5b505af11580156126e6573d6000803e3d6000fd5b505050506000856001600160a01b0316637158da7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561272557600080fd5b505afa158015612739573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275d919061454e565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016111fa91906151e0565b876001600160a01b0316638fcbaf0c886127a56123f4565b8989898989896040518963ffffffff1660e01b81526004016127ce9897969594939291906152b5565b600060405180830381600087803b1580156127e857600080fd5b505af11580156127fc573d6000803e3d6000fd5b505050505050505050505050565b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561284557600080fd5b505afa158015612859573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287d919061454e565b905061288b81878588613506565b92506000866001600160a01b0316632f4f21e286866040518363ffffffff1660e01b81526004016119d892919061539f565b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156128f857600080fd5b505afa15801561290c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612930919061454e565b905061293e81878588613506565b6040517fb6b55f250000000000000000000000000000000000000000000000000000000081529093506001600160a01b0387169063b6b55f259061298690869060040161592f565b600060405180830381600087803b1580156129a057600080fd5b505af11580156129b4573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b03891691506370a0823190610e609030906004016151e0565b612a0981613549565b15612a1a57612a1781613590565b90505b612a36612a256123f4565b6001600160a01b03841690836136c2565b5050565b612a458583866135da565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081529092506001600160a01b03861690632e1a7d4d90612a8d90859060040161592f565b600060405180830381600087803b158015612aa757600080fd5b505af1158015612abb573d6000803e3d6000fd5b505050506000856001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561272557600080fd5b6001600160a01b038516331480612b1957506001600160a01b03851630145b612b355760405162461bcd60e51b8152600401610a0790615791565b60608167ffffffffffffffff81118015612b4e57600080fd5b50604051908082528060200260200182016040528015612b78578160200160208202803683370190505b50905060608267ffffffffffffffff81118015612b9457600080fd5b50604051908082528060200260200182016040528015612bbe578160200160208202803683370190505b50905060005b83811015612d2e57612bdb858583818110610b2c57fe5b612bf75760405162461bcd60e51b8152600401610a079061586d565b8551600090868684818110612c0857fe5b9050604002016000013581518110612c1c57fe5b60200260200101519050866060015115612c6a57612c398161394a565b848381518110612c4557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050612d25565b612c738161394d565b612d0057612c808161394a565b6001600160a01b03166370a08231896040518263ffffffff1660e01b8152600401612cab91906151e0565b60206040518083038186803b158015612cc357600080fd5b505afa158015612cd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cfb9190614f80565b612d0c565b876001600160a01b0316315b838381518110612d1857fe5b6020026020010181815250505b50600101612bc4565b50846060015115612dc557612d416123f4565b6001600160a01b0316630f5a6efa87846040518363ffffffff1660e01b8152600401612d6e929190615218565b60006040518083038186803b158015612d8657600080fd5b505afa158015612d9a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612dc29190810190614800565b90505b612dd388866040015161395a565b6040860152612de06123f4565b6001600160a01b0316638bdb39138a8989896040518563ffffffff1660e01b8152600401612e1194939291906155ab565b600060405180830381600087803b158015612e2b57600080fd5b505af1158015612e3f573d6000803e3d6000fd5b50606092508591505067ffffffffffffffff81118015612e5e57600080fd5b50604051908082528060200260200182016040528015612e88578160200160208202803683370190505b509050856060015115612f2557612e9d6123f4565b6001600160a01b0316630f5a6efa88856040518363ffffffff1660e01b8152600401612eca929190615218565b60006040518083038186803b158015612ee257600080fd5b505afa158015612ef6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612f1e9190810190614800565b9050613023565b60005b84811015613021578651600090878784818110612f4157fe5b9050604002016000013581518110612f5557fe5b60200260200101519050612f688161394d565b612ff557612f758161394a565b6001600160a01b03166370a082318a6040518263ffffffff1660e01b8152600401612fa091906151e0565b60206040518083038186803b158015612fb857600080fd5b505afa158015612fcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff09190614f80565b613001565b886001600160a01b0316315b83838151811061300d57fe5b602090810291909101015250600101612f28565b505b60005b848110156123e75761308086868381811061303d57fe5b90506040020160200135610ba185848151811061305657fe5b602002602001015185858151811061306a57fe5b602002602001015161393490919063ffffffff16565b600101613026565b6130b37f000000000000000000000000000000000000000000000000000000000000000083866135da565b915060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663de0e9a3e846040518263ffffffff1660e01b8152600401613103919061592f565b602060405180830381600087803b15801561311d57600080fd5b505af1158015613131573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131559190614f80565b9050610cd97f00000000000000000000000000000000000000000000000000000000000000008583856134d8565b6000856001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156128f857600080fd5b60005b8281101561325257338484838181106131d657fe5b905060a0020160600160208101906131ee9190614532565b6001600160a01b0316148061322e57503084848381811061320b57fe5b905060a0020160600160208101906132239190614532565b6001600160a01b0316145b61324a5760405162461bcd60e51b8152600401610a0790615791565b6001016131c1565b5061325b6123f4565b6001600160a01b0316630e8e3e848285856040518463ffffffff1660e01b8152600401613289929190615467565b6000604051808303818588803b1580156132a257600080fd5b505af1158015611541573d6000803e3d6000fd5b6132c18583866135da565b91506000856001600160a01b031663ba0876528486306040518463ffffffff1660e01b8152600401611da29392919061594f565b6000613300826139d0565b9392505050565b6133128583866135da565b91506000856001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561334f57600080fd5b505afa158015613363573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613387919061454e565b6040517f05fe138b0000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906305fe138b906133d19086908890600401615938565b600060405180830381600087803b1580156133eb57600080fd5b505af11580156133ff573d6000803e3d6000fd5b50505050611e0082826001600160a01b0316635427c938866040518263ffffffff1660e01b8152600401610956919061592f565b600061343e82613549565b6134485781613451565b61345182613590565b90505b919050565b613468814710156101a36139e7565b6000826001600160a01b0316826040516134819061394a565b60006040518083038185875af1925050503d80600081146134be576040519150601f19603f3d011682016040523d82523d6000602084013e6134c3565b606091505b505090506134d3816101a46139e7565b505050565b6001600160a01b03831630146134fc576134fc6001600160a01b038516848461380e565b6106a18183613531565b60006135138584846135da565b90506135296001600160a01b03861685836136c2565b949350505050565b61353a82613549565b15612a3657612a3682826135c7565b7ffff0000000000000000000000000000000000000000000000000000000000000167fba100000000000000000000000000000000000000000000000000000000000001490565b600080600061359e846139d0565b915091506135ab846139f5565b1561330057600082559392505050565b60ff81901d9081180390565b60006135d283613a3c565b919091555050565b60006135e583613433565b90506001600160a01b0382163014613300576001600160a01b038216331461361f5760405162461bcd60e51b8152600401610a0790615791565b6133008285835b80613630576134d3565b60408051600180825281830190925260609160208083019080368337019050509050828160008151811061366057fe5b6001600160a01b03929092166020928302919091019091015260408051600180825281830190925260609181602001602082028036833701905050905082816000815181106136ab57fe5b602002602001018181525050610cd9858383613a9a565b801580159061376657506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063dd62ed3e906137139030908690600401615272565b60206040518083038186803b15801561372b57600080fd5b505afa15801561373f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137639190614f80565b15155b156137ef576137ef8363095ea7b360e01b84600060405160240161378b929190615383565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613bd4565b6134d38363095ea7b360e01b848460405160240161378b92919061539f565b6134d38363a9059cbb60e01b848460405160240161378b92919061539f565b606060006060846001600160a01b03168460405161384b9190615191565b6000604051808303816000865af19150503d8060008114613888576040519150601f19603f3d011682016040523d82523d6000602084013e61388d565b606091505b509150915061389c8282613c74565b925050505b92915050565b60601c90565b606060008360038111156138bd57fe5b14156138d3576138cc82613c9e565b90506138a1565b60018360038111156138e157fe5b14806138f8575060028360038111156138f657fe5b145b8061390e5750600383600381111561390c57fe5b145b1561391c576138cc82613c9e565b60405162461bcd60e51b8152600401610a0790615836565b60006139448383111560016139e7565b50900390565b90565b6001600160a01b03161590565b6060600083600381111561396a57fe5b1415613979576138cc82613cdb565b600183600381111561398757fe5b1415613996576138cc82613d24565b60028360038111156139a457fe5b14156139b3576138cc82613d6a565b60038360038111156139c157fe5b141561391c576138cc82613d96565b6000806139dc83613a3c565b915081549050915091565b81612a3657612a3681613dc9565b7fffff000000000000000000000000000000000000000000000000000000000000167fba100000000000000000000000000000000000000000000000000000000000001490565b60006001613a4983613df6565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001613a7b9291906151d2565b60408051808303601f1901815291905280516020909101200392915050565b6060825167ffffffffffffffff81118015613ab457600080fd5b50604051908082528060200260200182016040528015613aee57816020015b613adb614125565b815260200190600190039081613ad35790505b50905060005b8351811015613b86576040805160a081019091528060038152602001858381518110613b1c57fe5b60200260200101516001600160a01b03168152602001848381518110613b3e57fe5b60200260200101518152602001866001600160a01b03168152602001306001600160a01b0316815250828281518110613b7357fe5b6020908102919091010152600101613af4565b50613b8f6123f4565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b8152600401613bba9190615515565b600060405180830381600087803b1580156132a257600080fd5b60006060836001600160a01b031683604051613bf09190615191565b6000604051808303816000865af19150503d8060008114613c2d576040519150601f19603f3d011682016040523d82523d6000602084013e613c32565b606091505b50915091506000821415613c4a573d6000803e3d6000fd5b6106a1815160001480613c6c575081806020019051810190613c6c9190614833565b6101a26139e7565b60608215613c835750806138a1565b815115613c935781518083602001fd5b6138a16101ae613dc9565b60606000613cab83613e19565b90506001816003811115613cbb57fe5b1415613cd257613cca83613e2f565b915050613454565b82915050613454565b60606000613ce883613e81565b90506000816002811115613cf857fe5b1415613d0757613cca83613e97565b6001816002811115613d1557fe5b1415613cd257613cca83613efa565b60606000613d3183613e81565b6002811115613d3c57fe5b905060ff8116613d5057613cca8382613f4d565b60015b60ff168160ff161415613cd257613cca8382613faf565b60606000613d7783613e81565b6002811115613d8257fe5b905060ff8116613cd257613cca8382613f4d565b60606000613da383613e81565b6002811115613dae57fe5b905060ff8116613dc257613cca8382613f4d565b6002613d53565b613df3817f42414c000000000000000000000000000000000000000000000000000000000061400a565b50565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b6000818060200190518101906134519190614d0a565b6060806000613e3d8461406b565b91509150613e4a8261408e565b613e545783613529565b60018282604051602001613e6a9392919061561f565b604051602081830303815290604052949350505050565b6000818060200190518101906134519190614c8b565b6060600080613ea5846140f8565b91509150613eb282613549565b15613ef057613ec082613590565b915060008282604051602001613ed8939291906155fe565b60405160208183030381529060405292505050613454565b8392505050613454565b60606000613f078361410f565b9050613f1281613549565b15613cd257613f2081613590565b9050600181604051602001613f369291906155e7565b604051602081830303815290604052915050613454565b6060600080613f5b856140f8565b91509150613f6882613549565b15613fa557613f7682613590565b9150838282604051602001613f8d939291906159a0565b604051602081830303815290604052925050506138a1565b84925050506138a1565b60606000613fbc8461410f565b9050613fc781613549565b1561400157613fd581613590565b90508281604051602001613fea92919061598d565b6040516020818303038152906040529150506138a1565b839150506138a1565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60606000828060200190518101906140839190614d26565b909590945092505050565b600080805b83518110156140f15760008482815181106140aa57fe5b602002602001015190506140bd81613549565b156140e8576140cb81613590565b8583815181106140d757fe5b602002602001018181525050600192505b50600101614093565b5092915050565b600080828060200190518101906140839190614cd4565b6000818060200190518101906133009190614ca7565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b80356138a181615a59565b60008083601f840112614171578182fd5b50813567ffffffffffffffff811115614188578182fd5b60208301915083602080830285010111156141a257600080fd5b9250929050565b600082601f8301126141b9578081fd5b81356141cc6141c7826159e2565b6159bb565b8181529150602080830190848101818402860182018710156141ed57600080fd5b60005b8481101561421557813561420381615a59565b845292820192908201906001016141f0565b505050505092915050565b600082601f830112614230578081fd5b813561423e6141c7826159e2565b818152915060208083019084810160005b84811015614215578135870160a080601f19838c0301121561427057600080fd5b614279816159bb565b85830135815260408084013587830152606080850135828401526080915081850135818401525082840135925067ffffffffffffffff8311156142bb57600080fd5b6142c98c88858701016143eb565b9082015286525050928201929082019060010161424f565b60008083601f8401126142f2578182fd5b50813567ffffffffffffffff811115614309578182fd5b6020830191508360206040830285010111156141a257600080fd5b600082601f830112614334578081fd5b81356143426141c7826159e2565b81815291506020808301908481018184028601820187101561436357600080fd5b60005b8481101561421557813584529282019290820190600101614366565b600082601f830112614392578081fd5b81516143a06141c7826159e2565b8181529150602080830190848101818402860182018710156143c157600080fd5b60005b84811015614215578151845292820192908201906001016143c4565b80356138a181615a6e565b600082601f8301126143fb578081fd5b813567ffffffffffffffff811115614411578182fd5b6144246020601f19601f840116016159bb565b915080825283602082850101111561443b57600080fd5b8060208401602084013760009082016020015292915050565b8035600281106138a157600080fd5b600060808284031215614474578081fd5b61447e60806159bb565b9050813567ffffffffffffffff8082111561449857600080fd5b6144a4858386016141a9565b835260208401359150808211156144ba57600080fd5b6144c685838601614324565b602084015260408401359150808211156144df57600080fd5b506144ec848285016143eb565b6040830152506144ff83606084016143e0565b606082015292915050565b60006080828403121561451b578081fd5b50919050565b803560ff811681146138a157600080fd5b600060208284031215614543578081fd5b813561330081615a59565b60006020828403121561455f578081fd5b815161330081615a59565b6000806000806080858703121561457f578283fd5b843561458a81615a59565b9350602085013561459a81615a59565b93969395505050506040820135916060013590565b600080600080606085870312156145c4578182fd5b84356145cf81615a59565b935060208501356145df81615a6e565b9250604085013567ffffffffffffffff808211156145fb578384fd5b818701915087601f83011261460e578384fd5b81358181111561461c578485fd5b88602082850101111561462d578485fd5b95989497505060200194505050565b600080600060608486031215614650578081fd5b833561465b81615a59565b95602085013595506040909401359392505050565b600080600060408486031215614684578081fd5b833567ffffffffffffffff81111561469a578182fd5b6146a686828701614160565b909790965060209590950135949350505050565b600080602083850312156146cc578182fd5b823567ffffffffffffffff8111156146e2578283fd5b6146ee85828601614160565b90969095509350505050565b6000602080838503121561470c578182fd5b825167ffffffffffffffff811115614722578283fd5b8301601f81018513614732578283fd5b80516147406141c7826159e2565b818152838101908385018584028501860189101561475c578687fd5b8694505b8385101561477e578051835260019490940193918501918501614760565b50979650505050505050565b60008060006040848603121561479e578081fd5b833567ffffffffffffffff808211156147b5578283fd5b818601915086601f8301126147c8578283fd5b8135818111156147d6578384fd5b87602060a0830285010111156147ea578384fd5b6020928301989097509590910135949350505050565b600060208284031215614811578081fd5b815167ffffffffffffffff811115614827578182fd5b61352984828501614382565b600060208284031215614844578081fd5b815161330081615a6e565b60008060008060008060c08789031215614867578384fd5b863561487281615a6e565b9550602087013561488281615a59565b9450604087013593506148988860608901614521565b92506080870135915060a087013590509295509295509295565b600080600080600080600060c0888a0312156148cc578485fd5b8735965060208801356148de81615a89565b955060408801356148ee81615a59565b945060608801356148fe81615a59565b9350608088013567ffffffffffffffff8082111561491a578283fd5b6149268b838c01614463565b945060a08a013591508082111561493b578283fd5b506149488a828b016142e1565b989b979a50959850939692959293505050565b600080600080600080600060e0888a031215614975578081fd5b87359650602088013561498781615a89565b9550604088013561499781615a59565b945060608801356149a781615a59565b9350608088013567ffffffffffffffff8111156149c2578182fd5b6149ce8a828b01614463565b93505060a0880135915060c0880135905092959891949750929550565b600080600080600060a08688031215614a02578283fd5b8535614a0d81615a59565b94506020860135614a1d81615a59565b93506040860135614a2d81615a59565b94979396509394606081013594506080013592915050565b600080600080600080600080610100898b031215614a61578182fd5b8835614a6c81615a59565b97506020890135614a7c81615a59565b965060408901359550606089013594506080890135614a9a81615a6e565b9350614aa98a60a08b01614521565b925060c0890135915060e089013590509295985092959890939650565b600080600080600080600060e0888a031215614ae0578081fd5b8735614aeb81615a59565b96506020880135614afb81615a59565b95506040880135945060608801359350614b188960808a01614521565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215614b46578182fd5b8235614b5181615a59565b946020939093013593505050565b60008060008060008060c08789031215614b77578384fd5b8635614b8281615a59565b95506020870135614b9281615a59565b94506040870135614ba281615a59565b93506060870135614bb281615a59565b9598949750929560808101359460a0909101359350915050565b60008060008060808587031215614be1578182fd5b8435614bec81615a59565b93506020850135614bfc81615a59565b92506040850135614c0c81615a59565b9396929550929360600135925050565b60008060008060008060c08789031215614c34578384fd5b8635614c3f81615a59565b95506020870135614c4f81615a59565b94506040870135614c5f81615a59565b9350606087013592506080870135614c7681615a6e565b8092505060a087013590509295509295509295565b600060208284031215614c9c578081fd5b815161330081615a7c565b60008060408385031215614cb9578182fd5b8251614cc481615a7c565b6020939093015192949293505050565b600080600060608486031215614ce8578081fd5b8351614cf381615a7c565b602085015160409095015190969495509392505050565b600060208284031215614d1b578081fd5b815161330081615a89565b600080600060608486031215614d3a578081fd5b8351614d4581615a89565b602085015190935067ffffffffffffffff811115614d61578182fd5b614d6d86828701614382565b925050604084015190509250925092565b60008060008060008060008060008060006101608c8e031215614d9f578485fd5b614da98d8d614454565b9a5067ffffffffffffffff8060208e01351115614dc4578586fd5b614dd48e60208f01358f01614220565b9a508060408e01351115614de6578586fd5b614df68e60408f01358f01614160565b909a509850614e088e60608f0161450a565b97508060e08e01351115614e1a578586fd5b614e2a8e60e08f01358f01614160565b90975095506101008d013594506101208d013593506101408d0135811015614e50578283fd5b50614e628d6101408e01358e016142e1565b81935080925050509295989b509295989b9093969950565b6000806000806000806101208789031215614e93578384fd5b863567ffffffffffffffff80821115614eaa578586fd5b9088019060c0828b031215614ebd578586fd5b614ec760c06159bb565b82358152614ed88b60208501614454565b60208201526040830135614eeb81615a59565b6040820152614efd8b60608501614155565b60608201526080830135608082015260a083013582811115614f1d578788fd5b614f298c8286016143eb565b60a083015250809850505050614f42886020890161450a565b959895975050505060a08401359360c08101359360e08201359350610100909101359150565b600060208284031215614f79578081fd5b5035919050565b600060208284031215614f91578081fd5b5051919050565b60008060408385031215614faa578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b60008284526020808501945082825b85811015615005578135614fea81615a59565b6001600160a01b031687529582019590820190600101614fd7565b509495945050505050565b60008284526020808501945082825b858110156150055781358752958201959082019060010161501f565b6000815180845260208085019450808401835b838110156150055781518752958201959082019060010161504e565b15159052565b60008151808452615088816020860160208601615a0f565b601f01601f19169290920160200192915050565b8051608080845281519084018190526000916020919082019060a0860190845b818110156150e15783516001600160a01b0316835292840192918401916001016150bc565b5050828501519150858103838701526150fa818361503b565b92505050604083015184820360408601526151158282615070565b915050606083015161512a606086018261506a565b509392505050565b803561513d81615a59565b6001600160a01b03908116835260208201359061515982615a6e565b901515602084015260408201359061517082615a59565b166040830152606081013561518481615a6e565b8015156060840152505050565b600082516151a3818460208701615a0f565b9190910192915050565b600084516151bf818460208901615a0f565b8201838582379092019182525092915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000604082016001600160a01b03808616845260206040818601528286518085526060870191508288019450855b81811015615264578551851683529483019491830191600101615246565b509098975050505050505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0394851681529290931660208301526040820152901515606082015260800190565b6001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b0397881681529515156020870152939095166040850152606084019190915260ff16608083015260a082019290925260c081019190915260e00190565b6001600160a01b0392909216825260ff16602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b6001600160a01b03949094168452602084019290925261ffff1660408301521515606082015260800190565b6040808252810183905260008460608301825b8681101561544a576020833561542f81615a59565b6001600160a01b03168352928301929091019060010161541a565b5080925050506001600160a01b0383166020830152949350505050565b6020808252818101839052600090604080840186845b8781101561550857813561549081615a89565b61549981615a45565b8352818501356154a881615a59565b6001600160a01b031683860152818401358484015260606154cb81840184615a02565b6154d782860182614fbb565b505060806154e781840184615a02565b6154f382860182614fbb565b505060a092830192919091019060010161547d565b5090979650505050505050565b602080825282518282018190526000919060409081850190868401855b8281101561559e578151805161554781615a45565b8552808701516001600160a01b031687860152858101518686015260608082015161557482880182614fbb565b50506080908101519061558986820183614fbb565b505060a0939093019290850190600101615532565b5091979650505050505050565b60008582526001600160a01b038086166020840152808516604084015250608060608301526155dd608083018461509c565b9695505050505050565b604081016155f484615a3b565b9281526020015290565b6060810161560b85615a3b565b938152602081019290925260409091015290565b600061562a85615a45565b84825260606020830152615641606083018561503b565b9050826040830152949350505050565b60006101208083016156628c615a4f565b8b84526020808501929092528a5190819052610140808501928281028601909101918c8201855b82811015615709578785037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec00186528151805186528481015185870152604080820151908701526060808201519087015260809081015160a0918701829052906156f581880183615070565b978601979650505090830190600101615689565b505050508381036040850152615720818a8c614fc8565b9150506157306060840188615132565b82810360e0840152615743818688615010565b915050826101008301529998505050505050505050565b60208082526011908201527f756e7772617070696e67206661696c6564000000000000000000000000000000604082015260600190565b60208082526010908201527f496e636f72726563742073656e64657200000000000000000000000000000000604082015260600190565b6020808252601f908201527f52656c617965722063616e206f6e6c7920617070726f766520697473656c6600604082015260600190565b6020808252600f908201527f7772617070696e67206661696c65640000000000000000000000000000000000604082015260600190565b60208082526013908201527f554e48414e444c45445f504f4f4c5f4b494e4400000000000000000000000000604082015260600190565b60208082526019908201527f696e76616c696420636861696e6564207265666572656e636500000000000000604082015260600190565b600060e08252855160e083015260208601516158bf81615a4f565b61010083015260408601516001600160a01b03908116610120840152606087015116610140830152608086015161016083015260a086015160c061018084015261590d6101a0840182615070565b91505061591d6020830186615132565b60a082019390935260c0015292915050565b90815260200190565b9182526001600160a01b0316602082015260400190565b9283526001600160a01b03918216602084015216604082015260600190565b9283526001600160a01b03919091166020830152604082015260600190565b60ff929092168252602082015260400190565b60ff9390931683526020830191909152604082015260600190565b60405181810167ffffffffffffffff811182821017156159da57600080fd5b604052919050565b600067ffffffffffffffff8211156159f8578081fd5b5060209081020190565b6000823561330081615a59565b60005b83811015615a2a578181015183820152602001615a12565b838111156106a15750506000910152565b60038110613df357fe5b60048110613df357fe5b60028110613df357fe5b6001600160a01b0381168114613df357600080fd5b8015158114613df357600080fd5b60038110613df357600080fd5b60048110613df357600080fdfea26469706673582212206cde45f42c79b2b8c9ddfed64000d7c1dfd987a23d0836b6c5f058b54bb6762064736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/index.ts b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/index.ts new file mode 100644 index 0000000..552b495 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/index.ts @@ -0,0 +1,16 @@ +import { Task, TaskRunOptions } from '@src'; +import { BatchRelayerDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as BatchRelayerDeployment; + + const relayerLibraryArgs = [input.Vault, input.wstETH, input.BalancerMinter]; + const relayerLibrary = await task.deployAndVerify('BatchRelayerLibrary', relayerLibraryArgs, from, force); + + // The relayer library automatically also deploys the relayer itself: we must verify it + const relayer: string = await relayerLibrary.getEntrypoint(); + + const relayerArgs = [input.Vault, relayerLibrary.address]; // See BalancerRelayer's constructor + await task.verify('BalancerRelayer', relayer, relayerArgs); + await task.save({ BalancerRelayer: relayer }); +}; diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/input.ts b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/input.ts new file mode 100644 index 0000000..87f8df4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/input.ts @@ -0,0 +1,59 @@ +import { Task, TaskMode } from '@src'; + +export type BatchRelayerDeployment = { + Vault: string; + wstETH: string; + BalancerMinter: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerMinter = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); + +export default { + Vault, + // wstETH and BalancerMinter are only deployed on mainnet, and goerli. + mainnet: { + wstETH: '0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0', + BalancerMinter, + }, + goerli: { + wstETH: '0x6320cD32aA674d2898A68ec82e869385Fc5f7E2f', + BalancerMinter, + }, + sepolia: { + wstETH: '0x0000000000000000000000000000000000000000', + BalancerMinter, + }, + polygon: { + wstETH: '0x0000000000000000000000000000000000000000', + BalancerMinter: '0x0000000000000000000000000000000000000000', + }, + arbitrum: { + wstETH: '0x0000000000000000000000000000000000000000', + BalancerMinter: '0x0000000000000000000000000000000000000000', + }, + optimism: { + wstETH: '0x0000000000000000000000000000000000000000', + BalancerMinter: '0x0000000000000000000000000000000000000000', + }, + gnosis: { + wstETH: '0x0000000000000000000000000000000000000000', + BalancerMinter: '0x0000000000000000000000000000000000000000', + }, + bsc: { + wstETH: '0x0000000000000000000000000000000000000000', + BalancerMinter: '0x0000000000000000000000000000000000000000', + }, + avalanche: { + wstETH: '0x0000000000000000000000000000000000000000', + BalancerMinter: '0x0000000000000000000000000000000000000000', + }, + zkevm: { + wstETH: '0x0000000000000000000000000000000000000000', + BalancerMinter: '0x0000000000000000000000000000000000000000', + }, + base: { + wstETH: '0x0000000000000000000000000000000000000000', + BalancerMinter: '0x0000000000000000000000000000000000000000', + }, +}; diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/arbitrum.json b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/arbitrum.json new file mode 100644 index 0000000..2a8e378 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/arbitrum.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0xD87F44Df0159DC78029AB9CA7D7e57E7249F5ACD", + "BalancerRelayer": "0x598ce0f1ab64B27256759ef99d883EE51138b9bd" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/avalanche.json b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/avalanche.json new file mode 100644 index 0000000..4ea4e3c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/avalanche.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B", + "BalancerRelayer": "0x03F1ab8b19bcE21EB06C364aEc9e40322572a1e9" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/base.json b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/base.json new file mode 100644 index 0000000..ec745d9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/base.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0xDF9B5B00Ef9bca66e9902Bd813dB14e4343Be025", + "BalancerRelayer": "0x76f7204B62f554b79d444588EDac9dfA7032c71a" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/bsc.json b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/bsc.json new file mode 100644 index 0000000..4ea4e3c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/bsc.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B", + "BalancerRelayer": "0x03F1ab8b19bcE21EB06C364aEc9e40322572a1e9" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/gnosis.json b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/gnosis.json new file mode 100644 index 0000000..a0ab1a0 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/gnosis.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0xb9aD3466cdd42015cc05d4804DC68D562b6a2065", + "BalancerRelayer": "0x3536fD480CA495Ac91E698A703248A8915c137a3" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/goerli.json b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/goerli.json new file mode 100644 index 0000000..4ea4e3c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/goerli.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B", + "BalancerRelayer": "0x03F1ab8b19bcE21EB06C364aEc9e40322572a1e9" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/mainnet.json b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/mainnet.json new file mode 100644 index 0000000..75a191d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0xf77018c0d817dA22caDbDf504C00c0d32cE1e5C2", + "BalancerRelayer": "0xfeA793Aa415061C483D2390414275AD314B3F621" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/optimism.json b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/optimism.json new file mode 100644 index 0000000..4ea4e3c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/optimism.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B", + "BalancerRelayer": "0x03F1ab8b19bcE21EB06C364aEc9e40322572a1e9" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/polygon.json b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/polygon.json new file mode 100644 index 0000000..7d268eb --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/polygon.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x4271de2595c3d85d2D455C5778adF2d7Ad54322C", + "BalancerRelayer": "0xd18d5D377eb23362e54Fa496597d7E962d56C554" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/sepolia.json b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/sepolia.json new file mode 100644 index 0000000..d8414b2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/sepolia.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x5F6848976C2914403B425F18B589A65772F082E3", + "BalancerRelayer": "0x6d5342d716c13d9a3F072a2B11498624ADe27f90" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/zkevm.json b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/zkevm.json new file mode 100644 index 0000000..6d9f48c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/output/zkevm.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x54f8F9d28e26Fa5864cfA80f50A5Df95fD85f46a", + "BalancerRelayer": "0x4678731DC41142A902a114aC5B2F77b63f4a259D" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/readme.md b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/readme.md new file mode 100644 index 0000000..76e0f2f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/readme.md @@ -0,0 +1,21 @@ +# 2023-03-14 - Batch Relayer V5 + +Deployment of the fifth `BalancerRelayer` using `BatchRelayerLibrary`, for combining multiple operations (swaps, joins, etc.) in a single transaction. + +This new version provides full support for all versions of Stable Pools: in particular, V2 and higher, which support proportional joins and exits. +It also adds support for many new protocol wrappers: CompoundV2 (Midas), Euler, Gearbox, Silo, Tetu, and Yearn. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`BatchRelayerLibrary` artifact](./artifact/BatchRelayerLibrary.json) diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/composableStableV1.fork.ts b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/composableStableV1.fork.ts new file mode 100644 index 0000000..3b6661e --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/composableStableV1.fork.ts @@ -0,0 +1,171 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { StablePoolEncoder } from '@helpers/models/pools/stable/encoder'; +import { bn, fp } from '@helpers/numbers'; +import { MAX_UINT256 } from '@helpers/constants'; +import { defaultAbiCoder } from '@ethersproject/abi/lib/abi-coder'; +import * as expectEvent from '@helpers/expectEvent'; +import { describeForkTest, getSigner, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; +import { + DAI, + USDC, + amplificationParameter, + cacheDurations, + exemptFlags, + rateProviders, + swapFeePercentage, + tokens, + initialBalances, + PoolKind, +} from './helpers/sharedStableParams'; + +describeForkTest('BatchRelayerLibrary - Composable Stable V1', 'mainnet', 16083775, function () { + let task: Task; + + let relayer: Contract, library: Contract; + let vault: Contract, authorizer: Contract; + + before('run task', async () => { + task = new Task('20230314-batch-relayer-v5', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + + library = await task.deployedInstance('BatchRelayerLibrary'); + relayer = await task.instanceAt('BalancerRelayer', await library.getEntrypoint()); + }); + + before('load vault and authorizer', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + + vault = await vaultTask.deployedInstance('Vault'); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + }); + + const LARGE_TOKEN_HOLDER = '0xf977814e90da44bfa03b6295a0616a897441acec'; + + enum ComposableStablePoolV1ExitKind { + EXACT_BPT_IN_FOR_ONE_TOKEN_OUT = 0, + BPT_IN_FOR_EXACT_TOKENS_OUT, + } + + let owner: SignerWithAddress, whale: SignerWithAddress; + let pool: Contract, factory: Contract; + let usdc: Contract, dai: Contract; + let poolId: string; + let stableTask: Task; + + before('get signers', async () => { + owner = await getSigner(); + whale = await impersonate(LARGE_TOKEN_HOLDER); + }); + + before('approve relayer at the authorizer', async () => { + const relayerActionIds = await Promise.all( + ['swap', 'batchSwap', 'joinPool', 'exitPool', 'setRelayerApproval', 'manageUserBalance'].map((action) => + vault.getActionId(vault.interface.getSighash(action)) + ) + ); + + // We impersonate an account with the default admin role in order to be able to approve the relayer. This assumes + // such an account exists. + const admin = await impersonate(await authorizer.getRoleMember(await authorizer.DEFAULT_ADMIN_ROLE(), 0)); + + // Grant relayer permission to call all relayer functions + await authorizer.connect(admin).grantRoles(relayerActionIds, relayer.address); + }); + + before('approve relayer by the user', async () => { + await vault.connect(owner).setRelayerApproval(owner.address, relayer.address, true); + }); + + before('load tokens and approve', async () => { + dai = await task.instanceAt('IERC20', DAI); + usdc = await task.instanceAt('IERC20', USDC); + + await dai.connect(whale).approve(vault.address, MAX_UINT256); + await usdc.connect(whale).approve(vault.address, MAX_UINT256); + }); + + before('run composable stable pool task', async () => { + stableTask = new Task('20220906-composable-stable-pool', TaskMode.READ_ONLY, getForkedNetwork(hre)); + factory = await stableTask.deployedInstance('ComposableStablePoolFactory'); + }); + + before('deploy composable stable pool', async () => { + const tx = await factory.create( + 'SP', + 'SPT', + tokens, + amplificationParameter, + rateProviders, + cacheDurations, + exemptFlags, + swapFeePercentage, + owner.address + ); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await stableTask.instanceAt('ComposableStablePool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + }); + + before('initialize composable stable pool', async () => { + const bptIndex = await pool.getBptIndex(); + + const composableInitialBalances = Array.from({ length: tokens.length + 1 }).map((_, i) => + i == bptIndex ? 0 : i < bptIndex ? initialBalances[i] : initialBalances[i - 1] + ); + const { tokens: allTokens } = await vault.getPoolTokens(poolId); + + const userData = StablePoolEncoder.joinInit(composableInitialBalances); + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: allTokens, + maxAmountsIn: Array(tokens.length + 1).fill(MAX_UINT256), + fromInternalBalance: false, + userData, + }); + }); + + // V1 does not support proportional exits + it('can exit with exact tokens through the relayer', async () => { + const bptBalance = await pool.balanceOf(owner.address); + expect(bptBalance).to.gt(0); + + const vaultDAIBalanceBeforeExit = await dai.balanceOf(vault.address); + const ownerDAIBalanceBeforeExit = await dai.balanceOf(owner.address); + const { tokens: allTokens } = await vault.getPoolTokens(poolId); + const amountsOut = [fp(100), bn(100e6)]; + + const userData = defaultAbiCoder.encode( + ['uint256', 'uint256[]', 'uint256'], + [ComposableStablePoolV1ExitKind.BPT_IN_FOR_EXACT_TOKENS_OUT, amountsOut, MAX_UINT256] + ); + + const exitCalldata = library.interface.encodeFunctionData('exitPool', [ + poolId, + PoolKind.COMPOSABLE_STABLE, + owner.address, + owner.address, + { + assets: allTokens, + minAmountsOut: Array(tokens.length + 1).fill(0), + toInternalBalance: false, + userData, + }, + [], + ]); + + await relayer.connect(owner).multicall([exitCalldata]); + + const vaultDAIBalanceAfterExit = await dai.balanceOf(vault.address); + const ownerDAIBalanceAfterExit = await dai.balanceOf(owner.address); + + expect(vaultDAIBalanceAfterExit).to.lt(vaultDAIBalanceBeforeExit); + expect(ownerDAIBalanceAfterExit).to.gt(ownerDAIBalanceBeforeExit); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/composableStableV2.fork.ts b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/composableStableV2.fork.ts new file mode 100644 index 0000000..1d03900 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/composableStableV2.fork.ts @@ -0,0 +1,189 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { StablePoolEncoder } from '@helpers/models/pools/stable/encoder'; +import { fp } from '@helpers/numbers'; +import { MAX_UINT256 } from '@helpers/constants'; +import * as expectEvent from '@helpers/expectEvent'; +import { describeForkTest, getSigner, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; +import { + DAI, + USDC, + amplificationParameter, + cacheDurations, + exemptFlags, + rateProviders, + swapFeePercentage, + tokens, + initialBalances, + PoolKind, +} from './helpers/sharedStableParams'; + +describeForkTest('BatchRelayerLibrary - Composable Stable V2+', 'mainnet', 16789433, function () { + let task: Task; + + let relayer: Contract, library: Contract; + let vault: Contract, authorizer: Contract; + + before('run task', async () => { + task = new Task('20230314-batch-relayer-v5', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + + library = await task.deployedInstance('BatchRelayerLibrary'); + relayer = await task.instanceAt('BalancerRelayer', await library.getEntrypoint()); + }); + + before('load vault and authorizer', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + + vault = await vaultTask.deployedInstance('Vault'); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + }); + + const LARGE_TOKEN_HOLDER = '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503'; + + let owner: SignerWithAddress, whale: SignerWithAddress; + let pool: Contract, factory: Contract; + let usdc: Contract, dai: Contract; + let poolId: string; + let stableTask: Task; + let bptIndex: number; + + before('get signers', async () => { + owner = await getSigner(); + whale = await impersonate(LARGE_TOKEN_HOLDER); + }); + + before('approve relayer at the authorizer', async () => { + const relayerActionIds = await Promise.all( + ['swap', 'batchSwap', 'joinPool', 'exitPool', 'setRelayerApproval', 'manageUserBalance'].map((action) => + vault.getActionId(vault.interface.getSighash(action)) + ) + ); + + // We impersonate an account with the default admin role in order to be able to approve the relayer. This assumes + // such an account exists. + const admin = await impersonate(await authorizer.getRoleMember(await authorizer.DEFAULT_ADMIN_ROLE(), 0)); + + // Grant relayer permission to call all relayer functions + await authorizer.connect(admin).grantRoles(relayerActionIds, relayer.address); + }); + + before('approve relayer by the user', async () => { + await vault.connect(whale).setRelayerApproval(whale.address, relayer.address, true); + }); + + before('load tokens and approve', async () => { + dai = await task.instanceAt('IERC20', DAI); + usdc = await task.instanceAt('IERC20', USDC); + + await dai.connect(whale).approve(vault.address, MAX_UINT256); + await usdc.connect(whale).approve(vault.address, MAX_UINT256); + }); + + // Use V3 so that it's not disabled: same as V2 for joins/exits + before('run composable stable pool V2+ task', async () => { + stableTask = new Task('20230206-composable-stable-pool-v3', TaskMode.READ_ONLY, getForkedNetwork(hre)); + factory = await stableTask.deployedInstance('ComposableStablePoolFactory'); + }); + + async function createPool(): Promise { + const tx = await factory.create( + 'SP', + 'SPT', + tokens, + amplificationParameter, + rateProviders, + cacheDurations, + exemptFlags, + swapFeePercentage, + owner.address + ); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await stableTask.instanceAt('ComposableStablePool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + bptIndex = await pool.getBptIndex(); + + const composableInitialBalances = Array.from({ length: tokens.length + 1 }).map((_, i) => + i == bptIndex ? 0 : i < bptIndex ? initialBalances[i] : initialBalances[i - 1] + ); + const { tokens: allTokens } = await vault.getPoolTokens(poolId); + + const userData = StablePoolEncoder.joinInit(composableInitialBalances); + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: allTokens, + maxAmountsIn: Array(tokens.length + 1).fill(MAX_UINT256), + fromInternalBalance: false, + userData, + }); + + return pool; + } + + describe('proportional join/exit through relayer', () => { + before('deploy pool', async () => { + pool = await createPool(); + + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + }); + + it('can join and exit', async () => { + const bptAmount = fp(1000); + + const whaleDAIBalanceBeforeJoinExit = await dai.balanceOf(whale.address); + const ownerDAIBalanceBeforeJoinExit = await dai.balanceOf(owner.address); + + const { tokens: allTokens } = await vault.getPoolTokens(poolId); + + const joinUserData = StablePoolEncoder.joinAllTokensInForExactBptOut(bptAmount); + + const joinCalldata = library.interface.encodeFunctionData('joinPool', [ + poolId, + PoolKind.COMPOSABLE_STABLE_V2, + whale.address, + whale.address, + { + assets: allTokens, + maxAmountsIn: Array(tokens.length + 1).fill(MAX_UINT256), + userData: joinUserData, + fromInternalBalance: false, + }, + 0, + 0, + ]); + + const exitUserData = StablePoolEncoder.exitExactBptInForTokensOut(bptAmount); + + const exitCalldata = library.interface.encodeFunctionData('exitPool', [ + poolId, + PoolKind.COMPOSABLE_STABLE_V2, + whale.address, + owner.address, + { + assets: allTokens, + minAmountsOut: Array(tokens.length + 1).fill(0), + userData: exitUserData, + toInternalBalance: false, + }, + [], + ]); + + await relayer.connect(whale).multicall([joinCalldata, exitCalldata]); + + const whaleDAIBalanceAfterJoinExit = await dai.balanceOf(whale.address); + const ownerDAIBalanceAfterJoinExit = await dai.balanceOf(owner.address); + + expect(whaleDAIBalanceAfterJoinExit).to.lt(whaleDAIBalanceBeforeJoinExit); + expect(ownerDAIBalanceAfterJoinExit).to.gt(ownerDAIBalanceBeforeJoinExit); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/compoundV2Wrapping.fork.ts b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/compoundV2Wrapping.fork.ts new file mode 100644 index 0000000..febc9b0 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/compoundV2Wrapping.fork.ts @@ -0,0 +1,124 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; +import { BigNumberish, bn } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { MAX_UINT256 } from '@helpers/constants'; +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode, getSigner } from '@src'; + +describeForkTest('CompoundV2Wrapping', 'polygon', 40305420, function () { + let task: Task; + let relayer: Contract, library: Contract; + let vault: Contract, authorizer: Contract; + + const BRZ = '0x491a4eB4f1FC3BfF8E1d2FC856a6A46663aD556f'; + const BRZ_HOLDER = '0xB90B2050C955cd899b9BC8B5C743c25770EBc8AA'; + const cBRZ = '0x2e4659b451C3ba2E72D79aAf267cFc09BCCc9d7c'; + + let brzToken: Contract, cToken: Contract; + let sender: SignerWithAddress, recipient: SignerWithAddress; + let chainedReference: BigNumber; + const amountToWrap = bn(1000e4); // BRZ is 4 decimals + + before('run task', async () => { + task = new Task('20230314-batch-relayer-v5', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + library = await task.deployedInstance('BatchRelayerLibrary'); + relayer = await task.instanceAt('BalancerRelayer', await library.getEntrypoint()); + }); + + before('load vault and tokens', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + + vault = await vaultTask.instanceAt('Vault', await library.getVault()); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + }); + + before('approve relayer at the authorizer', async () => { + const relayerActionIds = await Promise.all( + ['swap', 'batchSwap', 'joinPool', 'exitPool', 'setRelayerApproval', 'manageUserBalance'].map((action) => + vault.getActionId(vault.interface.getSighash(action)) + ) + ); + + // We impersonate an account with the default admin role in order to be able to approve the relayer. This assumes + // such an account exists. + const admin = await impersonate(await authorizer.getRoleMember(await authorizer.DEFAULT_ADMIN_ROLE(), 0)); + + // Grant relayer permission to call all relayer functions + await authorizer.connect(admin).grantRoles(relayerActionIds, relayer.address); + }); + + before(async () => { + brzToken = await task.instanceAt('IERC20', BRZ); + cToken = await task.instanceAt('IERC20', cBRZ); + sender = await impersonate(BRZ_HOLDER); + recipient = await getSigner(); + + await vault.connect(sender).setRelayerApproval(sender.address, relayer.address, true); + await vault.connect(recipient).setRelayerApproval(recipient.address, relayer.address, true); + }); + + it('should wrap successfully', async () => { + const balanceOfbrzBefore = await brzToken.balanceOf(sender.address); + + const balanceOfcbrzBefore = await cToken.balanceOf(sender.address); + expect(balanceOfcbrzBefore).to.be.equal(0); + + // Approving vault to pull tokens from user. + await brzToken.connect(sender).approve(vault.address, amountToWrap); + + // Wrap `amountToWrap` BRZ tokens: pull from `sender`, deposit, mint cTokens and transfer to `recipient`. + // Store the amount in an output reference. + chainedReference = toChainedReference(80); + const depositIntoMidas = library.interface.encodeFunctionData('wrapCompoundV2', [ + cBRZ, + sender.address, + recipient.address, + amountToWrap, + chainedReference, + ]); + + await relayer.connect(sender).multicall([depositIntoMidas]); + + const balanceOfbrzAfter = await brzToken.balanceOf(sender.address); + expect(balanceOfbrzBefore.sub(balanceOfbrzAfter)).to.be.equal(amountToWrap); + + const balanceOfcbrzAfter = await cToken.balanceOf(recipient.address); + expect(balanceOfcbrzAfter).to.be.gt(0); + }); + + it('should unwrap successfully', async () => { + const balanceOfbrzBefore = await brzToken.balanceOf(recipient.address); + expect(balanceOfbrzBefore).to.be.equal(0); + + // Recipient has cTokens. Unwrap by reading amount from the chained reference, + // Pull the cTokens from recipient (sender), burn them, withdraw underlying tokens, + // and transfer to recipient. + const withdrawFromMidas = library.interface.encodeFunctionData('unwrapCompoundV2', [ + cBRZ, + recipient.address, + recipient.address, + chainedReference, + 0, + ]); + + await cToken.connect(recipient).approve(vault.address, MAX_UINT256); + + await relayer.connect(recipient).multicall([withdrawFromMidas]); + + const balanceOfbrzAfter = await brzToken.balanceOf(recipient.address); + const balanceOfcbrzbAfter = await cToken.balanceOf(recipient.address); + + expect(balanceOfcbrzbAfter).to.be.equal(0); + expect(balanceOfbrzAfter).to.be.almostEqual(amountToWrap, 0.01); + }); +}); + +function toChainedReference(key: BigNumberish): BigNumber { + const CHAINED_REFERENCE_PREFIX = 'ba10'; + // The full padded prefix is 66 characters long, with 64 hex characters and the 0x prefix. + const paddedPrefix = `0x${CHAINED_REFERENCE_PREFIX}${'0'.repeat(64 - CHAINED_REFERENCE_PREFIX.length)}`; + + return BigNumber.from(paddedPrefix).add(key); +} diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/eulerWrapping.fork.ts b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/eulerWrapping.fork.ts new file mode 100644 index 0000000..a72464d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/eulerWrapping.fork.ts @@ -0,0 +1,166 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; +import { BigNumberish } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode, getSigner } from '@src'; +import { MAX_UINT256 } from '@helpers/constants'; + +describeForkTest('EulerWrapping', 'mainnet', 16636628, function () { + let task: Task; + let relayer: Contract, library: Contract; + let vault: Contract, authorizer: Contract; + + const USDC = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'; + const USDC_HOLDER = '0x0a59649758aa4d66e25f08dd01271e891fe52199'; + const eUSDC = '0xEb91861f8A4e1C12333F42DCE8fB0Ecdc28dA716'; //proxy + const EULER_PROTOCOL = '0x27182842E098f60e3D576794A5bFFb0777E025d3'; + + let usdcToken: Contract, eToken: Contract; + let sender: SignerWithAddress, recipient: SignerWithAddress; + let chainedReference: BigNumber; + let chainedReferenceOut: BigNumber; + + const amountToWrap = 50000e6; //50k USDC + + before('run task', async () => { + task = new Task('20230314-batch-relayer-v5', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + library = await task.deployedInstance('BatchRelayerLibrary'); + relayer = await task.instanceAt('BalancerRelayer', await library.getEntrypoint()); + }); + + before('load vault and tokens', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + + vault = await vaultTask.instanceAt('Vault', await library.getVault()); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + }); + + before('approve relayer at the authorizer', async () => { + const relayerActionIds = await Promise.all( + ['swap', 'batchSwap', 'joinPool', 'exitPool', 'setRelayerApproval', 'manageUserBalance'].map((action) => + vault.getActionId(vault.interface.getSighash(action)) + ) + ); + + // We impersonate an account with the default admin role in order to be able to approve the relayer. This assumes + // such an account exists. + const admin = await impersonate(await authorizer.getRoleMember(await authorizer.DEFAULT_ADMIN_ROLE(), 0)); + + // Grant relayer permission to call all relayer functions + await authorizer.connect(admin).grantRoles(relayerActionIds, relayer.address); + }); + + before(async () => { + usdcToken = await task.instanceAt('IERC20', USDC); + eToken = await task.instanceAt('IEulerToken', eUSDC); + sender = await impersonate(USDC_HOLDER); + recipient = await getSigner(); + + await vault.connect(sender).setRelayerApproval(sender.address, relayer.address, true); + await vault.connect(recipient).setRelayerApproval(recipient.address, relayer.address, true); + }); + + it('should wrap successfully', async () => { + const balanceOfUSDCBefore = await usdcToken.balanceOf(sender.address); + const balanceOfeUSDClBefore = await eToken.balanceOf(recipient.address); + + expect(balanceOfeUSDClBefore).to.be.equal(0); + + // Approving vault to pull tokens from user. + await usdcToken.connect(sender).approve(vault.address, amountToWrap); + + chainedReference = toChainedReference(30); + const depositIntoEuler = library.interface.encodeFunctionData('wrapEuler', [ + eUSDC, + EULER_PROTOCOL, + sender.address, + recipient.address, + amountToWrap, + chainedReference, + ]); + + await relayer.connect(sender).multicall([depositIntoEuler]); + + const balanceOfUSDCAfter = await usdcToken.balanceOf(sender.address); + const balanceOfeUSDCAfter = await eToken.balanceOf(recipient.address); + + // @param underlyingAmount Amount in underlying units (same decimals as underlying token) + // @return eToken balance, in internal book-keeping units (18 decimals) + const expectedbalanceOfeUSDCAfter = await eToken.convertUnderlyingToBalance(amountToWrap); + + expect(balanceOfUSDCBefore.sub(balanceOfUSDCAfter)).to.be.equal(amountToWrap); + expect(balanceOfeUSDCAfter).to.be.equal(expectedbalanceOfeUSDCAfter); + }); + + it('should unwrap successfully', async () => { + // in underlying decimals + const eAmountToWithdraw = await eToken.convertUnderlyingToBalance(amountToWrap); + const balanceOfUSDCBefore = await usdcToken.balanceOf(sender.address); + const balanceOfeUSDCBefore = await eToken.balanceOf(recipient.address); + + expect(balanceOfeUSDCBefore).to.be.equal(eAmountToWithdraw); + + const withdrawFromEuler = library.interface.encodeFunctionData('unwrapEuler', [ + eUSDC, + recipient.address, + sender.address, + chainedReference, + 0, + ]); + + await eToken.connect(recipient).approve(vault.address, MAX_UINT256); + + await relayer.connect(recipient).multicall([withdrawFromEuler]); + + const balanceOfUSDCAfter = await usdcToken.balanceOf(sender.address); + const balanceOfeUSDCAfter = await eToken.balanceOf(recipient.address); + + expect(balanceOfeUSDCAfter).to.be.equal(0); + expect(balanceOfUSDCAfter.sub(balanceOfUSDCBefore)).to.be.almostEqual(amountToWrap, 0.01); + }); + + it('should wrap and unwrap successfully', async () => { + chainedReference = toChainedReference(30); + chainedReferenceOut = toChainedReference(80); + await usdcToken.connect(sender).approve(vault.address, amountToWrap * 2); + await eToken.connect(sender).approve(vault.address, MAX_UINT256); + + const depositIntoEuler_1 = library.interface.encodeFunctionData('wrapEuler', [ + eUSDC, + EULER_PROTOCOL, + sender.address, + sender.address, + amountToWrap, + chainedReference, + ]); + + const withdrawFromEuler = library.interface.encodeFunctionData('unwrapEuler', [ + eUSDC, + sender.address, + sender.address, + chainedReference, + chainedReferenceOut, + ]); + + const depositIntoEuler_2 = library.interface.encodeFunctionData('wrapEuler', [ + eUSDC, + EULER_PROTOCOL, + sender.address, + recipient.address, + chainedReferenceOut, + 0, + ]); + + await relayer.connect(sender).multicall([depositIntoEuler_1, withdrawFromEuler, depositIntoEuler_2]); + }); +}); + +function toChainedReference(key: BigNumberish): BigNumber { + const CHAINED_REFERENCE_PREFIX = 'ba10'; + // The full padded prefix is 66 characters long, with 64 hex characters and the 0x prefix. + const paddedPrefix = `0x${CHAINED_REFERENCE_PREFIX}${'0'.repeat(64 - CHAINED_REFERENCE_PREFIX.length)}`; + + return BigNumber.from(paddedPrefix).add(key); +} diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/gearboxWrapping.fork.ts b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/gearboxWrapping.fork.ts new file mode 100644 index 0000000..2985946 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/gearboxWrapping.fork.ts @@ -0,0 +1,125 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; +import { BigNumberish } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode, getSigner } from '@src'; +import { MAX_UINT256 } from '@helpers/constants'; + +describeForkTest('GearboxWrapping', 'mainnet', 16622559, function () { + let task: Task; + let relayer: Contract, library: Contract; + let vault: Contract, authorizer: Contract; + + const USDC = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'; + const USDC_HOLDER = '0x0a59649758aa4d66e25f08dd01271e891fe52199'; + const dUSDC = '0xc411db5f5eb3f7d552f9b8454b2d74097ccde6e3'; + + let usdcToken: Contract, dieselToken: Contract, gearboxVault: Contract; + let sender: SignerWithAddress, recipient: SignerWithAddress; + let chainedReference: BigNumber; + const amountToWrap = 100e6; + + before('run task', async () => { + task = new Task('20230314-batch-relayer-v5', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + library = await task.deployedInstance('BatchRelayerLibrary'); + relayer = await task.instanceAt('BalancerRelayer', await library.getEntrypoint()); + }); + + before('load vault and tokens', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + + vault = await vaultTask.instanceAt('Vault', await library.getVault()); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + }); + + before('approve relayer at the authorizer', async () => { + const relayerActionIds = await Promise.all( + ['swap', 'batchSwap', 'joinPool', 'exitPool', 'setRelayerApproval', 'manageUserBalance'].map((action) => + vault.getActionId(vault.interface.getSighash(action)) + ) + ); + + // We impersonate an account with the default admin role in order to be able to approve the relayer. This assumes + // such an account exists. + const admin = await impersonate(await authorizer.getRoleMember(await authorizer.DEFAULT_ADMIN_ROLE(), 0)); + + // Grant relayer permission to call all relayer functions + await authorizer.connect(admin).grantRoles(relayerActionIds, relayer.address); + }); + + before(async () => { + usdcToken = await task.instanceAt('IERC20', USDC); + dieselToken = await task.instanceAt('IGearboxDieselToken', dUSDC); + gearboxVault = await task.instanceAt('IGearboxVault', await dieselToken.owner()); + sender = await impersonate(USDC_HOLDER); + recipient = await getSigner(); + + await vault.connect(sender).setRelayerApproval(sender.address, relayer.address, true); + await vault.connect(recipient).setRelayerApproval(recipient.address, relayer.address, true); + }); + + it('should wrap successfully', async () => { + const balanceOfUSDCBefore = await usdcToken.balanceOf(sender.address); + const balanceOfDieselBefore = await dieselToken.balanceOf(recipient.address); + + expect(balanceOfDieselBefore).to.be.equal(0); + + // Approving vault to pull tokens from user. + await usdcToken.connect(sender).approve(vault.address, amountToWrap); + + chainedReference = toChainedReference(30); + const depositIntoGearbox = library.interface.encodeFunctionData('wrapGearbox', [ + dUSDC, + sender.address, + recipient.address, + amountToWrap, + chainedReference, + ]); + + await relayer.connect(sender).multicall([depositIntoGearbox]); + + const balanceOfUSDCAfter = await usdcToken.balanceOf(sender.address); + const balanceOfDieselAfter = await dieselToken.balanceOf(recipient.address); + const expectedBalanceOfDieselAfter = await gearboxVault.toDiesel(amountToWrap); + + expect(balanceOfUSDCBefore.sub(balanceOfUSDCAfter)).to.be.equal(amountToWrap); + expect(balanceOfDieselAfter).to.be.equal(expectedBalanceOfDieselAfter); + }); + + it('should unwrap successfully', async () => { + const dieselAmountToWithdraw = await gearboxVault.toDiesel(amountToWrap); + + const balanceOfUSDCBefore = await usdcToken.balanceOf(sender.address); + const balanceOfDieselBefore = await dieselToken.balanceOf(recipient.address); + + expect(balanceOfDieselBefore).to.be.equal(dieselAmountToWithdraw); + + const withdrawFromGearbox = library.interface.encodeFunctionData('unwrapGearbox', [ + dUSDC, + recipient.address, + sender.address, + chainedReference, + 0, + ]); + + await dieselToken.connect(recipient).approve(vault.address, MAX_UINT256); + + await relayer.connect(recipient).multicall([withdrawFromGearbox]); + + const balanceOfUSDCAfter = await usdcToken.balanceOf(sender.address); + const balanceOfDieselAfter = await dieselToken.balanceOf(recipient.address); + + expect(balanceOfDieselAfter).to.be.equal(0); + expect(balanceOfUSDCAfter.sub(balanceOfUSDCBefore)).to.be.almostEqual(amountToWrap, 0.01); + }); +}); + +function toChainedReference(key: BigNumberish): BigNumber { + const CHAINED_REFERENCE_PREFIX = 'ba10'; + // The full padded prefix is 66 characters long, with 64 hex characters and the 0x prefix. + const paddedPrefix = `0x${CHAINED_REFERENCE_PREFIX}${'0'.repeat(64 - CHAINED_REFERENCE_PREFIX.length)}`; + + return BigNumber.from(paddedPrefix).add(key); +} diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/helpers/sharedStableParams.ts b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/helpers/sharedStableParams.ts new file mode 100644 index 0000000..fbd6591 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/helpers/sharedStableParams.ts @@ -0,0 +1,22 @@ +import { ZERO_ADDRESS } from '@helpers/constants'; +import { bn, fp, FP_ZERO } from '@helpers/numbers'; + +export const DAI = '0x6b175474e89094c44da98b954eedeac495271d0f'; +export const USDC = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'; + +export const tokens = [DAI, USDC]; +export const amplificationParameter = bn(100); +export const swapFeePercentage = fp(0.01); +export const initialBalanceDAI = fp(1e6); +export const initialBalanceUSDC = fp(1e6).div(1e12); // 6 digits +export const initialBalances = [initialBalanceDAI, initialBalanceUSDC]; +export const rateProviders = [ZERO_ADDRESS, ZERO_ADDRESS]; +export const cacheDurations = [FP_ZERO, FP_ZERO]; +export const exemptFlags = [false, false]; + +export enum PoolKind { + WEIGHTED = 0, + LEGACY_STABLE, + COMPOSABLE_STABLE, + COMPOSABLE_STABLE_V2, +} diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/legacyStable.fork.ts b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/legacyStable.fork.ts new file mode 100644 index 0000000..917b346 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/legacyStable.fork.ts @@ -0,0 +1,242 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { StablePoolEncoder } from '@helpers/models/pools/stable/encoder'; +import { MAX_UINT256 } from '@helpers/constants'; +import { defaultAbiCoder } from '@ethersproject/abi/lib/abi-coder'; +import * as expectEvent from '@helpers/expectEvent'; +import { describeForkTest, getSigner, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; +import { + DAI, + USDC, + amplificationParameter, + cacheDurations, + rateProviders, + swapFeePercentage, + tokens, + initialBalances, + PoolKind, +} from './helpers/sharedStableParams'; + +describeForkTest('BatchRelayerLibrary - Legacy Stable', 'mainnet', 14860000, function () { + let task: Task; + + let relayer: Contract, library: Contract; + let vault: Contract, authorizer: Contract; + + before('run task', async () => { + task = new Task('20230314-batch-relayer-v5', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + + library = await task.deployedInstance('BatchRelayerLibrary'); + relayer = await task.instanceAt('BalancerRelayer', await library.getEntrypoint()); + }); + + before('load vault and authorizer', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + + vault = await vaultTask.deployedInstance('Vault'); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + }); + + describe('original stable pools', () => { + const LARGE_TOKEN_HOLDER = '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503'; + + enum LegacyStablePoolExitKind { + EXACT_BPT_IN_FOR_ONE_TOKEN_OUT = 0, + EXACT_BPT_IN_FOR_TOKENS_OUT, + BPT_IN_FOR_EXACT_TOKENS_OUT, + } + + let owner: SignerWithAddress, whale: SignerWithAddress; + let pool: Contract, factory: Contract; + let usdc: Contract, dai: Contract; + let poolId: string; + let stableTask: Task; + + before('get signers', async () => { + owner = await getSigner(); + whale = await impersonate(LARGE_TOKEN_HOLDER); + }); + + before('approve relayer at the authorizer', async () => { + const relayerActionIds = await Promise.all( + ['swap', 'batchSwap', 'joinPool', 'exitPool', 'setRelayerApproval', 'manageUserBalance'].map((action) => + vault.getActionId(vault.interface.getSighash(action)) + ) + ); + + // We impersonate an account with the default admin role in order to be able to approve the relayer. This assumes + // such an account exists. + const admin = await impersonate(await authorizer.getRoleMember(await authorizer.DEFAULT_ADMIN_ROLE(), 0)); + + // Grant relayer permission to call all relayer functions + await authorizer.connect(admin).grantRoles(relayerActionIds, relayer.address); + }); + + before('approve relayer by the user', async () => { + await vault.connect(owner).setRelayerApproval(owner.address, relayer.address, true); + }); + + before('load tokens and approve', async () => { + dai = await task.instanceAt('IERC20', DAI); + usdc = await task.instanceAt('IERC20', USDC); + + await dai.connect(whale).approve(vault.address, MAX_UINT256); + await usdc.connect(whale).approve(vault.address, MAX_UINT256); + }); + + context('stable pool', () => { + before('run original stable task', async () => { + stableTask = new Task('20210624-stable-pool', TaskMode.READ_ONLY, getForkedNetwork(hre)); + factory = await stableTask.deployedInstance('StablePoolFactory'); + }); + + before('deploy stable pool', async () => { + const tx = await factory.create('SP', 'SPT', tokens, amplificationParameter, swapFeePercentage, owner.address); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await stableTask.instanceAt('StablePool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + }); + + before('initialize stable pool', async () => { + const userData = StablePoolEncoder.joinInit(initialBalances); + + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: tokens, + maxAmountsIn: initialBalances, + fromInternalBalance: false, + userData, + }); + }); + + it('can exit proportionally through the relayer', async () => { + const bptBalance = await pool.balanceOf(owner.address); + expect(bptBalance).to.gt(0); + + const vaultDAIBalanceBeforeExit = await dai.balanceOf(vault.address); + const ownerDAIBalanceBeforeExit = await dai.balanceOf(owner.address); + + const userData = defaultAbiCoder.encode( + ['uint256', 'uint256'], + [LegacyStablePoolExitKind.EXACT_BPT_IN_FOR_TOKENS_OUT, bptBalance] + ); + + // Send BPT to the relayer so it can exit. + await pool.connect(owner).transfer(relayer.address, bptBalance); + + const exitCalldata = library.interface.encodeFunctionData('exitPool', [ + poolId, + PoolKind.LEGACY_STABLE, + relayer.address, + owner.address, + { + assets: tokens, + minAmountsOut: tokens.map(() => 0), + toInternalBalance: false, + userData, + }, + [], + ]); + + await relayer.connect(owner).multicall([exitCalldata]); + + const remainingBalance = await pool.balanceOf(owner.address); + expect(remainingBalance).to.equal(0); + + const vaultDAIBalanceAfterExit = await dai.balanceOf(vault.address); + const ownerDAIBalanceAfterExit = await dai.balanceOf(owner.address); + + expect(vaultDAIBalanceAfterExit).to.lt(vaultDAIBalanceBeforeExit); + expect(ownerDAIBalanceAfterExit).to.gt(ownerDAIBalanceBeforeExit); + }); + }); + + context('metastable pool', () => { + before('run stable pool task', async () => { + stableTask = new Task('20210727-meta-stable-pool', TaskMode.READ_ONLY, getForkedNetwork(hre)); + factory = await stableTask.deployedInstance('MetaStablePoolFactory'); + }); + + before('deploy meta stable pool', async () => { + const tx = await factory.create( + 'MSP', + 'MSPT', + tokens, + amplificationParameter, + rateProviders, + cacheDurations, + swapFeePercentage, + false, // oracle enabled + owner.address + ); + + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await stableTask.instanceAt('MetaStablePool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + }); + + before('initialize meta stable pool', async () => { + const userData = StablePoolEncoder.joinInit(initialBalances); + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: tokens, + maxAmountsIn: initialBalances, + fromInternalBalance: false, + userData, + }); + }); + + it('can exit proportionally through the relayer', async () => { + const bptBalance = await pool.balanceOf(owner.address); + expect(bptBalance).to.gt(0); + + const vaultDAIBalanceBeforeExit = await dai.balanceOf(vault.address); + const ownerDAIBalanceBeforeExit = await dai.balanceOf(owner.address); + + const userData = defaultAbiCoder.encode( + ['uint256', 'uint256'], + [LegacyStablePoolExitKind.EXACT_BPT_IN_FOR_TOKENS_OUT, bptBalance] + ); + + // Send BPT to the relayer so it can exit. + await pool.connect(owner).transfer(relayer.address, bptBalance); + + const exitCalldata = library.interface.encodeFunctionData('exitPool', [ + poolId, + PoolKind.LEGACY_STABLE, + relayer.address, + owner.address, + { + assets: tokens, + minAmountsOut: tokens.map(() => 0), + toInternalBalance: false, + userData, + }, + [], + ]); + + await relayer.connect(owner).multicall([exitCalldata]); + + const remainingBalance = await pool.balanceOf(owner.address); + expect(remainingBalance).to.equal(0); + + const vaultDAIBalanceAfterExit = await dai.balanceOf(vault.address); + const ownerDAIBalanceAfterExit = await dai.balanceOf(owner.address); + + expect(vaultDAIBalanceAfterExit).to.lt(vaultDAIBalanceBeforeExit); + expect(ownerDAIBalanceAfterExit).to.gt(ownerDAIBalanceBeforeExit); + }); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/siloWrapping.fork.ts b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/siloWrapping.fork.ts new file mode 100644 index 0000000..d28b619 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/siloWrapping.fork.ts @@ -0,0 +1,137 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; +import { BigNumberish, bn } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode, getSigner } from '@src'; + +describeForkTest('SiloWrapping', 'mainnet', 16622559, function () { + let task: Task; + let relayer: Contract, library: Contract; + let vault: Contract, authorizer: Contract; + + const USDC = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'; + const USDC_HOLDER = '0xda9ce944a37d218c3302f6b82a094844c6eceb17'; + const sUSDC = '0x416DE9AD46C53AAAb2352F91120952393946d2ac'; + const USDC_SILO = '0xfccc27aabd0ab7a0b2ad2b7760037b1eab61616b'; + + let usdcToken: Contract, shareToken: Contract, silo: Contract; + let sender: SignerWithAddress, recipient: SignerWithAddress; + let chainedReference: BigNumber; + const amountToWrap = 100e6; + + before('run task', async () => { + task = new Task('20230314-batch-relayer-v5', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + library = await task.deployedInstance('BatchRelayerLibrary'); + relayer = await task.instanceAt('BalancerRelayer', await library.getEntrypoint()); + }); + + before('load vault and tokens', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + + vault = await vaultTask.instanceAt('Vault', await library.getVault()); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + }); + + before('approve relayer at the authorizer', async () => { + const relayerActionIds = await Promise.all( + ['swap', 'batchSwap', 'joinPool', 'exitPool', 'setRelayerApproval', 'manageUserBalance'].map((action) => + vault.getActionId(vault.interface.getSighash(action)) + ) + ); + + // We impersonate an account with the default admin role in order to be able to approve the relayer. This assumes + // such an account exists. + const admin = await impersonate(await authorizer.getRoleMember(await authorizer.DEFAULT_ADMIN_ROLE(), 0)); + + // Grant relayer permission to call all relayer functions + await authorizer.connect(admin).grantRoles(relayerActionIds, relayer.address); + }); + + before(async () => { + usdcToken = await task.instanceAt('IERC20', USDC); + shareToken = await task.instanceAt('IShareToken', sUSDC); + silo = await task.instanceAt('ISilo', USDC_SILO); + sender = await impersonate(USDC_HOLDER); + recipient = await getSigner(); + + await vault.connect(sender).setRelayerApproval(sender.address, relayer.address, true); + await vault.connect(recipient).setRelayerApproval(recipient.address, relayer.address, true); + }); + + it('should wrap successfully', async () => { + const balanceOfUSDCBefore = await usdcToken.balanceOf(sender.address); + const balanceOfWrappedBefore = await shareToken.balanceOf(recipient.address); + + expect(balanceOfWrappedBefore).to.be.equal(0); + + // Approving vault to pull tokens from user. + await usdcToken.connect(sender).approve(vault.address, amountToWrap); + + chainedReference = toChainedReference(30); + const depositIntoSilo = library.interface.encodeFunctionData('wrapShareToken', [ + sUSDC, + sender.address, + recipient.address, + amountToWrap, + chainedReference, + ]); + + await relayer.connect(sender).multicall([depositIntoSilo]); + + const balanceOfUSDCAfter = await usdcToken.balanceOf(sender.address); + const balanceOfWrappedAfter = await shareToken.balanceOf(recipient.address); + + const estimatedRate = await siloExchangeRate(silo, USDC, shareToken); + + const expectedBalanceOfWrappedAfter = bn(estimatedRate).mul(amountToWrap); + + expect(balanceOfUSDCBefore.sub(balanceOfUSDCAfter)).to.be.equal(amountToWrap); + expect(balanceOfWrappedAfter).to.be.almostEqual(expectedBalanceOfWrappedAfter, 0.01); + }); + + it('should unwrap successfully', async () => { + const estimatedRate = await siloExchangeRate(silo, USDC, shareToken); + const wrappedRate = Math.floor(1e6 / estimatedRate); + const balanceOfWrappedBefore = await shareToken.balanceOf(recipient.address); + + const amountToWithdraw = Math.floor((wrappedRate * balanceOfWrappedBefore) / 1e6); + + const balanceOfUSDCBefore = await usdcToken.balanceOf(sender.address); + + const withdrawFromSilo = library.interface.encodeFunctionData('unwrapShareToken', [ + sUSDC, + recipient.address, + sender.address, + amountToWithdraw, + chainedReference, + ]); + + await shareToken.connect(recipient).approve(vault.address, amountToWithdraw); + + await relayer.connect(recipient).multicall([withdrawFromSilo]); + + const balanceOfUSDCAfter = await usdcToken.balanceOf(sender.address); + const balanceOfWrappedAfter = await shareToken.balanceOf(recipient.address); + + expect(balanceOfWrappedBefore.sub(balanceOfWrappedAfter)).to.be.equal(amountToWithdraw); + // Because rate is very close to 1 + expect(balanceOfUSDCAfter.sub(balanceOfUSDCBefore)).to.be.almostEqual(amountToWithdraw); + }); +}); + +function toChainedReference(key: BigNumberish): BigNumber { + const CHAINED_REFERENCE_PREFIX = 'ba10'; + // The full padded prefix is 66 characters long, with 64 hex characters and the 0x prefix. + const paddedPrefix = `0x${CHAINED_REFERENCE_PREFIX}${'0'.repeat(64 - CHAINED_REFERENCE_PREFIX.length)}`; + + return BigNumber.from(paddedPrefix).add(key); +} + +async function siloExchangeRate(silo: Contract, mainTokenAddress: string, wrappedTokenContract: Contract) { + const assetSotrage = await silo.assetStorage(mainTokenAddress); + const totalAmount = assetSotrage[3]; + const totalShares = await wrappedTokenContract.totalSupply(); + return totalAmount / totalShares; +} diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/stablePhantom.fork.ts b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/stablePhantom.fork.ts new file mode 100644 index 0000000..8aeed75 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/stablePhantom.fork.ts @@ -0,0 +1,136 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { StablePoolEncoder } from '@helpers/models/pools/stable/encoder'; +import { bn } from '@helpers/numbers'; +import { MAX_UINT256 } from '@helpers/constants'; +import { defaultAbiCoder } from '@ethersproject/abi/lib/abi-coder'; +import { actionId } from '@helpers/models/misc/actions'; +import * as expectEvent from '@helpers/expectEvent'; +import { describeForkTest, getSigner, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; +import { + DAI, + USDC, + amplificationParameter, + cacheDurations, + rateProviders, + swapFeePercentage, + tokens, + initialBalances, +} from './helpers/sharedStableParams'; + +describeForkTest('Stable Phantom Exit', 'mainnet', 13776527, function () { + let vault: Contract, authorizer: Contract; + + before('load vault and tokens', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + + vault = await vaultTask.deployedInstance('Vault'); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + }); + + const LARGE_TOKEN_HOLDER = '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503'; + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + + enum ExitKindPhantom { + EXACT_BPT_IN_FOR_TOKENS_OUT = 0, + } + + let owner: SignerWithAddress, whale: SignerWithAddress, govMultisig: SignerWithAddress; + let pool: Contract, factory: Contract; + let usdc: Contract, dai: Contract; + let poolId: string; + let stableTask: Task; + let bptIndex: number; + + before('get signers', async () => { + owner = await getSigner(); + whale = await impersonate(LARGE_TOKEN_HOLDER); + govMultisig = await impersonate(GOV_MULTISIG); + }); + + before('run stable phantom pool task', async () => { + stableTask = new Task('20211208-stable-phantom-pool', TaskMode.READ_ONLY, getForkedNetwork(hre)); + factory = await stableTask.deployedInstance('StablePhantomPoolFactory'); + }); + + before('load tokens and approve', async () => { + dai = await stableTask.instanceAt('IERC20', DAI); + usdc = await stableTask.instanceAt('IERC20', USDC); + + await dai.connect(whale).approve(vault.address, MAX_UINT256); + await usdc.connect(whale).approve(vault.address, MAX_UINT256); + }); + + before('create pool', async () => { + const tx = await factory.create( + 'SP', + 'SPT', + tokens, + amplificationParameter, + rateProviders, + cacheDurations, + swapFeePercentage, + owner.address + ); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await stableTask.instanceAt('StablePhantomPool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + bptIndex = await pool.getBptIndex(); + + const composableInitialBalances = Array.from({ length: tokens.length + 1 }).map((_, i) => + i == bptIndex ? 0 : i < bptIndex ? initialBalances[i] : initialBalances[i - 1] + ); + const { tokens: allTokens } = await vault.getPoolTokens(poolId); + + const userData = StablePoolEncoder.joinInit(composableInitialBalances); + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: allTokens, + maxAmountsIn: Array(tokens.length + 1).fill(MAX_UINT256), + fromInternalBalance: false, + userData, + }); + }); + + before('pause pool', async () => { + await authorizer.connect(govMultisig).grantRole(await actionId(pool, 'setPaused'), govMultisig.address); + await pool.connect(govMultisig).setPaused(true); + const { paused } = await pool.getPausedState(); + + expect(paused).to.be.true; + }); + + it('exits proportionally when paused', async () => { + const previousBptBalance = await pool.balanceOf(owner.address); + const bptIn = previousBptBalance.div(4); + + const { tokens: registeredTokens, balances: registeredBalances } = await vault.getPoolTokens(poolId); + + const tx = await vault.connect(owner).exitPool(poolId, owner.address, owner.address, { + assets: registeredTokens, + minAmountsOut: Array(registeredTokens.length).fill(0), + fromInternalBalance: false, + userData: defaultAbiCoder.encode(['uint256', 'uint256'], [ExitKindPhantom.EXACT_BPT_IN_FOR_TOKENS_OUT, bptIn]), + }); + const receipt = await (await tx).wait(); + const { deltas } = expectEvent.inReceipt(receipt, 'PoolBalanceChanged').args; + const amountsOut = deltas.map((x: BigNumber) => x.mul(-1)); + + const expectedAmountsOut = (registeredBalances as BigNumber[]).map((b) => b.div(4)); + expectedAmountsOut[bptIndex] = bn(0); + + // Amounts out should be 1/4 the initial balances + expect(amountsOut).to.equalWithError(expectedAmountsOut, 0.00001); + + // Make sure sent BPT is close to what we expect + const currentBptBalance = await pool.balanceOf(owner.address); + expect(currentBptBalance).to.be.equalWithError(bn(previousBptBalance).sub(bptIn), 0.001); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/test.fork.ts b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/test.fork.ts new file mode 100644 index 0000000..0d3c50b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/test.fork.ts @@ -0,0 +1,190 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; +import { BigNumberish } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { WeightedPoolEncoder } from '@helpers/models/pools/weighted/encoder'; +import { MAX_UINT256 } from '@helpers/constants'; +import { defaultAbiCoder } from '@ethersproject/abi/lib/abi-coder'; +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; +import * as expectEvent from '@helpers/expectEvent'; +import { sharedBeforeEach } from '@helpers/sharedBeforeEach'; + +describeForkTest('BatchRelayerLibrary', 'mainnet', 15485000, function () { + let task: Task; + + let relayer: Contract, library: Contract; + let sender: SignerWithAddress; + let vault: Contract, authorizer: Contract; + + const WETH = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'; + + const ETH_STETH_POOL = '0x32296969ef14eb0c6d29669c550d4a0449130230000200000000000000000080'; + const ETH_STETH_GAUGE = '0xcD4722B7c24C29e0413BDCd9e51404B4539D14aE'; + + const ETH_DAI_POOL = '0x0b09dea16768f0799065c475be02919503cb2a3500020000000000000000001a'; + const ETH_DAI_GAUGE = '0x4ca6AC0509E6381Ca7CD872a6cdC0Fbf00600Fa1'; + + const STAKED_ETH_STETH_HOLDER = '0x4B581dedA2f2C0650C3dFC506C86a8C140d9f699'; + + // The holder also holds RETH_STABLE_GAUGE tokens + const RETH_STABLE_GAUGE = '0x79eF6103A513951a3b25743DB509E267685726B7'; + + const TRANSFER_EXTERNAL_USER_BALANCE_OP_KIND = 3; + + const CHAINED_REFERENCE_PREFIX = 'ba10'; + function toChainedReference(key: BigNumberish): BigNumber { + // The full padded prefix is 66 characters long, with 64 hex characters and the 0x prefix. + const paddedPrefix = `0x${CHAINED_REFERENCE_PREFIX}${'0'.repeat(64 - CHAINED_REFERENCE_PREFIX.length)}`; + + return BigNumber.from(paddedPrefix).add(key); + } + + before('run task', async () => { + task = new Task('20230314-batch-relayer-v5', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + + library = await task.deployedInstance('BatchRelayerLibrary'); + relayer = await task.instanceAt('BalancerRelayer', await library.getEntrypoint()); + }); + + before('load vault and tokens', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + + vault = await vaultTask.instanceAt('Vault', await library.getVault()); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + }); + + before('load signers', async () => { + // We impersonate an account that holds staked BPT for the ETH_STETH Pool. + sender = await impersonate(STAKED_ETH_STETH_HOLDER); + }); + + before('approve relayer at the authorizer', async () => { + const relayerActionIds = await Promise.all( + ['swap', 'batchSwap', 'joinPool', 'exitPool', 'setRelayerApproval', 'manageUserBalance'].map((action) => + vault.getActionId(vault.interface.getSighash(action)) + ) + ); + + // We impersonate an account with the default admin role in order to be able to approve the relayer. This assumes + // such an account exists. + const admin = await impersonate(await authorizer.getRoleMember(await authorizer.DEFAULT_ADMIN_ROLE(), 0)); + + // Grant relayer permission to call all relayer functions + await authorizer.connect(admin).grantRoles(relayerActionIds, relayer.address); + }); + + sharedBeforeEach('approve relayer by the user', async () => { + await vault.connect(sender).setRelayerApproval(sender.address, relayer.address, true); + }); + + it('sender can unstake, exit, join and stake', async () => { + const destinationGauge = await task.instanceAt('IERC20', ETH_DAI_GAUGE); + expect(await destinationGauge.balanceOf(sender.address)).to.be.equal(0); + + // We use the relayer as the intermediate token holder as that saves gas (since there's fewer transfers, relayer + // permission checks, etc.) and also sidesteps the issue that not all BPT has Vault allowance (which is required to + // transfer them via the Vault, e.g. for staking). + + const stakedBalance = await (await task.instanceAt('IERC20', ETH_STETH_GAUGE)).balanceOf(sender.address); + + // There's no chained output here as the input equals the output + const unstakeCalldata = library.interface.encodeFunctionData('gaugeWithdraw', [ + ETH_STETH_GAUGE, + sender.address, + relayer.address, + stakedBalance, + ]); + + // Exit into WETH (it'd be more expensive to use ETH, and we'd have to use the relayer as an intermediary as we'd + // need to use said ETH). + + const ethStethTokens: Array = (await vault.getPoolTokens(ETH_STETH_POOL)).tokens; + const stableWethIndex = ethStethTokens.findIndex((token) => token.toLowerCase() == WETH.toLowerCase()); + + const exitCalldata = library.interface.encodeFunctionData('exitPool', [ + ETH_STETH_POOL, + 0, // Even if this a Stable Pool, the Batch Relayer is unaware of their encodings and the Weighted Pool encoding + // happens to match here + relayer.address, + relayer.address, + { + assets: ethStethTokens, + minAmountsOut: ethStethTokens.map(() => 0), + // Note that we use the same input as before + userData: defaultAbiCoder.encode(['uint256', 'uint256', 'uint256'], [0, stakedBalance, stableWethIndex]), + toInternalBalance: true, + }, + // Only store a chained reference for the WETH amount out, as the rest will be zero + [{ key: toChainedReference(42), index: stableWethIndex }], + ]); + + // Join from WETH + const ethDaiTokens: Array = (await vault.getPoolTokens(ETH_DAI_POOL)).tokens; + const ethDaiAmountsIn = ethDaiTokens.map((token) => + token.toLowerCase() == WETH.toLowerCase() ? toChainedReference(42) : 0 + ); + + const joinCalldata = library.interface.encodeFunctionData('joinPool', [ + ETH_DAI_POOL, + 0, // Weighted Pool + relayer.address, + relayer.address, + { + assets: ethDaiTokens, + maxAmountsIn: ethDaiTokens.map(() => MAX_UINT256), + userData: WeightedPoolEncoder.joinExactTokensInForBPTOut(ethDaiAmountsIn, 0), + fromInternalBalance: true, // Since we're joining from internal balance, we don't need to grant token allowance + }, + 0, // No eth + toChainedReference(17), // Store a reference for later staking + ]); + + const stakeCalldata = library.interface.encodeFunctionData('gaugeDeposit', [ + ETH_DAI_GAUGE, + relayer.address, + sender.address, + toChainedReference(17), // Stake all BPT from the join + ]); + + await relayer.connect(sender).multicall([unstakeCalldata, exitCalldata, joinCalldata, stakeCalldata]); + + expect(await destinationGauge.balanceOf(sender.address)).to.be.gt(0); + }); + + it('sender can update their gauge liquidity limits', async () => { + const tx = await relayer.connect(sender).multicall([ + library.interface.encodeFunctionData('manageUserBalance', [ + [RETH_STABLE_GAUGE, ETH_STETH_GAUGE].map((gauge) => ({ + kind: TRANSFER_EXTERNAL_USER_BALANCE_OP_KIND, + asset: gauge, + amount: 1, // The amount must be non-zero to trigger the token trasnfer and liquidity limit update + sender: sender.address, + recipient: sender.address, + })), + 0, // value: 0 (no need to transfer ETH) + ]), + ]); + + const gaugeInterface = new ethers.utils.Interface([ + 'event UpdateLiquidityLimit(address indexed user, uint256 original_balance, uint256 original_supply, uint256 working_balance, uint256 working_supply)', + ]); + + expectEvent.inIndirectReceipt( + await tx.wait(), + gaugeInterface, + 'UpdateLiquidityLimit', + { user: sender.address }, + RETH_STABLE_GAUGE + ); + + expectEvent.inIndirectReceipt( + await tx.wait(), + gaugeInterface, + 'UpdateLiquidityLimit', + { user: sender.address }, + ETH_STETH_GAUGE + ); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/tetuWrapping.fork.ts b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/tetuWrapping.fork.ts new file mode 100644 index 0000000..3aac763 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/tetuWrapping.fork.ts @@ -0,0 +1,135 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; +import { BigNumberish } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode, getSigner } from '@src'; +import { MAX_UINT256 } from '@helpers/constants'; + +describeForkTest('TetuWrapping', 'polygon', 37945364, function () { + let task: Task; + let relayer: Contract, library: Contract; + let vault: Contract, authorizer: Contract; + + const USDT = '0xc2132D05D31c914a87C6611C10748AEb04B58e8F'; + const USDT_HOLDER = '0xf977814e90da44bfa03b6295a0616a897441acec'; + const xUSDT = '0xE680e0317402ad3CB37D5ed9fc642702658Ef57F'; + + const TETU_GOVERNANCE = '0xcc16d636dD05b52FF1D8B9CE09B09BC62b11412B'; + const TETU_CONTROLLER = '0x6678814c273d5088114B6E40cC49C8DB04F9bC29'; + + let usdtToken: Contract, tetuVault: Contract; + let sender: SignerWithAddress, recipient: SignerWithAddress; + let chainedReference: BigNumber; + const amountToWrap = 100e6; + + before('run task', async () => { + task = new Task('20230314-batch-relayer-v5', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + library = await task.deployedInstance('BatchRelayerLibrary'); + relayer = await task.instanceAt('BalancerRelayer', await library.getEntrypoint()); + }); + + before('load vault and tokens', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + + vault = await vaultTask.instanceAt('Vault', await library.getVault()); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + }); + + before('approve relayer at the authorizer', async () => { + const relayerActionIds = await Promise.all( + ['swap', 'batchSwap', 'joinPool', 'exitPool', 'setRelayerApproval', 'manageUserBalance'].map((action) => + vault.getActionId(vault.interface.getSighash(action)) + ) + ); + + // We impersonate an account with the default admin role in order to be able to approve the relayer. This assumes + // such an account exists. + const admin = await impersonate(await authorizer.getRoleMember(await authorizer.DEFAULT_ADMIN_ROLE(), 0)); + + // Grant relayer permission to call all relayer functions + await authorizer.connect(admin).grantRoles(relayerActionIds, relayer.address); + }); + + before(async () => { + usdtToken = await task.instanceAt('IERC20', USDT); + tetuVault = await task.instanceAt('ITetuSmartVault', xUSDT); + sender = await impersonate(USDT_HOLDER); + recipient = await getSigner(); + + // Set whitelist approvals for the batch relayer to interact with the Tetu Smart Vault + const governance = await impersonate(TETU_GOVERNANCE); + + const tetuControllerABI = new ethers.utils.Interface([ + 'function changeWhiteListStatus(address[] memory _targets, bool status) external', + ]).format(); + const tetuController = await ethers.getContractAt(tetuControllerABI, TETU_CONTROLLER); + + await tetuController.connect(governance).changeWhiteListStatus([relayer.address], true); + + await vault.connect(sender).setRelayerApproval(sender.address, relayer.address, true); + await vault.connect(recipient).setRelayerApproval(recipient.address, relayer.address, true); + }); + + it('should wrap successfully', async () => { + const balanceOfUSDTBefore = await usdtToken.balanceOf(sender.address); + const balanceOfTetuBefore = await tetuVault.balanceOf(recipient.address); + const expectedBalanceOfTetuAfter = Math.floor((1e6 / (await tetuVault.getPricePerFullShare())) * amountToWrap); + + expect(balanceOfTetuBefore).to.be.equal(0); + + // Approving vault to pull tokens from user. + await usdtToken.connect(sender).approve(vault.address, amountToWrap); + + chainedReference = toChainedReference(30); + const depositIntoTetu = library.interface.encodeFunctionData('wrapTetu', [ + xUSDT, + sender.address, + recipient.address, + amountToWrap, + chainedReference, + ]); + + await relayer.connect(sender).multicall([depositIntoTetu]); + + const balanceOfUSDTAfter = await usdtToken.balanceOf(sender.address); + const balanceOfTetuAfter = await tetuVault.balanceOf(recipient.address); + + expect(balanceOfUSDTBefore.sub(balanceOfUSDTAfter)).to.be.equal(amountToWrap); + expect(balanceOfTetuAfter).to.be.almostEqual(expectedBalanceOfTetuAfter, 0.000001); + }); + + it('should unwrap successfully', async () => { + const tetuBalance = await tetuVault.balanceOf(recipient.address); + const tetuAmountToWithdraw = Math.floor((tetuBalance * (await tetuVault.getPricePerFullShare())) / 1e6); + + const balanceOfUSDTBefore = await usdtToken.balanceOf(sender.address); + + const withdrawFromTetu = library.interface.encodeFunctionData('unwrapTetu', [ + xUSDT, + recipient.address, + sender.address, + chainedReference, + 0, + ]); + + await tetuVault.connect(recipient).approve(vault.address, MAX_UINT256); + + await relayer.connect(recipient).multicall([withdrawFromTetu]); + + const balanceOfUSDTAfter = await usdtToken.balanceOf(sender.address); + const balanceOfTetuAfter = await tetuVault.balanceOf(recipient.address); + + expect(balanceOfTetuAfter).to.be.equal(0); + expect(balanceOfUSDTAfter.sub(balanceOfUSDTBefore)).to.be.almostEqual(tetuAmountToWithdraw, 0.0001); + }); +}); + +function toChainedReference(key: BigNumberish): BigNumber { + const CHAINED_REFERENCE_PREFIX = 'ba10'; + // The full padded prefix is 66 characters long, with 64 hex characters and the 0x prefix. + const paddedPrefix = `0x${CHAINED_REFERENCE_PREFIX}${'0'.repeat(64 - CHAINED_REFERENCE_PREFIX.length)}`; + + return BigNumber.from(paddedPrefix).add(key); +} diff --git a/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/yearnWrapping.fork.ts b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/yearnWrapping.fork.ts new file mode 100644 index 0000000..5e6e9d9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230314-batch-relayer-v5/test/yearnWrapping.fork.ts @@ -0,0 +1,124 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; +import { BigNumberish } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode, getSigner } from '@src'; +import { MAX_UINT256 } from '@helpers/constants'; + +describeForkTest('YearnWrapping', 'mainnet', 16622559, function () { + let task: Task; + let relayer: Contract, library: Contract; + let vault: Contract, authorizer: Contract; + + const USDC = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'; + const USDC_HOLDER = '0x0a59649758aa4d66e25f08dd01271e891fe52199'; + const yvUSDC = '0xa354F35829Ae975e850e23e9615b11Da1B3dC4DE'; + + let usdcToken: Contract, yearnToken: Contract; + let sender: SignerWithAddress, recipient: SignerWithAddress; + let chainedReference: BigNumber; + const amountToWrap = 100e6; + + before('run task', async () => { + task = new Task('20230314-batch-relayer-v5', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + library = await task.deployedInstance('BatchRelayerLibrary'); + relayer = await task.instanceAt('BalancerRelayer', await library.getEntrypoint()); + }); + + before('load vault and tokens', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + + vault = await vaultTask.instanceAt('Vault', await library.getVault()); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + }); + + before('approve relayer at the authorizer', async () => { + const relayerActionIds = await Promise.all( + ['swap', 'batchSwap', 'joinPool', 'exitPool', 'setRelayerApproval', 'manageUserBalance'].map((action) => + vault.getActionId(vault.interface.getSighash(action)) + ) + ); + + // We impersonate an account with the default admin role in order to be able to approve the relayer. This assumes + // such an account exists. + const admin = await impersonate(await authorizer.getRoleMember(await authorizer.DEFAULT_ADMIN_ROLE(), 0)); + + // Grant relayer permission to call all relayer functions + await authorizer.connect(admin).grantRoles(relayerActionIds, relayer.address); + }); + + before(async () => { + usdcToken = await task.instanceAt('IERC20', USDC); + yearnToken = await task.instanceAt('IYearnTokenVault', yvUSDC); + sender = await impersonate(USDC_HOLDER); + recipient = await getSigner(); + + await vault.connect(sender).setRelayerApproval(sender.address, relayer.address, true); + await vault.connect(recipient).setRelayerApproval(recipient.address, relayer.address, true); + }); + + it('should wrap successfully', async () => { + const balanceOfUSDCBefore = await usdcToken.balanceOf(sender.address); + const balanceOfYearnBefore = await yearnToken.balanceOf(recipient.address); + const expectedBalanceOfYearnAfter = Math.floor((1e6 / (await yearnToken.pricePerShare())) * amountToWrap); + + expect(balanceOfYearnBefore).to.be.equal(0); + + // Approving vault to pull tokens from user. + await usdcToken.connect(sender).approve(vault.address, amountToWrap); + + chainedReference = toChainedReference(30); + const depositIntoYearn = library.interface.encodeFunctionData('wrapYearn', [ + yvUSDC, + sender.address, + recipient.address, + amountToWrap, + chainedReference, + ]); + + await relayer.connect(sender).multicall([depositIntoYearn]); + + const balanceOfUSDCAfter = await usdcToken.balanceOf(sender.address); + const balanceOfYearnAfter = await yearnToken.balanceOf(recipient.address); + + expect(balanceOfUSDCBefore.sub(balanceOfUSDCAfter)).to.be.equal(amountToWrap); + expect(balanceOfYearnAfter).to.be.almostEqual(expectedBalanceOfYearnAfter); + }); + + it('should unwrap successfully', async () => { + const YearnAmountToWithdraw = Math.floor((1e6 / (await yearnToken.pricePerShare())) * amountToWrap); + + const balanceOfUSDCBefore = await usdcToken.balanceOf(sender.address); + const balanceOfYearnBefore = await yearnToken.balanceOf(recipient.address); + + expect(balanceOfYearnBefore).to.be.almostEqual(YearnAmountToWithdraw); + + const withdrawFromYearn = library.interface.encodeFunctionData('unwrapYearn', [ + yvUSDC, + recipient.address, + sender.address, + chainedReference, + 0, + ]); + + await yearnToken.connect(recipient).approve(vault.address, MAX_UINT256); + + await relayer.connect(recipient).multicall([withdrawFromYearn]); + + const balanceOfUSDCAfter = await usdcToken.balanceOf(sender.address); + const balanceOfYearnAfter = await yearnToken.balanceOf(recipient.address); + + expect(balanceOfYearnAfter).to.be.equal(0); + expect(balanceOfUSDCAfter.sub(balanceOfUSDCBefore)).to.be.almostEqual(amountToWrap); + }); +}); + +function toChainedReference(key: BigNumberish): BigNumber { + const CHAINED_REFERENCE_PREFIX = 'ba10'; + // The full padded prefix is 66 characters long, with 64 hex characters and the 0x prefix. + const paddedPrefix = `0x${CHAINED_REFERENCE_PREFIX}${'0'.repeat(64 - CHAINED_REFERENCE_PREFIX.length)}`; + + return BigNumber.from(paddedPrefix).add(key); +} diff --git a/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/artifact/ChildChainGauge.json b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/artifact/ChildChainGauge.json new file mode 100644 index 0000000..56b65b8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/artifact/ChildChainGauge.json @@ -0,0 +1,1043 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ChildChainGauge", + "sourceName": "@balancer-labs/liquidity-mining/contracts/gauges/ChildChainGauge.vy", + "abi": [ + { + "name": "Approval", + "inputs": [ + { + "name": "_owner", + "type": "address", + "indexed": true + }, + { + "name": "_spender", + "type": "address", + "indexed": true + }, + { + "name": "_value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Transfer", + "inputs": [ + { + "name": "_from", + "type": "address", + "indexed": true + }, + { + "name": "_to", + "type": "address", + "indexed": true + }, + { + "name": "_value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Deposit", + "inputs": [ + { + "name": "_user", + "type": "address", + "indexed": true + }, + { + "name": "_value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Withdraw", + "inputs": [ + { + "name": "_user", + "type": "address", + "indexed": true + }, + { + "name": "_value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "UpdateLiquidityLimit", + "inputs": [ + { + "name": "_user", + "type": "address", + "indexed": true + }, + { + "name": "_original_balance", + "type": "uint256", + "indexed": false + }, + { + "name": "_original_supply", + "type": "uint256", + "indexed": false + }, + { + "name": "_working_balance", + "type": "uint256", + "indexed": false + }, + { + "name": "_working_supply", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "stateMutability": "nonpayable", + "type": "constructor", + "inputs": [ + { + "name": "_voting_escrow_delegation_proxy", + "type": "address" + }, + { + "name": "_bal_pseudo_minter", + "type": "address" + }, + { + "name": "_authorizer_adaptor", + "type": "address" + }, + { + "name": "_version", + "type": "string" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit", + "inputs": [ + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit", + "inputs": [ + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_user", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "withdraw", + "inputs": [ + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "withdraw", + "inputs": [ + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_user", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "permit", + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_deadline", + "type": "uint256" + }, + { + "name": "_v", + "type": "uint8" + }, + { + "name": "_r", + "type": "bytes32" + }, + { + "name": "_s", + "type": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "transfer", + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "increaseAllowance", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_added_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "decreaseAllowance", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_subtracted_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "user_checkpoint", + "inputs": [ + { + "name": "addr", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claimable_tokens", + "inputs": [ + { + "name": "addr", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "claimed_reward", + "inputs": [ + { + "name": "_addr", + "type": "address" + }, + { + "name": "_token", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "claimable_reward", + "inputs": [ + { + "name": "_user", + "type": "address" + }, + { + "name": "_reward_token", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "set_rewards_receiver", + "inputs": [ + { + "name": "_receiver", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claim_rewards", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claim_rewards", + "inputs": [ + { + "name": "_addr", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claim_rewards", + "inputs": [ + { + "name": "_addr", + "type": "address" + }, + { + "name": "_receiver", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claim_rewards", + "inputs": [ + { + "name": "_addr", + "type": "address" + }, + { + "name": "_receiver", + "type": "address" + }, + { + "name": "_reward_indexes", + "type": "uint256[]" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "add_reward", + "inputs": [ + { + "name": "_reward_token", + "type": "address" + }, + { + "name": "_distributor", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "set_reward_distributor", + "inputs": [ + { + "name": "_reward_token", + "type": "address" + }, + { + "name": "_distributor", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit_reward_token", + "inputs": [ + { + "name": "_reward_token", + "type": "address" + }, + { + "name": "_amount", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "killGauge", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "unkillGauge", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "decimals", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "allowance", + "inputs": [ + { + "name": "owner", + "type": "address" + }, + { + "name": "spender", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_checkpoint", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "bal_token", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "bal_pseudo_minter", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "voting_escrow_delegation_proxy", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "authorizer_adaptor", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "_lp_token", + "type": "address" + }, + { + "name": "_version", + "type": "string" + } + ], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "DOMAIN_SEPARATOR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "nonces", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "lp_token", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "version", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "factory", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "working_balances", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "working_supply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "period", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "period_timestamp", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_checkpoint_of", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_fraction", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_inv_supply", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_inv_supply_of", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_count", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_tokens", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_data", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "components": [ + { + "name": "distributor", + "type": "address" + }, + { + "name": "period_finish", + "type": "uint256" + }, + { + "name": "rate", + "type": "uint256" + }, + { + "name": "last_update", + "type": "uint256" + }, + { + "name": "integral", + "type": "uint256" + } + ] + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "rewards_receiver", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_integral_for", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "is_killed", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "inflation_rate", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + } + ], + "bytecode": "0x602061305d6000396000518060a01c61305857604052602061307d6000396000518060a01c61305857606052602061309d6000396000518060a01c6130585760805260206130bd600039600051608060208261305d01600039600051116130585760208161305d016000396000518060a05260208201818161305d0160c03950505061dead600b5560a05180600c556000602082601f0104600481116130585780156100bf57905b6020810260c0015181600d01556001018181186100a7575b50505061dead6011556040516300002f09526060516300002ee95263c0039699610140526020610140600461015c6060515afa610101573d600060003e3d6000fd5b60203d1061305857610140518060a01c6130585761018052610180516300002ec9526080516300002f4952638d928af8610140526020610140600461015c6080515afa610153573d600060003e3d6000fd5b60203d1061305857610140518060a01c6130585761018052610180516300002f2952612ec961018e630000000039612ec960a0016300000000f3600436101561000d5761216d565b60003560e01c34612ec45763b6b55f25811861002d57336106e052610048565b636e553f6581186101ec576024358060a01c612ec4576106e0525b600054612ec45760016000556106e051604052610063612173565b60043561006f576101e5565b600a546107005260096106e0516020526000526040600020546004358181830110612ec45780820190509050610720526000601a54146100d3576106e05161018052610700516101a05260006101c05260006101e0526000610200526100d3612765565b610700516004358181830110612ec45780820190509050610700526107205160096106e05160205260005260406000205561070051600a556106e0516040526107205160605261070051608052610128612523565b6323b872dd61074052336107605230610780526004356107a0526020610740606461075c6000600b545af1610162573d600060003e3d6000fd5b60203d10612ec457610740518060011c612ec4576107c0526107c0506106e0517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c600435610740526020610740a26106e05160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600435610740526020610740a35b6000600055005b632e1a7d4d811861020157336106e05261021b565b62f714ce81186103ad576024358060a01c612ec4576106e0525b600054612ec45760016000556106e051604052610236612173565b600435610242576103a6565b600a5461070052600933602052600052604060002054600435808210612ec45780820390509050610720526000601a54146102a1576106e05161018052610700516101a05260006101c05260006101e0526000610200526102a1612765565b61070051600435808210612ec45780820390509050610700526107205160093360205260005260406000205561070051600a553360405261072051606052610700516080526102ee612523565b63a9059cbb610740526106e05161076052600435610780526020610740604461075c6000600b545af1610326573d600060003e3d6000fd5b60203d10612ec457610740518060011c612ec4576107a0526107a0506106e0517f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364600435610740526020610740a26000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600435610740526020610740a35b6000600055005b6323b872dd8118610492576004358060a01c612ec4576107e0526024358060a01c612ec45761080052600054612ec45760016000556107e051604052336060526103f8610840612e60565b61084051610820527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61082051146104615761082051604435808210612ec4578082039050905060086107e0516020526000526040600020803360205260005260406000209050555b6107e0516106e052610800516107005260443561072052610480612ce7565b60016108405260206108406000600055f35b63095ea7b38118610509576004358060a01c612ec4576040526024356008336020526000526040600020806040516020526000526040600020905055604051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560243560605260206060a3600160605260206060f35b63d505accf81186109d5576004358060a01c612ec4576040526024358060a01c612ec4576060526084358060081c612ec457608052600060405114156105a657600d60a0527f494e56414c49445f4f574e45520000000000000000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b60643542111561060d57601060a0527f444541444c494e455f455850495245440000000000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b600260405160205260005260406000205460a05260006002610360527f1901000000000000000000000000000000000000000000000000000000000000610380526103608051602082018361058001815181525050808301925050506001548161058001526020810190507f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96104a0526040516104c0526060516104e0526044356105005260a051610520526064356105405260c0610480526104808051602082012090508161058001526020810190508061056052610560905080516020820120905060c05260006040513b116107a15760c051610100526080516101205260a4356101405260c4356101605260206000608061010060015afa5060005160e05260405160e0511461094d57600b610100527f494e56414c49445f534947000000000000000000000000000000000000000000610120526101005061010051806101200181600003601f1636823750506308c379a060c052602060e052601f19601f61010051011660440160dcfd61094d565b600060a4356101805260c4356101a05260406101605261016080516020820183610240018281848460045afa90505050808301925050506080516101c0526101c06020602011612ec457601f81018051610200525060016101e0526101e090508051602082018361024001815181525050808301925050508061022052610220905080518060e0526020820181610100838360045afa9050905050507f1626ba7e00000000000000000000000000000000000000000000000000000000631626ba7e61016052604060c05161018052806101a052806101800160e0518082526020820181818361010060045afa90505050805180602083010181600003601f163682375050601f19601f82516020010116905081015050602061016060c461017c6040515afa6108d6573d600060003e3d6000fd5b60203d10612ec457610160511461094d57600b610240527f494e56414c49445f534947000000000000000000000000000000000000000000610260526102405061024051806102600181600003601f1636823750506308c379a061020052602061022052601f19601f61024051011660440161021cfd5b6044356008604051602052600052604060002080606051602052600052604060002090505560a05160018181830110612ec4578082019050905060026040516020526000526040600020556060516040517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560443560e052602060e0a3600160e052602060e0f35b63a9059cbb8118610a29576004358060a01c612ec4576107e052600054612ec4576001600055336106e0526107e0516107005260243561072052610a17612ce7565b60016108005260206108006000600055f35b63395093518118610acd576004358060a01c612ec45760805233604052608051606052610a5660c0612e60565b60c0516024358181830110612ec4578082019050905060a05260a0516008336020526000526040600020806080516020526000526040600020905055608051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560a05160c052602060c0a3600160c052602060c0f35b63a457c2d78118610b6f576004358060a01c612ec45760805233604052608051606052610afa60c0612e60565b60c051602435808210612ec4578082039050905060a05260a0516008336020526000526040600020806080516020526000526040600020905055608051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560a05160c052602060c0a3600160c052602060c0f35b634b8200938118610bcf576004358060a01c612ec4576101a0526101a051604052610b98612173565b6101a05160405260096101a051602052600052604060002054606052600a54608052610bc2612523565b60016101c05260206101c0f35b63331345838118610c6b576004358060a01c612ec4576101805261018051604052610bf8612173565b601761018051602052600052604060002054638b752bb06101a052610180516101c052306101e05260206101a060446101bc6020612ee96000396000515afa610c46573d600060003e3d6000fd5b60203d10612ec4576101a051808210612ec45780820390509050610200526020610200f35b63e77e74378118610cd6576004358060a01c612ec4576040526024358060a01c612ec457606052602660405160205260005260406000208060605160205260005260406000209050547001000000000000000000000000000000008082069050905060805260206080f35b6333fd6f748118610ea0576004358060a01c612ec4576040526024358060a01c612ec4576060526023606051602052600052604060002060048101905054608052600a5460a052600060a05114610dec574260236060516020526000526040600020600181019050548082811882841002189050905060c05260c0516023606051602052600052604060002060038101905054808210612ec4578082039050905060e05260805160e0516023606051602052600052604060002060028101905054808202821582848304141715612ec45790509050670de0b6b3a7640000808202821582848304141715612ec4579050905060a051808015612ec4578204905090508181830110612ec457808201905090506080525b6025606051602052600052604060002080604051602052600052604060002090505460c052600960405160205260005260406000205460805160c051808210612ec45780820390509050808202821582848304141715612ec45790509050670de0b6b3a76400008082049050905060e0526026604051602052600052604060002080606051602052600052604060002090505460801c60e0518181830110612ec45780820190509050610100526020610100f35b63bdf981168118610ecd576004358060a01c612ec457604052604051602433602052600052604060002055005b63e6f1daf28118610ee957336106e05260403661070037610f95565b6384e9bd7e8118610f0f576004358060a01c612ec4576106e05260403661070037610f95565b639faceb1b8118610f43576004358060a01c612ec4576106e0526024358060a01c612ec45761070052600061072052610f95565b632a6acd978118611065576004358060a01c612ec4576106e0526024358060a01c612ec457610700526044356004016008813511612ec457803580610720526020820160208202808261074037505050505b600054612ec45760016000556000610700511461101c57336106e0511461101c576015610840527f43414e4e4f545f52454449524543545f434c41494d0000000000000000000000610860526108405061084051806108600181600003601f1636823750506308c379a061080052602061082052601f19601f61084051011660440161081cfd5b6106e05161018052600a546101a05260016101c052610700516101e05261072051806102005260208102806102208261074060045afa9050505061105e612765565b6000600055005b63e8de0d4d811861128c576004358060a01c612ec4576040526024358060a01c612ec4576060526020612f4960003960005133146110fa5760126080527f53454e4445525f4e4f545f414c4c4f574544000000000000000000000000000060a0526080506080518060a00181600003601f1636823750506308c379a06040526020606052601f19601f6080510116604401605cfd5b6020612ec9600039600051604051141561116b5760156080527f43414e4e4f545f4144445f42414c5f524557415244000000000000000000000060a0526080506080518060a00181600003601f1636823750506308c379a06040526020606052601f19601f6080510116604401605cfd5b601a546080526008608051106111d857601360a0527f4d41585f524557415244535f524541434845440000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b60236040516020526000526040600020541561124b57601560a0527f5245574152445f414c52454144595f455849535453000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b60605160236040516020526000526040600020556040516080516008811015612ec457601b015560805160018181830110612ec45780820190509050601a55005b63058a3a24811861145e576004358060a01c612ec4576040526024358060a01c612ec45760605260236040516020526000526040600020546080523360805160c0526020612f4960003960005160e052600060a05260006002905b6020810260c0015183186112ff57600160a05261130a565b6001018181186112e7575b505060a0519050611378576012610100527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000610120526101005061010051806101200181600003601f1636823750506308c379a060c052602060e052601f19601f61010051011660440160dcfd5b600060805114156113e057601060a0527f5245574152445f4e4f545f41444445440000000000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b6000606051141561144857601360a0527f494e56414c49445f4449535452494255544f520000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b6060516023604051602052600052604060002055005b6393f7aa67811861174b576004358060a01c612ec4576106e052600054612ec457600160005560236106e0516020526000526040600020543314611502576012610700527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000610720526107005061070051806107200181600003601f1636823750506308c379a06106c05260206106e052601f19601f6107005101166044016106dcfd5b600061018052600a546101a05260006101c05260006101e052600061020052611529612765565b6323b872dd610744526004336107645230610784526024356107a452606001610740526107405060206108006107405161076060006106e0515af1611573573d600060003e3d6000fd5b6107e060203d8082116115865781611588565b805b9050905081528051806107005260208201805161072052505050600061070051146116265761072051610700516020036008021c611626576015610740527f5452414e534645525f46524f4d5f4641494c5552450000000000000000000000610760526107405061074051806107600181600003601f1636823750506308c379a061070052602061072052601f19601f61074051011660440161071cfd5b60236106e05160205260005260406000206001810190505461074052610740514210156116d7576107405142808210612ec45780820390509050610760526107605160236106e051602052600052604060002060028101905054808202821582848304141715612ec4579050905061078052602435610780518181830110612ec4578082019050905062093a808082049050905060236106e0516020526000526040600020600281019050556116fe565b60243562093a808082049050905060236106e0516020526000526040600020600281019050555b4260236106e0516020526000526040600020600381019050554262093a808181830110612ec4578082019050905060236106e0516020526000526040600020600181019050556000600055005b63ab8f094581186117cb576020612f4960003960005133146117c45760126040527f53454e4445525f4e4f545f414c4c4f57454400000000000000000000000000006060526040506040518060600181600003601f1636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6001602755005b63d34fb267811861184b576020612f4960003960005133146118445760126040527f53454e4445525f4e4f545f414c4c4f57454400000000000000000000000000006060526040506040518060600181600003601f1636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6000602755005b63313ce567811861186157601260405260206040f35b63dd62ed3e81186118a4576004358060a01c612ec4576080526024358060a01c612ec45760a052602060805160405260a0516060526118a060c0612e60565b60c0f35b63d31f3f6d81186118c957601560145460205260005260406000205460405260206040f35b6329421d5081186118e8576020612ec960003960005160405260206040f35b6339f4caba8118611907576020612ee960003960005160405260206040f35b636246c22e8118611926576020612f0960003960005160405260206040f35b6355341bc38118611945576020612f4960003960005160405260206040f35b63f399e22e8118611cca576004358060a01c612ec4576040526024356004016080813511612ec457803580606052602082018181608037505050600b54156119ea576013610100527f414c52454144595f494e495449414c495a454400000000000000000000000000610120526101005061010051806101200181600003601f1636823750506308c379a060c052602060e052601f19601f61010051011660440160dcfd5b604051600b5560605180600c556000602082601f010460048111612ec4578015611a2857905b602081026080015181600d0155600101818118611a10575b505050336011556395d89b41610140526060610140600461015c6040515afa611a56573d600060003e3d6000fd5b60403d10612ec4576101405161014001601a815111612ec4578051806101c0526020820180516101e0525050506101c08051806101005260208201805161012052505050600060096101a0527f42616c616e6365722000000000000000000000000000000000000000000000006101c0526101a080516020820183610240018151815250508083019250505061010051816102400161012051815250808201915050600e6101e0527f204761756765204465706f736974000000000000000000000000000000000000610200526101e080516020820183610240018151815250508083019250505080610220526102209050805180610140526020820181610160838360045afa90509050505061014051806003556000602082601f010460028111612ec4578015611b9d57905b6020810261016001518160040155600101818118611b84575b50505060006101005181610200016101205181525080820191505060066101a0527f2d676175676500000000000000000000000000000000000000000000000000006101c0526101a0805160208201836102000181518152505080830192505050806101e0526101e0905080518060065560208201805160075550505042601560006020526000526040600020557f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6103c05261014051610160206103e052600c5480610300526000602082601f010460048111612ec4578015611c9657905b80600d0154602082026103200152600101818118611c7d575b505050610300805160208201209050610400524661042052306104405260a06103a0526103a0805160208201209050600155005b633644e5158118611ce15760015460405260206040f35b637ecebe008118611d14576004358060a01c612ec457604052600260405160205260005260406000205460605260206060f35b6306fdde038118611d915760208060405280604001600354808252602082016000602083601f010460028111612ec4578015611d6357905b806004015460208202840152600101818118611d4c575b50505050805180602083010181600003601f163682375050601f19601f825160200101169050810190506040f35b6395d89b418118611de157602080604052806040016006548082526020820160075481525050805180602083010181600003601f163682375050601f19601f825160200101169050810190506040f35b6370a082318118611e14576004358060a01c612ec457604052600960405160205260005260406000205460605260206060f35b6318160ddd8118611e2b57600a5460405260206040f35b6382c630668118611e4257600b5460405260206040f35b6354fd4d508118611ebf5760208060405280604001600c54808252602082016000602083601f010460048111612ec4578015611e9157905b80600d015460208202840152600101818118611e7a575b50505050805180602083010181600003601f163682375050601f19601f825160200101169050810190506040f35b63c45a01558118611ed65760115460405260206040f35b6313ecb1ca8118611f09576004358060a01c612ec457604052601260405160205260005260406000205460605260206060f35b6317e280898118611f205760135460405260206040f35b63ef78d4fd8118611f375760145460405260206040f35b637598108c8118611f5c57601560043560205260005260406000205460405260206040f35b639bd324f28118611f8f576004358060a01c612ec457604052601660405160205260005260406000205460605260206060f35b63094007078118611fc2576004358060a01c612ec457604052601760405160205260005260406000205460605260206060f35b63fec8ee0c8118611fe757601860043560205260005260406000205460405260206040f35b63de263bfa811861201a576004358060a01c612ec457604052601960405160205260005260406000205460605260206060f35b63963c94b9811861203157601a5460405260206040f35b6354c49fe98118612055576004356008811015612ec457601b015460405260206040f35b6348e9c65e81186120aa576004358060a01c612ec4576040526023604051602052600052604060002080546060526001810154608052600281015460a052600381015460c052600481015460e0525060a06060f35b6301ddabf181186120dd576004358060a01c612ec457604052602460405160205260005260406000205460605260206060f35b63f05cc058811861212f576004358060a01c612ec4576040526024358060a01c612ec4576060526025604051602052600052604060002080606051602052600052604060002090505460805260206080f35b639c868ac081186121465760275460405260206040f35b63fadd59ab811861216b57602860043560205260005260406000205460405260206040f35b505b60006000fd5b6014546060526015606051602052600052604060002054608052601860605160205260005260406000205460a05260805142116121b15760006121b6565b602754155b156123085760135460c05260805160e05260805162093a808181830110612ec4578082019050905062093a808082049050905062093a80808202821582848304141715612ec457905090504280828118828410021890509050610100526000610100905b80610120526101005160e051808210612ec4578082039050905061014052600060c051146122ba5760a051602860e05162093a8080820490509050602052600052604060002054670de0b6b3a7640000808202821582848304141715612ec4579050905061014051808202821582848304141715612ec4579050905060c051808015612ec4578204905090508181830110612ec4578082019050905060a0525b4261010051186122c957612305565b6101005160e0526101005162093a808181830110612ec4578082019050905042808281188284100218905090506101005260010181811861221a575b50505b6370a0823160e0523061010052602060e0602460fc6020612ec96000396000515afa612339573d600060003e3d6000fd5b60203d10612ec45760e05160c052600060c05114612435574262093a808082049050905060e052602860e0516020526000526040600020805460c05160e05160018181830110612ec4578082019050905062093a80808202821582848304141715612ec4579050905042808210612ec45780820390509050808015612ec4578204905090508181830110612ec4578082019050905081555063a9059cbb610100526020612ee96000396000516101205260c051610140526020610100604461011c60006020612ec96000396000515af1612418573d600060003e3d6000fd5b60203d10612ec457610100518060011c612ec45761016052610160505b60605160018181830110612ec4578082019050905060605260605160145542601560605160205260005260406000205560a0516018606051602052600052604060002055601260405160205260005260406000205460e05260176040516020526000526040600020805460e05160a0516019604051602052600052604060002054808210612ec45780820390509050808202821582848304141715612ec45790509050670de0b6b3a7640000808204905090508181830110612ec4578082019050905081555060a0516019604051602052600052604060002055426016604051602052600052604060002055565b6060516028808202821582848304141715612ec4579050905060648082049050905060a0526020612f0960003960005160c052600060c05114612655576318160ddd610100526020610100600461011c60c0515afa612587573d600060003e3d6000fd5b60203d10612ec4576101005160e052600060e0511461265557632579841861012052604051610140526020610120602461013c60c0515afa6125ce573d600060003e3d6000fd5b60203d10612ec457610120516101005260a05160805161010051808202821582848304141715612ec4579050905060e051808015612ec457820490509050603c808202821582848304141715612ec457905090506064808204905090508181830110612ec4578082019050905060a05260605160a0518082811882841002189050905060a0525b601260405160205260005260406000205460e05260a051601260405160205260005260406000205560135460a0518181830110612ec4578082019050905060e051808210612ec4578082039050905061010052610100516013556040517f7ecd84343f76a23d2227290e0288da3251b045541698e575a5515af4f04197a3606051610120526080516101405260a0516101605261010051610180526080610120a2565b600060405260006008905b8061016052601a54610160511061271957612743565b60405160078111612ec4576001810160405261016051602082026060015250600101818118612703575b50506040518082526020810260208301818183606060045afa90509050505050565b6000610320526101e05161034052600061018051146127d557600961018051602052600052604060002054610320526101c0516127a35760006127a9565b6101e051155b156127d55760246101805160205260005260406000205461034052610340516127d55761018051610340525b601a5461036052600061038052610200511561280d5761020051806103805260208102806103a08261022060045afa9050505061283d565b6128186104a06126f8565b6104a0805180610380526020820160208202806103a0828460045afa90509050905050505b60006103805160088111612ec4578015612ce357905b602081026103a001516104a052610360516104a051106128d35760146104c0527f494e56414c49445f5245574152445f494e4445580000000000000000000000006104e0526104c0506104c051806104e00181600003601f1636823750506308c379a06104805260206104a052601f19601f6104c051011660440161049cfd5b6104a0516008811015612ec457601b01546104c05260236104c0516020526000526040600020600481019050546104e0524260236104c05160205260005260406000206001810190505480828118828410021890509050610500526105005160236104c051602052600052604060002060038101905054808210612ec457808203905090506105205260006105205114612a21576105005160236104c05160205260005260406000206003810190505560006101a05114612a21576104e0516105205160236104c051602052600052604060002060028101905054808202821582848304141715612ec45790509050670de0b6b3a7640000808202821582848304141715612ec457905090506101a051808015612ec4578204905090508181830110612ec457808201905090506104e0526104e05160236104c0516020526000526040600020600481019050555b60006101805114612cd85760256104c051602052600052604060002080610180516020526000526040600020905054610540526000610560526104e051610540511015612ad3576104e05160256104c051602052600052604060002080610180516020526000526040600020905055610320516104e05161054051808210612ec45780820390509050808202821582848304141715612ec45790509050670de0b6b3a764000080820490509050610560525b6026610180516020526000526040600020806104c0516020526000526040600020905054610580526105805160801c610560518181830110612ec457808201905090506105a05260006105a0511115612cd85761058051700100000000000000000000000000000000808206905090506105c0526101c051612b9f576000610560511115612cd8576105c0516105a05160801b8181830110612ec457808201905090506026610180516020526000526040600020806104c0516020526000526040600020905055612cd8565b63a9059cbb61062452600461034051610644526105a05161066452604001610620526106205060206106c06106205161064060006104c0515af1612be8573d600060003e3d6000fd5b6106a060203d808211612bfb5781612bfd565b805b9050905081528051806105e0526020820180516106005250505060006105e05114612c9b57610600516105e0516020036008021c612c9b576010610620527f5452414e534645525f4641494c55524500000000000000000000000000000000610640526106205061062051806106400181600003601f1636823750506308c379a06105e052602061060052601f19601f6106205101166044016105fcfd5b6105c0516105a0518181830110612ec457808201905090506026610180516020526000526040600020806104c05160205260005260406000209050555b600101818118612853575b5050565b61072051612cf457612e5e565b600a54610740526000601a541415610760526106e0516107a052610700516107c05260006002905b602081026107a001516107805261078051604052612d38612173565b6107805161018052610740516101a05260006101c05260006101e052600061020052612d62612765565b600101818118612d1c57505060096106e05160205260005260406000205461072051808210612ec45780820390509050610780526107805160096106e0516020526000526040600020556106e0516040526107805160605261074051608052612dc9612523565b600961070051602052600052604060002054610720518181830110612ec457808201905090506107805261078051600961070051602052600052604060002055610700516040526107805160605261074051608052612e26612523565b610700516106e0517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610720516107a05260206107a0a35b565b6020612f2960003960005160605118612e9c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815250612ec2565b600860405160205260005260406000208060605160205260005260406000209050548152505b565b600080fd005b600080fd", + "deployedBytecode": "0x600436101561000d5761216d565b60003560e01c34612ec45763b6b55f25811861002d57336106e052610048565b636e553f6581186101ec576024358060a01c612ec4576106e0525b600054612ec45760016000556106e051604052610063612173565b60043561006f576101e5565b600a546107005260096106e0516020526000526040600020546004358181830110612ec45780820190509050610720526000601a54146100d3576106e05161018052610700516101a05260006101c05260006101e0526000610200526100d3612765565b610700516004358181830110612ec45780820190509050610700526107205160096106e05160205260005260406000205561070051600a556106e0516040526107205160605261070051608052610128612523565b6323b872dd61074052336107605230610780526004356107a0526020610740606461075c6000600b545af1610162573d600060003e3d6000fd5b60203d10612ec457610740518060011c612ec4576107c0526107c0506106e0517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c600435610740526020610740a26106e05160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600435610740526020610740a35b6000600055005b632e1a7d4d811861020157336106e05261021b565b62f714ce81186103ad576024358060a01c612ec4576106e0525b600054612ec45760016000556106e051604052610236612173565b600435610242576103a6565b600a5461070052600933602052600052604060002054600435808210612ec45780820390509050610720526000601a54146102a1576106e05161018052610700516101a05260006101c05260006101e0526000610200526102a1612765565b61070051600435808210612ec45780820390509050610700526107205160093360205260005260406000205561070051600a553360405261072051606052610700516080526102ee612523565b63a9059cbb610740526106e05161076052600435610780526020610740604461075c6000600b545af1610326573d600060003e3d6000fd5b60203d10612ec457610740518060011c612ec4576107a0526107a0506106e0517f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364600435610740526020610740a26000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600435610740526020610740a35b6000600055005b6323b872dd8118610492576004358060a01c612ec4576107e0526024358060a01c612ec45761080052600054612ec45760016000556107e051604052336060526103f8610840612e60565b61084051610820527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61082051146104615761082051604435808210612ec4578082039050905060086107e0516020526000526040600020803360205260005260406000209050555b6107e0516106e052610800516107005260443561072052610480612ce7565b60016108405260206108406000600055f35b63095ea7b38118610509576004358060a01c612ec4576040526024356008336020526000526040600020806040516020526000526040600020905055604051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560243560605260206060a3600160605260206060f35b63d505accf81186109d5576004358060a01c612ec4576040526024358060a01c612ec4576060526084358060081c612ec457608052600060405114156105a657600d60a0527f494e56414c49445f4f574e45520000000000000000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b60643542111561060d57601060a0527f444541444c494e455f455850495245440000000000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b600260405160205260005260406000205460a05260006002610360527f1901000000000000000000000000000000000000000000000000000000000000610380526103608051602082018361058001815181525050808301925050506001548161058001526020810190507f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96104a0526040516104c0526060516104e0526044356105005260a051610520526064356105405260c0610480526104808051602082012090508161058001526020810190508061056052610560905080516020820120905060c05260006040513b116107a15760c051610100526080516101205260a4356101405260c4356101605260206000608061010060015afa5060005160e05260405160e0511461094d57600b610100527f494e56414c49445f534947000000000000000000000000000000000000000000610120526101005061010051806101200181600003601f1636823750506308c379a060c052602060e052601f19601f61010051011660440160dcfd61094d565b600060a4356101805260c4356101a05260406101605261016080516020820183610240018281848460045afa90505050808301925050506080516101c0526101c06020602011612ec457601f81018051610200525060016101e0526101e090508051602082018361024001815181525050808301925050508061022052610220905080518060e0526020820181610100838360045afa9050905050507f1626ba7e00000000000000000000000000000000000000000000000000000000631626ba7e61016052604060c05161018052806101a052806101800160e0518082526020820181818361010060045afa90505050805180602083010181600003601f163682375050601f19601f82516020010116905081015050602061016060c461017c6040515afa6108d6573d600060003e3d6000fd5b60203d10612ec457610160511461094d57600b610240527f494e56414c49445f534947000000000000000000000000000000000000000000610260526102405061024051806102600181600003601f1636823750506308c379a061020052602061022052601f19601f61024051011660440161021cfd5b6044356008604051602052600052604060002080606051602052600052604060002090505560a05160018181830110612ec4578082019050905060026040516020526000526040600020556060516040517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560443560e052602060e0a3600160e052602060e0f35b63a9059cbb8118610a29576004358060a01c612ec4576107e052600054612ec4576001600055336106e0526107e0516107005260243561072052610a17612ce7565b60016108005260206108006000600055f35b63395093518118610acd576004358060a01c612ec45760805233604052608051606052610a5660c0612e60565b60c0516024358181830110612ec4578082019050905060a05260a0516008336020526000526040600020806080516020526000526040600020905055608051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560a05160c052602060c0a3600160c052602060c0f35b63a457c2d78118610b6f576004358060a01c612ec45760805233604052608051606052610afa60c0612e60565b60c051602435808210612ec4578082039050905060a05260a0516008336020526000526040600020806080516020526000526040600020905055608051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560a05160c052602060c0a3600160c052602060c0f35b634b8200938118610bcf576004358060a01c612ec4576101a0526101a051604052610b98612173565b6101a05160405260096101a051602052600052604060002054606052600a54608052610bc2612523565b60016101c05260206101c0f35b63331345838118610c6b576004358060a01c612ec4576101805261018051604052610bf8612173565b601761018051602052600052604060002054638b752bb06101a052610180516101c052306101e05260206101a060446101bc6020612ee96000396000515afa610c46573d600060003e3d6000fd5b60203d10612ec4576101a051808210612ec45780820390509050610200526020610200f35b63e77e74378118610cd6576004358060a01c612ec4576040526024358060a01c612ec457606052602660405160205260005260406000208060605160205260005260406000209050547001000000000000000000000000000000008082069050905060805260206080f35b6333fd6f748118610ea0576004358060a01c612ec4576040526024358060a01c612ec4576060526023606051602052600052604060002060048101905054608052600a5460a052600060a05114610dec574260236060516020526000526040600020600181019050548082811882841002189050905060c05260c0516023606051602052600052604060002060038101905054808210612ec4578082039050905060e05260805160e0516023606051602052600052604060002060028101905054808202821582848304141715612ec45790509050670de0b6b3a7640000808202821582848304141715612ec4579050905060a051808015612ec4578204905090508181830110612ec457808201905090506080525b6025606051602052600052604060002080604051602052600052604060002090505460c052600960405160205260005260406000205460805160c051808210612ec45780820390509050808202821582848304141715612ec45790509050670de0b6b3a76400008082049050905060e0526026604051602052600052604060002080606051602052600052604060002090505460801c60e0518181830110612ec45780820190509050610100526020610100f35b63bdf981168118610ecd576004358060a01c612ec457604052604051602433602052600052604060002055005b63e6f1daf28118610ee957336106e05260403661070037610f95565b6384e9bd7e8118610f0f576004358060a01c612ec4576106e05260403661070037610f95565b639faceb1b8118610f43576004358060a01c612ec4576106e0526024358060a01c612ec45761070052600061072052610f95565b632a6acd978118611065576004358060a01c612ec4576106e0526024358060a01c612ec457610700526044356004016008813511612ec457803580610720526020820160208202808261074037505050505b600054612ec45760016000556000610700511461101c57336106e0511461101c576015610840527f43414e4e4f545f52454449524543545f434c41494d0000000000000000000000610860526108405061084051806108600181600003601f1636823750506308c379a061080052602061082052601f19601f61084051011660440161081cfd5b6106e05161018052600a546101a05260016101c052610700516101e05261072051806102005260208102806102208261074060045afa9050505061105e612765565b6000600055005b63e8de0d4d811861128c576004358060a01c612ec4576040526024358060a01c612ec4576060526020612f4960003960005133146110fa5760126080527f53454e4445525f4e4f545f414c4c4f574544000000000000000000000000000060a0526080506080518060a00181600003601f1636823750506308c379a06040526020606052601f19601f6080510116604401605cfd5b6020612ec9600039600051604051141561116b5760156080527f43414e4e4f545f4144445f42414c5f524557415244000000000000000000000060a0526080506080518060a00181600003601f1636823750506308c379a06040526020606052601f19601f6080510116604401605cfd5b601a546080526008608051106111d857601360a0527f4d41585f524557415244535f524541434845440000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b60236040516020526000526040600020541561124b57601560a0527f5245574152445f414c52454144595f455849535453000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b60605160236040516020526000526040600020556040516080516008811015612ec457601b015560805160018181830110612ec45780820190509050601a55005b63058a3a24811861145e576004358060a01c612ec4576040526024358060a01c612ec45760605260236040516020526000526040600020546080523360805160c0526020612f4960003960005160e052600060a05260006002905b6020810260c0015183186112ff57600160a05261130a565b6001018181186112e7575b505060a0519050611378576012610100527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000610120526101005061010051806101200181600003601f1636823750506308c379a060c052602060e052601f19601f61010051011660440160dcfd5b600060805114156113e057601060a0527f5245574152445f4e4f545f41444445440000000000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b6000606051141561144857601360a0527f494e56414c49445f4449535452494255544f520000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b6060516023604051602052600052604060002055005b6393f7aa67811861174b576004358060a01c612ec4576106e052600054612ec457600160005560236106e0516020526000526040600020543314611502576012610700527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000610720526107005061070051806107200181600003601f1636823750506308c379a06106c05260206106e052601f19601f6107005101166044016106dcfd5b600061018052600a546101a05260006101c05260006101e052600061020052611529612765565b6323b872dd610744526004336107645230610784526024356107a452606001610740526107405060206108006107405161076060006106e0515af1611573573d600060003e3d6000fd5b6107e060203d8082116115865781611588565b805b9050905081528051806107005260208201805161072052505050600061070051146116265761072051610700516020036008021c611626576015610740527f5452414e534645525f46524f4d5f4641494c5552450000000000000000000000610760526107405061074051806107600181600003601f1636823750506308c379a061070052602061072052601f19601f61074051011660440161071cfd5b60236106e05160205260005260406000206001810190505461074052610740514210156116d7576107405142808210612ec45780820390509050610760526107605160236106e051602052600052604060002060028101905054808202821582848304141715612ec4579050905061078052602435610780518181830110612ec4578082019050905062093a808082049050905060236106e0516020526000526040600020600281019050556116fe565b60243562093a808082049050905060236106e0516020526000526040600020600281019050555b4260236106e0516020526000526040600020600381019050554262093a808181830110612ec4578082019050905060236106e0516020526000526040600020600181019050556000600055005b63ab8f094581186117cb576020612f4960003960005133146117c45760126040527f53454e4445525f4e4f545f414c4c4f57454400000000000000000000000000006060526040506040518060600181600003601f1636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6001602755005b63d34fb267811861184b576020612f4960003960005133146118445760126040527f53454e4445525f4e4f545f414c4c4f57454400000000000000000000000000006060526040506040518060600181600003601f1636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6000602755005b63313ce567811861186157601260405260206040f35b63dd62ed3e81186118a4576004358060a01c612ec4576080526024358060a01c612ec45760a052602060805160405260a0516060526118a060c0612e60565b60c0f35b63d31f3f6d81186118c957601560145460205260005260406000205460405260206040f35b6329421d5081186118e8576020612ec960003960005160405260206040f35b6339f4caba8118611907576020612ee960003960005160405260206040f35b636246c22e8118611926576020612f0960003960005160405260206040f35b6355341bc38118611945576020612f4960003960005160405260206040f35b63f399e22e8118611cca576004358060a01c612ec4576040526024356004016080813511612ec457803580606052602082018181608037505050600b54156119ea576013610100527f414c52454144595f494e495449414c495a454400000000000000000000000000610120526101005061010051806101200181600003601f1636823750506308c379a060c052602060e052601f19601f61010051011660440160dcfd5b604051600b5560605180600c556000602082601f010460048111612ec4578015611a2857905b602081026080015181600d0155600101818118611a10575b505050336011556395d89b41610140526060610140600461015c6040515afa611a56573d600060003e3d6000fd5b60403d10612ec4576101405161014001601a815111612ec4578051806101c0526020820180516101e0525050506101c08051806101005260208201805161012052505050600060096101a0527f42616c616e6365722000000000000000000000000000000000000000000000006101c0526101a080516020820183610240018151815250508083019250505061010051816102400161012051815250808201915050600e6101e0527f204761756765204465706f736974000000000000000000000000000000000000610200526101e080516020820183610240018151815250508083019250505080610220526102209050805180610140526020820181610160838360045afa90509050505061014051806003556000602082601f010460028111612ec4578015611b9d57905b6020810261016001518160040155600101818118611b84575b50505060006101005181610200016101205181525080820191505060066101a0527f2d676175676500000000000000000000000000000000000000000000000000006101c0526101a0805160208201836102000181518152505080830192505050806101e0526101e0905080518060065560208201805160075550505042601560006020526000526040600020557f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6103c05261014051610160206103e052600c5480610300526000602082601f010460048111612ec4578015611c9657905b80600d0154602082026103200152600101818118611c7d575b505050610300805160208201209050610400524661042052306104405260a06103a0526103a0805160208201209050600155005b633644e5158118611ce15760015460405260206040f35b637ecebe008118611d14576004358060a01c612ec457604052600260405160205260005260406000205460605260206060f35b6306fdde038118611d915760208060405280604001600354808252602082016000602083601f010460028111612ec4578015611d6357905b806004015460208202840152600101818118611d4c575b50505050805180602083010181600003601f163682375050601f19601f825160200101169050810190506040f35b6395d89b418118611de157602080604052806040016006548082526020820160075481525050805180602083010181600003601f163682375050601f19601f825160200101169050810190506040f35b6370a082318118611e14576004358060a01c612ec457604052600960405160205260005260406000205460605260206060f35b6318160ddd8118611e2b57600a5460405260206040f35b6382c630668118611e4257600b5460405260206040f35b6354fd4d508118611ebf5760208060405280604001600c54808252602082016000602083601f010460048111612ec4578015611e9157905b80600d015460208202840152600101818118611e7a575b50505050805180602083010181600003601f163682375050601f19601f825160200101169050810190506040f35b63c45a01558118611ed65760115460405260206040f35b6313ecb1ca8118611f09576004358060a01c612ec457604052601260405160205260005260406000205460605260206060f35b6317e280898118611f205760135460405260206040f35b63ef78d4fd8118611f375760145460405260206040f35b637598108c8118611f5c57601560043560205260005260406000205460405260206040f35b639bd324f28118611f8f576004358060a01c612ec457604052601660405160205260005260406000205460605260206060f35b63094007078118611fc2576004358060a01c612ec457604052601760405160205260005260406000205460605260206060f35b63fec8ee0c8118611fe757601860043560205260005260406000205460405260206040f35b63de263bfa811861201a576004358060a01c612ec457604052601960405160205260005260406000205460605260206060f35b63963c94b9811861203157601a5460405260206040f35b6354c49fe98118612055576004356008811015612ec457601b015460405260206040f35b6348e9c65e81186120aa576004358060a01c612ec4576040526023604051602052600052604060002080546060526001810154608052600281015460a052600381015460c052600481015460e0525060a06060f35b6301ddabf181186120dd576004358060a01c612ec457604052602460405160205260005260406000205460605260206060f35b63f05cc058811861212f576004358060a01c612ec4576040526024358060a01c612ec4576060526025604051602052600052604060002080606051602052600052604060002090505460805260206080f35b639c868ac081186121465760275460405260206040f35b63fadd59ab811861216b57602860043560205260005260406000205460405260206040f35b505b60006000fd5b6014546060526015606051602052600052604060002054608052601860605160205260005260406000205460a05260805142116121b15760006121b6565b602754155b156123085760135460c05260805160e05260805162093a808181830110612ec4578082019050905062093a808082049050905062093a80808202821582848304141715612ec457905090504280828118828410021890509050610100526000610100905b80610120526101005160e051808210612ec4578082039050905061014052600060c051146122ba5760a051602860e05162093a8080820490509050602052600052604060002054670de0b6b3a7640000808202821582848304141715612ec4579050905061014051808202821582848304141715612ec4579050905060c051808015612ec4578204905090508181830110612ec4578082019050905060a0525b4261010051186122c957612305565b6101005160e0526101005162093a808181830110612ec4578082019050905042808281188284100218905090506101005260010181811861221a575b50505b6370a0823160e0523061010052602060e0602460fc6020612ec96000396000515afa612339573d600060003e3d6000fd5b60203d10612ec45760e05160c052600060c05114612435574262093a808082049050905060e052602860e0516020526000526040600020805460c05160e05160018181830110612ec4578082019050905062093a80808202821582848304141715612ec4579050905042808210612ec45780820390509050808015612ec4578204905090508181830110612ec4578082019050905081555063a9059cbb610100526020612ee96000396000516101205260c051610140526020610100604461011c60006020612ec96000396000515af1612418573d600060003e3d6000fd5b60203d10612ec457610100518060011c612ec45761016052610160505b60605160018181830110612ec4578082019050905060605260605160145542601560605160205260005260406000205560a0516018606051602052600052604060002055601260405160205260005260406000205460e05260176040516020526000526040600020805460e05160a0516019604051602052600052604060002054808210612ec45780820390509050808202821582848304141715612ec45790509050670de0b6b3a7640000808204905090508181830110612ec4578082019050905081555060a0516019604051602052600052604060002055426016604051602052600052604060002055565b6060516028808202821582848304141715612ec4579050905060648082049050905060a0526020612f0960003960005160c052600060c05114612655576318160ddd610100526020610100600461011c60c0515afa612587573d600060003e3d6000fd5b60203d10612ec4576101005160e052600060e0511461265557632579841861012052604051610140526020610120602461013c60c0515afa6125ce573d600060003e3d6000fd5b60203d10612ec457610120516101005260a05160805161010051808202821582848304141715612ec4579050905060e051808015612ec457820490509050603c808202821582848304141715612ec457905090506064808204905090508181830110612ec4578082019050905060a05260605160a0518082811882841002189050905060a0525b601260405160205260005260406000205460e05260a051601260405160205260005260406000205560135460a0518181830110612ec4578082019050905060e051808210612ec4578082039050905061010052610100516013556040517f7ecd84343f76a23d2227290e0288da3251b045541698e575a5515af4f04197a3606051610120526080516101405260a0516101605261010051610180526080610120a2565b600060405260006008905b8061016052601a54610160511061271957612743565b60405160078111612ec4576001810160405261016051602082026060015250600101818118612703575b50506040518082526020810260208301818183606060045afa90509050505050565b6000610320526101e05161034052600061018051146127d557600961018051602052600052604060002054610320526101c0516127a35760006127a9565b6101e051155b156127d55760246101805160205260005260406000205461034052610340516127d55761018051610340525b601a5461036052600061038052610200511561280d5761020051806103805260208102806103a08261022060045afa9050505061283d565b6128186104a06126f8565b6104a0805180610380526020820160208202806103a0828460045afa90509050905050505b60006103805160088111612ec4578015612ce357905b602081026103a001516104a052610360516104a051106128d35760146104c0527f494e56414c49445f5245574152445f494e4445580000000000000000000000006104e0526104c0506104c051806104e00181600003601f1636823750506308c379a06104805260206104a052601f19601f6104c051011660440161049cfd5b6104a0516008811015612ec457601b01546104c05260236104c0516020526000526040600020600481019050546104e0524260236104c05160205260005260406000206001810190505480828118828410021890509050610500526105005160236104c051602052600052604060002060038101905054808210612ec457808203905090506105205260006105205114612a21576105005160236104c05160205260005260406000206003810190505560006101a05114612a21576104e0516105205160236104c051602052600052604060002060028101905054808202821582848304141715612ec45790509050670de0b6b3a7640000808202821582848304141715612ec457905090506101a051808015612ec4578204905090508181830110612ec457808201905090506104e0526104e05160236104c0516020526000526040600020600481019050555b60006101805114612cd85760256104c051602052600052604060002080610180516020526000526040600020905054610540526000610560526104e051610540511015612ad3576104e05160256104c051602052600052604060002080610180516020526000526040600020905055610320516104e05161054051808210612ec45780820390509050808202821582848304141715612ec45790509050670de0b6b3a764000080820490509050610560525b6026610180516020526000526040600020806104c0516020526000526040600020905054610580526105805160801c610560518181830110612ec457808201905090506105a05260006105a0511115612cd85761058051700100000000000000000000000000000000808206905090506105c0526101c051612b9f576000610560511115612cd8576105c0516105a05160801b8181830110612ec457808201905090506026610180516020526000526040600020806104c0516020526000526040600020905055612cd8565b63a9059cbb61062452600461034051610644526105a05161066452604001610620526106205060206106c06106205161064060006104c0515af1612be8573d600060003e3d6000fd5b6106a060203d808211612bfb5781612bfd565b805b9050905081528051806105e0526020820180516106005250505060006105e05114612c9b57610600516105e0516020036008021c612c9b576010610620527f5452414e534645525f4641494c55524500000000000000000000000000000000610640526106205061062051806106400181600003601f1636823750506308c379a06105e052602061060052601f19601f6106205101166044016105fcfd5b6105c0516105a0518181830110612ec457808201905090506026610180516020526000526040600020806104c05160205260005260406000209050555b600101818118612853575b5050565b61072051612cf457612e5e565b600a54610740526000601a541415610760526106e0516107a052610700516107c05260006002905b602081026107a001516107805261078051604052612d38612173565b6107805161018052610740516101a05260006101c05260006101e052600061020052612d62612765565b600101818118612d1c57505060096106e05160205260005260406000205461072051808210612ec45780820390509050610780526107805160096106e0516020526000526040600020556106e0516040526107805160605261074051608052612dc9612523565b600961070051602052600052604060002054610720518181830110612ec457808201905090506107805261078051600961070051602052600052604060002055610700516040526107805160605261074051608052612e26612523565b610700516106e0517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610720516107a05260206107a0a35b565b6020612f2960003960005160605118612e9c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815250612ec2565b600860405160205260005260406000208060605160205260005260406000209050548152505b565b600080fd", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/artifact/ChildChainGaugeFactory.json b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/artifact/ChildChainGaugeFactory.json new file mode 100644 index 0000000..b70ed8d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/artifact/ChildChainGaugeFactory.json @@ -0,0 +1,122 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ChildChainGaugeFactory", + "sourceName": "contracts/gauges/ChildChainGaugeFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IChildChainGauge", + "name": "gaugeImplementation", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "productVersion", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "GaugeCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProductVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "isGaugeFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60806040523480156200001157600080fd5b50604051620009b9380380620009b98339810160408190526200003491620002aa565b8282620000418162000174565b50600180546001600160a01b0319166001600160a01b0392909216919091179055604051620000759082906020016200036e565b60405160208183030381529060405280519060200120836001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160006040518083038186803b158015620000c557600080fd5b505afa158015620000da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000104919081019062000330565b6040516020016200011691906200036e565b6040516020818303038152906040528051906020012014620001555760405162461bcd60e51b81526004016200014c906200038c565b60405180910390fd5b80516200016a9060039060208401906200018d565b50505050620003e9565b8051620001899060009060208401906200018d565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001d057805160ff191683800117855562000200565b8280016001018555821562000200579182015b8281111562000200578251825591602001919060010190620001e3565b506200020e92915062000212565b5090565b5b808211156200020e576000815560010162000213565b600082601f8301126200023a578081fd5b81516001600160401b038082111562000251578283fd5b604051601f8301601f19168101602001828111828210171562000272578485fd5b6040528281529250828483016020018610156200028e57600080fd5b620002a1836020830160208801620003b6565b50505092915050565b600080600060608486031215620002bf578283fd5b83516001600160a01b0381168114620002d6578384fd5b60208501519093506001600160401b0380821115620002f3578384fd5b620003018783880162000229565b9350604086015191508082111562000317578283fd5b50620003268682870162000229565b9150509250925092565b60006020828403121562000342578081fd5b81516001600160401b0381111562000358578182fd5b620003668482850162000229565b949350505050565b6000825162000382818460208701620003b6565b9190910192915050565b60208082526010908201526f0ac8aa4a6929e9cbe9a92a69a82a886960831b604082015260600190565b60005b83811015620003d3578181015183820152602001620003b9565b83811115620003e3576000848401525b50505050565b6105c080620003f96000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c806354fd4d501161005057806354fd4d501461009f5780639ed93318146100a7578063ce3cc8bd146100ba57610067565b806318d6186f1461006c57806339312dee1461008a575b600080fd5b6100746100da565b6040516100819190610540565b60405180910390f35b61009261018e565b60405161008191906104dd565b6100746101aa565b6100926100b5366004610439565b610229565b6100cd6100c8366004610439565b6102b3565b6040516100819190610535565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156101845780601f1061015957610100808354040283529160200191610184565b820191906000526020600020905b81548152906001019060200180831161016757829003601f168201915b5050505050905090565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156101845780601f1061015957610100808354040283529160200191610184565b6000806102346102de565b90508073ffffffffffffffffffffffffffffffffffffffff1663f399e22e8461025b6100da565b6040518363ffffffff1660e01b81526004016102789291906104fe565b600060405180830381600087803b15801561029257600080fd5b505af11580156102a6573d6000803e3d6000fd5b509293505050505b919050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205460ff1690565b60015460009081906103059073ffffffffffffffffffffffffffffffffffffffff16610383565b73ffffffffffffffffffffffffffffffffffffffff811660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff81166102ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043090610553565b60405180910390fd5b60006020828403121561044a578081fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461046d578182fd5b9392505050565b60008151808452815b818110156104995760208185018101518683018201520161047d565b818111156104aa5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff841682526040602083015261052d6040830184610474565b949350505050565b901515815260200190565b60006020825261046d6020830184610474565b60208082526016908201527f455243313136373a20637265617465206661696c65640000000000000000000060408201526060019056fea2646970667358221220de88abf80cf4ef8f042feb2edec2b1707b7d1780091c6586a40f7e9b40f7187d64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c806354fd4d501161005057806354fd4d501461009f5780639ed93318146100a7578063ce3cc8bd146100ba57610067565b806318d6186f1461006c57806339312dee1461008a575b600080fd5b6100746100da565b6040516100819190610540565b60405180910390f35b61009261018e565b60405161008191906104dd565b6100746101aa565b6100926100b5366004610439565b610229565b6100cd6100c8366004610439565b6102b3565b6040516100819190610535565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156101845780601f1061015957610100808354040283529160200191610184565b820191906000526020600020905b81548152906001019060200180831161016757829003601f168201915b5050505050905090565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156101845780601f1061015957610100808354040283529160200191610184565b6000806102346102de565b90508073ffffffffffffffffffffffffffffffffffffffff1663f399e22e8461025b6100da565b6040518363ffffffff1660e01b81526004016102789291906104fe565b600060405180830381600087803b15801561029257600080fd5b505af11580156102a6573d6000803e3d6000fd5b509293505050505b919050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205460ff1690565b60015460009081906103059073ffffffffffffffffffffffffffffffffffffffff16610383565b73ffffffffffffffffffffffffffffffffffffffff811660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff81166102ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043090610553565b60405180910390fd5b60006020828403121561044a578081fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461046d578182fd5b9392505050565b60008151808452815b818110156104995760208185018101518683018201520161047d565b818111156104aa5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff841682526040602083015261052d6040830184610474565b949350505050565b901515815260200190565b60006020825261046d6020830184610474565b60208082526016908201527f455243313136373a20637265617465206661696c65640000000000000000000060408201526060019056fea2646970667358221220de88abf80cf4ef8f042feb2edec2b1707b7d1780091c6586a40f7e9b40f7187d64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/index.ts b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/index.ts new file mode 100644 index 0000000..8395d14 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/index.ts @@ -0,0 +1,24 @@ +import { Task, TaskRunOptions } from '@src'; +import { ChildChainLiquidityGaugeFactoryDeployment } from './input'; + +export type ExtraInputs = { + VotingEscrowDelegationProxy: string; + L2BalancerPseudoMinter: string; +}; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as ChildChainLiquidityGaugeFactoryDeployment; + + const gaugeArgs = [ + input.VotingEscrowDelegationProxy, + input.L2BalancerPseudoMinter, + input.AuthorizerAdaptor, + input.ProductVersion, + ]; + + // ChildChainGauge is written in Vyper, so we only deploy. + const gaugeImplementation = await task.deploy('ChildChainGauge', gaugeArgs, from, force); + + const factoryArgs = [gaugeImplementation.address, input.FactoryVersion, input.ProductVersion]; + await task.deployAndVerify('ChildChainGaugeFactory', factoryArgs, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/input.ts b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/input.ts new file mode 100644 index 0000000..15839f2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/input.ts @@ -0,0 +1,22 @@ +import { Task, TaskMode } from '@src'; + +export type ChildChainLiquidityGaugeFactoryDeployment = { + VotingEscrowDelegationProxy: string; + AuthorizerAdaptor: string; + L2BalancerPseudoMinter: string; + FactoryVersion: string; + ProductVersion: string; +}; + +const VotingEscrowDelegationProxy = new Task('20230316-l2-ve-delegation-proxy', TaskMode.READ_ONLY); +const AuthorizerAdaptor = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY); +const L2BalancerPseudoMinter = new Task('20230316-l2-balancer-pseudo-minter', TaskMode.READ_ONLY); +const BaseVersion = { version: 2, deployment: '20230316-child-chain-gauge-factory-v2' }; + +export default { + VotingEscrowDelegationProxy, + AuthorizerAdaptor, + L2BalancerPseudoMinter, + FactoryVersion: JSON.stringify({ name: 'ChildChainGaugeFactory', ...BaseVersion }), + ProductVersion: JSON.stringify({ name: 'ChildChainGauge', ...BaseVersion }), +}; diff --git a/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/arbitrum.json b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/arbitrum.json new file mode 100644 index 0000000..0f53920 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/arbitrum.json @@ -0,0 +1,4 @@ +{ + "ChildChainGauge": "0xa523f47A933D5020b23629dDf689695AA94612Dc", + "ChildChainGaugeFactory": "0x6817149cb753BF529565B4D023d7507eD2ff4Bc0" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/avalanche.json b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/avalanche.json new file mode 100644 index 0000000..08b6ab8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/avalanche.json @@ -0,0 +1,4 @@ +{ + "ChildChainGauge": "0x4132f7AcC9dB7A6cF7BE2Dd3A9DC8b30C7E6E6c8", + "ChildChainGaugeFactory": "0xf23b4DB826DbA14c0e857029dfF076b1c0264843" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/base.json b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/base.json new file mode 100644 index 0000000..b9c1249 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/base.json @@ -0,0 +1,4 @@ +{ + "ChildChainGauge": "0x9f7E65887413a8497b87bA2058cE6E4Ef4B37013", + "ChildChainGaugeFactory": "0xb1a4FE1C6d25a0DDAb47431A92A723dd71d9021f" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/gnosis.json b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/gnosis.json new file mode 100644 index 0000000..1a84344 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/gnosis.json @@ -0,0 +1,4 @@ +{ + "ChildChainGauge": "0x96484f2aBF5e58b15176dbF1A799627B53F13B6d", + "ChildChainGaugeFactory": "0x83E443EF4f9963C77bd860f94500075556668cb8" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/goerli.json b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/goerli.json new file mode 100644 index 0000000..9c22bde --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/goerli.json @@ -0,0 +1,4 @@ +{ + "ChildChainGauge": "0x6B5dA774890Db7B7b96C6f44e6a4b0F657399E2e", + "ChildChainGaugeFactory": "0x7Ba29fE8E83dd6097A7298075C4AFfdBda3121cC" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/mode.json b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/mode.json new file mode 100644 index 0000000..0d59096 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/mode.json @@ -0,0 +1,4 @@ +{ + "ChildChainGauge": "0xE3881627B8DeeBCCF9c23B291430a549Fc0bE5F7", + "ChildChainGaugeFactory": "0x4fb47126Fa83A8734991E41B942Ac29A3266C968" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/optimism.json b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/optimism.json new file mode 100644 index 0000000..f483c6b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/optimism.json @@ -0,0 +1,4 @@ +{ + "ChildChainGauge": "0x81cFAE226343B24BA12EC6521Db2C79E7aeeb310", + "ChildChainGaugeFactory": "0xa523f47A933D5020b23629dDf689695AA94612Dc" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/polygon.json b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/polygon.json new file mode 100644 index 0000000..a743135 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/polygon.json @@ -0,0 +1,4 @@ +{ + "ChildChainGauge": "0xc9b36096f5201ea332Db35d6D195774ea0D5988f", + "ChildChainGaugeFactory": "0x22625eEDd92c81a219A83e1dc48f88d54786B017" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/sepolia.json b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/sepolia.json new file mode 100644 index 0000000..a8e5483 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/sepolia.json @@ -0,0 +1,4 @@ +{ + "ChildChainGauge": "0xC49Ca921c4CD1117162eAEEc0ee969649997950c", + "ChildChainGaugeFactory": "0xC370cD86d5488c1788b62f11b09adb0C47F47440" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/zkevm.json b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/zkevm.json new file mode 100644 index 0000000..c78c684 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/output/zkevm.json @@ -0,0 +1,4 @@ +{ + "ChildChainGauge": "0x59562f93c447656F6E4799fC1FC7c3d977C3324F", + "ChildChainGaugeFactory": "0x2498A2B0d6462d2260EAC50aE1C3e03F4829BA95" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/readme.md b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/readme.md new file mode 100644 index 0000000..5f93807 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/readme.md @@ -0,0 +1,18 @@ +# 2023-03-16 - Child Chain Gauge Factory + +Deployment of the `ChildChainGaugeFactory` V2, for liquidity gauges to be used with pools on networks other than Ethereum. +This version simplifies the system to distribute BAL and allows veBAL boosts on L2s and sidechains other than Mainnet. + +## Useful Files + +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`ChildChainGauge` artifact](./artifact/ChildChainGauge.json) +- [`ChildChainGaugeFactory` artifact](./artifact/ChildChainGaugeFactory.json) diff --git a/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/test/contracts/VeBoostV2.vy b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/test/contracts/VeBoostV2.vy new file mode 100644 index 0000000..da000fb --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/test/contracts/VeBoostV2.vy @@ -0,0 +1,397 @@ +# @version 0.3.3 +""" +@title Boost Delegation V2 +@author CurveFi +""" + + +event Approval: + _owner: indexed(address) + _spender: indexed(address) + _value: uint256 + +event Transfer: + _from: indexed(address) + _to: indexed(address) + _value: uint256 + +event Boost: + _from: indexed(address) + _to: indexed(address) + _bias: uint256 + _slope: uint256 + _start: uint256 + +event Migrate: + _token_id: indexed(uint256) + + +interface BoostV1: + def ownerOf(_token_id: uint256) -> address: view + def token_boost(_token_id: uint256) -> int256: view + def token_expiry(_token_id: uint256) -> uint256: view + +interface VotingEscrow: + def balanceOf(_user: address) -> uint256: view + def totalSupply() -> uint256: view + def locked__end(_user: address) -> uint256: view + +interface ERC1271: + def isValidSignature(_hash: bytes32, _signature: Bytes[65]) -> bytes32: view + +struct Point: + bias: uint256 + slope: uint256 + ts: uint256 + + +NAME: constant(String[32]) = "Vote-Escrowed Boost" +SYMBOL: constant(String[8]) = "veBoost" +VERSION: constant(String[8]) = "v2.0.0" + +EIP712_TYPEHASH: constant(bytes32) = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)") +PERMIT_TYPEHASH: constant(bytes32) = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)") + +# keccak256("isValidSignature(bytes32,bytes)")[:4] << 224 +ERC1271_MAGIC_VAL: constant(bytes32) = 0x1626ba7e00000000000000000000000000000000000000000000000000000000 + + +WEEK: constant(uint256) = 86400 * 7 + + +BOOST_V1: immutable(address) +DOMAIN_SEPARATOR: immutable(bytes32) +VE: immutable(address) + + +allowance: public(HashMap[address, HashMap[address, uint256]]) +nonces: public(HashMap[address, uint256]) + +delegated: public(HashMap[address, Point]) +delegated_slope_changes: public(HashMap[address, HashMap[uint256, uint256]]) + +received: public(HashMap[address, Point]) +received_slope_changes: public(HashMap[address, HashMap[uint256, uint256]]) + +migrated: public(HashMap[uint256, bool]) + + +@external +def __init__(_boost_v1: address, _ve: address): + BOOST_V1 = _boost_v1 + DOMAIN_SEPARATOR = keccak256(_abi_encode(EIP712_TYPEHASH, keccak256(NAME), keccak256(VERSION), chain.id, self)) + VE = _ve + + log Transfer(ZERO_ADDRESS, msg.sender, 0) + + +@view +@internal +def _checkpoint_read(_user: address, _delegated: bool) -> Point: + point: Point = empty(Point) + + if _delegated: + point = self.delegated[_user] + else: + point = self.received[_user] + + if point.ts == 0: + point.ts = block.timestamp + + if point.ts == block.timestamp: + return point + + ts: uint256 = (point.ts / WEEK) * WEEK + for _ in range(255): + ts += WEEK + + dslope: uint256 = 0 + if block.timestamp < ts: + ts = block.timestamp + else: + if _delegated: + dslope = self.delegated_slope_changes[_user][ts] + else: + dslope = self.received_slope_changes[_user][ts] + + point.bias -= point.slope * (ts - point.ts) + point.slope -= dslope + point.ts = ts + + if ts == block.timestamp: + break + + return point + + +@internal +def _checkpoint_write(_user: address, _delegated: bool) -> Point: + point: Point = empty(Point) + + if _delegated: + point = self.delegated[_user] + else: + point = self.received[_user] + + if point.ts == 0: + point.ts = block.timestamp + + if point.ts == block.timestamp: + return point + + dbias: uint256 = 0 + ts: uint256 = (point.ts / WEEK) * WEEK + for _ in range(255): + ts += WEEK + + dslope: uint256 = 0 + if block.timestamp < ts: + ts = block.timestamp + else: + if _delegated: + dslope = self.delegated_slope_changes[_user][ts] + else: + dslope = self.received_slope_changes[_user][ts] + + amount: uint256 = point.slope * (ts - point.ts) + + dbias += amount + point.bias -= amount + point.slope -= dslope + point.ts = ts + + if ts == block.timestamp: + break + + if _delegated == False and dbias != 0: # received boost + log Transfer(_user, ZERO_ADDRESS, dbias) + + return point + + +@view +@internal +def _balance_of(_user: address) -> uint256: + amount: uint256 = VotingEscrow(VE).balanceOf(_user) + + point: Point = self._checkpoint_read(_user, True) + amount -= (point.bias - point.slope * (block.timestamp - point.ts)) + + point = self._checkpoint_read(_user, False) + amount += (point.bias - point.slope * (block.timestamp - point.ts)) + return amount + + +@internal +def _boost(_from: address, _to: address, _amount: uint256, _endtime: uint256): + assert _to not in [_from, ZERO_ADDRESS] + assert _amount != 0 + assert _endtime > block.timestamp + assert _endtime % WEEK == 0 + assert _endtime <= VotingEscrow(VE).locked__end(_from) + + # checkpoint delegated point + point: Point = self._checkpoint_write(_from, True) + assert _amount <= VotingEscrow(VE).balanceOf(_from) - (point.bias - point.slope * (block.timestamp - point.ts)) + + # calculate slope and bias being added + slope: uint256 = _amount / (_endtime - block.timestamp) + bias: uint256 = slope * (_endtime - block.timestamp) + + # update delegated point + point.bias += bias + point.slope += slope + + # store updated values + self.delegated[_from] = point + self.delegated_slope_changes[_from][_endtime] += slope + + # update received amount + point = self._checkpoint_write(_to, False) + point.bias += bias + point.slope += slope + + # store updated values + self.received[_to] = point + self.received_slope_changes[_to][_endtime] += slope + + log Transfer(_from, _to, _amount) + log Boost(_from, _to, bias, slope, block.timestamp) + + # also checkpoint received and delegated + self.received[_from] = self._checkpoint_write(_from, False) + self.delegated[_to] = self._checkpoint_write(_to, True) + + +@external +def boost(_to: address, _amount: uint256, _endtime: uint256, _from: address = msg.sender): + # reduce approval if necessary + if _from != msg.sender: + allowance: uint256 = self.allowance[_from][msg.sender] + if allowance != MAX_UINT256: + self.allowance[_from][msg.sender] = allowance - _amount + log Approval(_from, msg.sender, allowance - _amount) + + self._boost(_from, _to, _amount, _endtime) + +@internal +def _migrate(_token_id: uint256): + assert not self.migrated[_token_id] + + self._boost( + convert(shift(_token_id, -96), address), # from + BoostV1(BOOST_V1).ownerOf(_token_id), # to + convert(BoostV1(BOOST_V1).token_boost(_token_id), uint256), # amount + BoostV1(BOOST_V1).token_expiry(_token_id), # expiry + ) + + self.migrated[_token_id] = True + log Migrate(_token_id) + +@external +def migrate(_token_id: uint256): + self._migrate(_token_id) + +@external +def migrate_many(_token_ids: uint256[16]): + for i in range(16): + if _token_ids[i] == 0: + break + self._migrate(_token_ids[i]) + +@external +def checkpoint_user(_user: address): + self.delegated[_user] = self._checkpoint_write(_user, True) + self.received[_user] = self._checkpoint_write(_user, False) + + +@external +def approve(_spender: address, _value: uint256) -> bool: + self.allowance[msg.sender][_spender] = _value + + log Approval(msg.sender, _spender, _value) + return True + + +@external +def permit(_owner: address, _spender: address, _value: uint256, _deadline: uint256, _v: uint8, _r: bytes32, _s: bytes32) -> bool: + assert block.timestamp <= _deadline, 'EXPIRED_SIGNATURE' + + nonce: uint256 = self.nonces[_owner] + digest: bytes32 = keccak256( + concat( + b"\x19\x01", + DOMAIN_SEPARATOR, + keccak256(_abi_encode(PERMIT_TYPEHASH, _owner, _spender, _value, nonce, _deadline)) + ) + ) + + if _owner.is_contract: + sig: Bytes[65] = concat(_abi_encode(_r, _s), slice(convert(_v, bytes32), 31, 1)) + # reentrancy not a concern since this is a staticcall + assert ERC1271(_owner).isValidSignature(digest, sig) == ERC1271_MAGIC_VAL, 'INVALID_SIGNATURE' + else: + assert ecrecover(digest, convert(_v, uint256), convert(_r, uint256), convert(_s, uint256)) == _owner and _owner != ZERO_ADDRESS, 'INVALID_SIGNATURE' + + self.allowance[_owner][_spender] = _value + self.nonces[_owner] = nonce + 1 + + log Approval(_owner, _spender, _value) + return True + + +@external +def increaseAllowance(_spender: address, _added_value: uint256) -> bool: + allowance: uint256 = self.allowance[msg.sender][_spender] + _added_value + self.allowance[msg.sender][_spender] = allowance + + log Approval(msg.sender, _spender, allowance) + return True + + +@external +def decreaseAllowance(_spender: address, _subtracted_value: uint256) -> bool: + allowance: uint256 = self.allowance[msg.sender][_spender] - _subtracted_value + self.allowance[msg.sender][_spender] = allowance + + log Approval(msg.sender, _spender, allowance) + return True + + +@view +@external +def balanceOf(_user: address) -> uint256: + return self._balance_of(_user) + + +@view +@external +def adjusted_balance_of(_user: address) -> uint256: + return self._balance_of(_user) + + +@view +@external +def totalSupply() -> uint256: + return VotingEscrow(VE).totalSupply() + + +@view +@external +def delegated_balance(_user: address) -> uint256: + point: Point = self._checkpoint_read(_user, True) + return point.bias - point.slope * (block.timestamp - point.ts) + + +@view +@external +def received_balance(_user: address) -> uint256: + point: Point = self._checkpoint_read(_user, False) + return point.bias - point.slope * (block.timestamp - point.ts) + + +@view +@external +def delegable_balance(_user: address) -> uint256: + point: Point = self._checkpoint_read(_user, True) + return VotingEscrow(VE).balanceOf(_user) - (point.bias - point.slope * (block.timestamp - point.ts)) + + +@pure +@external +def name() -> String[32]: + return NAME + + +@pure +@external +def symbol() -> String[8]: + return SYMBOL + + +@pure +@external +def decimals() -> uint8: + return 18 + + +@pure +@external +def BOOST_V1() -> address: + return BOOST_V1 + +@pure +@external +def version() -> String[8]: + return VERSION + +@pure +@external +def DOMAIN_SEPARATOR() -> bytes32: + return DOMAIN_SEPARATOR + + +@pure +@external +def VE() -> address: + return VE diff --git a/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/test/test.fork.ts b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/test/test.fork.ts new file mode 100644 index 0000000..9e98df5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-child-chain-gauge-factory-v2/test/test.fork.ts @@ -0,0 +1,432 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, BigNumberish, Contract, ContractReceipt } from 'ethers'; + +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { bn, fp } from '@helpers/numbers'; +import { actionId } from '@helpers/models/misc/actions'; +import * as expectEvent from '@helpers/expectEvent'; + +import { describeForkTest } from '@src'; +import { Task, TaskMode } from '@src'; +import { getForkedNetwork } from '@src'; +import { impersonate } from '@src'; +import { deploy } from '@src'; +import { WEEK, advanceToTimestamp, currentTimestamp, currentWeekTimestamp } from '@helpers/time'; +import { expectTransferEvent } from '@helpers/expectTransfer'; +import { MAX_UINT256, ZERO_ADDRESS } from '@helpers/constants'; + +describeForkTest('ChildChainGaugeFactoryV2', 'arbitrum', 72486400, function () { + let vault: Contract, authorizer: Contract, authorizerAdaptor: Contract; + let gaugeFactory: Contract, pseudoMinter: Contract, veProxy: Contract, gauge: Contract; + let admin: SignerWithAddress, user1: SignerWithAddress, user2: SignerWithAddress, govMultisig: SignerWithAddress; + let whale: SignerWithAddress; + let gateway: SignerWithAddress; + let BPT: Contract, BAL: Contract, USDT: Contract; + + let task: Task; + + const GOV_MULTISIG = '0xaf23dc5983230e9eeaf93280e312e57539d098d0'; + const RDNT_WETH_POOL = '0x32dF62dc3aEd2cD6224193052Ce665DC18165841'; + const BPT_HOLDER_1 = '0x1967654222ec22e37c0b0c2a15583b9581d3095e'; + const BPT_HOLDER_2 = '0x708e5804d0e930fac266d8b3f3e13edba35ac86e'; + const BAL_L2_GATEWAY = '0x09e9222e96e7b4ae2a407b98d48e330053351eee'; + + const USDT_ADDRESS = '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9'; + const USDT_WHALE = '0xf89d7b9c864f589bbf53a82105107622b35eaa40'; + + async function stakeBPT(user1Stake: BigNumber, user2Stake: BigNumber) { + await BPT.connect(user1).approve(gauge.address, user1Stake); + await BPT.connect(user2).approve(gauge.address, user2Stake); + + await gauge.connect(user1)['deposit(uint256)'](user1Stake); + await gauge.connect(user2)['deposit(uint256)'](user2Stake); + } + + async function bridgeBAL(to: string, amount: BigNumberish) { + const bridgeInterface = ['function bridgeMint(address account, uint256 amount) external']; + const BAL = await ethers.getContractAt(bridgeInterface, await pseudoMinter.getBalancerToken()); + await BAL.connect(gateway).bridgeMint(to, amount); + } + + async function checkpointAndAdvanceWeek() { + await gauge.connect(user1).user_checkpoint(user1.address); + await gauge.connect(user2).user_checkpoint(user2.address); + + await advanceToTimestamp((await currentWeekTimestamp()).add(WEEK)); + } + + before('run task', async () => { + task = new Task('20230316-child-chain-gauge-factory-v2', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + gaugeFactory = await task.deployedInstance('ChildChainGaugeFactory'); + }); + + before('setup accounts', async () => { + [, admin] = await ethers.getSigners(); + user1 = await impersonate(BPT_HOLDER_1, fp(100)); + user2 = await impersonate(BPT_HOLDER_2, fp(100)); + govMultisig = await impersonate(GOV_MULTISIG, fp(100)); + whale = await impersonate(USDT_WHALE, fp(1000)); + + // The gateway is actually a contract, but we impersonate it to be able to call `mint` on the BAL token, simulating + // a token bridge. + gateway = await impersonate(BAL_L2_GATEWAY, fp(100)); + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.deployedInstance('Vault'); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + + const authorizerAdaptorTask = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizerAdaptor = await authorizerAdaptorTask.deployedInstance('AuthorizerAdaptor'); + + const pseudoMinterTask = new Task('20230316-l2-balancer-pseudo-minter', TaskMode.READ_ONLY, getForkedNetwork(hre)); + pseudoMinter = await pseudoMinterTask.deployedInstance('L2BalancerPseudoMinter'); + + const veProxyTask = new Task('20230316-l2-ve-delegation-proxy', TaskMode.READ_ONLY, getForkedNetwork(hre)); + veProxy = await veProxyTask.deployedInstance('VotingEscrowDelegationProxy'); + }); + + before('setup tokens', async () => { + BPT = await task.instanceAt('IERC20', RDNT_WETH_POOL); + USDT = await task.instanceAt('IERC20', USDT_ADDRESS); + BAL = await task.instanceAt('IERC20', await pseudoMinter.getBalancerToken()); + }); + + before('grant add / remove child chain gauge factory permissions to admin', async () => { + const govMultisig = await impersonate(GOV_MULTISIG, fp(100)); + + await authorizer.connect(govMultisig).grantRole(await actionId(pseudoMinter, 'addGaugeFactory'), admin.address); + await authorizer.connect(govMultisig).grantRole(await actionId(pseudoMinter, 'removeGaugeFactory'), admin.address); + }); + + describe('create', () => { + it('returns factory version', async () => { + const expectedFactoryVersion = { + name: 'ChildChainGaugeFactory', + version: 2, + deployment: '20230316-child-chain-gauge-factory-v2', + }; + expect(await gaugeFactory.version()).to.equal(JSON.stringify(expectedFactoryVersion)); + }); + + it('adds gauge factory to pseudo minter', async () => { + await pseudoMinter.connect(admin).addGaugeFactory(gaugeFactory.address); + expect(await pseudoMinter.isValidGaugeFactory(gaugeFactory.address)).to.be.true; + }); + + it('create gauge', async () => { + const tx = await gaugeFactory.create(BPT.address); + const event = expectEvent.inReceipt(await tx.wait(), 'GaugeCreated'); + gauge = await task.instanceAt('ChildChainGauge', event.args.gauge); + + expect(await gaugeFactory.isGaugeFromFactory(gauge.address)).to.be.true; + }); + }); + + describe('getters', () => { + it('returns BPT', async () => { + expect(await gauge.lp_token()).to.equal(BPT.address); + }); + + it('returns factory', async () => { + expect(await gauge.factory()).to.equal(gaugeFactory.address); + }); + + it('returns gauge version', async () => { + const expectedGaugeVersion = { + name: 'ChildChainGauge', + version: 2, + deployment: '20230316-child-chain-gauge-factory-v2', + }; + expect(await gauge.version()).to.equal(JSON.stringify(expectedGaugeVersion)); + }); + + it('returns the pseudo minter', async () => { + expect(await gauge.bal_pseudo_minter()).to.be.eq(pseudoMinter.address); + }); + }); + + describe('BAL rewards', () => { + const balPerWeek = fp(2000); + const bptAmount = fp(100); + + function itMintsRewardsForUsers(rewardUser1: BigNumber, rewardUser2: BigNumber) { + describe('reward distribution', () => { + before(async () => { + await checkpointAndAdvanceWeek(); + }); + + it('outputs the claimable tokens', async () => { + const availableTokens1 = await gauge.callStatic.claimable_tokens(user1.address); + const availableTokens2 = await gauge.callStatic.claimable_tokens(user2.address); + expect(availableTokens1).to.be.almostEqual(rewardUser1); + expect(availableTokens2).to.be.almostEqual(rewardUser2); + }); + + it('"mints" BAL rewards for users', async () => { + const receipt1 = await (await pseudoMinter.connect(user1).mint(gauge.address)).wait(); + const receipt2 = await (await pseudoMinter.connect(user2).mint(gauge.address)).wait(); + + const user1Rewards = expectTransferEvent( + receipt1, + { from: pseudoMinter.address, to: user1.address }, + BAL.address + ); + expect(user1Rewards.args.value).to.be.almostEqual(rewardUser1); + + const user2Rewards = expectTransferEvent( + receipt2, + { from: pseudoMinter.address, to: user2.address }, + BAL.address + ); + + expect(user2Rewards.args.value).to.be.almostEqual(rewardUser2); + }); + + it('updates claimable tokens', async () => { + expect(await gauge.callStatic.claimable_tokens(user1.address)).to.be.eq(0); + expect(await gauge.callStatic.claimable_tokens(user2.address)).to.be.eq(0); + }); + }); + } + + context('without boosts', () => { + before('stake BPT to the gauges and bridge BAL rewards', async () => { + await stakeBPT(bptAmount, bptAmount.mul(2)); + await bridgeBAL(gauge.address, balPerWeek); + expect(await BAL.balanceOf(gauge.address)).to.be.eq(balPerWeek); + expect(await BAL.balanceOf(pseudoMinter.address)).to.be.eq(0); + }); + + it('checkpoints the gauge and moves the rewards to the pseudo minter', async () => { + await gauge.user_checkpoint(user1.address); + await gauge.user_checkpoint(user2.address); + + expect(await BAL.balanceOf(gauge.address)).to.be.eq(0); + expect(await BAL.balanceOf(pseudoMinter.address)).to.be.eq(balPerWeek); + }); + + // User 2 has double the stake, so 1/3 of the rewards go to User 1, and 2/3 go to User 2. + itMintsRewardsForUsers(balPerWeek.div(3), balPerWeek.mul(2).div(3)); + + context('with extra rewards', () => { + const extraReward = balPerWeek.mul(20); + + before('stake BPT to the gauges and bridge BAL rewards', async () => { + await bridgeBAL(gauge.address, extraReward); + }); + + // User 2 has double the stake, so 1/3 of the rewards go to User 1, and 2/3 go to User 2. + // The increased rewards are still distributed proportionally. + itMintsRewardsForUsers(extraReward.div(3), extraReward.mul(2).div(3)); + }); + }); + + context('with boosts', () => { + let mockVE: Contract, veBoost: Contract; + const boost = fp(100); + + // MockVE balances represent veBAL balances bridged to the L2. + async function setupBoosts(user1Boost: BigNumber, user2Boost: BigNumber) { + await mockVE.mint(user1.address, user1Boost); + await mockVE.mint(user2.address, user2Boost); + } + + before('update VE implementation in the proxy', async () => { + await authorizer.connect(govMultisig).grantRole(await actionId(veProxy, 'setDelegation'), admin.address); + + // In practice, the contract that provides veBAL balances is a third party contract (e.g. Layer Zero). + mockVE = await deploy('MockVE'); + veBoost = await deploy('VeBoostV2', [ZERO_ADDRESS, mockVE.address]); + + await bridgeBAL(gauge.address, balPerWeek); + await setupBoosts(boost.mul(2), boost); + }); + + it('sets delegation', async () => { + const tx = await veProxy.connect(admin).setDelegation(veBoost.address); + expectEvent.inReceipt(await tx.wait(), 'DelegationImplementationUpdated', { + newImplementation: veBoost.address, + }); + }); + + context('without delegations', () => { + before('status checks', async () => { + const user1Stake = await gauge.balanceOf(user1.address); + const user2Stake = await gauge.balanceOf(user2.address); + + const user1Boost = await veProxy.adjustedBalanceOf(user1.address); + const user2Boost = await veProxy.adjustedBalanceOf(user2.address); + + // User 1 has half the stake and twice the boost as user 1. + expect(user1Stake).to.be.eq(bptAmount); + expect(user2Stake).to.be.eq(user1Stake.mul(2)); + expect(user1Boost).to.be.eq(boost.mul(2)); + expect(user2Boost).to.be.eq(user1Boost.div(2)); + + // Base boost and stake are equal in nominal terms. + expect(boost).to.be.eq(bptAmount); + }); + + // See unit test for reference: 'two users, unequal BPT stake and unequal boost'. + itMintsRewardsForUsers(balPerWeek.mul(5).div(12), balPerWeek.mul(7).div(12)); + }); + + context('with delegations', () => { + const boostFn = 'boost(address,uint256,uint256)'; + + before('delegate boosts', async () => { + await bridgeBAL(gauge.address, balPerWeek); + + await mockVE.setLockedEnd(user1.address, MAX_UINT256); + await mockVE.setLockedEnd(user2.address, MAX_UINT256); + + const endTime = (await currentWeekTimestamp()).add(WEEK); + await veBoost.connect(user1)[boostFn](user2.address, boost, endTime); + }); + + before('status checks', async () => { + const user1Stake = await gauge.balanceOf(user1.address); + const user2Stake = await gauge.balanceOf(user2.address); + + const user1Boost = await veProxy.adjustedBalanceOf(user1.address); + const user2Boost = await veProxy.adjustedBalanceOf(user2.address); + + // User 2 has twice the stake and twice the boost as user 1. + expect(user1Stake).to.be.eq(bptAmount); + expect(user2Stake).to.be.eq(user1Stake.mul(2)); + expect(user1Boost).to.be.almostEqual(boost); // Using almostEqual because of VeBoostV2 inner accounting. + expect(user2Boost).to.be.almostEqual(user1Boost.mul(2)); + + // Base boost and stake are equal in nominal terms. + expect(boost).to.be.eq(bptAmount); + }); + + // See unit test for reference: 'two users, unequal BPT stake and unequal boost'. + itMintsRewardsForUsers(balPerWeek.div(3), balPerWeek.mul(2).div(3)); + + context('after delegation expires', () => { + before('bridge BAL and check status', async () => { + await bridgeBAL(gauge.address, balPerWeek); + + const user1Boost = await veProxy.adjustedBalanceOf(user1.address); + const user2Boost = await veProxy.adjustedBalanceOf(user2.address); + + // One week has passed after the last test, which means the delegation has ended. + // Therefore, we go back to the original case without delegations. + expect(user1Boost).to.be.eq(boost.mul(2)); + expect(user2Boost).to.be.eq(user1Boost.div(2)); + + // Base boost and stake are equal in nominal terms. + expect(boost).to.be.eq(bptAmount); + }); + + // Same case as 'without delegations' again. + itMintsRewardsForUsers(balPerWeek.mul(5).div(12), balPerWeek.mul(7).div(12)); + }); + + context('when veBAL lock expired before delegating boost', () => { + before(async () => { + await mockVE.setLockedEnd(user1.address, (await currentTimestamp()).sub(1)); + }); + + it('reverts', async () => { + const endTime = (await currentWeekTimestamp()).add(WEEK); + await expect(veBoost.connect(user1)[boostFn](user2.address, boost, endTime)).to.be.reverted; + }); + }); + + context('after killing delegation implementation', () => { + before(async () => { + await authorizer.connect(govMultisig).grantRole(await actionId(veProxy, 'killDelegation'), admin.address); + await veProxy.connect(admin).killDelegation(); + await bridgeBAL(gauge.address, balPerWeek); + }); + + // Same case as 'without boosts' again. + itMintsRewardsForUsers(balPerWeek.div(3), balPerWeek.mul(2).div(3)); + }); + }); + }); + }); + + describe('other rewards', () => { + const rewardAmount = fp(1e6).div(bn(1e12)); // Scaling factor is 1e12 since USDT has 6 decimals. + let reward: Contract; + let distributor: SignerWithAddress; + let claimer: SignerWithAddress, other: SignerWithAddress; + + function itTransfersRewardsToClaimer() { + let expectedReward: BigNumber; + let receipt: ContractReceipt; + let claimedBeforeOther: BigNumber; + let claimableBeforeOther: BigNumber; + + before('estimate expected reward', async () => { + // Claimer rewards are proportional to their BPT stake in the gauge given that staking time is constant for all + // users. + const claimerStake = await gauge.balanceOf(claimer.address); + const gaugeTotalSupply = await gauge.totalSupply(); + expectedReward = rewardAmount.mul(claimerStake).div(gaugeTotalSupply); + + claimedBeforeOther = await gauge.claimed_reward(other.address, reward.address); + claimableBeforeOther = await gauge.claimable_reward(other.address, reward.address); + + receipt = await ( + await gauge.connect(claimer)['claim_rewards(address,address)'](claimer.address, ZERO_ADDRESS) + ).wait(); + }); + + it('transfers rewards to claimer', async () => { + const event = expectTransferEvent(receipt, { from: gauge.address, to: claimer.address }, reward.address); + expect(event.args.value).to.be.almostEqual(expectedReward); + }); + + it('updates claimed balance for claimer', async () => { + const claimedAfterClaimer = await gauge.claimed_reward(claimer.address, reward.address); + expect(claimedAfterClaimer).to.be.almostEqual(expectedReward); + }); + + it('keeps the same claimed balances for others', async () => { + const claimedAfterOther = await gauge.claimed_reward(other.address, reward.address); + expect(claimedAfterOther).to.be.eq(claimedBeforeOther); + }); + + it('updates claimable balance for claimer', async () => { + const claimableAfterClaimer = await gauge.claimable_reward(claimer.address, reward.address); + expect(claimableAfterClaimer).to.be.eq(0); + }); + + it('keeps the same claimable balances for others', async () => { + const claimableAfterOther = await gauge.claimable_reward(other.address, reward.address); + expect(claimableAfterOther).to.be.deep.eq(claimableBeforeOther); + }); + } + + before(async () => { + reward = USDT; + distributor = whale; + claimer = user1; + other = user2; + await authorizer + .connect(govMultisig) + .grantRole(await actionId(authorizerAdaptor, 'add_reward', gauge.interface), admin.address); + + authorizerAdaptor + .connect(admin) + .performAction( + gauge.address, + gauge.interface.encodeFunctionData('add_reward', [reward.address, distributor.address]) + ); + + await reward.connect(distributor).approve(gauge.address, rewardAmount); + await gauge.connect(distributor).deposit_reward_token(reward.address, rewardAmount); + await advanceToTimestamp((await currentTimestamp()).add(WEEK)); + }); + + itTransfersRewardsToClaimer(); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/artifact/L2BalancerPseudoMinter.json b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/artifact/L2BalancerPseudoMinter.json new file mode 100644 index 0000000..cdc5601 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/artifact/L2BalancerPseudoMinter.json @@ -0,0 +1,501 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "L2BalancerPseudoMinter", + "sourceName": "contracts/L2BalancerPseudoMinter.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "balancerToken", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract ILiquidityGaugeFactory", + "name": "factory", + "type": "address" + } + ], + "name": "GaugeFactoryAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract ILiquidityGaugeFactory", + "name": "factory", + "type": "address" + } + ], + "name": "GaugeFactoryRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "gauge", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "minted", + "type": "uint256" + } + ], + "name": "Minted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approval", + "type": "bool" + } + ], + "name": "MinterApprovalSet", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "contract ILiquidityGaugeFactory", + "name": "factory", + "type": "address" + } + ], + "name": "addGaugeFactory", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "allowed_to_mint_for", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBalancerToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "getMinterApproval", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getNextNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ILiquidityGaugeFactory", + "name": "factory", + "type": "address" + } + ], + "name": "isValidGaugeFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "mintFor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "gauges", + "type": "address[]" + } + ], + "name": "mintMany", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "gauges", + "type": "address[]" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "mintManyFor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "mint_for", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[8]", + "name": "gauges", + "type": "address[8]" + } + ], + "name": "mint_many", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "minted", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ILiquidityGaugeFactory", + "name": "factory", + "type": "address" + } + ], + "name": "removeGaugeFactory", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "internalType": "bool", + "name": "approval", + "type": "bool" + } + ], + "name": "setMinterApproval", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "internalType": "bool", + "name": "approval", + "type": "bool" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "setMinterApprovalWithSignature", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + } + ], + "name": "toggle_approve_mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x61014060405234801561001157600080fd5b5060405161186a38038061186a8339818101604052604081101561003457600080fd5b508051602091820151604080518082018252601681527f42616c616e6365722050736575646f204d696e7465720000000000000000000081860190815282518084019093526001808452603160f81b968401968752600055905190206080525190922060a0527f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c0526001600160601b0319606092831b811660e0523061010052911b166101205260805160a05160c05160e05160601c610100516101205160601c61173e61012c600039806109eb525080610953525080610b19525080610e25525080610e67525080610e46525061173e6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c8063851c1bb3116100d8578063a51e19041161008c578063c654279411610066578063c6542794146104c1578063dd289d6014610512578063ed24911d1461053857610177565b8063a51e190414610494578063aaabadc5146104b1578063c0039699146104b957610177565b80638d928af8116100bd5780638d928af81461044a57806390193b7c1461046e578063a0990033146102fb57610177565b8063851c1bb3146103dd5780638b752bb01461041c57610177565b80633c543bc61161012f5780636c71e920116101145780636c71e920146103635780637504a15d146103895780637a60e63a146103b757610177565b80633c543bc6146102fb5780636a6278421461033d57610177565b806338f121521161016057806338f12152146101da578063397ada21146102005780633b9f73841461028257610177565b80630de54ba01461017c57806327f18ae3146101ac575b600080fd5b6101aa6004803603604081101561019257600080fd5b506001600160a01b0381351690602001351515610540565b005b6101aa600480360360408110156101c257600080fd5b506001600160a01b038135811691602001351661054f565b6101aa600480360360208110156101f057600080fd5b50356001600160a01b0316610597565b6102706004803603602081101561021657600080fd5b81019060208101813564010000000081111561023157600080fd5b82018360208201111561024357600080fd5b8035906020019184602083028401116401000000008311171561026557600080fd5b509092509050610691565b60408051918252519081900360200190f35b6102706004803603604081101561029857600080fd5b8101906020810181356401000000008111156102b357600080fd5b8201836020820111156102c557600080fd5b803590602001918460208302840111640100000000831117156102e757600080fd5b9193509150356001600160a01b03166106b6565b6103296004803603604081101561031157600080fd5b506001600160a01b0381358116916020013516610758565b604080519115158252519081900360200190f35b6102706004803603602081101561035357600080fd5b50356001600160a01b0316610786565b6103296004803603602081101561037957600080fd5b50356001600160a01b03166107a9565b6102706004803603604081101561039f57600080fd5b506001600160a01b03813581169160200135166107c7565b6101aa600480360360208110156103cd57600080fd5b50356001600160a01b0316610857565b610270600480360360208110156103f357600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661094d565b6102706004803603604081101561043257600080fd5b506001600160a01b03813581169160200135166109be565b6104526109e9565b604080516001600160a01b039092168252519081900360200190f35b6102706004803603602081101561048457600080fd5b50356001600160a01b0316610a0d565b6101aa60048036036101008110156104ab57600080fd5b50610a28565b610452610aa4565b610452610b17565b6101aa600480360360e08110156104d757600080fd5b506001600160a01b03813581169160208101351515916040820135169060608101359060ff6080820135169060a08101359060c00135610b3b565b6101aa6004803603602081101561052857600080fd5b50356001600160a01b0316610be0565b610270610c13565b61054b823383610c22565b5050565b610557610cb1565b3360009081526003602090815260408083206001600160a01b038516845290915290205460ff161561058f5761058d8282610cca565b505b61054b610ce2565b61059f610ce9565b6001600160a01b03811660009081526004602052604090205460ff161561062757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f464143544f52595f414c52454144595f41444445440000000000000000000000604482015290519081900360640190fd5b6001600160a01b03811660008181526004602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f8e2924dc08a7879532dca0c2c0460bd67eb431ab342df45afd2c4f7288aab9b79190a250565b600061069b610cb1565b6106a6838333610d2f565b90506106b0610ce2565b92915050565b60006106c0610cb1565b3360009081526003602090815260408083206001600160a01b038616845290915290205460ff1661073c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806116e66023913960400191505060405180910390fd5b610747848484610d2f565b9050610751610ce2565b9392505050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b6000610790610cb1565b61079a8233610cca565b90506107a4610ce2565b919050565b6001600160a01b031660009081526004602052604090205460ff1690565b60006107d1610cb1565b3360009081526003602090815260408083206001600160a01b038616845290915290205460ff1661084d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806116e66023913960400191505060405180910390fd5b6106a68383610cca565b61085f610ce9565b6001600160a01b03811660009081526004602052604090205460ff166108e657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f464143544f52595f4e4f545f4144444544000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03811660008181526004602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517fdc66290a40b716cd9557c1d6c84315e06de88697ee252b89e1a9a9b053dc307b9190a250565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526001602052604090205490565b610a30610cb1565b60005b6008811015610a98576000828260088110610a4a57fe5b60200201356001600160a01b03166001600160a01b03161415610a6c57610a98565b610a8f828260088110610a7b57fe5b60200201356001600160a01b031633610cca565b50600101610a33565b50610aa1610ce2565b50565b6000610aae6109e9565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015610ae657600080fd5b505afa158015610afa573d6000803e3d6000fd5b505050506040513d6020811015610b1057600080fd5b5051905090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007fc87351a089bbdc3b2b9299d2ce29f08fd982826b275b3642939a2f7fdd8153808888610b6989610a0d565b604080516020808201969096526001600160a01b03909416848201529115156060840152608083015260a08083018990528151808403909101815260c0909201905280519101209050610bcb8682610bc2878787610d88565b886101f8610dc7565b610bd6888789610c22565b5050505050505050565b6001600160a01b0381166000908152600360209081526040808320338452909152902054610aa190829060ff1615610540565b6000610c1d610e21565b905090565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155825190815291519293927fa3ffb51320bbca4e61e7423e3c97dd7bd7e31b6ea7429eb26ef92780e84572a09281900390910190a3505050565b610cc360026000541415610190610edf565b6002600055565b6000610cd68383610eed565b90506106b082826111f1565b6001600055565b6000610d186000357fffffffff000000000000000000000000000000000000000000000000000000001661094d565b9050610aa1610d278233611214565b610191610edf565b600082815b81811015610d7557610d6b610d64878784818110610d4e57fe5b905060200201356001600160a01b031686610eed565b84906112b6565b9250600101610d34565b50610d8083836111f1565b509392505050565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b6000610dd2856112c8565b9050610de8610de287838761132f565b83610edf565b610df7428410156101b8610edf565b5050506001600160a01b039092166000908152600160208190526040909120805490910190555050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e8e61141a565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b031681526020019550505050505060405160208183030381529060405280519060200120905090565b8161054b5761054b8161141e565b6000808390506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2e57600080fd5b505afa158015610f42573d6000803e3d6000fd5b505050506040513d6020811015610f5857600080fd5b50519050610f65816107a9565b610fd057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f494e56414c49445f47415547455f464143544f52590000000000000000000000604482015290519081900360640190fd5b806001600160a01b031663ce3cc8bd866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561101d57600080fd5b505afa158015611031573d6000803e3d6000fd5b505050506040513d602081101561104757600080fd5b50516110b457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f494e56414c49445f474155474500000000000000000000000000000000000000604482015290519081900360640190fd5b816001600160a01b0316634b820093856040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561110357600080fd5b505af1158015611117573d6000803e3d6000fd5b505050506040513d602081101561112d57600080fd5b5050604080517f094007070000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015291516000928516916309400707916024808301926020929190829003018186803b15801561119357600080fd5b505afa1580156111a7573d6000803e3d6000fd5b505050506040513d60208110156111bd57600080fd5b505190506111d56111ce86886109be565b8290611448565b935083156111e8576111e8858783611456565b50505092915050565b801561054b5761054b8282611204610b17565b6001600160a01b031691906114c0565b600061121e610aa4565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040180848152602001836001600160a01b03168152602001826001600160a01b03168152602001935050505060206040518083038186803b15801561128357600080fd5b505afa158015611297573d6000803e3d6000fd5b505050506040513d60208110156112ad57600080fd5b50519392505050565b60008282016107518482101583610edf565b60006112d2610e21565b8260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b600061134182516041146101b9610edf565b60008060006020850151925060408501519150606085015160001a9050600060018783868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156113ba573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381161580159061140e5750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b4690565b610aa1817f42414c0000000000000000000000000000000000000000000000000000000000611545565b6000610751838360016115c0565b6001600160a01b0380841660008181526002602090815260408083209487168084529482529182902085905581519384528301849052805191927f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0929081900390910190a2505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526115409084906115d6565b505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60006115cf8484111583610edf565b5050900390565b60006060836001600160a01b0316836040518082805190602001908083835b6020831061163257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016115f5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611694576040519150601f19603f3d011682016040523d82523d6000602084013e611699565b606091505b509150915060008214156116b1573d6000803e3d6000fd5b6116df8151600014806116d757508180602001905160208110156116d457600080fd5b50515b6101a2610edf565b5050505056fe43616c6c6572206e6f7420616c6c6f77656420746f206d696e7420666f722075736572a2646970667358221220829313c7074c630cd5c81cc3d5a8b29e85b5eb5e1c82b92e22b50b5801643f8064736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c8063851c1bb3116100d8578063a51e19041161008c578063c654279411610066578063c6542794146104c1578063dd289d6014610512578063ed24911d1461053857610177565b8063a51e190414610494578063aaabadc5146104b1578063c0039699146104b957610177565b80638d928af8116100bd5780638d928af81461044a57806390193b7c1461046e578063a0990033146102fb57610177565b8063851c1bb3146103dd5780638b752bb01461041c57610177565b80633c543bc61161012f5780636c71e920116101145780636c71e920146103635780637504a15d146103895780637a60e63a146103b757610177565b80633c543bc6146102fb5780636a6278421461033d57610177565b806338f121521161016057806338f12152146101da578063397ada21146102005780633b9f73841461028257610177565b80630de54ba01461017c57806327f18ae3146101ac575b600080fd5b6101aa6004803603604081101561019257600080fd5b506001600160a01b0381351690602001351515610540565b005b6101aa600480360360408110156101c257600080fd5b506001600160a01b038135811691602001351661054f565b6101aa600480360360208110156101f057600080fd5b50356001600160a01b0316610597565b6102706004803603602081101561021657600080fd5b81019060208101813564010000000081111561023157600080fd5b82018360208201111561024357600080fd5b8035906020019184602083028401116401000000008311171561026557600080fd5b509092509050610691565b60408051918252519081900360200190f35b6102706004803603604081101561029857600080fd5b8101906020810181356401000000008111156102b357600080fd5b8201836020820111156102c557600080fd5b803590602001918460208302840111640100000000831117156102e757600080fd5b9193509150356001600160a01b03166106b6565b6103296004803603604081101561031157600080fd5b506001600160a01b0381358116916020013516610758565b604080519115158252519081900360200190f35b6102706004803603602081101561035357600080fd5b50356001600160a01b0316610786565b6103296004803603602081101561037957600080fd5b50356001600160a01b03166107a9565b6102706004803603604081101561039f57600080fd5b506001600160a01b03813581169160200135166107c7565b6101aa600480360360208110156103cd57600080fd5b50356001600160a01b0316610857565b610270600480360360208110156103f357600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661094d565b6102706004803603604081101561043257600080fd5b506001600160a01b03813581169160200135166109be565b6104526109e9565b604080516001600160a01b039092168252519081900360200190f35b6102706004803603602081101561048457600080fd5b50356001600160a01b0316610a0d565b6101aa60048036036101008110156104ab57600080fd5b50610a28565b610452610aa4565b610452610b17565b6101aa600480360360e08110156104d757600080fd5b506001600160a01b03813581169160208101351515916040820135169060608101359060ff6080820135169060a08101359060c00135610b3b565b6101aa6004803603602081101561052857600080fd5b50356001600160a01b0316610be0565b610270610c13565b61054b823383610c22565b5050565b610557610cb1565b3360009081526003602090815260408083206001600160a01b038516845290915290205460ff161561058f5761058d8282610cca565b505b61054b610ce2565b61059f610ce9565b6001600160a01b03811660009081526004602052604090205460ff161561062757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f464143544f52595f414c52454144595f41444445440000000000000000000000604482015290519081900360640190fd5b6001600160a01b03811660008181526004602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f8e2924dc08a7879532dca0c2c0460bd67eb431ab342df45afd2c4f7288aab9b79190a250565b600061069b610cb1565b6106a6838333610d2f565b90506106b0610ce2565b92915050565b60006106c0610cb1565b3360009081526003602090815260408083206001600160a01b038616845290915290205460ff1661073c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806116e66023913960400191505060405180910390fd5b610747848484610d2f565b9050610751610ce2565b9392505050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b6000610790610cb1565b61079a8233610cca565b90506107a4610ce2565b919050565b6001600160a01b031660009081526004602052604090205460ff1690565b60006107d1610cb1565b3360009081526003602090815260408083206001600160a01b038616845290915290205460ff1661084d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806116e66023913960400191505060405180910390fd5b6106a68383610cca565b61085f610ce9565b6001600160a01b03811660009081526004602052604090205460ff166108e657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f464143544f52595f4e4f545f4144444544000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03811660008181526004602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517fdc66290a40b716cd9557c1d6c84315e06de88697ee252b89e1a9a9b053dc307b9190a250565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526001602052604090205490565b610a30610cb1565b60005b6008811015610a98576000828260088110610a4a57fe5b60200201356001600160a01b03166001600160a01b03161415610a6c57610a98565b610a8f828260088110610a7b57fe5b60200201356001600160a01b031633610cca565b50600101610a33565b50610aa1610ce2565b50565b6000610aae6109e9565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015610ae657600080fd5b505afa158015610afa573d6000803e3d6000fd5b505050506040513d6020811015610b1057600080fd5b5051905090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007fc87351a089bbdc3b2b9299d2ce29f08fd982826b275b3642939a2f7fdd8153808888610b6989610a0d565b604080516020808201969096526001600160a01b03909416848201529115156060840152608083015260a08083018990528151808403909101815260c0909201905280519101209050610bcb8682610bc2878787610d88565b886101f8610dc7565b610bd6888789610c22565b5050505050505050565b6001600160a01b0381166000908152600360209081526040808320338452909152902054610aa190829060ff1615610540565b6000610c1d610e21565b905090565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155825190815291519293927fa3ffb51320bbca4e61e7423e3c97dd7bd7e31b6ea7429eb26ef92780e84572a09281900390910190a3505050565b610cc360026000541415610190610edf565b6002600055565b6000610cd68383610eed565b90506106b082826111f1565b6001600055565b6000610d186000357fffffffff000000000000000000000000000000000000000000000000000000001661094d565b9050610aa1610d278233611214565b610191610edf565b600082815b81811015610d7557610d6b610d64878784818110610d4e57fe5b905060200201356001600160a01b031686610eed565b84906112b6565b9250600101610d34565b50610d8083836111f1565b509392505050565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b6000610dd2856112c8565b9050610de8610de287838761132f565b83610edf565b610df7428410156101b8610edf565b5050506001600160a01b039092166000908152600160208190526040909120805490910190555050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e8e61141a565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b031681526020019550505050505060405160208183030381529060405280519060200120905090565b8161054b5761054b8161141e565b6000808390506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2e57600080fd5b505afa158015610f42573d6000803e3d6000fd5b505050506040513d6020811015610f5857600080fd5b50519050610f65816107a9565b610fd057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f494e56414c49445f47415547455f464143544f52590000000000000000000000604482015290519081900360640190fd5b806001600160a01b031663ce3cc8bd866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561101d57600080fd5b505afa158015611031573d6000803e3d6000fd5b505050506040513d602081101561104757600080fd5b50516110b457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f494e56414c49445f474155474500000000000000000000000000000000000000604482015290519081900360640190fd5b816001600160a01b0316634b820093856040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561110357600080fd5b505af1158015611117573d6000803e3d6000fd5b505050506040513d602081101561112d57600080fd5b5050604080517f094007070000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015291516000928516916309400707916024808301926020929190829003018186803b15801561119357600080fd5b505afa1580156111a7573d6000803e3d6000fd5b505050506040513d60208110156111bd57600080fd5b505190506111d56111ce86886109be565b8290611448565b935083156111e8576111e8858783611456565b50505092915050565b801561054b5761054b8282611204610b17565b6001600160a01b031691906114c0565b600061121e610aa4565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040180848152602001836001600160a01b03168152602001826001600160a01b03168152602001935050505060206040518083038186803b15801561128357600080fd5b505afa158015611297573d6000803e3d6000fd5b505050506040513d60208110156112ad57600080fd5b50519392505050565b60008282016107518482101583610edf565b60006112d2610e21565b8260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b600061134182516041146101b9610edf565b60008060006020850151925060408501519150606085015160001a9050600060018783868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156113ba573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381161580159061140e5750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b4690565b610aa1817f42414c0000000000000000000000000000000000000000000000000000000000611545565b6000610751838360016115c0565b6001600160a01b0380841660008181526002602090815260408083209487168084529482529182902085905581519384528301849052805191927f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0929081900390910190a2505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526115409084906115d6565b505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60006115cf8484111583610edf565b5050900390565b60006060836001600160a01b0316836040518082805190602001908083835b6020831061163257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016115f5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611694576040519150601f19603f3d011682016040523d82523d6000602084013e611699565b606091505b509150915060008214156116b1573d6000803e3d6000fd5b6116df8151600014806116d757508180602001905160208110156116d457600080fd5b50515b6101a2610edf565b5050505056fe43616c6c6572206e6f7420616c6c6f77656420746f206d696e7420666f722075736572a2646970667358221220829313c7074c630cd5c81cc3d5a8b29e85b5eb5e1c82b92e22b50b5801643f8064736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/index.ts b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/index.ts new file mode 100644 index 0000000..387a014 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/index.ts @@ -0,0 +1,8 @@ +import { Task, TaskRunOptions } from '@src'; +import { L2BalancerPseudoMinterDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as L2BalancerPseudoMinterDeployment; + + await task.deployAndVerify('L2BalancerPseudoMinter', [input.Vault, input.BAL], from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/input.ts b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/input.ts new file mode 100644 index 0000000..a5b837f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/input.ts @@ -0,0 +1,14 @@ +import { Task, TaskMode } from '@src'; + +export type L2BalancerPseudoMinterDeployment = { + Vault: string; + BAL: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BAL = new Task('00000000-tokens', TaskMode.READ_ONLY); + +export default { + Vault, + BAL, +}; diff --git a/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/arbitrum.json b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/arbitrum.json new file mode 100644 index 0000000..b158c6b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "L2BalancerPseudoMinter": "0xc3ccacE87f6d3A81724075ADcb5ddd85a8A1bB68" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/avalanche.json b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/avalanche.json new file mode 100644 index 0000000..d57c459 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/avalanche.json @@ -0,0 +1,3 @@ +{ + "L2BalancerPseudoMinter": "0x85a80afee867aDf27B50BdB7b76DA70f1E853062" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/base.json b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/base.json new file mode 100644 index 0000000..a7c511e --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/base.json @@ -0,0 +1,3 @@ +{ + "L2BalancerPseudoMinter": "0x0c5538098EBe88175078972F514C9e101D325D4F" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/gnosis.json b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/gnosis.json new file mode 100644 index 0000000..e2cc99c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "L2BalancerPseudoMinter": "0xA8920455934Da4D853faac1f94Fe7bEf72943eF1" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/goerli.json b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/goerli.json new file mode 100644 index 0000000..33c4105 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/goerli.json @@ -0,0 +1,3 @@ +{ + "L2BalancerPseudoMinter": "0x81cFAE226343B24BA12EC6521Db2C79E7aeeb310" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/mode.json b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/mode.json new file mode 100644 index 0000000..f7e376d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/mode.json @@ -0,0 +1,3 @@ +{ + "L2BalancerPseudoMinter": "0x5cF4928a3205728bd12830E1840F7DB85c62a4B9" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/optimism.json b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/optimism.json new file mode 100644 index 0000000..5e9d1ff --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/optimism.json @@ -0,0 +1,3 @@ +{ + "L2BalancerPseudoMinter": "0x4fb47126Fa83A8734991E41B942Ac29A3266C968" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/polygon.json b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/polygon.json new file mode 100644 index 0000000..ee33c04 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/polygon.json @@ -0,0 +1,3 @@ +{ + "L2BalancerPseudoMinter": "0x47B489bf5836f83ABD928C316F8e39bC0587B020" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/sepolia.json b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/sepolia.json new file mode 100644 index 0000000..7837d85 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "L2BalancerPseudoMinter": "0xb51f7fFc97CeDFb6922e8B9Bbf3eF7575fafD630" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/zkevm.json b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/zkevm.json new file mode 100644 index 0000000..05a1359 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/output/zkevm.json @@ -0,0 +1,3 @@ +{ + "L2BalancerPseudoMinter": "0x475D18169BE8a89357A9ee3Ab00ca386d20fA229" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/readme.md b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/readme.md new file mode 100644 index 0000000..cbe6cbe --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/readme.md @@ -0,0 +1,18 @@ +# 2023-03-16 - L2 Balancer Pseudo Minter + +Deployment of the `L2BalancerPseudoMinter`, which distributes bridged BAL tokens on networks other than Mainnet and keeps track of the rewards that have already been distributed for each user. +It is analogous to the `BalancerMinter` deployed to Mainnet as part of the [Gauge Controller deployment](../20220325-gauge-controller/output/mainnet.json), providing a similar user interface. +The main difference between the two is that the pseudo minter does not actually mint tokens; it just distributes bridged tokens instead. + +## Useful Files + +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`L2BalancerPseudoMinter` artifact](./artifact/L2BalancerPseudoMinter.json) diff --git a/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/test/test.fork.ts b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/test/test.fork.ts new file mode 100644 index 0000000..8dd8d1c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-balancer-pseudo-minter/test/test.fork.ts @@ -0,0 +1,59 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import { fp } from '@helpers/numbers'; +import { actionId } from '@helpers/models/misc/actions'; +import * as expectEvent from '@helpers/expectEvent'; + +import { describeForkTest } from '@src'; +import { Task, TaskMode } from '@src'; +import { getForkedNetwork } from '@src'; +import { impersonate } from '@src'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { ANY_ADDRESS } from '@helpers/constants'; + +describeForkTest('L2BalancerPseudoMinter', 'arbitrum', 70407500, function () { + let vault: Contract, authorizer: Contract; + let pseudoMinter: Contract; + let admin: SignerWithAddress; + + let task: Task; + + const GOV_MULTISIG = '0xaf23dc5983230e9eeaf93280e312e57539d098d0'; + + before('run task', async () => { + task = new Task('20230316-l2-balancer-pseudo-minter', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + pseudoMinter = await task.deployedInstance('L2BalancerPseudoMinter'); + }); + + before('setup accounts', async () => { + [, admin] = await ethers.getSigners(); + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.deployedInstance('Vault'); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + }); + + before('grant register and rename permissions to admin', async () => { + const govMultisig = await impersonate(GOV_MULTISIG, fp(100)); + + await authorizer.connect(govMultisig).grantRole(await actionId(pseudoMinter, 'addGaugeFactory'), admin.address); + await authorizer.connect(govMultisig).grantRole(await actionId(pseudoMinter, 'removeGaugeFactory'), admin.address); + }); + + it('adds a gauge factory', async () => { + const tx = await pseudoMinter.connect(admin).addGaugeFactory(ANY_ADDRESS); + expectEvent.inReceipt(await tx.wait(), 'GaugeFactoryAdded', { factory: ANY_ADDRESS }); + expect(await pseudoMinter.isValidGaugeFactory(ANY_ADDRESS)).to.be.true; + }); + + it('remove a gauge factory', async () => { + const tx = await pseudoMinter.connect(admin).removeGaugeFactory(ANY_ADDRESS); + expectEvent.inReceipt(await tx.wait(), 'GaugeFactoryRemoved', { factory: ANY_ADDRESS }); + expect(await pseudoMinter.isValidGaugeFactory(ANY_ADDRESS)).to.be.false; + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/artifact/NullVotingEscrow.json b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/artifact/NullVotingEscrow.json new file mode 100644 index 0000000..933065e --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/artifact/NullVotingEscrow.json @@ -0,0 +1,194 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "NullVotingEscrow", + "sourceName": "contracts/NullVotingEscrow.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b506102a7806100206000396000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c806370a082311161005057806370a0823114610121578063a9059cbb14610077578063dd62ed3e1461015457610072565b8063095ea7b31461007757806318160ddd146100c457806323b872dd146100de575b600080fd5b6100b06004803603604081101561008d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561018f565b604080519115158252519081900360200190f35b6100cc6101a2565b60408051918252519081900360200190f35b6100b0600480360360608110156100f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356101a7565b6100cc6004803603602081101561013757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166101bb565b6100cc6004803603604081101561016a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166101c1565b600061019c6103e66101c9565b92915050565b600090565b60006101b46103e66101c9565b9392505050565b50600090565b600092915050565b6101f3817f42414c00000000000000000000000000000000000000000000000000000000006101f6565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fdfea264697066735822122083c65c4c8e286be8bc0f02e8cc6f1bd4181557d81d56f6249e834c24007645a564736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100725760003560e01c806370a082311161005057806370a0823114610121578063a9059cbb14610077578063dd62ed3e1461015457610072565b8063095ea7b31461007757806318160ddd146100c457806323b872dd146100de575b600080fd5b6100b06004803603604081101561008d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561018f565b604080519115158252519081900360200190f35b6100cc6101a2565b60408051918252519081900360200190f35b6100b0600480360360608110156100f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356101a7565b6100cc6004803603602081101561013757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166101bb565b6100cc6004803603604081101561016a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166101c1565b600061019c6103e66101c9565b92915050565b600090565b60006101b46103e66101c9565b9392505050565b50600090565b600092915050565b6101f3817f42414c00000000000000000000000000000000000000000000000000000000006101f6565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fdfea264697066735822122083c65c4c8e286be8bc0f02e8cc6f1bd4181557d81d56f6249e834c24007645a564736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/artifact/VotingEscrowDelegationProxy.json b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/artifact/VotingEscrowDelegationProxy.json new file mode 100644 index 0000000..0287143 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/artifact/VotingEscrowDelegationProxy.json @@ -0,0 +1,187 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "VotingEscrowDelegationProxy", + "sourceName": "contracts/VotingEscrowDelegationProxy.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "votingEscrow", + "type": "address" + }, + { + "internalType": "contract IVeDelegation", + "name": "delegation", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "DelegationImplementationUpdated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "adjustedBalanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "adjusted_balance_of", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDelegationImplementation", + "outputs": [ + { + "internalType": "contract IVeDelegation", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVotingEscrow", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "killDelegation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVeDelegation", + "name": "delegation", + "type": "address" + } + ], + "name": "setDelegation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60e060405234801561001057600080fd5b506040516109b93803806109b98339818101604052606081101561003357600080fd5b5080516020820151604090920151306080819052606083811b6001600160601b031990811660a0529085901b1660c052600080546001600160a01b0319166001600160a01b039384161781559093928216929190911690610902906100b79039806101d7528061021b52806105f85250806104285250806103bb52506109026000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c8063851c1bb311610076578063aaabadc51161005b578063aaabadc51461019a578063bbf7408a1461010e578063e6b3e704146101a2576100be565b8063851c1bb3146101535780638d928af814610192576100be565b806325798418116100a7578063257984181461010e57806363408a90146101415780636448a3ab14610149576100be565b806308b0308a146100c357806318160ddd146100f4575b600080fd5b6100cb6101d5565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6100fc6101fa565b60408051918252519081900360200190f35b6100fc6004803603602081101561012457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661032c565b6100cb61033f565b61015161035b565b005b6100fc6004803603602081101561016957600080fd5b50357fffffffff00000000000000000000000000000000000000000000000000000000166103b5565b6100cb610426565b6100cb61044a565b610151600480360360208110156101b857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166104ca565b7f00000000000000000000000000000000000000000000000000000000000000005b90565b6000805473ffffffffffffffffffffffffffffffffffffffff16806102b4577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561027f57600080fd5b505afa158015610293573d6000803e3d6000fd5b505050506040513d60208110156102a957600080fd5b505191506101f79050565b8073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156102fa57600080fd5b505afa15801561030e573d6000803e3d6000fd5b505050506040513d602081101561032457600080fd5b505191505090565b6000610337826105d7565b90505b919050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b61036361074c565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556040517fb2f6d9cc189e4fc02519ab5ba6d9455bedc32091e375e8a6383ed45f40653e74908290a2565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610454610426565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561049957600080fd5b505afa1580156104ad573d6000803e3d6000fd5b505050506040513d60208110156104c357600080fd5b5051905090565b6104d261074c565b604080517fbbf7408a000000000000000000000000000000000000000000000000000000008152336004820152905173ffffffffffffffffffffffffffffffffffffffff83169163bbf7408a916024808301926020929190829003018186803b15801561053e57600080fd5b505afa158015610552573d6000803e3d6000fd5b505050506040513d602081101561056857600080fd5b5050600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917fb2f6d9cc189e4fc02519ab5ba6d9455bedc32091e375e8a6383ed45f40653e7491a250565b6000805473ffffffffffffffffffffffffffffffffffffffff16806106b2577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561067d57600080fd5b505afa158015610691573d6000803e3d6000fd5b505050506040513d60208110156106a757600080fd5b5051915061033a9050565b8073ffffffffffffffffffffffffffffffffffffffff1663bbf7408a846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561071957600080fd5b505afa15801561072d573d6000803e3d6000fd5b505050506040513d602081101561074357600080fd5b50519392505050565b600061077b6000357fffffffff00000000000000000000000000000000000000000000000000000000166103b5565b905061079261078a8233610795565b61019161082b565b50565b600061079f61044a565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b15801561071957600080fd5b81610839576108398161083d565b5050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b604452610792917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fdfea26469706673582212202696e52709185624608e22c9a4f2233bc805a0e9f7d9aecefe8d72ca0c2b0ac164736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100be5760003560e01c8063851c1bb311610076578063aaabadc51161005b578063aaabadc51461019a578063bbf7408a1461010e578063e6b3e704146101a2576100be565b8063851c1bb3146101535780638d928af814610192576100be565b806325798418116100a7578063257984181461010e57806363408a90146101415780636448a3ab14610149576100be565b806308b0308a146100c357806318160ddd146100f4575b600080fd5b6100cb6101d5565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6100fc6101fa565b60408051918252519081900360200190f35b6100fc6004803603602081101561012457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661032c565b6100cb61033f565b61015161035b565b005b6100fc6004803603602081101561016957600080fd5b50357fffffffff00000000000000000000000000000000000000000000000000000000166103b5565b6100cb610426565b6100cb61044a565b610151600480360360208110156101b857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166104ca565b7f00000000000000000000000000000000000000000000000000000000000000005b90565b6000805473ffffffffffffffffffffffffffffffffffffffff16806102b4577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561027f57600080fd5b505afa158015610293573d6000803e3d6000fd5b505050506040513d60208110156102a957600080fd5b505191506101f79050565b8073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156102fa57600080fd5b505afa15801561030e573d6000803e3d6000fd5b505050506040513d602081101561032457600080fd5b505191505090565b6000610337826105d7565b90505b919050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b61036361074c565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556040517fb2f6d9cc189e4fc02519ab5ba6d9455bedc32091e375e8a6383ed45f40653e74908290a2565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610454610426565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561049957600080fd5b505afa1580156104ad573d6000803e3d6000fd5b505050506040513d60208110156104c357600080fd5b5051905090565b6104d261074c565b604080517fbbf7408a000000000000000000000000000000000000000000000000000000008152336004820152905173ffffffffffffffffffffffffffffffffffffffff83169163bbf7408a916024808301926020929190829003018186803b15801561053e57600080fd5b505afa158015610552573d6000803e3d6000fd5b505050506040513d602081101561056857600080fd5b5050600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917fb2f6d9cc189e4fc02519ab5ba6d9455bedc32091e375e8a6383ed45f40653e7491a250565b6000805473ffffffffffffffffffffffffffffffffffffffff16806106b2577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561067d57600080fd5b505afa158015610691573d6000803e3d6000fd5b505050506040513d60208110156106a757600080fd5b5051915061033a9050565b8073ffffffffffffffffffffffffffffffffffffffff1663bbf7408a846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561071957600080fd5b505afa15801561072d573d6000803e3d6000fd5b505050506040513d602081101561074357600080fd5b50519392505050565b600061077b6000357fffffffff00000000000000000000000000000000000000000000000000000000166103b5565b905061079261078a8233610795565b61019161082b565b50565b600061079f61044a565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b15801561071957600080fd5b81610839576108398161083d565b5050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b604452610792917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fdfea26469706673582212202696e52709185624608e22c9a4f2233bc805a0e9f7d9aecefe8d72ca0c2b0ac164736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/index.ts b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/index.ts new file mode 100644 index 0000000..85296ca --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/index.ts @@ -0,0 +1,12 @@ +import { ZERO_ADDRESS } from '@helpers/constants'; +import { Task, TaskRunOptions } from '@src'; +import { L2VotingEscrowDelegationProxyDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as L2VotingEscrowDelegationProxyDeployment; + + const nullVotingEscrow = await task.deployAndVerify('NullVotingEscrow', [], from, force); + + const veDelegationProxyArgs = [input.Vault, nullVotingEscrow.address, ZERO_ADDRESS]; + await task.deployAndVerify('VotingEscrowDelegationProxy', veDelegationProxyArgs, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/input.ts b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/input.ts new file mode 100644 index 0000000..59a4c8d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type L2VotingEscrowDelegationProxyDeployment = { + Vault: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, +}; diff --git a/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/arbitrum.json b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/arbitrum.json new file mode 100644 index 0000000..8f5b198 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/arbitrum.json @@ -0,0 +1,4 @@ +{ + "NullVotingEscrow": "0x9dA18982a33FD0c7051B19F0d7C76F2d5E7e017c", + "VotingEscrowDelegationProxy": "0x81cFAE226343B24BA12EC6521Db2C79E7aeeb310" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/avalanche.json b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/avalanche.json new file mode 100644 index 0000000..915fd83 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/avalanche.json @@ -0,0 +1,4 @@ +{ + "NullVotingEscrow": "0x6B1Da720Be2D11d95177ccFc40A917c2688f396c", + "VotingEscrowDelegationProxy": "0x0c6052254551EAe3ECac77B01DFcf1025418828f" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/base.json b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/base.json new file mode 100644 index 0000000..8a2817f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/base.json @@ -0,0 +1,4 @@ +{ + "NullVotingEscrow": "0x475D18169BE8a89357A9ee3Ab00ca386d20fA229", + "VotingEscrowDelegationProxy": "0xD87F44Df0159DC78029AB9CA7D7e57E7249F5ACD" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/gnosis.json b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/gnosis.json new file mode 100644 index 0000000..f59e354 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/gnosis.json @@ -0,0 +1,4 @@ +{ + "NullVotingEscrow": "0x013D4382F291be5688AFBcc741Ee8A24C66B2C92", + "VotingEscrowDelegationProxy": "0x7A2535f5fB47b8e44c02Ef5D9990588313fe8F05" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/goerli.json b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/goerli.json new file mode 100644 index 0000000..f9d70de --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/goerli.json @@ -0,0 +1,4 @@ +{ + "NullVotingEscrow": "0xa523f47A933D5020b23629dDf689695AA94612Dc", + "VotingEscrowDelegationProxy": "0x6817149cb753BF529565B4D023d7507eD2ff4Bc0" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/mode.json b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/mode.json new file mode 100644 index 0000000..93a382e --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/mode.json @@ -0,0 +1,4 @@ +{ + "NullVotingEscrow": "0x9dd5Db2d38b50bEF682cE532bCca5DfD203915E1", + "VotingEscrowDelegationProxy": "0x9805dcfD25e6De36bad8fe9D3Fe2c9b44B764102" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/optimism.json b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/optimism.json new file mode 100644 index 0000000..cddd084 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/optimism.json @@ -0,0 +1,4 @@ +{ + "NullVotingEscrow": "0xc3ccacE87f6d3A81724075ADcb5ddd85a8A1bB68", + "VotingEscrowDelegationProxy": "0x9dA18982a33FD0c7051B19F0d7C76F2d5E7e017c" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/polygon.json b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/polygon.json new file mode 100644 index 0000000..37d8338 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/polygon.json @@ -0,0 +1,4 @@ +{ + "NullVotingEscrow": "0x1311Fbc9F60359639174c1e7cC2032DbDb5Cc4d1", + "VotingEscrowDelegationProxy": "0x0f08eEf2C785AA5e7539684aF04755dEC1347b7c" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/sepolia.json b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/sepolia.json new file mode 100644 index 0000000..8a2817f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/sepolia.json @@ -0,0 +1,4 @@ +{ + "NullVotingEscrow": "0x475D18169BE8a89357A9ee3Ab00ca386d20fA229", + "VotingEscrowDelegationProxy": "0xD87F44Df0159DC78029AB9CA7D7e57E7249F5ACD" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/zkevm.json b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/zkevm.json new file mode 100644 index 0000000..d96f8c4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/output/zkevm.json @@ -0,0 +1,4 @@ +{ + "NullVotingEscrow": "0xD87F44Df0159DC78029AB9CA7D7e57E7249F5ACD", + "VotingEscrowDelegationProxy": "0xc7E5ED1054A24Ef31D827E6F86caA58B3Bc168d7" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/readme.md b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/readme.md new file mode 100644 index 0000000..c6f1206 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/readme.md @@ -0,0 +1,21 @@ +# 2023-03-16 - L2 Voting Escrow Delegation Proxy + +Deployment of `VotingEscrowDelegationProxy`, for delegation of veBAL-related boosts in networks other than Mainnet. +The proxy does not have a VE delegation implementation by default, so it has to be set after deployment by governance. +While the delegation implementation is not set the default `NullVotingEscrow` shall be used, making the total supply +of veBAL in the chain effectively 0. +The proxy itself is the same as the [L1 proxy](../20220325-ve-delegation), except it also exposes `totalSupply`, which makes writing L2 gauges simpler as they do not need to rely on the existence of a VE contract. + +## Useful Files + +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`NullVotingEscrow` artifact](./artifact/NullVotingEscrow.json) +- [`VotingEscrowDelegationProxy` artifact](./artifact/VotingEscrowDelegationProxy.json) diff --git a/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/test/test.fork.ts b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/test/test.fork.ts new file mode 100644 index 0000000..749ae4d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230316-l2-ve-delegation-proxy/test/test.fork.ts @@ -0,0 +1,107 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import { fp } from '@helpers/numbers'; +import { actionId } from '@helpers/models/misc/actions'; +import * as expectEvent from '@helpers/expectEvent'; + +import { describeForkTest } from '@src'; +import { Task, TaskMode } from '@src'; +import { getForkedNetwork } from '@src'; +import { impersonate } from '@src'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import { deploy } from '@src'; + +describeForkTest('L2VotingEscrowDelegationProxy', 'arbitrum', 70407500, function () { + let vault: Contract, authorizer: Contract; + let veProxy: Contract, nullVotingEscrow: Contract, veDelegation: Contract; + let admin: SignerWithAddress, user1: SignerWithAddress, user2: SignerWithAddress; + + let task: Task; + + const GOV_MULTISIG = '0xaf23dc5983230e9eeaf93280e312e57539d098d0'; + + const user1VeBal = fp(100); + const user2VeBal = fp(200); + + before('run task', async () => { + task = new Task('20230316-l2-ve-delegation-proxy', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + veProxy = await task.deployedInstance('VotingEscrowDelegationProxy'); + nullVotingEscrow = await task.deployedInstance('NullVotingEscrow'); + }); + + before('setup accounts', async () => { + [, admin, user1, user2] = await ethers.getSigners(); + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.deployedInstance('Vault'); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + }); + + before('setup mock VE delegation implementation', async () => { + veDelegation = await deploy('MockVeDelegation'); + await veDelegation.mint(user1.address, user1VeBal); + await veDelegation.mint(user2.address, user2VeBal); + }); + + before('grant set and kill delegation permissions to admin', async () => { + const govMultisig = await impersonate(GOV_MULTISIG, fp(100)); + + await authorizer.connect(govMultisig).grantRole(await actionId(veProxy, 'setDelegation'), admin.address); + await authorizer.connect(govMultisig).grantRole(await actionId(veProxy, 'killDelegation'), admin.address); + }); + + describe('getters', () => { + it('returns null voting escrow', async () => { + expect(await veProxy.getVotingEscrow()).to.be.eq(nullVotingEscrow.address); + }); + + it('returns empty default voting escrow delegation implementation', async () => { + expect(await veProxy.getDelegationImplementation()).to.be.eq(ZERO_ADDRESS); + }); + }); + + it('returns 0 total supply', async () => { + expect(await veProxy.totalSupply()).to.be.eq(0); + }); + + it('returns 0 balance for users', async () => { + expect(await veProxy.adjusted_balance_of(user1.address)).to.be.eq(0); + expect(await veProxy.adjusted_balance_of(user2.address)).to.be.eq(0); + }); + + it('sets a new delegation implementation', async () => { + const tx = await veProxy.connect(admin).setDelegation(veDelegation.address); + expectEvent.inReceipt(await tx.wait(), 'DelegationImplementationUpdated', { + newImplementation: veDelegation.address, + }); + }); + + it('uses new delegation', async () => { + expect(await veProxy.adjusted_balance_of(user1.address)).to.be.eq(user1VeBal); + expect(await veProxy.adjusted_balance_of(user2.address)).to.be.eq(user2VeBal); + + expect(await veProxy.totalSupply()).to.be.eq(user1VeBal.add(user2VeBal)); + }); + + it('kills delegation', async () => { + const tx = await veProxy.connect(admin).killDelegation(); + expectEvent.inReceipt(await tx.wait(), 'DelegationImplementationUpdated', { + newImplementation: ZERO_ADDRESS, + }); + }); + + it('returns 0 total supply again', async () => { + expect(await veProxy.totalSupply()).to.be.eq(0); + }); + + it('returns 0 balance for users again', async () => { + expect(await veProxy.adjusted_balance_of(user1.address)).to.be.eq(0); + expect(await veProxy.adjusted_balance_of(user2.address)).to.be.eq(0); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/artifact/WeightedPool.json b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/artifact/WeightedPool.json new file mode 100644 index 0000000..c9a05ff --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/artifact/WeightedPool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"components": [{"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20[]", "name": "tokens", "type": "address[]"}, {"internalType": "uint256[]", "name": "normalizedWeights", "type": "uint256[]"}, {"internalType": "contract IRateProvider[]", "name": "rateProviders", "type": "address[]"}, {"internalType": "address[]", "name": "assetManagers", "type": "address[]"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "internalType": "struct WeightedPool.NewPoolParams", "name": "params", "type": "tuple"}, {"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "contract IProtocolFeePercentagesProvider", "name": "protocolFeeProvider", "type": "address"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "string", "name": "version", "type": "string"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "feeType", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "protocolFeePercentage", "type": "uint256"}], "name": "ProtocolFeePercentageCacheUpdated", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "enabled", "type": "bool"}], "name": "RecoveryModeStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DELEGATE_PROTOCOL_SWAP_FEES_SENTINEL", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "disableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "enableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "getATHRateProduct", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getActualSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getDomainSeparator", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getInvariant", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getLastPostJoinExitInvariant", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "getNextNonce", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getNormalizedWeights", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "feeType", "type": "uint256"}], "name": "getProtocolFeePercentageCache", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getProtocolFeesCollector", "outputs": [{"internalType": "contract IProtocolFeesCollector", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getProtocolSwapFeeDelegation", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRateProviders", "outputs": [{"internalType": "contract IRateProvider[]", "name": "", "type": "address[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getScalingFactors", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "inRecoveryMode", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256", "name": "balanceTokenIn", "type": "uint256"}, {"internalType": "uint256", "name": "balanceTokenOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "bytes", "name": "poolConfig", "type": "bytes"}], "name": "setAssetManagerPoolConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "updateProtocolFeePercentageCache", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "version", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/artifact/WeightedPoolFactory.json b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/artifact/WeightedPoolFactory.json new file mode 100644 index 0000000..c08856b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/artifact/WeightedPoolFactory.json @@ -0,0 +1,282 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "WeightedPoolFactory", + "sourceName": "contracts/WeightedPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "poolVersion", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "normalizedWeights", + "type": "uint256[]" + }, + { + "internalType": "contract IRateProvider[]", + "name": "rateProviders", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeePercentagesProvider", + "outputs": [ + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101806040523480156200001257600080fd5b5060405162008d7f38038062008d7f83398101604081905262000035916200036d565b83836040518060200162000049906200021c565b601f1982820381018352601f90910116604052805183903090839060006002820460a081905280830360e08190528185529091508362000095816200013d602090811b620005e917901c565b60601b6001600160601b0319166080528285018051838252620000c4826200013d602090811b620005e917901c565b6001600160601b0319606091821b811660c05296909352905261010095909552505092821b831661012052509290921b909116610140525050426276a700016101605281516200011c9060029060208501906200022a565b508051620001329060039060208401906200022a565b505050505062000415565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506200018b6001600160a01b03831615156101ac62000191565b50919050565b81620001a257620001a281620001a6565b5050565b620001b8816210905360ea1b620001bb565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b61798680620013f983390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200026d57805160ff19168380011785556200029d565b828001600101855582156200029d579182015b828111156200029d57825182559160200191906001019062000280565b50620002ab929150620002af565b5090565b5b80821115620002ab5760008155600101620002b0565b600082601f830112620002d7578081fd5b81516001600160401b0380821115620002ee578283fd5b6040516020601f8401601f191682018101838111838210171562000310578586fd5b806040525081945083825286818588010111156200032d57600080fd5b600092505b8383101562000351578583018101518284018201529182019162000332565b83831115620003635760008185840101525b5050505092915050565b6000806000806080858703121562000383578384fd5b84516200039081620003ff565b6020860151909450620003a381620003ff565b60408601519093506001600160401b0380821115620003c0578384fd5b620003ce88838901620002c6565b93506060870151915080821115620003e4578283fd5b50620003f387828801620002c6565b91505092959194509250565b6001600160a01b0381168114620001b857600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405160601c61016051610f6b6200048e6000398061030f52806103385250806104d752508061054d5250806104fd52508061064352508061020952806106bf5250806106645250806101e8528061069b5250610f6b6000f3fe608060405234801561001057600080fd5b50600436106100de5760003560e01c806354fd4d501161008c578063739238d611610066578063739238d61461018f578063851c1bb3146101975780638d928af8146101b7578063aaabadc5146101bf576100de565b806354fd4d501461015f5780636634b753146101675780636c57f5a914610187576100de565b80632da47c40116100bd5780632da47c40146101375780632f2770db1461014d5780633f819b6f14610157576100de565b8062c194db146100e3578063174481fa146101015780632182c8fe14610117575b600080fd5b6100eb6101c7565b6040516100f89190610da3565b60405180910390f35b6101096101e6565b6040516100f8929190610d56565b61012a610125366004610b6f565b61022c565b6040516100f89190610d42565b61013f610309565b6040516100f8929190610ecb565b610155610373565b005b6100eb6103ba565b6100eb610450565b61017a610175366004610aef565b6104ae565b6040516100f89190610d70565b61017a6104cc565b61012a6104d5565b6101aa6101a5366004610b2b565b6104f9565b6040516100f89190610d7b565b61012a61054b565b61012a61056f565b60606101e16040518060200160405280600081525061063b565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b6000806000610239610309565b915091506102fa6040518060e001604052808d81526020018c81526020018b81526020018a81526020018981526020018b5167ffffffffffffffff8111801561028157600080fd5b506040519080825280602002602001820160405280156102ab578160200160208202803683370190505b5081526020018890526102bc61054b565b6102c46104d5565b85858a6102cf6103ba565b6040516020016102e59796959493929190610db6565b60405160208183030381529060405285610714565b9b9a5050505050505050505050565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561036557807f000000000000000000000000000000000000000000000000000000000000000003925062278d00915061036e565b60009250600091505b509091565b61037b610781565b6103836107b2565b6001805460ff1916811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104465780601f1061041b57610100808354040283529160200191610446565b820191906000526020600020905b81548152906001019060200180831161042957829003601f168201915b5050505050905090565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156104465780601f1061041b57610100808354040283529160200191610446565b6001600160a01b031660009081526020819052604090205460ff1690565b60015460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f00000000000000000000000000000000000000000000000000000000000000008260405160200161052e929190610d2a565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061057961054b565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156105b157600080fd5b505afa1580156105c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e19190610b53565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506106356001600160a01b03831615156101ac6107c7565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016107068183866107d9565b505050505050505050919050565b600061071e6107b2565b600061072a8484610817565b6001600160a01b038116600081815260208190526040808220805460ff191660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a290505b92915050565b60006107986000356001600160e01b0319166104f9565b90506107af6107a78233610854565b6101916107c7565b50565b6107c56107bd6104cc565b1560d36107c7565b565b816107d5576107d5816108e4565b5050565b5b602081106107f9578151835260209283019290910190601f19016107da565b905182516020929092036101000a6000190180199091169116179052565b600060606108248461063b565b90506000838251602084016000f590506001600160a01b03811661084c573d6000803e3d6000fd5b949350505050565b600061085e61056f565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161088d93929190610d84565b60206040518083038186803b1580156108a557600080fd5b505afa1580156108b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108dd9190610b0b565b9392505050565b62461bcd60e51b600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526107af916210905360ea1b906242414c90606490fd5b803561077b81610f20565b600082601f83011261095a578081fd5b813561096d61096882610f00565b610ed9565b81815291506020808301908481018184028601820187101561098e57600080fd5b60005b848110156109b65781356109a481610f20565b84529282019290820190600101610991565b505050505092915050565b600082601f8301126109d1578081fd5b81356109df61096882610f00565b818152915060208083019084810181840286018201871015610a0057600080fd5b60005b848110156109b6578135610a1681610f20565b84529282019290820190600101610a03565b600082601f830112610a38578081fd5b8135610a4661096882610f00565b818152915060208083019084810181840286018201871015610a6757600080fd5b60005b848110156109b657813584529282019290820190600101610a6a565b600082601f830112610a96578081fd5b813567ffffffffffffffff811115610aac578182fd5b610abf601f8201601f1916602001610ed9565b9150808252836020828501011115610ad657600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215610b00578081fd5b81356108dd81610f20565b600060208284031215610b1c578081fd5b815180151581146108dd578182fd5b600060208284031215610b3c578081fd5b81356001600160e01b0319811681146108dd578182fd5b600060208284031215610b64578081fd5b81516108dd81610f20565b600080600080600080600080610100898b031215610b8b578384fd5b883567ffffffffffffffff80821115610ba2578586fd5b610bae8c838d01610a86565b995060208b0135915080821115610bc3578586fd5b610bcf8c838d01610a86565b985060408b0135915080821115610be4578586fd5b610bf08c838d0161094a565b975060608b0135915080821115610c05578586fd5b610c118c838d01610a28565b965060808b0135915080821115610c26578586fd5b50610c338b828c016109c1565b94505060a08901359250610c4a8a60c08b0161093f565b915060e089013590509295985092959890939650565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015610ca55781516001600160a01b031687529582019590820190600101610c80565b509495945050505050565b6000815180845260208085019450808401835b83811015610ca557815187529582019590820190600101610cc3565b60008151808452815b81811015610d0457602081850181015186830182015201610ce8565b81811115610d155782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b901515815260200190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b6000602082526108dd6020830184610cdf565b600060e08252885160e080840152610dd26101c0840182610cdf565b905060208a015160df198085840301610100860152610df18383610cdf565b925060408c015191508085840301610120860152610e0f8383610c6d565b925060608c015191508085840301610140860152610e2d8383610cb0565b925060808c015191508085840301610160860152610e4b8383610c6d565b925060a08c01519150808584030161018086015250610e6a8282610c6d565b91505060c08a01516101a0840152610e85602084018a610c60565b610e926040840189610c60565b866060840152856080840152610eab60a0840186610c60565b82810360c0840152610ebd8185610cdf565b9a9950505050505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610ef857600080fd5b604052919050565b600067ffffffffffffffff821115610f16578081fd5b5060209081020190565b6001600160a01b03811681146107af57600080fdfea264697066735822122066e8ff4d1e877bd80e06651fc94dac70f1f249424c841aced4ddd4bbaf9af10b64736f6c634300070100336106606040523480156200001257600080fd5b50604051620079863803806200798683398101604081905262000035916200150d565b866040015151876080015186600019898b600001518c602001518d604001518e60a001518f60c001518d8d8d6000898751600214801562000074575081155b6200008157600162000084565b60025b8a8a8a8a8a8a8a8a828289898d85336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000d5929190620011e1565b508051620000eb906004906020840190620011e1565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b1661012052506200016990506276a70083111561019462000c40565b6200017d62278d0082111561019562000c40565b42909101610140819052016101605285516200019f906002111560c862000c40565b620001b9620001ad62000c55565b8751111560c962000c40565b620001cf8662000c5a60201b620014ba1760201c565b620001da8462000c66565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f906200020b908d906004016200177b565b602060405180830381600087803b1580156200022657600080fd5b505af11580156200023b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002619190620014d5565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002969084908b908b90600401620016df565b600060405180830381600087803b158015620002b157600080fd5b505af1158015620002c6573d6000803e3d6000fd5b505050508061018081815250508a6001600160a01b031663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200030d57600080fd5b505afa15801562000322573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003489190620014ee565b6001600160a01b03166101a0816001600160a01b031660601b815250505050505050505050505050505050505050505050506000600019821490508015156101e081151560f81b81525050826001600160a01b03166101c0816001600160a01b031660601b81525050620003c483600262000cfa60201b60201c565b620003d183600362000cfa565b8015620003eb57620003e583600062000cfa565b620004aa565b60405163178b2b9360e21b81526200047f906001600160a01b03851690635e2cae4c906200041f9060009060040162001790565b60206040518083038186803b1580156200043857600080fd5b505afa1580156200044d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004739190620014d5565b83111561025862000c40565b60006000805160206200796683398151915283604051620004a1919062001790565b60405180910390a25b80620004b75781620004ba565b60005b6102005250620004d3915050600883111560c962000c40565b620004eb82825162000ea560201b620014c41760201c565b620004f68162000eb4565b151560f81b61032052805181906000906200050d57fe5b60200260200101516001600160a01b0316610220816001600160a01b031660601b81525050806001815181106200054057fe5b60200260200101516001600160a01b0316610240816001600160a01b031660601b8152505060028211620005765760006200058d565b806002815181106200058457fe5b60200260200101515b60601b6001600160601b0319166102605260038211620005af576000620005c6565b80600381518110620005bd57fe5b60200260200101515b60601b6001600160601b0319166102805260048211620005e8576000620005ff565b80600481518110620005f657fe5b60200260200101515b60601b6001600160601b0319166102a052600582116200062157600062000638565b806005815181106200062f57fe5b60200260200101515b60601b6001600160601b0319166102c052600682116200065a57600062000671565b806006815181106200066857fe5b60200260200101515b60601b6001600160601b0319166102e0526007821162000693576000620006aa565b80600781518110620006a157fe5b60200260200101515b6001600160a01b0316610300816001600160a01b031660601b81525050505060008760400151519050620006ef8189606001515162000ea560201b620014c41760201c565b61034081905281516200070a90600b906020850190620011e1565b506000805b828160ff1610156200077f5760008a606001518260ff16815181106200073157fe5b6020026020010151905062000759662386f26fc1000082101561012e62000c4060201b60201c565b62000773818462000f1060201b620014d11790919060201c565b9250506001016200070f565b5062000798670de0b6b3a7640000821461013462000c40565b8860400151600081518110620007aa57fe5b60200260200101516001600160a01b0316610360816001600160a01b031660601b815250508860400151600181518110620007e157fe5b60200260200101516001600160a01b0316610380816001600160a01b031660601b81525050600282116200081757600062000832565b88604001516002815181106200082957fe5b60200260200101515b60601b6001600160601b0319166103a05260038211620008545760006200086f565b88604001516003815181106200086657fe5b60200260200101515b60601b6001600160601b0319166103c0526004821162000891576000620008ac565b8860400151600481518110620008a357fe5b60200260200101515b60601b6001600160601b0319166103e05260058211620008ce576000620008e9565b8860400151600581518110620008e057fe5b60200260200101515b60601b6001600160601b03191661040052600682116200090b57600062000926565b88604001516006815181106200091d57fe5b60200260200101515b60601b6001600160601b03191661042052600782116200094857600062000963565b88604001516007815181106200095a57fe5b60200260200101515b6001600160a01b0316610440816001600160a01b031660601b81525050620009aa89604001516000815181106200099657fe5b602002602001015162000f2d60201b60201c565b6104605260408901518051620009c7919060019081106200099657fe5b6104805260028211620009dc576000620009f2565b620009f289604001516002815181106200099657fe5b6104a0526003821162000a0757600062000a1d565b62000a1d89604001516003815181106200099657fe5b6104c0526004821162000a3257600062000a48565b62000a4889604001516004815181106200099657fe5b6104e0526005821162000a5d57600062000a73565b62000a7389604001516005815181106200099657fe5b610500526006821162000a8857600062000a9e565b62000a9e89604001516006815181106200099657fe5b610520526007821162000ab357600062000ac9565b62000ac989604001516007815181106200099657fe5b610540526060890151805160009062000ade57fe5b60200260200101516105608181525050886060015160018151811062000b0057fe5b602002602001015161058081815250506002821162000b2157600062000b3c565b886060015160028151811062000b3357fe5b60200260200101515b6105a0526003821162000b5157600062000b6c565b886060015160038151811062000b6357fe5b60200260200101515b6105c0526004821162000b8157600062000b9c565b886060015160048151811062000b9357fe5b60200260200101515b6105e0526005821162000bb157600062000bcc565b886060015160058151811062000bc357fe5b60200260200101515b610600526006821162000be157600062000bfc565b886060015160068151811062000bf357fe5b60200260200101515b610620526007821162000c1157600062000c2c565b886060015160078151811062000c2357fe5b60200260200101515b610640525062001802975050505050505050565b8162000c515762000c518162000ffc565b5050565b600890565b8062000c518162001011565b62000c7f62000c746200109d565b82101560cb62000c40565b62000c9862000c8d620010a6565b82111560ca62000c40565b62000cba8160c0603f600854620010b260201b620014e317909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc9062000cef90839062001790565b60405180910390a150565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c32639062000d2b90859060040162001790565b60206040518083038186803b15801562000d4457600080fd5b505afa15801562000d59573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d7f9190620014d5565b90508162000dc35762000d9d81620010d760201b620015061760201c565b600980546001600160401b0319166001600160401b039290921691909117905562000e77565b600282141562000e195762000de381620010d760201b620015061760201c565b600980546001600160401b03929092166801000000000000000002600160401b600160801b031990921691909117905562000e77565b600382141562000e6a5762000e3981620010d760201b620015061760201c565b600980546001600160401b0392909216600160801b02600160801b600160c01b031990921691909117905562000e77565b62000e776101bb62000ffc565b81600080516020620079668339815191528260405162000e98919062001790565b60405180910390a2505050565b62000c51828214606762000c40565b6000805b825181101562000f055760006001600160a01b031683828151811062000eda57fe5b60200260200101516001600160a01b03161462000efc57600091505062000f0b565b60010162000eb8565b50600190505b919050565b600082820162000f24848210158362000c40565b90505b92915050565b60006001600160a01b03821630141562000f515750670de0b6b3a764000062000f0b565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801562000f8d57600080fd5b505afa15801562000fa2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fc89190620016bc565b60ff169050600062000fe7601283620010f560201b620015231760201c565b600a0a670de0b6b3a764000002949350505050565b6200100e816210905360ea1b6200110d565b50565b60028151101562001022576200100e565b6000816000815181106200103257fe5b602002602001015190506000600190505b8251811015620010985760008382815181106200105c57fe5b602002602001015190506200108d816001600160a01b0316846001600160a01b031610606562000c4060201b60201c565b915060010162001043565b505050565b64e8d4a5100090565b67016345785d8a000090565b6000620010c18484846200116e565b506001901b60001901811b1992909216911b1790565b6000620010f16001600160401b038311156101ba62000c40565b5090565b60006200110783831115600162000c40565b50900390565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6200117f6101008310606462000c40565b620011b860018210158015620011b05750620011ac60ff8461010003620011c960201b620015391760201c565b8211155b606462000c40565b6200109883821c156101b462000c40565b6000818310620011da578162000f24565b5090919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200122457805160ff191683800117855562001254565b8280016001018555821562001254579182015b828111156200125457825182559160200191906001019062001237565b50620010f19291505b80821115620010f157600081556001016200125d565b805162000f2781620017ec565b600082601f83011262001291578081fd5b8151620012a8620012a282620017c0565b62001799565b818152915060208083019084810181840286018201871015620012ca57600080fd5b60005b84811015620012f6578151620012e381620017ec565b84529282019290820190600101620012cd565b505050505092915050565b600082601f83011262001312578081fd5b815162001323620012a282620017c0565b8181529150602080830190848101818402860182018710156200134557600080fd5b60005b84811015620012f65781516200135e81620017ec565b8452928201929082019060010162001348565b600082601f83011262001382578081fd5b815162001393620012a282620017c0565b818152915060208083019084810181840286018201871015620013b557600080fd5b60005b84811015620012f6578151620013ce81620017ec565b84529282019290820190600101620013b8565b600082601f830112620013f2578081fd5b815162001403620012a282620017c0565b8181529150602080830190848101818402860182018710156200142557600080fd5b60005b84811015620012f65781518452928201929082019060010162001428565b600082601f83011262001457578081fd5b81516001600160401b038111156200146d578182fd5b602062001483601f8301601f1916820162001799565b925081835284818386010111156200149a57600080fd5b60005b82811015620014ba5784810182015184820183015281016200149d565b82811115620014cc5760008284860101525b50505092915050565b600060208284031215620014e7578081fd5b5051919050565b60006020828403121562001500578081fd5b815162000f2481620017ec565b600080600080600080600060e0888a03121562001528578283fd5b87516001600160401b03808211156200153f578485fd5b9089019060e0828c03121562001553578485fd5b6200155f60e062001799565b8251828111156200156e578687fd5b6200157c8d82860162001446565b82525060208301518281111562001591578687fd5b6200159f8d82860162001446565b602083015250604083015182811115620015b7578687fd5b620015c58d82860162001301565b604083015250606083015182811115620015dd578687fd5b620015eb8d828601620013e1565b60608301525060808301518281111562001603578687fd5b620016118d82860162001371565b60808301525060a08301518281111562001629578687fd5b620016378d82860162001280565b60a08301525060c083810151908201529850620016588b60208c0162001273565b9750620016698b60408c0162001273565b965060608a0151955060808a01519450620016888b60a08c0162001273565b935060c08a01519150808211156200169e578283fd5b50620016ad8a828b0162001446565b91505092959891949750929550565b600060208284031215620016ce578081fd5b815160ff8116811462000f24578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b818110156200172b57620017188551620017e0565b8352938301939183019160010162001703565b505084810360408601528551808252908201925081860190845b818110156200176d576200175a8351620017e0565b8552938301939183019160010162001745565b509298975050505050505050565b60208101600383106200178a57fe5b91905290565b90815260200190565b6040518181016001600160401b0381118282101715620017b857600080fd5b604052919050565b60006001600160401b03821115620017d6578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146200100e57600080fd5b60805160a05160c05160e0516101005160601c6101205160601c6101405161016051610180516101a05160601c6101c05160601c6101e05160f81c610200516102205160601c6102405160601c6102605160601c6102805160601c6102a05160601c6102c05160601c6102e05160601c6103005160601c6103205160f81c610340516103605160601c6103805160601c6103a05160601c6103c05160601c6103e05160601c6104005160601c6104205160601c6104405160601c61046051610480516104a0516104c0516104e05161050051610520516105405161056051610580516105a0516105c0516105e051610600516106205161064051615ebc62001aaa60003980612270528061357e52508061222d528061351d5250806121ea52806134bc5250806121a7528061345b52508061216452806133fa52508061212152806133995250806120de52806133385250806120a452806132d7525080612b96525080612b72525080612b4e525080612b2a525080612b06525080612ae2525080612abe525080612a9a525080612563528061354352508061252152806134e25250806124df528061348152508061249d528061342052508061245b52806133bf525080612419528061335e5250806123d752806132fd525080612395528061329c5250806119c2525080613837525080610a6b5280613a98525080610a145280613a4c5250806109bd5280613a0052508061096652806139b452508061090f52806139685250806108aa528061390752508061085352806138b65250806108055280613878525080610cdf52508061074f5250806106cf52806106fa5280610725525080611293525080610b6b5250806118075250806117e3525080610fad525080610f89525080610ed75250806128825250806128c45250806128a35250615ebc6000f3fe608060405234801561001057600080fd5b50600436106103205760003560e01c80637ecebe00116101a7578063aaabadc5116100ee578063d505accf11610097578063ddf4627b11610071578063ddf4627b146105ef578063ed24911d146105f7578063f89f27ed146105ff57610320565b8063d505accf146105b6578063d5c096c4146105c9578063dd62ed3e146105dc57610320565b8063b7b814fc116100c8578063b7b814fc1461059e578063c0ff1a15146105a6578063d2946c2b146105ae57610320565b8063aaabadc514610586578063b10962781461058e578063b35056b81461059657610320565b80638d928af8116101505780639d2c110c1161012a5780639d2c110c1461054d578063a457c2d714610560578063a9059cbb1461057357610320565b80638d928af81461052a57806390193b7c1461053257806395d89b411461054557610320565b8063876f303b11610181578063876f303b146104fa57806387ec681714610502578063893d20e81461051557610320565b80637ecebe00146104cc5780638456cb59146104df578063851c1bb3146104e757610320565b806338e9922e1161026b57806354fd4d501161021457806370464016116101ee578063704640161461048557806370a082311461049857806374f3b009146104ab57610320565b806354fd4d501461045457806355c676281461045c5780636028bfd41461046457610320565b80633f4ba83a116102455780633f4ba83a1461043157806350dd6ed91461043957806354a844ba1461044c57610320565b806338e9922e1461040357806338fff2d014610416578063395093511461041e57610320565b80631dd746ea116102cd57806323ef89ed116102a757806323ef89ed146103de578063313ce567146103e65780633644e515146103fb57610320565b80631dd746ea146103a1578063238a2d59146103b657806323b872dd146103cb57610320565b806315b0015b116102fe57806315b0015b1461036d57806318160ddd146103755780631c0de0511461038a57610320565b806306fdde0314610325578063095ea7b3146103435780630da0669c14610363575b600080fd5b61032d610607565b60405161033a9190615de1565b60405180910390f35b610356610351366004615511565b61069e565b60405161033a9190615ce8565b61036b6106b5565b005b61035661074d565b61037d610771565b60405161033a9190615d0b565b610392610777565b60405161033a93929190615cf3565b6103a96107a0565b60405161033a9190615cb0565b6103be6107af565b60405161033a9190615bcc565b6103566103d9366004615461565b610abe565b61037d610b34565b6103ee610b3a565b60405161033a9190615e0d565b61037d610b43565b61036b610411366004615a2a565b610b4d565b61037d610b69565b61035661042c366004615511565b610b8d565b61036b610bc8565b61036b610447366004615769565b610bda565b61036b610bf8565b61032d610c0a565b61037d610c6b565b610477610472366004615628565b610c7e565b60405161033a929190615df4565b61037d610493366004615a2a565b610cb5565b61037d6104a636600461540d565b610d73565b6104be6104b9366004615628565b610d8e565b60405161033a929190615cc3565b61037d6104da36600461540d565b610eb6565b61036b610ec1565b61037d6104f5366004615725565b610ed3565b61037d610f25565b610477610510366004615628565b610f61565b61051d610f87565b60405161033a9190615bb8565b61051d610fab565b61037d61054036600461540d565b610fcf565b61032d610fea565b61037d61055b36600461592e565b61104b565b61035661056e366004615511565b611144565b610356610581366004615511565b611182565b61051d61118f565b61037d611199565b6103566111b1565b61036b6111c2565b61037d6111d4565b61051d611291565b61036b6105c43660046154a1565b6112b5565b6104be6105d7366004615628565b611340565b61037d6105ea366004615429565b611463565b61037d6114a0565b61037d6114a6565b6103a96114b0565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106935780601f1061066857610100808354040283529160200191610693565b820191906000526020600020905b81548152906001019060200180831161067657829003601f168201915b505050505090505b90565b60006106ab33848461154f565b5060015b92915050565b6106bd6115b7565b6106c561074d565b156106f5576106f57f00000000000000000000000000000000000000000000000000000000000000006000611620565b6107207f00000000000000000000000000000000000000000000000000000000000000006002611620565b61074b7f00000000000000000000000000000000000000000000000000000000000000006003611620565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b60008060006107846117c4565b15925061078f6117e1565b9150610799611805565b9050909192565b60606107aa611829565b905090565b606060006107bb6119c0565b905060608167ffffffffffffffff811180156107d657600080fd5b50604051908082528060200260200182016040528015610800578160200160208202803683370190505b5090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061083157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061087f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060028211156108fb577f0000000000000000000000000000000000000000000000000000000000000000816002815181106108d657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610904565b915061069b9050565b60038211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160038151811061093b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060048211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160048151811061099257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060058211156108fb577f0000000000000000000000000000000000000000000000000000000000000000816005815181106109e957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060068211156108fb577f000000000000000000000000000000000000000000000000000000000000000081600681518110610a4057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060078211156108fb577f000000000000000000000000000000000000000000000000000000000000000081600781518110610a9757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b91505090565b600080610acb8533611463565b9050610aef336001600160a01b0387161480610ae75750838210155b61019e6119e4565b610afa8585856119f2565b336001600160a01b03861614801590610b1557506000198114155b15610b2757610b27853385840361154f565b60019150505b9392505050565b600a5490565b60055460ff1690565b60006107aa6114a6565b610b55611ad2565b610b5d611b00565b610b6681611b13565b50565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106ab918590610bc390866114d1565b61154f565b610bd0611ad2565b61074b6000611b8c565b610be2611ad2565b610bea611b00565b610bf48282611bff565b5050565b610c00611ad2565b61074b6001611cf4565b600b8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106935780601f1061066857610100808354040283529160200191610693565b6008546000906107aa9060c0603f611d4b565b60006060610c948651610c8f6119c0565b6114c4565b610ca989898989898989611d5a611dbc611e2b565b97509795505050505050565b6000610cbf6111b1565b15610ccc57506000610d6e565b81610d1857610cd961074d565b610d03577f0000000000000000000000000000000000000000000000000000000000000000610d11565b60095467ffffffffffffffff165b9050610d6e565b6002821415610d40575060095468010000000000000000900467ffffffffffffffff16610d6e565b6003821415610d635750600954600160801b900467ffffffffffffffff16610d6e565b610d6e6101bb611f55565b919050565b6001600160a01b031660009081526020819052604090205490565b60608088610db8610d9d610fab565b6001600160a01b0316336001600160a01b03161460cd6119e4565b610dcd610dc3610b69565b82146101f46119e4565b60606000610dda86611f65565b15610e0257610de7611f94565b610df989610df3610771565b88611fa7565b92509050610e54565b610e0a611fd3565b6060610e14611829565b9050610e208a82611fdb565b610e448d8d8d8d8d610e306111b1565b610e3a578d610e3d565b60005b878e611d5a565b93509150610e528382611dbc565b505b610e5e8b82612044565b81895167ffffffffffffffff81118015610e7757600080fd5b50604051908082528060200260200182016040528015610ea1578160200160208202803683370190505b509450945050505b5097509795505050505050565b60006106af82610fcf565b610ec9611ad2565b61074b6001611b8c565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f08929190615b75565b604051602081830303815290604052805190602001209050919050565b600080610f30610771565b90506000610f4d610f3f6111d4565b610f4761204e565b8461229c565b509050610f5a82826114d1565b9250505090565b60006060610f728651610c8f6119c0565b610ca9898989898989896122df612328611e2b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106935780601f1061066857610100808354040283529160200191610693565b6000836080015161105d610d9d610fab565b611068610dc3610b69565b611070611fd3565b600061107f8660200151612391565b905060006110908760400151612391565b905061109c86836125ae565b95506110a885826125ae565b94506000875160018111156110b957fe5b1415611105576110cc87606001516125ba565b606088018190526110dd90836125ae565b606088015260006110ef8888886125db565b90506110fb818361260e565b945050505061113c565b6111138760600151826125ae565b6060880152600061112588888861261a565b90506111318184612645565b90506110fb81612651565b509392505050565b6000806111513385611463565b905080831061116b576111663385600061154f565b611178565b611178338585840361154f565b5060019392505050565b60006106ab3384846119f2565b60006107aa61266d565b60006107aa600060c06111aa6126e7565b9190611d4b565b6008546000906107aa9060ff6126ed565b6111ca611ad2565b61074b6000611cf4565b600060606111e0610fab565b6001600160a01b031663f94d46686111f6610b69565b6040518263ffffffff1660e01b81526004016112129190615d0b565b60006040518083038186803b15801561122a57600080fd5b505afa15801561123e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611266919081019061553c565b5091505061127b81611276611829565b611fdb565b606061128561204e565b9050610f5a81836126f7565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886112e48c610fcf565b896040516020016112fa96959493929190615d33565b60405160208183030381529060405280519060200120905061132b8882611322878787612769565b886101f86127a8565b61133688888861154f565b5050505050505050565b6060808861134f610d9d610fab565b61135a610dc3610b69565b611362611fd3565b606061136c611829565b9050611376610771565b611423576000606061138b8d8d8d868b6127ff565b915091506113a461139a612842565b83101560cc6119e4565b6113b660006113b1612842565b612849565b6113c98b6113c2612842565b8403612849565b6113d38184612328565b808a5167ffffffffffffffff811180156113ec57600080fd5b50604051908082528060200260200182016040528015611416578160200160208202803683370190505b5095509550505050610ea9565b61142d8882611fdb565b600060606114558d8d8d8d8d6114416111b1565b61144b578d61144e565b60005b898e6122df565b915091506113c98b83612849565b600061146d610fab565b6001600160a01b0316826001600160a01b0316141561148f57506000196106af565b6114998383612853565b90506106af565b60001981565b60006107aa61287e565b60606107aa61204e565b80610bf48161291b565b610bf481831460676119e4565b6000828201610b2d84821015836119e4565b60006114f0848484612994565b506001901b60001901811b1992909216911b1790565b600061151f67ffffffffffffffff8311156101ba6119e4565b5090565b60006115338383111560016119e4565b50900390565b60008183106115485781610b2d565b5090919050565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906115aa908590615d0b565b60405180910390a3505050565b6115bf6129db565b6115c7611b00565b60006115d16111d4565b90506000806115ef836115e261204e565b6115ea610771565b61229c565b909250905081156116035761160382612a79565b61160c83612a8a565b801561161b5761161b81612a93565b505050565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c32639061164f908590600401615d0b565b60206040518083038186803b15801561166757600080fd5b505afa15801561167b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169f9190615a42565b9050816116d6576116af81611506565b6009805467ffffffffffffffff191667ffffffffffffffff92909216919091179055611787565b6002821415611724576116e881611506565b6009805467ffffffffffffffff9290921668010000000000000000026fffffffffffffffff000000000000000019909216919091179055611787565b600382141561177c5761173681611506565b6009805467ffffffffffffffff92909216600160801b027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff909216919091179055611787565b6117876101bb611f55565b817f6bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a826040516117b79190615d0b565b60405180910390a2505050565b60006117ce611805565b4211806107aa57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b606060006118356119c0565b905060608167ffffffffffffffff8111801561185057600080fd5b5060405190808252806020026020018201604052801561187a578160200160208202803683370190505b509050611885612a98565b8160008151811061189257fe5b6020026020010181815250506118a6612abc565b816001815181106118b357fe5b60200260200101818152505060028211156108fb576118d0612ae0565b816002815181106118dd57fe5b60200260200101818152505060038211156108fb576118fa612b04565b8160038151811061190757fe5b60200260200101818152505060048211156108fb57611924612b28565b8160048151811061193157fe5b60200260200101818152505060058211156108fb5761194e612b4c565b8160058151811061195b57fe5b60200260200101818152505060068211156108fb57611978612b70565b8160068151811061198557fe5b60200260200101818152505060078211156108fb576119a2612b94565b816007815181106119af57fe5b602002602001018181525050610ab8565b7f000000000000000000000000000000000000000000000000000000000000000090565b81610bf457610bf481611f55565b611a096001600160a01b03841615156101986119e4565b611a206001600160a01b03831615156101996119e4565b611a2b83838361161b565b6001600160a01b038316600090815260208190526040902054611a5190826101a0612bb8565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611a8090826114d1565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115aa908590615d0b565b6000611ae96000356001600160e01b031916610ed3565b9050610b66611af88233612bce565b6101916119e4565b61074b611b0b6117c4565b6101926119e4565b611b28611b1e612cb7565b82101560cb6119e4565b611b3d611b33612cc0565b82111560ca6119e4565b600854611b4e908260c0603f6114e3565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611b81908390615d0b565b60405180910390a150565b8015611bac57611ba7611b9d6117e1565b42106101936119e4565b611bc1565b611bc1611bb7611805565b42106101a96119e4565b6007805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611b81908390615ce8565b6000611c09610b69565b90506000611c15610fab565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b8152600401611c42929190615dac565b60806040518083038186803b158015611c5a57600080fd5b505afa158015611c6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c929190615a5a565b604051630639cdb560e21b81529094506001600160a01b03851693506318e736d49250611cc6915085908790600401615d93565b600060405180830381600087803b158015611ce057600080fd5b505af1158015611336573d6000803e3d6000fd5b600854611d03908260ff612ccc565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611d36908390615ce8565b60405180910390a180610b6657610b66612cf3565b6001901b6000190191901c1690565b6000606080611d6761204e565b9050600080611d768a84612d43565b9150915060006060611d8c8e8d878c888d612da9565b9092509050611da8838d838888611da38189611523565b612e3c565b909e909d509b505050505050505050505050565b81518151611dcb9082906114c4565b60005b81811015611e2557611e06848281518110611de557fe5b6020026020010151848381518110611df957fe5b6020026020010151612e66565b848281518110611e1257fe5b6020908102919091010152600101611dce565b50505050565b333014611ee9576000306001600160a01b0316600036604051611e4f929190615b8d565b6000604051808303816000865af19150503d8060008114611e8c576040519150601f19603f3d011682016040523d82523d6000602084013e611e91565b606091505b505090508060008114611ea057fe5b60046000803e6000516001600160e01b0319166343adbafb60e01b8114611ecb573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b611ef1611fd3565b6060611efb611829565b9050611f078782611fdb565b60006060611f1f8c8c8c8c8c8c898d8d63ffffffff16565b91509150611f3181848663ffffffff16565b8051601f1982018390526343adbafb603f1983015260200260231982016044820181fd5b610b66816210905360ea1b612eb7565b60008082511180156106af575060ff801682806020019051810190611f8a9190615a9a565b60ff161492915050565b61074b611f9f6111b1565b6101b66119e4565b600060606000611fb684612f18565b90506060611fc5878784612f2e565b919791965090945050505050565b61074b611b00565b81518151611fea9082906114c4565b60005b81811015611e255761202584828151811061200457fe5b602002602001015184838151811061201857fe5b6020026020010151612fdd565b84828151811061203157fe5b6020908102919091010152600101611fed565b610bf48282613013565b6060600061205a6119c0565b905060608167ffffffffffffffff8111801561207557600080fd5b5060405190808252806020026020018201604052801561209f578160200160208202803683370190505b5090507f0000000000000000000000000000000000000000000000000000000000000000816000815181106120d057fe5b6020026020010181815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061210a57fe5b60200260200101818152505060028211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160028151811061214d57fe5b60200260200101818152505060038211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160038151811061219057fe5b60200260200101818152505060048211156108fb577f0000000000000000000000000000000000000000000000000000000000000000816004815181106121d357fe5b60200260200101818152505060058211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160058151811061221657fe5b60200260200101818152505060068211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160068151811061225957fe5b60200260200101818152505060078211156108fb577f0000000000000000000000000000000000000000000000000000000000000000816007815181106119af57fe5b60008060006122b4866122af6000610cb5565b6130df565b90506000806122c287613105565b915091506122d286838501613175565b9890975095505050505050565b60006060806122ec61204e565b90506000806122fb8a84612d43565b91509150600060606123118e8d878c888d613192565b9092509050611da8838d838888611da381896114d1565b815181516123379082906114c4565b60005b81811015611e255761237284828151811061235157fe5b602002602001015184838151811061236557fe5b602002602001015161320e565b84828151811061237e57fe5b602090810291909101015260010161233a565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156123d557610d11612a98565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561241757610d11612abc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561245957610d11612ae0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561249b57610d11612b04565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156124dd57610d11612b28565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561251f57610d11612b4c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561256157610d11612b70565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156125a357610d11612b94565b610d6e610135611f55565b6000610b2d8383612fdd565b6000806125cf6125c8610c6b565b849061325c565b9050610b2d8382611523565b6000612606836125ee8660200151613298565b846125fc8860400151613298565b88606001516135a2565b949350505050565b6000610b2d8383612e66565b60006126068361262d8660200151613298565b8461263b8860400151613298565b886060015161361d565b6000610b2d838361320e565b60006106af612666612661610c6b565b613693565b839061320e565b6000612677610fab565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156126af57600080fd5b505afa1580156126c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107aa919061574d565b60085490565b1c60019081161490565b670de0b6b3a764000060005b83518110156127595761274f61274885838151811061271e57fe5b602002602001015185848151811061273257fe5b60200260200101516136b990919063ffffffff16565b8390612fdd565b9150600101612703565b506106af600082116101376119e4565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b60006127b38561376a565b90506127c96127c3878387613786565b836119e4565b6127d8428410156101b86119e4565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b6000606061280b613835565b6128275761282761282261281d61204e565b613859565b612a93565b6128348787878787613abc565b915091509550959350505050565b620f424090565b610bf48282613b4c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006128eb613bdf565b30604051602001612900959493929190615d67565b60405160208183030381529060405280519060200120905090565b60028151101561292a57610b66565b60008160008151811061293957fe5b602002602001015190506000600190505b825181101561161b57600083828151811061296157fe5b6020026020010151905061298a816001600160a01b0316846001600160a01b03161060656119e4565b915060010161294a565b6129a3610100831060646119e4565b6129cc600182101580156129c557506129c160ff8461010003611539565b8211155b60646119e4565b61161b83821c156101b46119e4565b60408051600080825260208201909252606091612a0e565b6129fb6152ce565b8152602001906001900390816129f35790505b509050612a19610fab565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b8152600401612a449190615c19565b600060405180830381600087803b158015612a5e57600080fd5b505af1158015612a72573d6000803e3d6000fd5b5050505050565b610b66612a84611291565b82612849565b610b6681613be3565b600a55565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000612bc784841115836119e4565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b612bed610f87565b6001600160a01b031614158015612c085750612c0883613c03565b15612c3057612c15610f87565b6001600160a01b0316336001600160a01b03161490506106af565b612c3861266d565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b8152600401612c6793929190615d14565b60206040518083038186803b158015612c7f57600080fd5b505afa158015612c93573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114999190615608565b64e8d4a5100090565b67016345785d8a000090565b60006001821b1984168284612ce2576000612ce5565b60015b60ff16901b17949350505050565b612cfb6129db565b612d0b612d066111d4565b612a8a565b612d13613835565b61074b576000612d21610b34565b90506000612d3061281d61204e565b905081811115610bf457610bf481612a93565b6000806000612d50610771565b90506000612d5e85876126f7565b9050600080612d6e83888661229c565b90925090508015612d8257612d8281612a93565b8115612d9157612d9182612a79565b612d9b84836114d1565b989297509195505050505050565b600060606000612db884613c35565b90506000816003811115612dc857fe5b1415612de457612dda88888787613c4b565b9250925050612e31565b6001816003811115612df257fe5b1415612e0357612dda888686613d1a565b6002816003811115612e1157fe5b1415612e2457612dda8888888888613d38565b612e2f610150611f55565b505b965096945050505050565b6000612e4c878787878787613d97565b90508015612e5d57612e5d81612a79565b50505050505050565b6000612e7582151560046119e4565b82612e82575060006106af565b670de0b6b3a764000083810290612ea590858381612e9c57fe5b041460056119e4565b828181612eae57fe5b049150506106af565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b600081806020019051810190610b2d9190615ab6565b60606000612f3c8385612e66565b9050845167ffffffffffffffff81118015612f5657600080fd5b50604051908082528060200260200182016040528015612f80578160200160208202803683370190505b50915060005b8551811015612fd457612fb582878381518110612f9f57fe5b6020026020010151612fdd90919063ffffffff16565b838281518110612fc157fe5b6020908102919091010152600101612f86565b50509392505050565b6000828202613001841580612ffa575083858381612ff757fe5b04145b60036119e4565b670de0b6b3a764000090049392505050565b61302a6001600160a01b038316151561019b6119e4565b6130368260008361161b565b6001600160a01b03821660009081526020819052604090205461305c90826101b2612bb8565b6001600160a01b03831660009081526020819052604090205561308f61308a82613084610771565b90613e90565b613e9e565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516130d39190615d0b565b60405180910390a35050565b6000610b2d6130f66130ef611199565b8590612e66565b670de0b6b3a764000084613ea3565b600080613110613835565b1561312057506000905080613170565b600a54600061312e85613859565b905081811161314557600080935093505050613170565b61316a6131528284612e66565b670de0b6b3a76400006131656002610cb5565b613ea3565b93509150505b915091565b6000610b2d6131848484613eea565b61318d84613693565b613f04565b6000606060006131a184613f24565b905060018160048111156131b157fe5b14156131c457612dda8888888888613f3a565b60028160048111156131d257fe5b14156131e457612dda88888787613f8a565b60038160048111156131f257fe5b141561320357612dda888686613fe8565b612e2f610136611f55565b600061321d82151560046119e4565b8261322a575060006106af565b670de0b6b3a76400008381029061324490858381612e9c57fe5b82600182038161325057fe5b046001019150506106af565b6000828202613276841580612ffa575083858381612ff757fe5b806132855760009150506106af565b670de0b6b3a76400006000198201613250565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156132fb57507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561335c57507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156133bd57507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561341e57507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561347f57507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156134e057507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561354157507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156125a357507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b60006135c46135b987670429d069189e0000612fdd565b8311156101306119e4565b60006135d087846114d1565b905060006135de888361320e565b905060006135ec8887612e66565b905060006135fa8383614006565b905061360f61360882613693565b8990612fdd565b9a9950505050505050505050565b600061363f61363485670429d069189e0000612fdd565b8311156101316119e4565b600061365561364e8685611523565b869061320e565b90506000613663858861320e565b905060006136718383614006565b9050600061368782670de0b6b3a7640000611523565b905061360f8a8261325c565b6000670de0b6b3a764000082106136ab5760006106af565b50670de0b6b3a76400000390565b6000670de0b6b3a76400008214156136d25750816106af565b671bc16d674ec800008214156136ec576114998384612fdd565b673782dace9d90000082141561371c5760006137088485612fdd565b90506137148182612fdd565b9150506106af565b6000613728848461408c565b9050600061374261373b8361271061325c565b60016114d1565b905080821015613757576000925050506106af565b6137618282611523565b925050506106af565b600061377461287e565b82604051602001610f08929190615b9d565b600061379882516041146101b96119e4565b60208281015160408085015160608601518251600080825295019283905292939092811a916001906137d1908990859088908890615dc3565b6020604051602081039080840390855afa1580156137f3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906138295750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b8051600090816138df61389c85838561386e57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b6138da866001815181106138ac57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b612fdd565b905060028211156139395761393261392b856002815181106138fd57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b8290612fdd565b9050613942565b9150610d6e9050565b60038211156139395761398c61392b8560038151811061395e57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b90506004821115613939576139d861392b856004815181106139aa57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b9050600582111561393957613a2461392b856005815181106139f657fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b9050600682111561393957613a7061392b85600681518110613a4257fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b90506007821115610b2d5761260661392b85600781518110613a8e57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b600060606000613acb84613f24565b9050613ae66000826004811115613ade57fe5b1460ce6119e4565b6060613af18561422d565b9050613aff815187516114c4565b613b098187611fdb565b6060613b1361204e565b90506000613b2182846126f7565b90506000613b30828551613eea565b9050613b3b82612a8a565b9b929a509198505050505050505050565b613b586000838361161b565b613b6d61308a82613b67610771565b906114d1565b6001600160a01b038216600090815260208190526040902054613b9090826114d1565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906130d3908590615d0b565b4690565b610b66613bfe82600060c0613bf66126e7565b9291906114e3565b614243565b6000613c15631c74c91760e11b610ed3565b8214806106af5750613c2d6350dd6ed960e01b610ed3565b909114919050565b6000818060200190518101906106af91906157b7565b60006060600080613c5b85614258565b91509150613c6d8851821060646119e4565b6000613ca9898381518110613c7e57fe5b6020026020010151898481518110613c9257fe5b6020026020010151858a613ca4610c6b565b61427a565b90506060895167ffffffffffffffff81118015613cc557600080fd5b50604051908082528060200260200182016040528015613cef578160200160208202803683370190505b50905081818481518110613cff57fe5b60209081029190910101529299929850919650505050505050565b600060606000613d2984614330565b90506060611fc5878388614346565b60006060806000613d48856143e2565b91509150613d5882518a516114c4565b613d628288611fdb565b6000613d788a8a858a613d73610c6b565b6143fa565b9050613d888282111560cf6119e4565b99919850909650505050505050565b600082821015815b8751811015613e315781613de257613ddd888281518110613dbc57fe5b6020026020010151888381518110613dd057fe5b6020026020010151613e90565b613e12565b613e12888281518110613df157fe5b6020026020010151888381518110613e0557fe5b60200260200101516114d1565b888281518110613e1e57fe5b6020908102919091010152600101613d9f565b506000613e3e86896126f7565b90506000613e4c6000610cb5565b9050613e5782612a8a565b80613e685760009350505050613e86565b6000613e7f613e77848d612e66565b888885614538565b9450505050505b9695505050505050565b6000610b2d83836001612bb8565b600255565b60008383101580613eb2575081155b15613ebf57506000610b2d565b6000613ecb8486612e66565b670de0b6b3a7640000039050613ee18184612fdd565b95945050505050565b6000828202610b2d841580612ffa575083858381612ff757fe5b6000613f1382151560046119e4565b818381613f1c57fe5b049392505050565b6000818060200190518101906106af9190615878565b60006060806000613f4a8561455b565b91509150613f5a895183516114c4565b613f648288611fdb565b6000613f7a8a8a858a613f75610c6b565b614573565b9050613d888282101560d06119e4565b60006060600080613f9a856146ae565b91509150613fac8851821060646119e4565b6000613ca9898381518110613fbd57fe5b6020026020010151898481518110613fd157fe5b6020026020010151858a613fe3610c6b565b6146c5565b600060606000613ff78461475b565b90506060611fc5878388614771565b6000670de0b6b3a764000082141561401f5750816106af565b671bc16d674ec8000082141561403957611499838461325c565b673782dace9d900000821415614061576000614055848561325c565b9050613714818261325c565b600061406d848461408c565b9050600061408061373b8361271061325c565b905061376182826114d1565b6000816140a25750670de0b6b3a76400006106af565b826140af575060006106af565b6140bf60ff84901c1560066119e4565b826140e5770bce5086492111aea88f4bb1ca6bcf584181ea8059f76532841060076119e4565b826000670c7d713b49da0000831380156141065750670f43fc2c04ee000083125b1561413d57600061411684614803565b9050670de0b6b3a764000080820784020583670de0b6b3a76400008305020191505061414b565b816141478461492a565b0290505b670de0b6b3a76400009005614183680238fd42c5cf03ffff19821280159061417c575068070c1cc73b00c800008213155b60086119e4565b613e8681614cca565b60006001600160a01b0382161561421d5761421883836001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b1580156141da57600080fd5b505afa1580156141ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142129190615a42565b906136b9565b610b2d565b50670de0b6b3a764000092915050565b606081806020019051810190610b2d9190615893565b600854614252908260006150a8565b60085550565b6000808280602001905181019061426f9190615843565b909590945092505050565b6000806142918461428b8188611523565b9061320e565b90506142aa6709b6e64a8ec600008210156101326119e4565b60006142c86142c1670de0b6b3a764000089612e66565b8390614006565b905060006142df6142d883613693565b8a90612fdd565b905060006142f66142ef8a613693565b839061325c565b905060006143048383611523565b905060006143146125c889613693565b905061432082826114d1565b9c9b505050505050505050505050565b600081806020019051810190610b2d9190615817565b606060006143548484612e66565b90506060855167ffffffffffffffff8111801561437057600080fd5b5060405190808252806020026020018201604052801561439a578160200160208202803683370190505b50905060005b86518110156143d8576143b983888381518110612f9f57fe5b8282815181106143c557fe5b60209081029190910101526001016143a0565b5095945050505050565b606060008280602001905181019061426f91906157d2565b60006060845167ffffffffffffffff8111801561441657600080fd5b50604051908082528060200260200182016040528015614440578160200160208202803683370190505b5090506000805b8851811015614505576144a089828151811061445f57fe5b602002602001015161428b89848151811061447657fe5b60200260200101518c858151811061448a57fe5b602002602001015161152390919063ffffffff16565b8382815181106144ac57fe5b6020026020010181815250506144fb6144f48983815181106144ca57fe5b60200260200101518584815181106144de57fe5b602002602001015161325c90919063ffffffff16565b83906114d1565b9150600101614447565b50600061451689898986868a6150d4565b905061452b61452482613693565b879061325c565b9998505050505050505050565b60008061454f866145498688612e66565b85613ea3565b9050613e868482613175565b606060008280602001905181019061426f91906158d6565b60006060845167ffffffffffffffff8111801561458f57600080fd5b506040519080825280602002602001820160405280156145b9578160200160208202803683370190505b5090506000805b88518110156146675761461f8982815181106145d857fe5b60200260200101516146198984815181106145ef57fe5b60200260200101518c858151811061460357fe5b60200260200101516114d190919063ffffffff16565b90612e66565b83828151811061462b57fe5b60200260200101818152505061465d6144f489838151811061464957fe5b6020026020010151858481518110612f9f57fe5b91506001016145c0565b50600061467889898986868a6151e3565b90506000670de0b6b3a7640000821161469257600061360f565b61360f6146a783670de0b6b3a7640000611523565b8890612fdd565b6000808280602001905181019061426f9190615910565b6000806146d68461428b81886114d1565b90506146ef6729a2241af62c00008211156101336119e4565b60006147066142c1670de0b6b3a76400008961320e565b9050600061472661471f83670de0b6b3a7640000611523565b8a9061325c565b905060006147366142ef8a613693565b905060006147448383611523565b9050600061431461475489613693565b849061320e565b600081806020019051810190610b2d91906158f4565b6060600061477f848461320e565b90506060855167ffffffffffffffff8111801561479b57600080fd5b506040519080825280602002602001820160405280156147c5578160200160208202803683370190505b50905060005b86518110156143d8576147e4838883815181106144de57fe5b8282815181106147f057fe5b60209081029190910101526001016147cb565b670de0b6b3a7640000026000806ec097ce7bc90715b34b9f1000000000808401906ec097ce7bc90715b34b9f0fffffffff198501028161483f57fe5b05905060006ec097ce7bc90715b34b9f100000000082800205905081806ec097ce7bc90715b34b9f100000000081840205915060038205016ec097ce7bc90715b34b9f100000000082840205915060058205016ec097ce7bc90715b34b9f100000000082840205915060078205016ec097ce7bc90715b34b9f100000000082840205915060098205016ec097ce7bc90715b34b9f1000000000828402059150600b8205016ec097ce7bc90715b34b9f1000000000828402059150600d8205016ec097ce7bc90715b34b9f1000000000828402059150600f826002919005919091010295945050505050565b6000670de0b6b3a76400008212156149675761495d826ec097ce7bc90715b34b9f10000000008161495757fe5b0561492a565b6000039050610d6e565b60007e1600ef3172e58d2e933ec884fde10064c63b5372d805e203c000000000000083126149b857770195e54c5dd42177f53a27172fa9ec630262827000000000830592506806f05b59d3b2000000015b73011798004d755d3c8bc8e03204cf44619e00000083126149f0576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff00840008312614a38576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a7008312614a73576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf8508312614aaa57693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e28312614ae157690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d038312614b165768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb417461211108312614b4157680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d8312614b76576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f17757889379378312614bab576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b2866038312614bdf576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac8312614c13576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b600068056bc75e2d63100000840168056bc75e2d631000008086030281614c3657fe5b059050600068056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b6000614cf9680238fd42c5cf03ffff198312158015614cf2575068070c1cc73b00c800008313155b60096119e4565b6000821215614d2d57614d0e82600003614cca565b6ec097ce7bc90715b34b9f100000000081614d2557fe5b059050610d6e565b60006806f05b59d3b20000008312614d6d57506806f05b59d3b1ffffff1990910190770195e54c5dd42177f53a27172fa9ec630262827000000000614da3565b6803782dace9d90000008312614d9f57506803782dace9d8ffffff19909101906b1425982cf597cd205cef7380614da3565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac620000008412614df35768ad78ebc5ac61ffffff199093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d6310000008412614e2f576856bc75e2d630ffffff199093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b188000008412614e6957682b5e3af16b187fffff199093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c4000008412614ea3576815af1d78b58c3fffff199093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac62000008412614edc57680ad78ebc5ac61fffff199093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d631000008412614f155768056bc75e2d630fffff199093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b18800008412614f4e576802b5e3af16b187ffff199093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c400008412614f875768015af1d78b58c3ffff199093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116821b90821b198416179392505050565b670de0b6b3a764000060005b87518110156151d85760008582815181106150f757fe5b602002602001015185111561515a57600061512061511487613693565b8b8581518110612f9f57fe5b90506000615134828a868151811061448a57fe5b9050600061514461266688613693565b905061515083826114d1565b9350505050615171565b86828151811061516657fe5b602002602001015190505b600061519a8a848151811061518257fe5b6020026020010151614619848d878151811061448a57fe5b90506151cc6151c58a85815181106151ae57fe5b6020026020010151836136b990919063ffffffff16565b8590612fdd565b935050506001016150e0565b509695505050505050565b670de0b6b3a764000060005b87518110156151d85760008486838151811061520757fe5b6020026020010151111561526e57600061522c61511487670de0b6b3a7640000611523565b90506000615240828a868151811061448a57fe5b9050600061524e828861325c565b905061526461525d8383611523565b84906114d1565b9350505050615285565b86828151811061527a57fe5b602002602001015190505b60006152ae8a848151811061529657fe5b6020026020010151614619848d878151811061460357fe5b90506152c26151c58a85815181106151ae57fe5b935050506001016151ef565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b80356106af81615e62565b600082601f830112615319578081fd5b815161532c61532782615e42565b615e1b565b81815291506020808301908481018184028601820187101561534d57600080fd5b60005b8481101561536c57815184529282019290820190600101615350565b505050505092915050565b600082601f830112615387578081fd5b813567ffffffffffffffff81111561539d578182fd5b6153b0601f8201601f1916602001615e1b565b91508082528360208285010111156153c757600080fd5b8060208401602084013760009082016020015292915050565b8051600481106106af57600080fd5b8051600581106106af57600080fd5b8035600281106106af57600080fd5b60006020828403121561541e578081fd5b8135610b2d81615e62565b6000806040838503121561543b578081fd5b823561544681615e62565b9150602083013561545681615e62565b809150509250929050565b600080600060608486031215615475578081fd5b833561548081615e62565b9250602084013561549081615e62565b929592945050506040919091013590565b600080600080600080600060e0888a0312156154bb578283fd5b87356154c681615e62565b965060208801356154d681615e62565b9550604088013594506060880135935060808801356154f481615e77565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215615523578182fd5b823561552e81615e62565b946020939093013593505050565b600080600060608486031215615550578081fd5b835167ffffffffffffffff80821115615567578283fd5b818601915086601f83011261557a578283fd5b815161558861532782615e42565b80828252602080830192508086018b8283870289010111156155a8578788fd5b8796505b848710156155d35780516155bf81615e62565b8452600196909601959281019281016155ac565b5089015190975093505050808211156155ea578283fd5b506155f786828701615309565b925050604084015190509250925092565b600060208284031215615619578081fd5b81518015158114610b2d578182fd5b600080600080600080600060e0888a031215615642578081fd5b8735965060208089013561565581615e62565b9650604089013561566581615e62565b9550606089013567ffffffffffffffff80821115615681578384fd5b818b0191508b601f830112615694578384fd5b81356156a261532782615e42565b8082825285820191508585018f8788860288010111156156c0578788fd5b8795505b838610156156e25780358352600195909501949186019186016156c4565b509850505060808b0135955060a08b0135945060c08b0135925080831115615708578384fd5b50506157168a828b01615377565b91505092959891949750929550565b600060208284031215615736578081fd5b81356001600160e01b031981168114610b2d578182fd5b60006020828403121561575e578081fd5b8151610b2d81615e62565b6000806040838503121561577b578182fd5b823561578681615e62565b9150602083013567ffffffffffffffff8111156157a1578182fd5b6157ad85828601615377565b9150509250929050565b6000602082840312156157c8578081fd5b610b2d83836153e0565b6000806000606084860312156157e6578081fd5b6157f085856153e0565b9250602084015167ffffffffffffffff81111561580b578182fd5b6155f786828701615309565b60008060408385031215615829578182fd5b61583384846153e0565b9150602083015190509250929050565b600080600060608486031215615857578081fd5b61586185856153e0565b925060208401519150604084015190509250925092565b600060208284031215615889578081fd5b610b2d83836153ef565b600080604083850312156158a5578182fd5b6158af84846153ef565b9150602083015167ffffffffffffffff8111156158ca578182fd5b6157ad85828601615309565b6000806000606084860312156158ea578081fd5b6157f085856153ef565b60008060408385031215615906578182fd5b61583384846153ef565b600080600060608486031215615924578081fd5b61586185856153ef565b600080600060608486031215615942578081fd5b833567ffffffffffffffff80821115615959578283fd5b818601915061012080838903121561596f578384fd5b61597881615e1b565b905061598488846153fe565b815261599388602085016152fe565b60208201526159a588604085016152fe565b6040820152606083013560608201526080830135608082015260a083013560a08201526159d58860c085016152fe565b60c08201526159e78860e085016152fe565b60e082015261010080840135838111156159ff578586fd5b615a0b8a828701615377565b9183019190915250976020870135975060409096013595945050505050565b600060208284031215615a3b578081fd5b5035919050565b600060208284031215615a53578081fd5b5051919050565b60008060008060808587031215615a6f578182fd5b8451935060208501519250604085015191506060850151615a8f81615e62565b939692955090935050565b600060208284031215615aab578081fd5b8151610b2d81615e77565b60008060408385031215615ac8578182fd5b8251615ad381615e77565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015615b1f57815187529582019590820190600101615b03565b509495945050505050565b60008151808452815b81811015615b4f57602081850181015186830182015201615b33565b81811115615b605782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b81811015615c0d5783516001600160a01b031683529284019291840191600101615be8565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015615ca3578151805160048110615c4c57fe5b855280870151615c5e88870182615ae3565b508581015186860152606080820151615c7982880182615ae3565b505060809081015190615c8e86820183615ae3565b505060a0939093019290850190600101615c36565b5091979650505050505050565b600060208252610b2d6020830184615af0565b600060408252615cd66040830185615af0565b8281036020840152613ee18185615af0565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000838252604060208301526126066040830184615b2a565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610b2d6020830184615b2a565b6000838252604060208301526126066040830184615af0565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615e3a57600080fd5b604052919050565b600067ffffffffffffffff821115615e58578081fd5b5060209081020190565b6001600160a01b0381168114610b6657600080fd5b60ff81168114610b6657600080fdfea26469706673582212208e9a1a26b64de4f87bb963cb83363cb8bc872f588f58e43e43715bf71d5b477264736f6c634300070100336bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100de5760003560e01c806354fd4d501161008c578063739238d611610066578063739238d61461018f578063851c1bb3146101975780638d928af8146101b7578063aaabadc5146101bf576100de565b806354fd4d501461015f5780636634b753146101675780636c57f5a914610187576100de565b80632da47c40116100bd5780632da47c40146101375780632f2770db1461014d5780633f819b6f14610157576100de565b8062c194db146100e3578063174481fa146101015780632182c8fe14610117575b600080fd5b6100eb6101c7565b6040516100f89190610da3565b60405180910390f35b6101096101e6565b6040516100f8929190610d56565b61012a610125366004610b6f565b61022c565b6040516100f89190610d42565b61013f610309565b6040516100f8929190610ecb565b610155610373565b005b6100eb6103ba565b6100eb610450565b61017a610175366004610aef565b6104ae565b6040516100f89190610d70565b61017a6104cc565b61012a6104d5565b6101aa6101a5366004610b2b565b6104f9565b6040516100f89190610d7b565b61012a61054b565b61012a61056f565b60606101e16040518060200160405280600081525061063b565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b6000806000610239610309565b915091506102fa6040518060e001604052808d81526020018c81526020018b81526020018a81526020018981526020018b5167ffffffffffffffff8111801561028157600080fd5b506040519080825280602002602001820160405280156102ab578160200160208202803683370190505b5081526020018890526102bc61054b565b6102c46104d5565b85858a6102cf6103ba565b6040516020016102e59796959493929190610db6565b60405160208183030381529060405285610714565b9b9a5050505050505050505050565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561036557807f000000000000000000000000000000000000000000000000000000000000000003925062278d00915061036e565b60009250600091505b509091565b61037b610781565b6103836107b2565b6001805460ff1916811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104465780601f1061041b57610100808354040283529160200191610446565b820191906000526020600020905b81548152906001019060200180831161042957829003601f168201915b5050505050905090565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156104465780601f1061041b57610100808354040283529160200191610446565b6001600160a01b031660009081526020819052604090205460ff1690565b60015460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f00000000000000000000000000000000000000000000000000000000000000008260405160200161052e929190610d2a565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061057961054b565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156105b157600080fd5b505afa1580156105c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e19190610b53565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506106356001600160a01b03831615156101ac6107c7565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016107068183866107d9565b505050505050505050919050565b600061071e6107b2565b600061072a8484610817565b6001600160a01b038116600081815260208190526040808220805460ff191660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a290505b92915050565b60006107986000356001600160e01b0319166104f9565b90506107af6107a78233610854565b6101916107c7565b50565b6107c56107bd6104cc565b1560d36107c7565b565b816107d5576107d5816108e4565b5050565b5b602081106107f9578151835260209283019290910190601f19016107da565b905182516020929092036101000a6000190180199091169116179052565b600060606108248461063b565b90506000838251602084016000f590506001600160a01b03811661084c573d6000803e3d6000fd5b949350505050565b600061085e61056f565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161088d93929190610d84565b60206040518083038186803b1580156108a557600080fd5b505afa1580156108b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108dd9190610b0b565b9392505050565b62461bcd60e51b600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526107af916210905360ea1b906242414c90606490fd5b803561077b81610f20565b600082601f83011261095a578081fd5b813561096d61096882610f00565b610ed9565b81815291506020808301908481018184028601820187101561098e57600080fd5b60005b848110156109b65781356109a481610f20565b84529282019290820190600101610991565b505050505092915050565b600082601f8301126109d1578081fd5b81356109df61096882610f00565b818152915060208083019084810181840286018201871015610a0057600080fd5b60005b848110156109b6578135610a1681610f20565b84529282019290820190600101610a03565b600082601f830112610a38578081fd5b8135610a4661096882610f00565b818152915060208083019084810181840286018201871015610a6757600080fd5b60005b848110156109b657813584529282019290820190600101610a6a565b600082601f830112610a96578081fd5b813567ffffffffffffffff811115610aac578182fd5b610abf601f8201601f1916602001610ed9565b9150808252836020828501011115610ad657600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215610b00578081fd5b81356108dd81610f20565b600060208284031215610b1c578081fd5b815180151581146108dd578182fd5b600060208284031215610b3c578081fd5b81356001600160e01b0319811681146108dd578182fd5b600060208284031215610b64578081fd5b81516108dd81610f20565b600080600080600080600080610100898b031215610b8b578384fd5b883567ffffffffffffffff80821115610ba2578586fd5b610bae8c838d01610a86565b995060208b0135915080821115610bc3578586fd5b610bcf8c838d01610a86565b985060408b0135915080821115610be4578586fd5b610bf08c838d0161094a565b975060608b0135915080821115610c05578586fd5b610c118c838d01610a28565b965060808b0135915080821115610c26578586fd5b50610c338b828c016109c1565b94505060a08901359250610c4a8a60c08b0161093f565b915060e089013590509295985092959890939650565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015610ca55781516001600160a01b031687529582019590820190600101610c80565b509495945050505050565b6000815180845260208085019450808401835b83811015610ca557815187529582019590820190600101610cc3565b60008151808452815b81811015610d0457602081850181015186830182015201610ce8565b81811115610d155782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b901515815260200190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b6000602082526108dd6020830184610cdf565b600060e08252885160e080840152610dd26101c0840182610cdf565b905060208a015160df198085840301610100860152610df18383610cdf565b925060408c015191508085840301610120860152610e0f8383610c6d565b925060608c015191508085840301610140860152610e2d8383610cb0565b925060808c015191508085840301610160860152610e4b8383610c6d565b925060a08c01519150808584030161018086015250610e6a8282610c6d565b91505060c08a01516101a0840152610e85602084018a610c60565b610e926040840189610c60565b866060840152856080840152610eab60a0840186610c60565b82810360c0840152610ebd8185610cdf565b9a9950505050505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610ef857600080fd5b604052919050565b600067ffffffffffffffff821115610f16578081fd5b5060209081020190565b6001600160a01b03811681146107af57600080fdfea264697066735822122066e8ff4d1e877bd80e06651fc94dac70f1f249424c841aced4ddd4bbaf9af10b64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/index.ts b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/index.ts new file mode 100644 index 0000000..34b86e1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/index.ts @@ -0,0 +1,93 @@ +import { ethers } from 'hardhat'; +import { ZERO_ADDRESS, ZERO_BYTES32 } from '@helpers/constants'; +import { bn, fp } from '@helpers/numbers'; +import * as expectEvent from '@helpers/expectEvent'; + +import { getContractDeploymentTransactionHash, saveContractDeploymentTransactionHash } from '@src'; +import { Task, TaskMode, TaskRunOptions } from '@src'; +import { WeightedPoolDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as WeightedPoolDeployment; + + const args = [input.Vault, input.ProtocolFeePercentagesProvider, input.FactoryVersion, input.PoolVersion]; + const factory = await task.deployAndVerify('WeightedPoolFactory', args, from, force); + + if (task.mode === TaskMode.LIVE) { + // We also create a Pool using the factory and verify it, to let us compute their action IDs and so that future + // Pools are automatically verified. We however don't run any of this code in CHECK mode, since we don't care about + // the contracts deployed here. The action IDs will be checked to be correct via a different mechanism. + const newWeightedPoolParams = { + name: 'DO NOT USE - Mock Weighted Pool', + symbol: 'TEST', + tokens: [input.WETH, input.BAL].sort(function (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()); + }), + normalizedWeights: [fp(0.8), fp(0.2)], + rateProviders: [ZERO_ADDRESS, ZERO_ADDRESS], + assetManagers: [ZERO_ADDRESS, ZERO_ADDRESS], + swapFeePercentage: bn(1e12), + }; + + // The pauseWindowDuration and bufferPeriodDuration will be filled in later, but we need to declare them here to + // appease the type system. Those are constructor arguments, but automatically provided by the factory. + const mockPoolArgs = { + params: newWeightedPoolParams, + vault: input.Vault, + protocolFeeProvider: input.ProtocolFeePercentagesProvider, + pauseWindowDuration: undefined, + bufferPeriodDuration: undefined, + owner: ZERO_ADDRESS, + version: input.PoolVersion, + }; + + // This mimics the logic inside task.deploy + if (force || !task.output({ ensure: false })['MockWeightedPool']) { + const poolCreationReceipt = await ( + await factory.create( + mockPoolArgs.params.name, + mockPoolArgs.params.symbol, + mockPoolArgs.params.tokens, + mockPoolArgs.params.normalizedWeights, + mockPoolArgs.params.rateProviders, + mockPoolArgs.params.swapFeePercentage, + mockPoolArgs.owner, + ZERO_BYTES32 + ) + ).wait(); + const event = expectEvent.inReceipt(poolCreationReceipt, 'PoolCreated'); + const mockPoolAddress = event.args.pool; + + await saveContractDeploymentTransactionHash(mockPoolAddress, poolCreationReceipt.transactionHash, task.network); + await task.save({ MockWeightedPool: mockPoolAddress }); + } + + const mockPool = await task.instanceAt('WeightedPool', task.output()['MockWeightedPool']); + + // In order to verify the Pool's code, we need to complete its constructor arguments by computing the factory + // provided arguments (pause durations). + + // The durations require knowing when the Pool was created, so we look for the timestamp of its creation block. + const txHash = await getContractDeploymentTransactionHash(mockPool.address, task.network); + const tx = await ethers.provider.getTransactionReceipt(txHash); + const poolCreationBlock = await ethers.provider.getBlock(tx.blockNumber); + + // With those and the period end times, we can compute the durations. + const { pauseWindowEndTime, bufferPeriodEndTime } = await mockPool.getPausedState(); + mockPoolArgs.pauseWindowDuration = pauseWindowEndTime.sub(poolCreationBlock.timestamp); + mockPoolArgs.bufferPeriodDuration = bufferPeriodEndTime + .sub(poolCreationBlock.timestamp) + .sub(mockPoolArgs.pauseWindowDuration); + + // We are now ready to verify the Pool + await task.verify('WeightedPool', mockPool.address, [ + mockPoolArgs.params, + mockPoolArgs.vault, + mockPoolArgs.protocolFeeProvider, + mockPoolArgs.pauseWindowDuration, + mockPoolArgs.bufferPeriodDuration, + mockPoolArgs.owner, + mockPoolArgs.version, + ]); + } +}; diff --git a/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/input.ts b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/input.ts new file mode 100644 index 0000000..bb9097f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/input.ts @@ -0,0 +1,26 @@ +import { Task, TaskMode } from '@src'; + +export type WeightedPoolDeployment = { + Vault: string; + ProtocolFeePercentagesProvider: string; + FactoryVersion: string; + PoolVersion: string; + WETH: string; + BAL: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); +const WETH = new Task('00000000-tokens', TaskMode.READ_ONLY); +const BAL = new Task('00000000-tokens', TaskMode.READ_ONLY); + +const BaseVersion = { version: 4, deployment: '20230320-weighted-pool-v4' }; + +export default { + Vault, + ProtocolFeePercentagesProvider, + WETH, + BAL, + FactoryVersion: JSON.stringify({ name: 'WeightedPoolFactory', ...BaseVersion }), + PoolVersion: JSON.stringify({ name: 'WeightedPool', ...BaseVersion }), +}; diff --git a/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/arbitrum.json b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/arbitrum.json new file mode 100644 index 0000000..54b84fa --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/arbitrum.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0xc7E5ED1054A24Ef31D827E6F86caA58B3Bc168d7", + "MockWeightedPool": "0x129C6402FF88611Aa59BF2e14B39e091822e2C9c" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/avalanche.json b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/avalanche.json new file mode 100644 index 0000000..364be0f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/avalanche.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a", + "MockWeightedPool": "0xb2b5B452d53401391155EA48C4451f6E9b0dD058" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/base.json b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/base.json new file mode 100644 index 0000000..9442194 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/base.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0x4C32a8a8fDa4E24139B51b456B42290f51d6A1c4", + "MockWeightedPool": "0xd9dbbfAA703f3C33838365aE00fE4EB22CdF8d46" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/bsc.json b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/bsc.json new file mode 100644 index 0000000..da58992 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/bsc.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a", + "MockWeightedPool": "0xE7eE2d64bCB1B2C915898E9DA0947DA1D413DCAF" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/gnosis.json b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/gnosis.json new file mode 100644 index 0000000..94abeb7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/gnosis.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0x6CaD2ea22BFA7F4C14Aae92E47F510Cd5C509bc7", + "MockWeightedPool": "0xd8752f9b0A2c2813796AbD2bE212A32FFd656EF1" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/goerli.json b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/goerli.json new file mode 100644 index 0000000..b63e047 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/goerli.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a", + "MockWeightedPool": "0x072ED560cc042d7aB1c080a9e4fA8C6f4858dEb3" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/mainnet.json b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/mainnet.json new file mode 100644 index 0000000..44642e8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0x897888115Ada5773E02aA29F775430BFB5F34c51", + "MockWeightedPool": "0x8055b8C947De30130BC1Ec750C8F345a50006B23" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/mode.json b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/mode.json new file mode 100644 index 0000000..c6354db --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/mode.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0xc3ccacE87f6d3A81724075ADcb5ddd85a8A1bB68", + "MockWeightedPool": "0xCb528CFe5EfC65a77901d20B3E899Ecd9A8190b7" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/optimism.json b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/optimism.json new file mode 100644 index 0000000..a3e51a4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/optimism.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a", + "MockWeightedPool": "0x62F5f9a446d198E8E4c84eE56e5217416720EdAF" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/polygon.json b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/polygon.json new file mode 100644 index 0000000..c142ea3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/polygon.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0xFc8a407Bba312ac761D8BFe04CE1201904842B76", + "MockWeightedPool": "0xb77E03655ee894AadE216A83D05511A9F9895126" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/sepolia.json b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/sepolia.json new file mode 100644 index 0000000..1a40a35 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/sepolia.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0x7920BFa1b2041911b354747CA7A6cDD2dfC50Cfd", + "MockWeightedPool": "0xf7a7E1F48FA43cb7919Ff4Eb362c5bE78092dF4A" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/zkevm.json b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/zkevm.json new file mode 100644 index 0000000..d2f2d76 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/output/zkevm.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0x03F3Fb107e74F2EAC9358862E91ad3c692712054", + "MockWeightedPool": "0x78385153d2f356C87001F09BB5424137c618D38b" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/readme.md b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/readme.md new file mode 100644 index 0000000..632ff48 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/readme.md @@ -0,0 +1,19 @@ +# 2023-03-20 - Weighted Pool Factory V4 + +Deployment of the `WeightedPoolFactory`, which allows creating Weighted Pools using `create2` instead of `create`. +Supersedes `20230206-weighted-pool-v3`. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`WeightedPoolFactory` artifact](./artifact/WeightedPoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/test/task.fork.ts b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/test/task.fork.ts new file mode 100644 index 0000000..387fbb5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230320-weighted-pool-v4/test/task.fork.ts @@ -0,0 +1,353 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { sharedBeforeEach } from '@helpers/sharedBeforeEach'; +import { BasePoolEncoder } from '@helpers/models/pools/utils/encoder'; +import { WeightedPoolEncoder } from '@helpers/models/pools/weighted/encoder'; +import { SwapKind } from '@helpers/models/types/types'; +import { toNormalizedWeights } from '@helpers/models/pools/weighted/normalizedWeights'; +import * as expectEvent from '@helpers/expectEvent'; +import { fp } from '@helpers/numbers'; +import { expectEqualWithError } from '@helpers/relativeError'; +import { actionId } from '@helpers/models/misc/actions'; +import { MAX_UINT256, ONES_BYTES32, ZERO_ADDRESS, ZERO_BYTES32 } from '@helpers/constants'; +import { deploy } from '@src'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { getSigner, impersonate, getForkedNetwork, Task, TaskMode, describeForkTest } from '@src'; +import { randomBytes } from 'ethers/lib/utils'; + +describeForkTest('WeightedPool V4', 'mainnet', 16870763, function () { + let owner: SignerWithAddress, + whale: SignerWithAddress, + wstEthWhale: SignerWithAddress, + govMultisig: SignerWithAddress; + let factory: Contract, + vault: Contract, + authorizer: Contract, + uni: Contract, + comp: Contract, + aave: Contract, + wstEth: Contract, + math: Contract; + + let task: Task; + + const COMP = '0xc00e94cb662c3520282e6f5717214004a7f26888'; + const UNI = '0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984'; + const AAVE = '0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9'; + const WSTETH = '0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0'; + + const tokens = [UNI, AAVE, COMP]; + const initialBalanceCOMP = fp(1e4); + const initialBalanceUNI = fp(1e5); + const initialBalanceAAVE = fp(1e4); + const initialBalances = [initialBalanceUNI, initialBalanceAAVE, initialBalanceCOMP]; + + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + const LARGE_TOKEN_HOLDER = '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503'; + const WSTETH_TOKEN_HOLDER = '0x4b5a787ac6921cdefc57d8823ebd4d211f8e0519'; + + const NAME = 'Balancer Pool Token'; + const SYMBOL = 'BPT'; + const POOL_SWAP_FEE_PERCENTAGE = fp(0.01); + const WEIGHTS = toNormalizedWeights([fp(20), fp(30), fp(50)]); + + const COMP_WSTETH_WEIGHTED_POOL_V2 = '0x496ff26B76b8d23bbc6cF1Df1eeE4a48795490F7'; + + enum AttackType { + DISABLE_RECOVERY_MODE, + UPDATE_PROTOCOL_FEE_CACHE, + } + + before('run task', async () => { + task = new Task('20230320-weighted-pool-v4', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('WeightedPoolFactory'); + }); + + before('load signers', async () => { + owner = await getSigner(); + whale = await impersonate(LARGE_TOKEN_HOLDER); + wstEthWhale = await impersonate(WSTETH_TOKEN_HOLDER); + + govMultisig = await impersonate(GOV_MULTISIG); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + authorizer = await new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance( + 'Authorizer' + ); + const managedPoolTask = await new Task('20221021-managed-pool', TaskMode.READ_ONLY, getForkedNetwork(hre)); + const managedPoolFactory = await managedPoolTask.deployedInstance('ManagedPoolFactory'); + math = await managedPoolTask.instanceAt('ExternalWeightedMath', await managedPoolFactory.getWeightedMath()); + + comp = await task.instanceAt('IERC20', COMP); + uni = await task.instanceAt('IERC20', UNI); + aave = await task.instanceAt('IERC20', AAVE); + wstEth = await task.instanceAt('IERC20', WSTETH); + }); + + async function createPool(salt = ''): Promise { + const receipt = await ( + await factory.create( + NAME, + SYMBOL, + tokens, + WEIGHTS, + [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS], + POOL_SWAP_FEE_PERCENTAGE, + owner.address, + salt == '' ? randomBytes(32) : salt + ) + ).wait(); + + const event = expectEvent.inReceipt(receipt, 'PoolCreated'); + return task.instanceAt('WeightedPool', event.args.pool); + } + + async function initPool(poolId: string) { + await comp.connect(whale).approve(vault.address, MAX_UINT256); + await uni.connect(whale).approve(vault.address, MAX_UINT256); + await aave.connect(whale).approve(vault.address, MAX_UINT256); + + const userData = WeightedPoolEncoder.joinInit(initialBalances); + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: tokens, + maxAmountsIn: initialBalances, + fromInternalBalance: false, + userData, + }); + } + + describe('getters', () => { + it('check factory version', async () => { + const expectedFactoryVersion = { + name: 'WeightedPoolFactory', + version: 4, + deployment: '20230320-weighted-pool-v4', + }; + + expect(await factory.version()).to.equal(JSON.stringify(expectedFactoryVersion)); + }); + + it('check pool version', async () => { + const pool = await createPool(); + + const expectedPoolVersion = { + name: 'WeightedPool', + version: 4, + deployment: '20230320-weighted-pool-v4', + }; + + expect(await pool.version()).to.equal(JSON.stringify(expectedPoolVersion)); + }); + }); + + describe('create and swap', () => { + let pool: Contract; + let poolId: string; + + it('deploy a weighted pool', async () => { + pool = await createPool(); + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + + expect(registeredAddress).to.equal(pool.address); + }); + + it('initialize the pool', async () => { + await initPool(poolId); + + const { balances } = await vault.getPoolTokens(poolId); + expect(balances).to.deep.equal(initialBalances); + }); + + it('swap in the pool', async () => { + const amount = fp(500); + await comp.connect(whale).transfer(owner.address, amount); + await comp.connect(owner).approve(vault.address, amount); + + await vault + .connect(owner) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: COMP, assetOut: UNI, amount, userData: '0x' }, + { sender: owner.address, recipient: owner.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert pool swap + const expectedUNI = await math.calcOutGivenIn( + initialBalanceCOMP, + WEIGHTS[tokens.indexOf(COMP)], + initialBalanceUNI, + WEIGHTS[tokens.indexOf(UNI)], + amount + ); + expectEqualWithError(await comp.balanceOf(owner.address), 0, 0.0001); + expectEqualWithError(await uni.balanceOf(owner.address), expectedUNI, 0.1); + }); + }); + + describe('read-only reentrancy protection', () => { + let pool: Contract; + let poolId: string; + let attacker: Contract; + const attackerFunds = fp(1); + + sharedBeforeEach('deploy and fund attacker', async () => { + attacker = await deploy('ReadOnlyReentrancyAttackerWP', [vault.address]); + await comp.connect(whale).transfer(attacker.address, attackerFunds); + await uni.connect(whale).transfer(attacker.address, attackerFunds); + await aave.connect(whale).transfer(attacker.address, attackerFunds); + await wstEth.connect(wstEthWhale).transfer(attacker.address, attackerFunds); + }); + + context('when the target pool is not protected', () => { + sharedBeforeEach('get affected pool instance', async () => { + pool = await task.instanceAt('WeightedPool', COMP_WSTETH_WEIGHTED_POOL_V2); + poolId = await pool.getPoolId(); + }); + + itPerformsAttack(false); + }); + + context('when the target pool is protected', () => { + sharedBeforeEach('deploy pool and attacker', async () => { + pool = await createPool(); + poolId = await pool.getPoolId(); + + await initPool(poolId); + }); + + itPerformsAttack(true); + }); + + function itPerformsAttack(expectRevert: boolean) { + const action = expectRevert ? 'rejects' : 'does not reject'; + + context('update protocol fee cache', () => { + it(`${action} protocol fee cache attack`, async () => { + await performAttack(AttackType.UPDATE_PROTOCOL_FEE_CACHE, expectRevert); + }); + }); + + context('disable recovery mode', () => { + sharedBeforeEach('grant permissions to attacker', async () => { + await authorizer + .connect(govMultisig) + .grantRole(await actionId(pool, 'disableRecoveryMode'), attacker.address); + }); + + it(`${action} disable recovery mode attack`, async () => { + await performAttack(AttackType.DISABLE_RECOVERY_MODE, expectRevert); + }); + }); + } + + async function performAttack(attackType: AttackType, expectRevert: boolean) { + const attackTokens = (await vault.getPoolTokens(poolId)).tokens; + + const joinRequest = { + assets: attackTokens, + maxAmountsIn: Array(attackTokens.length).fill(MAX_UINT256), + userData: WeightedPoolEncoder.joinExactTokensInForBPTOut(Array(attackTokens.length).fill(attackerFunds), 0), + fromInternalBalance: false, + }; + + const attack = attacker.startAttack(poolId, joinRequest, attackType, { value: 10 }); + if (expectRevert) { + await expect(attack).to.be.revertedWith('BAL#420'); + } else { + await expect(attack).to.not.be.reverted; + } + } + }); + + describe('recovery mode', () => { + let pool: Contract; + let poolId: string; + + before('deploy and initialize a weighted pool', async () => { + pool = await createPool(); + poolId = await pool.getPoolId(); + + await comp.connect(whale).approve(vault.address, MAX_UINT256); + await uni.connect(whale).approve(vault.address, MAX_UINT256); + await aave.connect(whale).approve(vault.address, MAX_UINT256); + + const userData = WeightedPoolEncoder.joinInit(initialBalances); + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: tokens, + maxAmountsIn: initialBalances, + fromInternalBalance: false, + userData, + }); + }); + + before('enter recovery mode', async () => { + await authorizer.connect(govMultisig).grantRole(await actionId(pool, 'enableRecoveryMode'), govMultisig.address); + await pool.connect(govMultisig).enableRecoveryMode(); + expect(await pool.inRecoveryMode()).to.be.true; + }); + + it('can exit via recovery mode', async () => { + const bptBalance = await pool.balanceOf(owner.address); + expect(bptBalance).to.gt(0); + + const vaultUNIBalanceBeforeExit = await uni.balanceOf(vault.address); + const ownerUNIBalanceBeforeExit = await uni.balanceOf(owner.address); + + const userData = BasePoolEncoder.recoveryModeExit(bptBalance); + await vault.connect(owner).exitPool(poolId, owner.address, owner.address, { + assets: tokens, + minAmountsOut: Array(tokens.length).fill(0), + fromInternalBalance: false, + userData, + }); + + const remainingBalance = await pool.balanceOf(owner.address); + expect(remainingBalance).to.equal(0); + + const vaultUNIBalanceAfterExit = await uni.balanceOf(vault.address); + const ownerUNIBalanceAfterExit = await uni.balanceOf(owner.address); + + expect(vaultUNIBalanceAfterExit).to.lt(vaultUNIBalanceBeforeExit); + expect(ownerUNIBalanceAfterExit).to.gt(ownerUNIBalanceBeforeExit); + }); + }); + + describe('create2 functionality', () => { + it('can be deployed with a different salt', async () => { + const pool = await createPool(ZERO_BYTES32); + const pool2 = await createPool(ONES_BYTES32); + + expect(pool2.address).to.not.equal(pool.address); + }); + }); + + describe('factory disable', () => { + it('the factory can be disabled', async () => { + await authorizer.connect(govMultisig).grantRole(await actionId(factory, 'disable'), govMultisig.address); + await factory.connect(govMultisig).disable(); + + expect(await factory.isDisabled()).to.be.true; + + await expect( + factory + .connect(owner) + .create( + NAME, + SYMBOL, + tokens, + WEIGHTS, + [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS], + POOL_SWAP_FEE_PERCENTAGE, + owner.address, + randomBytes(32) + ) + ).to.be.revertedWith('BAL#211'); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/artifact/L2LayerZeroBridgeForwarder.json b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/artifact/L2LayerZeroBridgeForwarder.json new file mode 100644 index 0000000..0802f8f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/artifact/L2LayerZeroBridgeForwarder.json @@ -0,0 +1,126 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "L2LayerZeroBridgeForwarder", + "sourceName": "contracts/L2LayerZeroBridgeForwarder.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IL2LayerZeroDelegation", + "name": "newImplementation", + "type": "address" + } + ], + "name": "DelegationImplementationUpdated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDelegationImplementation", + "outputs": [ + { + "internalType": "contract IL2LayerZeroDelegation", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "onVeBalBridged", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "onVeBalSupplyUpdate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IL2LayerZeroDelegation", + "name": "delegation", + "type": "address" + } + ], + "name": "setDelegation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60c060405234801561001057600080fd5b506040516106cf3803806106cf8339818101604052602081101561003357600080fd5b5051306080819052606082901b6001600160601b03191660a052906001600160a01b031661065b610074600039806102135250806101a6525061065b6000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806396345fb51161005b57806396345fb51461010c578063aaabadc514610116578063df130bfe1461011e578063e6b3e704146101515761007d565b806363408a9014610082578063851c1bb3146100b35780638d928af814610104575b600080fd5b61008a610184565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6100f2600480360360208110156100c957600080fd5b50357fffffffff00000000000000000000000000000000000000000000000000000000166101a0565b60408051918252519081900360200190f35b61008a610211565b610114610235565b005b61008a6102d5565b6101146004803603602081101561013457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610355565b6101146004803603602081101561016757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610400565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60005473ffffffffffffffffffffffffffffffffffffffff16156102d35760008054604080517f96345fb5000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff909216926396345fb59260048084019382900301818387803b1580156102ba57600080fd5b505af11580156102ce573d6000803e3d6000fd5b505050505b565b60006102df610211565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561032457600080fd5b505afa158015610338573d6000803e3d6000fd5b505050506040513d602081101561034e57600080fd5b5051905090565b60005473ffffffffffffffffffffffffffffffffffffffff16156103fd5760008054604080517fdf130bfe00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301529151919092169263df130bfe926024808201939182900301818387803b1580156103e457600080fd5b505af11580156103f8573d6000803e3d6000fd5b505050505b50565b610408610475565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917fb2f6d9cc189e4fc02519ab5ba6d9455bedc32091e375e8a6383ed45f40653e7491a250565b60006104a46000357fffffffff00000000000000000000000000000000000000000000000000000000166101a0565b90506103fd6104b382336104bb565b610191610584565b60006104c56102d5565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b15801561055157600080fd5b505afa158015610565573d6000803e3d6000fd5b505050506040513d602081101561057b57600080fd5b50519392505050565b816105925761059281610596565b5050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526103fd917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fdfea2646970667358221220cdf8ea00026c3e71fc22041b4b3bec9e36650a0d3b02b79e2a5c8fd2d6bd155864736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c806396345fb51161005b57806396345fb51461010c578063aaabadc514610116578063df130bfe1461011e578063e6b3e704146101515761007d565b806363408a9014610082578063851c1bb3146100b35780638d928af814610104575b600080fd5b61008a610184565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6100f2600480360360208110156100c957600080fd5b50357fffffffff00000000000000000000000000000000000000000000000000000000166101a0565b60408051918252519081900360200190f35b61008a610211565b610114610235565b005b61008a6102d5565b6101146004803603602081101561013457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610355565b6101146004803603602081101561016757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610400565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60005473ffffffffffffffffffffffffffffffffffffffff16156102d35760008054604080517f96345fb5000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff909216926396345fb59260048084019382900301818387803b1580156102ba57600080fd5b505af11580156102ce573d6000803e3d6000fd5b505050505b565b60006102df610211565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561032457600080fd5b505afa158015610338573d6000803e3d6000fd5b505050506040513d602081101561034e57600080fd5b5051905090565b60005473ffffffffffffffffffffffffffffffffffffffff16156103fd5760008054604080517fdf130bfe00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301529151919092169263df130bfe926024808201939182900301818387803b1580156103e457600080fd5b505af11580156103f8573d6000803e3d6000fd5b505050505b50565b610408610475565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917fb2f6d9cc189e4fc02519ab5ba6d9455bedc32091e375e8a6383ed45f40653e7491a250565b60006104a46000357fffffffff00000000000000000000000000000000000000000000000000000000166101a0565b90506103fd6104b382336104bb565b610191610584565b60006104c56102d5565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b15801561055157600080fd5b505afa158015610565573d6000803e3d6000fd5b505050506040513d602081101561057b57600080fd5b50519392505050565b816105925761059281610596565b5050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526103fd917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fdfea2646970667358221220cdf8ea00026c3e71fc22041b4b3bec9e36650a0d3b02b79e2a5c8fd2d6bd155864736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/index.ts b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/index.ts new file mode 100644 index 0000000..09b71b4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/index.ts @@ -0,0 +1,7 @@ +import { L2Layer0BridgeForwarderDeployment } from './input'; +import { Task, TaskRunOptions } from '@src'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as L2Layer0BridgeForwarderDeployment; + await task.deployAndVerify('L2LayerZeroBridgeForwarder', [input.Vault], from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/input.ts b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/input.ts new file mode 100644 index 0000000..957d5c7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type L2Layer0BridgeForwarderDeployment = { + Vault: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, +}; diff --git a/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/arbitrum.json b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/arbitrum.json new file mode 100644 index 0000000..40c5689 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "L2LayerZeroBridgeForwarder": "0x12Ca9De662A7Bf5Dc89e034a5083eF751B08EDe7" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/avalanche.json b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/avalanche.json new file mode 100644 index 0000000..b9ff87a --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/avalanche.json @@ -0,0 +1,3 @@ +{ + "L2LayerZeroBridgeForwarder": "0x4638ab64022927C9bD5947607459D13f57f1551C" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/base.json b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/base.json new file mode 100644 index 0000000..b9841dc --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/base.json @@ -0,0 +1,3 @@ +{ + "L2LayerZeroBridgeForwarder": "0x8eA89804145c007e7D226001A96955ad53836087" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/bsc.json b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/bsc.json new file mode 100644 index 0000000..70decfc --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/bsc.json @@ -0,0 +1,3 @@ +{ + "L2LayerZeroBridgeForwarder": "0x20AabBC59F3cE58e0ef931380d8Bf2A6fE681019" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/gnosis.json b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/gnosis.json new file mode 100644 index 0000000..5214b9b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "L2LayerZeroBridgeForwarder": "0xeb151668006CD04DAdD098AFd0a82e78F77076c3" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/goerli.json b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/goerli.json new file mode 100644 index 0000000..e7a7043 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/goerli.json @@ -0,0 +1,3 @@ +{ + "L2LayerZeroBridgeForwarder": "0xEF44D6786b2b4d544b7850Fe67CE6381626Bf2D6" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/optimism.json b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/optimism.json new file mode 100644 index 0000000..c3aeb06 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/optimism.json @@ -0,0 +1,3 @@ +{ + "L2LayerZeroBridgeForwarder": "0xbef13D1e54D0c79DA8B0AD704883E1Cea7EB2100" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/polygon.json b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/polygon.json new file mode 100644 index 0000000..e9dcb64 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/polygon.json @@ -0,0 +1,3 @@ +{ + "L2LayerZeroBridgeForwarder": "0xB98F54A74590a6e681fF664b2Fa22EBfFe1a929E" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/sepolia.json b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/sepolia.json new file mode 100644 index 0000000..ce69d68 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "L2LayerZeroBridgeForwarder": "0xc7E5ED1054A24Ef31D827E6F86caA58B3Bc168d7" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/zkevm.json b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/zkevm.json new file mode 100644 index 0000000..16ae6b7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/output/zkevm.json @@ -0,0 +1,3 @@ +{ + "L2LayerZeroBridgeForwarder": "0xDEd7Fef7D8eCdcB74F22f0169e1A9EC696e6695d" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/readme.md b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/readme.md new file mode 100644 index 0000000..f353b33 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/readme.md @@ -0,0 +1,17 @@ +# 2023-04-04 - L2 Layer0 Bridge Forwarder + +Deployment of `L2LayerZeroBridgeForwarder`, which is called by the Layer0 contracts in the child chains when state updates are pushed. This contract can be connected to a third one that can carry out tasks associated with the state update. + +## Useful Files + +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`L2LayerZeroBridgeForwarder` artifact](./artifact/L2LayerZeroBridgeForwarder.json) diff --git a/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/test/task.fork.ts b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/test/task.fork.ts new file mode 100644 index 0000000..424c648 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230404-l2-layer0-bridge-forwarder/test/task.fork.ts @@ -0,0 +1,67 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import { fp } from '@helpers/numbers'; +import { actionId } from '@helpers/models/misc/actions'; +import * as expectEvent from '@helpers/expectEvent'; + +import { describeForkTest } from '@src'; +import { Task, TaskMode } from '@src'; +import { getForkedNetwork } from '@src'; +import { impersonate } from '@src'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { randomAddress, ZERO_ADDRESS } from '@helpers/constants'; + +describeForkTest('L2Layer0BridgeForwarder', 'arbitrum', 70407500, function () { + let vault: Contract, authorizer: Contract; + let forwarder: Contract; + let admin: SignerWithAddress, other: SignerWithAddress; + let delegation: string; + + let task: Task; + + const GOV_MULTISIG = '0xaf23dc5983230e9eeaf93280e312e57539d098d0'; + + before('run task', async () => { + task = new Task('20230404-l2-layer0-bridge-forwarder', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + forwarder = await task.deployedInstance('L2LayerZeroBridgeForwarder'); + }); + + before('setup accounts', async () => { + [, admin, other] = await ethers.getSigners(); + delegation = randomAddress(); + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.deployedInstance('Vault'); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + }); + + before('grant set and kill delegation permissions to admin', async () => { + const govMultisig = await impersonate(GOV_MULTISIG, fp(100)); + + await authorizer.connect(govMultisig).grantRole(await actionId(forwarder, 'setDelegation'), admin.address); + }); + + it('returns empty delegation', async () => { + expect(await forwarder.getDelegationImplementation()).to.be.eq(ZERO_ADDRESS); + }); + + it('reverts if non-admin sets a new delegation', async () => { + // SENDER_NOT_ALLOWED + await expect(forwarder.connect(other).setDelegation(delegation)).to.be.revertedWith('BAL#401'); + }); + + it('sets a new delegation', async () => { + const tx = await forwarder.connect(admin).setDelegation(delegation); + + expectEvent.inReceipt(await tx.wait(), 'DelegationImplementationUpdated', { + newImplementation: delegation, + }); + + expect(await forwarder.getDelegationImplementation()).to.be.eq(delegation); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/artifact/ERC4626LinearPool.json b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/artifact/ERC4626LinearPool.json new file mode 100644 index 0000000..4d1b2e4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/artifact/ERC4626LinearPool.json @@ -0,0 +1,1245 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ERC4626LinearPool", + "sourceName": "contracts/erc4626-linear-pool/ERC4626LinearPool.sol", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "assetManager", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + } + ], + "internalType": "struct ERC4626LinearPool.ConstructorArgs", + "name": "args", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "paused", + "type": "bool" + } + ], + "name": "PausedStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "RecoveryModeStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + } + ], + "name": "SwapFeePercentageChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lowerTarget", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + } + ], + "name": "TargetsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "enableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBptIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMainIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMainToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getNextNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPausedState", + "outputs": [ + { + "internalType": "bool", + "name": "paused", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "pauseWindowEndTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodEndTime", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeesCollector", + "outputs": [ + { + "internalType": "contract IProtocolFeesCollector", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getScalingFactors", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSwapFeePercentage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTargets", + "outputs": [ + { + "internalType": "uint256", + "name": "lowerTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVirtualSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedTokenRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "inRecoveryMode", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onExitPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "dueProtocolFees", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onJoinPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "dueProtocolFees", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IERC20", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IPoolSwapStructs.SwapRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "indexIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "indexOut", + "type": "uint256" + } + ], + "name": "onSwap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IERC20", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IPoolSwapStructs.SwapRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "balanceTokenIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balanceTokenOut", + "type": "uint256" + } + ], + "name": "onSwap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryExit", + "outputs": [ + { + "internalType": "uint256", + "name": "bptIn", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryJoin", + "outputs": [ + { + "internalType": "uint256", + "name": "bptOut", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + } + ], + "name": "setSwapFeePercentage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newLowerTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newUpperTarget", + "type": "uint256" + } + ], + "name": "setTargets", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6102c06040523480156200001257600080fd5b506040516200597838038062005978833981016040819052620000359162000ddf565b6101608101518151602083015160408401516060850151608086015160c0870151620000618862000455565b60e08901516101008a01516101208b01516101408c01518a6200009e8160006200008c8c8c620004de565b896200058f60201b620014241760201c565b8b8b86868686838387878b86336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000ed92919062000c68565b5080516200010390600490602084019062000c68565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001829050630163f5008311156101946200075d565b620001966276a7008211156101956200075d565b4291909101610140819052016101605260601b6001600160601b031916610180526101a08690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000db9565b6001600160a01b03166101c0816001600160a01b031660601b8152505050505050505050876001600160a01b03166101e0816001600160a01b031660601b81525050866001600160a01b0316610200816001600160a01b031660601b81525050866001600160a01b0316886001600160a01b031610620002bb576002620002be565b60015b60ff16610220526001600160a01b0380881690891610620002e1576001620002e4565b60025b60ff1661024052620002f68862000772565b61026052620003058762000772565b610280526000620003188982896200081e565b620003238562000918565b5050505050505050505050506200034081620009a760201b60201c565b50600081608001516001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038157600080fd5b505afa15801562000396573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003bc919062000f36565b60ff169050600082606001516001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200040157600080fd5b505afa15801562000416573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200043c919062000f36565b60ff16909103601201600a0a6102a052506200105c9050565b6040805160028082526060808301845292839291906020830190803683370190505090508260a00151816000815181106200048c57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260a0015181600181518110620004bf57fe5b6001600160a01b03909216602092830291909101909101529050919050565b60408051600280825260608281019093526001600160a01b03848116908616109183918160200160208202803683370190505090508162000520578362000522565b845b816000815181106200053057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050816200055d57846200055f565b835b816001815181106200056d57fe5b6001600160a01b03909216602092830291909101909101529150505b92915050565b6000620005a783620009bc60201b620015d91760201c565b606083516001016001600160401b0381118015620005c457600080fd5b50604051908082528060200260200182016040528015620005ef578160200160208202803683370190505b50905030816000815181106200060157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b845181101562000674578481815181106200063b57fe5b60200260200101518282600101815181106200065357fe5b6001600160a01b039092166020928302919091019091015260010162000624565b50606083516001016001600160401b03811180156200069257600080fd5b50604051908082528060200260200182016040528015620006bd578160200160208202803683370190505b509050600081600081518110620006d057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b845181101562000743578481815181106200070a57fe5b60200260200101518282600101815181106200072257fe5b6001600160a01b0390921660209283029190910190910152600101620006f3565b506200075287878484620009c8565b979650505050505050565b816200076e576200076e8162000ac2565b5050565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620007af57600080fd5b505afa158015620007c4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007ea919062000f36565b60ff16905060006200080960128362000ad760201b620015e71760201c565b600a0a670de0b6b3a764000002949350505050565b6200082f8183111561014c6200075d565b6200084c6b0de0b6b39983494c589c000082111561014d6200075d565b62000866670de0b6b3a7640000825b06156101616200075d565b6200087a670de0b6b3a7640000836200085b565b620008c9670de0b6b3a7640000820460406020620008b3670de0b6b3a764000087600854919004602080620015fd62000aef821b17811c565b62000aef60201b620015fd17909392919060201c565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906200090b908590859062001005565b60405180910390a2505050565b6200092d64e8d4a5100082101560cb6200075d565b6200094567016345785d8a000082111560ca6200075d565b620009678160c0603f60085462000aef60201b620015fd17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906200099c90839062000ffc565b60405180910390a150565b80516200076e90600990602084019062000c68565b806200076e8162000b14565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b8152600401620009f9919062000fe7565b602060405180830381600087803b15801562000a1457600080fd5b505af115801562000a29573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a4f919062000da0565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000a849084908890889060040162000f59565b600060405180830381600087803b15801562000a9f57600080fd5b505af115801562000ab4573d6000803e3d6000fd5b509298975050505050505050565b62000ad4816210905360ea1b62000ba0565b50565b600062000ae98383111560016200075d565b50900390565b600062000afe84848462000c01565b506001901b60001901811b1992909216911b1790565b60028151101562000b255762000ad4565b60008160008151811062000b3557fe5b602002602001015190506000600190505b825181101562000b9b57600083828151811062000b5f57fe5b6020026020010151905062000b90816001600160a01b0316846001600160a01b03161060656200075d60201b60201c565b915060010162000b46565b505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b62000c12610100831060646200075d565b62000c4b6001821015801562000c43575062000c3f60ff846101000362000c5c60201b620016201760201c565b8211155b60646200075d565b62000b9b83821c156101b46200075d565b80820390821102900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000cab57805160ff191683800117855562000cdb565b8280016001018555821562000cdb579182015b8281111562000cdb57825182559160200191906001019062000cbe565b5062000ce992915062000ced565b5090565b5b8082111562000ce9576000815560010162000cee565b8051620005898162001046565b600082601f83011262000d22578081fd5b81516001600160401b0381111562000d38578182fd5b602062000d4e601f8301601f1916820162001013565b9250818352848183860101111562000d6557600080fd5b60005b8281101562000d8557848101820151848201830152810162000d68565b8281111562000d975760008284860101525b50505092915050565b60006020828403121562000db2578081fd5b5051919050565b60006020828403121562000dcb578081fd5b815162000dd88162001046565b9392505050565b60006020828403121562000df1578081fd5b81516001600160401b038082111562000e08578283fd5b818401915061018080838703121562000e1f578384fd5b62000e2a8162001013565b905062000e38868462000d04565b815260208301518281111562000e4c578485fd5b62000e5a8782860162000d11565b60208301525060408301518281111562000e72578485fd5b62000e808782860162000d11565b60408301525062000e95866060850162000d04565b606082015262000ea9866080850162000d04565b608082015262000ebd8660a0850162000d04565b60a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014062000eff8782860162000d04565b90820152610160838101518381111562000f17578586fd5b62000f258882870162000d11565b918301919091525095945050505050565b60006020828403121562000f48578081fd5b815160ff8116811462000dd8578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000fa55762000f9285516200103a565b8352938301939183019160010162000f7d565b505084810360408601528551808252908201925081860190845b8181101562000ab45762000fd483516200103a565b8552938301939183019160010162000fbf565b602081016003831062000ff657fe5b91905290565b90815260200190565b918252602082015260400190565b6040518181016001600160401b03811182821017156200103257600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b038116811462000ad457600080fd5b60805160a05160c05160e0516101005160601c6101205160601c61014051610160516101805160601c6101a0516101c05160601c6101e05160601c6102005160601c610220516102405161026051610280516102a051614785620011f3600039806118595250806107f45250806107905280612a8c525080610718528061081c5280610c515280612f07528061309052806131c852806132d3528061345052806135885250806107b252806109bc5280610c175280612ed35280613015528061305c52806131525280613194528061329f52806133da528061341c528061351252806135545250806113f852806126f652806127c25280612ab25280612e885280612fa1528061325552806133665250806109e052806110ee5280611abc5280611b5b52806126ad52806127795280612a515280612e495280612f4b52806130de52806132165280613317528061349e5250806111cc5250806109495250508061181d5250806117f9525080610fd1525080610fad525080610f5d5250806123ea52508061242c52508061240b52506147856000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e3660046140b9565b610608565b604051610350919061444c565b60405180910390f35b610361610668565b6040516103509190614690565b61038161037c366004613e8b565b6106ff565b6040516103509190614429565b610343610716565b61034361073a565b6103a6610740565b60405161035093929190614434565b6103bd610769565b60405161035091906143f1565b6103816103d8366004613ddb565b610877565b6103e56108ed565b60405161035091906146ca565b6103436108f6565b61040d610408366004614176565b610905565b005b610343610947565b610381610425366004613e8b565b61096b565b61040d6109a6565b6103436109ba565b6104426109de565b6040516103509190614346565b61040d610a02565b610361610a56565b610343610ab7565b61047a610475366004613fba565b610aca565b6040516103509291906146a3565b610490610ae8565b6040516103509291906146bc565b610343610b26565b6103436104b4366004613d87565b610cbb565b6104cc6104c7366004613fba565b610cda565b604051610350929190614404565b6103436104e8366004613d87565b610d9c565b61040d610da7565b610343610f42565b61040d610f47565b61034361051336600461405d565b610f59565b610442610fab565b610442610fcf565b610343610536366004613d87565b610ff3565b61036161100e565b61034361055136600461412a565b61106f565b61040d61056436600461418e565b6110a8565b610381610577366004613e8b565b61111a565b61038161058a366004613e8b565b611158565b610442611165565b61038161116f565b61040d611180565b6104426111ca565b61040d6105bd366004613e1b565b6111ee565b6104cc6105d0366004613fba565b61126f565b6103436105e3366004613da3565b611306565b610343611343565b6103436113ec565b6104426113f6565b61034361141a565b6000846080015161063561061a610fcf565b6001600160a01b0316336001600160a01b03161460cd61162c565b61064a610640610947565b82146101f461162c565b61065261163a565b61065e8686868661164d565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b505050505090505b90565b600061070c338484611772565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074d6117da565b1592506107586117f7565b915061076261181b565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107db57fe5b6020026020010181815250506108196107f261183f565b7f000000000000000000000000000000000000000000000000000000000000000090611926565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084557fe5b602002602001018181525050670de0b6b3a76400008160008151811061086757fe5b6020908102919091010152905090565b6000806108848533611306565b90506108a8336001600160a01b03871614806108a05750838210155b61019e61162c565b6108b385858561195e565b336001600160a01b038616148015906108ce57506000198114155b156108e0576108e08533858403611772565b60019150505b9392505050565b60055460ff1690565b60006109006113ec565b905090565b61090d611a3e565b610915611a87565b600080610920610ae8565b915091506109396109318383611a97565b61014f61162c565b61094283611b9e565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070c9185906109a19086611c16565b611772565b6109ae611a3e565b6109b86000611c28565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a0a611a3e565b610a12611cb9565b610a1c6001611ccd565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4c9190614429565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906109009060c0603f611d0f565b60006060610adc888785611d1e611d35565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0582602080611d0f565b029250670de0b6b3a7640000610b1e8260406020611d0f565b029150509091565b600080610b31610947565b90506060610b3d610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b68919061444c565b60006040518083038186803b158015610b8057600080fd5b505afa158015610b94573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbc9190810190613eb6565b50915050610bd181610bcc610769565b611e9c565b600080610bdc610ae8565b91509150610be8613af8565b6040518060600160405280610bfb610ab7565b81526020018481526020018381525090506000610c87610c4e867f000000000000000000000000000000000000000000000000000000000000000081518110610c4057fe5b602002602001015184611f05565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7a57fe5b6020026020010151611f66565b9050610cb0610ca986600081518110610c9c57fe5b6020026020010151611f72565b8290611f86565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce961061a610fcf565b610cf4610640610947565b6000610cff85611fdd565b15610d2757610d0c61200c565b610d1e88610d1861073a565b8761201f565b94509050610d3f565b610d2f61163a565b610d3a8a8987611d1e565b945090505b610d498a82612115565b835167ffffffffffffffff81118015610d6157600080fd5b50604051908082528060200260200182016040528015610d8b578160200160208202803683370190505b509250505097509795505050505050565b600061071082610ff3565b6000610db1610947565b90506060610dbd610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de8919061444c565b60006040518083038186803b158015610e0057600080fd5b505afa158015610e14573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3c9190810190613eb6565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e8057fe5b602002602001018181525050610e94613b19565b6040518060800160405280610ea8856106fc565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed9610fcf565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f0a9493929190614474565b600060405180830381600087803b158015610f2457600080fd5b505af1158015610f38573d6000803e3d6000fd5b5050505050505050565b600090565b610f4f611a3e565b6109b86001611c28565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8e9291906142d0565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108161061a610fcf565b61108c610640610947565b61109461163a565b61109f85858561211f565b95945050505050565b6110b0611a3e565b6110b8611a87565b6000806110c3610ae8565b915091506110d46109318383611a97565b6110e96110e18585611a97565b61015761162c565b6111147f0000000000000000000000000000000000000000000000000000000000000000858561212c565b50505050565b6000806111273385611306565b90508083106111415761113c33856000611772565b61114e565b61114e3385858403611772565b5060019392505050565b600061070c33848461195e565b6000610900612202565b6008546000906109009060ff61227c565b611188611a3e565b61119061200c565b61119a6000611ccd565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4c9190614429565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121d8c610ff3565b8960405160200161123396959493929190614561565b604051602081830303815290604052805190602001209050611264888261125b878787612283565b886101f86122c2565b610f38888888611772565b6060808861127e61061a610fcf565b611289610640610947565b600061129361163a565b61129b61073a565b6112ed576112aa8a8a87612319565b945090506112c36112b9610f42565b82101560cc61162c565b6112d560006112d0610f42565b6123b1565b6112e8896112e1610f42565b83036123b1565b610d49565b6112f88a8987611d1e565b94509050610d4989826123b1565b6000611310610fcf565b6001600160a01b0316826001600160a01b031614156113325750600019610710565b61133c83836123bb565b9050610710565b6000806000611350610fcf565b6001600160a01b031663b05f8e48611366610947565b306040518363ffffffff1660e01b8152600401611384929190614647565b60806040518083038186803b15801561139c57600080fd5b505afa1580156113b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d491906141af565b5050915091506113e5818301611f72565b9250505090565b60006109006123e6565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061090061183f565b600061142f836115d9565b6060835160010167ffffffffffffffff8111801561144c57600080fd5b50604051908082528060200260200182016040528015611476578160200160208202803683370190505b509050308160008151811061148757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f6578481815181106114bf57fe5b60200260200101518282600101815181106114d657fe5b6001600160a01b03909216602092830291909101909101526001016114aa565b506060835160010167ffffffffffffffff8111801561151457600080fd5b5060405190808252806020026020018201604052801561153e578160200160208202803683370190505b50905060008160008151811061155057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115bf5784818151811061158857fe5b602002602001015182826001018151811061159f57fe5b6001600160a01b0390921660209283029190910190910152600101611573565b506115cc87878484612483565b925050505b949350505050565b806115e38161258c565b5050565b60006115f783831115600161162c565b50900390565b600061160a848484612605565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e3576115e38161264b565b6109b86116456117da565b61019261162c565b60006116696003841080156116625750600383105b606461162c565b6060611673610769565b905061167f8582611e9c565b60008061168a610ae8565b91509150611696613af8565b60405180606001604052806116a9610ab7565b81526020810185905260400183905290506000895160018111156116c957fe5b141561172d576116f089606001518589815181106116e357fe5b6020026020010151612675565b60608a015260006117028a8a84612681565b90506117218186898151811061171457fe5b6020026020010151612748565b955050505050506115d1565b61174189606001518588815181106116e357fe5b60608a015260006117538a8a84612754565b905061172181868a8151811061176557fe5b6020026020010151612809565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cd90859061444c565b60405180910390a3505050565b60006117e461181b565b42118061090057505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006118496113f6565b6001600160a01b03166307a2d13a7f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401611894919061444c565b60206040518083038186803b1580156118ac57600080fd5b505afa9250505080156118dc575060408051601f3d908101601f191682019092526118d991810190613fa2565b60015b61191f573d80801561190a576040519150601f19603f3d011682016040523d82523d6000602084013e61190f565b606091505b5061191981612815565b506106fc565b90506106fc565b600082820261194a84158061194357508385838161194057fe5b04145b600361162c565b670de0b6b3a7640000815b04949350505050565b6119756001600160a01b038416151561019861162c565b61198c6001600160a01b038316151561019961162c565b611997838383610942565b6001600160a01b0383166000908152602081905260409020546119bd90826101a061289c565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119ec9082611c16565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cd90859061444c565b6000611a6d6000357fffffffff0000000000000000000000000000000000000000000000000000000016610f59565b9050611a84611a7c82336128b2565b61019161162c565b50565b6109b8611a92610fcf565b61299b565b6000806000611aa4610fcf565b6001600160a01b031663b05f8e48611aba610947565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611af8929190614647565b60806040518083038186803b158015611b1057600080fd5b505afa158015611b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4891906141af565b5050915091506000611b84828401611b7f7f0000000000000000000000000000000000000000000000000000000000000000612a4d565b612675565b905085811015801561065e57509390931115949350505050565b611bb164e8d4a5100082101560cb61162c565b611bc767016345785d8a000082111560ca61162c565b600854611bd8908260c0603f6115fd565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611c0b90839061444c565b60405180910390a150565b60008282016108e6848210158361162c565b8015611c4857611c43611c396117f7565b421061019361162c565b611c5d565b611c5d611c5361181b565b42106101a961162c565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611c0b908390614429565b6109b8611cc461116f565b156101b561162c565b600854611cdc908260ff612b27565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611c0b908390614429565b6001901b6000190191901c1690565b60006060611d2d6103e661264b565b935093915050565b333014611e24576000306001600160a01b0316600036604051611d59929190614300565b6000604051808303816000865af19150503d8060008114611d96576040519150601f19603f3d011682016040523d82523d6000602084013e611d9b565b606091505b505090508060008114611daa57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611e06573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611e378686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611eab908290612b36565b60005b8181101561111457611ee6848281518110611ec557fe5b6020026020010151848381518110611ed957fe5b6020026020010151611926565b848281518110611ef257fe5b6020908102919091010152600101611eae565b60008160200151831015611f3e5781516020830151600091611f2a9186900390611926565b9050611f3684826115e7565b915050610710565b81604001518311611f50575081610710565b81516040830151600091611f2a91860390611926565b60006108e68383611c16565b600061071082611f8061073a565b906115e7565b6000611f95821515600461162c565b670de0b6b3a76400008302611fc7841580611fc05750670de0b6b3a7640000858381611fbd57fe5b04145b600561162c565b6001836001830304018115150291505092915050565b6000808251118015610710575060ff80168280602001905181019061200291906141ef565b60ff161492915050565b6109b861201761116f565b6101b661162c565b60006060600061202e84612b43565b90506060865167ffffffffffffffff8111801561204a57600080fd5b50604051908082528060200260200182016040528015612074578160200160208202803683370190505b5090506000612081610f42565b90506000612094898381518110610c9c57fe5b905060006120a28583612b59565b905060005b8a5181101561210457838114156120bf5760006120e5565b6120e5828c83815181106120cf57fe5b602002602001015161192690919063ffffffff16565b8582815181106120f157fe5b60209081029190910101526001016120a7565b509399929850919650505050505050565b6115e38282612b99565b60006108e66103e661264b565b61213b8183111561014c61162c565b6121566b0de0b6b39983494c589c000082111561014d61162c565b61216e670de0b6b3a7640000825b061561016161162c565b612180670de0b6b3a764000083612164565b6121b5670de0b6b3a76400008204604060206121ad670de0b6b3a7640000876008549190046020806115fd565b9291906115fd565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121f590859085906146bc565b60405180910390a2505050565b600061220c610fcf565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561224457600080fd5b505afa158015612258573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610900919061409d565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b60006122cd85612c65565b90506122e36122dd878387612c81565b8361162c565b6122f2428410156101b861162c565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606123346001600160a01b038616301461015661162c565b61234b6001600160a01b038516301461015661162c565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff8160008151811061239a57fe5b602090810291909101015290969095509350505050565b6115e38282612d30565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612453612dc3565b3060405160200161246895949392919061461b565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016124b2919061467c565b602060405180830381600087803b1580156124cc57600080fd5b505af11580156124e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125049190613fa2565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d29061255090849088908890600401614595565b600060405180830381600087803b15801561256a57600080fd5b505af115801561257e573d6000803e3d6000fd5b509298975050505050505050565b60028151101561259b57611a84565b6000816000815181106125aa57fe5b602002602001015190506000600190505b82518110156109425760008382815181106125d257fe5b602002602001015190506125fb816001600160a01b0316846001600160a01b031610606561162c565b91506001016125bb565b6126146101008310606461162c565b61263c60018210158015611662575061263260ff8461010003611620565b821115606461162c565b61094283821c156101b461162c565b611a84817f42414c0000000000000000000000000000000000000000000000000000000000612dc7565b60006108e68383611926565b60208301516000906001600160a01b03163014156126ab576126a4848484612e42565b90506108e6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b031614156126f4576126a4848484612f9a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b0316141561273d576126a48484846130d7565b6108e661013561264b565b60006108e68383612b59565b60408301516000906001600160a01b0316301415612777576126a484848461320f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127c0576126a484848461335f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b0316141561273d576126a4848484613497565b60006108e68383611f86565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417612890578160208401fd5b506115e361016561264b565b60006128ab848411158361162c565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128d1610fab565b6001600160a01b0316141580156128ec57506128ec836135cf565b15612914576128f9610fab565b6001600160a01b0316336001600160a01b0316149050610710565b61291c612202565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161294b93929190614455565b60206040518083038186803b15801561296357600080fd5b505afa158015612977573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133c9190613f82565b604080516000808252602082019092526060916129ce565b6129bb613b43565b8152602001906001900390816129b35790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e8490612a1790849060040161435a565b600060405180830381600087803b158015612a3157600080fd5b505af1158015612a45573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612ab057507f0000000000000000000000000000000000000000000000000000000000000000610cd5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612afc57612af56107f261183f565b9050610cd5565b6001600160a01b038216301415612b1c5750670de0b6b3a7640000610cd5565b610cd561013561264b565b6001811b1992909216911b1790565b6115e3818314606761162c565b6000818060200190518101906108e6919061420b565b6000612b68821515600461162c565b670de0b6b3a76400008302612b90841580611fc05750670de0b6b3a7640000858381611fbd57fe5b82818161195557fe5b612bb06001600160a01b038316151561019b61162c565b612bbc82600083610942565b6001600160a01b038216600090815260208190526040902054612be290826101b261289c565b6001600160a01b038316600090815260208190526040902055612c15612c1082612c0a61073a565b90613633565b613641565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c59919061444c565b60405180910390a35050565b6000612c6f6123e6565b82604051602001610f8e929190614310565b6000612c9382516041146101b961162c565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612ccc90899085908890889061465e565b6020604051602081039080840390855afa158015612cee573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612d245750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612d3c60008383610942565b612d51612c1082612d4b61073a565b90611c16565b6001600160a01b038216600090815260208190526040902054612d749082611c16565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c5990859061444c565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612ec87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162c565b6115d18460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612efc57fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f3057fe5b6020026020010151612f4887600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612f8e57613646612f92565b6136a45b63ffffffff16565b6000612ff67f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec0575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b031630146130515761304c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061303e57fe5b60200260200101518461370d565b6115d1565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061308557fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130b957fe5b60200260200101516130d187600081518110610c9c57fe5b8661373d565b60006131337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec0575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b031630146131895761304c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061317b57fe5b6020026020010151846137a3565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131bd57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106131f157fe5b602002602001015161320987600081518110610c9c57fe5b866137e3565b60006132947f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162c565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132c857fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106132fc57fe5b602002602001015161331487600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461335a5761384a612f92565b6138a1565b60006133bb7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec0575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b031630146134115761304c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061340357fe5b60200260200101518461390b565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061344557fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061347957fe5b602002602001015161349187600081518110610c9c57fe5b86613935565b60006134f37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec0575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b031630146135495761304c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061353b57fe5b602002602001015184613984565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061357d57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106135b157fe5b60200260200101516135c987600081518110610c9c57fe5b866139b9565b60006135fa7f9f11080e00000000000000000000000000000000000000000000000000000000610f59565b821480610710575061362b7f38e9922e00000000000000000000000000000000000000000000000000000000610f59565b909114919050565b60006108e68383600161289c565b600255565b6000806136538684611f05565b905060006136618287611f66565b9050600061366f868a6115e7565b9050600061368a84611f806136848587613a0d565b8a613a27565b905061369688826115e7565b9a9950505050505050505050565b6000806136b18684611f05565b905060006136bf8287611f66565b905060006136d66136d0838b613a0d565b87613a48565b905060006136e484836115e7565b905060006136f28288613a68565b90506136fe8a826115e7565b9b9a5050505050505050505050565b60008061371a8484611f05565b9050600061373161372b8688611c16565b85611f05565b905061065e81836115e7565b6000826137555761374e8683611f05565b905061109f565b60006137618684611f05565b9050600061377261372b888a611c16565b9050600061378082846115e7565b9050600061378e8489611f66565b905061369661379d8884613a0d565b82613a48565b6000806137b08484611f05565b905060006137be82876115e7565b905060006137cc8286613a68565b90506137d886826115e7565b979650505050505050565b6000826137f157508461109f565b60006137fd8684611f05565b9050600061380b8287611f66565b90506000613819878a611c16565b905060006138278483611f66565b9050600061383e6138388984613a0d565b85613a48565b90506136fe81896115e7565b60008261385857508461109f565b60006138648684611f05565b905060006138728287611f66565b90506000613880868a611c16565b9050600061389584611f806136848587613a0d565b905061369681896115e7565b6000826138b25761374e8683613a68565b60006138be8684611f05565b905060006138cc8287611f66565b905060006138e36138dd838b613a0d565b87613a27565b905060006138f18483611c16565b905060006138ff8288613a68565b90506136fe818b6115e7565b6000806139188484611f05565b9050600061392961372b86886115e7565b905061065e82826115e7565b6000806139428684611f05565b9050600061395361372b888a6115e7565b9050600061396183836115e7565b9050600061396f8489611f66565b905061369661397e8884613a0d565b82613a27565b6000806139918484611f05565b9050600061399f8287611c16565b905060006139ad8286613a68565b90506137d881876115e7565b6000806139c68684611f05565b905060006139d48287611f66565b905060006139e2878a6115e7565b905060006139f08483611f66565b90506000613a016138388984613a0d565b90506136fe88826115e7565b60008282026108e684158061194357508385838161194057fe5b6000613a36821515600461162c565b50811515600019909201046001010290565b6000613a57821515600461162c565b818381613a6057fe5b049392505050565b60008160200151831015613ab157815161133c90613a8f90670de0b6b3a764000090611c16565b60208401518451613aab91613aa49190611926565b8690611c16565b90612b59565b81604001518311613ac3575081610710565b815161133c90613adc90670de0b6b3a7640000906115e7565b60408401518451613aab91613af19190611926565b86906115e7565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b80356107108161472b565b600082601f830112613b8e578081fd5b8135613ba1613b9c826146ff565b6146d8565b818152915060208083019084810181840286018201871015613bc257600080fd5b60005b84811015613be157813584529282019290820190600101613bc5565b505050505092915050565b600082601f830112613bfc578081fd5b8151613c0a613b9c826146ff565b818152915060208083019084810181840286018201871015613c2b57600080fd5b60005b84811015613be157815184529282019290820190600101613c2e565b600082601f830112613c5a578081fd5b813567ffffffffffffffff811115613c70578182fd5b613c836020601f19601f840116016146d8565b9150808252836020828501011115613c9a57600080fd5b8060208401602084013760009082016020015292915050565b80356002811061071057600080fd5b6000610120808385031215613cd5578182fd5b613cde816146d8565b915050613ceb8383613cb3565b8152613cfa8360208401613b73565b6020820152613d0c8360408401613b73565b6040820152606082013560608201526080820135608082015260a082013560a0820152613d3c8360c08401613b73565b60c0820152613d4e8360e08401613b73565b60e08201526101008083013567ffffffffffffffff811115613d6f57600080fd5b613d7b85828601613c4a565b82840152505092915050565b600060208284031215613d98578081fd5b81356108e68161472b565b60008060408385031215613db5578081fd5b8235613dc08161472b565b91506020830135613dd08161472b565b809150509250929050565b600080600060608486031215613def578081fd5b8335613dfa8161472b565b92506020840135613e0a8161472b565b929592945050506040919091013590565b600080600080600080600060e0888a031215613e35578283fd5b8735613e408161472b565b96506020880135613e508161472b565b955060408801359450606088013593506080880135613e6e81614740565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613e9d578182fd5b8235613ea88161472b565b946020939093013593505050565b600080600060608486031215613eca578081fd5b835167ffffffffffffffff80821115613ee1578283fd5b818601915086601f830112613ef4578283fd5b8151613f02613b9c826146ff565b80828252602080830192508086018b828387028901011115613f22578788fd5b8796505b84871015613f4d578051613f398161472b565b845260019690960195928101928101613f26565b508901519097509350505080821115613f64578283fd5b50613f7186828701613bec565b925050604084015190509250925092565b600060208284031215613f93578081fd5b815180151581146108e6578182fd5b600060208284031215613fb3578081fd5b5051919050565b600080600080600080600060e0888a031215613fd4578081fd5b873596506020880135613fe68161472b565b95506040880135613ff68161472b565b9450606088013567ffffffffffffffff80821115614012578283fd5b61401e8b838c01613b7e565b955060808a0135945060a08a0135935060c08a0135915080821115614041578283fd5b5061404e8a828b01613c4a565b91505092959891949750929550565b60006020828403121561406e578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e6578182fd5b6000602082840312156140ae578081fd5b81516108e68161472b565b600080600080608085870312156140ce578182fd5b843567ffffffffffffffff808211156140e5578384fd5b6140f188838901613cc2565b95506020870135915080821115614106578384fd5b5061411387828801613b7e565b949794965050505060408301359260600135919050565b60008060006060848603121561413e578081fd5b833567ffffffffffffffff811115614154578182fd5b61416086828701613cc2565b9660208601359650604090950135949350505050565b600060208284031215614187578081fd5b5035919050565b600080604083850312156141a0578182fd5b50508035926020909101359150565b600080600080608085870312156141c4578182fd5b84519350602085015192506040850151915060608501516141e48161472b565b939692955090935050565b600060208284031215614200578081fd5b81516108e681614740565b6000806040838503121561421d578182fd5b825161422881614740565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b8381101561427457815187529582019590820190600101614258565b509495945050505050565b15159052565b60008151808452815b818110156142aa5760208185018101518683018201520161428e565b818111156142bb5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b828110156143e457815180516004811061438d57fe5b85528087015161439f88870182614238565b5085810151868601526060808201516143ba82880182614238565b5050608090810151906143cf86820183614238565b505060a0939093019290850190600101614377565b5091979650505050505050565b6000602082526108e66020830184614245565b6000604082526144176040830185614245565b828103602084015261109f8185614245565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156144e5576144cf845161471f565b82529284019260019290920191908401906144bd565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a08701526145238185614245565b935050506040850151818584030160c08601526145408382614285565b92505050606084015161455660e085018261427f565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b818110156145dd576145cb855161471f565b835293830193918301916001016145b9565b505084810360408601528551808252908201925081860190845b8181101561257e57614609835161471f565b855293830193918301916001016145f7565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016003831061468a57fe5b91905290565b6000602082526108e66020830184614285565b6000838252604060208301526115d16040830184614245565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156146f757600080fd5b604052919050565b600067ffffffffffffffff821115614715578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114611a8457600080fd5b60ff81168114611a8457600080fdfea26469706673582212202abc871448efbae7fc96ae47c1b1ecf59114edd2396d5be66e0cdb10faeb591b64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e3660046140b9565b610608565b604051610350919061444c565b60405180910390f35b610361610668565b6040516103509190614690565b61038161037c366004613e8b565b6106ff565b6040516103509190614429565b610343610716565b61034361073a565b6103a6610740565b60405161035093929190614434565b6103bd610769565b60405161035091906143f1565b6103816103d8366004613ddb565b610877565b6103e56108ed565b60405161035091906146ca565b6103436108f6565b61040d610408366004614176565b610905565b005b610343610947565b610381610425366004613e8b565b61096b565b61040d6109a6565b6103436109ba565b6104426109de565b6040516103509190614346565b61040d610a02565b610361610a56565b610343610ab7565b61047a610475366004613fba565b610aca565b6040516103509291906146a3565b610490610ae8565b6040516103509291906146bc565b610343610b26565b6103436104b4366004613d87565b610cbb565b6104cc6104c7366004613fba565b610cda565b604051610350929190614404565b6103436104e8366004613d87565b610d9c565b61040d610da7565b610343610f42565b61040d610f47565b61034361051336600461405d565b610f59565b610442610fab565b610442610fcf565b610343610536366004613d87565b610ff3565b61036161100e565b61034361055136600461412a565b61106f565b61040d61056436600461418e565b6110a8565b610381610577366004613e8b565b61111a565b61038161058a366004613e8b565b611158565b610442611165565b61038161116f565b61040d611180565b6104426111ca565b61040d6105bd366004613e1b565b6111ee565b6104cc6105d0366004613fba565b61126f565b6103436105e3366004613da3565b611306565b610343611343565b6103436113ec565b6104426113f6565b61034361141a565b6000846080015161063561061a610fcf565b6001600160a01b0316336001600160a01b03161460cd61162c565b61064a610640610947565b82146101f461162c565b61065261163a565b61065e8686868661164d565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b505050505090505b90565b600061070c338484611772565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074d6117da565b1592506107586117f7565b915061076261181b565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107db57fe5b6020026020010181815250506108196107f261183f565b7f000000000000000000000000000000000000000000000000000000000000000090611926565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084557fe5b602002602001018181525050670de0b6b3a76400008160008151811061086757fe5b6020908102919091010152905090565b6000806108848533611306565b90506108a8336001600160a01b03871614806108a05750838210155b61019e61162c565b6108b385858561195e565b336001600160a01b038616148015906108ce57506000198114155b156108e0576108e08533858403611772565b60019150505b9392505050565b60055460ff1690565b60006109006113ec565b905090565b61090d611a3e565b610915611a87565b600080610920610ae8565b915091506109396109318383611a97565b61014f61162c565b61094283611b9e565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070c9185906109a19086611c16565b611772565b6109ae611a3e565b6109b86000611c28565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a0a611a3e565b610a12611cb9565b610a1c6001611ccd565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4c9190614429565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906109009060c0603f611d0f565b60006060610adc888785611d1e611d35565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0582602080611d0f565b029250670de0b6b3a7640000610b1e8260406020611d0f565b029150509091565b600080610b31610947565b90506060610b3d610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b68919061444c565b60006040518083038186803b158015610b8057600080fd5b505afa158015610b94573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbc9190810190613eb6565b50915050610bd181610bcc610769565b611e9c565b600080610bdc610ae8565b91509150610be8613af8565b6040518060600160405280610bfb610ab7565b81526020018481526020018381525090506000610c87610c4e867f000000000000000000000000000000000000000000000000000000000000000081518110610c4057fe5b602002602001015184611f05565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7a57fe5b6020026020010151611f66565b9050610cb0610ca986600081518110610c9c57fe5b6020026020010151611f72565b8290611f86565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce961061a610fcf565b610cf4610640610947565b6000610cff85611fdd565b15610d2757610d0c61200c565b610d1e88610d1861073a565b8761201f565b94509050610d3f565b610d2f61163a565b610d3a8a8987611d1e565b945090505b610d498a82612115565b835167ffffffffffffffff81118015610d6157600080fd5b50604051908082528060200260200182016040528015610d8b578160200160208202803683370190505b509250505097509795505050505050565b600061071082610ff3565b6000610db1610947565b90506060610dbd610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de8919061444c565b60006040518083038186803b158015610e0057600080fd5b505afa158015610e14573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3c9190810190613eb6565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e8057fe5b602002602001018181525050610e94613b19565b6040518060800160405280610ea8856106fc565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed9610fcf565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f0a9493929190614474565b600060405180830381600087803b158015610f2457600080fd5b505af1158015610f38573d6000803e3d6000fd5b5050505050505050565b600090565b610f4f611a3e565b6109b86001611c28565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8e9291906142d0565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108161061a610fcf565b61108c610640610947565b61109461163a565b61109f85858561211f565b95945050505050565b6110b0611a3e565b6110b8611a87565b6000806110c3610ae8565b915091506110d46109318383611a97565b6110e96110e18585611a97565b61015761162c565b6111147f0000000000000000000000000000000000000000000000000000000000000000858561212c565b50505050565b6000806111273385611306565b90508083106111415761113c33856000611772565b61114e565b61114e3385858403611772565b5060019392505050565b600061070c33848461195e565b6000610900612202565b6008546000906109009060ff61227c565b611188611a3e565b61119061200c565b61119a6000611ccd565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4c9190614429565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121d8c610ff3565b8960405160200161123396959493929190614561565b604051602081830303815290604052805190602001209050611264888261125b878787612283565b886101f86122c2565b610f38888888611772565b6060808861127e61061a610fcf565b611289610640610947565b600061129361163a565b61129b61073a565b6112ed576112aa8a8a87612319565b945090506112c36112b9610f42565b82101560cc61162c565b6112d560006112d0610f42565b6123b1565b6112e8896112e1610f42565b83036123b1565b610d49565b6112f88a8987611d1e565b94509050610d4989826123b1565b6000611310610fcf565b6001600160a01b0316826001600160a01b031614156113325750600019610710565b61133c83836123bb565b9050610710565b6000806000611350610fcf565b6001600160a01b031663b05f8e48611366610947565b306040518363ffffffff1660e01b8152600401611384929190614647565b60806040518083038186803b15801561139c57600080fd5b505afa1580156113b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d491906141af565b5050915091506113e5818301611f72565b9250505090565b60006109006123e6565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061090061183f565b600061142f836115d9565b6060835160010167ffffffffffffffff8111801561144c57600080fd5b50604051908082528060200260200182016040528015611476578160200160208202803683370190505b509050308160008151811061148757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f6578481815181106114bf57fe5b60200260200101518282600101815181106114d657fe5b6001600160a01b03909216602092830291909101909101526001016114aa565b506060835160010167ffffffffffffffff8111801561151457600080fd5b5060405190808252806020026020018201604052801561153e578160200160208202803683370190505b50905060008160008151811061155057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115bf5784818151811061158857fe5b602002602001015182826001018151811061159f57fe5b6001600160a01b0390921660209283029190910190910152600101611573565b506115cc87878484612483565b925050505b949350505050565b806115e38161258c565b5050565b60006115f783831115600161162c565b50900390565b600061160a848484612605565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e3576115e38161264b565b6109b86116456117da565b61019261162c565b60006116696003841080156116625750600383105b606461162c565b6060611673610769565b905061167f8582611e9c565b60008061168a610ae8565b91509150611696613af8565b60405180606001604052806116a9610ab7565b81526020810185905260400183905290506000895160018111156116c957fe5b141561172d576116f089606001518589815181106116e357fe5b6020026020010151612675565b60608a015260006117028a8a84612681565b90506117218186898151811061171457fe5b6020026020010151612748565b955050505050506115d1565b61174189606001518588815181106116e357fe5b60608a015260006117538a8a84612754565b905061172181868a8151811061176557fe5b6020026020010151612809565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cd90859061444c565b60405180910390a3505050565b60006117e461181b565b42118061090057505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006118496113f6565b6001600160a01b03166307a2d13a7f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401611894919061444c565b60206040518083038186803b1580156118ac57600080fd5b505afa9250505080156118dc575060408051601f3d908101601f191682019092526118d991810190613fa2565b60015b61191f573d80801561190a576040519150601f19603f3d011682016040523d82523d6000602084013e61190f565b606091505b5061191981612815565b506106fc565b90506106fc565b600082820261194a84158061194357508385838161194057fe5b04145b600361162c565b670de0b6b3a7640000815b04949350505050565b6119756001600160a01b038416151561019861162c565b61198c6001600160a01b038316151561019961162c565b611997838383610942565b6001600160a01b0383166000908152602081905260409020546119bd90826101a061289c565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119ec9082611c16565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cd90859061444c565b6000611a6d6000357fffffffff0000000000000000000000000000000000000000000000000000000016610f59565b9050611a84611a7c82336128b2565b61019161162c565b50565b6109b8611a92610fcf565b61299b565b6000806000611aa4610fcf565b6001600160a01b031663b05f8e48611aba610947565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611af8929190614647565b60806040518083038186803b158015611b1057600080fd5b505afa158015611b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4891906141af565b5050915091506000611b84828401611b7f7f0000000000000000000000000000000000000000000000000000000000000000612a4d565b612675565b905085811015801561065e57509390931115949350505050565b611bb164e8d4a5100082101560cb61162c565b611bc767016345785d8a000082111560ca61162c565b600854611bd8908260c0603f6115fd565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611c0b90839061444c565b60405180910390a150565b60008282016108e6848210158361162c565b8015611c4857611c43611c396117f7565b421061019361162c565b611c5d565b611c5d611c5361181b565b42106101a961162c565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611c0b908390614429565b6109b8611cc461116f565b156101b561162c565b600854611cdc908260ff612b27565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611c0b908390614429565b6001901b6000190191901c1690565b60006060611d2d6103e661264b565b935093915050565b333014611e24576000306001600160a01b0316600036604051611d59929190614300565b6000604051808303816000865af19150503d8060008114611d96576040519150601f19603f3d011682016040523d82523d6000602084013e611d9b565b606091505b505090508060008114611daa57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611e06573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611e378686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611eab908290612b36565b60005b8181101561111457611ee6848281518110611ec557fe5b6020026020010151848381518110611ed957fe5b6020026020010151611926565b848281518110611ef257fe5b6020908102919091010152600101611eae565b60008160200151831015611f3e5781516020830151600091611f2a9186900390611926565b9050611f3684826115e7565b915050610710565b81604001518311611f50575081610710565b81516040830151600091611f2a91860390611926565b60006108e68383611c16565b600061071082611f8061073a565b906115e7565b6000611f95821515600461162c565b670de0b6b3a76400008302611fc7841580611fc05750670de0b6b3a7640000858381611fbd57fe5b04145b600561162c565b6001836001830304018115150291505092915050565b6000808251118015610710575060ff80168280602001905181019061200291906141ef565b60ff161492915050565b6109b861201761116f565b6101b661162c565b60006060600061202e84612b43565b90506060865167ffffffffffffffff8111801561204a57600080fd5b50604051908082528060200260200182016040528015612074578160200160208202803683370190505b5090506000612081610f42565b90506000612094898381518110610c9c57fe5b905060006120a28583612b59565b905060005b8a5181101561210457838114156120bf5760006120e5565b6120e5828c83815181106120cf57fe5b602002602001015161192690919063ffffffff16565b8582815181106120f157fe5b60209081029190910101526001016120a7565b509399929850919650505050505050565b6115e38282612b99565b60006108e66103e661264b565b61213b8183111561014c61162c565b6121566b0de0b6b39983494c589c000082111561014d61162c565b61216e670de0b6b3a7640000825b061561016161162c565b612180670de0b6b3a764000083612164565b6121b5670de0b6b3a76400008204604060206121ad670de0b6b3a7640000876008549190046020806115fd565b9291906115fd565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121f590859085906146bc565b60405180910390a2505050565b600061220c610fcf565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561224457600080fd5b505afa158015612258573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610900919061409d565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b60006122cd85612c65565b90506122e36122dd878387612c81565b8361162c565b6122f2428410156101b861162c565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606123346001600160a01b038616301461015661162c565b61234b6001600160a01b038516301461015661162c565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff8160008151811061239a57fe5b602090810291909101015290969095509350505050565b6115e38282612d30565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612453612dc3565b3060405160200161246895949392919061461b565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016124b2919061467c565b602060405180830381600087803b1580156124cc57600080fd5b505af11580156124e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125049190613fa2565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d29061255090849088908890600401614595565b600060405180830381600087803b15801561256a57600080fd5b505af115801561257e573d6000803e3d6000fd5b509298975050505050505050565b60028151101561259b57611a84565b6000816000815181106125aa57fe5b602002602001015190506000600190505b82518110156109425760008382815181106125d257fe5b602002602001015190506125fb816001600160a01b0316846001600160a01b031610606561162c565b91506001016125bb565b6126146101008310606461162c565b61263c60018210158015611662575061263260ff8461010003611620565b821115606461162c565b61094283821c156101b461162c565b611a84817f42414c0000000000000000000000000000000000000000000000000000000000612dc7565b60006108e68383611926565b60208301516000906001600160a01b03163014156126ab576126a4848484612e42565b90506108e6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b031614156126f4576126a4848484612f9a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b0316141561273d576126a48484846130d7565b6108e661013561264b565b60006108e68383612b59565b60408301516000906001600160a01b0316301415612777576126a484848461320f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127c0576126a484848461335f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b0316141561273d576126a4848484613497565b60006108e68383611f86565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417612890578160208401fd5b506115e361016561264b565b60006128ab848411158361162c565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128d1610fab565b6001600160a01b0316141580156128ec57506128ec836135cf565b15612914576128f9610fab565b6001600160a01b0316336001600160a01b0316149050610710565b61291c612202565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161294b93929190614455565b60206040518083038186803b15801561296357600080fd5b505afa158015612977573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133c9190613f82565b604080516000808252602082019092526060916129ce565b6129bb613b43565b8152602001906001900390816129b35790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e8490612a1790849060040161435a565b600060405180830381600087803b158015612a3157600080fd5b505af1158015612a45573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612ab057507f0000000000000000000000000000000000000000000000000000000000000000610cd5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612afc57612af56107f261183f565b9050610cd5565b6001600160a01b038216301415612b1c5750670de0b6b3a7640000610cd5565b610cd561013561264b565b6001811b1992909216911b1790565b6115e3818314606761162c565b6000818060200190518101906108e6919061420b565b6000612b68821515600461162c565b670de0b6b3a76400008302612b90841580611fc05750670de0b6b3a7640000858381611fbd57fe5b82818161195557fe5b612bb06001600160a01b038316151561019b61162c565b612bbc82600083610942565b6001600160a01b038216600090815260208190526040902054612be290826101b261289c565b6001600160a01b038316600090815260208190526040902055612c15612c1082612c0a61073a565b90613633565b613641565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c59919061444c565b60405180910390a35050565b6000612c6f6123e6565b82604051602001610f8e929190614310565b6000612c9382516041146101b961162c565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612ccc90899085908890889061465e565b6020604051602081039080840390855afa158015612cee573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612d245750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612d3c60008383610942565b612d51612c1082612d4b61073a565b90611c16565b6001600160a01b038216600090815260208190526040902054612d749082611c16565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c5990859061444c565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612ec87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162c565b6115d18460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612efc57fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f3057fe5b6020026020010151612f4887600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612f8e57613646612f92565b6136a45b63ffffffff16565b6000612ff67f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec0575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b031630146130515761304c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061303e57fe5b60200260200101518461370d565b6115d1565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061308557fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130b957fe5b60200260200101516130d187600081518110610c9c57fe5b8661373d565b60006131337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec0575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b031630146131895761304c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061317b57fe5b6020026020010151846137a3565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131bd57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106131f157fe5b602002602001015161320987600081518110610c9c57fe5b866137e3565b60006132947f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162c565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132c857fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106132fc57fe5b602002602001015161331487600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461335a5761384a612f92565b6138a1565b60006133bb7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec0575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b031630146134115761304c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061340357fe5b60200260200101518461390b565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061344557fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061347957fe5b602002602001015161349187600081518110610c9c57fe5b86613935565b60006134f37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec0575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b031630146135495761304c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061353b57fe5b602002602001015184613984565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061357d57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106135b157fe5b60200260200101516135c987600081518110610c9c57fe5b866139b9565b60006135fa7f9f11080e00000000000000000000000000000000000000000000000000000000610f59565b821480610710575061362b7f38e9922e00000000000000000000000000000000000000000000000000000000610f59565b909114919050565b60006108e68383600161289c565b600255565b6000806136538684611f05565b905060006136618287611f66565b9050600061366f868a6115e7565b9050600061368a84611f806136848587613a0d565b8a613a27565b905061369688826115e7565b9a9950505050505050505050565b6000806136b18684611f05565b905060006136bf8287611f66565b905060006136d66136d0838b613a0d565b87613a48565b905060006136e484836115e7565b905060006136f28288613a68565b90506136fe8a826115e7565b9b9a5050505050505050505050565b60008061371a8484611f05565b9050600061373161372b8688611c16565b85611f05565b905061065e81836115e7565b6000826137555761374e8683611f05565b905061109f565b60006137618684611f05565b9050600061377261372b888a611c16565b9050600061378082846115e7565b9050600061378e8489611f66565b905061369661379d8884613a0d565b82613a48565b6000806137b08484611f05565b905060006137be82876115e7565b905060006137cc8286613a68565b90506137d886826115e7565b979650505050505050565b6000826137f157508461109f565b60006137fd8684611f05565b9050600061380b8287611f66565b90506000613819878a611c16565b905060006138278483611f66565b9050600061383e6138388984613a0d565b85613a48565b90506136fe81896115e7565b60008261385857508461109f565b60006138648684611f05565b905060006138728287611f66565b90506000613880868a611c16565b9050600061389584611f806136848587613a0d565b905061369681896115e7565b6000826138b25761374e8683613a68565b60006138be8684611f05565b905060006138cc8287611f66565b905060006138e36138dd838b613a0d565b87613a27565b905060006138f18483611c16565b905060006138ff8288613a68565b90506136fe818b6115e7565b6000806139188484611f05565b9050600061392961372b86886115e7565b905061065e82826115e7565b6000806139428684611f05565b9050600061395361372b888a6115e7565b9050600061396183836115e7565b9050600061396f8489611f66565b905061369661397e8884613a0d565b82613a27565b6000806139918484611f05565b9050600061399f8287611c16565b905060006139ad8286613a68565b90506137d881876115e7565b6000806139c68684611f05565b905060006139d48287611f66565b905060006139e2878a6115e7565b905060006139f08483611f66565b90506000613a016138388984613a0d565b90506136fe88826115e7565b60008282026108e684158061194357508385838161194057fe5b6000613a36821515600461162c565b50811515600019909201046001010290565b6000613a57821515600461162c565b818381613a6057fe5b049392505050565b60008160200151831015613ab157815161133c90613a8f90670de0b6b3a764000090611c16565b60208401518451613aab91613aa49190611926565b8690611c16565b90612b59565b81604001518311613ac3575081610710565b815161133c90613adc90670de0b6b3a7640000906115e7565b60408401518451613aab91613af19190611926565b86906115e7565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b80356107108161472b565b600082601f830112613b8e578081fd5b8135613ba1613b9c826146ff565b6146d8565b818152915060208083019084810181840286018201871015613bc257600080fd5b60005b84811015613be157813584529282019290820190600101613bc5565b505050505092915050565b600082601f830112613bfc578081fd5b8151613c0a613b9c826146ff565b818152915060208083019084810181840286018201871015613c2b57600080fd5b60005b84811015613be157815184529282019290820190600101613c2e565b600082601f830112613c5a578081fd5b813567ffffffffffffffff811115613c70578182fd5b613c836020601f19601f840116016146d8565b9150808252836020828501011115613c9a57600080fd5b8060208401602084013760009082016020015292915050565b80356002811061071057600080fd5b6000610120808385031215613cd5578182fd5b613cde816146d8565b915050613ceb8383613cb3565b8152613cfa8360208401613b73565b6020820152613d0c8360408401613b73565b6040820152606082013560608201526080820135608082015260a082013560a0820152613d3c8360c08401613b73565b60c0820152613d4e8360e08401613b73565b60e08201526101008083013567ffffffffffffffff811115613d6f57600080fd5b613d7b85828601613c4a565b82840152505092915050565b600060208284031215613d98578081fd5b81356108e68161472b565b60008060408385031215613db5578081fd5b8235613dc08161472b565b91506020830135613dd08161472b565b809150509250929050565b600080600060608486031215613def578081fd5b8335613dfa8161472b565b92506020840135613e0a8161472b565b929592945050506040919091013590565b600080600080600080600060e0888a031215613e35578283fd5b8735613e408161472b565b96506020880135613e508161472b565b955060408801359450606088013593506080880135613e6e81614740565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613e9d578182fd5b8235613ea88161472b565b946020939093013593505050565b600080600060608486031215613eca578081fd5b835167ffffffffffffffff80821115613ee1578283fd5b818601915086601f830112613ef4578283fd5b8151613f02613b9c826146ff565b80828252602080830192508086018b828387028901011115613f22578788fd5b8796505b84871015613f4d578051613f398161472b565b845260019690960195928101928101613f26565b508901519097509350505080821115613f64578283fd5b50613f7186828701613bec565b925050604084015190509250925092565b600060208284031215613f93578081fd5b815180151581146108e6578182fd5b600060208284031215613fb3578081fd5b5051919050565b600080600080600080600060e0888a031215613fd4578081fd5b873596506020880135613fe68161472b565b95506040880135613ff68161472b565b9450606088013567ffffffffffffffff80821115614012578283fd5b61401e8b838c01613b7e565b955060808a0135945060a08a0135935060c08a0135915080821115614041578283fd5b5061404e8a828b01613c4a565b91505092959891949750929550565b60006020828403121561406e578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e6578182fd5b6000602082840312156140ae578081fd5b81516108e68161472b565b600080600080608085870312156140ce578182fd5b843567ffffffffffffffff808211156140e5578384fd5b6140f188838901613cc2565b95506020870135915080821115614106578384fd5b5061411387828801613b7e565b949794965050505060408301359260600135919050565b60008060006060848603121561413e578081fd5b833567ffffffffffffffff811115614154578182fd5b61416086828701613cc2565b9660208601359650604090950135949350505050565b600060208284031215614187578081fd5b5035919050565b600080604083850312156141a0578182fd5b50508035926020909101359150565b600080600080608085870312156141c4578182fd5b84519350602085015192506040850151915060608501516141e48161472b565b939692955090935050565b600060208284031215614200578081fd5b81516108e681614740565b6000806040838503121561421d578182fd5b825161422881614740565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b8381101561427457815187529582019590820190600101614258565b509495945050505050565b15159052565b60008151808452815b818110156142aa5760208185018101518683018201520161428e565b818111156142bb5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b828110156143e457815180516004811061438d57fe5b85528087015161439f88870182614238565b5085810151868601526060808201516143ba82880182614238565b5050608090810151906143cf86820183614238565b505060a0939093019290850190600101614377565b5091979650505050505050565b6000602082526108e66020830184614245565b6000604082526144176040830185614245565b828103602084015261109f8185614245565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156144e5576144cf845161471f565b82529284019260019290920191908401906144bd565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a08701526145238185614245565b935050506040850151818584030160c08601526145408382614285565b92505050606084015161455660e085018261427f565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b818110156145dd576145cb855161471f565b835293830193918301916001016145b9565b505084810360408601528551808252908201925081860190845b8181101561257e57614609835161471f565b855293830193918301916001016145f7565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016003831061468a57fe5b91905290565b6000602082526108e66020830184614285565b6000838252604060208301526115d16040830184614245565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156146f757600080fd5b604052919050565b600067ffffffffffffffff821115614715578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114611a8457600080fd5b60ff81168114611a8457600080fdfea26469706673582212202abc871448efbae7fc96ae47c1b1ecf59114edd2396d5be66e0cdb10faeb591b64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/artifact/ERC4626LinearPoolFactory.json b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/artifact/ERC4626LinearPoolFactory.json new file mode 100644 index 0000000..ce6de6d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/artifact/ERC4626LinearPoolFactory.json @@ -0,0 +1,334 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ERC4626LinearPoolFactory", + "sourceName": "contracts/erc4626-linear-pool/ERC4626LinearPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "contract IBalancerQueries", + "name": "queries", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "poolVersion", + "type": "string" + }, + { + "internalType": "uint256", + "name": "initialPauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "Erc4626LinearPoolCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract LinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastCreatedPool", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeePercentagesProvider", + "outputs": [ + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101e06040523480156200001257600080fd5b5060405162009366380380620093668339810160408190526200003591620003bc565b86868383604051806020016200004b906200026b565b601f1982820381018352601f9091011660405282828630848d6200006f816200017d565b5080516002810460a081905280820360e0819052818452836200009e8162000196602090811b620009f317901c565b60601b6001600160601b0319166080528285018051838252620000cd8262000196602090811b620009f317901c565b6001600160601b0319606091821b811660c0529690935290526101009590955250509290911b909116610120525062000110630163f500831115610194620001ea565b620001246276a700821115610195620001ea565b610140829052610160524201610180525050506001600160601b0319606091821b81166101a05260016003559087901b166101c0525082516200016f90600690602086019062000279565b50505050505050506200048d565b80516200019290600090602084019062000279565b5050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001e46001600160a01b03831615156101ac620001ea565b50919050565b816200019257620001928162000207816210905360ea1b6200020a565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b61597880620039ee83390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002bc57805160ff1916838001178555620002ec565b82800160010185558215620002ec579182015b82811115620002ec578251825591602001919060010190620002cf565b50620002fa929150620002fe565b5090565b5b80821115620002fa5760008155600101620002ff565b600082601f83011262000326578081fd5b81516001600160401b03808211156200033d578283fd5b6040516020601f8401601f19168201810183811183821017156200035f578586fd5b806040525081945083825286818588010111156200037c57600080fd5b600092505b83831015620003a0578583018101518284018201529182019162000381565b83831115620003b25760008185840101525b5050505092915050565b600080600080600080600060e0888a031215620003d7578283fd5b8751620003e48162000477565b6020890151909750620003f78162000477565b60408901519096506200040a8162000477565b60608901519095506001600160401b038082111562000427578485fd5b620004358b838c0162000315565b955060808a01519150808211156200044b578485fd5b506200045a8a828b0162000315565b93505060a0880151915060c0880151905092959891949750929550565b6001600160a01b03811681146200020757600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405161016051610180516101a05160601c6101c05160601c6134cc620005226000398061057052508061050452508061028b52806102b55250806102d9525050806109445250806108f2525080610a5c5250806102625280610ad8525080610a7d5250806102415280610ab452506134cc6000f3fe60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c80636634b753116200009957806376895be7116200006f57806376895be714620001cd578063851c1bb314620001e45780638d928af8146200020a578063aaabadc5146200021457620000ff565b80636634b75314620001935780636c57f5a914620001b9578063739238d614620001c357620000ff565b80632f2770db11620000db5780632f2770db146200015a5780633f819b6f146200016657806354fd4d5014620001705780635ed31282146200017a57620000ff565b8062c194db1462000104578063174481fa14620001265780632da47c401462000140575b600080fd5b6200010e6200021e565b6040516200011d919062001459565b60405180910390f35b620001306200023f565b6040516200011d929190620013f2565b6200014a62000285565b6040516200011d92919062001652565b620001646200030e565b005b6200010e62000378565b6200010e62000430565b62000184620004b2565b6040516200011d9190620013d1565b620001aa620001a43660046200114d565b620004ce565b6040516200011d919062001419565b620001aa620004f9565b6200018462000502565b62000184620001de366004620011f6565b62000526565b620001fb620001f536600462001195565b620008ee565b6040516200011d919062001424565b6200018462000942565b6200018462000966565b60606200023a6040518060200160405280600081525062000a54565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200030057807f00000000000000000000000000000000000000000000000000000000000000000392507f0000000000000000000000000000000000000000000000000000000000000000915062000309565b60009250600091505b509091565b6200031862000b2f565b6200032262000b7e565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b820191906000526020600020905b8154815290600101906020018083116200040857829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006200053262000b97565b6004805460018101909155604051606090620005516020820162000fe1565b601f1982820381018352601f909101166040526200056e62000942565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001620005a2929190620013f2565b60408051601f1981840301815290829052620005c292916020016200139e565b60405160208183030381529060405290506000620005e883838051906020012062000bb2565b9050600080620005f762000285565b915091506200060562000fef565b6200060f62000942565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508f81602001819052508e81604001819052508d816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508c816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b8160c00181815250508a8160e0018181525050828161010001818152505081816101200181815250508981610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506200076d62000378565b610160820152604051600090620007a4906200078e9084906020016200154a565b6040516020818303038152906040528a62000bca565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620007ef57600080fd5b505af115801562000804573d6000803e3d6000fd5b505050506000620008186000898962000c21565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146200088b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088290620014dc565b60405180910390fd5b6040518b9073ffffffffffffffffffffffffffffffffffffffff8416907f45dd615d2ed7994f98fec837b2d092af933c6520b8717c3a64317961caa532ea90600090a3509650505050505050620008e162000cff565b9998505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001620009259291906200136e565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006200097262000942565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620009b857600080fd5b505afa158015620009cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023a9190620011d7565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000a4e73ffffffffffffffffffffffffffffffffffffffff831615156101ac62000d06565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000b2181838662000d1b565b505050505050505050919050565b600062000b606000357fffffffff0000000000000000000000000000000000000000000000000000000016620008ee565b905062000b7b62000b72823362000d79565b61019162000d06565b50565b62000b9562000b8c620004f9565b1560d362000d06565b565b62000bab6002600354141561019062000d06565b6002600355565b600062000bc183833062000e17565b90505b92915050565b60008062000bd9848462000e58565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316179055949350505050565b6000808447101562000c61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000882906200146e565b825162000c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008829062001513565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088290620014a5565b949350505050565b6001600355565b8162000d175762000d178162000ef5565b5050565b5b6020811062000d3d578151835260209283019290910190601f190162000d1c565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000d8562000966565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000dc3939291906200142d565b60206040518083038186803b15801562000ddc57600080fd5b505afa15801562000df1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bc1919062001173565b60008060ff60f81b83868660405160200162000e3794939291906200130a565b60408051808303601f19018152919052805160209091012095945050505050565b600062000e6462000b7e565b600062000e72848462000f21565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a29392505050565b62000b7b817f42414c000000000000000000000000000000000000000000000000000000000062000f66565b6000606062000f308462000a54565b90506000838251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf7573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611de080620016b783390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b803562000bc48162001693565b600082601f830112620010dc578081fd5b813567ffffffffffffffff80821115620010f4578283fd5b6040516020601f19601f850116820101818110838211171562001115578485fd5b6040528281529250828483016020018610156200113157600080fd5b8260208601602083013760006020848301015250505092915050565b6000602082840312156200115f578081fd5b81356200116c8162001693565b9392505050565b60006020828403121562001185578081fd5b815180151581146200116c578182fd5b600060208284031215620011a7578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146200116c578182fd5b600060208284031215620011e9578081fd5b81516200116c8162001693565b60008060008060008060008060006101208a8c03121562001215578485fd5b893567ffffffffffffffff808211156200122d578687fd5b6200123b8d838e01620010cb565b9a5060208c013591508082111562001251578687fd5b50620012608c828d01620010cb565b98505060408a0135620012738162001693565b965060608a0135620012858162001693565b955060808a0135945060a08a01359350620012a48b60c08c01620010be565b925060e08a013591506101008a013590509295985092959850929598565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620012f681602086016020860162001660565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60008351620013b281846020880162001660565b835190830190620013c881836020880162001660565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000bc16020830184620012dc565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b60006020825262001560602083018451620012c2565b60208301516101808060408501526200157e6101a0850183620012dc565b91506040850151601f19808685030160608701526200159e8483620012dc565b935060608701519150620015b66080870183620012c2565b60808701519150620015cc60a0870183620012c2565b60a08701519150620015e260c0870183620012c2565b60c087015160e08781019190915287015161010080880191909152870151610120808801919091528701516101408088019190915287015191506101606200162d81880184620012c2565b870151868503909101838701529050620016488382620012dc565b9695505050505050565b918252602082015260400190565b60005b838110156200167d57818101518382015260200162001663565b838111156200168d576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000b7b57600080fdfe6101606040523480156200001257600080fd5b5060405162001de038038062001de0833981016040819052620000359162000462565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000378565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200012591908101906200039e565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000449565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000449565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000378565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000378565b6001600160601b0319606091821b811660e05292811b8316610120521b166101405250620004e0915050565b6000602082840312156200038a578081fd5b81516200039781620004c7565b9392505050565b60006020808385031215620003b1578182fd5b82516001600160401b0380821115620003c8578384fd5b818501915085601f830112620003dc578384fd5b815181811115620003eb578485fd5b8381029150620003fd848301620004a0565b8181528481019084860184860187018a101562000418578788fd5b8795505b838610156200043c5780518352600195909501949186019186016200041c565b5098975050505050505050565b6000602082840312156200045b578081fd5b5051919050565b6000806040838503121562000475578081fd5b82516200048281620004c7565b60208401519092506200049581620004c7565b809150509250929050565b6040518181016001600160401b0381118282101715620004bf57600080fd5b604052919050565b6001600160a01b0381168114620004dd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c61181d620005c36000398061050952806108215250806101335280610c145280610f325280610f945250806103bf52508061046c5280610599528061074852806108ec5280610cbf528061102d52806110ee528061115052508060ea5280610190528061043052806105cc528061063152806106d2528061078452806108b152806110cc52508061016f5280610402528061071a5280610a7d5280610b5c5280610dba5280610e9952508060995280610309525061181d6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611527565b60405180910390f35b6100776100723660046113e5565b6100bb565b60405161005b919061175a565b610077610092366004611401565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc929190611673565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c9190611487565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a9392919061156f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a49190611464565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f5611332565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c9611395565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611697565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610592919061144c565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d4e565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611527565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b6919061144c565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fc9565b9695505050505050565b600061070d611332565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e1611395565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611697565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa919061144c565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fed565b6110b2565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d4e565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a919061150b565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b6919061142c565b6101a2611187565b60006109cd8215156004611187565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b6005611187565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f6113bc565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016115ef565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517fba08765200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ba08765290610cf890849030908190600401611763565b602060405180830381600087803b158015610d1257600080fd5b505af1158015610d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4a919061144c565b5050565b6040805160028082526060828101909352816020015b610d6c6113bc565b815260200190600190039081610d64579050509050600281600081518110610d9057fe5b6020026020010151600001906002811115610da757fe5b90816002811115610db457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de657fe5b602002602001015160200181815250508181600081518110610e0457fe5b602002602001015160600181815250508281600081518110610e2257fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e6f57fe5b6020026020010151600001906002811115610e8657fe5b90816002811115610e9357fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec557fe5b602002602001015160200181815250508181600181518110610ee357fe5b602002602001015160600181815250508281600181518110610f0157fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f579084167f000000000000000000000000000000000000000000000000000000000000000084611195565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016115ef565b610fe88363a9059cbb60e01b848460405160240161027a9291906115c9565b505050565b6040517fb3d7f6b900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b3d7f6b99061106290859060040161175a565b60206040518083038186803b15801561107a57600080fd5b505afa15801561108e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100c6919061144c565b61111373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611195565b6040517f6e553f6500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636e553f6590610cf89084903090600401611673565b81610d4a57610d4a8161128a565b801580159061124657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e906111f39030908690600401611548565b60206040518083038186803b15801561120b57600080fd5b505afa15801561121f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611243919061144c565b15155b1561126b5761126b8363095ea7b360e01b84600060405160240161027a9291906115a0565b610fe88363095ea7b360e01b848460405160240161027a9291906115c9565b6112b4817f42414c00000000000000000000000000000000000000000000000000000000006112b7565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6000602082840312156113f6578081fd5b813561011b816117c5565b60008060408385031215611413578081fd5b823561141e816117c5565b946020939093013593505050565b60006020828403121561143d578081fd5b8151801515811461011b578182fd5b60006020828403121561145d578081fd5b5051919050565b60008060408385031215611476578182fd5b505080516020909101519092909150565b6000806000806080858703121561149c578182fd5b84519350602085015192506040850151915060608501516114bc816117c5565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161151d81846020870161178f565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561166657815180516003811061162257fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff1686860152606090810151908501526080909301929085019060010161160c565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a083015260208401516116b2816117bb565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c061014084015280518061016085015261018061171e828287016020860161178f565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b60208301846114c7565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60005b838110156117aa578181015183820152602001611792565b838111156102fc5750506000910152565b600281106112b457fe5b73ffffffffffffffffffffffffffffffffffffffff811681146112b457600080fdfea264697066735822122036d3be9a4702beeeaf84ed61b5a1ad96e4463c44e76b17de0545dd15aa231f2864736f6c63430007010033a264697066735822122023a01662fba4cf148e4541e96f33749613e38a02c178cf92baf792d9aceca72b64736f6c634300070100336102c06040523480156200001257600080fd5b506040516200597838038062005978833981016040819052620000359162000ddf565b6101608101518151602083015160408401516060850151608086015160c0870151620000618862000455565b60e08901516101008a01516101208b01516101408c01518a6200009e8160006200008c8c8c620004de565b896200058f60201b620014241760201c565b8b8b86868686838387878b86336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000ed92919062000c68565b5080516200010390600490602084019062000c68565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001829050630163f5008311156101946200075d565b620001966276a7008211156101956200075d565b4291909101610140819052016101605260601b6001600160601b031916610180526101a08690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000db9565b6001600160a01b03166101c0816001600160a01b031660601b8152505050505050505050876001600160a01b03166101e0816001600160a01b031660601b81525050866001600160a01b0316610200816001600160a01b031660601b81525050866001600160a01b0316886001600160a01b031610620002bb576002620002be565b60015b60ff16610220526001600160a01b0380881690891610620002e1576001620002e4565b60025b60ff1661024052620002f68862000772565b61026052620003058762000772565b610280526000620003188982896200081e565b620003238562000918565b5050505050505050505050506200034081620009a760201b60201c565b50600081608001516001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038157600080fd5b505afa15801562000396573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003bc919062000f36565b60ff169050600082606001516001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200040157600080fd5b505afa15801562000416573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200043c919062000f36565b60ff16909103601201600a0a6102a052506200105c9050565b6040805160028082526060808301845292839291906020830190803683370190505090508260a00151816000815181106200048c57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260a0015181600181518110620004bf57fe5b6001600160a01b03909216602092830291909101909101529050919050565b60408051600280825260608281019093526001600160a01b03848116908616109183918160200160208202803683370190505090508162000520578362000522565b845b816000815181106200053057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050816200055d57846200055f565b835b816001815181106200056d57fe5b6001600160a01b03909216602092830291909101909101529150505b92915050565b6000620005a783620009bc60201b620015d91760201c565b606083516001016001600160401b0381118015620005c457600080fd5b50604051908082528060200260200182016040528015620005ef578160200160208202803683370190505b50905030816000815181106200060157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b845181101562000674578481815181106200063b57fe5b60200260200101518282600101815181106200065357fe5b6001600160a01b039092166020928302919091019091015260010162000624565b50606083516001016001600160401b03811180156200069257600080fd5b50604051908082528060200260200182016040528015620006bd578160200160208202803683370190505b509050600081600081518110620006d057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b845181101562000743578481815181106200070a57fe5b60200260200101518282600101815181106200072257fe5b6001600160a01b0390921660209283029190910190910152600101620006f3565b506200075287878484620009c8565b979650505050505050565b816200076e576200076e8162000ac2565b5050565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620007af57600080fd5b505afa158015620007c4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007ea919062000f36565b60ff16905060006200080960128362000ad760201b620015e71760201c565b600a0a670de0b6b3a764000002949350505050565b6200082f8183111561014c6200075d565b6200084c6b0de0b6b39983494c589c000082111561014d6200075d565b62000866670de0b6b3a7640000825b06156101616200075d565b6200087a670de0b6b3a7640000836200085b565b620008c9670de0b6b3a7640000820460406020620008b3670de0b6b3a764000087600854919004602080620015fd62000aef821b17811c565b62000aef60201b620015fd17909392919060201c565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906200090b908590859062001005565b60405180910390a2505050565b6200092d64e8d4a5100082101560cb6200075d565b6200094567016345785d8a000082111560ca6200075d565b620009678160c0603f60085462000aef60201b620015fd17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906200099c90839062000ffc565b60405180910390a150565b80516200076e90600990602084019062000c68565b806200076e8162000b14565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b8152600401620009f9919062000fe7565b602060405180830381600087803b15801562000a1457600080fd5b505af115801562000a29573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a4f919062000da0565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000a849084908890889060040162000f59565b600060405180830381600087803b15801562000a9f57600080fd5b505af115801562000ab4573d6000803e3d6000fd5b509298975050505050505050565b62000ad4816210905360ea1b62000ba0565b50565b600062000ae98383111560016200075d565b50900390565b600062000afe84848462000c01565b506001901b60001901811b1992909216911b1790565b60028151101562000b255762000ad4565b60008160008151811062000b3557fe5b602002602001015190506000600190505b825181101562000b9b57600083828151811062000b5f57fe5b6020026020010151905062000b90816001600160a01b0316846001600160a01b03161060656200075d60201b60201c565b915060010162000b46565b505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b62000c12610100831060646200075d565b62000c4b6001821015801562000c43575062000c3f60ff846101000362000c5c60201b620016201760201c565b8211155b60646200075d565b62000b9b83821c156101b46200075d565b80820390821102900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000cab57805160ff191683800117855562000cdb565b8280016001018555821562000cdb579182015b8281111562000cdb57825182559160200191906001019062000cbe565b5062000ce992915062000ced565b5090565b5b8082111562000ce9576000815560010162000cee565b8051620005898162001046565b600082601f83011262000d22578081fd5b81516001600160401b0381111562000d38578182fd5b602062000d4e601f8301601f1916820162001013565b9250818352848183860101111562000d6557600080fd5b60005b8281101562000d8557848101820151848201830152810162000d68565b8281111562000d975760008284860101525b50505092915050565b60006020828403121562000db2578081fd5b5051919050565b60006020828403121562000dcb578081fd5b815162000dd88162001046565b9392505050565b60006020828403121562000df1578081fd5b81516001600160401b038082111562000e08578283fd5b818401915061018080838703121562000e1f578384fd5b62000e2a8162001013565b905062000e38868462000d04565b815260208301518281111562000e4c578485fd5b62000e5a8782860162000d11565b60208301525060408301518281111562000e72578485fd5b62000e808782860162000d11565b60408301525062000e95866060850162000d04565b606082015262000ea9866080850162000d04565b608082015262000ebd8660a0850162000d04565b60a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014062000eff8782860162000d04565b90820152610160838101518381111562000f17578586fd5b62000f258882870162000d11565b918301919091525095945050505050565b60006020828403121562000f48578081fd5b815160ff8116811462000dd8578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000fa55762000f9285516200103a565b8352938301939183019160010162000f7d565b505084810360408601528551808252908201925081860190845b8181101562000ab45762000fd483516200103a565b8552938301939183019160010162000fbf565b602081016003831062000ff657fe5b91905290565b90815260200190565b918252602082015260400190565b6040518181016001600160401b03811182821017156200103257600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b038116811462000ad457600080fd5b60805160a05160c05160e0516101005160601c6101205160601c61014051610160516101805160601c6101a0516101c05160601c6101e05160601c6102005160601c610220516102405161026051610280516102a051614785620011f3600039806118595250806107f45250806107905280612a8c525080610718528061081c5280610c515280612f07528061309052806131c852806132d3528061345052806135885250806107b252806109bc5280610c175280612ed35280613015528061305c52806131525280613194528061329f52806133da528061341c528061351252806135545250806113f852806126f652806127c25280612ab25280612e885280612fa1528061325552806133665250806109e052806110ee5280611abc5280611b5b52806126ad52806127795280612a515280612e495280612f4b52806130de52806132165280613317528061349e5250806111cc5250806109495250508061181d5250806117f9525080610fd1525080610fad525080610f5d5250806123ea52508061242c52508061240b52506147856000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e3660046140b9565b610608565b604051610350919061444c565b60405180910390f35b610361610668565b6040516103509190614690565b61038161037c366004613e8b565b6106ff565b6040516103509190614429565b610343610716565b61034361073a565b6103a6610740565b60405161035093929190614434565b6103bd610769565b60405161035091906143f1565b6103816103d8366004613ddb565b610877565b6103e56108ed565b60405161035091906146ca565b6103436108f6565b61040d610408366004614176565b610905565b005b610343610947565b610381610425366004613e8b565b61096b565b61040d6109a6565b6103436109ba565b6104426109de565b6040516103509190614346565b61040d610a02565b610361610a56565b610343610ab7565b61047a610475366004613fba565b610aca565b6040516103509291906146a3565b610490610ae8565b6040516103509291906146bc565b610343610b26565b6103436104b4366004613d87565b610cbb565b6104cc6104c7366004613fba565b610cda565b604051610350929190614404565b6103436104e8366004613d87565b610d9c565b61040d610da7565b610343610f42565b61040d610f47565b61034361051336600461405d565b610f59565b610442610fab565b610442610fcf565b610343610536366004613d87565b610ff3565b61036161100e565b61034361055136600461412a565b61106f565b61040d61056436600461418e565b6110a8565b610381610577366004613e8b565b61111a565b61038161058a366004613e8b565b611158565b610442611165565b61038161116f565b61040d611180565b6104426111ca565b61040d6105bd366004613e1b565b6111ee565b6104cc6105d0366004613fba565b61126f565b6103436105e3366004613da3565b611306565b610343611343565b6103436113ec565b6104426113f6565b61034361141a565b6000846080015161063561061a610fcf565b6001600160a01b0316336001600160a01b03161460cd61162c565b61064a610640610947565b82146101f461162c565b61065261163a565b61065e8686868661164d565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b505050505090505b90565b600061070c338484611772565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074d6117da565b1592506107586117f7565b915061076261181b565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107db57fe5b6020026020010181815250506108196107f261183f565b7f000000000000000000000000000000000000000000000000000000000000000090611926565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084557fe5b602002602001018181525050670de0b6b3a76400008160008151811061086757fe5b6020908102919091010152905090565b6000806108848533611306565b90506108a8336001600160a01b03871614806108a05750838210155b61019e61162c565b6108b385858561195e565b336001600160a01b038616148015906108ce57506000198114155b156108e0576108e08533858403611772565b60019150505b9392505050565b60055460ff1690565b60006109006113ec565b905090565b61090d611a3e565b610915611a87565b600080610920610ae8565b915091506109396109318383611a97565b61014f61162c565b61094283611b9e565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070c9185906109a19086611c16565b611772565b6109ae611a3e565b6109b86000611c28565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a0a611a3e565b610a12611cb9565b610a1c6001611ccd565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4c9190614429565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906109009060c0603f611d0f565b60006060610adc888785611d1e611d35565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0582602080611d0f565b029250670de0b6b3a7640000610b1e8260406020611d0f565b029150509091565b600080610b31610947565b90506060610b3d610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b68919061444c565b60006040518083038186803b158015610b8057600080fd5b505afa158015610b94573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbc9190810190613eb6565b50915050610bd181610bcc610769565b611e9c565b600080610bdc610ae8565b91509150610be8613af8565b6040518060600160405280610bfb610ab7565b81526020018481526020018381525090506000610c87610c4e867f000000000000000000000000000000000000000000000000000000000000000081518110610c4057fe5b602002602001015184611f05565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7a57fe5b6020026020010151611f66565b9050610cb0610ca986600081518110610c9c57fe5b6020026020010151611f72565b8290611f86565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce961061a610fcf565b610cf4610640610947565b6000610cff85611fdd565b15610d2757610d0c61200c565b610d1e88610d1861073a565b8761201f565b94509050610d3f565b610d2f61163a565b610d3a8a8987611d1e565b945090505b610d498a82612115565b835167ffffffffffffffff81118015610d6157600080fd5b50604051908082528060200260200182016040528015610d8b578160200160208202803683370190505b509250505097509795505050505050565b600061071082610ff3565b6000610db1610947565b90506060610dbd610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de8919061444c565b60006040518083038186803b158015610e0057600080fd5b505afa158015610e14573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3c9190810190613eb6565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e8057fe5b602002602001018181525050610e94613b19565b6040518060800160405280610ea8856106fc565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed9610fcf565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f0a9493929190614474565b600060405180830381600087803b158015610f2457600080fd5b505af1158015610f38573d6000803e3d6000fd5b5050505050505050565b600090565b610f4f611a3e565b6109b86001611c28565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8e9291906142d0565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108161061a610fcf565b61108c610640610947565b61109461163a565b61109f85858561211f565b95945050505050565b6110b0611a3e565b6110b8611a87565b6000806110c3610ae8565b915091506110d46109318383611a97565b6110e96110e18585611a97565b61015761162c565b6111147f0000000000000000000000000000000000000000000000000000000000000000858561212c565b50505050565b6000806111273385611306565b90508083106111415761113c33856000611772565b61114e565b61114e3385858403611772565b5060019392505050565b600061070c33848461195e565b6000610900612202565b6008546000906109009060ff61227c565b611188611a3e565b61119061200c565b61119a6000611ccd565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4c9190614429565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121d8c610ff3565b8960405160200161123396959493929190614561565b604051602081830303815290604052805190602001209050611264888261125b878787612283565b886101f86122c2565b610f38888888611772565b6060808861127e61061a610fcf565b611289610640610947565b600061129361163a565b61129b61073a565b6112ed576112aa8a8a87612319565b945090506112c36112b9610f42565b82101560cc61162c565b6112d560006112d0610f42565b6123b1565b6112e8896112e1610f42565b83036123b1565b610d49565b6112f88a8987611d1e565b94509050610d4989826123b1565b6000611310610fcf565b6001600160a01b0316826001600160a01b031614156113325750600019610710565b61133c83836123bb565b9050610710565b6000806000611350610fcf565b6001600160a01b031663b05f8e48611366610947565b306040518363ffffffff1660e01b8152600401611384929190614647565b60806040518083038186803b15801561139c57600080fd5b505afa1580156113b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d491906141af565b5050915091506113e5818301611f72565b9250505090565b60006109006123e6565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061090061183f565b600061142f836115d9565b6060835160010167ffffffffffffffff8111801561144c57600080fd5b50604051908082528060200260200182016040528015611476578160200160208202803683370190505b509050308160008151811061148757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f6578481815181106114bf57fe5b60200260200101518282600101815181106114d657fe5b6001600160a01b03909216602092830291909101909101526001016114aa565b506060835160010167ffffffffffffffff8111801561151457600080fd5b5060405190808252806020026020018201604052801561153e578160200160208202803683370190505b50905060008160008151811061155057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115bf5784818151811061158857fe5b602002602001015182826001018151811061159f57fe5b6001600160a01b0390921660209283029190910190910152600101611573565b506115cc87878484612483565b925050505b949350505050565b806115e38161258c565b5050565b60006115f783831115600161162c565b50900390565b600061160a848484612605565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e3576115e38161264b565b6109b86116456117da565b61019261162c565b60006116696003841080156116625750600383105b606461162c565b6060611673610769565b905061167f8582611e9c565b60008061168a610ae8565b91509150611696613af8565b60405180606001604052806116a9610ab7565b81526020810185905260400183905290506000895160018111156116c957fe5b141561172d576116f089606001518589815181106116e357fe5b6020026020010151612675565b60608a015260006117028a8a84612681565b90506117218186898151811061171457fe5b6020026020010151612748565b955050505050506115d1565b61174189606001518588815181106116e357fe5b60608a015260006117538a8a84612754565b905061172181868a8151811061176557fe5b6020026020010151612809565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cd90859061444c565b60405180910390a3505050565b60006117e461181b565b42118061090057505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006118496113f6565b6001600160a01b03166307a2d13a7f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401611894919061444c565b60206040518083038186803b1580156118ac57600080fd5b505afa9250505080156118dc575060408051601f3d908101601f191682019092526118d991810190613fa2565b60015b61191f573d80801561190a576040519150601f19603f3d011682016040523d82523d6000602084013e61190f565b606091505b5061191981612815565b506106fc565b90506106fc565b600082820261194a84158061194357508385838161194057fe5b04145b600361162c565b670de0b6b3a7640000815b04949350505050565b6119756001600160a01b038416151561019861162c565b61198c6001600160a01b038316151561019961162c565b611997838383610942565b6001600160a01b0383166000908152602081905260409020546119bd90826101a061289c565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119ec9082611c16565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cd90859061444c565b6000611a6d6000357fffffffff0000000000000000000000000000000000000000000000000000000016610f59565b9050611a84611a7c82336128b2565b61019161162c565b50565b6109b8611a92610fcf565b61299b565b6000806000611aa4610fcf565b6001600160a01b031663b05f8e48611aba610947565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611af8929190614647565b60806040518083038186803b158015611b1057600080fd5b505afa158015611b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4891906141af565b5050915091506000611b84828401611b7f7f0000000000000000000000000000000000000000000000000000000000000000612a4d565b612675565b905085811015801561065e57509390931115949350505050565b611bb164e8d4a5100082101560cb61162c565b611bc767016345785d8a000082111560ca61162c565b600854611bd8908260c0603f6115fd565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611c0b90839061444c565b60405180910390a150565b60008282016108e6848210158361162c565b8015611c4857611c43611c396117f7565b421061019361162c565b611c5d565b611c5d611c5361181b565b42106101a961162c565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611c0b908390614429565b6109b8611cc461116f565b156101b561162c565b600854611cdc908260ff612b27565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611c0b908390614429565b6001901b6000190191901c1690565b60006060611d2d6103e661264b565b935093915050565b333014611e24576000306001600160a01b0316600036604051611d59929190614300565b6000604051808303816000865af19150503d8060008114611d96576040519150601f19603f3d011682016040523d82523d6000602084013e611d9b565b606091505b505090508060008114611daa57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611e06573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611e378686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611eab908290612b36565b60005b8181101561111457611ee6848281518110611ec557fe5b6020026020010151848381518110611ed957fe5b6020026020010151611926565b848281518110611ef257fe5b6020908102919091010152600101611eae565b60008160200151831015611f3e5781516020830151600091611f2a9186900390611926565b9050611f3684826115e7565b915050610710565b81604001518311611f50575081610710565b81516040830151600091611f2a91860390611926565b60006108e68383611c16565b600061071082611f8061073a565b906115e7565b6000611f95821515600461162c565b670de0b6b3a76400008302611fc7841580611fc05750670de0b6b3a7640000858381611fbd57fe5b04145b600561162c565b6001836001830304018115150291505092915050565b6000808251118015610710575060ff80168280602001905181019061200291906141ef565b60ff161492915050565b6109b861201761116f565b6101b661162c565b60006060600061202e84612b43565b90506060865167ffffffffffffffff8111801561204a57600080fd5b50604051908082528060200260200182016040528015612074578160200160208202803683370190505b5090506000612081610f42565b90506000612094898381518110610c9c57fe5b905060006120a28583612b59565b905060005b8a5181101561210457838114156120bf5760006120e5565b6120e5828c83815181106120cf57fe5b602002602001015161192690919063ffffffff16565b8582815181106120f157fe5b60209081029190910101526001016120a7565b509399929850919650505050505050565b6115e38282612b99565b60006108e66103e661264b565b61213b8183111561014c61162c565b6121566b0de0b6b39983494c589c000082111561014d61162c565b61216e670de0b6b3a7640000825b061561016161162c565b612180670de0b6b3a764000083612164565b6121b5670de0b6b3a76400008204604060206121ad670de0b6b3a7640000876008549190046020806115fd565b9291906115fd565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121f590859085906146bc565b60405180910390a2505050565b600061220c610fcf565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561224457600080fd5b505afa158015612258573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610900919061409d565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b60006122cd85612c65565b90506122e36122dd878387612c81565b8361162c565b6122f2428410156101b861162c565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606123346001600160a01b038616301461015661162c565b61234b6001600160a01b038516301461015661162c565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff8160008151811061239a57fe5b602090810291909101015290969095509350505050565b6115e38282612d30565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612453612dc3565b3060405160200161246895949392919061461b565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016124b2919061467c565b602060405180830381600087803b1580156124cc57600080fd5b505af11580156124e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125049190613fa2565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d29061255090849088908890600401614595565b600060405180830381600087803b15801561256a57600080fd5b505af115801561257e573d6000803e3d6000fd5b509298975050505050505050565b60028151101561259b57611a84565b6000816000815181106125aa57fe5b602002602001015190506000600190505b82518110156109425760008382815181106125d257fe5b602002602001015190506125fb816001600160a01b0316846001600160a01b031610606561162c565b91506001016125bb565b6126146101008310606461162c565b61263c60018210158015611662575061263260ff8461010003611620565b821115606461162c565b61094283821c156101b461162c565b611a84817f42414c0000000000000000000000000000000000000000000000000000000000612dc7565b60006108e68383611926565b60208301516000906001600160a01b03163014156126ab576126a4848484612e42565b90506108e6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b031614156126f4576126a4848484612f9a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b0316141561273d576126a48484846130d7565b6108e661013561264b565b60006108e68383612b59565b60408301516000906001600160a01b0316301415612777576126a484848461320f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127c0576126a484848461335f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b0316141561273d576126a4848484613497565b60006108e68383611f86565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417612890578160208401fd5b506115e361016561264b565b60006128ab848411158361162c565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128d1610fab565b6001600160a01b0316141580156128ec57506128ec836135cf565b15612914576128f9610fab565b6001600160a01b0316336001600160a01b0316149050610710565b61291c612202565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161294b93929190614455565b60206040518083038186803b15801561296357600080fd5b505afa158015612977573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133c9190613f82565b604080516000808252602082019092526060916129ce565b6129bb613b43565b8152602001906001900390816129b35790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e8490612a1790849060040161435a565b600060405180830381600087803b158015612a3157600080fd5b505af1158015612a45573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612ab057507f0000000000000000000000000000000000000000000000000000000000000000610cd5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612afc57612af56107f261183f565b9050610cd5565b6001600160a01b038216301415612b1c5750670de0b6b3a7640000610cd5565b610cd561013561264b565b6001811b1992909216911b1790565b6115e3818314606761162c565b6000818060200190518101906108e6919061420b565b6000612b68821515600461162c565b670de0b6b3a76400008302612b90841580611fc05750670de0b6b3a7640000858381611fbd57fe5b82818161195557fe5b612bb06001600160a01b038316151561019b61162c565b612bbc82600083610942565b6001600160a01b038216600090815260208190526040902054612be290826101b261289c565b6001600160a01b038316600090815260208190526040902055612c15612c1082612c0a61073a565b90613633565b613641565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c59919061444c565b60405180910390a35050565b6000612c6f6123e6565b82604051602001610f8e929190614310565b6000612c9382516041146101b961162c565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612ccc90899085908890889061465e565b6020604051602081039080840390855afa158015612cee573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612d245750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612d3c60008383610942565b612d51612c1082612d4b61073a565b90611c16565b6001600160a01b038216600090815260208190526040902054612d749082611c16565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c5990859061444c565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612ec87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162c565b6115d18460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612efc57fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f3057fe5b6020026020010151612f4887600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612f8e57613646612f92565b6136a45b63ffffffff16565b6000612ff67f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec0575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b031630146130515761304c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061303e57fe5b60200260200101518461370d565b6115d1565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061308557fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130b957fe5b60200260200101516130d187600081518110610c9c57fe5b8661373d565b60006131337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec0575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b031630146131895761304c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061317b57fe5b6020026020010151846137a3565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131bd57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106131f157fe5b602002602001015161320987600081518110610c9c57fe5b866137e3565b60006132947f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162c565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132c857fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106132fc57fe5b602002602001015161331487600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461335a5761384a612f92565b6138a1565b60006133bb7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec0575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b031630146134115761304c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061340357fe5b60200260200101518461390b565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061344557fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061347957fe5b602002602001015161349187600081518110610c9c57fe5b86613935565b60006134f37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec0575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b031630146135495761304c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061353b57fe5b602002602001015184613984565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061357d57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106135b157fe5b60200260200101516135c987600081518110610c9c57fe5b866139b9565b60006135fa7f9f11080e00000000000000000000000000000000000000000000000000000000610f59565b821480610710575061362b7f38e9922e00000000000000000000000000000000000000000000000000000000610f59565b909114919050565b60006108e68383600161289c565b600255565b6000806136538684611f05565b905060006136618287611f66565b9050600061366f868a6115e7565b9050600061368a84611f806136848587613a0d565b8a613a27565b905061369688826115e7565b9a9950505050505050505050565b6000806136b18684611f05565b905060006136bf8287611f66565b905060006136d66136d0838b613a0d565b87613a48565b905060006136e484836115e7565b905060006136f28288613a68565b90506136fe8a826115e7565b9b9a5050505050505050505050565b60008061371a8484611f05565b9050600061373161372b8688611c16565b85611f05565b905061065e81836115e7565b6000826137555761374e8683611f05565b905061109f565b60006137618684611f05565b9050600061377261372b888a611c16565b9050600061378082846115e7565b9050600061378e8489611f66565b905061369661379d8884613a0d565b82613a48565b6000806137b08484611f05565b905060006137be82876115e7565b905060006137cc8286613a68565b90506137d886826115e7565b979650505050505050565b6000826137f157508461109f565b60006137fd8684611f05565b9050600061380b8287611f66565b90506000613819878a611c16565b905060006138278483611f66565b9050600061383e6138388984613a0d565b85613a48565b90506136fe81896115e7565b60008261385857508461109f565b60006138648684611f05565b905060006138728287611f66565b90506000613880868a611c16565b9050600061389584611f806136848587613a0d565b905061369681896115e7565b6000826138b25761374e8683613a68565b60006138be8684611f05565b905060006138cc8287611f66565b905060006138e36138dd838b613a0d565b87613a27565b905060006138f18483611c16565b905060006138ff8288613a68565b90506136fe818b6115e7565b6000806139188484611f05565b9050600061392961372b86886115e7565b905061065e82826115e7565b6000806139428684611f05565b9050600061395361372b888a6115e7565b9050600061396183836115e7565b9050600061396f8489611f66565b905061369661397e8884613a0d565b82613a27565b6000806139918484611f05565b9050600061399f8287611c16565b905060006139ad8286613a68565b90506137d881876115e7565b6000806139c68684611f05565b905060006139d48287611f66565b905060006139e2878a6115e7565b905060006139f08483611f66565b90506000613a016138388984613a0d565b90506136fe88826115e7565b60008282026108e684158061194357508385838161194057fe5b6000613a36821515600461162c565b50811515600019909201046001010290565b6000613a57821515600461162c565b818381613a6057fe5b049392505050565b60008160200151831015613ab157815161133c90613a8f90670de0b6b3a764000090611c16565b60208401518451613aab91613aa49190611926565b8690611c16565b90612b59565b81604001518311613ac3575081610710565b815161133c90613adc90670de0b6b3a7640000906115e7565b60408401518451613aab91613af19190611926565b86906115e7565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b80356107108161472b565b600082601f830112613b8e578081fd5b8135613ba1613b9c826146ff565b6146d8565b818152915060208083019084810181840286018201871015613bc257600080fd5b60005b84811015613be157813584529282019290820190600101613bc5565b505050505092915050565b600082601f830112613bfc578081fd5b8151613c0a613b9c826146ff565b818152915060208083019084810181840286018201871015613c2b57600080fd5b60005b84811015613be157815184529282019290820190600101613c2e565b600082601f830112613c5a578081fd5b813567ffffffffffffffff811115613c70578182fd5b613c836020601f19601f840116016146d8565b9150808252836020828501011115613c9a57600080fd5b8060208401602084013760009082016020015292915050565b80356002811061071057600080fd5b6000610120808385031215613cd5578182fd5b613cde816146d8565b915050613ceb8383613cb3565b8152613cfa8360208401613b73565b6020820152613d0c8360408401613b73565b6040820152606082013560608201526080820135608082015260a082013560a0820152613d3c8360c08401613b73565b60c0820152613d4e8360e08401613b73565b60e08201526101008083013567ffffffffffffffff811115613d6f57600080fd5b613d7b85828601613c4a565b82840152505092915050565b600060208284031215613d98578081fd5b81356108e68161472b565b60008060408385031215613db5578081fd5b8235613dc08161472b565b91506020830135613dd08161472b565b809150509250929050565b600080600060608486031215613def578081fd5b8335613dfa8161472b565b92506020840135613e0a8161472b565b929592945050506040919091013590565b600080600080600080600060e0888a031215613e35578283fd5b8735613e408161472b565b96506020880135613e508161472b565b955060408801359450606088013593506080880135613e6e81614740565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613e9d578182fd5b8235613ea88161472b565b946020939093013593505050565b600080600060608486031215613eca578081fd5b835167ffffffffffffffff80821115613ee1578283fd5b818601915086601f830112613ef4578283fd5b8151613f02613b9c826146ff565b80828252602080830192508086018b828387028901011115613f22578788fd5b8796505b84871015613f4d578051613f398161472b565b845260019690960195928101928101613f26565b508901519097509350505080821115613f64578283fd5b50613f7186828701613bec565b925050604084015190509250925092565b600060208284031215613f93578081fd5b815180151581146108e6578182fd5b600060208284031215613fb3578081fd5b5051919050565b600080600080600080600060e0888a031215613fd4578081fd5b873596506020880135613fe68161472b565b95506040880135613ff68161472b565b9450606088013567ffffffffffffffff80821115614012578283fd5b61401e8b838c01613b7e565b955060808a0135945060a08a0135935060c08a0135915080821115614041578283fd5b5061404e8a828b01613c4a565b91505092959891949750929550565b60006020828403121561406e578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e6578182fd5b6000602082840312156140ae578081fd5b81516108e68161472b565b600080600080608085870312156140ce578182fd5b843567ffffffffffffffff808211156140e5578384fd5b6140f188838901613cc2565b95506020870135915080821115614106578384fd5b5061411387828801613b7e565b949794965050505060408301359260600135919050565b60008060006060848603121561413e578081fd5b833567ffffffffffffffff811115614154578182fd5b61416086828701613cc2565b9660208601359650604090950135949350505050565b600060208284031215614187578081fd5b5035919050565b600080604083850312156141a0578182fd5b50508035926020909101359150565b600080600080608085870312156141c4578182fd5b84519350602085015192506040850151915060608501516141e48161472b565b939692955090935050565b600060208284031215614200578081fd5b81516108e681614740565b6000806040838503121561421d578182fd5b825161422881614740565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b8381101561427457815187529582019590820190600101614258565b509495945050505050565b15159052565b60008151808452815b818110156142aa5760208185018101518683018201520161428e565b818111156142bb5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b828110156143e457815180516004811061438d57fe5b85528087015161439f88870182614238565b5085810151868601526060808201516143ba82880182614238565b5050608090810151906143cf86820183614238565b505060a0939093019290850190600101614377565b5091979650505050505050565b6000602082526108e66020830184614245565b6000604082526144176040830185614245565b828103602084015261109f8185614245565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156144e5576144cf845161471f565b82529284019260019290920191908401906144bd565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a08701526145238185614245565b935050506040850151818584030160c08601526145408382614285565b92505050606084015161455660e085018261427f565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b818110156145dd576145cb855161471f565b835293830193918301916001016145b9565b505084810360408601528551808252908201925081860190845b8181101561257e57614609835161471f565b855293830193918301916001016145f7565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016003831061468a57fe5b91905290565b6000602082526108e66020830184614285565b6000838252604060208301526115d16040830184614245565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156146f757600080fd5b604052919050565b600067ffffffffffffffff821115614715578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114611a8457600080fd5b60ff81168114611a8457600080fdfea26469706673582212202abc871448efbae7fc96ae47c1b1ecf59114edd2396d5be66e0cdb10faeb591b64736f6c63430007010033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c80636634b753116200009957806376895be7116200006f57806376895be714620001cd578063851c1bb314620001e45780638d928af8146200020a578063aaabadc5146200021457620000ff565b80636634b75314620001935780636c57f5a914620001b9578063739238d614620001c357620000ff565b80632f2770db11620000db5780632f2770db146200015a5780633f819b6f146200016657806354fd4d5014620001705780635ed31282146200017a57620000ff565b8062c194db1462000104578063174481fa14620001265780632da47c401462000140575b600080fd5b6200010e6200021e565b6040516200011d919062001459565b60405180910390f35b620001306200023f565b6040516200011d929190620013f2565b6200014a62000285565b6040516200011d92919062001652565b620001646200030e565b005b6200010e62000378565b6200010e62000430565b62000184620004b2565b6040516200011d9190620013d1565b620001aa620001a43660046200114d565b620004ce565b6040516200011d919062001419565b620001aa620004f9565b6200018462000502565b62000184620001de366004620011f6565b62000526565b620001fb620001f536600462001195565b620008ee565b6040516200011d919062001424565b6200018462000942565b6200018462000966565b60606200023a6040518060200160405280600081525062000a54565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200030057807f00000000000000000000000000000000000000000000000000000000000000000392507f0000000000000000000000000000000000000000000000000000000000000000915062000309565b60009250600091505b509091565b6200031862000b2f565b6200032262000b7e565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b820191906000526020600020905b8154815290600101906020018083116200040857829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006200053262000b97565b6004805460018101909155604051606090620005516020820162000fe1565b601f1982820381018352601f909101166040526200056e62000942565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001620005a2929190620013f2565b60408051601f1981840301815290829052620005c292916020016200139e565b60405160208183030381529060405290506000620005e883838051906020012062000bb2565b9050600080620005f762000285565b915091506200060562000fef565b6200060f62000942565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508f81602001819052508e81604001819052508d816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508c816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b8160c00181815250508a8160e0018181525050828161010001818152505081816101200181815250508981610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506200076d62000378565b610160820152604051600090620007a4906200078e9084906020016200154a565b6040516020818303038152906040528a62000bca565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620007ef57600080fd5b505af115801562000804573d6000803e3d6000fd5b505050506000620008186000898962000c21565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146200088b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088290620014dc565b60405180910390fd5b6040518b9073ffffffffffffffffffffffffffffffffffffffff8416907f45dd615d2ed7994f98fec837b2d092af933c6520b8717c3a64317961caa532ea90600090a3509650505050505050620008e162000cff565b9998505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001620009259291906200136e565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006200097262000942565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620009b857600080fd5b505afa158015620009cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023a9190620011d7565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000a4e73ffffffffffffffffffffffffffffffffffffffff831615156101ac62000d06565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000b2181838662000d1b565b505050505050505050919050565b600062000b606000357fffffffff0000000000000000000000000000000000000000000000000000000016620008ee565b905062000b7b62000b72823362000d79565b61019162000d06565b50565b62000b9562000b8c620004f9565b1560d362000d06565b565b62000bab6002600354141561019062000d06565b6002600355565b600062000bc183833062000e17565b90505b92915050565b60008062000bd9848462000e58565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316179055949350505050565b6000808447101562000c61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000882906200146e565b825162000c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008829062001513565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088290620014a5565b949350505050565b6001600355565b8162000d175762000d178162000ef5565b5050565b5b6020811062000d3d578151835260209283019290910190601f190162000d1c565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000d8562000966565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000dc3939291906200142d565b60206040518083038186803b15801562000ddc57600080fd5b505afa15801562000df1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bc1919062001173565b60008060ff60f81b83868660405160200162000e3794939291906200130a565b60408051808303601f19018152919052805160209091012095945050505050565b600062000e6462000b7e565b600062000e72848462000f21565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a29392505050565b62000b7b817f42414c000000000000000000000000000000000000000000000000000000000062000f66565b6000606062000f308462000a54565b90506000838251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf7573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611de080620016b783390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b803562000bc48162001693565b600082601f830112620010dc578081fd5b813567ffffffffffffffff80821115620010f4578283fd5b6040516020601f19601f850116820101818110838211171562001115578485fd5b6040528281529250828483016020018610156200113157600080fd5b8260208601602083013760006020848301015250505092915050565b6000602082840312156200115f578081fd5b81356200116c8162001693565b9392505050565b60006020828403121562001185578081fd5b815180151581146200116c578182fd5b600060208284031215620011a7578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146200116c578182fd5b600060208284031215620011e9578081fd5b81516200116c8162001693565b60008060008060008060008060006101208a8c03121562001215578485fd5b893567ffffffffffffffff808211156200122d578687fd5b6200123b8d838e01620010cb565b9a5060208c013591508082111562001251578687fd5b50620012608c828d01620010cb565b98505060408a0135620012738162001693565b965060608a0135620012858162001693565b955060808a0135945060a08a01359350620012a48b60c08c01620010be565b925060e08a013591506101008a013590509295985092959850929598565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620012f681602086016020860162001660565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60008351620013b281846020880162001660565b835190830190620013c881836020880162001660565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000bc16020830184620012dc565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b60006020825262001560602083018451620012c2565b60208301516101808060408501526200157e6101a0850183620012dc565b91506040850151601f19808685030160608701526200159e8483620012dc565b935060608701519150620015b66080870183620012c2565b60808701519150620015cc60a0870183620012c2565b60a08701519150620015e260c0870183620012c2565b60c087015160e08781019190915287015161010080880191909152870151610120808801919091528701516101408088019190915287015191506101606200162d81880184620012c2565b870151868503909101838701529050620016488382620012dc565b9695505050505050565b918252602082015260400190565b60005b838110156200167d57818101518382015260200162001663565b838111156200168d576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000b7b57600080fdfe6101606040523480156200001257600080fd5b5060405162001de038038062001de0833981016040819052620000359162000462565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000378565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200012591908101906200039e565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000449565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000449565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000378565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000378565b6001600160601b0319606091821b811660e05292811b8316610120521b166101405250620004e0915050565b6000602082840312156200038a578081fd5b81516200039781620004c7565b9392505050565b60006020808385031215620003b1578182fd5b82516001600160401b0380821115620003c8578384fd5b818501915085601f830112620003dc578384fd5b815181811115620003eb578485fd5b8381029150620003fd848301620004a0565b8181528481019084860184860187018a101562000418578788fd5b8795505b838610156200043c5780518352600195909501949186019186016200041c565b5098975050505050505050565b6000602082840312156200045b578081fd5b5051919050565b6000806040838503121562000475578081fd5b82516200048281620004c7565b60208401519092506200049581620004c7565b809150509250929050565b6040518181016001600160401b0381118282101715620004bf57600080fd5b604052919050565b6001600160a01b0381168114620004dd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c61181d620005c36000398061050952806108215250806101335280610c145280610f325280610f945250806103bf52508061046c5280610599528061074852806108ec5280610cbf528061102d52806110ee528061115052508060ea5280610190528061043052806105cc528061063152806106d2528061078452806108b152806110cc52508061016f5280610402528061071a5280610a7d5280610b5c5280610dba5280610e9952508060995280610309525061181d6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611527565b60405180910390f35b6100776100723660046113e5565b6100bb565b60405161005b919061175a565b610077610092366004611401565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc929190611673565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c9190611487565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a9392919061156f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a49190611464565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f5611332565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c9611395565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611697565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610592919061144c565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d4e565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611527565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b6919061144c565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fc9565b9695505050505050565b600061070d611332565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e1611395565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611697565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa919061144c565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fed565b6110b2565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d4e565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a919061150b565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b6919061142c565b6101a2611187565b60006109cd8215156004611187565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b6005611187565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f6113bc565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016115ef565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517fba08765200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ba08765290610cf890849030908190600401611763565b602060405180830381600087803b158015610d1257600080fd5b505af1158015610d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4a919061144c565b5050565b6040805160028082526060828101909352816020015b610d6c6113bc565b815260200190600190039081610d64579050509050600281600081518110610d9057fe5b6020026020010151600001906002811115610da757fe5b90816002811115610db457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de657fe5b602002602001015160200181815250508181600081518110610e0457fe5b602002602001015160600181815250508281600081518110610e2257fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e6f57fe5b6020026020010151600001906002811115610e8657fe5b90816002811115610e9357fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec557fe5b602002602001015160200181815250508181600181518110610ee357fe5b602002602001015160600181815250508281600181518110610f0157fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f579084167f000000000000000000000000000000000000000000000000000000000000000084611195565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016115ef565b610fe88363a9059cbb60e01b848460405160240161027a9291906115c9565b505050565b6040517fb3d7f6b900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b3d7f6b99061106290859060040161175a565b60206040518083038186803b15801561107a57600080fd5b505afa15801561108e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100c6919061144c565b61111373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611195565b6040517f6e553f6500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636e553f6590610cf89084903090600401611673565b81610d4a57610d4a8161128a565b801580159061124657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e906111f39030908690600401611548565b60206040518083038186803b15801561120b57600080fd5b505afa15801561121f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611243919061144c565b15155b1561126b5761126b8363095ea7b360e01b84600060405160240161027a9291906115a0565b610fe88363095ea7b360e01b848460405160240161027a9291906115c9565b6112b4817f42414c00000000000000000000000000000000000000000000000000000000006112b7565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6000602082840312156113f6578081fd5b813561011b816117c5565b60008060408385031215611413578081fd5b823561141e816117c5565b946020939093013593505050565b60006020828403121561143d578081fd5b8151801515811461011b578182fd5b60006020828403121561145d578081fd5b5051919050565b60008060408385031215611476578182fd5b505080516020909101519092909150565b6000806000806080858703121561149c578182fd5b84519350602085015192506040850151915060608501516114bc816117c5565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161151d81846020870161178f565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561166657815180516003811061162257fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff1686860152606090810151908501526080909301929085019060010161160c565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a083015260208401516116b2816117bb565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c061014084015280518061016085015261018061171e828287016020860161178f565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b60208301846114c7565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60005b838110156117aa578181015183820152602001611792565b838111156102fc5750506000910152565b600281106112b457fe5b73ffffffffffffffffffffffffffffffffffffffff811681146112b457600080fdfea264697066735822122036d3be9a4702beeeaf84ed61b5a1ad96e4463c44e76b17de0545dd15aa231f2864736f6c63430007010033a264697066735822122023a01662fba4cf148e4541e96f33749613e38a02c178cf92baf792d9aceca72b64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/artifact/ERC4626LinearPoolRebalancer.json b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/artifact/ERC4626LinearPoolRebalancer.json new file mode 100644 index 0000000..bee57e7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/artifact/ERC4626LinearPoolRebalancer.json @@ -0,0 +1,83 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ERC4626LinearPoolRebalancer", + "sourceName": "contracts/erc4626-linear-pool/ERC4626LinearPoolRebalancer.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IBalancerQueries", + "name": "queries", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "getPool", + "outputs": [ + { + "internalType": "contract ILinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "rebalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "extraMain", + "type": "uint256" + } + ], + "name": "rebalanceWithExtraMain", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101606040523480156200001257600080fd5b5060405162001de038038062001de0833981016040819052620000359162000462565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000378565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200012591908101906200039e565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000449565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000449565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000378565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000378565b6001600160601b0319606091821b811660e05292811b8316610120521b166101405250620004e0915050565b6000602082840312156200038a578081fd5b81516200039781620004c7565b9392505050565b60006020808385031215620003b1578182fd5b82516001600160401b0380821115620003c8578384fd5b818501915085601f830112620003dc578384fd5b815181811115620003eb578485fd5b8381029150620003fd848301620004a0565b8181528481019084860184860187018a101562000418578788fd5b8795505b838610156200043c5780518352600195909501949186019186016200041c565b5098975050505050505050565b6000602082840312156200045b578081fd5b5051919050565b6000806040838503121562000475578081fd5b82516200048281620004c7565b60208401519092506200049581620004c7565b809150509250929050565b6040518181016001600160401b0381118282101715620004bf57600080fd5b604052919050565b6001600160a01b0381168114620004dd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c61181d620005c36000398061050952806108215250806101335280610c145280610f325280610f945250806103bf52508061046c5280610599528061074852806108ec5280610cbf528061102d52806110ee528061115052508060ea5280610190528061043052806105cc528061063152806106d2528061078452806108b152806110cc52508061016f5280610402528061071a5280610a7d5280610b5c5280610dba5280610e9952508060995280610309525061181d6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611527565b60405180910390f35b6100776100723660046113e5565b6100bb565b60405161005b919061175a565b610077610092366004611401565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc929190611673565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c9190611487565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a9392919061156f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a49190611464565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f5611332565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c9611395565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611697565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610592919061144c565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d4e565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611527565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b6919061144c565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fc9565b9695505050505050565b600061070d611332565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e1611395565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611697565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa919061144c565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fed565b6110b2565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d4e565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a919061150b565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b6919061142c565b6101a2611187565b60006109cd8215156004611187565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b6005611187565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f6113bc565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016115ef565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517fba08765200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ba08765290610cf890849030908190600401611763565b602060405180830381600087803b158015610d1257600080fd5b505af1158015610d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4a919061144c565b5050565b6040805160028082526060828101909352816020015b610d6c6113bc565b815260200190600190039081610d64579050509050600281600081518110610d9057fe5b6020026020010151600001906002811115610da757fe5b90816002811115610db457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de657fe5b602002602001015160200181815250508181600081518110610e0457fe5b602002602001015160600181815250508281600081518110610e2257fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e6f57fe5b6020026020010151600001906002811115610e8657fe5b90816002811115610e9357fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec557fe5b602002602001015160200181815250508181600181518110610ee357fe5b602002602001015160600181815250508281600181518110610f0157fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f579084167f000000000000000000000000000000000000000000000000000000000000000084611195565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016115ef565b610fe88363a9059cbb60e01b848460405160240161027a9291906115c9565b505050565b6040517fb3d7f6b900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b3d7f6b99061106290859060040161175a565b60206040518083038186803b15801561107a57600080fd5b505afa15801561108e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100c6919061144c565b61111373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611195565b6040517f6e553f6500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636e553f6590610cf89084903090600401611673565b81610d4a57610d4a8161128a565b801580159061124657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e906111f39030908690600401611548565b60206040518083038186803b15801561120b57600080fd5b505afa15801561121f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611243919061144c565b15155b1561126b5761126b8363095ea7b360e01b84600060405160240161027a9291906115a0565b610fe88363095ea7b360e01b848460405160240161027a9291906115c9565b6112b4817f42414c00000000000000000000000000000000000000000000000000000000006112b7565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6000602082840312156113f6578081fd5b813561011b816117c5565b60008060408385031215611413578081fd5b823561141e816117c5565b946020939093013593505050565b60006020828403121561143d578081fd5b8151801515811461011b578182fd5b60006020828403121561145d578081fd5b5051919050565b60008060408385031215611476578182fd5b505080516020909101519092909150565b6000806000806080858703121561149c578182fd5b84519350602085015192506040850151915060608501516114bc816117c5565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161151d81846020870161178f565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561166657815180516003811061162257fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff1686860152606090810151908501526080909301929085019060010161160c565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a083015260208401516116b2816117bb565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c061014084015280518061016085015261018061171e828287016020860161178f565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b60208301846114c7565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60005b838110156117aa578181015183820152602001611792565b838111156102fc5750506000910152565b600281106112b457fe5b73ffffffffffffffffffffffffffffffffffffffff811681146112b457600080fdfea264697066735822122036d3be9a4702beeeaf84ed61b5a1ad96e4463c44e76b17de0545dd15aa231f2864736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611527565b60405180910390f35b6100776100723660046113e5565b6100bb565b60405161005b919061175a565b610077610092366004611401565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc929190611673565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c9190611487565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a9392919061156f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a49190611464565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f5611332565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c9611395565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611697565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610592919061144c565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d4e565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611527565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b6919061144c565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fc9565b9695505050505050565b600061070d611332565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e1611395565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611697565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa919061144c565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fed565b6110b2565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d4e565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a919061150b565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b6919061142c565b6101a2611187565b60006109cd8215156004611187565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b6005611187565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f6113bc565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016115ef565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517fba08765200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ba08765290610cf890849030908190600401611763565b602060405180830381600087803b158015610d1257600080fd5b505af1158015610d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4a919061144c565b5050565b6040805160028082526060828101909352816020015b610d6c6113bc565b815260200190600190039081610d64579050509050600281600081518110610d9057fe5b6020026020010151600001906002811115610da757fe5b90816002811115610db457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de657fe5b602002602001015160200181815250508181600081518110610e0457fe5b602002602001015160600181815250508281600081518110610e2257fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e6f57fe5b6020026020010151600001906002811115610e8657fe5b90816002811115610e9357fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec557fe5b602002602001015160200181815250508181600181518110610ee357fe5b602002602001015160600181815250508281600181518110610f0157fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f579084167f000000000000000000000000000000000000000000000000000000000000000084611195565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016115ef565b610fe88363a9059cbb60e01b848460405160240161027a9291906115c9565b505050565b6040517fb3d7f6b900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b3d7f6b99061106290859060040161175a565b60206040518083038186803b15801561107a57600080fd5b505afa15801561108e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100c6919061144c565b61111373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611195565b6040517f6e553f6500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636e553f6590610cf89084903090600401611673565b81610d4a57610d4a8161128a565b801580159061124657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e906111f39030908690600401611548565b60206040518083038186803b15801561120b57600080fd5b505afa15801561121f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611243919061144c565b15155b1561126b5761126b8363095ea7b360e01b84600060405160240161027a9291906115a0565b610fe88363095ea7b360e01b848460405160240161027a9291906115c9565b6112b4817f42414c00000000000000000000000000000000000000000000000000000000006112b7565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6000602082840312156113f6578081fd5b813561011b816117c5565b60008060408385031215611413578081fd5b823561141e816117c5565b946020939093013593505050565b60006020828403121561143d578081fd5b8151801515811461011b578182fd5b60006020828403121561145d578081fd5b5051919050565b60008060408385031215611476578182fd5b505080516020909101519092909150565b6000806000806080858703121561149c578182fd5b84519350602085015192506040850151915060608501516114bc816117c5565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161151d81846020870161178f565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561166657815180516003811061162257fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff1686860152606090810151908501526080909301929085019060010161160c565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a083015260208401516116b2816117bb565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c061014084015280518061016085015261018061171e828287016020860161178f565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b60208301846114c7565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60005b838110156117aa578181015183820152602001611792565b838111156102fc5750506000910152565b600281106112b457fe5b73ffffffffffffffffffffffffffffffffffffffff811681146112b457600080fdfea264697066735822122036d3be9a4702beeeaf84ed61b5a1ad96e4463c44e76b17de0545dd15aa231f2864736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/index.ts b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/index.ts new file mode 100644 index 0000000..3fa9137 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/index.ts @@ -0,0 +1,106 @@ +import { randomBytes } from 'ethers/lib/utils'; +import { ethers } from 'hardhat'; + +import { bn } from '@helpers/numbers'; +import { getContractDeploymentTransactionHash, saveContractDeploymentTransactionHash } from '@src'; +import { Task, TaskMode, TaskRunOptions } from '@src'; +import { ERC4626LinearPoolDeployment } from './input'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import * as expectEvent from '@helpers/expectEvent'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as ERC4626LinearPoolDeployment; + const args = [ + input.Vault, + input.ProtocolFeePercentagesProvider, + input.BalancerQueries, + input.FactoryVersion, + input.PoolVersion, + input.InitialPauseWindowDuration, + input.BufferPeriodDuration, + ]; + + const factory = await task.deployAndVerify('ERC4626LinearPoolFactory', args, from, force); + + if (task.mode === TaskMode.LIVE) { + // We also create a Pool using the factory and verify it, to let us compute their action IDs and so that future + // Pools are automatically verified. We however don't run any of this code in CHECK mode, since we don't care about + // the contracts deployed here. The action IDs will be checked to be correct via a different mechanism. + + // ERC4626LinearPools require an ERC4626 Token + const mockErc4626TokenArgs = ['DO NOT USE - Mock ERC4626 Token', 'TEST', 18, input.WETH]; + const mockErc4626Token = await task.deployAndVerify('MockERC4626Token', mockErc4626TokenArgs, from, force); + + // The assetManager, pauseWindowDuration and bufferPeriodDuration will be filled in later, but we need to declare + // them here to appease the type system. Those are constructor arguments, but automatically provided by the factory. + const mockPoolArgs = { + vault: input.Vault, + name: 'DO NOT USE - Mock Linear Pool', + symbol: 'TEST', + mainToken: input.WETH, + wrappedToken: mockErc4626Token.address, + assetManager: undefined, + upperTarget: 0, + pauseWindowDuration: undefined, + bufferPeriodDuration: undefined, + swapFeePercentage: bn(1e12), + owner: ZERO_ADDRESS, + version: input.PoolVersion, + }; + + // This mimics the logic inside task.deploy + if (force || !task.output({ ensure: false })['MockERC4626LinearPool']) { + const PROTOCOL_ID = 0; + const SALT = randomBytes(32); + + const poolCreationReceipt = await ( + await factory.create( + mockPoolArgs.name, + mockPoolArgs.symbol, + mockPoolArgs.mainToken, + mockPoolArgs.wrappedToken, + mockPoolArgs.upperTarget, + mockPoolArgs.swapFeePercentage, + mockPoolArgs.owner, + PROTOCOL_ID, + SALT + ) + ).wait(); + const event = expectEvent.inReceipt(poolCreationReceipt, 'PoolCreated'); + const mockPoolAddress = event.args.pool; + + await saveContractDeploymentTransactionHash(mockPoolAddress, poolCreationReceipt.transactionHash, task.network); + await task.save({ MockERC4626LinearPool: mockPoolAddress }); + } + + const mockPool = await task.instanceAt('ERC4626LinearPool', task.output()['MockERC4626LinearPool']); + + // In order to verify the Pool's code, we need to complete its constructor arguments by computing the factory + // provided arguments (asset manager and pause durations). + + // The asset manager is found by querying the Vault + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, task.network); + const vault = await vaultTask.deployedInstance('Vault'); + + const { assetManager: assetManagerAddress } = await vault.getPoolTokenInfo(await mockPool.getPoolId(), input.WETH); + mockPoolArgs.assetManager = assetManagerAddress; + + // The durations require knowing when the Pool was created, so we look for the timestamp of its creation block. + const txHash = await getContractDeploymentTransactionHash(mockPool.address, task.network); + const tx = await ethers.provider.getTransactionReceipt(txHash); + const poolCreationBlock = await ethers.provider.getBlock(tx.blockNumber); + + // With those and the period end times, we can compute the durations. + const { pauseWindowEndTime, bufferPeriodEndTime } = await mockPool.getPausedState(); + mockPoolArgs.pauseWindowDuration = pauseWindowEndTime.sub(poolCreationBlock.timestamp); + mockPoolArgs.bufferPeriodDuration = bufferPeriodEndTime + .sub(poolCreationBlock.timestamp) + .sub(mockPoolArgs.pauseWindowDuration); + + // We are now ready to verify the Pool + await task.verify('ERC4626LinearPool', mockPool.address, [mockPoolArgs]); + + // We can also verify the Asset Manager + await task.verify('ERC4626LinearPoolRebalancer', assetManagerAddress, [input.Vault, input.BalancerQueries]); + } +}; diff --git a/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/input.ts b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/input.ts new file mode 100644 index 0000000..2abf91c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/input.ts @@ -0,0 +1,31 @@ +import { Task, TaskMode } from '@src'; +import { MONTH } from '@helpers/time'; + +export type ERC4626LinearPoolDeployment = { + Vault: string; + BalancerQueries: string; + ProtocolFeePercentagesProvider: string; + WETH: string; + FactoryVersion: string; + PoolVersion: string; + InitialPauseWindowDuration: number; + BufferPeriodDuration: number; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerQueries = new Task('20220721-balancer-queries', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); +const WETH = new Task('00000000-tokens', TaskMode.READ_ONLY); + +const BaseVersion = { version: 4, deployment: '20230409-erc4626-linear-pool-v4' }; + +export default { + Vault, + BalancerQueries, + ProtocolFeePercentagesProvider, + WETH, + FactoryVersion: JSON.stringify({ name: 'ERC4626LinearPoolFactory', ...BaseVersion }), + PoolVersion: JSON.stringify({ name: 'ERC4626LinearPool', ...BaseVersion }), + InitialPauseWindowDuration: MONTH * 3, + BufferPeriodDuration: MONTH, +}; diff --git a/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/arbitrum.json b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/arbitrum.json new file mode 100644 index 0000000..ee194b6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/arbitrum.json @@ -0,0 +1,5 @@ +{ + "ERC4626LinearPoolFactory": "0x7ADbdabaA80F654568421887c12F09E0C7BD9629", + "MockERC4626Token": "0x4bE0E4d6184348c5BA845a4010528CFC779610b8", + "MockERC4626LinearPool": "0x3f53A862919ccFA023CB6AcE91378a79Fb0F6Bf5" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/avalanche.json b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/avalanche.json new file mode 100644 index 0000000..562f1c8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/avalanche.json @@ -0,0 +1,5 @@ +{ + "ERC4626LinearPoolFactory": "0x4507d91Cd2C0D51D9B4F30Bf0B93AFC938A70BA5", + "MockERC4626Token": "0x2EbE41E1aa44D61c206A94474932dADC7D3FD9E3", + "MockERC4626LinearPool": "0xEd3E2F496cbCd8e212192fb8D1499842f04A0D19" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/base.json b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/base.json new file mode 100644 index 0000000..a2cb0d9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/base.json @@ -0,0 +1,5 @@ +{ + "ERC4626LinearPoolFactory": "0x161f4014C27773840ccb4EC1957113e6DD028846", + "MockERC4626Token": "0x4638ab64022927C9bD5947607459D13f57f1551C", + "MockERC4626LinearPool": "0x1CC2E10C486Ffb7228810B9c7C183d0CD92cdF44" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/mainnet.json b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/mainnet.json new file mode 100644 index 0000000..373bf57 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/mainnet.json @@ -0,0 +1,5 @@ +{ + "ERC4626LinearPoolFactory": "0x813EE7a840CE909E7Fea2117A44a90b8063bd4fd", + "MockERC4626Token": "0xB99eDc4b289B0F2284fCF3f66884191BdCe29624", + "MockERC4626LinearPool": "0x9516a2d25958EdB8da246a320f2c7d94A0DBe25d" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/optimism.json b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/optimism.json new file mode 100644 index 0000000..8ac5a22 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/optimism.json @@ -0,0 +1,5 @@ +{ + "ERC4626LinearPoolFactory": "0x7ADbdabaA80F654568421887c12F09E0C7BD9629", + "MockERC4626Token": "0x4bE0E4d6184348c5BA845a4010528CFC779610b8", + "MockERC4626LinearPool": "0x2DA61Ef3Cdcb97efb0f7099c02527fabFe94Dee5" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/polygon.json b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/polygon.json new file mode 100644 index 0000000..b08bc0e --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/polygon.json @@ -0,0 +1,5 @@ +{ + "ERC4626LinearPoolFactory": "0x5C5fCf8fBd4cd563cED27e7D066b88ee20E1867A", + "MockERC4626Token": "0x19DFEF0a828EEC0c85FbB335aa65437417390b85", + "MockERC4626LinearPool": "0xc55eC796A4dEBE625d95436a3531f4950b11bdcf" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/sepolia.json b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/sepolia.json new file mode 100644 index 0000000..1cd695c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/sepolia.json @@ -0,0 +1,5 @@ +{ + "ERC4626LinearPoolFactory": "0x59562f93c447656F6E4799fC1FC7c3d977C3324F", + "MockERC4626Token": "0x2498A2B0d6462d2260EAC50aE1C3e03F4829BA95", + "MockERC4626LinearPool": "0x0c2EAd6F2Dc2A9385187023F4cec5925337B330f" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/zkevm.json b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/zkevm.json new file mode 100644 index 0000000..fff4e4b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/output/zkevm.json @@ -0,0 +1,5 @@ +{ + "ERC4626LinearPoolFactory": "0x6B1Da720Be2D11d95177ccFc40A917c2688f396c", + "MockERC4626Token": "0x0c6052254551EAe3ECac77B01DFcf1025418828f", + "MockERC4626LinearPool": "0xac4b72c01072A52b73ca71105504F1372eFcCE0d" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/readme.md b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/readme.md new file mode 100644 index 0000000..2204f6e --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/readme.md @@ -0,0 +1,18 @@ +# 2023-04-09 - ERC4626 Linear Pool V4 + +Fourth deployment of the `ERC4626LinearPoolFactory`, for Linear Pools with a ERC4626 yield-bearing token. +Supersedes `20230206-erc4626-linear-pool-v3`, modifying the pool factory to use Create2 when deploying a new pool. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`ERC4626LinearPoolFactory` artifact](./artifact/ERC4626LinearPoolFactory.json) +- [`ERC4626LinearPool` artifact](./artifact/ERC4626LinearPool.json) +- [`ERC4626LinearPoolRebalancer` artifact](./artifact/ERC4626LinearPoolRebalancer.json) diff --git a/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/test/task.fork.ts b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/test/task.fork.ts new file mode 100644 index 0000000..efd9c03 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-erc4626-linear-pool-v4/test/task.fork.ts @@ -0,0 +1,464 @@ +import { randomBytes } from 'ethers/lib/utils'; +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { setCode } from '@nomicfoundation/hardhat-network-helpers'; +import * as expectEvent from '@helpers/expectEvent'; +import { bn, fp, FP_ONE } from '@helpers/numbers'; +import { MAX_UINT256 } from '@helpers/constants'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; + +import { impersonate, getForkedNetwork, Task, TaskMode, getSigners } from '@src'; +import { describeForkTest } from '@src'; +import { deploy, instanceAt, getArtifact } from '@src'; +import { actionId } from '@helpers/models/misc/actions'; + +export enum SwapKind { + GivenIn = 0, + GivenOut, +} + +describeForkTest('ERC4626LinearPoolFactory', 'mainnet', 16550500, function () { + let owner: SignerWithAddress, holder: SignerWithAddress, other: SignerWithAddress; + let govMultisig: SignerWithAddress; + let vault: Contract, authorizer: Contract, mainToken: Contract; + let factory: Contract; + let rebalancer: Contract; + + let task: Task; + + const frxEth = '0x5E8422345238F34275888049021821E8E08CAa1f'; + + const WETH = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'; + const erc4626Token = '0xac3e018457b222d93114458476f3e3416abbe38f'; + + const WETH_SCALING = bn(1); // WETH has 18 decimals, so its scaling factor is 1 + const FRXETH_SCALING = bn(1); // frxEth has 18 decimals, so its scaling factor is 1 + + const WETH_HOLDER = '0xF04a5cC80B1E94C69B48f5ee68a08CD2F09A7c3E'; + const FRXETH_HOLDER = '0xa1f8a6807c402e4a15ef4eba36528a3fed24e577'; + + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + + const SWAP_FEE_PERCENTAGE = fp(0.01); // 1% + + // The targets are set using 18 decimals, even if the token has fewer (as is the case for USDC); + const INITIAL_UPPER_TARGET = fp(1e2); + + // The initial midpoint (upper target / 2) must be between the final lower and upper targets + const FINAL_LOWER_TARGET = fp(0.2e2); + const FINAL_UPPER_TARGET = fp(5e2); + + const POOL_VERSION = 4; + const TASK_NAME = '20230409-erc4626-linear-pool-v4'; + const PROTOCOL_ID = 0; + const SALT = randomBytes(32); + + enum AttackType { + SET_TARGETS, + SET_SWAP_FEE, + } + + let pool: Contract; + let poolId: string; + + before('run task', async () => { + task = new Task(TASK_NAME, TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('ERC4626LinearPoolFactory'); + }); + + before('load signers', async () => { + [, owner, other] = await getSigners(); + + holder = await impersonate(FRXETH_HOLDER, fp(100)); + govMultisig = await impersonate(GOV_MULTISIG); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + authorizer = await new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance( + 'Authorizer' + ); + + mainToken = await task.instanceAt('IERC20', frxEth); + await mainToken.connect(holder).approve(vault.address, MAX_UINT256); + }); + + enum LinearPoolState { + BALANCED, + MAIN_EXCESS, + MAIN_LACK, + } + + function itRebalancesThePool(expectedState: LinearPoolState) { + it('rebalance the pool', async () => { + const { lowerTarget, upperTarget } = await pool.getTargets(); + + const { cash } = await vault.getPoolTokenInfo(poolId, frxEth); + const scaledCash = cash.mul(FRXETH_SCALING); + + let fees; + if (scaledCash.gt(upperTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_EXCESS); + + const excess = scaledCash.sub(upperTarget); + fees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else if (scaledCash.lt(lowerTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_LACK); + + const lack = lowerTarget.sub(scaledCash); + fees = lack.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else { + expect(expectedState).to.equal(LinearPoolState.BALANCED); + + fees = 0; + } + + const initialRecipientMainBalance = await mainToken.balanceOf(other.address); + if (expectedState != LinearPoolState.BALANCED) { + await rebalancer.connect(holder).rebalance(other.address); + } else { + await rebalancer.connect(holder).rebalanceWithExtraMain(other.address, 5); + } + const finalRecipientMainBalance = await mainToken.balanceOf(other.address); + + if (fees > 0) { + // The recipient of the rebalance call should get the fees that were collected (though there's some rounding + // error in the main-wrapped conversion). + expect(finalRecipientMainBalance.sub(initialRecipientMainBalance)).to.be.almostEqual( + fees.div(FRXETH_SCALING), + 0.00000001 + ); + } else { + // The recipient of the rebalance call will get any extra main tokens that were not utilized. + expect(finalRecipientMainBalance).to.be.almostEqual(initialRecipientMainBalance, 0.00000001); + } + + const mainInfo = await vault.getPoolTokenInfo(poolId, frxEth); + + const expectedMainBalance = lowerTarget.add(upperTarget).div(2); + expect(mainInfo.cash.mul(FRXETH_SCALING)).to.equal(expectedMainBalance); + expect(mainInfo.managed).to.equal(0); + }); + } + + describe('create and check getters', () => { + it('deploy a linear pool', async () => { + const tx = await factory.create( + '', + '', + frxEth, + erc4626Token, + INITIAL_UPPER_TARGET, + SWAP_FEE_PERCENTAGE, + owner.address, + PROTOCOL_ID, + SALT + ); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await task.instanceAt('ERC4626LinearPool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + const { assetManager } = await vault.getPoolTokenInfo(poolId, frxEth); // We could query for either frxEth or erc4626Token + rebalancer = await task.instanceAt('ERC4626LinearPoolRebalancer', assetManager); + }); + + it('check factory version', async () => { + const expectedFactoryVersion = { + name: 'ERC4626LinearPoolFactory', + version: POOL_VERSION, + deployment: TASK_NAME, + }; + + expect(await factory.version()).to.equal(JSON.stringify(expectedFactoryVersion)); + }); + + it('check pool version', async () => { + const expectedPoolVersion = { + name: 'ERC4626LinearPool', + version: POOL_VERSION, + deployment: TASK_NAME, + }; + + expect(await pool.version()).to.equal(JSON.stringify(expectedPoolVersion)); + }); + }); + + describe('join, and rebalance', () => { + it('join the pool', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const joinAmount = INITIAL_UPPER_TARGET.mul(2).div(FRXETH_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: frxEth, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert join amount - some fees will be collected as we're going over the upper target. + const excess = joinAmount.mul(FRXETH_SCALING).sub(INITIAL_UPPER_TARGET); + const joinCollectedFees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + + const expectedBPT = joinAmount.mul(FRXETH_SCALING).sub(joinCollectedFees); + expect(await pool.balanceOf(holder.address)).to.equal(expectedBPT); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + + it('set final targets', async () => { + await expect(pool.connect(owner).setTargets(FINAL_LOWER_TARGET, FINAL_UPPER_TARGET)).to.not.be.reverted; + }); + }); + + describe('generate excess of main token and rebalance', () => { + before('approve the rebalancer', async () => { + await mainToken.connect(holder).approve(rebalancer.address, MAX_UINT256); // To send extra main on rebalance + }); + + it('deposit main tokens', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const { upperTarget } = await pool.getTargets(); + const joinAmount = upperTarget.mul(5).div(FRXETH_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: frxEth, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + }); + + describe('generate lack of main token and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to withdraw enough man token to bring the Pool below its lower target, which will let us later + // rebalance. + + const { cash } = await vault.getPoolTokenInfo(poolId, frxEth); + const scaledCash = cash.mul(FRXETH_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(FRXETH_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: frxEth, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_LACK); + }); + + describe('join below upper target and rebalance', () => { + it('deposit main tokens', async () => { + // We're going to join with few tokens, causing the Pool to not reach its upper target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const joinAmount = midpoint.div(100).div(FRXETH_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: frxEth, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('exit above lower target and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to exit with few tokens, causing for the Pool to not reach its lower target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const exitAmount = midpoint.div(100).div(FRXETH_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: frxEth, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalance repeatedly', () => { + itRebalancesThePool(LinearPoolState.BALANCED); + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('read-only reentrancy protection', () => { + let wethPool: Contract; + let wethHolder: SignerWithAddress; + let poolId: string; + let attacker: Contract; + + before('use WETH', async () => { + wethHolder = await impersonate(WETH_HOLDER, fp(100)); + const weth = await instanceAt('IERC20', WETH); + await weth.connect(wethHolder).approve(vault.address, MAX_UINT256); + }); + + before('deploy attacker', async () => { + attacker = await deploy('ReadOnlyReentrancyAttackerLP', [vault.address]); + }); + + before('deploy pool and prepare', async () => { + const tx = await factory.create( + '', + '', + WETH, + erc4626Token, + INITIAL_UPPER_TARGET, + SWAP_FEE_PERCENTAGE, + owner.address, + PROTOCOL_ID, + SALT + ); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + wethPool = await task.instanceAt('ERC4626LinearPool', event.args.pool); + + poolId = await wethPool.getPoolId(); + + const joinAmount = INITIAL_UPPER_TARGET.div(2).div(WETH_SCALING); + + await vault.connect(wethHolder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: WETH, + assetOut: wethPool.address, + amount: joinAmount, + userData: '0x', + }, + { + sender: wethHolder.address, + recipient: wethHolder.address, + fromInternalBalance: false, + toInternalBalance: false, + }, + 0, + MAX_UINT256 + ); + + await authorizer.connect(govMultisig).grantRole(await actionId(wethPool, 'enableRecoveryMode'), other.address); + + // The functions to attack are permissioned, so the attacker needs permissions before starting. + await authorizer.connect(govMultisig).grantRole(await actionId(wethPool, 'setTargets'), attacker.address); + await authorizer + .connect(govMultisig) + .grantRole(await actionId(wethPool, 'setSwapFeePercentage'), attacker.address); + + await wethPool.connect(other).enableRecoveryMode(); + + const bptBalance = await wethPool.balanceOf(wethHolder.address); + await wethPool.connect(wethHolder).transfer(attacker.address, bptBalance); + }); + + async function performAttack(attackType: AttackType) { + // Any BPT amount works as long as the attacker has the funds. + const attack = attacker.startAttack(wethPool.address, attackType, await wethPool.balanceOf(attacker.address)); + await expect(attack).to.be.revertedWith('BAL#420'); + } + + context('set targets', () => { + it(`performs the set targets attack`, async () => { + await performAttack(AttackType.SET_TARGETS); + }); + }); + + context('set swap fee', () => { + it(`performs the set swap fee attack`, async () => { + await performAttack(AttackType.SET_SWAP_FEE); + }); + }); + }); + + describe('rebalancer query protection', async () => { + it('reverts with a malicious lending pool', async () => { + const { cash } = await vault.getPoolTokenInfo(poolId, frxEth); + const scaledCash = cash.mul(FRXETH_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(FRXETH_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: frxEth, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + + await setCode(erc4626Token, getArtifact('MockERC4626Token').deployedBytecode); + const mockLendingPool = await instanceAt('MockERC4626Token', erc4626Token); + + await mockLendingPool.setRevertType(2); // Type 2 is malicious swap query revert + await expect(rebalancer.rebalance(other.address)).to.be.revertedWith('BAL#357'); // MALICIOUS_QUERY_REVERT + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/artifact/GearboxLinearPool.json b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/artifact/GearboxLinearPool.json new file mode 100644 index 0000000..dd5caa1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/artifact/GearboxLinearPool.json @@ -0,0 +1,1245 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GearboxLinearPool", + "sourceName": "contracts/gearbox-linear-pool/GearboxLinearPool.sol", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "assetManager", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + } + ], + "internalType": "struct GearboxLinearPool.ConstructorArgs", + "name": "args", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "paused", + "type": "bool" + } + ], + "name": "PausedStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "RecoveryModeStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + } + ], + "name": "SwapFeePercentageChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lowerTarget", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + } + ], + "name": "TargetsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "enableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBptIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMainIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMainToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getNextNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPausedState", + "outputs": [ + { + "internalType": "bool", + "name": "paused", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "pauseWindowEndTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodEndTime", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeesCollector", + "outputs": [ + { + "internalType": "contract IProtocolFeesCollector", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getScalingFactors", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSwapFeePercentage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTargets", + "outputs": [ + { + "internalType": "uint256", + "name": "lowerTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVirtualSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedTokenRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "inRecoveryMode", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onExitPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "dueProtocolFees", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onJoinPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "dueProtocolFees", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IERC20", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IPoolSwapStructs.SwapRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "indexIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "indexOut", + "type": "uint256" + } + ], + "name": "onSwap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IERC20", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IPoolSwapStructs.SwapRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "balanceTokenIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balanceTokenOut", + "type": "uint256" + } + ], + "name": "onSwap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryExit", + "outputs": [ + { + "internalType": "uint256", + "name": "bptIn", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryJoin", + "outputs": [ + { + "internalType": "uint256", + "name": "bptOut", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + } + ], + "name": "setSwapFeePercentage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newLowerTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newUpperTarget", + "type": "uint256" + } + ], + "name": "setTargets", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6102c06040523480156200001257600080fd5b506040516200599138038062005991833981016040819052620000359162000e00565b6101608101518151602083015160408401516060850151608086015160c0870151620000618862000476565b60e08901516101008a01516101208b01516101408c01518a6200009e8160006200008c8c8c620004ff565b89620005b060201b620014241760201c565b8b8b86868686838387878b86336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000ed92919062000c89565b5080516200010390600490602084019062000c89565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001829050630163f5008311156101946200077e565b620001966276a7008211156101956200077e565b4291909101610140819052016101605260601b6001600160601b031916610180526101a08690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000dc1565b6001600160a01b03166101c0816001600160a01b031660601b8152505050505050505050876001600160a01b03166101e0816001600160a01b031660601b81525050866001600160a01b0316610200816001600160a01b031660601b81525050866001600160a01b0316886001600160a01b031610620002bb576002620002be565b60015b60ff16610220526001600160a01b0380881690891610620002e1576001620002e4565b60025b60ff1661024052620002f68862000793565b61026052620003058762000793565b610280526000620003188982896200083f565b620003238562000939565b5050505050505050505050506200034081620009c860201b60201c565b50600081608001516001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038157600080fd5b505afa15801562000396573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003bc919062000dc1565b90506200045e816001600160a01b0316632495a5996040518163ffffffff1660e01b815260040160206040518083038186803b158015620003fc57600080fd5b505afa15801562000411573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000437919062000dc1565b6001600160a01b031683606001516001600160a01b0316146102086200077e60201b60201c565b60601b6001600160601b0319166102a052506200107d565b6040805160028082526060808301845292839291906020830190803683370190505090508260a0015181600081518110620004ad57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260a0015181600181518110620004e057fe5b6001600160a01b03909216602092830291909101909101529050919050565b60408051600280825260608281019093526001600160a01b03848116908616109183918160200160208202803683370190505090508162000541578362000543565b845b816000815181106200055157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050816200057e578462000580565b835b816001815181106200058e57fe5b6001600160a01b03909216602092830291909101909101529150505b92915050565b6000620005c883620009dd60201b620015d91760201c565b606083516001016001600160401b0381118015620005e557600080fd5b5060405190808252806020026020018201604052801562000610578160200160208202803683370190505b50905030816000815181106200062257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b845181101562000695578481815181106200065c57fe5b60200260200101518282600101815181106200067457fe5b6001600160a01b039092166020928302919091019091015260010162000645565b50606083516001016001600160401b0381118015620006b357600080fd5b50604051908082528060200260200182016040528015620006de578160200160208202803683370190505b509050600081600081518110620006f157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b845181101562000764578481815181106200072b57fe5b60200260200101518282600101815181106200074357fe5b6001600160a01b039092166020928302919091019091015260010162000714565b506200077387878484620009e9565b979650505050505050565b816200078f576200078f8162000ae3565b5050565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620007d057600080fd5b505afa158015620007e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200080b919062000f57565b60ff16905060006200082a60128362000af860201b620015e71760201c565b600a0a670de0b6b3a764000002949350505050565b620008508183111561014c6200077e565b6200086d6b0de0b6b39983494c589c000082111561014d6200077e565b62000887670de0b6b3a7640000825b06156101616200077e565b6200089b670de0b6b3a7640000836200087c565b620008ea670de0b6b3a7640000820460406020620008d4670de0b6b3a764000087600854919004602080620015fd62000b10821b17811c565b62000b1060201b620015fd17909392919060201c565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906200092c908590859062001026565b60405180910390a2505050565b6200094e64e8d4a5100082101560cb6200077e565b6200096667016345785d8a000082111560ca6200077e565b620009888160c0603f60085462000b1060201b620015fd17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90620009bd9083906200101d565b60405180910390a150565b80516200078f90600990602084019062000c89565b806200078f8162000b35565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040162000a1a919062001008565b602060405180830381600087803b15801562000a3557600080fd5b505af115801562000a4a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a70919062000de7565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000aa59084908890889060040162000f7a565b600060405180830381600087803b15801562000ac057600080fd5b505af115801562000ad5573d6000803e3d6000fd5b509298975050505050505050565b62000af5816210905360ea1b62000bc1565b50565b600062000b0a8383111560016200077e565b50900390565b600062000b1f84848462000c22565b506001901b60001901811b1992909216911b1790565b60028151101562000b465762000af5565b60008160008151811062000b5657fe5b602002602001015190506000600190505b825181101562000bbc57600083828151811062000b8057fe5b6020026020010151905062000bb1816001600160a01b0316846001600160a01b03161060656200077e60201b60201c565b915060010162000b67565b505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b62000c33610100831060646200077e565b62000c6c6001821015801562000c64575062000c6060ff846101000362000c7d60201b620016201760201c565b8211155b60646200077e565b62000bbc83821c156101b46200077e565b80820390821102900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000ccc57805160ff191683800117855562000cfc565b8280016001018555821562000cfc579182015b8281111562000cfc57825182559160200191906001019062000cdf565b5062000d0a92915062000d0e565b5090565b5b8082111562000d0a576000815560010162000d0f565b8051620005aa8162001067565b600082601f83011262000d43578081fd5b81516001600160401b0381111562000d59578182fd5b602062000d6f601f8301601f1916820162001034565b9250818352848183860101111562000d8657600080fd5b60005b8281101562000da657848101820151848201830152810162000d89565b8281111562000db85760008284860101525b50505092915050565b60006020828403121562000dd3578081fd5b815162000de08162001067565b9392505050565b60006020828403121562000df9578081fd5b5051919050565b60006020828403121562000e12578081fd5b81516001600160401b038082111562000e29578283fd5b818401915061018080838703121562000e40578384fd5b62000e4b8162001034565b905062000e59868462000d25565b815260208301518281111562000e6d578485fd5b62000e7b8782860162000d32565b60208301525060408301518281111562000e93578485fd5b62000ea18782860162000d32565b60408301525062000eb6866060850162000d25565b606082015262000eca866080850162000d25565b608082015262000ede8660a0850162000d25565b60a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014062000f208782860162000d25565b90820152610160838101518381111562000f38578586fd5b62000f468882870162000d32565b918301919091525095945050505050565b60006020828403121562000f69578081fd5b815160ff8116811462000de0578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000fc65762000fb385516200105b565b8352938301939183019160010162000f9e565b505084810360408601528551808252908201925081860190845b8181101562000ad55762000ff583516200105b565b8552938301939183019160010162000fe0565b60208101600383106200101757fe5b91905290565b90815260200190565b918252602082015260400190565b6040518181016001600160401b03811182821017156200105357600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b038116811462000af557600080fd5b60805160a05160c05160e0516101005160601c6101205160601c61014051610160516101805160601c6101a0516101c05160601c6101e05160601c6102005160601c610220516102405161026051610280516102a05160601c61477a62001217600039806118435250806107f45250806107905280612a81525080610718528061081c5280610c515280612efc528061308552806131bd52806132c85280613445528061357d5250806107b252806109bc5280610c175280612ec8528061300a528061305152806131475280613189528061329452806133cf5280613411528061350752806135495250806113f852806126eb52806127b75280612aa75280612e7d5280612f96528061324a528061335b5250806109e052806110ee5280611ab15280611b5052806126a2528061276e5280612a465280612e3e5280612f4052806130d3528061320b528061330c52806134935250806111cc5250806109495250508061181d5250806117f9525080610fd1525080610fad525080610f5d5250806123df525080612421525080612400525061477a6000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e3660046140ae565b610608565b6040516103509190614441565b60405180910390f35b610361610668565b6040516103509190614685565b61038161037c366004613e80565b6106ff565b604051610350919061441e565b610343610716565b61034361073a565b6103a6610740565b60405161035093929190614429565b6103bd610769565b60405161035091906143e6565b6103816103d8366004613dd0565b610877565b6103e56108ed565b60405161035091906146bf565b6103436108f6565b61040d61040836600461416b565b610905565b005b610343610947565b610381610425366004613e80565b61096b565b61040d6109a6565b6103436109ba565b6104426109de565b604051610350919061433b565b61040d610a02565b610361610a56565b610343610ab7565b61047a610475366004613faf565b610aca565b604051610350929190614698565b610490610ae8565b6040516103509291906146b1565b610343610b26565b6103436104b4366004613d7c565b610cbb565b6104cc6104c7366004613faf565b610cda565b6040516103509291906143f9565b6103436104e8366004613d7c565b610d9c565b61040d610da7565b610343610f42565b61040d610f47565b610343610513366004614052565b610f59565b610442610fab565b610442610fcf565b610343610536366004613d7c565b610ff3565b61036161100e565b61034361055136600461411f565b61106f565b61040d610564366004614183565b6110a8565b610381610577366004613e80565b61111a565b61038161058a366004613e80565b611158565b610442611165565b61038161116f565b61040d611180565b6104426111ca565b61040d6105bd366004613e10565b6111ee565b6104cc6105d0366004613faf565b61126f565b6103436105e3366004613d98565b611306565b610343611343565b6103436113ec565b6104426113f6565b61034361141a565b6000846080015161063561061a610fcf565b6001600160a01b0316336001600160a01b03161460cd61162c565b61064a610640610947565b82146101f461162c565b61065261163a565b61065e8686868661164d565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b505050505090505b90565b600061070c338484611772565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074d6117da565b1592506107586117f7565b915061076261181b565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107db57fe5b6020026020010181815250506108196107f261183f565b7f00000000000000000000000000000000000000000000000000000000000000009061191b565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084557fe5b602002602001018181525050670de0b6b3a76400008160008151811061086757fe5b6020908102919091010152905090565b6000806108848533611306565b90506108a8336001600160a01b03871614806108a05750838210155b61019e61162c565b6108b3858585611953565b336001600160a01b038616148015906108ce57506000198114155b156108e0576108e08533858403611772565b60019150505b9392505050565b60055460ff1690565b60006109006113ec565b905090565b61090d611a33565b610915611a7c565b600080610920610ae8565b915091506109396109318383611a8c565b61014f61162c565b61094283611b93565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070c9185906109a19086611c0b565b611772565b6109ae611a33565b6109b86000611c1d565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a0a611a33565b610a12611cae565b610a1c6001611cc2565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4c919061441e565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906109009060c0603f611d04565b60006060610adc888785611d13611d2a565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0582602080611d04565b029250670de0b6b3a7640000610b1e8260406020611d04565b029150509091565b600080610b31610947565b90506060610b3d610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b689190614441565b60006040518083038186803b158015610b8057600080fd5b505afa158015610b94573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbc9190810190613eab565b50915050610bd181610bcc610769565b611e91565b600080610bdc610ae8565b91509150610be8613aed565b6040518060600160405280610bfb610ab7565b81526020018481526020018381525090506000610c87610c4e867f000000000000000000000000000000000000000000000000000000000000000081518110610c4057fe5b602002602001015184611efa565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7a57fe5b6020026020010151611f5b565b9050610cb0610ca986600081518110610c9c57fe5b6020026020010151611f67565b8290611f7b565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce961061a610fcf565b610cf4610640610947565b6000610cff85611fd2565b15610d2757610d0c612001565b610d1e88610d1861073a565b87612014565b94509050610d3f565b610d2f61163a565b610d3a8a8987611d13565b945090505b610d498a8261210a565b835167ffffffffffffffff81118015610d6157600080fd5b50604051908082528060200260200182016040528015610d8b578160200160208202803683370190505b509250505097509795505050505050565b600061071082610ff3565b6000610db1610947565b90506060610dbd610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de89190614441565b60006040518083038186803b158015610e0057600080fd5b505afa158015610e14573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3c9190810190613eab565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e8057fe5b602002602001018181525050610e94613b0e565b6040518060800160405280610ea8856106fc565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed9610fcf565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f0a9493929190614469565b600060405180830381600087803b158015610f2457600080fd5b505af1158015610f38573d6000803e3d6000fd5b5050505050505050565b600090565b610f4f611a33565b6109b86001611c1d565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8e9291906142c5565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108161061a610fcf565b61108c610640610947565b61109461163a565b61109f858585612114565b95945050505050565b6110b0611a33565b6110b8611a7c565b6000806110c3610ae8565b915091506110d46109318383611a8c565b6110e96110e18585611a8c565b61015761162c565b6111147f00000000000000000000000000000000000000000000000000000000000000008585612121565b50505050565b6000806111273385611306565b90508083106111415761113c33856000611772565b61114e565b61114e3385858403611772565b5060019392505050565b600061070c338484611953565b60006109006121f7565b6008546000906109009060ff612271565b611188611a33565b611190612001565b61119a6000611cc2565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4c919061441e565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121d8c610ff3565b8960405160200161123396959493929190614556565b604051602081830303815290604052805190602001209050611264888261125b878787612278565b886101f86122b7565b610f38888888611772565b6060808861127e61061a610fcf565b611289610640610947565b600061129361163a565b61129b61073a565b6112ed576112aa8a8a8761230e565b945090506112c36112b9610f42565b82101560cc61162c565b6112d560006112d0610f42565b6123a6565b6112e8896112e1610f42565b83036123a6565b610d49565b6112f88a8987611d13565b94509050610d4989826123a6565b6000611310610fcf565b6001600160a01b0316826001600160a01b031614156113325750600019610710565b61133c83836123b0565b9050610710565b6000806000611350610fcf565b6001600160a01b031663b05f8e48611366610947565b306040518363ffffffff1660e01b815260040161138492919061463c565b60806040518083038186803b15801561139c57600080fd5b505afa1580156113b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d491906141a4565b5050915091506113e5818301611f67565b9250505090565b60006109006123db565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061090061183f565b600061142f836115d9565b6060835160010167ffffffffffffffff8111801561144c57600080fd5b50604051908082528060200260200182016040528015611476578160200160208202803683370190505b509050308160008151811061148757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f6578481815181106114bf57fe5b60200260200101518282600101815181106114d657fe5b6001600160a01b03909216602092830291909101909101526001016114aa565b506060835160010167ffffffffffffffff8111801561151457600080fd5b5060405190808252806020026020018201604052801561153e578160200160208202803683370190505b50905060008160008151811061155057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115bf5784818151811061158857fe5b602002602001015182826001018151811061159f57fe5b6001600160a01b0390921660209283029190910190910152600101611573565b506115cc87878484612478565b925050505b949350505050565b806115e381612581565b5050565b60006115f783831115600161162c565b50900390565b600061160a8484846125fa565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e3576115e381612640565b6109b86116456117da565b61019261162c565b60006116696003841080156116625750600383105b606461162c565b6060611673610769565b905061167f8582611e91565b60008061168a610ae8565b91509150611696613aed565b60405180606001604052806116a9610ab7565b81526020810185905260400183905290506000895160018111156116c957fe5b141561172d576116f089606001518589815181106116e357fe5b602002602001015161266a565b60608a015260006117028a8a84612676565b90506117218186898151811061171457fe5b602002602001015161273d565b955050505050506115d1565b61174189606001518588815181106116e357fe5b60608a015260006117538a8a84612749565b905061172181868a8151811061176557fe5b60200260200101516127fe565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cd908590614441565b60405180910390a3505050565b60006117e461181b565b42118061090057505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663788c6bfe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561189a57600080fd5b505afa9250505080156118ca575060408051601f3d908101601f191682019092526118c791810190613f97565b60015b61190d573d8080156118f8576040519150601f19603f3d011682016040523d82523d6000602084013e6118fd565b606091505b506119078161280a565b506106fc565b633b9aca00900490506106fc565b600082820261193f84158061193857508385838161193557fe5b04145b600361162c565b670de0b6b3a7640000815b04949350505050565b61196a6001600160a01b038416151561019861162c565b6119816001600160a01b038316151561019961162c565b61198c838383610942565b6001600160a01b0383166000908152602081905260409020546119b290826101a0612891565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119e19082611c0b565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cd908590614441565b6000611a626000357fffffffff0000000000000000000000000000000000000000000000000000000016610f59565b9050611a79611a7182336128a7565b61019161162c565b50565b6109b8611a87610fcf565b612990565b6000806000611a99610fcf565b6001600160a01b031663b05f8e48611aaf610947565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611aed92919061463c565b60806040518083038186803b158015611b0557600080fd5b505afa158015611b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3d91906141a4565b5050915091506000611b79828401611b747f0000000000000000000000000000000000000000000000000000000000000000612a42565b61266a565b905085811015801561065e57509390931115949350505050565b611ba664e8d4a5100082101560cb61162c565b611bbc67016345785d8a000082111560ca61162c565b600854611bcd908260c0603f6115fd565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611c00908390614441565b60405180910390a150565b60008282016108e6848210158361162c565b8015611c3d57611c38611c2e6117f7565b421061019361162c565b611c52565b611c52611c4861181b565b42106101a961162c565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611c0090839061441e565b6109b8611cb961116f565b156101b561162c565b600854611cd1908260ff612b1c565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611c0090839061441e565b6001901b6000190191901c1690565b60006060611d226103e6612640565b935093915050565b333014611e19576000306001600160a01b0316600036604051611d4e9291906142f5565b6000604051808303816000865af19150503d8060008114611d8b576040519150601f19603f3d011682016040523d82523d6000602084013e611d90565b606091505b505090508060008114611d9f57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611dfb573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611e2c8686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611ea0908290612b2b565b60005b8181101561111457611edb848281518110611eba57fe5b6020026020010151848381518110611ece57fe5b602002602001015161191b565b848281518110611ee757fe5b6020908102919091010152600101611ea3565b60008160200151831015611f335781516020830151600091611f1f918690039061191b565b9050611f2b84826115e7565b915050610710565b81604001518311611f45575081610710565b81516040830151600091611f1f9186039061191b565b60006108e68383611c0b565b600061071082611f7561073a565b906115e7565b6000611f8a821515600461162c565b670de0b6b3a76400008302611fbc841580611fb55750670de0b6b3a7640000858381611fb257fe5b04145b600561162c565b6001836001830304018115150291505092915050565b6000808251118015610710575060ff801682806020019051810190611ff791906141e4565b60ff161492915050565b6109b861200c61116f565b6101b661162c565b60006060600061202384612b38565b90506060865167ffffffffffffffff8111801561203f57600080fd5b50604051908082528060200260200182016040528015612069578160200160208202803683370190505b5090506000612076610f42565b90506000612089898381518110610c9c57fe5b905060006120978583612b4e565b905060005b8a518110156120f957838114156120b45760006120da565b6120da828c83815181106120c457fe5b602002602001015161191b90919063ffffffff16565b8582815181106120e657fe5b602090810291909101015260010161209c565b509399929850919650505050505050565b6115e38282612b8e565b60006108e66103e6612640565b6121308183111561014c61162c565b61214b6b0de0b6b39983494c589c000082111561014d61162c565b612163670de0b6b3a7640000825b061561016161162c565b612175670de0b6b3a764000083612159565b6121aa670de0b6b3a76400008204604060206121a2670de0b6b3a7640000876008549190046020806115fd565b9291906115fd565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121ea90859085906146b1565b60405180910390a2505050565b6000612201610fcf565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561223957600080fd5b505afa15801561224d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109009190614092565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b60006122c285612c5a565b90506122d86122d2878387612c76565b8361162c565b6122e7428410156101b861162c565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606123296001600160a01b038616301461015661162c565b6123406001600160a01b038516301461015661162c565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff8160008151811061238f57fe5b602090810291909101015290969095509350505050565b6115e38282612d25565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612448612db8565b3060405160200161245d959493929190614610565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016124a79190614671565b602060405180830381600087803b1580156124c157600080fd5b505af11580156124d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f99190613f97565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d2906125459084908890889060040161458a565b600060405180830381600087803b15801561255f57600080fd5b505af1158015612573573d6000803e3d6000fd5b509298975050505050505050565b60028151101561259057611a79565b60008160008151811061259f57fe5b602002602001015190506000600190505b82518110156109425760008382815181106125c757fe5b602002602001015190506125f0816001600160a01b0316846001600160a01b031610606561162c565b91506001016125b0565b6126096101008310606461162c565b61263160018210158015611662575061262760ff8461010003611620565b821115606461162c565b61094283821c156101b461162c565b611a79817f42414c0000000000000000000000000000000000000000000000000000000000612dbc565b60006108e6838361191b565b60208301516000906001600160a01b03163014156126a057612699848484612e37565b90506108e6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b031614156126e957612699848484612f8f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612732576126998484846130cc565b6108e6610135612640565b60006108e68383612b4e565b60408301516000906001600160a01b031630141561276c57612699848484613204565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127b557612699848484613354565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127325761269984848461348c565b60006108e68383611f7b565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417612885578160208401fd5b506115e3610165612640565b60006128a0848411158361162c565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128c6610fab565b6001600160a01b0316141580156128e157506128e1836135c4565b15612909576128ee610fab565b6001600160a01b0316336001600160a01b0316149050610710565b6129116121f7565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016129409392919061444a565b60206040518083038186803b15801561295857600080fd5b505afa15801561296c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133c9190613f77565b604080516000808252602082019092526060916129c3565b6129b0613b38565b8152602001906001900390816129a85790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e8490612a0c90849060040161434f565b600060405180830381600087803b158015612a2657600080fd5b505af1158015612a3a573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612aa557507f0000000000000000000000000000000000000000000000000000000000000000610cd5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612af157612aea6107f261183f565b9050610cd5565b6001600160a01b038216301415612b115750670de0b6b3a7640000610cd5565b610cd5610135612640565b6001811b1992909216911b1790565b6115e3818314606761162c565b6000818060200190518101906108e69190614200565b6000612b5d821515600461162c565b670de0b6b3a76400008302612b85841580611fb55750670de0b6b3a7640000858381611fb257fe5b82818161194a57fe5b612ba56001600160a01b038316151561019b61162c565b612bb182600083610942565b6001600160a01b038216600090815260208190526040902054612bd790826101b2612891565b6001600160a01b038316600090815260208190526040902055612c0a612c0582612bff61073a565b90613628565b613636565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c4e9190614441565b60405180910390a35050565b6000612c646123db565b82604051602001610f8e929190614305565b6000612c8882516041146101b961162c565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612cc1908990859088908890614653565b6020604051602081039080840390855afa158015612ce3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612d195750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612d3160008383610942565b612d46612c0582612d4061073a565b90611c0b565b6001600160a01b038216600090815260208190526040902054612d699082611c0b565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c4e908590614441565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612ebd7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eb557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162c565b6115d18460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612ef157fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f2557fe5b6020026020010151612f3d87600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612f835761363b612f87565b6136995b63ffffffff16565b6000612feb7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eb5575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b03163014613046576130418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061303357fe5b602002602001015184613702565b6115d1565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061307a57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130ae57fe5b60200260200101516130c687600081518110610c9c57fe5b86613732565b60006131287f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eb5575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b0316301461317e576130418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061317057fe5b602002602001015184613798565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131b257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106131e657fe5b60200260200101516131fe87600081518110610c9c57fe5b866137d8565b60006132897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eb557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162c565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132bd57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106132f157fe5b602002602001015161330987600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461334f5761383f612f87565b613896565b60006133b07f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eb5575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b03163014613406576130418460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106133f857fe5b602002602001015184613900565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061343a57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061346e57fe5b602002602001015161348687600081518110610c9c57fe5b8661392a565b60006134e87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eb5575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b0316301461353e576130418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061353057fe5b602002602001015184613979565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061357257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106135a657fe5b60200260200101516135be87600081518110610c9c57fe5b866139ae565b60006135ef7f9f11080e00000000000000000000000000000000000000000000000000000000610f59565b82148061071057506136207f38e9922e00000000000000000000000000000000000000000000000000000000610f59565b909114919050565b60006108e683836001612891565b600255565b6000806136488684611efa565b905060006136568287611f5b565b90506000613664868a6115e7565b9050600061367f84611f756136798587613a02565b8a613a1c565b905061368b88826115e7565b9a9950505050505050505050565b6000806136a68684611efa565b905060006136b48287611f5b565b905060006136cb6136c5838b613a02565b87613a3d565b905060006136d984836115e7565b905060006136e78288613a5d565b90506136f38a826115e7565b9b9a5050505050505050505050565b60008061370f8484611efa565b905060006137266137208688611c0b565b85611efa565b905061065e81836115e7565b60008261374a576137438683611efa565b905061109f565b60006137568684611efa565b90506000613767613720888a611c0b565b9050600061377582846115e7565b905060006137838489611f5b565b905061368b6137928884613a02565b82613a3d565b6000806137a58484611efa565b905060006137b382876115e7565b905060006137c18286613a5d565b90506137cd86826115e7565b979650505050505050565b6000826137e657508461109f565b60006137f28684611efa565b905060006138008287611f5b565b9050600061380e878a611c0b565b9050600061381c8483611f5b565b9050600061383361382d8984613a02565b85613a3d565b90506136f381896115e7565b60008261384d57508461109f565b60006138598684611efa565b905060006138678287611f5b565b90506000613875868a611c0b565b9050600061388a84611f756136798587613a02565b905061368b81896115e7565b6000826138a7576137438683613a5d565b60006138b38684611efa565b905060006138c18287611f5b565b905060006138d86138d2838b613a02565b87613a1c565b905060006138e68483611c0b565b905060006138f48288613a5d565b90506136f3818b6115e7565b60008061390d8484611efa565b9050600061391e61372086886115e7565b905061065e82826115e7565b6000806139378684611efa565b90506000613948613720888a6115e7565b9050600061395683836115e7565b905060006139648489611f5b565b905061368b6139738884613a02565b82613a1c565b6000806139868484611efa565b905060006139948287611c0b565b905060006139a28286613a5d565b90506137cd81876115e7565b6000806139bb8684611efa565b905060006139c98287611f5b565b905060006139d7878a6115e7565b905060006139e58483611f5b565b905060006139f661382d8984613a02565b90506136f388826115e7565b60008282026108e684158061193857508385838161193557fe5b6000613a2b821515600461162c565b50811515600019909201046001010290565b6000613a4c821515600461162c565b818381613a5557fe5b049392505050565b60008160200151831015613aa657815161133c90613a8490670de0b6b3a764000090611c0b565b60208401518451613aa091613a99919061191b565b8690611c0b565b90612b4e565b81604001518311613ab8575081610710565b815161133c90613ad190670de0b6b3a7640000906115e7565b60408401518451613aa091613ae6919061191b565b86906115e7565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561071081614720565b600082601f830112613b83578081fd5b8135613b96613b91826146f4565b6146cd565b818152915060208083019084810181840286018201871015613bb757600080fd5b60005b84811015613bd657813584529282019290820190600101613bba565b505050505092915050565b600082601f830112613bf1578081fd5b8151613bff613b91826146f4565b818152915060208083019084810181840286018201871015613c2057600080fd5b60005b84811015613bd657815184529282019290820190600101613c23565b600082601f830112613c4f578081fd5b813567ffffffffffffffff811115613c65578182fd5b613c786020601f19601f840116016146cd565b9150808252836020828501011115613c8f57600080fd5b8060208401602084013760009082016020015292915050565b80356002811061071057600080fd5b6000610120808385031215613cca578182fd5b613cd3816146cd565b915050613ce08383613ca8565b8152613cef8360208401613b68565b6020820152613d018360408401613b68565b6040820152606082013560608201526080820135608082015260a082013560a0820152613d318360c08401613b68565b60c0820152613d438360e08401613b68565b60e08201526101008083013567ffffffffffffffff811115613d6457600080fd5b613d7085828601613c3f565b82840152505092915050565b600060208284031215613d8d578081fd5b81356108e681614720565b60008060408385031215613daa578081fd5b8235613db581614720565b91506020830135613dc581614720565b809150509250929050565b600080600060608486031215613de4578081fd5b8335613def81614720565b92506020840135613dff81614720565b929592945050506040919091013590565b600080600080600080600060e0888a031215613e2a578283fd5b8735613e3581614720565b96506020880135613e4581614720565b955060408801359450606088013593506080880135613e6381614735565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613e92578182fd5b8235613e9d81614720565b946020939093013593505050565b600080600060608486031215613ebf578081fd5b835167ffffffffffffffff80821115613ed6578283fd5b818601915086601f830112613ee9578283fd5b8151613ef7613b91826146f4565b80828252602080830192508086018b828387028901011115613f17578788fd5b8796505b84871015613f42578051613f2e81614720565b845260019690960195928101928101613f1b565b508901519097509350505080821115613f59578283fd5b50613f6686828701613be1565b925050604084015190509250925092565b600060208284031215613f88578081fd5b815180151581146108e6578182fd5b600060208284031215613fa8578081fd5b5051919050565b600080600080600080600060e0888a031215613fc9578081fd5b873596506020880135613fdb81614720565b95506040880135613feb81614720565b9450606088013567ffffffffffffffff80821115614007578283fd5b6140138b838c01613b73565b955060808a0135945060a08a0135935060c08a0135915080821115614036578283fd5b506140438a828b01613c3f565b91505092959891949750929550565b600060208284031215614063578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e6578182fd5b6000602082840312156140a3578081fd5b81516108e681614720565b600080600080608085870312156140c3578182fd5b843567ffffffffffffffff808211156140da578384fd5b6140e688838901613cb7565b955060208701359150808211156140fb578384fd5b5061410887828801613b73565b949794965050505060408301359260600135919050565b600080600060608486031215614133578081fd5b833567ffffffffffffffff811115614149578182fd5b61415586828701613cb7565b9660208601359650604090950135949350505050565b60006020828403121561417c578081fd5b5035919050565b60008060408385031215614195578182fd5b50508035926020909101359150565b600080600080608085870312156141b9578182fd5b84519350602085015192506040850151915060608501516141d981614720565b939692955090935050565b6000602082840312156141f5578081fd5b81516108e681614735565b60008060408385031215614212578182fd5b825161421d81614735565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156142695781518752958201959082019060010161424d565b509495945050505050565b15159052565b60008151808452815b8181101561429f57602081850181015186830182015201614283565b818111156142b05782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b828110156143d957815180516004811061438257fe5b8552808701516143948887018261422d565b5085810151868601526060808201516143af8288018261422d565b5050608090810151906143c48682018361422d565b505060a093909301929085019060010161436c565b5091979650505050505050565b6000602082526108e6602083018461423a565b60006040825261440c604083018561423a565b828103602084015261109f818561423a565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156144da576144c48451614714565b82529284019260019290920191908401906144b2565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a0870152614518818561423a565b935050506040850151818584030160c0860152614535838261427a565b92505050606084015161454b60e0850182614274565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b818110156145d2576145c08551614714565b835293830193918301916001016145ae565b505084810360408601528551808252908201925081860190845b81811015612573576145fe8351614714565b855293830193918301916001016145ec565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016003831061467f57fe5b91905290565b6000602082526108e6602083018461427a565b6000838252604060208301526115d1604083018461423a565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156146ec57600080fd5b604052919050565b600067ffffffffffffffff82111561470a578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114611a7957600080fd5b60ff81168114611a7957600080fdfea264697066735822122041fa1dca66c1712715fd40f0825298363f844b4684569cae2847e9e8479c9c4364736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e3660046140ae565b610608565b6040516103509190614441565b60405180910390f35b610361610668565b6040516103509190614685565b61038161037c366004613e80565b6106ff565b604051610350919061441e565b610343610716565b61034361073a565b6103a6610740565b60405161035093929190614429565b6103bd610769565b60405161035091906143e6565b6103816103d8366004613dd0565b610877565b6103e56108ed565b60405161035091906146bf565b6103436108f6565b61040d61040836600461416b565b610905565b005b610343610947565b610381610425366004613e80565b61096b565b61040d6109a6565b6103436109ba565b6104426109de565b604051610350919061433b565b61040d610a02565b610361610a56565b610343610ab7565b61047a610475366004613faf565b610aca565b604051610350929190614698565b610490610ae8565b6040516103509291906146b1565b610343610b26565b6103436104b4366004613d7c565b610cbb565b6104cc6104c7366004613faf565b610cda565b6040516103509291906143f9565b6103436104e8366004613d7c565b610d9c565b61040d610da7565b610343610f42565b61040d610f47565b610343610513366004614052565b610f59565b610442610fab565b610442610fcf565b610343610536366004613d7c565b610ff3565b61036161100e565b61034361055136600461411f565b61106f565b61040d610564366004614183565b6110a8565b610381610577366004613e80565b61111a565b61038161058a366004613e80565b611158565b610442611165565b61038161116f565b61040d611180565b6104426111ca565b61040d6105bd366004613e10565b6111ee565b6104cc6105d0366004613faf565b61126f565b6103436105e3366004613d98565b611306565b610343611343565b6103436113ec565b6104426113f6565b61034361141a565b6000846080015161063561061a610fcf565b6001600160a01b0316336001600160a01b03161460cd61162c565b61064a610640610947565b82146101f461162c565b61065261163a565b61065e8686868661164d565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b505050505090505b90565b600061070c338484611772565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074d6117da565b1592506107586117f7565b915061076261181b565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107db57fe5b6020026020010181815250506108196107f261183f565b7f00000000000000000000000000000000000000000000000000000000000000009061191b565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084557fe5b602002602001018181525050670de0b6b3a76400008160008151811061086757fe5b6020908102919091010152905090565b6000806108848533611306565b90506108a8336001600160a01b03871614806108a05750838210155b61019e61162c565b6108b3858585611953565b336001600160a01b038616148015906108ce57506000198114155b156108e0576108e08533858403611772565b60019150505b9392505050565b60055460ff1690565b60006109006113ec565b905090565b61090d611a33565b610915611a7c565b600080610920610ae8565b915091506109396109318383611a8c565b61014f61162c565b61094283611b93565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070c9185906109a19086611c0b565b611772565b6109ae611a33565b6109b86000611c1d565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a0a611a33565b610a12611cae565b610a1c6001611cc2565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4c919061441e565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906109009060c0603f611d04565b60006060610adc888785611d13611d2a565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0582602080611d04565b029250670de0b6b3a7640000610b1e8260406020611d04565b029150509091565b600080610b31610947565b90506060610b3d610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b689190614441565b60006040518083038186803b158015610b8057600080fd5b505afa158015610b94573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbc9190810190613eab565b50915050610bd181610bcc610769565b611e91565b600080610bdc610ae8565b91509150610be8613aed565b6040518060600160405280610bfb610ab7565b81526020018481526020018381525090506000610c87610c4e867f000000000000000000000000000000000000000000000000000000000000000081518110610c4057fe5b602002602001015184611efa565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7a57fe5b6020026020010151611f5b565b9050610cb0610ca986600081518110610c9c57fe5b6020026020010151611f67565b8290611f7b565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce961061a610fcf565b610cf4610640610947565b6000610cff85611fd2565b15610d2757610d0c612001565b610d1e88610d1861073a565b87612014565b94509050610d3f565b610d2f61163a565b610d3a8a8987611d13565b945090505b610d498a8261210a565b835167ffffffffffffffff81118015610d6157600080fd5b50604051908082528060200260200182016040528015610d8b578160200160208202803683370190505b509250505097509795505050505050565b600061071082610ff3565b6000610db1610947565b90506060610dbd610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de89190614441565b60006040518083038186803b158015610e0057600080fd5b505afa158015610e14573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3c9190810190613eab565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e8057fe5b602002602001018181525050610e94613b0e565b6040518060800160405280610ea8856106fc565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed9610fcf565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f0a9493929190614469565b600060405180830381600087803b158015610f2457600080fd5b505af1158015610f38573d6000803e3d6000fd5b5050505050505050565b600090565b610f4f611a33565b6109b86001611c1d565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8e9291906142c5565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108161061a610fcf565b61108c610640610947565b61109461163a565b61109f858585612114565b95945050505050565b6110b0611a33565b6110b8611a7c565b6000806110c3610ae8565b915091506110d46109318383611a8c565b6110e96110e18585611a8c565b61015761162c565b6111147f00000000000000000000000000000000000000000000000000000000000000008585612121565b50505050565b6000806111273385611306565b90508083106111415761113c33856000611772565b61114e565b61114e3385858403611772565b5060019392505050565b600061070c338484611953565b60006109006121f7565b6008546000906109009060ff612271565b611188611a33565b611190612001565b61119a6000611cc2565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4c919061441e565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121d8c610ff3565b8960405160200161123396959493929190614556565b604051602081830303815290604052805190602001209050611264888261125b878787612278565b886101f86122b7565b610f38888888611772565b6060808861127e61061a610fcf565b611289610640610947565b600061129361163a565b61129b61073a565b6112ed576112aa8a8a8761230e565b945090506112c36112b9610f42565b82101560cc61162c565b6112d560006112d0610f42565b6123a6565b6112e8896112e1610f42565b83036123a6565b610d49565b6112f88a8987611d13565b94509050610d4989826123a6565b6000611310610fcf565b6001600160a01b0316826001600160a01b031614156113325750600019610710565b61133c83836123b0565b9050610710565b6000806000611350610fcf565b6001600160a01b031663b05f8e48611366610947565b306040518363ffffffff1660e01b815260040161138492919061463c565b60806040518083038186803b15801561139c57600080fd5b505afa1580156113b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d491906141a4565b5050915091506113e5818301611f67565b9250505090565b60006109006123db565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061090061183f565b600061142f836115d9565b6060835160010167ffffffffffffffff8111801561144c57600080fd5b50604051908082528060200260200182016040528015611476578160200160208202803683370190505b509050308160008151811061148757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f6578481815181106114bf57fe5b60200260200101518282600101815181106114d657fe5b6001600160a01b03909216602092830291909101909101526001016114aa565b506060835160010167ffffffffffffffff8111801561151457600080fd5b5060405190808252806020026020018201604052801561153e578160200160208202803683370190505b50905060008160008151811061155057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115bf5784818151811061158857fe5b602002602001015182826001018151811061159f57fe5b6001600160a01b0390921660209283029190910190910152600101611573565b506115cc87878484612478565b925050505b949350505050565b806115e381612581565b5050565b60006115f783831115600161162c565b50900390565b600061160a8484846125fa565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e3576115e381612640565b6109b86116456117da565b61019261162c565b60006116696003841080156116625750600383105b606461162c565b6060611673610769565b905061167f8582611e91565b60008061168a610ae8565b91509150611696613aed565b60405180606001604052806116a9610ab7565b81526020810185905260400183905290506000895160018111156116c957fe5b141561172d576116f089606001518589815181106116e357fe5b602002602001015161266a565b60608a015260006117028a8a84612676565b90506117218186898151811061171457fe5b602002602001015161273d565b955050505050506115d1565b61174189606001518588815181106116e357fe5b60608a015260006117538a8a84612749565b905061172181868a8151811061176557fe5b60200260200101516127fe565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cd908590614441565b60405180910390a3505050565b60006117e461181b565b42118061090057505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663788c6bfe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561189a57600080fd5b505afa9250505080156118ca575060408051601f3d908101601f191682019092526118c791810190613f97565b60015b61190d573d8080156118f8576040519150601f19603f3d011682016040523d82523d6000602084013e6118fd565b606091505b506119078161280a565b506106fc565b633b9aca00900490506106fc565b600082820261193f84158061193857508385838161193557fe5b04145b600361162c565b670de0b6b3a7640000815b04949350505050565b61196a6001600160a01b038416151561019861162c565b6119816001600160a01b038316151561019961162c565b61198c838383610942565b6001600160a01b0383166000908152602081905260409020546119b290826101a0612891565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119e19082611c0b565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cd908590614441565b6000611a626000357fffffffff0000000000000000000000000000000000000000000000000000000016610f59565b9050611a79611a7182336128a7565b61019161162c565b50565b6109b8611a87610fcf565b612990565b6000806000611a99610fcf565b6001600160a01b031663b05f8e48611aaf610947565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611aed92919061463c565b60806040518083038186803b158015611b0557600080fd5b505afa158015611b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3d91906141a4565b5050915091506000611b79828401611b747f0000000000000000000000000000000000000000000000000000000000000000612a42565b61266a565b905085811015801561065e57509390931115949350505050565b611ba664e8d4a5100082101560cb61162c565b611bbc67016345785d8a000082111560ca61162c565b600854611bcd908260c0603f6115fd565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611c00908390614441565b60405180910390a150565b60008282016108e6848210158361162c565b8015611c3d57611c38611c2e6117f7565b421061019361162c565b611c52565b611c52611c4861181b565b42106101a961162c565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611c0090839061441e565b6109b8611cb961116f565b156101b561162c565b600854611cd1908260ff612b1c565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611c0090839061441e565b6001901b6000190191901c1690565b60006060611d226103e6612640565b935093915050565b333014611e19576000306001600160a01b0316600036604051611d4e9291906142f5565b6000604051808303816000865af19150503d8060008114611d8b576040519150601f19603f3d011682016040523d82523d6000602084013e611d90565b606091505b505090508060008114611d9f57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611dfb573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611e2c8686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611ea0908290612b2b565b60005b8181101561111457611edb848281518110611eba57fe5b6020026020010151848381518110611ece57fe5b602002602001015161191b565b848281518110611ee757fe5b6020908102919091010152600101611ea3565b60008160200151831015611f335781516020830151600091611f1f918690039061191b565b9050611f2b84826115e7565b915050610710565b81604001518311611f45575081610710565b81516040830151600091611f1f9186039061191b565b60006108e68383611c0b565b600061071082611f7561073a565b906115e7565b6000611f8a821515600461162c565b670de0b6b3a76400008302611fbc841580611fb55750670de0b6b3a7640000858381611fb257fe5b04145b600561162c565b6001836001830304018115150291505092915050565b6000808251118015610710575060ff801682806020019051810190611ff791906141e4565b60ff161492915050565b6109b861200c61116f565b6101b661162c565b60006060600061202384612b38565b90506060865167ffffffffffffffff8111801561203f57600080fd5b50604051908082528060200260200182016040528015612069578160200160208202803683370190505b5090506000612076610f42565b90506000612089898381518110610c9c57fe5b905060006120978583612b4e565b905060005b8a518110156120f957838114156120b45760006120da565b6120da828c83815181106120c457fe5b602002602001015161191b90919063ffffffff16565b8582815181106120e657fe5b602090810291909101015260010161209c565b509399929850919650505050505050565b6115e38282612b8e565b60006108e66103e6612640565b6121308183111561014c61162c565b61214b6b0de0b6b39983494c589c000082111561014d61162c565b612163670de0b6b3a7640000825b061561016161162c565b612175670de0b6b3a764000083612159565b6121aa670de0b6b3a76400008204604060206121a2670de0b6b3a7640000876008549190046020806115fd565b9291906115fd565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121ea90859085906146b1565b60405180910390a2505050565b6000612201610fcf565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561223957600080fd5b505afa15801561224d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109009190614092565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b60006122c285612c5a565b90506122d86122d2878387612c76565b8361162c565b6122e7428410156101b861162c565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606123296001600160a01b038616301461015661162c565b6123406001600160a01b038516301461015661162c565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff8160008151811061238f57fe5b602090810291909101015290969095509350505050565b6115e38282612d25565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612448612db8565b3060405160200161245d959493929190614610565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016124a79190614671565b602060405180830381600087803b1580156124c157600080fd5b505af11580156124d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f99190613f97565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d2906125459084908890889060040161458a565b600060405180830381600087803b15801561255f57600080fd5b505af1158015612573573d6000803e3d6000fd5b509298975050505050505050565b60028151101561259057611a79565b60008160008151811061259f57fe5b602002602001015190506000600190505b82518110156109425760008382815181106125c757fe5b602002602001015190506125f0816001600160a01b0316846001600160a01b031610606561162c565b91506001016125b0565b6126096101008310606461162c565b61263160018210158015611662575061262760ff8461010003611620565b821115606461162c565b61094283821c156101b461162c565b611a79817f42414c0000000000000000000000000000000000000000000000000000000000612dbc565b60006108e6838361191b565b60208301516000906001600160a01b03163014156126a057612699848484612e37565b90506108e6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b031614156126e957612699848484612f8f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612732576126998484846130cc565b6108e6610135612640565b60006108e68383612b4e565b60408301516000906001600160a01b031630141561276c57612699848484613204565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127b557612699848484613354565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127325761269984848461348c565b60006108e68383611f7b565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417612885578160208401fd5b506115e3610165612640565b60006128a0848411158361162c565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128c6610fab565b6001600160a01b0316141580156128e157506128e1836135c4565b15612909576128ee610fab565b6001600160a01b0316336001600160a01b0316149050610710565b6129116121f7565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016129409392919061444a565b60206040518083038186803b15801561295857600080fd5b505afa15801561296c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133c9190613f77565b604080516000808252602082019092526060916129c3565b6129b0613b38565b8152602001906001900390816129a85790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e8490612a0c90849060040161434f565b600060405180830381600087803b158015612a2657600080fd5b505af1158015612a3a573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612aa557507f0000000000000000000000000000000000000000000000000000000000000000610cd5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612af157612aea6107f261183f565b9050610cd5565b6001600160a01b038216301415612b115750670de0b6b3a7640000610cd5565b610cd5610135612640565b6001811b1992909216911b1790565b6115e3818314606761162c565b6000818060200190518101906108e69190614200565b6000612b5d821515600461162c565b670de0b6b3a76400008302612b85841580611fb55750670de0b6b3a7640000858381611fb257fe5b82818161194a57fe5b612ba56001600160a01b038316151561019b61162c565b612bb182600083610942565b6001600160a01b038216600090815260208190526040902054612bd790826101b2612891565b6001600160a01b038316600090815260208190526040902055612c0a612c0582612bff61073a565b90613628565b613636565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c4e9190614441565b60405180910390a35050565b6000612c646123db565b82604051602001610f8e929190614305565b6000612c8882516041146101b961162c565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612cc1908990859088908890614653565b6020604051602081039080840390855afa158015612ce3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612d195750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612d3160008383610942565b612d46612c0582612d4061073a565b90611c0b565b6001600160a01b038216600090815260208190526040902054612d699082611c0b565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c4e908590614441565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612ebd7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eb557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162c565b6115d18460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612ef157fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f2557fe5b6020026020010151612f3d87600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612f835761363b612f87565b6136995b63ffffffff16565b6000612feb7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eb5575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b03163014613046576130418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061303357fe5b602002602001015184613702565b6115d1565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061307a57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130ae57fe5b60200260200101516130c687600081518110610c9c57fe5b86613732565b60006131287f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eb5575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b0316301461317e576130418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061317057fe5b602002602001015184613798565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131b257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106131e657fe5b60200260200101516131fe87600081518110610c9c57fe5b866137d8565b60006132897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eb557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162c565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132bd57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106132f157fe5b602002602001015161330987600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461334f5761383f612f87565b613896565b60006133b07f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eb5575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b03163014613406576130418460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106133f857fe5b602002602001015184613900565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061343a57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061346e57fe5b602002602001015161348687600081518110610c9c57fe5b8661392a565b60006134e87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eb5575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b0316301461353e576130418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061353057fe5b602002602001015184613979565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061357257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106135a657fe5b60200260200101516135be87600081518110610c9c57fe5b866139ae565b60006135ef7f9f11080e00000000000000000000000000000000000000000000000000000000610f59565b82148061071057506136207f38e9922e00000000000000000000000000000000000000000000000000000000610f59565b909114919050565b60006108e683836001612891565b600255565b6000806136488684611efa565b905060006136568287611f5b565b90506000613664868a6115e7565b9050600061367f84611f756136798587613a02565b8a613a1c565b905061368b88826115e7565b9a9950505050505050505050565b6000806136a68684611efa565b905060006136b48287611f5b565b905060006136cb6136c5838b613a02565b87613a3d565b905060006136d984836115e7565b905060006136e78288613a5d565b90506136f38a826115e7565b9b9a5050505050505050505050565b60008061370f8484611efa565b905060006137266137208688611c0b565b85611efa565b905061065e81836115e7565b60008261374a576137438683611efa565b905061109f565b60006137568684611efa565b90506000613767613720888a611c0b565b9050600061377582846115e7565b905060006137838489611f5b565b905061368b6137928884613a02565b82613a3d565b6000806137a58484611efa565b905060006137b382876115e7565b905060006137c18286613a5d565b90506137cd86826115e7565b979650505050505050565b6000826137e657508461109f565b60006137f28684611efa565b905060006138008287611f5b565b9050600061380e878a611c0b565b9050600061381c8483611f5b565b9050600061383361382d8984613a02565b85613a3d565b90506136f381896115e7565b60008261384d57508461109f565b60006138598684611efa565b905060006138678287611f5b565b90506000613875868a611c0b565b9050600061388a84611f756136798587613a02565b905061368b81896115e7565b6000826138a7576137438683613a5d565b60006138b38684611efa565b905060006138c18287611f5b565b905060006138d86138d2838b613a02565b87613a1c565b905060006138e68483611c0b565b905060006138f48288613a5d565b90506136f3818b6115e7565b60008061390d8484611efa565b9050600061391e61372086886115e7565b905061065e82826115e7565b6000806139378684611efa565b90506000613948613720888a6115e7565b9050600061395683836115e7565b905060006139648489611f5b565b905061368b6139738884613a02565b82613a1c565b6000806139868484611efa565b905060006139948287611c0b565b905060006139a28286613a5d565b90506137cd81876115e7565b6000806139bb8684611efa565b905060006139c98287611f5b565b905060006139d7878a6115e7565b905060006139e58483611f5b565b905060006139f661382d8984613a02565b90506136f388826115e7565b60008282026108e684158061193857508385838161193557fe5b6000613a2b821515600461162c565b50811515600019909201046001010290565b6000613a4c821515600461162c565b818381613a5557fe5b049392505050565b60008160200151831015613aa657815161133c90613a8490670de0b6b3a764000090611c0b565b60208401518451613aa091613a99919061191b565b8690611c0b565b90612b4e565b81604001518311613ab8575081610710565b815161133c90613ad190670de0b6b3a7640000906115e7565b60408401518451613aa091613ae6919061191b565b86906115e7565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561071081614720565b600082601f830112613b83578081fd5b8135613b96613b91826146f4565b6146cd565b818152915060208083019084810181840286018201871015613bb757600080fd5b60005b84811015613bd657813584529282019290820190600101613bba565b505050505092915050565b600082601f830112613bf1578081fd5b8151613bff613b91826146f4565b818152915060208083019084810181840286018201871015613c2057600080fd5b60005b84811015613bd657815184529282019290820190600101613c23565b600082601f830112613c4f578081fd5b813567ffffffffffffffff811115613c65578182fd5b613c786020601f19601f840116016146cd565b9150808252836020828501011115613c8f57600080fd5b8060208401602084013760009082016020015292915050565b80356002811061071057600080fd5b6000610120808385031215613cca578182fd5b613cd3816146cd565b915050613ce08383613ca8565b8152613cef8360208401613b68565b6020820152613d018360408401613b68565b6040820152606082013560608201526080820135608082015260a082013560a0820152613d318360c08401613b68565b60c0820152613d438360e08401613b68565b60e08201526101008083013567ffffffffffffffff811115613d6457600080fd5b613d7085828601613c3f565b82840152505092915050565b600060208284031215613d8d578081fd5b81356108e681614720565b60008060408385031215613daa578081fd5b8235613db581614720565b91506020830135613dc581614720565b809150509250929050565b600080600060608486031215613de4578081fd5b8335613def81614720565b92506020840135613dff81614720565b929592945050506040919091013590565b600080600080600080600060e0888a031215613e2a578283fd5b8735613e3581614720565b96506020880135613e4581614720565b955060408801359450606088013593506080880135613e6381614735565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613e92578182fd5b8235613e9d81614720565b946020939093013593505050565b600080600060608486031215613ebf578081fd5b835167ffffffffffffffff80821115613ed6578283fd5b818601915086601f830112613ee9578283fd5b8151613ef7613b91826146f4565b80828252602080830192508086018b828387028901011115613f17578788fd5b8796505b84871015613f42578051613f2e81614720565b845260019690960195928101928101613f1b565b508901519097509350505080821115613f59578283fd5b50613f6686828701613be1565b925050604084015190509250925092565b600060208284031215613f88578081fd5b815180151581146108e6578182fd5b600060208284031215613fa8578081fd5b5051919050565b600080600080600080600060e0888a031215613fc9578081fd5b873596506020880135613fdb81614720565b95506040880135613feb81614720565b9450606088013567ffffffffffffffff80821115614007578283fd5b6140138b838c01613b73565b955060808a0135945060a08a0135935060c08a0135915080821115614036578283fd5b506140438a828b01613c3f565b91505092959891949750929550565b600060208284031215614063578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e6578182fd5b6000602082840312156140a3578081fd5b81516108e681614720565b600080600080608085870312156140c3578182fd5b843567ffffffffffffffff808211156140da578384fd5b6140e688838901613cb7565b955060208701359150808211156140fb578384fd5b5061410887828801613b73565b949794965050505060408301359260600135919050565b600080600060608486031215614133578081fd5b833567ffffffffffffffff811115614149578182fd5b61415586828701613cb7565b9660208601359650604090950135949350505050565b60006020828403121561417c578081fd5b5035919050565b60008060408385031215614195578182fd5b50508035926020909101359150565b600080600080608085870312156141b9578182fd5b84519350602085015192506040850151915060608501516141d981614720565b939692955090935050565b6000602082840312156141f5578081fd5b81516108e681614735565b60008060408385031215614212578182fd5b825161421d81614735565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156142695781518752958201959082019060010161424d565b509495945050505050565b15159052565b60008151808452815b8181101561429f57602081850181015186830182015201614283565b818111156142b05782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b828110156143d957815180516004811061438257fe5b8552808701516143948887018261422d565b5085810151868601526060808201516143af8288018261422d565b5050608090810151906143c48682018361422d565b505060a093909301929085019060010161436c565b5091979650505050505050565b6000602082526108e6602083018461423a565b60006040825261440c604083018561423a565b828103602084015261109f818561423a565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156144da576144c48451614714565b82529284019260019290920191908401906144b2565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a0870152614518818561423a565b935050506040850151818584030160c0860152614535838261427a565b92505050606084015161454b60e0850182614274565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b818110156145d2576145c08551614714565b835293830193918301916001016145ae565b505084810360408601528551808252908201925081860190845b81811015612573576145fe8351614714565b855293830193918301916001016145ec565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016003831061467f57fe5b91905290565b6000602082526108e6602083018461427a565b6000838252604060208301526115d1604083018461423a565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156146ec57600080fd5b604052919050565b600067ffffffffffffffff82111561470a578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114611a7957600080fd5b60ff81168114611a7957600080fdfea264697066735822122041fa1dca66c1712715fd40f0825298363f844b4684569cae2847e9e8479c9c4364736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/artifact/GearboxLinearPoolFactory.json b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/artifact/GearboxLinearPoolFactory.json new file mode 100644 index 0000000..4eb75d0 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/artifact/GearboxLinearPoolFactory.json @@ -0,0 +1,334 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GearboxLinearPoolFactory", + "sourceName": "contracts/gearbox-linear-pool/GearboxLinearPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "contract IBalancerQueries", + "name": "queries", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "poolVersion", + "type": "string" + }, + { + "internalType": "uint256", + "name": "initialPauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "GearboxLinearPoolCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract GearboxLinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastCreatedPool", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeePercentagesProvider", + "outputs": [ + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101e06040523480156200001257600080fd5b5060405162009494380380620094948339810160408190526200003591620003bc565b86868383604051806020016200004b906200026b565b601f1982820381018352601f9091011660405282828630848d6200006f816200017d565b5080516002810460a081905280820360e0819052818452836200009e8162000196602090811b620009f317901c565b60601b6001600160601b0319166080528285018051838252620000cd8262000196602090811b620009f317901c565b6001600160601b0319606091821b811660c0529690935290526101009590955250509290911b909116610120525062000110630163f500831115610194620001ea565b620001246276a700821115610195620001ea565b610140829052610160524201610180525050506001600160601b0319606091821b81166101a05260016003559087901b166101c0525082516200016f90600690602086019062000279565b50505050505050506200048d565b80516200019290600090602084019062000279565b5050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001e46001600160a01b03831615156101ac620001ea565b50919050565b816200019257620001928162000207816210905360ea1b6200020a565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6159918062003b0383390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002bc57805160ff1916838001178555620002ec565b82800160010185558215620002ec579182015b82811115620002ec578251825591602001919060010190620002cf565b50620002fa929150620002fe565b5090565b5b80821115620002fa5760008155600101620002ff565b600082601f83011262000326578081fd5b81516001600160401b03808211156200033d578283fd5b6040516020601f8401601f19168201810183811183821017156200035f578586fd5b806040525081945083825286818588010111156200037c57600080fd5b600092505b83831015620003a0578583018101518284018201529182019162000381565b83831115620003b25760008185840101525b5050505092915050565b600080600080600080600060e0888a031215620003d7578283fd5b8751620003e48162000477565b6020890151909750620003f78162000477565b60408901519096506200040a8162000477565b60608901519095506001600160401b038082111562000427578485fd5b620004358b838c0162000315565b955060808a01519150808211156200044b578485fd5b506200045a8a828b0162000315565b93505060a0880151915060c0880151905092959891949750929550565b6001600160a01b03811681146200020757600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405161016051610180516101a05160601c6101c05160601c6135e1620005226000398061057052508061050452508061028b52806102b55250806102d9525050806109445250806108f2525080610a5c5250806102625280610ad8525080610a7d5250806102415280610ab452506135e16000f3fe60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c80636634b753116200009957806376895be7116200006f57806376895be714620001cd578063851c1bb314620001e45780638d928af8146200020a578063aaabadc5146200021457620000ff565b80636634b75314620001935780636c57f5a914620001b9578063739238d614620001c357620000ff565b80632f2770db11620000db5780632f2770db146200015a5780633f819b6f146200016657806354fd4d5014620001705780635ed31282146200017a57620000ff565b8062c194db1462000104578063174481fa14620001265780632da47c401462000140575b600080fd5b6200010e6200021e565b6040516200011d919062001459565b60405180910390f35b620001306200023f565b6040516200011d929190620013f2565b6200014a62000285565b6040516200011d92919062001652565b620001646200030e565b005b6200010e62000378565b6200010e62000430565b62000184620004b2565b6040516200011d9190620013d1565b620001aa620001a43660046200114d565b620004ce565b6040516200011d919062001419565b620001aa620004f9565b6200018462000502565b62000184620001de366004620011f6565b62000526565b620001fb620001f536600462001195565b620008ee565b6040516200011d919062001424565b6200018462000942565b6200018462000966565b60606200023a6040518060200160405280600081525062000a54565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200030057807f00000000000000000000000000000000000000000000000000000000000000000392507f0000000000000000000000000000000000000000000000000000000000000000915062000309565b60009250600091505b509091565b6200031862000b2f565b6200032262000b7e565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b820191906000526020600020905b8154815290600101906020018083116200040857829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006200053262000b97565b6004805460018101909155604051606090620005516020820162000fe1565b601f1982820381018352601f909101166040526200056e62000942565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001620005a2929190620013f2565b60408051601f1981840301815290829052620005c292916020016200139e565b60405160208183030381529060405290506000620005e883838051906020012062000bb2565b9050600080620005f762000285565b915091506200060562000fef565b6200060f62000942565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508f81602001819052508e81604001819052508d816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508c816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b8160c00181815250508a8160e0018181525050828161010001818152505081816101200181815250508981610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506200076d62000378565b610160820152604051600090620007a4906200078e9084906020016200154a565b6040516020818303038152906040528a62000bca565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620007ef57600080fd5b505af115801562000804573d6000803e3d6000fd5b505050506000620008186000898962000c21565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146200088b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088290620014dc565b60405180910390fd5b6040518b9073ffffffffffffffffffffffffffffffffffffffff8416907ff7e9cc0138f2460de56932c3eced1d4e1579a83664506c19d4304af26aa48bd490600090a3509650505050505050620008e162000cff565b9998505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001620009259291906200136e565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006200097262000942565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620009b857600080fd5b505afa158015620009cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023a9190620011d7565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000a4e73ffffffffffffffffffffffffffffffffffffffff831615156101ac62000d06565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000b2181838662000d1b565b505050505050505050919050565b600062000b606000357fffffffff0000000000000000000000000000000000000000000000000000000016620008ee565b905062000b7b62000b72823362000d79565b61019162000d06565b50565b62000b9562000b8c620004f9565b1560d362000d06565b565b62000bab6002600354141561019062000d06565b6002600355565b600062000bc183833062000e17565b90505b92915050565b60008062000bd9848462000e58565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316179055949350505050565b6000808447101562000c61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000882906200146e565b825162000c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008829062001513565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088290620014a5565b949350505050565b6001600355565b8162000d175762000d178162000ef5565b5050565b5b6020811062000d3d578151835260209283019290910190601f190162000d1c565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000d8562000966565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000dc3939291906200142d565b60206040518083038186803b15801562000ddc57600080fd5b505afa15801562000df1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bc1919062001173565b60008060ff60f81b83868660405160200162000e3794939291906200130a565b60408051808303601f19018152919052805160209091012095945050505050565b600062000e6462000b7e565b600062000e72848462000f21565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a29392505050565b62000b7b817f42414c000000000000000000000000000000000000000000000000000000000062000f66565b6000606062000f308462000a54565b90506000838251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf7573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611ef580620016b783390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b803562000bc48162001693565b600082601f830112620010dc578081fd5b813567ffffffffffffffff80821115620010f4578283fd5b6040516020601f19601f850116820101818110838211171562001115578485fd5b6040528281529250828483016020018610156200113157600080fd5b8260208601602083013760006020848301015250505092915050565b6000602082840312156200115f578081fd5b81356200116c8162001693565b9392505050565b60006020828403121562001185578081fd5b815180151581146200116c578182fd5b600060208284031215620011a7578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146200116c578182fd5b600060208284031215620011e9578081fd5b81516200116c8162001693565b60008060008060008060008060006101208a8c03121562001215578485fd5b893567ffffffffffffffff808211156200122d578687fd5b6200123b8d838e01620010cb565b9a5060208c013591508082111562001251578687fd5b50620012608c828d01620010cb565b98505060408a0135620012738162001693565b965060608a0135620012858162001693565b955060808a0135945060a08a01359350620012a48b60c08c01620010be565b925060e08a013591506101008a013590509295985092959850929598565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620012f681602086016020860162001660565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60008351620013b281846020880162001660565b835190830190620013c881836020880162001660565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000bc16020830184620012dc565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b60006020825262001560602083018451620012c2565b60208301516101808060408501526200157e6101a0850183620012dc565b91506040850151601f19808685030160608701526200159e8483620012dc565b935060608701519150620015b66080870183620012c2565b60808701519150620015cc60a0870183620012c2565b60a08701519150620015e260c0870183620012c2565b60c087015160e08781019190915287015161010080880191909152870151610120808801919091528701516101408088019190915287015191506101606200162d81880184620012c2565b870151868503909101838701529050620016488382620012dc565b9695505050505050565b918252602082015260400190565b60005b838110156200167d57818101518382015260200162001663565b838111156200168d576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000b7b57600080fdfe6101806040523480156200001257600080fd5b5060405162001ef538038062001ef5833981016040819052620000359162000582565b6200003f6200041c565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b1580156200007b57600080fd5b505afa15801562000090573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620000ba9190810190620004be565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b158015620000f457600080fd5b505afa15801562000109573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200012f919062000569565b815181106200013a57fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200019957600080fd5b505afa158015620001ae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d4919062000569565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200021557600080fd5b505afa1580156200022a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000250919062000498565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b158015620002a657600080fd5b505afa158015620002bb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e1919062000498565b6001600160601b0319606091821b811660e05292811b8316610120521b1661014052506000620003106200041c565b90506000816001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200034e57600080fd5b505afa15801562000363573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000389919062000498565b9050806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015620003c557600080fd5b505afa158015620003da573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000400919062000498565b60601b6001600160601b03191661016052506200060092505050565b6000336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200045857600080fd5b505afa1580156200046d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000493919062000498565b905090565b600060208284031215620004aa578081fd5b8151620004b781620005e7565b9392505050565b60006020808385031215620004d1578182fd5b82516001600160401b0380821115620004e8578384fd5b818501915085601f830112620004fc578384fd5b8151818111156200050b578485fd5b83810291506200051d848301620005c0565b8181528481019084860184860187018a101562000538578788fd5b8795505b838610156200055c5780518352600195909501949186019186016200053c565b5098975050505050505050565b6000602082840312156200057b578081fd5b5051919050565b6000806040838503121562000595578081fd5b8251620005a281620005e7565b6020840151909250620005b581620005e7565b809150509250929050565b6040518181016001600160401b0381118282101715620005df57600080fd5b604052919050565b6001600160a01b0381168114620005fd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c6101605160601c61180a620006eb60003980610cbf528061100a52806110d4528061113652508061050952806108215250806101335280610c145280610f0f5280610f715250806103bf52508061046c5280610599528061074852806108ec52508060ea5280610190528061043052806105cc528061063152806106d2528061078452806108b152806110b252508061016f5280610402528061071a5280610a7d5280610b5c5280610d975280610e7652508060995280610309525061180a6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611514565b60405180910390f35b6100776100723660046113d2565b6100bb565b60405161005b9190611747565b6100776100923660046113ee565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc929190611660565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c9190611474565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a9392919061155c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a49190611451565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f561131f565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c9611382565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611684565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105929190611439565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d2b565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611514565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b69190611439565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fa6565b9695505050505050565b600061070d61131f565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e1611382565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611684565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa9190611439565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fca565b611098565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d2b565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a91906114f8565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b69190611419565b6101a2611170565b60006109cd8215156004611170565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b6005611170565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f6113a9565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016115dc565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517f05fe138b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906305fe138b90610cf69084903090600401611660565b600060405180830381600087803b158015610d1057600080fd5b505af1158015610d24573d6000803e3d6000fd5b5050505050565b6040805160028082526060828101909352816020015b610d496113a9565b815260200190600190039081610d41579050509050600281600081518110610d6d57fe5b6020026020010151600001906002811115610d8457fe5b90816002811115610d9157fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610dc357fe5b602002602001015160200181815250508181600081518110610de157fe5b602002602001015160600181815250508281600081518110610dff57fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e4c57fe5b6020026020010151600001906002811115610e6357fe5b90816002811115610e7057fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ea257fe5b602002602001015160200181815250508181600181518110610ec057fe5b602002602001015160600181815250508281600181518110610ede57fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f349084167f000000000000000000000000000000000000000000000000000000000000000084611182565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016115dc565b610fc58363a9059cbb60e01b848460405160240161027a9291906115b6565b505050565b6040517f5427c93800000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635427c9389061103f908590600401611747565b60206040518083038186803b15801561105757600080fd5b505afa15801561106b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108f9190611439565b60010192915050565b6110f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611182565b6040517f9aa5d46200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639aa5d46290610cf69084903090600090600401611750565b8161117e5761117e81611277565b5050565b801580159061123357506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e906111e09030908690600401611535565b60206040518083038186803b1580156111f857600080fd5b505afa15801561120c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112309190611439565b15155b15611258576112588363095ea7b360e01b84600060405160240161027a92919061158d565b610fc58363095ea7b360e01b848460405160240161027a9291906115b6565b6112a1817f42414c00000000000000000000000000000000000000000000000000000000006112a4565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6000602082840312156113e3578081fd5b813561011b816117b2565b60008060408385031215611400578081fd5b823561140b816117b2565b946020939093013593505050565b60006020828403121561142a578081fd5b8151801515811461011b578182fd5b60006020828403121561144a578081fd5b5051919050565b60008060408385031215611463578182fd5b505080516020909101519092909150565b60008060008060808587031215611489578182fd5b84519350602085015192506040850151915060608501516114a9816117b2565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161150a81846020870161177c565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561165357815180516003811061160f57fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff168686015260609081015190850152608090930192908501906001016115f9565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a0830152602084015161169f816117a8565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c061014084015280518061016085015261018061170b828287016020860161177c565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b60208301846114b4565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff919091166020830152604082015260600190565b60005b8381101561179757818101518382015260200161177f565b838111156102fc5750506000910152565b600281106112a157fe5b73ffffffffffffffffffffffffffffffffffffffff811681146112a157600080fdfea2646970667358221220a3ec33f4d31e9d7f57d60a45a18ed992e3e68902209e08490c4ddb3ce48cdce764736f6c63430007010033a2646970667358221220562eed8a28ab85bcde814cb6b0c6c9f268aeed91059ccc9d4c6be0df89d5797b64736f6c634300070100336102c06040523480156200001257600080fd5b506040516200599138038062005991833981016040819052620000359162000e00565b6101608101518151602083015160408401516060850151608086015160c0870151620000618862000476565b60e08901516101008a01516101208b01516101408c01518a6200009e8160006200008c8c8c620004ff565b89620005b060201b620014241760201c565b8b8b86868686838387878b86336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000ed92919062000c89565b5080516200010390600490602084019062000c89565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001829050630163f5008311156101946200077e565b620001966276a7008211156101956200077e565b4291909101610140819052016101605260601b6001600160601b031916610180526101a08690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000dc1565b6001600160a01b03166101c0816001600160a01b031660601b8152505050505050505050876001600160a01b03166101e0816001600160a01b031660601b81525050866001600160a01b0316610200816001600160a01b031660601b81525050866001600160a01b0316886001600160a01b031610620002bb576002620002be565b60015b60ff16610220526001600160a01b0380881690891610620002e1576001620002e4565b60025b60ff1661024052620002f68862000793565b61026052620003058762000793565b610280526000620003188982896200083f565b620003238562000939565b5050505050505050505050506200034081620009c860201b60201c565b50600081608001516001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038157600080fd5b505afa15801562000396573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003bc919062000dc1565b90506200045e816001600160a01b0316632495a5996040518163ffffffff1660e01b815260040160206040518083038186803b158015620003fc57600080fd5b505afa15801562000411573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000437919062000dc1565b6001600160a01b031683606001516001600160a01b0316146102086200077e60201b60201c565b60601b6001600160601b0319166102a052506200107d565b6040805160028082526060808301845292839291906020830190803683370190505090508260a0015181600081518110620004ad57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260a0015181600181518110620004e057fe5b6001600160a01b03909216602092830291909101909101529050919050565b60408051600280825260608281019093526001600160a01b03848116908616109183918160200160208202803683370190505090508162000541578362000543565b845b816000815181106200055157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050816200057e578462000580565b835b816001815181106200058e57fe5b6001600160a01b03909216602092830291909101909101529150505b92915050565b6000620005c883620009dd60201b620015d91760201c565b606083516001016001600160401b0381118015620005e557600080fd5b5060405190808252806020026020018201604052801562000610578160200160208202803683370190505b50905030816000815181106200062257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b845181101562000695578481815181106200065c57fe5b60200260200101518282600101815181106200067457fe5b6001600160a01b039092166020928302919091019091015260010162000645565b50606083516001016001600160401b0381118015620006b357600080fd5b50604051908082528060200260200182016040528015620006de578160200160208202803683370190505b509050600081600081518110620006f157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b845181101562000764578481815181106200072b57fe5b60200260200101518282600101815181106200074357fe5b6001600160a01b039092166020928302919091019091015260010162000714565b506200077387878484620009e9565b979650505050505050565b816200078f576200078f8162000ae3565b5050565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620007d057600080fd5b505afa158015620007e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200080b919062000f57565b60ff16905060006200082a60128362000af860201b620015e71760201c565b600a0a670de0b6b3a764000002949350505050565b620008508183111561014c6200077e565b6200086d6b0de0b6b39983494c589c000082111561014d6200077e565b62000887670de0b6b3a7640000825b06156101616200077e565b6200089b670de0b6b3a7640000836200087c565b620008ea670de0b6b3a7640000820460406020620008d4670de0b6b3a764000087600854919004602080620015fd62000b10821b17811c565b62000b1060201b620015fd17909392919060201c565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906200092c908590859062001026565b60405180910390a2505050565b6200094e64e8d4a5100082101560cb6200077e565b6200096667016345785d8a000082111560ca6200077e565b620009888160c0603f60085462000b1060201b620015fd17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90620009bd9083906200101d565b60405180910390a150565b80516200078f90600990602084019062000c89565b806200078f8162000b35565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040162000a1a919062001008565b602060405180830381600087803b15801562000a3557600080fd5b505af115801562000a4a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a70919062000de7565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000aa59084908890889060040162000f7a565b600060405180830381600087803b15801562000ac057600080fd5b505af115801562000ad5573d6000803e3d6000fd5b509298975050505050505050565b62000af5816210905360ea1b62000bc1565b50565b600062000b0a8383111560016200077e565b50900390565b600062000b1f84848462000c22565b506001901b60001901811b1992909216911b1790565b60028151101562000b465762000af5565b60008160008151811062000b5657fe5b602002602001015190506000600190505b825181101562000bbc57600083828151811062000b8057fe5b6020026020010151905062000bb1816001600160a01b0316846001600160a01b03161060656200077e60201b60201c565b915060010162000b67565b505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b62000c33610100831060646200077e565b62000c6c6001821015801562000c64575062000c6060ff846101000362000c7d60201b620016201760201c565b8211155b60646200077e565b62000bbc83821c156101b46200077e565b80820390821102900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000ccc57805160ff191683800117855562000cfc565b8280016001018555821562000cfc579182015b8281111562000cfc57825182559160200191906001019062000cdf565b5062000d0a92915062000d0e565b5090565b5b8082111562000d0a576000815560010162000d0f565b8051620005aa8162001067565b600082601f83011262000d43578081fd5b81516001600160401b0381111562000d59578182fd5b602062000d6f601f8301601f1916820162001034565b9250818352848183860101111562000d8657600080fd5b60005b8281101562000da657848101820151848201830152810162000d89565b8281111562000db85760008284860101525b50505092915050565b60006020828403121562000dd3578081fd5b815162000de08162001067565b9392505050565b60006020828403121562000df9578081fd5b5051919050565b60006020828403121562000e12578081fd5b81516001600160401b038082111562000e29578283fd5b818401915061018080838703121562000e40578384fd5b62000e4b8162001034565b905062000e59868462000d25565b815260208301518281111562000e6d578485fd5b62000e7b8782860162000d32565b60208301525060408301518281111562000e93578485fd5b62000ea18782860162000d32565b60408301525062000eb6866060850162000d25565b606082015262000eca866080850162000d25565b608082015262000ede8660a0850162000d25565b60a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014062000f208782860162000d25565b90820152610160838101518381111562000f38578586fd5b62000f468882870162000d32565b918301919091525095945050505050565b60006020828403121562000f69578081fd5b815160ff8116811462000de0578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000fc65762000fb385516200105b565b8352938301939183019160010162000f9e565b505084810360408601528551808252908201925081860190845b8181101562000ad55762000ff583516200105b565b8552938301939183019160010162000fe0565b60208101600383106200101757fe5b91905290565b90815260200190565b918252602082015260400190565b6040518181016001600160401b03811182821017156200105357600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b038116811462000af557600080fd5b60805160a05160c05160e0516101005160601c6101205160601c61014051610160516101805160601c6101a0516101c05160601c6101e05160601c6102005160601c610220516102405161026051610280516102a05160601c61477a62001217600039806118435250806107f45250806107905280612a81525080610718528061081c5280610c515280612efc528061308552806131bd52806132c85280613445528061357d5250806107b252806109bc5280610c175280612ec8528061300a528061305152806131475280613189528061329452806133cf5280613411528061350752806135495250806113f852806126eb52806127b75280612aa75280612e7d5280612f96528061324a528061335b5250806109e052806110ee5280611ab15280611b5052806126a2528061276e5280612a465280612e3e5280612f4052806130d3528061320b528061330c52806134935250806111cc5250806109495250508061181d5250806117f9525080610fd1525080610fad525080610f5d5250806123df525080612421525080612400525061477a6000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e3660046140ae565b610608565b6040516103509190614441565b60405180910390f35b610361610668565b6040516103509190614685565b61038161037c366004613e80565b6106ff565b604051610350919061441e565b610343610716565b61034361073a565b6103a6610740565b60405161035093929190614429565b6103bd610769565b60405161035091906143e6565b6103816103d8366004613dd0565b610877565b6103e56108ed565b60405161035091906146bf565b6103436108f6565b61040d61040836600461416b565b610905565b005b610343610947565b610381610425366004613e80565b61096b565b61040d6109a6565b6103436109ba565b6104426109de565b604051610350919061433b565b61040d610a02565b610361610a56565b610343610ab7565b61047a610475366004613faf565b610aca565b604051610350929190614698565b610490610ae8565b6040516103509291906146b1565b610343610b26565b6103436104b4366004613d7c565b610cbb565b6104cc6104c7366004613faf565b610cda565b6040516103509291906143f9565b6103436104e8366004613d7c565b610d9c565b61040d610da7565b610343610f42565b61040d610f47565b610343610513366004614052565b610f59565b610442610fab565b610442610fcf565b610343610536366004613d7c565b610ff3565b61036161100e565b61034361055136600461411f565b61106f565b61040d610564366004614183565b6110a8565b610381610577366004613e80565b61111a565b61038161058a366004613e80565b611158565b610442611165565b61038161116f565b61040d611180565b6104426111ca565b61040d6105bd366004613e10565b6111ee565b6104cc6105d0366004613faf565b61126f565b6103436105e3366004613d98565b611306565b610343611343565b6103436113ec565b6104426113f6565b61034361141a565b6000846080015161063561061a610fcf565b6001600160a01b0316336001600160a01b03161460cd61162c565b61064a610640610947565b82146101f461162c565b61065261163a565b61065e8686868661164d565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b505050505090505b90565b600061070c338484611772565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074d6117da565b1592506107586117f7565b915061076261181b565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107db57fe5b6020026020010181815250506108196107f261183f565b7f00000000000000000000000000000000000000000000000000000000000000009061191b565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084557fe5b602002602001018181525050670de0b6b3a76400008160008151811061086757fe5b6020908102919091010152905090565b6000806108848533611306565b90506108a8336001600160a01b03871614806108a05750838210155b61019e61162c565b6108b3858585611953565b336001600160a01b038616148015906108ce57506000198114155b156108e0576108e08533858403611772565b60019150505b9392505050565b60055460ff1690565b60006109006113ec565b905090565b61090d611a33565b610915611a7c565b600080610920610ae8565b915091506109396109318383611a8c565b61014f61162c565b61094283611b93565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070c9185906109a19086611c0b565b611772565b6109ae611a33565b6109b86000611c1d565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a0a611a33565b610a12611cae565b610a1c6001611cc2565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4c919061441e565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906109009060c0603f611d04565b60006060610adc888785611d13611d2a565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0582602080611d04565b029250670de0b6b3a7640000610b1e8260406020611d04565b029150509091565b600080610b31610947565b90506060610b3d610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b689190614441565b60006040518083038186803b158015610b8057600080fd5b505afa158015610b94573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbc9190810190613eab565b50915050610bd181610bcc610769565b611e91565b600080610bdc610ae8565b91509150610be8613aed565b6040518060600160405280610bfb610ab7565b81526020018481526020018381525090506000610c87610c4e867f000000000000000000000000000000000000000000000000000000000000000081518110610c4057fe5b602002602001015184611efa565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7a57fe5b6020026020010151611f5b565b9050610cb0610ca986600081518110610c9c57fe5b6020026020010151611f67565b8290611f7b565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce961061a610fcf565b610cf4610640610947565b6000610cff85611fd2565b15610d2757610d0c612001565b610d1e88610d1861073a565b87612014565b94509050610d3f565b610d2f61163a565b610d3a8a8987611d13565b945090505b610d498a8261210a565b835167ffffffffffffffff81118015610d6157600080fd5b50604051908082528060200260200182016040528015610d8b578160200160208202803683370190505b509250505097509795505050505050565b600061071082610ff3565b6000610db1610947565b90506060610dbd610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de89190614441565b60006040518083038186803b158015610e0057600080fd5b505afa158015610e14573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3c9190810190613eab565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e8057fe5b602002602001018181525050610e94613b0e565b6040518060800160405280610ea8856106fc565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed9610fcf565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f0a9493929190614469565b600060405180830381600087803b158015610f2457600080fd5b505af1158015610f38573d6000803e3d6000fd5b5050505050505050565b600090565b610f4f611a33565b6109b86001611c1d565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8e9291906142c5565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108161061a610fcf565b61108c610640610947565b61109461163a565b61109f858585612114565b95945050505050565b6110b0611a33565b6110b8611a7c565b6000806110c3610ae8565b915091506110d46109318383611a8c565b6110e96110e18585611a8c565b61015761162c565b6111147f00000000000000000000000000000000000000000000000000000000000000008585612121565b50505050565b6000806111273385611306565b90508083106111415761113c33856000611772565b61114e565b61114e3385858403611772565b5060019392505050565b600061070c338484611953565b60006109006121f7565b6008546000906109009060ff612271565b611188611a33565b611190612001565b61119a6000611cc2565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4c919061441e565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121d8c610ff3565b8960405160200161123396959493929190614556565b604051602081830303815290604052805190602001209050611264888261125b878787612278565b886101f86122b7565b610f38888888611772565b6060808861127e61061a610fcf565b611289610640610947565b600061129361163a565b61129b61073a565b6112ed576112aa8a8a8761230e565b945090506112c36112b9610f42565b82101560cc61162c565b6112d560006112d0610f42565b6123a6565b6112e8896112e1610f42565b83036123a6565b610d49565b6112f88a8987611d13565b94509050610d4989826123a6565b6000611310610fcf565b6001600160a01b0316826001600160a01b031614156113325750600019610710565b61133c83836123b0565b9050610710565b6000806000611350610fcf565b6001600160a01b031663b05f8e48611366610947565b306040518363ffffffff1660e01b815260040161138492919061463c565b60806040518083038186803b15801561139c57600080fd5b505afa1580156113b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d491906141a4565b5050915091506113e5818301611f67565b9250505090565b60006109006123db565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061090061183f565b600061142f836115d9565b6060835160010167ffffffffffffffff8111801561144c57600080fd5b50604051908082528060200260200182016040528015611476578160200160208202803683370190505b509050308160008151811061148757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f6578481815181106114bf57fe5b60200260200101518282600101815181106114d657fe5b6001600160a01b03909216602092830291909101909101526001016114aa565b506060835160010167ffffffffffffffff8111801561151457600080fd5b5060405190808252806020026020018201604052801561153e578160200160208202803683370190505b50905060008160008151811061155057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115bf5784818151811061158857fe5b602002602001015182826001018151811061159f57fe5b6001600160a01b0390921660209283029190910190910152600101611573565b506115cc87878484612478565b925050505b949350505050565b806115e381612581565b5050565b60006115f783831115600161162c565b50900390565b600061160a8484846125fa565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e3576115e381612640565b6109b86116456117da565b61019261162c565b60006116696003841080156116625750600383105b606461162c565b6060611673610769565b905061167f8582611e91565b60008061168a610ae8565b91509150611696613aed565b60405180606001604052806116a9610ab7565b81526020810185905260400183905290506000895160018111156116c957fe5b141561172d576116f089606001518589815181106116e357fe5b602002602001015161266a565b60608a015260006117028a8a84612676565b90506117218186898151811061171457fe5b602002602001015161273d565b955050505050506115d1565b61174189606001518588815181106116e357fe5b60608a015260006117538a8a84612749565b905061172181868a8151811061176557fe5b60200260200101516127fe565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cd908590614441565b60405180910390a3505050565b60006117e461181b565b42118061090057505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663788c6bfe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561189a57600080fd5b505afa9250505080156118ca575060408051601f3d908101601f191682019092526118c791810190613f97565b60015b61190d573d8080156118f8576040519150601f19603f3d011682016040523d82523d6000602084013e6118fd565b606091505b506119078161280a565b506106fc565b633b9aca00900490506106fc565b600082820261193f84158061193857508385838161193557fe5b04145b600361162c565b670de0b6b3a7640000815b04949350505050565b61196a6001600160a01b038416151561019861162c565b6119816001600160a01b038316151561019961162c565b61198c838383610942565b6001600160a01b0383166000908152602081905260409020546119b290826101a0612891565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119e19082611c0b565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cd908590614441565b6000611a626000357fffffffff0000000000000000000000000000000000000000000000000000000016610f59565b9050611a79611a7182336128a7565b61019161162c565b50565b6109b8611a87610fcf565b612990565b6000806000611a99610fcf565b6001600160a01b031663b05f8e48611aaf610947565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611aed92919061463c565b60806040518083038186803b158015611b0557600080fd5b505afa158015611b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3d91906141a4565b5050915091506000611b79828401611b747f0000000000000000000000000000000000000000000000000000000000000000612a42565b61266a565b905085811015801561065e57509390931115949350505050565b611ba664e8d4a5100082101560cb61162c565b611bbc67016345785d8a000082111560ca61162c565b600854611bcd908260c0603f6115fd565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611c00908390614441565b60405180910390a150565b60008282016108e6848210158361162c565b8015611c3d57611c38611c2e6117f7565b421061019361162c565b611c52565b611c52611c4861181b565b42106101a961162c565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611c0090839061441e565b6109b8611cb961116f565b156101b561162c565b600854611cd1908260ff612b1c565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611c0090839061441e565b6001901b6000190191901c1690565b60006060611d226103e6612640565b935093915050565b333014611e19576000306001600160a01b0316600036604051611d4e9291906142f5565b6000604051808303816000865af19150503d8060008114611d8b576040519150601f19603f3d011682016040523d82523d6000602084013e611d90565b606091505b505090508060008114611d9f57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611dfb573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611e2c8686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611ea0908290612b2b565b60005b8181101561111457611edb848281518110611eba57fe5b6020026020010151848381518110611ece57fe5b602002602001015161191b565b848281518110611ee757fe5b6020908102919091010152600101611ea3565b60008160200151831015611f335781516020830151600091611f1f918690039061191b565b9050611f2b84826115e7565b915050610710565b81604001518311611f45575081610710565b81516040830151600091611f1f9186039061191b565b60006108e68383611c0b565b600061071082611f7561073a565b906115e7565b6000611f8a821515600461162c565b670de0b6b3a76400008302611fbc841580611fb55750670de0b6b3a7640000858381611fb257fe5b04145b600561162c565b6001836001830304018115150291505092915050565b6000808251118015610710575060ff801682806020019051810190611ff791906141e4565b60ff161492915050565b6109b861200c61116f565b6101b661162c565b60006060600061202384612b38565b90506060865167ffffffffffffffff8111801561203f57600080fd5b50604051908082528060200260200182016040528015612069578160200160208202803683370190505b5090506000612076610f42565b90506000612089898381518110610c9c57fe5b905060006120978583612b4e565b905060005b8a518110156120f957838114156120b45760006120da565b6120da828c83815181106120c457fe5b602002602001015161191b90919063ffffffff16565b8582815181106120e657fe5b602090810291909101015260010161209c565b509399929850919650505050505050565b6115e38282612b8e565b60006108e66103e6612640565b6121308183111561014c61162c565b61214b6b0de0b6b39983494c589c000082111561014d61162c565b612163670de0b6b3a7640000825b061561016161162c565b612175670de0b6b3a764000083612159565b6121aa670de0b6b3a76400008204604060206121a2670de0b6b3a7640000876008549190046020806115fd565b9291906115fd565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121ea90859085906146b1565b60405180910390a2505050565b6000612201610fcf565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561223957600080fd5b505afa15801561224d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109009190614092565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b60006122c285612c5a565b90506122d86122d2878387612c76565b8361162c565b6122e7428410156101b861162c565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606123296001600160a01b038616301461015661162c565b6123406001600160a01b038516301461015661162c565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff8160008151811061238f57fe5b602090810291909101015290969095509350505050565b6115e38282612d25565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612448612db8565b3060405160200161245d959493929190614610565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016124a79190614671565b602060405180830381600087803b1580156124c157600080fd5b505af11580156124d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f99190613f97565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d2906125459084908890889060040161458a565b600060405180830381600087803b15801561255f57600080fd5b505af1158015612573573d6000803e3d6000fd5b509298975050505050505050565b60028151101561259057611a79565b60008160008151811061259f57fe5b602002602001015190506000600190505b82518110156109425760008382815181106125c757fe5b602002602001015190506125f0816001600160a01b0316846001600160a01b031610606561162c565b91506001016125b0565b6126096101008310606461162c565b61263160018210158015611662575061262760ff8461010003611620565b821115606461162c565b61094283821c156101b461162c565b611a79817f42414c0000000000000000000000000000000000000000000000000000000000612dbc565b60006108e6838361191b565b60208301516000906001600160a01b03163014156126a057612699848484612e37565b90506108e6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b031614156126e957612699848484612f8f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612732576126998484846130cc565b6108e6610135612640565b60006108e68383612b4e565b60408301516000906001600160a01b031630141561276c57612699848484613204565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127b557612699848484613354565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127325761269984848461348c565b60006108e68383611f7b565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417612885578160208401fd5b506115e3610165612640565b60006128a0848411158361162c565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128c6610fab565b6001600160a01b0316141580156128e157506128e1836135c4565b15612909576128ee610fab565b6001600160a01b0316336001600160a01b0316149050610710565b6129116121f7565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016129409392919061444a565b60206040518083038186803b15801561295857600080fd5b505afa15801561296c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133c9190613f77565b604080516000808252602082019092526060916129c3565b6129b0613b38565b8152602001906001900390816129a85790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e8490612a0c90849060040161434f565b600060405180830381600087803b158015612a2657600080fd5b505af1158015612a3a573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612aa557507f0000000000000000000000000000000000000000000000000000000000000000610cd5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612af157612aea6107f261183f565b9050610cd5565b6001600160a01b038216301415612b115750670de0b6b3a7640000610cd5565b610cd5610135612640565b6001811b1992909216911b1790565b6115e3818314606761162c565b6000818060200190518101906108e69190614200565b6000612b5d821515600461162c565b670de0b6b3a76400008302612b85841580611fb55750670de0b6b3a7640000858381611fb257fe5b82818161194a57fe5b612ba56001600160a01b038316151561019b61162c565b612bb182600083610942565b6001600160a01b038216600090815260208190526040902054612bd790826101b2612891565b6001600160a01b038316600090815260208190526040902055612c0a612c0582612bff61073a565b90613628565b613636565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c4e9190614441565b60405180910390a35050565b6000612c646123db565b82604051602001610f8e929190614305565b6000612c8882516041146101b961162c565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612cc1908990859088908890614653565b6020604051602081039080840390855afa158015612ce3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612d195750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612d3160008383610942565b612d46612c0582612d4061073a565b90611c0b565b6001600160a01b038216600090815260208190526040902054612d699082611c0b565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c4e908590614441565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612ebd7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eb557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162c565b6115d18460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612ef157fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f2557fe5b6020026020010151612f3d87600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612f835761363b612f87565b6136995b63ffffffff16565b6000612feb7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eb5575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b03163014613046576130418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061303357fe5b602002602001015184613702565b6115d1565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061307a57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130ae57fe5b60200260200101516130c687600081518110610c9c57fe5b86613732565b60006131287f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eb5575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b0316301461317e576130418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061317057fe5b602002602001015184613798565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131b257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106131e657fe5b60200260200101516131fe87600081518110610c9c57fe5b866137d8565b60006132897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eb557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162c565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132bd57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106132f157fe5b602002602001015161330987600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461334f5761383f612f87565b613896565b60006133b07f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eb5575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b03163014613406576130418460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106133f857fe5b602002602001015184613900565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061343a57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061346e57fe5b602002602001015161348687600081518110610c9c57fe5b8661392a565b60006134e87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eb5575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b0316301461353e576130418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061353057fe5b602002602001015184613979565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061357257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106135a657fe5b60200260200101516135be87600081518110610c9c57fe5b866139ae565b60006135ef7f9f11080e00000000000000000000000000000000000000000000000000000000610f59565b82148061071057506136207f38e9922e00000000000000000000000000000000000000000000000000000000610f59565b909114919050565b60006108e683836001612891565b600255565b6000806136488684611efa565b905060006136568287611f5b565b90506000613664868a6115e7565b9050600061367f84611f756136798587613a02565b8a613a1c565b905061368b88826115e7565b9a9950505050505050505050565b6000806136a68684611efa565b905060006136b48287611f5b565b905060006136cb6136c5838b613a02565b87613a3d565b905060006136d984836115e7565b905060006136e78288613a5d565b90506136f38a826115e7565b9b9a5050505050505050505050565b60008061370f8484611efa565b905060006137266137208688611c0b565b85611efa565b905061065e81836115e7565b60008261374a576137438683611efa565b905061109f565b60006137568684611efa565b90506000613767613720888a611c0b565b9050600061377582846115e7565b905060006137838489611f5b565b905061368b6137928884613a02565b82613a3d565b6000806137a58484611efa565b905060006137b382876115e7565b905060006137c18286613a5d565b90506137cd86826115e7565b979650505050505050565b6000826137e657508461109f565b60006137f28684611efa565b905060006138008287611f5b565b9050600061380e878a611c0b565b9050600061381c8483611f5b565b9050600061383361382d8984613a02565b85613a3d565b90506136f381896115e7565b60008261384d57508461109f565b60006138598684611efa565b905060006138678287611f5b565b90506000613875868a611c0b565b9050600061388a84611f756136798587613a02565b905061368b81896115e7565b6000826138a7576137438683613a5d565b60006138b38684611efa565b905060006138c18287611f5b565b905060006138d86138d2838b613a02565b87613a1c565b905060006138e68483611c0b565b905060006138f48288613a5d565b90506136f3818b6115e7565b60008061390d8484611efa565b9050600061391e61372086886115e7565b905061065e82826115e7565b6000806139378684611efa565b90506000613948613720888a6115e7565b9050600061395683836115e7565b905060006139648489611f5b565b905061368b6139738884613a02565b82613a1c565b6000806139868484611efa565b905060006139948287611c0b565b905060006139a28286613a5d565b90506137cd81876115e7565b6000806139bb8684611efa565b905060006139c98287611f5b565b905060006139d7878a6115e7565b905060006139e58483611f5b565b905060006139f661382d8984613a02565b90506136f388826115e7565b60008282026108e684158061193857508385838161193557fe5b6000613a2b821515600461162c565b50811515600019909201046001010290565b6000613a4c821515600461162c565b818381613a5557fe5b049392505050565b60008160200151831015613aa657815161133c90613a8490670de0b6b3a764000090611c0b565b60208401518451613aa091613a99919061191b565b8690611c0b565b90612b4e565b81604001518311613ab8575081610710565b815161133c90613ad190670de0b6b3a7640000906115e7565b60408401518451613aa091613ae6919061191b565b86906115e7565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561071081614720565b600082601f830112613b83578081fd5b8135613b96613b91826146f4565b6146cd565b818152915060208083019084810181840286018201871015613bb757600080fd5b60005b84811015613bd657813584529282019290820190600101613bba565b505050505092915050565b600082601f830112613bf1578081fd5b8151613bff613b91826146f4565b818152915060208083019084810181840286018201871015613c2057600080fd5b60005b84811015613bd657815184529282019290820190600101613c23565b600082601f830112613c4f578081fd5b813567ffffffffffffffff811115613c65578182fd5b613c786020601f19601f840116016146cd565b9150808252836020828501011115613c8f57600080fd5b8060208401602084013760009082016020015292915050565b80356002811061071057600080fd5b6000610120808385031215613cca578182fd5b613cd3816146cd565b915050613ce08383613ca8565b8152613cef8360208401613b68565b6020820152613d018360408401613b68565b6040820152606082013560608201526080820135608082015260a082013560a0820152613d318360c08401613b68565b60c0820152613d438360e08401613b68565b60e08201526101008083013567ffffffffffffffff811115613d6457600080fd5b613d7085828601613c3f565b82840152505092915050565b600060208284031215613d8d578081fd5b81356108e681614720565b60008060408385031215613daa578081fd5b8235613db581614720565b91506020830135613dc581614720565b809150509250929050565b600080600060608486031215613de4578081fd5b8335613def81614720565b92506020840135613dff81614720565b929592945050506040919091013590565b600080600080600080600060e0888a031215613e2a578283fd5b8735613e3581614720565b96506020880135613e4581614720565b955060408801359450606088013593506080880135613e6381614735565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613e92578182fd5b8235613e9d81614720565b946020939093013593505050565b600080600060608486031215613ebf578081fd5b835167ffffffffffffffff80821115613ed6578283fd5b818601915086601f830112613ee9578283fd5b8151613ef7613b91826146f4565b80828252602080830192508086018b828387028901011115613f17578788fd5b8796505b84871015613f42578051613f2e81614720565b845260019690960195928101928101613f1b565b508901519097509350505080821115613f59578283fd5b50613f6686828701613be1565b925050604084015190509250925092565b600060208284031215613f88578081fd5b815180151581146108e6578182fd5b600060208284031215613fa8578081fd5b5051919050565b600080600080600080600060e0888a031215613fc9578081fd5b873596506020880135613fdb81614720565b95506040880135613feb81614720565b9450606088013567ffffffffffffffff80821115614007578283fd5b6140138b838c01613b73565b955060808a0135945060a08a0135935060c08a0135915080821115614036578283fd5b506140438a828b01613c3f565b91505092959891949750929550565b600060208284031215614063578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e6578182fd5b6000602082840312156140a3578081fd5b81516108e681614720565b600080600080608085870312156140c3578182fd5b843567ffffffffffffffff808211156140da578384fd5b6140e688838901613cb7565b955060208701359150808211156140fb578384fd5b5061410887828801613b73565b949794965050505060408301359260600135919050565b600080600060608486031215614133578081fd5b833567ffffffffffffffff811115614149578182fd5b61415586828701613cb7565b9660208601359650604090950135949350505050565b60006020828403121561417c578081fd5b5035919050565b60008060408385031215614195578182fd5b50508035926020909101359150565b600080600080608085870312156141b9578182fd5b84519350602085015192506040850151915060608501516141d981614720565b939692955090935050565b6000602082840312156141f5578081fd5b81516108e681614735565b60008060408385031215614212578182fd5b825161421d81614735565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156142695781518752958201959082019060010161424d565b509495945050505050565b15159052565b60008151808452815b8181101561429f57602081850181015186830182015201614283565b818111156142b05782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b828110156143d957815180516004811061438257fe5b8552808701516143948887018261422d565b5085810151868601526060808201516143af8288018261422d565b5050608090810151906143c48682018361422d565b505060a093909301929085019060010161436c565b5091979650505050505050565b6000602082526108e6602083018461423a565b60006040825261440c604083018561423a565b828103602084015261109f818561423a565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156144da576144c48451614714565b82529284019260019290920191908401906144b2565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a0870152614518818561423a565b935050506040850151818584030160c0860152614535838261427a565b92505050606084015161454b60e0850182614274565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b818110156145d2576145c08551614714565b835293830193918301916001016145ae565b505084810360408601528551808252908201925081860190845b81811015612573576145fe8351614714565b855293830193918301916001016145ec565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016003831061467f57fe5b91905290565b6000602082526108e6602083018461427a565b6000838252604060208301526115d1604083018461423a565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156146ec57600080fd5b604052919050565b600067ffffffffffffffff82111561470a578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114611a7957600080fd5b60ff81168114611a7957600080fdfea264697066735822122041fa1dca66c1712715fd40f0825298363f844b4684569cae2847e9e8479c9c4364736f6c63430007010033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c80636634b753116200009957806376895be7116200006f57806376895be714620001cd578063851c1bb314620001e45780638d928af8146200020a578063aaabadc5146200021457620000ff565b80636634b75314620001935780636c57f5a914620001b9578063739238d614620001c357620000ff565b80632f2770db11620000db5780632f2770db146200015a5780633f819b6f146200016657806354fd4d5014620001705780635ed31282146200017a57620000ff565b8062c194db1462000104578063174481fa14620001265780632da47c401462000140575b600080fd5b6200010e6200021e565b6040516200011d919062001459565b60405180910390f35b620001306200023f565b6040516200011d929190620013f2565b6200014a62000285565b6040516200011d92919062001652565b620001646200030e565b005b6200010e62000378565b6200010e62000430565b62000184620004b2565b6040516200011d9190620013d1565b620001aa620001a43660046200114d565b620004ce565b6040516200011d919062001419565b620001aa620004f9565b6200018462000502565b62000184620001de366004620011f6565b62000526565b620001fb620001f536600462001195565b620008ee565b6040516200011d919062001424565b6200018462000942565b6200018462000966565b60606200023a6040518060200160405280600081525062000a54565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200030057807f00000000000000000000000000000000000000000000000000000000000000000392507f0000000000000000000000000000000000000000000000000000000000000000915062000309565b60009250600091505b509091565b6200031862000b2f565b6200032262000b7e565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b820191906000526020600020905b8154815290600101906020018083116200040857829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006200053262000b97565b6004805460018101909155604051606090620005516020820162000fe1565b601f1982820381018352601f909101166040526200056e62000942565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001620005a2929190620013f2565b60408051601f1981840301815290829052620005c292916020016200139e565b60405160208183030381529060405290506000620005e883838051906020012062000bb2565b9050600080620005f762000285565b915091506200060562000fef565b6200060f62000942565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508f81602001819052508e81604001819052508d816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508c816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b8160c00181815250508a8160e0018181525050828161010001818152505081816101200181815250508981610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506200076d62000378565b610160820152604051600090620007a4906200078e9084906020016200154a565b6040516020818303038152906040528a62000bca565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620007ef57600080fd5b505af115801562000804573d6000803e3d6000fd5b505050506000620008186000898962000c21565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146200088b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088290620014dc565b60405180910390fd5b6040518b9073ffffffffffffffffffffffffffffffffffffffff8416907ff7e9cc0138f2460de56932c3eced1d4e1579a83664506c19d4304af26aa48bd490600090a3509650505050505050620008e162000cff565b9998505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001620009259291906200136e565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006200097262000942565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620009b857600080fd5b505afa158015620009cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023a9190620011d7565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000a4e73ffffffffffffffffffffffffffffffffffffffff831615156101ac62000d06565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000b2181838662000d1b565b505050505050505050919050565b600062000b606000357fffffffff0000000000000000000000000000000000000000000000000000000016620008ee565b905062000b7b62000b72823362000d79565b61019162000d06565b50565b62000b9562000b8c620004f9565b1560d362000d06565b565b62000bab6002600354141561019062000d06565b6002600355565b600062000bc183833062000e17565b90505b92915050565b60008062000bd9848462000e58565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316179055949350505050565b6000808447101562000c61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000882906200146e565b825162000c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008829062001513565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088290620014a5565b949350505050565b6001600355565b8162000d175762000d178162000ef5565b5050565b5b6020811062000d3d578151835260209283019290910190601f190162000d1c565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000d8562000966565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000dc3939291906200142d565b60206040518083038186803b15801562000ddc57600080fd5b505afa15801562000df1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bc1919062001173565b60008060ff60f81b83868660405160200162000e3794939291906200130a565b60408051808303601f19018152919052805160209091012095945050505050565b600062000e6462000b7e565b600062000e72848462000f21565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a29392505050565b62000b7b817f42414c000000000000000000000000000000000000000000000000000000000062000f66565b6000606062000f308462000a54565b90506000838251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf7573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611ef580620016b783390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b803562000bc48162001693565b600082601f830112620010dc578081fd5b813567ffffffffffffffff80821115620010f4578283fd5b6040516020601f19601f850116820101818110838211171562001115578485fd5b6040528281529250828483016020018610156200113157600080fd5b8260208601602083013760006020848301015250505092915050565b6000602082840312156200115f578081fd5b81356200116c8162001693565b9392505050565b60006020828403121562001185578081fd5b815180151581146200116c578182fd5b600060208284031215620011a7578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146200116c578182fd5b600060208284031215620011e9578081fd5b81516200116c8162001693565b60008060008060008060008060006101208a8c03121562001215578485fd5b893567ffffffffffffffff808211156200122d578687fd5b6200123b8d838e01620010cb565b9a5060208c013591508082111562001251578687fd5b50620012608c828d01620010cb565b98505060408a0135620012738162001693565b965060608a0135620012858162001693565b955060808a0135945060a08a01359350620012a48b60c08c01620010be565b925060e08a013591506101008a013590509295985092959850929598565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620012f681602086016020860162001660565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60008351620013b281846020880162001660565b835190830190620013c881836020880162001660565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000bc16020830184620012dc565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b60006020825262001560602083018451620012c2565b60208301516101808060408501526200157e6101a0850183620012dc565b91506040850151601f19808685030160608701526200159e8483620012dc565b935060608701519150620015b66080870183620012c2565b60808701519150620015cc60a0870183620012c2565b60a08701519150620015e260c0870183620012c2565b60c087015160e08781019190915287015161010080880191909152870151610120808801919091528701516101408088019190915287015191506101606200162d81880184620012c2565b870151868503909101838701529050620016488382620012dc565b9695505050505050565b918252602082015260400190565b60005b838110156200167d57818101518382015260200162001663565b838111156200168d576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000b7b57600080fdfe6101806040523480156200001257600080fd5b5060405162001ef538038062001ef5833981016040819052620000359162000582565b6200003f6200041c565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b1580156200007b57600080fd5b505afa15801562000090573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620000ba9190810190620004be565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b158015620000f457600080fd5b505afa15801562000109573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200012f919062000569565b815181106200013a57fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200019957600080fd5b505afa158015620001ae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d4919062000569565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200021557600080fd5b505afa1580156200022a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000250919062000498565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b158015620002a657600080fd5b505afa158015620002bb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e1919062000498565b6001600160601b0319606091821b811660e05292811b8316610120521b1661014052506000620003106200041c565b90506000816001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200034e57600080fd5b505afa15801562000363573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000389919062000498565b9050806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015620003c557600080fd5b505afa158015620003da573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000400919062000498565b60601b6001600160601b03191661016052506200060092505050565b6000336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200045857600080fd5b505afa1580156200046d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000493919062000498565b905090565b600060208284031215620004aa578081fd5b8151620004b781620005e7565b9392505050565b60006020808385031215620004d1578182fd5b82516001600160401b0380821115620004e8578384fd5b818501915085601f830112620004fc578384fd5b8151818111156200050b578485fd5b83810291506200051d848301620005c0565b8181528481019084860184860187018a101562000538578788fd5b8795505b838610156200055c5780518352600195909501949186019186016200053c565b5098975050505050505050565b6000602082840312156200057b578081fd5b5051919050565b6000806040838503121562000595578081fd5b8251620005a281620005e7565b6020840151909250620005b581620005e7565b809150509250929050565b6040518181016001600160401b0381118282101715620005df57600080fd5b604052919050565b6001600160a01b0381168114620005fd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c6101605160601c61180a620006eb60003980610cbf528061100a52806110d4528061113652508061050952806108215250806101335280610c145280610f0f5280610f715250806103bf52508061046c5280610599528061074852806108ec52508060ea5280610190528061043052806105cc528061063152806106d2528061078452806108b152806110b252508061016f5280610402528061071a5280610a7d5280610b5c5280610d975280610e7652508060995280610309525061180a6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611514565b60405180910390f35b6100776100723660046113d2565b6100bb565b60405161005b9190611747565b6100776100923660046113ee565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc929190611660565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c9190611474565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a9392919061155c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a49190611451565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f561131f565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c9611382565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611684565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105929190611439565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d2b565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611514565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b69190611439565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fa6565b9695505050505050565b600061070d61131f565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e1611382565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611684565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa9190611439565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fca565b611098565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d2b565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a91906114f8565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b69190611419565b6101a2611170565b60006109cd8215156004611170565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b6005611170565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f6113a9565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016115dc565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517f05fe138b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906305fe138b90610cf69084903090600401611660565b600060405180830381600087803b158015610d1057600080fd5b505af1158015610d24573d6000803e3d6000fd5b5050505050565b6040805160028082526060828101909352816020015b610d496113a9565b815260200190600190039081610d41579050509050600281600081518110610d6d57fe5b6020026020010151600001906002811115610d8457fe5b90816002811115610d9157fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610dc357fe5b602002602001015160200181815250508181600081518110610de157fe5b602002602001015160600181815250508281600081518110610dff57fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e4c57fe5b6020026020010151600001906002811115610e6357fe5b90816002811115610e7057fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ea257fe5b602002602001015160200181815250508181600181518110610ec057fe5b602002602001015160600181815250508281600181518110610ede57fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f349084167f000000000000000000000000000000000000000000000000000000000000000084611182565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016115dc565b610fc58363a9059cbb60e01b848460405160240161027a9291906115b6565b505050565b6040517f5427c93800000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635427c9389061103f908590600401611747565b60206040518083038186803b15801561105757600080fd5b505afa15801561106b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108f9190611439565b60010192915050565b6110f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611182565b6040517f9aa5d46200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639aa5d46290610cf69084903090600090600401611750565b8161117e5761117e81611277565b5050565b801580159061123357506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e906111e09030908690600401611535565b60206040518083038186803b1580156111f857600080fd5b505afa15801561120c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112309190611439565b15155b15611258576112588363095ea7b360e01b84600060405160240161027a92919061158d565b610fc58363095ea7b360e01b848460405160240161027a9291906115b6565b6112a1817f42414c00000000000000000000000000000000000000000000000000000000006112a4565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6000602082840312156113e3578081fd5b813561011b816117b2565b60008060408385031215611400578081fd5b823561140b816117b2565b946020939093013593505050565b60006020828403121561142a578081fd5b8151801515811461011b578182fd5b60006020828403121561144a578081fd5b5051919050565b60008060408385031215611463578182fd5b505080516020909101519092909150565b60008060008060808587031215611489578182fd5b84519350602085015192506040850151915060608501516114a9816117b2565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161150a81846020870161177c565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561165357815180516003811061160f57fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff168686015260609081015190850152608090930192908501906001016115f9565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a0830152602084015161169f816117a8565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c061014084015280518061016085015261018061170b828287016020860161177c565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b60208301846114b4565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff919091166020830152604082015260600190565b60005b8381101561179757818101518382015260200161177f565b838111156102fc5750506000910152565b600281106112a157fe5b73ffffffffffffffffffffffffffffffffffffffff811681146112a157600080fdfea2646970667358221220a3ec33f4d31e9d7f57d60a45a18ed992e3e68902209e08490c4ddb3ce48cdce764736f6c63430007010033a2646970667358221220562eed8a28ab85bcde814cb6b0c6c9f268aeed91059ccc9d4c6be0df89d5797b64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/artifact/GearboxLinearPoolRebalancer.json b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/artifact/GearboxLinearPoolRebalancer.json new file mode 100644 index 0000000..a2933cf --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/artifact/GearboxLinearPoolRebalancer.json @@ -0,0 +1,83 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GearboxLinearPoolRebalancer", + "sourceName": "contracts/gearbox-linear-pool/GearboxLinearPoolRebalancer.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IBalancerQueries", + "name": "queries", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "getPool", + "outputs": [ + { + "internalType": "contract ILinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "rebalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "extraMain", + "type": "uint256" + } + ], + "name": "rebalanceWithExtraMain", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101806040523480156200001257600080fd5b5060405162001ef538038062001ef5833981016040819052620000359162000582565b6200003f6200041c565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b1580156200007b57600080fd5b505afa15801562000090573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620000ba9190810190620004be565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b158015620000f457600080fd5b505afa15801562000109573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200012f919062000569565b815181106200013a57fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200019957600080fd5b505afa158015620001ae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d4919062000569565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200021557600080fd5b505afa1580156200022a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000250919062000498565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b158015620002a657600080fd5b505afa158015620002bb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e1919062000498565b6001600160601b0319606091821b811660e05292811b8316610120521b1661014052506000620003106200041c565b90506000816001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200034e57600080fd5b505afa15801562000363573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000389919062000498565b9050806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015620003c557600080fd5b505afa158015620003da573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000400919062000498565b60601b6001600160601b03191661016052506200060092505050565b6000336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200045857600080fd5b505afa1580156200046d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000493919062000498565b905090565b600060208284031215620004aa578081fd5b8151620004b781620005e7565b9392505050565b60006020808385031215620004d1578182fd5b82516001600160401b0380821115620004e8578384fd5b818501915085601f830112620004fc578384fd5b8151818111156200050b578485fd5b83810291506200051d848301620005c0565b8181528481019084860184860187018a101562000538578788fd5b8795505b838610156200055c5780518352600195909501949186019186016200053c565b5098975050505050505050565b6000602082840312156200057b578081fd5b5051919050565b6000806040838503121562000595578081fd5b8251620005a281620005e7565b6020840151909250620005b581620005e7565b809150509250929050565b6040518181016001600160401b0381118282101715620005df57600080fd5b604052919050565b6001600160a01b0381168114620005fd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c6101605160601c61180a620006eb60003980610cbf528061100a52806110d4528061113652508061050952806108215250806101335280610c145280610f0f5280610f715250806103bf52508061046c5280610599528061074852806108ec52508060ea5280610190528061043052806105cc528061063152806106d2528061078452806108b152806110b252508061016f5280610402528061071a5280610a7d5280610b5c5280610d975280610e7652508060995280610309525061180a6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611514565b60405180910390f35b6100776100723660046113d2565b6100bb565b60405161005b9190611747565b6100776100923660046113ee565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc929190611660565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c9190611474565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a9392919061155c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a49190611451565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f561131f565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c9611382565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611684565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105929190611439565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d2b565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611514565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b69190611439565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fa6565b9695505050505050565b600061070d61131f565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e1611382565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611684565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa9190611439565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fca565b611098565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d2b565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a91906114f8565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b69190611419565b6101a2611170565b60006109cd8215156004611170565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b6005611170565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f6113a9565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016115dc565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517f05fe138b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906305fe138b90610cf69084903090600401611660565b600060405180830381600087803b158015610d1057600080fd5b505af1158015610d24573d6000803e3d6000fd5b5050505050565b6040805160028082526060828101909352816020015b610d496113a9565b815260200190600190039081610d41579050509050600281600081518110610d6d57fe5b6020026020010151600001906002811115610d8457fe5b90816002811115610d9157fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610dc357fe5b602002602001015160200181815250508181600081518110610de157fe5b602002602001015160600181815250508281600081518110610dff57fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e4c57fe5b6020026020010151600001906002811115610e6357fe5b90816002811115610e7057fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ea257fe5b602002602001015160200181815250508181600181518110610ec057fe5b602002602001015160600181815250508281600181518110610ede57fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f349084167f000000000000000000000000000000000000000000000000000000000000000084611182565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016115dc565b610fc58363a9059cbb60e01b848460405160240161027a9291906115b6565b505050565b6040517f5427c93800000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635427c9389061103f908590600401611747565b60206040518083038186803b15801561105757600080fd5b505afa15801561106b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108f9190611439565b60010192915050565b6110f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611182565b6040517f9aa5d46200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639aa5d46290610cf69084903090600090600401611750565b8161117e5761117e81611277565b5050565b801580159061123357506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e906111e09030908690600401611535565b60206040518083038186803b1580156111f857600080fd5b505afa15801561120c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112309190611439565b15155b15611258576112588363095ea7b360e01b84600060405160240161027a92919061158d565b610fc58363095ea7b360e01b848460405160240161027a9291906115b6565b6112a1817f42414c00000000000000000000000000000000000000000000000000000000006112a4565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6000602082840312156113e3578081fd5b813561011b816117b2565b60008060408385031215611400578081fd5b823561140b816117b2565b946020939093013593505050565b60006020828403121561142a578081fd5b8151801515811461011b578182fd5b60006020828403121561144a578081fd5b5051919050565b60008060408385031215611463578182fd5b505080516020909101519092909150565b60008060008060808587031215611489578182fd5b84519350602085015192506040850151915060608501516114a9816117b2565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161150a81846020870161177c565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561165357815180516003811061160f57fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff168686015260609081015190850152608090930192908501906001016115f9565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a0830152602084015161169f816117a8565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c061014084015280518061016085015261018061170b828287016020860161177c565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b60208301846114b4565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff919091166020830152604082015260600190565b60005b8381101561179757818101518382015260200161177f565b838111156102fc5750506000910152565b600281106112a157fe5b73ffffffffffffffffffffffffffffffffffffffff811681146112a157600080fdfea2646970667358221220a3ec33f4d31e9d7f57d60a45a18ed992e3e68902209e08490c4ddb3ce48cdce764736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611514565b60405180910390f35b6100776100723660046113d2565b6100bb565b60405161005b9190611747565b6100776100923660046113ee565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc929190611660565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c9190611474565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a9392919061155c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a49190611451565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f561131f565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c9611382565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611684565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105929190611439565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d2b565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611514565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b69190611439565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fa6565b9695505050505050565b600061070d61131f565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e1611382565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611684565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa9190611439565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fca565b611098565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d2b565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a91906114f8565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b69190611419565b6101a2611170565b60006109cd8215156004611170565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b6005611170565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f6113a9565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016115dc565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517f05fe138b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906305fe138b90610cf69084903090600401611660565b600060405180830381600087803b158015610d1057600080fd5b505af1158015610d24573d6000803e3d6000fd5b5050505050565b6040805160028082526060828101909352816020015b610d496113a9565b815260200190600190039081610d41579050509050600281600081518110610d6d57fe5b6020026020010151600001906002811115610d8457fe5b90816002811115610d9157fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610dc357fe5b602002602001015160200181815250508181600081518110610de157fe5b602002602001015160600181815250508281600081518110610dff57fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e4c57fe5b6020026020010151600001906002811115610e6357fe5b90816002811115610e7057fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ea257fe5b602002602001015160200181815250508181600181518110610ec057fe5b602002602001015160600181815250508281600181518110610ede57fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f349084167f000000000000000000000000000000000000000000000000000000000000000084611182565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016115dc565b610fc58363a9059cbb60e01b848460405160240161027a9291906115b6565b505050565b6040517f5427c93800000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635427c9389061103f908590600401611747565b60206040518083038186803b15801561105757600080fd5b505afa15801561106b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108f9190611439565b60010192915050565b6110f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611182565b6040517f9aa5d46200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639aa5d46290610cf69084903090600090600401611750565b8161117e5761117e81611277565b5050565b801580159061123357506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e906111e09030908690600401611535565b60206040518083038186803b1580156111f857600080fd5b505afa15801561120c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112309190611439565b15155b15611258576112588363095ea7b360e01b84600060405160240161027a92919061158d565b610fc58363095ea7b360e01b848460405160240161027a9291906115b6565b6112a1817f42414c00000000000000000000000000000000000000000000000000000000006112a4565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6000602082840312156113e3578081fd5b813561011b816117b2565b60008060408385031215611400578081fd5b823561140b816117b2565b946020939093013593505050565b60006020828403121561142a578081fd5b8151801515811461011b578182fd5b60006020828403121561144a578081fd5b5051919050565b60008060408385031215611463578182fd5b505080516020909101519092909150565b60008060008060808587031215611489578182fd5b84519350602085015192506040850151915060608501516114a9816117b2565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161150a81846020870161177c565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561165357815180516003811061160f57fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff168686015260609081015190850152608090930192908501906001016115f9565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a0830152602084015161169f816117a8565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c061014084015280518061016085015261018061170b828287016020860161177c565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b60208301846114b4565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff919091166020830152604082015260600190565b60005b8381101561179757818101518382015260200161177f565b838111156102fc5750506000910152565b600281106112a157fe5b73ffffffffffffffffffffffffffffffffffffffff811681146112a157600080fdfea2646970667358221220a3ec33f4d31e9d7f57d60a45a18ed992e3e68902209e08490c4ddb3ce48cdce764736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/index.ts b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/index.ts new file mode 100644 index 0000000..251b8ff --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/index.ts @@ -0,0 +1,106 @@ +import { bn } from '@helpers/numbers'; +import { randomBytes } from 'ethers/lib/utils'; +import { Task, TaskMode, TaskRunOptions } from '@src'; +import { GearboxLinearPoolDeployment } from './input'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import * as expectEvent from '@helpers/expectEvent'; +import { ethers } from 'hardhat'; +import { getContractDeploymentTransactionHash, saveContractDeploymentTransactionHash } from '@src'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as GearboxLinearPoolDeployment; + const args = [ + input.Vault, + input.ProtocolFeePercentagesProvider, + input.BalancerQueries, + input.FactoryVersion, + input.PoolVersion, + input.InitialPauseWindowDuration, + input.BufferPeriodDuration, + ]; + + const factory = await task.deployAndVerify('GearboxLinearPoolFactory', args, from, force); + + if (task.mode === TaskMode.LIVE) { + // We also create a Pool using the factory and verify it, to let us compute their action IDs and so that future + // Pools are automatically verified. We however don't run any of this code in CHECK mode, since we don't care about + // the contracts deployed here. The action IDs will be checked to be correct via a different mechanism. + + // GearboxLinearPools require a Gearbox (Diesel) Token + const mockGearboxVault = await task.deployAndVerify('MockGearboxVault', [input.WETH], from, force); + const mockDieselTokenArgs = ['DO NOT USE - Mock Diesel Token', 'TEST', 18, mockGearboxVault.address]; + const mockDieselToken = await task.deployAndVerify('MockGearboxDieselToken', mockDieselTokenArgs, from, force); + + // The assetManager, pauseWindowDuration and bufferPeriodDuration will be filled in later, but we need to declare + // them here to appease the type system. Those are constructor arguments, but automatically provided by the factory. + const mockPoolArgs = { + vault: input.Vault, + name: 'DO NOT USE - Mock Linear Pool', + symbol: 'TEST', + mainToken: input.WETH, + wrappedToken: mockDieselToken.address, + assetManager: undefined, + upperTarget: 0, + pauseWindowDuration: undefined, + bufferPeriodDuration: undefined, + swapFeePercentage: bn(1e12), + owner: ZERO_ADDRESS, + version: input.PoolVersion, + }; + + // This mimics the logic inside task.deploy + if (force || !task.output({ ensure: false })['MockGearboxLinearPool']) { + const PROTOCOL_ID = 0; + const SALT = randomBytes(32); + + const poolCreationReceipt = await ( + await factory.create( + mockPoolArgs.name, + mockPoolArgs.symbol, + mockPoolArgs.mainToken, + mockPoolArgs.wrappedToken, + mockPoolArgs.upperTarget, + mockPoolArgs.swapFeePercentage, + mockPoolArgs.owner, + PROTOCOL_ID, + SALT + ) + ).wait(); + const event = expectEvent.inReceipt(poolCreationReceipt, 'PoolCreated'); + const mockPoolAddress = event.args.pool; + + await saveContractDeploymentTransactionHash(mockPoolAddress, poolCreationReceipt.transactionHash, task.network); + await task.save({ MockGearboxLinearPool: mockPoolAddress }); + } + + const mockPool = await task.instanceAt('GearboxLinearPool', task.output()['MockGearboxLinearPool']); + + // In order to verify the Pool's code, we need to complete its constructor arguments by computing the factory + // provided arguments (asset manager and pause durations). + + // The asset manager is found by querying the Vault + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, task.network); + const vault = await vaultTask.deployedInstance('Vault'); + + const { assetManager: assetManagerAddress } = await vault.getPoolTokenInfo(await mockPool.getPoolId(), input.WETH); + mockPoolArgs.assetManager = assetManagerAddress; + + // The durations require knowing when the Pool was created, so we look for the timestamp of its creation block. + const txHash = await getContractDeploymentTransactionHash(mockPool.address, task.network); + const tx = await ethers.provider.getTransactionReceipt(txHash); + const poolCreationBlock = await ethers.provider.getBlock(tx.blockNumber); + + // With those and the period end times, we can compute the durations. + const { pauseWindowEndTime, bufferPeriodEndTime } = await mockPool.getPausedState(); + mockPoolArgs.pauseWindowDuration = pauseWindowEndTime.sub(poolCreationBlock.timestamp); + mockPoolArgs.bufferPeriodDuration = bufferPeriodEndTime + .sub(poolCreationBlock.timestamp) + .sub(mockPoolArgs.pauseWindowDuration); + + // We are now ready to verify the Pool + await task.verify('GearboxLinearPool', mockPool.address, [mockPoolArgs]); + + // We can also verify the Asset Manager + await task.verify('GearboxLinearPoolRebalancer', assetManagerAddress, [input.Vault, input.BalancerQueries]); + } +}; diff --git a/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/input.ts b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/input.ts new file mode 100644 index 0000000..62faf10 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/input.ts @@ -0,0 +1,31 @@ +import { Task, TaskMode } from '@src'; +import { MONTH } from '@helpers/time'; + +export type GearboxLinearPoolDeployment = { + Vault: string; + BalancerQueries: string; + ProtocolFeePercentagesProvider: string; + WETH: string; + FactoryVersion: string; + PoolVersion: string; + InitialPauseWindowDuration: number; + BufferPeriodDuration: number; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerQueries = new Task('20220721-balancer-queries', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); +const WETH = new Task('00000000-tokens', TaskMode.READ_ONLY); + +const BaseVersion = { version: 2, deployment: '20230409-gearbox-linear-pool-v2' }; + +export default { + Vault, + BalancerQueries, + ProtocolFeePercentagesProvider, + WETH, + FactoryVersion: JSON.stringify({ name: 'GearboxLinearPoolFactory', ...BaseVersion }), + PoolVersion: JSON.stringify({ name: 'GearboxLinearPool', ...BaseVersion }), + InitialPauseWindowDuration: MONTH * 3, + BufferPeriodDuration: MONTH, +}; diff --git a/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/output/base.json b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/output/base.json new file mode 100644 index 0000000..e3a5f49 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/output/base.json @@ -0,0 +1,6 @@ +{ + "GearboxLinearPoolFactory": "0x9Dd32684176638D977883448A4c914311c07bd62", + "MockGearboxVault": "0x79e435875cCee3Cd9e8da23fE34F9A011d05EA6C", + "MockGearboxDieselToken": "0xb521dD5C8e13fE202626CaC98873FEA2b7760cE4", + "MockGearboxLinearPool": "0x3c28a59356B473847AAa5e0b6F561636079213A6" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/output/mainnet.json b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/output/mainnet.json new file mode 100644 index 0000000..43517c0 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/output/mainnet.json @@ -0,0 +1,6 @@ +{ + "GearboxLinearPoolFactory": "0x39A79EB449Fc05C92c39aA6f0e9BfaC03BE8dE5B", + "MockGearboxVault": "0xC7B779AB638b7A59f490ac95199502343a81E006", + "MockGearboxDieselToken": "0xb7A32B67AAdB3866cC5c2FaBc6C6aB8a9027c3c1", + "MockGearboxLinearPool": "0x0d05Aac44aC7Dd3c7ba5d50Be93EB884A057d234" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/output/sepolia.json b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/output/sepolia.json new file mode 100644 index 0000000..5338666 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/output/sepolia.json @@ -0,0 +1,6 @@ +{ + "GearboxLinearPoolFactory": "0x8df317a729fcaA260306d7de28888932cb579b88", + "MockGearboxVault": "0x3B1eb8EB7b43882b385aB30533D9A2BeF9052a98", + "MockGearboxDieselToken": "0x4C32a8a8fDa4E24139B51b456B42290f51d6A1c4", + "MockGearboxLinearPool": "0x112a7b7ca66E6963C49BC523A415F7D8CDB806B9" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/output/zkevm.json b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/output/zkevm.json new file mode 100644 index 0000000..d8280a6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/output/zkevm.json @@ -0,0 +1,6 @@ +{ + "GearboxLinearPoolFactory": "0x687b8C9b41E01Be8B591725fac5d5f52D0564d79", + "MockGearboxVault": "0x88ED12A90142fDBFe2a28f7d5b48927254C7e760", + "MockGearboxDieselToken": "0x698CaED853bE9cEA96C268f565e2b61D3b2BcDA4", + "MockGearboxLinearPool": "0x32f03464FdF909FDf3798f87Ff3712b10c59bd86" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/readme.md b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/readme.md new file mode 100644 index 0000000..945a5fb --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/readme.md @@ -0,0 +1,14 @@ +# 2023-04-09 - Gearbox Linear Pool V2 + +Second deployment of the `GearboxLinearPoolFactory`, for Linear Pools with a Gearbox yield-bearing token (dieselToken). +Supersedes `20230213-gearbox-linear-pool`, modifying the pool factory to use Create2 when deploying a new pool. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`GearboxLinearPoolFactory` artifact](./artifact/GearboxLinearPoolFactory.json) +- [`GearboxLinearPool` artifact](./artifact/GearboxLinearPool.json) +- [`GearboxLinearPoolRebalancer` artifact](./artifact/GearboxLinearPoolRebalancer.json) diff --git a/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/test/contracts/interfaces/IGearboxDieselToken.sol b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/test/contracts/interfaces/IGearboxDieselToken.sol new file mode 100644 index 0000000..5a4af62 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/test/contracts/interfaces/IGearboxDieselToken.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity >=0.7.0 <0.9.0; + +interface IGearboxDieselToken { + /** + * @dev returns the address of the vault + */ + function owner() external view returns (address); +} + +interface IGearboxVault { + /** + * @dev returns the address of the underlying asset + */ + function underlyingToken() external view returns (address); + + /** + * @dev returns a 27 decimal fixed point 'ray' value so a rate of 1 is represented as 1e27 + */ + // solhint-disable-next-line func-name-mixedcase + function getDieselRate_RAY() external view returns (uint256); + + /** + * @dev converts diesel token amount to main token amount + */ + function fromDiesel(uint256) external view returns (uint256); + + function addLiquidity( + uint256, + address, + uint256 + ) external; + + function removeLiquidity(uint256, address) external; +} diff --git a/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/test/task.fork.ts b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/test/task.fork.ts new file mode 100644 index 0000000..a324255 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-gearbox-linear-pool-v2/test/task.fork.ts @@ -0,0 +1,410 @@ +import hre from 'hardhat'; +import { randomBytes } from 'ethers/lib/utils'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; +import { setCode } from '@nomicfoundation/hardhat-network-helpers'; +import * as expectEvent from '@helpers/expectEvent'; +import { bn, fp, FP_ONE } from '@helpers/numbers'; +import { MAX_UINT256 } from '@helpers/constants'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; + +import { impersonate, getForkedNetwork, Task, TaskMode, getSigners } from '@src'; +import { describeForkTest } from '@src'; +import { deploy, instanceAt, getArtifact } from '@src'; + +export enum SwapKind { + GivenIn = 0, + GivenOut, +} + +describeForkTest('GearboxLinearPoolFactory', 'mainnet', 16636000, function () { + let owner: SignerWithAddress, holder: SignerWithAddress, other: SignerWithAddress; + let vault: Contract, mainToken: Contract; + let factory: Contract; + let rebalancer: Contract; + + let task: Task; + + const USDC = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'; + // Diesel USDC Token + const dUSDC = '0xc411db5f5eb3f7d552f9b8454b2d74097ccde6e3'; + const USDC_SCALING = bn(1e12); // USDC has 6 decimals, so its scaling factor is 1e12 + const USDC_HOLDER = '0xdfd5293d8e347dfe59e90efd55b2956a1343963d'; + const GEARBOX_VAULT = '0x86130bDD69143D8a4E5fc50bf4323D48049E98E4'; + + const SWAP_FEE_PERCENTAGE = fp(0.01); // 1% + + // The targets are set using 18 decimals, even if the token has fewer (as is the case for USDC); + const INITIAL_UPPER_TARGET = fp(1e6); + + // The initial midpoint (upper target / 2) must be between the final lower and upper targets + const FINAL_LOWER_TARGET = fp(0.2e6); + const FINAL_UPPER_TARGET = fp(5e6); + + const PROTOCOL_ID = 0; + const TASK_NAME = '20230409-gearbox-linear-pool-v2'; + const VERSION = 2; + const SALT = randomBytes(32); + + enum AttackType { + SET_TARGETS, + SET_SWAP_FEE, + } + + let pool: Contract; + let poolId: string; + + before('run task', async () => { + task = new Task(TASK_NAME, TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('GearboxLinearPoolFactory'); + }); + + before('load signers', async () => { + [, owner, other] = await getSigners(); + + holder = await impersonate(USDC_HOLDER, fp(100)); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + + mainToken = await task.instanceAt('IERC20', USDC); + await mainToken.connect(holder).approve(vault.address, MAX_UINT256); + }); + + enum LinearPoolState { + BALANCED, + MAIN_EXCESS, + MAIN_LACK, + } + + function itRebalancesThePool(expectedState: LinearPoolState) { + it('rebalance the pool', async () => { + const { lowerTarget, upperTarget } = await pool.getTargets(); + + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + + let fees; + if (scaledCash.gt(upperTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_EXCESS); + + const excess = scaledCash.sub(upperTarget); + fees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else if (scaledCash.lt(lowerTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_LACK); + + const lack = lowerTarget.sub(scaledCash); + fees = lack.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else { + expect(expectedState).to.equal(LinearPoolState.BALANCED); + + fees = 0; + } + + const initialRecipientMainBalance = await mainToken.balanceOf(other.address); + if (expectedState != LinearPoolState.BALANCED) { + await rebalancer.connect(holder).rebalance(other.address); + } else { + await rebalancer.connect(holder).rebalanceWithExtraMain(other.address, 5); + } + const finalRecipientMainBalance = await mainToken.balanceOf(other.address); + + if (fees > 0) { + // The recipient of the rebalance call should get the fees that were collected (though there's some rounding + // error in the main-wrapped conversion). + expect(finalRecipientMainBalance.sub(initialRecipientMainBalance)).to.be.almostEqual( + fees.div(USDC_SCALING), + 0.0001 + ); + } else { + // The recipient of the rebalance call will get any extra main tokens that were not utilized. + expect(finalRecipientMainBalance).to.be.almostEqual(initialRecipientMainBalance, 0.0001); + } + + const mainInfo = await vault.getPoolTokenInfo(poolId, USDC); + + const expectedMainBalance = lowerTarget.add(upperTarget).div(2); + expect(mainInfo.cash.mul(USDC_SCALING)).to.equal(expectedMainBalance); + expect(mainInfo.managed).to.equal(0); + }); + } + + describe('create and check getters', () => { + it('deploy a linear pool', async () => { + const tx = await factory.create( + '', + '', + USDC, + dUSDC, + INITIAL_UPPER_TARGET, + SWAP_FEE_PERCENTAGE, + owner.address, + PROTOCOL_ID, + SALT + ); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await task.instanceAt('GearboxLinearPool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + const { assetManager } = await vault.getPoolTokenInfo(poolId, USDC); + rebalancer = await task.instanceAt('GearboxLinearPoolRebalancer', assetManager); + }); + + it('check factory version', async () => { + const expectedFactoryVersion = { + name: 'GearboxLinearPoolFactory', + version: VERSION, + deployment: TASK_NAME, + }; + + expect(await factory.version()).to.equal(JSON.stringify(expectedFactoryVersion)); + }); + + it('check pool version', async () => { + const expectedPoolVersion = { + name: 'GearboxLinearPool', + version: VERSION, + deployment: TASK_NAME, + }; + + expect(await pool.version()).to.equal(JSON.stringify(expectedPoolVersion)); + }); + }); + + describe('join, and rebalance', () => { + it('join the pool', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const joinAmount = INITIAL_UPPER_TARGET.mul(2).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: USDC, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert join amount - some fees will be collected as we're going over the upper target. + const excess = joinAmount.mul(USDC_SCALING).sub(INITIAL_UPPER_TARGET); + const joinCollectedFees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + + const expectedBPT = joinAmount.mul(USDC_SCALING).sub(joinCollectedFees); + expect(await pool.balanceOf(holder.address)).to.equal(expectedBPT); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + + it('set final targets', async () => { + await expect(pool.connect(owner).setTargets(FINAL_LOWER_TARGET, FINAL_UPPER_TARGET)).to.not.be.reverted; + }); + }); + + describe('generate excess of main token and rebalance', () => { + before('approve the rebalancer', async () => { + await mainToken.connect(holder).approve(rebalancer.address, MAX_UINT256); // To send extra main on rebalance + }); + + it('deposit main tokens', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const { upperTarget } = await pool.getTargets(); + const joinAmount = upperTarget.mul(5).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: USDC, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + }); + + describe('generate lack of main token and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to withdraw enough man token to bring the Pool below its lower target, which will let us later + // rebalance. + + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_LACK); + }); + + describe('join below upper target and rebalance', () => { + it('deposit main tokens', async () => { + // We're going to join with few tokens, causing the Pool to not reach its upper target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const joinAmount = midpoint.div(100).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: USDC, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('exit above lower target and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to exit with few tokens, causing for the Pool to not reach its lower target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const exitAmount = midpoint.div(100).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalance repeatedly', () => { + itRebalancesThePool(LinearPoolState.BALANCED); + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalancer query protection', async () => { + it('reverts with a malicious lending pool', async () => { + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + + await setCode(GEARBOX_VAULT, getArtifact('MockGearboxVault').deployedBytecode); + const mockLendingPool = await instanceAt('MockGearboxVault', GEARBOX_VAULT); + + await mockLendingPool.setRevertType(2); // Type 2 is malicious swap query revert + await expect(rebalancer.rebalance(other.address)).to.be.revertedWith('BAL#357'); // MALICIOUS_QUERY_REVERT + }); + }); + + describe('read-only reentrancy protection', () => { + let attacker: Contract; + + before('deploy attacker', async () => { + // Using Reentrancy Attacker from Aave Fork Test (task 20230206-aave-rebalanced-linear-pool-v4) + attacker = await deploy('ReadOnlyReentrancyAttackerAaveLP', [vault.address]); + }); + + async function performAttack(attackType: AttackType, ethAmount: BigNumber, expectRevert: boolean) { + // To trigger the callback and revert, send more than we need for the deposit + // If we send just enough, there will be no "extra" ETH, and it won't trigger the callback and attack + const amountToSend = expectRevert ? ethAmount.add(1) : ethAmount; + + const attack = attacker.startAttack(pool.address, attackType, ethAmount, { value: amountToSend }); + if (expectRevert) { + await expect(attack).to.be.revertedWith('BAL#420'); + } else { + await expect(attack).to.not.be.reverted; + } + } + + function itPerformsAttack(expectRevert: boolean) { + const action = expectRevert ? 'triggers' : 'does not trigger'; + + context('set targets', () => { + it(`${action} the set targets attack`, async () => { + await performAttack(AttackType.SET_TARGETS, fp(1), expectRevert); + }); + }); + + context('set swap fee', () => { + it(`${action} the set swap fee attack`, async () => { + await performAttack(AttackType.SET_SWAP_FEE, fp(1), expectRevert); + }); + }); + } + + context('when exactly enough ETH is sent', () => { + itPerformsAttack(false); + }); + + context('when too much ETH is sent', () => { + itPerformsAttack(true); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/artifact/YearnLinearPool.json b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/artifact/YearnLinearPool.json new file mode 100644 index 0000000..7fb62b6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/artifact/YearnLinearPool.json @@ -0,0 +1,1245 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "YearnLinearPool", + "sourceName": "contracts/yearn-linear-pool/YearnLinearPool.sol", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "assetManager", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + } + ], + "internalType": "struct YearnLinearPool.ConstructorArgs", + "name": "args", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "paused", + "type": "bool" + } + ], + "name": "PausedStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "RecoveryModeStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + } + ], + "name": "SwapFeePercentageChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lowerTarget", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + } + ], + "name": "TargetsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "enableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBptIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMainIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMainToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getNextNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPausedState", + "outputs": [ + { + "internalType": "bool", + "name": "paused", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "pauseWindowEndTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodEndTime", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeesCollector", + "outputs": [ + { + "internalType": "contract IProtocolFeesCollector", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getScalingFactors", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSwapFeePercentage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTargets", + "outputs": [ + { + "internalType": "uint256", + "name": "lowerTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVirtualSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedTokenRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "inRecoveryMode", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onExitPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "dueProtocolFees", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onJoinPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "dueProtocolFees", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IERC20", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IPoolSwapStructs.SwapRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "indexIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "indexOut", + "type": "uint256" + } + ], + "name": "onSwap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IERC20", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IPoolSwapStructs.SwapRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "balanceTokenIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balanceTokenOut", + "type": "uint256" + } + ], + "name": "onSwap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryExit", + "outputs": [ + { + "internalType": "uint256", + "name": "bptIn", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryJoin", + "outputs": [ + { + "internalType": "uint256", + "name": "bptOut", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + } + ], + "name": "setSwapFeePercentage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newLowerTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newUpperTarget", + "type": "uint256" + } + ], + "name": "setTargets", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6102a06040523480156200001257600080fd5b5060405162005a9638038062005a96833981016040819052620000359162000d76565b6101608101518151602083015160408401516060850151608086015160c08701516200006188620003ec565b60e08901516101008a01516101208b01516101408c01518a6200009e8160006200008c8c8c62000475565b896200052660201b620014231760201c565b8b8b86868686838387878b86336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000ed92919062000bff565b5080516200010390600490602084019062000bff565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001829050630163f500831115610194620006f4565b620001966276a700821115610195620006f4565b4291909101610140819052016101605260601b6001600160601b031916610180526101a08690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000d37565b6001600160a01b03166101c0816001600160a01b031660601b8152505050505050505050876001600160a01b03166101e0816001600160a01b031660601b81525050866001600160a01b0316610200816001600160a01b031660601b81525050866001600160a01b0316886001600160a01b031610620002bb576002620002be565b60015b60ff16610220526001600160a01b0380881690891610620002e1576001620002e4565b60025b60ff1661024052620002f68862000709565b61026052620003058762000709565b61028052600062000318898289620007b5565b6200032385620008af565b50505050505050505050505062000340816200093e60201b60201c565b50620003e581608001516001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038357600080fd5b505afa15801562000398573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003be919062000d37565b6001600160a01b031682606001516001600160a01b031614610208620006f460201b60201c565b5062000ff3565b6040805160028082526060808301845292839291906020830190803683370190505090508260a00151816000815181106200042357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260a00151816001815181106200045657fe5b6001600160a01b03909216602092830291909101909101529050919050565b60408051600280825260608281019093526001600160a01b038481169086161091839181602001602082028036833701905050905081620004b75783620004b9565b845b81600081518110620004c757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081620004f45784620004f6565b835b816001815181106200050457fe5b6001600160a01b03909216602092830291909101909101529150505b92915050565b60006200053e836200095360201b620015d81760201c565b606083516001016001600160401b03811180156200055b57600080fd5b5060405190808252806020026020018201604052801562000586578160200160208202803683370190505b50905030816000815181106200059857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156200060b57848181518110620005d257fe5b6020026020010151828260010181518110620005ea57fe5b6001600160a01b0390921660209283029190910190910152600101620005bb565b50606083516001016001600160401b03811180156200062957600080fd5b5060405190808252806020026020018201604052801562000654578160200160208202803683370190505b5090506000816000815181106200066757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b8451811015620006da57848181518110620006a157fe5b6020026020010151828260010181518110620006b957fe5b6001600160a01b03909216602092830291909101909101526001016200068a565b50620006e9878784846200095f565b979650505050505050565b816200070557620007058162000a59565b5050565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200074657600080fd5b505afa1580156200075b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000781919062000ecd565b60ff1690506000620007a060128362000a6e60201b620015e61760201c565b600a0a670de0b6b3a764000002949350505050565b620007c68183111561014c620006f4565b620007e36b0de0b6b39983494c589c000082111561014d620006f4565b620007fd670de0b6b3a7640000825b0615610161620006f4565b62000811670de0b6b3a764000083620007f2565b62000860670de0b6b3a76400008204604060206200084a670de0b6b3a764000087600854919004602080620015fc62000a86821b17811c565b62000a8660201b620015fc17909392919060201c565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d128090620008a2908590859062000f9c565b60405180910390a2505050565b620008c464e8d4a5100082101560cb620006f4565b620008dc67016345785d8a000082111560ca620006f4565b620008fe8160c0603f60085462000a8660201b620015fc17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906200093390839062000f93565b60405180910390a150565b80516200070590600990602084019062000bff565b80620007058162000aab565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040162000990919062000f7e565b602060405180830381600087803b158015620009ab57600080fd5b505af1158015620009c0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009e6919062000d5d565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000a1b9084908890889060040162000ef0565b600060405180830381600087803b15801562000a3657600080fd5b505af115801562000a4b573d6000803e3d6000fd5b509298975050505050505050565b62000a6b816210905360ea1b62000b37565b50565b600062000a80838311156001620006f4565b50900390565b600062000a9584848462000b98565b506001901b60001901811b1992909216911b1790565b60028151101562000abc5762000a6b565b60008160008151811062000acc57fe5b602002602001015190506000600190505b825181101562000b3257600083828151811062000af657fe5b6020026020010151905062000b27816001600160a01b0316846001600160a01b0316106065620006f460201b60201c565b915060010162000add565b505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b62000ba961010083106064620006f4565b62000be26001821015801562000bda575062000bd660ff846101000362000bf360201b6200161f1760201c565b8211155b6064620006f4565b62000b3283821c156101b4620006f4565b80820390821102900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000c4257805160ff191683800117855562000c72565b8280016001018555821562000c72579182015b8281111562000c7257825182559160200191906001019062000c55565b5062000c8092915062000c84565b5090565b5b8082111562000c80576000815560010162000c85565b8051620005208162000fdd565b600082601f83011262000cb9578081fd5b81516001600160401b0381111562000ccf578182fd5b602062000ce5601f8301601f1916820162000faa565b9250818352848183860101111562000cfc57600080fd5b60005b8281101562000d1c57848101820151848201830152810162000cff565b8281111562000d2e5760008284860101525b50505092915050565b60006020828403121562000d49578081fd5b815162000d568162000fdd565b9392505050565b60006020828403121562000d6f578081fd5b5051919050565b60006020828403121562000d88578081fd5b81516001600160401b038082111562000d9f578283fd5b818401915061018080838703121562000db6578384fd5b62000dc18162000faa565b905062000dcf868462000c9b565b815260208301518281111562000de3578485fd5b62000df18782860162000ca8565b60208301525060408301518281111562000e09578485fd5b62000e178782860162000ca8565b60408301525062000e2c866060850162000c9b565b606082015262000e40866080850162000c9b565b608082015262000e548660a0850162000c9b565b60a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014062000e968782860162000c9b565b90820152610160838101518381111562000eae578586fd5b62000ebc8882870162000ca8565b918301919091525095945050505050565b60006020828403121562000edf578081fd5b815160ff8116811462000d56578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000f3c5762000f29855162000fd1565b8352938301939183019160010162000f14565b505084810360408601528551808252908201925081860190845b8181101562000a4b5762000f6b835162000fd1565b8552938301939183019160010162000f56565b602081016003831062000f8d57fe5b91905290565b90815260200190565b918252602082015260400190565b6040518181016001600160401b038111828210171562000fc957600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b038116811462000a6b57600080fd5b60805160a05160c05160e0516101005160601c6101205160601c61014051610160516101805160601c6101a0516101c05160601c6101e05160601c6102005160601c6102205161024051610260516102805161491662001180600039806107f352508061078f5280612981525080610717528061081b5280610c505280612dfc5280612f8552806130bd52806131c85280613345528061347d5250806107b152806109bb5280610c165280612dc85280612f0a5280612f5152806130475280613089528061319452806132cf5280613311528061340752806134495250806113f7528061262c52806126f852806129a75280612d7d5280612e96528061314a528061325b5250806109df52806110ed52806119ef5280611a8e52806125e352806126af52806129465280612d3e5280612e405280612fd3528061310b528061320c52806133935250806111cb5250806109485250508061181c5250806117f8525080610fd0525080610fac525080610f5c52508061232052508061236252508061234152506149166000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e36600461424a565b610608565b60405161035091906145dd565b60405180910390f35b610361610668565b6040516103509190614821565b61038161037c36600461401c565b6106fe565b60405161035091906145ba565b610343610715565b610343610739565b6103a661073f565b604051610350939291906145c5565b6103bd610768565b6040516103509190614582565b6103816103d8366004613f6c565b610876565b6103e56108ec565b604051610350919061485b565b6103436108f5565b61040d610408366004614307565b610904565b005b610343610946565b61038161042536600461401c565b61096a565b61040d6109a5565b6103436109b9565b6104426109dd565b60405161035091906144d7565b61040d610a01565b610361610a55565b610343610ab6565b61047a61047536600461414b565b610ac9565b604051610350929190614834565b610490610ae7565b60405161035092919061484d565b610343610b25565b6103436104b4366004613f18565b610cba565b6104cc6104c736600461414b565b610cd9565b604051610350929190614595565b6103436104e8366004613f18565b610d9b565b61040d610da6565b610343610f41565b61040d610f46565b6103436105133660046141ee565b610f58565b610442610faa565b610442610fce565b610343610536366004613f18565b610ff2565b61036161100d565b6103436105513660046142bb565b61106e565b61040d61056436600461431f565b6110a7565b61038161057736600461401c565b611119565b61038161058a36600461401c565b611157565b610442611164565b61038161116e565b61040d61117f565b6104426111c9565b61040d6105bd366004613fac565b6111ed565b6104cc6105d036600461414b565b61126e565b6103436105e3366004613f34565b611305565b610343611342565b6103436113eb565b6104426113f5565b610343611419565b6000846080015161063561061a610fce565b6001600160a01b0316336001600160a01b03161460cd61162b565b61064a610640610946565b82146101f461162b565b610652611639565b61065e8686868661164c565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050905090565b600061070b338484611771565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074c6117d9565b1592506107576117f6565b915061076161181a565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107da57fe5b6020026020010181815250506108186107f161183e565b7f000000000000000000000000000000000000000000000000000000000000000090611859565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084457fe5b602002602001018181525050670de0b6b3a76400008160008151811061086657fe5b6020908102919091010152905090565b6000806108838533611305565b90506108a7336001600160a01b038716148061089f5750838210155b61019e61162b565b6108b2858585611891565b336001600160a01b038616148015906108cd57506000198114155b156108df576108df8533858403611771565b60019150505b9392505050565b60055460ff1690565b60006108ff6113eb565b905090565b61090c611971565b6109146119ba565b60008061091f610ae7565b9150915061093861093083836119ca565b61014f61162b565b61094183611ad1565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070b9185906109a09086611b49565b611771565b6109ad611971565b6109b76000611b5b565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a09611971565b610a11611bec565b610a1b6001611c00565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4b91906145ba565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906108ff9060c0603f611c42565b60006060610adb888785611c51611c68565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0482602080611c42565b029250670de0b6b3a7640000610b1d8260406020611c42565b029150509091565b600080610b30610946565b90506060610b3c610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b6791906145dd565b60006040518083038186803b158015610b7f57600080fd5b505afa158015610b93573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbb9190810190614047565b50915050610bd081610bcb610768565b611dcf565b600080610bdb610ae7565b91509150610be7613c89565b6040518060600160405280610bfa610ab6565b81526020018481526020018381525090506000610c86610c4d867f000000000000000000000000000000000000000000000000000000000000000081518110610c3f57fe5b602002602001015184611e38565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7957fe5b6020026020010151611e99565b9050610caf610ca886600081518110610c9b57fe5b6020026020010151611ea5565b8290611eb9565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce861061a610fce565b610cf3610640610946565b6000610cfe85611f10565b15610d2657610d0b611f3f565b610d1d88610d17610739565b87611f52565b94509050610d3e565b610d2e611639565b610d398a8987611c51565b945090505b610d488a82612048565b835167ffffffffffffffff81118015610d6057600080fd5b50604051908082528060200260200182016040528015610d8a578160200160208202803683370190505b509250505097509795505050505050565b600061070f82610ff2565b6000610db0610946565b90506060610dbc610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de791906145dd565b60006040518083038186803b158015610dff57600080fd5b505afa158015610e13573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3b9190810190614047565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e7f57fe5b602002602001018181525050610e93613caa565b6040518060800160405280610ea785612052565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed8610fce565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f099493929190614605565b600060405180830381600087803b158015610f2357600080fd5b505af1158015610f37573d6000803e3d6000fd5b5050505050505050565b600090565b610f4e611971565b6109b76001611b5b565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8d929190614461565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108061061a610fce565b61108b610640610946565b611093611639565b61109e858585612055565b95945050505050565b6110af611971565b6110b76119ba565b6000806110c2610ae7565b915091506110d361093083836119ca565b6110e86110e085856119ca565b61015761162b565b6111137f00000000000000000000000000000000000000000000000000000000000000008585612062565b50505050565b6000806111263385611305565b90508083106111405761113b33856000611771565b61114d565b61114d3385858403611771565b5060019392505050565b600061070b338484611891565b60006108ff612138565b6008546000906108ff9060ff6121b2565b611187611971565b61118f611f3f565b6111996000611c00565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4b91906145ba565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121c8c610ff2565b89604051602001611232969594939291906146f2565b604051602081830303815290604052805190602001209050611263888261125a8787876121b9565b886101f86121f8565b610f37888888611771565b6060808861127d61061a610fce565b611288610640610946565b6000611292611639565b61129a610739565b6112ec576112a98a8a8761224f565b945090506112c26112b8610f41565b82101560cc61162b565b6112d460006112cf610f41565b6122e7565b6112e7896112e0610f41565b83036122e7565b610d48565b6112f78a8987611c51565b94509050610d4889826122e7565b600061130f610fce565b6001600160a01b0316826001600160a01b03161415611331575060001961070f565b61133b83836122f1565b905061070f565b600080600061134f610fce565b6001600160a01b031663b05f8e48611365610946565b306040518363ffffffff1660e01b81526004016113839291906147d8565b60806040518083038186803b15801561139b57600080fd5b505afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190614340565b5050915091506113e4818301611ea5565b9250505090565b60006108ff61231c565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff61183e565b600061142e836115d8565b6060835160010167ffffffffffffffff8111801561144b57600080fd5b50604051908082528060200260200182016040528015611475578160200160208202803683370190505b509050308160008151811061148657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f5578481815181106114be57fe5b60200260200101518282600101815181106114d557fe5b6001600160a01b03909216602092830291909101909101526001016114a9565b506060835160010167ffffffffffffffff8111801561151357600080fd5b5060405190808252806020026020018201604052801561153d578160200160208202803683370190505b50905060008160008151811061154f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115be5784818151811061158757fe5b602002602001015182826001018151811061159e57fe5b6001600160a01b0390921660209283029190910190910152600101611572565b506115cb878784846123b9565b925050505b949350505050565b806115e2816124c2565b5050565b60006115f683831115600161162b565b50900390565b600061160984848461253b565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e2576115e281612581565b6109b76116446117d9565b61019261162b565b60006116686003841080156116615750600383105b606461162b565b6060611672610768565b905061167e8582611dcf565b600080611689610ae7565b91509150611695613c89565b60405180606001604052806116a8610ab6565b81526020810185905260400183905290506000895160018111156116c857fe5b141561172c576116ef89606001518589815181106116e257fe5b60200260200101516125ab565b60608a015260006117018a8a846125b7565b90506117208186898151811061171357fe5b602002602001015161267e565b955050505050506115d0565b61174089606001518588815181106116e257fe5b60608a015260006117528a8a8461268a565b905061172081868a8151811061176457fe5b602002602001015161273f565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cc9085906145dd565b60405180910390a3505050565b60006117e361181a565b4211806108ff57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff61184b6113f5565b670de0b6b3a764000061274b565b600082820261187d84158061187657508385838161187357fe5b04145b600361162b565b670de0b6b3a7640000815b04949350505050565b6118a86001600160a01b038416151561019861162b565b6118bf6001600160a01b038316151561019961162b565b6118ca838383610941565b6001600160a01b0383166000908152602081905260409020546118f090826101a0612791565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461191f9082611b49565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cc9085906145dd565b60006119a06000357fffffffff0000000000000000000000000000000000000000000000000000000016610f58565b90506119b76119af82336127a7565b61019161162b565b50565b6109b76119c5610fce565b612890565b60008060006119d7610fce565b6001600160a01b031663b05f8e486119ed610946565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611a2b9291906147d8565b60806040518083038186803b158015611a4357600080fd5b505afa158015611a57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7b9190614340565b5050915091506000611ab7828401611ab27f0000000000000000000000000000000000000000000000000000000000000000612942565b6125ab565b905085811015801561065e57509390931115949350505050565b611ae464e8d4a5100082101560cb61162b565b611afa67016345785d8a000082111560ca61162b565b600854611b0b908260c0603f6115fc565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611b3e9083906145dd565b60405180910390a150565b60008282016108e5848210158361162b565b8015611b7b57611b76611b6c6117f6565b421061019361162b565b611b90565b611b90611b8661181a565b42106101a961162b565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611b3e9083906145ba565b6109b7611bf761116e565b156101b561162b565b600854611c0f908260ff612a1c565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611b3e9083906145ba565b6001901b6000190191901c1690565b60006060611c606103e6612581565b935093915050565b333014611d57576000306001600160a01b0316600036604051611c8c929190614491565b6000604051808303816000865af19150503d8060008114611cc9576040519150601f19603f3d011682016040523d82523d6000602084013e611cce565b606091505b505090508060008114611cdd57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611d39573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611d6a8686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611dde908290612a2b565b60005b8181101561111357611e19848281518110611df857fe5b6020026020010151848381518110611e0c57fe5b6020026020010151611859565b848281518110611e2557fe5b6020908102919091010152600101611de1565b60008160200151831015611e715781516020830151600091611e5d9186900390611859565b9050611e6984826115e6565b91505061070f565b81604001518311611e8357508161070f565b81516040830151600091611e5d91860390611859565b60006108e58383611b49565b600061070f82611eb3610739565b906115e6565b6000611ec8821515600461162b565b670de0b6b3a76400008302611efa841580611ef35750670de0b6b3a7640000858381611ef057fe5b04145b600561162b565b6001836001830304018115150291505092915050565b600080825111801561070f575060ff801682806020019051810190611f359190614380565b60ff161492915050565b6109b7611f4a61116e565b6101b661162b565b600060606000611f6184612a38565b90506060865167ffffffffffffffff81118015611f7d57600080fd5b50604051908082528060200260200182016040528015611fa7578160200160208202803683370190505b5090506000611fb4610f41565b90506000611fc7898381518110610c9b57fe5b90506000611fd58583612a4e565b905060005b8a518110156120375783811415611ff2576000612018565b612018828c838151811061200257fe5b602002602001015161185990919063ffffffff16565b85828151811061202457fe5b6020908102919091010152600101611fda565b509399929850919650505050505050565b6115e28282612a8e565b90565b60006108e56103e6612581565b6120718183111561014c61162b565b61208c6b0de0b6b39983494c589c000082111561014d61162b565b6120a4670de0b6b3a7640000825b061561016161162b565b6120b6670de0b6b3a76400008361209a565b6120eb670de0b6b3a76400008204604060206120e3670de0b6b3a7640000876008549190046020806115fc565b9291906115fc565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d12809061212b908590859061484d565b60405180910390a2505050565b6000612142610fce565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561217a57600080fd5b505afa15801561218e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ff919061422e565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b600061220385612b5a565b9050612219612213878387612b76565b8361162b565b612228428410156101b861162b565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b6000606061226a6001600160a01b038616301461015661162b565b6122816001600160a01b038516301461015661162b565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff816000815181106122d057fe5b602090810291909101015290969095509350505050565b6115e28282612c25565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612389612cb8565b3060405160200161239e9594939291906147ac565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016123e8919061480d565b602060405180830381600087803b15801561240257600080fd5b505af1158015612416573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243a9190614133565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d29061248690849088908890600401614726565b600060405180830381600087803b1580156124a057600080fd5b505af11580156124b4573d6000803e3d6000fd5b509298975050505050505050565b6002815110156124d1576119b7565b6000816000815181106124e057fe5b602002602001015190506000600190505b825181101561094157600083828151811061250857fe5b60200260200101519050612531816001600160a01b0316846001600160a01b031610606561162b565b91506001016124f1565b61254a6101008310606461162b565b61257260018210158015611661575061256860ff846101000361161f565b821115606461162b565b61094183821c156101b461162b565b6119b7817f42414c0000000000000000000000000000000000000000000000000000000000612cbc565b60006108e58383611859565b60208301516000906001600160a01b03163014156125e1576125da848484612d37565b90506108e5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b0316141561262a576125da848484612e8f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612673576125da848484612fcc565b6108e5610135612581565b60006108e58383612a4e565b60408301516000906001600160a01b03163014156126ad576125da848484613104565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156126f6576125da848484613254565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b03161415612673576125da84848461338c565b60006108e58383611eb9565b600080612757846134c4565b905080612767578291505061070f565b600061277285613572565b90506127888261278286846135e6565b90613600565b9250505061070f565b60006127a0848411158361162b565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6127c6610faa565b6001600160a01b0316141580156127e157506127e183613620565b15612809576127ee610faa565b6001600160a01b0316336001600160a01b031614905061070f565b612811612138565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b8152600401612840939291906145e6565b60206040518083038186803b15801561285857600080fd5b505afa15801561286c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b9190614113565b604080516000808252602082019092526060916128c3565b6128b0613cd4565b8152602001906001900390816128a85790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e849061290c9084906004016144eb565b600060405180830381600087803b15801561292657600080fd5b505af115801561293a573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156129a557507f0000000000000000000000000000000000000000000000000000000000000000610cd4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156129f1576129ea6107f161183e565b9050610cd4565b6001600160a01b038216301415612a115750670de0b6b3a7640000610cd4565b610cd4610135612581565b6001811b1992909216911b1790565b6115e2818314606761162b565b6000818060200190518101906108e5919061439c565b6000612a5d821515600461162b565b670de0b6b3a76400008302612a85841580611ef35750670de0b6b3a7640000858381611ef057fe5b82818161188857fe5b612aa56001600160a01b038316151561019b61162b565b612ab182600083610941565b6001600160a01b038216600090815260208190526040902054612ad790826101b2612791565b6001600160a01b038316600090815260208190526040902055612b0a612b0582612aff610739565b90613684565b613692565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612b4e91906145dd565b60405180910390a35050565b6000612b6461231c565b82604051602001610f8d9291906144a1565b6000612b8882516041146101b961162b565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612bc19089908590889088906147ef565b6020604051602081039080840390855afa158015612be3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612c195750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612c3160008383610941565b612c46612b0582612c40610739565b90611b49565b6001600160a01b038216600090815260208190526040902054612c699082611b49565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612b4e9085906145dd565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612dbd7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612db557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162b565b6115d08460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612df157fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612e2557fe5b6020026020010151612e3d87600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612e8357613697612e87565b6136f55b63ffffffff16565b6000612eeb7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612db5575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b03163014612f4657612f418460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f3357fe5b60200260200101518461375e565b6115d0565b6115d08460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f7a57fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612fae57fe5b6020026020010151612fc687600081518110610c9b57fe5b8661378e565b60006130287f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612db5575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b0316301461307e57612f418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061307057fe5b6020026020010151846137f4565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106130b257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130e657fe5b60200260200101516130fe87600081518110610c9b57fe5b86613829565b60006131897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612db557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162b565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131bd57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106131f157fe5b602002602001015161320987600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461324f57613890612e87565b6138e7565b60006132b07f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612db5575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b0316301461330657612f418460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132f857fe5b602002602001015184613951565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061333a57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061336e57fe5b602002602001015161338687600081518110610c9b57fe5b8661397b565b60006133e87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612db5575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b0316301461343e57612f418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061343057fe5b6020026020010151846139ca565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061347257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106134a657fe5b60200260200101516134be87600081518110610c9b57fe5b866139ff565b6000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b505afa92505050801561352f575060408051601f3d908101601f1916820190925261352c91810190614133565b60015b6129ea573d80801561355d576040519150601f19603f3d011682016040523d82523d6000602084013e613562565b606091505b5061356c81613a53565b50610cd4565b60008061357e83613ada565b9050600061358b84613b15565b905060006135a261359b86613b50565b42906115e6565b905060006135b96135b287613b8b565b83906135e6565b905060006135cf846135ca84613bc6565b611859565b90506135db85826115e6565b979650505050505050565b60008282026108e584158061187657508385838161187357fe5b600061360f821515600461162b565b81838161361857fe5b049392505050565b600061364b7f9f11080e00000000000000000000000000000000000000000000000000000000610f58565b82148061070f575061367c7f38e9922e00000000000000000000000000000000000000000000000000000000610f58565b909114919050565b60006108e583836001612791565b600255565b6000806136a48684611e38565b905060006136b28287611e99565b905060006136c0868a6115e6565b905060006136db84611eb36136d585876135e6565b8a613bd8565b90506136e788826115e6565b9a9950505050505050505050565b6000806137028684611e38565b905060006137108287611e99565b90506000613727613721838b6135e6565b87613600565b9050600061373584836115e6565b905060006137438288613bf9565b905061374f8a826115e6565b9b9a5050505050505050505050565b60008061376b8484611e38565b9050600061378261377c8688611b49565b85611e38565b905061065e81836115e6565b6000826137a65761379f8683611e38565b905061109e565b60006137b28684611e38565b905060006137c361377c888a611b49565b905060006137d182846115e6565b905060006137df8489611e99565b90506136e76137ee88846135e6565b82613600565b6000806138018484611e38565b9050600061380f82876115e6565b9050600061381d8286613bf9565b90506135db86826115e6565b60008261383757508461109e565b60006138438684611e38565b905060006138518287611e99565b9050600061385f878a611b49565b9050600061386d8483611e99565b9050600061388461387e89846135e6565b85613600565b905061374f81896115e6565b60008261389e57508461109e565b60006138aa8684611e38565b905060006138b88287611e99565b905060006138c6868a611b49565b905060006138db84611eb36136d585876135e6565b90506136e781896115e6565b6000826138f85761379f8683613bf9565b60006139048684611e38565b905060006139128287611e99565b90506000613929613923838b6135e6565b87613bd8565b905060006139378483611b49565b905060006139458288613bf9565b905061374f818b6115e6565b60008061395e8484611e38565b9050600061396f61377c86886115e6565b905061065e82826115e6565b6000806139888684611e38565b9050600061399961377c888a6115e6565b905060006139a783836115e6565b905060006139b58489611e99565b90506136e76139c488846135e6565b82613bd8565b6000806139d78484611e38565b905060006139e58287611b49565b905060006139f38286613bf9565b90506135db81876115e6565b600080613a0c8684611e38565b90506000613a1a8287611e99565b90506000613a28878a6115e6565b90506000613a368483611e99565b90506000613a4761387e89846135e6565b905061374f88826115e6565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417613ace578160208401fd5b506115e2610165612581565b6000816001600160a01b03166301e1d1146040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b6000816001600160a01b03166344b813966040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b6000816001600160a01b031663c3535b526040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b6000816001600160a01b031663422327166040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b670de0b6b3a764000081810391100290565b6000613be7821515600461162b565b50811515600019909201046001010290565b60008160200151831015613c4257815161133b90613c2090670de0b6b3a764000090611b49565b60208401518451613c3c91613c359190611859565b8690611b49565b90612a4e565b81604001518311613c5457508161070f565b815161133b90613c6d90670de0b6b3a7640000906115e6565b60408401518451613c3c91613c829190611859565b86906115e6565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561070f816148bc565b600082601f830112613d1f578081fd5b8135613d32613d2d82614890565b614869565b818152915060208083019084810181840286018201871015613d5357600080fd5b60005b84811015613d7257813584529282019290820190600101613d56565b505050505092915050565b600082601f830112613d8d578081fd5b8151613d9b613d2d82614890565b818152915060208083019084810181840286018201871015613dbc57600080fd5b60005b84811015613d7257815184529282019290820190600101613dbf565b600082601f830112613deb578081fd5b813567ffffffffffffffff811115613e01578182fd5b613e146020601f19601f84011601614869565b9150808252836020828501011115613e2b57600080fd5b8060208401602084013760009082016020015292915050565b80356002811061070f57600080fd5b6000610120808385031215613e66578182fd5b613e6f81614869565b915050613e7c8383613e44565b8152613e8b8360208401613d04565b6020820152613e9d8360408401613d04565b6040820152606082013560608201526080820135608082015260a082013560a0820152613ecd8360c08401613d04565b60c0820152613edf8360e08401613d04565b60e08201526101008083013567ffffffffffffffff811115613f0057600080fd5b613f0c85828601613ddb565b82840152505092915050565b600060208284031215613f29578081fd5b81356108e5816148bc565b60008060408385031215613f46578081fd5b8235613f51816148bc565b91506020830135613f61816148bc565b809150509250929050565b600080600060608486031215613f80578081fd5b8335613f8b816148bc565b92506020840135613f9b816148bc565b929592945050506040919091013590565b600080600080600080600060e0888a031215613fc6578283fd5b8735613fd1816148bc565b96506020880135613fe1816148bc565b955060408801359450606088013593506080880135613fff816148d1565b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561402e578182fd5b8235614039816148bc565b946020939093013593505050565b60008060006060848603121561405b578081fd5b835167ffffffffffffffff80821115614072578283fd5b818601915086601f830112614085578283fd5b8151614093613d2d82614890565b80828252602080830192508086018b8283870289010111156140b3578788fd5b8796505b848710156140de5780516140ca816148bc565b8452600196909601959281019281016140b7565b5089015190975093505050808211156140f5578283fd5b5061410286828701613d7d565b925050604084015190509250925092565b600060208284031215614124578081fd5b815180151581146108e5578182fd5b600060208284031215614144578081fd5b5051919050565b600080600080600080600060e0888a031215614165578081fd5b873596506020880135614177816148bc565b95506040880135614187816148bc565b9450606088013567ffffffffffffffff808211156141a3578283fd5b6141af8b838c01613d0f565b955060808a0135945060a08a0135935060c08a01359150808211156141d2578283fd5b506141df8a828b01613ddb565b91505092959891949750929550565b6000602082840312156141ff578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e5578182fd5b60006020828403121561423f578081fd5b81516108e5816148bc565b6000806000806080858703121561425f578182fd5b843567ffffffffffffffff80821115614276578384fd5b61428288838901613e53565b95506020870135915080821115614297578384fd5b506142a487828801613d0f565b949794965050505060408301359260600135919050565b6000806000606084860312156142cf578081fd5b833567ffffffffffffffff8111156142e5578182fd5b6142f186828701613e53565b9660208601359650604090950135949350505050565b600060208284031215614318578081fd5b5035919050565b60008060408385031215614331578182fd5b50508035926020909101359150565b60008060008060808587031215614355578182fd5b8451935060208501519250604085015191506060850151614375816148bc565b939692955090935050565b600060208284031215614391578081fd5b81516108e5816148d1565b600080604083850312156143ae578182fd5b82516143b9816148d1565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015614405578151875295820195908201906001016143e9565b509495945050505050565b15159052565b60008151808452815b8181101561443b5760208185018101518683018201520161441f565b8181111561444c5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b8281101561457557815180516004811061451e57fe5b855280870151614530888701826143c9565b50858101518686015260608082015161454b828801826143c9565b505060809081015190614560868201836143c9565b505060a0939093019290850190600101614508565b5091979650505050505050565b6000602082526108e560208301846143d6565b6000604082526145a860408301856143d6565b828103602084015261109e81856143d6565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156146765761466084516148b0565b825292840192600192909201919084019061464e565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a08701526146b481856143d6565b935050506040850151818584030160c08601526146d18382614416565b9250505060608401516146e760e0850182614410565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b8181101561476e5761475c85516148b0565b8352938301939183019160010161474a565b505084810360408601528551808252908201925081860190845b818110156124b45761479a83516148b0565b85529383019391830191600101614788565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016003831061481b57fe5b91905290565b6000602082526108e56020830184614416565b6000838252604060208301526115d060408301846143d6565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561488857600080fd5b604052919050565b600067ffffffffffffffff8211156148a6578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146119b757600080fd5b60ff811681146119b757600080fdfea26469706673582212208932908daa8d95d8c120416420b507b772c1b48199ad84f8004d3840baaf0c1264736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e36600461424a565b610608565b60405161035091906145dd565b60405180910390f35b610361610668565b6040516103509190614821565b61038161037c36600461401c565b6106fe565b60405161035091906145ba565b610343610715565b610343610739565b6103a661073f565b604051610350939291906145c5565b6103bd610768565b6040516103509190614582565b6103816103d8366004613f6c565b610876565b6103e56108ec565b604051610350919061485b565b6103436108f5565b61040d610408366004614307565b610904565b005b610343610946565b61038161042536600461401c565b61096a565b61040d6109a5565b6103436109b9565b6104426109dd565b60405161035091906144d7565b61040d610a01565b610361610a55565b610343610ab6565b61047a61047536600461414b565b610ac9565b604051610350929190614834565b610490610ae7565b60405161035092919061484d565b610343610b25565b6103436104b4366004613f18565b610cba565b6104cc6104c736600461414b565b610cd9565b604051610350929190614595565b6103436104e8366004613f18565b610d9b565b61040d610da6565b610343610f41565b61040d610f46565b6103436105133660046141ee565b610f58565b610442610faa565b610442610fce565b610343610536366004613f18565b610ff2565b61036161100d565b6103436105513660046142bb565b61106e565b61040d61056436600461431f565b6110a7565b61038161057736600461401c565b611119565b61038161058a36600461401c565b611157565b610442611164565b61038161116e565b61040d61117f565b6104426111c9565b61040d6105bd366004613fac565b6111ed565b6104cc6105d036600461414b565b61126e565b6103436105e3366004613f34565b611305565b610343611342565b6103436113eb565b6104426113f5565b610343611419565b6000846080015161063561061a610fce565b6001600160a01b0316336001600160a01b03161460cd61162b565b61064a610640610946565b82146101f461162b565b610652611639565b61065e8686868661164c565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050905090565b600061070b338484611771565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074c6117d9565b1592506107576117f6565b915061076161181a565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107da57fe5b6020026020010181815250506108186107f161183e565b7f000000000000000000000000000000000000000000000000000000000000000090611859565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084457fe5b602002602001018181525050670de0b6b3a76400008160008151811061086657fe5b6020908102919091010152905090565b6000806108838533611305565b90506108a7336001600160a01b038716148061089f5750838210155b61019e61162b565b6108b2858585611891565b336001600160a01b038616148015906108cd57506000198114155b156108df576108df8533858403611771565b60019150505b9392505050565b60055460ff1690565b60006108ff6113eb565b905090565b61090c611971565b6109146119ba565b60008061091f610ae7565b9150915061093861093083836119ca565b61014f61162b565b61094183611ad1565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070b9185906109a09086611b49565b611771565b6109ad611971565b6109b76000611b5b565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a09611971565b610a11611bec565b610a1b6001611c00565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4b91906145ba565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906108ff9060c0603f611c42565b60006060610adb888785611c51611c68565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0482602080611c42565b029250670de0b6b3a7640000610b1d8260406020611c42565b029150509091565b600080610b30610946565b90506060610b3c610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b6791906145dd565b60006040518083038186803b158015610b7f57600080fd5b505afa158015610b93573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbb9190810190614047565b50915050610bd081610bcb610768565b611dcf565b600080610bdb610ae7565b91509150610be7613c89565b6040518060600160405280610bfa610ab6565b81526020018481526020018381525090506000610c86610c4d867f000000000000000000000000000000000000000000000000000000000000000081518110610c3f57fe5b602002602001015184611e38565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7957fe5b6020026020010151611e99565b9050610caf610ca886600081518110610c9b57fe5b6020026020010151611ea5565b8290611eb9565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce861061a610fce565b610cf3610640610946565b6000610cfe85611f10565b15610d2657610d0b611f3f565b610d1d88610d17610739565b87611f52565b94509050610d3e565b610d2e611639565b610d398a8987611c51565b945090505b610d488a82612048565b835167ffffffffffffffff81118015610d6057600080fd5b50604051908082528060200260200182016040528015610d8a578160200160208202803683370190505b509250505097509795505050505050565b600061070f82610ff2565b6000610db0610946565b90506060610dbc610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de791906145dd565b60006040518083038186803b158015610dff57600080fd5b505afa158015610e13573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3b9190810190614047565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e7f57fe5b602002602001018181525050610e93613caa565b6040518060800160405280610ea785612052565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed8610fce565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f099493929190614605565b600060405180830381600087803b158015610f2357600080fd5b505af1158015610f37573d6000803e3d6000fd5b5050505050505050565b600090565b610f4e611971565b6109b76001611b5b565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8d929190614461565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108061061a610fce565b61108b610640610946565b611093611639565b61109e858585612055565b95945050505050565b6110af611971565b6110b76119ba565b6000806110c2610ae7565b915091506110d361093083836119ca565b6110e86110e085856119ca565b61015761162b565b6111137f00000000000000000000000000000000000000000000000000000000000000008585612062565b50505050565b6000806111263385611305565b90508083106111405761113b33856000611771565b61114d565b61114d3385858403611771565b5060019392505050565b600061070b338484611891565b60006108ff612138565b6008546000906108ff9060ff6121b2565b611187611971565b61118f611f3f565b6111996000611c00565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4b91906145ba565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121c8c610ff2565b89604051602001611232969594939291906146f2565b604051602081830303815290604052805190602001209050611263888261125a8787876121b9565b886101f86121f8565b610f37888888611771565b6060808861127d61061a610fce565b611288610640610946565b6000611292611639565b61129a610739565b6112ec576112a98a8a8761224f565b945090506112c26112b8610f41565b82101560cc61162b565b6112d460006112cf610f41565b6122e7565b6112e7896112e0610f41565b83036122e7565b610d48565b6112f78a8987611c51565b94509050610d4889826122e7565b600061130f610fce565b6001600160a01b0316826001600160a01b03161415611331575060001961070f565b61133b83836122f1565b905061070f565b600080600061134f610fce565b6001600160a01b031663b05f8e48611365610946565b306040518363ffffffff1660e01b81526004016113839291906147d8565b60806040518083038186803b15801561139b57600080fd5b505afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190614340565b5050915091506113e4818301611ea5565b9250505090565b60006108ff61231c565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff61183e565b600061142e836115d8565b6060835160010167ffffffffffffffff8111801561144b57600080fd5b50604051908082528060200260200182016040528015611475578160200160208202803683370190505b509050308160008151811061148657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f5578481815181106114be57fe5b60200260200101518282600101815181106114d557fe5b6001600160a01b03909216602092830291909101909101526001016114a9565b506060835160010167ffffffffffffffff8111801561151357600080fd5b5060405190808252806020026020018201604052801561153d578160200160208202803683370190505b50905060008160008151811061154f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115be5784818151811061158757fe5b602002602001015182826001018151811061159e57fe5b6001600160a01b0390921660209283029190910190910152600101611572565b506115cb878784846123b9565b925050505b949350505050565b806115e2816124c2565b5050565b60006115f683831115600161162b565b50900390565b600061160984848461253b565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e2576115e281612581565b6109b76116446117d9565b61019261162b565b60006116686003841080156116615750600383105b606461162b565b6060611672610768565b905061167e8582611dcf565b600080611689610ae7565b91509150611695613c89565b60405180606001604052806116a8610ab6565b81526020810185905260400183905290506000895160018111156116c857fe5b141561172c576116ef89606001518589815181106116e257fe5b60200260200101516125ab565b60608a015260006117018a8a846125b7565b90506117208186898151811061171357fe5b602002602001015161267e565b955050505050506115d0565b61174089606001518588815181106116e257fe5b60608a015260006117528a8a8461268a565b905061172081868a8151811061176457fe5b602002602001015161273f565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cc9085906145dd565b60405180910390a3505050565b60006117e361181a565b4211806108ff57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff61184b6113f5565b670de0b6b3a764000061274b565b600082820261187d84158061187657508385838161187357fe5b04145b600361162b565b670de0b6b3a7640000815b04949350505050565b6118a86001600160a01b038416151561019861162b565b6118bf6001600160a01b038316151561019961162b565b6118ca838383610941565b6001600160a01b0383166000908152602081905260409020546118f090826101a0612791565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461191f9082611b49565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cc9085906145dd565b60006119a06000357fffffffff0000000000000000000000000000000000000000000000000000000016610f58565b90506119b76119af82336127a7565b61019161162b565b50565b6109b76119c5610fce565b612890565b60008060006119d7610fce565b6001600160a01b031663b05f8e486119ed610946565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611a2b9291906147d8565b60806040518083038186803b158015611a4357600080fd5b505afa158015611a57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7b9190614340565b5050915091506000611ab7828401611ab27f0000000000000000000000000000000000000000000000000000000000000000612942565b6125ab565b905085811015801561065e57509390931115949350505050565b611ae464e8d4a5100082101560cb61162b565b611afa67016345785d8a000082111560ca61162b565b600854611b0b908260c0603f6115fc565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611b3e9083906145dd565b60405180910390a150565b60008282016108e5848210158361162b565b8015611b7b57611b76611b6c6117f6565b421061019361162b565b611b90565b611b90611b8661181a565b42106101a961162b565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611b3e9083906145ba565b6109b7611bf761116e565b156101b561162b565b600854611c0f908260ff612a1c565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611b3e9083906145ba565b6001901b6000190191901c1690565b60006060611c606103e6612581565b935093915050565b333014611d57576000306001600160a01b0316600036604051611c8c929190614491565b6000604051808303816000865af19150503d8060008114611cc9576040519150601f19603f3d011682016040523d82523d6000602084013e611cce565b606091505b505090508060008114611cdd57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611d39573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611d6a8686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611dde908290612a2b565b60005b8181101561111357611e19848281518110611df857fe5b6020026020010151848381518110611e0c57fe5b6020026020010151611859565b848281518110611e2557fe5b6020908102919091010152600101611de1565b60008160200151831015611e715781516020830151600091611e5d9186900390611859565b9050611e6984826115e6565b91505061070f565b81604001518311611e8357508161070f565b81516040830151600091611e5d91860390611859565b60006108e58383611b49565b600061070f82611eb3610739565b906115e6565b6000611ec8821515600461162b565b670de0b6b3a76400008302611efa841580611ef35750670de0b6b3a7640000858381611ef057fe5b04145b600561162b565b6001836001830304018115150291505092915050565b600080825111801561070f575060ff801682806020019051810190611f359190614380565b60ff161492915050565b6109b7611f4a61116e565b6101b661162b565b600060606000611f6184612a38565b90506060865167ffffffffffffffff81118015611f7d57600080fd5b50604051908082528060200260200182016040528015611fa7578160200160208202803683370190505b5090506000611fb4610f41565b90506000611fc7898381518110610c9b57fe5b90506000611fd58583612a4e565b905060005b8a518110156120375783811415611ff2576000612018565b612018828c838151811061200257fe5b602002602001015161185990919063ffffffff16565b85828151811061202457fe5b6020908102919091010152600101611fda565b509399929850919650505050505050565b6115e28282612a8e565b90565b60006108e56103e6612581565b6120718183111561014c61162b565b61208c6b0de0b6b39983494c589c000082111561014d61162b565b6120a4670de0b6b3a7640000825b061561016161162b565b6120b6670de0b6b3a76400008361209a565b6120eb670de0b6b3a76400008204604060206120e3670de0b6b3a7640000876008549190046020806115fc565b9291906115fc565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d12809061212b908590859061484d565b60405180910390a2505050565b6000612142610fce565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561217a57600080fd5b505afa15801561218e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ff919061422e565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b600061220385612b5a565b9050612219612213878387612b76565b8361162b565b612228428410156101b861162b565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b6000606061226a6001600160a01b038616301461015661162b565b6122816001600160a01b038516301461015661162b565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff816000815181106122d057fe5b602090810291909101015290969095509350505050565b6115e28282612c25565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612389612cb8565b3060405160200161239e9594939291906147ac565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016123e8919061480d565b602060405180830381600087803b15801561240257600080fd5b505af1158015612416573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243a9190614133565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d29061248690849088908890600401614726565b600060405180830381600087803b1580156124a057600080fd5b505af11580156124b4573d6000803e3d6000fd5b509298975050505050505050565b6002815110156124d1576119b7565b6000816000815181106124e057fe5b602002602001015190506000600190505b825181101561094157600083828151811061250857fe5b60200260200101519050612531816001600160a01b0316846001600160a01b031610606561162b565b91506001016124f1565b61254a6101008310606461162b565b61257260018210158015611661575061256860ff846101000361161f565b821115606461162b565b61094183821c156101b461162b565b6119b7817f42414c0000000000000000000000000000000000000000000000000000000000612cbc565b60006108e58383611859565b60208301516000906001600160a01b03163014156125e1576125da848484612d37565b90506108e5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b0316141561262a576125da848484612e8f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612673576125da848484612fcc565b6108e5610135612581565b60006108e58383612a4e565b60408301516000906001600160a01b03163014156126ad576125da848484613104565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156126f6576125da848484613254565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b03161415612673576125da84848461338c565b60006108e58383611eb9565b600080612757846134c4565b905080612767578291505061070f565b600061277285613572565b90506127888261278286846135e6565b90613600565b9250505061070f565b60006127a0848411158361162b565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6127c6610faa565b6001600160a01b0316141580156127e157506127e183613620565b15612809576127ee610faa565b6001600160a01b0316336001600160a01b031614905061070f565b612811612138565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b8152600401612840939291906145e6565b60206040518083038186803b15801561285857600080fd5b505afa15801561286c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b9190614113565b604080516000808252602082019092526060916128c3565b6128b0613cd4565b8152602001906001900390816128a85790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e849061290c9084906004016144eb565b600060405180830381600087803b15801561292657600080fd5b505af115801561293a573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156129a557507f0000000000000000000000000000000000000000000000000000000000000000610cd4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156129f1576129ea6107f161183e565b9050610cd4565b6001600160a01b038216301415612a115750670de0b6b3a7640000610cd4565b610cd4610135612581565b6001811b1992909216911b1790565b6115e2818314606761162b565b6000818060200190518101906108e5919061439c565b6000612a5d821515600461162b565b670de0b6b3a76400008302612a85841580611ef35750670de0b6b3a7640000858381611ef057fe5b82818161188857fe5b612aa56001600160a01b038316151561019b61162b565b612ab182600083610941565b6001600160a01b038216600090815260208190526040902054612ad790826101b2612791565b6001600160a01b038316600090815260208190526040902055612b0a612b0582612aff610739565b90613684565b613692565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612b4e91906145dd565b60405180910390a35050565b6000612b6461231c565b82604051602001610f8d9291906144a1565b6000612b8882516041146101b961162b565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612bc19089908590889088906147ef565b6020604051602081039080840390855afa158015612be3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612c195750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612c3160008383610941565b612c46612b0582612c40610739565b90611b49565b6001600160a01b038216600090815260208190526040902054612c699082611b49565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612b4e9085906145dd565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612dbd7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612db557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162b565b6115d08460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612df157fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612e2557fe5b6020026020010151612e3d87600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612e8357613697612e87565b6136f55b63ffffffff16565b6000612eeb7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612db5575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b03163014612f4657612f418460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f3357fe5b60200260200101518461375e565b6115d0565b6115d08460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f7a57fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612fae57fe5b6020026020010151612fc687600081518110610c9b57fe5b8661378e565b60006130287f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612db5575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b0316301461307e57612f418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061307057fe5b6020026020010151846137f4565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106130b257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130e657fe5b60200260200101516130fe87600081518110610c9b57fe5b86613829565b60006131897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612db557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162b565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131bd57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106131f157fe5b602002602001015161320987600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461324f57613890612e87565b6138e7565b60006132b07f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612db5575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b0316301461330657612f418460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132f857fe5b602002602001015184613951565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061333a57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061336e57fe5b602002602001015161338687600081518110610c9b57fe5b8661397b565b60006133e87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612db5575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b0316301461343e57612f418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061343057fe5b6020026020010151846139ca565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061347257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106134a657fe5b60200260200101516134be87600081518110610c9b57fe5b866139ff565b6000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b505afa92505050801561352f575060408051601f3d908101601f1916820190925261352c91810190614133565b60015b6129ea573d80801561355d576040519150601f19603f3d011682016040523d82523d6000602084013e613562565b606091505b5061356c81613a53565b50610cd4565b60008061357e83613ada565b9050600061358b84613b15565b905060006135a261359b86613b50565b42906115e6565b905060006135b96135b287613b8b565b83906135e6565b905060006135cf846135ca84613bc6565b611859565b90506135db85826115e6565b979650505050505050565b60008282026108e584158061187657508385838161187357fe5b600061360f821515600461162b565b81838161361857fe5b049392505050565b600061364b7f9f11080e00000000000000000000000000000000000000000000000000000000610f58565b82148061070f575061367c7f38e9922e00000000000000000000000000000000000000000000000000000000610f58565b909114919050565b60006108e583836001612791565b600255565b6000806136a48684611e38565b905060006136b28287611e99565b905060006136c0868a6115e6565b905060006136db84611eb36136d585876135e6565b8a613bd8565b90506136e788826115e6565b9a9950505050505050505050565b6000806137028684611e38565b905060006137108287611e99565b90506000613727613721838b6135e6565b87613600565b9050600061373584836115e6565b905060006137438288613bf9565b905061374f8a826115e6565b9b9a5050505050505050505050565b60008061376b8484611e38565b9050600061378261377c8688611b49565b85611e38565b905061065e81836115e6565b6000826137a65761379f8683611e38565b905061109e565b60006137b28684611e38565b905060006137c361377c888a611b49565b905060006137d182846115e6565b905060006137df8489611e99565b90506136e76137ee88846135e6565b82613600565b6000806138018484611e38565b9050600061380f82876115e6565b9050600061381d8286613bf9565b90506135db86826115e6565b60008261383757508461109e565b60006138438684611e38565b905060006138518287611e99565b9050600061385f878a611b49565b9050600061386d8483611e99565b9050600061388461387e89846135e6565b85613600565b905061374f81896115e6565b60008261389e57508461109e565b60006138aa8684611e38565b905060006138b88287611e99565b905060006138c6868a611b49565b905060006138db84611eb36136d585876135e6565b90506136e781896115e6565b6000826138f85761379f8683613bf9565b60006139048684611e38565b905060006139128287611e99565b90506000613929613923838b6135e6565b87613bd8565b905060006139378483611b49565b905060006139458288613bf9565b905061374f818b6115e6565b60008061395e8484611e38565b9050600061396f61377c86886115e6565b905061065e82826115e6565b6000806139888684611e38565b9050600061399961377c888a6115e6565b905060006139a783836115e6565b905060006139b58489611e99565b90506136e76139c488846135e6565b82613bd8565b6000806139d78484611e38565b905060006139e58287611b49565b905060006139f38286613bf9565b90506135db81876115e6565b600080613a0c8684611e38565b90506000613a1a8287611e99565b90506000613a28878a6115e6565b90506000613a368483611e99565b90506000613a4761387e89846135e6565b905061374f88826115e6565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417613ace578160208401fd5b506115e2610165612581565b6000816001600160a01b03166301e1d1146040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b6000816001600160a01b03166344b813966040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b6000816001600160a01b031663c3535b526040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b6000816001600160a01b031663422327166040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b670de0b6b3a764000081810391100290565b6000613be7821515600461162b565b50811515600019909201046001010290565b60008160200151831015613c4257815161133b90613c2090670de0b6b3a764000090611b49565b60208401518451613c3c91613c359190611859565b8690611b49565b90612a4e565b81604001518311613c5457508161070f565b815161133b90613c6d90670de0b6b3a7640000906115e6565b60408401518451613c3c91613c829190611859565b86906115e6565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561070f816148bc565b600082601f830112613d1f578081fd5b8135613d32613d2d82614890565b614869565b818152915060208083019084810181840286018201871015613d5357600080fd5b60005b84811015613d7257813584529282019290820190600101613d56565b505050505092915050565b600082601f830112613d8d578081fd5b8151613d9b613d2d82614890565b818152915060208083019084810181840286018201871015613dbc57600080fd5b60005b84811015613d7257815184529282019290820190600101613dbf565b600082601f830112613deb578081fd5b813567ffffffffffffffff811115613e01578182fd5b613e146020601f19601f84011601614869565b9150808252836020828501011115613e2b57600080fd5b8060208401602084013760009082016020015292915050565b80356002811061070f57600080fd5b6000610120808385031215613e66578182fd5b613e6f81614869565b915050613e7c8383613e44565b8152613e8b8360208401613d04565b6020820152613e9d8360408401613d04565b6040820152606082013560608201526080820135608082015260a082013560a0820152613ecd8360c08401613d04565b60c0820152613edf8360e08401613d04565b60e08201526101008083013567ffffffffffffffff811115613f0057600080fd5b613f0c85828601613ddb565b82840152505092915050565b600060208284031215613f29578081fd5b81356108e5816148bc565b60008060408385031215613f46578081fd5b8235613f51816148bc565b91506020830135613f61816148bc565b809150509250929050565b600080600060608486031215613f80578081fd5b8335613f8b816148bc565b92506020840135613f9b816148bc565b929592945050506040919091013590565b600080600080600080600060e0888a031215613fc6578283fd5b8735613fd1816148bc565b96506020880135613fe1816148bc565b955060408801359450606088013593506080880135613fff816148d1565b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561402e578182fd5b8235614039816148bc565b946020939093013593505050565b60008060006060848603121561405b578081fd5b835167ffffffffffffffff80821115614072578283fd5b818601915086601f830112614085578283fd5b8151614093613d2d82614890565b80828252602080830192508086018b8283870289010111156140b3578788fd5b8796505b848710156140de5780516140ca816148bc565b8452600196909601959281019281016140b7565b5089015190975093505050808211156140f5578283fd5b5061410286828701613d7d565b925050604084015190509250925092565b600060208284031215614124578081fd5b815180151581146108e5578182fd5b600060208284031215614144578081fd5b5051919050565b600080600080600080600060e0888a031215614165578081fd5b873596506020880135614177816148bc565b95506040880135614187816148bc565b9450606088013567ffffffffffffffff808211156141a3578283fd5b6141af8b838c01613d0f565b955060808a0135945060a08a0135935060c08a01359150808211156141d2578283fd5b506141df8a828b01613ddb565b91505092959891949750929550565b6000602082840312156141ff578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e5578182fd5b60006020828403121561423f578081fd5b81516108e5816148bc565b6000806000806080858703121561425f578182fd5b843567ffffffffffffffff80821115614276578384fd5b61428288838901613e53565b95506020870135915080821115614297578384fd5b506142a487828801613d0f565b949794965050505060408301359260600135919050565b6000806000606084860312156142cf578081fd5b833567ffffffffffffffff8111156142e5578182fd5b6142f186828701613e53565b9660208601359650604090950135949350505050565b600060208284031215614318578081fd5b5035919050565b60008060408385031215614331578182fd5b50508035926020909101359150565b60008060008060808587031215614355578182fd5b8451935060208501519250604085015191506060850151614375816148bc565b939692955090935050565b600060208284031215614391578081fd5b81516108e5816148d1565b600080604083850312156143ae578182fd5b82516143b9816148d1565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015614405578151875295820195908201906001016143e9565b509495945050505050565b15159052565b60008151808452815b8181101561443b5760208185018101518683018201520161441f565b8181111561444c5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b8281101561457557815180516004811061451e57fe5b855280870151614530888701826143c9565b50858101518686015260608082015161454b828801826143c9565b505060809081015190614560868201836143c9565b505060a0939093019290850190600101614508565b5091979650505050505050565b6000602082526108e560208301846143d6565b6000604082526145a860408301856143d6565b828103602084015261109e81856143d6565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156146765761466084516148b0565b825292840192600192909201919084019061464e565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a08701526146b481856143d6565b935050506040850151818584030160c08601526146d18382614416565b9250505060608401516146e760e0850182614410565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b8181101561476e5761475c85516148b0565b8352938301939183019160010161474a565b505084810360408601528551808252908201925081860190845b818110156124b45761479a83516148b0565b85529383019391830191600101614788565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016003831061481b57fe5b91905290565b6000602082526108e56020830184614416565b6000838252604060208301526115d060408301846143d6565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561488857600080fd5b604052919050565b600067ffffffffffffffff8211156148a6578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146119b757600080fd5b60ff811681146119b757600080fdfea26469706673582212208932908daa8d95d8c120416420b507b772c1b48199ad84f8004d3840baaf0c1264736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/artifact/YearnLinearPoolFactory.json b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/artifact/YearnLinearPoolFactory.json new file mode 100644 index 0000000..c3c2958 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/artifact/YearnLinearPoolFactory.json @@ -0,0 +1,334 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "YearnLinearPoolFactory", + "sourceName": "contracts/yearn-linear-pool/YearnLinearPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "contract IBalancerQueries", + "name": "queries", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "poolVersion", + "type": "string" + }, + { + "internalType": "uint256", + "name": "initialPauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "YearnLinearPoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract LinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastCreatedPool", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeePercentagesProvider", + "outputs": [ + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101e06040523480156200001257600080fd5b50604051620097a3380380620097a38339810160408190526200003591620003bc565b86868383604051806020016200004b906200026b565b601f1982820381018352601f9091011660405282828630848d6200006f816200017d565b5080516002810460a081905280820360e0819052818452836200009e8162000196602090811b620009f317901c565b60601b6001600160601b0319166080528285018051838252620000cd8262000196602090811b620009f317901c565b6001600160601b0319606091821b811660c0529690935290526101009590955250509290911b909116610120525062000110630163f500831115610194620001ea565b620001246276a700821115610195620001ea565b610140829052610160524201610180525050506001600160601b0319606091821b81166101a05260016003559087901b166101c0525082516200016f90600690602086019062000279565b50505050505050506200048d565b80516200019290600090602084019062000279565b5050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001e46001600160a01b03831615156101ac620001ea565b50919050565b816200019257620001928162000207816210905360ea1b6200020a565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b615a968062003d0d83390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002bc57805160ff1916838001178555620002ec565b82800160010185558215620002ec579182015b82811115620002ec578251825591602001919060010190620002cf565b50620002fa929150620002fe565b5090565b5b80821115620002fa5760008155600101620002ff565b600082601f83011262000326578081fd5b81516001600160401b03808211156200033d578283fd5b6040516020601f8401601f19168201810183811183821017156200035f578586fd5b806040525081945083825286818588010111156200037c57600080fd5b600092505b83831015620003a0578583018101518284018201529182019162000381565b83831115620003b25760008185840101525b5050505092915050565b600080600080600080600060e0888a031215620003d7578283fd5b8751620003e48162000477565b6020890151909750620003f78162000477565b60408901519096506200040a8162000477565b60608901519095506001600160401b038082111562000427578485fd5b620004358b838c0162000315565b955060808a01519150808211156200044b578485fd5b506200045a8a828b0162000315565b93505060a0880151915060c0880151905092959891949750929550565b6001600160a01b03811681146200020757600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405161016051610180516101a05160601c6101c05160601c6137eb620005226000398061057052508061050452508061028b52806102b55250806102d9525050806109445250806108f2525080610a5c5250806102625280610ad8525080610a7d5250806102415280610ab452506137eb6000f3fe60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c80636634b753116200009957806376895be7116200006f57806376895be714620001cd578063851c1bb314620001e45780638d928af8146200020a578063aaabadc5146200021457620000ff565b80636634b75314620001935780636c57f5a914620001b9578063739238d614620001c357620000ff565b80632f2770db11620000db5780632f2770db146200015a5780633f819b6f146200016657806354fd4d5014620001705780635ed31282146200017a57620000ff565b8062c194db1462000104578063174481fa14620001265780632da47c401462000140575b600080fd5b6200010e6200021e565b6040516200011d919062001459565b60405180910390f35b620001306200023f565b6040516200011d929190620013f2565b6200014a62000285565b6040516200011d92919062001652565b620001646200030e565b005b6200010e62000378565b6200010e62000430565b62000184620004b2565b6040516200011d9190620013d1565b620001aa620001a43660046200114d565b620004ce565b6040516200011d919062001419565b620001aa620004f9565b6200018462000502565b62000184620001de366004620011f6565b62000526565b620001fb620001f536600462001195565b620008ee565b6040516200011d919062001424565b6200018462000942565b6200018462000966565b60606200023a6040518060200160405280600081525062000a54565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200030057807f00000000000000000000000000000000000000000000000000000000000000000392507f0000000000000000000000000000000000000000000000000000000000000000915062000309565b60009250600091505b509091565b6200031862000b2f565b6200032262000b7e565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b820191906000526020600020905b8154815290600101906020018083116200040857829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006200053262000b97565b6004805460018101909155604051606090620005516020820162000fe1565b601f1982820381018352601f909101166040526200056e62000942565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001620005a2929190620013f2565b60408051601f1981840301815290829052620005c292916020016200139e565b60405160208183030381529060405290506000620005e883838051906020012062000bb2565b9050600080620005f762000285565b915091506200060562000fef565b6200060f62000942565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508f81602001819052508e81604001819052508d816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508c816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b8160c00181815250508a8160e0018181525050828161010001818152505081816101200181815250508981610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506200076d62000378565b610160820152604051600090620007a4906200078e9084906020016200154a565b6040516020818303038152906040528a62000bca565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620007ef57600080fd5b505af115801562000804573d6000803e3d6000fd5b505050506000620008186000898962000c21565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146200088b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088290620014dc565b60405180910390fd5b6040518b9073ffffffffffffffffffffffffffffffffffffffff8416907fda2f557d6e80d2dcf3894f2bb74fe9840e4d558e350f6aad63af0e0b12f1a58690600090a3509650505050505050620008e162000cff565b9998505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001620009259291906200136e565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006200097262000942565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620009b857600080fd5b505afa158015620009cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023a9190620011d7565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000a4e73ffffffffffffffffffffffffffffffffffffffff831615156101ac62000d06565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000b2181838662000d1b565b505050505050505050919050565b600062000b606000357fffffffff0000000000000000000000000000000000000000000000000000000016620008ee565b905062000b7b62000b72823362000d79565b61019162000d06565b50565b62000b9562000b8c620004f9565b1560d362000d06565b565b62000bab6002600354141561019062000d06565b6002600355565b600062000bc183833062000e17565b90505b92915050565b60008062000bd9848462000e58565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316179055949350505050565b6000808447101562000c61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000882906200146e565b825162000c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008829062001513565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088290620014a5565b949350505050565b6001600355565b8162000d175762000d178162000ef5565b5050565b5b6020811062000d3d578151835260209283019290910190601f190162000d1c565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000d8562000966565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000dc3939291906200142d565b60206040518083038186803b15801562000ddc57600080fd5b505afa15801562000df1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bc1919062001173565b60008060ff60f81b83868660405160200162000e3794939291906200130a565b60408051808303601f19018152919052805160209091012095945050505050565b600062000e6462000b7e565b600062000e72848462000f21565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a29392505050565b62000b7b817f42414c000000000000000000000000000000000000000000000000000000000062000f66565b6000606062000f308462000a54565b90506000838251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf7573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6120ff80620016b783390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b803562000bc48162001693565b600082601f830112620010dc578081fd5b813567ffffffffffffffff80821115620010f4578283fd5b6040516020601f19601f850116820101818110838211171562001115578485fd5b6040528281529250828483016020018610156200113157600080fd5b8260208601602083013760006020848301015250505092915050565b6000602082840312156200115f578081fd5b81356200116c8162001693565b9392505050565b60006020828403121562001185578081fd5b815180151581146200116c578182fd5b600060208284031215620011a7578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146200116c578182fd5b600060208284031215620011e9578081fd5b81516200116c8162001693565b60008060008060008060008060006101208a8c03121562001215578485fd5b893567ffffffffffffffff808211156200122d578687fd5b6200123b8d838e01620010cb565b9a5060208c013591508082111562001251578687fd5b50620012608c828d01620010cb565b98505060408a0135620012738162001693565b965060608a0135620012858162001693565b955060808a0135945060a08a01359350620012a48b60c08c01620010be565b925060e08a013591506101008a013590509295985092959850929598565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620012f681602086016020860162001660565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60008351620013b281846020880162001660565b835190830190620013c881836020880162001660565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000bc16020830184620012dc565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b60006020825262001560602083018451620012c2565b60208301516101808060408501526200157e6101a0850183620012dc565b91506040850151601f19808685030160608701526200159e8483620012dc565b935060608701519150620015b66080870183620012c2565b60808701519150620015cc60a0870183620012c2565b60a08701519150620015e260c0870183620012c2565b60c087015160e08781019190915287015161010080880191909152870151610120808801919091528701516101408088019190915287015191506101606200162d81880184620012c2565b870151868503909101838701529050620016488382620012dc565b9695505050505050565b918252602082015260400190565b60005b838110156200167d57818101518382015260200162001663565b838111156200168d576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000b7b57600080fdfe6101606040523480156200001257600080fd5b50604051620020ff380380620020ff833981016040819052620000359162000462565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000378565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200012591908101906200039e565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000449565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000449565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000378565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000378565b6001600160601b0319606091821b811660e05292811b8316610120521b166101405250620004e0915050565b6000602082840312156200038a578081fd5b81516200039781620004c7565b9392505050565b60006020808385031215620003b1578182fd5b82516001600160401b0380821115620003c8578384fd5b818501915085601f830112620003dc578384fd5b815181811115620003eb578485fd5b8381029150620003fd848301620004a0565b8181528481019084860184860187018a101562000418578788fd5b8795505b838610156200043c5780518352600195909501949186019186016200041c565b5098975050505050505050565b6000602082840312156200045b578081fd5b5051919050565b6000806040838503121562000475578081fd5b82516200048281620004c7565b60208401519092506200049581620004c7565b809150509250929050565b6040518181016001600160401b0381118282101715620004bf57600080fd5b604052919050565b6001600160a01b0381168114620004dd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c611b3c620005c36000398061050b52806108235250806101355280610c165280610f305280610f925250806103c152508061046e528061059b528061074a52806108ee5280610cc05280610ff2528061105c52806110be52508060ea5280610192528061043252806105ce528061063352806106d4528061078652806108b3528061103a5250806101715280610404528061071c5280610a7f5280610b5e5280610db85280610e975250806099528061030b5250611b3c6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b919061186b565b60405180910390f35b610077610072366004611729565b6100bb565b60405161005b9190611aa5565b610077610092366004611745565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610124565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308561025b565b61011b83610124565b90505b92915050565b60008061012f610304565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101ce9291906119b7565b60806040518083038186803b1580156101e657600080fd5b505afa1580156101fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021e91906117cb565b50505090508181101561024057610237818303856103ed565b925050506100c9565b818111156102545761023782820385610705565b5050919050565b6102fe846323b872dd60e01b85858560405160240161027c939291906118b3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610913565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a691906117a8565b9150915060006002828401816103b857fe5b0490506103e5817f00000000000000000000000000000000000000000000000000000000000000006109c0565b935050505090565b60006103f7611676565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104cb6116d9565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061054290869086906004016119db565b602060405180830381600087803b15801561055c57600080fd5b505af1158015610570573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105949190611790565b90506105c07f000000000000000000000000000000000000000000000000000000000000000082610a13565b6105c981610c84565b6105f37f000000000000000000000000000000000000000000000000000000000000000087610d4c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a082319061066890309060040161186b565b60206040518083038186803b15801561068057600080fd5b505afa158015610694573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b89190611790565b90506106fb73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fc7565b9695505050505050565b600061070f611676565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e36116d9565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061085a90869086906004016119db565b602060405180830381600087803b15801561087457600080fd5b505af1158015610888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ac9190611790565b90506108d87f000000000000000000000000000000000000000000000000000000000000000087610a13565b6108e96108e482610feb565b611020565b6105f37f000000000000000000000000000000000000000000000000000000000000000082610d4c565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093c919061184f565b6000604051808303816000865af19150503d8060008114610979576040519150601f19603f3d011682016040523d82523d6000602084013e61097e565b606091505b50915091506000821415610996573d6000803e3d6000fd5b6102fe8151600014806109b85750818060200190518101906109b89190611770565b6101a26110f5565b60006109cf82151560046110f5565b670de0b6b3a76400008302610a018415806109fa5750670de0b6b3a76400008583816109f757fe5b04145b60056110f5565b828181610a0a57fe5b04949350505050565b6040805160028082526060828101909352816020015b610a31611700565b815260200190600190039081610a29579050509050600081600081518110610a5557fe5b6020026020010151600001906002811115610a6c57fe5b90816002811115610a7957fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aab57fe5b602002602001015160200181815250508181600081518110610ac957fe5b602002602001015160600181815250508281600081518110610ae757fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3457fe5b6020026020010151600001906002811115610b4b57fe5b90816002811115610b5857fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8a57fe5b60200260200101516020018181525050600081600181518110610ba957fe5b602002602001015160600181815250508281600181518110610bc757fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4d908490600401611933565b600060405180830381600087803b158015610c6757600080fd5b505af1158015610c7b573d6000803e3d6000fd5b50505050505050565b6040517ef714ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169062f714ce90610cf690849030906004016119b7565b602060405180830381600087803b158015610d1057600080fd5b505af1158015610d24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d489190611790565b5050565b6040805160028082526060828101909352816020015b610d6a611700565b815260200190600190039081610d62579050509050600281600081518110610d8e57fe5b6020026020010151600001906002811115610da557fe5b90816002811115610db257fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de457fe5b602002602001015160200181815250508181600081518110610e0257fe5b602002602001015160600181815250508281600081518110610e2057fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e6d57fe5b6020026020010151600001906002811115610e8457fe5b90816002811115610e9157fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec357fe5b602002602001015160200181815250508181600181518110610ee157fe5b602002602001015160600181815250508281600181518110610eff57fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f559084167f000000000000000000000000000000000000000000000000000000000000000084611103565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4d908490600401611933565b610fe68363a9059cbb60e01b848460405160240161027c92919061190d565b505050565b60006110177f0000000000000000000000000000000000000000000000000000000000000000836111f8565b60010192915050565b61108173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611103565b6040517f6e553f6500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636e553f6590610cf690849030906004016119b7565b81610d4857610d488161123e565b80158015906111b457506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e90611161903090869060040161188c565b60206040518083038186803b15801561117957600080fd5b505afa15801561118d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b19190611790565b15155b156111d9576111d98363095ea7b360e01b84600060405160240161027c9291906118e4565b610fe68363095ea7b360e01b848460405160240161027c92919061190d565b6000806112048461126b565b905080611214578291505061011e565b600061121f8561134b565b90506112358261122f86846113bf565b906113e3565b9250505061011e565b611268817f42414c0000000000000000000000000000000000000000000000000000000000611403565b50565b60008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b505afa925050508015611301575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526112fe91810190611790565b60015b611344573d80801561132f576040519150601f19603f3d011682016040523d82523d6000602084013e611334565b606091505b5061133e8161147e565b506100c9565b90506100c9565b60008061135783611505565b905060006113648461154d565b9050600061137b61137486611595565b42906115dd565b9050600061139261138b876115f3565b83906113bf565b905060006113a8846113a38461163b565b61164d565b90506113b485826115dd565b979650505050505050565b600082820261011b8415806113dc5750838583816113d957fe5b04145b60036110f5565b60006113f282151560046110f5565b8183816113fb57fe5b049392505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc12000000000000000000000000000000000000000000000000000000008214176114f9578160208401fd5b50610d4861016561123e565b60008173ffffffffffffffffffffffffffffffffffffffff166301e1d1146040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff166344b813966040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663c3535b526040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60006115ed8383111560016110f5565b50900390565b60008173ffffffffffffffffffffffffffffffffffffffff1663422327166040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b670de0b6b3a764000081810391100290565b60008282026116678415806113dc5750838583816113d957fe5b670de0b6b3a764000081610a0a565b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b60006020828403121561173a578081fd5b813561011b81611ae4565b60008060408385031215611757578081fd5b823561176281611ae4565b946020939093013593505050565b600060208284031215611781578081fd5b8151801515811461011b578182fd5b6000602082840312156117a1578081fd5b5051919050565b600080604083850312156117ba578182fd5b505080516020909101519092909150565b600080600080608085870312156117e0578182fd5b845193506020850151925060408501519150606085015161180081611ae4565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b60008251611861818460208701611aae565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b828110156119aa57815180516003811061196657fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff16868601526060908101519085015260809093019290850190600101611950565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a083015260208401516119f681611ada565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c0610140840152805180610160850152610180611a628282870160208601611aae565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401168601019350505050611a9e602083018461180b565b9392505050565b90815260200190565b60005b83811015611ac9578181015183820152602001611ab1565b838111156102fe5750506000910152565b6002811061126857fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461126857600080fdfea26469706673582212208beb7817193b118865b9e09fbe3db18b401c8700b7d556fbd4b00fcb8b5d27ea64736f6c63430007010033a26469706673582212203fe5794f993e428d5952c1b84f806971d87166fc91807a42cd8170638efd3d7264736f6c634300070100336102a06040523480156200001257600080fd5b5060405162005a9638038062005a96833981016040819052620000359162000d76565b6101608101518151602083015160408401516060850151608086015160c08701516200006188620003ec565b60e08901516101008a01516101208b01516101408c01518a6200009e8160006200008c8c8c62000475565b896200052660201b620014231760201c565b8b8b86868686838387878b86336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000ed92919062000bff565b5080516200010390600490602084019062000bff565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001829050630163f500831115610194620006f4565b620001966276a700821115610195620006f4565b4291909101610140819052016101605260601b6001600160601b031916610180526101a08690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000d37565b6001600160a01b03166101c0816001600160a01b031660601b8152505050505050505050876001600160a01b03166101e0816001600160a01b031660601b81525050866001600160a01b0316610200816001600160a01b031660601b81525050866001600160a01b0316886001600160a01b031610620002bb576002620002be565b60015b60ff16610220526001600160a01b0380881690891610620002e1576001620002e4565b60025b60ff1661024052620002f68862000709565b61026052620003058762000709565b61028052600062000318898289620007b5565b6200032385620008af565b50505050505050505050505062000340816200093e60201b60201c565b50620003e581608001516001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038357600080fd5b505afa15801562000398573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003be919062000d37565b6001600160a01b031682606001516001600160a01b031614610208620006f460201b60201c565b5062000ff3565b6040805160028082526060808301845292839291906020830190803683370190505090508260a00151816000815181106200042357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260a00151816001815181106200045657fe5b6001600160a01b03909216602092830291909101909101529050919050565b60408051600280825260608281019093526001600160a01b038481169086161091839181602001602082028036833701905050905081620004b75783620004b9565b845b81600081518110620004c757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081620004f45784620004f6565b835b816001815181106200050457fe5b6001600160a01b03909216602092830291909101909101529150505b92915050565b60006200053e836200095360201b620015d81760201c565b606083516001016001600160401b03811180156200055b57600080fd5b5060405190808252806020026020018201604052801562000586578160200160208202803683370190505b50905030816000815181106200059857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156200060b57848181518110620005d257fe5b6020026020010151828260010181518110620005ea57fe5b6001600160a01b0390921660209283029190910190910152600101620005bb565b50606083516001016001600160401b03811180156200062957600080fd5b5060405190808252806020026020018201604052801562000654578160200160208202803683370190505b5090506000816000815181106200066757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b8451811015620006da57848181518110620006a157fe5b6020026020010151828260010181518110620006b957fe5b6001600160a01b03909216602092830291909101909101526001016200068a565b50620006e9878784846200095f565b979650505050505050565b816200070557620007058162000a59565b5050565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200074657600080fd5b505afa1580156200075b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000781919062000ecd565b60ff1690506000620007a060128362000a6e60201b620015e61760201c565b600a0a670de0b6b3a764000002949350505050565b620007c68183111561014c620006f4565b620007e36b0de0b6b39983494c589c000082111561014d620006f4565b620007fd670de0b6b3a7640000825b0615610161620006f4565b62000811670de0b6b3a764000083620007f2565b62000860670de0b6b3a76400008204604060206200084a670de0b6b3a764000087600854919004602080620015fc62000a86821b17811c565b62000a8660201b620015fc17909392919060201c565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d128090620008a2908590859062000f9c565b60405180910390a2505050565b620008c464e8d4a5100082101560cb620006f4565b620008dc67016345785d8a000082111560ca620006f4565b620008fe8160c0603f60085462000a8660201b620015fc17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906200093390839062000f93565b60405180910390a150565b80516200070590600990602084019062000bff565b80620007058162000aab565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040162000990919062000f7e565b602060405180830381600087803b158015620009ab57600080fd5b505af1158015620009c0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009e6919062000d5d565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000a1b9084908890889060040162000ef0565b600060405180830381600087803b15801562000a3657600080fd5b505af115801562000a4b573d6000803e3d6000fd5b509298975050505050505050565b62000a6b816210905360ea1b62000b37565b50565b600062000a80838311156001620006f4565b50900390565b600062000a9584848462000b98565b506001901b60001901811b1992909216911b1790565b60028151101562000abc5762000a6b565b60008160008151811062000acc57fe5b602002602001015190506000600190505b825181101562000b3257600083828151811062000af657fe5b6020026020010151905062000b27816001600160a01b0316846001600160a01b0316106065620006f460201b60201c565b915060010162000add565b505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b62000ba961010083106064620006f4565b62000be26001821015801562000bda575062000bd660ff846101000362000bf360201b6200161f1760201c565b8211155b6064620006f4565b62000b3283821c156101b4620006f4565b80820390821102900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000c4257805160ff191683800117855562000c72565b8280016001018555821562000c72579182015b8281111562000c7257825182559160200191906001019062000c55565b5062000c8092915062000c84565b5090565b5b8082111562000c80576000815560010162000c85565b8051620005208162000fdd565b600082601f83011262000cb9578081fd5b81516001600160401b0381111562000ccf578182fd5b602062000ce5601f8301601f1916820162000faa565b9250818352848183860101111562000cfc57600080fd5b60005b8281101562000d1c57848101820151848201830152810162000cff565b8281111562000d2e5760008284860101525b50505092915050565b60006020828403121562000d49578081fd5b815162000d568162000fdd565b9392505050565b60006020828403121562000d6f578081fd5b5051919050565b60006020828403121562000d88578081fd5b81516001600160401b038082111562000d9f578283fd5b818401915061018080838703121562000db6578384fd5b62000dc18162000faa565b905062000dcf868462000c9b565b815260208301518281111562000de3578485fd5b62000df18782860162000ca8565b60208301525060408301518281111562000e09578485fd5b62000e178782860162000ca8565b60408301525062000e2c866060850162000c9b565b606082015262000e40866080850162000c9b565b608082015262000e548660a0850162000c9b565b60a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014062000e968782860162000c9b565b90820152610160838101518381111562000eae578586fd5b62000ebc8882870162000ca8565b918301919091525095945050505050565b60006020828403121562000edf578081fd5b815160ff8116811462000d56578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000f3c5762000f29855162000fd1565b8352938301939183019160010162000f14565b505084810360408601528551808252908201925081860190845b8181101562000a4b5762000f6b835162000fd1565b8552938301939183019160010162000f56565b602081016003831062000f8d57fe5b91905290565b90815260200190565b918252602082015260400190565b6040518181016001600160401b038111828210171562000fc957600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b038116811462000a6b57600080fd5b60805160a05160c05160e0516101005160601c6101205160601c61014051610160516101805160601c6101a0516101c05160601c6101e05160601c6102005160601c6102205161024051610260516102805161491662001180600039806107f352508061078f5280612981525080610717528061081b5280610c505280612dfc5280612f8552806130bd52806131c85280613345528061347d5250806107b152806109bb5280610c165280612dc85280612f0a5280612f5152806130475280613089528061319452806132cf5280613311528061340752806134495250806113f7528061262c52806126f852806129a75280612d7d5280612e96528061314a528061325b5250806109df52806110ed52806119ef5280611a8e52806125e352806126af52806129465280612d3e5280612e405280612fd3528061310b528061320c52806133935250806111cb5250806109485250508061181c5250806117f8525080610fd0525080610fac525080610f5c52508061232052508061236252508061234152506149166000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e36600461424a565b610608565b60405161035091906145dd565b60405180910390f35b610361610668565b6040516103509190614821565b61038161037c36600461401c565b6106fe565b60405161035091906145ba565b610343610715565b610343610739565b6103a661073f565b604051610350939291906145c5565b6103bd610768565b6040516103509190614582565b6103816103d8366004613f6c565b610876565b6103e56108ec565b604051610350919061485b565b6103436108f5565b61040d610408366004614307565b610904565b005b610343610946565b61038161042536600461401c565b61096a565b61040d6109a5565b6103436109b9565b6104426109dd565b60405161035091906144d7565b61040d610a01565b610361610a55565b610343610ab6565b61047a61047536600461414b565b610ac9565b604051610350929190614834565b610490610ae7565b60405161035092919061484d565b610343610b25565b6103436104b4366004613f18565b610cba565b6104cc6104c736600461414b565b610cd9565b604051610350929190614595565b6103436104e8366004613f18565b610d9b565b61040d610da6565b610343610f41565b61040d610f46565b6103436105133660046141ee565b610f58565b610442610faa565b610442610fce565b610343610536366004613f18565b610ff2565b61036161100d565b6103436105513660046142bb565b61106e565b61040d61056436600461431f565b6110a7565b61038161057736600461401c565b611119565b61038161058a36600461401c565b611157565b610442611164565b61038161116e565b61040d61117f565b6104426111c9565b61040d6105bd366004613fac565b6111ed565b6104cc6105d036600461414b565b61126e565b6103436105e3366004613f34565b611305565b610343611342565b6103436113eb565b6104426113f5565b610343611419565b6000846080015161063561061a610fce565b6001600160a01b0316336001600160a01b03161460cd61162b565b61064a610640610946565b82146101f461162b565b610652611639565b61065e8686868661164c565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050905090565b600061070b338484611771565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074c6117d9565b1592506107576117f6565b915061076161181a565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107da57fe5b6020026020010181815250506108186107f161183e565b7f000000000000000000000000000000000000000000000000000000000000000090611859565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084457fe5b602002602001018181525050670de0b6b3a76400008160008151811061086657fe5b6020908102919091010152905090565b6000806108838533611305565b90506108a7336001600160a01b038716148061089f5750838210155b61019e61162b565b6108b2858585611891565b336001600160a01b038616148015906108cd57506000198114155b156108df576108df8533858403611771565b60019150505b9392505050565b60055460ff1690565b60006108ff6113eb565b905090565b61090c611971565b6109146119ba565b60008061091f610ae7565b9150915061093861093083836119ca565b61014f61162b565b61094183611ad1565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070b9185906109a09086611b49565b611771565b6109ad611971565b6109b76000611b5b565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a09611971565b610a11611bec565b610a1b6001611c00565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4b91906145ba565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906108ff9060c0603f611c42565b60006060610adb888785611c51611c68565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0482602080611c42565b029250670de0b6b3a7640000610b1d8260406020611c42565b029150509091565b600080610b30610946565b90506060610b3c610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b6791906145dd565b60006040518083038186803b158015610b7f57600080fd5b505afa158015610b93573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbb9190810190614047565b50915050610bd081610bcb610768565b611dcf565b600080610bdb610ae7565b91509150610be7613c89565b6040518060600160405280610bfa610ab6565b81526020018481526020018381525090506000610c86610c4d867f000000000000000000000000000000000000000000000000000000000000000081518110610c3f57fe5b602002602001015184611e38565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7957fe5b6020026020010151611e99565b9050610caf610ca886600081518110610c9b57fe5b6020026020010151611ea5565b8290611eb9565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce861061a610fce565b610cf3610640610946565b6000610cfe85611f10565b15610d2657610d0b611f3f565b610d1d88610d17610739565b87611f52565b94509050610d3e565b610d2e611639565b610d398a8987611c51565b945090505b610d488a82612048565b835167ffffffffffffffff81118015610d6057600080fd5b50604051908082528060200260200182016040528015610d8a578160200160208202803683370190505b509250505097509795505050505050565b600061070f82610ff2565b6000610db0610946565b90506060610dbc610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de791906145dd565b60006040518083038186803b158015610dff57600080fd5b505afa158015610e13573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3b9190810190614047565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e7f57fe5b602002602001018181525050610e93613caa565b6040518060800160405280610ea785612052565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed8610fce565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f099493929190614605565b600060405180830381600087803b158015610f2357600080fd5b505af1158015610f37573d6000803e3d6000fd5b5050505050505050565b600090565b610f4e611971565b6109b76001611b5b565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8d929190614461565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108061061a610fce565b61108b610640610946565b611093611639565b61109e858585612055565b95945050505050565b6110af611971565b6110b76119ba565b6000806110c2610ae7565b915091506110d361093083836119ca565b6110e86110e085856119ca565b61015761162b565b6111137f00000000000000000000000000000000000000000000000000000000000000008585612062565b50505050565b6000806111263385611305565b90508083106111405761113b33856000611771565b61114d565b61114d3385858403611771565b5060019392505050565b600061070b338484611891565b60006108ff612138565b6008546000906108ff9060ff6121b2565b611187611971565b61118f611f3f565b6111996000611c00565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4b91906145ba565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121c8c610ff2565b89604051602001611232969594939291906146f2565b604051602081830303815290604052805190602001209050611263888261125a8787876121b9565b886101f86121f8565b610f37888888611771565b6060808861127d61061a610fce565b611288610640610946565b6000611292611639565b61129a610739565b6112ec576112a98a8a8761224f565b945090506112c26112b8610f41565b82101560cc61162b565b6112d460006112cf610f41565b6122e7565b6112e7896112e0610f41565b83036122e7565b610d48565b6112f78a8987611c51565b94509050610d4889826122e7565b600061130f610fce565b6001600160a01b0316826001600160a01b03161415611331575060001961070f565b61133b83836122f1565b905061070f565b600080600061134f610fce565b6001600160a01b031663b05f8e48611365610946565b306040518363ffffffff1660e01b81526004016113839291906147d8565b60806040518083038186803b15801561139b57600080fd5b505afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190614340565b5050915091506113e4818301611ea5565b9250505090565b60006108ff61231c565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff61183e565b600061142e836115d8565b6060835160010167ffffffffffffffff8111801561144b57600080fd5b50604051908082528060200260200182016040528015611475578160200160208202803683370190505b509050308160008151811061148657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f5578481815181106114be57fe5b60200260200101518282600101815181106114d557fe5b6001600160a01b03909216602092830291909101909101526001016114a9565b506060835160010167ffffffffffffffff8111801561151357600080fd5b5060405190808252806020026020018201604052801561153d578160200160208202803683370190505b50905060008160008151811061154f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115be5784818151811061158757fe5b602002602001015182826001018151811061159e57fe5b6001600160a01b0390921660209283029190910190910152600101611572565b506115cb878784846123b9565b925050505b949350505050565b806115e2816124c2565b5050565b60006115f683831115600161162b565b50900390565b600061160984848461253b565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e2576115e281612581565b6109b76116446117d9565b61019261162b565b60006116686003841080156116615750600383105b606461162b565b6060611672610768565b905061167e8582611dcf565b600080611689610ae7565b91509150611695613c89565b60405180606001604052806116a8610ab6565b81526020810185905260400183905290506000895160018111156116c857fe5b141561172c576116ef89606001518589815181106116e257fe5b60200260200101516125ab565b60608a015260006117018a8a846125b7565b90506117208186898151811061171357fe5b602002602001015161267e565b955050505050506115d0565b61174089606001518588815181106116e257fe5b60608a015260006117528a8a8461268a565b905061172081868a8151811061176457fe5b602002602001015161273f565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cc9085906145dd565b60405180910390a3505050565b60006117e361181a565b4211806108ff57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff61184b6113f5565b670de0b6b3a764000061274b565b600082820261187d84158061187657508385838161187357fe5b04145b600361162b565b670de0b6b3a7640000815b04949350505050565b6118a86001600160a01b038416151561019861162b565b6118bf6001600160a01b038316151561019961162b565b6118ca838383610941565b6001600160a01b0383166000908152602081905260409020546118f090826101a0612791565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461191f9082611b49565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cc9085906145dd565b60006119a06000357fffffffff0000000000000000000000000000000000000000000000000000000016610f58565b90506119b76119af82336127a7565b61019161162b565b50565b6109b76119c5610fce565b612890565b60008060006119d7610fce565b6001600160a01b031663b05f8e486119ed610946565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611a2b9291906147d8565b60806040518083038186803b158015611a4357600080fd5b505afa158015611a57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7b9190614340565b5050915091506000611ab7828401611ab27f0000000000000000000000000000000000000000000000000000000000000000612942565b6125ab565b905085811015801561065e57509390931115949350505050565b611ae464e8d4a5100082101560cb61162b565b611afa67016345785d8a000082111560ca61162b565b600854611b0b908260c0603f6115fc565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611b3e9083906145dd565b60405180910390a150565b60008282016108e5848210158361162b565b8015611b7b57611b76611b6c6117f6565b421061019361162b565b611b90565b611b90611b8661181a565b42106101a961162b565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611b3e9083906145ba565b6109b7611bf761116e565b156101b561162b565b600854611c0f908260ff612a1c565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611b3e9083906145ba565b6001901b6000190191901c1690565b60006060611c606103e6612581565b935093915050565b333014611d57576000306001600160a01b0316600036604051611c8c929190614491565b6000604051808303816000865af19150503d8060008114611cc9576040519150601f19603f3d011682016040523d82523d6000602084013e611cce565b606091505b505090508060008114611cdd57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611d39573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611d6a8686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611dde908290612a2b565b60005b8181101561111357611e19848281518110611df857fe5b6020026020010151848381518110611e0c57fe5b6020026020010151611859565b848281518110611e2557fe5b6020908102919091010152600101611de1565b60008160200151831015611e715781516020830151600091611e5d9186900390611859565b9050611e6984826115e6565b91505061070f565b81604001518311611e8357508161070f565b81516040830151600091611e5d91860390611859565b60006108e58383611b49565b600061070f82611eb3610739565b906115e6565b6000611ec8821515600461162b565b670de0b6b3a76400008302611efa841580611ef35750670de0b6b3a7640000858381611ef057fe5b04145b600561162b565b6001836001830304018115150291505092915050565b600080825111801561070f575060ff801682806020019051810190611f359190614380565b60ff161492915050565b6109b7611f4a61116e565b6101b661162b565b600060606000611f6184612a38565b90506060865167ffffffffffffffff81118015611f7d57600080fd5b50604051908082528060200260200182016040528015611fa7578160200160208202803683370190505b5090506000611fb4610f41565b90506000611fc7898381518110610c9b57fe5b90506000611fd58583612a4e565b905060005b8a518110156120375783811415611ff2576000612018565b612018828c838151811061200257fe5b602002602001015161185990919063ffffffff16565b85828151811061202457fe5b6020908102919091010152600101611fda565b509399929850919650505050505050565b6115e28282612a8e565b90565b60006108e56103e6612581565b6120718183111561014c61162b565b61208c6b0de0b6b39983494c589c000082111561014d61162b565b6120a4670de0b6b3a7640000825b061561016161162b565b6120b6670de0b6b3a76400008361209a565b6120eb670de0b6b3a76400008204604060206120e3670de0b6b3a7640000876008549190046020806115fc565b9291906115fc565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d12809061212b908590859061484d565b60405180910390a2505050565b6000612142610fce565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561217a57600080fd5b505afa15801561218e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ff919061422e565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b600061220385612b5a565b9050612219612213878387612b76565b8361162b565b612228428410156101b861162b565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b6000606061226a6001600160a01b038616301461015661162b565b6122816001600160a01b038516301461015661162b565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff816000815181106122d057fe5b602090810291909101015290969095509350505050565b6115e28282612c25565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612389612cb8565b3060405160200161239e9594939291906147ac565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016123e8919061480d565b602060405180830381600087803b15801561240257600080fd5b505af1158015612416573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243a9190614133565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d29061248690849088908890600401614726565b600060405180830381600087803b1580156124a057600080fd5b505af11580156124b4573d6000803e3d6000fd5b509298975050505050505050565b6002815110156124d1576119b7565b6000816000815181106124e057fe5b602002602001015190506000600190505b825181101561094157600083828151811061250857fe5b60200260200101519050612531816001600160a01b0316846001600160a01b031610606561162b565b91506001016124f1565b61254a6101008310606461162b565b61257260018210158015611661575061256860ff846101000361161f565b821115606461162b565b61094183821c156101b461162b565b6119b7817f42414c0000000000000000000000000000000000000000000000000000000000612cbc565b60006108e58383611859565b60208301516000906001600160a01b03163014156125e1576125da848484612d37565b90506108e5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b0316141561262a576125da848484612e8f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612673576125da848484612fcc565b6108e5610135612581565b60006108e58383612a4e565b60408301516000906001600160a01b03163014156126ad576125da848484613104565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156126f6576125da848484613254565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b03161415612673576125da84848461338c565b60006108e58383611eb9565b600080612757846134c4565b905080612767578291505061070f565b600061277285613572565b90506127888261278286846135e6565b90613600565b9250505061070f565b60006127a0848411158361162b565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6127c6610faa565b6001600160a01b0316141580156127e157506127e183613620565b15612809576127ee610faa565b6001600160a01b0316336001600160a01b031614905061070f565b612811612138565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b8152600401612840939291906145e6565b60206040518083038186803b15801561285857600080fd5b505afa15801561286c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b9190614113565b604080516000808252602082019092526060916128c3565b6128b0613cd4565b8152602001906001900390816128a85790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e849061290c9084906004016144eb565b600060405180830381600087803b15801561292657600080fd5b505af115801561293a573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156129a557507f0000000000000000000000000000000000000000000000000000000000000000610cd4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156129f1576129ea6107f161183e565b9050610cd4565b6001600160a01b038216301415612a115750670de0b6b3a7640000610cd4565b610cd4610135612581565b6001811b1992909216911b1790565b6115e2818314606761162b565b6000818060200190518101906108e5919061439c565b6000612a5d821515600461162b565b670de0b6b3a76400008302612a85841580611ef35750670de0b6b3a7640000858381611ef057fe5b82818161188857fe5b612aa56001600160a01b038316151561019b61162b565b612ab182600083610941565b6001600160a01b038216600090815260208190526040902054612ad790826101b2612791565b6001600160a01b038316600090815260208190526040902055612b0a612b0582612aff610739565b90613684565b613692565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612b4e91906145dd565b60405180910390a35050565b6000612b6461231c565b82604051602001610f8d9291906144a1565b6000612b8882516041146101b961162b565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612bc19089908590889088906147ef565b6020604051602081039080840390855afa158015612be3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612c195750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612c3160008383610941565b612c46612b0582612c40610739565b90611b49565b6001600160a01b038216600090815260208190526040902054612c699082611b49565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612b4e9085906145dd565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612dbd7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612db557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162b565b6115d08460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612df157fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612e2557fe5b6020026020010151612e3d87600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612e8357613697612e87565b6136f55b63ffffffff16565b6000612eeb7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612db5575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b03163014612f4657612f418460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f3357fe5b60200260200101518461375e565b6115d0565b6115d08460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f7a57fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612fae57fe5b6020026020010151612fc687600081518110610c9b57fe5b8661378e565b60006130287f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612db5575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b0316301461307e57612f418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061307057fe5b6020026020010151846137f4565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106130b257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130e657fe5b60200260200101516130fe87600081518110610c9b57fe5b86613829565b60006131897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612db557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162b565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131bd57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106131f157fe5b602002602001015161320987600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461324f57613890612e87565b6138e7565b60006132b07f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612db5575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b0316301461330657612f418460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132f857fe5b602002602001015184613951565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061333a57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061336e57fe5b602002602001015161338687600081518110610c9b57fe5b8661397b565b60006133e87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612db5575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b0316301461343e57612f418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061343057fe5b6020026020010151846139ca565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061347257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106134a657fe5b60200260200101516134be87600081518110610c9b57fe5b866139ff565b6000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b505afa92505050801561352f575060408051601f3d908101601f1916820190925261352c91810190614133565b60015b6129ea573d80801561355d576040519150601f19603f3d011682016040523d82523d6000602084013e613562565b606091505b5061356c81613a53565b50610cd4565b60008061357e83613ada565b9050600061358b84613b15565b905060006135a261359b86613b50565b42906115e6565b905060006135b96135b287613b8b565b83906135e6565b905060006135cf846135ca84613bc6565b611859565b90506135db85826115e6565b979650505050505050565b60008282026108e584158061187657508385838161187357fe5b600061360f821515600461162b565b81838161361857fe5b049392505050565b600061364b7f9f11080e00000000000000000000000000000000000000000000000000000000610f58565b82148061070f575061367c7f38e9922e00000000000000000000000000000000000000000000000000000000610f58565b909114919050565b60006108e583836001612791565b600255565b6000806136a48684611e38565b905060006136b28287611e99565b905060006136c0868a6115e6565b905060006136db84611eb36136d585876135e6565b8a613bd8565b90506136e788826115e6565b9a9950505050505050505050565b6000806137028684611e38565b905060006137108287611e99565b90506000613727613721838b6135e6565b87613600565b9050600061373584836115e6565b905060006137438288613bf9565b905061374f8a826115e6565b9b9a5050505050505050505050565b60008061376b8484611e38565b9050600061378261377c8688611b49565b85611e38565b905061065e81836115e6565b6000826137a65761379f8683611e38565b905061109e565b60006137b28684611e38565b905060006137c361377c888a611b49565b905060006137d182846115e6565b905060006137df8489611e99565b90506136e76137ee88846135e6565b82613600565b6000806138018484611e38565b9050600061380f82876115e6565b9050600061381d8286613bf9565b90506135db86826115e6565b60008261383757508461109e565b60006138438684611e38565b905060006138518287611e99565b9050600061385f878a611b49565b9050600061386d8483611e99565b9050600061388461387e89846135e6565b85613600565b905061374f81896115e6565b60008261389e57508461109e565b60006138aa8684611e38565b905060006138b88287611e99565b905060006138c6868a611b49565b905060006138db84611eb36136d585876135e6565b90506136e781896115e6565b6000826138f85761379f8683613bf9565b60006139048684611e38565b905060006139128287611e99565b90506000613929613923838b6135e6565b87613bd8565b905060006139378483611b49565b905060006139458288613bf9565b905061374f818b6115e6565b60008061395e8484611e38565b9050600061396f61377c86886115e6565b905061065e82826115e6565b6000806139888684611e38565b9050600061399961377c888a6115e6565b905060006139a783836115e6565b905060006139b58489611e99565b90506136e76139c488846135e6565b82613bd8565b6000806139d78484611e38565b905060006139e58287611b49565b905060006139f38286613bf9565b90506135db81876115e6565b600080613a0c8684611e38565b90506000613a1a8287611e99565b90506000613a28878a6115e6565b90506000613a368483611e99565b90506000613a4761387e89846135e6565b905061374f88826115e6565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417613ace578160208401fd5b506115e2610165612581565b6000816001600160a01b03166301e1d1146040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b6000816001600160a01b03166344b813966040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b6000816001600160a01b031663c3535b526040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b6000816001600160a01b031663422327166040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b670de0b6b3a764000081810391100290565b6000613be7821515600461162b565b50811515600019909201046001010290565b60008160200151831015613c4257815161133b90613c2090670de0b6b3a764000090611b49565b60208401518451613c3c91613c359190611859565b8690611b49565b90612a4e565b81604001518311613c5457508161070f565b815161133b90613c6d90670de0b6b3a7640000906115e6565b60408401518451613c3c91613c829190611859565b86906115e6565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561070f816148bc565b600082601f830112613d1f578081fd5b8135613d32613d2d82614890565b614869565b818152915060208083019084810181840286018201871015613d5357600080fd5b60005b84811015613d7257813584529282019290820190600101613d56565b505050505092915050565b600082601f830112613d8d578081fd5b8151613d9b613d2d82614890565b818152915060208083019084810181840286018201871015613dbc57600080fd5b60005b84811015613d7257815184529282019290820190600101613dbf565b600082601f830112613deb578081fd5b813567ffffffffffffffff811115613e01578182fd5b613e146020601f19601f84011601614869565b9150808252836020828501011115613e2b57600080fd5b8060208401602084013760009082016020015292915050565b80356002811061070f57600080fd5b6000610120808385031215613e66578182fd5b613e6f81614869565b915050613e7c8383613e44565b8152613e8b8360208401613d04565b6020820152613e9d8360408401613d04565b6040820152606082013560608201526080820135608082015260a082013560a0820152613ecd8360c08401613d04565b60c0820152613edf8360e08401613d04565b60e08201526101008083013567ffffffffffffffff811115613f0057600080fd5b613f0c85828601613ddb565b82840152505092915050565b600060208284031215613f29578081fd5b81356108e5816148bc565b60008060408385031215613f46578081fd5b8235613f51816148bc565b91506020830135613f61816148bc565b809150509250929050565b600080600060608486031215613f80578081fd5b8335613f8b816148bc565b92506020840135613f9b816148bc565b929592945050506040919091013590565b600080600080600080600060e0888a031215613fc6578283fd5b8735613fd1816148bc565b96506020880135613fe1816148bc565b955060408801359450606088013593506080880135613fff816148d1565b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561402e578182fd5b8235614039816148bc565b946020939093013593505050565b60008060006060848603121561405b578081fd5b835167ffffffffffffffff80821115614072578283fd5b818601915086601f830112614085578283fd5b8151614093613d2d82614890565b80828252602080830192508086018b8283870289010111156140b3578788fd5b8796505b848710156140de5780516140ca816148bc565b8452600196909601959281019281016140b7565b5089015190975093505050808211156140f5578283fd5b5061410286828701613d7d565b925050604084015190509250925092565b600060208284031215614124578081fd5b815180151581146108e5578182fd5b600060208284031215614144578081fd5b5051919050565b600080600080600080600060e0888a031215614165578081fd5b873596506020880135614177816148bc565b95506040880135614187816148bc565b9450606088013567ffffffffffffffff808211156141a3578283fd5b6141af8b838c01613d0f565b955060808a0135945060a08a0135935060c08a01359150808211156141d2578283fd5b506141df8a828b01613ddb565b91505092959891949750929550565b6000602082840312156141ff578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e5578182fd5b60006020828403121561423f578081fd5b81516108e5816148bc565b6000806000806080858703121561425f578182fd5b843567ffffffffffffffff80821115614276578384fd5b61428288838901613e53565b95506020870135915080821115614297578384fd5b506142a487828801613d0f565b949794965050505060408301359260600135919050565b6000806000606084860312156142cf578081fd5b833567ffffffffffffffff8111156142e5578182fd5b6142f186828701613e53565b9660208601359650604090950135949350505050565b600060208284031215614318578081fd5b5035919050565b60008060408385031215614331578182fd5b50508035926020909101359150565b60008060008060808587031215614355578182fd5b8451935060208501519250604085015191506060850151614375816148bc565b939692955090935050565b600060208284031215614391578081fd5b81516108e5816148d1565b600080604083850312156143ae578182fd5b82516143b9816148d1565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015614405578151875295820195908201906001016143e9565b509495945050505050565b15159052565b60008151808452815b8181101561443b5760208185018101518683018201520161441f565b8181111561444c5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b8281101561457557815180516004811061451e57fe5b855280870151614530888701826143c9565b50858101518686015260608082015161454b828801826143c9565b505060809081015190614560868201836143c9565b505060a0939093019290850190600101614508565b5091979650505050505050565b6000602082526108e560208301846143d6565b6000604082526145a860408301856143d6565b828103602084015261109e81856143d6565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156146765761466084516148b0565b825292840192600192909201919084019061464e565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a08701526146b481856143d6565b935050506040850151818584030160c08601526146d18382614416565b9250505060608401516146e760e0850182614410565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b8181101561476e5761475c85516148b0565b8352938301939183019160010161474a565b505084810360408601528551808252908201925081860190845b818110156124b45761479a83516148b0565b85529383019391830191600101614788565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016003831061481b57fe5b91905290565b6000602082526108e56020830184614416565b6000838252604060208301526115d060408301846143d6565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561488857600080fd5b604052919050565b600067ffffffffffffffff8211156148a6578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146119b757600080fd5b60ff811681146119b757600080fdfea26469706673582212208932908daa8d95d8c120416420b507b772c1b48199ad84f8004d3840baaf0c1264736f6c63430007010033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c80636634b753116200009957806376895be7116200006f57806376895be714620001cd578063851c1bb314620001e45780638d928af8146200020a578063aaabadc5146200021457620000ff565b80636634b75314620001935780636c57f5a914620001b9578063739238d614620001c357620000ff565b80632f2770db11620000db5780632f2770db146200015a5780633f819b6f146200016657806354fd4d5014620001705780635ed31282146200017a57620000ff565b8062c194db1462000104578063174481fa14620001265780632da47c401462000140575b600080fd5b6200010e6200021e565b6040516200011d919062001459565b60405180910390f35b620001306200023f565b6040516200011d929190620013f2565b6200014a62000285565b6040516200011d92919062001652565b620001646200030e565b005b6200010e62000378565b6200010e62000430565b62000184620004b2565b6040516200011d9190620013d1565b620001aa620001a43660046200114d565b620004ce565b6040516200011d919062001419565b620001aa620004f9565b6200018462000502565b62000184620001de366004620011f6565b62000526565b620001fb620001f536600462001195565b620008ee565b6040516200011d919062001424565b6200018462000942565b6200018462000966565b60606200023a6040518060200160405280600081525062000a54565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200030057807f00000000000000000000000000000000000000000000000000000000000000000392507f0000000000000000000000000000000000000000000000000000000000000000915062000309565b60009250600091505b509091565b6200031862000b2f565b6200032262000b7e565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b820191906000526020600020905b8154815290600101906020018083116200040857829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006200053262000b97565b6004805460018101909155604051606090620005516020820162000fe1565b601f1982820381018352601f909101166040526200056e62000942565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001620005a2929190620013f2565b60408051601f1981840301815290829052620005c292916020016200139e565b60405160208183030381529060405290506000620005e883838051906020012062000bb2565b9050600080620005f762000285565b915091506200060562000fef565b6200060f62000942565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508f81602001819052508e81604001819052508d816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508c816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b8160c00181815250508a8160e0018181525050828161010001818152505081816101200181815250508981610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506200076d62000378565b610160820152604051600090620007a4906200078e9084906020016200154a565b6040516020818303038152906040528a62000bca565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620007ef57600080fd5b505af115801562000804573d6000803e3d6000fd5b505050506000620008186000898962000c21565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146200088b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088290620014dc565b60405180910390fd5b6040518b9073ffffffffffffffffffffffffffffffffffffffff8416907fda2f557d6e80d2dcf3894f2bb74fe9840e4d558e350f6aad63af0e0b12f1a58690600090a3509650505050505050620008e162000cff565b9998505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001620009259291906200136e565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006200097262000942565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620009b857600080fd5b505afa158015620009cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023a9190620011d7565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000a4e73ffffffffffffffffffffffffffffffffffffffff831615156101ac62000d06565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000b2181838662000d1b565b505050505050505050919050565b600062000b606000357fffffffff0000000000000000000000000000000000000000000000000000000016620008ee565b905062000b7b62000b72823362000d79565b61019162000d06565b50565b62000b9562000b8c620004f9565b1560d362000d06565b565b62000bab6002600354141561019062000d06565b6002600355565b600062000bc183833062000e17565b90505b92915050565b60008062000bd9848462000e58565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316179055949350505050565b6000808447101562000c61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000882906200146e565b825162000c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008829062001513565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088290620014a5565b949350505050565b6001600355565b8162000d175762000d178162000ef5565b5050565b5b6020811062000d3d578151835260209283019290910190601f190162000d1c565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000d8562000966565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000dc3939291906200142d565b60206040518083038186803b15801562000ddc57600080fd5b505afa15801562000df1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bc1919062001173565b60008060ff60f81b83868660405160200162000e3794939291906200130a565b60408051808303601f19018152919052805160209091012095945050505050565b600062000e6462000b7e565b600062000e72848462000f21565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a29392505050565b62000b7b817f42414c000000000000000000000000000000000000000000000000000000000062000f66565b6000606062000f308462000a54565b90506000838251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf7573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6120ff80620016b783390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b803562000bc48162001693565b600082601f830112620010dc578081fd5b813567ffffffffffffffff80821115620010f4578283fd5b6040516020601f19601f850116820101818110838211171562001115578485fd5b6040528281529250828483016020018610156200113157600080fd5b8260208601602083013760006020848301015250505092915050565b6000602082840312156200115f578081fd5b81356200116c8162001693565b9392505050565b60006020828403121562001185578081fd5b815180151581146200116c578182fd5b600060208284031215620011a7578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146200116c578182fd5b600060208284031215620011e9578081fd5b81516200116c8162001693565b60008060008060008060008060006101208a8c03121562001215578485fd5b893567ffffffffffffffff808211156200122d578687fd5b6200123b8d838e01620010cb565b9a5060208c013591508082111562001251578687fd5b50620012608c828d01620010cb565b98505060408a0135620012738162001693565b965060608a0135620012858162001693565b955060808a0135945060a08a01359350620012a48b60c08c01620010be565b925060e08a013591506101008a013590509295985092959850929598565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620012f681602086016020860162001660565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60008351620013b281846020880162001660565b835190830190620013c881836020880162001660565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000bc16020830184620012dc565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b60006020825262001560602083018451620012c2565b60208301516101808060408501526200157e6101a0850183620012dc565b91506040850151601f19808685030160608701526200159e8483620012dc565b935060608701519150620015b66080870183620012c2565b60808701519150620015cc60a0870183620012c2565b60a08701519150620015e260c0870183620012c2565b60c087015160e08781019190915287015161010080880191909152870151610120808801919091528701516101408088019190915287015191506101606200162d81880184620012c2565b870151868503909101838701529050620016488382620012dc565b9695505050505050565b918252602082015260400190565b60005b838110156200167d57818101518382015260200162001663565b838111156200168d576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000b7b57600080fdfe6101606040523480156200001257600080fd5b50604051620020ff380380620020ff833981016040819052620000359162000462565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000378565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200012591908101906200039e565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000449565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000449565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000378565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000378565b6001600160601b0319606091821b811660e05292811b8316610120521b166101405250620004e0915050565b6000602082840312156200038a578081fd5b81516200039781620004c7565b9392505050565b60006020808385031215620003b1578182fd5b82516001600160401b0380821115620003c8578384fd5b818501915085601f830112620003dc578384fd5b815181811115620003eb578485fd5b8381029150620003fd848301620004a0565b8181528481019084860184860187018a101562000418578788fd5b8795505b838610156200043c5780518352600195909501949186019186016200041c565b5098975050505050505050565b6000602082840312156200045b578081fd5b5051919050565b6000806040838503121562000475578081fd5b82516200048281620004c7565b60208401519092506200049581620004c7565b809150509250929050565b6040518181016001600160401b0381118282101715620004bf57600080fd5b604052919050565b6001600160a01b0381168114620004dd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c611b3c620005c36000398061050b52806108235250806101355280610c165280610f305280610f925250806103c152508061046e528061059b528061074a52806108ee5280610cc05280610ff2528061105c52806110be52508060ea5280610192528061043252806105ce528061063352806106d4528061078652806108b3528061103a5250806101715280610404528061071c5280610a7f5280610b5e5280610db85280610e975250806099528061030b5250611b3c6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b919061186b565b60405180910390f35b610077610072366004611729565b6100bb565b60405161005b9190611aa5565b610077610092366004611745565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610124565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308561025b565b61011b83610124565b90505b92915050565b60008061012f610304565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101ce9291906119b7565b60806040518083038186803b1580156101e657600080fd5b505afa1580156101fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021e91906117cb565b50505090508181101561024057610237818303856103ed565b925050506100c9565b818111156102545761023782820385610705565b5050919050565b6102fe846323b872dd60e01b85858560405160240161027c939291906118b3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610913565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a691906117a8565b9150915060006002828401816103b857fe5b0490506103e5817f00000000000000000000000000000000000000000000000000000000000000006109c0565b935050505090565b60006103f7611676565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104cb6116d9565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061054290869086906004016119db565b602060405180830381600087803b15801561055c57600080fd5b505af1158015610570573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105949190611790565b90506105c07f000000000000000000000000000000000000000000000000000000000000000082610a13565b6105c981610c84565b6105f37f000000000000000000000000000000000000000000000000000000000000000087610d4c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a082319061066890309060040161186b565b60206040518083038186803b15801561068057600080fd5b505afa158015610694573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b89190611790565b90506106fb73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fc7565b9695505050505050565b600061070f611676565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e36116d9565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061085a90869086906004016119db565b602060405180830381600087803b15801561087457600080fd5b505af1158015610888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ac9190611790565b90506108d87f000000000000000000000000000000000000000000000000000000000000000087610a13565b6108e96108e482610feb565b611020565b6105f37f000000000000000000000000000000000000000000000000000000000000000082610d4c565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093c919061184f565b6000604051808303816000865af19150503d8060008114610979576040519150601f19603f3d011682016040523d82523d6000602084013e61097e565b606091505b50915091506000821415610996573d6000803e3d6000fd5b6102fe8151600014806109b85750818060200190518101906109b89190611770565b6101a26110f5565b60006109cf82151560046110f5565b670de0b6b3a76400008302610a018415806109fa5750670de0b6b3a76400008583816109f757fe5b04145b60056110f5565b828181610a0a57fe5b04949350505050565b6040805160028082526060828101909352816020015b610a31611700565b815260200190600190039081610a29579050509050600081600081518110610a5557fe5b6020026020010151600001906002811115610a6c57fe5b90816002811115610a7957fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aab57fe5b602002602001015160200181815250508181600081518110610ac957fe5b602002602001015160600181815250508281600081518110610ae757fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3457fe5b6020026020010151600001906002811115610b4b57fe5b90816002811115610b5857fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8a57fe5b60200260200101516020018181525050600081600181518110610ba957fe5b602002602001015160600181815250508281600181518110610bc757fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4d908490600401611933565b600060405180830381600087803b158015610c6757600080fd5b505af1158015610c7b573d6000803e3d6000fd5b50505050505050565b6040517ef714ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169062f714ce90610cf690849030906004016119b7565b602060405180830381600087803b158015610d1057600080fd5b505af1158015610d24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d489190611790565b5050565b6040805160028082526060828101909352816020015b610d6a611700565b815260200190600190039081610d62579050509050600281600081518110610d8e57fe5b6020026020010151600001906002811115610da557fe5b90816002811115610db257fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de457fe5b602002602001015160200181815250508181600081518110610e0257fe5b602002602001015160600181815250508281600081518110610e2057fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e6d57fe5b6020026020010151600001906002811115610e8457fe5b90816002811115610e9157fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec357fe5b602002602001015160200181815250508181600181518110610ee157fe5b602002602001015160600181815250508281600181518110610eff57fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f559084167f000000000000000000000000000000000000000000000000000000000000000084611103565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4d908490600401611933565b610fe68363a9059cbb60e01b848460405160240161027c92919061190d565b505050565b60006110177f0000000000000000000000000000000000000000000000000000000000000000836111f8565b60010192915050565b61108173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611103565b6040517f6e553f6500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636e553f6590610cf690849030906004016119b7565b81610d4857610d488161123e565b80158015906111b457506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e90611161903090869060040161188c565b60206040518083038186803b15801561117957600080fd5b505afa15801561118d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b19190611790565b15155b156111d9576111d98363095ea7b360e01b84600060405160240161027c9291906118e4565b610fe68363095ea7b360e01b848460405160240161027c92919061190d565b6000806112048461126b565b905080611214578291505061011e565b600061121f8561134b565b90506112358261122f86846113bf565b906113e3565b9250505061011e565b611268817f42414c0000000000000000000000000000000000000000000000000000000000611403565b50565b60008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b505afa925050508015611301575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526112fe91810190611790565b60015b611344573d80801561132f576040519150601f19603f3d011682016040523d82523d6000602084013e611334565b606091505b5061133e8161147e565b506100c9565b90506100c9565b60008061135783611505565b905060006113648461154d565b9050600061137b61137486611595565b42906115dd565b9050600061139261138b876115f3565b83906113bf565b905060006113a8846113a38461163b565b61164d565b90506113b485826115dd565b979650505050505050565b600082820261011b8415806113dc5750838583816113d957fe5b04145b60036110f5565b60006113f282151560046110f5565b8183816113fb57fe5b049392505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc12000000000000000000000000000000000000000000000000000000008214176114f9578160208401fd5b50610d4861016561123e565b60008173ffffffffffffffffffffffffffffffffffffffff166301e1d1146040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff166344b813966040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663c3535b526040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60006115ed8383111560016110f5565b50900390565b60008173ffffffffffffffffffffffffffffffffffffffff1663422327166040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b670de0b6b3a764000081810391100290565b60008282026116678415806113dc5750838583816113d957fe5b670de0b6b3a764000081610a0a565b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b60006020828403121561173a578081fd5b813561011b81611ae4565b60008060408385031215611757578081fd5b823561176281611ae4565b946020939093013593505050565b600060208284031215611781578081fd5b8151801515811461011b578182fd5b6000602082840312156117a1578081fd5b5051919050565b600080604083850312156117ba578182fd5b505080516020909101519092909150565b600080600080608085870312156117e0578182fd5b845193506020850151925060408501519150606085015161180081611ae4565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b60008251611861818460208701611aae565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b828110156119aa57815180516003811061196657fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff16868601526060908101519085015260809093019290850190600101611950565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a083015260208401516119f681611ada565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c0610140840152805180610160850152610180611a628282870160208601611aae565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401168601019350505050611a9e602083018461180b565b9392505050565b90815260200190565b60005b83811015611ac9578181015183820152602001611ab1565b838111156102fe5750506000910152565b6002811061126857fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461126857600080fdfea26469706673582212208beb7817193b118865b9e09fbe3db18b401c8700b7d556fbd4b00fcb8b5d27ea64736f6c63430007010033a26469706673582212203fe5794f993e428d5952c1b84f806971d87166fc91807a42cd8170638efd3d7264736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/artifact/YearnLinearPoolRebalancer.json b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/artifact/YearnLinearPoolRebalancer.json new file mode 100644 index 0000000..6d847fa --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/artifact/YearnLinearPoolRebalancer.json @@ -0,0 +1,83 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "YearnLinearPoolRebalancer", + "sourceName": "contracts/yearn-linear-pool/YearnLinearPoolRebalancer.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IBalancerQueries", + "name": "queries", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "getPool", + "outputs": [ + { + "internalType": "contract ILinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "rebalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "extraMain", + "type": "uint256" + } + ], + "name": "rebalanceWithExtraMain", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101606040523480156200001257600080fd5b50604051620020ff380380620020ff833981016040819052620000359162000462565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000378565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200012591908101906200039e565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000449565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000449565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000378565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000378565b6001600160601b0319606091821b811660e05292811b8316610120521b166101405250620004e0915050565b6000602082840312156200038a578081fd5b81516200039781620004c7565b9392505050565b60006020808385031215620003b1578182fd5b82516001600160401b0380821115620003c8578384fd5b818501915085601f830112620003dc578384fd5b815181811115620003eb578485fd5b8381029150620003fd848301620004a0565b8181528481019084860184860187018a101562000418578788fd5b8795505b838610156200043c5780518352600195909501949186019186016200041c565b5098975050505050505050565b6000602082840312156200045b578081fd5b5051919050565b6000806040838503121562000475578081fd5b82516200048281620004c7565b60208401519092506200049581620004c7565b809150509250929050565b6040518181016001600160401b0381118282101715620004bf57600080fd5b604052919050565b6001600160a01b0381168114620004dd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c611b3c620005c36000398061050b52806108235250806101355280610c165280610f305280610f925250806103c152508061046e528061059b528061074a52806108ee5280610cc05280610ff2528061105c52806110be52508060ea5280610192528061043252806105ce528061063352806106d4528061078652806108b3528061103a5250806101715280610404528061071c5280610a7f5280610b5e5280610db85280610e975250806099528061030b5250611b3c6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b919061186b565b60405180910390f35b610077610072366004611729565b6100bb565b60405161005b9190611aa5565b610077610092366004611745565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610124565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308561025b565b61011b83610124565b90505b92915050565b60008061012f610304565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101ce9291906119b7565b60806040518083038186803b1580156101e657600080fd5b505afa1580156101fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021e91906117cb565b50505090508181101561024057610237818303856103ed565b925050506100c9565b818111156102545761023782820385610705565b5050919050565b6102fe846323b872dd60e01b85858560405160240161027c939291906118b3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610913565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a691906117a8565b9150915060006002828401816103b857fe5b0490506103e5817f00000000000000000000000000000000000000000000000000000000000000006109c0565b935050505090565b60006103f7611676565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104cb6116d9565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061054290869086906004016119db565b602060405180830381600087803b15801561055c57600080fd5b505af1158015610570573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105949190611790565b90506105c07f000000000000000000000000000000000000000000000000000000000000000082610a13565b6105c981610c84565b6105f37f000000000000000000000000000000000000000000000000000000000000000087610d4c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a082319061066890309060040161186b565b60206040518083038186803b15801561068057600080fd5b505afa158015610694573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b89190611790565b90506106fb73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fc7565b9695505050505050565b600061070f611676565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e36116d9565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061085a90869086906004016119db565b602060405180830381600087803b15801561087457600080fd5b505af1158015610888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ac9190611790565b90506108d87f000000000000000000000000000000000000000000000000000000000000000087610a13565b6108e96108e482610feb565b611020565b6105f37f000000000000000000000000000000000000000000000000000000000000000082610d4c565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093c919061184f565b6000604051808303816000865af19150503d8060008114610979576040519150601f19603f3d011682016040523d82523d6000602084013e61097e565b606091505b50915091506000821415610996573d6000803e3d6000fd5b6102fe8151600014806109b85750818060200190518101906109b89190611770565b6101a26110f5565b60006109cf82151560046110f5565b670de0b6b3a76400008302610a018415806109fa5750670de0b6b3a76400008583816109f757fe5b04145b60056110f5565b828181610a0a57fe5b04949350505050565b6040805160028082526060828101909352816020015b610a31611700565b815260200190600190039081610a29579050509050600081600081518110610a5557fe5b6020026020010151600001906002811115610a6c57fe5b90816002811115610a7957fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aab57fe5b602002602001015160200181815250508181600081518110610ac957fe5b602002602001015160600181815250508281600081518110610ae757fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3457fe5b6020026020010151600001906002811115610b4b57fe5b90816002811115610b5857fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8a57fe5b60200260200101516020018181525050600081600181518110610ba957fe5b602002602001015160600181815250508281600181518110610bc757fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4d908490600401611933565b600060405180830381600087803b158015610c6757600080fd5b505af1158015610c7b573d6000803e3d6000fd5b50505050505050565b6040517ef714ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169062f714ce90610cf690849030906004016119b7565b602060405180830381600087803b158015610d1057600080fd5b505af1158015610d24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d489190611790565b5050565b6040805160028082526060828101909352816020015b610d6a611700565b815260200190600190039081610d62579050509050600281600081518110610d8e57fe5b6020026020010151600001906002811115610da557fe5b90816002811115610db257fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de457fe5b602002602001015160200181815250508181600081518110610e0257fe5b602002602001015160600181815250508281600081518110610e2057fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e6d57fe5b6020026020010151600001906002811115610e8457fe5b90816002811115610e9157fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec357fe5b602002602001015160200181815250508181600181518110610ee157fe5b602002602001015160600181815250508281600181518110610eff57fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f559084167f000000000000000000000000000000000000000000000000000000000000000084611103565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4d908490600401611933565b610fe68363a9059cbb60e01b848460405160240161027c92919061190d565b505050565b60006110177f0000000000000000000000000000000000000000000000000000000000000000836111f8565b60010192915050565b61108173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611103565b6040517f6e553f6500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636e553f6590610cf690849030906004016119b7565b81610d4857610d488161123e565b80158015906111b457506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e90611161903090869060040161188c565b60206040518083038186803b15801561117957600080fd5b505afa15801561118d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b19190611790565b15155b156111d9576111d98363095ea7b360e01b84600060405160240161027c9291906118e4565b610fe68363095ea7b360e01b848460405160240161027c92919061190d565b6000806112048461126b565b905080611214578291505061011e565b600061121f8561134b565b90506112358261122f86846113bf565b906113e3565b9250505061011e565b611268817f42414c0000000000000000000000000000000000000000000000000000000000611403565b50565b60008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b505afa925050508015611301575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526112fe91810190611790565b60015b611344573d80801561132f576040519150601f19603f3d011682016040523d82523d6000602084013e611334565b606091505b5061133e8161147e565b506100c9565b90506100c9565b60008061135783611505565b905060006113648461154d565b9050600061137b61137486611595565b42906115dd565b9050600061139261138b876115f3565b83906113bf565b905060006113a8846113a38461163b565b61164d565b90506113b485826115dd565b979650505050505050565b600082820261011b8415806113dc5750838583816113d957fe5b04145b60036110f5565b60006113f282151560046110f5565b8183816113fb57fe5b049392505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc12000000000000000000000000000000000000000000000000000000008214176114f9578160208401fd5b50610d4861016561123e565b60008173ffffffffffffffffffffffffffffffffffffffff166301e1d1146040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff166344b813966040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663c3535b526040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60006115ed8383111560016110f5565b50900390565b60008173ffffffffffffffffffffffffffffffffffffffff1663422327166040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b670de0b6b3a764000081810391100290565b60008282026116678415806113dc5750838583816113d957fe5b670de0b6b3a764000081610a0a565b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b60006020828403121561173a578081fd5b813561011b81611ae4565b60008060408385031215611757578081fd5b823561176281611ae4565b946020939093013593505050565b600060208284031215611781578081fd5b8151801515811461011b578182fd5b6000602082840312156117a1578081fd5b5051919050565b600080604083850312156117ba578182fd5b505080516020909101519092909150565b600080600080608085870312156117e0578182fd5b845193506020850151925060408501519150606085015161180081611ae4565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b60008251611861818460208701611aae565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b828110156119aa57815180516003811061196657fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff16868601526060908101519085015260809093019290850190600101611950565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a083015260208401516119f681611ada565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c0610140840152805180610160850152610180611a628282870160208601611aae565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401168601019350505050611a9e602083018461180b565b9392505050565b90815260200190565b60005b83811015611ac9578181015183820152602001611ab1565b838111156102fe5750506000910152565b6002811061126857fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461126857600080fdfea26469706673582212208beb7817193b118865b9e09fbe3db18b401c8700b7d556fbd4b00fcb8b5d27ea64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b919061186b565b60405180910390f35b610077610072366004611729565b6100bb565b60405161005b9190611aa5565b610077610092366004611745565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610124565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308561025b565b61011b83610124565b90505b92915050565b60008061012f610304565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101ce9291906119b7565b60806040518083038186803b1580156101e657600080fd5b505afa1580156101fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021e91906117cb565b50505090508181101561024057610237818303856103ed565b925050506100c9565b818111156102545761023782820385610705565b5050919050565b6102fe846323b872dd60e01b85858560405160240161027c939291906118b3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610913565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a691906117a8565b9150915060006002828401816103b857fe5b0490506103e5817f00000000000000000000000000000000000000000000000000000000000000006109c0565b935050505090565b60006103f7611676565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104cb6116d9565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061054290869086906004016119db565b602060405180830381600087803b15801561055c57600080fd5b505af1158015610570573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105949190611790565b90506105c07f000000000000000000000000000000000000000000000000000000000000000082610a13565b6105c981610c84565b6105f37f000000000000000000000000000000000000000000000000000000000000000087610d4c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a082319061066890309060040161186b565b60206040518083038186803b15801561068057600080fd5b505afa158015610694573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b89190611790565b90506106fb73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fc7565b9695505050505050565b600061070f611676565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e36116d9565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061085a90869086906004016119db565b602060405180830381600087803b15801561087457600080fd5b505af1158015610888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ac9190611790565b90506108d87f000000000000000000000000000000000000000000000000000000000000000087610a13565b6108e96108e482610feb565b611020565b6105f37f000000000000000000000000000000000000000000000000000000000000000082610d4c565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093c919061184f565b6000604051808303816000865af19150503d8060008114610979576040519150601f19603f3d011682016040523d82523d6000602084013e61097e565b606091505b50915091506000821415610996573d6000803e3d6000fd5b6102fe8151600014806109b85750818060200190518101906109b89190611770565b6101a26110f5565b60006109cf82151560046110f5565b670de0b6b3a76400008302610a018415806109fa5750670de0b6b3a76400008583816109f757fe5b04145b60056110f5565b828181610a0a57fe5b04949350505050565b6040805160028082526060828101909352816020015b610a31611700565b815260200190600190039081610a29579050509050600081600081518110610a5557fe5b6020026020010151600001906002811115610a6c57fe5b90816002811115610a7957fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aab57fe5b602002602001015160200181815250508181600081518110610ac957fe5b602002602001015160600181815250508281600081518110610ae757fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3457fe5b6020026020010151600001906002811115610b4b57fe5b90816002811115610b5857fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8a57fe5b60200260200101516020018181525050600081600181518110610ba957fe5b602002602001015160600181815250508281600181518110610bc757fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4d908490600401611933565b600060405180830381600087803b158015610c6757600080fd5b505af1158015610c7b573d6000803e3d6000fd5b50505050505050565b6040517ef714ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169062f714ce90610cf690849030906004016119b7565b602060405180830381600087803b158015610d1057600080fd5b505af1158015610d24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d489190611790565b5050565b6040805160028082526060828101909352816020015b610d6a611700565b815260200190600190039081610d62579050509050600281600081518110610d8e57fe5b6020026020010151600001906002811115610da557fe5b90816002811115610db257fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de457fe5b602002602001015160200181815250508181600081518110610e0257fe5b602002602001015160600181815250508281600081518110610e2057fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e6d57fe5b6020026020010151600001906002811115610e8457fe5b90816002811115610e9157fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec357fe5b602002602001015160200181815250508181600181518110610ee157fe5b602002602001015160600181815250508281600181518110610eff57fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f559084167f000000000000000000000000000000000000000000000000000000000000000084611103565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4d908490600401611933565b610fe68363a9059cbb60e01b848460405160240161027c92919061190d565b505050565b60006110177f0000000000000000000000000000000000000000000000000000000000000000836111f8565b60010192915050565b61108173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611103565b6040517f6e553f6500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636e553f6590610cf690849030906004016119b7565b81610d4857610d488161123e565b80158015906111b457506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e90611161903090869060040161188c565b60206040518083038186803b15801561117957600080fd5b505afa15801561118d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b19190611790565b15155b156111d9576111d98363095ea7b360e01b84600060405160240161027c9291906118e4565b610fe68363095ea7b360e01b848460405160240161027c92919061190d565b6000806112048461126b565b905080611214578291505061011e565b600061121f8561134b565b90506112358261122f86846113bf565b906113e3565b9250505061011e565b611268817f42414c0000000000000000000000000000000000000000000000000000000000611403565b50565b60008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b505afa925050508015611301575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526112fe91810190611790565b60015b611344573d80801561132f576040519150601f19603f3d011682016040523d82523d6000602084013e611334565b606091505b5061133e8161147e565b506100c9565b90506100c9565b60008061135783611505565b905060006113648461154d565b9050600061137b61137486611595565b42906115dd565b9050600061139261138b876115f3565b83906113bf565b905060006113a8846113a38461163b565b61164d565b90506113b485826115dd565b979650505050505050565b600082820261011b8415806113dc5750838583816113d957fe5b04145b60036110f5565b60006113f282151560046110f5565b8183816113fb57fe5b049392505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc12000000000000000000000000000000000000000000000000000000008214176114f9578160208401fd5b50610d4861016561123e565b60008173ffffffffffffffffffffffffffffffffffffffff166301e1d1146040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff166344b813966040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663c3535b526040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60006115ed8383111560016110f5565b50900390565b60008173ffffffffffffffffffffffffffffffffffffffff1663422327166040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b670de0b6b3a764000081810391100290565b60008282026116678415806113dc5750838583816113d957fe5b670de0b6b3a764000081610a0a565b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b60006020828403121561173a578081fd5b813561011b81611ae4565b60008060408385031215611757578081fd5b823561176281611ae4565b946020939093013593505050565b600060208284031215611781578081fd5b8151801515811461011b578182fd5b6000602082840312156117a1578081fd5b5051919050565b600080604083850312156117ba578182fd5b505080516020909101519092909150565b600080600080608085870312156117e0578182fd5b845193506020850151925060408501519150606085015161180081611ae4565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b60008251611861818460208701611aae565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b828110156119aa57815180516003811061196657fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff16868601526060908101519085015260809093019290850190600101611950565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a083015260208401516119f681611ada565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c0610140840152805180610160850152610180611a628282870160208601611aae565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401168601019350505050611a9e602083018461180b565b9392505050565b90815260200190565b60005b83811015611ac9578181015183820152602001611ab1565b838111156102fe5750506000910152565b6002811061126857fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461126857600080fdfea26469706673582212208beb7817193b118865b9e09fbe3db18b401c8700b7d556fbd4b00fcb8b5d27ea64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/artifact/YearnShareValueHelper.json b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/artifact/YearnShareValueHelper.json new file mode 100644 index 0000000..a5bc85f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/artifact/YearnShareValueHelper.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "YearnShareValueHelper", + "sourceName": "contracts/yearn-linear-pool/YearnShareValueHelper.sol", + "abi": [], + "bytecode": "0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea26469706673582212203618cfe1b9194bd14b72f379bd87b402f00e2f55bd10b2b871b921a079c65cf664736f6c63430007010033", + "deployedBytecode": "0x6080604052600080fdfea26469706673582212203618cfe1b9194bd14b72f379bd87b402f00e2f55bd10b2b871b921a079c65cf664736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/index.ts b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/index.ts new file mode 100644 index 0000000..cc5526f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/index.ts @@ -0,0 +1,105 @@ +import { bn } from '@helpers/numbers'; +import { Task, TaskMode, TaskRunOptions } from '@src'; +import { YearnLinearPoolDeployment } from './input'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import * as expectEvent from '@helpers/expectEvent'; +import { ethers } from 'hardhat'; +import { getContractDeploymentTransactionHash, saveContractDeploymentTransactionHash } from '@src'; +import { randomBytes } from 'ethers/lib/utils'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as YearnLinearPoolDeployment; + const args = [ + input.Vault, + input.ProtocolFeePercentagesProvider, + input.BalancerQueries, + input.FactoryVersion, + input.PoolVersion, + input.InitialPauseWindowDuration, + input.BufferPeriodDuration, + ]; + + const factory = await task.deployAndVerify('YearnLinearPoolFactory', args, from, force); + + if (task.mode === TaskMode.LIVE) { + // We also create a Pool using the factory and verify it, to let us compute their action IDs and so that future + // Pools are automatically verified. We however don't run any of this code in CHECK mode, since we don't care about + // the contracts deployed here. The action IDs will be checked to be correct via a different mechanism. + + // YearnLinearPools require a Yearn Token + const mockShareTokenArgs = ['DO NOT USE - Mock Yearn Token', 'TEST', 18, input.WETH]; + const mockShareToken = await task.deployAndVerify('MockYearnTokenVault', mockShareTokenArgs, from, force); + + // The assetManager, pauseWindowDuration and bufferPeriodDuration will be filled in later, but we need to declare + // them here to appease the type system. Those are constructor arguments, but automatically provided by the factory. + const mockPoolArgs = { + vault: input.Vault, + name: 'DO NOT USE - Mock Linear Pool', + symbol: 'TEST', + mainToken: input.WETH, + wrappedToken: mockShareToken.address, + assetManager: undefined, + upperTarget: 0, + pauseWindowDuration: undefined, + bufferPeriodDuration: undefined, + swapFeePercentage: bn(1e12), + owner: ZERO_ADDRESS, + version: input.PoolVersion, + }; + + // This mimics the logic inside task.deploy + if (force || !task.output({ ensure: false })['MockYearnLinearPool']) { + const PROTOCOL_ID = 0; + const SALT = randomBytes(32); + + const poolCreationReceipt = await ( + await factory.create( + mockPoolArgs.name, + mockPoolArgs.symbol, + mockPoolArgs.mainToken, + mockPoolArgs.wrappedToken, + mockPoolArgs.upperTarget, + mockPoolArgs.swapFeePercentage, + mockPoolArgs.owner, + PROTOCOL_ID, + SALT + ) + ).wait(); + const event = expectEvent.inReceipt(poolCreationReceipt, 'PoolCreated'); + const mockPoolAddress = event.args.pool; + + await saveContractDeploymentTransactionHash(mockPoolAddress, poolCreationReceipt.transactionHash, task.network); + await task.save({ MockYearnLinearPool: mockPoolAddress }); + } + + const mockPool = await task.instanceAt('YearnLinearPool', task.output()['MockYearnLinearPool']); + + // In order to verify the Pool's code, we need to complete its constructor arguments by computing the factory + // provided arguments (asset manager and pause durations). + + // The asset manager is found by querying the Vault + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, task.network); + const vault = await vaultTask.deployedInstance('Vault'); + + const { assetManager: assetManagerAddress } = await vault.getPoolTokenInfo(await mockPool.getPoolId(), input.WETH); + mockPoolArgs.assetManager = assetManagerAddress; + + // The durations require knowing when the Pool was created, so we look for the timestamp of its creation block. + const txHash = await getContractDeploymentTransactionHash(mockPool.address, task.network); + const tx = await ethers.provider.getTransactionReceipt(txHash); + const poolCreationBlock = await ethers.provider.getBlock(tx.blockNumber); + + // With those and the period end times, we can compute the durations. + const { pauseWindowEndTime, bufferPeriodEndTime } = await mockPool.getPausedState(); + mockPoolArgs.pauseWindowDuration = pauseWindowEndTime.sub(poolCreationBlock.timestamp); + mockPoolArgs.bufferPeriodDuration = bufferPeriodEndTime + .sub(poolCreationBlock.timestamp) + .sub(mockPoolArgs.pauseWindowDuration); + + // We are now ready to verify the Pool + await task.verify('YearnLinearPool', mockPool.address, [mockPoolArgs]); + + // We can also verify the Asset Manager + await task.verify('YearnLinearPoolRebalancer', assetManagerAddress, [input.Vault, input.BalancerQueries]); + } +}; diff --git a/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/input.ts b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/input.ts new file mode 100644 index 0000000..c135994 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/input.ts @@ -0,0 +1,31 @@ +import { Task, TaskMode } from '@src'; +import { MONTH } from '@helpers/time'; + +export type YearnLinearPoolDeployment = { + Vault: string; + BalancerQueries: string; + ProtocolFeePercentagesProvider: string; + WETH: string; + FactoryVersion: string; + PoolVersion: string; + InitialPauseWindowDuration: number; + BufferPeriodDuration: number; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerQueries = new Task('20220721-balancer-queries', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); +const WETH = new Task('00000000-tokens', TaskMode.READ_ONLY); + +const BaseVersion = { version: 2, deployment: '20230409-yearn-linear-pool-v2' }; + +export default { + Vault, + BalancerQueries, + ProtocolFeePercentagesProvider, + WETH, + FactoryVersion: JSON.stringify({ name: 'YearnLinearPoolFactory', ...BaseVersion }), + PoolVersion: JSON.stringify({ name: 'YearnLinearPool', ...BaseVersion }), + InitialPauseWindowDuration: MONTH * 3, + BufferPeriodDuration: MONTH, +}; diff --git a/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/output/arbitrum.json b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/output/arbitrum.json new file mode 100644 index 0000000..f691198 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/output/arbitrum.json @@ -0,0 +1,5 @@ +{ + "YearnLinearPoolFactory": "0x19DFEF0a828EEC0c85FbB335aa65437417390b85", + "MockYearnTokenVault": "0xb15608d28eb43378A7e7780aDD3fE9bC132bAf40", + "MockYearnLinearPool": "0x1Fa7F727934226aedaB636D62a084931b97d366b" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/output/base.json b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/output/base.json new file mode 100644 index 0000000..97ee5cc --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/output/base.json @@ -0,0 +1,5 @@ +{ + "YearnLinearPoolFactory": "0x44d33798dddCdAbc93Fe6a40C80588033Dc502d3", + "MockYearnTokenVault": "0xDBf7B9F1d2Bfba14e42709f84dda3187eE410e38", + "MockYearnLinearPool": "0x369877467FC3B6774DE4E11E0c0AbBdE70Eb40FD" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/output/mainnet.json b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/output/mainnet.json new file mode 100644 index 0000000..4a917f0 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/output/mainnet.json @@ -0,0 +1,5 @@ +{ + "YearnLinearPoolFactory": "0x5F5222Ffa40F2AEd6380D022184D6ea67C776eE0", + "MockYearnTokenVault": "0x806E02Dea8d4a0882caD9fA3Fa75B212328692dE", + "MockYearnLinearPool": "0xAC5B4EF7eDe2F2843a704E96dcAA637F4BA3Dc3f" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/output/optimism.json b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/output/optimism.json new file mode 100644 index 0000000..3c1cf75 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/output/optimism.json @@ -0,0 +1,5 @@ +{ + "YearnLinearPoolFactory": "0x19DFEF0a828EEC0c85FbB335aa65437417390b85", + "MockYearnTokenVault": "0xb15608d28eb43378A7e7780aDD3fE9bC132bAf40", + "MockYearnLinearPool": "0x34557eF500Bfc060B8e3f2DA58EF725Bb7D32202" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/output/polygon.json b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/output/polygon.json new file mode 100644 index 0000000..05936d8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/output/polygon.json @@ -0,0 +1,5 @@ +{ + "YearnLinearPoolFactory": "0x0b576c1245F479506e7C8bbc4dB4db07C1CD31F9", + "MockYearnTokenVault": "0x28fa1E40011aDF98898E8243B2a48BB21EbF0C29", + "MockYearnLinearPool": "0xdae301690004946424E41051aCe1791083be42a1" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/output/sepolia.json b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/output/sepolia.json new file mode 100644 index 0000000..9bc6040 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/output/sepolia.json @@ -0,0 +1,5 @@ +{ + "YearnLinearPoolFactory": "0xAcf05BE5134d64d150d153818F8C67EE36996650", + "MockYearnTokenVault": "0x9129E834e15eA19b6069e8f08a8EcFc13686B8dC", + "MockYearnLinearPool": "0x016B7366F76aa2794097798B90CF239796AEff8d" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/output/zkevm.json b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/output/zkevm.json new file mode 100644 index 0000000..c48df6c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/output/zkevm.json @@ -0,0 +1,5 @@ +{ + "YearnLinearPoolFactory": "0x44d33798dddCdAbc93Fe6a40C80588033Dc502d3", + "MockYearnTokenVault": "0xDBf7B9F1d2Bfba14e42709f84dda3187eE410e38", + "MockYearnLinearPool": "0x02c9DCB975262719A61f9B40bDf0987eAD9Add3a" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/readme.md b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/readme.md new file mode 100644 index 0000000..613db27 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/readme.md @@ -0,0 +1,18 @@ +# 2023-04-09 - Yearn Linear Pool V2 + +Second deployment of the `YearnLinearPoolFactory`, for Linear Pools with a Yearn yield-bearing token. +Supersedes `20230213-yearn-linear-pool`, modifying the pool factory to use Create2 when deploying a new pool. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`YearnLinearPoolFactory` artifact](./artifact/YearnLinearPoolFactory.json) +- [`YearnLinearPool` artifact](./artifact/YearnLinearPool.json) +- [`YearnLinearPoolRebalancer` artifact](./artifact/YearnLinearPoolRebalancer.json) +- [`YearnShareValueHelper` artifact](./artifact/YearnShareValueHelper.json) diff --git a/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/test/task.fork.ts b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/test/task.fork.ts new file mode 100644 index 0000000..b78f9ca --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230409-yearn-linear-pool-v2/test/task.fork.ts @@ -0,0 +1,411 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { randomBytes } from 'ethers/lib/utils'; +import { BigNumber, Contract } from 'ethers'; +import { setCode } from '@nomicfoundation/hardhat-network-helpers'; +import * as expectEvent from '@helpers/expectEvent'; +import { bn, fp, FP_ONE } from '@helpers/numbers'; +import { MAX_UINT256 } from '@helpers/constants'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; + +import { impersonate, getForkedNetwork, Task, TaskMode, getSigners } from '@src'; +import { describeForkTest } from '@src'; +import { deploy, instanceAt, getArtifact } from '@src'; + +export enum SwapKind { + GivenIn = 0, + GivenOut, +} + +describeForkTest('YearnLinearPoolFactory', 'mainnet', 16610000, function () { + let owner: SignerWithAddress, holder: SignerWithAddress, other: SignerWithAddress; + let vault: Contract, mainToken: Contract; + let factory: Contract; + let rebalancer: Contract; + + let task: Task; + + const USDC = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'; + const yvUSDC = '0xa354F35829Ae975e850e23e9615b11Da1B3dC4DE'; + + const USDC_SCALING = bn(1e12); // USDC has 6 decimals, so its scaling factor is 1e12 + + const USDC_HOLDER = '0x7713974908Be4BEd47172370115e8b1219F4A5f0'; + + const SWAP_FEE_PERCENTAGE = fp(0.01); // 1% + + // The targets are set using 18 decimals, even if the token has fewer (as is the case for USDC); + const INITIAL_UPPER_TARGET = fp(1e5); + + // The initial midpoint (upper target / 2) must be between the final lower and upper targets + const FINAL_LOWER_TARGET = fp(0.2e5); + const FINAL_UPPER_TARGET = fp(5e5); + + const PROTOCOL_ID = 3; + const TASK_NAME = '20230409-yearn-linear-pool-v2'; + const VERSION = 2; + const SALT = randomBytes(32); + + enum AttackType { + SET_TARGETS, + SET_SWAP_FEE, + } + + let pool: Contract; + let poolId: string; + + before('run task', async () => { + task = new Task(TASK_NAME, TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('YearnLinearPoolFactory'); + }); + + before('load signers', async () => { + [, owner, other] = await getSigners(); + + holder = await impersonate(USDC_HOLDER, fp(100)); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + + mainToken = await task.instanceAt('IERC20', USDC); + await mainToken.connect(holder).approve(vault.address, MAX_UINT256); + }); + + enum LinearPoolState { + BALANCED, + MAIN_EXCESS, + MAIN_LACK, + } + + function itRebalancesThePool(expectedState: LinearPoolState) { + it('rebalance the pool', async () => { + const { lowerTarget, upperTarget } = await pool.getTargets(); + + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + + let fees; + if (scaledCash.gt(upperTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_EXCESS); + + const excess = scaledCash.sub(upperTarget); + fees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else if (scaledCash.lt(lowerTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_LACK); + + const lack = lowerTarget.sub(scaledCash); + fees = lack.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else { + expect(expectedState).to.equal(LinearPoolState.BALANCED); + + fees = 0; + } + + const initialRecipientMainBalance = await mainToken.balanceOf(other.address); + + if (expectedState != LinearPoolState.BALANCED) { + await rebalancer.connect(holder).rebalance(other.address); + } else { + await rebalancer.connect(holder).rebalanceWithExtraMain(other.address, 5); + } + const finalRecipientMainBalance = await mainToken.balanceOf(other.address); + + if (fees > 0) { + // The recipient of the rebalance call should get the fees that were collected (though there's some rounding + // error in the main-wrapped conversion). + expect(finalRecipientMainBalance.sub(initialRecipientMainBalance)).to.be.almostEqual( + fees.div(USDC_SCALING), + 0.0001 + ); + } else { + // The recipient of the rebalance call will get any extra main tokens that were not utilized. + expect(finalRecipientMainBalance).to.be.almostEqual(initialRecipientMainBalance, 0.0001); + } + + const mainInfo = await vault.getPoolTokenInfo(poolId, USDC); + + const expectedMainBalance = lowerTarget.add(upperTarget).div(2); + expect(mainInfo.cash.mul(USDC_SCALING)).to.equal(expectedMainBalance); + expect(mainInfo.managed).to.equal(0); + }); + } + + describe('create and check getters', () => { + it('deploy a linear pool', async () => { + const tx = await factory.create( + '', + '', + USDC, + yvUSDC, + INITIAL_UPPER_TARGET, + SWAP_FEE_PERCENTAGE, + owner.address, + PROTOCOL_ID, + SALT + ); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await task.instanceAt('YearnLinearPool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + const { assetManager } = await vault.getPoolTokenInfo(poolId, USDC); + rebalancer = await task.instanceAt('YearnLinearPoolRebalancer', assetManager); + }); + + it('check factory version', async () => { + const expectedFactoryVersion = { + name: 'YearnLinearPoolFactory', + version: VERSION, + deployment: TASK_NAME, + }; + + expect(await factory.version()).to.equal(JSON.stringify(expectedFactoryVersion)); + }); + + it('check pool version', async () => { + const expectedPoolVersion = { + name: 'YearnLinearPool', + version: VERSION, + deployment: TASK_NAME, + }; + + expect(await pool.version()).to.equal(JSON.stringify(expectedPoolVersion)); + }); + }); + + describe('join, and rebalance', () => { + it('join the pool', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const joinAmount = INITIAL_UPPER_TARGET.mul(2).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: USDC, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert join amount - some fees will be collected as we're going over the upper target. + const excess = joinAmount.mul(USDC_SCALING).sub(INITIAL_UPPER_TARGET); + const joinCollectedFees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + + const expectedBPT = joinAmount.mul(USDC_SCALING).sub(joinCollectedFees); + expect(await pool.balanceOf(holder.address)).to.equal(expectedBPT); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + + it('set final targets', async () => { + await expect(pool.connect(owner).setTargets(FINAL_LOWER_TARGET, FINAL_UPPER_TARGET)).to.not.be.reverted; + }); + }); + + describe('generate excess of main token and rebalance', () => { + before('approve the rebalancer', async () => { + await mainToken.connect(holder).approve(rebalancer.address, MAX_UINT256); // To send extra main on rebalance + }); + + it('deposit main tokens', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const { upperTarget } = await pool.getTargets(); + const joinAmount = upperTarget.mul(5).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: USDC, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + }); + + describe('generate lack of main token and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to withdraw enough man token to bring the Pool below its lower target, which will let us later + // rebalance. + + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_LACK); + }); + + describe('join below upper target and rebalance', () => { + it('deposit main tokens', async () => { + // We're going to join with few tokens, causing the Pool to not reach its upper target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const joinAmount = midpoint.div(100).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: USDC, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('exit above lower target and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to exit with few tokens, causing for the Pool to not reach its lower target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const exitAmount = midpoint.div(100).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalance repeatedly', () => { + itRebalancesThePool(LinearPoolState.BALANCED); + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalancer query protection', async () => { + it('reverts with a malicious lending pool', async () => { + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + + await setCode(yvUSDC, getArtifact('MockYearnTokenVault').deployedBytecode); + const mockYearnTokenVault = await instanceAt('MockYearnTokenVault', yvUSDC); + + await mockYearnTokenVault.setRevertType(2); // Type 2 is malicious swap query revert + await expect(rebalancer.rebalance(other.address)).to.be.revertedWith('BAL#357'); // MALICIOUS_QUERY_REVERT + }); + }); + + describe('read-only reentrancy protection', () => { + let attacker: Contract; + + before('deploy attacker', async () => { + // Using Reentrancy Attacker from Aave Fork Test (task 20230206-aave-rebalanced-linear-pool-v4) + attacker = await deploy('ReadOnlyReentrancyAttackerAaveLP', [vault.address]); + }); + + async function performAttack(attackType: AttackType, ethAmount: BigNumber, expectRevert: boolean) { + // To trigger the callback and revert, send more than we need for the deposit + // If we send just enough, there will be no "extra" ETH, and it won't trigger the callback and attack + const amountToSend = expectRevert ? ethAmount.add(1) : ethAmount; + + const attack = attacker.startAttack(pool.address, attackType, ethAmount, { value: amountToSend }); + if (expectRevert) { + await expect(attack).to.be.revertedWith('BAL#420'); + } else { + await expect(attack).to.not.be.reverted; + } + } + + function itPerformsAttack(expectRevert: boolean) { + const action = expectRevert ? 'triggers' : 'does not trigger'; + + context('set targets', () => { + it(`${action} the set targets attack`, async () => { + await performAttack(AttackType.SET_TARGETS, fp(1), expectRevert); + }); + }); + + context('set swap fee', () => { + it(`${action} the set swap fee attack`, async () => { + await performAttack(AttackType.SET_SWAP_FEE, fp(1), expectRevert); + }); + }); + } + + context('when exactly enough ETH is sent', () => { + itPerformsAttack(false); + }); + + context('when too much ETH is sent', () => { + itPerformsAttack(true); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/artifact/AaveLinearPool.json b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/artifact/AaveLinearPool.json new file mode 100644 index 0000000..7e4d266 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/artifact/AaveLinearPool.json @@ -0,0 +1,1245 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "AaveLinearPool", + "sourceName": "contracts/aave-v2-linear-pool/AaveLinearPool.sol", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "assetManager", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + } + ], + "internalType": "struct AaveLinearPool.ConstructorArgs", + "name": "args", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "paused", + "type": "bool" + } + ], + "name": "PausedStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "RecoveryModeStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + } + ], + "name": "SwapFeePercentageChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lowerTarget", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + } + ], + "name": "TargetsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "enableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBptIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMainIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMainToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getNextNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPausedState", + "outputs": [ + { + "internalType": "bool", + "name": "paused", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "pauseWindowEndTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodEndTime", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeesCollector", + "outputs": [ + { + "internalType": "contract IProtocolFeesCollector", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getScalingFactors", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSwapFeePercentage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTargets", + "outputs": [ + { + "internalType": "uint256", + "name": "lowerTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVirtualSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedTokenRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "inRecoveryMode", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onExitPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "dueProtocolFees", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onJoinPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "dueProtocolFees", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IERC20", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IPoolSwapStructs.SwapRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "indexIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "indexOut", + "type": "uint256" + } + ], + "name": "onSwap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IERC20", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IPoolSwapStructs.SwapRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "balanceTokenIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balanceTokenOut", + "type": "uint256" + } + ], + "name": "onSwap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryExit", + "outputs": [ + { + "internalType": "uint256", + "name": "bptIn", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryJoin", + "outputs": [ + { + "internalType": "uint256", + "name": "bptOut", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + } + ], + "name": "setSwapFeePercentage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newLowerTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newUpperTarget", + "type": "uint256" + } + ], + "name": "setTargets", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6102c06040523480156200001257600080fd5b50604051620059a3380380620059a3833981016040819052620000359162000e00565b6101608101518151602083015160408401516060850151608086015160c0870151620000618862000476565b60e08901516101008a01516101208b01516101408c01518a6200009e8160006200008c8c8c620004ff565b89620005b060201b620014241760201c565b8b8b86868686838387878b86336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000ed92919062000c89565b5080516200010390600490602084019062000c89565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001829050630163f5008311156101946200077e565b620001966276a7008211156101956200077e565b4291909101610140819052016101605260601b6001600160601b031916610180526101a08690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000dc1565b6001600160a01b03166101c0816001600160a01b031660601b8152505050505050505050876001600160a01b03166101e0816001600160a01b031660601b81525050866001600160a01b0316610200816001600160a01b031660601b81525050866001600160a01b0316886001600160a01b031610620002bb576002620002be565b60015b60ff16610220526001600160a01b0380881690891610620002e1576001620002e4565b60025b60ff1661024052620002f68862000793565b61026052620003058762000793565b610280526000620003188982896200083f565b620003238562000939565b5050505050505050505050506200034081620009c860201b60201c565b50620003e581608001516001600160a01b0316634800d97f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038357600080fd5b505afa15801562000398573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003be919062000dc1565b6001600160a01b031682606001516001600160a01b0316146102086200077e60201b60201c565b80608001516001600160a01b031663b4dcfc776040518163ffffffff1660e01b815260040160206040518083038186803b1580156200042357600080fd5b505afa15801562000438573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200045e919062000dc1565b60601b6001600160601b0319166102a052506200107d565b6040805160028082526060808301845292839291906020830190803683370190505090508260a0015181600081518110620004ad57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260a0015181600181518110620004e057fe5b6001600160a01b03909216602092830291909101909101529050919050565b60408051600280825260608281019093526001600160a01b03848116908616109183918160200160208202803683370190505090508162000541578362000543565b845b816000815181106200055157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050816200057e578462000580565b835b816001815181106200058e57fe5b6001600160a01b03909216602092830291909101909101529150505b92915050565b6000620005c883620009dd60201b620015d91760201c565b606083516001016001600160401b0381118015620005e557600080fd5b5060405190808252806020026020018201604052801562000610578160200160208202803683370190505b50905030816000815181106200062257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b845181101562000695578481815181106200065c57fe5b60200260200101518282600101815181106200067457fe5b6001600160a01b039092166020928302919091019091015260010162000645565b50606083516001016001600160401b0381118015620006b357600080fd5b50604051908082528060200260200182016040528015620006de578160200160208202803683370190505b509050600081600081518110620006f157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b845181101562000764578481815181106200072b57fe5b60200260200101518282600101815181106200074357fe5b6001600160a01b039092166020928302919091019091015260010162000714565b506200077387878484620009e9565b979650505050505050565b816200078f576200078f8162000ae3565b5050565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620007d057600080fd5b505afa158015620007e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200080b919062000f57565b60ff16905060006200082a60128362000af860201b620015e71760201c565b600a0a670de0b6b3a764000002949350505050565b620008508183111561014c6200077e565b6200086d6b0de0b6b39983494c589c000082111561014d6200077e565b62000887670de0b6b3a7640000825b06156101616200077e565b6200089b670de0b6b3a7640000836200087c565b620008ea670de0b6b3a7640000820460406020620008d4670de0b6b3a764000087600854919004602080620015fd62000b10821b17811c565b62000b1060201b620015fd17909392919060201c565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906200092c908590859062001026565b60405180910390a2505050565b6200094e64e8d4a5100082101560cb6200077e565b6200096667016345785d8a000082111560ca6200077e565b620009888160c0603f60085462000b1060201b620015fd17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90620009bd9083906200101d565b60405180910390a150565b80516200078f90600990602084019062000c89565b806200078f8162000b35565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040162000a1a919062001008565b602060405180830381600087803b15801562000a3557600080fd5b505af115801562000a4a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a70919062000de7565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000aa59084908890889060040162000f7a565b600060405180830381600087803b15801562000ac057600080fd5b505af115801562000ad5573d6000803e3d6000fd5b509298975050505050505050565b62000af5816210905360ea1b62000bc1565b50565b600062000b0a8383111560016200077e565b50900390565b600062000b1f84848462000c22565b506001901b60001901811b1992909216911b1790565b60028151101562000b465762000af5565b60008160008151811062000b5657fe5b602002602001015190506000600190505b825181101562000bbc57600083828151811062000b8057fe5b6020026020010151905062000bb1816001600160a01b0316846001600160a01b03161060656200077e60201b60201c565b915060010162000b67565b505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b62000c33610100831060646200077e565b62000c6c6001821015801562000c64575062000c6060ff846101000362000c7d60201b620016201760201c565b8211155b60646200077e565b62000bbc83821c156101b46200077e565b80820390821102900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000ccc57805160ff191683800117855562000cfc565b8280016001018555821562000cfc579182015b8281111562000cfc57825182559160200191906001019062000cdf565b5062000d0a92915062000d0e565b5090565b5b8082111562000d0a576000815560010162000d0f565b8051620005aa8162001067565b600082601f83011262000d43578081fd5b81516001600160401b0381111562000d59578182fd5b602062000d6f601f8301601f1916820162001034565b9250818352848183860101111562000d8657600080fd5b60005b8281101562000da657848101820151848201830152810162000d89565b8281111562000db85760008284860101525b50505092915050565b60006020828403121562000dd3578081fd5b815162000de08162001067565b9392505050565b60006020828403121562000df9578081fd5b5051919050565b60006020828403121562000e12578081fd5b81516001600160401b038082111562000e29578283fd5b818401915061018080838703121562000e40578384fd5b62000e4b8162001034565b905062000e59868462000d25565b815260208301518281111562000e6d578485fd5b62000e7b8782860162000d32565b60208301525060408301518281111562000e93578485fd5b62000ea18782860162000d32565b60408301525062000eb6866060850162000d25565b606082015262000eca866080850162000d25565b608082015262000ede8660a0850162000d25565b60a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014062000f208782860162000d25565b90820152610160838101518381111562000f38578586fd5b62000f468882870162000d32565b918301919091525095945050505050565b60006020828403121562000f69578081fd5b815160ff8116811462000de0578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000fc65762000fb385516200105b565b8352938301939183019160010162000f9e565b505084810360408601528551808252908201925081860190845b8181101562000ad55762000ff583516200105b565b8552938301939183019160010162000fe0565b60208101600383106200101757fe5b91905290565b90815260200190565b918252602082015260400190565b6040518181016001600160401b03811182821017156200105357600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b038116811462000af557600080fd5b60805160a05160c05160e0516101005160601c6101205160601c61014051610160516101805160601c6101a0516101c05160601c6101e05160601c6102005160601c610220516102405161026051610280516102a05160601c61478c62001217600039806118435250806107f45250806107905280612a93525080610718528061081c5280610c515280612f0e528061309752806131cf52806132da5280613457528061358f5250806107b252806109bc5280610c175280612eda528061301c52806130635280613159528061319b52806132a652806133e152806134235280613519528061355b5250806113f852806126fd52806127c95280612ab95280612e8f5280612fa8528061325c528061336d5250806109e052806110ee5280611ac35280611b6252806126b452806127805280612a585280612e505280612f5252806130e5528061321d528061331e52806134a55250806111cc5250806109495250508061181d5250806117f9525080610fd1525080610fad525080610f5d5250806123f1525080612433525080612412525061478c6000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e3660046140c0565b610608565b6040516103509190614453565b60405180910390f35b610361610668565b6040516103509190614697565b61038161037c366004613e92565b6106ff565b6040516103509190614430565b610343610716565b61034361073a565b6103a6610740565b6040516103509392919061443b565b6103bd610769565b60405161035091906143f8565b6103816103d8366004613de2565b610877565b6103e56108ed565b60405161035091906146d1565b6103436108f6565b61040d61040836600461417d565b610905565b005b610343610947565b610381610425366004613e92565b61096b565b61040d6109a6565b6103436109ba565b6104426109de565b604051610350919061434d565b61040d610a02565b610361610a56565b610343610ab7565b61047a610475366004613fc1565b610aca565b6040516103509291906146aa565b610490610ae8565b6040516103509291906146c3565b610343610b26565b6103436104b4366004613d8e565b610cbb565b6104cc6104c7366004613fc1565b610cda565b60405161035092919061440b565b6103436104e8366004613d8e565b610d9c565b61040d610da7565b610343610f42565b61040d610f47565b610343610513366004614064565b610f59565b610442610fab565b610442610fcf565b610343610536366004613d8e565b610ff3565b61036161100e565b610343610551366004614131565b61106f565b61040d610564366004614195565b6110a8565b610381610577366004613e92565b61111a565b61038161058a366004613e92565b611158565b610442611165565b61038161116f565b61040d611180565b6104426111ca565b61040d6105bd366004613e22565b6111ee565b6104cc6105d0366004613fc1565b61126f565b6103436105e3366004613daa565b611306565b610343611343565b6103436113ec565b6104426113f6565b61034361141a565b6000846080015161063561061a610fcf565b6001600160a01b0316336001600160a01b03161460cd61162c565b61064a610640610947565b82146101f461162c565b61065261163a565b61065e8686868661164d565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b505050505090505b90565b600061070c338484611772565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074d6117da565b1592506107586117f7565b915061076261181b565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107db57fe5b6020026020010181815250506108196107f261183f565b7f00000000000000000000000000000000000000000000000000000000000000009061192d565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084557fe5b602002602001018181525050670de0b6b3a76400008160008151811061086757fe5b6020908102919091010152905090565b6000806108848533611306565b90506108a8336001600160a01b03871614806108a05750838210155b61019e61162c565b6108b3858585611965565b336001600160a01b038616148015906108ce57506000198114155b156108e0576108e08533858403611772565b60019150505b9392505050565b60055460ff1690565b60006109006113ec565b905090565b61090d611a45565b610915611a8e565b600080610920610ae8565b915091506109396109318383611a9e565b61014f61162c565b61094283611ba5565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070c9185906109a19086611c1d565b611772565b6109ae611a45565b6109b86000611c2f565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a0a611a45565b610a12611cc0565b610a1c6001611cd4565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4c9190614430565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906109009060c0603f611d16565b60006060610adc888785611d25611d3c565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0582602080611d16565b029250670de0b6b3a7640000610b1e8260406020611d16565b029150509091565b600080610b31610947565b90506060610b3d610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b689190614453565b60006040518083038186803b158015610b8057600080fd5b505afa158015610b94573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbc9190810190613ebd565b50915050610bd181610bcc610769565b611ea3565b600080610bdc610ae8565b91509150610be8613aff565b6040518060600160405280610bfb610ab7565b81526020018481526020018381525090506000610c87610c4e867f000000000000000000000000000000000000000000000000000000000000000081518110610c4057fe5b602002602001015184611f0c565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7a57fe5b6020026020010151611f6d565b9050610cb0610ca986600081518110610c9c57fe5b6020026020010151611f79565b8290611f8d565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce961061a610fcf565b610cf4610640610947565b6000610cff85611fe4565b15610d2757610d0c612013565b610d1e88610d1861073a565b87612026565b94509050610d3f565b610d2f61163a565b610d3a8a8987611d25565b945090505b610d498a8261211c565b835167ffffffffffffffff81118015610d6157600080fd5b50604051908082528060200260200182016040528015610d8b578160200160208202803683370190505b509250505097509795505050505050565b600061071082610ff3565b6000610db1610947565b90506060610dbd610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de89190614453565b60006040518083038186803b158015610e0057600080fd5b505afa158015610e14573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3c9190810190613ebd565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e8057fe5b602002602001018181525050610e94613b20565b6040518060800160405280610ea8856106fc565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed9610fcf565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f0a949392919061447b565b600060405180830381600087803b158015610f2457600080fd5b505af1158015610f38573d6000803e3d6000fd5b5050505050505050565b600090565b610f4f611a45565b6109b86001611c2f565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8e9291906142d7565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108161061a610fcf565b61108c610640610947565b61109461163a565b61109f858585612126565b95945050505050565b6110b0611a45565b6110b8611a8e565b6000806110c3610ae8565b915091506110d46109318383611a9e565b6110e96110e18585611a9e565b61015761162c565b6111147f00000000000000000000000000000000000000000000000000000000000000008585612133565b50505050565b6000806111273385611306565b90508083106111415761113c33856000611772565b61114e565b61114e3385858403611772565b5060019392505050565b600061070c338484611965565b6000610900612209565b6008546000906109009060ff612283565b611188611a45565b611190612013565b61119a6000611cd4565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4c9190614430565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121d8c610ff3565b8960405160200161123396959493929190614568565b604051602081830303815290604052805190602001209050611264888261125b87878761228a565b886101f86122c9565b610f38888888611772565b6060808861127e61061a610fcf565b611289610640610947565b600061129361163a565b61129b61073a565b6112ed576112aa8a8a87612320565b945090506112c36112b9610f42565b82101560cc61162c565b6112d560006112d0610f42565b6123b8565b6112e8896112e1610f42565b83036123b8565b610d49565b6112f88a8987611d25565b94509050610d4989826123b8565b6000611310610fcf565b6001600160a01b0316826001600160a01b031614156113325750600019610710565b61133c83836123c2565b9050610710565b6000806000611350610fcf565b6001600160a01b031663b05f8e48611366610947565b306040518363ffffffff1660e01b815260040161138492919061464e565b60806040518083038186803b15801561139c57600080fd5b505afa1580156113b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d491906141b6565b5050915091506113e5818301611f79565b9250505090565b60006109006123ed565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061090061183f565b600061142f836115d9565b6060835160010167ffffffffffffffff8111801561144c57600080fd5b50604051908082528060200260200182016040528015611476578160200160208202803683370190505b509050308160008151811061148757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f6578481815181106114bf57fe5b60200260200101518282600101815181106114d657fe5b6001600160a01b03909216602092830291909101909101526001016114aa565b506060835160010167ffffffffffffffff8111801561151457600080fd5b5060405190808252806020026020018201604052801561153e578160200160208202803683370190505b50905060008160008151811061155057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115bf5784818151811061158857fe5b602002602001015182826001018151811061159f57fe5b6001600160a01b0390921660209283029190910190910152600101611573565b506115cc8787848461248a565b925050505b949350505050565b806115e381612593565b5050565b60006115f783831115600161162c565b50900390565b600061160a84848461260c565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e3576115e381612652565b6109b86116456117da565b61019261162c565b60006116696003841080156116625750600383105b606461162c565b6060611673610769565b905061167f8582611ea3565b60008061168a610ae8565b91509150611696613aff565b60405180606001604052806116a9610ab7565b81526020810185905260400183905290506000895160018111156116c957fe5b141561172d576116f089606001518589815181106116e357fe5b602002602001015161267c565b60608a015260006117028a8a84612688565b90506117218186898151811061171457fe5b602002602001015161274f565b955050505050506115d1565b61174189606001518588815181106116e357fe5b60608a015260006117538a8a8461275b565b905061172181868a8151811061176557fe5b6020026020010151612810565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cd908590614453565b60405180910390a3505050565b60006117e461181b565b42118061090057505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d15e00536118786109de565b6040518263ffffffff1660e01b8152600401611894919061434d565b60206040518083038186803b1580156118ac57600080fd5b505afa9250505080156118dc575060408051601f3d908101601f191682019092526118d991810190613fa9565b60015b61191f573d80801561190a576040519150601f19603f3d011682016040523d82523d6000602084013e61190f565b606091505b506119198161281c565b506106fc565b633b9aca00900490506106fc565b600082820261195184158061194a57508385838161194757fe5b04145b600361162c565b670de0b6b3a7640000815b04949350505050565b61197c6001600160a01b038416151561019861162c565b6119936001600160a01b038316151561019961162c565b61199e838383610942565b6001600160a01b0383166000908152602081905260409020546119c490826101a06128a3565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119f39082611c1d565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cd908590614453565b6000611a746000357fffffffff0000000000000000000000000000000000000000000000000000000016610f59565b9050611a8b611a8382336128b9565b61019161162c565b50565b6109b8611a99610fcf565b6129a2565b6000806000611aab610fcf565b6001600160a01b031663b05f8e48611ac1610947565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611aff92919061464e565b60806040518083038186803b158015611b1757600080fd5b505afa158015611b2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4f91906141b6565b5050915091506000611b8b828401611b867f0000000000000000000000000000000000000000000000000000000000000000612a54565b61267c565b905085811015801561065e57509390931115949350505050565b611bb864e8d4a5100082101560cb61162c565b611bce67016345785d8a000082111560ca61162c565b600854611bdf908260c0603f6115fd565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611c12908390614453565b60405180910390a150565b60008282016108e6848210158361162c565b8015611c4f57611c4a611c406117f7565b421061019361162c565b611c64565b611c64611c5a61181b565b42106101a961162c565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611c12908390614430565b6109b8611ccb61116f565b156101b561162c565b600854611ce3908260ff612b2e565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611c12908390614430565b6001901b6000190191901c1690565b60006060611d346103e6612652565b935093915050565b333014611e2b576000306001600160a01b0316600036604051611d60929190614307565b6000604051808303816000865af19150503d8060008114611d9d576040519150601f19603f3d011682016040523d82523d6000602084013e611da2565b606091505b505090508060008114611db157fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611e0d573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611e3e8686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611eb2908290612b3d565b60005b8181101561111457611eed848281518110611ecc57fe5b6020026020010151848381518110611ee057fe5b602002602001015161192d565b848281518110611ef957fe5b6020908102919091010152600101611eb5565b60008160200151831015611f455781516020830151600091611f31918690039061192d565b9050611f3d84826115e7565b915050610710565b81604001518311611f57575081610710565b81516040830151600091611f319186039061192d565b60006108e68383611c1d565b600061071082611f8761073a565b906115e7565b6000611f9c821515600461162c565b670de0b6b3a76400008302611fce841580611fc75750670de0b6b3a7640000858381611fc457fe5b04145b600561162c565b6001836001830304018115150291505092915050565b6000808251118015610710575060ff80168280602001905181019061200991906141f6565b60ff161492915050565b6109b861201e61116f565b6101b661162c565b60006060600061203584612b4a565b90506060865167ffffffffffffffff8111801561205157600080fd5b5060405190808252806020026020018201604052801561207b578160200160208202803683370190505b5090506000612088610f42565b9050600061209b898381518110610c9c57fe5b905060006120a98583612b60565b905060005b8a5181101561210b57838114156120c65760006120ec565b6120ec828c83815181106120d657fe5b602002602001015161192d90919063ffffffff16565b8582815181106120f857fe5b60209081029190910101526001016120ae565b509399929850919650505050505050565b6115e38282612ba0565b60006108e66103e6612652565b6121428183111561014c61162c565b61215d6b0de0b6b39983494c589c000082111561014d61162c565b612175670de0b6b3a7640000825b061561016161162c565b612187670de0b6b3a76400008361216b565b6121bc670de0b6b3a76400008204604060206121b4670de0b6b3a7640000876008549190046020806115fd565b9291906115fd565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121fc90859085906146c3565b60405180910390a2505050565b6000612213610fcf565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561224b57600080fd5b505afa15801561225f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090091906140a4565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b60006122d485612c6c565b90506122ea6122e4878387612c88565b8361162c565b6122f9428410156101b861162c565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b6000606061233b6001600160a01b038616301461015661162c565b6123526001600160a01b038516301461015661162c565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff816000815181106123a157fe5b602090810291909101015290969095509350505050565b6115e38282612d37565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061245a612dca565b3060405160200161246f959493929190614622565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016124b99190614683565b602060405180830381600087803b1580156124d357600080fd5b505af11580156124e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250b9190613fa9565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d2906125579084908890889060040161459c565b600060405180830381600087803b15801561257157600080fd5b505af1158015612585573d6000803e3d6000fd5b509298975050505050505050565b6002815110156125a257611a8b565b6000816000815181106125b157fe5b602002602001015190506000600190505b82518110156109425760008382815181106125d957fe5b60200260200101519050612602816001600160a01b0316846001600160a01b031610606561162c565b91506001016125c2565b61261b6101008310606461162c565b61264360018210158015611662575061263960ff8461010003611620565b821115606461162c565b61094283821c156101b461162c565b611a8b817f42414c0000000000000000000000000000000000000000000000000000000000612dce565b60006108e6838361192d565b60208301516000906001600160a01b03163014156126b2576126ab848484612e49565b90506108e6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b031614156126fb576126ab848484612fa1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612744576126ab8484846130de565b6108e6610135612652565b60006108e68383612b60565b60408301516000906001600160a01b031630141561277e576126ab848484613216565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127c7576126ab848484613366565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b03161415612744576126ab84848461349e565b60006108e68383611f8d565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417612897578160208401fd5b506115e3610165612652565b60006128b2848411158361162c565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128d8610fab565b6001600160a01b0316141580156128f357506128f3836135d6565b1561291b57612900610fab565b6001600160a01b0316336001600160a01b0316149050610710565b612923612209565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016129529392919061445c565b60206040518083038186803b15801561296a57600080fd5b505afa15801561297e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133c9190613f89565b604080516000808252602082019092526060916129d5565b6129c2613b4a565b8152602001906001900390816129ba5790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e8490612a1e908490600401614361565b600060405180830381600087803b158015612a3857600080fd5b505af1158015612a4c573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612ab757507f0000000000000000000000000000000000000000000000000000000000000000610cd5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612b0357612afc6107f261183f565b9050610cd5565b6001600160a01b038216301415612b235750670de0b6b3a7640000610cd5565b610cd5610135612652565b6001811b1992909216911b1790565b6115e3818314606761162c565b6000818060200190518101906108e69190614212565b6000612b6f821515600461162c565b670de0b6b3a76400008302612b97841580611fc75750670de0b6b3a7640000858381611fc457fe5b82818161195c57fe5b612bb76001600160a01b038316151561019b61162c565b612bc382600083610942565b6001600160a01b038216600090815260208190526040902054612be990826101b26128a3565b6001600160a01b038316600090815260208190526040902055612c1c612c1782612c1161073a565b9061363a565b613648565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c609190614453565b60405180910390a35050565b6000612c766123ed565b82604051602001610f8e929190614317565b6000612c9a82516041146101b961162c565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612cd3908990859088908890614665565b6020604051602081039080840390855afa158015612cf5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612d2b5750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612d4360008383610942565b612d58612c1782612d5261073a565b90611c1d565b6001600160a01b038216600090815260208190526040902054612d7b9082611c1d565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c60908590614453565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612ecf7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162c565b6115d18460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f0357fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f3757fe5b6020026020010151612f4f87600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612f955761364d612f99565b6136ab5b63ffffffff16565b6000612ffd7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec7575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b03163014613058576130538460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061304557fe5b602002602001015184613714565b6115d1565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061308c57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130c057fe5b60200260200101516130d887600081518110610c9c57fe5b86613744565b600061313a7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec7575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b03163014613190576130538460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061318257fe5b6020026020010151846137aa565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131c457fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106131f857fe5b602002602001015161321087600081518110610c9c57fe5b866137ea565b600061329b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162c565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132cf57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061330357fe5b602002602001015161331b87600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461336157613851612f99565b6138a8565b60006133c27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec7575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b03163014613418576130538460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061340a57fe5b602002602001015184613912565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061344c57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061348057fe5b602002602001015161349887600081518110610c9c57fe5b8661393c565b60006134fa7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec7575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b03163014613550576130538460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061354257fe5b60200260200101518461398b565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061358457fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106135b857fe5b60200260200101516135d087600081518110610c9c57fe5b866139c0565b60006136017f9f11080e00000000000000000000000000000000000000000000000000000000610f59565b82148061071057506136327f38e9922e00000000000000000000000000000000000000000000000000000000610f59565b909114919050565b60006108e6838360016128a3565b600255565b60008061365a8684611f0c565b905060006136688287611f6d565b90506000613676868a6115e7565b9050600061369184611f8761368b8587613a14565b8a613a2e565b905061369d88826115e7565b9a9950505050505050505050565b6000806136b88684611f0c565b905060006136c68287611f6d565b905060006136dd6136d7838b613a14565b87613a4f565b905060006136eb84836115e7565b905060006136f98288613a6f565b90506137058a826115e7565b9b9a5050505050505050505050565b6000806137218484611f0c565b905060006137386137328688611c1d565b85611f0c565b905061065e81836115e7565b60008261375c576137558683611f0c565b905061109f565b60006137688684611f0c565b90506000613779613732888a611c1d565b9050600061378782846115e7565b905060006137958489611f6d565b905061369d6137a48884613a14565b82613a4f565b6000806137b78484611f0c565b905060006137c582876115e7565b905060006137d38286613a6f565b90506137df86826115e7565b979650505050505050565b6000826137f857508461109f565b60006138048684611f0c565b905060006138128287611f6d565b90506000613820878a611c1d565b9050600061382e8483611f6d565b9050600061384561383f8984613a14565b85613a4f565b905061370581896115e7565b60008261385f57508461109f565b600061386b8684611f0c565b905060006138798287611f6d565b90506000613887868a611c1d565b9050600061389c84611f8761368b8587613a14565b905061369d81896115e7565b6000826138b9576137558683613a6f565b60006138c58684611f0c565b905060006138d38287611f6d565b905060006138ea6138e4838b613a14565b87613a2e565b905060006138f88483611c1d565b905060006139068288613a6f565b9050613705818b6115e7565b60008061391f8484611f0c565b9050600061393061373286886115e7565b905061065e82826115e7565b6000806139498684611f0c565b9050600061395a613732888a6115e7565b9050600061396883836115e7565b905060006139768489611f6d565b905061369d6139858884613a14565b82613a2e565b6000806139988484611f0c565b905060006139a68287611c1d565b905060006139b48286613a6f565b90506137df81876115e7565b6000806139cd8684611f0c565b905060006139db8287611f6d565b905060006139e9878a6115e7565b905060006139f78483611f6d565b90506000613a0861383f8984613a14565b905061370588826115e7565b60008282026108e684158061194a57508385838161194757fe5b6000613a3d821515600461162c565b50811515600019909201046001010290565b6000613a5e821515600461162c565b818381613a6757fe5b049392505050565b60008160200151831015613ab857815161133c90613a9690670de0b6b3a764000090611c1d565b60208401518451613ab291613aab919061192d565b8690611c1d565b90612b60565b81604001518311613aca575081610710565b815161133c90613ae390670de0b6b3a7640000906115e7565b60408401518451613ab291613af8919061192d565b86906115e7565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561071081614732565b600082601f830112613b95578081fd5b8135613ba8613ba382614706565b6146df565b818152915060208083019084810181840286018201871015613bc957600080fd5b60005b84811015613be857813584529282019290820190600101613bcc565b505050505092915050565b600082601f830112613c03578081fd5b8151613c11613ba382614706565b818152915060208083019084810181840286018201871015613c3257600080fd5b60005b84811015613be857815184529282019290820190600101613c35565b600082601f830112613c61578081fd5b813567ffffffffffffffff811115613c77578182fd5b613c8a6020601f19601f840116016146df565b9150808252836020828501011115613ca157600080fd5b8060208401602084013760009082016020015292915050565b80356002811061071057600080fd5b6000610120808385031215613cdc578182fd5b613ce5816146df565b915050613cf28383613cba565b8152613d018360208401613b7a565b6020820152613d138360408401613b7a565b6040820152606082013560608201526080820135608082015260a082013560a0820152613d438360c08401613b7a565b60c0820152613d558360e08401613b7a565b60e08201526101008083013567ffffffffffffffff811115613d7657600080fd5b613d8285828601613c51565b82840152505092915050565b600060208284031215613d9f578081fd5b81356108e681614732565b60008060408385031215613dbc578081fd5b8235613dc781614732565b91506020830135613dd781614732565b809150509250929050565b600080600060608486031215613df6578081fd5b8335613e0181614732565b92506020840135613e1181614732565b929592945050506040919091013590565b600080600080600080600060e0888a031215613e3c578283fd5b8735613e4781614732565b96506020880135613e5781614732565b955060408801359450606088013593506080880135613e7581614747565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613ea4578182fd5b8235613eaf81614732565b946020939093013593505050565b600080600060608486031215613ed1578081fd5b835167ffffffffffffffff80821115613ee8578283fd5b818601915086601f830112613efb578283fd5b8151613f09613ba382614706565b80828252602080830192508086018b828387028901011115613f29578788fd5b8796505b84871015613f54578051613f4081614732565b845260019690960195928101928101613f2d565b508901519097509350505080821115613f6b578283fd5b50613f7886828701613bf3565b925050604084015190509250925092565b600060208284031215613f9a578081fd5b815180151581146108e6578182fd5b600060208284031215613fba578081fd5b5051919050565b600080600080600080600060e0888a031215613fdb578081fd5b873596506020880135613fed81614732565b95506040880135613ffd81614732565b9450606088013567ffffffffffffffff80821115614019578283fd5b6140258b838c01613b85565b955060808a0135945060a08a0135935060c08a0135915080821115614048578283fd5b506140558a828b01613c51565b91505092959891949750929550565b600060208284031215614075578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e6578182fd5b6000602082840312156140b5578081fd5b81516108e681614732565b600080600080608085870312156140d5578182fd5b843567ffffffffffffffff808211156140ec578384fd5b6140f888838901613cc9565b9550602087013591508082111561410d578384fd5b5061411a87828801613b85565b949794965050505060408301359260600135919050565b600080600060608486031215614145578081fd5b833567ffffffffffffffff81111561415b578182fd5b61416786828701613cc9565b9660208601359650604090950135949350505050565b60006020828403121561418e578081fd5b5035919050565b600080604083850312156141a7578182fd5b50508035926020909101359150565b600080600080608085870312156141cb578182fd5b84519350602085015192506040850151915060608501516141eb81614732565b939692955090935050565b600060208284031215614207578081fd5b81516108e681614747565b60008060408385031215614224578182fd5b825161422f81614747565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b8381101561427b5781518752958201959082019060010161425f565b509495945050505050565b15159052565b60008151808452815b818110156142b157602081850181015186830182015201614295565b818111156142c25782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b828110156143eb57815180516004811061439457fe5b8552808701516143a68887018261423f565b5085810151868601526060808201516143c18288018261423f565b5050608090810151906143d68682018361423f565b505060a093909301929085019060010161437e565b5091979650505050505050565b6000602082526108e6602083018461424c565b60006040825261441e604083018561424c565b828103602084015261109f818561424c565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156144ec576144d68451614726565b82529284019260019290920191908401906144c4565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a087015261452a818561424c565b935050506040850151818584030160c0860152614547838261428c565b92505050606084015161455d60e0850182614286565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b818110156145e4576145d28551614726565b835293830193918301916001016145c0565b505084810360408601528551808252908201925081860190845b81811015612585576146108351614726565b855293830193918301916001016145fe565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016003831061469157fe5b91905290565b6000602082526108e6602083018461428c565b6000838252604060208301526115d1604083018461424c565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156146fe57600080fd5b604052919050565b600067ffffffffffffffff82111561471c578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114611a8b57600080fd5b60ff81168114611a8b57600080fdfea26469706673582212200ebdd998c1044b1cc5a951f1955002ce126260246551333654d652ade70c43c664736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e3660046140c0565b610608565b6040516103509190614453565b60405180910390f35b610361610668565b6040516103509190614697565b61038161037c366004613e92565b6106ff565b6040516103509190614430565b610343610716565b61034361073a565b6103a6610740565b6040516103509392919061443b565b6103bd610769565b60405161035091906143f8565b6103816103d8366004613de2565b610877565b6103e56108ed565b60405161035091906146d1565b6103436108f6565b61040d61040836600461417d565b610905565b005b610343610947565b610381610425366004613e92565b61096b565b61040d6109a6565b6103436109ba565b6104426109de565b604051610350919061434d565b61040d610a02565b610361610a56565b610343610ab7565b61047a610475366004613fc1565b610aca565b6040516103509291906146aa565b610490610ae8565b6040516103509291906146c3565b610343610b26565b6103436104b4366004613d8e565b610cbb565b6104cc6104c7366004613fc1565b610cda565b60405161035092919061440b565b6103436104e8366004613d8e565b610d9c565b61040d610da7565b610343610f42565b61040d610f47565b610343610513366004614064565b610f59565b610442610fab565b610442610fcf565b610343610536366004613d8e565b610ff3565b61036161100e565b610343610551366004614131565b61106f565b61040d610564366004614195565b6110a8565b610381610577366004613e92565b61111a565b61038161058a366004613e92565b611158565b610442611165565b61038161116f565b61040d611180565b6104426111ca565b61040d6105bd366004613e22565b6111ee565b6104cc6105d0366004613fc1565b61126f565b6103436105e3366004613daa565b611306565b610343611343565b6103436113ec565b6104426113f6565b61034361141a565b6000846080015161063561061a610fcf565b6001600160a01b0316336001600160a01b03161460cd61162c565b61064a610640610947565b82146101f461162c565b61065261163a565b61065e8686868661164d565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b505050505090505b90565b600061070c338484611772565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074d6117da565b1592506107586117f7565b915061076261181b565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107db57fe5b6020026020010181815250506108196107f261183f565b7f00000000000000000000000000000000000000000000000000000000000000009061192d565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084557fe5b602002602001018181525050670de0b6b3a76400008160008151811061086757fe5b6020908102919091010152905090565b6000806108848533611306565b90506108a8336001600160a01b03871614806108a05750838210155b61019e61162c565b6108b3858585611965565b336001600160a01b038616148015906108ce57506000198114155b156108e0576108e08533858403611772565b60019150505b9392505050565b60055460ff1690565b60006109006113ec565b905090565b61090d611a45565b610915611a8e565b600080610920610ae8565b915091506109396109318383611a9e565b61014f61162c565b61094283611ba5565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070c9185906109a19086611c1d565b611772565b6109ae611a45565b6109b86000611c2f565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a0a611a45565b610a12611cc0565b610a1c6001611cd4565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4c9190614430565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906109009060c0603f611d16565b60006060610adc888785611d25611d3c565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0582602080611d16565b029250670de0b6b3a7640000610b1e8260406020611d16565b029150509091565b600080610b31610947565b90506060610b3d610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b689190614453565b60006040518083038186803b158015610b8057600080fd5b505afa158015610b94573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbc9190810190613ebd565b50915050610bd181610bcc610769565b611ea3565b600080610bdc610ae8565b91509150610be8613aff565b6040518060600160405280610bfb610ab7565b81526020018481526020018381525090506000610c87610c4e867f000000000000000000000000000000000000000000000000000000000000000081518110610c4057fe5b602002602001015184611f0c565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7a57fe5b6020026020010151611f6d565b9050610cb0610ca986600081518110610c9c57fe5b6020026020010151611f79565b8290611f8d565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce961061a610fcf565b610cf4610640610947565b6000610cff85611fe4565b15610d2757610d0c612013565b610d1e88610d1861073a565b87612026565b94509050610d3f565b610d2f61163a565b610d3a8a8987611d25565b945090505b610d498a8261211c565b835167ffffffffffffffff81118015610d6157600080fd5b50604051908082528060200260200182016040528015610d8b578160200160208202803683370190505b509250505097509795505050505050565b600061071082610ff3565b6000610db1610947565b90506060610dbd610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de89190614453565b60006040518083038186803b158015610e0057600080fd5b505afa158015610e14573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3c9190810190613ebd565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e8057fe5b602002602001018181525050610e94613b20565b6040518060800160405280610ea8856106fc565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed9610fcf565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f0a949392919061447b565b600060405180830381600087803b158015610f2457600080fd5b505af1158015610f38573d6000803e3d6000fd5b5050505050505050565b600090565b610f4f611a45565b6109b86001611c2f565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8e9291906142d7565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108161061a610fcf565b61108c610640610947565b61109461163a565b61109f858585612126565b95945050505050565b6110b0611a45565b6110b8611a8e565b6000806110c3610ae8565b915091506110d46109318383611a9e565b6110e96110e18585611a9e565b61015761162c565b6111147f00000000000000000000000000000000000000000000000000000000000000008585612133565b50505050565b6000806111273385611306565b90508083106111415761113c33856000611772565b61114e565b61114e3385858403611772565b5060019392505050565b600061070c338484611965565b6000610900612209565b6008546000906109009060ff612283565b611188611a45565b611190612013565b61119a6000611cd4565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4c9190614430565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121d8c610ff3565b8960405160200161123396959493929190614568565b604051602081830303815290604052805190602001209050611264888261125b87878761228a565b886101f86122c9565b610f38888888611772565b6060808861127e61061a610fcf565b611289610640610947565b600061129361163a565b61129b61073a565b6112ed576112aa8a8a87612320565b945090506112c36112b9610f42565b82101560cc61162c565b6112d560006112d0610f42565b6123b8565b6112e8896112e1610f42565b83036123b8565b610d49565b6112f88a8987611d25565b94509050610d4989826123b8565b6000611310610fcf565b6001600160a01b0316826001600160a01b031614156113325750600019610710565b61133c83836123c2565b9050610710565b6000806000611350610fcf565b6001600160a01b031663b05f8e48611366610947565b306040518363ffffffff1660e01b815260040161138492919061464e565b60806040518083038186803b15801561139c57600080fd5b505afa1580156113b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d491906141b6565b5050915091506113e5818301611f79565b9250505090565b60006109006123ed565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061090061183f565b600061142f836115d9565b6060835160010167ffffffffffffffff8111801561144c57600080fd5b50604051908082528060200260200182016040528015611476578160200160208202803683370190505b509050308160008151811061148757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f6578481815181106114bf57fe5b60200260200101518282600101815181106114d657fe5b6001600160a01b03909216602092830291909101909101526001016114aa565b506060835160010167ffffffffffffffff8111801561151457600080fd5b5060405190808252806020026020018201604052801561153e578160200160208202803683370190505b50905060008160008151811061155057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115bf5784818151811061158857fe5b602002602001015182826001018151811061159f57fe5b6001600160a01b0390921660209283029190910190910152600101611573565b506115cc8787848461248a565b925050505b949350505050565b806115e381612593565b5050565b60006115f783831115600161162c565b50900390565b600061160a84848461260c565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e3576115e381612652565b6109b86116456117da565b61019261162c565b60006116696003841080156116625750600383105b606461162c565b6060611673610769565b905061167f8582611ea3565b60008061168a610ae8565b91509150611696613aff565b60405180606001604052806116a9610ab7565b81526020810185905260400183905290506000895160018111156116c957fe5b141561172d576116f089606001518589815181106116e357fe5b602002602001015161267c565b60608a015260006117028a8a84612688565b90506117218186898151811061171457fe5b602002602001015161274f565b955050505050506115d1565b61174189606001518588815181106116e357fe5b60608a015260006117538a8a8461275b565b905061172181868a8151811061176557fe5b6020026020010151612810565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cd908590614453565b60405180910390a3505050565b60006117e461181b565b42118061090057505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d15e00536118786109de565b6040518263ffffffff1660e01b8152600401611894919061434d565b60206040518083038186803b1580156118ac57600080fd5b505afa9250505080156118dc575060408051601f3d908101601f191682019092526118d991810190613fa9565b60015b61191f573d80801561190a576040519150601f19603f3d011682016040523d82523d6000602084013e61190f565b606091505b506119198161281c565b506106fc565b633b9aca00900490506106fc565b600082820261195184158061194a57508385838161194757fe5b04145b600361162c565b670de0b6b3a7640000815b04949350505050565b61197c6001600160a01b038416151561019861162c565b6119936001600160a01b038316151561019961162c565b61199e838383610942565b6001600160a01b0383166000908152602081905260409020546119c490826101a06128a3565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119f39082611c1d565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cd908590614453565b6000611a746000357fffffffff0000000000000000000000000000000000000000000000000000000016610f59565b9050611a8b611a8382336128b9565b61019161162c565b50565b6109b8611a99610fcf565b6129a2565b6000806000611aab610fcf565b6001600160a01b031663b05f8e48611ac1610947565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611aff92919061464e565b60806040518083038186803b158015611b1757600080fd5b505afa158015611b2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4f91906141b6565b5050915091506000611b8b828401611b867f0000000000000000000000000000000000000000000000000000000000000000612a54565b61267c565b905085811015801561065e57509390931115949350505050565b611bb864e8d4a5100082101560cb61162c565b611bce67016345785d8a000082111560ca61162c565b600854611bdf908260c0603f6115fd565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611c12908390614453565b60405180910390a150565b60008282016108e6848210158361162c565b8015611c4f57611c4a611c406117f7565b421061019361162c565b611c64565b611c64611c5a61181b565b42106101a961162c565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611c12908390614430565b6109b8611ccb61116f565b156101b561162c565b600854611ce3908260ff612b2e565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611c12908390614430565b6001901b6000190191901c1690565b60006060611d346103e6612652565b935093915050565b333014611e2b576000306001600160a01b0316600036604051611d60929190614307565b6000604051808303816000865af19150503d8060008114611d9d576040519150601f19603f3d011682016040523d82523d6000602084013e611da2565b606091505b505090508060008114611db157fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611e0d573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611e3e8686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611eb2908290612b3d565b60005b8181101561111457611eed848281518110611ecc57fe5b6020026020010151848381518110611ee057fe5b602002602001015161192d565b848281518110611ef957fe5b6020908102919091010152600101611eb5565b60008160200151831015611f455781516020830151600091611f31918690039061192d565b9050611f3d84826115e7565b915050610710565b81604001518311611f57575081610710565b81516040830151600091611f319186039061192d565b60006108e68383611c1d565b600061071082611f8761073a565b906115e7565b6000611f9c821515600461162c565b670de0b6b3a76400008302611fce841580611fc75750670de0b6b3a7640000858381611fc457fe5b04145b600561162c565b6001836001830304018115150291505092915050565b6000808251118015610710575060ff80168280602001905181019061200991906141f6565b60ff161492915050565b6109b861201e61116f565b6101b661162c565b60006060600061203584612b4a565b90506060865167ffffffffffffffff8111801561205157600080fd5b5060405190808252806020026020018201604052801561207b578160200160208202803683370190505b5090506000612088610f42565b9050600061209b898381518110610c9c57fe5b905060006120a98583612b60565b905060005b8a5181101561210b57838114156120c65760006120ec565b6120ec828c83815181106120d657fe5b602002602001015161192d90919063ffffffff16565b8582815181106120f857fe5b60209081029190910101526001016120ae565b509399929850919650505050505050565b6115e38282612ba0565b60006108e66103e6612652565b6121428183111561014c61162c565b61215d6b0de0b6b39983494c589c000082111561014d61162c565b612175670de0b6b3a7640000825b061561016161162c565b612187670de0b6b3a76400008361216b565b6121bc670de0b6b3a76400008204604060206121b4670de0b6b3a7640000876008549190046020806115fd565b9291906115fd565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121fc90859085906146c3565b60405180910390a2505050565b6000612213610fcf565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561224b57600080fd5b505afa15801561225f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090091906140a4565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b60006122d485612c6c565b90506122ea6122e4878387612c88565b8361162c565b6122f9428410156101b861162c565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b6000606061233b6001600160a01b038616301461015661162c565b6123526001600160a01b038516301461015661162c565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff816000815181106123a157fe5b602090810291909101015290969095509350505050565b6115e38282612d37565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061245a612dca565b3060405160200161246f959493929190614622565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016124b99190614683565b602060405180830381600087803b1580156124d357600080fd5b505af11580156124e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250b9190613fa9565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d2906125579084908890889060040161459c565b600060405180830381600087803b15801561257157600080fd5b505af1158015612585573d6000803e3d6000fd5b509298975050505050505050565b6002815110156125a257611a8b565b6000816000815181106125b157fe5b602002602001015190506000600190505b82518110156109425760008382815181106125d957fe5b60200260200101519050612602816001600160a01b0316846001600160a01b031610606561162c565b91506001016125c2565b61261b6101008310606461162c565b61264360018210158015611662575061263960ff8461010003611620565b821115606461162c565b61094283821c156101b461162c565b611a8b817f42414c0000000000000000000000000000000000000000000000000000000000612dce565b60006108e6838361192d565b60208301516000906001600160a01b03163014156126b2576126ab848484612e49565b90506108e6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b031614156126fb576126ab848484612fa1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612744576126ab8484846130de565b6108e6610135612652565b60006108e68383612b60565b60408301516000906001600160a01b031630141561277e576126ab848484613216565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127c7576126ab848484613366565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b03161415612744576126ab84848461349e565b60006108e68383611f8d565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417612897578160208401fd5b506115e3610165612652565b60006128b2848411158361162c565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128d8610fab565b6001600160a01b0316141580156128f357506128f3836135d6565b1561291b57612900610fab565b6001600160a01b0316336001600160a01b0316149050610710565b612923612209565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016129529392919061445c565b60206040518083038186803b15801561296a57600080fd5b505afa15801561297e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133c9190613f89565b604080516000808252602082019092526060916129d5565b6129c2613b4a565b8152602001906001900390816129ba5790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e8490612a1e908490600401614361565b600060405180830381600087803b158015612a3857600080fd5b505af1158015612a4c573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612ab757507f0000000000000000000000000000000000000000000000000000000000000000610cd5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612b0357612afc6107f261183f565b9050610cd5565b6001600160a01b038216301415612b235750670de0b6b3a7640000610cd5565b610cd5610135612652565b6001811b1992909216911b1790565b6115e3818314606761162c565b6000818060200190518101906108e69190614212565b6000612b6f821515600461162c565b670de0b6b3a76400008302612b97841580611fc75750670de0b6b3a7640000858381611fc457fe5b82818161195c57fe5b612bb76001600160a01b038316151561019b61162c565b612bc382600083610942565b6001600160a01b038216600090815260208190526040902054612be990826101b26128a3565b6001600160a01b038316600090815260208190526040902055612c1c612c1782612c1161073a565b9061363a565b613648565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c609190614453565b60405180910390a35050565b6000612c766123ed565b82604051602001610f8e929190614317565b6000612c9a82516041146101b961162c565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612cd3908990859088908890614665565b6020604051602081039080840390855afa158015612cf5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612d2b5750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612d4360008383610942565b612d58612c1782612d5261073a565b90611c1d565b6001600160a01b038216600090815260208190526040902054612d7b9082611c1d565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c60908590614453565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612ecf7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162c565b6115d18460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f0357fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f3757fe5b6020026020010151612f4f87600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612f955761364d612f99565b6136ab5b63ffffffff16565b6000612ffd7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec7575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b03163014613058576130538460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061304557fe5b602002602001015184613714565b6115d1565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061308c57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130c057fe5b60200260200101516130d887600081518110610c9c57fe5b86613744565b600061313a7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec7575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b03163014613190576130538460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061318257fe5b6020026020010151846137aa565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131c457fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106131f857fe5b602002602001015161321087600081518110610c9c57fe5b866137ea565b600061329b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162c565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132cf57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061330357fe5b602002602001015161331b87600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461336157613851612f99565b6138a8565b60006133c27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec7575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b03163014613418576130538460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061340a57fe5b602002602001015184613912565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061344c57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061348057fe5b602002602001015161349887600081518110610c9c57fe5b8661393c565b60006134fa7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec7575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b03163014613550576130538460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061354257fe5b60200260200101518461398b565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061358457fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106135b857fe5b60200260200101516135d087600081518110610c9c57fe5b866139c0565b60006136017f9f11080e00000000000000000000000000000000000000000000000000000000610f59565b82148061071057506136327f38e9922e00000000000000000000000000000000000000000000000000000000610f59565b909114919050565b60006108e6838360016128a3565b600255565b60008061365a8684611f0c565b905060006136688287611f6d565b90506000613676868a6115e7565b9050600061369184611f8761368b8587613a14565b8a613a2e565b905061369d88826115e7565b9a9950505050505050505050565b6000806136b88684611f0c565b905060006136c68287611f6d565b905060006136dd6136d7838b613a14565b87613a4f565b905060006136eb84836115e7565b905060006136f98288613a6f565b90506137058a826115e7565b9b9a5050505050505050505050565b6000806137218484611f0c565b905060006137386137328688611c1d565b85611f0c565b905061065e81836115e7565b60008261375c576137558683611f0c565b905061109f565b60006137688684611f0c565b90506000613779613732888a611c1d565b9050600061378782846115e7565b905060006137958489611f6d565b905061369d6137a48884613a14565b82613a4f565b6000806137b78484611f0c565b905060006137c582876115e7565b905060006137d38286613a6f565b90506137df86826115e7565b979650505050505050565b6000826137f857508461109f565b60006138048684611f0c565b905060006138128287611f6d565b90506000613820878a611c1d565b9050600061382e8483611f6d565b9050600061384561383f8984613a14565b85613a4f565b905061370581896115e7565b60008261385f57508461109f565b600061386b8684611f0c565b905060006138798287611f6d565b90506000613887868a611c1d565b9050600061389c84611f8761368b8587613a14565b905061369d81896115e7565b6000826138b9576137558683613a6f565b60006138c58684611f0c565b905060006138d38287611f6d565b905060006138ea6138e4838b613a14565b87613a2e565b905060006138f88483611c1d565b905060006139068288613a6f565b9050613705818b6115e7565b60008061391f8484611f0c565b9050600061393061373286886115e7565b905061065e82826115e7565b6000806139498684611f0c565b9050600061395a613732888a6115e7565b9050600061396883836115e7565b905060006139768489611f6d565b905061369d6139858884613a14565b82613a2e565b6000806139988484611f0c565b905060006139a68287611c1d565b905060006139b48286613a6f565b90506137df81876115e7565b6000806139cd8684611f0c565b905060006139db8287611f6d565b905060006139e9878a6115e7565b905060006139f78483611f6d565b90506000613a0861383f8984613a14565b905061370588826115e7565b60008282026108e684158061194a57508385838161194757fe5b6000613a3d821515600461162c565b50811515600019909201046001010290565b6000613a5e821515600461162c565b818381613a6757fe5b049392505050565b60008160200151831015613ab857815161133c90613a9690670de0b6b3a764000090611c1d565b60208401518451613ab291613aab919061192d565b8690611c1d565b90612b60565b81604001518311613aca575081610710565b815161133c90613ae390670de0b6b3a7640000906115e7565b60408401518451613ab291613af8919061192d565b86906115e7565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561071081614732565b600082601f830112613b95578081fd5b8135613ba8613ba382614706565b6146df565b818152915060208083019084810181840286018201871015613bc957600080fd5b60005b84811015613be857813584529282019290820190600101613bcc565b505050505092915050565b600082601f830112613c03578081fd5b8151613c11613ba382614706565b818152915060208083019084810181840286018201871015613c3257600080fd5b60005b84811015613be857815184529282019290820190600101613c35565b600082601f830112613c61578081fd5b813567ffffffffffffffff811115613c77578182fd5b613c8a6020601f19601f840116016146df565b9150808252836020828501011115613ca157600080fd5b8060208401602084013760009082016020015292915050565b80356002811061071057600080fd5b6000610120808385031215613cdc578182fd5b613ce5816146df565b915050613cf28383613cba565b8152613d018360208401613b7a565b6020820152613d138360408401613b7a565b6040820152606082013560608201526080820135608082015260a082013560a0820152613d438360c08401613b7a565b60c0820152613d558360e08401613b7a565b60e08201526101008083013567ffffffffffffffff811115613d7657600080fd5b613d8285828601613c51565b82840152505092915050565b600060208284031215613d9f578081fd5b81356108e681614732565b60008060408385031215613dbc578081fd5b8235613dc781614732565b91506020830135613dd781614732565b809150509250929050565b600080600060608486031215613df6578081fd5b8335613e0181614732565b92506020840135613e1181614732565b929592945050506040919091013590565b600080600080600080600060e0888a031215613e3c578283fd5b8735613e4781614732565b96506020880135613e5781614732565b955060408801359450606088013593506080880135613e7581614747565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613ea4578182fd5b8235613eaf81614732565b946020939093013593505050565b600080600060608486031215613ed1578081fd5b835167ffffffffffffffff80821115613ee8578283fd5b818601915086601f830112613efb578283fd5b8151613f09613ba382614706565b80828252602080830192508086018b828387028901011115613f29578788fd5b8796505b84871015613f54578051613f4081614732565b845260019690960195928101928101613f2d565b508901519097509350505080821115613f6b578283fd5b50613f7886828701613bf3565b925050604084015190509250925092565b600060208284031215613f9a578081fd5b815180151581146108e6578182fd5b600060208284031215613fba578081fd5b5051919050565b600080600080600080600060e0888a031215613fdb578081fd5b873596506020880135613fed81614732565b95506040880135613ffd81614732565b9450606088013567ffffffffffffffff80821115614019578283fd5b6140258b838c01613b85565b955060808a0135945060a08a0135935060c08a0135915080821115614048578283fd5b506140558a828b01613c51565b91505092959891949750929550565b600060208284031215614075578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e6578182fd5b6000602082840312156140b5578081fd5b81516108e681614732565b600080600080608085870312156140d5578182fd5b843567ffffffffffffffff808211156140ec578384fd5b6140f888838901613cc9565b9550602087013591508082111561410d578384fd5b5061411a87828801613b85565b949794965050505060408301359260600135919050565b600080600060608486031215614145578081fd5b833567ffffffffffffffff81111561415b578182fd5b61416786828701613cc9565b9660208601359650604090950135949350505050565b60006020828403121561418e578081fd5b5035919050565b600080604083850312156141a7578182fd5b50508035926020909101359150565b600080600080608085870312156141cb578182fd5b84519350602085015192506040850151915060608501516141eb81614732565b939692955090935050565b600060208284031215614207578081fd5b81516108e681614747565b60008060408385031215614224578182fd5b825161422f81614747565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b8381101561427b5781518752958201959082019060010161425f565b509495945050505050565b15159052565b60008151808452815b818110156142b157602081850181015186830182015201614295565b818111156142c25782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b828110156143eb57815180516004811061439457fe5b8552808701516143a68887018261423f565b5085810151868601526060808201516143c18288018261423f565b5050608090810151906143d68682018361423f565b505060a093909301929085019060010161437e565b5091979650505050505050565b6000602082526108e6602083018461424c565b60006040825261441e604083018561424c565b828103602084015261109f818561424c565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156144ec576144d68451614726565b82529284019260019290920191908401906144c4565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a087015261452a818561424c565b935050506040850151818584030160c0860152614547838261428c565b92505050606084015161455d60e0850182614286565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b818110156145e4576145d28551614726565b835293830193918301916001016145c0565b505084810360408601528551808252908201925081860190845b81811015612585576146108351614726565b855293830193918301916001016145fe565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016003831061469157fe5b91905290565b6000602082526108e6602083018461428c565b6000838252604060208301526115d1604083018461424c565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156146fe57600080fd5b604052919050565b600067ffffffffffffffff82111561471c578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114611a8b57600080fd5b60ff81168114611a8b57600080fdfea26469706673582212200ebdd998c1044b1cc5a951f1955002ce126260246551333654d652ade70c43c664736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/artifact/AaveLinearPoolFactory.json b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/artifact/AaveLinearPoolFactory.json new file mode 100644 index 0000000..41a3f4d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/artifact/AaveLinearPoolFactory.json @@ -0,0 +1,334 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "AaveLinearPoolFactory", + "sourceName": "contracts/aave-v2-linear-pool/AaveLinearPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "contract IBalancerQueries", + "name": "queries", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "poolVersion", + "type": "string" + }, + { + "internalType": "uint256", + "name": "initialPauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "AaveLinearPoolCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract AaveLinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastCreatedPool", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeePercentagesProvider", + "outputs": [ + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101e06040523480156200001257600080fd5b506040516200942f3803806200942f8339810160408190526200003591620003bc565b86868383604051806020016200004b906200026b565b601f1982820381018352601f9091011660405282828630848d6200006f816200017d565b5080516002810460a081905280820360e0819052818452836200009e8162000196602090811b620009f317901c565b60601b6001600160601b0319166080528285018051838252620000cd8262000196602090811b620009f317901c565b6001600160601b0319606091821b811660c0529690935290526101009590955250509290911b909116610120525062000110630163f500831115610194620001ea565b620001246276a700821115610195620001ea565b610140829052610160524201610180525050506001600160601b0319606091821b81166101a05260016003559087901b166101c0525082516200016f90600690602086019062000279565b50505050505050506200048d565b80516200019290600090602084019062000279565b5050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001e46001600160a01b03831615156101ac620001ea565b50919050565b816200019257620001928162000207816210905360ea1b6200020a565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6159a38062003a8c83390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002bc57805160ff1916838001178555620002ec565b82800160010185558215620002ec579182015b82811115620002ec578251825591602001919060010190620002cf565b50620002fa929150620002fe565b5090565b5b80821115620002fa5760008155600101620002ff565b600082601f83011262000326578081fd5b81516001600160401b03808211156200033d578283fd5b6040516020601f8401601f19168201810183811183821017156200035f578586fd5b806040525081945083825286818588010111156200037c57600080fd5b600092505b83831015620003a0578583018101518284018201529182019162000381565b83831115620003b25760008185840101525b5050505092915050565b600080600080600080600060e0888a031215620003d7578283fd5b8751620003e48162000477565b6020890151909750620003f78162000477565b60408901519096506200040a8162000477565b60608901519095506001600160401b038082111562000427578485fd5b620004358b838c0162000315565b955060808a01519150808211156200044b578485fd5b506200045a8a828b0162000315565b93505060a0880151915060c0880151905092959891949750929550565b6001600160a01b03811681146200020757600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405161016051610180516101a05160601c6101c05160601c61356a620005226000398061057052508061050452508061028b52806102b55250806102d9525050806109445250806108f2525080610a5c5250806102625280610ad8525080610a7d5250806102415280610ab4525061356a6000f3fe60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c80636634b753116200009957806376895be7116200006f57806376895be714620001cd578063851c1bb314620001e45780638d928af8146200020a578063aaabadc5146200021457620000ff565b80636634b75314620001935780636c57f5a914620001b9578063739238d614620001c357620000ff565b80632f2770db11620000db5780632f2770db146200015a5780633f819b6f146200016657806354fd4d5014620001705780635ed31282146200017a57620000ff565b8062c194db1462000104578063174481fa14620001265780632da47c401462000140575b600080fd5b6200010e6200021e565b6040516200011d919062001459565b60405180910390f35b620001306200023f565b6040516200011d929190620013f2565b6200014a62000285565b6040516200011d92919062001652565b620001646200030e565b005b6200010e62000378565b6200010e62000430565b62000184620004b2565b6040516200011d9190620013d1565b620001aa620001a43660046200114d565b620004ce565b6040516200011d919062001419565b620001aa620004f9565b6200018462000502565b62000184620001de366004620011f6565b62000526565b620001fb620001f536600462001195565b620008ee565b6040516200011d919062001424565b6200018462000942565b6200018462000966565b60606200023a6040518060200160405280600081525062000a54565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200030057807f00000000000000000000000000000000000000000000000000000000000000000392507f0000000000000000000000000000000000000000000000000000000000000000915062000309565b60009250600091505b509091565b6200031862000b2f565b6200032262000b7e565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b820191906000526020600020905b8154815290600101906020018083116200040857829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006200053262000b97565b6004805460018101909155604051606090620005516020820162000fe1565b601f1982820381018352601f909101166040526200056e62000942565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001620005a2929190620013f2565b60408051601f1981840301815290829052620005c292916020016200139e565b60405160208183030381529060405290506000620005e883838051906020012062000bb2565b9050600080620005f762000285565b915091506200060562000fef565b6200060f62000942565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508f81602001819052508e81604001819052508d816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508c816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b8160c00181815250508a8160e0018181525050828161010001818152505081816101200181815250508981610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506200076d62000378565b610160820152604051600090620007a4906200078e9084906020016200154a565b6040516020818303038152906040528a62000bca565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620007ef57600080fd5b505af115801562000804573d6000803e3d6000fd5b505050506000620008186000898962000c21565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146200088b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088290620014dc565b60405180910390fd5b6040518b9073ffffffffffffffffffffffffffffffffffffffff8416907fdd6d1f79139f1dde24a93542b6f48323b2638466a8bedffc021d605a0d34afd490600090a3509650505050505050620008e162000cff565b9998505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001620009259291906200136e565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006200097262000942565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620009b857600080fd5b505afa158015620009cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023a9190620011d7565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000a4e73ffffffffffffffffffffffffffffffffffffffff831615156101ac62000d06565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000b2181838662000d1b565b505050505050505050919050565b600062000b606000357fffffffff0000000000000000000000000000000000000000000000000000000016620008ee565b905062000b7b62000b72823362000d79565b61019162000d06565b50565b62000b9562000b8c620004f9565b1560d362000d06565b565b62000bab6002600354141561019062000d06565b6002600355565b600062000bc183833062000e17565b90505b92915050565b60008062000bd9848462000e58565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316179055949350505050565b6000808447101562000c61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000882906200146e565b825162000c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008829062001513565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088290620014a5565b949350505050565b6001600355565b8162000d175762000d178162000ef5565b5050565b5b6020811062000d3d578151835260209283019290910190601f190162000d1c565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000d8562000966565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000dc3939291906200142d565b60206040518083038186803b15801562000ddc57600080fd5b505afa15801562000df1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bc1919062001173565b60008060ff60f81b83868660405160200162000e3794939291906200130a565b60408051808303601f19018152919052805160209091012095945050505050565b600062000e6462000b7e565b600062000e72848462000f21565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a29392505050565b62000b7b817f42414c000000000000000000000000000000000000000000000000000000000062000f66565b6000606062000f308462000a54565b90506000838251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf7573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611e7e80620016b783390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b803562000bc48162001693565b600082601f830112620010dc578081fd5b813567ffffffffffffffff80821115620010f4578283fd5b6040516020601f19601f850116820101818110838211171562001115578485fd5b6040528281529250828483016020018610156200113157600080fd5b8260208601602083013760006020848301015250505092915050565b6000602082840312156200115f578081fd5b81356200116c8162001693565b9392505050565b60006020828403121562001185578081fd5b815180151581146200116c578182fd5b600060208284031215620011a7578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146200116c578182fd5b600060208284031215620011e9578081fd5b81516200116c8162001693565b60008060008060008060008060006101208a8c03121562001215578485fd5b893567ffffffffffffffff808211156200122d578687fd5b6200123b8d838e01620010cb565b9a5060208c013591508082111562001251578687fd5b50620012608c828d01620010cb565b98505060408a0135620012738162001693565b965060608a0135620012858162001693565b955060808a0135945060a08a01359350620012a48b60c08c01620010be565b925060e08a013591506101008a013590509295985092959850929598565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620012f681602086016020860162001660565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60008351620013b281846020880162001660565b835190830190620013c881836020880162001660565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000bc16020830184620012dc565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b60006020825262001560602083018451620012c2565b60208301516101808060408501526200157e6101a0850183620012dc565b91506040850151601f19808685030160608701526200159e8483620012dc565b935060608701519150620015b66080870183620012c2565b60808701519150620015cc60a0870183620012c2565b60a08701519150620015e260c0870183620012c2565b60c087015160e08781019190915287015161010080880191909152870151610120808801919091528701516101408088019190915287015191506101606200162d81880184620012c2565b870151868503909101838701529050620016488382620012dc565b9695505050505050565b918252602082015260400190565b60005b838110156200167d57818101518382015260200162001663565b838111156200168d576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000b7b57600080fdfe6101606040523480156200001257600080fd5b5060405162001e7e38038062001e7e833981016040819052620000359162000462565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000378565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200012591908101906200039e565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000449565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000449565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000378565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000378565b6001600160601b0319606091821b811660e05292811b8316610120521b166101405250620004e0915050565b6000602082840312156200038a578081fd5b81516200039781620004c7565b9392505050565b60006020808385031215620003b1578182fd5b82516001600160401b0380821115620003c8578384fd5b818501915085601f830112620003dc578384fd5b815181811115620003eb578485fd5b8381029150620003fd848301620004a0565b8181528481019084860184860187018a101562000418578788fd5b8795505b838610156200043c5780518352600195909501949186019186016200041c565b5098975050505050505050565b6000602082840312156200045b578081fd5b5051919050565b6000806040838503121562000475578081fd5b82516200048281620004c7565b60208401519092506200049581620004c7565b809150509250929050565b6040518181016001600160401b0381118282101715620004bf57600080fd5b604052919050565b6001600160a01b0381168114620004dd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c6118bb620005c36000398061050952806108215250806101335280610c145280610f335280610f955250806103bf52508061046c5280610599528061074852806108ec5280610cbf528061102952806110f3528061115552508060ea5280610190528061043052806105cc528061063152806106d2528061078452806108b152806110d152508061016f5280610402528061071a5280610a7d5280610b5c5280610dbb5280610e9a5250806099528061030952506118bb6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611588565b60405180910390f35b610077610072366004611446565b6100bb565b60405161005b9190611824565b610077610092366004611462565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc92919061173d565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c91906114e8565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a939291906115d0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a491906114c5565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f5611393565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c96113f6565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611761565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059291906114ad565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d4f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611588565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b691906114ad565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fca565b9695505050505050565b600061070d611393565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e16113f6565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611761565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa91906114ad565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fe9565b6110b7565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d4f565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a919061156c565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b6919061148d565b6101a26111e8565b60006109cd82151560046111e8565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b60056111e8565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f61141d565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016116b9565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517fead5d35900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ead5d35990610cf99030908590600190600401611650565b6040805180830381600087803b158015610d1257600080fd5b505af1158015610d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4a91906114c5565b505050565b6040805160028082526060828101909352816020015b610d6d61141d565b815260200190600190039081610d65579050509050600281600081518110610d9157fe5b6020026020010151600001906002811115610da857fe5b90816002811115610db557fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de757fe5b602002602001015160200181815250508181600081518110610e0557fe5b602002602001015160600181815250508281600081518110610e2357fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e7057fe5b6020026020010151600001906002811115610e8757fe5b90816002811115610e9457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec657fe5b602002602001015160200181815250508181600181518110610ee457fe5b602002602001015160600181815250508281600181518110610f0257fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f589084167f0000000000000000000000000000000000000000000000000000000000000000846111f6565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016116b9565b610d4a8363a9059cbb60e01b848460405160240161027a92919061162a565b6040517ff57d0b4000000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f57d0b409061105e908590600401611824565b60206040518083038186803b15801561107657600080fd5b505afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae91906114ad565b60010192915050565b61111873ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f0000000000000000000000000000000000000000000000000000000000000000836111f6565b6040517f2f2cab8700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632f2cab87906111929030908590600090600190600401611680565b602060405180830381600087803b1580156111ac57600080fd5b505af11580156111c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e491906114ad565b5050565b816111e4576111e4816112eb565b80158015906112a757506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e9061125490309086906004016115a9565b60206040518083038186803b15801561126c57600080fd5b505afa158015611280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a491906114ad565b15155b156112cc576112cc8363095ea7b360e01b84600060405160240161027a929190611601565b610d4a8363095ea7b360e01b848460405160240161027a92919061162a565b611315817f42414c0000000000000000000000000000000000000000000000000000000000611318565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b600060208284031215611457578081fd5b813561011b81611863565b60008060408385031215611474578081fd5b823561147f81611863565b946020939093013593505050565b60006020828403121561149e578081fd5b8151801515811461011b578182fd5b6000602082840312156114be578081fd5b5051919050565b600080604083850312156114d7578182fd5b505080516020909101519092909150565b600080600080608085870312156114fd578182fd5b845193506020850151925060408501519150606085015161151d81611863565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161157e81846020870161182d565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff93909316835260208301919091521515604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff949094168452602084019290925261ffff1660408301521515606082015260800190565b602080825282518282018190526000919060409081850190868401855b828110156117305781518051600381106116ec57fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff168686015260609081015190850152608090930192908501906001016116d6565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a0830152602084015161177c81611859565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c06101408401528051806101608501526101806117e8828287016020860161182d565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b6020830184611528565b90815260200190565b60005b83811015611848578181015183820152602001611830565b838111156102fc5750506000910152565b6002811061131557fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461131557600080fdfea264697066735822122071c747d079b6f1053812d61a96fcbf5bc452dc911a12f909d0042f154ded1ef764736f6c63430007010033a2646970667358221220e411705eb4d0d90a247bed54b78a82037b8b41968c8fa943497523ed1fbb743f64736f6c634300070100336102c06040523480156200001257600080fd5b50604051620059a3380380620059a3833981016040819052620000359162000e00565b6101608101518151602083015160408401516060850151608086015160c0870151620000618862000476565b60e08901516101008a01516101208b01516101408c01518a6200009e8160006200008c8c8c620004ff565b89620005b060201b620014241760201c565b8b8b86868686838387878b86336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000ed92919062000c89565b5080516200010390600490602084019062000c89565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001829050630163f5008311156101946200077e565b620001966276a7008211156101956200077e565b4291909101610140819052016101605260601b6001600160601b031916610180526101a08690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000dc1565b6001600160a01b03166101c0816001600160a01b031660601b8152505050505050505050876001600160a01b03166101e0816001600160a01b031660601b81525050866001600160a01b0316610200816001600160a01b031660601b81525050866001600160a01b0316886001600160a01b031610620002bb576002620002be565b60015b60ff16610220526001600160a01b0380881690891610620002e1576001620002e4565b60025b60ff1661024052620002f68862000793565b61026052620003058762000793565b610280526000620003188982896200083f565b620003238562000939565b5050505050505050505050506200034081620009c860201b60201c565b50620003e581608001516001600160a01b0316634800d97f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038357600080fd5b505afa15801562000398573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003be919062000dc1565b6001600160a01b031682606001516001600160a01b0316146102086200077e60201b60201c565b80608001516001600160a01b031663b4dcfc776040518163ffffffff1660e01b815260040160206040518083038186803b1580156200042357600080fd5b505afa15801562000438573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200045e919062000dc1565b60601b6001600160601b0319166102a052506200107d565b6040805160028082526060808301845292839291906020830190803683370190505090508260a0015181600081518110620004ad57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260a0015181600181518110620004e057fe5b6001600160a01b03909216602092830291909101909101529050919050565b60408051600280825260608281019093526001600160a01b03848116908616109183918160200160208202803683370190505090508162000541578362000543565b845b816000815181106200055157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050816200057e578462000580565b835b816001815181106200058e57fe5b6001600160a01b03909216602092830291909101909101529150505b92915050565b6000620005c883620009dd60201b620015d91760201c565b606083516001016001600160401b0381118015620005e557600080fd5b5060405190808252806020026020018201604052801562000610578160200160208202803683370190505b50905030816000815181106200062257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b845181101562000695578481815181106200065c57fe5b60200260200101518282600101815181106200067457fe5b6001600160a01b039092166020928302919091019091015260010162000645565b50606083516001016001600160401b0381118015620006b357600080fd5b50604051908082528060200260200182016040528015620006de578160200160208202803683370190505b509050600081600081518110620006f157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b845181101562000764578481815181106200072b57fe5b60200260200101518282600101815181106200074357fe5b6001600160a01b039092166020928302919091019091015260010162000714565b506200077387878484620009e9565b979650505050505050565b816200078f576200078f8162000ae3565b5050565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620007d057600080fd5b505afa158015620007e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200080b919062000f57565b60ff16905060006200082a60128362000af860201b620015e71760201c565b600a0a670de0b6b3a764000002949350505050565b620008508183111561014c6200077e565b6200086d6b0de0b6b39983494c589c000082111561014d6200077e565b62000887670de0b6b3a7640000825b06156101616200077e565b6200089b670de0b6b3a7640000836200087c565b620008ea670de0b6b3a7640000820460406020620008d4670de0b6b3a764000087600854919004602080620015fd62000b10821b17811c565b62000b1060201b620015fd17909392919060201c565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906200092c908590859062001026565b60405180910390a2505050565b6200094e64e8d4a5100082101560cb6200077e565b6200096667016345785d8a000082111560ca6200077e565b620009888160c0603f60085462000b1060201b620015fd17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90620009bd9083906200101d565b60405180910390a150565b80516200078f90600990602084019062000c89565b806200078f8162000b35565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040162000a1a919062001008565b602060405180830381600087803b15801562000a3557600080fd5b505af115801562000a4a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a70919062000de7565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000aa59084908890889060040162000f7a565b600060405180830381600087803b15801562000ac057600080fd5b505af115801562000ad5573d6000803e3d6000fd5b509298975050505050505050565b62000af5816210905360ea1b62000bc1565b50565b600062000b0a8383111560016200077e565b50900390565b600062000b1f84848462000c22565b506001901b60001901811b1992909216911b1790565b60028151101562000b465762000af5565b60008160008151811062000b5657fe5b602002602001015190506000600190505b825181101562000bbc57600083828151811062000b8057fe5b6020026020010151905062000bb1816001600160a01b0316846001600160a01b03161060656200077e60201b60201c565b915060010162000b67565b505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b62000c33610100831060646200077e565b62000c6c6001821015801562000c64575062000c6060ff846101000362000c7d60201b620016201760201c565b8211155b60646200077e565b62000bbc83821c156101b46200077e565b80820390821102900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000ccc57805160ff191683800117855562000cfc565b8280016001018555821562000cfc579182015b8281111562000cfc57825182559160200191906001019062000cdf565b5062000d0a92915062000d0e565b5090565b5b8082111562000d0a576000815560010162000d0f565b8051620005aa8162001067565b600082601f83011262000d43578081fd5b81516001600160401b0381111562000d59578182fd5b602062000d6f601f8301601f1916820162001034565b9250818352848183860101111562000d8657600080fd5b60005b8281101562000da657848101820151848201830152810162000d89565b8281111562000db85760008284860101525b50505092915050565b60006020828403121562000dd3578081fd5b815162000de08162001067565b9392505050565b60006020828403121562000df9578081fd5b5051919050565b60006020828403121562000e12578081fd5b81516001600160401b038082111562000e29578283fd5b818401915061018080838703121562000e40578384fd5b62000e4b8162001034565b905062000e59868462000d25565b815260208301518281111562000e6d578485fd5b62000e7b8782860162000d32565b60208301525060408301518281111562000e93578485fd5b62000ea18782860162000d32565b60408301525062000eb6866060850162000d25565b606082015262000eca866080850162000d25565b608082015262000ede8660a0850162000d25565b60a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014062000f208782860162000d25565b90820152610160838101518381111562000f38578586fd5b62000f468882870162000d32565b918301919091525095945050505050565b60006020828403121562000f69578081fd5b815160ff8116811462000de0578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000fc65762000fb385516200105b565b8352938301939183019160010162000f9e565b505084810360408601528551808252908201925081860190845b8181101562000ad55762000ff583516200105b565b8552938301939183019160010162000fe0565b60208101600383106200101757fe5b91905290565b90815260200190565b918252602082015260400190565b6040518181016001600160401b03811182821017156200105357600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b038116811462000af557600080fd5b60805160a05160c05160e0516101005160601c6101205160601c61014051610160516101805160601c6101a0516101c05160601c6101e05160601c6102005160601c610220516102405161026051610280516102a05160601c61478c62001217600039806118435250806107f45250806107905280612a93525080610718528061081c5280610c515280612f0e528061309752806131cf52806132da5280613457528061358f5250806107b252806109bc5280610c175280612eda528061301c52806130635280613159528061319b52806132a652806133e152806134235280613519528061355b5250806113f852806126fd52806127c95280612ab95280612e8f5280612fa8528061325c528061336d5250806109e052806110ee5280611ac35280611b6252806126b452806127805280612a585280612e505280612f5252806130e5528061321d528061331e52806134a55250806111cc5250806109495250508061181d5250806117f9525080610fd1525080610fad525080610f5d5250806123f1525080612433525080612412525061478c6000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e3660046140c0565b610608565b6040516103509190614453565b60405180910390f35b610361610668565b6040516103509190614697565b61038161037c366004613e92565b6106ff565b6040516103509190614430565b610343610716565b61034361073a565b6103a6610740565b6040516103509392919061443b565b6103bd610769565b60405161035091906143f8565b6103816103d8366004613de2565b610877565b6103e56108ed565b60405161035091906146d1565b6103436108f6565b61040d61040836600461417d565b610905565b005b610343610947565b610381610425366004613e92565b61096b565b61040d6109a6565b6103436109ba565b6104426109de565b604051610350919061434d565b61040d610a02565b610361610a56565b610343610ab7565b61047a610475366004613fc1565b610aca565b6040516103509291906146aa565b610490610ae8565b6040516103509291906146c3565b610343610b26565b6103436104b4366004613d8e565b610cbb565b6104cc6104c7366004613fc1565b610cda565b60405161035092919061440b565b6103436104e8366004613d8e565b610d9c565b61040d610da7565b610343610f42565b61040d610f47565b610343610513366004614064565b610f59565b610442610fab565b610442610fcf565b610343610536366004613d8e565b610ff3565b61036161100e565b610343610551366004614131565b61106f565b61040d610564366004614195565b6110a8565b610381610577366004613e92565b61111a565b61038161058a366004613e92565b611158565b610442611165565b61038161116f565b61040d611180565b6104426111ca565b61040d6105bd366004613e22565b6111ee565b6104cc6105d0366004613fc1565b61126f565b6103436105e3366004613daa565b611306565b610343611343565b6103436113ec565b6104426113f6565b61034361141a565b6000846080015161063561061a610fcf565b6001600160a01b0316336001600160a01b03161460cd61162c565b61064a610640610947565b82146101f461162c565b61065261163a565b61065e8686868661164d565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b505050505090505b90565b600061070c338484611772565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074d6117da565b1592506107586117f7565b915061076261181b565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107db57fe5b6020026020010181815250506108196107f261183f565b7f00000000000000000000000000000000000000000000000000000000000000009061192d565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084557fe5b602002602001018181525050670de0b6b3a76400008160008151811061086757fe5b6020908102919091010152905090565b6000806108848533611306565b90506108a8336001600160a01b03871614806108a05750838210155b61019e61162c565b6108b3858585611965565b336001600160a01b038616148015906108ce57506000198114155b156108e0576108e08533858403611772565b60019150505b9392505050565b60055460ff1690565b60006109006113ec565b905090565b61090d611a45565b610915611a8e565b600080610920610ae8565b915091506109396109318383611a9e565b61014f61162c565b61094283611ba5565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070c9185906109a19086611c1d565b611772565b6109ae611a45565b6109b86000611c2f565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a0a611a45565b610a12611cc0565b610a1c6001611cd4565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4c9190614430565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906109009060c0603f611d16565b60006060610adc888785611d25611d3c565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0582602080611d16565b029250670de0b6b3a7640000610b1e8260406020611d16565b029150509091565b600080610b31610947565b90506060610b3d610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b689190614453565b60006040518083038186803b158015610b8057600080fd5b505afa158015610b94573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbc9190810190613ebd565b50915050610bd181610bcc610769565b611ea3565b600080610bdc610ae8565b91509150610be8613aff565b6040518060600160405280610bfb610ab7565b81526020018481526020018381525090506000610c87610c4e867f000000000000000000000000000000000000000000000000000000000000000081518110610c4057fe5b602002602001015184611f0c565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7a57fe5b6020026020010151611f6d565b9050610cb0610ca986600081518110610c9c57fe5b6020026020010151611f79565b8290611f8d565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce961061a610fcf565b610cf4610640610947565b6000610cff85611fe4565b15610d2757610d0c612013565b610d1e88610d1861073a565b87612026565b94509050610d3f565b610d2f61163a565b610d3a8a8987611d25565b945090505b610d498a8261211c565b835167ffffffffffffffff81118015610d6157600080fd5b50604051908082528060200260200182016040528015610d8b578160200160208202803683370190505b509250505097509795505050505050565b600061071082610ff3565b6000610db1610947565b90506060610dbd610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de89190614453565b60006040518083038186803b158015610e0057600080fd5b505afa158015610e14573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3c9190810190613ebd565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e8057fe5b602002602001018181525050610e94613b20565b6040518060800160405280610ea8856106fc565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed9610fcf565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f0a949392919061447b565b600060405180830381600087803b158015610f2457600080fd5b505af1158015610f38573d6000803e3d6000fd5b5050505050505050565b600090565b610f4f611a45565b6109b86001611c2f565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8e9291906142d7565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108161061a610fcf565b61108c610640610947565b61109461163a565b61109f858585612126565b95945050505050565b6110b0611a45565b6110b8611a8e565b6000806110c3610ae8565b915091506110d46109318383611a9e565b6110e96110e18585611a9e565b61015761162c565b6111147f00000000000000000000000000000000000000000000000000000000000000008585612133565b50505050565b6000806111273385611306565b90508083106111415761113c33856000611772565b61114e565b61114e3385858403611772565b5060019392505050565b600061070c338484611965565b6000610900612209565b6008546000906109009060ff612283565b611188611a45565b611190612013565b61119a6000611cd4565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4c9190614430565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121d8c610ff3565b8960405160200161123396959493929190614568565b604051602081830303815290604052805190602001209050611264888261125b87878761228a565b886101f86122c9565b610f38888888611772565b6060808861127e61061a610fcf565b611289610640610947565b600061129361163a565b61129b61073a565b6112ed576112aa8a8a87612320565b945090506112c36112b9610f42565b82101560cc61162c565b6112d560006112d0610f42565b6123b8565b6112e8896112e1610f42565b83036123b8565b610d49565b6112f88a8987611d25565b94509050610d4989826123b8565b6000611310610fcf565b6001600160a01b0316826001600160a01b031614156113325750600019610710565b61133c83836123c2565b9050610710565b6000806000611350610fcf565b6001600160a01b031663b05f8e48611366610947565b306040518363ffffffff1660e01b815260040161138492919061464e565b60806040518083038186803b15801561139c57600080fd5b505afa1580156113b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d491906141b6565b5050915091506113e5818301611f79565b9250505090565b60006109006123ed565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061090061183f565b600061142f836115d9565b6060835160010167ffffffffffffffff8111801561144c57600080fd5b50604051908082528060200260200182016040528015611476578160200160208202803683370190505b509050308160008151811061148757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f6578481815181106114bf57fe5b60200260200101518282600101815181106114d657fe5b6001600160a01b03909216602092830291909101909101526001016114aa565b506060835160010167ffffffffffffffff8111801561151457600080fd5b5060405190808252806020026020018201604052801561153e578160200160208202803683370190505b50905060008160008151811061155057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115bf5784818151811061158857fe5b602002602001015182826001018151811061159f57fe5b6001600160a01b0390921660209283029190910190910152600101611573565b506115cc8787848461248a565b925050505b949350505050565b806115e381612593565b5050565b60006115f783831115600161162c565b50900390565b600061160a84848461260c565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e3576115e381612652565b6109b86116456117da565b61019261162c565b60006116696003841080156116625750600383105b606461162c565b6060611673610769565b905061167f8582611ea3565b60008061168a610ae8565b91509150611696613aff565b60405180606001604052806116a9610ab7565b81526020810185905260400183905290506000895160018111156116c957fe5b141561172d576116f089606001518589815181106116e357fe5b602002602001015161267c565b60608a015260006117028a8a84612688565b90506117218186898151811061171457fe5b602002602001015161274f565b955050505050506115d1565b61174189606001518588815181106116e357fe5b60608a015260006117538a8a8461275b565b905061172181868a8151811061176557fe5b6020026020010151612810565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cd908590614453565b60405180910390a3505050565b60006117e461181b565b42118061090057505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d15e00536118786109de565b6040518263ffffffff1660e01b8152600401611894919061434d565b60206040518083038186803b1580156118ac57600080fd5b505afa9250505080156118dc575060408051601f3d908101601f191682019092526118d991810190613fa9565b60015b61191f573d80801561190a576040519150601f19603f3d011682016040523d82523d6000602084013e61190f565b606091505b506119198161281c565b506106fc565b633b9aca00900490506106fc565b600082820261195184158061194a57508385838161194757fe5b04145b600361162c565b670de0b6b3a7640000815b04949350505050565b61197c6001600160a01b038416151561019861162c565b6119936001600160a01b038316151561019961162c565b61199e838383610942565b6001600160a01b0383166000908152602081905260409020546119c490826101a06128a3565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119f39082611c1d565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cd908590614453565b6000611a746000357fffffffff0000000000000000000000000000000000000000000000000000000016610f59565b9050611a8b611a8382336128b9565b61019161162c565b50565b6109b8611a99610fcf565b6129a2565b6000806000611aab610fcf565b6001600160a01b031663b05f8e48611ac1610947565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611aff92919061464e565b60806040518083038186803b158015611b1757600080fd5b505afa158015611b2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4f91906141b6565b5050915091506000611b8b828401611b867f0000000000000000000000000000000000000000000000000000000000000000612a54565b61267c565b905085811015801561065e57509390931115949350505050565b611bb864e8d4a5100082101560cb61162c565b611bce67016345785d8a000082111560ca61162c565b600854611bdf908260c0603f6115fd565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611c12908390614453565b60405180910390a150565b60008282016108e6848210158361162c565b8015611c4f57611c4a611c406117f7565b421061019361162c565b611c64565b611c64611c5a61181b565b42106101a961162c565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611c12908390614430565b6109b8611ccb61116f565b156101b561162c565b600854611ce3908260ff612b2e565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611c12908390614430565b6001901b6000190191901c1690565b60006060611d346103e6612652565b935093915050565b333014611e2b576000306001600160a01b0316600036604051611d60929190614307565b6000604051808303816000865af19150503d8060008114611d9d576040519150601f19603f3d011682016040523d82523d6000602084013e611da2565b606091505b505090508060008114611db157fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611e0d573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611e3e8686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611eb2908290612b3d565b60005b8181101561111457611eed848281518110611ecc57fe5b6020026020010151848381518110611ee057fe5b602002602001015161192d565b848281518110611ef957fe5b6020908102919091010152600101611eb5565b60008160200151831015611f455781516020830151600091611f31918690039061192d565b9050611f3d84826115e7565b915050610710565b81604001518311611f57575081610710565b81516040830151600091611f319186039061192d565b60006108e68383611c1d565b600061071082611f8761073a565b906115e7565b6000611f9c821515600461162c565b670de0b6b3a76400008302611fce841580611fc75750670de0b6b3a7640000858381611fc457fe5b04145b600561162c565b6001836001830304018115150291505092915050565b6000808251118015610710575060ff80168280602001905181019061200991906141f6565b60ff161492915050565b6109b861201e61116f565b6101b661162c565b60006060600061203584612b4a565b90506060865167ffffffffffffffff8111801561205157600080fd5b5060405190808252806020026020018201604052801561207b578160200160208202803683370190505b5090506000612088610f42565b9050600061209b898381518110610c9c57fe5b905060006120a98583612b60565b905060005b8a5181101561210b57838114156120c65760006120ec565b6120ec828c83815181106120d657fe5b602002602001015161192d90919063ffffffff16565b8582815181106120f857fe5b60209081029190910101526001016120ae565b509399929850919650505050505050565b6115e38282612ba0565b60006108e66103e6612652565b6121428183111561014c61162c565b61215d6b0de0b6b39983494c589c000082111561014d61162c565b612175670de0b6b3a7640000825b061561016161162c565b612187670de0b6b3a76400008361216b565b6121bc670de0b6b3a76400008204604060206121b4670de0b6b3a7640000876008549190046020806115fd565b9291906115fd565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121fc90859085906146c3565b60405180910390a2505050565b6000612213610fcf565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561224b57600080fd5b505afa15801561225f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090091906140a4565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b60006122d485612c6c565b90506122ea6122e4878387612c88565b8361162c565b6122f9428410156101b861162c565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b6000606061233b6001600160a01b038616301461015661162c565b6123526001600160a01b038516301461015661162c565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff816000815181106123a157fe5b602090810291909101015290969095509350505050565b6115e38282612d37565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061245a612dca565b3060405160200161246f959493929190614622565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016124b99190614683565b602060405180830381600087803b1580156124d357600080fd5b505af11580156124e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250b9190613fa9565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d2906125579084908890889060040161459c565b600060405180830381600087803b15801561257157600080fd5b505af1158015612585573d6000803e3d6000fd5b509298975050505050505050565b6002815110156125a257611a8b565b6000816000815181106125b157fe5b602002602001015190506000600190505b82518110156109425760008382815181106125d957fe5b60200260200101519050612602816001600160a01b0316846001600160a01b031610606561162c565b91506001016125c2565b61261b6101008310606461162c565b61264360018210158015611662575061263960ff8461010003611620565b821115606461162c565b61094283821c156101b461162c565b611a8b817f42414c0000000000000000000000000000000000000000000000000000000000612dce565b60006108e6838361192d565b60208301516000906001600160a01b03163014156126b2576126ab848484612e49565b90506108e6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b031614156126fb576126ab848484612fa1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612744576126ab8484846130de565b6108e6610135612652565b60006108e68383612b60565b60408301516000906001600160a01b031630141561277e576126ab848484613216565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127c7576126ab848484613366565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b03161415612744576126ab84848461349e565b60006108e68383611f8d565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417612897578160208401fd5b506115e3610165612652565b60006128b2848411158361162c565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128d8610fab565b6001600160a01b0316141580156128f357506128f3836135d6565b1561291b57612900610fab565b6001600160a01b0316336001600160a01b0316149050610710565b612923612209565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016129529392919061445c565b60206040518083038186803b15801561296a57600080fd5b505afa15801561297e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133c9190613f89565b604080516000808252602082019092526060916129d5565b6129c2613b4a565b8152602001906001900390816129ba5790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e8490612a1e908490600401614361565b600060405180830381600087803b158015612a3857600080fd5b505af1158015612a4c573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612ab757507f0000000000000000000000000000000000000000000000000000000000000000610cd5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612b0357612afc6107f261183f565b9050610cd5565b6001600160a01b038216301415612b235750670de0b6b3a7640000610cd5565b610cd5610135612652565b6001811b1992909216911b1790565b6115e3818314606761162c565b6000818060200190518101906108e69190614212565b6000612b6f821515600461162c565b670de0b6b3a76400008302612b97841580611fc75750670de0b6b3a7640000858381611fc457fe5b82818161195c57fe5b612bb76001600160a01b038316151561019b61162c565b612bc382600083610942565b6001600160a01b038216600090815260208190526040902054612be990826101b26128a3565b6001600160a01b038316600090815260208190526040902055612c1c612c1782612c1161073a565b9061363a565b613648565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c609190614453565b60405180910390a35050565b6000612c766123ed565b82604051602001610f8e929190614317565b6000612c9a82516041146101b961162c565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612cd3908990859088908890614665565b6020604051602081039080840390855afa158015612cf5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612d2b5750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612d4360008383610942565b612d58612c1782612d5261073a565b90611c1d565b6001600160a01b038216600090815260208190526040902054612d7b9082611c1d565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c60908590614453565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612ecf7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162c565b6115d18460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f0357fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f3757fe5b6020026020010151612f4f87600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612f955761364d612f99565b6136ab5b63ffffffff16565b6000612ffd7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec7575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b03163014613058576130538460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061304557fe5b602002602001015184613714565b6115d1565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061308c57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130c057fe5b60200260200101516130d887600081518110610c9c57fe5b86613744565b600061313a7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec7575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b03163014613190576130538460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061318257fe5b6020026020010151846137aa565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131c457fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106131f857fe5b602002602001015161321087600081518110610c9c57fe5b866137ea565b600061329b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162c565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132cf57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061330357fe5b602002602001015161331b87600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461336157613851612f99565b6138a8565b60006133c27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec7575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b03163014613418576130538460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061340a57fe5b602002602001015184613912565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061344c57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061348057fe5b602002602001015161349887600081518110610c9c57fe5b8661393c565b60006134fa7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec7575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b03163014613550576130538460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061354257fe5b60200260200101518461398b565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061358457fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106135b857fe5b60200260200101516135d087600081518110610c9c57fe5b866139c0565b60006136017f9f11080e00000000000000000000000000000000000000000000000000000000610f59565b82148061071057506136327f38e9922e00000000000000000000000000000000000000000000000000000000610f59565b909114919050565b60006108e6838360016128a3565b600255565b60008061365a8684611f0c565b905060006136688287611f6d565b90506000613676868a6115e7565b9050600061369184611f8761368b8587613a14565b8a613a2e565b905061369d88826115e7565b9a9950505050505050505050565b6000806136b88684611f0c565b905060006136c68287611f6d565b905060006136dd6136d7838b613a14565b87613a4f565b905060006136eb84836115e7565b905060006136f98288613a6f565b90506137058a826115e7565b9b9a5050505050505050505050565b6000806137218484611f0c565b905060006137386137328688611c1d565b85611f0c565b905061065e81836115e7565b60008261375c576137558683611f0c565b905061109f565b60006137688684611f0c565b90506000613779613732888a611c1d565b9050600061378782846115e7565b905060006137958489611f6d565b905061369d6137a48884613a14565b82613a4f565b6000806137b78484611f0c565b905060006137c582876115e7565b905060006137d38286613a6f565b90506137df86826115e7565b979650505050505050565b6000826137f857508461109f565b60006138048684611f0c565b905060006138128287611f6d565b90506000613820878a611c1d565b9050600061382e8483611f6d565b9050600061384561383f8984613a14565b85613a4f565b905061370581896115e7565b60008261385f57508461109f565b600061386b8684611f0c565b905060006138798287611f6d565b90506000613887868a611c1d565b9050600061389c84611f8761368b8587613a14565b905061369d81896115e7565b6000826138b9576137558683613a6f565b60006138c58684611f0c565b905060006138d38287611f6d565b905060006138ea6138e4838b613a14565b87613a2e565b905060006138f88483611c1d565b905060006139068288613a6f565b9050613705818b6115e7565b60008061391f8484611f0c565b9050600061393061373286886115e7565b905061065e82826115e7565b6000806139498684611f0c565b9050600061395a613732888a6115e7565b9050600061396883836115e7565b905060006139768489611f6d565b905061369d6139858884613a14565b82613a2e565b6000806139988484611f0c565b905060006139a68287611c1d565b905060006139b48286613a6f565b90506137df81876115e7565b6000806139cd8684611f0c565b905060006139db8287611f6d565b905060006139e9878a6115e7565b905060006139f78483611f6d565b90506000613a0861383f8984613a14565b905061370588826115e7565b60008282026108e684158061194a57508385838161194757fe5b6000613a3d821515600461162c565b50811515600019909201046001010290565b6000613a5e821515600461162c565b818381613a6757fe5b049392505050565b60008160200151831015613ab857815161133c90613a9690670de0b6b3a764000090611c1d565b60208401518451613ab291613aab919061192d565b8690611c1d565b90612b60565b81604001518311613aca575081610710565b815161133c90613ae390670de0b6b3a7640000906115e7565b60408401518451613ab291613af8919061192d565b86906115e7565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561071081614732565b600082601f830112613b95578081fd5b8135613ba8613ba382614706565b6146df565b818152915060208083019084810181840286018201871015613bc957600080fd5b60005b84811015613be857813584529282019290820190600101613bcc565b505050505092915050565b600082601f830112613c03578081fd5b8151613c11613ba382614706565b818152915060208083019084810181840286018201871015613c3257600080fd5b60005b84811015613be857815184529282019290820190600101613c35565b600082601f830112613c61578081fd5b813567ffffffffffffffff811115613c77578182fd5b613c8a6020601f19601f840116016146df565b9150808252836020828501011115613ca157600080fd5b8060208401602084013760009082016020015292915050565b80356002811061071057600080fd5b6000610120808385031215613cdc578182fd5b613ce5816146df565b915050613cf28383613cba565b8152613d018360208401613b7a565b6020820152613d138360408401613b7a565b6040820152606082013560608201526080820135608082015260a082013560a0820152613d438360c08401613b7a565b60c0820152613d558360e08401613b7a565b60e08201526101008083013567ffffffffffffffff811115613d7657600080fd5b613d8285828601613c51565b82840152505092915050565b600060208284031215613d9f578081fd5b81356108e681614732565b60008060408385031215613dbc578081fd5b8235613dc781614732565b91506020830135613dd781614732565b809150509250929050565b600080600060608486031215613df6578081fd5b8335613e0181614732565b92506020840135613e1181614732565b929592945050506040919091013590565b600080600080600080600060e0888a031215613e3c578283fd5b8735613e4781614732565b96506020880135613e5781614732565b955060408801359450606088013593506080880135613e7581614747565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613ea4578182fd5b8235613eaf81614732565b946020939093013593505050565b600080600060608486031215613ed1578081fd5b835167ffffffffffffffff80821115613ee8578283fd5b818601915086601f830112613efb578283fd5b8151613f09613ba382614706565b80828252602080830192508086018b828387028901011115613f29578788fd5b8796505b84871015613f54578051613f4081614732565b845260019690960195928101928101613f2d565b508901519097509350505080821115613f6b578283fd5b50613f7886828701613bf3565b925050604084015190509250925092565b600060208284031215613f9a578081fd5b815180151581146108e6578182fd5b600060208284031215613fba578081fd5b5051919050565b600080600080600080600060e0888a031215613fdb578081fd5b873596506020880135613fed81614732565b95506040880135613ffd81614732565b9450606088013567ffffffffffffffff80821115614019578283fd5b6140258b838c01613b85565b955060808a0135945060a08a0135935060c08a0135915080821115614048578283fd5b506140558a828b01613c51565b91505092959891949750929550565b600060208284031215614075578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e6578182fd5b6000602082840312156140b5578081fd5b81516108e681614732565b600080600080608085870312156140d5578182fd5b843567ffffffffffffffff808211156140ec578384fd5b6140f888838901613cc9565b9550602087013591508082111561410d578384fd5b5061411a87828801613b85565b949794965050505060408301359260600135919050565b600080600060608486031215614145578081fd5b833567ffffffffffffffff81111561415b578182fd5b61416786828701613cc9565b9660208601359650604090950135949350505050565b60006020828403121561418e578081fd5b5035919050565b600080604083850312156141a7578182fd5b50508035926020909101359150565b600080600080608085870312156141cb578182fd5b84519350602085015192506040850151915060608501516141eb81614732565b939692955090935050565b600060208284031215614207578081fd5b81516108e681614747565b60008060408385031215614224578182fd5b825161422f81614747565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b8381101561427b5781518752958201959082019060010161425f565b509495945050505050565b15159052565b60008151808452815b818110156142b157602081850181015186830182015201614295565b818111156142c25782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b828110156143eb57815180516004811061439457fe5b8552808701516143a68887018261423f565b5085810151868601526060808201516143c18288018261423f565b5050608090810151906143d68682018361423f565b505060a093909301929085019060010161437e565b5091979650505050505050565b6000602082526108e6602083018461424c565b60006040825261441e604083018561424c565b828103602084015261109f818561424c565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156144ec576144d68451614726565b82529284019260019290920191908401906144c4565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a087015261452a818561424c565b935050506040850151818584030160c0860152614547838261428c565b92505050606084015161455d60e0850182614286565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b818110156145e4576145d28551614726565b835293830193918301916001016145c0565b505084810360408601528551808252908201925081860190845b81811015612585576146108351614726565b855293830193918301916001016145fe565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016003831061469157fe5b91905290565b6000602082526108e6602083018461428c565b6000838252604060208301526115d1604083018461424c565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156146fe57600080fd5b604052919050565b600067ffffffffffffffff82111561471c578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114611a8b57600080fd5b60ff81168114611a8b57600080fdfea26469706673582212200ebdd998c1044b1cc5a951f1955002ce126260246551333654d652ade70c43c664736f6c63430007010033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c80636634b753116200009957806376895be7116200006f57806376895be714620001cd578063851c1bb314620001e45780638d928af8146200020a578063aaabadc5146200021457620000ff565b80636634b75314620001935780636c57f5a914620001b9578063739238d614620001c357620000ff565b80632f2770db11620000db5780632f2770db146200015a5780633f819b6f146200016657806354fd4d5014620001705780635ed31282146200017a57620000ff565b8062c194db1462000104578063174481fa14620001265780632da47c401462000140575b600080fd5b6200010e6200021e565b6040516200011d919062001459565b60405180910390f35b620001306200023f565b6040516200011d929190620013f2565b6200014a62000285565b6040516200011d92919062001652565b620001646200030e565b005b6200010e62000378565b6200010e62000430565b62000184620004b2565b6040516200011d9190620013d1565b620001aa620001a43660046200114d565b620004ce565b6040516200011d919062001419565b620001aa620004f9565b6200018462000502565b62000184620001de366004620011f6565b62000526565b620001fb620001f536600462001195565b620008ee565b6040516200011d919062001424565b6200018462000942565b6200018462000966565b60606200023a6040518060200160405280600081525062000a54565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200030057807f00000000000000000000000000000000000000000000000000000000000000000392507f0000000000000000000000000000000000000000000000000000000000000000915062000309565b60009250600091505b509091565b6200031862000b2f565b6200032262000b7e565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b820191906000526020600020905b8154815290600101906020018083116200040857829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006200053262000b97565b6004805460018101909155604051606090620005516020820162000fe1565b601f1982820381018352601f909101166040526200056e62000942565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001620005a2929190620013f2565b60408051601f1981840301815290829052620005c292916020016200139e565b60405160208183030381529060405290506000620005e883838051906020012062000bb2565b9050600080620005f762000285565b915091506200060562000fef565b6200060f62000942565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508f81602001819052508e81604001819052508d816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508c816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b8160c00181815250508a8160e0018181525050828161010001818152505081816101200181815250508981610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506200076d62000378565b610160820152604051600090620007a4906200078e9084906020016200154a565b6040516020818303038152906040528a62000bca565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620007ef57600080fd5b505af115801562000804573d6000803e3d6000fd5b505050506000620008186000898962000c21565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146200088b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088290620014dc565b60405180910390fd5b6040518b9073ffffffffffffffffffffffffffffffffffffffff8416907fdd6d1f79139f1dde24a93542b6f48323b2638466a8bedffc021d605a0d34afd490600090a3509650505050505050620008e162000cff565b9998505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001620009259291906200136e565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006200097262000942565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620009b857600080fd5b505afa158015620009cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023a9190620011d7565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000a4e73ffffffffffffffffffffffffffffffffffffffff831615156101ac62000d06565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000b2181838662000d1b565b505050505050505050919050565b600062000b606000357fffffffff0000000000000000000000000000000000000000000000000000000016620008ee565b905062000b7b62000b72823362000d79565b61019162000d06565b50565b62000b9562000b8c620004f9565b1560d362000d06565b565b62000bab6002600354141561019062000d06565b6002600355565b600062000bc183833062000e17565b90505b92915050565b60008062000bd9848462000e58565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316179055949350505050565b6000808447101562000c61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000882906200146e565b825162000c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008829062001513565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088290620014a5565b949350505050565b6001600355565b8162000d175762000d178162000ef5565b5050565b5b6020811062000d3d578151835260209283019290910190601f190162000d1c565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000d8562000966565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000dc3939291906200142d565b60206040518083038186803b15801562000ddc57600080fd5b505afa15801562000df1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bc1919062001173565b60008060ff60f81b83868660405160200162000e3794939291906200130a565b60408051808303601f19018152919052805160209091012095945050505050565b600062000e6462000b7e565b600062000e72848462000f21565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a29392505050565b62000b7b817f42414c000000000000000000000000000000000000000000000000000000000062000f66565b6000606062000f308462000a54565b90506000838251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf7573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611e7e80620016b783390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b803562000bc48162001693565b600082601f830112620010dc578081fd5b813567ffffffffffffffff80821115620010f4578283fd5b6040516020601f19601f850116820101818110838211171562001115578485fd5b6040528281529250828483016020018610156200113157600080fd5b8260208601602083013760006020848301015250505092915050565b6000602082840312156200115f578081fd5b81356200116c8162001693565b9392505050565b60006020828403121562001185578081fd5b815180151581146200116c578182fd5b600060208284031215620011a7578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146200116c578182fd5b600060208284031215620011e9578081fd5b81516200116c8162001693565b60008060008060008060008060006101208a8c03121562001215578485fd5b893567ffffffffffffffff808211156200122d578687fd5b6200123b8d838e01620010cb565b9a5060208c013591508082111562001251578687fd5b50620012608c828d01620010cb565b98505060408a0135620012738162001693565b965060608a0135620012858162001693565b955060808a0135945060a08a01359350620012a48b60c08c01620010be565b925060e08a013591506101008a013590509295985092959850929598565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620012f681602086016020860162001660565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60008351620013b281846020880162001660565b835190830190620013c881836020880162001660565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000bc16020830184620012dc565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b60006020825262001560602083018451620012c2565b60208301516101808060408501526200157e6101a0850183620012dc565b91506040850151601f19808685030160608701526200159e8483620012dc565b935060608701519150620015b66080870183620012c2565b60808701519150620015cc60a0870183620012c2565b60a08701519150620015e260c0870183620012c2565b60c087015160e08781019190915287015161010080880191909152870151610120808801919091528701516101408088019190915287015191506101606200162d81880184620012c2565b870151868503909101838701529050620016488382620012dc565b9695505050505050565b918252602082015260400190565b60005b838110156200167d57818101518382015260200162001663565b838111156200168d576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000b7b57600080fdfe6101606040523480156200001257600080fd5b5060405162001e7e38038062001e7e833981016040819052620000359162000462565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000378565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200012591908101906200039e565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000449565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000449565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000378565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000378565b6001600160601b0319606091821b811660e05292811b8316610120521b166101405250620004e0915050565b6000602082840312156200038a578081fd5b81516200039781620004c7565b9392505050565b60006020808385031215620003b1578182fd5b82516001600160401b0380821115620003c8578384fd5b818501915085601f830112620003dc578384fd5b815181811115620003eb578485fd5b8381029150620003fd848301620004a0565b8181528481019084860184860187018a101562000418578788fd5b8795505b838610156200043c5780518352600195909501949186019186016200041c565b5098975050505050505050565b6000602082840312156200045b578081fd5b5051919050565b6000806040838503121562000475578081fd5b82516200048281620004c7565b60208401519092506200049581620004c7565b809150509250929050565b6040518181016001600160401b0381118282101715620004bf57600080fd5b604052919050565b6001600160a01b0381168114620004dd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c6118bb620005c36000398061050952806108215250806101335280610c145280610f335280610f955250806103bf52508061046c5280610599528061074852806108ec5280610cbf528061102952806110f3528061115552508060ea5280610190528061043052806105cc528061063152806106d2528061078452806108b152806110d152508061016f5280610402528061071a5280610a7d5280610b5c5280610dbb5280610e9a5250806099528061030952506118bb6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611588565b60405180910390f35b610077610072366004611446565b6100bb565b60405161005b9190611824565b610077610092366004611462565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc92919061173d565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c91906114e8565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a939291906115d0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a491906114c5565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f5611393565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c96113f6565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611761565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059291906114ad565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d4f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611588565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b691906114ad565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fca565b9695505050505050565b600061070d611393565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e16113f6565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611761565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa91906114ad565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fe9565b6110b7565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d4f565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a919061156c565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b6919061148d565b6101a26111e8565b60006109cd82151560046111e8565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b60056111e8565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f61141d565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016116b9565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517fead5d35900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ead5d35990610cf99030908590600190600401611650565b6040805180830381600087803b158015610d1257600080fd5b505af1158015610d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4a91906114c5565b505050565b6040805160028082526060828101909352816020015b610d6d61141d565b815260200190600190039081610d65579050509050600281600081518110610d9157fe5b6020026020010151600001906002811115610da857fe5b90816002811115610db557fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de757fe5b602002602001015160200181815250508181600081518110610e0557fe5b602002602001015160600181815250508281600081518110610e2357fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e7057fe5b6020026020010151600001906002811115610e8757fe5b90816002811115610e9457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec657fe5b602002602001015160200181815250508181600181518110610ee457fe5b602002602001015160600181815250508281600181518110610f0257fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f589084167f0000000000000000000000000000000000000000000000000000000000000000846111f6565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016116b9565b610d4a8363a9059cbb60e01b848460405160240161027a92919061162a565b6040517ff57d0b4000000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f57d0b409061105e908590600401611824565b60206040518083038186803b15801561107657600080fd5b505afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae91906114ad565b60010192915050565b61111873ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f0000000000000000000000000000000000000000000000000000000000000000836111f6565b6040517f2f2cab8700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632f2cab87906111929030908590600090600190600401611680565b602060405180830381600087803b1580156111ac57600080fd5b505af11580156111c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e491906114ad565b5050565b816111e4576111e4816112eb565b80158015906112a757506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e9061125490309086906004016115a9565b60206040518083038186803b15801561126c57600080fd5b505afa158015611280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a491906114ad565b15155b156112cc576112cc8363095ea7b360e01b84600060405160240161027a929190611601565b610d4a8363095ea7b360e01b848460405160240161027a92919061162a565b611315817f42414c0000000000000000000000000000000000000000000000000000000000611318565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b600060208284031215611457578081fd5b813561011b81611863565b60008060408385031215611474578081fd5b823561147f81611863565b946020939093013593505050565b60006020828403121561149e578081fd5b8151801515811461011b578182fd5b6000602082840312156114be578081fd5b5051919050565b600080604083850312156114d7578182fd5b505080516020909101519092909150565b600080600080608085870312156114fd578182fd5b845193506020850151925060408501519150606085015161151d81611863565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161157e81846020870161182d565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff93909316835260208301919091521515604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff949094168452602084019290925261ffff1660408301521515606082015260800190565b602080825282518282018190526000919060409081850190868401855b828110156117305781518051600381106116ec57fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff168686015260609081015190850152608090930192908501906001016116d6565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a0830152602084015161177c81611859565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c06101408401528051806101608501526101806117e8828287016020860161182d565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b6020830184611528565b90815260200190565b60005b83811015611848578181015183820152602001611830565b838111156102fc5750506000910152565b6002811061131557fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461131557600080fdfea264697066735822122071c747d079b6f1053812d61a96fcbf5bc452dc911a12f909d0042f154ded1ef764736f6c63430007010033a2646970667358221220e411705eb4d0d90a247bed54b78a82037b8b41968c8fa943497523ed1fbb743f64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/artifact/AaveLinearPoolRebalancer.json b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/artifact/AaveLinearPoolRebalancer.json new file mode 100644 index 0000000..0687591 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/artifact/AaveLinearPoolRebalancer.json @@ -0,0 +1,83 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "AaveLinearPoolRebalancer", + "sourceName": "contracts/aave-v2-linear-pool/AaveLinearPoolRebalancer.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IBalancerQueries", + "name": "queries", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "getPool", + "outputs": [ + { + "internalType": "contract ILinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "rebalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "extraMain", + "type": "uint256" + } + ], + "name": "rebalanceWithExtraMain", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101606040523480156200001257600080fd5b5060405162001e7e38038062001e7e833981016040819052620000359162000462565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000378565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200012591908101906200039e565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000449565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000449565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000378565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000378565b6001600160601b0319606091821b811660e05292811b8316610120521b166101405250620004e0915050565b6000602082840312156200038a578081fd5b81516200039781620004c7565b9392505050565b60006020808385031215620003b1578182fd5b82516001600160401b0380821115620003c8578384fd5b818501915085601f830112620003dc578384fd5b815181811115620003eb578485fd5b8381029150620003fd848301620004a0565b8181528481019084860184860187018a101562000418578788fd5b8795505b838610156200043c5780518352600195909501949186019186016200041c565b5098975050505050505050565b6000602082840312156200045b578081fd5b5051919050565b6000806040838503121562000475578081fd5b82516200048281620004c7565b60208401519092506200049581620004c7565b809150509250929050565b6040518181016001600160401b0381118282101715620004bf57600080fd5b604052919050565b6001600160a01b0381168114620004dd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c6118bb620005c36000398061050952806108215250806101335280610c145280610f335280610f955250806103bf52508061046c5280610599528061074852806108ec5280610cbf528061102952806110f3528061115552508060ea5280610190528061043052806105cc528061063152806106d2528061078452806108b152806110d152508061016f5280610402528061071a5280610a7d5280610b5c5280610dbb5280610e9a5250806099528061030952506118bb6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611588565b60405180910390f35b610077610072366004611446565b6100bb565b60405161005b9190611824565b610077610092366004611462565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc92919061173d565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c91906114e8565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a939291906115d0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a491906114c5565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f5611393565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c96113f6565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611761565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059291906114ad565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d4f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611588565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b691906114ad565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fca565b9695505050505050565b600061070d611393565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e16113f6565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611761565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa91906114ad565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fe9565b6110b7565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d4f565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a919061156c565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b6919061148d565b6101a26111e8565b60006109cd82151560046111e8565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b60056111e8565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f61141d565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016116b9565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517fead5d35900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ead5d35990610cf99030908590600190600401611650565b6040805180830381600087803b158015610d1257600080fd5b505af1158015610d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4a91906114c5565b505050565b6040805160028082526060828101909352816020015b610d6d61141d565b815260200190600190039081610d65579050509050600281600081518110610d9157fe5b6020026020010151600001906002811115610da857fe5b90816002811115610db557fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de757fe5b602002602001015160200181815250508181600081518110610e0557fe5b602002602001015160600181815250508281600081518110610e2357fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e7057fe5b6020026020010151600001906002811115610e8757fe5b90816002811115610e9457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec657fe5b602002602001015160200181815250508181600181518110610ee457fe5b602002602001015160600181815250508281600181518110610f0257fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f589084167f0000000000000000000000000000000000000000000000000000000000000000846111f6565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016116b9565b610d4a8363a9059cbb60e01b848460405160240161027a92919061162a565b6040517ff57d0b4000000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f57d0b409061105e908590600401611824565b60206040518083038186803b15801561107657600080fd5b505afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae91906114ad565b60010192915050565b61111873ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f0000000000000000000000000000000000000000000000000000000000000000836111f6565b6040517f2f2cab8700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632f2cab87906111929030908590600090600190600401611680565b602060405180830381600087803b1580156111ac57600080fd5b505af11580156111c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e491906114ad565b5050565b816111e4576111e4816112eb565b80158015906112a757506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e9061125490309086906004016115a9565b60206040518083038186803b15801561126c57600080fd5b505afa158015611280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a491906114ad565b15155b156112cc576112cc8363095ea7b360e01b84600060405160240161027a929190611601565b610d4a8363095ea7b360e01b848460405160240161027a92919061162a565b611315817f42414c0000000000000000000000000000000000000000000000000000000000611318565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b600060208284031215611457578081fd5b813561011b81611863565b60008060408385031215611474578081fd5b823561147f81611863565b946020939093013593505050565b60006020828403121561149e578081fd5b8151801515811461011b578182fd5b6000602082840312156114be578081fd5b5051919050565b600080604083850312156114d7578182fd5b505080516020909101519092909150565b600080600080608085870312156114fd578182fd5b845193506020850151925060408501519150606085015161151d81611863565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161157e81846020870161182d565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff93909316835260208301919091521515604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff949094168452602084019290925261ffff1660408301521515606082015260800190565b602080825282518282018190526000919060409081850190868401855b828110156117305781518051600381106116ec57fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff168686015260609081015190850152608090930192908501906001016116d6565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a0830152602084015161177c81611859565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c06101408401528051806101608501526101806117e8828287016020860161182d565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b6020830184611528565b90815260200190565b60005b83811015611848578181015183820152602001611830565b838111156102fc5750506000910152565b6002811061131557fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461131557600080fdfea264697066735822122071c747d079b6f1053812d61a96fcbf5bc452dc911a12f909d0042f154ded1ef764736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611588565b60405180910390f35b610077610072366004611446565b6100bb565b60405161005b9190611824565b610077610092366004611462565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc92919061173d565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c91906114e8565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a939291906115d0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a491906114c5565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f5611393565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c96113f6565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611761565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059291906114ad565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d4f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611588565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b691906114ad565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fca565b9695505050505050565b600061070d611393565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e16113f6565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611761565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa91906114ad565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fe9565b6110b7565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d4f565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a919061156c565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b6919061148d565b6101a26111e8565b60006109cd82151560046111e8565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b60056111e8565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f61141d565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016116b9565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517fead5d35900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ead5d35990610cf99030908590600190600401611650565b6040805180830381600087803b158015610d1257600080fd5b505af1158015610d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4a91906114c5565b505050565b6040805160028082526060828101909352816020015b610d6d61141d565b815260200190600190039081610d65579050509050600281600081518110610d9157fe5b6020026020010151600001906002811115610da857fe5b90816002811115610db557fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de757fe5b602002602001015160200181815250508181600081518110610e0557fe5b602002602001015160600181815250508281600081518110610e2357fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e7057fe5b6020026020010151600001906002811115610e8757fe5b90816002811115610e9457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec657fe5b602002602001015160200181815250508181600181518110610ee457fe5b602002602001015160600181815250508281600181518110610f0257fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f589084167f0000000000000000000000000000000000000000000000000000000000000000846111f6565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016116b9565b610d4a8363a9059cbb60e01b848460405160240161027a92919061162a565b6040517ff57d0b4000000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f57d0b409061105e908590600401611824565b60206040518083038186803b15801561107657600080fd5b505afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae91906114ad565b60010192915050565b61111873ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f0000000000000000000000000000000000000000000000000000000000000000836111f6565b6040517f2f2cab8700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632f2cab87906111929030908590600090600190600401611680565b602060405180830381600087803b1580156111ac57600080fd5b505af11580156111c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e491906114ad565b5050565b816111e4576111e4816112eb565b80158015906112a757506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e9061125490309086906004016115a9565b60206040518083038186803b15801561126c57600080fd5b505afa158015611280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a491906114ad565b15155b156112cc576112cc8363095ea7b360e01b84600060405160240161027a929190611601565b610d4a8363095ea7b360e01b848460405160240161027a92919061162a565b611315817f42414c0000000000000000000000000000000000000000000000000000000000611318565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b600060208284031215611457578081fd5b813561011b81611863565b60008060408385031215611474578081fd5b823561147f81611863565b946020939093013593505050565b60006020828403121561149e578081fd5b8151801515811461011b578182fd5b6000602082840312156114be578081fd5b5051919050565b600080604083850312156114d7578182fd5b505080516020909101519092909150565b600080600080608085870312156114fd578182fd5b845193506020850151925060408501519150606085015161151d81611863565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161157e81846020870161182d565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff93909316835260208301919091521515604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff949094168452602084019290925261ffff1660408301521515606082015260800190565b602080825282518282018190526000919060409081850190868401855b828110156117305781518051600381106116ec57fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff168686015260609081015190850152608090930192908501906001016116d6565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a0830152602084015161177c81611859565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c06101408401528051806101608501526101806117e8828287016020860161182d565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b6020830184611528565b90815260200190565b60005b83811015611848578181015183820152602001611830565b838111156102fc5750506000910152565b6002811061131557fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461131557600080fdfea264697066735822122071c747d079b6f1053812d61a96fcbf5bc452dc911a12f909d0042f154ded1ef764736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/index.ts b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/index.ts new file mode 100644 index 0000000..c98aaaf --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/index.ts @@ -0,0 +1,106 @@ +import { ethers } from 'hardhat'; +import { randomBytes } from 'ethers/lib/utils'; +import { bn } from '@helpers/numbers'; +import { Task, TaskMode, TaskRunOptions } from '@src'; +import { AaveLinearPoolDeployment } from './input'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import * as expectEvent from '@helpers/expectEvent'; +import { getContractDeploymentTransactionHash, saveContractDeploymentTransactionHash } from '@src'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as AaveLinearPoolDeployment; + const args = [ + input.Vault, + input.ProtocolFeePercentagesProvider, + input.BalancerQueries, + input.FactoryVersion, + input.PoolVersion, + input.InitialPauseWindowDuration, + input.BufferPeriodDuration, + ]; + + const factory = await task.deployAndVerify('AaveLinearPoolFactory', args, from, force); + + if (task.mode === TaskMode.LIVE) { + // We also create a Pool using the factory and verify it, to let us compute their action IDs and so that future + // Pools are automatically verified. We however don't run any of this code in CHECK mode, since we don't care about + // the contracts deployed here. The action IDs will be checked to be correct via a different mechanism. + + // AaveLinearPools require a StaticAToken, which in turn requires a LendingPool. + const mockLendingPool = await task.deployAndVerify('MockAaveLendingPool', [], from, force); + const mockStaticATokenArgs = ['DO NOT USE - Mock Static AToken', 'TEST', 18, input.WETH, mockLendingPool.address]; + const mockStaticAToken = await task.deployAndVerify('MockStaticAToken', mockStaticATokenArgs, from, force); + + // The assetManager, pauseWindowDuration and bufferPeriodDuration will be filled in later, but we need to declare + // them here to appease the type system. Those are constructor arguments, but automatically provided by the factory. + const mockPoolArgs = { + vault: input.Vault, + name: 'DO NOT USE - Mock Linear Pool', + symbol: 'TEST', + mainToken: input.WETH, + wrappedToken: mockStaticAToken.address, + assetManager: undefined, + upperTarget: 0, + pauseWindowDuration: undefined, + bufferPeriodDuration: undefined, + swapFeePercentage: bn(1e12), + owner: ZERO_ADDRESS, + version: input.PoolVersion, + }; + + // This mimics the logic inside task.deploy + if (force || !task.output({ ensure: false })['MockAaveLinearPool']) { + const PROTOCOL_ID = 0; + const SALT = randomBytes(32); + + const poolCreationReceipt = await ( + await factory.create( + mockPoolArgs.name, + mockPoolArgs.symbol, + mockPoolArgs.mainToken, + mockPoolArgs.wrappedToken, + mockPoolArgs.upperTarget, + mockPoolArgs.swapFeePercentage, + mockPoolArgs.owner, + PROTOCOL_ID, + SALT + ) + ).wait(); + const event = expectEvent.inReceipt(poolCreationReceipt, 'PoolCreated'); + const mockPoolAddress = event.args.pool; + + await saveContractDeploymentTransactionHash(mockPoolAddress, poolCreationReceipt.transactionHash, task.network); + await task.save({ MockAaveLinearPool: mockPoolAddress }); + } + + const mockPool = await task.instanceAt('AaveLinearPool', task.output()['MockAaveLinearPool']); + + // In order to verify the Pool's code, we need to complete its constructor arguments by computing the factory + // provided arguments (asset manager and pause durations). + + // The asset manager is found by querying the Vault + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, task.network); + const vault = await vaultTask.deployedInstance('Vault'); + + const { assetManager: assetManagerAddress } = await vault.getPoolTokenInfo(await mockPool.getPoolId(), input.WETH); + mockPoolArgs.assetManager = assetManagerAddress; + + // The durations require knowing when the Pool was created, so we look for the timestamp of its creation block. + const txHash = await getContractDeploymentTransactionHash(mockPool.address, task.network); + const tx = await ethers.provider.getTransactionReceipt(txHash); + const poolCreationBlock = await ethers.provider.getBlock(tx.blockNumber); + + // With those and the period end times, we can compute the durations. + const { pauseWindowEndTime, bufferPeriodEndTime } = await mockPool.getPausedState(); + mockPoolArgs.pauseWindowDuration = pauseWindowEndTime.sub(poolCreationBlock.timestamp); + mockPoolArgs.bufferPeriodDuration = bufferPeriodEndTime + .sub(poolCreationBlock.timestamp) + .sub(mockPoolArgs.pauseWindowDuration); + + // We are now ready to verify the Pool + await task.verify('AaveLinearPool', mockPool.address, [mockPoolArgs]); + + // We can also verify the Asset Manager + await task.verify('AaveLinearPoolRebalancer', assetManagerAddress, [input.Vault, input.BalancerQueries]); + } +}; diff --git a/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/input.ts b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/input.ts new file mode 100644 index 0000000..834ba3a --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/input.ts @@ -0,0 +1,31 @@ +import { Task, TaskMode } from '@src'; +import { MONTH } from '@helpers/time'; + +export type AaveLinearPoolDeployment = { + Vault: string; + BalancerQueries: string; + ProtocolFeePercentagesProvider: string; + WETH: string; + FactoryVersion: string; + PoolVersion: string; + InitialPauseWindowDuration: number; + BufferPeriodDuration: number; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerQueries = new Task('20220721-balancer-queries', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); +const WETH = new Task('00000000-tokens', TaskMode.READ_ONLY); + +const BaseVersion = { version: 5, deployment: '20230410-aave-linear-pool-v5' }; + +export default { + Vault, + BalancerQueries, + ProtocolFeePercentagesProvider, + WETH, + FactoryVersion: JSON.stringify({ name: 'AaveLinearPoolFactory', ...BaseVersion }), + PoolVersion: JSON.stringify({ name: 'AaveLinearPool', ...BaseVersion }), + InitialPauseWindowDuration: MONTH * 3, + BufferPeriodDuration: MONTH, +}; diff --git a/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/arbitrum.json b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/arbitrum.json new file mode 100644 index 0000000..d7cf9e5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/arbitrum.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0x7396f99B48e7436b152427bfA3DD6Aa8C7C6d05B", + "MockAaveLendingPool": "0x533a16F90E7d3Ca31dbc608E5EC54967710F0D2A", + "MockStaticAToken": "0x8b7854708c0C54f9D7d1FF351D4F84E6dE0E134C", + "MockAaveLinearPool": "0x19b1C92631405A0a9495ccbA0BeCF4f2e8e908bD" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/avalanche.json b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/avalanche.json new file mode 100644 index 0000000..6e956f5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/avalanche.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0x6caf662b573F577DE01165d2d38D1910bba41F8A", + "MockAaveLendingPool": "0x57EA28A99394978D060E483477C0Fd9fb9aFa96c", + "MockStaticAToken": "0xD8B6b96c88ad626EB6209c4876e3B14f45f8803A", + "MockAaveLinearPool": "0xA826a114B0c7dB4d1FF4a4BE845a78998c64564C" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/base.json b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/base.json new file mode 100644 index 0000000..5b634e0 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/base.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0x687b8C9b41E01Be8B591725fac5d5f52D0564d79", + "MockAaveLendingPool": "0x88ED12A90142fDBFe2a28f7d5b48927254C7e760", + "MockStaticAToken": "0x698CaED853bE9cEA96C268f565e2b61D3b2BcDA4", + "MockAaveLinearPool": "0x712e23a9B91Aa30EE7997d1c7a1a285d4C7912D1" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/bsc.json b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/bsc.json new file mode 100644 index 0000000..3bc8b4c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/bsc.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0xE605Dbe1cA85dCdb8F43CEfA427f3B0fC06f6ba6", + "MockAaveLendingPool": "0x5F43FBa61f63Fa6bFF101a0A0458cEA917f6B347", + "MockStaticAToken": "0xC101dcA301a4011C1F925e9622e749e550a1B667", + "MockAaveLinearPool": "0x2Ba5fd37e71Ab2633602553BE7ad5A377D7ED31A" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/gnosis.json b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/gnosis.json new file mode 100644 index 0000000..70e5be6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/gnosis.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0x62aaB12865d7281048c337D53a4dde9d770321E6", + "MockAaveLendingPool": "0x040dBA12Bb3D5C0A73ddfe84C220Be3ddBA06966", + "MockStaticAToken": "0x35d8f4a4C0E95f3d925CB4CbBbf513a0172eD8A4", + "MockAaveLinearPool": "0x1AC55C31DaC78ca943CB8ebfCa5945ce09e036e2" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/mainnet.json b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/mainnet.json new file mode 100644 index 0000000..df8a983 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/mainnet.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0x0b576c1245F479506e7C8bbc4dB4db07C1CD31F9", + "MockAaveLendingPool": "0x28fa1E40011aDF98898E8243B2a48BB21EbF0C29", + "MockStaticAToken": "0x1F3C910c416eD2340150281C5eB93325C38817A1", + "MockAaveLinearPool": "0x4cE277Df0FeB5B4d07a0ca2ADCf5326E4005239d" +} diff --git a/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/optimism.json b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/optimism.json new file mode 100644 index 0000000..b3936ef --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/optimism.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0x7396f99B48e7436b152427bfA3DD6Aa8C7C6d05B", + "MockAaveLendingPool": "0x533a16F90E7d3Ca31dbc608E5EC54967710F0D2A", + "MockStaticAToken": "0x8b7854708c0C54f9D7d1FF351D4F84E6dE0E134C", + "MockAaveLinearPool": "0x45d37982784F022A9864748b4E8750e1e7019604" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/polygon.json b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/polygon.json new file mode 100644 index 0000000..8a2e8d9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/polygon.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0xAB2372275809E15198A7968C7f324053867cdB0C", + "MockAaveLendingPool": "0x0Df6bb26533EB86F371B1F70EeCdD955420523C6", + "MockStaticAToken": "0xE72B2780D3C57F781Bd4E8572E200CD7E9A447C2", + "MockAaveLinearPool": "0x0889b240A5876aae745Ac19f1771853671dC5d36" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/sepolia.json b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/sepolia.json new file mode 100644 index 0000000..9d7767c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/sepolia.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0xDF9B5B00Ef9bca66e9902Bd813dB14e4343Be025", + "MockAaveLendingPool": "0x300Ab2038EAc391f26D9F895dc61F8F66a548833", + "MockStaticAToken": "0x03F3Fb107e74F2EAC9358862E91ad3c692712054", + "MockAaveLinearPool": "0xE4EfD99f3C03778ba913Eb578C599329634e2bd7" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/zkevm.json b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/zkevm.json new file mode 100644 index 0000000..bbb8705 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/output/zkevm.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0x4b7b369989e613ff2C65768B7Cf930cC927F901E", + "MockAaveLendingPool": "0x161f4014C27773840ccb4EC1957113e6DD028846", + "MockStaticAToken": "0x4638ab64022927C9bD5947607459D13f57f1551C", + "MockAaveLinearPool": "0xbFD65c6160CFd638A85C645e6e6d8ACac5Dac935" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/readme.md b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/readme.md new file mode 100644 index 0000000..229dd77 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/readme.md @@ -0,0 +1,20 @@ +# 2023-04-10 - Aave Linear Pool v5 + +Deployment of the `AaveLinearPoolFactory`, for Linear Pools with a wrapped aToken (Aave V2). +Supersedes `20230206-aave-rebalancer-linear-pool`, modifying the pool factory to use Create2 when deploying a new pool. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`AaveLinearPool` artifact](./artifact/AaveLinearPool.json) +- [`AaveLinearPoolFactory` artifact](./artifact/AaveLinearPoolFactory.json) +- [`AaveLinearPoolRebalancer` artifact](./artifact/AaveLinearPoolRebalancer.json) diff --git a/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/test/interfaces/ILendingPool.sol b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/test/interfaces/ILendingPool.sol new file mode 100644 index 0000000..3fc54ad --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/test/interfaces/ILendingPool.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity >=0.7.0 <0.9.0; + +interface ILendingPool { + /** + * @dev returns a 27 decimal fixed point 'ray' value so a rate of 1 is represented as 1e27 + */ + function getReserveNormalizedIncome(address asset) external view returns (uint256); +} diff --git a/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/test/interfaces/IStaticAToken.sol b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/test/interfaces/IStaticAToken.sol new file mode 100644 index 0000000..4c2b413 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/test/interfaces/IStaticAToken.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity >=0.7.0 <0.9.0; + +import "./ILendingPool.sol"; + +interface IStaticAToken { + /** + * @dev returns the address of the staticAToken's underlying asset + */ + // solhint-disable-next-line func-name-mixedcase + function ASSET() external view returns (address); + + /** + * @dev returns the address of the staticAToken's lending pool + */ + // solhint-disable-next-line func-name-mixedcase + function LENDING_POOL() external view returns (ILendingPool); + + /** + * @dev returns a 27 decimal fixed point 'ray' value so a rate of 1 is represented as 1e27 + */ + function rate() external view returns (uint256); + + function deposit( + address, + uint256, + uint16, + bool + ) external returns (uint256); + + function withdraw( + address, + uint256, + bool + ) external returns (uint256, uint256); + + function staticToDynamicAmount(uint256 amount) external view returns (uint256); +} diff --git a/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/test/test.fork.ts b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/test/test.fork.ts new file mode 100644 index 0000000..b7f0dc5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-aave-linear-pool-v5/test/test.fork.ts @@ -0,0 +1,387 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { randomBytes } from 'ethers/lib/utils'; +import { BigNumber, Contract } from 'ethers'; +import { setCode } from '@nomicfoundation/hardhat-network-helpers'; +import * as expectEvent from '@helpers/expectEvent'; +import { bn, fp, FP_ONE } from '@helpers/numbers'; +import { MAX_UINT256 } from '@helpers/constants'; +import { deploy, instanceAt, getArtifact } from '@src'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { SwapKind } from '@helpers/models/types/types'; + +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode, getSigners } from '@src'; + +describeForkTest('AaveLinearPoolFactory V5', 'mainnet', 16592300, function () { + let owner: SignerWithAddress, holder: SignerWithAddress, other: SignerWithAddress; + let factory: Contract, vault: Contract, usdt: Contract; + let rebalancer: Contract; + + let task: Task; + + const USDT = '0xdAC17F958D2ee523a2206206994597C13D831ec7'; + const waUSDT = '0xf8Fd466F12e236f4c96F7Cce6c79EAdB819abF58'; + const USDT_LENDING_POOL = '0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9'; + + const USDT_SCALING = bn(1e12); // USDT has 6 decimals, so its scaling factor is 1e12 + + const USDT_HOLDER = '0x5754284f345afc66a98fbb0a0afe71e0f007b949'; + + const SWAP_FEE_PERCENTAGE = fp(0.01); // 1% + + // The targets are set using 18 decimals, even if the token has fewer (as is the case for USDT); + const INITIAL_UPPER_TARGET = fp(1e7); + + // The initial midpoint (upper target / 2) must be between the final lower and upper targets + const FINAL_LOWER_TARGET = fp(0.2e7); + const FINAL_UPPER_TARGET = fp(5e7); + + const PROTOCOL_ID = 0; + const TASK_NAME = '20230410-aave-linear-pool-v5'; + const VERSION = 5; + const SALT = randomBytes(32); + + enum AttackType { + SET_TARGETS, + SET_SWAP_FEE, + } + + let pool: Contract; + let poolId: string; + + before('run task', async () => { + task = new Task(TASK_NAME, TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('AaveLinearPoolFactory'); + }); + + before('load signers', async () => { + [, owner, other] = await getSigners(); + + holder = await impersonate(USDT_HOLDER, fp(100)); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + + usdt = await task.instanceAt('IERC20', USDT); + await usdt.connect(holder).approve(vault.address, MAX_UINT256); + }); + + enum LinearPoolState { + BALANCED, + MAIN_EXCESS, + MAIN_LACK, + } + + function itRebalancesThePool(expectedState: LinearPoolState) { + it('rebalance the pool', async () => { + const { lowerTarget, upperTarget } = await pool.getTargets(); + + const { cash } = await vault.getPoolTokenInfo(poolId, USDT); + const scaledCash = cash.mul(USDT_SCALING); + + let fees; + if (scaledCash.gt(upperTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_EXCESS); + + const excess = scaledCash.sub(upperTarget); + fees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else if (scaledCash.lt(lowerTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_LACK); + + const lack = lowerTarget.sub(scaledCash); + fees = lack.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else { + expect(expectedState).to.equal(LinearPoolState.BALANCED); + + fees = 0; + } + + const initialRecipientMainBalance = await usdt.balanceOf(other.address); + if (expectedState != LinearPoolState.BALANCED) { + await rebalancer.connect(holder).rebalance(other.address); + } else { + await rebalancer.connect(holder).rebalanceWithExtraMain(other.address, 5); + } + const finalRecipientMainBalance = await usdt.balanceOf(other.address); + + if (fees > 0) { + // The recipient of the rebalance call should get the fees that were collected (though there's some rounding + // error in the main-wrapped conversion). + expect(finalRecipientMainBalance.sub(initialRecipientMainBalance)).to.be.almostEqual( + fees.div(USDT_SCALING), + 0.00000001 + ); + } else { + // The recipient of the rebalance call will get any extra main tokens that were not utilized. + expect(finalRecipientMainBalance).to.be.almostEqual(initialRecipientMainBalance, 0.00000001); + } + + const mainInfo = await vault.getPoolTokenInfo(poolId, USDT); + + const expectedMainBalance = lowerTarget.add(upperTarget).div(2); + expect(mainInfo.cash.mul(USDT_SCALING)).to.equal(expectedMainBalance); + expect(mainInfo.managed).to.equal(0); + }); + } + + describe('create and check getters', () => { + it('deploy a linear pool', async () => { + const tx = await factory.create( + '', + '', + USDT, + waUSDT, + INITIAL_UPPER_TARGET, + SWAP_FEE_PERCENTAGE, + owner.address, + PROTOCOL_ID, + SALT + ); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await task.instanceAt('AaveLinearPool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + const { assetManager } = await vault.getPoolTokenInfo(poolId, USDT); // We could query for either USDT or waUSDT + rebalancer = await task.instanceAt('AaveLinearPoolRebalancer', assetManager); + + await usdt.connect(holder).approve(rebalancer.address, MAX_UINT256); // To send extra main on rebalance + }); + + it('check factory version', async () => { + const expectedFactoryVersion = { + name: 'AaveLinearPoolFactory', + version: VERSION, + deployment: TASK_NAME, + }; + + expect(await factory.version()).to.equal(JSON.stringify(expectedFactoryVersion)); + }); + + it('check pool version', async () => { + const expectedPoolVersion = { + name: 'AaveLinearPool', + version: VERSION, + deployment: TASK_NAME, + }; + + expect(await pool.version()).to.equal(JSON.stringify(expectedPoolVersion)); + }); + }); + + describe('join, and rebalance', () => { + it('join the pool', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const joinAmount = INITIAL_UPPER_TARGET.mul(2).div(USDT_SCALING); + + await vault + .connect(holder) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: USDT, assetOut: pool.address, amount: joinAmount, userData: '0x' }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert join amount - some fees will be collected as we're going over the upper target. + const excess = joinAmount.mul(USDT_SCALING).sub(INITIAL_UPPER_TARGET); + const joinCollectedFees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + + const expectedBPT = joinAmount.mul(USDT_SCALING).sub(joinCollectedFees); + expect(await pool.balanceOf(holder.address)).to.equal(expectedBPT); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + + it('set final targets', async () => { + await pool.connect(owner).setTargets(FINAL_LOWER_TARGET, FINAL_UPPER_TARGET); + }); + }); + + describe('generate excess of main token and rebalance', () => { + it('deposit main tokens', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const { upperTarget } = await pool.getTargets(); + const joinAmount = upperTarget.mul(5).div(USDT_SCALING); + + await vault + .connect(holder) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: USDT, assetOut: pool.address, amount: joinAmount, userData: '0x' }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + }); + + describe('generate lack of main token and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to withdraw enough man token to bring the Pool below its lower target, which will let us later + // rebalance. + + const { cash } = await vault.getPoolTokenInfo(poolId, USDT); + const scaledCash = cash.mul(USDT_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(USDT_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDT, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_LACK); + }); + + describe('join below upper target and rebalance', () => { + it('deposit main tokens', async () => { + // We're going to join with few tokens, causing the Pool to not reach its upper target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const joinAmount = midpoint.div(100).div(USDT_SCALING); + + await vault + .connect(holder) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: USDT, assetOut: pool.address, amount: joinAmount, userData: '0x' }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('exit above lower target and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to exit with few tokens, causing for the Pool to not reach its lower target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const exitAmount = midpoint.div(100).div(USDT_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDT, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalance repeatedly', () => { + itRebalancesThePool(LinearPoolState.BALANCED); + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalancer query protection', async () => { + it('reverts with a malicious lending pool', async () => { + const { cash } = await vault.getPoolTokenInfo(poolId, USDT); + const scaledCash = cash.mul(USDT_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(USDT_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDT, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + + await setCode(USDT_LENDING_POOL, getArtifact('MockAaveLendingPool').deployedBytecode); + const mockLendingPool = await instanceAt('MockAaveLendingPool', USDT_LENDING_POOL); + + await mockLendingPool.setRevertType(2); // Type 2 is malicious swap query revert + await expect(rebalancer.rebalance(other.address)).to.be.revertedWith('BAL#357'); // MALICIOUS_QUERY_REVERT + }); + }); + + describe('read-only reentrancy protection', () => { + let attacker: Contract; + + before('deploy attacker', async () => { + attacker = await deploy('ReadOnlyReentrancyAttackerAaveLP', [vault.address]); + }); + + async function performAttack(attackType: AttackType, ethAmount: BigNumber, expectRevert: boolean) { + // To trigger the callback and revert, send more than we need for the deposit + // If we send just enough, there will be no "extra" ETH, and it won't trigger the callback and attack + const amountToSend = expectRevert ? ethAmount.add(1) : ethAmount; + + const attack = attacker.startAttack(pool.address, attackType, ethAmount, { value: amountToSend }); + if (expectRevert) { + await expect(attack).to.be.revertedWith('BAL#420'); + } else { + await expect(attack).to.not.be.reverted; + } + } + + function itPerformsAttack(expectRevert: boolean) { + const action = expectRevert ? 'triggers' : 'does not trigger'; + + context('set targets', () => { + it(`${action} the set targets attack`, async () => { + await performAttack(AttackType.SET_TARGETS, fp(1), expectRevert); + }); + }); + + context('set swap fee', () => { + it(`${action} the set swap fee attack`, async () => { + await performAttack(AttackType.SET_SWAP_FEE, fp(1), expectRevert); + }); + }); + } + + context('when exactly enough ETH is sent', () => { + itPerformsAttack(false); + }); + + context('when too much ETH is sent', () => { + itPerformsAttack(true); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/artifact/SiloExchangeRateModel.json b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/artifact/SiloExchangeRateModel.json new file mode 100644 index 0000000..4663273 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/artifact/SiloExchangeRateModel.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SiloExchangeRateModel", + "sourceName": "contracts/silo-linear-pool/SiloExchangeRateModel.sol", + "abi": [], + "bytecode": "0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220d529d72cb3debbabd10de58968caf38f16d08026ed1686a45b9d60f82848498c64736f6c63430007010033", + "deployedBytecode": "0x6080604052600080fdfea2646970667358221220d529d72cb3debbabd10de58968caf38f16d08026ed1686a45b9d60f82848498c64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/artifact/SiloLinearPool.json b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/artifact/SiloLinearPool.json new file mode 100644 index 0000000..a7c2246 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/artifact/SiloLinearPool.json @@ -0,0 +1,1245 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SiloLinearPool", + "sourceName": "contracts/silo-linear-pool/SiloLinearPool.sol", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "assetManager", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + } + ], + "internalType": "struct SiloLinearPool.ConstructorArgs", + "name": "args", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "paused", + "type": "bool" + } + ], + "name": "PausedStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "RecoveryModeStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + } + ], + "name": "SwapFeePercentageChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lowerTarget", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + } + ], + "name": "TargetsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "enableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBptIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMainIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMainToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getNextNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPausedState", + "outputs": [ + { + "internalType": "bool", + "name": "paused", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "pauseWindowEndTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodEndTime", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeesCollector", + "outputs": [ + { + "internalType": "contract IProtocolFeesCollector", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getScalingFactors", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSwapFeePercentage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTargets", + "outputs": [ + { + "internalType": "uint256", + "name": "lowerTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVirtualSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedTokenRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "inRecoveryMode", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onExitPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "dueProtocolFees", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onJoinPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "dueProtocolFees", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IERC20", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IPoolSwapStructs.SwapRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "indexIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "indexOut", + "type": "uint256" + } + ], + "name": "onSwap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IERC20", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IPoolSwapStructs.SwapRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "balanceTokenIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balanceTokenOut", + "type": "uint256" + } + ], + "name": "onSwap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryExit", + "outputs": [ + { + "internalType": "uint256", + "name": "bptIn", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryJoin", + "outputs": [ + { + "internalType": "uint256", + "name": "bptOut", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + } + ], + "name": "setSwapFeePercentage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newLowerTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newUpperTarget", + "type": "uint256" + } + ], + "name": "setTargets", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6102c06040523480156200001257600080fd5b506040516200604138038062006041833981016040819052620000359162000e03565b6101608101518151602083015160408401516060850151608086015160c0870151620000618862000479565b60e08901516101008a01516101208b01516101408c01518a6200009e8160006200008c8c8c62000502565b89620005b360201b620014231760201c565b8b8b86868686838387878b86336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000ed92919062000c8c565b5080516200010390600490602084019062000c8c565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001829050630163f50083111561019462000781565b620001966276a70082111561019562000781565b4291909101610140819052016101605260601b6001600160601b031916610180526101a08690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000dc4565b6001600160a01b03166101c0816001600160a01b031660601b8152505050505050505050876001600160a01b03166101e0816001600160a01b031660601b81525050866001600160a01b0316610200816001600160a01b031660601b81525050866001600160a01b0316886001600160a01b031610620002bb576002620002be565b60015b60ff16610220526001600160a01b0380881690891610620002e1576001620002e4565b60025b60ff1661024052620002f68862000796565b61026052620003058762000796565b6102805260006200031889828962000842565b62000323856200093c565b5050505050505050505050506200034081620009cb60201b60201c565b50600081608001519050620003ea816001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038857600080fd5b505afa1580156200039d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003c3919062000dc4565b6001600160a01b031683606001516001600160a01b0316146102086200078160201b60201c565b806001600160a01b031663eb3beb296040518163ffffffff1660e01b815260040160206040518083038186803b1580156200042457600080fd5b505afa15801562000439573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200045f919062000dc4565b60601b6001600160601b0319166102a05250620010809050565b6040805160028082526060808301845292839291906020830190803683370190505090508260a0015181600081518110620004b057fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260a0015181600181518110620004e357fe5b6001600160a01b03909216602092830291909101909101529050919050565b60408051600280825260608281019093526001600160a01b03848116908616109183918160200160208202803683370190505090508162000544578362000546565b845b816000815181106200055457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508162000581578462000583565b835b816001815181106200059157fe5b6001600160a01b03909216602092830291909101909101529150505b92915050565b6000620005cb83620009e060201b620015d81760201c565b606083516001016001600160401b0381118015620005e857600080fd5b5060405190808252806020026020018201604052801562000613578160200160208202803683370190505b50905030816000815181106200062557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b845181101562000698578481815181106200065f57fe5b60200260200101518282600101815181106200067757fe5b6001600160a01b039092166020928302919091019091015260010162000648565b50606083516001016001600160401b0381118015620006b657600080fd5b50604051908082528060200260200182016040528015620006e1578160200160208202803683370190505b509050600081600081518110620006f457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b845181101562000767578481815181106200072e57fe5b60200260200101518282600101815181106200074657fe5b6001600160a01b039092166020928302919091019091015260010162000717565b506200077687878484620009ec565b979650505050505050565b816200079257620007928162000ae6565b5050565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620007d357600080fd5b505afa158015620007e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200080e919062000f5a565b60ff16905060006200082d60128362000afb60201b620015e61760201c565b600a0a670de0b6b3a764000002949350505050565b620008538183111561014c62000781565b620008706b0de0b6b39983494c589c000082111561014d62000781565b6200088a670de0b6b3a7640000825b061561016162000781565b6200089e670de0b6b3a7640000836200087f565b620008ed670de0b6b3a7640000820460406020620008d7670de0b6b3a764000087600854919004602080620015fc62000b13821b17811c565b62000b1360201b620015fc17909392919060201c565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906200092f908590859062001029565b60405180910390a2505050565b6200095164e8d4a5100082101560cb62000781565b6200096967016345785d8a000082111560ca62000781565b6200098b8160c0603f60085462000b1360201b620015fc17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90620009c090839062001020565b60405180910390a150565b80516200079290600990602084019062000c8c565b80620007928162000b38565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040162000a1d91906200100b565b602060405180830381600087803b15801562000a3857600080fd5b505af115801562000a4d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a73919062000dea565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000aa89084908890889060040162000f7d565b600060405180830381600087803b15801562000ac357600080fd5b505af115801562000ad8573d6000803e3d6000fd5b509298975050505050505050565b62000af8816210905360ea1b62000bc4565b50565b600062000b0d83831115600162000781565b50900390565b600062000b2284848462000c25565b506001901b60001901811b1992909216911b1790565b60028151101562000b495762000af8565b60008160008151811062000b5957fe5b602002602001015190506000600190505b825181101562000bbf57600083828151811062000b8357fe5b6020026020010151905062000bb4816001600160a01b0316846001600160a01b03161060656200078160201b60201c565b915060010162000b6a565b505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b62000c366101008310606462000781565b62000c6f6001821015801562000c67575062000c6360ff846101000362000c8060201b6200161f1760201c565b8211155b606462000781565b62000bbf83821c156101b462000781565b80820390821102900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000ccf57805160ff191683800117855562000cff565b8280016001018555821562000cff579182015b8281111562000cff57825182559160200191906001019062000ce2565b5062000d0d92915062000d11565b5090565b5b8082111562000d0d576000815560010162000d12565b8051620005ad816200106a565b600082601f83011262000d46578081fd5b81516001600160401b0381111562000d5c578182fd5b602062000d72601f8301601f1916820162001037565b9250818352848183860101111562000d8957600080fd5b60005b8281101562000da957848101820151848201830152810162000d8c565b8281111562000dbb5760008284860101525b50505092915050565b60006020828403121562000dd6578081fd5b815162000de3816200106a565b9392505050565b60006020828403121562000dfc578081fd5b5051919050565b60006020828403121562000e15578081fd5b81516001600160401b038082111562000e2c578283fd5b818401915061018080838703121562000e43578384fd5b62000e4e8162001037565b905062000e5c868462000d28565b815260208301518281111562000e70578485fd5b62000e7e8782860162000d35565b60208301525060408301518281111562000e96578485fd5b62000ea48782860162000d35565b60408301525062000eb9866060850162000d28565b606082015262000ecd866080850162000d28565b608082015262000ee18660a0850162000d28565b60a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014062000f238782860162000d28565b90820152610160838101518381111562000f3b578586fd5b62000f498882870162000d35565b918301919091525095945050505050565b60006020828403121562000f6c578081fd5b815160ff8116811462000de3578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000fc95762000fb685516200105e565b8352938301939183019160010162000fa1565b505084810360408601528551808252908201925081860190845b8181101562000ad85762000ff883516200105e565b8552938301939183019160010162000fe3565b60208101600383106200101a57fe5b91905290565b90815260200190565b918252602082015260400190565b6040518181016001600160401b03811182821017156200105657600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b038116811462000af857600080fd5b60805160a05160c05160e0516101005160601c6101205160601c61014051610160516101805160601c6101a0516101c05160601c6101e05160601c6102005160601c610220516102405161026051610280516102a05160601c614e276200121a600039806118455250806107f352508061078f5280612aa7525080610717528061081b5280610c505280612f2152806130aa52806131e252806132ed528061346a52806135a25250806107b152806109bb5280610c165280612eed528061302f5280613076528061316c52806131ae52806132b952806133f45280613436528061352c528061356e5250806113f7528061264452806127105280612acd5280612ea25280612fbb528061326f52806133805250806109df52806110ed5280611a075280611aa652806125fb52806126c75280612a6c5280612e635280612f6552806130f85280613230528061333152806134b85250806111cb5250806109485250508061181c5250806117f8525080610fd0525080610fac525080610f5c52508061233852508061237a5250806123595250614e276000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e36600461471d565b610608565b6040516103509190614aee565b60405180910390f35b610361610668565b6040516103509190614d32565b61038161037c366004614412565b6106fe565b6040516103509190614acb565b610343610715565b610343610739565b6103a661073f565b60405161035093929190614ad6565b6103bd610768565b6040516103509190614a93565b6103816103d8366004614362565b610876565b6103e56108ec565b6040516103509190614d6c565b6103436108f5565b61040d6104083660046147da565b610904565b005b610343610946565b610381610425366004614412565b61096a565b61040d6109a5565b6103436109b9565b6104426109dd565b60405161035091906149aa565b61040d610a01565b610361610a55565b610343610ab6565b61047a610475366004614541565b610ac9565b604051610350929190614d45565b610490610ae7565b604051610350929190614d5e565b610343610b25565b6103436104b436600461430e565b610cba565b6104cc6104c7366004614541565b610cd9565b604051610350929190614aa6565b6103436104e836600461430e565b610d9b565b61040d610da6565b610343610f41565b61040d610f46565b6103436105133660046145e4565b610f58565b610442610faa565b610442610fce565b61034361053636600461430e565b610ff2565b61036161100d565b61034361055136600461478e565b61106e565b61040d6105643660046147f2565b6110a7565b610381610577366004614412565b611119565b61038161058a366004614412565b611157565b610442611164565b61038161116e565b61040d61117f565b6104426111c9565b61040d6105bd3660046143a2565b6111ed565b6104cc6105d0366004614541565b61126e565b6103436105e336600461432a565b611305565b610343611342565b6103436113eb565b6104426113f5565b610343611419565b6000846080015161063561061a610fce565b6001600160a01b0316336001600160a01b03161460cd61162b565b61064a610640610946565b82146101f461162b565b610652611639565b61065e8686868661164c565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050905090565b600061070b338484611771565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074c6117d9565b1592506107576117f6565b915061076161181a565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107da57fe5b6020026020010181815250506108186107f161183e565b7f000000000000000000000000000000000000000000000000000000000000000090611871565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084457fe5b602002602001018181525050670de0b6b3a76400008160008151811061086657fe5b6020908102919091010152905090565b6000806108838533611305565b90506108a7336001600160a01b038716148061089f5750838210155b61019e61162b565b6108b28585856118a9565b336001600160a01b038616148015906108cd57506000198114155b156108df576108df8533858403611771565b60019150505b9392505050565b60055460ff1690565b60006108ff6113eb565b905090565b61090c611989565b6109146119d2565b60008061091f610ae7565b9150915061093861093083836119e2565b61014f61162b565b61094183611ae9565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070b9185906109a09086611b61565b611771565b6109ad611989565b6109b76000611b73565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a09611989565b610a11611c04565b610a1b6001611c18565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4b9190614acb565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906108ff9060c0603f611c5a565b60006060610adb888785611c69611c80565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0482602080611c5a565b029250670de0b6b3a7640000610b1d8260406020611c5a565b029150509091565b600080610b30610946565b90506060610b3c610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b679190614aee565b60006040518083038186803b158015610b7f57600080fd5b505afa158015610b93573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbb919081019061443d565b50915050610bd081610bcb610768565b611de7565b600080610bdb610ae7565b91509150610be7614009565b6040518060600160405280610bfa610ab6565b81526020018481526020018381525090506000610c86610c4d867f000000000000000000000000000000000000000000000000000000000000000081518110610c3f57fe5b602002602001015184611e50565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7957fe5b6020026020010151611eb1565b9050610caf610ca886600081518110610c9b57fe5b6020026020010151611ebd565b8290611ed1565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce861061a610fce565b610cf3610640610946565b6000610cfe85611f28565b15610d2657610d0b611f57565b610d1d88610d17610739565b87611f6a565b94509050610d3e565b610d2e611639565b610d398a8987611c69565b945090505b610d488a82612060565b835167ffffffffffffffff81118015610d6057600080fd5b50604051908082528060200260200182016040528015610d8a578160200160208202803683370190505b509250505097509795505050505050565b600061070f82610ff2565b6000610db0610946565b90506060610dbc610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de79190614aee565b60006040518083038186803b158015610dff57600080fd5b505afa158015610e13573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3b919081019061443d565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e7f57fe5b602002602001018181525050610e9361402a565b6040518060800160405280610ea78561206a565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed8610fce565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f099493929190614b16565b600060405180830381600087803b158015610f2357600080fd5b505af1158015610f37573d6000803e3d6000fd5b5050505050505050565b600090565b610f4e611989565b6109b76001611b73565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8d929190614934565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108061061a610fce565b61108b610640610946565b611093611639565b61109e85858561206d565b95945050505050565b6110af611989565b6110b76119d2565b6000806110c2610ae7565b915091506110d361093083836119e2565b6110e86110e085856119e2565b61015761162b565b6111137f0000000000000000000000000000000000000000000000000000000000000000858561207a565b50505050565b6000806111263385611305565b90508083106111405761113b33856000611771565b61114d565b61114d3385858403611771565b5060019392505050565b600061070b3384846118a9565b60006108ff612150565b6008546000906108ff9060ff6121ca565b611187611989565b61118f611f57565b6111996000611c18565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4b9190614acb565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121c8c610ff2565b8960405160200161123296959493929190614c03565b604051602081830303815290604052805190602001209050611263888261125a8787876121d1565b886101f8612210565b610f37888888611771565b6060808861127d61061a610fce565b611288610640610946565b6000611292611639565b61129a610739565b6112ec576112a98a8a87612267565b945090506112c26112b8610f41565b82101560cc61162b565b6112d460006112cf610f41565b6122ff565b6112e7896112e0610f41565b83036122ff565b610d48565b6112f78a8987611c69565b94509050610d4889826122ff565b600061130f610fce565b6001600160a01b0316826001600160a01b03161415611331575060001961070f565b61133b8383612309565b905061070f565b600080600061134f610fce565b6001600160a01b031663b05f8e48611365610946565b306040518363ffffffff1660e01b8152600401611383929190614ce9565b60806040518083038186803b15801561139b57600080fd5b505afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190614813565b5050915091506113e4818301611ebd565b9250505090565b60006108ff612334565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff61183e565b600061142e836115d8565b6060835160010167ffffffffffffffff8111801561144b57600080fd5b50604051908082528060200260200182016040528015611475578160200160208202803683370190505b509050308160008151811061148657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f5578481815181106114be57fe5b60200260200101518282600101815181106114d557fe5b6001600160a01b03909216602092830291909101909101526001016114a9565b506060835160010167ffffffffffffffff8111801561151357600080fd5b5060405190808252806020026020018201604052801561153d578160200160208202803683370190505b50905060008160008151811061154f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115be5784818151811061158757fe5b602002602001015182826001018151811061159e57fe5b6001600160a01b0390921660209283029190910190910152600101611572565b506115cb878784846123d1565b925050505b949350505050565b806115e2816124da565b5050565b60006115f683831115600161162b565b50900390565b6000611609848484612553565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e2576115e281612599565b6109b76116446117d9565b61019261162b565b60006116686003841080156116615750600383105b606461162b565b6060611672610768565b905061167e8582611de7565b600080611689610ae7565b91509150611695614009565b60405180606001604052806116a8610ab6565b81526020810185905260400183905290506000895160018111156116c857fe5b141561172c576116ef89606001518589815181106116e257fe5b60200260200101516125c3565b60608a015260006117018a8a846125cf565b90506117208186898151811061171357fe5b6020026020010151612696565b955050505050506115d0565b61174089606001518588815181106116e257fe5b60608a015260006117528a8a846126a2565b905061172081868a8151811061176457fe5b6020026020010151612757565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cc908590614aee565b60405180910390a3505050565b60006117e361181a565b4211806108ff57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff7f000000000000000000000000000000000000000000000000000000000000000061186c6109dd565b612763565b600082820261189584158061188e57508385838161188b57fe5b04145b600361162b565b670de0b6b3a7640000815b04949350505050565b6118c06001600160a01b038416151561019861162b565b6118d76001600160a01b038316151561019961162b565b6118e2838383610941565b6001600160a01b03831660009081526020819052604090205461190890826101a06128b7565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119379082611b61565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cc908590614aee565b60006119b86000357fffffffff0000000000000000000000000000000000000000000000000000000016610f58565b90506119cf6119c782336128cd565b61019161162b565b50565b6109b76119dd610fce565b6129b6565b60008060006119ef610fce565b6001600160a01b031663b05f8e48611a05610946565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611a43929190614ce9565b60806040518083038186803b158015611a5b57600080fd5b505afa158015611a6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a939190614813565b5050915091506000611acf828401611aca7f0000000000000000000000000000000000000000000000000000000000000000612a68565b6125c3565b905085811015801561065e57509390931115949350505050565b611afc64e8d4a5100082101560cb61162b565b611b1267016345785d8a000082111560ca61162b565b600854611b23908260c0603f6115fc565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611b56908390614aee565b60405180910390a150565b60008282016108e5848210158361162b565b8015611b9357611b8e611b846117f6565b421061019361162b565b611ba8565b611ba8611b9e61181a565b42106101a961162b565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611b56908390614acb565b6109b7611c0f61116e565b156101b561162b565b600854611c27908260ff612b42565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611b56908390614acb565b6001901b6000190191901c1690565b60006060611c786103e6612599565b935093915050565b333014611d6f576000306001600160a01b0316600036604051611ca4929190614964565b6000604051808303816000865af19150503d8060008114611ce1576040519150601f19603f3d011682016040523d82523d6000602084013e611ce6565b606091505b505090508060008114611cf557fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611d51573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611d828686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611df6908290612b51565b60005b8181101561111357611e31848281518110611e1057fe5b6020026020010151848381518110611e2457fe5b6020026020010151611871565b848281518110611e3d57fe5b6020908102919091010152600101611df9565b60008160200151831015611e895781516020830151600091611e759186900390611871565b9050611e8184826115e6565b91505061070f565b81604001518311611e9b57508161070f565b81516040830151600091611e7591860390611871565b60006108e58383611b61565b600061070f82611ecb610739565b906115e6565b6000611ee0821515600461162b565b670de0b6b3a76400008302611f12841580611f0b5750670de0b6b3a7640000858381611f0857fe5b04145b600561162b565b6001836001830304018115150291505092915050565b600080825111801561070f575060ff801682806020019051810190611f4d9190614853565b60ff161492915050565b6109b7611f6261116e565b6101b661162b565b600060606000611f7984612b5e565b90506060865167ffffffffffffffff81118015611f9557600080fd5b50604051908082528060200260200182016040528015611fbf578160200160208202803683370190505b5090506000611fcc610f41565b90506000611fdf898381518110610c9b57fe5b90506000611fed8583612b74565b905060005b8a5181101561204f578381141561200a576000612030565b612030828c838151811061201a57fe5b602002602001015161187190919063ffffffff16565b85828151811061203c57fe5b6020908102919091010152600101611ff2565b509399929850919650505050505050565b6115e28282612bb4565b90565b60006108e56103e6612599565b6120898183111561014c61162b565b6120a46b0de0b6b39983494c589c000082111561014d61162b565b6120bc670de0b6b3a7640000825b061561016161162b565b6120ce670de0b6b3a7640000836120b2565b612103670de0b6b3a76400008204604060206120fb670de0b6b3a7640000876008549190046020806115fc565b9291906115fc565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121439085908590614d5e565b60405180910390a2505050565b600061215a610fce565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561219257600080fd5b505afa1580156121a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ff9190614624565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b600061221b85612c80565b905061223161222b878387612c9c565b8361162b565b612240428410156101b861162b565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606122826001600160a01b038616301461015661162b565b6122996001600160a01b038516301461015661162b565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff816000815181106122e857fe5b602090810291909101015290969095509350505050565b6115e28282612d4a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006123a1612ddd565b306040516020016123b6959493929190614cbd565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016124009190614d1e565b602060405180830381600087803b15801561241a57600080fd5b505af115801561242e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124529190614529565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d29061249e90849088908890600401614c37565b600060405180830381600087803b1580156124b857600080fd5b505af11580156124cc573d6000803e3d6000fd5b509298975050505050505050565b6002815110156124e9576119cf565b6000816000815181106124f857fe5b602002602001015190506000600190505b825181101561094157600083828151811061252057fe5b60200260200101519050612549816001600160a01b0316846001600160a01b031610606561162b565b9150600101612509565b6125626101008310606461162b565b61258a60018210158015611661575061258060ff846101000361161f565b821115606461162b565b61094183821c156101b461162b565b6119cf817f42414c0000000000000000000000000000000000000000000000000000000000612de1565b60006108e58383611871565b60208301516000906001600160a01b03163014156125f9576125f2848484612e5c565b90506108e5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612642576125f2848484612fb4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b0316141561268b576125f28484846130f1565b6108e5610135612599565b60006108e58383612b74565b60408301516000906001600160a01b03163014156126c5576125f2848484613229565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b0316141561270e576125f2848484613379565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b0316141561268b576125f28484846134b1565b60006108e58383611ed1565b600061276d614054565b61277784846135e9565b90506127816140a5565b61278b85856136c1565b90506000816040015167ffffffffffffffff169050600083606001519050600084600001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127e857600080fd5b505afa1580156127fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128209190614529565b90504283146128a15760006128358989613753565b905060006128428a613847565b90506000866020015190506000806000612869868c60a0015161187190919063ffffffff16565b9050670de0b6b3a764000085820204925083838501101561288957831992505b82810391506128988883611b61565b97505050505050505b6128ab8282612b74565b98975050505050505050565b60006128c6848411158361162b565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128ec610faa565b6001600160a01b031614158015612907575061290783613910565b1561292f57612914610faa565b6001600160a01b0316336001600160a01b031614905061070f565b612937612150565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161296693929190614af7565b60206040518083038186803b15801561297e57600080fd5b505afa158015612992573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b9190614509565b604080516000808252602082019092526060916129e9565b6129d66140ca565b8152602001906001900390816129ce5790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e8490612a329084906004016149fc565b600060405180830381600087803b158015612a4c57600080fd5b505af1158015612a60573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612acb57507f0000000000000000000000000000000000000000000000000000000000000000610cd4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612b1757612b106107f161183e565b9050610cd4565b6001600160a01b038216301415612b375750670de0b6b3a7640000610cd4565b610cd4610135612599565b6001811b1992909216911b1790565b6115e2818314606761162b565b6000818060200190518101906108e5919061486f565b6000612b83821515600461162b565b670de0b6b3a76400008302612bab841580611f0b5750670de0b6b3a7640000858381611f0857fe5b8281816118a057fe5b612bcb6001600160a01b038316151561019b61162b565b612bd782600083610941565b6001600160a01b038216600090815260208190526040902054612bfd90826101b26128b7565b6001600160a01b038316600090815260208190526040902055612c30612c2b82612c25610739565b90613974565b613982565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c749190614aee565b60405180910390a35050565b6000612c8a612334565b82604051602001610f8d929190614974565b6000612cae82516041146101b961162b565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612ce7908990859088908890614d00565b6020604051602081039080840390855afa158015612d09573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906128ab5750876001600160a01b0316816001600160a01b03161498975050505050505050565b612d5660008383610941565b612d6b612c2b82612d65610739565b90611b61565b6001600160a01b038216600090815260208190526040902054612d8e9082611b61565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c74908590614aee565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612ee27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eda57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162b565b6115d08460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f1657fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f4a57fe5b6020026020010151612f6287600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612fa857613987612fac565b6139e55b63ffffffff16565b60006130107f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eda575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b0316301461306b576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061305857fe5b602002602001015184613a4e565b6115d0565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061309f57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130d357fe5b60200260200101516130eb87600081518110610c9b57fe5b86613a7e565b600061314d7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eda575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b031630146131a3576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061319557fe5b602002602001015184613ae4565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131d757fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061320b57fe5b602002602001015161322387600081518110610c9b57fe5b86613b24565b60006132ae7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eda57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162b565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132e257fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061331657fe5b602002602001015161332e87600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461337457613b8b612fac565b613be2565b60006133d57f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eda575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b0316301461342b576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061341d57fe5b602002602001015184613c4c565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061345f57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061349357fe5b60200260200101516134ab87600081518110610c9b57fe5b86613c76565b600061350d7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eda575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b03163014613563576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061355557fe5b602002602001015184613cc5565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061359757fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106135cb57fe5b60200260200101516135e387600081518110610c9b57fe5b86613cfa565b6135f1614054565b6040517fbf2730410000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063bf273041906136369085906004016149aa565b60c06040518083038186803b15801561364e57600080fd5b505afa92505050801561367e575060408051601f3d908101601f1916820190925261367b918101906146a5565b60015b61133b573d8080156136ac576040519150601f19603f3d011682016040523d82523d6000602084013e6136b1565b606091505b506136bb81613d4e565b5061070f565b6136c96140a5565b6040517ffb2557030000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063fb2557039061370e9085906004016149aa565b60806040518083038186803b15801561372657600080fd5b505afa92505050801561367e575060408051601f3d908101601f1916820190925261367b91810190614640565b6000806137608484613dd5565b6040517fb1e017650000000000000000000000000000000000000000000000000000000081529091506001600160a01b0382169063b1e01765906137ac908790879042906004016149d8565b60206040518083038186803b1580156137c457600080fd5b505afa9250505080156137f4575060408051601f3d908101601f191682019092526137f191810190614529565b60015b613837573d808015613822576040519150601f19603f3d011682016040523d82523d6000602084013e613827565b606091505b5061383181613d4e565b50613840565b915061070f9050565b5092915050565b60008061385383613e70565b9050806001600160a01b03166325ed3d446040518163ffffffff1660e01b815260040160206040518083038186803b15801561388e57600080fd5b505afa9250505080156138be575060408051601f3d908101601f191682019092526138bb91810190614529565b60015b613901573d8080156138ec576040519150601f19603f3d011682016040523d82523d6000602084013e6138f1565b606091505b506138fb81613d4e565b5061390a565b9150610cd49050565b50919050565b600061393b7f9f11080e00000000000000000000000000000000000000000000000000000000610f58565b82148061070f575061396c7f38e9922e00000000000000000000000000000000000000000000000000000000610f58565b909114919050565b60006108e5838360016128b7565b600255565b6000806139948684611e50565b905060006139a28287611eb1565b905060006139b0868a6115e6565b905060006139cb84611ecb6139c58587613f1e565b8a613f38565b90506139d788826115e6565b9a9950505050505050505050565b6000806139f28684611e50565b90506000613a008287611eb1565b90506000613a17613a11838b613f1e565b87613f59565b90506000613a2584836115e6565b90506000613a338288613f79565b9050613a3f8a826115e6565b9b9a5050505050505050505050565b600080613a5b8484611e50565b90506000613a72613a6c8688611b61565b85611e50565b905061065e81836115e6565b600082613a9657613a8f8683611e50565b905061109e565b6000613aa28684611e50565b90506000613ab3613a6c888a611b61565b90506000613ac182846115e6565b90506000613acf8489611eb1565b90506139d7613ade8884613f1e565b82613f59565b600080613af18484611e50565b90506000613aff82876115e6565b90506000613b0d8286613f79565b9050613b1986826115e6565b979650505050505050565b600082613b3257508461109e565b6000613b3e8684611e50565b90506000613b4c8287611eb1565b90506000613b5a878a611b61565b90506000613b688483611eb1565b90506000613b7f613b798984613f1e565b85613f59565b9050613a3f81896115e6565b600082613b9957508461109e565b6000613ba58684611e50565b90506000613bb38287611eb1565b90506000613bc1868a611b61565b90506000613bd684611ecb6139c58587613f1e565b90506139d781896115e6565b600082613bf357613a8f8683613f79565b6000613bff8684611e50565b90506000613c0d8287611eb1565b90506000613c24613c1e838b613f1e565b87613f38565b90506000613c328483611b61565b90506000613c408288613f79565b9050613a3f818b6115e6565b600080613c598484611e50565b90506000613c6a613a6c86886115e6565b905061065e82826115e6565b600080613c838684611e50565b90506000613c94613a6c888a6115e6565b90506000613ca283836115e6565b90506000613cb08489611eb1565b90506139d7613cbf8884613f1e565b82613f38565b600080613cd28484611e50565b90506000613ce08287611b61565b90506000613cee8286613f79565b9050613b1981876115e6565b600080613d078684611e50565b90506000613d158287611eb1565b90506000613d23878a6115e6565b90506000613d318483611eb1565b90506000613d42613b798984613f1e565b9050613a3f88826115e6565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417613dc9578160208401fd5b506115e2610165612599565b600080613de184613e70565b6040517f48b3eabc0000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906348b3eabc90613e2b90879087906004016149be565b60206040518083038186803b158015613e4357600080fd5b505afa9250505080156137f4575060408051601f3d908101601f191682019092526137f191810190614624565b6000816001600160a01b031663bde127186040518163ffffffff1660e01b815260040160206040518083038186803b158015613eab57600080fd5b505afa925050508015613edb575060408051601f3d908101601f19168201909252613ed891810190614624565b60015b612b10573d808015613f09576040519150601f19603f3d011682016040523d82523d6000602084013e613f0e565b606091505b50613f1881613d4e565b50610cd4565b60008282026108e584158061188e57508385838161188b57fe5b6000613f47821515600461162b565b50811515600019909201046001010290565b6000613f68821515600461162b565b818381613f7157fe5b049392505050565b60008160200151831015613fc257815161133b90613fa090670de0b6b3a764000090611b61565b60208401518451613fbc91613fb59190611871565b8690611b61565b90612b74565b81604001518311613fd457508161070f565b815161133b90613fed90670de0b6b3a7640000906115e6565b60408401518451613fbc916140029190611871565b86906115e6565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040805160808101825260008082526020820181905291810182905290606082015290565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561070f81614dcd565b600082601f830112614115578081fd5b813561412861412382614da1565b614d7a565b81815291506020808301908481018184028601820187101561414957600080fd5b60005b848110156141685781358452928201929082019060010161414c565b505050505092915050565b600082601f830112614183578081fd5b815161419161412382614da1565b8181529150602080830190848101818402860182018710156141b257600080fd5b60005b84811015614168578151845292820192908201906001016141b5565b600082601f8301126141e1578081fd5b813567ffffffffffffffff8111156141f7578182fd5b61420a6020601f19601f84011601614d7a565b915080825283602082850101111561422157600080fd5b8060208401602084013760009082016020015292915050565b80356002811061070f57600080fd5b600061012080838503121561425c578182fd5b61426581614d7a565b915050614272838361423a565b815261428183602084016140fa565b602082015261429383604084016140fa565b6040820152606082013560608201526080820135608082015260a082013560a08201526142c38360c084016140fa565b60c08201526142d58360e084016140fa565b60e08201526101008083013567ffffffffffffffff8111156142f657600080fd5b614302858286016141d1565b82840152505092915050565b60006020828403121561431f578081fd5b81356108e581614dcd565b6000806040838503121561433c578081fd5b823561434781614dcd565b9150602083013561435781614dcd565b809150509250929050565b600080600060608486031215614376578081fd5b833561438181614dcd565b9250602084013561439181614dcd565b929592945050506040919091013590565b600080600080600080600060e0888a0312156143bc578485fd5b87356143c781614dcd565b965060208801356143d781614dcd565b9550604088013594506060880135935060808801356143f581614de2565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215614424578182fd5b823561442f81614dcd565b946020939093013593505050565b600080600060608486031215614451578081fd5b835167ffffffffffffffff80821115614468578283fd5b818601915086601f83011261447b578283fd5b815161448961412382614da1565b80828252602080830192508086018b8283870289010111156144a9578788fd5b8796505b848710156144d45780516144c081614dcd565b8452600196909601959281019281016144ad565b5089015190975093505050808211156144eb578283fd5b506144f886828701614173565b925050604084015190509250925092565b60006020828403121561451a578081fd5b815180151581146108e5578182fd5b60006020828403121561453a578081fd5b5051919050565b600080600080600080600060e0888a03121561455b578081fd5b87359650602088013561456d81614dcd565b9550604088013561457d81614dcd565b9450606088013567ffffffffffffffff80821115614599578283fd5b6145a58b838c01614105565b955060808a0135945060a08a0135935060c08a01359150808211156145c8578283fd5b506145d58a828b016141d1565b91505092959891949750929550565b6000602082840312156145f5578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e5578182fd5b600060208284031215614635578081fd5b81516108e581614dcd565b600060808284031215614651578081fd5b61465b6080614d7a565b8251815260208301516020820152604083015167ffffffffffffffff81168114614683578283fd5b6040820152606083015160038110614699578283fd5b60608201529392505050565b600060c082840312156146b6578081fd5b6146c060c0614d7a565b82516146cb81614dcd565b815260208301516146db81614dcd565b602082015260408301516146ee81614dcd565b80604083015250606083015160608201526080830151608082015260a083015160a08201528091505092915050565b60008060008060808587031215614732578182fd5b843567ffffffffffffffff80821115614749578384fd5b61475588838901614249565b9550602087013591508082111561476a578384fd5b5061477787828801614105565b949794965050505060408301359260600135919050565b6000806000606084860312156147a2578081fd5b833567ffffffffffffffff8111156147b8578182fd5b6147c486828701614249565b9660208601359650604090950135949350505050565b6000602082840312156147eb578081fd5b5035919050565b60008060408385031215614804578182fd5b50508035926020909101359150565b60008060008060808587031215614828578182fd5b845193506020850151925060408501519150606085015161484881614dcd565b939692955090935050565b600060208284031215614864578081fd5b81516108e581614de2565b60008060408385031215614881578182fd5b825161488c81614de2565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156148d8578151875295820195908201906001016148bc565b509495945050505050565b15159052565b60008151808452815b8181101561490e576020818501810151868301820152016148f2565b8181111561491f5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b602080825282518282018190526000919060409081850190868401855b82811015614a86578151805160048110614a2f57fe5b855280870151614a418887018261489c565b508581015186860152606080820151614a5c8288018261489c565b505060809081015190614a718682018361489c565b505060a0939093019290850190600101614a19565b5091979650505050505050565b6000602082526108e560208301846148a9565b600060408252614ab960408301856148a9565b828103602084015261109e81856148a9565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b80831015614b8757614b718451614dc1565b8252928401926001929092019190840190614b5f565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a0870152614bc581856148a9565b935050506040850151818584030160c0860152614be283826148e9565b925050506060840151614bf860e08501826148e3565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b81811015614c7f57614c6d8551614dc1565b83529383019391830191600101614c5b565b505084810360408601528551808252908201925081860190845b818110156124cc57614cab8351614dc1565b85529383019391830191600101614c99565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6020810160038310614d2c57fe5b91905290565b6000602082526108e560208301846148e9565b6000838252604060208301526115d060408301846148a9565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715614d9957600080fd5b604052919050565b600067ffffffffffffffff821115614db7578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146119cf57600080fd5b60ff811681146119cf57600080fdfea26469706673582212203ac34546f9aeae30b98c4febf2eaa8b86e91697319bee5c4bf4ccc0bfe38b84964736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e36600461471d565b610608565b6040516103509190614aee565b60405180910390f35b610361610668565b6040516103509190614d32565b61038161037c366004614412565b6106fe565b6040516103509190614acb565b610343610715565b610343610739565b6103a661073f565b60405161035093929190614ad6565b6103bd610768565b6040516103509190614a93565b6103816103d8366004614362565b610876565b6103e56108ec565b6040516103509190614d6c565b6103436108f5565b61040d6104083660046147da565b610904565b005b610343610946565b610381610425366004614412565b61096a565b61040d6109a5565b6103436109b9565b6104426109dd565b60405161035091906149aa565b61040d610a01565b610361610a55565b610343610ab6565b61047a610475366004614541565b610ac9565b604051610350929190614d45565b610490610ae7565b604051610350929190614d5e565b610343610b25565b6103436104b436600461430e565b610cba565b6104cc6104c7366004614541565b610cd9565b604051610350929190614aa6565b6103436104e836600461430e565b610d9b565b61040d610da6565b610343610f41565b61040d610f46565b6103436105133660046145e4565b610f58565b610442610faa565b610442610fce565b61034361053636600461430e565b610ff2565b61036161100d565b61034361055136600461478e565b61106e565b61040d6105643660046147f2565b6110a7565b610381610577366004614412565b611119565b61038161058a366004614412565b611157565b610442611164565b61038161116e565b61040d61117f565b6104426111c9565b61040d6105bd3660046143a2565b6111ed565b6104cc6105d0366004614541565b61126e565b6103436105e336600461432a565b611305565b610343611342565b6103436113eb565b6104426113f5565b610343611419565b6000846080015161063561061a610fce565b6001600160a01b0316336001600160a01b03161460cd61162b565b61064a610640610946565b82146101f461162b565b610652611639565b61065e8686868661164c565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050905090565b600061070b338484611771565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074c6117d9565b1592506107576117f6565b915061076161181a565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107da57fe5b6020026020010181815250506108186107f161183e565b7f000000000000000000000000000000000000000000000000000000000000000090611871565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084457fe5b602002602001018181525050670de0b6b3a76400008160008151811061086657fe5b6020908102919091010152905090565b6000806108838533611305565b90506108a7336001600160a01b038716148061089f5750838210155b61019e61162b565b6108b28585856118a9565b336001600160a01b038616148015906108cd57506000198114155b156108df576108df8533858403611771565b60019150505b9392505050565b60055460ff1690565b60006108ff6113eb565b905090565b61090c611989565b6109146119d2565b60008061091f610ae7565b9150915061093861093083836119e2565b61014f61162b565b61094183611ae9565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070b9185906109a09086611b61565b611771565b6109ad611989565b6109b76000611b73565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a09611989565b610a11611c04565b610a1b6001611c18565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4b9190614acb565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906108ff9060c0603f611c5a565b60006060610adb888785611c69611c80565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0482602080611c5a565b029250670de0b6b3a7640000610b1d8260406020611c5a565b029150509091565b600080610b30610946565b90506060610b3c610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b679190614aee565b60006040518083038186803b158015610b7f57600080fd5b505afa158015610b93573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbb919081019061443d565b50915050610bd081610bcb610768565b611de7565b600080610bdb610ae7565b91509150610be7614009565b6040518060600160405280610bfa610ab6565b81526020018481526020018381525090506000610c86610c4d867f000000000000000000000000000000000000000000000000000000000000000081518110610c3f57fe5b602002602001015184611e50565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7957fe5b6020026020010151611eb1565b9050610caf610ca886600081518110610c9b57fe5b6020026020010151611ebd565b8290611ed1565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce861061a610fce565b610cf3610640610946565b6000610cfe85611f28565b15610d2657610d0b611f57565b610d1d88610d17610739565b87611f6a565b94509050610d3e565b610d2e611639565b610d398a8987611c69565b945090505b610d488a82612060565b835167ffffffffffffffff81118015610d6057600080fd5b50604051908082528060200260200182016040528015610d8a578160200160208202803683370190505b509250505097509795505050505050565b600061070f82610ff2565b6000610db0610946565b90506060610dbc610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de79190614aee565b60006040518083038186803b158015610dff57600080fd5b505afa158015610e13573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3b919081019061443d565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e7f57fe5b602002602001018181525050610e9361402a565b6040518060800160405280610ea78561206a565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed8610fce565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f099493929190614b16565b600060405180830381600087803b158015610f2357600080fd5b505af1158015610f37573d6000803e3d6000fd5b5050505050505050565b600090565b610f4e611989565b6109b76001611b73565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8d929190614934565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108061061a610fce565b61108b610640610946565b611093611639565b61109e85858561206d565b95945050505050565b6110af611989565b6110b76119d2565b6000806110c2610ae7565b915091506110d361093083836119e2565b6110e86110e085856119e2565b61015761162b565b6111137f0000000000000000000000000000000000000000000000000000000000000000858561207a565b50505050565b6000806111263385611305565b90508083106111405761113b33856000611771565b61114d565b61114d3385858403611771565b5060019392505050565b600061070b3384846118a9565b60006108ff612150565b6008546000906108ff9060ff6121ca565b611187611989565b61118f611f57565b6111996000611c18565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4b9190614acb565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121c8c610ff2565b8960405160200161123296959493929190614c03565b604051602081830303815290604052805190602001209050611263888261125a8787876121d1565b886101f8612210565b610f37888888611771565b6060808861127d61061a610fce565b611288610640610946565b6000611292611639565b61129a610739565b6112ec576112a98a8a87612267565b945090506112c26112b8610f41565b82101560cc61162b565b6112d460006112cf610f41565b6122ff565b6112e7896112e0610f41565b83036122ff565b610d48565b6112f78a8987611c69565b94509050610d4889826122ff565b600061130f610fce565b6001600160a01b0316826001600160a01b03161415611331575060001961070f565b61133b8383612309565b905061070f565b600080600061134f610fce565b6001600160a01b031663b05f8e48611365610946565b306040518363ffffffff1660e01b8152600401611383929190614ce9565b60806040518083038186803b15801561139b57600080fd5b505afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190614813565b5050915091506113e4818301611ebd565b9250505090565b60006108ff612334565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff61183e565b600061142e836115d8565b6060835160010167ffffffffffffffff8111801561144b57600080fd5b50604051908082528060200260200182016040528015611475578160200160208202803683370190505b509050308160008151811061148657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f5578481815181106114be57fe5b60200260200101518282600101815181106114d557fe5b6001600160a01b03909216602092830291909101909101526001016114a9565b506060835160010167ffffffffffffffff8111801561151357600080fd5b5060405190808252806020026020018201604052801561153d578160200160208202803683370190505b50905060008160008151811061154f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115be5784818151811061158757fe5b602002602001015182826001018151811061159e57fe5b6001600160a01b0390921660209283029190910190910152600101611572565b506115cb878784846123d1565b925050505b949350505050565b806115e2816124da565b5050565b60006115f683831115600161162b565b50900390565b6000611609848484612553565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e2576115e281612599565b6109b76116446117d9565b61019261162b565b60006116686003841080156116615750600383105b606461162b565b6060611672610768565b905061167e8582611de7565b600080611689610ae7565b91509150611695614009565b60405180606001604052806116a8610ab6565b81526020810185905260400183905290506000895160018111156116c857fe5b141561172c576116ef89606001518589815181106116e257fe5b60200260200101516125c3565b60608a015260006117018a8a846125cf565b90506117208186898151811061171357fe5b6020026020010151612696565b955050505050506115d0565b61174089606001518588815181106116e257fe5b60608a015260006117528a8a846126a2565b905061172081868a8151811061176457fe5b6020026020010151612757565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cc908590614aee565b60405180910390a3505050565b60006117e361181a565b4211806108ff57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff7f000000000000000000000000000000000000000000000000000000000000000061186c6109dd565b612763565b600082820261189584158061188e57508385838161188b57fe5b04145b600361162b565b670de0b6b3a7640000815b04949350505050565b6118c06001600160a01b038416151561019861162b565b6118d76001600160a01b038316151561019961162b565b6118e2838383610941565b6001600160a01b03831660009081526020819052604090205461190890826101a06128b7565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119379082611b61565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cc908590614aee565b60006119b86000357fffffffff0000000000000000000000000000000000000000000000000000000016610f58565b90506119cf6119c782336128cd565b61019161162b565b50565b6109b76119dd610fce565b6129b6565b60008060006119ef610fce565b6001600160a01b031663b05f8e48611a05610946565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611a43929190614ce9565b60806040518083038186803b158015611a5b57600080fd5b505afa158015611a6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a939190614813565b5050915091506000611acf828401611aca7f0000000000000000000000000000000000000000000000000000000000000000612a68565b6125c3565b905085811015801561065e57509390931115949350505050565b611afc64e8d4a5100082101560cb61162b565b611b1267016345785d8a000082111560ca61162b565b600854611b23908260c0603f6115fc565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611b56908390614aee565b60405180910390a150565b60008282016108e5848210158361162b565b8015611b9357611b8e611b846117f6565b421061019361162b565b611ba8565b611ba8611b9e61181a565b42106101a961162b565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611b56908390614acb565b6109b7611c0f61116e565b156101b561162b565b600854611c27908260ff612b42565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611b56908390614acb565b6001901b6000190191901c1690565b60006060611c786103e6612599565b935093915050565b333014611d6f576000306001600160a01b0316600036604051611ca4929190614964565b6000604051808303816000865af19150503d8060008114611ce1576040519150601f19603f3d011682016040523d82523d6000602084013e611ce6565b606091505b505090508060008114611cf557fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611d51573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611d828686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611df6908290612b51565b60005b8181101561111357611e31848281518110611e1057fe5b6020026020010151848381518110611e2457fe5b6020026020010151611871565b848281518110611e3d57fe5b6020908102919091010152600101611df9565b60008160200151831015611e895781516020830151600091611e759186900390611871565b9050611e8184826115e6565b91505061070f565b81604001518311611e9b57508161070f565b81516040830151600091611e7591860390611871565b60006108e58383611b61565b600061070f82611ecb610739565b906115e6565b6000611ee0821515600461162b565b670de0b6b3a76400008302611f12841580611f0b5750670de0b6b3a7640000858381611f0857fe5b04145b600561162b565b6001836001830304018115150291505092915050565b600080825111801561070f575060ff801682806020019051810190611f4d9190614853565b60ff161492915050565b6109b7611f6261116e565b6101b661162b565b600060606000611f7984612b5e565b90506060865167ffffffffffffffff81118015611f9557600080fd5b50604051908082528060200260200182016040528015611fbf578160200160208202803683370190505b5090506000611fcc610f41565b90506000611fdf898381518110610c9b57fe5b90506000611fed8583612b74565b905060005b8a5181101561204f578381141561200a576000612030565b612030828c838151811061201a57fe5b602002602001015161187190919063ffffffff16565b85828151811061203c57fe5b6020908102919091010152600101611ff2565b509399929850919650505050505050565b6115e28282612bb4565b90565b60006108e56103e6612599565b6120898183111561014c61162b565b6120a46b0de0b6b39983494c589c000082111561014d61162b565b6120bc670de0b6b3a7640000825b061561016161162b565b6120ce670de0b6b3a7640000836120b2565b612103670de0b6b3a76400008204604060206120fb670de0b6b3a7640000876008549190046020806115fc565b9291906115fc565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121439085908590614d5e565b60405180910390a2505050565b600061215a610fce565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561219257600080fd5b505afa1580156121a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ff9190614624565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b600061221b85612c80565b905061223161222b878387612c9c565b8361162b565b612240428410156101b861162b565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606122826001600160a01b038616301461015661162b565b6122996001600160a01b038516301461015661162b565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff816000815181106122e857fe5b602090810291909101015290969095509350505050565b6115e28282612d4a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006123a1612ddd565b306040516020016123b6959493929190614cbd565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016124009190614d1e565b602060405180830381600087803b15801561241a57600080fd5b505af115801561242e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124529190614529565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d29061249e90849088908890600401614c37565b600060405180830381600087803b1580156124b857600080fd5b505af11580156124cc573d6000803e3d6000fd5b509298975050505050505050565b6002815110156124e9576119cf565b6000816000815181106124f857fe5b602002602001015190506000600190505b825181101561094157600083828151811061252057fe5b60200260200101519050612549816001600160a01b0316846001600160a01b031610606561162b565b9150600101612509565b6125626101008310606461162b565b61258a60018210158015611661575061258060ff846101000361161f565b821115606461162b565b61094183821c156101b461162b565b6119cf817f42414c0000000000000000000000000000000000000000000000000000000000612de1565b60006108e58383611871565b60208301516000906001600160a01b03163014156125f9576125f2848484612e5c565b90506108e5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612642576125f2848484612fb4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b0316141561268b576125f28484846130f1565b6108e5610135612599565b60006108e58383612b74565b60408301516000906001600160a01b03163014156126c5576125f2848484613229565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b0316141561270e576125f2848484613379565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b0316141561268b576125f28484846134b1565b60006108e58383611ed1565b600061276d614054565b61277784846135e9565b90506127816140a5565b61278b85856136c1565b90506000816040015167ffffffffffffffff169050600083606001519050600084600001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127e857600080fd5b505afa1580156127fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128209190614529565b90504283146128a15760006128358989613753565b905060006128428a613847565b90506000866020015190506000806000612869868c60a0015161187190919063ffffffff16565b9050670de0b6b3a764000085820204925083838501101561288957831992505b82810391506128988883611b61565b97505050505050505b6128ab8282612b74565b98975050505050505050565b60006128c6848411158361162b565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128ec610faa565b6001600160a01b031614158015612907575061290783613910565b1561292f57612914610faa565b6001600160a01b0316336001600160a01b031614905061070f565b612937612150565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161296693929190614af7565b60206040518083038186803b15801561297e57600080fd5b505afa158015612992573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b9190614509565b604080516000808252602082019092526060916129e9565b6129d66140ca565b8152602001906001900390816129ce5790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e8490612a329084906004016149fc565b600060405180830381600087803b158015612a4c57600080fd5b505af1158015612a60573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612acb57507f0000000000000000000000000000000000000000000000000000000000000000610cd4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612b1757612b106107f161183e565b9050610cd4565b6001600160a01b038216301415612b375750670de0b6b3a7640000610cd4565b610cd4610135612599565b6001811b1992909216911b1790565b6115e2818314606761162b565b6000818060200190518101906108e5919061486f565b6000612b83821515600461162b565b670de0b6b3a76400008302612bab841580611f0b5750670de0b6b3a7640000858381611f0857fe5b8281816118a057fe5b612bcb6001600160a01b038316151561019b61162b565b612bd782600083610941565b6001600160a01b038216600090815260208190526040902054612bfd90826101b26128b7565b6001600160a01b038316600090815260208190526040902055612c30612c2b82612c25610739565b90613974565b613982565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c749190614aee565b60405180910390a35050565b6000612c8a612334565b82604051602001610f8d929190614974565b6000612cae82516041146101b961162b565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612ce7908990859088908890614d00565b6020604051602081039080840390855afa158015612d09573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906128ab5750876001600160a01b0316816001600160a01b03161498975050505050505050565b612d5660008383610941565b612d6b612c2b82612d65610739565b90611b61565b6001600160a01b038216600090815260208190526040902054612d8e9082611b61565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c74908590614aee565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612ee27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eda57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162b565b6115d08460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f1657fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f4a57fe5b6020026020010151612f6287600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612fa857613987612fac565b6139e55b63ffffffff16565b60006130107f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eda575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b0316301461306b576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061305857fe5b602002602001015184613a4e565b6115d0565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061309f57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130d357fe5b60200260200101516130eb87600081518110610c9b57fe5b86613a7e565b600061314d7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eda575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b031630146131a3576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061319557fe5b602002602001015184613ae4565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131d757fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061320b57fe5b602002602001015161322387600081518110610c9b57fe5b86613b24565b60006132ae7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eda57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162b565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132e257fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061331657fe5b602002602001015161332e87600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461337457613b8b612fac565b613be2565b60006133d57f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eda575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b0316301461342b576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061341d57fe5b602002602001015184613c4c565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061345f57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061349357fe5b60200260200101516134ab87600081518110610c9b57fe5b86613c76565b600061350d7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eda575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b03163014613563576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061355557fe5b602002602001015184613cc5565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061359757fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106135cb57fe5b60200260200101516135e387600081518110610c9b57fe5b86613cfa565b6135f1614054565b6040517fbf2730410000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063bf273041906136369085906004016149aa565b60c06040518083038186803b15801561364e57600080fd5b505afa92505050801561367e575060408051601f3d908101601f1916820190925261367b918101906146a5565b60015b61133b573d8080156136ac576040519150601f19603f3d011682016040523d82523d6000602084013e6136b1565b606091505b506136bb81613d4e565b5061070f565b6136c96140a5565b6040517ffb2557030000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063fb2557039061370e9085906004016149aa565b60806040518083038186803b15801561372657600080fd5b505afa92505050801561367e575060408051601f3d908101601f1916820190925261367b91810190614640565b6000806137608484613dd5565b6040517fb1e017650000000000000000000000000000000000000000000000000000000081529091506001600160a01b0382169063b1e01765906137ac908790879042906004016149d8565b60206040518083038186803b1580156137c457600080fd5b505afa9250505080156137f4575060408051601f3d908101601f191682019092526137f191810190614529565b60015b613837573d808015613822576040519150601f19603f3d011682016040523d82523d6000602084013e613827565b606091505b5061383181613d4e565b50613840565b915061070f9050565b5092915050565b60008061385383613e70565b9050806001600160a01b03166325ed3d446040518163ffffffff1660e01b815260040160206040518083038186803b15801561388e57600080fd5b505afa9250505080156138be575060408051601f3d908101601f191682019092526138bb91810190614529565b60015b613901573d8080156138ec576040519150601f19603f3d011682016040523d82523d6000602084013e6138f1565b606091505b506138fb81613d4e565b5061390a565b9150610cd49050565b50919050565b600061393b7f9f11080e00000000000000000000000000000000000000000000000000000000610f58565b82148061070f575061396c7f38e9922e00000000000000000000000000000000000000000000000000000000610f58565b909114919050565b60006108e5838360016128b7565b600255565b6000806139948684611e50565b905060006139a28287611eb1565b905060006139b0868a6115e6565b905060006139cb84611ecb6139c58587613f1e565b8a613f38565b90506139d788826115e6565b9a9950505050505050505050565b6000806139f28684611e50565b90506000613a008287611eb1565b90506000613a17613a11838b613f1e565b87613f59565b90506000613a2584836115e6565b90506000613a338288613f79565b9050613a3f8a826115e6565b9b9a5050505050505050505050565b600080613a5b8484611e50565b90506000613a72613a6c8688611b61565b85611e50565b905061065e81836115e6565b600082613a9657613a8f8683611e50565b905061109e565b6000613aa28684611e50565b90506000613ab3613a6c888a611b61565b90506000613ac182846115e6565b90506000613acf8489611eb1565b90506139d7613ade8884613f1e565b82613f59565b600080613af18484611e50565b90506000613aff82876115e6565b90506000613b0d8286613f79565b9050613b1986826115e6565b979650505050505050565b600082613b3257508461109e565b6000613b3e8684611e50565b90506000613b4c8287611eb1565b90506000613b5a878a611b61565b90506000613b688483611eb1565b90506000613b7f613b798984613f1e565b85613f59565b9050613a3f81896115e6565b600082613b9957508461109e565b6000613ba58684611e50565b90506000613bb38287611eb1565b90506000613bc1868a611b61565b90506000613bd684611ecb6139c58587613f1e565b90506139d781896115e6565b600082613bf357613a8f8683613f79565b6000613bff8684611e50565b90506000613c0d8287611eb1565b90506000613c24613c1e838b613f1e565b87613f38565b90506000613c328483611b61565b90506000613c408288613f79565b9050613a3f818b6115e6565b600080613c598484611e50565b90506000613c6a613a6c86886115e6565b905061065e82826115e6565b600080613c838684611e50565b90506000613c94613a6c888a6115e6565b90506000613ca283836115e6565b90506000613cb08489611eb1565b90506139d7613cbf8884613f1e565b82613f38565b600080613cd28484611e50565b90506000613ce08287611b61565b90506000613cee8286613f79565b9050613b1981876115e6565b600080613d078684611e50565b90506000613d158287611eb1565b90506000613d23878a6115e6565b90506000613d318483611eb1565b90506000613d42613b798984613f1e565b9050613a3f88826115e6565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417613dc9578160208401fd5b506115e2610165612599565b600080613de184613e70565b6040517f48b3eabc0000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906348b3eabc90613e2b90879087906004016149be565b60206040518083038186803b158015613e4357600080fd5b505afa9250505080156137f4575060408051601f3d908101601f191682019092526137f191810190614624565b6000816001600160a01b031663bde127186040518163ffffffff1660e01b815260040160206040518083038186803b158015613eab57600080fd5b505afa925050508015613edb575060408051601f3d908101601f19168201909252613ed891810190614624565b60015b612b10573d808015613f09576040519150601f19603f3d011682016040523d82523d6000602084013e613f0e565b606091505b50613f1881613d4e565b50610cd4565b60008282026108e584158061188e57508385838161188b57fe5b6000613f47821515600461162b565b50811515600019909201046001010290565b6000613f68821515600461162b565b818381613f7157fe5b049392505050565b60008160200151831015613fc257815161133b90613fa090670de0b6b3a764000090611b61565b60208401518451613fbc91613fb59190611871565b8690611b61565b90612b74565b81604001518311613fd457508161070f565b815161133b90613fed90670de0b6b3a7640000906115e6565b60408401518451613fbc916140029190611871565b86906115e6565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040805160808101825260008082526020820181905291810182905290606082015290565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561070f81614dcd565b600082601f830112614115578081fd5b813561412861412382614da1565b614d7a565b81815291506020808301908481018184028601820187101561414957600080fd5b60005b848110156141685781358452928201929082019060010161414c565b505050505092915050565b600082601f830112614183578081fd5b815161419161412382614da1565b8181529150602080830190848101818402860182018710156141b257600080fd5b60005b84811015614168578151845292820192908201906001016141b5565b600082601f8301126141e1578081fd5b813567ffffffffffffffff8111156141f7578182fd5b61420a6020601f19601f84011601614d7a565b915080825283602082850101111561422157600080fd5b8060208401602084013760009082016020015292915050565b80356002811061070f57600080fd5b600061012080838503121561425c578182fd5b61426581614d7a565b915050614272838361423a565b815261428183602084016140fa565b602082015261429383604084016140fa565b6040820152606082013560608201526080820135608082015260a082013560a08201526142c38360c084016140fa565b60c08201526142d58360e084016140fa565b60e08201526101008083013567ffffffffffffffff8111156142f657600080fd5b614302858286016141d1565b82840152505092915050565b60006020828403121561431f578081fd5b81356108e581614dcd565b6000806040838503121561433c578081fd5b823561434781614dcd565b9150602083013561435781614dcd565b809150509250929050565b600080600060608486031215614376578081fd5b833561438181614dcd565b9250602084013561439181614dcd565b929592945050506040919091013590565b600080600080600080600060e0888a0312156143bc578485fd5b87356143c781614dcd565b965060208801356143d781614dcd565b9550604088013594506060880135935060808801356143f581614de2565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215614424578182fd5b823561442f81614dcd565b946020939093013593505050565b600080600060608486031215614451578081fd5b835167ffffffffffffffff80821115614468578283fd5b818601915086601f83011261447b578283fd5b815161448961412382614da1565b80828252602080830192508086018b8283870289010111156144a9578788fd5b8796505b848710156144d45780516144c081614dcd565b8452600196909601959281019281016144ad565b5089015190975093505050808211156144eb578283fd5b506144f886828701614173565b925050604084015190509250925092565b60006020828403121561451a578081fd5b815180151581146108e5578182fd5b60006020828403121561453a578081fd5b5051919050565b600080600080600080600060e0888a03121561455b578081fd5b87359650602088013561456d81614dcd565b9550604088013561457d81614dcd565b9450606088013567ffffffffffffffff80821115614599578283fd5b6145a58b838c01614105565b955060808a0135945060a08a0135935060c08a01359150808211156145c8578283fd5b506145d58a828b016141d1565b91505092959891949750929550565b6000602082840312156145f5578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e5578182fd5b600060208284031215614635578081fd5b81516108e581614dcd565b600060808284031215614651578081fd5b61465b6080614d7a565b8251815260208301516020820152604083015167ffffffffffffffff81168114614683578283fd5b6040820152606083015160038110614699578283fd5b60608201529392505050565b600060c082840312156146b6578081fd5b6146c060c0614d7a565b82516146cb81614dcd565b815260208301516146db81614dcd565b602082015260408301516146ee81614dcd565b80604083015250606083015160608201526080830151608082015260a083015160a08201528091505092915050565b60008060008060808587031215614732578182fd5b843567ffffffffffffffff80821115614749578384fd5b61475588838901614249565b9550602087013591508082111561476a578384fd5b5061477787828801614105565b949794965050505060408301359260600135919050565b6000806000606084860312156147a2578081fd5b833567ffffffffffffffff8111156147b8578182fd5b6147c486828701614249565b9660208601359650604090950135949350505050565b6000602082840312156147eb578081fd5b5035919050565b60008060408385031215614804578182fd5b50508035926020909101359150565b60008060008060808587031215614828578182fd5b845193506020850151925060408501519150606085015161484881614dcd565b939692955090935050565b600060208284031215614864578081fd5b81516108e581614de2565b60008060408385031215614881578182fd5b825161488c81614de2565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156148d8578151875295820195908201906001016148bc565b509495945050505050565b15159052565b60008151808452815b8181101561490e576020818501810151868301820152016148f2565b8181111561491f5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b602080825282518282018190526000919060409081850190868401855b82811015614a86578151805160048110614a2f57fe5b855280870151614a418887018261489c565b508581015186860152606080820151614a5c8288018261489c565b505060809081015190614a718682018361489c565b505060a0939093019290850190600101614a19565b5091979650505050505050565b6000602082526108e560208301846148a9565b600060408252614ab960408301856148a9565b828103602084015261109e81856148a9565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b80831015614b8757614b718451614dc1565b8252928401926001929092019190840190614b5f565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a0870152614bc581856148a9565b935050506040850151818584030160c0860152614be283826148e9565b925050506060840151614bf860e08501826148e3565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b81811015614c7f57614c6d8551614dc1565b83529383019391830191600101614c5b565b505084810360408601528551808252908201925081860190845b818110156124cc57614cab8351614dc1565b85529383019391830191600101614c99565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6020810160038310614d2c57fe5b91905290565b6000602082526108e560208301846148e9565b6000838252604060208301526115d060408301846148a9565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715614d9957600080fd5b604052919050565b600067ffffffffffffffff821115614db7578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146119cf57600080fd5b60ff811681146119cf57600080fdfea26469706673582212203ac34546f9aeae30b98c4febf2eaa8b86e91697319bee5c4bf4ccc0bfe38b84964736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/artifact/SiloLinearPoolFactory.json b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/artifact/SiloLinearPoolFactory.json new file mode 100644 index 0000000..de8ec8c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/artifact/SiloLinearPoolFactory.json @@ -0,0 +1,334 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SiloLinearPoolFactory", + "sourceName": "contracts/silo-linear-pool/SiloLinearPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "contract IBalancerQueries", + "name": "queries", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "poolVersion", + "type": "string" + }, + { + "internalType": "uint256", + "name": "initialPauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "SiloLinearPoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract SiloLinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastCreatedPool", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeePercentagesProvider", + "outputs": [ + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101e06040523480156200001257600080fd5b506040516200a1793803806200a1798339810160408190526200003591620003bc565b86868383604051806020016200004b906200026b565b601f1982820381018352601f9091011660405282828630848d6200006f816200017d565b5080516002810460a081905280820360e0819052818452836200009e8162000196602090811b620009f517901c565b60601b6001600160601b0319166080528285018051838252620000cd8262000196602090811b620009f517901c565b6001600160601b0319606091821b811660c0529690935290526101009590955250509290911b909116610120525062000110630163f500831115610194620001ea565b620001246276a700821115610195620001ea565b610140829052610160524201610180525050506001600160601b0319606091821b81166101a05260016003559087901b166101c0525082516200016f90600690602086019062000279565b50505050505050506200048d565b80516200019290600090602084019062000279565b5050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001e46001600160a01b03831615156101ac620001ea565b50919050565b816200019257620001928162000207816210905360ea1b6200020a565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b616041806200413883390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002bc57805160ff1916838001178555620002ec565b82800160010185558215620002ec579182015b82811115620002ec578251825591602001919060010190620002cf565b50620002fa929150620002fe565b5090565b5b80821115620002fa5760008155600101620002ff565b600082601f83011262000326578081fd5b81516001600160401b03808211156200033d578283fd5b6040516020601f8401601f19168201810183811183821017156200035f578586fd5b806040525081945083825286818588010111156200037c57600080fd5b600092505b83831015620003a0578583018101518284018201529182019162000381565b83831115620003b25760008185840101525b5050505092915050565b600080600080600080600060e0888a031215620003d7578283fd5b8751620003e48162000477565b6020890151909750620003f78162000477565b60408901519096506200040a8162000477565b60608901519095506001600160401b038082111562000427578485fd5b620004358b838c0162000315565b955060808a01519150808211156200044b578485fd5b506200045a8a828b0162000315565b93505060a0880151915060c0880151905092959891949750929550565b6001600160a01b03811681146200020757600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405161016051610180516101a05160601c6101c05160601c613c16620005226000398061057052508061050452508061028b52806102b55250806102d9525050806109465250806108f4525080610a5e5250806102625280610ada525080610a7f5250806102415280610ab65250613c166000f3fe60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c80636634b753116200009957806376895be7116200006f57806376895be714620001cd578063851c1bb314620001e45780638d928af8146200020a578063aaabadc5146200021457620000ff565b80636634b75314620001935780636c57f5a914620001b9578063739238d614620001c357620000ff565b80632f2770db11620000db5780632f2770db146200015a5780633f819b6f146200016657806354fd4d5014620001705780635ed31282146200017a57620000ff565b8062c194db1462000104578063174481fa14620001265780632da47c401462000140575b600080fd5b6200010e6200021e565b6040516200011d91906200145b565b60405180910390f35b620001306200023f565b6040516200011d929190620013f4565b6200014a62000285565b6040516200011d92919062001684565b620001646200030e565b005b6200010e62000378565b6200010e62000430565b62000184620004b2565b6040516200011d9190620013d3565b620001aa620001a43660046200114f565b620004ce565b6040516200011d91906200141b565b620001aa620004f9565b6200018462000502565b62000184620001de366004620011f8565b62000526565b620001fb620001f536600462001197565b620008f0565b6040516200011d919062001426565b6200018462000944565b6200018462000968565b60606200023a6040518060200160405280600081525062000a56565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200030057807f00000000000000000000000000000000000000000000000000000000000000000392507f0000000000000000000000000000000000000000000000000000000000000000915062000309565b60009250600091505b509091565b6200031862000b31565b6200032262000b80565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b820191906000526020600020905b8154815290600101906020018083116200040857829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006200053262000b99565b6004805460018101909155604051606090620005516020820162000fe3565b601f1982820381018352601f909101166040526200056e62000944565b7f00000000000000000000000000000000000000000000000000000000000000008b604051602001620005a49392919062001470565b60408051601f1981840301815290829052620005c49291602001620013a0565b60405160208183030381529060405290506000620005ea83838051906020012062000bb4565b9050600080620005f962000285565b915091506200060762000ff1565b6200061162000944565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508f81602001819052508e81604001819052508d816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508c816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b8160c00181815250508a8160e0018181525050828161010001818152505081816101200181815250508981610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506200076f62000378565b610160820152604051600090620007a690620007909084906020016200157c565b6040516020818303038152906040528a62000bcc565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620007f157600080fd5b505af115801562000806573d6000803e3d6000fd5b5050505060006200081a6000898962000c23565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146200088d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000884906200150e565b60405180910390fd5b6040518b9073ffffffffffffffffffffffffffffffffffffffff8416907f33ff149e9e224f85522bd94ff587bd54aaf8aa5a16fd924ff001375d729cad2990600090a3509650505050505050620008e362000d01565b9998505050505050505050565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016200092792919062001370565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006200097462000944565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620009ba57600080fd5b505afa158015620009cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023a9190620011d9565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000a5073ffffffffffffffffffffffffffffffffffffffff831615156101ac62000d08565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000b2381838662000d1d565b505050505050505050919050565b600062000b626000357fffffffff0000000000000000000000000000000000000000000000000000000016620008f0565b905062000b7d62000b74823362000d7b565b61019162000d08565b50565b62000b9762000b8e620004f9565b1560d362000d08565b565b62000bad6002600354141561019062000d08565b6002600355565b600062000bc383833062000e19565b90505b92915050565b60008062000bdb848462000e5a565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316179055949350505050565b6000808447101562000c63576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088490620014a0565b825162000c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008849062001545565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088490620014d7565b949350505050565b6001600355565b8162000d195762000d198162000ef7565b5050565b5b6020811062000d3f578151835260209283019290910190601f190162000d1e565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000d8762000968565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000dc5939291906200142f565b60206040518083038186803b15801562000dde57600080fd5b505afa15801562000df3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bc3919062001175565b60008060ff60f81b83868660405160200162000e3994939291906200130c565b60408051808303601f19018152919052805160209091012095945050505050565b600062000e6662000b80565b600062000e74848462000f23565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a29392505050565b62000b7d817f42414c000000000000000000000000000000000000000000000000000000000062000f68565b6000606062000f328462000a56565b90506000838251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf9573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6124f880620016e983390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b803562000bc681620016c5565b600082601f830112620010de578081fd5b813567ffffffffffffffff80821115620010f6578283fd5b6040516020601f19601f850116820101818110838211171562001117578485fd5b6040528281529250828483016020018610156200113357600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121562001161578081fd5b81356200116e81620016c5565b9392505050565b60006020828403121562001187578081fd5b815180151581146200116e578182fd5b600060208284031215620011a9578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146200116e578182fd5b600060208284031215620011eb578081fd5b81516200116e81620016c5565b60008060008060008060008060006101208a8c03121562001217578485fd5b893567ffffffffffffffff808211156200122f578687fd5b6200123d8d838e01620010cd565b9a5060208c013591508082111562001253578687fd5b50620012628c828d01620010cd565b98505060408a01356200127581620016c5565b965060608a01356200128781620016c5565b955060808a0135945060a08a01359350620012a68b60c08c01620010c0565b925060e08a013591506101008a013590509295985092959850929598565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620012f881602086016020860162001692565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60008351620013b481846020880162001692565b835190830190620013ca81836020880162001692565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000bc36020830184620012de565b73ffffffffffffffffffffffffffffffffffffffff93841681529183166020830152909116604082015260600190565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b60006020825262001592602083018451620012c4565b6020830151610180806040850152620015b06101a0850183620012de565b91506040850151601f1980868503016060870152620015d08483620012de565b935060608701519150620015e86080870183620012c4565b60808701519150620015fe60a0870183620012c4565b60a087015191506200161460c0870183620012c4565b60c087015160e08781019190915287015161010080880191909152870151610120808801919091528701516101408088019190915287015191506101606200165f81880184620012c4565b8701518685039091018387015290506200167a8382620012de565b9695505050505050565b918252602082015260400190565b60005b83811015620016af57818101518382015260200162001695565b83811115620016bf576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000b7d57600080fdfe6101606040523480156200001257600080fd5b50604051620024f8380380620024f883398101604081905262000035916200051c565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000432565b8383826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000125919081019062000458565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000503565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000503565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000432565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000432565b606090811b6001600160601b031990811660e05292811b8316610120521b166101405250600080546001600160a01b0319166001600160a01b0383811691909117918290556040805163eb3beb2960e01b81529051929091169163eb3beb2991600480820192602092909190829003018186803b158015620003cd57600080fd5b505afa158015620003e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000408919062000432565b600180546001600160a01b0319166001600160a01b039290921691909117905550620005af915050565b60006020828403121562000444578081fd5b8151620004518162000596565b9392505050565b600060208083850312156200046b578182fd5b82516001600160401b038082111562000482578384fd5b818501915085601f83011262000496578384fd5b815181811115620004a5578485fd5b8381029150620004b78483016200056f565b8181528481019084860184860187018a1015620004d2578788fd5b8795505b83861015620004f6578051835260019590950194918601918601620004d6565b5098975050505050505050565b60006020828403121562000515578081fd5b5051919050565b60008060006060848603121562000531578182fd5b83516200053e8162000596565b6020850151909350620005518162000596565b6040850151909250620005648162000596565b809150509250925092565b6040518181016001600160401b03811182821017156200058e57600080fd5b604052919050565b6001600160a01b0381168114620005ac57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c611e66620006926000398061049f52806107765250806101285280610b355280610e5a5280610eaf52508061037c52508061041c528061052f52806106c4528061084152508060dd528061017852806103ed528061056252806105ba528061064e52806106f352806108065280610bb85280610c1f5280610f1d5280610f5c5280610fc652508061015752806103bf528061069652806109c55280610a8a5280610d095280610dce525080609952806102d35250611e666000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611be5565b60405180910390f35b6100776100723660046119b7565b6100bb565b60405161005b9190611db5565b6100776100923660046119d3565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610117565b90505b919050565b60006101056001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085610241565b61010e83610117565b90505b92915050565b6000806101226102cc565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101b4929190611d06565b60806040518083038186803b1580156101cc57600080fd5b505afa1580156101e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102049190611b52565b5050509050818110156102265761021d818303856103a8565b925050506100c9565b8181111561023a5761021d8282038561067f565b5050919050565b6102c6846323b872dd60e01b85858560405160240161026293929190611c13565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610866565b50505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561032957600080fd5b505afa15801561033d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103619190611b2f565b91509150600060028284018161037357fe5b0490506103a0817f0000000000000000000000000000000000000000000000000000000000000000610906565b935050505090565b60006103b26118a8565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815260200185815260200160405180602001604052806000815250815250905061046c6118f1565b6040517fe969f6b30000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906104d69086908690600401611d1d565b602060405180830381600087803b1580156104f057600080fd5b505af1158015610504573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105289190611b17565b90506105547f000000000000000000000000000000000000000000000000000000000000000082610959565b61055d81610ba3565b6105877f000000000000000000000000000000000000000000000000000000000000000087610c9d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906105ef903090600401611be5565b60206040518083038186803b15801561060757600080fd5b505afa15801561061b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063f9190611b17565b90506106756001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168783610ee4565b9695505050505050565b60006106896118a8565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020018581526020016040518060200160405280600081525081525090506107436118f1565b6040517fe969f6b30000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906107ad9086908690600401611d1d565b602060405180830381600087803b1580156107c757600080fd5b505af11580156107db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ff9190611b17565b905061082b7f000000000000000000000000000000000000000000000000000000000000000087610959565b61083c61083782610f08565b610f4b565b6105877f000000000000000000000000000000000000000000000000000000000000000082610c9d565b60006060836001600160a01b0316836040516108829190611bc9565b6000604051808303816000865af19150503d80600081146108bf576040519150601f19603f3d011682016040523d82523d6000602084013e6108c4565b606091505b509150915060008214156108dc573d6000803e3d6000fd5b6102c68151600014806108fe5750818060200190518101906108fe91906119fe565b6101a2611044565b60006109158215156004611044565b670de0b6b3a764000083026109478415806109405750670de0b6b3a764000085838161093d57fe5b04145b6005611044565b82818161095057fe5b04949350505050565b6040805160028082526060828101909352816020015b610977611918565b81526020019060019003908161096f57905050905060008160008151811061099b57fe5b60200260200101516000019060028111156109b257fe5b908160028111156109bf57fe5b815250507f0000000000000000000000000000000000000000000000000000000000000000816000815181106109f157fe5b602002602001015160200181815250508181600081518110610a0f57fe5b602002602001015160600181815250508281600081518110610a2d57fe5b6020026020010151604001906001600160a01b031690816001600160a01b031681525050600281600181518110610a6057fe5b6020026020010151600001906002811115610a7757fe5b90816002811115610a8457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ab657fe5b60200260200101516020018181525050600081600181518110610ad557fe5b602002602001015160600181815250508281600181518110610af357fe5b60209081029190910101516001600160a01b03918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610b6c908490600401611c8f565b600060405180830381600087803b158015610b8657600080fd5b505af1158015610b9a573d6000803e3d6000fd5b50505050505050565b600154600090610bdd906001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000084611056565b6001546040517fead5d3590000000000000000000000000000000000000000000000000000000081529192506001600160a01b03169063ead5d35990610c4c907f0000000000000000000000000000000000000000000000000000000000000000908590600090600401611c6c565b6040805180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102c69190611b2f565b6040805160028082526060828101909352816020015b610cbb611918565b815260200190600190039081610cb3579050509050600281600081518110610cdf57fe5b6020026020010151600001906002811115610cf657fe5b90816002811115610d0357fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610d3557fe5b602002602001015160200181815250508181600081518110610d5357fe5b602002602001015160600181815250508281600081518110610d7157fe5b6020026020010151604001906001600160a01b031690816001600160a01b031681525050600181600181518110610da457fe5b6020026020010151600001906002811115610dbb57fe5b90816002811115610dc857fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610dfa57fe5b602002602001015160200181815250508181600181518110610e1857fe5b602002602001015160600181815250508281600181518110610e3657fe5b60209081029190910101516001600160a01b03918216604090910152610e7f9084167f00000000000000000000000000000000000000000000000000000000000000008461107a565b6040517fe6c460920000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610b6c908490600401611c8f565b610f038363a9059cbb60e01b8484604051602401610262929190611c53565b505050565b600154600090610f42906001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000084611056565b60010192915050565b600154610f85906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691168361107a565b6001546040517f3edd11280000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690633edd112890610ff3907f0000000000000000000000000000000000000000000000000000000000000000908590600090600401611c6c565b6040805180830381600087803b15801561100c57600080fd5b505af1158015611020573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f039190611b2f565b816110525761105281611162565b5050565b600080611063858561118f565b905061106f83826112e3565b9150505b9392505050565b801580159061111e57506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063dd62ed3e906110cb9030908690600401611bf9565b60206040518083038186803b1580156110e357600080fd5b505afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b9190611b17565b15155b15611143576111438363095ea7b360e01b846000604051602401610262929190611c37565b610f038363095ea7b360e01b8484604051602401610262929190611c53565b61118c817f42414c0000000000000000000000000000000000000000000000000000000000611316565b50565b6000611199611941565b6111a38484611391565b90506111ad611992565b6111b78585611470565b90506000816040015167ffffffffffffffff169050600083606001519050600084600001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561121457600080fd5b505afa158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190611b17565b90504283146112cd5760006112618989611502565b9050600061126e8a6115f6565b90506000866020015190506000806000611295868c60a001516112e390919063ffffffff16565b9050670de0b6b3a76400008582020492508383850110156112b557831992505b82810391506112c488836116bf565b97505050505050505b6112d78282610906565b98975050505050505050565b60008282026113078415806113005750838583816112fd57fe5b04145b6003611044565b670de0b6b3a764000081610950565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611399611941565b6040517fbf2730410000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063bf273041906113de908590600401611be5565b60c06040518083038186803b1580156113f657600080fd5b505afa925050508015611426575060408051601f3d908101601f1916820190925261142391810190611a9f565b60015b611469573d808015611454576040519150601f19603f3d011682016040523d82523d6000602084013e611459565b606091505b50611463816116d1565b50610111565b9050610111565b611478611992565b6040517ffb2557030000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063fb255703906114bd908590600401611be5565b60806040518083038186803b1580156114d557600080fd5b505afa925050508015611426575060408051601f3d908101601f1916820190925261142391810190611a3a565b60008061150f8484611758565b6040517fb1e017650000000000000000000000000000000000000000000000000000000081529091506001600160a01b0382169063b1e017659061155b90879087904290600401611c13565b60206040518083038186803b15801561157357600080fd5b505afa9250505080156115a3575060408051601f3d908101601f191682019092526115a091810190611b17565b60015b6115e6573d8080156115d1576040519150601f19603f3d011682016040523d82523d6000602084013e6115d6565b606091505b506115e0816116d1565b506115ef565b91506101119050565b5092915050565b600080611602836117f3565b9050806001600160a01b03166325ed3d446040518163ffffffff1660e01b815260040160206040518083038186803b15801561163d57600080fd5b505afa92505050801561166d575060408051601f3d908101601f1916820190925261166a91810190611b17565b60015b6116b0573d80801561169b576040519150601f19603f3d011682016040523d82523d6000602084013e6116a0565b606091505b506116aa816116d1565b506116b9565b91506100c99050565b50919050565b600082820161010e8482101583611044565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc120000000000000000000000000000000000000000000000000000000082141761174c578160208401fd5b50611052610165611162565b600080611764846117f3565b6040517f48b3eabc0000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906348b3eabc906117ae9087908790600401611bf9565b60206040518083038186803b1580156117c657600080fd5b505afa9250505080156115a3575060408051601f3d908101601f191682019092526115a091810190611a1e565b6000816001600160a01b031663bde127186040518163ffffffff1660e01b815260040160206040518083038186803b15801561182e57600080fd5b505afa92505050801561185e575060408051601f3d908101601f1916820190925261185b91810190611a1e565b60015b6118a1573d80801561188c576040519150601f19603f3d011682016040523d82523d6000602084013e611891565b606091505b5061189b816116d1565b506100c9565b90506100c9565b6040805160c0810190915260008082526020820190815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040805160808101825260008082526020820181905291810182905290606082015290565b6000602082840312156119c8578081fd5b813561010e81611e1b565b600080604083850312156119e5578081fd5b82356119f081611e1b565b946020939093013593505050565b600060208284031215611a0f578081fd5b8151801515811461010e578182fd5b600060208284031215611a2f578081fd5b815161010e81611e1b565b600060808284031215611a4b578081fd5b611a556080611dbe565b8251815260208301516020820152604083015167ffffffffffffffff81168114611a7d578283fd5b6040820152606083015160038110611a93578283fd5b60608201529392505050565b600060c08284031215611ab0578081fd5b611aba60c0611dbe565b8251611ac581611e1b565b81526020830151611ad581611e1b565b60208201526040830151611ae881611e1b565b80604083015250606083015160608201526080830151608082015260a083015160a08201528091505092915050565b600060208284031215611b28578081fd5b5051919050565b60008060408385031215611b41578182fd5b505080516020909101519092909150565b60008060008060808587031215611b67578182fd5b8451935060208501519250604085015191506060850151611b8781611e1b565b939692955090935050565b6001600160a01b03808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b60008251611bdb818460208701611de5565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0392909216825260ff16602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b602080825282518282018190526000919060409081850190868401855b82811015611cf9578151805160038110611cc257fe5b85528087015187860152858101516001600160a01b0316868601526060908101519085015260809093019290850190600101611cac565b5091979650505050505050565b9182526001600160a01b0316602082015260400190565b600060a08252835160a08301526020840151611d3881611e11565b8060c08401525060408401516001600160a01b0380821660e0850152806060870151166101008501525050608084015161012083015260a084015160c0610140840152805180610160850152610180611d978282870160208601611de5565b80601f19601f84011686010193505050506110736020830184611b92565b90815260200190565b60405181810167ffffffffffffffff81118282101715611ddd57600080fd5b604052919050565b60005b83811015611e00578181015183820152602001611de8565b838111156102c65750506000910152565b6002811061118c57fe5b6001600160a01b038116811461118c57600080fdfea264697066735822122090e565ce6d4b10ae5de465aaed55049ecc172eb4d46de92acd33f0a9fb4cf84164736f6c63430007010033a26469706673582212202e19ad4b0508de4bb0566bc0ffa96e895051b33ec01d3bed5b1f4f40656634e864736f6c634300070100336102c06040523480156200001257600080fd5b506040516200604138038062006041833981016040819052620000359162000e03565b6101608101518151602083015160408401516060850151608086015160c0870151620000618862000479565b60e08901516101008a01516101208b01516101408c01518a6200009e8160006200008c8c8c62000502565b89620005b360201b620014231760201c565b8b8b86868686838387878b86336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000ed92919062000c8c565b5080516200010390600490602084019062000c8c565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001829050630163f50083111561019462000781565b620001966276a70082111561019562000781565b4291909101610140819052016101605260601b6001600160601b031916610180526101a08690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000dc4565b6001600160a01b03166101c0816001600160a01b031660601b8152505050505050505050876001600160a01b03166101e0816001600160a01b031660601b81525050866001600160a01b0316610200816001600160a01b031660601b81525050866001600160a01b0316886001600160a01b031610620002bb576002620002be565b60015b60ff16610220526001600160a01b0380881690891610620002e1576001620002e4565b60025b60ff1661024052620002f68862000796565b61026052620003058762000796565b6102805260006200031889828962000842565b62000323856200093c565b5050505050505050505050506200034081620009cb60201b60201c565b50600081608001519050620003ea816001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038857600080fd5b505afa1580156200039d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003c3919062000dc4565b6001600160a01b031683606001516001600160a01b0316146102086200078160201b60201c565b806001600160a01b031663eb3beb296040518163ffffffff1660e01b815260040160206040518083038186803b1580156200042457600080fd5b505afa15801562000439573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200045f919062000dc4565b60601b6001600160601b0319166102a05250620010809050565b6040805160028082526060808301845292839291906020830190803683370190505090508260a0015181600081518110620004b057fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260a0015181600181518110620004e357fe5b6001600160a01b03909216602092830291909101909101529050919050565b60408051600280825260608281019093526001600160a01b03848116908616109183918160200160208202803683370190505090508162000544578362000546565b845b816000815181106200055457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508162000581578462000583565b835b816001815181106200059157fe5b6001600160a01b03909216602092830291909101909101529150505b92915050565b6000620005cb83620009e060201b620015d81760201c565b606083516001016001600160401b0381118015620005e857600080fd5b5060405190808252806020026020018201604052801562000613578160200160208202803683370190505b50905030816000815181106200062557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b845181101562000698578481815181106200065f57fe5b60200260200101518282600101815181106200067757fe5b6001600160a01b039092166020928302919091019091015260010162000648565b50606083516001016001600160401b0381118015620006b657600080fd5b50604051908082528060200260200182016040528015620006e1578160200160208202803683370190505b509050600081600081518110620006f457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b845181101562000767578481815181106200072e57fe5b60200260200101518282600101815181106200074657fe5b6001600160a01b039092166020928302919091019091015260010162000717565b506200077687878484620009ec565b979650505050505050565b816200079257620007928162000ae6565b5050565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620007d357600080fd5b505afa158015620007e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200080e919062000f5a565b60ff16905060006200082d60128362000afb60201b620015e61760201c565b600a0a670de0b6b3a764000002949350505050565b620008538183111561014c62000781565b620008706b0de0b6b39983494c589c000082111561014d62000781565b6200088a670de0b6b3a7640000825b061561016162000781565b6200089e670de0b6b3a7640000836200087f565b620008ed670de0b6b3a7640000820460406020620008d7670de0b6b3a764000087600854919004602080620015fc62000b13821b17811c565b62000b1360201b620015fc17909392919060201c565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906200092f908590859062001029565b60405180910390a2505050565b6200095164e8d4a5100082101560cb62000781565b6200096967016345785d8a000082111560ca62000781565b6200098b8160c0603f60085462000b1360201b620015fc17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90620009c090839062001020565b60405180910390a150565b80516200079290600990602084019062000c8c565b80620007928162000b38565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040162000a1d91906200100b565b602060405180830381600087803b15801562000a3857600080fd5b505af115801562000a4d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a73919062000dea565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000aa89084908890889060040162000f7d565b600060405180830381600087803b15801562000ac357600080fd5b505af115801562000ad8573d6000803e3d6000fd5b509298975050505050505050565b62000af8816210905360ea1b62000bc4565b50565b600062000b0d83831115600162000781565b50900390565b600062000b2284848462000c25565b506001901b60001901811b1992909216911b1790565b60028151101562000b495762000af8565b60008160008151811062000b5957fe5b602002602001015190506000600190505b825181101562000bbf57600083828151811062000b8357fe5b6020026020010151905062000bb4816001600160a01b0316846001600160a01b03161060656200078160201b60201c565b915060010162000b6a565b505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b62000c366101008310606462000781565b62000c6f6001821015801562000c67575062000c6360ff846101000362000c8060201b6200161f1760201c565b8211155b606462000781565b62000bbf83821c156101b462000781565b80820390821102900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000ccf57805160ff191683800117855562000cff565b8280016001018555821562000cff579182015b8281111562000cff57825182559160200191906001019062000ce2565b5062000d0d92915062000d11565b5090565b5b8082111562000d0d576000815560010162000d12565b8051620005ad816200106a565b600082601f83011262000d46578081fd5b81516001600160401b0381111562000d5c578182fd5b602062000d72601f8301601f1916820162001037565b9250818352848183860101111562000d8957600080fd5b60005b8281101562000da957848101820151848201830152810162000d8c565b8281111562000dbb5760008284860101525b50505092915050565b60006020828403121562000dd6578081fd5b815162000de3816200106a565b9392505050565b60006020828403121562000dfc578081fd5b5051919050565b60006020828403121562000e15578081fd5b81516001600160401b038082111562000e2c578283fd5b818401915061018080838703121562000e43578384fd5b62000e4e8162001037565b905062000e5c868462000d28565b815260208301518281111562000e70578485fd5b62000e7e8782860162000d35565b60208301525060408301518281111562000e96578485fd5b62000ea48782860162000d35565b60408301525062000eb9866060850162000d28565b606082015262000ecd866080850162000d28565b608082015262000ee18660a0850162000d28565b60a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014062000f238782860162000d28565b90820152610160838101518381111562000f3b578586fd5b62000f498882870162000d35565b918301919091525095945050505050565b60006020828403121562000f6c578081fd5b815160ff8116811462000de3578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000fc95762000fb685516200105e565b8352938301939183019160010162000fa1565b505084810360408601528551808252908201925081860190845b8181101562000ad85762000ff883516200105e565b8552938301939183019160010162000fe3565b60208101600383106200101a57fe5b91905290565b90815260200190565b918252602082015260400190565b6040518181016001600160401b03811182821017156200105657600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b038116811462000af857600080fd5b60805160a05160c05160e0516101005160601c6101205160601c61014051610160516101805160601c6101a0516101c05160601c6101e05160601c6102005160601c610220516102405161026051610280516102a05160601c614e276200121a600039806118455250806107f352508061078f5280612aa7525080610717528061081b5280610c505280612f2152806130aa52806131e252806132ed528061346a52806135a25250806107b152806109bb5280610c165280612eed528061302f5280613076528061316c52806131ae52806132b952806133f45280613436528061352c528061356e5250806113f7528061264452806127105280612acd5280612ea25280612fbb528061326f52806133805250806109df52806110ed5280611a075280611aa652806125fb52806126c75280612a6c5280612e635280612f6552806130f85280613230528061333152806134b85250806111cb5250806109485250508061181c5250806117f8525080610fd0525080610fac525080610f5c52508061233852508061237a5250806123595250614e276000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e36600461471d565b610608565b6040516103509190614aee565b60405180910390f35b610361610668565b6040516103509190614d32565b61038161037c366004614412565b6106fe565b6040516103509190614acb565b610343610715565b610343610739565b6103a661073f565b60405161035093929190614ad6565b6103bd610768565b6040516103509190614a93565b6103816103d8366004614362565b610876565b6103e56108ec565b6040516103509190614d6c565b6103436108f5565b61040d6104083660046147da565b610904565b005b610343610946565b610381610425366004614412565b61096a565b61040d6109a5565b6103436109b9565b6104426109dd565b60405161035091906149aa565b61040d610a01565b610361610a55565b610343610ab6565b61047a610475366004614541565b610ac9565b604051610350929190614d45565b610490610ae7565b604051610350929190614d5e565b610343610b25565b6103436104b436600461430e565b610cba565b6104cc6104c7366004614541565b610cd9565b604051610350929190614aa6565b6103436104e836600461430e565b610d9b565b61040d610da6565b610343610f41565b61040d610f46565b6103436105133660046145e4565b610f58565b610442610faa565b610442610fce565b61034361053636600461430e565b610ff2565b61036161100d565b61034361055136600461478e565b61106e565b61040d6105643660046147f2565b6110a7565b610381610577366004614412565b611119565b61038161058a366004614412565b611157565b610442611164565b61038161116e565b61040d61117f565b6104426111c9565b61040d6105bd3660046143a2565b6111ed565b6104cc6105d0366004614541565b61126e565b6103436105e336600461432a565b611305565b610343611342565b6103436113eb565b6104426113f5565b610343611419565b6000846080015161063561061a610fce565b6001600160a01b0316336001600160a01b03161460cd61162b565b61064a610640610946565b82146101f461162b565b610652611639565b61065e8686868661164c565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050905090565b600061070b338484611771565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074c6117d9565b1592506107576117f6565b915061076161181a565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107da57fe5b6020026020010181815250506108186107f161183e565b7f000000000000000000000000000000000000000000000000000000000000000090611871565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084457fe5b602002602001018181525050670de0b6b3a76400008160008151811061086657fe5b6020908102919091010152905090565b6000806108838533611305565b90506108a7336001600160a01b038716148061089f5750838210155b61019e61162b565b6108b28585856118a9565b336001600160a01b038616148015906108cd57506000198114155b156108df576108df8533858403611771565b60019150505b9392505050565b60055460ff1690565b60006108ff6113eb565b905090565b61090c611989565b6109146119d2565b60008061091f610ae7565b9150915061093861093083836119e2565b61014f61162b565b61094183611ae9565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070b9185906109a09086611b61565b611771565b6109ad611989565b6109b76000611b73565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a09611989565b610a11611c04565b610a1b6001611c18565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4b9190614acb565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906108ff9060c0603f611c5a565b60006060610adb888785611c69611c80565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0482602080611c5a565b029250670de0b6b3a7640000610b1d8260406020611c5a565b029150509091565b600080610b30610946565b90506060610b3c610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b679190614aee565b60006040518083038186803b158015610b7f57600080fd5b505afa158015610b93573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbb919081019061443d565b50915050610bd081610bcb610768565b611de7565b600080610bdb610ae7565b91509150610be7614009565b6040518060600160405280610bfa610ab6565b81526020018481526020018381525090506000610c86610c4d867f000000000000000000000000000000000000000000000000000000000000000081518110610c3f57fe5b602002602001015184611e50565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7957fe5b6020026020010151611eb1565b9050610caf610ca886600081518110610c9b57fe5b6020026020010151611ebd565b8290611ed1565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce861061a610fce565b610cf3610640610946565b6000610cfe85611f28565b15610d2657610d0b611f57565b610d1d88610d17610739565b87611f6a565b94509050610d3e565b610d2e611639565b610d398a8987611c69565b945090505b610d488a82612060565b835167ffffffffffffffff81118015610d6057600080fd5b50604051908082528060200260200182016040528015610d8a578160200160208202803683370190505b509250505097509795505050505050565b600061070f82610ff2565b6000610db0610946565b90506060610dbc610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de79190614aee565b60006040518083038186803b158015610dff57600080fd5b505afa158015610e13573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3b919081019061443d565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e7f57fe5b602002602001018181525050610e9361402a565b6040518060800160405280610ea78561206a565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed8610fce565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f099493929190614b16565b600060405180830381600087803b158015610f2357600080fd5b505af1158015610f37573d6000803e3d6000fd5b5050505050505050565b600090565b610f4e611989565b6109b76001611b73565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8d929190614934565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108061061a610fce565b61108b610640610946565b611093611639565b61109e85858561206d565b95945050505050565b6110af611989565b6110b76119d2565b6000806110c2610ae7565b915091506110d361093083836119e2565b6110e86110e085856119e2565b61015761162b565b6111137f0000000000000000000000000000000000000000000000000000000000000000858561207a565b50505050565b6000806111263385611305565b90508083106111405761113b33856000611771565b61114d565b61114d3385858403611771565b5060019392505050565b600061070b3384846118a9565b60006108ff612150565b6008546000906108ff9060ff6121ca565b611187611989565b61118f611f57565b6111996000611c18565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4b9190614acb565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121c8c610ff2565b8960405160200161123296959493929190614c03565b604051602081830303815290604052805190602001209050611263888261125a8787876121d1565b886101f8612210565b610f37888888611771565b6060808861127d61061a610fce565b611288610640610946565b6000611292611639565b61129a610739565b6112ec576112a98a8a87612267565b945090506112c26112b8610f41565b82101560cc61162b565b6112d460006112cf610f41565b6122ff565b6112e7896112e0610f41565b83036122ff565b610d48565b6112f78a8987611c69565b94509050610d4889826122ff565b600061130f610fce565b6001600160a01b0316826001600160a01b03161415611331575060001961070f565b61133b8383612309565b905061070f565b600080600061134f610fce565b6001600160a01b031663b05f8e48611365610946565b306040518363ffffffff1660e01b8152600401611383929190614ce9565b60806040518083038186803b15801561139b57600080fd5b505afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190614813565b5050915091506113e4818301611ebd565b9250505090565b60006108ff612334565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff61183e565b600061142e836115d8565b6060835160010167ffffffffffffffff8111801561144b57600080fd5b50604051908082528060200260200182016040528015611475578160200160208202803683370190505b509050308160008151811061148657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f5578481815181106114be57fe5b60200260200101518282600101815181106114d557fe5b6001600160a01b03909216602092830291909101909101526001016114a9565b506060835160010167ffffffffffffffff8111801561151357600080fd5b5060405190808252806020026020018201604052801561153d578160200160208202803683370190505b50905060008160008151811061154f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115be5784818151811061158757fe5b602002602001015182826001018151811061159e57fe5b6001600160a01b0390921660209283029190910190910152600101611572565b506115cb878784846123d1565b925050505b949350505050565b806115e2816124da565b5050565b60006115f683831115600161162b565b50900390565b6000611609848484612553565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e2576115e281612599565b6109b76116446117d9565b61019261162b565b60006116686003841080156116615750600383105b606461162b565b6060611672610768565b905061167e8582611de7565b600080611689610ae7565b91509150611695614009565b60405180606001604052806116a8610ab6565b81526020810185905260400183905290506000895160018111156116c857fe5b141561172c576116ef89606001518589815181106116e257fe5b60200260200101516125c3565b60608a015260006117018a8a846125cf565b90506117208186898151811061171357fe5b6020026020010151612696565b955050505050506115d0565b61174089606001518588815181106116e257fe5b60608a015260006117528a8a846126a2565b905061172081868a8151811061176457fe5b6020026020010151612757565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cc908590614aee565b60405180910390a3505050565b60006117e361181a565b4211806108ff57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff7f000000000000000000000000000000000000000000000000000000000000000061186c6109dd565b612763565b600082820261189584158061188e57508385838161188b57fe5b04145b600361162b565b670de0b6b3a7640000815b04949350505050565b6118c06001600160a01b038416151561019861162b565b6118d76001600160a01b038316151561019961162b565b6118e2838383610941565b6001600160a01b03831660009081526020819052604090205461190890826101a06128b7565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119379082611b61565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cc908590614aee565b60006119b86000357fffffffff0000000000000000000000000000000000000000000000000000000016610f58565b90506119cf6119c782336128cd565b61019161162b565b50565b6109b76119dd610fce565b6129b6565b60008060006119ef610fce565b6001600160a01b031663b05f8e48611a05610946565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611a43929190614ce9565b60806040518083038186803b158015611a5b57600080fd5b505afa158015611a6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a939190614813565b5050915091506000611acf828401611aca7f0000000000000000000000000000000000000000000000000000000000000000612a68565b6125c3565b905085811015801561065e57509390931115949350505050565b611afc64e8d4a5100082101560cb61162b565b611b1267016345785d8a000082111560ca61162b565b600854611b23908260c0603f6115fc565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611b56908390614aee565b60405180910390a150565b60008282016108e5848210158361162b565b8015611b9357611b8e611b846117f6565b421061019361162b565b611ba8565b611ba8611b9e61181a565b42106101a961162b565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611b56908390614acb565b6109b7611c0f61116e565b156101b561162b565b600854611c27908260ff612b42565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611b56908390614acb565b6001901b6000190191901c1690565b60006060611c786103e6612599565b935093915050565b333014611d6f576000306001600160a01b0316600036604051611ca4929190614964565b6000604051808303816000865af19150503d8060008114611ce1576040519150601f19603f3d011682016040523d82523d6000602084013e611ce6565b606091505b505090508060008114611cf557fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611d51573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611d828686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611df6908290612b51565b60005b8181101561111357611e31848281518110611e1057fe5b6020026020010151848381518110611e2457fe5b6020026020010151611871565b848281518110611e3d57fe5b6020908102919091010152600101611df9565b60008160200151831015611e895781516020830151600091611e759186900390611871565b9050611e8184826115e6565b91505061070f565b81604001518311611e9b57508161070f565b81516040830151600091611e7591860390611871565b60006108e58383611b61565b600061070f82611ecb610739565b906115e6565b6000611ee0821515600461162b565b670de0b6b3a76400008302611f12841580611f0b5750670de0b6b3a7640000858381611f0857fe5b04145b600561162b565b6001836001830304018115150291505092915050565b600080825111801561070f575060ff801682806020019051810190611f4d9190614853565b60ff161492915050565b6109b7611f6261116e565b6101b661162b565b600060606000611f7984612b5e565b90506060865167ffffffffffffffff81118015611f9557600080fd5b50604051908082528060200260200182016040528015611fbf578160200160208202803683370190505b5090506000611fcc610f41565b90506000611fdf898381518110610c9b57fe5b90506000611fed8583612b74565b905060005b8a5181101561204f578381141561200a576000612030565b612030828c838151811061201a57fe5b602002602001015161187190919063ffffffff16565b85828151811061203c57fe5b6020908102919091010152600101611ff2565b509399929850919650505050505050565b6115e28282612bb4565b90565b60006108e56103e6612599565b6120898183111561014c61162b565b6120a46b0de0b6b39983494c589c000082111561014d61162b565b6120bc670de0b6b3a7640000825b061561016161162b565b6120ce670de0b6b3a7640000836120b2565b612103670de0b6b3a76400008204604060206120fb670de0b6b3a7640000876008549190046020806115fc565b9291906115fc565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121439085908590614d5e565b60405180910390a2505050565b600061215a610fce565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561219257600080fd5b505afa1580156121a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ff9190614624565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b600061221b85612c80565b905061223161222b878387612c9c565b8361162b565b612240428410156101b861162b565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606122826001600160a01b038616301461015661162b565b6122996001600160a01b038516301461015661162b565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff816000815181106122e857fe5b602090810291909101015290969095509350505050565b6115e28282612d4a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006123a1612ddd565b306040516020016123b6959493929190614cbd565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016124009190614d1e565b602060405180830381600087803b15801561241a57600080fd5b505af115801561242e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124529190614529565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d29061249e90849088908890600401614c37565b600060405180830381600087803b1580156124b857600080fd5b505af11580156124cc573d6000803e3d6000fd5b509298975050505050505050565b6002815110156124e9576119cf565b6000816000815181106124f857fe5b602002602001015190506000600190505b825181101561094157600083828151811061252057fe5b60200260200101519050612549816001600160a01b0316846001600160a01b031610606561162b565b9150600101612509565b6125626101008310606461162b565b61258a60018210158015611661575061258060ff846101000361161f565b821115606461162b565b61094183821c156101b461162b565b6119cf817f42414c0000000000000000000000000000000000000000000000000000000000612de1565b60006108e58383611871565b60208301516000906001600160a01b03163014156125f9576125f2848484612e5c565b90506108e5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612642576125f2848484612fb4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b0316141561268b576125f28484846130f1565b6108e5610135612599565b60006108e58383612b74565b60408301516000906001600160a01b03163014156126c5576125f2848484613229565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b0316141561270e576125f2848484613379565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b0316141561268b576125f28484846134b1565b60006108e58383611ed1565b600061276d614054565b61277784846135e9565b90506127816140a5565b61278b85856136c1565b90506000816040015167ffffffffffffffff169050600083606001519050600084600001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127e857600080fd5b505afa1580156127fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128209190614529565b90504283146128a15760006128358989613753565b905060006128428a613847565b90506000866020015190506000806000612869868c60a0015161187190919063ffffffff16565b9050670de0b6b3a764000085820204925083838501101561288957831992505b82810391506128988883611b61565b97505050505050505b6128ab8282612b74565b98975050505050505050565b60006128c6848411158361162b565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128ec610faa565b6001600160a01b031614158015612907575061290783613910565b1561292f57612914610faa565b6001600160a01b0316336001600160a01b031614905061070f565b612937612150565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161296693929190614af7565b60206040518083038186803b15801561297e57600080fd5b505afa158015612992573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b9190614509565b604080516000808252602082019092526060916129e9565b6129d66140ca565b8152602001906001900390816129ce5790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e8490612a329084906004016149fc565b600060405180830381600087803b158015612a4c57600080fd5b505af1158015612a60573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612acb57507f0000000000000000000000000000000000000000000000000000000000000000610cd4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612b1757612b106107f161183e565b9050610cd4565b6001600160a01b038216301415612b375750670de0b6b3a7640000610cd4565b610cd4610135612599565b6001811b1992909216911b1790565b6115e2818314606761162b565b6000818060200190518101906108e5919061486f565b6000612b83821515600461162b565b670de0b6b3a76400008302612bab841580611f0b5750670de0b6b3a7640000858381611f0857fe5b8281816118a057fe5b612bcb6001600160a01b038316151561019b61162b565b612bd782600083610941565b6001600160a01b038216600090815260208190526040902054612bfd90826101b26128b7565b6001600160a01b038316600090815260208190526040902055612c30612c2b82612c25610739565b90613974565b613982565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c749190614aee565b60405180910390a35050565b6000612c8a612334565b82604051602001610f8d929190614974565b6000612cae82516041146101b961162b565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612ce7908990859088908890614d00565b6020604051602081039080840390855afa158015612d09573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906128ab5750876001600160a01b0316816001600160a01b03161498975050505050505050565b612d5660008383610941565b612d6b612c2b82612d65610739565b90611b61565b6001600160a01b038216600090815260208190526040902054612d8e9082611b61565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c74908590614aee565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612ee27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eda57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162b565b6115d08460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f1657fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f4a57fe5b6020026020010151612f6287600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612fa857613987612fac565b6139e55b63ffffffff16565b60006130107f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eda575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b0316301461306b576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061305857fe5b602002602001015184613a4e565b6115d0565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061309f57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130d357fe5b60200260200101516130eb87600081518110610c9b57fe5b86613a7e565b600061314d7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eda575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b031630146131a3576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061319557fe5b602002602001015184613ae4565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131d757fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061320b57fe5b602002602001015161322387600081518110610c9b57fe5b86613b24565b60006132ae7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eda57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162b565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132e257fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061331657fe5b602002602001015161332e87600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461337457613b8b612fac565b613be2565b60006133d57f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eda575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b0316301461342b576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061341d57fe5b602002602001015184613c4c565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061345f57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061349357fe5b60200260200101516134ab87600081518110610c9b57fe5b86613c76565b600061350d7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eda575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b03163014613563576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061355557fe5b602002602001015184613cc5565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061359757fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106135cb57fe5b60200260200101516135e387600081518110610c9b57fe5b86613cfa565b6135f1614054565b6040517fbf2730410000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063bf273041906136369085906004016149aa565b60c06040518083038186803b15801561364e57600080fd5b505afa92505050801561367e575060408051601f3d908101601f1916820190925261367b918101906146a5565b60015b61133b573d8080156136ac576040519150601f19603f3d011682016040523d82523d6000602084013e6136b1565b606091505b506136bb81613d4e565b5061070f565b6136c96140a5565b6040517ffb2557030000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063fb2557039061370e9085906004016149aa565b60806040518083038186803b15801561372657600080fd5b505afa92505050801561367e575060408051601f3d908101601f1916820190925261367b91810190614640565b6000806137608484613dd5565b6040517fb1e017650000000000000000000000000000000000000000000000000000000081529091506001600160a01b0382169063b1e01765906137ac908790879042906004016149d8565b60206040518083038186803b1580156137c457600080fd5b505afa9250505080156137f4575060408051601f3d908101601f191682019092526137f191810190614529565b60015b613837573d808015613822576040519150601f19603f3d011682016040523d82523d6000602084013e613827565b606091505b5061383181613d4e565b50613840565b915061070f9050565b5092915050565b60008061385383613e70565b9050806001600160a01b03166325ed3d446040518163ffffffff1660e01b815260040160206040518083038186803b15801561388e57600080fd5b505afa9250505080156138be575060408051601f3d908101601f191682019092526138bb91810190614529565b60015b613901573d8080156138ec576040519150601f19603f3d011682016040523d82523d6000602084013e6138f1565b606091505b506138fb81613d4e565b5061390a565b9150610cd49050565b50919050565b600061393b7f9f11080e00000000000000000000000000000000000000000000000000000000610f58565b82148061070f575061396c7f38e9922e00000000000000000000000000000000000000000000000000000000610f58565b909114919050565b60006108e5838360016128b7565b600255565b6000806139948684611e50565b905060006139a28287611eb1565b905060006139b0868a6115e6565b905060006139cb84611ecb6139c58587613f1e565b8a613f38565b90506139d788826115e6565b9a9950505050505050505050565b6000806139f28684611e50565b90506000613a008287611eb1565b90506000613a17613a11838b613f1e565b87613f59565b90506000613a2584836115e6565b90506000613a338288613f79565b9050613a3f8a826115e6565b9b9a5050505050505050505050565b600080613a5b8484611e50565b90506000613a72613a6c8688611b61565b85611e50565b905061065e81836115e6565b600082613a9657613a8f8683611e50565b905061109e565b6000613aa28684611e50565b90506000613ab3613a6c888a611b61565b90506000613ac182846115e6565b90506000613acf8489611eb1565b90506139d7613ade8884613f1e565b82613f59565b600080613af18484611e50565b90506000613aff82876115e6565b90506000613b0d8286613f79565b9050613b1986826115e6565b979650505050505050565b600082613b3257508461109e565b6000613b3e8684611e50565b90506000613b4c8287611eb1565b90506000613b5a878a611b61565b90506000613b688483611eb1565b90506000613b7f613b798984613f1e565b85613f59565b9050613a3f81896115e6565b600082613b9957508461109e565b6000613ba58684611e50565b90506000613bb38287611eb1565b90506000613bc1868a611b61565b90506000613bd684611ecb6139c58587613f1e565b90506139d781896115e6565b600082613bf357613a8f8683613f79565b6000613bff8684611e50565b90506000613c0d8287611eb1565b90506000613c24613c1e838b613f1e565b87613f38565b90506000613c328483611b61565b90506000613c408288613f79565b9050613a3f818b6115e6565b600080613c598484611e50565b90506000613c6a613a6c86886115e6565b905061065e82826115e6565b600080613c838684611e50565b90506000613c94613a6c888a6115e6565b90506000613ca283836115e6565b90506000613cb08489611eb1565b90506139d7613cbf8884613f1e565b82613f38565b600080613cd28484611e50565b90506000613ce08287611b61565b90506000613cee8286613f79565b9050613b1981876115e6565b600080613d078684611e50565b90506000613d158287611eb1565b90506000613d23878a6115e6565b90506000613d318483611eb1565b90506000613d42613b798984613f1e565b9050613a3f88826115e6565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417613dc9578160208401fd5b506115e2610165612599565b600080613de184613e70565b6040517f48b3eabc0000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906348b3eabc90613e2b90879087906004016149be565b60206040518083038186803b158015613e4357600080fd5b505afa9250505080156137f4575060408051601f3d908101601f191682019092526137f191810190614624565b6000816001600160a01b031663bde127186040518163ffffffff1660e01b815260040160206040518083038186803b158015613eab57600080fd5b505afa925050508015613edb575060408051601f3d908101601f19168201909252613ed891810190614624565b60015b612b10573d808015613f09576040519150601f19603f3d011682016040523d82523d6000602084013e613f0e565b606091505b50613f1881613d4e565b50610cd4565b60008282026108e584158061188e57508385838161188b57fe5b6000613f47821515600461162b565b50811515600019909201046001010290565b6000613f68821515600461162b565b818381613f7157fe5b049392505050565b60008160200151831015613fc257815161133b90613fa090670de0b6b3a764000090611b61565b60208401518451613fbc91613fb59190611871565b8690611b61565b90612b74565b81604001518311613fd457508161070f565b815161133b90613fed90670de0b6b3a7640000906115e6565b60408401518451613fbc916140029190611871565b86906115e6565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040805160808101825260008082526020820181905291810182905290606082015290565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561070f81614dcd565b600082601f830112614115578081fd5b813561412861412382614da1565b614d7a565b81815291506020808301908481018184028601820187101561414957600080fd5b60005b848110156141685781358452928201929082019060010161414c565b505050505092915050565b600082601f830112614183578081fd5b815161419161412382614da1565b8181529150602080830190848101818402860182018710156141b257600080fd5b60005b84811015614168578151845292820192908201906001016141b5565b600082601f8301126141e1578081fd5b813567ffffffffffffffff8111156141f7578182fd5b61420a6020601f19601f84011601614d7a565b915080825283602082850101111561422157600080fd5b8060208401602084013760009082016020015292915050565b80356002811061070f57600080fd5b600061012080838503121561425c578182fd5b61426581614d7a565b915050614272838361423a565b815261428183602084016140fa565b602082015261429383604084016140fa565b6040820152606082013560608201526080820135608082015260a082013560a08201526142c38360c084016140fa565b60c08201526142d58360e084016140fa565b60e08201526101008083013567ffffffffffffffff8111156142f657600080fd5b614302858286016141d1565b82840152505092915050565b60006020828403121561431f578081fd5b81356108e581614dcd565b6000806040838503121561433c578081fd5b823561434781614dcd565b9150602083013561435781614dcd565b809150509250929050565b600080600060608486031215614376578081fd5b833561438181614dcd565b9250602084013561439181614dcd565b929592945050506040919091013590565b600080600080600080600060e0888a0312156143bc578485fd5b87356143c781614dcd565b965060208801356143d781614dcd565b9550604088013594506060880135935060808801356143f581614de2565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215614424578182fd5b823561442f81614dcd565b946020939093013593505050565b600080600060608486031215614451578081fd5b835167ffffffffffffffff80821115614468578283fd5b818601915086601f83011261447b578283fd5b815161448961412382614da1565b80828252602080830192508086018b8283870289010111156144a9578788fd5b8796505b848710156144d45780516144c081614dcd565b8452600196909601959281019281016144ad565b5089015190975093505050808211156144eb578283fd5b506144f886828701614173565b925050604084015190509250925092565b60006020828403121561451a578081fd5b815180151581146108e5578182fd5b60006020828403121561453a578081fd5b5051919050565b600080600080600080600060e0888a03121561455b578081fd5b87359650602088013561456d81614dcd565b9550604088013561457d81614dcd565b9450606088013567ffffffffffffffff80821115614599578283fd5b6145a58b838c01614105565b955060808a0135945060a08a0135935060c08a01359150808211156145c8578283fd5b506145d58a828b016141d1565b91505092959891949750929550565b6000602082840312156145f5578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e5578182fd5b600060208284031215614635578081fd5b81516108e581614dcd565b600060808284031215614651578081fd5b61465b6080614d7a565b8251815260208301516020820152604083015167ffffffffffffffff81168114614683578283fd5b6040820152606083015160038110614699578283fd5b60608201529392505050565b600060c082840312156146b6578081fd5b6146c060c0614d7a565b82516146cb81614dcd565b815260208301516146db81614dcd565b602082015260408301516146ee81614dcd565b80604083015250606083015160608201526080830151608082015260a083015160a08201528091505092915050565b60008060008060808587031215614732578182fd5b843567ffffffffffffffff80821115614749578384fd5b61475588838901614249565b9550602087013591508082111561476a578384fd5b5061477787828801614105565b949794965050505060408301359260600135919050565b6000806000606084860312156147a2578081fd5b833567ffffffffffffffff8111156147b8578182fd5b6147c486828701614249565b9660208601359650604090950135949350505050565b6000602082840312156147eb578081fd5b5035919050565b60008060408385031215614804578182fd5b50508035926020909101359150565b60008060008060808587031215614828578182fd5b845193506020850151925060408501519150606085015161484881614dcd565b939692955090935050565b600060208284031215614864578081fd5b81516108e581614de2565b60008060408385031215614881578182fd5b825161488c81614de2565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156148d8578151875295820195908201906001016148bc565b509495945050505050565b15159052565b60008151808452815b8181101561490e576020818501810151868301820152016148f2565b8181111561491f5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b602080825282518282018190526000919060409081850190868401855b82811015614a86578151805160048110614a2f57fe5b855280870151614a418887018261489c565b508581015186860152606080820151614a5c8288018261489c565b505060809081015190614a718682018361489c565b505060a0939093019290850190600101614a19565b5091979650505050505050565b6000602082526108e560208301846148a9565b600060408252614ab960408301856148a9565b828103602084015261109e81856148a9565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b80831015614b8757614b718451614dc1565b8252928401926001929092019190840190614b5f565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a0870152614bc581856148a9565b935050506040850151818584030160c0860152614be283826148e9565b925050506060840151614bf860e08501826148e3565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b81811015614c7f57614c6d8551614dc1565b83529383019391830191600101614c5b565b505084810360408601528551808252908201925081860190845b818110156124cc57614cab8351614dc1565b85529383019391830191600101614c99565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6020810160038310614d2c57fe5b91905290565b6000602082526108e560208301846148e9565b6000838252604060208301526115d060408301846148a9565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715614d9957600080fd5b604052919050565b600067ffffffffffffffff821115614db7578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146119cf57600080fd5b60ff811681146119cf57600080fdfea26469706673582212203ac34546f9aeae30b98c4febf2eaa8b86e91697319bee5c4bf4ccc0bfe38b84964736f6c63430007010033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c80636634b753116200009957806376895be7116200006f57806376895be714620001cd578063851c1bb314620001e45780638d928af8146200020a578063aaabadc5146200021457620000ff565b80636634b75314620001935780636c57f5a914620001b9578063739238d614620001c357620000ff565b80632f2770db11620000db5780632f2770db146200015a5780633f819b6f146200016657806354fd4d5014620001705780635ed31282146200017a57620000ff565b8062c194db1462000104578063174481fa14620001265780632da47c401462000140575b600080fd5b6200010e6200021e565b6040516200011d91906200145b565b60405180910390f35b620001306200023f565b6040516200011d929190620013f4565b6200014a62000285565b6040516200011d92919062001684565b620001646200030e565b005b6200010e62000378565b6200010e62000430565b62000184620004b2565b6040516200011d9190620013d3565b620001aa620001a43660046200114f565b620004ce565b6040516200011d91906200141b565b620001aa620004f9565b6200018462000502565b62000184620001de366004620011f8565b62000526565b620001fb620001f536600462001197565b620008f0565b6040516200011d919062001426565b6200018462000944565b6200018462000968565b60606200023a6040518060200160405280600081525062000a56565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200030057807f00000000000000000000000000000000000000000000000000000000000000000392507f0000000000000000000000000000000000000000000000000000000000000000915062000309565b60009250600091505b509091565b6200031862000b31565b6200032262000b80565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b820191906000526020600020905b8154815290600101906020018083116200040857829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006200053262000b99565b6004805460018101909155604051606090620005516020820162000fe3565b601f1982820381018352601f909101166040526200056e62000944565b7f00000000000000000000000000000000000000000000000000000000000000008b604051602001620005a49392919062001470565b60408051601f1981840301815290829052620005c49291602001620013a0565b60405160208183030381529060405290506000620005ea83838051906020012062000bb4565b9050600080620005f962000285565b915091506200060762000ff1565b6200061162000944565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508f81602001819052508e81604001819052508d816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508c816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b8160c00181815250508a8160e0018181525050828161010001818152505081816101200181815250508981610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506200076f62000378565b610160820152604051600090620007a690620007909084906020016200157c565b6040516020818303038152906040528a62000bcc565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620007f157600080fd5b505af115801562000806573d6000803e3d6000fd5b5050505060006200081a6000898962000c23565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146200088d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000884906200150e565b60405180910390fd5b6040518b9073ffffffffffffffffffffffffffffffffffffffff8416907f33ff149e9e224f85522bd94ff587bd54aaf8aa5a16fd924ff001375d729cad2990600090a3509650505050505050620008e362000d01565b9998505050505050505050565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016200092792919062001370565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006200097462000944565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620009ba57600080fd5b505afa158015620009cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023a9190620011d9565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000a5073ffffffffffffffffffffffffffffffffffffffff831615156101ac62000d08565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000b2381838662000d1d565b505050505050505050919050565b600062000b626000357fffffffff0000000000000000000000000000000000000000000000000000000016620008f0565b905062000b7d62000b74823362000d7b565b61019162000d08565b50565b62000b9762000b8e620004f9565b1560d362000d08565b565b62000bad6002600354141561019062000d08565b6002600355565b600062000bc383833062000e19565b90505b92915050565b60008062000bdb848462000e5a565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316179055949350505050565b6000808447101562000c63576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088490620014a0565b825162000c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008849062001545565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200088490620014d7565b949350505050565b6001600355565b8162000d195762000d198162000ef7565b5050565b5b6020811062000d3f578151835260209283019290910190601f190162000d1e565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000d8762000968565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000dc5939291906200142f565b60206040518083038186803b15801562000dde57600080fd5b505afa15801562000df3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bc3919062001175565b60008060ff60f81b83868660405160200162000e3994939291906200130c565b60408051808303601f19018152919052805160209091012095945050505050565b600062000e6662000b80565b600062000e74848462000f23565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a29392505050565b62000b7d817f42414c000000000000000000000000000000000000000000000000000000000062000f68565b6000606062000f328462000a56565b90506000838251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf9573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6124f880620016e983390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b803562000bc681620016c5565b600082601f830112620010de578081fd5b813567ffffffffffffffff80821115620010f6578283fd5b6040516020601f19601f850116820101818110838211171562001117578485fd5b6040528281529250828483016020018610156200113357600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121562001161578081fd5b81356200116e81620016c5565b9392505050565b60006020828403121562001187578081fd5b815180151581146200116e578182fd5b600060208284031215620011a9578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146200116e578182fd5b600060208284031215620011eb578081fd5b81516200116e81620016c5565b60008060008060008060008060006101208a8c03121562001217578485fd5b893567ffffffffffffffff808211156200122f578687fd5b6200123d8d838e01620010cd565b9a5060208c013591508082111562001253578687fd5b50620012628c828d01620010cd565b98505060408a01356200127581620016c5565b965060608a01356200128781620016c5565b955060808a0135945060a08a01359350620012a68b60c08c01620010c0565b925060e08a013591506101008a013590509295985092959850929598565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620012f881602086016020860162001692565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60008351620013b481846020880162001692565b835190830190620013ca81836020880162001692565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000bc36020830184620012de565b73ffffffffffffffffffffffffffffffffffffffff93841681529183166020830152909116604082015260600190565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b60006020825262001592602083018451620012c4565b6020830151610180806040850152620015b06101a0850183620012de565b91506040850151601f1980868503016060870152620015d08483620012de565b935060608701519150620015e86080870183620012c4565b60808701519150620015fe60a0870183620012c4565b60a087015191506200161460c0870183620012c4565b60c087015160e08781019190915287015161010080880191909152870151610120808801919091528701516101408088019190915287015191506101606200165f81880184620012c4565b8701518685039091018387015290506200167a8382620012de565b9695505050505050565b918252602082015260400190565b60005b83811015620016af57818101518382015260200162001695565b83811115620016bf576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000b7d57600080fdfe6101606040523480156200001257600080fd5b50604051620024f8380380620024f883398101604081905262000035916200051c565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000432565b8383826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000125919081019062000458565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000503565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000503565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000432565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000432565b606090811b6001600160601b031990811660e05292811b8316610120521b166101405250600080546001600160a01b0319166001600160a01b0383811691909117918290556040805163eb3beb2960e01b81529051929091169163eb3beb2991600480820192602092909190829003018186803b158015620003cd57600080fd5b505afa158015620003e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000408919062000432565b600180546001600160a01b0319166001600160a01b039290921691909117905550620005af915050565b60006020828403121562000444578081fd5b8151620004518162000596565b9392505050565b600060208083850312156200046b578182fd5b82516001600160401b038082111562000482578384fd5b818501915085601f83011262000496578384fd5b815181811115620004a5578485fd5b8381029150620004b78483016200056f565b8181528481019084860184860187018a1015620004d2578788fd5b8795505b83861015620004f6578051835260019590950194918601918601620004d6565b5098975050505050505050565b60006020828403121562000515578081fd5b5051919050565b60008060006060848603121562000531578182fd5b83516200053e8162000596565b6020850151909350620005518162000596565b6040850151909250620005648162000596565b809150509250925092565b6040518181016001600160401b03811182821017156200058e57600080fd5b604052919050565b6001600160a01b0381168114620005ac57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c611e66620006926000398061049f52806107765250806101285280610b355280610e5a5280610eaf52508061037c52508061041c528061052f52806106c4528061084152508060dd528061017852806103ed528061056252806105ba528061064e52806106f352806108065280610bb85280610c1f5280610f1d5280610f5c5280610fc652508061015752806103bf528061069652806109c55280610a8a5280610d095280610dce525080609952806102d35250611e666000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611be5565b60405180910390f35b6100776100723660046119b7565b6100bb565b60405161005b9190611db5565b6100776100923660046119d3565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610117565b90505b919050565b60006101056001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085610241565b61010e83610117565b90505b92915050565b6000806101226102cc565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101b4929190611d06565b60806040518083038186803b1580156101cc57600080fd5b505afa1580156101e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102049190611b52565b5050509050818110156102265761021d818303856103a8565b925050506100c9565b8181111561023a5761021d8282038561067f565b5050919050565b6102c6846323b872dd60e01b85858560405160240161026293929190611c13565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610866565b50505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561032957600080fd5b505afa15801561033d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103619190611b2f565b91509150600060028284018161037357fe5b0490506103a0817f0000000000000000000000000000000000000000000000000000000000000000610906565b935050505090565b60006103b26118a8565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815260200185815260200160405180602001604052806000815250815250905061046c6118f1565b6040517fe969f6b30000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906104d69086908690600401611d1d565b602060405180830381600087803b1580156104f057600080fd5b505af1158015610504573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105289190611b17565b90506105547f000000000000000000000000000000000000000000000000000000000000000082610959565b61055d81610ba3565b6105877f000000000000000000000000000000000000000000000000000000000000000087610c9d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906105ef903090600401611be5565b60206040518083038186803b15801561060757600080fd5b505afa15801561061b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063f9190611b17565b90506106756001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168783610ee4565b9695505050505050565b60006106896118a8565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020018581526020016040518060200160405280600081525081525090506107436118f1565b6040517fe969f6b30000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906107ad9086908690600401611d1d565b602060405180830381600087803b1580156107c757600080fd5b505af11580156107db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ff9190611b17565b905061082b7f000000000000000000000000000000000000000000000000000000000000000087610959565b61083c61083782610f08565b610f4b565b6105877f000000000000000000000000000000000000000000000000000000000000000082610c9d565b60006060836001600160a01b0316836040516108829190611bc9565b6000604051808303816000865af19150503d80600081146108bf576040519150601f19603f3d011682016040523d82523d6000602084013e6108c4565b606091505b509150915060008214156108dc573d6000803e3d6000fd5b6102c68151600014806108fe5750818060200190518101906108fe91906119fe565b6101a2611044565b60006109158215156004611044565b670de0b6b3a764000083026109478415806109405750670de0b6b3a764000085838161093d57fe5b04145b6005611044565b82818161095057fe5b04949350505050565b6040805160028082526060828101909352816020015b610977611918565b81526020019060019003908161096f57905050905060008160008151811061099b57fe5b60200260200101516000019060028111156109b257fe5b908160028111156109bf57fe5b815250507f0000000000000000000000000000000000000000000000000000000000000000816000815181106109f157fe5b602002602001015160200181815250508181600081518110610a0f57fe5b602002602001015160600181815250508281600081518110610a2d57fe5b6020026020010151604001906001600160a01b031690816001600160a01b031681525050600281600181518110610a6057fe5b6020026020010151600001906002811115610a7757fe5b90816002811115610a8457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ab657fe5b60200260200101516020018181525050600081600181518110610ad557fe5b602002602001015160600181815250508281600181518110610af357fe5b60209081029190910101516001600160a01b03918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610b6c908490600401611c8f565b600060405180830381600087803b158015610b8657600080fd5b505af1158015610b9a573d6000803e3d6000fd5b50505050505050565b600154600090610bdd906001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000084611056565b6001546040517fead5d3590000000000000000000000000000000000000000000000000000000081529192506001600160a01b03169063ead5d35990610c4c907f0000000000000000000000000000000000000000000000000000000000000000908590600090600401611c6c565b6040805180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102c69190611b2f565b6040805160028082526060828101909352816020015b610cbb611918565b815260200190600190039081610cb3579050509050600281600081518110610cdf57fe5b6020026020010151600001906002811115610cf657fe5b90816002811115610d0357fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610d3557fe5b602002602001015160200181815250508181600081518110610d5357fe5b602002602001015160600181815250508281600081518110610d7157fe5b6020026020010151604001906001600160a01b031690816001600160a01b031681525050600181600181518110610da457fe5b6020026020010151600001906002811115610dbb57fe5b90816002811115610dc857fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610dfa57fe5b602002602001015160200181815250508181600181518110610e1857fe5b602002602001015160600181815250508281600181518110610e3657fe5b60209081029190910101516001600160a01b03918216604090910152610e7f9084167f00000000000000000000000000000000000000000000000000000000000000008461107a565b6040517fe6c460920000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610b6c908490600401611c8f565b610f038363a9059cbb60e01b8484604051602401610262929190611c53565b505050565b600154600090610f42906001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000084611056565b60010192915050565b600154610f85906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691168361107a565b6001546040517f3edd11280000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690633edd112890610ff3907f0000000000000000000000000000000000000000000000000000000000000000908590600090600401611c6c565b6040805180830381600087803b15801561100c57600080fd5b505af1158015611020573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f039190611b2f565b816110525761105281611162565b5050565b600080611063858561118f565b905061106f83826112e3565b9150505b9392505050565b801580159061111e57506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063dd62ed3e906110cb9030908690600401611bf9565b60206040518083038186803b1580156110e357600080fd5b505afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b9190611b17565b15155b15611143576111438363095ea7b360e01b846000604051602401610262929190611c37565b610f038363095ea7b360e01b8484604051602401610262929190611c53565b61118c817f42414c0000000000000000000000000000000000000000000000000000000000611316565b50565b6000611199611941565b6111a38484611391565b90506111ad611992565b6111b78585611470565b90506000816040015167ffffffffffffffff169050600083606001519050600084600001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561121457600080fd5b505afa158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190611b17565b90504283146112cd5760006112618989611502565b9050600061126e8a6115f6565b90506000866020015190506000806000611295868c60a001516112e390919063ffffffff16565b9050670de0b6b3a76400008582020492508383850110156112b557831992505b82810391506112c488836116bf565b97505050505050505b6112d78282610906565b98975050505050505050565b60008282026113078415806113005750838583816112fd57fe5b04145b6003611044565b670de0b6b3a764000081610950565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611399611941565b6040517fbf2730410000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063bf273041906113de908590600401611be5565b60c06040518083038186803b1580156113f657600080fd5b505afa925050508015611426575060408051601f3d908101601f1916820190925261142391810190611a9f565b60015b611469573d808015611454576040519150601f19603f3d011682016040523d82523d6000602084013e611459565b606091505b50611463816116d1565b50610111565b9050610111565b611478611992565b6040517ffb2557030000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063fb255703906114bd908590600401611be5565b60806040518083038186803b1580156114d557600080fd5b505afa925050508015611426575060408051601f3d908101601f1916820190925261142391810190611a3a565b60008061150f8484611758565b6040517fb1e017650000000000000000000000000000000000000000000000000000000081529091506001600160a01b0382169063b1e017659061155b90879087904290600401611c13565b60206040518083038186803b15801561157357600080fd5b505afa9250505080156115a3575060408051601f3d908101601f191682019092526115a091810190611b17565b60015b6115e6573d8080156115d1576040519150601f19603f3d011682016040523d82523d6000602084013e6115d6565b606091505b506115e0816116d1565b506115ef565b91506101119050565b5092915050565b600080611602836117f3565b9050806001600160a01b03166325ed3d446040518163ffffffff1660e01b815260040160206040518083038186803b15801561163d57600080fd5b505afa92505050801561166d575060408051601f3d908101601f1916820190925261166a91810190611b17565b60015b6116b0573d80801561169b576040519150601f19603f3d011682016040523d82523d6000602084013e6116a0565b606091505b506116aa816116d1565b506116b9565b91506100c99050565b50919050565b600082820161010e8482101583611044565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc120000000000000000000000000000000000000000000000000000000082141761174c578160208401fd5b50611052610165611162565b600080611764846117f3565b6040517f48b3eabc0000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906348b3eabc906117ae9087908790600401611bf9565b60206040518083038186803b1580156117c657600080fd5b505afa9250505080156115a3575060408051601f3d908101601f191682019092526115a091810190611a1e565b6000816001600160a01b031663bde127186040518163ffffffff1660e01b815260040160206040518083038186803b15801561182e57600080fd5b505afa92505050801561185e575060408051601f3d908101601f1916820190925261185b91810190611a1e565b60015b6118a1573d80801561188c576040519150601f19603f3d011682016040523d82523d6000602084013e611891565b606091505b5061189b816116d1565b506100c9565b90506100c9565b6040805160c0810190915260008082526020820190815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040805160808101825260008082526020820181905291810182905290606082015290565b6000602082840312156119c8578081fd5b813561010e81611e1b565b600080604083850312156119e5578081fd5b82356119f081611e1b565b946020939093013593505050565b600060208284031215611a0f578081fd5b8151801515811461010e578182fd5b600060208284031215611a2f578081fd5b815161010e81611e1b565b600060808284031215611a4b578081fd5b611a556080611dbe565b8251815260208301516020820152604083015167ffffffffffffffff81168114611a7d578283fd5b6040820152606083015160038110611a93578283fd5b60608201529392505050565b600060c08284031215611ab0578081fd5b611aba60c0611dbe565b8251611ac581611e1b565b81526020830151611ad581611e1b565b60208201526040830151611ae881611e1b565b80604083015250606083015160608201526080830151608082015260a083015160a08201528091505092915050565b600060208284031215611b28578081fd5b5051919050565b60008060408385031215611b41578182fd5b505080516020909101519092909150565b60008060008060808587031215611b67578182fd5b8451935060208501519250604085015191506060850151611b8781611e1b565b939692955090935050565b6001600160a01b03808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b60008251611bdb818460208701611de5565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0392909216825260ff16602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b602080825282518282018190526000919060409081850190868401855b82811015611cf9578151805160038110611cc257fe5b85528087015187860152858101516001600160a01b0316868601526060908101519085015260809093019290850190600101611cac565b5091979650505050505050565b9182526001600160a01b0316602082015260400190565b600060a08252835160a08301526020840151611d3881611e11565b8060c08401525060408401516001600160a01b0380821660e0850152806060870151166101008501525050608084015161012083015260a084015160c0610140840152805180610160850152610180611d978282870160208601611de5565b80601f19601f84011686010193505050506110736020830184611b92565b90815260200190565b60405181810167ffffffffffffffff81118282101715611ddd57600080fd5b604052919050565b60005b83811015611e00578181015183820152602001611de8565b838111156102c65750506000910152565b6002811061118c57fe5b6001600160a01b038116811461118c57600080fdfea264697066735822122090e565ce6d4b10ae5de465aaed55049ecc172eb4d46de92acd33f0a9fb4cf84164736f6c63430007010033a26469706673582212202e19ad4b0508de4bb0566bc0ffa96e895051b33ec01d3bed5b1f4f40656634e864736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/artifact/SiloLinearPoolRebalancer.json b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/artifact/SiloLinearPoolRebalancer.json new file mode 100644 index 0000000..a3173dd --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/artifact/SiloLinearPoolRebalancer.json @@ -0,0 +1,88 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SiloLinearPoolRebalancer", + "sourceName": "contracts/silo-linear-pool/SiloLinearPoolRebalancer.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IBalancerQueries", + "name": "queries", + "type": "address" + }, + { + "internalType": "address", + "name": "wrappedToken", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "getPool", + "outputs": [ + { + "internalType": "contract ILinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "rebalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "extraMain", + "type": "uint256" + } + ], + "name": "rebalanceWithExtraMain", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101606040523480156200001257600080fd5b50604051620024f8380380620024f883398101604081905262000035916200051c565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000432565b8383826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000125919081019062000458565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000503565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000503565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000432565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000432565b606090811b6001600160601b031990811660e05292811b8316610120521b166101405250600080546001600160a01b0319166001600160a01b0383811691909117918290556040805163eb3beb2960e01b81529051929091169163eb3beb2991600480820192602092909190829003018186803b158015620003cd57600080fd5b505afa158015620003e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000408919062000432565b600180546001600160a01b0319166001600160a01b039290921691909117905550620005af915050565b60006020828403121562000444578081fd5b8151620004518162000596565b9392505050565b600060208083850312156200046b578182fd5b82516001600160401b038082111562000482578384fd5b818501915085601f83011262000496578384fd5b815181811115620004a5578485fd5b8381029150620004b78483016200056f565b8181528481019084860184860187018a1015620004d2578788fd5b8795505b83861015620004f6578051835260019590950194918601918601620004d6565b5098975050505050505050565b60006020828403121562000515578081fd5b5051919050565b60008060006060848603121562000531578182fd5b83516200053e8162000596565b6020850151909350620005518162000596565b6040850151909250620005648162000596565b809150509250925092565b6040518181016001600160401b03811182821017156200058e57600080fd5b604052919050565b6001600160a01b0381168114620005ac57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c611e66620006926000398061049f52806107765250806101285280610b355280610e5a5280610eaf52508061037c52508061041c528061052f52806106c4528061084152508060dd528061017852806103ed528061056252806105ba528061064e52806106f352806108065280610bb85280610c1f5280610f1d5280610f5c5280610fc652508061015752806103bf528061069652806109c55280610a8a5280610d095280610dce525080609952806102d35250611e666000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611be5565b60405180910390f35b6100776100723660046119b7565b6100bb565b60405161005b9190611db5565b6100776100923660046119d3565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610117565b90505b919050565b60006101056001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085610241565b61010e83610117565b90505b92915050565b6000806101226102cc565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101b4929190611d06565b60806040518083038186803b1580156101cc57600080fd5b505afa1580156101e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102049190611b52565b5050509050818110156102265761021d818303856103a8565b925050506100c9565b8181111561023a5761021d8282038561067f565b5050919050565b6102c6846323b872dd60e01b85858560405160240161026293929190611c13565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610866565b50505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561032957600080fd5b505afa15801561033d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103619190611b2f565b91509150600060028284018161037357fe5b0490506103a0817f0000000000000000000000000000000000000000000000000000000000000000610906565b935050505090565b60006103b26118a8565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815260200185815260200160405180602001604052806000815250815250905061046c6118f1565b6040517fe969f6b30000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906104d69086908690600401611d1d565b602060405180830381600087803b1580156104f057600080fd5b505af1158015610504573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105289190611b17565b90506105547f000000000000000000000000000000000000000000000000000000000000000082610959565b61055d81610ba3565b6105877f000000000000000000000000000000000000000000000000000000000000000087610c9d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906105ef903090600401611be5565b60206040518083038186803b15801561060757600080fd5b505afa15801561061b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063f9190611b17565b90506106756001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168783610ee4565b9695505050505050565b60006106896118a8565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020018581526020016040518060200160405280600081525081525090506107436118f1565b6040517fe969f6b30000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906107ad9086908690600401611d1d565b602060405180830381600087803b1580156107c757600080fd5b505af11580156107db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ff9190611b17565b905061082b7f000000000000000000000000000000000000000000000000000000000000000087610959565b61083c61083782610f08565b610f4b565b6105877f000000000000000000000000000000000000000000000000000000000000000082610c9d565b60006060836001600160a01b0316836040516108829190611bc9565b6000604051808303816000865af19150503d80600081146108bf576040519150601f19603f3d011682016040523d82523d6000602084013e6108c4565b606091505b509150915060008214156108dc573d6000803e3d6000fd5b6102c68151600014806108fe5750818060200190518101906108fe91906119fe565b6101a2611044565b60006109158215156004611044565b670de0b6b3a764000083026109478415806109405750670de0b6b3a764000085838161093d57fe5b04145b6005611044565b82818161095057fe5b04949350505050565b6040805160028082526060828101909352816020015b610977611918565b81526020019060019003908161096f57905050905060008160008151811061099b57fe5b60200260200101516000019060028111156109b257fe5b908160028111156109bf57fe5b815250507f0000000000000000000000000000000000000000000000000000000000000000816000815181106109f157fe5b602002602001015160200181815250508181600081518110610a0f57fe5b602002602001015160600181815250508281600081518110610a2d57fe5b6020026020010151604001906001600160a01b031690816001600160a01b031681525050600281600181518110610a6057fe5b6020026020010151600001906002811115610a7757fe5b90816002811115610a8457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ab657fe5b60200260200101516020018181525050600081600181518110610ad557fe5b602002602001015160600181815250508281600181518110610af357fe5b60209081029190910101516001600160a01b03918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610b6c908490600401611c8f565b600060405180830381600087803b158015610b8657600080fd5b505af1158015610b9a573d6000803e3d6000fd5b50505050505050565b600154600090610bdd906001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000084611056565b6001546040517fead5d3590000000000000000000000000000000000000000000000000000000081529192506001600160a01b03169063ead5d35990610c4c907f0000000000000000000000000000000000000000000000000000000000000000908590600090600401611c6c565b6040805180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102c69190611b2f565b6040805160028082526060828101909352816020015b610cbb611918565b815260200190600190039081610cb3579050509050600281600081518110610cdf57fe5b6020026020010151600001906002811115610cf657fe5b90816002811115610d0357fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610d3557fe5b602002602001015160200181815250508181600081518110610d5357fe5b602002602001015160600181815250508281600081518110610d7157fe5b6020026020010151604001906001600160a01b031690816001600160a01b031681525050600181600181518110610da457fe5b6020026020010151600001906002811115610dbb57fe5b90816002811115610dc857fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610dfa57fe5b602002602001015160200181815250508181600181518110610e1857fe5b602002602001015160600181815250508281600181518110610e3657fe5b60209081029190910101516001600160a01b03918216604090910152610e7f9084167f00000000000000000000000000000000000000000000000000000000000000008461107a565b6040517fe6c460920000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610b6c908490600401611c8f565b610f038363a9059cbb60e01b8484604051602401610262929190611c53565b505050565b600154600090610f42906001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000084611056565b60010192915050565b600154610f85906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691168361107a565b6001546040517f3edd11280000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690633edd112890610ff3907f0000000000000000000000000000000000000000000000000000000000000000908590600090600401611c6c565b6040805180830381600087803b15801561100c57600080fd5b505af1158015611020573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f039190611b2f565b816110525761105281611162565b5050565b600080611063858561118f565b905061106f83826112e3565b9150505b9392505050565b801580159061111e57506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063dd62ed3e906110cb9030908690600401611bf9565b60206040518083038186803b1580156110e357600080fd5b505afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b9190611b17565b15155b15611143576111438363095ea7b360e01b846000604051602401610262929190611c37565b610f038363095ea7b360e01b8484604051602401610262929190611c53565b61118c817f42414c0000000000000000000000000000000000000000000000000000000000611316565b50565b6000611199611941565b6111a38484611391565b90506111ad611992565b6111b78585611470565b90506000816040015167ffffffffffffffff169050600083606001519050600084600001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561121457600080fd5b505afa158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190611b17565b90504283146112cd5760006112618989611502565b9050600061126e8a6115f6565b90506000866020015190506000806000611295868c60a001516112e390919063ffffffff16565b9050670de0b6b3a76400008582020492508383850110156112b557831992505b82810391506112c488836116bf565b97505050505050505b6112d78282610906565b98975050505050505050565b60008282026113078415806113005750838583816112fd57fe5b04145b6003611044565b670de0b6b3a764000081610950565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611399611941565b6040517fbf2730410000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063bf273041906113de908590600401611be5565b60c06040518083038186803b1580156113f657600080fd5b505afa925050508015611426575060408051601f3d908101601f1916820190925261142391810190611a9f565b60015b611469573d808015611454576040519150601f19603f3d011682016040523d82523d6000602084013e611459565b606091505b50611463816116d1565b50610111565b9050610111565b611478611992565b6040517ffb2557030000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063fb255703906114bd908590600401611be5565b60806040518083038186803b1580156114d557600080fd5b505afa925050508015611426575060408051601f3d908101601f1916820190925261142391810190611a3a565b60008061150f8484611758565b6040517fb1e017650000000000000000000000000000000000000000000000000000000081529091506001600160a01b0382169063b1e017659061155b90879087904290600401611c13565b60206040518083038186803b15801561157357600080fd5b505afa9250505080156115a3575060408051601f3d908101601f191682019092526115a091810190611b17565b60015b6115e6573d8080156115d1576040519150601f19603f3d011682016040523d82523d6000602084013e6115d6565b606091505b506115e0816116d1565b506115ef565b91506101119050565b5092915050565b600080611602836117f3565b9050806001600160a01b03166325ed3d446040518163ffffffff1660e01b815260040160206040518083038186803b15801561163d57600080fd5b505afa92505050801561166d575060408051601f3d908101601f1916820190925261166a91810190611b17565b60015b6116b0573d80801561169b576040519150601f19603f3d011682016040523d82523d6000602084013e6116a0565b606091505b506116aa816116d1565b506116b9565b91506100c99050565b50919050565b600082820161010e8482101583611044565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc120000000000000000000000000000000000000000000000000000000082141761174c578160208401fd5b50611052610165611162565b600080611764846117f3565b6040517f48b3eabc0000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906348b3eabc906117ae9087908790600401611bf9565b60206040518083038186803b1580156117c657600080fd5b505afa9250505080156115a3575060408051601f3d908101601f191682019092526115a091810190611a1e565b6000816001600160a01b031663bde127186040518163ffffffff1660e01b815260040160206040518083038186803b15801561182e57600080fd5b505afa92505050801561185e575060408051601f3d908101601f1916820190925261185b91810190611a1e565b60015b6118a1573d80801561188c576040519150601f19603f3d011682016040523d82523d6000602084013e611891565b606091505b5061189b816116d1565b506100c9565b90506100c9565b6040805160c0810190915260008082526020820190815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040805160808101825260008082526020820181905291810182905290606082015290565b6000602082840312156119c8578081fd5b813561010e81611e1b565b600080604083850312156119e5578081fd5b82356119f081611e1b565b946020939093013593505050565b600060208284031215611a0f578081fd5b8151801515811461010e578182fd5b600060208284031215611a2f578081fd5b815161010e81611e1b565b600060808284031215611a4b578081fd5b611a556080611dbe565b8251815260208301516020820152604083015167ffffffffffffffff81168114611a7d578283fd5b6040820152606083015160038110611a93578283fd5b60608201529392505050565b600060c08284031215611ab0578081fd5b611aba60c0611dbe565b8251611ac581611e1b565b81526020830151611ad581611e1b565b60208201526040830151611ae881611e1b565b80604083015250606083015160608201526080830151608082015260a083015160a08201528091505092915050565b600060208284031215611b28578081fd5b5051919050565b60008060408385031215611b41578182fd5b505080516020909101519092909150565b60008060008060808587031215611b67578182fd5b8451935060208501519250604085015191506060850151611b8781611e1b565b939692955090935050565b6001600160a01b03808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b60008251611bdb818460208701611de5565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0392909216825260ff16602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b602080825282518282018190526000919060409081850190868401855b82811015611cf9578151805160038110611cc257fe5b85528087015187860152858101516001600160a01b0316868601526060908101519085015260809093019290850190600101611cac565b5091979650505050505050565b9182526001600160a01b0316602082015260400190565b600060a08252835160a08301526020840151611d3881611e11565b8060c08401525060408401516001600160a01b0380821660e0850152806060870151166101008501525050608084015161012083015260a084015160c0610140840152805180610160850152610180611d978282870160208601611de5565b80601f19601f84011686010193505050506110736020830184611b92565b90815260200190565b60405181810167ffffffffffffffff81118282101715611ddd57600080fd5b604052919050565b60005b83811015611e00578181015183820152602001611de8565b838111156102c65750506000910152565b6002811061118c57fe5b6001600160a01b038116811461118c57600080fdfea264697066735822122090e565ce6d4b10ae5de465aaed55049ecc172eb4d46de92acd33f0a9fb4cf84164736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611be5565b60405180910390f35b6100776100723660046119b7565b6100bb565b60405161005b9190611db5565b6100776100923660046119d3565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610117565b90505b919050565b60006101056001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085610241565b61010e83610117565b90505b92915050565b6000806101226102cc565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101b4929190611d06565b60806040518083038186803b1580156101cc57600080fd5b505afa1580156101e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102049190611b52565b5050509050818110156102265761021d818303856103a8565b925050506100c9565b8181111561023a5761021d8282038561067f565b5050919050565b6102c6846323b872dd60e01b85858560405160240161026293929190611c13565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610866565b50505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561032957600080fd5b505afa15801561033d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103619190611b2f565b91509150600060028284018161037357fe5b0490506103a0817f0000000000000000000000000000000000000000000000000000000000000000610906565b935050505090565b60006103b26118a8565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815260200185815260200160405180602001604052806000815250815250905061046c6118f1565b6040517fe969f6b30000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906104d69086908690600401611d1d565b602060405180830381600087803b1580156104f057600080fd5b505af1158015610504573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105289190611b17565b90506105547f000000000000000000000000000000000000000000000000000000000000000082610959565b61055d81610ba3565b6105877f000000000000000000000000000000000000000000000000000000000000000087610c9d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906105ef903090600401611be5565b60206040518083038186803b15801561060757600080fd5b505afa15801561061b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063f9190611b17565b90506106756001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168783610ee4565b9695505050505050565b60006106896118a8565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020018581526020016040518060200160405280600081525081525090506107436118f1565b6040517fe969f6b30000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906107ad9086908690600401611d1d565b602060405180830381600087803b1580156107c757600080fd5b505af11580156107db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ff9190611b17565b905061082b7f000000000000000000000000000000000000000000000000000000000000000087610959565b61083c61083782610f08565b610f4b565b6105877f000000000000000000000000000000000000000000000000000000000000000082610c9d565b60006060836001600160a01b0316836040516108829190611bc9565b6000604051808303816000865af19150503d80600081146108bf576040519150601f19603f3d011682016040523d82523d6000602084013e6108c4565b606091505b509150915060008214156108dc573d6000803e3d6000fd5b6102c68151600014806108fe5750818060200190518101906108fe91906119fe565b6101a2611044565b60006109158215156004611044565b670de0b6b3a764000083026109478415806109405750670de0b6b3a764000085838161093d57fe5b04145b6005611044565b82818161095057fe5b04949350505050565b6040805160028082526060828101909352816020015b610977611918565b81526020019060019003908161096f57905050905060008160008151811061099b57fe5b60200260200101516000019060028111156109b257fe5b908160028111156109bf57fe5b815250507f0000000000000000000000000000000000000000000000000000000000000000816000815181106109f157fe5b602002602001015160200181815250508181600081518110610a0f57fe5b602002602001015160600181815250508281600081518110610a2d57fe5b6020026020010151604001906001600160a01b031690816001600160a01b031681525050600281600181518110610a6057fe5b6020026020010151600001906002811115610a7757fe5b90816002811115610a8457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ab657fe5b60200260200101516020018181525050600081600181518110610ad557fe5b602002602001015160600181815250508281600181518110610af357fe5b60209081029190910101516001600160a01b03918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610b6c908490600401611c8f565b600060405180830381600087803b158015610b8657600080fd5b505af1158015610b9a573d6000803e3d6000fd5b50505050505050565b600154600090610bdd906001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000084611056565b6001546040517fead5d3590000000000000000000000000000000000000000000000000000000081529192506001600160a01b03169063ead5d35990610c4c907f0000000000000000000000000000000000000000000000000000000000000000908590600090600401611c6c565b6040805180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102c69190611b2f565b6040805160028082526060828101909352816020015b610cbb611918565b815260200190600190039081610cb3579050509050600281600081518110610cdf57fe5b6020026020010151600001906002811115610cf657fe5b90816002811115610d0357fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610d3557fe5b602002602001015160200181815250508181600081518110610d5357fe5b602002602001015160600181815250508281600081518110610d7157fe5b6020026020010151604001906001600160a01b031690816001600160a01b031681525050600181600181518110610da457fe5b6020026020010151600001906002811115610dbb57fe5b90816002811115610dc857fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610dfa57fe5b602002602001015160200181815250508181600181518110610e1857fe5b602002602001015160600181815250508281600181518110610e3657fe5b60209081029190910101516001600160a01b03918216604090910152610e7f9084167f00000000000000000000000000000000000000000000000000000000000000008461107a565b6040517fe6c460920000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610b6c908490600401611c8f565b610f038363a9059cbb60e01b8484604051602401610262929190611c53565b505050565b600154600090610f42906001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000084611056565b60010192915050565b600154610f85906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691168361107a565b6001546040517f3edd11280000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690633edd112890610ff3907f0000000000000000000000000000000000000000000000000000000000000000908590600090600401611c6c565b6040805180830381600087803b15801561100c57600080fd5b505af1158015611020573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f039190611b2f565b816110525761105281611162565b5050565b600080611063858561118f565b905061106f83826112e3565b9150505b9392505050565b801580159061111e57506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063dd62ed3e906110cb9030908690600401611bf9565b60206040518083038186803b1580156110e357600080fd5b505afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b9190611b17565b15155b15611143576111438363095ea7b360e01b846000604051602401610262929190611c37565b610f038363095ea7b360e01b8484604051602401610262929190611c53565b61118c817f42414c0000000000000000000000000000000000000000000000000000000000611316565b50565b6000611199611941565b6111a38484611391565b90506111ad611992565b6111b78585611470565b90506000816040015167ffffffffffffffff169050600083606001519050600084600001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561121457600080fd5b505afa158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190611b17565b90504283146112cd5760006112618989611502565b9050600061126e8a6115f6565b90506000866020015190506000806000611295868c60a001516112e390919063ffffffff16565b9050670de0b6b3a76400008582020492508383850110156112b557831992505b82810391506112c488836116bf565b97505050505050505b6112d78282610906565b98975050505050505050565b60008282026113078415806113005750838583816112fd57fe5b04145b6003611044565b670de0b6b3a764000081610950565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611399611941565b6040517fbf2730410000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063bf273041906113de908590600401611be5565b60c06040518083038186803b1580156113f657600080fd5b505afa925050508015611426575060408051601f3d908101601f1916820190925261142391810190611a9f565b60015b611469573d808015611454576040519150601f19603f3d011682016040523d82523d6000602084013e611459565b606091505b50611463816116d1565b50610111565b9050610111565b611478611992565b6040517ffb2557030000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063fb255703906114bd908590600401611be5565b60806040518083038186803b1580156114d557600080fd5b505afa925050508015611426575060408051601f3d908101601f1916820190925261142391810190611a3a565b60008061150f8484611758565b6040517fb1e017650000000000000000000000000000000000000000000000000000000081529091506001600160a01b0382169063b1e017659061155b90879087904290600401611c13565b60206040518083038186803b15801561157357600080fd5b505afa9250505080156115a3575060408051601f3d908101601f191682019092526115a091810190611b17565b60015b6115e6573d8080156115d1576040519150601f19603f3d011682016040523d82523d6000602084013e6115d6565b606091505b506115e0816116d1565b506115ef565b91506101119050565b5092915050565b600080611602836117f3565b9050806001600160a01b03166325ed3d446040518163ffffffff1660e01b815260040160206040518083038186803b15801561163d57600080fd5b505afa92505050801561166d575060408051601f3d908101601f1916820190925261166a91810190611b17565b60015b6116b0573d80801561169b576040519150601f19603f3d011682016040523d82523d6000602084013e6116a0565b606091505b506116aa816116d1565b506116b9565b91506100c99050565b50919050565b600082820161010e8482101583611044565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc120000000000000000000000000000000000000000000000000000000082141761174c578160208401fd5b50611052610165611162565b600080611764846117f3565b6040517f48b3eabc0000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906348b3eabc906117ae9087908790600401611bf9565b60206040518083038186803b1580156117c657600080fd5b505afa9250505080156115a3575060408051601f3d908101601f191682019092526115a091810190611a1e565b6000816001600160a01b031663bde127186040518163ffffffff1660e01b815260040160206040518083038186803b15801561182e57600080fd5b505afa92505050801561185e575060408051601f3d908101601f1916820190925261185b91810190611a1e565b60015b6118a1573d80801561188c576040519150601f19603f3d011682016040523d82523d6000602084013e611891565b606091505b5061189b816116d1565b506100c9565b90506100c9565b6040805160c0810190915260008082526020820190815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040805160808101825260008082526020820181905291810182905290606082015290565b6000602082840312156119c8578081fd5b813561010e81611e1b565b600080604083850312156119e5578081fd5b82356119f081611e1b565b946020939093013593505050565b600060208284031215611a0f578081fd5b8151801515811461010e578182fd5b600060208284031215611a2f578081fd5b815161010e81611e1b565b600060808284031215611a4b578081fd5b611a556080611dbe565b8251815260208301516020820152604083015167ffffffffffffffff81168114611a7d578283fd5b6040820152606083015160038110611a93578283fd5b60608201529392505050565b600060c08284031215611ab0578081fd5b611aba60c0611dbe565b8251611ac581611e1b565b81526020830151611ad581611e1b565b60208201526040830151611ae881611e1b565b80604083015250606083015160608201526080830151608082015260a083015160a08201528091505092915050565b600060208284031215611b28578081fd5b5051919050565b60008060408385031215611b41578182fd5b505080516020909101519092909150565b60008060008060808587031215611b67578182fd5b8451935060208501519250604085015191506060850151611b8781611e1b565b939692955090935050565b6001600160a01b03808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b60008251611bdb818460208701611de5565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0392909216825260ff16602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b602080825282518282018190526000919060409081850190868401855b82811015611cf9578151805160038110611cc257fe5b85528087015187860152858101516001600160a01b0316868601526060908101519085015260809093019290850190600101611cac565b5091979650505050505050565b9182526001600160a01b0316602082015260400190565b600060a08252835160a08301526020840151611d3881611e11565b8060c08401525060408401516001600160a01b0380821660e0850152806060870151166101008501525050608084015161012083015260a084015160c0610140840152805180610160850152610180611d978282870160208601611de5565b80601f19601f84011686010193505050506110736020830184611b92565b90815260200190565b60405181810167ffffffffffffffff81118282101715611ddd57600080fd5b604052919050565b60005b83811015611e00578181015183820152602001611de8565b838111156102c65750506000910152565b6002811061118c57fe5b6001600160a01b038116811461118c57600080fdfea264697066735822122090e565ce6d4b10ae5de465aaed55049ecc172eb4d46de92acd33f0a9fb4cf84164736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/index.ts b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/index.ts new file mode 100644 index 0000000..d17ebc7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/index.ts @@ -0,0 +1,154 @@ +import { randomBytes } from 'ethers/lib/utils'; +import { bn, fp } from '@helpers/numbers'; +import { Task, TaskMode, TaskRunOptions } from '@src'; +import { SiloLinearPoolDeployment } from './input'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import * as expectEvent from '@helpers/expectEvent'; +import { ethers } from 'hardhat'; +import { getContractDeploymentTransactionHash, saveContractDeploymentTransactionHash } from '@src'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as SiloLinearPoolDeployment; + const args = [ + input.Vault, + input.ProtocolFeePercentagesProvider, + input.BalancerQueries, + input.FactoryVersion, + input.PoolVersion, + input.InitialPauseWindowDuration, + input.BufferPeriodDuration, + ]; + + // Enums needed for Mock Silos interest data + enum AssetStatus { + Undefined, + Active, + Removed, + } + + const factory = await task.deployAndVerify('SiloLinearPoolFactory', args, from, force); + + if (task.mode === TaskMode.LIVE) { + // We also create a Pool using the factory and verify it, to let us compute their action IDs and so that future + // Pools are automatically verified. We however don't run any of this code in CHECK mode, since we don't care about + // the contracts deployed here. The action IDs will be checked to be correct via a different mechanism. + + // A Silo requires a Silo Repository + const mockSiloRepoArgs = [0, 0]; + const mockSiloRepo = await task.deployAndVerify('MockSiloRepository', mockSiloRepoArgs, from, force); + + // shareTokens require a Silo liquidity pool + const mockSiloArgs = [mockSiloRepo.address, input.WETH]; + const mockSilo = await task.deployAndVerify('MockSilo', mockSiloArgs, from, force); + + // SiloLinearPools require an Silo Token + const mockShareTokenArgs = ['DO NOT USE - Mock Share Token', 'TEST', mockSilo.address, input.WETH, 18]; + const mockShareToken = await task.deployAndVerify('MockShareToken', mockShareTokenArgs, from, force); + + // It is necessary to set a total supply for the shareToken, as well as initialize assetStorage and interestData within the mockSilo. + // This is done in order to avoid divide by 0 errors when creating a MockSiloLinearPool from the Factory. + await mockShareToken.setTotalSupply(fp(1)); + + await mockSilo.setAssetStorage( + input.WETH, + mockShareToken.address, + mockShareToken.address, + mockShareToken.address, + fp(1), + fp(1), + fp(1) + ); + + await mockSilo.setInterestData( + input.WETH, // interestBearingAsset + 0, // harvestedProtocolFees + 0, // protocolFees + 0, // interestRateTimestamp + AssetStatus.Active // status + ); + + // The assetManager, pauseWindowDuration and bufferPeriodDuration will be filled in later, but we need to declare + // them here to appease the type system. Those are constructor arguments, but automatically provided by the factory. + const mockPoolArgs = { + vault: input.Vault, + name: 'DO NOT USE - Mock Linear Pool', + symbol: 'TEST', + mainToken: input.WETH, + wrappedToken: mockShareToken.address, + assetManager: undefined, + upperTarget: 0, + pauseWindowDuration: undefined, + bufferPeriodDuration: undefined, + swapFeePercentage: bn(1e12), + owner: ZERO_ADDRESS, + version: input.PoolVersion, + }; + + // This mimics the logic inside task.deploy + if (force || !task.output({ ensure: false })['MockSiloLinearPool']) { + const PROTOCOL_ID = 0; + const SALT = randomBytes(32); + + const poolCreationReceipt = await ( + await factory.create( + mockPoolArgs.name, + mockPoolArgs.symbol, + mockPoolArgs.mainToken, + mockPoolArgs.wrappedToken, + mockPoolArgs.upperTarget, + mockPoolArgs.swapFeePercentage, + mockPoolArgs.owner, + PROTOCOL_ID, + SALT + ) + ).wait(); + + const event = expectEvent.inReceipt(poolCreationReceipt, 'PoolCreated'); + const mockPoolAddress = event.args.pool; + + await saveContractDeploymentTransactionHash(mockPoolAddress, poolCreationReceipt.transactionHash, task.network); + await task.save({ MockSiloLinearPool: mockPoolAddress }); + } + + const mockSiloLinearPool = await task.instanceAt('SiloLinearPool', task.output()['MockSiloLinearPool']); + + // In order to verify the Pool's code, we need to complete its constructor arguments by computing the factory + // provided arguments (asset manager and pause durations). + + // The asset manager is found by querying the Vault + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, task.network); + const vault = await vaultTask.deployedInstance('Vault'); + + const { assetManager: assetManagerAddress } = await vault.getPoolTokenInfo( + await mockSiloLinearPool.getPoolId(), + input.WETH + ); + mockPoolArgs.assetManager = assetManagerAddress; + + // The durations require knowing when the Pool was created, so we look for the timestamp of its creation block. + + const txHash = await getContractDeploymentTransactionHash(mockSiloLinearPool.address, task.network); + + const tx = await ethers.provider.getTransactionReceipt(txHash); + const poolCreationBlock = await ethers.provider.getBlock(tx.blockNumber); + + // With those and the period end times, we can compute the durations. + + const { pauseWindowEndTime, bufferPeriodEndTime } = await mockSiloLinearPool.getPausedState(); + + mockPoolArgs.pauseWindowDuration = pauseWindowEndTime.sub(poolCreationBlock.timestamp); + mockPoolArgs.bufferPeriodDuration = bufferPeriodEndTime + .sub(poolCreationBlock.timestamp) + .sub(mockPoolArgs.pauseWindowDuration); + + // We are now ready to verify the Pool + await task.verify('SiloLinearPool', mockSiloLinearPool.address, [mockPoolArgs]); + + // We can also verify the Asset Manager + await task.verify('SiloLinearPoolRebalancer', assetManagerAddress, [ + input.Vault, + input.BalancerQueries, + mockShareToken.address, + ]); + } +}; diff --git a/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/input.ts b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/input.ts new file mode 100644 index 0000000..e2bd681 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/input.ts @@ -0,0 +1,31 @@ +import { Task, TaskMode } from '@src'; +import { MONTH } from '@helpers/time'; + +export type SiloLinearPoolDeployment = { + Vault: string; + BalancerQueries: string; + ProtocolFeePercentagesProvider: string; + WETH: string; + FactoryVersion: string; + PoolVersion: string; + InitialPauseWindowDuration: number; + BufferPeriodDuration: number; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerQueries = new Task('20220721-balancer-queries', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); +const WETH = new Task('00000000-tokens', TaskMode.READ_ONLY); + +const BaseVersion = { version: 2, deployment: '20230410-silo-linear-pool-v2' }; + +export default { + Vault, + BalancerQueries, + ProtocolFeePercentagesProvider, + WETH, + FactoryVersion: JSON.stringify({ name: 'SiloLinearPoolFactory', ...BaseVersion }), + PoolVersion: JSON.stringify({ name: 'SiloLinearPool', ...BaseVersion }), + InitialPauseWindowDuration: MONTH * 3, + BufferPeriodDuration: MONTH, +}; diff --git a/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/output/goerli.json b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/output/goerli.json new file mode 100644 index 0000000..8a988d7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/output/goerli.json @@ -0,0 +1,7 @@ +{ + "SiloLinearPoolFactory": "0x30FD8a0f7009F50616aFDaB4aF91a0A2Ef4eaE49", + "MockSiloRepository": "0x7153De1A6d71360F07017838c28dEcA0d6C03e2a", + "MockSilo": "0xa7A7e22398622bf71fF31DAe5355EC7843b13806", + "MockShareToken": "0xB8BDCbF8ccf443D055d5Ffe1d8154fAc8187fC94", + "MockSiloLinearPool": "0xBbb66a4fFf47701EC6c528dB615f5E7bF1AbDAAF" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/output/mainnet.json b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/output/mainnet.json new file mode 100644 index 0000000..018e697 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/output/mainnet.json @@ -0,0 +1,7 @@ +{ + "SiloLinearPoolFactory": "0x4E11AEec21baF1660b1a46472963cB3DA7811C89", + "MockSiloRepository": "0x8E2DfC5E111dbe14E9d725210b9342688Dd51c6c", + "MockSilo": "0x66c94AE8D795E98F69Ca65FFaC87B38B17Be3ca2", + "MockShareToken": "0x192E67544694a7bAA2DeA94f9B1Df58BB3395A12", + "MockSiloLinearPool": "0x74CBfAF94A3577c539a9dCEE9870A6349a33b34f" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/output/sepolia.json b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/output/sepolia.json new file mode 100644 index 0000000..87326b3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/output/sepolia.json @@ -0,0 +1,7 @@ +{ + "SiloLinearPoolFactory": "0x8eA89804145c007e7D226001A96955ad53836087", + "MockSiloRepository": "0xa7d524046ef89de9F8e4f2d7B029f66cCB738d48", + "MockSilo": "0x6B1Da720Be2D11d95177ccFc40A917c2688f396c", + "MockShareToken": "0x0c6052254551EAe3ECac77B01DFcf1025418828f", + "MockSiloLinearPool": "0xA149CF2D795AaB83a15673f5Beade9361e4e3F65" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/readme.md b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/readme.md new file mode 100644 index 0000000..dd25d2b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/readme.md @@ -0,0 +1,14 @@ +# 2023-04-10 - Silo Linear Pool V2 + +Second deployment of the `SiloLinearPoolFactory`, for Linear Pools with a Silo yield-bearing token (shareToken). +Supersedes `20230315-silo-linear-pool`, modifying the pool factory to use Create2 when deploying a new pool. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`SiloExchangeRateModel` artifact](./artifact/SiloExchangeRateModel.json) +- [`SiloLinearPool` artifact](./artifact/SiloLinearPool.json) +- [`SiloLinearPoolFactory` artifact](./artifact/SiloLinearPoolFactory.json) +- [`SiloLinearPoolRebalancer` artifact](./artifact/SiloLinearPoolRebalancer.json) diff --git a/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/test/interfaces/IInterestRateModel.sol b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/test/interfaces/IInterestRateModel.sol new file mode 100644 index 0000000..b459645 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/test/interfaces/IInterestRateModel.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity >=0.7.0 <0.9.0; + +interface IInterestRateModel { + /** + * @dev get compound interest rate + * @param silo address of Silo + * @param asset address of an asset in Silo for which interest rate should be calculated + * @param blockTimestamp current block timestamp + * @return rcomp compounded interest rate from last update until now (1e18 == 100%) + */ + function getCompoundInterestRate( + address silo, + address asset, + uint256 blockTimestamp + ) external view returns (uint256 rcomp); + + /** + * @dev get current annual interest rate + * @param silo address of Silo + * @param asset address of an asset in Silo for which interest rate should be calculated + * @param blockTimestamp current block timestamp + * @return rcur current annual interest rate (1e18 == 100%) + */ + function getCurrentInterestRate( + address silo, + address asset, + uint256 blockTimestamp + ) external view returns (uint256 rcur); +} diff --git a/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/test/interfaces/IShareToken.sol b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/test/interfaces/IShareToken.sol new file mode 100644 index 0000000..fe14aae --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/test/interfaces/IShareToken.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity >=0.7.0 <0.9.0; + +import "./ISilo.sol"; + +interface IShareToken { + /** + * @dev returns the underlying asset + */ + function asset() external view returns (address); + + /** + * @dev returns the address of the silo + */ + function silo() external view returns (ISilo); + + /** + * @dev returns the supply of the shareToken + */ + function totalSupply() external view returns (uint256); +} diff --git a/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/test/interfaces/ISilo.sol b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/test/interfaces/ISilo.sol new file mode 100644 index 0000000..cb2feaf --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/test/interfaces/ISilo.sol @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity >=0.7.0 <0.9.0; +pragma experimental ABIEncoderV2; + +import "./IShareToken.sol"; +import "./ISiloRepository.sol"; + +interface IBaseSilo { + enum AssetStatus { Undefined, Active, Removed } + + /// Storage struct that holds all required data for a single token market + struct AssetStorage { + // Token that represents a share in totalDeposits of Silo + IShareToken collateralToken; + // Token that represents a share in collateralOnlyDeposits of Silo + IShareToken collateralOnlyToken; + // Token that represents a share in totalBorrowAmount of Silo + IShareToken debtToken; + // COLLATERAL: Amount of asset token that has been deposited to Silo with interest earned by depositors. + // It also includes token amount that has been borrowed. + uint256 totalDeposits; + // COLLATERAL ONLY: Amount of asset token that has been deposited to Silo that can be ONLY used + // as collateral. These deposits do NOT earn interest and CANNOT be borrowed. + uint256 collateralOnlyDeposits; + // DEBT: Amount of asset token that has been borrowed with accrued interest. + uint256 totalBorrowAmount; + } + + /// @dev Storage struct that holds data related to fees and interest + struct AssetInterestData { + // Total amount of already harvested protocol fees + uint256 harvestedProtocolFees; + // Total amount (ever growing) of asset token that has been earned by the protocol from + // generated interest. + uint256 protocolFees; + // Timestamp of the last time `interestRate` has been updated in storage. + uint64 interestRateTimestamp; + // True if asset was removed from the protocol. If so, deposit and borrow functions are disabled + // for that asset + AssetStatus status; + } + + /** + * @dev returns the asset storage struct + * @dev AssetStorage struct contains necessary information for calculating shareToken exchange rates + */ + function assetStorage(address _asset) external view returns (AssetStorage memory); + + /** + * @dev returns the interest data struct + * @dev Interest data struct helps us update necessary asset storage data closer to the time that it is + * updated on Silo's protocol during deposits and withdraws + */ + function interestData(address _asset) external view returns (AssetInterestData memory); + + /// @notice Get Silo Repository contract address + /// @return Silo Repository contract address + function siloRepository() external view returns (ISiloRepository); +} + +interface ISilo is IBaseSilo { + /** + * @dev Deposits funds into the Silo + * @param _asset The address of the token to withdraw + * @param _amount The amount of the token to withdraw + * @param _collateralOnly: True means your shareToken is protected (cannot be swapped for interest) + */ + function deposit( + address _asset, + uint256 _amount, + bool _collateralOnly + ) external returns (uint256 collateralAmount, uint256 collateralShare); + + /** + * @dev Withdraws funds from the Silo + * @param _asset The address of the token to withdraw + * @param _amount The amount of the token to withdraw + * @param _collateralOnly: True means your shareToken is protected (cannot be swapped for interest) + */ + function withdraw( + address _asset, + uint256 _amount, + bool _collateralOnly + ) external returns (uint256 withdrawnAmount, uint256 withdrawnShare); +} diff --git a/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/test/interfaces/ISiloRepository.sol b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/test/interfaces/ISiloRepository.sol new file mode 100644 index 0000000..5c01e9c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/test/interfaces/ISiloRepository.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// This program is 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. + +// This program 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 this program. If not, see . + +pragma solidity >=0.7.0 <0.9.0; + +import "./IInterestRateModel.sol"; + +interface ISiloRepository { + /** + * @notice Get Interest Rate Model address for asset in given Silo + * @dev If dedicated config is not set, method returns default config + * @param silo address of Silo + * @param asset address of an asset + * @return address of interest rate model + */ + function getInterestRateModel(address silo, address asset) external view returns (IInterestRateModel); + + /** + * @dev Get protocol share fee + * @return protocol share fee in precision points (Solvency._PRECISION_DECIMALS == 100%) + */ + function protocolShareFee() external view returns (uint256); +} diff --git a/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/test/test.fork.ts b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/test/test.fork.ts new file mode 100644 index 0000000..116a104 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230410-silo-linear-pool-v2/test/test.fork.ts @@ -0,0 +1,413 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { randomBytes } from 'ethers/lib/utils'; +import { BigNumber, Contract } from 'ethers'; +import { setCode } from '@nomicfoundation/hardhat-network-helpers'; +import * as expectEvent from '@helpers/expectEvent'; +import { bn, fp, FP_ONE } from '@helpers/numbers'; +import { MAX_UINT256 } from '@helpers/constants'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; + +import { impersonate, getForkedNetwork, Task, TaskMode, getSigners } from '@src'; +import { describeForkTest } from '@src'; +import { deploy, instanceAt, getArtifact } from '@src'; + +export enum SwapKind { + GivenIn = 0, + GivenOut, +} + +describeForkTest('SiloLinearPoolFactory', 'mainnet', 16478568, function () { + let owner: SignerWithAddress, holder: SignerWithAddress, other: SignerWithAddress; + let factory: Contract, vault: Contract, usdc: Contract; + let rebalancer: Contract; + + let task: Task; + + enum AttackType { + SET_TARGETS, + SET_SWAP_FEE, + } + + // USDC Mainnet address + const USDC = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'; + // Share Token address for USDC + const sUSDC = '0x416DE9AD46C53AAAb2352F91120952393946d2ac'; + // USDC holder address + const USDC_HOLDER = '0xda9ce944a37d218c3302f6b82a094844c6eceb17'; + // USDC Silo Address + const USDC_SILO = '0xfccc27aabd0ab7a0b2ad2b7760037b1eab61616b'; + + // Scaling factory is 1e12 due to USDC only having 6 decimals + const USDC_SCALING = bn(1e12); + + const SWAP_FEE_PERCENTAGE = fp(0.01); // 1% + + // The targets are set using 18 decimals, even if the token has fewer (as is the case for USDC); + const INITIAL_UPPER_TARGET = fp(1e6); + + // The initial midpoint (upper target / 2) must be between the final lower and upper targets + const FINAL_LOWER_TARGET = fp(0.2e6); + const FINAL_UPPER_TARGET = fp(5e6); + + const PROTOCOL_ID = 5; + const TASK_NAME = '20230410-silo-linear-pool-v2'; + const VERSION = 2; + const SALT = randomBytes(32); + + let pool: Contract; + let poolId: string; + + before('run task', async () => { + task = new Task(TASK_NAME, TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('SiloLinearPoolFactory'); + }); + + before('load signers', async () => { + [, owner, other] = await getSigners(); + + holder = await impersonate(USDC_HOLDER, fp(100)); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + + usdc = await task.instanceAt('IERC20', USDC); + await usdc.connect(holder).approve(vault.address, MAX_UINT256); + }); + + enum LinearPoolState { + BALANCED, + MAIN_EXCESS, + MAIN_LACK, + } + + function itRebalancesThePool(expectedState: LinearPoolState) { + it('rebalance the pool', async () => { + const { lowerTarget, upperTarget } = await pool.getTargets(); + + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + + let fees; + + if (scaledCash.gt(upperTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_EXCESS); + + const excess = scaledCash.sub(upperTarget); + fees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else if (scaledCash.lt(lowerTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_LACK); + + const lack = lowerTarget.sub(scaledCash); + fees = lack.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else { + expect(expectedState).to.equal(LinearPoolState.BALANCED); + + fees = 0; + } + + const initialRecipientMainBalance = await usdc.balanceOf(other.address); + + if (expectedState != LinearPoolState.BALANCED) { + await rebalancer.connect(holder).rebalance(other.address); + } else { + await rebalancer.connect(holder).rebalanceWithExtraMain(other.address, 5); + } + const finalRecipientMainBalance = await usdc.balanceOf(other.address); + + if (fees > 0) { + // The recipient of the rebalance call should get the fees that were collected (though there's some rounding + // error in the main-wrapped conversion). + expect(finalRecipientMainBalance.sub(initialRecipientMainBalance)).to.be.almostEqual( + fees.div(USDC_SCALING), + 0.000001 + ); + } else { + // The recipient of the rebalance call will get any extra main tokens that were not utilized. + expect(finalRecipientMainBalance).to.be.almostEqual(initialRecipientMainBalance, 0.000001); + } + + const mainInfo = await vault.getPoolTokenInfo(poolId, USDC); + + const expectedMainBalance = lowerTarget.add(upperTarget).div(2); + expect(mainInfo.cash.mul(USDC_SCALING)).to.equal(expectedMainBalance); + expect(mainInfo.managed).to.equal(0); + }); + } + + describe('create and check getters', () => { + it('deploy a linear pool', async () => { + const tx = await factory.create( + 'USDC', + 'sUSDC', + USDC, + sUSDC, + INITIAL_UPPER_TARGET, + SWAP_FEE_PERCENTAGE, + owner.address, + PROTOCOL_ID, + SALT + ); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await task.instanceAt('SiloLinearPool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + const { assetManager } = await vault.getPoolTokenInfo(poolId, USDC); // We could query for either frxEth or SiloToken + rebalancer = await task.instanceAt('SiloLinearPoolRebalancer', assetManager); + + await usdc.connect(holder).approve(rebalancer.address, MAX_UINT256); // To send extra main on rebalance + }); + + it('check factory version', async () => { + const expectedFactoryVersion = { + name: 'SiloLinearPoolFactory', + version: VERSION, + deployment: TASK_NAME, + }; + + expect(await factory.version()).to.equal(JSON.stringify(expectedFactoryVersion)); + }); + + it('check pool version', async () => { + const expectedPoolVersion = { + name: 'SiloLinearPool', + version: VERSION, + deployment: TASK_NAME, + }; + + expect(await pool.version()).to.equal(JSON.stringify(expectedPoolVersion)); + }); + }); + + describe('join, and rebalance', () => { + it('join the pool', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const joinAmount = INITIAL_UPPER_TARGET.mul(2).div(USDC_SCALING); + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: USDC, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert join amount - some fees will be collected as we're going over the upper target. + const excess = joinAmount.mul(USDC_SCALING).sub(INITIAL_UPPER_TARGET); + const joinCollectedFees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + + const expectedBPT = joinAmount.mul(USDC_SCALING).sub(joinCollectedFees); + expect(await pool.balanceOf(holder.address)).to.equal(expectedBPT); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + + it('set final targets', async () => { + await pool.connect(owner).setTargets(FINAL_LOWER_TARGET, FINAL_UPPER_TARGET); + }); + }); + + describe('generate excess of main token and rebalance', () => { + it('deposit main tokens', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const { upperTarget } = await pool.getTargets(); + const joinAmount = upperTarget.mul(5).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: USDC, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + }); + + describe('generate lack of main token and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to withdraw enough man token to bring the Pool below its lower target, which will let us later + // rebalance. + + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_LACK); + }); + + describe('join below upper target and rebalance', () => { + it('deposit main tokens', async () => { + // We're going to join with few tokens, causing the Pool to not reach its upper target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const joinAmount = midpoint.div(100).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: USDC, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('exit above lower target and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to exit with few tokens, causing for the Pool to not reach its lower target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const exitAmount = midpoint.div(100).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalance repeatedly', () => { + itRebalancesThePool(LinearPoolState.BALANCED); + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalancer query protection', async () => { + it('reverts with a malicious lending pool', async () => { + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + + await setCode(USDC_SILO, getArtifact('MockSilo').deployedBytecode); + const mockLendingPool = await instanceAt('MockSilo', USDC_SILO); + + await mockLendingPool.setRevertType(2); // Type 2 is malicious swap query revert + await expect(rebalancer.rebalance(other.address)).to.be.revertedWith('BAL#357'); // MALICIOUS_QUERY_REVERT + }); + }); + + describe('read-only reentrancy protection', () => { + let attacker: Contract; + + before('deploy attacker', async () => { + // Using Reentrancy Attacker from Aave Fork Test (task 20230206-aave-rebalanced-linear-pool-v4) + attacker = await deploy('ReadOnlyReentrancyAttackerAaveLP', [vault.address]); + }); + + async function performAttack(attackType: AttackType, ethAmount: BigNumber, expectRevert: boolean) { + // To trigger the callback and revert, send more than we need for the deposit + // If we send just enough, there will be no "extra" ETH, and it won't trigger the callback and attack + const amountToSend = expectRevert ? ethAmount.add(1) : ethAmount; + + const attack = attacker.startAttack(pool.address, attackType, ethAmount, { value: amountToSend }); + if (expectRevert) { + await expect(attack).to.be.revertedWith('BAL#420'); + } else { + await expect(attack).to.not.be.reverted; + } + } + + function itPerformsAttack(expectRevert: boolean) { + const action = expectRevert ? 'triggers' : 'does not trigger'; + + context('set targets', () => { + it(`${action} the set targets attack`, async () => { + await performAttack(AttackType.SET_TARGETS, fp(1), expectRevert); + }); + }); + + context('set swap fee', () => { + it(`${action} the set swap fee attack`, async () => { + await performAttack(AttackType.SET_SWAP_FEE, fp(1), expectRevert); + }); + }); + } + + context('when exactly enough ETH is sent', () => { + itPerformsAttack(false); + }); + + context('when too much ETH is sent', () => { + itPerformsAttack(true); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/artifact/CircuitBreakerLib.json b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/artifact/CircuitBreakerLib.json new file mode 100644 index 0000000..12457c7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/artifact/CircuitBreakerLib.json @@ -0,0 +1,40 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "CircuitBreakerLib", + "sourceName": "contracts/lib/CircuitBreakerLib.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "bound", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isLowerBound", + "type": "bool" + } + ], + "name": "calcAdjustedBound", + "outputs": [ + { + "internalType": "uint256", + "name": "boundRatio", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x610e4f610026600b82828239805160001a60731461001957fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063f4d8cb7c1461003a575b600080fd5b6100656004803603606081101561005057600080fd5b50803590602081013590604001351515610077565b60408051918252519081900360200190f35b600061009f84610086856100a7565b84610093576100b9610097565b6101735b63ffffffff16565b949350505050565b670de0b6b3a764000081810391100290565b6000670de0b6b3a76400008214156100d257508161016d565b671bc16d674ec800008214156100f3576100ec83846101f9565b905061016d565b673782dace9d90000082141561012357600061010f84856101f9565b905061011b81826101f9565b91505061016d565b600061012f848461022f565b905060006101496101428361271061034f565b6001610387565b90508082101561015e5760009250505061016d565b61016882826103a0565b925050505b92915050565b6000670de0b6b3a764000082141561018c57508161016d565b671bc16d674ec800008214156101a6576100ec838461034f565b673782dace9d9000008214156101ce5760006101c2848561034f565b905061011b818261034f565b60006101da848461022f565b905060006101ed6101428361271061034f565b90506101688282610387565b600082820261021d84158061021657508385838161021357fe5b04145b60036103b6565b670de0b6b3a764000090049392505050565b6000816102455750670de0b6b3a764000061016d565b826102525750600061016d565b61026260ff84901c1560066103b6565b82610288770bce5086492111aea88f4bb1ca6bcf584181ea8059f76532841060076103b6565b826000670c7d713b49da0000831380156102a95750670f43fc2c04ee000083125b156102e05760006102b9846103c8565b9050670de0b6b3a764000080820784020583670de0b6b3a7640000830502019150506102ee565b816102ea84610501565b0290505b670de0b6b3a7640000900561033c7ffffffffffffffffffffffffffffffffffffffffffffffffdc702bd3a30fc00008212801590610335575068070c1cc73b00c800008213155b60086103b6565b610345816108a1565b9695505050505050565b600082820261036984158061021657508385838161021357fe5b6001670de0b6b3a76400006001830304018115150291505092915050565b600082820161039984821015836103b6565b9392505050565b60006103b08383111560016103b6565b50900390565b816103c4576103c481610d71565b5050565b670de0b6b3a7640000026000806ec097ce7bc90715b34b9f1000000000808401907fffffffffffffffffffffffffffffffffff3f68318436f8ea4cb460f0000000008501028161041457fe5b05905060006ec097ce7bc90715b34b9f100000000082800205905081806ec097ce7bc90715b34b9f100000000081840205915060038205016ec097ce7bc90715b34b9f100000000082840205915060058205016ec097ce7bc90715b34b9f100000000082840205915060078205016ec097ce7bc90715b34b9f100000000082840205915060098205016ec097ce7bc90715b34b9f1000000000828402059150600b8205016ec097ce7bc90715b34b9f1000000000828402059150600d8205016ec097ce7bc90715b34b9f1000000000828402059150600f820581019050806002029450505050505b919050565b6000670de0b6b3a764000082121561053e57610534826ec097ce7bc90715b34b9f10000000008161052e57fe5b05610501565b60000390506104fc565b60007e1600ef3172e58d2e933ec884fde10064c63b5372d805e203c0000000000000831261058f57770195e54c5dd42177f53a27172fa9ec630262827000000000830592506806f05b59d3b2000000015b73011798004d755d3c8bc8e03204cf44619e00000083126105c7576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff0084000831261060f576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a700831261064a576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf850831261068157693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e283126106b857690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d0383126106ed5768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb41746121110831261071857680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d831261074d576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f17757889379378312610782576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b28660383126107b6576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac83126107ea576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b600068056bc75e2d63100000840168056bc75e2d63100000808603028161080d57fe5b059050600068056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b60006108e67ffffffffffffffffffffffffffffffffffffffffffffffffdc702bd3a30fc000083121580156108df575068070c1cc73b00c800008313155b60096103b6565b600082121561091a576108fb826000036108a1565b6ec097ce7bc90715b34b9f10000000008161091257fe5b0590506104fc565b60006806f05b59d3b2000000831261097057507ffffffffffffffffffffffffffffffffffffffffffffffff90fa4a62c4e00000090910190770195e54c5dd42177f53a27172fa9ec6302628270000000006109bc565b6803782dace9d900000083126109b857507ffffffffffffffffffffffffffffffffffffffffffffffffc87d2531627000000909101906b1425982cf597cd205cef73806109bc565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac620000008412610a22577fffffffffffffffffffffffffffffffffffffffffffffff5287143a539e0000009093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d6310000008412610a74577fffffffffffffffffffffffffffffffffffffffffffffffa9438a1d29cf0000009093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b188000008412610ac4577fffffffffffffffffffffffffffffffffffffffffffffffd4a1c50e94e78000009093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c4000008412610b14577fffffffffffffffffffffffffffffffffffffffffffffffea50e2874a73c000009093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac62000008412610b63577ffffffffffffffffffffffffffffffffffffffffffffffff5287143a539e000009093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d631000008412610bb2577ffffffffffffffffffffffffffffffffffffffffffffffffa9438a1d29cf000009093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b18800008412610c01577ffffffffffffffffffffffffffffffffffffffffffffffffd4a1c50e94e7800009093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c400008412610c50577ffffffffffffffffffffffffffffffffffffffffffffffffea50e2874a73c00009093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b610d9b817f42414c0000000000000000000000000000000000000000000000000000000000610d9e565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fdfea2646970667358221220cb195cdbf9e262e4f4e9a4c4faf038de3b2317bcba20577205894269334cae4f64736f6c63430007010033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063f4d8cb7c1461003a575b600080fd5b6100656004803603606081101561005057600080fd5b50803590602081013590604001351515610077565b60408051918252519081900360200190f35b600061009f84610086856100a7565b84610093576100b9610097565b6101735b63ffffffff16565b949350505050565b670de0b6b3a764000081810391100290565b6000670de0b6b3a76400008214156100d257508161016d565b671bc16d674ec800008214156100f3576100ec83846101f9565b905061016d565b673782dace9d90000082141561012357600061010f84856101f9565b905061011b81826101f9565b91505061016d565b600061012f848461022f565b905060006101496101428361271061034f565b6001610387565b90508082101561015e5760009250505061016d565b61016882826103a0565b925050505b92915050565b6000670de0b6b3a764000082141561018c57508161016d565b671bc16d674ec800008214156101a6576100ec838461034f565b673782dace9d9000008214156101ce5760006101c2848561034f565b905061011b818261034f565b60006101da848461022f565b905060006101ed6101428361271061034f565b90506101688282610387565b600082820261021d84158061021657508385838161021357fe5b04145b60036103b6565b670de0b6b3a764000090049392505050565b6000816102455750670de0b6b3a764000061016d565b826102525750600061016d565b61026260ff84901c1560066103b6565b82610288770bce5086492111aea88f4bb1ca6bcf584181ea8059f76532841060076103b6565b826000670c7d713b49da0000831380156102a95750670f43fc2c04ee000083125b156102e05760006102b9846103c8565b9050670de0b6b3a764000080820784020583670de0b6b3a7640000830502019150506102ee565b816102ea84610501565b0290505b670de0b6b3a7640000900561033c7ffffffffffffffffffffffffffffffffffffffffffffffffdc702bd3a30fc00008212801590610335575068070c1cc73b00c800008213155b60086103b6565b610345816108a1565b9695505050505050565b600082820261036984158061021657508385838161021357fe5b6001670de0b6b3a76400006001830304018115150291505092915050565b600082820161039984821015836103b6565b9392505050565b60006103b08383111560016103b6565b50900390565b816103c4576103c481610d71565b5050565b670de0b6b3a7640000026000806ec097ce7bc90715b34b9f1000000000808401907fffffffffffffffffffffffffffffffffff3f68318436f8ea4cb460f0000000008501028161041457fe5b05905060006ec097ce7bc90715b34b9f100000000082800205905081806ec097ce7bc90715b34b9f100000000081840205915060038205016ec097ce7bc90715b34b9f100000000082840205915060058205016ec097ce7bc90715b34b9f100000000082840205915060078205016ec097ce7bc90715b34b9f100000000082840205915060098205016ec097ce7bc90715b34b9f1000000000828402059150600b8205016ec097ce7bc90715b34b9f1000000000828402059150600d8205016ec097ce7bc90715b34b9f1000000000828402059150600f820581019050806002029450505050505b919050565b6000670de0b6b3a764000082121561053e57610534826ec097ce7bc90715b34b9f10000000008161052e57fe5b05610501565b60000390506104fc565b60007e1600ef3172e58d2e933ec884fde10064c63b5372d805e203c0000000000000831261058f57770195e54c5dd42177f53a27172fa9ec630262827000000000830592506806f05b59d3b2000000015b73011798004d755d3c8bc8e03204cf44619e00000083126105c7576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff0084000831261060f576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a700831261064a576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf850831261068157693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e283126106b857690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d0383126106ed5768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb41746121110831261071857680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d831261074d576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f17757889379378312610782576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b28660383126107b6576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac83126107ea576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b600068056bc75e2d63100000840168056bc75e2d63100000808603028161080d57fe5b059050600068056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b60006108e67ffffffffffffffffffffffffffffffffffffffffffffffffdc702bd3a30fc000083121580156108df575068070c1cc73b00c800008313155b60096103b6565b600082121561091a576108fb826000036108a1565b6ec097ce7bc90715b34b9f10000000008161091257fe5b0590506104fc565b60006806f05b59d3b2000000831261097057507ffffffffffffffffffffffffffffffffffffffffffffffff90fa4a62c4e00000090910190770195e54c5dd42177f53a27172fa9ec6302628270000000006109bc565b6803782dace9d900000083126109b857507ffffffffffffffffffffffffffffffffffffffffffffffffc87d2531627000000909101906b1425982cf597cd205cef73806109bc565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac620000008412610a22577fffffffffffffffffffffffffffffffffffffffffffffff5287143a539e0000009093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d6310000008412610a74577fffffffffffffffffffffffffffffffffffffffffffffffa9438a1d29cf0000009093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b188000008412610ac4577fffffffffffffffffffffffffffffffffffffffffffffffd4a1c50e94e78000009093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c4000008412610b14577fffffffffffffffffffffffffffffffffffffffffffffffea50e2874a73c000009093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac62000008412610b63577ffffffffffffffffffffffffffffffffffffffffffffffff5287143a539e000009093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d631000008412610bb2577ffffffffffffffffffffffffffffffffffffffffffffffffa9438a1d29cf000009093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b18800008412610c01577ffffffffffffffffffffffffffffffffffffffffffffffffd4a1c50e94e7800009093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c400008412610c50577ffffffffffffffffffffffffffffffffffffffffffffffffea50e2874a73c00009093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b610d9b817f42414c0000000000000000000000000000000000000000000000000000000000610d9e565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fdfea2646970667358221220cb195cdbf9e262e4f4e9a4c4faf038de3b2317bcba20577205894269334cae4f64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/artifact/ManagedPool.json b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/artifact/ManagedPool.json new file mode 100644 index 0000000..b1417fa --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/artifact/ManagedPool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"components": [{"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "address[]", "name": "assetManagers", "type": "address[]"}], "internalType": "struct ManagedPool.ManagedPoolParams", "name": "params", "type": "tuple"}, {"components": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "contract IProtocolFeePercentagesProvider", "name": "protocolFeeProvider", "type": "address"}, {"internalType": "contract IExternalWeightedMath", "name": "weightedMath", "type": "address"}, {"internalType": "contract IRecoveryModeHelper", "name": "recoveryModeHelper", "type": "address"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "string", "name": "version", "type": "string"}], "internalType": "struct ManagedPool.ManagedPoolConfigParams", "name": "configParams", "type": "tuple"}, {"components": [{"internalType": "contract IERC20[]", "name": "tokens", "type": "address[]"}, {"internalType": "uint256[]", "name": "normalizedWeights", "type": "uint256[]"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "bool", "name": "swapEnabledOnStart", "type": "bool"}, {"internalType": "bool", "name": "mustAllowlistLPs", "type": "bool"}, {"internalType": "uint256", "name": "managementAumFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "aumFeeId", "type": "uint256"}], "internalType": "struct ManagedPoolSettings.ManagedPoolSettingsParams", "name": "settingsParams", "type": "tuple"}, {"internalType": "address", "name": "owner", "type": "address"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "member", "type": "address"}], "name": "AllowlistAddressAdded", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "member", "type": "address"}], "name": "AllowlistAddressRemoved", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "bptPrice", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "lowerBoundPercentage", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "upperBoundPercentage", "type": "uint256"}], "name": "CircuitBreakerSet", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "startTime", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "endTime", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "startSwapFeePercentage", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "endSwapFeePercentage", "type": "uint256"}], "name": "GradualSwapFeeUpdateScheduled", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "startTime", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "endTime", "type": "uint256"}, {"indexed": false, "internalType": "uint256[]", "name": "startWeights", "type": "uint256[]"}, {"indexed": false, "internalType": "uint256[]", "name": "endWeights", "type": "uint256[]"}], "name": "GradualWeightUpdateScheduled", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "joinExitEnabled", "type": "bool"}], "name": "JoinExitEnabledSet", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "bptAmount", "type": "uint256"}], "name": "ManagementAumFeeCollected", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "managementAumFeePercentage", "type": "uint256"}], "name": "ManagementAumFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "mustAllowlistLPs", "type": "bool"}], "name": "MustAllowlistLPsSet", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bytes32", "name": "feeCache", "type": "bytes32"}], "name": "ProtocolFeePercentageCacheUpdated", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "enabled", "type": "bool"}], "name": "RecoveryModeStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "swapEnabled", "type": "bool"}], "name": "SwapEnabledSet", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "normalizedWeight", "type": "uint256"}], "name": "TokenAdded", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "TokenRemoved", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "member", "type": "address"}], "name": "addAllowedAddress", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "tokenToAdd", "type": "address"}, {"internalType": "address", "name": "assetManager", "type": "address"}, {"internalType": "uint256", "name": "tokenToAddNormalizedWeight", "type": "uint256"}, {"internalType": "uint256", "name": "mintAmount", "type": "uint256"}, {"internalType": "address", "name": "recipient", "type": "address"}], "name": "addToken", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "collectAumManagementFees", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "disableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "enableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getActualSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "getCircuitBreakerState", "outputs": [{"internalType": "uint256", "name": "bptPrice", "type": "uint256"}, {"internalType": "uint256", "name": "referenceWeight", "type": "uint256"}, {"internalType": "uint256", "name": "lowerBound", "type": "uint256"}, {"internalType": "uint256", "name": "upperBound", "type": "uint256"}, {"internalType": "uint256", "name": "lowerBptPriceBound", "type": "uint256"}, {"internalType": "uint256", "name": "upperBptPriceBound", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getDomainSeparator", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getGradualSwapFeeUpdateParams", "outputs": [{"internalType": "uint256", "name": "startTime", "type": "uint256"}, {"internalType": "uint256", "name": "endTime", "type": "uint256"}, {"internalType": "uint256", "name": "startSwapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "endSwapFeePercentage", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getGradualWeightUpdateParams", "outputs": [{"internalType": "uint256", "name": "startTime", "type": "uint256"}, {"internalType": "uint256", "name": "endTime", "type": "uint256"}, {"internalType": "uint256[]", "name": "startWeights", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "endWeights", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getJoinExitEnabled", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getManagementAumFeeParams", "outputs": [{"internalType": "uint256", "name": "aumFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "lastCollectionTimestamp", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMustAllowlistLPs", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "getNextNonce", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getNormalizedWeights", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "feeType", "type": "uint256"}], "name": "getProtocolFeePercentageCache", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getProtocolFeesCollector", "outputs": [{"internalType": "contract IProtocolFeesCollector", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "feeType", "type": "uint256"}], "name": "getProviderFeeId", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getScalingFactors", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapEnabled", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "inRecoveryMode", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "member", "type": "address"}], "name": "isAddressOnAllowlist", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "dueProtocolFees", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "dueProtocolFees", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "indexIn", "type": "uint256"}, {"internalType": "uint256", "name": "indexOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256", "name": "balanceTokenIn", "type": "uint256"}, {"internalType": "uint256", "name": "balanceTokenOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "member", "type": "address"}], "name": "removeAllowedAddress", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "tokenToRemove", "type": "address"}, {"internalType": "uint256", "name": "burnAmount", "type": "uint256"}, {"internalType": "address", "name": "sender", "type": "address"}], "name": "removeToken", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20[]", "name": "tokens", "type": "address[]"}, {"internalType": "uint256[]", "name": "bptPrices", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "lowerBoundPercentages", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "upperBoundPercentages", "type": "uint256[]"}], "name": "setCircuitBreakers", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bool", "name": "joinExitEnabled", "type": "bool"}], "name": "setJoinExitEnabled", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "managementAumFeePercentage", "type": "uint256"}], "name": "setManagementAumFeePercentage", "outputs": [{"internalType": "uint256", "name": "amount", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bool", "name": "mustAllowlistLPs", "type": "bool"}], "name": "setMustAllowlistLPs", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bool", "name": "swapEnabled", "type": "bool"}], "name": "setSwapEnabled", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "updateProtocolFeePercentageCache", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "startTime", "type": "uint256"}, {"internalType": "uint256", "name": "endTime", "type": "uint256"}, {"internalType": "uint256", "name": "startSwapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "endSwapFeePercentage", "type": "uint256"}], "name": "updateSwapFeeGradually", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "startTime", "type": "uint256"}, {"internalType": "uint256", "name": "endTime", "type": "uint256"}, {"internalType": "contract IERC20[]", "name": "tokens", "type": "address[]"}, {"internalType": "uint256[]", "name": "endWeights", "type": "uint256[]"}], "name": "updateWeightsGradually", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "version", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/artifact/ManagedPoolAddRemoveTokenLib.json b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/artifact/ManagedPoolAddRemoveTokenLib.json new file mode 100644 index 0000000..e6e567a --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/artifact/ManagedPoolAddRemoveTokenLib.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ManagedPoolAddRemoveTokenLib", + "sourceName": "contracts/managed/ManagedPoolAddRemoveTokenLib.sol", + "abi": [], + "bytecode": "0x610fd7610026600b82828239805160001a60731461001957fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100405760003560e01c80631face20a14610045578063a20d2e4d14610268575b600080fd5b81801561005157600080fd5b506101c8600480360361010081101561006957600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691602081013591604082013591908101906080810160608201356401000000008111156100ad57600080fd5b8201836020820111156100bf57600080fd5b803590602001918460208302840111640100000000831117156100e157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561013157600080fd5b82018360208201111561014357600080fd5b8035906020019184602083028401116401000000008311171561016557600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505073ffffffffffffffffffffffffffffffffffffffff833581169450602084013516926040013591506104799050565b604051808481526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156102125781810151838201526020016101fa565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610251578181015183820152602001610239565b505050509050019550505050505060405180910390f35b81801561027457600080fd5b506103e0600480360360e081101561028b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691602081013591604082013591908101906080810160608201356401000000008111156102cf57600080fd5b8201836020820111156102e157600080fd5b8035906020019184602083028401116401000000008311171561030357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561035357600080fd5b82018360208201111561036557600080fd5b8035906020019184602083028401116401000000008311171561038757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505073ffffffffffffffffffffffffffffffffffffffff833516935050506020013561069a565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561042457818101518382015260200161040c565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561046357818101518382015260200161044b565b5050505090500194505050505060405180910390f35b60006060806104a373ffffffffffffffffffffffffffffffffffffffff8716301415610162610969565b6104ac8961097b565b6104b88b8b88886109b3565b6104c28685610b74565b92506000885160010167ffffffffffffffff811180156104e157600080fd5b5060405190808252806020026020018201604052801561050b578160200160208202803683370190505b509250875160010167ffffffffffffffff8111801561052957600080fd5b50604051908082528060200260200182016040528015610553578160200160208202803683370190505b50915060005b88518110156106265789818151811061056e57fe5b602002602001015184828151811061058257fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526105de6105bc670de0b6b3a764000088610b94565b8a83815181106105c857fe5b6020026020010151610baa90919063ffffffff16565b8382815181106105ea57fe5b60200260200101818152505061061c83828151811061060557fe5b602002602001015183610be290919063ffffffff16565b9150600101610559565b50868360018551038151811061063857fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015261066f670de0b6b3a764000082610b94565b8260018451038151811061067f57fe5b60200260200101818152505050985098509895505050505050565b6060806106c273ffffffffffffffffffffffffffffffffffffffff8516301415610162610969565b6106cb8761097b565b6106d6898986610bf4565b6000600187510367ffffffffffffffff811180156106f357600080fd5b5060405190808252806020026020018201604052801561071d578160200160208202803683370190505b509250600186510367ffffffffffffffff8111801561073b57600080fd5b50604051908082528060200260200182016040528015610765578160200160208202803683370190505b50915060005b82518110156108f4578573ffffffffffffffffffffffffffffffffffffffff1688828151811061079757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141561085c57876001895103815181106107cb57fe5b60200260200101518482815181106107df57fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015261083f610819670de0b6b3a764000087610b94565b8860018a51038151811061082957fe5b6020026020010151610d1590919063ffffffff16565b83828151811061084b57fe5b6020026020010181815250506108db565b87818151811061086857fe5b602002602001015184828151811061087c57fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526108c26108b6670de0b6b3a764000087610b94565b88838151811061082957fe5b8382815181106108ce57fe5b6020026020010181815250505b6108ea83828151811061060557fe5b915060010161076b565b50670de0b6b3a7640000811461095c5761093f610919670de0b6b3a764000083610b94565b8360018551038151811061092957fe5b6020026020010151610be290919063ffffffff16565b8260018451038151811061094f57fe5b6020026020010181815250505b5097509795505050505050565b816109775761097781610d5f565b5050565b60008061098783610d8c565b91509150804210156109ae576109ae8242106109a55761015c6109a9565b61015d5b610d5f565b505050565b6040805160018082528183019092526060916020808301908036833701905050905082816000815181106109e357fe5b73ffffffffffffffffffffffffffffffffffffffff92909216602092830291909101909101526040805160018082528183019092526060918160200160208202803683370190505090508281600081518110610a3b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508573ffffffffffffffffffffffffffffffffffffffff166366a9c7d28684846040518463ffffffff1660e01b8152600401808481526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610aed578181015183820152602001610ad5565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610b2c578181015183820152602001610b14565b5050505090500195505050505050600060405180830381600087803b158015610b5457600080fd5b505af1158015610b68573d6000803e3d6000fd5b50505050505050505050565b6000610b808184610db0565b9050610b8d818384610e40565b9392505050565b6000610ba4838311156001610969565b50900390565b6000828202610bce841580610bc7575083858381610bc457fe5b04145b6003610969565b670de0b6b3a7640000815b04949350505050565b6000828201610b8d8482101583610969565b604080516001808252818301909252606091602080830190803683370190505090508181600081518110610c2457fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508373ffffffffffffffffffffffffffffffffffffffff16637d3aeb9684836040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610cd1578181015183820152602001610cb9565b505050509050019350505050600060405180830381600087803b158015610cf757600080fd5b505af1158015610d0b573d6000803e3d6000fd5b5050505050505050565b6000610d248215156004610969565b670de0b6b3a76400008302610d56841580610d4f5750670de0b6b3a7640000858381610d4c57fe5b04145b6005610969565b828181610bd957fe5b610d89817f42414c0000000000000000000000000000000000000000000000000000000000610e65565b50565b600080610d9b83826020610ee0565b9150610da983602080610ee0565b9050915091565b6000610b8d610e358373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610dfe57600080fd5b505afa158015610e12573d6000803e3d6000fd5b505050506040513d6020811015610e2857600080fd5b505160129060ff16610b94565b849060806005610f0d565b6000610e5d82604080610e5588888784610f0d565b929190610f0d565b949350505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191901c1690565b6000610f1a848484610f4e565b506001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01811b1992909216911b1790565b610f5d61010083106064610969565b610f8660018210158015610f7f5750610f7b60ff8461010003610f95565b8211155b6064610969565b6109ae83821c156101b4610969565b8082039082110290039056fea264697066735822122005c69310f6998ba386b52d8c337863a31adc49c9548fc8bc9fc0a94c0fe2871864736f6c63430007010033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100405760003560e01c80631face20a14610045578063a20d2e4d14610268575b600080fd5b81801561005157600080fd5b506101c8600480360361010081101561006957600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691602081013591604082013591908101906080810160608201356401000000008111156100ad57600080fd5b8201836020820111156100bf57600080fd5b803590602001918460208302840111640100000000831117156100e157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561013157600080fd5b82018360208201111561014357600080fd5b8035906020019184602083028401116401000000008311171561016557600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505073ffffffffffffffffffffffffffffffffffffffff833581169450602084013516926040013591506104799050565b604051808481526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156102125781810151838201526020016101fa565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610251578181015183820152602001610239565b505050509050019550505050505060405180910390f35b81801561027457600080fd5b506103e0600480360360e081101561028b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691602081013591604082013591908101906080810160608201356401000000008111156102cf57600080fd5b8201836020820111156102e157600080fd5b8035906020019184602083028401116401000000008311171561030357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561035357600080fd5b82018360208201111561036557600080fd5b8035906020019184602083028401116401000000008311171561038757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505073ffffffffffffffffffffffffffffffffffffffff833516935050506020013561069a565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561042457818101518382015260200161040c565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561046357818101518382015260200161044b565b5050505090500194505050505060405180910390f35b60006060806104a373ffffffffffffffffffffffffffffffffffffffff8716301415610162610969565b6104ac8961097b565b6104b88b8b88886109b3565b6104c28685610b74565b92506000885160010167ffffffffffffffff811180156104e157600080fd5b5060405190808252806020026020018201604052801561050b578160200160208202803683370190505b509250875160010167ffffffffffffffff8111801561052957600080fd5b50604051908082528060200260200182016040528015610553578160200160208202803683370190505b50915060005b88518110156106265789818151811061056e57fe5b602002602001015184828151811061058257fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526105de6105bc670de0b6b3a764000088610b94565b8a83815181106105c857fe5b6020026020010151610baa90919063ffffffff16565b8382815181106105ea57fe5b60200260200101818152505061061c83828151811061060557fe5b602002602001015183610be290919063ffffffff16565b9150600101610559565b50868360018551038151811061063857fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015261066f670de0b6b3a764000082610b94565b8260018451038151811061067f57fe5b60200260200101818152505050985098509895505050505050565b6060806106c273ffffffffffffffffffffffffffffffffffffffff8516301415610162610969565b6106cb8761097b565b6106d6898986610bf4565b6000600187510367ffffffffffffffff811180156106f357600080fd5b5060405190808252806020026020018201604052801561071d578160200160208202803683370190505b509250600186510367ffffffffffffffff8111801561073b57600080fd5b50604051908082528060200260200182016040528015610765578160200160208202803683370190505b50915060005b82518110156108f4578573ffffffffffffffffffffffffffffffffffffffff1688828151811061079757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141561085c57876001895103815181106107cb57fe5b60200260200101518482815181106107df57fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015261083f610819670de0b6b3a764000087610b94565b8860018a51038151811061082957fe5b6020026020010151610d1590919063ffffffff16565b83828151811061084b57fe5b6020026020010181815250506108db565b87818151811061086857fe5b602002602001015184828151811061087c57fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526108c26108b6670de0b6b3a764000087610b94565b88838151811061082957fe5b8382815181106108ce57fe5b6020026020010181815250505b6108ea83828151811061060557fe5b915060010161076b565b50670de0b6b3a7640000811461095c5761093f610919670de0b6b3a764000083610b94565b8360018551038151811061092957fe5b6020026020010151610be290919063ffffffff16565b8260018451038151811061094f57fe5b6020026020010181815250505b5097509795505050505050565b816109775761097781610d5f565b5050565b60008061098783610d8c565b91509150804210156109ae576109ae8242106109a55761015c6109a9565b61015d5b610d5f565b505050565b6040805160018082528183019092526060916020808301908036833701905050905082816000815181106109e357fe5b73ffffffffffffffffffffffffffffffffffffffff92909216602092830291909101909101526040805160018082528183019092526060918160200160208202803683370190505090508281600081518110610a3b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508573ffffffffffffffffffffffffffffffffffffffff166366a9c7d28684846040518463ffffffff1660e01b8152600401808481526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610aed578181015183820152602001610ad5565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610b2c578181015183820152602001610b14565b5050505090500195505050505050600060405180830381600087803b158015610b5457600080fd5b505af1158015610b68573d6000803e3d6000fd5b50505050505050505050565b6000610b808184610db0565b9050610b8d818384610e40565b9392505050565b6000610ba4838311156001610969565b50900390565b6000828202610bce841580610bc7575083858381610bc457fe5b04145b6003610969565b670de0b6b3a7640000815b04949350505050565b6000828201610b8d8482101583610969565b604080516001808252818301909252606091602080830190803683370190505090508181600081518110610c2457fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508373ffffffffffffffffffffffffffffffffffffffff16637d3aeb9684836040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610cd1578181015183820152602001610cb9565b505050509050019350505050600060405180830381600087803b158015610cf757600080fd5b505af1158015610d0b573d6000803e3d6000fd5b5050505050505050565b6000610d248215156004610969565b670de0b6b3a76400008302610d56841580610d4f5750670de0b6b3a7640000858381610d4c57fe5b04145b6005610969565b828181610bd957fe5b610d89817f42414c0000000000000000000000000000000000000000000000000000000000610e65565b50565b600080610d9b83826020610ee0565b9150610da983602080610ee0565b9050915091565b6000610b8d610e358373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610dfe57600080fd5b505afa158015610e12573d6000803e3d6000fd5b505050506040513d6020811015610e2857600080fd5b505160129060ff16610b94565b849060806005610f0d565b6000610e5d82604080610e5588888784610f0d565b929190610f0d565b949350505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191901c1690565b6000610f1a848484610f4e565b506001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01811b1992909216911b1790565b610f5d61010083106064610969565b610f8660018210158015610f7f5750610f7b60ff8461010003610f95565b8211155b6064610969565b6109ae83821c156101b4610969565b8082039082110290039056fea264697066735822122005c69310f6998ba386b52d8c337863a31adc49c9548fc8bc9fc0a94c0fe2871864736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/artifact/ManagedPoolAmmLib.json b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/artifact/ManagedPoolAmmLib.json new file mode 100644 index 0000000..9a7a8db --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/artifact/ManagedPoolAmmLib.json @@ -0,0 +1,251 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ManagedPoolAmmLib", + "sourceName": "contracts/managed/ManagedPoolAmmLib.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "enum ManagedPoolAmmLib.BoundCheckKind", + "name": "checkKind", + "type": "ManagedPoolAmmLib.BoundCheckKind" + }, + { + "internalType": "bytes32", + "name": "circuitBreakerState", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "actualSupply", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + } + ], + "name": "checkCircuitBreaker", + "outputs": [], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "actualSupply", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "circuitBreakerStates", + "type": "bytes32[]" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "normalizedWeights", + "type": "uint256[]" + }, + { + "internalType": "bool", + "name": "isJoin", + "type": "bool" + } + ], + "name": "checkCircuitBreakers", + "outputs": [], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "circuitBreakerState", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "actualSupply", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isLowerBound", + "type": "bool" + } + ], + "name": "checkOneSidedCircuitBreaker", + "outputs": [], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "actualSupply", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "scalingFactors", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "normalizedWeights", + "type": "uint256[]" + }, + { + "internalType": "bytes32", + "name": "poolState", + "type": "bytes32" + }, + { + "internalType": "bytes32[]", + "name": "circuitBreakerStates", + "type": "bytes32[]" + }, + { + "internalType": "contract IExternalWeightedMath", + "name": "weightedMath", + "type": "IExternalWeightedMath" + } + ], + "name": "exitPool", + "outputs": [ + { + "internalType": "uint256", + "name": "bptAmountIn", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "actualSupply", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "scalingFactors", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "normalizedWeights", + "type": "uint256[]" + }, + { + "internalType": "bytes32", + "name": "poolState", + "type": "bytes32" + }, + { + "internalType": "bytes32[]", + "name": "circuitBreakerStates", + "type": "bytes32[]" + }, + { + "internalType": "contract IExternalWeightedMath", + "name": "weightedMath", + "type": "IExternalWeightedMath" + } + ], + "name": "joinPool", + "outputs": [ + { + "internalType": "uint256", + "name": "bptAmountOut", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x611a76610026600b82828239805160001a60731461001957fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100715760003560e01c8063874b47821161005a578063874b4782146102e7578063b8b0f7991461031f578063b8e7b8481461065957610071565b806328e379f5146100765780638249e4b9146102b0575b600080fd5b6102ae600480360360c081101561008c57600080fd5b813591908101906040810160208201356401000000008111156100ae57600080fd5b8201836020820111156100c057600080fd5b803590602001918460208302840111640100000000831117156100e257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561013257600080fd5b82018360208201111561014457600080fd5b8035906020019184602083028401116401000000008311171561016657600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156101b657600080fd5b8201836020820111156101c857600080fd5b803590602001918460208302840111640100000000831117156101ea57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561023a57600080fd5b82018360208201111561024c57600080fd5b8035906020019184602083028401116401000000008311171561026e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505050503515159050610938565b005b6102ae600480360360a08110156102c657600080fd5b508035906020810135906040810135906060810135906080013515156109d2565b6102ae600480360360a08110156102fd57600080fd5b5060ff8135169060208101359060408101359060608101359060800135610a02565b6105fe600480360361010081101561033657600080fd5b81019060208101813564010000000081111561035157600080fd5b82018360208201111561036357600080fd5b8035906020019184602083028401116401000000008311171561038557600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156103d557600080fd5b8201836020820111156103e757600080fd5b8035906020019184600183028401116401000000008311171561040957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295843595909490935060408101925060200135905064010000000081111561046457600080fd5b82018360208201111561047657600080fd5b8035906020019184602083028401116401000000008311171561049857600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156104e857600080fd5b8201836020820111156104fa57600080fd5b8035906020019184602083028401116401000000008311171561051c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295843595909490935060408101925060200135905064010000000081111561057457600080fd5b82018360208201111561058657600080fd5b803590602001918460208302840111640100000000831117156105a857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505050903573ffffffffffffffffffffffffffffffffffffffff169150610a799050565b6040518083815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561064457818101518382015260200161062c565b50505050905001935050505060405180910390f35b6105fe600480360361010081101561067057600080fd5b81019060208101813564010000000081111561068b57600080fd5b82018360208201111561069d57600080fd5b803590602001918460208302840111640100000000831117156106bf57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561070f57600080fd5b82018360208201111561072157600080fd5b8035906020019184600183028401116401000000008311171561074357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295843595909490935060408101925060200135905064010000000081111561079e57600080fd5b8201836020820111156107b057600080fd5b803590602001918460208302840111640100000000831117156107d257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561082257600080fd5b82018360208201111561083457600080fd5b8035906020019184602083028401116401000000008311171561085657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929584359590949093506040810192506020013590506401000000008111156108ae57600080fd5b8201836020820111156108c057600080fd5b803590602001918460208302840111640100000000831117156108e257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505050903573ffffffffffffffffffffffffffffffffffffffff169150610af09050565b60005b84518110156109c957600061098a86838151811061095557fe5b602002602001015186848151811061096957fe5b60200260200101518561097e57610b34610982565b610b4f5b63ffffffff16565b90506109c0600288848151811061099d57fe5b60200260200101518a848887815181106109b357fe5b6020026020010151610a02565b5060010161093b565b50505050505050565b60006109df868484610b68565b90506109fa6109f18685878587610cbd565b15610164610d03565b505050505050565b6000856002811115610a1057fe5b1480610a2757506002856002811115610a2557fe5b145b15610a3a57610a3a8484848460016109d2565b6001856002811115610a4857fe5b1480610a5f57506002856002811115610a5d57fe5b145b15610a7257610a728484848460006109d2565b5050505050565b60006060610a878a88610d15565b610a968a87898b8d8a89610d84565b90925090506001610aa68a611315565b6002811115610ab157fe5b14610ace57610ace610ac38984610b34565b858c848a6000610938565b610ad88188611334565b610ae18161139d565b90509850989650505050505050565b60006060610afe8a88610d15565b610b0d8a87898b8d8a8961142f565b9092509050610b2a610b1f8984610b4f565b858c848a6001610938565b610ad8818861157b565b6000610b44838311156001610d03565b508082035b92915050565b6000828201610b618482101583610d03565b9392505050565b6000806030610b8884610b7c576010610b7f565b60005b879060106115e4565b901b905080610b9b576000915050610b61565b6000610ba9866060806115e4565b90506000610bba87602060406115e4565b9050600081871415610bfd57610bf66020678ac7230489e80000610bef89610be35760e0610be6565b60c05b8c9060206115e4565b9190611611565b9050610ca6565b604080517ff4d8cb7c00000000000000000000000000000000000000000000000000000000815260048101869052602481018990528715156044820152905173__$6670886e635fd86503a30ff6f4e4ebb80f$__9163f4d8cb7c916064808301926020929190829003018186803b158015610c7757600080fd5b505af4158015610c8b573d6000803e3d6000fd5b505050506040513d6020811015610ca157600080fd5b505190505b610cb1818488611676565b98975050505050505050565b600082610ccc57506000610cfa565b6000610ce3610cdb8888611697565b8685156116bb565b905082610cf257838111610cf6565b8381105b9150505b95945050505050565b81610d1157610d11816116db565b5050565b81518151610d24908290611708565b60005b81811015610d7e57610d5f848281518110610d3e57fe5b6020026020010151848381518110610d5257fe5b6020026020010151611715565b848281518110610d6b57fe5b6020908102919091010152600101610d27565b50505050565b60006060610d9c610d9485611743565b610166610d03565b6000610da786611315565b9050610dd3610db586611750565b80610dcb57506001826002811115610dc957fe5b145b61014a610d03565b6000816002811115610de157fe5b1415611036578373ffffffffffffffffffffffffffffffffffffffff16633d0b05e98b8b8a610e0f8a61175d565b8b6040518663ffffffff1660e01b815260040180806020018060200186815260200185815260200180602001848103845289818151815260200191508051906020019060200280838360005b83811015610e73578181015183820152602001610e5b565b50505050905001848103835288818151815260200191508051906020019060200280838360005b83811015610eb2578181015183820152602001610e9a565b50505050905001848103825285818151815260200191508051906020019080838360005b83811015610eee578181015183820152602001610ed6565b50505050905090810190601f168015610f1b5780820380516001836020036101000a031916815260200191505b509850505050505050505060006040518083038186803b158015610f3e57600080fd5b505afa158015610f52573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040908152811015610f9957600080fd5b815160208301805160405192949293830192919084640100000000821115610fc057600080fd5b908301906020820185811115610fd557600080fd5b8251866020820283011164010000000082111715610ff257600080fd5b82525081516020918201928201910280838360005b8381101561101f578181015183820152602001611007565b505050509050016040525050509250925050611309565b600181600281111561104457fe5b141561114b578373ffffffffffffffffffffffffffffffffffffffff16631b2db0ea8b89896040518463ffffffff1660e01b8152600401808060200184815260200180602001838103835286818151815260200191508051906020019060200280838360005b838110156110c25781810151838201526020016110aa565b50505050905001838103825284818151815260200191508051906020019080838360005b838110156110fe5781810151838201526020016110e6565b50505050905090810190601f16801561112b5780820380516001836020036101000a031916815260200191505b509550505050505060006040518083038186803b158015610f3e57600080fd5b600281600281111561115957fe5b14156112fc578373ffffffffffffffffffffffffffffffffffffffff16632ac71a3e8b8b8b8b6111888b61175d565b8c6040518763ffffffff1660e01b8152600401808060200180602001806020018781526020018681526020018060200185810385528b818151815260200191508051906020019060200280838360005b838110156111f05781810151838201526020016111d8565b5050505090500185810384528a818151815260200191508051906020019060200280838360005b8381101561122f578181015183820152602001611217565b50505050905001858103835289818151815260200191508051906020019060200280838360005b8381101561126e578181015183820152602001611256565b50505050905001858103825286818151815260200191508051906020019080838360005b838110156112aa578181015183820152602001611292565b50505050905090810190601f1680156112d75780820380516001836020036101000a031916815260200191505b509a505050505050505050505060006040518083038186803b158015610f3e57600080fd5b6113076101506116db565b505b97509795505050505050565b600081806020019051602081101561132c57600080fd5b505192915050565b81518151611343908290611708565b60005b81811015610d7e5761137e84828151811061135d57fe5b602002602001015184838151811061137157fe5b602002602001015161178c565b84828151811061138a57fe5b6020908102919091010152600101611346565b6060815160010167ffffffffffffffff811180156113ba57600080fd5b506040519080825280602002602001820160405280156113e4578160200160208202803683370190505b50905060005b8251811015611429578281815181106113ff57fe5b602002602001015182826001018151811061141657fe5b60209081029190910101526001016113ea565b50919050565b6000606061143f610d9485611743565b600061144a86611315565b905061146c61145886611750565b80610dcb57506003826003811115610dc957fe5b600181600381111561147a57fe5b14156114a9578373ffffffffffffffffffffffffffffffffffffffff1663120c0c638b8b8b8b6111888b61175d565b60028160038111156114b757fe5b14156114e5578373ffffffffffffffffffffffffffffffffffffffff1663098e01898b8b8a610e0f8a61175d565b60038160038111156114f357fe5b1415611570578373ffffffffffffffffffffffffffffffffffffffff166303a5b64b8b89896040518463ffffffff1660e01b815260040180806020018481526020018060200183810383528681815181526020019150805190602001906020028083836000838110156110c25781810151838201526020016110aa565b6113076101366116db565b8151815161158a908290611708565b60005b81811015610d7e576115c58482815181106115a457fe5b60200260200101518483815181106115b857fe5b60200260200101516117d6565b8482815181106115d157fe5b602090810291909101015260010161158d565b6001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191901c1690565b600061162f60028410158015611628575060ff8411155b6064610d03565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001841b01611663818611156064610d03565b610cfa6116708685611697565b82611823565b600061168f83858461168a57611715610982565b611843565b949350505050565b6000828202610b618415806116b45750838583816116b157fe5b04145b6003610d03565b6000816116d1576116cc8484611823565b61168f565b61168f848461187b565b611705817f42414c00000000000000000000000000000000000000000000000000000000006118ba565b50565b610d118183146067610d03565b600082820261172f8415806116b45750838583816116b157fe5b670de0b6b3a7640000815b04949350505050565b6000610b498260ff611935565b6000610b498260fc611935565b600080600080600061176e8661193c565b935093509350935061178282828686611984565b9695505050505050565b600061179b8215156004610d03565b670de0b6b3a764000083026117cd8415806117c65750670de0b6b3a76400008583816117c357fe5b04145b6005610d03565b82818161173a57fe5b60006117e58215156004610d03565b670de0b6b3a7640000830261180d8415806117c65750670de0b6b3a76400008583816117c357fe5b6001836001830304018115150291505092915050565b60006118328215156004610d03565b81838161183b57fe5b049392505050565b600082820261185d8415806116b45750838583816116b157fe5b6001670de0b6b3a76400006001830304018115150291505092915050565b600061188a8215156004610d03565b508115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201046001010290565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b1c60011690565b600080808061194e85604060206115e4565b935061195d85606060206115e4565b925061196c856080603e6115e4565b915061197b8560be603e6115e4565b90509193509193565b600080611991848461199e565b90506117828686836119d6565b60008142106119b65750670de0b6b3a7640000610b49565b8242116119c557506000610b49565b82820342849003610cfa818361178c565b6000670de0b6b3a7640000821015806119ee57508284145b156119fa575081610b61565b81611a06575082610b61565b82841115611a27576000611a1c83858703611715565b85039150610b619050565b6000611a3583868603611715565b85019150610b61905056fea26469706673582212207f93323ce9fc3fb858adc332b438e477f02b2ea07e7e22f5d651b2b4783633b164736f6c63430007010033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100715760003560e01c8063874b47821161005a578063874b4782146102e7578063b8b0f7991461031f578063b8e7b8481461065957610071565b806328e379f5146100765780638249e4b9146102b0575b600080fd5b6102ae600480360360c081101561008c57600080fd5b813591908101906040810160208201356401000000008111156100ae57600080fd5b8201836020820111156100c057600080fd5b803590602001918460208302840111640100000000831117156100e257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561013257600080fd5b82018360208201111561014457600080fd5b8035906020019184602083028401116401000000008311171561016657600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156101b657600080fd5b8201836020820111156101c857600080fd5b803590602001918460208302840111640100000000831117156101ea57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561023a57600080fd5b82018360208201111561024c57600080fd5b8035906020019184602083028401116401000000008311171561026e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505050503515159050610938565b005b6102ae600480360360a08110156102c657600080fd5b508035906020810135906040810135906060810135906080013515156109d2565b6102ae600480360360a08110156102fd57600080fd5b5060ff8135169060208101359060408101359060608101359060800135610a02565b6105fe600480360361010081101561033657600080fd5b81019060208101813564010000000081111561035157600080fd5b82018360208201111561036357600080fd5b8035906020019184602083028401116401000000008311171561038557600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156103d557600080fd5b8201836020820111156103e757600080fd5b8035906020019184600183028401116401000000008311171561040957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295843595909490935060408101925060200135905064010000000081111561046457600080fd5b82018360208201111561047657600080fd5b8035906020019184602083028401116401000000008311171561049857600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156104e857600080fd5b8201836020820111156104fa57600080fd5b8035906020019184602083028401116401000000008311171561051c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295843595909490935060408101925060200135905064010000000081111561057457600080fd5b82018360208201111561058657600080fd5b803590602001918460208302840111640100000000831117156105a857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505050903573ffffffffffffffffffffffffffffffffffffffff169150610a799050565b6040518083815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561064457818101518382015260200161062c565b50505050905001935050505060405180910390f35b6105fe600480360361010081101561067057600080fd5b81019060208101813564010000000081111561068b57600080fd5b82018360208201111561069d57600080fd5b803590602001918460208302840111640100000000831117156106bf57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561070f57600080fd5b82018360208201111561072157600080fd5b8035906020019184600183028401116401000000008311171561074357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295843595909490935060408101925060200135905064010000000081111561079e57600080fd5b8201836020820111156107b057600080fd5b803590602001918460208302840111640100000000831117156107d257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561082257600080fd5b82018360208201111561083457600080fd5b8035906020019184602083028401116401000000008311171561085657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929584359590949093506040810192506020013590506401000000008111156108ae57600080fd5b8201836020820111156108c057600080fd5b803590602001918460208302840111640100000000831117156108e257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505050903573ffffffffffffffffffffffffffffffffffffffff169150610af09050565b60005b84518110156109c957600061098a86838151811061095557fe5b602002602001015186848151811061096957fe5b60200260200101518561097e57610b34610982565b610b4f5b63ffffffff16565b90506109c0600288848151811061099d57fe5b60200260200101518a848887815181106109b357fe5b6020026020010151610a02565b5060010161093b565b50505050505050565b60006109df868484610b68565b90506109fa6109f18685878587610cbd565b15610164610d03565b505050505050565b6000856002811115610a1057fe5b1480610a2757506002856002811115610a2557fe5b145b15610a3a57610a3a8484848460016109d2565b6001856002811115610a4857fe5b1480610a5f57506002856002811115610a5d57fe5b145b15610a7257610a728484848460006109d2565b5050505050565b60006060610a878a88610d15565b610a968a87898b8d8a89610d84565b90925090506001610aa68a611315565b6002811115610ab157fe5b14610ace57610ace610ac38984610b34565b858c848a6000610938565b610ad88188611334565b610ae18161139d565b90509850989650505050505050565b60006060610afe8a88610d15565b610b0d8a87898b8d8a8961142f565b9092509050610b2a610b1f8984610b4f565b858c848a6001610938565b610ad8818861157b565b6000610b44838311156001610d03565b508082035b92915050565b6000828201610b618482101583610d03565b9392505050565b6000806030610b8884610b7c576010610b7f565b60005b879060106115e4565b901b905080610b9b576000915050610b61565b6000610ba9866060806115e4565b90506000610bba87602060406115e4565b9050600081871415610bfd57610bf66020678ac7230489e80000610bef89610be35760e0610be6565b60c05b8c9060206115e4565b9190611611565b9050610ca6565b604080517ff4d8cb7c00000000000000000000000000000000000000000000000000000000815260048101869052602481018990528715156044820152905173__$6670886e635fd86503a30ff6f4e4ebb80f$__9163f4d8cb7c916064808301926020929190829003018186803b158015610c7757600080fd5b505af4158015610c8b573d6000803e3d6000fd5b505050506040513d6020811015610ca157600080fd5b505190505b610cb1818488611676565b98975050505050505050565b600082610ccc57506000610cfa565b6000610ce3610cdb8888611697565b8685156116bb565b905082610cf257838111610cf6565b8381105b9150505b95945050505050565b81610d1157610d11816116db565b5050565b81518151610d24908290611708565b60005b81811015610d7e57610d5f848281518110610d3e57fe5b6020026020010151848381518110610d5257fe5b6020026020010151611715565b848281518110610d6b57fe5b6020908102919091010152600101610d27565b50505050565b60006060610d9c610d9485611743565b610166610d03565b6000610da786611315565b9050610dd3610db586611750565b80610dcb57506001826002811115610dc957fe5b145b61014a610d03565b6000816002811115610de157fe5b1415611036578373ffffffffffffffffffffffffffffffffffffffff16633d0b05e98b8b8a610e0f8a61175d565b8b6040518663ffffffff1660e01b815260040180806020018060200186815260200185815260200180602001848103845289818151815260200191508051906020019060200280838360005b83811015610e73578181015183820152602001610e5b565b50505050905001848103835288818151815260200191508051906020019060200280838360005b83811015610eb2578181015183820152602001610e9a565b50505050905001848103825285818151815260200191508051906020019080838360005b83811015610eee578181015183820152602001610ed6565b50505050905090810190601f168015610f1b5780820380516001836020036101000a031916815260200191505b509850505050505050505060006040518083038186803b158015610f3e57600080fd5b505afa158015610f52573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040908152811015610f9957600080fd5b815160208301805160405192949293830192919084640100000000821115610fc057600080fd5b908301906020820185811115610fd557600080fd5b8251866020820283011164010000000082111715610ff257600080fd5b82525081516020918201928201910280838360005b8381101561101f578181015183820152602001611007565b505050509050016040525050509250925050611309565b600181600281111561104457fe5b141561114b578373ffffffffffffffffffffffffffffffffffffffff16631b2db0ea8b89896040518463ffffffff1660e01b8152600401808060200184815260200180602001838103835286818151815260200191508051906020019060200280838360005b838110156110c25781810151838201526020016110aa565b50505050905001838103825284818151815260200191508051906020019080838360005b838110156110fe5781810151838201526020016110e6565b50505050905090810190601f16801561112b5780820380516001836020036101000a031916815260200191505b509550505050505060006040518083038186803b158015610f3e57600080fd5b600281600281111561115957fe5b14156112fc578373ffffffffffffffffffffffffffffffffffffffff16632ac71a3e8b8b8b8b6111888b61175d565b8c6040518763ffffffff1660e01b8152600401808060200180602001806020018781526020018681526020018060200185810385528b818151815260200191508051906020019060200280838360005b838110156111f05781810151838201526020016111d8565b5050505090500185810384528a818151815260200191508051906020019060200280838360005b8381101561122f578181015183820152602001611217565b50505050905001858103835289818151815260200191508051906020019060200280838360005b8381101561126e578181015183820152602001611256565b50505050905001858103825286818151815260200191508051906020019080838360005b838110156112aa578181015183820152602001611292565b50505050905090810190601f1680156112d75780820380516001836020036101000a031916815260200191505b509a505050505050505050505060006040518083038186803b158015610f3e57600080fd5b6113076101506116db565b505b97509795505050505050565b600081806020019051602081101561132c57600080fd5b505192915050565b81518151611343908290611708565b60005b81811015610d7e5761137e84828151811061135d57fe5b602002602001015184838151811061137157fe5b602002602001015161178c565b84828151811061138a57fe5b6020908102919091010152600101611346565b6060815160010167ffffffffffffffff811180156113ba57600080fd5b506040519080825280602002602001820160405280156113e4578160200160208202803683370190505b50905060005b8251811015611429578281815181106113ff57fe5b602002602001015182826001018151811061141657fe5b60209081029190910101526001016113ea565b50919050565b6000606061143f610d9485611743565b600061144a86611315565b905061146c61145886611750565b80610dcb57506003826003811115610dc957fe5b600181600381111561147a57fe5b14156114a9578373ffffffffffffffffffffffffffffffffffffffff1663120c0c638b8b8b8b6111888b61175d565b60028160038111156114b757fe5b14156114e5578373ffffffffffffffffffffffffffffffffffffffff1663098e01898b8b8a610e0f8a61175d565b60038160038111156114f357fe5b1415611570578373ffffffffffffffffffffffffffffffffffffffff166303a5b64b8b89896040518463ffffffff1660e01b815260040180806020018481526020018060200183810383528681815181526020019150805190602001906020028083836000838110156110c25781810151838201526020016110aa565b6113076101366116db565b8151815161158a908290611708565b60005b81811015610d7e576115c58482815181106115a457fe5b60200260200101518483815181106115b857fe5b60200260200101516117d6565b8482815181106115d157fe5b602090810291909101015260010161158d565b6001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191901c1690565b600061162f60028410158015611628575060ff8411155b6064610d03565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001841b01611663818611156064610d03565b610cfa6116708685611697565b82611823565b600061168f83858461168a57611715610982565b611843565b949350505050565b6000828202610b618415806116b45750838583816116b157fe5b04145b6003610d03565b6000816116d1576116cc8484611823565b61168f565b61168f848461187b565b611705817f42414c00000000000000000000000000000000000000000000000000000000006118ba565b50565b610d118183146067610d03565b600082820261172f8415806116b45750838583816116b157fe5b670de0b6b3a7640000815b04949350505050565b6000610b498260ff611935565b6000610b498260fc611935565b600080600080600061176e8661193c565b935093509350935061178282828686611984565b9695505050505050565b600061179b8215156004610d03565b670de0b6b3a764000083026117cd8415806117c65750670de0b6b3a76400008583816117c357fe5b04145b6005610d03565b82818161173a57fe5b60006117e58215156004610d03565b670de0b6b3a7640000830261180d8415806117c65750670de0b6b3a76400008583816117c357fe5b6001836001830304018115150291505092915050565b60006118328215156004610d03565b81838161183b57fe5b049392505050565b600082820261185d8415806116b45750838583816116b157fe5b6001670de0b6b3a76400006001830304018115150291505092915050565b600061188a8215156004610d03565b508115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201046001010290565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b1c60011690565b600080808061194e85604060206115e4565b935061195d85606060206115e4565b925061196c856080603e6115e4565b915061197b8560be603e6115e4565b90509193509193565b600080611991848461199e565b90506117828686836119d6565b60008142106119b65750670de0b6b3a7640000610b49565b8242116119c557506000610b49565b82820342849003610cfa818361178c565b6000670de0b6b3a7640000821015806119ee57508284145b156119fa575081610b61565b81611a06575082610b61565b82841115611a27576000611a1c83858703611715565b85039150610b619050565b6000611a3583868603611715565b85019150610b61905056fea26469706673582212207f93323ce9fc3fb858adc332b438e477f02b2ea07e7e22f5d651b2b4783633b164736f6c63430007010033", + "linkReferences": { + "contracts/lib/CircuitBreakerLib.sol": { + "CircuitBreakerLib": [ + { + "length": 20, + "start": 3172 + } + ] + } + }, + "deployedLinkReferences": { + "contracts/lib/CircuitBreakerLib.sol": { + "CircuitBreakerLib": [ + { + "length": 20, + "start": 3134 + } + ] + } + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/artifact/ManagedPoolFactory.json b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/artifact/ManagedPoolFactory.json new file mode 100644 index 0000000..9d66d46 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/artifact/ManagedPoolFactory.json @@ -0,0 +1,415 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ManagedPoolFactory", + "sourceName": "contracts/managed/ManagedPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "contract IExternalWeightedMath", + "name": "externalWeightedMath", + "type": "address" + }, + { + "internalType": "contract IRecoveryModeHelper", + "name": "recoveryModeHelper", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "poolVersion", + "type": "string" + }, + { + "internalType": "uint256", + "name": "initialPauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "address[]", + "name": "assetManagers", + "type": "address[]" + } + ], + "internalType": "struct ManagedPool.ManagedPoolParams", + "name": "params", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "normalizedWeights", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "swapEnabledOnStart", + "type": "bool" + }, + { + "internalType": "bool", + "name": "mustAllowlistLPs", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "managementAumFeePercentage", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "aumFeeId", + "type": "uint256" + } + ], + "internalType": "struct ManagedPoolSettings.ManagedPoolSettingsParams", + "name": "settingsParams", + "type": "tuple" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeePercentagesProvider", + "outputs": [ + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRecoveryModeHelper", + "outputs": [ + { + "internalType": "contract IRecoveryModeHelper", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWeightedMath", + "outputs": [ + { + "internalType": "contract IExternalWeightedMath", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6102006040523480156200001257600080fd5b506040516200903f3803806200903f8339810160408190526200003591620003c1565b87878383604051806020016200004b9062000270565b601f1982820381018352601f9091011660405282828630848d6200006f8162000182565b5080516002810460a081905280820360e0819052818452836200009e816200019b602090811b6200067d17901c565b60601b6001600160601b0319166080528285018051838252620000cd826200019b602090811b6200067d17901c565b6001600160601b0319606091821b811660c0529690935290526101009590955250509290911b909116610120525062000110630163f500831115610194620001ef565b620001246276a700821115610195620001ef565b610140829052610160524201610180525050506001600160601b0319606091821b81166101a05288821b81166101c0529087901b166101e052508251620001739060039060208601906200027e565b505050505050505050620004a7565b8051620001979060009060208401906200027e565b5050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001e96001600160a01b03831615156101ac620001ef565b50919050565b81620001975762000197816200020c816210905360ea1b6200020f565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b617932806200170d83390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002c157805160ff1916838001178555620002f1565b82800160010185558215620002f1579182015b82811115620002f1578251825591602001919060010190620002d4565b50620002ff92915062000303565b5090565b5b80821115620002ff576000815560010162000304565b600082601f8301126200032b578081fd5b81516001600160401b038082111562000342578283fd5b6040516020601f8401601f191682018101838111838210171562000364578586fd5b806040525081945083825286818588010111156200038157600080fd5b600092505b83831015620003a5578583018101518284018201529182019162000386565b83831115620003b75760008185840101525b5050505092915050565b600080600080600080600080610100898b031215620003de578384fd5b8851620003eb8162000491565b60208a0151909850620003fe8162000491565b60408a0151909750620004118162000491565b60608a0151909650620004248162000491565b60808a01519095506001600160401b038082111562000441578586fd5b6200044f8c838d016200031a565b955060a08b015191508082111562000465578485fd5b50620004748b828c016200031a565b60c08b015160e0909b0151999c989b509699959894979350505050565b6001600160a01b03811681146200020c57600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405161016051610180516101a05160601c6101c05160601c6101e05160601c6111ba62000553600039806104c452806105bd52508061039952806104955250806105475250806102385280610261525080610285525050806105e152508061056d5250806106d752508061020f52806107535250806106f85250806101ee528061072f52506111ba6000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80636634b753116100875780636634b753146101525780636c57f5a9146101725780637304b8b91461017a578063739238d61461018d578063851c1bb3146101955780638a47ae3b146101b55780638d928af8146101bd578063aaabadc5146101c5576100d4565b8062c194db146100d9578063174481fa146100f75780632da47c401461010d5780632f2770db146101235780633f819b6f1461012d578063508f0eae1461013557806354fd4d501461014a575b600080fd5b6100e16101cd565b6040516100ee9190611027565b60405180910390f35b6100ff6101ec565b6040516100ee929190610fda565b610115610232565b6040516100ee929190611100565b61012b6102b9565b005b6100e1610301565b61013d610397565b6040516100ee9190610fc6565b6100e16103bb565b610165610160366004610c3d565b61041c565b6040516100ee9190610ff4565b61016561043a565b61013d610188366004610cb9565b610443565b61013d610545565b6101a86101a3366004610c75565b610569565b6040516100ee9190610fff565b61013d6105bb565b61013d6105df565b61013d610603565b60606101e7604051806020016040528060008152506106cf565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156102ab57807f00000000000000000000000000000000000000000000000000000000000000000392507f000000000000000000000000000000000000000000000000000000000000000091506102b4565b60009250600091505b509091565b6102c16107a8565b6102c96107d9565b6002805460ff191660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561038d5780601f106103625761010080835404028352916020019161038d565b820191906000526020600020905b81548152906001019060200180831161037057829003601f168201915b5050505050905090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561038d5780601f106103625761010080835404028352916020019161038d565b6001600160a01b031660009081526001602052604090205460ff1690565b60025460ff1690565b6000806000610450610232565b9150915061045c6109d6565b6040518060e0016040528061046f6105df565b6001600160a01b03168152602001610485610545565b6001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602001848152602001838152602001610505610301565b815250905061053988828989604051602001610524949392919061103a565b604051602081830303815290604052866107ee565b98975050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f00000000000000000000000000000000000000000000000000000000000000008260405160200161059e929190610fae565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061060d6105df565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561064557600080fd5b505afa158015610659573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e79190610c9d565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506106c96001600160a01b03831615156101ac61085e565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010161079a818386610870565b505050505050505050919050565b60006107bf6000356001600160e01b031916610569565b90506107d66107ce82336108ae565b61019161085e565b50565b6107ec6107e461043a565b1560d361085e565b565b60006107f86107d9565b6000610804848461093e565b6001600160a01b0381166000818152600160208190526040808320805460ff19169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a290505b92915050565b8161086c5761086c8161097b565b5050565b5b60208110610890578151835260209283019290910190601f1901610871565b905182516020929092036101000a6000190180199091169116179052565b60006108b8610603565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016108e793929190611008565b60206040518083038186803b1580156108ff57600080fd5b505afa158015610913573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109379190610c59565b9392505050565b6000606061094b846106cf565b90506000838251602084016000f590506001600160a01b038116610973573d6000803e3d6000fd5b949350505050565b62461bcd60e51b600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526107d6916210905360ea1b906242414c90606490fd5b6040518060e0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001606081525090565b803561085881611161565b600082601f830112610a52578081fd5b8135610a65610a6082611135565b61110e565b818152915060208083019084810181840286018201871015610a8657600080fd5b60005b84811015610aae578135610a9c81611161565b84529282019290820190600101610a89565b505050505092915050565b600082601f830112610ac9578081fd5b8135610ad7610a6082611135565b818152915060208083019084810181840286018201871015610af857600080fd5b60005b84811015610aae57813584529282019290820190600101610afb565b803561085881611176565b600082601f830112610b32578081fd5b813567ffffffffffffffff811115610b48578182fd5b610b5b601f8201601f191660200161110e565b9150808252836020828501011115610b7257600080fd5b8060208401602084013760009082016020015292915050565b600060e08284031215610b9c578081fd5b610ba660e061110e565b9050813567ffffffffffffffff80821115610bc057600080fd5b610bcc85838601610a42565b83526020840135915080821115610be257600080fd5b50610bef84828501610ab9565b60208301525060408201356040820152610c0c8360608401610b17565b6060820152610c1e8360808401610b17565b608082015260a082013560a082015260c082013560c082015292915050565b600060208284031215610c4e578081fd5b813561093781611161565b600060208284031215610c6a578081fd5b815161093781611176565b600060208284031215610c86578081fd5b81356001600160e01b031981168114610937578182fd5b600060208284031215610cae578081fd5b815161093781611161565b60008060008060808587031215610cce578283fd5b843567ffffffffffffffff80821115610ce5578485fd5b9086019060608289031215610cf8578485fd5b610d02606061110e565b823582811115610d10578687fd5b610d1c8a828601610b22565b82525060208084013583811115610d31578788fd5b610d3d8b828701610b22565b8284015250604084013583811115610d53578788fd5b80850194505089601f850112610d67578687fd5b8335610d75610a6082611135565b81815282810190868401848402880185018e1015610d91578a8bfd5b8a97505b83881015610dbc578035610da881611161565b835260019790970196918401918401610d95565b5060408501525091975088013592505080821115610dd8578485fd5b50610de587828801610b8b565b935050610df58660408701610a37565b9396929550929360600135925050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015610e4157815187529582019590820190600101610e25565b509495945050505050565b15159052565b60008151808452815b81811015610e7757602081850181015186830182015201610e5b565b81811115610e885782602083870101525b50601f01601f19169290920160200192915050565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152806060840151166060850152506080820151608084015260a082015160a084015260c082015160e060c085015261097360e0850182610e52565b805160e0808452815190840181905260009160209190820190610100860190845b81811015610f4357610f318451611155565b83529284019291840191600101610f1f565b505082850151915085810383870152610f5c8183610e12565b92505050604083015160408501526060830151610f7c6060860182610e4c565b506080830151610f8f6080860182610e4c565b5060a083015160a085015260c083015160c08501528091505092915050565b9182526001600160e01b031916602082015260240190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b901515815260200190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b6000602082526109376020830184610e52565b60006080825285516060608084015261105660e0840182610e52565b9050602080880151607f19808685030160a08701526110758483610e52565b60408b015187820390920160c0880152815180825291840194508592508301905b808310156110be576110a88551611155565b8252938301936001929092019190830190611096565b50858103838701526110d0818a610e9d565b935050505082810360408401526110e78186610efe565b9150506110f76060830184610e05565b95945050505050565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561112d57600080fd5b604052919050565b600067ffffffffffffffff82111561114b578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146107d657600080fd5b80151581146107d657600080fdfea26469706673582212202f63f9fa4ce4d5cb26280e0345fbb785815d64e85925aabd074582cf439f421364736f6c634300070100336102606040523480156200001257600080fd5b506040516200793238038062007932833981016040819052620000359162001530565b81836020015180604051806060016040528060008152602001600281526020018460c001518152508660000151620000888860000151600189600001518c604001516200044a60201b620019621760201c565b89600001518a602001518a608001518b60a001518a86838387878b86336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000e792919062001158565b508051620000fd90600490602084019062001158565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b1661012052506200017c9050630163f50083111561019462000618565b620001906276a70082111561019562000618565b4291909101610140819052016101605260601b6001600160601b031916610180526101a08690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001f857600080fd5b505afa1580156200020d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000233919062001511565b606090811b6001600160601b03199081166101c052908a901b166101e052505050506040840151600093506200027c92509050601060086200062d602090811b62001b1517901c565b6200029d8360200151600860000160086200062d60201b62001b151760201c565b620002bb8460000151600060086200062d60201b62001b151760201c565b17176102008190529050620002d1838262000642565b50508251519050620002e9600282101560c862000618565b620002fa603282111560c962000618565b6200031681846020015151620008c860201b62001b281760201c565b60a08301516200032690620008d7565b60005b81811015620003a1576000846000015182815181106200034557fe5b602002602001015190506200037e81866020015184815181106200036557fe5b60200260200101516200094960201b62001b391760201c565b6001600160a01b039091166000908152600b602052604090205560010162000329565b5060208301518351620003bb91429182919081906200096d565b6040830151620003d090429081908062000aca565b6060830151620003e09062000b45565b6080830151620003f09062000b93565b620003fc600162000be1565b50505060408301516001600160601b0319606091821b8116610220528185015190911b166102405260c083015180516200043f91600e9160209091019062001158565b505050505062001883565b6000620004628362000c2f60201b62001b521760201c565b606083516001016001600160401b03811180156200047f57600080fd5b50604051908082528060200260200182016040528015620004aa578160200160208202803683370190505b5090503081600081518110620004bc57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156200052f57848181518110620004f657fe5b60200260200101518282600101815181106200050e57fe5b6001600160a01b0390921660209283029190910190910152600101620004df565b50606083516001016001600160401b03811180156200054d57600080fd5b5060405190808252806020026020018201604052801562000578578160200160208202803683370190505b5090506000816000815181106200058b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b8451811015620005fe57848181518110620005c557fe5b6020026020010151828260010181518110620005dd57fe5b6001600160a01b0390921660209283029190910190910152600101620005ae565b506200060d8787848462000c3b565b979650505050505050565b816200062957620006298162000d35565b5050565b60006200063c84848462000d4a565b50501b90565b6000826001600160a01b0316631a7c326362000671600060088662000daa60201b62001b5c179092919060201c565b6040518263ffffffff1660e01b81526004016200068f91906200171e565b60206040518083038186803b158015620006a857600080fd5b505afa158015620006bd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006e39190620014f8565b905060006001600160a01b038416631a7c3263620007108560088062000daa602090811b62001b5c17901c565b6040518263ffffffff1660e01b81526004016200072e91906200171e565b60206040518083038186803b1580156200074757600080fd5b505afa1580156200075c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007829190620014f8565b905060006001600160a01b038516631a7c3263620007b0866010600862000daa602090811b62001b5c17901c565b6040518263ffffffff1660e01b8152600401620007ce91906200171e565b60206040518083038186803b158015620007e757600080fd5b505afa158015620007fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008229190620014f8565b9050600062000845826040806000010160406200062d60201b62001b151760201c565b6200086284604060000160406200062d60201b62001b151760201c565b6200087c86600060406200062d60201b62001b151760201c565b17179050806008819055507fc3f0acc358200d8e08ac6ce20bc2f9f27893a344f813bf682b7859b3e521502e81604051620008b891906200171e565b60405180910390a1505050505050565b62000629828214606762000618565b620008f0670d2f13f7789f000082111561016062000618565b62000909600a548262000db960201b62001b6b1760201c565b600a556040517f556cdf4052d939f8acbe593d83668d2e18500b032bcf51cbbf82b181c6094dd7906200093e9083906200171e565b60405180910390a150565b600062000957818462000de1565b90506200096681838062000e91565b9392505050565b6000805b835181101562000a5c5760008482815181106200098a57fe5b60200260200101519050620009b2662386f26fc1000082101561012e6200061860201b60201c565b620009cc818462000ed360201b62001b7a1790919060201c565b92506000848381518110620009dd57fe5b6020026020010151905062000a38600b6000836001600160a01b03166001600160a01b031681526020019081526020016000205488858151811062000a1e57fe5b60200260200101518462000e9160201b62001b8c1760201c565b6001600160a01b039091166000908152600b60205260409020555060010162000971565b5062000a75670de0b6b3a7640000821461013462000618565b62000a8f600954878762000ee760201b62001ba91760201c565b6009556040517f0f3631f9dab08169d1db21c6dc5f32536fb2b0a6b9bb5330d71c52132f968be090620008b8908890889088908890620017ca565b62000ad58262000f1b565b62000ae08162000f1b565b62000afc6009548585858562000f4860201b62001bc71760201c565b6009556040517fc42eae0298d32208994ed5d58e525fa31c2911e95451d98f8df3355259c4a13d9062000b37908690869086908690620017ff565b60405180910390a150505050565b62000b5e6009548262000fc460201b62001c071760201c565b6009556040517f5a9e84f78f7957cb4ed7478eb0fcad35ee4ecbe2e0f298420b28a3955392573f906200093e90839062001713565b62000bac6009548262000fe060201b62001c151760201c565b6009556040517f5353e2cb47d505ba9b628610daec53fc41f3a4259dab35a757b0f1d5a58bc1c3906200093e90839062001713565b62000bfa6009548262000ffc60201b62001c231760201c565b6009556040517ff8f9c11ff5f69da8478cee58f9c7465663d787d1a0175fc6a416c772f7a8c64f906200093e90839062001713565b80620006298162001018565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040162000c6c9190620017b5565b602060405180830381600087803b15801562000c8757600080fd5b505af115801562000c9c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000cc29190620014f8565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000cf79084908890889060040162001727565b600060405180830381600087803b15801562000d1257600080fd5b505af115801562000d27573d6000803e3d6000fd5b509298975050505050505050565b62000d47816210905360ea1b6200109f565b50565b62000d5b6101008310606462000618565b62000d946001821015801562000d8c575062000d8860ff84610100036200110060201b62001c311760201c565b8211155b606462000618565b62000da583821c156101b462000618565b505050565b6001901b6000190191901c1690565b600062000966826000603c866200110c60201b62001c3d17909392919060201c565b92915050565b60006200096662000e79836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801562000e2557600080fd5b505afa15801562000e3a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000e609190620016b4565b60ff1660126200113160201b62001c601790919060201c565b8490608060056200110c602090811b62001c3d17901c565b600062000ecb8260408062000eb5888887846200110c602090811b62001c3d17901c565b6200110c60201b62001c3d17909392919060201c565b949350505050565b600082820162000966848210158362000618565b600062000f01848483602062001c3d6200110c821b17811c565b935062000ecb848360208062001c3d6200110c821b17811c565b62000f3064e8d4a5100082101560cb62000618565b62000d47670d2f13f7789f000082111560ca62000618565b600062000f6386866040602062001c3d6200110c821b17811c565b955062000f7e86856060602062001c3d6200110c821b17811c565b955062000f9c86846080603e6200110c602090811b62001c3d17901c565b955062000fba868360be603e6200110c602090811b62001c3d17901c565b9695505050505050565b600062000966838360fc62001149602090811b62001c7617901c565b600062000966838360fd62001149602090811b62001c7617901c565b600062000966838360ff62001149602090811b62001c7617901c565b600281511015620010295762000d47565b6000816000815181106200103957fe5b602002602001015190506000600190505b825181101562000da55760008382815181106200106357fe5b6020026020010151905062001094816001600160a01b0316846001600160a01b03161060656200061860201b60201c565b91506001016200104a565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b80820390821102900390565b60006200111b84848462000d4a565b506001901b60001901811b1992909216911b1790565b60006200114383831115600162000618565b50900390565b6001811b1992909216911b1790565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200119b57805160ff1916838001178555620011cb565b82800160010185558215620011cb579182015b82811115620011cb578251825591602001919060010190620011ae565b50620011d9929150620011dd565b5090565b5b80821115620011d95760008155600101620011de565b805162000ddb816200186d565b600082601f83011262001212578081fd5b815162001229620012238262001841565b6200181a565b8181529150602080830190848101818402860182018710156200124b57600080fd5b60005b848110156200127757815162001264816200186d565b845292820192908201906001016200124e565b505050505092915050565b600082601f83011262001293578081fd5b8151620012a4620012238262001841565b818152915060208083019084810181840286018201871015620012c657600080fd5b60005b848110156200127757815184529282019290820190600101620012c9565b8051801515811462000ddb57600080fd5b600082601f83011262001309578081fd5b81516001600160401b038111156200131f578182fd5b602062001335601f8301601f191682016200181a565b925081835284818386010111156200134c57600080fd5b60005b828110156200136c5784810182015184820183015281016200134f565b828111156200137e5760008284860101525b50505092915050565b600060e0828403121562001399578081fd5b620013a560e06200181a565b9050620013b38383620011f4565b8152620013c48360208401620011f4565b6020820152620013d88360408401620011f4565b6040820152620013ec8360608401620011f4565b60608201526080828101519082015260a0808301519082015260c08201516001600160401b038111156200141f57600080fd5b6200142d84828501620012f8565b60c08301525092915050565b600060e082840312156200144b578081fd5b6200145760e06200181a565b82519091506001600160401b03808211156200147257600080fd5b620014808583860162001201565b835260208401519150808211156200149757600080fd5b50620014a68482850162001282565b60208301525060408201516040820152620014c58360608401620012e7565b6060820152620014d98360808401620012e7565b608082015260a082015160a082015260c082015160c082015292915050565b6000602082840312156200150a578081fd5b5051919050565b60006020828403121562001523578081fd5b815162000966816200186d565b6000806000806080858703121562001546578283fd5b84516001600160401b03808211156200155d578485fd5b908601906060828903121562001571578485fd5b6200157d60606200181a565b8251828111156200158c578687fd5b6200159a8a828601620012f8565b82525060208084015183811115620015b0578788fd5b620015be8b828701620012f8565b8284015250604084015183811115620015d5578788fd5b80850194505089601f850112620015ea578687fd5b8351620015fb620012238262001841565b81815282810190868401848402880185018e101562001618578a8bfd5b8a97505b838810156200164757805162001632816200186d565b8352600197909701969184019184016200161c565b506040850152505088015190965091508082111562001664578485fd5b620016728883890162001387565b9450604087015191508082111562001688578384fd5b50620016978782880162001439565b925050620016a98660608701620011f4565b905092959194509250565b600060208284031215620016c6578081fd5b815160ff8116811462000966578182fd5b6000815180845260208085019450808401835b838110156200170857815187529582019590820190600101620016ea565b509495945050505050565b901515815260200190565b90815260200190565b60006060820185835260206060818501528186518084526080860191508288019350845b81811015620017735762001760855162001861565b835293830193918301916001016200174b565b505084810360408601528551808252908201925081860190845b8181101562000d2757620017a2835162001861565b855293830193918301916001016200178d565b6020810160038310620017c457fe5b91905290565b600085825284602083015260806040830152620017eb6080830185620016d7565b82810360608401526200060d8185620016d7565b93845260208401929092526040830152606082015260800190565b6040518181016001600160401b03811182821017156200183957600080fd5b604052919050565b60006001600160401b0382111562001857578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b038116811462000d4757600080fd5b60805160a05160c05160e0516101005160601c6101205160601c61014051610160516101805160601c6101a0516101c05160601c6101e05160601c610200516102205160601c6102405160601c615ff16200194160003980613b2c525080613b0852508061089e5280610cdf52508061087d525080611654525080610ba7525080611d1d52508061205252508061202e5250806112d95250806112a85250806112345250806133a25250806133e45250806133c35250615ff16000f3fe608060405234801561001057600080fd5b506004361061033a5760003560e01c80637beed220116101b4578063a457c2d7116100fa578063d5c096c41161009d578063d5c096c4146106bf578063dd62ed3e146106d2578063de3d2b2d146106e5578063e01af92c146106f8578063ebf1b7421461070b578063ed24911d14610730578063f885a4bb14610738578063f89f27ed1461074b5761033a565b8063a457c2d714610653578063a9059cbb14610666578063aaabadc514610679578063b35056b814610681578063b62c1f0614610689578063b7b814fc1461069c578063d2946c2b146106a4578063d505accf146106ac5761033a565b806387ec68171161016257806387ec6817146105da578063893d20e8146105ed5780638d027466146106025780638d928af81461060a57806390193b7c1461061257806395d89b411461062557806397bb15c91461062d5780639d2c110c146106405761033a565b80637beed220146105665780637ecebe001461057e57806381788e2b14610591578063819c70f3146105a45780638456cb59146105b7578063851c1bb3146105bf578063876f303b146105d25761033a565b80633c9d93b8116102845780636028bfd4116102275780636028bfd4146104b55780636a2efb2c146104d65780636b47273b146104ee578063704640161461050457806370a082311461051757806373656f891461052a57806374f3b009146105325780637b749c45146105535761033a565b80633c9d93b81461045f5780633f4ba83a1461047257806341e45a201461047a57806347bc4d92146104825780634df77ce01461048a57806354a844ba1461049d57806354fd4d50146104a557806355c67628146104ad5761033a565b806323b872dd116102ec57806323b872dd146103db5780632a9a0323146103ee578063313ce5671461040157806334a36df8146104165780633644e5151461042957806336eb097b1461043157806338fff2d014610444578063395093511461044c5761033a565b806301ec954a1461033f57806306fdde0314610368578063095ea7b31461037d5780630da0669c1461039d57806318160ddd146103a75780631c0de051146103af5780631dd746ea146103c6575b600080fd5b61035261034d3660046156d1565b610753565b60405161035f9190615b45565b60405180910390f35b6103706107b3565b60405161035f9190615dad565b61039061038b3660046152a5565b610849565b60405161035f9190615b22565b6103a5610860565b005b6103526108c4565b6103b76108ca565b60405161035f93929190615b2d565b6103ce6108f3565b60405161035f9190615a5c565b6103906103e93660046151f5565b610910565b6103526103fc36600461578c565b610986565b6104096109cd565b60405161035f9190615f20565b6103a56104243660046155d5565b6109d6565b610352610b74565b61039061043f3660046151a1565b610b83565b610352610ba5565b61039061045a3660046152a5565b610bc9565b6103a561046d3660046151a1565b610c04565b6103a5610c71565b610390610c83565b610390610c90565b61035261049836600461578c565b610c9d565b6103a5610d06565b610370610d5a565b610352610dbb565b6104c86104c3366004615486565b610dc8565b60405161035f929190615e29565b6104de610de6565b60405161035f9493929190615eba565b6104f6610e05565b60405161035f929190615e42565b61035261051236600461578c565b610e32565b6103526105253660046151a1565b610e94565b610352610eaf565b610545610540366004615486565b610ee4565b60405161035f929190615a6f565b6103a5610561366004615436565b610fa5565b61056e610fc1565b60405161035f9493929190615e50565b61035261058c3660046151a1565b6110f7565b6103a561059f3660046151a1565b611102565b6103a56105b23660046157d2565b611173565b6103a561121e565b6103526105cd366004615591565b611230565b610352611282565b6104c86105e8366004615486565b611294565b6105f56112a6565b60405161035f91906159b1565b6103906112ca565b6105f56112d7565b6103526106203660046151a1565b6112fb565b610370611316565b6103a561063b366004615633565b611377565b61035261064e366004615741565b611542565b6103906106613660046152a5565b61157b565b6103906106743660046152a5565b6115b9565b6105f56115c6565b6103906115d0565b6103a5610697366004615857565b6115dd565b6103a5611608565b6105f5611652565b6103a56106ba366004615235565b611676565b6105456106cd366004615486565b611701565b6103526106e03660046151bd565b611798565b6103a56106f3366004615436565b6117d5565b6103a5610706366004615436565b6117ee565b61071e6107193660046151a1565b611807565b60405161035f96959493929190615ef8565b6103526118ab565b6103a5610746366004615326565b6118b5565b6103ce61194b565b600084608001516107806107656112d7565b6001600160a01b0316336001600160a01b03161460cd611c85565b61079561078b610ba5565b82146101f4611c85565b61079d611c93565b6107a986868686611ca6565b9695505050505050565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561083f5780601f106108145761010080835404028352916020019161083f565b820191906000526020600020905b81548152906001019060200180831161082257829003601f168201915b5050505050905090565b6000610856338484611cb3565b5060015b92915050565b61087061086b611d1b565b611d3f565b610878611dd8565b6108c27f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611dfb565b565b60025490565b60008060006108d761200f565b1592506108e261202c565b91506108ec612050565b9050909192565b6060806108fe612074565b50905061090a81612121565b91505090565b60008061091d8533611798565b9050610941336001600160a01b03871614806109395750838210155b61019e611c85565b61094c8585856121db565b336001600160a01b0386161480159061096757506000198114155b15610979576109798533858403611cb3565b60019150505b9392505050565b60006109906122bb565b610998611c93565b6109a06122e9565b60006109aa6122f4565b905080156109be576109bb8161239e565b91505b6109c78361245a565b50919050565b60055460ff1690565b6109de6122bb565b6109e6611c93565b6109ee6122e9565b60006109f86122f4565b9050610a086000821160ce611c85565b610a118161239e565b50506060610a1d612074565b509050610a3360328251600101111560c9611c85565b600060608073__$6d134cfc25e59b25943ff4bfa0c28ca096$__631face20a610a5a6112d7565b610a62610ba5565b60095488610a6f8a6124bb565b8f8f8f6040518963ffffffff1660e01b8152600401610a95989796959493929190615cb1565b60006040518083038186803b158015610aad57600080fd5b505af4158015610ac1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ae99190810190615528565b6001600160a01b038c166000908152600b6020526040902083905591945092509050610b184280838086612586565b8515610b2857610b2885876126a8565b886001600160a01b03167ff4c563a3ea86ff1f4275e8c207df0375a51963f2b831b7bf4da8be938d92876c88604051610b619190615b45565b60405180910390a2505050505050505050565b6000610b7e6118ab565b905090565b6001600160a01b0381166000908152600d602052604090205460ff165b919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610856918590610bff9086611b7a565b611cb3565b610c0c6122bb565b610c14611c93565b610c28610c2082610b83565b6101b1611c85565b6001600160a01b0381166000818152600d6020526040808220805460ff19169055517f89aa0423af0b4cf311bfb79f61549f2b82b335f041e4f7ae674618059b51a4cb9190a250565b610c796122bb565b6108c260006126b2565b6000610b7e600954612725565b6000610b7e600954612732565b60008082610cad57506000610cda565b6002831415610cbe57506008610cda565b6003831415610ccf57506010610cda565b610cda6101bb61273f565b61097f7f0000000000000000000000000000000000000000000000000000000000000000826008611b5c565b610d0e6122bb565b610d1661274f565b610d206001612763565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610d509190615b22565b60405180910390a1565b600e8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561083f5780601f106108145761010080835404028352916020019161083f565b6000610b7e60095461277f565b60006060610dda8887856127a46128a9565b97509795505050505050565b600080600080610df76009546129a3565b935093509350935090919293565b600080610e13600a546129eb565b6009549193509150610e2490612a10565b15610e2e57600091505b9091565b6000610e3c6115d0565b15610e4957506000610ba0565b600082610e5857506000610e85565b6002831415610e6957506040610e85565b6003831415610e7a57506080610e85565b610e856101bb61273f565b60085461097f90826040611b5c565b6001600160a01b031660009081526020819052604090205490565b6000610eb9611c93565b610ec16122e9565b6000610ecb6122f4565b9050610edb6000821160ce611c85565b61090a8161239e565b60608088610ef36107656112d7565b610efe61078b610ba5565b6000610f0985612a1d565b15610f3157610f16612a4c565b610f2888610f226108c4565b87612a5f565b94509050610f49565b610f39611c93565b610f448a89876127a4565b945090505b610f538a82612b01565b83516001600160401b0381118015610f6a57600080fd5b50604051908082528060200260200182016040528015610f94578160200160208202803683370190505b509250505097509795505050505050565b610fad6122bb565b610fb5611c93565b610fbe81612b0b565b50565b600080606080610fd2600954612b4a565b90945092506060610fe1612074565b50905080516001600160401b0381118015610ffb57600080fd5b50604051908082528060200260200182016040528015611025578160200160208202803683370190505b50925080516001600160401b038111801561103f57600080fd5b50604051908082528060200260200182016040528015611069578160200160208202803683370190505b50915060005b81518110156110ef576110b9600b600084848151811061108b57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054612b67565b8583815181106110c557fe5b602002602001018584815181106110d857fe5b60209081029190910101919091525260010161106f565b505090919293565b600061085a826112fb565b61110a6122bb565b611112611c93565b61112761111e82610b83565b156101b0611c85565b6001600160a01b0381166000818152600d6020526040808220805460ff19166001179055517fbf5840c727acdcaceea5154edc82998fa82a490aa3dc7aeb66849c8bbea1f5799190a250565b61117b6122bb565b611183611c93565b606061118d612074565b50905061119e835182518451612b84565b60005b81518110156111f8576111f08482815181106111b957fe5b60200260200101516001600160a01b03168383815181106111d657fe5b60200260200101516001600160a01b031614610208611c85565b6001016111a1565b506112176112068686612ba1565b85611210866124bb565b8587612586565b5050505050565b6112266122bb565b6108c260016126b2565b60007f00000000000000000000000000000000000000000000000000000000000000008260405160200161126592919061596e565b604051602081830303815290604052805190602001209050919050565b6000610b7e61128f6122f4565b612bbe565b60006060610dda888785612be96128a9565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610b7e600954612d01565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561083f5780601f106108145761010080835404028352916020019161083f565b61137f6122bb565b611387611c93565b61138f6122e9565b60006113996122f4565b90506113a96000821160ce611c85565b6113b28161239e565b505060606113be612074565b5090506113d460026001835103101560c8611c85565b6001600160a01b0384166000908152600b60205260408120546113ff90670de0b6b3a7640000612d0e565b905060608073__$6d134cfc25e59b25943ff4bfa0c28ca096$__63a20d2e4d6114266112d7565b61142e610ba5565b6009548861143b8a6124bb565b8d8a6040518863ffffffff1660e01b815260040161145f9796959493929190615d14565b60006040518083038186803b15801561147757600080fd5b505af415801561148b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114b391908101906152d0565b6001600160a01b0389166000908152600b602052604081205590925090506114de4280838086612586565b8515611505576114fb6001600160a01b03861615156101bc611c85565b6115058587612b01565b6040516001600160a01b038816907f4c910b69fe65a61f7531b9c5042b2329ca7179c77290aa7e2eb3afa3c8511fd390600090a250505050505050565b600083608001516115546107656112d7565b61155f61078b610ba5565b611567611c93565b611572858585612d31565b95945050505050565b6000806115883385611798565b90508083106115a25761159d33856000611cb3565b6115af565b6115af3385858403611cb3565b5060019392505050565b60006108563384846121db565b6000610b7e612dfd565b6000610b7e600954612a10565b6115e56122bb565b6115ed611c93565b6116026115fa8585612ba1565b848484612e77565b50505050565b6116106122bb565b611618612a4c565b6116226000612763565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610d509190615b22565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886116a58c6112fb565b896040516020016116bb96959493929190615b6d565b6040516020818303038152906040528051906020012090506116ec88826116e3878787612edf565b886101f8612f1e565b6116f7888888611cb3565b5050505050505050565b606080886117106107656112d7565b61171b61078b610ba5565b6000611725611c93565b61172d6108c4565b61177f5761173c8a8a87612f75565b9450905061175561174b6130ec565b82101560cc611c85565b61176760006117626130ec565b6126a8565b61177a896117736130ec565b83036126a8565b610f53565b61178a8a8987612be9565b94509050610f5389826126a8565b60006117a26112d7565b6001600160a01b0316826001600160a01b031614156117c4575060001961085a565b6117ce83836130f3565b905061085a565b6117dd6122bb565b6117e5611c93565b610fbe8161311e565b6117f66122bb565b6117fe611c93565b610fbe8161315d565b6001600160a01b0381166000908152600c6020526040812054819081908190819081906118338161319c565b929950909750955093506000611848896131ea565b905061185682826001613219565b935061186482826000613219565b925060006118796118748b613353565b61336e565b90506118858982613392565b98506118918582613392565b945061189d8482613392565b935050505091939550919395565b6000610b7e61339e565b6118bd6122bb565b6118c5611c93565b6118d3845183518351612b84565b6118df84518451611b28565b60005b8451811015611217576119438582815181106118fa57fe5b602002602001015185838151811061190e57fe5b602002602001015185848151811061192257fe5b602002602001015185858151811061193657fe5b602002602001015161343b565b6001016118e2565b606080611956612074565b50905061090a816124bb565b600061196d83611b52565b606083516001016001600160401b038111801561198957600080fd5b506040519080825280602002602001820160405280156119b3578160200160208202803683370190505b50905030816000815181106119c457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b8451811015611a33578481815181106119fc57fe5b6020026020010151828260010181518110611a1357fe5b6001600160a01b03909216602092830291909101909101526001016119e7565b50606083516001016001600160401b0381118015611a5057600080fd5b50604051908082528060200260200182016040528015611a7a578160200160208202803683370190505b509050600081600081518110611a8c57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b8451811015611afb57848181518110611ac457fe5b6020026020010151828260010181518110611adb57fe5b6001600160a01b0390921660209283029190910190910152600101611aaf565b50611b08878784846134dc565b925050505b949350505050565b6000611b228484846135cc565b50501b90565b611b358183146067611c85565b5050565b6000611b458184613613565b905061097f818384611b8c565b80611b35816136a2565b6001901b6000190191901c1690565b600061097f838383603c611c3d565b600082820161097f8482101583611c85565b6000611b0d82604080611ba188888784611c3d565b929190611c3d565b6000611bb88484836020611c3d565b9350611b0d8483602080611c3d565b6000611bd7868660406020611c3d565b9550611be7868560606020611c3d565b9550611bf786846080603e611c3d565b95506107a9868360be603e611c3d565b600061097f838360fc611c76565b600061097f838360fd611c76565b600061097f838360ff611c76565b80820390821102900390565b6000611c4a8484846135cc565b506001901b60001901811b1992909216911b1790565b6000611c70838311156001611c85565b50900390565b6001811b1992909216911b1790565b81611b3557611b358161273f565b6108c2611c9e61200f565b610192611c85565b6000611b0d6103e661273f565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611d0e908590615b45565b60405180910390a3505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60408051600080825260208201909252606091611d72565b611d5f614e5a565b815260200190600190039081611d575790505b506040516303a38fa160e21b81529091506001600160a01b03831690630e8e3e8490611da29084906004016159c5565b600060405180830381600087803b158015611dbc57600080fd5b505af1158015611dd0573d6000803e3d6000fd5b505050505050565b611de0611c93565b6000611dea6122f4565b90508015610fbe57611b358161239e565b60006001600160a01b038316631a7c3263611e1884846008611b5c565b6040518263ffffffff1660e01b8152600401611e349190615b45565b60206040518083038186803b158015611e4c57600080fd5b505afa158015611e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e84919061546e565b905060006001600160a01b038416631a7c3263611ea385600880611b5c565b6040518263ffffffff1660e01b8152600401611ebf9190615b45565b60206040518083038186803b158015611ed757600080fd5b505afa158015611eeb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0f919061546e565b905060006001600160a01b038516631a7c3263611f2f8660106008611b5c565b6040518263ffffffff1660e01b8152600401611f4b9190615b45565b60206040518083038186803b158015611f6357600080fd5b505afa158015611f77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9b919061546e565b90506000611fac8260806040611b15565b611fb884604080611b15565b611fc58660006040611b15565b17179050806008819055507fc3f0acc358200d8e08ac6ce20bc2f9f27893a344f813bf682b7859b3e521502e81604051611fff9190615b45565b60405180910390a1505050505050565b6000612019612050565b421180610b7e57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6060806060806120826112d7565b6001600160a01b031663f94d4668612098610ba5565b6040518263ffffffff1660e01b81526004016120b49190615b45565b60006040518083038186803b1580156120cc57600080fd5b505afa1580156120e0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261210891908101906153cd565b5091509150612117828261371b565b9350935050509091565b8051606090806001600160401b038111801561213c57600080fd5b50604051908082528060200260200182016040528015612166578160200160208202803683370190505b50915060005b818110156121d4576121b5600b600086848151811061218757fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461336e565b8382815181106121c157fe5b602090810291909101015260010161216c565b5050919050565b6121f26001600160a01b0384161515610198611c85565b6122096001600160a01b0383161515610199611c85565b612214838383612b9c565b6001600160a01b03831660009081526020819052604090205461223a90826101a061373b565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546122699082611b7a565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611d0e908590615b45565b60006122d26000356001600160e01b031916611230565b9050610fbe6122e18233613751565b610191611c85565b6108c261086b6112d7565b60008060006123016112d7565b6001600160a01b031663b05f8e48612317610ba5565b306040518363ffffffff1660e01b8152600401612335929190615c7c565b60806040518083038186803b15801561234d57600080fd5b505afa158015612361573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123859190615817565b5050915091508082016123966108c4565b039250505090565b60008060006123ab610e05565b9150915060006123bd8542848661383a565b90506123c761387e565b806123d85760009350505050610ba0565b60006123ee6123e76003610e32565b839061388f565b905060006123fc8383611c60565b9050612407826138d1565b7f0666d5a83bb8143573350414d5a13dbdcac60a706160576416096ad6a41c0ea5816040516124369190615b45565b60405180910390a161244f6124496112a6565b826126a8565b509095945050505050565b612471670d2f13f7789f0000821115610160611c85565b61247d600a5482611b6b565b600a556040517f556cdf4052d939f8acbe593d83668d2e18500b032bcf51cbbf82b181c6094dd7906124b0908390615b45565b60405180910390a150565b606060006124ca6009546138e2565b8351909150806001600160401b03811180156124e557600080fd5b5060405190808252806020026020018201604052801561250f578160200160208202803683370190505b50925060005b8181101561257e5761255f600b600087848151811061253057fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205484612d0e565b84828151811061256b57fe5b6020908102919091010152600101612515565b505050919050565b6000805b835181101561264b5760008482815181106125a157fe5b602002602001015190506125c1662386f26fc1000082101561012e611c85565b6125cb8382611b7a565b925060008483815181106125db57fe5b60200260200101519050612628600b6000836001600160a01b03166001600160a01b031681526020019081526020016000205488858151811061261a57fe5b602002602001015184611b8c565b6001600160a01b039091166000908152600b60205260409020555060010161258a565b50612662670de0b6b3a76400008214610134611c85565b61266f6009548787611ba9565b6009556040517f0f3631f9dab08169d1db21c6dc5f32536fb2b0a6b9bb5330d71c52132f968be090611fff908890889088908890615e50565b611b3582826138fe565b80156126d2576126cd6126c361202c565b4210610193611c85565b6126e7565b6126e76126dd612050565b42106101a9611c85565b6007805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be64906124b0908390615b22565b600061085a8260ff6139a2565b600061085a8260fc6139a2565b610fbe816210905360ea1b6139a9565b6108c261275a6115d0565b156101b5611c85565b61276f60095482613a0a565b60095580610fbe57610fbe61387e565b6000806000806000612790866129a3565b93509350935093506107a982828686613a18565b6000606060006127bb6127b56108c4565b86613a32565b9550905060606127c9612074565b50905060006127d78361239e565b8301905073__$b21b5fdadf799f52ef5daa76c49e71b2c3$__63b8b0f79988888461280187612121565b61280a886124bb565b612812613a73565b61281b8a613a79565b612823613b06565b6040518963ffffffff1660e01b8152600401612846989796959493929190615a94565b60006040518083038186803b15801561285e57600080fd5b505af4158015612872573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261289a91908101906157a4565b94509450505050935093915050565b333014612967576000306001600160a01b03166000366040516128cd929190615986565b6000604051808303816000865af19150503d806000811461290a576040519150601f19603f3d011682016040523d82523d6000602084013e61290f565b606091505b50509050806000811461291e57fe5b60046000803e6000516001600160e01b0319166343adbafb60e01b8114612949573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b6000606061297a8686868663ffffffff16565b8051601f1982018390526343adbafb603f19830152919350915060200260231982016044820181fd5b60008080806129b58560406020611b5c565b93506129c48560606020611b5c565b92506129d3856080603e611b5c565b91506129e28560be603e611b5c565b90509193509193565b6000806129fa8382603c611b5c565b9150612a0983603c6020611b5c565b9050915091565b600061085a8260fe6139a2565b600080825111801561085a575060ff801682806020019051810190612a429190615888565b60ff161492915050565b6108c2612a576115d0565b6101b6611c85565b60006060612a6b613b2a565b6001600160a01b0316632787a287612a81610ba5565b85876040518463ffffffff1660e01b8152600401612aa193929190615c53565b60006040518083038186803b158015612ab957600080fd5b505afa158015612acd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612af591908101906157a4565b91509150935093915050565b611b358282613b4e565b612b1760095482611c15565b6009556040517f5353e2cb47d505ba9b628610daec53fc41f3a4259dab35a757b0f1d5a58bc1c3906124b0908390615b22565b600080612b5983826020611b5c565b9150612a0983602080611b5c565b600080612b7683826040611b5c565b9150612a0983604080611b5c565b612b9c8284148015612b9557508183145b6067611c85565b505050565b6000612bad4284613c09565b905061085a82821115610146611c85565b6000806000612bcb610e05565b915091506000612bdd8542848661383a565b90506115728582611b7a565b600060606000612bf7613a73565b9050612c06610c208288613c15565b6000612c19612c136108c4565b87613a32565b965090506060612c27612074565b5090506000612c358361239e565b8301905073__$b21b5fdadf799f52ef5daa76c49e71b2c3$__63b8e7b848898984612c5f87612121565b612c68886124bb565b8a612c728a613a79565b612c7a613b06565b6040518963ffffffff1660e01b8152600401612c9d989796959493929190615a94565b60006040518083038186803b158015612cb557600080fd5b505af4158015612cc9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612cf191908101906157a4565b9550955050505050935093915050565b600061085a8260fd6139a2565b600061097f612d1f84836040611b5c565b612d2b85604080611b5c565b84613c30565b600080612d3c613a73565b9050612d52612d4a82612732565b610147611c85565b60408501516001600160a01b0316301415612dab57612d78610c20828760c00151613c15565b600083612d836108c4565b0390506000612d918261239e565b82019050612da187878386613c9a565b935050505061097f565b60208501516001600160a01b0316301415612de957600084612dcb6108c4565b0390506000612dd98261239e565b82019050612da187868386613e79565b612df585858584614040565b91505061097f565b6000612e076112d7565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015612e3f57600080fd5b505afa158015612e53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7e91906155b9565b612e808261426a565b612e898161426a565b612e9860095485858585611bc7565b6009556040517fc42eae0298d32208994ed5d58e525fa31c2911e95451d98f8df3355259c4a13d90612ed1908690869086908690615eba565b60405180910390a150505050565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b6000612f2985614293565b9050612f3f612f398783876142af565b83611c85565b612f4e428410156101b8611c85565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b60006060612f8d610c20612f87613a73565b87613c15565b6000612f988461435e565b9050612fb36000826003811115612fab57fe5b1460ce611c85565b6060612fbd612074565b509050612fc985614374565b9250612fd783518251611b28565b6060612fe282612121565b9050612fee848261438a565b6000612ff8613b06565b6001600160a01b03166390043a5861300f856124bb565b876040518363ffffffff1660e01b815260040161302d929190615a6f565b60206040518083038186803b15801561304557600080fd5b505afa158015613059573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307d919061546e565b905061308a8186516143f3565b9550613096858361440d565b60006130a66001606f1b88611c60565b90506130b28a826126a8565b6130bb86614476565b955080866000815181106130cb57fe5b6020026020010181815250506130df61387e565b5050505050935093915050565b620f424090565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61312a60095482611c23565b6009556040517ff8f9c11ff5f69da8478cee58f9c7465663d787d1a0175fc6a416c772f7a8c64f906124b0908390615b22565b61316960095482611c07565b6009556040517f5a9e84f78f7957cb4ed7478eb0fcad35ee4ecbe2e0f298420b28a3955392573f906124b0908390615b22565b60008080806131ad85606080611b5c565b93506131bc8560206040611b5c565b925060306131cd8660006010611b5c565b901b915060306131df86601080611b5c565b901b90509193509193565b6001600160a01b0381166000908152600b602052604081205460095461085a9190613214906138e2565b612d0e565b60008060306132398461322d576010613230565b60005b87906010611b5c565b901b90508061324c57600091505061097f565b600061325a86606080611b5c565b9050600061326b8760206040611b5c565b90506000818714156132ae576132a76020678ac7230489e800006132a0896132945760e0613297565b60c05b8c906020611b5c565b9190614501565b905061333c565b604051633d3632df60e21b815273__$6670886e635fd86503a30ff6f4e4ebb80f$__9063f4d8cb7c906132e99087908b908b90600401615e8c565b60206040518083038186803b15801561330157600080fd5b505af4158015613315573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613339919061546e565b90505b613347818488614547565b98975050505050505050565b6001600160a01b03166000908152600b602052604090205490565b60008061337e8360806005611b5c565b600a0a670de0b6b3a7640000029392505050565b600061097f8383614567565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061340b614595565b30604051602001613420959493929190615c27565b60405160208183030381529060405280519060200120905090565b6000613446856131ea565b9050613456811515610135611c85565b600061346d8561346861187489613353565b614599565b905061347b818386866145a5565b6001600160a01b0387166000818152600c6020526040908190209290925590517fcad1fdf49cd36960e377075cfe18dcc3aa113e526fbe184544cca2e7115c54f3906134cc90889088908890615ea4565b60405180910390a2505050505050565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040161350b9190615d9a565b602060405180830381600087803b15801561352557600080fd5b505af1158015613539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355d919061546e565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29061359090849088908890600401615ba1565b600060405180830381600087803b1580156135aa57600080fd5b505af11580156135be573d6000803e3d6000fd5b509298975050505050505050565b6135db61010083106064611c85565b613604600182101580156135fd57506135f960ff8461010003611c31565b8211155b6064611c85565b612b9c83821c156101b4611c85565b600061097f613697836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561365457600080fd5b505afa158015613668573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061368c9190615888565b60129060ff16611c60565b849060806005611c3d565b6002815110156136b157610fbe565b6000816000815181106136c057fe5b602002602001015190506000600190505b8251811015612b9c5760008382815181106136e857fe5b60200260200101519050613711816001600160a01b0316846001600160a01b0316106065611c85565b91506001016136d1565b815160001990810160209384019081528251909101919092019081529091565b600061374a8484111583611c85565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6137706112a6565b6001600160a01b03161415801561378b575061378b8361479e565b156137b3576137986112a6565b6001600160a01b0316336001600160a01b031614905061085a565b6137bb612dfd565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016137ea93929190615b4e565b60206040518083038186803b15801561380257600080fd5b505afa158015613816573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ce9190615452565b60008284111580613849575081155b1561385657506000611b0d565b600061386286846148b1565b9050838503611b0861387483836143f3565b6301e133806148c9565b61388a600a54426148e9565b600a55565b60008282026138b38415806138ac5750838583816138a957fe5b04145b6003611c85565b6001670de0b6b3a76400006001830304018115150291505092915050565b8015610fbe57610fbe612449611652565b60008060006138f084612b4a565b91509150611b0d82826148f9565b61390a60008383612b9c565b61392461391f826139196108c4565b90611b7a565b614931565b6001600160a01b0382166000908152602081905260409020546139479082611b7a565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613996908590615b45565b60405180910390a35050565b1c60011690565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b600061097f838360fe611c76565b600080613a2584846148f9565b90506107a9868683613c30565b60006060613a5d83600081518110613a4657fe5b602002602001015185611c6090919063ffffffff16565b8351600019016020909401938452949293505050565b60095490565b606081516001600160401b0381118015613a9257600080fd5b50604051908082528060200260200182016040528015613abc578160200160208202803683370190505b50905060005b82518110156109c757613ae7838281518110613ada57fe5b6020026020010151614936565b828281518110613af357fe5b6020908102919091010152600101613ac2565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b613b656001600160a01b038316151561019b611c85565b613b7182600083612b9c565b6001600160a01b038216600090815260208190526040902054613b9790826101b261373b565b6001600160a01b038316600090815260208190526040902055613bc561391f82613bbf6108c4565b90614951565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516139969190615b45565b80820390821002900390565b6000613c2083612d01565b158061097f575061097f82610b83565b6000670de0b6b3a764000082101580613c4857508284145b15613c5457508161097f565b81613c6057508261097f565b82841115613c81576000613c7683858703614567565b8503915061097f9050565b6000613c8f83868603614567565b8501915061097f9050565b6000613cb0613ca883612725565b610166611c85565b600080613cc98760200151613cc4866138e2565b61495f565b915091506000613cd88561277f565b9050613ce48783613392565b965060008089516001811115613cf657fe5b1415613da557613d0a896060015184613392565b60608a0152613d17613b06565b6001600160a01b031663afc4d0db89868c606001518b876040518663ffffffff1660e01b8152600401613d4e959493929190615ed5565b60206040518083038186803b158015613d6657600080fd5b505afa158015613d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d9e919061546e565b9050613e37565b613dad613b06565b6001600160a01b0316637f1ae8a989868c606001518b876040518663ffffffff1660e01b8152600401613de4959493929190615ed5565b60206040518083038186803b158015613dfc57600080fd5b505afa158015613e10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e34919061546e565b90505b613e44898883600161498e565b600089516001811115613e5357fe5b1415613e64579350611b0d92505050565b613e6e8184614b8e565b945050505050611b0d565b6000613e87613ca883612725565b600080613e9b8760400151613cc4866138e2565b915091506000613eaa8561277f565b9050613eb68783613392565b965060008089516001811115613ec857fe5b1415613f6457613ed6613b06565b6001600160a01b0316630ccd894189868c606001518b876040518663ffffffff1660e01b8152600401613f0d959493929190615ed5565b60206040518083038186803b158015613f2557600080fd5b505afa158015613f39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f5d919061546e565b9050614009565b613f72896060015184613392565b60608a0152613f7f613b06565b6001600160a01b031663ef2aca7689868c606001518b876040518663ffffffff1660e01b8152600401613fb6959493929190615ed5565b60206040518083038186803b158015613fce57600080fd5b505afa158015613fe2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614006919061546e565b90505b614016898883600061498e565b60008951600181111561402557fe5b141561403557613e6e8184614599565b9350611b0d92505050565b600061404a614e8a565b6140548684614b9a565b905060006140696140648561277f565b614c12565b9050614079868360400151613392565b9550614089858360600151613392565b94506000808851600181111561409b57fe5b1415614163576140b388606001518460400151613392565b606089018190526000906140c79084614567565b90506140d1613b06565b8451602086015160405163063c5da760e11b81526001600160a01b039390931692630c78bb4e9261410b928d928d91908890600401615ed5565b60206040518083038186803b15801561412357600080fd5b505afa158015614137573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061415b919061546e565b915050614222565b61417588606001518460600151613392565b60608901526000614184613b06565b8451602086015160608c015160405162d5905160e81b81526001600160a01b03949094169363d5905100936141c2938e9391928e9290600401615ed5565b60206040518083038186803b1580156141da57600080fd5b505afa1580156141ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614212919061546e565b905061421e8184614c24565b9150505b61422f8884898985614c7b565b60008851600181111561423e57fe5b141561425c57614252818460600151614599565b9350505050611b0d565b614252818460400151614b8e565b61427d64e8d4a5100082101560cb611c85565b610fbe670d2f13f7789f000082111560ca611c85565b600061429d61339e565b82604051602001611265929190615996565b60006142c182516041146101b9611c85565b60208281015160408085015160608601518251600080825295019283905292939092811a916001906142fa908990859088908890615c93565b6020604051602081039080840390855afa15801561431c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906133475750876001600160a01b0316816001600160a01b0316149450505050509392505050565b60008180602001905181019061085a9190615674565b60608180602001905181019061097f919061568f565b81518151614399908290611b28565b60005b81811015611602576143d48482815181106143b357fe5b60200260200101518483815181106143c757fe5b6020026020010151614567565b8482815181106143e057fe5b602090810291909101015260010161439c565b600082820261097f8415806138ac5750838583816138a957fe5b8151815161441c908290611b28565b60005b818110156116025761445784828151811061443657fe5b602002602001015184838151811061444a57fe5b6020026020010151614c24565b84828151811061446357fe5b602090810291909101015260010161441f565b606081516001016001600160401b038111801561449257600080fd5b506040519080825280602002602001820160405280156144bc578160200160208202803683370190505b50905060005b82518110156109c7578281815181106144d757fe5b60200260200101518282600101815181106144ee57fe5b60209081029190910101526001016144c2565b600061451e600284101580156135fd575060ff8411156064611c85565b6000196001841b01614534818611156064611c85565b61157261454186856143f3565b826148c9565b6000611b0d83858461455b5761456761455f565b61388f5b63ffffffff16565b60008282026145818415806138ac5750838583816138a957fe5b670de0b6b3a7640000815b04949350505050565b4690565b600061097f8383614dd4565b60006145da8315806145d2575067016345785d8a000084101580156145d25750670de0b6b3a76400008411155b610163611c85565b6145f1678ac7230489e80000831115610163611c85565b6146088215806145d2575083831015610163611c85565b600061461f8560206040611ba1858b606080611c3d565b9050614640603084811c906010908190611ba19086908a901c600084611c3d565b9050600073__$6670886e635fd86503a30ff6f4e4ebb80f$__63f4d8cb7c868860016040518463ffffffff1660e01b815260040161468093929190615e8c565b60206040518083038186803b15801561469857600080fd5b505af41580156146ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146d0919061546e565b9050600073__$6670886e635fd86503a30ff6f4e4ebb80f$__63f4d8cb7c868960006040518463ffffffff1660e01b815260040161471093929190615e8c565b60206040518083038186803b15801561472857600080fd5b505af415801561473c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614760919061546e565b9050613347614779826020678ac7230489e80000614e14565b60e06020611ba16147938783678ac7230489e80000614e14565b889060c06020611c3d565b60006147b063819c70f360e01b611230565b8214806147cb57506147c8635b160f8360e11b611230565b82145b806147e457506147e163de3d2b2d60e01b611230565b82145b806147fd57506147fa633806be4b60e21b611230565b82145b8061481657506148136381788e2b60e01b611230565b82145b8061482f575061482c630793b27760e31b611230565b82145b806148485750614845637b749c4560e01b611230565b82145b80614861575061485e6306946dbf60e31b611230565b82145b8061487a57506148776397bb15c960e01b611230565b82145b806148935750614890632a9a032360e01b611230565b82145b8061085a57506148a963f885a4bb60e01b611230565b909114919050565b600061097f6148c084846143f3565b6148c984614c12565b60006148d88215156004611c85565b8183816148e157fe5b049392505050565b600061097f8383603c6020611c3d565b60008142106149115750670de0b6b3a764000061085a565b8242116149205750600061085a565b828203428490036115728183614dd4565b600255565b6001600160a01b03166000908152600c602052604090205490565b600061097f8383600161373b565b600080600061496d85613353565b90506149798185612d0e565b92506149848161336e565b9150509250929050565b60008082156149db576000865160018111156149a657fe5b146149c15760608601516149bb908690611b7a565b846149d1565b6149cb8585611b7a565b86606001515b9092509050614a1b565b6000865160018111156149ea57fe5b14614a03576149f98585611c60565b8660600151614a15565b6060860151614a13908690611c60565b845b90925090505b606080614a26612074565b915091506060614a35836124bb565b9050614a4982614a4485612121565b61438a565b606083516001600160401b0381118015614a6257600080fd5b50604051908082528060200260200182016040528015614a8c578160200160208202803683370190505b509050600087614aa0578a60400151614aa6565b8a602001515b905060005b8551811015614b0757816001600160a01b0316868281518110614aca57fe5b60200260200101516001600160a01b03161415614aff5786838281518110614aee57fe5b602002602001018181525050614b07565b600101614aab565b5073__$b21b5fdadf799f52ef5daa76c49e71b2c3$__6328e379f588614b2c88613a79565b8786888e6040518763ffffffff1660e01b8152600401614b5196959493929190615dc0565b60006040518083038186803b158015614b6957600080fd5b505af4158015614b7d573d6000803e3d6000fd5b505050505050505050505050505050565b600061097f8383614c24565b614ba2614e8a565b6000614bb18460200151613353565b90506000614bc28560400151613353565b90506000614bcf856138e2565b9050614bdb8382612d0e565b8452614be78282612d0e565b6020850152614bf58361336e565b6040850152614c038261336e565b60608501525091949350505050565b670de0b6b3a764000081810391100290565b6000614c338215156004611c85565b670de0b6b3a76400008302614c65841580614c5e5750670de0b6b3a7640000858381614c5b57fe5b04145b6005611c85565b6001836001830304018115150291505092915050565b6000614c8861128f6122f4565b90506000808088516001811115614c9b57fe5b14614cab57838860600151614cb2565b8760600151845b9150915073__$b21b5fdadf799f52ef5daa76c49e71b2c3$__63874b47826000614cdf8b60200151614936565b86614cea8b88611b7a565b8c516040516001600160e01b031960e088901b168152614d11959493929190600401615d6c565b60006040518083038186803b158015614d2957600080fd5b505af4158015614d3d573d6000803e3d6000fd5b5050505073__$b21b5fdadf799f52ef5daa76c49e71b2c3$__63874b47826001614d6a8b60400151614936565b86614d758a87611c60565b8c602001516040518663ffffffff1660e01b8152600401614d9a959493929190615d6c565b60006040518083038186803b158015614db257600080fd5b505af4158015614dc6573d6000803e3d6000fd5b505050505050505050505050565b6000614de38215156004611c85565b670de0b6b3a76400008302614e0b841580614c5e5750670de0b6b3a7640000858381614c5b57fe5b82818161458c57fe5b6000614e31600284101580156135fd575060ff8411156064611c85565b614e3f828511156064611c85565b6000196001841b01611572614e5486836143f3565b846148c9565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b803561085a81615f89565b600082601f830112614ecd578081fd5b8135614ee0614edb82615f54565b615f2e565b818152915060208083019084810181840286018201871015614f0157600080fd5b60005b84811015614f29578135614f1781615f89565b84529282019290820190600101614f04565b505050505092915050565b600082601f830112614f44578081fd5b8151614f52614edb82615f54565b818152915060208083019084810181840286018201871015614f7357600080fd5b60005b84811015614f29578151614f8981615f89565b84529282019290820190600101614f76565b600082601f830112614fab578081fd5b8135614fb9614edb82615f54565b818152915060208083019084810181840286018201871015614fda57600080fd5b60005b84811015614f2957813584529282019290820190600101614fdd565b600082601f830112615009578081fd5b8151615017614edb82615f54565b81815291506020808301908481018184028601820187101561503857600080fd5b60005b84811015614f295781518452928201929082019060010161503b565b600082601f830112615067578081fd5b81356001600160401b0381111561507c578182fd5b61508f601f8201601f1916602001615f2e565b91508082528360208285010111156150a657600080fd5b8060208401602084013760009082016020015292915050565b80516004811061085a57600080fd5b80356002811061085a57600080fd5b60006101208083850312156150f0578182fd5b6150f981615f2e565b91505061510683836150ce565b81526151158360208401614eb2565b60208201526151278360408401614eb2565b6040820152606082013560608201526080820135608082015260a082013560a08201526151578360c08401614eb2565b60c08201526151698360e08401614eb2565b60e0820152610100808301356001600160401b0381111561518957600080fd5b61519585828601615057565b82840152505092915050565b6000602082840312156151b2578081fd5b813561097f81615f89565b600080604083850312156151cf578081fd5b82356151da81615f89565b915060208301356151ea81615f89565b809150509250929050565b600080600060608486031215615209578081fd5b833561521481615f89565b9250602084013561522481615f89565b929592945050506040919091013590565b600080600080600080600060e0888a03121561524f578485fd5b873561525a81615f89565b9650602088013561526a81615f89565b95506040880135945060608801359350608088013561528881615fac565b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156152b7578182fd5b82356152c281615f89565b946020939093013593505050565b600080604083850312156152e2578182fd5b82516001600160401b03808211156152f8578384fd5b61530486838701614f34565b93506020850151915080821115615319578283fd5b5061498485828601614ff9565b6000806000806080858703121561533b578182fd5b84356001600160401b0380821115615351578384fd5b61535d88838901614ebd565b95506020870135915080821115615372578384fd5b61537e88838901614f9b565b94506040870135915080821115615393578384fd5b61539f88838901614f9b565b935060608701359150808211156153b4578283fd5b506153c187828801614f9b565b91505092959194509250565b6000806000606084860312156153e1578081fd5b83516001600160401b03808211156153f7578283fd5b61540387838801614f34565b94506020860151915080821115615418578283fd5b5061542586828701614ff9565b925050604084015190509250925092565b600060208284031215615447578081fd5b813561097f81615f9e565b600060208284031215615463578081fd5b815161097f81615f9e565b60006020828403121561547f578081fd5b5051919050565b600080600080600080600060e0888a0312156154a0578081fd5b8735965060208801356154b281615f89565b955060408801356154c281615f89565b945060608801356001600160401b03808211156154dd578283fd5b6154e98b838c01614f9b565b955060808a0135945060a08a0135935060c08a013591508082111561550c578283fd5b506155198a828b01615057565b91505092959891949750929550565b60008060006060848603121561553c578081fd5b8351925060208401516001600160401b0380821115615559578283fd5b61556587838801614f34565b9350604086015191508082111561557a578283fd5b5061558786828701614ff9565b9150509250925092565b6000602082840312156155a2578081fd5b81356001600160e01b03198116811461097f578182fd5b6000602082840312156155ca578081fd5b815161097f81615f89565b600080600080600060a086880312156155ec578283fd5b85356155f781615f89565b9450602086013561560781615f89565b93506040860135925060608601359150608086013561562581615f89565b809150509295509295909350565b600080600060608486031215615647578081fd5b833561565281615f89565b925060208401359150604084013561566981615f89565b809150509250925092565b600060208284031215615685578081fd5b61097f83836150bf565b600080604083850312156156a1578182fd5b6156ab84846150bf565b915060208301516001600160401b038111156156c5578182fd5b61498485828601614ff9565b600080600080608085870312156156e6578182fd5b84356001600160401b03808211156156fc578384fd5b615708888389016150dd565b9550602087013591508082111561571d578384fd5b5061572a87828801614f9b565b949794965050505060408301359260600135919050565b600080600060608486031215615755578081fd5b83356001600160401b0381111561576a578182fd5b615776868287016150dd565b9660208601359650604090950135949350505050565b60006020828403121561579d578081fd5b5035919050565b600080604083850312156157b6578182fd5b8251915060208301516001600160401b038111156156c5578182fd5b600080600080608085870312156157e7578182fd5b843593506020850135925060408501356001600160401b038082111561580b578384fd5b61539f88838901614ebd565b6000806000806080858703121561582c578182fd5b845193506020850151925060408501519150606085015161584c81615f89565b939692955090935050565b6000806000806080858703121561586c578182fd5b5050823594602084013594506040840135936060013592509050565b600060208284031215615899578081fd5b815161097f81615fac565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156158e0578151875295820195908201906001016158c4565b509495945050505050565b6000815180845260208085019450808401835b838110156158e05781516001600160a01b0316875295820195908201906001016158fe565b60008151808452815b818110156159485760208185018101518683018201520161592c565b818111156159595782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b82811015615a4f5781518051600481106159f857fe5b855280870151615a0a888701826158a4565b508581015186860152606080820151615a25828801826158a4565b505060809081015190615a3a868201836158a4565b505060a09390930192908501906001016159e2565b5091979650505050505050565b60006020825261097f60208301846158b1565b600060408252615a8260408301856158b1565b828103602084015261157281856158b1565b6000610100808352615aa88184018c6158b1565b90508281036020840152615abc818b615923565b90508860408401528281036060840152615ad681896158b1565b90508281036080840152615aea81886158b1565b90508560a084015282810360c0840152615b0481866158b1565b91505060018060a01b03831660e08301529998505050505050505050565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b81811015615be957615bd78551615f73565b83529383019391830191600101615bc5565b505084810360408601528551808252908201925081860190845b818110156135be57615c158351615f73565b85529383019391830191600101615c03565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b600084825260606020830152615c6c6060830185615923565b9050826040830152949350505050565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b600061010060018060a01b03808c1684528a6020850152896040850152816060850152615ce08285018a6158eb565b91508382036080850152615cf482896158b1565b96811660a08501529490941660c08301525060e001525095945050505050565b600060018060a01b03808a16835288602084015287604084015260e06060840152615d4260e08401886158eb565b8381036080850152615d5481886158b1565b9590911660a0840152505060c0015295945050505050565b60a08101615d7987615f7f565b95815260208101949094526040840192909252606083015260809091015290565b60208101615da783615f7f565b91905290565b60006020825261097f6020830184615923565b600087825260c06020830152615dd960c08301886158b1565b8281036040840152615deb81886158b1565b90508281036060840152615dff81876158b1565b90508281036080840152615e1381866158b1565b91505082151560a0830152979650505050505050565b600083825260406020830152611b0d60408301846158b1565b918252602082015260400190565b600085825284602083015260806040830152615e6f60808301856158b1565b8281036060840152615e8181856158b1565b979650505050505050565b92835260208301919091521515604082015260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b958652602086019490945260408501929092526060840152608083015260a082015260c00190565b60ff91909116815260200190565b6040518181016001600160401b0381118282101715615f4c57600080fd5b604052919050565b60006001600160401b03821115615f69578081fd5b5060209081020190565b6001600160a01b031690565b60038110610fbe57fe5b6001600160a01b0381168114610fbe57600080fd5b8015158114610fbe57600080fd5b60ff81168114610fbe57600080fdfea2646970667358221220567d78860fb5e32a44f1b7dcf39abc28fc1211245854270ff7f80064c0764ccb64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80636634b753116100875780636634b753146101525780636c57f5a9146101725780637304b8b91461017a578063739238d61461018d578063851c1bb3146101955780638a47ae3b146101b55780638d928af8146101bd578063aaabadc5146101c5576100d4565b8062c194db146100d9578063174481fa146100f75780632da47c401461010d5780632f2770db146101235780633f819b6f1461012d578063508f0eae1461013557806354fd4d501461014a575b600080fd5b6100e16101cd565b6040516100ee9190611027565b60405180910390f35b6100ff6101ec565b6040516100ee929190610fda565b610115610232565b6040516100ee929190611100565b61012b6102b9565b005b6100e1610301565b61013d610397565b6040516100ee9190610fc6565b6100e16103bb565b610165610160366004610c3d565b61041c565b6040516100ee9190610ff4565b61016561043a565b61013d610188366004610cb9565b610443565b61013d610545565b6101a86101a3366004610c75565b610569565b6040516100ee9190610fff565b61013d6105bb565b61013d6105df565b61013d610603565b60606101e7604051806020016040528060008152506106cf565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156102ab57807f00000000000000000000000000000000000000000000000000000000000000000392507f000000000000000000000000000000000000000000000000000000000000000091506102b4565b60009250600091505b509091565b6102c16107a8565b6102c96107d9565b6002805460ff191660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561038d5780601f106103625761010080835404028352916020019161038d565b820191906000526020600020905b81548152906001019060200180831161037057829003601f168201915b5050505050905090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561038d5780601f106103625761010080835404028352916020019161038d565b6001600160a01b031660009081526001602052604090205460ff1690565b60025460ff1690565b6000806000610450610232565b9150915061045c6109d6565b6040518060e0016040528061046f6105df565b6001600160a01b03168152602001610485610545565b6001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602001848152602001838152602001610505610301565b815250905061053988828989604051602001610524949392919061103a565b604051602081830303815290604052866107ee565b98975050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f00000000000000000000000000000000000000000000000000000000000000008260405160200161059e929190610fae565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061060d6105df565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561064557600080fd5b505afa158015610659573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e79190610c9d565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506106c96001600160a01b03831615156101ac61085e565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010161079a818386610870565b505050505050505050919050565b60006107bf6000356001600160e01b031916610569565b90506107d66107ce82336108ae565b61019161085e565b50565b6107ec6107e461043a565b1560d361085e565b565b60006107f86107d9565b6000610804848461093e565b6001600160a01b0381166000818152600160208190526040808320805460ff19169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a290505b92915050565b8161086c5761086c8161097b565b5050565b5b60208110610890578151835260209283019290910190601f1901610871565b905182516020929092036101000a6000190180199091169116179052565b60006108b8610603565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016108e793929190611008565b60206040518083038186803b1580156108ff57600080fd5b505afa158015610913573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109379190610c59565b9392505050565b6000606061094b846106cf565b90506000838251602084016000f590506001600160a01b038116610973573d6000803e3d6000fd5b949350505050565b62461bcd60e51b600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526107d6916210905360ea1b906242414c90606490fd5b6040518060e0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001606081525090565b803561085881611161565b600082601f830112610a52578081fd5b8135610a65610a6082611135565b61110e565b818152915060208083019084810181840286018201871015610a8657600080fd5b60005b84811015610aae578135610a9c81611161565b84529282019290820190600101610a89565b505050505092915050565b600082601f830112610ac9578081fd5b8135610ad7610a6082611135565b818152915060208083019084810181840286018201871015610af857600080fd5b60005b84811015610aae57813584529282019290820190600101610afb565b803561085881611176565b600082601f830112610b32578081fd5b813567ffffffffffffffff811115610b48578182fd5b610b5b601f8201601f191660200161110e565b9150808252836020828501011115610b7257600080fd5b8060208401602084013760009082016020015292915050565b600060e08284031215610b9c578081fd5b610ba660e061110e565b9050813567ffffffffffffffff80821115610bc057600080fd5b610bcc85838601610a42565b83526020840135915080821115610be257600080fd5b50610bef84828501610ab9565b60208301525060408201356040820152610c0c8360608401610b17565b6060820152610c1e8360808401610b17565b608082015260a082013560a082015260c082013560c082015292915050565b600060208284031215610c4e578081fd5b813561093781611161565b600060208284031215610c6a578081fd5b815161093781611176565b600060208284031215610c86578081fd5b81356001600160e01b031981168114610937578182fd5b600060208284031215610cae578081fd5b815161093781611161565b60008060008060808587031215610cce578283fd5b843567ffffffffffffffff80821115610ce5578485fd5b9086019060608289031215610cf8578485fd5b610d02606061110e565b823582811115610d10578687fd5b610d1c8a828601610b22565b82525060208084013583811115610d31578788fd5b610d3d8b828701610b22565b8284015250604084013583811115610d53578788fd5b80850194505089601f850112610d67578687fd5b8335610d75610a6082611135565b81815282810190868401848402880185018e1015610d91578a8bfd5b8a97505b83881015610dbc578035610da881611161565b835260019790970196918401918401610d95565b5060408501525091975088013592505080821115610dd8578485fd5b50610de587828801610b8b565b935050610df58660408701610a37565b9396929550929360600135925050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015610e4157815187529582019590820190600101610e25565b509495945050505050565b15159052565b60008151808452815b81811015610e7757602081850181015186830182015201610e5b565b81811115610e885782602083870101525b50601f01601f19169290920160200192915050565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152806060840151166060850152506080820151608084015260a082015160a084015260c082015160e060c085015261097360e0850182610e52565b805160e0808452815190840181905260009160209190820190610100860190845b81811015610f4357610f318451611155565b83529284019291840191600101610f1f565b505082850151915085810383870152610f5c8183610e12565b92505050604083015160408501526060830151610f7c6060860182610e4c565b506080830151610f8f6080860182610e4c565b5060a083015160a085015260c083015160c08501528091505092915050565b9182526001600160e01b031916602082015260240190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b901515815260200190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b6000602082526109376020830184610e52565b60006080825285516060608084015261105660e0840182610e52565b9050602080880151607f19808685030160a08701526110758483610e52565b60408b015187820390920160c0880152815180825291840194508592508301905b808310156110be576110a88551611155565b8252938301936001929092019190830190611096565b50858103838701526110d0818a610e9d565b935050505082810360408401526110e78186610efe565b9150506110f76060830184610e05565b95945050505050565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561112d57600080fd5b604052919050565b600067ffffffffffffffff82111561114b578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146107d657600080fd5b80151581146107d657600080fdfea26469706673582212202f63f9fa4ce4d5cb26280e0345fbb785815d64e85925aabd074582cf439f421364736f6c63430007010033", + "linkReferences": { + "contracts/lib/CircuitBreakerLib.sol": { + "CircuitBreakerLib": [ + { + "length": 20, + "start": 25355 + }, + { + "length": 20, + "start": 30356 + }, + { + "length": 20, + "start": 30500 + } + ] + }, + "contracts/managed/ManagedPoolAddRemoveTokenLib.sol": { + "ManagedPoolAddRemoveTokenLib": [ + { + "length": 20, + "start": 14984 + }, + { + "length": 20, + "start": 17492 + } + ] + }, + "contracts/managed/ManagedPoolAmmLib.sol": { + "ManagedPoolAmmLib": [ + { + "length": 20, + "start": 22571 + }, + { + "length": 20, + "start": 23689 + }, + { + "length": 20, + "start": 31576 + }, + { + "length": 20, + "start": 32006 + }, + { + "length": 20, + "start": 32145 + } + ] + } + }, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/index.ts b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/index.ts new file mode 100644 index 0000000..cfa02bc --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/index.ts @@ -0,0 +1,114 @@ +import { ethers } from 'hardhat'; +import { getContractDeploymentTransactionHash, saveContractDeploymentTransactionHash } from '@src'; +import { Task, TaskMode, TaskRunOptions } from '@src'; +import { ManagedPoolDeployment } from './input'; +import * as expectEvent from '@helpers/expectEvent'; +import { bn, fp } from '@helpers/numbers'; +import { ZERO_ADDRESS, ZERO_BYTES32 } from '@helpers/constants'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as ManagedPoolDeployment; + + const addRemoveTokenLib = await task.deployAndVerify('ManagedPoolAddRemoveTokenLib', [], from, force); + const circuitBreakerLib = await task.deployAndVerify('CircuitBreakerLib', [], from, force); + const libs = { CircuitBreakerLib: circuitBreakerLib.address }; + const ammLib = await task.deployAndVerify('ManagedPoolAmmLib', [], from, force, libs); + const math = await task.deployAndVerify('ExternalWeightedMath', [], from, force); + const recoveryModeHelper = await task.deployAndVerify('RecoveryModeHelper', [input.Vault], from, force); + + const args = [ + input.Vault, + input.ProtocolFeePercentagesProvider, + math.address, + recoveryModeHelper.address, + input.FactoryVersion, + input.PoolVersion, + input.InitialPauseWindowDuration, + input.BufferPeriodDuration, + ]; + + const factory = await task.deployAndVerify('ManagedPoolFactory', args, from, force, { + CircuitBreakerLib: circuitBreakerLib.address, + ManagedPoolAddRemoveTokenLib: addRemoveTokenLib.address, + ManagedPoolAmmLib: ammLib.address, + }); + + if (task.mode === TaskMode.LIVE) { + // We also create a Pool using the factory and verify it, to let us compute their action IDs and so that future + // Pools are automatically verified. We however don't run any of this code in CHECK mode, since we don't care about + // the contracts deployed here. The action IDs will be checked to be correct via a different mechanism. + const newManagedPoolParams = { + name: 'DO NOT USE - Mock Managed Pool', + symbol: 'TEST', + assetManagers: [ZERO_ADDRESS, ZERO_ADDRESS], + }; + + const newManagedPoolSettings = { + tokens: [input.WETH, input.BAL].sort(function (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()); + }), + normalizedWeights: [fp(0.8), fp(0.2)], + swapFeePercentage: bn(1e12), + swapEnabledOnStart: true, + mustAllowlistLPs: false, + managementAumFeePercentage: fp(0.5), + aumFeeId: 2, + }; + + const newManagedPoolConfig = { + vault: input.Vault, + protocolFeeProvider: input.ProtocolFeePercentagesProvider, + weightedMath: await factory.getWeightedMath(), + recoveryModeHelper: await factory.getRecoveryModeHelper(), + pauseWindowDuration: undefined, + bufferPeriodDuration: undefined, + version: input.PoolVersion, + }; + // The pauseWindowDuration and bufferPeriodDuration will be filled in later, but we need to declare them here to + // appease the type system. Those are constructor arguments, but automatically provided by the factory. + const mockPoolArgs = { + params: newManagedPoolParams, + config: newManagedPoolConfig, + settings: newManagedPoolSettings, + owner: ZERO_ADDRESS, + salt: ZERO_BYTES32, + }; + + // This mimics the logic inside task.deploy + if (force || !task.output({ ensure: false })['MockManagedPool']) { + const poolCreationReceipt = await ( + await factory.create(mockPoolArgs.params, mockPoolArgs.settings, mockPoolArgs.owner, mockPoolArgs.salt) + ).wait(); + const event = expectEvent.inReceipt(poolCreationReceipt, 'PoolCreated'); + const mockPoolAddress = event.args.pool; + + await saveContractDeploymentTransactionHash(mockPoolAddress, poolCreationReceipt.transactionHash, task.network); + await task.save({ MockManagedPool: mockPoolAddress }); + } + + const mockPool = await task.instanceAt('ManagedPool', task.output()['MockManagedPool']); + + // In order to verify the Pool's code, we need to complete its constructor arguments by computing the factory + // provided arguments (pause durations). + + // The durations require knowing when the Pool was created, so we look for the timestamp of its creation block. + const txHash = await getContractDeploymentTransactionHash(mockPool.address, task.network); + const tx = await ethers.provider.getTransactionReceipt(txHash); + const poolCreationBlock = await ethers.provider.getBlock(tx.blockNumber); + + // With those and the period end times, we can compute the durations. + const { pauseWindowEndTime, bufferPeriodEndTime } = await mockPool.getPausedState(); + mockPoolArgs.config.pauseWindowDuration = pauseWindowEndTime.sub(poolCreationBlock.timestamp); + mockPoolArgs.config.bufferPeriodDuration = bufferPeriodEndTime + .sub(poolCreationBlock.timestamp) + .sub(mockPoolArgs.config.pauseWindowDuration); + + // We are now ready to verify the Pool + await task.verify('ManagedPool', mockPool.address, [ + mockPoolArgs.params, + mockPoolArgs.config, + mockPoolArgs.settings, + mockPoolArgs.owner, + ]); + } +}; diff --git a/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/input.ts b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/input.ts new file mode 100644 index 0000000..14c9470 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/input.ts @@ -0,0 +1,33 @@ +import { MONTH } from '@helpers/time'; +import { Task, TaskMode } from '@src'; + +export type ManagedPoolDeployment = { + Vault: string; + ProtocolFeePercentagesProvider: string; + FactoryVersion: string; + PoolVersion: string; + InitialPauseWindowDuration: number; + BufferPeriodDuration: number; + WETH: string; + BAL: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); +const BaseVersion = { version: 2, deployment: '20230411-managed-pool-v2' }; +const WETH = new Task('00000000-tokens', TaskMode.READ_ONLY); +const BAL = new Task('00000000-tokens', TaskMode.READ_ONLY); + +// Since these pools have many experimental features, use a longer pause period. +const extendedPauseWindowDuration = MONTH * 9; + +export default { + Vault, + ProtocolFeePercentagesProvider, + FactoryVersion: JSON.stringify({ name: 'ManagedPoolFactory', ...BaseVersion }), + PoolVersion: JSON.stringify({ name: 'ManagedPool', ...BaseVersion }), + InitialPauseWindowDuration: extendedPauseWindowDuration, + BufferPeriodDuration: MONTH, + WETH, + BAL, +}; diff --git a/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/arbitrum.json b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/arbitrum.json new file mode 100644 index 0000000..a21211f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/arbitrum.json @@ -0,0 +1,9 @@ +{ + "ManagedPoolAddRemoveTokenLib": "0xA69E0Ccf150a29369D8Bbc0B3f510849dB7E8EEE", + "CircuitBreakerLib": "0xDF9B5B00Ef9bca66e9902Bd813dB14e4343Be025", + "ManagedPoolAmmLib": "0x300Ab2038EAc391f26D9F895dc61F8F66a548833", + "ExternalWeightedMath": "0x03F3Fb107e74F2EAC9358862E91ad3c692712054", + "RecoveryModeHelper": "0x682f0dDBFd41D1272982f64a499Fb62d80e27589", + "ManagedPoolFactory": "0x8eA89804145c007e7D226001A96955ad53836087", + "MockManagedPool": "0xf5A71257B331C02dA1Eae52151C3d600f16B76F0" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/avalanche.json b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/avalanche.json new file mode 100644 index 0000000..44bee56 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/avalanche.json @@ -0,0 +1,9 @@ +{ + "ManagedPoolAddRemoveTokenLib": "0xAcf05BE5134d64d150d153818F8C67EE36996650", + "CircuitBreakerLib": "0x9129E834e15eA19b6069e8f08a8EcFc13686B8dC", + "ManagedPoolAmmLib": "0xA69E0Ccf150a29369D8Bbc0B3f510849dB7E8EEE", + "ExternalWeightedMath": "0xDF9B5B00Ef9bca66e9902Bd813dB14e4343Be025", + "RecoveryModeHelper": "0x300Ab2038EAc391f26D9F895dc61F8F66a548833", + "ManagedPoolFactory": "0x03F3Fb107e74F2EAC9358862E91ad3c692712054", + "MockManagedPool": "0x3Fb81f6FB0dd94c6fC7e138887f1CA4CDB5E2999" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/base.json b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/base.json new file mode 100644 index 0000000..e7eb648 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/base.json @@ -0,0 +1,9 @@ +{ + "ManagedPoolAddRemoveTokenLib": "0xb19382073c7A0aDdbb56Ac6AF1808Fa49e377B75", + "CircuitBreakerLib": "0xEF454a7B3f965D3f6723E462405246f8Cd865425", + "ManagedPoolAmmLib": "0x7d2248F194755DCa9A1887099394F39476d28C9a", + "ExternalWeightedMath": "0x7920BFa1b2041911b354747CA7A6cDD2dfC50Cfd", + "RecoveryModeHelper": "0x313a8D36b1d90a4cba3A505fDc3480C3870bE053", + "ManagedPoolFactory": "0x9a62C91626d39D0216b3959112f9D4678E20134d", + "MockManagedPool": "0xE50AD96Af9370D05D3C1cE85F17C31557B29C4Ee" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/bsc.json b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/bsc.json new file mode 100644 index 0000000..6c89c78 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/bsc.json @@ -0,0 +1,9 @@ +{ + "ManagedPoolAddRemoveTokenLib": "0x59562f93c447656F6E4799fC1FC7c3d977C3324F", + "CircuitBreakerLib": "0x2498A2B0d6462d2260EAC50aE1C3e03F4829BA95", + "ManagedPoolAmmLib": "0xDEd7Fef7D8eCdcB74F22f0169e1A9EC696e6695d", + "ExternalWeightedMath": "0x8df317a729fcaA260306d7de28888932cb579b88", + "RecoveryModeHelper": "0x3B1eb8EB7b43882b385aB30533D9A2BeF9052a98", + "ManagedPoolFactory": "0x4C32a8a8fDa4E24139B51b456B42290f51d6A1c4", + "MockManagedPool": "0x710A461Ea47AE36C45CBA8Cb6ce964e8A5cb87eD" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/gnosis.json b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/gnosis.json new file mode 100644 index 0000000..50a2de6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/gnosis.json @@ -0,0 +1,9 @@ +{ + "ManagedPoolAddRemoveTokenLib": "0x4C32a8a8fDa4E24139B51b456B42290f51d6A1c4", + "CircuitBreakerLib": "0x54f8F9d28e26Fa5864cfA80f50A5Df95fD85f46a", + "ManagedPoolAmmLib": "0xAcf05BE5134d64d150d153818F8C67EE36996650", + "ExternalWeightedMath": "0x9129E834e15eA19b6069e8f08a8EcFc13686B8dC", + "RecoveryModeHelper": "0xA69E0Ccf150a29369D8Bbc0B3f510849dB7E8EEE", + "ManagedPoolFactory": "0xDF9B5B00Ef9bca66e9902Bd813dB14e4343Be025", + "MockManagedPool": "0xc061361fDa32fF5b65F7D98aCC9a87349d3F0768" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/goerli.json b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/goerli.json new file mode 100644 index 0000000..26e04e7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/goerli.json @@ -0,0 +1,9 @@ +{ + "ManagedPoolAddRemoveTokenLib": "0xAcf05BE5134d64d150d153818F8C67EE36996650", + "CircuitBreakerLib": "0x9129E834e15eA19b6069e8f08a8EcFc13686B8dC", + "ManagedPoolAmmLib": "0xA69E0Ccf150a29369D8Bbc0B3f510849dB7E8EEE", + "ExternalWeightedMath": "0xDF9B5B00Ef9bca66e9902Bd813dB14e4343Be025", + "RecoveryModeHelper": "0x300Ab2038EAc391f26D9F895dc61F8F66a548833", + "ManagedPoolFactory": "0x03F3Fb107e74F2EAC9358862E91ad3c692712054", + "MockManagedPool": "0xff79b51ec2934Dd1810a8e0325e3B08708720B26" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/mainnet.json b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/mainnet.json new file mode 100644 index 0000000..05a4388 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/mainnet.json @@ -0,0 +1,9 @@ +{ + "ManagedPoolAddRemoveTokenLib": "0x4148bf5B0688eD0a87F317c6534Cb841f503349e", + "CircuitBreakerLib": "0x4967b3353Cdf9E5C67421a3890d35f2f3BB50527", + "ManagedPoolAmmLib": "0xb37646ACBb1A91287721B2CdBe01BA0DbA5E57A2", + "ExternalWeightedMath": "0x3db89f0CA3b388f2BcDbccD2ff8E13C22459CF75", + "RecoveryModeHelper": "0x7827108Af2fd9910EA7cf361d9b827941FA7D809", + "ManagedPoolFactory": "0xBF904F9F340745B4f0c4702c7B6Ab1e808eA6b93", + "MockManagedPool": "0xD0cbF6765997b7CA7Be6440F5E305B2ec7B96065" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/mode.json b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/mode.json new file mode 100644 index 0000000..a7ddd4b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/mode.json @@ -0,0 +1,9 @@ +{ + "ManagedPoolAddRemoveTokenLib": "0x81cFAE226343B24BA12EC6521Db2C79E7aeeb310", + "CircuitBreakerLib": "0xa523f47A933D5020b23629dDf689695AA94612Dc", + "ManagedPoolAmmLib": "0x6817149cb753BF529565B4D023d7507eD2ff4Bc0", + "ExternalWeightedMath": "0x6B5dA774890Db7B7b96C6f44e6a4b0F657399E2e", + "RecoveryModeHelper": "0x7Ba29fE8E83dd6097A7298075C4AFfdBda3121cC", + "ManagedPoolFactory": "0x043A2daD730d585C44FB79D2614F295D2d625412", + "MockManagedPool": "0xB227B52B20a755B8b724c63E8Ac8d42Ff0FD64Fd" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/optimism.json b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/optimism.json new file mode 100644 index 0000000..3fe96a1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/optimism.json @@ -0,0 +1,9 @@ +{ + "ManagedPoolAddRemoveTokenLib": "0x59562f93c447656F6E4799fC1FC7c3d977C3324F", + "CircuitBreakerLib": "0x2498A2B0d6462d2260EAC50aE1C3e03F4829BA95", + "ManagedPoolAmmLib": "0xDEd7Fef7D8eCdcB74F22f0169e1A9EC696e6695d", + "ExternalWeightedMath": "0x8df317a729fcaA260306d7de28888932cb579b88", + "RecoveryModeHelper": "0x3B1eb8EB7b43882b385aB30533D9A2BeF9052a98", + "ManagedPoolFactory": "0x4C32a8a8fDa4E24139B51b456B42290f51d6A1c4", + "MockManagedPool": "0xb4AF4fdd49da2A2BA9522EAdCF86D407a69f19c8" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/polygon.json b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/polygon.json new file mode 100644 index 0000000..3bc7ff5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/polygon.json @@ -0,0 +1,9 @@ +{ + "ManagedPoolAddRemoveTokenLib": "0xf553bf40DB86c35f3058434039D51Aad29c6180b", + "CircuitBreakerLib": "0xEDFd0A7005A7c72c44Ff13bEa370c86A9D11beE1", + "ManagedPoolAmmLib": "0xCEFD59EedAFA9EE8Ccda1AaF944088E68B5BD890", + "ExternalWeightedMath": "0x72EbAFDdC4C7d3EB702c81295D90A8B29F008a03", + "RecoveryModeHelper": "0x1eb79551CA0e83EC145608BC39a0c7F10cA21Aa5", + "ManagedPoolFactory": "0xB8Dfa4fd0F083de2B7EDc0D5eeD5E684e54bA45D", + "MockManagedPool": "0x074eFD7806e6c28e8b6611075b1Aa62c6c408090" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/sepolia.json b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/sepolia.json new file mode 100644 index 0000000..679c0be --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/sepolia.json @@ -0,0 +1,9 @@ +{ + "ManagedPoolAddRemoveTokenLib": "0xc7416E4f3715467dDcf28dc409A9483b2E4D4F43", + "CircuitBreakerLib": "0x4C0C450bEdB9282A7a54fCB316c285E85A8c0265", + "ManagedPoolAmmLib": "0xa30aDE89E6af5b0Ca515cd78e44f9aD0c63989b2", + "ExternalWeightedMath": "0x8246e571d88ACd1346179Cc3641DE87Fe3544d7A", + "RecoveryModeHelper": "0x5419e785b83Ad3539D3a8741C0ABb77D90d8784E", + "ManagedPoolFactory": "0x63e179C5b6d54B2c2e36b9cE4085EF5A8C86D50c", + "MockManagedPool": "0xE458224CA8d6605c87b73E92aa5CB7A4e77770f3" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/zkevm.json b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/zkevm.json new file mode 100644 index 0000000..0f3b88e --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/output/zkevm.json @@ -0,0 +1,9 @@ +{ + "ManagedPoolAddRemoveTokenLib": "0xAcf05BE5134d64d150d153818F8C67EE36996650", + "CircuitBreakerLib": "0x9129E834e15eA19b6069e8f08a8EcFc13686B8dC", + "ManagedPoolAmmLib": "0xA69E0Ccf150a29369D8Bbc0B3f510849dB7E8EEE", + "ExternalWeightedMath": "0xDF9B5B00Ef9bca66e9902Bd813dB14e4343Be025", + "RecoveryModeHelper": "0x300Ab2038EAc391f26D9F895dc61F8F66a548833", + "ManagedPoolFactory": "0xaf779e58dafb4307b998C7b3C9D3f788DFc80632", + "MockManagedPool": "0x522Ee506a2f63D0AE1D79D6F5Dbd9d0bCA32C866" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/readme.md b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/readme.md new file mode 100644 index 0000000..a43224c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/readme.md @@ -0,0 +1,27 @@ +# 2023-04-11 - Managed Pool Factory V2 + +Second deployment of the `ManagedPoolFactory`, which allows creating Managed Pools using create2, reentrancy protection, and other improvements. + +A Managed Pool is a Weighted Pool with mutable tokens and weights, designed to be used in conjunction with an owner contract containing specific business logic. This in turn may support many asset management use cases, such as large token counts, rebalancing through token changes, gradual weight or fee updates, fine-grained control of protocol and management fees, allowlisting of LPs, and more. + +> ⚠️ **DO NOT USE DIRECTLY** ⚠️ +> +> Managed Pools should always be paired with another contract acting as their owner, which should implement sensible security policies. The owner of a Managed Pool has full control over all of its assets. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`ManagedPoolFactory` artifact](./artifact/ManagedPoolFactory.json) +- [`ManagedPoolAddRemoveTokenLib` artifact](./artifact/ManagedPoolAddRemoveTokenLib.json) +- [`ManagedPoolAmmLib` artifact](./artifact/ManagedPoolAmmLib.json) +- [`CircuitBreakerLib` artifact](./artifact/CircuitBreakerLib.json) diff --git a/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/test/task.fork.ts b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/test/task.fork.ts new file mode 100644 index 0000000..bdcca0e --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230411-managed-pool-v2/test/task.fork.ts @@ -0,0 +1,398 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { BasePoolEncoder } from '@helpers/models/pools/utils/encoder'; +import { WeightedPoolEncoder } from '@helpers/models/pools/weighted/encoder'; +import { SwapKind } from '@helpers/models/types/types'; +import { toNormalizedWeights } from '@helpers/models/pools/weighted/normalizedWeights'; +import * as expectEvent from '@helpers/expectEvent'; +import { bn, fp } from '@helpers/numbers'; +import { expectEqualWithError } from '@helpers/relativeError'; +import { actionId } from '@helpers/models/misc/actions'; +import { MAX_UINT256, ONES_BYTES32, ZERO_ADDRESS, ZERO_BYTES32 } from '@helpers/constants'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { ManagedPoolParams, ManagedPoolSettingsParams, ProtocolFee } from '@helpers/models/types/types'; +import { sharedBeforeEach } from '@helpers/sharedBeforeEach'; +import { getSigner, impersonate, getForkedNetwork, Task, TaskMode, describeForkTest } from '@src'; +import { randomBytes } from 'ethers/lib/utils'; +import { deploy } from '@src'; + +describeForkTest('ManagedPoolFactory', 'mainnet', 17033100, function () { + let owner: SignerWithAddress, whale: SignerWithAddress, govMultisig: SignerWithAddress; + let factory: Contract, + vault: Contract, + authorizer: Contract, + uni: Contract, + comp: Contract, + aave: Contract, + math: Contract; + + let task: Task; + + enum AttackType { + SET_MANAGEMENT_AUM_FEE, + COLLECT_AUM_MANAGEMENT_FEES, + ADD_TOKEN, + REMOVE_TOKEN, + UPDATE_PROTOCOL_FEE_CACHE, + } + + const COMP = '0xc00e94cb662c3520282e6f5717214004a7f26888'; + const UNI = '0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984'; + const AAVE = '0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9'; + + const tokens = [UNI, AAVE, COMP]; + const initialBalanceCOMP = fp(1e4); + const initialBalanceUNI = fp(1e5); + const initialBalanceAAVE = fp(1e4); + const initialBalances = [initialBalanceUNI, initialBalanceAAVE, initialBalanceCOMP]; + + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + const LARGE_TOKEN_HOLDER = '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503'; + + const NAME = 'Balancer Pool Token'; + const SYMBOL = 'BPT'; + const POOL_SWAP_FEE_PERCENTAGE = fp(0.01); + const POOL_MANAGEMENT_AUM_FEE_PERCENTAGE = fp(0.01); + const WEIGHTS = toNormalizedWeights([fp(20), fp(30), fp(50)]); + + before('run task', async () => { + task = new Task('20230411-managed-pool-v2', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('ManagedPoolFactory'); + math = await task.instanceAt('ExternalWeightedMath', await factory.getWeightedMath()); + }); + + before('load signers', async () => { + owner = await getSigner(); + whale = await impersonate(LARGE_TOKEN_HOLDER); + + govMultisig = await impersonate(GOV_MULTISIG); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + authorizer = await new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance( + 'Authorizer' + ); + + comp = await task.instanceAt('IERC20', COMP); + uni = await task.instanceAt('IERC20', UNI); + aave = await task.instanceAt('IERC20', AAVE); + }); + + async function createPool(swapEnabled = true, mustAllowlistLPs = false, saltParam = ''): Promise { + const assetManagers: string[] = Array(tokens.length).fill(ZERO_ADDRESS); + assetManagers[0] = owner.address; + const salt = saltParam == '' ? randomBytes(32) : saltParam; + + const newPoolParams: ManagedPoolParams = { + name: NAME, + symbol: SYMBOL, + assetManagers: assetManagers, + }; + + const settingsParams: ManagedPoolSettingsParams = { + tokens: tokens, + normalizedWeights: WEIGHTS, + swapFeePercentage: POOL_SWAP_FEE_PERCENTAGE, + swapEnabledOnStart: swapEnabled, + mustAllowlistLPs: mustAllowlistLPs, + managementAumFeePercentage: POOL_MANAGEMENT_AUM_FEE_PERCENTAGE, + aumFeeId: ProtocolFee.AUM, + }; + + const receipt = await ( + await factory.connect(owner).create(newPoolParams, settingsParams, owner.address, salt) + ).wait(); + + const event = expectEvent.inReceipt(receipt, 'PoolCreated'); + return task.instanceAt('ManagedPool', event.args.pool); + } + + describe('getters', () => { + it('check factory version', async () => { + const expectedFactoryVersion = { + name: 'ManagedPoolFactory', + version: 2, + deployment: '20230411-managed-pool-v2', + }; + + expect(await factory.version()).to.equal(JSON.stringify(expectedFactoryVersion)); + }); + + it('check pool version', async () => { + const pool = await createPool(); + + const expectedPoolVersion = { + name: 'ManagedPool', + version: 2, + deployment: '20230411-managed-pool-v2', + }; + + expect(await pool.version()).to.equal(JSON.stringify(expectedPoolVersion)); + }); + }); + + describe('create and swap/join/exit', () => { + let pool: Contract; + let poolId: string; + + it('deploy a managed pool', async () => { + pool = await createPool(); + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + + expect(registeredAddress).to.equal(pool.address); + }); + + it('initialize the pool', async () => { + await comp.connect(whale).approve(vault.address, MAX_UINT256); + await uni.connect(whale).approve(vault.address, MAX_UINT256); + await aave.connect(whale).approve(vault.address, MAX_UINT256); + + const userData = WeightedPoolEncoder.joinInit(initialBalances); + // This is a composable pool, so assets array has to contain BPT. + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: [pool.address, ...tokens], + maxAmountsIn: [MAX_UINT256, ...initialBalances], + fromInternalBalance: false, + userData, + }); + + const { balances } = await vault.getPoolTokens(poolId); + const totalSupply = await pool.totalSupply(); + const ownerBpt = await pool.balanceOf(owner.address); + const minBpt = await pool.balanceOf(ZERO_ADDRESS); + + expect(balances).to.deep.equal([totalSupply.sub(ownerBpt).sub(minBpt), ...initialBalances]); + }); + + it('swap in the pool', async () => { + const amount = fp(500); + await comp.connect(whale).transfer(owner.address, amount); + await comp.connect(owner).approve(vault.address, amount); + + await vault + .connect(owner) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: COMP, assetOut: UNI, amount, userData: '0x' }, + { sender: owner.address, recipient: owner.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert pool swap + const expectedUNI = await math.calcOutGivenIn( + initialBalanceCOMP, + WEIGHTS[tokens.indexOf(COMP)], + initialBalanceUNI, + WEIGHTS[tokens.indexOf(UNI)], + amount + ); + expectEqualWithError(await comp.balanceOf(owner.address), 0, 0.0001); + expectEqualWithError(await uni.balanceOf(owner.address), expectedUNI, 0.1); + }); + + it('joins proportionally', async () => { + const ownerBptBalance = await pool.balanceOf(owner.address); + const bptOut = ownerBptBalance.div(5); + + const { tokens: registeredTokens } = await vault.getPoolTokens(poolId); + + await vault.connect(whale).joinPool(poolId, whale.address, whale.address, { + assets: registeredTokens, + maxAmountsIn: Array(tokens.length + 1).fill(MAX_UINT256), + fromInternalBalance: false, + userData: WeightedPoolEncoder.joinAllTokensInForExactBPTOut(bptOut), + }); + + // Make sure received BPT is close to what we expect + const currentBptBalance = await pool.balanceOf(whale.address); + expect(currentBptBalance).to.be.equalWithError(bptOut, 0.001); + }); + + it('exits proportionally', async () => { + const previousBptBalance = await pool.balanceOf(whale.address); + const bptIn = previousBptBalance.div(4); + + const { tokens: registeredTokens } = await vault.getPoolTokens(poolId); + + await vault.connect(whale).exitPool(poolId, whale.address, whale.address, { + assets: registeredTokens, + minAmountsOut: Array(registeredTokens.length).fill(0), + fromInternalBalance: false, + userData: WeightedPoolEncoder.exitExactBPTInForTokensOut(bptIn), + }); + + // Make sure sent BPT is close to what we expect + const currentBptBalance = await pool.balanceOf(whale.address); + expect(currentBptBalance).to.be.equalWithError(bn(previousBptBalance).sub(bptIn), 0.001); + }); + }); + + describe('create2 functionality', () => { + it('can be deployed with a different salt', async () => { + const pool = await createPool(true, false, ZERO_BYTES32); + const pool2 = await createPool(true, false, ONES_BYTES32); + + expect(pool2.address).to.not.equal(pool.address); + }); + }); + + describe('read-only reentrancy protection', () => { + let pool: Contract; + let poolId: string; + let attacker: Contract; + const attackerFunds = fp(1000); + + sharedBeforeEach('deploy and fund attacker', async () => { + attacker = await deploy('ReadOnlyReentrancyAttackerMP', [vault.address]); + await comp.connect(whale).transfer(attacker.address, attackerFunds); + await uni.connect(whale).transfer(attacker.address, attackerFunds); + await aave.connect(whale).transfer(attacker.address, attackerFunds); + }); + + sharedBeforeEach('deploy pool and attacker', async () => { + pool = await createPool(); + poolId = await pool.getPoolId(); + + await comp.connect(whale).approve(vault.address, MAX_UINT256); + await uni.connect(whale).approve(vault.address, MAX_UINT256); + await aave.connect(whale).approve(vault.address, MAX_UINT256); + + const userData = WeightedPoolEncoder.joinInit(initialBalances); + // This is a composable pool, so assets array has to contain BPT. + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: [pool.address, ...tokens], + maxAmountsIn: [MAX_UINT256, ...initialBalances], + fromInternalBalance: false, + userData, + }); + }); + + describe('survives attacks', async () => { + it(`rejects fee update attack`, async () => { + await performAttack(AttackType.SET_MANAGEMENT_AUM_FEE); + }); + + it(`rejects fee collection attack`, async () => { + await performAttack(AttackType.COLLECT_AUM_MANAGEMENT_FEES); + }); + + it(`rejects add token attack`, async () => { + await performAttack(AttackType.ADD_TOKEN); + }); + + it(`rejects remove token attack`, async () => { + await performAttack(AttackType.REMOVE_TOKEN); + }); + + it(`rejects protocol fee cache attack`, async () => { + await performAttack(AttackType.UPDATE_PROTOCOL_FEE_CACHE); + }); + }); + + async function performAttack(attackType: AttackType) { + const allTokens = (await vault.getPoolTokens(poolId)).tokens; + // Amounts in must not include BPT in user data. + const userData = WeightedPoolEncoder.joinExactTokensInForBPTOut( + Array(allTokens.length - 1).fill(attackerFunds), + 0 + ); + + const joinRequest = { + assets: allTokens, + maxAmountsIn: Array(allTokens.length).fill(MAX_UINT256), + userData, + fromInternalBalance: false, + }; + + await expect(attacker.startAttack(poolId, joinRequest, attackType, { value: 10 })).to.be.revertedWith('BAL#420'); + } + }); + + describe('recovery mode', () => { + let pool: Contract; + let poolId: string; + + before('deploy and initialize a stable pool', async () => { + pool = await createPool(); + poolId = await pool.getPoolId(); + + await comp.connect(whale).approve(vault.address, MAX_UINT256); + await uni.connect(whale).approve(vault.address, MAX_UINT256); + await aave.connect(whale).approve(vault.address, MAX_UINT256); + + const userData = WeightedPoolEncoder.joinInit(initialBalances); + // This is a composable pool, so assets array has to contain BPT. + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: [pool.address, ...tokens], + maxAmountsIn: [MAX_UINT256, ...initialBalances], + fromInternalBalance: false, + userData, + }); + }); + + before('enter recovery mode', async () => { + await authorizer.connect(govMultisig).grantRole(await actionId(pool, 'enableRecoveryMode'), govMultisig.address); + await pool.connect(govMultisig).enableRecoveryMode(); + expect(await pool.inRecoveryMode()).to.be.true; + }); + + it('can exit via recovery mode', async () => { + const bptBalance = await pool.balanceOf(owner.address); + expect(bptBalance).to.gt(0); + + const vaultUNIBalanceBeforeExit = await uni.balanceOf(vault.address); + const ownerUNIBalanceBeforeExit = await uni.balanceOf(owner.address); + + const userData = BasePoolEncoder.recoveryModeExit(bptBalance); + const tokensWithBpt = [pool.address, ...tokens]; + await vault.connect(owner).exitPool(poolId, owner.address, owner.address, { + assets: tokensWithBpt, + minAmountsOut: Array(tokensWithBpt.length).fill(0), + fromInternalBalance: false, + userData, + }); + + const remainingBalance = await pool.balanceOf(owner.address); + expect(remainingBalance).to.equal(0); + + const vaultUNIBalanceAfterExit = await uni.balanceOf(vault.address); + const ownerUNIBalanceAfterExit = await uni.balanceOf(owner.address); + + expect(vaultUNIBalanceAfterExit).to.lt(vaultUNIBalanceBeforeExit); + expect(ownerUNIBalanceAfterExit).to.gt(ownerUNIBalanceBeforeExit); + }); + }); + + describe('factory disable', () => { + it('the factory can be disabled', async () => { + await authorizer.connect(govMultisig).grantRole(await actionId(factory, 'disable'), govMultisig.address); + await factory.connect(govMultisig).disable(); + + expect(await factory.isDisabled()).to.be.true; + + const newPoolParams: ManagedPoolParams = { + name: NAME, + symbol: SYMBOL, + assetManagers: Array(tokens.length).fill(ZERO_ADDRESS), + }; + + const settingsParams: ManagedPoolSettingsParams = { + tokens: tokens, + normalizedWeights: WEIGHTS, + swapFeePercentage: POOL_SWAP_FEE_PERCENTAGE, + swapEnabledOnStart: true, + mustAllowlistLPs: false, + managementAumFeePercentage: POOL_MANAGEMENT_AUM_FEE_PERCENTAGE, + aumFeeId: ProtocolFee.AUM, + }; + + await expect( + factory.connect(owner).create(newPoolParams, settingsParams, owner.address, randomBytes(32)) + ).to.be.revertedWith('BAL#211'); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/artifact/AuthorizerWithAdaptorValidation.json b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/artifact/AuthorizerWithAdaptorValidation.json new file mode 100644 index 0000000..41f0d2a --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/artifact/AuthorizerWithAdaptorValidation.json @@ -0,0 +1,100 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "AuthorizerWithAdaptorValidation", + "sourceName": "contracts/authorizer/AuthorizerWithAdaptorValidation.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IAuthorizer", + "name": "actualAuthorizer", + "type": "address" + }, + { + "internalType": "contract IAuthorizerAdaptor", + "name": "authorizerAdaptor", + "type": "address" + }, + { + "internalType": "contract IAuthorizerAdaptorEntrypoint", + "name": "adaptorEntrypoint", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "canPerform", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getActualAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizerAdaptor", + "outputs": [ + { + "internalType": "contract IAuthorizerAdaptor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizerAdaptorEntrypoint", + "outputs": [ + { + "internalType": "contract IAuthorizerAdaptorEntrypoint", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60e060405234801561001057600080fd5b506040516103a73803806103a78339818101604052606081101561003357600080fd5b50805160208201516040909201516001600160601b0319606092831b811660c05292821b831660a052901b1660805260805160601c60a05160601c60c05160601c6103026100a5600039806101a352806102aa525080610125528061028652508060e9528061014d52506103026000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80637afcf0e6146100515780639be2a88414610082578063e758d36b146100d7578063ec18a121146100df575b600080fd5b6100596100e7565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6100c36004803603606081101561009857600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff6020820135811691604001351661010b565b604080519115158252519081900360200190f35b610059610284565b6100596102a8565b7f000000000000000000000000000000000000000000000000000000000000000090565b60003373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614156101a1577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614905061027d565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639be2a8848585856040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b15801561024e57600080fd5b505afa158015610262573d6000803e3d6000fd5b505050506040513d602081101561027857600080fd5b505190505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000009056fea264697066735822122094cf94ff14b201b8cf3dab4fd93b26b6a09010a7de5c239d61c7b94a5ec3142564736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80637afcf0e6146100515780639be2a88414610082578063e758d36b146100d7578063ec18a121146100df575b600080fd5b6100596100e7565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6100c36004803603606081101561009857600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff6020820135811691604001351661010b565b604080519115158252519081900360200190f35b610059610284565b6100596102a8565b7f000000000000000000000000000000000000000000000000000000000000000090565b60003373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614156101a1577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614905061027d565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639be2a8848585856040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b15801561024e57600080fd5b505afa158015610262573d6000803e3d6000fd5b505050506040513d602081101561027857600080fd5b505190505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000009056fea264697066735822122094cf94ff14b201b8cf3dab4fd93b26b6a09010a7de5c239d61c7b94a5ec3142564736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/index.ts b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/index.ts new file mode 100644 index 0000000..2445e86 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/index.ts @@ -0,0 +1,10 @@ +import { Task, TaskRunOptions } from '@src'; +import { AuthorizerWithAdaptorValidationDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as AuthorizerWithAdaptorValidationDeployment; + + const authorizerArgs = [input.Authorizer, input.AuthorizerAdaptor, input.AuthorizerAdaptorEntrypoint]; + + await task.deployAndVerify('AuthorizerWithAdaptorValidation', authorizerArgs, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/input.ts b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/input.ts new file mode 100644 index 0000000..1af91a9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/input.ts @@ -0,0 +1,20 @@ +import { Task, TaskMode } from '@src'; + +export type AuthorizerWithAdaptorValidationDeployment = { + Vault: string; + Authorizer: string; + AuthorizerAdaptor: string; + AuthorizerAdaptorEntrypoint: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const Authorizer = new Task('20210418-authorizer', TaskMode.READ_ONLY); +const AuthorizerAdaptor = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY); +const AuthorizerAdaptorEntrypoint = new Task('20221124-authorizer-adaptor-entrypoint', TaskMode.READ_ONLY); + +export default { + Vault, + Authorizer, + AuthorizerAdaptor, + AuthorizerAdaptorEntrypoint, +}; diff --git a/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/arbitrum.json b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/arbitrum.json new file mode 100644 index 0000000..48c179d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "AuthorizerWithAdaptorValidation": "0x6B1Da720Be2D11d95177ccFc40A917c2688f396c" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/avalanche.json b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/avalanche.json new file mode 100644 index 0000000..0dddb63 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/avalanche.json @@ -0,0 +1,3 @@ +{ + "AuthorizerWithAdaptorValidation": "0x8df317a729fcaA260306d7de28888932cb579b88" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/base.json b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/base.json new file mode 100644 index 0000000..c738b62 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/base.json @@ -0,0 +1,3 @@ +{ + "AuthorizerWithAdaptorValidation": "0xA69E0Ccf150a29369D8Bbc0B3f510849dB7E8EEE" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/bsc.json b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/bsc.json new file mode 100644 index 0000000..14b81ae --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/bsc.json @@ -0,0 +1,3 @@ +{ + "AuthorizerWithAdaptorValidation": "0xAcf05BE5134d64d150d153818F8C67EE36996650" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/gnosis.json b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/gnosis.json new file mode 100644 index 0000000..388ad44 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "AuthorizerWithAdaptorValidation": "0x03F3Fb107e74F2EAC9358862E91ad3c692712054" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/goerli.json b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/goerli.json new file mode 100644 index 0000000..a609b0b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/goerli.json @@ -0,0 +1,3 @@ +{ + "AuthorizerWithAdaptorValidation": "0x8eA89804145c007e7D226001A96955ad53836087" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/mainnet.json b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/mainnet.json new file mode 100644 index 0000000..19aae4c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "AuthorizerWithAdaptorValidation": "0x6048A8c631Fb7e77EcA533Cf9C29784e482391e7" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/mode.json b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/mode.json new file mode 100644 index 0000000..e03adae --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/mode.json @@ -0,0 +1,3 @@ +{ + "AuthorizerWithAdaptorValidation": "0x013D4382F291be5688AFBcc741Ee8A24C66B2C92" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/optimism.json b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/optimism.json new file mode 100644 index 0000000..14b81ae --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/optimism.json @@ -0,0 +1,3 @@ +{ + "AuthorizerWithAdaptorValidation": "0xAcf05BE5134d64d150d153818F8C67EE36996650" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/polygon.json b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/polygon.json new file mode 100644 index 0000000..5623a50 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/polygon.json @@ -0,0 +1,3 @@ +{ + "AuthorizerWithAdaptorValidation": "0x020301b0a99EFB6816B41007765Fb577259eC418" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/sepolia.json b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/sepolia.json new file mode 100644 index 0000000..5505cc7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "AuthorizerWithAdaptorValidation": "0xb521dD5C8e13fE202626CaC98873FEA2b7760cE4" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/zkevm.json b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/zkevm.json new file mode 100644 index 0000000..0dddb63 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/output/zkevm.json @@ -0,0 +1,3 @@ +{ + "AuthorizerWithAdaptorValidation": "0x8df317a729fcaA260306d7de28888932cb579b88" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/readme.md b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/readme.md new file mode 100644 index 0000000..87dfc48 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/readme.md @@ -0,0 +1,18 @@ +# 2023-04-14 - Authorizer Wrapper + +Deployment of the `AuthorizerWithAdaptorValidation`, which allows using the AuthorizerAdaptorEntrypoint with the existing Authorizer, before migration to the TimelockAuthorizer. In particular, this allows contracts that require the endpoint (e.g., Gauge Adder V3) to work. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`AuthorizerWithAdaptorValidation` artifact](./artifact/AuthorizerWithAdaptorValidation.json) diff --git a/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/test/task.fork.ts b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/test/task.fork.ts new file mode 100644 index 0000000..0b4b694 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230414-authorizer-wrapper/test/task.fork.ts @@ -0,0 +1,171 @@ +import hre from 'hardhat'; +import { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { impersonate, getForkedNetwork, Task, TaskMode, describeForkTest } from '@src'; +import { actionId } from '@helpers/models/misc/actions'; +import { fp } from '@helpers/numbers'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import * as expectEvent from '@helpers/expectEvent'; + +describeForkTest('AuthorizerWithAdaptorValidation', 'mainnet', 17047707, function () { + let admin: SignerWithAddress; + let govMultisig: SignerWithAddress, lmMultisig: SignerWithAddress, swapFeeSetter: SignerWithAddress; + let authorizer: Contract, + vault: Contract, + actualAuthorizer: Contract, + authorizerAdaptor: Contract, + adaptorEntrypoint: Contract, + gaugeAdder: Contract; + + let task: Task; + let addEthereumGaugeAction: string; + + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + const LM_MULTISIG = '0xc38c5f97b34e175ffd35407fc91a937300e33860'; + const SWAP_FEE_SETTER = '0xE4a8ed6c1D8d048bD29A00946BFcf2DB10E7923B'; + + before('run task', async () => { + task = new Task('20230414-authorizer-wrapper', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + authorizer = await task.deployedInstance('AuthorizerWithAdaptorValidation'); + }); + + before('load signers', async () => { + [, admin] = await ethers.getSigners(); + + govMultisig = await impersonate(GOV_MULTISIG, fp(1000)); + lmMultisig = await impersonate(LM_MULTISIG, fp(100)); + swapFeeSetter = await impersonate(SWAP_FEE_SETTER, fp(100)); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + actualAuthorizer = await new Task( + '20210418-authorizer', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ).deployedInstance('Authorizer'); + + authorizerAdaptor = await new Task( + '20220325-authorizer-adaptor', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ).deployedInstance('AuthorizerAdaptor'); + + adaptorEntrypoint = await new Task( + '20221124-authorizer-adaptor-entrypoint', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ).deployedInstance('AuthorizerAdaptorEntrypoint'); + + gaugeAdder = await new Task('20230109-gauge-adder-v3', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance( + 'GaugeAdder' + ); + }); + + before('get actions', async () => { + addEthereumGaugeAction = await actionId(gaugeAdder, 'addEthereumGauge'); + }); + + describe('getters', () => { + it('stores the actual (existing basic) authorizer', async () => { + expect(await authorizer.getActualAuthorizer()).to.eq(actualAuthorizer.address); + }); + + it('stores the authorizer adaptor', async () => { + expect(await authorizer.getAuthorizerAdaptor()).to.eq(authorizerAdaptor.address); + }); + + it('stores the authorizer adaptor entrypoint', async () => { + expect(await authorizer.getAuthorizerAdaptorEntrypoint()).to.equal(adaptorEntrypoint.address); + }); + + it('configures the gauge adder', async () => { + const entrypoint = await gaugeAdder.getAuthorizerAdaptorEntrypoint(); + const gaugeAdderAuthorizer = await adaptorEntrypoint.getAuthorizer(); + + // Ensure the authorizer we just set the permissions on is the same one the gauge adder is using + expect(entrypoint).to.equal(adaptorEntrypoint.address); + expect(gaugeAdderAuthorizer).to.equal(actualAuthorizer.address); + }); + }); + + describe('Gauge Adder v3', () => { + let gauge: string; + + sharedBeforeEach(async () => { + const factoryTask = new Task('20220822-mainnet-gauge-factory-v2', TaskMode.READ_ONLY, getForkedNetwork(hre)); + const gaugeFactory = await factoryTask.deployedInstance('LiquidityGaugeFactory'); + + const pool = '0x32296969ef14eb0c6d29669c550d4a0449130230'; + const tx = await gaugeFactory.create(pool, 0); + const event = expectEvent.inIndirectReceipt(await tx.wait(), gaugeFactory.interface, 'GaugeCreated'); + gauge = event.args.gauge; + }); + + context('before the upgrade', () => { + it('the LM multisig has permission to add gauges', async () => { + expect(await actualAuthorizer.canPerform(addEthereumGaugeAction, lmMultisig.address, ZERO_ADDRESS)).to.be.true; + }); + + it('attempting to add gauges reverts as the Adaptor Entrypoint is not yet operational', async () => { + await expect(gaugeAdder.connect(lmMultisig).addEthereumGauge(gauge)).to.be.revertedWith('BAL#401'); + }); + }); + + context('after the upgrade', () => { + sharedBeforeEach('upgrade Authorizer', async () => { + const setAuthorizerAction = await actionId(vault, 'setAuthorizer'); + await actualAuthorizer.connect(govMultisig).grantRole(setAuthorizerAction, admin.address); + + await vault.connect(admin).setAuthorizer(authorizer.address); + expect(await vault.getAuthorizer()).to.equal(authorizer.address); + }); + + it('GaugeAdder can now add gauges', async () => { + const tx = await gaugeAdder.connect(lmMultisig).addEthereumGauge(gauge); + + const gaugeControllerInterface = new ethers.utils.Interface([ + 'event NewGauge(address gauge, int128 gaugeType, uint256 weight)', + ]); + + expectEvent.inIndirectReceipt(await tx.wait(), gaugeControllerInterface, 'NewGauge', { + gauge, + }); + }); + }); + }); + + describe('set swap fee percentage', () => { + let pool: Contract; + + sharedBeforeEach(async () => { + const factoryTask = new Task('20230206-weighted-pool-v3', TaskMode.READ_ONLY, getForkedNetwork(hre)); + pool = await factoryTask.instanceAt('WeightedPool', '0xEab8B160903B4a29D7D92C92b4ff632F5c964987'); + }); + + context('before the upgrade', () => { + it('the swap fee percentage can be set', async () => { + const tx = await pool.connect(swapFeeSetter).setSwapFeePercentage(fp(0.1)); + expectEvent.inReceipt(await tx.wait(), 'SwapFeePercentageChanged'); + }); + }); + + context('after the upgrade', () => { + sharedBeforeEach('upgrade Authorizer', async () => { + const setAuthorizerAction = await actionId(vault, 'setAuthorizer'); + await actualAuthorizer.connect(govMultisig).grantRole(setAuthorizerAction, admin.address); + + await vault.connect(admin).setAuthorizer(authorizer.address); + expect(await vault.getAuthorizer()).to.equal(authorizer.address); + }); + + it('the swap fee percentage can be still set', async () => { + const tx = await pool.connect(swapFeeSetter).setSwapFeePercentage(fp(0.1)); + expectEvent.inReceipt(await tx.wait(), 'SwapFeePercentageChanged'); + }); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230504-vebal-remapper/artifact/OmniVotingEscrowAdaptor.json b/balpy/balancer-deployments/tasks/20230504-vebal-remapper/artifact/OmniVotingEscrowAdaptor.json new file mode 100644 index 0000000..fe8725f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230504-vebal-remapper/artifact/OmniVotingEscrowAdaptor.json @@ -0,0 +1,270 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "OmniVotingEscrowAdaptor", + "sourceName": "contracts/OmniVotingEscrowAdaptor.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes", + "name": "newAdapterParams", + "type": "bytes" + } + ], + "name": "AdapterParamsUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IOmniVotingEscrow", + "name": "newOmniVotingEscrow", + "type": "address" + } + ], + "name": "OmniVotingEscrowUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "newUseZero", + "type": "bool" + } + ], + "name": "UseZeroUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newZeroPaymentAddress", + "type": "address" + } + ], + "name": "ZeroPaymentAddressUpdated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "_dstChainId", + "type": "uint16" + } + ], + "name": "estimateSendUserBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "nativeFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "zroFee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAdapterParams", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOmniVotingEscrow", + "outputs": [ + { + "internalType": "contract IOmniVotingEscrow", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getUseZero", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getZeroPaymentAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "uint16", + "name": "_dstChainId", + "type": "uint16" + }, + { + "internalType": "address payable", + "name": "_refundAddress", + "type": "address" + } + ], + "name": "sendUserBalance", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "adapterParams", + "type": "bytes" + } + ], + "name": "setAdapterParams", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IOmniVotingEscrow", + "name": "omniVotingEscrow", + "type": "address" + } + ], + "name": "setOmniVotingEscrow", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "useZro", + "type": "bool" + } + ], + "name": "setUseZero", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "paymentAddress", + "type": "address" + } + ], + "name": "setZeroPaymentAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60c060405234801561001057600080fd5b50604051610f77380380610f778339818101604052602081101561003357600080fd5b5051306080819052606082901b6001600160601b03191660a052906001600160a01b0316610f03610074600039806108b35250806108465250610f036000f3fe6080604052600436106100d15760003560e01c806357fb83451161007f578063aaabadc511610059578063aaabadc514610304578063d56b6a4a14610319578063e241e489146103cc578063ecc4c5831461040c576100d1565b806357fb83451461024a578063851c1bb3146102915780638d928af8146102ef576100d1565b8063299fd6fc116100b0578063299fd6fc1461017f5780634cfde448146101ab578063550f2f7f14610235576100d1565b8062986fe0146100d65780630943b7b8146100ff57806309d401f91461013d575b600080fd5b3480156100e257600080fd5b506100eb610453565b604080519115158252519081900360200190f35b34801561010b57600080fd5b50610114610474565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561014957600080fd5b5061017d6004803603602081101561016057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610490565b005b34801561018b57600080fd5b5061017d600480360360208110156101a257600080fd5b50351515610505565b3480156101b757600080fd5b506101c061058c565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101fa5781810151838201526020016101e2565b50505050905090810190601f1680156102275780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561024157600080fd5b5061011461063f565b61017d6004803603606081101561026057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169161ffff602082013516916040909101351661065b565b34801561029d57600080fd5b506102dd600480360360208110156102b457600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016610840565b60408051918252519081900360200190f35b3480156102fb57600080fd5b506101146108b1565b34801561031057600080fd5b506101146108d5565b34801561032557600080fd5b5061017d6004803603602081101561033c57600080fd5b81019060208101813564010000000081111561035757600080fd5b82018360208201111561036957600080fd5b8035906020019184600183028401116401000000008311171561038b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610955945050505050565b3480156103d857600080fd5b5061017d600480360360208110156103ef57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610a0d565b34801561041857600080fd5b5061043a6004803603602081101561042f57600080fd5b503561ffff16610a84565b6040805192835260208301919091528051918290030190f35b60005474010000000000000000000000000000000000000000900460ff1690565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b610498610c87565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917fe8bb344458d00606347f5b2f5b6f6de2a6f0beeb7aa331c6b90549adc7c093c091a250565b61050d610c87565b600080548215157401000000000000000000000000000000000000000081027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9092169190911790915560408051918252517fc22a8ea88c11878d4bbc93fc8deeaae9120fa8540716f449ba01e0b79a1b020c9181900360200190a150565b60018054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156106355780601f1061060a57610100808354040283529160200191610635565b820191906000526020600020905b81548152906001019060200180831161061857829003601f168201915b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b600061066561063f565b905073ffffffffffffffffffffffffffffffffffffffff81166106e957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4f6d6e6920766f74696e6720657363726f77206e6f7420736574000000000000604482015290519081900360640190fd5b600280546040517f4a75948900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830190815261ffff8816602484015286821660448401529281166064830181905260a060848401908152600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818316156101000201169690960460a4850181905292871695634a7594899534958c958c958c9590949392909160c490910190849080156107fe5780601f106107d3576101008083540402835291602001916107fe565b820191906000526020600020905b8154815290600101906020018083116107e157829003601f168201915b505096505050505050506000604051808303818588803b15801561082157600080fd5b505af1158015610835573d6000803e3d6000fd5b505050505050505050565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108df6108b1565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561092457600080fd5b505afa158015610938573d6000803e3d6000fd5b505050506040513d602081101561094e57600080fd5b5051905090565b61095d610c87565b8051610970906001906020840190610e3a565b507f89eee6f0981b5afc30154f85e504f26bc7b53645844dcb29588946e5cf35d9f4816040518080602001828103825283818151815260200191508051906020019080838360005b838110156109d05781810151838201526020016109b8565b50505050905090810190601f1680156109fd5780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b610a15610c87565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fa7bee2b81c8995421ba22c824cb2b9a80372d577f8220162fe395c089a2782ca90600090a250565b6000806000610a9161063f565b905073ffffffffffffffffffffffffffffffffffffffff8116610b1557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4f6d6e6920766f74696e6720657363726f77206e6f7420736574000000000000604482015290519081900360640190fd5b6000546040517f65d092d000000000000000000000000000000000000000000000000000000000815261ffff8616600482019081527401000000000000000000000000000000000000000090920460ff16801515602483015260606044830190815260018054600261010082841615027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909116046064850181905273ffffffffffffffffffffffffffffffffffffffff8716956365d092d0958b9594919260849091019084908015610c2a5780601f10610bff57610100808354040283529160200191610c2a565b820191906000526020600020905b815481529060010190602001808311610c0d57829003601f168201915b5050945050505050604080518083038186803b158015610c4957600080fd5b505afa158015610c5d573d6000803e3d6000fd5b505050506040513d6040811015610c7357600080fd5b508051602090910151909350915050915091565b6000610cb66000357fffffffff0000000000000000000000000000000000000000000000000000000016610840565b9050610ccd610cc58233610cd0565b610191610d99565b50565b6000610cda6108d5565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b158015610d6657600080fd5b505afa158015610d7a573d6000803e3d6000fd5b505050506040513d6020811015610d9057600080fd5b50519392505050565b81610da757610da781610dab565b5050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b604452610ccd917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610e7b57805160ff1916838001178555610ea8565b82800160010185558215610ea8579182015b82811115610ea8578251825591602001919060010190610e8d565b50610eb4929150610eb8565b5090565b5b80821115610eb45760008155600101610eb956fea26469706673582212208d4263c41355faae676cee10a526b47ebb5f554edc4fbce57f8f5a1f93d5119864736f6c63430007010033", + "deployedBytecode": "0x6080604052600436106100d15760003560e01c806357fb83451161007f578063aaabadc511610059578063aaabadc514610304578063d56b6a4a14610319578063e241e489146103cc578063ecc4c5831461040c576100d1565b806357fb83451461024a578063851c1bb3146102915780638d928af8146102ef576100d1565b8063299fd6fc116100b0578063299fd6fc1461017f5780634cfde448146101ab578063550f2f7f14610235576100d1565b8062986fe0146100d65780630943b7b8146100ff57806309d401f91461013d575b600080fd5b3480156100e257600080fd5b506100eb610453565b604080519115158252519081900360200190f35b34801561010b57600080fd5b50610114610474565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561014957600080fd5b5061017d6004803603602081101561016057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610490565b005b34801561018b57600080fd5b5061017d600480360360208110156101a257600080fd5b50351515610505565b3480156101b757600080fd5b506101c061058c565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101fa5781810151838201526020016101e2565b50505050905090810190601f1680156102275780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561024157600080fd5b5061011461063f565b61017d6004803603606081101561026057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169161ffff602082013516916040909101351661065b565b34801561029d57600080fd5b506102dd600480360360208110156102b457600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016610840565b60408051918252519081900360200190f35b3480156102fb57600080fd5b506101146108b1565b34801561031057600080fd5b506101146108d5565b34801561032557600080fd5b5061017d6004803603602081101561033c57600080fd5b81019060208101813564010000000081111561035757600080fd5b82018360208201111561036957600080fd5b8035906020019184600183028401116401000000008311171561038b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610955945050505050565b3480156103d857600080fd5b5061017d600480360360208110156103ef57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610a0d565b34801561041857600080fd5b5061043a6004803603602081101561042f57600080fd5b503561ffff16610a84565b6040805192835260208301919091528051918290030190f35b60005474010000000000000000000000000000000000000000900460ff1690565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b610498610c87565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917fe8bb344458d00606347f5b2f5b6f6de2a6f0beeb7aa331c6b90549adc7c093c091a250565b61050d610c87565b600080548215157401000000000000000000000000000000000000000081027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9092169190911790915560408051918252517fc22a8ea88c11878d4bbc93fc8deeaae9120fa8540716f449ba01e0b79a1b020c9181900360200190a150565b60018054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156106355780601f1061060a57610100808354040283529160200191610635565b820191906000526020600020905b81548152906001019060200180831161061857829003601f168201915b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b600061066561063f565b905073ffffffffffffffffffffffffffffffffffffffff81166106e957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4f6d6e6920766f74696e6720657363726f77206e6f7420736574000000000000604482015290519081900360640190fd5b600280546040517f4a75948900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830190815261ffff8816602484015286821660448401529281166064830181905260a060848401908152600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818316156101000201169690960460a4850181905292871695634a7594899534958c958c958c9590949392909160c490910190849080156107fe5780601f106107d3576101008083540402835291602001916107fe565b820191906000526020600020905b8154815290600101906020018083116107e157829003601f168201915b505096505050505050506000604051808303818588803b15801561082157600080fd5b505af1158015610835573d6000803e3d6000fd5b505050505050505050565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108df6108b1565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561092457600080fd5b505afa158015610938573d6000803e3d6000fd5b505050506040513d602081101561094e57600080fd5b5051905090565b61095d610c87565b8051610970906001906020840190610e3a565b507f89eee6f0981b5afc30154f85e504f26bc7b53645844dcb29588946e5cf35d9f4816040518080602001828103825283818151815260200191508051906020019080838360005b838110156109d05781810151838201526020016109b8565b50505050905090810190601f1680156109fd5780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b610a15610c87565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fa7bee2b81c8995421ba22c824cb2b9a80372d577f8220162fe395c089a2782ca90600090a250565b6000806000610a9161063f565b905073ffffffffffffffffffffffffffffffffffffffff8116610b1557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4f6d6e6920766f74696e6720657363726f77206e6f7420736574000000000000604482015290519081900360640190fd5b6000546040517f65d092d000000000000000000000000000000000000000000000000000000000815261ffff8616600482019081527401000000000000000000000000000000000000000090920460ff16801515602483015260606044830190815260018054600261010082841615027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909116046064850181905273ffffffffffffffffffffffffffffffffffffffff8716956365d092d0958b9594919260849091019084908015610c2a5780601f10610bff57610100808354040283529160200191610c2a565b820191906000526020600020905b815481529060010190602001808311610c0d57829003601f168201915b5050945050505050604080518083038186803b158015610c4957600080fd5b505afa158015610c5d573d6000803e3d6000fd5b505050506040513d6040811015610c7357600080fd5b508051602090910151909350915050915091565b6000610cb66000357fffffffff0000000000000000000000000000000000000000000000000000000016610840565b9050610ccd610cc58233610cd0565b610191610d99565b50565b6000610cda6108d5565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b158015610d6657600080fd5b505afa158015610d7a573d6000803e3d6000fd5b505050506040513d6020811015610d9057600080fd5b50519392505050565b81610da757610da781610dab565b5050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b604452610ccd917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610e7b57805160ff1916838001178555610ea8565b82800160010185558215610ea8579182015b82811115610ea8578251825591602001919060010190610e8d565b50610eb4929150610eb8565b5090565b5b80821115610eb45760008155600101610eb956fea26469706673582212208d4263c41355faae676cee10a526b47ebb5f554edc4fbce57f8f5a1f93d5119864736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230504-vebal-remapper/artifact/VotingEscrowRemapper.json b/balpy/balancer-deployments/tasks/20230504-vebal-remapper/artifact/VotingEscrowRemapper.json new file mode 100644 index 0000000..2efa165 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230504-vebal-remapper/artifact/VotingEscrowRemapper.json @@ -0,0 +1,387 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "VotingEscrowRemapper", + "sourceName": "contracts/VotingEscrowRemapper.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IVotingEscrow", + "name": "votingEscrow", + "type": "address" + }, + { + "internalType": "contract IOmniVotingEscrowAdaptor", + "name": "omniVotingEscrowAdaptor", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "localUser", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegate", + "type": "address" + } + ], + "name": "AddressDelegateUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "localUser", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "remoteUser", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint16", + "name": "chainId", + "type": "uint16" + } + ], + "name": "AddressMappingUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "remoteUser", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint16", + "name": "chainId", + "type": "uint16" + } + ], + "name": "RemoteAddressMappingCleared", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "localUser", + "type": "address" + }, + { + "internalType": "uint16", + "name": "chainId", + "type": "uint16" + } + ], + "name": "clearNetworkRemapping", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "remoteUser", + "type": "address" + }, + { + "internalType": "uint16", + "name": "chainId", + "type": "uint16" + } + ], + "name": "getLocalUser", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "getLockedEnd", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOmniVotingEscrowAdaptor", + "outputs": [ + { + "internalType": "contract IOmniVotingEscrowAdaptor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "localUser", + "type": "address" + } + ], + "name": "getRemappingManager", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "localUser", + "type": "address" + }, + { + "internalType": "uint16", + "name": "chainId", + "type": "uint16" + } + ], + "name": "getRemoteUser", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTotalSupplyPoint", + "outputs": [ + { + "components": [ + { + "internalType": "int128", + "name": "bias", + "type": "int128" + }, + { + "internalType": "int128", + "name": "slope", + "type": "int128" + }, + { + "internalType": "uint256", + "name": "ts", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "blk", + "type": "uint256" + } + ], + "internalType": "struct IVotingEscrow.Point", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "getUserPoint", + "outputs": [ + { + "components": [ + { + "internalType": "int128", + "name": "bias", + "type": "int128" + }, + { + "internalType": "int128", + "name": "slope", + "type": "int128" + }, + { + "internalType": "uint256", + "name": "ts", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "blk", + "type": "uint256" + } + ], + "internalType": "struct IVotingEscrow.Point", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVotingEscrow", + "outputs": [ + { + "internalType": "contract IVotingEscrow", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "localUser", + "type": "address" + }, + { + "internalType": "address", + "name": "remoteUser", + "type": "address" + }, + { + "internalType": "uint16", + "name": "chainId", + "type": "uint16" + } + ], + "name": "setNetworkRemapping", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "localUser", + "type": "address" + }, + { + "internalType": "address", + "name": "delegate", + "type": "address" + } + ], + "name": "setNetworkRemappingManager", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60e06040523480156200001157600080fd5b5060405162001e1b38038062001e1b833981016040819052620000349162000080565b30608052606092831b6001600160601b031990811660a052600160008190559290931b90921660c05280546001600160a01b0319166001600160a01b03909216919091179055620000ec565b60008060006060848603121562000095578283fd5b8351620000a281620000d3565b6020850151909350620000b581620000d3565b6040850151909250620000c881620000d3565b809150509250925092565b6001600160a01b0381168114620000e957600080fd5b50565b60805160a05160601c60c05160601c611cf7620001246000398061028552806104ab525080610f56525080610f065250611cf76000f3fe6080604052600436106100dd5760003560e01c8063851c1bb31161007f578063aaabadc511610059578063aaabadc514610219578063bda75c381461022e578063ee98b1e71461024e578063f6f4a3321461026e576100dd565b8063851c1bb3146101c45780638d928af8146101e4578063a9f3f44e146101f9576100dd565b80635e5543be116100bb5780635e5543be1461014f57806370d1bd171461016457806371628bfd1461018457806376601a18146101b1576100dd565b806308b0308a146100e257806321861fde1461010d5780633e7df7c814610122575b600080fd5b3480156100ee57600080fd5b506100f7610283565b60405161010491906117d3565b60405180910390f35b61012061011b3660046115fe565b6102a7565b005b34801561012e57600080fd5b5061014261013d3660046115aa565b6108f8565b604051610104919061184e565b34801561015b57600080fd5b506100f7610990565b34801561017057600080fd5b506100f761017f366004611645565b6109ac565b34801561019057600080fd5b506101a461019f3660046115aa565b6109e5565b6040516101049190611c5a565b6101206101bf366004611645565b610b33565b3480156101d057600080fd5b506101426101df36600461169a565b610f02565b3480156101f057600080fd5b506100f7610f54565b34801561020557600080fd5b506101206102143660046115c6565b610f78565b34801561022557600080fd5b506100f761102d565b34801561023a57600080fd5b506100f7610249366004611645565b6110b9565b34801561025a57600080fd5b506100f76102693660046115aa565b6110f2565b34801561027a57600080fd5b506101a461111d565b7f000000000000000000000000000000000000000000000000000000000000000090565b6102af61125d565b6103043373ffffffffffffffffffffffffffffffffffffffff851614806102fc575073ffffffffffffffffffffffffffffffffffffffff8481166000908152600460205260409020541633145b610191611276565b61030d83611284565b6103325760405162461bcd60e51b815260040161032990611ae6565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166103655760405162461bcd60e51b815260040161032990611b43565b600061036f610990565b61ffff8316600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855292529091205491925016156103c65760405162461bcd60e51b815260040161032990611bfd565b61ffff8216600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8781168552925290912054161561041a5760405162461bcd60e51b8152600401610329906119cf565b61ffff8216600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8881168552925290912054161561046e5760405162461bcd60e51b815260040161032990611a2c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a08231906104e09086906004016117d3565b60206040518083038186803b1580156104f857600080fd5b505afa15801561050c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105309190611765565b1561054d5760405162461bcd60e51b8152600401610329906118e0565b61ffff8216600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff808916855292529091205416801561060c5761ffff8316600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555190917f8bbec57d3a3f4c2e45c921fd17cbddb674ae1a51e01ca960b8251463c5907f6391a35b61ffff8316600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff808a168086529184528285208054918c167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316811790915586865260028552838620818752909452828520805490911682179055905190927f632b3b16accd727b982fb08251e873b41265cc9976166f1111fd6ddd49c8b9d391a46040517fecc4c58300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff84169063ecc4c58390610709908790600401611c90565b604080518083038186803b15801561072057600080fd5b505afa158015610734573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610758919061177d565b50905073ffffffffffffffffffffffffffffffffffffffff821615610829578060020234101561079a5760405162461bcd60e51b815260040161032990611972565b6040517f57fb834500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906357fb83459083906107f2908690899033906004016117f4565b6000604051808303818588803b15801561080b57600080fd5b505af115801561081f573d6000803e3d6000fd5b5050505050610849565b803410156108495760405162461bcd60e51b815260040161032990611972565b6040517f57fb834500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906357fb83459083906108a1908a90899033906004016117f4565b6000604051808303818588803b1580156108ba57600080fd5b505af11580156108ce573d6000803e3d6000fd5b5047935050821591506108e79050576108e733826113b8565b505050506108f361143f565b505050565b6000610902610283565b73ffffffffffffffffffffffffffffffffffffffff1663adc63589836040518263ffffffff1660e01b815260040161093a91906117d3565b60206040518083038186803b15801561095257600080fd5b505afa158015610966573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098a9190611765565b92915050565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b61ffff16600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff94851684529091529020541690565b6109ed611558565b60006109f7610283565b905060008173ffffffffffffffffffffffffffffffffffffffff1663010ae757856040518263ffffffff1660e01b8152600401610a3491906117d3565b60206040518083038186803b158015610a4c57600080fd5b505afa158015610a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a849190611765565b6040517f28d09d4700000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8316906328d09d4790610adb9087908590600401611828565b60806040518083038186803b158015610af357600080fd5b505afa158015610b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2b91906116f6565b949350505050565b610b3b61125d565b73ffffffffffffffffffffffffffffffffffffffff8216610b6e5760405162461bcd60e51b81526004016103299061193d565b610b7782611284565b1580610b98575073ffffffffffffffffffffffffffffffffffffffff821633145b610bb45760405162461bcd60e51b815260040161032990611883565b6000610bbe610990565b61ffff8316600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff80891685529252909120549192501680610c155760405162461bcd60e51b815260040161032990611a89565b61ffff8316600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff808716855290835281842080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915585855260028452828520918a16808652919093528184208054909316909255517f632b3b16accd727b982fb08251e873b41265cc9976166f1111fd6ddd49c8b9d3908390a460405161ffff84169073ffffffffffffffffffffffffffffffffffffffff8316907f8bbec57d3a3f4c2e45c921fd17cbddb674ae1a51e01ca960b8251463c5907f6390600090a36040517fecc4c58300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff84169063ecc4c58390610d55908790600401611c90565b604080518083038186803b158015610d6c57600080fd5b505afa158015610d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da4919061177d565b50905080600202341015610dca5760405162461bcd60e51b815260040161032990611972565b6040517f57fb834500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906357fb8345908390610e22908990899033906004016117f4565b6000604051808303818588803b158015610e3b57600080fd5b505af1158015610e4f573d6000803e3d6000fd5b50506040517f57fb834500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871693506357fb83459250849150610eac908690899033906004016117f4565b6000604051808303818588803b158015610ec557600080fd5b505af1158015610ed9573d6000803e3d6000fd5b504793505082159150610ef2905057610ef233826113b8565b50505050610efe61143f565b5050565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f379291906117a0565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b610f80611446565b610f8861125d565b610f9182611284565b610fad5760405162461bcd60e51b815260040161032990611ba0565b73ffffffffffffffffffffffffffffffffffffffff82811660008181526004602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169486169485179055517f72cff3a94768f9930e59d7a01948e45bea689391918693c8d164c16f271c46d99190a3610efe61143f565b6000611037610f54565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561107c57600080fd5b505afa158015611090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b491906116da565b905090565b61ffff16600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff94851684529091529020541690565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600460205260409020541690565b611125611558565b600061112f610283565b905060008173ffffffffffffffffffffffffffffffffffffffff1663900cf0cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561117957600080fd5b505afa15801561118d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b19190611765565b6040517fd1febfb900000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff83169063d1febfb99061120690849060040161184e565b60806040518083038186803b15801561121e57600080fd5b505afa158015611232573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125691906116f6565b9250505090565b61126f60026000541415610190611276565b6002600055565b81610efe57610efe81611487565b60008061128f610283565b73ffffffffffffffffffffffffffffffffffffffff16637175d4f76040518163ffffffff1660e01b815260040160206040518083038186803b1580156112d457600080fd5b505afa1580156112e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130c91906116da565b6040517fc23697a800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063c23697a8906113619086906004016117d3565b60206040518083038186803b15801561137957600080fd5b505afa15801561138d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b1919061167a565b9392505050565b6113c7814710156101a3611276565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516113ed906117d0565b60006040518083038185875af1925050503d806000811461142a576040519150601f19603f3d011682016040523d82523d6000602084013e61142f565b606091505b505090506108f3816101a4611276565b6001600055565b60006114756000357fffffffff0000000000000000000000000000000000000000000000000000000016610f02565b90506114846102fc82336114b1565b50565b611484817f42414c00000000000000000000000000000000000000000000000000000000006114f7565b60006114bb61102d565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040161136193929190611857565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60405180608001604052806000600f0b81526020016000600f0b815260200160008152602001600081525090565b8051600f81900b811461098a57600080fd5b803561ffff8116811461098a57600080fd5b6000602082840312156115bb578081fd5b81356113b181611c9f565b600080604083850312156115d8578081fd5b82356115e381611c9f565b915060208301356115f381611c9f565b809150509250929050565b600080600060608486031215611612578081fd5b833561161d81611c9f565b9250602084013561162d81611c9f565b915061163c8560408601611598565b90509250925092565b60008060408385031215611657578182fd5b823561166281611c9f565b91506116718460208501611598565b90509250929050565b60006020828403121561168b578081fd5b815180151581146113b1578182fd5b6000602082840312156116ab578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146113b1578182fd5b6000602082840312156116eb578081fd5b81516113b181611c9f565b600060808284031215611707578081fd5b6040516080810181811067ffffffffffffffff82111715611726578283fd5b6040526117338484611586565b81526117428460208501611586565b602082015260408301516040820152606083015160608201528091505092915050565b600060208284031215611776578081fd5b5051919050565b6000806040838503121561178f578182fd5b505080516020909101519092909150565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff938416815261ffff929092166020830152909116604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60208082526023908201527f6c6f63616c55736572206973207374696c6c20696e20676f6f64207374616e6460408201527f696e670000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526030908201527f5461726765742072656d6f7465206164647265737320686173206e6f6e2d7a6560408201527f726f20766542414c2062616c616e636500000000000000000000000000000000606082015260800190565b6020808252818101527f6c6f63616c557365722063616e6e6f74206265207a65726f2061646472657373604082015260600190565b60208082526027908201527f496e73756666696369656e742045544820746f2062726964676520757365722060408201527f62616c616e636500000000000000000000000000000000000000000000000000606082015260800190565b60208082526031908201527f43616e6e6f742072656d617020746f20616e206164647265737320746861742060408201527f697320696e20757365206c6f63616c6c79000000000000000000000000000000606082015260800190565b60208082526032908201527f43616e6e6f742072656d617020746f20616e206164647265737320746861742060408201527f697320696e207573652072656d6f74656c790000000000000000000000000000606082015260800190565b60208082526021908201527f52656d617070696e6720746f20636c65617220646f6573206e6f74206578697360408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526038908201527f4f6e6c7920636f6e7472616374732077686963682063616e20686f6c6420766560408201527f42414c2063616e207365742075702061206d617070696e670000000000000000606082015260800190565b6020808252602a908201527f5a65726f20616464726573732063616e6e6f742062652075736564206173207260408201527f656d6f7465207573657200000000000000000000000000000000000000000000606082015260800190565b60208082526037908201527f4f6e6c7920636f6e7472616374732077686963682063616e20686f6c6420766560408201527f42414c206d6179206861766520612064656c6567617465000000000000000000606082015260800190565b60208082526034908201527f43616e6e6f74206f766572777269746520616e206578697374696e67206d617060408201527f70696e6720627920616e6f746865722075736572000000000000000000000000606082015260800190565b60006080820190508251600f0b82526020830151600f0b6020830152604083015160408301526060830151606083015292915050565b61ffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff8116811461148457600080fdfea2646970667358221220a61d77e17ef170fbd8bc526065f75241078a3d6ba7da268648767f4f557d3cb464736f6c63430007010033", + "deployedBytecode": "0x6080604052600436106100dd5760003560e01c8063851c1bb31161007f578063aaabadc511610059578063aaabadc514610219578063bda75c381461022e578063ee98b1e71461024e578063f6f4a3321461026e576100dd565b8063851c1bb3146101c45780638d928af8146101e4578063a9f3f44e146101f9576100dd565b80635e5543be116100bb5780635e5543be1461014f57806370d1bd171461016457806371628bfd1461018457806376601a18146101b1576100dd565b806308b0308a146100e257806321861fde1461010d5780633e7df7c814610122575b600080fd5b3480156100ee57600080fd5b506100f7610283565b60405161010491906117d3565b60405180910390f35b61012061011b3660046115fe565b6102a7565b005b34801561012e57600080fd5b5061014261013d3660046115aa565b6108f8565b604051610104919061184e565b34801561015b57600080fd5b506100f7610990565b34801561017057600080fd5b506100f761017f366004611645565b6109ac565b34801561019057600080fd5b506101a461019f3660046115aa565b6109e5565b6040516101049190611c5a565b6101206101bf366004611645565b610b33565b3480156101d057600080fd5b506101426101df36600461169a565b610f02565b3480156101f057600080fd5b506100f7610f54565b34801561020557600080fd5b506101206102143660046115c6565b610f78565b34801561022557600080fd5b506100f761102d565b34801561023a57600080fd5b506100f7610249366004611645565b6110b9565b34801561025a57600080fd5b506100f76102693660046115aa565b6110f2565b34801561027a57600080fd5b506101a461111d565b7f000000000000000000000000000000000000000000000000000000000000000090565b6102af61125d565b6103043373ffffffffffffffffffffffffffffffffffffffff851614806102fc575073ffffffffffffffffffffffffffffffffffffffff8481166000908152600460205260409020541633145b610191611276565b61030d83611284565b6103325760405162461bcd60e51b815260040161032990611ae6565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166103655760405162461bcd60e51b815260040161032990611b43565b600061036f610990565b61ffff8316600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855292529091205491925016156103c65760405162461bcd60e51b815260040161032990611bfd565b61ffff8216600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8781168552925290912054161561041a5760405162461bcd60e51b8152600401610329906119cf565b61ffff8216600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8881168552925290912054161561046e5760405162461bcd60e51b815260040161032990611a2c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a08231906104e09086906004016117d3565b60206040518083038186803b1580156104f857600080fd5b505afa15801561050c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105309190611765565b1561054d5760405162461bcd60e51b8152600401610329906118e0565b61ffff8216600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff808916855292529091205416801561060c5761ffff8316600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555190917f8bbec57d3a3f4c2e45c921fd17cbddb674ae1a51e01ca960b8251463c5907f6391a35b61ffff8316600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff808a168086529184528285208054918c167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316811790915586865260028552838620818752909452828520805490911682179055905190927f632b3b16accd727b982fb08251e873b41265cc9976166f1111fd6ddd49c8b9d391a46040517fecc4c58300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff84169063ecc4c58390610709908790600401611c90565b604080518083038186803b15801561072057600080fd5b505afa158015610734573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610758919061177d565b50905073ffffffffffffffffffffffffffffffffffffffff821615610829578060020234101561079a5760405162461bcd60e51b815260040161032990611972565b6040517f57fb834500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906357fb83459083906107f2908690899033906004016117f4565b6000604051808303818588803b15801561080b57600080fd5b505af115801561081f573d6000803e3d6000fd5b5050505050610849565b803410156108495760405162461bcd60e51b815260040161032990611972565b6040517f57fb834500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906357fb83459083906108a1908a90899033906004016117f4565b6000604051808303818588803b1580156108ba57600080fd5b505af11580156108ce573d6000803e3d6000fd5b5047935050821591506108e79050576108e733826113b8565b505050506108f361143f565b505050565b6000610902610283565b73ffffffffffffffffffffffffffffffffffffffff1663adc63589836040518263ffffffff1660e01b815260040161093a91906117d3565b60206040518083038186803b15801561095257600080fd5b505afa158015610966573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098a9190611765565b92915050565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b61ffff16600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff94851684529091529020541690565b6109ed611558565b60006109f7610283565b905060008173ffffffffffffffffffffffffffffffffffffffff1663010ae757856040518263ffffffff1660e01b8152600401610a3491906117d3565b60206040518083038186803b158015610a4c57600080fd5b505afa158015610a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a849190611765565b6040517f28d09d4700000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8316906328d09d4790610adb9087908590600401611828565b60806040518083038186803b158015610af357600080fd5b505afa158015610b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2b91906116f6565b949350505050565b610b3b61125d565b73ffffffffffffffffffffffffffffffffffffffff8216610b6e5760405162461bcd60e51b81526004016103299061193d565b610b7782611284565b1580610b98575073ffffffffffffffffffffffffffffffffffffffff821633145b610bb45760405162461bcd60e51b815260040161032990611883565b6000610bbe610990565b61ffff8316600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff80891685529252909120549192501680610c155760405162461bcd60e51b815260040161032990611a89565b61ffff8316600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff808716855290835281842080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915585855260028452828520918a16808652919093528184208054909316909255517f632b3b16accd727b982fb08251e873b41265cc9976166f1111fd6ddd49c8b9d3908390a460405161ffff84169073ffffffffffffffffffffffffffffffffffffffff8316907f8bbec57d3a3f4c2e45c921fd17cbddb674ae1a51e01ca960b8251463c5907f6390600090a36040517fecc4c58300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff84169063ecc4c58390610d55908790600401611c90565b604080518083038186803b158015610d6c57600080fd5b505afa158015610d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da4919061177d565b50905080600202341015610dca5760405162461bcd60e51b815260040161032990611972565b6040517f57fb834500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906357fb8345908390610e22908990899033906004016117f4565b6000604051808303818588803b158015610e3b57600080fd5b505af1158015610e4f573d6000803e3d6000fd5b50506040517f57fb834500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871693506357fb83459250849150610eac908690899033906004016117f4565b6000604051808303818588803b158015610ec557600080fd5b505af1158015610ed9573d6000803e3d6000fd5b504793505082159150610ef2905057610ef233826113b8565b50505050610efe61143f565b5050565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f379291906117a0565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b610f80611446565b610f8861125d565b610f9182611284565b610fad5760405162461bcd60e51b815260040161032990611ba0565b73ffffffffffffffffffffffffffffffffffffffff82811660008181526004602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169486169485179055517f72cff3a94768f9930e59d7a01948e45bea689391918693c8d164c16f271c46d99190a3610efe61143f565b6000611037610f54565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561107c57600080fd5b505afa158015611090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b491906116da565b905090565b61ffff16600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff94851684529091529020541690565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600460205260409020541690565b611125611558565b600061112f610283565b905060008173ffffffffffffffffffffffffffffffffffffffff1663900cf0cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561117957600080fd5b505afa15801561118d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b19190611765565b6040517fd1febfb900000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff83169063d1febfb99061120690849060040161184e565b60806040518083038186803b15801561121e57600080fd5b505afa158015611232573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125691906116f6565b9250505090565b61126f60026000541415610190611276565b6002600055565b81610efe57610efe81611487565b60008061128f610283565b73ffffffffffffffffffffffffffffffffffffffff16637175d4f76040518163ffffffff1660e01b815260040160206040518083038186803b1580156112d457600080fd5b505afa1580156112e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130c91906116da565b6040517fc23697a800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063c23697a8906113619086906004016117d3565b60206040518083038186803b15801561137957600080fd5b505afa15801561138d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b1919061167a565b9392505050565b6113c7814710156101a3611276565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516113ed906117d0565b60006040518083038185875af1925050503d806000811461142a576040519150601f19603f3d011682016040523d82523d6000602084013e61142f565b606091505b505090506108f3816101a4611276565b6001600055565b60006114756000357fffffffff0000000000000000000000000000000000000000000000000000000016610f02565b90506114846102fc82336114b1565b50565b611484817f42414c00000000000000000000000000000000000000000000000000000000006114f7565b60006114bb61102d565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040161136193929190611857565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60405180608001604052806000600f0b81526020016000600f0b815260200160008152602001600081525090565b8051600f81900b811461098a57600080fd5b803561ffff8116811461098a57600080fd5b6000602082840312156115bb578081fd5b81356113b181611c9f565b600080604083850312156115d8578081fd5b82356115e381611c9f565b915060208301356115f381611c9f565b809150509250929050565b600080600060608486031215611612578081fd5b833561161d81611c9f565b9250602084013561162d81611c9f565b915061163c8560408601611598565b90509250925092565b60008060408385031215611657578182fd5b823561166281611c9f565b91506116718460208501611598565b90509250929050565b60006020828403121561168b578081fd5b815180151581146113b1578182fd5b6000602082840312156116ab578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146113b1578182fd5b6000602082840312156116eb578081fd5b81516113b181611c9f565b600060808284031215611707578081fd5b6040516080810181811067ffffffffffffffff82111715611726578283fd5b6040526117338484611586565b81526117428460208501611586565b602082015260408301516040820152606083015160608201528091505092915050565b600060208284031215611776578081fd5b5051919050565b6000806040838503121561178f578182fd5b505080516020909101519092909150565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff938416815261ffff929092166020830152909116604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60208082526023908201527f6c6f63616c55736572206973207374696c6c20696e20676f6f64207374616e6460408201527f696e670000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526030908201527f5461726765742072656d6f7465206164647265737320686173206e6f6e2d7a6560408201527f726f20766542414c2062616c616e636500000000000000000000000000000000606082015260800190565b6020808252818101527f6c6f63616c557365722063616e6e6f74206265207a65726f2061646472657373604082015260600190565b60208082526027908201527f496e73756666696369656e742045544820746f2062726964676520757365722060408201527f62616c616e636500000000000000000000000000000000000000000000000000606082015260800190565b60208082526031908201527f43616e6e6f742072656d617020746f20616e206164647265737320746861742060408201527f697320696e20757365206c6f63616c6c79000000000000000000000000000000606082015260800190565b60208082526032908201527f43616e6e6f742072656d617020746f20616e206164647265737320746861742060408201527f697320696e207573652072656d6f74656c790000000000000000000000000000606082015260800190565b60208082526021908201527f52656d617070696e6720746f20636c65617220646f6573206e6f74206578697360408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526038908201527f4f6e6c7920636f6e7472616374732077686963682063616e20686f6c6420766560408201527f42414c2063616e207365742075702061206d617070696e670000000000000000606082015260800190565b6020808252602a908201527f5a65726f20616464726573732063616e6e6f742062652075736564206173207260408201527f656d6f7465207573657200000000000000000000000000000000000000000000606082015260800190565b60208082526037908201527f4f6e6c7920636f6e7472616374732077686963682063616e20686f6c6420766560408201527f42414c206d6179206861766520612064656c6567617465000000000000000000606082015260800190565b60208082526034908201527f43616e6e6f74206f766572777269746520616e206578697374696e67206d617060408201527f70696e6720627920616e6f746865722075736572000000000000000000000000606082015260800190565b60006080820190508251600f0b82526020830151600f0b6020830152604083015160408301526060830151606083015292915050565b61ffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff8116811461148457600080fdfea2646970667358221220a61d77e17ef170fbd8bc526065f75241078a3d6ba7da268648767f4f557d3cb464736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230504-vebal-remapper/index.ts b/balpy/balancer-deployments/tasks/20230504-vebal-remapper/index.ts new file mode 100644 index 0000000..62e2e9e --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230504-vebal-remapper/index.ts @@ -0,0 +1,12 @@ +import { Task, TaskRunOptions } from '@src'; +import { VotingEscrowRemapperDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as VotingEscrowRemapperDeployment; + + const adaptorArgs = [input.Vault]; + const omniVotingEscrowAdaptor = await task.deployAndVerify('OmniVotingEscrowAdaptor', adaptorArgs, from, force); + + const remapperArgs = [input.Vault, input.VotingEscrow, omniVotingEscrowAdaptor.address]; + await task.deployAndVerify('VotingEscrowRemapper', remapperArgs, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20230504-vebal-remapper/input.ts b/balpy/balancer-deployments/tasks/20230504-vebal-remapper/input.ts new file mode 100644 index 0000000..f805fcf --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230504-vebal-remapper/input.ts @@ -0,0 +1,14 @@ +import { Task, TaskMode } from '@src'; + +export type VotingEscrowRemapperDeployment = { + VotingEscrow: string; + Vault: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const VotingEscrow = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); + +export default { + VotingEscrow, + Vault, +}; diff --git a/balpy/balancer-deployments/tasks/20230504-vebal-remapper/output/goerli.json b/balpy/balancer-deployments/tasks/20230504-vebal-remapper/output/goerli.json new file mode 100644 index 0000000..3b54b4d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230504-vebal-remapper/output/goerli.json @@ -0,0 +1,4 @@ +{ + "OmniVotingEscrowAdaptor": "0x83E443EF4f9963C77bd860f94500075556668cb8", + "VotingEscrowRemapper": "0x5DbAd78818D4c8958EfF2d5b95b28385A22113Cd" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230504-vebal-remapper/output/mainnet.json b/balpy/balancer-deployments/tasks/20230504-vebal-remapper/output/mainnet.json new file mode 100644 index 0000000..64ef1d6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230504-vebal-remapper/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "OmniVotingEscrowAdaptor": "0x96484f2aBF5e58b15176dbF1A799627B53F13B6d", + "VotingEscrowRemapper": "0x83E443EF4f9963C77bd860f94500075556668cb8" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230504-vebal-remapper/output/sepolia.json b/balpy/balancer-deployments/tasks/20230504-vebal-remapper/output/sepolia.json new file mode 100644 index 0000000..139bac2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230504-vebal-remapper/output/sepolia.json @@ -0,0 +1,4 @@ +{ + "OmniVotingEscrowAdaptor": "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5", + "VotingEscrowRemapper": "0xF24917fB88261a37Cc57F686eBC831a5c0B9fD39" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230504-vebal-remapper/readme.md b/balpy/balancer-deployments/tasks/20230504-vebal-remapper/readme.md new file mode 100644 index 0000000..1fee154 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230504-vebal-remapper/readme.md @@ -0,0 +1,14 @@ +# 2023-05-04 - Voting Escrow Remapper + +Deployment of the `VotingEscrowRemapper` contract, which allows delegating veBAL balances in mainnet to a different address in L2s and sidechains. +This feature is useful for contract accounts with veBAL in mainnet, since the same address might not be accessible in other networks. + +This deployment also contains the `OmniVotingEscrowAdaptor` auxiliary contract, which is an intermediary between the remapper and the veBAL bridge from LayerZero. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`OmniVotingEscrowAdaptor` artifact](./artifact/OmniVotingEscrowAdaptor.json) +- [`VotingEscrowRemapper` artifact](./artifact/VotingEscrowRemapper.json) diff --git a/balpy/balancer-deployments/tasks/20230504-vebal-remapper/test/task.fork.ts b/balpy/balancer-deployments/tasks/20230504-vebal-remapper/test/task.fork.ts new file mode 100644 index 0000000..ae016ce --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230504-vebal-remapper/test/task.fork.ts @@ -0,0 +1,142 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import * as expectEvent from '@helpers/expectEvent'; +import { fp } from '@helpers/numbers'; +import { actionId } from '@helpers/models/misc/actions'; +import { ZERO_ADDRESS, randomAddress } from '@helpers/constants'; + +import { describeForkTest } from '@src'; +import { Task, TaskMode } from '@src'; +import { getForkedNetwork } from '@src'; +import { impersonate } from '@src'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { deploy } from '@src'; + +describeForkTest('VotingEscrowRemapper', 'mainnet', 17182400, function () { + let vault: Contract, authorizer: Contract; + let veRemapper: Contract, veBAL: Contract, smartWalletChecker: Contract, omniVotingEscrow: Contract; + let omniVotingEscrowAdaptor: Contract; + let admin: SignerWithAddress, other: SignerWithAddress, manager: SignerWithAddress; + let local: SignerWithAddress, disallowedAccount: SignerWithAddress; + + let task: Task; + + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + const VEBAL_HOLDER = '0xd519D5704B41511951C8CF9f65Fee9AB9beF2611'; + + const chainId = 42161; + const remoteAccount = randomAddress(); + const otherRemoteAccount = randomAddress(); + + before('run task', async () => { + task = new Task('20230504-vebal-remapper', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + veRemapper = await task.deployedInstance('VotingEscrowRemapper'); + omniVotingEscrowAdaptor = await task.deployedInstance('OmniVotingEscrowAdaptor'); + }); + + before('setup accounts', async () => { + [, other, disallowedAccount, admin, manager] = await ethers.getSigners(); + local = await impersonate(VEBAL_HOLDER, fp(100)); + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.deployedInstance('Vault'); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + veBAL = await gaugeControllerTask.deployedInstance('VotingEscrow'); + + const smartWalletCheckerTask = new Task('20220420-smart-wallet-checker', TaskMode.READ_ONLY, getForkedNetwork(hre)); + smartWalletChecker = await smartWalletCheckerTask.deployedInstance('SmartWalletChecker'); + omniVotingEscrow = await deploy('MockOmniVotingEscrow'); + }); + + before('grant register and rename permissions to admin', async () => { + const govMultisig = await impersonate(GOV_MULTISIG, fp(100)); + + await authorizer + .connect(govMultisig) + .grantRole(await actionId(veRemapper, 'setNetworkRemappingManager'), admin.address); + await authorizer + .connect(govMultisig) + .grantRole(await actionId(omniVotingEscrowAdaptor, 'setOmniVotingEscrow'), admin.address); + await authorizer + .connect(govMultisig) + .grantRole(await actionId(smartWalletChecker, 'allowlistAddress'), admin.address); + await authorizer + .connect(govMultisig) + .grantRole(await actionId(smartWalletChecker, 'denylistAddress'), admin.address); + }); + + before('allowlist L1 account to be remapped in smart wallet checker', async () => { + await smartWalletChecker.connect(admin).allowlistAddress(local.address); + }); + + before('set omni voting escrow', async () => { + await omniVotingEscrowAdaptor.connect(admin).setOmniVotingEscrow(omniVotingEscrow.address); + }); + + it('gets total supply', async () => { + expect(await veRemapper.getTotalSupplyPoint()).to.be.deep.eq(await veBAL.point_history(await veBAL.epoch())); + }); + + it('gets locked end for user', async () => { + expect(await veRemapper.getLockedEnd(local.address)).to.be.eq(await veBAL.locked__end(local.address)); + }); + + it('remaps allowed account', async () => { + const tx = await veRemapper.connect(local).setNetworkRemapping(local.address, remoteAccount, chainId); + expectEvent.inReceipt(await tx.wait(), 'AddressMappingUpdated', { + localUser: local.address, + remoteUser: remoteAccount, + chainId, + }); + + expect(await veRemapper.getRemoteUser(local.address, chainId)).to.be.eq(remoteAccount); + expect(await veRemapper.getLocalUser(remoteAccount, chainId)).to.be.eq(local.address); + }); + + it('remaps using an appointed remapper', async () => { + await veRemapper.connect(admin).setNetworkRemappingManager(local.address, manager.address); + const tx = await veRemapper.connect(manager).setNetworkRemapping(local.address, otherRemoteAccount, chainId); + expectEvent.inReceipt(await tx.wait(), 'AddressMappingUpdated', { + localUser: local.address, + remoteUser: otherRemoteAccount, + chainId, + }); + + expect(await veRemapper.getRemoteUser(local.address, chainId)).to.be.eq(otherRemoteAccount); + expect(await veRemapper.getLocalUser(otherRemoteAccount, chainId)).to.be.eq(local.address); + + // Cleans previous entry. + expect(await veRemapper.getLocalUser(remoteAccount, chainId)).to.be.eq(ZERO_ADDRESS); + }); + + it('reverts clearing the mapping of an allowed account', async () => { + await expect(veRemapper.clearNetworkRemapping(local.address, chainId)).to.be.revertedWith( + 'localUser is still in good standing' + ); + }); + + it('clears remapping of deny-listed account', async () => { + await smartWalletChecker.connect(admin).denylistAddress(local.address); + const receipt = await (await veRemapper.clearNetworkRemapping(local.address, chainId)).wait(); + + expectEvent.inReceipt(receipt, 'AddressMappingUpdated', { + localUser: local.address, + remoteUser: ZERO_ADDRESS, + chainId, + }); + expectEvent.inReceipt(receipt, 'RemoteAddressMappingCleared', { remoteUser: otherRemoteAccount, chainId }); + }); + + it('reverts with disallowed account', async () => { + await expect( + veRemapper.connect(disallowedAccount).setNetworkRemapping(disallowedAccount.address, other.address, chainId) + ).to.be.revertedWith('Only contracts which can hold veBAL can set up a mapping'); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/artifact/GaugeAdder.json b/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/artifact/GaugeAdder.json new file mode 100644 index 0000000..19a2653 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/artifact/GaugeAdder.json @@ -0,0 +1,298 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GaugeAdder", + "sourceName": "contracts/admin/GaugeAdder.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IGaugeController", + "name": "gaugeController", + "type": "address" + }, + { + "internalType": "contract IAuthorizerAdaptorEntrypoint", + "name": "authorizerAdaptorEntrypoint", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "string", + "name": "indexedGaugeType", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "indexed": false, + "internalType": "contract ILiquidityGaugeFactory", + "name": "gaugeFactory", + "type": "address" + } + ], + "name": "GaugeFactorySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "string", + "name": "indexedGaugeType", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "gaugeType", + "type": "string" + } + ], + "name": "GaugeTypeAdded", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + }, + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + } + ], + "name": "addGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + } + ], + "name": "addGaugeType", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizerAdaptorEntrypoint", + "outputs": [ + { + "internalType": "contract IAuthorizerAdaptorEntrypoint", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + } + ], + "name": "getFactoryForGaugeType", + "outputs": [ + { + "internalType": "contract ILiquidityGaugeFactory", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeController", + "outputs": [ + { + "internalType": "contract IGaugeController", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getGaugeTypeAtIndex", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeTypes", + "outputs": [ + { + "internalType": "string[]", + "name": "", + "type": "string[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeTypesCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + }, + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + } + ], + "name": "isGaugeFromValidFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + } + ], + "name": "isValidGaugeType", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ILiquidityGaugeFactory", + "name": "factory", + "type": "address" + }, + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + } + ], + "name": "setGaugeFactory", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x610120604052620000126101406200027f565b60408051601f19818403018152919052805160209091012060c0523480156200003a57600080fd5b50604051620019ec380380620019ec8339810160408190526200005d9162000241565b816001600160a01b031663f851a4406040518163ffffffff1660e01b815260040160206040518083038186803b1580156200009757600080fd5b505afa158015620000ac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d291906200021b565b6001600160a01b0316638d928af86040518163ffffffff1660e01b815260040160206040518083038186803b1580156200010b57600080fd5b505afa15801562000120573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200014691906200021b565b30608052606090811b6001600160601b031990811660a052600160008190559184901b1660e05280546001600160a01b0319166001600160a01b038381169190911790915560408051637e062a3560e11b815290519184169163fc0c546a91600480820192602092909190829003018186803b158015620001c657600080fd5b505afa158015620001db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020191906200021b565b60601b6001600160601b0319166101005250620002ac9050565b6000602082840312156200022d578081fd5b81516200023a8162000293565b9392505050565b6000806040838503121562000254578081fd5b8251620002618162000293565b6020840151909250620002748162000293565b809150509250929050565b67457468657265756d60c01b815260080190565b6001600160a01b0381168114620002a957600080fd5b50565b60805160a05160601c60c05160e05160601c6101005160601c6116f2620002fa600039806107b25250806106765280610bff5250806106e25250806108b752508061086752506116f26000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80637afcf0e61161008c57806396432aeb1161006657806396432aeb146101cb578063a0ade33e146101d3578063aaabadc5146101e6578063afcb1a86146101ee576100ea565b80637afcf0e61461019b578063851c1bb3146101a35780638d928af8146101c3576100ea565b8063231856fa116100c8578063231856fa1461014d578063572cb6a51461016057806358de9ade146101805780635bf7143414610188576100ea565b8063066edd7a146100ef57806308ceb0301461010457806316e772bc1461012d575b600080fd5b6101026100fd366004611063565b610203565b005b6101176101123660046111d3565b610404565b6040516101249190611446565b60405180910390f35b61014061013b3660046111a0565b6104cc565b6040516101249190611406565b61010261015b3660046111a0565b6104dd565b61017361016e3660046111a0565b6105f4565b604051610124919061130f565b610173610674565b610102610196366004611063565b610698565b610173610847565b6101b66101b13660046110d1565b610863565b6040516101249190611411565b6101736108b5565b6101b66108d9565b6101406101e1366004611063565b6108df565b610173610933565b6101f66109bf565b6040516101249190611388565b61020b610ab5565b8061021581610afe565b610254576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024b906114ff565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316158061031757506040517fce3cc8bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063ce3cc8bd906102c59060009060040161130f565b60206040518083038186803b1580156102dd57600080fd5b505afa1580156102f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061031591906110b1565b155b61034d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024b906115ca565b8260038360405161035e9190611265565b908152604051908190036020018120805473ffffffffffffffffffffffffffffffffffffffff939093167fffffffffffffffffffffffff0000000000000000000000000000000000000000909316929092179091556103be908390611265565b60405180910390207f46b04b7db9f5602bff429ad4ca486bf7ce9ef39d52716794e092c44d68db286783856040516103f7929190611459565b60405180910390a2505050565b60606002828154811061041357fe5b600091825260209182902001805460408051601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001871615020190941693909304928301859004850281018501909152818152928301828280156104bf5780601f10610494576101008083540402835291602001916104bf565b820191906000526020600020905b8154815290600101906020018083116104a257829003601f168201915b505050505090505b919050565b60006104d782610afe565b92915050565b6104e5610ab5565b6000815111610520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024b90611593565b61052981610afe565b15610560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024b906114c8565b6002805460018101825560009190915281516105a3917f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01906020840190610f7d565b50806040516105b29190611265565b60405180910390207fb6691d9563ae43400fbc0d74ed71ab5fa74200ebcf1c8a2b5c9a0a67fd649be0826040516105e99190611446565b60405180910390a250565b60008161060081610afe565b610636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024b906114ff565b6003836040516106469190611265565b9081526040519081900360200190205473ffffffffffffffffffffffffffffffffffffffff16915050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6106a0610ab5565b806106aa81610afe565b6106e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024b906114ff565b7f0000000000000000000000000000000000000000000000000000000000000000826040516020016107129190611265565b6040516020818303038152906040528051906020012014156108385760008373ffffffffffffffffffffffffffffffffffffffff166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b15801561077657600080fd5b505afa15801561078a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ae9190611184565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024b90611536565b505b6108428383610b98565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610898929190611235565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b6000816108eb81610afe565b610921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024b906114ff565b61092b8484610d57565b949350505050565b600061093d6108b5565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561098257600080fd5b505afa158015610996573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ba9190611184565b905090565b60606002805480602002602001604051908101604052809291908181526020016000905b82821015610aac5760008481526020908190208301805460408051601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600187161502019094169390930492830185900485028101850190915281815292830182828015610a985780601f10610a6d57610100808354040283529160200191610a98565b820191906000526020600020905b815481529060010190602001808311610a7b57829003601f168201915b5050505050815260200190600101906109e3565b50505050905090565b6000610ae46000357fffffffff0000000000000000000000000000000000000000000000000000000016610863565b9050610afb610af38233610e3f565b610191610edc565b50565b60008082604051602001610b129190611265565b60405160208183030381529060405280519060200120905060005b600254811015610b8e5760028181548110610b4457fe5b90600052602060002001604051602001610b5e9190611281565b60405160208183030381529060405280519060200120821415610b86576001925050506104c7565b600101610b2d565b5060009392505050565b610ba28282610d57565b610bd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024b90611491565b60015460405173ffffffffffffffffffffffffffffffffffffffff90911690634036176a907f0000000000000000000000000000000000000000000000000000000000000000907f3a04f9000000000000000000000000000000000000000000000000000000000090610c5290879060029060240161135f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252610ce39291600401611330565b600060405180830381600087803b158015610cfd57600080fd5b505af1158015610d11573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526108429190810190611111565b600080600383604051610d6a9190611265565b9081526040519081900360200190205473ffffffffffffffffffffffffffffffffffffffff1690508015610b8e576040517fce3cc8bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063ce3cc8bd90610dea90879060040161130f565b60206040518083038186803b158015610e0257600080fd5b505afa158015610e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3a91906110b1565b61092b565b6000610e49610933565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401610e859392919061141a565b60206040518083038186803b158015610e9d57600080fd5b505afa158015610eb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed591906110b1565b9392505050565b81610eea57610eea81610eee565b5050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b604452610afb917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610fbe57805160ff1916838001178555610feb565b82800160010185558215610feb579182015b82811115610feb578251825591602001919060010190610fd0565b50610ff7929150610ffb565b5090565b5b80821115610ff75760008155600101610ffc565b600082601f830112611020578081fd5b813561103361102e82611628565b611601565b915080825283602082850101111561104a57600080fd5b8060208401602084013760009082016020015292915050565b60008060408385031215611075578182fd5b82356110808161169a565b9150602083013567ffffffffffffffff81111561109b578182fd5b6110a785828601611010565b9150509250929050565b6000602082840312156110c2578081fd5b81518015158114610ed5578182fd5b6000602082840312156110e2578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610ed5578182fd5b600060208284031215611122578081fd5b815167ffffffffffffffff811115611138578182fd5b8201601f81018413611148578182fd5b805161115661102e82611628565b81815285602083850101111561116a578384fd5b61117b82602083016020860161166a565b95945050505050565b600060208284031215611195578081fd5b8151610ed58161169a565b6000602082840312156111b1578081fd5b813567ffffffffffffffff8111156111c7578182fd5b61092b84828501611010565b6000602082840312156111e4578081fd5b5035919050565b6000815180845261120381602086016020860161166a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000825161127781846020870161166a565b9190910192915050565b60008083546001808216600081146112a057600181146112d557611304565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083168652607f600284041686019350611304565b600283048786526020808720875b838110156112fc5781548a8201529085019082016112e3565b505050860193505b509195945050505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff841682526040602083015261092b60408301846111eb565b73ffffffffffffffffffffffffffffffffffffffff929092168252600f0b602082015260400190565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156113f9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526113e78583516111eb565b945092850192908501906001016113ad565b5092979650505050505050565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b600060208252610ed560208301846111eb565b60006040825261146c60408301856111eb565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b6020808252600d908201527f496e76616c696420676175676500000000000000000000000000000000000000604082015260600190565b60208082526018908201527f4761756765207479706520616c72656164792061646465640000000000000000604082015260600190565b60208082526012908201527f496e76616c696420676175676520747970650000000000000000000000000000604082015260600190565b60208082526027908201527f43616e6e6f742061646420676175676520666f722038302f32302042414c2d5760408201527f4554482042505400000000000000000000000000000000000000000000000000606082015260800190565b6020808252601a908201527f476175676520747970652063616e6e6f7420626520656d707479000000000000604082015260600190565b6020808252601e908201527f496e76616c696420666163746f727920696d706c656d656e746174696f6e0000604082015260600190565b60405181810167ffffffffffffffff8111828210171561162057600080fd5b604052919050565b600067ffffffffffffffff82111561163e578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381101561168557818101518382015260200161166d565b83811115611694576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610afb57600080fdfea26469706673582212204d7b5fd8a90724ea6a6fe8cd0afaa1efc61f73ae5da5432575b633ac3e4efbf764736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c80637afcf0e61161008c57806396432aeb1161006657806396432aeb146101cb578063a0ade33e146101d3578063aaabadc5146101e6578063afcb1a86146101ee576100ea565b80637afcf0e61461019b578063851c1bb3146101a35780638d928af8146101c3576100ea565b8063231856fa116100c8578063231856fa1461014d578063572cb6a51461016057806358de9ade146101805780635bf7143414610188576100ea565b8063066edd7a146100ef57806308ceb0301461010457806316e772bc1461012d575b600080fd5b6101026100fd366004611063565b610203565b005b6101176101123660046111d3565b610404565b6040516101249190611446565b60405180910390f35b61014061013b3660046111a0565b6104cc565b6040516101249190611406565b61010261015b3660046111a0565b6104dd565b61017361016e3660046111a0565b6105f4565b604051610124919061130f565b610173610674565b610102610196366004611063565b610698565b610173610847565b6101b66101b13660046110d1565b610863565b6040516101249190611411565b6101736108b5565b6101b66108d9565b6101406101e1366004611063565b6108df565b610173610933565b6101f66109bf565b6040516101249190611388565b61020b610ab5565b8061021581610afe565b610254576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024b906114ff565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316158061031757506040517fce3cc8bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063ce3cc8bd906102c59060009060040161130f565b60206040518083038186803b1580156102dd57600080fd5b505afa1580156102f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061031591906110b1565b155b61034d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024b906115ca565b8260038360405161035e9190611265565b908152604051908190036020018120805473ffffffffffffffffffffffffffffffffffffffff939093167fffffffffffffffffffffffff0000000000000000000000000000000000000000909316929092179091556103be908390611265565b60405180910390207f46b04b7db9f5602bff429ad4ca486bf7ce9ef39d52716794e092c44d68db286783856040516103f7929190611459565b60405180910390a2505050565b60606002828154811061041357fe5b600091825260209182902001805460408051601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001871615020190941693909304928301859004850281018501909152818152928301828280156104bf5780601f10610494576101008083540402835291602001916104bf565b820191906000526020600020905b8154815290600101906020018083116104a257829003601f168201915b505050505090505b919050565b60006104d782610afe565b92915050565b6104e5610ab5565b6000815111610520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024b90611593565b61052981610afe565b15610560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024b906114c8565b6002805460018101825560009190915281516105a3917f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01906020840190610f7d565b50806040516105b29190611265565b60405180910390207fb6691d9563ae43400fbc0d74ed71ab5fa74200ebcf1c8a2b5c9a0a67fd649be0826040516105e99190611446565b60405180910390a250565b60008161060081610afe565b610636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024b906114ff565b6003836040516106469190611265565b9081526040519081900360200190205473ffffffffffffffffffffffffffffffffffffffff16915050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6106a0610ab5565b806106aa81610afe565b6106e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024b906114ff565b7f0000000000000000000000000000000000000000000000000000000000000000826040516020016107129190611265565b6040516020818303038152906040528051906020012014156108385760008373ffffffffffffffffffffffffffffffffffffffff166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b15801561077657600080fd5b505afa15801561078a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ae9190611184565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024b90611536565b505b6108428383610b98565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610898929190611235565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b6000816108eb81610afe565b610921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024b906114ff565b61092b8484610d57565b949350505050565b600061093d6108b5565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561098257600080fd5b505afa158015610996573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ba9190611184565b905090565b60606002805480602002602001604051908101604052809291908181526020016000905b82821015610aac5760008481526020908190208301805460408051601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600187161502019094169390930492830185900485028101850190915281815292830182828015610a985780601f10610a6d57610100808354040283529160200191610a98565b820191906000526020600020905b815481529060010190602001808311610a7b57829003601f168201915b5050505050815260200190600101906109e3565b50505050905090565b6000610ae46000357fffffffff0000000000000000000000000000000000000000000000000000000016610863565b9050610afb610af38233610e3f565b610191610edc565b50565b60008082604051602001610b129190611265565b60405160208183030381529060405280519060200120905060005b600254811015610b8e5760028181548110610b4457fe5b90600052602060002001604051602001610b5e9190611281565b60405160208183030381529060405280519060200120821415610b86576001925050506104c7565b600101610b2d565b5060009392505050565b610ba28282610d57565b610bd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024b90611491565b60015460405173ffffffffffffffffffffffffffffffffffffffff90911690634036176a907f0000000000000000000000000000000000000000000000000000000000000000907f3a04f9000000000000000000000000000000000000000000000000000000000090610c5290879060029060240161135f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252610ce39291600401611330565b600060405180830381600087803b158015610cfd57600080fd5b505af1158015610d11573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526108429190810190611111565b600080600383604051610d6a9190611265565b9081526040519081900360200190205473ffffffffffffffffffffffffffffffffffffffff1690508015610b8e576040517fce3cc8bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063ce3cc8bd90610dea90879060040161130f565b60206040518083038186803b158015610e0257600080fd5b505afa158015610e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3a91906110b1565b61092b565b6000610e49610933565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401610e859392919061141a565b60206040518083038186803b158015610e9d57600080fd5b505afa158015610eb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed591906110b1565b9392505050565b81610eea57610eea81610eee565b5050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b604452610afb917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610fbe57805160ff1916838001178555610feb565b82800160010185558215610feb579182015b82811115610feb578251825591602001919060010190610fd0565b50610ff7929150610ffb565b5090565b5b80821115610ff75760008155600101610ffc565b600082601f830112611020578081fd5b813561103361102e82611628565b611601565b915080825283602082850101111561104a57600080fd5b8060208401602084013760009082016020015292915050565b60008060408385031215611075578182fd5b82356110808161169a565b9150602083013567ffffffffffffffff81111561109b578182fd5b6110a785828601611010565b9150509250929050565b6000602082840312156110c2578081fd5b81518015158114610ed5578182fd5b6000602082840312156110e2578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610ed5578182fd5b600060208284031215611122578081fd5b815167ffffffffffffffff811115611138578182fd5b8201601f81018413611148578182fd5b805161115661102e82611628565b81815285602083850101111561116a578384fd5b61117b82602083016020860161166a565b95945050505050565b600060208284031215611195578081fd5b8151610ed58161169a565b6000602082840312156111b1578081fd5b813567ffffffffffffffff8111156111c7578182fd5b61092b84828501611010565b6000602082840312156111e4578081fd5b5035919050565b6000815180845261120381602086016020860161166a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000825161127781846020870161166a565b9190910192915050565b60008083546001808216600081146112a057600181146112d557611304565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083168652607f600284041686019350611304565b600283048786526020808720875b838110156112fc5781548a8201529085019082016112e3565b505050860193505b509195945050505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff841682526040602083015261092b60408301846111eb565b73ffffffffffffffffffffffffffffffffffffffff929092168252600f0b602082015260400190565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156113f9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526113e78583516111eb565b945092850192908501906001016113ad565b5092979650505050505050565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b600060208252610ed560208301846111eb565b60006040825261146c60408301856111eb565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b6020808252600d908201527f496e76616c696420676175676500000000000000000000000000000000000000604082015260600190565b60208082526018908201527f4761756765207479706520616c72656164792061646465640000000000000000604082015260600190565b60208082526012908201527f496e76616c696420676175676520747970650000000000000000000000000000604082015260600190565b60208082526027908201527f43616e6e6f742061646420676175676520666f722038302f32302042414c2d5760408201527f4554482042505400000000000000000000000000000000000000000000000000606082015260800190565b6020808252601a908201527f476175676520747970652063616e6e6f7420626520656d707479000000000000604082015260600190565b6020808252601e908201527f496e76616c696420666163746f727920696d706c656d656e746174696f6e0000604082015260600190565b60405181810167ffffffffffffffff8111828210171561162057600080fd5b604052919050565b600067ffffffffffffffff82111561163e578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381101561168557818101518382015260200161166d565b83811115611694576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610afb57600080fdfea26469706673582212204d7b5fd8a90724ea6a6fe8cd0afaa1efc61f73ae5da5432575b633ac3e4efbf764736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/index.ts b/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/index.ts new file mode 100644 index 0000000..7308fdf --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { GaugeAdderDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as GaugeAdderDeployment; + + const gaugeAdderArgs = [input.GaugeController, input.AuthorizerAdaptorEntrypoint]; + await task.deployAndVerify('GaugeAdder', gaugeAdderArgs, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/input.ts b/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/input.ts new file mode 100644 index 0000000..f7074d5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/input.ts @@ -0,0 +1,22 @@ +import { Task, TaskMode } from '@src'; + +export type GaugeAdderDeployment = { + GaugeController: string; + AuthorizerAdaptorEntrypoint: string; +}; + +const GaugeController = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); +const AuthorizerAdaptorEntrypoint = new Task('20221124-authorizer-adaptor-entrypoint', TaskMode.READ_ONLY); + +export default { + AuthorizerAdaptorEntrypoint, + mainnet: { + GaugeController, + }, + goerli: { + GaugeController, + }, + sepolia: { + GaugeController, + }, +}; diff --git a/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/output/goerli.json b/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/output/goerli.json new file mode 100644 index 0000000..6654074 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/output/goerli.json @@ -0,0 +1,3 @@ +{ + "GaugeAdder": "0x3f170631ed9821Ca51A59D996aB095162438DC10" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/output/mainnet.json b/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/output/mainnet.json new file mode 100644 index 0000000..a75cace --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "GaugeAdder": "0x5DbAd78818D4c8958EfF2d5b95b28385A22113Cd" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/output/sepolia.json b/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/output/sepolia.json new file mode 100644 index 0000000..908ddf0 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "GaugeAdder": "0xE42FFA682A26EF8F25891db4882932711D42e467" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/readme.md b/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/readme.md new file mode 100644 index 0000000..94dafff --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/readme.md @@ -0,0 +1,13 @@ +# 2023-05-19 - GaugeAdder V4 + +Deployment of the new `GaugeAdder`, a helper contract which helps prevent some forms of improper configuration on the `GaugeController`. + +This version supports adding dynamic gauge types, and allows only one factory per gauge type at a time. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`GaugeAdder` artifact](./artifact/GaugeAdder.json) +- [Previous `GaugeAdder` deployment](../deprecated/20230109-gauge-adder-v3) diff --git a/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/test/task.fork.ts b/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/test/task.fork.ts new file mode 100644 index 0000000..069e914 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230519-gauge-adder-v4/test/task.fork.ts @@ -0,0 +1,157 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { fp } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import * as expectEvent from '@helpers/expectEvent'; + +import { describeForkTest } from '@src'; +import { Task, TaskMode } from '@src'; +import { getForkedNetwork } from '@src'; +import { getSigner, impersonate } from '@src'; +import { actionId } from '@helpers/models/misc/actions'; +import { ZERO_ADDRESS } from '@helpers/constants'; + +describeForkTest('GaugeAdderV4', 'mainnet', 17295800, function () { + let factory: Contract; + let adaptorEntrypoint: Contract; + let authorizer: Contract; + let gaugeAdder: Contract; + let daoMultisig: SignerWithAddress; + let gaugeController: Contract; + + let task: Task, mainnetGaugeFactoryTask: Task; + + const LP_TOKEN = '0xbc5F4f9332d8415AAf31180Ab4661c9141CC84E4'; + const DAO_MULTISIG = '0x10a19e7ee7d7f8a52822f6817de8ea18204f2e4f'; + + const weightCap = fp(0.001); + + before('run Gauge Adder task', async () => { + task = new Task('20230519-gauge-adder-v4', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + gaugeAdder = await task.deployedInstance('GaugeAdder'); + }); + + before('setup accounts', async () => { + daoMultisig = await impersonate(DAO_MULTISIG, fp(100)); + }); + + before('setup contracts', async () => { + const authorizerWrapperTask = new Task('20221124-authorizer-adaptor-entrypoint', TaskMode.READ_ONLY, 'mainnet'); + adaptorEntrypoint = await authorizerWrapperTask.deployedInstance('AuthorizerAdaptorEntrypoint'); + + // At this block we have the authorizer wrapper in place, which is adaptor entrypoint aware. + const authorizerTask = new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizer = await authorizerTask.deployedInstance('Authorizer'); + + // We'll need this task later on. + mainnetGaugeFactoryTask = new Task('20220822-mainnet-gauge-factory-v2', TaskMode.READ_ONLY, 'mainnet'); + }); + + context('construction', () => { + it('stores the entrypoint', async () => { + expect(await gaugeAdder.getAuthorizerAdaptorEntrypoint()).to.equal(adaptorEntrypoint.address); + }); + + it('stores the gauge controller', async () => { + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeController = await gaugeControllerTask.deployedInstance('GaugeController'); + + // Ensure we can call functions on the gaugeController + const controllerAdmin = await gaugeController.admin(); + expect(controllerAdmin).to.not.equal(ZERO_ADDRESS); + expect(await gaugeController.gauge_exists(ZERO_ADDRESS)).to.be.false; + + expect(await gaugeAdder.getGaugeController()).to.equal(gaugeController.address); + }); + }); + + context('advanced functions', () => { + let admin: SignerWithAddress; + let gauge: Contract; + + before('load accounts', async () => { + admin = await getSigner(0); + }); + + before('create gauge factory', async () => { + const factoryTask = new Task('20220822-mainnet-gauge-factory-v2', TaskMode.TEST, getForkedNetwork(hre)); + await factoryTask.run({ force: true }); + factory = await factoryTask.deployedInstance('LiquidityGaugeFactory'); + + expect(await factory.isGaugeFromFactory(ZERO_ADDRESS)).to.be.false; + }); + + // We need to grant permission to the admin to add the LiquidityGaugeFactory to the GaugeAdder, and also to add + // gauges from said factory to the GaugeController. + before('grant permissions', async () => { + const addGaugeTypeAction = await actionId(gaugeAdder, 'addGaugeType'); + const setFactoryAction = await actionId(gaugeAdder, 'setGaugeFactory'); + const addGaugeAction = await actionId(gaugeAdder, 'addGauge'); + const gaugeControllerAddGaugeAction = await actionId( + adaptorEntrypoint, + 'add_gauge(address,int128)', + gaugeController.interface + ); + + await authorizer.connect(daoMultisig).grantRole(addGaugeTypeAction, admin.address); + await authorizer.connect(daoMultisig).grantRole(setFactoryAction, admin.address); + await authorizer.connect(daoMultisig).grantRole(addGaugeAction, admin.address); + await authorizer.connect(daoMultisig).grantRole(gaugeControllerAddGaugeAction, gaugeAdder.address); + }); + + it('can add a gauge type', async () => { + const tx = await gaugeAdder.connect(admin).addGaugeType('Ethereum'); + const receipt = await tx.wait(); + + // `expectEvent` does not work with indexed strings, so we decode the pieces we are interested in manually. + // One event in receipt, named `GaugeTypeAdded` + expect(receipt.events.length).to.be.eq(1); + const event = receipt.events[0]; + expect(event.event).to.be.eq('GaugeTypeAdded'); + + // Contains expected `gaugeType` and `gaugeFactory`. + const decodedArgs = event.decode(event.data); + expect(decodedArgs.gaugeType).to.be.eq('Ethereum'); + }); + + it('returns the added type correctly', async () => { + expect(await gaugeAdder.getGaugeTypesCount()).to.eq(1); + expect(await gaugeAdder.getGaugeTypes()).to.deep.eq(['Ethereum']); + expect(await gaugeAdder.getGaugeTypeAtIndex(0)).to.eq('Ethereum'); + expect(await gaugeAdder.isValidGaugeType('Ethereum')).to.be.true; + expect(await gaugeAdder.isValidGaugeType('ZkSync')).to.be.false; + }); + + it('can add factories for a gauge type', async () => { + const tx = await gaugeAdder.connect(admin).setGaugeFactory(factory.address, 'Ethereum'); // Ethereum is type 2 + const receipt = await tx.wait(); + // `expectEvent` does not work with indexed strings, so we decode the pieces we are interested in manually. + // One event in receipt, named `GaugeFactorySet` + expect(receipt.events.length).to.be.eq(1); + const event = receipt.events[0]; + expect(event.event).to.be.eq('GaugeFactorySet'); + + // Contains expected `gaugeType` and `gaugeFactory`. + const decodedArgs = event.decode(event.data); + expect(decodedArgs.gaugeType).to.be.eq('Ethereum'); + expect(decodedArgs.gaugeFactory).to.be.eq(factory.address); + }); + + it('returns added factory correctly', async () => { + expect(await gaugeAdder.getFactoryForGaugeType('Ethereum')).to.eq(factory.address); + }); + + it('can add gauge to adder and controller', async () => { + const tx = await factory.create(LP_TOKEN, weightCap); + const event = expectEvent.inReceipt(await tx.wait(), 'GaugeCreated'); + gauge = await mainnetGaugeFactoryTask.instanceAt('LiquidityGaugeV5', event.args.gauge); + + await gaugeAdder.connect(admin).addGauge(gauge.address, 'Ethereum'); + + expect(await gaugeAdder.isGaugeFromValidFactory(gauge.address, 'Ethereum')).to.be.true; + expect(await gaugeController.gauge_exists(gauge.address)).to.be.true; + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/artifact/TimelockAuthorizer.json b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/artifact/TimelockAuthorizer.json new file mode 100644 index 0000000..69b1675 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/artifact/TimelockAuthorizer.json @@ -0,0 +1,1616 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TimelockAuthorizer", + "sourceName": "@balancer-labs/v2-vault/contracts/authorizer/TimelockAuthorizer.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "initialRoot", + "type": "address" + }, + { + "internalType": "address", + "name": "nextRoot", + "type": "address" + }, + { + "internalType": "contract IAuthorizerAdaptorEntrypoint", + "name": "authorizerAdaptorEntrypoint", + "type": "address" + }, + { + "internalType": "uint256", + "name": "rootTransferDelay", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "ActionDelaySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "canceler", + "type": "address" + } + ], + "name": "CancelerAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "canceler", + "type": "address" + } + ], + "name": "CancelerRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "newDelay", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "name": "DelayChangeScheduled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "name": "ExecutionCanceled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "name": "ExecutionExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "name": "ExecutionScheduled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "executor", + "type": "address" + } + ], + "name": "ExecutorAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "newDelay", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "name": "GrantDelayChangeScheduled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "GrantDelaySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "where", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "name": "GrantPermissionScheduled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "GranterAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "GranterRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pendingRoot", + "type": "address" + } + ], + "name": "PendingRootSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "PermissionGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "PermissionRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "newDelay", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "name": "RevokeDelayChangeScheduled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "RevokeDelaySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "where", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "name": "RevokePermissionScheduled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "RevokerAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "RevokerRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newRoot", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "name": "RootChangeScheduled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "root", + "type": "address" + } + ], + "name": "RootSet", + "type": "event" + }, + { + "inputs": [], + "name": "EVERYWHERE", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "GLOBAL_CANCELER_SCHEDULED_EXECUTION_ID", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_DELAY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "MINIMUM_CHANGE_DELAY_EXECUTION_DELAY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "addCanceler", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "addGranter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "addRevoker", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "name": "canExecute", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "canPerform", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "name": "cancel", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "claimRoot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "name": "execute", + "outputs": [ + { + "internalType": "bytes", + "name": "result", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + } + ], + "name": "getActionIdDelay", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + } + ], + "name": "getActionIdGrantDelay", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + } + ], + "name": "getActionIdRevokeDelay", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPendingRoot", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRoot", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRootTransferDelay", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "name": "getScheduledExecution", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "where", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "executed", + "type": "bool" + }, + { + "internalType": "bool", + "name": "canceled", + "type": "bool" + }, + { + "internalType": "bool", + "name": "protected", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "executableAt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "scheduledBy", + "type": "address" + }, + { + "internalType": "uint256", + "name": "scheduledAt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "executedBy", + "type": "address" + }, + { + "internalType": "uint256", + "name": "executedAt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "canceledBy", + "type": "address" + }, + { + "internalType": "uint256", + "name": "canceledAt", + "type": "uint256" + } + ], + "internalType": "struct ITimelockAuthorizer.ScheduledExecution", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "skip", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxSize", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "reverseOrder", + "type": "bool" + } + ], + "name": "getScheduledExecutions", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "where", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "executed", + "type": "bool" + }, + { + "internalType": "bool", + "name": "canceled", + "type": "bool" + }, + { + "internalType": "bool", + "name": "protected", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "executableAt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "scheduledBy", + "type": "address" + }, + { + "internalType": "uint256", + "name": "scheduledAt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "executedBy", + "type": "address" + }, + { + "internalType": "uint256", + "name": "executedAt", + "type": "uint256" + }, + { + "internalType": "address", + "name": "canceledBy", + "type": "address" + }, + { + "internalType": "uint256", + "name": "canceledAt", + "type": "uint256" + } + ], + "internalType": "struct ITimelockAuthorizer.ScheduledExecution[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getScheduledExecutionsCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTimelockExecutionHelper", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "grantPermission", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "hasPermission", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isCanceler", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isExecutor", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "isGranter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isPendingRoot", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "isPermissionGrantedOnTarget", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "isRevoker", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isRoot", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "removeCanceler", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "removeGranter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "removeRevoker", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "renouncePermission", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "revokePermission", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "where", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "address[]", + "name": "executors", + "type": "address[]" + } + ], + "name": "schedule", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "newDelay", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "executors", + "type": "address[]" + } + ], + "name": "scheduleDelayChange", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "newDelay", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "executors", + "type": "address[]" + } + ], + "name": "scheduleGrantDelayChange", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + }, + { + "internalType": "address[]", + "name": "executors", + "type": "address[]" + } + ], + "name": "scheduleGrantPermission", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "newDelay", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "executors", + "type": "address[]" + } + ], + "name": "scheduleRevokeDelayChange", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + }, + { + "internalType": "address[]", + "name": "executors", + "type": "address[]" + } + ], + "name": "scheduleRevokePermission", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newRoot", + "type": "address" + }, + { + "internalType": "address[]", + "name": "executors", + "type": "address[]" + } + ], + "name": "scheduleRootChange", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "setDelay", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "setGrantDelay", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pendingRoot", + "type": "address" + } + ], + "name": "setPendingRoot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "setRevokeDelay", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101206040523480156200001257600080fd5b50604051620049c4380380620049c483398101604081905262000035916200025b565b8383836001600160a01b0316638d928af86040518163ffffffff1660e01b815260040160206040518083038186803b1580156200007157600080fd5b505afa15801562000086573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000ac9190620002b4565b83620000b884620001bb565b620000c38362000203565b6001600160601b0319606083901b1660a052604051620000e3906200024d565b604051809103906000f08015801562000100573d6000803e3d6000fd5b5060601b6001600160601b03191660805260c05250506040805163e758d36b60e01b815290516001600160a01b038516925063e758d36b91600480820192602092909190829003018186803b1580156200015957600080fd5b505afa1580156200016e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001949190620002b4565b6001600160601b0319606091821b81166101005292901b90911660e05250620002f3915050565b600080546001600160a01b0319166001600160a01b038316908117825560405190917f39510b933a9d010f906528d6019d3f4e2450a10dc33b10887503b31ed82f111191a250565b600180546001600160a01b0319166001600160a01b0383169081179091556040517f566fe119ff450afc2580186c62762b6c1258245c8b1b6bb095e7276eb5a75b5590600090a250565b6104ef80620044d583390190565b6000806000806080858703121562000271578384fd5b84516200027e81620002da565b60208601519094506200029181620002da565b6040860151909350620002a481620002da565b6060959095015193969295505050565b600060208284031215620002c6578081fd5b8151620002d381620002da565b9392505050565b6001600160a01b0381168114620002f057600080fd5b50565b60805160601c60a05160601c60c05160e05160601c6101005160601c61417d62000358600039806119bc5250806119e4525080611d195250806118385250806106e15280610a955280610ac25280611dc552806124b952806127b8525061417d6000f3fe608060405234801561001057600080fd5b50600436106103205760003560e01c80638bd6bbc9116101a7578063c284b6b9116100ee578063e4c00f4f11610097578063f23481e011610071578063f23481e01461065a578063f6ebcbaf14610662578063fe0d94c11461067557610320565b8063e4c00f4f14610614578063f084552214610634578063f0bb94061461064757610320565b8063cc63604a116100c8578063cc63604a146105e6578063d00bef4d146105f9578063e2b4146b1461060157610320565b8063c284b6b9146105b8578063c6192ee3146105c0578063c80c23e1146105d357610320565b80639be2a88411610150578063b1e31aa01161012a578063b1e31aa01461058a578063b3eb281d14610592578063b99db526146105a557610320565b80639be2a88414610551578063a44495d114610564578063a8eae12d1461057757610320565b8063902168121161018157806390216812146105235780639299942e1461053657806399a7f6e21461053e57610320565b80638bd6bbc9146104f55780638cc3d072146105085780638d928af81461051b57610320565b806340e58ee51161026b57806362cde1ba1161021457806372efb120116101ee57806372efb120146104bc578063863bac6b146104cf57806386ff254b146104e257610320565b806362cde1ba1461048157806363cdbf36146104895780636badd2ab1461049c57610320565b80635b78b780116102455780635b78b780146104535780635ca1e16514610466578063608dd7e41461046e57610320565b806340e58ee5146104255780634125ff9014610438578063557a64031461044057610320565b80631b3c85eb116102cd5780633ac5d439116102a75780633ac5d439146103ec5780633bf46797146103ff5780633e1df46d1461041257610320565b80631b3c85eb146103b35780632229edb4146103c65780632e3ed05b146103d957610320565b806314ea35e7116102fe57806314ea35e714610376578063169f14681461037e57806318ef871a1461039e57610320565b806304434606146103255780630df322a61461034e57806310d3ab2c14610361575b600080fd5b6103386103333660046132f6565b610695565b6040516103459190613711565b60405180910390f35b61033861035c366004613177565b6106c2565b61037461036f3660046133be565b6106d6565b005b61037461079b565b61039161038c366004613213565b6107dc565b60405161034591906140b7565b6103a6610a93565b60405161034591906135e4565b6103746103c1366004613177565b610ab7565b6103746103d4366004613319565b610b08565b6103916103e73660046131c6565b610bc0565b6103746103fa366004613319565b610cb9565b61039161040d3660046132c6565b610d3f565b6103386104203660046132f6565b610d51565b6103746104333660046132c6565b610dc3565b610391610f0a565b61033861044e366004613177565b610f12565b610391610461366004613356565b610f26565b6103a6611079565b61039161047c3660046133df565b611088565b6103a66111b8565b6103916104973660046133df565b6111dc565b6104af6104aa3660046132c6565b61130c565b60405161034591906140a4565b6103746104ca3660046132f6565b611494565b6103916104dd366004613356565b6115be565b6103386104f0366004613319565b6116e7565b6103916105033660046132c6565b61171a565b610374610516366004613319565b61172c565b6103a6611836565b610374610531366004613192565b61185a565b6103916111b8565b61037461054c3660046132f6565b6119a0565b61033861055f366004613319565b6119af565b610374610572366004613192565b611a66565b610374610585366004613319565b611b0f565b610391611c6e565b6103386105a0366004613319565b611c75565b6103916105b33660046132c6565b611d05565b610391611d17565b6103386105ce366004613192565b611d3b565b6103746105e13660046133be565b611dba565b6103386105f43660046132c6565b611e6a565b6103a6611ee3565b61033861060f366004613319565b611ef2565b610627610622366004613496565b611f7a565b6040516103459190613693565b6103916106423660046133df565b61237e565b6103746106553660046133be565b6124ae565b610391612623565b6103746106703660046132f6565b612629565b6106886106833660046132c6565b612658565b6040516103459190613776565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff165b92915050565b6001546001600160a01b0390811691161490565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107275760405162461bcd60e51b815260040161071e90613eb5565b60405180910390fd5b61073081612886565b61074c5760405162461bcd60e51b815260040161071e9061398d565b600082815260076020526040908190208290555182907f6922a4f4deeb55fdca50df28a72475aa87f9f1377ed93a95842ce8bc69dc01e89061078f9084906140b7565b60405180910390a25050565b6001546001600160a01b03163381146107c65760405162461bcd60e51b815260040161071e90613d34565b6107cf81612961565b6107d960006129c1565b50565b60006001600160a01b0384163014156108075760405162461bcd60e51b815260040161071e906138c2565b61080f610a93565b6001600160a01b0316846001600160a01b031614156108405760405162461bcd60e51b815260040161071e90613789565b6004835110156108625760405162461bcd60e51b815260040161071e90613b45565b600060188460038151811061087357fe5b016020015185517fff0000000000000000000000000000000000000000000000000000000000000090911690911c90601090869060029081106108b257fe5b016020015186517fff0000000000000000000000000000000000000000000000000000000000000090911690911c90600890879060019081106108f157fe5b016020015187517fff0000000000000000000000000000000000000000000000000000000000000090911690911c90879060009061092b57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191617171790506000856001600160a01b031663851c1bb3836040518263ffffffff1660e01b815260040161098b9190613749565b60206040518083038186803b1580156109a357600080fd5b505afa1580156109b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109db91906132de565b90506109e8813388611ef2565b610a045760405162461bcd60e51b815260040161071e90613b7c565b6000818152600a602052604090205480610a305760405162461bcd60e51b815260040161071e90613bb3565b6000610a3e88888489612a23565b905080837f26ce5ffb7ab1ce72d9ca4a3e4f906d2b99194d6c53dd9832fd7a59d0b2fc6bed60405160405180910390a3610a788133610d51565b610a8657610a868133612d7b565b93505050505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610aff5760405162461bcd60e51b815260040161071e90613eb5565b6107d9816129c1565b610b1133610f12565b610b2d5760405162461bcd60e51b815260040161071e90613c58565b610b38838383611c75565b15610b555760405162461bcd60e51b815260040161071e906139c4565b60008381526003602090815260408083206001600160a01b038087168086529184528285209086168086529352818420805460ff1916600117905590519192909186917f2d106cf4379aad979c25af765e6f7169b732d4c4660e41aa733a150c7fc0a6f791a4505050565b6000610bcb33610f12565b610be75760405162461bcd60e51b815260040161071e90613c58565b6060631b3c85eb60e01b84604051602401610c0291906135e4565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506000610c783083610c72611d17565b87612a23565b905080856001600160a01b03167f7de09ff5f925ca34a396df31b30cdbdd0cd10b88833b4f7334cecc02454c1be760405160405180910390a3949350505050565b600083815260086020526040902054610cf757610cd63382611d3b565b610cf25760405162461bcd60e51b815260040161071e90613c21565b610d2f565b610cff610a93565b6001600160a01b0316336001600160a01b031614610d2f5760405162461bcd60e51b815260040161071e90613cfd565b610d3a838383612e8b565b505050565b6000908152600a602052604090205490565b60008281526005602090815260408083206001600160a01b038516845290915281205460ff1680610db4575060056000610d896111b8565b8152602080820192909252604090810160009081206001600160a01b038616825290925290205460ff165b80610a8c5750610a8c82610f12565b6006548110610de45760405162461bcd60e51b815260040161071e906137e6565b600060068281548110610df357fe5b60009182526020909120600a90910201600281015490915060ff1615610e2b5760405162461bcd60e51b815260040161071e90613e7e565b6002810154610100900460ff1615610e555760405162461bcd60e51b815260040161071e90613ad7565b610e5f8233610d51565b610e7b5760405162461bcd60e51b815260040161071e9061406d565b6002810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790556008810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905542600982015560405182907fe48f88ceada5a6ddb8ded9b5e457cb802e319a647eec8ff1f2a0512c0a741ed990600090a25050565b6303c2670090565b6000546001600160a01b0390811691161490565b6000610f323384611d3b565b610f4e5760405162461bcd60e51b815260040161071e90613c21565b60008581526008602052604090205480610f7a5760405162461bcd60e51b815260040161071e90613dd9565b6060633ac5d43960e01b878787604051602401610f999392919061371c565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050600061100830838588612a23565b9050856001600160a01b0316876001600160a01b0316897f645fdc5699106b1dffda57f54fdcca22ad57d87f0afd651edf857af3bfbd87848460405161104e91906140b7565b60405180910390a46110608133610d51565b61106e5761106e8133612d7b565b979650505050505050565b6000546001600160a01b031690565b600061109333610f12565b6110af5760405162461bcd60e51b815260040161071e90613c58565b6110b7610f0a565b8311156110d65760405162461bcd60e51b815260040161071e90613da2565b6000848152600860205260408120546110ef9085612f9f565b9050606063c80c23e160e01b868660405160240161110e92919061373b565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050600061117d30838588612a23565b90508086887f2f330faf5e23fc7ff1c46f2b1a3299d86249055a5bf74a8b747ab7fb66f6dc9f60405160405180910390a49695505050505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b60006111e733610f12565b6112035760405162461bcd60e51b815260040161071e90613c58565b61120b610f0a565b83111561122a5760405162461bcd60e51b815260040161071e90613da2565b6000848152600760205260408120546112439085612f9f565b905060606310d3ab2c60e01b868660405160240161126292919061373b565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905060006112d130838588612a23565b90508086887f3d8c3ad02346a1ddf099dd26578662fb8cf85903168ebfeb1f14473fed8ee48860405160405180910390a49695505050505050565b611314612fe0565b6006828154811061132157fe5b60009182526020918290206040805161018081018252600a90930290910180546001600160a01b03168352600180820180548451601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95841615610100029590950190921693909304908101879004870283018701909452838252939491938583019391929091908301828280156113fd5780601f106113d2576101008083540402835291602001916113fd565b820191906000526020600020905b8154815290600101906020018083116113e057829003601f168201915b5050509183525050600282015460ff808216151560208401526101008083048216151560408501526201000090920416151560608301526003830154608083015260048301546001600160a01b0390811660a0840152600584015460c08401526006840154811660e08401526007840154918301919091526008830154166101208201526009909101546101409091015292915050565b61149d33610f12565b6114b95760405162461bcd60e51b815260040161071e90613c58565b6114c281610f12565b156114df5760405162461bcd60e51b815260040161071e9061381d565b6114e98282610d51565b6115055760405162461bcd60e51b815260040161071e90613f23565b600560006115116111b8565b8152602080820192909252604090810160009081206001600160a01b038516825290925290205460ff1615611566576115486111b8565b82146115665760405162461bcd60e51b815260040161071e90613eec565b60008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551909184917fd6b522eb4b505a0843020e304ba27d827b52c89347e6176b2f2737e6e4015c2d9190a35050565b60006115cb853385611c75565b6115e75760405162461bcd60e51b815260040161071e9061391f565b600085815260076020526040902054806116135760405162461bcd60e51b815260040161071e90613aa0565b6060638cc3d07260e01b8787876040516024016116329392919061371c565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905060006116a130838588612a23565b9050856001600160a01b0316876001600160a01b0316897f185f04ff33c89687859342776c7fdcf04d9eb9444d65192bfebab5a5ac9874a88460405161104e91906140b7565b60009283526009602090815260408085206001600160a01b03948516865282528085209290931684525290205460ff1690565b60009081526007602052604090205490565b60008381526007602052604090205461176b5761174a833383611c75565b6117665760405162461bcd60e51b815260040161071e9061391f565b6117a3565b611773610a93565b6001600160a01b0316336001600160a01b0316146117a35760405162461bcd60e51b815260040161071e90613f5a565b6117ae838383611ef2565b156117cb5760405162461bcd60e51b815260040161071e9061388b565b60008381526009602090815260408083206001600160a01b038087168086529184528285209086168086529352818420805460ff1916600117905590519192909186917fef6ee312a0062a24a46be2eba5284183a87ff848110e8d4df979bd690d9e9f6891a4505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b61186333610f12565b61187f5760405162461bcd60e51b815260040161071e90613c58565b6118898282611d3b565b6118a55760405162461bcd60e51b815260040161071e90613f91565b6118ae82610f12565b156118cb5760405162461bcd60e51b815260040161071e90613c8f565b6001600160a01b0382166000908152600460205260408120906118ec6111b8565b6001600160a01b0316815260208101919091526040016000205460ff1615611946576119166111b8565b6001600160a01b0316816001600160a01b0316146119465760405162461bcd60e51b815260040161071e90613bea565b6001600160a01b03808316600081815260046020908152604080832094861680845294909152808220805460ff19169055517fb6fe3ab11eb9ab1d9f1d41c8f42a5d72d10122099ba1548e4a6d1a4d8cefec4b9190a35050565b6119ab823383612e8b565b5050565b6000336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415611a1e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316149050610a8c565b6000848152600a602052604090205415611a5357611a3a610a93565b6001600160a01b0316836001600160a01b031614611a5e565b611a5e848484611ef2565b949350505050565b611a6f33610f12565b611a8b5760405162461bcd60e51b815260040161071e90613c58565b611a958282611d3b565b15611ab25760405162461bcd60e51b815260040161071e90614036565b6001600160a01b03808316600081815260046020908152604080832094861680845294909152808220805460ff19166001179055517f2b5f18afd9a7b21f41bf023b012b3d4c8a22a21b79fa425cd4494ecbe29701969190a35050565b611b1833610f12565b611b345760405162461bcd60e51b815260040161071e90613c58565b611b3f838383611c75565b611b5b5760405162461bcd60e51b815260040161071e90613e47565b611b6482610f12565b15611b815760405162461bcd60e51b815260040161071e90613fff565b60008381526003602090815260408083206001600160a01b0386168452909152812090611bac6111b8565b6001600160a01b0316815260208101919091526040016000205460ff1615611c0657611bd66111b8565b6001600160a01b0316816001600160a01b031614611c065760405162461bcd60e51b815260040161071e90613854565b60008381526003602090815260408083206001600160a01b038087168086529184528285209086168086529352818420805460ff1916905590519192909186917ff8034293d5b4ed16b867ded8f122c475bc0d1b6bd9309a606609a754e5f3adc391a4505050565b6206978090565b60008381526003602090815260408083206001600160a01b038087168552908352818420908516845290915281205460ff1680611cf6575060008481526003602090815260408083206001600160a01b0387168452909152812090611cd86111b8565b6001600160a01b0316815260208101919091526040016000205460ff165b80611a5e5750611a5e83610f12565b60009081526008602052604090205490565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b03808316600090815260046020908152604080832093851683529290529081205460ff1680611dab57506001600160a01b038316600090815260046020526040812090611d8d6111b8565b6001600160a01b0316815260208101919091526040016000205460ff165b80610a8c5750610a8c83610f12565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611e025760405162461bcd60e51b815260040161071e90613eb5565b611e0b81612886565b611e275760405162461bcd60e51b815260040161071e9061398d565b600082815260086020526040908190208290555182907f6aeebd84e31437f28a17927609991676c31c2b84875c601373da2c194e9d23419061078f9084906140b7565b6006546000908210611e8e5760405162461bcd60e51b815260040161071e906137e6565b600060068381548110611e9d57fe5b60009182526020909120600a90910201600281015490915060ff16158015611ecf57506002810154610100900460ff16155b8015610a8c57506003015442101592915050565b6001546001600160a01b031690565b60008381526009602090815260408083206001600160a01b038087168552908352818420908516845290915281205460ff1680611a5e575060008481526009602090815260408083206001600160a01b0387168452909152812090611f556111b8565b6001600160a01b0316815260208101919091526040016000205460ff16949350505050565b6006546060908410611f9e5760405162461bcd60e51b815260040161071e90613a69565b60008311611fbe5760405162461bcd60e51b815260040161071e90613e10565b6006548490036000611fd08286612fc8565b905060608167ffffffffffffffff81118015611feb57600080fd5b5060405190808252806020026020018201604052801561202557816020015b612012612fe0565b81526020019060019003908161200a5790505b50905060005b8281101561237357856121d25760068189018154811061204757fe5b60009182526020918290206040805161018081018252600a90930290910180546001600160a01b03168352600180820180548451601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95841615610100029590950190921693909304908101879004870283018701909452838252939491938583019391929091908301828280156121235780601f106120f857610100808354040283529160200191612123565b820191906000526020600020905b81548152906001019060200180831161210657829003601f168201915b5050509183525050600282015460ff808216151560208401526101008083048216151560408501526201000090920416151560608301526003830154608083015260048301546001600160a01b0390811660a0840152600584015460c08401526006840154811660e08401526007840154918301919091526008830154166101208201526009909101546101409091015282518390839081106121c257fe5b602002602001018190525061236b565b6006816001860303815481106121e457fe5b60009182526020918290206040805161018081018252600a90930290910180546001600160a01b03168352600180820180548451601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95841615610100029590950190921693909304908101879004870283018701909452838252939491938583019391929091908301828280156122c05780601f10612295576101008083540402835291602001916122c0565b820191906000526020600020905b8154815290600101906020018083116122a357829003601f168201915b5050509183525050600282015460ff808216151560208401526101008083048216151560408501526201000090920416151560608301526003830154608083015260048301546001600160a01b0390811660a0840152600584015460c08401526006840154811660e084015260078401549183019190915260088301541661012082015260099091015461014090910152825183908390811061235f57fe5b60200260200101819052505b60010161202b565b509695505050505050565b600061238933610f12565b6123a55760405162461bcd60e51b815260040161071e90613c58565b6123ad610f0a565b8311156123cc5760405162461bcd60e51b815260040161071e90613da2565b6000848152600a60205260408120546123e59085612f9f565b9050606063f0bb940660e01b868660405160240161240492919061373b565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050600061247330838588612a23565b90508086887fbc72942fa810fe8985041bb36295502eddf2c163774be55e25d205958956072860405160405180910390a49695505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146124f65760405162461bcd60e51b815260040161071e90613eb5565b6124fe611836565b6040517f851c1bb30000000000000000000000000000000000000000000000000000000081526001600160a01b03919091169063851c1bb390612565907f058a628f0000000000000000000000000000000000000000000000000000000090600401613749565b60206040518083038186803b15801561257d57600080fd5b505afa158015612591573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b591906132de565b82146125e0576125c481612886565b6125e05760405162461bcd60e51b815260040161071e9061398d565b6000828152600a6020526040908190208290555182907f0e182617f9e5f9ce5f761c791ec15ad52176d97f9706b5c2707ffda7b6bdf7909061078f9084906140b7565b60065490565b61263233610f12565b61264e5760405162461bcd60e51b815260040161071e90613c58565b6119ab8282612d7b565b600654606090821061267c5760405162461bcd60e51b815260040161071e906137e6565b60006006838154811061268b57fe5b60009182526020909120600a90910201600281015490915060ff16156126c35760405162461bcd60e51b815260040161071e90613e7e565b6002810154610100900460ff16156126ed5760405162461bcd60e51b815260040161071e90613ad7565b80600301544210156127115760405162461bcd60e51b815260040161071e90613cc6565b600281015462010000900460ff161561274a5761272e8333610695565b61274a5760405162461bcd60e51b815260040161071e90613956565b60028101805460ff191660019081179091556006820180547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905542600783015581546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811693631cff79cd936127fc93921691908601906004016135f8565b600060405180830381600087803b15801561281657600080fd5b505af115801561282a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128529190810190613423565b60405190925083907f4fa5548c15e2d4a0b806eee962935acea143d79644d2340af39f4edf13b335a990600090a250919050565b600080612891611836565b6040517f851c1bb30000000000000000000000000000000000000000000000000000000081526001600160a01b03919091169063851c1bb3906128f8907f058a628f0000000000000000000000000000000000000000000000000000000090600401613749565b60206040518083038186803b15801561291057600080fd5b505afa158015612924573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294891906132de565b6000908152600a60205260409020549092111592915050565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038316908117825560405190917f39510b933a9d010f906528d6019d3f4e2450a10dc33b10887503b31ed82f111191a250565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f566fe119ff450afc2580186c62762b6c1258245c8b1b6bb095e7276eb5a75b5590600090a250565b60068054825160408051610180810182526001600160a01b03898116825260208083018a815260009484018590526060840185905294151560808401819052428a810160a086018190523360c087015260e086019190915261010085018690526101208501869052610140850186905261016085018690526001880189559790945282517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f600a880290810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169290941691909117835594518051969796949593949293612b3d937ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40909101929190910190613045565b5060408201516002820180546060850151608086015160ff19909216931515939093177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101009315158402177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16620100009115159190910217905560a0830151600383015560c08301516004830180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b039384161790915560e08501516005850155918401516006840180548416918316919091179055610120840151600784015561014084015160088401805490931691161790556101609091015160099091015560005b8451811015612d7057600260008581526020019081526020016000206000868381518110612c7b57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615612cbf5760405162461bcd60e51b815260040161071e90613a32565b6000848152600260205260408120865160019290889085908110612cdf57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550848181518110612d2a57fe5b60200260200101516001600160a01b0316847f2d0aa562da96ca6dd124fee5588e6f8545b0aa0b15cfd87cc231eff1ae7000e460405160405180910390a3600101612c51565b505050949350505050565b612d858282610d51565b15612da25760405162461bcd60e51b815260040161071e90613fc8565b612daa6111b8565b8214612e30576006548210612dd15760405162461bcd60e51b815260040161071e906137e6565b600060068381548110612de057fe5b60009182526020909120600a90910201600281015490915060ff16158015612e1257506002810154610100900460ff16155b612e2e5760405162461bcd60e51b815260040161071e90613b0e565b505b60008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551909184917f1b55562f9a67454174f758170aba47751c0af4c1f3b7d4e0b70667f1e82066069190a35050565b612e96838383611ef2565b612eb25760405162461bcd60e51b815260040161071e906139fb565b60008381526009602090815260408083206001600160a01b0386168452909152812090612edd6111b8565b6001600160a01b0316815260208101919091526040016000205460ff1615612f3757612f076111b8565b6001600160a01b0316816001600160a01b031614612f375760405162461bcd60e51b815260040161071e90613d6b565b60008381526009602090815260408083206001600160a01b038087168086529184528285209086168086529352818420805460ff1916905590519192909186917f7b42e026d3b17cf41399915c285780d0f724b3464b269297aff73c0de0fe417f91a4505050565b6000828210612fb557612fb0611c6e565b610a8c565b610a8c828403612fc3611c6e565b612fd4565b80820390821102900390565b80820390821002900390565b604080516101808101825260008082526060602083018190529282018190529181018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101829052610140810182905261016081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061308657805160ff19168380011785556130b3565b828001600101855582156130b3579182015b828111156130b3578251825591602001919060010190613098565b506130bf9291506130c3565b5090565b5b808211156130bf57600081556001016130c4565b80356001600160a01b03811681146106bc57600080fd5b600082601f8301126130ff578081fd5b813567ffffffffffffffff811115613115578182fd5b60208082026131258282016140c0565b8381529350818401858301828701840188101561314157600080fd5b600092505b8483101561316c5761315888826130d8565b825260019290920191908301908301613146565b505050505092915050565b600060208284031215613188578081fd5b610a8c83836130d8565b600080604083850312156131a4578081fd5b6131ae84846130d8565b91506131bd84602085016130d8565b90509250929050565b600080604083850312156131d8578182fd5b6131e284846130d8565b9150602083013567ffffffffffffffff8111156131fd578182fd5b613209858286016130ef565b9150509250929050565b600080600060608486031215613227578081fd5b61323185856130d8565b9250602084013567ffffffffffffffff8082111561324d578283fd5b818601915086601f830112613260578283fd5b813561327361326e826140e7565b6140c0565b818152886020838601011115613287578485fd5b81602085016020830137908101602001849052935060408601359150808211156132af578283fd5b506132bc868287016130ef565b9150509250925092565b6000602082840312156132d7578081fd5b5035919050565b6000602082840312156132ef578081fd5b5051919050565b60008060408385031215613308578182fd5b823591506131bd84602085016130d8565b60008060006060848603121561332d578283fd5b8335925061333e85602086016130d8565b915061334d85604086016130d8565b90509250925092565b6000806000806080858703121561336b578081fd5b8435935061337c86602087016130d8565b925061338b86604087016130d8565b9150606085013567ffffffffffffffff8111156133a6578182fd5b6133b2878288016130ef565b91505092959194509250565b600080604083850312156133d0578182fd5b50508035926020909101359150565b6000806000606084860312156133f3578283fd5b8335925060208401359150604084013567ffffffffffffffff811115613417578182fd5b6132bc868287016130ef565b600060208284031215613434578081fd5b815167ffffffffffffffff81111561344a578182fd5b8201601f8101841361345a578182fd5b805161346861326e826140e7565b81815285602083850101111561347c578384fd5b61348d826020830160208601614117565b95945050505050565b6000806000606084860312156134aa578081fd5b8335925060208401359150604084013580151581146134c7578182fd5b809150509250925092565b6001600160a01b03169052565b15159052565b600081518084526134fd816020860160208601614117565b601f01601f19169290920160200192915050565b60006101806135218484516134d2565b6020830151816020860152613538828601826134e5565b915050604083015161354d60408601826134df565b50606083015161356060608601826134df565b50608083015161357360808601826134df565b5060a083015160a085015260c083015161359060c08601826134d2565b5060e083015160e0850152610100808401516135ae828701826134d2565b50506101208381015190850152610140808401516135ce828701826134d2565b5050610160928301519390920192909252919050565b6001600160a01b0391909116815260200190565b6000604082016001600160a01b0385168352602060408185015282855460018082166000811461362f576001811461364d57613685565b607f6002840416865260ff1983166060890152608088019350613685565b6002830480875261365d8a61410b565b885b8281101561367b5781548b82016060015290840190870161365f565b8a01606001955050505b509198975050505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015613704577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526136f2858351613511565b945092850192908501906001016136b8565b5092979650505050505050565b901515815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b918252602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b600060208252610a8c60208301846134e5565b60208082526026908201527f415454454d5054494e475f455845435554494f4e5f48454c5045525f5245454e60408201527f5452414e43590000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f455845435554494f4e5f444f45535f4e4f545f45584953540000000000000000604082015260600190565b6020808252601b908201527f43414e4e4f545f52454d4f56455f524f4f545f43414e43454c45520000000000604082015260600190565b60208082526011908201527f4752414e5445525f49535f474c4f42414c000000000000000000000000000000604082015260600190565b6020808252601a908201527f5045524d495353494f4e5f414c52454144595f4752414e544544000000000000604082015260600190565b60208082526022908201527f43414e4e4f545f5343484544554c455f415554484f52495a45525f414354494f60408201527f4e53000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526015908201527f53454e4445525f49535f4e4f545f4752414e5445520000000000000000000000604082015260600190565b60208082526016908201527f53454e4445525f49535f4e4f545f4558454355544f5200000000000000000000604082015260600190565b6020808252601c908201527f44454c41595f455843454544535f5345545f415554484f52495a455200000000604082015260600190565b6020808252601a908201527f4143434f554e545f49535f414c52454144595f4752414e544552000000000000604082015260600190565b60208082526016908201527f5045524d495353494f4e5f4e4f545f4752414e54454400000000000000000000604082015260600190565b60208082526013908201527f4455504c49434154455f4558454355544f525300000000000000000000000000604082015260600190565b60208082526014908201527f534b49505f56414c55455f544f4f5f4c41524745000000000000000000000000604082015260600190565b60208082526019908201527f414354494f4e5f4841535f4e4f5f4752414e545f44454c415900000000000000604082015260600190565b6020808252601a908201527f455845435554494f4e5f414c52454144595f43414e43454c4544000000000000604082015260600190565b60208082526018908201527f455845435554494f4e5f49535f4e4f545f50454e44494e470000000000000000604082015260600190565b6020808252600e908201527f444154415f544f4f5f53484f5254000000000000000000000000000000000000604082015260600190565b6020808252601f908201527f53454e4445525f444f45535f4e4f545f484156455f5045524d495353494f4e00604082015260600190565b60208082526010908201527f44454c41595f49535f4e4f545f53455400000000000000000000000000000000604082015260600190565b60208082526011908201527f5245564f4b45525f49535f474c4f42414c000000000000000000000000000000604082015260600190565b60208082526015908201527f53454e4445525f49535f4e4f545f5245564f4b45520000000000000000000000604082015260600190565b60208082526012908201527f53454e4445525f49535f4e4f545f524f4f540000000000000000000000000000604082015260600190565b6020808252601a908201527f43414e4e4f545f52454d4f56455f524f4f545f5245564f4b4552000000000000604082015260600190565b6020808252601c908201527f455845435554494f4e5f4e4f545f5945545f45584543555441424c4500000000604082015260600190565b60208082526018908201527f5245564f4b455f4d5553545f42455f5343484544554c45440000000000000000604082015260600190565b6020808252601a908201527f53454e4445525f49535f4e4f545f50454e44494e475f524f4f54000000000000604082015260600190565b6020808252601d908201527f4143434f554e545f4841535f474c4f42414c5f5045524d495353494f4e000000604082015260600190565b6020808252600f908201527f44454c41595f544f4f5f4c415247450000000000000000000000000000000000604082015260600190565b6020808252601a908201527f414354494f4e5f4841535f4e4f5f5245564f4b455f44454c4159000000000000604082015260600190565b60208082526013908201527f5a45524f5f4d41585f53495a455f56414c554500000000000000000000000000604082015260600190565b60208082526016908201527f4143434f554e545f49535f4e4f545f4752414e54455200000000000000000000604082015260600190565b6020808252601a908201527f455845435554494f4e5f414c52454144595f4558454355544544000000000000604082015260600190565b60208082526015908201527f43414e5f4f4e4c595f42455f5343484544554c45440000000000000000000000604082015260600190565b6020808252601a908201527f4143434f554e545f49535f474c4f42414c5f43414e43454c4552000000000000604082015260600190565b60208082526017908201527f4143434f554e545f49535f4e4f545f43414e43454c4552000000000000000000604082015260600190565b60208082526017908201527f4752414e545f4d5553545f42455f5343484544554c4544000000000000000000604082015260600190565b60208082526016908201527f4143434f554e545f49535f4e4f545f5245564f4b455200000000000000000000604082015260600190565b6020808252601b908201527f4143434f554e545f49535f414c52454144595f43414e43454c45520000000000604082015260600190565b6020808252601a908201527f43414e4e4f545f52454d4f56455f524f4f545f4752414e544552000000000000604082015260600190565b6020808252601a908201527f4143434f554e545f49535f414c52454144595f5245564f4b4552000000000000604082015260600190565b60208082526016908201527f53454e4445525f49535f4e4f545f43414e43454c455200000000000000000000604082015260600190565b600060208252610a8c6020830184613511565b90815260200190565b60405181810167ffffffffffffffff811182821017156140df57600080fd5b604052919050565b600067ffffffffffffffff8211156140fd578081fd5b50601f01601f191660200190565b60009081526020902090565b60005b8381101561413257818101518382015260200161411a565b83811115614141576000848401525b5050505056fea26469706673582212205cf12e169e848fcf4694b03be8dfccc89f6b956804ba6f76a21ae15949c5e6fd64736f6c6343000701003360a060405234801561001057600080fd5b5060016000553360601b60805260805160601c6104b061003f600039806101c6528061026e52506104b06000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80631cff79cd1461003b578063aaabadc514610173575b600080fd5b6100fe6004803603604081101561005157600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516919081019060408101602082013564010000000081111561008957600080fd5b82018360208201111561009b57600080fd5b803590602001918460018302840111640100000000831117156100bd57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506101a4945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610138578181015183820152602001610120565b50505050905090810190601f1680156101655780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61017b61026c565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b60606101ae610290565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461025257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f53454e4445525f49535f4e4f545f415554484f52495a45520000000000000000604482015290519081900360640190fd5b61025c83836102a9565b9050610266610393565b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6102a26002600054141561019061039a565b6002600055565b6060600060608473ffffffffffffffffffffffffffffffffffffffff16846040518082805190602001908083835b6020831061031457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016102d7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610376576040519150601f19603f3d011682016040523d82523d6000602084013e61037b565b606091505b509150915061038a82826103ac565b95945050505050565b6001600055565b816103a8576103a8816103d2565b5050565b606082156103bb575080610266565b8151156103cb5781518083602001fd5b6102666101ae5b6103fc817f42414c00000000000000000000000000000000000000000000000000000000006103ff565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fdfea264697066735822122045da9e9d3f0030310eec4eeedb7f228cd6aa0355a1cd0901f2b8463c825c4dc964736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106103205760003560e01c80638bd6bbc9116101a7578063c284b6b9116100ee578063e4c00f4f11610097578063f23481e011610071578063f23481e01461065a578063f6ebcbaf14610662578063fe0d94c11461067557610320565b8063e4c00f4f14610614578063f084552214610634578063f0bb94061461064757610320565b8063cc63604a116100c8578063cc63604a146105e6578063d00bef4d146105f9578063e2b4146b1461060157610320565b8063c284b6b9146105b8578063c6192ee3146105c0578063c80c23e1146105d357610320565b80639be2a88411610150578063b1e31aa01161012a578063b1e31aa01461058a578063b3eb281d14610592578063b99db526146105a557610320565b80639be2a88414610551578063a44495d114610564578063a8eae12d1461057757610320565b8063902168121161018157806390216812146105235780639299942e1461053657806399a7f6e21461053e57610320565b80638bd6bbc9146104f55780638cc3d072146105085780638d928af81461051b57610320565b806340e58ee51161026b57806362cde1ba1161021457806372efb120116101ee57806372efb120146104bc578063863bac6b146104cf57806386ff254b146104e257610320565b806362cde1ba1461048157806363cdbf36146104895780636badd2ab1461049c57610320565b80635b78b780116102455780635b78b780146104535780635ca1e16514610466578063608dd7e41461046e57610320565b806340e58ee5146104255780634125ff9014610438578063557a64031461044057610320565b80631b3c85eb116102cd5780633ac5d439116102a75780633ac5d439146103ec5780633bf46797146103ff5780633e1df46d1461041257610320565b80631b3c85eb146103b35780632229edb4146103c65780632e3ed05b146103d957610320565b806314ea35e7116102fe57806314ea35e714610376578063169f14681461037e57806318ef871a1461039e57610320565b806304434606146103255780630df322a61461034e57806310d3ab2c14610361575b600080fd5b6103386103333660046132f6565b610695565b6040516103459190613711565b60405180910390f35b61033861035c366004613177565b6106c2565b61037461036f3660046133be565b6106d6565b005b61037461079b565b61039161038c366004613213565b6107dc565b60405161034591906140b7565b6103a6610a93565b60405161034591906135e4565b6103746103c1366004613177565b610ab7565b6103746103d4366004613319565b610b08565b6103916103e73660046131c6565b610bc0565b6103746103fa366004613319565b610cb9565b61039161040d3660046132c6565b610d3f565b6103386104203660046132f6565b610d51565b6103746104333660046132c6565b610dc3565b610391610f0a565b61033861044e366004613177565b610f12565b610391610461366004613356565b610f26565b6103a6611079565b61039161047c3660046133df565b611088565b6103a66111b8565b6103916104973660046133df565b6111dc565b6104af6104aa3660046132c6565b61130c565b60405161034591906140a4565b6103746104ca3660046132f6565b611494565b6103916104dd366004613356565b6115be565b6103386104f0366004613319565b6116e7565b6103916105033660046132c6565b61171a565b610374610516366004613319565b61172c565b6103a6611836565b610374610531366004613192565b61185a565b6103916111b8565b61037461054c3660046132f6565b6119a0565b61033861055f366004613319565b6119af565b610374610572366004613192565b611a66565b610374610585366004613319565b611b0f565b610391611c6e565b6103386105a0366004613319565b611c75565b6103916105b33660046132c6565b611d05565b610391611d17565b6103386105ce366004613192565b611d3b565b6103746105e13660046133be565b611dba565b6103386105f43660046132c6565b611e6a565b6103a6611ee3565b61033861060f366004613319565b611ef2565b610627610622366004613496565b611f7a565b6040516103459190613693565b6103916106423660046133df565b61237e565b6103746106553660046133be565b6124ae565b610391612623565b6103746106703660046132f6565b612629565b6106886106833660046132c6565b612658565b6040516103459190613776565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff165b92915050565b6001546001600160a01b0390811691161490565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107275760405162461bcd60e51b815260040161071e90613eb5565b60405180910390fd5b61073081612886565b61074c5760405162461bcd60e51b815260040161071e9061398d565b600082815260076020526040908190208290555182907f6922a4f4deeb55fdca50df28a72475aa87f9f1377ed93a95842ce8bc69dc01e89061078f9084906140b7565b60405180910390a25050565b6001546001600160a01b03163381146107c65760405162461bcd60e51b815260040161071e90613d34565b6107cf81612961565b6107d960006129c1565b50565b60006001600160a01b0384163014156108075760405162461bcd60e51b815260040161071e906138c2565b61080f610a93565b6001600160a01b0316846001600160a01b031614156108405760405162461bcd60e51b815260040161071e90613789565b6004835110156108625760405162461bcd60e51b815260040161071e90613b45565b600060188460038151811061087357fe5b016020015185517fff0000000000000000000000000000000000000000000000000000000000000090911690911c90601090869060029081106108b257fe5b016020015186517fff0000000000000000000000000000000000000000000000000000000000000090911690911c90600890879060019081106108f157fe5b016020015187517fff0000000000000000000000000000000000000000000000000000000000000090911690911c90879060009061092b57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191617171790506000856001600160a01b031663851c1bb3836040518263ffffffff1660e01b815260040161098b9190613749565b60206040518083038186803b1580156109a357600080fd5b505afa1580156109b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109db91906132de565b90506109e8813388611ef2565b610a045760405162461bcd60e51b815260040161071e90613b7c565b6000818152600a602052604090205480610a305760405162461bcd60e51b815260040161071e90613bb3565b6000610a3e88888489612a23565b905080837f26ce5ffb7ab1ce72d9ca4a3e4f906d2b99194d6c53dd9832fd7a59d0b2fc6bed60405160405180910390a3610a788133610d51565b610a8657610a868133612d7b565b93505050505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610aff5760405162461bcd60e51b815260040161071e90613eb5565b6107d9816129c1565b610b1133610f12565b610b2d5760405162461bcd60e51b815260040161071e90613c58565b610b38838383611c75565b15610b555760405162461bcd60e51b815260040161071e906139c4565b60008381526003602090815260408083206001600160a01b038087168086529184528285209086168086529352818420805460ff1916600117905590519192909186917f2d106cf4379aad979c25af765e6f7169b732d4c4660e41aa733a150c7fc0a6f791a4505050565b6000610bcb33610f12565b610be75760405162461bcd60e51b815260040161071e90613c58565b6060631b3c85eb60e01b84604051602401610c0291906135e4565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506000610c783083610c72611d17565b87612a23565b905080856001600160a01b03167f7de09ff5f925ca34a396df31b30cdbdd0cd10b88833b4f7334cecc02454c1be760405160405180910390a3949350505050565b600083815260086020526040902054610cf757610cd63382611d3b565b610cf25760405162461bcd60e51b815260040161071e90613c21565b610d2f565b610cff610a93565b6001600160a01b0316336001600160a01b031614610d2f5760405162461bcd60e51b815260040161071e90613cfd565b610d3a838383612e8b565b505050565b6000908152600a602052604090205490565b60008281526005602090815260408083206001600160a01b038516845290915281205460ff1680610db4575060056000610d896111b8565b8152602080820192909252604090810160009081206001600160a01b038616825290925290205460ff165b80610a8c5750610a8c82610f12565b6006548110610de45760405162461bcd60e51b815260040161071e906137e6565b600060068281548110610df357fe5b60009182526020909120600a90910201600281015490915060ff1615610e2b5760405162461bcd60e51b815260040161071e90613e7e565b6002810154610100900460ff1615610e555760405162461bcd60e51b815260040161071e90613ad7565b610e5f8233610d51565b610e7b5760405162461bcd60e51b815260040161071e9061406d565b6002810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790556008810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905542600982015560405182907fe48f88ceada5a6ddb8ded9b5e457cb802e319a647eec8ff1f2a0512c0a741ed990600090a25050565b6303c2670090565b6000546001600160a01b0390811691161490565b6000610f323384611d3b565b610f4e5760405162461bcd60e51b815260040161071e90613c21565b60008581526008602052604090205480610f7a5760405162461bcd60e51b815260040161071e90613dd9565b6060633ac5d43960e01b878787604051602401610f999392919061371c565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050600061100830838588612a23565b9050856001600160a01b0316876001600160a01b0316897f645fdc5699106b1dffda57f54fdcca22ad57d87f0afd651edf857af3bfbd87848460405161104e91906140b7565b60405180910390a46110608133610d51565b61106e5761106e8133612d7b565b979650505050505050565b6000546001600160a01b031690565b600061109333610f12565b6110af5760405162461bcd60e51b815260040161071e90613c58565b6110b7610f0a565b8311156110d65760405162461bcd60e51b815260040161071e90613da2565b6000848152600860205260408120546110ef9085612f9f565b9050606063c80c23e160e01b868660405160240161110e92919061373b565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050600061117d30838588612a23565b90508086887f2f330faf5e23fc7ff1c46f2b1a3299d86249055a5bf74a8b747ab7fb66f6dc9f60405160405180910390a49695505050505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b60006111e733610f12565b6112035760405162461bcd60e51b815260040161071e90613c58565b61120b610f0a565b83111561122a5760405162461bcd60e51b815260040161071e90613da2565b6000848152600760205260408120546112439085612f9f565b905060606310d3ab2c60e01b868660405160240161126292919061373b565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905060006112d130838588612a23565b90508086887f3d8c3ad02346a1ddf099dd26578662fb8cf85903168ebfeb1f14473fed8ee48860405160405180910390a49695505050505050565b611314612fe0565b6006828154811061132157fe5b60009182526020918290206040805161018081018252600a90930290910180546001600160a01b03168352600180820180548451601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95841615610100029590950190921693909304908101879004870283018701909452838252939491938583019391929091908301828280156113fd5780601f106113d2576101008083540402835291602001916113fd565b820191906000526020600020905b8154815290600101906020018083116113e057829003601f168201915b5050509183525050600282015460ff808216151560208401526101008083048216151560408501526201000090920416151560608301526003830154608083015260048301546001600160a01b0390811660a0840152600584015460c08401526006840154811660e08401526007840154918301919091526008830154166101208201526009909101546101409091015292915050565b61149d33610f12565b6114b95760405162461bcd60e51b815260040161071e90613c58565b6114c281610f12565b156114df5760405162461bcd60e51b815260040161071e9061381d565b6114e98282610d51565b6115055760405162461bcd60e51b815260040161071e90613f23565b600560006115116111b8565b8152602080820192909252604090810160009081206001600160a01b038516825290925290205460ff1615611566576115486111b8565b82146115665760405162461bcd60e51b815260040161071e90613eec565b60008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551909184917fd6b522eb4b505a0843020e304ba27d827b52c89347e6176b2f2737e6e4015c2d9190a35050565b60006115cb853385611c75565b6115e75760405162461bcd60e51b815260040161071e9061391f565b600085815260076020526040902054806116135760405162461bcd60e51b815260040161071e90613aa0565b6060638cc3d07260e01b8787876040516024016116329392919061371c565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905060006116a130838588612a23565b9050856001600160a01b0316876001600160a01b0316897f185f04ff33c89687859342776c7fdcf04d9eb9444d65192bfebab5a5ac9874a88460405161104e91906140b7565b60009283526009602090815260408085206001600160a01b03948516865282528085209290931684525290205460ff1690565b60009081526007602052604090205490565b60008381526007602052604090205461176b5761174a833383611c75565b6117665760405162461bcd60e51b815260040161071e9061391f565b6117a3565b611773610a93565b6001600160a01b0316336001600160a01b0316146117a35760405162461bcd60e51b815260040161071e90613f5a565b6117ae838383611ef2565b156117cb5760405162461bcd60e51b815260040161071e9061388b565b60008381526009602090815260408083206001600160a01b038087168086529184528285209086168086529352818420805460ff1916600117905590519192909186917fef6ee312a0062a24a46be2eba5284183a87ff848110e8d4df979bd690d9e9f6891a4505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b61186333610f12565b61187f5760405162461bcd60e51b815260040161071e90613c58565b6118898282611d3b565b6118a55760405162461bcd60e51b815260040161071e90613f91565b6118ae82610f12565b156118cb5760405162461bcd60e51b815260040161071e90613c8f565b6001600160a01b0382166000908152600460205260408120906118ec6111b8565b6001600160a01b0316815260208101919091526040016000205460ff1615611946576119166111b8565b6001600160a01b0316816001600160a01b0316146119465760405162461bcd60e51b815260040161071e90613bea565b6001600160a01b03808316600081815260046020908152604080832094861680845294909152808220805460ff19169055517fb6fe3ab11eb9ab1d9f1d41c8f42a5d72d10122099ba1548e4a6d1a4d8cefec4b9190a35050565b6119ab823383612e8b565b5050565b6000336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415611a1e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316149050610a8c565b6000848152600a602052604090205415611a5357611a3a610a93565b6001600160a01b0316836001600160a01b031614611a5e565b611a5e848484611ef2565b949350505050565b611a6f33610f12565b611a8b5760405162461bcd60e51b815260040161071e90613c58565b611a958282611d3b565b15611ab25760405162461bcd60e51b815260040161071e90614036565b6001600160a01b03808316600081815260046020908152604080832094861680845294909152808220805460ff19166001179055517f2b5f18afd9a7b21f41bf023b012b3d4c8a22a21b79fa425cd4494ecbe29701969190a35050565b611b1833610f12565b611b345760405162461bcd60e51b815260040161071e90613c58565b611b3f838383611c75565b611b5b5760405162461bcd60e51b815260040161071e90613e47565b611b6482610f12565b15611b815760405162461bcd60e51b815260040161071e90613fff565b60008381526003602090815260408083206001600160a01b0386168452909152812090611bac6111b8565b6001600160a01b0316815260208101919091526040016000205460ff1615611c0657611bd66111b8565b6001600160a01b0316816001600160a01b031614611c065760405162461bcd60e51b815260040161071e90613854565b60008381526003602090815260408083206001600160a01b038087168086529184528285209086168086529352818420805460ff1916905590519192909186917ff8034293d5b4ed16b867ded8f122c475bc0d1b6bd9309a606609a754e5f3adc391a4505050565b6206978090565b60008381526003602090815260408083206001600160a01b038087168552908352818420908516845290915281205460ff1680611cf6575060008481526003602090815260408083206001600160a01b0387168452909152812090611cd86111b8565b6001600160a01b0316815260208101919091526040016000205460ff165b80611a5e5750611a5e83610f12565b60009081526008602052604090205490565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b03808316600090815260046020908152604080832093851683529290529081205460ff1680611dab57506001600160a01b038316600090815260046020526040812090611d8d6111b8565b6001600160a01b0316815260208101919091526040016000205460ff165b80610a8c5750610a8c83610f12565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611e025760405162461bcd60e51b815260040161071e90613eb5565b611e0b81612886565b611e275760405162461bcd60e51b815260040161071e9061398d565b600082815260086020526040908190208290555182907f6aeebd84e31437f28a17927609991676c31c2b84875c601373da2c194e9d23419061078f9084906140b7565b6006546000908210611e8e5760405162461bcd60e51b815260040161071e906137e6565b600060068381548110611e9d57fe5b60009182526020909120600a90910201600281015490915060ff16158015611ecf57506002810154610100900460ff16155b8015610a8c57506003015442101592915050565b6001546001600160a01b031690565b60008381526009602090815260408083206001600160a01b038087168552908352818420908516845290915281205460ff1680611a5e575060008481526009602090815260408083206001600160a01b0387168452909152812090611f556111b8565b6001600160a01b0316815260208101919091526040016000205460ff16949350505050565b6006546060908410611f9e5760405162461bcd60e51b815260040161071e90613a69565b60008311611fbe5760405162461bcd60e51b815260040161071e90613e10565b6006548490036000611fd08286612fc8565b905060608167ffffffffffffffff81118015611feb57600080fd5b5060405190808252806020026020018201604052801561202557816020015b612012612fe0565b81526020019060019003908161200a5790505b50905060005b8281101561237357856121d25760068189018154811061204757fe5b60009182526020918290206040805161018081018252600a90930290910180546001600160a01b03168352600180820180548451601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95841615610100029590950190921693909304908101879004870283018701909452838252939491938583019391929091908301828280156121235780601f106120f857610100808354040283529160200191612123565b820191906000526020600020905b81548152906001019060200180831161210657829003601f168201915b5050509183525050600282015460ff808216151560208401526101008083048216151560408501526201000090920416151560608301526003830154608083015260048301546001600160a01b0390811660a0840152600584015460c08401526006840154811660e08401526007840154918301919091526008830154166101208201526009909101546101409091015282518390839081106121c257fe5b602002602001018190525061236b565b6006816001860303815481106121e457fe5b60009182526020918290206040805161018081018252600a90930290910180546001600160a01b03168352600180820180548451601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95841615610100029590950190921693909304908101879004870283018701909452838252939491938583019391929091908301828280156122c05780601f10612295576101008083540402835291602001916122c0565b820191906000526020600020905b8154815290600101906020018083116122a357829003601f168201915b5050509183525050600282015460ff808216151560208401526101008083048216151560408501526201000090920416151560608301526003830154608083015260048301546001600160a01b0390811660a0840152600584015460c08401526006840154811660e084015260078401549183019190915260088301541661012082015260099091015461014090910152825183908390811061235f57fe5b60200260200101819052505b60010161202b565b509695505050505050565b600061238933610f12565b6123a55760405162461bcd60e51b815260040161071e90613c58565b6123ad610f0a565b8311156123cc5760405162461bcd60e51b815260040161071e90613da2565b6000848152600a60205260408120546123e59085612f9f565b9050606063f0bb940660e01b868660405160240161240492919061373b565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050600061247330838588612a23565b90508086887fbc72942fa810fe8985041bb36295502eddf2c163774be55e25d205958956072860405160405180910390a49695505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146124f65760405162461bcd60e51b815260040161071e90613eb5565b6124fe611836565b6040517f851c1bb30000000000000000000000000000000000000000000000000000000081526001600160a01b03919091169063851c1bb390612565907f058a628f0000000000000000000000000000000000000000000000000000000090600401613749565b60206040518083038186803b15801561257d57600080fd5b505afa158015612591573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b591906132de565b82146125e0576125c481612886565b6125e05760405162461bcd60e51b815260040161071e9061398d565b6000828152600a6020526040908190208290555182907f0e182617f9e5f9ce5f761c791ec15ad52176d97f9706b5c2707ffda7b6bdf7909061078f9084906140b7565b60065490565b61263233610f12565b61264e5760405162461bcd60e51b815260040161071e90613c58565b6119ab8282612d7b565b600654606090821061267c5760405162461bcd60e51b815260040161071e906137e6565b60006006838154811061268b57fe5b60009182526020909120600a90910201600281015490915060ff16156126c35760405162461bcd60e51b815260040161071e90613e7e565b6002810154610100900460ff16156126ed5760405162461bcd60e51b815260040161071e90613ad7565b80600301544210156127115760405162461bcd60e51b815260040161071e90613cc6565b600281015462010000900460ff161561274a5761272e8333610695565b61274a5760405162461bcd60e51b815260040161071e90613956565b60028101805460ff191660019081179091556006820180547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905542600783015581546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811693631cff79cd936127fc93921691908601906004016135f8565b600060405180830381600087803b15801561281657600080fd5b505af115801561282a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128529190810190613423565b60405190925083907f4fa5548c15e2d4a0b806eee962935acea143d79644d2340af39f4edf13b335a990600090a250919050565b600080612891611836565b6040517f851c1bb30000000000000000000000000000000000000000000000000000000081526001600160a01b03919091169063851c1bb3906128f8907f058a628f0000000000000000000000000000000000000000000000000000000090600401613749565b60206040518083038186803b15801561291057600080fd5b505afa158015612924573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294891906132de565b6000908152600a60205260409020549092111592915050565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038316908117825560405190917f39510b933a9d010f906528d6019d3f4e2450a10dc33b10887503b31ed82f111191a250565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f566fe119ff450afc2580186c62762b6c1258245c8b1b6bb095e7276eb5a75b5590600090a250565b60068054825160408051610180810182526001600160a01b03898116825260208083018a815260009484018590526060840185905294151560808401819052428a810160a086018190523360c087015260e086019190915261010085018690526101208501869052610140850186905261016085018690526001880189559790945282517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f600a880290810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169290941691909117835594518051969796949593949293612b3d937ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40909101929190910190613045565b5060408201516002820180546060850151608086015160ff19909216931515939093177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101009315158402177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16620100009115159190910217905560a0830151600383015560c08301516004830180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b039384161790915560e08501516005850155918401516006840180548416918316919091179055610120840151600784015561014084015160088401805490931691161790556101609091015160099091015560005b8451811015612d7057600260008581526020019081526020016000206000868381518110612c7b57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615612cbf5760405162461bcd60e51b815260040161071e90613a32565b6000848152600260205260408120865160019290889085908110612cdf57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550848181518110612d2a57fe5b60200260200101516001600160a01b0316847f2d0aa562da96ca6dd124fee5588e6f8545b0aa0b15cfd87cc231eff1ae7000e460405160405180910390a3600101612c51565b505050949350505050565b612d858282610d51565b15612da25760405162461bcd60e51b815260040161071e90613fc8565b612daa6111b8565b8214612e30576006548210612dd15760405162461bcd60e51b815260040161071e906137e6565b600060068381548110612de057fe5b60009182526020909120600a90910201600281015490915060ff16158015612e1257506002810154610100900460ff16155b612e2e5760405162461bcd60e51b815260040161071e90613b0e565b505b60008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551909184917f1b55562f9a67454174f758170aba47751c0af4c1f3b7d4e0b70667f1e82066069190a35050565b612e96838383611ef2565b612eb25760405162461bcd60e51b815260040161071e906139fb565b60008381526009602090815260408083206001600160a01b0386168452909152812090612edd6111b8565b6001600160a01b0316815260208101919091526040016000205460ff1615612f3757612f076111b8565b6001600160a01b0316816001600160a01b031614612f375760405162461bcd60e51b815260040161071e90613d6b565b60008381526009602090815260408083206001600160a01b038087168086529184528285209086168086529352818420805460ff1916905590519192909186917f7b42e026d3b17cf41399915c285780d0f724b3464b269297aff73c0de0fe417f91a4505050565b6000828210612fb557612fb0611c6e565b610a8c565b610a8c828403612fc3611c6e565b612fd4565b80820390821102900390565b80820390821002900390565b604080516101808101825260008082526060602083018190529282018190529181018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101829052610140810182905261016081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061308657805160ff19168380011785556130b3565b828001600101855582156130b3579182015b828111156130b3578251825591602001919060010190613098565b506130bf9291506130c3565b5090565b5b808211156130bf57600081556001016130c4565b80356001600160a01b03811681146106bc57600080fd5b600082601f8301126130ff578081fd5b813567ffffffffffffffff811115613115578182fd5b60208082026131258282016140c0565b8381529350818401858301828701840188101561314157600080fd5b600092505b8483101561316c5761315888826130d8565b825260019290920191908301908301613146565b505050505092915050565b600060208284031215613188578081fd5b610a8c83836130d8565b600080604083850312156131a4578081fd5b6131ae84846130d8565b91506131bd84602085016130d8565b90509250929050565b600080604083850312156131d8578182fd5b6131e284846130d8565b9150602083013567ffffffffffffffff8111156131fd578182fd5b613209858286016130ef565b9150509250929050565b600080600060608486031215613227578081fd5b61323185856130d8565b9250602084013567ffffffffffffffff8082111561324d578283fd5b818601915086601f830112613260578283fd5b813561327361326e826140e7565b6140c0565b818152886020838601011115613287578485fd5b81602085016020830137908101602001849052935060408601359150808211156132af578283fd5b506132bc868287016130ef565b9150509250925092565b6000602082840312156132d7578081fd5b5035919050565b6000602082840312156132ef578081fd5b5051919050565b60008060408385031215613308578182fd5b823591506131bd84602085016130d8565b60008060006060848603121561332d578283fd5b8335925061333e85602086016130d8565b915061334d85604086016130d8565b90509250925092565b6000806000806080858703121561336b578081fd5b8435935061337c86602087016130d8565b925061338b86604087016130d8565b9150606085013567ffffffffffffffff8111156133a6578182fd5b6133b2878288016130ef565b91505092959194509250565b600080604083850312156133d0578182fd5b50508035926020909101359150565b6000806000606084860312156133f3578283fd5b8335925060208401359150604084013567ffffffffffffffff811115613417578182fd5b6132bc868287016130ef565b600060208284031215613434578081fd5b815167ffffffffffffffff81111561344a578182fd5b8201601f8101841361345a578182fd5b805161346861326e826140e7565b81815285602083850101111561347c578384fd5b61348d826020830160208601614117565b95945050505050565b6000806000606084860312156134aa578081fd5b8335925060208401359150604084013580151581146134c7578182fd5b809150509250925092565b6001600160a01b03169052565b15159052565b600081518084526134fd816020860160208601614117565b601f01601f19169290920160200192915050565b60006101806135218484516134d2565b6020830151816020860152613538828601826134e5565b915050604083015161354d60408601826134df565b50606083015161356060608601826134df565b50608083015161357360808601826134df565b5060a083015160a085015260c083015161359060c08601826134d2565b5060e083015160e0850152610100808401516135ae828701826134d2565b50506101208381015190850152610140808401516135ce828701826134d2565b5050610160928301519390920192909252919050565b6001600160a01b0391909116815260200190565b6000604082016001600160a01b0385168352602060408185015282855460018082166000811461362f576001811461364d57613685565b607f6002840416865260ff1983166060890152608088019350613685565b6002830480875261365d8a61410b565b885b8281101561367b5781548b82016060015290840190870161365f565b8a01606001955050505b509198975050505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015613704577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526136f2858351613511565b945092850192908501906001016136b8565b5092979650505050505050565b901515815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b918252602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b600060208252610a8c60208301846134e5565b60208082526026908201527f415454454d5054494e475f455845435554494f4e5f48454c5045525f5245454e60408201527f5452414e43590000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f455845435554494f4e5f444f45535f4e4f545f45584953540000000000000000604082015260600190565b6020808252601b908201527f43414e4e4f545f52454d4f56455f524f4f545f43414e43454c45520000000000604082015260600190565b60208082526011908201527f4752414e5445525f49535f474c4f42414c000000000000000000000000000000604082015260600190565b6020808252601a908201527f5045524d495353494f4e5f414c52454144595f4752414e544544000000000000604082015260600190565b60208082526022908201527f43414e4e4f545f5343484544554c455f415554484f52495a45525f414354494f60408201527f4e53000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526015908201527f53454e4445525f49535f4e4f545f4752414e5445520000000000000000000000604082015260600190565b60208082526016908201527f53454e4445525f49535f4e4f545f4558454355544f5200000000000000000000604082015260600190565b6020808252601c908201527f44454c41595f455843454544535f5345545f415554484f52495a455200000000604082015260600190565b6020808252601a908201527f4143434f554e545f49535f414c52454144595f4752414e544552000000000000604082015260600190565b60208082526016908201527f5045524d495353494f4e5f4e4f545f4752414e54454400000000000000000000604082015260600190565b60208082526013908201527f4455504c49434154455f4558454355544f525300000000000000000000000000604082015260600190565b60208082526014908201527f534b49505f56414c55455f544f4f5f4c41524745000000000000000000000000604082015260600190565b60208082526019908201527f414354494f4e5f4841535f4e4f5f4752414e545f44454c415900000000000000604082015260600190565b6020808252601a908201527f455845435554494f4e5f414c52454144595f43414e43454c4544000000000000604082015260600190565b60208082526018908201527f455845435554494f4e5f49535f4e4f545f50454e44494e470000000000000000604082015260600190565b6020808252600e908201527f444154415f544f4f5f53484f5254000000000000000000000000000000000000604082015260600190565b6020808252601f908201527f53454e4445525f444f45535f4e4f545f484156455f5045524d495353494f4e00604082015260600190565b60208082526010908201527f44454c41595f49535f4e4f545f53455400000000000000000000000000000000604082015260600190565b60208082526011908201527f5245564f4b45525f49535f474c4f42414c000000000000000000000000000000604082015260600190565b60208082526015908201527f53454e4445525f49535f4e4f545f5245564f4b45520000000000000000000000604082015260600190565b60208082526012908201527f53454e4445525f49535f4e4f545f524f4f540000000000000000000000000000604082015260600190565b6020808252601a908201527f43414e4e4f545f52454d4f56455f524f4f545f5245564f4b4552000000000000604082015260600190565b6020808252601c908201527f455845435554494f4e5f4e4f545f5945545f45584543555441424c4500000000604082015260600190565b60208082526018908201527f5245564f4b455f4d5553545f42455f5343484544554c45440000000000000000604082015260600190565b6020808252601a908201527f53454e4445525f49535f4e4f545f50454e44494e475f524f4f54000000000000604082015260600190565b6020808252601d908201527f4143434f554e545f4841535f474c4f42414c5f5045524d495353494f4e000000604082015260600190565b6020808252600f908201527f44454c41595f544f4f5f4c415247450000000000000000000000000000000000604082015260600190565b6020808252601a908201527f414354494f4e5f4841535f4e4f5f5245564f4b455f44454c4159000000000000604082015260600190565b60208082526013908201527f5a45524f5f4d41585f53495a455f56414c554500000000000000000000000000604082015260600190565b60208082526016908201527f4143434f554e545f49535f4e4f545f4752414e54455200000000000000000000604082015260600190565b6020808252601a908201527f455845435554494f4e5f414c52454144595f4558454355544544000000000000604082015260600190565b60208082526015908201527f43414e5f4f4e4c595f42455f5343484544554c45440000000000000000000000604082015260600190565b6020808252601a908201527f4143434f554e545f49535f474c4f42414c5f43414e43454c4552000000000000604082015260600190565b60208082526017908201527f4143434f554e545f49535f4e4f545f43414e43454c4552000000000000000000604082015260600190565b60208082526017908201527f4752414e545f4d5553545f42455f5343484544554c4544000000000000000000604082015260600190565b60208082526016908201527f4143434f554e545f49535f4e4f545f5245564f4b455200000000000000000000604082015260600190565b6020808252601b908201527f4143434f554e545f49535f414c52454144595f43414e43454c45520000000000604082015260600190565b6020808252601a908201527f43414e4e4f545f52454d4f56455f524f4f545f4752414e544552000000000000604082015260600190565b6020808252601a908201527f4143434f554e545f49535f414c52454144595f5245564f4b4552000000000000604082015260600190565b60208082526016908201527f53454e4445525f49535f4e4f545f43414e43454c455200000000000000000000604082015260600190565b600060208252610a8c6020830184613511565b90815260200190565b60405181810167ffffffffffffffff811182821017156140df57600080fd5b604052919050565b600067ffffffffffffffff8211156140fd578081fd5b50601f01601f191660200190565b60009081526020902090565b60005b8381101561413257818101518382015260200161411a565b83811115614141576000848401525b5050505056fea26469706673582212205cf12e169e848fcf4694b03be8dfccc89f6b956804ba6f76a21ae15949c5e6fd64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/artifact/TimelockAuthorizerMigrator.json b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/artifact/TimelockAuthorizerMigrator.json new file mode 100644 index 0000000..cba7e53 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/artifact/TimelockAuthorizerMigrator.json @@ -0,0 +1,255 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TimelockAuthorizerMigrator", + "sourceName": "contracts/TimelockAuthorizerMigrator.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_root", + "type": "address" + }, + { + "internalType": "contract IBasicAuthorizer", + "name": "_oldAuthorizer", + "type": "address" + }, + { + "internalType": "contract IAuthorizerAdaptorEntrypoint", + "name": "_authorizerAdaptorEntrypoint", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_changeRootDelay", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "grantee", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "internalType": "struct TimelockAuthorizerMigrator.RoleData[]", + "name": "_rolesData", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "address", + "name": "grantee", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "internalType": "struct TimelockAuthorizerMigrator.RoleData[]", + "name": "_grantersData", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "address", + "name": "grantee", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "internalType": "struct TimelockAuthorizerMigrator.RoleData[]", + "name": "_revokersData", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "newDelay", + "type": "uint256" + } + ], + "internalType": "struct TimelockAuthorizerMigrator.DelayData[]", + "name": "_executeDelaysData", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "newDelay", + "type": "uint256" + } + ], + "internalType": "struct TimelockAuthorizerMigrator.DelayData[]", + "name": "_grantDelaysData", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EVERYWHERE", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "GENERAL_PERMISSION_SPECIFIER", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "changeRootDelay", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "executeDelays", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "finalizeMigration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "newAuthorizer", + "outputs": [ + { + "internalType": "contract TimelockAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "oldAuthorizer", + "outputs": [ + { + "internalType": "contract IBasicAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "root", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "vault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101206040523480156200001257600080fd5b5060405162005eaa38038062005eaa833981016040819052620000359162000844565b6000308a89896040516200004990620006ba565b620000589493929190620009e0565b604051809103906000f08015801562000075573d6000803e3d6000fd5b506001600160601b0319606082811b821660e0528b901b1660c052604080516311b2515f60e31b815290519192506001600160a01b038a1691638d928af891600480820192602092909190829003018186803b158015620000d557600080fd5b505afa158015620000ea573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200011091906200098e565b6001600160601b0319606091821b8116608052908b901b1660a05261010087905260005b8651811015620002985762000148620006c8565b8782815181106200015557fe5b602002602001015190508a6001600160a01b0316639be2a8848260200151836000015184604001516040518463ffffffff1660e01b81526004016200019d9392919062000a0a565b60206040518083038186803b158015620001b657600080fd5b505afa158015620001cb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f1919062000965565b620002195760405162461bcd60e51b8152600401620002109062000a88565b60405180910390fd5b602081015181516040808401519051634661e83960e11b81526001600160a01b03871693638cc3d072936200025693919290919060040162000a0a565b600060405180830381600087803b1580156200027157600080fd5b505af115801562000286573d6000803e3d6000fd5b50506001909301925062000134915050565b5060005b85518110156200036157816001600160a01b0316632229edb4878381518110620002c257fe5b602002602001015160200151888481518110620002db57fe5b602002602001015160000151898581518110620002f457fe5b6020026020010151604001516040518463ffffffff1660e01b8152600401620003209392919062000a0a565b600060405180830381600087803b1580156200033b57600080fd5b505af115801562000350573d6000803e3d6000fd5b5050600190920191506200029c9050565b5060005b84518110156200041057816001600160a01b031663a44495d18683815181106200038b57fe5b602002602001015160000151878481518110620003a457fe5b6020026020010151604001516040518363ffffffff1660e01b8152600401620003cf929190620009c6565b600060405180830381600087803b158015620003ea57600080fd5b505af1158015620003ff573d6000803e3d6000fd5b505060019092019150620003659050565b506000805b8451811015620005305762278d008582815181106200043057fe5b60200260200101516020015111156200045d5760405162461bcd60e51b8152600401620002109062000ab1565b826001600160a01b031663f08455228683815181106200047957fe5b6020026020010151600001518784815181106200049257fe5b602002602001015160200151620004af306200066460201b60201c565b6040518463ffffffff1660e01b8152600401620004cf9392919062000a29565b602060405180830381600087803b158015620004ea57600080fd5b505af1158015620004ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005259190620009ad565b915060010162000415565b5060005b83518110156200064f5762278d008482815181106200054f57fe5b60200260200101516020015111156200057c5760405162461bcd60e51b8152600401620002109062000ab1565b826001600160a01b03166363cdbf368583815181106200059857fe5b602002602001015160000151868481518110620005b157fe5b602002602001015160200151620005ce306200066460201b60201c565b6040518463ffffffff1660e01b8152600401620005ee9392919062000a29565b602060405180830381600087803b1580156200060957600080fd5b505af11580156200061e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006449190620009ad565b915060010162000534565b506000555062000b4898505050505050505050565b6040805160018082528183019092526060916020808301908036833701905050905081816000815181106200069557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050919050565b6149c480620014e683390190565b604080516060810182526000808252602082018190529181019190915290565b8051620006f58162000b2f565b92915050565b600082601f8301126200070c578081fd5b8151620007236200071d8262000b0f565b62000ae8565b81815291506020808301908481016040808502870183018810156200074757600080fd5b6000805b868110156200078d5782848b03121562000763578182fd5b6200076e8362000ae8565b845181528585015186820152865294840194928201926001016200074b565b5050505050505092915050565b600082601f830112620007ab578081fd5b8151620007bc6200071d8262000b0f565b8181529150602080830190848101606080850287018301881015620007e057600080fd5b6000805b868110156200078d5782848b031215620007fc578182fd5b620008078362000ae8565b620008138b86620006e8565b8152858501518682015260406200082d8c828801620006e8565b9082015286529484019492820192600101620007e4565b60008060008060008060008060006101208a8c03121562000863578485fd5b6200086f8b8b620006e8565b9850620008808b60208c01620006e8565b9750620008918b60408c01620006e8565b60608b015160808c015191985096506001600160401b0380821115620008b5578687fd5b620008c38d838e016200079a565b965060a08c0151915080821115620008d9578586fd5b620008e78d838e016200079a565b955060c08c0151915080821115620008fd578485fd5b6200090b8d838e016200079a565b945060e08c015191508082111562000921578384fd5b6200092f8d838e01620006fb565b93506101008c015191508082111562000946578283fd5b50620009558c828d01620006fb565b9150509295985092959850929598565b60006020828403121562000977578081fd5b8151801515811462000987578182fd5b9392505050565b600060208284031215620009a0578081fd5b8151620009878162000b2f565b600060208284031215620009bf578081fd5b5051919050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b9283526001600160a01b03918216602084015216604082015260600190565b60006060820185835260208581850152606060408501528185518084526080860191508287019350845b8181101562000a7a5784516001600160a01b03168352938301939183019160010162000a53565b509098975050505050505050565b6020808252600f908201526e554e45585045435445445f524f4c4560881b604082015260600190565b60208082526016908201527f554e45585045435445445f4c415247455f44454c415900000000000000000000604082015260600190565b6040518181016001600160401b038111828210171562000b0757600080fd5b604052919050565b60006001600160401b0382111562000b25578081fd5b5060209081020190565b6001600160a01b038116811462000b4557600080fd5b50565b60805160601c60a05160601c60c05160601c60e05160601c6101005161092a62000bbc6000398061013a5250806101a5528061028052806102e452806106215250806104b3528061068152508061031152806106a552508061040852806104f152806105f452806106c9525061092a6000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c8063b78b608711610076578063ebf0c7171161005b578063ebf0c71714610120578063fbfa77cf14610128578063fc78a22814610130576100be565b8063b78b608714610110578063c6bfe9ae14610118576100be565b806362cde1ba116100a757806362cde1ba146100eb578063a0c286d814610100578063a217fddf14610108576100be565b8063064cb76a146100c35780633c44172d146100e1575b600080fd5b6100cb610138565b6040516100d89190610824565b60405180910390f35b6100e961015c565b005b6100f361025a565b6040516100d89190610803565b6100f361027e565b6100cb6102a2565b6100e96102a7565b6100f361067f565b6100f36106a3565b6100f36106c7565b6100cb61025a565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005b6000548111610257576040517ffe0d94c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063fe0d94c1906101da908490600401610824565b600060405180830381600087803b1580156101f457600080fd5b505af1158015610208573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261024e919081019061072a565b5060010161015f565b50565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081565b6040517f557a640300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063557a640390610339907f000000000000000000000000000000000000000000000000000000000000000090600401610803565b60206040518083038186803b15801561035157600080fd5b505afa158015610365573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038991906106eb565b6103c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103bf90610886565b60405180910390fd5b6040517f851c1bb300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063851c1bb39061045d907f058a628f0000000000000000000000000000000000000000000000000000000090600401610859565b60206040518083038186803b15801561047557600080fd5b505afa158015610489573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ad9190610712565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639be2a88483307f00000000000000000000000000000000000000000000000000000000000000006040518463ffffffff1660e01b815260040161052e9392919061082d565b60206040518083038186803b15801561054657600080fd5b505afa15801561055a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057e91906106eb565b9050806105b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103bf906108bd565b6040517f058a628f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063058a628f90610649907f000000000000000000000000000000000000000000000000000000000000000090600401610803565b600060405180830381600087803b15801561066357600080fd5b505af1158015610677573d6000803e3d6000fd5b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000602082840312156106fc578081fd5b8151801515811461070b578182fd5b9392505050565b600060208284031215610723578081fd5b5051919050565b6000602080838503121561073c578182fd5b825167ffffffffffffffff80821115610753578384fd5b818501915085601f830112610766578384fd5b815181811115610774578485fd5b604051847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011682010181811084821117156107b1578687fd5b60405281815283820185018810156107c7578586fd5b8592505b818310156107e857838301850151818401860152918401916107cb565b818311156107f857858583830101525b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b60208082526014908201527f524f4f545f4e4f545f434c41494d45445f594554000000000000000000000000604082015260600190565b6020808252601e908201527f4d49475241544f525f43414e4e4f545f5345545f415554484f52495a4552000060408201526060019056fea2646970667358221220d786552b445783790a6af616b3d19991c5b24d436a9a622b7c1bf1a860cb16b164736f6c634300070100336101206040523480156200001257600080fd5b50604051620049c4380380620049c483398101604081905262000035916200025b565b8383836001600160a01b0316638d928af86040518163ffffffff1660e01b815260040160206040518083038186803b1580156200007157600080fd5b505afa15801562000086573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000ac9190620002b4565b83620000b884620001bb565b620000c38362000203565b6001600160601b0319606083901b1660a052604051620000e3906200024d565b604051809103906000f08015801562000100573d6000803e3d6000fd5b5060601b6001600160601b03191660805260c05250506040805163e758d36b60e01b815290516001600160a01b038516925063e758d36b91600480820192602092909190829003018186803b1580156200015957600080fd5b505afa1580156200016e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001949190620002b4565b6001600160601b0319606091821b81166101005292901b90911660e05250620002f3915050565b600080546001600160a01b0319166001600160a01b038316908117825560405190917f39510b933a9d010f906528d6019d3f4e2450a10dc33b10887503b31ed82f111191a250565b600180546001600160a01b0319166001600160a01b0383169081179091556040517f566fe119ff450afc2580186c62762b6c1258245c8b1b6bb095e7276eb5a75b5590600090a250565b6104ef80620044d583390190565b6000806000806080858703121562000271578384fd5b84516200027e81620002da565b60208601519094506200029181620002da565b6040860151909350620002a481620002da565b6060959095015193969295505050565b600060208284031215620002c6578081fd5b8151620002d381620002da565b9392505050565b6001600160a01b0381168114620002f057600080fd5b50565b60805160601c60a05160601c60c05160e05160601c6101005160601c61417d62000358600039806119bc5250806119e4525080611d195250806118385250806106e15280610a955280610ac25280611dc552806124b952806127b8525061417d6000f3fe608060405234801561001057600080fd5b50600436106103205760003560e01c80638bd6bbc9116101a7578063c284b6b9116100ee578063e4c00f4f11610097578063f23481e011610071578063f23481e01461065a578063f6ebcbaf14610662578063fe0d94c11461067557610320565b8063e4c00f4f14610614578063f084552214610634578063f0bb94061461064757610320565b8063cc63604a116100c8578063cc63604a146105e6578063d00bef4d146105f9578063e2b4146b1461060157610320565b8063c284b6b9146105b8578063c6192ee3146105c0578063c80c23e1146105d357610320565b80639be2a88411610150578063b1e31aa01161012a578063b1e31aa01461058a578063b3eb281d14610592578063b99db526146105a557610320565b80639be2a88414610551578063a44495d114610564578063a8eae12d1461057757610320565b8063902168121161018157806390216812146105235780639299942e1461053657806399a7f6e21461053e57610320565b80638bd6bbc9146104f55780638cc3d072146105085780638d928af81461051b57610320565b806340e58ee51161026b57806362cde1ba1161021457806372efb120116101ee57806372efb120146104bc578063863bac6b146104cf57806386ff254b146104e257610320565b806362cde1ba1461048157806363cdbf36146104895780636badd2ab1461049c57610320565b80635b78b780116102455780635b78b780146104535780635ca1e16514610466578063608dd7e41461046e57610320565b806340e58ee5146104255780634125ff9014610438578063557a64031461044057610320565b80631b3c85eb116102cd5780633ac5d439116102a75780633ac5d439146103ec5780633bf46797146103ff5780633e1df46d1461041257610320565b80631b3c85eb146103b35780632229edb4146103c65780632e3ed05b146103d957610320565b806314ea35e7116102fe57806314ea35e714610376578063169f14681461037e57806318ef871a1461039e57610320565b806304434606146103255780630df322a61461034e57806310d3ab2c14610361575b600080fd5b6103386103333660046132f6565b610695565b6040516103459190613711565b60405180910390f35b61033861035c366004613177565b6106c2565b61037461036f3660046133be565b6106d6565b005b61037461079b565b61039161038c366004613213565b6107dc565b60405161034591906140b7565b6103a6610a93565b60405161034591906135e4565b6103746103c1366004613177565b610ab7565b6103746103d4366004613319565b610b08565b6103916103e73660046131c6565b610bc0565b6103746103fa366004613319565b610cb9565b61039161040d3660046132c6565b610d3f565b6103386104203660046132f6565b610d51565b6103746104333660046132c6565b610dc3565b610391610f0a565b61033861044e366004613177565b610f12565b610391610461366004613356565b610f26565b6103a6611079565b61039161047c3660046133df565b611088565b6103a66111b8565b6103916104973660046133df565b6111dc565b6104af6104aa3660046132c6565b61130c565b60405161034591906140a4565b6103746104ca3660046132f6565b611494565b6103916104dd366004613356565b6115be565b6103386104f0366004613319565b6116e7565b6103916105033660046132c6565b61171a565b610374610516366004613319565b61172c565b6103a6611836565b610374610531366004613192565b61185a565b6103916111b8565b61037461054c3660046132f6565b6119a0565b61033861055f366004613319565b6119af565b610374610572366004613192565b611a66565b610374610585366004613319565b611b0f565b610391611c6e565b6103386105a0366004613319565b611c75565b6103916105b33660046132c6565b611d05565b610391611d17565b6103386105ce366004613192565b611d3b565b6103746105e13660046133be565b611dba565b6103386105f43660046132c6565b611e6a565b6103a6611ee3565b61033861060f366004613319565b611ef2565b610627610622366004613496565b611f7a565b6040516103459190613693565b6103916106423660046133df565b61237e565b6103746106553660046133be565b6124ae565b610391612623565b6103746106703660046132f6565b612629565b6106886106833660046132c6565b612658565b6040516103459190613776565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff165b92915050565b6001546001600160a01b0390811691161490565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107275760405162461bcd60e51b815260040161071e90613eb5565b60405180910390fd5b61073081612886565b61074c5760405162461bcd60e51b815260040161071e9061398d565b600082815260076020526040908190208290555182907f6922a4f4deeb55fdca50df28a72475aa87f9f1377ed93a95842ce8bc69dc01e89061078f9084906140b7565b60405180910390a25050565b6001546001600160a01b03163381146107c65760405162461bcd60e51b815260040161071e90613d34565b6107cf81612961565b6107d960006129c1565b50565b60006001600160a01b0384163014156108075760405162461bcd60e51b815260040161071e906138c2565b61080f610a93565b6001600160a01b0316846001600160a01b031614156108405760405162461bcd60e51b815260040161071e90613789565b6004835110156108625760405162461bcd60e51b815260040161071e90613b45565b600060188460038151811061087357fe5b016020015185517fff0000000000000000000000000000000000000000000000000000000000000090911690911c90601090869060029081106108b257fe5b016020015186517fff0000000000000000000000000000000000000000000000000000000000000090911690911c90600890879060019081106108f157fe5b016020015187517fff0000000000000000000000000000000000000000000000000000000000000090911690911c90879060009061092b57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191617171790506000856001600160a01b031663851c1bb3836040518263ffffffff1660e01b815260040161098b9190613749565b60206040518083038186803b1580156109a357600080fd5b505afa1580156109b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109db91906132de565b90506109e8813388611ef2565b610a045760405162461bcd60e51b815260040161071e90613b7c565b6000818152600a602052604090205480610a305760405162461bcd60e51b815260040161071e90613bb3565b6000610a3e88888489612a23565b905080837f26ce5ffb7ab1ce72d9ca4a3e4f906d2b99194d6c53dd9832fd7a59d0b2fc6bed60405160405180910390a3610a788133610d51565b610a8657610a868133612d7b565b93505050505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610aff5760405162461bcd60e51b815260040161071e90613eb5565b6107d9816129c1565b610b1133610f12565b610b2d5760405162461bcd60e51b815260040161071e90613c58565b610b38838383611c75565b15610b555760405162461bcd60e51b815260040161071e906139c4565b60008381526003602090815260408083206001600160a01b038087168086529184528285209086168086529352818420805460ff1916600117905590519192909186917f2d106cf4379aad979c25af765e6f7169b732d4c4660e41aa733a150c7fc0a6f791a4505050565b6000610bcb33610f12565b610be75760405162461bcd60e51b815260040161071e90613c58565b6060631b3c85eb60e01b84604051602401610c0291906135e4565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506000610c783083610c72611d17565b87612a23565b905080856001600160a01b03167f7de09ff5f925ca34a396df31b30cdbdd0cd10b88833b4f7334cecc02454c1be760405160405180910390a3949350505050565b600083815260086020526040902054610cf757610cd63382611d3b565b610cf25760405162461bcd60e51b815260040161071e90613c21565b610d2f565b610cff610a93565b6001600160a01b0316336001600160a01b031614610d2f5760405162461bcd60e51b815260040161071e90613cfd565b610d3a838383612e8b565b505050565b6000908152600a602052604090205490565b60008281526005602090815260408083206001600160a01b038516845290915281205460ff1680610db4575060056000610d896111b8565b8152602080820192909252604090810160009081206001600160a01b038616825290925290205460ff165b80610a8c5750610a8c82610f12565b6006548110610de45760405162461bcd60e51b815260040161071e906137e6565b600060068281548110610df357fe5b60009182526020909120600a90910201600281015490915060ff1615610e2b5760405162461bcd60e51b815260040161071e90613e7e565b6002810154610100900460ff1615610e555760405162461bcd60e51b815260040161071e90613ad7565b610e5f8233610d51565b610e7b5760405162461bcd60e51b815260040161071e9061406d565b6002810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790556008810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905542600982015560405182907fe48f88ceada5a6ddb8ded9b5e457cb802e319a647eec8ff1f2a0512c0a741ed990600090a25050565b6303c2670090565b6000546001600160a01b0390811691161490565b6000610f323384611d3b565b610f4e5760405162461bcd60e51b815260040161071e90613c21565b60008581526008602052604090205480610f7a5760405162461bcd60e51b815260040161071e90613dd9565b6060633ac5d43960e01b878787604051602401610f999392919061371c565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050600061100830838588612a23565b9050856001600160a01b0316876001600160a01b0316897f645fdc5699106b1dffda57f54fdcca22ad57d87f0afd651edf857af3bfbd87848460405161104e91906140b7565b60405180910390a46110608133610d51565b61106e5761106e8133612d7b565b979650505050505050565b6000546001600160a01b031690565b600061109333610f12565b6110af5760405162461bcd60e51b815260040161071e90613c58565b6110b7610f0a565b8311156110d65760405162461bcd60e51b815260040161071e90613da2565b6000848152600860205260408120546110ef9085612f9f565b9050606063c80c23e160e01b868660405160240161110e92919061373b565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050600061117d30838588612a23565b90508086887f2f330faf5e23fc7ff1c46f2b1a3299d86249055a5bf74a8b747ab7fb66f6dc9f60405160405180910390a49695505050505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b60006111e733610f12565b6112035760405162461bcd60e51b815260040161071e90613c58565b61120b610f0a565b83111561122a5760405162461bcd60e51b815260040161071e90613da2565b6000848152600760205260408120546112439085612f9f565b905060606310d3ab2c60e01b868660405160240161126292919061373b565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905060006112d130838588612a23565b90508086887f3d8c3ad02346a1ddf099dd26578662fb8cf85903168ebfeb1f14473fed8ee48860405160405180910390a49695505050505050565b611314612fe0565b6006828154811061132157fe5b60009182526020918290206040805161018081018252600a90930290910180546001600160a01b03168352600180820180548451601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95841615610100029590950190921693909304908101879004870283018701909452838252939491938583019391929091908301828280156113fd5780601f106113d2576101008083540402835291602001916113fd565b820191906000526020600020905b8154815290600101906020018083116113e057829003601f168201915b5050509183525050600282015460ff808216151560208401526101008083048216151560408501526201000090920416151560608301526003830154608083015260048301546001600160a01b0390811660a0840152600584015460c08401526006840154811660e08401526007840154918301919091526008830154166101208201526009909101546101409091015292915050565b61149d33610f12565b6114b95760405162461bcd60e51b815260040161071e90613c58565b6114c281610f12565b156114df5760405162461bcd60e51b815260040161071e9061381d565b6114e98282610d51565b6115055760405162461bcd60e51b815260040161071e90613f23565b600560006115116111b8565b8152602080820192909252604090810160009081206001600160a01b038516825290925290205460ff1615611566576115486111b8565b82146115665760405162461bcd60e51b815260040161071e90613eec565b60008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551909184917fd6b522eb4b505a0843020e304ba27d827b52c89347e6176b2f2737e6e4015c2d9190a35050565b60006115cb853385611c75565b6115e75760405162461bcd60e51b815260040161071e9061391f565b600085815260076020526040902054806116135760405162461bcd60e51b815260040161071e90613aa0565b6060638cc3d07260e01b8787876040516024016116329392919061371c565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905060006116a130838588612a23565b9050856001600160a01b0316876001600160a01b0316897f185f04ff33c89687859342776c7fdcf04d9eb9444d65192bfebab5a5ac9874a88460405161104e91906140b7565b60009283526009602090815260408085206001600160a01b03948516865282528085209290931684525290205460ff1690565b60009081526007602052604090205490565b60008381526007602052604090205461176b5761174a833383611c75565b6117665760405162461bcd60e51b815260040161071e9061391f565b6117a3565b611773610a93565b6001600160a01b0316336001600160a01b0316146117a35760405162461bcd60e51b815260040161071e90613f5a565b6117ae838383611ef2565b156117cb5760405162461bcd60e51b815260040161071e9061388b565b60008381526009602090815260408083206001600160a01b038087168086529184528285209086168086529352818420805460ff1916600117905590519192909186917fef6ee312a0062a24a46be2eba5284183a87ff848110e8d4df979bd690d9e9f6891a4505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b61186333610f12565b61187f5760405162461bcd60e51b815260040161071e90613c58565b6118898282611d3b565b6118a55760405162461bcd60e51b815260040161071e90613f91565b6118ae82610f12565b156118cb5760405162461bcd60e51b815260040161071e90613c8f565b6001600160a01b0382166000908152600460205260408120906118ec6111b8565b6001600160a01b0316815260208101919091526040016000205460ff1615611946576119166111b8565b6001600160a01b0316816001600160a01b0316146119465760405162461bcd60e51b815260040161071e90613bea565b6001600160a01b03808316600081815260046020908152604080832094861680845294909152808220805460ff19169055517fb6fe3ab11eb9ab1d9f1d41c8f42a5d72d10122099ba1548e4a6d1a4d8cefec4b9190a35050565b6119ab823383612e8b565b5050565b6000336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415611a1e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316149050610a8c565b6000848152600a602052604090205415611a5357611a3a610a93565b6001600160a01b0316836001600160a01b031614611a5e565b611a5e848484611ef2565b949350505050565b611a6f33610f12565b611a8b5760405162461bcd60e51b815260040161071e90613c58565b611a958282611d3b565b15611ab25760405162461bcd60e51b815260040161071e90614036565b6001600160a01b03808316600081815260046020908152604080832094861680845294909152808220805460ff19166001179055517f2b5f18afd9a7b21f41bf023b012b3d4c8a22a21b79fa425cd4494ecbe29701969190a35050565b611b1833610f12565b611b345760405162461bcd60e51b815260040161071e90613c58565b611b3f838383611c75565b611b5b5760405162461bcd60e51b815260040161071e90613e47565b611b6482610f12565b15611b815760405162461bcd60e51b815260040161071e90613fff565b60008381526003602090815260408083206001600160a01b0386168452909152812090611bac6111b8565b6001600160a01b0316815260208101919091526040016000205460ff1615611c0657611bd66111b8565b6001600160a01b0316816001600160a01b031614611c065760405162461bcd60e51b815260040161071e90613854565b60008381526003602090815260408083206001600160a01b038087168086529184528285209086168086529352818420805460ff1916905590519192909186917ff8034293d5b4ed16b867ded8f122c475bc0d1b6bd9309a606609a754e5f3adc391a4505050565b6206978090565b60008381526003602090815260408083206001600160a01b038087168552908352818420908516845290915281205460ff1680611cf6575060008481526003602090815260408083206001600160a01b0387168452909152812090611cd86111b8565b6001600160a01b0316815260208101919091526040016000205460ff165b80611a5e5750611a5e83610f12565b60009081526008602052604090205490565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b03808316600090815260046020908152604080832093851683529290529081205460ff1680611dab57506001600160a01b038316600090815260046020526040812090611d8d6111b8565b6001600160a01b0316815260208101919091526040016000205460ff165b80610a8c5750610a8c83610f12565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611e025760405162461bcd60e51b815260040161071e90613eb5565b611e0b81612886565b611e275760405162461bcd60e51b815260040161071e9061398d565b600082815260086020526040908190208290555182907f6aeebd84e31437f28a17927609991676c31c2b84875c601373da2c194e9d23419061078f9084906140b7565b6006546000908210611e8e5760405162461bcd60e51b815260040161071e906137e6565b600060068381548110611e9d57fe5b60009182526020909120600a90910201600281015490915060ff16158015611ecf57506002810154610100900460ff16155b8015610a8c57506003015442101592915050565b6001546001600160a01b031690565b60008381526009602090815260408083206001600160a01b038087168552908352818420908516845290915281205460ff1680611a5e575060008481526009602090815260408083206001600160a01b0387168452909152812090611f556111b8565b6001600160a01b0316815260208101919091526040016000205460ff16949350505050565b6006546060908410611f9e5760405162461bcd60e51b815260040161071e90613a69565b60008311611fbe5760405162461bcd60e51b815260040161071e90613e10565b6006548490036000611fd08286612fc8565b905060608167ffffffffffffffff81118015611feb57600080fd5b5060405190808252806020026020018201604052801561202557816020015b612012612fe0565b81526020019060019003908161200a5790505b50905060005b8281101561237357856121d25760068189018154811061204757fe5b60009182526020918290206040805161018081018252600a90930290910180546001600160a01b03168352600180820180548451601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95841615610100029590950190921693909304908101879004870283018701909452838252939491938583019391929091908301828280156121235780601f106120f857610100808354040283529160200191612123565b820191906000526020600020905b81548152906001019060200180831161210657829003601f168201915b5050509183525050600282015460ff808216151560208401526101008083048216151560408501526201000090920416151560608301526003830154608083015260048301546001600160a01b0390811660a0840152600584015460c08401526006840154811660e08401526007840154918301919091526008830154166101208201526009909101546101409091015282518390839081106121c257fe5b602002602001018190525061236b565b6006816001860303815481106121e457fe5b60009182526020918290206040805161018081018252600a90930290910180546001600160a01b03168352600180820180548451601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95841615610100029590950190921693909304908101879004870283018701909452838252939491938583019391929091908301828280156122c05780601f10612295576101008083540402835291602001916122c0565b820191906000526020600020905b8154815290600101906020018083116122a357829003601f168201915b5050509183525050600282015460ff808216151560208401526101008083048216151560408501526201000090920416151560608301526003830154608083015260048301546001600160a01b0390811660a0840152600584015460c08401526006840154811660e084015260078401549183019190915260088301541661012082015260099091015461014090910152825183908390811061235f57fe5b60200260200101819052505b60010161202b565b509695505050505050565b600061238933610f12565b6123a55760405162461bcd60e51b815260040161071e90613c58565b6123ad610f0a565b8311156123cc5760405162461bcd60e51b815260040161071e90613da2565b6000848152600a60205260408120546123e59085612f9f565b9050606063f0bb940660e01b868660405160240161240492919061373b565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050600061247330838588612a23565b90508086887fbc72942fa810fe8985041bb36295502eddf2c163774be55e25d205958956072860405160405180910390a49695505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146124f65760405162461bcd60e51b815260040161071e90613eb5565b6124fe611836565b6040517f851c1bb30000000000000000000000000000000000000000000000000000000081526001600160a01b03919091169063851c1bb390612565907f058a628f0000000000000000000000000000000000000000000000000000000090600401613749565b60206040518083038186803b15801561257d57600080fd5b505afa158015612591573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b591906132de565b82146125e0576125c481612886565b6125e05760405162461bcd60e51b815260040161071e9061398d565b6000828152600a6020526040908190208290555182907f0e182617f9e5f9ce5f761c791ec15ad52176d97f9706b5c2707ffda7b6bdf7909061078f9084906140b7565b60065490565b61263233610f12565b61264e5760405162461bcd60e51b815260040161071e90613c58565b6119ab8282612d7b565b600654606090821061267c5760405162461bcd60e51b815260040161071e906137e6565b60006006838154811061268b57fe5b60009182526020909120600a90910201600281015490915060ff16156126c35760405162461bcd60e51b815260040161071e90613e7e565b6002810154610100900460ff16156126ed5760405162461bcd60e51b815260040161071e90613ad7565b80600301544210156127115760405162461bcd60e51b815260040161071e90613cc6565b600281015462010000900460ff161561274a5761272e8333610695565b61274a5760405162461bcd60e51b815260040161071e90613956565b60028101805460ff191660019081179091556006820180547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905542600783015581546040517f1cff79cd0000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811693631cff79cd936127fc93921691908601906004016135f8565b600060405180830381600087803b15801561281657600080fd5b505af115801561282a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128529190810190613423565b60405190925083907f4fa5548c15e2d4a0b806eee962935acea143d79644d2340af39f4edf13b335a990600090a250919050565b600080612891611836565b6040517f851c1bb30000000000000000000000000000000000000000000000000000000081526001600160a01b03919091169063851c1bb3906128f8907f058a628f0000000000000000000000000000000000000000000000000000000090600401613749565b60206040518083038186803b15801561291057600080fd5b505afa158015612924573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294891906132de565b6000908152600a60205260409020549092111592915050565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038316908117825560405190917f39510b933a9d010f906528d6019d3f4e2450a10dc33b10887503b31ed82f111191a250565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f566fe119ff450afc2580186c62762b6c1258245c8b1b6bb095e7276eb5a75b5590600090a250565b60068054825160408051610180810182526001600160a01b03898116825260208083018a815260009484018590526060840185905294151560808401819052428a810160a086018190523360c087015260e086019190915261010085018690526101208501869052610140850186905261016085018690526001880189559790945282517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f600a880290810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169290941691909117835594518051969796949593949293612b3d937ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40909101929190910190613045565b5060408201516002820180546060850151608086015160ff19909216931515939093177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101009315158402177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16620100009115159190910217905560a0830151600383015560c08301516004830180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b039384161790915560e08501516005850155918401516006840180548416918316919091179055610120840151600784015561014084015160088401805490931691161790556101609091015160099091015560005b8451811015612d7057600260008581526020019081526020016000206000868381518110612c7b57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615612cbf5760405162461bcd60e51b815260040161071e90613a32565b6000848152600260205260408120865160019290889085908110612cdf57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550848181518110612d2a57fe5b60200260200101516001600160a01b0316847f2d0aa562da96ca6dd124fee5588e6f8545b0aa0b15cfd87cc231eff1ae7000e460405160405180910390a3600101612c51565b505050949350505050565b612d858282610d51565b15612da25760405162461bcd60e51b815260040161071e90613fc8565b612daa6111b8565b8214612e30576006548210612dd15760405162461bcd60e51b815260040161071e906137e6565b600060068381548110612de057fe5b60009182526020909120600a90910201600281015490915060ff16158015612e1257506002810154610100900460ff16155b612e2e5760405162461bcd60e51b815260040161071e90613b0e565b505b60008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551909184917f1b55562f9a67454174f758170aba47751c0af4c1f3b7d4e0b70667f1e82066069190a35050565b612e96838383611ef2565b612eb25760405162461bcd60e51b815260040161071e906139fb565b60008381526009602090815260408083206001600160a01b0386168452909152812090612edd6111b8565b6001600160a01b0316815260208101919091526040016000205460ff1615612f3757612f076111b8565b6001600160a01b0316816001600160a01b031614612f375760405162461bcd60e51b815260040161071e90613d6b565b60008381526009602090815260408083206001600160a01b038087168086529184528285209086168086529352818420805460ff1916905590519192909186917f7b42e026d3b17cf41399915c285780d0f724b3464b269297aff73c0de0fe417f91a4505050565b6000828210612fb557612fb0611c6e565b610a8c565b610a8c828403612fc3611c6e565b612fd4565b80820390821102900390565b80820390821002900390565b604080516101808101825260008082526060602083018190529282018190529181018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101829052610140810182905261016081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061308657805160ff19168380011785556130b3565b828001600101855582156130b3579182015b828111156130b3578251825591602001919060010190613098565b506130bf9291506130c3565b5090565b5b808211156130bf57600081556001016130c4565b80356001600160a01b03811681146106bc57600080fd5b600082601f8301126130ff578081fd5b813567ffffffffffffffff811115613115578182fd5b60208082026131258282016140c0565b8381529350818401858301828701840188101561314157600080fd5b600092505b8483101561316c5761315888826130d8565b825260019290920191908301908301613146565b505050505092915050565b600060208284031215613188578081fd5b610a8c83836130d8565b600080604083850312156131a4578081fd5b6131ae84846130d8565b91506131bd84602085016130d8565b90509250929050565b600080604083850312156131d8578182fd5b6131e284846130d8565b9150602083013567ffffffffffffffff8111156131fd578182fd5b613209858286016130ef565b9150509250929050565b600080600060608486031215613227578081fd5b61323185856130d8565b9250602084013567ffffffffffffffff8082111561324d578283fd5b818601915086601f830112613260578283fd5b813561327361326e826140e7565b6140c0565b818152886020838601011115613287578485fd5b81602085016020830137908101602001849052935060408601359150808211156132af578283fd5b506132bc868287016130ef565b9150509250925092565b6000602082840312156132d7578081fd5b5035919050565b6000602082840312156132ef578081fd5b5051919050565b60008060408385031215613308578182fd5b823591506131bd84602085016130d8565b60008060006060848603121561332d578283fd5b8335925061333e85602086016130d8565b915061334d85604086016130d8565b90509250925092565b6000806000806080858703121561336b578081fd5b8435935061337c86602087016130d8565b925061338b86604087016130d8565b9150606085013567ffffffffffffffff8111156133a6578182fd5b6133b2878288016130ef565b91505092959194509250565b600080604083850312156133d0578182fd5b50508035926020909101359150565b6000806000606084860312156133f3578283fd5b8335925060208401359150604084013567ffffffffffffffff811115613417578182fd5b6132bc868287016130ef565b600060208284031215613434578081fd5b815167ffffffffffffffff81111561344a578182fd5b8201601f8101841361345a578182fd5b805161346861326e826140e7565b81815285602083850101111561347c578384fd5b61348d826020830160208601614117565b95945050505050565b6000806000606084860312156134aa578081fd5b8335925060208401359150604084013580151581146134c7578182fd5b809150509250925092565b6001600160a01b03169052565b15159052565b600081518084526134fd816020860160208601614117565b601f01601f19169290920160200192915050565b60006101806135218484516134d2565b6020830151816020860152613538828601826134e5565b915050604083015161354d60408601826134df565b50606083015161356060608601826134df565b50608083015161357360808601826134df565b5060a083015160a085015260c083015161359060c08601826134d2565b5060e083015160e0850152610100808401516135ae828701826134d2565b50506101208381015190850152610140808401516135ce828701826134d2565b5050610160928301519390920192909252919050565b6001600160a01b0391909116815260200190565b6000604082016001600160a01b0385168352602060408185015282855460018082166000811461362f576001811461364d57613685565b607f6002840416865260ff1983166060890152608088019350613685565b6002830480875261365d8a61410b565b885b8281101561367b5781548b82016060015290840190870161365f565b8a01606001955050505b509198975050505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015613704577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526136f2858351613511565b945092850192908501906001016136b8565b5092979650505050505050565b901515815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b918252602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b600060208252610a8c60208301846134e5565b60208082526026908201527f415454454d5054494e475f455845435554494f4e5f48454c5045525f5245454e60408201527f5452414e43590000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f455845435554494f4e5f444f45535f4e4f545f45584953540000000000000000604082015260600190565b6020808252601b908201527f43414e4e4f545f52454d4f56455f524f4f545f43414e43454c45520000000000604082015260600190565b60208082526011908201527f4752414e5445525f49535f474c4f42414c000000000000000000000000000000604082015260600190565b6020808252601a908201527f5045524d495353494f4e5f414c52454144595f4752414e544544000000000000604082015260600190565b60208082526022908201527f43414e4e4f545f5343484544554c455f415554484f52495a45525f414354494f60408201527f4e53000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526015908201527f53454e4445525f49535f4e4f545f4752414e5445520000000000000000000000604082015260600190565b60208082526016908201527f53454e4445525f49535f4e4f545f4558454355544f5200000000000000000000604082015260600190565b6020808252601c908201527f44454c41595f455843454544535f5345545f415554484f52495a455200000000604082015260600190565b6020808252601a908201527f4143434f554e545f49535f414c52454144595f4752414e544552000000000000604082015260600190565b60208082526016908201527f5045524d495353494f4e5f4e4f545f4752414e54454400000000000000000000604082015260600190565b60208082526013908201527f4455504c49434154455f4558454355544f525300000000000000000000000000604082015260600190565b60208082526014908201527f534b49505f56414c55455f544f4f5f4c41524745000000000000000000000000604082015260600190565b60208082526019908201527f414354494f4e5f4841535f4e4f5f4752414e545f44454c415900000000000000604082015260600190565b6020808252601a908201527f455845435554494f4e5f414c52454144595f43414e43454c4544000000000000604082015260600190565b60208082526018908201527f455845435554494f4e5f49535f4e4f545f50454e44494e470000000000000000604082015260600190565b6020808252600e908201527f444154415f544f4f5f53484f5254000000000000000000000000000000000000604082015260600190565b6020808252601f908201527f53454e4445525f444f45535f4e4f545f484156455f5045524d495353494f4e00604082015260600190565b60208082526010908201527f44454c41595f49535f4e4f545f53455400000000000000000000000000000000604082015260600190565b60208082526011908201527f5245564f4b45525f49535f474c4f42414c000000000000000000000000000000604082015260600190565b60208082526015908201527f53454e4445525f49535f4e4f545f5245564f4b45520000000000000000000000604082015260600190565b60208082526012908201527f53454e4445525f49535f4e4f545f524f4f540000000000000000000000000000604082015260600190565b6020808252601a908201527f43414e4e4f545f52454d4f56455f524f4f545f5245564f4b4552000000000000604082015260600190565b6020808252601c908201527f455845435554494f4e5f4e4f545f5945545f45584543555441424c4500000000604082015260600190565b60208082526018908201527f5245564f4b455f4d5553545f42455f5343484544554c45440000000000000000604082015260600190565b6020808252601a908201527f53454e4445525f49535f4e4f545f50454e44494e475f524f4f54000000000000604082015260600190565b6020808252601d908201527f4143434f554e545f4841535f474c4f42414c5f5045524d495353494f4e000000604082015260600190565b6020808252600f908201527f44454c41595f544f4f5f4c415247450000000000000000000000000000000000604082015260600190565b6020808252601a908201527f414354494f4e5f4841535f4e4f5f5245564f4b455f44454c4159000000000000604082015260600190565b60208082526013908201527f5a45524f5f4d41585f53495a455f56414c554500000000000000000000000000604082015260600190565b60208082526016908201527f4143434f554e545f49535f4e4f545f4752414e54455200000000000000000000604082015260600190565b6020808252601a908201527f455845435554494f4e5f414c52454144595f4558454355544544000000000000604082015260600190565b60208082526015908201527f43414e5f4f4e4c595f42455f5343484544554c45440000000000000000000000604082015260600190565b6020808252601a908201527f4143434f554e545f49535f474c4f42414c5f43414e43454c4552000000000000604082015260600190565b60208082526017908201527f4143434f554e545f49535f4e4f545f43414e43454c4552000000000000000000604082015260600190565b60208082526017908201527f4752414e545f4d5553545f42455f5343484544554c4544000000000000000000604082015260600190565b60208082526016908201527f4143434f554e545f49535f4e4f545f5245564f4b455200000000000000000000604082015260600190565b6020808252601b908201527f4143434f554e545f49535f414c52454144595f43414e43454c45520000000000604082015260600190565b6020808252601a908201527f43414e4e4f545f52454d4f56455f524f4f545f4752414e544552000000000000604082015260600190565b6020808252601a908201527f4143434f554e545f49535f414c52454144595f5245564f4b4552000000000000604082015260600190565b60208082526016908201527f53454e4445525f49535f4e4f545f43414e43454c455200000000000000000000604082015260600190565b600060208252610a8c6020830184613511565b90815260200190565b60405181810167ffffffffffffffff811182821017156140df57600080fd5b604052919050565b600067ffffffffffffffff8211156140fd578081fd5b50601f01601f191660200190565b60009081526020902090565b60005b8381101561413257818101518382015260200161411a565b83811115614141576000848401525b5050505056fea26469706673582212205cf12e169e848fcf4694b03be8dfccc89f6b956804ba6f76a21ae15949c5e6fd64736f6c6343000701003360a060405234801561001057600080fd5b5060016000553360601b60805260805160601c6104b061003f600039806101c6528061026e52506104b06000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80631cff79cd1461003b578063aaabadc514610173575b600080fd5b6100fe6004803603604081101561005157600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516919081019060408101602082013564010000000081111561008957600080fd5b82018360208201111561009b57600080fd5b803590602001918460018302840111640100000000831117156100bd57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506101a4945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610138578181015183820152602001610120565b50505050905090810190601f1680156101655780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61017b61026c565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b60606101ae610290565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461025257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f53454e4445525f49535f4e4f545f415554484f52495a45520000000000000000604482015290519081900360640190fd5b61025c83836102a9565b9050610266610393565b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6102a26002600054141561019061039a565b6002600055565b6060600060608473ffffffffffffffffffffffffffffffffffffffff16846040518082805190602001908083835b6020831061031457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016102d7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610376576040519150601f19603f3d011682016040523d82523d6000602084013e61037b565b606091505b509150915061038a82826103ac565b95945050505050565b6001600055565b816103a8576103a8816103d2565b5050565b606082156103bb575080610266565b8151156103cb5781518083602001fd5b6102666101ae5b6103fc817f42414c00000000000000000000000000000000000000000000000000000000006103ff565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fdfea264697066735822122045da9e9d3f0030310eec4eeedb7f228cd6aa0355a1cd0901f2b8463c825c4dc964736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100be5760003560e01c8063b78b608711610076578063ebf0c7171161005b578063ebf0c71714610120578063fbfa77cf14610128578063fc78a22814610130576100be565b8063b78b608714610110578063c6bfe9ae14610118576100be565b806362cde1ba116100a757806362cde1ba146100eb578063a0c286d814610100578063a217fddf14610108576100be565b8063064cb76a146100c35780633c44172d146100e1575b600080fd5b6100cb610138565b6040516100d89190610824565b60405180910390f35b6100e961015c565b005b6100f361025a565b6040516100d89190610803565b6100f361027e565b6100cb6102a2565b6100e96102a7565b6100f361067f565b6100f36106a3565b6100f36106c7565b6100cb61025a565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005b6000548111610257576040517ffe0d94c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063fe0d94c1906101da908490600401610824565b600060405180830381600087803b1580156101f457600080fd5b505af1158015610208573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261024e919081019061072a565b5060010161015f565b50565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081565b6040517f557a640300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063557a640390610339907f000000000000000000000000000000000000000000000000000000000000000090600401610803565b60206040518083038186803b15801561035157600080fd5b505afa158015610365573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038991906106eb565b6103c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103bf90610886565b60405180910390fd5b6040517f851c1bb300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063851c1bb39061045d907f058a628f0000000000000000000000000000000000000000000000000000000090600401610859565b60206040518083038186803b15801561047557600080fd5b505afa158015610489573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ad9190610712565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639be2a88483307f00000000000000000000000000000000000000000000000000000000000000006040518463ffffffff1660e01b815260040161052e9392919061082d565b60206040518083038186803b15801561054657600080fd5b505afa15801561055a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057e91906106eb565b9050806105b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103bf906108bd565b6040517f058a628f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063058a628f90610649907f000000000000000000000000000000000000000000000000000000000000000090600401610803565b600060405180830381600087803b15801561066357600080fd5b505af1158015610677573d6000803e3d6000fd5b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000602082840312156106fc578081fd5b8151801515811461070b578182fd5b9392505050565b600060208284031215610723578081fd5b5051919050565b6000602080838503121561073c578182fd5b825167ffffffffffffffff80821115610753578384fd5b818501915085601f830112610766578384fd5b815181811115610774578485fd5b604051847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011682010181811084821117156107b1578687fd5b60405281815283820185018810156107c7578586fd5b8592505b818310156107e857838301850151818401860152918401916107cb565b818311156107f857858583830101525b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b60208082526014908201527f524f4f545f4e4f545f434c41494d45445f594554000000000000000000000000604082015260600190565b6020808252601e908201527f4d49475241544f525f43414e4e4f545f5345545f415554484f52495a4552000060408201526060019056fea2646970667358221220d786552b445783790a6af616b3d19991c5b24d436a9a622b7c1bf1a860cb16b164736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/artifact/TimelockExecutionHelper.json b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/artifact/TimelockExecutionHelper.json new file mode 100644 index 0000000..e2f2516 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/artifact/TimelockExecutionHelper.json @@ -0,0 +1,53 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TimelockExecutionHelper", + "sourceName": "@balancer-labs/v2-vault/contracts/authorizer/TimelockExecutionHelper.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "execute", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a060405234801561001057600080fd5b5060016000553360601b60805260805160601c6104b061003f600039806101c6528061026e52506104b06000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80631cff79cd1461003b578063aaabadc514610173575b600080fd5b6100fe6004803603604081101561005157600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516919081019060408101602082013564010000000081111561008957600080fd5b82018360208201111561009b57600080fd5b803590602001918460018302840111640100000000831117156100bd57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506101a4945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610138578181015183820152602001610120565b50505050905090810190601f1680156101655780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61017b61026c565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b60606101ae610290565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461025257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f53454e4445525f49535f4e4f545f415554484f52495a45520000000000000000604482015290519081900360640190fd5b61025c83836102a9565b9050610266610393565b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6102a26002600054141561019061039a565b6002600055565b6060600060608473ffffffffffffffffffffffffffffffffffffffff16846040518082805190602001908083835b6020831061031457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016102d7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610376576040519150601f19603f3d011682016040523d82523d6000602084013e61037b565b606091505b509150915061038a82826103ac565b95945050505050565b6001600055565b816103a8576103a8816103d2565b5050565b606082156103bb575080610266565b8151156103cb5781518083602001fd5b6102666101ae5b6103fc817f42414c00000000000000000000000000000000000000000000000000000000006103ff565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fdfea264697066735822122045da9e9d3f0030310eec4eeedb7f228cd6aa0355a1cd0901f2b8463c825c4dc964736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80631cff79cd1461003b578063aaabadc514610173575b600080fd5b6100fe6004803603604081101561005157600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516919081019060408101602082013564010000000081111561008957600080fd5b82018360208201111561009b57600080fd5b803590602001918460018302840111640100000000831117156100bd57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506101a4945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610138578181015183820152602001610120565b50505050905090810190601f1680156101655780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61017b61026c565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b60606101ae610290565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461025257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f53454e4445525f49535f4e4f545f415554484f52495a45520000000000000000604482015290519081900360640190fd5b61025c83836102a9565b9050610266610393565b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6102a26002600054141561019061039a565b6002600055565b6060600060608473ffffffffffffffffffffffffffffffffffffffff16846040518082805190602001908083835b6020831061031457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016102d7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610376576040519150601f19603f3d011682016040523d82523d6000602084013e61037b565b606091505b509150915061038a82826103ac565b95945050505050565b6001600055565b816103a8576103a8816103d2565b5050565b606082156103bb575080610266565b8151156103cb5781518083602001fd5b6102666101ae5b6103fc817f42414c00000000000000000000000000000000000000000000000000000000006103ff565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fdfea264697066735822122045da9e9d3f0030310eec4eeedb7f228cd6aa0355a1cd0901f2b8463c825c4dc964736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/index.ts b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/index.ts new file mode 100644 index 0000000..182ff4b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/index.ts @@ -0,0 +1,31 @@ +import { Task, TaskRunOptions } from '@src'; +import { TimelockAuthorizerDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as TimelockAuthorizerDeployment; + const migrator = await task.deployAndVerify( + 'TimelockAuthorizerMigrator', + [ + input.Root, + input.Authorizer, + input.AuthorizerAdaptorEntrypoint, + input.RootTransferDelay, + await input.getRoles(), + input.Granters, + input.Revokers, + input.ExecuteDelays, + input.GrantDelays, + ], + from, + force + ); + + const authorizer = await task.instanceAt('TimelockAuthorizer', await migrator.newAuthorizer()); + const authorizerArgs = [migrator.address, input.Root, input.AuthorizerAdaptorEntrypoint, input.RootTransferDelay]; + + await task.verify('TimelockAuthorizer', authorizer.address, authorizerArgs); + task.save({ TimelockAuthorizer: authorizer }); + + const executor = await task.instanceAt('TimelockExecutionHelper', await authorizer.getTimelockExecutionHelper()); + await task.verify('TimelockExecutionHelper', executor.address, []); +}; diff --git a/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/input.ts b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/input.ts new file mode 100644 index 0000000..d6610ab --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/input.ts @@ -0,0 +1,38 @@ +import { Task, TaskMode } from '@src'; +import { DelayData, RoleData } from './input/types'; + +const Authorizer = new Task('20210418-authorizer', TaskMode.READ_ONLY); +const AuthorizerAdaptorEntrypoint = new Task('20221124-authorizer-adaptor-entrypoint', TaskMode.READ_ONLY); + +export type TimelockAuthorizerDeployment = { + Authorizer: string; + AuthorizerAdaptorEntrypoint: string; + Root: string; + RootTransferDelay: number; + getRoles: () => Promise; + Granters: RoleData[]; + Revokers: RoleData[]; + ExecuteDelays: DelayData[]; + GrantDelays: DelayData[]; +}; + +/* eslint-disable @typescript-eslint/no-explicit-any */ +export type TimelockAuthorizerDeploymentInputType = { + Authorizer: Task; + AuthorizerAdaptorEntrypoint: Task; + networks: string[]; + goerli: any; + sepolia: any; + [key: string]: any; // index signature +}; +/* eslint-enable @typescript-eslint/no-explicit-any */ + +const input: TimelockAuthorizerDeploymentInputType = { + Authorizer, + AuthorizerAdaptorEntrypoint, + networks: ['goerli', 'sepolia'], + goerli: require('./input/goerli.ts'), + sepolia: require('./input/sepolia.ts'), +}; + +export default input; diff --git a/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/input/goerli.ts b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/input/goerli.ts new file mode 100644 index 0000000..64b80b7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/input/goerli.ts @@ -0,0 +1,273 @@ +import { DAY, HOUR } from '@helpers/time'; +import { Task, TaskMode } from '@src'; +import { DelayData, RoleData } from './types'; + +export const TRANSITION_END_BLOCK = 9722300; + +const network = 'goerli'; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY, network); + +const BalancerTokenAdmin = new Task('20220325-balancer-token-admin', TaskMode.READ_ONLY, network); +const GaugeController = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, network); +const VotingEscrowDelegationProxy = new Task('20220325-ve-delegation', TaskMode.READ_ONLY, network); + +const MainnetGaugeFactory = new Task('20220822-mainnet-gauge-factory-v2', TaskMode.READ_ONLY, network); +const L2VotingEscrowDelegationProxy = new Task('20230316-l2-ve-delegation-proxy', TaskMode.READ_ONLY, network); +const L2BalancerPseudoMinter = new Task('20230316-l2-balancer-pseudo-minter', TaskMode.READ_ONLY, network); +const L2Layer0BridgeForwarder = new Task('20230404-l2-layer0-bridge-forwarder', TaskMode.READ_ONLY, network); +const VeBALRemapper = new Task('20230504-vebal-remapper', TaskMode.READ_ONLY, network); + +const SmartWalletChecker = new Task('20220420-smart-wallet-checker', TaskMode.READ_ONLY, network); +const ProtocolFeeWithdrawer = new Task('20220517-protocol-fee-withdrawer', TaskMode.READ_ONLY, network); +const ProtocolFeePercentagesProvider = new Task( + '20220725-protocol-fee-percentages-provider', + TaskMode.READ_ONLY, + network +); +const ProtocolIdRegistry = new Task('20230223-protocol-id-registry', TaskMode.READ_ONLY, network); + +// Ballerinas Multisig +export const Root = '0xe13E1EB85923981465E60d050FBfF22bF9DA857f'; + +// Happens frequently +const SHORT_DELAY = 0.5 * HOUR; + +// May happen frequently but can be dangerous +const MEDIUM_DELAY = 3 * HOUR; + +// Happens basically never. A long grant delay typically involves replacing infrastructure (e.g. replacing the veBAL +// system or protocol fees). +const LONG_DELAY = DAY; + +export const RootTransferDelay = LONG_DELAY; + +export const GrantDelays: DelayData[] = [ + // BAL is minted by the BalancerMinter. Changing the minter means changing the veBAL liquidity mining system. + { + actionId: BalancerTokenAdmin.actionId('BalancerTokenAdmin', 'mint(address,uint256)'), + newDelay: LONG_DELAY, + }, + + // Adding gauges is dangerous since they can mint BAL. This permission is granted to the GaugeAdder. + { + actionId: GaugeController.actionId('GaugeController', 'add_gauge(address,int128)'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: GaugeController.actionId('GaugeController', 'add_gauge(address,int128,uint256)'), + newDelay: MEDIUM_DELAY, + }, + + // Relayer permissions - all of these are dangerous since relayers are powerful, but they also opt-in by each user. + { + actionId: Vault.actionId('Vault', 'setRelayerApproval(address,address,bool)'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: Vault.actionId( + 'Vault', + 'swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)' + ), + newDelay: MEDIUM_DELAY, + }, + { + actionId: Vault.actionId( + 'Vault', + 'batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)' + ), + newDelay: MEDIUM_DELAY, + }, + { + actionId: Vault.actionId('Vault', 'joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: Vault.actionId('Vault', 'exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: Vault.actionId('Vault', 'manageUserBalance((uint8,address,uint256,address,address)[])'), + newDelay: MEDIUM_DELAY, + }, + + // The permission to withdraw protocol fees is held solely by the ProtocolFeeWithdrawer. + { + actionId: Vault.actionId('ProtocolFeesCollector', 'withdrawCollectedFees(address[],uint256[],address)'), + newDelay: LONG_DELAY, + }, + // The permission to modify protocol fees at the Collector is held by the ProtocolFeePercentagesProvider. + { + actionId: Vault.actionId('ProtocolFeesCollector', 'setSwapFeePercentage(uint256)'), + newDelay: LONG_DELAY, + }, + { + actionId: Vault.actionId('ProtocolFeesCollector', 'setFlashLoanFeePercentage(uint256)'), + newDelay: LONG_DELAY, + }, +]; + +export const getRoles: () => Promise = async () => []; + +export const Granters: RoleData[] = []; + +export const Revokers: RoleData[] = []; + +export const ExecuteDelays: DelayData[] = [ + // setAuthorizer must be long since no delay can be longer than it. + { actionId: Vault.actionId('Vault', 'setAuthorizer(address)'), newDelay: LONG_DELAY }, + + // Allowlisting addresses to hold veBAL is relatively risk free. + { + actionId: SmartWalletChecker.actionId('SmartWalletChecker', 'allowlistAddress(address)'), + newDelay: SHORT_DELAY, + }, + + // This action would replace the SmartWalletChecker. + { + actionId: GaugeController.actionId('VotingEscrow', 'apply_smart_wallet_checker()'), + newDelay: LONG_DELAY, + }, + + // This would replace the ve boost system. + { + actionId: VotingEscrowDelegationProxy.actionId('VotingEscrowDelegationProxy', 'setDelegation(address)'), + newDelay: LONG_DELAY, + }, + + // These actions are 'disabled' - we don't mean to ever use them. + { + actionId: GaugeController.actionId('GaugeController', 'change_type_weight(int128,uint256)'), + newDelay: LONG_DELAY, + }, + { + actionId: GaugeController.actionId('GaugeController', 'change_gauge_weight(address,uint256)'), + newDelay: LONG_DELAY, + }, + + // These are typically associated with setting up a new network, though they are not strictly needed. They are not + // risky however. + { + actionId: GaugeController.actionId('GaugeController', 'add_type(string)'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: GaugeController.actionId('GaugeController', 'add_type(string,uint256)'), + newDelay: MEDIUM_DELAY, + }, + + // We don't currently use this but there's no huge risk in doing so. + { + actionId: BalancerTokenAdmin.actionId('BalancerTokenAdmin', 'snapshot()'), + newDelay: MEDIUM_DELAY, + }, + + // This creates a new protocol fee type, but there's no huge risk since nothing will use it. + { + actionId: ProtocolFeePercentagesProvider.actionId( + 'ProtocolFeePercentagesProvider', + 'registerFeeType(uint256,string,uint256,uint256)' + ), + newDelay: MEDIUM_DELAY, + }, + { + actionId: ProtocolFeePercentagesProvider.actionId( + 'ProtocolFeePercentagesProvider', + 'setFeeTypePercentage(uint256,uint256)' + ), + newDelay: MEDIUM_DELAY, + }, + + // Layer0 config + { + actionId: L2Layer0BridgeForwarder.actionId('L2LayerZeroBridgeForwarder', 'setDelegation(address)'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: VeBALRemapper.actionId('OmniVotingEscrowAdaptor', 'setAdapterParams(bytes)'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: VeBALRemapper.actionId('OmniVotingEscrowAdaptor', 'setOmniVotingEscrow(address)'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: VeBALRemapper.actionId('OmniVotingEscrowAdaptor', 'setUseZero(bool)'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: VeBALRemapper.actionId('OmniVotingEscrowAdaptor', 'setZeroPaymentAddress(address)'), + newDelay: MEDIUM_DELAY, + }, + + // Gauge configuration + { + actionId: MainnetGaugeFactory.actionId('LiquidityGaugeV5', 'set_reward_distributor(address,address)'), + newDelay: MEDIUM_DELAY, + }, + + // Boost Configuration + { + actionId: L2VotingEscrowDelegationProxy.actionId('VotingEscrowDelegationProxy', 'setDelegation(address)'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: L2BalancerPseudoMinter.actionId('L2BalancerPseudoMinter', 'addGaugeFactory(address)'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: L2BalancerPseudoMinter.actionId('L2BalancerPseudoMinter', 'removeGaugeFactory(address)'), + newDelay: MEDIUM_DELAY, + }, + + // Operational actions taken frequently + + { + actionId: MainnetGaugeFactory.actionId('LiquidityGaugeV5', 'add_reward(address,address)'), + newDelay: SHORT_DELAY, + }, + { + actionId: MainnetGaugeFactory.actionId('LiquidityGaugeV5', 'setRelativeWeightCap(uint256)'), + newDelay: SHORT_DELAY, + }, + { + actionId: ProtocolFeeWithdrawer.actionId( + 'ProtocolFeesWithdrawer', + 'withdrawCollectedFees(address[],uint256[],address)' + ), + newDelay: SHORT_DELAY, + }, + { + actionId: ProtocolIdRegistry.actionId('ProtocolIdRegistry', 'registerProtocolId(uint256,string)'), + newDelay: SHORT_DELAY, + }, + { + actionId: ProtocolIdRegistry.actionId('ProtocolIdRegistry', 'renameProtocolId(uint256,string)'), + newDelay: SHORT_DELAY, + }, + + { + actionId: VeBALRemapper.actionId('VotingEscrowRemapper', 'setNetworkRemappingManager(address,address)'), + newDelay: SHORT_DELAY, + }, +]; + +// Checks + +const actionIds = [ + ExecuteDelays.map((delayData) => delayData.actionId), + GrantDelays.map((delayData) => delayData.actionId), +].flat(); + +if (new Set(actionIds).size !== actionIds.length) { + throw new Error('Duplicate action ID found in configuration'); +} + +const delays = [ + ExecuteDelays.map((delayData) => delayData.newDelay), + GrantDelays.map((delayData) => delayData.newDelay), +].flat(); + +if (delays.some((delay) => delay < SHORT_DELAY || delay > LONG_DELAY)) { + throw new Error('Delays outside expected bounds'); +} diff --git a/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/input/sepolia.ts b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/input/sepolia.ts new file mode 100644 index 0000000..0a619b4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/input/sepolia.ts @@ -0,0 +1,272 @@ +import { DAY, HOUR } from '@helpers/time'; +import { Task, TaskMode } from '@src'; +import { DelayData, RoleData } from './types'; + +export const TRANSITION_END_BLOCK = 4316000; + +const network = 'sepolia'; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY, network); + +const BalancerTokenAdmin = new Task('20220325-balancer-token-admin', TaskMode.READ_ONLY, network); +const GaugeController = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, network); +const VotingEscrowDelegationProxy = new Task('20220325-ve-delegation', TaskMode.READ_ONLY, network); + +const MainnetGaugeFactory = new Task('20220822-mainnet-gauge-factory-v2', TaskMode.READ_ONLY, network); +const L2VotingEscrowDelegationProxy = new Task('20230316-l2-ve-delegation-proxy', TaskMode.READ_ONLY, network); +const L2BalancerPseudoMinter = new Task('20230316-l2-balancer-pseudo-minter', TaskMode.READ_ONLY, network); +const L2Layer0BridgeForwarder = new Task('20230404-l2-layer0-bridge-forwarder', TaskMode.READ_ONLY, network); +const VeBALRemapper = new Task('20230504-vebal-remapper', TaskMode.READ_ONLY, network); + +const SmartWalletChecker = new Task('20220420-smart-wallet-checker', TaskMode.READ_ONLY, network); +const ProtocolFeeWithdrawer = new Task('20220517-protocol-fee-withdrawer', TaskMode.READ_ONLY, network); +const ProtocolFeePercentagesProvider = new Task( + '20220725-protocol-fee-percentages-provider', + TaskMode.READ_ONLY, + network +); +const ProtocolIdRegistry = new Task('20230223-protocol-id-registry', TaskMode.READ_ONLY, network); + +export const Root = '0x9098b50ee2d9E4c3C69928A691DA3b192b4C9673'; + +// Happens frequently +const SHORT_DELAY = 0.5 * HOUR; + +// May happen frequently but can be dangerous +const MEDIUM_DELAY = 3 * HOUR; + +// Happens basically never. A long grant delay typically involves replacing infrastructure (e.g. replacing the veBAL +// system or protocol fees). +const LONG_DELAY = DAY; + +export const RootTransferDelay = LONG_DELAY; + +export const GrantDelays: DelayData[] = [ + // BAL is minted by the BalancerMinter. Changing the minter means changing the veBAL liquidity mining system. + { + actionId: BalancerTokenAdmin.actionId('BalancerTokenAdmin', 'mint(address,uint256)'), + newDelay: LONG_DELAY, + }, + + // Adding gauges is dangerous since they can mint BAL. This permission is granted to the GaugeAdder. + { + actionId: GaugeController.actionId('GaugeController', 'add_gauge(address,int128)'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: GaugeController.actionId('GaugeController', 'add_gauge(address,int128,uint256)'), + newDelay: MEDIUM_DELAY, + }, + + // Relayer permissions - all of these are dangerous since relayers are powerful, but they also opt-in by each user. + { + actionId: Vault.actionId('Vault', 'setRelayerApproval(address,address,bool)'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: Vault.actionId( + 'Vault', + 'swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)' + ), + newDelay: MEDIUM_DELAY, + }, + { + actionId: Vault.actionId( + 'Vault', + 'batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)' + ), + newDelay: MEDIUM_DELAY, + }, + { + actionId: Vault.actionId('Vault', 'joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: Vault.actionId('Vault', 'exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: Vault.actionId('Vault', 'manageUserBalance((uint8,address,uint256,address,address)[])'), + newDelay: MEDIUM_DELAY, + }, + + // The permission to withdraw protocol fees is held solely by the ProtocolFeeWithdrawer. + { + actionId: Vault.actionId('ProtocolFeesCollector', 'withdrawCollectedFees(address[],uint256[],address)'), + newDelay: LONG_DELAY, + }, + // The permission to modify protocol fees at the Collector is held by the ProtocolFeePercentagesProvider. + { + actionId: Vault.actionId('ProtocolFeesCollector', 'setSwapFeePercentage(uint256)'), + newDelay: LONG_DELAY, + }, + { + actionId: Vault.actionId('ProtocolFeesCollector', 'setFlashLoanFeePercentage(uint256)'), + newDelay: LONG_DELAY, + }, +]; + +export const getRoles: () => Promise = async () => []; + +export const Granters: RoleData[] = []; + +export const Revokers: RoleData[] = []; + +export const ExecuteDelays: DelayData[] = [ + // setAuthorizer must be long since no delay can be longer than it. + { actionId: Vault.actionId('Vault', 'setAuthorizer(address)'), newDelay: LONG_DELAY }, + + // Allowlisting addresses to hold veBAL is relatively risk free. + { + actionId: SmartWalletChecker.actionId('SmartWalletChecker', 'allowlistAddress(address)'), + newDelay: SHORT_DELAY, + }, + + // This action would replace the SmartWalletChecker. + { + actionId: GaugeController.actionId('VotingEscrow', 'apply_smart_wallet_checker()'), + newDelay: LONG_DELAY, + }, + + // This would replace the ve boost system. + { + actionId: VotingEscrowDelegationProxy.actionId('VotingEscrowDelegationProxy', 'setDelegation(address)'), + newDelay: LONG_DELAY, + }, + + // These actions are 'disabled' - we don't mean to ever use them. + { + actionId: GaugeController.actionId('GaugeController', 'change_type_weight(int128,uint256)'), + newDelay: LONG_DELAY, + }, + { + actionId: GaugeController.actionId('GaugeController', 'change_gauge_weight(address,uint256)'), + newDelay: LONG_DELAY, + }, + + // These are typically associated with setting up a new network, though they are not strictly needed. They are not + // risky however. + { + actionId: GaugeController.actionId('GaugeController', 'add_type(string)'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: GaugeController.actionId('GaugeController', 'add_type(string,uint256)'), + newDelay: MEDIUM_DELAY, + }, + + // We don't currently use this but there's no huge risk in doing so. + { + actionId: BalancerTokenAdmin.actionId('BalancerTokenAdmin', 'snapshot()'), + newDelay: MEDIUM_DELAY, + }, + + // This creates a new protocol fee type, but there's no huge risk since nothing will use it. + { + actionId: ProtocolFeePercentagesProvider.actionId( + 'ProtocolFeePercentagesProvider', + 'registerFeeType(uint256,string,uint256,uint256)' + ), + newDelay: MEDIUM_DELAY, + }, + { + actionId: ProtocolFeePercentagesProvider.actionId( + 'ProtocolFeePercentagesProvider', + 'setFeeTypePercentage(uint256,uint256)' + ), + newDelay: MEDIUM_DELAY, + }, + + // Layer0 config + { + actionId: L2Layer0BridgeForwarder.actionId('L2LayerZeroBridgeForwarder', 'setDelegation(address)'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: VeBALRemapper.actionId('OmniVotingEscrowAdaptor', 'setAdapterParams(bytes)'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: VeBALRemapper.actionId('OmniVotingEscrowAdaptor', 'setOmniVotingEscrow(address)'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: VeBALRemapper.actionId('OmniVotingEscrowAdaptor', 'setUseZero(bool)'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: VeBALRemapper.actionId('OmniVotingEscrowAdaptor', 'setZeroPaymentAddress(address)'), + newDelay: MEDIUM_DELAY, + }, + + // Gauge configuration + { + actionId: MainnetGaugeFactory.actionId('LiquidityGaugeV5', 'set_reward_distributor(address,address)'), + newDelay: MEDIUM_DELAY, + }, + + // Boost Configuration + { + actionId: L2VotingEscrowDelegationProxy.actionId('VotingEscrowDelegationProxy', 'setDelegation(address)'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: L2BalancerPseudoMinter.actionId('L2BalancerPseudoMinter', 'addGaugeFactory(address)'), + newDelay: MEDIUM_DELAY, + }, + { + actionId: L2BalancerPseudoMinter.actionId('L2BalancerPseudoMinter', 'removeGaugeFactory(address)'), + newDelay: MEDIUM_DELAY, + }, + + // Operational actions taken frequently + + { + actionId: MainnetGaugeFactory.actionId('LiquidityGaugeV5', 'add_reward(address,address)'), + newDelay: SHORT_DELAY, + }, + { + actionId: MainnetGaugeFactory.actionId('LiquidityGaugeV5', 'setRelativeWeightCap(uint256)'), + newDelay: SHORT_DELAY, + }, + { + actionId: ProtocolFeeWithdrawer.actionId( + 'ProtocolFeesWithdrawer', + 'withdrawCollectedFees(address[],uint256[],address)' + ), + newDelay: SHORT_DELAY, + }, + { + actionId: ProtocolIdRegistry.actionId('ProtocolIdRegistry', 'registerProtocolId(uint256,string)'), + newDelay: SHORT_DELAY, + }, + { + actionId: ProtocolIdRegistry.actionId('ProtocolIdRegistry', 'renameProtocolId(uint256,string)'), + newDelay: SHORT_DELAY, + }, + + { + actionId: VeBALRemapper.actionId('VotingEscrowRemapper', 'setNetworkRemappingManager(address,address)'), + newDelay: SHORT_DELAY, + }, +]; + +// Checks + +const actionIds = [ + ExecuteDelays.map((delayData) => delayData.actionId), + GrantDelays.map((delayData) => delayData.actionId), +].flat(); + +if (new Set(actionIds).size !== actionIds.length) { + throw new Error('Duplicate action ID found in configuration'); +} + +const delays = [ + ExecuteDelays.map((delayData) => delayData.newDelay), + GrantDelays.map((delayData) => delayData.newDelay), +].flat(); + +if (delays.some((delay) => delay < SHORT_DELAY || delay > LONG_DELAY)) { + throw new Error('Delays outside expected bounds'); +} diff --git a/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/input/types.ts b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/input/types.ts new file mode 100644 index 0000000..449fa2e --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/input/types.ts @@ -0,0 +1,10 @@ +export type RoleData = { + role: string; + grantee: string; + target: string; +}; + +export type DelayData = { + actionId: string; + newDelay: number; +}; diff --git a/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/output/goerli.json b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/output/goerli.json new file mode 100644 index 0000000..7944a1c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/output/goerli.json @@ -0,0 +1,4 @@ +{ + "TimelockAuthorizerMigrator": "0xaD89051bEd8d96f045E8912aE1672c6C0bF8a85E", + "TimelockAuthorizer": "0x68056E4234A6Aa4dB6fE66E93703fd90669a8697" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/output/sepolia.json b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/output/sepolia.json new file mode 100644 index 0000000..fc51d90 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/output/sepolia.json @@ -0,0 +1,4 @@ +{ + "TimelockAuthorizerMigrator": "0x6eaD84Af26E997D27998Fc9f8614e8a19BB93938", + "TimelockAuthorizer": "0xDe615cc5712B4954BeB613BCF32E61C137Cc64f9" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/readme.md b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/readme.md new file mode 100644 index 0000000..f35af67 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/readme.md @@ -0,0 +1,12 @@ +# 2023-05-22 - Timelock Authorizer + +Deployment of the `TimelockAuthorizer` in order to replace the basic Authorizer deployed with the Vault. +This Authorizer implementation allows defining a delay per action identifier. Users can only execute functions directly when there is no delay. Otherwise, they're granted permission to schedule an action, which can then be executed by the Authorizer after the delay. It also introduces Granters and Revokers, to allow controlled delegation of permission handling to third parties, which eases the burden on governance and allows the system to scale. For instance, a smaller multisig might be designated as a Granter for certain veBAL-related functions for new pools. + +## Useful Files + +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`TimelockAuthorizer` artifact](./artifact/TimelockAuthorizer.json) +- [`TimelockAuthorizerMigrator` artifact](./artifact/TimelockAuthorizerMigrator.json) +- [`TimelockExecutionHelper` artifact](./artifact/TimelockExecutionHelper.json) diff --git a/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/test/task.fork.ts b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/test/task.fork.ts new file mode 100644 index 0000000..287db2f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230522-timelock-authorizer/test/task.fork.ts @@ -0,0 +1,151 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import { fp } from '@helpers/numbers'; +import { actionId } from '@helpers/models/misc/actions'; +import { advanceTime, DAY } from '@helpers/time'; +import * as expectEvent from '@helpers/expectEvent'; +import { ZERO_ADDRESS } from '@helpers/constants'; + +import { describeForkTest } from '@src'; +import { Task, TaskMode } from '@src'; +import { impersonate } from '@src'; +import { getForkedNetwork } from '@src'; +import { TimelockAuthorizerDeployment, default as input } from '../input'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; + +function doForkTestsOnNetwork(network: string, block: number) { + describeForkTest(`TimelockAuthorizer ${network}`, network, block, function () { + let input: TimelockAuthorizerDeployment; + let migrator: Contract, vault: Contract, newAuthorizer: Contract, oldAuthorizer: Contract; + let root: SignerWithAddress; + let task: Task; + + before('run task', async () => { + task = new Task('20230522-timelock-authorizer', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + input = task.input() as TimelockAuthorizerDeployment; + migrator = await task.deployedInstance('TimelockAuthorizerMigrator'); + newAuthorizer = await task.deployedInstance('TimelockAuthorizer'); + + root = await impersonate(input.Root, fp(100)); + }); + + before('load vault', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.instanceAt('Vault', await migrator.vault()); + }); + + before('load old authorizer and impersonate multisig', async () => { + const authorizerTask = new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)); + oldAuthorizer = await authorizerTask.instanceAt('Authorizer', await migrator.oldAuthorizer()); + + const multisig = await impersonate(input.Root, fp(100)); + const setAuthorizerActionId = await actionId(vault, 'setAuthorizer'); + await oldAuthorizer.connect(multisig).grantRolesToMany([setAuthorizerActionId], [migrator.address]); + }); + + it('migrates all roles properly', async () => { + for (const roleData of await input.getRoles()) { + expect(await newAuthorizer.hasPermission(roleData.role, roleData.grantee, roleData.target)).to.be.true; + } + }); + + it('sets up granters properly', async () => { + for (const granterData of input.Granters) { + expect(await newAuthorizer.isGranter(granterData.role, granterData.grantee, granterData.target)).to.be.true; + } + }); + + it('sets up revokers properly', async () => { + for (const revokerData of input.Revokers) { + expect(await newAuthorizer.isRevoker(revokerData.role, revokerData.grantee, revokerData.target)).to.be.true; + } + }); + + it('sets up delays properly', async () => { + await advanceTime(5 * DAY); + await migrator.executeDelays(); + + for (const delayData of input.ExecuteDelays) { + expect(await newAuthorizer.getActionIdDelay(delayData.actionId)).to.be.eq(delayData.newDelay); + } + + for (const delayData of input.GrantDelays) { + expect(await newAuthorizer.getActionIdGrantDelay(delayData.actionId)).to.be.eq(delayData.newDelay); + } + }); + + it('does not set the new authorizer immediately', async () => { + expect(await newAuthorizer.isRoot(migrator.address)).to.be.true; + expect(await vault.getAuthorizer()).to.be.equal(oldAuthorizer.address); + }); + + it('finalizes the migration once new root address claims root status', async () => { + await expect(migrator.finalizeMigration()).to.be.revertedWith('ROOT_NOT_CLAIMED_YET'); + + await newAuthorizer.connect(root).claimRoot(); + + await migrator.finalizeMigration(); + expect(await vault.getAuthorizer()).to.be.equal(newAuthorizer.address); + expect(await newAuthorizer.isRoot(root.address)).to.be.true; + expect(await newAuthorizer.isRoot(migrator.address)).to.be.false; + }); + + // we mint only on mainnet + if (network == 'mainnet') { + it('allows minting after the migration', async () => { + const balancerMinterTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + const balancerMinter = await balancerMinterTask.deployedInstance('BalancerMinter'); + + const balancerTokenAdminTask = new Task( + '20220325-balancer-token-admin', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ); + const balancerTokenAdmin = await balancerTokenAdminTask.deployedInstance('BalancerTokenAdmin'); + + const tokensTask = new Task('00000000-tokens', TaskMode.READ_ONLY, getForkedNetwork(hre)); + const balAddress = tokensTask.output().BAL; + const balancerToken = await balancerTokenAdminTask.instanceAt('IERC20', balAddress); + + const balancerMinterSigner = await impersonate(balancerMinter.address, fp(100)); + + const tx = await balancerTokenAdmin.connect(balancerMinterSigner).mint(balancerMinter.address, 100); + + expectEvent.inIndirectReceipt(await tx.wait(), balancerToken.interface, 'Transfer', { + from: ZERO_ADDRESS, + to: balancerMinter.address, + value: 100, + }); + }); + } + + it('allows migrating the authorizer address again', async () => { + const setAuthorizerActionId = await actionId(vault, 'setAuthorizer'); + + expect(await vault.getAuthorizer()).to.be.eq(newAuthorizer.address); + + await newAuthorizer.connect(root).grantPermission(setAuthorizerActionId, root.address, vault.address); + + // Schedule authorizer change + const nextAuthorizer = '0xaF52695E1bB01A16D33D7194C28C42b10e0Dbec2'; + const tx = await newAuthorizer + .connect(root) + .schedule(vault.address, vault.interface.encodeFunctionData('setAuthorizer', [nextAuthorizer]), [root.address]); + const event = expectEvent.inReceipt(await tx.wait(), 'ExecutionScheduled'); + + await advanceTime(30 * DAY); + + // Execute authorizer change + await newAuthorizer.connect(root).execute(event.args.scheduledExecutionId); + + expect(await vault.getAuthorizer()).to.be.eq(nextAuthorizer); + }); + }); +} + +for (const network of input.networks) { + doForkTestsOnNetwork(network, input[network].TRANSITION_END_BLOCK); +} diff --git a/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/artifact/VeBoostV2.json b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/artifact/VeBoostV2.json new file mode 100644 index 0000000..5322618 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/artifact/VeBoostV2.json @@ -0,0 +1,638 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "VeBoostV2", + "sourceName": "@balancer-labs/liquidity-mining/contracts/VeBoostV2.vy", + "abi": [ + { + "name": "Approval", + "inputs": [ + { + "name": "_owner", + "type": "address", + "indexed": true + }, + { + "name": "_spender", + "type": "address", + "indexed": true + }, + { + "name": "_value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Transfer", + "inputs": [ + { + "name": "_from", + "type": "address", + "indexed": true + }, + { + "name": "_to", + "type": "address", + "indexed": true + }, + { + "name": "_value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Boost", + "inputs": [ + { + "name": "_from", + "type": "address", + "indexed": true + }, + { + "name": "_to", + "type": "address", + "indexed": true + }, + { + "name": "_bias", + "type": "uint256", + "indexed": false + }, + { + "name": "_slope", + "type": "uint256", + "indexed": false + }, + { + "name": "_start", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Migrate", + "inputs": [ + { + "name": "_token_id", + "type": "uint256", + "indexed": true + } + ], + "anonymous": false, + "type": "event" + }, + { + "stateMutability": "nonpayable", + "type": "constructor", + "inputs": [ + { + "name": "_boost_v1", + "type": "address" + }, + { + "name": "_ve", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "boost", + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_amount", + "type": "uint256" + }, + { + "name": "_endtime", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "boost", + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_amount", + "type": "uint256" + }, + { + "name": "_endtime", + "type": "uint256" + }, + { + "name": "_from", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "migrate", + "inputs": [ + { + "name": "_token_id", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "migrate_many", + "inputs": [ + { + "name": "_token_ids", + "type": "uint256[16]" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "checkpoint_user", + "inputs": [ + { + "name": "_user", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "permit", + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_deadline", + "type": "uint256" + }, + { + "name": "_v", + "type": "uint8" + }, + { + "name": "_r", + "type": "bytes32" + }, + { + "name": "_s", + "type": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "increaseAllowance", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_added_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "decreaseAllowance", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_subtracted_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "_user", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "adjusted_balance_of", + "inputs": [ + { + "name": "_user", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "delegated_balance", + "inputs": [ + { + "name": "_user", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "received_balance", + "inputs": [ + { + "name": "_user", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "delegable_balance", + "inputs": [ + { + "name": "_user", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "pure", + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "pure", + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "pure", + "type": "function", + "name": "decimals", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8" + } + ] + }, + { + "stateMutability": "pure", + "type": "function", + "name": "BOOST_V1", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "pure", + "type": "function", + "name": "version", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "pure", + "type": "function", + "name": "DOMAIN_SEPARATOR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ] + }, + { + "stateMutability": "pure", + "type": "function", + "name": "VE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "allowance", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "nonces", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "delegated", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "components": [ + { + "name": "bias", + "type": "uint256" + }, + { + "name": "slope", + "type": "uint256" + }, + { + "name": "ts", + "type": "uint256" + } + ] + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "delegated_slope_changes", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "received", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "components": [ + { + "name": "bias", + "type": "uint256" + }, + { + "name": "slope", + "type": "uint256" + }, + { + "name": "ts", + "type": "uint256" + } + ] + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "received_slope_changes", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "migrated", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + } + ], + "bytecode": "0x6020611bb26000396000518060a01c611bad576040526020611bd26000396000518060a01c611bad576060526040516300001a97527f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610160527f576a762e50ddf4c74071046cf7b508f5d87c41676ea1b6c8bf07aba60e5b6306610180527fd61c1033330c368dfc371f5b1e7133f4794e104642e5a3c87aba7a6a3441c8ff6101a052466101c052306101e05260a0610140526101408051602082012090506300001ab7526060516300001ad7523360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600060805260206080a3611a97610115630000000039611a976060016300000000f3600436101561000d57610f31565b60003560e01c34611a925763a2114cdb811861002d573361032052610048565b63b4b3c2498118610154576064358060a01c611a9257610320525b6004358060a01c611a92576103005233610320511461012c57600061032051602052600052604060002080336020526000526040600020905054610340527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610340511461012c5761034051602435808210611a92578082039050905060006103205160205260005260406000208033602052600052604060002090505533610320517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92561034051602435808210611a925780820390509050610360526020610360a35b6103205161018052610300516101a0526024356101c0526044356101e0526101526114d4565b005b63454b06088118610170576004356103005261016e611930565b005b638ce8dd9781186101d25760006010905b80610400526020610400516010811015611a925702600401356101a3576101ce565b6020610400516010811015611a92570260040135610300526101c3611930565b600101818118610181575b5050005b637de680618118610278576004358060a01c611a92576101805260026101805160205260005260406000206101805160405260016060526102146101a0611116565b6101a0805182556020810151600183015560408101516002830155505060046101805160205260005260406000206101805160405260006060526102596101a0611116565b6101a08051825560208101516001830155604081015160028301555050005b63095ea7b381186102ef576004358060a01c611a92576040526024356000336020526000526040600020806040516020526000526040600020905055604051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560243560605260206060a3600160605260206060f35b63d505accf811861076b576004358060a01c611a92576040526024358060a01c611a92576060526084358060081c611a925760805260643542111561038b57601160a0527f455850495245445f5349474e415455524500000000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b600160405160205260005260406000205460a05260006002610360527f1901000000000000000000000000000000000000000000000000000000000000610380526103608051602082018361058001815181525050808301925050506020611ab76000396000518161058001526020810190507f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96104a0526040516104c0526060516104e0526044356105005260a051610520526064356105405260c0610480526104808051602082012090508161058001526020810190508061056052610560905080516020820120905060c05260006040513b116105375760405160c051610180526080516101a05260a4356101c05260c4356101e05260206000608061018060015afa50600051186104c657600060405114156104c9565b60005b6106e3576011610220527f494e56414c49445f5349474e4154555245000000000000000000000000000000610240526102205061022051806102400181600003601f1636823750506308c379a06101e052602061020052601f19601f6102205101166044016101fcfd6106e3565b600060a4356101805260c4356101a05260406101605261016080516020820183610240018281848460045afa90505050808301925050506080516101c0526101c06020602011611a9257601f81018051610200525060016101e0526101e090508051602082018361024001815181525050808301925050508061022052610220905080518060e0526020820181610100838360045afa9050905050507f1626ba7e00000000000000000000000000000000000000000000000000000000631626ba7e61016052604060c05161018052806101a052806101800160e0518082526020820181818361010060045afa90505050805180602083010181600003601f163682375050601f19601f82516020010116905081015050602061016060c461017c6040515afa61066c573d600060003e3d6000fd5b60203d10611a925761016051146106e3576011610240527f494e56414c49445f5349474e4154555245000000000000000000000000000000610260526102405061024051806102600181600003601f1636823750506308c379a061020052602061022052601f19601f61024051011660440161021cfd5b6044356000604051602052600052604060002080606051602052600052604060002090505560a05160018181830110611a92578082019050905060016040516020526000526040600020556060516040517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560443560e052602060e0a3600160e052602060e0f35b63395093518118610818576004358060a01c611a925760405260003360205260005260406000208060405160205260005260406000209050546024358181830110611a9257808201905090506060526060516000336020526000526040600020806040516020526000526040600020905055604051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560605160805260206080a3600160805260206080f35b63a457c2d781186108c3576004358060a01c611a92576040526000336020526000526040600020806040516020526000526040600020905054602435808210611a9257808203905090506060526060516000336020526000526040600020806040516020526000526040600020905055604051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560605160805260206080a3600160805260206080f35b6370a0823181186108f7576004358060a01c611a925761024052602061024051610140526108f2610260611376565b610260f35b63bbf7408a811861092b576004358060a01c611a92576102405260206102405161014052610926610260611376565b610260f35b6318160ddd81186109705760206318160ddd604052602060406004605c6020611ad76000396000515afa610964573d600060003e3d6000fd5b60203d10611a92576040f35b630a767cc68118610a05576004358060a01c611a9257610140526101405160405260016060526109a16101c0610f37565b6101c080516101605260208101516101805260408101516101a052506101605161018051426101a051808210611a925780820390509050808202821582848304141715611a925790509050808210611a9257808203905090506101c05260206101c0f35b6322c18bb68118610a9a576004358060a01c611a925761014052610140516040526000606052610a366101c0610f37565b6101c080516101605260208101516101805260408101516101a052506101605161018051426101a051808210611a925780820390509050808202821582848304141715611a925790509050808210611a9257808203905090506101c05260206101c0f35b63ca8309468118610b80576004358060a01c611a925761014052610140516040526001606052610acb6101c0610f37565b6101c080516101605260208101516101805260408101516101a052506370a082316101c052610140516101e05260206101c060246101dc6020611ad76000396000515afa610b1e573d600060003e3d6000fd5b60203d10611a92576101c0516101605161018051426101a051808210611a925780820390509050808202821582848304141715611a925790509050808210611a925780820390509050808210611a925780820390509050610200526020610200f35b6306fdde038118610c005760208060805260136040527f566f74652d457363726f77656420426f6f7374000000000000000000000000006060526040816080018151808252602083016020830181518152505050805180602083010181600003601f163682375050601f19601f8251602001011690509050810190506080f35b6395d89b418118610c805760208060805260076040527f7665426f6f7374000000000000000000000000000000000000000000000000006060526040816080018151808252602083016020830181518152505050805180602083010181600003601f163682375050601f19601f8251602001011690509050810190506080f35b63313ce5678118610c9657601260405260206040f35b635d14140a8118610cb5576020611a9760003960005160405260206040f35b6354fd4d508118610d355760208060805260066040527f76322e302e3000000000000000000000000000000000000000000000000000006060526040816080018151808252602083016020830181518152505050805180602083010181600003601f163682375050601f19601f8251602001011690509050810190506080f35b633644e5158118610d54576020611ab760003960005160405260206040f35b63c863657d8118610d73576020611ad760003960005160405260206040f35b63dd62ed3e8118610dc5576004358060a01c611a92576040526024358060a01c611a92576060526000604051602052600052604060002080606051602052600052604060002090505460805260206080f35b637ecebe008118610df8576004358060a01c611a9257604052600160405160205260005260406000205460605260206060f35b63f3598ad98118610e3d576004358060a01c611a92576040526002604051602052600052604060002080546060526001810154608052600281015460a0525060606060f35b63356a46808118610e81576004358060a01c611a92576040526003604051602052600052604060002080602435602052600052604060002090505460605260206060f35b63df0cb9348118610ec6576004358060a01c611a92576040526004604051602052600052604060002080546060526001810154608052600281015460a0525060606060f35b635ad600c98118610f0a576004358060a01c611a92576040526005604051602052600052604060002080602435602052600052604060002090505460605260206060f35b630e359f168118610f2f57600660043560205260005260406000205460405260206040f35b505b60006000fd5b606036608037606051610f6f57600460405160205260005260406000208054608052600181015460a052600281015460c05250610f96565b600260405160205260005260406000208054608052600181015460a052600281015460c052505b60c051610fa2574260c0525b4260c05118610fc657608051815260a051602082015260c051604082015250611114565b60c05162093a808082049050905062093a80808202821582848304141715611a92579050905060e052600060ff905b806101005260e05162093a808181830110611a92578082019050905060e05260006101205260e05142106110805760605161105557600560405160205260005260406000208060e051602052600052604060002090505461012052611085565b600360405160205260005260406000208060e051602052600052604060002090505461012052611085565b4260e0525b60805160a05160e05160c051808210611a925780820390509050808202821582848304141715611a925790509050808210611a92578082039050905060805260a05161012051808210611a92578082039050905060a05260e05160c0524260e051186110f0576110fb565b600101818118610ff5575b5050608051815260a051602082015260c0516040820152505b565b60603660803760605161114e57600460405160205260005260406000208054608052600181015460a052600281015460c05250611175565b600260405160205260005260406000208054608052600181015460a052600281015460c052505b60c051611181574260c0525b4260c051186111a557608051815260a051602082015260c051604082015250611374565b600060e05260c05162093a808082049050905062093a80808202821582848304141715611a92579050905061010052600060ff905b80610120526101005162093a808181830110611a9257808201905090506101005260006101405261010051421061126a5760605161123e57600560405160205260005260406000208061010051602052600052604060002090505461014052611270565b600360405160205260005260406000208061010051602052600052604060002090505461014052611270565b42610100525b60a0516101005160c051808210611a925780820390509050808202821582848304141715611a9257905090506101605260e051610160518181830110611a92578082019050905060e05260805161016051808210611a92578082039050905060805260a05161014051808210611a92578082039050905060a0526101005160c0524261010051186113005761130b565b6001018181186111da575b50506060511561131c576000611324565b600060e05114155b1561135d5760006040517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60e051610120526020610120a35b608051815260a051602082015260c0516040820152505b565b6370a0823161018052610140516101a0526020610180602461019c6020611ad76000396000515afa6113ad573d600060003e3d6000fd5b60203d10611a925761018051610160526101405160405260016060526113d46101e0610f37565b6101e080516101805260208101516101a05260408101516101c0525061016051610180516101a051426101c051808210611a925780820390509050808202821582848304141715611a925790509050808210611a925780820390509050808210611a9257808203905090506101605261014051604052600060605261145a6101e0610f37565b6101e080516101805260208101516101a05260408101516101c0525061016051610180516101a051426101c051808210611a925780820390509050808202821582848304141715611a925790509050808210611a9257808203905090508181830110611a9257808201905090506101605261016051815250565b6101a051610180516102205260006102405260016102005260006002905b602081026102200151831861150c57600061020052611517565b6001018181186114f2575b505061020051905015611a925760006101c05114611a9257426101e0511115611a92576101e05162093a8080820690509050611a925763adc635896102005261018051610220526020610200602461021c6020611ad76000396000515afa611584573d600060003e3d6000fd5b60203d10611a9257610200516101e05111611a92576101805160405260016060526115b0610260611116565b610260805161020052602081015161022052604081015161024052506370a082316102605261018051610280526020610260602461027c6020611ad76000396000515afa611603573d600060003e3d6000fd5b60203d10611a92576102605161020051610220514261024051808210611a925780820390509050808202821582848304141715611a925790509050808210611a925780820390509050808210611a9257808203905090506101c05111611a92576101c0516101e05142808210611a925780820390509050808015611a925782049050905061026052610260516101e05142808210611a925780820390509050808202821582848304141715611a9257905090506102805261020051610280518181830110611a9257808201905090506102005261022051610260518181830110611a925780820190509050610220526002610180516020526000526040600020610200518155610220516001820155610240516002820155506003610180516020526000526040600020806101e051602052600052604060002090508054610260518181830110611a9257808201905090508155506101a051604052600060605261176f6102a0611116565b6102a08051610200526020810151610220526040810151610240525061020051610280518181830110611a9257808201905090506102005261022051610260518181830110611a9257808201905090506102205260046101a05160205260005260406000206102005181556102205160018201556102405160028201555060056101a0516020526000526040600020806101e051602052600052604060002090508054610260518181830110611a9257808201905090508155506101a051610180517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6101c0516102a05260206102a0a36101a051610180517f9c0aa947e19ab1e2400ff167e2cb40414b570fdaf31ab646a16749ca3c4301ad610280516102a052610260516102c052426102e05260606102a0a360046101805160205260005260406000206101805160405260006060526118cc6102a0611116565b6102a0805182556020810151600183015560408101516002830155505060026101a05160205260005260406000206101a05160405260016060526119116102a0611116565b6102a08051825560208101516001830155604081015160028301555050565b600661030051602052600052604060002054611a92576103005160601c8060a01c611a925761018052636352211e6103205261030051610340526020610320602461033c6020611a976000396000515afa611990573d600060003e3d6000fd5b60203d10611a9257610320518060a01c611a925761036052610360516101a05263f01e4f0b61038052610300516103a0526020610380602461039c6020611a976000396000515afa6119e7573d600060003e3d6000fd5b60203d10611a9257610380518060008112611a925790506101c052636d1ac9b56103c052610300516103e05260206103c060246103dc6020611a976000396000515afa611a39573d600060003e3d6000fd5b60203d10611a92576103c0516101e052611a516114d4565b6001600661030051602052600052604060002055610300517fd5837b673ffaac69230366d3f7eb7cb2ba2b9fd8f2d4e9d0f5e92d3756b1d5466000610320a2565b600080fd005b600080fd", + "deployedBytecode": "0x600436101561000d57610f31565b60003560e01c34611a925763a2114cdb811861002d573361032052610048565b63b4b3c2498118610154576064358060a01c611a9257610320525b6004358060a01c611a92576103005233610320511461012c57600061032051602052600052604060002080336020526000526040600020905054610340527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610340511461012c5761034051602435808210611a92578082039050905060006103205160205260005260406000208033602052600052604060002090505533610320517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92561034051602435808210611a925780820390509050610360526020610360a35b6103205161018052610300516101a0526024356101c0526044356101e0526101526114d4565b005b63454b06088118610170576004356103005261016e611930565b005b638ce8dd9781186101d25760006010905b80610400526020610400516010811015611a925702600401356101a3576101ce565b6020610400516010811015611a92570260040135610300526101c3611930565b600101818118610181575b5050005b637de680618118610278576004358060a01c611a92576101805260026101805160205260005260406000206101805160405260016060526102146101a0611116565b6101a0805182556020810151600183015560408101516002830155505060046101805160205260005260406000206101805160405260006060526102596101a0611116565b6101a08051825560208101516001830155604081015160028301555050005b63095ea7b381186102ef576004358060a01c611a92576040526024356000336020526000526040600020806040516020526000526040600020905055604051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560243560605260206060a3600160605260206060f35b63d505accf811861076b576004358060a01c611a92576040526024358060a01c611a92576060526084358060081c611a925760805260643542111561038b57601160a0527f455850495245445f5349474e415455524500000000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b600160405160205260005260406000205460a05260006002610360527f1901000000000000000000000000000000000000000000000000000000000000610380526103608051602082018361058001815181525050808301925050506020611ab76000396000518161058001526020810190507f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96104a0526040516104c0526060516104e0526044356105005260a051610520526064356105405260c0610480526104808051602082012090508161058001526020810190508061056052610560905080516020820120905060c05260006040513b116105375760405160c051610180526080516101a05260a4356101c05260c4356101e05260206000608061018060015afa50600051186104c657600060405114156104c9565b60005b6106e3576011610220527f494e56414c49445f5349474e4154555245000000000000000000000000000000610240526102205061022051806102400181600003601f1636823750506308c379a06101e052602061020052601f19601f6102205101166044016101fcfd6106e3565b600060a4356101805260c4356101a05260406101605261016080516020820183610240018281848460045afa90505050808301925050506080516101c0526101c06020602011611a9257601f81018051610200525060016101e0526101e090508051602082018361024001815181525050808301925050508061022052610220905080518060e0526020820181610100838360045afa9050905050507f1626ba7e00000000000000000000000000000000000000000000000000000000631626ba7e61016052604060c05161018052806101a052806101800160e0518082526020820181818361010060045afa90505050805180602083010181600003601f163682375050601f19601f82516020010116905081015050602061016060c461017c6040515afa61066c573d600060003e3d6000fd5b60203d10611a925761016051146106e3576011610240527f494e56414c49445f5349474e4154555245000000000000000000000000000000610260526102405061024051806102600181600003601f1636823750506308c379a061020052602061022052601f19601f61024051011660440161021cfd5b6044356000604051602052600052604060002080606051602052600052604060002090505560a05160018181830110611a92578082019050905060016040516020526000526040600020556060516040517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560443560e052602060e0a3600160e052602060e0f35b63395093518118610818576004358060a01c611a925760405260003360205260005260406000208060405160205260005260406000209050546024358181830110611a9257808201905090506060526060516000336020526000526040600020806040516020526000526040600020905055604051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560605160805260206080a3600160805260206080f35b63a457c2d781186108c3576004358060a01c611a92576040526000336020526000526040600020806040516020526000526040600020905054602435808210611a9257808203905090506060526060516000336020526000526040600020806040516020526000526040600020905055604051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560605160805260206080a3600160805260206080f35b6370a0823181186108f7576004358060a01c611a925761024052602061024051610140526108f2610260611376565b610260f35b63bbf7408a811861092b576004358060a01c611a92576102405260206102405161014052610926610260611376565b610260f35b6318160ddd81186109705760206318160ddd604052602060406004605c6020611ad76000396000515afa610964573d600060003e3d6000fd5b60203d10611a92576040f35b630a767cc68118610a05576004358060a01c611a9257610140526101405160405260016060526109a16101c0610f37565b6101c080516101605260208101516101805260408101516101a052506101605161018051426101a051808210611a925780820390509050808202821582848304141715611a925790509050808210611a9257808203905090506101c05260206101c0f35b6322c18bb68118610a9a576004358060a01c611a925761014052610140516040526000606052610a366101c0610f37565b6101c080516101605260208101516101805260408101516101a052506101605161018051426101a051808210611a925780820390509050808202821582848304141715611a925790509050808210611a9257808203905090506101c05260206101c0f35b63ca8309468118610b80576004358060a01c611a925761014052610140516040526001606052610acb6101c0610f37565b6101c080516101605260208101516101805260408101516101a052506370a082316101c052610140516101e05260206101c060246101dc6020611ad76000396000515afa610b1e573d600060003e3d6000fd5b60203d10611a92576101c0516101605161018051426101a051808210611a925780820390509050808202821582848304141715611a925790509050808210611a925780820390509050808210611a925780820390509050610200526020610200f35b6306fdde038118610c005760208060805260136040527f566f74652d457363726f77656420426f6f7374000000000000000000000000006060526040816080018151808252602083016020830181518152505050805180602083010181600003601f163682375050601f19601f8251602001011690509050810190506080f35b6395d89b418118610c805760208060805260076040527f7665426f6f7374000000000000000000000000000000000000000000000000006060526040816080018151808252602083016020830181518152505050805180602083010181600003601f163682375050601f19601f8251602001011690509050810190506080f35b63313ce5678118610c9657601260405260206040f35b635d14140a8118610cb5576020611a9760003960005160405260206040f35b6354fd4d508118610d355760208060805260066040527f76322e302e3000000000000000000000000000000000000000000000000000006060526040816080018151808252602083016020830181518152505050805180602083010181600003601f163682375050601f19601f8251602001011690509050810190506080f35b633644e5158118610d54576020611ab760003960005160405260206040f35b63c863657d8118610d73576020611ad760003960005160405260206040f35b63dd62ed3e8118610dc5576004358060a01c611a92576040526024358060a01c611a92576060526000604051602052600052604060002080606051602052600052604060002090505460805260206080f35b637ecebe008118610df8576004358060a01c611a9257604052600160405160205260005260406000205460605260206060f35b63f3598ad98118610e3d576004358060a01c611a92576040526002604051602052600052604060002080546060526001810154608052600281015460a0525060606060f35b63356a46808118610e81576004358060a01c611a92576040526003604051602052600052604060002080602435602052600052604060002090505460605260206060f35b63df0cb9348118610ec6576004358060a01c611a92576040526004604051602052600052604060002080546060526001810154608052600281015460a0525060606060f35b635ad600c98118610f0a576004358060a01c611a92576040526005604051602052600052604060002080602435602052600052604060002090505460605260206060f35b630e359f168118610f2f57600660043560205260005260406000205460405260206040f35b505b60006000fd5b606036608037606051610f6f57600460405160205260005260406000208054608052600181015460a052600281015460c05250610f96565b600260405160205260005260406000208054608052600181015460a052600281015460c052505b60c051610fa2574260c0525b4260c05118610fc657608051815260a051602082015260c051604082015250611114565b60c05162093a808082049050905062093a80808202821582848304141715611a92579050905060e052600060ff905b806101005260e05162093a808181830110611a92578082019050905060e05260006101205260e05142106110805760605161105557600560405160205260005260406000208060e051602052600052604060002090505461012052611085565b600360405160205260005260406000208060e051602052600052604060002090505461012052611085565b4260e0525b60805160a05160e05160c051808210611a925780820390509050808202821582848304141715611a925790509050808210611a92578082039050905060805260a05161012051808210611a92578082039050905060a05260e05160c0524260e051186110f0576110fb565b600101818118610ff5575b5050608051815260a051602082015260c0516040820152505b565b60603660803760605161114e57600460405160205260005260406000208054608052600181015460a052600281015460c05250611175565b600260405160205260005260406000208054608052600181015460a052600281015460c052505b60c051611181574260c0525b4260c051186111a557608051815260a051602082015260c051604082015250611374565b600060e05260c05162093a808082049050905062093a80808202821582848304141715611a92579050905061010052600060ff905b80610120526101005162093a808181830110611a9257808201905090506101005260006101405261010051421061126a5760605161123e57600560405160205260005260406000208061010051602052600052604060002090505461014052611270565b600360405160205260005260406000208061010051602052600052604060002090505461014052611270565b42610100525b60a0516101005160c051808210611a925780820390509050808202821582848304141715611a9257905090506101605260e051610160518181830110611a92578082019050905060e05260805161016051808210611a92578082039050905060805260a05161014051808210611a92578082039050905060a0526101005160c0524261010051186113005761130b565b6001018181186111da575b50506060511561131c576000611324565b600060e05114155b1561135d5760006040517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60e051610120526020610120a35b608051815260a051602082015260c0516040820152505b565b6370a0823161018052610140516101a0526020610180602461019c6020611ad76000396000515afa6113ad573d600060003e3d6000fd5b60203d10611a925761018051610160526101405160405260016060526113d46101e0610f37565b6101e080516101805260208101516101a05260408101516101c0525061016051610180516101a051426101c051808210611a925780820390509050808202821582848304141715611a925790509050808210611a925780820390509050808210611a9257808203905090506101605261014051604052600060605261145a6101e0610f37565b6101e080516101805260208101516101a05260408101516101c0525061016051610180516101a051426101c051808210611a925780820390509050808202821582848304141715611a925790509050808210611a9257808203905090508181830110611a9257808201905090506101605261016051815250565b6101a051610180516102205260006102405260016102005260006002905b602081026102200151831861150c57600061020052611517565b6001018181186114f2575b505061020051905015611a925760006101c05114611a9257426101e0511115611a92576101e05162093a8080820690509050611a925763adc635896102005261018051610220526020610200602461021c6020611ad76000396000515afa611584573d600060003e3d6000fd5b60203d10611a9257610200516101e05111611a92576101805160405260016060526115b0610260611116565b610260805161020052602081015161022052604081015161024052506370a082316102605261018051610280526020610260602461027c6020611ad76000396000515afa611603573d600060003e3d6000fd5b60203d10611a92576102605161020051610220514261024051808210611a925780820390509050808202821582848304141715611a925790509050808210611a925780820390509050808210611a9257808203905090506101c05111611a92576101c0516101e05142808210611a925780820390509050808015611a925782049050905061026052610260516101e05142808210611a925780820390509050808202821582848304141715611a9257905090506102805261020051610280518181830110611a9257808201905090506102005261022051610260518181830110611a925780820190509050610220526002610180516020526000526040600020610200518155610220516001820155610240516002820155506003610180516020526000526040600020806101e051602052600052604060002090508054610260518181830110611a9257808201905090508155506101a051604052600060605261176f6102a0611116565b6102a08051610200526020810151610220526040810151610240525061020051610280518181830110611a9257808201905090506102005261022051610260518181830110611a9257808201905090506102205260046101a05160205260005260406000206102005181556102205160018201556102405160028201555060056101a0516020526000526040600020806101e051602052600052604060002090508054610260518181830110611a9257808201905090508155506101a051610180517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6101c0516102a05260206102a0a36101a051610180517f9c0aa947e19ab1e2400ff167e2cb40414b570fdaf31ab646a16749ca3c4301ad610280516102a052610260516102c052426102e05260606102a0a360046101805160205260005260406000206101805160405260006060526118cc6102a0611116565b6102a0805182556020810151600183015560408101516002830155505060026101a05160205260005260406000206101a05160405260016060526119116102a0611116565b6102a08051825560208101516001830155604081015160028301555050565b600661030051602052600052604060002054611a92576103005160601c8060a01c611a925761018052636352211e6103205261030051610340526020610320602461033c6020611a976000396000515afa611990573d600060003e3d6000fd5b60203d10611a9257610320518060a01c611a925761036052610360516101a05263f01e4f0b61038052610300516103a0526020610380602461039c6020611a976000396000515afa6119e7573d600060003e3d6000fd5b60203d10611a9257610380518060008112611a925790506101c052636d1ac9b56103c052610300516103e05260206103c060246103dc6020611a976000396000515afa611a39573d600060003e3d6000fd5b60203d10611a92576103c0516101e052611a516114d4565b6001600661030051602052600052604060002055610300517fd5837b673ffaac69230366d3f7eb7cb2ba2b9fd8f2d4e9d0f5e92d3756b1d5466000610320a2565b600080fd", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/index.ts b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/index.ts new file mode 100644 index 0000000..03eebdd --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/index.ts @@ -0,0 +1,11 @@ +import { Task, TaskRunOptions } from '@src'; +import { L2VeBoostV2Deployment } from './input'; +import { ZERO_ADDRESS } from '@helpers/constants'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as L2VeBoostV2Deployment; + + const args = [ZERO_ADDRESS, input.VotingEscrow]; + + await task.deploy('VeBoostV2', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/input.ts b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/input.ts new file mode 100644 index 0000000..670b251 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/input.ts @@ -0,0 +1,34 @@ +export type L2VeBoostV2Deployment = { + VotingEscrow: string; +}; + +export default { + // https://polygonscan.com/address/0xE241C6e48CA045C7f631600a0f1403b2bFea05ad + polygon: { + VotingEscrow: '0xE241C6e48CA045C7f631600a0f1403b2bFea05ad', + }, + // https://arbiscan.io/address/0xe241c6e48ca045c7f631600a0f1403b2bfea05ad + arbitrum: { + VotingEscrow: '0xE241C6e48CA045C7f631600a0f1403b2bFea05ad', + }, + // https://optimistic.etherscan.io/address/0xe241c6e48ca045c7f631600a0f1403b2bfea05ad + optimism: { + VotingEscrow: '0xE241C6e48CA045C7f631600a0f1403b2bFea05ad', + }, + // https://gnosisscan.io/address/0xe241c6e48ca045c7f631600a0f1403b2bfea05ad + gnosis: { + VotingEscrow: '0xE241C6e48CA045C7f631600a0f1403b2bFea05ad', + }, + // https://snowtrace.io/address/0xe241c6e48ca045c7f631600a0f1403b2bfea05ad + avalanche: { + VotingEscrow: '0xE241C6e48CA045C7f631600a0f1403b2bFea05ad', + }, + // https://zkevm.polygonscan.com/address/0xe241c6e48ca045c7f631600a0f1403b2bfea05ad + zkevm: { + VotingEscrow: '0xE241C6e48CA045C7f631600a0f1403b2bFea05ad', + }, + // https://basescan.org/address/0xE241C6e48CA045C7f631600a0f1403b2bFea05ad + base: { + VotingEscrow: '0xE241C6e48CA045C7f631600a0f1403b2bFea05ad', + }, +}; diff --git a/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/output/arbitrum.json b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/output/arbitrum.json new file mode 100644 index 0000000..60716f7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "VeBoostV2": "0x6B5dA774890Db7B7b96C6f44e6a4b0F657399E2e" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/output/avalanche.json b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/output/avalanche.json new file mode 100644 index 0000000..8ff3ae5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/output/avalanche.json @@ -0,0 +1,3 @@ +{ + "VeBoostV2": "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/output/base.json b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/output/base.json new file mode 100644 index 0000000..73228c5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/output/base.json @@ -0,0 +1,3 @@ +{ + "VeBoostV2": "0xE42FFA682A26EF8F25891db4882932711D42e467" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/output/gnosis.json b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/output/gnosis.json new file mode 100644 index 0000000..06559d5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "VeBoostV2": "0x5DbAd78818D4c8958EfF2d5b95b28385A22113Cd" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/output/optimism.json b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/output/optimism.json new file mode 100644 index 0000000..a4b2dea --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/output/optimism.json @@ -0,0 +1,3 @@ +{ + "VeBoostV2": "0x6817149cb753BF529565B4D023d7507eD2ff4Bc0" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/output/polygon.json b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/output/polygon.json new file mode 100644 index 0000000..badba35 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/output/polygon.json @@ -0,0 +1,3 @@ +{ + "VeBoostV2": "0xD961E30156C2E0D0d925A0De45f931CB7815e970" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/output/zkevm.json b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/output/zkevm.json new file mode 100644 index 0000000..8ff3ae5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/output/zkevm.json @@ -0,0 +1,3 @@ +{ + "VeBoostV2": "0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/readme.md b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/readme.md new file mode 100644 index 0000000..6f1bc7f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/readme.md @@ -0,0 +1,18 @@ +# 2023-05-25 - VeBoost V2 + +Deployment of the VeBoostV2 in L2 networks. +This contract shall be used as the delegation for the `VotingEscrowDelegationProxy`, using LayerZero's `OmniVotingEscrowChild` as Voting Escrow. + +This allows using and delegating bridged veBAL balances in L2 networks. +The artifact is the same as in the [20221205-veboost-v2 task](../20221205-veboost-v2/); constructor arguments and fork tests differ. + +## Useful Files + +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkEVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [`VeBoostV2` artifact](./artifact/VeBoostV2.json) diff --git a/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/test/test.fork.ts b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/test/test.fork.ts new file mode 100644 index 0000000..718f02b --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230525-l2-veboost-v2/test/test.fork.ts @@ -0,0 +1,83 @@ +import hre from 'hardhat'; +import { BigNumber, Contract } from 'ethers'; +import { expect } from 'chai'; + +import { ZERO_ADDRESS } from '@helpers/constants'; + +import { actionId } from '@helpers/models/misc/actions'; + +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; +import { bn } from '@helpers/numbers'; + +describeForkTest('L2VeBoostV2', 'arbitrum', 94139000, function () { + let delegation: Contract, delegationProxy: Contract, authorizer: Contract; + + let task: Task; + + const GOV_MULTISIG = '0xaF23DC5983230E9eEAf93280e312e57539D098D0'; + const VEBAL_HOLDER = '0xA2e7002E0FFC42e4228292D67C13a81FDd191870'; + + // To verify that all the components (`VotingEscrowDelegationProxy`, `VeBoostV2` and `OmniVotingEscrowChild`) are + // interacting properly, two messages were sent from mainnet to Arbitrum before the fork test's block number: + // one for the total supply, and one for the balance of a veBAL holder. + + // These messages were the only ones to reach the `OmniVotingEscrowChild` up to this point; this can be verified + // in the nonces shown in the `layerzeroscan` links below. + // The veBAL balances for every other account that is not the transferred one should be 0. + + // OmniVotingEscrow `sendTotalSupply` tx: https://etherscan.io/tx/0x7ff2dc7000f167323ccfdfb3d84547f6cd5a0bd628a35baf76684aa5aec21e5b + // LZ total supply transfer: + // https://layerzeroscan.com/101/address/0xe241c6e48ca045c7f631600a0f1403b2bfea05ad/message/110/address/0xe241c6e48ca045c7f631600a0f1403b2bfea05ad/nonce/1 + + // OmniVotingEscrow `sendUserBalance` tx: https://etherscan.io/tx/0x33df7240e54435d805285eec72e25885e7bedaccd3a1a0a56379d96380f31f5f + // LZ user balance transfer: + // https://layerzeroscan.com/101/address/0xe241c6e48ca045c7f631600a0f1403b2bfea05ad/message/110/address/0xe241c6e48ca045c7f631600a0f1403b2bfea05ad/nonce/2 + + before('run task', async () => { + task = new Task('20230525-l2-veboost-v2', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + delegation = await task.deployedInstance('VeBoostV2'); + }); + + before('setup contracts', async () => { + const delegationProxyTask = new Task('20230316-l2-ve-delegation-proxy', TaskMode.READ_ONLY, getForkedNetwork(hre)); + delegationProxy = await delegationProxyTask.deployedInstance('VotingEscrowDelegationProxy'); + + const authorizerTask = new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizer = await authorizerTask.deployedInstance('Authorizer'); + }); + + it('returns null V1 delegation', async () => { + expect(await delegation.BOOST_V1()).to.be.eq(ZERO_ADDRESS); + }); + + it('proxy can be migrated to delegation', async () => { + const govMultisig = await impersonate(GOV_MULTISIG); + await authorizer + .connect(govMultisig) + .grantRole(await actionId(delegationProxy, 'setDelegation'), govMultisig.address); + + await delegationProxy.connect(govMultisig).setDelegation(delegation.address); + + expect(await delegationProxy.getDelegationImplementation()).to.be.eq(delegation.address); + }); + + it('reverts migrating boosts (nothing to migrate)', async () => { + await expect(delegation.migrate(bn(0))).to.be.reverted; + }); + + it('gets transferred total supply via delegation proxy', async () => { + // Exact total supply decays with time, and depends on block time. + // This is an approximate value fetched from Etherscan at around the time the data was transferred. + expect(await delegationProxy.totalSupply()).to.be.almostEqual(BigNumber.from('10182868869854932315839099')); + }); + + it('gets transferred user balance via delegation proxy', async () => { + // Exact user balance decays with time, and depends on block time. + // This is an approximate value fetched from Etherscan at around the time the data was transferred. + // Most importantly, it's not 0. + expect(await delegationProxy.adjustedBalanceOf(VEBAL_HOLDER)).to.be.almostEqual( + BigNumber.from('11458834346686284') + ); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/artifact/GaugeWorkingBalanceHelper.json b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/artifact/GaugeWorkingBalanceHelper.json new file mode 100644 index 0000000..68c8bba --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/artifact/GaugeWorkingBalanceHelper.json @@ -0,0 +1,124 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GaugeWorkingBalanceHelper", + "sourceName": "contracts/GaugeWorkingBalanceHelper.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVeDelegationProxy", + "name": "veDelegationProxy", + "type": "address" + }, + { + "internalType": "bool", + "name": "readTotalSupplyFromVE", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "getVotingEscrow", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVotingEscrowDelegationProxy", + "outputs": [ + { + "internalType": "contract IVeDelegation", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGauge", + "name": "gauge", + "type": "address" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "getWorkingBalanceToSupplyRatios", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGauge", + "name": "gauge", + "type": "address" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "getWorkingBalances", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "readsTotalSupplyFromVE", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60e060405234801561001057600080fd5b506040516109813803806109818339818101604052604081101561003357600080fd5b5080516020918201516001600160601b0319606083901b1660805260408051630458184560e11b81529051929391926001600160a01b038516926308b0308a9260048082019391829003018186803b15801561008e57600080fd5b505afa1580156100a2573d6000803e3d6000fd5b505050506040513d60208110156100b857600080fd5b50516001600160601b031960609190911b1660a052151560f81b60c0525060805160601c60a05160601c60c05160f81c61086761011a6000398061025f528061035652508061015252806103f2525080610176528061033352506108676000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c8063ce5a7e7d11610050578063ce5a7e7d146100a5578063daf02aff146100f9578063fd655c841461011557610067565b806308b0308a1461006c5780635f6e28f61461009d575b600080fd5b610074610150565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610074610174565b6100e0600480360360408110156100bb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610198565b6040805192835260208301919091528051918290030190f35b61010161025d565b604080519115158252519081900360200190f35b6100e06004803603604081101561012b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610281565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000806000806101a88686610281565b9150915060008673ffffffffffffffffffffffffffffffffffffffff166317e280896040518163ffffffff1660e01b815260040160206040518083038186803b1580156101f457600080fd5b505afa158015610208573d6000803e3d6000fd5b505050506040513d602081101561021e57600080fd5b5051905060006102388461023284866106a4565b906106bd565b905061024484836106d3565b61024e84836106d3565b95509550505050509250929050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008060008473ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156102ed57600080fd5b505afa158015610301573d6000803e3d6000fd5b505050506040513d602081101561031757600080fd5b50519050600061032f8267058d15e176280000610726565b90507f000000000000000000000000000000000000000000000000000000000000000060007f00000000000000000000000000000000000000000000000000000000000000006103f0578173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156103bf57600080fd5b505afa1580156103d3573d6000803e3d6000fd5b505050506040513d60208110156103e957600080fd5b5051610483565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561045657600080fd5b505afa15801561046a573d6000803e3d6000fd5b505050506040513d602081101561048057600080fd5b50515b905080156106035760008273ffffffffffffffffffffffffffffffffffffffff1663bbf7408a896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156104f457600080fd5b505afa158015610508573d6000803e3d6000fd5b505050506040513d602081101561051e57600080fd5b5051604080517f18160ddd000000000000000000000000000000000000000000000000000000008152905191925060009173ffffffffffffffffffffffffffffffffffffffff8c16916318160ddd916004808301926020929190829003018186803b15801561058c57600080fd5b505afa1580156105a0573d6000803e3d6000fd5b505050506040513d60208110156105b657600080fd5b505190506105f26105eb846105e56105d567058d15e176280000610759565b6105df8688610726565b90610726565b906106d3565b86906106a4565b94506105fe868661076b565b945050505b8773ffffffffffffffffffffffffffffffffffffffff166313ecb1ca886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561066a57600080fd5b505afa15801561067e573d6000803e3d6000fd5b505050506040513d602081101561069457600080fd5b5051989297509195505050505050565b60008282016106b68482101583610777565b9392505050565b60006106cd838311156001610777565b50900390565b60006106e28215156004610777565b670de0b6b3a7640000830261071484158061070d5750670de0b6b3a764000085838161070a57fe5b04145b6005610777565b82818161071d57fe5b04949350505050565b600082820261074a84158061074357508385838161074057fe5b04145b6003610777565b670de0b6b3a76400008161071d565b670de0b6b3a764000081810391100290565b80820390821102900390565b816107855761078581610789565b5050565b6107b3817f42414c00000000000000000000000000000000000000000000000000000000006107b6565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fdfea2646970667358221220b0c932362def9b5038dbd82163bc968f7751a1fb0f4afc7d4ecc1cf6eb6de9c464736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c8063ce5a7e7d11610050578063ce5a7e7d146100a5578063daf02aff146100f9578063fd655c841461011557610067565b806308b0308a1461006c5780635f6e28f61461009d575b600080fd5b610074610150565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610074610174565b6100e0600480360360408110156100bb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610198565b6040805192835260208301919091528051918290030190f35b61010161025d565b604080519115158252519081900360200190f35b6100e06004803603604081101561012b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610281565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000806000806101a88686610281565b9150915060008673ffffffffffffffffffffffffffffffffffffffff166317e280896040518163ffffffff1660e01b815260040160206040518083038186803b1580156101f457600080fd5b505afa158015610208573d6000803e3d6000fd5b505050506040513d602081101561021e57600080fd5b5051905060006102388461023284866106a4565b906106bd565b905061024484836106d3565b61024e84836106d3565b95509550505050509250929050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008060008473ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156102ed57600080fd5b505afa158015610301573d6000803e3d6000fd5b505050506040513d602081101561031757600080fd5b50519050600061032f8267058d15e176280000610726565b90507f000000000000000000000000000000000000000000000000000000000000000060007f00000000000000000000000000000000000000000000000000000000000000006103f0578173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156103bf57600080fd5b505afa1580156103d3573d6000803e3d6000fd5b505050506040513d60208110156103e957600080fd5b5051610483565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561045657600080fd5b505afa15801561046a573d6000803e3d6000fd5b505050506040513d602081101561048057600080fd5b50515b905080156106035760008273ffffffffffffffffffffffffffffffffffffffff1663bbf7408a896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156104f457600080fd5b505afa158015610508573d6000803e3d6000fd5b505050506040513d602081101561051e57600080fd5b5051604080517f18160ddd000000000000000000000000000000000000000000000000000000008152905191925060009173ffffffffffffffffffffffffffffffffffffffff8c16916318160ddd916004808301926020929190829003018186803b15801561058c57600080fd5b505afa1580156105a0573d6000803e3d6000fd5b505050506040513d60208110156105b657600080fd5b505190506105f26105eb846105e56105d567058d15e176280000610759565b6105df8688610726565b90610726565b906106d3565b86906106a4565b94506105fe868661076b565b945050505b8773ffffffffffffffffffffffffffffffffffffffff166313ecb1ca886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561066a57600080fd5b505afa15801561067e573d6000803e3d6000fd5b505050506040513d602081101561069457600080fd5b5051989297509195505050505050565b60008282016106b68482101583610777565b9392505050565b60006106cd838311156001610777565b50900390565b60006106e28215156004610777565b670de0b6b3a7640000830261071484158061070d5750670de0b6b3a764000085838161070a57fe5b04145b6005610777565b82818161071d57fe5b04949350505050565b600082820261074a84158061074357508385838161074057fe5b04145b6003610777565b670de0b6b3a76400008161071d565b670de0b6b3a764000081810391100290565b80820390821102900390565b816107855761078581610789565b5050565b6107b3817f42414c00000000000000000000000000000000000000000000000000000000006107b6565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fdfea2646970667358221220b0c932362def9b5038dbd82163bc968f7751a1fb0f4afc7d4ecc1cf6eb6de9c464736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/index.ts b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/index.ts new file mode 100644 index 0000000..9ec46a2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/index.ts @@ -0,0 +1,13 @@ +import { Task, TaskRunOptions } from '@src'; +import { GaugeWorkingBalanceHelperDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as GaugeWorkingBalanceHelperDeployment; + + await task.deployAndVerify( + 'GaugeWorkingBalanceHelper', + [input.VotingEscrowDelegationProxy, input.ReadTotalSupplyFromVE], + from, + force + ); +}; diff --git a/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/input.ts b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/input.ts new file mode 100644 index 0000000..bb5c9e0 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/input.ts @@ -0,0 +1,66 @@ +import { Task, TaskMode } from '@src'; + +export type GaugeWorkingBalanceHelperDeployment = { + VotingEscrowDelegationProxy: string; + ReadTotalSupplyFromVE: boolean; +}; + +export default { + mainnet: { + VotingEscrowDelegationProxy: new Task('20220325-ve-delegation', TaskMode.READ_ONLY).output({ network: 'mainnet' }) + .VotingEscrowDelegationProxy, + ReadTotalSupplyFromVE: true, + }, + polygon: { + VotingEscrowDelegationProxy: new Task('20230316-l2-ve-delegation-proxy', TaskMode.READ_ONLY).output({ + network: 'polygon', + }).VotingEscrowDelegationProxy, + ReadTotalSupplyFromVE: false, + }, + arbitrum: { + VotingEscrowDelegationProxy: new Task('20230316-l2-ve-delegation-proxy', TaskMode.READ_ONLY).output({ + network: 'arbitrum', + }).VotingEscrowDelegationProxy, + ReadTotalSupplyFromVE: false, + }, + optimism: { + VotingEscrowDelegationProxy: new Task('20230316-l2-ve-delegation-proxy', TaskMode.READ_ONLY).output({ + network: 'optimism', + }).VotingEscrowDelegationProxy, + ReadTotalSupplyFromVE: false, + }, + gnosis: { + VotingEscrowDelegationProxy: new Task('20230316-l2-ve-delegation-proxy', TaskMode.READ_ONLY).output({ + network: 'gnosis', + }).VotingEscrowDelegationProxy, + ReadTotalSupplyFromVE: false, + }, + avalanche: { + VotingEscrowDelegationProxy: new Task('20230316-l2-ve-delegation-proxy', TaskMode.READ_ONLY).output({ + network: 'avalanche', + }).VotingEscrowDelegationProxy, + ReadTotalSupplyFromVE: false, + }, + zkevm: { + VotingEscrowDelegationProxy: new Task('20230316-l2-ve-delegation-proxy', TaskMode.READ_ONLY).output({ + network: 'zkevm', + }).VotingEscrowDelegationProxy, + ReadTotalSupplyFromVE: false, + }, + base: { + VotingEscrowDelegationProxy: new Task('20230316-l2-ve-delegation-proxy', TaskMode.READ_ONLY).output({ + network: 'base', + }).VotingEscrowDelegationProxy, + ReadTotalSupplyFromVE: false, + }, + goerli: { + VotingEscrowDelegationProxy: new Task('20220325-ve-delegation', TaskMode.READ_ONLY).output({ network: 'goerli' }) + .VotingEscrowDelegationProxy, + ReadTotalSupplyFromVE: true, + }, + sepolia: { + VotingEscrowDelegationProxy: new Task('20220325-ve-delegation', TaskMode.READ_ONLY).output({ network: 'sepolia' }) + .VotingEscrowDelegationProxy, + ReadTotalSupplyFromVE: true, + }, +}; diff --git a/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/arbitrum.json b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/arbitrum.json new file mode 100644 index 0000000..c65da94 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "GaugeWorkingBalanceHelper": "0xEa924b45a3fcDAAdf4E5cFB1665823B8F8F2039B" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/avalanche.json b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/avalanche.json new file mode 100644 index 0000000..24a6f41 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/avalanche.json @@ -0,0 +1,3 @@ +{ + "GaugeWorkingBalanceHelper": "0x687b8C9b41E01Be8B591725fac5d5f52D0564d79" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/base.json b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/base.json new file mode 100644 index 0000000..1c2ac00 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/base.json @@ -0,0 +1,3 @@ +{ + "GaugeWorkingBalanceHelper": "0xa7d524046ef89de9F8e4f2d7B029f66cCB738d48" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/gnosis.json b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/gnosis.json new file mode 100644 index 0000000..50c5550 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "GaugeWorkingBalanceHelper": "0x682f0dDBFd41D1272982f64a499Fb62d80e27589" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/goerli.json b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/goerli.json new file mode 100644 index 0000000..1c2ac00 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/goerli.json @@ -0,0 +1,3 @@ +{ + "GaugeWorkingBalanceHelper": "0xa7d524046ef89de9F8e4f2d7B029f66cCB738d48" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/mainnet.json b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/mainnet.json new file mode 100644 index 0000000..ef484dc --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "GaugeWorkingBalanceHelper": "0xdAB2583911E872a00A851fB80dCC78a4B46BA57c" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/optimism.json b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/optimism.json new file mode 100644 index 0000000..7c0b122 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/optimism.json @@ -0,0 +1,3 @@ +{ + "GaugeWorkingBalanceHelper": "0x9129E834e15eA19b6069e8f08a8EcFc13686B8dC" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/polygon.json b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/polygon.json new file mode 100644 index 0000000..21b2a21 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/polygon.json @@ -0,0 +1,3 @@ +{ + "GaugeWorkingBalanceHelper": "0x08fd003D8F1892D4EC684E6C3EE0128081be461b" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/sepolia.json b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/sepolia.json new file mode 100644 index 0000000..80949de --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "GaugeWorkingBalanceHelper": "0x2E4aBED3362A622C5f712bB183005A476b146bd3" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/zkevm.json b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/zkevm.json new file mode 100644 index 0000000..c12891d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/output/zkevm.json @@ -0,0 +1,3 @@ +{ + "GaugeWorkingBalanceHelper": "0xEF454a7B3f965D3f6723E462405246f8Cd865425" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/readme.md b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/readme.md new file mode 100644 index 0000000..1c235d4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/readme.md @@ -0,0 +1,17 @@ +# 2023-05-26 - Gauge Working Balance Helper + +Deployment of the `GaugeWorkingBalanceHelper`, which reads the current and projected `working_balance` (effective veBAL boosted balance) for a user on a gauge, as well as the ratio of the `working_balance` to the supply. This can be used (e.g., by front-end processes) to determine whether checkpointing a gauge would be advantageous. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`GaugeWorkingBalanceHelper` artifact](./artifact/GaugeWorkingBalanceHelper.json) diff --git a/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/test/L1GaugeHelper.fork.ts b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/test/L1GaugeHelper.fork.ts new file mode 100644 index 0000000..34c7171 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/test/L1GaugeHelper.fork.ts @@ -0,0 +1,210 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { getForkedNetwork, Task, TaskMode, describeForkTest, getSigners, impersonate, instanceAt } from '@src'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { fp } from '@helpers/numbers'; +import { MAX_UINT256, ZERO_ADDRESS } from '@helpers/constants'; +import { WeightedPoolEncoder } from '@helpers/models/pools/weighted/encoder'; +import { MONTH, currentTimestamp, advanceTime } from '@helpers/time'; + +describeForkTest('GaugeWorkingBalanceHelper-L1', 'mainnet', 17367389, function () { + let workingBalanceHelper: Contract; + let veDelegationProxy: Contract; + let votingEscrow: Contract; + let veBALHolder: SignerWithAddress; + let lpTokenHolder: SignerWithAddress; + let vault: Contract; + let gauge: Contract; + let lpToken: Contract; + let BAL: string; + let task: Task; + + const VEBAL_POOL_ID = '0x5c6ee304399dbdb9c8ef030ab642b10820db8f56000200000000000000000014'; + const VAULT_BOUNTY = fp(1000); + + const LP_TOKEN = '0x7B50775383d3D6f0215A8F290f2C9e2eEBBEceb2'; + const LP_TOKEN_HOLDER = '0x16224283bE3f7C0245d9D259Ea82eaD7fcB8343d'; + + const GAUGE = '0x68d019f64a7aa97e2d4e7363aee42251d08124fb'; + + const LOCK_PERIOD = MONTH * 12; + + before('run task', async () => { + task = new Task('20230526-gauge-working-balance-helper', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + workingBalanceHelper = await task.deployedInstance('GaugeWorkingBalanceHelper'); + }); + + before('setup accounts', async () => { + [, veBALHolder] = await getSigners(); + + veBALHolder = await impersonate(veBALHolder.address, VAULT_BOUNTY.add(fp(5))); // plus gas + lpTokenHolder = await impersonate(LP_TOKEN_HOLDER, fp(100)); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + + veDelegationProxy = await new Task( + '20220325-ve-delegation', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ).deployedInstance('VotingEscrowDelegationProxy'); + + votingEscrow = await new Task( + '20220325-gauge-controller', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ).deployedInstance('VotingEscrow'); + + const BALTokenAdmin = await new Task( + '20220325-balancer-token-admin', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ).deployedInstance('BalancerTokenAdmin'); + + BAL = await BALTokenAdmin.getBalancerToken(); + + const gaugeFactoryTask = new Task('20220325-mainnet-gauge-factory', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gauge = await gaugeFactoryTask.instanceAt('LiquidityGaugeV5', GAUGE); + + lpToken = await instanceAt('IERC20', LP_TOKEN); + }); + + before('stake in gauge', async () => { + const stakeAmount = fp(100); + await lpToken.connect(lpTokenHolder).transfer(veBALHolder.address, stakeAmount); + + await lpToken.connect(veBALHolder).approve(gauge.address, MAX_UINT256); + + await gauge.connect(veBALHolder)['deposit(uint256)'](stakeAmount); + }); + + describe('getters', () => { + it('stores the veDelegationProxy', async () => { + expect(await workingBalanceHelper.getVotingEscrowDelegationProxy()).to.equal(veDelegationProxy.address); + }); + + it('stores the votingEscrow', async () => { + expect(await workingBalanceHelper.getVotingEscrow()).to.equal(votingEscrow.address); + }); + + it('indicates where to read supply from', async () => { + expect(await workingBalanceHelper.readsTotalSupplyFromVE()).to.be.true; + }); + }); + + context('with no veBAL', () => { + it('projected balance should equal current', async () => { + const [currentWorkingBalance, projectedWorkingBalance] = await workingBalanceHelper.getWorkingBalances( + gauge.address, + veBALHolder.address + ); + + // Ensure we have equal balances (that are non-zero) + expect(projectedWorkingBalance).to.eq(currentWorkingBalance); + expect(projectedWorkingBalance).to.gt(0); + }); + }); + + context('with veBAL', () => { + before('create veBAL holder', async () => { + const [poolAddress] = await vault.getPool(VEBAL_POOL_ID); + + const bal80weth20Pool = await instanceAt('IERC20', poolAddress); + + await vault.connect(veBALHolder).joinPool( + VEBAL_POOL_ID, + veBALHolder.address, + veBALHolder.address, + { + assets: [BAL, ZERO_ADDRESS], + maxAmountsIn: [0, VAULT_BOUNTY], + fromInternalBalance: false, + userData: WeightedPoolEncoder.joinExactTokensInForBPTOut([0, VAULT_BOUNTY], 0), + }, + { value: VAULT_BOUNTY } + ); + + const holderBalance = await bal80weth20Pool.balanceOf(veBALHolder.address); + await bal80weth20Pool.connect(veBALHolder).approve(votingEscrow.address, MAX_UINT256); + + const currentTime = await currentTimestamp(); + await votingEscrow.connect(veBALHolder).create_lock(holderBalance, currentTime.add(LOCK_PERIOD)); + }); + + it(`projected balance should be greater than current`, async () => { + const [currentWorkingBalance, projectedWorkingBalance] = await workingBalanceHelper.getWorkingBalances( + gauge.address, + veBALHolder.address + ); + + expect(projectedWorkingBalance).to.be.gt(currentWorkingBalance); + }); + + it(`projected ratio should be greater than current`, async () => { + const [currentWorkingRatio, projectedWorkingRatio] = await workingBalanceHelper.getWorkingBalanceToSupplyRatios( + gauge.address, + veBALHolder.address + ); + + expect(projectedWorkingRatio).to.be.gt(currentWorkingRatio); + }); + + context('updates after checkpointing', () => { + before('checkpoint', async () => { + await gauge.connect(veBALHolder).user_checkpoint(veBALHolder.address); + }); + + it('projected balance should be equal to or slightly less than current', async () => { + const [currentWorkingBalance, projectedWorkingBalance] = await workingBalanceHelper.getWorkingBalances( + gauge.address, + veBALHolder.address + ); + + expect(projectedWorkingBalance).to.be.almostEqual(currentWorkingBalance); + expect(projectedWorkingBalance).to.be.lte(currentWorkingBalance); + }); + + it('projected ratio should be equal to or slightly less than current', async () => { + const [currentWorkingRatio, projectedWorkingRatio] = await workingBalanceHelper.getWorkingBalanceToSupplyRatios( + gauge.address, + veBALHolder.address + ); + + expect(projectedWorkingRatio).to.be.almostEqual(currentWorkingRatio); + expect(projectedWorkingRatio).to.be.lte(currentWorkingRatio); + }); + }); + + context('decays after veBAL balance decays', () => { + before(async () => { + // Because the LP holder owns so few BPT tokens, they get a 2.5 boost even with just a little veBAL. So we don't + // quite see the effect of the balance decay. We instead test for the extreme case when we're past the locktime, + // at which point their veBAL balance is zero and there's no boost. + // Another way of thinking about this is that they got much more veBAL than they needed for the 2.5 boost, so + // even after it decays there's no real effect. + await advanceTime(13 * MONTH); + }); + + it('projected balance should be less than current', async () => { + const [currentWorkingBalance, projectedWorkingBalance] = await workingBalanceHelper.getWorkingBalances( + gauge.address, + veBALHolder.address + ); + + expect(projectedWorkingBalance).to.be.lt(currentWorkingBalance); + }); + + it('projected ratio should be less than current', async () => { + const [currentWorkingRatio, projectedWorkingRatio] = await workingBalanceHelper.getWorkingBalanceToSupplyRatios( + gauge.address, + veBALHolder.address + ); + + expect(projectedWorkingRatio).to.be.lt(currentWorkingRatio); + }); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/test/L1VeBALDecay.fork.ts b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/test/L1VeBALDecay.fork.ts new file mode 100644 index 0000000..63b6ba1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/test/L1VeBALDecay.fork.ts @@ -0,0 +1,192 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; +import { getForkedNetwork, Task, TaskMode, describeForkTest, getSigners, impersonate, instanceAt } from '@src'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { fp, fpMul } from '@helpers/numbers'; +import { MAX_UINT256, ZERO_ADDRESS } from '@helpers/constants'; +import { WeightedPoolEncoder } from '@helpers/models/pools/weighted/encoder'; +import { MONTH, currentTimestamp } from '@helpers/time'; +import * as expectEvent from '@helpers/expectEvent'; + +describeForkTest('GaugeWorkingBalanceHelper-L1-TimeDecay', 'mainnet', 17367389, function () { + let workingBalanceHelper: Contract; + let veDelegationProxy: Contract; + let votingEscrow: Contract; + let veBALHolder: SignerWithAddress; + let lpTokenHolder: SignerWithAddress; + let other: SignerWithAddress; + let vault: Contract; + let gauge: Contract; + let lpToken: Contract; + let BAL: string; + let task: Task; + + const VEBAL_POOL_ID = '0x5c6ee304399dbdb9c8ef030ab642b10820db8f56000200000000000000000014'; + const VAULT_BOUNTY = fp(1000); + + const LP_TOKEN = '0xbc5F4f9332d8415AAf31180Ab4661c9141CC84E4'; + const LP_TOKEN_HOLDER = '0x24Dd242c3c4061b1fCaA5119af608B56afBaEA95'; + + const LOCK_PERIOD = MONTH * 12; + + before('run task', async () => { + task = new Task('20230526-gauge-working-balance-helper', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + workingBalanceHelper = await task.deployedInstance('GaugeWorkingBalanceHelper'); + }); + + before('setup accounts', async () => { + [, veBALHolder, other] = await getSigners(); + + veBALHolder = await impersonate(veBALHolder.address, VAULT_BOUNTY.add(fp(5))); // plus gas + lpTokenHolder = await impersonate(LP_TOKEN_HOLDER, fp(100)); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + + veDelegationProxy = await new Task( + '20220325-ve-delegation', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ).deployedInstance('VotingEscrowDelegationProxy'); + + votingEscrow = await new Task( + '20220325-gauge-controller', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ).deployedInstance('VotingEscrow'); + + const BALTokenAdmin = await new Task( + '20220325-balancer-token-admin', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ).deployedInstance('BalancerTokenAdmin'); + + BAL = await BALTokenAdmin.getBalancerToken(); + + lpToken = await instanceAt('IERC20', LP_TOKEN); + }); + + before('create gauge', async () => { + const gaugeFactoryTask = new Task('20220822-mainnet-gauge-factory-v2', TaskMode.READ_ONLY, getForkedNetwork(hre)); + const factory = await gaugeFactoryTask.deployedInstance('LiquidityGaugeFactory'); + const weightCap = fp(0.001); + + // Create the Gauge, vs using an existing one, so that we can control the total balance + const tx = await factory.create(LP_TOKEN, weightCap); + const event = expectEvent.inReceipt(await tx.wait(), 'GaugeCreated'); + + gauge = await gaugeFactoryTask.instanceAt('LiquidityGaugeV5', event.args.gauge); + expect(await gauge.lp_token()).to.equal(LP_TOKEN); + + expect(await factory.isGaugeFromFactory(gauge.address)).to.be.true; + }); + + const stakeAmount = fp(100); + + before('stake in gauge', async () => { + await lpToken.connect(lpTokenHolder).transfer(veBALHolder.address, stakeAmount); + await lpToken.connect(lpTokenHolder).transfer(other.address, stakeAmount); + + await lpToken.connect(lpTokenHolder).approve(gauge.address, MAX_UINT256); + await lpToken.connect(veBALHolder).approve(gauge.address, MAX_UINT256); + await lpToken.connect(other).approve(gauge.address, MAX_UINT256); + + await gauge.connect(lpTokenHolder)['deposit(uint256)'](stakeAmount.mul(100)); + await gauge.connect(veBALHolder)['deposit(uint256)'](stakeAmount); + await gauge.connect(other)['deposit(uint256)'](stakeAmount); + }); + + describe('getters', () => { + it('stores the veDelegationProxy', async () => { + expect(await workingBalanceHelper.getVotingEscrowDelegationProxy()).to.equal(veDelegationProxy.address); + }); + + it('stores the votingEscrow', async () => { + expect(await workingBalanceHelper.getVotingEscrow()).to.equal(votingEscrow.address); + }); + + it('indicates where to read supply from', async () => { + expect(await workingBalanceHelper.readsTotalSupplyFromVE()).to.be.true; + }); + }); + + it('projected balance should equal current', async () => { + const [currentWorkingBalance, projectedWorkingBalance] = await workingBalanceHelper.getWorkingBalances( + gauge.address, + veBALHolder.address + ); + + // Ensure we have equal balances (that are non-zero) + expect(projectedWorkingBalance).to.eq(currentWorkingBalance); + expect(projectedWorkingBalance).to.gt(0); + }); + + context('with veBAL', () => { + let bal80weth20Pool: Contract; + let whaleBalance: BigNumber; + + before('create veBAL whale', async () => { + const [poolAddress] = await vault.getPool(VEBAL_POOL_ID); + + bal80weth20Pool = await instanceAt('IERC20', poolAddress); + + await vault.connect(veBALHolder).joinPool( + VEBAL_POOL_ID, + veBALHolder.address, + veBALHolder.address, + { + assets: [BAL, ZERO_ADDRESS], + maxAmountsIn: [0, VAULT_BOUNTY], + fromInternalBalance: false, + userData: WeightedPoolEncoder.joinExactTokensInForBPTOut([0, VAULT_BOUNTY], 0), + }, + { value: VAULT_BOUNTY } + ); + + const totalBalance = await bal80weth20Pool.balanceOf(veBALHolder.address); + whaleBalance = fpMul(totalBalance, fp(0.99)); + const otherBalance = totalBalance.sub(whaleBalance); + + await bal80weth20Pool.connect(veBALHolder).transfer(other.address, otherBalance); + + await bal80weth20Pool.connect(veBALHolder).approve(votingEscrow.address, MAX_UINT256); + await bal80weth20Pool.connect(other).approve(votingEscrow.address, MAX_UINT256); + + const currentTime = await currentTimestamp(); + await votingEscrow.connect(other).create_lock(otherBalance, currentTime.add(LOCK_PERIOD)); + }); + + it('veBAL share size affects projected balances', async () => { + const [, projectedBalanceBefore] = await workingBalanceHelper.getWorkingBalances(gauge.address, other.address); + const [, projectedRatioBefore] = await workingBalanceHelper.getWorkingBalanceToSupplyRatios( + gauge.address, + other.address + ); + + await gauge.connect(other).user_checkpoint(other.address); + await workingBalanceHelper.getWorkingBalances(gauge.address, other.address); + + // Dilute other's share + await votingEscrow.connect(veBALHolder).create_lock(whaleBalance, (await currentTimestamp()).add(LOCK_PERIOD)); + + const [currentBalanceAfter, projectedBalanceAfter] = await workingBalanceHelper.getWorkingBalances( + gauge.address, + other.address + ); + const [, projectedRatioAfter] = await workingBalanceHelper.getWorkingBalanceToSupplyRatios( + gauge.address, + other.address + ); + + // Projections should be uniformly lower + expect(projectedBalanceAfter).to.be.lt(projectedBalanceBefore); + expect(projectedRatioAfter).to.be.lt(projectedRatioBefore); + + // Should be close a week after checkpointing + expect(currentBalanceAfter).to.be.almostEqual(projectedBalanceBefore); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/test/L2GaugeHelper.fork.ts b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/test/L2GaugeHelper.fork.ts new file mode 100644 index 0000000..98ce322 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-gauge-working-balance-helper/test/L2GaugeHelper.fork.ts @@ -0,0 +1,182 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { getForkedNetwork, Task, TaskMode, describeForkTest, getSigners, impersonate, deploy, instanceAt } from '@src'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { FP_ONE, fp } from '@helpers/numbers'; +import { MAX_UINT256 } from '@helpers/constants'; +import { MONTH } from '@helpers/time'; +import { actionId } from '@helpers/models/misc/actions'; + +describeForkTest('GaugeWorkingBalanceHelper-L2', 'polygon', 42002545, function () { + let workingBalanceHelper: Contract; + let veDelegationProxy: Contract; + let votingEscrow: Contract; + let gauge: Contract; + let authorizer: Contract; + let lpTokenHolder: SignerWithAddress; + let other: SignerWithAddress; + let veBALHolder: SignerWithAddress; + let lpToken: Contract; + + // Note that at the time of this test, nobody has staked in this gauge. + const GAUGE = '0x1f0ee42d005b89814a01f050416b28c3142ac900'; + const LP_TOKEN = '0x924ec7ed38080e40396c46f6206a6d77d0b9f72d'; + const LP_TOKEN_HOLDER = '0x9824697f7c12cabada9b57842060931c48dea969'; + const GOV_MULTISIG = '0xeE071f4B516F69a1603dA393CdE8e76C40E5Be85'; + + let task: Task; + + before('run task', async () => { + task = new Task('20230526-gauge-working-balance-helper', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + workingBalanceHelper = await task.deployedInstance('GaugeWorkingBalanceHelper'); + }); + + before('setup accounts', async () => { + [, veBALHolder, other] = await getSigners(); + + lpTokenHolder = await impersonate(LP_TOKEN_HOLDER, fp(100)); + }); + + before('setup contracts', async () => { + authorizer = await new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance( + 'Authorizer' + ); + + const proxyTask = new Task('20230316-l2-ve-delegation-proxy', TaskMode.READ_ONLY, getForkedNetwork(hre)); + veDelegationProxy = await proxyTask.deployedInstance('VotingEscrowDelegationProxy'); + votingEscrow = await proxyTask.deployedInstance('NullVotingEscrow'); + + const gaugeFactoryTask = new Task( + '20230316-child-chain-gauge-factory-v2', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ); + gauge = await gaugeFactoryTask.instanceAt('ChildChainGauge', GAUGE); + + lpToken = await instanceAt('IERC20', LP_TOKEN); + }); + + before('stake in gauge', async () => { + const stakeAmount = fp(100); + await lpToken.connect(lpTokenHolder).transfer(veBALHolder.address, stakeAmount); + await lpToken.connect(veBALHolder).approve(gauge.address, MAX_UINT256); + + await gauge.connect(veBALHolder)['deposit(uint256)'](stakeAmount); + + // We also have `other` stake in the gauge so that the veBALHolder is not the sole gauge staker, and their supply + // ratio is less than 100%. + const smallerStakeAmount = stakeAmount.div(2); + await lpToken.connect(lpTokenHolder).transfer(other.address, smallerStakeAmount); + await lpToken.connect(other).approve(gauge.address, MAX_UINT256); + + await gauge.connect(other)['deposit(uint256)'](smallerStakeAmount); + }); + + describe('getters (as deployed)', () => { + it('stores the veDelegationProxy', async () => { + expect(await workingBalanceHelper.getVotingEscrowDelegationProxy()).to.equal(veDelegationProxy.address); + }); + + it('stores the votingEscrow', async () => { + expect(await workingBalanceHelper.getVotingEscrow()).to.equal(votingEscrow.address); + }); + + it('indicates where to read supply from', async () => { + expect(await workingBalanceHelper.readsTotalSupplyFromVE()).to.be.false; + }); + }); + + context('with no veBAL', () => { + it('projected balance should equal current', async () => { + const [currentWorkingBalance, projectedWorkingBalance] = await workingBalanceHelper.getWorkingBalances( + gauge.address, + veBALHolder.address + ); + + // Ensure we have equal balances (that are non-zero) + expect(projectedWorkingBalance).to.eq(currentWorkingBalance); + expect(projectedWorkingBalance).to.gt(0); + }); + + it('projected ratio should equal current', async () => { + const [current, projected] = await workingBalanceHelper.getWorkingBalanceToSupplyRatios( + gauge.address, + veBALHolder.address + ); + + expect(projected).to.eq(current); + + // As a sanity check, we test that they don't own the entire gauge. + expect(projected).to.be.lt(FP_ONE); + }); + }); + + describe('with veBAL', () => { + let newVotingEscrow: Contract; + + before('setup contracts', async () => { + newVotingEscrow = await deploy('MockL2VotingEscrow'); + + const admin = await impersonate(GOV_MULTISIG, fp(100)); + await authorizer.connect(admin).grantRole(await actionId(veDelegationProxy, 'setDelegation'), admin.address); + await veDelegationProxy.connect(admin).setDelegation(newVotingEscrow.address); + }); + + const veBALTotal = fp(1000); + + before('create veBAL whale', async () => { + // The lock duration is irrelevant because this mock voting escrow doesn't take it into consideration. + await newVotingEscrow.connect(veBALHolder).create_lock(veBALTotal, MONTH * 12); + }); + + it('shows a veBAL balance', async () => { + expect(await newVotingEscrow.balanceOf(veBALHolder.address)).to.eq(veBALTotal); + }); + + it(`projected balance should be greater than current`, async () => { + const [currentWorkingBalance, projectedWorkingBalance] = await workingBalanceHelper.getWorkingBalances( + gauge.address, + veBALHolder.address + ); + + expect(projectedWorkingBalance).to.be.gt(currentWorkingBalance); + }); + + it('projected ratio should be greater than current', async () => { + const [currentWorkingRatio, projectedWorkingRatio] = await workingBalanceHelper.getWorkingBalanceToSupplyRatios( + gauge.address, + veBALHolder.address + ); + + expect(projectedWorkingRatio).to.be.gt(currentWorkingRatio); + }); + + context('updates after checkpointing', () => { + before('checkpoint', async () => { + await gauge.connect(veBALHolder).user_checkpoint(veBALHolder.address); + }); + + it('projected balance should be equal to or slightly less than current', async () => { + const [currentWorkingBalance, projectedWorkingBalance] = await workingBalanceHelper.getWorkingBalances( + gauge.address, + veBALHolder.address + ); + + expect(projectedWorkingBalance).to.be.almostEqual(currentWorkingBalance); + expect(projectedWorkingBalance).to.be.lte(currentWorkingBalance); + }); + + it('projected ratio should be equal to or slightly less than current', async () => { + const [currentWorkingRatio, projectedWorkingRatio] = await workingBalanceHelper.getWorkingBalanceToSupplyRatios( + gauge.address, + veBALHolder.address + ); + + expect(projectedWorkingRatio).to.be.almostEqual(currentWorkingRatio); + expect(projectedWorkingRatio).to.be.lte(currentWorkingRatio); + }); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230526-zkevm-root-gauge-factory/artifact/PolygonZkEVMRootGaugeFactory.json b/balpy/balancer-deployments/tasks/20230526-zkevm-root-gauge-factory/artifact/PolygonZkEVMRootGaugeFactory.json new file mode 100644 index 0000000..e333dd4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-zkevm-root-gauge-factory/artifact/PolygonZkEVMRootGaugeFactory.json @@ -0,0 +1,96 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonZkEVMRootGaugeFactory", + "sourceName": "contracts/gauges/zkevm/PolygonZkEVMRootGaugeFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IMainnetBalancerMinter", + "name": "minter", + "type": "address" + }, + { + "internalType": "contract IPolygonZkEVMBridge", + "name": "zkEVMBridge", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "GaugeCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "relativeWeightCap", + "type": "uint256" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "isGaugeFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50604051611d4b380380611d4b83398101604081905261002f9161009a565b818160405161003d9061008d565b6100489291906100d3565b604051809103906000f080158015610064573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b0392909216919091179055506101059050565b61182c8061051f83390190565b600080604083850312156100ac578182fd5b82516100b7816100ed565b60208401519092506100c8816100ed565b809150509250929050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b038116811461010257600080fd5b50565b61040b806101146000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80630ecaea731461004657806339312dee1461006f578063ce3cc8bd14610077575b600080fd5b610059610054366004610322565b610097565b604051610066919061034c565b60405180910390f35b610059610135565b61008a610085366004610300565b610151565b6040516100669190610393565b6000806100a2610180565b6040517fcd6dc68700000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063cd6dc687906100f9908790879060040161036d565b600060405180830381600087803b15801561011357600080fd5b505af1158015610127573d6000803e3d6000fd5b509293505050505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff165b919050565b6000805481906101a59073ffffffffffffffffffffffffffffffffffffffff16610226565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff811661017b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d39061039e565b60405180910390fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461012f57600080fd5b600060208284031215610311578081fd5b61031b83836102dc565b9392505050565b60008060408385031215610334578081fd5b61033e84846102dc565b946020939093013593505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b60208082526016908201527f455243313136373a20637265617465206661696c65640000000000000000000060408201526060019056fea26469706673582212206d28cb93712f916bae7423a12b5a44e46e98762ec554d8e16a12c449c58ea48964736f6c634300070100336101a06040523480156200001257600080fd5b506040516200182c3803806200182c833981810160405260408110156200003857600080fd5b508051602091820151600160009081556040805163e6dec36f60e01b815290519394929385936001600160a01b0385169263e6dec36f9260048083019392829003018186803b1580156200008b57600080fd5b505afa158015620000a0573d6000803e3d6000fd5b505050506040513d6020811015620000b757600080fd5b50516040805163c003969960e01b815290519192506000916001600160a01b0384169163c0039699916004808301926020929190829003018186803b1580156200010057600080fd5b505afa15801562000115573d6000803e3d6000fd5b505050506040513d60208110156200012c57600080fd5b505160408051632c6f4d6f60e11b815290519192506000916001600160a01b038616916358de9ade916004808301926020929190829003018186803b1580156200017557600080fd5b505afa1580156200018a573d6000803e3d6000fd5b505050506040513d6020811015620001a157600080fd5b50516001600160601b0319606084811b821660805285811b821660a05286811b821660c05282901b1660e052604080516303e1469160e61b815290519192506001600160a01b0383169163f851a44091600480820192602092909190829003018186803b1580156200021257600080fd5b505afa15801562000227573d6000803e3d6000fd5b505050506040513d60208110156200023e57600080fd5b505160601b6001600160601b0319166101005260408051635c3dab0b60e11b815290516001600160a01b0385169163b87b5616916004808301926020929190829003018186803b1580156200029257600080fd5b505afa158015620002a7573d6000803e3d6000fd5b505050506040513d6020811015620002be57600080fd5b505161012052604080516321609bbf60e01b815290516001600160a01b038516916321609bbf916004808301926020929190829003018186803b1580156200030557600080fd5b505afa1580156200031a573d6000803e3d6000fd5b505050506040513d60208110156200033157600080fd5b505161014052604080516303f7d6c760e51b815290516001600160a01b03851691637efad8e0916004808301926020929190829003018186803b1580156200037857600080fd5b505afa1580156200038d573d6000803e3d6000fd5b505050506040513d6020811015620003a457600080fd5b505161016052505060001960025550506001600160601b031960609190911b16610180525060805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205161014051610160516101805160601c6113bc62000470600039806102df5280610c505280610d0d52508061083752508061081652508061079952806108835250806103a85280610563528061063e5280610a725250806104475280610727525080610979525080610dea5280610ee7525080610c2e5280610cce52506113bc6000f3fe6080604052600436106100d25760003560e01c806383f5c39b1161007f578063ab8f094511610059578063ab8f094514610265578063c2c4c5c11461027a578063cd6dc68714610282578063d34fb267146102c8576100d2565b806383f5c39b146102265780639c868ac01461023b5780639f86767114610250576100d2565b806314e956f5116100b057806314e956f5146101935780631b88094d146101bd5780634b820093146101d2576100d2565b806304ceb300146100d7578063094007071461011557806310d3eb0414610167575b600080fd5b3480156100e357600080fd5b506100ec6102dd565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561012157600080fd5b506101556004803603602081101561013857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610302565b60408051918252519081900360200190f35b34801561017357600080fd5b506101916004803603602081101561018a57600080fd5b5035610390565b005b34801561019f57600080fd5b50610155600480360360208110156101b657600080fd5b5035610440565b3480156101c957600080fd5b506100ec61050e565b3480156101de57600080fd5b50610212600480360360208110156101f557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661052a565b604080519115158252519081900360200190f35b34801561023257600080fd5b50610155610530565b34801561024757600080fd5b50610212610536565b34801561025c57600080fd5b5061015561053f565b34801561027157600080fd5b5061019161054b565b61021261061c565b34801561028e57600080fd5b50610191600480360360408110156102a557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610a09565b3480156102d457600080fd5b50610191610a5a565b7f00000000000000000000000000000000000000000000000000000000000000005b90565b600073ffffffffffffffffffffffffffffffffffffffff8216301461038857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060045490565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461043457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b61043d81610b28565b50565b60006105087f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9430856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b1580156104d457600080fd5b505afa1580156104e8573d6000803e3d6000fd5b505050506040513d60208110156104fe57600080fd5b5051600654610bc4565b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff1690565b50600190565b60065490565b60055460ff1690565b670de0b6b3a764000081565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146105ef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610626610bd0565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106ca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b60025460006106d7610be9565b9050808210156109fb57604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b15801561076e57600080fd5b505af1158015610782573d6000803e3d6000fd5b5050600180546003549590910194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff0181101561090e57848111156107d35761090e565b62093a8081026000806107e583610440565b90508285101580156107fb57508262093a800185105b156108b457828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000089028161085f57fe5b04975062093a80819003670de0b6b3a7640000838a02820260018b905560038990557f000000000000000000000000000000000000000000000000000000000000000090980197049390930192506108c99050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a2509390930192506001016107bb565b5060028490556004805483019055811580159061092e575060055460ff16155b156109f757604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b1580156109c157600080fd5b505af11580156109d5573d6000803e3d6000fd5b505050506040513d60208110156109eb57600080fd5b506109f7905082610c14565b5050505b6001925050506102ff610d70565b610a1281610d77565b50600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610afe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b670de0b6b3a7640000811115610b89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061132f6034913960400191505060405180910390fd5b60068190556040805182815290517f13e45870490f54cea50d245930d12102c72b502641ef6850d0b15a8c92decfb29181900360200190a150565b80820390821102900390565b610be260026000541415610190610f89565b6002600055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b610c7573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083610f97565b600754604080517fcd58657900000000000000000000000000000000000000000000000000000000815260016004820181905273ffffffffffffffffffffffffffffffffffffffff9384166024830152604482018590527f000000000000000000000000000000000000000000000000000000000000000084166064830152608482015260c060a4820152600060c4820181905291517f00000000000000000000000000000000000000000000000000000000000000009093169263cd586579926101048084019391929182900301818387803b158015610d5557600080fd5b505af1158015610d69573d6000803e3d6000fd5b5050505050565b6001600055565b60025415610de657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e4e57600080fd5b505afa158015610e62573d6000803e3d6000fd5b505050506040513d6020811015610e7857600080fd5b5051905080610ed2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806113636024913960400191505060405180910390fd5b6001819055610edf610be9565b6002819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f4d57600080fd5b505af1158015610f61573d6000803e3d6000fd5b505050506040513d6020811015610f7757600080fd5b5051600355610f8582610b28565b5050565b81610f8557610f858161116d565b80158015906110465750604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561101757600080fd5b505afa15801561102b573d6000803e3d6000fd5b505050506040513d602081101561104157600080fd5b505115155b156110db576040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260006044808301919091528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b3000000000000000000000000000000000000000000000000000000001790526110db908490611197565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052611168908490611197565b505050565b61043d817f42414c00000000000000000000000000000000000000000000000000000000006112b3565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b6020831061120057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016111c3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611262576040519150601f19603f3d011682016040523d82523d6000602084013e611267565b606091505b5091509150600082141561127f573d6000803e3d6000fd5b6112ad8151600014806112a557508180602001905160208110156112a257600080fd5b50515b6101a2610f89565b50505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fdfe52656c61746976652077656967687420636170206578636565647320616c6c6f776564206162736f6c757465206d6178696d756d42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a2646970667358221220ff87d3f6529e214ae10e74f09edca6d55e7e97e0f7b3ba32db1de4587a3df7f064736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80630ecaea731461004657806339312dee1461006f578063ce3cc8bd14610077575b600080fd5b610059610054366004610322565b610097565b604051610066919061034c565b60405180910390f35b610059610135565b61008a610085366004610300565b610151565b6040516100669190610393565b6000806100a2610180565b6040517fcd6dc68700000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063cd6dc687906100f9908790879060040161036d565b600060405180830381600087803b15801561011357600080fd5b505af1158015610127573d6000803e3d6000fd5b509293505050505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff165b919050565b6000805481906101a59073ffffffffffffffffffffffffffffffffffffffff16610226565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff811661017b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d39061039e565b60405180910390fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461012f57600080fd5b600060208284031215610311578081fd5b61031b83836102dc565b9392505050565b60008060408385031215610334578081fd5b61033e84846102dc565b946020939093013593505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b60208082526016908201527f455243313136373a20637265617465206661696c65640000000000000000000060408201526060019056fea26469706673582212206d28cb93712f916bae7423a12b5a44e46e98762ec554d8e16a12c449c58ea48964736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230526-zkevm-root-gauge-factory/index.ts b/balpy/balancer-deployments/tasks/20230526-zkevm-root-gauge-factory/index.ts new file mode 100644 index 0000000..7ba83cb --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-zkevm-root-gauge-factory/index.ts @@ -0,0 +1,14 @@ +import { Task, TaskRunOptions } from '@src'; +import { PolygonZkEVMRootGaugeFactoryDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as PolygonZkEVMRootGaugeFactoryDeployment; + + const args = [input.BalancerMinter, input.PolygonZkEVMBridge]; + + const factory = await task.deployAndVerify('PolygonZkEVMRootGaugeFactory', args, from, force); + + const implementation = await factory.getGaugeImplementation(); + await task.verify('PolygonZkEVMRootGauge', implementation, [input.BalancerMinter, input.PolygonZkEVMBridge]); + await task.save({ PolygonZkEVMRootGauge: implementation }); +}; diff --git a/balpy/balancer-deployments/tasks/20230526-zkevm-root-gauge-factory/input.ts b/balpy/balancer-deployments/tasks/20230526-zkevm-root-gauge-factory/input.ts new file mode 100644 index 0000000..7d8eb9a --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-zkevm-root-gauge-factory/input.ts @@ -0,0 +1,15 @@ +import { Task, TaskMode } from '@src'; + +export type PolygonZkEVMRootGaugeFactoryDeployment = { + BalancerMinter: string; + PolygonZkEVMBridge: string; +}; + +const BalancerMinter = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); + +export default { + mainnet: { + BalancerMinter, + PolygonZkEVMBridge: '0x2a3dd3eb832af982ec71669e178424b10dca2ede', + }, +}; diff --git a/balpy/balancer-deployments/tasks/20230526-zkevm-root-gauge-factory/output/mainnet.json b/balpy/balancer-deployments/tasks/20230526-zkevm-root-gauge-factory/output/mainnet.json new file mode 100644 index 0000000..1bf70e1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-zkevm-root-gauge-factory/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "PolygonZkEVMRootGaugeFactory": "0x9bF951848288cCD87d06FaC426150262cD3447De", + "PolygonZkEVMRootGauge": "0x45bF48D996d22afc9BC150DF7FB4d13A49088602" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230526-zkevm-root-gauge-factory/readme.md b/balpy/balancer-deployments/tasks/20230526-zkevm-root-gauge-factory/readme.md new file mode 100644 index 0000000..792401e --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-zkevm-root-gauge-factory/readme.md @@ -0,0 +1,8 @@ +# 2023-05-26 - Polygon zkEVM Root Gauge Factory + +Deployment of the `PolygonZkEVMRootGaugeFactory`, for stakeless gauges that bridge funds to their Polygon zkEVM counterparts. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [`PolygonZkEVMRootGaugeFactory` artifact](./artifact/PolygonZkEVMRootGaugeFactory.json) diff --git a/balpy/balancer-deployments/tasks/20230526-zkevm-root-gauge-factory/test/task.fork.ts b/balpy/balancer-deployments/tasks/20230526-zkevm-root-gauge-factory/test/task.fork.ts new file mode 100644 index 0000000..8f88e10 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230526-zkevm-root-gauge-factory/test/task.fork.ts @@ -0,0 +1,277 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import { BigNumber, fp, FP_ONE } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { advanceTime, currentTimestamp, currentWeekTimestamp, DAY, MONTH, WEEK } from '@helpers/time'; +import * as expectEvent from '@helpers/expectEvent'; + +import { expectEqualWithError } from '@helpers/relativeError'; +import { MAX_UINT256, ZERO_ADDRESS } from '@helpers/constants'; +import { range } from 'lodash'; +import { expectTransferEvent } from '@helpers/expectTransfer'; +import { actionId } from '@helpers/models/misc/actions'; + +import { describeForkTest, getSigner, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; +import { WeightedPoolEncoder } from '@helpers/models/pools/weighted/encoder'; + +describeForkTest('PolygonZkEVMRootGaugeFactory', 'mainnet', 17268518, function () { + let veBALHolder: SignerWithAddress, admin: SignerWithAddress, recipient: SignerWithAddress; + let factory: Contract, gauge: Contract; + let vault: Contract, + authorizer: Contract, + adaptorEntrypoint: Contract, + BALTokenAdmin: Contract, + gaugeController: Contract, + gaugeAdder: Contract, + veBAL: Contract, + bal80weth20Pool: Contract; + let BAL: string; + + let task: Task; + + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + const VEBAL_POOL = '0x5c6ee304399dbdb9c8ef030ab642b10820db8f56'; + const VAULT_BOUNTY = fp(1000); + + const weightCap = fp(0.001); + + const POLYGON_ZKEVM_NETWORK_ID = 1; + const bridgeInterface = new ethers.utils.Interface([ + 'event BridgeEvent(uint8 leafType, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata, uint32 depositCount)', + ]); + + before('run task', async () => { + task = new Task('20230526-zkevm-root-gauge-factory', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('PolygonZkEVMRootGaugeFactory'); + }); + + before('advance time', async () => { + // This causes all voting cooldowns to expire, letting the veBAL holder vote again + await advanceTime(DAY * 12); + }); + + before('setup accounts', async () => { + admin = await getSigner(0); + recipient = await getSigner(1); + + //veBALHolder = await impersonate(VEBAL_HOLDER); + veBALHolder = await impersonate((await getSigner(2)).address, VAULT_BOUNTY.add(fp(5))); // plus gas + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.deployedInstance('Vault'); + + // Need to get the original Authorizer (getting it from the Vault at this block will yield the AuthorizerWithAdaptorValidation) + const authorizerTask = new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizer = await authorizerTask.deployedInstance('Authorizer'); + + const adaptorEntrypointTask = new Task('20221124-authorizer-adaptor-entrypoint', TaskMode.READ_ONLY, 'mainnet'); + adaptorEntrypoint = await adaptorEntrypointTask.deployedInstance('AuthorizerAdaptorEntrypoint'); + + const gaugeAdderTask = new Task('20230109-gauge-adder-v3', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeAdder = await gaugeAdderTask.deployedInstance('GaugeAdder'); + + const balancerTokenAdminTask = new Task('20220325-balancer-token-admin', TaskMode.READ_ONLY, getForkedNetwork(hre)); + BALTokenAdmin = await balancerTokenAdminTask.deployedInstance('BalancerTokenAdmin'); + + BAL = await BALTokenAdmin.getBalancerToken(); + + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeController = await gaugeControllerTask.deployedInstance('GaugeController'); + veBAL = await gaugeControllerTask.instanceAt( + 'VotingEscrow', + gaugeControllerTask.output({ network: 'mainnet' }).VotingEscrow + ); + + const weightedPoolTask = new Task('20210418-weighted-pool', TaskMode.READ_ONLY, getForkedNetwork(hre)); + bal80weth20Pool = await weightedPoolTask.instanceAt('WeightedPool2Tokens', VEBAL_POOL); + }); + + before('create veBAL whale', async () => { + const poolId = await bal80weth20Pool.getPoolId(); + + await vault.connect(veBALHolder).joinPool( + poolId, + veBALHolder.address, + veBALHolder.address, + { + assets: [BAL, ZERO_ADDRESS], + maxAmountsIn: [0, VAULT_BOUNTY], + fromInternalBalance: false, + userData: WeightedPoolEncoder.joinExactTokensInForBPTOut([0, VAULT_BOUNTY], 0), + }, + { value: VAULT_BOUNTY } + ); + + await bal80weth20Pool.connect(veBALHolder).approve(veBAL.address, MAX_UINT256); + const currentTime = await currentTimestamp(); + await veBAL + .connect(veBALHolder) + .create_lock(await bal80weth20Pool.balanceOf(veBALHolder.address), currentTime.add(MONTH * 12)); + }); + + it('create gauge', async () => { + const tx = await factory.create(recipient.address, weightCap); + const event = expectEvent.inReceipt(await tx.wait(), 'GaugeCreated'); + + gauge = await task.instanceAt('PolygonZkEVMRootGauge', event.args.gauge); + + expect(await factory.isGaugeFromFactory(gauge.address)).to.be.true; + }); + + it('grant permissions', async () => { + // We need to grant permission to the admin to add the factory to the GaugeAdder, and also to then add + // gauges from said factory to the GaugeController. The type doesn't really matter; just using Polygon. + const govMultisig = await impersonate(GOV_MULTISIG); + + await Promise.all( + ['addGaugeFactory', 'addPolygonGauge'].map( + async (method) => + await authorizer.connect(govMultisig).grantRole(await actionId(gaugeAdder, method), admin.address) + ) + ); + + // We also need to grant permissions to mint in the gauges, which is done via the Authorizer Adaptor Entrypoint + await authorizer + .connect(govMultisig) + .grantRole(await adaptorEntrypoint.getActionId(gauge.interface.getSighash('checkpoint')), admin.address); + }); + + it('add gauge to gauge controller', async () => { + await gaugeAdder.connect(admin).addGaugeFactory(factory.address, 3); // Polygon is Gauge Type 3 + await gaugeAdder.connect(admin).addPolygonGauge(gauge.address); + + expect(await gaugeController.gauge_exists(gauge.address)).to.be.true; + }); + + it('vote for gauge', async () => { + expect(await gaugeController.get_gauge_weight(gauge.address)).to.equal(0); + expect(await gauge.getCappedRelativeWeight(await currentTimestamp())).to.equal(0); + + await gaugeController.connect(veBALHolder).vote_for_gauge_weights(gauge.address, 10000); // Max voting power is 10k points + + // We now need to go through an epoch for the votes to be locked in + await advanceTime(DAY * 8); + + await gaugeController.checkpoint(); + // Gauge weight is equal to the cap, and controller weight for the gauge is greater than the cap. + expect( + await gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, await currentWeekTimestamp()) + ).to.be.gt(weightCap); + expect(await gauge.getCappedRelativeWeight(await currentTimestamp())).to.equal(weightCap); + }); + + it('mint & bridge tokens', async () => { + // The gauge has votes for this week, and it will mint the first batch of tokens. We store the current gauge + // relative weight, as it will change as time goes by due to vote decay. + const firstMintWeekTimestamp = await currentWeekTimestamp(); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + + // Even though the gauge has relative weight, it cannot mint yet as it needs for the epoch to finish + const zeroMintTx = await adaptorEntrypoint.connect(admin).performAction(gauge.address, calldata); + expectEvent.inIndirectReceipt(await zeroMintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp.sub(WEEK), // Process past week, which had zero votes + periodEmissions: 0, + }); + // No token transfers are performed if the emissions are zero, but we can't test for a lack of those + + await advanceTime(WEEK); + + // The gauge should now mint and send all minted tokens to the Polygon ZkEVM bridge + const mintTx = await adaptorEntrypoint.connect(admin).performAction(gauge.address, calldata); + const event = expectEvent.inIndirectReceipt(await mintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp, + }); + const actualEmissions = event.args.periodEmissions; + + // The amount of tokens minted should equal the weekly emissions rate times the relative weight of the gauge + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + + // Note that instead of the weight, we use the cap (since we expect for the weight to be larger than the cap) + const expectedEmissions = weightCap.mul(weeklyRate).div(FP_ONE); + expectEqualWithError(actualEmissions, expectedEmissions, 0.001); + + // Tokens are minted for the gauge + expectTransferEvent( + await mintTx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + value: actualEmissions, + }, + BAL + ); + + // And the gauge then deposits those in the predicate via the bridge mechanism + expectEvent.inIndirectReceipt(await mintTx.wait(), bridgeInterface, 'BridgeEvent', { + originAddress: BAL, + destinationNetwork: POLYGON_ZKEVM_NETWORK_ID, + destinationAddress: recipient.address, + amount: actualEmissions, + }); + }); + + it('mint multiple weeks', async () => { + const numberOfWeeks = 5; + await advanceTime(WEEK * numberOfWeeks); + await gaugeController.checkpoint_gauge(gauge.address); + + const weekTimestamp = await currentWeekTimestamp(); + + // We can query the relative weight of the gauge for each of the weeks that have passed + const relativeWeights: BigNumber[] = await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, weekTimestamp.sub(WEEK * weekIndex)) + ) + ); + + // We require that they're all above the cap for simplicity - this lets us use the cap as each week's weight (and + // also tests cap behavior). + for (const relativeWeight of relativeWeights) { + expect(relativeWeight).to.be.gt(weightCap); + } + + // The amount of tokens allocated to the gauge should equal the sum of the weekly emissions rate times the weight + // cap. + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + // Note that instead of the weight, we use the cap (since we expect for the weight to be larger than the cap) + const expectedEmissions = weightCap.mul(numberOfWeeks).mul(weeklyRate).div(FP_ONE); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + const tx = await adaptorEntrypoint.connect(admin).performAction(gauge.address, calldata); + + await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + expectEvent.inIndirectReceipt(await tx.wait(), gauge.interface, 'Checkpoint', { + periodTime: weekTimestamp.sub(WEEK * weekIndex), + }) + ) + ); + + // Tokens are minted for the gauge + const transferEvent = expectTransferEvent( + await tx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + }, + BAL + ); + + expect(transferEvent.args.value).to.be.almostEqual(expectedEmissions); + + // And the gauge then deposits those in the predicate via the bridge mechanism + const depositEvent = expectEvent.inIndirectReceipt(await tx.wait(), bridgeInterface, 'BridgeEvent', { + originAddress: BAL, + destinationNetwork: POLYGON_ZKEVM_NETWORK_ID, + destinationAddress: recipient.address, + }); + + expect(depositEvent.args.amount).to.be.almostEqual(expectedEmissions); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/artifact/BalancerPoolDataQueries.json b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/artifact/BalancerPoolDataQueries.json new file mode 100644 index 0000000..12906eb --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/artifact/BalancerPoolDataQueries.json @@ -0,0 +1,456 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BalancerPoolDataQueries", + "sourceName": "contracts/BalancerPoolDataQueries.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "_vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "poolAddresses", + "type": "address[]" + } + ], + "name": "getAmpForPools", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "poolAddresses", + "type": "address[]" + } + ], + "name": "getInRecoveryModeForPools", + "outputs": [ + { + "internalType": "bool[]", + "name": "", + "type": "bool[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "poolAddresses", + "type": "address[]" + } + ], + "name": "getIsPausedForPools", + "outputs": [ + { + "internalType": "bool[]", + "name": "", + "type": "bool[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "poolAddresses", + "type": "address[]" + } + ], + "name": "getLinearTargetsForPools", + "outputs": [ + { + "internalType": "uint256[][]", + "name": "", + "type": "uint256[][]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "poolAddresses", + "type": "address[]" + } + ], + "name": "getNormalizedWeightsForPools", + "outputs": [ + { + "internalType": "uint256[][]", + "name": "", + "type": "uint256[][]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "poolIds", + "type": "bytes32[]" + }, + { + "components": [ + { + "internalType": "bool", + "name": "loadTokenBalanceUpdatesAfterBlock", + "type": "bool" + }, + { + "internalType": "bool", + "name": "loadTotalSupply", + "type": "bool" + }, + { + "internalType": "bool", + "name": "loadSwapFees", + "type": "bool" + }, + { + "internalType": "bool", + "name": "loadLinearWrappedTokenRates", + "type": "bool" + }, + { + "internalType": "bool", + "name": "loadLinearTargets", + "type": "bool" + }, + { + "internalType": "bool", + "name": "loadNormalizedWeights", + "type": "bool" + }, + { + "internalType": "bool", + "name": "loadScalingFactors", + "type": "bool" + }, + { + "internalType": "bool", + "name": "loadAmps", + "type": "bool" + }, + { + "internalType": "bool", + "name": "loadRates", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "enum TotalSupplyType[]", + "name": "totalSupplyTypes", + "type": "uint8[]" + }, + { + "internalType": "enum SwapFeeType[]", + "name": "swapFeeTypes", + "type": "uint8[]" + }, + { + "internalType": "uint256[]", + "name": "linearPoolIdxs", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "weightedPoolIdxs", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "scalingFactorPoolIdxs", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "ampPoolIdxs", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "ratePoolIdxs", + "type": "uint256[]" + } + ], + "internalType": "struct PoolDataQueryConfig", + "name": "config", + "type": "tuple" + } + ], + "name": "getPoolData", + "outputs": [ + { + "internalType": "uint256[][]", + "name": "balances", + "type": "uint256[][]" + }, + { + "internalType": "uint256[]", + "name": "totalSupplies", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "swapFees", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "linearWrappedTokenRates", + "type": "uint256[]" + }, + { + "internalType": "uint256[][]", + "name": "linearTargets", + "type": "uint256[][]" + }, + { + "internalType": "uint256[][]", + "name": "weights", + "type": "uint256[][]" + }, + { + "internalType": "uint256[][]", + "name": "scalingFactors", + "type": "uint256[][]" + }, + { + "internalType": "uint256[]", + "name": "amps", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "rates", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "ignoreIdxs", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "poolIds", + "type": "bytes32[]" + }, + { + "components": [ + { + "internalType": "bool", + "name": "loadInRecoveryMode", + "type": "bool" + }, + { + "internalType": "bool", + "name": "loadIsPaused", + "type": "bool" + } + ], + "internalType": "struct PoolStatusQueryConfig", + "name": "config", + "type": "tuple" + } + ], + "name": "getPoolStatus", + "outputs": [ + { + "internalType": "bool[]", + "name": "isPaused", + "type": "bool[]" + }, + { + "internalType": "bool[]", + "name": "inRecoveryMode", + "type": "bool[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "poolIds", + "type": "bytes32[]" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "name": "getPoolTokenBalancesWithUpdatesAfterBlock", + "outputs": [ + { + "internalType": "uint256[][]", + "name": "", + "type": "uint256[][]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "poolAddresses", + "type": "address[]" + } + ], + "name": "getRateForPools", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "poolAddresses", + "type": "address[]" + } + ], + "name": "getScalingFactorsForPools", + "outputs": [ + { + "internalType": "uint256[][]", + "name": "", + "type": "uint256[][]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "poolAddresses", + "type": "address[]" + }, + { + "internalType": "enum SwapFeeType[]", + "name": "swapFeeTypes", + "type": "uint8[]" + } + ], + "name": "getSwapFeePercentageForPools", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "poolAddresses", + "type": "address[]" + }, + { + "internalType": "enum TotalSupplyType[]", + "name": "totalSupplyTypes", + "type": "uint8[]" + } + ], + "name": "getTotalSupplyForPools", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "poolAddresses", + "type": "address[]" + } + ], + "name": "getWrappedTokenRateForLinearPools", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "vault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a06040523480156200001157600080fd5b50604051620028ef380380620028ef83398101604081905262000034916200004a565b60601b6001600160601b0319166080526200007a565b6000602082840312156200005c578081fd5b81516001600160a01b038116811462000073578182fd5b9392505050565b60805160601c612848620000a76000398061056352806107045280610d1452806113cb52506128486000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063b3a460011161008c578063ecfb5a7c11610066578063ecfb5a7c146101eb578063ed5017f6146101fe578063fbfa77cf14610227578063fd4363781461023c576100ea565b8063b3a46001146101b2578063b4a9f0c8146101c5578063c4fb0f82146101d8576100ea565b8063716bb27a116100c8578063716bb27a1461014c5780637b2de5331461016c578063828f7c7d1461017f57806396ebd93414610192576100ea565b806304013a7d146100ef57806317615f32146101185780634b3dcc1e1461012b575b600080fd5b6101026100fd366004611ff9565b61024f565b60405161010f919061274e565b60405180910390f35b610102610126366004611fbe565b61046f565b61013e6101393660046122d4565b610507565b60405161010f929190612720565b61015f61015a366004612356565b6106a0565b60405161010f919061261f565b61010261017a366004611fbe565b6107fb565b61015f61018d366004611fbe565b61088a565b6101a56101a0366004611fbe565b610923565b60405161010f919061270d565b61015f6101c0366004611fbe565b6109b7565b6101026101d336600461205a565b610a50565b6101026101e6366004611fbe565b610b84565b61015f6101f9366004611fbe565b610c13565b61021161020c3660046120b1565b610cac565b60405161010f9a99989796959493929190612632565b61022f6113c9565b60405161010f919061276a565b6101a561024a366004611fbe565b6113ed565b606080835167ffffffffffffffff8111801561026a57600080fd5b50604051908082528060200260200182016040528015610294578160200160208202803683370190505b50905060005b84518110156104655760018482815181106102b157fe5b602002602001015160018111156102c457fe5b1415610396578481815181106102d657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16634c1a41156040518163ffffffff1660e01b815260040160206040518083038186803b15801561032357600080fd5b505afa925050508015610353575060408051601f3d908101601f19168201909252610350918101906124f1565b60015b61037657600082828151811061036557fe5b602002602001018181525050610391565b8083838151811061038357fe5b602002602001018181525050505b61045d565b8481815181106103a257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166355c676286040518163ffffffff1660e01b815260040160206040518083038186803b1580156103ef57600080fd5b505afa92505050801561041f575060408051601f3d908101601f1916820190925261041c918101906124f1565b60015b61044257600082828151811061043157fe5b60200260200101818152505061045d565b8083838151811061044f57fe5b602002602001018181525050505b60010161029a565b5090505b92915050565b606080825167ffffffffffffffff8111801561048a57600080fd5b506040519080825280602002602001820160405280156104b4578160200160208202803683370190505b50905060005b83518110156104fe576104df8482815181106104d257fe5b6020026020010151611481565b8282815181106104eb57fe5b60209081029190910101526001016104ba565b5090505b919050565b60608060006060855167ffffffffffffffff8111801561052657600080fd5b50604051908082528060200260200182016040528015610550578160200160208202803683370190505b509050600091505b855182101561066e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f6c009278784815181106105a957fe5b60200260200101516040518263ffffffff1660e01b81526004016105cd9190612761565b604080518083038186803b1580156105e457600080fd5b505afa1580156105f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061c9190611f85565b5081838151811061062957fe5b602002602001018173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250508180600101925050610558565b84602001511561068457610681816113ed565b93505b8451156106975761069481610923565b92505b50509250929050565b60608060006060855167ffffffffffffffff811180156106bf57600080fd5b506040519080825280602002602001820160405280156106f357816020015b60608152602001906001900390816106de5790505b50905060005b86518110156107f1577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f94d466888838151811061074a57fe5b60200260200101516040518263ffffffff1660e01b815260040161076e9190612761565b60006040518083038186803b15801561078657600080fd5b505afa15801561079a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107c29190810190612399565b909550935050858311156107e957838282815181106107dd57fe5b60200260200101819052505b6001016106f9565b5095945050505050565b606080825167ffffffffffffffff8111801561081657600080fd5b50604051908082528060200260200182016040528015610840578160200160208202803683370190505b50905060005b83518110156104fe5761086b84828151811061085e57fe5b602002602001015161150c565b82828151811061087757fe5b6020908102919091010152600101610846565b606080825167ffffffffffffffff811180156108a557600080fd5b506040519080825280602002602001820160405280156108d957816020015b60608152602001906001900390816108c45790505b50905060005b83518110156104fe576109048482815181106108f757fe5b602002602001015161159b565b82828151811061091057fe5b60209081029190910101526001016108df565b606080825167ffffffffffffffff8111801561093e57600080fd5b50604051908082528060200260200182016040528015610968578160200160208202803683370190505b50905060005b83518110156104fe5761099384828151811061098657fe5b6020026020010151611631565b82828151811061099f57fe5b9115156020928302919091019091015260010161096e565b606080825167ffffffffffffffff811180156109d257600080fd5b50604051908082528060200260200182016040528015610a0657816020015b60608152602001906001900390816109f15790505b50905060005b83518110156104fe57610a31848281518110610a2457fe5b60200260200101516116a6565b828281518110610a3d57fe5b6020908102919091010152600101610a0c565b606080835167ffffffffffffffff81118015610a6b57600080fd5b50604051908082528060200260200182016040528015610a95578160200160208202803683370190505b50905060005b8451811015610465576001848281518110610ab257fe5b60200260200101516002811115610ac557fe5b1415610b0457610ae7858281518110610ada57fe5b60200260200101516116ee565b828281518110610af357fe5b602002602001018181525050610b7c565b6002848281518110610b1257fe5b60200260200101516002811115610b2557fe5b1415610b4757610ae7858281518110610b3a57fe5b6020026020010151611736565b610b63858281518110610b5657fe5b602002602001015161177e565b828281518110610b6f57fe5b6020026020010181815250505b600101610a9b565b606080825167ffffffffffffffff81118015610b9f57600080fd5b50604051908082528060200260200182016040528015610bc9578160200160208202803683370190505b50905060005b83518110156104fe57610bf4848281518110610be757fe5b60200260200101516117c6565b828281518110610c0057fe5b6020908102919091010152600101610bcf565b606080825167ffffffffffffffff81118015610c2e57600080fd5b50604051908082528060200260200182016040528015610c6257816020015b6060815260200190600190039081610c4d5790505b50905060005b83518110156104fe57610c8d848281518110610c8057fe5b602002602001015161180e565b828281518110610c9957fe5b6020908102919091010152600101610c68565b606080606080606080606080606080600060608d5167ffffffffffffffff81118015610cd757600080fd5b50604051908082528060200260200182016040528015610d01578160200160208202803683370190505b509050600091505b8d51821015610e1f577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f6c009278f8481518110610d5a57fe5b60200260200101516040518263ffffffff1660e01b8152600401610d7e9190612761565b604080518083038186803b158015610d9557600080fd5b505afa158015610da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcd9190611f85565b50818381518110610dda57fe5b602002602001018173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250508180600101925050610d09565b8c5115610e3857610e358e8e61012001516106a0565b9b505b8c6020015115610e5457610e51818e6101400151610a50565b9a505b8c6040015115610e7057610e6d818e610160015161024f565b99505b8c6060015115610f4e5760608d61018001515167ffffffffffffffff81118015610e9957600080fd5b50604051908082528060200260200182016040528015610ec3578160200160208202803683370190505b509050600092505b8d610180015151831015610f4157818e61018001518481518110610eeb57fe5b602002602001015181518110610efd57fe5b6020026020010151818481518110610f1157fe5b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600190920191610ecb565b610f4a8161046f565b9950505b8c60a001511561102c5760608d6101a001515167ffffffffffffffff81118015610f7757600080fd5b50604051908082528060200260200182016040528015610fa1578160200160208202803683370190505b509050600092505b8d6101a001515183101561101f57818e6101a001518481518110610fc957fe5b602002602001015181518110610fdb57fe5b6020026020010151818481518110610fef57fe5b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600190920191610fa9565b611028816109b7565b9750505b8c60c001511561110a5760608d6101c001515167ffffffffffffffff8111801561105557600080fd5b5060405190808252806020026020018201604052801561107f578160200160208202803683370190505b509050600092505b8d6101c00151518310156110fd57818e6101c0015184815181106110a757fe5b6020026020010151815181106110b957fe5b60200260200101518184815181106110cd57fe5b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600190920191611087565b6111068161088a565b9650505b8c60e00151156111e85760608d6101e001515167ffffffffffffffff8111801561113357600080fd5b5060405190808252806020026020018201604052801561115d578160200160208202803683370190505b509050600092505b8d6101e00151518310156111db57818e6101e00151848151811061118557fe5b60200260200101518151811061119757fe5b60200260200101518184815181106111ab57fe5b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600190920191611165565b6111e4816107fb565b9550505b8c6101000151156112c75760608d61020001515167ffffffffffffffff8111801561121257600080fd5b5060405190808252806020026020018201604052801561123c578160200160208202803683370190505b509050600092505b8d6102000151518310156112ba57818e6102000151848151811061126457fe5b60200260200101518151811061127657fe5b602002602001015181848151811061128a57fe5b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600190920191611244565b6112c381610b84565b9450505b8c60800151156113a55760608d61018001515167ffffffffffffffff811180156112f057600080fd5b5060405190808252806020026020018201604052801561131a578160200160208202803683370190505b509050600092505b8d61018001515183101561139857818e6101800151848151811061134257fe5b60200260200101518151811061135457fe5b602002602001015181848151811061136857fe5b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600190920191611322565b6113a181610c13565b9850505b6113b68e8e8d8d8d8a8a8d8f6118e5565b925050509295989b9194979a5092959850565b7f000000000000000000000000000000000000000000000000000000000000000081565b606080825167ffffffffffffffff8111801561140857600080fd5b50604051908082528060200260200182016040528015611432578160200160208202803683370190505b50905060005b83518110156104fe5761145d84828151811061145057fe5b6020026020010151611cf4565b82828151811061146957fe5b91151560209283029190910190910152600101611438565b60008173ffffffffffffffffffffffffffffffffffffffff1663f5431aa86040518163ffffffff1660e01b815260040160206040518083038186803b1580156114c957600080fd5b505afa9250505080156114f9575060408051601f3d908101601f191682019092526114f6918101906124f1565b60015b61150557506000610502565b9050610502565b60008173ffffffffffffffffffffffffffffffffffffffff16636daccffa6040518163ffffffff1660e01b815260040160606040518083038186803b15801561155457600080fd5b505afa925050508015611584575060408051601f3d908101601f1916820190925261158191810190612509565b60015b61159057506000610502565b829350505050610502565b60608173ffffffffffffffffffffffffffffffffffffffff16631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b1580156115e357600080fd5b505afa92505050801561161857506040513d6000823e601f3d908101601f191682016040526116159190810190612465565b60015b6115055750604080516000815260208101909152610502565b60008173ffffffffffffffffffffffffffffffffffffffff1663b35056b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561167957600080fd5b505afa9250505080156114f9575060408051601f3d908101601f191682019092526114f691810190612498565b60608173ffffffffffffffffffffffffffffffffffffffff1663f89f27ed6040518163ffffffff1660e01b815260040160006040518083038186803b1580156115e357600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663de82cd346040518163ffffffff1660e01b815260040160206040518083038186803b1580156114c957600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663876f303b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114c957600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114c957600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114c957600080fd5b6040805160028082526060808301845292839291906020830190803683370190505090508273ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561187757600080fd5b505afa15801561188b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118af9190612541565b826000815181106118bc57fe5b60200260200101836001815181106118d057fe5b60209081029190910101919091525292915050565b6060808a5167ffffffffffffffff8111801561190057600080fd5b5060405190808252806020026020018201604052801561192a578160200160208202803683370190505b5090506000805b8c518110156119b4578b60200151801561195e57508a818151811061195257fe5b60200260200101516000145b8061198857508b604001518015611988575089818151811061197c57fe5b60200260200101516000145b156119ac57600183828151811061199b57fe5b911515602092830291909101909101525b600101611931565b8b6060015115611a2b575060005b8b610180015151811015611a2b578881815181106119dc57fe5b602002602001015160001415611a23576001838d61018001518381518110611a0057fe5b602002602001015181518110611a1257fe5b911515602092830291909101909101525b6001016119c2565b8b60e0015115611aa2575060005b8b6101e0015151811015611aa257878181518110611a5357fe5b602002602001015160001415611a9a576001838d6101e001518381518110611a7757fe5b602002602001015181518110611a8957fe5b911515602092830291909101909101525b600101611a39565b8b610100015115611b1a575060005b8b610200015151811015611b1a57868181518110611acb57fe5b602002602001015160001415611b12576001838d61020001518381518110611aef57fe5b602002602001015181518110611b0157fe5b911515602092830291909101909101525b600101611ab1565b8b60c0015115611b92575060005b8b6101c0015151811015611b9257858181518110611b4257fe5b60200260200101515160001415611b8a576001838d6101c001518381518110611b6757fe5b602002602001015181518110611b7957fe5b911515602092830291909101909101525b600101611b28565b8b60a0015115611c0a575060005b8b6101a0015151811015611c0a57848181518110611bba57fe5b60200260200101515160001415611c02576001838d6101a001518381518110611bdf57fe5b602002602001015181518110611bf157fe5b911515602092830291909101909101525b600101611ba0565b5060005b8251811015611c4657828181518110611c2357fe5b60200260200101511515600115151415611c3e576001909101905b600101611c0e565b60608267ffffffffffffffff81118015611c5f57600080fd5b50604051908082528060200260200182016040528015611c89578160200160208202803683370190505b50905060008092505b8451831015611ce257848381518110611ca757fe5b60200260200101511515600115151415611cd75782828281518110611cc857fe5b60209081029190910101526001015b600190920191611c92565b509d9c50505050505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16631c0de0516040518163ffffffff1660e01b815260040160606040518083038186803b158015611d3c57600080fd5b505afa925050508015611584575060408051601f3d908101601f19168201909252611581918101906124bb565b600082601f830112611d79578081fd5b8135611d8c611d87826127b2565b61278b565b818152915060208083019084810181840286018201871015611dad57600080fd5b60005b84811015611dd5578135611dc3816127d2565b84529282019290820190600101611db0565b505050505092915050565b600082601f830112611df0578081fd5b8135611dfe611d87826127b2565b818152915060208083019084810181840286018201871015611e1f57600080fd5b60005b84811015611dd557813584529282019290820190600101611e22565b600082601f830112611e4e578081fd5b8135611e5c611d87826127b2565b818152915060208083019084810181840286018201871015611e7d57600080fd5b6000805b85811015611ea957823560028110611e97578283fd5b85529383019391830191600101611e81565b50505050505092915050565b600082601f830112611ec5578081fd5b8135611ed3611d87826127b2565b818152915060208083019084810181840286018201871015611ef457600080fd5b60005b84811015611dd5578135611f0a81612805565b84529282019290820190600101611ef7565b600082601f830112611f2c578081fd5b8151611f3a611d87826127b2565b818152915060208083019084810181840286018201871015611f5b57600080fd5b60005b84811015611dd557815184529282019290820190600101611f5e565b8035610469816127f7565b60008060408385031215611f97578182fd5b8251611fa2816127d2565b6020840151909250611fb381612805565b809150509250929050565b600060208284031215611fcf578081fd5b813567ffffffffffffffff811115611fe5578182fd5b611ff184828501611d69565b949350505050565b6000806040838503121561200b578182fd5b823567ffffffffffffffff80821115612022578384fd5b61202e86838701611d69565b93506020850135915080821115612043578283fd5b5061205085828601611e3e565b9150509250929050565b6000806040838503121561206c578182fd5b823567ffffffffffffffff80821115612083578384fd5b61208f86838701611d69565b935060208501359150808211156120a4578283fd5b5061205085828601611eb5565b600080604083850312156120c3578182fd5b823567ffffffffffffffff808211156120da578384fd5b6120e686838701611de0565b935060208501359150808211156120fb578283fd5b8185019150610220808388031215612111578384fd5b61211a8161278b565b90506121268784611f7a565b81526121358760208501611f7a565b60208201526121478760408501611f7a565b60408201526121598760608501611f7a565b606082015261216b8760808501611f7a565b608082015261217d8760a08501611f7a565b60a082015261218f8760c08501611f7a565b60c08201526121a18760e08501611f7a565b60e08201526101006121b588828601611f7a565b90820152610120838101359082015261014080840135838111156121d7578586fd5b6121e389828701611eb5565b82840152505061016080840135838111156121fc578586fd5b61220889828701611e3e565b8284015250506101808084013583811115612221578586fd5b61222d89828701611de0565b8284015250506101a08084013583811115612246578586fd5b61225289828701611de0565b8284015250506101c0808401358381111561226b578586fd5b61227789828701611de0565b8284015250506101e08084013583811115612290578586fd5b61229c89828701611de0565b82840152505061020080840135838111156122b5578586fd5b6122c189828701611de0565b8284015250508093505050509250929050565b60008082840360608112156122e7578283fd5b833567ffffffffffffffff8111156122fd578384fd5b61230986828701611de0565b9350506040601f198201121561231d578182fd5b50612328604061278b565b6020840135612336816127f7565b81526040840135612346816127f7565b6020820152919491935090915050565b60008060408385031215612368578182fd5b823567ffffffffffffffff81111561237e578283fd5b61238a85828601611de0565b95602094909401359450505050565b6000806000606084860312156123ad578081fd5b835167ffffffffffffffff808211156123c4578283fd5b818601915086601f8301126123d7578283fd5b81516123e5611d87826127b2565b80828252602080830192508086018b828387028901011115612405578788fd5b8796505b8487101561243057805161241c816127d2565b845260019690960195928101928101612409565b508901519097509350505080821115612447578283fd5b5061245486828701611f1c565b925050604084015190509250925092565b600060208284031215612476578081fd5b815167ffffffffffffffff81111561248c578182fd5b611ff184828501611f1c565b6000602082840312156124a9578081fd5b81516124b4816127f7565b9392505050565b6000806000606084860312156124cf578081fd5b83516124da816127f7565b602085015160409095015190969495509392505050565b600060208284031215612502578081fd5b5051919050565b60008060006060848603121561251d578081fd5b83519250602084015161252f816127f7565b80925050604084015190509250925092565b60008060408385031215612553578182fd5b505080516020909101519092909150565b6000815180845260208085019450848183028601828601855b858110156125a75783830389526125958383516125f0565b9885019892509084019060010161257d565b5090979650505050505050565b6000815180845260208085019450808401835b838110156125e55781511515875295820195908201906001016125c7565b509495945050505050565b6000815180845260208085019450808401835b838110156125e557815187529582019590820190600101612603565b6000602082526124b46020830184612564565b60006101408083526126468184018e612564565b9050828103602084015261265a818d6125f0565b9050828103604084015261266e818c6125f0565b90508281036060840152612682818b6125f0565b90508281036080840152612696818a612564565b905082810360a08401526126aa8189612564565b905082810360c08401526126be8188612564565b905082810360e08401526126d281876125f0565b90508281036101008401526126e781866125f0565b90508281036101208401526126fc81856125f0565b9d9c50505050505050505050505050565b6000602082526124b460208301846125b4565b60006040825261273360408301856125b4565b828103602084015261274581856125b4565b95945050505050565b6000602082526124b460208301846125f0565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60405181810167ffffffffffffffff811182821017156127aa57600080fd5b604052919050565b600067ffffffffffffffff8211156127c8578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff811681146127f457600080fd5b50565b80151581146127f457600080fd5b600381106127f457600080fdfea2646970667358221220ca3984f20141bfd5cfeb0527ebaa61758fcf55e38cecb2ccbda647cf7bf9f2c764736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063b3a460011161008c578063ecfb5a7c11610066578063ecfb5a7c146101eb578063ed5017f6146101fe578063fbfa77cf14610227578063fd4363781461023c576100ea565b8063b3a46001146101b2578063b4a9f0c8146101c5578063c4fb0f82146101d8576100ea565b8063716bb27a116100c8578063716bb27a1461014c5780637b2de5331461016c578063828f7c7d1461017f57806396ebd93414610192576100ea565b806304013a7d146100ef57806317615f32146101185780634b3dcc1e1461012b575b600080fd5b6101026100fd366004611ff9565b61024f565b60405161010f919061274e565b60405180910390f35b610102610126366004611fbe565b61046f565b61013e6101393660046122d4565b610507565b60405161010f929190612720565b61015f61015a366004612356565b6106a0565b60405161010f919061261f565b61010261017a366004611fbe565b6107fb565b61015f61018d366004611fbe565b61088a565b6101a56101a0366004611fbe565b610923565b60405161010f919061270d565b61015f6101c0366004611fbe565b6109b7565b6101026101d336600461205a565b610a50565b6101026101e6366004611fbe565b610b84565b61015f6101f9366004611fbe565b610c13565b61021161020c3660046120b1565b610cac565b60405161010f9a99989796959493929190612632565b61022f6113c9565b60405161010f919061276a565b6101a561024a366004611fbe565b6113ed565b606080835167ffffffffffffffff8111801561026a57600080fd5b50604051908082528060200260200182016040528015610294578160200160208202803683370190505b50905060005b84518110156104655760018482815181106102b157fe5b602002602001015160018111156102c457fe5b1415610396578481815181106102d657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16634c1a41156040518163ffffffff1660e01b815260040160206040518083038186803b15801561032357600080fd5b505afa925050508015610353575060408051601f3d908101601f19168201909252610350918101906124f1565b60015b61037657600082828151811061036557fe5b602002602001018181525050610391565b8083838151811061038357fe5b602002602001018181525050505b61045d565b8481815181106103a257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166355c676286040518163ffffffff1660e01b815260040160206040518083038186803b1580156103ef57600080fd5b505afa92505050801561041f575060408051601f3d908101601f1916820190925261041c918101906124f1565b60015b61044257600082828151811061043157fe5b60200260200101818152505061045d565b8083838151811061044f57fe5b602002602001018181525050505b60010161029a565b5090505b92915050565b606080825167ffffffffffffffff8111801561048a57600080fd5b506040519080825280602002602001820160405280156104b4578160200160208202803683370190505b50905060005b83518110156104fe576104df8482815181106104d257fe5b6020026020010151611481565b8282815181106104eb57fe5b60209081029190910101526001016104ba565b5090505b919050565b60608060006060855167ffffffffffffffff8111801561052657600080fd5b50604051908082528060200260200182016040528015610550578160200160208202803683370190505b509050600091505b855182101561066e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f6c009278784815181106105a957fe5b60200260200101516040518263ffffffff1660e01b81526004016105cd9190612761565b604080518083038186803b1580156105e457600080fd5b505afa1580156105f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061c9190611f85565b5081838151811061062957fe5b602002602001018173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250508180600101925050610558565b84602001511561068457610681816113ed565b93505b8451156106975761069481610923565b92505b50509250929050565b60608060006060855167ffffffffffffffff811180156106bf57600080fd5b506040519080825280602002602001820160405280156106f357816020015b60608152602001906001900390816106de5790505b50905060005b86518110156107f1577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f94d466888838151811061074a57fe5b60200260200101516040518263ffffffff1660e01b815260040161076e9190612761565b60006040518083038186803b15801561078657600080fd5b505afa15801561079a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107c29190810190612399565b909550935050858311156107e957838282815181106107dd57fe5b60200260200101819052505b6001016106f9565b5095945050505050565b606080825167ffffffffffffffff8111801561081657600080fd5b50604051908082528060200260200182016040528015610840578160200160208202803683370190505b50905060005b83518110156104fe5761086b84828151811061085e57fe5b602002602001015161150c565b82828151811061087757fe5b6020908102919091010152600101610846565b606080825167ffffffffffffffff811180156108a557600080fd5b506040519080825280602002602001820160405280156108d957816020015b60608152602001906001900390816108c45790505b50905060005b83518110156104fe576109048482815181106108f757fe5b602002602001015161159b565b82828151811061091057fe5b60209081029190910101526001016108df565b606080825167ffffffffffffffff8111801561093e57600080fd5b50604051908082528060200260200182016040528015610968578160200160208202803683370190505b50905060005b83518110156104fe5761099384828151811061098657fe5b6020026020010151611631565b82828151811061099f57fe5b9115156020928302919091019091015260010161096e565b606080825167ffffffffffffffff811180156109d257600080fd5b50604051908082528060200260200182016040528015610a0657816020015b60608152602001906001900390816109f15790505b50905060005b83518110156104fe57610a31848281518110610a2457fe5b60200260200101516116a6565b828281518110610a3d57fe5b6020908102919091010152600101610a0c565b606080835167ffffffffffffffff81118015610a6b57600080fd5b50604051908082528060200260200182016040528015610a95578160200160208202803683370190505b50905060005b8451811015610465576001848281518110610ab257fe5b60200260200101516002811115610ac557fe5b1415610b0457610ae7858281518110610ada57fe5b60200260200101516116ee565b828281518110610af357fe5b602002602001018181525050610b7c565b6002848281518110610b1257fe5b60200260200101516002811115610b2557fe5b1415610b4757610ae7858281518110610b3a57fe5b6020026020010151611736565b610b63858281518110610b5657fe5b602002602001015161177e565b828281518110610b6f57fe5b6020026020010181815250505b600101610a9b565b606080825167ffffffffffffffff81118015610b9f57600080fd5b50604051908082528060200260200182016040528015610bc9578160200160208202803683370190505b50905060005b83518110156104fe57610bf4848281518110610be757fe5b60200260200101516117c6565b828281518110610c0057fe5b6020908102919091010152600101610bcf565b606080825167ffffffffffffffff81118015610c2e57600080fd5b50604051908082528060200260200182016040528015610c6257816020015b6060815260200190600190039081610c4d5790505b50905060005b83518110156104fe57610c8d848281518110610c8057fe5b602002602001015161180e565b828281518110610c9957fe5b6020908102919091010152600101610c68565b606080606080606080606080606080600060608d5167ffffffffffffffff81118015610cd757600080fd5b50604051908082528060200260200182016040528015610d01578160200160208202803683370190505b509050600091505b8d51821015610e1f577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f6c009278f8481518110610d5a57fe5b60200260200101516040518263ffffffff1660e01b8152600401610d7e9190612761565b604080518083038186803b158015610d9557600080fd5b505afa158015610da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcd9190611f85565b50818381518110610dda57fe5b602002602001018173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250508180600101925050610d09565b8c5115610e3857610e358e8e61012001516106a0565b9b505b8c6020015115610e5457610e51818e6101400151610a50565b9a505b8c6040015115610e7057610e6d818e610160015161024f565b99505b8c6060015115610f4e5760608d61018001515167ffffffffffffffff81118015610e9957600080fd5b50604051908082528060200260200182016040528015610ec3578160200160208202803683370190505b509050600092505b8d610180015151831015610f4157818e61018001518481518110610eeb57fe5b602002602001015181518110610efd57fe5b6020026020010151818481518110610f1157fe5b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600190920191610ecb565b610f4a8161046f565b9950505b8c60a001511561102c5760608d6101a001515167ffffffffffffffff81118015610f7757600080fd5b50604051908082528060200260200182016040528015610fa1578160200160208202803683370190505b509050600092505b8d6101a001515183101561101f57818e6101a001518481518110610fc957fe5b602002602001015181518110610fdb57fe5b6020026020010151818481518110610fef57fe5b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600190920191610fa9565b611028816109b7565b9750505b8c60c001511561110a5760608d6101c001515167ffffffffffffffff8111801561105557600080fd5b5060405190808252806020026020018201604052801561107f578160200160208202803683370190505b509050600092505b8d6101c00151518310156110fd57818e6101c0015184815181106110a757fe5b6020026020010151815181106110b957fe5b60200260200101518184815181106110cd57fe5b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600190920191611087565b6111068161088a565b9650505b8c60e00151156111e85760608d6101e001515167ffffffffffffffff8111801561113357600080fd5b5060405190808252806020026020018201604052801561115d578160200160208202803683370190505b509050600092505b8d6101e00151518310156111db57818e6101e00151848151811061118557fe5b60200260200101518151811061119757fe5b60200260200101518184815181106111ab57fe5b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600190920191611165565b6111e4816107fb565b9550505b8c6101000151156112c75760608d61020001515167ffffffffffffffff8111801561121257600080fd5b5060405190808252806020026020018201604052801561123c578160200160208202803683370190505b509050600092505b8d6102000151518310156112ba57818e6102000151848151811061126457fe5b60200260200101518151811061127657fe5b602002602001015181848151811061128a57fe5b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600190920191611244565b6112c381610b84565b9450505b8c60800151156113a55760608d61018001515167ffffffffffffffff811180156112f057600080fd5b5060405190808252806020026020018201604052801561131a578160200160208202803683370190505b509050600092505b8d61018001515183101561139857818e6101800151848151811061134257fe5b60200260200101518151811061135457fe5b602002602001015181848151811061136857fe5b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600190920191611322565b6113a181610c13565b9850505b6113b68e8e8d8d8d8a8a8d8f6118e5565b925050509295989b9194979a5092959850565b7f000000000000000000000000000000000000000000000000000000000000000081565b606080825167ffffffffffffffff8111801561140857600080fd5b50604051908082528060200260200182016040528015611432578160200160208202803683370190505b50905060005b83518110156104fe5761145d84828151811061145057fe5b6020026020010151611cf4565b82828151811061146957fe5b91151560209283029190910190910152600101611438565b60008173ffffffffffffffffffffffffffffffffffffffff1663f5431aa86040518163ffffffff1660e01b815260040160206040518083038186803b1580156114c957600080fd5b505afa9250505080156114f9575060408051601f3d908101601f191682019092526114f6918101906124f1565b60015b61150557506000610502565b9050610502565b60008173ffffffffffffffffffffffffffffffffffffffff16636daccffa6040518163ffffffff1660e01b815260040160606040518083038186803b15801561155457600080fd5b505afa925050508015611584575060408051601f3d908101601f1916820190925261158191810190612509565b60015b61159057506000610502565b829350505050610502565b60608173ffffffffffffffffffffffffffffffffffffffff16631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b1580156115e357600080fd5b505afa92505050801561161857506040513d6000823e601f3d908101601f191682016040526116159190810190612465565b60015b6115055750604080516000815260208101909152610502565b60008173ffffffffffffffffffffffffffffffffffffffff1663b35056b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561167957600080fd5b505afa9250505080156114f9575060408051601f3d908101601f191682019092526114f691810190612498565b60608173ffffffffffffffffffffffffffffffffffffffff1663f89f27ed6040518163ffffffff1660e01b815260040160006040518083038186803b1580156115e357600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663de82cd346040518163ffffffff1660e01b815260040160206040518083038186803b1580156114c957600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663876f303b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114c957600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114c957600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114c957600080fd5b6040805160028082526060808301845292839291906020830190803683370190505090508273ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561187757600080fd5b505afa15801561188b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118af9190612541565b826000815181106118bc57fe5b60200260200101836001815181106118d057fe5b60209081029190910101919091525292915050565b6060808a5167ffffffffffffffff8111801561190057600080fd5b5060405190808252806020026020018201604052801561192a578160200160208202803683370190505b5090506000805b8c518110156119b4578b60200151801561195e57508a818151811061195257fe5b60200260200101516000145b8061198857508b604001518015611988575089818151811061197c57fe5b60200260200101516000145b156119ac57600183828151811061199b57fe5b911515602092830291909101909101525b600101611931565b8b6060015115611a2b575060005b8b610180015151811015611a2b578881815181106119dc57fe5b602002602001015160001415611a23576001838d61018001518381518110611a0057fe5b602002602001015181518110611a1257fe5b911515602092830291909101909101525b6001016119c2565b8b60e0015115611aa2575060005b8b6101e0015151811015611aa257878181518110611a5357fe5b602002602001015160001415611a9a576001838d6101e001518381518110611a7757fe5b602002602001015181518110611a8957fe5b911515602092830291909101909101525b600101611a39565b8b610100015115611b1a575060005b8b610200015151811015611b1a57868181518110611acb57fe5b602002602001015160001415611b12576001838d61020001518381518110611aef57fe5b602002602001015181518110611b0157fe5b911515602092830291909101909101525b600101611ab1565b8b60c0015115611b92575060005b8b6101c0015151811015611b9257858181518110611b4257fe5b60200260200101515160001415611b8a576001838d6101c001518381518110611b6757fe5b602002602001015181518110611b7957fe5b911515602092830291909101909101525b600101611b28565b8b60a0015115611c0a575060005b8b6101a0015151811015611c0a57848181518110611bba57fe5b60200260200101515160001415611c02576001838d6101a001518381518110611bdf57fe5b602002602001015181518110611bf157fe5b911515602092830291909101909101525b600101611ba0565b5060005b8251811015611c4657828181518110611c2357fe5b60200260200101511515600115151415611c3e576001909101905b600101611c0e565b60608267ffffffffffffffff81118015611c5f57600080fd5b50604051908082528060200260200182016040528015611c89578160200160208202803683370190505b50905060008092505b8451831015611ce257848381518110611ca757fe5b60200260200101511515600115151415611cd75782828281518110611cc857fe5b60209081029190910101526001015b600190920191611c92565b509d9c50505050505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16631c0de0516040518163ffffffff1660e01b815260040160606040518083038186803b158015611d3c57600080fd5b505afa925050508015611584575060408051601f3d908101601f19168201909252611581918101906124bb565b600082601f830112611d79578081fd5b8135611d8c611d87826127b2565b61278b565b818152915060208083019084810181840286018201871015611dad57600080fd5b60005b84811015611dd5578135611dc3816127d2565b84529282019290820190600101611db0565b505050505092915050565b600082601f830112611df0578081fd5b8135611dfe611d87826127b2565b818152915060208083019084810181840286018201871015611e1f57600080fd5b60005b84811015611dd557813584529282019290820190600101611e22565b600082601f830112611e4e578081fd5b8135611e5c611d87826127b2565b818152915060208083019084810181840286018201871015611e7d57600080fd5b6000805b85811015611ea957823560028110611e97578283fd5b85529383019391830191600101611e81565b50505050505092915050565b600082601f830112611ec5578081fd5b8135611ed3611d87826127b2565b818152915060208083019084810181840286018201871015611ef457600080fd5b60005b84811015611dd5578135611f0a81612805565b84529282019290820190600101611ef7565b600082601f830112611f2c578081fd5b8151611f3a611d87826127b2565b818152915060208083019084810181840286018201871015611f5b57600080fd5b60005b84811015611dd557815184529282019290820190600101611f5e565b8035610469816127f7565b60008060408385031215611f97578182fd5b8251611fa2816127d2565b6020840151909250611fb381612805565b809150509250929050565b600060208284031215611fcf578081fd5b813567ffffffffffffffff811115611fe5578182fd5b611ff184828501611d69565b949350505050565b6000806040838503121561200b578182fd5b823567ffffffffffffffff80821115612022578384fd5b61202e86838701611d69565b93506020850135915080821115612043578283fd5b5061205085828601611e3e565b9150509250929050565b6000806040838503121561206c578182fd5b823567ffffffffffffffff80821115612083578384fd5b61208f86838701611d69565b935060208501359150808211156120a4578283fd5b5061205085828601611eb5565b600080604083850312156120c3578182fd5b823567ffffffffffffffff808211156120da578384fd5b6120e686838701611de0565b935060208501359150808211156120fb578283fd5b8185019150610220808388031215612111578384fd5b61211a8161278b565b90506121268784611f7a565b81526121358760208501611f7a565b60208201526121478760408501611f7a565b60408201526121598760608501611f7a565b606082015261216b8760808501611f7a565b608082015261217d8760a08501611f7a565b60a082015261218f8760c08501611f7a565b60c08201526121a18760e08501611f7a565b60e08201526101006121b588828601611f7a565b90820152610120838101359082015261014080840135838111156121d7578586fd5b6121e389828701611eb5565b82840152505061016080840135838111156121fc578586fd5b61220889828701611e3e565b8284015250506101808084013583811115612221578586fd5b61222d89828701611de0565b8284015250506101a08084013583811115612246578586fd5b61225289828701611de0565b8284015250506101c0808401358381111561226b578586fd5b61227789828701611de0565b8284015250506101e08084013583811115612290578586fd5b61229c89828701611de0565b82840152505061020080840135838111156122b5578586fd5b6122c189828701611de0565b8284015250508093505050509250929050565b60008082840360608112156122e7578283fd5b833567ffffffffffffffff8111156122fd578384fd5b61230986828701611de0565b9350506040601f198201121561231d578182fd5b50612328604061278b565b6020840135612336816127f7565b81526040840135612346816127f7565b6020820152919491935090915050565b60008060408385031215612368578182fd5b823567ffffffffffffffff81111561237e578283fd5b61238a85828601611de0565b95602094909401359450505050565b6000806000606084860312156123ad578081fd5b835167ffffffffffffffff808211156123c4578283fd5b818601915086601f8301126123d7578283fd5b81516123e5611d87826127b2565b80828252602080830192508086018b828387028901011115612405578788fd5b8796505b8487101561243057805161241c816127d2565b845260019690960195928101928101612409565b508901519097509350505080821115612447578283fd5b5061245486828701611f1c565b925050604084015190509250925092565b600060208284031215612476578081fd5b815167ffffffffffffffff81111561248c578182fd5b611ff184828501611f1c565b6000602082840312156124a9578081fd5b81516124b4816127f7565b9392505050565b6000806000606084860312156124cf578081fd5b83516124da816127f7565b602085015160409095015190969495509392505050565b600060208284031215612502578081fd5b5051919050565b60008060006060848603121561251d578081fd5b83519250602084015161252f816127f7565b80925050604084015190509250925092565b60008060408385031215612553578182fd5b505080516020909101519092909150565b6000815180845260208085019450848183028601828601855b858110156125a75783830389526125958383516125f0565b9885019892509084019060010161257d565b5090979650505050505050565b6000815180845260208085019450808401835b838110156125e55781511515875295820195908201906001016125c7565b509495945050505050565b6000815180845260208085019450808401835b838110156125e557815187529582019590820190600101612603565b6000602082526124b46020830184612564565b60006101408083526126468184018e612564565b9050828103602084015261265a818d6125f0565b9050828103604084015261266e818c6125f0565b90508281036060840152612682818b6125f0565b90508281036080840152612696818a612564565b905082810360a08401526126aa8189612564565b905082810360c08401526126be8188612564565b905082810360e08401526126d281876125f0565b90508281036101008401526126e781866125f0565b90508281036101208401526126fc81856125f0565b9d9c50505050505050505050505050565b6000602082526124b460208301846125b4565b60006040825261273360408301856125b4565b828103602084015261274581856125b4565b95945050505050565b6000602082526124b460208301846125f0565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60405181810167ffffffffffffffff811182821017156127aa57600080fd5b604052919050565b600067ffffffffffffffff8211156127c8578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff811681146127f457600080fd5b50565b80151581146127f457600080fd5b600381106127f457600080fdfea2646970667358221220ca3984f20141bfd5cfeb0527ebaa61758fcf55e38cecb2ccbda647cf7bf9f2c764736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/index.ts b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/index.ts new file mode 100644 index 0000000..b5f5c5a --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { BalancerPoolDataQueriesDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as BalancerPoolDataQueriesDeployment; + + const args = [input.Vault]; + await task.deployAndVerify('BalancerPoolDataQueries', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/input.ts b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/input.ts new file mode 100644 index 0000000..e3f79b7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type BalancerPoolDataQueriesDeployment = { + Vault: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, +}; diff --git a/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/arbitrum.json b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/arbitrum.json new file mode 100644 index 0000000..93d3853 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "BalancerPoolDataQueries": "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/avalanche.json b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/avalanche.json new file mode 100644 index 0000000..93d3853 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/avalanche.json @@ -0,0 +1,3 @@ +{ + "BalancerPoolDataQueries": "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/base.json b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/base.json new file mode 100644 index 0000000..196fec7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/base.json @@ -0,0 +1,3 @@ +{ + "BalancerPoolDataQueries": "0x6B1Da720Be2D11d95177ccFc40A917c2688f396c" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/bsc.json b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/bsc.json new file mode 100644 index 0000000..93d3853 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/bsc.json @@ -0,0 +1,3 @@ +{ + "BalancerPoolDataQueries": "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/gnosis.json b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/gnosis.json new file mode 100644 index 0000000..93d3853 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "BalancerPoolDataQueries": "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/goerli.json b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/goerli.json new file mode 100644 index 0000000..93d3853 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/goerli.json @@ -0,0 +1,3 @@ +{ + "BalancerPoolDataQueries": "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/mainnet.json b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/mainnet.json new file mode 100644 index 0000000..93d3853 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "BalancerPoolDataQueries": "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/mode.json b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/mode.json new file mode 100644 index 0000000..a66fb95 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/mode.json @@ -0,0 +1,3 @@ +{ + "BalancerPoolDataQueries": "0x7A2535f5fB47b8e44c02Ef5D9990588313fe8F05" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/optimism.json b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/optimism.json new file mode 100644 index 0000000..93d3853 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/optimism.json @@ -0,0 +1,3 @@ +{ + "BalancerPoolDataQueries": "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/polygon.json b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/polygon.json new file mode 100644 index 0000000..93d3853 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/polygon.json @@ -0,0 +1,3 @@ +{ + "BalancerPoolDataQueries": "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/sepolia.json b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/sepolia.json new file mode 100644 index 0000000..93d3853 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "BalancerPoolDataQueries": "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/zkevm.json b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/zkevm.json new file mode 100644 index 0000000..93d3853 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/output/zkevm.json @@ -0,0 +1,3 @@ +{ + "BalancerPoolDataQueries": "0x6d3197d069F8F9f1Fe7e23665Bc64CB77ED8b089" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/readme.md b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/readme.md new file mode 100644 index 0000000..b7f887c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/readme.md @@ -0,0 +1,16 @@ +# 2023-06-13 - Balancer Pool DataQueries + +Deployment of the `BalancerPoolDataQueries` contract. It provides a way to perform bulk queries that is useful for optimizing SOR initialization of on chain data. + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`BalancerPoolDataQueries` artifact](./artifact/BalancerPoolDataQueries.json) diff --git a/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/test/task-failing-scaling-factors.fork.ts b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/test/task-failing-scaling-factors.fork.ts new file mode 100644 index 0000000..752007a --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/test/task-failing-scaling-factors.fork.ts @@ -0,0 +1,67 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import { describeForkTest, getForkedNetwork, Task, TaskMode } from '@src'; + +const BBAUSDC = '0x82698aecc9e28e9bb27608bd52cf57f704bd1b83'; +const BBAUSDC_POOL_ID = '0x82698aecc9e28e9bb27608bd52cf57f704bd1b83000000000000000000000336'; +const POOL_WITH_FAILING_SCALING_FACTORS_ID = '0x3c640f0d3036ad85afa2d5a9e32be651657b874f00000000000000000000046b'; +const POOL_WITH_FAILING_SCALING_FACTORS = '0x3c640f0d3036ad85afa2d5a9e32be651657b874f'; + +const defaultPoolDataQueryConfig = { + loadTokenBalanceUpdatesAfterBlock: false, + loadTotalSupply: false, + loadSwapFees: false, + loadLinearWrappedTokenRates: false, + loadNormalizedWeights: false, + loadScalingFactors: false, + loadAmps: false, + loadRates: false, + + blockNumber: 0, + totalSupplyTypes: [], + swapFeeTypes: [], + linearPoolIdxs: [], + weightedPoolIdxs: [], + scalingFactorPoolIdxs: [], + ampPoolIdxs: [], + ratePoolIdxs: [], +}; + +describeForkTest('BalancerPoolDataQueries', 'mainnet', 17238447, function () { + let balancerPoolDataQueries: Contract; + + before('deploy balancer pool data queries', async () => { + const task = new Task('20230613-balancer-pool-data-queries', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + + balancerPoolDataQueries = await task.deployedInstance('BalancerPoolDataQueries'); + }); + + context('handles failing scaling factors', () => { + it('Should return an empty array for a pool with failing scaling factors', async () => { + const response = await balancerPoolDataQueries.getScalingFactorsForPools([ + BBAUSDC, + POOL_WITH_FAILING_SCALING_FACTORS, + ]); + + expect(response.length).to.equal(2); + expect(response[0].length).to.equal(3); + expect(response[1].length).to.equal(0); + }); + + it('Should add the pool to ignoreIdxs when it has failing scaling factors', async () => { + const response = await balancerPoolDataQueries.getPoolData( + [BBAUSDC_POOL_ID, POOL_WITH_FAILING_SCALING_FACTORS_ID], + { + ...defaultPoolDataQueryConfig, + loadScalingFactors: true, + scalingFactorPoolIdxs: [0, 1], + } + ); + + expect(response.ignoreIdxs[0]).to.equal(1); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/test/task-status.fork.ts b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/test/task-status.fork.ts new file mode 100644 index 0000000..89fcff1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/test/task-status.fork.ts @@ -0,0 +1,84 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import { describeForkTest, getForkedNetwork, Task, TaskMode } from '@src'; + +const BAL_ETH_POOL_ID = '0x5c6ee304399dbdb9c8ef030ab642b10820db8f56000200000000000000000014'; +const TUSD_BBAUSD_ID = '0x2ba7aa2213fa2c909cd9e46fed5a0059542b36b00000000000000000000003a3'; +const BB_E_DAI_ID = '0xeb486af868aeb3b6e53066abc9623b1041b42bc000000000000000000000046c'; +const BB_E_USDT_ID = '0x3c640f0d3036ad85afa2d5a9e32be651657b874f00000000000000000000046b'; +const BB_E_USD_ID = '0x50cf90b954958480b8df7958a9e965752f62712400000000000000000000046f'; + +describeForkTest('BalancerPoolDataQueries', 'mainnet', 17413298, function () { + let balancerPoolDataQueries: Contract; + + before('deploy balancer pool data queries', async () => { + const task = new Task('20230613-balancer-pool-data-queries', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + + balancerPoolDataQueries = await task.deployedInstance('BalancerPoolDataQueries'); + }); + + context('get pool status data', () => { + it('loads in recovery mode and paused status', async () => { + const response = await balancerPoolDataQueries.getPoolStatus([BAL_ETH_POOL_ID, BB_E_USDT_ID], { + loadInRecoveryMode: true, + loadIsPaused: true, + }); + + expect(response.isPaused.length).to.equal(2); + expect(response.inRecoveryMode.length).to.equal(2); + expect(response.isPaused[0]).to.equal(false); + expect(response.inRecoveryMode[0]).to.equal(false); + expect(response.isPaused[1]).to.equal(true); + expect(response.inRecoveryMode[1]).to.equal(true); + }); + + it('loads only recovery mode', async () => { + const response = await balancerPoolDataQueries.getPoolStatus([BAL_ETH_POOL_ID], { + loadInRecoveryMode: true, + loadIsPaused: false, + }); + + expect(response.isPaused.length).to.equal(0); + expect(response.inRecoveryMode.length).to.equal(1); + expect(response.inRecoveryMode[0]).to.equal(false); + }); + + it('loads only is paused', async () => { + const response = await balancerPoolDataQueries.getPoolStatus([BAL_ETH_POOL_ID], { + loadInRecoveryMode: false, + loadIsPaused: true, + }); + + expect(response.isPaused.length).to.equal(1); + expect(response.inRecoveryMode.length).to.equal(0); + expect(response.isPaused[0]).to.equal(false); + }); + + it('identifies pools in recovery mode', async () => { + const response = await balancerPoolDataQueries.getPoolStatus([BAL_ETH_POOL_ID, TUSD_BBAUSD_ID, BB_E_DAI_ID], { + loadInRecoveryMode: true, + loadIsPaused: false, + }); + + expect(response.inRecoveryMode.length).to.equal(3); + expect(response.inRecoveryMode[0]).to.equal(false); + expect(response.inRecoveryMode[1]).to.equal(true); + expect(response.inRecoveryMode[2]).to.equal(true); + }); + + it('identifies paused pools', async () => { + const response = await balancerPoolDataQueries.getPoolStatus([BAL_ETH_POOL_ID, BB_E_USDT_ID, BB_E_USD_ID], { + loadInRecoveryMode: false, + loadIsPaused: true, + }); + + expect(response.isPaused.length).to.equal(3); + expect(response.isPaused[0]).to.equal(false); + expect(response.isPaused[1]).to.equal(true); + expect(response.isPaused[2]).to.equal(true); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/test/task.fork.ts b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/test/task.fork.ts new file mode 100644 index 0000000..23c37ac --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230613-balancer-pool-data-queries/test/task.fork.ts @@ -0,0 +1,403 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { bn, fp } from '@helpers/numbers'; + +import { describeForkTest, getForkedNetwork, Task, TaskMode } from '@src'; + +const BAL_ETH_POOL_ID = '0x5c6ee304399dbdb9c8ef030ab642b10820db8f56000200000000000000000014'; +const BAL_ETH_POOL = '0x5c6ee304399dbdb9c8ef030ab642b10820db8f56'; +const WSTETH_ETH_POOL_ID = '0x32296969ef14eb0c6d29669c550d4a0449130230000200000000000000000080'; +const BAL_ETH_POOL_LAST_CHANGED_BLOCK = 16473966; +const OHM_ETH_POOL = '0xd1ec5e215e8148d76f4460e4097fd3d5ae0a3558'; +const WSTETH_ETH_POOL = '0x32296969ef14eb0c6d29669c550d4a0449130230'; +const FX_POOL = '0x55bec22f8f6c69137ceaf284d9b441db1b9bfedc'; +const FX_POOL_ID = '0x55bec22f8f6c69137ceaf284d9b441db1b9bfedc0002000000000000000003cd'; + +const BBAUSDC = '0x82698aecc9e28e9bb27608bd52cf57f704bd1b83'; +const BBAUSDC_POOL_ID = '0x82698aecc9e28e9bb27608bd52cf57f704bd1b83000000000000000000000336'; +const BBAUSDT = '0x2f4eb100552ef93840d5adc30560e5513dfffacb'; +const BBAUSDT_POOL_ID = '0x2f4eb100552ef93840d5adc30560e5513dfffacb000000000000000000000334'; +const LPePyvCurve_MIM_11FEB22 = '0x09b1b33bad0e87454ff05696b1151bfbd208a43f'; +const LPePyvCurve_MIM_11FEB22_POOL_ID = '0x09b1b33bad0e87454ff05696b1151bfbd208a43f0002000000000000000000a6'; +const LPePyvUSDC_28JAN22 = '0x10a2f8bd81ee2898d7ed18fb8f114034a549fa59'; +const PHANTOM_STABLE_POOL = '0x7b50775383d3d6f0215a8f290f2c9e2eebbeceb2'; +const COMPOSABLE_STABLE_POOL = '0xa13a9247ea42d743238089903570127dda72fe44'; +const COMPOSABLE_STABLE_POOL_ID = '0xa13a9247ea42d743238089903570127dda72fe4400000000000000000000035d'; +const PHANTOM_STABLE_POOL_ID = '0x7b50775383d3d6f0215a8f290f2c9e2eebbeceb20000000000000000000000fe'; + +enum TotalSupplyType { + TOTAL_SUPPLY = 0, + VIRTUAL_SUPPLY, + ACTUAL_SUPPLY, +} + +enum SwapFeeType { + SWAP_FEE_PERCENTAGE = 0, + PERCENT_FEE, +} + +const defaultPoolDataQueryConfig = { + loadTokenBalanceUpdatesAfterBlock: false, + loadTotalSupply: false, + loadSwapFees: false, + loadLinearWrappedTokenRates: false, + loadLinearTargets: false, + loadNormalizedWeights: false, + loadScalingFactors: false, + loadAmps: false, + loadRates: false, + + blockNumber: 0, + totalSupplyTypes: [], + swapFeeTypes: [], + linearPoolIdxs: [], + weightedPoolIdxs: [], + scalingFactorPoolIdxs: [], + ampPoolIdxs: [], + ratePoolIdxs: [], +}; + +describeForkTest('BalancerPoolDataQueries', 'mainnet', 16474000, function () { + let balancerPoolDataQueries: Contract; + + before('deploy balancer pool data queries', async () => { + const task = new Task('20230613-balancer-pool-data-queries', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + + balancerPoolDataQueries = await task.deployedInstance('BalancerPoolDataQueries'); + }); + + context('pool token balances', () => { + it('returns values if balances have been updated after the block provided', async () => { + const response = await balancerPoolDataQueries.getPoolTokenBalancesWithUpdatesAfterBlock( + [BAL_ETH_POOL_ID], + BAL_ETH_POOL_LAST_CHANGED_BLOCK - 1 + ); + + expect(response.length).to.equal(1); + expect(response[0].length).to.equal(2); + }); + + it('returns no values if balances have not been updated after the block provided', async () => { + const response = await balancerPoolDataQueries.getPoolTokenBalancesWithUpdatesAfterBlock( + [BAL_ETH_POOL_ID], + BAL_ETH_POOL_LAST_CHANGED_BLOCK + ); + + expect(response.length).to.equal(1); + expect(response[0].length).to.equal(0); + }); + + it('returns values only for pools with updates since block provided', async () => { + const response = await balancerPoolDataQueries.getPoolTokenBalancesWithUpdatesAfterBlock( + [BAL_ETH_POOL_ID, WSTETH_ETH_POOL_ID], + BAL_ETH_POOL_LAST_CHANGED_BLOCK + ); + + expect(response.length).to.equal(2); + expect(response[0].length).to.equal(0); + expect(response[1].length).to.equal(2); + }); + }); + + context('linear pool rates', () => { + it('returns the correct wrapped token rates for linear pools', async () => { + const response = await balancerPoolDataQueries.getWrappedTokenRateForLinearPools([BBAUSDC, BBAUSDT]); + + expect(response[0]).to.equal(fp('1.081498386280161947')); + expect(response[1]).to.equal(fp('1.102128584906008204')); + }); + }); + + context('swap fee percentages', () => { + it('returns the correct swap fees for pools', async () => { + const response = await balancerPoolDataQueries.getSwapFeePercentageForPools( + [BAL_ETH_POOL, BBAUSDT], + [SwapFeeType.SWAP_FEE_PERCENTAGE, SwapFeeType.SWAP_FEE_PERCENTAGE] + ); + + expect(response[0]).to.equal(fp('0.01')); + expect(response[1]).to.equal(fp('0.00001')); + }); + + it('returns the correct swap fees for element pools', async () => { + const response = await balancerPoolDataQueries.getSwapFeePercentageForPools( + [LPePyvCurve_MIM_11FEB22, LPePyvUSDC_28JAN22], + [SwapFeeType.PERCENT_FEE, SwapFeeType.PERCENT_FEE] + ); + + expect(response[0]).to.equal(fp('0.1')); + expect(response[1]).to.equal(fp('0.1')); + }); + + it('returns the correct swap fees for mixed pools', async () => { + const response = await balancerPoolDataQueries.getSwapFeePercentageForPools( + [BAL_ETH_POOL, LPePyvCurve_MIM_11FEB22, BBAUSDT], + [SwapFeeType.SWAP_FEE_PERCENTAGE, SwapFeeType.PERCENT_FEE, SwapFeeType.SWAP_FEE_PERCENTAGE] + ); + + expect(response[0]).to.equal(fp('0.01')); + expect(response[1]).to.equal(fp('0.1')); + expect(response[2]).to.equal(fp('0.00001')); + }); + + it('returns a 0 swap fee when passed an unknown pool type', async () => { + const response = await balancerPoolDataQueries.getSwapFeePercentageForPools( + [FX_POOL], + [SwapFeeType.SWAP_FEE_PERCENTAGE] + ); + + expect(response[0]).to.equal('0'); + }); + }); + + context('total supply', () => { + it('returns the correct total supply for pool', async () => { + const response = await balancerPoolDataQueries.getTotalSupplyForPools( + [BAL_ETH_POOL], + [TotalSupplyType.TOTAL_SUPPLY] + ); + + expect(response[0]).to.equal(bn('13786043841624360249590791')); + }); + + it('returns the correct virtual supply for pool', async () => { + const response = await balancerPoolDataQueries.getTotalSupplyForPools( + [PHANTOM_STABLE_POOL], + [TotalSupplyType.VIRTUAL_SUPPLY] + ); + + expect(response[0]).to.equal(bn('3079594133035530969647581')); + }); + + it('returns the correct actual supply for pool', async () => { + const response = await balancerPoolDataQueries.getTotalSupplyForPools( + [COMPOSABLE_STABLE_POOL], + [TotalSupplyType.ACTUAL_SUPPLY] + ); + + expect(response[0]).to.equal(bn('67178285823602489267972373')); + }); + + it('returns the correct supply for mixed pools', async () => { + const response = await balancerPoolDataQueries.getTotalSupplyForPools( + [BAL_ETH_POOL, PHANTOM_STABLE_POOL, COMPOSABLE_STABLE_POOL], + [TotalSupplyType.TOTAL_SUPPLY, TotalSupplyType.VIRTUAL_SUPPLY, TotalSupplyType.ACTUAL_SUPPLY] + ); + + expect(response[0]).to.equal(bn('13786043841624360249590791')); + expect(response[1]).to.equal(bn('3079594133035530969647581')); + expect(response[2]).to.equal(bn('67178285823602489267972373')); + }); + }); + + context('normalized weights', () => { + it('returns the correct weights for 1 pool', async () => { + const response = await balancerPoolDataQueries.getNormalizedWeightsForPools([BAL_ETH_POOL]); + + expect(response[0][0]).to.equal(fp('0.8')); + expect(response[0][1]).to.equal(fp('0.2')); + }); + + it('returns the correct weights for several pools', async () => { + const response = await balancerPoolDataQueries.getNormalizedWeightsForPools([BAL_ETH_POOL, OHM_ETH_POOL]); + + expect(response[0][0]).to.equal(fp('0.8')); + expect(response[0][1]).to.equal(fp('0.2')); + + expect(response[1][0]).to.equal(fp('0.5')); + expect(response[1][1]).to.equal(fp('0.5')); + }); + }); + + context('scaling factors', () => { + it('returns the correct scaling factors for 1 pool', async () => { + const response = await balancerPoolDataQueries.getScalingFactorsForPools([COMPOSABLE_STABLE_POOL]); + + expect(response[0][0]).to.equal(bn('1005671911533217346')); + expect(response[0][1]).to.equal(bn('1001773828282482904')); + expect(response[0][2]).to.equal(bn('1000000000000000000')); + expect(response[0][3]).to.equal(bn('1001905060971436536')); + }); + + it('returns the correct scaling factors for several pools', async () => { + const response = await balancerPoolDataQueries.getScalingFactorsForPools([ + COMPOSABLE_STABLE_POOL, + PHANTOM_STABLE_POOL, + ]); + + expect(response[0][0]).to.equal(bn('1005671911533217346')); + expect(response[0][1]).to.equal(bn('1001773828282482904')); + expect(response[0][2]).to.equal(bn('1000000000000000000')); + expect(response[0][3]).to.equal(bn('1001905060971436536')); + + expect(response[1][0]).to.equal(bn('1017033447123846653')); + expect(response[1][1]).to.equal(bn('1000000000000000000')); + expect(response[1][2]).to.equal(bn('1011888479898642476')); + expect(response[1][3]).to.equal(bn('1010971331127696692')); + }); + }); + + context('amps', () => { + it('returns the correct amp for 1 pool', async () => { + const response = await balancerPoolDataQueries.getAmpForPools([COMPOSABLE_STABLE_POOL]); + + expect(response[0]).to.equal(bn('1472000')); + }); + + it('returns the correct amp for several pools', async () => { + const response = await balancerPoolDataQueries.getAmpForPools([COMPOSABLE_STABLE_POOL, WSTETH_ETH_POOL]); + + expect(response[0]).to.equal(bn('1472000')); + expect(response[1]).to.equal(bn('50000')); + }); + }); + + context('rates', () => { + it('returns the correct rate for 1 pool', async () => { + const response = await balancerPoolDataQueries.getRateForPools([COMPOSABLE_STABLE_POOL]); + + expect(response[0]).to.equal(bn('1002682450094016315')); + }); + + it('returns the correct rate for several pools', async () => { + const response = await balancerPoolDataQueries.getRateForPools([COMPOSABLE_STABLE_POOL, WSTETH_ETH_POOL]); + + expect(response[0]).to.equal(bn('1002682450094016315')); + expect(response[1]).to.equal(bn('1029705718683742157')); + }); + }); + + context('get pool data', () => { + it('loads only token balances', async () => { + const response = await balancerPoolDataQueries.getPoolData([BAL_ETH_POOL_ID], { + ...defaultPoolDataQueryConfig, + loadTokenBalanceUpdatesAfterBlock: true, + }); + + expect(response.balances.length).to.equal(1); + expect(response.balances[0].length).to.equal(2); + expect(response.totalSupplies.length).to.equal(0); + expect(response.linearWrappedTokenRates.length).to.equal(0); + expect(response.weights.length).to.equal(0); + expect(response.scalingFactors.length).to.equal(0); + expect(response.swapFees.length).to.equal(0); + }); + + it('loads total supply', async () => { + const response = await balancerPoolDataQueries.getPoolData([BAL_ETH_POOL_ID, COMPOSABLE_STABLE_POOL_ID], { + ...defaultPoolDataQueryConfig, + loadTotalSupply: true, + totalSupplyTypes: [TotalSupplyType.TOTAL_SUPPLY, TotalSupplyType.ACTUAL_SUPPLY], + }); + + expect(response.totalSupplies[0]).to.equal(bn('13786043841624360249590791')); + expect(response.totalSupplies[1]).to.equal(bn('67178285823602489267972373')); + }); + + it('loads swap fees', async () => { + const response = await balancerPoolDataQueries.getPoolData([BAL_ETH_POOL_ID, LPePyvCurve_MIM_11FEB22_POOL_ID], { + ...defaultPoolDataQueryConfig, + loadSwapFees: true, + swapFeeTypes: [SwapFeeType.SWAP_FEE_PERCENTAGE, SwapFeeType.PERCENT_FEE], + }); + + expect(response.swapFees[0]).to.equal(fp('0.01')); + expect(response.swapFees[1]).to.equal(fp('0.1')); + }); + + it('loads linear wrapped token rates at specified idxs', async () => { + const response = await balancerPoolDataQueries.getPoolData([BBAUSDT_POOL_ID, BAL_ETH_POOL_ID, BBAUSDC_POOL_ID], { + ...defaultPoolDataQueryConfig, + loadLinearWrappedTokenRates: true, + linearPoolIdxs: [0, 2], + }); + + expect(response.linearWrappedTokenRates[0]).to.equal(fp('1.102128584906008204')); + expect(response.linearWrappedTokenRates[1]).to.equal(fp('1.081498386280161947')); + }); + + it('loads linear targets at specified idxs', async () => { + const response = await balancerPoolDataQueries.getPoolData([BBAUSDT_POOL_ID, BAL_ETH_POOL_ID, BBAUSDC_POOL_ID], { + ...defaultPoolDataQueryConfig, + loadLinearTargets: true, + linearPoolIdxs: [0, 2], + }); + + expect(response.linearTargets[0][0]).to.equal('6000000000000000000000000'); + expect(response.linearTargets[0][1]).to.equal('20000000000000000000000000'); + + expect(response.linearTargets[1][0]).to.equal('6000000000000000000000000'); + expect(response.linearTargets[1][1]).to.equal('20000000000000000000000000'); + }); + + it('loads weights at specified idxs', async () => { + const response = await balancerPoolDataQueries.getPoolData([BBAUSDT_POOL_ID, BAL_ETH_POOL_ID], { + ...defaultPoolDataQueryConfig, + loadNormalizedWeights: true, + weightedPoolIdxs: [1], + }); + + expect(response.weights[0][0]).to.equal(fp('0.8')); + expect(response.weights[0][1]).to.equal(fp('0.2')); + }); + + it('loads token rates at specified idxs', async () => { + const response = await balancerPoolDataQueries.getPoolData( + [BAL_ETH_POOL_ID, COMPOSABLE_STABLE_POOL_ID, PHANTOM_STABLE_POOL_ID], + { + ...defaultPoolDataQueryConfig, + loadScalingFactors: true, + scalingFactorPoolIdxs: [1, 2], + } + ); + + expect(response.scalingFactors[0][0]).to.equal(bn('1005671911533217346')); + expect(response.scalingFactors[0][1]).to.equal(bn('1001773828282482904')); + expect(response.scalingFactors[0][2]).to.equal(bn('1000000000000000000')); + expect(response.scalingFactors[0][3]).to.equal(bn('1001905060971436536')); + + expect(response.scalingFactors[1][0]).to.equal(bn('1017033447123846653')); + expect(response.scalingFactors[1][1]).to.equal(bn('1000000000000000000')); + expect(response.scalingFactors[1][2]).to.equal(bn('1011888479898642476')); + expect(response.scalingFactors[1][3]).to.equal(bn('1010971331127696692')); + }); + + it('loads amp at specified idxs', async () => { + const response = await balancerPoolDataQueries.getPoolData( + [BBAUSDT_POOL_ID, WSTETH_ETH_POOL_ID, COMPOSABLE_STABLE_POOL_ID], + { + ...defaultPoolDataQueryConfig, + loadAmps: true, + ampPoolIdxs: [1, 2], + } + ); + + expect(response.amps[0]).to.equal(bn('50000')); + expect(response.amps[1]).to.equal(bn('1472000')); + }); + + it('returns pool as ignored when given an unknown pool type', async () => { + const response = await balancerPoolDataQueries.getPoolData([BAL_ETH_POOL_ID, FX_POOL_ID], { + ...defaultPoolDataQueryConfig, + loadSwapFees: true, + swapFeeTypes: [SwapFeeType.SWAP_FEE_PERCENTAGE, SwapFeeType.SWAP_FEE_PERCENTAGE], + }); + + expect(response.ignoreIdxs.length).to.equal(1); + expect(response.ignoreIdxs[0]).to.equal('1'); + }); + + it('returns pool as ignored when given an unsupported total supply type', async () => { + const response = await balancerPoolDataQueries.getPoolData([COMPOSABLE_STABLE_POOL_ID, BAL_ETH_POOL_ID], { + ...defaultPoolDataQueryConfig, + loadTotalSupply: true, + totalSupplyTypes: [TotalSupplyType.ACTUAL_SUPPLY, TotalSupplyType.ACTUAL_SUPPLY], + }); + + expect(response.ignoreIdxs.length).to.equal(1); + expect(response.ignoreIdxs[0]).to.equal('1'); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/artifact/ComposableStablePool.json b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/artifact/ComposableStablePool.json new file mode 100644 index 0000000..3011059 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/artifact/ComposableStablePool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"components": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "contract IProtocolFeePercentagesProvider", "name": "protocolFeeProvider", "type": "address"}, {"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20[]", "name": "tokens", "type": "address[]"}, {"internalType": "contract IRateProvider[]", "name": "rateProviders", "type": "address[]"}, {"internalType": "uint256[]", "name": "tokenRateCacheDurations", "type": "uint256[]"}, {"internalType": "bool", "name": "exemptFromYieldProtocolFeeFlag", "type": "bool"}, {"internalType": "uint256", "name": "amplificationParameter", "type": "uint256"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "string", "name": "version", "type": "string"}], "internalType": "struct ComposableStablePool.NewPoolParams", "name": "params", "type": "tuple"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "startValue", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "endValue", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "startTime", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "endTime", "type": "uint256"}], "name": "AmpUpdateStarted", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "currentValue", "type": "uint256"}], "name": "AmpUpdateStopped", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "feeType", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "protocolFeePercentage", "type": "uint256"}], "name": "ProtocolFeePercentageCacheUpdated", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "enabled", "type": "bool"}], "name": "RecoveryModeStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "tokenIndex", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "rate", "type": "uint256"}], "name": "TokenRateCacheUpdated", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "tokenIndex", "type": "uint256"}, {"indexed": true, "internalType": "contract IRateProvider", "name": "provider", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "cacheDuration", "type": "uint256"}], "name": "TokenRateProviderSet", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DELEGATE_PROTOCOL_SWAP_FEES_SENTINEL", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "disableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "enableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getActualSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAmplificationParameter", "outputs": [{"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "bool", "name": "isUpdating", "type": "bool"}, {"internalType": "uint256", "name": "precision", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getBptIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getDomainSeparator", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getLastJoinExitData", "outputs": [{"internalType": "uint256", "name": "lastJoinExitAmplification", "type": "uint256"}, {"internalType": "uint256", "name": "lastPostJoinExitInvariant", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMinimumBpt", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "pure", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "getNextNonce", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "feeType", "type": "uint256"}], "name": "getProtocolFeePercentageCache", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getProtocolFeesCollector", "outputs": [{"internalType": "contract IProtocolFeesCollector", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getProtocolSwapFeeDelegation", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRateProviders", "outputs": [{"internalType": "contract IRateProvider[]", "name": "", "type": "address[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getScalingFactors", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "getTokenRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "getTokenRateCache", "outputs": [{"internalType": "uint256", "name": "rate", "type": "uint256"}, {"internalType": "uint256", "name": "oldRate", "type": "uint256"}, {"internalType": "uint256", "name": "duration", "type": "uint256"}, {"internalType": "uint256", "name": "expires", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "inRecoveryMode", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "isExemptFromYieldProtocolFee", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "isTokenExemptFromYieldProtocolFee", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "swapRequest", "type": "tuple"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "indexIn", "type": "uint256"}, {"internalType": "uint256", "name": "indexOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "bytes", "name": "poolConfig", "type": "bytes"}], "name": "setAssetManagerPoolConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "uint256", "name": "duration", "type": "uint256"}], "name": "setTokenRateCacheDuration", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "rawEndValue", "type": "uint256"}, {"internalType": "uint256", "name": "endTime", "type": "uint256"}], "name": "startAmplificationParameterUpdate", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "stopAmplificationParameterUpdate", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "updateProtocolFeePercentageCache", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "updateTokenRateCache", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "version", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/artifact/ComposableStablePoolFactory.json b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/artifact/ComposableStablePoolFactory.json new file mode 100644 index 0000000..8ed2037 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/artifact/ComposableStablePoolFactory.json @@ -0,0 +1,292 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ComposableStablePoolFactory", + "sourceName": "contracts/ComposableStablePoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "poolVersion", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "amplificationParameter", + "type": "uint256" + }, + { + "internalType": "contract IRateProvider[]", + "name": "rateProviders", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenRateCacheDurations", + "type": "uint256[]" + }, + { + "internalType": "bool", + "name": "exemptFromYieldProtocolFeeFlag", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract ComposableStablePool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeePercentagesProvider", + "outputs": [ + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101806040523480156200001257600080fd5b506040516200921d3803806200921d83398101604081905262000035916200036d565b83836040518060200162000049906200021c565b601f1982820381018352601f90910116604052805183903090839060006002820460a081905280830360e08190528185529091508362000095816200013d602090811b620005e517901c565b60601b6001600160601b0319166080528285018051838252620000c4826200013d602090811b620005e517901c565b6001600160601b0319606091821b811660c05296909352905261010095909552505092821b831661012052509290921b909116610140525050426276a700016101605281516200011c9060029060208501906200022a565b508051620001329060039060208401906200022a565b505050505062000415565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506200018b6001600160a01b03831615156101ac62000191565b50919050565b81620001a257620001a281620001a6565b5050565b620001b8816210905360ea1b620001bb565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b617dca806200145383390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200026d57805160ff19168380011785556200029d565b828001600101855582156200029d579182015b828111156200029d57825182559160200191906001019062000280565b50620002ab929150620002af565b5090565b5b80821115620002ab5760008155600101620002b0565b600082601f830112620002d7578081fd5b81516001600160401b0380821115620002ee578283fd5b6040516020601f8401601f191682018101838111838210171562000310578586fd5b806040525081945083825286818588010111156200032d57600080fd5b600092505b8383101562000351578583018101518284018201529182019162000332565b83831115620003635760008185840101525b5050505092915050565b6000806000806080858703121562000383578384fd5b84516200039081620003ff565b6020860151909450620003a381620003ff565b60408601519093506001600160401b0380821115620003c0578384fd5b620003ce88838901620002c6565b93506060870151915080821115620003e4578283fd5b50620003f387828801620002c6565b91505092959194509250565b6001600160a01b0381168114620001b857600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405160601c61016051610fc56200048e60003980610232528061025b5250806103fa52508061047052508061042052508061063f52508061020952806106bb5250806106605250806101e852806106975250610fc56000f3fe608060405234801561001057600080fd5b50600436106100de5760003560e01c80636634b7531161008c578063851c1bb311610066578063851c1bb3146101845780638d928af8146101a4578063971e1833146101ac578063aaabadc5146101bf576100de565b80636634b753146101475780636c57f5a914610167578063739238d61461016f576100de565b80632f2770db116100bd5780632f2770db1461012d5780633f819b6f1461013757806354fd4d501461013f576100de565b8062c194db146100e3578063174481fa146101015780632da47c4014610117575b600080fd5b6100eb6101c7565b6040516100f89190610db5565b60405180910390f35b6101096101e6565b6040516100f8929190610d68565b61011f61022c565b6040516100f8929190610f17565b610135610296565b005b6100eb6102dd565b6100eb610373565b61015a610155366004610af6565b6103d1565b6040516100f89190610d82565b61015a6103ef565b6101776103f8565b6040516100f89190610dc8565b610197610192366004610b2e565b61041c565b6040516100f89190610d8d565b61017761046e565b6101776101ba366004610b72565b610492565b61017761056b565b60606101e160405180602001604052806000815250610637565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561028857807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610291565b60009250600091505b509091565b61029e610710565b6102a6610741565b6001805460ff1916811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156103695780601f1061033e57610100808354040283529160200191610369565b820191906000526020600020905b81548152906001019060200180831161034c57829003601f168201915b5050505050905090565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156103695780601f1061033e57610100808354040283529160200191610369565b6001600160a01b031660009081526020819052604090205460ff1690565b60015460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610451929190610d50565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600080600061049f61022c565b9150915061055a604051806101c001604052806104ba61046e565b6001600160a01b031681526020016104d06103f8565b6001600160a01b031681526020018f81526020018e81526020018d81526020018b81526020018a815260200189151581526020018c8152602001888152602001848152602001838152602001876001600160a01b031681526020016105336102dd565b90526040516105459190602001610ddc565b60405160208183030381529060405285610756565b9d9c50505050505050505050505050565b600061057561046e565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156105ad57600080fd5b505afa1580156105c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e19190610b56565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506106316001600160a01b03831615156101ac6107c3565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016107028183866107d5565b505050505050505050919050565b60006107276000356001600160e01b03191661041c565b905061073e6107368233610813565b6101916107c3565b50565b61075461074c6103ef565b1560d36107c3565b565b6000610760610741565b600061076c84846108a3565b6001600160a01b038116600081815260208190526040808220805460ff191660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a290505b92915050565b816107d1576107d1816108e0565b5050565b5b602081106107f5578151835260209283019290910190601f19016107d6565b905182516020929092036101000a6000190180199091169116179052565b600061081d61056b565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161084c93929190610d96565b60206040518083038186803b15801561086457600080fd5b505afa158015610878573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089c9190610b12565b9392505050565b600060606108b084610637565b90506000838251602084016000f590506001600160a01b0381166108d8573d6000803e3d6000fd5b949350505050565b62461bcd60e51b600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b60445261073e916210905360ea1b906242414c90606490fd5b80356107bd81610f6c565b600082601f830112610956578081fd5b813561096961096482610f4c565b610f25565b81815291506020808301908481018184028601820187101561098a57600080fd5b60005b848110156109b25781356109a081610f6c565b8452928201929082019060010161098d565b505050505092915050565b600082601f8301126109cd578081fd5b81356109db61096482610f4c565b8181529150602080830190848101818402860182018710156109fc57600080fd5b60005b848110156109b2578135610a1281610f6c565b845292820192908201906001016109ff565b600082601f830112610a34578081fd5b8135610a4261096482610f4c565b818152915060208083019084810181840286018201871015610a6357600080fd5b60005b848110156109b257813584529282019290820190600101610a66565b80356107bd81610f81565b600082601f830112610a9d578081fd5b813567ffffffffffffffff811115610ab3578182fd5b610ac6601f8201601f1916602001610f25565b9150808252836020828501011115610add57600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215610b07578081fd5b813561089c81610f6c565b600060208284031215610b23578081fd5b815161089c81610f81565b600060208284031215610b3f578081fd5b81356001600160e01b03198116811461089c578182fd5b600060208284031215610b67578081fd5b815161089c81610f6c565b6000806000806000806000806000806101408b8d031215610b91578586fd5b8a3567ffffffffffffffff80821115610ba8578788fd5b610bb48e838f01610a8d565b9b5060208d0135915080821115610bc9578788fd5b610bd58e838f01610a8d565b9a5060408d0135915080821115610bea578788fd5b610bf68e838f01610946565b995060608d0135985060808d0135915080821115610c12578788fd5b610c1e8e838f016109bd565b975060a08d0135915080821115610c33578687fd5b50610c408d828e01610a24565b955050610c508c60c08d01610a82565b935060e08b01359250610c678c6101008d0161093b565b91506101208b013590509295989b9194979a5092959850565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015610cc55781516001600160a01b031687529582019590820190600101610ca0565b509495945050505050565b6000815180845260208085019450808401835b83811015610cc557815187529582019590820190600101610ce3565b15159052565b60008151808452815b81811015610d2a57602081850181015186830182015201610d0e565b81811115610d3b5782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6001600160a01b0392831681529116602082015260400190565b901515815260200190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b60006020825261089c6020830184610d05565b6001600160a01b0391909116815260200190565b600060208252610df0602083018451610c80565b6020830151610e026040840182610c80565b5060408301516101c0806060850152610e1f6101e0850183610d05565b91506060850151601f1980868503016080870152610e3d8483610d05565b935060808701519150808685030160a0870152610e5a8483610c8d565b935060a08701519150808685030160c0870152610e778483610c8d565b935060c08701519150808685030160e0870152610e948483610cd0565b935060e08701519150610100610eac81880184610cff565b8701516101208781019190915287015161014080880191909152870151610160808801919091528701516101808088019190915287015191506101a0610ef481880184610c80565b870151868503909101838701529050610f0d8382610d05565b9695505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610f4457600080fd5b604052919050565b600067ffffffffffffffff821115610f62578081fd5b5060209081020190565b6001600160a01b038116811461073e57600080fd5b801515811461073e57600080fdfea26469706673582212209e0aae2f26ba89d69b81af7af61eaa1316c922acdebe021f38d79fcb5f3c901364736f6c634300070100336104e06040523480156200001257600080fd5b5060405162007dca38038062007dca833981016040819052620000359162001a26565b6020810151600019620000488362000c9f565b620000538462000cd8565b8461010001518560000151600087604001518860600151620000808a608001513062000d2360201b60201c565b8a60800151516001016001600160401b03811180156200009f57600080fd5b50604051908082528060200260200182016040528015620000ca578160200160208202803683370190505b508b61012001518c61014001518d61016001518e6101800151828289898d85336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b815250878781600390805190602001906200012c9291906200170f565b508051620001429060049060208401906200170f565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001c090506276a70083111561019462000ebd565b620001d462278d0082111561019562000ebd565b4290910161014081905201610160528551620001f6906002111560c862000ebd565b620002106200020462000ed2565b8751111560c962000ebd565b620002268662000ed760201b620015b01760201c565b620002318462000ee3565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f9062000262908d9060040162001c9a565b602060405180830381600087803b1580156200027d57600080fd5b505af115801562000292573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b89190620019ee565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002ed9084908b908b9060040162001bfe565b600060405180830381600087803b1580156200030857600080fd5b505af11580156200031d573d6000803e3d6000fd5b505050508061018081815250508a6001600160a01b031663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200036457600080fd5b505afa15801562000379573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200039f919062001a07565b60601b6001600160601b0319166101a05250620003d1995050506001891015965061012c955062000ebd945050505050565b620003e461138882111561012d62000ebd565b6000620003ff826103e862000f7760201b620015ba1760201c565b90506200040c8162000fa6565b5050805151620004216002821160c862000ebd565b620004406001820383602001515162000fe560201b620015e51760201c565b6101c0819052815180516000906200045457fe5b60200260200101516001600160a01b0316610200816001600160a01b031660601b8152505081600001516001815181106200048b57fe5b60200260200101516001600160a01b0316610220816001600160a01b031660601b815250508160000151600281518110620004c257fe5b60200260200101516001600160a01b0316610240816001600160a01b031660601b8152505060038111620004f857600062000511565b8151805160039081106200050857fe5b60200260200101515b60601b6001600160601b0319166102605260048111620005335760006200054c565b8151805160049081106200054357fe5b60200260200101515b60601b6001600160601b03191661028052600581116200056e57600062000587565b8151805160059081106200057e57fe5b60200260200101515b60601b6001600160601b0319166102a05281518051620005c09190600090620005ac57fe5b602002602001015162000ff460201b60201c565b6102c05281518051620005da91906001908110620005ac57fe5b6102e05281518051620005f491906002908110620005ac57fe5b6103005260038111620006095760006200061f565b6200061f8260000151600381518110620005ac57fe5b6103205260048111620006345760006200064a565b6200064a8260000151600481518110620005ac57fe5b61034052600581116200065f57600062000675565b620006758260000151600581518110620005ac57fe5b61036052815151600019015b600081118015620006b2575082518051309190839081106200069f57fe5b60200260200101516001600160a01b0316115b15620006c2576000190162000681565b6101e08190528251516060906001600160401b0381118015620006e457600080fd5b506040519080825280602002602001820160405280156200070f578160200160208202803683370190505b5090506000805b8551518110156200084b57838110156200077657856020015181815181106200073b57fe5b60200260200101518382815181106200075057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505062000798565b8381146200079257856020015160018203815181106200073b57fe5b62000842565b620007e160006001600160a01b0316848381518110620007b457fe5b60200260200101516001600160a01b031614158260060184620010c360201b620015f2179092919060201c565b9150856040015180156200081c575060006001600160a01b03168382815181106200080857fe5b60200260200101516001600160a01b031614155b1562000842576200083f60018284620010c360201b620015f2179092919060201c565b91505b60010162000716565b506040850151151560f81b61046052815182906000906200086857fe5b60200260200101516001600160a01b0316610380816001600160a01b031660601b81525050816001815181106200089b57fe5b60200260200101516001600160a01b03166103a0816001600160a01b031660601b8152505081600281518110620008ce57fe5b60200260200101516001600160a01b03166103c0816001600160a01b031660601b815250506003825111620009055760006200091c565b816003815181106200091357fe5b60200260200101515b60601b6001600160601b0319166103e05281516004106200093f57600062000956565b816004815181106200094d57fe5b60200260200101515b60601b6001600160601b0319166104005281516005106200097957600062000990565b816005815181106200098757fe5b60200260200101515b60601b6001600160601b0319166104205261044052505082515160208085015151604086015151620009d195509293509190620010ec811b6200161917901c565b8051606090620009e2903062000d23565b8051909150600019015b60008111801562000a225750306001600160a01b031682828151811062000a0f57fe5b60200260200101516001600160a01b0316115b1562000a325760001901620009ec565b6000805b84515181101562000b4b578281141562000a4f57600191505b60208501518051828401916000918490811062000a6857fe5b60200260200101516001600160a01b03161462000b415762000ac2818760200151848151811062000a9557fe5b60200260200101518860400151858151811062000aae57fe5b60200260200101516200110c60201b60201c565b8560200151828151811062000ad357fe5b60200260200101516001600160a01b0316817fdd6d1c9badb346de6925b358a472c937b41698d2632696759e43fd6527feeec48860400151858151811062000b1757fe5b602002602001015160405162000b2e919062001caf565b60405180910390a362000b418162001207565b5060010162000a36565b5050505050600019811460f881901b6104a0526001600160601b0319606084901b166104805262000b7e83600262001246565b62000b8b83600362001246565b801562000ba55762000b9f83600062001246565b62000c64565b60405163178b2b9360e21b815262000c39906001600160a01b03851690635e2cae4c9062000bd99060009060040162001caf565b60206040518083038186803b15801562000bf257600080fd5b505afa15801562000c07573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c2d9190620019ee565b83111561025862000ebd565b600060008051602062007daa8339815191528360405162000c5b919062001caf565b60405180910390a25b8062000c71578162000c74565b60005b6104c0525050506101a0810151805162000c9791600d916020909101906200170f565b505062001d21565b62000ca962001790565b6040518060600160405280836080015181526020018360a0015181526020018360c0015181525090505b919050565b62000ce2620017b1565b604051806060016040528062000d0384608001513062000d2360201b60201c565b81526020018360a0015181526020018360e0015115158152509050919050565b606082516001016001600160401b038111801562000d4057600080fd5b5060405190808252806020026020018201604052801562000d6b578160200160208202803683370190505b50905082516000141562000dae57818160008151811062000d8857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505062000eb7565b82515b60008111801562000dea5750826001600160a01b031684600183038151811062000dd757fe5b60200260200101516001600160a01b0316115b1562000e375783600182038151811062000e0057fe5b602002602001015182828151811062000e1557fe5b6001600160a01b03909216602092830291909101909101526000190162000db1565b60005b8181101562000e865784818151811062000e5057fe5b602002602001015183828151811062000e6557fe5b6001600160a01b039092166020928302919091019091015260010162000e3a565b508282828151811062000e9557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050505b92915050565b8162000ece5762000ece81620013f1565b5050565b600690565b8062000ece8162001406565b62000efc62000ef16200148d565b82101560cb62000ebd565b62000f1562000f0a62001496565b82111560ca62000ebd565b62000f378160c0603f600854620014a260201b6200163617909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc9062000f6c90839062001caf565b60405180910390a150565b600082820262000f9f84158062000f9757508385838162000f9457fe5b04145b600362000ebd565b9392505050565b62000fb481804280620014c7565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a02338160405162000f6c919062001caf565b62000ece828214606762000ebd565b60006001600160a01b038216301415620010185750670de0b6b3a764000062000cd3565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200105457600080fd5b505afa15801562001069573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200108f919062001bdb565b60ff1690506000620010ae6012836200153a60201b6200165e1760201c565b600a0a670de0b6b3a764000002949350505050565b60006001821b1984168284620010db576000620010de565b60015b60ff16901b17949350505050565b620011078284148015620010ff57508183145b606762000ebd565b505050565b6000826001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200114857600080fd5b505afa1580156200115d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620011839190620019ee565b6000858152600a6020908152604090912054919250620011b2908290849086906200167462001552821b17901c565b6000868152600a602052604090819020919091555185907fb77a83204ca282e08dc3a65b0a1ca32ea4e6875c38ef0bf5bf75e52a67354fac90620011f890859062001caf565b60405180910390a25050505050565b6000818152600a60209081526040909120549062001230908290620016ac620015ae821b17901c565b6000928352600a60205260409092209190915550565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c3263906200127790859060040162001caf565b60206040518083038186803b1580156200129057600080fd5b505afa158015620012a5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012cb9190620019ee565b9050816200130f57620012e981620015d960201b620016c41760201c565b600b80546001600160401b0319166001600160401b0392909216919091179055620013c3565b600282141562001365576200132f81620015d960201b620016c41760201c565b600b80546001600160401b03929092166801000000000000000002600160401b600160801b0319909216919091179055620013c3565b6003821415620013b6576200138581620015d960201b620016c41760201c565b600b80546001600160401b0392909216600160801b02600160801b600160c01b0319909216919091179055620013c3565b620013c36101bb620013f1565b8160008051602062007daa83398151915282604051620013e4919062001caf565b60405180910390a2505050565b62001403816210905360ea1b620015f7565b50565b600281511015620014175762001403565b6000816000815181106200142757fe5b602002602001015190506000600190505b8251811015620011075760008382815181106200145157fe5b6020026020010151905062001482816001600160a01b0316846001600160a01b031610606562000ebd60201b60201c565b915060010162001438565b64e8d4a5100090565b67016345785d8a000090565b6000620014b184848462001658565b506001901b60001901811b1992909216911b1790565b620014e18160c06040620016b360201b620016e11760201c565b620014fb8360806040620016b360201b620016e11760201c565b6200151485604080620016b360201b620016e11760201c565b6200152e8760006040620016b360201b620016e11760201c565b17171760095550505050565b60006200154c83831115600162000ebd565b50900390565b600062001567606084901c1561014962000ebd565b620015a642830160e06020620015908660c083838c8c6000606062001636620014a2871b17861c565b620014a260201b6200163617909392919060201c565b949350505050565b600062000eb7620015bf83620016c8565b60608085620014a260201b6200163617909392919060201c565b6000620015f36001600160401b038311156101ba62000ebd565b5090565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b620016696101008310606462000ebd565b620016a2600182101580156200169a57506200169660ff8461010003620016e860201b620016f41760201c565b8211155b606462000ebd565b6200110783821c156101b462000ebd565b6000620016c284848462001658565b50501b90565b600062000eb760006060846200170060201b6200170a179092919060201c565b6000818310620016f9578162000f9f565b5090919050565b6001901b6000190191901c1690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200175257805160ff191683800117855562001782565b8280016001018555821562001782579182015b828111156200178257825182559160200191906001019062001765565b50620015f3929150620017d4565b60405180606001604052806060815260200160608152602001606081525090565b604051806060016040528060608152602001606081526020016000151581525090565b5b80821115620015f35760008155600101620017d5565b805162000eb78162001d0b565b600082601f83011262001809578081fd5b8151620018206200181a8262001cdf565b62001cb8565b8181529150602080830190848101818402860182018710156200184257600080fd5b60005b848110156200186e5781516200185b8162001d0b565b8452928201929082019060010162001845565b505050505092915050565b600082601f8301126200188a578081fd5b81516200189b6200181a8262001cdf565b818152915060208083019084810181840286018201871015620018bd57600080fd5b60005b848110156200186e578151620018d68162001d0b565b84529282019290820190600101620018c0565b600082601f830112620018fa578081fd5b81516200190b6200181a8262001cdf565b8181529150602080830190848101818402860182018710156200192d57600080fd5b60005b848110156200186e5781518452928201929082019060010162001930565b8051801515811462000eb757600080fd5b600082601f83011262001970578081fd5b81516001600160401b0381111562001986578182fd5b60206200199c601f8301601f1916820162001cb8565b92508183528481838601011115620019b357600080fd5b60005b82811015620019d3578481018201518482018301528101620019b6565b82811115620019e55760008284860101525b50505092915050565b60006020828403121562001a00578081fd5b5051919050565b60006020828403121562001a19578081fd5b815162000f9f8162001d0b565b60006020828403121562001a38578081fd5b81516001600160401b038082111562001a4f578283fd5b81840191506101c080838703121562001a66578384fd5b62001a718162001cb8565b905062001a7f8684620017eb565b815262001a908660208501620017eb565b602082015260408301518281111562001aa7578485fd5b62001ab5878286016200195f565b60408301525060608301518281111562001acd578485fd5b62001adb878286016200195f565b60608301525060808301518281111562001af3578485fd5b62001b0187828601620017f8565b60808301525060a08301518281111562001b19578485fd5b62001b278782860162001879565b60a08301525060c08301518281111562001b3f578485fd5b62001b4d87828601620018e9565b60c08301525062001b628660e085016200194e565b60e0820152610100838101519082015261012080840151908201526101408084015190820152610160808401519082015261018062001ba487828601620017eb565b908201526101a0838101518381111562001bbc578586fd5b62001bca888287016200195f565b918301919091525095945050505050565b60006020828403121562001bed578081fd5b815160ff8116811462000f9f578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562001c4a5762001c37855162001cff565b8352938301939183019160010162001c22565b505084810360408601528551808252908201925081860190845b8181101562001c8c5762001c79835162001cff565b8552938301939183019160010162001c64565b509298975050505050505050565b602081016003831062001ca957fe5b91905290565b90815260200190565b6040518181016001600160401b038111828210171562001cd757600080fd5b604052919050565b60006001600160401b0382111562001cf5578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146200140357600080fd5b60805160a05160c05160e0516101005160601c6101205160601c6101405161016051610180516101a05160601c6101c0516101e0516102005160601c6102205160601c6102405160601c6102605160601c6102805160601c6102a05160601c6102c0516102e051610300516103205161034051610360516103805160601c6103a05160601c6103c05160601c6103e05160601c6104005160601c6104205160601c610440516104605160f81c6104805160601c6104a05160f81c6104c051615ed862001ed260003980610e4052508061091d52508061089d52806108c852806108f3525080610fef5280611277525080612b23525080611c87525080611c57525080611c27525080611bf7525080611bc7525080611b97525080612fb6525080612f86525080612f56525080612f26525080612ef6525080612ec6525080611f82525080611f40525080611efe525080611ebc525080611e7a525080611e385250806110805250806117395250806112d3525080610bff525080611b6b525080611b4752508061118052508061115c5250806110b8525080612d34525080612d76525080612d555250615ed86000f3fe608060405234801561001057600080fd5b50600436106103835760003560e01c806370464016116101de57806395d89b411161010f578063d2946c2b116100ad578063ddf4627b1161007c578063ddf4627b146106f6578063eb0f24d6146106fe578063ed24911d14610706578063f4b7964d1461070e57610383565b8063d2946c2b146106b5578063d505accf146106bd578063d5c096c4146106d0578063dd62ed3e146106e357610383565b8063aaabadc5116100e9578063aaabadc51461068a578063ab7759f114610692578063b35056b8146106a5578063b7b814fc146106ad57610383565b806395d89b411461065c578063a457c2d714610664578063a9059cbb1461067757610383565b80638456cb591161017c57806387ec68171161015657806387ec681714610619578063893d20e81461062c5780638d928af81461064157806390193b7c1461064957610383565b80638456cb59146105f6578063851c1bb3146105fe578063876f303b1461061157610383565b806377151bee116101b857806377151bee146105b05780637ecebe00146105b85780637f1260d1146105cb57806382687a56146105ee57610383565b8063704640161461056957806370a082311461057c57806374f3b0091461058f57610383565b80633644e515116102b857806354a844ba1161025657806355c676281161023057806355c67628146105215780636028bfd414610529578063679aefce1461054a5780636daccffa1461055257610383565b806354a844ba146104fe57806354dea00a1461050657806354fd4d501461051957610383565b8063395093511161029257806339509351146104ba5780633c975d51146104cd5780633f4ba83a146104e357806350dd6ed9146104eb57610383565b80633644e5151461049757806338e9922e1461049f57806338fff2d0146104b257610383565b80631c0de0511161032557806323b872dd116102ff57806323b872dd146104495780632df2c7c01461045c5780632f1a0bc91461046f578063313ce5671461048257610383565b80631c0de051146104085780631dd746ea1461041f578063238a2d591461043457610383565b8063095ea7b311610361578063095ea7b3146103ce5780630da0669c146103ee57806315b0015b146103f857806318160ddd1461040057610383565b806301ec954a1461038857806304842d4c146103b157806306fdde03146103b9575b600080fd5b61039b6103963660046158c7565b610721565b6040516103a89190615ce8565b60405180910390f35b61039b6107c7565b6103c16107d6565b6040516103a89190615dbe565b6103e16103dc366004615504565b61086c565b6040516103a89190615cc5565b6103f6610883565b005b6103e161091b565b61039b61093f565b610410610945565b6040516103a893929190615cd0565b61042761096e565b6040516103a89190615c8d565b61043c610978565b6040516103a89190615ba9565b6103e1610457366004615454565b610a13565b6103f661046a366004615400565b610a87565b6103f661047d366004615a16565b610aeb565b61048a610bce565b6040516103a89190615e29565b61039b610bd7565b6103f66104ad3660046159e6565b610be1565b61039b610bfd565b6103e16104c8366004615504565b610c21565b6104d5610c5c565b6040516103a8929190615e00565b6103f6610c87565b6103f66104f9366004615702565b610c99565b6103f6610cb7565b61039b610514366004615400565b610cc9565b6103c1610ce4565b61039b610d45565b61053c61053736600461561b565b610d58565b6040516103a8929190615dd1565b61039b610d8f565b61055a610dfb565b6040516103a893929190615dea565b61039b6105773660046159e6565b610e16565b61039b61058a366004615400565b610ecf565b6105a261059d36600461561b565b610eea565b6040516103a8929190615ca0565b6103e1610fed565b61039b6105c6366004615400565b611011565b6105de6105d9366004615400565b61101c565b6040516103a89493929190615e0e565b61039b61107e565b6103f66110a2565b61039b61060c3660046156be565b6110b4565b61039b611106565b61053c61062736600461561b565b611134565b61063461115a565b6040516103a89190615b95565b61063461117e565b61039b610657366004615400565b6111a2565b6103c16111bd565b6103e1610672366004615504565b61121e565b6103e1610685366004615504565b61125c565b610634611269565b6103e16106a0366004615400565b611273565b6103e16112ae565b6103f66112bf565b6106346112d1565b6103f66106cb366004615494565b6112f5565b6105a26106de36600461561b565b611380565b61039b6106f136600461541c565b6114a3565b61039b6114e0565b6103f66114e6565b61039b611512565b6103f661071c366004615504565b61151c565b6000846080015161074e61073361117e565b6001600160a01b0316336001600160a01b03161460cd611719565b610763610759610bfd565b82146101f4611719565b61076b611727565b61077d8484610778611737565b61175b565b6060610787611773565b905060008751600181111561079857fe5b146107af576107aa878787878561180c565b6107bc565b6107bc8787878785611865565b979650505050505050565b60006107d16118a0565b905090565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108625780601f1061083757610100808354040283529160200191610862565b820191906000526020600020905b81548152906001019060200180831161084557829003601f168201915b5050505050905090565b60006108793384846118a7565b5060015b92915050565b61088b61190f565b61089361091b565b156108c3576108c37f00000000000000000000000000000000000000000000000000000000000000006000611984565b6108ee7f00000000000000000000000000000000000000000000000000000000000000006002611984565b6109197f00000000000000000000000000000000000000000000000000000000000000006003611984565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b6000806000610952611b28565b15925061095d611b45565b9150610967611b69565b9050909192565b60606107d1611773565b60606000610984611737565b905060608167ffffffffffffffff8111801561099f57600080fd5b506040519080825280602002602001820160405280156109c9578160200160208202803683370190505b50905060005b82811015610a0c576109e081611b8d565b8282815181106109ec57fe5b6001600160a01b03909216602092830291909101909101526001016109cf565b5091505090565b600080610a2085336114a3565b9050610a44336001600160a01b0387161480610a3c5750838210155b61019e611719565b610a4f858585611cb6565b336001600160a01b03861614801590610a6a57506000198114155b15610a7c57610a7c85338584036118a7565b506001949350505050565b610a8f611d96565b6000610a9a82611e34565b90506000610aa782611b8d565b9050610ac06001600160a01b0382161515610155611719565b6000828152600a6020526040812054610ad890611fc2565b9050610ae5838383611fd1565b50505050565b610af36120b4565b610b03600183101561012c611719565b610b1461138883111561012d611719565b6000610b20824261165e565b9050610b346201518082101561013d611719565b600080610b3f6120e2565b91509150610b50811561013e611719565b6000610b5e866103e86115ba565b90506000838211610b8d57610b88610b7962015180866115ba565b610b8384886115ba565b612156565b610ba7565b610ba7610b9d62015180846115ba565b610b8386886115ba565b9050610bb9600282111561013f611719565b610bc584834289612189565b50505050505050565b60055460ff1690565b60006107d1611512565b610be96120b4565b610bf16121d8565b610bfa816121eb565b50565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610879918590610c579086612264565b6118a7565b600c546000908190610c718160e9601761170a565b9250610c8081600060e961170a565b9150509091565b610c8f6120b4565b6109196000612276565b610ca16120b4565b610ca96121d8565b610cb382826122e9565b5050565b610cbf6120b4565b61091960016123de565b6000610cdc610cd783611e34565b612435565b90505b919050565b600d8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108625780601f1061083757610100808354040283529160200191610862565b6008546000906107d19060c0603f61170a565b60006060610d6e8651610d69611737565b6115e5565b610d83898989898989896124886124aa612513565b97509795505050505050565b60006060600080600080610da161263d565b9398509196509450925090506000610db98585612264565b90506000610dc56120e2565b5090506000848214610de057610ddb828961272d565b610de2565b835b9050610dee818461288f565b9850505050505050505090565b6000806000610e086120e2565b90949093506103e892509050565b6000610e206112ae565b15610e2d57506000610cdf565b81610e7957610e3a61091b565b610e64577f0000000000000000000000000000000000000000000000000000000000000000610e72565b600b5467ffffffffffffffff165b9050610cdf565b6002821415610ea15750600b5468010000000000000000900467ffffffffffffffff16610cdf565b6003821415610ec45750600b54600160801b900467ffffffffffffffff16610cdf565b610cdf6101bb6128e0565b6001600160a01b031660009081526020819052604090205490565b60608088610ef961073361117e565b610f04610759610bfd565b60606000610f11866128f0565b15610f3957610f1e61291f565b610f3089610f2a61093f565b88612932565b92509050610f8b565b610f41611727565b6060610f4b611773565b9050610f578a82612977565b610f7b8d8d8d8d8d610f676112ae565b610f71578d610f74565b60005b878e612488565b93509150610f8983826124aa565b505b610f958b826129e0565b81895167ffffffffffffffff81118015610fae57600080fd5b50604051908082528060200260200182016040528015610fd8578160200160208202803683370190505b509450945050505b5097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610cdc826111a2565b6000806000806000600a600061103188611e34565b81526020810191909152604001600020549050611052811515610155611719565b61105b816129ea565b9450611066816129f8565b935061107181612a06565b9597949650949392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6110aa6120b4565b6109196001612276565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016110e9929190615b52565b604051602081830303815290604052805190602001209050919050565b600080600061111361263d565b5050925092505061112d818361226490919063ffffffff16565b9250505090565b600060606111458651610d69611737565b610d8389898989898989612a28612a39612513565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108625780601f1061083757610100808354040283529160200191610862565b60008061122b33856114a3565b905080831061124557611240338560006118a7565b611252565b61125233858584036118a7565b5060019392505050565b6000610879338484611cb6565b60006107d1612aa2565b60007f00000000000000000000000000000000000000000000000000000000000000008015610cdc5750610cdc6112a983611e34565b612b1c565b6008546000906107d19060ff612b47565b6112c76120b4565b61091960006123de565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886113248c6111a2565b8960405160200161133a96959493929190615d10565b60405160208183030381529060405280519060200120905061136b8882611362878787612b51565b886101f8612b90565b6113768888886118a7565b5050505050505050565b6060808861138f61073361117e565b61139a610759610bfd565b6113a2611727565b60606113ac611773565b90506113b661093f565b61146357600060606113cb8d8d8d868b612be7565b915091506113e46113da6118a0565b83101560cc611719565b6113f660006113f16118a0565b612cc0565b6114098b6114026118a0565b8403612cc0565b6114138184612a39565b808a5167ffffffffffffffff8111801561142c57600080fd5b50604051908082528060200260200182016040528015611456578160200160208202803683370190505b5095509550505050610fe0565b61146d8882612977565b600060606114958d8d8d8d8d6114816112ae565b61148b578d61148e565b60005b898e612a28565b915091506114098b83612cc0565b60006114ad61117e565b6001600160a01b0316826001600160a01b031614156114cf575060001961087d565b6114d98383612cca565b905061087d565b60001981565b6114ee6120b4565b6000806114f96120e2565b9150915061150981610140611719565b610cb382612cf5565b60006107d1612d30565b6115246120b4565b61152c611d96565b600061153783611e34565b9050600061154482611b8d565b905061155d6001600160a01b0382161515610155611719565b611568828285611fd1565b806001600160a01b0316827fdd6d1c9badb346de6925b358a472c937b41698d2632696759e43fd6527feeec4856040516115a29190615ce8565b60405180910390a350505050565b80610cb381612dcd565b60008282026115de8415806115d75750838583816115d457fe5b04145b6003611719565b9392505050565b610cb38183146067611719565b60006001821b198416828461160857600061160b565b60015b60ff16901b17949350505050565b611631828414801561162a57508183145b6067611719565b505050565b6000611643848484612e46565b5082821b6000196001831b01831b198516175b949350505050565b600061166e838311156001611719565b50900390565b6000611687606084901c15610149611719565b61165642830160e060206116a48660c083838c8c60006060611636565b929190611636565b6000610cdc6116ba836129ea565b8390606080611636565b60006116dd67ffffffffffffffff8311156101ba611719565b5090565b60006116ee848484612e46565b50501b90565b600081831061170357816115de565b5090919050565b6001901b6000190191901c1690565b81610cb357610cb3816128e0565b61172f612e8c565b610919612e94565b7f000000000000000000000000000000000000000000000000000000000000000090565b611631818410801561176c57508183105b6064611719565b6060600061177f611737565b905060608167ffffffffffffffff8111801561179a57600080fd5b506040519080825280602002602001820160405280156117c4578160200160208202803683370190505b50905060005b82811015610a0c576117ed6117de82612435565b6117e783612ebc565b90612fda565b8282815181106117f957fe5b60209081029190910101526001016117ca565b60208501516000906001600160a01b0316301480611836575060408601516001600160a01b031630145b61184c576118478686868686613006565b611859565b6118598686868686613070565b90505b95945050505050565b60208501516000906001600160a01b031630148061188f575060408601516001600160a01b031630145b61184c576118478686868686613174565b620f424090565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611902908590615ce8565b60405180910390a3505050565b611917611d96565b61191f6121d8565b6060600080600061192e61263d565b945094509450509350600083111561194957611949836131cb565b60006119536120e2565b509050600083821461196e57611969828761272d565b611970565b825b905061197c82826131dc565b505050505050565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c3263906119b3908590600401615ce8565b60206040518083038186803b1580156119cb57600080fd5b505afa1580156119df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0391906159fe565b905081611a3a57611a13816116c4565b600b805467ffffffffffffffff191667ffffffffffffffff92909216919091179055611aeb565b6002821415611a8857611a4c816116c4565b600b805467ffffffffffffffff9290921668010000000000000000026fffffffffffffffff000000000000000019909216919091179055611aeb565b6003821415611ae057611a9a816116c4565b600b805467ffffffffffffffff92909216600160801b027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff909216919091179055611aeb565b611aeb6101bb6128e0565b817f6bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a82604051611b1b9190615ce8565b60405180910390a2505050565b6000611b32611b69565b4211806107d157505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b600081611bbb57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160011415611beb57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160021415611c1b57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160031415611c4b57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160041415611c7b57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160051415611cab57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b610cdf6101356128e0565b611ccd6001600160a01b0384161515610198611719565b611ce46001600160a01b0383161515610199611719565b611cef838383611631565b6001600160a01b038316600090815260208190526040902054611d1590826101a0613202565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611d449082612264565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611902908590615ce8565b60408051600080825260208201909252606091611dc9565b611db661526c565b815260200190600190039081611dae5790505b509050611dd461117e565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b8152600401611dff9190615bf6565b600060405180830381600087803b158015611e1957600080fd5b505af1158015611e2d573d6000803e3d6000fd5b5050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e7857506000610cdf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611eba57506001610cdf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611efc57506002610cdf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611f3e57506003610cdf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611f8057506004610cdf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611cab57506005610cdf565b6000610cdc8260c0602061170a565b6000826001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b15801561200c57600080fd5b505afa158015612020573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204491906159fe565b6000858152600a6020526040902054909150612061818385611674565b6000868152600a602052604090819020919091555185907fb77a83204ca282e08dc3a65b0a1ca32ea4e6875c38ef0bf5bf75e52a67354fac906120a5908590615ce8565b60405180910390a25050505050565b60006120cb6000356001600160e01b0319166110b4565b9050610bfa6120da8233613218565b610191611719565b6000806000806000806120f3613301565b93509350935093508042101561214657600194508383111561212a57818103824203858503028161212057fe5b0484019550612141565b818103824203848603028161213b57fe5b04840395505b61214e565b600094508295505b505050509091565b60006121658215156004611719565b826121725750600061087d565b81600184038161217e57fe5b04600101905061087d565b61219584848484613360565b7f1835882ee7a34ac194f717a35e09bb1d24c82a3b9d854ab6c9749525b714cdf2848484846040516121ca9493929190615e0e565b60405180910390a150505050565b6109196121e3611b28565b610192611719565b6122006121f661339f565b82101560cb611719565b61221561220b6133a8565b82111560ca611719565b600854612226908260c0603f611636565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90612259908390615ce8565b60405180910390a150565b60008282016115de8482101583611719565b801561229657612291612287611b45565b4210610193611719565b6122ab565b6122ab6122a1611b69565b42106101a9611719565b6007805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490612259908390615cc5565b60006122f3610bfd565b905060006122ff61117e565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b815260040161232c929190615d89565b60806040518083038186803b15801561234457600080fd5b505afa158015612358573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237c9190615a37565b604051630639cdb560e21b81529094506001600160a01b03851693506318e736d492506123b0915085908790600401615d70565b600060405180830381600087803b1580156123ca57600080fd5b505af1158015611376573d6000803e3d6000fd5b6008546123ed908260ff6115f2565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890612420908390615cc5565b60405180910390a180610bfa57610bfa6133b4565b600061243f61107e565b8214156124555750670de0b6b3a7640000610cdf565b6000828152600a6020526040902054801561247857612473816129ea565b6115de565b670de0b6b3a76400009392505050565b60006060612499600088868661348e565b915091509850989650505050505050565b815181516124b99082906115e5565b60005b81811015610ae5576124f48482815181106124d357fe5b60200260200101518483815181106124e757fe5b602002602001015161288f565b84828151811061250057fe5b60209081029190910101526001016124bc565b3330146125d1576000306001600160a01b0316600036604051612537929190615b6a565b6000604051808303816000865af19150503d8060008114612574576040519150601f19603f3d011682016040523d82523d6000602084013e612579565b606091505b50509050806000811461258857fe5b60046000803e6000516001600160e01b0319166343adbafb60e01b81146125b3573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b6125d9611727565b60606125e3611773565b90506125ef8782612977565b600060606126078c8c8c8c8c8c898d8d63ffffffff16565b9150915061261981848663ffffffff16565b8051601f1982018390526343adbafb603f1983015260200260231982016044820181fd5b6060600080600080606061264f61117e565b6001600160a01b031663f94d4668612665610bfd565b6040518263ffffffff1660e01b81526004016126819190615ce8565b60006040518083038186803b15801561269957600080fd5b505afa1580156126ad573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126d5919081019061552f565b509150506126ea816126e5611773565b612977565b6126f38161353c565b965094506000612701610c5c565b90945090506000612713888684613575565b9450905061272187826135f1565b95505050509091929394565b80516000908190815b8181101561276e5761276485828151811061274d57fe5b60200260200101518461226490919063ffffffff16565b9250600101612736565b508161277f5760009250505061087d565b600082868302825b60ff811015612878578260005b868110156127d5576127cb6127a983876115ba565b6127c68c84815181106127b857fe5b60200260200101518a6115ba565b613609565b9150600101612794565b5083945061282e61280d6128076127ec848a6115ba565b6128016127f9888d6115ba565b6103e8613609565b90612264565b866115ba565b6127c661281d89600101856115ba565b6128016127f96103e889038a6115ba565b93508484111561285657600185850311612851578397505050505050505061087d565b61286f565b60018486031161286f578397505050505050505061087d565b50600101612787565b506128846101416128e0565b505050505092915050565b600061289e8215156004611719565b826128ab5750600061087d565b670de0b6b3a7640000838102906128ce908583816128c557fe5b04146005611719565b8281816128d757fe5b0491505061087d565b610bfa816210905360ea1b613629565b6000808251118015610cdc575060ff8016828060200190518101906129159190615a77565b60ff161492915050565b61091961292a6112ae565b6101b6611719565b60006060600060606129438761353c565b915091506000606061295683858961368a565b91509150816129668260006136b6565b95509550505050505b935093915050565b815181516129869082906115e5565b60005b81811015610ae5576129c18482815181106129a057fe5b60200260200101518483815181106129b457fe5b6020026020010151612fda565b8482815181106129cd57fe5b6020908102919091010152600101612989565b610cb38282613773565b6000610cdc8282606061170a565b6000610cdc8260608061170a565b600080612a1283611fc2565b9150612a218360e0602061170a565b9050915091565b60006060612499600188868661348e565b81518151612a489082906115e5565b60005b81811015610ae557612a83848281518110612a6257fe5b6020026020010151848381518110612a7657fe5b602002602001015161383f565b848281518110612a8f57fe5b6020908102919091010152600101612a4b565b6000612aac61117e565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015612ae457600080fd5b505afa158015612af8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d191906156e6565b6000610cdc7f0000000000000000000000000000000000000000000000000000000000000000600684015b1c60019081161490565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b6000612b9b8561388d565b9050612bb1612bab8783876138a9565b83611719565b612bc0428410156101b8611719565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606000612bf684613958565b9050612c116000826003811115612c0957fe5b1460ce611719565b6060612c1c8561396e565b9050612c2a815187516115e5565b612c348187612977565b6000612c3e6120e2565b5090506060612c4c83613984565b90506000612c5a838361272d565b9050806000612c776d80000000000000000000000000008361165e565b9050612c838d82612cc0565b8086612c8d61107e565b81518110612c9757fe5b602002602001018181525050612cad85846131dc565b509c939b50929950505050505050505050565b610cb38282613a26565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b612d0181824242613360565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a0233816040516122599190615ce8565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612d9d613ab3565b30604051602001612db2959493929190615d44565b60405160208183030381529060405280519060200120905090565b600281511015612ddc57610bfa565b600081600081518110612deb57fe5b602002602001015190506000600190505b8251811015611631576000838281518110612e1357fe5b60200260200101519050612e3c816001600160a01b0316846001600160a01b0316106065611719565b9150600101612dfc565b612e5561010083106064611719565b612e7d6001821015801561176c5750612e7360ff84610100036116f4565b8211156064611719565b61163183821c156101b4611719565b6109196121d8565b6000612e9e611737565b905060005b81811015610cb357612eb481613ab7565b600101612ea3565b600081612eea57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160011415612f1a57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160021415612f4a57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160031415612f7a57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160041415612faa57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160051415611cab57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b6000828202612ff48415806115d75750838583816115d457fe5b670de0b6b3a764000090049392505050565b60006130128583612977565b613033866060015183858151811061302657fe5b6020026020010151613b0b565b6060870152600061304687878787613b17565b90506130658184878151811061305857fe5b6020026020010151613b2b565b90506107bc81613b37565b600080808751600181111561308157fe5b14905061308e8684612977565b6130ae876060015184836130a257866130a4565b875b8151811061302657fe5b876060018181525050600060606000806130c78a613b53565b93509350935093506000806130da61107e565b8a14613100576130fb878e60600151876130f38e613bbc565b888b89613bf1565b61311b565b61311b878e60600151876131138f613bbc565b888b89613c2a565b9150915061312c8486858985613c4e565b8661314657613141828a8d8151811061305857fe5b613163565b613163828a8c8151811061315657fe5b6020026020010151613cce565b9d9c50505050505050505050505050565b60006131838660600151613cda565b60608701526131928583612977565b6131a6866060015183868151811061302657fe5b606087015260006131b987878787613cfb565b90506107bc8184868151811061315657fe5b610bfa6131d66112d1565b82612cc0565b6131e981600060e96116e1565b6131f68360e960176116e1565b17600c55610cb3613d0f565b60006132118484111583611719565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b61323761115a565b6001600160a01b031614158015613252575061325283613d45565b1561327a5761325f61115a565b6001600160a01b0316336001600160a01b031614905061087d565b613282612aa2565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016132b193929190615cf1565b60206040518083038186803b1580156132c957600080fd5b505afa1580156132dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d991906155fb565b6000806000806133206000604060095461170a9092919063ffffffff16565b6009549094506133329060408061170a565b600954909350613345906080604061170a565b6009549092506133589060c0604061170a565b905090919293565b61336d8160c060406116e1565b61337a83608060406116e1565b613386856040806116e1565b61339387600060406116e1565b17171760095550505050565b64e8d4a5100090565b67016345785d8a000090565b6133bc611d96565b60606133c661117e565b6001600160a01b031663f94d46686133dc610bfd565b6040518263ffffffff1660e01b81526004016133f89190615ce8565b60006040518083038186803b15801561341057600080fd5b505afa158015613424573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261344c919081019061552f565b5091505061345c816126e5611773565b606061346782613984565b905060006134736120e2565b5090506000613482828461272d565b9050610ae582826131dc565b60006060600060606000806134a289613b53565b935093509350935061529c8a6134ba57613d506134be565b613de55b9050600060606134d6868689878f8f8963ffffffff16565b9150915061529c8d6134ea5761165e6134ee565b6122645b90506134fb878383613e63565b600061350b89858463ffffffff16565b905061351a8789888c85613c4e565b836135268460006136b6565b9a509a5050505050505050505094509492505050565b600060606135638361354c61107e565b8151811061355657fe5b6020026020010151613ed0565b61356c84613984565b91509150915091565b6000806000806000613588888888613ee4565b9250925092508581116135a35760009450925061296f915050565b85830383830360006135c16135b782610e16565b6117e7858761288f565b905060006135dc6135d26002610e16565b6117e7858861288f565b919091019b939a509298505050505050505050565b60006115de61360084846115ba565b6127c684613f55565b60006136188215156004611719565b81838161362157fe5b049392505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60006060600061369984613f7b565b905060606136a8878784613f91565b919791965090945050505050565b6060825160010167ffffffffffffffff811180156136d357600080fd5b506040519080825280602002602001820160405280156136fd578160200160208202803683370190505b50905060005b815181101561376c5761371461107e565b811461374b578361372361107e565b82106137325760018203613734565b815b8151811061373e57fe5b602002602001015161374d565b825b82828151811061375957fe5b6020908102919091010152600101613703565b5092915050565b61378a6001600160a01b038316151561019b611719565b61379682600083611631565b6001600160a01b0382166000908152602081905260409020546137bc90826101b2613202565b6001600160a01b0383166000908152602081905260409020556137ef6137ea826137e461093f565b90614040565b61404e565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516138339190615ce8565b60405180910390a35050565b600061384e8215156004611719565b8261385b5750600061087d565b670de0b6b3a764000083810290613875908583816128c557fe5b82600182038161388157fe5b0460010191505061087d565b6000613897612d30565b826040516020016110e9929190615b7a565b60006138bb82516041146101b9611719565b60208281015160408085015160608601518251600080825295019283905292939092811a916001906138f4908990859088908890615da0565b6020604051602081039080840390855afa158015613916573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061394c5750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b600081806020019051810190610cdc9190615811565b6060818060200190518101906115de919061582c565b606080600183510367ffffffffffffffff811180156139a257600080fd5b506040519080825280602002602001820160405280156139cc578160200160208202803683370190505b50905060005b815181101561376c57836139e461107e565b82106139f357816001016139f5565b815b815181106139ff57fe5b6020026020010151828281518110613a1357fe5b60209081029190910101526001016139d2565b613a3260008383611631565b613a416137ea8261280161093f565b6001600160a01b038216600090815260208190526040902054613a649082612264565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613833908590615ce8565b4690565b613abf61107e565b811415613acb57610bfa565b6000818152600a60205260409020548015610cb357600080613aec83612a06565b9150915080421115610ae557610ae584613b0586611b8d565b84611fd1565b60006115de8383612fda565b600061185c60008660600151868686614053565b60006115de838361383f565b6000610cdc613b4c613b47610d45565b613f55565b839061383f565b60006060600080600080613b65610c5c565b91509150600060606000613b7a8a86866140c5565b9250925092506000613b8a6120e2565b5090506000868214613ba557613ba0828561272d565b613ba7565b825b949c939b509099509297509095505050505050565b6000613bd3613bc961107e565b8314156064611719565b613bdb61107e565b82106116dd57613bec82600161165e565b610cdc565b60008088613c0c57613c0788888888888861411d565b613c1a565b613c1a8888888888886141f4565b9150915097509795505050505050565b60008088613c4057613c07888888888888614255565b613c1a8888888888886142bb565b6000613c5a868661272d565b90506000613c68838561288f565b90506000613c768683612fda565b905080831115613cc4578083036000613ca0613c9a83613c9584610e16565b6115ba565b86613609565b90508015613cc1576000613cb487836135f1565b9050613cbf816131cb565b505b50505b61137688846131dc565b60006115de838361288f565b600080613cef613ce8610d45565b849061436a565b90506115de838261165e565b600061185c60018660600151868686614053565b6000613d19611737565b905060005b81811015610cb357613d2f81612b1c565b15613d3d57613d3d816143a6565b600101613d1e565b6000610cdc826143d4565b600060606000613d5f846143df565b90506001816002811115613d6f57fe5b1415613d8d57613d8387878a8c89896143f5565b9250925050613dda565b6002816002811115613d9b57fe5b1415613dac57613d83878a86614454565b6000816002811115613dba57fe5b1415613dcd57613d8387878a8c88614472565b613dd86101506128e0565b505b965096945050505050565b600060606000613df484613958565b90506001816003811115613e0457fe5b1415613e1857613d8387878a8c8989614513565b6003816003811115613e2657fe5b1415613e3757613d83878a86614562565b6002816003811115613e4557fe5b1415613e5857613d8387878a8c88614580565b613dd86101366128e0565b82518251613e729082906115e5565b60005b81811015611e2d57613eb1858281518110613e8c57fe5b6020026020010151858381518110613ea057fe5b60200260200101518563ffffffff16565b858281518110613ebd57fe5b6020908102919091010152600101613e75565b6000610cdc82613ede61093f565b9061165e565b6000806000613ef3858761272d565b9050838111613f0757808192509250613f4c565b613f1985613f14886145fa565b61272d565b9250613f2581846116f4565b9250613f3184846146eb565b9250613f3b610fed565b15613f4857829150613f4c565b8091505b93509350939050565b6000670de0b6b3a76400008210613f6d576000610cdc565b50670de0b6b3a76400000390565b6000818060200190518101906115de9190615a93565b60606000613f9f838561288f565b9050845167ffffffffffffffff81118015613fb957600080fd5b50604051908082528060200260200182016040528015613fe3578160200160208202803683370190505b50915060005b8551811015614037576140188287838151811061400257fe5b6020026020010151612fda90919063ffffffff16565b83828151811061402457fe5b6020908102919091010152600101613fe9565b50509392505050565b60006115de83836001613202565b600255565b6000606061406085613984565b9050600061406d85613bbc565b9050600061407a85613bbc565b905060006140866120e2565b5090506000614095828661272d565b90508a156140b7576140ab828686868e866146fb565b9550505050505061185c565b6140ab828686868e86614786565b6000606060008060606140d78861353c565b915091506000806140e9838a8a613575565b9150915060006140f985846135f1565b9050801561410a5761410a816131cb565b9390930199919850919650945050505050565b6000806060875167ffffffffffffffff8111801561413a57600080fd5b50604051908082528060200260200182016040528015614164578160200160208202803683370190505b5090508881888151811061417457fe5b6020026020010181815250506000614197878a848989614192610d45565b614819565b90506141bf8a8a8a815181106141a957fe5b602002602001015161165e90919063ffffffff16565b8989815181106141cb57fe5b602090810291909101015260006141e2878361165e565b919b919a509098505050505050505050565b600080600061420f8689898c898961420a610d45565b614aa9565b9050614221818989815181106141a957fe5b88888151811061422d57fe5b60209081029190910101526000614244868b61165e565b919a91995090975050505050505050565b60008060006142708689898c898961426b610d45565b614b98565b90506142988189898151811061428257fe5b602002602001015161226490919063ffffffff16565b8888815181106142a457fe5b60209081029190910101526000614244868b612264565b6000806060875167ffffffffffffffff811180156142d857600080fd5b50604051908082528060200260200182016040528015614302578160200160208202803683370190505b5090508881888151811061431257fe5b6020026020010181815250506000614335878a848989614330610d45565b614c65565b90506143478a8a8a8151811061428257fe5b89898151811061435357fe5b602090810291909101015260006141e28783612264565b60008282026143848415806115d75750838583816115d457fe5b8061439357600091505061087d565b670de0b6b3a76400006000198201613881565b6000818152600a60205260409020546143be816116ac565b6000928352600a60205260409092209190915550565b6000610cdc82614ecf565b600081806020019051810190610cdc9190615750565b6000606080600061440585614ef2565b91509150614415825188516115e5565b614422826126e588613984565b60006144348989858e8e614192610d45565b90506144448282111560cf611719565b9a91995090975050505050505050565b60006060600061446384614f15565b905060606136a8868884613f91565b6000606060008061448285614f2b565b91509150614494865182106064611719565b6060865167ffffffffffffffff811180156144ae57600080fd5b506040519080825280602002602001820160405280156144d8578160200160208202803683370190505b5090506144ec888884868e8e61420a610d45565b8183815181106144f857fe5b60209081029190910101529199919850909650505050505050565b6000606080600061452385614f42565b91509150614533875183516115e5565b614540826126e588613984565b60006145528989858e8e614330610d45565b90506144448282101560d0611719565b60006060600061457184614f5a565b905060606136a8868389614f70565b600060606000806145908561500c565b915091506145a2865182106064611719565b6060865167ffffffffffffffff811180156145bc57600080fd5b506040519080825280602002602001820160405280156145e6578160200160208202803683370190505b5090506144ec888884868e8e61426b610d45565b8051606090818167ffffffffffffffff8111801561461757600080fd5b50604051908082528060200260200182016040528015614641578160200160208202803683370190505b50905060005b828110156146e357600061465961107e565b821015614666578161466b565b816001015b905061467681612b1c565b6146935785828151811061468657fe5b60200260200101516146c3565b6146c38683815181106146a257fe5b6020026020010151600a600084815260200190815260200160002054615023565b8383815181106146cf57fe5b602090810291909101015250600101614647565b509392505050565b60008183101561170357816115de565b600061470d8387878151811061428257fe5b86868151811061471957fe5b60200260200101818152505060006147338888858861503e565b90508387878151811061474257fe5b60200260200101510387878151811061475757fe5b6020026020010181815250506147786001613ede838a89815181106141a957fe5b9150505b9695505050505050565b6000614798838786815181106141a957fe5b8685815181106147a457fe5b60200260200101818152505060006147be8888858961503e565b9050838786815181106147cd57fe5b6020026020010151018786815181106147e257fe5b602002602001018181525050614778600161280189898151811061480257fe5b60200260200101518461165e90919063ffffffff16565b600080805b87518110156148575761484d88828151811061483657fe5b60200260200101518361226490919063ffffffff16565b915060010161481e565b506060865167ffffffffffffffff8111801561487257600080fd5b5060405190808252806020026020018201604052801561489c578160200160208202803683370190505b5090506000805b89518110156149695760006148d4858c84815181106148be57fe5b602002602001015161383f90919063ffffffff16565b90506149168b83815181106148e557fe5b60200260200101516149108c85815181106148fc57fe5b60200260200101518e86815181106141a957fe5b9061383f565b84838151811061492257fe5b60200260200101818152505061495e6149578286858151811061494157fe5b602002602001015161436a90919063ffffffff16565b8490612264565b9250506001016148a3565b506060895167ffffffffffffffff8111801561498457600080fd5b506040519080825280602002602001820160405280156149ae578160200160208202803683370190505b50905060005b8a51811015614a795760008482815181106149cb57fe5b6020026020010151841115614a325760006149f46149e886613f55565b8e858151811061400257fe5b90506000614a08828e86815181106141a957fe5b9050614a29614a2282670de0b6b3a76400008d900361383f565b8390612264565b92505050614a49565b8a8281518110614a3e57fe5b602002602001015190505b614a59818d84815181106141a957fe5b838381518110614a6557fe5b6020908102919091010152506001016149b4565b506000614a868c8361272d565b90506000614a94828a61288f565b9050613163614aa282613f55565b8b9061436a565b600080614ac484614abe87614910818b61165e565b9061436a565b90506000614ad48a8a848b61503e565b90506000614ae8828b8b815181106141a957fe5b90506000805b8b51811015614b1057614b068c828151811061483657fe5b9150600101614aee565b506000614b39828d8d81518110614b2357fe5b602002602001015161288f90919063ffffffff16565b90506000614b4682613f55565b90506000614b54858361436a565b90506000614b62868361165e565b9050614b83614b7c83670de0b6b3a76400008d9003612fda565b8290612264565b98505050505050505050979650505050505050565b600080614bad84614abe87614910818b612264565b90506000614bbd8a8a848b61503e565b90506000614be78a8a81518110614bd057fe5b60200260200101518361165e90919063ffffffff16565b90506000805b8b51811015614c0f57614c058c828151811061483657fe5b9150600101614bed565b506000614c22828d8d81518110614b2357fe5b90506000614c2f82613f55565b90506000614c3d858361436a565b90506000614c4b868361165e565b9050614b83614b7c83670de0b6b3a76400008d900361383f565b600080805b8751811015614c8c57614c8288828151811061483657fe5b9150600101614c6a565b506060865167ffffffffffffffff81118015614ca757600080fd5b50604051908082528060200260200182016040528015614cd1578160200160208202803683370190505b5090506000805b8951811015614d6b576000614cf3858c8481518110614b2357fe5b9050614d358b8381518110614d0457fe5b6020026020010151614d2f8c8581518110614d1b57fe5b60200260200101518e868151811061428257fe5b9061288f565b848381518110614d4157fe5b602002602001018181525050614d606149578286858151811061400257fe5b925050600101614cd8565b506060895167ffffffffffffffff81118015614d8657600080fd5b50604051908082528060200260200182016040528015614db0578160200160208202803683370190505b50905060005b8a51811015614e7157600083858381518110614dce57fe5b60200260200101511115614e2a576000614df36149e886670de0b6b3a764000061165e565b90506000614e07828e86815181106141a957fe5b9050614e21614a2282670de0b6b3a76400008d9003612fda565b92505050614e41565b8a8281518110614e3657fe5b602002602001015190505b614e51818d848151811061428257fe5b838381518110614e5d57fe5b602090810291909101015250600101614db6565b506000614e7e8c8361272d565b90506000614e8c828a61288f565b9050670de0b6b3a7640000811115614ec057614eb38a670de0b6b3a763ffff198301612fda565b965050505050505061477c565b6000965050505050505061477c565b6000614ee163f4b7964d60e01b6110b4565b821480610cdc5750610cdc826151fb565b6060600082806020019051810190614f0a919061576b565b909590945092505050565b6000818060200190518101906115de91906157b0565b60008082806020019051810190614f0a91906157dc565b6060600082806020019051810190614f0a919061586f565b6000818060200190518101906115de919061588d565b60606000614f7e848461383f565b90506060855167ffffffffffffffff81118015614f9a57600080fd5b50604051908082528060200260200182016040528015614fc4578160200160208202803683370190505b50905060005b865181101561500257614fe38388838151811061494157fe5b828281518110614fef57fe5b6020908102919091010152600101614fca565b5095945050505050565b60008082806020019051810190614f0a91906158a9565b60006115de61503584613c95856129f8565b6127c6846129ea565b60008084518602905060008560008151811061505657fe5b60200260200101519050600086518760008151811061507157fe5b60200260200101510290506000600190505b87518110156150d7576150bc6150b66150af848b85815181106150a257fe5b60200260200101516115ba565b8a516115ba565b88613609565b91506150cd88828151811061274d57fe5b9250600101615083565b508685815181106150e457fe5b60200260200101518203915060006150fc87886115ba565b9050600061512861511c61511484610b8389886115ba565b6103e86115ba565b8a89815181106150a257fe5b9050600061514361513c6151148b89613609565b8690612264565b905060008061515f6151558686612264565b610b838d86612264565b905060005b60ff8110156151df578192506151946151818661280185866115ba565b610b838e613ede886128018860026115ba565b9150828211156151bd576001838303116151b8575097506116569650505050505050565b6151d7565b6001828403116151d7575097506116569650505050505050565b600101615164565b506151eb6101426128e0565b5050505050505050949350505050565b600061520d632f1a0bc960e01b6110b4565b8214806152285750615225637587926b60e11b6110b4565b82145b80610cdc5750610cdc826000615244631c74c91760e11b6110b4565b82148061525f575061525c6350dd6ed960e01b6110b4565b82145b80610cdc57506000610cdc565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565bfe5b803561087d81615e7e565b600082601f8301126152b9578081fd5b81356152cc6152c782615e5e565b615e37565b8181529150602080830190848101818402860182018710156152ed57600080fd5b60005b84811015612884578135845292820192908201906001016152f0565b600082601f83011261531c578081fd5b815161532a6152c782615e5e565b81815291506020808301908481018184028601820187101561534b57600080fd5b60005b848110156128845781518452928201929082019060010161534e565b600082601f83011261537a578081fd5b813567ffffffffffffffff811115615390578182fd5b6153a3601f8201601f1916602001615e37565b91508082528360208285010111156153ba57600080fd5b8060208401602084013760009082016020015292915050565b80516003811061087d57600080fd5b80516004811061087d57600080fd5b80356002811061087d57600080fd5b600060208284031215615411578081fd5b81356115de81615e7e565b6000806040838503121561542e578081fd5b823561543981615e7e565b9150602083013561544981615e7e565b809150509250929050565b600080600060608486031215615468578081fd5b833561547381615e7e565b9250602084013561548381615e7e565b929592945050506040919091013590565b600080600080600080600060e0888a0312156154ae578283fd5b87356154b981615e7e565b965060208801356154c981615e7e565b9550604088013594506060880135935060808801356154e781615e93565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215615516578182fd5b823561552181615e7e565b946020939093013593505050565b600080600060608486031215615543578081fd5b835167ffffffffffffffff8082111561555a578283fd5b818601915086601f83011261556d578283fd5b815161557b6152c782615e5e565b80828252602080830192508086018b82838702890101111561559b578788fd5b8796505b848710156155c65780516155b281615e7e565b84526001969096019592810192810161559f565b5089015190975093505050808211156155dd578283fd5b506155ea8682870161530c565b925050604084015190509250925092565b60006020828403121561560c578081fd5b815180151581146115de578182fd5b600080600080600080600060e0888a031215615635578081fd5b87359650602088013561564781615e7e565b9550604088013561565781615e7e565b9450606088013567ffffffffffffffff80821115615673578283fd5b61567f8b838c016152a9565b955060808a0135945060a08a0135935060c08a01359150808211156156a2578283fd5b506156af8a828b0161536a565b91505092959891949750929550565b6000602082840312156156cf578081fd5b81356001600160e01b0319811681146115de578182fd5b6000602082840312156156f7578081fd5b81516115de81615e7e565b60008060408385031215615714578182fd5b823561571f81615e7e565b9150602083013567ffffffffffffffff81111561573a578182fd5b6157468582860161536a565b9150509250929050565b600060208284031215615761578081fd5b6115de83836153d3565b60008060006060848603121561577f578081fd5b61578985856153d3565b9250602084015167ffffffffffffffff8111156157a4578182fd5b6155ea8682870161530c565b600080604083850312156157c2578182fd5b6157cc84846153d3565b9150602083015190509250929050565b6000806000606084860312156157f0578081fd5b6157fa85856153d3565b925060208401519150604084015190509250925092565b600060208284031215615822578081fd5b6115de83836153e2565b6000806040838503121561583e578182fd5b61584884846153e2565b9150602083015167ffffffffffffffff811115615863578182fd5b6157468582860161530c565b600080600060608486031215615883578081fd5b61578985856153e2565b6000806040838503121561589f578182fd5b6157cc84846153e2565b6000806000606084860312156158bd578081fd5b6157fa85856153e2565b600080600080608085870312156158dc578182fd5b843567ffffffffffffffff808211156158f3578384fd5b818701915061012080838a031215615909578485fd5b61591281615e37565b905061591e89846153f1565b815261592d896020850161529e565b602082015261593f896040850161529e565b6040820152606083013560608201526080830135608082015260a083013560a082015261596f8960c0850161529e565b60c08201526159818960e0850161529e565b60e08201526101008084013583811115615999578687fd5b6159a58b82870161536a565b8284015250508096505060208701359150808211156159c2578384fd5b506159cf878288016152a9565b949794965050505060408301359260600135919050565b6000602082840312156159f7578081fd5b5035919050565b600060208284031215615a0f578081fd5b5051919050565b60008060408385031215615a28578182fd5b50508035926020909101359150565b60008060008060808587031215615a4c578182fd5b8451935060208501519250604085015191506060850151615a6c81615e7e565b939692955090935050565b600060208284031215615a88578081fd5b81516115de81615e93565b60008060408385031215615aa5578182fd5b8251615ab081615e93565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015615afc57815187529582019590820190600101615ae0565b509495945050505050565b60008151808452815b81811015615b2c57602081850181015186830182015201615b10565b81811115615b3d5782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b81811015615bea5783516001600160a01b031683529284019291840191600101615bc5565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015615c80578151805160048110615c2957fe5b855280870151615c3b88870182615ac0565b508581015186860152606080820151615c5682880182615ac0565b505060809081015190615c6b86820183615ac0565b505060a0939093019290850190600101615c13565b5091979650505050505050565b6000602082526115de6020830184615acd565b600060408252615cb36040830185615acd565b828103602084015261185c8185615acd565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000838252604060208301526116566040830184615b07565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526115de6020830184615b07565b6000838252604060208301526116566040830184615acd565b9283529015156020830152604082015260600190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615e5657600080fd5b604052919050565b600067ffffffffffffffff821115615e74578081fd5b5060209081020190565b6001600160a01b0381168114610bfa57600080fd5b60ff81168114610bfa57600080fdfea2646970667358221220b4e550780037f90ebe851b3b7805b576dad987fb40b27b1310b67210681e408464736f6c634300070100336bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100de5760003560e01c80636634b7531161008c578063851c1bb311610066578063851c1bb3146101845780638d928af8146101a4578063971e1833146101ac578063aaabadc5146101bf576100de565b80636634b753146101475780636c57f5a914610167578063739238d61461016f576100de565b80632f2770db116100bd5780632f2770db1461012d5780633f819b6f1461013757806354fd4d501461013f576100de565b8062c194db146100e3578063174481fa146101015780632da47c4014610117575b600080fd5b6100eb6101c7565b6040516100f89190610db5565b60405180910390f35b6101096101e6565b6040516100f8929190610d68565b61011f61022c565b6040516100f8929190610f17565b610135610296565b005b6100eb6102dd565b6100eb610373565b61015a610155366004610af6565b6103d1565b6040516100f89190610d82565b61015a6103ef565b6101776103f8565b6040516100f89190610dc8565b610197610192366004610b2e565b61041c565b6040516100f89190610d8d565b61017761046e565b6101776101ba366004610b72565b610492565b61017761056b565b60606101e160405180602001604052806000815250610637565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561028857807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610291565b60009250600091505b509091565b61029e610710565b6102a6610741565b6001805460ff1916811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156103695780601f1061033e57610100808354040283529160200191610369565b820191906000526020600020905b81548152906001019060200180831161034c57829003601f168201915b5050505050905090565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156103695780601f1061033e57610100808354040283529160200191610369565b6001600160a01b031660009081526020819052604090205460ff1690565b60015460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610451929190610d50565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600080600061049f61022c565b9150915061055a604051806101c001604052806104ba61046e565b6001600160a01b031681526020016104d06103f8565b6001600160a01b031681526020018f81526020018e81526020018d81526020018b81526020018a815260200189151581526020018c8152602001888152602001848152602001838152602001876001600160a01b031681526020016105336102dd565b90526040516105459190602001610ddc565b60405160208183030381529060405285610756565b9d9c50505050505050505050505050565b600061057561046e565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156105ad57600080fd5b505afa1580156105c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e19190610b56565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506106316001600160a01b03831615156101ac6107c3565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016107028183866107d5565b505050505050505050919050565b60006107276000356001600160e01b03191661041c565b905061073e6107368233610813565b6101916107c3565b50565b61075461074c6103ef565b1560d36107c3565b565b6000610760610741565b600061076c84846108a3565b6001600160a01b038116600081815260208190526040808220805460ff191660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a290505b92915050565b816107d1576107d1816108e0565b5050565b5b602081106107f5578151835260209283019290910190601f19016107d6565b905182516020929092036101000a6000190180199091169116179052565b600061081d61056b565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161084c93929190610d96565b60206040518083038186803b15801561086457600080fd5b505afa158015610878573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089c9190610b12565b9392505050565b600060606108b084610637565b90506000838251602084016000f590506001600160a01b0381166108d8573d6000803e3d6000fd5b949350505050565b62461bcd60e51b600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b60445261073e916210905360ea1b906242414c90606490fd5b80356107bd81610f6c565b600082601f830112610956578081fd5b813561096961096482610f4c565b610f25565b81815291506020808301908481018184028601820187101561098a57600080fd5b60005b848110156109b25781356109a081610f6c565b8452928201929082019060010161098d565b505050505092915050565b600082601f8301126109cd578081fd5b81356109db61096482610f4c565b8181529150602080830190848101818402860182018710156109fc57600080fd5b60005b848110156109b2578135610a1281610f6c565b845292820192908201906001016109ff565b600082601f830112610a34578081fd5b8135610a4261096482610f4c565b818152915060208083019084810181840286018201871015610a6357600080fd5b60005b848110156109b257813584529282019290820190600101610a66565b80356107bd81610f81565b600082601f830112610a9d578081fd5b813567ffffffffffffffff811115610ab3578182fd5b610ac6601f8201601f1916602001610f25565b9150808252836020828501011115610add57600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215610b07578081fd5b813561089c81610f6c565b600060208284031215610b23578081fd5b815161089c81610f81565b600060208284031215610b3f578081fd5b81356001600160e01b03198116811461089c578182fd5b600060208284031215610b67578081fd5b815161089c81610f6c565b6000806000806000806000806000806101408b8d031215610b91578586fd5b8a3567ffffffffffffffff80821115610ba8578788fd5b610bb48e838f01610a8d565b9b5060208d0135915080821115610bc9578788fd5b610bd58e838f01610a8d565b9a5060408d0135915080821115610bea578788fd5b610bf68e838f01610946565b995060608d0135985060808d0135915080821115610c12578788fd5b610c1e8e838f016109bd565b975060a08d0135915080821115610c33578687fd5b50610c408d828e01610a24565b955050610c508c60c08d01610a82565b935060e08b01359250610c678c6101008d0161093b565b91506101208b013590509295989b9194979a5092959850565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015610cc55781516001600160a01b031687529582019590820190600101610ca0565b509495945050505050565b6000815180845260208085019450808401835b83811015610cc557815187529582019590820190600101610ce3565b15159052565b60008151808452815b81811015610d2a57602081850181015186830182015201610d0e565b81811115610d3b5782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6001600160a01b0392831681529116602082015260400190565b901515815260200190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b60006020825261089c6020830184610d05565b6001600160a01b0391909116815260200190565b600060208252610df0602083018451610c80565b6020830151610e026040840182610c80565b5060408301516101c0806060850152610e1f6101e0850183610d05565b91506060850151601f1980868503016080870152610e3d8483610d05565b935060808701519150808685030160a0870152610e5a8483610c8d565b935060a08701519150808685030160c0870152610e778483610c8d565b935060c08701519150808685030160e0870152610e948483610cd0565b935060e08701519150610100610eac81880184610cff565b8701516101208781019190915287015161014080880191909152870151610160808801919091528701516101808088019190915287015191506101a0610ef481880184610c80565b870151868503909101838701529050610f0d8382610d05565b9695505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610f4457600080fd5b604052919050565b600067ffffffffffffffff821115610f62578081fd5b5060209081020190565b6001600160a01b038116811461073e57600080fd5b801515811461073e57600080fdfea26469706673582212209e0aae2f26ba89d69b81af7af61eaa1316c922acdebe021f38d79fcb5f3c901364736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/index.ts b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/index.ts new file mode 100644 index 0000000..93e7569 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/index.ts @@ -0,0 +1,86 @@ +import { Task, TaskMode, TaskRunOptions } from '@src'; +import { ComposableStablePoolDeployment } from './input'; + +import { ZERO_ADDRESS, ZERO_BYTES32 } from '@helpers/constants'; +import { bn } from '@helpers/numbers'; +import * as expectEvent from '@helpers/expectEvent'; +import { getContractDeploymentTransactionHash, saveContractDeploymentTransactionHash } from '@src'; +import { ethers } from 'hardhat'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as ComposableStablePoolDeployment; + + const args = [input.Vault, input.ProtocolFeePercentagesProvider, input.FactoryVersion, input.PoolVersion]; + const factory = await task.deployAndVerify('ComposableStablePoolFactory', args, from, force); + + if (task.mode === TaskMode.LIVE) { + // We also create a Pool using the factory and verify it, to let us compute their action IDs and so that future + // Pools are automatically verified. We however don't run any of this code in CHECK mode, since we don't care about + // the contracts deployed here. The action IDs will be checked to be correct via a different mechanism. + + // The pauseWindowDuration and bufferPeriodDuration will be filled in later, but we need to declare them here to + // appease the type system. Those are constructor arguments, but automatically provided by the factory. + + const mockPoolArgs = { + vault: input.Vault, + protocolFeeProvider: input.ProtocolFeePercentagesProvider, + name: 'DO NOT USE - Mock Composable Stable Pool', + symbol: 'TEST', + tokens: [input.WETH, input.BAL].sort(function (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()); + }), + rateProviders: [ZERO_ADDRESS, ZERO_ADDRESS], + tokenRateCacheDurations: [0, 0], + exemptFromYieldProtocolFeeFlag: false, + amplificationParameter: bn(100), + swapFeePercentage: bn(1e12), + pauseWindowDuration: undefined, + bufferPeriodDuration: undefined, + owner: ZERO_ADDRESS, + version: input.PoolVersion, + }; + + // This mimics the logic inside task.deploy + if (force || !task.output({ ensure: false })['MockComposableStablePool']) { + const poolCreationReceipt = await ( + await factory.create( + mockPoolArgs.name, + mockPoolArgs.symbol, + mockPoolArgs.tokens, + mockPoolArgs.amplificationParameter, + mockPoolArgs.rateProviders, + mockPoolArgs.tokenRateCacheDurations, + mockPoolArgs.exemptFromYieldProtocolFeeFlag, + mockPoolArgs.swapFeePercentage, + mockPoolArgs.owner, + ZERO_BYTES32 + ) + ).wait(); + const event = expectEvent.inReceipt(poolCreationReceipt, 'PoolCreated'); + const mockPoolAddress = event.args.pool; + + await saveContractDeploymentTransactionHash(mockPoolAddress, poolCreationReceipt.transactionHash, task.network); + await task.save({ MockComposableStablePool: mockPoolAddress }); + } + + const mockPool = await task.instanceAt('ComposableStablePool', task.output()['MockComposableStablePool']); + + // In order to verify the Pool's code, we need to complete its constructor arguments by computing the factory + // provided arguments (pause durations). + + // The durations require knowing when the Pool was created, so we look for the timestamp of its creation block. + const txHash = await getContractDeploymentTransactionHash(mockPool.address, task.network); + const tx = await ethers.provider.getTransactionReceipt(txHash); + const poolCreationBlock = await ethers.provider.getBlock(tx.blockNumber); + + // With those and the period end times, we can compute the durations. + const { pauseWindowEndTime, bufferPeriodEndTime } = await mockPool.getPausedState(); + mockPoolArgs.pauseWindowDuration = pauseWindowEndTime.sub(poolCreationBlock.timestamp); + mockPoolArgs.bufferPeriodDuration = bufferPeriodEndTime + .sub(poolCreationBlock.timestamp) + .sub(mockPoolArgs.pauseWindowDuration); + + // We are now ready to verify the Pool + await task.verify('ComposableStablePool', mockPool.address, [mockPoolArgs]); + } +}; diff --git a/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/input.ts b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/input.ts new file mode 100644 index 0000000..0271453 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/input.ts @@ -0,0 +1,26 @@ +import { Task, TaskMode } from '@src'; + +export type ComposableStablePoolDeployment = { + Vault: string; + ProtocolFeePercentagesProvider: string; + FactoryVersion: string; + PoolVersion: string; + WETH: string; + BAL: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); +const WETH = new Task('00000000-tokens', TaskMode.READ_ONLY); +const BAL = new Task('00000000-tokens', TaskMode.READ_ONLY); + +const BaseVersion = { version: 5, deployment: '20230711-composable-stable-pool-v5' }; + +export default { + Vault, + ProtocolFeePercentagesProvider, + WETH, + BAL, + FactoryVersion: JSON.stringify({ name: 'ComposableStablePoolFactory', ...BaseVersion }), + PoolVersion: JSON.stringify({ name: 'ComposableStablePool', ...BaseVersion }), +}; diff --git a/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/arbitrum.json b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/arbitrum.json new file mode 100644 index 0000000..a137fb1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/arbitrum.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0xA8920455934Da4D853faac1f94Fe7bEf72943eF1", + "MockComposableStablePool": "0xd60020Ec34Ccf9A4385f917DE8F6956B77853ABF" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/avalanche.json b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/avalanche.json new file mode 100644 index 0000000..9faeccc --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/avalanche.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0xE42FFA682A26EF8F25891db4882932711D42e467", + "MockComposableStablePool": "0x9FD66B741ac546055E04E768Dd52edD33574D453" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/base.json b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/base.json new file mode 100644 index 0000000..bafa80d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/base.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x8df317a729fcaA260306d7de28888932cb579b88", + "MockComposableStablePool": "0x7F6E9d6a4093Af9d09bAE92d24bfE42Fc5369aE6" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/bsc.json b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/bsc.json new file mode 100644 index 0000000..2c74182 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/bsc.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x4fb47126Fa83A8734991E41B942Ac29A3266C968", + "MockComposableStablePool": "0x6bDa27339629e2d031F19555D3E44c205c31a13a" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/gnosis.json b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/gnosis.json new file mode 100644 index 0000000..60a4801 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/gnosis.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x4bdCc2fb18AEb9e2d281b0278D946445070EAda7", + "MockComposableStablePool": "0xa359b6BB0a89ED9f237C83f32fF05c658DA8b3aB" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/goerli.json b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/goerli.json new file mode 100644 index 0000000..259f8e5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/goerli.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x4bdCc2fb18AEb9e2d281b0278D946445070EAda7", + "MockComposableStablePool": "0x21cb3534c12E956a600cB3102b825686D10888e7" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/mainnet.json b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/mainnet.json new file mode 100644 index 0000000..e4fb364 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0xDB8d758BCb971e482B2C45f7F8a7740283A1bd3A", + "MockComposableStablePool": "0x20356663C17D31549d1210379749E2aE36722D8f" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/optimism.json b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/optimism.json new file mode 100644 index 0000000..744566f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/optimism.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x043A2daD730d585C44FB79D2614F295D2d625412", + "MockComposableStablePool": "0x77A0Df59d1d73B12B07Bcded0611279D8801ee96" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/polygon.json b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/polygon.json new file mode 100644 index 0000000..a45654a --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/polygon.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0xe2fa4e1d17725e72dcdAfe943Ecf45dF4B9E285b", + "MockComposableStablePool": "0xD35325DfC0B02718a41De7c94Ac9FC10D0AD5624" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/sepolia.json b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/sepolia.json new file mode 100644 index 0000000..183a969 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/sepolia.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0xa523f47A933D5020b23629dDf689695AA94612Dc", + "MockComposableStablePool": "0xE24Aba051aaeB07f981bD449f4B0b3250e08d4fB" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/zkevm.json b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/zkevm.json new file mode 100644 index 0000000..42bd88d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/output/zkevm.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x956CCab09898C0AF2aCa5e6C229c3aD4E93d9288", + "MockComposableStablePool": "0x7682e108Cd89d86303625c8478c21Ff86f401166" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/readme.md b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/readme.md new file mode 100644 index 0000000..3c0782d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/readme.md @@ -0,0 +1,22 @@ +# 2023-07-11 - Composable Stable Pool V5 + +Deployment of `ComposableStablePoolFactory`, which supersedes `20230320-composable-stable-pool-v4`. +This version is resilient to abrupt changes in the value reported by the pool tokens' rate providers, and calculates +protocol fees appropriately even with volatile or rapidly changing token rates. +It also disables individual flags for yield-exempt tokens; now the pool is either yield exempt or non-exempt for every +token. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`ComposableStablePoolFactory` artifact](./artifact/ComposableStablePoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/test/test.fork.ts b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/test/test.fork.ts new file mode 100644 index 0000000..7da179e --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230711-composable-stable-pool-v5/test/test.fork.ts @@ -0,0 +1,470 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; + +import * as expectEvent from '@helpers/expectEvent'; +import { describeForkTest } from '@src'; +import { Task, TaskMode } from '@src'; +import { getForkedNetwork } from '@src'; +import { getSigner, impersonate } from '@src'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; + +import { sharedBeforeEach } from '@helpers/sharedBeforeEach'; +import { MAX_UINT256, ONES_BYTES32, ZERO_ADDRESS, ZERO_BYTES32 } from '@helpers/constants'; +import { bn, fp } from '@helpers/numbers'; +import { BasePoolEncoder } from '@helpers/models/pools/utils/encoder'; +import { StablePoolEncoder } from '@helpers/models/pools/stable/encoder'; +import { SwapKind } from '@helpers/models/types/types'; +import { actionId } from '@helpers/models/misc/actions'; +import { expectEqualWithError } from '@helpers/relativeError'; +import { deploy } from '@src'; +import { randomBytes } from 'ethers/lib/utils'; + +describeForkTest('ComposableStablePool V5', 'mainnet', 17663500, function () { + let task: Task; + + let factory: Contract; + let owner: SignerWithAddress; + let whale: SignerWithAddress, auraWhale: SignerWithAddress, graviAuraWhale: SignerWithAddress; + let govMultisig: SignerWithAddress; + let vault: Contract; + let authorizer: Contract; + let busd: Contract, usdc: Contract, aura: Contract, graviAura: Contract; + + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + const LARGE_TOKEN_HOLDER = '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503'; + const USDC_SCALING = bn(1e12); // USDC has 6 decimals, so its scaling factor is 1e12 + const AURA_HOLDER = '0x2af2b2e485e1854fd71590c7ffd104db0f66f8a6'; + const GRAVI_AURA_HOLDER = '0x34CaE1d9e2D014B7b9E6295c66c554D7e79713d3'; + + const USDC = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'; + const BUSD = '0x4Fabb145d64652a948d72533023f6E7A623C7C53'; + const AURA = '0xC0c293ce456fF0ED870ADd98a0828Dd4d2903DBF'; + const GRAVIAURA = '0xBA485b556399123261a5F9c95d413B4f93107407'; + + const tokens = [BUSD, USDC]; + const amplificationParameter = bn(400); + const swapFeePercentage = fp(0.01); + const initialBalanceBUSD = fp(1e6); + const initialBalanceUSDC = fp(1e6).div(USDC_SCALING); + const initialBalances = [initialBalanceBUSD, initialBalanceUSDC]; + + // Pool deployed from previous factory version (GRAVI AURA - AURA) + const GRAVI_AURA_POOL = '0x6A9603E481Fb8F2c09804ea9AdaB49A338855B90'; + + enum AttackType { + DISABLE_RECOVERY_MODE, + UPDATE_PROTOCOL_FEE_CACHE, + UPDATE_TOKEN_RATE_CACHE, + SET_TOKEN_RATE_CACHE_DURATION, + } + + before('run task', async () => { + task = new Task('20230711-composable-stable-pool-v5', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('ComposableStablePoolFactory'); + }); + + before('load signers', async () => { + owner = await getSigner(); + whale = await impersonate(LARGE_TOKEN_HOLDER, fp(100)); + auraWhale = await impersonate(AURA_HOLDER, fp(100)); + graviAuraWhale = await impersonate(GRAVI_AURA_HOLDER, fp(100)); + + govMultisig = await impersonate(GOV_MULTISIG, fp(100)); + }); + + before('load vault and tokens', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.instanceAt('Vault', await factory.getVault()); + authorizer = await new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance( + 'Authorizer' + ); + + busd = await task.instanceAt('ERC20', BUSD); + usdc = await task.instanceAt('ERC20', USDC); + aura = await task.instanceAt('ERC20', AURA); + graviAura = await task.instanceAt('ERC20', GRAVIAURA); + + await busd.connect(whale).approve(vault.address, MAX_UINT256); + await usdc.connect(whale).approve(vault.address, MAX_UINT256); + }); + + async function createPool( + tokens: string[], + rateProvider = ZERO_ADDRESS, + initialize = true, + salt = '' + ): Promise { + const rateProviders: string[] = Array(tokens.length).fill(rateProvider); + const cacheDurations: BigNumber[] = Array(tokens.length).fill(bn(0)); + const exemptFlag = false; + + const tx = await factory.create( + 'CSP', + 'CSBPT', + tokens, + amplificationParameter, + rateProviders, + cacheDurations, + exemptFlag, + swapFeePercentage, + owner.address, + salt == '' ? randomBytes(32) : salt + ); + + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + const pool = await task.instanceAt('ComposableStablePool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + if (initialize) { + const bptIndex = await pool.getBptIndex(); + const poolId = await pool.getPoolId(); + + const registeredBalances = getRegisteredBalances(bptIndex, initialBalances); + const { tokens: registeredTokens } = await vault.getPoolTokens(poolId); + + const userData = StablePoolEncoder.joinInit(registeredBalances); + // Use this for maxAmountsIn + registeredBalances[bptIndex] = MAX_UINT256; + + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: registeredTokens, + maxAmountsIn: registeredBalances, + fromInternalBalance: false, + userData, + }); + } + + return pool; + } + + function getRegisteredBalances(bptIndex: number, balances: BigNumber[]): BigNumber[] { + return Array.from({ length: balances.length + 1 }).map((_, i) => + i == bptIndex ? bn(0) : i < bptIndex ? balances[i] : balances[i - 1] + ); + } + + describe('getters', () => { + it('check factory version', async () => { + const expectedFactoryVersion = { + name: 'ComposableStablePoolFactory', + version: 5, + deployment: '20230711-composable-stable-pool-v5', + }; + + expect(await factory.version()).to.equal(JSON.stringify(expectedFactoryVersion)); + }); + + it('check pool version', async () => { + const pool = await createPool(tokens); + + const expectedPoolVersion = { + name: 'ComposableStablePool', + version: 5, + deployment: '20230711-composable-stable-pool-v5', + }; + + expect(await pool.version()).to.equal(JSON.stringify(expectedPoolVersion)); + }); + }); + + describe('pool operations', () => { + const amount = fp(500); + + let pool: Contract; + let poolId: string; + let bptIndex: number; + + context('swap', () => { + before('deploy a composable stable pool', async () => { + expect(await factory.isPoolFromFactory(ZERO_ADDRESS)).to.be.false; + + pool = await createPool(tokens); + + poolId = pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + bptIndex = await pool.getBptIndex(); + }); + + it('performs a swap', async () => { + await busd.connect(whale).transfer(owner.address, amount); + await busd.connect(owner).approve(vault.address, amount); + + await vault + .connect(owner) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: BUSD, assetOut: USDC, amount, userData: '0x' }, + { sender: owner.address, recipient: owner.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert pool swap + const expectedUSDC = amount.div(USDC_SCALING); + expectEqualWithError(await busd.balanceOf(owner.address), 0, 0.0001); + expectEqualWithError(await usdc.balanceOf(owner.address), bn(expectedUSDC), 0.1); + }); + }); + + context('proportional join', () => { + before('deploy a composable stable pool', async () => { + expect(await factory.isPoolFromFactory(ZERO_ADDRESS)).to.be.false; + + pool = await createPool(tokens); + + poolId = pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + bptIndex = await pool.getBptIndex(); + }); + + it('joins proportionally', async () => { + const ownerBptBalance = await pool.balanceOf(owner.address); + const bptOut = ownerBptBalance.div(5); + + const { tokens: registeredTokens } = await vault.getPoolTokens(poolId); + // Given the bptOut, the max amounts in should be slightly more than 1/5. Decimals make it a bit complicated. + const adjustedBalances = [ + initialBalanceBUSD.div(fp(4.99)).mul(fp(1)), + initialBalanceUSDC.div(bn(4.99e6)).mul(1e6), + ]; + const maxAmountsIn = getRegisteredBalances(bptIndex, adjustedBalances); + + const tx = await vault.connect(whale).joinPool(poolId, whale.address, whale.address, { + assets: registeredTokens, + maxAmountsIn: maxAmountsIn, + fromInternalBalance: false, + userData: StablePoolEncoder.joinAllTokensInForExactBptOut(bptOut), + }); + const receipt = await (await tx).wait(); + const { deltas: amountsIn } = expectEvent.inReceipt(receipt, 'PoolBalanceChanged').args; + + // Amounts in should be ~ 1/5 the initial balances + expect(amountsIn).to.equalWithError(maxAmountsIn, 0.01); + + // Make sure received BPT is close to what we expect + const currentBptBalance = await pool.balanceOf(whale.address); + expect(currentBptBalance).to.be.equalWithError(bptOut, 0.001); + }); + }); + + context('proportional exit', () => { + before('deploy a composable stable pool', async () => { + expect(await factory.isPoolFromFactory(ZERO_ADDRESS)).to.be.false; + + pool = await createPool(tokens); + + poolId = pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + bptIndex = await pool.getBptIndex(); + }); + + it('exits proportionally', async () => { + const previousBptBalance = await pool.balanceOf(owner.address); + const bptIn = previousBptBalance.div(4); + + const { tokens: registeredTokens, balances: registeredBalances } = await vault.getPoolTokens(poolId); + + const tx = await vault.connect(owner).exitPool(poolId, owner.address, owner.address, { + assets: registeredTokens, + minAmountsOut: Array(registeredTokens.length).fill(0), + fromInternalBalance: false, + userData: StablePoolEncoder.exitExactBptInForTokensOut(bptIn), + }); + const receipt = await (await tx).wait(); + const { deltas } = expectEvent.inReceipt(receipt, 'PoolBalanceChanged').args; + const amountsOut = deltas.map((x: BigNumber) => x.mul(-1)); + + const expectedAmountsOut = (registeredBalances as BigNumber[]).map((b) => b.div(4)); + expectedAmountsOut[bptIndex] = bn(0); + + // Amounts out should be 1/4 the initial balances + expect(amountsOut).to.equalWithError(expectedAmountsOut, 0.00001); + + // Make sure sent BPT is close to what we expect + const currentBptBalance = await pool.balanceOf(owner.address); + expect(currentBptBalance).to.be.equalWithError(bn(previousBptBalance).sub(bptIn), 0.001); + }); + }); + }); + + describe('read-only reentrancy protection', () => { + let pool: Contract; + let poolId: string; + let attacker: Contract; + // Actual amounts do not matter for the attack, so we pick an arbitrary value that the whale can transfer. + // The same amount will actually represent different quantities since the decimals may vary from token to token, + // but this is fine since we only need a valid join. + const attackerFunds = 1000; + + sharedBeforeEach('deploy and fund attacker', async () => { + attacker = await deploy('ReadOnlyReentrancyAttackerCSP', [vault.address]); + await busd.connect(whale).transfer(attacker.address, attackerFunds); + await usdc.connect(whale).transfer(attacker.address, attackerFunds); + await aura.connect(auraWhale).transfer(attacker.address, attackerFunds); + await graviAura.connect(graviAuraWhale).transfer(attacker.address, attackerFunds); + }); + + context('when the target pool is not protected', () => { + sharedBeforeEach('get affected pool instance', async () => { + pool = await task.instanceAt('ComposableStablePool', GRAVI_AURA_POOL); + poolId = await pool.getPoolId(); + }); + + itPerformsAttack(false); + }); + + context('when the target pool is protected', () => { + sharedBeforeEach('deploy pool with rate providers', async () => { + const rateProvider = await deploy('MockRateProvider'); + pool = await createPool(tokens, rateProvider.address); + poolId = await pool.getPoolId(); + }); + + itPerformsAttack(true); + }); + + function itPerformsAttack(expectRevert: boolean) { + const action = expectRevert ? 'rejects' : 'does not reject'; + + context('update protocol fee cache', () => { + it(`${action} protocol fee cache attack`, async () => { + await performAttack(AttackType.UPDATE_PROTOCOL_FEE_CACHE, expectRevert); + }); + }); + + context('update token rate cache', () => { + it(`${action} token rate cache attack`, async () => { + await performAttack(AttackType.UPDATE_TOKEN_RATE_CACHE, expectRevert); + }); + }); + + context('update token rate cache duration', () => { + sharedBeforeEach('grant permissions to attacker', async () => { + await authorizer + .connect(govMultisig) + .grantRole(await actionId(pool, 'setTokenRateCacheDuration'), attacker.address); + }); + + it(`${action} token rate cache duration attack`, async () => { + await performAttack(AttackType.SET_TOKEN_RATE_CACHE_DURATION, expectRevert); + }); + }); + + context('disable recovery mode', () => { + sharedBeforeEach('grant permissions to attacker', async () => { + await authorizer + .connect(govMultisig) + .grantRole(await actionId(pool, 'disableRecoveryMode'), attacker.address); + }); + + it(`${action} disable recovery mode attack`, async () => { + await performAttack(AttackType.DISABLE_RECOVERY_MODE, expectRevert); + }); + }); + } + + async function performAttack(attackType: AttackType, expectRevert: boolean) { + const allTokens = (await vault.getPoolTokens(poolId)).tokens; + // Amounts in must not include BPT in user data. + const userData = StablePoolEncoder.joinExactTokensInForBPTOut(Array(allTokens.length - 1).fill(attackerFunds), 0); + + // We are doing exact tokens in, so max amounts are not relevant. + const joinRequest = { + assets: allTokens, + maxAmountsIn: Array(allTokens.length).fill(MAX_UINT256), + userData, + fromInternalBalance: false, + }; + + if (expectRevert) { + await expect(attacker.startAttack(poolId, joinRequest, attackType, { value: 10 })).to.be.revertedWith( + 'BAL#420' + ); + } else { + await attacker.startAttack(poolId, joinRequest, attackType, { value: 10 }); + } + } + }); + + describe('recovery mode', () => { + let pool: Contract; + let poolId: string; + + before('deploy and initialize a composable stable pool', async () => { + pool = await createPool(tokens); + poolId = await pool.getPoolId(); + }); + + before('enter recovery mode', async () => { + await authorizer.connect(govMultisig).grantRole(await actionId(pool, 'enableRecoveryMode'), govMultisig.address); + await pool.connect(govMultisig).enableRecoveryMode(); + expect(await pool.inRecoveryMode()).to.be.true; + }); + + it('can exit via recovery mode', async () => { + const bptBalance = await pool.balanceOf(owner.address); + expect(bptBalance).to.gt(0); + + const vaultUSDCBalanceBeforeExit = await usdc.balanceOf(vault.address); + const ownerUSDCBalanceBeforeExit = await usdc.balanceOf(owner.address); + + const { tokens: registeredTokens } = await vault.getPoolTokens(poolId); + + const userData = BasePoolEncoder.recoveryModeExit(bptBalance); + await vault.connect(owner).exitPool(poolId, owner.address, owner.address, { + assets: registeredTokens, + minAmountsOut: Array(registeredTokens.length).fill(0), + fromInternalBalance: false, + userData, + }); + + const remainingBalance = await pool.balanceOf(owner.address); + expect(remainingBalance).to.equal(0); + + const vaultUSDCBalanceAfterExit = await usdc.balanceOf(vault.address); + const ownerUSDCBalanceAfterExit = await usdc.balanceOf(owner.address); + + expect(vaultUSDCBalanceAfterExit).to.lt(vaultUSDCBalanceBeforeExit); + expect(ownerUSDCBalanceAfterExit).to.gt(ownerUSDCBalanceBeforeExit); + }); + }); + + describe('create2 functionality', () => { + it('can be deployed with a different salt', async () => { + const pool = await createPool(tokens, ZERO_ADDRESS, false, ZERO_BYTES32); + const pool2 = await createPool(tokens, ZERO_ADDRESS, false, ONES_BYTES32); + + expect(pool2.address).to.not.equal(pool.address); + }); + }); + + describe('factory disable', () => { + it('the factory can be disabled', async () => { + await authorizer.connect(govMultisig).grantRole(await actionId(factory, 'disable'), govMultisig.address); + await factory.connect(govMultisig).disable(); + + expect(await factory.isDisabled()).to.be.true; + await expect( + factory.create( + 'CSP', + 'CSBPT', + tokens, + amplificationParameter, + Array(tokens.length).fill(ZERO_ADDRESS), + Array(tokens.length).fill(0), + Array(tokens.length).fill(false), + swapFeePercentage, + owner.address, + ZERO_BYTES32 + ) + ).to.be.revertedWith('BAL#211'); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/artifact/BatchRelayerLibrary.json b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/artifact/BatchRelayerLibrary.json new file mode 100644 index 0000000..2065ad2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/artifact/BatchRelayerLibrary.json @@ -0,0 +1,1552 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BatchRelayerLibrary", + "sourceName": "contracts/BatchRelayerLibrary.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wstETH", + "type": "address" + }, + { + "internalType": "contract IBalancerMinter", + "name": "minter", + "type": "address" + }, + { + "internalType": "bool", + "name": "canCallUserCheckpoint", + "type": "bool" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approveVault", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "assetInIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "assetOutIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IVault.BatchSwapStep[]", + "name": "swaps", + "type": "tuple[]" + }, + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + }, + { + "internalType": "int256[]", + "name": "limits", + "type": "int256[]" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "key", + "type": "uint256" + } + ], + "internalType": "struct VaultActions.OutputReference[]", + "name": "outputReferences", + "type": "tuple[]" + } + ], + "name": "batchSwap", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "canCallUserCheckpoint", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "enum VaultActions.PoolKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "minAmountsOut", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.ExitPoolRequest", + "name": "request", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "key", + "type": "uint256" + } + ], + "internalType": "struct VaultActions.OutputReference[]", + "name": "outputReferences", + "type": "tuple[]" + } + ], + "name": "exitPool", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "contract IStakingLiquidityGauge[]", + "name": "gauges", + "type": "address[]" + } + ], + "name": "gaugeCheckpoint", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStakingLiquidityGauge[]", + "name": "gauges", + "type": "address[]" + } + ], + "name": "gaugeClaimRewards", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStakingLiquidityGauge", + "name": "gauge", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "gaugeDeposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "gauges", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "gaugeMint", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "approval", + "type": "bool" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "gaugeSetMinterApproval", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStakingLiquidityGauge", + "name": "gauge", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "gaugeWithdraw", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "getEntrypoint", + "outputs": [ + { + "internalType": "contract IBalancerRelayer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "enum VaultActions.PoolKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "maxAmountsIn", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.JoinPoolRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "joinPool", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.UserBalanceOpKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IAsset", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + } + ], + "internalType": "struct IVault.UserBalanceOp[]", + "name": "ops", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "key", + "type": "uint256" + } + ], + "internalType": "struct VaultActions.OutputReference[]", + "name": "outputReferences", + "type": "tuple[]" + } + ], + "name": "manageUserBalance", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "ref", + "type": "uint256" + } + ], + "name": "peekChainedReferenceValue", + "outputs": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "relayer", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "authorisation", + "type": "bytes" + } + ], + "name": "setRelayerApproval", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "stakeETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "stakeETHAndWrap", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IAsset", + "name": "assetIn", + "type": "address" + }, + { + "internalType": "contract IAsset", + "name": "assetOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IVault.SingleSwap", + "name": "singleSwap", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "limit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "swap", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStaticATokenLM", + "name": "staticToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "toUnderlying", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapAaveStaticToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ICToken", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapCompoundV2", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC4626", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapERC4626", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IEulerToken", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapEuler", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGearboxDieselToken", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "dieselAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapGearbox", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IReaperTokenVault", + "name": "vaultToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapReaperVaultToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IShareToken", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapShareToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITetuSmartVault", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapTetu", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IUnbuttonToken", + "name": "wrapperToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapUnbuttonToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapWstETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IYearnTokenVault", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapYearn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20Permit", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "vaultPermit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20PermitDAI", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "holder", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "vaultPermitDAI", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStaticATokenLM", + "name": "staticToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "fromUnderlying", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapAaveDynamicToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ICToken", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapCompoundV2", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC4626", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapERC4626", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IEulerToken", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "eulerProtocol", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapEuler", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IGearboxDieselToken", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "mainAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapGearbox", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IReaperTokenVault", + "name": "vaultToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapReaperVaultToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IShareToken", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapShareToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapStETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITetuSmartVault", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapTetu", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IUnbuttonToken", + "name": "wrapperToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "uAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapUnbuttonToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IYearnTokenVault", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapYearn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x6101806040527fae1dc54057af8e8e5ce068cdd4383149c7efcb30e8fb95b592ee1594367fb50960e0523480156200003657600080fd5b5060405162006d0838038062006d0883398101604081905262000059916200021a565b8383838784816001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200009857600080fd5b505afa158015620000ad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d3919062000318565b6001600160601b0319606091821b81166080529083901b1660a05260405182903090839062000102906200020c565b62000110939291906200033e565b604051809103906000f0801580156200012d573d6000803e3d6000fd5b506001600160601b0319606091821b811660c05294901b9093166101005250151560f81b61012052506001600160a01b0381166200016d576000620001e4565b806001600160a01b031663c1fe3e486040518163ffffffff1660e01b8152600401602060405180830381600087803b158015620001a957600080fd5b505af1158015620001be573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001e4919062000318565b6001600160601b0319606091821b81166101405291901b166101605250620003d99350505050565b6109f6806200631283390190565b600080600080600060a0868803121562000232578081fd5b85516200023f81620003c0565b60208701519095506200025281620003c0565b60408701519094506200026581620003c0565b606087015190935080151581146200027b578182fd5b60808701519092506001600160401b038082111562000298578283fd5b818801915088601f830112620002ac578283fd5b815181811115620002bb578384fd5b604051601f8201601f191681016020018381118282101715620002dc578586fd5b6040528181528382016020018b1015620002f4578485fd5b620003078260208301602087016200038d565b809450505050509295509295909350565b6000602082840312156200032a578081fd5b81516200033781620003c0565b9392505050565b600060018060a01b038086168352808516602084015250606060408301528251806060840152620003778160808501602087016200038d565b601f01601f191691909101608001949350505050565b60005b83811015620003aa57818101518382015260200162000390565b83811115620003ba576000848401525b50505050565b6001600160a01b0381168114620003d657600080fd5b50565b60805160601c60a05160601c60c05160601c60e0516101005160601c6101205160f81c6101405160601c6101605160601c615e8a62000488600039806106f4528061079d52806107c85280610c455280610c715280610d1452806133055280613331525080610c245280610f2f5280610fd352806133d45250806107f1528061172e5250806112ed5280612577525080613d93525080612215525080612315528061266e525050615e8a6000f3fe6080604052600436106102dc5760003560e01c80637ab6e03c11610184578063959fc17a116100d6578063d80952d51161008a578063efe6910811610064578063efe6910814610604578063f3cab68514610617578063f4dd54b014610637576102dc565b8063d80952d5146105cb578063db4c0e91146105de578063e8210e3c146105f1576102dc565b8063b064b376116100bb578063b064b37614610592578063b6d24737146105a5578063d293f290146105b8576102dc565b8063959fc17a1461056c578063abf6d3991461057f576102dc565b80638b35ac8d116101385780638d928af8116101125780638d928af8146105315780638fe4624f14610546578063941e849b14610559576102dc565b80638b35ac8d146104f85780638c57198b1461050b5780638d64cfbc1461051e576102dc565b80637fd0e5d5116101695780637fd0e5d5146104b057806380db15bd146104d2578063837f9bcb146104e5576102dc565b80637ab6e03c1461048a5780637bc008f51461049d576102dc565b80633f85d3901161023d5780634f06a70b116101f1578063611b90dd116101cb578063611b90dd1461045157806365ca4804146104645780636d307ea814610477576102dc565b80634f06a70b146104185780635001fe751461042b57806352b887461461043e576102dc565b806344b6ac741161022257806344b6ac74146103df57806348699d58146103f25780634e9d9bab14610405576102dc565b80633f85d390146103b9578063433b0865146103cc576102dc565b80631c982441116102945780632cbec84e116102795780632cbec84e146103805780632e6272ea14610393578063311c5c57146103a6576102dc565b80631c9824411461035a5780632c25efe11461036d576102dc565b806310f3aaff116102c557806310f3aaff14610309578063138fdc2c146103345780631836944614610347576102dc565b80630e248fea146102e15780631089e5e3146102f6575b600080fd5b6102f46102ef366004614a74565b61064a565b005b6102f46103043660046149f6565b6106e5565b34801561031557600080fd5b5061031e6107ef565b60405161032b919061596b565b60405180910390f35b6102f4610342366004614e59565b610813565b6102f46103553660046151ec565b610a16565b6102f46103683660046148d1565b610c1f565b6102f461037b366004614e59565b610d42565b6102f461038e3660046149f6565b610f20565b6102f46103a13660046152e8565b610ffa565b6102f46103b4366004614e59565b61111a565b6102f46103c7366004614a2a565b6112ba565b6102f46103da36600461508a565b611384565b6102f46103ed366004614e59565b6115ad565b6102f4610400366004614916565b61172c565b6102f4610413366004614e59565b611772565b6102f4610426366004614e59565b6119cd565b6102f4610439366004614e59565b611ade565b6102f461044c366004614fcd565b611c69565b6102f461045f366004614e59565b611e0d565b6102f461047236600461503a565b611eb0565b6102f4610485366004614e59565b611fce565b6102f461049836600461508a565b612009565b6102f46104ab36600461503a565b61210f565b3480156104bc57600080fd5b506104c5612213565b60405161032b919061564e565b6102f46104e0366004614969565b612237565b6102f46104f3366004614b44565b61233b565b6102f4610506366004614e59565b61250b565b6102f4610519366004614cbd565b612547565b6102f461052c366004614f34565b6125f2565b34801561053d57600080fd5b506104c561266c565b6102f4610554366004614dc9565b612690565b6102f4610567366004614e59565b6128ba565b6102f461057a366004614eb3565b612a05565b6102f461058d366004614e59565b612a82565b6102f46105a0366004614e59565b612b35565b6102f46105b3366004614fa2565b612c78565b6102f46105c6366004614e59565b612cb2565b6102f46105d9366004614d20565b612d72565b6102f46105ec3660046148d1565b613300565b6102f46105ff366004614e59565b6133fb565b6102f4610612366004614e59565b613436565b61062a6106253660046153d6565b613475565b60405161032b9190615cfa565b6102f4610645366004614e59565b613487565b8060005b818110156106df5783838281811061066257fe5b90506020020160208101906106779190614899565b6001600160a01b03166384e9bd7e336040518263ffffffff1660e01b81526004016106a2919061564e565b600060405180830381600087803b1580156106bc57600080fd5b505af11580156106d0573d6000803e3d6000fd5b5050505080600101905061064e565b50505050565b6106ee826135b3565b915060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b0e38900846040518263ffffffff1660e01b815260040161073e9190615cfa565b60206040518083038186803b15801561075657600080fd5b505afa15801561076a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078e91906153ee565b90506107c36001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016846135d9565b6106df7f0000000000000000000000000000000000000000000000000000000000000000858385613653565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000856001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561084e57600080fd5b505afa158015610862573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088691906148b5565b90506000816001600160a01b0316632495a5996040518163ffffffff1660e01b815260040160206040518083038186803b1580156108c357600080fd5b505afa1580156108d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fb91906148b5565b905061090981838689613681565b6040517f9aa5d4620000000000000000000000000000000000000000000000000000000081529094506001600160a01b03831690639aa5d462906109569087908990600090600401615d39565b600060405180830381600087803b15801561097057600080fd5b505af1158015610984573d6000803e3d6000fd5b50505050610a0d83836001600160a01b0316634d778ad1876040518263ffffffff1660e01b81526004016109b89190615cfa565b60206040518083038186803b1580156109d057600080fd5b505afa1580156109e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0891906153ee565b6136ac565b50505050505050565b33610a246020890189614899565b6001600160a01b03161480610a4d575030610a426020890189614899565b6001600160a01b0316145b610a725760405162461bcd60e51b8152600401610a6990615b5c565b60405180910390fd5b60005b8a51811015610ad75760008b8281518110610a8c57fe5b6020026020010151606001519050610aa3816136c4565b15610ace57610ab18161370b565b8c8381518110610abd57fe5b602002602001015160600181815250505b50600101610a75565b506060610ae261266c565b6001600160a01b031663945bcec9858e8e8e8e8e8e8e8e6040518a63ffffffff1660e01b8152600401610b1c989796959493929190615a1c565b6000604051808303818588803b158015610b3557600080fd5b505af1158015610b49573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052610b729190810190614ab4565b905060005b82811015610c1057610b9d848483818110610b8e57fe5b905060400201602001356136c4565b610bb95760405162461bcd60e51b8152600401610a6990615c38565b610c08848483818110610bc857fe5b90506040020160200135610c0384878786818110610be257fe5b9050604002016000013581518110610bf657fe5b6020026020010151613736565b613742565b600101610b77565b50505050505050505050505050565b610c6b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008487613681565b915060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ea598cb0846040518263ffffffff1660e01b8152600401610cbb9190615cfa565b602060405180830381600087803b158015610cd557600080fd5b505af1158015610ce9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0d91906153ee565b9050610d3b7f0000000000000000000000000000000000000000000000000000000000000000858385613653565b5050505050565b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7d57600080fd5b505afa158015610d91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db591906148b5565b9050610dc381878588613681565b6040517fa0712d680000000000000000000000000000000000000000000000000000000081529093506001600160a01b0387169063a0712d6890610e0b908690600401615cfa565b602060405180830381600087803b158015610e2557600080fd5b505af1158015610e39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5d91906153ee565b15610e7a5760405162461bcd60e51b8152600401610a6990615bca565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038816906370a0823190610ec290309060040161564e565b60206040518083038186803b158015610eda57600080fd5b505afa158015610eee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1291906153ee565b9050610a0d87868386613653565b610f29826135b3565b915060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a1903eab84306040518363ffffffff1660e01b8152600401610f7a919061564e565b6020604051808303818588803b158015610f9357600080fd5b505af1158015610fa7573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610fcc91906153ee565b90506106df7f0000000000000000000000000000000000000000000000000000000000000000858385613653565b336110086020870187614899565b6001600160a01b031614806110315750306110266020870187614899565b6001600160a01b0316145b61104d5760405162461bcd60e51b8152600401610a6990615b5c565b61105a86608001516136c4565b156110725761106c866080015161370b565b60808701525b600061107c61266c565b6001600160a01b03166352bbbe2984898989896040518663ffffffff1660e01b81526004016110ae9493929190615c6f565b6020604051808303818588803b1580156110c757600080fd5b505af11580156110db573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061110091906153ee565b905061110b826136c4565b15610a0d57610a0d8282613742565b611125858386613755565b91506000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561116257600080fd5b505afa158015611176573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119a91906148b5565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081529091506001600160a01b03871690632e1a7d4d906111e2908690600401615cfa565b600060405180830381600087803b1580156111fc57600080fd5b505af1158015611210573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b03841691506370a082319061125c90309060040161564e565b60206040518083038186803b15801561127457600080fd5b505afa158015611288573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ac91906153ee565b9050610a0d82868386613653565b6040517f3b9f73840000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633b9f73849061132690879087903390600401615875565b602060405180830381600087803b15801561134057600080fd5b505af1158015611354573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137891906153ee565b90506106df82826136ac565b61138d836136c4565b1561139e5761139b8361370b565b92505b60008261141d57866001600160a01b03166351c0e0616040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156113e057600080fd5b505af11580156113f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141891906148b5565b611490565b866001600160a01b0316634800d97f6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561145857600080fd5b505af115801561146c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149091906148b5565b90506001600160a01b03861630146114d5576001600160a01b03861633146114ca5760405162461bcd60e51b8152600401610a6990615b5c565b6114d58682866137a1565b6114e96001600160a01b038216888661383d565b6040517f2f2cab870000000000000000000000000000000000000000000000000000000081526000906001600160a01b03891690632f2cab8790611537908990899086908a90600401615849565b602060405180830381600087803b15801561155157600080fd5b505af1158015611565573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158991906153ee565b9050611594836136c4565b156115a3576115a38382613742565b5050505050505050565b6115b8858386613755565b91506000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156115f557600080fd5b505afa158015611609573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162d91906148b5565b6040517fdb006a750000000000000000000000000000000000000000000000000000000081529091506001600160a01b0387169063db006a7590611675908690600401615cfa565b602060405180830381600087803b15801561168f57600080fd5b505af11580156116a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c791906153ee565b156116e45760405162461bcd60e51b8152600401610a6990615b25565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038316906370a082319061125c90309060040161564e565b7f0000000000000000000000000000000000000000000000000000000000000000156117625761175d838383613989565b61176d565b61176d838383613a3c565b505050565b61177d858386613755565b91506000856001600160a01b031663eb3beb296040518163ffffffff1660e01b815260040160206040518083038186803b1580156117ba57600080fd5b505afa1580156117ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f291906148b5565b90506000866001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561182f57600080fd5b505afa158015611843573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186791906148b5565b6040517fead5d3590000000000000000000000000000000000000000000000000000000081529091506001600160a01b0383169063ead5d359906118d49084907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90600090600401615826565b6040805180830381600087803b1580156118ed57600080fd5b505af1158015611901573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119259190615406565b50506040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038316906370a082319061196f90309060040161564e565b60206040518083038186803b15801561198757600080fd5b505afa15801561199b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119bf91906153ee565b90506115a382878387613653565b6000856001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0857600080fd5b505afa158015611a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4091906148b5565b9050611a4e81878588613681565b92506000866001600160a01b0316636e553f6585876040518363ffffffff1660e01b8152600401611a80929190615d03565b602060405180830381600087803b158015611a9a57600080fd5b505af1158015611aae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad291906153ee565b9050610a0d83826136ac565b6000856001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b1957600080fd5b505afa158015611b2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5191906148b5565b90506000866001600160a01b031663eb3beb296040518163ffffffff1660e01b815260040160206040518083038186803b158015611b8e57600080fd5b505afa158015611ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc691906148b5565b9050611bd482828689613681565b93506000816001600160a01b031663fbf178db84888860006040518563ffffffff1660e01b8152600401611c0b94939291906156fa565b6040805180830381600087803b158015611c2457600080fd5b505af1158015611c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5c9190615406565b9150506115a384826136ac565b6000866001600160a01b0316637158da7c6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ca457600080fd5b505afa158015611cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cdc91906148b5565b9050611cea81878588613681565b6040517fe2bbb1580000000000000000000000000000000000000000000000000000000081529093506001600160a01b0388169063e2bbb15890611d35906000908790600401615640565b600060405180830381600087803b158015611d4f57600080fd5b505af1158015611d63573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b038a1691506370a0823190611daf90309060040161564e565b60206040518083038186803b158015611dc757600080fd5b505afa158015611ddb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dff91906153ee565b90506115a388868386613653565b611e18858386613755565b91506000856001600160a01b031663ea785a5e85856040518363ffffffff1660e01b8152600401611e4a92919061580d565b602060405180830381600087803b158015611e6457600080fd5b505af1158015611e78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9c91906153ee565b9050611ea882826136ac565b505050505050565b611ebb848285613755565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081529091506001600160a01b03851690632e1a7d4d90611f03908490600401615cfa565b600060405180830381600087803b158015611f1d57600080fd5b505af1158015611f31573d6000803e3d6000fd5b505050506001600160a01b03821630146106df576000846001600160a01b03166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b158015611f8057600080fd5b505afa158015611f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb891906148b5565b9050610d3b6001600160a01b0382168484613b56565b6000856001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0857600080fd5b612012836136c4565b15612023576120208361370b565b92505b6001600160a01b0385163014612066576001600160a01b038516331461205b5760405162461bcd60e51b8152600401610a6990615b5c565b6120668587856137a1565b6040517fead5d3590000000000000000000000000000000000000000000000000000000081526000906001600160a01b0388169063ead5d359906120b290889088908890600401615826565b6040805180830381600087803b1580156120cb57600080fd5b505af11580156120df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121039190615406565b91505061110b826136c4565b6000846001600160a01b03166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b15801561214a57600080fd5b505afa15801561215e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061218291906148b5565b905061219081868487613681565b6040517f6e553f650000000000000000000000000000000000000000000000000000000081529092506001600160a01b03861690636e553f65906121da9085908790600401615d03565b600060405180830381600087803b1580156121f457600080fd5b505af1158015612208573d6000803e3d6000fd5b505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b03841630148061224c575082155b6122685760405162461bcd60e51b8152600401610a6990615b93565b606063fa6e671d60e01b33868660405160240161228793929190615662565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090951694909417909352516122f692869186910161561b565b60408051601f198184030181529190529050611ea86001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001682613b75565b60005b845181101561241b57336001600160a01b031685828151811061235d57fe5b6020026020010151606001516001600160a01b031614806123a65750306001600160a01b031685828151811061238f57fe5b6020026020010151606001516001600160a01b0316145b6123c25760405162461bcd60e51b8152600401610a6990615b5c565b60008582815181106123d057fe5b60200260200101516040015190506123e7816136c4565b15612412576123f58161370b565b86838151811061240157fe5b602002602001015160400181815250505b5060010161233e565b5061242461266c565b6001600160a01b0316630e8e3e8484866040518363ffffffff1660e01b815260040161245091906158d5565b6000604051808303818588803b15801561246957600080fd5b505af115801561247d573d6000803e3d6000fd5b505050505060005b81811015610d3b5761249c838383818110610b8e57fe5b6124b85760405162461bcd60e51b8152600401610a6990615c38565b6125038383838181106124c757fe5b90506040020160200135868585858181106124de57fe5b90506040020160000135815181106124f257fe5b602002602001015160400151613742565b600101612485565b612516858386613755565b91506000856001600160a01b031662f714ce84866040518363ffffffff1660e01b8152600401611e4a929190615d03565b6040517fc65427940000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c6542794906125b89030908a908a908a908a908a908a906004016157ad565b600060405180830381600087803b1580156125d257600080fd5b505af11580156125e6573d6000803e3d6000fd5b50505050505050505050565b866001600160a01b031663d505accf8761260a61266c565b88888888886040518863ffffffff1660e01b8152600401612631979695949392919061576c565b600060405180830381600087803b15801561264b57600080fd5b505af115801561265f573d6000803e3d6000fd5b5050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b0385163314806126af57506001600160a01b03851630145b6126cb5760405162461bcd60e51b8152600401610a6990615b5c565b60006126d688613bef565b905060006126e3836136c4565b6126ee576000612783565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038316906370a082319061273390899060040161564e565b60206040518083038186803b15801561274b57600080fd5b505afa15801561275f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278391906153ee565b9050612793888660400151613bf5565b60408601526127a061266c565b6001600160a01b031663b95cac28858b8a8a8a6040518663ffffffff1660e01b81526004016127d29493929190615976565b6000604051808303818588803b1580156127eb57600080fd5b505af11580156127ff573d6000803e3d6000fd5b505050505061280d836136c4565b15612208576040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038416906370a082319061285a908a9060040161564e565b60206040518083038186803b15801561287257600080fd5b505afa158015612886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128aa91906153ee565b90506125e684610c038385613c7c565b6128c5858386613755565b6040517f441a3e700000000000000000000000000000000000000000000000000000000081529092506001600160a01b0386169063441a3e7090612930906000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90600401615640565b600060405180830381600087803b15801561294a57600080fd5b505af115801561295e573d6000803e3d6000fd5b505050506000856001600160a01b0316637158da7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561299d57600080fd5b505afa1580156129b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d591906148b5565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161125c919061564e565b876001600160a01b0316638fcbaf0c88612a1d61266c565b8989898989896040518963ffffffff1660e01b8152600401612a46989796959493929190615723565b600060405180830381600087803b158015612a6057600080fd5b505af1158015612a74573d6000803e3d6000fd5b505050505050505050505050565b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015612abd57600080fd5b505afa158015612ad1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af591906148b5565b9050612b0381878588613681565b92506000866001600160a01b0316632f4f21e286866040518363ffffffff1660e01b8152600401611a8092919061580d565b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015612b7057600080fd5b505afa158015612b84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba891906148b5565b9050612bb681878588613681565b6040517fb6b55f250000000000000000000000000000000000000000000000000000000081529093506001600160a01b0387169063b6b55f2590612bfe908690600401615cfa565b600060405180830381600087803b158015612c1857600080fd5b505af1158015612c2c573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b03891691506370a0823190610ec290309060040161564e565b612c81816136c4565b15612c9257612c8f8161370b565b90505b612cae612c9d61266c565b6001600160a01b038416908361383d565b5050565b612cbd858386613755565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081529092506001600160a01b03861690632e1a7d4d90612d05908590600401615cfa565b600060405180830381600087803b158015612d1f57600080fd5b505af1158015612d33573d6000803e3d6000fd5b505050506000856001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561299d57600080fd5b6001600160a01b038516331480612d9157506001600160a01b03851630145b612dad5760405162461bcd60e51b8152600401610a6990615b5c565b60608167ffffffffffffffff81118015612dc657600080fd5b50604051908082528060200260200182016040528015612df0578160200160208202803683370190505b50905060608267ffffffffffffffff81118015612e0c57600080fd5b50604051908082528060200260200182016040528015612e36578160200160208202803683370190505b50905060005b83811015612fa657612e53858583818110610b8e57fe5b612e6f5760405162461bcd60e51b8152600401610a6990615c38565b8551600090868684818110612e8057fe5b9050604002016000013581518110612e9457fe5b60200260200101519050866060015115612ee257612eb181613c92565b848381518110612ebd57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050612f9d565b612eeb81613c95565b612f7857612ef881613c92565b6001600160a01b03166370a08231896040518263ffffffff1660e01b8152600401612f23919061564e565b60206040518083038186803b158015612f3b57600080fd5b505afa158015612f4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7391906153ee565b612f84565b876001600160a01b0316315b838381518110612f9057fe5b6020026020010181815250505b50600101612e3c565b5084606001511561303d57612fb961266c565b6001600160a01b0316630f5a6efa87846040518363ffffffff1660e01b8152600401612fe6929190615686565b60006040518083038186803b158015612ffe57600080fd5b505afa158015613012573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261303a9190810190614c6e565b90505b61304b888660400151613ca2565b604086015261305861266c565b6001600160a01b0316638bdb39138a8989896040518563ffffffff1660e01b81526004016130899493929190615976565b600060405180830381600087803b1580156130a357600080fd5b505af11580156130b7573d6000803e3d6000fd5b50606092508591505067ffffffffffffffff811180156130d657600080fd5b50604051908082528060200260200182016040528015613100578160200160208202803683370190505b50905085606001511561319d5761311561266c565b6001600160a01b0316630f5a6efa88856040518363ffffffff1660e01b8152600401613142929190615686565b60006040518083038186803b15801561315a57600080fd5b505afa15801561316e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131969190810190614c6e565b905061329b565b60005b848110156132995786516000908787848181106131b957fe5b90506040020160000135815181106131cd57fe5b602002602001015190506131e081613c95565b61326d576131ed81613c92565b6001600160a01b03166370a082318a6040518263ffffffff1660e01b8152600401613218919061564e565b60206040518083038186803b15801561323057600080fd5b505afa158015613244573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061326891906153ee565b613279565b886001600160a01b0316315b83838151811061328557fe5b6020908102919091010152506001016131a0565b505b60005b8481101561265f576132f88686838181106132b557fe5b90506040020160200135610c038584815181106132ce57fe5b60200260200101518585815181106132e257fe5b6020026020010151613c7c90919063ffffffff16565b60010161329e565b61332b7f00000000000000000000000000000000000000000000000000000000000000008386613755565b915060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663de0e9a3e846040518263ffffffff1660e01b815260040161337b9190615cfa565b602060405180830381600087803b15801561339557600080fd5b505af11580156133a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133cd91906153ee565b9050610d3b7f0000000000000000000000000000000000000000000000000000000000000000858385613653565b6000856001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612b7057600080fd5b613441858386613755565b91506000856001600160a01b031663ba0876528486306040518463ffffffff1660e01b8152600401611e4a93929190615d1a565b600061348082613d18565b9392505050565b613492858386613755565b91506000856001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156134cf57600080fd5b505afa1580156134e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061350791906148b5565b6040517f05fe138b0000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906305fe138b906135519086908890600401615d03565b600060405180830381600087803b15801561356b57600080fd5b505af115801561357f573d6000803e3d6000fd5b50505050611ea882826001600160a01b0316635427c938866040518263ffffffff1660e01b81526004016109b89190615cfa565b60006135be826136c4565b6135c857816135d1565b6135d18261370b565b90505b919050565b6135e8814710156101a3613d2f565b6000826001600160a01b03168260405161360190613c92565b60006040518083038185875af1925050503d806000811461363e576040519150601f19603f3d011682016040523d82523d6000602084013e613643565b606091505b5050905061176d816101a4613d2f565b6001600160a01b0383163014613677576136776001600160a01b0385168484613b56565b6106df81836136ac565b600061368e858484613755565b90506136a46001600160a01b038616858361383d565b949350505050565b6136b5826136c4565b15612cae57612cae8282613742565b7ffff0000000000000000000000000000000000000000000000000000000000000167fba100000000000000000000000000000000000000000000000000000000000001490565b600080600061371984613d18565b9150915061372684613d3d565b1561348057600082559392505050565b60ff81901d9081180390565b600061374d83613d84565b919091555050565b6000613760836135b3565b90506001600160a01b0382163014613480576001600160a01b038216331461379a5760405162461bcd60e51b8152600401610a6990615b5c565b6134808285835b806137ab5761176d565b6040805160018082528183019092526060916020808301908036833701905050905082816000815181106137db57fe5b6001600160a01b039290921660209283029190910190910152604080516001808252818301909252606091816020016020820280368337019050509050828160008151811061382657fe5b602002602001018181525050610d3b858383613de2565b80158015906138e157506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063dd62ed3e9061388e90309086906004016156e0565b60206040518083038186803b1580156138a657600080fd5b505afa1580156138ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138de91906153ee565b15155b1561396a5761396a8363095ea7b360e01b8460006040516024016139069291906157f1565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613f30565b61176d8363095ea7b360e01b848460405160240161390692919061580d565b8060005b81811015610d3b578383828181106139a157fe5b90506020020160208101906139b69190614899565b6001600160a01b0316634b820093866040518263ffffffff1660e01b81526004016139e1919061564e565b602060405180830381600087803b1580156139fb57600080fd5b505af1158015613a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a339190614ca1565b5060010161398d565b8060608167ffffffffffffffff81118015613a5657600080fd5b50604051908082528060200260200182016040528015613a9057816020015b613a7d614481565b815260200190600190039081613a755790505b50905060005b82811015613b22576040805160a081019091528060038152602001868684818110613abd57fe5b9050602002016020810190613ad29190614899565b6001600160a01b0316815260200160018152602001876001600160a01b03168152602001876001600160a01b0316815250828281518110613b0f57fe5b6020908102919091010152600101613a96565b50613b2b61266c565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b81526004016121da91906158d5565b61176d8363a9059cbb60e01b848460405160240161390692919061580d565b606060006060846001600160a01b031684604051613b9391906155ff565b6000604051808303816000865af19150503d8060008114613bd0576040519150601f19603f3d011682016040523d82523d6000602084013e613bd5565b606091505b5091509150613be48282613fd0565b925050505b92915050565b60601c90565b60606000836003811115613c0557fe5b1415613c1b57613c1482613ffa565b9050613be9565b6001836003811115613c2957fe5b1480613c4057506002836003811115613c3e57fe5b145b80613c5657506003836003811115613c5457fe5b145b15613c6457613c1482613ffa565b60405162461bcd60e51b8152600401610a6990615c01565b6000613c8c838311156001613d2f565b50900390565b90565b6001600160a01b03161590565b60606000836003811115613cb257fe5b1415613cc157613c1482614037565b6001836003811115613ccf57fe5b1415613cde57613c1482614080565b6002836003811115613cec57fe5b1415613cfb57613c14826140c6565b6003836003811115613d0957fe5b1415613c6457613c14826140f2565b600080613d2483613d84565b915081549050915091565b81612cae57612cae81614125565b7fffff000000000000000000000000000000000000000000000000000000000000167fba100000000000000000000000000000000000000000000000000000000000001490565b60006001613d9183614152565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001613dc3929190615640565b60408051808303601f1901815291905280516020909101200392915050565b6060825167ffffffffffffffff81118015613dfc57600080fd5b50604051908082528060200260200182016040528015613e3657816020015b613e23614481565b815260200190600190039081613e1b5790505b50905060005b8351811015613ece576040805160a081019091528060038152602001858381518110613e6457fe5b60200260200101516001600160a01b03168152602001848381518110613e8657fe5b60200260200101518152602001866001600160a01b03168152602001306001600160a01b0316815250828281518110613ebb57fe5b6020908102919091010152600101613e3c565b50613ed761266c565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b8152600401613f0291906158d5565b600060405180830381600087803b158015613f1c57600080fd5b505af11580156115a3573d6000803e3d6000fd5b60006060836001600160a01b031683604051613f4c91906155ff565b6000604051808303816000865af19150503d8060008114613f89576040519150601f19603f3d011682016040523d82523d6000602084013e613f8e565b606091505b50915091506000821415613fa6573d6000803e3d6000fd5b6106df815160001480613fc8575081806020019051810190613fc89190614ca1565b6101a2613d2f565b60608215613fdf575080613be9565b815115613fef5781518083602001fd5b613be96101ae614125565b6060600061400783614175565b9050600181600381111561401757fe5b141561402e576140268361418b565b9150506135d4565b829150506135d4565b60606000614044836141dd565b9050600081600281111561405457fe5b141561406357614026836141f3565b600181600281111561407157fe5b141561402e5761402683614256565b6060600061408d836141dd565b600281111561409857fe5b905060ff81166140ac5761402683826142a9565b60015b60ff168160ff16141561402e57614026838261430b565b606060006140d3836141dd565b60028111156140de57fe5b905060ff811661402e5761402683826142a9565b606060006140ff836141dd565b600281111561410a57fe5b905060ff811661411e5761402683826142a9565b60026140af565b61414f817f42414c0000000000000000000000000000000000000000000000000000000000614366565b50565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b6000818060200190518101906135d19190615178565b6060806000614199846143c7565b915091506141a6826143ea565b6141b057836136a4565b600182826040516020016141c6939291906159ea565b604051602081830303815290604052949350505050565b6000818060200190518101906135d191906150f9565b606060008061420184614454565b9150915061420e826136c4565b1561424c5761421c8261370b565b915060008282604051602001614234939291906159c9565b604051602081830303815290604052925050506135d4565b83925050506135d4565b606060006142638361446b565b905061426e816136c4565b1561402e5761427c8161370b565b90506001816040516020016142929291906159b2565b6040516020818303038152906040529150506135d4565b60606000806142b785614454565b915091506142c4826136c4565b15614301576142d28261370b565b91508382826040516020016142e993929190615d6b565b60405160208183030381529060405292505050613be9565b8492505050613be9565b606060006143188461446b565b9050614323816136c4565b1561435d576143318161370b565b90508281604051602001614346929190615d58565b604051602081830303815290604052915050613be9565b83915050613be9565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60606000828060200190518101906143df9190615194565b909590945092505050565b600080805b835181101561444d57600084828151811061440657fe5b60200260200101519050614419816136c4565b15614444576144278161370b565b85838151811061443357fe5b602002602001018181525050600192505b506001016143ef565b5092915050565b600080828060200190518101906143df9190615142565b6000818060200190518101906134809190615115565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b8035613be981615e17565b60008083601f8401126144cd578182fd5b50813567ffffffffffffffff8111156144e4578182fd5b60208301915083602080830285010111156144fe57600080fd5b9250929050565b600082601f830112614515578081fd5b813561452861452382615dad565b615d86565b81815291506020808301908481018184028601820187101561454957600080fd5b60005b8481101561457157813561455f81615e17565b8452928201929082019060010161454c565b505050505092915050565b600082601f83011261458c578081fd5b813561459a61452382615dad565b818152915060208083019084810160005b84811015614571578135870160a080601f19838c030112156145cc57600080fd5b6145d581615d86565b85830135815260408084013587830152606080850135828401526080915081850135818401525082840135925067ffffffffffffffff83111561461757600080fd5b6146258c8885870101614747565b908201528652505092820192908201906001016145ab565b60008083601f84011261464e578182fd5b50813567ffffffffffffffff811115614665578182fd5b6020830191508360206040830285010111156144fe57600080fd5b600082601f830112614690578081fd5b813561469e61452382615dad565b8181529150602080830190848101818402860182018710156146bf57600080fd5b60005b84811015614571578135845292820192908201906001016146c2565b600082601f8301126146ee578081fd5b81516146fc61452382615dad565b81815291506020808301908481018184028601820187101561471d57600080fd5b60005b8481101561457157815184529282019290820190600101614720565b8035613be981615e2c565b600082601f830112614757578081fd5b813567ffffffffffffffff81111561476d578182fd5b6147806020601f19601f84011601615d86565b915080825283602082850101111561479757600080fd5b8060208401602084013760009082016020015292915050565b8035613be981615e47565b803560028110613be957600080fd5b6000608082840312156147db578081fd5b6147e56080615d86565b9050813567ffffffffffffffff808211156147ff57600080fd5b61480b85838601614505565b8352602084013591508082111561482157600080fd5b61482d85838601614680565b6020840152604084013591508082111561484657600080fd5b5061485384828501614747565b604083015250614866836060840161473c565b606082015292915050565b600060808284031215614882578081fd5b50919050565b803560ff81168114613be957600080fd5b6000602082840312156148aa578081fd5b813561348081615e17565b6000602082840312156148c6578081fd5b815161348081615e17565b600080600080608085870312156148e6578283fd5b84356148f181615e17565b9350602085013561490181615e17565b93969395505050506040820135916060013590565b60008060006040848603121561492a578081fd5b833561493581615e17565b9250602084013567ffffffffffffffff811115614950578182fd5b61495c868287016144bc565b9497909650939450505050565b6000806000806060858703121561497e578182fd5b843561498981615e17565b9350602085013561499981615e2c565b9250604085013567ffffffffffffffff808211156149b5578384fd5b818701915087601f8301126149c8578384fd5b8135818111156149d6578485fd5b8860208285010111156149e7578485fd5b95989497505060200194505050565b600080600060608486031215614a0a578081fd5b8335614a1581615e17565b95602085013595506040909401359392505050565b600080600060408486031215614a3e578081fd5b833567ffffffffffffffff811115614a54578182fd5b614a60868287016144bc565b909790965060209590950135949350505050565b60008060208385031215614a86578182fd5b823567ffffffffffffffff811115614a9c578283fd5b614aa8858286016144bc565b90969095509350505050565b60006020808385031215614ac6578182fd5b825167ffffffffffffffff811115614adc578283fd5b8301601f81018513614aec578283fd5b8051614afa61452382615dad565b8181528381019083850185840285018601891015614b16578687fd5b8694505b83851015614b38578051835260019490940193918501918501614b1a565b50979650505050505050565b60008060008060608587031215614b59578182fd5b843567ffffffffffffffff80821115614b70578384fd5b818701915087601f830112614b83578384fd5b8135614b9161452382615dad565b808282526020808301925080860160a08d838288028a01011115614bb357898afd5b8997505b85881015614c365780828f031215614bcd57898afd5b614bd681615d86565b614be08f846147b0565b8152614bee8f8585016144b1565b8185015260408381013590820152614c098f606085016144b1565b6060820152614c1b8f608085016144b1565b60808201528552600197909701969382019390810190614bb7565b509199508a013597505050604088013592505080821115614c55578384fd5b50614c628782880161463d565b95989497509550505050565b600060208284031215614c7f578081fd5b815167ffffffffffffffff811115614c95578182fd5b6136a4848285016146de565b600060208284031215614cb2578081fd5b815161348081615e2c565b60008060008060008060c08789031215614cd5578384fd5b8635614ce081615e2c565b95506020870135614cf081615e17565b945060408701359350614d068860608901614888565b92506080870135915060a087013590509295509295509295565b600080600080600080600060c0888a031215614d3a578485fd5b873596506020880135614d4c81615e47565b95506040880135614d5c81615e17565b94506060880135614d6c81615e17565b9350608088013567ffffffffffffffff80821115614d88578283fd5b614d948b838c016147ca565b945060a08a0135915080821115614da9578283fd5b50614db68a828b0161463d565b989b979a50959850939692959293505050565b600080600080600080600060e0888a031215614de3578081fd5b873596506020880135614df581615e47565b95506040880135614e0581615e17565b94506060880135614e1581615e17565b9350608088013567ffffffffffffffff811115614e30578182fd5b614e3c8a828b016147ca565b93505060a0880135915060c0880135905092959891949750929550565b600080600080600060a08688031215614e70578283fd5b8535614e7b81615e17565b94506020860135614e8b81615e17565b93506040860135614e9b81615e17565b94979396509394606081013594506080013592915050565b600080600080600080600080610100898b031215614ecf578182fd5b8835614eda81615e17565b97506020890135614eea81615e17565b965060408901359550606089013594506080890135614f0881615e2c565b9350614f178a60a08b01614888565b925060c0890135915060e089013590509295985092959890939650565b600080600080600080600060e0888a031215614f4e578081fd5b8735614f5981615e17565b96506020880135614f6981615e17565b95506040880135945060608801359350614f868960808a01614888565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215614fb4578182fd5b8235614fbf81615e17565b946020939093013593505050565b60008060008060008060c08789031215614fe5578384fd5b8635614ff081615e17565b9550602087013561500081615e17565b9450604087013561501081615e17565b9350606087013561502081615e17565b9598949750929560808101359460a0909101359350915050565b6000806000806080858703121561504f578182fd5b843561505a81615e17565b9350602085013561506a81615e17565b9250604085013561507a81615e17565b9396929550929360600135925050565b60008060008060008060c087890312156150a2578384fd5b86356150ad81615e17565b955060208701356150bd81615e17565b945060408701356150cd81615e17565b93506060870135925060808701356150e481615e2c565b8092505060a087013590509295509295509295565b60006020828403121561510a578081fd5b815161348081615e3a565b60008060408385031215615127578182fd5b825161513281615e3a565b6020939093015192949293505050565b600080600060608486031215615156578081fd5b835161516181615e3a565b602085015160409095015190969495509392505050565b600060208284031215615189578081fd5b815161348081615e47565b6000806000606084860312156151a8578081fd5b83516151b381615e47565b602085015190935067ffffffffffffffff8111156151cf578182fd5b6151db868287016146de565b925050604084015190509250925092565b60008060008060008060008060008060006101608c8e03121561520d578485fd5b6152178d8d6147bb565b9a5067ffffffffffffffff8060208e01351115615232578586fd5b6152428e60208f01358f0161457c565b9a508060408e01351115615254578586fd5b6152648e60408f01358f016144bc565b909a5098506152768e60608f01614871565b97508060e08e01351115615288578586fd5b6152988e60e08f01358f016144bc565b90975095506101008d013594506101208d013593506101408d01358110156152be578283fd5b506152d08d6101408e01358e0161463d565b81935080925050509295989b509295989b9093969950565b6000806000806000806101208789031215615301578384fd5b863567ffffffffffffffff80821115615318578586fd5b9088019060c0828b03121561532b578586fd5b61533560c0615d86565b823581526153468b602085016147bb565b6020820152604083013561535981615e17565b604082015261536b8b606085016144b1565b60608201526080830135608082015260a08301358281111561538b578788fd5b6153978c828601614747565b60a0830152508098505050506153b08860208901614871565b959895975050505060a08401359360c08101359360e08201359350610100909101359150565b6000602082840312156153e7578081fd5b5035919050565b6000602082840312156153ff578081fd5b5051919050565b60008060408385031215615418578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b60008284526020808501945082825b8581101561547357813561545881615e17565b6001600160a01b031687529582019590820190600101615445565b509495945050505050565b60008284526020808501945082825b858110156154735781358752958201959082019060010161548d565b6000815180845260208085019450808401835b83811015615473578151875295820195908201906001016154bc565b15159052565b600081518084526154f6816020860160208601615dcd565b601f01601f19169290920160200192915050565b8051608080845281519084018190526000916020919082019060a0860190845b8181101561554f5783516001600160a01b03168352928401929184019160010161552a565b50508285015191508581038387015261556881836154a9565b925050506040830151848203604086015261558382826154de565b915050606083015161559860608601826154d8565b509392505050565b80356155ab81615e17565b6001600160a01b0390811683526020820135906155c782615e2c565b90151560208401526040820135906155de82615e17565b16604083015260608101356155f281615e2c565b8015156060840152505050565b60008251615611818460208701615dcd565b9190910192915050565b6000845161562d818460208901615dcd565b8201838582379092019182525092915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000604082016001600160a01b03808616845260206040818601528286518085526060870191508288019450855b818110156156d25785518516835294830194918301916001016156b4565b509098975050505050505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0394851681529290931660208301526040820152901515606082015260800190565b6001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b0397881681529515156020870152939095166040850152606084019190915260ff16608083015260a082019290925260c081019190915260e00190565b6001600160a01b0392909216825260ff16602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b6001600160a01b03949094168452602084019290925261ffff1660408301521515606082015260800190565b6040808252810183905260008460608301825b868110156158b8576020833561589d81615e17565b6001600160a01b031683529283019290910190600101615888565b5080925050506001600160a01b0383166020830152949350505050565b602080825282518282018190526000919060409081850190868401855b8281101561595e578151805161590781615e03565b8552808701516001600160a01b031687860152858101518686015260608082015161593482880182615429565b50506080908101519061594986820183615429565b505060a09390930192908501906001016158f2565b5091979650505050505050565b901515815260200190565b60008582526001600160a01b038086166020840152808516604084015250608060608301526159a8608083018461550a565b9695505050505050565b604081016159bf84615df9565b9281526020015290565b606081016159d685615df9565b938152602081019290925260409091015290565b60006159f585615e03565b84825260606020830152615a0c60608301856154a9565b9050826040830152949350505050565b6000610120808301615a2d8c615e0d565b8b84526020808501929092528a5190819052610140808501928281028601909101918c8201855b82811015615ad4578785037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec00186528151805186528481015185870152604080820151908701526060808201519087015260809081015160a091870182905290615ac0818801836154de565b978601979650505090830190600101615a54565b505050508381036040850152615aeb818a8c615436565b915050615afb60608401886155a0565b82810360e0840152615b0e81868861547e565b915050826101008301529998505050505050505050565b60208082526011908201527f756e7772617070696e67206661696c6564000000000000000000000000000000604082015260600190565b60208082526010908201527f496e636f72726563742073656e64657200000000000000000000000000000000604082015260600190565b6020808252601f908201527f52656c617965722063616e206f6e6c7920617070726f766520697473656c6600604082015260600190565b6020808252600f908201527f7772617070696e67206661696c65640000000000000000000000000000000000604082015260600190565b60208082526013908201527f554e48414e444c45445f504f4f4c5f4b494e4400000000000000000000000000604082015260600190565b60208082526019908201527f696e76616c696420636861696e6564207265666572656e636500000000000000604082015260600190565b600060e08252855160e08301526020860151615c8a81615e0d565b61010083015260408601516001600160a01b03908116610120840152606087015116610140830152608086015161016083015260a086015160c0610180840152615cd86101a08401826154de565b915050615ce860208301866155a0565b60a082019390935260c0015292915050565b90815260200190565b9182526001600160a01b0316602082015260400190565b9283526001600160a01b03918216602084015216604082015260600190565b9283526001600160a01b03919091166020830152604082015260600190565b60ff929092168252602082015260400190565b60ff9390931683526020830191909152604082015260600190565b60405181810167ffffffffffffffff81118282101715615da557600080fd5b604052919050565b600067ffffffffffffffff821115615dc3578081fd5b5060209081020190565b60005b83811015615de8578181015183820152602001615dd0565b838111156106df5750506000910152565b6003811061414f57fe5b6004811061414f57fe5b6002811061414f57fe5b6001600160a01b038116811461414f57600080fd5b801515811461414f57600080fd5b6003811061414f57600080fd5b6004811061414f57600080fdfea26469706673582212201ec40c4a4738e1dd9206f7dbef6a97a907fb8d94ee88550dbda97e3e5459c62364736f6c6343000701003360c060405234801561001057600080fd5b506040516109f63803806109f683398101604081905261002f91610107565b806100398161005d565b5050600180556001600160601b0319606092831b8116608052911b1660a052610203565b8051610070906000906020840190610074565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100b557805160ff19168380011785556100e2565b828001600101855582156100e2579182015b828111156100e25782518255916020019190600101906100c7565b506100ee9291506100f2565b5090565b5b808211156100ee57600081556001016100f3565b60008060006060848603121561011b578283fd5b8351610126816101eb565b80935050602080850151610139816101eb565b60408601519093506001600160401b0380821115610155578384fd5b818701915087601f830112610168578384fd5b815181811115610176578485fd5b604051601f8201601f1916810185018381118282101715610195578687fd5b60405281815283820185018a10156101ab578586fd5b8592505b818310156101cc57838301850151818401860152918401916101af565b818311156101dc57858583830101525b80955050505050509250925092565b6001600160a01b038116811461020057600080fd5b50565b60805160601c60a05160601c6107c1610235600039806101dd52806102f05250806063528061020152506107c16000f3fe6080604052600436106100435760003560e01c806354fd4d50146100935780637678922e146100be5780638d928af8146100e0578063ac9650d8146100f55761008e565b3661008e5761008c3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610206610115565b005b600080fd5b34801561009f57600080fd5b506100a8610127565b6040516100b591906106d7565b60405180910390f35b3480156100ca57600080fd5b506100d36101db565b6040516100b59190610638565b3480156100ec57600080fd5b506100d36101ff565b610108610103366004610560565b610223565b6040516100b59190610659565b81610123576101238161034f565b5050565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156101d15780601f106101a6576101008083540402835291602001916101d1565b820191906000526020600020905b8154815290600101906020018083116101b457829003601f168201915b5050505050905090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b606061022d61037c565b8167ffffffffffffffff8111801561024457600080fd5b5060405190808252806020026020018201604052801561027857816020015b60608152602001906001900390816102635790505b50905060005b828110156103385761031984848381811061029557fe5b90506020028101906102a791906106f1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692915050610395565b82828151811061032557fe5b602090810291909101015260010161027e565b50610341610418565b610349610429565b92915050565b610379817f42414c000000000000000000000000000000000000000000000000000000000061042f565b50565b61038e60026001541415610190610115565b6002600155565b6060600060608473ffffffffffffffffffffffffffffffffffffffff16846040516103c09190610619565b600060405180830381855af49150503d80600081146103fb576040519150601f19603f3d011682016040523d82523d6000602084013e610400565b606091505b509150915061040f82826104aa565b95945050505050565b4780156103795761037933826104d4565b60018055565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b606082156104b9575080610349565b8151156104c95781518083602001fd5b6103496101ae61034f565b6104e3814710156101a3610115565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161050990610635565b60006040518083038185875af1925050503d8060008114610546576040519150601f19603f3d011682016040523d82523d6000602084013e61054b565b606091505b5050905061055b816101a4610115565b505050565b60008060208385031215610572578182fd5b823567ffffffffffffffff80821115610589578384fd5b818501915085601f83011261059c578384fd5b8135818111156105aa578485fd5b86602080830285010111156105bd578485fd5b60209290920196919550909350505050565b600081518084526105e781602086016020860161075b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000825161062b81846020870161075b565b9190910192915050565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156106ca577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526106b88583516105cf565b9450928501929085019060010161067e565b5092979650505050505050565b6000602082526106ea60208301846105cf565b9392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610725578283fd5b83018035915067ffffffffffffffff82111561073f578283fd5b60200191503681900382131561075457600080fd5b9250929050565b60005b8381101561077657818101518382015260200161075e565b83811115610785576000848401525b5050505056fea2646970667358221220a48df7ee263b9ec1f02e43e8caae1e9f83bc81f5da0de345a64a78afaf6947f364736f6c63430007010033", + "deployedBytecode": "0x6080604052600436106102dc5760003560e01c80637ab6e03c11610184578063959fc17a116100d6578063d80952d51161008a578063efe6910811610064578063efe6910814610604578063f3cab68514610617578063f4dd54b014610637576102dc565b8063d80952d5146105cb578063db4c0e91146105de578063e8210e3c146105f1576102dc565b8063b064b376116100bb578063b064b37614610592578063b6d24737146105a5578063d293f290146105b8576102dc565b8063959fc17a1461056c578063abf6d3991461057f576102dc565b80638b35ac8d116101385780638d928af8116101125780638d928af8146105315780638fe4624f14610546578063941e849b14610559576102dc565b80638b35ac8d146104f85780638c57198b1461050b5780638d64cfbc1461051e576102dc565b80637fd0e5d5116101695780637fd0e5d5146104b057806380db15bd146104d2578063837f9bcb146104e5576102dc565b80637ab6e03c1461048a5780637bc008f51461049d576102dc565b80633f85d3901161023d5780634f06a70b116101f1578063611b90dd116101cb578063611b90dd1461045157806365ca4804146104645780636d307ea814610477576102dc565b80634f06a70b146104185780635001fe751461042b57806352b887461461043e576102dc565b806344b6ac741161022257806344b6ac74146103df57806348699d58146103f25780634e9d9bab14610405576102dc565b80633f85d390146103b9578063433b0865146103cc576102dc565b80631c982441116102945780632cbec84e116102795780632cbec84e146103805780632e6272ea14610393578063311c5c57146103a6576102dc565b80631c9824411461035a5780632c25efe11461036d576102dc565b806310f3aaff116102c557806310f3aaff14610309578063138fdc2c146103345780631836944614610347576102dc565b80630e248fea146102e15780631089e5e3146102f6575b600080fd5b6102f46102ef366004614a74565b61064a565b005b6102f46103043660046149f6565b6106e5565b34801561031557600080fd5b5061031e6107ef565b60405161032b919061596b565b60405180910390f35b6102f4610342366004614e59565b610813565b6102f46103553660046151ec565b610a16565b6102f46103683660046148d1565b610c1f565b6102f461037b366004614e59565b610d42565b6102f461038e3660046149f6565b610f20565b6102f46103a13660046152e8565b610ffa565b6102f46103b4366004614e59565b61111a565b6102f46103c7366004614a2a565b6112ba565b6102f46103da36600461508a565b611384565b6102f46103ed366004614e59565b6115ad565b6102f4610400366004614916565b61172c565b6102f4610413366004614e59565b611772565b6102f4610426366004614e59565b6119cd565b6102f4610439366004614e59565b611ade565b6102f461044c366004614fcd565b611c69565b6102f461045f366004614e59565b611e0d565b6102f461047236600461503a565b611eb0565b6102f4610485366004614e59565b611fce565b6102f461049836600461508a565b612009565b6102f46104ab36600461503a565b61210f565b3480156104bc57600080fd5b506104c5612213565b60405161032b919061564e565b6102f46104e0366004614969565b612237565b6102f46104f3366004614b44565b61233b565b6102f4610506366004614e59565b61250b565b6102f4610519366004614cbd565b612547565b6102f461052c366004614f34565b6125f2565b34801561053d57600080fd5b506104c561266c565b6102f4610554366004614dc9565b612690565b6102f4610567366004614e59565b6128ba565b6102f461057a366004614eb3565b612a05565b6102f461058d366004614e59565b612a82565b6102f46105a0366004614e59565b612b35565b6102f46105b3366004614fa2565b612c78565b6102f46105c6366004614e59565b612cb2565b6102f46105d9366004614d20565b612d72565b6102f46105ec3660046148d1565b613300565b6102f46105ff366004614e59565b6133fb565b6102f4610612366004614e59565b613436565b61062a6106253660046153d6565b613475565b60405161032b9190615cfa565b6102f4610645366004614e59565b613487565b8060005b818110156106df5783838281811061066257fe5b90506020020160208101906106779190614899565b6001600160a01b03166384e9bd7e336040518263ffffffff1660e01b81526004016106a2919061564e565b600060405180830381600087803b1580156106bc57600080fd5b505af11580156106d0573d6000803e3d6000fd5b5050505080600101905061064e565b50505050565b6106ee826135b3565b915060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b0e38900846040518263ffffffff1660e01b815260040161073e9190615cfa565b60206040518083038186803b15801561075657600080fd5b505afa15801561076a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078e91906153ee565b90506107c36001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016846135d9565b6106df7f0000000000000000000000000000000000000000000000000000000000000000858385613653565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000856001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561084e57600080fd5b505afa158015610862573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088691906148b5565b90506000816001600160a01b0316632495a5996040518163ffffffff1660e01b815260040160206040518083038186803b1580156108c357600080fd5b505afa1580156108d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fb91906148b5565b905061090981838689613681565b6040517f9aa5d4620000000000000000000000000000000000000000000000000000000081529094506001600160a01b03831690639aa5d462906109569087908990600090600401615d39565b600060405180830381600087803b15801561097057600080fd5b505af1158015610984573d6000803e3d6000fd5b50505050610a0d83836001600160a01b0316634d778ad1876040518263ffffffff1660e01b81526004016109b89190615cfa565b60206040518083038186803b1580156109d057600080fd5b505afa1580156109e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0891906153ee565b6136ac565b50505050505050565b33610a246020890189614899565b6001600160a01b03161480610a4d575030610a426020890189614899565b6001600160a01b0316145b610a725760405162461bcd60e51b8152600401610a6990615b5c565b60405180910390fd5b60005b8a51811015610ad75760008b8281518110610a8c57fe5b6020026020010151606001519050610aa3816136c4565b15610ace57610ab18161370b565b8c8381518110610abd57fe5b602002602001015160600181815250505b50600101610a75565b506060610ae261266c565b6001600160a01b031663945bcec9858e8e8e8e8e8e8e8e6040518a63ffffffff1660e01b8152600401610b1c989796959493929190615a1c565b6000604051808303818588803b158015610b3557600080fd5b505af1158015610b49573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052610b729190810190614ab4565b905060005b82811015610c1057610b9d848483818110610b8e57fe5b905060400201602001356136c4565b610bb95760405162461bcd60e51b8152600401610a6990615c38565b610c08848483818110610bc857fe5b90506040020160200135610c0384878786818110610be257fe5b9050604002016000013581518110610bf657fe5b6020026020010151613736565b613742565b600101610b77565b50505050505050505050505050565b610c6b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008487613681565b915060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ea598cb0846040518263ffffffff1660e01b8152600401610cbb9190615cfa565b602060405180830381600087803b158015610cd557600080fd5b505af1158015610ce9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0d91906153ee565b9050610d3b7f0000000000000000000000000000000000000000000000000000000000000000858385613653565b5050505050565b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7d57600080fd5b505afa158015610d91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db591906148b5565b9050610dc381878588613681565b6040517fa0712d680000000000000000000000000000000000000000000000000000000081529093506001600160a01b0387169063a0712d6890610e0b908690600401615cfa565b602060405180830381600087803b158015610e2557600080fd5b505af1158015610e39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5d91906153ee565b15610e7a5760405162461bcd60e51b8152600401610a6990615bca565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038816906370a0823190610ec290309060040161564e565b60206040518083038186803b158015610eda57600080fd5b505afa158015610eee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1291906153ee565b9050610a0d87868386613653565b610f29826135b3565b915060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a1903eab84306040518363ffffffff1660e01b8152600401610f7a919061564e565b6020604051808303818588803b158015610f9357600080fd5b505af1158015610fa7573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610fcc91906153ee565b90506106df7f0000000000000000000000000000000000000000000000000000000000000000858385613653565b336110086020870187614899565b6001600160a01b031614806110315750306110266020870187614899565b6001600160a01b0316145b61104d5760405162461bcd60e51b8152600401610a6990615b5c565b61105a86608001516136c4565b156110725761106c866080015161370b565b60808701525b600061107c61266c565b6001600160a01b03166352bbbe2984898989896040518663ffffffff1660e01b81526004016110ae9493929190615c6f565b6020604051808303818588803b1580156110c757600080fd5b505af11580156110db573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061110091906153ee565b905061110b826136c4565b15610a0d57610a0d8282613742565b611125858386613755565b91506000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561116257600080fd5b505afa158015611176573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119a91906148b5565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081529091506001600160a01b03871690632e1a7d4d906111e2908690600401615cfa565b600060405180830381600087803b1580156111fc57600080fd5b505af1158015611210573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b03841691506370a082319061125c90309060040161564e565b60206040518083038186803b15801561127457600080fd5b505afa158015611288573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ac91906153ee565b9050610a0d82868386613653565b6040517f3b9f73840000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633b9f73849061132690879087903390600401615875565b602060405180830381600087803b15801561134057600080fd5b505af1158015611354573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137891906153ee565b90506106df82826136ac565b61138d836136c4565b1561139e5761139b8361370b565b92505b60008261141d57866001600160a01b03166351c0e0616040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156113e057600080fd5b505af11580156113f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141891906148b5565b611490565b866001600160a01b0316634800d97f6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561145857600080fd5b505af115801561146c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149091906148b5565b90506001600160a01b03861630146114d5576001600160a01b03861633146114ca5760405162461bcd60e51b8152600401610a6990615b5c565b6114d58682866137a1565b6114e96001600160a01b038216888661383d565b6040517f2f2cab870000000000000000000000000000000000000000000000000000000081526000906001600160a01b03891690632f2cab8790611537908990899086908a90600401615849565b602060405180830381600087803b15801561155157600080fd5b505af1158015611565573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158991906153ee565b9050611594836136c4565b156115a3576115a38382613742565b5050505050505050565b6115b8858386613755565b91506000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156115f557600080fd5b505afa158015611609573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162d91906148b5565b6040517fdb006a750000000000000000000000000000000000000000000000000000000081529091506001600160a01b0387169063db006a7590611675908690600401615cfa565b602060405180830381600087803b15801561168f57600080fd5b505af11580156116a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c791906153ee565b156116e45760405162461bcd60e51b8152600401610a6990615b25565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038316906370a082319061125c90309060040161564e565b7f0000000000000000000000000000000000000000000000000000000000000000156117625761175d838383613989565b61176d565b61176d838383613a3c565b505050565b61177d858386613755565b91506000856001600160a01b031663eb3beb296040518163ffffffff1660e01b815260040160206040518083038186803b1580156117ba57600080fd5b505afa1580156117ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f291906148b5565b90506000866001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561182f57600080fd5b505afa158015611843573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186791906148b5565b6040517fead5d3590000000000000000000000000000000000000000000000000000000081529091506001600160a01b0383169063ead5d359906118d49084907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90600090600401615826565b6040805180830381600087803b1580156118ed57600080fd5b505af1158015611901573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119259190615406565b50506040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038316906370a082319061196f90309060040161564e565b60206040518083038186803b15801561198757600080fd5b505afa15801561199b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119bf91906153ee565b90506115a382878387613653565b6000856001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0857600080fd5b505afa158015611a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4091906148b5565b9050611a4e81878588613681565b92506000866001600160a01b0316636e553f6585876040518363ffffffff1660e01b8152600401611a80929190615d03565b602060405180830381600087803b158015611a9a57600080fd5b505af1158015611aae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad291906153ee565b9050610a0d83826136ac565b6000856001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b1957600080fd5b505afa158015611b2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5191906148b5565b90506000866001600160a01b031663eb3beb296040518163ffffffff1660e01b815260040160206040518083038186803b158015611b8e57600080fd5b505afa158015611ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc691906148b5565b9050611bd482828689613681565b93506000816001600160a01b031663fbf178db84888860006040518563ffffffff1660e01b8152600401611c0b94939291906156fa565b6040805180830381600087803b158015611c2457600080fd5b505af1158015611c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5c9190615406565b9150506115a384826136ac565b6000866001600160a01b0316637158da7c6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ca457600080fd5b505afa158015611cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cdc91906148b5565b9050611cea81878588613681565b6040517fe2bbb1580000000000000000000000000000000000000000000000000000000081529093506001600160a01b0388169063e2bbb15890611d35906000908790600401615640565b600060405180830381600087803b158015611d4f57600080fd5b505af1158015611d63573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b038a1691506370a0823190611daf90309060040161564e565b60206040518083038186803b158015611dc757600080fd5b505afa158015611ddb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dff91906153ee565b90506115a388868386613653565b611e18858386613755565b91506000856001600160a01b031663ea785a5e85856040518363ffffffff1660e01b8152600401611e4a92919061580d565b602060405180830381600087803b158015611e6457600080fd5b505af1158015611e78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9c91906153ee565b9050611ea882826136ac565b505050505050565b611ebb848285613755565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081529091506001600160a01b03851690632e1a7d4d90611f03908490600401615cfa565b600060405180830381600087803b158015611f1d57600080fd5b505af1158015611f31573d6000803e3d6000fd5b505050506001600160a01b03821630146106df576000846001600160a01b03166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b158015611f8057600080fd5b505afa158015611f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb891906148b5565b9050610d3b6001600160a01b0382168484613b56565b6000856001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0857600080fd5b612012836136c4565b15612023576120208361370b565b92505b6001600160a01b0385163014612066576001600160a01b038516331461205b5760405162461bcd60e51b8152600401610a6990615b5c565b6120668587856137a1565b6040517fead5d3590000000000000000000000000000000000000000000000000000000081526000906001600160a01b0388169063ead5d359906120b290889088908890600401615826565b6040805180830381600087803b1580156120cb57600080fd5b505af11580156120df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121039190615406565b91505061110b826136c4565b6000846001600160a01b03166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b15801561214a57600080fd5b505afa15801561215e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061218291906148b5565b905061219081868487613681565b6040517f6e553f650000000000000000000000000000000000000000000000000000000081529092506001600160a01b03861690636e553f65906121da9085908790600401615d03565b600060405180830381600087803b1580156121f457600080fd5b505af1158015612208573d6000803e3d6000fd5b505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b03841630148061224c575082155b6122685760405162461bcd60e51b8152600401610a6990615b93565b606063fa6e671d60e01b33868660405160240161228793929190615662565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090951694909417909352516122f692869186910161561b565b60408051601f198184030181529190529050611ea86001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001682613b75565b60005b845181101561241b57336001600160a01b031685828151811061235d57fe5b6020026020010151606001516001600160a01b031614806123a65750306001600160a01b031685828151811061238f57fe5b6020026020010151606001516001600160a01b0316145b6123c25760405162461bcd60e51b8152600401610a6990615b5c565b60008582815181106123d057fe5b60200260200101516040015190506123e7816136c4565b15612412576123f58161370b565b86838151811061240157fe5b602002602001015160400181815250505b5060010161233e565b5061242461266c565b6001600160a01b0316630e8e3e8484866040518363ffffffff1660e01b815260040161245091906158d5565b6000604051808303818588803b15801561246957600080fd5b505af115801561247d573d6000803e3d6000fd5b505050505060005b81811015610d3b5761249c838383818110610b8e57fe5b6124b85760405162461bcd60e51b8152600401610a6990615c38565b6125038383838181106124c757fe5b90506040020160200135868585858181106124de57fe5b90506040020160000135815181106124f257fe5b602002602001015160400151613742565b600101612485565b612516858386613755565b91506000856001600160a01b031662f714ce84866040518363ffffffff1660e01b8152600401611e4a929190615d03565b6040517fc65427940000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c6542794906125b89030908a908a908a908a908a908a906004016157ad565b600060405180830381600087803b1580156125d257600080fd5b505af11580156125e6573d6000803e3d6000fd5b50505050505050505050565b866001600160a01b031663d505accf8761260a61266c565b88888888886040518863ffffffff1660e01b8152600401612631979695949392919061576c565b600060405180830381600087803b15801561264b57600080fd5b505af115801561265f573d6000803e3d6000fd5b5050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b0385163314806126af57506001600160a01b03851630145b6126cb5760405162461bcd60e51b8152600401610a6990615b5c565b60006126d688613bef565b905060006126e3836136c4565b6126ee576000612783565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038316906370a082319061273390899060040161564e565b60206040518083038186803b15801561274b57600080fd5b505afa15801561275f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278391906153ee565b9050612793888660400151613bf5565b60408601526127a061266c565b6001600160a01b031663b95cac28858b8a8a8a6040518663ffffffff1660e01b81526004016127d29493929190615976565b6000604051808303818588803b1580156127eb57600080fd5b505af11580156127ff573d6000803e3d6000fd5b505050505061280d836136c4565b15612208576040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038416906370a082319061285a908a9060040161564e565b60206040518083038186803b15801561287257600080fd5b505afa158015612886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128aa91906153ee565b90506125e684610c038385613c7c565b6128c5858386613755565b6040517f441a3e700000000000000000000000000000000000000000000000000000000081529092506001600160a01b0386169063441a3e7090612930906000907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90600401615640565b600060405180830381600087803b15801561294a57600080fd5b505af115801561295e573d6000803e3d6000fd5b505050506000856001600160a01b0316637158da7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561299d57600080fd5b505afa1580156129b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d591906148b5565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161125c919061564e565b876001600160a01b0316638fcbaf0c88612a1d61266c565b8989898989896040518963ffffffff1660e01b8152600401612a46989796959493929190615723565b600060405180830381600087803b158015612a6057600080fd5b505af1158015612a74573d6000803e3d6000fd5b505050505050505050505050565b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015612abd57600080fd5b505afa158015612ad1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af591906148b5565b9050612b0381878588613681565b92506000866001600160a01b0316632f4f21e286866040518363ffffffff1660e01b8152600401611a8092919061580d565b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015612b7057600080fd5b505afa158015612b84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba891906148b5565b9050612bb681878588613681565b6040517fb6b55f250000000000000000000000000000000000000000000000000000000081529093506001600160a01b0387169063b6b55f2590612bfe908690600401615cfa565b600060405180830381600087803b158015612c1857600080fd5b505af1158015612c2c573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b03891691506370a0823190610ec290309060040161564e565b612c81816136c4565b15612c9257612c8f8161370b565b90505b612cae612c9d61266c565b6001600160a01b038416908361383d565b5050565b612cbd858386613755565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081529092506001600160a01b03861690632e1a7d4d90612d05908590600401615cfa565b600060405180830381600087803b158015612d1f57600080fd5b505af1158015612d33573d6000803e3d6000fd5b505050506000856001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561299d57600080fd5b6001600160a01b038516331480612d9157506001600160a01b03851630145b612dad5760405162461bcd60e51b8152600401610a6990615b5c565b60608167ffffffffffffffff81118015612dc657600080fd5b50604051908082528060200260200182016040528015612df0578160200160208202803683370190505b50905060608267ffffffffffffffff81118015612e0c57600080fd5b50604051908082528060200260200182016040528015612e36578160200160208202803683370190505b50905060005b83811015612fa657612e53858583818110610b8e57fe5b612e6f5760405162461bcd60e51b8152600401610a6990615c38565b8551600090868684818110612e8057fe5b9050604002016000013581518110612e9457fe5b60200260200101519050866060015115612ee257612eb181613c92565b848381518110612ebd57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050612f9d565b612eeb81613c95565b612f7857612ef881613c92565b6001600160a01b03166370a08231896040518263ffffffff1660e01b8152600401612f23919061564e565b60206040518083038186803b158015612f3b57600080fd5b505afa158015612f4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7391906153ee565b612f84565b876001600160a01b0316315b838381518110612f9057fe5b6020026020010181815250505b50600101612e3c565b5084606001511561303d57612fb961266c565b6001600160a01b0316630f5a6efa87846040518363ffffffff1660e01b8152600401612fe6929190615686565b60006040518083038186803b158015612ffe57600080fd5b505afa158015613012573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261303a9190810190614c6e565b90505b61304b888660400151613ca2565b604086015261305861266c565b6001600160a01b0316638bdb39138a8989896040518563ffffffff1660e01b81526004016130899493929190615976565b600060405180830381600087803b1580156130a357600080fd5b505af11580156130b7573d6000803e3d6000fd5b50606092508591505067ffffffffffffffff811180156130d657600080fd5b50604051908082528060200260200182016040528015613100578160200160208202803683370190505b50905085606001511561319d5761311561266c565b6001600160a01b0316630f5a6efa88856040518363ffffffff1660e01b8152600401613142929190615686565b60006040518083038186803b15801561315a57600080fd5b505afa15801561316e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131969190810190614c6e565b905061329b565b60005b848110156132995786516000908787848181106131b957fe5b90506040020160000135815181106131cd57fe5b602002602001015190506131e081613c95565b61326d576131ed81613c92565b6001600160a01b03166370a082318a6040518263ffffffff1660e01b8152600401613218919061564e565b60206040518083038186803b15801561323057600080fd5b505afa158015613244573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061326891906153ee565b613279565b886001600160a01b0316315b83838151811061328557fe5b6020908102919091010152506001016131a0565b505b60005b8481101561265f576132f88686838181106132b557fe5b90506040020160200135610c038584815181106132ce57fe5b60200260200101518585815181106132e257fe5b6020026020010151613c7c90919063ffffffff16565b60010161329e565b61332b7f00000000000000000000000000000000000000000000000000000000000000008386613755565b915060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663de0e9a3e846040518263ffffffff1660e01b815260040161337b9190615cfa565b602060405180830381600087803b15801561339557600080fd5b505af11580156133a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133cd91906153ee565b9050610d3b7f0000000000000000000000000000000000000000000000000000000000000000858385613653565b6000856001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612b7057600080fd5b613441858386613755565b91506000856001600160a01b031663ba0876528486306040518463ffffffff1660e01b8152600401611e4a93929190615d1a565b600061348082613d18565b9392505050565b613492858386613755565b91506000856001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156134cf57600080fd5b505afa1580156134e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061350791906148b5565b6040517f05fe138b0000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906305fe138b906135519086908890600401615d03565b600060405180830381600087803b15801561356b57600080fd5b505af115801561357f573d6000803e3d6000fd5b50505050611ea882826001600160a01b0316635427c938866040518263ffffffff1660e01b81526004016109b89190615cfa565b60006135be826136c4565b6135c857816135d1565b6135d18261370b565b90505b919050565b6135e8814710156101a3613d2f565b6000826001600160a01b03168260405161360190613c92565b60006040518083038185875af1925050503d806000811461363e576040519150601f19603f3d011682016040523d82523d6000602084013e613643565b606091505b5050905061176d816101a4613d2f565b6001600160a01b0383163014613677576136776001600160a01b0385168484613b56565b6106df81836136ac565b600061368e858484613755565b90506136a46001600160a01b038616858361383d565b949350505050565b6136b5826136c4565b15612cae57612cae8282613742565b7ffff0000000000000000000000000000000000000000000000000000000000000167fba100000000000000000000000000000000000000000000000000000000000001490565b600080600061371984613d18565b9150915061372684613d3d565b1561348057600082559392505050565b60ff81901d9081180390565b600061374d83613d84565b919091555050565b6000613760836135b3565b90506001600160a01b0382163014613480576001600160a01b038216331461379a5760405162461bcd60e51b8152600401610a6990615b5c565b6134808285835b806137ab5761176d565b6040805160018082528183019092526060916020808301908036833701905050905082816000815181106137db57fe5b6001600160a01b039290921660209283029190910190910152604080516001808252818301909252606091816020016020820280368337019050509050828160008151811061382657fe5b602002602001018181525050610d3b858383613de2565b80158015906138e157506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063dd62ed3e9061388e90309086906004016156e0565b60206040518083038186803b1580156138a657600080fd5b505afa1580156138ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138de91906153ee565b15155b1561396a5761396a8363095ea7b360e01b8460006040516024016139069291906157f1565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613f30565b61176d8363095ea7b360e01b848460405160240161390692919061580d565b8060005b81811015610d3b578383828181106139a157fe5b90506020020160208101906139b69190614899565b6001600160a01b0316634b820093866040518263ffffffff1660e01b81526004016139e1919061564e565b602060405180830381600087803b1580156139fb57600080fd5b505af1158015613a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a339190614ca1565b5060010161398d565b8060608167ffffffffffffffff81118015613a5657600080fd5b50604051908082528060200260200182016040528015613a9057816020015b613a7d614481565b815260200190600190039081613a755790505b50905060005b82811015613b22576040805160a081019091528060038152602001868684818110613abd57fe5b9050602002016020810190613ad29190614899565b6001600160a01b0316815260200160018152602001876001600160a01b03168152602001876001600160a01b0316815250828281518110613b0f57fe5b6020908102919091010152600101613a96565b50613b2b61266c565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b81526004016121da91906158d5565b61176d8363a9059cbb60e01b848460405160240161390692919061580d565b606060006060846001600160a01b031684604051613b9391906155ff565b6000604051808303816000865af19150503d8060008114613bd0576040519150601f19603f3d011682016040523d82523d6000602084013e613bd5565b606091505b5091509150613be48282613fd0565b925050505b92915050565b60601c90565b60606000836003811115613c0557fe5b1415613c1b57613c1482613ffa565b9050613be9565b6001836003811115613c2957fe5b1480613c4057506002836003811115613c3e57fe5b145b80613c5657506003836003811115613c5457fe5b145b15613c6457613c1482613ffa565b60405162461bcd60e51b8152600401610a6990615c01565b6000613c8c838311156001613d2f565b50900390565b90565b6001600160a01b03161590565b60606000836003811115613cb257fe5b1415613cc157613c1482614037565b6001836003811115613ccf57fe5b1415613cde57613c1482614080565b6002836003811115613cec57fe5b1415613cfb57613c14826140c6565b6003836003811115613d0957fe5b1415613c6457613c14826140f2565b600080613d2483613d84565b915081549050915091565b81612cae57612cae81614125565b7fffff000000000000000000000000000000000000000000000000000000000000167fba100000000000000000000000000000000000000000000000000000000000001490565b60006001613d9183614152565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001613dc3929190615640565b60408051808303601f1901815291905280516020909101200392915050565b6060825167ffffffffffffffff81118015613dfc57600080fd5b50604051908082528060200260200182016040528015613e3657816020015b613e23614481565b815260200190600190039081613e1b5790505b50905060005b8351811015613ece576040805160a081019091528060038152602001858381518110613e6457fe5b60200260200101516001600160a01b03168152602001848381518110613e8657fe5b60200260200101518152602001866001600160a01b03168152602001306001600160a01b0316815250828281518110613ebb57fe5b6020908102919091010152600101613e3c565b50613ed761266c565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b8152600401613f0291906158d5565b600060405180830381600087803b158015613f1c57600080fd5b505af11580156115a3573d6000803e3d6000fd5b60006060836001600160a01b031683604051613f4c91906155ff565b6000604051808303816000865af19150503d8060008114613f89576040519150601f19603f3d011682016040523d82523d6000602084013e613f8e565b606091505b50915091506000821415613fa6573d6000803e3d6000fd5b6106df815160001480613fc8575081806020019051810190613fc89190614ca1565b6101a2613d2f565b60608215613fdf575080613be9565b815115613fef5781518083602001fd5b613be96101ae614125565b6060600061400783614175565b9050600181600381111561401757fe5b141561402e576140268361418b565b9150506135d4565b829150506135d4565b60606000614044836141dd565b9050600081600281111561405457fe5b141561406357614026836141f3565b600181600281111561407157fe5b141561402e5761402683614256565b6060600061408d836141dd565b600281111561409857fe5b905060ff81166140ac5761402683826142a9565b60015b60ff168160ff16141561402e57614026838261430b565b606060006140d3836141dd565b60028111156140de57fe5b905060ff811661402e5761402683826142a9565b606060006140ff836141dd565b600281111561410a57fe5b905060ff811661411e5761402683826142a9565b60026140af565b61414f817f42414c0000000000000000000000000000000000000000000000000000000000614366565b50565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b6000818060200190518101906135d19190615178565b6060806000614199846143c7565b915091506141a6826143ea565b6141b057836136a4565b600182826040516020016141c6939291906159ea565b604051602081830303815290604052949350505050565b6000818060200190518101906135d191906150f9565b606060008061420184614454565b9150915061420e826136c4565b1561424c5761421c8261370b565b915060008282604051602001614234939291906159c9565b604051602081830303815290604052925050506135d4565b83925050506135d4565b606060006142638361446b565b905061426e816136c4565b1561402e5761427c8161370b565b90506001816040516020016142929291906159b2565b6040516020818303038152906040529150506135d4565b60606000806142b785614454565b915091506142c4826136c4565b15614301576142d28261370b565b91508382826040516020016142e993929190615d6b565b60405160208183030381529060405292505050613be9565b8492505050613be9565b606060006143188461446b565b9050614323816136c4565b1561435d576143318161370b565b90508281604051602001614346929190615d58565b604051602081830303815290604052915050613be9565b83915050613be9565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60606000828060200190518101906143df9190615194565b909590945092505050565b600080805b835181101561444d57600084828151811061440657fe5b60200260200101519050614419816136c4565b15614444576144278161370b565b85838151811061443357fe5b602002602001018181525050600192505b506001016143ef565b5092915050565b600080828060200190518101906143df9190615142565b6000818060200190518101906134809190615115565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b8035613be981615e17565b60008083601f8401126144cd578182fd5b50813567ffffffffffffffff8111156144e4578182fd5b60208301915083602080830285010111156144fe57600080fd5b9250929050565b600082601f830112614515578081fd5b813561452861452382615dad565b615d86565b81815291506020808301908481018184028601820187101561454957600080fd5b60005b8481101561457157813561455f81615e17565b8452928201929082019060010161454c565b505050505092915050565b600082601f83011261458c578081fd5b813561459a61452382615dad565b818152915060208083019084810160005b84811015614571578135870160a080601f19838c030112156145cc57600080fd5b6145d581615d86565b85830135815260408084013587830152606080850135828401526080915081850135818401525082840135925067ffffffffffffffff83111561461757600080fd5b6146258c8885870101614747565b908201528652505092820192908201906001016145ab565b60008083601f84011261464e578182fd5b50813567ffffffffffffffff811115614665578182fd5b6020830191508360206040830285010111156144fe57600080fd5b600082601f830112614690578081fd5b813561469e61452382615dad565b8181529150602080830190848101818402860182018710156146bf57600080fd5b60005b84811015614571578135845292820192908201906001016146c2565b600082601f8301126146ee578081fd5b81516146fc61452382615dad565b81815291506020808301908481018184028601820187101561471d57600080fd5b60005b8481101561457157815184529282019290820190600101614720565b8035613be981615e2c565b600082601f830112614757578081fd5b813567ffffffffffffffff81111561476d578182fd5b6147806020601f19601f84011601615d86565b915080825283602082850101111561479757600080fd5b8060208401602084013760009082016020015292915050565b8035613be981615e47565b803560028110613be957600080fd5b6000608082840312156147db578081fd5b6147e56080615d86565b9050813567ffffffffffffffff808211156147ff57600080fd5b61480b85838601614505565b8352602084013591508082111561482157600080fd5b61482d85838601614680565b6020840152604084013591508082111561484657600080fd5b5061485384828501614747565b604083015250614866836060840161473c565b606082015292915050565b600060808284031215614882578081fd5b50919050565b803560ff81168114613be957600080fd5b6000602082840312156148aa578081fd5b813561348081615e17565b6000602082840312156148c6578081fd5b815161348081615e17565b600080600080608085870312156148e6578283fd5b84356148f181615e17565b9350602085013561490181615e17565b93969395505050506040820135916060013590565b60008060006040848603121561492a578081fd5b833561493581615e17565b9250602084013567ffffffffffffffff811115614950578182fd5b61495c868287016144bc565b9497909650939450505050565b6000806000806060858703121561497e578182fd5b843561498981615e17565b9350602085013561499981615e2c565b9250604085013567ffffffffffffffff808211156149b5578384fd5b818701915087601f8301126149c8578384fd5b8135818111156149d6578485fd5b8860208285010111156149e7578485fd5b95989497505060200194505050565b600080600060608486031215614a0a578081fd5b8335614a1581615e17565b95602085013595506040909401359392505050565b600080600060408486031215614a3e578081fd5b833567ffffffffffffffff811115614a54578182fd5b614a60868287016144bc565b909790965060209590950135949350505050565b60008060208385031215614a86578182fd5b823567ffffffffffffffff811115614a9c578283fd5b614aa8858286016144bc565b90969095509350505050565b60006020808385031215614ac6578182fd5b825167ffffffffffffffff811115614adc578283fd5b8301601f81018513614aec578283fd5b8051614afa61452382615dad565b8181528381019083850185840285018601891015614b16578687fd5b8694505b83851015614b38578051835260019490940193918501918501614b1a565b50979650505050505050565b60008060008060608587031215614b59578182fd5b843567ffffffffffffffff80821115614b70578384fd5b818701915087601f830112614b83578384fd5b8135614b9161452382615dad565b808282526020808301925080860160a08d838288028a01011115614bb357898afd5b8997505b85881015614c365780828f031215614bcd57898afd5b614bd681615d86565b614be08f846147b0565b8152614bee8f8585016144b1565b8185015260408381013590820152614c098f606085016144b1565b6060820152614c1b8f608085016144b1565b60808201528552600197909701969382019390810190614bb7565b509199508a013597505050604088013592505080821115614c55578384fd5b50614c628782880161463d565b95989497509550505050565b600060208284031215614c7f578081fd5b815167ffffffffffffffff811115614c95578182fd5b6136a4848285016146de565b600060208284031215614cb2578081fd5b815161348081615e2c565b60008060008060008060c08789031215614cd5578384fd5b8635614ce081615e2c565b95506020870135614cf081615e17565b945060408701359350614d068860608901614888565b92506080870135915060a087013590509295509295509295565b600080600080600080600060c0888a031215614d3a578485fd5b873596506020880135614d4c81615e47565b95506040880135614d5c81615e17565b94506060880135614d6c81615e17565b9350608088013567ffffffffffffffff80821115614d88578283fd5b614d948b838c016147ca565b945060a08a0135915080821115614da9578283fd5b50614db68a828b0161463d565b989b979a50959850939692959293505050565b600080600080600080600060e0888a031215614de3578081fd5b873596506020880135614df581615e47565b95506040880135614e0581615e17565b94506060880135614e1581615e17565b9350608088013567ffffffffffffffff811115614e30578182fd5b614e3c8a828b016147ca565b93505060a0880135915060c0880135905092959891949750929550565b600080600080600060a08688031215614e70578283fd5b8535614e7b81615e17565b94506020860135614e8b81615e17565b93506040860135614e9b81615e17565b94979396509394606081013594506080013592915050565b600080600080600080600080610100898b031215614ecf578182fd5b8835614eda81615e17565b97506020890135614eea81615e17565b965060408901359550606089013594506080890135614f0881615e2c565b9350614f178a60a08b01614888565b925060c0890135915060e089013590509295985092959890939650565b600080600080600080600060e0888a031215614f4e578081fd5b8735614f5981615e17565b96506020880135614f6981615e17565b95506040880135945060608801359350614f868960808a01614888565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215614fb4578182fd5b8235614fbf81615e17565b946020939093013593505050565b60008060008060008060c08789031215614fe5578384fd5b8635614ff081615e17565b9550602087013561500081615e17565b9450604087013561501081615e17565b9350606087013561502081615e17565b9598949750929560808101359460a0909101359350915050565b6000806000806080858703121561504f578182fd5b843561505a81615e17565b9350602085013561506a81615e17565b9250604085013561507a81615e17565b9396929550929360600135925050565b60008060008060008060c087890312156150a2578384fd5b86356150ad81615e17565b955060208701356150bd81615e17565b945060408701356150cd81615e17565b93506060870135925060808701356150e481615e2c565b8092505060a087013590509295509295509295565b60006020828403121561510a578081fd5b815161348081615e3a565b60008060408385031215615127578182fd5b825161513281615e3a565b6020939093015192949293505050565b600080600060608486031215615156578081fd5b835161516181615e3a565b602085015160409095015190969495509392505050565b600060208284031215615189578081fd5b815161348081615e47565b6000806000606084860312156151a8578081fd5b83516151b381615e47565b602085015190935067ffffffffffffffff8111156151cf578182fd5b6151db868287016146de565b925050604084015190509250925092565b60008060008060008060008060008060006101608c8e03121561520d578485fd5b6152178d8d6147bb565b9a5067ffffffffffffffff8060208e01351115615232578586fd5b6152428e60208f01358f0161457c565b9a508060408e01351115615254578586fd5b6152648e60408f01358f016144bc565b909a5098506152768e60608f01614871565b97508060e08e01351115615288578586fd5b6152988e60e08f01358f016144bc565b90975095506101008d013594506101208d013593506101408d01358110156152be578283fd5b506152d08d6101408e01358e0161463d565b81935080925050509295989b509295989b9093969950565b6000806000806000806101208789031215615301578384fd5b863567ffffffffffffffff80821115615318578586fd5b9088019060c0828b03121561532b578586fd5b61533560c0615d86565b823581526153468b602085016147bb565b6020820152604083013561535981615e17565b604082015261536b8b606085016144b1565b60608201526080830135608082015260a08301358281111561538b578788fd5b6153978c828601614747565b60a0830152508098505050506153b08860208901614871565b959895975050505060a08401359360c08101359360e08201359350610100909101359150565b6000602082840312156153e7578081fd5b5035919050565b6000602082840312156153ff578081fd5b5051919050565b60008060408385031215615418578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b60008284526020808501945082825b8581101561547357813561545881615e17565b6001600160a01b031687529582019590820190600101615445565b509495945050505050565b60008284526020808501945082825b858110156154735781358752958201959082019060010161548d565b6000815180845260208085019450808401835b83811015615473578151875295820195908201906001016154bc565b15159052565b600081518084526154f6816020860160208601615dcd565b601f01601f19169290920160200192915050565b8051608080845281519084018190526000916020919082019060a0860190845b8181101561554f5783516001600160a01b03168352928401929184019160010161552a565b50508285015191508581038387015261556881836154a9565b925050506040830151848203604086015261558382826154de565b915050606083015161559860608601826154d8565b509392505050565b80356155ab81615e17565b6001600160a01b0390811683526020820135906155c782615e2c565b90151560208401526040820135906155de82615e17565b16604083015260608101356155f281615e2c565b8015156060840152505050565b60008251615611818460208701615dcd565b9190910192915050565b6000845161562d818460208901615dcd565b8201838582379092019182525092915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000604082016001600160a01b03808616845260206040818601528286518085526060870191508288019450855b818110156156d25785518516835294830194918301916001016156b4565b509098975050505050505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0394851681529290931660208301526040820152901515606082015260800190565b6001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b0397881681529515156020870152939095166040850152606084019190915260ff16608083015260a082019290925260c081019190915260e00190565b6001600160a01b0392909216825260ff16602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b6001600160a01b03949094168452602084019290925261ffff1660408301521515606082015260800190565b6040808252810183905260008460608301825b868110156158b8576020833561589d81615e17565b6001600160a01b031683529283019290910190600101615888565b5080925050506001600160a01b0383166020830152949350505050565b602080825282518282018190526000919060409081850190868401855b8281101561595e578151805161590781615e03565b8552808701516001600160a01b031687860152858101518686015260608082015161593482880182615429565b50506080908101519061594986820183615429565b505060a09390930192908501906001016158f2565b5091979650505050505050565b901515815260200190565b60008582526001600160a01b038086166020840152808516604084015250608060608301526159a8608083018461550a565b9695505050505050565b604081016159bf84615df9565b9281526020015290565b606081016159d685615df9565b938152602081019290925260409091015290565b60006159f585615e03565b84825260606020830152615a0c60608301856154a9565b9050826040830152949350505050565b6000610120808301615a2d8c615e0d565b8b84526020808501929092528a5190819052610140808501928281028601909101918c8201855b82811015615ad4578785037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec00186528151805186528481015185870152604080820151908701526060808201519087015260809081015160a091870182905290615ac0818801836154de565b978601979650505090830190600101615a54565b505050508381036040850152615aeb818a8c615436565b915050615afb60608401886155a0565b82810360e0840152615b0e81868861547e565b915050826101008301529998505050505050505050565b60208082526011908201527f756e7772617070696e67206661696c6564000000000000000000000000000000604082015260600190565b60208082526010908201527f496e636f72726563742073656e64657200000000000000000000000000000000604082015260600190565b6020808252601f908201527f52656c617965722063616e206f6e6c7920617070726f766520697473656c6600604082015260600190565b6020808252600f908201527f7772617070696e67206661696c65640000000000000000000000000000000000604082015260600190565b60208082526013908201527f554e48414e444c45445f504f4f4c5f4b494e4400000000000000000000000000604082015260600190565b60208082526019908201527f696e76616c696420636861696e6564207265666572656e636500000000000000604082015260600190565b600060e08252855160e08301526020860151615c8a81615e0d565b61010083015260408601516001600160a01b03908116610120840152606087015116610140830152608086015161016083015260a086015160c0610180840152615cd86101a08401826154de565b915050615ce860208301866155a0565b60a082019390935260c0015292915050565b90815260200190565b9182526001600160a01b0316602082015260400190565b9283526001600160a01b03918216602084015216604082015260600190565b9283526001600160a01b03919091166020830152604082015260600190565b60ff929092168252602082015260400190565b60ff9390931683526020830191909152604082015260600190565b60405181810167ffffffffffffffff81118282101715615da557600080fd5b604052919050565b600067ffffffffffffffff821115615dc3578081fd5b5060209081020190565b60005b83811015615de8578181015183820152602001615dd0565b838111156106df5750506000910152565b6003811061414f57fe5b6004811061414f57fe5b6002811061414f57fe5b6001600160a01b038116811461414f57600080fd5b801515811461414f57600080fd5b6003811061414f57600080fd5b6004811061414f57600080fdfea26469706673582212201ec40c4a4738e1dd9206f7dbef6a97a907fb8d94ee88550dbda97e3e5459c62364736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/index.ts b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/index.ts new file mode 100644 index 0000000..c7c1a8d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/index.ts @@ -0,0 +1,22 @@ +import { Task, TaskRunOptions } from '@src'; +import { BatchRelayerDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as BatchRelayerDeployment; + + const relayerLibraryArgs = [ + input.Vault, + input.wstETH, + input.BalancerMinter, + input.CanCallUserCheckpoint, + input.Version, + ]; + const relayerLibrary = await task.deployAndVerify('BatchRelayerLibrary', relayerLibraryArgs, from, force); + + // The relayer library automatically also deploys the relayer itself: we must verify it + const relayer: string = await relayerLibrary.getEntrypoint(); + + const relayerArgs = [input.Vault, relayerLibrary.address, input.Version]; // See BalancerRelayer's constructor + await task.verify('BalancerRelayer', relayer, relayerArgs); + await task.save({ BalancerRelayer: relayer }); +}; diff --git a/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/input.ts b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/input.ts new file mode 100644 index 0000000..951ca69 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/input.ts @@ -0,0 +1,27 @@ +import { ZERO_ADDRESS } from '@helpers/constants'; +import { Task, TaskMode } from '@src'; + +export type BatchRelayerDeployment = { + Vault: string; + wstETH: string; + BalancerMinter: string; + CanCallUserCheckpoint: boolean; + Version: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const Version = JSON.stringify({ + name: 'ChildChainGauge checkpointer (BalancerRelayer)', + version: 5.1, + deployment: '20230712-child-chain-gauge-checkpointer', +}); + +// We will not use the minter nor wstETH for this deployment. +// In any case they are not deployed in L2s. +export default { + Vault, + wstETH: ZERO_ADDRESS, + BalancerMinter: ZERO_ADDRESS, + CanCallUserCheckpoint: true, + Version, +}; diff --git a/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/arbitrum.json b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/arbitrum.json new file mode 100644 index 0000000..8c36bcc --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/arbitrum.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x96484f2aBF5e58b15176dbF1A799627B53F13B6d", + "BalancerRelayer": "0xFE1862BdCAf17ADf2D83eEb0Da98dAE04492F4f7" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/avalanche.json b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/avalanche.json new file mode 100644 index 0000000..1e45f75 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/avalanche.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x36caC20dd805d128c1a6Dd16eeA845C574b5A17C", + "BalancerRelayer": "0xE63e90EeC6860a0Bc163BB26f7333cbE55559fb5" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/base.json b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/base.json new file mode 100644 index 0000000..5011261 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/base.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0xaf779e58dafb4307b998C7b3C9D3f788DFc80632", + "BalancerRelayer": "0x7B25d5712fB49627534012327E46455b3fF7b26C" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/bsc.json b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/bsc.json new file mode 100644 index 0000000..fc868ff --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/bsc.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0xa523f47A933D5020b23629dDf689695AA94612Dc", + "BalancerRelayer": "0xF27D53f21d024643d50de50183932F17638229F6" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/gnosis.json b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/gnosis.json new file mode 100644 index 0000000..d8cd816 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/gnosis.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x1702067424096F07A60e62cceE3dE9420068492D", + "BalancerRelayer": "0xd488810DaAdD52C5892663FEA4e0bcb71eF744cB" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/goerli.json b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/goerli.json new file mode 100644 index 0000000..d8cd816 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/goerli.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x1702067424096F07A60e62cceE3dE9420068492D", + "BalancerRelayer": "0xd488810DaAdD52C5892663FEA4e0bcb71eF744cB" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/optimism.json b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/optimism.json new file mode 100644 index 0000000..8c36bcc --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/optimism.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x96484f2aBF5e58b15176dbF1A799627B53F13B6d", + "BalancerRelayer": "0xFE1862BdCAf17ADf2D83eEb0Da98dAE04492F4f7" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/polygon.json b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/polygon.json new file mode 100644 index 0000000..f9f4f18 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/polygon.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x268E2EE1413D768b6e2dc3F5a4ddc9Ae03d9AF42", + "BalancerRelayer": "0xe4f1878eC9710846E2B529C1b5037F8bA94583b1" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/sepolia.json b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/sepolia.json new file mode 100644 index 0000000..7debf27 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/sepolia.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x043A2daD730d585C44FB79D2614F295D2d625412", + "BalancerRelayer": "0xBeA696c7761734d9e66f4F372EB35059C1aeD1e0" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/zkevm.json b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/zkevm.json new file mode 100644 index 0000000..fe7fed7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/output/zkevm.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x85a80afee867aDf27B50BdB7b76DA70f1E853062", + "BalancerRelayer": "0x20E6Fe801Aa275e199AA253F48E6B0C612E4e1C4" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/readme.md b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/readme.md new file mode 100644 index 0000000..0efeb83 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/readme.md @@ -0,0 +1,19 @@ +# 2023-07-12 - Child Chain Gauge Checkpointer (Batch Relayer V5.1) + +L2 deployment of the `BalancerRelayer` and `BatchRelayerLibrary` based on [Relayer V5](../20230314-batch-relayer-v5/), with added gauge checkpoint functionality. + +This deployment will not be used as a trusted relayer by the Vault; it will only be used as a `ChildChainGauge` checkpointer, allowing to perform multiple (permissionless) gauge checkpoints in the same transaction. Therefore, it does **not** replace Relayer V5. + +## Useful Files + +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`BatchRelayerLibrary` artifact](./artifact/BatchRelayerLibrary.json) diff --git a/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/test/test.fork.ts b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/test/test.fork.ts new file mode 100644 index 0000000..871cf60 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230712-child-chain-gauge-checkpointer/test/test.fork.ts @@ -0,0 +1,54 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; +import * as expectEvent from '@helpers/expectEvent'; + +describeForkTest('ChildChainGaugeCheckpointer (BalancerRelayer)', 'polygon', 44244700, function () { + let task: Task; + + let relayer: Contract, library: Contract; + let user: SignerWithAddress; + + const gauges = [ + '0x4f23CCC4349E9500d27C7096bD61d203F1D1C1Aa', + '0x1F0ee42D005b89814a01f050416b28c3142ac900', + '0x51416C00388bB4644E28546c77AEe768036F17A8', + ]; + + const userAddress = '0x71003c3fe8497d434ff2aea3adda42f2728d8176'; + const version = JSON.stringify({ + name: 'ChildChainGauge checkpointer (BalancerRelayer)', + version: 5.1, + deployment: '20230712-child-chain-gauge-checkpointer', + }); + + before('run task', async () => { + task = new Task('20230712-child-chain-gauge-checkpointer', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + + library = await task.deployedInstance('BatchRelayerLibrary'); + relayer = await task.instanceAt('BalancerRelayer', await library.getEntrypoint()); + }); + + before('load signers', async () => { + // We impersonate an account that holds staked BPT for the ETH_STETH Pool. + user = await impersonate(userAddress); + }); + + it('returns correct version', async () => { + expect(await relayer.version()).to.be.eq(version); + }); + + it('checkpoints gauges for user', async () => { + const checkpointInterface = new ethers.utils.Interface([ + 'event UpdateLiquidityLimit(address indexed _user, uint256 _original_balance, uint256 _original_supply, uint256 _working_balance, uint256 _working_supply)', + ]); + + const receipt = await (await library.gaugeCheckpoint(user.address, gauges)).wait(); + expectEvent.inIndirectReceipt(receipt, checkpointInterface, 'UpdateLiquidityLimit', {}, gauges[0], 1); + expectEvent.inIndirectReceipt(receipt, checkpointInterface, 'UpdateLiquidityLimit', {}, gauges[1], 1); + expectEvent.inIndirectReceipt(receipt, checkpointInterface, 'UpdateLiquidityLimit', {}, gauges[2], 1); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/artifact/ChainlinkRateProviderFactory.json b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/artifact/ChainlinkRateProviderFactory.json new file mode 100644 index 0000000..6f9f90f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/artifact/ChainlinkRateProviderFactory.json @@ -0,0 +1,62 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ChainlinkRateProviderFactory", + "sourceName": "contracts/ChainlinkRateProviderFactory.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "rateProvider", + "type": "address" + } + ], + "name": "RateProviderCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "contract AggregatorV3Interface", + "name": "feed", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract ChainlinkRateProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "rateProvider", + "type": "address" + } + ], + "name": "isRateProviderFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b506107b7806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806319912f711461003b5780639ed9331814610089575b600080fd5b6100746100493660046101c5565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b60405190151581526020015b60405180910390f35b61009c6100973660046101c5565b6100c1565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610080565b600080826040516100d190610193565b73ffffffffffffffffffffffffffffffffffffffff9091168152602001604051809103906000f08015801561010a573d6000803e3d6000fd5b5090506101168161011c565b92915050565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f7a8e6b463d413484480a3a8120e5fb841491c52541ac3f649ac41d9b0d088aa69190a250565b610598806101ea83390190565b73ffffffffffffffffffffffffffffffffffffffff811681146101c257600080fd5b50565b6000602082840312156101d757600080fd5b81356101e2816101a0565b939250505056fe60c060405234801561001057600080fd5b5060405161059838038061059883398101604081905261002f916100eb565b806001600160a01b03166080816001600160a01b0316815250506100c26012826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100b0919061011b565b60ff166100d660201b6101d81760201c565b6100cd90600a610238565b60a0525061025b565b60006100e28284610244565b90505b92915050565b6000602082840312156100fd57600080fd5b81516001600160a01b038116811461011457600080fd5b9392505050565b60006020828403121561012d57600080fd5b815160ff8116811461011457600080fd5b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561018f5781600019048211156101755761017561013e565b8085161561018257918102915b93841c9390800290610159565b509250929050565b6000826101a6575060016100e5565b816101b3575060006100e5565b81600181146101c957600281146101d3576101ef565b60019150506100e5565b60ff8411156101e4576101e461013e565b50506001821b6100e5565b5060208310610133831016604e8410600b8410161715610212575081810a6100e5565b61021c8383610154565b80600019048211156102305761023061013e565b029392505050565b60006100e28383610197565b6000828210156102565761025661013e565b500390565b60805160a05161031361028560003960006101ad0152600081816040015260a701526103136000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063590f21131461003b578063679aefce1461008c575b600080fd5b6100627f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100946100a2565b604051908152602001610083565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610110573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610134919061020a565b505050915050600081136101a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f496e76616c6964207072696365207261746520726573706f6e73650000000000604482015260640160405180910390fd5b6101d27f000000000000000000000000000000000000000000000000000000000000000082610289565b91505090565b60006101e482846102c6565b9392505050565b805169ffffffffffffffffffff8116811461020557600080fd5b919050565b600080600080600060a0868803121561022257600080fd5b61022b866101eb565b945060208601519350604086015192506060860151915061024e608087016101eb565b90509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156102c1576102c161025a565b500290565b6000828210156102d8576102d861025a565b50039056fea2646970667358221220616f1f88194115ce4e7b5c9487117504096aa0c1a6978e58ad2486b1bd93eaae64736f6c634300080b0033a264697066735822122006abd30f5f0c4d0aa945c7daafe81bc4a2437787858597a79dac54a179cf80e764736f6c634300080b0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806319912f711461003b5780639ed9331814610089575b600080fd5b6100746100493660046101c5565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b60405190151581526020015b60405180910390f35b61009c6100973660046101c5565b6100c1565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610080565b600080826040516100d190610193565b73ffffffffffffffffffffffffffffffffffffffff9091168152602001604051809103906000f08015801561010a573d6000803e3d6000fd5b5090506101168161011c565b92915050565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f7a8e6b463d413484480a3a8120e5fb841491c52541ac3f649ac41d9b0d088aa69190a250565b610598806101ea83390190565b73ffffffffffffffffffffffffffffffffffffffff811681146101c257600080fd5b50565b6000602082840312156101d757600080fd5b81356101e2816101a0565b939250505056fe60c060405234801561001057600080fd5b5060405161059838038061059883398101604081905261002f916100eb565b806001600160a01b03166080816001600160a01b0316815250506100c26012826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100b0919061011b565b60ff166100d660201b6101d81760201c565b6100cd90600a610238565b60a0525061025b565b60006100e28284610244565b90505b92915050565b6000602082840312156100fd57600080fd5b81516001600160a01b038116811461011457600080fd5b9392505050565b60006020828403121561012d57600080fd5b815160ff8116811461011457600080fd5b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561018f5781600019048211156101755761017561013e565b8085161561018257918102915b93841c9390800290610159565b509250929050565b6000826101a6575060016100e5565b816101b3575060006100e5565b81600181146101c957600281146101d3576101ef565b60019150506100e5565b60ff8411156101e4576101e461013e565b50506001821b6100e5565b5060208310610133831016604e8410600b8410161715610212575081810a6100e5565b61021c8383610154565b80600019048211156102305761023061013e565b029392505050565b60006100e28383610197565b6000828210156102565761025661013e565b500390565b60805160a05161031361028560003960006101ad0152600081816040015260a701526103136000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063590f21131461003b578063679aefce1461008c575b600080fd5b6100627f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100946100a2565b604051908152602001610083565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610110573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610134919061020a565b505050915050600081136101a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f496e76616c6964207072696365207261746520726573706f6e73650000000000604482015260640160405180910390fd5b6101d27f000000000000000000000000000000000000000000000000000000000000000082610289565b91505090565b60006101e482846102c6565b9392505050565b805169ffffffffffffffffffff8116811461020557600080fd5b919050565b600080600080600060a0868803121561022257600080fd5b61022b866101eb565b945060208601519350604086015192506060860151915061024e608087016101eb565b90509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156102c1576102c161025a565b500290565b6000828210156102d8576102d861025a565b50039056fea2646970667358221220616f1f88194115ce4e7b5c9487117504096aa0c1a6978e58ad2486b1bd93eaae64736f6c634300080b0033a264697066735822122006abd30f5f0c4d0aa945c7daafe81bc4a2437787858597a79dac54a179cf80e764736f6c634300080b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/index.ts b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/index.ts new file mode 100644 index 0000000..ef0f77a --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/index.ts @@ -0,0 +1,5 @@ +import { Task, TaskRunOptions } from '@src'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + await task.deployAndVerify('ChainlinkRateProviderFactory', [], from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/arbitrum.json b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/arbitrum.json new file mode 100644 index 0000000..196f904 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "ChainlinkRateProviderFactory": "0x5DbAd78818D4c8958EfF2d5b95b28385A22113Cd" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/avalanche.json b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/avalanche.json new file mode 100644 index 0000000..bf734f5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/avalanche.json @@ -0,0 +1,3 @@ +{ + "ChainlinkRateProviderFactory": "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/base.json b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/base.json new file mode 100644 index 0000000..29591ae --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/base.json @@ -0,0 +1,3 @@ +{ + "ChainlinkRateProviderFactory": "0x0A973B6DB16C2ded41dC91691Cc347BEb0e2442B" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/bsc.json b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/bsc.json new file mode 100644 index 0000000..6b6079d --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/bsc.json @@ -0,0 +1,3 @@ +{ + "ChainlinkRateProviderFactory": "0x6817149cb753BF529565B4D023d7507eD2ff4Bc0" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/gnosis.json b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/gnosis.json new file mode 100644 index 0000000..e769e1f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "ChainlinkRateProviderFactory": "0xDB8d758BCb971e482B2C45f7F8a7740283A1bd3A" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/goerli.json b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/goerli.json new file mode 100644 index 0000000..e769e1f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/goerli.json @@ -0,0 +1,3 @@ +{ + "ChainlinkRateProviderFactory": "0xDB8d758BCb971e482B2C45f7F8a7740283A1bd3A" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/mainnet.json b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/mainnet.json new file mode 100644 index 0000000..19cd450 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "ChainlinkRateProviderFactory": "0x1311Fbc9F60359639174c1e7cC2032DbDb5Cc4d1" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/mode.json b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/mode.json new file mode 100644 index 0000000..73dc568 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/mode.json @@ -0,0 +1,3 @@ +{ + "ChainlinkRateProviderFactory": "0x96484f2aBF5e58b15176dbF1A799627B53F13B6d" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/optimism.json b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/optimism.json new file mode 100644 index 0000000..2464b8f --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/optimism.json @@ -0,0 +1,3 @@ +{ + "ChainlinkRateProviderFactory": "0x83E443EF4f9963C77bd860f94500075556668cb8" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/polygon.json b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/polygon.json new file mode 100644 index 0000000..7704cb3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/polygon.json @@ -0,0 +1,3 @@ +{ + "ChainlinkRateProviderFactory": "0xa3b370092aeb56770B23315252aB5E16DAcBF62B" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/sepolia.json b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/sepolia.json new file mode 100644 index 0000000..54b7ac6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "ChainlinkRateProviderFactory": "0xA8920455934Da4D853faac1f94Fe7bEf72943eF1" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/zkevm.json b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/zkevm.json new file mode 100644 index 0000000..782fd03 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/output/zkevm.json @@ -0,0 +1,3 @@ +{ + "ChainlinkRateProviderFactory": "0x4132f7AcC9dB7A6cF7BE2Dd3A9DC8b30C7E6E6c8" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/readme.md b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/readme.md new file mode 100644 index 0000000..3c03e09 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/readme.md @@ -0,0 +1,18 @@ +# 2023-07-17 - Chainlink Rate Provider Factory + +Deployment of `ChainlinkRateProviderFactory`, which creates and deploys `ChainlinkRateProvider` contracts. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkEVM mainnet addresses](./output/zkevm.json) +- [Base mainnet addresses](./output/base.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`ChainlinkRateProviderFactory` artifact](./artifact/ChainlinkRateProviderFactory.json) diff --git a/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/test/test.fork.ts b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/test/test.fork.ts new file mode 100644 index 0000000..d626408 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230717-chainlink-rate-provider-factory/test/test.fork.ts @@ -0,0 +1,35 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { describeForkTest, getForkedNetwork, Task, TaskMode } from '@src'; +import * as expectEvent from '@helpers/expectEvent'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import { fp } from '@helpers/numbers'; + +describeForkTest('ChainlinkRateProviderFactory', 'mainnet', 17717232, function () { + let task: Task; + let usdcPriceFeed: Contract, rateProviderFactory: Contract, rateProvider: Contract; + const usdcPriceFeedAddress = '0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6'; + + before('run task', async () => { + task = new Task('20230717-chainlink-rate-provider-factory', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + + usdcPriceFeed = await task.instanceAt('AggregatorV3Interface', usdcPriceFeedAddress); + rateProviderFactory = await task.deployedInstance('ChainlinkRateProviderFactory'); + }); + + before('create a ChainLinkRateProvider', async () => { + const receipt = await (await rateProviderFactory.create(usdcPriceFeed.address)).wait(); + const event = await expectEvent.inReceipt(receipt, 'RateProviderCreated'); + + rateProvider = await task.instanceAt('ChainlinkRateProvider', event.args.rateProvider); + + expect(rateProvider.address).to.not.equal(ZERO_ADDRESS); + expect(await rateProviderFactory.isRateProviderFromFactory(rateProvider.address)).to.be.true; + }); + + it('rate is about 1 USD per USDC', async () => { + expect(await rateProvider.getRate()).to.almostEqual(fp(1)); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230811-avalanche-root-gauge-factory-v2/artifact/AvalancheRootGaugeFactory.json b/balpy/balancer-deployments/tasks/20230811-avalanche-root-gauge-factory-v2/artifact/AvalancheRootGaugeFactory.json new file mode 100644 index 0000000..f9b1312 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230811-avalanche-root-gauge-factory-v2/artifact/AvalancheRootGaugeFactory.json @@ -0,0 +1,146 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "AvalancheRootGaugeFactory", + "sourceName": "contracts/gauges/avalanche/AvalancheRootGaugeFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IMainnetBalancerMinter", + "name": "minter", + "type": "address" + }, + { + "internalType": "contract ILayerZeroBALProxy", + "name": "lzBALProxy", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "GaugeCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "relativeWeightCap", + "type": "uint256" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "isGaugeFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60c060405234801561001057600080fd5b506040516128ce3803806128ce83398101604081905261002f916100bc565b82306001600160a01b031660001b838360405161004b906100af565b610056929190610108565b604051809103906000f080158015610072573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905560805260601b6001600160601b03191660a0525061013a915050565b61216d8061076183390190565b6000806000606084860312156100d0578283fd5b83516100db81610122565b60208501519093506100ec81610122565b60408501519092506100fd81610122565b809150509250925092565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b038116811461013757600080fd5b50565b60805160a05160601c610601610160600039806102055250806101b452506106016000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c80638d928af8116100505780638d928af8146100c8578063aaabadc5146100d0578063ce3cc8bd146100d857610072565b80630ecaea731461007757806339312dee146100a0578063851c1bb3146100a8575b600080fd5b61008a61008536600461045d565b6100f8565b6040516100979190610514565b60405180910390f35b61008a610194565b6100bb6100b6366004610488565b6101b0565b6040516100979190610566565b61008a610203565b61008a610227565b6100eb6100e636600461043a565b6102b3565b604051610097919061055b565b6000806101036102de565b6040517fcd6dc68700000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063cd6dc6879061015a9087908790600401610535565b600060405180830381600087803b15801561017457600080fd5b505af1158015610188573d6000803e3d6000fd5b50929695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016101e59291906104e4565b6040516020818303038152906040528051906020012090505b919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610231610203565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561027657600080fd5b505afa15801561028a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ae91906104c8565b905090565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b6000805481906103039073ffffffffffffffffffffffffffffffffffffffff16610384565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff81166101fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104319061056f565b60405180910390fd5b60006020828403121561044b578081fd5b8135610456816105a6565b9392505050565b6000806040838503121561046f578081fd5b823561047a816105a6565b946020939093013593505050565b600060208284031215610499578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610456578182fd5b6000602082840312156104d9578081fd5b8151610456816105a6565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b90815260200190565b60208082526016908201527f455243313136373a20637265617465206661696c656400000000000000000000604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff811681146105c857600080fd5b5056fea2646970667358221220347aefad4cd1b181977d6567ad38b357634223726458d22409b65be8d40a7e3564736f6c634300070100336101c06040523480156200001257600080fd5b506040516200216d3803806200216d8339810160408190526200003591620005a3565b8160016000819055506000816001600160a01b031663e6dec36f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200007a57600080fd5b505afa1580156200008f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000b591906200057d565b90506000816001600160a01b031663c00396996040518163ffffffff1660e01b815260040160206040518083038186803b158015620000f357600080fd5b505afa15801562000108573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200012e91906200057d565b90506000836001600160a01b03166358de9ade6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200016c57600080fd5b505afa15801562000181573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001a791906200057d565b6001600160601b0319606084811b821660805285811b821660a05286811b821660c05282901b1660e052604080516303e1469160e61b815290519192506001600160a01b0383169163f851a44091600480820192602092909190829003018186803b1580156200021657600080fd5b505afa1580156200022b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025191906200057d565b6001600160a01b0316610100816001600160a01b031660601b81525050826001600160a01b031663b87b56166040518163ffffffff1660e01b815260040160206040518083038186803b158015620002a857600080fd5b505afa158015620002bd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e39190620005e1565b6101208181525050826001600160a01b03166321609bbf6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200032557600080fd5b505afa1580156200033a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003609190620005e1565b6101408181525050826001600160a01b0316637efad8e06040518163ffffffff1660e01b815260040160206040518083038186803b158015620003a257600080fd5b505afa158015620003b7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003dd9190620005e1565b61016052505060001960025550506001600160601b0319606082901b166101805260408051630857749b60e41b815290516000916001600160a01b0384169163857749b09160048082019260209290919082900301818787803b1580156200044457600080fd5b505af115801562000459573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200047f9190620005fa565b836001600160a01b031663c00396996040518163ffffffff1660e01b815260040160206040518083038186803b158015620004b957600080fd5b505afa158015620004ce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004f491906200057d565b6001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200052d57600080fd5b505afa15801562000542573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005689190620005fa565b0360ff16600a0a6101a0525062000636915050565b6000602082840312156200058f578081fd5b81516200059c816200061d565b9392505050565b60008060408385031215620005b6578081fd5b8251620005c3816200061d565b6020840151909250620005d6816200061d565b809150509250929050565b600060208284031215620005f3578081fd5b5051919050565b6000602082840312156200060c578081fd5b815160ff811681146200059c578182fd5b6001600160a01b03811681146200063357600080fd5b50565b60805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205161014051610160516101805160601c6101a051611a6d62000700600039806104685280610e7c52508061028652806109545280610bb95280610c9a5280610d695280610f3b5280610f6252508061073d52508061071c52508061069f528061078952508061032352806104bd528061057a5280610aa652508061038d5280610625525080610878525080611081528061116b52508061091d5280610f195250611a6d6000f3fe6080604052600436106100e85760003560e01c806383f5c39b1161008a578063b024522511610059578063b024522514610232578063c2c4c5c114610247578063cd6dc6871461024f578063d34fb2671461026f576100e8565b806383f5c39b146101de5780639c868ac0146101f35780639f86767114610208578063ab8f09451461021d576100e8565b806314e956f5116100c657806314e956f5146101675780631b88094d146101875780634b8200931461019c5780635e8a8389146101c9576100e8565b806305c2c78d146100ed578063094007071461011857806310d3eb0414610145575b600080fd5b3480156100f957600080fd5b50610102610284565b60405161010f91906116a3565b60405180910390f35b34801561012457600080fd5b5061013861013336600461152b565b6102a9565b60405161010f91906119e0565b34801561015157600080fd5b506101656101603660046115b5565b61030b565b005b34801561017357600080fd5b506101386101823660046115b5565b610386565b34801561019357600080fd5b50610102610444565b3480156101a857600080fd5b506101bc6101b736600461152b565b610460565b60405161010f91906117b7565b3480156101d557600080fd5b50610138610466565b3480156101ea57600080fd5b5061013861048a565b3480156101ff57600080fd5b506101bc610490565b34801561021457600080fd5b50610138610499565b34801561022957600080fd5b506101656104a5565b34801561023e57600080fd5b50610138610541565b6101bc610558565b34801561025b57600080fd5b5061016561026a36600461156a565b61091b565b34801561027b57600080fd5b50610165610a8e565b7f00000000000000000000000000000000000000000000000000000000000000005b90565b600073ffffffffffffffffffffffffffffffffffffffff82163014610303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102fa90611958565b60405180910390fd5b505060045490565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461037a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102fa906117c2565b61038381610b27565b50565b600061043e7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9430856040518363ffffffff1660e01b81526004016103e6929190611791565b60206040518083038186803b1580156103fe57600080fd5b505afa158015610412573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043691906115cd565b600654610ba9565b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff1690565b50600190565b7f000000000000000000000000000000000000000000000000000000000000000090565b60065490565b60055460ff1690565b670de0b6b3a764000081565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610514576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102fa906117c2565b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600061055361054e610bb5565b610d64565b905090565b6000610562610e30565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146105d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102fa906117c2565b60025460006105de610e49565b90508082101561090d576040517f615e523700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063615e52379061065a9030906004016116a3565b600060405180830381600087803b15801561067457600080fd5b505af1158015610688573d6000803e3d6000fd5b5050600180546003549590910194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff0181101561081657848111156106d957610816565b62093a8081026000806106eb83610386565b905082851015801561070157508262093a800185105b156107ba57828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000089028161076557fe5b04975062093a80819003670de0b6b3a7640000838a02820260018b905560038990557f000000000000000000000000000000000000000000000000000000000000000090980197049390930192506107cf9050565b670de0b6b3a764000062093a80828902020491505b827f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced836040516107ff91906119e0565b60405180910390a2509390930192506001016106c1565b50600284905560048054830190558115801590610836575060055460ff16155b15610909576040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636a627842906108ad9030906004016116a3565b602060405180830381600087803b1580156108c757600080fd5b505af11580156108db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ff91906115cd565b5061090982610e74565b5050505b6001925050506102a661103c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156109b857600080fd5b505afa1580156109cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f0919061154e565b73ffffffffffffffffffffffffffffffffffffffff1614610a3d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102fa906117f9565b610a4681611043565b50600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610afd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102fa906117c2565b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b670de0b6b3a7640000811115610b69576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102fa90611867565b60068190556040517f13e45870490f54cea50d245930d12102c72b502641ef6850d0b15a8c92decfb290610b9e9083906119e0565b60405180910390a150565b80820390821102900390565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ed629c5c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610c1d57600080fd5b505afa158015610c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c559190611595565b15610d4f576040517f8cfd8f5c00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690638cfd8f5c90610cd290606a9085906004016119cb565b60206040518083038186803b158015610cea57600080fd5b505afa158015610cfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2291906115cd565b9050600181604051602001610d3892919061166e565b6040516020818303038152906040529150506102a6565b506040805160208101909152600081526102a6565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663365260b4606a610db5610db0610444565b611219565b600080886040518663ffffffff1660e01b8152600401610dd995949392919061198f565b604080518083038186803b158015610df057600080fd5b505afa158015610e04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2891906115e5565b509392505050565b610e4260026000541415610190611232565b6002600055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b6000610ea0827f0000000000000000000000000000000000000000000000000000000000000000611240565b905080610ead5750610383565b6060610eb7610bb5565b90506000610ec482610d64565b9050803414610eff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102fa90611830565b610f6073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000086611257565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632cdf0b958230606a610fab610db0610444565b60408051606081018252338152600060208201528082018a905290517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b168152611004949392918c918c9190600401611714565b6000604051808303818588803b15801561101d57600080fd5b505af1158015611031573d6000803e3d6000fd5b505050505050505050565b6001600055565b6002541561107d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102fa90611921565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110e557600080fd5b505afa1580156110f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111d91906115cd565b905080611156576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102fa906118c4565b6001819055611163610e49565b6002819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156111d157600080fd5b505af11580156111e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120991906115cd565b60035561121582610b27565b5050565b73ffffffffffffffffffffffffffffffffffffffff1690565b8161121557611215816113d3565b60008082848161124c57fe5b069093039392505050565b801580159061130857506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e906112b590309086906004016116c4565b60206040518083038186803b1580156112cd57600080fd5b505afa1580156112e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130591906115cd565b15155b156113af576113af8363095ea7b360e01b84600060405160240161132d9291906116eb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526113fd565b6113ce8363095ea7b360e01b848460405160240161132d929190611791565b505050565b610383817f42414c00000000000000000000000000000000000000000000000000000000006114b0565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516114269190611652565b6000604051808303816000865af19150503d8060008114611463576040519150601f19603f3d011682016040523d82523d6000602084013e611468565b606091505b50915091506000821415611480573d6000803e3d6000fd5b6114aa8151600014806114a25750818060200190518101906114a29190611595565b6101a2611232565b50505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60006020828403121561153c578081fd5b813561154781611a15565b9392505050565b60006020828403121561155f578081fd5b815161154781611a15565b6000806040838503121561157c578081fd5b823561158781611a15565b946020939093013593505050565b6000602082840312156115a6578081fd5b81518015158114611547578182fd5b6000602082840312156115c6578081fd5b5035919050565b6000602082840312156115de578081fd5b5051919050565b600080604083850312156115f7578182fd5b505080516020909101519092909150565b600081518084526116208160208601602086016119e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082516116648184602087016119e9565b9190910192915050565b60f09290921b7fffff000000000000000000000000000000000000000000000000000000000000168252600282015260220190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff808916835261ffff8816602084015286604084015285606084015284608084015260c060a08401528084511660c08401528060208501511660e08401525060408301516060610100840152611784610120840182611608565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b60208082526012908201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604082015260600190565b60208082526015908201527f496e76616c6964205772617070657220546f6b656e0000000000000000000000604082015260600190565b6020808252601a908201527f496e636f7272656374206d73672e76616c756520706173736564000000000000604082015260600190565b60208082526034908201527f52656c61746976652077656967687420636170206578636565647320616c6c6f60408201527f776564206162736f6c757465206d6178696d756d000000000000000000000000606082015260800190565b60208082526024908201527f42616c616e636572546f6b656e41646d696e206e6f742079657420616374697660408201527f6174656400000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526013908201527f416c726561647920696e697469616c697a656400000000000000000000000000604082015260600190565b6020808252601e908201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604082015260600190565b600061ffff87168252856020830152846040830152831515606083015260a060808301526119c060a0830184611608565b979650505050505050565b61ffff92831681529116602082015260400190565b90815260200190565b60005b83811015611a045781810151838201526020016119ec565b838111156114aa5750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461038357600080fdfea2646970667358221220ef03472d8e7790ef76063674dedc8dd461c87c6258cb8f2af640a844c22b0c2e64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100725760003560e01c80638d928af8116100505780638d928af8146100c8578063aaabadc5146100d0578063ce3cc8bd146100d857610072565b80630ecaea731461007757806339312dee146100a0578063851c1bb3146100a8575b600080fd5b61008a61008536600461045d565b6100f8565b6040516100979190610514565b60405180910390f35b61008a610194565b6100bb6100b6366004610488565b6101b0565b6040516100979190610566565b61008a610203565b61008a610227565b6100eb6100e636600461043a565b6102b3565b604051610097919061055b565b6000806101036102de565b6040517fcd6dc68700000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063cd6dc6879061015a9087908790600401610535565b600060405180830381600087803b15801561017457600080fd5b505af1158015610188573d6000803e3d6000fd5b50929695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016101e59291906104e4565b6040516020818303038152906040528051906020012090505b919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610231610203565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561027657600080fd5b505afa15801561028a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ae91906104c8565b905090565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b6000805481906103039073ffffffffffffffffffffffffffffffffffffffff16610384565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff81166101fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104319061056f565b60405180910390fd5b60006020828403121561044b578081fd5b8135610456816105a6565b9392505050565b6000806040838503121561046f578081fd5b823561047a816105a6565b946020939093013593505050565b600060208284031215610499578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610456578182fd5b6000602082840312156104d9578081fd5b8151610456816105a6565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b90815260200190565b60208082526016908201527f455243313136373a20637265617465206661696c656400000000000000000000604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff811681146105c857600080fd5b5056fea2646970667358221220347aefad4cd1b181977d6567ad38b357634223726458d22409b65be8d40a7e3564736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230811-avalanche-root-gauge-factory-v2/index.ts b/balpy/balancer-deployments/tasks/20230811-avalanche-root-gauge-factory-v2/index.ts new file mode 100644 index 0000000..406d8f9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230811-avalanche-root-gauge-factory-v2/index.ts @@ -0,0 +1,14 @@ +import { Task, TaskRunOptions } from '@src'; +import { AvalancheRootGaugeFactoryDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as AvalancheRootGaugeFactoryDeployment; + + const args = [input.Vault, input.BalancerMinter, input.BALProxy]; + + const factory = await task.deployAndVerify('AvalancheRootGaugeFactory', args, from, force); + + const implementation = await factory.getGaugeImplementation(); + await task.verify('AvalancheRootGauge', implementation, [input.BalancerMinter, input.BALProxy]); + task.save({ AvalancheRootGauge: implementation }); +}; diff --git a/balpy/balancer-deployments/tasks/20230811-avalanche-root-gauge-factory-v2/input.ts b/balpy/balancer-deployments/tasks/20230811-avalanche-root-gauge-factory-v2/input.ts new file mode 100644 index 0000000..57562b3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230811-avalanche-root-gauge-factory-v2/input.ts @@ -0,0 +1,21 @@ +import { Task, TaskMode } from '@src'; + +export type AvalancheRootGaugeFactoryDeployment = { + Vault: string; + BalancerMinter: string; + BALProxy: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerMinter = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); +// Ethereum BAL proxy https://etherscan.io/address/0xE15bCB9E0EA69e6aB9FA080c4c4A5632896298C3 +// is wired to BAL token in AVAX: https://snowtrace.io/address/0xE15bCB9E0EA69e6aB9FA080c4c4A5632896298C3 +const BALProxy = '0xE15bCB9E0EA69e6aB9FA080c4c4A5632896298C3'; + +export default { + mainnet: { + Vault, + BalancerMinter, + BALProxy, + }, +}; diff --git a/balpy/balancer-deployments/tasks/20230811-avalanche-root-gauge-factory-v2/output/mainnet.json b/balpy/balancer-deployments/tasks/20230811-avalanche-root-gauge-factory-v2/output/mainnet.json new file mode 100644 index 0000000..b7af5c9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230811-avalanche-root-gauge-factory-v2/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "AvalancheRootGaugeFactory": "0x22625eEDd92c81a219A83e1dc48f88d54786B017", + "AvalancheRootGauge": "0x3Eae4a1c2E36870A006E816930d9f55DF0a72a13" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230811-avalanche-root-gauge-factory-v2/readme.md b/balpy/balancer-deployments/tasks/20230811-avalanche-root-gauge-factory-v2/readme.md new file mode 100644 index 0000000..4d622a6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230811-avalanche-root-gauge-factory-v2/readme.md @@ -0,0 +1,10 @@ +# 2023-08-11 - Avalanche Root Gauge Factory V2 + +Deployment of the `AvalancheRootGaugeFactory`, for stakeless gauges that bridge funds to their Avalanche counterparts. +This version uses a Layer Zero Omni Fungible Token as the BAL bridge, which is currently used in the Avalanche network. +Replaces [Avalanche root gauge V1](../deprecated/20230529-avalanche-root-gauge-factory/) which used anySwap wrappers to bridge BAL. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [`AvalancheRootGaugeFactory` artifact](./artifact/AvalancheRootGaugeFactory.json) diff --git a/balpy/balancer-deployments/tasks/20230811-avalanche-root-gauge-factory-v2/test/task.fork.ts b/balpy/balancer-deployments/tasks/20230811-avalanche-root-gauge-factory-v2/test/task.fork.ts new file mode 100644 index 0000000..5b58933 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230811-avalanche-root-gauge-factory-v2/test/task.fork.ts @@ -0,0 +1,413 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { BigNumberish, Contract } from 'ethers'; + +import { BigNumber, bn, fp, FP_ONE } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { advanceTime, currentTimestamp, currentWeekTimestamp, DAY, MONTH, WEEK } from '@helpers/time'; +import * as expectEvent from '@helpers/expectEvent'; + +import { expectEqualWithError } from '@helpers/relativeError'; +import { MAX_UINT256, ZERO_ADDRESS } from '@helpers/constants'; +import { range } from 'lodash'; +import { expectTransferEvent } from '@helpers/expectTransfer'; +import { actionId } from '@helpers/models/misc/actions'; + +import { describeForkTest, getSigner, impersonate, getForkedNetwork, Task, TaskMode, instanceAt } from '@src'; +import { WeightedPoolEncoder } from '@helpers/models/pools/weighted/encoder'; +import { AvalancheRootGaugeFactoryDeployment } from '../input'; + +describeForkTest('AvalancheRootGaugeFactory V2', 'mainnet', 17879200, function () { + let veBALHolder: SignerWithAddress, admin: SignerWithAddress, recipient: SignerWithAddress; + let daoMultisig: SignerWithAddress; + let factory: Contract, gauge: Contract; + let vault: Contract, + authorizer: Contract, + adaptorEntrypoint: Contract, + BALTokenAdmin: Contract, + gaugeController: Contract, + gaugeAdder: Contract, + veBAL: Contract, + bal80weth20Pool: Contract; + let BAL: string; + let lzBalProxy: Contract; + + let task: Task; + let minimumBridgeAmount: BigNumber; + let balProxyAddress: string; + + const LZ_AVAX_CHAIN_ID = 106; + const DAO_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + const VEBAL_POOL = '0x5c6ee304399dbdb9c8ef030ab642b10820db8f56'; + const VAULT_BOUNTY = fp(1000); + + const weightCap = fp(0.001); + + before('run task', async () => { + task = new Task('20230811-avalanche-root-gauge-factory-v2', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('AvalancheRootGaugeFactory'); + const input = task.input() as AvalancheRootGaugeFactoryDeployment; + balProxyAddress = input.BALProxy; + }); + + before('setup accounts', async () => { + admin = await getSigner(0); + recipient = await getSigner(1); + + daoMultisig = await impersonate(DAO_MULTISIG, fp(100)); + // Since the veBAL holder is synthetic, we do not need to start the test advancing the time to reset the voting + // power. Moreover, since the block number is close to the present at this point, advancing days breaks the first + // weight check for the gauge (i.e. before the very first gauge checkpoint), which would make the 'bridge & mint' + // test unnecessarily complex later on. + // + // Specifically, `gauge_relative_weight` returns 0 before the first gauge checkpoint, even when there are votes, + // which would cause the "vote for gauge" test to fail: and we cannot checkpoint it manually there, since the next + // "mint and bridge" needs to test for zero emissions and do its own checkpoint. + veBALHolder = await impersonate((await getSigner(2)).address, VAULT_BOUNTY.add(fp(5))); // plus gas + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.deployedInstance('Vault'); + + // Need to get the original Authorizer (getting it from the Vault at this block will yield the AuthorizerWithAdaptorValidation) + const authorizerTask = new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizer = await authorizerTask.deployedInstance('Authorizer'); + + const adaptorEntrypointTask = new Task('20221124-authorizer-adaptor-entrypoint', TaskMode.READ_ONLY, 'mainnet'); + adaptorEntrypoint = await adaptorEntrypointTask.deployedInstance('AuthorizerAdaptorEntrypoint'); + + const gaugeAdderTask = new Task('20230519-gauge-adder-v4', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeAdder = await gaugeAdderTask.deployedInstance('GaugeAdder'); + + const balancerTokenAdminTask = new Task('20220325-balancer-token-admin', TaskMode.READ_ONLY, getForkedNetwork(hre)); + BALTokenAdmin = await balancerTokenAdminTask.deployedInstance('BalancerTokenAdmin'); + + BAL = await BALTokenAdmin.getBalancerToken(); + + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeController = await gaugeControllerTask.deployedInstance('GaugeController'); + veBAL = await gaugeControllerTask.instanceAt( + 'VotingEscrow', + gaugeControllerTask.output({ network: 'mainnet' }).VotingEscrow + ); + + const weightedPoolTask = new Task('20210418-weighted-pool', TaskMode.READ_ONLY, getForkedNetwork(hre)); + bal80weth20Pool = await weightedPoolTask.instanceAt('WeightedPool2Tokens', VEBAL_POOL); + + lzBalProxy = await instanceAt('ILayerZeroBALProxy', balProxyAddress); + }); + + before('create veBAL whale', async () => { + const poolId = await bal80weth20Pool.getPoolId(); + + await vault.connect(veBALHolder).joinPool( + poolId, + veBALHolder.address, + veBALHolder.address, + { + assets: [BAL, ZERO_ADDRESS], + maxAmountsIn: [0, VAULT_BOUNTY], + fromInternalBalance: false, + userData: WeightedPoolEncoder.joinExactTokensInForBPTOut([0, VAULT_BOUNTY], 0), + }, + { value: VAULT_BOUNTY } + ); + + await bal80weth20Pool.connect(veBALHolder).approve(veBAL.address, MAX_UINT256); + const currentTime = await currentTimestamp(); + await veBAL + .connect(veBALHolder) + .create_lock(await bal80weth20Pool.balanceOf(veBALHolder.address), currentTime.add(MONTH * 12)); + + // Verify non-zero veBAL balance + const now = await currentTimestamp(); + expect(await veBAL['balanceOf(address,uint256)'](veBALHolder.address, now)).to.gt(0); + }); + + it('can create a gauge', async () => { + const tx = await factory.create(recipient.address, weightCap); + const event = expectEvent.inReceipt(await tx.wait(), 'GaugeCreated'); + + gauge = await task.instanceAt('AvalancheRootGauge', event.args.gauge); + + expect(await factory.isGaugeFromFactory(gauge.address)).to.be.true; + + // We need to grant permissions to mint in the gauges, which is done via the Authorizer Adaptor Entrypoint + await authorizer + .connect(daoMultisig) + .grantRole(await adaptorEntrypoint.getActionId(gauge.interface.getSighash('checkpoint')), admin.address); + + // Save minimum bridge amount for later. + minimumBridgeAmount = await gauge.getMinimumBridgeAmount(); + }); + + before('grant permissions on gauge adder', async () => { + // The adder is already configured with basic types and the permission to add gauges to the `GaugeController` + // at this point. + // So we will need permissions toset the factory and add the gauge in the adder. + const setFactoryAction = await actionId(gaugeAdder, 'setGaugeFactory'); + const addGaugeAction = await actionId(gaugeAdder, 'addGauge'); + + await authorizer.connect(daoMultisig).grantRole(setFactoryAction, admin.address); + await authorizer.connect(daoMultisig).grantRole(addGaugeAction, admin.address); + }); + + it('add gauge to gauge controller', async () => { + await gaugeAdder.connect(admin).setGaugeFactory(factory.address, 'Avalanche'); + await gaugeAdder.connect(admin).addGauge(gauge.address, 'Avalanche'); + + expect(await gaugeAdder.isGaugeFromValidFactory(gauge.address, 'Avalanche')).to.be.true; + + expect(await gaugeController.gauge_exists(gauge.address)).to.be.true; + }); + + it('stores the BAL proxy from Layer Zero', async () => { + expect(await gauge.getBALProxy()).to.eq(balProxyAddress); + }); + + it('stores the recipient', async () => { + expect(await gauge.getRecipient()).to.eq(recipient.address); + }); + + it('vote for gauge', async () => { + expect(await gaugeController.get_gauge_weight(gauge.address)).to.equal(0); + expect(await gauge.getCappedRelativeWeight(await currentTimestamp())).to.equal(0); + + await gaugeController.connect(veBALHolder).vote_for_gauge_weights(gauge.address, 10000); // Max voting power is 10k points + + // We now need to go through an epoch for the votes to be locked in. + // Advancing 7 days ensures we don't move forward 2 entire epochs, which would complicate the math ahead. + await advanceTime(DAY * 7); + + await gaugeController.checkpoint(); + // Gauge weight is equal to the cap, and controller weight for the gauge is greater than the cap. + expect( + await gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, await currentWeekTimestamp()) + ).to.be.gt(weightCap); + expect(await gauge.getCappedRelativeWeight(await currentTimestamp())).to.equal(weightCap); + }); + + it('mint & bridge tokens', async () => { + // The gauge has votes for this week, and it will mint the first batch of tokens. We store the current gauge + // relative weight, as it will change as time goes by due to vote decay. + const firstMintWeekTimestamp = await currentWeekTimestamp(); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + + // Even though the gauge has relative weight, it cannot mint yet as it needs for the epoch to finish + const zeroMintTx = await adaptorEntrypoint.connect(admin).performAction(gauge.address, calldata); + expectEvent.inIndirectReceipt(await zeroMintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp.sub(WEEK), // Process past week, which had zero votes + periodEmissions: 0, + }); + // No token transfers are performed if the emissions are zero, but we can't test for a lack of those + + await advanceTime(WEEK); + + const bridgeCost = await gauge.getTotalBridgeCost(); + + // The gauge should now mint and send all minted tokens to the Avalanche bridge + const mintReceipt = await ( + await adaptorEntrypoint.connect(admin).performAction(gauge.address, calldata, { value: bridgeCost }) + ).wait(); + + const event = expectEvent.inIndirectReceipt(mintReceipt, gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp, + }); + const actualEmissions: BigNumber = event.args.periodEmissions; + + // The amount of tokens minted should equal the weekly emissions rate times the relative weight of the gauge + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + + // Note that instead of the weight, we use the cap (since we expect for the weight to be larger than the cap) + const expectedEmissions = weightCap.mul(weeklyRate).div(FP_ONE); + expectEqualWithError(actualEmissions, expectedEmissions, 0.001); + + // Tokens are minted for the gauge + expectTransferEvent( + mintReceipt, + { + from: ZERO_ADDRESS, + to: gauge.address, + value: actualEmissions, + }, + BAL + ); + + // And the gauge then deposits those via the bridge mechanism + const transferEvent = expectTransferEvent( + mintReceipt, + { + from: gauge.address, + to: balProxyAddress, + }, + BAL + ); + + // Should be actual emissions rounded down to shared decimals. + const actualEmissionsSharedDecimals = actualEmissions.sub(actualEmissions.mod(minimumBridgeAmount)); + expect(transferEvent.args.value).to.be.eq(actualEmissionsSharedDecimals); + + expectEvent.inIndirectReceipt(mintReceipt, lzBalProxy.interface, 'SendToChain', { + _dstChainId: LZ_AVAX_CHAIN_ID, + _from: gauge.address, + _toAddress: ethers.utils.hexZeroPad(await gauge.getRecipient(), 32).toLowerCase(), + _amount: actualEmissionsSharedDecimals, + }); + }); + + it('mint multiple weeks', async () => { + const numberOfWeeks = 5; + await advanceTime(WEEK * numberOfWeeks); + await gaugeController.checkpoint_gauge(gauge.address); + + const weekTimestamp = await currentWeekTimestamp(); + + // We can query the relative weight of the gauge for each of the weeks that have passed + const relativeWeights: BigNumber[] = await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, weekTimestamp.sub(WEEK * weekIndex)) + ) + ); + + // We require that they're all above the cap for simplicity - this lets us use the cap as each week's weight (and + // also tests cap behavior). + for (const relativeWeight of relativeWeights) { + expect(relativeWeight).to.be.gt(weightCap); + } + + // The amount of tokens allocated to the gauge should equal the sum of the weekly emissions rate times the weight + // cap. + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + // Note that instead of the weight, we use the cap (since we expect for the weight to be larger than the cap) + const expectedEmissions = weightCap.mul(numberOfWeeks).mul(weeklyRate).div(FP_ONE); + + const bridgeCost = await gauge.getTotalBridgeCost(); + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + const tx = await adaptorEntrypoint.connect(admin).performAction(gauge.address, calldata, { value: bridgeCost }); + const receipt = await tx.wait(); + + await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + expectEvent.inIndirectReceipt(receipt, gauge.interface, 'Checkpoint', { + periodTime: weekTimestamp.sub(WEEK * weekIndex), + }) + ) + ); + + // Tokens are minted for the gauge + const transferEvent = expectTransferEvent( + receipt, + { + from: ZERO_ADDRESS, + to: gauge.address, + }, + BAL + ); + + expect(transferEvent.args.value).to.be.almostEqual(expectedEmissions, 0.00001); + + // And then they are transferred to the bridge. + const proxyTransferEvent = expectTransferEvent( + receipt, + { + from: gauge.address, + to: balProxyAddress, + }, + BAL + ); + + const expectedEmissionsSharedDecimals = expectedEmissions.sub(expectedEmissions.mod(minimumBridgeAmount)); + expect(proxyTransferEvent.args.value).to.be.eq(expectedEmissionsSharedDecimals); + + expectEvent.inIndirectReceipt(receipt, lzBalProxy.interface, 'SendToChain', { + _dstChainId: LZ_AVAX_CHAIN_ID, + _from: gauge.address, + _toAddress: ethers.utils.hexZeroPad(await gauge.getRecipient(), 32).toLowerCase(), + _amount: expectedEmissionsSharedDecimals, + }); + }); + + describe('multiple bridges (mock gauge)', () => { + let mockGauge: Contract; + let proxyOwner: SignerWithAddress; + + sharedBeforeEach(async () => { + const input = task.input() as AvalancheRootGaugeFactoryDeployment; + // We need to set force to `true`. + // The mock root gauge code is in the monorepo, in liquidity-mining/contracts/test. + mockGauge = await task.deploy('MockAvalancheRootGauge', [input.BalancerMinter, input.BALProxy], admin, true); + + // Fund mock gauge with BAL + const mintAction = await actionId(BALTokenAdmin, 'mint'); + await authorizer.connect(daoMultisig).grantRole(mintAction, admin.address); + await BALTokenAdmin.mint(mockGauge.address, fp(100000)); + proxyOwner = await impersonate(await lzBalProxy.owner()); + }); + + function itTestsMultipleTokenBridges() { + function itBridgesTokens(amount: BigNumberish) { + it(`bridges ${amount}`, async () => { + const bnAmount = BigNumber.from(amount); + const bridgeCost = await mockGauge.getTotalBridgeCost(); + const receipt = await (await mockGauge.bridge(amount, { value: bridgeCost })).wait(); + + if (bnAmount.lt(minimumBridgeAmount)) { + expectEvent.notEmitted(receipt, 'Transfer'); + } else { + const transferEvent = expectTransferEvent( + receipt, + { + from: mockGauge.address, + to: balProxyAddress, + }, + BAL + ); + + // Should be actual emissions rounded down to shared decimals. + const actualEmissionsSharedDecimals = bnAmount.sub(bnAmount.mod(minimumBridgeAmount)); + expect(transferEvent.args.value).to.be.eq(actualEmissionsSharedDecimals); + + expectEvent.inIndirectReceipt(receipt, lzBalProxy.interface, 'SendToChain', { + _dstChainId: LZ_AVAX_CHAIN_ID, + _from: mockGauge.address, + _toAddress: ethers.utils.hexZeroPad(await mockGauge.getRecipient(), 32).toLowerCase(), + _amount: actualEmissionsSharedDecimals, + }); + } + }); + } + + context('round amounts', () => { + for (let amount = bn(1); amount.lte(fp(10000)); amount = amount.mul(10)) { + itBridgesTokens(amount); + } + }); + + context('non-round amounts', () => { + for (let amount = bn(1); amount.lte(fp(10000)); amount = amount.mul(10)) { + const randomInt = (max: BigNumber) => BigNumber.from(ethers.utils.randomBytes(32)).mod(max); + itBridgesTokens(amount.add(randomInt(amount.mul(8)))); + } + }); + } + + context('without custom parameters in LZ proxy', () => { + sharedBeforeEach(async () => { + await lzBalProxy.connect(proxyOwner).setUseCustomAdapterParams(false); + }); + + itTestsMultipleTokenBridges(); + }); + + context('with custom parameters in LZ proxy', () => { + sharedBeforeEach(async () => { + await lzBalProxy.connect(proxyOwner).setUseCustomAdapterParams(true); + }); + + itTestsMultipleTokenBridges(); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230911-base-root-gauge-factory/artifact/BaseRootGaugeFactory.json b/balpy/balancer-deployments/tasks/20230911-base-root-gauge-factory/artifact/BaseRootGaugeFactory.json new file mode 100644 index 0000000..d253537 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230911-base-root-gauge-factory/artifact/BaseRootGaugeFactory.json @@ -0,0 +1,151 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BaseRootGaugeFactory", + "sourceName": "contracts/gauges/base/BaseRootGaugeFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IMainnetBalancerMinter", + "name": "minter", + "type": "address" + }, + { + "internalType": "contract IL1StandardBridge", + "name": "baseL1StandardBridge", + "type": "address" + }, + { + "internalType": "address", + "name": "baseBal", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "GaugeCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "relativeWeightCap", + "type": "uint256" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "isGaugeFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60c060405234801561001057600080fd5b5060405161205738038061205783398101604081905261002f916100bf565b83306001600160a01b031660001b84848460405161004c906100b2565b6100589392919061011d565b604051809103906000f080158015610074573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905560805260601b6001600160601b03191660a0525061015892505050565b6118d88061077f83390190565b600080600080608085870312156100d4578384fd5b84516100df81610140565b60208601519094506100f081610140565b604086015190935061010181610140565b606086015190925061011281610140565b939692955090935050565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b038116811461015557600080fd5b50565b60805160a05160601c61060161017e600039806102055250806101b452506106016000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c80638d928af8116100505780638d928af8146100c8578063aaabadc5146100d0578063ce3cc8bd146100d857610072565b80630ecaea731461007757806339312dee146100a0578063851c1bb3146100a8575b600080fd5b61008a61008536600461045d565b6100f8565b6040516100979190610514565b60405180910390f35b61008a610194565b6100bb6100b6366004610488565b6101b0565b6040516100979190610566565b61008a610203565b61008a610227565b6100eb6100e636600461043a565b6102b3565b604051610097919061055b565b6000806101036102de565b6040517fcd6dc68700000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063cd6dc6879061015a9087908790600401610535565b600060405180830381600087803b15801561017457600080fd5b505af1158015610188573d6000803e3d6000fd5b50929695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016101e59291906104e4565b6040516020818303038152906040528051906020012090505b919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610231610203565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561027657600080fd5b505afa15801561028a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ae91906104c8565b905090565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b6000805481906103039073ffffffffffffffffffffffffffffffffffffffff16610384565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff81166101fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104319061056f565b60405180910390fd5b60006020828403121561044b578081fd5b8135610456816105a6565b9392505050565b6000806040838503121561046f578081fd5b823561047a816105a6565b946020939093013593505050565b600060208284031215610499578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610456578182fd5b6000602082840312156104d9578081fd5b8151610456816105a6565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b90815260200190565b60208082526016908201527f455243313136373a20637265617465206661696c656400000000000000000000604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff811681146105c857600080fd5b5056fea26469706673582212207522df29ff90608b283659dbb7ea1070d62546dfced00d477766e001643f17c364736f6c634300070100336101c06040523480156200001257600080fd5b50604051620018d8380380620018d8833981810160405260608110156200003857600080fd5b50805160208083015160409384015160016000908155855163e6dec36f60e01b81529551949592949193869391926001600160a01b0385169263e6dec36f926004808301939192829003018186803b1580156200009457600080fd5b505afa158015620000a9573d6000803e3d6000fd5b505050506040513d6020811015620000c057600080fd5b50516040805163c003969960e01b815290519192506000916001600160a01b0384169163c0039699916004808301926020929190829003018186803b1580156200010957600080fd5b505afa1580156200011e573d6000803e3d6000fd5b505050506040513d60208110156200013557600080fd5b505160408051632c6f4d6f60e11b815290519192506000916001600160a01b038616916358de9ade916004808301926020929190829003018186803b1580156200017e57600080fd5b505afa15801562000193573d6000803e3d6000fd5b505050506040513d6020811015620001aa57600080fd5b50516001600160601b0319606084811b821660805285811b821660a05286811b821660c05282901b1660e052604080516303e1469160e61b815290519192506001600160a01b0383169163f851a44091600480820192602092909190829003018186803b1580156200021b57600080fd5b505afa15801562000230573d6000803e3d6000fd5b505050506040513d60208110156200024757600080fd5b505160601b6001600160601b0319166101005260408051635c3dab0b60e11b815290516001600160a01b0385169163b87b5616916004808301926020929190829003018186803b1580156200029b57600080fd5b505afa158015620002b0573d6000803e3d6000fd5b505050506040513d6020811015620002c757600080fd5b505161012052604080516321609bbf60e01b815290516001600160a01b038516916321609bbf916004808301926020929190829003018186803b1580156200030e57600080fd5b505afa15801562000323573d6000803e3d6000fd5b505050506040513d60208110156200033a57600080fd5b505161014052604080516303f7d6c760e51b815290516001600160a01b03851691637efad8e0916004808301926020929190829003018186803b1580156200038157600080fd5b505afa15801562000396573d6000803e3d6000fd5b505050506040513d6020811015620003ad57600080fd5b505161016052505060001960025550506001600160601b0319606092831b811661018052911b166101a0525060805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205161014051610160516101805160601c6101a05160601c61144662000492600039806106635280610d475250806105695280610cb95280610d975250806108a052508061087f52508061080252806108ec5250806103c352806105a352806106a75280610adb52508061046252806107905250806109e2525080610e745280610f71525080610c975280610d1f52506114466000f3fe6080604052600436106100e85760003560e01c80639f8676711161008a578063b4921aa311610059578063b4921aa3146102a5578063c2c4c5c1146102ba578063cd6dc687146102c2578063d34fb26714610308576100e8565b80639f86767114610251578063a267b63114610266578063ab8f09451461027b578063b024522514610290576100e8565b80631b88094d116100c65780631b88094d146101955780634b820093146101d357806383f5c39b146102275780639c868ac01461023c576100e8565b806309400707146100ed57806310d3eb041461013f57806314e956f51461016b575b600080fd5b3480156100f957600080fd5b5061012d6004803603602081101561011057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661031d565b60408051918252519081900360200190f35b34801561014b57600080fd5b506101696004803603602081101561016257600080fd5b50356103ab565b005b34801561017757600080fd5b5061012d6004803603602081101561018e57600080fd5b503561045b565b3480156101a157600080fd5b506101aa610529565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101df57600080fd5b50610213600480360360208110156101f657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610546565b604080519115158252519081900360200190f35b34801561023357600080fd5b5061012d61054c565b34801561024857600080fd5b50610213610552565b34801561025d57600080fd5b5061012d61055b565b34801561027257600080fd5b506101aa610567565b34801561028757600080fd5b5061016961058b565b34801561029c57600080fd5b5061012d61065c565b3480156102b157600080fd5b506101aa610661565b610213610685565b3480156102ce57600080fd5b50610169600480360360408110156102e557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610a72565b34801561031457600080fd5b50610169610ac3565b600073ffffffffffffffffffffffffffffffffffffffff821630146103a357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060045490565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461044f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b61045881610b91565b50565b60006105237f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9430856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b1580156104ef57600080fd5b505afa158015610503573d6000803e3d6000fd5b505050506040513d602081101561051957600080fd5b5051600654610c2d565b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff165b90565b50600190565b60065490565b60055460ff1690565b670de0b6b3a764000081565b7f000000000000000000000000000000000000000000000000000000000000000090565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461062f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600090565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061068f610c39565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461073357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b6002546000610740610c52565b905080821015610a6457604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b1580156107d757600080fd5b505af11580156107eb573d6000803e3d6000fd5b5050600180546003549590910194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff01811015610977578481111561083c57610977565b62093a80810260008061084e8361045b565b905082851015801561086457508262093a800185105b1561091d57828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008902816108c857fe5b04975062093a80819003670de0b6b3a7640000838a02820260018b905560038990557f000000000000000000000000000000000000000000000000000000000000000090980197049390930192506109329050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a250939093019250600101610824565b50600284905560048054830190558115801590610997575060055460ff16155b15610a6057604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b158015610a2a57600080fd5b505af1158015610a3e573d6000803e3d6000fd5b505050506040513d6020811015610a5457600080fd5b50610a60905082610c7d565b5050505b600192505050610543610dfa565b610a7b81610e01565b50600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610b6757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b670de0b6b3a7640000811115610bf2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806113b96034913960400191505060405180910390fd5b60068190556040805182815290517f13e45870490f54cea50d245930d12102c72b502641ef6850d0b15a8c92decfb29181900360200190a150565b80820390821102900390565b610c4b60026000541415610190611013565b6002600055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b610cde73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611021565b600754604080517f838b252000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301527f00000000000000000000000000000000000000000000000000000000000000008116602483015292831660448201526064810184905260006084820181905260c060a483015260c4820181905291517f00000000000000000000000000000000000000000000000000000000000000009093169263838b2520926101048084019391929182900301818387803b158015610ddf57600080fd5b505af1158015610df3573d6000803e3d6000fd5b5050505050565b6001600055565b60025415610e7057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ed857600080fd5b505afa158015610eec573d6000803e3d6000fd5b505050506040513d6020811015610f0257600080fd5b5051905080610f5c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806113ed6024913960400191505060405180910390fd5b6001819055610f69610c52565b6002819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610fd757600080fd5b505af1158015610feb573d6000803e3d6000fd5b505050506040513d602081101561100157600080fd5b505160035561100f82610b91565b5050565b8161100f5761100f816111f7565b80158015906110d05750604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156110a157600080fd5b505afa1580156110b5573d6000803e3d6000fd5b505050506040513d60208110156110cb57600080fd5b505115155b15611165576040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260006044808301919091528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052611165908490611221565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b3000000000000000000000000000000000000000000000000000000001790526111f2908490611221565b505050565b610458817f42414c000000000000000000000000000000000000000000000000000000000061133d565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b6020831061128a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161124d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146112ec576040519150601f19603f3d011682016040523d82523d6000602084013e6112f1565b606091505b50915091506000821415611309573d6000803e3d6000fd5b61133781516000148061132f575081806020019051602081101561132c57600080fd5b50515b6101a2611013565b50505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fdfe52656c61746976652077656967687420636170206578636565647320616c6c6f776564206162736f6c757465206d6178696d756d42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a264697066735822122009bd824a5488881b18bb43d9f8eaaec1009a177d10b9c51722c401f507c42d0b64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100725760003560e01c80638d928af8116100505780638d928af8146100c8578063aaabadc5146100d0578063ce3cc8bd146100d857610072565b80630ecaea731461007757806339312dee146100a0578063851c1bb3146100a8575b600080fd5b61008a61008536600461045d565b6100f8565b6040516100979190610514565b60405180910390f35b61008a610194565b6100bb6100b6366004610488565b6101b0565b6040516100979190610566565b61008a610203565b61008a610227565b6100eb6100e636600461043a565b6102b3565b604051610097919061055b565b6000806101036102de565b6040517fcd6dc68700000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063cd6dc6879061015a9087908790600401610535565b600060405180830381600087803b15801561017457600080fd5b505af1158015610188573d6000803e3d6000fd5b50929695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016101e59291906104e4565b6040516020818303038152906040528051906020012090505b919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610231610203565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561027657600080fd5b505afa15801561028a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ae91906104c8565b905090565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b6000805481906103039073ffffffffffffffffffffffffffffffffffffffff16610384565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff81166101fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104319061056f565b60405180910390fd5b60006020828403121561044b578081fd5b8135610456816105a6565b9392505050565b6000806040838503121561046f578081fd5b823561047a816105a6565b946020939093013593505050565b600060208284031215610499578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610456578182fd5b6000602082840312156104d9578081fd5b8151610456816105a6565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b90815260200190565b60208082526016908201527f455243313136373a20637265617465206661696c656400000000000000000000604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff811681146105c857600080fd5b5056fea26469706673582212207522df29ff90608b283659dbb7ea1070d62546dfced00d477766e001643f17c364736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230911-base-root-gauge-factory/index.ts b/balpy/balancer-deployments/tasks/20230911-base-root-gauge-factory/index.ts new file mode 100644 index 0000000..f8b3b35 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230911-base-root-gauge-factory/index.ts @@ -0,0 +1,14 @@ +import { Task, TaskRunOptions } from '@src'; +import { BaseRootGaugeFactoryDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as BaseRootGaugeFactoryDeployment; + + const args = [input.Vault, input.BalancerMinter, input.L1StandardBridge, input.BaseBAL]; + + const factory = await task.deployAndVerify('BaseRootGaugeFactory', args, from, force); + + const implementation = await factory.getGaugeImplementation(); + await task.verify('BaseRootGauge', implementation, [input.BalancerMinter, input.L1StandardBridge, input.BaseBAL]); + task.save({ BaseRootGauge: implementation }); +}; diff --git a/balpy/balancer-deployments/tasks/20230911-base-root-gauge-factory/input.ts b/balpy/balancer-deployments/tasks/20230911-base-root-gauge-factory/input.ts new file mode 100644 index 0000000..8897e60 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230911-base-root-gauge-factory/input.ts @@ -0,0 +1,22 @@ +import { Task, TaskMode } from '@src'; + +export type BaseRootGaugeFactoryDeployment = { + Vault: string; + BalancerMinter: string; + BaseBAL: string; + L1StandardBridge: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerMinter = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); + +export default { + mainnet: { + Vault, + BalancerMinter, + // The original BAL token was replaced (See https://github.com/balancer/balancer-deployments/pull/77#issue-1848405451) + // https://basescan.org/token/0x4158734D47Fc9692176B5085E0F52ee0Da5d47F1 + BaseBAL: '0x4158734D47Fc9692176B5085E0F52ee0Da5d47F1', + L1StandardBridge: '0x3154Cf16ccdb4C6d922629664174b904d80F2C35', + }, +}; diff --git a/balpy/balancer-deployments/tasks/20230911-base-root-gauge-factory/output/mainnet.json b/balpy/balancer-deployments/tasks/20230911-base-root-gauge-factory/output/mainnet.json new file mode 100644 index 0000000..7f35fc5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230911-base-root-gauge-factory/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "BaseRootGaugeFactory": "0x8e3B64b3737097F283E965869e3503AA20F31E4D", + "BaseRootGauge": "0x9a4d642b9876231BB9062559521A48097abFe6CB" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230911-base-root-gauge-factory/readme.md b/balpy/balancer-deployments/tasks/20230911-base-root-gauge-factory/readme.md new file mode 100644 index 0000000..dc8de7e --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230911-base-root-gauge-factory/readme.md @@ -0,0 +1,9 @@ +# 2023-09-11 - Base Root Gauge Factory + +Deployment of the `BaseRootGaugeFactory`, for stakeless gauges that bridge funds to their Base counterparts. +This uses the same L1StandardBridge as Optimism, and has no special requirements. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [`BaseRootGaugeFactory` artifact](./artifact/BaseRootGaugeFactory.json) diff --git a/balpy/balancer-deployments/tasks/20230911-base-root-gauge-factory/test/task.fork.ts b/balpy/balancer-deployments/tasks/20230911-base-root-gauge-factory/test/task.fork.ts new file mode 100644 index 0000000..a05c7d5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230911-base-root-gauge-factory/test/task.fork.ts @@ -0,0 +1,378 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { BigNumberish, Contract } from 'ethers'; + +import { BigNumber, bn, fp, FP_ONE } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { advanceTime, currentTimestamp, currentWeekTimestamp, DAY, MONTH, WEEK } from '@helpers/time'; +import * as expectEvent from '@helpers/expectEvent'; + +import { expectEqualWithError } from '@helpers/relativeError'; +import { MAX_UINT256, ZERO_ADDRESS } from '@helpers/constants'; +import { range } from 'lodash'; +import { expectTransferEvent } from '@helpers/expectTransfer'; +import { actionId } from '@helpers/models/misc/actions'; + +import { describeForkTest, getSigner, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; +import { WeightedPoolEncoder } from '@helpers/models/pools/weighted/encoder'; +import { BaseRootGaugeFactoryDeployment } from '../input'; + +describeForkTest('BaseRootGaugeFactory', 'mainnet', 18067080, function () { + let veBALHolder: SignerWithAddress, admin: SignerWithAddress, recipient: SignerWithAddress; + let daoMultisig: SignerWithAddress; + let factory: Contract, gauge: Contract; + let vault: Contract, + authorizer: Contract, + adaptorEntrypoint: Contract, + BALTokenAdmin: Contract, + gaugeController: Contract, + gaugeAdder: Contract, + veBAL: Contract, + bal80weth20Pool: Contract, + L1Bridge: string, + L2BALToken: string; + let BAL: string; + + let task: Task; + + const DAO_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + const VEBAL_POOL = '0x5c6ee304399dbdb9c8ef030ab642b10820db8f56'; + const VAULT_BOUNTY = fp(1000); + + const weightCap = fp(0.001); + + // And the gauge then deposits those in the predicate via the bridge mechanism + const bridgeInterface = new ethers.utils.Interface([ + 'event ERC20DepositInitiated(address indexed _l1Token, address indexed _l2Token, address indexed _from, address _to, uint256 _amount, bytes _data)', + ]); + + before('run task', async () => { + task = new Task('20230911-base-root-gauge-factory', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('BaseRootGaugeFactory'); + + const input = task.input() as BaseRootGaugeFactoryDeployment; + L1Bridge = input.L1StandardBridge; + L2BALToken = input.BaseBAL; + }); + + before('setup accounts', async () => { + admin = await getSigner(0); + recipient = await getSigner(1); + + daoMultisig = await impersonate(DAO_MULTISIG, fp(100)); + // Since the veBAL holder is synthetic, we do not need to start the test advancing the time to reset the voting + // power. Moreover, since the block number is close to the present at this point, advancing days breaks the first + // weight check for the gauge (i.e. before the very first gauge checkpoint), which would make the 'bridge & mint' + // test unnecessarily complex later on. + // + // Specifically, `gauge_relative_weight` returns 0 before the first gauge checkpoint, even when there are votes, + // which would cause the "vote for gauge" test to fail: and we cannot checkpoint it manually there, since the next + // "mint and bridge" needs to test for zero emissions and do its own checkpoint. + veBALHolder = await impersonate((await getSigner(2)).address, VAULT_BOUNTY.add(fp(5))); // plus gas + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.deployedInstance('Vault'); + + // Need to get the original Authorizer (getting it from the Vault at this block will yield the AuthorizerWithAdaptorValidation) + const authorizerTask = new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizer = await authorizerTask.deployedInstance('Authorizer'); + + const adaptorEntrypointTask = new Task('20221124-authorizer-adaptor-entrypoint', TaskMode.READ_ONLY, 'mainnet'); + adaptorEntrypoint = await adaptorEntrypointTask.deployedInstance('AuthorizerAdaptorEntrypoint'); + + const gaugeAdderTask = new Task('20230519-gauge-adder-v4', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeAdder = await gaugeAdderTask.deployedInstance('GaugeAdder'); + + const balancerTokenAdminTask = new Task('20220325-balancer-token-admin', TaskMode.READ_ONLY, getForkedNetwork(hre)); + BALTokenAdmin = await balancerTokenAdminTask.deployedInstance('BalancerTokenAdmin'); + + BAL = await BALTokenAdmin.getBalancerToken(); + + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeController = await gaugeControllerTask.deployedInstance('GaugeController'); + veBAL = await gaugeControllerTask.instanceAt( + 'VotingEscrow', + gaugeControllerTask.output({ network: 'mainnet' }).VotingEscrow + ); + + const weightedPoolTask = new Task('20210418-weighted-pool', TaskMode.READ_ONLY, getForkedNetwork(hre)); + bal80weth20Pool = await weightedPoolTask.instanceAt('WeightedPool2Tokens', VEBAL_POOL); + }); + + before('create veBAL whale', async () => { + const poolId = await bal80weth20Pool.getPoolId(); + + await vault.connect(veBALHolder).joinPool( + poolId, + veBALHolder.address, + veBALHolder.address, + { + assets: [BAL, ZERO_ADDRESS], + maxAmountsIn: [0, VAULT_BOUNTY], + fromInternalBalance: false, + userData: WeightedPoolEncoder.joinExactTokensInForBPTOut([0, VAULT_BOUNTY], 0), + }, + { value: VAULT_BOUNTY } + ); + + await bal80weth20Pool.connect(veBALHolder).approve(veBAL.address, MAX_UINT256); + const currentTime = await currentTimestamp(); + await veBAL + .connect(veBALHolder) + .create_lock(await bal80weth20Pool.balanceOf(veBALHolder.address), currentTime.add(MONTH * 12)); + + // Verify non-zero veBAL balance + const now = await currentTimestamp(); + expect(await veBAL['balanceOf(address,uint256)'](veBALHolder.address, now)).to.gt(0); + }); + + it('can create a gauge', async () => { + const tx = await factory.create(recipient.address, weightCap); + const event = expectEvent.inReceipt(await tx.wait(), 'GaugeCreated'); + + gauge = await task.instanceAt('BaseRootGauge', event.args.gauge); + + expect(await factory.isGaugeFromFactory(gauge.address)).to.be.true; + + // We need to grant permissions to mint in the gauges, which is done via the Authorizer Adaptor Entrypoint + await authorizer + .connect(daoMultisig) + .grantRole(await adaptorEntrypoint.getActionId(gauge.interface.getSighash('checkpoint')), admin.address); + }); + + before('grant permissions on gauge adder', async () => { + // The adder is already configured with basic types and the permission to add gauges to the `GaugeController` + // at this point. + // So we will need permissions toset the factory and add the gauge in the adder. + const setFactoryAction = await actionId(gaugeAdder, 'setGaugeFactory'); + const addGaugeTypeAction = await actionId(gaugeAdder, 'addGaugeType'); + const addGaugeAction = await actionId(gaugeAdder, 'addGauge'); + + await authorizer.connect(daoMultisig).grantRole(addGaugeTypeAction, admin.address); + await authorizer.connect(daoMultisig).grantRole(setFactoryAction, admin.address); + await authorizer.connect(daoMultisig).grantRole(addGaugeAction, admin.address); + }); + + it('add gauge to gauge controller', async () => { + await gaugeAdder.connect(admin).addGaugeType('Base'); + await gaugeAdder.connect(admin).setGaugeFactory(factory.address, 'Base'); + await gaugeAdder.connect(admin).addGauge(gauge.address, 'Base'); + + expect(await gaugeAdder.isGaugeFromValidFactory(gauge.address, 'Base')).to.be.true; + + expect(await gaugeController.gauge_exists(gauge.address)).to.be.true; + }); + + it('stores the recipient', async () => { + expect(await gauge.getRecipient()).to.eq(recipient.address); + }); + + it('stores the standard bridge', async () => { + expect(await gauge.getBaseL1StandardBridge()).to.eq(L1Bridge); + }); + + it('stores the L2 BAL token', async () => { + expect(await gauge.getBaseBal()).to.eq(L2BALToken); + }); + + it('vote for gauge', async () => { + expect(await gaugeController.get_gauge_weight(gauge.address)).to.equal(0); + expect(await gauge.getCappedRelativeWeight(await currentTimestamp())).to.equal(0); + + await gaugeController.connect(veBALHolder).vote_for_gauge_weights(gauge.address, 10000); // Max voting power is 10k points + + // We now need to go through an epoch for the votes to be locked in. + // Advancing 7 days ensures we don't move forward 2 entire epochs, which would complicate the math ahead. + await advanceTime(DAY * 7); + + await gaugeController.checkpoint(); + // Gauge weight is equal to the cap, and controller weight for the gauge is greater than the cap. + expect( + await gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, await currentWeekTimestamp()) + ).to.be.gt(weightCap); + expect(await gauge.getCappedRelativeWeight(await currentTimestamp())).to.equal(weightCap); + }); + + it('mint & bridge tokens', async () => { + // The gauge has votes for this week, and it will mint the first batch of tokens. We store the current gauge + // relative weight, as it will change as time goes by due to vote decay. + const firstMintWeekTimestamp = await currentWeekTimestamp(); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + + // Even though the gauge has relative weight, it cannot mint yet as it needs for the epoch to finish + const zeroMintTx = await adaptorEntrypoint.connect(admin).performAction(gauge.address, calldata); + expectEvent.inIndirectReceipt(await zeroMintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp.sub(WEEK), // Process past week, which had zero votes + periodEmissions: 0, + }); + // No token transfers are performed if the emissions are zero, but we can't test for a lack of those + + await advanceTime(WEEK); + + // The gauge should now mint and send all minted tokens to the Arbitrum bridge + const mintTx = await adaptorEntrypoint.connect(admin).performAction(gauge.address, calldata); + const event = expectEvent.inIndirectReceipt(await mintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp, + }); + const actualEmissions = event.args.periodEmissions; + + // The amount of tokens minted should equal the weekly emissions rate times the relative weight of the gauge + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + + // Note that instead of the weight, we use the cap (since we expect for the weight to be larger than the cap) + const expectedEmissions = weightCap.mul(weeklyRate).div(FP_ONE); + expectEqualWithError(actualEmissions, expectedEmissions, 0.001); + + // Tokens are minted for the gauge + expectTransferEvent( + await mintTx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + value: actualEmissions, + }, + BAL + ); + + // And the gauge then deposits those in the predicate via the bridge mechanism + const bridgeInterface = new ethers.utils.Interface([ + 'event ERC20DepositInitiated(address indexed _l1Token, address indexed _l2Token, address indexed _from, address _to, uint256 _amount, bytes _data)', + ]); + + expectEvent.inIndirectReceipt(await mintTx.wait(), bridgeInterface, 'ERC20DepositInitiated', { + _l1Token: BAL, + _l2Token: L2BALToken, + _from: gauge.address, + _to: recipient.address, + _amount: actualEmissions, + }); + }); + + it('mint multiple weeks', async () => { + const numberOfWeeks = 5; + await advanceTime(WEEK * numberOfWeeks); + await gaugeController.checkpoint_gauge(gauge.address); + + const weekTimestamp = await currentWeekTimestamp(); + + // We can query the relative weight of the gauge for each of the weeks that have passed + const relativeWeights: BigNumber[] = await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, weekTimestamp.sub(WEEK * weekIndex)) + ) + ); + + // We require that they're all above the cap for simplicity - this lets us use the cap as each week's weight (and + // also tests cap behavior). + for (const relativeWeight of relativeWeights) { + expect(relativeWeight).to.be.gt(weightCap); + } + + // The amount of tokens allocated to the gauge should equal the sum of the weekly emissions rate times the weight + // cap. + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + // Note that instead of the weight, we use the cap (since we expect for the weight to be larger than the cap) + const expectedEmissions = weightCap.mul(numberOfWeeks).mul(weeklyRate).div(FP_ONE); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + const tx = await adaptorEntrypoint.connect(admin).performAction(gauge.address, calldata); + + await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + expectEvent.inIndirectReceipt(await tx.wait(), gauge.interface, 'Checkpoint', { + periodTime: weekTimestamp.sub(WEEK * weekIndex), + }) + ) + ); + + // Tokens are minted for the gauge + const transferEvent = expectTransferEvent( + await tx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + }, + BAL + ); + + expect(transferEvent.args.value).to.be.almostEqual(expectedEmissions); + + const depositEvent = expectEvent.inIndirectReceipt(await tx.wait(), bridgeInterface, 'ERC20DepositInitiated', { + _l1Token: BAL, + _l2Token: L2BALToken, + _from: gauge.address, + _to: recipient.address, + }); + + expect(depositEvent.args._amount).to.be.almostEqual(expectedEmissions); + }); + + describe('multiple bridges (mock gauge)', () => { + let mockGauge: Contract; + let mockRecipient: string; + let bridgeAddress: string; + + sharedBeforeEach(async () => { + const input = task.input() as BaseRootGaugeFactoryDeployment; + + // We need to set force to `true`. + // The mock root gauge code is in the monorepo, in liquidity-mining/contracts/test. + mockGauge = await task.deploy( + 'MockBaseRootGauge', + [input.BalancerMinter, input.L1StandardBridge, input.BaseBAL], + admin, + true + ); + mockRecipient = await mockGauge.getRecipient(); + bridgeAddress = input.L1StandardBridge; + + // Fund mock gauge with BAL + const mintAction = await actionId(BALTokenAdmin, 'mint'); + await authorizer.connect(daoMultisig).grantRole(mintAction, admin.address); + await BALTokenAdmin.mint(mockGauge.address, fp(100000)); + }); + + function itBridgesTokens(amount: BigNumberish) { + it(`bridges ${amount}`, async () => { + const bnAmount = BigNumber.from(amount); + const receipt = await (await mockGauge.bridge(amount)).wait(); + + const transferEvent = expectTransferEvent( + receipt, + { + from: mockGauge.address, + to: bridgeAddress, + }, + BAL + ); + expect(transferEvent.args.value).to.be.eq(bnAmount); + + const depositEvent = expectEvent.inIndirectReceipt(receipt, bridgeInterface, 'ERC20DepositInitiated', { + _l1Token: BAL, + _l2Token: L2BALToken, + _from: mockGauge.address, + _to: mockRecipient, + }); + + expect(depositEvent.args._amount).to.be.almostEqual(bnAmount); + }); + } + + context('round amounts', () => { + for (let amount = bn(1); amount.lte(fp(10000)); amount = amount.mul(10)) { + itBridgesTokens(amount); + } + }); + + context('non-round amounts', () => { + for (let amount = bn(1); amount.lte(fp(10000)); amount = amount.mul(10)) { + const randomInt = (max: BigNumber) => BigNumber.from(ethers.utils.randomBytes(32)).mod(max); + itBridgesTokens(amount.add(randomInt(amount.mul(8)))); + } + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/artifact/StakelessGaugeCheckpointer.json b/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/artifact/StakelessGaugeCheckpointer.json new file mode 100644 index 0000000..1ebcfe5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/artifact/StakelessGaugeCheckpointer.json @@ -0,0 +1,453 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "StakelessGaugeCheckpointer", + "sourceName": "contracts/gauges/StakelessGaugeCheckpointer.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IGaugeAdder", + "name": "gaugeAdder", + "type": "address" + }, + { + "internalType": "contract IAuthorizerAdaptorEntrypoint", + "name": "authorizerAdaptorEntrypoint", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IStakelessGauge", + "name": "gauge", + "type": "address" + }, + { + "indexed": true, + "internalType": "string", + "name": "indexedGaugeType", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "gaugeType", + "type": "string" + } + ], + "name": "GaugeAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IStakelessGauge", + "name": "gauge", + "type": "address" + }, + { + "indexed": true, + "internalType": "string", + "name": "indexedGaugeType", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "gaugeType", + "type": "string" + } + ], + "name": "GaugeRemoved", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "contract IStakelessGauge[]", + "name": "gauges", + "type": "address[]" + } + ], + "name": "addGauges", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "contract IStakelessGauge[]", + "name": "gauges", + "type": "address[]" + } + ], + "name": "addGaugesWithVerifiedType", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "minRelativeWeight", + "type": "uint256" + } + ], + "name": "checkpointAllGaugesAboveRelativeWeight", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string[]", + "name": "gaugeTypes", + "type": "string[]" + }, + { + "internalType": "uint256", + "name": "minRelativeWeight", + "type": "uint256" + } + ], + "name": "checkpointGaugesOfTypesAboveRelativeWeight", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string[]", + "name": "gaugeTypes", + "type": "string[]" + }, + { + "internalType": "contract IStakelessGauge[]", + "name": "gauges", + "type": "address[]" + } + ], + "name": "checkpointMultipleGauges", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "contract IStakelessGauge[]", + "name": "gauges", + "type": "address[]" + } + ], + "name": "checkpointMultipleGaugesOfMatchingType", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "contract IStakelessGauge", + "name": "gauge", + "type": "address" + } + ], + "name": "checkpointSingleGauge", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeAdder", + "outputs": [ + { + "internalType": "contract IGaugeAdder", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getGaugeAtIndex", + "outputs": [ + { + "internalType": "contract IStakelessGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeTypes", + "outputs": [ + { + "internalType": "string[]", + "name": "", + "type": "string[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string[]", + "name": "gaugeTypes", + "type": "string[]" + }, + { + "internalType": "uint256", + "name": "minRelativeWeight", + "type": "uint256" + } + ], + "name": "getGaugeTypesBridgeCost", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRoundedDownBlockTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "contract IStakelessGauge", + "name": "gauge", + "type": "address" + } + ], + "name": "getSingleBridgeCost", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "minRelativeWeight", + "type": "uint256" + } + ], + "name": "getTotalBridgeCost", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + } + ], + "name": "getTotalGauges", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "contract IStakelessGauge", + "name": "gauge", + "type": "address" + } + ], + "name": "hasGauge", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + } + ], + "name": "isValidGaugeType", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "contract IStakelessGauge[]", + "name": "gauges", + "type": "address[]" + } + ], + "name": "removeGauges", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101206040523480156200001257600080fd5b50604051620030ca380380620030ca83398101604081905262000035916200016c565b806001600160a01b0316638d928af86040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa9190620001aa565b6001600055306080526001600160601b0319606091821b811660a05283821b811660e0529082901b1660c05260408051632c6f4d6f60e11b815290516001600160a01b038416916358de9ade916004808301926020929190829003018186803b1580156200011757600080fd5b505afa1580156200012c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001529190620001aa565b60601b6001600160601b0319166101005250620001e99050565b600080604083850312156200017f578182fd5b82516200018c81620001d0565b60208401519092506200019f81620001d0565b809150509250929050565b600060208284031215620001bc578081fd5b8151620001c981620001d0565b9392505050565b6001600160a01b0381168114620001e657600080fd5b50565b60805160a05160601c60c05160601c60e05160601c6101005160601c612e3b6200028f600039806117915280611b795280611c6b5280611e3f5280611f295280611fd052508061041652806104a8528061072a52806108525280610a7c5280610af55280610c425280610d4d5280610ec15280610f665280611091528061118c52806119375250806113e052806122df525080610c09525080610bb95250612e3b6000f3fe60806040526004361061016a5760003560e01c80637d0a6616116100cb578063a9a7f87e1161007f578063c91be04311610059578063c91be04314610376578063d8dba2ce14610396578063f7178b88146103b65761016a565b8063a9a7f87e1461031f578063aaabadc51461033f578063afcb1a86146103545761016a565b8063851c1bb3116100b0578063851c1bb3146102d75780638d928af8146102f7578063975104961461030c5761016a565b80637d0a6616146102b1578063804d17dc146102c45761016a565b806346583adf116101225780634db34d2a116101075780634db34d2a1461025c57806373ebd0601461027c5780637c1fef511461029c5761016a565b806346583adf146102345780634a3a1e11146102495761016a565b806327f791071161015357806327f79107146101d25780632adbe5ac146101ff578063435903081461021f5761016a565b806316e772bc1461016f57806327cb2a3b146101a5575b600080fd5b34801561017b57600080fd5b5061018f61018a366004612726565b6103d6565b60405161019c9190612a4c565b60405180910390f35b3480156101b157600080fd5b506101c56101c0366004612871565b6104a3565b60405161019c9190612950565b3480156101de57600080fd5b506101f26101ed3660046128a5565b6105a7565b60405161019c9190612a57565b34801561020b57600080fd5b506101f261021a366004612821565b6105c6565b61023261022d3660046127ec565b610602565b005b34801561024057600080fd5b506101f261068a565b6102326102573660046125b7565b610699565b34801561026857600080fd5b506101f2610277366004612726565b610725565b34801561028857600080fd5b50610232610297366004612759565b610813565b3480156102a857600080fd5b506101c5610a7a565b6102326102bf366004612821565b610a9e565b6102326102d23660046128a5565b610ae9565b3480156102e357600080fd5b506101f26102f236600461267b565b610bb5565b34801561030357600080fd5b506101c5610c07565b61023261031a366004612618565b610c2b565b34801561032b57600080fd5b506101f261033a366004612618565b610d3c565b34801561034b57600080fd5b506101c5610e36565b34801561036057600080fd5b50610369610ebd565b60405161019c91906129ce565b34801561038257600080fd5b5061018f610391366004612821565b610f61565b3480156103a257600080fd5b506102326103b1366004612759565b611052565b3480156103c257600080fd5b506102326103d1366004612759565b61114d565b6040517f16e772bc00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc9061044b908590600401612a8c565b60206040518083038186803b15801561046357600080fd5b505afa158015610477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049b919061265b565b90505b919050565b6000827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc826040518263ffffffff1660e01b81526004016104ff9190612a8c565b60206040518083038186803b15801561051757600080fd5b505afa15801561052b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054f919061265b565b6105745760405162461bcd60e51b815260040161056b90612c81565b60405180910390fd5b61059d836001866040516105889190612931565b9081526040519081900360200190209061123a565b91505b5092915050565b600060606105b3610ebd565b90506105bf818461125f565b9392505050565b600082826105d48282610f61565b6105f05760405162461bcd60e51b815260040161056b90612c4a565b6105f98461129b565b95945050505050565b61060a611326565b805160005b81811015610674576106348484838151811061062757fe5b6020026020010151610f61565b6106505760405162461bcd60e51b815260040161056b90612c4a565b61066c83828151811061065f57fe5b602002602001015161133f565b60010161060f565b505061067e611470565b610686611481565b5050565b6000610694611488565b905090565b6106a1611326565b80518251146106c25760405162461bcd60e51b815260040161056b90612afc565b805160005b81811015610674576106f28482815181106106de57fe5b602002602001015184838151811061062757fe5b61070e5760405162461bcd60e51b815260040161056b90612c4a565b61071d83828151811061065f57fe5b6001016106c7565b6000817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc826040518263ffffffff1660e01b81526004016107819190612a8c565b60206040518083038186803b15801561079957600080fd5b505afa1580156107ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d1919061265b565b6107ed5760405162461bcd60e51b815260040161056b90612c81565b6105bf6001846040516108009190612931565b908152602001604051809103902061149d565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc90610887908490600401612a8c565b60206040518083038186803b15801561089f57600080fd5b505afa1580156108b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d7919061265b565b6108f35760405162461bcd60e51b815260040161056b90612c81565b60006001856040516109059190612931565b9081526020016040518091039020905060005b83811015610a7257600085858381811061092e57fe5b9050602002016020810190610943919061270a565b90508073ffffffffffffffffffffffffffffffffffffffff16639c868ac06040518163ffffffff1660e01b815260040160206040518083038186803b15801561098b57600080fd5b505afa15801561099f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c3919061265b565b6109df5760405162461bcd60e51b815260040161056b90612cb8565b6109e983826114a1565b610a055760405162461bcd60e51b815260040161056b90612bb6565b86604051610a139190612931565b60405180910390208173ffffffffffffffffffffffffffffffffffffffff167fb87757e0365ca4f80cc1f429f422c0ea7ec26bbd3e5778727e77c809462aad0289604051610a619190612a8c565b60405180910390a350600101610918565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b610aa6611326565b8181610ab28282610f61565b610ace5760405162461bcd60e51b815260040161056b90612c4a565b610ad78361133f565b610adf611470565b5050610686611481565b610af1611326565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663afcb1a866040518163ffffffff1660e01b815260040160006040518083038186803b158015610b5957600080fd5b505afa158015610b6d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b95919081019061252e565b9050610ba1818361164f565b50610baa611470565b610bb2611481565b50565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610bea929190612901565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b610c33611326565b8160005b8151811015610d20577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc838381518110610c8857fe5b60200260200101516040518263ffffffff1660e01b8152600401610cac9190612a8c565b60206040518083038186803b158015610cc457600080fd5b505afa158015610cd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfc919061265b565b610d185760405162461bcd60e51b815260040161056b90612c81565b600101610c37565b50610d2b838361164f565b610d33611470565b50610686611481565b60008260005b8151811015610e2b577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc838381518110610d9357fe5b60200260200101516040518263ffffffff1660e01b8152600401610db79190612a8c565b60206040518083038186803b158015610dcf57600080fd5b505afa158015610de3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e07919061265b565b610e235760405162461bcd60e51b815260040161056b90612c81565b600101610d42565b5061059d848461125f565b6000610e40610c07565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015610e8557600080fd5b505afa158015610e99573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069491906126ee565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663afcb1a866040518163ffffffff1660e01b815260040160006040518083038186803b158015610f2557600080fd5b505afa158015610f39573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610694919081019061252e565b6000827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc826040518263ffffffff1660e01b8152600401610fbd9190612a8c565b60206040518083038186803b158015610fd557600080fd5b505afa158015610fe9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100d919061265b565b6110295760405162461bcd60e51b815260040161056b90612c81565b61059d8360018660405161103d9190612931565b9081526040519081900360200190209061168d565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc906110c6908490600401612a8c565b60206040518083038186803b1580156110de57600080fd5b505afa1580156110f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611116919061265b565b6111325760405162461bcd60e51b815260040161056b90612c81565b61113a6116bb565b6111478484846001611701565b50505050565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc906111c1908490600401612a8c565b60206040518083038186803b1580156111d957600080fd5b505afa1580156111ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611211919061265b565b61122d5760405162461bcd60e51b815260040161056b90612c81565b6111478484846000611701565b815460009061124c9083106064611acd565b6112568383611adb565b90505b92915050565b6000805b83518110156105a057606084828151811061127a57fe5b6020026020010151905061128e8185611b15565b9092019150600101611263565b60008173ffffffffffffffffffffffffffffffffffffffff1663b02452256040518163ffffffff1660e01b815260040160206040518083038186803b1580156112e357600080fd5b505afa925050508015611313575060408051601f3d908101601f19168201909252611310918101906128bd565b60015b61131f5750600061049e565b905061049e565b61133860026000541415610190611acd565b6002600055565b600061134a8261129b565b6040805160048082526024820183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc2c4c5c10000000000000000000000000000000000000000000000000000000017905291517f4036176a00000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692634036176a92859261141592889201612971565b6000604051808303818588803b15801561142e57600080fd5b505af1158015611442573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405261146b91908101906126bb565b505050565b478015610bb257610bb23382611d34565b6001600055565b6000600162093a8042040362093a8002905090565b5490565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205480156116455783547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80830191018082146115aa57600086600001828154811061150f57fe5b600091825260209091200154875473ffffffffffffffffffffffffffffffffffffffff9091169150819088908590811061154557fe5b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff94851617905592909116815260018881019092526040902090830190555b85548690806115b557fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff8716825260018881019091526040822091909155935061125992505050565b6000915050611259565b6000611659611488565b905060005b83518110156111475761168584828151811061167657fe5b60200260200101518484611dbb565b60010161165e565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001919091016020526040902054151590565b60006116ea6000357fffffffff0000000000000000000000000000000000000000000000000000000016610bb5565b9050610bb26116f98233612084565b610191611acd565b60006001856040516117139190612931565b9081526020016040518091039020905060005b83811015610a7257600085858381811061173c57fe5b9050602002016020810190611751919061270a565b6040517f61df1bf900000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906361df1bf9906117c6908490600401612950565b60206040518083038186803b1580156117de57600080fd5b505afa1580156117f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611816919061265b565b6118325760405162461bcd60e51b815260040161056b90612a9f565b8073ffffffffffffffffffffffffffffffffffffffff16639c868ac06040518163ffffffff1660e01b815260040160206040518083038186803b15801561187857600080fd5b505afa15801561188c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b0919061265b565b156118cd5760405162461bcd60e51b815260040161056b90612c13565b6118d7838261211a565b6118f35760405162461bcd60e51b815260040161056b90612cef565b8380611a4457506040517f572cb6a500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063572cb6a59061196c908a90600401612a8c565b60206040518083038186803b15801561198457600080fd5b505afa158015611998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119bc91906126ee565b73ffffffffffffffffffffffffffffffffffffffff1663ce3cc8bd826040518263ffffffff1660e01b81526004016119f49190612950565b60206040518083038186803b158015611a0c57600080fd5b505afa158015611a20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a44919061265b565b611a605760405162461bcd60e51b815260040161056b90612b59565b86604051611a6e9190612931565b60405180910390208173ffffffffffffffffffffffffffffffffffffffff167fbd3a33b3738a69bcfb84219d93fb0b1b2d91efbf2e5bef206c9af4122290fb5489604051611abc9190612a8c565b60405180910390a350600101611726565b8161068657610686816121a2565b6000826000018281548110611aec57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169392505050565b600080611b20611488565b90506000611b376001866040516108009190612931565b90506000600186604051611b4b9190612931565b9081526020016040518091039020905060005b82811015611d2a576000611b728383611adb565b90506000857f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a4d7a250846040518263ffffffff1660e01b8152600401611bd09190612950565b60206040518083038186803b158015611be857600080fd5b505afa158015611bfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2091906128bd565b10159050808015611cf457506040517fd3078c94000000000000000000000000000000000000000000000000000000008152889073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d3078c9490611ca29086908b906004016129a8565b60206040518083038186803b158015611cba57600080fd5b505afa158015611cce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf291906128bd565b105b15611d00575050611d22565b6000611d0b8361129b565b905080611d1a57505050611d2a565b969096019550505b600101611b5e565b5050505092915050565b611d43814710156101a3611acd565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611d699061294d565b60006040518083038185875af1925050503d8060008114611da6576040519150601f19603f3d011682016040523d82523d6000602084013e611dab565b606091505b5050905061146b816101a4611acd565b6000600184604051611dcd9190612931565b908152602001604051809103902090506000611de88261149d565b905080611df657505061146b565b6000611e0a611e058483611adb565b61129b565b1590506123c981611e1d576121cc611e21565b61224c5b905060005b8381101561207a576000611e3a8683611adb565b9050867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a4d7a250836040518263ffffffff1660e01b8152600401611e969190612950565b60206040518083038186803b158015611eae57600080fd5b505afa158015611ec2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee691906128bd565b1015611f91576040517f615e523700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063615e523790611f5e908490600401612950565b600060405180830381600087803b158015611f7857600080fd5b505af1158015611f8c573d6000803e3d6000fd5b505050505b6040517fd3078c94000000000000000000000000000000000000000000000000000000008152889073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d3078c94906120079085908c906004016129a8565b60206040518083038186803b15801561201f57600080fd5b505afa158015612033573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205791906128bd565b10156120635750612072565b612070818463ffffffff16565b505b600101611e26565b5050505050505050565b600061208e610e36565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b81526004016120ca93929190612a60565b60206040518083038186803b1580156120e257600080fd5b505afa1580156120f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611256919061265b565b6000612126838361168d565b61219a57508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915585549082528286019093526040902091909155611259565b506000611259565b610bb2817f42414c0000000000000000000000000000000000000000000000000000000000612368565b60008173ffffffffffffffffffffffffffffffffffffffff1663b02452256040518163ffffffff1660e01b815260040160206040518083038186803b15801561221457600080fd5b505afa158015612228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134a91906128bd565b6040805160048082526024820183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc2c4c5c10000000000000000000000000000000000000000000000000000000017905291517f4036176a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692634036176a9261231292869201612971565b600060405180830381600087803b15801561232c57600080fd5b505af1158015612340573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261068691908101906126bb565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5bfe5b600082601f8301126123db578081fd5b81356123ee6123e982612d73565b612d4c565b81815291506020808301908481018184028601820187101561240f57600080fd5b60005b8481101561243757813561242581612de3565b84529282019290820190600101612412565b505050505092915050565b600082601f830112612452578081fd5b81356124606123e982612d73565b818152915060208083019084810160005b8481101561243757612488888484358a01016124e0565b84529282019290820190600101612471565b600082601f8301126124aa578081fd5b81516124b86123e982612d93565b91508082528360208285010111156124cf57600080fd5b6105a0816020840160208601612db7565b600082601f8301126124f0578081fd5b81356124fe6123e982612d93565b915080825283602082850101111561251557600080fd5b8060208401602084013760009082016020015292915050565b60006020808385031215612540578182fd5b825167ffffffffffffffff811115612556578283fd5b8301601f81018513612566578283fd5b80516125746123e982612d73565b81815283810190838501865b848110156125a9576125978a88845189010161249a565b84529286019290860190600101612580565b509098975050505050505050565b600080604083850312156125c9578081fd5b823567ffffffffffffffff808211156125e0578283fd5b6125ec86838701612442565b93506020850135915080821115612601578283fd5b5061260e858286016123cb565b9150509250929050565b6000806040838503121561262a578182fd5b823567ffffffffffffffff811115612640578283fd5b61264c85828601612442565b95602094909401359450505050565b60006020828403121561266c578081fd5b815180151581146105bf578182fd5b60006020828403121561268c578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146105bf578182fd5b6000602082840312156126cc578081fd5b815167ffffffffffffffff8111156126e2578182fd5b61059d8482850161249a565b6000602082840312156126ff578081fd5b81516105bf81612de3565b60006020828403121561271b578081fd5b81356105bf81612de3565b600060208284031215612737578081fd5b813567ffffffffffffffff81111561274d578182fd5b61059d848285016124e0565b60008060006040848603121561276d578081fd5b833567ffffffffffffffff80821115612784578283fd5b612790878388016124e0565b945060208601359150808211156127a5578283fd5b818601915086601f8301126127b8578283fd5b8135818111156127c6578384fd5b87602080830285010111156127d9578384fd5b6020830194508093505050509250925092565b600080604083850312156127fe578182fd5b823567ffffffffffffffff80821115612815578384fd5b6125ec868387016124e0565b60008060408385031215612833578182fd5b823567ffffffffffffffff811115612849578283fd5b612855858286016124e0565b925050602083013561286681612de3565b809150509250929050565b60008060408385031215612883578182fd5b823567ffffffffffffffff811115612899578283fd5b61264c858286016124e0565b6000602082840312156128b6578081fd5b5035919050565b6000602082840312156128ce578081fd5b5051919050565b600081518084526128ed816020860160208601612db7565b601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60008251612943818460208701612db7565b9190910192915050565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff84168252604060208301526129a060408301846128d5565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015612a3f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452612a2d8583516128d5565b945092850192908501906001016129f3565b5092979650505050505050565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825261125660208301846128d5565b6020808252602a908201527f476175676520776173206e6f7420616464656420746f2074686520476175676560408201527f436f6e74726f6c6c657200000000000000000000000000000000000000000000606082015260800190565b6020808252602a908201527f4d69736d61746368206265747765656e20676175676520747970657320616e6460408201527f2061646472657373657300000000000000000000000000000000000000000000606082015260800190565b6020808252602e908201527f476175676520646f6573206e6f7420636f72726573706f6e6420746f2074686560408201527f2073656c65637465642074797065000000000000000000000000000000000000606082015260800190565b60208082526027908201527f476175676520776173206e6f7420616464656420746f2074686520636865636b60408201527f706f696e74657200000000000000000000000000000000000000000000000000606082015260800190565b60208082526010908201527f476175676520776173206b696c6c656400000000000000000000000000000000604082015260600190565b6020808252600f908201527f4761756765206e6f742061646465640000000000000000000000000000000000604082015260600190565b60208082526012908201527f496e76616c696420676175676520747970650000000000000000000000000000604082015260600190565b60208082526014908201527f476175676520776173206e6f74206b696c6c6564000000000000000000000000604082015260600190565b60208082526027908201527f476175676520616c726561647920616464656420746f2074686520636865636b60408201527f706f696e74657200000000000000000000000000000000000000000000000000606082015260800190565b60405181810167ffffffffffffffff81118282101715612d6b57600080fd5b604052919050565b600067ffffffffffffffff821115612d89578081fd5b5060209081020190565b600067ffffffffffffffff821115612da9578081fd5b50601f01601f191660200190565b60005b83811015612dd2578181015183820152602001612dba565b838111156111475750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114610bb257600080fdfea2646970667358221220ad96561ddd7ce6b409b5587999c89b40f38d1074f98055464efae03c87603b7564736f6c63430007010033", + "deployedBytecode": "0x60806040526004361061016a5760003560e01c80637d0a6616116100cb578063a9a7f87e1161007f578063c91be04311610059578063c91be04314610376578063d8dba2ce14610396578063f7178b88146103b65761016a565b8063a9a7f87e1461031f578063aaabadc51461033f578063afcb1a86146103545761016a565b8063851c1bb3116100b0578063851c1bb3146102d75780638d928af8146102f7578063975104961461030c5761016a565b80637d0a6616146102b1578063804d17dc146102c45761016a565b806346583adf116101225780634db34d2a116101075780634db34d2a1461025c57806373ebd0601461027c5780637c1fef511461029c5761016a565b806346583adf146102345780634a3a1e11146102495761016a565b806327f791071161015357806327f79107146101d25780632adbe5ac146101ff578063435903081461021f5761016a565b806316e772bc1461016f57806327cb2a3b146101a5575b600080fd5b34801561017b57600080fd5b5061018f61018a366004612726565b6103d6565b60405161019c9190612a4c565b60405180910390f35b3480156101b157600080fd5b506101c56101c0366004612871565b6104a3565b60405161019c9190612950565b3480156101de57600080fd5b506101f26101ed3660046128a5565b6105a7565b60405161019c9190612a57565b34801561020b57600080fd5b506101f261021a366004612821565b6105c6565b61023261022d3660046127ec565b610602565b005b34801561024057600080fd5b506101f261068a565b6102326102573660046125b7565b610699565b34801561026857600080fd5b506101f2610277366004612726565b610725565b34801561028857600080fd5b50610232610297366004612759565b610813565b3480156102a857600080fd5b506101c5610a7a565b6102326102bf366004612821565b610a9e565b6102326102d23660046128a5565b610ae9565b3480156102e357600080fd5b506101f26102f236600461267b565b610bb5565b34801561030357600080fd5b506101c5610c07565b61023261031a366004612618565b610c2b565b34801561032b57600080fd5b506101f261033a366004612618565b610d3c565b34801561034b57600080fd5b506101c5610e36565b34801561036057600080fd5b50610369610ebd565b60405161019c91906129ce565b34801561038257600080fd5b5061018f610391366004612821565b610f61565b3480156103a257600080fd5b506102326103b1366004612759565b611052565b3480156103c257600080fd5b506102326103d1366004612759565b61114d565b6040517f16e772bc00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc9061044b908590600401612a8c565b60206040518083038186803b15801561046357600080fd5b505afa158015610477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049b919061265b565b90505b919050565b6000827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc826040518263ffffffff1660e01b81526004016104ff9190612a8c565b60206040518083038186803b15801561051757600080fd5b505afa15801561052b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054f919061265b565b6105745760405162461bcd60e51b815260040161056b90612c81565b60405180910390fd5b61059d836001866040516105889190612931565b9081526040519081900360200190209061123a565b91505b5092915050565b600060606105b3610ebd565b90506105bf818461125f565b9392505050565b600082826105d48282610f61565b6105f05760405162461bcd60e51b815260040161056b90612c4a565b6105f98461129b565b95945050505050565b61060a611326565b805160005b81811015610674576106348484838151811061062757fe5b6020026020010151610f61565b6106505760405162461bcd60e51b815260040161056b90612c4a565b61066c83828151811061065f57fe5b602002602001015161133f565b60010161060f565b505061067e611470565b610686611481565b5050565b6000610694611488565b905090565b6106a1611326565b80518251146106c25760405162461bcd60e51b815260040161056b90612afc565b805160005b81811015610674576106f28482815181106106de57fe5b602002602001015184838151811061062757fe5b61070e5760405162461bcd60e51b815260040161056b90612c4a565b61071d83828151811061065f57fe5b6001016106c7565b6000817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc826040518263ffffffff1660e01b81526004016107819190612a8c565b60206040518083038186803b15801561079957600080fd5b505afa1580156107ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d1919061265b565b6107ed5760405162461bcd60e51b815260040161056b90612c81565b6105bf6001846040516108009190612931565b908152602001604051809103902061149d565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc90610887908490600401612a8c565b60206040518083038186803b15801561089f57600080fd5b505afa1580156108b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d7919061265b565b6108f35760405162461bcd60e51b815260040161056b90612c81565b60006001856040516109059190612931565b9081526020016040518091039020905060005b83811015610a7257600085858381811061092e57fe5b9050602002016020810190610943919061270a565b90508073ffffffffffffffffffffffffffffffffffffffff16639c868ac06040518163ffffffff1660e01b815260040160206040518083038186803b15801561098b57600080fd5b505afa15801561099f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c3919061265b565b6109df5760405162461bcd60e51b815260040161056b90612cb8565b6109e983826114a1565b610a055760405162461bcd60e51b815260040161056b90612bb6565b86604051610a139190612931565b60405180910390208173ffffffffffffffffffffffffffffffffffffffff167fb87757e0365ca4f80cc1f429f422c0ea7ec26bbd3e5778727e77c809462aad0289604051610a619190612a8c565b60405180910390a350600101610918565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b610aa6611326565b8181610ab28282610f61565b610ace5760405162461bcd60e51b815260040161056b90612c4a565b610ad78361133f565b610adf611470565b5050610686611481565b610af1611326565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663afcb1a866040518163ffffffff1660e01b815260040160006040518083038186803b158015610b5957600080fd5b505afa158015610b6d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b95919081019061252e565b9050610ba1818361164f565b50610baa611470565b610bb2611481565b50565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610bea929190612901565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b610c33611326565b8160005b8151811015610d20577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc838381518110610c8857fe5b60200260200101516040518263ffffffff1660e01b8152600401610cac9190612a8c565b60206040518083038186803b158015610cc457600080fd5b505afa158015610cd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfc919061265b565b610d185760405162461bcd60e51b815260040161056b90612c81565b600101610c37565b50610d2b838361164f565b610d33611470565b50610686611481565b60008260005b8151811015610e2b577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc838381518110610d9357fe5b60200260200101516040518263ffffffff1660e01b8152600401610db79190612a8c565b60206040518083038186803b158015610dcf57600080fd5b505afa158015610de3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e07919061265b565b610e235760405162461bcd60e51b815260040161056b90612c81565b600101610d42565b5061059d848461125f565b6000610e40610c07565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015610e8557600080fd5b505afa158015610e99573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069491906126ee565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663afcb1a866040518163ffffffff1660e01b815260040160006040518083038186803b158015610f2557600080fd5b505afa158015610f39573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610694919081019061252e565b6000827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc826040518263ffffffff1660e01b8152600401610fbd9190612a8c565b60206040518083038186803b158015610fd557600080fd5b505afa158015610fe9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100d919061265b565b6110295760405162461bcd60e51b815260040161056b90612c81565b61059d8360018660405161103d9190612931565b9081526040519081900360200190209061168d565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc906110c6908490600401612a8c565b60206040518083038186803b1580156110de57600080fd5b505afa1580156110f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611116919061265b565b6111325760405162461bcd60e51b815260040161056b90612c81565b61113a6116bb565b6111478484846001611701565b50505050565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc906111c1908490600401612a8c565b60206040518083038186803b1580156111d957600080fd5b505afa1580156111ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611211919061265b565b61122d5760405162461bcd60e51b815260040161056b90612c81565b6111478484846000611701565b815460009061124c9083106064611acd565b6112568383611adb565b90505b92915050565b6000805b83518110156105a057606084828151811061127a57fe5b6020026020010151905061128e8185611b15565b9092019150600101611263565b60008173ffffffffffffffffffffffffffffffffffffffff1663b02452256040518163ffffffff1660e01b815260040160206040518083038186803b1580156112e357600080fd5b505afa925050508015611313575060408051601f3d908101601f19168201909252611310918101906128bd565b60015b61131f5750600061049e565b905061049e565b61133860026000541415610190611acd565b6002600055565b600061134a8261129b565b6040805160048082526024820183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc2c4c5c10000000000000000000000000000000000000000000000000000000017905291517f4036176a00000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692634036176a92859261141592889201612971565b6000604051808303818588803b15801561142e57600080fd5b505af1158015611442573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405261146b91908101906126bb565b505050565b478015610bb257610bb23382611d34565b6001600055565b6000600162093a8042040362093a8002905090565b5490565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205480156116455783547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80830191018082146115aa57600086600001828154811061150f57fe5b600091825260209091200154875473ffffffffffffffffffffffffffffffffffffffff9091169150819088908590811061154557fe5b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff94851617905592909116815260018881019092526040902090830190555b85548690806115b557fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff8716825260018881019091526040822091909155935061125992505050565b6000915050611259565b6000611659611488565b905060005b83518110156111475761168584828151811061167657fe5b60200260200101518484611dbb565b60010161165e565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001919091016020526040902054151590565b60006116ea6000357fffffffff0000000000000000000000000000000000000000000000000000000016610bb5565b9050610bb26116f98233612084565b610191611acd565b60006001856040516117139190612931565b9081526020016040518091039020905060005b83811015610a7257600085858381811061173c57fe5b9050602002016020810190611751919061270a565b6040517f61df1bf900000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906361df1bf9906117c6908490600401612950565b60206040518083038186803b1580156117de57600080fd5b505afa1580156117f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611816919061265b565b6118325760405162461bcd60e51b815260040161056b90612a9f565b8073ffffffffffffffffffffffffffffffffffffffff16639c868ac06040518163ffffffff1660e01b815260040160206040518083038186803b15801561187857600080fd5b505afa15801561188c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b0919061265b565b156118cd5760405162461bcd60e51b815260040161056b90612c13565b6118d7838261211a565b6118f35760405162461bcd60e51b815260040161056b90612cef565b8380611a4457506040517f572cb6a500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063572cb6a59061196c908a90600401612a8c565b60206040518083038186803b15801561198457600080fd5b505afa158015611998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119bc91906126ee565b73ffffffffffffffffffffffffffffffffffffffff1663ce3cc8bd826040518263ffffffff1660e01b81526004016119f49190612950565b60206040518083038186803b158015611a0c57600080fd5b505afa158015611a20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a44919061265b565b611a605760405162461bcd60e51b815260040161056b90612b59565b86604051611a6e9190612931565b60405180910390208173ffffffffffffffffffffffffffffffffffffffff167fbd3a33b3738a69bcfb84219d93fb0b1b2d91efbf2e5bef206c9af4122290fb5489604051611abc9190612a8c565b60405180910390a350600101611726565b8161068657610686816121a2565b6000826000018281548110611aec57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169392505050565b600080611b20611488565b90506000611b376001866040516108009190612931565b90506000600186604051611b4b9190612931565b9081526020016040518091039020905060005b82811015611d2a576000611b728383611adb565b90506000857f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a4d7a250846040518263ffffffff1660e01b8152600401611bd09190612950565b60206040518083038186803b158015611be857600080fd5b505afa158015611bfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2091906128bd565b10159050808015611cf457506040517fd3078c94000000000000000000000000000000000000000000000000000000008152889073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d3078c9490611ca29086908b906004016129a8565b60206040518083038186803b158015611cba57600080fd5b505afa158015611cce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf291906128bd565b105b15611d00575050611d22565b6000611d0b8361129b565b905080611d1a57505050611d2a565b969096019550505b600101611b5e565b5050505092915050565b611d43814710156101a3611acd565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611d699061294d565b60006040518083038185875af1925050503d8060008114611da6576040519150601f19603f3d011682016040523d82523d6000602084013e611dab565b606091505b5050905061146b816101a4611acd565b6000600184604051611dcd9190612931565b908152602001604051809103902090506000611de88261149d565b905080611df657505061146b565b6000611e0a611e058483611adb565b61129b565b1590506123c981611e1d576121cc611e21565b61224c5b905060005b8381101561207a576000611e3a8683611adb565b9050867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a4d7a250836040518263ffffffff1660e01b8152600401611e969190612950565b60206040518083038186803b158015611eae57600080fd5b505afa158015611ec2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee691906128bd565b1015611f91576040517f615e523700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063615e523790611f5e908490600401612950565b600060405180830381600087803b158015611f7857600080fd5b505af1158015611f8c573d6000803e3d6000fd5b505050505b6040517fd3078c94000000000000000000000000000000000000000000000000000000008152889073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d3078c94906120079085908c906004016129a8565b60206040518083038186803b15801561201f57600080fd5b505afa158015612033573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205791906128bd565b10156120635750612072565b612070818463ffffffff16565b505b600101611e26565b5050505050505050565b600061208e610e36565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b81526004016120ca93929190612a60565b60206040518083038186803b1580156120e257600080fd5b505afa1580156120f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611256919061265b565b6000612126838361168d565b61219a57508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915585549082528286019093526040902091909155611259565b506000611259565b610bb2817f42414c0000000000000000000000000000000000000000000000000000000000612368565b60008173ffffffffffffffffffffffffffffffffffffffff1663b02452256040518163ffffffff1660e01b815260040160206040518083038186803b15801561221457600080fd5b505afa158015612228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134a91906128bd565b6040805160048082526024820183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc2c4c5c10000000000000000000000000000000000000000000000000000000017905291517f4036176a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692634036176a9261231292869201612971565b600060405180830381600087803b15801561232c57600080fd5b505af1158015612340573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261068691908101906126bb565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5bfe5b600082601f8301126123db578081fd5b81356123ee6123e982612d73565b612d4c565b81815291506020808301908481018184028601820187101561240f57600080fd5b60005b8481101561243757813561242581612de3565b84529282019290820190600101612412565b505050505092915050565b600082601f830112612452578081fd5b81356124606123e982612d73565b818152915060208083019084810160005b8481101561243757612488888484358a01016124e0565b84529282019290820190600101612471565b600082601f8301126124aa578081fd5b81516124b86123e982612d93565b91508082528360208285010111156124cf57600080fd5b6105a0816020840160208601612db7565b600082601f8301126124f0578081fd5b81356124fe6123e982612d93565b915080825283602082850101111561251557600080fd5b8060208401602084013760009082016020015292915050565b60006020808385031215612540578182fd5b825167ffffffffffffffff811115612556578283fd5b8301601f81018513612566578283fd5b80516125746123e982612d73565b81815283810190838501865b848110156125a9576125978a88845189010161249a565b84529286019290860190600101612580565b509098975050505050505050565b600080604083850312156125c9578081fd5b823567ffffffffffffffff808211156125e0578283fd5b6125ec86838701612442565b93506020850135915080821115612601578283fd5b5061260e858286016123cb565b9150509250929050565b6000806040838503121561262a578182fd5b823567ffffffffffffffff811115612640578283fd5b61264c85828601612442565b95602094909401359450505050565b60006020828403121561266c578081fd5b815180151581146105bf578182fd5b60006020828403121561268c578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146105bf578182fd5b6000602082840312156126cc578081fd5b815167ffffffffffffffff8111156126e2578182fd5b61059d8482850161249a565b6000602082840312156126ff578081fd5b81516105bf81612de3565b60006020828403121561271b578081fd5b81356105bf81612de3565b600060208284031215612737578081fd5b813567ffffffffffffffff81111561274d578182fd5b61059d848285016124e0565b60008060006040848603121561276d578081fd5b833567ffffffffffffffff80821115612784578283fd5b612790878388016124e0565b945060208601359150808211156127a5578283fd5b818601915086601f8301126127b8578283fd5b8135818111156127c6578384fd5b87602080830285010111156127d9578384fd5b6020830194508093505050509250925092565b600080604083850312156127fe578182fd5b823567ffffffffffffffff80821115612815578384fd5b6125ec868387016124e0565b60008060408385031215612833578182fd5b823567ffffffffffffffff811115612849578283fd5b612855858286016124e0565b925050602083013561286681612de3565b809150509250929050565b60008060408385031215612883578182fd5b823567ffffffffffffffff811115612899578283fd5b61264c858286016124e0565b6000602082840312156128b6578081fd5b5035919050565b6000602082840312156128ce578081fd5b5051919050565b600081518084526128ed816020860160208601612db7565b601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60008251612943818460208701612db7565b9190910192915050565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff84168252604060208301526129a060408301846128d5565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015612a3f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452612a2d8583516128d5565b945092850192908501906001016129f3565b5092979650505050505050565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825261125660208301846128d5565b6020808252602a908201527f476175676520776173206e6f7420616464656420746f2074686520476175676560408201527f436f6e74726f6c6c657200000000000000000000000000000000000000000000606082015260800190565b6020808252602a908201527f4d69736d61746368206265747765656e20676175676520747970657320616e6460408201527f2061646472657373657300000000000000000000000000000000000000000000606082015260800190565b6020808252602e908201527f476175676520646f6573206e6f7420636f72726573706f6e6420746f2074686560408201527f2073656c65637465642074797065000000000000000000000000000000000000606082015260800190565b60208082526027908201527f476175676520776173206e6f7420616464656420746f2074686520636865636b60408201527f706f696e74657200000000000000000000000000000000000000000000000000606082015260800190565b60208082526010908201527f476175676520776173206b696c6c656400000000000000000000000000000000604082015260600190565b6020808252600f908201527f4761756765206e6f742061646465640000000000000000000000000000000000604082015260600190565b60208082526012908201527f496e76616c696420676175676520747970650000000000000000000000000000604082015260600190565b60208082526014908201527f476175676520776173206e6f74206b696c6c6564000000000000000000000000604082015260600190565b60208082526027908201527f476175676520616c726561647920616464656420746f2074686520636865636b60408201527f706f696e74657200000000000000000000000000000000000000000000000000606082015260800190565b60405181810167ffffffffffffffff81118282101715612d6b57600080fd5b604052919050565b600067ffffffffffffffff821115612d89578081fd5b5060209081020190565b600067ffffffffffffffff821115612da9578081fd5b50601f01601f191660200190565b60005b83811015612dd2578181015183820152602001612dba565b838111156111475750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114610bb257600080fdfea2646970667358221220ad96561ddd7ce6b409b5587999c89b40f38d1074f98055464efae03c87603b7564736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/index.ts b/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/index.ts new file mode 100644 index 0000000..a883486 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { StakelessGaugeCheckpointerDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as StakelessGaugeCheckpointerDeployment; + + const args = [input.GaugeAdder, input.AuthorizerAdaptorEntrypoint]; + await task.deployAndVerify('StakelessGaugeCheckpointer', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/input.ts b/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/input.ts new file mode 100644 index 0000000..92cdf32 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/input.ts @@ -0,0 +1,14 @@ +import { Task, TaskMode } from '@src'; + +export type StakelessGaugeCheckpointerDeployment = { + GaugeAdder: string; + AuthorizerAdaptorEntrypoint: string; +}; + +const GaugeAdder = new Task('20230519-gauge-adder-v4', TaskMode.READ_ONLY); +const AuthorizerAdaptorEntrypoint = new Task('20221124-authorizer-adaptor-entrypoint', TaskMode.READ_ONLY); + +export default { + GaugeAdder, + AuthorizerAdaptorEntrypoint, +}; diff --git a/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/output/mainnet.json b/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/output/mainnet.json new file mode 100644 index 0000000..26854a1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "StakelessGaugeCheckpointer": "0x0C8f71D19f87c0bD1b9baD2484EcC3388D5DbB98" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/output/sepolia.json b/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/output/sepolia.json new file mode 100644 index 0000000..d8baa19 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "StakelessGaugeCheckpointer": "0x268E2EE1413D768b6e2dc3F5a4ddc9Ae03d9AF42" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/readme.md b/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/readme.md new file mode 100644 index 0000000..b00ac73 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/readme.md @@ -0,0 +1,10 @@ +# 2023-09-15 - Stakeless Gauge Checkpointer V2 + +Deployment of the `StakelessGaugeCheckpointer` contract. It automates the process of performing checkpoints to stakeless root gauges. +Replaces the [`StakelessGaugeCheckpointer V1`](../deprecated/20230731-stakeless-gauge-checkpointer/), adding compatibility for paid gauges outside the Arbitrum network (e.g. Avalanche) in a more generic and future-proof way. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`StakelessGaugeCheckpointer` artifact](./artifact/StakelessGaugeCheckpointer.json) diff --git a/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/test/task-base.fork.ts b/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/test/task-base.fork.ts new file mode 100644 index 0000000..5907450 --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/test/task-base.fork.ts @@ -0,0 +1,509 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { Contract, ContractReceipt } from 'ethers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; + +import { BigNumber, fp } from '@helpers/numbers'; +import * as expectEvent from '@helpers/expectEvent'; + +import { describeForkTest } from '@src'; +import { Task, TaskMode } from '@src'; +import { getForkedNetwork } from '@src'; +import { impersonate } from '@src'; +import { actionId } from '@helpers/models/misc/actions'; + +// This block number is before the manual weekly checkpoint. This ensures gauges will actually be checkpointed. +// This test verifies the checkpointer against the manual transactions for the given period. +// This test is exactly the same as the one in 20230527-l2-gauge-checkpointer but using the new artifacts. +// It validates that the new version of the checkpointer can still do the same as the previous one in the base case. +describeForkTest('StakelessGaugeCheckpointer V2 - Base', 'mainnet', 17332499, function () { + /* eslint-disable @typescript-eslint/no-non-null-assertion */ + + enum GaugeType { + Ethereum, + Polygon, + Arbitrum, + Optimism, + Gnosis, + Avalanche, + PolygonZkEvm, + ZkSync, + } + + let adderCoordinator: Contract; + let stakelessGaugeCheckpointer: Contract; + let authorizer: Contract, adaptorEntrypoint: Contract; + + let task: Task; + let daoMultisig: SignerWithAddress, admin: SignerWithAddress; + + const DAO_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + const CHECKPOINT_MULTISIG = '0x02f35dA6A02017154367Bc4d47bb6c7D06C7533B'; + + // Event we are looking for is: + // Checkpoint(uint256,uint256) + // Topic: 0x21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced + // See tx: 0x617b441cac07386a37513dfdf351821793d795b3beb1aab1d71dad1bc69a7c86 + + // Search for the topic in the given TX. + // The total expected checkpoints is the amount of checkpoints in the TX + 1 (see Arbitrum gauges below). + const TOTAL_EXPECTED_CHECKPOINTS = 79; + + // Gauges that are NOT killed for the given test block number. + const polygonRootGauges: [address: string, expectedCheckpoints: number][] = [ + ['0x082aacfaf4db8ac0642cbed50df732d3c309e679', 6], + ['0xdd3b4161d2a4c609884e20ed71b4e85be44572e6', 6], + ['0x16289f675ca54312a8fcf99341e7439982888077', 6], + ['0x455f20c54b5712a84454468c7831f7c431aeeb1c', 6], + ['0x39ceebb561a65216a4b776ea752d3137e9d6c0f0', 6], + ['0x1604b7e80975555e0aceaca9c81807fbb4d65cf1', 6], + ['0xc534c30749b6c198d35a7836e26076e7745d8936', 6], + ['0x539d6edbd16f2f069a06716416c3a6e98cc29dd0', 5], + ['0x31f99c542cbe456fcbbe99d4bf849af4d7fb5405', 6], + ['0x47d7269829ba9571d98eb6ddc34e9c8f1a4c327f', 6], + ['0x416d15c36c6daad2b9410b79ae557e6f07dcb642', 1], + ['0xd103dd49b8051a09b399a52e9a8ab629392de2fb', 1], + ]; + + // There were no Arbitrum checkpoints in this TX, but this gauge was not killed the previous week unlike the rest + // of the Arbitrum gauges, so it can be checkpointed. + // It is important to have at least one Arbitrum gauge for the test, because it is the only type that has + // an associated ETH fee. + const arbitrumRootGauges: [address: string, expectedCheckpoints: number][] = [ + ['0x8204b749b808818deb7957dbd030ceea44d1fe18', 1], + ]; + + const optimismRootGauges: [address: string, expectedCheckpoints: number][] = [ + ['0xdacd99029b4b94cd04fe364aac370829621c1c64', 6], + ]; + + const gnosisRootGauges: [address: string, expectedCheckpoints: number][] = [ + ['0xe41736b4e78be41bd03ebaf8f86ea493c6e9ea96', 1], + ['0x21b2ef3dc22b7bd4634205081c667e39742075e2', 1], + ['0x3b6a85b5e1e6205ebf4d4eabf147d10e8e4bf0a5', 1], + ['0xcb2c2af6c3e88b4a89aa2aae1d7c8120eee9ad0e', 6], + ]; + + const singleRecipientGauges: [address: string, expectedCheckpoints: number][] = [ + ['0x56124eb16441A1eF12A4CCAeAbDD3421281b795A', 1], + ['0xE867AD0a48e8f815DC0cda2CDb275e0F163A480b', 1], + ]; + + const checkpointInterface = new ethers.utils.Interface([ + 'function checkpoint()', + 'event Checkpoint(uint256 indexed periodTime, uint256 periodEmissions)', + ]); + + type GaugeData = { + address: string; + weight: BigNumber; + expectedCheckpoints: number; + }; + + const gauges = new Map(); + + before('run task', async () => { + task = new Task('20230915-stakeless-gauge-checkpointer-v2', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + stakelessGaugeCheckpointer = await task.deployedInstance('StakelessGaugeCheckpointer'); + }); + + before('setup governance', async () => { + daoMultisig = await impersonate(DAO_MULTISIG, fp(100)); + admin = await impersonate(CHECKPOINT_MULTISIG, fp(100)); + }); + + before('setup contracts', async () => { + const authorizerTask = new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizer = await authorizerTask.deployedInstance('Authorizer'); + + const adaptorEntrypointTask = new Task( + '20221124-authorizer-adaptor-entrypoint', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ); + adaptorEntrypoint = await adaptorEntrypointTask.deployedInstance('AuthorizerAdaptorEntrypoint'); + }); + + // At this block, the adder coordinator has been deployed but not executed. + // Then, we can fetch the deployed contract and execute it here to setup the correct types in the adder, which are + // necessary for the checkpointer to work correctly. + before('run adder migrator coordinator', async () => { + const adderCoordinatorTask = new Task( + '20230519-gauge-adder-migration-v3-to-v4', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ); + adderCoordinator = await adderCoordinatorTask.deployedInstance('GaugeAdderMigrationCoordinator'); + + await authorizer.connect(daoMultisig).grantRole(await authorizer.DEFAULT_ADMIN_ROLE(), adderCoordinator.address); + await adderCoordinator.performNextStage(); + }); + + before('get gauge relative weights and associate them with their respective address', async () => { + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + const gaugeController = await gaugeControllerTask.deployedInstance('GaugeController'); + + const getGaugesData = async (gaugeInputs: [string, number][]) => { + return Promise.all( + gaugeInputs.map(async (gaugeInput) => { + return { + address: gaugeInput[0], + weight: await gaugeController['gauge_relative_weight(address)'](gaugeInput[0]), + expectedCheckpoints: gaugeInput[1], + }; + }) + ); + }; + const singleRecipientGaugesData: GaugeData[] = await getGaugesData(singleRecipientGauges); + const polygonRootGaugesData: GaugeData[] = await getGaugesData(polygonRootGauges); + const arbitrumRootGaugesData: GaugeData[] = await getGaugesData(arbitrumRootGauges); + const optimismRootGaugesData: GaugeData[] = await getGaugesData(optimismRootGauges); + const gnosisRootGaugesData: GaugeData[] = await getGaugesData(gnosisRootGauges); + + gauges.set(GaugeType.Ethereum, singleRecipientGaugesData); + gauges.set(GaugeType.Polygon, polygonRootGaugesData); + gauges.set(GaugeType.Arbitrum, arbitrumRootGaugesData); + gauges.set(GaugeType.Optimism, optimismRootGaugesData); + gauges.set(GaugeType.Gnosis, gnosisRootGaugesData); + }); + + before('check total expected checkpoints', () => { + let sum = 0; + for (const [, gaugeData] of gauges.entries()) { + if (gaugeData.length > 0) { + sum += gaugeData.map((gaugeData) => gaugeData.expectedCheckpoints).reduce((a, b) => a + b); + } + } + expect(sum).to.be.eq(TOTAL_EXPECTED_CHECKPOINTS); + }); + + before('add gauges to checkpointer', async () => { + // Some gauges were created from previous factories, so they need to be added by governance. + // For simplicity, we just add all of them with the same method. + // The non-permissioned 'addGauges' function is already tested in the unit test. + await authorizer + .connect(daoMultisig) + .grantRole(await actionId(stakelessGaugeCheckpointer, 'addGaugesWithVerifiedType'), admin.address); + + await Promise.all( + Array.from(gauges).map(([gaugeType, gaugesData]) => { + stakelessGaugeCheckpointer.connect(admin).addGaugesWithVerifiedType( + GaugeType[gaugeType], + gaugesData.map((gaugeData) => gaugeData.address) + ); + }) + ); + }); + + before('grant checkpoint permission to gauge checkpointer', async () => { + // Any gauge works; we just need the interface. + const gauge = await task.instanceAt('IStakelessGauge', gauges.get(GaugeType.Polygon)![0].address); + + await authorizer + .connect(daoMultisig) + .grantRole( + await adaptorEntrypoint.getActionId(gauge.interface.getSighash('checkpoint')), + stakelessGaugeCheckpointer.address + ); + }); + + it('checks that gauges were added correctly', async () => { + for (const [gaugeType, gaugesData] of gauges.entries()) { + expect(await stakelessGaugeCheckpointer.getTotalGauges(GaugeType[gaugeType])).to.be.eq(gaugesData.length); + } + }); + + describe('getTotalBridgeCost', () => { + function itChecksTotalBridgeCost(minRelativeWeight: BigNumber) { + it('checks total bridge cost', async () => { + const arbitrumGauge = await task.instanceAt('ArbitrumRootGauge', gauges.get(GaugeType.Arbitrum)![0].address); + + const gaugesAmountAboveMinWeight = getGaugeDataAboveMinWeight(GaugeType.Arbitrum, minRelativeWeight).length; + const singleGaugeBridgeCost = await arbitrumGauge.getTotalBridgeCost(); + + // Bridge cost per gauge is always the same, so total cost is (single gauge cost) * (number of gauges). + expect(await stakelessGaugeCheckpointer.getTotalBridgeCost(minRelativeWeight)).to.be.eq( + singleGaugeBridgeCost.mul(gaugesAmountAboveMinWeight) + ); + }); + } + + context('when threshold is 1', () => { + itChecksTotalBridgeCost(fp(1)); + }); + + context('when threshold is 0.0001', () => { + itChecksTotalBridgeCost(fp(0.0001)); + }); + + context('when threshold is 0', () => { + itChecksTotalBridgeCost(fp(0)); + }); + }); + + describe('getSingleBridgeCost', () => { + it('gets the cost for an arbitrum gauge', async () => { + const arbitrumGauge = await task.instanceAt('ArbitrumRootGauge', gauges.get(GaugeType.Arbitrum)![0].address); + const bridgeCost = await arbitrumGauge.getTotalBridgeCost(); + const arbitrumType = GaugeType[GaugeType.Arbitrum]; + expect(await stakelessGaugeCheckpointer.getSingleBridgeCost(arbitrumType, arbitrumGauge.address)).to.be.eq( + bridgeCost + ); + }); + + it('gets the cost for an non-arbitrum gauge', async () => { + const gnosisGauge = await task.instanceAt('GnosisRootGauge', gauges.get(GaugeType.Gnosis)![0].address); + const gnosisType = GaugeType[GaugeType.Gnosis]; + expect(await stakelessGaugeCheckpointer.getSingleBridgeCost(gnosisType, gnosisGauge.address)).to.be.eq(0); + }); + + it('reverts when the gauge address is not present in the type', async () => { + const gnosisGauge = await task.instanceAt('GnosisRootGauge', gauges.get(GaugeType.Gnosis)![0].address); + const polygonType = GaugeType[GaugeType.Polygon]; + await expect(stakelessGaugeCheckpointer.getSingleBridgeCost(polygonType, gnosisGauge.address)).to.be.revertedWith( + 'Gauge not added' + ); + }); + }); + + describe('checkpoint', () => { + sharedBeforeEach(async () => { + // Gauges that are above a threshold will get another checkpoint attempt when the threshold is lowered. + // This block takes a snapshot so that gauges can be repeatedly checkpointed without skipping. + }); + + context('when threshold is 1', () => { + itCheckpointsGaugesAboveRelativeWeight(fp(1), 0); + }); + + context('when threshold is 0.0001', () => { + itCheckpointsGaugesAboveRelativeWeight(fp(0.0001), 11); + }); + + context('when threshold is 0', () => { + itCheckpointsGaugesAboveRelativeWeight(fp(0), 20); + }); + + function itCheckpointsGaugesAboveRelativeWeight(minRelativeWeight: BigNumber, gaugesAboveThreshold: number) { + let performCheckpoint: () => Promise; + let gaugeDataAboveMinWeight: GaugeData[] = []; + let ethereumGaugeDataAboveMinWeight: GaugeData[], + polygonGaugeDataAboveMinWeight: GaugeData[], + arbitrumGaugeDataAboveMinWeight: GaugeData[], + optimismGaugeDataAboveMinWeight: GaugeData[], + gnosisGaugeDataAboveMinWeight: GaugeData[]; + + sharedBeforeEach(async () => { + ethereumGaugeDataAboveMinWeight = getGaugeDataAboveMinWeight(GaugeType.Ethereum, minRelativeWeight); + polygonGaugeDataAboveMinWeight = getGaugeDataAboveMinWeight(GaugeType.Polygon, minRelativeWeight); + arbitrumGaugeDataAboveMinWeight = getGaugeDataAboveMinWeight(GaugeType.Arbitrum, minRelativeWeight); + optimismGaugeDataAboveMinWeight = getGaugeDataAboveMinWeight(GaugeType.Optimism, minRelativeWeight); + gnosisGaugeDataAboveMinWeight = getGaugeDataAboveMinWeight(GaugeType.Gnosis, minRelativeWeight); + }); + + context('when checkpointing all types', () => { + sharedBeforeEach(async () => { + performCheckpoint = async () => { + const tx = await stakelessGaugeCheckpointer.checkpointAllGaugesAboveRelativeWeight(minRelativeWeight, { + value: await stakelessGaugeCheckpointer.getTotalBridgeCost(minRelativeWeight), + }); + return await tx.wait(); + }; + gaugeDataAboveMinWeight = [ + ...ethereumGaugeDataAboveMinWeight, + ...polygonGaugeDataAboveMinWeight, + ...arbitrumGaugeDataAboveMinWeight, + ...optimismGaugeDataAboveMinWeight, + ...gnosisGaugeDataAboveMinWeight, + ]; + + expect(gaugeDataAboveMinWeight.length).to.be.eq(gaugesAboveThreshold); + }); + + itPerformsCheckpoint(); + }); + + context('when checkpointing only Ethereum gauges', () => { + sharedBeforeEach(async () => { + performCheckpoint = async () => { + const tx = await stakelessGaugeCheckpointer.checkpointGaugesOfTypesAboveRelativeWeight( + [GaugeType[GaugeType.Ethereum]], + minRelativeWeight + ); + return await tx.wait(); + }; + gaugeDataAboveMinWeight = ethereumGaugeDataAboveMinWeight; + }); + + itPerformsCheckpoint(); + }); + + context('when checkpointing only Polygon gauges', () => { + sharedBeforeEach(async () => { + performCheckpoint = async () => { + const tx = await stakelessGaugeCheckpointer.checkpointGaugesOfTypesAboveRelativeWeight( + [GaugeType[GaugeType.Polygon]], + minRelativeWeight + ); + return await tx.wait(); + }; + gaugeDataAboveMinWeight = polygonGaugeDataAboveMinWeight; + }); + + itPerformsCheckpoint(); + }); + + context('when checkpointing only Arbitrum gauges', () => { + sharedBeforeEach(async () => { + performCheckpoint = async () => { + const tx = await stakelessGaugeCheckpointer.checkpointGaugesOfTypesAboveRelativeWeight( + [GaugeType[GaugeType.Arbitrum]], + minRelativeWeight, + { + value: await stakelessGaugeCheckpointer.getTotalBridgeCost(minRelativeWeight), + } + ); + return await tx.wait(); + }; + gaugeDataAboveMinWeight = arbitrumGaugeDataAboveMinWeight; + }); + + itPerformsCheckpoint(); + }); + + context('when checkpointing only Optimism gauges', () => { + sharedBeforeEach(async () => { + performCheckpoint = async () => { + const tx = await stakelessGaugeCheckpointer.checkpointGaugesOfTypesAboveRelativeWeight( + [GaugeType[GaugeType.Optimism]], + minRelativeWeight + ); + return await tx.wait(); + }; + gaugeDataAboveMinWeight = optimismGaugeDataAboveMinWeight; + }); + + itPerformsCheckpoint(); + }); + + context('when checkpointing only Gnosis gauges', () => { + sharedBeforeEach(async () => { + performCheckpoint = async () => { + const tx = await stakelessGaugeCheckpointer.checkpointGaugesOfTypesAboveRelativeWeight( + [GaugeType[GaugeType.Gnosis]], + minRelativeWeight + ); + return await tx.wait(); + }; + gaugeDataAboveMinWeight = gnosisGaugeDataAboveMinWeight; + }); + + itPerformsCheckpoint(); + }); + + context('when checkpointing multiple gauges (single type)', () => { + sharedBeforeEach(async () => { + gaugeDataAboveMinWeight = gnosisGaugeDataAboveMinWeight; + + performCheckpoint = async () => { + const tx = await stakelessGaugeCheckpointer.checkpointMultipleGaugesOfMatchingType( + GaugeType[GaugeType.Gnosis], + gaugeDataAboveMinWeight.map((gaugeData) => gaugeData.address) + ); + return await tx.wait(); + }; + }); + + itPerformsCheckpoint(); + }); + + context('when checkpointing multiple gauges (multiple types)', () => { + sharedBeforeEach(async () => { + gaugeDataAboveMinWeight = [...arbitrumGaugeDataAboveMinWeight, ...polygonGaugeDataAboveMinWeight]; + // An array with one string representing the type for each of the gauges to checkpoint + const matchingTypesArray = [ + Array(arbitrumGaugeDataAboveMinWeight.length).fill(GaugeType[GaugeType.Arbitrum]), + Array(polygonGaugeDataAboveMinWeight.length).fill(GaugeType[GaugeType.Polygon]), + ].flat(); + + // In this case we are mixing Arbitrum gauges, so we need to pay bridge costs. + const value = await stakelessGaugeCheckpointer.getGaugeTypesBridgeCost( + [GaugeType[GaugeType.Arbitrum], GaugeType[GaugeType.Polygon]], + minRelativeWeight + ); + + performCheckpoint = async () => { + const tx = await stakelessGaugeCheckpointer.checkpointMultipleGauges( + matchingTypesArray, + gaugeDataAboveMinWeight.map((gaugeData) => gaugeData.address), + { value } + ); + return await tx.wait(); + }; + }); + + itPerformsCheckpoint(); + }); + + function itPerformsCheckpoint() { + it('performs a checkpoint for (non-checkpointed) gauges', async () => { + const receipt = await performCheckpoint(); + // Check that the right amount of checkpoints were actually performed for every gauge that required them. + gaugeDataAboveMinWeight.forEach((gaugeData) => { + expectEvent.inIndirectReceipt( + receipt, + checkpointInterface, + 'Checkpoint', + {}, + gaugeData.address, + gaugeData.expectedCheckpoints + ); + }); + }); + } + } + + describe('single gauge checkpoint', () => { + context('when checkpointing a single Arbitrum gauge', () => { + it('performs a checkpoint for (non-checkpointed) gauges', async () => { + const arbitrumGaugeData = gauges.get(GaugeType.Arbitrum)![0]; + const arbitrumType = GaugeType[GaugeType.Arbitrum]; + + const tx = await stakelessGaugeCheckpointer.checkpointSingleGauge(arbitrumType, arbitrumGaugeData.address, { + value: await stakelessGaugeCheckpointer.getSingleBridgeCost(arbitrumType, arbitrumGaugeData.address), + }); + expectEvent.inIndirectReceipt( + await tx.wait(), + checkpointInterface, + 'Checkpoint', + {}, + arbitrumGaugeData.address, + arbitrumGaugeData.expectedCheckpoints + ); + }); + }); + + context('when checkpointing a single non-Arbitrum gauge', () => { + it('performs a checkpoint for (non-checkpointed) gauges', async () => { + const gnosisGaugeData = gauges.get(GaugeType.Gnosis)![0]; + const gnosisType = GaugeType[GaugeType.Gnosis]; + + const tx = await stakelessGaugeCheckpointer.checkpointSingleGauge(gnosisType, gnosisGaugeData.address); + expectEvent.inIndirectReceipt( + await tx.wait(), + checkpointInterface, + 'Checkpoint', + {}, + gnosisGaugeData.address, + gnosisGaugeData.expectedCheckpoints + ); + }); + }); + }); + }); + + function getGaugeDataAboveMinWeight(gaugeType: GaugeType, fpMinRelativeWeight: BigNumber): GaugeData[] { + return gauges.get(gaugeType)!.filter((addressWeight) => addressWeight.weight.gte(fpMinRelativeWeight)); + } +}); diff --git a/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/test/task.fork.ts b/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/test/task.fork.ts new file mode 100644 index 0000000..6d2e14c --- /dev/null +++ b/balpy/balancer-deployments/tasks/20230915-stakeless-gauge-checkpointer-v2/test/task.fork.ts @@ -0,0 +1,180 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; + +import { BigNumber, fp } from '@helpers/numbers'; +import * as expectEvent from '@helpers/expectEvent'; + +import { describeForkTest } from '@src'; +import { Task, TaskMode } from '@src'; +import { getForkedNetwork } from '@src'; +import { impersonate } from '@src'; +import { actionId } from '@helpers/models/misc/actions'; +import { WEEK, currentWeekTimestamp } from '@helpers/time'; + +// This fork test verifies a corner case to validate the changes introduced in StakelessGaugeCheckpointer V1. +// The only gauge under test should have been checkpointed at this block. +// The contract in `20230527-l2-gauge-checkpointer` would skip it because it measures the gauge relative weight in +// the current week, whereas the new version does so in the previous week. +describeForkTest('StakelessGaugeCheckpointer V2', 'mainnet', 17431930, function () { + /* eslint-disable @typescript-eslint/no-non-null-assertion */ + + enum GaugeType { + Ethereum, + Polygon, + Arbitrum, + Optimism, + Gnosis, + Avalanche, + PolygonZkEvm, + ZkSync, + } + + let gaugeController: Contract; + let stakelessGaugeCheckpointer: Contract; + let authorizer: Contract, adaptorEntrypoint: Contract; + + let task: Task; + let daoMultisig: SignerWithAddress, admin: SignerWithAddress; + + const WEIGHT_THRESHOLD = fp(0.002); // 0.2% + + const DAO_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + const CHECKPOINT_MULTISIG = '0x02f35dA6A02017154367Bc4d47bb6c7D06C7533B'; + + const arbitrumRootGauge = '0xB5044FD339A7b858095324cC3F239C212956C179'; + const expectedCheckpoints = 8; + + const checkpointInterface = new ethers.utils.Interface([ + 'function checkpoint()', + 'event Checkpoint(uint256 indexed periodTime, uint256 periodEmissions)', + ]); + + type GaugeData = { + address: string; + weight: BigNumber; + expectedCheckpoints: number; + }; + + let gaugeData: GaugeData; + + before('run task', async () => { + task = new Task('20230915-stakeless-gauge-checkpointer-v2', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + stakelessGaugeCheckpointer = await task.deployedInstance('StakelessGaugeCheckpointer'); + }); + + before('setup governance', async () => { + daoMultisig = await impersonate(DAO_MULTISIG, fp(100)); + admin = await impersonate(CHECKPOINT_MULTISIG, fp(100)); + }); + + before('setup contracts', async () => { + const authorizerTask = new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizer = await authorizerTask.deployedInstance('Authorizer'); + + const adaptorEntrypointTask = new Task( + '20221124-authorizer-adaptor-entrypoint', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ); + adaptorEntrypoint = await adaptorEntrypointTask.deployedInstance('AuthorizerAdaptorEntrypoint'); + + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeController = await gaugeControllerTask.deployedInstance('GaugeController'); + }); + + before('add gauge to checkpointer', async () => { + // This gauge was created by a previous factory, so we just add it via governance providing the right type. + await authorizer + .connect(daoMultisig) + .grantRole(await actionId(stakelessGaugeCheckpointer, 'addGaugesWithVerifiedType'), admin.address); + + await stakelessGaugeCheckpointer + .connect(admin) + .addGaugesWithVerifiedType(GaugeType[GaugeType.Arbitrum], [arbitrumRootGauge]); + }); + + before('grant checkpoint permission to gauge checkpointer', async () => { + // Any gauge works; we just need the interface. + const gauge = await task.instanceAt('IStakelessGauge', arbitrumRootGauge); + + await authorizer + .connect(daoMultisig) + .grantRole( + await adaptorEntrypoint.getActionId(gauge.interface.getSighash('checkpoint')), + stakelessGaugeCheckpointer.address + ); + }); + + before('check relative weight and store gauge data', async () => { + // Here we verify that we are effectively testing a corner case, and that the gauge can still be checkpointed. + // The gauge under test was created several weeks before the block specified in the fork test. + // It meets 3 conditions, explained below. + const currentWeek = await currentWeekTimestamp(); + const previousWeek = currentWeek.sub(WEEK); + const relativeWeightPreviousWeek = await gaugeController['gauge_relative_weight(address,uint256)']( + arbitrumRootGauge, + previousWeek + ); + // 1) The weight of the gauge in the previous week is non-zero, and greater than a given threshold. + expect(relativeWeightPreviousWeek).to.be.gte(WEIGHT_THRESHOLD); + + // 2) The gauge is not up to date in the controller. + const latestCheckpointedTime = await gaugeController.time_weight(arbitrumRootGauge); + expect(latestCheckpointedTime).to.be.lt(currentWeek); + + // 3) The weight at the current week is 0. + const relativeWeightNow = await gaugeController['gauge_relative_weight(address)'](arbitrumRootGauge); + expect(relativeWeightNow).to.be.eq(0); + + gaugeData = { + address: arbitrumRootGauge, + weight: relativeWeightPreviousWeek, + expectedCheckpoints, + }; + }); + + it('checks that gauges were added correctly', async () => { + expect(await stakelessGaugeCheckpointer.getTotalGauges(GaugeType[GaugeType.Arbitrum])).to.be.eq(1); + }); + + describe('checkpoint', () => { + sharedBeforeEach(async () => { + // Gauges that are above a threshold will get another checkpoint attempt when the threshold is lowered. + // This block takes a snapshot so that gauges can be repeatedly checkpointed without skipping. + }); + + context('when threshold is above gauge weight', () => { + const minRelativeWeight = WEIGHT_THRESHOLD.mul(10); + + it('skips the gauge', async () => { + const tx = await stakelessGaugeCheckpointer.checkpointAllGaugesAboveRelativeWeight(minRelativeWeight, { + value: await stakelessGaugeCheckpointer.getTotalBridgeCost(minRelativeWeight), + }); + + expectEvent.notEmitted(await tx.wait(), 'Checkpoint'); + }); + }); + + context('when threshold below gauge weight', () => { + const minRelativeWeight = WEIGHT_THRESHOLD; + + it('performs the checkpoint', async () => { + const tx = await stakelessGaugeCheckpointer.checkpointAllGaugesAboveRelativeWeight(minRelativeWeight, { + value: await stakelessGaugeCheckpointer.getTotalBridgeCost(minRelativeWeight), + }); + + expectEvent.inIndirectReceipt( + await tx.wait(), + checkpointInterface, + 'Checkpoint', + {}, + gaugeData.address, + gaugeData.expectedCheckpoints + ); + }); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/00000000-avax-tokens/output/avalanche.json b/balpy/balancer-deployments/tasks/deprecated/00000000-avax-tokens/output/avalanche.json new file mode 100644 index 0000000..c8dc1a9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/00000000-avax-tokens/output/avalanche.json @@ -0,0 +1,3 @@ +{ + "BAL": "0x8239a6b877804206c7799028232a7188da487cec" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/00000000-avax-tokens/readme.md b/balpy/balancer-deployments/tasks/deprecated/00000000-avax-tokens/readme.md new file mode 100644 index 0000000..6fce157 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/00000000-avax-tokens/readme.md @@ -0,0 +1,5 @@ +# Tokens + +This is not a real task, but rather a collection of token addresses that are useful so that they can be referenced in other tasks. The tokens included are WETH and BAL. + +Not all networks use ETH as their native token: in these, WETH really represents the wrapped native token. Examples include WMATIC in Polygon, WBNB in Binance and WXDAI in Gnosis. diff --git a/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/artifact/WeightedPool.json b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/artifact/WeightedPool.json new file mode 100644 index 0000000..0088dbf --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/artifact/WeightedPool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20[]", "name": "tokens", "type": "address[]"}, {"internalType": "uint256[]", "name": "normalizedWeights", "type": "uint256[]"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "address", "name": "owner", "type": "address"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "pure", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseApproval", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getInvariant", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getLastInvariant", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getNormalizedWeights", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "increaseApproval", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256", "name": "balanceTokenIn", "type": "uint256"}, {"internalType": "uint256", "name": "balanceTokenOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bool", "name": "paused", "type": "bool"}], "name": "setPaused", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/artifact/WeightedPool2Tokens.json b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/artifact/WeightedPool2Tokens.json new file mode 100644 index 0000000..c8cb04e --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/artifact/WeightedPool2Tokens.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"components": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20", "name": "token0", "type": "address"}, {"internalType": "contract IERC20", "name": "token1", "type": "address"}, {"internalType": "uint256", "name": "normalizedWeight0", "type": "uint256"}, {"internalType": "uint256", "name": "normalizedWeight1", "type": "uint256"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "bool", "name": "oracleEnabled", "type": "bool"}, {"internalType": "address", "name": "owner", "type": "address"}], "internalType": "struct WeightedPool2Tokens.NewPoolParams", "name": "params", "type": "tuple"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "enabled", "type": "bool"}], "name": "OracleEnabledChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "pure", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseApproval", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "enableOracle", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getInvariant", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getLargestSafeQueryWindow", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "pure", "type": "function"}, {"inputs": [], "name": "getLastInvariant", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "enum IPriceOracle.Variable", "name": "variable", "type": "uint8"}], "name": "getLatest", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMiscData", "outputs": [{"internalType": "int256", "name": "logInvariant", "type": "int256"}, {"internalType": "int256", "name": "logTotalSupply", "type": "int256"}, {"internalType": "uint256", "name": "oracleSampleCreationTimestamp", "type": "uint256"}, {"internalType": "uint256", "name": "oracleIndex", "type": "uint256"}, {"internalType": "bool", "name": "oracleEnabled", "type": "bool"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getNormalizedWeights", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IPriceOracle.Variable", "name": "variable", "type": "uint8"}, {"internalType": "uint256", "name": "ago", "type": "uint256"}], "internalType": "struct IPriceOracle.OracleAccumulatorQuery[]", "name": "queries", "type": "tuple[]"}], "name": "getPastAccumulators", "outputs": [{"internalType": "int256[]", "name": "results", "type": "int256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "index", "type": "uint256"}], "name": "getSample", "outputs": [{"internalType": "int256", "name": "logPairPrice", "type": "int256"}, {"internalType": "int256", "name": "accLogPairPrice", "type": "int256"}, {"internalType": "int256", "name": "logBptPrice", "type": "int256"}, {"internalType": "int256", "name": "accLogBptPrice", "type": "int256"}, {"internalType": "int256", "name": "logInvariant", "type": "int256"}, {"internalType": "int256", "name": "accLogInvariant", "type": "int256"}, {"internalType": "uint256", "name": "timestamp", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IPriceOracle.Variable", "name": "variable", "type": "uint8"}, {"internalType": "uint256", "name": "secs", "type": "uint256"}, {"internalType": "uint256", "name": "ago", "type": "uint256"}], "internalType": "struct IPriceOracle.OracleAverageQuery[]", "name": "queries", "type": "tuple[]"}], "name": "getTimeWeightedAverage", "outputs": [{"internalType": "uint256[]", "name": "results", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getTotalSamples", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "pure", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "increaseApproval", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "dueProtocolFeeAmounts", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256", "name": "balanceTokenIn", "type": "uint256"}, {"internalType": "uint256", "name": "balanceTokenOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bool", "name": "paused", "type": "bool"}], "name": "setPaused", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/artifact/WeightedPool2TokensFactory.json b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/artifact/WeightedPool2TokensFactory.json new file mode 100644 index 0000000..7eeac2e --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/artifact/WeightedPool2TokensFactory.json @@ -0,0 +1,134 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "WeightedPool2TokensFactory", + "sourceName": "contracts/pools/weighted/WeightedPool2TokensFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "weights", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "oracleEnabled", + "type": "bool" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60c060405234801561001057600080fd5b50604051615fe1380380615fe183398101604081905261002f9161004d565b60601b6001600160601b0319166080526276a700420160a05261007b565b60006020828403121561005e578081fd5b81516001600160a01b0381168114610074578182fd5b9392505050565b60805160601c60a051615f3b6100a660003980610221528061024b5250806102a75250615f3b6000f3fe60806040523480156200001157600080fd5b5060043610620000525760003560e01c80631596019b14620000575780632da47c4014620000865780636634b75314620000a05780638d928af814620000c6575b600080fd5b6200006e6200006836600462000548565b620000d0565b6040516200007d91906200068f565b60405180910390f35b620000906200021b565b6040516200007d929190620007a2565b620000b7620000b136600462000522565b62000287565b6040516200007d9190620006a3565b6200006e620002a5565b6000806000620000df6200021b565b91509150620000ed62000315565b60405180610180016040528062000103620002a5565b6001600160a01b031681526020018c81526020018b81526020018a6000815181106200012b57fe5b60200260200101516001600160a01b031681526020018a6001815181106200014f57fe5b60200260200101516001600160a01b03168152602001896000815181106200017357fe5b60200260200101518152602001896001815181106200018e57fe5b602002602001015181526020018881526020018481526020018381526020018715158152602001866001600160a01b03168152509050600081604051620001d5906200039c565b620001e19190620006ae565b604051809103906000f080158015620001fe573d6000803e3d6000fd5b5090506200020c81620002c9565b9b9a5050505050505050505050565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200027957807f000000000000000000000000000000000000000000000000000000000000000003925062278d00915062000282565b60009250600091505b509091565b6001600160a01b031660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b038116600081815260208190526040808220805460ff19166001179055517f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a250565b60405180610180016040528060006001600160a01b03168152602001606081526020016060815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815260200160006001600160a01b031681525090565b6156f3806200081383390190565b8035620003b781620007f9565b92915050565b600082601f830112620003ce578081fd5b8135620003e5620003df82620007d8565b620007b0565b8181529150602080830190848101818402860182018710156200040757600080fd5b60005b84811015620004335781356200042081620007f9565b845292820192908201906001016200040a565b505050505092915050565b600082601f8301126200044f578081fd5b813562000460620003df82620007d8565b8181529150602080830190848101818402860182018710156200048257600080fd5b60005b84811015620004335781358452928201929082019060010162000485565b80358015158114620003b757600080fd5b600082601f830112620004c5578081fd5b813567ffffffffffffffff811115620004dc578182fd5b620004f1601f8201601f1916602001620007b0565b91508082528360208285010111156200050957600080fd5b8060208401602084013760009082016020015292915050565b60006020828403121562000534578081fd5b81356200054181620007f9565b9392505050565b600080600080600080600060e0888a03121562000563578283fd5b873567ffffffffffffffff808211156200057b578485fd5b620005898b838c01620004b4565b985060208a01359150808211156200059f578485fd5b620005ad8b838c01620004b4565b975060408a0135915080821115620005c3578485fd5b620005d18b838c01620003bd565b965060608a0135915080821115620005e7578485fd5b50620005f68a828b016200043e565b945050608088013592506200060f8960a08a01620004a3565b9150620006208960c08a01620003aa565b905092959891949750929550565b6001600160a01b03169052565b15159052565b60008151808452815b8181101562000668576020818501810151868301820152016200064a565b818111156200067a5782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b901515815260200190565b600060208252620006c46020830184516200062e565b6020830151610180806040850152620006e26101a085018362000641565b91506040850151601f1985840301606086015262000701838262000641565b92505060608501516200071860808601826200062e565b5060808501516200072d60a08601826200062e565b5060a085015160c085015260c085015160e085015260e085015161010081818701528087015191505061012081818701528087015191505061014081818701528087015191505061016062000785818701836200063b565b860151905062000798858301826200062e565b5090949350505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715620007d057600080fd5b604052919050565b600067ffffffffffffffff821115620007ef578081fd5b5060209081020190565b6001600160a01b03811681146200080f57600080fd5b5056fe6102a06040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b50604051620056f3380380620056f38339810160408190526200005a916200080c565b61010081810151610120830151602080850151604080870151815180830190925260018252603160f81b8285019081526101608901513360805260601b6001600160601b03191660a052835194840194852060c052915190912060e0527f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f909552805193949293909291620000f391600391906200069f565b508051620001099060049060208401906200069f565b50620001219150506276a7008311156101946200040a565b6200013562278d008211156101956200040a565b4290910161014081815291016101605281015162000153906200041f565b60e081015162000163906200047b565b80516040516309b2760f60e01b81526000916001600160a01b0316906309b2760f90620001969060029060040162000a12565b602060405180830381600087803b158015620001b157600080fd5b505af1158015620001c6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ec9190620007f3565b6040805160028082526060808301845293945090916020830190803683370190505090508260600151816000815181106200022357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260800151816001815181106200025657fe5b6001600160a01b0392831660209182029290920101528351166366a9c7d283836002604051908082528060200260200182016040528015620002a2578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401620002c39392919062000976565b600060405180830381600087803b158015620002de57600080fd5b505af1158015620002f3573d6000803e3d6000fd5b505084516001600160601b0319606091821b8116610180526101a08690528187018051831b82166101c052608088015190921b166101e052516200033a92509050620004f9565b6102605260808301516200034e90620004f9565b6102805260a08301516200036f90662386f26fc10000111561012e6200040a565b62000391662386f26fc100008460c00151101561012e6200040a60201b60201c565b6000620003b58460c001518560a001516200059b60201b620011c61790919060201c565b9050620003cf670de0b6b3a764000082146101346200040a565b60a0840180516102005260c085018051610220525190511015620003f5576001620003f8565b60005b60ff16610240525062000a6392505050565b816200041b576200041b81620005b8565b5050565b6200043b816008546200060b60201b620011d81790919060201c565b6008556040517f3e350b41e86a8e10f804ade6d35340d620be35569cc75ac943e8bb14ab80ead190620004709083906200096b565b60405180910390a150565b6200049064e8d4a5100082101560cb6200040a565b620004a867016345785d8a000082111560ca6200040a565b620004c4816008546200062a60201b620011e61790919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906200047090839062000a27565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200053657600080fd5b505afa1580156200054b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000571919062000948565b60ff1690506000620005906012836200064960201b620011f41760201c565b600a0a949350505050565b6000828201620005af84821015836200040a565b90505b92915050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6000620005af826055856200066160201b6200120a179092919060201c565b6000620005af826056856200068a60201b62001231179092919060201c565b60006200065b8383111560016200040a565b50900390565b60006001821b1984168284620006795760006200067c565b60015b60ff16901b17949350505050565b6001600160401b03811b1992909216911b1790565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620006e257805160ff191683800117855562000712565b8280016001018555821562000712579182015b8281111562000712578251825591602001919060010190620006f5565b506200072092915062000724565b5090565b5b8082111562000720576000815560010162000725565b80516001600160a01b0381168114620005b257600080fd5b80518015158114620005b257600080fd5b600082601f83011262000775578081fd5b81516001600160401b038111156200078b578182fd5b6020620007a1601f8301601f1916820162000a30565b92508183528481838601011115620007b857600080fd5b60005b82811015620007d8578481018201518482018301528101620007bb565b82811115620007ea5760008284860101525b50505092915050565b60006020828403121562000805578081fd5b5051919050565b6000602082840312156200081e578081fd5b81516001600160401b038082111562000835578283fd5b81840191506101808083870312156200084c578384fd5b620008578162000a30565b90506200086586846200073b565b815260208301518281111562000879578485fd5b620008878782860162000764565b6020830152506040830151828111156200089f578485fd5b620008ad8782860162000764565b604083015250620008c286606085016200073b565b6060820152620008d686608085016200073b565b608082015260a0838101519082015260c0808401519082015260e08084015190820152610100808401519082015261012080840151908201526101409150620009228683850162000753565b82820152610160915062000939868385016200073b565b91810191909152949350505050565b6000602082840312156200095a578081fd5b815160ff81168114620005af578182fd5b901515815260200190565b60006060820185835260206060818501528186518084526080860191508288019350845b81811015620009c257620009af855162000a57565b835293830193918301916001016200099a565b505084810360408601528551808252908201925081860190845b8181101562000a0457620009f1835162000a57565b85529383019391830191600101620009dc565b509298975050505050505050565b602081016003831062000a2157fe5b91905290565b90815260200190565b6040518181016001600160401b038111828210171562000a4f57600080fd5b604052919050565b6001600160a01b031690565b60805160a05160601c60c05160e051610100516101205161014051610160516101805160601c6101a0516101c05160601c6101e05160601c6102005161022051610240516102605161028051614bb862000b3b60003980611d12525080611d395250806129e25280612a165280612a52525080611d665280611e02525080611d8d5280611de05280611e3052505080610c6a525080610808525080610bb852508061139d525080611379525080610f205250806116a55250806116e75250806116c6525080610b94525080610b1f5250614bb86000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c806374f3b0091161013b578063aaabadc5116100b8578063d5c096c41161007c578063d5c096c4146104e1578063d73dd623146104f4578063dd62ed3e14610507578063f89f27ed1461051a578063ffd088eb1461052257610248565b8063aaabadc5146104a3578063b10be739146104ab578063b48b5b40146104be578063c0ff1a15146104c6578063d505accf146104ce57610248565b80638d928af8116100ff5780638d928af81461046557806395d89b411461046d5780639b02cdde146104755780639d2c110c1461047d578063a9059cbb1461049057610248565b806374f3b009146103f65780637ecebe0014610417578063851c1bb31461042a57806387ec68171461043d578063893d20e81461045057610248565b806338e9922e116101c957806360d1507c1161018d57806360d1507c1461038257806366188463146103a8578063679aefce146103bb5780636b843239146103c357806370a08231146103e357610248565b806338e9922e1461032457806338fff2d0146103375780634a6b0b151461033f57806355c67628146103595780636028bfd41461036157610248565b80631dccd830116102105780631dccd830146102cc57806323b872dd146102ec578063292c914a146102ff578063313ce567146103075780633644e5151461031c57610248565b806306fdde031461024d578063095ea7b31461026b57806316c38b3c1461028b57806318160ddd146102a05780631c0de051146102b5575b600080fd5b61025561052a565b6040516102629190614a93565b60405180910390f35b61027e61027936600461423b565b6105c0565b6040516102629190614970565b61029e6102993660046144a9565b6105d7565b005b6102a86105eb565b6040516102629190614993565b6102bd6105f1565b6040516102629392919061497b565b6102df6102da3660046143ef565b61061a565b6040516102629190614938565b61027e6102fa366004614186565b610722565b61029e6107a5565b61030f6107d9565b6040516102629190614aff565b6102a86107de565b61029e61033236600461484b565b6107ed565b6102a8610806565b61034761082a565b60405161026296959493929190614a69565b6102a8610885565b61037461036f3660046144e1565b610892565b604051610262929190614ae6565b61039561039036600461484b565b6108c3565b6040516102629796959493929190614a39565b61027e6103b636600461423b565b61090c565b6102a8610966565b6103d66103d1366004614331565b61098b565b60405161026291906148f4565b6102a86103f1366004614132565b610a3c565b6104096104043660046144e1565b610a5b565b60405161026292919061494b565b6102a8610425366004614132565b610b00565b6102a86104383660046145dd565b610b1b565b61037461044b3660046144e1565b610b6d565b610458610b92565b60405161026291906148e0565b610458610bb6565b610255610bda565b6102a8610c3b565b6102a861048b366004614750565b610c41565b61027e61049e36600461423b565b610df0565b610458610dfd565b6102a86104b9366004614734565b610e07565b6102a8610e29565b6102a8610e2f565b61029e6104dc3660046141c6565b610eeb565b6104096104ef3660046144e1565b611034565b61027e61050236600461423b565b611154565b6102a861051536600461414e565b61118a565b6102df6111b5565b6102a86111bf565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105b65780601f1061058b576101008083540402835291602001916105b6565b820191906000526020600020905b81548152906001019060200180831161059957829003601f168201915b5050505050905090565b60006105cd338484611246565b5060015b92915050565b6105df6112ae565b6105e8816112dc565b50565b60025490565b60008060006105fe61135a565b159250610609611377565b915061061361139b565b9050909192565b606081516001600160401b038111801561063357600080fd5b5060405190808252806020026020018201604052801561065d578160200160208202803683370190505b509050600061066d6008546113bf565b9050610677613ffe565b60005b845181101561071a5784818151811061068f57fe5b602002602001015191506106ad82602001516000141561013c6113cc565b60006106c883600001518585602001518660400151016113de565b905060006106df84600001518686604001516113de565b90506106f98460200151838303816106f357fe5b05611524565b86848151811061070557fe5b6020908102919091010152505060010161067a565b505050919050565b6001600160a01b038316600081815260016020908152604080832033808552925282205491926107609114806107585750838210155b6101976113cc565b61076b858585611537565b336001600160a01b0386161480159061078657506000198114155b15610798576107988533858403611246565b60019150505b9392505050565b6107ad611606565b6107b56112ae565b6107bf6001611619565b60006107c96105eb565b11156107d7576107d7611659565b565b601290565b60006107e86116a1565b905090565b6107f56112ae565b6107fd611606565b6105e88161173e565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008060008060008060006008549050610843816117a7565b965061084e816117b3565b9550610859816117c0565b9450610864816113bf565b935061086f816117cd565b925061087a816117da565b915050909192939495565b60006107e86008546117da565b600060606108a2865160026117e7565b6108b7898989898989896117f46118ae61192c565b97509795505050505050565b60008060008060008060006108de610400891061013b6113cc565b60006108e989611a4b565b90506108f481611a5d565b959f949e50929c50909a509850965090945092505050565b3360009081526001602090815260408083206001600160a01b03861684529091528120548083106109485761094333856000611246565b61095c565b61095c338561095784876111f4565b611246565b5060019392505050565b60006107e86109736105eb565b61098561097e610e2f565b6002611ac0565b90611ae4565b606081516001600160401b03811180156109a457600080fd5b506040519080825280602002602001820160405280156109ce578160200160208202803683370190505b50905060006109de6008546113bf565b90506109e8614020565b60005b845181101561071a57848181518110610a0057fe5b60200260200101519150610a1d82600001518484602001516113de565b848281518110610a2957fe5b60209081029190910101526001016109eb565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610a85610a6a610bb6565b6001600160a01b0316336001600160a01b03161460cd6113cc565b610a9a610a90610806565b82146101f46113cc565b610aa387611b35565b6000606080610ab78d8d8d8d8d8d8d6117f4565b925092509250610ac78c84611b97565b610ad0826118ae565b610ad9816118ae565b610ae161135a565b15610aee57610aee611659565b909c909b509950505050505050505050565b6001600160a01b031660009081526005602052604090205490565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610b5092919061489d565b604051602081830303815290604052805190602001209050919050565b60006060610b7d865160026117e7565b6108b789898989898989611c2a611cab61192c565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105b65780601f1061058b576101008083540402835291602001916105b6565b60095490565b6000610c4b611606565b8360800151610c5b610a6a610bb6565b610c66610a90610806565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686602001516001600160a01b03161490506000610cae82611d09565b90506000610cbc8315611d09565b90506000610cc984611d5d565b90506000610cd78515611d5d565b9050610ce38985611db1565b9850610cef8884611db1565b9750610d188a60a0015186610d045789610d06565b8a5b87610d11578b610d13565b8a5b611dbd565b60008a516001811115610d2757fe5b1415610d95576000610d45610d3a610885565b60608d015190611ec3565b9050610d67610d61828d606001516111f490919063ffffffff16565b86611db1565b60608c01526000610d7b8c8c8c8787611f07565b9050610d878186611f26565b985050505050505050610de8565b610da38a6060015184611db1565b60608b01526000610db78b8b8b8686611f32565b9050610dc38186611f45565b9050610ddf610dd8610dd3610885565b611f51565b8290611f77565b97505050505050505b509392505050565b60006105cd338484611537565b60006107e8611fb9565b600080610e1e83610e196008546113bf565b612033565b905061079e81611524565b61040090565b60006060610e3b610bb6565b6001600160a01b031663f94d4668610e51610806565b6040518263ffffffff1660e01b8152600401610e6d9190614993565b60006040518083038186803b158015610e8557600080fd5b505afa158015610e99573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ec19190810190614266565b50915050610ece81611b35565b6060610ed861206a565b9050610ee481836120d8565b9250505090565b610ef98442111560d16113cc565b6001600160a01b0387166000908152600560209081526040808320549051909291610f50917f0000000000000000000000000000000000000000000000000000000000000000918c918c918c9188918d91016149bb565b6040516020818303038152906040528051906020012090506000610f738261214a565b9050600060018288888860405160008152602001604052604051610f9a9493929190614a1b565b6020604051602081039080840390855afa158015610fbc573d6000803e3d6000fd5b5050604051601f1901519150610ffe90506001600160a01b03821615801590610ff657508b6001600160a01b0316826001600160a01b0316145b6101f86113cc565b6001600160a01b038b1660009081526005602052604090206001850190556110278b8b8b611246565b5050505050505050505050565b60608088611043610a6a610bb6565b61104e610a90610806565b611056611606565b60006110606105eb565b6110d0576110708b8b8b88612166565b94509050611085620f424082101560cc6113cc565b6110936000620f42406121ef565b6110a289620f424083036121ef565b6110ab84611cab565b604080516002808252606082018352909160208301908036833701905050925061113e565b6110d988611b35565b61110c87896000815181106110ea57fe5b60200260200101518a6001815181106110ff57fe5b6020026020010151611dbd565b61111b8b8b8b8b8b8b8b611c2a565b9095509350905061112c89826121ef565b61113584611cab565b61113e836118ae565b611146611659565b505097509795505050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916105cd91859061095790866111c6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60606107e861206a565b6201de2090565b600082820161079e84821015836113cc565b600061079e8383605561120a565b600061079e83836056611231565b60006112048383111560016113cc565b50900390565b60006001821b1984168284611220576000611223565b60015b60ff16901b17949350505050565b6001600160401b03811b1992909216911b1790565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906112a1908590614993565b60405180910390a3505050565b60006112c56000356001600160e01b031916610b1b565b90506105e86112d48233612285565b6101916113cc565b80156112fc576112f76112ed611377565b42106101936113cc565b611311565b61131161130761139b565b42106101a96113cc565b6006805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be649061134f908390614970565b60405180910390a150565b600061136461139b565b4211806107e857505060065460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006105d182604b612375565b816113da576113da8161237d565b5050565b60006113ef824210156101386113cc565b4282900360006113fe85611a4b565b9050600061140b826123d0565b905061141c600082116101396113cc565b8281116114485780830380611431848a6123dc565b0261143c848a612420565b0194505050505061079e565b600061145387612464565b9050600061146082611a4b565b9050600061146d826123d0565b905061147e600082116101396113cc565b61148d8682111561013a6113cc565b505060008061149c8684612471565b9150915060006114ab836123d0565b6114b4836123d0565b039050801561150c5760006114c9848d612420565b6114d3848e612420565b03905060006114e1856123d0565b8903905082818302816114f057fe5b056114fb868f612420565b01995050505050505050505061079e565b611516838c612420565b97505050505050505061079e565b60006105d1655af3107a40008302612524565b6001600160a01b03831660009081526020819052604090205461155f828210156101966113cc565b6115766001600160a01b03841615156101996113cc565b6001600160a01b038085166000908152602081905260408082208585039055918516815220546115a690836111c6565b6001600160a01b0380851660008181526020819052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115f8908690614993565b60405180910390a350505050565b6107d761161161135a565b6101926113cc565b60085461162690826111d8565b6008556040517f3e350b41e86a8e10f804ade6d35340d620be35569cc75ac943e8bb14ab80ead19061134f908390614970565b600854611665816117cd565b156105e85761167f611678600954612901565b8290612945565b905061169b61169461168f6105eb565b612901565b8290612952565b60085550565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061170e612960565b306040516020016117239594939291906149ef565b60405160208183030381529060405280519060200120905090565b61175164e8d4a5100082101560cb6113cc565b61176767016345785d8a000082111560ca6113cc565b60085461177490826111e6565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc9061134f908390614993565b60006105d18282612964565b60006105d1826016612964565b60006105d182602c61298b565b60006105d1826055612995565b60006105d182605661299f565b6113da81831460676113cc565b6000606080606061180361206a565b905061180d61135a565b156118555761182387896000815181106110ea57fe5b600061182f828a6120d8565b90506118408983600954848b6129ac565b925061184f89846111f4612a90565b50611876565b60408051600280825260608201835290916020830190803683370190505091505b611881888287612b22565b909450925061189388846111f4612a90565b61189d81896120d8565b600955509750975097945050505050565b6118d5816000815181106118be57fe5b60200260200101516118d06001611d09565b612b8f565b816000815181106118e257fe5b602002602001018181525050611910816001815181106118fe57fe5b60200260200101516118d06000611d09565b8160018151811061191d57fe5b60200260200101818152505050565b3330146119ea576000306001600160a01b03166000366040516119509291906148b5565b6000604051808303816000865af19150503d806000811461198d576040519150601f19603f3d011682016040523d82523d6000602084013e611992565b606091505b5050905080600081146119a157fe5b60046000803e6000516001600160e01b0319166343adbafb60e01b81146119cc573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b6119f386611b35565b60006060611a0a8b8b8b8b8b8b8b8b63ffffffff16565b5091509150611a1c818463ffffffff16565b8051601f1982018390526343adbafb603f1983015260200260231982016044820181fd5b505050505050505050565b60009081526007602052604090205490565b6000806000806000806000611a7188612baf565b9650611a7c88612bbc565b9550611a8788612bc9565b9450611a9288612bd6565b9350611a9d88612be3565b9250611aa888612bf0565b9150611ab3886123d0565b9050919395979092949650565b600082820261079e841580611add575083858381611ada57fe5b04145b60036113cc565b6000611af382151560046113cc565b82611b00575060006105d1565b670de0b6b3a764000083810290611b2390858381611b1a57fe5b041460056113cc565b828181611b2c57fe5b049150506105d1565b611b5c81600081518110611b4557fe5b6020026020010151611b576001611d09565b611ac0565b81600081518110611b6957fe5b60200260200101818152505061191081600181518110611b8557fe5b6020026020010151611b576000611d09565b6001600160a01b038216600090815260208190526040902054611bbf828210156101966113cc565b6001600160a01b03831660009081526020819052604090208282039055600254611be990836111f4565b6002556040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906112a1908690614993565b60006060806060611c3961206a565b90506000611c47828a6120d8565b90506060611c5a8a84600954858c6129ac565b9050611c698a826111f4612a90565b60006060611c788c868b612bfd565b91509150611c898c826111c6612a90565b611c93858d6120d8565b600955909e909d50909b509950505050505050505050565b611cd281600081518110611cbb57fe5b6020026020010151611ccd6001611d09565b612c57565b81600081518110611cdf57fe5b60200260200101818152505061191081600181518110611cfb57fe5b6020026020010151611ccd60005b600081611d36577f00000000000000000000000000000000000000000000000000000000000000006105d1565b507f0000000000000000000000000000000000000000000000000000000000000000919050565b600081611d8a577f00000000000000000000000000000000000000000000000000000000000000006105d1565b507f0000000000000000000000000000000000000000000000000000000000000000919050565b600061079e8383611ac0565b600854611dc9816117cd565b8015611dd457508343115b15611ebd576000611e277f0000000000000000000000000000000000000000000000000000000000000000857f000000000000000000000000000000000000000000000000000000000000000086612c8a565b90506000611e5e7f000000000000000000000000000000000000000000000000000000000000000086611e59866117b3565b612cbf565b90506000611e6b846113bf565b90506000611e78856117c0565b90506000611e9182848787611e8c8b6117a7565b612cdb565b9050808314611a4057611ea48682612d32565b9550611eb08642612d40565b6008819055955050505050505b50505050565b6000828202611edd841580611add575083858381611ada57fe5b80611eec5760009150506105d1565b670de0b6b3a764000060001982015b046001019150506105d1565b6000611f1a858486858a60600151612d4e565b90505b95945050505050565b600061079e8383612b8f565b6000611f1a858486858a60600151612dc9565b600061079e8383612c57565b6000670de0b6b3a76400008210611f695760006105d1565b50670de0b6b3a76400000390565b6000611f8682151560046113cc565b82611f93575060006105d1565b670de0b6b3a764000083810290611fad90858381611b1a57fe5b826001820381611efb57fe5b6000611fc3610bb6565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015611ffb57600080fd5b505afa15801561200f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e89190614605565b60008061203f83611a4b565b9050612058600061204f836123d0565b116101396113cc565b61206281856123dc565b949350505050565b6040805160028082526060808301845292839291906020830190803683370190505090506120986001611d5d565b816000815181106120a557fe5b6020026020010181815250506120bb6000611d5d565b816001815181106120c857fe5b6020908102919091010152905090565b670de0b6b3a764000060005b835181101561213a576121306121298583815181106120ff57fe5b602002602001015185848151811061211357fe5b6020026020010151612e3f90919063ffffffff16565b8390612e8e565b91506001016120e4565b506105d1600082116101376113cc565b60006121546116a1565b82604051602001610b509291906148c5565b60006060600061217584612eba565b9050612190600082600281111561218857fe5b1460ce6113cc565b606061219b85612ed0565b90506121a9815160026117e7565b6121b281611b35565b60606121bc61206a565b905060006121ca82846120d8565b905060006121d9826002611ac0565b6009929092555099919850909650505050505050565b6001600160a01b03821660009081526020819052604090205461221290826111c6565b6001600160a01b03831660009081526020819052604090205560025461223890826111c6565b6002556040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612279908590614993565b60405180910390a35050565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6122a4610b92565b6001600160a01b0316141580156122bf57506122bf83612ee6565b156122e7576122cc610b92565b6001600160a01b0316336001600160a01b03161490506105d1565b6122ef611fb9565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161231e9392919061499c565b60206040518083038186803b15801561233657600080fd5b505afa15801561234a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236e91906144c5565b90506105d1565b1c6103ff1690565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b60006105d1828261298b565b6000808260028111156123eb57fe5b14156123fa5761236e83612baf565b600182600281111561240857fe5b14156124175761236e83612bc9565b61236e83612be3565b60008082600281111561242f57fe5b141561243e5761236e83612bbc565b600182600281111561244c57fe5b141561245b5761236e83612bd6565b61236e83612bf0565b60006105d1826001612f00565b600080806103ff8180805b8385116124e857600285850104612493818a612f00565b935061249e84611a4b565b92506124a9836123d0565b9150898210156124be578060010195506124e2565b898211156124d1576001810394506124e2565b82839750975050505050505061251d565b5061247c565b888110612506576125006124fb84612f11565b611a4b565b82612513565b816125136124fb85612464565b9650965050505050505b9250929050565b6000612553680238fd42c5cf03ffff19831215801561254c575068070c1cc73b00c800008313155b60096113cc565b60008212156125865761256882600003612524565b6a0c097ce7bc90715b34b9f160241b8161257e57fe5b059050610a56565b60006806f05b59d3b200000083126125c657506806f05b59d3b1ffffff1990910190770195e54c5dd42177f53a27172fa9ec6302628270000000006125fc565b6803782dace9d900000083126125f857506803782dace9d8ffffff19909101906b1425982cf597cd205cef73806125fc565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac62000000841261264c5768ad78ebc5ac61ffffff199093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d6310000008412612688576856bc75e2d630ffffff199093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b1880000084126126c257682b5e3af16b187fffff199093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c40000084126126fc576815af1d78b58c3fffff199093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac6200000841261273557680ad78ebc5ac61fffff199093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d63100000841261276e5768056bc75e2d630fffff199093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b188000084126127a7576802b5e3af16b187ffff199093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c4000084126127e05768015af1d78b58c3ffff199093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b60008061290d83612f1e565b9050655af3107a40006000821361292c57652d79883d20008203612936565b652d79883d200082015b8161293d57fe5b059392505050565b600061079e838383612f7a565b600061079e83836016612f7a565b4690565b600082821c623fffff16621fffff811361297e5780612062565b623fffff19179392505050565b1c637fffffff1690565b1c60019081161490565b1c6001600160401b031690565b604080516002808252606080830184529283929190602083019080368337019050509050826129dc579050611f1d565b612a4f877f000000000000000000000000000000000000000000000000000000000000000081518110612a0b57fe5b6020026020010151877f000000000000000000000000000000000000000000000000000000000000000081518110612a3f57fe5b6020026020010151878787612f91565b817f000000000000000000000000000000000000000000000000000000000000000081518110612a7b57fe5b60209081029190910101529695505050505050565b612ac683600081518110612aa057fe5b602002602001015183600081518110612ab557fe5b60200260200101518363ffffffff16565b83600081518110612ad357fe5b602002602001018181525050612b0483600181518110612aef57fe5b602002602001015183600181518110612ab557fe5b83600181518110612b1157fe5b602002602001018181525050505050565b600060606000612b3184612eba565b90506000816002811115612b4157fe5b1415612b5c57612b52868686613009565b9250925050612b87565b6001816002811115612b6a57fe5b1415612b7a57612b5286856130b9565b612b528686866130eb565b505b935093915050565b6000612b9e82151560046113cc565b818381612ba757fe5b049392505050565b60006105d18260ea612964565b60006105d18260b5613157565b60006105d182609f612964565b60006105d182606a613157565b60006105d1826054612964565b60006105d182601f613157565b600060606000612c0c84612eba565b90506001816002811115612c1c57fe5b1415612c2d57612b5286868661318a565b6002816002811115612c3b57fe5b1415612c4c57612b528686866131e0565b612b8561013661237d565b6000612c6682151560046113cc565b82612c73575060006105d1565b816001840381612c7f57fe5b0460010190506105d1565b600080612caa612c9a8486611f77565b612ca48789611f77565b90611f77565b9050612cb581612901565b9695505050505050565b600080612ccf61168f8587611f77565b92909203949350505050565b600080612cf785858542612cee8b611a4b565b93929190613263565b9050607842889003101580612d0c5786612d15565b612d1587612464565b600081815260076020526040902092909255509695505050505050565b600061079e8383604b6132b5565b600061079e8383602c6132c5565b6000612d70612d6587670429d069189e0000612e8e565b8311156101306113cc565b6000612d7c87846111c6565b90506000612d8a8883611f77565b90506000612d988887611ae4565b90506000612da683836132d7565b9050612dbb612db482611f51565b8990612e8e565b9a9950505050505050505050565b6000612deb612de085670429d069189e0000612e8e565b8311156101316113cc565b6000612e01612dfa86856111f4565b8690611f77565b90506000612e0f8588611f77565b90506000612e1d83836132d7565b90506000612e3382670de0b6b3a76400006111f4565b9050612dbb8a82611ec3565b600080612e4c8484613303565b90506000612e66612e5f83612710611ec3565b60016111c6565b905080821015612e7b576000925050506105d1565b612e8582826111f4565b925050506105d1565b6000828202612ea8841580611add575083858381611ada57fe5b670de0b6b3a764000090049392505050565b6000818060200190518101906105d19190614621565b60608180602001905181019061079e91906146e6565b6000612ef8631c74c91760e11b610b1b565b909114919050565b60006104008383015b069392505050565b60006105d1826001613404565b6000612f2e6000831360646113cc565b670c7d713b49da000082138015612f4c5750670f43fc2c04ee000082125b15612f6a57670de0b6b3a7640000612f6383613413565b8161257e57fe5b612f7382613531565b9050610a56565b623fffff828116821b90821b198416179392505050565b6000838311612fa257506000611f1d565b6000612fae8585611f77565b90506000612fc4670de0b6b3a764000088611ae4565b9050612fd8826709b6e64a8ec600006138d0565b91506000612fe683836132d7565b90506000612ffd612ff683611f51565b8b90612e8e565b9050612dbb8187612e8e565b60006060613015611606565b600080613021856138e7565b915091506130336002821060646113cc565b604080516002808252606080830184529260208301908036833701905050905061309488838151811061306257fe5b602002602001015188848151811061307657fe5b6020026020010151856130876105eb565b61308f610885565b613909565b8183815181106130a057fe5b6020908102919091010152919791965090945050505050565b6000606060006130c8846139c0565b905060606130de86836130d96105eb565b6139d6565b9196919550909350505050565b600060606130f7611606565b6060600061310485613a87565b91509150613114825160026117e7565b61311d82611b35565b600061313a88888561312d6105eb565b613135610885565b613a9f565b905061314a8282111560cf6113cc565b9791965090945050505050565b600082821c661fffffffffffff16660fffffffffffff81136131795780612062565b661fffffffffffff19179392505050565b6000606080600061319a85613a87565b915091506131aa825160026117e7565b6131b382611b35565b60006131d08888856131c36105eb565b6131cb610885565b613cca565b905061314a8282101560d06113cc565b600060606000806131f0856138e7565b915091506132026002821060646113cc565b604080516002808252606080830184529260208301908036833701905050905061309488838151811061323157fe5b602002602001015188848151811061324557fe5b6020026020010151856132566105eb565b61325e610885565b613eda565b60008061326f876123d0565b83039050600081870261328189612bbc565b01905060008287026132928a612bd6565b01905060008387026132a38b612bf0565b019050612dbb89848a858b868c613f7c565b6103ff811b1992909216911b1790565b637fffffff811b1992909216911b1790565b6000806132e48484613303565b905060006132f7612e5f83612710611ec3565b9050611f1d82826111c6565b6000816133195750670de0b6b3a76400006105d1565b82613326575060006105d1565b613337600160ff1b841060066113cc565b8261335d770bce5086492111aea88f4bb1ca6bcf584181ea8059f76532841060076113cc565b826000670c7d713b49da00008313801561337e5750670f43fc2c04ee000083125b156133b557600061338e84613413565b9050670de0b6b3a764000080820784020583670de0b6b3a7640000830502019150506133c3565b816133bf84613531565b0290505b670de0b6b3a764000090056133fb680238fd42c5cf03ffff1982128015906133f4575068070c1cc73b00c800008213155b60086113cc565b612cb581612524565b60006104008284038101612f09565b670de0b6b3a7640000026000806a0c097ce7bc90715b34b9f160241b808401906ec097ce7bc90715b34b9f0fffffffff198501028161344e57fe5b05905060006a0c097ce7bc90715b34b9f160241b82800205905081806a0c097ce7bc90715b34b9f160241b81840205915060038205016a0c097ce7bc90715b34b9f160241b82840205915060058205016a0c097ce7bc90715b34b9f160241b82840205915060078205016a0c097ce7bc90715b34b9f160241b82840205915060098205016a0c097ce7bc90715b34b9f160241b828402059150600b8205016a0c097ce7bc90715b34b9f160241b828402059150600d8205016a0c097ce7bc90715b34b9f160241b828402059150600f826002919005919091010295945050505050565b6000670de0b6b3a764000082121561356d57613563826a0c097ce7bc90715b34b9f160241b8161355d57fe5b05613531565b6000039050610a56565b60007e1600ef3172e58d2e933ec884fde10064c63b5372d805e203c000000000000083126135be57770195e54c5dd42177f53a27172fa9ec630262827000000000830592506806f05b59d3b2000000015b73011798004d755d3c8bc8e03204cf44619e00000083126135f6576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff0084000831261363e576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a7008312613679576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf85083126136b057693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e283126136e757690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d03831261371c5768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb41746121110831261374757680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d831261377c576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f177578893793783126137b1576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b28660383126137e5576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac8312613819576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b600068056bc75e2d63100000840168056bc75e2d63100000808603028161383c57fe5b059050600068056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b6000818310156138e0578161079e565b5090919050565b600080828060200190518101906138fe91906146b0565b909590945092505050565b60008061391a84612ca481886111f4565b90506139336709b6e64a8ec600008210156101326113cc565b600061395161394a670de0b6b3a764000089611ae4565b83906132d7565b9050600061396861396183611f51565b8a90612e8e565b9050600061397589611f51565b905060006139838383611ec3565b9050600061399184836111f4565b90506139b06139a96139a28a611f51565b8490612e8e565b82906111c6565b9c9b505050505050505050505050565b60008180602001905181019061079e9190614683565b606060006139e48484611ae4565b9050606085516001600160401b03811180156139ff57600080fd5b50604051908082528060200260200182016040528015613a29578160200160208202803683370190505b50905060005b8651811015613a7d57613a5e83888381518110613a4857fe5b6020026020010151612e8e90919063ffffffff16565b828281518110613a6a57fe5b6020908102919091010152600101613a2f565b5095945050505050565b60606000828060200190518101906138fe919061463d565b6000606084516001600160401b0381118015613aba57600080fd5b50604051908082528060200260200182016040528015613ae4578160200160208202803683370190505b5090506000805b8851811015613ba957613b44898281518110613b0357fe5b6020026020010151612ca4898481518110613b1a57fe5b60200260200101518c8581518110613b2e57fe5b60200260200101516111f490919063ffffffff16565b838281518110613b5057fe5b602002602001018181525050613b9f613b98898381518110613b6e57fe5b6020026020010151858481518110613b8257fe5b6020026020010151611ec390919063ffffffff16565b83906111c6565b9150600101613aeb565b50670de0b6b3a764000060005b8951811015613ca9576000848281518110613bcd57fe5b6020026020010151841115613c2b576000613bf6613bea86611f51565b8d8581518110613a4857fe5b90506000613c0a828c8681518110613b2e57fe5b9050613c22613b98613c1b8b611f51565b8390611f77565b92505050613c42565b888281518110613c3757fe5b602002602001015190505b6000613c6b8c8481518110613c5357fe5b6020026020010151610985848f8781518110613b2e57fe5b9050613c9d613c968c8581518110613c7f57fe5b602002602001015183612e3f90919063ffffffff16565b8590612e8e565b93505050600101613bb6565b50613cbd613cb682611f51565b8790611ec3565b9998505050505050505050565b6000606084516001600160401b0381118015613ce557600080fd5b50604051908082528060200260200182016040528015613d0f578160200160208202803683370190505b5090506000805b8851811015613db757613d6f898281518110613d2e57fe5b6020026020010151610985898481518110613d4557fe5b60200260200101518c8581518110613d5957fe5b60200260200101516111c690919063ffffffff16565b838281518110613d7b57fe5b602002602001018181525050613dad613b98898381518110613d9957fe5b6020026020010151858481518110613a4857fe5b9150600101613d16565b50670de0b6b3a764000060005b8951811015613e9857600083858381518110613ddc57fe5b60200260200101511115613e38576000613e01613bea86670de0b6b3a76400006111f4565b90506000613e15828c8681518110613b2e57fe5b9050613e2f613b98612129670de0b6b3a76400008c6111f4565b92505050613e4f565b888281518110613e4457fe5b602002602001015190505b6000613e788c8481518110613e6057fe5b6020026020010151610985848f8781518110613d5957fe5b9050613e8c613c968c8581518110613c7f57fe5b93505050600101613dc4565b50670de0b6b3a76400008110613ece57613ec4613ebd82670de0b6b3a76400006111f4565b8790612e8e565b9350505050611f1d565b60009350505050611f1d565b600080613eeb84612ca481886111c6565b9050613f046729a2241af62c00008211156101336113cc565b6000613f1b61394a670de0b6b3a764000089611f77565b90506000613f3b613f3483670de0b6b3a76400006111f4565b8a90611ec3565b90506000613f4889611f51565b90506000613f568383611ec3565b90506000613f6484836111f4565b90506139b06139a9613f758a611f51565b8490611f77565b6000613f888282613fdc565b613f9384601f613fe0565b613f9e866054613ff1565b613fa988606a613fe0565b613fb48a609f613ff1565b613fbf8c60b5613fe0565b613fca8e60ea613ff1565b17171717171798975050505050505050565b1b90565b661fffffffffffff91909116901b90565b623fffff91909116901b90565b6040805160608101909152806000815260200160008152602001600081525090565b604080518082019091526000808252602082015290565b80356105d181614b52565b600082601f830112614052578081fd5b815161406561406082614b33565b614b0d565b81815291506020808301908481018184028601820187101561408657600080fd5b60005b848110156140a557815184529282019290820190600101614089565b505050505092915050565b600082601f8301126140c0578081fd5b81356001600160401b038111156140d5578182fd5b6140e8601f8201601f1916602001614b0d565b91508082528360208285010111156140ff57600080fd5b8060208401602084013760009082016020015292915050565b8035600281106105d157600080fd5b80356105d181614b75565b600060208284031215614143578081fd5b813561079e81614b52565b60008060408385031215614160578081fd5b823561416b81614b52565b9150602083013561417b81614b52565b809150509250929050565b60008060006060848603121561419a578081fd5b83356141a581614b52565b925060208401356141b581614b52565b929592945050506040919091013590565b600080600080600080600060e0888a0312156141e0578485fd5b87356141eb81614b52565b965060208801356141fb81614b52565b95506040880135945060608801359350608088013560ff8116811461421e578384fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561424d578182fd5b823561425881614b52565b946020939093013593505050565b60008060006060848603121561427a578081fd5b83516001600160401b0380821115614290578283fd5b818601915086601f8301126142a3578283fd5b81516142b161406082614b33565b80828252602080830192508086018b8283870289010111156142d1578788fd5b8796505b848710156142fc5780516142e881614b52565b8452600196909601959281019281016142d5565b508901519097509350505080821115614313578283fd5b5061432086828701614042565b925050604084015190509250925092565b60006020808385031215614343578182fd5b82356001600160401b03811115614358578283fd5b8301601f81018513614368578283fd5b803561437661406082614b33565b818152838101908385016040808502860187018a1015614394578788fd5b8795505b848610156143e15780828b0312156143ae578788fd5b6143b781614b0d565b6143c18b84614127565b815282880135888201528452600195909501949286019290810190614398565b509098975050505050505050565b60006020808385031215614401578182fd5b82356001600160401b03811115614416578283fd5b8301601f81018513614426578283fd5b803561443461406082614b33565b818152838101908385016060808502860187018a1015614452578788fd5b8795505b848610156143e15780828b03121561446c578788fd5b61447581614b0d565b61447f8b84614127565b81528288013588820152604080840135908201528452600195909501949286019290810190614456565b6000602082840312156144ba578081fd5b813561079e81614b67565b6000602082840312156144d6578081fd5b815161079e81614b67565b600080600080600080600060e0888a0312156144fb578081fd5b8735965060208089013561450e81614b52565b9650604089013561451e81614b52565b955060608901356001600160401b0380821115614539578384fd5b818b0191508b601f83011261454c578384fd5b813561455a61406082614b33565b8082825285820191508585018f878886028801011115614578578788fd5b8795505b8386101561459a57803583526001959095019491860191860161457c565b509850505060808b0135955060a08b0135945060c08b01359250808311156145c0578384fd5b50506145ce8a828b016140b0565b91505092959891949750929550565b6000602082840312156145ee578081fd5b81356001600160e01b03198116811461079e578182fd5b600060208284031215614616578081fd5b815161079e81614b52565b600060208284031215614632578081fd5b815161079e81614b75565b600080600060608486031215614651578081fd5b835161465c81614b75565b60208501519093506001600160401b03811115614677578182fd5b61432086828701614042565b60008060408385031215614695578182fd5b82516146a081614b75565b6020939093015192949293505050565b6000806000606084860312156146c4578081fd5b83516146cf81614b75565b602085015160409095015190969495509392505050565b600080604083850312156146f8578182fd5b825161470381614b75565b60208401519092506001600160401b0381111561471e578182fd5b61472a85828601614042565b9150509250929050565b600060208284031215614745578081fd5b813561079e81614b75565b600080600060608486031215614764578081fd5b83356001600160401b038082111561477a578283fd5b8186019150610120808389031215614790578384fd5b61479981614b0d565b90506147a58884614118565b81526147b48860208501614037565b60208201526147c68860408501614037565b6040820152606083013560608201526080830135608082015260a083013560a08201526147f68860c08501614037565b60c08201526148088860e08501614037565b60e08201526101008084013583811115614820578586fd5b61482c8a8287016140b0565b9183019190915250976020870135975060409096013595945050505050565b60006020828403121561485c578081fd5b5035919050565b6000815180845260208085019450808401835b8381101561489257815187529582019590820190600101614876565b509495945050505050565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b8181101561492c57835183529284019291840191600101614910565b50909695505050505050565b60006020825261079e6020830184614863565b60006040825261495e6040830185614863565b8281036020840152611f1d8185614863565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b93845260ff9290921660208401526040830152606082015260800190565b968752602087019590955260408601939093526060850191909152608084015260a083015260c082015260e00190565b9586526020860194909452604085019290925260608401521515608083015260a082015260c00190565b6000602080835283518082850152825b81811015614abf57858101830151858201604001528201614aa3565b81811115614ad05783604083870101525b50601f01601f1916929092016040019392505050565b6000838252604060208301526120626040830184614863565b60ff91909116815260200190565b6040518181016001600160401b0381118282101715614b2b57600080fd5b604052919050565b60006001600160401b03821115614b48578081fd5b5060209081020190565b6001600160a01b03811681146105e857600080fd5b80151581146105e857600080fd5b600381106105e857600080fdfea26469706673582212201dbf8d364d926088a19c5f3f5d0ca0ab72cf3eda8f3f78dda45ab2619de4b6d664736f6c63430007010033a264697066735822122062c63a2c3089490a939fe9f20e0e99ef310f04a393c33a92c66f45a3b2cea18064736f6c63430007010033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000525760003560e01c80631596019b14620000575780632da47c4014620000865780636634b75314620000a05780638d928af814620000c6575b600080fd5b6200006e6200006836600462000548565b620000d0565b6040516200007d91906200068f565b60405180910390f35b620000906200021b565b6040516200007d929190620007a2565b620000b7620000b136600462000522565b62000287565b6040516200007d9190620006a3565b6200006e620002a5565b6000806000620000df6200021b565b91509150620000ed62000315565b60405180610180016040528062000103620002a5565b6001600160a01b031681526020018c81526020018b81526020018a6000815181106200012b57fe5b60200260200101516001600160a01b031681526020018a6001815181106200014f57fe5b60200260200101516001600160a01b03168152602001896000815181106200017357fe5b60200260200101518152602001896001815181106200018e57fe5b602002602001015181526020018881526020018481526020018381526020018715158152602001866001600160a01b03168152509050600081604051620001d5906200039c565b620001e19190620006ae565b604051809103906000f080158015620001fe573d6000803e3d6000fd5b5090506200020c81620002c9565b9b9a5050505050505050505050565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200027957807f000000000000000000000000000000000000000000000000000000000000000003925062278d00915062000282565b60009250600091505b509091565b6001600160a01b031660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b038116600081815260208190526040808220805460ff19166001179055517f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a250565b60405180610180016040528060006001600160a01b03168152602001606081526020016060815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815260200160006001600160a01b031681525090565b6156f3806200081383390190565b8035620003b781620007f9565b92915050565b600082601f830112620003ce578081fd5b8135620003e5620003df82620007d8565b620007b0565b8181529150602080830190848101818402860182018710156200040757600080fd5b60005b84811015620004335781356200042081620007f9565b845292820192908201906001016200040a565b505050505092915050565b600082601f8301126200044f578081fd5b813562000460620003df82620007d8565b8181529150602080830190848101818402860182018710156200048257600080fd5b60005b84811015620004335781358452928201929082019060010162000485565b80358015158114620003b757600080fd5b600082601f830112620004c5578081fd5b813567ffffffffffffffff811115620004dc578182fd5b620004f1601f8201601f1916602001620007b0565b91508082528360208285010111156200050957600080fd5b8060208401602084013760009082016020015292915050565b60006020828403121562000534578081fd5b81356200054181620007f9565b9392505050565b600080600080600080600060e0888a03121562000563578283fd5b873567ffffffffffffffff808211156200057b578485fd5b620005898b838c01620004b4565b985060208a01359150808211156200059f578485fd5b620005ad8b838c01620004b4565b975060408a0135915080821115620005c3578485fd5b620005d18b838c01620003bd565b965060608a0135915080821115620005e7578485fd5b50620005f68a828b016200043e565b945050608088013592506200060f8960a08a01620004a3565b9150620006208960c08a01620003aa565b905092959891949750929550565b6001600160a01b03169052565b15159052565b60008151808452815b8181101562000668576020818501810151868301820152016200064a565b818111156200067a5782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b901515815260200190565b600060208252620006c46020830184516200062e565b6020830151610180806040850152620006e26101a085018362000641565b91506040850151601f1985840301606086015262000701838262000641565b92505060608501516200071860808601826200062e565b5060808501516200072d60a08601826200062e565b5060a085015160c085015260c085015160e085015260e085015161010081818701528087015191505061012081818701528087015191505061014081818701528087015191505061016062000785818701836200063b565b860151905062000798858301826200062e565b5090949350505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715620007d057600080fd5b604052919050565b600067ffffffffffffffff821115620007ef578081fd5b5060209081020190565b6001600160a01b03811681146200080f57600080fd5b5056fe6102a06040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b50604051620056f3380380620056f38339810160408190526200005a916200080c565b61010081810151610120830151602080850151604080870151815180830190925260018252603160f81b8285019081526101608901513360805260601b6001600160601b03191660a052835194840194852060c052915190912060e0527f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f909552805193949293909291620000f391600391906200069f565b508051620001099060049060208401906200069f565b50620001219150506276a7008311156101946200040a565b6200013562278d008211156101956200040a565b4290910161014081815291016101605281015162000153906200041f565b60e081015162000163906200047b565b80516040516309b2760f60e01b81526000916001600160a01b0316906309b2760f90620001969060029060040162000a12565b602060405180830381600087803b158015620001b157600080fd5b505af1158015620001c6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ec9190620007f3565b6040805160028082526060808301845293945090916020830190803683370190505090508260600151816000815181106200022357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260800151816001815181106200025657fe5b6001600160a01b0392831660209182029290920101528351166366a9c7d283836002604051908082528060200260200182016040528015620002a2578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401620002c39392919062000976565b600060405180830381600087803b158015620002de57600080fd5b505af1158015620002f3573d6000803e3d6000fd5b505084516001600160601b0319606091821b8116610180526101a08690528187018051831b82166101c052608088015190921b166101e052516200033a92509050620004f9565b6102605260808301516200034e90620004f9565b6102805260a08301516200036f90662386f26fc10000111561012e6200040a565b62000391662386f26fc100008460c00151101561012e6200040a60201b60201c565b6000620003b58460c001518560a001516200059b60201b620011c61790919060201c565b9050620003cf670de0b6b3a764000082146101346200040a565b60a0840180516102005260c085018051610220525190511015620003f5576001620003f8565b60005b60ff16610240525062000a6392505050565b816200041b576200041b81620005b8565b5050565b6200043b816008546200060b60201b620011d81790919060201c565b6008556040517f3e350b41e86a8e10f804ade6d35340d620be35569cc75ac943e8bb14ab80ead190620004709083906200096b565b60405180910390a150565b6200049064e8d4a5100082101560cb6200040a565b620004a867016345785d8a000082111560ca6200040a565b620004c4816008546200062a60201b620011e61790919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906200047090839062000a27565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200053657600080fd5b505afa1580156200054b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000571919062000948565b60ff1690506000620005906012836200064960201b620011f41760201c565b600a0a949350505050565b6000828201620005af84821015836200040a565b90505b92915050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6000620005af826055856200066160201b6200120a179092919060201c565b6000620005af826056856200068a60201b62001231179092919060201c565b60006200065b8383111560016200040a565b50900390565b60006001821b1984168284620006795760006200067c565b60015b60ff16901b17949350505050565b6001600160401b03811b1992909216911b1790565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620006e257805160ff191683800117855562000712565b8280016001018555821562000712579182015b8281111562000712578251825591602001919060010190620006f5565b506200072092915062000724565b5090565b5b8082111562000720576000815560010162000725565b80516001600160a01b0381168114620005b257600080fd5b80518015158114620005b257600080fd5b600082601f83011262000775578081fd5b81516001600160401b038111156200078b578182fd5b6020620007a1601f8301601f1916820162000a30565b92508183528481838601011115620007b857600080fd5b60005b82811015620007d8578481018201518482018301528101620007bb565b82811115620007ea5760008284860101525b50505092915050565b60006020828403121562000805578081fd5b5051919050565b6000602082840312156200081e578081fd5b81516001600160401b038082111562000835578283fd5b81840191506101808083870312156200084c578384fd5b620008578162000a30565b90506200086586846200073b565b815260208301518281111562000879578485fd5b620008878782860162000764565b6020830152506040830151828111156200089f578485fd5b620008ad8782860162000764565b604083015250620008c286606085016200073b565b6060820152620008d686608085016200073b565b608082015260a0838101519082015260c0808401519082015260e08084015190820152610100808401519082015261012080840151908201526101409150620009228683850162000753565b82820152610160915062000939868385016200073b565b91810191909152949350505050565b6000602082840312156200095a578081fd5b815160ff81168114620005af578182fd5b901515815260200190565b60006060820185835260206060818501528186518084526080860191508288019350845b81811015620009c257620009af855162000a57565b835293830193918301916001016200099a565b505084810360408601528551808252908201925081860190845b8181101562000a0457620009f1835162000a57565b85529383019391830191600101620009dc565b509298975050505050505050565b602081016003831062000a2157fe5b91905290565b90815260200190565b6040518181016001600160401b038111828210171562000a4f57600080fd5b604052919050565b6001600160a01b031690565b60805160a05160601c60c05160e051610100516101205161014051610160516101805160601c6101a0516101c05160601c6101e05160601c6102005161022051610240516102605161028051614bb862000b3b60003980611d12525080611d395250806129e25280612a165280612a52525080611d665280611e02525080611d8d5280611de05280611e3052505080610c6a525080610808525080610bb852508061139d525080611379525080610f205250806116a55250806116e75250806116c6525080610b94525080610b1f5250614bb86000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c806374f3b0091161013b578063aaabadc5116100b8578063d5c096c41161007c578063d5c096c4146104e1578063d73dd623146104f4578063dd62ed3e14610507578063f89f27ed1461051a578063ffd088eb1461052257610248565b8063aaabadc5146104a3578063b10be739146104ab578063b48b5b40146104be578063c0ff1a15146104c6578063d505accf146104ce57610248565b80638d928af8116100ff5780638d928af81461046557806395d89b411461046d5780639b02cdde146104755780639d2c110c1461047d578063a9059cbb1461049057610248565b806374f3b009146103f65780637ecebe0014610417578063851c1bb31461042a57806387ec68171461043d578063893d20e81461045057610248565b806338e9922e116101c957806360d1507c1161018d57806360d1507c1461038257806366188463146103a8578063679aefce146103bb5780636b843239146103c357806370a08231146103e357610248565b806338e9922e1461032457806338fff2d0146103375780634a6b0b151461033f57806355c67628146103595780636028bfd41461036157610248565b80631dccd830116102105780631dccd830146102cc57806323b872dd146102ec578063292c914a146102ff578063313ce567146103075780633644e5151461031c57610248565b806306fdde031461024d578063095ea7b31461026b57806316c38b3c1461028b57806318160ddd146102a05780631c0de051146102b5575b600080fd5b61025561052a565b6040516102629190614a93565b60405180910390f35b61027e61027936600461423b565b6105c0565b6040516102629190614970565b61029e6102993660046144a9565b6105d7565b005b6102a86105eb565b6040516102629190614993565b6102bd6105f1565b6040516102629392919061497b565b6102df6102da3660046143ef565b61061a565b6040516102629190614938565b61027e6102fa366004614186565b610722565b61029e6107a5565b61030f6107d9565b6040516102629190614aff565b6102a86107de565b61029e61033236600461484b565b6107ed565b6102a8610806565b61034761082a565b60405161026296959493929190614a69565b6102a8610885565b61037461036f3660046144e1565b610892565b604051610262929190614ae6565b61039561039036600461484b565b6108c3565b6040516102629796959493929190614a39565b61027e6103b636600461423b565b61090c565b6102a8610966565b6103d66103d1366004614331565b61098b565b60405161026291906148f4565b6102a86103f1366004614132565b610a3c565b6104096104043660046144e1565b610a5b565b60405161026292919061494b565b6102a8610425366004614132565b610b00565b6102a86104383660046145dd565b610b1b565b61037461044b3660046144e1565b610b6d565b610458610b92565b60405161026291906148e0565b610458610bb6565b610255610bda565b6102a8610c3b565b6102a861048b366004614750565b610c41565b61027e61049e36600461423b565b610df0565b610458610dfd565b6102a86104b9366004614734565b610e07565b6102a8610e29565b6102a8610e2f565b61029e6104dc3660046141c6565b610eeb565b6104096104ef3660046144e1565b611034565b61027e61050236600461423b565b611154565b6102a861051536600461414e565b61118a565b6102df6111b5565b6102a86111bf565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105b65780601f1061058b576101008083540402835291602001916105b6565b820191906000526020600020905b81548152906001019060200180831161059957829003601f168201915b5050505050905090565b60006105cd338484611246565b5060015b92915050565b6105df6112ae565b6105e8816112dc565b50565b60025490565b60008060006105fe61135a565b159250610609611377565b915061061361139b565b9050909192565b606081516001600160401b038111801561063357600080fd5b5060405190808252806020026020018201604052801561065d578160200160208202803683370190505b509050600061066d6008546113bf565b9050610677613ffe565b60005b845181101561071a5784818151811061068f57fe5b602002602001015191506106ad82602001516000141561013c6113cc565b60006106c883600001518585602001518660400151016113de565b905060006106df84600001518686604001516113de565b90506106f98460200151838303816106f357fe5b05611524565b86848151811061070557fe5b6020908102919091010152505060010161067a565b505050919050565b6001600160a01b038316600081815260016020908152604080832033808552925282205491926107609114806107585750838210155b6101976113cc565b61076b858585611537565b336001600160a01b0386161480159061078657506000198114155b15610798576107988533858403611246565b60019150505b9392505050565b6107ad611606565b6107b56112ae565b6107bf6001611619565b60006107c96105eb565b11156107d7576107d7611659565b565b601290565b60006107e86116a1565b905090565b6107f56112ae565b6107fd611606565b6105e88161173e565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008060008060008060006008549050610843816117a7565b965061084e816117b3565b9550610859816117c0565b9450610864816113bf565b935061086f816117cd565b925061087a816117da565b915050909192939495565b60006107e86008546117da565b600060606108a2865160026117e7565b6108b7898989898989896117f46118ae61192c565b97509795505050505050565b60008060008060008060006108de610400891061013b6113cc565b60006108e989611a4b565b90506108f481611a5d565b959f949e50929c50909a509850965090945092505050565b3360009081526001602090815260408083206001600160a01b03861684529091528120548083106109485761094333856000611246565b61095c565b61095c338561095784876111f4565b611246565b5060019392505050565b60006107e86109736105eb565b61098561097e610e2f565b6002611ac0565b90611ae4565b606081516001600160401b03811180156109a457600080fd5b506040519080825280602002602001820160405280156109ce578160200160208202803683370190505b50905060006109de6008546113bf565b90506109e8614020565b60005b845181101561071a57848181518110610a0057fe5b60200260200101519150610a1d82600001518484602001516113de565b848281518110610a2957fe5b60209081029190910101526001016109eb565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610a85610a6a610bb6565b6001600160a01b0316336001600160a01b03161460cd6113cc565b610a9a610a90610806565b82146101f46113cc565b610aa387611b35565b6000606080610ab78d8d8d8d8d8d8d6117f4565b925092509250610ac78c84611b97565b610ad0826118ae565b610ad9816118ae565b610ae161135a565b15610aee57610aee611659565b909c909b509950505050505050505050565b6001600160a01b031660009081526005602052604090205490565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610b5092919061489d565b604051602081830303815290604052805190602001209050919050565b60006060610b7d865160026117e7565b6108b789898989898989611c2a611cab61192c565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105b65780601f1061058b576101008083540402835291602001916105b6565b60095490565b6000610c4b611606565b8360800151610c5b610a6a610bb6565b610c66610a90610806565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686602001516001600160a01b03161490506000610cae82611d09565b90506000610cbc8315611d09565b90506000610cc984611d5d565b90506000610cd78515611d5d565b9050610ce38985611db1565b9850610cef8884611db1565b9750610d188a60a0015186610d045789610d06565b8a5b87610d11578b610d13565b8a5b611dbd565b60008a516001811115610d2757fe5b1415610d95576000610d45610d3a610885565b60608d015190611ec3565b9050610d67610d61828d606001516111f490919063ffffffff16565b86611db1565b60608c01526000610d7b8c8c8c8787611f07565b9050610d878186611f26565b985050505050505050610de8565b610da38a6060015184611db1565b60608b01526000610db78b8b8b8686611f32565b9050610dc38186611f45565b9050610ddf610dd8610dd3610885565b611f51565b8290611f77565b97505050505050505b509392505050565b60006105cd338484611537565b60006107e8611fb9565b600080610e1e83610e196008546113bf565b612033565b905061079e81611524565b61040090565b60006060610e3b610bb6565b6001600160a01b031663f94d4668610e51610806565b6040518263ffffffff1660e01b8152600401610e6d9190614993565b60006040518083038186803b158015610e8557600080fd5b505afa158015610e99573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ec19190810190614266565b50915050610ece81611b35565b6060610ed861206a565b9050610ee481836120d8565b9250505090565b610ef98442111560d16113cc565b6001600160a01b0387166000908152600560209081526040808320549051909291610f50917f0000000000000000000000000000000000000000000000000000000000000000918c918c918c9188918d91016149bb565b6040516020818303038152906040528051906020012090506000610f738261214a565b9050600060018288888860405160008152602001604052604051610f9a9493929190614a1b565b6020604051602081039080840390855afa158015610fbc573d6000803e3d6000fd5b5050604051601f1901519150610ffe90506001600160a01b03821615801590610ff657508b6001600160a01b0316826001600160a01b0316145b6101f86113cc565b6001600160a01b038b1660009081526005602052604090206001850190556110278b8b8b611246565b5050505050505050505050565b60608088611043610a6a610bb6565b61104e610a90610806565b611056611606565b60006110606105eb565b6110d0576110708b8b8b88612166565b94509050611085620f424082101560cc6113cc565b6110936000620f42406121ef565b6110a289620f424083036121ef565b6110ab84611cab565b604080516002808252606082018352909160208301908036833701905050925061113e565b6110d988611b35565b61110c87896000815181106110ea57fe5b60200260200101518a6001815181106110ff57fe5b6020026020010151611dbd565b61111b8b8b8b8b8b8b8b611c2a565b9095509350905061112c89826121ef565b61113584611cab565b61113e836118ae565b611146611659565b505097509795505050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916105cd91859061095790866111c6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60606107e861206a565b6201de2090565b600082820161079e84821015836113cc565b600061079e8383605561120a565b600061079e83836056611231565b60006112048383111560016113cc565b50900390565b60006001821b1984168284611220576000611223565b60015b60ff16901b17949350505050565b6001600160401b03811b1992909216911b1790565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906112a1908590614993565b60405180910390a3505050565b60006112c56000356001600160e01b031916610b1b565b90506105e86112d48233612285565b6101916113cc565b80156112fc576112f76112ed611377565b42106101936113cc565b611311565b61131161130761139b565b42106101a96113cc565b6006805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be649061134f908390614970565b60405180910390a150565b600061136461139b565b4211806107e857505060065460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006105d182604b612375565b816113da576113da8161237d565b5050565b60006113ef824210156101386113cc565b4282900360006113fe85611a4b565b9050600061140b826123d0565b905061141c600082116101396113cc565b8281116114485780830380611431848a6123dc565b0261143c848a612420565b0194505050505061079e565b600061145387612464565b9050600061146082611a4b565b9050600061146d826123d0565b905061147e600082116101396113cc565b61148d8682111561013a6113cc565b505060008061149c8684612471565b9150915060006114ab836123d0565b6114b4836123d0565b039050801561150c5760006114c9848d612420565b6114d3848e612420565b03905060006114e1856123d0565b8903905082818302816114f057fe5b056114fb868f612420565b01995050505050505050505061079e565b611516838c612420565b97505050505050505061079e565b60006105d1655af3107a40008302612524565b6001600160a01b03831660009081526020819052604090205461155f828210156101966113cc565b6115766001600160a01b03841615156101996113cc565b6001600160a01b038085166000908152602081905260408082208585039055918516815220546115a690836111c6565b6001600160a01b0380851660008181526020819052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115f8908690614993565b60405180910390a350505050565b6107d761161161135a565b6101926113cc565b60085461162690826111d8565b6008556040517f3e350b41e86a8e10f804ade6d35340d620be35569cc75ac943e8bb14ab80ead19061134f908390614970565b600854611665816117cd565b156105e85761167f611678600954612901565b8290612945565b905061169b61169461168f6105eb565b612901565b8290612952565b60085550565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061170e612960565b306040516020016117239594939291906149ef565b60405160208183030381529060405280519060200120905090565b61175164e8d4a5100082101560cb6113cc565b61176767016345785d8a000082111560ca6113cc565b60085461177490826111e6565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc9061134f908390614993565b60006105d18282612964565b60006105d1826016612964565b60006105d182602c61298b565b60006105d1826055612995565b60006105d182605661299f565b6113da81831460676113cc565b6000606080606061180361206a565b905061180d61135a565b156118555761182387896000815181106110ea57fe5b600061182f828a6120d8565b90506118408983600954848b6129ac565b925061184f89846111f4612a90565b50611876565b60408051600280825260608201835290916020830190803683370190505091505b611881888287612b22565b909450925061189388846111f4612a90565b61189d81896120d8565b600955509750975097945050505050565b6118d5816000815181106118be57fe5b60200260200101516118d06001611d09565b612b8f565b816000815181106118e257fe5b602002602001018181525050611910816001815181106118fe57fe5b60200260200101516118d06000611d09565b8160018151811061191d57fe5b60200260200101818152505050565b3330146119ea576000306001600160a01b03166000366040516119509291906148b5565b6000604051808303816000865af19150503d806000811461198d576040519150601f19603f3d011682016040523d82523d6000602084013e611992565b606091505b5050905080600081146119a157fe5b60046000803e6000516001600160e01b0319166343adbafb60e01b81146119cc573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b6119f386611b35565b60006060611a0a8b8b8b8b8b8b8b8b63ffffffff16565b5091509150611a1c818463ffffffff16565b8051601f1982018390526343adbafb603f1983015260200260231982016044820181fd5b505050505050505050565b60009081526007602052604090205490565b6000806000806000806000611a7188612baf565b9650611a7c88612bbc565b9550611a8788612bc9565b9450611a9288612bd6565b9350611a9d88612be3565b9250611aa888612bf0565b9150611ab3886123d0565b9050919395979092949650565b600082820261079e841580611add575083858381611ada57fe5b04145b60036113cc565b6000611af382151560046113cc565b82611b00575060006105d1565b670de0b6b3a764000083810290611b2390858381611b1a57fe5b041460056113cc565b828181611b2c57fe5b049150506105d1565b611b5c81600081518110611b4557fe5b6020026020010151611b576001611d09565b611ac0565b81600081518110611b6957fe5b60200260200101818152505061191081600181518110611b8557fe5b6020026020010151611b576000611d09565b6001600160a01b038216600090815260208190526040902054611bbf828210156101966113cc565b6001600160a01b03831660009081526020819052604090208282039055600254611be990836111f4565b6002556040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906112a1908690614993565b60006060806060611c3961206a565b90506000611c47828a6120d8565b90506060611c5a8a84600954858c6129ac565b9050611c698a826111f4612a90565b60006060611c788c868b612bfd565b91509150611c898c826111c6612a90565b611c93858d6120d8565b600955909e909d50909b509950505050505050505050565b611cd281600081518110611cbb57fe5b6020026020010151611ccd6001611d09565b612c57565b81600081518110611cdf57fe5b60200260200101818152505061191081600181518110611cfb57fe5b6020026020010151611ccd60005b600081611d36577f00000000000000000000000000000000000000000000000000000000000000006105d1565b507f0000000000000000000000000000000000000000000000000000000000000000919050565b600081611d8a577f00000000000000000000000000000000000000000000000000000000000000006105d1565b507f0000000000000000000000000000000000000000000000000000000000000000919050565b600061079e8383611ac0565b600854611dc9816117cd565b8015611dd457508343115b15611ebd576000611e277f0000000000000000000000000000000000000000000000000000000000000000857f000000000000000000000000000000000000000000000000000000000000000086612c8a565b90506000611e5e7f000000000000000000000000000000000000000000000000000000000000000086611e59866117b3565b612cbf565b90506000611e6b846113bf565b90506000611e78856117c0565b90506000611e9182848787611e8c8b6117a7565b612cdb565b9050808314611a4057611ea48682612d32565b9550611eb08642612d40565b6008819055955050505050505b50505050565b6000828202611edd841580611add575083858381611ada57fe5b80611eec5760009150506105d1565b670de0b6b3a764000060001982015b046001019150506105d1565b6000611f1a858486858a60600151612d4e565b90505b95945050505050565b600061079e8383612b8f565b6000611f1a858486858a60600151612dc9565b600061079e8383612c57565b6000670de0b6b3a76400008210611f695760006105d1565b50670de0b6b3a76400000390565b6000611f8682151560046113cc565b82611f93575060006105d1565b670de0b6b3a764000083810290611fad90858381611b1a57fe5b826001820381611efb57fe5b6000611fc3610bb6565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015611ffb57600080fd5b505afa15801561200f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e89190614605565b60008061203f83611a4b565b9050612058600061204f836123d0565b116101396113cc565b61206281856123dc565b949350505050565b6040805160028082526060808301845292839291906020830190803683370190505090506120986001611d5d565b816000815181106120a557fe5b6020026020010181815250506120bb6000611d5d565b816001815181106120c857fe5b6020908102919091010152905090565b670de0b6b3a764000060005b835181101561213a576121306121298583815181106120ff57fe5b602002602001015185848151811061211357fe5b6020026020010151612e3f90919063ffffffff16565b8390612e8e565b91506001016120e4565b506105d1600082116101376113cc565b60006121546116a1565b82604051602001610b509291906148c5565b60006060600061217584612eba565b9050612190600082600281111561218857fe5b1460ce6113cc565b606061219b85612ed0565b90506121a9815160026117e7565b6121b281611b35565b60606121bc61206a565b905060006121ca82846120d8565b905060006121d9826002611ac0565b6009929092555099919850909650505050505050565b6001600160a01b03821660009081526020819052604090205461221290826111c6565b6001600160a01b03831660009081526020819052604090205560025461223890826111c6565b6002556040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612279908590614993565b60405180910390a35050565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6122a4610b92565b6001600160a01b0316141580156122bf57506122bf83612ee6565b156122e7576122cc610b92565b6001600160a01b0316336001600160a01b03161490506105d1565b6122ef611fb9565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161231e9392919061499c565b60206040518083038186803b15801561233657600080fd5b505afa15801561234a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236e91906144c5565b90506105d1565b1c6103ff1690565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b60006105d1828261298b565b6000808260028111156123eb57fe5b14156123fa5761236e83612baf565b600182600281111561240857fe5b14156124175761236e83612bc9565b61236e83612be3565b60008082600281111561242f57fe5b141561243e5761236e83612bbc565b600182600281111561244c57fe5b141561245b5761236e83612bd6565b61236e83612bf0565b60006105d1826001612f00565b600080806103ff8180805b8385116124e857600285850104612493818a612f00565b935061249e84611a4b565b92506124a9836123d0565b9150898210156124be578060010195506124e2565b898211156124d1576001810394506124e2565b82839750975050505050505061251d565b5061247c565b888110612506576125006124fb84612f11565b611a4b565b82612513565b816125136124fb85612464565b9650965050505050505b9250929050565b6000612553680238fd42c5cf03ffff19831215801561254c575068070c1cc73b00c800008313155b60096113cc565b60008212156125865761256882600003612524565b6a0c097ce7bc90715b34b9f160241b8161257e57fe5b059050610a56565b60006806f05b59d3b200000083126125c657506806f05b59d3b1ffffff1990910190770195e54c5dd42177f53a27172fa9ec6302628270000000006125fc565b6803782dace9d900000083126125f857506803782dace9d8ffffff19909101906b1425982cf597cd205cef73806125fc565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac62000000841261264c5768ad78ebc5ac61ffffff199093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d6310000008412612688576856bc75e2d630ffffff199093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b1880000084126126c257682b5e3af16b187fffff199093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c40000084126126fc576815af1d78b58c3fffff199093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac6200000841261273557680ad78ebc5ac61fffff199093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d63100000841261276e5768056bc75e2d630fffff199093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b188000084126127a7576802b5e3af16b187ffff199093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c4000084126127e05768015af1d78b58c3ffff199093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b60008061290d83612f1e565b9050655af3107a40006000821361292c57652d79883d20008203612936565b652d79883d200082015b8161293d57fe5b059392505050565b600061079e838383612f7a565b600061079e83836016612f7a565b4690565b600082821c623fffff16621fffff811361297e5780612062565b623fffff19179392505050565b1c637fffffff1690565b1c60019081161490565b1c6001600160401b031690565b604080516002808252606080830184529283929190602083019080368337019050509050826129dc579050611f1d565b612a4f877f000000000000000000000000000000000000000000000000000000000000000081518110612a0b57fe5b6020026020010151877f000000000000000000000000000000000000000000000000000000000000000081518110612a3f57fe5b6020026020010151878787612f91565b817f000000000000000000000000000000000000000000000000000000000000000081518110612a7b57fe5b60209081029190910101529695505050505050565b612ac683600081518110612aa057fe5b602002602001015183600081518110612ab557fe5b60200260200101518363ffffffff16565b83600081518110612ad357fe5b602002602001018181525050612b0483600181518110612aef57fe5b602002602001015183600181518110612ab557fe5b83600181518110612b1157fe5b602002602001018181525050505050565b600060606000612b3184612eba565b90506000816002811115612b4157fe5b1415612b5c57612b52868686613009565b9250925050612b87565b6001816002811115612b6a57fe5b1415612b7a57612b5286856130b9565b612b528686866130eb565b505b935093915050565b6000612b9e82151560046113cc565b818381612ba757fe5b049392505050565b60006105d18260ea612964565b60006105d18260b5613157565b60006105d182609f612964565b60006105d182606a613157565b60006105d1826054612964565b60006105d182601f613157565b600060606000612c0c84612eba565b90506001816002811115612c1c57fe5b1415612c2d57612b5286868661318a565b6002816002811115612c3b57fe5b1415612c4c57612b528686866131e0565b612b8561013661237d565b6000612c6682151560046113cc565b82612c73575060006105d1565b816001840381612c7f57fe5b0460010190506105d1565b600080612caa612c9a8486611f77565b612ca48789611f77565b90611f77565b9050612cb581612901565b9695505050505050565b600080612ccf61168f8587611f77565b92909203949350505050565b600080612cf785858542612cee8b611a4b565b93929190613263565b9050607842889003101580612d0c5786612d15565b612d1587612464565b600081815260076020526040902092909255509695505050505050565b600061079e8383604b6132b5565b600061079e8383602c6132c5565b6000612d70612d6587670429d069189e0000612e8e565b8311156101306113cc565b6000612d7c87846111c6565b90506000612d8a8883611f77565b90506000612d988887611ae4565b90506000612da683836132d7565b9050612dbb612db482611f51565b8990612e8e565b9a9950505050505050505050565b6000612deb612de085670429d069189e0000612e8e565b8311156101316113cc565b6000612e01612dfa86856111f4565b8690611f77565b90506000612e0f8588611f77565b90506000612e1d83836132d7565b90506000612e3382670de0b6b3a76400006111f4565b9050612dbb8a82611ec3565b600080612e4c8484613303565b90506000612e66612e5f83612710611ec3565b60016111c6565b905080821015612e7b576000925050506105d1565b612e8582826111f4565b925050506105d1565b6000828202612ea8841580611add575083858381611ada57fe5b670de0b6b3a764000090049392505050565b6000818060200190518101906105d19190614621565b60608180602001905181019061079e91906146e6565b6000612ef8631c74c91760e11b610b1b565b909114919050565b60006104008383015b069392505050565b60006105d1826001613404565b6000612f2e6000831360646113cc565b670c7d713b49da000082138015612f4c5750670f43fc2c04ee000082125b15612f6a57670de0b6b3a7640000612f6383613413565b8161257e57fe5b612f7382613531565b9050610a56565b623fffff828116821b90821b198416179392505050565b6000838311612fa257506000611f1d565b6000612fae8585611f77565b90506000612fc4670de0b6b3a764000088611ae4565b9050612fd8826709b6e64a8ec600006138d0565b91506000612fe683836132d7565b90506000612ffd612ff683611f51565b8b90612e8e565b9050612dbb8187612e8e565b60006060613015611606565b600080613021856138e7565b915091506130336002821060646113cc565b604080516002808252606080830184529260208301908036833701905050905061309488838151811061306257fe5b602002602001015188848151811061307657fe5b6020026020010151856130876105eb565b61308f610885565b613909565b8183815181106130a057fe5b6020908102919091010152919791965090945050505050565b6000606060006130c8846139c0565b905060606130de86836130d96105eb565b6139d6565b9196919550909350505050565b600060606130f7611606565b6060600061310485613a87565b91509150613114825160026117e7565b61311d82611b35565b600061313a88888561312d6105eb565b613135610885565b613a9f565b905061314a8282111560cf6113cc565b9791965090945050505050565b600082821c661fffffffffffff16660fffffffffffff81136131795780612062565b661fffffffffffff19179392505050565b6000606080600061319a85613a87565b915091506131aa825160026117e7565b6131b382611b35565b60006131d08888856131c36105eb565b6131cb610885565b613cca565b905061314a8282101560d06113cc565b600060606000806131f0856138e7565b915091506132026002821060646113cc565b604080516002808252606080830184529260208301908036833701905050905061309488838151811061323157fe5b602002602001015188848151811061324557fe5b6020026020010151856132566105eb565b61325e610885565b613eda565b60008061326f876123d0565b83039050600081870261328189612bbc565b01905060008287026132928a612bd6565b01905060008387026132a38b612bf0565b019050612dbb89848a858b868c613f7c565b6103ff811b1992909216911b1790565b637fffffff811b1992909216911b1790565b6000806132e48484613303565b905060006132f7612e5f83612710611ec3565b9050611f1d82826111c6565b6000816133195750670de0b6b3a76400006105d1565b82613326575060006105d1565b613337600160ff1b841060066113cc565b8261335d770bce5086492111aea88f4bb1ca6bcf584181ea8059f76532841060076113cc565b826000670c7d713b49da00008313801561337e5750670f43fc2c04ee000083125b156133b557600061338e84613413565b9050670de0b6b3a764000080820784020583670de0b6b3a7640000830502019150506133c3565b816133bf84613531565b0290505b670de0b6b3a764000090056133fb680238fd42c5cf03ffff1982128015906133f4575068070c1cc73b00c800008213155b60086113cc565b612cb581612524565b60006104008284038101612f09565b670de0b6b3a7640000026000806a0c097ce7bc90715b34b9f160241b808401906ec097ce7bc90715b34b9f0fffffffff198501028161344e57fe5b05905060006a0c097ce7bc90715b34b9f160241b82800205905081806a0c097ce7bc90715b34b9f160241b81840205915060038205016a0c097ce7bc90715b34b9f160241b82840205915060058205016a0c097ce7bc90715b34b9f160241b82840205915060078205016a0c097ce7bc90715b34b9f160241b82840205915060098205016a0c097ce7bc90715b34b9f160241b828402059150600b8205016a0c097ce7bc90715b34b9f160241b828402059150600d8205016a0c097ce7bc90715b34b9f160241b828402059150600f826002919005919091010295945050505050565b6000670de0b6b3a764000082121561356d57613563826a0c097ce7bc90715b34b9f160241b8161355d57fe5b05613531565b6000039050610a56565b60007e1600ef3172e58d2e933ec884fde10064c63b5372d805e203c000000000000083126135be57770195e54c5dd42177f53a27172fa9ec630262827000000000830592506806f05b59d3b2000000015b73011798004d755d3c8bc8e03204cf44619e00000083126135f6576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff0084000831261363e576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a7008312613679576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf85083126136b057693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e283126136e757690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d03831261371c5768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb41746121110831261374757680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d831261377c576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f177578893793783126137b1576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b28660383126137e5576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac8312613819576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b600068056bc75e2d63100000840168056bc75e2d63100000808603028161383c57fe5b059050600068056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b6000818310156138e0578161079e565b5090919050565b600080828060200190518101906138fe91906146b0565b909590945092505050565b60008061391a84612ca481886111f4565b90506139336709b6e64a8ec600008210156101326113cc565b600061395161394a670de0b6b3a764000089611ae4565b83906132d7565b9050600061396861396183611f51565b8a90612e8e565b9050600061397589611f51565b905060006139838383611ec3565b9050600061399184836111f4565b90506139b06139a96139a28a611f51565b8490612e8e565b82906111c6565b9c9b505050505050505050505050565b60008180602001905181019061079e9190614683565b606060006139e48484611ae4565b9050606085516001600160401b03811180156139ff57600080fd5b50604051908082528060200260200182016040528015613a29578160200160208202803683370190505b50905060005b8651811015613a7d57613a5e83888381518110613a4857fe5b6020026020010151612e8e90919063ffffffff16565b828281518110613a6a57fe5b6020908102919091010152600101613a2f565b5095945050505050565b60606000828060200190518101906138fe919061463d565b6000606084516001600160401b0381118015613aba57600080fd5b50604051908082528060200260200182016040528015613ae4578160200160208202803683370190505b5090506000805b8851811015613ba957613b44898281518110613b0357fe5b6020026020010151612ca4898481518110613b1a57fe5b60200260200101518c8581518110613b2e57fe5b60200260200101516111f490919063ffffffff16565b838281518110613b5057fe5b602002602001018181525050613b9f613b98898381518110613b6e57fe5b6020026020010151858481518110613b8257fe5b6020026020010151611ec390919063ffffffff16565b83906111c6565b9150600101613aeb565b50670de0b6b3a764000060005b8951811015613ca9576000848281518110613bcd57fe5b6020026020010151841115613c2b576000613bf6613bea86611f51565b8d8581518110613a4857fe5b90506000613c0a828c8681518110613b2e57fe5b9050613c22613b98613c1b8b611f51565b8390611f77565b92505050613c42565b888281518110613c3757fe5b602002602001015190505b6000613c6b8c8481518110613c5357fe5b6020026020010151610985848f8781518110613b2e57fe5b9050613c9d613c968c8581518110613c7f57fe5b602002602001015183612e3f90919063ffffffff16565b8590612e8e565b93505050600101613bb6565b50613cbd613cb682611f51565b8790611ec3565b9998505050505050505050565b6000606084516001600160401b0381118015613ce557600080fd5b50604051908082528060200260200182016040528015613d0f578160200160208202803683370190505b5090506000805b8851811015613db757613d6f898281518110613d2e57fe5b6020026020010151610985898481518110613d4557fe5b60200260200101518c8581518110613d5957fe5b60200260200101516111c690919063ffffffff16565b838281518110613d7b57fe5b602002602001018181525050613dad613b98898381518110613d9957fe5b6020026020010151858481518110613a4857fe5b9150600101613d16565b50670de0b6b3a764000060005b8951811015613e9857600083858381518110613ddc57fe5b60200260200101511115613e38576000613e01613bea86670de0b6b3a76400006111f4565b90506000613e15828c8681518110613b2e57fe5b9050613e2f613b98612129670de0b6b3a76400008c6111f4565b92505050613e4f565b888281518110613e4457fe5b602002602001015190505b6000613e788c8481518110613e6057fe5b6020026020010151610985848f8781518110613d5957fe5b9050613e8c613c968c8581518110613c7f57fe5b93505050600101613dc4565b50670de0b6b3a76400008110613ece57613ec4613ebd82670de0b6b3a76400006111f4565b8790612e8e565b9350505050611f1d565b60009350505050611f1d565b600080613eeb84612ca481886111c6565b9050613f046729a2241af62c00008211156101336113cc565b6000613f1b61394a670de0b6b3a764000089611f77565b90506000613f3b613f3483670de0b6b3a76400006111f4565b8a90611ec3565b90506000613f4889611f51565b90506000613f568383611ec3565b90506000613f6484836111f4565b90506139b06139a9613f758a611f51565b8490611f77565b6000613f888282613fdc565b613f9384601f613fe0565b613f9e866054613ff1565b613fa988606a613fe0565b613fb48a609f613ff1565b613fbf8c60b5613fe0565b613fca8e60ea613ff1565b17171717171798975050505050505050565b1b90565b661fffffffffffff91909116901b90565b623fffff91909116901b90565b6040805160608101909152806000815260200160008152602001600081525090565b604080518082019091526000808252602082015290565b80356105d181614b52565b600082601f830112614052578081fd5b815161406561406082614b33565b614b0d565b81815291506020808301908481018184028601820187101561408657600080fd5b60005b848110156140a557815184529282019290820190600101614089565b505050505092915050565b600082601f8301126140c0578081fd5b81356001600160401b038111156140d5578182fd5b6140e8601f8201601f1916602001614b0d565b91508082528360208285010111156140ff57600080fd5b8060208401602084013760009082016020015292915050565b8035600281106105d157600080fd5b80356105d181614b75565b600060208284031215614143578081fd5b813561079e81614b52565b60008060408385031215614160578081fd5b823561416b81614b52565b9150602083013561417b81614b52565b809150509250929050565b60008060006060848603121561419a578081fd5b83356141a581614b52565b925060208401356141b581614b52565b929592945050506040919091013590565b600080600080600080600060e0888a0312156141e0578485fd5b87356141eb81614b52565b965060208801356141fb81614b52565b95506040880135945060608801359350608088013560ff8116811461421e578384fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561424d578182fd5b823561425881614b52565b946020939093013593505050565b60008060006060848603121561427a578081fd5b83516001600160401b0380821115614290578283fd5b818601915086601f8301126142a3578283fd5b81516142b161406082614b33565b80828252602080830192508086018b8283870289010111156142d1578788fd5b8796505b848710156142fc5780516142e881614b52565b8452600196909601959281019281016142d5565b508901519097509350505080821115614313578283fd5b5061432086828701614042565b925050604084015190509250925092565b60006020808385031215614343578182fd5b82356001600160401b03811115614358578283fd5b8301601f81018513614368578283fd5b803561437661406082614b33565b818152838101908385016040808502860187018a1015614394578788fd5b8795505b848610156143e15780828b0312156143ae578788fd5b6143b781614b0d565b6143c18b84614127565b815282880135888201528452600195909501949286019290810190614398565b509098975050505050505050565b60006020808385031215614401578182fd5b82356001600160401b03811115614416578283fd5b8301601f81018513614426578283fd5b803561443461406082614b33565b818152838101908385016060808502860187018a1015614452578788fd5b8795505b848610156143e15780828b03121561446c578788fd5b61447581614b0d565b61447f8b84614127565b81528288013588820152604080840135908201528452600195909501949286019290810190614456565b6000602082840312156144ba578081fd5b813561079e81614b67565b6000602082840312156144d6578081fd5b815161079e81614b67565b600080600080600080600060e0888a0312156144fb578081fd5b8735965060208089013561450e81614b52565b9650604089013561451e81614b52565b955060608901356001600160401b0380821115614539578384fd5b818b0191508b601f83011261454c578384fd5b813561455a61406082614b33565b8082825285820191508585018f878886028801011115614578578788fd5b8795505b8386101561459a57803583526001959095019491860191860161457c565b509850505060808b0135955060a08b0135945060c08b01359250808311156145c0578384fd5b50506145ce8a828b016140b0565b91505092959891949750929550565b6000602082840312156145ee578081fd5b81356001600160e01b03198116811461079e578182fd5b600060208284031215614616578081fd5b815161079e81614b52565b600060208284031215614632578081fd5b815161079e81614b75565b600080600060608486031215614651578081fd5b835161465c81614b75565b60208501519093506001600160401b03811115614677578182fd5b61432086828701614042565b60008060408385031215614695578182fd5b82516146a081614b75565b6020939093015192949293505050565b6000806000606084860312156146c4578081fd5b83516146cf81614b75565b602085015160409095015190969495509392505050565b600080604083850312156146f8578182fd5b825161470381614b75565b60208401519092506001600160401b0381111561471e578182fd5b61472a85828601614042565b9150509250929050565b600060208284031215614745578081fd5b813561079e81614b75565b600080600060608486031215614764578081fd5b83356001600160401b038082111561477a578283fd5b8186019150610120808389031215614790578384fd5b61479981614b0d565b90506147a58884614118565b81526147b48860208501614037565b60208201526147c68860408501614037565b6040820152606083013560608201526080830135608082015260a083013560a08201526147f68860c08501614037565b60c08201526148088860e08501614037565b60e08201526101008084013583811115614820578586fd5b61482c8a8287016140b0565b9183019190915250976020870135975060409096013595945050505050565b60006020828403121561485c578081fd5b5035919050565b6000815180845260208085019450808401835b8381101561489257815187529582019590820190600101614876565b509495945050505050565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b8181101561492c57835183529284019291840191600101614910565b50909695505050505050565b60006020825261079e6020830184614863565b60006040825261495e6040830185614863565b8281036020840152611f1d8185614863565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b93845260ff9290921660208401526040830152606082015260800190565b968752602087019590955260408601939093526060850191909152608084015260a083015260c082015260e00190565b9586526020860194909452604085019290925260608401521515608083015260a082015260c00190565b6000602080835283518082850152825b81811015614abf57858101830151858201604001528201614aa3565b81811115614ad05783604083870101525b50601f01601f1916929092016040019392505050565b6000838252604060208301526120626040830184614863565b60ff91909116815260200190565b6040518181016001600160401b0381118282101715614b2b57600080fd5b604052919050565b60006001600160401b03821115614b48578081fd5b5060209081020190565b6001600160a01b03811681146105e857600080fd5b80151581146105e857600080fd5b600381106105e857600080fdfea26469706673582212201dbf8d364d926088a19c5f3f5d0ca0ab72cf3eda8f3f78dda45ab2619de4b6d664736f6c63430007010033a264697066735822122062c63a2c3089490a939fe9f20e0e99ef310f04a393c33a92c66f45a3b2cea18064736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/artifact/WeightedPoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/artifact/WeightedPoolFactory.json new file mode 100644 index 0000000..7fa62ed --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/artifact/WeightedPoolFactory.json @@ -0,0 +1,129 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "WeightedPoolFactory", + "sourceName": "contracts/pools/weighted/WeightedPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "weights", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60c060405234801561001057600080fd5b5060405161604138038061604183398101604081905261002f9161004d565b60601b6001600160601b0319166080526276a700420160a05261007b565b60006020828403121561005e578081fd5b81516001600160a01b0381168114610074578182fd5b9392505050565b60805160601c60a051615f9c6100a56000398060d6528061010052508061015c5250615f9c6000f3fe60806040523480156200001157600080fd5b5060043610620000525760003560e01c80632da47c4014620000575780636634b753146200007a5780638d928af814620000a0578063fbce039314620000b9575b600080fd5b62000061620000d0565b6040516200007192919062000634565b60405180910390f35b620000916200008b366004620003c0565b6200013c565b60405162000071919062000562565b620000aa6200015a565b6040516200007191906200054e565b620000aa620000ca366004620003e6565b6200017e565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200012e57807f000000000000000000000000000000000000000000000000000000000000000003925062278d00915062000137565b60009250600091505b509091565b6001600160a01b031660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008060006200018d620000d0565b9150915060006200019d6200015a565b8a8a8a8a8a88888c604051620001b3906200024b565b620001c7999897969594939291906200056d565b604051809103906000f080158015620001e4573d6000803e3d6000fd5b509050620001f281620001ff565b9998505050505050505050565b6001600160a01b038116600081815260208190526040808220805460ff19166001179055517f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a250565b6158b680620006b183390190565b8035620002668162000697565b92915050565b600082601f8301126200027d578081fd5b8135620002946200028e826200066a565b62000642565b818152915060208083019084810181840286018201871015620002b657600080fd5b60005b84811015620002e2578135620002cf8162000697565b84529282019290820190600101620002b9565b505050505092915050565b600082601f830112620002fe578081fd5b81356200030f6200028e826200066a565b8181529150602080830190848101818402860182018710156200033157600080fd5b60005b84811015620002e25781358452928201929082019060010162000334565b600082601f83011262000363578081fd5b813567ffffffffffffffff8111156200037a578182fd5b6200038f601f8201601f191660200162000642565b9150808252836020828501011115620003a757600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215620003d2578081fd5b8135620003df8162000697565b9392505050565b60008060008060008060c08789031215620003ff578182fd5b863567ffffffffffffffff8082111562000417578384fd5b620004258a838b0162000352565b975060208901359150808211156200043b578384fd5b620004498a838b0162000352565b965060408901359150808211156200045f578384fd5b6200046d8a838b016200026c565b9550606089013591508082111562000483578384fd5b506200049289828a01620002ed565b93505060808701359150620004ab8860a0890162000259565b90509295509295509295565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015620004f557815187529582019590820190600101620004d7565b509495945050505050565b60008151808452815b81811015620005275760208185018101518683018201520162000509565b81811115620005395782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b901515815260200190565b60006101206001600160a01b038c16835260208181850152620005938285018d62000500565b91508382036040850152620005a9828c62000500565b84810360608601528a51808252828c01935090820190845b81811015620005e957620005d685516200068b565b83529383019391830191600101620005c1565b50508481036080860152620005ff818b620004c4565b93505050508560a08301528460c08301528360e083015262000626610100830184620004b7565b9a9950505050505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156200066257600080fd5b604052919050565b600067ffffffffffffffff82111562000681578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114620006ad57600080fd5b5056fe6105006040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b50604051620058b6380380620058b68339810160408190526200005a9162000cf2565b88888888878787878785516002146200007557600162000078565b60025b6040805180820190915260018152603160f81b6020808301918252336080526001600160601b0319606087901b1660a0528b51908c0190812060c0529151902060e0527f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6101005289518a918a918a918a918a918a918a91849184918a918a9162000107916003919062000abb565b5080516200011d90600490602084019062000abb565b50620001359150506276a70083111561019462000865565b6200014962278d0082111561019562000865565b42909101610140819052016101605284516200016b906002111560c862000865565b6200018360088651111560c96200086560201b60201c565b62000199856200087a60201b62000d571760201c565b620001a48462000886565b6040516309b2760f60e01b81526000906001600160a01b038b16906309b2760f90620001d5908c9060040162000eab565b602060405180830381600087803b158015620001f057600080fd5b505af115801562000205573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022b919062000cd9565b9050896001600160a01b03166366a9c7d2828889516001600160401b03811180156200025657600080fd5b5060405190808252806020026020018201604052801562000281578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401620002a29392919062000e0f565b600060405180830381600087803b158015620002bd57600080fd5b505af1158015620002d2573d6000803e3d6000fd5b5050506001600160601b031960608c901b1661018052506101a081905285516101c0528551620003045760006200031b565b856000815181106200031257fe5b60200260200101515b60601b6001600160601b0319166101e05285516001106200033e57600062000355565b856001815181106200034c57fe5b60200260200101515b60601b6001600160601b031916610200528551600210620003785760006200038f565b856002815181106200038657fe5b60200260200101515b60601b6001600160601b031916610220528551600310620003b2576000620003c9565b85600381518110620003c057fe5b60200260200101515b60601b6001600160601b031916610240528551600410620003ec57600062000403565b85600481518110620003fa57fe5b60200260200101515b60601b6001600160601b031916610260528551600510620004265760006200043d565b856005815181106200043457fe5b60200260200101515b60601b6001600160601b0319166102805285516006106200046057600062000477565b856006815181106200046e57fe5b60200260200101515b60601b6001600160601b0319166102a05285516007106200049a576000620004b1565b85600781518110620004a857fe5b60200260200101515b60601b6001600160601b0319166102c0528551620004d1576000620004f7565b620004f786600081518110620004e357fe5b6020026020010151620008f560201b60201c565b6102e05285516001106200050d5760006200051f565b6200051f86600181518110620004e357fe5b6103005285516002106200053557600062000547565b6200054786600281518110620004e357fe5b6103205285516003106200055d5760006200056f565b6200056f86600381518110620004e357fe5b6103405285516004106200058557600062000597565b6200059786600481518110620004e357fe5b610360528551600510620005ad576000620005bf565b620005bf86600581518110620004e357fe5b610380528551600610620005d5576000620005e7565b620005e786600681518110620004e357fe5b6103a0528551600710620005fd5760006200060f565b6200060f86600781518110620004e357fe5b6103c08181525050505050505050505050505050505050505050600086519050620006478187516200099760201b62000d651760201c565b6000806000805b848160ff161015620006cd5760008a8260ff16815181106200066c57fe5b6020026020010151905062000694662386f26fc1000082101561012e6200086560201b60201c565b620006ae8186620009a660201b62000d721790919060201c565b945082811115620006c3578160ff1693508092505b506001016200064e565b50620006e6670de0b6b3a7640000841461013462000865565b6103e08290528851620006fb57600062000712565b886000815181106200070957fe5b60200260200101515b610400528851600110620007285760006200073f565b886001815181106200073657fe5b60200260200101515b610420528851600210620007555760006200076c565b886002815181106200076357fe5b60200260200101515b6104405288516003106200078257600062000799565b886003815181106200079057fe5b60200260200101515b610460528851600410620007af576000620007c6565b88600481518110620007bd57fe5b60200260200101515b610480528851600510620007dc576000620007f3565b88600581518110620007ea57fe5b60200260200101515b6104a05288516006106200080957600062000820565b886006815181106200081757fe5b60200260200101515b6104c0528851600710620008365760006200084d565b886007815181106200084457fe5b60200260200101515b6104e0525062000f329b505050505050505050505050565b8162000876576200087681620009c3565b5050565b80620008768162000a16565b6200089b64e8d4a5100082101560cb62000865565b620008b367016345785d8a000082111560ca62000865565b60078190556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90620008ea90839062000ec0565b60405180910390a150565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200093257600080fd5b505afa15801562000947573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200096d919062000dec565b60ff16905060006200098c60128362000aa360201b62000d841760201c565b600a0a949350505050565b62000876828214606762000865565b6000828201620009ba848210158362000865565b90505b92915050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b60028151101562000a275762000aa0565b60008160008151811062000a3757fe5b602002602001015190506000600190505b825181101562000a9d57600083828151811062000a6157fe5b6020026020010151905062000a92816001600160a01b0316846001600160a01b03161060656200086560201b60201c565b915060010162000a48565b50505b50565b600062000ab583831115600162000865565b50900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000afe57805160ff191683800117855562000b2e565b8280016001018555821562000b2e579182015b8281111562000b2e57825182559160200191906001019062000b11565b5062000b3c92915062000b40565b5090565b5b8082111562000b3c576000815560010162000b41565b8051620009bd8162000f1c565b600082601f83011262000b75578081fd5b815162000b8c62000b868262000ef0565b62000ec9565b81815291506020808301908481018184028601820187101562000bae57600080fd5b60005b8481101562000bda57815162000bc78162000f1c565b8452928201929082019060010162000bb1565b505050505092915050565b600082601f83011262000bf6578081fd5b815162000c0762000b868262000ef0565b81815291506020808301908481018184028601820187101562000c2957600080fd5b60005b8481101562000bda5781518452928201929082019060010162000c2c565b600082601f83011262000c5b578081fd5b81516001600160401b0381111562000c71578182fd5b602062000c87601f8301601f1916820162000ec9565b9250818352848183860101111562000c9e57600080fd5b60005b8281101562000cbe57848101820151848201830152810162000ca1565b8281111562000cd05760008284860101525b50505092915050565b60006020828403121562000ceb578081fd5b5051919050565b60008060008060008060008060006101208a8c03121562000d11578485fd5b62000d1d8b8b62000b57565b60208b01519099506001600160401b038082111562000d3a578687fd5b62000d488d838e0162000c4a565b995060408c015191508082111562000d5e578687fd5b62000d6c8d838e0162000c4a565b985060608c015191508082111562000d82578687fd5b62000d908d838e0162000b64565b975060808c015191508082111562000da6578687fd5b5062000db58c828d0162000be5565b95505060a08a0151935060c08a0151925060e08a0151915062000ddd8b6101008c0162000b57565b90509295985092959850929598565b60006020828403121562000dfe578081fd5b815160ff81168114620009ba578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000e5b5762000e48855162000f10565b8352938301939183019160010162000e33565b505084810360408601528551808252908201925081860190845b8181101562000e9d5762000e8a835162000f10565b8552938301939183019160010162000e75565b509298975050505050505050565b602081016003831062000eba57fe5b91905290565b90815260200190565b6040518181016001600160401b038111828210171562000ee857600080fd5b604052919050565b60006001600160401b0382111562000f06578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b038116811462000aa057600080fd5b60805160a05160601c60c05160e051610100516101205161014051610160516101805160601c6101a0516101c0516101e05160601c6102005160601c6102205160601c6102405160601c6102605160601c6102805160601c6102a05160601c6102c05160601c6102e05161030051610320516103405161036051610380516103a0516103c0516103e05161040051610420516104405161046051610480516104a0516104c0516104e05161476e6200114860003980611ec55280612857525080611e8252806127f6525080611e3f5280612795525080611dfc5280612734525080611db952806126d3525080611d765280612672525080611d335280612611525080611cf052806125b05250806122d0528061230452806123405250806116285280611b1e5250806115e55280611abd5250806115a25280611a5c52508061155f52806119fb52508061151c528061199a5250806114d9528061193952508061149652806118d85250806114455280611877525080611ae3528061281c525080611a8252806127bb525080611a21528061275a5250806119c052806126f952508061195f52806126985250806118fe528061263752508061189d52806125d652508061183c52806125755250806111025250806105d7525080610835525080610ef1525080610ecd525080610ab5525080610ff452508061103652508061101552508061081152508061079b525061476e6000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80637ecebe001161010f578063a9059cbb116100a2578063d5c096c411610071578063d5c096c4146103e6578063d73dd623146103f9578063dd62ed3e1461040c578063f89f27ed1461041f576101f0565b8063a9059cbb146103b0578063aaabadc5146103c3578063c0ff1a15146103cb578063d505accf146103d3576101f0565b80638d928af8116100de5780638d928af81461038557806395d89b411461038d5780639b02cdde146103955780639d2c110c1461039d576101f0565b80637ecebe0014610337578063851c1bb31461034a57806387ec68171461035d578063893d20e814610370576101f0565b806338e9922e11610187578063661884631161015657806366188463146102e8578063679aefce146102fb57806370a082311461030357806374f3b00914610316576101f0565b806338e9922e146102a457806338fff2d0146102b757806355c67628146102bf5780636028bfd4146102c7576101f0565b80631c0de051116101c35780631c0de0511461025d57806323b872dd14610274578063313ce567146102875780633644e5151461029c576101f0565b806306fdde03146101f5578063095ea7b31461021357806316c38b3c1461023357806318160ddd14610248575b600080fd5b6101fd610434565b60405161020a9190614647565b60405180910390f35b61022661022136600461401c565b6104cb565b60405161020a919061457e565b610246610241366004614113565b6104e2565b005b6102506104f6565b60405161020a91906145a1565b6102656104fc565b60405161020a93929190614589565b610226610282366004613f67565b610525565b61028f6105a8565b60405161020a91906146b3565b6102506105ad565b6102466102b236600461449d565b6105bc565b6102506105d5565b6102506105f9565b6102da6102d536600461414b565b6105ff565b60405161020a92919061469a565b6102266102f636600461401c565b610636565b610250610690565b610250610311366004613f13565b6106bb565b61032961032436600461414b565b6106da565b60405161020a929190614559565b610250610345366004613f13565b61077c565b610250610358366004614248565b610797565b6102da61036b36600461414b565b6107e9565b61037861080f565b60405161020a9190614532565b610378610833565b6101fd610857565b6102506108b8565b6102506103ab3660046143a1565b6108be565b6102266103be36600461401c565b6109a5565b6103786109b2565b6102506109bc565b6102466103e1366004613fa7565b610a80565b6103296103f436600461414b565b610bc9565b61022661040736600461401c565b610cec565b61025061041a366004613f2f565b610d22565b610427610d4d565b60405161020a9190614546565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104c05780601f10610495576101008083540402835291602001916104c0565b820191906000526020600020905b8154815290600101906020018083116104a357829003601f168201915b505050505090505b90565b60006104d8338484610d9a565b5060015b92915050565b6104ea610e02565b6104f381610e30565b50565b60025490565b6000806000610509610eae565b159250610514610ecb565b915061051e610eef565b9050909192565b6001600160a01b0383166000818152600160209081526040808320338085529252822054919261056391148061055b5750838210155b610197610f13565b61056e858585610f21565b336001600160a01b0386161480159061058957506000198114155b1561059b5761059b8533858403610d9a565b60019150505b9392505050565b601290565b60006105b7610ff0565b905090565b6105c4610e02565b6105cc61108d565b6104f3816110a2565b7f000000000000000000000000000000000000000000000000000000000000000090565b60075490565b600060606106158651610610611100565b610d65565b61062a898989898989896111246111ec611252565b97509795505050505050565b3360009081526001602090815260408083206001600160a01b03861684529091528120548083106106725761066d33856000610d9a565b610686565b61068633856106818487610d84565b610d9a565b5060019392505050565b60006105b761069d6104f6565b6106b56106a86109bc565b6106b0611100565b611374565b90611398565b6001600160a01b0381166000908152602081905260409020545b919050565b606080886107046106e9610833565b6001600160a01b0316336001600160a01b03161460cd610f13565b61071961070f6105d5565b82146101f4610f13565b60606107236113e9565b905061072f8882611666565b60006060806107438e8e8e8e8e8e8e611124565b9250925092506107538d846116c7565b61075d82856111ec565b61076781856111ec565b909550935050505b5097509795505050505050565b6001600160a01b031660009081526005602052604090205490565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016107cc9291906144ef565b604051602081830303815290604052805190602001209050919050565b600060606107fa8651610610611100565b61062a8989898989898961175a6117d7611252565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104c05780601f10610495576101008083540402835291602001916104c0565b60085490565b6000806108ce8560200151611838565b905060006108df8660400151611838565b90506000865160018111156108f057fe5b1415610956576109038660600151611b4d565b60608701526109128583611b71565b945061091e8482611b71565b935061092e866060015183611b71565b60608701526000610940878787611b7d565b905061094c8183611bb8565b93505050506105a1565b6109608583611b71565b945061096c8482611b71565b935061097c866060015182611b71565b6060870152600061098e878787611bc4565b905061099a8184611bf7565b905061094c81611c03565b60006104d8338484610f21565b60006105b7611c1a565b600060606109c8610833565b6001600160a01b031663f94d46686109de6105d5565b6040518263ffffffff1660e01b81526004016109fa91906145a1565b60006040518083038186803b158015610a1257600080fd5b505afa158015610a26573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a4e9190810190614047565b50915050610a6381610a5e6113e9565b611666565b6060610a6d611c94565b9050610a798183611ef1565b9250505090565b610a8e8442111560d1610f13565b6001600160a01b0387166000908152600560209081526040808320549051909291610ae5917f0000000000000000000000000000000000000000000000000000000000000000918c918c918c9188918d91016145c9565b6040516020818303038152906040528051906020012090506000610b0882611f63565b9050600060018288888860405160008152602001604052604051610b2f9493929190614629565b6020604051602081039080840390855afa158015610b51573d6000803e3d6000fd5b5050604051601f1901519150610b9390506001600160a01b03821615801590610b8b57508b6001600160a01b0316826001600160a01b0316145b6101f8610f13565b6001600160a01b038b166000908152600560205260409020600185019055610bbc8b8b8b610d9a565b5050505050505050505050565b60608088610bd86106e9610833565b610be361070f6105d5565b6060610bed6113e9565b9050610bf76104f6565b610c9d5760006060610c0b8d8d8d8a611f7f565b91509150610c20620f424083101560cc610f13565b610c2e6000620f424061201a565b610c3d8b620f4240840361201a565b610c4781846117d7565b80610c50611100565b67ffffffffffffffff81118015610c6657600080fd5b50604051908082528060200260200182016040528015610c90578160200160208202803683370190505b509550955050505061076f565b610ca78882611666565b6000606080610cbb8e8e8e8e8e8e8e61175a565b925092509250610ccb8c8461201a565b610cd582856117d7565b610cdf81856111ec565b909550935061076f915050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916104d89185906106819086610d72565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60606105b7611c94565b80610d61816120b0565b5050565b610d618183146067610f13565b60008282016105a18482101583610f13565b6000610d94838311156001610f13565b50900390565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610df59085906145a1565b60405180910390a3505050565b6000610e196000356001600160e01b031916610797565b90506104f3610e288233612129565b610191610f13565b8015610e5057610e4b610e41610ecb565b4210610193610f13565b610e65565b610e65610e5b610eef565b42106101a9610f13565b6006805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490610ea390839061457e565b60405180910390a150565b6000610eb8610eef565b4211806105b757505060065460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b81610d6157610d6181612219565b6001600160a01b038316600090815260208190526040902054610f4982821015610196610f13565b610f606001600160a01b0384161515610199610f13565b6001600160a01b03808516600090815260208190526040808220858503905591851681522054610f909083610d72565b6001600160a01b0380851660008181526020819052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610fe29086906145a1565b60405180910390a350505050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061105d61226c565b306040516020016110729594939291906145fd565b60405160208183030381529060405280519060200120905090565b6110a0611098610eae565b610192610f13565b565b6110b564e8d4a5100082101560cb610f13565b6110cb67016345785d8a000082111560ca610f13565b60078190556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90610ea39083906145a1565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006060806060611133611c94565b905061113d610eae565b1561117457600061114e828a611ef1565b905061115f8983600854848b612270565b925061116e8984610d84612380565b506111c0565b61117c611100565b67ffffffffffffffff8111801561119257600080fd5b506040519080825280602002602001820160405280156111bc578160200160208202803683370190505b5091505b6111cb8882876123eb565b90945092506111db888483612458565b600855509750975097945050505050565b60005b6111f7611100565b81101561124d5761122e83828151811061120d57fe5b602002602001015183838151811061122157fe5b6020026020010151612471565b83828151811061123a57fe5b60209081029190910101526001016111ef565b505050565b333014611310576000306001600160a01b0316600036604051611276929190614507565b6000604051808303816000865af19150503d80600081146112b3576040519150601f19603f3d011682016040523d82523d6000602084013e6112b8565b606091505b5050905080600081146112c757fe5b60046000803e6000516001600160e01b0319166343adbafb60e01b81146112f2573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b606061131a6113e9565b90506113268782611666565b6000606061133d8c8c8c8c8c8c8c8c63ffffffff16565b509150915061135081848663ffffffff16565b8051601f1982018390526343adbafb603f1983015260200260231982016044820181fd5b60008282026105a184158061139157508385838161138e57fe5b04145b6003610f13565b60006113a78215156004610f13565b826113b4575060006104dc565b670de0b6b3a7640000838102906113d7908583816113ce57fe5b04146005610f13565b8281816113e057fe5b049150506104dc565b606060006113f5611100565b905060608167ffffffffffffffff8111801561141057600080fd5b5060405190808252806020026020018201604052801561143a578160200160208202803683370190505b5090508115611482577f00000000000000000000000000000000000000000000000000000000000000008160008151811061147157fe5b60200260200101818152505061148b565b91506104c89050565b6001821115611482577f0000000000000000000000000000000000000000000000000000000000000000816001815181106114c257fe5b6020026020010181815250506002821115611482577f00000000000000000000000000000000000000000000000000000000000000008160028151811061150557fe5b6020026020010181815250506003821115611482577f00000000000000000000000000000000000000000000000000000000000000008160038151811061154857fe5b6020026020010181815250506004821115611482577f00000000000000000000000000000000000000000000000000000000000000008160048151811061158b57fe5b6020026020010181815250506005821115611482577f0000000000000000000000000000000000000000000000000000000000000000816005815181106115ce57fe5b6020026020010181815250506006821115611482577f00000000000000000000000000000000000000000000000000000000000000008160068151811061161157fe5b6020026020010181815250506007821115611482577f00000000000000000000000000000000000000000000000000000000000000008160078151811061165457fe5b60200260200101818152505091505090565b60005b611671611100565b81101561124d576116a883828151811061168757fe5b602002602001015183838151811061169b57fe5b6020026020010151611374565b8382815181106116b457fe5b6020908102919091010152600101611669565b6001600160a01b0382166000908152602081905260409020546116ef82821015610196610f13565b6001600160a01b038316600090815260208190526040902082820390556002546117199083610d84565b6002556040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610df59086906145a1565b600060608061176761108d565b6060611771611c94565b9050600061177f828a611ef1565b905060606117928a84600854858c612270565b90506117a18a82610d84612380565b600060606117b08c868b612491565b915091506117bf8c82876124eb565b600855909e909d50909b509950505050505050505050565b60005b6117e2611100565b81101561124d576118198382815181106117f857fe5b602002602001015183838151811061180c57fe5b60200260200101516124fa565b83828151811061182557fe5b60209081029190910101526001016117da565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561189b57507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156118fc57507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561195d57507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156119be57507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611a1f57507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611a8057507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611ae157507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611b4257507f00000000000000000000000000000000000000000000000000000000000000006106d5565b6106d5610135612219565b600080611b656007548461252d90919063ffffffff16565b90506105a18382610d84565b60006105a18383611374565b6000611b8761108d565b611bb083611b988660200151612571565b84611ba68860400151612571565b886060015161287b565b949350505050565b60006105a18383612471565b6000611bce61108d565b611bb083611bdf8660200151612571565b84611bed8860400151612571565b88606001516128f6565b60006105a183836124fa565b60006104dc611c1360075461296c565b8390612992565b6000611c24610833565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015611c5c57600080fd5b505afa158015611c70573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190614270565b60606000611ca0611100565b905060608167ffffffffffffffff81118015611cbb57600080fd5b50604051908082528060200260200182016040528015611ce5578160200160208202803683370190505b5090508115611482577f000000000000000000000000000000000000000000000000000000000000000081600081518110611d1c57fe5b6020026020010181815250506001821115611482577f000000000000000000000000000000000000000000000000000000000000000081600181518110611d5f57fe5b6020026020010181815250506002821115611482577f000000000000000000000000000000000000000000000000000000000000000081600281518110611da257fe5b6020026020010181815250506003821115611482577f000000000000000000000000000000000000000000000000000000000000000081600381518110611de557fe5b6020026020010181815250506004821115611482577f000000000000000000000000000000000000000000000000000000000000000081600481518110611e2857fe5b6020026020010181815250506005821115611482577f000000000000000000000000000000000000000000000000000000000000000081600581518110611e6b57fe5b6020026020010181815250506006821115611482577f000000000000000000000000000000000000000000000000000000000000000081600681518110611eae57fe5b6020026020010181815250506007821115611482577f00000000000000000000000000000000000000000000000000000000000000008160078151811061165457fe5b670de0b6b3a764000060005b8351811015611f5357611f49611f42858381518110611f1857fe5b6020026020010151858481518110611f2c57fe5b60200260200101516129d490919063ffffffff16565b8390612a23565b9150600101611efd565b506104dc60008211610137610f13565b6000611f6d610ff0565b826040516020016107cc929190614517565b60006060611f8b61108d565b6000611f9684612a4f565b9050611fb16000826002811115611fa957fe5b1460ce610f13565b6060611fbc85612a65565b9050611fd0611fc9611100565b8251610d65565b611fdc81610a5e6113e9565b6060611fe6611c94565b90506000611ff48284611ef1565b90506000612004826106b0611100565b6008929092555099919850909650505050505050565b6001600160a01b03821660009081526020819052604090205461203d9082610d72565b6001600160a01b0383166000908152602081905260409020556002546120639082610d72565b6002556040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906120a49085906145a1565b60405180910390a35050565b6002815110156120bf576104f3565b6000816000815181106120ce57fe5b602002602001015190506000600190505b825181101561124d5760008382815181106120f657fe5b6020026020010151905061211f816001600160a01b0316846001600160a01b0316106065610f13565b91506001016120df565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b61214861080f565b6001600160a01b031614158015612163575061216383612a7b565b1561218b5761217061080f565b6001600160a01b0316336001600160a01b03161490506104dc565b612193611c1a565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016121c2939291906145aa565b60206040518083038186803b1580156121da57600080fd5b505afa1580156121ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612212919061412f565b90506104dc565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b4690565b60608061227b611100565b67ffffffffffffffff8111801561229157600080fd5b506040519080825280602002602001820160405280156122bb578160200160208202803683370190505b509050826122ca579050612377565b61233d877f0000000000000000000000000000000000000000000000000000000000000000815181106122f957fe5b6020026020010151877f00000000000000000000000000000000000000000000000000000000000000008151811061232d57fe5b6020026020010151878787612a95565b817f00000000000000000000000000000000000000000000000000000000000000008151811061236957fe5b602090810291909101015290505b95945050505050565b60005b61238b611100565b8110156123e5576123c68482815181106123a157fe5b60200260200101518483815181106123b557fe5b60200260200101518463ffffffff16565b8482815181106123d257fe5b6020908102919091010152600101612383565b50505050565b6000606060006123fa84612a4f565b9050600081600281111561240a57fe5b14156124255761241b868686612b0d565b9250925050612450565b600181600281111561243357fe5b14156124435761241b8685612beb565b61241b868686612c1d565b505b935093915050565b60006124678484610d84612380565b611bb08285611ef1565b60006124808215156004610f13565b81838161248957fe5b049392505050565b6000606060006124a084612a4f565b905060018160028111156124b057fe5b14156124c15761241b868686612c88565b60028160028111156124cf57fe5b14156124e05761241b868686612ce2565b61244e610136612219565b60006124678484610d72612380565b60006125098215156004610f13565b82612516575060006104dc565b81600184038161252257fe5b0460010190506104dc565b600082820261254784158061139157508385838161138e57fe5b806125565760009150506104dc565b670de0b6b3a764000060001982015b046001019150506104dc565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156125d457507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561263557507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561269657507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156126f757507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561275857507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156127b957507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561281a57507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611b4257507f00000000000000000000000000000000000000000000000000000000000000006106d5565b600061289d61289287670429d069189e0000612a23565b831115610130610f13565b60006128a98784610d72565b905060006128b78883612992565b905060006128c58887611398565b905060006128d38383612d8a565b90506128e86128e18261296c565b8990612a23565b9a9950505050505050505050565b600061291861290d85670429d069189e0000612a23565b831115610131610f13565b600061292e6129278685610d84565b8690612992565b9050600061293c8588612992565b9050600061294a8383612d8a565b9050600061296082670de0b6b3a7640000610d84565b90506128e88a8261252d565b6000670de0b6b3a764000082106129845760006104dc565b50670de0b6b3a76400000390565b60006129a18215156004610f13565b826129ae575060006104dc565b670de0b6b3a7640000838102906129c8908583816113ce57fe5b82600182038161256557fe5b6000806129e18484612db6565b905060006129fb6129f48361271061252d565b6001610d72565b905080821015612a10576000925050506104dc565b612a1a8282610d84565b925050506104dc565b6000828202612a3d84158061139157508385838161138e57fe5b670de0b6b3a764000090049392505050565b6000818060200190518101906104dc919061428c565b6060818060200190518101906105a19190614352565b6000612a8d631c74c91760e11b610797565b909114919050565b6000838311612aa657506000612377565b6000612ab28585612992565b90506000612ac8670de0b6b3a764000088611398565b9050612adc826709b6e64a8ec60000612ec1565b91506000612aea8383612d8a565b90506000612b01612afa8361296c565b8b90612a23565b90506128e88187612a23565b60006060612b1961108d565b600080612b2585612ed8565b91509150612b3d612b34611100565b82106064610f13565b6060612b47611100565b67ffffffffffffffff81118015612b5d57600080fd5b50604051908082528060200260200182016040528015612b87578160200160208202803683370190505b509050612bc6888381518110612b9957fe5b6020026020010151888481518110612bad57fe5b602002602001015185612bbe6104f6565b600754612efa565b818381518110612bd257fe5b6020908102919091010152919791965090945050505050565b600060606000612bfa84612fb7565b90506060612c108683612c0b6104f6565b612fcd565b9196919550909350505050565b60006060612c2961108d565b60606000612c368561307f565b91509150612c478251610610611100565b612c5382610a5e6113e9565b6000612c6b888885612c636104f6565b600754613097565b9050612c7b8282111560cf610f13565b9791965090945050505050565b60006060806000612c988561307f565b91509150612cae612ca7611100565b8351610d65565b612cba82610a5e6113e9565b6000612cd2888885612cca6104f6565b6007546132bc565b9050612c7b8282101560d0610f13565b60006060600080612cf285612ed8565b91509150612d01612b34611100565b6060612d0b611100565b67ffffffffffffffff81118015612d2157600080fd5b50604051908082528060200260200182016040528015612d4b578160200160208202803683370190505b509050612bc6888381518110612d5d57fe5b6020026020010151888481518110612d7157fe5b602002602001015185612d826104f6565b6007546134cd565b600080612d978484612db6565b90506000612daa6129f48361271061252d565b90506123778282610d72565b600081612dcc5750670de0b6b3a76400006104dc565b82612dd9575060006104dc565b612dea600160ff1b84106006610f13565b82612e10770bce5086492111aea88f4bb1ca6bcf584181ea8059f7653284106007610f13565b826000670c7d713b49da000083138015612e315750670f43fc2c04ee000083125b15612e68576000612e418461356f565b9050670de0b6b3a764000080820784020583670de0b6b3a764000083050201915050612e76565b81612e7284613696565b0290505b670de0b6b3a76400009005612eae680238fd42c5cf03ffff198212801590612ea7575068070c1cc73b00c800008213155b6008610f13565b612eb781613a44565b9695505050505050565b600081831015612ed157816105a1565b5090919050565b60008082806020019051810190612eef919061431c565b909590945092505050565b600080612f1184612f0b8188610d84565b90612992565b9050612f2a6709b6e64a8ec60000821015610132610f13565b6000612f48612f41670de0b6b3a764000089611398565b8390612d8a565b90506000612f5f612f588361296c565b8a90612a23565b90506000612f6c8961296c565b90506000612f7a838361252d565b90506000612f888483610d84565b9050612fa7612fa0612f998a61296c565b8490612a23565b8290610d72565b9c9b505050505050505050505050565b6000818060200190518101906105a191906142ef565b60606000612fdb8484611398565b90506060855167ffffffffffffffff81118015612ff757600080fd5b50604051908082528060200260200182016040528015613021578160200160208202803683370190505b50905060005b8651811015613075576130568388838151811061304057fe5b6020026020010151612a2390919063ffffffff16565b82828151811061306257fe5b6020908102919091010152600101613027565b5095945050505050565b6060600082806020019051810190612eef91906142a8565b60006060845167ffffffffffffffff811180156130b357600080fd5b506040519080825280602002602001820160405280156130dd578160200160208202803683370190505b5090506000805b88518110156131a25761313d8982815181106130fc57fe5b6020026020010151612f0b89848151811061311357fe5b60200260200101518c858151811061312757fe5b6020026020010151610d8490919063ffffffff16565b83828151811061314957fe5b60200260200101818152505061319861319189838151811061316757fe5b602002602001015185848151811061317b57fe5b602002602001015161252d90919063ffffffff16565b8390610d72565b91506001016130e4565b50670de0b6b3a764000060005b895181101561329b5760008482815181106131c657fe5b602002602001015184111561321d5760006131ef6131e38661296c565b8d858151811061304057fe5b90506000613203828c868151811061312757fe5b9050613214613191611c138b61296c565b92505050613234565b88828151811061322957fe5b602002602001015190505b600061325d8c848151811061324557fe5b60200260200101516106b5848f878151811061312757fe5b905061328f6132888c858151811061327157fe5b6020026020010151836129d490919063ffffffff16565b8590612a23565b935050506001016131af565b506132af6132a88261296c565b879061252d565b9998505050505050505050565b60006060845167ffffffffffffffff811180156132d857600080fd5b50604051908082528060200260200182016040528015613302578160200160208202803683370190505b5090506000805b88518110156133aa5761336289828151811061332157fe5b60200260200101516106b589848151811061333857fe5b60200260200101518c858151811061334c57fe5b6020026020010151610d7290919063ffffffff16565b83828151811061336e57fe5b6020026020010181815250506133a061319189838151811061338c57fe5b602002602001015185848151811061304057fe5b9150600101613309565b50670de0b6b3a764000060005b895181101561348b576000838583815181106133cf57fe5b6020026020010151111561342b5760006133f46131e386670de0b6b3a7640000610d84565b90506000613408828c868151811061312757fe5b9050613422613191611f42670de0b6b3a76400008c610d84565b92505050613442565b88828151811061343757fe5b602002602001015190505b600061346b8c848151811061345357fe5b60200260200101516106b5848f878151811061334c57fe5b905061347f6132888c858151811061327157fe5b935050506001016133b7565b50670de0b6b3a764000081106134c1576134b76134b082670de0b6b3a7640000610d84565b8790612a23565b9350505050612377565b60009350505050612377565b6000806134de84612f0b8188610d72565b90506134f76729a2241af62c0000821115610133610f13565b600061350e612f41670de0b6b3a764000089612992565b9050600061352e61352783670de0b6b3a7640000610d84565b8a9061252d565b9050600061353b8961296c565b90506000613549838361252d565b905060006135578483610d84565b9050612fa7612fa06135688a61296c565b8490612992565b670de0b6b3a7640000026000806ec097ce7bc90715b34b9f1000000000808401906ec097ce7bc90715b34b9f0fffffffff19850102816135ab57fe5b05905060006ec097ce7bc90715b34b9f100000000082800205905081806ec097ce7bc90715b34b9f100000000081840205915060038205016ec097ce7bc90715b34b9f100000000082840205915060058205016ec097ce7bc90715b34b9f100000000082840205915060078205016ec097ce7bc90715b34b9f100000000082840205915060098205016ec097ce7bc90715b34b9f1000000000828402059150600b8205016ec097ce7bc90715b34b9f1000000000828402059150600d8205016ec097ce7bc90715b34b9f1000000000828402059150600f826002919005919091010295945050505050565b60006136a6600083136064610f13565b670de0b6b3a76400008212156136e1576136d7826ec097ce7bc90715b34b9f1000000000816136d157fe5b05613696565b60000390506106d5565b60007e1600ef3172e58d2e933ec884fde10064c63b5372d805e203c0000000000000831261373257770195e54c5dd42177f53a27172fa9ec630262827000000000830592506806f05b59d3b2000000015b73011798004d755d3c8bc8e03204cf44619e000000831261376a576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff008400083126137b2576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a70083126137ed576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf850831261382457693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e2831261385b57690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d0383126138905768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb4174612111083126138bb57680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d83126138f0576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f17757889379378312613925576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b2866038312613959576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac831261398d576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b600068056bc75e2d63100000840168056bc75e2d6310000080860302816139b057fe5b059050600068056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b6000613a73680238fd42c5cf03ffff198312158015613a6c575068070c1cc73b00c800008313155b6009610f13565b6000821215613aa757613a8882600003613a44565b6ec097ce7bc90715b34b9f100000000081613a9f57fe5b0590506106d5565b60006806f05b59d3b20000008312613ae757506806f05b59d3b1ffffff1990910190770195e54c5dd42177f53a27172fa9ec630262827000000000613b1d565b6803782dace9d90000008312613b1957506803782dace9d8ffffff19909101906b1425982cf597cd205cef7380613b1d565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac620000008412613b6d5768ad78ebc5ac61ffffff199093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d6310000008412613ba9576856bc75e2d630ffffff199093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b188000008412613be357682b5e3af16b187fffff199093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c4000008412613c1d576815af1d78b58c3fffff199093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac62000008412613c5657680ad78ebc5ac61fffff199093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d631000008412613c8f5768056bc75e2d630fffff199093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b18800008412613cc8576802b5e3af16b187ffff199093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c400008412613d015768015af1d78b58c3ffff199093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b80356104dc81614708565b600082601f830112613e3d578081fd5b8151613e50613e4b826146e8565b6146c1565b818152915060208083019084810181840286018201871015613e7157600080fd5b60005b84811015613e9057815184529282019290820190600101613e74565b505050505092915050565b600082601f830112613eab578081fd5b813567ffffffffffffffff811115613ec1578182fd5b613ed4601f8201601f19166020016146c1565b9150808252836020828501011115613eeb57600080fd5b8060208401602084013760009082016020015292915050565b8035600281106104dc57600080fd5b600060208284031215613f24578081fd5b81356105a181614708565b60008060408385031215613f41578081fd5b8235613f4c81614708565b91506020830135613f5c81614708565b809150509250929050565b600080600060608486031215613f7b578081fd5b8335613f8681614708565b92506020840135613f9681614708565b929592945050506040919091013590565b600080600080600080600060e0888a031215613fc1578283fd5b8735613fcc81614708565b96506020880135613fdc81614708565b95506040880135945060608801359350608088013560ff81168114613fff578384fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561402e578182fd5b823561403981614708565b946020939093013593505050565b60008060006060848603121561405b578081fd5b835167ffffffffffffffff80821115614072578283fd5b818601915086601f830112614085578283fd5b8151614093613e4b826146e8565b80828252602080830192508086018b8283870289010111156140b3578788fd5b8796505b848710156140de5780516140ca81614708565b8452600196909601959281019281016140b7565b5089015190975093505050808211156140f5578283fd5b5061410286828701613e2d565b925050604084015190509250925092565b600060208284031215614124578081fd5b81356105a18161471d565b600060208284031215614140578081fd5b81516105a18161471d565b600080600080600080600060e0888a031215614165578081fd5b8735965060208089013561417881614708565b9650604089013561418881614708565b9550606089013567ffffffffffffffff808211156141a4578384fd5b818b0191508b601f8301126141b7578384fd5b81356141c5613e4b826146e8565b8082825285820191508585018f8788860288010111156141e3578788fd5b8795505b838610156142055780358352600195909501949186019186016141e7565b509850505060808b0135955060a08b0135945060c08b013592508083111561422b578384fd5b50506142398a828b01613e9b565b91505092959891949750929550565b600060208284031215614259578081fd5b81356001600160e01b0319811681146105a1578182fd5b600060208284031215614281578081fd5b81516105a181614708565b60006020828403121561429d578081fd5b81516105a18161472b565b6000806000606084860312156142bc578081fd5b83516142c78161472b565b602085015190935067ffffffffffffffff8111156142e3578182fd5b61410286828701613e2d565b60008060408385031215614301578182fd5b825161430c8161472b565b6020939093015192949293505050565b600080600060608486031215614330578081fd5b835161433b8161472b565b602085015160409095015190969495509392505050565b60008060408385031215614364578182fd5b825161436f8161472b565b602084015190925067ffffffffffffffff81111561438b578182fd5b61439785828601613e2d565b9150509250929050565b6000806000606084860312156143b5578081fd5b833567ffffffffffffffff808211156143cc578283fd5b81860191506101208083890312156143e2578384fd5b6143eb816146c1565b90506143f78884613f04565b81526144068860208501613e22565b60208201526144188860408501613e22565b6040820152606083013560608201526080830135608082015260a083013560a08201526144488860c08501613e22565b60c082015261445a8860e08501613e22565b60e08201526101008084013583811115614472578586fd5b61447e8a828701613e9b565b9183019190915250976020870135975060409096013595945050505050565b6000602082840312156144ae578081fd5b5035919050565b6000815180845260208085019450808401835b838110156144e4578151875295820195908201906001016144c8565b509495945050505050565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6000602082526105a160208301846144b5565b60006040825261456c60408301856144b5565b828103602084015261237781856144b5565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b93845260ff9290921660208401526040830152606082015260800190565b6000602080835283518082850152825b8181101561467357858101830151858201604001528201614657565b818111156146845783604083870101525b50601f01601f1916929092016040019392505050565b600083825260406020830152611bb060408301846144b5565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156146e057600080fd5b604052919050565b600067ffffffffffffffff8211156146fe578081fd5b5060209081020190565b6001600160a01b03811681146104f357600080fd5b80151581146104f357600080fd5b600381106104f357600080fdfea2646970667358221220a2c3b62e0bc50507598395387e1557612d7ad59e817ddae4d5279907402fedb464736f6c63430007010033a26469706673582212201bcb3a953b00c5c4dcf4d3cf74f047f69d25320298f41e6f635cb029516f583764736f6c63430007010033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000525760003560e01c80632da47c4014620000575780636634b753146200007a5780638d928af814620000a0578063fbce039314620000b9575b600080fd5b62000061620000d0565b6040516200007192919062000634565b60405180910390f35b620000916200008b366004620003c0565b6200013c565b60405162000071919062000562565b620000aa6200015a565b6040516200007191906200054e565b620000aa620000ca366004620003e6565b6200017e565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200012e57807f000000000000000000000000000000000000000000000000000000000000000003925062278d00915062000137565b60009250600091505b509091565b6001600160a01b031660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008060006200018d620000d0565b9150915060006200019d6200015a565b8a8a8a8a8a88888c604051620001b3906200024b565b620001c7999897969594939291906200056d565b604051809103906000f080158015620001e4573d6000803e3d6000fd5b509050620001f281620001ff565b9998505050505050505050565b6001600160a01b038116600081815260208190526040808220805460ff19166001179055517f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a250565b6158b680620006b183390190565b8035620002668162000697565b92915050565b600082601f8301126200027d578081fd5b8135620002946200028e826200066a565b62000642565b818152915060208083019084810181840286018201871015620002b657600080fd5b60005b84811015620002e2578135620002cf8162000697565b84529282019290820190600101620002b9565b505050505092915050565b600082601f830112620002fe578081fd5b81356200030f6200028e826200066a565b8181529150602080830190848101818402860182018710156200033157600080fd5b60005b84811015620002e25781358452928201929082019060010162000334565b600082601f83011262000363578081fd5b813567ffffffffffffffff8111156200037a578182fd5b6200038f601f8201601f191660200162000642565b9150808252836020828501011115620003a757600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215620003d2578081fd5b8135620003df8162000697565b9392505050565b60008060008060008060c08789031215620003ff578182fd5b863567ffffffffffffffff8082111562000417578384fd5b620004258a838b0162000352565b975060208901359150808211156200043b578384fd5b620004498a838b0162000352565b965060408901359150808211156200045f578384fd5b6200046d8a838b016200026c565b9550606089013591508082111562000483578384fd5b506200049289828a01620002ed565b93505060808701359150620004ab8860a0890162000259565b90509295509295509295565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015620004f557815187529582019590820190600101620004d7565b509495945050505050565b60008151808452815b81811015620005275760208185018101518683018201520162000509565b81811115620005395782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b901515815260200190565b60006101206001600160a01b038c16835260208181850152620005938285018d62000500565b91508382036040850152620005a9828c62000500565b84810360608601528a51808252828c01935090820190845b81811015620005e957620005d685516200068b565b83529383019391830191600101620005c1565b50508481036080860152620005ff818b620004c4565b93505050508560a08301528460c08301528360e083015262000626610100830184620004b7565b9a9950505050505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156200066257600080fd5b604052919050565b600067ffffffffffffffff82111562000681578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114620006ad57600080fd5b5056fe6105006040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b50604051620058b6380380620058b68339810160408190526200005a9162000cf2565b88888888878787878785516002146200007557600162000078565b60025b6040805180820190915260018152603160f81b6020808301918252336080526001600160601b0319606087901b1660a0528b51908c0190812060c0529151902060e0527f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6101005289518a918a918a918a918a918a918a91849184918a918a9162000107916003919062000abb565b5080516200011d90600490602084019062000abb565b50620001359150506276a70083111561019462000865565b6200014962278d0082111561019562000865565b42909101610140819052016101605284516200016b906002111560c862000865565b6200018360088651111560c96200086560201b60201c565b62000199856200087a60201b62000d571760201c565b620001a48462000886565b6040516309b2760f60e01b81526000906001600160a01b038b16906309b2760f90620001d5908c9060040162000eab565b602060405180830381600087803b158015620001f057600080fd5b505af115801562000205573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022b919062000cd9565b9050896001600160a01b03166366a9c7d2828889516001600160401b03811180156200025657600080fd5b5060405190808252806020026020018201604052801562000281578160200160208202803683370190505b506040518463ffffffff1660e01b8152600401620002a29392919062000e0f565b600060405180830381600087803b158015620002bd57600080fd5b505af1158015620002d2573d6000803e3d6000fd5b5050506001600160601b031960608c901b1661018052506101a081905285516101c0528551620003045760006200031b565b856000815181106200031257fe5b60200260200101515b60601b6001600160601b0319166101e05285516001106200033e57600062000355565b856001815181106200034c57fe5b60200260200101515b60601b6001600160601b031916610200528551600210620003785760006200038f565b856002815181106200038657fe5b60200260200101515b60601b6001600160601b031916610220528551600310620003b2576000620003c9565b85600381518110620003c057fe5b60200260200101515b60601b6001600160601b031916610240528551600410620003ec57600062000403565b85600481518110620003fa57fe5b60200260200101515b60601b6001600160601b031916610260528551600510620004265760006200043d565b856005815181106200043457fe5b60200260200101515b60601b6001600160601b0319166102805285516006106200046057600062000477565b856006815181106200046e57fe5b60200260200101515b60601b6001600160601b0319166102a05285516007106200049a576000620004b1565b85600781518110620004a857fe5b60200260200101515b60601b6001600160601b0319166102c0528551620004d1576000620004f7565b620004f786600081518110620004e357fe5b6020026020010151620008f560201b60201c565b6102e05285516001106200050d5760006200051f565b6200051f86600181518110620004e357fe5b6103005285516002106200053557600062000547565b6200054786600281518110620004e357fe5b6103205285516003106200055d5760006200056f565b6200056f86600381518110620004e357fe5b6103405285516004106200058557600062000597565b6200059786600481518110620004e357fe5b610360528551600510620005ad576000620005bf565b620005bf86600581518110620004e357fe5b610380528551600610620005d5576000620005e7565b620005e786600681518110620004e357fe5b6103a0528551600710620005fd5760006200060f565b6200060f86600781518110620004e357fe5b6103c08181525050505050505050505050505050505050505050600086519050620006478187516200099760201b62000d651760201c565b6000806000805b848160ff161015620006cd5760008a8260ff16815181106200066c57fe5b6020026020010151905062000694662386f26fc1000082101561012e6200086560201b60201c565b620006ae8186620009a660201b62000d721790919060201c565b945082811115620006c3578160ff1693508092505b506001016200064e565b50620006e6670de0b6b3a7640000841461013462000865565b6103e08290528851620006fb57600062000712565b886000815181106200070957fe5b60200260200101515b610400528851600110620007285760006200073f565b886001815181106200073657fe5b60200260200101515b610420528851600210620007555760006200076c565b886002815181106200076357fe5b60200260200101515b6104405288516003106200078257600062000799565b886003815181106200079057fe5b60200260200101515b610460528851600410620007af576000620007c6565b88600481518110620007bd57fe5b60200260200101515b610480528851600510620007dc576000620007f3565b88600581518110620007ea57fe5b60200260200101515b6104a05288516006106200080957600062000820565b886006815181106200081757fe5b60200260200101515b6104c0528851600710620008365760006200084d565b886007815181106200084457fe5b60200260200101515b6104e0525062000f329b505050505050505050505050565b8162000876576200087681620009c3565b5050565b80620008768162000a16565b6200089b64e8d4a5100082101560cb62000865565b620008b367016345785d8a000082111560ca62000865565b60078190556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90620008ea90839062000ec0565b60405180910390a150565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200093257600080fd5b505afa15801562000947573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200096d919062000dec565b60ff16905060006200098c60128362000aa360201b62000d841760201c565b600a0a949350505050565b62000876828214606762000865565b6000828201620009ba848210158362000865565b90505b92915050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b60028151101562000a275762000aa0565b60008160008151811062000a3757fe5b602002602001015190506000600190505b825181101562000a9d57600083828151811062000a6157fe5b6020026020010151905062000a92816001600160a01b0316846001600160a01b03161060656200086560201b60201c565b915060010162000a48565b50505b50565b600062000ab583831115600162000865565b50900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000afe57805160ff191683800117855562000b2e565b8280016001018555821562000b2e579182015b8281111562000b2e57825182559160200191906001019062000b11565b5062000b3c92915062000b40565b5090565b5b8082111562000b3c576000815560010162000b41565b8051620009bd8162000f1c565b600082601f83011262000b75578081fd5b815162000b8c62000b868262000ef0565b62000ec9565b81815291506020808301908481018184028601820187101562000bae57600080fd5b60005b8481101562000bda57815162000bc78162000f1c565b8452928201929082019060010162000bb1565b505050505092915050565b600082601f83011262000bf6578081fd5b815162000c0762000b868262000ef0565b81815291506020808301908481018184028601820187101562000c2957600080fd5b60005b8481101562000bda5781518452928201929082019060010162000c2c565b600082601f83011262000c5b578081fd5b81516001600160401b0381111562000c71578182fd5b602062000c87601f8301601f1916820162000ec9565b9250818352848183860101111562000c9e57600080fd5b60005b8281101562000cbe57848101820151848201830152810162000ca1565b8281111562000cd05760008284860101525b50505092915050565b60006020828403121562000ceb578081fd5b5051919050565b60008060008060008060008060006101208a8c03121562000d11578485fd5b62000d1d8b8b62000b57565b60208b01519099506001600160401b038082111562000d3a578687fd5b62000d488d838e0162000c4a565b995060408c015191508082111562000d5e578687fd5b62000d6c8d838e0162000c4a565b985060608c015191508082111562000d82578687fd5b62000d908d838e0162000b64565b975060808c015191508082111562000da6578687fd5b5062000db58c828d0162000be5565b95505060a08a0151935060c08a0151925060e08a0151915062000ddd8b6101008c0162000b57565b90509295985092959850929598565b60006020828403121562000dfe578081fd5b815160ff81168114620009ba578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000e5b5762000e48855162000f10565b8352938301939183019160010162000e33565b505084810360408601528551808252908201925081860190845b8181101562000e9d5762000e8a835162000f10565b8552938301939183019160010162000e75565b509298975050505050505050565b602081016003831062000eba57fe5b91905290565b90815260200190565b6040518181016001600160401b038111828210171562000ee857600080fd5b604052919050565b60006001600160401b0382111562000f06578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b038116811462000aa057600080fd5b60805160a05160601c60c05160e051610100516101205161014051610160516101805160601c6101a0516101c0516101e05160601c6102005160601c6102205160601c6102405160601c6102605160601c6102805160601c6102a05160601c6102c05160601c6102e05161030051610320516103405161036051610380516103a0516103c0516103e05161040051610420516104405161046051610480516104a0516104c0516104e05161476e6200114860003980611ec55280612857525080611e8252806127f6525080611e3f5280612795525080611dfc5280612734525080611db952806126d3525080611d765280612672525080611d335280612611525080611cf052806125b05250806122d0528061230452806123405250806116285280611b1e5250806115e55280611abd5250806115a25280611a5c52508061155f52806119fb52508061151c528061199a5250806114d9528061193952508061149652806118d85250806114455280611877525080611ae3528061281c525080611a8252806127bb525080611a21528061275a5250806119c052806126f952508061195f52806126985250806118fe528061263752508061189d52806125d652508061183c52806125755250806111025250806105d7525080610835525080610ef1525080610ecd525080610ab5525080610ff452508061103652508061101552508061081152508061079b525061476e6000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80637ecebe001161010f578063a9059cbb116100a2578063d5c096c411610071578063d5c096c4146103e6578063d73dd623146103f9578063dd62ed3e1461040c578063f89f27ed1461041f576101f0565b8063a9059cbb146103b0578063aaabadc5146103c3578063c0ff1a15146103cb578063d505accf146103d3576101f0565b80638d928af8116100de5780638d928af81461038557806395d89b411461038d5780639b02cdde146103955780639d2c110c1461039d576101f0565b80637ecebe0014610337578063851c1bb31461034a57806387ec68171461035d578063893d20e814610370576101f0565b806338e9922e11610187578063661884631161015657806366188463146102e8578063679aefce146102fb57806370a082311461030357806374f3b00914610316576101f0565b806338e9922e146102a457806338fff2d0146102b757806355c67628146102bf5780636028bfd4146102c7576101f0565b80631c0de051116101c35780631c0de0511461025d57806323b872dd14610274578063313ce567146102875780633644e5151461029c576101f0565b806306fdde03146101f5578063095ea7b31461021357806316c38b3c1461023357806318160ddd14610248575b600080fd5b6101fd610434565b60405161020a9190614647565b60405180910390f35b61022661022136600461401c565b6104cb565b60405161020a919061457e565b610246610241366004614113565b6104e2565b005b6102506104f6565b60405161020a91906145a1565b6102656104fc565b60405161020a93929190614589565b610226610282366004613f67565b610525565b61028f6105a8565b60405161020a91906146b3565b6102506105ad565b6102466102b236600461449d565b6105bc565b6102506105d5565b6102506105f9565b6102da6102d536600461414b565b6105ff565b60405161020a92919061469a565b6102266102f636600461401c565b610636565b610250610690565b610250610311366004613f13565b6106bb565b61032961032436600461414b565b6106da565b60405161020a929190614559565b610250610345366004613f13565b61077c565b610250610358366004614248565b610797565b6102da61036b36600461414b565b6107e9565b61037861080f565b60405161020a9190614532565b610378610833565b6101fd610857565b6102506108b8565b6102506103ab3660046143a1565b6108be565b6102266103be36600461401c565b6109a5565b6103786109b2565b6102506109bc565b6102466103e1366004613fa7565b610a80565b6103296103f436600461414b565b610bc9565b61022661040736600461401c565b610cec565b61025061041a366004613f2f565b610d22565b610427610d4d565b60405161020a9190614546565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104c05780601f10610495576101008083540402835291602001916104c0565b820191906000526020600020905b8154815290600101906020018083116104a357829003601f168201915b505050505090505b90565b60006104d8338484610d9a565b5060015b92915050565b6104ea610e02565b6104f381610e30565b50565b60025490565b6000806000610509610eae565b159250610514610ecb565b915061051e610eef565b9050909192565b6001600160a01b0383166000818152600160209081526040808320338085529252822054919261056391148061055b5750838210155b610197610f13565b61056e858585610f21565b336001600160a01b0386161480159061058957506000198114155b1561059b5761059b8533858403610d9a565b60019150505b9392505050565b601290565b60006105b7610ff0565b905090565b6105c4610e02565b6105cc61108d565b6104f3816110a2565b7f000000000000000000000000000000000000000000000000000000000000000090565b60075490565b600060606106158651610610611100565b610d65565b61062a898989898989896111246111ec611252565b97509795505050505050565b3360009081526001602090815260408083206001600160a01b03861684529091528120548083106106725761066d33856000610d9a565b610686565b61068633856106818487610d84565b610d9a565b5060019392505050565b60006105b761069d6104f6565b6106b56106a86109bc565b6106b0611100565b611374565b90611398565b6001600160a01b0381166000908152602081905260409020545b919050565b606080886107046106e9610833565b6001600160a01b0316336001600160a01b03161460cd610f13565b61071961070f6105d5565b82146101f4610f13565b60606107236113e9565b905061072f8882611666565b60006060806107438e8e8e8e8e8e8e611124565b9250925092506107538d846116c7565b61075d82856111ec565b61076781856111ec565b909550935050505b5097509795505050505050565b6001600160a01b031660009081526005602052604090205490565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016107cc9291906144ef565b604051602081830303815290604052805190602001209050919050565b600060606107fa8651610610611100565b61062a8989898989898961175a6117d7611252565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104c05780601f10610495576101008083540402835291602001916104c0565b60085490565b6000806108ce8560200151611838565b905060006108df8660400151611838565b90506000865160018111156108f057fe5b1415610956576109038660600151611b4d565b60608701526109128583611b71565b945061091e8482611b71565b935061092e866060015183611b71565b60608701526000610940878787611b7d565b905061094c8183611bb8565b93505050506105a1565b6109608583611b71565b945061096c8482611b71565b935061097c866060015182611b71565b6060870152600061098e878787611bc4565b905061099a8184611bf7565b905061094c81611c03565b60006104d8338484610f21565b60006105b7611c1a565b600060606109c8610833565b6001600160a01b031663f94d46686109de6105d5565b6040518263ffffffff1660e01b81526004016109fa91906145a1565b60006040518083038186803b158015610a1257600080fd5b505afa158015610a26573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a4e9190810190614047565b50915050610a6381610a5e6113e9565b611666565b6060610a6d611c94565b9050610a798183611ef1565b9250505090565b610a8e8442111560d1610f13565b6001600160a01b0387166000908152600560209081526040808320549051909291610ae5917f0000000000000000000000000000000000000000000000000000000000000000918c918c918c9188918d91016145c9565b6040516020818303038152906040528051906020012090506000610b0882611f63565b9050600060018288888860405160008152602001604052604051610b2f9493929190614629565b6020604051602081039080840390855afa158015610b51573d6000803e3d6000fd5b5050604051601f1901519150610b9390506001600160a01b03821615801590610b8b57508b6001600160a01b0316826001600160a01b0316145b6101f8610f13565b6001600160a01b038b166000908152600560205260409020600185019055610bbc8b8b8b610d9a565b5050505050505050505050565b60608088610bd86106e9610833565b610be361070f6105d5565b6060610bed6113e9565b9050610bf76104f6565b610c9d5760006060610c0b8d8d8d8a611f7f565b91509150610c20620f424083101560cc610f13565b610c2e6000620f424061201a565b610c3d8b620f4240840361201a565b610c4781846117d7565b80610c50611100565b67ffffffffffffffff81118015610c6657600080fd5b50604051908082528060200260200182016040528015610c90578160200160208202803683370190505b509550955050505061076f565b610ca78882611666565b6000606080610cbb8e8e8e8e8e8e8e61175a565b925092509250610ccb8c8461201a565b610cd582856117d7565b610cdf81856111ec565b909550935061076f915050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916104d89185906106819086610d72565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60606105b7611c94565b80610d61816120b0565b5050565b610d618183146067610f13565b60008282016105a18482101583610f13565b6000610d94838311156001610f13565b50900390565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610df59085906145a1565b60405180910390a3505050565b6000610e196000356001600160e01b031916610797565b90506104f3610e288233612129565b610191610f13565b8015610e5057610e4b610e41610ecb565b4210610193610f13565b610e65565b610e65610e5b610eef565b42106101a9610f13565b6006805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490610ea390839061457e565b60405180910390a150565b6000610eb8610eef565b4211806105b757505060065460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b81610d6157610d6181612219565b6001600160a01b038316600090815260208190526040902054610f4982821015610196610f13565b610f606001600160a01b0384161515610199610f13565b6001600160a01b03808516600090815260208190526040808220858503905591851681522054610f909083610d72565b6001600160a01b0380851660008181526020819052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610fe29086906145a1565b60405180910390a350505050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061105d61226c565b306040516020016110729594939291906145fd565b60405160208183030381529060405280519060200120905090565b6110a0611098610eae565b610192610f13565b565b6110b564e8d4a5100082101560cb610f13565b6110cb67016345785d8a000082111560ca610f13565b60078190556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90610ea39083906145a1565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006060806060611133611c94565b905061113d610eae565b1561117457600061114e828a611ef1565b905061115f8983600854848b612270565b925061116e8984610d84612380565b506111c0565b61117c611100565b67ffffffffffffffff8111801561119257600080fd5b506040519080825280602002602001820160405280156111bc578160200160208202803683370190505b5091505b6111cb8882876123eb565b90945092506111db888483612458565b600855509750975097945050505050565b60005b6111f7611100565b81101561124d5761122e83828151811061120d57fe5b602002602001015183838151811061122157fe5b6020026020010151612471565b83828151811061123a57fe5b60209081029190910101526001016111ef565b505050565b333014611310576000306001600160a01b0316600036604051611276929190614507565b6000604051808303816000865af19150503d80600081146112b3576040519150601f19603f3d011682016040523d82523d6000602084013e6112b8565b606091505b5050905080600081146112c757fe5b60046000803e6000516001600160e01b0319166343adbafb60e01b81146112f2573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b606061131a6113e9565b90506113268782611666565b6000606061133d8c8c8c8c8c8c8c8c63ffffffff16565b509150915061135081848663ffffffff16565b8051601f1982018390526343adbafb603f1983015260200260231982016044820181fd5b60008282026105a184158061139157508385838161138e57fe5b04145b6003610f13565b60006113a78215156004610f13565b826113b4575060006104dc565b670de0b6b3a7640000838102906113d7908583816113ce57fe5b04146005610f13565b8281816113e057fe5b049150506104dc565b606060006113f5611100565b905060608167ffffffffffffffff8111801561141057600080fd5b5060405190808252806020026020018201604052801561143a578160200160208202803683370190505b5090508115611482577f00000000000000000000000000000000000000000000000000000000000000008160008151811061147157fe5b60200260200101818152505061148b565b91506104c89050565b6001821115611482577f0000000000000000000000000000000000000000000000000000000000000000816001815181106114c257fe5b6020026020010181815250506002821115611482577f00000000000000000000000000000000000000000000000000000000000000008160028151811061150557fe5b6020026020010181815250506003821115611482577f00000000000000000000000000000000000000000000000000000000000000008160038151811061154857fe5b6020026020010181815250506004821115611482577f00000000000000000000000000000000000000000000000000000000000000008160048151811061158b57fe5b6020026020010181815250506005821115611482577f0000000000000000000000000000000000000000000000000000000000000000816005815181106115ce57fe5b6020026020010181815250506006821115611482577f00000000000000000000000000000000000000000000000000000000000000008160068151811061161157fe5b6020026020010181815250506007821115611482577f00000000000000000000000000000000000000000000000000000000000000008160078151811061165457fe5b60200260200101818152505091505090565b60005b611671611100565b81101561124d576116a883828151811061168757fe5b602002602001015183838151811061169b57fe5b6020026020010151611374565b8382815181106116b457fe5b6020908102919091010152600101611669565b6001600160a01b0382166000908152602081905260409020546116ef82821015610196610f13565b6001600160a01b038316600090815260208190526040902082820390556002546117199083610d84565b6002556040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610df59086906145a1565b600060608061176761108d565b6060611771611c94565b9050600061177f828a611ef1565b905060606117928a84600854858c612270565b90506117a18a82610d84612380565b600060606117b08c868b612491565b915091506117bf8c82876124eb565b600855909e909d50909b509950505050505050505050565b60005b6117e2611100565b81101561124d576118198382815181106117f857fe5b602002602001015183838151811061180c57fe5b60200260200101516124fa565b83828151811061182557fe5b60209081029190910101526001016117da565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561189b57507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156118fc57507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561195d57507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156119be57507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611a1f57507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611a8057507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611ae157507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611b4257507f00000000000000000000000000000000000000000000000000000000000000006106d5565b6106d5610135612219565b600080611b656007548461252d90919063ffffffff16565b90506105a18382610d84565b60006105a18383611374565b6000611b8761108d565b611bb083611b988660200151612571565b84611ba68860400151612571565b886060015161287b565b949350505050565b60006105a18383612471565b6000611bce61108d565b611bb083611bdf8660200151612571565b84611bed8860400151612571565b88606001516128f6565b60006105a183836124fa565b60006104dc611c1360075461296c565b8390612992565b6000611c24610833565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015611c5c57600080fd5b505afa158015611c70573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190614270565b60606000611ca0611100565b905060608167ffffffffffffffff81118015611cbb57600080fd5b50604051908082528060200260200182016040528015611ce5578160200160208202803683370190505b5090508115611482577f000000000000000000000000000000000000000000000000000000000000000081600081518110611d1c57fe5b6020026020010181815250506001821115611482577f000000000000000000000000000000000000000000000000000000000000000081600181518110611d5f57fe5b6020026020010181815250506002821115611482577f000000000000000000000000000000000000000000000000000000000000000081600281518110611da257fe5b6020026020010181815250506003821115611482577f000000000000000000000000000000000000000000000000000000000000000081600381518110611de557fe5b6020026020010181815250506004821115611482577f000000000000000000000000000000000000000000000000000000000000000081600481518110611e2857fe5b6020026020010181815250506005821115611482577f000000000000000000000000000000000000000000000000000000000000000081600581518110611e6b57fe5b6020026020010181815250506006821115611482577f000000000000000000000000000000000000000000000000000000000000000081600681518110611eae57fe5b6020026020010181815250506007821115611482577f00000000000000000000000000000000000000000000000000000000000000008160078151811061165457fe5b670de0b6b3a764000060005b8351811015611f5357611f49611f42858381518110611f1857fe5b6020026020010151858481518110611f2c57fe5b60200260200101516129d490919063ffffffff16565b8390612a23565b9150600101611efd565b506104dc60008211610137610f13565b6000611f6d610ff0565b826040516020016107cc929190614517565b60006060611f8b61108d565b6000611f9684612a4f565b9050611fb16000826002811115611fa957fe5b1460ce610f13565b6060611fbc85612a65565b9050611fd0611fc9611100565b8251610d65565b611fdc81610a5e6113e9565b6060611fe6611c94565b90506000611ff48284611ef1565b90506000612004826106b0611100565b6008929092555099919850909650505050505050565b6001600160a01b03821660009081526020819052604090205461203d9082610d72565b6001600160a01b0383166000908152602081905260409020556002546120639082610d72565b6002556040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906120a49085906145a1565b60405180910390a35050565b6002815110156120bf576104f3565b6000816000815181106120ce57fe5b602002602001015190506000600190505b825181101561124d5760008382815181106120f657fe5b6020026020010151905061211f816001600160a01b0316846001600160a01b0316106065610f13565b91506001016120df565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b61214861080f565b6001600160a01b031614158015612163575061216383612a7b565b1561218b5761217061080f565b6001600160a01b0316336001600160a01b03161490506104dc565b612193611c1a565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016121c2939291906145aa565b60206040518083038186803b1580156121da57600080fd5b505afa1580156121ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612212919061412f565b90506104dc565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b4690565b60608061227b611100565b67ffffffffffffffff8111801561229157600080fd5b506040519080825280602002602001820160405280156122bb578160200160208202803683370190505b509050826122ca579050612377565b61233d877f0000000000000000000000000000000000000000000000000000000000000000815181106122f957fe5b6020026020010151877f00000000000000000000000000000000000000000000000000000000000000008151811061232d57fe5b6020026020010151878787612a95565b817f00000000000000000000000000000000000000000000000000000000000000008151811061236957fe5b602090810291909101015290505b95945050505050565b60005b61238b611100565b8110156123e5576123c68482815181106123a157fe5b60200260200101518483815181106123b557fe5b60200260200101518463ffffffff16565b8482815181106123d257fe5b6020908102919091010152600101612383565b50505050565b6000606060006123fa84612a4f565b9050600081600281111561240a57fe5b14156124255761241b868686612b0d565b9250925050612450565b600181600281111561243357fe5b14156124435761241b8685612beb565b61241b868686612c1d565b505b935093915050565b60006124678484610d84612380565b611bb08285611ef1565b60006124808215156004610f13565b81838161248957fe5b049392505050565b6000606060006124a084612a4f565b905060018160028111156124b057fe5b14156124c15761241b868686612c88565b60028160028111156124cf57fe5b14156124e05761241b868686612ce2565b61244e610136612219565b60006124678484610d72612380565b60006125098215156004610f13565b82612516575060006104dc565b81600184038161252257fe5b0460010190506104dc565b600082820261254784158061139157508385838161138e57fe5b806125565760009150506104dc565b670de0b6b3a764000060001982015b046001019150506104dc565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156125d457507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561263557507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561269657507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156126f757507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561275857507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156127b957507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561281a57507f00000000000000000000000000000000000000000000000000000000000000006106d5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611b4257507f00000000000000000000000000000000000000000000000000000000000000006106d5565b600061289d61289287670429d069189e0000612a23565b831115610130610f13565b60006128a98784610d72565b905060006128b78883612992565b905060006128c58887611398565b905060006128d38383612d8a565b90506128e86128e18261296c565b8990612a23565b9a9950505050505050505050565b600061291861290d85670429d069189e0000612a23565b831115610131610f13565b600061292e6129278685610d84565b8690612992565b9050600061293c8588612992565b9050600061294a8383612d8a565b9050600061296082670de0b6b3a7640000610d84565b90506128e88a8261252d565b6000670de0b6b3a764000082106129845760006104dc565b50670de0b6b3a76400000390565b60006129a18215156004610f13565b826129ae575060006104dc565b670de0b6b3a7640000838102906129c8908583816113ce57fe5b82600182038161256557fe5b6000806129e18484612db6565b905060006129fb6129f48361271061252d565b6001610d72565b905080821015612a10576000925050506104dc565b612a1a8282610d84565b925050506104dc565b6000828202612a3d84158061139157508385838161138e57fe5b670de0b6b3a764000090049392505050565b6000818060200190518101906104dc919061428c565b6060818060200190518101906105a19190614352565b6000612a8d631c74c91760e11b610797565b909114919050565b6000838311612aa657506000612377565b6000612ab28585612992565b90506000612ac8670de0b6b3a764000088611398565b9050612adc826709b6e64a8ec60000612ec1565b91506000612aea8383612d8a565b90506000612b01612afa8361296c565b8b90612a23565b90506128e88187612a23565b60006060612b1961108d565b600080612b2585612ed8565b91509150612b3d612b34611100565b82106064610f13565b6060612b47611100565b67ffffffffffffffff81118015612b5d57600080fd5b50604051908082528060200260200182016040528015612b87578160200160208202803683370190505b509050612bc6888381518110612b9957fe5b6020026020010151888481518110612bad57fe5b602002602001015185612bbe6104f6565b600754612efa565b818381518110612bd257fe5b6020908102919091010152919791965090945050505050565b600060606000612bfa84612fb7565b90506060612c108683612c0b6104f6565b612fcd565b9196919550909350505050565b60006060612c2961108d565b60606000612c368561307f565b91509150612c478251610610611100565b612c5382610a5e6113e9565b6000612c6b888885612c636104f6565b600754613097565b9050612c7b8282111560cf610f13565b9791965090945050505050565b60006060806000612c988561307f565b91509150612cae612ca7611100565b8351610d65565b612cba82610a5e6113e9565b6000612cd2888885612cca6104f6565b6007546132bc565b9050612c7b8282101560d0610f13565b60006060600080612cf285612ed8565b91509150612d01612b34611100565b6060612d0b611100565b67ffffffffffffffff81118015612d2157600080fd5b50604051908082528060200260200182016040528015612d4b578160200160208202803683370190505b509050612bc6888381518110612d5d57fe5b6020026020010151888481518110612d7157fe5b602002602001015185612d826104f6565b6007546134cd565b600080612d978484612db6565b90506000612daa6129f48361271061252d565b90506123778282610d72565b600081612dcc5750670de0b6b3a76400006104dc565b82612dd9575060006104dc565b612dea600160ff1b84106006610f13565b82612e10770bce5086492111aea88f4bb1ca6bcf584181ea8059f7653284106007610f13565b826000670c7d713b49da000083138015612e315750670f43fc2c04ee000083125b15612e68576000612e418461356f565b9050670de0b6b3a764000080820784020583670de0b6b3a764000083050201915050612e76565b81612e7284613696565b0290505b670de0b6b3a76400009005612eae680238fd42c5cf03ffff198212801590612ea7575068070c1cc73b00c800008213155b6008610f13565b612eb781613a44565b9695505050505050565b600081831015612ed157816105a1565b5090919050565b60008082806020019051810190612eef919061431c565b909590945092505050565b600080612f1184612f0b8188610d84565b90612992565b9050612f2a6709b6e64a8ec60000821015610132610f13565b6000612f48612f41670de0b6b3a764000089611398565b8390612d8a565b90506000612f5f612f588361296c565b8a90612a23565b90506000612f6c8961296c565b90506000612f7a838361252d565b90506000612f888483610d84565b9050612fa7612fa0612f998a61296c565b8490612a23565b8290610d72565b9c9b505050505050505050505050565b6000818060200190518101906105a191906142ef565b60606000612fdb8484611398565b90506060855167ffffffffffffffff81118015612ff757600080fd5b50604051908082528060200260200182016040528015613021578160200160208202803683370190505b50905060005b8651811015613075576130568388838151811061304057fe5b6020026020010151612a2390919063ffffffff16565b82828151811061306257fe5b6020908102919091010152600101613027565b5095945050505050565b6060600082806020019051810190612eef91906142a8565b60006060845167ffffffffffffffff811180156130b357600080fd5b506040519080825280602002602001820160405280156130dd578160200160208202803683370190505b5090506000805b88518110156131a25761313d8982815181106130fc57fe5b6020026020010151612f0b89848151811061311357fe5b60200260200101518c858151811061312757fe5b6020026020010151610d8490919063ffffffff16565b83828151811061314957fe5b60200260200101818152505061319861319189838151811061316757fe5b602002602001015185848151811061317b57fe5b602002602001015161252d90919063ffffffff16565b8390610d72565b91506001016130e4565b50670de0b6b3a764000060005b895181101561329b5760008482815181106131c657fe5b602002602001015184111561321d5760006131ef6131e38661296c565b8d858151811061304057fe5b90506000613203828c868151811061312757fe5b9050613214613191611c138b61296c565b92505050613234565b88828151811061322957fe5b602002602001015190505b600061325d8c848151811061324557fe5b60200260200101516106b5848f878151811061312757fe5b905061328f6132888c858151811061327157fe5b6020026020010151836129d490919063ffffffff16565b8590612a23565b935050506001016131af565b506132af6132a88261296c565b879061252d565b9998505050505050505050565b60006060845167ffffffffffffffff811180156132d857600080fd5b50604051908082528060200260200182016040528015613302578160200160208202803683370190505b5090506000805b88518110156133aa5761336289828151811061332157fe5b60200260200101516106b589848151811061333857fe5b60200260200101518c858151811061334c57fe5b6020026020010151610d7290919063ffffffff16565b83828151811061336e57fe5b6020026020010181815250506133a061319189838151811061338c57fe5b602002602001015185848151811061304057fe5b9150600101613309565b50670de0b6b3a764000060005b895181101561348b576000838583815181106133cf57fe5b6020026020010151111561342b5760006133f46131e386670de0b6b3a7640000610d84565b90506000613408828c868151811061312757fe5b9050613422613191611f42670de0b6b3a76400008c610d84565b92505050613442565b88828151811061343757fe5b602002602001015190505b600061346b8c848151811061345357fe5b60200260200101516106b5848f878151811061334c57fe5b905061347f6132888c858151811061327157fe5b935050506001016133b7565b50670de0b6b3a764000081106134c1576134b76134b082670de0b6b3a7640000610d84565b8790612a23565b9350505050612377565b60009350505050612377565b6000806134de84612f0b8188610d72565b90506134f76729a2241af62c0000821115610133610f13565b600061350e612f41670de0b6b3a764000089612992565b9050600061352e61352783670de0b6b3a7640000610d84565b8a9061252d565b9050600061353b8961296c565b90506000613549838361252d565b905060006135578483610d84565b9050612fa7612fa06135688a61296c565b8490612992565b670de0b6b3a7640000026000806ec097ce7bc90715b34b9f1000000000808401906ec097ce7bc90715b34b9f0fffffffff19850102816135ab57fe5b05905060006ec097ce7bc90715b34b9f100000000082800205905081806ec097ce7bc90715b34b9f100000000081840205915060038205016ec097ce7bc90715b34b9f100000000082840205915060058205016ec097ce7bc90715b34b9f100000000082840205915060078205016ec097ce7bc90715b34b9f100000000082840205915060098205016ec097ce7bc90715b34b9f1000000000828402059150600b8205016ec097ce7bc90715b34b9f1000000000828402059150600d8205016ec097ce7bc90715b34b9f1000000000828402059150600f826002919005919091010295945050505050565b60006136a6600083136064610f13565b670de0b6b3a76400008212156136e1576136d7826ec097ce7bc90715b34b9f1000000000816136d157fe5b05613696565b60000390506106d5565b60007e1600ef3172e58d2e933ec884fde10064c63b5372d805e203c0000000000000831261373257770195e54c5dd42177f53a27172fa9ec630262827000000000830592506806f05b59d3b2000000015b73011798004d755d3c8bc8e03204cf44619e000000831261376a576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff008400083126137b2576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a70083126137ed576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf850831261382457693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e2831261385b57690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d0383126138905768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb4174612111083126138bb57680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d83126138f0576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f17757889379378312613925576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b2866038312613959576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac831261398d576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b600068056bc75e2d63100000840168056bc75e2d6310000080860302816139b057fe5b059050600068056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b6000613a73680238fd42c5cf03ffff198312158015613a6c575068070c1cc73b00c800008313155b6009610f13565b6000821215613aa757613a8882600003613a44565b6ec097ce7bc90715b34b9f100000000081613a9f57fe5b0590506106d5565b60006806f05b59d3b20000008312613ae757506806f05b59d3b1ffffff1990910190770195e54c5dd42177f53a27172fa9ec630262827000000000613b1d565b6803782dace9d90000008312613b1957506803782dace9d8ffffff19909101906b1425982cf597cd205cef7380613b1d565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac620000008412613b6d5768ad78ebc5ac61ffffff199093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d6310000008412613ba9576856bc75e2d630ffffff199093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b188000008412613be357682b5e3af16b187fffff199093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c4000008412613c1d576815af1d78b58c3fffff199093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac62000008412613c5657680ad78ebc5ac61fffff199093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d631000008412613c8f5768056bc75e2d630fffff199093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b18800008412613cc8576802b5e3af16b187ffff199093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c400008412613d015768015af1d78b58c3ffff199093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b80356104dc81614708565b600082601f830112613e3d578081fd5b8151613e50613e4b826146e8565b6146c1565b818152915060208083019084810181840286018201871015613e7157600080fd5b60005b84811015613e9057815184529282019290820190600101613e74565b505050505092915050565b600082601f830112613eab578081fd5b813567ffffffffffffffff811115613ec1578182fd5b613ed4601f8201601f19166020016146c1565b9150808252836020828501011115613eeb57600080fd5b8060208401602084013760009082016020015292915050565b8035600281106104dc57600080fd5b600060208284031215613f24578081fd5b81356105a181614708565b60008060408385031215613f41578081fd5b8235613f4c81614708565b91506020830135613f5c81614708565b809150509250929050565b600080600060608486031215613f7b578081fd5b8335613f8681614708565b92506020840135613f9681614708565b929592945050506040919091013590565b600080600080600080600060e0888a031215613fc1578283fd5b8735613fcc81614708565b96506020880135613fdc81614708565b95506040880135945060608801359350608088013560ff81168114613fff578384fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561402e578182fd5b823561403981614708565b946020939093013593505050565b60008060006060848603121561405b578081fd5b835167ffffffffffffffff80821115614072578283fd5b818601915086601f830112614085578283fd5b8151614093613e4b826146e8565b80828252602080830192508086018b8283870289010111156140b3578788fd5b8796505b848710156140de5780516140ca81614708565b8452600196909601959281019281016140b7565b5089015190975093505050808211156140f5578283fd5b5061410286828701613e2d565b925050604084015190509250925092565b600060208284031215614124578081fd5b81356105a18161471d565b600060208284031215614140578081fd5b81516105a18161471d565b600080600080600080600060e0888a031215614165578081fd5b8735965060208089013561417881614708565b9650604089013561418881614708565b9550606089013567ffffffffffffffff808211156141a4578384fd5b818b0191508b601f8301126141b7578384fd5b81356141c5613e4b826146e8565b8082825285820191508585018f8788860288010111156141e3578788fd5b8795505b838610156142055780358352600195909501949186019186016141e7565b509850505060808b0135955060a08b0135945060c08b013592508083111561422b578384fd5b50506142398a828b01613e9b565b91505092959891949750929550565b600060208284031215614259578081fd5b81356001600160e01b0319811681146105a1578182fd5b600060208284031215614281578081fd5b81516105a181614708565b60006020828403121561429d578081fd5b81516105a18161472b565b6000806000606084860312156142bc578081fd5b83516142c78161472b565b602085015190935067ffffffffffffffff8111156142e3578182fd5b61410286828701613e2d565b60008060408385031215614301578182fd5b825161430c8161472b565b6020939093015192949293505050565b600080600060608486031215614330578081fd5b835161433b8161472b565b602085015160409095015190969495509392505050565b60008060408385031215614364578182fd5b825161436f8161472b565b602084015190925067ffffffffffffffff81111561438b578182fd5b61439785828601613e2d565b9150509250929050565b6000806000606084860312156143b5578081fd5b833567ffffffffffffffff808211156143cc578283fd5b81860191506101208083890312156143e2578384fd5b6143eb816146c1565b90506143f78884613f04565b81526144068860208501613e22565b60208201526144188860408501613e22565b6040820152606083013560608201526080830135608082015260a083013560a08201526144488860c08501613e22565b60c082015261445a8860e08501613e22565b60e08201526101008084013583811115614472578586fd5b61447e8a828701613e9b565b9183019190915250976020870135975060409096013595945050505050565b6000602082840312156144ae578081fd5b5035919050565b6000815180845260208085019450808401835b838110156144e4578151875295820195908201906001016144c8565b509495945050505050565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6000602082526105a160208301846144b5565b60006040825261456c60408301856144b5565b828103602084015261237781856144b5565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b93845260ff9290921660208401526040830152606082015260800190565b6000602080835283518082850152825b8181101561467357858101830151858201604001528201614657565b818111156146845783604083870101525b50601f01601f1916929092016040019392505050565b600083825260406020830152611bb060408301846144b5565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156146e057600080fd5b604052919050565b600067ffffffffffffffff8211156146fe578081fd5b5060209081020190565b6001600160a01b03811681146104f357600080fd5b80151581146104f357600080fd5b600381106104f357600080fdfea2646970667358221220a2c3b62e0bc50507598395387e1557612d7ad59e817ddae4d5279907402fedb464736f6c63430007010033a26469706673582212201bcb3a953b00c5c4dcf4d3cf74f047f69d25320298f41e6f635cb029516f583764736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/index.ts b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/index.ts new file mode 100644 index 0000000..a9c6117 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { WeightedPoolDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as WeightedPoolDeployment; + const args = [input.Vault]; + await task.deployAndVerify('WeightedPoolFactory', args, from, force); + await task.deployAndVerify('WeightedPool2TokensFactory', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/input.ts b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/input.ts new file mode 100644 index 0000000..a361c84 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type WeightedPoolDeployment = { + Vault: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/output/arbitrum.json new file mode 100644 index 0000000..60c4f0c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/output/arbitrum.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0x7dFdEF5f355096603419239CE743BfaF1120312B", + "WeightedPool2TokensFactory": "0xCF0a32Bbef8F064969F21f7e02328FB577382018" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/output/goerli.json new file mode 100644 index 0000000..7610204 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/output/goerli.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9", + "WeightedPool2TokensFactory": "0xA5bf2ddF098bb0Ef6d120C98217dD6B141c74EE0" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/output/kovan.json b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/output/kovan.json new file mode 100644 index 0000000..7610204 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/output/kovan.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9", + "WeightedPool2TokensFactory": "0xA5bf2ddF098bb0Ef6d120C98217dD6B141c74EE0" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/output/mainnet.json new file mode 100644 index 0000000..7610204 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9", + "WeightedPool2TokensFactory": "0xA5bf2ddF098bb0Ef6d120C98217dD6B141c74EE0" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/output/optimism.json b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/output/optimism.json new file mode 100644 index 0000000..40d6992 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/output/optimism.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca", + "WeightedPool2TokensFactory": "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/output/polygon.json new file mode 100644 index 0000000..7610204 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/output/polygon.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9", + "WeightedPool2TokensFactory": "0xA5bf2ddF098bb0Ef6d120C98217dD6B141c74EE0" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/output/rinkeby.json b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/output/rinkeby.json new file mode 100644 index 0000000..7610204 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/output/rinkeby.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9", + "WeightedPool2TokensFactory": "0xA5bf2ddF098bb0Ef6d120C98217dD6B141c74EE0" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/readme.md b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/readme.md new file mode 100644 index 0000000..fe73337 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210418-weighted-pool/readme.md @@ -0,0 +1,17 @@ +# 2021-04-18 Weighted Pool + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This factory was superseded by this [updated version (also now deprecated)](../20220908-weighted-pool-v2). + +Deployment of the `WeightedPoolFactory`, for Weighted Pools of up to 8 tokens, and `WeightedPool2TokensFactory`, for Weighted Pools restricted to 2 tokens, but with an optional price oracle. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet address](./output/polygon.json) +- [Arbitrum mainnet address](./output/arbitrum.json) +- [Optimism mainnet address](./output/optimism.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`WeightedPoolFactory` artifact](./artifact/WeightedPoolFactory.json) +- [`WeightedPool2TokensFactory` artifact](./artifact/WeightedPool2TokensFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/artifact/StablePool.json b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/artifact/StablePool.json new file mode 100644 index 0000000..461cc6f --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/artifact/StablePool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20[]", "name": "tokens", "type": "address[]"}, {"internalType": "uint256", "name": "amplificationParameter", "type": "uint256"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "address", "name": "owner", "type": "address"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "startValue", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "endValue", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "startTime", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "endTime", "type": "uint256"}], "name": "AmpUpdateStarted", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "currentValue", "type": "uint256"}], "name": "AmpUpdateStopped", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAmplificationParameter", "outputs": [{"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "bool", "name": "isUpdating", "type": "bool"}, {"internalType": "uint256", "name": "precision", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "swapRequest", "type": "tuple"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "indexIn", "type": "uint256"}, {"internalType": "uint256", "name": "indexOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256", "name": "balanceTokenIn", "type": "uint256"}, {"internalType": "uint256", "name": "balanceTokenOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "bytes", "name": "poolConfig", "type": "bytes"}], "name": "setAssetManagerPoolConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bool", "name": "paused", "type": "bool"}], "name": "setPaused", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "rawEndValue", "type": "uint256"}, {"internalType": "uint256", "name": "endTime", "type": "uint256"}], "name": "startAmplificationParameterUpdate", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "stopAmplificationParameterUpdate", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/artifact/StablePoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/artifact/StablePoolFactory.json new file mode 100644 index 0000000..b4faf50 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/artifact/StablePoolFactory.json @@ -0,0 +1,129 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "StablePoolFactory", + "sourceName": "contracts/StablePoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "amplificationParameter", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60c060405234801561001057600080fd5b50604051615e10380380615e1083398101604081905261002f9161004d565b60601b6001600160601b0319166080526276a700420160a05261007b565b60006020828403121561005e578081fd5b81516001600160a01b0381168114610074578182fd5b9392505050565b60805160601c60a051615d6b6100a56000398060d652806101005250806101ea5250615d6b6000f3fe60806040523480156200001157600080fd5b5060043610620000525760003560e01c80632da47c4014620000575780636634b753146200007a5780637932c7f314620000a05780638d928af814620000c6575b600080fd5b62000061620000d0565b60405162000071929190620005f4565b60405180910390f35b620000916200008b36600462000330565b6200013c565b60405162000071919062000522565b620000b7620000b136600462000356565b62000167565b60405162000071919062000501565b620000b7620001e8565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200012e57807f000000000000000000000000000000000000000000000000000000000000000003925062278d00915062000137565b60009250600091505b509091565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b600080600062000176620000d0565b91509150600062000186620001e8565b8a8a8a8a8a88888c6040516200019c9062000283565b620001b0999897969594939291906200052d565b604051809103906000f080158015620001cd573d6000803e3d6000fd5b509050620001db816200020c565b9998505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a250565b6156cc806200066a83390190565b80356200029e8162000643565b92915050565b600082601f830112620002b5578081fd5b813567ffffffffffffffff811115620002cc578182fd5b620002ff60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160162000602565b91508082528360208285010111156200031757600080fd5b8060208401602084013760009082016020015292915050565b60006020828403121562000342578081fd5b81356200034f8162000643565b9392505050565b60008060008060008060c087890312156200036f578182fd5b863567ffffffffffffffff8082111562000387578384fd5b620003958a838b01620002a4565b9750602091508189013581811115620003ac578485fd5b620003ba8b828c01620002a4565b975050604089013581811115620003cf578485fd5b8901601f81018b13620003e0578485fd5b803582811115620003ef578586fd5b83810292506200040184840162000602565b8181528481019083860185850187018f10156200041c578889fd5b8895505b838610156200044a57620004358f8262000291565b83526001959095019491860191860162000420565b509850505050606089013594505050608087013591506200046f8860a0890162000291565b90509295509295509295565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452815b81811015620004bc576020818501810151868301820152016200049e565b81811115620004ce5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b600061012073ffffffffffffffffffffffffffffffffffffffff8c16835260208181850152620005608285018d62000495565b9150838203604085015262000576828c62000495565b84810360608601528a51808252828c01935090820190845b81811015620005b657620005a385516200062a565b835293830193918301916001016200058e565b50508093505050508660808301528560a08301528460c08301528360e0830152620005e66101008301846200047b565b9a9950505050505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156200062257600080fd5b604052919050565b73ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff811681146200066657600080fd5b5056fe6103e06040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b50604051620056cc380380620056cc8339810160408190526200005a9162000bf3565b8886516002146200006d57600062000070565b60025b8989898a516001600160401b03811180156200008b57600080fd5b50604051908082528060200260200182016040528015620000b6578160200160208202803683370190505b506040805180820190915260018152603160f81b602080830191909152336080526001600160601b031960608a901b1660a05285518c928c928c928c92859285928c928c92849283929183918691620001159160039185019062000a11565b5080516200012b90600490602084019062000a11565b50506005805460ff1916601217905550815160209283012060c052805191012060e05250507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010052506200018a6276a70083111561019462000699565b6200019e62278d0082111561019562000699565b4290910161014081905201610160528551620001c0906002111560c862000699565b620001d860088751111560c96200069960201b60201c565b620001ee86620006ae60201b62000f831760201c565b620001f984620006ba565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f906200022a908d9060040162000d8f565b602060405180830381600087803b1580156200024557600080fd5b505af11580156200025a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000280919062000bda565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002b59084908b908b9060040162000cf3565b600060405180830381600087803b158015620002d057600080fd5b505af1158015620002e5573d6000803e3d6000fd5b505088516001600160601b031960608f901b16610180526101a08490526101c0819052915050806200031957600062000330565b876000815181106200032757fe5b60200260200101515b60601b6001600160601b0319166101e052600181116200035257600062000369565b876001815181106200036057fe5b60200260200101515b60601b6001600160601b03191661020052600281116200038b576000620003a2565b876002815181106200039957fe5b60200260200101515b60601b6001600160601b0319166102205260038111620003c4576000620003db565b87600381518110620003d257fe5b60200260200101515b60601b6001600160601b0319166102405260048111620003fd57600062000414565b876004815181106200040b57fe5b60200260200101515b60601b6001600160601b0319166102605260058111620004365760006200044d565b876005815181106200044457fe5b60200260200101515b60601b6001600160601b03191661028052600681116200046f57600062000486565b876006815181106200047d57fe5b60200260200101515b60601b6001600160601b0319166102a05260078111620004a8576000620004bf565b87600781518110620004b657fe5b60200260200101515b60601b6001600160601b0319166102c05280620004de57600062000504565b6200050488600081518110620004f057fe5b60200260200101516200072960201b60201c565b6102e05260018111620005195760006200052b565b6200052b88600181518110620004f057fe5b61030052600281116200054057600062000552565b6200055288600281518110620004f057fe5b61032052600381116200056757600062000579565b6200057988600381518110620004f057fe5b61034052600481116200058e576000620005a0565b620005a088600481518110620004f057fe5b6103605260058111620005b5576000620005c7565b620005c788600581518110620004f057fe5b6103805260068111620005dc576000620005ee565b620005ee88600681518110620004f057fe5b6103a052600781116200060357600062000615565b6200061588600781518110620004f057fe5b6103c05250508f516200063c9a5060051015985061012f9750506200069995505050505050565b6200064e600186101561012c62000699565b6200066161138886111561012d62000699565b60006200067c866103e8620007d560201b62000f8d1760201c565b9050620006898162000806565b5050505050505050505062000e11565b81620006aa57620006aa8162000845565b5050565b80620006aa8162000898565b620006cf64e8d4a5100082101560cb62000699565b620006e767016345785d8a000082111560ca62000699565b60088190556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906200071e90839062000da4565b60405180910390a150565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200076657600080fd5b505afa1580156200077b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007a1919062000cd0565b60ff1690506000620007c06012836200092560201b62000fb11760201c565b600a0a670de0b6b3a764000002949350505050565b6000828202620007fd841580620007f5575083858381620007f257fe5b04145b600362000699565b90505b92915050565b62000814818042806200093d565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a0233816040516200071e919062000da4565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600281511015620008a95762000922565b600081600081518110620008b957fe5b602002602001015190506000600190505b82518110156200091f576000838281518110620008e357fe5b6020026020010151905062000914816001600160a01b0316846001600160a01b03161060656200069960201b60201c565b9150600101620008ca565b50505b50565b60006200093783831115600162000699565b50900390565b6200095e816001600160401b031660c062000a0d60201b62000fc71760201c565b6200097f836001600160401b0316608062000a0d60201b62000fc71760201c565b620009a0856001600160401b0316604062000a0d60201b62000fc71760201c565b620009c1876001600160401b0316600062000a0d60201b62000fc71760201c565b1717176009556040517f1835882ee7a34ac194f717a35e09bb1d24c82a3b9d854ab6c9749525b714cdf290620009ff90869086908690869062000dad565b60405180910390a150505050565b1b90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000a5457805160ff191683800117855562000a84565b8280016001018555821562000a84579182015b8281111562000a8457825182559160200191906001019062000a67565b5062000a9292915062000a96565b5090565b5b8082111562000a92576000815560010162000a97565b8051620008008162000dfb565b600082601f83011262000acb578081fd5b81516001600160401b0381111562000ae1578182fd5b602080820262000af382820162000dc8565b8381529350818401858301828701840188101562000b1057600080fd5b600092505b8483101562000b4057805162000b2b8162000dfb565b82526001929092019190830190830162000b15565b505050505092915050565b600082601f83011262000b5c578081fd5b81516001600160401b0381111562000b72578182fd5b602062000b88601f8301601f1916820162000dc8565b9250818352848183860101111562000b9f57600080fd5b60005b8281101562000bbf57848101820151848201830152810162000ba2565b8281111562000bd15760008284860101525b50505092915050565b60006020828403121562000bec578081fd5b5051919050565b60008060008060008060008060006101208a8c03121562000c12578485fd5b62000c1e8b8b62000aad565b60208b01519099506001600160401b038082111562000c3b578687fd5b62000c498d838e0162000b4b565b995060408c015191508082111562000c5f578687fd5b62000c6d8d838e0162000b4b565b985060608c015191508082111562000c83578687fd5b5062000c928c828d0162000aba565b96505060808a0151945060a08a0151935060c08a0151925060e08a0151915062000cc18b6101008c0162000aad565b90509295985092959850929598565b60006020828403121562000ce2578081fd5b815160ff81168114620007fd578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000d3f5762000d2c855162000def565b8352938301939183019160010162000d17565b505084810360408601528551808252908201925081860190845b8181101562000d815762000d6e835162000def565b8552938301939183019160010162000d59565b509298975050505050505050565b602081016003831062000d9e57fe5b91905290565b90815260200190565b93845260208401929092526040830152606082015260800190565b6040518181016001600160401b038111828210171562000de757600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b03811681146200092257600080fd5b60805160a05160601c60c05160e051610100516101205161014051610160516101805160601c6101a0516101c0516101e05160601c6102005160601c6102205160601c6102405160601c6102605160601c6102805160601c6102a05160601c6102c05160601c6102e05161030051610320516103405161036051610380516103a0516103c05161475462000f786000398061124b528061221a52508061120852806121b95250806111c5528061215852508061118252806120f752508061113f52806120965250806110fc52806120355250806110b95280611fd45250806110685280611f735250806121df52508061217e52508061211d5250806120bc52508061205b525080611ffa525080611f99525080611f385280612b73525080610fcd5250806107b5525080610ae15250806114f15250806114cd525080610cf352508061174a52508061178c52508061176b525080610abd525080610a4752506147546000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c80636daccffa1161012a57806395d89b41116100bd578063aaabadc51161008c578063d5c096c411610071578063d5c096c41461046f578063dd62ed3e14610482578063eb0f24d61461049557610226565b8063aaabadc514610454578063d505accf1461045c57610226565b806395d89b41146104135780639d2c110c1461041b578063a457c2d71461042e578063a9059cbb1461044157610226565b8063851c1bb3116100f9578063851c1bb3146103d057806387ec6817146103e3578063893d20e8146103f65780638d928af81461040b57610226565b80636daccffa1461037257806370a082311461038957806374f3b0091461039c5780637ecebe00146103bd57610226565b8063313ce567116101bd578063395093511161018c57806355c676281161017157806355c67628146103415780636028bfd414610349578063679aefce1461036a57610226565b8063395093511461031b57806350dd6ed91461032e57610226565b8063313ce567146102e35780633644e515146102f857806338e9922e1461030057806338fff2d01461031357610226565b806318160ddd116101f957806318160ddd1461029e5780631c0de051146102a657806323b872dd146102bd5780632f1a0bc9146102d057610226565b806301ec954a1461022b57806306fdde0314610254578063095ea7b31461026957806316c38b3c14610289575b600080fd5b61023e6102393660046142d9565b61049d565b60405161024b9190614566565b60405180910390f35b61025c6104fc565b60405161024b919061463c565b61027c610277366004613f52565b6105b1565b60405161024b9190614543565b61029c610297366004614049565b6105c8565b005b61023e6105dc565b6102ae6105e2565b60405161024b9392919061454e565b61027c6102cb366004613e9d565b61060b565b61029c6102de3660046143ae565b61069f565b6102eb610782565b60405161024b9190614699565b61023e61078b565b61029c61030e366004614396565b61079a565b61023e6107b3565b61027c610329366004613f52565b6107d7565b61029c61033c366004614180565b610812565b61023e610830565b61035c610357366004614081565b610836565b60405161024b92919061464f565b61023e61086d565b61037a61094b565b60405161024b93929190614668565b61023e610397366004613e49565b610966565b6103af6103aa366004614081565b610985565b60405161024b92919061451e565b61023e6103cb366004613e49565b610a28565b61023e6103de366004614124565b610a43565b61035c6103f1366004614081565b610a95565b6103fe610abb565b60405161024b919061450a565b6103fe610adf565b61025c610b03565b61023e61042936600461434a565b610b82565b61027c61043c366004613f52565b610c69565b61027c61044f366004613f52565b610ca7565b6103fe610cb4565b61029c61046a366004613edd565b610cbe565b6103af61047d366004614081565b610e07565b61023e610490366004613e65565b610f2c565b61029c610f57565b60006104b183836104ac610fcb565b610fef565b60606104bb61100c565b90506000865160018111156104cc57fe5b146104e3576104de8686868685611289565b6104f0565b6104f08686868685611300565b9150505b949350505050565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105a65780601f1061057b576101008083540402835291602001916105a6565b820191906000526020600020905b81548152906001019060200180831161058957829003601f168201915b505050505090505b90565b60006105be338484611364565b5060015b92915050565b6105d06113cc565b6105d981611412565b50565b60025490565b60008060006105ef6114ae565b1592506105fa6114cb565b91506106046114ef565b9050909192565b6000806106188533610f2c565b905061063c336001600160a01b03871614806106345750838210155b61019e611513565b610647858585611521565b336001600160a01b0386161480159061068057507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114155b15610692576106928533858403611364565b60019150505b9392505050565b6106a76113cc565b6106b7600183101561012c611513565b6106c861138883111561012d611513565b60006106d48242610fb1565b90506106e86201518082101561013d611513565b6000806106f3611601565b91509150610704811561013e611513565b6000610712866103e8610f8d565b905060008382116107415761073c61072d6201518086610f8d565b6107378488610f8d565b611675565b61075b565b61075b6107516201518084610f8d565b6107378688610f8d565b905061076d600282111561013f611513565b610779848342896116a8565b50505050505050565b60055460ff1690565b6000610795611746565b905090565b6107a26113cc565b6107aa6117e3565b6105d9816117f8565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916105be91859061080d9086611856565b611364565b61081a6113cc565b6108226117e3565b61082c8282611868565b5050565b60085490565b6000606061084c8651610847610fcb565b611980565b6108618989898989898961198d611a31611a92565b97509795505050505050565b60006060610879610adf565b6001600160a01b031663f94d466861088f6107b3565b6040518263ffffffff1660e01b81526004016108ab9190614566565b60006040518083038186803b1580156108c357600080fd5b505afa1580156108d7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108ff9190810190613f7d565b50915050600061090d611601565b5090506109218261091c61100c565b611c22565b600061092f82846000611c83565b905061094361093c6105dc565b8290611e1f565b935050505090565b6000806000610958611601565b90949093506103e892509050565b6001600160a01b0381166000908152602081905260409020545b919050565b606080886109af610994610adf565b6001600160a01b0316336001600160a01b03161460cd611513565b6109c46109ba6107b3565b82146101f4611513565b60606109ce61100c565b90506109da8882611c22565b60006060806109ef8e8e8e8e8e8e8a8f61198d565b9250925092506109ff8d84611e70565b610a098285611a31565b610a138185611a31565b909550935050505b5097509795505050505050565b6001600160a01b031660009081526006602052604090205490565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610a78929190614494565b604051602081830303815290604052805190602001209050919050565b60006060610aa68651610847610fcb565b61086189898989898989611e7a611ed3611a92565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105a65780601f1061057b576101008083540402835291602001916105a6565b600080610b928560200151611f34565b90506000610ba38660400151611f34565b9050600086516001811115610bb457fe5b1415610c1a57610bc78660600151612249565b6060870152610bd6858361226d565b9450610be2848261226d565b9350610bf286606001518361226d565b60608701526000610c04878787612279565b9050610c1081836122bd565b9350505050610698565b610c24858361226d565b9450610c30848261226d565b9350610c4086606001518261226d565b60608701526000610c528787876122c9565b9050610c5e81846122f8565b9050610c1081612304565b600080610c763385610f2c565b9050808310610c9057610c8b33856000611364565b610c9d565b610c9d3385858403611364565b5060019392505050565b60006105be338484611521565b600061079561232d565b610ccc8442111560d1611513565b6001600160a01b0387166000908152600660209081526040808320549051909291610d23917f0000000000000000000000000000000000000000000000000000000000000000918c918c918c9188918d910161458e565b6040516020818303038152906040528051906020012090506000610d46826123a7565b9050600060018288888860405160008152602001604052604051610d6d949392919061461e565b6020604051602081039080840390855afa158015610d8f573d6000803e3d6000fd5b5050604051601f1901519150610dd190506001600160a01b03821615801590610dc957508b6001600160a01b0316826001600160a01b0316145b6101f8611513565b6001600160a01b038b166000908152600660205260409020600185019055610dfa8b8b8b611364565b5050505050505050505050565b60608088610e16610994610adf565b610e216109ba6107b3565b6060610e2b61100c565b9050610e356105dc565b610edc5760006060610e4a8d8d8d868b6123c3565b91509150610e5f620f424083101560cc611513565b610e6d6000620f4240612452565b610e7c8b620f42408403612452565b610e868184611ed3565b80610e8f610fcb565b67ffffffffffffffff81118015610ea557600080fd5b50604051908082528060200260200182016040528015610ecf578160200160208202803683370190505b5095509550505050610a1b565b610ee68882611c22565b6000606080610efb8e8e8e8e8e8e8a8f611e7a565b925092509250610f0b8c84612452565b610f158285611ed3565b610f1f8185611a31565b9095509350610a1b915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610f5f6113cc565b600080610f6a611601565b91509150610f7a81610140611513565b61082c8261245c565b8061082c81612497565b6000828202610698841580610faa575083858381610fa757fe5b04145b6003611513565b6000610fc1838311156001611513565b50900390565b1b90565b7f000000000000000000000000000000000000000000000000000000000000000090565b611007818410801561100057508183105b6064611513565b505050565b60606000611018610fcb565b905060608167ffffffffffffffff8111801561103357600080fd5b5060405190808252806020026020018201604052801561105d578160200160208202803683370190505b50905081156110a5577f00000000000000000000000000000000000000000000000000000000000000008160008151811061109457fe5b6020026020010181815250506110ae565b91506105ae9050565b60018211156110a5577f0000000000000000000000000000000000000000000000000000000000000000816001815181106110e557fe5b60200260200101818152505060028211156110a5577f00000000000000000000000000000000000000000000000000000000000000008160028151811061112857fe5b60200260200101818152505060038211156110a5577f00000000000000000000000000000000000000000000000000000000000000008160038151811061116b57fe5b60200260200101818152505060048211156110a5577f0000000000000000000000000000000000000000000000000000000000000000816004815181106111ae57fe5b60200260200101818152505060058211156110a5577f0000000000000000000000000000000000000000000000000000000000000000816005815181106111f157fe5b60200260200101818152505060068211156110a5577f00000000000000000000000000000000000000000000000000000000000000008160068151811061123457fe5b60200260200101818152505060078211156110a5577f00000000000000000000000000000000000000000000000000000000000000008160078151811061127757fe5b60200260200101818152505091505090565b60006112958583611c22565b6112b686606001518385815181106112a957fe5b602002602001015161226d565b606087015260006112c987878787612510565b90506112e8818487815181106112db57fe5b60200260200101516122f8565b90506112f381612304565b9150505b95945050505050565b600061130f8660600151612249565b606087015261131e8583611c22565b61133286606001518386815181106112a957fe5b606087015260006113458787878761253a565b90506112f38184868151811061135757fe5b60200260200101516122bd565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906113bf908590614566565b60405180910390a3505050565b60006113fb6000357fffffffff0000000000000000000000000000000000000000000000000000000016610a43565b90506105d961140a8233612564565b610191611513565b80156114325761142d6114236114cb565b4210610193611513565b611447565b61144761143d6114ef565b42106101a9611513565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be64906114a3908390614543565b60405180910390a150565b60006114b86114ef565b42118061079557505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b8161082c5761082c81612654565b6115386001600160a01b0384161515610198611513565b61154f6001600160a01b0383161515610199611513565b61155a838383611007565b6001600160a01b03831660009081526020819052604090205461158090826101a06126c1565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546115af9082611856565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906113bf908590614566565b6000806000806000806116126126d7565b93509350935093508042101561166557600194508383111561164957818103824203858503028161163f57fe5b0484019550611660565b818103824203848603028161165a57fe5b04840395505b61166d565b600094508295505b505050509091565b60006116848215156004611513565b82611691575060006105c2565b81600184038161169d57fe5b0460010190506105c2565b6116bd8167ffffffffffffffff1660c0610fc7565b6116d28367ffffffffffffffff166080610fc7565b6116e78567ffffffffffffffff166040610fc7565b6116fc8767ffffffffffffffff166000610fc7565b1717176009556040517f1835882ee7a34ac194f717a35e09bb1d24c82a3b9d854ab6c9749525b714cdf29061173890869086908690869061467e565b60405180910390a150505050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006117b361272e565b306040516020016117c89594939291906145c2565b60405160208183030381529060405280519060200120905090565b6117f66117ee6114ae565b610192611513565b565b61180b64e8d4a5100082101560cb611513565b61182167016345785d8a000082111560ca611513565b60088190556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906114a3908390614566565b60008282016106988482101583611513565b60006118726107b3565b9050600061187e610adf565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b81526004016118ab929190614607565b60806040518083038186803b1580156118c357600080fd5b505afa1580156118d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118fb91906143cf565b6040517f18e736d40000000000000000000000000000000000000000000000000000000081529094506001600160a01b03851693506318e736d492506119489150859087906004016145ee565b600060405180830381600087803b15801561196257600080fd5b505af1158015611976573d6000803e3d6000fd5b5050505050505050565b61082c8183146067611513565b600060608061199a6114ae565b156119bd576119a98887612732565b90506119b88882610fb161281f565b611a09565b6119c5610fcb565b67ffffffffffffffff811180156119db57600080fd5b50604051908082528060200260200182016040528015611a05578160200160208202803683370190505b5090505b611a1488868661288a565b9093509150611a2388836128f6565b985098509895505050505050565b60005b611a3c610fcb565b81101561100757611a73838281518110611a5257fe5b6020026020010151838381518110611a6657fe5b6020026020010151611e1f565b838281518110611a7f57fe5b6020908102919091010152600101611a34565b333014611b81576000306001600160a01b0316600036604051611ab69291906144c4565b6000604051808303816000865af19150503d8060008114611af3576040519150601f19603f3d011682016040523d82523d6000602084013e611af8565b606091505b505090508060008114611b0757fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611b63573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b6060611b8b61100c565b9050611b978782611c22565b60006060611baf8c8c8c8c8c8c898d8d63ffffffff16565b5091509150611bc281848663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08301526020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b60005b611c2d610fcb565b81101561100757611c64838281518110611c4357fe5b6020026020010151838381518110611c5757fe5b6020026020010151612925565b838281518110611c7057fe5b6020908102919091010152600101611c25565b81516000908190815b81811015611cc457611cba868281518110611ca357fe5b60200260200101518461185690919063ffffffff16565b9250600101611c8c565b5081611cd557600092505050610698565b600082878302825b60ff811015611e07576000858a600081518110611cf657fe5b60200260200101510290506000600190505b86811015611d4a57611d40611d39611d33848e8581518110611d2657fe5b6020026020010151610f8d565b89610f8d565b868c612951565b9150600101611d08565b50839450611dbd611d8c611d73611d6a611d64878c610f8d565b85610f8d565b6103e88d612951565b611d86611d808a89610f8d565b88610f8d565b90611856565b611db7611daa611da06103e8880386610f8d565b6103e88e15612951565b611d868a60010189610f8d565b8b612951565b935084841115611de557600185850311611de05783975050505050505050610698565b611dfe565b600184860311611dfe5783975050505050505050610698565b50600101611cdd565b50611e13610142612654565b50505050509392505050565b6000611e2e8215156004611513565b82611e3b575060006105c2565b670de0b6b3a764000083810290611e5e90858381611e5557fe5b04146005611513565b828181611e6757fe5b049150506105c2565b61082c8282612971565b6000606080611e876117e3565b6060611e938988612732565b9050611ea28982610fb161281f565b60006060611eb18b8989612a2d565b91509150611ebf8b82612a86565b909d909c50909a5098505050505050505050565b60005b611ede610fcb565b81101561100757611f15838281518110611ef457fe5b6020026020010151838381518110611f0857fe5b6020026020010151612a93565b838281518110611f2157fe5b6020908102919091010152600101611ed6565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611f9757507f0000000000000000000000000000000000000000000000000000000000000000610980565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611ff857507f0000000000000000000000000000000000000000000000000000000000000000610980565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561205957507f0000000000000000000000000000000000000000000000000000000000000000610980565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156120ba57507f0000000000000000000000000000000000000000000000000000000000000000610980565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561211b57507f0000000000000000000000000000000000000000000000000000000000000000610980565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561217c57507f0000000000000000000000000000000000000000000000000000000000000000610980565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156121dd57507f0000000000000000000000000000000000000000000000000000000000000000610980565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561223e57507f0000000000000000000000000000000000000000000000000000000000000000610980565b610980610135612654565b60008061226160085484612ae190919063ffffffff16565b90506106988382610fb1565b60006106988383612925565b6000612290612286610fcb565b60021460d2611513565b60606000806122a0878787612b3b565b9250925092506122b28784848461253a565b979650505050505050565b60006106988383611e1f565b60006122d6612286610fcb565b60606000806122e6878787612b3b565b9250925092506122b287848484612510565b60006106988383612a93565b60006105c2612326600854670de0b6b3a7640000610fb190919063ffffffff16565b8390612a93565b6000612337610adf565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561236f57600080fd5b505afa158015612383573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107959190614164565b60006123b1611746565b82604051602001610a789291906144d4565b600060606123cf6117e3565b60006123da84612c28565b90506123f560008260028111156123ed57fe5b1460ce611513565b606061240085612c3e565b905061240f8151610847610fcb565b6124198187611c22565b6000612423611601565b509050600061243482846001611c83565b9050806124418184612c54565b9b929a509198505050505050505050565b61082c8282612c5f565b612468818242426116a8565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a0233816040516114a39190614566565b6002815110156124a6576105d9565b6000816000815181106124b557fe5b602002602001015190506000600190505b82518110156110075760008382815181106124dd57fe5b60200260200101519050612506816001600160a01b0316846001600160a01b0316106065611513565b91506001016124c6565b600061251a6117e3565b6000612524611601565b50905060006122b2828787878b60600151612ced565b60006125446117e3565b600061254e611601565b50905060006122b2828787878b60600151612db1565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b612583610abb565b6001600160a01b03161415801561259e575061259e83612e59565b156125c6576125ab610abb565b6001600160a01b0316336001600160a01b03161490506105c2565b6125ce61232d565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016125fd9392919061456f565b60206040518083038186803b15801561261557600080fd5b505afa158015612629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264d9190614065565b90506105c2565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b60006126d08484111583611513565b5050900390565b6000806000806126f36000600954612ec790919063ffffffff16565b600954909450612704906040612ec7565b600954909350612715906080612ec7565b6009549092506127269060c0612ec7565b905090919293565b4690565b60608061273d610fcb565b67ffffffffffffffff8111801561275357600080fd5b5060405190808252806020026020018201604052801561277d578160200160208202803683370190505b5090508261278c5790506105c2565b6000808560008151811061279c57fe5b602002602001015190506000600190505b6127b5610fcb565b8110156127ec5760008782815181106127ca57fe5b60200260200101519050828111156127e3578193508092505b506001016127ad565b506127fe600b5487600a548589612ed5565b83838151811061280a57fe5b60209081029190910101525090949350505050565b60005b61282a610fcb565b8110156128845761286584828151811061284057fe5b602002602001015184838151811061285457fe5b60200260200101518463ffffffff16565b84828151811061287157fe5b6020908102919091010152600101612822565b50505050565b60006060600061289984612c28565b905060008160028111156128a957fe5b14156128c3576128b98685612f49565b92509250506128ee565b60018160028111156128d157fe5b14156128e1576128b9868561300f565b6128b9868686613041565b505b935093915050565b6129038282610fb161281f565b600061290d611601565b50905061100761291f82856001611c83565b82612c54565b600082820261293f841580610faa575083858381610fa757fe5b670de0b6b3a764000090049392505050565b6000816129675761296284846130b8565b6104f4565b6104f48484611675565b6129886001600160a01b038316151561019b611513565b61299482600083611007565b6001600160a01b0382166000908152602081905260409020546129ba90826101a16126c1565b6001600160a01b0383166000908152602081905260409020556002546129e090826130d8565b6002556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612a21908590614566565b60405180910390a35050565b600060606000612a3c84612c28565b90506001816002811115612a4c57fe5b1415612a5d576128b98686866130e6565b6002816002811115612a6b57fe5b1415612a7b576128b9868561314b565b6128ec610136612654565b612903828261185661281f565b6000612aa28215156004611513565b82612aaf575060006105c2565b670de0b6b3a764000083810290612ac990858381611e5557fe5b826001820381612ad557fe5b046001019150506105c2565b6000828202612afb841580610faa575083858381610fa757fe5b80612b0a5760009150506105c2565b670de0b6b3a76400007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201612ad5565b6040805160028082526060828101909352600091829181602001602082028036833701905050925085602001516001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415612be25760009150600190508483600081518110612bb757fe5b6020026020010181815250508383600181518110612bd157fe5b602002602001018181525050612c1f565b60009050600191508383600081518110612bf857fe5b6020026020010181815250508483600181518110612c1257fe5b6020026020010181815250505b93509350939050565b6000818060200190518101906105c291906141ce565b6060818060200190518101906106989190614294565b600a91909155600b55565b612c6b60008383611007565b600254612c789082611856565b6002556001600160a01b038216600090815260208190526040902054612c9e9082611856565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612a21908590614566565b600080612cfc87876001611c83565b9050612d2483878681518110612d0e57fe5b6020026020010151610fb190919063ffffffff16565b868581518110612d3057fe5b6020026020010181815250506000612d4a888884896131db565b905083878681518110612d5957fe5b602002602001015101878681518110612d6e57fe5b602002602001018181525050612da56001611d86898981518110612d8e57fe5b602002602001015184610fb190919063ffffffff16565b98975050505050505050565b600080612dc087876001611c83565b9050612de883878781518110612dd257fe5b602002602001015161185690919063ffffffff16565b868681518110612df457fe5b6020026020010181815250506000612e0e888884886131db565b905083878781518110612e1d57fe5b602002602001015103878781518110612e3257fe5b602002602001018181525050612da56001612e53838a8981518110612d0e57fe5b90610fb1565b6000612e847f2f1a0bc900000000000000000000000000000000000000000000000000000000610a43565b821480612eb85750612eb57feb0f24d600000000000000000000000000000000000000000000000000000000610a43565b82145b806105c257506105c28261338b565b1c67ffffffffffffffff1690565b600080612ee4878787876131db565b905080868581518110612ef357fe5b602002602001015111612f0a5760009150506112f7565b600081878681518110612f1957fe5b6020026020010151039050612da5670de0b6b3a7640000612f43868461292590919063ffffffff16565b90611e1f565b60006060612f556117e3565b600080612f61856133ef565b91509150612f79612f70610fcb565b82106064611513565b6060612f83610fcb565b67ffffffffffffffff81118015612f9957600080fd5b50604051908082528060200260200182016040528015612fc3578160200160208202803683370190505b5090506000612fd0611601565b509050612fea81898587612fe26105dc565b600854613411565b828481518110612ff657fe5b6020908102919091010152509196919550909350505050565b60006060600061301e8461352d565b90506060613034868361302f6105dc565b613543565b9196919550909350505050565b6000606061304d6117e3565b6060600061305a856135f5565b9150915061306b8251610847610fcb565b6130758287611c22565b600061307f611601565b509050600061309a828a866130926105dc565b60085461360d565b90506130aa8382111560cf611513565b989297509195505050505050565b60006130c78215156004611513565b8183816130d057fe5b049392505050565b6000610698838360016126c1565b600060608060006130f6856135f5565b9150915061310c613105610fcb565b8351611980565b6131168287611c22565b6000613120611601565b509050600061313b828a866131336105dc565b6008546138a3565b90506130aa8382101560d0611513565b6000606060008061315b856133ef565b9150915061316a612f70610fcb565b6060613174610fcb565b67ffffffffffffffff8111801561318a57600080fd5b506040519080825280602002602001820160405280156131b4578160200160208202803683370190505b50905060006131c1611601565b509050612fea818985876131d36105dc565b600854613b32565b6000808451860290506000856000815181106131f357fe5b60200260200101519050600086518760008151811061320e57fe5b60200260200101510290506000600190505b87518110156132675761324c61324661323f848b8581518110611d2657fe5b8a51610f8d565b886130b8565b915061325d888281518110611ca357fe5b9250600101613220565b5086858151811061327457fe5b602002602001015182039150600061328c8788610f8d565b905060006132b86132ac6132a4846107378988610f8d565b6103e8610f8d565b8a8981518110611d2657fe5b905060006132d36132cc6132a48b896130b8565b8690611856565b90506000806132ef6132e58686611856565b6107378d86611856565b905060005b60ff81101561336f5781925061332461331186611d868586610f8d565b6107378e612e5388611d86886002610f8d565b91508282111561334d57600183830311613348575097506104f49650505050505050565b613367565b600182840311613367575097506104f49650505050505050565b6001016132f4565b5061337b610142612654565b5050505050505050949350505050565b60006133b67f38e9922e00000000000000000000000000000000000000000000000000000000610a43565b8214806105c257506133e77f50dd6ed900000000000000000000000000000000000000000000000000000000610a43565b909114919050565b60008082806020019051810190613406919061425e565b909590945092505050565b60008061342088886001611c83565b905060006134428261343c87613436818b610fb1565b90612a93565b90612ae1565b905060006134528a8a848b6131db565b90506000613466828b8b81518110612d0e57fe5b90506000805b8b518110156134a55761349b8c828151811061348457fe5b60200260200101518361185690919063ffffffff16565b915060010161346c565b5060006134ce828d8d815181106134b857fe5b6020026020010151611e1f90919063ffffffff16565b905060006134db82613c0f565b905060006134e98583612ae1565b905060006134f78683610fb1565b905061351861351183670de0b6b3a76400008e9003612925565b8290611856565b99505050505050505050509695505050505050565b6000818060200190518101906106989190614231565b606060006135518484611e1f565b90506060855167ffffffffffffffff8111801561356d57600080fd5b50604051908082528060200260200182016040528015613597578160200160208202803683370190505b50905060005b86518110156135eb576135cc838883815181106135b657fe5b602002602001015161292590919063ffffffff16565b8282815181106135d857fe5b602090810291909101015260010161359d565b5095945050505050565b606060008280602001905181019061340691906141ea565b600080805b86518110156136345761362a87828151811061348457fe5b9150600101613612565b506060855167ffffffffffffffff8111801561364f57600080fd5b50604051908082528060200260200182016040528015613679578160200160208202803683370190505b5090506000805b88518110156137405760006136b1858b848151811061369b57fe5b6020026020010151612a9390919063ffffffff16565b90506136ed8a83815181106136c257fe5b60200260200101516134368b85815181106136d957fe5b60200260200101518d8681518110612d0e57fe5b8483815181106136f957fe5b60200260200101818152505061373561372e8286858151811061371857fe5b6020026020010151612ae190919063ffffffff16565b8490611856565b925050600101613680565b506060885167ffffffffffffffff8111801561375b57600080fd5b50604051908082528060200260200182016040528015613785578160200160208202803683370190505b50905060005b89518110156138505760008482815181106137a257fe5b60200260200101518411156138095760006137cb6137bf86613c0f565b8d85815181106135b657fe5b905060006137df828d8681518110612d0e57fe5b90506138006137f982670de0b6b3a76400008d9003612a93565b8390611856565b92505050613820565b89828151811061381557fe5b602002602001015190505b613830818c8481518110612d0e57fe5b83838151811061383c57fe5b60209081029190910101525060010161378b565b50600061385f8b8b6001611c83565b9050600061386f8c846000611c83565b9050600061387d8284611e1f565b905061389261388b82613c0f565b8b90612ae1565b9d9c50505050505050505050505050565b600080805b86518110156138ca576138c087828151811061348457fe5b91506001016138a8565b506060855167ffffffffffffffff811180156138e557600080fd5b5060405190808252806020026020018201604052801561390f578160200160208202803683370190505b5090506000805b88518110156139a3576000613931858b84815181106134b857fe5b905061396d8a838151811061394257fe5b6020026020010151612f438b858151811061395957fe5b60200260200101518d8681518110612dd257fe5b84838151811061397957fe5b60200260200101818152505061399861372e828685815181106135b657fe5b925050600101613916565b506060885167ffffffffffffffff811180156139be57600080fd5b506040519080825280602002602001820160405280156139e8578160200160208202803683370190505b50905060005b8951811015613aa957600083858381518110613a0657fe5b60200260200101511115613a62576000613a2b6137bf86670de0b6b3a7640000610fb1565b90506000613a3f828d8681518110612d0e57fe5b9050613a596137f982670de0b6b3a76400008d9003612925565b92505050613a79565b898281518110613a6e57fe5b602002602001015190505b613a89818c8481518110612dd257fe5b838381518110613a9557fe5b6020908102919091010152506001016139ee565b506000613ab88b8b6001611c83565b90506000613ac88c846000611c83565b90506000613ad68284611e1f565b9050670de0b6b3a7640000811115613b2257613b148a7ffffffffffffffffffffffffffffffffffffffffffffffffff21f494c589c00008301612925565b9750505050505050506112f7565b60009750505050505050506112f7565b600080613b4188886001611c83565b90506000613b578261343c87613436818b611856565b90506000613b678a8a848b6131db565b90506000613b918a8a81518110613b7a57fe5b602002602001015183610fb190919063ffffffff16565b90506000805b8b51811015613bb957613baf8c828151811061348457fe5b9150600101613b97565b506000613bcc828d8d815181106134b857fe5b90506000613bd982613c0f565b90506000613be78583612ae1565b90506000613bf58683610fb1565b905061351861351183670de0b6b3a76400008e9003612a93565b6000670de0b6b3a76400008210613c275760006105c2565b50670de0b6b3a76400000390565b80356105c2816146ee565b600082601f830112613c50578081fd5b8135613c63613c5e826146ce565b6146a7565b818152915060208083019084810181840286018201871015613c8457600080fd5b60005b84811015613ca357813584529282019290820190600101613c87565b505050505092915050565b600082601f830112613cbe578081fd5b8151613ccc613c5e826146ce565b818152915060208083019084810181840286018201871015613ced57600080fd5b60005b84811015613ca357815184529282019290820190600101613cf0565b600082601f830112613d1c578081fd5b813567ffffffffffffffff811115613d32578182fd5b613d456020601f19601f840116016146a7565b9150808252836020828501011115613d5c57600080fd5b8060208401602084013760009082016020015292915050565b8035600281106105c257600080fd5b6000610120808385031215613d97578182fd5b613da0816146a7565b915050613dad8383613d75565b8152613dbc8360208401613c35565b6020820152613dce8360408401613c35565b6040820152606082013560608201526080820135608082015260a082013560a0820152613dfe8360c08401613c35565b60c0820152613e108360e08401613c35565b60e08201526101008083013567ffffffffffffffff811115613e3157600080fd5b613e3d85828601613d0c565b82840152505092915050565b600060208284031215613e5a578081fd5b8135610698816146ee565b60008060408385031215613e77578081fd5b8235613e82816146ee565b91506020830135613e92816146ee565b809150509250929050565b600080600060608486031215613eb1578081fd5b8335613ebc816146ee565b92506020840135613ecc816146ee565b929592945050506040919091013590565b600080600080600080600060e0888a031215613ef7578283fd5b8735613f02816146ee565b96506020880135613f12816146ee565b95506040880135945060608801359350608088013560ff81168114613f35578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613f64578182fd5b8235613f6f816146ee565b946020939093013593505050565b600080600060608486031215613f91578081fd5b835167ffffffffffffffff80821115613fa8578283fd5b818601915086601f830112613fbb578283fd5b8151613fc9613c5e826146ce565b80828252602080830192508086018b828387028901011115613fe9578788fd5b8796505b84871015614014578051614000816146ee565b845260019690960195928101928101613fed565b50890151909750935050508082111561402b578283fd5b5061403886828701613cae565b925050604084015190509250925092565b60006020828403121561405a578081fd5b813561069881614703565b600060208284031215614076578081fd5b815161069881614703565b600080600080600080600060e0888a03121561409b578081fd5b8735965060208801356140ad816146ee565b955060408801356140bd816146ee565b9450606088013567ffffffffffffffff808211156140d9578283fd5b6140e58b838c01613c40565b955060808a0135945060a08a0135935060c08a0135915080821115614108578283fd5b506141158a828b01613d0c565b91505092959891949750929550565b600060208284031215614135578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610698578182fd5b600060208284031215614175578081fd5b8151610698816146ee565b60008060408385031215614192578182fd5b823561419d816146ee565b9150602083013567ffffffffffffffff8111156141b8578182fd5b6141c485828601613d0c565b9150509250929050565b6000602082840312156141df578081fd5b815161069881614711565b6000806000606084860312156141fe578081fd5b835161420981614711565b602085015190935067ffffffffffffffff811115614225578182fd5b61403886828701613cae565b60008060408385031215614243578182fd5b825161424e81614711565b6020939093015192949293505050565b600080600060608486031215614272578081fd5b835161427d81614711565b602085015160409095015190969495509392505050565b600080604083850312156142a6578182fd5b82516142b181614711565b602084015190925067ffffffffffffffff8111156142cd578182fd5b6141c485828601613cae565b600080600080608085870312156142ee578182fd5b843567ffffffffffffffff80821115614305578384fd5b61431188838901613d84565b95506020870135915080821115614326578384fd5b5061433387828801613c40565b949794965050505060408301359260600135919050565b60008060006060848603121561435e578081fd5b833567ffffffffffffffff811115614374578182fd5b61438086828701613d84565b9660208601359650604090950135949350505050565b6000602082840312156143a7578081fd5b5035919050565b600080604083850312156143c0578182fd5b50508035926020909101359150565b600080600080608085870312156143e4578182fd5b8451935060208501519250604085015191506060850151614404816146ee565b939692955090935050565b6000815180845260208085019450808401835b8381101561443e57815187529582019590820190600101614422565b509495945050505050565b60008151808452815b8181101561446e57602081850181015186830182015201614452565b8181111561447f5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b600060408252614531604083018561440f565b82810360208401526112f7818561440f565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000838252604060208301526104f46040830184614449565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526106986020830184614449565b6000838252604060208301526104f4604083018461440f565b9283529015156020830152604082015260600190565b93845260208401929092526040830152606082015260800190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156146c657600080fd5b604052919050565b600067ffffffffffffffff8211156146e4578081fd5b5060209081020190565b6001600160a01b03811681146105d957600080fd5b80151581146105d957600080fd5b600381106105d957600080fdfea264697066735822122074699730ea8aa4fa00d2702d985bebe2cf30c6abf09e7ee52a1750d232c882ff64736f6c63430007010033a26469706673582212207cbe8f85ba368fdc5070617b2e445e9210e8ccfb093bd1e3452a817f143214c064736f6c63430007010033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000525760003560e01c80632da47c4014620000575780636634b753146200007a5780637932c7f314620000a05780638d928af814620000c6575b600080fd5b62000061620000d0565b60405162000071929190620005f4565b60405180910390f35b620000916200008b36600462000330565b6200013c565b60405162000071919062000522565b620000b7620000b136600462000356565b62000167565b60405162000071919062000501565b620000b7620001e8565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200012e57807f000000000000000000000000000000000000000000000000000000000000000003925062278d00915062000137565b60009250600091505b509091565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b600080600062000176620000d0565b91509150600062000186620001e8565b8a8a8a8a8a88888c6040516200019c9062000283565b620001b0999897969594939291906200052d565b604051809103906000f080158015620001cd573d6000803e3d6000fd5b509050620001db816200020c565b9998505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a250565b6156cc806200066a83390190565b80356200029e8162000643565b92915050565b600082601f830112620002b5578081fd5b813567ffffffffffffffff811115620002cc578182fd5b620002ff60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160162000602565b91508082528360208285010111156200031757600080fd5b8060208401602084013760009082016020015292915050565b60006020828403121562000342578081fd5b81356200034f8162000643565b9392505050565b60008060008060008060c087890312156200036f578182fd5b863567ffffffffffffffff8082111562000387578384fd5b620003958a838b01620002a4565b9750602091508189013581811115620003ac578485fd5b620003ba8b828c01620002a4565b975050604089013581811115620003cf578485fd5b8901601f81018b13620003e0578485fd5b803582811115620003ef578586fd5b83810292506200040184840162000602565b8181528481019083860185850187018f10156200041c578889fd5b8895505b838610156200044a57620004358f8262000291565b83526001959095019491860191860162000420565b509850505050606089013594505050608087013591506200046f8860a0890162000291565b90509295509295509295565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452815b81811015620004bc576020818501810151868301820152016200049e565b81811115620004ce5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b600061012073ffffffffffffffffffffffffffffffffffffffff8c16835260208181850152620005608285018d62000495565b9150838203604085015262000576828c62000495565b84810360608601528a51808252828c01935090820190845b81811015620005b657620005a385516200062a565b835293830193918301916001016200058e565b50508093505050508660808301528560a08301528460c08301528360e0830152620005e66101008301846200047b565b9a9950505050505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156200062257600080fd5b604052919050565b73ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff811681146200066657600080fd5b5056fe6103e06040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b50604051620056cc380380620056cc8339810160408190526200005a9162000bf3565b8886516002146200006d57600062000070565b60025b8989898a516001600160401b03811180156200008b57600080fd5b50604051908082528060200260200182016040528015620000b6578160200160208202803683370190505b506040805180820190915260018152603160f81b602080830191909152336080526001600160601b031960608a901b1660a05285518c928c928c928c92859285928c928c92849283929183918691620001159160039185019062000a11565b5080516200012b90600490602084019062000a11565b50506005805460ff1916601217905550815160209283012060c052805191012060e05250507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61010052506200018a6276a70083111561019462000699565b6200019e62278d0082111561019562000699565b4290910161014081905201610160528551620001c0906002111560c862000699565b620001d860088751111560c96200069960201b60201c565b620001ee86620006ae60201b62000f831760201c565b620001f984620006ba565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f906200022a908d9060040162000d8f565b602060405180830381600087803b1580156200024557600080fd5b505af11580156200025a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000280919062000bda565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002b59084908b908b9060040162000cf3565b600060405180830381600087803b158015620002d057600080fd5b505af1158015620002e5573d6000803e3d6000fd5b505088516001600160601b031960608f901b16610180526101a08490526101c0819052915050806200031957600062000330565b876000815181106200032757fe5b60200260200101515b60601b6001600160601b0319166101e052600181116200035257600062000369565b876001815181106200036057fe5b60200260200101515b60601b6001600160601b03191661020052600281116200038b576000620003a2565b876002815181106200039957fe5b60200260200101515b60601b6001600160601b0319166102205260038111620003c4576000620003db565b87600381518110620003d257fe5b60200260200101515b60601b6001600160601b0319166102405260048111620003fd57600062000414565b876004815181106200040b57fe5b60200260200101515b60601b6001600160601b0319166102605260058111620004365760006200044d565b876005815181106200044457fe5b60200260200101515b60601b6001600160601b03191661028052600681116200046f57600062000486565b876006815181106200047d57fe5b60200260200101515b60601b6001600160601b0319166102a05260078111620004a8576000620004bf565b87600781518110620004b657fe5b60200260200101515b60601b6001600160601b0319166102c05280620004de57600062000504565b6200050488600081518110620004f057fe5b60200260200101516200072960201b60201c565b6102e05260018111620005195760006200052b565b6200052b88600181518110620004f057fe5b61030052600281116200054057600062000552565b6200055288600281518110620004f057fe5b61032052600381116200056757600062000579565b6200057988600381518110620004f057fe5b61034052600481116200058e576000620005a0565b620005a088600481518110620004f057fe5b6103605260058111620005b5576000620005c7565b620005c788600581518110620004f057fe5b6103805260068111620005dc576000620005ee565b620005ee88600681518110620004f057fe5b6103a052600781116200060357600062000615565b6200061588600781518110620004f057fe5b6103c05250508f516200063c9a5060051015985061012f9750506200069995505050505050565b6200064e600186101561012c62000699565b6200066161138886111561012d62000699565b60006200067c866103e8620007d560201b62000f8d1760201c565b9050620006898162000806565b5050505050505050505062000e11565b81620006aa57620006aa8162000845565b5050565b80620006aa8162000898565b620006cf64e8d4a5100082101560cb62000699565b620006e767016345785d8a000082111560ca62000699565b60088190556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906200071e90839062000da4565b60405180910390a150565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200076657600080fd5b505afa1580156200077b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007a1919062000cd0565b60ff1690506000620007c06012836200092560201b62000fb11760201c565b600a0a670de0b6b3a764000002949350505050565b6000828202620007fd841580620007f5575083858381620007f257fe5b04145b600362000699565b90505b92915050565b62000814818042806200093d565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a0233816040516200071e919062000da4565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600281511015620008a95762000922565b600081600081518110620008b957fe5b602002602001015190506000600190505b82518110156200091f576000838281518110620008e357fe5b6020026020010151905062000914816001600160a01b0316846001600160a01b03161060656200069960201b60201c565b9150600101620008ca565b50505b50565b60006200093783831115600162000699565b50900390565b6200095e816001600160401b031660c062000a0d60201b62000fc71760201c565b6200097f836001600160401b0316608062000a0d60201b62000fc71760201c565b620009a0856001600160401b0316604062000a0d60201b62000fc71760201c565b620009c1876001600160401b0316600062000a0d60201b62000fc71760201c565b1717176009556040517f1835882ee7a34ac194f717a35e09bb1d24c82a3b9d854ab6c9749525b714cdf290620009ff90869086908690869062000dad565b60405180910390a150505050565b1b90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000a5457805160ff191683800117855562000a84565b8280016001018555821562000a84579182015b8281111562000a8457825182559160200191906001019062000a67565b5062000a9292915062000a96565b5090565b5b8082111562000a92576000815560010162000a97565b8051620008008162000dfb565b600082601f83011262000acb578081fd5b81516001600160401b0381111562000ae1578182fd5b602080820262000af382820162000dc8565b8381529350818401858301828701840188101562000b1057600080fd5b600092505b8483101562000b4057805162000b2b8162000dfb565b82526001929092019190830190830162000b15565b505050505092915050565b600082601f83011262000b5c578081fd5b81516001600160401b0381111562000b72578182fd5b602062000b88601f8301601f1916820162000dc8565b9250818352848183860101111562000b9f57600080fd5b60005b8281101562000bbf57848101820151848201830152810162000ba2565b8281111562000bd15760008284860101525b50505092915050565b60006020828403121562000bec578081fd5b5051919050565b60008060008060008060008060006101208a8c03121562000c12578485fd5b62000c1e8b8b62000aad565b60208b01519099506001600160401b038082111562000c3b578687fd5b62000c498d838e0162000b4b565b995060408c015191508082111562000c5f578687fd5b62000c6d8d838e0162000b4b565b985060608c015191508082111562000c83578687fd5b5062000c928c828d0162000aba565b96505060808a0151945060a08a0151935060c08a0151925060e08a0151915062000cc18b6101008c0162000aad565b90509295985092959850929598565b60006020828403121562000ce2578081fd5b815160ff81168114620007fd578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000d3f5762000d2c855162000def565b8352938301939183019160010162000d17565b505084810360408601528551808252908201925081860190845b8181101562000d815762000d6e835162000def565b8552938301939183019160010162000d59565b509298975050505050505050565b602081016003831062000d9e57fe5b91905290565b90815260200190565b93845260208401929092526040830152606082015260800190565b6040518181016001600160401b038111828210171562000de757600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b03811681146200092257600080fd5b60805160a05160601c60c05160e051610100516101205161014051610160516101805160601c6101a0516101c0516101e05160601c6102005160601c6102205160601c6102405160601c6102605160601c6102805160601c6102a05160601c6102c05160601c6102e05161030051610320516103405161036051610380516103a0516103c05161475462000f786000398061124b528061221a52508061120852806121b95250806111c5528061215852508061118252806120f752508061113f52806120965250806110fc52806120355250806110b95280611fd45250806110685280611f735250806121df52508061217e52508061211d5250806120bc52508061205b525080611ffa525080611f99525080611f385280612b73525080610fcd5250806107b5525080610ae15250806114f15250806114cd525080610cf352508061174a52508061178c52508061176b525080610abd525080610a4752506147546000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c80636daccffa1161012a57806395d89b41116100bd578063aaabadc51161008c578063d5c096c411610071578063d5c096c41461046f578063dd62ed3e14610482578063eb0f24d61461049557610226565b8063aaabadc514610454578063d505accf1461045c57610226565b806395d89b41146104135780639d2c110c1461041b578063a457c2d71461042e578063a9059cbb1461044157610226565b8063851c1bb3116100f9578063851c1bb3146103d057806387ec6817146103e3578063893d20e8146103f65780638d928af81461040b57610226565b80636daccffa1461037257806370a082311461038957806374f3b0091461039c5780637ecebe00146103bd57610226565b8063313ce567116101bd578063395093511161018c57806355c676281161017157806355c67628146103415780636028bfd414610349578063679aefce1461036a57610226565b8063395093511461031b57806350dd6ed91461032e57610226565b8063313ce567146102e35780633644e515146102f857806338e9922e1461030057806338fff2d01461031357610226565b806318160ddd116101f957806318160ddd1461029e5780631c0de051146102a657806323b872dd146102bd5780632f1a0bc9146102d057610226565b806301ec954a1461022b57806306fdde0314610254578063095ea7b31461026957806316c38b3c14610289575b600080fd5b61023e6102393660046142d9565b61049d565b60405161024b9190614566565b60405180910390f35b61025c6104fc565b60405161024b919061463c565b61027c610277366004613f52565b6105b1565b60405161024b9190614543565b61029c610297366004614049565b6105c8565b005b61023e6105dc565b6102ae6105e2565b60405161024b9392919061454e565b61027c6102cb366004613e9d565b61060b565b61029c6102de3660046143ae565b61069f565b6102eb610782565b60405161024b9190614699565b61023e61078b565b61029c61030e366004614396565b61079a565b61023e6107b3565b61027c610329366004613f52565b6107d7565b61029c61033c366004614180565b610812565b61023e610830565b61035c610357366004614081565b610836565b60405161024b92919061464f565b61023e61086d565b61037a61094b565b60405161024b93929190614668565b61023e610397366004613e49565b610966565b6103af6103aa366004614081565b610985565b60405161024b92919061451e565b61023e6103cb366004613e49565b610a28565b61023e6103de366004614124565b610a43565b61035c6103f1366004614081565b610a95565b6103fe610abb565b60405161024b919061450a565b6103fe610adf565b61025c610b03565b61023e61042936600461434a565b610b82565b61027c61043c366004613f52565b610c69565b61027c61044f366004613f52565b610ca7565b6103fe610cb4565b61029c61046a366004613edd565b610cbe565b6103af61047d366004614081565b610e07565b61023e610490366004613e65565b610f2c565b61029c610f57565b60006104b183836104ac610fcb565b610fef565b60606104bb61100c565b90506000865160018111156104cc57fe5b146104e3576104de8686868685611289565b6104f0565b6104f08686868685611300565b9150505b949350505050565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105a65780601f1061057b576101008083540402835291602001916105a6565b820191906000526020600020905b81548152906001019060200180831161058957829003601f168201915b505050505090505b90565b60006105be338484611364565b5060015b92915050565b6105d06113cc565b6105d981611412565b50565b60025490565b60008060006105ef6114ae565b1592506105fa6114cb565b91506106046114ef565b9050909192565b6000806106188533610f2c565b905061063c336001600160a01b03871614806106345750838210155b61019e611513565b610647858585611521565b336001600160a01b0386161480159061068057507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114155b15610692576106928533858403611364565b60019150505b9392505050565b6106a76113cc565b6106b7600183101561012c611513565b6106c861138883111561012d611513565b60006106d48242610fb1565b90506106e86201518082101561013d611513565b6000806106f3611601565b91509150610704811561013e611513565b6000610712866103e8610f8d565b905060008382116107415761073c61072d6201518086610f8d565b6107378488610f8d565b611675565b61075b565b61075b6107516201518084610f8d565b6107378688610f8d565b905061076d600282111561013f611513565b610779848342896116a8565b50505050505050565b60055460ff1690565b6000610795611746565b905090565b6107a26113cc565b6107aa6117e3565b6105d9816117f8565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916105be91859061080d9086611856565b611364565b61081a6113cc565b6108226117e3565b61082c8282611868565b5050565b60085490565b6000606061084c8651610847610fcb565b611980565b6108618989898989898961198d611a31611a92565b97509795505050505050565b60006060610879610adf565b6001600160a01b031663f94d466861088f6107b3565b6040518263ffffffff1660e01b81526004016108ab9190614566565b60006040518083038186803b1580156108c357600080fd5b505afa1580156108d7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108ff9190810190613f7d565b50915050600061090d611601565b5090506109218261091c61100c565b611c22565b600061092f82846000611c83565b905061094361093c6105dc565b8290611e1f565b935050505090565b6000806000610958611601565b90949093506103e892509050565b6001600160a01b0381166000908152602081905260409020545b919050565b606080886109af610994610adf565b6001600160a01b0316336001600160a01b03161460cd611513565b6109c46109ba6107b3565b82146101f4611513565b60606109ce61100c565b90506109da8882611c22565b60006060806109ef8e8e8e8e8e8e8a8f61198d565b9250925092506109ff8d84611e70565b610a098285611a31565b610a138185611a31565b909550935050505b5097509795505050505050565b6001600160a01b031660009081526006602052604090205490565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610a78929190614494565b604051602081830303815290604052805190602001209050919050565b60006060610aa68651610847610fcb565b61086189898989898989611e7a611ed3611a92565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105a65780601f1061057b576101008083540402835291602001916105a6565b600080610b928560200151611f34565b90506000610ba38660400151611f34565b9050600086516001811115610bb457fe5b1415610c1a57610bc78660600151612249565b6060870152610bd6858361226d565b9450610be2848261226d565b9350610bf286606001518361226d565b60608701526000610c04878787612279565b9050610c1081836122bd565b9350505050610698565b610c24858361226d565b9450610c30848261226d565b9350610c4086606001518261226d565b60608701526000610c528787876122c9565b9050610c5e81846122f8565b9050610c1081612304565b600080610c763385610f2c565b9050808310610c9057610c8b33856000611364565b610c9d565b610c9d3385858403611364565b5060019392505050565b60006105be338484611521565b600061079561232d565b610ccc8442111560d1611513565b6001600160a01b0387166000908152600660209081526040808320549051909291610d23917f0000000000000000000000000000000000000000000000000000000000000000918c918c918c9188918d910161458e565b6040516020818303038152906040528051906020012090506000610d46826123a7565b9050600060018288888860405160008152602001604052604051610d6d949392919061461e565b6020604051602081039080840390855afa158015610d8f573d6000803e3d6000fd5b5050604051601f1901519150610dd190506001600160a01b03821615801590610dc957508b6001600160a01b0316826001600160a01b0316145b6101f8611513565b6001600160a01b038b166000908152600660205260409020600185019055610dfa8b8b8b611364565b5050505050505050505050565b60608088610e16610994610adf565b610e216109ba6107b3565b6060610e2b61100c565b9050610e356105dc565b610edc5760006060610e4a8d8d8d868b6123c3565b91509150610e5f620f424083101560cc611513565b610e6d6000620f4240612452565b610e7c8b620f42408403612452565b610e868184611ed3565b80610e8f610fcb565b67ffffffffffffffff81118015610ea557600080fd5b50604051908082528060200260200182016040528015610ecf578160200160208202803683370190505b5095509550505050610a1b565b610ee68882611c22565b6000606080610efb8e8e8e8e8e8e8a8f611e7a565b925092509250610f0b8c84612452565b610f158285611ed3565b610f1f8185611a31565b9095509350610a1b915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610f5f6113cc565b600080610f6a611601565b91509150610f7a81610140611513565b61082c8261245c565b8061082c81612497565b6000828202610698841580610faa575083858381610fa757fe5b04145b6003611513565b6000610fc1838311156001611513565b50900390565b1b90565b7f000000000000000000000000000000000000000000000000000000000000000090565b611007818410801561100057508183105b6064611513565b505050565b60606000611018610fcb565b905060608167ffffffffffffffff8111801561103357600080fd5b5060405190808252806020026020018201604052801561105d578160200160208202803683370190505b50905081156110a5577f00000000000000000000000000000000000000000000000000000000000000008160008151811061109457fe5b6020026020010181815250506110ae565b91506105ae9050565b60018211156110a5577f0000000000000000000000000000000000000000000000000000000000000000816001815181106110e557fe5b60200260200101818152505060028211156110a5577f00000000000000000000000000000000000000000000000000000000000000008160028151811061112857fe5b60200260200101818152505060038211156110a5577f00000000000000000000000000000000000000000000000000000000000000008160038151811061116b57fe5b60200260200101818152505060048211156110a5577f0000000000000000000000000000000000000000000000000000000000000000816004815181106111ae57fe5b60200260200101818152505060058211156110a5577f0000000000000000000000000000000000000000000000000000000000000000816005815181106111f157fe5b60200260200101818152505060068211156110a5577f00000000000000000000000000000000000000000000000000000000000000008160068151811061123457fe5b60200260200101818152505060078211156110a5577f00000000000000000000000000000000000000000000000000000000000000008160078151811061127757fe5b60200260200101818152505091505090565b60006112958583611c22565b6112b686606001518385815181106112a957fe5b602002602001015161226d565b606087015260006112c987878787612510565b90506112e8818487815181106112db57fe5b60200260200101516122f8565b90506112f381612304565b9150505b95945050505050565b600061130f8660600151612249565b606087015261131e8583611c22565b61133286606001518386815181106112a957fe5b606087015260006113458787878761253a565b90506112f38184868151811061135757fe5b60200260200101516122bd565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906113bf908590614566565b60405180910390a3505050565b60006113fb6000357fffffffff0000000000000000000000000000000000000000000000000000000016610a43565b90506105d961140a8233612564565b610191611513565b80156114325761142d6114236114cb565b4210610193611513565b611447565b61144761143d6114ef565b42106101a9611513565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be64906114a3908390614543565b60405180910390a150565b60006114b86114ef565b42118061079557505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b8161082c5761082c81612654565b6115386001600160a01b0384161515610198611513565b61154f6001600160a01b0383161515610199611513565b61155a838383611007565b6001600160a01b03831660009081526020819052604090205461158090826101a06126c1565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546115af9082611856565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906113bf908590614566565b6000806000806000806116126126d7565b93509350935093508042101561166557600194508383111561164957818103824203858503028161163f57fe5b0484019550611660565b818103824203848603028161165a57fe5b04840395505b61166d565b600094508295505b505050509091565b60006116848215156004611513565b82611691575060006105c2565b81600184038161169d57fe5b0460010190506105c2565b6116bd8167ffffffffffffffff1660c0610fc7565b6116d28367ffffffffffffffff166080610fc7565b6116e78567ffffffffffffffff166040610fc7565b6116fc8767ffffffffffffffff166000610fc7565b1717176009556040517f1835882ee7a34ac194f717a35e09bb1d24c82a3b9d854ab6c9749525b714cdf29061173890869086908690869061467e565b60405180910390a150505050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006117b361272e565b306040516020016117c89594939291906145c2565b60405160208183030381529060405280519060200120905090565b6117f66117ee6114ae565b610192611513565b565b61180b64e8d4a5100082101560cb611513565b61182167016345785d8a000082111560ca611513565b60088190556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906114a3908390614566565b60008282016106988482101583611513565b60006118726107b3565b9050600061187e610adf565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b81526004016118ab929190614607565b60806040518083038186803b1580156118c357600080fd5b505afa1580156118d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118fb91906143cf565b6040517f18e736d40000000000000000000000000000000000000000000000000000000081529094506001600160a01b03851693506318e736d492506119489150859087906004016145ee565b600060405180830381600087803b15801561196257600080fd5b505af1158015611976573d6000803e3d6000fd5b5050505050505050565b61082c8183146067611513565b600060608061199a6114ae565b156119bd576119a98887612732565b90506119b88882610fb161281f565b611a09565b6119c5610fcb565b67ffffffffffffffff811180156119db57600080fd5b50604051908082528060200260200182016040528015611a05578160200160208202803683370190505b5090505b611a1488868661288a565b9093509150611a2388836128f6565b985098509895505050505050565b60005b611a3c610fcb565b81101561100757611a73838281518110611a5257fe5b6020026020010151838381518110611a6657fe5b6020026020010151611e1f565b838281518110611a7f57fe5b6020908102919091010152600101611a34565b333014611b81576000306001600160a01b0316600036604051611ab69291906144c4565b6000604051808303816000865af19150503d8060008114611af3576040519150601f19603f3d011682016040523d82523d6000602084013e611af8565b606091505b505090508060008114611b0757fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611b63573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b6060611b8b61100c565b9050611b978782611c22565b60006060611baf8c8c8c8c8c8c898d8d63ffffffff16565b5091509150611bc281848663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08301526020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b60005b611c2d610fcb565b81101561100757611c64838281518110611c4357fe5b6020026020010151838381518110611c5757fe5b6020026020010151612925565b838281518110611c7057fe5b6020908102919091010152600101611c25565b81516000908190815b81811015611cc457611cba868281518110611ca357fe5b60200260200101518461185690919063ffffffff16565b9250600101611c8c565b5081611cd557600092505050610698565b600082878302825b60ff811015611e07576000858a600081518110611cf657fe5b60200260200101510290506000600190505b86811015611d4a57611d40611d39611d33848e8581518110611d2657fe5b6020026020010151610f8d565b89610f8d565b868c612951565b9150600101611d08565b50839450611dbd611d8c611d73611d6a611d64878c610f8d565b85610f8d565b6103e88d612951565b611d86611d808a89610f8d565b88610f8d565b90611856565b611db7611daa611da06103e8880386610f8d565b6103e88e15612951565b611d868a60010189610f8d565b8b612951565b935084841115611de557600185850311611de05783975050505050505050610698565b611dfe565b600184860311611dfe5783975050505050505050610698565b50600101611cdd565b50611e13610142612654565b50505050509392505050565b6000611e2e8215156004611513565b82611e3b575060006105c2565b670de0b6b3a764000083810290611e5e90858381611e5557fe5b04146005611513565b828181611e6757fe5b049150506105c2565b61082c8282612971565b6000606080611e876117e3565b6060611e938988612732565b9050611ea28982610fb161281f565b60006060611eb18b8989612a2d565b91509150611ebf8b82612a86565b909d909c50909a5098505050505050505050565b60005b611ede610fcb565b81101561100757611f15838281518110611ef457fe5b6020026020010151838381518110611f0857fe5b6020026020010151612a93565b838281518110611f2157fe5b6020908102919091010152600101611ed6565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611f9757507f0000000000000000000000000000000000000000000000000000000000000000610980565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611ff857507f0000000000000000000000000000000000000000000000000000000000000000610980565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561205957507f0000000000000000000000000000000000000000000000000000000000000000610980565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156120ba57507f0000000000000000000000000000000000000000000000000000000000000000610980565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561211b57507f0000000000000000000000000000000000000000000000000000000000000000610980565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561217c57507f0000000000000000000000000000000000000000000000000000000000000000610980565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156121dd57507f0000000000000000000000000000000000000000000000000000000000000000610980565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561223e57507f0000000000000000000000000000000000000000000000000000000000000000610980565b610980610135612654565b60008061226160085484612ae190919063ffffffff16565b90506106988382610fb1565b60006106988383612925565b6000612290612286610fcb565b60021460d2611513565b60606000806122a0878787612b3b565b9250925092506122b28784848461253a565b979650505050505050565b60006106988383611e1f565b60006122d6612286610fcb565b60606000806122e6878787612b3b565b9250925092506122b287848484612510565b60006106988383612a93565b60006105c2612326600854670de0b6b3a7640000610fb190919063ffffffff16565b8390612a93565b6000612337610adf565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561236f57600080fd5b505afa158015612383573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107959190614164565b60006123b1611746565b82604051602001610a789291906144d4565b600060606123cf6117e3565b60006123da84612c28565b90506123f560008260028111156123ed57fe5b1460ce611513565b606061240085612c3e565b905061240f8151610847610fcb565b6124198187611c22565b6000612423611601565b509050600061243482846001611c83565b9050806124418184612c54565b9b929a509198505050505050505050565b61082c8282612c5f565b612468818242426116a8565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a0233816040516114a39190614566565b6002815110156124a6576105d9565b6000816000815181106124b557fe5b602002602001015190506000600190505b82518110156110075760008382815181106124dd57fe5b60200260200101519050612506816001600160a01b0316846001600160a01b0316106065611513565b91506001016124c6565b600061251a6117e3565b6000612524611601565b50905060006122b2828787878b60600151612ced565b60006125446117e3565b600061254e611601565b50905060006122b2828787878b60600151612db1565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b612583610abb565b6001600160a01b03161415801561259e575061259e83612e59565b156125c6576125ab610abb565b6001600160a01b0316336001600160a01b03161490506105c2565b6125ce61232d565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016125fd9392919061456f565b60206040518083038186803b15801561261557600080fd5b505afa158015612629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264d9190614065565b90506105c2565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b60006126d08484111583611513565b5050900390565b6000806000806126f36000600954612ec790919063ffffffff16565b600954909450612704906040612ec7565b600954909350612715906080612ec7565b6009549092506127269060c0612ec7565b905090919293565b4690565b60608061273d610fcb565b67ffffffffffffffff8111801561275357600080fd5b5060405190808252806020026020018201604052801561277d578160200160208202803683370190505b5090508261278c5790506105c2565b6000808560008151811061279c57fe5b602002602001015190506000600190505b6127b5610fcb565b8110156127ec5760008782815181106127ca57fe5b60200260200101519050828111156127e3578193508092505b506001016127ad565b506127fe600b5487600a548589612ed5565b83838151811061280a57fe5b60209081029190910101525090949350505050565b60005b61282a610fcb565b8110156128845761286584828151811061284057fe5b602002602001015184838151811061285457fe5b60200260200101518463ffffffff16565b84828151811061287157fe5b6020908102919091010152600101612822565b50505050565b60006060600061289984612c28565b905060008160028111156128a957fe5b14156128c3576128b98685612f49565b92509250506128ee565b60018160028111156128d157fe5b14156128e1576128b9868561300f565b6128b9868686613041565b505b935093915050565b6129038282610fb161281f565b600061290d611601565b50905061100761291f82856001611c83565b82612c54565b600082820261293f841580610faa575083858381610fa757fe5b670de0b6b3a764000090049392505050565b6000816129675761296284846130b8565b6104f4565b6104f48484611675565b6129886001600160a01b038316151561019b611513565b61299482600083611007565b6001600160a01b0382166000908152602081905260409020546129ba90826101a16126c1565b6001600160a01b0383166000908152602081905260409020556002546129e090826130d8565b6002556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612a21908590614566565b60405180910390a35050565b600060606000612a3c84612c28565b90506001816002811115612a4c57fe5b1415612a5d576128b98686866130e6565b6002816002811115612a6b57fe5b1415612a7b576128b9868561314b565b6128ec610136612654565b612903828261185661281f565b6000612aa28215156004611513565b82612aaf575060006105c2565b670de0b6b3a764000083810290612ac990858381611e5557fe5b826001820381612ad557fe5b046001019150506105c2565b6000828202612afb841580610faa575083858381610fa757fe5b80612b0a5760009150506105c2565b670de0b6b3a76400007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201612ad5565b6040805160028082526060828101909352600091829181602001602082028036833701905050925085602001516001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415612be25760009150600190508483600081518110612bb757fe5b6020026020010181815250508383600181518110612bd157fe5b602002602001018181525050612c1f565b60009050600191508383600081518110612bf857fe5b6020026020010181815250508483600181518110612c1257fe5b6020026020010181815250505b93509350939050565b6000818060200190518101906105c291906141ce565b6060818060200190518101906106989190614294565b600a91909155600b55565b612c6b60008383611007565b600254612c789082611856565b6002556001600160a01b038216600090815260208190526040902054612c9e9082611856565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612a21908590614566565b600080612cfc87876001611c83565b9050612d2483878681518110612d0e57fe5b6020026020010151610fb190919063ffffffff16565b868581518110612d3057fe5b6020026020010181815250506000612d4a888884896131db565b905083878681518110612d5957fe5b602002602001015101878681518110612d6e57fe5b602002602001018181525050612da56001611d86898981518110612d8e57fe5b602002602001015184610fb190919063ffffffff16565b98975050505050505050565b600080612dc087876001611c83565b9050612de883878781518110612dd257fe5b602002602001015161185690919063ffffffff16565b868681518110612df457fe5b6020026020010181815250506000612e0e888884886131db565b905083878781518110612e1d57fe5b602002602001015103878781518110612e3257fe5b602002602001018181525050612da56001612e53838a8981518110612d0e57fe5b90610fb1565b6000612e847f2f1a0bc900000000000000000000000000000000000000000000000000000000610a43565b821480612eb85750612eb57feb0f24d600000000000000000000000000000000000000000000000000000000610a43565b82145b806105c257506105c28261338b565b1c67ffffffffffffffff1690565b600080612ee4878787876131db565b905080868581518110612ef357fe5b602002602001015111612f0a5760009150506112f7565b600081878681518110612f1957fe5b6020026020010151039050612da5670de0b6b3a7640000612f43868461292590919063ffffffff16565b90611e1f565b60006060612f556117e3565b600080612f61856133ef565b91509150612f79612f70610fcb565b82106064611513565b6060612f83610fcb565b67ffffffffffffffff81118015612f9957600080fd5b50604051908082528060200260200182016040528015612fc3578160200160208202803683370190505b5090506000612fd0611601565b509050612fea81898587612fe26105dc565b600854613411565b828481518110612ff657fe5b6020908102919091010152509196919550909350505050565b60006060600061301e8461352d565b90506060613034868361302f6105dc565b613543565b9196919550909350505050565b6000606061304d6117e3565b6060600061305a856135f5565b9150915061306b8251610847610fcb565b6130758287611c22565b600061307f611601565b509050600061309a828a866130926105dc565b60085461360d565b90506130aa8382111560cf611513565b989297509195505050505050565b60006130c78215156004611513565b8183816130d057fe5b049392505050565b6000610698838360016126c1565b600060608060006130f6856135f5565b9150915061310c613105610fcb565b8351611980565b6131168287611c22565b6000613120611601565b509050600061313b828a866131336105dc565b6008546138a3565b90506130aa8382101560d0611513565b6000606060008061315b856133ef565b9150915061316a612f70610fcb565b6060613174610fcb565b67ffffffffffffffff8111801561318a57600080fd5b506040519080825280602002602001820160405280156131b4578160200160208202803683370190505b50905060006131c1611601565b509050612fea818985876131d36105dc565b600854613b32565b6000808451860290506000856000815181106131f357fe5b60200260200101519050600086518760008151811061320e57fe5b60200260200101510290506000600190505b87518110156132675761324c61324661323f848b8581518110611d2657fe5b8a51610f8d565b886130b8565b915061325d888281518110611ca357fe5b9250600101613220565b5086858151811061327457fe5b602002602001015182039150600061328c8788610f8d565b905060006132b86132ac6132a4846107378988610f8d565b6103e8610f8d565b8a8981518110611d2657fe5b905060006132d36132cc6132a48b896130b8565b8690611856565b90506000806132ef6132e58686611856565b6107378d86611856565b905060005b60ff81101561336f5781925061332461331186611d868586610f8d565b6107378e612e5388611d86886002610f8d565b91508282111561334d57600183830311613348575097506104f49650505050505050565b613367565b600182840311613367575097506104f49650505050505050565b6001016132f4565b5061337b610142612654565b5050505050505050949350505050565b60006133b67f38e9922e00000000000000000000000000000000000000000000000000000000610a43565b8214806105c257506133e77f50dd6ed900000000000000000000000000000000000000000000000000000000610a43565b909114919050565b60008082806020019051810190613406919061425e565b909590945092505050565b60008061342088886001611c83565b905060006134428261343c87613436818b610fb1565b90612a93565b90612ae1565b905060006134528a8a848b6131db565b90506000613466828b8b81518110612d0e57fe5b90506000805b8b518110156134a55761349b8c828151811061348457fe5b60200260200101518361185690919063ffffffff16565b915060010161346c565b5060006134ce828d8d815181106134b857fe5b6020026020010151611e1f90919063ffffffff16565b905060006134db82613c0f565b905060006134e98583612ae1565b905060006134f78683610fb1565b905061351861351183670de0b6b3a76400008e9003612925565b8290611856565b99505050505050505050509695505050505050565b6000818060200190518101906106989190614231565b606060006135518484611e1f565b90506060855167ffffffffffffffff8111801561356d57600080fd5b50604051908082528060200260200182016040528015613597578160200160208202803683370190505b50905060005b86518110156135eb576135cc838883815181106135b657fe5b602002602001015161292590919063ffffffff16565b8282815181106135d857fe5b602090810291909101015260010161359d565b5095945050505050565b606060008280602001905181019061340691906141ea565b600080805b86518110156136345761362a87828151811061348457fe5b9150600101613612565b506060855167ffffffffffffffff8111801561364f57600080fd5b50604051908082528060200260200182016040528015613679578160200160208202803683370190505b5090506000805b88518110156137405760006136b1858b848151811061369b57fe5b6020026020010151612a9390919063ffffffff16565b90506136ed8a83815181106136c257fe5b60200260200101516134368b85815181106136d957fe5b60200260200101518d8681518110612d0e57fe5b8483815181106136f957fe5b60200260200101818152505061373561372e8286858151811061371857fe5b6020026020010151612ae190919063ffffffff16565b8490611856565b925050600101613680565b506060885167ffffffffffffffff8111801561375b57600080fd5b50604051908082528060200260200182016040528015613785578160200160208202803683370190505b50905060005b89518110156138505760008482815181106137a257fe5b60200260200101518411156138095760006137cb6137bf86613c0f565b8d85815181106135b657fe5b905060006137df828d8681518110612d0e57fe5b90506138006137f982670de0b6b3a76400008d9003612a93565b8390611856565b92505050613820565b89828151811061381557fe5b602002602001015190505b613830818c8481518110612d0e57fe5b83838151811061383c57fe5b60209081029190910101525060010161378b565b50600061385f8b8b6001611c83565b9050600061386f8c846000611c83565b9050600061387d8284611e1f565b905061389261388b82613c0f565b8b90612ae1565b9d9c50505050505050505050505050565b600080805b86518110156138ca576138c087828151811061348457fe5b91506001016138a8565b506060855167ffffffffffffffff811180156138e557600080fd5b5060405190808252806020026020018201604052801561390f578160200160208202803683370190505b5090506000805b88518110156139a3576000613931858b84815181106134b857fe5b905061396d8a838151811061394257fe5b6020026020010151612f438b858151811061395957fe5b60200260200101518d8681518110612dd257fe5b84838151811061397957fe5b60200260200101818152505061399861372e828685815181106135b657fe5b925050600101613916565b506060885167ffffffffffffffff811180156139be57600080fd5b506040519080825280602002602001820160405280156139e8578160200160208202803683370190505b50905060005b8951811015613aa957600083858381518110613a0657fe5b60200260200101511115613a62576000613a2b6137bf86670de0b6b3a7640000610fb1565b90506000613a3f828d8681518110612d0e57fe5b9050613a596137f982670de0b6b3a76400008d9003612925565b92505050613a79565b898281518110613a6e57fe5b602002602001015190505b613a89818c8481518110612dd257fe5b838381518110613a9557fe5b6020908102919091010152506001016139ee565b506000613ab88b8b6001611c83565b90506000613ac88c846000611c83565b90506000613ad68284611e1f565b9050670de0b6b3a7640000811115613b2257613b148a7ffffffffffffffffffffffffffffffffffffffffffffffffff21f494c589c00008301612925565b9750505050505050506112f7565b60009750505050505050506112f7565b600080613b4188886001611c83565b90506000613b578261343c87613436818b611856565b90506000613b678a8a848b6131db565b90506000613b918a8a81518110613b7a57fe5b602002602001015183610fb190919063ffffffff16565b90506000805b8b51811015613bb957613baf8c828151811061348457fe5b9150600101613b97565b506000613bcc828d8d815181106134b857fe5b90506000613bd982613c0f565b90506000613be78583612ae1565b90506000613bf58683610fb1565b905061351861351183670de0b6b3a76400008e9003612a93565b6000670de0b6b3a76400008210613c275760006105c2565b50670de0b6b3a76400000390565b80356105c2816146ee565b600082601f830112613c50578081fd5b8135613c63613c5e826146ce565b6146a7565b818152915060208083019084810181840286018201871015613c8457600080fd5b60005b84811015613ca357813584529282019290820190600101613c87565b505050505092915050565b600082601f830112613cbe578081fd5b8151613ccc613c5e826146ce565b818152915060208083019084810181840286018201871015613ced57600080fd5b60005b84811015613ca357815184529282019290820190600101613cf0565b600082601f830112613d1c578081fd5b813567ffffffffffffffff811115613d32578182fd5b613d456020601f19601f840116016146a7565b9150808252836020828501011115613d5c57600080fd5b8060208401602084013760009082016020015292915050565b8035600281106105c257600080fd5b6000610120808385031215613d97578182fd5b613da0816146a7565b915050613dad8383613d75565b8152613dbc8360208401613c35565b6020820152613dce8360408401613c35565b6040820152606082013560608201526080820135608082015260a082013560a0820152613dfe8360c08401613c35565b60c0820152613e108360e08401613c35565b60e08201526101008083013567ffffffffffffffff811115613e3157600080fd5b613e3d85828601613d0c565b82840152505092915050565b600060208284031215613e5a578081fd5b8135610698816146ee565b60008060408385031215613e77578081fd5b8235613e82816146ee565b91506020830135613e92816146ee565b809150509250929050565b600080600060608486031215613eb1578081fd5b8335613ebc816146ee565b92506020840135613ecc816146ee565b929592945050506040919091013590565b600080600080600080600060e0888a031215613ef7578283fd5b8735613f02816146ee565b96506020880135613f12816146ee565b95506040880135945060608801359350608088013560ff81168114613f35578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613f64578182fd5b8235613f6f816146ee565b946020939093013593505050565b600080600060608486031215613f91578081fd5b835167ffffffffffffffff80821115613fa8578283fd5b818601915086601f830112613fbb578283fd5b8151613fc9613c5e826146ce565b80828252602080830192508086018b828387028901011115613fe9578788fd5b8796505b84871015614014578051614000816146ee565b845260019690960195928101928101613fed565b50890151909750935050508082111561402b578283fd5b5061403886828701613cae565b925050604084015190509250925092565b60006020828403121561405a578081fd5b813561069881614703565b600060208284031215614076578081fd5b815161069881614703565b600080600080600080600060e0888a03121561409b578081fd5b8735965060208801356140ad816146ee565b955060408801356140bd816146ee565b9450606088013567ffffffffffffffff808211156140d9578283fd5b6140e58b838c01613c40565b955060808a0135945060a08a0135935060c08a0135915080821115614108578283fd5b506141158a828b01613d0c565b91505092959891949750929550565b600060208284031215614135578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610698578182fd5b600060208284031215614175578081fd5b8151610698816146ee565b60008060408385031215614192578182fd5b823561419d816146ee565b9150602083013567ffffffffffffffff8111156141b8578182fd5b6141c485828601613d0c565b9150509250929050565b6000602082840312156141df578081fd5b815161069881614711565b6000806000606084860312156141fe578081fd5b835161420981614711565b602085015190935067ffffffffffffffff811115614225578182fd5b61403886828701613cae565b60008060408385031215614243578182fd5b825161424e81614711565b6020939093015192949293505050565b600080600060608486031215614272578081fd5b835161427d81614711565b602085015160409095015190969495509392505050565b600080604083850312156142a6578182fd5b82516142b181614711565b602084015190925067ffffffffffffffff8111156142cd578182fd5b6141c485828601613cae565b600080600080608085870312156142ee578182fd5b843567ffffffffffffffff80821115614305578384fd5b61431188838901613d84565b95506020870135915080821115614326578384fd5b5061433387828801613c40565b949794965050505060408301359260600135919050565b60008060006060848603121561435e578081fd5b833567ffffffffffffffff811115614374578182fd5b61438086828701613d84565b9660208601359650604090950135949350505050565b6000602082840312156143a7578081fd5b5035919050565b600080604083850312156143c0578182fd5b50508035926020909101359150565b600080600080608085870312156143e4578182fd5b8451935060208501519250604085015191506060850151614404816146ee565b939692955090935050565b6000815180845260208085019450808401835b8381101561443e57815187529582019590820190600101614422565b509495945050505050565b60008151808452815b8181101561446e57602081850181015186830182015201614452565b8181111561447f5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b600060408252614531604083018561440f565b82810360208401526112f7818561440f565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000838252604060208301526104f46040830184614449565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526106986020830184614449565b6000838252604060208301526104f4604083018461440f565b9283529015156020830152604082015260600190565b93845260208401929092526040830152606082015260800190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156146c657600080fd5b604052919050565b600067ffffffffffffffff8211156146e4578081fd5b5060209081020190565b6001600160a01b03811681146105d957600080fd5b80151581146105d957600080fd5b600381106105d957600080fdfea264697066735822122074699730ea8aa4fa00d2702d985bebe2cf30c6abf09e7ee52a1750d232c882ff64736f6c63430007010033a26469706673582212207cbe8f85ba368fdc5070617b2e445e9210e8ccfb093bd1e3452a817f143214c064736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/index.ts b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/index.ts new file mode 100644 index 0000000..fd8f1be --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/index.ts @@ -0,0 +1,8 @@ +import { Task, TaskRunOptions } from '@src'; +import { StablePoolDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as StablePoolDeployment; + const args = [input.Vault]; + await task.deployAndVerify('StablePoolFactory', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/input.ts b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/input.ts new file mode 100644 index 0000000..00f1a74 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type StablePoolDeployment = { + Vault: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/output/arbitrum.json new file mode 100644 index 0000000..8350596 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "StablePoolFactory": "0x2433477A10FC5d31B9513C638F19eE85CaED53Fd" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/output/goerli.json new file mode 100644 index 0000000..f4363dc --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/output/goerli.json @@ -0,0 +1,3 @@ +{ + "StablePoolFactory": "0x44afeb87c871D8fEA9398a026DeA2BD3A13F5769" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/output/kovan.json b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/output/kovan.json new file mode 100644 index 0000000..eb60ee1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/output/kovan.json @@ -0,0 +1,3 @@ +{ + "StablePoolFactory": "0x751dfDAcE1AD995fF13c927f6f761C6604532c79" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/output/mainnet.json new file mode 100644 index 0000000..0c4f556 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "StablePoolFactory": "0xc66Ba2B6595D3613CCab350C886aCE23866EDe24" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/output/optimism.json b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/output/optimism.json new file mode 100644 index 0000000..b4306e5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/output/optimism.json @@ -0,0 +1,3 @@ +{ + "StablePoolFactory": "0x41B953164995c11C81DA73D212ED8Af25741b7Ac" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/output/polygon.json new file mode 100644 index 0000000..0c4f556 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/output/polygon.json @@ -0,0 +1,3 @@ +{ + "StablePoolFactory": "0xc66Ba2B6595D3613CCab350C886aCE23866EDe24" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/output/rinkeby.json b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/output/rinkeby.json new file mode 100644 index 0000000..0c4f556 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/output/rinkeby.json @@ -0,0 +1,3 @@ +{ + "StablePoolFactory": "0xc66Ba2B6595D3613CCab350C886aCE23866EDe24" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/readme.md b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/readme.md new file mode 100644 index 0000000..9f6f7a8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/readme.md @@ -0,0 +1,16 @@ +# 2021-06-24 - Stable Pool + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This factory and associated Pools have been deprecated due to numerical issues when one of the token depegs. It was superseded by an [updated version (also now deprecated)](../20220609-stable-pool-v2). + +Deployment of the `StablePoolFactory`, for Stable Pools of up to 5 tokens. + +## Useful Files + +- [Ethereum mainnet address](./output/mainnet.json) +- [Polygon mainnet address](./output/polygon.json) +- [Arbitrum mainnet address](./output/arbitrum.json) +- [Optimism mainnet address](./output/optimism.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`StablePoolFactory` artifact](./artifact/StablePoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/test/task.fork.ts new file mode 100644 index 0000000..c39bf2d --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210624-stable-pool/test/task.fork.ts @@ -0,0 +1,102 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import { StablePoolEncoder } from '@helpers/models/pools/stable/encoder'; +import { SwapKind } from '@helpers/models/types/types'; +import * as expectEvent from '@helpers/expectEvent'; +import { bn, fp } from '@helpers/numbers'; +import { calculateInvariant } from '@helpers/models/pools/stable/math'; +import { expectEqualWithError } from '@helpers/relativeError'; + +import { MAX_UINT256 } from '@helpers/constants'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; + +import { getSigner, impersonate, getForkedNetwork, Task, TaskMode, describeForkTest } from '@src'; + +describeForkTest('StablePoolFactory', 'mainnet', 14850000, function () { + let owner: SignerWithAddress, whale: SignerWithAddress; + let pool: Contract, factory: Contract, vault: Contract, usdc: Contract, dai: Contract; + + let task: Task; + + const DAI = '0x6b175474e89094c44da98b954eedeac495271d0f'; + const USDC = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'; + + const tokens = [DAI, USDC]; + const amplificationParameter = bn(100); + const swapFeePercentage = fp(0.01); + const initialBalanceDAI = fp(1e6); + const initialBalanceUSDC = fp(1e6).div(1e12); // 6 digits + const initialBalances = [initialBalanceDAI, initialBalanceUSDC]; + + const LARGE_TOKEN_HOLDER = '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503'; + + before('run task', async () => { + task = new Task('20210624-stable-pool', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('StablePoolFactory'); + }); + + before('load signers', async () => { + owner = await getSigner(); + whale = await impersonate(LARGE_TOKEN_HOLDER); + }); + + before('load vault and tokens', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.instanceAt('Vault', await factory.getVault()); + dai = await task.instanceAt('IERC20', DAI); + usdc = await task.instanceAt('IERC20', USDC); + }); + + it('deploy a stable pool', async () => { + const tx = await factory.create('SP', 'SPT', tokens, amplificationParameter, swapFeePercentage, owner.address); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await task.instanceAt('StablePool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + const poolId = pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + }); + + it('can initialize a stable pool', async () => { + await dai.connect(whale).approve(vault.address, MAX_UINT256); + await usdc.connect(whale).approve(vault.address, MAX_UINT256); + + const poolId = await pool.getPoolId(); + const userData = StablePoolEncoder.joinInit(initialBalances); + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: tokens, + maxAmountsIn: initialBalances, + fromInternalBalance: false, + userData, + }); + + const expectedInvariant = calculateInvariant([initialBalanceDAI, initialBalanceDAI], amplificationParameter); + expectEqualWithError(await pool.balanceOf(owner.address), expectedInvariant, 0.001); + }); + + it('can swap in a stable pool', async () => { + const amount = fp(500); + await dai.connect(whale).transfer(owner.address, amount); + await dai.connect(owner).approve(vault.address, amount); + + const poolId = await pool.getPoolId(); + await vault + .connect(owner) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: DAI, assetOut: USDC, amount, userData: '0x' }, + { sender: owner.address, recipient: owner.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert pool swap + const expectedUSDC = amount.div(1e12); + expectEqualWithError(await dai.balanceOf(owner.address), 0, 0.0001); + expectEqualWithError(await usdc.balanceOf(owner.address), expectedUSDC, 0.1); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/artifact/LiquidityBootstrappingPool.json b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/artifact/LiquidityBootstrappingPool.json new file mode 100644 index 0000000..278f7e9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/artifact/LiquidityBootstrappingPool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20[]", "name": "tokens", "type": "address[]"}, {"internalType": "uint256[]", "name": "normalizedWeights", "type": "uint256[]"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "bool", "name": "swapEnabledOnStart", "type": "bool"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "startTime", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "endTime", "type": "uint256"}, {"indexed": false, "internalType": "uint256[]", "name": "startWeights", "type": "uint256[]"}, {"indexed": false, "internalType": "uint256[]", "name": "endWeights", "type": "uint256[]"}], "name": "GradualWeightUpdateScheduled", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "swapEnabled", "type": "bool"}], "name": "SwapEnabledSet", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getGradualWeightUpdateParams", "outputs": [{"internalType": "uint256", "name": "startTime", "type": "uint256"}, {"internalType": "uint256", "name": "endTime", "type": "uint256"}, {"internalType": "uint256[]", "name": "endWeights", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getInvariant", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getLastInvariant", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getNormalizedWeights", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getScalingFactors", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapEnabled", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256", "name": "balanceTokenIn", "type": "uint256"}, {"internalType": "uint256", "name": "balanceTokenOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "bytes", "name": "poolConfig", "type": "bytes"}], "name": "setAssetManagerPoolConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bool", "name": "paused", "type": "bool"}], "name": "setPaused", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bool", "name": "swapEnabled", "type": "bool"}], "name": "setSwapEnabled", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "startTime", "type": "uint256"}, {"internalType": "uint256", "name": "endTime", "type": "uint256"}, {"internalType": "uint256[]", "name": "endWeights", "type": "uint256[]"}], "name": "updateWeightsGradually", "outputs": [], "stateMutability": "nonpayable", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/artifact/LiquidityBootstrappingPoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/artifact/LiquidityBootstrappingPoolFactory.json new file mode 100644 index 0000000..91765fc --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/artifact/LiquidityBootstrappingPoolFactory.json @@ -0,0 +1,165 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "LiquidityBootstrappingPoolFactory", + "sourceName": "contracts/smart/LiquidityBootstrappingPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "weights", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "bool", + "name": "swapEnabledOnStart", + "type": "bool" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101406040523480156200001257600080fd5b5060405162006d5238038062006d528339810160408190526200003591620001c3565b80604051806020016200004890620001b5565b601f1982820381018352601f909101166040528051819060006002820460a081905280830360e0819052818552909150836200009081620000f9602090811b6200028617901c565b60601b6001600160601b0319166080528285018051838252620000bf82620000f9602090811b6200028617901c565b6001600160601b0319606091821b811660c0529690935290529590951b90911661010052505050426276a700016101205250620001f39050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001476001600160a01b03831615156101ac6200014d565b50919050565b816200015e576200015e8162000162565b5050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b61603c8062000d1683390190565b600060208284031215620001d5578081fd5b81516001600160a01b0381168114620001ec578182fd5b9392505050565b60805160601c60a05160c05160601c60e0516101005160601c61012051610ac162000255600039806101d352806101fc5250806102645250806102ed52508061014a528061036952508061030e52508061012952806103455250610ac16000f3fe608060405234801561001057600080fd5b50600436106100715760003560e01c80632da47c40116100505780632da47c40146100ca5780636634b753146100e05780638d928af81461010057610071565b8062c194db14610076578063174481fa1461009457806323679719146100aa575b600080fd5b61007e610108565b60405161008b919061090e565b60405180910390f35b61009c610127565b60405161008b9291906108dc565b6100bd6100b8366004610723565b61016d565b60405161008b91906108bb565b6100d26101cd565b60405161008b9291906109f8565b6100f36100ee366004610707565b610237565b60405161008b9190610903565b6100bd610262565b6060610122604051806020016040528060008152506102e5565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080600061017a6101cd565b915091506101bf610189610262565b8b8b8b8b8b88888d8d6040516020016101ab9a99989796959493929190610921565b6040516020818303038152906040526103be565b9a9950505050505050505050565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561022957807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610232565b60009250600091505b509091565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506102df73ffffffffffffffffffffffffffffffffffffffff831615156101ac610449565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016103b081838661045b565b505050505050505050919050565b6000806103ca836104d5565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b81610457576104578161051d565b5050565b5b602081106104995781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00161045c565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600060606104e2836102e5565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff8116610516573d6000803e3d6000fd5b9392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b803561059581610a66565b92915050565b600082601f8301126105ab578081fd5b81356105be6105b982610a2d565b610a06565b8181529150602080830190848101818402860182018710156105df57600080fd5b60005b848110156106075781356105f581610a66565b845292820192908201906001016105e2565b505050505092915050565b600082601f830112610622578081fd5b81356106306105b982610a2d565b81815291506020808301908481018184028601820187101561065157600080fd5b60005b8481101561060757813584529282019290820190600101610654565b8035801515811461059557600080fd5b600082601f830112610690578081fd5b813567ffffffffffffffff8111156106a6578182fd5b6106d760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610a06565b91508082528360208285010111156106ee57600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215610718578081fd5b813561051681610a66565b600080600080600080600060e0888a03121561073d578283fd5b873567ffffffffffffffff80821115610754578485fd5b6107608b838c01610680565b985060208a0135915080821115610775578485fd5b6107818b838c01610680565b975060408a0135915080821115610796578485fd5b6107a28b838c0161059b565b965060608a01359150808211156107b7578485fd5b506107c48a828b01610612565b945050608088013592506107db8960a08a0161058a565b91506107ea8960c08a01610670565b905092959891949750929550565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208085019450808401835b8381101561084157815187529582019590820190600101610825565b509495945050505050565b15159052565b60008151808452815b818110156108775760208185018101518683018201520161085b565b818111156108885782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b6000602082526105166020830184610852565b600061014073ffffffffffffffffffffffffffffffffffffffff8d168352602081818501526109528285018e610852565b91508382036040850152610966828d610852565b84810360608601528b51808252828d01935090820190845b818110156109a2576109908551610a4d565b8352938301939183019160010161097e565b505084810360808601526109b6818c610812565b93505050508660a08301528560c08301528460e08301526109db6101008301856107f8565b6109e961012083018461084c565b9b9a5050505050505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610a2557600080fd5b604052919050565b600067ffffffffffffffff821115610a43578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff81168114610a8857600080fd5b5056fea2646970667358221220779398a457593d40d00df5a736155eaeeec695dbbf4cea4b34d37c780dc16e6d64736f6c634300070100336102e06040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b506040516200603c3803806200603c8339810160408190526200005a9162000d48565b898989898a516001600160401b03811180156200007657600080fd5b50604051908082528060200260200182016040528015620000a1578160200160208202803683370190505b5089898989888651600214620000b9576001620000bc565b60025b8989898989898989828289898180604051806040016040528060018152602001603160f81b815250848489336001600160a01b031660001b806080818152505050806001600160a01b031660a0816001600160a01b031660601b815250505081600390805190602001906200013392919062000b00565b5080516200014990600490602084019062000b00565b50506005805460ff1916601217905550815160209283012060c052805191012060e05250507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6101005250620001a86276a70083111561019462000511565b620001bc62278d0082111561019562000511565b4290910161014081905201610160528551620001de906002111560c862000511565b620001f8620001ec62000526565b8751111560c962000511565b6200020e866200052b60201b620010291760201c565b620002198462000537565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f906200024a908d9060040162000f5d565b602060405180830381600087803b1580156200026557600080fd5b505af11580156200027a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a0919062000d2f565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002d59084908b908b9060040162000ec1565b600060405180830381600087803b158015620002f057600080fd5b505af115801562000305573d6000803e3d6000fd5b505050508a6001600160a01b0316610180816001600160a01b031660601b81525050806101a0818152505050505050505050505050505050505050505050506001600a819055506000875190506200036a818851620005c360201b620010331760201c565b6101c0819052875188906000906200037e57fe5b60200260200101516001600160a01b03166101e0816001600160a01b031660601b8152505087600181518110620003b157fe5b60200260200101516001600160a01b0316610200816001600160a01b031660601b8152505060028111620003e7576000620003fe565b87600281518110620003f557fe5b60200260200101515b60601b6001600160601b03191661022052600381116200042057600062000437565b876003815181106200042e57fe5b60200260200101515b6001600160a01b0316610240816001600160a01b031660601b815250506200047a886000815181106200046657fe5b6020026020010151620005d260201b60201c565b6102605287516200049390899060019081106200046657fe5b6102805260028111620004a8576000620004ba565b620004ba886002815181106200046657fe5b6102a05260038111620004cf576000620004e1565b620004e1886003815181106200046657fe5b6102c05242620004f481808a806200067e565b620004ff836200080c565b50505050505050505050505062001024565b816200052257620005228162000860565b5050565b600490565b806200052281620008b3565b6200054c64e8d4a5100082101560cb62000511565b6200056467016345785d8a000082111560ca62000511565b620005838160c06008546200094060201b62001040179092919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90620005b890839062000f72565b60405180910390a150565b62000522828214606762000511565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200060f57600080fd5b505afa15801562000624573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200064a919062000e57565b60ff1690506000620006696012836200095560201b620010561760201c565b600a0a670de0b6b3a764000002949350505050565b600b546000805b83518110156200076f5760008482815181106200069e57fe5b60200260200101519050620006c6662386f26fc1000082101561012e6200051160201b60201c565b62000747620006e0826200097260201b6200106c1760201c565b8360100260800162000732620007158a8781518110620006fc57fe5b6020026020010151620009b360201b6200108c1760201c565b86601f0260040189620009e060201b620010a8179092919060201c565b620009f260201b620010ba179092919060201c565b935062000763818462000a0260201b620010ca1790919060201c565b92505060010162000685565b5062000788670de0b6b3a7640000821461013462000511565b620007c18560e0620007ac8960c08762000a1d60201b620010dc179092919060201c565b62000a1d60201b620010dc179092919060201c565b600b556040517f0f3631f9dab08169d1db21c6dc5f32536fb2b0a6b9bb5330d71c52132f968be090620007fc90889088908890889062000f7b565b60405180910390a1505050505050565b6200082b816000600b5462000a2f60201b620010ee179092919060201c565b600b556040517f5a9e84f78f7957cb4ed7478eb0fcad35ee4ecbe2e0f298420b28a3955392573f90620005b890839062000eb6565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600281511015620008c4576200093d565b600081600081518110620008d457fe5b602002602001015190506000600190505b82518110156200093a576000838281518110620008fe57fe5b602002602001015190506200092f816001600160a01b0316846001600160a01b03161060656200051160201b60201c565b9150600101620008e5565b50505b50565b6001600160401b03811b1992909216911b1790565b60006200096783831115600162000511565b508082035b92915050565b60006200096c670de0b6b3a76400006200099f61ffff80168562000a5860201b620011151790919060201c565b62000aad60201b620011811790919060201c565b60006200096c670de0b6b3a76400006200099f637fffffff8562000a5860201b620011151790919060201c565b637fffffff811b1992909216911b1790565b61ffff811b1992909216911b1790565b600082820162000a16848210158362000511565b9392505050565b63ffffffff811b1992909216911b1790565b60006001821b198416828462000a4757600062000a4a565b60015b60ff16901b17949350505050565b600082820262000a8084158062000a7857508385838162000a7557fe5b04145b600362000511565b8062000a915760009150506200096c565b670de0b6b3a764000060001982015b046001019150506200096c565b600062000abe821515600462000511565b8262000acd575060006200096c565b670de0b6b3a76400008381029062000af39085838162000ae957fe5b0414600562000511565b82600182038162000aa057fe5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000b4357805160ff191683800117855562000b73565b8280016001018555821562000b73579182015b8281111562000b7357825182559160200191906001019062000b56565b5062000b8192915062000b85565b5090565b5b8082111562000b81576000815560010162000b86565b80516200096c816200100e565b600082601f83011262000bba578081fd5b815162000bd162000bcb8262000fe2565b62000fbb565b81815291506020808301908481018184028601820187101562000bf357600080fd5b60005b8481101562000c1f57815162000c0c816200100e565b8452928201929082019060010162000bf6565b505050505092915050565b600082601f83011262000c3b578081fd5b815162000c4c62000bcb8262000fe2565b81815291506020808301908481018184028601820187101562000c6e57600080fd5b60005b8481101562000c1f5781518452928201929082019060010162000c71565b805180151581146200096c57600080fd5b600082601f83011262000cb1578081fd5b81516001600160401b0381111562000cc7578182fd5b602062000cdd601f8301601f1916820162000fbb565b9250818352848183860101111562000cf457600080fd5b60005b8281101562000d1457848101820151848201830152810162000cf7565b8281111562000d265760008284860101525b50505092915050565b60006020828403121562000d41578081fd5b5051919050565b6000806000806000806000806000806101408b8d03121562000d68578586fd5b62000d748c8c62000b9c565b60208c0151909a506001600160401b038082111562000d91578788fd5b62000d9f8e838f0162000ca0565b9a5060408d015191508082111562000db5578788fd5b62000dc38e838f0162000ca0565b995060608d015191508082111562000dd9578788fd5b62000de78e838f0162000ba9565b985060808d015191508082111562000dfd578788fd5b5062000e0c8d828e0162000c2a565b96505060a08b0151945060c08b0151935060e08b0151925062000e348c6101008d0162000b9c565b915062000e468c6101208d0162000c8f565b90509295989b9194979a5092959850565b60006020828403121562000e69578081fd5b815160ff8116811462000a16578182fd5b6000815180845260208085019450808401835b8381101562000eab5781518752958201959082019060010162000e8d565b509495945050505050565b901515815260200190565b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000f0d5762000efa855162001002565b8352938301939183019160010162000ee5565b505084810360408601528551808252908201925081860190845b8181101562000f4f5762000f3c835162001002565b8552938301939183019160010162000f27565b509298975050505050505050565b602081016003831062000f6c57fe5b91905290565b90815260200190565b60008582528460208301526080604083015262000f9c608083018562000e7a565b828103606084015262000fb0818562000e7a565b979650505050505050565b6040518181016001600160401b038111828210171562000fda57600080fd5b604052919050565b60006001600160401b0382111562000ff8578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146200093d57600080fd5b60805160a05160601c60c05160e051610100516101205161014051610160516101805160601c6101a0516101c0516101e05160601c6102005160601c6102205160601c6102405160601c61026051610280516102a0516102c051614f126200112a600039806114ae528061207852508061146b52806120175250806114285280611fb65250806113d75280611f5552508061203d5280612f83525080611fdc5280612f41525080611f7b5280612eff525080611f1a5280612ebd525080611712525080610716525080610ab5525080611359525080611335525080610d925250806115de5250806116205250806115ff525080610a91525080610a1b5250614f126000f3fe608060405234801561001057600080fd5b50600436106102925760003560e01c806374f3b009116101605780639d2c110c116100d8578063d505accf1161008c578063dd62ed3e11610071578063dd62ed3e14610508578063e01af92c1461051b578063f89f27ed1461052e57610292565b8063d505accf146104e2578063d5c096c4146104f557610292565b8063a9059cbb116100bd578063a9059cbb146104bf578063aaabadc5146104d2578063c0ff1a15146104da57610292565b80639d2c110c14610499578063a457c2d7146104ac57610292565b806387ec68171161012f5780638d928af8116101145780638d928af81461048157806395d89b41146104895780639b02cdde1461049157610292565b806387ec681714610459578063893d20e81461046c57610292565b806374f3b009146103fb5780637beed2201461041c5780637ecebe0014610433578063851c1bb31461044657610292565b806338e9922e1161020e57806350dd6ed9116101c25780636028bfd4116101a75780636028bfd4146103bf578063679aefce146103e057806370a08231146103e857610292565b806350dd6ed9146103a457806355c67628146103b757610292565b806339509351116101f357806339509351146103765780633e5692051461038957806347bc4d921461039c57610292565b806338e9922e1461035b57806338fff2d01461036e57610292565b80631c0de0511161026557806323b872dd1161024a57806323b872dd1461032b578063313ce5671461033e5780633644e5151461035357610292565b80631c0de051146102ff5780631dd746ea1461031657610292565b806306fdde0314610297578063095ea7b3146102b557806316c38b3c146102d557806318160ddd146102ea575b600080fd5b61029f610536565b6040516102ac9190614ddb565b60405180910390f35b6102c86102c3366004614672565b6105eb565b6040516102ac9190614ce2565b6102e86102e3366004614769565b610602565b005b6102f2610616565b6040516102ac9190614d05565b61030761061c565b6040516102ac93929190614ced565b61031e610645565b6040516102ac9190614caa565b6102c86103393660046145bd565b610654565b6103466106e8565b6040516102ac9190614e57565b6102f26106f1565b6102e8610369366004614af5565b6106fb565b6102f2610714565b6102c8610384366004614672565b610738565b6102e8610397366004614b0d565b610773565b6102c86107da565b6102e86103b23660046148a0565b6107ea565b6102f2610808565b6103d26103cd3660046147a1565b610819565b6040516102ac929190614dee565b6102f2610850565b6102f26103f6366004614569565b61087b565b61040e6104093660046147a1565b61089a565b6040516102ac929190614cbd565b61042461093d565b6040516102ac93929190614e07565b6102f2610441366004614569565b6109fc565b6102f2610454366004614844565b610a17565b6103d26104673660046147a1565b610a69565b610474610a8f565b6040516102ac9190614c96565b610474610ab3565b61029f610ad7565b6102f2610b56565b6102f26104a73660046149f9565b610b5c565b6102c86104ba366004614672565b610c43565b6102c86104cd366004614672565b610c81565b610474610c8e565b6102f2610c98565b6102e86104f03660046145fd565b610d5d565b61040e6105033660046147a1565b610ea6565b6102f2610516366004614585565b610fcb565b6102e8610529366004614769565b610ff6565b61031e61101f565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105e05780601f106105b5576101008083540402835291602001916105e0565b820191906000526020600020905b8154815290600101906020018083116105c357829003601f168201915b505050505090505b90565b60006105f83384846111cc565b5060015b92915050565b61060a611234565b6106138161127a565b50565b60025490565b6000806000610629611316565b159250610634611333565b915061063e611357565b9050909192565b606061064f61137b565b905090565b6000806106618533610fcb565b9050610685336001600160a01b038716148061067d5750838210155b61019e6114ec565b6106908585856114fa565b336001600160a01b038616148015906106c957507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114155b156106db576106db85338584036111cc565b60019150505b9392505050565b60055460ff1690565b600061064f6115da565b610703611234565b61070b611677565b6106138161168c565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916105f891859061076e90866110ca565b6111cc565b61077b611234565b610783611677565b61078b6116f7565b61079d610796611710565b8251611033565b426107a88185611734565b93506107b9838511156101466114ec565b6107cc84846107c661174b565b8561185f565b506107d5611974565b505050565b600b5460009061064f908261197b565b6107f2611234565b6107fa611677565b6108048282611985565b5050565b60085460009061064f9060c0611a9d565b6000606061082f865161082a611710565b611033565b61084489898989898989611aab611b7b611bdc565b97509795505050505050565b600061064f61085d610616565b610875610868610c98565b610870611710565b611d6c565b90611d86565b6001600160a01b0381166000908152602081905260409020545b919050565b606080886108c46108a9610ab3565b6001600160a01b0316336001600160a01b03161460cd6114ec565b6108d96108cf610714565b82146101f46114ec565b60606108e361137b565b90506108ef8882611dce565b60006060806109048e8e8e8e8e8e8a8f611aab565b9250925092506109148d84611e2f565b61091e8285611b7b565b6109288185611b7b565b909550935050505b5097509795505050505050565b600b5460009081906060906109538160c0611e39565b93506109608160e0611e39565b9250600061096c611710565b90508067ffffffffffffffff8111801561098557600080fd5b506040519080825280602002602001820160405280156109af578160200160208202803683370190505b50925060005b818110156109f4576109d56109d08460806010850201611e43565b611e4b565b8482815181106109e157fe5b60209081029190910101526001016109b5565b505050909192565b6001600160a01b031660009081526006602052604090205490565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610a4c929190614c20565b604051602081830303815290604052805190602001209050919050565b60006060610a7a865161082a611710565b61084489898989898989611e65611eb5611bdc565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105e05780601f106105b5576101008083540402835291602001916105e0565b60095490565b600080610b6c8560200151611f16565b90506000610b7d8660400151611f16565b9050600086516001811115610b8e57fe5b1415610bf457610ba186606001516120a7565b6060870152610bb085836120c8565b9450610bbc84826120c8565b9350610bcc8660600151836120c8565b60608701526000610bde8787876120d4565b9050610bea81836120fc565b93505050506106e1565b610bfe85836120c8565b9450610c0a84826120c8565b9350610c1a8660600151826120c8565b60608701526000610c2c878787612108565b9050610c388184612120565b9050610bea8161212c565b600080610c503385610fcb565b9050808310610c6a57610c65338560006111cc565b610c77565b610c7733858584036111cc565b5060019392505050565b60006105f83384846114fa565b600061064f612152565b60006060610ca4610ab3565b6001600160a01b031663f94d4668610cba610714565b6040518263ffffffff1660e01b8152600401610cd69190614d05565b60006040518083038186803b158015610cee57600080fd5b505afa158015610d02573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d2a919081019061469d565b50915050610d3f81610d3a61137b565b611dce565b6060610d496121cc565b509050610d56818361224a565b9250505090565b610d6b8442111560d16114ec565b6001600160a01b0387166000908152600660209081526040808320549051909291610dc2917f0000000000000000000000000000000000000000000000000000000000000000918c918c918c9188918d9101614d2d565b6040516020818303038152906040528051906020012090506000610de5826122bc565b9050600060018288888860405160008152602001604052604051610e0c9493929190614dbd565b6020604051602081039080840390855afa158015610e2e573d6000803e3d6000fd5b5050604051601f1901519150610e7090506001600160a01b03821615801590610e6857508b6001600160a01b0316826001600160a01b0316145b6101f86114ec565b6001600160a01b038b166000908152600660205260409020600185019055610e998b8b8b6111cc565b5050505050505050505050565b60608088610eb56108a9610ab3565b610ec06108cf610714565b6060610eca61137b565b9050610ed4610616565b610f7b5760006060610ee98d8d8d868b6122d8565b91509150610efe620f424083101560cc6114ec565b610f0c6000620f424061231e565b610f1b8b620f4240840361231e565b610f258184611eb5565b80610f2e611710565b67ffffffffffffffff81118015610f4457600080fd5b50604051908082528060200260200182016040528015610f6e578160200160208202803683370190505b5095509550505050610930565b610f858882611dce565b6000606080610f9a8e8e8e8e8e8e8a8f611e65565b925092509250610faa8c8461231e565b610fb48285611eb5565b610fbe8185611b7b565b9095509350610930915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610ffe611234565b611006611677565b61100e6116f7565b61101781612328565b610613611974565b606061064f61174b565b806108048161236a565b61080481831460676114ec565b67ffffffffffffffff811b1992909216911b1790565b60006110668383111560016114ec565b50900390565b60006105fc670de0b6b3a76400006110868461ffff611115565b90611181565b60006105fc670de0b6b3a764000061108684637fffffff611115565b637fffffff811b1992909216911b1790565b61ffff811b1992909216911b1790565b60008282016106e184821015836114ec565b63ffffffff811b1992909216911b1790565b60006001821b1984168284611104576000611107565b60015b60ff16901b17949350505050565b600082820261113984158061113257508385838161112f57fe5b04145b60036114ec565b806111485760009150506105fc565b670de0b6b3a76400007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b046001019150506105fc565b600061119082151560046114ec565b8261119d575060006105fc565b670de0b6b3a7640000838102906111c0908583816111b757fe5b041460056114ec565b82600182038161117557fe5b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611227908590614d05565b60405180910390a3505050565b60006112636000357fffffffff0000000000000000000000000000000000000000000000000000000016610a17565b905061061361127282336123e3565b6101916114ec565b801561129a5761129561128b611333565b42106101936114ec565b6112af565b6112af6112a5611357565b42106101a96114ec565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be649061130b908390614ce2565b60405180910390a150565b6000611320611357565b42118061064f57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60606000611387611710565b905060608167ffffffffffffffff811180156113a257600080fd5b506040519080825280602002602001820160405280156113cc578160200160208202803683370190505b5090508115611414577f00000000000000000000000000000000000000000000000000000000000000008160008151811061140357fe5b60200260200101818152505061141d565b91506105e89050565b6001821115611414577f00000000000000000000000000000000000000000000000000000000000000008160018151811061145457fe5b6020026020010181815250506002821115611414577f00000000000000000000000000000000000000000000000000000000000000008160028151811061149757fe5b6020026020010181815250506003821115611414577f0000000000000000000000000000000000000000000000000000000000000000816003815181106114da57fe5b60200260200101818152505091505090565b8161080457610804816124d3565b6115116001600160a01b03841615156101986114ec565b6115286001600160a01b03831615156101996114ec565b6115338383836107d5565b6001600160a01b03831660009081526020819052604090205461155990826101a0612540565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461158890826110ca565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611227908590614d05565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611647612556565b3060405160200161165c959493929190614d61565b60405160208183030381529060405280519060200120905090565b61168a611682611316565b6101926114ec565b565b61169f64e8d4a5100082101560cb6114ec565b6116b567016345785d8a000082111560ca6114ec565b6008546116c4908260c0611040565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc9061130b908390614d05565b6117096002600a5414156101906114ec565b6002600a55565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008183101561174457816106e1565b5090919050565b60606000611757611710565b905060608167ffffffffffffffff8111801561177257600080fd5b5060405190808252806020026020018201604052801561179c578160200160208202803683370190505b50600b549091506117ae60008261255a565b826000815181106117bb57fe5b6020026020010181815250506117d260018261255a565b826001815181106117df57fe5b60200260200101818152505082600214156117fe575091506105e89050565b61180960028261255a565b8260028151811061181657fe5b6020026020010181815250508260031415611835575091506105e89050565b61184060038261255a565b8260038151811061184d57fe5b60209081029190910101525091505090565b600b546000805b83518110156118fb57600084828151811061187d57fe5b6020026020010151905061189d662386f26fc1000082101561012e6114ec565b6118e46118a98261106c565b836010026080016118dd6118cf8a87815181106118c257fe5b602002602001015161108c565b88906004601f8902016110a8565b91906110ba565b93506118f083826110ca565b925050600101611866565b50611912670de0b6b3a764000082146101346114ec565b61192b8560e0611924858a60c06110dc565b91906110dc565b600b556040517f0f3631f9dab08169d1db21c6dc5f32536fb2b0a6b9bb5330d71c52132f968be090611964908890889088908890614e26565b60405180910390a1505050505050565b6001600a55565b1c60019081161490565b600061198f610714565b9050600061199b610ab3565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b81526004016119c8929190614da6565b60806040518083038186803b1580156119e057600080fd5b505afa1580156119f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a189190614b5b565b6040517f18e736d40000000000000000000000000000000000000000000000000000000081529094506001600160a01b03851693506318e736d49250611a65915085908790600401614d8d565b600060405180830381600087803b158015611a7f57600080fd5b505af1158015611a93573d6000803e3d6000fd5b5050505050505050565b1c67ffffffffffffffff1690565b600060608060606000611abc6121cc565b91509150611ac8611316565b15611b00576000611ad9838c61224a565b9050611aeb8b8484600954858e6125b0565b9350611afa8b8561105661265f565b50611b4c565b611b08611710565b67ffffffffffffffff81118015611b1e57600080fd5b50604051908082528060200260200182016040528015611b48578160200160208202803683370190505b5092505b611b588a8389896126ca565b9095509350611b688a8584612739565b6009555050985098509895505050505050565b60005b611b86611710565b8110156107d557611bbd838281518110611b9c57fe5b6020026020010151838381518110611bb057fe5b6020026020010151611d86565b838281518110611bc957fe5b6020908102919091010152600101611b7e565b333014611ccb576000306001600160a01b0316600036604051611c00929190614c50565b6000604051808303816000865af19150503d8060008114611c3d576040519150601f19603f3d011682016040523d82523d6000602084013e611c42565b606091505b505090508060008114611c5157fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611cad573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b6060611cd561137b565b9050611ce18782611dce565b60006060611cf98c8c8c8c8c8c898d8d63ffffffff16565b5091509150611d0c81848663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08301526020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b60008282026106e184158061113257508385838161112f57fe5b6000611d9582151560046114ec565b82611da2575060006105fc565b670de0b6b3a764000083810290611dbc908583816111b757fe5b828181611dc557fe5b049150506105fc565b60005b611dd9611710565b8110156107d557611e10838281518110611def57fe5b6020026020010151838381518110611e0357fe5b6020026020010151612752565b838281518110611e1c57fe5b6020908102919091010152600101611dd1565b610804828261277e565b1c63ffffffff1690565b1c61ffff1690565b60006105fc61ffff61108684670de0b6b3a7640000611115565b6000606080611e91611e75610a8f565b6001600160a01b03168b6001600160a01b0316146101486114ec565b611ea18b8b8b8b8b8b8b8b61283a565b925092509250985098509895505050505050565b60005b611ec0611710565b8110156107d557611ef7838281518110611ed657fe5b6020026020010151838381518110611eea57fe5b6020026020010151611181565b838281518110611f0357fe5b6020908102919091010152600101611eb8565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611f7957507f0000000000000000000000000000000000000000000000000000000000000000610895565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611fda57507f0000000000000000000000000000000000000000000000000000000000000000610895565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561203b57507f0000000000000000000000000000000000000000000000000000000000000000610895565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561209c57507f0000000000000000000000000000000000000000000000000000000000000000610895565b6108956101356124d3565b6000806120bc6120b5610808565b8490611115565b90506106e18382611056565b60006106e18383612752565b60006120e96120e16107da565b6101476114ec565b6120f48484846128c0565b949350505050565b60006106e18383611d86565b60006121156120e16107da565b6120f48484846128f3565b60006106e18383611181565b60006105fc61214b61213c610808565b670de0b6b3a764000090611056565b8390611181565b600061215c610ab3565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561219457600080fd5b505afa1580156121a8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064f9190614884565b606060006121d861174b565b9150600090506000826000815181106121ed57fe5b602002602001015190506000600190505b8351811015612244578184828151811061221457fe5b6020026020010151111561223c5780925083818151811061223157fe5b602002602001015191505b6001016121fe565b50509091565b670de0b6b3a764000060005b83518110156122ac576122a261229b85838151811061227157fe5b602002602001015185848151811061228557fe5b602002602001015161292690919063ffffffff16565b8390612752565b9150600101612256565b506105fc600082116101376114ec565b60006122c66115da565b82604051602001610a4c929190614c60565b600060606123036122e7610a8f565b6001600160a01b0316876001600160a01b0316146101486114ec565b6123108787878787612975565b915091509550959350505050565b6108048282612a09565b600b54612337908260006110ee565b600b556040517f5a9e84f78f7957cb4ed7478eb0fcad35ee4ecbe2e0f298420b28a3955392573f9061130b908390614ce2565b60028151101561237957610613565b60008160008151811061238857fe5b602002602001015190506000600190505b82518110156107d55760008382815181106123b057fe5b602002602001015190506123d9816001600160a01b0316846001600160a01b03161060656114ec565b9150600101612399565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b612402610a8f565b6001600160a01b03161415801561241d575061241d83612a97565b156124455761242a610a8f565b6001600160a01b0316336001600160a01b03161490506105fc565b61244d612152565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161247c93929190614d0e565b60206040518083038186803b15801561249457600080fd5b505afa1580156124a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cc9190614785565b90506105fc565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600061254f84841115836114ec565b5050900390565b4690565b600080612575612570846004601f880201612b05565b612b0f565b9050600061258c6109d08560806010890201611e43565b9050600061259985612b2b565b90506125a6838383612baa565b9695505050505050565b6060806125bb611710565b67ffffffffffffffff811180156125d157600080fd5b506040519080825280602002602001820160405280156125fb578160200160208202803683370190505b5090508261260a5790506125a6565b61263d88878151811061261957fe5b602002602001015188888151811061262d57fe5b6020026020010151878787612c1e565b81878151811061264957fe5b6020908102919091010152979650505050505050565b60005b61266a611710565b8110156126c4576126a584828151811061268057fe5b602002602001015184838151811061269457fe5b60200260200101518463ffffffff16565b8482815181106126b157fe5b6020908102919091010152600101612662565b50505050565b6000606060006126d984612ca6565b905060008160028111156126e957fe5b1415612704576126fa878786612cbc565b9250925050612730565b600181600281111561271257fe5b1415612722576126fa8785612d9f565b6126fa87878787612dd1565b505b94509492505050565b6000612748848461105661265f565b6120f4828561224a565b600082820261276c84158061113257508385838161112f57fe5b670de0b6b3a764000090049392505050565b6127956001600160a01b038316151561019b6114ec565b6127a1826000836107d5565b6001600160a01b0382166000908152602081905260409020546127c790826101a1612540565b6001600160a01b0383166000908152602081905260409020556002546127ed9082612e40565b6002556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061282e908590614d05565b60405180910390a35050565b6000606080612847611677565b606060006128536121cc565b915091506000612863838c61224a565b905060606128778c8585600954868f6125b0565b90506128868c8261105661265f565b600060606128968e878d8d612e4e565b915091506128a58e8288612ea9565b60095590975095509350505050985098509895505050505050565b60006128ca611677565b6120f4836128db8660200151612eb8565b846128e98860400151612eb8565b8860600151612fda565b60006128fd611677565b6120f48361290e8660200151612eb8565b8461291c8860400151612eb8565b8860600151613047565b60008061293384846130bd565b9050600061294d61294683612710611115565b60016110ca565b905080821015612962576000925050506105fc565b61296c8282611056565b925050506105fc565b60006060612981611677565b600061298c84612ca6565b90506129a7600082600281111561299f57fe5b1460ce6114ec565b60606129b2856131f0565b90506129bf610796611710565b6129c98187611dce565b60606129d36121cc565b50905060006129e2828461224a565b905060006129f282610870611710565b600992909255509a91995090975050505050505050565b612a15600083836107d5565b600254612a2290826110ca565b6002556001600160a01b038216600090815260208190526040902054612a4890826110ca565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061282e908590614d05565b6000612ac27fe01af92c00000000000000000000000000000000000000000000000000000000610a17565b821480612af65750612af37f3e56920500000000000000000000000000000000000000000000000000000000610a17565b82145b806105fc57506105fc82613206565b1c637fffffff1690565b60006105fc637fffffff61108684670de0b6b3a7640000611115565b60004281612b3a8460c0611e39565b90506000612b498560e0611e39565b905080831115612b6657670de0b6b3a76400009350505050610895565b81831015612b7a5760009350505050610895565b8181038284038115612b9557612b908183611d86565b612b9f565b670de0b6b3a76400005b979650505050505050565b6000811580612bb857508284145b15612bc45750826106e1565b670de0b6b3a76400008210612bda5750816106e1565b82841115612c04576000612bf083858703612752565b9050612bfc8582611056565b9150506106e1565b6000612c1283868603612752565b9050612bfc85826110ca565b6000838311612c2f57506000612c9d565b6000612c3b8585611181565b90506000612c51670de0b6b3a764000088611d86565b9050612c65826709b6e64a8ec60000611734565b91506000612c73838361326a565b90506000612c8a612c8383613296565b8b90612752565b9050612c968187612752565b9450505050505b95945050505050565b6000818060200190518101906105fc91906148ee565b60006060612cc8611677565b600080612cd4856132bc565b91509150612cec612ce3611710565b821060646114ec565b6060612cf6611710565b67ffffffffffffffff81118015612d0c57600080fd5b50604051908082528060200260200182016040528015612d36578160200160208202803683370190505b509050612d7a888381518110612d4857fe5b6020026020010151888481518110612d5c57fe5b602002602001015185612d6d610616565b612d75610808565b6132de565b818381518110612d8657fe5b6020908102919091010152919791965090945050505050565b600060606000612dae8461339e565b90506060612dc48683612dbf610616565b6133b4565b9196919550909350505050565b60006060612ddd611677565b60606000612dea85613466565b91509150612dfb825161082a611710565b612e058287611dce565b6000612e22898985612e15610616565b612e1d610808565b61347e565b9050612e328282111560cf6114ec565b989197509095505050505050565b60006106e183836001612540565b600060606000612e5d84612ca6565b90506001816002811115612e6d57fe5b1415612e7f576126fa878787876136ac565b6002816002811115612e8d57fe5b1415612e9e576126fa878786613709565b61272e6101366124d3565b600061274884846110ca61265f565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161415612efd57506000612fce565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161415612f3f57506001612fce565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161415612f8157506002612fce565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161415612fc357506003612fce565b612fce6101356124d3565b6106e181600b5461255a565b6000612ffc612ff187670429d069189e0000612752565b8311156101306114ec565b600061300887846110ca565b905060006130168883611181565b905060006130248887611d86565b90506000613032838361326a565b9050612c9661304082613296565b8990612752565b600061306961305e85670429d069189e0000612752565b8311156101316114ec565b600061307f6130788685611056565b8690611181565b9050600061308d8588611181565b9050600061309b838361326a565b905060006130b182670de0b6b3a7640000611056565b9050612c968a82611115565b6000816130d35750670de0b6b3a76400006105fc565b826130e0575060006105fc565b61310d7f8000000000000000000000000000000000000000000000000000000000000000841060066114ec565b82613133770bce5086492111aea88f4bb1ca6bcf584181ea8059f76532841060076114ec565b826000670c7d713b49da0000831380156131545750670f43fc2c04ee000083125b1561318b576000613164846137b6565b9050670de0b6b3a764000080820784020583670de0b6b3a764000083050201915050613199565b81613195846138ed565b0290505b670de0b6b3a764000090056131e77ffffffffffffffffffffffffffffffffffffffffffffffffdc702bd3a30fc000082128015906131e0575068070c1cc73b00c800008213155b60086114ec565b6125a681613c8d565b6060818060200190518101906106e191906149b4565b60006132317f38e9922e00000000000000000000000000000000000000000000000000000000610a17565b8214806105fc57506132627f50dd6ed900000000000000000000000000000000000000000000000000000000610a17565b909114919050565b60008061327784846130bd565b9050600061328a61294683612710611115565b9050612c9d82826110ca565b6000670de0b6b3a764000082106132ae5760006105fc565b50670de0b6b3a76400000390565b600080828060200190518101906132d3919061497e565b909590945092505050565b6000806132ef846110868188611056565b90506133086709b6e64a8ec600008210156101326114ec565b600061332661331f670de0b6b3a764000089611d86565b839061326a565b9050600061333d61333683613296565b8a90612752565b9050600061334a89613296565b905060006133588383611115565b905060006133668483611056565b905061338e613387613380670de0b6b3a76400008b611056565b8490612752565b82906110ca565b9c9b505050505050505050505050565b6000818060200190518101906106e19190614951565b606060006133c28484611d86565b90506060855167ffffffffffffffff811180156133de57600080fd5b50604051908082528060200260200182016040528015613408578160200160208202803683370190505b50905060005b865181101561345c5761343d8388838151811061342757fe5b602002602001015161275290919063ffffffff16565b82828151811061344957fe5b602090810291909101015260010161340e565b5095945050505050565b60606000828060200190518101906132d3919061490a565b60006060845167ffffffffffffffff8111801561349a57600080fd5b506040519080825280602002602001820160405280156134c4578160200160208202803683370190505b5090506000805b8851811015613589576135248982815181106134e357fe5b60200260200101516110868984815181106134fa57fe5b60200260200101518c858151811061350e57fe5b602002602001015161105690919063ffffffff16565b83828151811061353057fe5b60200260200101818152505061357f61357889838151811061354e57fe5b602002602001015185848151811061356257fe5b602002602001015161111590919063ffffffff16565b83906110ca565b91506001016134cb565b50670de0b6b3a764000060005b895181101561368b5760008482815181106135ad57fe5b602002602001015184111561360d5760006135d66135ca86613296565b8d858151811061342757fe5b905060006135ea828c868151811061350e57fe5b905061360461357861214b670de0b6b3a76400008c611056565b92505050613624565b88828151811061361957fe5b602002602001015190505b600061364d8c848151811061363557fe5b6020026020010151610875848f878151811061350e57fe5b905061367f6136788c858151811061366157fe5b60200260200101518361292690919063ffffffff16565b8590612752565b93505050600101613596565b5061369f61369882613296565b8790611115565b9998505050505050505050565b600060608060006136bc85613466565b915091506136d26136cb611710565b8351611033565b6136dc8287611dce565b60006136f98989856136ec610616565b6136f4610808565b61415d565b9050612e328282101560d06114ec565b60006060600080613719856132bc565b91509150613728612ce3611710565b6060613732611710565b67ffffffffffffffff8111801561374857600080fd5b50604051908082528060200260200182016040528015613772578160200160208202803683370190505b509050612d7a88838151811061378457fe5b602002602001015188848151811061379857fe5b6020026020010151856137a9610616565b6137b1610808565b61436f565b670de0b6b3a7640000026000806ec097ce7bc90715b34b9f1000000000808401907fffffffffffffffffffffffffffffffffff3f68318436f8ea4cb460f0000000008501028161380257fe5b05905060006ec097ce7bc90715b34b9f100000000082800205905081806ec097ce7bc90715b34b9f100000000081840205915060038205016ec097ce7bc90715b34b9f100000000082840205915060058205016ec097ce7bc90715b34b9f100000000082840205915060078205016ec097ce7bc90715b34b9f100000000082840205915060098205016ec097ce7bc90715b34b9f1000000000828402059150600b8205016ec097ce7bc90715b34b9f1000000000828402059150600d8205016ec097ce7bc90715b34b9f1000000000828402059150600f826002919005919091010295945050505050565b6000670de0b6b3a764000082121561392a57613920826ec097ce7bc90715b34b9f10000000008161391a57fe5b056138ed565b6000039050610895565b60007e1600ef3172e58d2e933ec884fde10064c63b5372d805e203c0000000000000831261397b57770195e54c5dd42177f53a27172fa9ec630262827000000000830592506806f05b59d3b2000000015b73011798004d755d3c8bc8e03204cf44619e00000083126139b3576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff008400083126139fb576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a7008312613a36576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf8508312613a6d57693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e28312613aa457690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d038312613ad95768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb417461211108312613b0457680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d8312613b39576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f17757889379378312613b6e576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b2866038312613ba2576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac8312613bd6576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b600068056bc75e2d63100000840168056bc75e2d631000008086030281613bf957fe5b059050600068056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b6000613cd27ffffffffffffffffffffffffffffffffffffffffffffffffdc702bd3a30fc00008312158015613ccb575068070c1cc73b00c800008313155b60096114ec565b6000821215613d0657613ce782600003613c8d565b6ec097ce7bc90715b34b9f100000000081613cfe57fe5b059050610895565b60006806f05b59d3b20000008312613d5c57507ffffffffffffffffffffffffffffffffffffffffffffffff90fa4a62c4e00000090910190770195e54c5dd42177f53a27172fa9ec630262827000000000613da8565b6803782dace9d90000008312613da457507ffffffffffffffffffffffffffffffffffffffffffffffffc87d2531627000000909101906b1425982cf597cd205cef7380613da8565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac620000008412613e0e577fffffffffffffffffffffffffffffffffffffffffffffff5287143a539e0000009093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d6310000008412613e60577fffffffffffffffffffffffffffffffffffffffffffffffa9438a1d29cf0000009093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b188000008412613eb0577fffffffffffffffffffffffffffffffffffffffffffffffd4a1c50e94e78000009093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c4000008412613f00577fffffffffffffffffffffffffffffffffffffffffffffffea50e2874a73c000009093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac62000008412613f4f577ffffffffffffffffffffffffffffffffffffffffffffffff5287143a539e000009093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d631000008412613f9e577ffffffffffffffffffffffffffffffffffffffffffffffffa9438a1d29cf000009093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b18800008412613fed577ffffffffffffffffffffffffffffffffffffffffffffffffd4a1c50e94e7800009093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c40000841261403c577ffffffffffffffffffffffffffffffffffffffffffffffffea50e2874a73c00009093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b60006060845167ffffffffffffffff8111801561417957600080fd5b506040519080825280602002602001820160405280156141a3578160200160208202803683370190505b5090506000805b885181101561424b576142038982815181106141c257fe5b60200260200101516108758984815181106141d957fe5b60200260200101518c85815181106141ed57fe5b60200260200101516110ca90919063ffffffff16565b83828151811061420f57fe5b60200260200101818152505061424161357889838151811061422d57fe5b602002602001015185848151811061342757fe5b91506001016141aa565b50670de0b6b3a764000060005b895181101561432c5760008385838151811061427057fe5b602002602001015111156142cc5760006142956135ca86670de0b6b3a7640000611056565b905060006142a9828c868151811061350e57fe5b90506142c361357861229b670de0b6b3a76400008c611056565b925050506142e3565b8882815181106142d857fe5b602002602001015190505b600061430c8c84815181106142f457fe5b6020026020010151610875848f87815181106141ed57fe5b90506143206136788c858151811061366157fe5b93505050600101614258565b50670de0b6b3a76400008111156143635761435961435282670de0b6b3a7640000611056565b8790612752565b9350505050612c9d565b60009350505050612c9d565b6000806143808461108681886110ca565b90506143996729a2241af62c00008211156101336114ec565b60006143b061331f670de0b6b3a764000089611181565b905060006143d06143c983670de0b6b3a7640000611056565b8a90611115565b905060006143dd89613296565b905060006143eb8383611115565b905060006143f98483611056565b905061338e613387614413670de0b6b3a76400008b611056565b8490611181565b80356105fc81614eac565b600082601f830112614435578081fd5b813561444861444382614e8c565b614e65565b81815291506020808301908481018184028601820187101561446957600080fd5b60005b848110156144885781358452928201929082019060010161446c565b505050505092915050565b600082601f8301126144a3578081fd5b81516144b161444382614e8c565b8181529150602080830190848101818402860182018710156144d257600080fd5b60005b84811015614488578151845292820192908201906001016144d5565b600082601f830112614501578081fd5b813567ffffffffffffffff811115614517578182fd5b61452a6020601f19601f84011601614e65565b915080825283602082850101111561454157600080fd5b8060208401602084013760009082016020015292915050565b8035600281106105fc57600080fd5b60006020828403121561457a578081fd5b81356106e181614eac565b60008060408385031215614597578081fd5b82356145a281614eac565b915060208301356145b281614eac565b809150509250929050565b6000806000606084860312156145d1578081fd5b83356145dc81614eac565b925060208401356145ec81614eac565b929592945050506040919091013590565b600080600080600080600060e0888a031215614617578283fd5b873561462281614eac565b9650602088013561463281614eac565b95506040880135945060608801359350608088013560ff81168114614655578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215614684578182fd5b823561468f81614eac565b946020939093013593505050565b6000806000606084860312156146b1578081fd5b835167ffffffffffffffff808211156146c8578283fd5b818601915086601f8301126146db578283fd5b81516146e961444382614e8c565b80828252602080830192508086018b828387028901011115614709578788fd5b8796505b8487101561473457805161472081614eac565b84526001969096019592810192810161470d565b50890151909750935050508082111561474b578283fd5b5061475886828701614493565b925050604084015190509250925092565b60006020828403121561477a578081fd5b81356106e181614ec1565b600060208284031215614796578081fd5b81516106e181614ec1565b600080600080600080600060e0888a0312156147bb578081fd5b8735965060208801356147cd81614eac565b955060408801356147dd81614eac565b9450606088013567ffffffffffffffff808211156147f9578283fd5b6148058b838c01614425565b955060808a0135945060a08a0135935060c08a0135915080821115614828578283fd5b506148358a828b016144f1565b91505092959891949750929550565b600060208284031215614855578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146106e1578182fd5b600060208284031215614895578081fd5b81516106e181614eac565b600080604083850312156148b2578182fd5b82356148bd81614eac565b9150602083013567ffffffffffffffff8111156148d8578182fd5b6148e4858286016144f1565b9150509250929050565b6000602082840312156148ff578081fd5b81516106e181614ecf565b60008060006060848603121561491e578081fd5b835161492981614ecf565b602085015190935067ffffffffffffffff811115614945578182fd5b61475886828701614493565b60008060408385031215614963578182fd5b825161496e81614ecf565b6020939093015192949293505050565b600080600060608486031215614992578081fd5b835161499d81614ecf565b602085015160409095015190969495509392505050565b600080604083850312156149c6578182fd5b82516149d181614ecf565b602084015190925067ffffffffffffffff8111156149ed578182fd5b6148e485828601614493565b600080600060608486031215614a0d578081fd5b833567ffffffffffffffff80821115614a24578283fd5b8186019150610120808389031215614a3a578384fd5b614a4381614e65565b9050614a4f888461455a565b8152614a5e886020850161441a565b6020820152614a70886040850161441a565b6040820152606083013560608201526080830135608082015260a083013560a0820152614aa08860c0850161441a565b60c0820152614ab28860e0850161441a565b60e08201526101008084013583811115614aca578586fd5b614ad68a8287016144f1565b9183019190915250976020870135975060409096013595945050505050565b600060208284031215614b06578081fd5b5035919050565b600080600060608486031215614b21578081fd5b8335925060208401359150604084013567ffffffffffffffff811115614b45578182fd5b614b5186828701614425565b9150509250925092565b60008060008060808587031215614b70578182fd5b8451935060208501519250604085015191506060850151614b9081614eac565b939692955090935050565b6000815180845260208085019450808401835b83811015614bca57815187529582019590820190600101614bae565b509495945050505050565b60008151808452815b81811015614bfa57602081850181015186830182015201614bde565b81811115614c0b5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6000602082526106e16020830184614b9b565b600060408252614cd06040830185614b9b565b8281036020840152612c9d8185614b9b565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000838252604060208301526120f46040830184614bd5565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526106e16020830184614bd5565b6000838252604060208301526120f46040830184614b9b565b600084825283602083015260606040830152612c9d6060830184614b9b565b600085825284602083015260806040830152614e456080830185614b9b565b8281036060840152612b9f8185614b9b565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715614e8457600080fd5b604052919050565b600067ffffffffffffffff821115614ea2578081fd5b5060209081020190565b6001600160a01b038116811461061357600080fd5b801515811461061357600080fd5b6003811061061357600080fdfea264697066735822122043fe62b932fca361924bc6d1251a9cf53e36adde19308c6e5b13753d3adc23ee64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100715760003560e01c80632da47c40116100505780632da47c40146100ca5780636634b753146100e05780638d928af81461010057610071565b8062c194db14610076578063174481fa1461009457806323679719146100aa575b600080fd5b61007e610108565b60405161008b919061090e565b60405180910390f35b61009c610127565b60405161008b9291906108dc565b6100bd6100b8366004610723565b61016d565b60405161008b91906108bb565b6100d26101cd565b60405161008b9291906109f8565b6100f36100ee366004610707565b610237565b60405161008b9190610903565b6100bd610262565b6060610122604051806020016040528060008152506102e5565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080600061017a6101cd565b915091506101bf610189610262565b8b8b8b8b8b88888d8d6040516020016101ab9a99989796959493929190610921565b6040516020818303038152906040526103be565b9a9950505050505050505050565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561022957807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610232565b60009250600091505b509091565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506102df73ffffffffffffffffffffffffffffffffffffffff831615156101ac610449565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016103b081838661045b565b505050505050505050919050565b6000806103ca836104d5565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b81610457576104578161051d565b5050565b5b602081106104995781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00161045c565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600060606104e2836102e5565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff8116610516573d6000803e3d6000fd5b9392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b803561059581610a66565b92915050565b600082601f8301126105ab578081fd5b81356105be6105b982610a2d565b610a06565b8181529150602080830190848101818402860182018710156105df57600080fd5b60005b848110156106075781356105f581610a66565b845292820192908201906001016105e2565b505050505092915050565b600082601f830112610622578081fd5b81356106306105b982610a2d565b81815291506020808301908481018184028601820187101561065157600080fd5b60005b8481101561060757813584529282019290820190600101610654565b8035801515811461059557600080fd5b600082601f830112610690578081fd5b813567ffffffffffffffff8111156106a6578182fd5b6106d760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610a06565b91508082528360208285010111156106ee57600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215610718578081fd5b813561051681610a66565b600080600080600080600060e0888a03121561073d578283fd5b873567ffffffffffffffff80821115610754578485fd5b6107608b838c01610680565b985060208a0135915080821115610775578485fd5b6107818b838c01610680565b975060408a0135915080821115610796578485fd5b6107a28b838c0161059b565b965060608a01359150808211156107b7578485fd5b506107c48a828b01610612565b945050608088013592506107db8960a08a0161058a565b91506107ea8960c08a01610670565b905092959891949750929550565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208085019450808401835b8381101561084157815187529582019590820190600101610825565b509495945050505050565b15159052565b60008151808452815b818110156108775760208185018101518683018201520161085b565b818111156108885782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b6000602082526105166020830184610852565b600061014073ffffffffffffffffffffffffffffffffffffffff8d168352602081818501526109528285018e610852565b91508382036040850152610966828d610852565b84810360608601528b51808252828d01935090820190845b818110156109a2576109908551610a4d565b8352938301939183019160010161097e565b505084810360808601526109b6818c610812565b93505050508660a08301528560c08301528460e08301526109db6101008301856107f8565b6109e961012083018461084c565b9b9a5050505050505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610a2557600080fd5b604052919050565b600067ffffffffffffffff821115610a43578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff81168114610a8857600080fd5b5056fea2646970667358221220779398a457593d40d00df5a736155eaeeec695dbbf4cea4b34d37c780dc16e6d64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/index.ts b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/index.ts new file mode 100644 index 0000000..bee7c04 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/index.ts @@ -0,0 +1,8 @@ +import { Task, TaskRunOptions } from '@src'; +import { LiquidityBootstrappingPoolDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as LiquidityBootstrappingPoolDeployment; + const args = [input.Vault]; + await task.deployAndVerify('LiquidityBootstrappingPoolFactory', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/input.ts b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/input.ts new file mode 100644 index 0000000..3655853 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type LiquidityBootstrappingPoolDeployment = { + Vault: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/output/arbitrum.json new file mode 100644 index 0000000..d9238fc --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "LiquidityBootstrappingPoolFactory": "0x142B9666a0a3A30477b052962ddA81547E7029ab" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/output/goerli.json new file mode 100644 index 0000000..7987a72 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/output/goerli.json @@ -0,0 +1,3 @@ +{ + "LiquidityBootstrappingPoolFactory": "0xb48Cc42C45d262534e46d5965a9Ac496F1B7a830" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/output/kovan.json b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/output/kovan.json new file mode 100644 index 0000000..4a2ad12 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/output/kovan.json @@ -0,0 +1,3 @@ +{ + "LiquidityBootstrappingPoolFactory": "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/output/mainnet.json new file mode 100644 index 0000000..22b3822 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "LiquidityBootstrappingPoolFactory": "0x751A0bC0e3f75b38e01Cf25bFCE7fF36DE1C87DE" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/output/polygon.json new file mode 100644 index 0000000..22b3822 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/output/polygon.json @@ -0,0 +1,3 @@ +{ + "LiquidityBootstrappingPoolFactory": "0x751A0bC0e3f75b38e01Cf25bFCE7fF36DE1C87DE" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/output/rinkeby.json b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/output/rinkeby.json new file mode 100644 index 0000000..b21cea0 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/output/rinkeby.json @@ -0,0 +1,3 @@ +{ + "LiquidityBootstrappingPoolFactory": "0xdcdbf71A870cc60C6F9B621E28a7D3Ffd6Dd4965" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/readme.md b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/readme.md new file mode 100644 index 0000000..5ac8234 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/readme.md @@ -0,0 +1,15 @@ +# 2021-07-21 - Liquidity Bootstrapping Pool + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This factory and associated Pools have been deprecated due to incorrect calculation of protocol fees when the global protocol swap fee percentage is non-zero. They have been [temporarily replaced with a version that addresses this](../../20211202-no-protocol-fee-lbp). + +Deployment of the `LiquidityBootstrappingPoolFactory`, for Liquidity Bootstrapping Pools of up to 4 tokens. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet address](./output/arbitrum.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`LiquidityBootstrappingPoolFactory` artifact](./artifact/LiquidityBootstrappingPoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/test/task.fork.ts new file mode 100644 index 0000000..0b2a2b7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210721-liquidity-bootstrapping-pool/test/task.fork.ts @@ -0,0 +1,154 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; + +import { WeightedPoolEncoder } from '@helpers/models/pools/weighted/encoder'; +import { SwapKind } from '@helpers/models/types/types'; +import * as expectEvent from '@helpers/expectEvent'; +import { fp } from '@helpers/numbers'; +import { MAX_UINT256 } from '@helpers/constants'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { calculateInvariant } from '@helpers/models/pools/weighted/math'; +import { expectEqualWithError } from '@helpers/relativeError'; +import { advanceToTimestamp, currentTimestamp, DAY, MINUTE, MONTH } from '@helpers/time'; + +import { describeForkTest, getSigner, getForkedNetwork, Task, TaskMode, impersonate } from '@src'; + +describeForkTest('LiquidityBootstrappingPoolFactory', 'mainnet', 14850000, function () { + let owner: SignerWithAddress, whale: SignerWithAddress; + let pool: Contract, factory: Contract, vault: Contract, usdc: Contract, dai: Contract; + + let task: Task; + + const DAI = '0x6b175474e89094c44da98b954eedeac495271d0f'; + const USDC = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'; + + const tokens = [DAI, USDC]; + const initialWeights = [fp(0.9), fp(0.1)]; + const swapFeePercentage = fp(0.01); + const swapEnabledOnStart = true; + + const weightChangeDuration = MONTH; + const endWeights = [fp(0.2), fp(0.8)]; + let endTime: BigNumber; + + const initialBalanceDAI = fp(9e6); // 9:1 DAI:USDC ratio + const initialBalanceUSDC = fp(1e6).div(1e12); // 6 digits + const initialBalances = [initialBalanceDAI, initialBalanceUSDC]; + + const LARGE_TOKEN_HOLDER = '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503'; + + before('run task', async () => { + task = new Task('20210721-liquidity-bootstrapping-pool', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('LiquidityBootstrappingPoolFactory'); + }); + + before('load signers', async () => { + owner = await getSigner(); + whale = await impersonate(LARGE_TOKEN_HOLDER); + }); + + before('load vault and tokens', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.instanceAt('Vault', await factory.getVault()); + dai = await task.instanceAt('IERC20', DAI); + usdc = await task.instanceAt('IERC20', USDC); + }); + + it('deploy a liquidity bootstrapping pool', async () => { + const tx = await factory.create( + 'LBP', + 'LBPT', + tokens, + initialWeights, + swapFeePercentage, + owner.address, + swapEnabledOnStart + ); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await task.instanceAt('LiquidityBootstrappingPool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + const poolId = pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + }); + + it('initialize a liquidity bootstrapping pool from the owner', async () => { + // Only the owner can seed the pool, so we send them tokens from the whale + await dai.connect(whale).transfer(owner.address, initialBalanceDAI); + await usdc.connect(whale).transfer(owner.address, initialBalanceUSDC); + + // Approve the Vault to join + await dai.connect(owner).approve(vault.address, MAX_UINT256); + await usdc.connect(owner).approve(vault.address, MAX_UINT256); + + const poolId = await pool.getPoolId(); + const userData = WeightedPoolEncoder.joinInit(initialBalances); + await vault.connect(owner).joinPool(poolId, owner.address, owner.address, { + assets: tokens, + maxAmountsIn: initialBalances, + fromInternalBalance: false, + userData, + }); + + const scaledBalances = [initialBalanceDAI, initialBalanceUSDC.mul(1e12)]; + // Initial BPT is the invariant multiplied by the number of tokens + const expectedInvariant = calculateInvariant(scaledBalances, initialWeights).mul(tokens.length); + + expectEqualWithError(await pool.balanceOf(owner.address), expectedInvariant, 0.001); + }); + + it('can swap in a liquidity bootstrapping pool', async () => { + const amount = fp(500); // Small relative to Pool balance - should have zero price impact + await dai.connect(whale).approve(vault.address, amount); + + const poolId = await pool.getPoolId(); + + const whaleUSDCBalanceBefore = await usdc.balanceOf(whale.address); + + await vault + .connect(whale) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: DAI, assetOut: USDC, amount, userData: '0x' }, + { sender: whale.address, recipient: whale.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + const whaleUSDCBalanceAfter = await usdc.balanceOf(whale.address); + + // Assert pool swap + const expectedUSDC = amount.div(1e12); + expectEqualWithError(whaleUSDCBalanceAfter.sub(whaleUSDCBalanceBefore), expectedUSDC, 0.1); + }); + + it('initial weights are correct', async () => { + // Weights are not exact due to being stored in fewer bits + expect(await pool.getNormalizedWeights()).to.equalWithError(initialWeights, 0.0001); + }); + + it('owner can start a gradual weight change', async () => { + const startTime = (await currentTimestamp()).add(DAY); + endTime = startTime.add(weightChangeDuration); + + const tx = await pool.connect(owner).updateWeightsGradually(startTime, endTime, endWeights); + + expectEvent.inReceipt(await tx.wait(), 'GradualWeightUpdateScheduled'); + + const params = await pool.getGradualWeightUpdateParams(); + + expect(params.startTime).to.equal(startTime); + expect(params.endTime).to.equal(endTime); + expect(params.endWeights).to.equalWithError(endWeights, 0.0001); + }); + + it('weights fully change once the time expires', async () => { + await advanceToTimestamp(endTime.add(MINUTE)); + + // Weights are not exact due to being stored in fewer bits + expect(await pool.getNormalizedWeights()).to.equalWithError(endWeights, 0.0001); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/artifact/MetaStablePool.json b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/artifact/MetaStablePool.json new file mode 100644 index 0000000..db7d1a8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/artifact/MetaStablePool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"components": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20[]", "name": "tokens", "type": "address[]"}, {"internalType": "contract IRateProvider[]", "name": "rateProviders", "type": "address[]"}, {"internalType": "uint256[]", "name": "priceRateCacheDuration", "type": "uint256[]"}, {"internalType": "uint256", "name": "amplificationParameter", "type": "uint256"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "bool", "name": "oracleEnabled", "type": "bool"}, {"internalType": "address", "name": "owner", "type": "address"}], "internalType": "struct MetaStablePool.NewPoolParams", "name": "params", "type": "tuple"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "startValue", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "endValue", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "startTime", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "endTime", "type": "uint256"}], "name": "AmpUpdateStarted", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "currentValue", "type": "uint256"}], "name": "AmpUpdateStopped", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "enabled", "type": "bool"}], "name": "OracleEnabledChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "rate", "type": "uint256"}], "name": "PriceRateCacheUpdated", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address"}, {"indexed": true, "internalType": "contract IRateProvider", "name": "provider", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "cacheDuration", "type": "uint256"}], "name": "PriceRateProviderSet", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "enableOracle", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAmplificationParameter", "outputs": [{"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "bool", "name": "isUpdating", "type": "bool"}, {"internalType": "uint256", "name": "precision", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getLargestSafeQueryWindow", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "pure", "type": "function"}, {"inputs": [], "name": "getLastInvariant", "outputs": [{"internalType": "uint256", "name": "lastInvariant", "type": "uint256"}, {"internalType": "uint256", "name": "lastInvariantAmp", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "enum IPriceOracle.Variable", "name": "variable", "type": "uint8"}], "name": "getLatest", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOracleMiscData", "outputs": [{"internalType": "int256", "name": "logInvariant", "type": "int256"}, {"internalType": "int256", "name": "logTotalSupply", "type": "int256"}, {"internalType": "uint256", "name": "oracleSampleCreationTimestamp", "type": "uint256"}, {"internalType": "uint256", "name": "oracleIndex", "type": "uint256"}, {"internalType": "bool", "name": "oracleEnabled", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IPriceOracle.Variable", "name": "variable", "type": "uint8"}, {"internalType": "uint256", "name": "ago", "type": "uint256"}], "internalType": "struct IPriceOracle.OracleAccumulatorQuery[]", "name": "queries", "type": "tuple[]"}], "name": "getPastAccumulators", "outputs": [{"internalType": "int256[]", "name": "results", "type": "int256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "getPriceRateCache", "outputs": [{"internalType": "uint256", "name": "rate", "type": "uint256"}, {"internalType": "uint256", "name": "duration", "type": "uint256"}, {"internalType": "uint256", "name": "expires", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRateProviders", "outputs": [{"internalType": "contract IRateProvider[]", "name": "providers", "type": "address[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "index", "type": "uint256"}], "name": "getSample", "outputs": [{"internalType": "int256", "name": "logPairPrice", "type": "int256"}, {"internalType": "int256", "name": "accLogPairPrice", "type": "int256"}, {"internalType": "int256", "name": "logBptPrice", "type": "int256"}, {"internalType": "int256", "name": "accLogBptPrice", "type": "int256"}, {"internalType": "int256", "name": "logInvariant", "type": "int256"}, {"internalType": "int256", "name": "accLogInvariant", "type": "int256"}, {"internalType": "uint256", "name": "timestamp", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getScalingFactors", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IPriceOracle.Variable", "name": "variable", "type": "uint8"}, {"internalType": "uint256", "name": "secs", "type": "uint256"}, {"internalType": "uint256", "name": "ago", "type": "uint256"}], "internalType": "struct IPriceOracle.OracleAverageQuery[]", "name": "queries", "type": "tuple[]"}], "name": "getTimeWeightedAverage", "outputs": [{"internalType": "uint256[]", "name": "results", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getTotalSamples", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "pure", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "dueProtocolFeeAmounts", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "dueProtocolFeeAmounts", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "indexIn", "type": "uint256"}, {"internalType": "uint256", "name": "indexOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256", "name": "balanceTokenIn", "type": "uint256"}, {"internalType": "uint256", "name": "balanceTokenOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "bytes", "name": "poolConfig", "type": "bytes"}], "name": "setAssetManagerPoolConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bool", "name": "paused", "type": "bool"}], "name": "setPaused", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "uint256", "name": "duration", "type": "uint256"}], "name": "setPriceRateCacheDuration", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "rawEndValue", "type": "uint256"}, {"internalType": "uint256", "name": "endTime", "type": "uint256"}], "name": "startAmplificationParameterUpdate", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "stopAmplificationParameterUpdate", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "updatePriceRateCache", "outputs": [], "stateMutability": "nonpayable", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/artifact/MetaStablePoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/artifact/MetaStablePoolFactory.json new file mode 100644 index 0000000..e3f2915 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/artifact/MetaStablePoolFactory.json @@ -0,0 +1,192 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "MetaStablePoolFactory", + "sourceName": "contracts/meta/MetaStablePoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "amplificationParameter", + "type": "uint256" + }, + { + "internalType": "contract IRateProvider[]", + "name": "rateProviders", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "priceRateCacheDuration", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "oracleEnabled", + "type": "bool" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101406040523480156200001257600080fd5b50604051620081fd380380620081fd8339810160408190526200003591620001c3565b80604051806020016200004890620001b5565b601f1982820381018352601f909101166040528051819060006002820460a081905280830360e0819052818552909150836200009081620000f9602090811b620002be17901c565b60601b6001600160601b0319166080528285018051838252620000bf82620000f9602090811b620002be17901c565b6001600160601b0319606091821b811660c0529690935290529590951b90911661010052505050426276a700016101205250620001f39050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001476001600160a01b03831615156101ac6200014d565b50919050565b816200015e576200015e8162000162565b5050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6174d08062000d2d83390190565b600060208284031215620001d5578081fd5b81516001600160a01b0381168114620001ec578182fd5b9392505050565b60805160601c60a05160c05160601c60e0516101005160601c61012051610ad86200025560003980610163528061018c5250806101e752508061031852508061013a528061039452508061033952508061011952806103705250610ad86000f3fe608060405234801561001057600080fd5b50600436106100615760003560e01c8062c194db14610066578063174481fa146100845780632da47c401461009a5780636634b753146100b05780638d928af8146100d0578063da89709a146100e5575b600080fd5b61006e6100f8565b60405161007b9190610915565b60405180910390f35b61008c610117565b60405161007b9291906108f0565b6100a261015d565b60405161007b929190610a35565b6100c36100be3660046106ed565b6101c7565b60405161007b919061090a565b6100d86101e5565b60405161007b91906108dc565b6100d86100f3366004610709565b610209565b606061011260405180602001604052806000815250610310565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156101b957807f000000000000000000000000000000000000000000000000000000000000000003925062278d0091506101c2565b60009250600091505b509091565b6001600160a01b031660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b600080600061021661015d565b915091506102ae6040518061018001604052806102316101e5565b6001600160a01b031681526020018e81526020018d81526020018c81526020018a81526020018981526020018b81526020018881526020018481526020018381526020018715158152602001866001600160a01b031681525060405160200161029a9190610928565b6040516020818303038152906040526103e9565b9c9b505050505050505050505050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061030a6001600160a01b03831615156101ac610449565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016103db81838661045b565b505050505050505050919050565b6000806103f583610499565b6001600160a01b038116600081815260208190526040808220805460ff191660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b8161045757610457816104d4565b5050565b5b6020811061047b578151835260209283019290910190601f190161045c565b905182516020929092036101000a6000190180199091169116179052565b600060606104a683610310565b905060008151602083016000f090506001600160a01b0381166104cd573d6000803e3d6000fd5b9392505050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b803561053281610a8a565b92915050565b600082601f830112610548578081fd5b813561055b61055682610a6a565b610a43565b81815291506020808301908481018184028601820187101561057c57600080fd5b60005b848110156105a457813561059281610a8a565b8452928201929082019060010161057f565b505050505092915050565b600082601f8301126105bf578081fd5b81356105cd61055682610a6a565b8181529150602080830190848101818402860182018710156105ee57600080fd5b60005b848110156105a457813561060481610a8a565b845292820192908201906001016105f1565b600082601f830112610626578081fd5b813561063461055682610a6a565b81815291506020808301908481018184028601820187101561065557600080fd5b60005b848110156105a457813584529282019290820190600101610658565b8035801515811461053257600080fd5b600082601f830112610694578081fd5b813567ffffffffffffffff8111156106aa578182fd5b6106bd601f8201601f1916602001610a43565b91508082528360208285010111156106d457600080fd5b8060208401602084013760009082016020015292915050565b6000602082840312156106fe578081fd5b81356104cd81610a8a565b60008060008060008060008060006101208a8c031215610727578485fd5b893567ffffffffffffffff8082111561073e578687fd5b61074a8d838e01610684565b9a5060208c013591508082111561075f578687fd5b61076b8d838e01610684565b995060408c0135915080821115610780578687fd5b61078c8d838e01610538565b985060608c0135975060808c01359150808211156107a8578687fd5b6107b48d838e016105af565b965060a08c01359150808211156107c9578586fd5b506107d68c828d01610616565b94505060c08a013592506107ed8b60e08c01610674565b91506107fd8b6101008c01610527565b90509295985092959850929598565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156108515781516001600160a01b03168752958201959082019060010161082c565b509495945050505050565b6000815180845260208085019450808401835b838110156108515781518752958201959082019060010161086f565b15159052565b60008151808452815b818110156108b65760208185018101518683018201520161089a565b818111156108c75782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b901515815260200190565b6000602082526104cd6020830184610891565b60006020825261093c60208301845161080c565b60208301516101808060408501526109586101a0850183610891565b91506040850151601f19808685030160608701526109768483610891565b935060608701519150808685030160808701526109938483610819565b935060808701519150808685030160a08701526109b08483610819565b935060a08701519150808685030160c0870152506109ce838261085c565b60c087015160e0878101919091528701516101008088019190915287015161012080880191909152870151610140808801919091528701519093509050610160610a1a8187018361088b565b8601519050610a2b8583018261080c565b5090949350505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610a6257600080fd5b604052919050565b600067ffffffffffffffff821115610a80578081fd5b5060209081020190565b6001600160a01b0381168114610a9f57600080fd5b5056fea2646970667358221220869f20e49b2d3fb02571815c2015b8f41b3bef59e5bed75a32913754f7e8c3b864736f6c634300070100336103606040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b50604051620074d0380380620074d08339810160408190526200005a91620010a1565b805160208201516040830151606084015160c085015160e0860151610100870151610120880151610160890151855189906002146200009b5760006200009e565b60025b8989898a516001600160401b0381118015620000b957600080fd5b50604051908082528060200260200182016040528015620000e4578160200160208202803683370190505b506040805180820190915260018152603160f81b602080830191909152336080526001600160601b031960608a901b1660a05285518c928c928c928c92859285928c928c92849283929183918691620001439160039185019062000de9565b5080516200015990600490602084019062000de9565b50506005805460ff1916601217905550815160209283012060c052805191012060e05250507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6101005250620001b86276a70083111561019462000833565b620001cc62278d0082111561019562000833565b4290910161014081905201610160528551620001ee906002111560c862000833565b62000208620001fc62000848565b8751111560c962000833565b6200021e866200084d60201b620013d91760201c565b620002298462000859565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f906200025a908d90600401620012e7565b602060405180830381600087803b1580156200027557600080fd5b505af11580156200028a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b0919062001088565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002e59084908b908b906004016200124b565b600060405180830381600087803b1580156200030057600080fd5b505af115801562000315573d6000803e3d6000fd5b5050505060609a909a1b6001600160601b031916610180525050506101a0969096525062000352945050506001881015915061012c905062000833565b6200036561138886111561012d62000833565b85516101c0819052865187906000906200037b57fe5b60200260200101516001600160a01b03166101e0816001600160a01b031660601b8152505086600181518110620003ae57fe5b60200260200101516001600160a01b0316610200816001600160a01b031660601b8152505060028111620003e4576000620003fb565b86600281518110620003f257fe5b60200260200101515b60601b6001600160601b03191661022052600381116200041d57600062000434565b866003815181106200042b57fe5b60200260200101515b60601b6001600160601b0319166102405260048111620004565760006200046d565b866004815181106200046457fe5b60200260200101515b6001600160a01b0316610260816001600160a01b031660601b81525050620004b0876000815181106200049c57fe5b6020026020010151620008e560201b60201c565b610280528651620004c990889060019081106200049c57fe5b6102a05260028111620004de576000620004f0565b620004f0876002815181106200049c57fe5b6102c052600381116200050557600062000517565b62000517876003815181106200049c57fe5b6102e052600481116200052c5760006200053e565b6200053e876004815181106200049c57fe5b6103008181525050600062000561876103e86200099160201b620013e31760201c565b90506200056e81620009c2565b50505050505050505050506200059481606001515160021460d26200083360201b60201c565b620005bb8160600151518260800151518360a001515162000a0160201b620014071760201c565b60008160800151600081518110620005cf57fe5b60209081029190910101516001600160601b0319606082901b166103205290506001600160a01b0381161562000686576000806200062d838560a001516000815181106200061957fe5b602002602001015162000a2160201b60201c565b9150915081600d8190555083606001516000815181106200064a57fe5b60200260200101516001600160a01b031660008051602062007490833981519152826040516200067b9190620012fc565b60405180910390a250505b806001600160a01b03168260600151600081518110620006a257fe5b60200260200101516001600160a01b0316600080516020620074b08339815191528460a00151600081518110620006d557fe5b6020026020010151604051620006ec9190620012fc565b60405180910390a3600082608001516001815181106200070857fe5b60209081029190910101516001600160601b0319606082901b166103405290506001600160a01b03811615620007ab5760008062000752838660a001516001815181106200061957fe5b9150915081600e8190555084606001516001815181106200076f57fe5b60200260200101516001600160a01b03166000805160206200749083398151915282604051620007a09190620012fc565b60405180910390a250505b806001600160a01b03168360600151600181518110620007c757fe5b60200260200101516001600160a01b0316600080516020620074b08339815191528560a00151600181518110620007fa57fe5b6020026020010151604051620008119190620012fc565b60405180910390a36101408301516200082a9062000b1f565b50505062001389565b816200084457620008448162000b7d565b5050565b600590565b80620008448162000bd0565b6200086e64e8d4a5100082101560cb62000833565b6200088667016345785d8a000082111560ca62000833565b620008a58160c060085462000c5a60201b62001424179092919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90620008da908390620012fc565b60405180910390a150565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200092257600080fd5b505afa15801562000937573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200095d91906200121d565b60ff16905060006200097c60128362000c6f60201b620014391760201c565b600a0a670de0b6b3a764000002949350505050565b6000828202620009b9841580620009b1575083858381620009ae57fe5b04145b600362000833565b90505b92915050565b620009d08180428062000c87565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a023381604051620008da9190620012fc565b62000a1c828414801562000a1457508183145b606762000833565b505050565b600080836001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b15801562000a5e57600080fd5b505afa15801562000a73573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a99919062001088565b905062000aaf600160801b821061014962000833565b62000ad28342016001600160401b031660c062000d5760201b6200144f1760201c565b62000af3846001600160401b0316608062000d5760201b6200144f1760201c565b62000b14836001600160801b0316600062000d5760201b6200144f1760201c565b171791509250929050565b62000b4c62000b468262000b3262000d5b565b62000d6160201b620014531790919060201c565b62000d80565b7f3e350b41e86a8e10f804ade6d35340d620be35569cc75ac943e8bb14ab80ead181604051620008da919062001240565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b60028151101562000be15762000c57565b60008160008151811062000bf157fe5b602002602001015190506000600190505b825181101562000a1c57600083828151811062000c1b57fe5b6020026020010151905062000c4c816001600160a01b0316846001600160a01b03161060656200083360201b60201c565b915060010162000c02565b50565b6001600160401b03811b1992909216911b1790565b600062000c8183831115600162000833565b50900390565b62000ca8816001600160401b031660c062000d5760201b6200144f1760201c565b62000cc9836001600160401b0316608062000d5760201b6200144f1760201c565b62000cea856001600160401b0316604062000d5760201b6200144f1760201c565b62000d0b876001600160401b0316600062000d5760201b6200144f1760201c565b1717176009556040517f1835882ee7a34ac194f717a35e09bb1d24c82a3b9d854ab6c9749525b714cdf29062000d4990869086908690869062001305565b60405180910390a150505050565b1b90565b60085490565b6000620009b98260558562000da560201b6200145d179092919060201c565b62000d9f81600060085462000dce60201b62001484179092919060201c565b60085550565b60006001821b198416828462000dbd57600062000dc0565b60015b60ff16901b17949350505050565b6001600160c01b03828116821b90821b198416179392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000e2c57805160ff191683800117855562000e5c565b8280016001018555821562000e5c579182015b8281111562000e5c57825182559160200191906001019062000e3f565b5062000e6a92915062000e6e565b5090565b5b8082111562000e6a576000815560010162000e6f565b8051620009bc8162001373565b600082601f83011262000ea3578081fd5b815162000eba62000eb48262001347565b62001320565b81815291506020808301908481018184028601820187101562000edc57600080fd5b60005b8481101562000f0857815162000ef58162001373565b8452928201929082019060010162000edf565b505050505092915050565b600082601f83011262000f24578081fd5b815162000f3562000eb48262001347565b81815291506020808301908481018184028601820187101562000f5757600080fd5b60005b8481101562000f0857815162000f708162001373565b8452928201929082019060010162000f5a565b600082601f83011262000f94578081fd5b815162000fa562000eb48262001347565b81815291506020808301908481018184028601820187101562000fc757600080fd5b60005b8481101562000f085781518452928201929082019060010162000fca565b80518015158114620009bc57600080fd5b600082601f8301126200100a578081fd5b81516001600160401b0381111562001020578182fd5b602062001036601f8301601f1916820162001320565b925081835284818386010111156200104d57600080fd5b60005b828110156200106d57848101820151848201830152810162001050565b828111156200107f5760008284860101525b50505092915050565b6000602082840312156200109a578081fd5b5051919050565b600060208284031215620010b3578081fd5b81516001600160401b0380821115620010ca578283fd5b8184019150610180808387031215620010e1578384fd5b620010ec8162001320565b9050620010fa868462000e85565b81526020830151828111156200110e578485fd5b6200111c8782860162000ff9565b60208301525060408301518281111562001134578485fd5b620011428782860162000ff9565b6040830152506060830151828111156200115a578485fd5b620011688782860162000e92565b60608301525060808301518281111562001180578485fd5b6200118e8782860162000f13565b60808301525060a083015182811115620011a6578485fd5b620011b48782860162000f83565b60a08301525060c0838101519082015260e08084015190820152610100808401519082015261012080840151908201526101409150620011f78683850162000fe8565b8282015261016091506200120e8683850162000e85565b91810191909152949350505050565b6000602082840312156200122f578081fd5b815160ff81168114620009b9578182fd5b901515815260200190565b60006060820185835260206060818501528186518084526080860191508288019350845b81811015620012975762001284855162001367565b835293830193918301916001016200126f565b505084810360408601528551808252908201925081860190845b81811015620012d957620012c6835162001367565b85529383019391830191600101620012b1565b509298975050505050505050565b6020810160038310620012f657fe5b91905290565b90815260200190565b93845260208401929092526040830152606082015260800190565b6040518181016001600160401b03811182821017156200133f57600080fd5b604052919050565b60006001600160401b038211156200135d578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b038116811462000c5757600080fd5b60805160a05160601c60c05160e051610100516101205161014051610160516101805160601c6101a0516101c0516101e05160601c6102005160601c6102205160601c6102405160601c6102605160601c610280516102a0516102c0516102e051610300516103205160601c6103405160601c615fe4620014ac600039806117d85250806117b452508061348e52508061346a5250806134465250806134225250806133fe5250806139e75250806139a552508061396352508061171f528061262e52806132495250806116b752806125d352806131dd525080611cf5525080610b59525080610f2052508061166f52508061164b525080611240525080611ad1525080611b13525080611af2525080610efc525080610e865250615fe46000f3fe608060405234801561001057600080fd5b50600436106102a05760003560e01c80636daccffa11610167578063a457c2d7116100ce578063b867ee5a11610087578063b867ee5a146105d1578063d505accf146105f3578063d5c096c414610606578063dd62ed3e14610619578063eb0f24d61461062c578063ffd088eb14610634576102a0565b8063a457c2d714610575578063a9059cbb14610588578063aaabadc51461059b578063b10be739146105a3578063b48b5b40146105b6578063b7710251146105be576102a0565b8063893d20e811610120578063893d20e8146105145780638d928af81461052957806395d89b41146105315780639b02cdde146105395780639d2c110c1461054f578063a0daaed014610562576102a0565b80636daccffa1461049057806370a08231146104a757806374f3b009146104ba5780637ecebe00146104db578063851c1bb3146104ee57806387ec681714610501576102a0565b80632f1a0bc91161020b57806350dd6ed9116101c457806350dd6ed91461040657806355c67628146104195780636028bfd41461042157806360d1507c14610442578063679aefce146104685780636b84323914610470576102a0565b80632f1a0bc9146103a8578063313ce567146103bb5780633644e515146103d057806338e9922e146103d857806338fff2d0146103eb57806339509351146103f3576102a0565b80631dccd8301161025d5780631dccd830146103375780631dd746ea146103575780631ed4eddc1461035f578063238a2d591461037857806323b872dd1461038d578063292c914a146103a0576102a0565b806301ec954a146102a557806306fdde03146102ce578063095ea7b3146102e357806316c38b3c1461030357806318160ddd146103185780631c0de05114610320575b600080fd5b6102b86102b33660046159fd565b61063c565b6040516102c59190615ced565b60405180910390f35b6102d661069c565b6040516102c59190615ea0565b6102f66102f13660046154e7565b610733565b6040516102c59190615cca565b610316610311366004615755565b61074a565b005b6102b861075e565b610328610764565b6040516102c593929190615cd5565b61034a61034536600461569b565b61078d565b6040516102c59190615c92565b61034a6108b0565b6103676108bf565b6040516102c5959493929190615df3565b610380610911565b6040516102c59190615c0d565b6102f661039b366004615432565b61099e565b610316610a14565b6103166103b6366004615ad0565b610a48565b6103c3610b2b565b6040516102c59190615f21565b6102b8610b34565b6103166103e6366004615ab8565b610b3e565b6102b8610b57565b6102f66104013660046154e7565b610b7b565b610316610414366004615873565b610bb6565b6102b8610bd4565b61043461042f36600461578d565b610be5565b6040516102c5929190615eb3565b610455610450366004615ab8565b610c1c565b6040516102c59796959493929190615dc3565b6102b8610c65565b61048361047e3660046155dd565b610d43565b6040516102c59190615c5a565b610498610df9565b6040516102c593929190615ecc565b6102b86104b53660046153de565b610e14565b6104cd6104c836600461578d565b610e33565b6040516102c5929190615ca5565b6102b86104e93660046153de565b610e67565b6102b86104fc36600461582f565b610e82565b61043461050f36600461578d565b610ed4565b61051c610efa565b6040516102c59190615bf9565b61051c610f1e565b6102d6610f42565b610541610fa3565b6040516102c5929190615ee2565b6102b861055d366004615a6d565b610fad565b6103166105703660046153de565b610fe6565b6102f66105833660046154e7565b611022565b6102f66105963660046154e7565b611060565b61051c61106d565b6102b86105b13660046159c9565b611077565b6102b861110c565b6103166105cc3660046154e7565b611112565b6105e46105df3660046153de565b6111b2565b6040516102c593929190615ef0565b610316610601366004615472565b61120b565b6104cd61061436600461578d565b611354565b6102b86106273660046153fa565b61137b565b6103166113a6565b6102b86113d2565b6000846080015161066961064e610f1e565b6001600160a01b0316336001600160a01b03161460cd61149f565b61067e610674610b57565b82146101f461149f565b6106866114ad565b610692868686866114bd565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107285780601f106106fd57610100808354040283529160200191610728565b820191906000526020600020905b81548152906001019060200180831161070b57829003601f168201915b505050505090505b90565b6000610740338484611518565b5060015b92915050565b610752611580565b61075b816115ae565b50565b60025490565b600080600061077161162c565b15925061077c611649565b915061078661166d565b9050909192565b606081516001600160401b03811180156107a657600080fd5b506040519080825280602002602001820160405280156107d0578160200160208202803683370190505b50905060006107dd611691565b905060005b83518110156108a95773__$7d2aa5f7ef8d6b62e49cb3fca3aaf3d8f4$__6379eaef82600c86848151811061081357fe5b6020026020010151856040518463ffffffff1660e01b815260040161083a93929190615e64565b60206040518083038186803b15801561085257600080fd5b505af4158015610866573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088a91906159e5565b83828151811061089657fe5b60209081029190910101526001016107e2565b5050919050565b60606108ba6116a3565b905090565b6000806000806000806108d061176c565b90506108db81611772565b95506108e68161177e565b94506108f18161178b565b93506108fc81611798565b9250610907816117a5565b9150509091929394565b60408051600280825260608083018452926020830190803683370190505090506109396117b2565b8160008151811061094657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505061096e6117d6565b8160018151811061097b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505090565b6000806109ab853361137b565b90506109cf336001600160a01b03871614806109c75750838210155b61019e61149f565b6109da8585856117fa565b336001600160a01b038616148015906109f557506000198114155b15610a0757610a078533858403611518565b60019150505b9392505050565b610a1c6118da565b610a24611580565b610a2e60016118ed565b6000610a3861075e565b1115610a4657610a46611936565b565b610a50611580565b610a60600183101561012c61149f565b610a7161138883111561012d61149f565b6000610a7d8242611439565b9050610a916201518082101561013d61149f565b600080610a9c61198c565b91509150610aad811561013e61149f565b6000610abb866103e86113e3565b90506000838211610aea57610ae5610ad662015180866113e3565b610ae084886113e3565b611a00565b610b04565b610b04610afa62015180846113e3565b610ae086886113e3565b9050610b16600282111561013f61149f565b610b2284834289611a33565b50505050505050565b60055460ff1690565b60006108ba611acd565b610b46611580565b610b4e6118da565b61075b81611b6a565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610740918590610bb19086611bd5565b611518565b610bbe611580565b610bc66118da565b610bd08282611be7565b5050565b6008546000906108ba9060c0611ce6565b60006060610bfb8651610bf6611cf3565b611d17565b610c1089898989898989611d24611d8e611def565b97509795505050505050565b6000806000806000806000610c37610400891061013b61149f565b6000610c4289611f12565b9050610c4d81611f24565b959f949e50929c50909a509850965090945092505050565b60006060610c71610f1e565b6001600160a01b031663f94d4668610c87610b57565b6040518263ffffffff1660e01b8152600401610ca39190615ced565b60006040518083038186803b158015610cbb57600080fd5b505afa158015610ccf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cf79190810190615512565b509150506000610d0561198c565b509050610d1982610d146116a3565b611f87565b6000610d2782846000611fe8565b9050610d3b610d3461075e565b8290612184565b935050505090565b606081516001600160401b0381118015610d5c57600080fd5b50604051908082528060200260200182016040528015610d86578160200160208202803683370190505b5090506000610d93611691565b9050610d9d6151aa565b60005b8451811015610df157848181518110610db557fe5b60200260200101519150610dd282600001518484602001516121d5565b848281518110610dde57fe5b6020908102919091010152600101610da0565b505050919050565b6000806000610e0661198c565b90949093506103e892509050565b6001600160a01b0381166000908152602081905260409020545b919050565b606080610e3e6114ad565b610e4d89898989898989612266565b9092509050610e5a61162c565b15610c1057610c10611936565b6001600160a01b031660009081526006602052604090205490565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610eb7929190615bb6565b604051602081830303815290604052805190602001209050919050565b60006060610ee58651610bf6611cf3565b610c10898989898989896122e461230a611def565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107285780601f106106fd57610100808354040283529160200191610728565b600a54600b549091565b60008360800151610fbf61064e610f1e565b610fca610674610b57565b610fd26114ad565b610fdd85858561236b565b95945050505050565b610fef81612452565b1561100157610ffc61247f565b61075b565b61100a81612497565b1561101757610ffc6124b3565b61075b6101356124c6565b60008061102f338561137b565b90508083106110495761104433856000611518565b611056565b6110563385858403611518565b5060019392505050565b60006107403384846117fa565b60006108ba612519565b600073__$7d2aa5f7ef8d6b62e49cb3fca3aaf3d8f4$__630397bee0600c8461109e611691565b6040518463ffffffff1660e01b81526004016110bc93929190615e18565b60206040518083038186803b1580156110d457600080fd5b505af41580156110e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074491906159e5565b61040090565b61111a611580565b61112382612452565b156111885761113181612593565b6111396117b2565b6001600160a01b0316826001600160a01b03167fca6c2c5b6b44b5f3f0c08f0e28e5b6deda1cb38c3fe1113e8031d926c1e8c6d08360405161117b9190615ced565b60405180910390a3610bd0565b61119182612497565b156111a75761119f816125b5565b6111396117d6565b610bd06101356124c6565b60008060006111c0846125d1565b156111e0576111d56111d0612603565b612609565b925092509250611204565b6111e98461262c565b156111f9576111d56111d061265e565b6112046101356124c6565b9193909250565b6112198442111560d161149f565b6001600160a01b0387166000908152600660209081526040808320549051909291611270917f0000000000000000000000000000000000000000000000000000000000000000918c918c918c9188918d9101615d15565b604051602081830303815290604052805190602001209050600061129382612664565b90506000600182888888604051600081526020016040526040516112ba9493929190615da5565b6020604051602081039080840390855afa1580156112dc573d6000803e3d6000fd5b5050604051601f190151915061131e90506001600160a01b0382161580159061131657508b6001600160a01b0316826001600160a01b0316145b6101f861149f565b6001600160a01b038b1660009081526006602052604090206001850190556113478b8b8b611518565b5050505050505050505050565b60608061135f6114ad565b61136e89898989898989612680565b9092509050610c10611936565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6113ae611580565b6000806113b961198c565b915091506113c98161014061149f565b610bd0826127a4565b6201de2090565b80610bd0816127df565b6000828202610a0d8415806114005750838583816113fd57fe5b04145b600361149f565b61141f828414801561141857508183145b606761149f565b505050565b6001600160401b03811b1992909216911b1790565b600061144983831115600161149f565b50900390565b1b90565b6000610a0d838360555b60006001821b1984168284611473576000611476565b60015b60ff16901b17949350505050565b6001600160c01b03828116821b90821b198416179392505050565b81610bd057610bd0816124c6565b6114b5612858565b610a46612898565b60006114d183836114cc611cf3565b6128d3565b60606114db6116a3565b90506000865160018111156114ec57fe5b14611503576114fe86868686856128eb565b610692565b6106928686868685612960565b949350505050565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611573908590615ced565b60405180910390a3505050565b60006115976000356001600160e01b031916610e82565b905061075b6115a682336129c4565b61019161149f565b80156115ce576115c96115bf611649565b421061019361149f565b6115e3565b6115e36115d961166d565b42106101a961149f565b6007805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611621908390615cca565b60405180910390a150565b600061163661166d565b4211806108ba57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ba61169e61176c565b611798565b60606116ad612ab4565b90506116fe6116db7f0000000000000000000000000000000000000000000000000000000000000000612bea565b826000815181106116e857fe5b6020026020010151612c3990919063ffffffff16565b8160008151811061170b57fe5b6020026020010181815250506117506117437f0000000000000000000000000000000000000000000000000000000000000000612bea565b826001815181106116e857fe5b8160018151811061175d57fe5b60200260200101818152505090565b60085490565b60006107448282612c65565b6000610744826016612c65565b600061074482602c612c8c565b600061074482604b612c96565b6000610744826055612c9e565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6118116001600160a01b038416151561019861149f565b6118286001600160a01b038316151561019961149f565b61183383838361141f565b6001600160a01b03831660009081526020819052604090205461185990826101a0612ca8565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546118889082611bd5565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611573908590615ced565b610a466118e561162c565b61019261149f565b611907611902826118fc61176c565b90611453565b612cbe565b7f3e350b41e86a8e10f804ade6d35340d620be35569cc75ac943e8bb14ab80ead1816040516116219190615cca565b600061194061176c565b905061194b816117a5565b1561075b5761196561195e600a54612cd3565b8290612d13565b905061198161197a61197561075e565b612cd3565b8290612d20565b905061075b81612cbe565b60008060008060008061199d612d2e565b9350935093509350804210156119f05760019450838311156119d45781810382420385850302816119ca57fe5b04840195506119eb565b81810382420384860302816119e557fe5b04840395505b6119f8565b600094508295505b505050509091565b6000611a0f821515600461149f565b82611a1c57506000610744565b816001840381611a2857fe5b046001019050610744565b611a47816001600160401b031660c061144f565b611a5b836001600160401b0316608061144f565b611a6f856001600160401b0316604061144f565b611a83876001600160401b0316600061144f565b1717176009556040517f1835882ee7a34ac194f717a35e09bb1d24c82a3b9d854ab6c9749525b714cdf290611abf908690869086908690615f06565b60405180910390a150505050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611b3a612d85565b30604051602001611b4f959493929190615d49565b60405160208183030381529060405280519060200120905090565b611b7d64e8d4a5100082101560cb61149f565b611b9367016345785d8a000082111560ca61149f565b600854611ba2908260c0611424565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611621908390615ced565b6000828201610a0d848210158361149f565b6000611bf1610b57565b90506000611bfd610f1e565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b8152600401611c2a929190615d8e565b60806040518083038186803b158015611c4257600080fd5b505afa158015611c56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7a9190615af1565b604051630639cdb560e21b81529094506001600160a01b03851693506318e736d49250611cae915085908790600401615d75565b600060405180830381600087803b158015611cc857600080fd5b505af1158015611cdc573d6000803e3d6000fd5b5050505050505050565b1c6001600160401b031690565b7f000000000000000000000000000000000000000000000000000000000000000090565b610bd0818314606761149f565b6000606080611d3161162c565b15611d6957611d698789600081518110611d4757fe5b60200260200101518a600181518110611d5c57fe5b6020026020010151612d89565b611d798b8b8b8b8b8b8b8b612e3e565b9250925092505b985098509895505050505050565b60005b611d99611cf3565b81101561141f57611dd0838281518110611daf57fe5b6020026020010151838381518110611dc357fe5b6020026020010151612184565b838281518110611ddc57fe5b6020908102919091010152600101611d91565b333014611ead576000306001600160a01b0316600036604051611e13929190615bce565b6000604051808303816000865af19150503d8060008114611e50576040519150601f19603f3d011682016040523d82523d6000602084013e611e55565b606091505b505090508060008114611e6457fe5b60046000803e6000516001600160e01b0319166343adbafb60e01b8114611e8f573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b6060611eb76116a3565b9050611ec38782611f87565b60006060611edb8c8c8c8c8c8c898d8d63ffffffff16565b5091509150611eee81848663ffffffff16565b8051601f1982018390526343adbafb603f1983015260200260231982016044820181fd5b6000908152600c602052604090205490565b6000806000806000806000611f3888612ed3565b9650611f4388612ee0565b9550611f4e88612eed565b9450611f5988612efa565b9350611f6488612f07565b9250611f6f88612f14565b9150611f7a88612f21565b9050919395979092949650565b60005b611f92611cf3565b81101561141f57611fc9838281518110611fa857fe5b6020026020010151838381518110611fbc57fe5b6020026020010151612c39565b838281518110611fd557fe5b6020908102919091010152600101611f8a565b81516000908190815b818110156120295761201f86828151811061200857fe5b602002602001015184611bd590919063ffffffff16565b9250600101611ff1565b508161203a57600092505050610a0d565b600082878302825b60ff81101561216c576000858a60008151811061205b57fe5b60200260200101510290506000600190505b868110156120af576120a561209e612098848e858151811061208b57fe5b60200260200101516113e3565b896113e3565b868c612f2d565b915060010161206d565b508394506121226120f16120d86120cf6120c9878c6113e3565b856113e3565b6103e88d612f2d565b6120eb6120e58a896113e3565b886113e3565b90611bd5565b61211c61210f6121056103e88803866113e3565b6103e88e15612f2d565b6120eb8a600101896113e3565b8b612f2d565b93508484111561214a576001858503116121455783975050505050505050610a0d565b612163565b6001848603116121635783975050505050505050610a0d565b50600101612042565b506121786101426124c6565b50505050509392505050565b6000612193821515600461149f565b826121a057506000610744565b670de0b6b3a7640000838102906121c3908583816121ba57fe5b0414600561149f565b8281816121cc57fe5b04915050610744565b6040516334171a8560e01b815260009073__$7d2aa5f7ef8d6b62e49cb3fca3aaf3d8f4$__906334171a859061221690600c90889088908890600401615e39565b60206040518083038186803b15801561222e57600080fd5b505af4158015612242573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151091906159e5565b6060808861227561064e610f1e565b612280610674610b57565b606061228a6116a3565b90506122968882611f87565b60006060806122ab8e8e8e8e8e8e8a8f611d24565b9250925092506122bb8d84612f4d565b6122c58285611d8e565b6122cf8185611d8e565b909550935050505b5097509795505050505050565b60006060806122fa8789600081518110611d4757fe5b611d798b8b8b8b8b8b8b8b612f57565b60005b612315611cf3565b81101561141f5761234c83828151811061232b57fe5b602002602001015183838151811061233f57fe5b6020026020010151612fb0565b83828151811061235857fe5b602090810291909101015260010161230d565b60008061237b8560200151612ffe565b9050600061238c8660400151612ffe565b905060008651600181111561239d57fe5b1415612403576123b08660600151613023565b60608701526123bf8583613044565b94506123cb8482613044565b93506123db866060015183613044565b606087015260006123ed878787613050565b90506123f98183613089565b9350505050610a0d565b61240d8583613044565b94506124198482613044565b9350612429866060015182613044565b6060870152600061243b878787613095565b905061244781846130c4565b90506123f9816130d0565b600061245d826125d1565b80156107445750600061246e6117b2565b6001600160a01b0316141592915050565b610a4661249261248d612603565b6130f6565b612593565b60006124a28261262c565b80156107445750600061246e6117d6565b610a466124c161248d61265e565b6125b5565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6000612523610f1e565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561255b57600080fd5b505afa15801561256f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ba9190615857565b6000806125a76125a16117b2565b84613103565b9150915061141f82826131d4565b6000806125c36125a16117d6565b9150915061141f8282613240565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b600d5490565b6000806000612617846132a0565b9250612622846132ac565b9395909450915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b600e5490565b600061266e611acd565b82604051602001610eb7929190615bde565b6060808861268f61064e610f1e565b61269a610674610b57565b60606126a46116a3565b90506126ae61075e565b61275457600060606126c38d8d8d868b6132cc565b915091506126d8620f424083101560cc61149f565b6126e66000620f424061335b565b6126f58b620f4240840361335b565b6126ff818461230a565b80612708611cf3565b6001600160401b038111801561271d57600080fd5b50604051908082528060200260200182016040528015612747578160200160208202803683370190505b50955095505050506122d7565b61275e8882611f87565b60006060806127738e8e8e8e8e8e8a8f6122e4565b9250925092506127838c8461335b565b61278d828561230a565b6127978185611d8e565b90955093506122d7915050565b6127b081824242611a33565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a0233816040516116219190615ced565b6002815110156127ee5761075b565b6000816000815181106127fd57fe5b602002602001015190506000600190505b825181101561141f57600083828151811061282557fe5b6020026020010151905061284e816001600160a01b0316846001600160a01b031610606561149f565b915060010161280e565b60006128626117b2565b6001600160a01b031614610a465760008061288361287e612603565b6132ac565b9150915080421115610bd057610bd082612593565b60006128a26117d6565b6001600160a01b031614610a46576000806128be61287e61265e565b9150915080421115610bd057610bd0826125b5565b61141f81841080156128e457508183105b606461149f565b60006128f78583611f87565b612918866060015183858151811061290b57fe5b6020026020010151613044565b6060870152600061292b87878787613365565b905061294a8184878151811061293d57fe5b60200260200101516130c4565b9050612955816130d0565b979650505050505050565b600061296f8660600151613023565b606087015261297e8583611f87565b612992866060015183868151811061290b57fe5b606087015260006129a58787878761339d565b9050612955818486815181106129b757fe5b6020026020010151613089565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6129e3610efa565b6001600160a01b0316141580156129fe57506129fe836133c0565b15612a2657612a0b610efa565b6001600160a01b0316336001600160a01b0316149050610744565b612a2e612519565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b8152600401612a5d93929190615cf6565b60206040518083038186803b158015612a7557600080fd5b505afa158015612a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aad9190615771565b9050610744565b60606000612ac0611cf3565b90506060816001600160401b0381118015612ada57600080fd5b50604051908082528060200260200182016040528015612b04578160200160208202803683370190505b5090508115612b3357612b156133fc565b81600081518110612b2257fe5b602002602001018181525050612b3c565b91506107309050565b6001821115612b3357612b4d613420565b81600181518110612b5a57fe5b6020026020010181815250506002821115612b3357612b77613444565b81600281518110612b8457fe5b6020026020010181815250506003821115612b3357612ba1613468565b81600381518110612bae57fe5b6020026020010181815250506004821115612b3357612bcb61348c565b81600481518110612bd857fe5b60200260200101818152505091505090565b6000612bf582612452565b15612c1157612c0a612c05612603565b6132a0565b9050610e2e565b612c1a82612497565b15612c2a57612c0a612c0561265e565b50670de0b6b3a7640000610e2e565b6000828202612c538415806114005750838583816113fd57fe5b670de0b6b3a764000090049392505050565b600082821c623fffff16621fffff8113612c7f5780611510565b623fffff19179392505050565b1c637fffffff1690565b1c6103ff1690565b1c60019081161490565b6000612cb7848411158361149f565b5050900390565b600854612ccd90826000611484565b60085550565b600080612cdf836134b0565b90506000808213612cf857652d79883d20008203612d02565b652d79883d200082015b655af3107a40009005949350505050565b6000610a0d83838361350d565b6000610a0d8383601661350d565b600080600080612d4a6000600954611ce690919063ffffffff16565b600954909450612d5b906040611ce6565b600954909350612d6c906080611ce6565b600954909250612d7d9060c0611ce6565b905090919293565b4690565b6000612d9361176c565b90506000612d9f61198c565b509050612dab826117a5565b8015612db657508443115b15612e3757600080612dd2838787612dcd8861177e565b613524565b915091506000612de185611798565b90506000612dee8661178b565b90506000612e0782848787612e028c611772565b613559565b9050808314612e3157612e1a87826135b0565b9650612e2687426135be565b9650612e3187612cbe565b50505050505b5050505050565b6000606080612e4b61162c565b15612e6e57612e5a88876135cc565b9050612e6988826114396136b8565b612eb9565b612e76611cf3565b6001600160401b0381118015612e8b57600080fd5b50604051908082528060200260200182016040528015612eb5578160200160208202803683370190505b5090505b612ec4888686613723565b9093509150611d80888361378f565b60006107448260ea612c65565b60006107448260b56137be565b600061074482609f612c65565b600061074482606a6137be565b6000610744826054612c65565b600061074482601f6137be565b60006107448282612c8c565b600081612f4357612f3e84846137f1565b611510565b6115108484611a00565b610bd08282613811565b6000606080612f646118da565b6060612f7089886135cc565b9050612f7f89826114396136b8565b60006060612f8e8b89896138cd565b91509150612f9c8b82613926565b909d909c50909a5098505050505050505050565b6000612fbf821515600461149f565b82612fcc57506000610744565b670de0b6b3a764000083810290612fe6908583816121ba57fe5b826001820381612ff257fe5b04600101915050610744565b60008061300a83613933565b9050600061301784612bea565b90506115108282612c39565b600080613038613031610bd4565b8490613a32565b9050610a0d8382611439565b6000610a0d8383612c39565b600061306761305d611cf3565b60021460d261149f565b6060600080613077878787613a6e565b9250925092506129558784848461339d565b6000610a0d8383612184565b60006130a261305d611cf3565b60606000806130b2878787613a6e565b92509250925061295587848484613365565b6000610a0d8383612fb0565b60006107446130ef6130e0610bd4565b670de0b6b3a764000090611439565b8390612fb0565b6000610744826080611ce6565b600080836001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b15801561313f57600080fd5b505afa158015613153573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061317791906159e5565b905061318b600160801b821061014961149f565b6131a18342016001600160401b031660c061144f565b6131b5846001600160401b0316608061144f565b6131c9836001600160801b0316600061144f565b171791509250929050565b81600d819055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167fc1a224b14823b63c7711127f125fbf592434682f38881ebb61408747a303affc826040516132349190615ced565b60405180910390a25050565b81600e819055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167fc1a224b14823b63c7711127f125fbf592434682f38881ebb61408747a303affc826040516132349190615ced565b60006107448282613b2f565b6000806132b8836130f6565b91506132c58360c0611ce6565b9050915091565b600060606132d86118da565b60006132e384613b3c565b90506132fe60008260028111156132f657fe5b1460ce61149f565b606061330985613b52565b90506133188151610bf6611cf3565b6133228187611f87565b600061332c61198c565b509050600061333d82846001611fe8565b90508061334a8184613b68565b9b929a509198505050505050505050565b610bd08282613b73565b60006133918560a001518560008151811061337c57fe5b602002602001015186600181518110611d5c57fe5b610fdd85858585613c01565b60006133b48560a001518560008151811061337c57fe5b610fdd85858585613c2b565b60006133d2632f1a0bc960e01b610e82565b8214806133ed57506133ea637587926b60e11b610e82565b82145b80610744575061074482613c55565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006134c060008313606461149f565b670c7d713b49da0000821380156134de5750670f43fc2c04ee000082125b1561350457670de0b6b3a76400006134f583613c87565b816134fc57fe5b059050610e2e565b612c0a82613da5565b623fffff828116821b90821b198416179392505050565b6000806000613534878787614144565b905061354281878787614203565b915061354d81612cd3565b92505094509492505050565b6000806135758585854261356c8b611f12565b9392919061422e565b905060784288900310158061358a5786613593565b61359387614280565b6000818152600c6020526040902092909255509695505050505050565b6000610a0d8383604b61428d565b6000610a0d8383602c61429d565b6060806135d7611cf3565b6001600160401b03811180156135ec57600080fd5b50604051908082528060200260200182016040528015613616578160200160208202803683370190505b50905082613625579050610744565b6000808560008151811061363557fe5b602002602001015190506000600190505b61364e611cf3565b81101561368557600087828151811061366357fe5b602002602001015190508281111561367c578193508092505b50600101613646565b50613697600b5487600a5485896142af565b8383815181106136a357fe5b60209081029190910101525090949350505050565b60005b6136c3611cf3565b81101561371d576136fe8482815181106136d957fe5b60200260200101518483815181106136ed57fe5b60200260200101518463ffffffff16565b84828151811061370a57fe5b60209081029190910101526001016136bb565b50505050565b60006060600061373284613b3c565b9050600081600281111561374257fe5b141561375c57613752868561432f565b9250925050613787565b600181600281111561376a57fe5b141561377a5761375286856143f9565b61375286868661442b565b505b935093915050565b61379c82826114396136b8565b60006137a661198c565b50905061141f6137b882856001611fe8565b82613b68565b600082821c661fffffffffffff16660fffffffffffff81136137e05780611510565b661fffffffffffff19179392505050565b6000613800821515600461149f565b81838161380957fe5b049392505050565b6138286001600160a01b038316151561019b61149f565b6138348260008361141f565b6001600160a01b03821660009081526020819052604090205461385a90826101a1612ca8565b6001600160a01b03831660009081526020819052604090205560025461388090826144a7565b6002556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906138c1908590615ced565b60405180910390a35050565b6000606060006138dc84613b3c565b905060018160028111156138ec57fe5b14156138fd576137528686866144b5565b600281600281111561390b57fe5b141561391b57613752868561451f565b6137856101366124c6565b61379c8282611bd56136b8565b600061393e826125d1565b1561394b57612c0a6133fc565b6139548261262c565b1561396157612c0a613420565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156139a357612c0a613444565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156139e557612c0a613468565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613a2757612c0a61348c565b610e2e6101356124c6565b6000828202613a4c8415806114005750838583816113fd57fe5b80613a5b576000915050610744565b670de0b6b3a76400006000198201612ff2565b60408051600280825260608281019093526000918291816020016020820280368337019050509250613aa386602001516125d1565b15613ae95760009150600190508483600081518110613abe57fe5b6020026020010181815250508383600181518110613ad857fe5b602002602001018181525050613b26565b60009050600191508383600081518110613aff57fe5b6020026020010181815250508483600181518110613b1957fe5b6020026020010181815250505b93509350939050565b1c6001600160801b031690565b60008180602001905181019061074491906158c0565b606081806020019051810190610a0d9190615985565b600a91909155600b55565b613b7f6000838361141f565b600254613b8c9082611bd5565b6002556001600160a01b038216600090815260208190526040902054613bb29082611bd5565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906138c1908590615ced565b6000613c0b6118da565b6000613c1561198c565b5090506000612955828787878b606001516145b3565b6000613c356118da565b6000613c3f61198c565b5090506000612955828787878b6060015161466b565b6000613c67631c74c91760e11b610e82565b8214806107445750613c7f6350dd6ed960e01b610e82565b909114919050565b670de0b6b3a7640000026000806a0c097ce7bc90715b34b9f160241b808401906ec097ce7bc90715b34b9f0fffffffff1985010281613cc257fe5b05905060006a0c097ce7bc90715b34b9f160241b82800205905081806a0c097ce7bc90715b34b9f160241b81840205915060038205016a0c097ce7bc90715b34b9f160241b82840205915060058205016a0c097ce7bc90715b34b9f160241b82840205915060078205016a0c097ce7bc90715b34b9f160241b82840205915060098205016a0c097ce7bc90715b34b9f160241b828402059150600b8205016a0c097ce7bc90715b34b9f160241b828402059150600d8205016a0c097ce7bc90715b34b9f160241b828402059150600f826002919005919091010295945050505050565b6000670de0b6b3a7640000821215613de157613dd7826a0c097ce7bc90715b34b9f160241b81613dd157fe5b05613da5565b6000039050610e2e565b60007e1600ef3172e58d2e933ec884fde10064c63b5372d805e203c00000000000008312613e3257770195e54c5dd42177f53a27172fa9ec630262827000000000830592506806f05b59d3b2000000015b73011798004d755d3c8bc8e03204cf44619e0000008312613e6a576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff00840008312613eb2576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a7008312613eed576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf8508312613f2457693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e28312613f5b57690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d038312613f905768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb417461211108312613fbb57680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d8312613ff0576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f17757889379378312614025576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b2866038312614059576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac831261408d576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b600068056bc75e2d63100000840168056bc75e2d6310000080860302816140b057fe5b059050600068056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b60008061415c85614155868661470d565b6001611fe8565b90506103e86002860204600061417c8361417681856113e3565b90611439565b9050600061419786614191856002028a6113e3565b90612c39565b905060006141c06141a88489612c39565b6141766141b98a614191898d6113e3565b8590611bd5565b905060006141e96141d1858b612c39565b6141766141e28c6141918a8f6113e3565b8690611bd5565b90506141f58282612fb0565b9a9950505050505050505050565b6000806142136141e28786613a32565b9050600061422082612cd3565b939093039695505050505050565b60008061423a87612f21565b83039050600081870261424c89612ee0565b019050600082870261425d8a612efa565b019050600083870261426e8b612f14565b0190506141f589848a858b868c614767565b60006107448260016147c7565b6103ff811b1992909216911b1790565b637fffffff811b1992909216911b1790565b6000806142be878787876147cf565b9050808685815181106142cd57fe5b6020026020010151116142e4576000915050610fdd565b6000818786815181106142f357fe5b6020026020010151039050614323670de0b6b3a764000061431d8684612c3990919063ffffffff16565b90612184565b98975050505050505050565b6000606061433b6118da565b60008061434785614978565b9150915061435f614356611cf3565b8210606461149f565b6060614369611cf3565b6001600160401b038111801561437e57600080fd5b506040519080825280602002602001820160405280156143a8578160200160208202803683370190505b50905060006143b561198c565b5090506143d4818985876143c761075e565b6143cf610bd4565b61499a565b8284815181106143e057fe5b6020908102919091010152509196919550909350505050565b60006060600061440884614ab6565b9050606061441e868361441961075e565b614acc565b9196919550909350505050565b600060606144376118da565b6060600061444485614b67565b915091506144558251610bf6611cf3565b61445f8287611f87565b600061446961198c565b5090506000614489828a8661447c61075e565b614484610bd4565b614b7f565b90506144998382111560cf61149f565b989297509195505050505050565b6000610a0d83836001612ca8565b600060608060006144c585614b67565b915091506144db6144d4611cf3565b8351611d17565b6144e58287611f87565b60006144ef61198c565b509050600061450f828a8661450261075e565b61450a610bd4565b614e13565b90506144998382101560d061149f565b6000606060008061452f85614978565b9150915061453e614356611cf3565b6060614548611cf3565b6001600160401b038111801561455d57600080fd5b50604051908082528060200260200182016040528015614587578160200160208202803683370190505b509050600061459461198c565b5090506143d4818985876145a661075e565b6145ae610bd4565b615089565b6000806145c287876001611fe8565b90506145ea838786815181106145d457fe5b602002602001015161143990919063ffffffff16565b8685815181106145f657fe5b6020026020010181815250506000614610888884896147cf565b90508387868151811061461f57fe5b60200260200101510187868151811061463457fe5b60200260200101818152505061432360016120eb89898151811061465457fe5b60200260200101518461143990919063ffffffff16565b60008061467a87876001611fe8565b90506146a28387878151811061468c57fe5b6020026020010151611bd590919063ffffffff16565b8686815181106146ae57fe5b60200260200101818152505060006146c8888884886147cf565b9050838787815181106146d757fe5b6020026020010151038787815181106146ec57fe5b6020026020010181815250506143236001614176838a89815181106145d457fe5b6040805160028082526060808301845292602083019080368337019050509050828160008151811061473b57fe5b602002602001018181525050818160018151811061475557fe5b60200260200101818152505092915050565b6000614773828261144f565b61477e84601f615166565b614789866054615177565b61479488606a615166565b61479f8a609f615177565b6147aa8c60b5615166565b6147b58e60ea615177565b17171717171798975050505050505050565b016103ff1690565b6000808451860290506000856000815181106147e757fe5b60200260200101519050600086518760008151811061480257fe5b60200260200101510290506000600190505b875181101561485b5761484061483a614833848b858151811061208b57fe5b8a516113e3565b886137f1565b915061485188828151811061200857fe5b9250600101614814565b5086858151811061486857fe5b602002602001015182039150600061488087886113e3565b905060006148ac6148a061489884610ae089886113e3565b6103e86113e3565b8a898151811061208b57fe5b905060006148c06141e26148988b896137f1565b90506000806148dc6148d28686611bd5565b610ae08d86611bd5565b905060005b60ff81101561495c578192506149116148fe866120eb85866113e3565b610ae08e614176886120eb8860026113e3565b91508282111561493a57600183830311614935575097506115109650505050505050565b614954565b600182840311614954575097506115109650505050505050565b6001016148e1565b506149686101426124c6565b5050505050505050949350505050565b6000808280602001905181019061498f919061594f565b909590945092505050565b6000806149a988886001611fe8565b905060006149cb826149c5876149bf818b611439565b90612fb0565b90613a32565b905060006149db8a8a848b6147cf565b905060006149ef828b8b815181106145d457fe5b90506000805b8b51811015614a2e57614a248c8281518110614a0d57fe5b602002602001015183611bd590919063ffffffff16565b91506001016149f5565b506000614a57828d8d81518110614a4157fe5b602002602001015161218490919063ffffffff16565b90506000614a6482615184565b90506000614a728583613a32565b90506000614a808683611439565b9050614aa1614a9a83670de0b6b3a76400008e9003612c39565b8290611bd5565b99505050505050505050509695505050505050565b600081806020019051810190610a0d9190615922565b60606000614ada8484612184565b9050606085516001600160401b0381118015614af557600080fd5b50604051908082528060200260200182016040528015614b1f578160200160208202803683370190505b50905060005b8651811015614b5d57614b3e838883815181106116e857fe5b828281518110614b4a57fe5b6020908102919091010152600101614b25565b5095945050505050565b606060008280602001905181019061498f91906158dc565b600080805b8651811015614ba657614b9c878281518110614a0d57fe5b9150600101614b84565b50606085516001600160401b0381118015614bc057600080fd5b50604051908082528060200260200182016040528015614bea578160200160208202803683370190505b5090506000805b8851811015614cb1576000614c22858b8481518110614c0c57fe5b6020026020010151612fb090919063ffffffff16565b9050614c5e8a8381518110614c3357fe5b60200260200101516149bf8b8581518110614c4a57fe5b60200260200101518d86815181106145d457fe5b848381518110614c6a57fe5b602002602001018181525050614ca6614c9f82868581518110614c8957fe5b6020026020010151613a3290919063ffffffff16565b8490611bd5565b925050600101614bf1565b50606088516001600160401b0381118015614ccb57600080fd5b50604051908082528060200260200182016040528015614cf5578160200160208202803683370190505b50905060005b8951811015614dc0576000848281518110614d1257fe5b6020026020010151841115614d79576000614d3b614d2f86615184565b8d85815181106116e857fe5b90506000614d4f828d86815181106145d457fe5b9050614d70614d6982670de0b6b3a76400008d9003612fb0565b8390611bd5565b92505050614d90565b898281518110614d8557fe5b602002602001015190505b614da0818c84815181106145d457fe5b838381518110614dac57fe5b602090810291909101015250600101614cfb565b506000614dcf8b8b6001611fe8565b90506000614ddf8c846000611fe8565b90506000614ded8284612184565b9050614e02614dfb82615184565b8b90613a32565b9d9c50505050505050505050505050565b600080805b8651811015614e3a57614e30878281518110614a0d57fe5b9150600101614e18565b50606085516001600160401b0381118015614e5457600080fd5b50604051908082528060200260200182016040528015614e7e578160200160208202803683370190505b5090506000805b8851811015614f12576000614ea0858b8481518110614a4157fe5b9050614edc8a8381518110614eb157fe5b602002602001015161431d8b8581518110614ec857fe5b60200260200101518d868151811061468c57fe5b848381518110614ee857fe5b602002602001018181525050614f07614c9f828685815181106116e857fe5b925050600101614e85565b50606088516001600160401b0381118015614f2c57600080fd5b50604051908082528060200260200182016040528015614f56578160200160208202803683370190505b50905060005b895181101561501757600083858381518110614f7457fe5b60200260200101511115614fd0576000614f99614d2f86670de0b6b3a7640000611439565b90506000614fad828d86815181106145d457fe5b9050614fc7614d6982670de0b6b3a76400008d9003612c39565b92505050614fe7565b898281518110614fdc57fe5b602002602001015190505b614ff7818c848151811061468c57fe5b83838151811061500357fe5b602090810291909101015250600101614f5c565b5060006150268b8b6001611fe8565b905060006150368c846000611fe8565b905060006150448284612184565b9050670de0b6b3a76400008111156150795761506b8a670de0b6b3a763ffff198301612c39565b975050505050505050610fdd565b6000975050505050505050610fdd565b60008061509888886001611fe8565b905060006150ae826149c5876149bf818b611bd5565b905060006150be8a8a848b6147cf565b905060006150e88a8a815181106150d157fe5b60200260200101518361143990919063ffffffff16565b90506000805b8b51811015615110576151068c8281518110614a0d57fe5b91506001016150ee565b506000615123828d8d81518110614a4157fe5b9050600061513082615184565b9050600061513e8583613a32565b9050600061514c8683611439565b9050614aa1614a9a83670de0b6b3a76400008e9003612fb0565b661fffffffffffff91909116901b90565b623fffff91909116901b90565b6000670de0b6b3a7640000821061519c576000610744565b50670de0b6b3a76400000390565b604080518082019091526000808252602082015290565b803561074481615f7e565b600082601f8301126151dc578081fd5b81356151ef6151ea82615f55565b615f2f565b81815291506020808301908481018184028601820187101561521057600080fd5b60005b8481101561522f57813584529282019290820190600101615213565b505050505092915050565b600082601f83011261524a578081fd5b81516152586151ea82615f55565b81815291506020808301908481018184028601820187101561527957600080fd5b60005b8481101561522f5781518452928201929082019060010161527c565b600082601f8301126152a8578081fd5b81356001600160401b038111156152bd578182fd5b6152d0601f8201601f1916602001615f2f565b91508082528360208285010111156152e757600080fd5b8060208401602084013760009082016020015292915050565b80356002811061074457600080fd5b803561074481615fa1565b600061012080838503121561532d578182fd5b61533681615f2f565b9150506153438383615300565b815261535283602084016151c1565b602082015261536483604084016151c1565b6040820152606082013560608201526080820135608082015260a082013560a08201526153948360c084016151c1565b60c08201526153a68360e084016151c1565b60e0820152610100808301356001600160401b038111156153c657600080fd5b6153d285828601615298565b82840152505092915050565b6000602082840312156153ef578081fd5b8135610a0d81615f7e565b6000806040838503121561540c578081fd5b823561541781615f7e565b9150602083013561542781615f7e565b809150509250929050565b600080600060608486031215615446578081fd5b833561545181615f7e565b9250602084013561546181615f7e565b929592945050506040919091013590565b600080600080600080600060e0888a03121561548c578485fd5b873561549781615f7e565b965060208801356154a781615f7e565b95506040880135945060608801359350608088013560ff811681146154ca578384fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156154f9578182fd5b823561550481615f7e565b946020939093013593505050565b600080600060608486031215615526578081fd5b83516001600160401b038082111561553c578283fd5b818601915086601f83011261554f578283fd5b815161555d6151ea82615f55565b80828252602080830192508086018b82838702890101111561557d578788fd5b8796505b848710156155a857805161559481615f7e565b845260019690960195928101928101615581565b5089015190975093505050808211156155bf578283fd5b506155cc8682870161523a565b925050604084015190509250925092565b600060208083850312156155ef578182fd5b82356001600160401b03811115615604578283fd5b8301601f81018513615614578283fd5b80356156226151ea82615f55565b818152838101908385016040808502860187018a1015615640578788fd5b8795505b8486101561568d5780828b03121561565a578788fd5b61566381615f2f565b61566d8b8461530f565b815282880135888201528452600195909501949286019290810190615644565b509098975050505050505050565b600060208083850312156156ad578182fd5b82356001600160401b038111156156c2578283fd5b8301601f810185136156d2578283fd5b80356156e06151ea82615f55565b818152838101908385016060808502860187018a10156156fe578788fd5b8795505b8486101561568d5780828b031215615718578788fd5b61572181615f2f565b61572b8b8461530f565b81528288013588820152604080840135908201528452600195909501949286019290810190615702565b600060208284031215615766578081fd5b8135610a0d81615f93565b600060208284031215615782578081fd5b8151610a0d81615f93565b600080600080600080600060e0888a0312156157a7578081fd5b8735965060208801356157b981615f7e565b955060408801356157c981615f7e565b945060608801356001600160401b03808211156157e4578283fd5b6157f08b838c016151cc565b955060808a0135945060a08a0135935060c08a0135915080821115615813578283fd5b506158208a828b01615298565b91505092959891949750929550565b600060208284031215615840578081fd5b81356001600160e01b031981168114610a0d578182fd5b600060208284031215615868578081fd5b8151610a0d81615f7e565b60008060408385031215615885578182fd5b823561589081615f7e565b915060208301356001600160401b038111156158aa578182fd5b6158b685828601615298565b9150509250929050565b6000602082840312156158d1578081fd5b8151610a0d81615fa1565b6000806000606084860312156158f0578081fd5b83516158fb81615fa1565b60208501519093506001600160401b03811115615916578182fd5b6155cc8682870161523a565b60008060408385031215615934578182fd5b825161593f81615fa1565b6020939093015192949293505050565b600080600060608486031215615963578081fd5b835161596e81615fa1565b602085015160409095015190969495509392505050565b60008060408385031215615997578182fd5b82516159a281615fa1565b60208401519092506001600160401b038111156159bd578182fd5b6158b68582860161523a565b6000602082840312156159da578081fd5b8135610a0d81615fa1565b6000602082840312156159f6578081fd5b5051919050565b60008060008060808587031215615a12578182fd5b84356001600160401b0380821115615a28578384fd5b615a348883890161531a565b95506020870135915080821115615a49578384fd5b50615a56878288016151cc565b949794965050505060408301359260600135919050565b600080600060608486031215615a81578081fd5b83356001600160401b03811115615a96578182fd5b615aa28682870161531a565b9660208601359650604090950135949350505050565b600060208284031215615ac9578081fd5b5035919050565b60008060408385031215615ae2578182fd5b50508035926020909101359150565b60008060008060808587031215615b06578182fd5b8451935060208501519250604085015191506060850151615b2681615f7e565b939692955090935050565b6000815180845260208085019450808401835b83811015615b6057815187529582019590820190600101615b44565b509495945050505050565b60008151808452815b81811015615b9057602081850181015186830182015201615b74565b81811115615ba15782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b81811015615c4e5783516001600160a01b031683529284019291840191600101615c29565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015615c4e57835183529284019291840191600101615c76565b600060208252610a0d6020830184615b31565b600060408252615cb86040830185615b31565b8281036020840152610fdd8185615b31565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000838252604060208301526115106040830184615b6b565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b968752602087019590955260408601939093526060850191909152608084015260a083015260c082015260e00190565b9485526020850193909352604084019190915260608301521515608082015260a00190565b83815260608101615e2884615f74565b602082019390935260400152919050565b84815260808101615e4985615f74565b84602083015283604083015282606083015295945050505050565b838152825160a0820190615e7781615f74565b806020840152506020840151604083015260408401516060830152826080830152949350505050565b600060208252610a0d6020830184615b6b565b6000838252604060208301526115106040830184615b31565b9283529015156020830152604082015260600190565b918252602082015260400190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b60ff91909116815260200190565b6040518181016001600160401b0381118282101715615f4d57600080fd5b604052919050565b60006001600160401b03821115615f6a578081fd5b5060209081020190565b6003811061075b57fe5b6001600160a01b038116811461075b57600080fd5b801515811461075b57600080fd5b6003811061075b57600080fdfea264697066735822122044502cf530b7900edafa18cb886436fdae711dd37bb442b33f34a42b6235128c64736f6c63430007010033c1a224b14823b63c7711127f125fbf592434682f38881ebb61408747a303affcca6c2c5b6b44b5f3f0c08f0e28e5b6deda1cb38c3fe1113e8031d926c1e8c6d0", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100615760003560e01c8062c194db14610066578063174481fa146100845780632da47c401461009a5780636634b753146100b05780638d928af8146100d0578063da89709a146100e5575b600080fd5b61006e6100f8565b60405161007b9190610915565b60405180910390f35b61008c610117565b60405161007b9291906108f0565b6100a261015d565b60405161007b929190610a35565b6100c36100be3660046106ed565b6101c7565b60405161007b919061090a565b6100d86101e5565b60405161007b91906108dc565b6100d86100f3366004610709565b610209565b606061011260405180602001604052806000815250610310565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156101b957807f000000000000000000000000000000000000000000000000000000000000000003925062278d0091506101c2565b60009250600091505b509091565b6001600160a01b031660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b600080600061021661015d565b915091506102ae6040518061018001604052806102316101e5565b6001600160a01b031681526020018e81526020018d81526020018c81526020018a81526020018981526020018b81526020018881526020018481526020018381526020018715158152602001866001600160a01b031681525060405160200161029a9190610928565b6040516020818303038152906040526103e9565b9c9b505050505050505050505050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061030a6001600160a01b03831615156101ac610449565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016103db81838661045b565b505050505050505050919050565b6000806103f583610499565b6001600160a01b038116600081815260208190526040808220805460ff191660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b8161045757610457816104d4565b5050565b5b6020811061047b578151835260209283019290910190601f190161045c565b905182516020929092036101000a6000190180199091169116179052565b600060606104a683610310565b905060008151602083016000f090506001600160a01b0381166104cd573d6000803e3d6000fd5b9392505050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b803561053281610a8a565b92915050565b600082601f830112610548578081fd5b813561055b61055682610a6a565b610a43565b81815291506020808301908481018184028601820187101561057c57600080fd5b60005b848110156105a457813561059281610a8a565b8452928201929082019060010161057f565b505050505092915050565b600082601f8301126105bf578081fd5b81356105cd61055682610a6a565b8181529150602080830190848101818402860182018710156105ee57600080fd5b60005b848110156105a457813561060481610a8a565b845292820192908201906001016105f1565b600082601f830112610626578081fd5b813561063461055682610a6a565b81815291506020808301908481018184028601820187101561065557600080fd5b60005b848110156105a457813584529282019290820190600101610658565b8035801515811461053257600080fd5b600082601f830112610694578081fd5b813567ffffffffffffffff8111156106aa578182fd5b6106bd601f8201601f1916602001610a43565b91508082528360208285010111156106d457600080fd5b8060208401602084013760009082016020015292915050565b6000602082840312156106fe578081fd5b81356104cd81610a8a565b60008060008060008060008060006101208a8c031215610727578485fd5b893567ffffffffffffffff8082111561073e578687fd5b61074a8d838e01610684565b9a5060208c013591508082111561075f578687fd5b61076b8d838e01610684565b995060408c0135915080821115610780578687fd5b61078c8d838e01610538565b985060608c0135975060808c01359150808211156107a8578687fd5b6107b48d838e016105af565b965060a08c01359150808211156107c9578586fd5b506107d68c828d01610616565b94505060c08a013592506107ed8b60e08c01610674565b91506107fd8b6101008c01610527565b90509295985092959850929598565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156108515781516001600160a01b03168752958201959082019060010161082c565b509495945050505050565b6000815180845260208085019450808401835b838110156108515781518752958201959082019060010161086f565b15159052565b60008151808452815b818110156108b65760208185018101518683018201520161089a565b818111156108c75782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b901515815260200190565b6000602082526104cd6020830184610891565b60006020825261093c60208301845161080c565b60208301516101808060408501526109586101a0850183610891565b91506040850151601f19808685030160608701526109768483610891565b935060608701519150808685030160808701526109938483610819565b935060808701519150808685030160a08701526109b08483610819565b935060a08701519150808685030160c0870152506109ce838261085c565b60c087015160e0878101919091528701516101008088019190915287015161012080880191909152870151610140808801919091528701519093509050610160610a1a8187018361088b565b8601519050610a2b8583018261080c565b5090949350505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610a6257600080fd5b604052919050565b600067ffffffffffffffff821115610a80578081fd5b5060209081020190565b6001600160a01b0381168114610a9f57600080fd5b5056fea2646970667358221220869f20e49b2d3fb02571815c2015b8f41b3bef59e5bed75a32913754f7e8c3b864736f6c63430007010033", + "linkReferences": { + "@balancer-labs/v2-pool-utils/contracts/oracle/QueryProcessor.sol": { + "QueryProcessor": [ + { + "length": 20, + "start": 10694 + }, + { + "length": 20, + "start": 12884 + }, + { + "length": 20, + "start": 17344 + } + ] + } + }, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/artifact/QueryProcessor.json b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/artifact/QueryProcessor.json new file mode 100644 index 0000000..10c04b1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/artifact/QueryProcessor.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "QueryProcessor", + "sourceName": "@balancer-labs/v2-pool-utils/contracts/oracle/QueryProcessor.sol", + "abi": [], + "bytecode": "0x610af5610026600b82828239805160001a60731461001957fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100565760003560e01c80630397bee01461005b57806334171a851461008457806379eaef8214610097578063f680203a146100aa575b600080fd5b61006e61006936600461098d565b6100cb565b60405161007b9190610ab6565b60405180910390f35b61006e6100923660046109c2565b610111565b61006e6100a53660046109fd565b61025e565b6100bd6100b8366004610a7d565b6102c2565b60405161007b929190610aa8565b6000818152602084905260408120546100f0826100e783610397565b116101396103ab565b60006100fc82866103bd565b90506101078161040e565b9695505050505050565b6000610122824210156101386103ab565b600083815260208690526040812054428490039161013f82610397565b9050610150600082116101396103ab565b82811161017c5780830380610165848a6103bd565b02610170848a610421565b01945050505050610256565b600061018787610465565b600081815260208b905260408120549192506101a282610397565b90506101b3600082116101396103ab565b6101c28682111561013a6103ab565b50506000806101d28b87856102c2565b9150915060006101e183610397565b6101ea83610397565b03905080156102425760006101ff848d610421565b610209848e610421565b039050600061021785610397565b89039050828183028161022657fe5b05610231868f610421565b019950505050505050505050610256565b61024c838c610421565b9750505050505050505b949350505050565b600061027483602001516000141561013c6103ab565b6000610290858560000151858760200151886040015101610111565b905060006102a8868660000151868860400151610111565b90506101078560200151838303816102bc57fe5b0561040e565b600080806103ff8180805b838511610340576002858501046102e4818a61046e565b600081815260208d90526040902054909450925061030183610397565b9150898210156103165780600101955061033a565b898211156103295760018103945061033a565b82839750975050505050505061038f565b506102cd565b888110610368578960006103538561047f565b81526020019081526020016000205482610385565b818a600061037586610465565b8152602001908152602001600020545b9650965050505050505b935093915050565b60006103a3828261048c565b90505b919050565b816103b9576103b981610496565b5050565b6000808260028111156103cc57fe5b14156103e2576103db836104e9565b9050610408565b60018260028111156103f057fe5b14156103ff576103db836104f6565b6103db83610503565b92915050565b60006103a3655af3107a40008302610510565b60008082600281111561043057fe5b141561043f576103db836108ee565b600182600281111561044d57fe5b141561045c576103db836108fb565b6103db83610908565b60006103a38260015b60006104008383015b069392505050565b60006103a3826001610915565b1c637fffffff1690565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b60006103a38260ea610924565b60006103a382609f610924565b60006103a3826054610924565b600061053f680238fd42c5cf03ffff198312158015610538575068070c1cc73b00c800008313155b60096103ab565b60008212156105735761055482600003610510565b6ec097ce7bc90715b34b9f10000000008161056b57fe5b0590506103a6565b60006806f05b59d3b200000083126105b357506806f05b59d3b1ffffff1990910190770195e54c5dd42177f53a27172fa9ec6302628270000000006105e9565b6803782dace9d900000083126105e557506803782dace9d8ffffff19909101906b1425982cf597cd205cef73806105e9565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac6200000084126106395768ad78ebc5ac61ffffff199093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d6310000008412610675576856bc75e2d630ffffff199093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b1880000084126106af57682b5e3af16b187fffff199093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c40000084126106e9576815af1d78b58c3fffff199093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac6200000841261072257680ad78ebc5ac61fffff199093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d63100000841261075b5768056bc75e2d630fffff199093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b18800008412610794576802b5e3af16b187ffff199093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c4000084126107cd5768015af1d78b58c3ffff199093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b60006103a38260b561094b565b60006103a382606a61094b565b60006103a382601f61094b565b60006104008284038101610477565b600082821c623fffff16621fffff811361093e5780610256565b623fffff19179392505050565b600082821c661fffffffffffff16660fffffffffffff811361096d5780610256565b661fffffffffffff19179392505050565b80356003811061040857600080fd5b6000806000606084860312156109a1578283fd5b833592506109b2856020860161097e565b9150604084013590509250925092565b600080600080608085870312156109d7578081fd5b843593506109e8866020870161097e565b93969395505050506040820135916060013590565b600080600083850360a0811215610a12578384fd5b843593506060601f1982011215610a27578283fd5b506040516060810181811067ffffffffffffffff82111715610a47578384fd5b604052610a57866020870161097e565b815260408581013560208301526060860135908201529295929450505060809091013590565b600080600060608486031215610a91578283fd5b505081359360208301359350604090920135919050565b918252602082015260400190565b9081526020019056fea2646970667358221220a4192ccc819ed3591388c0760cad67b579cd943b47614d3eeeedcae8579e9f0264736f6c63430007010033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100565760003560e01c80630397bee01461005b57806334171a851461008457806379eaef8214610097578063f680203a146100aa575b600080fd5b61006e61006936600461098d565b6100cb565b60405161007b9190610ab6565b60405180910390f35b61006e6100923660046109c2565b610111565b61006e6100a53660046109fd565b61025e565b6100bd6100b8366004610a7d565b6102c2565b60405161007b929190610aa8565b6000818152602084905260408120546100f0826100e783610397565b116101396103ab565b60006100fc82866103bd565b90506101078161040e565b9695505050505050565b6000610122824210156101386103ab565b600083815260208690526040812054428490039161013f82610397565b9050610150600082116101396103ab565b82811161017c5780830380610165848a6103bd565b02610170848a610421565b01945050505050610256565b600061018787610465565b600081815260208b905260408120549192506101a282610397565b90506101b3600082116101396103ab565b6101c28682111561013a6103ab565b50506000806101d28b87856102c2565b9150915060006101e183610397565b6101ea83610397565b03905080156102425760006101ff848d610421565b610209848e610421565b039050600061021785610397565b89039050828183028161022657fe5b05610231868f610421565b019950505050505050505050610256565b61024c838c610421565b9750505050505050505b949350505050565b600061027483602001516000141561013c6103ab565b6000610290858560000151858760200151886040015101610111565b905060006102a8868660000151868860400151610111565b90506101078560200151838303816102bc57fe5b0561040e565b600080806103ff8180805b838511610340576002858501046102e4818a61046e565b600081815260208d90526040902054909450925061030183610397565b9150898210156103165780600101955061033a565b898211156103295760018103945061033a565b82839750975050505050505061038f565b506102cd565b888110610368578960006103538561047f565b81526020019081526020016000205482610385565b818a600061037586610465565b8152602001908152602001600020545b9650965050505050505b935093915050565b60006103a3828261048c565b90505b919050565b816103b9576103b981610496565b5050565b6000808260028111156103cc57fe5b14156103e2576103db836104e9565b9050610408565b60018260028111156103f057fe5b14156103ff576103db836104f6565b6103db83610503565b92915050565b60006103a3655af3107a40008302610510565b60008082600281111561043057fe5b141561043f576103db836108ee565b600182600281111561044d57fe5b141561045c576103db836108fb565b6103db83610908565b60006103a38260015b60006104008383015b069392505050565b60006103a3826001610915565b1c637fffffff1690565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b60006103a38260ea610924565b60006103a382609f610924565b60006103a3826054610924565b600061053f680238fd42c5cf03ffff198312158015610538575068070c1cc73b00c800008313155b60096103ab565b60008212156105735761055482600003610510565b6ec097ce7bc90715b34b9f10000000008161056b57fe5b0590506103a6565b60006806f05b59d3b200000083126105b357506806f05b59d3b1ffffff1990910190770195e54c5dd42177f53a27172fa9ec6302628270000000006105e9565b6803782dace9d900000083126105e557506803782dace9d8ffffff19909101906b1425982cf597cd205cef73806105e9565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac6200000084126106395768ad78ebc5ac61ffffff199093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d6310000008412610675576856bc75e2d630ffffff199093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b1880000084126106af57682b5e3af16b187fffff199093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c40000084126106e9576815af1d78b58c3fffff199093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac6200000841261072257680ad78ebc5ac61fffff199093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d63100000841261075b5768056bc75e2d630fffff199093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b18800008412610794576802b5e3af16b187ffff199093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c4000084126107cd5768015af1d78b58c3ffff199093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b60006103a38260b561094b565b60006103a382606a61094b565b60006103a382601f61094b565b60006104008284038101610477565b600082821c623fffff16621fffff811361093e5780610256565b623fffff19179392505050565b600082821c661fffffffffffff16660fffffffffffff811361096d5780610256565b661fffffffffffff19179392505050565b80356003811061040857600080fd5b6000806000606084860312156109a1578283fd5b833592506109b2856020860161097e565b9150604084013590509250925092565b600080600080608085870312156109d7578081fd5b843593506109e8866020870161097e565b93969395505050506040820135916060013590565b600080600083850360a0811215610a12578384fd5b843593506060601f1982011215610a27578283fd5b506040516060810181811067ffffffffffffffff82111715610a47578384fd5b604052610a57866020870161097e565b815260408581013560208301526060860135908201529295929450505060809091013590565b600080600060608486031215610a91578283fd5b505081359360208301359350604090920135919050565b918252602082015260400190565b9081526020019056fea2646970667358221220a4192ccc819ed3591388c0760cad67b579cd943b47614d3eeeedcae8579e9f0264736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/index.ts b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/index.ts new file mode 100644 index 0000000..c850882 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/index.ts @@ -0,0 +1,10 @@ +import { Task, TaskRunOptions } from '@src'; +import { MetaStablePoolDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const query = await task.deployAndVerify('QueryProcessor', [], from, force); + + const input = task.input() as MetaStablePoolDeployment; + const args = [input.Vault]; + await task.deployAndVerify('MetaStablePoolFactory', args, from, force, { QueryProcessor: query.address }); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/input.ts b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/input.ts new file mode 100644 index 0000000..211259c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type MetaStablePoolDeployment = { + Vault: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/output/arbitrum.json new file mode 100644 index 0000000..7de4953 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/output/arbitrum.json @@ -0,0 +1,4 @@ +{ + "QueryProcessor": "0x6783995f91A3D7f7C24B523669488F96cCa88d31", + "MetaStablePoolFactory": "0xEBFD5681977E38Af65A7487DC70B8221D089cCAD" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/output/goerli.json new file mode 100644 index 0000000..4971238 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/output/goerli.json @@ -0,0 +1,4 @@ +{ + "QueryProcessor": "0xf97c7788d2D74b12CbAb2Efa0c69a44280211457", + "MetaStablePoolFactory": "0xA55F73E2281c60206ba43A3590dB07B8955832Be" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/output/kovan.json b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/output/kovan.json new file mode 100644 index 0000000..a414ba7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/output/kovan.json @@ -0,0 +1,4 @@ +{ + "QueryProcessor": "0x88919A6C36359d449322Cd40451749553C6E33A2", + "MetaStablePoolFactory": "0x590E544e7Ca956Bb878F8C873E82e65550d67D2F" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/output/mainnet.json new file mode 100644 index 0000000..ce396d2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "QueryProcessor": "0x469b58680774AAc9Ad66447eFB4EF634756A2cC5", + "MetaStablePoolFactory": "0x67d27634E44793fE63c467035E31ea8635117cd4" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/output/optimism.json b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/output/optimism.json new file mode 100644 index 0000000..73150f5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/output/optimism.json @@ -0,0 +1,4 @@ +{ + "QueryProcessor": "0xD7FAD3bd59D6477cbe1BE7f646F7f1BA25b230f8", + "MetaStablePoolFactory": "0xb08E16cFc07C684dAA2f93C70323BAdb2A6CBFd2" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/output/polygon.json new file mode 100644 index 0000000..cc1415d --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/output/polygon.json @@ -0,0 +1,4 @@ +{ + "QueryProcessor": "0x72D07D7DcA67b8A406aD1Ec34ce969c90bFEE768", + "MetaStablePoolFactory": "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/output/rinkeby.json b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/output/rinkeby.json new file mode 100644 index 0000000..cac0ea5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/output/rinkeby.json @@ -0,0 +1,4 @@ +{ + "QueryProcessor": "0x81DFdF96Cc20313Fd38c87e6Cb9482214d74Cf70", + "MetaStablePoolFactory": "0x751dfDAcE1AD995fF13c927f6f761C6604532c79" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/readme.md b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/readme.md new file mode 100644 index 0000000..20367bf --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/readme.md @@ -0,0 +1,19 @@ +# 2021-07-27 - Meta Stable Pool + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This factory and associated Pools have been deprecated due to numerical issues when one of the token depegs. Additionally, price oracles will no longer be maintained. +> +> An updated version of the [Phantom Stable Pool](../20211208-stable-phantom-pool) will soon be released, providing a migration path for existing Pools. + +Deployment of the `MetaStablePoolFactory`, for Meta Stable Pools of 2 tokens. + +## Useful Files + +- [Ethereum mainnet address](./output/mainnet.json) +- [Polygon mainnet address](./output/polygon.json) +- [Arbitrum mainnet address](./output/arbitrum.json) +- [Optimism mainnet address](./output/optimism.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`QueryProcessor` artifact](./artifact/QueryProcessor.json) +- [`MetaStablePoolFactory` artifact](./artifact/MetaStablePoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/test/task.fork.ts new file mode 100644 index 0000000..b4e4d98 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210727-meta-stable-pool/test/task.fork.ts @@ -0,0 +1,115 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import * as expectEvent from '@helpers/expectEvent'; +import { bn, fp } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { calculateInvariant } from '@helpers/models/pools/stable/math'; +import { expectEqualWithError } from '@helpers/relativeError'; +import { MAX_UINT256, ZERO_ADDRESS } from '@helpers/constants'; +import { StablePoolEncoder } from '@helpers/models/pools/stable/encoder'; +import { SwapKind } from '@helpers/models/types/types'; + +import { describeForkTest, getSigner, getForkedNetwork, Task, TaskMode, impersonate } from '@src'; + +describeForkTest('MetaStablePoolFactory', 'mainnet', 14850000, function () { + let owner: SignerWithAddress, whale: SignerWithAddress; + let pool: Contract, factory: Contract, vault: Contract, usdc: Contract, dai: Contract; + + let task: Task; + + const DAI = '0x6b175474e89094c44da98b954eedeac495271d0f'; + const USDC = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'; + + const tokens = [DAI, USDC]; + const cacheDurations = [0, 0]; + const rateProviders = [ZERO_ADDRESS, ZERO_ADDRESS]; + const oracleEnabled = true; + const amplificationParameter = bn(400); + const swapFeePercentage = fp(0.01); + const initialBalanceDAI = fp(1e6); + const initialBalanceUSDC = fp(1e6).div(1e12); // 6 digits + const initialBalances = [initialBalanceDAI, initialBalanceUSDC]; + + const LARGE_TOKEN_HOLDER = '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503'; + + before('run task', async () => { + task = new Task('20210727-meta-stable-pool', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('MetaStablePoolFactory'); + }); + + before('load signers', async () => { + owner = await getSigner(); + whale = await impersonate(LARGE_TOKEN_HOLDER); + }); + + before('load vault and tokens', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.instanceAt('Vault', await factory.getVault()); + dai = await task.instanceAt('ERC20', DAI); + usdc = await task.instanceAt('ERC20', USDC); + }); + + it('deploy a meta stable pool', async () => { + const tx = await factory.create( + 'MSP', + 'MSPT', + tokens, + amplificationParameter, + rateProviders, + cacheDurations, + swapFeePercentage, + oracleEnabled, + owner.address + ); + + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + pool = await task.instanceAt('StablePool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + const poolId = pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + }); + + it('can initialize a meta stable pool', async () => { + await dai.connect(whale).approve(vault.address, MAX_UINT256); + await usdc.connect(whale).approve(vault.address, MAX_UINT256); + + const poolId = await pool.getPoolId(); + const userData = StablePoolEncoder.joinInit(initialBalances); + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: tokens, + maxAmountsIn: initialBalances, + fromInternalBalance: false, + userData, + }); + + const expectedInvariant = calculateInvariant([initialBalanceDAI, initialBalanceDAI], amplificationParameter); + expectEqualWithError(await pool.balanceOf(owner.address), expectedInvariant, 0.001); + }); + + it('can swap in a meta stable pool', async () => { + const amount = fp(500); + await dai.connect(whale).transfer(owner.address, amount); + await dai.connect(owner).approve(vault.address, amount); + const previousUSDC = await usdc.balanceOf(owner.address); + + const poolId = await pool.getPoolId(); + await vault + .connect(owner) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: DAI, assetOut: USDC, amount, userData: '0x' }, + { sender: owner.address, recipient: owner.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert pool swap + const expectedUSDC = previousUSDC.add(amount.div(1e12)); + expectEqualWithError(await dai.balanceOf(owner.address), 0, 0.0001); + expectEqualWithError(await usdc.balanceOf(owner.address), expectedUSDC, 0.1); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20210811-ldo-merkle/artifact/MerkleRedeem.json b/balpy/balancer-deployments/tasks/deprecated/20210811-ldo-merkle/artifact/MerkleRedeem.json new file mode 100644 index 0000000..d400182 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210811-ldo-merkle/artifact/MerkleRedeem.json @@ -0,0 +1,445 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "MerkleRedeem", + "sourceName": "contracts/MerkleRedeem.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "_vault", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "_rewardToken", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "RewardAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "RewardPaid", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "liquidityProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "begin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + } + ], + "name": "claimStatus", + "outputs": [ + { + "internalType": "bool[]", + "name": "", + "type": "bool[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "liquidityProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "week", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "claimedBalance", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "name": "claimWeek", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "liquidityProvider", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "week", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "internalType": "struct MerkleRedeem.Claim[]", + "name": "claims", + "type": "tuple[]" + } + ], + "name": "claimWeeks", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "liquidityProvider", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "week", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "internalType": "struct MerkleRedeem.Claim[]", + "name": "claims", + "type": "tuple[]" + } + ], + "name": "claimWeeksToInternalBalance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "liquidityProvider", + "type": "address" + }, + { + "internalType": "contract IDistributorCallback", + "name": "callbackContract", + "type": "address" + }, + { + "internalType": "bytes", + "name": "callbackData", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "week", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "internalType": "struct MerkleRedeem.Claim[]", + "name": "claims", + "type": "tuple[]" + } + ], + "name": "claimWeeksWithCallback", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "claimed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "begin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + } + ], + "name": "merkleRoots", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rewardToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "week", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "_merkleRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "seedAllocations", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "vault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "liquidityProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "week", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "claimedBalance", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "name": "verifyClaim", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "weekMerkleRoots", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60c06040523480156200001157600080fd5b5060405162001a5f38038062001a5f833981016040819052620000349162000147565b600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160601b0319606083811b821660a05282901b1660805260405163095ea7b360e01b81526001600160a01b0382169063095ea7b390620000bf9085906000199060040162000185565b602060405180830381600087803b158015620000da57600080fd5b505af1158015620000ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200011591906200011e565b505050620001b7565b60006020828403121562000130578081fd5b8151801515811462000140578182fd5b9392505050565b600080604083850312156200015a578081fd5b825162000167816200019e565b60208401519092506200017a816200019e565b809150509250929050565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0381168114620001b457600080fd5b50565b60805160601c60a05160601c61185b62000204600039806109855280610c4e5250806105a652806105d052806109615280610b385280610b8e5280610d745280610e11525061185b6000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c8063715018a611610097578063eb0d07f511610066578063eb0d07f514610201578063f2fde38b14610214578063f7c618c114610227578063fbfa77cf1461022f576100f5565b8063715018a6146101b15780638da5cb5b146101b9578063c804c39a146101ce578063dd8c9c9d146101e1576100f5565b80633d421653116100d35780633d4216531461015857806347fb23c11461016b5780634cd488ab1461018b57806358b4e4b41461019e576100f5565b8063120aa877146100fa5780632f1868e41461012357806339436b0014610138575b600080fd5b61010d610108366004611381565b610237565b60405161011a919061161f565b60405180910390f35b6101366101313660046111fd565b610257565b005b61014b6101463660046113db565b61033b565b60405161011a9190611550565b6101366101663660046111af565b6103f0565b61017e6101793660046112b4565b610442565b60405161011a919061150a565b6101366101993660046113b0565b610524565b6101366101ac3660046112e8565b610641565b610136610756565b6101c16107d1565b60405161011a9190611492565b6101366101dc3660046111af565b6107ed565b6101f46101ef366004611369565b61083a565b60405161011a919061162a565b61010d61020f3660046112e8565b61084c565b610136610222366004611193565b6108a2565b6101c161095f565b6101c1610983565b600260209081526000928352604080842090915290825290205460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff8616146102955760405162461bcd60e51b815260040161028c90611782565b60405180910390fd5b60006102a186836109a7565b90506102ad8582610adb565b6040517f55c524c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616906355c524c1906103019087908790600401611633565b600060405180830381600087803b15801561031b57600080fd5b505af115801561032f573d6000803e3d6000fd5b50505050505050505050565b60608183111561035d5760405162461bcd60e51b815260040161028c906116b7565b82820360010160608167ffffffffffffffff8111801561037c57600080fd5b506040519080825280602002602001820160405280156103a6578160200160208202803683370190505b50905060005b828110156103e75785810160009081526001602052604090205482518390839081106103d457fe5b60209081029190910101526001016103ac565b50949350505050565b3373ffffffffffffffffffffffffffffffffffffffff8316146104255760405162461bcd60e51b815260040161028c90611782565b600061043183836109a7565b905061043d8382610adb565b505050565b6060818311156104645760405162461bcd60e51b815260040161028c906116b7565b82820360010160608167ffffffffffffffff8111801561048357600080fd5b506040519080825280602002602001820160405280156104ad578160200160208202803683370190505b50905060005b8281101561051a57858101600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b168452909152902054825160ff9091169083908390811061050257fe5b911515602092830291909101909101526001016104b3565b5095945050505050565b61054f336105306107d1565b73ffffffffffffffffffffffffffffffffffffffff16146101aa610cbb565b6000838152600160205260409020541561057b5760405162461bcd60e51b815260040161028c9061174b565b60008381526001602052604090208290556105ce73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084610cc9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167fac24935fd910bc682b5ccb1a07b718cadf8cf2f6d1404c4f3ddc3662dae40e2982604051610634919061162a565b60405180910390a2505050565b3373ffffffffffffffffffffffffffffffffffffffff8516146106765760405162461bcd60e51b815260040161028c90611782565b600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8816845290915290205460ff16156106c65760405162461bcd60e51b815260040161028c90611714565b6106d28484848461084c565b6106ee5760405162461bcd60e51b815260040161028c90611680565b600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff88168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556107508483610d6c565b50505050565b610762336105306107d1565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b3373ffffffffffffffffffffffffffffffffffffffff8316146108225760405162461bcd60e51b815260040161028c90611782565b600061082e83836109a7565b905061043d8382610d6c565b60016020526000908152604090205481565b6000808584604051602001610862929190611416565b60405160208183030381529060405280519060200120905061089883600160008881526020019081526020016000205483610e38565b9695505050505050565b6108ae336105306107d1565b6108d273ffffffffffffffffffffffffffffffffffffffff821615156101ab610cbb565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006109b161100d565b60005b8351811015610ad3578381815181106109c957fe5b6020908102919091018101518051600090815260028352604080822073ffffffffffffffffffffffffffffffffffffffff8a168352909352919091205490925060ff1615610a295760405162461bcd60e51b815260040161028c90611714565b610a418583600001518460200151856040015161084c565b610a5d5760405162461bcd60e51b815260040161028c90611680565b6020820151610a6d908490610ed5565b8251600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155909350016109b4565b505092915050565b8015610cb757604080516001808252818301909252606091816020015b610b0061102e565b815260200190600190039081610af85750506040805160a081018252600080825273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660208401529282018690523060608301529186166080820152825192935091839190610b8157fe5b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e84604051610c09919061162a565b60405180910390a36040517f0e8e3e8400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690630e8e3e8490610c83908490600401611588565b600060405180830381600087803b158015610c9d57600080fd5b505af1158015610cb1573d6000803e3d6000fd5b50505050505b5050565b81610cb757610cb781610eee565b610750846323b872dd60e01b858585604051602401610cea939291906114b3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610f41565b8015610cb7577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e83604051610def919061162a565b60405180910390a3610cb773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168383610fee565b600081815b8551811015610eca576000868281518110610e5457fe5b60200260200101519050808311610e95578281604051602001610e7892919061144b565b604051602081830303815290604052805190602001209250610ec1565b8083604051602001610ea892919061144b565b6040516020818303038152906040528051906020012092505b50600101610e3d565b509092149392505050565b6000828201610ee78482101583610cbb565b9392505050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051610f6a9190611459565b6000604051808303816000865af19150503d8060008114610fa7576040519150601f19603f3d011682016040523d82523d6000602084013e610fac565b606091505b50915091506000821415610fc4573d6000803e3d6000fd5b610750815160001480610fe6575081806020019051810190610fe69190611349565b6101a2610cbb565b61043d8363a9059cbb60e01b8484604051602401610cea9291906114e4565b60405180606001604052806000815260200160008152602001606081525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b600082601f83011261106e578081fd5b813561108161107c826117e0565b6117b9565b8181529150602080830190848101818402860182018710156110a257600080fd5b60005b848110156110c1578135845292820192908201906001016110a5565b505050505092915050565b600082601f8301126110dc578081fd5b81356110ea61107c826117e0565b818152915060208083019084810160005b848110156110c157813587016060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561113a57600080fd5b611143816117b9565b82860135815260408084013582880152918301359167ffffffffffffffff83111561116d57600080fd5b61117b8c888587010161105e565b908201528652505092820192908201906001016110fb565b6000602082840312156111a4578081fd5b8135610ee781611800565b600080604083850312156111c1578081fd5b82356111cc81611800565b9150602083013567ffffffffffffffff8111156111e7578182fd5b6111f3858286016110cc565b9150509250929050565b600080600080600060808688031215611214578081fd5b853561121f81611800565b9450602086013561122f81611800565b9350604086013567ffffffffffffffff8082111561124b578283fd5b818801915088601f83011261125e578283fd5b81358181111561126c578384fd5b89602082850101111561127d578384fd5b60208301955080945050606088013591508082111561129a578283fd5b506112a7888289016110cc565b9150509295509295909350565b6000806000606084860312156112c8578283fd5b83356112d381611800565b95602085013595506040909401359392505050565b600080600080608085870312156112fd578384fd5b843561130881611800565b93506020850135925060408501359150606085013567ffffffffffffffff811115611331578182fd5b61133d8782880161105e565b91505092959194509250565b60006020828403121561135a578081fd5b81518015158114610ee7578182fd5b60006020828403121561137a578081fd5b5035919050565b60008060408385031215611393578182fd5b8235915060208301356113a581611800565b809150509250929050565b6000806000606084860312156113c4578283fd5b505081359360208301359350604090920135919050565b600080604083850312156113ed578182fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff169052565b60609290921b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168252601482015260340190565b918252602082015260400190565b60008251815b81811015611479576020818601810151858301520161145f565b818111156114875782828501525b509190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015611544578351151583529284019291840191600101611526565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156115445783518352928401929184019160010161156c565b602080825282518282018190526000919060409081850190868401855b828110156116125781518051600481106115bb57fe5b8552808701516115cd888701826113fc565b5085810151868601526060808201516115e8828801826113fc565b5050608090810151906115fd868201836113fc565b505060a09390930192908501906001016115a5565b5091979650505050505050565b901515815260200190565b90815260200190565b60006020825282602083015282846040840137818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b60208082526016908201527f496e636f7272656374206d65726b6c652070726f6f6600000000000000000000604082015260600190565b6020808252602a908201527f7765656b73206d7573742062652073706563696669656420696e20617363656e60408201527f64696e67206f7264657200000000000000000000000000000000000000000000606082015260800190565b60208082526012908201527f63616e6e6f7420636c61696d2074776963650000000000000000000000000000604082015260600190565b6020808252601a908201527f63616e6e6f742072657772697465206d65726b6c6520726f6f74000000000000604082015260600190565b6020808252601b908201527f75736572206d75737420636c61696d206f776e2062616c616e63650000000000604082015260600190565b60405181810167ffffffffffffffff811182821017156117d857600080fd5b604052919050565b600067ffffffffffffffff8211156117f6578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff8116811461182257600080fd5b5056fea26469706673582212208668e1bf6e594458f99e672243c598a480ecd584e43722db8d01e632a75aa5b164736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100f55760003560e01c8063715018a611610097578063eb0d07f511610066578063eb0d07f514610201578063f2fde38b14610214578063f7c618c114610227578063fbfa77cf1461022f576100f5565b8063715018a6146101b15780638da5cb5b146101b9578063c804c39a146101ce578063dd8c9c9d146101e1576100f5565b80633d421653116100d35780633d4216531461015857806347fb23c11461016b5780634cd488ab1461018b57806358b4e4b41461019e576100f5565b8063120aa877146100fa5780632f1868e41461012357806339436b0014610138575b600080fd5b61010d610108366004611381565b610237565b60405161011a919061161f565b60405180910390f35b6101366101313660046111fd565b610257565b005b61014b6101463660046113db565b61033b565b60405161011a9190611550565b6101366101663660046111af565b6103f0565b61017e6101793660046112b4565b610442565b60405161011a919061150a565b6101366101993660046113b0565b610524565b6101366101ac3660046112e8565b610641565b610136610756565b6101c16107d1565b60405161011a9190611492565b6101366101dc3660046111af565b6107ed565b6101f46101ef366004611369565b61083a565b60405161011a919061162a565b61010d61020f3660046112e8565b61084c565b610136610222366004611193565b6108a2565b6101c161095f565b6101c1610983565b600260209081526000928352604080842090915290825290205460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff8616146102955760405162461bcd60e51b815260040161028c90611782565b60405180910390fd5b60006102a186836109a7565b90506102ad8582610adb565b6040517f55c524c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616906355c524c1906103019087908790600401611633565b600060405180830381600087803b15801561031b57600080fd5b505af115801561032f573d6000803e3d6000fd5b50505050505050505050565b60608183111561035d5760405162461bcd60e51b815260040161028c906116b7565b82820360010160608167ffffffffffffffff8111801561037c57600080fd5b506040519080825280602002602001820160405280156103a6578160200160208202803683370190505b50905060005b828110156103e75785810160009081526001602052604090205482518390839081106103d457fe5b60209081029190910101526001016103ac565b50949350505050565b3373ffffffffffffffffffffffffffffffffffffffff8316146104255760405162461bcd60e51b815260040161028c90611782565b600061043183836109a7565b905061043d8382610adb565b505050565b6060818311156104645760405162461bcd60e51b815260040161028c906116b7565b82820360010160608167ffffffffffffffff8111801561048357600080fd5b506040519080825280602002602001820160405280156104ad578160200160208202803683370190505b50905060005b8281101561051a57858101600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b168452909152902054825160ff9091169083908390811061050257fe5b911515602092830291909101909101526001016104b3565b5095945050505050565b61054f336105306107d1565b73ffffffffffffffffffffffffffffffffffffffff16146101aa610cbb565b6000838152600160205260409020541561057b5760405162461bcd60e51b815260040161028c9061174b565b60008381526001602052604090208290556105ce73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084610cc9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167fac24935fd910bc682b5ccb1a07b718cadf8cf2f6d1404c4f3ddc3662dae40e2982604051610634919061162a565b60405180910390a2505050565b3373ffffffffffffffffffffffffffffffffffffffff8516146106765760405162461bcd60e51b815260040161028c90611782565b600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8816845290915290205460ff16156106c65760405162461bcd60e51b815260040161028c90611714565b6106d28484848461084c565b6106ee5760405162461bcd60e51b815260040161028c90611680565b600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff88168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556107508483610d6c565b50505050565b610762336105306107d1565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b3373ffffffffffffffffffffffffffffffffffffffff8316146108225760405162461bcd60e51b815260040161028c90611782565b600061082e83836109a7565b905061043d8382610d6c565b60016020526000908152604090205481565b6000808584604051602001610862929190611416565b60405160208183030381529060405280519060200120905061089883600160008881526020019081526020016000205483610e38565b9695505050505050565b6108ae336105306107d1565b6108d273ffffffffffffffffffffffffffffffffffffffff821615156101ab610cbb565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006109b161100d565b60005b8351811015610ad3578381815181106109c957fe5b6020908102919091018101518051600090815260028352604080822073ffffffffffffffffffffffffffffffffffffffff8a168352909352919091205490925060ff1615610a295760405162461bcd60e51b815260040161028c90611714565b610a418583600001518460200151856040015161084c565b610a5d5760405162461bcd60e51b815260040161028c90611680565b6020820151610a6d908490610ed5565b8251600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155909350016109b4565b505092915050565b8015610cb757604080516001808252818301909252606091816020015b610b0061102e565b815260200190600190039081610af85750506040805160a081018252600080825273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660208401529282018690523060608301529186166080820152825192935091839190610b8157fe5b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e84604051610c09919061162a565b60405180910390a36040517f0e8e3e8400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690630e8e3e8490610c83908490600401611588565b600060405180830381600087803b158015610c9d57600080fd5b505af1158015610cb1573d6000803e3d6000fd5b50505050505b5050565b81610cb757610cb781610eee565b610750846323b872dd60e01b858585604051602401610cea939291906114b3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610f41565b8015610cb7577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e83604051610def919061162a565b60405180910390a3610cb773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168383610fee565b600081815b8551811015610eca576000868281518110610e5457fe5b60200260200101519050808311610e95578281604051602001610e7892919061144b565b604051602081830303815290604052805190602001209250610ec1565b8083604051602001610ea892919061144b565b6040516020818303038152906040528051906020012092505b50600101610e3d565b509092149392505050565b6000828201610ee78482101583610cbb565b9392505050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051610f6a9190611459565b6000604051808303816000865af19150503d8060008114610fa7576040519150601f19603f3d011682016040523d82523d6000602084013e610fac565b606091505b50915091506000821415610fc4573d6000803e3d6000fd5b610750815160001480610fe6575081806020019051810190610fe69190611349565b6101a2610cbb565b61043d8363a9059cbb60e01b8484604051602401610cea9291906114e4565b60405180606001604052806000815260200160008152602001606081525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b600082601f83011261106e578081fd5b813561108161107c826117e0565b6117b9565b8181529150602080830190848101818402860182018710156110a257600080fd5b60005b848110156110c1578135845292820192908201906001016110a5565b505050505092915050565b600082601f8301126110dc578081fd5b81356110ea61107c826117e0565b818152915060208083019084810160005b848110156110c157813587016060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561113a57600080fd5b611143816117b9565b82860135815260408084013582880152918301359167ffffffffffffffff83111561116d57600080fd5b61117b8c888587010161105e565b908201528652505092820192908201906001016110fb565b6000602082840312156111a4578081fd5b8135610ee781611800565b600080604083850312156111c1578081fd5b82356111cc81611800565b9150602083013567ffffffffffffffff8111156111e7578182fd5b6111f3858286016110cc565b9150509250929050565b600080600080600060808688031215611214578081fd5b853561121f81611800565b9450602086013561122f81611800565b9350604086013567ffffffffffffffff8082111561124b578283fd5b818801915088601f83011261125e578283fd5b81358181111561126c578384fd5b89602082850101111561127d578384fd5b60208301955080945050606088013591508082111561129a578283fd5b506112a7888289016110cc565b9150509295509295909350565b6000806000606084860312156112c8578283fd5b83356112d381611800565b95602085013595506040909401359392505050565b600080600080608085870312156112fd578384fd5b843561130881611800565b93506020850135925060408501359150606085013567ffffffffffffffff811115611331578182fd5b61133d8782880161105e565b91505092959194509250565b60006020828403121561135a578081fd5b81518015158114610ee7578182fd5b60006020828403121561137a578081fd5b5035919050565b60008060408385031215611393578182fd5b8235915060208301356113a581611800565b809150509250929050565b6000806000606084860312156113c4578283fd5b505081359360208301359350604090920135919050565b600080604083850312156113ed578182fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff169052565b60609290921b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168252601482015260340190565b918252602082015260400190565b60008251815b81811015611479576020818601810151858301520161145f565b818111156114875782828501525b509190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015611544578351151583529284019291840191600101611526565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156115445783518352928401929184019160010161156c565b602080825282518282018190526000919060409081850190868401855b828110156116125781518051600481106115bb57fe5b8552808701516115cd888701826113fc565b5085810151868601526060808201516115e8828801826113fc565b5050608090810151906115fd868201836113fc565b505060a09390930192908501906001016115a5565b5091979650505050505050565b901515815260200190565b90815260200190565b60006020825282602083015282846040840137818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b60208082526016908201527f496e636f7272656374206d65726b6c652070726f6f6600000000000000000000604082015260600190565b6020808252602a908201527f7765656b73206d7573742062652073706563696669656420696e20617363656e60408201527f64696e67206f7264657200000000000000000000000000000000000000000000606082015260800190565b60208082526012908201527f63616e6e6f7420636c61696d2074776963650000000000000000000000000000604082015260600190565b6020808252601a908201527f63616e6e6f742072657772697465206d65726b6c6520726f6f74000000000000604082015260600190565b6020808252601b908201527f75736572206d75737420636c61696d206f776e2062616c616e63650000000000604082015260600190565b60405181810167ffffffffffffffff811182821017156117d857600080fd5b604052919050565b600067ffffffffffffffff8211156117f6578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff8116811461182257600080fd5b5056fea26469706673582212208668e1bf6e594458f99e672243c598a480ecd584e43722db8d01e632a75aa5b164736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210811-ldo-merkle/index.ts b/balpy/balancer-deployments/tasks/deprecated/20210811-ldo-merkle/index.ts new file mode 100644 index 0000000..47a01a7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210811-ldo-merkle/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { MerkleRedeemDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as MerkleRedeemDeployment; + + const args = [input.Vault, input.ldoToken]; + await task.deployAndVerify('MerkleRedeem', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20210811-ldo-merkle/input.ts b/balpy/balancer-deployments/tasks/deprecated/20210811-ldo-merkle/input.ts new file mode 100644 index 0000000..bf7a19a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210811-ldo-merkle/input.ts @@ -0,0 +1,15 @@ +import { Task, TaskMode } from '@src'; + +export type MerkleRedeemDeployment = { + Vault: string; + ldoToken: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + mainnet: { + Vault, + ldoToken: '0x5A98FcBEA516Cf06857215779Fd812CA3beF1B32', + }, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20210811-ldo-merkle/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20210811-ldo-merkle/output/mainnet.json new file mode 100644 index 0000000..a60dbf2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210811-ldo-merkle/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "MerkleRedeem": "0x884226c9f7b7205f607922E0431419276a64CF8f" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210811-ldo-merkle/readme.md b/balpy/balancer-deployments/tasks/deprecated/20210811-ldo-merkle/readme.md new file mode 100644 index 0000000..7073116 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210811-ldo-merkle/readme.md @@ -0,0 +1,12 @@ +# 2021-08-11 - Merkle Redeem for LDO rewards + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This distributor has been deprecated in favor of the veBAL system. + +Distributor contract for LDO rewards. + +## Useful Files + +- [Ethereum mainnet address](./output/mainnet.json) +- [`MerkleRedeem` artifact](./artifact/MerkleRedeem.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20210811-ldo-merkle/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20210811-ldo-merkle/test/task.fork.ts new file mode 100644 index 0000000..663b118 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210811-ldo-merkle/test/task.fork.ts @@ -0,0 +1,69 @@ +import hre, { ethers } from 'hardhat'; +import { Contract, BigNumber } from 'ethers'; + +import { bn, fp } from '@helpers/numbers'; +import { expectEqualWithError } from '@helpers/relativeError'; +import { MerkleTree } from '@helpers/merkleTree'; + +import { MAX_UINT256 } from '@helpers/constants'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; + +import { describeForkTest, getSigner, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; + +function encodeElement(address: string, balance: BigNumber): string { + return ethers.utils.solidityKeccak256(['address', 'uint'], [address, balance]); +} + +describeForkTest('MerkleRedeem', 'mainnet', 14850000, function () { + let lp: SignerWithAddress, other: SignerWithAddress, whale: SignerWithAddress; + let distributor: Contract, token: Contract; + + let task: Task; + + const LDO_TOKEN_ADDRESS = '0x5a98fcbea516cf06857215779fd812ca3bef1b32'; // LDO + const LDO_WHALE_ADDRESS = '0x3e40d73eb977dc6a537af587d48316fee66e9c8c'; + + before('run task', async () => { + task = new Task('20210811-ldo-merkle', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + distributor = await task.instanceAt('MerkleRedeem', task.output().MerkleRedeem); + }); + + before('load signers and transfer ownership', async () => { + lp = await getSigner(2); + other = await getSigner(3); + whale = await impersonate(LDO_WHALE_ADDRESS); + token = await task.instanceAt('IERC20', LDO_TOKEN_ADDRESS); + + await distributor.transferOwnership(whale.address); + await token.connect(whale).approve(distributor.address, MAX_UINT256); + }); + + describe('with an allocation defined', async () => { + let root: string; + let proof: string[]; + + before(() => { + const elements: string[] = [encodeElement(lp.address, fp(66)), encodeElement(other.address, fp(34))]; + + const merkleTree = new MerkleTree(elements); + root = merkleTree.getHexRoot(); + + proof = merkleTree.getHexProof(elements[0]); + }); + + it('can seed an allocation', async () => { + await distributor.connect(whale).seedAllocations(bn(0), root, fp(100)); + + const expectedReward = fp(100); + expectEqualWithError(await token.balanceOf(distributor.address), expectedReward, fp(1)); + }); + + it('can claim a reward', async () => { + await distributor.connect(whale).seedAllocations(bn(1), root, fp(100)); + + await distributor.connect(lp).claimWeek(lp.address, bn(1), fp(66), proof); + expectEqualWithError(await token.balanceOf(lp.address), fp(66), fp(1)); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20210812-lido-relayer/artifact/LidoRelayer.json b/balpy/balancer-deployments/tasks/deprecated/20210812-lido-relayer/artifact/LidoRelayer.json new file mode 100644 index 0000000..27095a9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210812-lido-relayer/artifact/LidoRelayer.json @@ -0,0 +1,351 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "LidoRelayer", + "sourceName": "contracts/LidoRelayer.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IwstETH", + "name": "wstETH", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "assetInIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "assetOutIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IVault.BatchSwapStep[]", + "name": "swaps", + "type": "tuple[]" + }, + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + }, + { + "internalType": "int256[]", + "name": "limits", + "type": "int256[]" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "batchSwap", + "outputs": [ + { + "internalType": "int256[]", + "name": "swapAmounts", + "type": "int256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "minAmountsOut", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.ExitPoolRequest", + "name": "request", + "type": "tuple" + } + ], + "name": "exitPool", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getStETH", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWstETH", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "maxAmountsIn", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.JoinPoolRequest", + "name": "request", + "type": "tuple" + } + ], + "name": "joinPool", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IAsset", + "name": "assetIn", + "type": "address" + }, + { + "internalType": "contract IAsset", + "name": "assetOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IVault.SingleSwap", + "name": "singleSwap", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "limit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "swap", + "outputs": [ + { + "internalType": "uint256", + "name": "swapAmount", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x60e06040523480156200001157600080fd5b506040516200243938038062002439833981016040819052620000349162000119565b81806001600160a01b03166080816001600160a01b031660601b81525050506001600081905550806001600160a01b031663c1fe3e486040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200009757600080fd5b505af1158015620000ac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d29190620000f3565b6001600160601b0319606091821b811660a05291901b1660c0525062000170565b60006020828403121562000105578081fd5b8151620001128162000157565b9392505050565b600080604083850312156200012c578081fd5b8251620001398162000157565b60208401519092506200014c8162000157565b809150509250929050565b6001600160a01b03811681146200016d57600080fd5b50565b60805160601c60a05160601c60c05160601c61222662000213600039806101d8528061026f528061034852806103ef52806104e752806105ca52806106ee528061078a5280610834528061093352806109fc5280610b155280610bf45280610ce25280610deb5280610ebb5280610f965280610feb5280611216525080610b815280610f4b5280610f7552806112d0525080608752806107cc52506122266000f3fe6080604052600436106100745760003560e01c8063945bcec91161004e578063945bcec914610122578063a2f0398314610142578063b95cac2814610157578063dd5323ed1461016a576100b2565b806352bbbe29146100b75780638bdb3913146100e05780638d928af814610100576100b2565b366100b2576100b0336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461020661017f565b005b600080fd5b6100ca6100c536600461195e565b610191565b6040516100d79190612065565b60405180910390f35b3480156100ec57600080fd5b506100b06100fb3660046117fd565b610567565b34801561010c57600080fd5b506101156107ca565b6040516100d79190611bf6565b610135610130366004611898565b6107ee565b6040516100d79190611c3d565b34801561014e57600080fd5b50610115610b7f565b6100b0610165366004611867565b610ba3565b34801561017657600080fd5b50610115610de9565b8161018d5761018d81610e0d565b5050565b600061019b610e60565b83516001600160a01b031633146101cd5760405162461bcd60e51b81526004016101c490611f2f565b60405180910390fd5b6000846040015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686604001516001600160a01b031614156103ed573085526020850151156102395760405162461bcd60e51b81526004016101c490611ed2565b6000808760200151600181111561024c57fe5b14610257578461025d565b86608001515b90506102693382610e79565b5061029c7f00000000000000000000000000000000000000000000000000000000000000006102966107ca565b8361107c565b6102a46107ca565b6001600160a01b03166352bbbe2934898989896040518663ffffffff1660e01b81526004016102d69493929190611f9d565b6020604051808303818588803b1580156102ef57600080fd5b505af1158015610303573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906103289190611a37565b925060018760200151600181111561033c57fe5b14156103e7576103e7337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016103929190611bf6565b60206040518083038186803b1580156103aa57600080fd5b505afa1580156103be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103e29190611a37565b6111d9565b5061054e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686606001516001600160a01b03161415610536573060408601526060850151156104535760405162461bcd60e51b81526004016101c490611f66565b61045b6107ca565b6001600160a01b03166352bbbe2934888888886040518663ffffffff1660e01b815260040161048d9493929190611f9d565b6020604051808303818588803b1580156104a657600080fd5b505af11580156104ba573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906104df9190611a37565b9150610531817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016103929190611bf6565b61054e565b60405162461bcd60e51b81526004016101c490611e9b565b610556611307565b5061055f61131b565b949350505050565b61056f610e60565b6001600160a01b03831633146105975760405162461bcd60e51b81526004016101c490611f2f565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906105ff908690600401611bf6565b60206040518083038186803b15801561061757600080fd5b505afa15801561062b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064f9190611a37565b90506106596107ca565b6001600160a01b0316638bdb3913868686866040518563ffffffff1660e01b815260040161068a9493929190611d18565b600060405180830381600087803b1580156106a457600080fd5b505af11580156106b8573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691506370a0823190610724908790600401611bf6565b60206040518083038186803b15801561073c57600080fd5b505afa158015610750573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107749190611a37565b905060006107828284611322565b90506107af857f000000000000000000000000000000000000000000000000000000000000000083611337565b6107b985826111d9565b5050506107c461131b565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60606107f8610e60565b84516001600160a01b031633146108215760405162461bcd60e51b81526004016101c490611f2f565b60408501516000805b888110156108dd577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a8a8381811061086857fe5b905060200201602081019061087d919061187c565b6001600160a01b03161415610894578091506108dd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff890181106108d55760405162461bcd60e51b81526004016101c490611e9b565b60010161082a565b5060008686838181106108ec57fe5b9050602002013590506000811315610a4b573088526020880151156109235760405162461bcd60e51b81526004016101c490611ed2565b61092d3382610e79565b5061095a7f00000000000000000000000000000000000000000000000000000000000000006102966107ca565b6109626107ca565b6001600160a01b031663945bcec9348f8f8f8f8f8f8f8f8f6040518b63ffffffff1660e01b815260040161099e99989796959493929190611d54565b6000604051808303818588803b1580156109b757600080fd5b505af11580156109cb573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526109f4919081019061173e565b9350610a46337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016103929190611bf6565b610b5f565b306040890152606088015115610a735760405162461bcd60e51b81526004016101c490611f66565b610a7b6107ca565b6001600160a01b031663945bcec9348f8f8f8f8f8f8f8f8f6040518b63ffffffff1660e01b8152600401610ab799989796959493929190611d54565b6000604051808303818588803b158015610ad057600080fd5b505af1158015610ae4573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052610b0d919081019061173e565b9350610b5f837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016103929190611bf6565b610b67611307565b505050610b7261131b565b9998505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b610bab610e60565b6001600160a01b0383163314610bd35760405162461bcd60e51b81526004016101c490611f2f565b6000805b610be1838061206e565b9050811015610ca6576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016610c1e848061206e565b83818110610c2857fe5b9050602002016020810190610c3d919061187c565b6001600160a01b03161415610c7157610c59602084018461206e565b82818110610c6357fe5b905060200201359150610ca6565b6001610c7d848061206e565b9050038110610c9e5760405162461bcd60e51b81526004016101c490611e9b565b600101610bd7565b50610cb18482610e79565b506040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90610d199087908590600401611c24565b602060405180830381600087803b158015610d3357600080fd5b505af1158015610d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6b91906117e1565b50610d746107ca565b6001600160a01b031663b95cac2834878787876040518663ffffffff1660e01b8152600401610da69493929190611d18565b6000604051808303818588803b158015610dbf57600080fd5b505af1158015610dd3573d6000803e3d6000fd5b5050505050610de0611307565b506107c461131b565b7f000000000000000000000000000000000000000000000000000000000000000090565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b610e726002600054141561019061017f565b6002600055565b600081610e8857506000611076565b6040517fbb2952fc0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063bb2952fc90610ef0908690600401612065565b60206040518083038186803b158015610f0857600080fd5b505afa158015610f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f409190611a37565b6001019050610f70847f000000000000000000000000000000000000000000000000000000000000000083611337565b610fbb7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008361107c565b6040517fea598cb00000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ea598cb090611020908490600401612065565b602060405180830381600087803b15801561103a57600080fd5b505af115801561104e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110729190611a37565b9150505b92915050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815281906001600160a01b0385169063dd62ed3e906110c59030908790600401611c0a565b60206040518083038186803b1580156110dd57600080fd5b505afa1580156110f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111159190611a37565b10156111d4576040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063095ea7b3906111829085907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90600401611c24565b602060405180830381600087803b15801561119c57600080fd5b505af11580156111b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c491906117e1565b505050565b806111e35761018d565b6040517fde0e9a3e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063de0e9a3e9061124b908590600401612065565b602060405180830381600087803b15801561126557600080fd5b505af1158015611279573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129d9190611a37565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906111829086908590600401611c24565b4780156113185761131833826113da565b50565b6001600055565b600061133083836001611454565b9392505050565b80611341576111d4565b60408051600180825281830190925260609160208083019080368337019050509050828160008151811061137157fe5b6001600160a01b03929092166020928302919091019091015260408051600180825281830190925260609181602001602082028036833701905050905082816000815181106113bc57fe5b6020026020010181815250506113d385838361146a565b5050505050565b6113e9814710156101a361017f565b6000826001600160a01b03168260405161140290611bf3565b60006040518083038185875af1925050503d806000811461143f576040519150601f19603f3d011682016040523d82523d6000602084013e611444565b606091505b505090506111d4816101a461017f565b6000611463848411158361017f565b5050900390565b6060825167ffffffffffffffff8111801561148457600080fd5b506040519080825280602002602001820160405280156114be57816020015b6114ab6115c2565b8152602001906001900390816114a35790505b50905060005b8351811015611556576040805160a0810190915280600381526020018583815181106114ec57fe5b60200260200101516001600160a01b0316815260200184838151811061150e57fe5b60200260200101518152602001866001600160a01b03168152602001306001600160a01b031681525082828151811061154357fe5b60209081029190910101526001016114c4565b5061155f6107ca565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b815260040161158a9190611c81565b600060405180830381600087803b1580156115a457600080fd5b505af11580156115b8573d6000803e3d6000fd5b5050505050505050565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b60008083601f840112611603578182fd5b50813567ffffffffffffffff81111561161a578182fd5b602083019150836020808302850101111561163457600080fd5b9250929050565b600082601f83011261164b578081fd5b813567ffffffffffffffff811115611661578182fd5b6116746020601f19601f840116016120d3565b915080825283602082850101111561168b57600080fd5b8060208401602084013760009082016020015292915050565b8035611076816121cd565b80356002811061107657600080fd5b6000608082840312156116cf578081fd5b50919050565b6000608082840312156116e6578081fd5b6116f060806120d3565b905081356116fd816121cd565b8152602082013561170d816121e2565b60208201526040820135611720816121cd565b60408201526060820135611733816121e2565b606082015292915050565b60006020808385031215611750578182fd5b825167ffffffffffffffff80821115611767578384fd5b818501915085601f83011261177a578384fd5b815181811115611788578485fd5b83810291506117988483016120d3565b8181528481019084860184860187018a10156117b2578788fd5b8795505b838610156117d45780518352600195909501949186019186016117b6565b5098975050505050505050565b6000602082840312156117f2578081fd5b8151611330816121e2565b60008060008060808587031215611812578283fd5b843593506020850135611824816121cd565b92506040850135611834816121cd565b9150606085013567ffffffffffffffff81111561184f578182fd5b61185b878288016116be565b91505092959194509250565b60008060008060808587031215611812578384fd5b60006020828403121561188d578081fd5b8135611330816121cd565b60008060008060008060008060006101208a8c0312156118b6578687fd5b6118c08b8b6116af565b985060208a013567ffffffffffffffff808211156118dc578889fd5b6118e88d838e016115f2565b909a50985060408c0135915080821115611900578687fd5b61190c8d838e016115f2565b90985096508691506119218d60608e016116d5565b955060e08c0135915080821115611936578485fd5b506119438c828d016115f2565b9a9d999c50979a969995989497966101000135949350505050565b60008060008060e08587031215611973578182fd5b843567ffffffffffffffff8082111561198a578384fd5b9086019060c0828903121561199d578384fd5b6119a760c06120d3565b823581526119b889602085016116af565b602082015260408301356119cb816121cd565b60408201526119dd89606085016116a4565b60608201526080830135608082015260a0830135828111156119fd578586fd5b611a098a82860161163b565b60a083015250809650505050611a2286602087016116d5565b939693955050505060a08201359160c0013590565b600060208284031215611a48578081fd5b5051919050565b6001600160a01b03169052565b60008284526020808501945082825b85811015611a99578135611a7e816121cd565b6001600160a01b031687529582019590820190600101611a6b565b509495945050505050565b60008284526020808501945082825b85811015611a9957813587529582019590820190600101611ab3565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b6000611b0582836120fa565b60808552611b17608086018284611a5c565b9150506020611b28818501856120fa565b868403838801528084527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611b5e578485fd5b820280828585013780840193505050808201838152611b806040860186612160565b83888603016040890152611b95838284611acf565b9450505050506060830135611ba9816121e2565b8015156060860152508091505092915050565b6001600160a01b03808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015611c7557835183529284019291840191600101611c59565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015611d0b578151805160048110611cb457fe5b855280870151611cc688870182611a4f565b508581015186860152606080820151611ce182880182611a4f565b505060809081015190611cf686820183611a4f565b505060a0939093019290850190600101611c9e565b5091979650505050505050565b60008582526001600160a01b03808616602084015280851660408401525060806060830152611d4a6080830184611af9565b9695505050505050565b60006101208201611d648c6121c3565b8b83526101206020840152808a82526101408401905061014060208c0285010191508b835b8c811015611e4b577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec086850301835281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618f3603018112611de9578586fd5b8e8101905080358552602081013560208601526040810135604086015260608101356060860152611e1d6080820182612160565b915060a06080870152611e3460a087018383611acf565b955050506020928301929190910190600101611d89565b5050508281036040840152611e6181898b611a5c565b9050611e706060840188611bbc565b82810360e0840152611e83818688611aa4565b915050826101008301529a9950505050505050505050565b60208082526017908201527f446f6573206e6f74207265717569726520777374455448000000000000000000604082015260600190565b60208082526021908201527f43616e6e6f742073656e642066726f6d20696e7465726e616c2062616c616e6360408201527f6500000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252600e908201527f496e76616c69642073656e646572000000000000000000000000000000000000604082015260600190565b6020808252601f908201527f43616e6e6f742073656e6420746f20696e7465726e616c2062616c616e636500604082015260600190565b600060e08252855160e0830152602080870151611fb9816121c3565b61010084015260408701516001600160a01b03908116610120850152606088015116610140840152608087015161016084015260a087015160c061018085015280516101a08501819052835b81811015612022578281018401518682016101c001528301612005565b8181111561203457846101c083880101525b50601f01601f191684016101c0019250612052905081840187611bbc565b5060a082019390935260c0015292915050565b90815260200190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126120a2578283fd5b83018035915067ffffffffffffffff8211156120bc578283fd5b602090810192508102360382131561163457600080fd5b60405181810167ffffffffffffffff811182821017156120f257600080fd5b604052919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261212e578283fd5b830160208101925035905067ffffffffffffffff81111561214e57600080fd5b60208102360383131561163457600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612194578283fd5b830160208101925035905067ffffffffffffffff8111156121b457600080fd5b80360383131561163457600080fd5b6002811061131857fe5b6001600160a01b038116811461131857600080fd5b801515811461131857600080fdfea2646970667358221220a11b3d352190aa0ca425c9fcafc613efc9b7c6740baaaf9b3eb4ae2dbce47cea64736f6c63430007010033", + "deployedBytecode": "0x6080604052600436106100745760003560e01c8063945bcec91161004e578063945bcec914610122578063a2f0398314610142578063b95cac2814610157578063dd5323ed1461016a576100b2565b806352bbbe29146100b75780638bdb3913146100e05780638d928af814610100576100b2565b366100b2576100b0336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461020661017f565b005b600080fd5b6100ca6100c536600461195e565b610191565b6040516100d79190612065565b60405180910390f35b3480156100ec57600080fd5b506100b06100fb3660046117fd565b610567565b34801561010c57600080fd5b506101156107ca565b6040516100d79190611bf6565b610135610130366004611898565b6107ee565b6040516100d79190611c3d565b34801561014e57600080fd5b50610115610b7f565b6100b0610165366004611867565b610ba3565b34801561017657600080fd5b50610115610de9565b8161018d5761018d81610e0d565b5050565b600061019b610e60565b83516001600160a01b031633146101cd5760405162461bcd60e51b81526004016101c490611f2f565b60405180910390fd5b6000846040015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686604001516001600160a01b031614156103ed573085526020850151156102395760405162461bcd60e51b81526004016101c490611ed2565b6000808760200151600181111561024c57fe5b14610257578461025d565b86608001515b90506102693382610e79565b5061029c7f00000000000000000000000000000000000000000000000000000000000000006102966107ca565b8361107c565b6102a46107ca565b6001600160a01b03166352bbbe2934898989896040518663ffffffff1660e01b81526004016102d69493929190611f9d565b6020604051808303818588803b1580156102ef57600080fd5b505af1158015610303573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906103289190611a37565b925060018760200151600181111561033c57fe5b14156103e7576103e7337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016103929190611bf6565b60206040518083038186803b1580156103aa57600080fd5b505afa1580156103be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103e29190611a37565b6111d9565b5061054e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686606001516001600160a01b03161415610536573060408601526060850151156104535760405162461bcd60e51b81526004016101c490611f66565b61045b6107ca565b6001600160a01b03166352bbbe2934888888886040518663ffffffff1660e01b815260040161048d9493929190611f9d565b6020604051808303818588803b1580156104a657600080fd5b505af11580156104ba573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906104df9190611a37565b9150610531817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016103929190611bf6565b61054e565b60405162461bcd60e51b81526004016101c490611e9b565b610556611307565b5061055f61131b565b949350505050565b61056f610e60565b6001600160a01b03831633146105975760405162461bcd60e51b81526004016101c490611f2f565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906105ff908690600401611bf6565b60206040518083038186803b15801561061757600080fd5b505afa15801561062b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064f9190611a37565b90506106596107ca565b6001600160a01b0316638bdb3913868686866040518563ffffffff1660e01b815260040161068a9493929190611d18565b600060405180830381600087803b1580156106a457600080fd5b505af11580156106b8573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691506370a0823190610724908790600401611bf6565b60206040518083038186803b15801561073c57600080fd5b505afa158015610750573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107749190611a37565b905060006107828284611322565b90506107af857f000000000000000000000000000000000000000000000000000000000000000083611337565b6107b985826111d9565b5050506107c461131b565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60606107f8610e60565b84516001600160a01b031633146108215760405162461bcd60e51b81526004016101c490611f2f565b60408501516000805b888110156108dd577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a8a8381811061086857fe5b905060200201602081019061087d919061187c565b6001600160a01b03161415610894578091506108dd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff890181106108d55760405162461bcd60e51b81526004016101c490611e9b565b60010161082a565b5060008686838181106108ec57fe5b9050602002013590506000811315610a4b573088526020880151156109235760405162461bcd60e51b81526004016101c490611ed2565b61092d3382610e79565b5061095a7f00000000000000000000000000000000000000000000000000000000000000006102966107ca565b6109626107ca565b6001600160a01b031663945bcec9348f8f8f8f8f8f8f8f8f6040518b63ffffffff1660e01b815260040161099e99989796959493929190611d54565b6000604051808303818588803b1580156109b757600080fd5b505af11580156109cb573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526109f4919081019061173e565b9350610a46337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016103929190611bf6565b610b5f565b306040890152606088015115610a735760405162461bcd60e51b81526004016101c490611f66565b610a7b6107ca565b6001600160a01b031663945bcec9348f8f8f8f8f8f8f8f8f6040518b63ffffffff1660e01b8152600401610ab799989796959493929190611d54565b6000604051808303818588803b158015610ad057600080fd5b505af1158015610ae4573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052610b0d919081019061173e565b9350610b5f837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016103929190611bf6565b610b67611307565b505050610b7261131b565b9998505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b610bab610e60565b6001600160a01b0383163314610bd35760405162461bcd60e51b81526004016101c490611f2f565b6000805b610be1838061206e565b9050811015610ca6576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016610c1e848061206e565b83818110610c2857fe5b9050602002016020810190610c3d919061187c565b6001600160a01b03161415610c7157610c59602084018461206e565b82818110610c6357fe5b905060200201359150610ca6565b6001610c7d848061206e565b9050038110610c9e5760405162461bcd60e51b81526004016101c490611e9b565b600101610bd7565b50610cb18482610e79565b506040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90610d199087908590600401611c24565b602060405180830381600087803b158015610d3357600080fd5b505af1158015610d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6b91906117e1565b50610d746107ca565b6001600160a01b031663b95cac2834878787876040518663ffffffff1660e01b8152600401610da69493929190611d18565b6000604051808303818588803b158015610dbf57600080fd5b505af1158015610dd3573d6000803e3d6000fd5b5050505050610de0611307565b506107c461131b565b7f000000000000000000000000000000000000000000000000000000000000000090565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b610e726002600054141561019061017f565b6002600055565b600081610e8857506000611076565b6040517fbb2952fc0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063bb2952fc90610ef0908690600401612065565b60206040518083038186803b158015610f0857600080fd5b505afa158015610f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f409190611a37565b6001019050610f70847f000000000000000000000000000000000000000000000000000000000000000083611337565b610fbb7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008361107c565b6040517fea598cb00000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ea598cb090611020908490600401612065565b602060405180830381600087803b15801561103a57600080fd5b505af115801561104e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110729190611a37565b9150505b92915050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815281906001600160a01b0385169063dd62ed3e906110c59030908790600401611c0a565b60206040518083038186803b1580156110dd57600080fd5b505afa1580156110f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111159190611a37565b10156111d4576040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063095ea7b3906111829085907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90600401611c24565b602060405180830381600087803b15801561119c57600080fd5b505af11580156111b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c491906117e1565b505050565b806111e35761018d565b6040517fde0e9a3e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063de0e9a3e9061124b908590600401612065565b602060405180830381600087803b15801561126557600080fd5b505af1158015611279573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129d9190611a37565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906111829086908590600401611c24565b4780156113185761131833826113da565b50565b6001600055565b600061133083836001611454565b9392505050565b80611341576111d4565b60408051600180825281830190925260609160208083019080368337019050509050828160008151811061137157fe5b6001600160a01b03929092166020928302919091019091015260408051600180825281830190925260609181602001602082028036833701905050905082816000815181106113bc57fe5b6020026020010181815250506113d385838361146a565b5050505050565b6113e9814710156101a361017f565b6000826001600160a01b03168260405161140290611bf3565b60006040518083038185875af1925050503d806000811461143f576040519150601f19603f3d011682016040523d82523d6000602084013e611444565b606091505b505090506111d4816101a461017f565b6000611463848411158361017f565b5050900390565b6060825167ffffffffffffffff8111801561148457600080fd5b506040519080825280602002602001820160405280156114be57816020015b6114ab6115c2565b8152602001906001900390816114a35790505b50905060005b8351811015611556576040805160a0810190915280600381526020018583815181106114ec57fe5b60200260200101516001600160a01b0316815260200184838151811061150e57fe5b60200260200101518152602001866001600160a01b03168152602001306001600160a01b031681525082828151811061154357fe5b60209081029190910101526001016114c4565b5061155f6107ca565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b815260040161158a9190611c81565b600060405180830381600087803b1580156115a457600080fd5b505af11580156115b8573d6000803e3d6000fd5b5050505050505050565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b60008083601f840112611603578182fd5b50813567ffffffffffffffff81111561161a578182fd5b602083019150836020808302850101111561163457600080fd5b9250929050565b600082601f83011261164b578081fd5b813567ffffffffffffffff811115611661578182fd5b6116746020601f19601f840116016120d3565b915080825283602082850101111561168b57600080fd5b8060208401602084013760009082016020015292915050565b8035611076816121cd565b80356002811061107657600080fd5b6000608082840312156116cf578081fd5b50919050565b6000608082840312156116e6578081fd5b6116f060806120d3565b905081356116fd816121cd565b8152602082013561170d816121e2565b60208201526040820135611720816121cd565b60408201526060820135611733816121e2565b606082015292915050565b60006020808385031215611750578182fd5b825167ffffffffffffffff80821115611767578384fd5b818501915085601f83011261177a578384fd5b815181811115611788578485fd5b83810291506117988483016120d3565b8181528481019084860184860187018a10156117b2578788fd5b8795505b838610156117d45780518352600195909501949186019186016117b6565b5098975050505050505050565b6000602082840312156117f2578081fd5b8151611330816121e2565b60008060008060808587031215611812578283fd5b843593506020850135611824816121cd565b92506040850135611834816121cd565b9150606085013567ffffffffffffffff81111561184f578182fd5b61185b878288016116be565b91505092959194509250565b60008060008060808587031215611812578384fd5b60006020828403121561188d578081fd5b8135611330816121cd565b60008060008060008060008060006101208a8c0312156118b6578687fd5b6118c08b8b6116af565b985060208a013567ffffffffffffffff808211156118dc578889fd5b6118e88d838e016115f2565b909a50985060408c0135915080821115611900578687fd5b61190c8d838e016115f2565b90985096508691506119218d60608e016116d5565b955060e08c0135915080821115611936578485fd5b506119438c828d016115f2565b9a9d999c50979a969995989497966101000135949350505050565b60008060008060e08587031215611973578182fd5b843567ffffffffffffffff8082111561198a578384fd5b9086019060c0828903121561199d578384fd5b6119a760c06120d3565b823581526119b889602085016116af565b602082015260408301356119cb816121cd565b60408201526119dd89606085016116a4565b60608201526080830135608082015260a0830135828111156119fd578586fd5b611a098a82860161163b565b60a083015250809650505050611a2286602087016116d5565b939693955050505060a08201359160c0013590565b600060208284031215611a48578081fd5b5051919050565b6001600160a01b03169052565b60008284526020808501945082825b85811015611a99578135611a7e816121cd565b6001600160a01b031687529582019590820190600101611a6b565b509495945050505050565b60008284526020808501945082825b85811015611a9957813587529582019590820190600101611ab3565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b6000611b0582836120fa565b60808552611b17608086018284611a5c565b9150506020611b28818501856120fa565b868403838801528084527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611b5e578485fd5b820280828585013780840193505050808201838152611b806040860186612160565b83888603016040890152611b95838284611acf565b9450505050506060830135611ba9816121e2565b8015156060860152508091505092915050565b6001600160a01b03808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015611c7557835183529284019291840191600101611c59565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015611d0b578151805160048110611cb457fe5b855280870151611cc688870182611a4f565b508581015186860152606080820151611ce182880182611a4f565b505060809081015190611cf686820183611a4f565b505060a0939093019290850190600101611c9e565b5091979650505050505050565b60008582526001600160a01b03808616602084015280851660408401525060806060830152611d4a6080830184611af9565b9695505050505050565b60006101208201611d648c6121c3565b8b83526101206020840152808a82526101408401905061014060208c0285010191508b835b8c811015611e4b577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec086850301835281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618f3603018112611de9578586fd5b8e8101905080358552602081013560208601526040810135604086015260608101356060860152611e1d6080820182612160565b915060a06080870152611e3460a087018383611acf565b955050506020928301929190910190600101611d89565b5050508281036040840152611e6181898b611a5c565b9050611e706060840188611bbc565b82810360e0840152611e83818688611aa4565b915050826101008301529a9950505050505050505050565b60208082526017908201527f446f6573206e6f74207265717569726520777374455448000000000000000000604082015260600190565b60208082526021908201527f43616e6e6f742073656e642066726f6d20696e7465726e616c2062616c616e6360408201527f6500000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252600e908201527f496e76616c69642073656e646572000000000000000000000000000000000000604082015260600190565b6020808252601f908201527f43616e6e6f742073656e6420746f20696e7465726e616c2062616c616e636500604082015260600190565b600060e08252855160e0830152602080870151611fb9816121c3565b61010084015260408701516001600160a01b03908116610120850152606088015116610140840152608087015161016084015260a087015160c061018085015280516101a08501819052835b81811015612022578281018401518682016101c001528301612005565b8181111561203457846101c083880101525b50601f01601f191684016101c0019250612052905081840187611bbc565b5060a082019390935260c0015292915050565b90815260200190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126120a2578283fd5b83018035915067ffffffffffffffff8211156120bc578283fd5b602090810192508102360382131561163457600080fd5b60405181810167ffffffffffffffff811182821017156120f257600080fd5b604052919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261212e578283fd5b830160208101925035905067ffffffffffffffff81111561214e57600080fd5b60208102360383131561163457600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612194578283fd5b830160208101925035905067ffffffffffffffff8111156121b457600080fd5b80360383131561163457600080fd5b6002811061131857fe5b6001600160a01b038116811461131857600080fd5b801515811461131857600080fdfea2646970667358221220a11b3d352190aa0ca425c9fcafc613efc9b7c6740baaaf9b3eb4ae2dbce47cea64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210812-lido-relayer/index.ts b/balpy/balancer-deployments/tasks/deprecated/20210812-lido-relayer/index.ts new file mode 100644 index 0000000..c5313cc --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210812-lido-relayer/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { LidoRelayerDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as LidoRelayerDeployment; + + const relayerArgs = [input.Vault, input.wstETH]; + await task.deployAndVerify('LidoRelayer', relayerArgs, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20210812-lido-relayer/input.ts b/balpy/balancer-deployments/tasks/deprecated/20210812-lido-relayer/input.ts new file mode 100644 index 0000000..6a42eb3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210812-lido-relayer/input.ts @@ -0,0 +1,23 @@ +import { Task, TaskMode } from '@src'; + +export type LidoRelayerDeployment = { + Vault: string; + wstETH: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + mainnet: { + Vault, + wstETH: '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0', + }, + kovan: { + Vault, + wstETH: '0xA387B91e393cFB9356A460370842BC8dBB2F29aF', + }, + goerli: { + Vault, + wstETH: '0x6320cD32aA674d2898A68ec82e869385Fc5f7E2f', + }, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20210812-lido-relayer/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20210812-lido-relayer/output/goerli.json new file mode 100644 index 0000000..30fd3b6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210812-lido-relayer/output/goerli.json @@ -0,0 +1,3 @@ +{ + "LidoRelayer": "0xdc10e8f47B6858E32218E01db224795235872B19" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210812-lido-relayer/output/kovan.json b/balpy/balancer-deployments/tasks/deprecated/20210812-lido-relayer/output/kovan.json new file mode 100644 index 0000000..ec5ff56 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210812-lido-relayer/output/kovan.json @@ -0,0 +1,3 @@ +{ + "LidoRelayer": "0x41B953164995c11C81DA73D212ED8Af25741b7Ac" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210812-lido-relayer/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20210812-lido-relayer/output/mainnet.json new file mode 100644 index 0000000..a66e12a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210812-lido-relayer/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "LidoRelayer": "0xdcdbf71A870cc60C6F9B621E28a7D3Ffd6Dd4965" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210812-lido-relayer/readme.md b/balpy/balancer-deployments/tasks/deprecated/20210812-lido-relayer/readme.md new file mode 100644 index 0000000..0702a1c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210812-lido-relayer/readme.md @@ -0,0 +1,13 @@ +# 2021-08-12 - Lido Relayer + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This relayer was superseded by an [updated version (also now deprecated)](../20211203-batch-relayer) with more features. + +Deployment of the `LidoRelayer`, for using stETH with the Balancer Vault without having to wrap to wstETH separately. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`LidoRelayer` artifact](./artifact/LidoRelayer.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/artifact/InvestmentPool.json b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/artifact/InvestmentPool.json new file mode 100644 index 0000000..e269347 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/artifact/InvestmentPool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"components": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20[]", "name": "tokens", "type": "address[]"}, {"internalType": "uint256[]", "name": "normalizedWeights", "type": "uint256[]"}, {"internalType": "address[]", "name": "assetManagers", "type": "address[]"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "bool", "name": "swapEnabledOnStart", "type": "bool"}, {"internalType": "uint256", "name": "managementSwapFeePercentage", "type": "uint256"}], "internalType": "struct InvestmentPool.NewPoolParams", "name": "params", "type": "tuple"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "startTime", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "endTime", "type": "uint256"}, {"indexed": false, "internalType": "uint256[]", "name": "startWeights", "type": "uint256[]"}, {"indexed": false, "internalType": "uint256[]", "name": "endWeights", "type": "uint256[]"}], "name": "GradualWeightUpdateScheduled", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "managementFeePercentage", "type": "uint256"}], "name": "ManagementFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "contract IERC20[]", "name": "tokens", "type": "address[]"}, {"indexed": false, "internalType": "uint256[]", "name": "amounts", "type": "uint256[]"}], "name": "ManagementFeesCollected", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "swapEnabled", "type": "bool"}], "name": "SwapEnabledSet", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getCollectedManagementFees", "outputs": [{"internalType": "contract IERC20[]", "name": "tokens", "type": "address[]"}, {"internalType": "uint256[]", "name": "collectedFees", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getGradualWeightUpdateParams", "outputs": [{"internalType": "uint256", "name": "startTime", "type": "uint256"}, {"internalType": "uint256", "name": "endTime", "type": "uint256"}, {"internalType": "uint256[]", "name": "endWeights", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getInvariant", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getLastInvariant", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "pure", "type": "function"}, {"inputs": [], "name": "getManagementSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMinimumWeightChangeDuration", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "pure", "type": "function"}, {"inputs": [], "name": "getNormalizedWeights", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getScalingFactors", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapEnabled", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "swapRequest", "type": "tuple"}, {"internalType": "uint256", "name": "currentBalanceTokenIn", "type": "uint256"}, {"internalType": "uint256", "name": "currentBalanceTokenOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "bytes", "name": "poolConfig", "type": "bytes"}], "name": "setAssetManagerPoolConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bool", "name": "paused", "type": "bool"}], "name": "setPaused", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bool", "name": "swapEnabled", "type": "bool"}], "name": "setSwapEnabled", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "startTime", "type": "uint256"}, {"internalType": "uint256", "name": "endTime", "type": "uint256"}, {"internalType": "uint256[]", "name": "endWeights", "type": "uint256[]"}], "name": "updateWeightsGradually", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}], "name": "withdrawCollectedManagementFees", "outputs": [], "stateMutability": "nonpayable", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/artifact/InvestmentPoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/artifact/InvestmentPoolFactory.json new file mode 100644 index 0000000..ff55cda --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/artifact/InvestmentPoolFactory.json @@ -0,0 +1,170 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "InvestmentPoolFactory", + "sourceName": "contracts/smart/InvestmentPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "weights", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "bool", + "name": "swapEnabledOnStart", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "managementSwapFeePercentage", + "type": "uint256" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101406040523480156200001257600080fd5b50604051620078f9380380620078f98339810160408190526200003591620001c3565b80604051806020016200004890620001b5565b601f1982820381018352601f909101166040528051819060006002820460a081905280830360e0819052818552909150836200009081620000f9602090811b6200033617901c565b60601b6001600160601b0319166080528285018051838252620000bf82620000f9602090811b6200033617901c565b6001600160601b0319606091821b811660c0529690935290529590951b90911661010052505050426276a700016101205250620001f39050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001476001600160a01b03831615156101ac6200014d565b50919050565b816200015e576200015e8162000162565b5050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b616aac8062000e4d83390190565b600060208284031215620001d5578081fd5b81516001600160a01b0381168114620001ec578182fd5b9392505050565b60805160601c60a05160c05160601c60e0516101005160601c61012051610bf86200025560003980610173528061019c52508061031452508061039d52508061014a52806104195250806103be52508061012952806103f55250610bf86000f3fe608060405234801561001057600080fd5b50600436106100715760003560e01c806359e5f80e1161005057806359e5f80e146100c05780636634b753146100e05780638d928af81461010057610071565b8062c194db14610076578063174481fa146100945780632da47c40146100aa575b600080fd5b61007e610108565b60405161008b9190610a0d565b60405180910390f35b61009c610127565b60405161008b9291906109db565b6100b261016d565b60405161008b929190610b48565b6100d36100ce3660046107d3565b6101d7565b60405161008b91906109ba565b6100f36100ee3660046107b7565b6102e7565b60405161008b9190610a02565b6100d3610312565b606061012260405180602001604052806000815250610395565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156101c957807f000000000000000000000000000000000000000000000000000000000000000003925062278d0091506101d2565b60009250600091505b509091565b60008060006101e461016d565b915091506102d86040518061018001604052806101ff610312565b73ffffffffffffffffffffffffffffffffffffffff1681526020018d81526020018c81526020018b81526020018a81526020018b5167ffffffffffffffff8111801561024a57600080fd5b50604051908082528060200260200182016040528015610274578160200160208202803683370190505b5081526020018981526020018481526020018381526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018715158152602001868152506040516020016102c49190610a20565b60405160208183030381529060405261046e565b9b9a5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061038f73ffffffffffffffffffffffffffffffffffffffff831615156101ac6104f9565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010161046081838661050b565b505050505050505050919050565b60008061047a83610585565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b8161050757610507816105cd565b5050565b5b602081106105495781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00161050c565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b6000606061059283610395565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff81166105c6573d6000803e3d6000fd5b9392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b803561064581610b9d565b92915050565b600082601f83011261065b578081fd5b813561066e61066982610b7d565b610b56565b81815291506020808301908481018184028601820187101561068f57600080fd5b60005b848110156106b75781356106a581610b9d565b84529282019290820190600101610692565b505050505092915050565b600082601f8301126106d2578081fd5b81356106e061066982610b7d565b81815291506020808301908481018184028601820187101561070157600080fd5b60005b848110156106b757813584529282019290820190600101610704565b8035801515811461064557600080fd5b600082601f830112610740578081fd5b813567ffffffffffffffff811115610756578182fd5b61078760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610b56565b915080825283602082850101111561079e57600080fd5b8060208401602084013760009082016020015292915050565b6000602082840312156107c8578081fd5b81356105c681610b9d565b600080600080600080600080610100898b0312156107ef578384fd5b883567ffffffffffffffff80821115610806578586fd5b6108128c838d01610730565b995060208b0135915080821115610827578586fd5b6108338c838d01610730565b985060408b0135915080821115610848578586fd5b6108548c838d0161064b565b975060608b0135915080821115610869578586fd5b506108768b828c016106c2565b9550506080890135935061088d8a60a08b0161063a565b925061089c8a60c08b01610720565b915060e089013590509295985092959890939650565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208085019450808401835b8381101561091157815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016108df565b509495945050505050565b6000815180845260208085019450808401835b838110156109115781518752958201959082019060010161092f565b15159052565b60008151808452815b818110156109765760208185018101518683018201520161095a565b818111156109875782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b6000602082526105c66020830184610951565b600060208252610a346020830184516108b2565b6020830151610180806040850152610a506101a0850183610951565b915060408501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080868503016060870152610a8c8483610951565b93506060870151915080868503016080870152610aa984836108cc565b935060808701519150808685030160a0870152610ac6848361091c565b935060a08701519150808685030160c087015250610ae483826108cc565b92505060c085015160e085015260e0850151610100818187015280870151915050610120818187015280870151915050610140610b23818701836108b2565b8601519050610160610b378682018361094b565b959095015193019290925250919050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610b7557600080fd5b604052919050565b600067ffffffffffffffff821115610b93578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff81168114610bbf57600080fd5b5056fea26469706673582212201e16e288729b80ed49d09aaef21e25005b6625074954ea725eaa484e7ecd231164736f6c634300070100336101e06040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b5060405162006aac38038062006aac8339810160408190526200005a9162000e67565b805160208201516040830151606084015160a085015160c086015160e0870151610100880151610120890151855189906002146200009a5760016200009d565b60025b8989898989898989828289898180604051806040016040528060018152602001603160f81b815250848489336001600160a01b031660001b806080818152505050806001600160a01b031660a0816001600160a01b031660601b815250505081600390805190602001906200011492919062000baf565b5080516200012a90600490602084019062000baf565b50506005805460ff1916601217905550815160209283012060c052805191012060e05250507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6101005250620001896276a7008311156101946200047b565b6200019d62278d008211156101956200047b565b4290910161014081905201610160528551620001bf906002111560c86200047b565b620001d9620001cd62000490565b8751111560c96200047b565b620001ef866200049560201b6200140c1760201c565b620001fa84620004a1565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f906200022b908d90600401620010ed565b602060405180830381600087803b1580156200024657600080fd5b505af11580156200025b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000281919062000e4e565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002b69084908b908b9060040162001051565b600060405180830381600087803b158015620002d157600080fd5b505af1158015620002e6573d6000803e3d6000fd5b5050505060609a8b1b6001600160601b031916610180526101a05250506001600a5550505050928d01515160808e01515160a08f015151919d50620003479c508d9b50995097505050506200052d602090811b6200141617901c9350505050565b62000377620003718260016200035c6200054d565b6200055360201b6200142e179092919060201c565b62000566565b6200038f81620003866200058b565b1460c96200047b565b608082015160608301514291620003ac91839182918190620005b6565b60005b82811015620003f857620003ee84606001518281518110620003cd57fe5b60200260200101516000600c620007f760201b6200143d179092919060201c565b50600101620003af565b506101408301516200040a90620008a7565b6200042e670de0b6b3a764000084610160015111156101526200047b60201b60201c565b610160830180516101c052516040517feba99e9e36df79031493efd8473cfce5475d3a135878665490df8b0140693210916200046a9162001102565b60405180910390a1505050620011b4565b816200048c576200048c8162000902565b5050565b603290565b806200048c8162000955565b620004b664e8d4a5100082101560cb6200047b565b620004ce67016345785d8a000082111560ca6200047b565b620004ed8160c0600854620009df60201b6200150a179092919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906200052290839062001102565b60405180910390a150565b6200054882841480156200054057508183145b60676200047b565b505050565b60085490565b81811b607f821b198416175b9392505050565b62000585816000600854620009f460201b62001520179092919060201c565b60085550565b6000620005b160016200059d6200054d565b62000a0f60201b6200154c1790919060201c565b905090565b600080805b84518110156200077d576000858281518110620005d457fe5b60200260200101519050620005fc662386f26fc1000082101561012e6200047b60201b60201c565b60008583815181106200060b57fe5b6020026020010151905062000739620006ab826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200065757600080fd5b505afa1580156200066c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000692919062000fe7565b60ff16601262000a1c60201b620015531790919060201c565b606062000724620006c78662000a3460201b620015691760201c565b60406200070f620006f78f8b81518110620006de57fe5b602002602001015162000a7760201b6200158d1760201c565b60008c620009df60201b6200150a179092919060201c565b62000aa960201b620015ad179092919060201c565b62000abb60201b620015bf179092919060201c565b6001600160a01b0382166000908152600b6020908152604090912091909155620007709086908490620015ce62000aca821b17901c565b94505050600101620005bb565b5062000796670de0b6b3a764000083146101346200047b565b620007af620003718760286200070f8b6008826200054d565b7f0f3631f9dab08169d1db21c6dc5f32536fb2b0a6b9bb5330d71c52132f968be087878787604051620007e694939291906200110b565b60405180910390a150505050505050565b6001600160a01b0382166000908152600284016020526040812054806200088657505082546040805180820182526001600160a01b03858116808352602080840187815260008781526001808c018452878220965187546001600160a01b031916961695909517865590519484019490945594820180895590835260028801909452919020919091556200055f565b6000190160009081526001808601602052604082200183905590506200055f565b620008d162000371826000620008bc6200054d565b62000ade60201b620015e0179092919060201c565b7f5a9e84f78f7957cb4ed7478eb0fcad35ee4ecbe2e0f298420b28a3955392573f8160405162000522919062001046565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6002815110156200096657620009dc565b6000816000815181106200097657fe5b602002602001015190506000600190505b825181101562000548576000838281518110620009a057fe5b60200260200101519050620009d1816001600160a01b0316846001600160a01b03161060656200047b60201b60201c565b915060010162000987565b50565b6001600160401b03811b1992909216911b1790565b6001600160c01b03828116821b90821b198416179392505050565b81811c607f165b92915050565b600062000a2e8383111560016200047b565b50900390565b600062000a16670de0b6b3a764000062000a6363ffffffff80168562000b0760201b620016071790919060201c565b62000b5c60201b620016551790919060201c565b600062000a16670de0b6b3a764000062000a636001600160401b0380168562000b0760201b620016071790919060201c565b63ffffffff811b1992909216911b1790565b601f811b1992909216911b1790565b60008282016200055f84821015836200047b565b60006001821b198416828462000af657600062000af9565b60015b60ff16901b17949350505050565b600082820262000b2f84158062000b2757508385838162000b2457fe5b04145b60036200047b565b8062000b4057600091505062000a16565b670de0b6b3a764000060001982015b0460010191505062000a16565b600062000b6d82151560046200047b565b8262000b7c5750600062000a16565b670de0b6b3a76400008381029062000ba29085838162000b9857fe5b041460056200047b565b82600182038162000b4f57fe5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000bf257805160ff191683800117855562000c22565b8280016001018555821562000c22579182015b8281111562000c2257825182559160200191906001019062000c05565b5062000c3092915062000c34565b5090565b5b8082111562000c30576000815560010162000c35565b805162000a16816200119e565b600082601f83011262000c69578081fd5b815162000c8062000c7a8262001172565b6200114b565b81815291506020808301908481018184028601820187101562000ca257600080fd5b60005b8481101562000cce57815162000cbb816200119e565b8452928201929082019060010162000ca5565b505050505092915050565b600082601f83011262000cea578081fd5b815162000cfb62000c7a8262001172565b81815291506020808301908481018184028601820187101562000d1d57600080fd5b60005b8481101562000cce57815162000d36816200119e565b8452928201929082019060010162000d20565b600082601f83011262000d5a578081fd5b815162000d6b62000c7a8262001172565b81815291506020808301908481018184028601820187101562000d8d57600080fd5b60005b8481101562000cce5781518452928201929082019060010162000d90565b8051801515811462000a1657600080fd5b600082601f83011262000dd0578081fd5b81516001600160401b0381111562000de6578182fd5b602062000dfc601f8301601f191682016200114b565b9250818352848183860101111562000e1357600080fd5b60005b8281101562000e3357848101820151848201830152810162000e16565b8281111562000e455760008284860101525b50505092915050565b60006020828403121562000e60578081fd5b5051919050565b60006020828403121562000e79578081fd5b81516001600160401b038082111562000e90578283fd5b818401915061018080838703121562000ea7578384fd5b62000eb2816200114b565b905062000ec0868462000c4b565b815260208301518281111562000ed4578485fd5b62000ee28782860162000dbf565b60208301525060408301518281111562000efa578485fd5b62000f088782860162000dbf565b60408301525060608301518281111562000f20578485fd5b62000f2e8782860162000cd9565b60608301525060808301518281111562000f46578485fd5b62000f548782860162000d49565b60808301525060a08301518281111562000f6c578485fd5b62000f7a8782860162000c58565b60a08301525060c083015160c082015260e083015160e082015261010091508183015182820152610120915062000fb48683850162000c4b565b82820152610140915062000fcb8683850162000dae565b9181019190915261016091820151918101919091529392505050565b60006020828403121562000ff9578081fd5b815160ff811681146200055f578182fd5b6000815180845260208085019450808401835b838110156200103b578151875295820195908201906001016200101d565b509495945050505050565b901515815260200190565b60006060820185835260206060818501528186518084526080860191508288019350845b818110156200109d576200108a855162001192565b8352938301939183019160010162001075565b505084810360408601528551808252908201925081860190845b81811015620010df57620010cc835162001192565b85529383019391830191600101620010b7565b509298975050505050505050565b6020810160038310620010fc57fe5b91905290565b90815260200190565b6000858252846020830152608060408301526200112c60808301856200100a565b82810360608401526200114081856200100a565b979650505050505050565b6040518181016001600160401b03811182821017156200116a57600080fd5b604052919050565b60006001600160401b0382111562001188578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114620009dc57600080fd5b60805160a05160601c60c05160e051610100516101205161014051610160516101805160601c6101a0516101c0516158716200123b60003980610ee85280613476525080610881525080610ec452508061182d525080611809525080611169525080611b28525080611b6a525080611b49525080610ea0525080610e2a52506158716000f3fe608060405234801561001057600080fd5b50600436106102de5760003560e01c806374f3b009116101865780639d2c110c116100e3578063c0ff1a1511610097578063dd62ed3e11610071578063dd62ed3e1461058d578063e01af92c146105a0578063f89f27ed146105b3576102de565b8063c0ff1a151461055f578063d505accf14610567578063d5c096c41461057a576102de565b8063a9059cbb116100c8578063a9059cbb1461053c578063aaabadc51461054f578063b322c79b14610557576102de565b80639d2c110c14610516578063a457c2d714610529576102de565b8063893d20e81161013a57806390605f3a1161011f57806390605f3a146104fe57806395d89b41146105065780639b02cdde1461050e576102de565b8063893d20e8146104e15780638d928af8146104f6576102de565b80637ecebe001161016b5780637ecebe00146104a8578063851c1bb3146104bb57806387ec6817146104ce576102de565b806374f3b009146104705780637beed22014610491576102de565b806338e9922e1161023f57806350dd6ed9116101f35780636028bfd4116101cd5780636028bfd414610434578063679aefce1461045557806370a082311461045d576102de565b806350dd6ed91461040657806355c67628146104195780635b77155e14610421576102de565b8063395093511161022457806339509351146103d85780633e569205146103eb57806347bc4d92146103fe576102de565b806338e9922e146103bd57806338fff2d0146103d0576102de565b80631dd746ea11610296578063313ce5671161027b578063313ce5671461038a57806332f144f51461039f5780633644e515146103b5576102de565b80631dd746ea1461036257806323b872dd14610377576102de565b806316c38b3c116102c757806316c38b3c1461032157806318160ddd146103365780631c0de0511461034b576102de565b806306fdde03146102e3578063095ea7b314610301575b600080fd5b6102eb6105bb565b6040516102f89190615714565b60405180910390f35b61031461030f366004614e32565b610652565b6040516102f8919061551a565b61033461032f366004614f29565b610669565b005b61033e61067d565b6040516102f8919061553d565b610353610683565b6040516102f893929190615525565b61036a6106ac565b6040516102f891906154e2565b610314610385366004614d82565b6106bb565b610392610731565b6040516102f8919061579b565b6103a761073a565b6040516102f892919061548c565b61033e61085c565b6103346103cb3660046152b5565b610866565b61033e61087f565b6103146103e6366004614e32565b6108a3565b6103346103f93660046152cd565b6108de565b6103146109ef565b610334610414366004615060565b610a04565b61033e610a22565b61033461042f366004614d2e565b610a33565b610447610442366004614f61565b610b5a565b6040516102f8929190615727565b61033e610b91565b61033e61046b366004614d2e565b610bbc565b61048361047e366004614f61565b610bdb565b6040516102f89291906154f5565b610499610c7e565b6040516102f893929190615740565b61033e6104b6366004614d2e565b610e0b565b61033e6104c9366004615004565b610e26565b6104476104dc366004614f61565b610e78565b6104e9610e9e565b6040516102f89190615478565b6104e9610ec2565b61033e610ee6565b6102eb610f0a565b61033e610f6b565b61033e6105243660046151b9565b610f78565b610314610537366004614e32565b611013565b61031461054a366004614e32565b611051565b6104e961105e565b61033e611068565b61033e61106f565b610334610575366004614dc2565b611134565b610483610588366004614f61565b61127d565b61033e61059b366004614d4a565b6113ae565b6103346105ae366004614f29565b6113d9565b61036a611402565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106475780601f1061061c57610100808354040283529160200191610647565b820191906000526020600020905b81548152906001019060200180831161062a57829003601f168201915b505050505090505b90565b600061065f3384846116a0565b5060015b92915050565b610671611708565b61067a8161174e565b50565b60025490565b60008060006106906117ea565b15925061069b611807565b91506106a561182b565b9050909192565b60606106b661184f565b905090565b6000806106c885336113ae565b90506106ec336001600160a01b03871614806106e45750838210155b61019e61199c565b6106f78585856119aa565b336001600160a01b0386161480159061071257506000198114155b156107245761072485338584036116a0565b60019150505b9392505050565b60055460ff1690565b606080610745611a8a565b67ffffffffffffffff8111801561075b57600080fd5b50604051908082528060200260200182016040528015610785578160200160208202803683370190505b509150610790611a8a565b67ffffffffffffffff811180156107a657600080fd5b506040519080825280602002602001820160405280156107d0578160200160208202803683370190505b50905060005b6107de611a8a565b811015610846576000806107f3600c84611a9f565b915091508185848151811061080457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508084848151811061083157fe5b602090810291909101015250506001016107d6565b506108588161085361184f565b611ac3565b9091565b60006106b6611b24565b61086e611708565b610876611bc1565b61067a81611bd6565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161065f9185906108d990866115ce565b6116a0565b6108e6611708565b6108ee611bc1565b6108f6611c41565b610908610901611a8a565b8251611c5a565b426109138185611c67565b93506109248385111561014661199c565b61093862015180858503101561014b61199c565b6060610942610ec2565b6001600160a01b031663f94d466861095861087f565b6040518263ffffffff1660e01b8152600401610974919061553d565b60006040518083038186803b15801561098c57600080fd5b505afa1580156109a0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109c89190810190614e5d565b505090506109e085856109d9611c7e565b8685611ddf565b50506109ea611fa3565b505050565b60006106b660006109fe611faa565b90611fb0565b610a0c611708565b610a14611bc1565b610a1e8282611fba565b5050565b6008546000906106b69060c06120d2565b610a3b611708565b610a43611bc1565b610a4b611c41565b606080610a5661073a565b91509150610a62610ec2565b6001600160a01b0316638bdb3913610a7861087f565b30866040518060800160405280610a8e8961064f565b81526020018781526020016003604051602001610aab9190615700565b6040516020818303038152906040528152602001600015158152506040518563ffffffff1660e01b8152600401610ae59493929190615565565b600060405180830381600087803b158015610aff57600080fd5b505af1158015610b13573d6000803e3d6000fd5b505050507f5cf8dd4ddeaded21c5e3dc4043073fa7659089e0d11d8480344663008dff060f8282604051610b4892919061548c565b60405180910390a1505061067a611fa3565b60006060610b708651610b6b611a8a565b611c5a565b610b85898989898989896120e0611ac36121ad565b97509795505050505050565b60006106b6610b9e61067d565b610bb6610ba961106f565b610bb1611a8a565b61233d565b90612357565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610c05610bea610ec2565b6001600160a01b0316336001600160a01b03161460cd61199c565b610c1a610c1061087f565b82146101f461199c565b6060610c2461184f565b9050610c30888261239f565b6000606080610c458e8e8e8e8e8e8a8f6120e0565b925092509250610c558d84612400565b610c5f8285611ac3565b610c698185611ac3565b909550935050505b5097509795505050505050565b60008060606000610c8d611faa565b9050610c9a81600861240a565b9350610ca781602861240a565b92506060610cb3610ec2565b6001600160a01b031663f94d4668610cc961087f565b6040518263ffffffff1660e01b8152600401610ce5919061553d565b60006040518083038186803b158015610cfd57600080fd5b505afa158015610d11573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d399190810190614e5d565b505080519091508067ffffffffffffffff81118015610d5757600080fd5b50604051908082528060200260200182016040528015610d81578160200160208202803683370190505b50935060005b81811015610e0257610de3610dde6040600b6000878681518110610da757fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461240a90919063ffffffff16565b612414565b858281518110610def57fe5b6020908102919091010152600101610d87565b50505050909192565b6001600160a01b031660009081526006602052604090205490565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610e5b929190615402565b604051602081830303815290604052805190602001209050919050565b60006060610e898651610b6b611a8a565b610b85898989898989896124326124e06121ad565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106475780601f1061061c57610100808354040283529160200191610647565b600061064f610153612541565b600080610f978560200151610135600c6125ae9092919063ffffffff16565b90506000610fbb610fb483610faf89602001516125eb565b6125fe565b8690611553565b90506000610fdb8760400151610135600c6125ae9092919063ffffffff16565b90506000610ffa610ff383610faf8b604001516125eb565b8790611553565b905061100788848361260a565b98975050505050505050565b60008061102033856113ae565b905080831061103a57611035338560006116a0565b611047565b61104733858584036116a0565b5060019392505050565b600061065f3384846119aa565b60006106b6612760565b6201518090565b6000606061107b610ec2565b6001600160a01b031663f94d466861109161087f565b6040518263ffffffff1660e01b81526004016110ad919061553d565b60006040518083038186803b1580156110c557600080fd5b505afa1580156110d9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111019190810190614e5d565b509150506111168161111161184f565b61239f565b60606111206127da565b50905061112d8183612858565b9250505090565b6111428442111560d161199c565b6001600160a01b0387166000908152600660209081526040808320549051909291611199917f0000000000000000000000000000000000000000000000000000000000000000918c918c918c9188918d9101615652565b60405160208183030381529060405280519060200120905060006111bc826128ca565b90506000600182888888604051600081526020016040526040516111e394939291906156e2565b6020604051602081039080840390855afa158015611205573d6000803e3d6000fd5b5050604051601f190151915061124790506001600160a01b0382161580159061123f57508b6001600160a01b0316826001600160a01b0316145b6101f861199c565b6001600160a01b038b1660009081526006602052604090206001850190556112708b8b8b6116a0565b5050505050505050505050565b6060808861128c610bea610ec2565b611297610c1061087f565b60606112a161184f565b90506112ab61067d565b61135e57600060606112c08d8d8d868b6128e6565b915091506112d96112cf61297c565b83101560cc61199c565b6112eb60006112e661297c565b612983565b6112fe8b6112f761297c565b8403612983565b61130881846124e0565b80611311611a8a565b67ffffffffffffffff8111801561132757600080fd5b50604051908082528060200260200182016040528015611351578160200160208202803683370190505b5095509550505050610c71565b611368888261239f565b600060608061137d8e8e8e8e8e8e8a8f612432565b92509250925061138d8c84612983565b61139782856124e0565b6113a18185611ac3565b9095509350610c71915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6113e1611708565b6113e9611bc1565b6113f1611c41565b6113fa8161298d565b61067a611fa3565b60606106b6611c7e565b80610a1e816129d4565b6109ea828414801561142757508183145b606761199c565b607f811b1992909216911b1790565b6001600160a01b0382166000908152600284016020526040812054806114e257505082546040805180820182526001600160a01b03858116808352602080840187815260008781526001808c018452878220965187547fffffffffffffffffffffffff0000000000000000000000000000000000000000169616959095178655905194840194909455948201808955908352600288019094529190209190915561072a565b60001901600090815260018086016020526040822001839055905061072a565b509392505050565b67ffffffffffffffff811b1992909216911b1790565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116821b90821b198416179392505050565b1c607f1690565b600061156383831115600161199c565b50900390565b6000610663670de0b6b3a76400006115878463ffffffff6116078116565b90611655565b6000610663670de0b6b3a76400006115878467ffffffffffffffff611607565b63ffffffff811b1992909216911b1790565b601f811b1992909216911b1790565b600082820161072a848210158361199c565b60006001821b19841682846115f65760006115f9565b60015b60ff16901b17949350505050565b600082820261162b84158061162457508385838161162157fe5b04145b600361199c565b8061163a576000915050610663565b670de0b6b3a764000060001982015b04600101915050610663565b6000611664821515600461199c565b8261167157506000610663565b670de0b6b3a7640000838102906116949085838161168b57fe5b0414600561199c565b82600182038161164957fe5b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906116fb90859061553d565b60405180910390a3505050565b60006117376000357fffffffff0000000000000000000000000000000000000000000000000000000016610e26565b905061067a6117468233612a4d565b61019161199c565b801561176e5761176961175f611807565b421061019361199c565b611783565b61178361177961182b565b42106101a961199c565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be64906117df90839061551a565b60405180910390a150565b60006117f461182b565b4211806106b657505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60608061185a610ec2565b6001600160a01b031663f94d466861187061087f565b6040518263ffffffff1660e01b815260040161188c919061553d565b60006040518083038186803b1580156118a457600080fd5b505afa1580156118b8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118e09190810190614e5d565b505080519091508067ffffffffffffffff811180156118fe57600080fd5b50604051908082528060200260200182016040528015611928578160200160208202803683370190505b50925060005b8181101561199657611977600b600085848151811061194957fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054612b3d565b84828151811061198357fe5b602090810291909101015260010161192e565b50505090565b81610a1e57610a1e81612541565b6119c16001600160a01b038416151561019861199c565b6119d86001600160a01b038316151561019961199c565b6119e38383836109ea565b6001600160a01b038316600090815260208190526040902054611a0990826101a0612b5f565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611a3890826115ce565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906116fb90859061553d565b60006106b66001611a99611faa565b9061154c565b600090815260019182016020526040902080549101546001600160a01b0390911691565b60005b611ace611a8a565b8110156109ea57611b05838281518110611ae457fe5b6020026020010151838381518110611af857fe5b6020026020010151612357565b838281518110611b1157fe5b6020908102919091010152600101611ac6565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611b91612b75565b30604051602001611ba6959493929190615686565b60405160208183030381529060405280519060200120905090565b611bd4611bcc6117ea565b61019261199c565b565b611be964e8d4a5100082101560cb61199c565b611bff67016345785d8a000082111560ca61199c565b600854611c0e908260c061150a565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906117df90839061553d565b611c536002600a54141561019061199c565b6002600a55565b610a1e818314606761199c565b600081831015611c77578161072a565b5090919050565b606080611c89610ec2565b6001600160a01b031663f94d4668611c9f61087f565b6040518263ffffffff1660e01b8152600401611cbb919061553d565b60006040518083038186803b158015611cd357600080fd5b505afa158015611ce7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d0f9190810190614e5d565b505080519091508067ffffffffffffffff81118015611d2d57600080fd5b50604051908082528060200260200182016040528015611d57578160200160208202803683370190505b5092506000611d64612b79565b905060005b82811015611dd8576000600b6000868481518110611d8357fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020549050611db88184612bef565b868381518110611dc457fe5b602090810291909101015250600101611d69565b5050505090565b600080805b8451811015611f2a576000858281518110611dfb57fe5b60200260200101519050611e1b662386f26fc1000082101561012e61199c565b6000858381518110611e2957fe5b60200260200101519050611efb611eb5826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611e7257600080fd5b505afa158015611e86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eaa919061535b565b60129060ff16611553565b6060611ef4611ec386611569565b6040611eed611ee48f8b81518110611ed757fe5b602002602001015161158d565b8b90600061150a565b91906115ad565b91906115bf565b6001600160a01b0382166000908152600b6020526040902055611f1e85836115ce565b94505050600101611de4565b50611f41670de0b6b3a7640000831461013461199c565b611f5d611f58876028611eed8b6008611eed611faa565b612c88565b7f0f3631f9dab08169d1db21c6dc5f32536fb2b0a6b9bb5330d71c52132f968be087878787604051611f92949392919061575f565b60405180910390a150505050505050565b6001600a55565b60085490565b1c60019081161490565b6000611fc461087f565b90506000611fd0610ec2565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b8152600401611ffd9291906156cb565b60806040518083038186803b15801561201557600080fd5b505afa158015612029573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204d919061531b565b6040517f18e736d40000000000000000000000000000000000000000000000000000000081529094506001600160a01b03851693506318e736d4925061209a9150859087906004016156b2565b600060405180830381600087803b1580156120b457600080fd5b505af11580156120c8573d6000803e3d6000fd5b5050505050505050565b1c67ffffffffffffffff1690565b60006060806120ee88612c9d565b60006120f985612cfe565b905061213a6121066109ef565b8061211c5750600182600381111561211a57fe5b145b806121325750600382600381111561213057fe5b145b61014a61199c565b61214e8b8a612147611c7e565b8989612d14565b909450925061215b611a8a565b67ffffffffffffffff8111801561217157600080fd5b5060405190808252806020026020018201604052801561219b578160200160208202803683370190505b50915050985098509895505050505050565b33301461229c576000306001600160a01b03166000366040516121d1929190615432565b6000604051808303816000865af19150503d806000811461220e576040519150601f19603f3d011682016040523d82523d6000602084013e612213565b606091505b50509050806000811461222257fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb00000000000000000000000000000000000000000000000000000000811461227e573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60606122a661184f565b90506122b2878261239f565b600060606122ca8c8c8c8c8c8c898d8d63ffffffff16565b50915091506122dd81848663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08301526020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b600082820261072a84158061162457508385838161162157fe5b6000612366821515600461199c565b8261237357506000610663565b670de0b6b3a76400008381029061238d9085838161168b57fe5b82818161239657fe5b04915050610663565b60005b6123aa611a8a565b8110156109ea576123e18382815181106123c057fe5b60200260200101518383815181106123d457fe5b6020026020010151612d58565b8382815181106123ed57fe5b60209081029190910101526001016123a2565b610a1e8282612d84565b1c63ffffffff1690565b600061066363ffffffff61158784670de0b6b3a76400006116078416565b600060608061243f611bc1565b61244888612c9d565b61246f6124536109ef565b806121325750600361246486612cfe565b600381111561213057fe5b6124828861247b611c7e565b8787612e40565b909350915061248f611a8a565b67ffffffffffffffff811180156124a557600080fd5b506040519080825280602002602001820160405280156124cf578160200160208202803683370190505b509050985098509895505050505050565b60005b6124eb611a8a565b8110156109ea5761252283828151811061250157fe5b602002602001015183838151811061251557fe5b6020026020010151611655565b83828151811061252e57fe5b60209081029190910101526001016124e3565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6001600160a01b03821660009081526002840160205260408120546125d58115158461199c565b6125e28560018303612ece565b95945050505050565b60006106636125f983612ee4565b612b3d565b600061072a8383612357565b6000836080015161261c610bea610ec2565b612627610c1061087f565b600061263686602001516125eb565b9050600061264787604001516125eb565b905060008751600181111561265857fe5b14156126e857600061266d8860600151612f0b565b90506000818960600151039050612691896020015161268c8387612f2c565b612f38565b606089018290526126a28885612f2c565b97506126ae8784612f2c565b96506126be896060015185612f2c565b60608a015260006126d08a8a8a612f4a565b90506126dc81856125fe565b96505050505050611502565b6126f28683612f2c565b95506126fe8582612f2c565b945061270e876060015182612f2c565b60608801526000612720888888612f72565b905061272c8184612f8a565b9050600061273982612f96565b9050600082820390506127548a6020015161268c8388612f2c565b50945061150292505050565b600061276a610ec2565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156127a257600080fd5b505afa1580156127b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b69190615044565b606060006127e6611c7e565b9150600090506000826000815181106127fb57fe5b602002602001015190506000600190505b8351811015612852578184828151811061282257fe5b6020026020010151111561284a5780925083818151811061283f57fe5b602002602001015191505b60010161280c565b50509091565b670de0b6b3a764000060005b83518110156128ba576128b06128a985838151811061287f57fe5b602002602001015185848151811061289357fe5b6020026020010151612fbc90919063ffffffff16565b8390612d58565b9150600101612864565b506106636000821161013761199c565b60006128d4611b24565b82604051602001610e5b929190615442565b600060606128f2611bc1565b60006128fd84612cfe565b9050612918600082600381111561291057fe5b1460ce61199c565b60606129238561300b565b9050612930610901611a8a565b61293a818761239f565b60606129446127da565b50905060006129538284612858565b9050600061296382610bb1611a8a565b60099290925550945090925050505b9550959350505050565b620f424090565b610a1e8282613021565b6129a5611f5882600061299e611faa565b91906115e0565b7f5a9e84f78f7957cb4ed7478eb0fcad35ee4ecbe2e0f298420b28a3955392573f816040516117df919061551a565b6002815110156129e35761067a565b6000816000815181106129f257fe5b602002602001015190506000600190505b82518110156109ea576000838281518110612a1a57fe5b60200260200101519050612a43816001600160a01b0316846001600160a01b031610606561199c565b9150600101612a03565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b612a6c610e9e565b6001600160a01b031614158015612a875750612a87836130af565b15612aaf57612a94610e9e565b6001600160a01b0316336001600160a01b0316149050610663565b612ab7612760565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b8152600401612ae693929190615546565b60206040518083038186803b158015612afe57600080fd5b505afa158015612b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b369190614f45565b9050610663565b600080612b4b83606061314f565b600a0a670de0b6b3a7640000029392505050565b6000612b6e848411158361199c565b5050900390565b4690565b60004281612b85611faa565b90506000612b9482600861240a565b90506000612ba383602861240a565b9050808410612bc057670de0b6b3a764000094505050505061064f565b818411612bd457600094505050505061064f565b818103828503612be48183612357565b965050505050505090565b600080612c04612bff85836120d2565b613156565b90506000612c16610dde86604061240a565b9050831580612c2457508082145b15612c3157509050610663565b670de0b6b3a76400008410612c495791506106639050565b80821115612c6c576000612c5f85838503612d58565b9092039250610663915050565b6000612c7a85848403612d58565b929092019250610663915050565b600854612c9790826000611520565b60085550565b60005b612ca8611a8a565b811015610a1e57612cdf612cbd600c83612ece565b838381518110612cc957fe5b602002602001015161155390919063ffffffff16565b828281518110612ceb57fe5b6020908102919091010152600101612ca0565b60008180602001905181019061066391906150ae565b600060606000612d2384612cfe565b90506003816003811115612d3357fe5b1415612d4c57612d4288613176565b9250925050612972565b612d4287878787613237565b6000828202612d7284158061162457508385838161162157fe5b670de0b6b3a764000090049392505050565b612d9b6001600160a01b038316151561019b61199c565b612da7826000836109ea565b6001600160a01b038216600090815260208190526040902054612dcd90826101a1612b5f565b6001600160a01b038316600090815260208190526040902055600254612df390826132b0565b6002556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612e3490859061553d565b60405180910390a35050565b600060606000612e4f84612cfe565b90506001816003811115612e5f57fe5b1415612e7b57612e71878787876132be565b9250925050612ec5565b6002816003811115612e8957fe5b1415612e9a57612e71878786613337565b6003816003811115612ea857fe5b1415612eb857612e718785613426565b612ec3610136612541565b505b94509492505050565b6000908152600191820160205260409020015490565b6001600160a01b0381166000908152600b6020526040902054610bd681151561013561199c565b600080612f20612f19610a22565b8490611607565b905061072a8382611553565b600061072a8383612d58565b610a1e612f4483613458565b82613468565b6000612f5f612f576109ef565b61014761199c565b612f6a8484846134cf565b949350505050565b6000612f7f612f576109ef565b612f6a848484613502565b600061072a8383611655565b6000610663612fb5612fa6610a22565b670de0b6b3a764000090611553565b8390611655565b600080612fc98484613535565b90506000612fe3612fdc83612710611607565b60016115ce565b905080821015612ff857600092505050610663565b6130028282611553565b92505050610663565b60608180602001905181019061072a9190615174565b61302d600083836109ea565b60025461303a90826115ce565b6002556001600160a01b03821660009081526020819052604090205461306090826115ce565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612e3490859061553d565b60006130da7f3e56920500000000000000000000000000000000000000000000000000000000610e26565b82148061310e575061310b7fe01af92c00000000000000000000000000000000000000000000000000000000610e26565b82145b80613140575061313d7f5b77155e00000000000000000000000000000000000000000000000000000000610e26565b82145b80610663575061066382613672565b1c601f1690565b600061066367ffffffffffffffff61158784670de0b6b3a7640000611607565b60006060613182611bc1565b6131996001600160a01b038416301461015161199c565b600091506131a5611a8a565b67ffffffffffffffff811180156131bb57600080fd5b506040519080825280602002602001820160405280156131e5578160200160208202803683370190505b50905060005b6131f3611a8a565b81101561323157613205600c82612ece565b82828151811061321157fe5b6020908102919091010152613229600c8260006136d6565b6001016131eb565b50915091565b60006060600061324684612cfe565b9050600081600381111561325657fe5b141561326757612e718787866136ee565b600181600381111561327557fe5b141561328557612e718785613759565b600281600381111561329357fe5b14156132a557612e718787878761377e565b612ec3610150612541565b600061072a83836001612b5f565b600060608060006132ce856137ec565b915091506132e46132dd611a8a565b8351611c5a565b6132ee828761239f565b6000606061330d8a8a8661330061067d565b613308610a22565b61380f565b9150915061331a81613978565b6133288383101560d061199c565b50989197509095505050505050565b60006060600080613347856139bc565b9150915061335f613356611a8a565b8210606461199c565b6000806133a389848151811061337157fe5b602002602001015189858151811061338557fe5b60200260200101518661339661067d565b61339e610a22565b6139d3565b915091506133b18382613468565b60606133bb611a8a565b67ffffffffffffffff811180156133d157600080fd5b506040519080825280602002602001820160405280156133fb578160200160208202803683370190505b5090508281858151811061340b57fe5b60209081029190910101529399939850929650505050505050565b60006060600061343584613aa9565b9050606061344b868361344661067d565b613abf565b9196919550909350505050565b6000610663600c83610135613b71565b80156134c557600061349a827f0000000000000000000000000000000000000000000000000000000000000000612d58565b905060006134a9600c85612ece565b90506134c2846134b983856115ce565b600c91906136d6565b50505b610a1e8282610a1e565b60006134d9611bc1565b612f6a836134ea8660200151613b98565b846134f88860400151613b98565b8860600151613bbc565b600061350c611bc1565b612f6a8361351d8660200151613b98565b8461352b8860400151613b98565b8860600151613c37565b60008161354b5750670de0b6b3a7640000610663565b8261355857506000610663565b6135857f80000000000000000000000000000000000000000000000000000000000000008410600661199c565b826135ab770bce5086492111aea88f4bb1ca6bcf584181ea8059f765328410600761199c565b826000670c7d713b49da0000831380156135cc5750670f43fc2c04ee000083125b156136035760006135dc84613cad565b9050670de0b6b3a764000080820784020583670de0b6b3a764000083050201915050613611565b8161360d84613de4565b0290505b670de0b6b3a7640000900561365f7ffffffffffffffffffffffffffffffffffffffffffffffffdc702bd3a30fc00008212801590613658575068070c1cc73b00c800008213155b600861199c565b61366881614184565b9695505050505050565b600061369d7f38e9922e00000000000000000000000000000000000000000000000000000000610e26565b82148061066357506136ce7f50dd6ed900000000000000000000000000000000000000000000000000000000610e26565b909114919050565b60009182526001928301602052604090912090910155565b600060606136fa611bc1565b600080613706856139bc565b91509150613715613356611a8a565b6000806133a389848151811061372757fe5b602002602001015189858151811061373b57fe5b60200260200101518661374c61067d565b613754610a22565b614654565b60006060600061376884613aa9565b9050606061344b868361377961067d565b61470a565b6000606061378a611bc1565b60606000613797856137ec565b915091506137a88251610b6b611a8a565b6137b2828761239f565b600060606137d18a8a866137c461067d565b6137cc610a22565b61479c565b915091506137e38383111560cf61199c565b61332881613978565b606060008280602001905181019061380491906150ca565b909590945092505050565b6000606080855167ffffffffffffffff8111801561382c57600080fd5b50604051908082528060200260200182016040528015613856578160200160208202803683370190505b5090506000805b895181101561391b576138b68a828151811061387557fe5b6020026020010151610bb68a848151811061388c57fe5b60200260200101518d85815181106138a057fe5b60200260200101516115ce90919063ffffffff16565b8382815181106138c257fe5b60200260200101818152505061391161390a8a83815181106138e057fe5b60200260200101518584815181106138f457fe5b6020026020010151612d5890919063ffffffff16565b83906115ce565b915060010161385d565b506000606061392e8b8b8b87878c6148a1565b915091506000670de0b6b3a7640000831161394a576000613966565b61396661395f84670de0b6b3a7640000611553565b8a90612d58565b9c919b50909950505050505050505050565b6139858151610b6b611a8a565b60005b613990611a8a565b811015610a1e576139b4818383815181106139a757fe5b6020026020010151613468565b600101613988565b60008082806020019051810190613804919061513e565b600080806139e58561158781896115ce565b90506139fe6729a2241af62c000082111561013361199c565b6000613a1c613a15670de0b6b3a76400008a611655565b8390614a26565b90506000613a3c613a3583670de0b6b3a7640000611553565b8b90611607565b90506000613a498a614a52565b90506000613a578383611607565b90506000613a658483611553565b90506000613a85613a7e670de0b6b3a76400008c611553565b8490611655565b83810398509050613a9682826115ce565b9850505050505050509550959350505050565b60008180602001905181019061072a9190615111565b60606000613acd8484611655565b90506060855167ffffffffffffffff81118015613ae957600080fd5b50604051908082528060200260200182016040528015613b13578160200160208202803683370190505b50905060005b8651811015613b6757613b4883888381518110613b3257fe5b602002602001015161160790919063ffffffff16565b828281518110613b5457fe5b6020908102919091010152600101613b19565b5095945050505050565b600080613b7e8585614a78565b9050613b8c8115158461199c565b60001901949350505050565b600080613ba3612b79565b90506000613bb084612ee4565b9050612f6a8183612bef565b6000613bde613bd387670429d069189e0000612d58565b83111561013061199c565b6000613bea87846115ce565b90506000613bf88883611655565b90506000613c068887612357565b90506000613c148383614a26565b9050613c29613c2282614a52565b8990612d58565b9a9950505050505050505050565b6000613c59613c4e85670429d069189e0000612d58565b83111561013161199c565b6000613c6f613c688685611553565b8690611655565b90506000613c7d8588611655565b90506000613c8b8383614a26565b90506000613ca182670de0b6b3a7640000611553565b9050613c298a82611607565b670de0b6b3a7640000026000806ec097ce7bc90715b34b9f1000000000808401907fffffffffffffffffffffffffffffffffff3f68318436f8ea4cb460f00000000085010281613cf957fe5b05905060006ec097ce7bc90715b34b9f100000000082800205905081806ec097ce7bc90715b34b9f100000000081840205915060038205016ec097ce7bc90715b34b9f100000000082840205915060058205016ec097ce7bc90715b34b9f100000000082840205915060078205016ec097ce7bc90715b34b9f100000000082840205915060098205016ec097ce7bc90715b34b9f1000000000828402059150600b8205016ec097ce7bc90715b34b9f1000000000828402059150600d8205016ec097ce7bc90715b34b9f1000000000828402059150600f826002919005919091010295945050505050565b6000670de0b6b3a7640000821215613e2157613e17826ec097ce7bc90715b34b9f100000000081613e1157fe5b05613de4565b6000039050610bd6565b60007e1600ef3172e58d2e933ec884fde10064c63b5372d805e203c00000000000008312613e7257770195e54c5dd42177f53a27172fa9ec630262827000000000830592506806f05b59d3b2000000015b73011798004d755d3c8bc8e03204cf44619e0000008312613eaa576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff00840008312613ef2576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a7008312613f2d576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf8508312613f6457693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e28312613f9b57690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d038312613fd05768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb417461211108312613ffb57680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d8312614030576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f17757889379378312614065576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b2866038312614099576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac83126140cd576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b600068056bc75e2d63100000840168056bc75e2d6310000080860302816140f057fe5b059050600068056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b60006141c97ffffffffffffffffffffffffffffffffffffffffffffffffdc702bd3a30fc000083121580156141c2575068070c1cc73b00c800008313155b600961199c565b60008212156141fd576141de82600003614184565b6ec097ce7bc90715b34b9f1000000000816141f557fe5b059050610bd6565b60006806f05b59d3b2000000831261425357507ffffffffffffffffffffffffffffffffffffffffffffffff90fa4a62c4e00000090910190770195e54c5dd42177f53a27172fa9ec63026282700000000061429f565b6803782dace9d9000000831261429b57507ffffffffffffffffffffffffffffffffffffffffffffffffc87d2531627000000909101906b1425982cf597cd205cef738061429f565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac620000008412614305577fffffffffffffffffffffffffffffffffffffffffffffff5287143a539e0000009093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d6310000008412614357577fffffffffffffffffffffffffffffffffffffffffffffffa9438a1d29cf0000009093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b1880000084126143a7577fffffffffffffffffffffffffffffffffffffffffffffffd4a1c50e94e78000009093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c40000084126143f7577fffffffffffffffffffffffffffffffffffffffffffffffea50e2874a73c000009093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac62000008412614446577ffffffffffffffffffffffffffffffffffffffffffffffff5287143a539e000009093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d631000008412614495577ffffffffffffffffffffffffffffffffffffffffffffffffa9438a1d29cf000009093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b188000084126144e4577ffffffffffffffffffffffffffffffffffffffffffffffffd4a1c50e94e7800009093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c400008412614533577ffffffffffffffffffffffffffffffffffffffffffffffffea50e2874a73c00009093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b60008080614666856115878189611553565b905061467f6709b6e64a8ec6000082101561013261199c565b6000614696613a15670de0b6b3a76400008a612357565b905060006146ad6146a683614a52565b8b90612d58565b905060006146ba8a614a52565b905060006146c88383611607565b905060006146d68483611553565b90506146e2828a611607565b96506146f86146f18389611553565b82906115ce565b97505050505050509550959350505050565b606060006147188484612357565b90506060855167ffffffffffffffff8111801561473457600080fd5b5060405190808252806020026020018201604052801561475e578160200160208202803683370190505b50905060005b8651811015613b675761477d838883815181106138f457fe5b82828151811061478957fe5b6020908102919091010152600101614764565b6000606080855167ffffffffffffffff811180156147b957600080fd5b506040519080825280602002602001820160405280156147e3578160200160208202803683370190505b5090506000805b89518110156148755761482d8a828151811061480257fe5b60200260200101516115878a848151811061481957fe5b60200260200101518d8581518110612cc957fe5b83828151811061483957fe5b60200260200101818152505061486b61390a8a838151811061485757fe5b6020026020010151858481518110613b3257fe5b91506001016147ea565b50600060606148888b8b8b87878c614a97565b91509150600061396661489a84614a52565b8a90611607565b60006060855167ffffffffffffffff811180156148bd57600080fd5b506040519080825280602002602001820160405280156148e7578160200160208202803683370190505b509050670de0b6b3a7640000915060005b8851811015614a1a5760008587838151811061491057fe5b6020026020010151111561499c57600061494161493588670de0b6b3a7640000611553565b8c85815181106138f457fe5b90506000614955828b8681518110612cc957fe5b905060006149638289611607565b90506149796149728383611553565b84906115ce565b93508086868151811061498857fe5b6020026020010181815250505050506149b3565b8782815181106149a857fe5b602002602001015190505b60006149dc8b84815181106149c457fe5b6020026020010151610bb6848e87815181106138a057fe5b9050614a0e614a078b85815181106149f057fe5b602002602001015183612fbc90919063ffffffff16565b8690612d58565b945050506001016148f8565b50965096945050505050565b600080614a338484613535565b90506000614a46612fdc83612710611607565b90506125e282826115ce565b6000670de0b6b3a76400008210614a6a576000610663565b50670de0b6b3a76400000390565b6001600160a01b03166000908152600291909101602052604090205490565b60006060855167ffffffffffffffff81118015614ab357600080fd5b50604051908082528060200260200182016040528015614add578160200160208202803683370190505b509050670de0b6b3a7640000915060005b8851811015614a1a576000868281518110614b0557fe5b6020026020010151861115614b7f576000614b2261493588614a52565b90506000614b36828b8681518110612cc957fe5b90506000614b4f612fb5670de0b6b3a76400008a611553565b9050818103868681518110614b6057fe5b6020908102919091010152614b7583826115ce565b9350505050614b96565b878281518110614b8b57fe5b602002602001015190505b6000614bbf8b8481518110614ba757fe5b6020026020010151610bb6848e8781518110612cc957fe5b9050614bd3614a078b85815181106149f057fe5b94505050600101614aee565b8035610663816157fc565b600082601f830112614bfa578081fd5b8135614c0d614c08826157d0565b6157a9565b818152915060208083019084810181840286018201871015614c2e57600080fd5b60005b84811015614c4d57813584529282019290820190600101614c31565b505050505092915050565b600082601f830112614c68578081fd5b8151614c76614c08826157d0565b818152915060208083019084810181840286018201871015614c9757600080fd5b60005b84811015614c4d57815184529282019290820190600101614c9a565b600082601f830112614cc6578081fd5b813567ffffffffffffffff811115614cdc578182fd5b614cef6020601f19601f840116016157a9565b9150808252836020828501011115614d0657600080fd5b8060208401602084013760009082016020015292915050565b80356002811061066357600080fd5b600060208284031215614d3f578081fd5b813561072a816157fc565b60008060408385031215614d5c578081fd5b8235614d67816157fc565b91506020830135614d77816157fc565b809150509250929050565b600080600060608486031215614d96578081fd5b8335614da1816157fc565b92506020840135614db1816157fc565b929592945050506040919091013590565b600080600080600080600060e0888a031215614ddc578283fd5b8735614de7816157fc565b96506020880135614df7816157fc565b955060408801359450606088013593506080880135614e158161582c565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215614e44578182fd5b8235614e4f816157fc565b946020939093013593505050565b600080600060608486031215614e71578081fd5b835167ffffffffffffffff80821115614e88578283fd5b818601915086601f830112614e9b578283fd5b8151614ea9614c08826157d0565b80828252602080830192508086018b828387028901011115614ec9578788fd5b8796505b84871015614ef4578051614ee0816157fc565b845260019690960195928101928101614ecd565b508901519097509350505080821115614f0b578283fd5b50614f1886828701614c58565b925050604084015190509250925092565b600060208284031215614f3a578081fd5b813561072a81615811565b600060208284031215614f56578081fd5b815161072a81615811565b600080600080600080600060e0888a031215614f7b578081fd5b873596506020880135614f8d816157fc565b95506040880135614f9d816157fc565b9450606088013567ffffffffffffffff80821115614fb9578283fd5b614fc58b838c01614bea565b955060808a0135945060a08a0135935060c08a0135915080821115614fe8578283fd5b50614ff58a828b01614cb6565b91505092959891949750929550565b600060208284031215615015578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461072a578182fd5b600060208284031215615055578081fd5b815161072a816157fc565b60008060408385031215615072578182fd5b823561507d816157fc565b9150602083013567ffffffffffffffff811115615098578182fd5b6150a485828601614cb6565b9150509250929050565b6000602082840312156150bf578081fd5b815161072a8161581f565b6000806000606084860312156150de578081fd5b83516150e98161581f565b602085015190935067ffffffffffffffff811115615105578182fd5b614f1886828701614c58565b60008060408385031215615123578182fd5b825161512e8161581f565b6020939093015192949293505050565b600080600060608486031215615152578081fd5b835161515d8161581f565b602085015160409095015190969495509392505050565b60008060408385031215615186578182fd5b82516151918161581f565b602084015190925067ffffffffffffffff8111156151ad578182fd5b6150a485828601614c58565b6000806000606084860312156151cd578081fd5b833567ffffffffffffffff808211156151e4578283fd5b81860191506101208083890312156151fa578384fd5b615203816157a9565b905061520f8884614d1f565b815261521e8860208501614bdf565b60208201526152308860408501614bdf565b6040820152606083013560608201526080830135608082015260a083013560a08201526152608860c08501614bdf565b60c08201526152728860e08501614bdf565b60e0820152610100808401358381111561528a578586fd5b6152968a828701614cb6565b9183019190915250976020870135975060409096013595945050505050565b6000602082840312156152c6578081fd5b5035919050565b6000806000606084860312156152e1578081fd5b8335925060208401359150604084013567ffffffffffffffff811115615305578182fd5b61531186828701614bea565b9150509250925092565b60008060008060808587031215615330578182fd5b8451935060208501519250604085015191506060850151615350816157fc565b939692955090935050565b60006020828403121561536c578081fd5b815161072a8161582c565b6000815180845260208085019450808401835b838110156153a65781518752958201959082019060010161538a565b509495945050505050565b15159052565b60008151808452815b818110156153dc576020818501810151868301820152016153c0565b818111156153ed5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b604080825283519082018190526000906020906060840190828701845b828110156154ce5781516001600160a01b0316845292840192908401906001016154a9565b505050838103828501526136688186615377565b60006020825261072a6020830184615377565b6000604082526155086040830185615377565b82810360208401526125e28185615377565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156155d6576155c084516157f0565b82529284019260019290920191908401906155ae565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a08701526156148185615377565b935050506040850151818584030160c086015261563183826153b7565b92505050606084015161564760e08501826153b1565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b600083825260406020830152612f6a60408301846153b7565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016004831061570e57fe5b91905290565b60006020825261072a60208301846153b7565b600083825260406020830152612f6a6040830184615377565b6000848252836020830152606060408301526125e26060830184615377565b60008582528460208301526080604083015261577e6080830185615377565b82810360608401526157908185615377565b979650505050505050565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156157c857600080fd5b604052919050565b600067ffffffffffffffff8211156157e6578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b038116811461067a57600080fd5b801515811461067a57600080fd5b6004811061067a57600080fd5b60ff8116811461067a57600080fdfea264697066735822122028ca628d97b6143340c071ae5b0d0c83a983b003d9aa3e14d77bf00b613b7ba064736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100715760003560e01c806359e5f80e1161005057806359e5f80e146100c05780636634b753146100e05780638d928af81461010057610071565b8062c194db14610076578063174481fa146100945780632da47c40146100aa575b600080fd5b61007e610108565b60405161008b9190610a0d565b60405180910390f35b61009c610127565b60405161008b9291906109db565b6100b261016d565b60405161008b929190610b48565b6100d36100ce3660046107d3565b6101d7565b60405161008b91906109ba565b6100f36100ee3660046107b7565b6102e7565b60405161008b9190610a02565b6100d3610312565b606061012260405180602001604052806000815250610395565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156101c957807f000000000000000000000000000000000000000000000000000000000000000003925062278d0091506101d2565b60009250600091505b509091565b60008060006101e461016d565b915091506102d86040518061018001604052806101ff610312565b73ffffffffffffffffffffffffffffffffffffffff1681526020018d81526020018c81526020018b81526020018a81526020018b5167ffffffffffffffff8111801561024a57600080fd5b50604051908082528060200260200182016040528015610274578160200160208202803683370190505b5081526020018981526020018481526020018381526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018715158152602001868152506040516020016102c49190610a20565b60405160208183030381529060405261046e565b9b9a5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061038f73ffffffffffffffffffffffffffffffffffffffff831615156101ac6104f9565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010161046081838661050b565b505050505050505050919050565b60008061047a83610585565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b8161050757610507816105cd565b5050565b5b602081106105495781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00161050c565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b6000606061059283610395565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff81166105c6573d6000803e3d6000fd5b9392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b803561064581610b9d565b92915050565b600082601f83011261065b578081fd5b813561066e61066982610b7d565b610b56565b81815291506020808301908481018184028601820187101561068f57600080fd5b60005b848110156106b75781356106a581610b9d565b84529282019290820190600101610692565b505050505092915050565b600082601f8301126106d2578081fd5b81356106e061066982610b7d565b81815291506020808301908481018184028601820187101561070157600080fd5b60005b848110156106b757813584529282019290820190600101610704565b8035801515811461064557600080fd5b600082601f830112610740578081fd5b813567ffffffffffffffff811115610756578182fd5b61078760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610b56565b915080825283602082850101111561079e57600080fd5b8060208401602084013760009082016020015292915050565b6000602082840312156107c8578081fd5b81356105c681610b9d565b600080600080600080600080610100898b0312156107ef578384fd5b883567ffffffffffffffff80821115610806578586fd5b6108128c838d01610730565b995060208b0135915080821115610827578586fd5b6108338c838d01610730565b985060408b0135915080821115610848578586fd5b6108548c838d0161064b565b975060608b0135915080821115610869578586fd5b506108768b828c016106c2565b9550506080890135935061088d8a60a08b0161063a565b925061089c8a60c08b01610720565b915060e089013590509295985092959890939650565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208085019450808401835b8381101561091157815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016108df565b509495945050505050565b6000815180845260208085019450808401835b838110156109115781518752958201959082019060010161092f565b15159052565b60008151808452815b818110156109765760208185018101518683018201520161095a565b818111156109875782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b6000602082526105c66020830184610951565b600060208252610a346020830184516108b2565b6020830151610180806040850152610a506101a0850183610951565b915060408501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080868503016060870152610a8c8483610951565b93506060870151915080868503016080870152610aa984836108cc565b935060808701519150808685030160a0870152610ac6848361091c565b935060a08701519150808685030160c087015250610ae483826108cc565b92505060c085015160e085015260e0850151610100818187015280870151915050610120818187015280870151915050610140610b23818701836108b2565b8601519050610160610b378682018361094b565b959095015193019290925250919050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610b7557600080fd5b604052919050565b600067ffffffffffffffff821115610b93578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff81168114610bbf57600080fd5b5056fea26469706673582212201e16e288729b80ed49d09aaef21e25005b6625074954ea725eaa484e7ecd231164736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/index.ts b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/index.ts new file mode 100644 index 0000000..73fe337 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/index.ts @@ -0,0 +1,8 @@ +import { Task, TaskRunOptions } from '@src'; +import { InvestmentPoolDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as InvestmentPoolDeployment; + const args = [input.Vault]; + await task.deployAndVerify('InvestmentPoolFactory', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/input.ts b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/input.ts new file mode 100644 index 0000000..3ddcf62 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type InvestmentPoolDeployment = { + Vault: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/output/arbitrum.json new file mode 100644 index 0000000..67e5164 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "InvestmentPoolFactory": "0xaCd615B3705B9c880E4E7293f1030B34e57B4c1c" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/output/goerli.json new file mode 100644 index 0000000..7e10b2a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/output/goerli.json @@ -0,0 +1,3 @@ +{ + "InvestmentPoolFactory": "0x3C9F788131A26329A689Bd951b5aCb4454669487" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/output/kovan.json b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/output/kovan.json new file mode 100644 index 0000000..b2d4411 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/output/kovan.json @@ -0,0 +1,3 @@ +{ + "InvestmentPoolFactory": "0xb08E16cFc07C684dAA2f93C70323BAdb2A6CBFd2" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/output/mainnet.json new file mode 100644 index 0000000..0cde7e5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "InvestmentPoolFactory": "0x48767F9F868a4A7b86A90736632F6E44C2df7fa9" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/output/polygon.json new file mode 100644 index 0000000..18131f1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/output/polygon.json @@ -0,0 +1,3 @@ +{ + "InvestmentPoolFactory": "0x0f7bb7ce7b6ed9366F9b6B910AdeFE72dC538193" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/output/rinkeby.json b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/output/rinkeby.json new file mode 100644 index 0000000..b2a4161 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/output/rinkeby.json @@ -0,0 +1,3 @@ +{ + "InvestmentPoolFactory": "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/readme.md b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/readme.md new file mode 100644 index 0000000..f09013a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/readme.md @@ -0,0 +1,13 @@ +# 2021-09-07 - Investment Pool + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This factory and associated Pools have been deprecated. A version of Managed Pools will soon be released, providing a migration path for existing Pools. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet address](./output/polygon.json) +- [Arbitrum mainnet address](./output/arbitrum.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`InvestmentPoolFactory` artifact](./artifact/InvestmentPoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/test/task.fork.ts new file mode 100644 index 0000000..b161d2c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210907-investment-pool/test/task.fork.ts @@ -0,0 +1,178 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; + +import { WeightedPoolEncoder } from '@helpers/models/pools/weighted/encoder'; +import { SwapKind } from '@helpers/models/types/types'; +import * as expectEvent from '@helpers/expectEvent'; +import { fp, bn } from '@helpers/numbers'; +import { MAX_UINT256 } from '@helpers/constants'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { calculateInvariant } from '@helpers/models/pools/weighted/math'; +import { expectEqualWithError } from '@helpers/relativeError'; +import { advanceToTimestamp, currentTimestamp, DAY, MINUTE, MONTH } from '@helpers/time'; + +import { describeForkTest, getSigners, getForkedNetwork, Task, TaskMode, impersonate } from '@src'; + +describeForkTest('InvestmentPoolFactory', 'mainnet', 14850000, function () { + let owner: SignerWithAddress, wallet: SignerWithAddress, whale: SignerWithAddress; + let pool: Contract, factory: Contract, vault: Contract, usdc: Contract, dai: Contract; + + let task: Task; + + const DAI = '0x6b175474e89094c44da98b954eedeac495271d0f'; + const USDC = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'; + + const tokens = [DAI, USDC]; + const initialWeights = [fp(0.9), fp(0.1)]; + const swapFeePercentage = fp(0.01); + const managementSwapFeePercentage = fp(0.6); + const swapEnabledOnStart = true; + + const weightChangeDuration = MONTH; + const endWeights = [fp(0.2), fp(0.8)]; + let endTime: BigNumber; + + const initialBalanceDAI = fp(9e6); // 9:1 DAI:USDC ratio + const initialBalanceUSDC = fp(1e6).div(1e12); // 6 digits + const initialBalances = [initialBalanceDAI, initialBalanceUSDC]; + + const LARGE_TOKEN_HOLDER = '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503'; + + before('run task', async () => { + task = new Task('20210907-investment-pool', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('InvestmentPoolFactory'); + }); + + before('load signers', async () => { + [owner, wallet] = await getSigners(); + whale = await impersonate(LARGE_TOKEN_HOLDER); + }); + + before('load vault and tokens', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.instanceAt('Vault', await factory.getVault()); + dai = await task.instanceAt('IERC20', DAI); + usdc = await task.instanceAt('IERC20', USDC); + }); + + it('deploy an investment pool', async () => { + const tx = await factory.create( + 'Macro Hedge', + 'TCH-MH', + tokens, + initialWeights, + swapFeePercentage, + owner.address, + swapEnabledOnStart, + managementSwapFeePercentage + ); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await task.instanceAt('InvestmentPool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + const poolId = pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + }); + + it('initial weights are correct', async () => { + // Weights are not exact due to being stored in fewer bits + expect(await pool.getNormalizedWeights()).to.equalWithError(initialWeights, 0.0001); + }); + + it('initialize the pool', async () => { + // Approve the Vault to join + await dai.connect(whale).approve(vault.address, MAX_UINT256); + await usdc.connect(whale).approve(vault.address, MAX_UINT256); + + const poolId = await pool.getPoolId(); + const userData = WeightedPoolEncoder.joinInit(initialBalances); + await vault.connect(whale).joinPool(poolId, whale.address, whale.address, { + assets: tokens, + maxAmountsIn: initialBalances, + fromInternalBalance: false, + userData, + }); + + const scaledBalances = [initialBalanceDAI, initialBalanceUSDC.mul(1e12)]; + // Initial BPT is the invariant multiplied by the number of tokens + const expectedInvariant = calculateInvariant(scaledBalances, initialWeights).mul(tokens.length); + + expectEqualWithError(await pool.balanceOf(whale.address), expectedInvariant, 0.001); + }); + + it('collected fees are initially zero', async () => { + const fees = await pool.getCollectedManagementFees(); + + expect(fees.tokens.map((x: string) => x.toLowerCase())).to.deep.equal(tokens); + expect(fees.collectedFees).to.deep.equal(new Array(tokens.length).fill(bn(0))); + }); + + it('can swap in an investment pool', async () => { + // Swap 500 DAI for 500 USDC - should have little price impact + const amountInDAI = fp(500); + + const whaleUSDCBalanceBefore = await usdc.balanceOf(whale.address); + + await dai.connect(whale).approve(vault.address, amountInDAI); + await vault.connect(whale).swap( + { + kind: SwapKind.GivenIn, + poolId: await pool.getPoolId(), + assetIn: DAI, + assetOut: USDC, + amount: amountInDAI, + userData: '0x', + }, + { sender: whale.address, recipient: whale.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + const whaleUSDCBalanceAfter = await usdc.balanceOf(whale.address); + + const expectedUSDC = amountInDAI.div(1e12); // USDC has 6 decimals and DAI 18, so there's a 12 decimal difference + expectEqualWithError(whaleUSDCBalanceAfter.sub(whaleUSDCBalanceBefore), expectedUSDC, 0.1); + }); + + it('swap incurs management fees', async () => { + const { collectedFees } = await pool.getCollectedManagementFees(); + + // Swap Given in - fee should be on DAI (token 0) + expect(collectedFees[0]).to.be.gt(0); + expect(collectedFees[1]).to.equal(0); + }); + + it('owner can withdraw management fees', async () => { + const DAIBalanceBefore = await dai.balanceOf(wallet.address); + const USDCBalanceBefore = await usdc.balanceOf(wallet.address); + + await pool.connect(owner).withdrawCollectedManagementFees(wallet.address); + + // Fees should be in the wallet + const DAIBalanceAfter = await dai.balanceOf(wallet.address); + const USDCBalanceAfter = await usdc.balanceOf(wallet.address); + + // Only DAI fees were collected + expect(DAIBalanceAfter).to.be.gt(DAIBalanceBefore); + expect(USDCBalanceAfter).to.be.equal(USDCBalanceBefore); + }); + + it('owner can start a gradual weight change', async () => { + const startTime = (await currentTimestamp()).add(DAY); + endTime = startTime.add(weightChangeDuration); + + const tx = await pool.connect(owner).updateWeightsGradually(startTime, endTime, endWeights); + expectEvent.inReceipt(await tx.wait(), 'GradualWeightUpdateScheduled'); + }); + + it('weights fully change once the time expires', async () => { + await advanceToTimestamp(endTime.add(MINUTE)); + + // Weights are not exact due to being stored in fewer bits + expect(await pool.getNormalizedWeights()).to.equalWithError(endWeights, 0.0001); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20210913-bal-arbitrum-merkle/artifact/MerkleRedeem.json b/balpy/balancer-deployments/tasks/deprecated/20210913-bal-arbitrum-merkle/artifact/MerkleRedeem.json new file mode 100644 index 0000000..64b57f9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210913-bal-arbitrum-merkle/artifact/MerkleRedeem.json @@ -0,0 +1,445 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "MerkleRedeem", + "sourceName": "contracts/MerkleRedeem.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "_vault", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "_rewardToken", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "RewardAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "RewardPaid", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "liquidityProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "begin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + } + ], + "name": "claimStatus", + "outputs": [ + { + "internalType": "bool[]", + "name": "", + "type": "bool[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "liquidityProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "week", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "claimedBalance", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "name": "claimWeek", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "liquidityProvider", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "week", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "internalType": "struct MerkleRedeem.Claim[]", + "name": "claims", + "type": "tuple[]" + } + ], + "name": "claimWeeks", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "liquidityProvider", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "week", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "internalType": "struct MerkleRedeem.Claim[]", + "name": "claims", + "type": "tuple[]" + } + ], + "name": "claimWeeksToInternalBalance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "liquidityProvider", + "type": "address" + }, + { + "internalType": "contract IDistributorCallback", + "name": "callbackContract", + "type": "address" + }, + { + "internalType": "bytes", + "name": "callbackData", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "week", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "internalType": "struct MerkleRedeem.Claim[]", + "name": "claims", + "type": "tuple[]" + } + ], + "name": "claimWeeksWithCallback", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "claimed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "begin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + } + ], + "name": "merkleRoots", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rewardToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "week", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "_merkleRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "seedAllocations", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "vault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "liquidityProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "week", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "claimedBalance", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "name": "verifyClaim", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "weekMerkleRoots", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60c06040523480156200001157600080fd5b5060405162001a5f38038062001a5f833981016040819052620000349162000147565b600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160601b0319606083811b821660a05282901b1660805260405163095ea7b360e01b81526001600160a01b0382169063095ea7b390620000bf9085906000199060040162000185565b602060405180830381600087803b158015620000da57600080fd5b505af1158015620000ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200011591906200011e565b505050620001b7565b60006020828403121562000130578081fd5b8151801515811462000140578182fd5b9392505050565b600080604083850312156200015a578081fd5b825162000167816200019e565b60208401519092506200017a816200019e565b809150509250929050565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0381168114620001b457600080fd5b50565b60805160601c60a05160601c61185b62000204600039806109855280610c4e5250806105a652806105d052806109615280610b385280610b8e5280610d745280610e11525061185b6000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c8063715018a611610097578063eb0d07f511610066578063eb0d07f514610201578063f2fde38b14610214578063f7c618c114610227578063fbfa77cf1461022f576100f5565b8063715018a6146101b15780638da5cb5b146101b9578063c804c39a146101ce578063dd8c9c9d146101e1576100f5565b80633d421653116100d35780633d4216531461015857806347fb23c11461016b5780634cd488ab1461018b57806358b4e4b41461019e576100f5565b8063120aa877146100fa5780632f1868e41461012357806339436b0014610138575b600080fd5b61010d610108366004611381565b610237565b60405161011a919061161f565b60405180910390f35b6101366101313660046111fd565b610257565b005b61014b6101463660046113db565b61033b565b60405161011a9190611550565b6101366101663660046111af565b6103f0565b61017e6101793660046112b4565b610442565b60405161011a919061150a565b6101366101993660046113b0565b610524565b6101366101ac3660046112e8565b610641565b610136610756565b6101c16107d1565b60405161011a9190611492565b6101366101dc3660046111af565b6107ed565b6101f46101ef366004611369565b61083a565b60405161011a919061162a565b61010d61020f3660046112e8565b61084c565b610136610222366004611193565b6108a2565b6101c161095f565b6101c1610983565b600260209081526000928352604080842090915290825290205460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff8616146102955760405162461bcd60e51b815260040161028c90611782565b60405180910390fd5b60006102a186836109a7565b90506102ad8582610adb565b6040517f55c524c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616906355c524c1906103019087908790600401611633565b600060405180830381600087803b15801561031b57600080fd5b505af115801561032f573d6000803e3d6000fd5b50505050505050505050565b60608183111561035d5760405162461bcd60e51b815260040161028c906116b7565b82820360010160608167ffffffffffffffff8111801561037c57600080fd5b506040519080825280602002602001820160405280156103a6578160200160208202803683370190505b50905060005b828110156103e75785810160009081526001602052604090205482518390839081106103d457fe5b60209081029190910101526001016103ac565b50949350505050565b3373ffffffffffffffffffffffffffffffffffffffff8316146104255760405162461bcd60e51b815260040161028c90611782565b600061043183836109a7565b905061043d8382610adb565b505050565b6060818311156104645760405162461bcd60e51b815260040161028c906116b7565b82820360010160608167ffffffffffffffff8111801561048357600080fd5b506040519080825280602002602001820160405280156104ad578160200160208202803683370190505b50905060005b8281101561051a57858101600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b168452909152902054825160ff9091169083908390811061050257fe5b911515602092830291909101909101526001016104b3565b5095945050505050565b61054f336105306107d1565b73ffffffffffffffffffffffffffffffffffffffff16146101aa610cbb565b6000838152600160205260409020541561057b5760405162461bcd60e51b815260040161028c9061174b565b60008381526001602052604090208290556105ce73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084610cc9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167fac24935fd910bc682b5ccb1a07b718cadf8cf2f6d1404c4f3ddc3662dae40e2982604051610634919061162a565b60405180910390a2505050565b3373ffffffffffffffffffffffffffffffffffffffff8516146106765760405162461bcd60e51b815260040161028c90611782565b600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8816845290915290205460ff16156106c65760405162461bcd60e51b815260040161028c90611714565b6106d28484848461084c565b6106ee5760405162461bcd60e51b815260040161028c90611680565b600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff88168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556107508483610d6c565b50505050565b610762336105306107d1565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b3373ffffffffffffffffffffffffffffffffffffffff8316146108225760405162461bcd60e51b815260040161028c90611782565b600061082e83836109a7565b905061043d8382610d6c565b60016020526000908152604090205481565b6000808584604051602001610862929190611416565b60405160208183030381529060405280519060200120905061089883600160008881526020019081526020016000205483610e38565b9695505050505050565b6108ae336105306107d1565b6108d273ffffffffffffffffffffffffffffffffffffffff821615156101ab610cbb565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006109b161100d565b60005b8351811015610ad3578381815181106109c957fe5b6020908102919091018101518051600090815260028352604080822073ffffffffffffffffffffffffffffffffffffffff8a168352909352919091205490925060ff1615610a295760405162461bcd60e51b815260040161028c90611714565b610a418583600001518460200151856040015161084c565b610a5d5760405162461bcd60e51b815260040161028c90611680565b6020820151610a6d908490610ed5565b8251600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155909350016109b4565b505092915050565b8015610cb757604080516001808252818301909252606091816020015b610b0061102e565b815260200190600190039081610af85750506040805160a081018252600080825273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660208401529282018690523060608301529186166080820152825192935091839190610b8157fe5b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e84604051610c09919061162a565b60405180910390a36040517f0e8e3e8400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690630e8e3e8490610c83908490600401611588565b600060405180830381600087803b158015610c9d57600080fd5b505af1158015610cb1573d6000803e3d6000fd5b50505050505b5050565b81610cb757610cb781610eee565b610750846323b872dd60e01b858585604051602401610cea939291906114b3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610f41565b8015610cb7577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e83604051610def919061162a565b60405180910390a3610cb773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168383610fee565b600081815b8551811015610eca576000868281518110610e5457fe5b60200260200101519050808311610e95578281604051602001610e7892919061144b565b604051602081830303815290604052805190602001209250610ec1565b8083604051602001610ea892919061144b565b6040516020818303038152906040528051906020012092505b50600101610e3d565b509092149392505050565b6000828201610ee78482101583610cbb565b9392505050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051610f6a9190611459565b6000604051808303816000865af19150503d8060008114610fa7576040519150601f19603f3d011682016040523d82523d6000602084013e610fac565b606091505b50915091506000821415610fc4573d6000803e3d6000fd5b610750815160001480610fe6575081806020019051810190610fe69190611349565b6101a2610cbb565b61043d8363a9059cbb60e01b8484604051602401610cea9291906114e4565b60405180606001604052806000815260200160008152602001606081525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b600082601f83011261106e578081fd5b813561108161107c826117e0565b6117b9565b8181529150602080830190848101818402860182018710156110a257600080fd5b60005b848110156110c1578135845292820192908201906001016110a5565b505050505092915050565b600082601f8301126110dc578081fd5b81356110ea61107c826117e0565b818152915060208083019084810160005b848110156110c157813587016060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561113a57600080fd5b611143816117b9565b82860135815260408084013582880152918301359167ffffffffffffffff83111561116d57600080fd5b61117b8c888587010161105e565b908201528652505092820192908201906001016110fb565b6000602082840312156111a4578081fd5b8135610ee781611800565b600080604083850312156111c1578081fd5b82356111cc81611800565b9150602083013567ffffffffffffffff8111156111e7578182fd5b6111f3858286016110cc565b9150509250929050565b600080600080600060808688031215611214578081fd5b853561121f81611800565b9450602086013561122f81611800565b9350604086013567ffffffffffffffff8082111561124b578283fd5b818801915088601f83011261125e578283fd5b81358181111561126c578384fd5b89602082850101111561127d578384fd5b60208301955080945050606088013591508082111561129a578283fd5b506112a7888289016110cc565b9150509295509295909350565b6000806000606084860312156112c8578283fd5b83356112d381611800565b95602085013595506040909401359392505050565b600080600080608085870312156112fd578384fd5b843561130881611800565b93506020850135925060408501359150606085013567ffffffffffffffff811115611331578182fd5b61133d8782880161105e565b91505092959194509250565b60006020828403121561135a578081fd5b81518015158114610ee7578182fd5b60006020828403121561137a578081fd5b5035919050565b60008060408385031215611393578182fd5b8235915060208301356113a581611800565b809150509250929050565b6000806000606084860312156113c4578283fd5b505081359360208301359350604090920135919050565b600080604083850312156113ed578182fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff169052565b60609290921b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168252601482015260340190565b918252602082015260400190565b60008251815b81811015611479576020818601810151858301520161145f565b818111156114875782828501525b509190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015611544578351151583529284019291840191600101611526565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156115445783518352928401929184019160010161156c565b602080825282518282018190526000919060409081850190868401855b828110156116125781518051600481106115bb57fe5b8552808701516115cd888701826113fc565b5085810151868601526060808201516115e8828801826113fc565b5050608090810151906115fd868201836113fc565b505060a09390930192908501906001016115a5565b5091979650505050505050565b901515815260200190565b90815260200190565b60006020825282602083015282846040840137818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b60208082526016908201527f496e636f7272656374206d65726b6c652070726f6f6600000000000000000000604082015260600190565b6020808252602a908201527f7765656b73206d7573742062652073706563696669656420696e20617363656e60408201527f64696e67206f7264657200000000000000000000000000000000000000000000606082015260800190565b60208082526012908201527f63616e6e6f7420636c61696d2074776963650000000000000000000000000000604082015260600190565b6020808252601a908201527f63616e6e6f742072657772697465206d65726b6c6520726f6f74000000000000604082015260600190565b6020808252601b908201527f75736572206d75737420636c61696d206f776e2062616c616e63650000000000604082015260600190565b60405181810167ffffffffffffffff811182821017156117d857600080fd5b604052919050565b600067ffffffffffffffff8211156117f6578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff8116811461182257600080fd5b5056fea264697066735822122020b0baae4b1a76991e361d11c2638147ed3f96d070df8981472a23702da9ab3764736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100f55760003560e01c8063715018a611610097578063eb0d07f511610066578063eb0d07f514610201578063f2fde38b14610214578063f7c618c114610227578063fbfa77cf1461022f576100f5565b8063715018a6146101b15780638da5cb5b146101b9578063c804c39a146101ce578063dd8c9c9d146101e1576100f5565b80633d421653116100d35780633d4216531461015857806347fb23c11461016b5780634cd488ab1461018b57806358b4e4b41461019e576100f5565b8063120aa877146100fa5780632f1868e41461012357806339436b0014610138575b600080fd5b61010d610108366004611381565b610237565b60405161011a919061161f565b60405180910390f35b6101366101313660046111fd565b610257565b005b61014b6101463660046113db565b61033b565b60405161011a9190611550565b6101366101663660046111af565b6103f0565b61017e6101793660046112b4565b610442565b60405161011a919061150a565b6101366101993660046113b0565b610524565b6101366101ac3660046112e8565b610641565b610136610756565b6101c16107d1565b60405161011a9190611492565b6101366101dc3660046111af565b6107ed565b6101f46101ef366004611369565b61083a565b60405161011a919061162a565b61010d61020f3660046112e8565b61084c565b610136610222366004611193565b6108a2565b6101c161095f565b6101c1610983565b600260209081526000928352604080842090915290825290205460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff8616146102955760405162461bcd60e51b815260040161028c90611782565b60405180910390fd5b60006102a186836109a7565b90506102ad8582610adb565b6040517f55c524c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616906355c524c1906103019087908790600401611633565b600060405180830381600087803b15801561031b57600080fd5b505af115801561032f573d6000803e3d6000fd5b50505050505050505050565b60608183111561035d5760405162461bcd60e51b815260040161028c906116b7565b82820360010160608167ffffffffffffffff8111801561037c57600080fd5b506040519080825280602002602001820160405280156103a6578160200160208202803683370190505b50905060005b828110156103e75785810160009081526001602052604090205482518390839081106103d457fe5b60209081029190910101526001016103ac565b50949350505050565b3373ffffffffffffffffffffffffffffffffffffffff8316146104255760405162461bcd60e51b815260040161028c90611782565b600061043183836109a7565b905061043d8382610adb565b505050565b6060818311156104645760405162461bcd60e51b815260040161028c906116b7565b82820360010160608167ffffffffffffffff8111801561048357600080fd5b506040519080825280602002602001820160405280156104ad578160200160208202803683370190505b50905060005b8281101561051a57858101600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b168452909152902054825160ff9091169083908390811061050257fe5b911515602092830291909101909101526001016104b3565b5095945050505050565b61054f336105306107d1565b73ffffffffffffffffffffffffffffffffffffffff16146101aa610cbb565b6000838152600160205260409020541561057b5760405162461bcd60e51b815260040161028c9061174b565b60008381526001602052604090208290556105ce73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084610cc9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167fac24935fd910bc682b5ccb1a07b718cadf8cf2f6d1404c4f3ddc3662dae40e2982604051610634919061162a565b60405180910390a2505050565b3373ffffffffffffffffffffffffffffffffffffffff8516146106765760405162461bcd60e51b815260040161028c90611782565b600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8816845290915290205460ff16156106c65760405162461bcd60e51b815260040161028c90611714565b6106d28484848461084c565b6106ee5760405162461bcd60e51b815260040161028c90611680565b600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff88168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556107508483610d6c565b50505050565b610762336105306107d1565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b3373ffffffffffffffffffffffffffffffffffffffff8316146108225760405162461bcd60e51b815260040161028c90611782565b600061082e83836109a7565b905061043d8382610d6c565b60016020526000908152604090205481565b6000808584604051602001610862929190611416565b60405160208183030381529060405280519060200120905061089883600160008881526020019081526020016000205483610e38565b9695505050505050565b6108ae336105306107d1565b6108d273ffffffffffffffffffffffffffffffffffffffff821615156101ab610cbb565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006109b161100d565b60005b8351811015610ad3578381815181106109c957fe5b6020908102919091018101518051600090815260028352604080822073ffffffffffffffffffffffffffffffffffffffff8a168352909352919091205490925060ff1615610a295760405162461bcd60e51b815260040161028c90611714565b610a418583600001518460200151856040015161084c565b610a5d5760405162461bcd60e51b815260040161028c90611680565b6020820151610a6d908490610ed5565b8251600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155909350016109b4565b505092915050565b8015610cb757604080516001808252818301909252606091816020015b610b0061102e565b815260200190600190039081610af85750506040805160a081018252600080825273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660208401529282018690523060608301529186166080820152825192935091839190610b8157fe5b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e84604051610c09919061162a565b60405180910390a36040517f0e8e3e8400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690630e8e3e8490610c83908490600401611588565b600060405180830381600087803b158015610c9d57600080fd5b505af1158015610cb1573d6000803e3d6000fd5b50505050505b5050565b81610cb757610cb781610eee565b610750846323b872dd60e01b858585604051602401610cea939291906114b3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610f41565b8015610cb7577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e83604051610def919061162a565b60405180910390a3610cb773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168383610fee565b600081815b8551811015610eca576000868281518110610e5457fe5b60200260200101519050808311610e95578281604051602001610e7892919061144b565b604051602081830303815290604052805190602001209250610ec1565b8083604051602001610ea892919061144b565b6040516020818303038152906040528051906020012092505b50600101610e3d565b509092149392505050565b6000828201610ee78482101583610cbb565b9392505050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051610f6a9190611459565b6000604051808303816000865af19150503d8060008114610fa7576040519150601f19603f3d011682016040523d82523d6000602084013e610fac565b606091505b50915091506000821415610fc4573d6000803e3d6000fd5b610750815160001480610fe6575081806020019051810190610fe69190611349565b6101a2610cbb565b61043d8363a9059cbb60e01b8484604051602401610cea9291906114e4565b60405180606001604052806000815260200160008152602001606081525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b600082601f83011261106e578081fd5b813561108161107c826117e0565b6117b9565b8181529150602080830190848101818402860182018710156110a257600080fd5b60005b848110156110c1578135845292820192908201906001016110a5565b505050505092915050565b600082601f8301126110dc578081fd5b81356110ea61107c826117e0565b818152915060208083019084810160005b848110156110c157813587016060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561113a57600080fd5b611143816117b9565b82860135815260408084013582880152918301359167ffffffffffffffff83111561116d57600080fd5b61117b8c888587010161105e565b908201528652505092820192908201906001016110fb565b6000602082840312156111a4578081fd5b8135610ee781611800565b600080604083850312156111c1578081fd5b82356111cc81611800565b9150602083013567ffffffffffffffff8111156111e7578182fd5b6111f3858286016110cc565b9150509250929050565b600080600080600060808688031215611214578081fd5b853561121f81611800565b9450602086013561122f81611800565b9350604086013567ffffffffffffffff8082111561124b578283fd5b818801915088601f83011261125e578283fd5b81358181111561126c578384fd5b89602082850101111561127d578384fd5b60208301955080945050606088013591508082111561129a578283fd5b506112a7888289016110cc565b9150509295509295909350565b6000806000606084860312156112c8578283fd5b83356112d381611800565b95602085013595506040909401359392505050565b600080600080608085870312156112fd578384fd5b843561130881611800565b93506020850135925060408501359150606085013567ffffffffffffffff811115611331578182fd5b61133d8782880161105e565b91505092959194509250565b60006020828403121561135a578081fd5b81518015158114610ee7578182fd5b60006020828403121561137a578081fd5b5035919050565b60008060408385031215611393578182fd5b8235915060208301356113a581611800565b809150509250929050565b6000806000606084860312156113c4578283fd5b505081359360208301359350604090920135919050565b600080604083850312156113ed578182fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff169052565b60609290921b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168252601482015260340190565b918252602082015260400190565b60008251815b81811015611479576020818601810151858301520161145f565b818111156114875782828501525b509190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015611544578351151583529284019291840191600101611526565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156115445783518352928401929184019160010161156c565b602080825282518282018190526000919060409081850190868401855b828110156116125781518051600481106115bb57fe5b8552808701516115cd888701826113fc565b5085810151868601526060808201516115e8828801826113fc565b5050608090810151906115fd868201836113fc565b505060a09390930192908501906001016115a5565b5091979650505050505050565b901515815260200190565b90815260200190565b60006020825282602083015282846040840137818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b60208082526016908201527f496e636f7272656374206d65726b6c652070726f6f6600000000000000000000604082015260600190565b6020808252602a908201527f7765656b73206d7573742062652073706563696669656420696e20617363656e60408201527f64696e67206f7264657200000000000000000000000000000000000000000000606082015260800190565b60208082526012908201527f63616e6e6f7420636c61696d2074776963650000000000000000000000000000604082015260600190565b6020808252601a908201527f63616e6e6f742072657772697465206d65726b6c6520726f6f74000000000000604082015260600190565b6020808252601b908201527f75736572206d75737420636c61696d206f776e2062616c616e63650000000000604082015260600190565b60405181810167ffffffffffffffff811182821017156117d857600080fd5b604052919050565b600067ffffffffffffffff8211156117f6578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff8116811461182257600080fd5b5056fea264697066735822122020b0baae4b1a76991e361d11c2638147ed3f96d070df8981472a23702da9ab3764736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210913-bal-arbitrum-merkle/index.ts b/balpy/balancer-deployments/tasks/deprecated/20210913-bal-arbitrum-merkle/index.ts new file mode 100644 index 0000000..5ae0a5d --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210913-bal-arbitrum-merkle/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { MerkleRedeemDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as MerkleRedeemDeployment; + + const args = [input.Vault, input.balToken]; + await task.deployAndVerify('MerkleRedeem', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20210913-bal-arbitrum-merkle/input.ts b/balpy/balancer-deployments/tasks/deprecated/20210913-bal-arbitrum-merkle/input.ts new file mode 100644 index 0000000..9dd611d --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210913-bal-arbitrum-merkle/input.ts @@ -0,0 +1,15 @@ +import { Task, TaskMode } from '@src'; + +export type MerkleRedeemDeployment = { + Vault: string; + balToken: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + arbitrum: { + Vault, + balToken: '0x040d1EdC9569d4Bab2D15287Dc5A4F10F56a56B8', + }, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20210913-bal-arbitrum-merkle/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20210913-bal-arbitrum-merkle/output/arbitrum.json new file mode 100644 index 0000000..ace2fa6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210913-bal-arbitrum-merkle/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "MerkleRedeem": "0x6bd0B17713aaa29A2d7c9A39dDc120114f9fD809" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210913-bal-arbitrum-merkle/readme.md b/balpy/balancer-deployments/tasks/deprecated/20210913-bal-arbitrum-merkle/readme.md new file mode 100644 index 0000000..61b9684 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210913-bal-arbitrum-merkle/readme.md @@ -0,0 +1,12 @@ +# 2021-09-13 - Merkle Redeem for BAL rewards on Arbitrum + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This distributor has been deprecated in favor of the veBAL system. + +Distributor contract for BAL rewards on Arbitrum. + +## Useful Files + +- [Arbitrum mainnet address](./output/arbitrum.json) +- [`MerkleRedeem` artifact](./artifact/MerkleRedeem.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20210913-bal-arbitrum-merkle/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20210913-bal-arbitrum-merkle/test/task.fork.ts new file mode 100644 index 0000000..71074bc --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210913-bal-arbitrum-merkle/test/task.fork.ts @@ -0,0 +1,69 @@ +import hre, { ethers } from 'hardhat'; +import { Contract, BigNumber } from 'ethers'; + +import { bn, fp } from '@helpers/numbers'; +import { expectEqualWithError } from '@helpers/relativeError'; +import { MerkleTree } from '@helpers/merkleTree'; + +import { MAX_UINT256 } from '@helpers/constants'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; + +import { describeForkTest, getSigner, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; + +function encodeElement(address: string, balance: BigNumber): string { + return ethers.utils.solidityKeccak256(['address', 'uint'], [address, balance]); +} + +describeForkTest('MerkleRedeem', 'arbitrum', 846769, function () { + let lp: SignerWithAddress, other: SignerWithAddress, whale: SignerWithAddress; + let distributor: Contract, token: Contract; + + let task: Task; + + const BAL_TOKEN_ADDRESS = '0x040d1edc9569d4bab2d15287dc5a4f10f56a56b8'; // BAL on arbitrum + const BAL_WHALE_ADDRESS = '0x056d433ad1eafcab3c4544bf4f98b9f40b1b1738'; + + before('run task', async () => { + task = new Task('20210913-bal-arbitrum-merkle', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + distributor = await task.instanceAt('MerkleRedeem', task.output().MerkleRedeem); + }); + + before('load signers and transfer ownership', async () => { + lp = await getSigner(2); + other = await getSigner(3); + whale = await impersonate(BAL_WHALE_ADDRESS); + token = await task.instanceAt('IERC20', BAL_TOKEN_ADDRESS); + + await distributor.transferOwnership(whale.address); + await token.connect(whale).approve(distributor.address, MAX_UINT256); + }); + + describe('with an allocation defined', async () => { + let root: string; + let proof: string[]; + + before(() => { + const elements: string[] = [encodeElement(lp.address, fp(66)), encodeElement(other.address, fp(34))]; + + const merkleTree = new MerkleTree(elements); + root = merkleTree.getHexRoot(); + + proof = merkleTree.getHexProof(elements[0]); + }); + + it('can seed an allocation', async () => { + await distributor.connect(whale).seedAllocations(bn(0), root, fp(100)); + + const expectedReward = fp(100); + expectEqualWithError(await token.balanceOf(distributor.address), expectedReward, fp(1)); + }); + + it('can claim a reward', async () => { + await distributor.connect(whale).seedAllocations(bn(1), root, fp(100)); + + await distributor.connect(lp).claimWeek(lp.address, bn(1), fp(66), proof); + expectEqualWithError(await token.balanceOf(lp.address), fp(66), fp(1)); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20210928-mcb-arbitrum-merkle/artifact/MerkleRedeem.json b/balpy/balancer-deployments/tasks/deprecated/20210928-mcb-arbitrum-merkle/artifact/MerkleRedeem.json new file mode 100644 index 0000000..64b57f9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210928-mcb-arbitrum-merkle/artifact/MerkleRedeem.json @@ -0,0 +1,445 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "MerkleRedeem", + "sourceName": "contracts/MerkleRedeem.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "_vault", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "_rewardToken", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "RewardAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "rewardToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "RewardPaid", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "liquidityProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "begin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + } + ], + "name": "claimStatus", + "outputs": [ + { + "internalType": "bool[]", + "name": "", + "type": "bool[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "liquidityProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "week", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "claimedBalance", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "name": "claimWeek", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "liquidityProvider", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "week", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "internalType": "struct MerkleRedeem.Claim[]", + "name": "claims", + "type": "tuple[]" + } + ], + "name": "claimWeeks", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "liquidityProvider", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "week", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "internalType": "struct MerkleRedeem.Claim[]", + "name": "claims", + "type": "tuple[]" + } + ], + "name": "claimWeeksToInternalBalance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "liquidityProvider", + "type": "address" + }, + { + "internalType": "contract IDistributorCallback", + "name": "callbackContract", + "type": "address" + }, + { + "internalType": "bytes", + "name": "callbackData", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "week", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "internalType": "struct MerkleRedeem.Claim[]", + "name": "claims", + "type": "tuple[]" + } + ], + "name": "claimWeeksWithCallback", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "claimed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "begin", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + } + ], + "name": "merkleRoots", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rewardToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "week", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "_merkleRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "seedAllocations", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "vault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "liquidityProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "week", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "claimedBalance", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "name": "verifyClaim", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "weekMerkleRoots", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60c06040523480156200001157600080fd5b5060405162001a5f38038062001a5f833981016040819052620000349162000147565b600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160601b0319606083811b821660a05282901b1660805260405163095ea7b360e01b81526001600160a01b0382169063095ea7b390620000bf9085906000199060040162000185565b602060405180830381600087803b158015620000da57600080fd5b505af1158015620000ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200011591906200011e565b505050620001b7565b60006020828403121562000130578081fd5b8151801515811462000140578182fd5b9392505050565b600080604083850312156200015a578081fd5b825162000167816200019e565b60208401519092506200017a816200019e565b809150509250929050565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0381168114620001b457600080fd5b50565b60805160601c60a05160601c61185b62000204600039806109855280610c4e5250806105a652806105d052806109615280610b385280610b8e5280610d745280610e11525061185b6000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c8063715018a611610097578063eb0d07f511610066578063eb0d07f514610201578063f2fde38b14610214578063f7c618c114610227578063fbfa77cf1461022f576100f5565b8063715018a6146101b15780638da5cb5b146101b9578063c804c39a146101ce578063dd8c9c9d146101e1576100f5565b80633d421653116100d35780633d4216531461015857806347fb23c11461016b5780634cd488ab1461018b57806358b4e4b41461019e576100f5565b8063120aa877146100fa5780632f1868e41461012357806339436b0014610138575b600080fd5b61010d610108366004611381565b610237565b60405161011a919061161f565b60405180910390f35b6101366101313660046111fd565b610257565b005b61014b6101463660046113db565b61033b565b60405161011a9190611550565b6101366101663660046111af565b6103f0565b61017e6101793660046112b4565b610442565b60405161011a919061150a565b6101366101993660046113b0565b610524565b6101366101ac3660046112e8565b610641565b610136610756565b6101c16107d1565b60405161011a9190611492565b6101366101dc3660046111af565b6107ed565b6101f46101ef366004611369565b61083a565b60405161011a919061162a565b61010d61020f3660046112e8565b61084c565b610136610222366004611193565b6108a2565b6101c161095f565b6101c1610983565b600260209081526000928352604080842090915290825290205460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff8616146102955760405162461bcd60e51b815260040161028c90611782565b60405180910390fd5b60006102a186836109a7565b90506102ad8582610adb565b6040517f55c524c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616906355c524c1906103019087908790600401611633565b600060405180830381600087803b15801561031b57600080fd5b505af115801561032f573d6000803e3d6000fd5b50505050505050505050565b60608183111561035d5760405162461bcd60e51b815260040161028c906116b7565b82820360010160608167ffffffffffffffff8111801561037c57600080fd5b506040519080825280602002602001820160405280156103a6578160200160208202803683370190505b50905060005b828110156103e75785810160009081526001602052604090205482518390839081106103d457fe5b60209081029190910101526001016103ac565b50949350505050565b3373ffffffffffffffffffffffffffffffffffffffff8316146104255760405162461bcd60e51b815260040161028c90611782565b600061043183836109a7565b905061043d8382610adb565b505050565b6060818311156104645760405162461bcd60e51b815260040161028c906116b7565b82820360010160608167ffffffffffffffff8111801561048357600080fd5b506040519080825280602002602001820160405280156104ad578160200160208202803683370190505b50905060005b8281101561051a57858101600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b168452909152902054825160ff9091169083908390811061050257fe5b911515602092830291909101909101526001016104b3565b5095945050505050565b61054f336105306107d1565b73ffffffffffffffffffffffffffffffffffffffff16146101aa610cbb565b6000838152600160205260409020541561057b5760405162461bcd60e51b815260040161028c9061174b565b60008381526001602052604090208290556105ce73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084610cc9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167fac24935fd910bc682b5ccb1a07b718cadf8cf2f6d1404c4f3ddc3662dae40e2982604051610634919061162a565b60405180910390a2505050565b3373ffffffffffffffffffffffffffffffffffffffff8516146106765760405162461bcd60e51b815260040161028c90611782565b600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8816845290915290205460ff16156106c65760405162461bcd60e51b815260040161028c90611714565b6106d28484848461084c565b6106ee5760405162461bcd60e51b815260040161028c90611680565b600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff88168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556107508483610d6c565b50505050565b610762336105306107d1565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b3373ffffffffffffffffffffffffffffffffffffffff8316146108225760405162461bcd60e51b815260040161028c90611782565b600061082e83836109a7565b905061043d8382610d6c565b60016020526000908152604090205481565b6000808584604051602001610862929190611416565b60405160208183030381529060405280519060200120905061089883600160008881526020019081526020016000205483610e38565b9695505050505050565b6108ae336105306107d1565b6108d273ffffffffffffffffffffffffffffffffffffffff821615156101ab610cbb565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006109b161100d565b60005b8351811015610ad3578381815181106109c957fe5b6020908102919091018101518051600090815260028352604080822073ffffffffffffffffffffffffffffffffffffffff8a168352909352919091205490925060ff1615610a295760405162461bcd60e51b815260040161028c90611714565b610a418583600001518460200151856040015161084c565b610a5d5760405162461bcd60e51b815260040161028c90611680565b6020820151610a6d908490610ed5565b8251600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155909350016109b4565b505092915050565b8015610cb757604080516001808252818301909252606091816020015b610b0061102e565b815260200190600190039081610af85750506040805160a081018252600080825273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660208401529282018690523060608301529186166080820152825192935091839190610b8157fe5b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e84604051610c09919061162a565b60405180910390a36040517f0e8e3e8400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690630e8e3e8490610c83908490600401611588565b600060405180830381600087803b158015610c9d57600080fd5b505af1158015610cb1573d6000803e3d6000fd5b50505050505b5050565b81610cb757610cb781610eee565b610750846323b872dd60e01b858585604051602401610cea939291906114b3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610f41565b8015610cb7577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e83604051610def919061162a565b60405180910390a3610cb773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168383610fee565b600081815b8551811015610eca576000868281518110610e5457fe5b60200260200101519050808311610e95578281604051602001610e7892919061144b565b604051602081830303815290604052805190602001209250610ec1565b8083604051602001610ea892919061144b565b6040516020818303038152906040528051906020012092505b50600101610e3d565b509092149392505050565b6000828201610ee78482101583610cbb565b9392505050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051610f6a9190611459565b6000604051808303816000865af19150503d8060008114610fa7576040519150601f19603f3d011682016040523d82523d6000602084013e610fac565b606091505b50915091506000821415610fc4573d6000803e3d6000fd5b610750815160001480610fe6575081806020019051810190610fe69190611349565b6101a2610cbb565b61043d8363a9059cbb60e01b8484604051602401610cea9291906114e4565b60405180606001604052806000815260200160008152602001606081525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b600082601f83011261106e578081fd5b813561108161107c826117e0565b6117b9565b8181529150602080830190848101818402860182018710156110a257600080fd5b60005b848110156110c1578135845292820192908201906001016110a5565b505050505092915050565b600082601f8301126110dc578081fd5b81356110ea61107c826117e0565b818152915060208083019084810160005b848110156110c157813587016060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561113a57600080fd5b611143816117b9565b82860135815260408084013582880152918301359167ffffffffffffffff83111561116d57600080fd5b61117b8c888587010161105e565b908201528652505092820192908201906001016110fb565b6000602082840312156111a4578081fd5b8135610ee781611800565b600080604083850312156111c1578081fd5b82356111cc81611800565b9150602083013567ffffffffffffffff8111156111e7578182fd5b6111f3858286016110cc565b9150509250929050565b600080600080600060808688031215611214578081fd5b853561121f81611800565b9450602086013561122f81611800565b9350604086013567ffffffffffffffff8082111561124b578283fd5b818801915088601f83011261125e578283fd5b81358181111561126c578384fd5b89602082850101111561127d578384fd5b60208301955080945050606088013591508082111561129a578283fd5b506112a7888289016110cc565b9150509295509295909350565b6000806000606084860312156112c8578283fd5b83356112d381611800565b95602085013595506040909401359392505050565b600080600080608085870312156112fd578384fd5b843561130881611800565b93506020850135925060408501359150606085013567ffffffffffffffff811115611331578182fd5b61133d8782880161105e565b91505092959194509250565b60006020828403121561135a578081fd5b81518015158114610ee7578182fd5b60006020828403121561137a578081fd5b5035919050565b60008060408385031215611393578182fd5b8235915060208301356113a581611800565b809150509250929050565b6000806000606084860312156113c4578283fd5b505081359360208301359350604090920135919050565b600080604083850312156113ed578182fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff169052565b60609290921b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168252601482015260340190565b918252602082015260400190565b60008251815b81811015611479576020818601810151858301520161145f565b818111156114875782828501525b509190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015611544578351151583529284019291840191600101611526565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156115445783518352928401929184019160010161156c565b602080825282518282018190526000919060409081850190868401855b828110156116125781518051600481106115bb57fe5b8552808701516115cd888701826113fc565b5085810151868601526060808201516115e8828801826113fc565b5050608090810151906115fd868201836113fc565b505060a09390930192908501906001016115a5565b5091979650505050505050565b901515815260200190565b90815260200190565b60006020825282602083015282846040840137818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b60208082526016908201527f496e636f7272656374206d65726b6c652070726f6f6600000000000000000000604082015260600190565b6020808252602a908201527f7765656b73206d7573742062652073706563696669656420696e20617363656e60408201527f64696e67206f7264657200000000000000000000000000000000000000000000606082015260800190565b60208082526012908201527f63616e6e6f7420636c61696d2074776963650000000000000000000000000000604082015260600190565b6020808252601a908201527f63616e6e6f742072657772697465206d65726b6c6520726f6f74000000000000604082015260600190565b6020808252601b908201527f75736572206d75737420636c61696d206f776e2062616c616e63650000000000604082015260600190565b60405181810167ffffffffffffffff811182821017156117d857600080fd5b604052919050565b600067ffffffffffffffff8211156117f6578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff8116811461182257600080fd5b5056fea264697066735822122020b0baae4b1a76991e361d11c2638147ed3f96d070df8981472a23702da9ab3764736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100f55760003560e01c8063715018a611610097578063eb0d07f511610066578063eb0d07f514610201578063f2fde38b14610214578063f7c618c114610227578063fbfa77cf1461022f576100f5565b8063715018a6146101b15780638da5cb5b146101b9578063c804c39a146101ce578063dd8c9c9d146101e1576100f5565b80633d421653116100d35780633d4216531461015857806347fb23c11461016b5780634cd488ab1461018b57806358b4e4b41461019e576100f5565b8063120aa877146100fa5780632f1868e41461012357806339436b0014610138575b600080fd5b61010d610108366004611381565b610237565b60405161011a919061161f565b60405180910390f35b6101366101313660046111fd565b610257565b005b61014b6101463660046113db565b61033b565b60405161011a9190611550565b6101366101663660046111af565b6103f0565b61017e6101793660046112b4565b610442565b60405161011a919061150a565b6101366101993660046113b0565b610524565b6101366101ac3660046112e8565b610641565b610136610756565b6101c16107d1565b60405161011a9190611492565b6101366101dc3660046111af565b6107ed565b6101f46101ef366004611369565b61083a565b60405161011a919061162a565b61010d61020f3660046112e8565b61084c565b610136610222366004611193565b6108a2565b6101c161095f565b6101c1610983565b600260209081526000928352604080842090915290825290205460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff8616146102955760405162461bcd60e51b815260040161028c90611782565b60405180910390fd5b60006102a186836109a7565b90506102ad8582610adb565b6040517f55c524c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616906355c524c1906103019087908790600401611633565b600060405180830381600087803b15801561031b57600080fd5b505af115801561032f573d6000803e3d6000fd5b50505050505050505050565b60608183111561035d5760405162461bcd60e51b815260040161028c906116b7565b82820360010160608167ffffffffffffffff8111801561037c57600080fd5b506040519080825280602002602001820160405280156103a6578160200160208202803683370190505b50905060005b828110156103e75785810160009081526001602052604090205482518390839081106103d457fe5b60209081029190910101526001016103ac565b50949350505050565b3373ffffffffffffffffffffffffffffffffffffffff8316146104255760405162461bcd60e51b815260040161028c90611782565b600061043183836109a7565b905061043d8382610adb565b505050565b6060818311156104645760405162461bcd60e51b815260040161028c906116b7565b82820360010160608167ffffffffffffffff8111801561048357600080fd5b506040519080825280602002602001820160405280156104ad578160200160208202803683370190505b50905060005b8281101561051a57858101600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b168452909152902054825160ff9091169083908390811061050257fe5b911515602092830291909101909101526001016104b3565b5095945050505050565b61054f336105306107d1565b73ffffffffffffffffffffffffffffffffffffffff16146101aa610cbb565b6000838152600160205260409020541561057b5760405162461bcd60e51b815260040161028c9061174b565b60008381526001602052604090208290556105ce73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084610cc9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167fac24935fd910bc682b5ccb1a07b718cadf8cf2f6d1404c4f3ddc3662dae40e2982604051610634919061162a565b60405180910390a2505050565b3373ffffffffffffffffffffffffffffffffffffffff8516146106765760405162461bcd60e51b815260040161028c90611782565b600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8816845290915290205460ff16156106c65760405162461bcd60e51b815260040161028c90611714565b6106d28484848461084c565b6106ee5760405162461bcd60e51b815260040161028c90611680565b600083815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff88168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556107508483610d6c565b50505050565b610762336105306107d1565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b3373ffffffffffffffffffffffffffffffffffffffff8316146108225760405162461bcd60e51b815260040161028c90611782565b600061082e83836109a7565b905061043d8382610d6c565b60016020526000908152604090205481565b6000808584604051602001610862929190611416565b60405160208183030381529060405280519060200120905061089883600160008881526020019081526020016000205483610e38565b9695505050505050565b6108ae336105306107d1565b6108d273ffffffffffffffffffffffffffffffffffffffff821615156101ab610cbb565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006109b161100d565b60005b8351811015610ad3578381815181106109c957fe5b6020908102919091018101518051600090815260028352604080822073ffffffffffffffffffffffffffffffffffffffff8a168352909352919091205490925060ff1615610a295760405162461bcd60e51b815260040161028c90611714565b610a418583600001518460200151856040015161084c565b610a5d5760405162461bcd60e51b815260040161028c90611680565b6020820151610a6d908490610ed5565b8251600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155909350016109b4565b505092915050565b8015610cb757604080516001808252818301909252606091816020015b610b0061102e565b815260200190600190039081610af85750506040805160a081018252600080825273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660208401529282018690523060608301529186166080820152825192935091839190610b8157fe5b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e84604051610c09919061162a565b60405180910390a36040517f0e8e3e8400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690630e8e3e8490610c83908490600401611588565b600060405180830381600087803b158015610c9d57600080fd5b505af1158015610cb1573d6000803e3d6000fd5b50505050505b5050565b81610cb757610cb781610eee565b610750846323b872dd60e01b858585604051602401610cea939291906114b3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610f41565b8015610cb7577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e83604051610def919061162a565b60405180910390a3610cb773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168383610fee565b600081815b8551811015610eca576000868281518110610e5457fe5b60200260200101519050808311610e95578281604051602001610e7892919061144b565b604051602081830303815290604052805190602001209250610ec1565b8083604051602001610ea892919061144b565b6040516020818303038152906040528051906020012092505b50600101610e3d565b509092149392505050565b6000828201610ee78482101583610cbb565b9392505050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051610f6a9190611459565b6000604051808303816000865af19150503d8060008114610fa7576040519150601f19603f3d011682016040523d82523d6000602084013e610fac565b606091505b50915091506000821415610fc4573d6000803e3d6000fd5b610750815160001480610fe6575081806020019051810190610fe69190611349565b6101a2610cbb565b61043d8363a9059cbb60e01b8484604051602401610cea9291906114e4565b60405180606001604052806000815260200160008152602001606081525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b600082601f83011261106e578081fd5b813561108161107c826117e0565b6117b9565b8181529150602080830190848101818402860182018710156110a257600080fd5b60005b848110156110c1578135845292820192908201906001016110a5565b505050505092915050565b600082601f8301126110dc578081fd5b81356110ea61107c826117e0565b818152915060208083019084810160005b848110156110c157813587016060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561113a57600080fd5b611143816117b9565b82860135815260408084013582880152918301359167ffffffffffffffff83111561116d57600080fd5b61117b8c888587010161105e565b908201528652505092820192908201906001016110fb565b6000602082840312156111a4578081fd5b8135610ee781611800565b600080604083850312156111c1578081fd5b82356111cc81611800565b9150602083013567ffffffffffffffff8111156111e7578182fd5b6111f3858286016110cc565b9150509250929050565b600080600080600060808688031215611214578081fd5b853561121f81611800565b9450602086013561122f81611800565b9350604086013567ffffffffffffffff8082111561124b578283fd5b818801915088601f83011261125e578283fd5b81358181111561126c578384fd5b89602082850101111561127d578384fd5b60208301955080945050606088013591508082111561129a578283fd5b506112a7888289016110cc565b9150509295509295909350565b6000806000606084860312156112c8578283fd5b83356112d381611800565b95602085013595506040909401359392505050565b600080600080608085870312156112fd578384fd5b843561130881611800565b93506020850135925060408501359150606085013567ffffffffffffffff811115611331578182fd5b61133d8782880161105e565b91505092959194509250565b60006020828403121561135a578081fd5b81518015158114610ee7578182fd5b60006020828403121561137a578081fd5b5035919050565b60008060408385031215611393578182fd5b8235915060208301356113a581611800565b809150509250929050565b6000806000606084860312156113c4578283fd5b505081359360208301359350604090920135919050565b600080604083850312156113ed578182fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff169052565b60609290921b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168252601482015260340190565b918252602082015260400190565b60008251815b81811015611479576020818601810151858301520161145f565b818111156114875782828501525b509190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015611544578351151583529284019291840191600101611526565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156115445783518352928401929184019160010161156c565b602080825282518282018190526000919060409081850190868401855b828110156116125781518051600481106115bb57fe5b8552808701516115cd888701826113fc565b5085810151868601526060808201516115e8828801826113fc565b5050608090810151906115fd868201836113fc565b505060a09390930192908501906001016115a5565b5091979650505050505050565b901515815260200190565b90815260200190565b60006020825282602083015282846040840137818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b60208082526016908201527f496e636f7272656374206d65726b6c652070726f6f6600000000000000000000604082015260600190565b6020808252602a908201527f7765656b73206d7573742062652073706563696669656420696e20617363656e60408201527f64696e67206f7264657200000000000000000000000000000000000000000000606082015260800190565b60208082526012908201527f63616e6e6f7420636c61696d2074776963650000000000000000000000000000604082015260600190565b6020808252601a908201527f63616e6e6f742072657772697465206d65726b6c6520726f6f74000000000000604082015260600190565b6020808252601b908201527f75736572206d75737420636c61696d206f776e2062616c616e63650000000000604082015260600190565b60405181810167ffffffffffffffff811182821017156117d857600080fd5b604052919050565b600067ffffffffffffffff8211156117f6578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff8116811461182257600080fd5b5056fea264697066735822122020b0baae4b1a76991e361d11c2638147ed3f96d070df8981472a23702da9ab3764736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20210928-mcb-arbitrum-merkle/index.ts b/balpy/balancer-deployments/tasks/deprecated/20210928-mcb-arbitrum-merkle/index.ts new file mode 100644 index 0000000..8cc5194 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210928-mcb-arbitrum-merkle/index.ts @@ -0,0 +1,11 @@ +import { Task, TaskRunOptions } from '@src'; +import { MerkleRedeemDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + if (task.network != 'arbitrum') + throw new Error('Attempting to deploy MCDEX MerkleRedeem on the wrong network (should be arbitrum)'); + const input = task.input() as MerkleRedeemDeployment; + + const args = [input.Vault, input.rewardToken]; + await task.deployAndVerify('MerkleRedeem', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20210928-mcb-arbitrum-merkle/input.ts b/balpy/balancer-deployments/tasks/deprecated/20210928-mcb-arbitrum-merkle/input.ts new file mode 100644 index 0000000..feb7958 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210928-mcb-arbitrum-merkle/input.ts @@ -0,0 +1,15 @@ +import { Task, TaskMode } from '@src'; + +export type MerkleRedeemDeployment = { + Vault: string; + rewardToken: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + arbitrum: { + Vault, + rewardToken: '0x4e352cf164e64adcbad318c3a1e222e9eba4ce42', + }, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20210928-mcb-arbitrum-merkle/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20210928-mcb-arbitrum-merkle/output/arbitrum.json new file mode 100644 index 0000000..eced0ed --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210928-mcb-arbitrum-merkle/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "MerkleRedeem": "0xC6bD2497332d24094eC16a7261eec5C412B5a2C1" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20210928-mcb-arbitrum-merkle/readme.md b/balpy/balancer-deployments/tasks/deprecated/20210928-mcb-arbitrum-merkle/readme.md new file mode 100644 index 0000000..f1a11bf --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210928-mcb-arbitrum-merkle/readme.md @@ -0,0 +1,12 @@ +# 2021-09-28 - Merkle Redeem for MCB rewards on arbitrum + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This distributor has been deprecated in favor of the veBAL system. + +Distributor contract for MCB rewards on arbitrum. + +## Useful Files + +- [Arbitrum mainnet address](./output/arbitrum.json) +- [`MerkleRedeem` artifact](./artifact/MerkleRedeem.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20210928-mcb-arbitrum-merkle/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20210928-mcb-arbitrum-merkle/test/task.fork.ts new file mode 100644 index 0000000..989dccc --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20210928-mcb-arbitrum-merkle/test/task.fork.ts @@ -0,0 +1,69 @@ +import hre, { ethers } from 'hardhat'; +import { Contract, BigNumber } from 'ethers'; + +import { bn, fp } from '@helpers/numbers'; +import { expectEqualWithError } from '@helpers/relativeError'; +import { MerkleTree } from '@helpers/merkleTree'; + +import { MAX_UINT256 } from '@helpers/constants'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; + +import { describeForkTest, getSigner, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; + +function encodeElement(address: string, balance: BigNumber): string { + return ethers.utils.solidityKeccak256(['address', 'uint'], [address, balance]); +} + +describeForkTest('MerkleRedeem', 'arbitrum', 1731663, function () { + let lp: SignerWithAddress, other: SignerWithAddress, whale: SignerWithAddress; + let distributor: Contract, token: Contract; + + let task: Task; + + const REWARD_TOKEN_ADDRESS = '0x4e352cf164e64adcbad318c3a1e222e9eba4ce42'; // MCB on arbitrum + const REWARD_WHALE_ADDRESS = '0x34851ea13bde818b1efe26d31377906b47c9bbe2'; + + before('run task', async () => { + task = new Task('20210928-mcb-arbitrum-merkle', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + distributor = await task.instanceAt('MerkleRedeem', task.output().MerkleRedeem); + }); + + before('load signers and transfer ownership', async () => { + lp = await getSigner(2); + other = await getSigner(3); + whale = await impersonate(REWARD_WHALE_ADDRESS); + token = await task.instanceAt('IERC20', REWARD_TOKEN_ADDRESS); + + await distributor.transferOwnership(whale.address); + await token.connect(whale).approve(distributor.address, MAX_UINT256); + }); + + describe('with an allocation defined', async () => { + let root: string; + let proof: string[]; + + before(() => { + const elements: string[] = [encodeElement(lp.address, fp(66)), encodeElement(other.address, fp(34))]; + + const merkleTree = new MerkleTree(elements); + root = merkleTree.getHexRoot(); + + proof = merkleTree.getHexProof(elements[0]); + }); + + it('can seed an allocation', async () => { + await distributor.connect(whale).seedAllocations(bn(0), root, fp(100)); + + const expectedReward = fp(100); + expectEqualWithError(await token.balanceOf(distributor.address), expectedReward, fp(1)); + }); + + it('can claim a reward', async () => { + await distributor.connect(whale).seedAllocations(bn(1), root, fp(100)); + + await distributor.connect(lp).claimWeek(lp.address, bn(1), fp(66), proof); + expectEqualWithError(await token.balanceOf(lp.address), fp(66), fp(1)); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/artifact/MerkleOrchard.json b/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/artifact/MerkleOrchard.json new file mode 100644 index 0000000..1b238d1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/artifact/MerkleOrchard.json @@ -0,0 +1,458 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "MerkleOrchard", + "sourceName": "contracts/MerkleOrchard.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "distributor", + "type": "address" + }, + { + "indexed": true, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "distributionId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "merkleRoot", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "DistributionAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "distributor", + "type": "address" + }, + { + "indexed": true, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "distributionId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "claimer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "DistributionClaimed", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "claimer", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "distributionId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "address", + "name": "distributor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenIndex", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "internalType": "struct MerkleOrchard.Claim[]", + "name": "claims", + "type": "tuple[]" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "claimDistributions", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "claimer", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "distributionId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "address", + "name": "distributor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenIndex", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "internalType": "struct MerkleOrchard.Claim[]", + "name": "claims", + "type": "tuple[]" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "claimDistributionsToInternalBalance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "claimer", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "distributionId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "address", + "name": "distributor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenIndex", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "internalType": "struct MerkleOrchard.Claim[]", + "name": "claims", + "type": "tuple[]" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "contract IDistributorCallback", + "name": "callbackContract", + "type": "address" + }, + { + "internalType": "bytes", + "name": "callbackData", + "type": "bytes" + } + ], + "name": "claimDistributionsWithCallback", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "merkleRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "distributionId", + "type": "uint256" + } + ], + "name": "createDistribution", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "distributor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "distributionId", + "type": "uint256" + } + ], + "name": "getDistributionRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "distributor", + "type": "address" + } + ], + "name": "getNextDistributionId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "distributor", + "type": "address" + } + ], + "name": "getRemainingBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "distributor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "distributionId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "claimer", + "type": "address" + } + ], + "name": "isClaimed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "distributor", + "type": "address" + }, + { + "internalType": "uint256", + "name": "distributionId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "claimer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "claimedBalance", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "name": "verifyClaim", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a060405234801561001057600080fd5b5060405161198738038061198783398101604081905261002f91610044565b60601b6001600160601b031916608052610072565b600060208284031215610055578081fd5b81516001600160a01b038116811461006b578182fd5b9392505050565b60805160601c6118f861008f600039806102dc52506118f86000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c80638d928af811610076578063ece123541161005b578063ece123541461016f578063fb97812814610182578063fea7364914610195576100be565b80638d928af814610147578063a68d1e9d1461015c576100be565b806362c8b7c9116100a757806362c8b7c91461010157806381ae8541146101145780638bf3e45714610134576100be565b80632b630140146100c3578063515ac052146100d8575b600080fd5b6100d66100d136600461119d565b6101a8565b005b6100eb6100e636600461138a565b6101bb565b6040516100f89190611659565b60405180910390f35b6100eb61010f3660046113dc565b610226565b610127610122366004611312565b61024e565b6040516100f89190611664565b6100d661014236600461119d565b610274565b61014f6102da565b6040516100f891906116ba565b6100d661016a366004611210565b6102fe565b6100d661017d366004611461565b6103e9565b610127610190366004611312565b6106a2565b6101276101a336600461134a565b6106c6565b6101b68384848460006106f7565b505050565b60008060006101c985610b23565b9150915060006101d98888610b31565b600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8916845282528083209583529490529290922054600190911b161515915050949350505050565b6000806102338888610b31565b90506102428187878787610b64565b98975050505050505050565b60008061025b8484610b31565b6000908152600360205260409020549150505b92915050565b3373ffffffffffffffffffffffffffffffffffffffff8416146102cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c3906117dd565b60405180910390fd5b6101b68384848460016106f7565b7f000000000000000000000000000000000000000000000000000000000000000090565b3373ffffffffffffffffffffffffffffffffffffffff87161461034d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c3906117dd565b61035b8684878760016106f7565b6040517f55c524c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906355c524c1906103af908590859060040161166d565b600060405180830381600087803b1580156103c957600080fd5b505af11580156103dd573d6000803e3d6000fd5b50505050505050505050565b3360006103f68683610b31565b6000818152602081905260409020549091508314806104215750600081815260208190526040902054155b610457576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c3906116db565b61047973ffffffffffffffffffffffffffffffffffffffff8716833087610bdf565b8573ffffffffffffffffffffffffffffffffffffffff1663095ea7b361049d6102da565b866040518363ffffffff1660e01b81526004016104bb92919061159c565b602060405180830381600087803b1580156104d557600080fd5b505af11580156104e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050d91906112eb565b50604080516001808252818301909252606091816020015b61052d610f61565b8152602001906001900390816105255750506040805160a081018252600080825273ffffffffffffffffffffffffffffffffffffffff8b1660208301529181018890523060608201819052608082015282519293509183919061058c57fe5b602002602001018190525061059f6102da565b73ffffffffffffffffffffffffffffffffffffffff16630e8e3e84826040518263ffffffff1660e01b81526004016105d791906115c2565b600060405180830381600087803b1580156105f157600080fd5b505af1158015610605573d6000803e3d6000fd5b505050600083815260036020908152604080832080548a019055600180835281842089855283528184208b9055868452918390529182902090870190555173ffffffffffffffffffffffffffffffffffffffff808a1692508516907f24a80c4e3ef74c732b163bfb2decfbe077a51aef3b708c93f8ef3dd06fc3ea7c906106919088908b908b90611840565b60405180910390a350505050505050565b6000806106af8484610b31565b600090815260208190526040902054949350505050565b6000806106d38585610b31565b60009081526001602090815260408083208684529091529020549150509392505050565b6060825167ffffffffffffffff8111801561071157600080fd5b5060405190808252806020026020018201604052801561073b578160200160208202803683370190505b50905060008060008061074c610f91565b60005b89518110156109715789818151811061076457fe5b6020026020010151915060008061077e8460000151610b23565b915091506107a78b85606001518151811061079557fe5b60200260200101518560400151610b31565b8814156107e957818714156107c457806001901b861795506107db565b6107d0888f8989610c88565b819650806001901b95505b83602001518501945061082c565b8715610805576107fb888f8989610c88565b6108058886610d3c565b6108188b85606001518151811061079557fe5b9750819650806001901b9550836020015194505b505060018a510381141561085057610846868d8787610c88565b6108508684610d3c565b6108698683600001518e85602001518660800151610b64565b61089f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c3906117a6565b8160200151878360600151815181106108b457fe5b6020026020010181815101915081815250508b73ffffffffffffffffffffffffffffffffffffffff16898360600151815181106108ed57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16836040015173ffffffffffffffffffffffffffffffffffffffff167ff3f33f2319d28d6a1402aa9e6ca0ae16d3ada035d576b3b8074b422aaa03b69885600001518f876020015160405161096193929190611814565b60405180910390a460010161074f565b50600087610980576001610983565b60025b90506060895167ffffffffffffffff8111801561099f57600080fd5b506040519080825280602002602001820160405280156109d957816020015b6109c6610f61565b8152602001906001900390816109be5790505b50905060005b8a51811015610aa1576040518060a001604052808460038111156109ff57fe5b81526020018c8381518110610a1057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018a8381518110610a3f57fe5b602002602001015181526020013073ffffffffffffffffffffffffffffffffffffffff1681526020018e73ffffffffffffffffffffffffffffffffffffffff16815250828281518110610a8e57fe5b60209081029190910101526001016109df565b50610aaa6102da565b73ffffffffffffffffffffffffffffffffffffffff16630e8e3e84826040518263ffffffff1660e01b8152600401610ae291906115c2565b600060405180830381600087803b158015610afc57600080fd5b505af1158015610b10573d6000803e3d6000fd5b5050505050505050505050505050505050565b61010081049160ff90911690565b60008282604051602001610b46929190611531565b60405160208183030381529060405280519060200120905092915050565b6000808484604051602001610b7a9291906114b5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008a8152600184528281208a8252909352912054909150610bd490849083610d9d565b979650505050505050565b610c82846323b872dd60e01b858585604051602401610c009392919061156b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610e3a565b50505050565b600084815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452825280832085845290915290205481811615610cfa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c390611712565b600094855260026020908152604080872073ffffffffffffffffffffffffffffffffffffffff9096168752948152848620938652929092529190922091179055565b600082815260036020526040902054811115610d84576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c390611749565b6000918252600360205260409091208054919091039055565b600081815b8551811015610e2f576000868281518110610db957fe5b60200260200101519050808311610dfa578281604051602001610ddd9291906114ea565b604051602081830303815290604052805190602001209250610e26565b8083604051602001610e0d9291906114ea565b6040516020818303038152906040528051906020012092505b50600101610da2565b509092149392505050565b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051610e6391906114f8565b6000604051808303816000865af19150503d8060008114610ea0576040519150601f19603f3d011682016040523d82523d6000602084013e610ea5565b606091505b50915091506000821415610ebd573d6000803e3d6000fd5b610c82815160001480610edf575081806020019051810190610edf91906112eb565b6101a281610ef057610ef081610ef4565b5050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b6040518060a001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b803561026e8161189d565b600082601f830112610ff1578081fd5b8135611004610fff8261187d565b611856565b81815291506020808301908481018184028601820187101561102557600080fd5b60005b8481101561104457813584529282019290820190600101611028565b505050505092915050565b600082601f83011261105f578081fd5b813561106d610fff8261187d565b81815291506020808301908481018184028601820187101561108e57600080fd5b60005b848110156110445781356110a48161189d565b84529282019290820190600101611091565b600082601f8301126110c6578081fd5b81356110d4610fff8261187d565b818152915060208083019084810160005b84811015611044578135870160a0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561112457600080fd5b61112d81611856565b85830135815260408084013587830152606061114b8d828701610fd6565b828401526080915081850135818401525082840135925067ffffffffffffffff83111561117757600080fd5b6111858c8885870101610fe1565b908201528652505092820192908201906001016110e5565b6000806000606084860312156111b1578283fd5b83356111bc8161189d565b9250602084013567ffffffffffffffff808211156111d8578384fd5b6111e4878388016110b6565b935060408601359150808211156111f9578283fd5b506112068682870161104f565b9150509250925092565b60008060008060008060a08789031215611228578182fd5b86356112338161189d565b9550602087013567ffffffffffffffff8082111561124f578384fd5b61125b8a838b016110b6565b96506040890135915080821115611270578384fd5b61127c8a838b0161104f565b95506060890135915061128e8261189d565b909350608088013590808211156112a3578384fd5b818901915089601f8301126112b6578384fd5b8135818111156112c4578485fd5b8a60208285010111156112d5578485fd5b6020830194508093505050509295509295509295565b6000602082840312156112fc578081fd5b8151801515811461130b578182fd5b9392505050565b60008060408385031215611324578182fd5b823561132f8161189d565b9150602083013561133f8161189d565b809150509250929050565b60008060006060848603121561135e578283fd5b83356113698161189d565b925060208401356113798161189d565b929592945050506040919091013590565b6000806000806080858703121561139f578384fd5b84356113aa8161189d565b935060208501356113ba8161189d565b92506040850135915060608501356113d18161189d565b939692955090935050565b60008060008060008060c087890312156113f4578182fd5b86356113ff8161189d565b9550602087013561140f8161189d565b94506040870135935060608701356114268161189d565b92506080870135915060a087013567ffffffffffffffff811115611448578182fd5b61145489828a01610fe1565b9150509295509295509295565b60008060008060808587031215611476578182fd5b84356114818161189d565b966020860135965060408601359560600135945092505050565b73ffffffffffffffffffffffffffffffffffffffff169052565b60609290921b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168252601482015260340190565b918252602082015260400190565b60008251815b8181101561151857602081860181015185830152016114fe565b818111156115265782828501525b509190910192915050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606093841b811682529190921b16601482015260280190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561164c5781518051600481106115f557fe5b8552808701516116078887018261149b565b5085810151868601526060808201516116228288018261149b565b5050608090810151906116378682018361149b565b505060a09390930192908501906001016115df565b5091979650505050505050565b901515815260200190565b90815260200190565b60006020825282602083015282846040840137818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60208082526017908201527f696e76616c696420646973747269627574696f6e204944000000000000000000604082015260600190565b60208082526012908201527f63616e6e6f7420636c61696d2074776963650000000000000000000000000000604082015260600190565b60208082526037908201527f6469737472696275746f72206861736e27742070726f7669646564207375666660408201527f696369656e7420746f6b656e7320666f7220636c61696d000000000000000000606082015260800190565b60208082526016908201527f696e636f7272656374206d65726b6c652070726f6f6600000000000000000000604082015260600190565b6020808252601b908201527f75736572206d75737420636c61696d206f776e2062616c616e63650000000000604082015260600190565b92835273ffffffffffffffffffffffffffffffffffffffff919091166020830152604082015260600190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561187557600080fd5b604052919050565b600067ffffffffffffffff821115611893578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff811681146118bf57600080fd5b5056fea2646970667358221220f9a8e75dc6691ffb23712d46d1514f8655d6e950a762ea801145aba797c431b064736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100be5760003560e01c80638d928af811610076578063ece123541161005b578063ece123541461016f578063fb97812814610182578063fea7364914610195576100be565b80638d928af814610147578063a68d1e9d1461015c576100be565b806362c8b7c9116100a757806362c8b7c91461010157806381ae8541146101145780638bf3e45714610134576100be565b80632b630140146100c3578063515ac052146100d8575b600080fd5b6100d66100d136600461119d565b6101a8565b005b6100eb6100e636600461138a565b6101bb565b6040516100f89190611659565b60405180910390f35b6100eb61010f3660046113dc565b610226565b610127610122366004611312565b61024e565b6040516100f89190611664565b6100d661014236600461119d565b610274565b61014f6102da565b6040516100f891906116ba565b6100d661016a366004611210565b6102fe565b6100d661017d366004611461565b6103e9565b610127610190366004611312565b6106a2565b6101276101a336600461134a565b6106c6565b6101b68384848460006106f7565b505050565b60008060006101c985610b23565b9150915060006101d98888610b31565b600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8916845282528083209583529490529290922054600190911b161515915050949350505050565b6000806102338888610b31565b90506102428187878787610b64565b98975050505050505050565b60008061025b8484610b31565b6000908152600360205260409020549150505b92915050565b3373ffffffffffffffffffffffffffffffffffffffff8416146102cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c3906117dd565b60405180910390fd5b6101b68384848460016106f7565b7f000000000000000000000000000000000000000000000000000000000000000090565b3373ffffffffffffffffffffffffffffffffffffffff87161461034d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c3906117dd565b61035b8684878760016106f7565b6040517f55c524c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906355c524c1906103af908590859060040161166d565b600060405180830381600087803b1580156103c957600080fd5b505af11580156103dd573d6000803e3d6000fd5b50505050505050505050565b3360006103f68683610b31565b6000818152602081905260409020549091508314806104215750600081815260208190526040902054155b610457576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c3906116db565b61047973ffffffffffffffffffffffffffffffffffffffff8716833087610bdf565b8573ffffffffffffffffffffffffffffffffffffffff1663095ea7b361049d6102da565b866040518363ffffffff1660e01b81526004016104bb92919061159c565b602060405180830381600087803b1580156104d557600080fd5b505af11580156104e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050d91906112eb565b50604080516001808252818301909252606091816020015b61052d610f61565b8152602001906001900390816105255750506040805160a081018252600080825273ffffffffffffffffffffffffffffffffffffffff8b1660208301529181018890523060608201819052608082015282519293509183919061058c57fe5b602002602001018190525061059f6102da565b73ffffffffffffffffffffffffffffffffffffffff16630e8e3e84826040518263ffffffff1660e01b81526004016105d791906115c2565b600060405180830381600087803b1580156105f157600080fd5b505af1158015610605573d6000803e3d6000fd5b505050600083815260036020908152604080832080548a019055600180835281842089855283528184208b9055868452918390529182902090870190555173ffffffffffffffffffffffffffffffffffffffff808a1692508516907f24a80c4e3ef74c732b163bfb2decfbe077a51aef3b708c93f8ef3dd06fc3ea7c906106919088908b908b90611840565b60405180910390a350505050505050565b6000806106af8484610b31565b600090815260208190526040902054949350505050565b6000806106d38585610b31565b60009081526001602090815260408083208684529091529020549150509392505050565b6060825167ffffffffffffffff8111801561071157600080fd5b5060405190808252806020026020018201604052801561073b578160200160208202803683370190505b50905060008060008061074c610f91565b60005b89518110156109715789818151811061076457fe5b6020026020010151915060008061077e8460000151610b23565b915091506107a78b85606001518151811061079557fe5b60200260200101518560400151610b31565b8814156107e957818714156107c457806001901b861795506107db565b6107d0888f8989610c88565b819650806001901b95505b83602001518501945061082c565b8715610805576107fb888f8989610c88565b6108058886610d3c565b6108188b85606001518151811061079557fe5b9750819650806001901b9550836020015194505b505060018a510381141561085057610846868d8787610c88565b6108508684610d3c565b6108698683600001518e85602001518660800151610b64565b61089f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c3906117a6565b8160200151878360600151815181106108b457fe5b6020026020010181815101915081815250508b73ffffffffffffffffffffffffffffffffffffffff16898360600151815181106108ed57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16836040015173ffffffffffffffffffffffffffffffffffffffff167ff3f33f2319d28d6a1402aa9e6ca0ae16d3ada035d576b3b8074b422aaa03b69885600001518f876020015160405161096193929190611814565b60405180910390a460010161074f565b50600087610980576001610983565b60025b90506060895167ffffffffffffffff8111801561099f57600080fd5b506040519080825280602002602001820160405280156109d957816020015b6109c6610f61565b8152602001906001900390816109be5790505b50905060005b8a51811015610aa1576040518060a001604052808460038111156109ff57fe5b81526020018c8381518110610a1057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018a8381518110610a3f57fe5b602002602001015181526020013073ffffffffffffffffffffffffffffffffffffffff1681526020018e73ffffffffffffffffffffffffffffffffffffffff16815250828281518110610a8e57fe5b60209081029190910101526001016109df565b50610aaa6102da565b73ffffffffffffffffffffffffffffffffffffffff16630e8e3e84826040518263ffffffff1660e01b8152600401610ae291906115c2565b600060405180830381600087803b158015610afc57600080fd5b505af1158015610b10573d6000803e3d6000fd5b5050505050505050505050505050505050565b61010081049160ff90911690565b60008282604051602001610b46929190611531565b60405160208183030381529060405280519060200120905092915050565b6000808484604051602001610b7a9291906114b5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008a8152600184528281208a8252909352912054909150610bd490849083610d9d565b979650505050505050565b610c82846323b872dd60e01b858585604051602401610c009392919061156b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610e3a565b50505050565b600084815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452825280832085845290915290205481811615610cfa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c390611712565b600094855260026020908152604080872073ffffffffffffffffffffffffffffffffffffffff9096168752948152848620938652929092529190922091179055565b600082815260036020526040902054811115610d84576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102c390611749565b6000918252600360205260409091208054919091039055565b600081815b8551811015610e2f576000868281518110610db957fe5b60200260200101519050808311610dfa578281604051602001610ddd9291906114ea565b604051602081830303815290604052805190602001209250610e26565b8083604051602001610e0d9291906114ea565b6040516020818303038152906040528051906020012092505b50600101610da2565b509092149392505050565b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051610e6391906114f8565b6000604051808303816000865af19150503d8060008114610ea0576040519150601f19603f3d011682016040523d82523d6000602084013e610ea5565b606091505b50915091506000821415610ebd573d6000803e3d6000fd5b610c82815160001480610edf575081806020019051810190610edf91906112eb565b6101a281610ef057610ef081610ef4565b5050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b6040518060a001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b803561026e8161189d565b600082601f830112610ff1578081fd5b8135611004610fff8261187d565b611856565b81815291506020808301908481018184028601820187101561102557600080fd5b60005b8481101561104457813584529282019290820190600101611028565b505050505092915050565b600082601f83011261105f578081fd5b813561106d610fff8261187d565b81815291506020808301908481018184028601820187101561108e57600080fd5b60005b848110156110445781356110a48161189d565b84529282019290820190600101611091565b600082601f8301126110c6578081fd5b81356110d4610fff8261187d565b818152915060208083019084810160005b84811015611044578135870160a0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561112457600080fd5b61112d81611856565b85830135815260408084013587830152606061114b8d828701610fd6565b828401526080915081850135818401525082840135925067ffffffffffffffff83111561117757600080fd5b6111858c8885870101610fe1565b908201528652505092820192908201906001016110e5565b6000806000606084860312156111b1578283fd5b83356111bc8161189d565b9250602084013567ffffffffffffffff808211156111d8578384fd5b6111e4878388016110b6565b935060408601359150808211156111f9578283fd5b506112068682870161104f565b9150509250925092565b60008060008060008060a08789031215611228578182fd5b86356112338161189d565b9550602087013567ffffffffffffffff8082111561124f578384fd5b61125b8a838b016110b6565b96506040890135915080821115611270578384fd5b61127c8a838b0161104f565b95506060890135915061128e8261189d565b909350608088013590808211156112a3578384fd5b818901915089601f8301126112b6578384fd5b8135818111156112c4578485fd5b8a60208285010111156112d5578485fd5b6020830194508093505050509295509295509295565b6000602082840312156112fc578081fd5b8151801515811461130b578182fd5b9392505050565b60008060408385031215611324578182fd5b823561132f8161189d565b9150602083013561133f8161189d565b809150509250929050565b60008060006060848603121561135e578283fd5b83356113698161189d565b925060208401356113798161189d565b929592945050506040919091013590565b6000806000806080858703121561139f578384fd5b84356113aa8161189d565b935060208501356113ba8161189d565b92506040850135915060608501356113d18161189d565b939692955090935050565b60008060008060008060c087890312156113f4578182fd5b86356113ff8161189d565b9550602087013561140f8161189d565b94506040870135935060608701356114268161189d565b92506080870135915060a087013567ffffffffffffffff811115611448578182fd5b61145489828a01610fe1565b9150509295509295509295565b60008060008060808587031215611476578182fd5b84356114818161189d565b966020860135965060408601359560600135945092505050565b73ffffffffffffffffffffffffffffffffffffffff169052565b60609290921b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168252601482015260340190565b918252602082015260400190565b60008251815b8181101561151857602081860181015185830152016114fe565b818111156115265782828501525b509190910192915050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606093841b811682529190921b16601482015260280190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561164c5781518051600481106115f557fe5b8552808701516116078887018261149b565b5085810151868601526060808201516116228288018261149b565b5050608090810151906116378682018361149b565b505060a09390930192908501906001016115df565b5091979650505050505050565b901515815260200190565b90815260200190565b60006020825282602083015282846040840137818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60208082526017908201527f696e76616c696420646973747269627574696f6e204944000000000000000000604082015260600190565b60208082526012908201527f63616e6e6f7420636c61696d2074776963650000000000000000000000000000604082015260600190565b60208082526037908201527f6469737472696275746f72206861736e27742070726f7669646564207375666660408201527f696369656e7420746f6b656e7320666f7220636c61696d000000000000000000606082015260800190565b60208082526016908201527f696e636f7272656374206d65726b6c652070726f6f6600000000000000000000604082015260600190565b6020808252601b908201527f75736572206d75737420636c61696d206f776e2062616c616e63650000000000604082015260600190565b92835273ffffffffffffffffffffffffffffffffffffffff919091166020830152604082015260600190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561187557600080fd5b604052919050565b600067ffffffffffffffff821115611893578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff811681146118bf57600080fd5b5056fea2646970667358221220f9a8e75dc6691ffb23712d46d1514f8655d6e950a762ea801145aba797c431b064736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/index.ts b/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/index.ts new file mode 100644 index 0000000..c96a450 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { MerkleOrchardDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as MerkleOrchardDeployment; + + const merkleOrchardArgs = [input.Vault]; + await task.deployAndVerify('MerkleOrchard', merkleOrchardArgs, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/input.ts b/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/input.ts new file mode 100644 index 0000000..85b4e3f --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type MerkleOrchardDeployment = { + Vault: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/output/arbitrum.json new file mode 100644 index 0000000..36a13bd --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "MerkleOrchard": "0x751A0bC0e3f75b38e01Cf25bFCE7fF36DE1C87DE" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/output/goerli.json new file mode 100644 index 0000000..161a22d --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/output/goerli.json @@ -0,0 +1,3 @@ +{ + "MerkleOrchard": "0x35b50C7955e7D0E8298e043C9F4dCDef737b9f5a" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/output/kovan.json b/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/output/kovan.json new file mode 100644 index 0000000..cb907f9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/output/kovan.json @@ -0,0 +1,3 @@ +{ + "MerkleOrchard": "0xc33e0fE411322009947931c32d2273ee645cDb5B" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/output/mainnet.json new file mode 100644 index 0000000..4e3b792 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "MerkleOrchard": "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/output/polygon.json new file mode 100644 index 0000000..5f16b59 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/output/polygon.json @@ -0,0 +1,3 @@ +{ + "MerkleOrchard": "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/output/rinkeby.json b/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/output/rinkeby.json new file mode 100644 index 0000000..5f16b59 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/output/rinkeby.json @@ -0,0 +1,3 @@ +{ + "MerkleOrchard": "0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/readme.md b/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/readme.md new file mode 100644 index 0000000..eeb39c1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211012-merkle-orchard/readme.md @@ -0,0 +1,16 @@ +# 2021-10-12 - Merkle Orchard + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This distributor has been deprecated in favor of the veBAL system. +> A patched version of the orchard can be found [here](../../20230222-merkle-orchard-v2), which fixes the double-claim issue described in [this report](https://medium.com/immunefi/balancer-logic-error-bugfix-review-74f5edca8b1a) + +Deployment of the `MerkleOrchard`, for distributing tokens via Merkle Trees + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet address](./output/polygon.json) +- [Arbitrum mainnet address](./output/arbitrum.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`MerkleOrchard` artifact](./artifact/MerkleOrchard.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/artifact/BatchRelayerLibrary.json b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/artifact/BatchRelayerLibrary.json new file mode 100644 index 0000000..bd5caa5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/artifact/BatchRelayerLibrary.json @@ -0,0 +1,758 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BatchRelayerLibrary", + "sourceName": "contracts/BatchRelayerLibrary.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wstETH", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approveVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "assetInIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "assetOutIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IVault.BatchSwapStep[]", + "name": "swaps", + "type": "tuple[]" + }, + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + }, + { + "internalType": "int256[]", + "name": "limits", + "type": "int256[]" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "key", + "type": "uint256" + } + ], + "internalType": "struct VaultActions.OutputReference[]", + "name": "outputReferences", + "type": "tuple[]" + } + ], + "name": "batchSwap", + "outputs": [ + { + "internalType": "int256[]", + "name": "", + "type": "int256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "enum VaultActions.PoolKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "minAmountsOut", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.ExitPoolRequest", + "name": "request", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "key", + "type": "uint256" + } + ], + "internalType": "struct VaultActions.OutputReference[]", + "name": "outputReferences", + "type": "tuple[]" + } + ], + "name": "exitPool", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "getEntrypoint", + "outputs": [ + { + "internalType": "contract IBalancerRelayer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "enum VaultActions.PoolKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "maxAmountsIn", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.JoinPoolRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "joinPool", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.UserBalanceOpKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IAsset", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + } + ], + "internalType": "struct IVault.UserBalanceOp[]", + "name": "ops", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "manageUserBalance", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "relayer", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "authorisation", + "type": "bytes" + } + ], + "name": "setRelayerApproval", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "stakeETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "stakeETHAndWrap", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IAsset", + "name": "assetIn", + "type": "address" + }, + { + "internalType": "contract IAsset", + "name": "assetOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IVault.SingleSwap", + "name": "singleSwap", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "limit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "swap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStaticATokenLM", + "name": "staticToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "toUnderlying", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapAaveStaticToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapWstETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20Permit", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "vaultPermit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20PermitDAI", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "holder", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "vaultPermitDAI", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStaticATokenLM", + "name": "staticToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "fromUnderlying", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapAaveDynamicToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapStETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x6101406040527fae1dc54057af8e8e5ce068cdd4383149c7efcb30e8fb95b592ee1594367fb50960e0523480156200003657600080fd5b5060405162004415380380620044158339810160408190526200005991620001fa565b8082806001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200009557600080fd5b505afa158015620000aa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d0919062000238565b6001600160601b0319606091821b81166080529082901b1660a05260405181903090620000fd90620001ec565b6200010a9291906200025e565b604051809103906000f08015801562000127573d6000803e3d6000fd5b5060601b6001600160601b03191660c052506001600160a01b03811662000150576000620001c7565b806001600160a01b031663c1fe3e486040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200018c57600080fd5b505af1158015620001a1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001c7919062000238565b6001600160601b0319606091821b81166101005291901b166101205250620002919050565b61074f8062003cc683390190565b600080604083850312156200020d578182fd5b82516200021a8162000278565b60208401519092506200022d8162000278565b809150509250929050565b6000602082840312156200024a578081fd5b8151620002578162000278565b9392505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03811681146200028e57600080fd5b50565b60805160601c60a05160601c60c05160601c60e0516101005160601c6101205160601c6139a562000321600039806102e6528061037a52806103e05280610770528061082052806108e95280611ab55280611b0d5250806106ee528061074352806109b15280610a905280611bd6525080611fad525080610fc35250806110c3528061116d5250506139a56000f3fe60806040526004361061010e5760003560e01c806380db15bd116100a5578063959fc17a11610074578063d80952d511610059578063d80952d514610260578063db4c0e9114610273578063ecc02637146102865761010e565b8063959fc17a1461022d578063b6d24737146102405761010e565b806380db15bd146101df5780638d64cfbc146101f25780638d928af8146102055780638fe4624f1461021a5761010e565b80632e6272ea116100e15780632e6272ea14610177578063433b0865146101975780637ab6e03c146101aa5780637fd0e5d5146101bd5761010e565b80631089e5e31461011357806318369446146101285780631c982441146101515780632cbec84e14610164575b600080fd5b610126610121366004612926565b610299565b005b61013b610136366004612e6a565b610489565b6040516101489190613438565b60405180910390f35b61012661015f366004612854565b610696565b610126610172366004612926565b610993565b61018a610185366004612f66565b610ac7565b604051610148919061389f565b6101266101a5366004612d24565b610bf4565b6101266101b8366004612d24565b610ea3565b3480156101c957600080fd5b506101d2610fc1565b60405161014891906132b4565b6101266101ed366004612899565b610fe5565b610126610200366004612c6f565b6110f1565b34801561021157600080fd5b506101d261116b565b610126610228366004612b5f565b61118f565b61012661023b366004612bee565b6113c6565b34801561024c57600080fd5b5061012661025b366004612cf9565b611443565b61012661026e366004612ab7565b6114cf565b610126610281366004612854565b611a5d565b6101266102943660046129ea565b611c0d565b6102a282611d05565b156102b3576102b082611d50565b91505b6040517fb0e389000000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b0e389009061031b90869060040161389f565b60206040518083038186803b15801561033357600080fd5b505afa158015610347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036b9190613054565b90506103a06001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001684611d6a565b6001600160a01b038416301461046b576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb9061041790879085906004016133d0565b602060405180830381600087803b15801561043157600080fd5b505af1158015610445573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104699190612a9b565b505b61047482611d05565b15610483576104838282611de4565b50505050565b60603361049960208a018a612838565b6001600160a01b031614806104c25750306104b760208a018a612838565b6001600160a01b0316145b6104e75760405162461bcd60e51b81526004016104de9061376f565b60405180910390fd5b60005b8b5181101561054c5760008c828151811061050157fe5b602002602001015160600151905061051881611d05565b156105435761052681611d50565b8d838151811061053257fe5b602002602001015160600181815250505b506001016104ea565b50606061055761116b565b6001600160a01b031663945bcec9868f8f8f8f8f8f8f8f6040518a63ffffffff1660e01b8152600401610591989796959493929190613666565b6000604051808303818588803b1580156105aa57600080fd5b505af11580156105be573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526105e7919081019061295a565b905060005b838110156106855761061285858381811061060357fe5b90506040020160200135611d05565b61062e5760405162461bcd60e51b81526004016104de906137dd565b61067d85858381811061063d57fe5b905060400201602001356106788488888681811061065757fe5b905060400201600001358151811061066b57fe5b6020026020010151611df7565b611de4565b6001016105ec565b509c9b505050505050505050505050565b61069f82611d05565b156106b0576106ad82611d50565b91505b6001600160a01b0384163014610713576001600160a01b03841633146106e85760405162461bcd60e51b81526004016104de9061376f565b610713847f000000000000000000000000000000000000000000000000000000000000000084611e11565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b39061079a907f00000000000000000000000000000000000000000000000000000000000000009086906004016133d0565b602060405180830381600087803b1580156107b457600080fd5b505af11580156107c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ec9190612a9b565b506040517fea598cb00000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ea598cb09061085590869060040161389f565b602060405180830381600087803b15801561086f57600080fd5b505af1158015610883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a79190613054565b90506001600160a01b0384163014610974576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb9061092090879085906004016133d0565b602060405180830381600087803b15801561093a57600080fd5b505af115801561094e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109729190612a9b565b505b61097d82611d05565b1561098c5761098c8282611de4565b5050505050565b61099c82611d05565b156109ad576109aa82611d50565b91505b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a1903eab84306040518363ffffffff1660e01b81526004016109fc91906132b4565b6020604051808303818588803b158015610a1557600080fd5b505af1158015610a29573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610a4e9190613054565b90506001600160a01b038416301461046b576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb9061041790879085906004016133d0565b600033610ad76020880188612838565b6001600160a01b03161480610b00575030610af56020880188612838565b6001600160a01b0316145b610b1c5760405162461bcd60e51b81526004016104de9061376f565b610b298760800151611d05565b15610b4157610b3b8760800151611d50565b60808801525b6000610b4b61116b565b6001600160a01b03166352bbbe29858a8a8a8a6040518663ffffffff1660e01b8152600401610b7d9493929190613814565b6020604051808303818588803b158015610b9657600080fd5b505af1158015610baa573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610bcf9190613054565b9050610bda83611d05565b15610be957610be98382611de4565b979650505050505050565b610bfd83611d05565b15610c0e57610c0b83611d50565b92505b600082610c8d57866001600160a01b03166351c0e0616040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610c5057600080fd5b505af1158015610c64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c889190612cdd565b610d00565b866001600160a01b0316634800d97f6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610cc857600080fd5b505af1158015610cdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d009190612cdd565b90506001600160a01b0386163014610d45576001600160a01b0386163314610d3a5760405162461bcd60e51b81526004016104de9061376f565b610d45868286611e11565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b390610d8c908a9088906004016133d0565b602060405180830381600087803b158015610da657600080fd5b505af1158015610dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dde9190612a9b565b506040517f2f2cab870000000000000000000000000000000000000000000000000000000081526000906001600160a01b03891690632f2cab8790610e2d908990899086908a9060040161340c565b602060405180830381600087803b158015610e4757600080fd5b505af1158015610e5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7f9190613054565b9050610e8a83611d05565b15610e9957610e998382611de4565b5050505050505050565b610eac83611d05565b15610ebd57610eba83611d50565b92505b6001600160a01b0385163014610f00576001600160a01b0385163314610ef55760405162461bcd60e51b81526004016104de9061376f565b610f00858785611e11565b6040517fead5d3590000000000000000000000000000000000000000000000000000000081526000906001600160a01b0388169063ead5d35990610f4c908890889088906004016133e9565b6040805180830381600087803b158015610f6557600080fd5b505af1158015610f79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9d919061306c565b915050610fa982611d05565b15610fb857610fb88282611de4565b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b038416301480610ffa575082155b6110165760405162461bcd60e51b81526004016104de906137a6565b606063fa6e671d60e01b338686604051602401611035939291906132c8565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090951694909417909352516110a4928691869101613281565b60408051601f1981840301815291905290506110e96001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001682611ead565b505050505050565b866001600160a01b031663d505accf8761110961116b565b88888888886040518863ffffffff1660e01b8152600401611130979695949392919061338f565b600060405180830381600087803b15801561114a57600080fd5b505af115801561115e573d6000803e3d6000fd5b5050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b0385163314806111ae57506001600160a01b03851630145b6111ca5760405162461bcd60e51b81526004016104de9061376f565b60006111d588611f25565b905060006111e283611d05565b6111ed576000611282565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038316906370a08231906112329089906004016132b4565b60206040518083038186803b15801561124a57600080fd5b505afa15801561125e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112829190613054565b9050611292888660400151611f2b565b604086015261129f61116b565b6001600160a01b031663b95cac28858b8a8a8a6040518663ffffffff1660e01b81526004016112d194939291906135c0565b6000604051808303818588803b1580156112ea57600080fd5b505af11580156112fe573d6000803e3d6000fd5b505050505061130c83611d05565b156113bb576040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038416906370a0823190611359908a906004016132b4565b60206040518083038186803b15801561137157600080fd5b505afa158015611385573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a99190613054565b90506113b9846106788385611f59565b505b505050505050505050565b876001600160a01b0316638fcbaf0c886113de61116b565b8989898989896040518963ffffffff1660e01b8152600401611407989796959493929190613346565b600060405180830381600087803b15801561142157600080fd5b505af1158015611435573d6000803e3d6000fd5b505050505050505050505050565b816001600160a01b031663095ea7b361145a61116b565b836040518363ffffffff1660e01b81526004016114789291906133d0565b602060405180830381600087803b15801561149257600080fd5b505af11580156114a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ca9190612a9b565b505050565b6001600160a01b0385163314806114ee57506001600160a01b03851630145b61150a5760405162461bcd60e51b81526004016104de9061376f565b60608167ffffffffffffffff8111801561152357600080fd5b5060405190808252806020026020018201604052801561154d578160200160208202803683370190505b50905060608267ffffffffffffffff8111801561156957600080fd5b50604051908082528060200260200182016040528015611593578160200160208202803683370190505b50905060005b83811015611703576115b085858381811061060357fe5b6115cc5760405162461bcd60e51b81526004016104de906137dd565b85516000908686848181106115dd57fe5b90506040020160000135815181106115f157fe5b6020026020010151905086606001511561163f5761160e81611f6f565b84838151811061161a57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506116fa565b61164881611f72565b6116d55761165581611f6f565b6001600160a01b03166370a08231896040518263ffffffff1660e01b815260040161168091906132b4565b60206040518083038186803b15801561169857600080fd5b505afa1580156116ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d09190613054565b6116e1565b876001600160a01b0316315b8383815181106116ed57fe5b6020026020010181815250505b50600101611599565b5084606001511561179a5761171661116b565b6001600160a01b0316630f5a6efa87846040518363ffffffff1660e01b81526004016117439291906132ec565b60006040518083038186803b15801561175b57600080fd5b505afa15801561176f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117979190810190612a60565b90505b6117a8888660400151611f7f565b60408601526117b561116b565b6001600160a01b0316638bdb39138a8989896040518563ffffffff1660e01b81526004016117e694939291906135c0565b600060405180830381600087803b15801561180057600080fd5b505af1158015611814573d6000803e3d6000fd5b50606092508591505067ffffffffffffffff8111801561183357600080fd5b5060405190808252806020026020018201604052801561185d578160200160208202803683370190505b5090508560600151156118fa5761187261116b565b6001600160a01b0316630f5a6efa88856040518363ffffffff1660e01b815260040161189f9291906132ec565b60006040518083038186803b1580156118b757600080fd5b505afa1580156118cb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118f39190810190612a60565b90506119f8565b60005b848110156119f657865160009087878481811061191657fe5b905060400201600001358151811061192a57fe5b6020026020010151905061193d81611f72565b6119ca5761194a81611f6f565b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040161197591906132b4565b60206040518083038186803b15801561198d57600080fd5b505afa1580156119a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c59190613054565b6119d6565b886001600160a01b0316315b8383815181106119e257fe5b6020908102919091010152506001016118fd565b505b60005b8481101561115e57611a55868683818110611a1257fe5b90506040020160200135610678858481518110611a2b57fe5b6020026020010151858581518110611a3f57fe5b6020026020010151611f5990919063ffffffff16565b6001016119fb565b611a6682611d05565b15611a7757611a7482611d50565b91505b6001600160a01b0384163014611ada576001600160a01b0384163314611aaf5760405162461bcd60e51b81526004016104de9061376f565b611ada847f000000000000000000000000000000000000000000000000000000000000000084611e11565b6040517fde0e9a3e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063de0e9a3e90611b4290869060040161389f565b602060405180830381600087803b158015611b5c57600080fd5b505af1158015611b70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b949190613054565b90506001600160a01b0384163014610974576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb9061092090879085906004016133d0565b60005b82811015611ca15733848483818110611c2557fe5b905060a002016060016020810190611c3d9190612838565b6001600160a01b03161480611c7d575030848483818110611c5a57fe5b905060a002016060016020810190611c729190612838565b6001600160a01b0316145b611c995760405162461bcd60e51b81526004016104de9061376f565b600101611c10565b50611caa61116b565b6001600160a01b0316630e8e3e848285856040518463ffffffff1660e01b8152600401611cd892919061347c565b6000604051808303818588803b158015611cf157600080fd5b505af1158015610e99573d6000803e3d6000fd5b7fba100000000000000000000000000000000000000000000000000000000000007fffff0000000000000000000000000000000000000000000000000000000000008216145b919050565b600080611d5c83611fa6565b805460009091559392505050565b611d79814710156101a3611ffc565b6000826001600160a01b031682604051611d9290611f6f565b60006040518083038185875af1925050503d8060008114611dcf576040519150601f19603f3d011682016040523d82523d6000602084013e611dd4565b606091505b505090506114ca816101a4611ffc565b6000611def83611fa6565b919091555050565b6000808213611e095781600003611e0b565b815b92915050565b80611e1b576114ca565b604080516001808252818301909252606091602080830190803683370190505090508281600081518110611e4b57fe5b6001600160a01b0392909216602092830291909101909101526040805160018082528183019092526060918160200160208202803683370190505090508281600081518110611e9657fe5b60200260200101818152505061098c85838361200e565b606060006060846001600160a01b031684604051611ecb9190613265565b6000604051808303816000865af19150503d8060008114611f08576040519150601f19603f3d011682016040523d82523d6000602084013e611f0d565b606091505b5091509150611f1c8282612148565b95945050505050565b60601c90565b60606000838015611f3857fe5b1415611f4e57611f4782612172565b9050611e0b565b611e0b6101366121af565b6000611f69838311156001611ffc565b50900390565b90565b6001600160a01b03161590565b60606000838015611f8c57fe5b1415611f9b57611f4782612202565b611e0b6101506121af565b60006001827f0000000000000000000000000000000000000000000000000000000000000000604051602001611fdd9291906132a6565b60408051808303601f1901815291905280516020909101200392915050565b8161200a5761200a816121af565b5050565b6060825167ffffffffffffffff8111801561202857600080fd5b5060405190808252806020026020018201604052801561206257816020015b61204f61241c565b8152602001906001900390816120475790505b50905060005b83518110156120fa576040805160a08101909152806003815260200185838151811061209057fe5b60200260200101516001600160a01b031681526020018483815181106120b257fe5b60200260200101518152602001866001600160a01b03168152602001306001600160a01b03168152508282815181106120e757fe5b6020908102919091010152600101612068565b5061210361116b565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b815260040161212e919061352a565b600060405180830381600087803b158015611cf157600080fd5b60608215612157575080611e0b565b8151156121675781518083602001fd5b611e0b6101ae6121af565b6060600061217f8361224b565b9050600181600381111561218f57fe5b14156121a65761219e83612261565b915050611d4b565b82915050611d4b565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6060600061220f8361224b565b9050600081600381111561221f57fe5b141561222e5761219e8361230f565b600181600381111561223c57fe5b14156121a65761219e83612372565b600081806020019051810190611e0b9190612d93565b606080600061226f846123c5565b915091506000805b83518110156122d557600084828151811061228e57fe5b602002602001015190506122a181611d05565b156122cc576122af81611d50565b8583815181106122bb57fe5b602002602001018181525050600192505b50600101612277565b50806122e15784611f1c565b600183836040516020016122f793929190613634565b60405160208183030381529060405295945050505050565b606060008061231d846123e8565b9150915061232a82611d05565b156123685761233882611d50565b91506000828260405160200161235093929190613613565b60405160208183030381529060405292505050611d4b565b8392505050611d4b565b6060600061237f836123ff565b905061238a81611d05565b156121a65761239881611d50565b90506001816040516020016123ae9291906135fc565b604051602081830303815290604052915050611d4b565b60606000828060200190518101906123dd9190612e12565b909590945092505050565b600080828060200190518101906123dd9190612ddc565b6000818060200190518101906124159190612daf565b9392505050565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b8035611e0b8161393f565b60008083601f840112612468578182fd5b50813567ffffffffffffffff81111561247f578182fd5b602083019150836020808302850101111561249957600080fd5b9250929050565b600082601f8301126124b0578081fd5b81356124c36124be826138cf565b6138a8565b8181529150602080830190848101818402860182018710156124e457600080fd5b60005b8481101561250c5781356124fa8161393f565b845292820192908201906001016124e7565b505050505092915050565b600082601f830112612527578081fd5b81356125356124be826138cf565b818152915060208083019084810160005b8481101561250c578135870160a080601f19838c0301121561256757600080fd5b612570816138a8565b85830135815260408084013587830152606080850135828401526080915081850135818401525082840135925067ffffffffffffffff8311156125b257600080fd5b6125c08c88858701016126e2565b90820152865250509282019290820190600101612546565b60008083601f8401126125e9578182fd5b50813567ffffffffffffffff811115612600578182fd5b60208301915083602060408302850101111561249957600080fd5b600082601f83011261262b578081fd5b81356126396124be826138cf565b81815291506020808301908481018184028601820187101561265a57600080fd5b60005b8481101561250c5781358452928201929082019060010161265d565b600082601f830112612689578081fd5b81516126976124be826138cf565b8181529150602080830190848101818402860182018710156126b857600080fd5b60005b8481101561250c578151845292820192908201906001016126bb565b8035611e0b81613954565b600082601f8301126126f2578081fd5b813567ffffffffffffffff811115612708578182fd5b61271b6020601f19601f840116016138a8565b915080825283602082850101111561273257600080fd5b8060208401602084013760009082016020015292915050565b803560018110611e0b57600080fd5b803560028110611e0b57600080fd5b60006080828403121561277a578081fd5b61278460806138a8565b9050813567ffffffffffffffff8082111561279e57600080fd5b6127aa858386016124a0565b835260208401359150808211156127c057600080fd5b6127cc8583860161261b565b602084015260408401359150808211156127e557600080fd5b506127f2848285016126e2565b60408301525061280583606084016126d7565b606082015292915050565b600060808284031215612821578081fd5b50919050565b803560ff81168114611e0b57600080fd5b600060208284031215612849578081fd5b81356124158161393f565b60008060008060808587031215612869578283fd5b84356128748161393f565b935060208501356128848161393f565b93969395505050506040820135916060013590565b600080600080606085870312156128ae578182fd5b84356128b98161393f565b935060208501356128c981613954565b9250604085013567ffffffffffffffff808211156128e5578384fd5b818701915087601f8301126128f8578384fd5b813581811115612906578485fd5b886020828501011115612917578485fd5b95989497505060200194505050565b60008060006060848603121561293a578081fd5b83356129458161393f565b95602085013595506040909401359392505050565b6000602080838503121561296c578182fd5b825167ffffffffffffffff811115612982578283fd5b8301601f81018513612992578283fd5b80516129a06124be826138cf565b81815283810190838501858402850186018910156129bc578687fd5b8694505b838510156129de5780518352600194909401939185019185016129c0565b50979650505050505050565b6000806000604084860312156129fe578081fd5b833567ffffffffffffffff80821115612a15578283fd5b818601915086601f830112612a28578283fd5b813581811115612a36578384fd5b87602060a083028501011115612a4a578384fd5b6020928301989097509590910135949350505050565b600060208284031215612a71578081fd5b815167ffffffffffffffff811115612a87578182fd5b612a9384828501612679565b949350505050565b600060208284031215612aac578081fd5b815161241581613954565b600080600080600080600060c0888a031215612ad1578485fd5b87359650612ae28960208a0161274b565b95506040880135612af28161393f565b94506060880135612b028161393f565b9350608088013567ffffffffffffffff80821115612b1e578485fd5b612b2a8b838c01612769565b945060a08a0135915080821115612b3f578384fd5b50612b4c8a828b016125d8565b989b979a50959850939692959293505050565b600080600080600080600060e0888a031215612b79578081fd5b87359650612b8a8960208a0161274b565b95506040880135612b9a8161393f565b94506060880135612baa8161393f565b9350608088013567ffffffffffffffff811115612bc5578182fd5b612bd18a828b01612769565b93505060a0880135915060c0880135905092959891949750929550565b600080600080600080600080610100898b031215612c0a578182fd5b8835612c158161393f565b97506020890135612c258161393f565b965060408901359550606089013594506080890135612c4381613954565b9350612c528a60a08b01612827565b925060c0890135915060e089013590509295985092959890939650565b600080600080600080600060e0888a031215612c89578081fd5b8735612c948161393f565b96506020880135612ca48161393f565b95506040880135945060608801359350612cc18960808a01612827565b925060a0880135915060c0880135905092959891949750929550565b600060208284031215612cee578081fd5b81516124158161393f565b60008060408385031215612d0b578182fd5b8235612d168161393f565b946020939093013593505050565b60008060008060008060c08789031215612d3c578384fd5b8635612d478161393f565b95506020870135612d578161393f565b94506040870135612d678161393f565b9350606087013592506080870135612d7e81613954565b8092505060a087013590509295509295509295565b600060208284031215612da4578081fd5b815161241581613962565b60008060408385031215612dc1578182fd5b8251612dcc81613962565b6020939093015192949293505050565b600080600060608486031215612df0578081fd5b8351612dfb81613962565b602085015160409095015190969495509392505050565b600080600060608486031215612e26578081fd5b8351612e3181613962565b602085015190935067ffffffffffffffff811115612e4d578182fd5b612e5986828701612679565b925050604084015190509250925092565b60008060008060008060008060008060006101608c8e031215612e8b578485fd5b612e958d8d61275a565b9a5067ffffffffffffffff8060208e01351115612eb0578586fd5b612ec08e60208f01358f01612517565b9a508060408e01351115612ed2578586fd5b612ee28e60408f01358f01612457565b909a509850612ef48e60608f01612810565b97508060e08e01351115612f06578586fd5b612f168e60e08f01358f01612457565b90975095506101008d013594506101208d013593506101408d0135811015612f3c578283fd5b50612f4e8d6101408e01358e016125d8565b81935080925050509295989b509295989b9093969950565b6000806000806000806101208789031215612f7f578384fd5b863567ffffffffffffffff80821115612f96578586fd5b9088019060c0828b031215612fa9578586fd5b612fb360c06138a8565b82358152612fc48b6020850161275a565b60208201526040830135612fd78161393f565b6040820152612fe98b6060850161244c565b60608201526080830135608082015260a083013582811115613009578788fd5b6130158c8286016126e2565b60a08301525080985050505061302e8860208901612810565b959895975050505060a08401359360c08101359360e08201359350610100909101359150565b600060208284031215613065578081fd5b5051919050565b6000806040838503121561307e578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b60008284526020808501945082825b858110156130d95781356130be8161393f565b6001600160a01b0316875295820195908201906001016130ab565b509495945050505050565b60008284526020808501945082825b858110156130d9578135875295820195908201906001016130f3565b6000815180845260208085019450808401835b838110156130d957815187529582019590820190600101613122565b15159052565b6000815180845261315c8160208601602086016138fc565b601f01601f19169290920160200192915050565b8051608080845281519084018190526000916020919082019060a0860190845b818110156131b55783516001600160a01b031683529284019291840191600101613190565b5050828501519150858103838701526131ce818361310f565b92505050604083015184820360408601526131e98282613144565b91505060608301516131fe606086018261313e565b509392505050565b80356132118161393f565b6001600160a01b03908116835260208201359061322d82613954565b90151560208401526040820135906132448261393f565b166040830152606081013561325881613954565b8015156060840152505050565b600082516132778184602087016138fc565b9190910192915050565b600084516132938184602089016138fc565b8201838582379092019182525092915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000604082016001600160a01b03808616845260206040818601528286518085526060870191508288019450855b8181101561333857855185168352948301949183019160010161331a565b509098975050505050505050565b6001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b6001600160a01b03949094168452602084019290925261ffff1660408301521515606082015260800190565b6020808252825182820181905260009190848201906040850190845b8181101561347057835183529284019291840191600101613454565b50909695505050505050565b6020808252818101839052600090604080840186845b8781101561351d5781356134a581613962565b6134ae81613928565b8352818501356134bd8161393f565b6001600160a01b031683860152818401358484015260606134e0818401846138ef565b6134ec8286018261308f565b505060806134fc818401846138ef565b6135088286018261308f565b505060a0928301929190910190600101613492565b5090979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156135b3578151805161355c81613928565b8552808701516001600160a01b03168786015285810151868601526060808201516135898288018261308f565b50506080908101519061359e8682018361308f565b505060a0939093019290850190600101613547565b5091979650505050505050565b60008582526001600160a01b038086166020840152808516604084015250608060608301526135f26080830184613170565b9695505050505050565b6040810161360984613928565b9281526020015290565b6060810161362085613928565b938152602081019290925260409091015290565b600061363f85613928565b84825260606020830152613656606083018561310f565b9050826040830152949350505050565b60006101208083016136778c613935565b8b84526020808501929092528a5190819052610140808501928281028601909101918c8201855b8281101561371e578785037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec00186528151805186528481015185870152604080820151908701526060808201519087015260809081015160a09187018290529061370a81880183613144565b97860197965050509083019060010161369e565b505050508381036040850152613735818a8c61309c565b9150506137456060840188613206565b82810360e08401526137588186886130e4565b915050826101008301529998505050505050505050565b60208082526010908201527f496e636f72726563742073656e64657200000000000000000000000000000000604082015260600190565b6020808252601f908201527f52656c617965722063616e206f6e6c7920617070726f766520697473656c6600604082015260600190565b60208082526019908201527f696e76616c696420636861696e6564207265666572656e636500000000000000604082015260600190565b600060e08252855160e0830152602086015161382f81613935565b61010083015260408601516001600160a01b03908116610120840152606087015116610140830152608086015161016083015260a086015160c061018084015261387d6101a0840182613144565b91505061388d6020830186613206565b60a082019390935260c0015292915050565b90815260200190565b60405181810167ffffffffffffffff811182821017156138c757600080fd5b604052919050565b600067ffffffffffffffff8211156138e5578081fd5b5060209081020190565b600082356124158161393f565b60005b838110156139175781810151838201526020016138ff565b838111156104835750506000910152565b6004811061393257fe5b50565b6002811061393257fe5b6001600160a01b038116811461393257600080fd5b801515811461393257600080fd5b6004811061393257600080fdfea2646970667358221220ca9b18e46ddedb91380084b41ec5db4b9ef22aec5e474a5296f4dd1961e9082364736f6c6343000701003360c060405234801561001057600080fd5b5060405161074f38038061074f83398101604081905261002f91610052565b60016000556001600160601b0319606092831b8116608052911b1660a0526100a3565b60008060408385031215610064578182fd5b825161006f8161008b565b60208401519092506100808161008b565b809150509250929050565b6001600160a01b03811681146100a057600080fd5b50565b60805160601c60a05160601c61067b6100d46000398060fc528061020f52508060585280610120525061067b6000f3fe6080604052600436106100385760003560e01c80637678922e146100885780638d928af8146100b3578063ac9650d8146100c857610083565b36610083576100813373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146102066100e8565b005b600080fd5b34801561009457600080fd5b5061009d6100fa565b6040516100aa91906104d6565b60405180910390f35b3480156100bf57600080fd5b5061009d61011e565b6100db6100d6366004610448565b610142565b6040516100aa91906104f7565b816100f6576100f68161026e565b5050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b606061014c6102db565b8167ffffffffffffffff8111801561016357600080fd5b5060405190808252806020026020018201604052801561019757816020015b60608152602001906001900390816101825790505b50905060005b82811015610257576102388484838181106101b457fe5b90506020028101906101c691906105ab565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929150506102f4565b82828151811061024457fe5b602090810291909101015260010161019d565b50610260610377565b61026861038b565b92915050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6102ed600260005414156101906100e8565b6002600055565b6060600060608473ffffffffffffffffffffffffffffffffffffffff168460405161031f91906104b7565b600060405180830381855af49150503d806000811461035a576040519150601f19603f3d011682016040523d82523d6000602084013e61035f565b606091505b509150915061036e8282610392565b95945050505050565b4780156103885761038833826103bc565b50565b6001600055565b606082156103a1575080610268565b8151156103b15781518083602001fd5b6102686101ae61026e565b6103cb814710156101a36100e8565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516103f1906104d3565b60006040518083038185875af1925050503d806000811461042e576040519150601f19603f3d011682016040523d82523d6000602084013e610433565b606091505b50509050610443816101a46100e8565b505050565b6000806020838503121561045a578182fd5b823567ffffffffffffffff80821115610471578384fd5b818501915085601f830112610484578384fd5b813581811115610492578485fd5b86602080830285010111156104a5578485fd5b60209290920196919550909350505050565b600082516104c9818460208701610615565b9190910192915050565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561059e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845281518051808752610561818989018a8501610615565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169590950186019450928501929085019060010161051c565b5092979650505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126105df578283fd5b83018035915067ffffffffffffffff8211156105f9578283fd5b60200191503681900382131561060e57600080fd5b9250929050565b60005b83811015610630578181015183820152602001610618565b8381111561063f576000848401525b5050505056fea2646970667358221220cc598b4a8bf1e4a2e99c141298c681681ab59d8d380078ccf785ce580934a5ae64736f6c63430007010033", + "deployedBytecode": "0x60806040526004361061010e5760003560e01c806380db15bd116100a5578063959fc17a11610074578063d80952d511610059578063d80952d514610260578063db4c0e9114610273578063ecc02637146102865761010e565b8063959fc17a1461022d578063b6d24737146102405761010e565b806380db15bd146101df5780638d64cfbc146101f25780638d928af8146102055780638fe4624f1461021a5761010e565b80632e6272ea116100e15780632e6272ea14610177578063433b0865146101975780637ab6e03c146101aa5780637fd0e5d5146101bd5761010e565b80631089e5e31461011357806318369446146101285780631c982441146101515780632cbec84e14610164575b600080fd5b610126610121366004612926565b610299565b005b61013b610136366004612e6a565b610489565b6040516101489190613438565b60405180910390f35b61012661015f366004612854565b610696565b610126610172366004612926565b610993565b61018a610185366004612f66565b610ac7565b604051610148919061389f565b6101266101a5366004612d24565b610bf4565b6101266101b8366004612d24565b610ea3565b3480156101c957600080fd5b506101d2610fc1565b60405161014891906132b4565b6101266101ed366004612899565b610fe5565b610126610200366004612c6f565b6110f1565b34801561021157600080fd5b506101d261116b565b610126610228366004612b5f565b61118f565b61012661023b366004612bee565b6113c6565b34801561024c57600080fd5b5061012661025b366004612cf9565b611443565b61012661026e366004612ab7565b6114cf565b610126610281366004612854565b611a5d565b6101266102943660046129ea565b611c0d565b6102a282611d05565b156102b3576102b082611d50565b91505b6040517fb0e389000000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b0e389009061031b90869060040161389f565b60206040518083038186803b15801561033357600080fd5b505afa158015610347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036b9190613054565b90506103a06001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001684611d6a565b6001600160a01b038416301461046b576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb9061041790879085906004016133d0565b602060405180830381600087803b15801561043157600080fd5b505af1158015610445573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104699190612a9b565b505b61047482611d05565b15610483576104838282611de4565b50505050565b60603361049960208a018a612838565b6001600160a01b031614806104c25750306104b760208a018a612838565b6001600160a01b0316145b6104e75760405162461bcd60e51b81526004016104de9061376f565b60405180910390fd5b60005b8b5181101561054c5760008c828151811061050157fe5b602002602001015160600151905061051881611d05565b156105435761052681611d50565b8d838151811061053257fe5b602002602001015160600181815250505b506001016104ea565b50606061055761116b565b6001600160a01b031663945bcec9868f8f8f8f8f8f8f8f6040518a63ffffffff1660e01b8152600401610591989796959493929190613666565b6000604051808303818588803b1580156105aa57600080fd5b505af11580156105be573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526105e7919081019061295a565b905060005b838110156106855761061285858381811061060357fe5b90506040020160200135611d05565b61062e5760405162461bcd60e51b81526004016104de906137dd565b61067d85858381811061063d57fe5b905060400201602001356106788488888681811061065757fe5b905060400201600001358151811061066b57fe5b6020026020010151611df7565b611de4565b6001016105ec565b509c9b505050505050505050505050565b61069f82611d05565b156106b0576106ad82611d50565b91505b6001600160a01b0384163014610713576001600160a01b03841633146106e85760405162461bcd60e51b81526004016104de9061376f565b610713847f000000000000000000000000000000000000000000000000000000000000000084611e11565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b39061079a907f00000000000000000000000000000000000000000000000000000000000000009086906004016133d0565b602060405180830381600087803b1580156107b457600080fd5b505af11580156107c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ec9190612a9b565b506040517fea598cb00000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ea598cb09061085590869060040161389f565b602060405180830381600087803b15801561086f57600080fd5b505af1158015610883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a79190613054565b90506001600160a01b0384163014610974576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb9061092090879085906004016133d0565b602060405180830381600087803b15801561093a57600080fd5b505af115801561094e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109729190612a9b565b505b61097d82611d05565b1561098c5761098c8282611de4565b5050505050565b61099c82611d05565b156109ad576109aa82611d50565b91505b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a1903eab84306040518363ffffffff1660e01b81526004016109fc91906132b4565b6020604051808303818588803b158015610a1557600080fd5b505af1158015610a29573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610a4e9190613054565b90506001600160a01b038416301461046b576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb9061041790879085906004016133d0565b600033610ad76020880188612838565b6001600160a01b03161480610b00575030610af56020880188612838565b6001600160a01b0316145b610b1c5760405162461bcd60e51b81526004016104de9061376f565b610b298760800151611d05565b15610b4157610b3b8760800151611d50565b60808801525b6000610b4b61116b565b6001600160a01b03166352bbbe29858a8a8a8a6040518663ffffffff1660e01b8152600401610b7d9493929190613814565b6020604051808303818588803b158015610b9657600080fd5b505af1158015610baa573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610bcf9190613054565b9050610bda83611d05565b15610be957610be98382611de4565b979650505050505050565b610bfd83611d05565b15610c0e57610c0b83611d50565b92505b600082610c8d57866001600160a01b03166351c0e0616040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610c5057600080fd5b505af1158015610c64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c889190612cdd565b610d00565b866001600160a01b0316634800d97f6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610cc857600080fd5b505af1158015610cdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d009190612cdd565b90506001600160a01b0386163014610d45576001600160a01b0386163314610d3a5760405162461bcd60e51b81526004016104de9061376f565b610d45868286611e11565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b390610d8c908a9088906004016133d0565b602060405180830381600087803b158015610da657600080fd5b505af1158015610dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dde9190612a9b565b506040517f2f2cab870000000000000000000000000000000000000000000000000000000081526000906001600160a01b03891690632f2cab8790610e2d908990899086908a9060040161340c565b602060405180830381600087803b158015610e4757600080fd5b505af1158015610e5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7f9190613054565b9050610e8a83611d05565b15610e9957610e998382611de4565b5050505050505050565b610eac83611d05565b15610ebd57610eba83611d50565b92505b6001600160a01b0385163014610f00576001600160a01b0385163314610ef55760405162461bcd60e51b81526004016104de9061376f565b610f00858785611e11565b6040517fead5d3590000000000000000000000000000000000000000000000000000000081526000906001600160a01b0388169063ead5d35990610f4c908890889088906004016133e9565b6040805180830381600087803b158015610f6557600080fd5b505af1158015610f79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9d919061306c565b915050610fa982611d05565b15610fb857610fb88282611de4565b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b038416301480610ffa575082155b6110165760405162461bcd60e51b81526004016104de906137a6565b606063fa6e671d60e01b338686604051602401611035939291906132c8565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090951694909417909352516110a4928691869101613281565b60408051601f1981840301815291905290506110e96001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001682611ead565b505050505050565b866001600160a01b031663d505accf8761110961116b565b88888888886040518863ffffffff1660e01b8152600401611130979695949392919061338f565b600060405180830381600087803b15801561114a57600080fd5b505af115801561115e573d6000803e3d6000fd5b5050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b0385163314806111ae57506001600160a01b03851630145b6111ca5760405162461bcd60e51b81526004016104de9061376f565b60006111d588611f25565b905060006111e283611d05565b6111ed576000611282565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038316906370a08231906112329089906004016132b4565b60206040518083038186803b15801561124a57600080fd5b505afa15801561125e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112829190613054565b9050611292888660400151611f2b565b604086015261129f61116b565b6001600160a01b031663b95cac28858b8a8a8a6040518663ffffffff1660e01b81526004016112d194939291906135c0565b6000604051808303818588803b1580156112ea57600080fd5b505af11580156112fe573d6000803e3d6000fd5b505050505061130c83611d05565b156113bb576040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038416906370a0823190611359908a906004016132b4565b60206040518083038186803b15801561137157600080fd5b505afa158015611385573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a99190613054565b90506113b9846106788385611f59565b505b505050505050505050565b876001600160a01b0316638fcbaf0c886113de61116b565b8989898989896040518963ffffffff1660e01b8152600401611407989796959493929190613346565b600060405180830381600087803b15801561142157600080fd5b505af1158015611435573d6000803e3d6000fd5b505050505050505050505050565b816001600160a01b031663095ea7b361145a61116b565b836040518363ffffffff1660e01b81526004016114789291906133d0565b602060405180830381600087803b15801561149257600080fd5b505af11580156114a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ca9190612a9b565b505050565b6001600160a01b0385163314806114ee57506001600160a01b03851630145b61150a5760405162461bcd60e51b81526004016104de9061376f565b60608167ffffffffffffffff8111801561152357600080fd5b5060405190808252806020026020018201604052801561154d578160200160208202803683370190505b50905060608267ffffffffffffffff8111801561156957600080fd5b50604051908082528060200260200182016040528015611593578160200160208202803683370190505b50905060005b83811015611703576115b085858381811061060357fe5b6115cc5760405162461bcd60e51b81526004016104de906137dd565b85516000908686848181106115dd57fe5b90506040020160000135815181106115f157fe5b6020026020010151905086606001511561163f5761160e81611f6f565b84838151811061161a57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506116fa565b61164881611f72565b6116d55761165581611f6f565b6001600160a01b03166370a08231896040518263ffffffff1660e01b815260040161168091906132b4565b60206040518083038186803b15801561169857600080fd5b505afa1580156116ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d09190613054565b6116e1565b876001600160a01b0316315b8383815181106116ed57fe5b6020026020010181815250505b50600101611599565b5084606001511561179a5761171661116b565b6001600160a01b0316630f5a6efa87846040518363ffffffff1660e01b81526004016117439291906132ec565b60006040518083038186803b15801561175b57600080fd5b505afa15801561176f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117979190810190612a60565b90505b6117a8888660400151611f7f565b60408601526117b561116b565b6001600160a01b0316638bdb39138a8989896040518563ffffffff1660e01b81526004016117e694939291906135c0565b600060405180830381600087803b15801561180057600080fd5b505af1158015611814573d6000803e3d6000fd5b50606092508591505067ffffffffffffffff8111801561183357600080fd5b5060405190808252806020026020018201604052801561185d578160200160208202803683370190505b5090508560600151156118fa5761187261116b565b6001600160a01b0316630f5a6efa88856040518363ffffffff1660e01b815260040161189f9291906132ec565b60006040518083038186803b1580156118b757600080fd5b505afa1580156118cb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118f39190810190612a60565b90506119f8565b60005b848110156119f657865160009087878481811061191657fe5b905060400201600001358151811061192a57fe5b6020026020010151905061193d81611f72565b6119ca5761194a81611f6f565b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040161197591906132b4565b60206040518083038186803b15801561198d57600080fd5b505afa1580156119a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c59190613054565b6119d6565b886001600160a01b0316315b8383815181106119e257fe5b6020908102919091010152506001016118fd565b505b60005b8481101561115e57611a55868683818110611a1257fe5b90506040020160200135610678858481518110611a2b57fe5b6020026020010151858581518110611a3f57fe5b6020026020010151611f5990919063ffffffff16565b6001016119fb565b611a6682611d05565b15611a7757611a7482611d50565b91505b6001600160a01b0384163014611ada576001600160a01b0384163314611aaf5760405162461bcd60e51b81526004016104de9061376f565b611ada847f000000000000000000000000000000000000000000000000000000000000000084611e11565b6040517fde0e9a3e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063de0e9a3e90611b4290869060040161389f565b602060405180830381600087803b158015611b5c57600080fd5b505af1158015611b70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b949190613054565b90506001600160a01b0384163014610974576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb9061092090879085906004016133d0565b60005b82811015611ca15733848483818110611c2557fe5b905060a002016060016020810190611c3d9190612838565b6001600160a01b03161480611c7d575030848483818110611c5a57fe5b905060a002016060016020810190611c729190612838565b6001600160a01b0316145b611c995760405162461bcd60e51b81526004016104de9061376f565b600101611c10565b50611caa61116b565b6001600160a01b0316630e8e3e848285856040518463ffffffff1660e01b8152600401611cd892919061347c565b6000604051808303818588803b158015611cf157600080fd5b505af1158015610e99573d6000803e3d6000fd5b7fba100000000000000000000000000000000000000000000000000000000000007fffff0000000000000000000000000000000000000000000000000000000000008216145b919050565b600080611d5c83611fa6565b805460009091559392505050565b611d79814710156101a3611ffc565b6000826001600160a01b031682604051611d9290611f6f565b60006040518083038185875af1925050503d8060008114611dcf576040519150601f19603f3d011682016040523d82523d6000602084013e611dd4565b606091505b505090506114ca816101a4611ffc565b6000611def83611fa6565b919091555050565b6000808213611e095781600003611e0b565b815b92915050565b80611e1b576114ca565b604080516001808252818301909252606091602080830190803683370190505090508281600081518110611e4b57fe5b6001600160a01b0392909216602092830291909101909101526040805160018082528183019092526060918160200160208202803683370190505090508281600081518110611e9657fe5b60200260200101818152505061098c85838361200e565b606060006060846001600160a01b031684604051611ecb9190613265565b6000604051808303816000865af19150503d8060008114611f08576040519150601f19603f3d011682016040523d82523d6000602084013e611f0d565b606091505b5091509150611f1c8282612148565b95945050505050565b60601c90565b60606000838015611f3857fe5b1415611f4e57611f4782612172565b9050611e0b565b611e0b6101366121af565b6000611f69838311156001611ffc565b50900390565b90565b6001600160a01b03161590565b60606000838015611f8c57fe5b1415611f9b57611f4782612202565b611e0b6101506121af565b60006001827f0000000000000000000000000000000000000000000000000000000000000000604051602001611fdd9291906132a6565b60408051808303601f1901815291905280516020909101200392915050565b8161200a5761200a816121af565b5050565b6060825167ffffffffffffffff8111801561202857600080fd5b5060405190808252806020026020018201604052801561206257816020015b61204f61241c565b8152602001906001900390816120475790505b50905060005b83518110156120fa576040805160a08101909152806003815260200185838151811061209057fe5b60200260200101516001600160a01b031681526020018483815181106120b257fe5b60200260200101518152602001866001600160a01b03168152602001306001600160a01b03168152508282815181106120e757fe5b6020908102919091010152600101612068565b5061210361116b565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b815260040161212e919061352a565b600060405180830381600087803b158015611cf157600080fd5b60608215612157575080611e0b565b8151156121675781518083602001fd5b611e0b6101ae6121af565b6060600061217f8361224b565b9050600181600381111561218f57fe5b14156121a65761219e83612261565b915050611d4b565b82915050611d4b565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6060600061220f8361224b565b9050600081600381111561221f57fe5b141561222e5761219e8361230f565b600181600381111561223c57fe5b14156121a65761219e83612372565b600081806020019051810190611e0b9190612d93565b606080600061226f846123c5565b915091506000805b83518110156122d557600084828151811061228e57fe5b602002602001015190506122a181611d05565b156122cc576122af81611d50565b8583815181106122bb57fe5b602002602001018181525050600192505b50600101612277565b50806122e15784611f1c565b600183836040516020016122f793929190613634565b60405160208183030381529060405295945050505050565b606060008061231d846123e8565b9150915061232a82611d05565b156123685761233882611d50565b91506000828260405160200161235093929190613613565b60405160208183030381529060405292505050611d4b565b8392505050611d4b565b6060600061237f836123ff565b905061238a81611d05565b156121a65761239881611d50565b90506001816040516020016123ae9291906135fc565b604051602081830303815290604052915050611d4b565b60606000828060200190518101906123dd9190612e12565b909590945092505050565b600080828060200190518101906123dd9190612ddc565b6000818060200190518101906124159190612daf565b9392505050565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b8035611e0b8161393f565b60008083601f840112612468578182fd5b50813567ffffffffffffffff81111561247f578182fd5b602083019150836020808302850101111561249957600080fd5b9250929050565b600082601f8301126124b0578081fd5b81356124c36124be826138cf565b6138a8565b8181529150602080830190848101818402860182018710156124e457600080fd5b60005b8481101561250c5781356124fa8161393f565b845292820192908201906001016124e7565b505050505092915050565b600082601f830112612527578081fd5b81356125356124be826138cf565b818152915060208083019084810160005b8481101561250c578135870160a080601f19838c0301121561256757600080fd5b612570816138a8565b85830135815260408084013587830152606080850135828401526080915081850135818401525082840135925067ffffffffffffffff8311156125b257600080fd5b6125c08c88858701016126e2565b90820152865250509282019290820190600101612546565b60008083601f8401126125e9578182fd5b50813567ffffffffffffffff811115612600578182fd5b60208301915083602060408302850101111561249957600080fd5b600082601f83011261262b578081fd5b81356126396124be826138cf565b81815291506020808301908481018184028601820187101561265a57600080fd5b60005b8481101561250c5781358452928201929082019060010161265d565b600082601f830112612689578081fd5b81516126976124be826138cf565b8181529150602080830190848101818402860182018710156126b857600080fd5b60005b8481101561250c578151845292820192908201906001016126bb565b8035611e0b81613954565b600082601f8301126126f2578081fd5b813567ffffffffffffffff811115612708578182fd5b61271b6020601f19601f840116016138a8565b915080825283602082850101111561273257600080fd5b8060208401602084013760009082016020015292915050565b803560018110611e0b57600080fd5b803560028110611e0b57600080fd5b60006080828403121561277a578081fd5b61278460806138a8565b9050813567ffffffffffffffff8082111561279e57600080fd5b6127aa858386016124a0565b835260208401359150808211156127c057600080fd5b6127cc8583860161261b565b602084015260408401359150808211156127e557600080fd5b506127f2848285016126e2565b60408301525061280583606084016126d7565b606082015292915050565b600060808284031215612821578081fd5b50919050565b803560ff81168114611e0b57600080fd5b600060208284031215612849578081fd5b81356124158161393f565b60008060008060808587031215612869578283fd5b84356128748161393f565b935060208501356128848161393f565b93969395505050506040820135916060013590565b600080600080606085870312156128ae578182fd5b84356128b98161393f565b935060208501356128c981613954565b9250604085013567ffffffffffffffff808211156128e5578384fd5b818701915087601f8301126128f8578384fd5b813581811115612906578485fd5b886020828501011115612917578485fd5b95989497505060200194505050565b60008060006060848603121561293a578081fd5b83356129458161393f565b95602085013595506040909401359392505050565b6000602080838503121561296c578182fd5b825167ffffffffffffffff811115612982578283fd5b8301601f81018513612992578283fd5b80516129a06124be826138cf565b81815283810190838501858402850186018910156129bc578687fd5b8694505b838510156129de5780518352600194909401939185019185016129c0565b50979650505050505050565b6000806000604084860312156129fe578081fd5b833567ffffffffffffffff80821115612a15578283fd5b818601915086601f830112612a28578283fd5b813581811115612a36578384fd5b87602060a083028501011115612a4a578384fd5b6020928301989097509590910135949350505050565b600060208284031215612a71578081fd5b815167ffffffffffffffff811115612a87578182fd5b612a9384828501612679565b949350505050565b600060208284031215612aac578081fd5b815161241581613954565b600080600080600080600060c0888a031215612ad1578485fd5b87359650612ae28960208a0161274b565b95506040880135612af28161393f565b94506060880135612b028161393f565b9350608088013567ffffffffffffffff80821115612b1e578485fd5b612b2a8b838c01612769565b945060a08a0135915080821115612b3f578384fd5b50612b4c8a828b016125d8565b989b979a50959850939692959293505050565b600080600080600080600060e0888a031215612b79578081fd5b87359650612b8a8960208a0161274b565b95506040880135612b9a8161393f565b94506060880135612baa8161393f565b9350608088013567ffffffffffffffff811115612bc5578182fd5b612bd18a828b01612769565b93505060a0880135915060c0880135905092959891949750929550565b600080600080600080600080610100898b031215612c0a578182fd5b8835612c158161393f565b97506020890135612c258161393f565b965060408901359550606089013594506080890135612c4381613954565b9350612c528a60a08b01612827565b925060c0890135915060e089013590509295985092959890939650565b600080600080600080600060e0888a031215612c89578081fd5b8735612c948161393f565b96506020880135612ca48161393f565b95506040880135945060608801359350612cc18960808a01612827565b925060a0880135915060c0880135905092959891949750929550565b600060208284031215612cee578081fd5b81516124158161393f565b60008060408385031215612d0b578182fd5b8235612d168161393f565b946020939093013593505050565b60008060008060008060c08789031215612d3c578384fd5b8635612d478161393f565b95506020870135612d578161393f565b94506040870135612d678161393f565b9350606087013592506080870135612d7e81613954565b8092505060a087013590509295509295509295565b600060208284031215612da4578081fd5b815161241581613962565b60008060408385031215612dc1578182fd5b8251612dcc81613962565b6020939093015192949293505050565b600080600060608486031215612df0578081fd5b8351612dfb81613962565b602085015160409095015190969495509392505050565b600080600060608486031215612e26578081fd5b8351612e3181613962565b602085015190935067ffffffffffffffff811115612e4d578182fd5b612e5986828701612679565b925050604084015190509250925092565b60008060008060008060008060008060006101608c8e031215612e8b578485fd5b612e958d8d61275a565b9a5067ffffffffffffffff8060208e01351115612eb0578586fd5b612ec08e60208f01358f01612517565b9a508060408e01351115612ed2578586fd5b612ee28e60408f01358f01612457565b909a509850612ef48e60608f01612810565b97508060e08e01351115612f06578586fd5b612f168e60e08f01358f01612457565b90975095506101008d013594506101208d013593506101408d0135811015612f3c578283fd5b50612f4e8d6101408e01358e016125d8565b81935080925050509295989b509295989b9093969950565b6000806000806000806101208789031215612f7f578384fd5b863567ffffffffffffffff80821115612f96578586fd5b9088019060c0828b031215612fa9578586fd5b612fb360c06138a8565b82358152612fc48b6020850161275a565b60208201526040830135612fd78161393f565b6040820152612fe98b6060850161244c565b60608201526080830135608082015260a083013582811115613009578788fd5b6130158c8286016126e2565b60a08301525080985050505061302e8860208901612810565b959895975050505060a08401359360c08101359360e08201359350610100909101359150565b600060208284031215613065578081fd5b5051919050565b6000806040838503121561307e578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b60008284526020808501945082825b858110156130d95781356130be8161393f565b6001600160a01b0316875295820195908201906001016130ab565b509495945050505050565b60008284526020808501945082825b858110156130d9578135875295820195908201906001016130f3565b6000815180845260208085019450808401835b838110156130d957815187529582019590820190600101613122565b15159052565b6000815180845261315c8160208601602086016138fc565b601f01601f19169290920160200192915050565b8051608080845281519084018190526000916020919082019060a0860190845b818110156131b55783516001600160a01b031683529284019291840191600101613190565b5050828501519150858103838701526131ce818361310f565b92505050604083015184820360408601526131e98282613144565b91505060608301516131fe606086018261313e565b509392505050565b80356132118161393f565b6001600160a01b03908116835260208201359061322d82613954565b90151560208401526040820135906132448261393f565b166040830152606081013561325881613954565b8015156060840152505050565b600082516132778184602087016138fc565b9190910192915050565b600084516132938184602089016138fc565b8201838582379092019182525092915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000604082016001600160a01b03808616845260206040818601528286518085526060870191508288019450855b8181101561333857855185168352948301949183019160010161331a565b509098975050505050505050565b6001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b6001600160a01b03949094168452602084019290925261ffff1660408301521515606082015260800190565b6020808252825182820181905260009190848201906040850190845b8181101561347057835183529284019291840191600101613454565b50909695505050505050565b6020808252818101839052600090604080840186845b8781101561351d5781356134a581613962565b6134ae81613928565b8352818501356134bd8161393f565b6001600160a01b031683860152818401358484015260606134e0818401846138ef565b6134ec8286018261308f565b505060806134fc818401846138ef565b6135088286018261308f565b505060a0928301929190910190600101613492565b5090979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156135b3578151805161355c81613928565b8552808701516001600160a01b03168786015285810151868601526060808201516135898288018261308f565b50506080908101519061359e8682018361308f565b505060a0939093019290850190600101613547565b5091979650505050505050565b60008582526001600160a01b038086166020840152808516604084015250608060608301526135f26080830184613170565b9695505050505050565b6040810161360984613928565b9281526020015290565b6060810161362085613928565b938152602081019290925260409091015290565b600061363f85613928565b84825260606020830152613656606083018561310f565b9050826040830152949350505050565b60006101208083016136778c613935565b8b84526020808501929092528a5190819052610140808501928281028601909101918c8201855b8281101561371e578785037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec00186528151805186528481015185870152604080820151908701526060808201519087015260809081015160a09187018290529061370a81880183613144565b97860197965050509083019060010161369e565b505050508381036040850152613735818a8c61309c565b9150506137456060840188613206565b82810360e08401526137588186886130e4565b915050826101008301529998505050505050505050565b60208082526010908201527f496e636f72726563742073656e64657200000000000000000000000000000000604082015260600190565b6020808252601f908201527f52656c617965722063616e206f6e6c7920617070726f766520697473656c6600604082015260600190565b60208082526019908201527f696e76616c696420636861696e6564207265666572656e636500000000000000604082015260600190565b600060e08252855160e0830152602086015161382f81613935565b61010083015260408601516001600160a01b03908116610120840152606087015116610140830152608086015161016083015260a086015160c061018084015261387d6101a0840182613144565b91505061388d6020830186613206565b60a082019390935260c0015292915050565b90815260200190565b60405181810167ffffffffffffffff811182821017156138c757600080fd5b604052919050565b600067ffffffffffffffff8211156138e5578081fd5b5060209081020190565b600082356124158161393f565b60005b838110156139175781810151838201526020016138ff565b838111156104835750506000910152565b6004811061393257fe5b50565b6002811061393257fe5b6001600160a01b038116811461393257600080fd5b801515811461393257600080fd5b6004811061393257600080fdfea2646970667358221220ca9b18e46ddedb91380084b41ec5db4b9ef22aec5e474a5296f4dd1961e9082364736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/index.ts b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/index.ts new file mode 100644 index 0000000..4a0a28b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/index.ts @@ -0,0 +1,16 @@ +import { Task, TaskRunOptions } from '@src'; +import { BatchRelayerDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as BatchRelayerDeployment; + + const relayerLibraryArgs = [input.Vault, input.wstETH]; + const relayerLibrary = await task.deployAndVerify('BatchRelayerLibrary', relayerLibraryArgs, from, force); + + // The relayer library automatically also deploys the relayer itself: we must verify it + const relayer: string = await relayerLibrary.getEntrypoint(); + + const relayerArgs = [input.Vault, relayerLibrary.address]; // See BalancerRelayer's constructor + await task.verify('BalancerRelayer', relayer, relayerArgs); + await task.save({ BalancerRelayer: relayer }); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/input.ts b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/input.ts new file mode 100644 index 0000000..c648747 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/input.ts @@ -0,0 +1,36 @@ +import { Task, TaskMode } from '@src'; + +export type BatchRelayerDeployment = { + Vault: string; + wstETH: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + // wstETH is only deployed on mainnet and kovan + mainnet: { + Vault, + wstETH: '0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0', + }, + kovan: { + Vault, + wstETH: '0xa387b91e393cfb9356a460370842bc8dbb2f29af', + }, + goerli: { + Vault, + wstETH: '0x6320cD32aA674d2898A68ec82e869385Fc5f7E2f', + }, + rinkeby: { + Vault, + wstETH: '0x0000000000000000000000000000000000000000', + }, + polygon: { + Vault, + wstETH: '0x0000000000000000000000000000000000000000', + }, + arbitrum: { + Vault, + wstETH: '0x0000000000000000000000000000000000000000', + }, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/output/arbitrum.json new file mode 100644 index 0000000..6dabf32 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/output/arbitrum.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x72D07D7DcA67b8A406aD1Ec34ce969c90bFEE768", + "BalancerRelayer": "0x466262c2a275aB106E54D95B5B04603e12b58cA1" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/output/goerli.json new file mode 100644 index 0000000..74404bd --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/output/goerli.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0xFB2f4CE9843E1069CC1F9d76e0236d6dFF2b1eeA", + "BalancerRelayer": "0x8002d3e5875b38C5B03da83aeB430dC63E047F62" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/output/kovan.json b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/output/kovan.json new file mode 100644 index 0000000..33bc23a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/output/kovan.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x22be81ecAe87F1Ae1db9e17d6B072f846e07FC45", + "BalancerRelayer": "0x6bfd48F3873E21F7686982d352b610E1523c218B" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/output/mainnet.json new file mode 100644 index 0000000..75f31bd --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x41B953164995c11C81DA73D212ED8Af25741b7Ac", + "BalancerRelayer": "0xAc9f49eF3ab0BbC929f7b1bb0A17E1Fca5786251" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/output/polygon.json new file mode 100644 index 0000000..13dbbcb --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/output/polygon.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x8F42aDBbA1B16EaAE3BB5754915E0D06059aDd75", + "BalancerRelayer": "0x4574ccBcC09A00C9eE55fB92Fe353699A4fA800e" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/output/rinkeby.json b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/output/rinkeby.json new file mode 100644 index 0000000..5531d35 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/output/rinkeby.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0xD7FAD3bd59D6477cbe1BE7f646F7f1BA25b230f8", + "BalancerRelayer": "0xeF606F58A4FD0fCcb066c6203d0994694d3eB2D3" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/readme.md b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/readme.md new file mode 100644 index 0000000..f832404 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/readme.md @@ -0,0 +1,15 @@ +# 2020-12-03 - Batch Relayer + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This relayer was superseded by an [updated version (also now deprecated)](../20220720-batch-relayer-v3) with more features. + +Deployment of the first `BalancerRelayer` using `BatchRelayerLibrary`, for combining multiple operations (swaps, joins, etc.) in a single transaction. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet address](./output/polygon.json) +- [Arbitrum mainnet address](./output/arbitrum.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`BatchRelayerLibrary` artifact](./artifact/BatchRelayerLibrary.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/test/task.fork.ts new file mode 100644 index 0000000..df04faf --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211203-batch-relayer/test/task.fork.ts @@ -0,0 +1,162 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; + +import { BigNumberish } from '@helpers/numbers'; + +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { RelayerAuthorization } from '@helpers/models/misc/signatures'; +import { WeightedPoolEncoder } from '@helpers/models/pools/weighted/encoder'; +import { SwapKind } from '@helpers/models/types/types'; +import { fromNow, MINUTE } from '@helpers/time'; +import { MAX_UINT256 } from '@helpers/constants'; + +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode, getSigner } from '@src'; + +describeForkTest('BatchRelayerLibrary', 'mainnet', 14850000, function () { + let task: Task; + + let relayer: Contract, library: Contract; + let sender: SignerWithAddress, admin: SignerWithAddress; + let vault: Contract, authorizer: Contract, dai: Contract, usdc: Contract; + + const DAI = '0x6b175474e89094c44da98b954eedeac495271d0f'; + const USDC = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'; + + const LARGE_TOKEN_HOLDER = '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503'; + + const DAI_USDC_USDT_POOL = '0x06df3b2bbb68adc8b0e302443692037ed9f91b42000000000000000000000063'; + const ETH_DAI_POOL = '0x0b09dea16768f0799065c475be02919503cb2a3500020000000000000000001a'; + + const CHAINED_REFERENCE_PREFIX = 'ba10'; + function toChainedReference(key: BigNumberish): BigNumber { + // The full padded prefix is 66 characters long, with 64 hex characters and the 0x prefix. + const paddedPrefix = `0x${CHAINED_REFERENCE_PREFIX}${'0'.repeat(64 - CHAINED_REFERENCE_PREFIX.length)}`; + + return BigNumber.from(paddedPrefix).add(key); + } + + before('run task', async () => { + task = new Task('20211203-batch-relayer', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + library = await task.deployedInstance('BatchRelayerLibrary'); + relayer = await task.instanceAt('BalancerRelayer', await library.getEntrypoint()); + }); + + before('load vault and tokens', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + + vault = await vaultTask.instanceAt('Vault', await library.getVault()); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + + dai = await task.instanceAt('IERC20', DAI); + usdc = await task.instanceAt('IERC20', USDC); + }); + + before('load signers', async () => { + // We impersonate a whale that holds large token amounts, but can't use it directly as impersonation doesn't let us + // sign messages. Therefore, we transfer its tokens to our sender. + const whale = await impersonate(LARGE_TOKEN_HOLDER); + + // The sender begins with just USDC and ETH + sender = await getSigner(); + await usdc.connect(whale).transfer(sender.address, await usdc.balanceOf(whale.address)); + + // We impersonate an account with the default admin role in order to be able to approve the relayer. This assumes + // such an account exists. + admin = await impersonate(await authorizer.getRoleMember(await authorizer.DEFAULT_ADMIN_ROLE(), 0)); + }); + + before('approve tokens by sender', async () => { + // Even though the sender only starts with USDC, they will eventually get DAI and need to use it in the Vault + await Promise.all( + [usdc, dai].map(async (token) => await token.connect(sender).approve(vault.address, MAX_UINT256)) + ); + }); + + before('approve relayer at the authorizer', async () => { + const relayerActionIds = await Promise.all( + ['swap', 'batchSwap', 'joinPool', 'exitPool', 'setRelayerApproval', 'manageUserBalance'].map((action) => + vault.getActionId(vault.interface.getSighash(action)) + ) + ); + + // Grant relayer permission to call all relayer functions + await authorizer.connect(admin).grantRoles(relayerActionIds, relayer.address); + }); + + afterEach('disapprove relayer by sender', async () => { + await vault.connect(sender).setRelayerApproval(sender.address, relayer.address, false); + }); + + async function getApprovalCalldata(deadline: BigNumber): Promise { + return library.interface.encodeFunctionData('setRelayerApproval', [ + relayer.address, + true, + RelayerAuthorization.encodeCalldataAuthorization( + '0x', + deadline, + await RelayerAuthorization.signSetRelayerApprovalAuthorization( + vault, + sender, + relayer, + vault.interface.encodeFunctionData('setRelayerApproval', [sender.address, relayer.address, true]), + deadline + ) + ), + ]); + } + + it('sender can approve relayer, swap and join', async () => { + const deadline = await fromNow(30 * MINUTE); + + // Swap USDC for DAI + const swapCalldata = library.interface.encodeFunctionData('swap', [ + { + poolId: DAI_USDC_USDT_POOL, + kind: SwapKind.GivenIn, + assetIn: USDC, + assetOut: DAI, + amount: await usdc.balanceOf(sender.address), + userData: '0x', + }, + { + sender: sender.address, + recipient: sender.address, + fromInternalBalance: false, + toInternalBalance: false, + }, + 0, // No min amount out + deadline, + 0, // No eth + toChainedReference(42), + ]); + + // Use all DAI to join the ETH-DAI pool + + const { tokens: poolTokens } = await vault.getPoolTokens(ETH_DAI_POOL); + const amountsIn = poolTokens.map((poolToken: string) => + poolToken.toLowerCase() == DAI.toLowerCase() ? toChainedReference(42) : 0 + ); + + const joinCalldata = library.interface.encodeFunctionData('joinPool', [ + ETH_DAI_POOL, + 0, // Weighted Pool + sender.address, + sender.address, + { + assets: poolTokens, + maxAmountsIn: amountsIn, + userData: WeightedPoolEncoder.joinExactTokensInForBPTOut(amountsIn, 0), + fromInternalBalance: false, + }, + 0, // No eth + 0, // No output reference + ]); + + await relayer.connect(sender).multicall([getApprovalCalldata(deadline), swapCalldata, joinCalldata]); + + const pool = await task.instanceAt('IERC20', ETH_DAI_POOL.slice(0, 42)); + expect(await pool.balanceOf(sender.address)).to.be.gt(0); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/artifact/AaveLinearPool.json b/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/artifact/AaveLinearPool.json new file mode 100644 index 0000000..30ac27c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/artifact/AaveLinearPool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20", "name": "mainToken", "type": "address"}, {"internalType": "contract IERC20", "name": "wrappedToken", "type": "address"}, {"internalType": "uint256", "name": "upperTarget", "type": "uint256"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "address", "name": "owner", "type": "address"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "lowerTarget", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "upperTarget", "type": "uint256"}], "name": "TargetsSet", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getBptIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMainIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMainToken", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getScalingFactors", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getTargets", "outputs": [{"internalType": "uint256", "name": "lowerTarget", "type": "uint256"}, {"internalType": "uint256", "name": "upperTarget", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVirtualSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedToken", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedTokenRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "indexIn", "type": "uint256"}, {"internalType": "uint256", "name": "indexOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "bytes", "name": "poolConfig", "type": "bytes"}], "name": "setAssetManagerPoolConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bool", "name": "paused", "type": "bool"}], "name": "setPaused", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "newLowerTarget", "type": "uint256"}, {"internalType": "uint256", "name": "newUpperTarget", "type": "uint256"}], "name": "setTargets", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/artifact/AaveLinearPoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/artifact/AaveLinearPoolFactory.json new file mode 100644 index 0000000..c2eb971 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/artifact/AaveLinearPoolFactory.json @@ -0,0 +1,165 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "AaveLinearPoolFactory", + "sourceName": "contracts/aave/AaveLinearPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract LinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101406040523480156200001257600080fd5b5060405162005f2638038062005f268339810160408190526200003591620001c3565b80604051806020016200004890620001b5565b601f1982820381018352601f909101166040528051819060006002820460a081905280830360e0819052818552909150836200009081620000f9602090811b620002eb17901c565b60601b6001600160601b0319166080528285018051838252620000bf82620000f9602090811b620002eb17901c565b6001600160601b0319606091821b811660c0529690935290529590951b90911661010052505050426276a700016101205250620001f39050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001476001600160a01b03831615156101ac6200014d565b50919050565b816200015e576200015e8162000162565b5050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6153be8062000b6883390190565b600060208284031215620001d5578081fd5b81516001600160a01b0381168114620001ec578182fd5b9392505050565b60805160601c60a05160c05160601c60e0516101005160601c61012051610913620002556000398061023852806102615250806102c952508061035252508061014a52806103ce52508061037352508061012952806103aa52506109136000f3fe608060405234801561001057600080fd5b50600436106100715760003560e01c80632da47c40116100505780632da47c40146100ca5780636634b753146100e05780638d928af81461010057610071565b8062c194db14610076578063174481fa146100945780632ccb254a146100aa575b600080fd5b61007e610108565b60405161008b91906107f0565b60405180910390f35b61009c610127565b60405161008b9291906107be565b6100bd6100b83660046106a7565b61016d565b60405161008b9190610803565b6100d2610232565b60405161008b9291906108aa565b6100f36100ee36600461068b565b61029c565b60405161008b91906107e5565b6100bd6102c7565b60606101226040518060200160405280600081525061034a565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080600061017a610232565b9150915060006101c161018b6102c7565b8c8c8c8c8c8c8a8a8e6040516020016101ad9a99989796959493929190610824565b604051602081830303815290604052610423565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561020b57600080fd5b505af115801561021f573d6000803e3d6000fd5b50929d9c50505050505050505050505050565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561028e57807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610297565b60009250600091505b509091565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061034473ffffffffffffffffffffffffffffffffffffffff831615156101ac6104ae565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016104158183866104c0565b505050505050505050919050565b60008061042f8361053a565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b816104bc576104bc81610582565b5050565b5b602081106104fe5781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016104c1565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600060606105478361034a565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811661057b573d6000803e3d6000fd5b9392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600082601f8301126105ff578081fd5b813567ffffffffffffffff80821115610616578283fd5b60405160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501168201018181108382111715610654578485fd5b60405282815292508284830160200186101561066f57600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121561069c578081fd5b813561057b816108b8565b600080600080600080600060e0888a0312156106c1578283fd5b873567ffffffffffffffff808211156106d8578485fd5b6106e48b838c016105ef565b985060208a01359150808211156106f9578485fd5b506107068a828b016105ef565b9650506040880135610717816108b8565b94506060880135610727816108b8565b93506080880135925060a0880135915060c0880135610745816108b8565b8091505092959891949750929550565b60008151808452815b8181101561077a5760208185018101518683018201520161075e565b8181111561078b5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b60006020825261057b6020830184610755565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600061014073ffffffffffffffffffffffffffffffffffffffff808e1684528160208501526108558285018e610755565b91508382036040850152610869828d610755565b9a811660608501529889166080840152505060a081019590955260c085019390935260e0840191909152610100830152909116610120909101529392505050565b918252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff811681146108da57600080fd5b5056fea26469706673582212204858ec0f455045cec21a3fe3ffdea5590ca82f4b3c22a4f30ae2383cb101a6eb64736f6c634300070100336102c06040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b50604051620053be380380620053be8339810160408190526200005a9162000bbf565b898989898989898989898960008a8a620000768b8b30620004e1565b6040805160038082526080820190925290602082016060803683370190505089898989828289898d8280604051806040016040528060018152602001603160f81b81525085858a336001600160a01b031660001b806080818152505050806001600160a01b031660a0816001600160a01b031660601b815250505081600390805190602001906200010992919062000a30565b5080516200011f90600490602084019062000a30565b505060058054601260ff1990911617905550815160209283012060c052805191012060e052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6101005260601b6001600160601b03191661014052506200019290506276a700831115610194620005b0565b620001a662278d00821115610195620005b0565b4290910161016081905201610180528551620001c8906002111560c8620005b0565b620001e2620001d6620005c5565b8751111560c9620005b0565b620001f886620005ca60201b620014881760201c565b6200020384620005d6565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f9062000234908d9060040162000d5d565b602060405180830381600087803b1580156200024f57600080fd5b505af115801562000264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028a919062000ba6565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002bf9084908b908b9060040162000cc1565b600060405180830381600087803b158015620002da57600080fd5b505af1158015620002ef573d6000803e3d6000fd5b50505050806101a081815250505050505050505050505050866001600160a01b03166101c0816001600160a01b031660601b81525050856001600160a01b03166101e0816001600160a01b031660601b8152505060008060006200035b8a8a306200066260201b60201c565b610200819052610220839052610240829052919450925090506200037f8a62000758565b610260526200038e8962000758565b610280526000620003a18b828b6200082c565b5050505050505050505050505050856001600160a01b031663b4dcfc776040518163ffffffff1660e01b815260040160206040518083038186803b158015620003e957600080fd5b505afa158015620003fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000424919062000b80565b6001600160a01b03166102a0816001600160a01b031660601b81525050620004d1866001600160a01b0316634800d97f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200047f57600080fd5b505afa15801562000494573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004ba919062000b80565b6001600160a01b03898116911614610208620005b0565b5050505050505050505062000dab565b606060008080620004f487878762000662565b60408051600380825260808201909252939650919450925060208201606080368337019050509350868484815181106200052a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050858483815181106200055857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050848482815181106200058657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505050509392505050565b81620005c157620005c181620008da565b5050565b600390565b80620005c1816200092d565b620005eb64e8d4a5100082101560cb620005b0565b6200060367016345785d8a000082111560ca620005b0565b620006228160c0600854620009ba60201b62001492179092919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906200065790839062000d72565b60405180910390a150565b6000806000846001600160a01b0316866001600160a01b03161015620006eb57836001600160a01b0316856001600160a01b03161015620006ae5750600091506001905060026200074f565b836001600160a01b0316866001600160a01b03161015620006da5750600091506002905060016200074f565b50600191506002905060006200074f565b846001600160a01b0316846001600160a01b03161015620007175750600291506001905060006200074f565b856001600160a01b0316846001600160a01b03161015620007435750600291506000905060016200074f565b50600191506000905060025b93509350939050565b60006001600160a01b0382163014156200077c5750670de0b6b3a764000062000827565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620007b857600080fd5b505afa158015620007cd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007f3919062000c9e565b60ff169050600062000812601283620009cf60201b620014a81760201c565b905080600a0a670de0b6b3a764000002925050505b919050565b6200083d8183111561014c620005b0565b620008556001600160601b0382111561014d620005b0565b6200089062000871826060620009ec60201b620014be1760201c565b62000889846000620009ec60201b620014be1760201c565b17620009f0565b826001600160a01b03167fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d12808383604051620008cd92919062000d7b565b60405180910390a2505050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6002815110156200093e57620009b7565b6000816000815181106200094e57fe5b602002602001015190506000600190505b8251811015620009b45760008382815181106200097857fe5b60200260200101519050620009a9816001600160a01b0316846001600160a01b0316106065620005b060201b60201c565b91506001016200095f565b50505b50565b6001600160401b03811b1992909216911b1790565b6000620009e1838311156001620005b0565b508082035b92915050565b1b90565b62000a0f81600060085462000a1560201b620014c2179092919060201c565b60085550565b6001600160c01b03828116821b90821b198416179392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000a7357805160ff191683800117855562000aa3565b8280016001018555821562000aa3579182015b8281111562000aa357825182559160200191906001019062000a86565b5062000ab192915062000ab5565b5090565b5b8082111562000ab1576000815560010162000ab6565b8051620009e68162000d95565b600082601f83011262000aea578081fd5b81516001600160401b038082111562000b01578283fd5b6040516020601f8401601f191682018101838111838210171562000b23578586fd5b8060405250819450838252868185880101111562000b4057600080fd5b600092505b8383101562000b64578583018101518284018201529182019162000b45565b8383111562000b765760008185840101525b5050505092915050565b60006020828403121562000b92578081fd5b815162000b9f8162000d95565b9392505050565b60006020828403121562000bb8578081fd5b5051919050565b6000806000806000806000806000806101408b8d03121562000bdf578586fd5b62000beb8c8c62000acc565b60208c0151909a506001600160401b038082111562000c08578788fd5b62000c168e838f0162000ad9565b9a5060408d015191508082111562000c2c578788fd5b5062000c3b8d828e0162000ad9565b98505062000c4d8c60608d0162000acc565b965062000c5e8c60808d0162000acc565b955060a08b0151945060c08b0151935060e08b015192506101008b0151915062000c8d8c6101208d0162000acc565b90509295989b9194979a5092959850565b60006020828403121562000cb0578081fd5b815160ff8116811462000b9f578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000d0d5762000cfa855162000d89565b8352938301939183019160010162000ce5565b505084810360408601528551808252908201925081860190845b8181101562000d4f5762000d3c835162000d89565b8552938301939183019160010162000d27565b509298975050505050505050565b602081016003831062000d6c57fe5b91905290565b90815260200190565b918252602082015260400190565b6001600160a01b031690565b6001600160a01b0381168114620009b757600080fd5b60805160a05160601c60c05160e05161010051610120516101405160601c61016051610180516101a0516101c05160601c6101e05160601c61020051610220516102405161026051610280516102a05160601c61443962000f85600039806124d352508061159c525080611538528061241f5250806107c65280610b7952806115c4528061276252806129125280612a695280612bdb5280612d775280612ece5250806109745280610b3f528061155a5280611c0d528061272e528061289752806128de52806129f35280612a355280612ba75280612d015280612d435280612e585280612e9a525080610bba5280610d895280610e76528061140952806116055280612364528061279952806129495280612aa05280612c125280612dae5280612f0552806130ea528061312252508061145c528061172052806117ec528061244552806126e352806128235280612b5d5280612c8d525080610998528061101552806116d752806117a35280611c4352806123e452806126a452806127c5528061297f5280612b1e5280612c3e5280612de45250806109155250806119cc5250806119a8525080610f365250806110cb525080611ad2525080611b14525080611af3525080610f12525080610e9c52506144396000f3fe608060405234801561001057600080fd5b50600436106102d35760003560e01c8063679aefce1161018657806395d89b41116100e3578063d505accf11610097578063de82cd3411610071578063de82cd341461056b578063f174e24114610573578063f5431aa81461057b576102d3565b8063d505accf14610532578063d5c096c414610545578063dd62ed3e14610558576102d3565b8063a457c2d7116100c8578063a457c2d714610504578063a9059cbb14610517578063aaabadc51461052a576102d3565b806395d89b41146104e95780639f11080e146104f1576102d3565b806382687a561161013a57806387ec68171161011f57806387ec6817146104c6578063893d20e8146104d95780638d928af8146104e1576102d3565b806382687a56146104ab578063851c1bb3146104b3576102d3565b806374f3b0091161016b57806374f3b0091461046f5780637ecebe00146104905780638129fc1c146104a3576102d3565b8063679aefce1461045457806370a082311461045c576102d3565b80633644e515116102345780634de046d5116101e857806355c67628116101cd57806355c67628146104155780636028bfd41461041d57806363fe3b561461043e576102d3565b80634de046d5146103ed57806350dd6ed914610402576102d3565b806338fff2d01161021957806338fff2d0146103ca57806339509351146103d25780634d64cd74146103e5576102d3565b80633644e515146103af57806338e9922e146103b7576102d3565b806318160ddd1161028b5780631dd746ea116102705780631dd746ea1461037257806323b872dd14610387578063313ce5671461039a576102d3565b806318160ddd146103535780631c0de0511461035b576102d3565b8063095ea7b3116102bc578063095ea7b31461031657806316b8d6ff1461033657806316c38b3c1461033e576102d3565b806301ec954a146102d857806306fdde0314610301575b600080fd5b6102eb6102e6366004613e6d565b610583565b6040516102f8919061418d565b60405180910390f35b6103096106f9565b6040516102f89190614345565b610329610324366004613baa565b6107ad565b6040516102f8919061416a565b6102eb6107c4565b61035161034c366004613ca1565b6107e8565b005b6102eb6107fc565b610363610802565b6040516102f893929190614175565b61037a61082b565b6040516102f89190614132565b610329610395366004613af5565b61083a565b6103a26108ce565b6040516102f8919061437f565b6102eb6108d7565b6103516103c5366004613f8c565b6108e1565b6102eb610913565b6103296103e0366004613baa565b610937565b6102eb610972565b6103f5610996565b6040516102f8919061411e565b610351610410366004613dd8565b6109ba565b6102eb6109d8565b61043061042b366004613cd9565b6109e9565b6040516102f8929190614358565b610446610a20565b6040516102f8929190614371565b6102eb610a4e565b6102eb61046a366004613aa1565b610c02565b61048261047d366004613cd9565b610c21565b6040516102f8929190614145565b6102eb61049e366004613aa1565b610c9f565b610351610cba565b6102eb610e74565b6102eb6104c1366004613d7c565b610e98565b6104306104d4366004613cd9565b610eea565b6103f5610f10565b6103f5610f34565b610309610f58565b6103516104ff366004613fbc565b610fd7565b610329610512366004613baa565b611041565b610329610525366004613baa565b61107f565b6103f561108c565b610351610540366004613b35565b611096565b610482610553366004613cd9565b6111df565b6102eb610566366004613abd565b611310565b6102eb61136b565b6103f561145a565b6102eb61147e565b600084608001516105b0610595610f34565b6001600160a01b0316336001600160a01b03161460cd6114ee565b6105c56105bb610913565b82146101f46114ee565b6105cd6114fc565b6105e76003851080156105e05750600384105b60646114ee565b60606105f1611511565b90506105fd868261163e565b600080610608610a20565b915091506106146138f8565b60405180606001604052806106276109d8565b815260208101859052604001839052905060008a51600181111561064757fe5b14156106ab5761066e8a60600151858a8151811061066157fe5b602002602001015161169f565b60608b015260006106808b8b846116ab565b905061069f81868a8151811061069257fe5b6020026020010151611772565b965050505050506106f0565b6106bf8a6060015185898151811061066157fe5b60608b015260006106d18b8b8461177e565b905061069f81868b815181106106e357fe5b6020026020010151611833565b50949350505050565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107a35780601f10610778576101008083540402835291602001916107a3565b820191906000526020600020905b81548152906001019060200180831161078657829003601f168201915b5050505050905090565b60006107ba33848461183f565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6107f06118a7565b6107f9816118ed565b50565b60025490565b600080600061080f611989565b15925061081a6119a6565b91506108246119ca565b9050909192565b6060610835611511565b905090565b6000806108478533611310565b905061086b336001600160a01b03871614806108635750838210155b61019e6114ee565b6108768585856119ee565b336001600160a01b038616148015906108af57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114155b156108c1576108c1853385840361183f565b60019150505b9392505050565b60055460ff1690565b6000610835611ace565b6000806108ec610a20565b915091506109056108fd8383611b6b565b61014f6114ee565b61090e83611c83565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916107ba91859061096d9086611c9c565b61183f565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6109c26118a7565b6109ca6114fc565b6109d48282611cae565b5050565b6008546000906108359060c0611d8e565b600060606109ff86516109fa611d9c565b611da1565b610a1489898989898989611dae611e52611eb3565b97509795505050505050565b6000806000610a2d612043565b9050610a3a816000612049565b9250610a47816060612049565b9150509091565b600080610a59610913565b90506060610a65610f34565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610a90919061418d565b60006040518083038186803b158015610aa857600080fd5b505afa158015610abc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ae49190810190613bd5565b50915050610af981610af4611511565b61163e565b600080610b04610a20565b91509150610b106138f8565b6040518060600160405280610b236109d8565b81526020018481526020018381525090506000610baf610b76867f000000000000000000000000000000000000000000000000000000000000000081518110610b6857fe5b60200260200101518461205b565b867f000000000000000000000000000000000000000000000000000000000000000081518110610ba257fe5b60200260200101516120bc565b9050610bf7610bf0867f000000000000000000000000000000000000000000000000000000000000000081518110610be357fe5b60200260200101516120c8565b82906120db565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610c30610595610f34565b610c3b6105bb610913565b6060610c45611511565b9050610c51888261163e565b6000606080610c668e8e8e8e8e8e8a8f611dae565b925092509250610c768d84612132565b610c808285611e52565b610c8a8185611e52565b909550935050505b5097509795505050505050565b6001600160a01b031660009081526006602052604090205490565b6000610cc4610913565b90506060610cd0610f34565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610cfb919061418d565b60006040518083038186803b158015610d1357600080fd5b505afa158015610d27573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d4f9190810190613bd5565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff817f000000000000000000000000000000000000000000000000000000000000000081518110610db257fe5b602002602001018181525050610dc6613919565b6040518060800160405280610dda8561213c565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610e0b610f34565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610e3c94939291906141b5565b600060405180830381600087803b158015610e5657600080fd5b505af1158015610e6a573d6000803e3d6000fd5b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610ecd9291906140a8565b604051602081830303815290604052805190602001209050919050565b60006060610efb86516109fa611d9c565b610a148989898989898961213f61215d611eb3565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107a35780601f10610778576101008083540402835291602001916107a3565b610fdf6118a7565b600080610fea610a20565b91509150610ffb6108fd8383611b6b565b6110106110088585611b6b565b6101576114ee565b61103b7f000000000000000000000000000000000000000000000000000000000000000085856121be565b50505050565b60008061104e3385611310565b9050808310611068576110633385600061183f565b611075565b611075338585840361183f565b5060019392505050565b60006107ba3384846119ee565b600061083561224f565b6110a48442111560d16114ee565b6001600160a01b03871660009081526006602090815260408083205490519092916110fb917f0000000000000000000000000000000000000000000000000000000000000000918c918c918c9188918d9101614297565b604051602081830303815290604052805190602001209050600061111e826122c9565b90506000600182888888604051600081526020016040526040516111459493929190614327565b6020604051602081039080840390855afa158015611167573d6000803e3d6000fd5b5050604051601f19015191506111a990506001600160a01b038216158015906111a157508b6001600160a01b0316826001600160a01b0316145b6101f86114ee565b6001600160a01b038b1660009081526006602052604090206001850190556111d28b8b8b61183f565b5050505050505050505050565b606080886111ee610595610f34565b6111f96105bb610913565b6060611203611511565b905061120d6107fc565b6112c057600060606112228d8d8d868b6122e5565b9150915061123b6112316123a6565b83101560cc6114ee565b61124d60006112486123a6565b6123ab565b6112608b6112596123a6565b84036123ab565b61126a818461215d565b80611273611d9c565b67ffffffffffffffff8111801561128957600080fd5b506040519080825280602002602001820160405280156112b3578160200160208202803683370190505b5095509550505050610c92565b6112ca888261163e565b60006060806112df8e8e8e8e8e8e8a8f61213f565b9250925092506112ef8c846123ab565b6112f9828561215d565b6113038185611e52565b9095509350610c92915050565b600061131a610f34565b6001600160a01b0316826001600160a01b0316141561135a57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6107be565b61136483836123b5565b90506107be565b60006060611377610f34565b6001600160a01b031663f94d466861138d610913565b6040518263ffffffff1660e01b81526004016113a9919061418d565b60006040518083038186803b1580156113c157600080fd5b505afa1580156113d5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113fd9190810190613bd5565b509150506000611448827f00000000000000000000000000000000000000000000000000000000000000008151811061143257fe5b6020026020010151611443306123e0565b61169f565b9050611453816124ba565b9250505090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108356124ce565b806109d481612581565b67ffffffffffffffff811b1992909216911b1790565b60006114b88383111560016114ee565b50900390565b1b90565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116821b90821b198416179392505050565b816109d4576109d4816125fa565b61150f611507611989565b6101926114ee565b565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f00000000000000000000000000000000000000000000000000000000000000008151811061158357fe5b6020026020010181815250506115c161159a6124ce565b7f000000000000000000000000000000000000000000000000000000000000000090612667565b817f0000000000000000000000000000000000000000000000000000000000000000815181106115ed57fe5b602002602001018181525050670de0b6b3a7640000817f00000000000000000000000000000000000000000000000000000000000000008151811061162e57fe5b6020908102919091010152905090565b60005b611649611d9c565b81101561090e5761168083828151811061165f57fe5b602002602001015183838151811061167357fe5b6020026020010151612667565b83828151811061168c57fe5b6020908102919091010152600101611641565b60006108c78383612667565b60208301516000906001600160a01b03163014156116d5576116ce84848461269d565b90506108c7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b0316141561171e576116ce84848461281c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415611767576116ce848484612978565b6108c76101356125fa565b60006108c78383612acf565b60408301516000906001600160a01b03163014156117a1576116ce848484612b17565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156117ea576116ce848484612c86565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b03161415611767576116ce848484612ddd565b60006108c783836120db565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061189a90859061418d565b60405180910390a3505050565b60006118d66000357fffffffff0000000000000000000000000000000000000000000000000000000016610e98565b90506107f96118e58233612f34565b6101916114ee565b801561190d576119086118fe6119a6565b42106101936114ee565b611922565b6119226119186119ca565b42106101a96114ee565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be649061197e90839061416a565b60405180910390a150565b60006119936119ca565b42118061083557505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b611a056001600160a01b03841615156101986114ee565b611a1c6001600160a01b03831615156101996114ee565b611a2783838361090e565b6001600160a01b038316600090815260208190526040902054611a4d90826101a061301d565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611a7c9082611c9c565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061189a90859061418d565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611b3b613033565b30604051602001611b509594939291906142cb565b60405160208183030381529060405280519060200120905090565b600080611b76610913565b90506060611b82610f34565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401611bad919061418d565b60006040518083038186803b158015611bc557600080fd5b505afa158015611bd9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c019190810190613bd5565b509150506000611c67827f000000000000000000000000000000000000000000000000000000000000000081518110611c3657fe5b60200260200101516114437f00000000000000000000000000000000000000000000000000000000000000006123e0565b9050858110158015611c795750848111155b9695505050505050565b611c8b6118a7565b611c936114fc565b6107f981613037565b60008282016108c784821015836114ee565b6000611cb8610913565b90506000611cc4610f34565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b8152600401611cf1929190614310565b60806040518083038186803b158015611d0957600080fd5b505afa158015611d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d419190613fdd565b6040517f18e736d40000000000000000000000000000000000000000000000000000000081529094506001600160a01b03851693506318e736d49250610e3c9150859087906004016142f7565b1c67ffffffffffffffff1690565b600390565b6109d481831460676114ee565b60006060806000611dbe856130a2565b90506000818015611dcb57fe5b14611de057611ddb61014e6125fa565b611e43565b611de86130b8565b611df289866130cc565b9094509250611dff611d9c565b67ffffffffffffffff81118015611e1557600080fd5b50604051908082528060200260200182016040528015611e3f578160200160208202803683370190505b5091505b50985098509895505050505050565b60005b611e5d611d9c565b81101561090e57611e94838281518110611e7357fe5b6020026020010151838381518110611e8757fe5b6020026020010151612acf565b838281518110611ea057fe5b6020908102919091010152600101611e55565b333014611fa2576000306001600160a01b0316600036604051611ed79291906140d8565b6000604051808303816000865af19150503d8060008114611f14576040519150601f19603f3d011682016040523d82523d6000602084013e611f19565b606091505b505090508060008114611f2857fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611f84573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b6060611fac611511565b9050611fb8878261163e565b60006060611fd08c8c8c8c8c8c898d8d63ffffffff16565b5091509150611fe381848663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08301526020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b60085490565b1c6bffffffffffffffffffffffff1690565b6000816020015183101561209457815160208301516000916120809186900390612667565b905061208c84826114a8565b9150506107be565b816040015183116120a65750816107be565b8151604083015160009161208091860390612667565b60006108c78383611c9c565b6dffffffffffffffffffffffffffff0390565b60006120ea82151560046114ee565b826120f7575060006107be565b670de0b6b3a76400008381029061211a9085838161211157fe5b041460056114ee565b82600182038161212657fe5b046001019150506107be565b6109d48282613153565b90565b600060608061214f61014e6125fa565b985098509895505050505050565b60005b612168611d9c565b81101561090e5761219f83828151811061217e57fe5b602002602001015183838151811061219257fe5b60200260200101516120db565b8382815181106121ab57fe5b6020908102919091010152600101612160565b6121cd8183111561014c6114ee565b6121e86bffffffffffffffffffffffff82111561014d6114ee565b6122076121f68260606114be565b6122018460006114be565b1761320f565b826001600160a01b03167fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d12808383604051612242929190614371565b60405180910390a2505050565b6000612259610f34565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561229157600080fd5b505afa1580156122a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108359190613dbc565b60006122d3611ace565b82604051602001610ecd9291906140e8565b600060606122f16114fc565b6123086001600160a01b03871630146101566114ee565b61231f6001600160a01b03861630146101566114ee565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff817f00000000000000000000000000000000000000000000000000000000000000008151811061238d57fe5b6020908102919091010152909890975095505050505050565b600090565b6109d48282613224565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561244357507f0000000000000000000000000000000000000000000000000000000000000000610c1c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561248f5761248861159a6124ce565b9050610c1c565b6001600160a01b0382163014156124af5750670de0b6b3a7640000610c1c565b610c1c6101356125fa565b60006107be826124c86107fc565b906114a8565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d15e0053612508610996565b6040518263ffffffff1660e01b8152600401612524919061411e565b60206040518083038186803b15801561253c57600080fd5b505afa158015612550573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125749190613fa4565b633b9aca00900492915050565b600281511015612590576107f9565b60008160008151811061259f57fe5b602002602001015190506000600190505b825181101561090e5760008382815181106125c757fe5b602002602001015190506125f0816001600160a01b0316846001600160a01b03161060656114ee565b91506001016125b0565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600082820261268b84158061268457508385838161268157fe5b04145b60036114ee565b670de0b6b3a764000090049392505050565b60006127237f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316148061271b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b6101356114ee565b6128148460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061275757fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061278b57fe5b60200260200101516127c2877f000000000000000000000000000000000000000000000000000000000000000081518110610be357fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612808576132b261280c565b6133125b63ffffffff16565b949350505050565b60006128787f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316148061271b575060408501516001600160a01b031630146101356114ee565b60408401516001600160a01b031630146128d3576128ce8460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106128c057fe5b60200260200101518461337b565b612814565b6128148460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061290757fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061293b57fe5b6020026020010151612972877f000000000000000000000000000000000000000000000000000000000000000081518110610be357fe5b866133ab565b60006129d47f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316148061271b575060408501516001600160a01b031630146101356114ee565b60408401516001600160a01b03163014612a2a576128ce8460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612a1c57fe5b602002602001015184613411565b6128148460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612a5e57fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612a9257fe5b6020026020010151612ac9877f000000000000000000000000000000000000000000000000000000000000000081518110610be357fe5b86613451565b6000612ade82151560046114ee565b82612aeb575060006107be565b670de0b6b3a764000083810290612b059085838161211157fe5b828181612b0e57fe5b049150506107be565b6000612b9c7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b0316148061271b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b0316146101356114ee565b6128148460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612bd057fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612c0457fe5b6020026020010151612c3b877f000000000000000000000000000000000000000000000000000000000000000081518110610be357fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b031614612c81576134b861280c565b61350f565b6000612ce27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b0316148061271b575060208501516001600160a01b031630146101356114ee565b60208401516001600160a01b03163014612d38576128ce8460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612d2a57fe5b602002602001015184613579565b6128148460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612d6c57fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612da057fe5b6020026020010151612dd7877f000000000000000000000000000000000000000000000000000000000000000081518110610be357fe5b866135a3565b6000612e397f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b0316148061271b575060208501516001600160a01b031630146101356114ee565b60208401516001600160a01b03163014612e8f576128ce8460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612e8157fe5b6020026020010151846135f2565b6128148460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612ec357fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612ef757fe5b6020026020010151612f2e877f000000000000000000000000000000000000000000000000000000000000000081518110610be357fe5b86613627565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b612f53610f10565b6001600160a01b031614158015612f6e5750612f6e8361367b565b15612f9657612f7b610f10565b6001600160a01b0316336001600160a01b03161490506107be565b612f9e61224f565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b8152600401612fcd93929190614196565b60206040518083038186803b158015612fe557600080fd5b505afa158015612ff9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113649190613cbd565b600061302c84841115836114ee565b5050900390565b4690565b61304a64e8d4a5100082101560cb6114ee565b61306067016345785d8a000082111560ca6114ee565b60085461306f908260c0611492565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc9061197e90839061418d565b6000818060200190518101906107be9190613e26565b61150f6130c3611989565b156101af6114ee565b6000606060006130db846136b7565b905060606131468683613120897f00000000000000000000000000000000000000000000000000000000000000008151811061311357fe5b60200260200101516124ba565b7f00000000000000000000000000000000000000000000000000000000000000006136cd565b9196919550909350505050565b61316a6001600160a01b038316151561019b6114ee565b6131768260008361090e565b6001600160a01b03821660009081526020819052604090205461319c90826101a161301d565b6001600160a01b0383166000908152602081905260409020556002546131c29082613789565b6002556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061320390859061418d565b60405180910390a35050565b60085461321e908260006114c2565b60085550565b6132306000838361090e565b60025461323d9082611c9c565b6002556001600160a01b0382166000908152602081905260409020546132639082611c9c565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061320390859061418d565b6000806132bf868461205b565b905060006132cd82876120bc565b905060006132db868a6114a8565b905060006132f6846124c86132f08587613797565b8a6137b1565b905061330288826114a8565b9450505050505b95945050505050565b60008061331f868461205b565b9050600061332d82876120bc565b9050600061334461333e838b613797565b876137e4565b9050600061335284836114a8565b905060006133608288613804565b905061336c8a826114a8565b9b9a5050505050505050505050565b600080613388848461205b565b9050600061339f6133998688611c9c565b8561205b565b9050611c7981836114a8565b6000826133c3576133bc868361205b565b9050613309565b60006133cf868461205b565b905060006133e0613399888a611c9c565b905060006133ee82846114a8565b905060006133fc84896120bc565b905061330261340b8884613797565b826137e4565b60008061341e848461205b565b9050600061342c82876114a8565b9050600061343a8286613804565b905061344686826114a8565b979650505050505050565b60008261345f575084613309565b600061346b868461205b565b9050600061347982876120bc565b90506000613487878a611c9c565b9050600061349584836120bc565b905060006134ac6134a68984613797565b856137e4565b905061336c81896114a8565b6000826134c6575084613309565b60006134d2868461205b565b905060006134e082876120bc565b905060006134ee868a611c9c565b90506000613503846124c86132f08587613797565b905061330281896114a8565b600082613520576133bc8683613804565b600061352c868461205b565b9050600061353a82876120bc565b9050600061355161354b838b613797565b876137b1565b9050600061355f8483611c9c565b9050600061356d8288613804565b905061336c818b6114a8565b600080613586848461205b565b9050600061359761339986886114a8565b9050611c7982826114a8565b6000806135b0868461205b565b905060006135c1613399888a6114a8565b905060006135cf83836114a8565b905060006135dd84896120bc565b90506133026135ec8884613797565b826137b1565b6000806135ff848461205b565b9050600061360d8287611c9c565b9050600061361b8286613804565b905061344681876114a8565b600080613634868461205b565b9050600061364282876120bc565b90506000613650878a6114a8565b9050600061365e84836120bc565b9050600061366f6134a68984613797565b905061336c88826114a8565b60006136a67f9f11080e00000000000000000000000000000000000000000000000000000000610e98565b8214806107be57506107be82613894565b6000818060200190518101906108c79190613e41565b606060006136db8585612acf565b90506060865167ffffffffffffffff811180156136f757600080fd5b50604051908082528060200260200182016040528015613721578160200160208202803683370190505b50905060005b875181101561377e578481146137765761375d8389838151811061374757fe5b602002602001015161266790919063ffffffff16565b82828151811061376957fe5b6020026020010181815250505b600101613727565b509695505050505050565b60006108c78383600161301d565b60008282026108c784158061268457508385838161268157fe5b60006137c082151560046114ee565b826137cd575060006107be565b8160018403816137d957fe5b0460010190506107be565b60006137f382151560046114ee565b8183816137fc57fe5b049392505050565b6000816020015183101561384d5781516113649061382b90670de0b6b3a764000090611c9c565b60208401518451613847916138409190612667565b8690611c9c565b90612acf565b8160400151831161385f5750816107be565b81516113649061387890670de0b6b3a7640000906114a8565b604084015184516138479161388d9190612667565b86906114a8565b60006138bf7f38e9922e00000000000000000000000000000000000000000000000000000000610e98565b8214806107be57506138f07f50dd6ed900000000000000000000000000000000000000000000000000000000610e98565b909114919050565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b80356107be816143e0565b600082601f83011261395e578081fd5b813561397161396c826143b4565b61438d565b81815291506020808301908481018184028601820187101561399257600080fd5b60005b848110156139b157813584529282019290820190600101613995565b505050505092915050565b600082601f8301126139cc578081fd5b81516139da61396c826143b4565b8181529150602080830190848101818402860182018710156139fb57600080fd5b60005b848110156139b1578151845292820192908201906001016139fe565b600082601f830112613a2a578081fd5b813567ffffffffffffffff811115613a40578182fd5b613a536020601f19601f8401160161438d565b9150808252836020828501011115613a6a57600080fd5b8060208401602084013760009082016020015292915050565b8051600181106107be57600080fd5b8035600281106107be57600080fd5b600060208284031215613ab2578081fd5b81356108c7816143e0565b60008060408385031215613acf578081fd5b8235613ada816143e0565b91506020830135613aea816143e0565b809150509250929050565b600080600060608486031215613b09578081fd5b8335613b14816143e0565b92506020840135613b24816143e0565b929592945050506040919091013590565b600080600080600080600060e0888a031215613b4f578283fd5b8735613b5a816143e0565b96506020880135613b6a816143e0565b95506040880135945060608801359350608088013560ff81168114613b8d578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613bbc578182fd5b8235613bc7816143e0565b946020939093013593505050565b600080600060608486031215613be9578081fd5b835167ffffffffffffffff80821115613c00578283fd5b818601915086601f830112613c13578283fd5b8151613c2161396c826143b4565b80828252602080830192508086018b828387028901011115613c41578788fd5b8796505b84871015613c6c578051613c58816143e0565b845260019690960195928101928101613c45565b508901519097509350505080821115613c83578283fd5b50613c90868287016139bc565b925050604084015190509250925092565b600060208284031215613cb2578081fd5b81356108c7816143f5565b600060208284031215613cce578081fd5b81516108c7816143f5565b600080600080600080600060e0888a031215613cf3578081fd5b873596506020880135613d05816143e0565b95506040880135613d15816143e0565b9450606088013567ffffffffffffffff80821115613d31578283fd5b613d3d8b838c0161394e565b955060808a0135945060a08a0135935060c08a0135915080821115613d60578283fd5b50613d6d8a828b01613a1a565b91505092959891949750929550565b600060208284031215613d8d578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c7578182fd5b600060208284031215613dcd578081fd5b81516108c7816143e0565b60008060408385031215613dea578182fd5b8235613df5816143e0565b9150602083013567ffffffffffffffff811115613e10578182fd5b613e1c85828601613a1a565b9150509250929050565b600060208284031215613e37578081fd5b6108c78383613a83565b60008060408385031215613e53578182fd5b613e5d8484613a83565b9150602083015190509250929050565b60008060008060808587031215613e82578182fd5b843567ffffffffffffffff80821115613e99578384fd5b818701915061012080838a031215613eaf578485fd5b613eb88161438d565b9050613ec48984613a92565b8152613ed38960208501613943565b6020820152613ee58960408501613943565b6040820152606083013560608201526080830135608082015260a083013560a0820152613f158960c08501613943565b60c0820152613f278960e08501613943565b60e08201526101008084013583811115613f3f578687fd5b613f4b8b828701613a1a565b828401525050809650506020870135915080821115613f68578384fd5b50613f758782880161394e565b949794965050505060408301359260600135919050565b600060208284031215613f9d578081fd5b5035919050565b600060208284031215613fb5578081fd5b5051919050565b60008060408385031215613fce578182fd5b50508035926020909101359150565b60008060008060808587031215613ff2578182fd5b8451935060208501519250604085015191506060850151614012816143e0565b939692955090935050565b6000815180845260208085019450808401835b8381101561404c57815187529582019590820190600101614030565b509495945050505050565b15159052565b60008151808452815b8181101561408257602081850181015186830182015201614066565b818111156140935782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6000602082526108c7602083018461401d565b600060408252614158604083018561401d565b8281036020840152613309818561401d565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156142265761421084516143d4565b82529284019260019290920191908401906141fe565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a0870152614264818561401d565b935050506040850151818584030160c0860152614281838261405d565b92505050606084015161377e60e0850182614057565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b600083825260406020830152612814604083018461405d565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526108c7602083018461405d565b600083825260406020830152612814604083018461401d565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156143ac57600080fd5b604052919050565b600067ffffffffffffffff8211156143ca578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146107f957600080fd5b80151581146107f957600080fdfea26469706673582212202bca1f73a2ba18764d3ded74ffd81b0845838c27067b38935044e50771933f0e64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100715760003560e01c80632da47c40116100505780632da47c40146100ca5780636634b753146100e05780638d928af81461010057610071565b8062c194db14610076578063174481fa146100945780632ccb254a146100aa575b600080fd5b61007e610108565b60405161008b91906107f0565b60405180910390f35b61009c610127565b60405161008b9291906107be565b6100bd6100b83660046106a7565b61016d565b60405161008b9190610803565b6100d2610232565b60405161008b9291906108aa565b6100f36100ee36600461068b565b61029c565b60405161008b91906107e5565b6100bd6102c7565b60606101226040518060200160405280600081525061034a565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080600061017a610232565b9150915060006101c161018b6102c7565b8c8c8c8c8c8c8a8a8e6040516020016101ad9a99989796959493929190610824565b604051602081830303815290604052610423565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561020b57600080fd5b505af115801561021f573d6000803e3d6000fd5b50929d9c50505050505050505050505050565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561028e57807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610297565b60009250600091505b509091565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061034473ffffffffffffffffffffffffffffffffffffffff831615156101ac6104ae565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016104158183866104c0565b505050505050505050919050565b60008061042f8361053a565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b816104bc576104bc81610582565b5050565b5b602081106104fe5781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016104c1565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600060606105478361034a565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811661057b573d6000803e3d6000fd5b9392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600082601f8301126105ff578081fd5b813567ffffffffffffffff80821115610616578283fd5b60405160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501168201018181108382111715610654578485fd5b60405282815292508284830160200186101561066f57600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121561069c578081fd5b813561057b816108b8565b600080600080600080600060e0888a0312156106c1578283fd5b873567ffffffffffffffff808211156106d8578485fd5b6106e48b838c016105ef565b985060208a01359150808211156106f9578485fd5b506107068a828b016105ef565b9650506040880135610717816108b8565b94506060880135610727816108b8565b93506080880135925060a0880135915060c0880135610745816108b8565b8091505092959891949750929550565b60008151808452815b8181101561077a5760208185018101518683018201520161075e565b8181111561078b5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b60006020825261057b6020830184610755565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600061014073ffffffffffffffffffffffffffffffffffffffff808e1684528160208501526108558285018e610755565b91508382036040850152610869828d610755565b9a811660608501529889166080840152505060a081019590955260c085019390935260e0840191909152610100830152909116610120909101529392505050565b918252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff811681146108da57600080fd5b5056fea26469706673582212204858ec0f455045cec21a3fe3ffdea5590ca82f4b3c22a4f30ae2383cb101a6eb64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/index.ts b/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/index.ts new file mode 100644 index 0000000..7681fe8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/index.ts @@ -0,0 +1,8 @@ +import { Task, TaskRunOptions } from '@src'; +import { AaveLinearPoolDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as AaveLinearPoolDeployment; + const args = [input.Vault]; + await task.deployAndVerify('AaveLinearPoolFactory', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/input.ts b/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/input.ts new file mode 100644 index 0000000..1da0a4d --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type AaveLinearPoolDeployment = { + Vault: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/output/arbitrum.json new file mode 100644 index 0000000..05d5a8c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "AaveLinearPoolFactory": "0xdcdbf71A870cc60C6F9B621E28a7D3Ffd6Dd4965" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/output/goerli.json new file mode 100644 index 0000000..8f3707d --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/output/goerli.json @@ -0,0 +1,3 @@ +{ + "AaveLinearPoolFactory": "0x94470C12fc192e071F12Fec1152861608CE01562" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/output/kovan.json b/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/output/kovan.json new file mode 100644 index 0000000..4822503 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/output/kovan.json @@ -0,0 +1,3 @@ +{ + "AaveLinearPoolFactory": "0x94522C4586cb15E08AFF943545Fb2c8Ca7f508cE" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/output/mainnet.json new file mode 100644 index 0000000..d7d13a7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "AaveLinearPoolFactory": "0xD7FAD3bd59D6477cbe1BE7f646F7f1BA25b230f8" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/output/polygon.json new file mode 100644 index 0000000..a3196e5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/output/polygon.json @@ -0,0 +1,3 @@ +{ + "AaveLinearPoolFactory": "0xf302f9F50958c5593770FDf4d4812309fF77414f" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/readme.md b/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/readme.md new file mode 100644 index 0000000..172fca6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211208-aave-linear-pool/readme.md @@ -0,0 +1,15 @@ +# 2021-12-08 - Aave Linear Pool + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This factory and associated Pools were superseded by this [updated version (also now deprecated)](../20220817-aave-rebalanced-linear-pool), which featured a permissionless Rebalancer with Asset Manager privileges. + +Deployment of the `AaveLinearPoolFactory`, for Linear Pools with a wrapped aToken. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet address](./output/arbitrum.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`AaveLinearPoolFactory` artifact](./artifact/AaveLinearPoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/artifact/StablePhantomPool.json b/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/artifact/StablePhantomPool.json new file mode 100644 index 0000000..f9519d2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/artifact/StablePhantomPool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"components": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20[]", "name": "tokens", "type": "address[]"}, {"internalType": "contract IRateProvider[]", "name": "rateProviders", "type": "address[]"}, {"internalType": "uint256[]", "name": "tokenRateCacheDurations", "type": "uint256[]"}, {"internalType": "uint256", "name": "amplificationParameter", "type": "uint256"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "address", "name": "owner", "type": "address"}], "internalType": "struct StablePhantomPool.NewPoolParams", "name": "params", "type": "tuple"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "startValue", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "endValue", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "startTime", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "endTime", "type": "uint256"}], "name": "AmpUpdateStarted", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "currentValue", "type": "uint256"}], "name": "AmpUpdateStopped", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}], "name": "CachedProtocolSwapFeePercentageUpdated", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "bptAmount", "type": "uint256"}], "name": "DueProtocolFeeIncreased", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "rate", "type": "uint256"}], "name": "TokenRateCacheUpdated", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address"}, {"indexed": true, "internalType": "contract IRateProvider", "name": "provider", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "cacheDuration", "type": "uint256"}], "name": "TokenRateProviderSet", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAmplificationParameter", "outputs": [{"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "bool", "name": "isUpdating", "type": "bool"}, {"internalType": "uint256", "name": "precision", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getBptIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getCachedProtocolSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getDueProtocolFeeBptAmount", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getLastInvariant", "outputs": [{"internalType": "uint256", "name": "lastInvariant", "type": "uint256"}, {"internalType": "uint256", "name": "lastInvariantAmp", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMinimumBpt", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "pure", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRateProviders", "outputs": [{"internalType": "contract IRateProvider[]", "name": "providers", "type": "address[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "getScalingFactor", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getScalingFactors", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "getTokenRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "getTokenRateCache", "outputs": [{"internalType": "uint256", "name": "rate", "type": "uint256"}, {"internalType": "uint256", "name": "duration", "type": "uint256"}, {"internalType": "uint256", "name": "expires", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVirtualSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "swapRequest", "type": "tuple"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "indexIn", "type": "uint256"}, {"internalType": "uint256", "name": "indexOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "", "type": "tuple"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "uint256", "name": "", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "pure", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "bytes", "name": "poolConfig", "type": "bytes"}], "name": "setAssetManagerPoolConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bool", "name": "paused", "type": "bool"}], "name": "setPaused", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "uint256", "name": "duration", "type": "uint256"}], "name": "setTokenRateCacheDuration", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "rawEndValue", "type": "uint256"}, {"internalType": "uint256", "name": "endTime", "type": "uint256"}], "name": "startAmplificationParameterUpdate", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "stopAmplificationParameterUpdate", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "updateCachedProtocolSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "updateTokenRateCache", "outputs": [], "stateMutability": "nonpayable", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/artifact/StablePhantomPoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/artifact/StablePhantomPoolFactory.json new file mode 100644 index 0000000..dabf6c9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/artifact/StablePhantomPoolFactory.json @@ -0,0 +1,170 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "StablePhantomPoolFactory", + "sourceName": "contracts/StablePhantomPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "amplificationParameter", + "type": "uint256" + }, + { + "internalType": "contract IRateProvider[]", + "name": "rateProviders", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenRateCacheDurations", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract StablePhantomPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101406040523480156200001257600080fd5b5060405162007d4938038062007d498339810160408190526200003591620001c3565b80604051806020016200004890620001b5565b601f1982820381018352601f909101166040528051819060006002820460a081905280830360e0819052818552909150836200009081620000f9602090811b620002ec17901c565b60601b6001600160601b0319166080528285018051838252620000bf82620000f9602090811b620002ec17901c565b6001600160601b0319606091821b811660c0529690935290529590951b90911661010052505050426276a700016101205250620001f39050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001476001600160a01b03831615156101ac6200014d565b50919050565b816200015e576200015e8162000162565b5050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b616ef48062000e5583390190565b600060208284031215620001d5578081fd5b81516001600160a01b0381168114620001ec578182fd5b9392505050565b60805160601c60a05160c05160601c60e0516101005160601c61012051610c006200025560003980610173528061019c5250806102ca52508061035352508061014a52806103cf52508061037452508061012952806103ab5250610c006000f3fe608060405234801561001057600080fd5b50600436106100715760003560e01c80634555fb8d116100505780634555fb8d146100c05780636634b753146100e05780638d928af81461010057610071565b8062c194db14610076578063174481fa146100945780632da47c40146100aa575b600080fd5b61007e610108565b60405161008b9190610a05565b60405180910390f35b61009c610127565b60405161008b9291906109d3565b6100b261016d565b60405161008b929190610b50565b6100d36100ce3660046107e0565b6101d7565b60405161008b9190610a18565b6100f36100ee3660046107c4565b61029d565b60405161008b91906109fa565b6100d36102c8565b60606101226040518060200160405280600081525061034b565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156101c957807f000000000000000000000000000000000000000000000000000000000000000003925062278d0091506101d2565b60009250600091505b509091565b60008060006101e461016d565b9150915061028e6040518061016001604052806101ff6102c8565b73ffffffffffffffffffffffffffffffffffffffff1681526020018d81526020018c81526020018b81526020018981526020018881526020018a81526020018781526020018481526020018381526020018673ffffffffffffffffffffffffffffffffffffffff1681525060405160200161027a9190610a39565b604051602081830303815290604052610424565b9b9a5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061034573ffffffffffffffffffffffffffffffffffffffff831615156101ac6104af565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016104168183866104c1565b505050505050505050919050565b6000806104308361053b565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b816104bd576104bd81610583565b5050565b5b602081106104ff5781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016104c2565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600060606105488361034b565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811661057c573d6000803e3d6000fd5b9392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b80356105fb81610ba5565b92915050565b600082601f830112610611578081fd5b813561062461061f82610b85565b610b5e565b81815291506020808301908481018184028601820187101561064557600080fd5b60005b8481101561066d57813561065b81610ba5565b84529282019290820190600101610648565b505050505092915050565b600082601f830112610688578081fd5b813561069661061f82610b85565b8181529150602080830190848101818402860182018710156106b757600080fd5b60005b8481101561066d5781356106cd81610ba5565b845292820192908201906001016106ba565b600082601f8301126106ef578081fd5b81356106fd61061f82610b85565b81815291506020808301908481018184028601820187101561071e57600080fd5b60005b8481101561066d57813584529282019290820190600101610721565b600082601f83011261074d578081fd5b813567ffffffffffffffff811115610763578182fd5b61079460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610b5e565b91508082528360208285010111156107ab57600080fd5b8060208401602084013760009082016020015292915050565b6000602082840312156107d5578081fd5b813561057c81610ba5565b600080600080600080600080610100898b0312156107fc578384fd5b883567ffffffffffffffff80821115610813578586fd5b61081f8c838d0161073d565b995060208b0135915080821115610834578586fd5b6108408c838d0161073d565b985060408b0135915080821115610855578586fd5b6108618c838d01610601565b975060608b0135965060808b013591508082111561087d578586fd5b6108898c838d01610678565b955060a08b013591508082111561089e578485fd5b506108ab8b828c016106df565b93505060c089013591506108c28a60e08b016105f0565b90509295985092959890939650565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208085019450808401835b8381101561093057815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016108fe565b509495945050505050565b6000815180845260208085019450808401835b838110156109305781518752958201959082019060010161094e565b60008151808452815b8181101561098f57602081850181015186830182015201610973565b818111156109a05782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b60006020825261057c602083018461096a565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600060208252610a4d6020830184516108d1565b6020830151610160806040850152610a6961018085018361096a565b915060408501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080868503016060870152610aa5848361096a565b93506060870151915080868503016080870152610ac284836108eb565b935060808701519150808685030160a0870152610adf84836108eb565b935060a08701519150808685030160c087015250610afd838261093b565b60c087015160e0878101919091528701516101008088019190915287015161012080880191909152870151610140808801919091528701519093509050610b46828601826108d1565b5090949350505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610b7d57600080fd5b604052919050565b600067ffffffffffffffff821115610b9b578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff81168114610bc757600080fd5b5056fea26469706673582212203412ec5f53a2471ff1e7c917c5ca78f89bbf7fd00003c0b478f37b2dcd49d0a064736f6c634300070100336103e06040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b5060405162006ef438038062006ef48339810160408190526200005a9162001485565b8051602082015160408301516060840151620000779030620009cc565b8460c001518560e00151866101000151876101200151886101400151888651600214620000a6576000620000a9565b60025b8989898a516001600160401b0381118015620000c457600080fd5b50604051908082528060200260200182016040528015620000ef578160200160208202803683370190505b5089898989828289898d8280604051806040016040528060018152602001603160f81b81525085858a336001600160a01b031660001b806080818152505050806001600160a01b031660a0816001600160a01b031660601b8152505050816003908051906020019062000164929190620011bf565b5080516200017a906004906020840190620011bf565b505060058054601260ff1990911617905550815160209283012060c052805191012060e052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6101005260601b6001600160601b0319166101405250620001ed90506276a70083111561019462000b66565b6200020162278d0082111561019562000b66565b429091016101608190520161018052855162000223906002111560c862000b66565b6200023d6200023162000b7b565b8751111560c962000b66565b620002538662000b8060201b6200156c1760201c565b6200025e8462000b8c565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f906200028f908d90600401620016a9565b602060405180830381600087803b158015620002aa57600080fd5b505af1158015620002bf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e591906200144d565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d2906200031a9084908b908b906004016200160d565b600060405180830381600087803b1580156200033557600080fd5b505af11580156200034a573d6000803e3d6000fd5b5050506101a09190915250620003759950505060018d1015965061012c95505062000b669350505050565b6200038861138886111561012d62000b66565b85516101c0819052865187906000906200039e57fe5b60200260200101516001600160a01b03166101e0816001600160a01b031660601b8152505086600181518110620003d157fe5b60200260200101516001600160a01b0316610200816001600160a01b031660601b8152505060028111620004075760006200041e565b866002815181106200041557fe5b60200260200101515b60601b6001600160601b03191661022052600381116200044057600062000457565b866003815181106200044e57fe5b60200260200101515b60601b6001600160601b03191661024052600481116200047957600062000490565b866004815181106200048757fe5b60200260200101515b6001600160a01b0316610260816001600160a01b031660601b81525050620004d387600081518110620004bf57fe5b602002602001015162000c1860201b60201c565b610280528651620004ec9088906001908110620004bf57fe5b6102a052600281116200050157600062000513565b6200051387600281518110620004bf57fe5b6102c05260038111620005285760006200053a565b6200053a87600381518110620004bf57fe5b6102e052600481116200054f57600062000561565b6200056187600481518110620004bf57fe5b6103008181525050600062000584876103e862000cec60201b620015761760201c565b9050620005918162000d1b565b5050505050505050505050620005b86002826060015151101560c862000b6660201b60201c565b620005df8160600151518260800151518360a001515162000d5a60201b6200159a1760201c565b60005b8160600151518110156200071d5760006001600160a01b0316826080015182815181106200060c57fe5b60200260200101516001600160a01b03161462000714576200067e826060015182815181106200063857fe5b6020026020010151836080015183815181106200065157fe5b60200260200101518460a0015184815181106200066a57fe5b602002602001015162000d7a60201b60201c565b816080015181815181106200068f57fe5b60200260200101516001600160a01b031682606001518281518110620006b157fe5b60200260200101516001600160a01b03167ff00a2bf8c71db611a21183e0a96869752bcd9da29372fa76f865eed4fdd540d18460a001518481518110620006f457fe5b60200260200101516040516200070b9190620016be565b60405180910390a35b600101620005e2565b506060810151515b600081118015620007625750306001600160a01b0316826060015160018303815181106200074f57fe5b60200260200101516001600160a01b0316115b1562000772576000190162000725565b610320819052606082810151516001016001600160401b03811180156200079857600080fd5b50604051908082528060200260200182016040528015620007c3578160200160208202803683370190505b50905060005b8151811015620008935782811015620008285783608001518181518110620007ed57fe5b60200260200101518282815181106200080257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506200088a565b82811415620008405760008282815181106200080257fe5b836080015160018203815181106200085457fe5b60200260200101518282815181106200086957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b600101620007c9565b506000815111620008a6576000620008bd565b80600081518110620008b457fe5b60200260200101515b60601b6001600160601b031916610340528051600110620008e0576000620008f7565b80600181518110620008ee57fe5b60200260200101515b60601b6001600160601b0319166103605280516002106200091a57600062000931565b806002815181106200092857fe5b60200260200101515b60601b6001600160601b031916610380528051600310620009545760006200096b565b806003815181106200096257fe5b60200260200101515b60601b6001600160601b0319166103a05280516004106200098e576000620009a5565b806004815181106200099c57fe5b60200260200101515b60601b6001600160601b0319166103c0528251620009c39062000e6c565b50505062001730565b606082516001016001600160401b0381118015620009e957600080fd5b5060405190808252806020026020018201604052801562000a14578160200160208202803683370190505b50905082516000141562000a5757818160008151811062000a3157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505062000b60565b82515b60008111801562000a935750826001600160a01b031684600183038151811062000a8057fe5b60200260200101516001600160a01b0316115b1562000ae05783600182038151811062000aa957fe5b602002602001015182828151811062000abe57fe5b6001600160a01b03909216602092830291909101909101526000190162000a5a565b60005b8181101562000b2f5784818151811062000af957fe5b602002602001015183828151811062000b0e57fe5b6001600160a01b039092166020928302919091019091015260010162000ae3565b508282828151811062000b3e57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050505b92915050565b8162000b775762000b778162000f9d565b5050565b600590565b8062000b778162000ff0565b62000ba164e8d4a5100082101560cb62000b66565b62000bb967016345785d8a000082111560ca62000b66565b62000bd88160c06008546200107a60201b620015b2179092919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc9062000c0d908390620016be565b60405180910390a150565b60006001600160a01b03821630141562000c3c5750670de0b6b3a764000062000ce7565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801562000c7857600080fd5b505afa15801562000c8d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000cb39190620015ea565b60ff169050600062000cd26012836200108f60201b620015c81760201c565b905080600a0a670de0b6b3a764000002925050505b919050565b600082820262000d1484158062000d0c57508385838162000d0957fe5b04145b600362000b66565b9392505050565b62000d2981804280620010a7565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a02338160405162000c0d9190620016be565b62000d75828414801562000d6d57508183145b606762000b66565b505050565b6000826001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b15801562000db657600080fd5b505afa15801562000dcb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000df191906200144d565b9050600062000e0c82846200113760201b620015de1760201c565b6001600160a01b0386166000818152600e60205260409081902083905551919250907fcfed57d90913b5ee1895919dcccaff83a9f7a842d912ef137272e5fc6123aa869062000e5d908590620016be565b60405180910390a25050505050565b6000816001600160a01b031663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b15801562000ea857600080fd5b505afa15801562000ebd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ee3919062001466565b6001600160a01b03166355c676286040518163ffffffff1660e01b815260040160206040518083038186803b15801562000f1c57600080fd5b505afa15801562000f31573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f5791906200144d565b905080600d819055507f6e4e298b4a98488a054248cfb63661894b93fb9fd398cc9eca58e39215954eb78160405162000f919190620016be565b60405180910390a15050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600281511015620010015762001077565b6000816000815181106200101157fe5b602002602001015190506000600190505b825181101562000d755760008382815181106200103b57fe5b602002602001015190506200106c816001600160a01b0316846001600160a01b031610606562000b6660201b60201c565b915060010162001022565b50565b6001600160401b03811b1992909216911b1790565b6000620010a183831115600162000b66565b50900390565b620010c8816001600160401b031660c0620011bb60201b620016511760201c565b620010e9836001600160401b03166080620011bb60201b620016511760201c565b6200110a856001600160401b03166040620011bb60201b620016511760201c565b6200112b876001600160401b03166000620011bb60201b620016511760201c565b17171760095550505050565b60006200114d600160801b841061014962000b66565b620011708242016001600160401b031660c0620011bb60201b620016511760201c565b62001191836001600160401b03166080620011bb60201b620016511760201c565b620011b2856001600160801b03166000620011bb60201b620016511760201c565b17179392505050565b1b90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200120257805160ff191683800117855562001232565b8280016001018555821562001232579182015b828111156200123257825182559160200191906001019062001215565b506200124092915062001244565b5090565b5b8082111562001240576000815560010162001245565b805162000b60816200171a565b600082601f83011262001279578081fd5b8151620012906200128a82620016ee565b620016c7565b818152915060208083019084810181840286018201871015620012b257600080fd5b60005b84811015620012de578151620012cb816200171a565b84529282019290820190600101620012b5565b505050505092915050565b600082601f830112620012fa578081fd5b81516200130b6200128a82620016ee565b8181529150602080830190848101818402860182018710156200132d57600080fd5b60005b84811015620012de57815162001346816200171a565b8452928201929082019060010162001330565b600082601f8301126200136a578081fd5b81516200137b6200128a82620016ee565b8181529150602080830190848101818402860182018710156200139d57600080fd5b60005b84811015620012de57815184529282019290820190600101620013a0565b600082601f830112620013cf578081fd5b81516001600160401b03811115620013e5578182fd5b6020620013fb601f8301601f19168201620016c7565b925081835284818386010111156200141257600080fd5b60005b828110156200143257848101820151848201830152810162001415565b82811115620014445760008284860101525b50505092915050565b6000602082840312156200145f578081fd5b5051919050565b60006020828403121562001478578081fd5b815162000d14816200171a565b60006020828403121562001497578081fd5b81516001600160401b0380821115620014ae578283fd5b8184019150610160808387031215620014c5578384fd5b620014d081620016c7565b9050620014de86846200125b565b8152602083015182811115620014f2578485fd5b6200150087828601620013be565b60208301525060408301518281111562001518578485fd5b6200152687828601620013be565b6040830152506060830151828111156200153e578485fd5b6200154c8782860162001268565b60608301525060808301518281111562001564578485fd5b6200157287828601620012e9565b60808301525060a0830151828111156200158a578485fd5b620015988782860162001359565b60a08301525060c0838101519082015260e08084015190820152610100808401519082015261012080840151908201526101409150620015db868385016200125b565b91810191909152949350505050565b600060208284031215620015fc578081fd5b815160ff8116811462000d14578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562001659576200164685516200170e565b8352938301939183019160010162001631565b505084810360408601528551808252908201925081860190845b818110156200169b576200168883516200170e565b8552938301939183019160010162001673565b509298975050505050505050565b6020810160038310620016b857fe5b91905290565b90815260200190565b6040518181016001600160401b0381118282101715620016e657600080fd5b604052919050565b60006001600160401b0382111562001704578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146200107757600080fd5b60805160a05160601c60c05160e05161010051610120516101405160601c61016051610180516101a0516101c0516101e05160601c6102005160601c6102205160601c6102405160601c6102605160601c610280516102a0516102c0516102e05161030051610320516103405160601c6103605160601c6103805160601c6103a05160601c6103c05160601c6155f362001901600039806109de5280611dc05250806109875280611d5f5250806109305280611cfe5250806108d95280611c9d5250806108775280611c3c525080610f63528061147d528061255e52806125f952806128f8528061323952806136da52806139d85280613f0c5280613f3452508061389f52508061387b52508061385752508061383352508061380f52508061184b5280611d85528061338f52806139ab5250806117ef5280611d24528061334d52806139795250806117935280611cc3528061330b52806139475250806117375280611c6252806139155280613fd05250806116c55280611c0152806138d85280613f9e525080611665525080610c0e525080611afb525080611ad752508061102952508061114d525080611fd5525080612017525080611ff6525080610fff525080610f8952506155f36000f3fe608060405234801561001057600080fd5b50600436106103205760003560e01c806370a08231116101a75780639b02cdde116100ee578063d5c096c411610097578063de82cd3411610071578063de82cd3414610652578063eb0f24d61461065a578063f4b7964d1461066257610320565b8063d5c096c414610624578063d60575ca14610637578063dd62ed3e1461063f57610320565b8063a9059cbb116100c8578063a9059cbb146105f6578063aaabadc514610609578063d505accf1461061157610320565b80639b02cdde146105ba5780639d2c110c146105d0578063a457c2d7146105e357610320565b8063851c1bb3116101505780638d2334e01161012a5780638d2334e0146105a25780638d928af8146105aa57806395d89b41146105b257610320565b8063851c1bb31461056757806387ec68171461057a578063893d20e81461058d57610320565b80637ecebe00116101815780637ecebe001461052a5780637f1260d11461053d57806382687a561461055f57610320565b806370a08231146104ee57806374f3b009146105015780637520e0491461052257610320565b8063313ce5671161026b57806354dea00a116102145780636782f364116101ee5780636782f364146104bc578063679aefce146104cf5780636daccffa146104d757610320565b806354dea00a1461048057806355c67628146104935780636028bfd41461049b57610320565b806338fff2d01161024557806338fff2d014610452578063395093511461045a57806350dd6ed91461046d57610320565b8063313ce567146104225780633644e5151461043757806338e9922e1461043f57610320565b80631c0de051116102cd57806323b872dd116102a757806323b872dd146103e95780632df2c7c0146103fc5780632f1a0bc91461040f57610320565b80631c0de051146103a85780631dd746ea146103bf578063238a2d59146103d457610320565b8063095ea7b3116102fe578063095ea7b31461036b57806316c38b3c1461038b57806318160ddd146103a057610320565b806301ec954a1461032557806304842d4c1461034e57806306fdde0314610356575b600080fd5b6103386103333660046150dc565b610675565b60405161034591906153e1565b60405180910390f35b610338610713565b61035e610723565b60405161034591906154b7565b61037e610379366004614db8565b6107b9565b60405161034591906153be565b61039e610399366004614eaf565b6107d0565b005b6103386107e4565b6103b06107ea565b604051610345939291906153c9565b6103c7610813565b6040516103459190615386565b6103dc61081d565b6040516103459190615339565b61037e6103f7366004614d03565b610a2f565b61039e61040a366004614caf565b610aa5565b61039e61041d3660046151c9565b610afd565b61042a610be0565b6040516103459190615538565b610338610be9565b61039e61044d366004615199565b610bf3565b610338610c0c565b61037e610468366004614db8565b610c30565b61039e61047b366004614fe6565b610c6b565b61033861048e366004614caf565b610c89565b610338610ceb565b6104ae6104a9366004614ee7565b610cfc565b6040516103459291906154ca565b6103386104ca366004614caf565b610d33565b610338610d3e565b6104df610e17565b604051610345939291906154e3565b6103386104fc366004614caf565b610e32565b61051461050f366004614ee7565b610e4d565b604051610345929190615399565b610338610ecb565b610338610538366004614caf565b610ed1565b61055061054b366004614caf565b610eec565b60405161034593929190615507565b610338610f61565b610338610575366004614f8a565b610f85565b6104ae610588366004614ee7565b610fd7565b610595610ffd565b6040516103459190615325565b610338611021565b610595611027565b61035e61104b565b6105c26110ac565b6040516103459291906154f9565b6103386105de36600461514d565b6110b6565b61037e6105f1366004614db8565b6110c3565b61037e610604366004614db8565b611101565b61059561110e565b61039e61061f366004614d43565b611118565b610514610632366004614ee7565b611261565b61039e611392565b61033861064d366004614ccb565b6113a4565b6103386113e1565b61039e6114b9565b61039e610670366004614db8565b6114e5565b600084608001516106a2610687611027565b6001600160a01b0316336001600160a01b03161460cd611655565b6106b76106ad610c0c565b82146101f4611655565b6106c984846106c4611663565b611687565b60606106d361169f565b90506000875160018111156106e457fe5b146106fb576106f68787878785611899565b610708565b6107088787878785611910565b979650505050505050565b600061071d611974565b90505b90565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107af5780601f10610784576101008083540402835291602001916107af565b820191906000526020600020905b81548152906001019060200180831161079257829003601f168201915b5050505050905090565b60006107c633848461197b565b5060015b92915050565b6107d86119d6565b6107e181611a1c565b50565b60025490565b60008060006107f7611ab8565b159250610802611ad5565b915061080c611af9565b9050909192565b606061071d61169f565b60606000610829611663565b90508067ffffffffffffffff8111801561084257600080fd5b5060405190808252806020026020018201604052801561086c578160200160208202803683370190505b50915080156108c8577f0000000000000000000000000000000000000000000000000000000000000000826000815181106108a357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506108ce565b50610720565b60018111156108c8577f00000000000000000000000000000000000000000000000000000000000000008260018151811061090557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060028111156108c8577f00000000000000000000000000000000000000000000000000000000000000008260028151811061095c57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060038111156108c8577f0000000000000000000000000000000000000000000000000000000000000000826003815181106109b357fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060048111156108c8577f000000000000000000000000000000000000000000000000000000000000000082600481518110610a0a57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b5090565b600080610a3c85336113a4565b9050610a60336001600160a01b0387161480610a585750838210155b61019e611655565b610a6b858585611b1d565b336001600160a01b03861614801590610a8657506000198114155b15610a9857610a98853385840361197b565b60019150505b9392505050565b6000610ab082611bfd565b9050610ac96001600160a01b0382161515610155611655565b6001600160a01b0382166000908152600e6020526040812054610aeb90611def565b9050610af8838383611dfc565b505050565b610b056119d6565b610b15600183101561012c611655565b610b2661138883111561012d611655565b6000610b3282426115c8565b9050610b466201518082101561013d611655565b600080610b51611edb565b91509150610b62811561013e611655565b6000610b70866103e8611576565b90506000838211610b9f57610b9a610b8b6201518086611576565b610b958488611576565b611f4f565b610bb9565b610bb9610baf6201518084611576565b610b958688611576565b9050610bcb600282111561013f611655565b610bd784834289611f82565b50505050505050565b60055460ff1690565b600061071d611fd1565b610bfb6119d6565b610c0361206e565b6107e181612081565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916107c6918590610c6690866120ec565b61197b565b610c736119d6565b610c7b61206e565b610c8582826120fe565b5050565b60006001600160a01b038216301415610cab5750670de0b6b3a7640000610ce6565b6001600160a01b0382166000908152600e60205260409020548015610cd857610cd381612216565b610ce2565b670de0b6b3a76400005b9150505b919050565b60085460009061071d9060c0612222565b60006060610d128651610d0d611663565b612230565b610d278989898989898961223d6122e1612342565b97509795505050505050565b60006107ca826124d2565b60006060610d4a611027565b6001600160a01b031663f94d4668610d60610c0c565b6040518263ffffffff1660e01b8152600401610d7c91906153e1565b60006040518083038186803b158015610d9457600080fd5b505afa158015610da8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610dd09190810190614de3565b50915050610de581610de061169f565b6124f3565b60006060610df283612554565b915091506000610e00611edb565b509050610e0e828285612660565b94505050505090565b6000806000610e24611edb565b90949093506103e892509050565b6001600160a01b031660009081526020819052604090205490565b60608088610e5c610687611027565b610e676106ad610c0c565b6060610e7161169f565b9050610e7d88826124f3565b6000606080610e928e8e8e8e8e8e8a8f61223d565b925092509250610ea28d8461267b565b610eac82856122e1565b610eb681856122e1565b909550935050505b5097509795505050505050565b600c5490565b6001600160a01b031660009081526006602052604090205490565b60008080610f1081610efd86611bfd565b6001600160a01b03161415610155611655565b6001600160a01b0384166000908152600e6020526040902054610f3290612216565b6001600160a01b0385166000908152600e6020526040902054909350610f5790612685565b9395909450915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610fba9291906152af565b604051602081830303815290604052805190602001209050919050565b60006060610fe88651610d0d611663565b610d27898989898989896126a56126e8612342565b7f000000000000000000000000000000000000000000000000000000000000000090565b600d5490565b7f000000000000000000000000000000000000000000000000000000000000000090565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107af5780601f10610784576101008083540402835291602001916107af565b600a54600b549091565b6000610a9e610154612749565b6000806110d033856113a4565b90508083106110ea576110e53385600061197b565b6110f7565b6110f7338585840361197b565b5060019392505050565b60006107c6338484611b1d565b600061071d6127b6565b6111268442111560d1611655565b6001600160a01b038716600090815260066020908152604080832054905190929161117d917f0000000000000000000000000000000000000000000000000000000000000000918c918c918c9188918d9101615409565b60405160208183030381529060405280519060200120905060006111a082612830565b90506000600182888888604051600081526020016040526040516111c79493929190615499565b6020604051602081039080840390855afa1580156111e9573d6000803e3d6000fd5b5050604051601f190151915061122b90506001600160a01b0382161580159061122357508b6001600160a01b0316826001600160a01b0316145b6101f8611655565b6001600160a01b038b1660009081526006602052604090206001850190556112548b8b8b61197b565b5050505050505050505050565b60608088611270610687611027565b61127b6106ad610c0c565b606061128561169f565b905061128f6107e4565b61134257600060606112a48d8d8d868b61284c565b915091506112bd6112b3611974565b83101560cc611655565b6112cf60006112ca611974565b61293f565b6112e28b6112db611974565b840361293f565b6112ec81846126e8565b806112f5611663565b67ffffffffffffffff8111801561130b57600080fd5b50604051908082528060200260200182016040528015611335578160200160208202803683370190505b5095509550505050610ebe565b61134c88826124f3565b60006060806113618e8e8e8e8e8e8a8f6126a5565b9250925092506113718c8461293f565b61137b82856126e8565b61138581856122e1565b9095509350610ebe915050565b6113a261139d611027565b612949565b565b60006113ae611027565b6001600160a01b0316826001600160a01b031614156113d057506000196107ca565b6113da8383612a70565b90506107ca565b600060606113ed611027565b6001600160a01b031663f94d4668611403610c0c565b6040518263ffffffff1660e01b815260040161141f91906153e1565b60006040518083038186803b15801561143757600080fd5b505afa15801561144b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114739190810190614de3565b509150506114b3817f0000000000000000000000000000000000000000000000000000000000000000815181106114a657fe5b6020026020010151612a9b565b91505090565b6114c16119d6565b6000806114cc611edb565b915091506114dc81610140611655565b610c8582612abb565b6114ed6119d6565b60006114f883611bfd565b90506115116001600160a01b0382161515610155611655565b61151c838284611dfc565b806001600160a01b0316836001600160a01b03167ff00a2bf8c71db611a21183e0a96869752bcd9da29372fa76f865eed4fdd540d18460405161155f91906153e1565b60405180910390a3505050565b80610c8581612af6565b6000828202610a9e84158061159357508385838161159057fe5b04145b6003611655565b610af882841480156115ab57508183145b6067611655565b67ffffffffffffffff811b1992909216911b1790565b60006115d8838311156001611655565b50900390565b60006115ff7001000000000000000000000000000000008410610149611655565b61161682420167ffffffffffffffff1660c0611651565b61162b8367ffffffffffffffff166080611651565b611648856fffffffffffffffffffffffffffffffff166000611651565b17179392505050565b1b90565b81610c8557610c8581612749565b7f000000000000000000000000000000000000000000000000000000000000000090565b610af8818410801561169857508183105b6064611655565b606060006116ab611663565b90506116b5612b6f565b915080156117265761170c6116e97f0000000000000000000000000000000000000000000000000000000000000000610c89565b836000815181106116f657fe5b6020026020010151612c9790919063ffffffff16565b8260008151811061171957fe5b6020026020010181815250505b60018111156117825761176861175b7f0000000000000000000000000000000000000000000000000000000000000000610c89565b836001815181106116f657fe5b8260018151811061177557fe5b6020026020010181815250505b60028111156117de576117c46117b77f0000000000000000000000000000000000000000000000000000000000000000610c89565b836002815181106116f657fe5b826002815181106117d157fe5b6020026020010181815250505b600381111561183a576118206118137f0000000000000000000000000000000000000000000000000000000000000000610c89565b836003815181106116f657fe5b8260038151811061182d57fe5b6020026020010181815250505b6004811115610a2b5761187c61186f7f0000000000000000000000000000000000000000000000000000000000000000610c89565b836004815181106116f657fe5b8260048151811061188957fe5b6020026020010181815250505090565b60006118a585836124f3565b6118c686606001518385815181106118b957fe5b6020026020010151612cc3565b606087015260006118d987878787612ccf565b90506118f8818487815181106118eb57fe5b6020026020010151612e8a565b905061190381612e96565b9150505b95945050505050565b600061191f8660600151612ebc565b606087015261192e85836124f3565b61194286606001518386815181106118b957fe5b6060870152600061195587878787612edd565b90506119038184868151811061196757fe5b6020026020010151613008565b620f424090565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061155f9085906153e1565b6000611a056000357fffffffff0000000000000000000000000000000000000000000000000000000016610f85565b90506107e1611a148233613014565b610191611655565b8015611a3c57611a37611a2d611ad5565b4210610193611655565b611a51565b611a51611a47611af9565b42106101a9611655565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611aad9083906153be565b60405180910390a150565b6000611ac2611af9565b42118061071d57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b611b346001600160a01b0384161515610198611655565b611b4b6001600160a01b0383161515610199611655565b611b56838383610af8565b6001600160a01b038316600090815260208190526040902054611b7c90826101a06130fd565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611bab90826120ec565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061155f9085906153e1565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611c6057507f0000000000000000000000000000000000000000000000000000000000000000610ce6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611cc157507f0000000000000000000000000000000000000000000000000000000000000000610ce6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611d2257507f0000000000000000000000000000000000000000000000000000000000000000610ce6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611d8357507f0000000000000000000000000000000000000000000000000000000000000000610ce6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611de457507f0000000000000000000000000000000000000000000000000000000000000000610ce6565b610ce6610135612749565b60006107ca826080612222565b6000826001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e3757600080fd5b505afa158015611e4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6f91906151b1565b90506000611e7d82846115de565b6001600160a01b0386166000818152600e60205260409081902083905551919250907fcfed57d90913b5ee1895919dcccaff83a9f7a842d912ef137272e5fc6123aa8690611ecc9085906153e1565b60405180910390a25050505050565b600080600080600080611eec613113565b935093509350935080421015611f3f576001945083831115611f23578181038242038585030281611f1957fe5b0484019550611f3a565b8181038242038486030281611f3457fe5b04840395505b611f47565b600094508295505b505050509091565b6000611f5e8215156004611655565b82611f6b575060006107ca565b816001840381611f7757fe5b0460010190506107ca565b611f8e8484848461316a565b7f1835882ee7a34ac194f717a35e09bb1d24c82a3b9d854ab6c9749525b714cdf284848484604051611fc3949392919061551d565b60405180910390a150505050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061203e6131ca565b3060405160200161205395949392919061543d565b60405160208183030381529060405280519060200120905090565b6113a2612079611ab8565b610192611655565b61209464e8d4a5100082101560cb611655565b6120aa67016345785d8a000082111560ca611655565b6008546120b9908260c06115b2565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611aad9083906153e1565b6000828201610a9e8482101583611655565b6000612108610c0c565b90506000612114611027565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b8152600401612141929190615482565b60806040518083038186803b15801561215957600080fd5b505afa15801561216d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219191906151ea565b6040517f18e736d40000000000000000000000000000000000000000000000000000000081529094506001600160a01b03851693506318e736d492506121de915085908790600401615469565b600060405180830381600087803b1580156121f857600080fd5b505af115801561220c573d6000803e3d6000fd5b5050505050505050565b60006107ca82826131ce565b1c67ffffffffffffffff1690565b610c858183146067611655565b6000606080600061224d856131e4565b9050600081801561225a57fe5b14156122c7576122686131fa565b612272898661320e565b909450925061227f611663565b67ffffffffffffffff8111801561229557600080fd5b506040519080825280602002602001820160405280156122bf578160200160208202803683370190505b5091506122d2565b6122d2610154612749565b50985098509895505050505050565b60005b6122ec611663565b811015610af85761232383828151811061230257fe5b602002602001015183838151811061231657fe5b6020026020010151613283565b83828151811061232f57fe5b60209081029190910101526001016122e4565b333014612431576000306001600160a01b03166000366040516123669291906152df565b6000604051808303816000865af19150503d80600081146123a3576040519150601f19603f3d011682016040523d82523d6000602084013e6123a8565b606091505b5050905080600081146123b757fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114612413573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b606061243b61169f565b905061244787826124f3565b6000606061245f8c8c8c8c8c8c898d8d63ffffffff16565b509150915061247281848663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08301526020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b6000806124de836132d4565b9050610ce26124ec84610c89565b8290612c97565b60005b6124fe611663565b811015610af85761253583828151811061251457fe5b602002602001015183838151811061252857fe5b6020026020010151612c97565b83828151811061254157fe5b60209081029190910101526001016124f6565b60006060600c54837f00000000000000000000000000000000000000000000000000000000000000008151811061258757fe5b60200260200101516dffffffffffffffffffffffffffff03019150600183510367ffffffffffffffff811180156125bd57600080fd5b506040519080825280602002602001820160405280156125e7578160200160208202803683370190505b50905060005b815181101561265a57837f000000000000000000000000000000000000000000000000000000000000000082106126275781600101612629565b815b8151811061263357fe5b602002602001015182828151811061264757fe5b60209081029190910101526001016125ed565b50915091565b60008061266f848660006133cf565b90506119078184613283565b610c858282613565565b60008061269183611def565b915061269e8360c0612222565b9050915091565b600060608060006126b585613621565b905060018160018111156126c557fe5b14156122c7576126d3613637565b93509350935050985098509895505050505050565b60005b6126f3611663565b811015610af85761272a83828151811061270957fe5b602002602001015183838151811061271d57fe5b602002602001015161371b565b83828151811061273657fe5b60209081029190910101526001016126eb565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b60006127c0611027565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156127f857600080fd5b505afa15801561280c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071d9190614fca565b600061283a611fd1565b82604051602001610fba9291906152ef565b6000606061285861206e565b600061286384613621565b905061287e600082600181111561287657fe5b1460ce611655565b606061288985613769565b90506128988151610d0d611663565b6128a281876124f3565b60006128ac611edb565b50905060606128ba83612554565b91505060006128cb838360016133cf565b90508060006128e86dffffffffffffffffffffffffffff836115c8565b90506128f48d8261293f565b80867f00000000000000000000000000000000000000000000000000000000000000008151811061292157fe5b6020908102919091010152509c939b50929950505050505050505050565b610c85828261377f565b6000816001600160a01b031663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561298457600080fd5b505afa158015612998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129bc9190614fca565b6001600160a01b03166355c676286040518163ffffffff1660e01b815260040160206040518083038186803b1580156129f457600080fd5b505afa158015612a08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a2c91906151b1565b905080600d819055507f6e4e298b4a98488a054248cfb63661894b93fb9fd398cc9eca58e39215954eb781604051612a6491906153e1565b60405180910390a15050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60006107ca600c54612ab584612aaf6107e4565b906115c8565b906120ec565b612ac78182424261316a565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a023381604051611aad91906153e1565b600281511015612b05576107e1565b600081600081518110612b1457fe5b602002602001015190506000600190505b8251811015610af8576000838281518110612b3c57fe5b60200260200101519050612b65816001600160a01b0316846001600160a01b0316106065611655565b9150600101612b25565b60606000612b7b611663565b905060608167ffffffffffffffff81118015612b9657600080fd5b50604051908082528060200260200182016040528015612bc0578160200160208202803683370190505b509050612bcb61380d565b81600081518110612bd857fe5b602002602001018181525050612bec613831565b81600181518110612bf957fe5b6020026020010181815250506002821115612c3457612c16613855565b81600281518110612c2357fe5b602002602001018181525050612c3d565b91506107209050565b6003821115612c3457612c4e613879565b81600381518110612c5b57fe5b6020026020010181815250506004821115612c3457612c7861389d565b81600481518110612c8557fe5b60200260200101818152505091505090565b6000828202612cb184158061159357508385838161159057fe5b670de0b6b3a764000090049392505050565b6000610a9e8383612c97565b6000612cd961206e565b612ce16138c1565b600d5460006060612cf187612554565b60208a015191935091506001600160a01b0316301415612d3a57612d238860600151612d1c876139d4565b8484613a0d565b93508215612d3557612d358484613a92565b612e7f565b60408801516001600160a01b0316301415612d7d57612d678860600151612d60886139d4565b8484613af2565b93508215612d3557612d35886060015184613a92565b6000612d87611edb565b5090506000612d98828460016133cf565b9050612dbc8284612da88b6139d4565b612db18b6139d4565b8e6060015186613b19565b95508415612e7c576000612dcf896139d4565b90506000612ddc896139d4565b90506000612de989612e96565b9050612e1181878581518110612dfb57fe5b60200260200101516120ec90919063ffffffff16565b868481518110612e1d57fe5b602002602001018181525050612e538d60600151878481518110612e3d57fe5b60200260200101516115c890919063ffffffff16565b868381518110612e5f57fe5b602002602001018181525050612e788486888a8c613bb8565b5050505b50505b505050949350505050565b6000610a9e838361371b565b60006107ca612eb5612ea6610ceb565b670de0b6b3a7640000906115c8565b839061371b565b600080612ed1612eca610ceb565b8490613c63565b9050610ce283826115c8565b6000612ee761206e565b612eef6138c1565b600d5460006060612eff87612554565b60208a015191935091506001600160a01b0316301415612f3157612d678860600151612f2a876139d4565b8484613ca6565b60408801516001600160a01b0316301415612f5e57612d238860600151612f57886139d4565b8484613cc3565b6000612f68611edb565b5090506000612f79828460016133cf565b9050612f9d8284612f898b6139d4565b612f928b6139d4565b8e6060015186613d49565b95508415612e7c576000612fb0896139d4565b90506000612fbd896139d4565b90506000612fce8d60600151612e96565b9050612fe081878581518110612dfb57fe5b868481518110612fec57fe5b602002602001018181525050612e5389878481518110612e3d57fe5b6000610a9e8383613283565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b613033610ffd565b6001600160a01b03161415801561304e575061304e83613dc6565b156130765761305b610ffd565b6001600160a01b0316336001600160a01b03161490506107ca565b61307e6127b6565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016130ad939291906153ea565b60206040518083038186803b1580156130c557600080fd5b505afa1580156130d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113da9190614ecb565b600061310c8484111583611655565b5050900390565b60008060008061312f600060095461222290919063ffffffff16565b600954909450613140906040612222565b600954909350613151906080612222565b6009549092506131629060c0612222565b905090919293565b61317f8167ffffffffffffffff1660c0611651565b6131948367ffffffffffffffff166080611651565b6131a98567ffffffffffffffff166040611651565b6131be8767ffffffffffffffff166000611651565b17171760095550505050565b4690565b1c6fffffffffffffffffffffffffffffffff1690565b6000818060200190518101906107ca9190615034565b6113a2613205611ab8565b156101af611655565b600060608061321c85612554565b915050600061322a85613e02565b9050606061326783836132628a7f0000000000000000000000000000000000000000000000000000000000000000815181106114a657fe5b613e18565b905081613275826000613eb4565b945094505050509250929050565b60006132928215156004611655565b8261329f575060006107ca565b670de0b6b3a7640000838102906132c2908583816132b957fe5b04146005611655565b8281816132cb57fe5b049150506107ca565b60006132df82613f9c565b156132f3576132ec61380d565b9050610ce6565b6132fc82613fce565b15613309576132ec613831565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561334b576132ec613855565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561338d576132ec613879565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611de4576132ec61389d565b81516000908190815b81811015613410576134068682815181106133ef57fe5b6020026020010151846120ec90919063ffffffff16565b92506001016133d8565b508161342157600092505050610a9e565b600082878302825b60ff81101561354d576000858a60008151811061344257fe5b60200260200101510290506000600190505b868110156134965761348c61348561347f848e858151811061347257fe5b6020026020010151611576565b89611576565b868c614000565b9150600101613454565b508394506135036134d26134bf6134b66134b0878c611576565b85611576565b6103e88d614000565b612ab56134cc8a89611576565b88611576565b6134fd6134f06134e66103e8880386611576565b6103e88e15614000565b612ab58a60010189611576565b8b614000565b93508484111561352b576001858503116135265783975050505050505050610a9e565b613544565b6001848603116135445783975050505050505050610a9e565b50600101613429565b50613559610141612749565b50505050509392505050565b61357c6001600160a01b038316151561019b611655565b61358882600083610af8565b6001600160a01b0382166000908152602081905260409020546135ae90826101a16130fd565b6001600160a01b0383166000908152602081905260409020556002546135d49082614028565b6002556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906136159085906153e1565b60405180910390a35050565b6000818060200190518101906107ca919061507b565b60006060806000613646611663565b9050600093508067ffffffffffffffff8111801561366357600080fd5b5060405190808252806020026020018201604052801561368d578160200160208202803683370190505b5092508067ffffffffffffffff811180156136a757600080fd5b506040519080825280602002602001820160405280156136d1578160200160208202803683370190505b509150600c54827f00000000000000000000000000000000000000000000000000000000000000008151811061370357fe5b6020908102919091010152506000600c559192909190565b600061372a8215156004611655565b82613737575060006107ca565b670de0b6b3a764000083810290613751908583816132b957fe5b82600182038161375d57fe5b046001019150506107ca565b606081806020019051810190610a9e9190615097565b61378b60008383610af8565b60025461379890826120ec565b6002556001600160a01b0382166000908152602081905260409020546137be90826120ec565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906136159085906153e1565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006138cb611663565b90508015613901576138fc7f0000000000000000000000000000000000000000000000000000000000000000614036565b613907565b506113a2565b6001811115613901576139397f0000000000000000000000000000000000000000000000000000000000000000614036565b60028111156139015761396b7f0000000000000000000000000000000000000000000000000000000000000000614036565b60038111156139015761399d7f0000000000000000000000000000000000000000000000000000000000000000614036565b6004811115613901576139cf7f0000000000000000000000000000000000000000000000000000000000000000614036565b6107e1565b60007f00000000000000000000000000000000000000000000000000000000000000008210610a2b57613a088260016115c8565b6107ca565b600080613a18611edb565b50905060606001613a27611663565b0367ffffffffffffffff81118015613a3e57600080fd5b50604051908082528060200260200182016040528015613a68578160200160208202803683370190505b50905086818781518110613a7857fe5b6020026020010181815250506107088285838860006140b4565b6000613aa183612aaf85612e96565b90506000613aaf8284612c97565b600c54909150613abf90826120ec565b600c556040517f1d2422d87bc31f46211cfdfe158c5eccb86547546c7a4fff6be15a0a944c84b290611fc39083906153e1565b600080613afd611edb565b509050613b0f81848789886000614367565b9695505050505050565b6000613b2b83878681518110612e3d57fe5b868581518110613b3757fe5b6020026020010181815250506000613b518888858961447c565b905083878681518110613b6057fe5b602002602001015101878681518110613b7557fe5b602002602001018181525050613bac6001612ab5898981518110613b9557fe5b6020026020010151846115c890919063ffffffff16565b98975050505050505050565b6000613bc6858560006133cf565b90506000613bd48288613283565b9050670de0b6b3a7640000811115610bd7576000613c0e613c0786613c0185670de0b6b3a76400006115c8565b90612c97565b8590612c97565b600c54909150613c1e90826120ec565b600c556040517f1d2422d87bc31f46211cfdfe158c5eccb86547546c7a4fff6be15a0a944c84b290613c519083906153e1565b60405180910390a15050505050505050565b6000828202613c7d84158061159357508385838161159057fe5b80613c8c5760009150506107ca565b670de0b6b3a7640000600019820161375d565b5092915050565b600080613cb1611edb565b509050613b0f8184878988600061461c565b600060606001613cd1611663565b0367ffffffffffffffff81118015613ce857600080fd5b50604051908082528060200260200182016040528015613d12578160200160208202803683370190505b50905085818681518110613d2257fe5b6020026020010181815250506000613d38611edb565b5090506107088185848860006146e3565b6000613d5b83878781518110612dfb57fe5b868681518110613d6757fe5b6020026020010181815250506000613d818888858861447c565b905083878781518110613d9057fe5b602002602001015103878781518110613da557fe5b602002602001018181525050613bac6001612aaf838a8981518110612e3d57fe5b6000613df17ff4b7964d00000000000000000000000000000000000000000000000000000000610f85565b8214806107ca57506107ca82614978565b600081806020019051810190610a9e919061504f565b60606000613e268484613283565b90506060855167ffffffffffffffff81118015613e4257600080fd5b50604051908082528060200260200182016040528015613e6c578160200160208202803683370190505b50905060005b8651811015613eaa57613e8b838883815181106116f657fe5b828281518110613e9757fe5b6020908102919091010152600101613e72565b5095945050505050565b6060825160010167ffffffffffffffff81118015613ed157600080fd5b50604051908082528060200260200182016040528015613efb578160200160208202803683370190505b50905060005b8151811015613c9f577f00000000000000000000000000000000000000000000000000000000000000008114613f7b57837f00000000000000000000000000000000000000000000000000000000000000008210613f625760018203613f64565b815b81518110613f6e57fe5b6020026020010151613f7d565b825b828281518110613f8957fe5b6020908102919091010152600101613f01565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b6000816140165761401184846149e6565b614020565b6140208484611f4f565b949350505050565b6000610a9e838360016130fd565b6001600160a01b03811630141561404c576107e1565b6001600160a01b0381166000908152600e60205260409020548015610c85576001600160a01b0382166000908152600e6020526040812054819061408f90612685565b91509150804211156140ae576140ae846140a886611bfd565b84611dfc565b50505050565b600080805b86518110156140f2576140e88782815181106140d157fe5b6020026020010151836120ec90919063ffffffff16565b91506001016140b9565b506060855167ffffffffffffffff8111801561410d57600080fd5b50604051908082528060200260200182016040528015614137578160200160208202803683370190505b5090506000805b885181101561420457600061416f858b848151811061415957fe5b602002602001015161371b90919063ffffffff16565b90506141b18a838151811061418057fe5b60200260200101516141ab8b858151811061419757fe5b60200260200101518d8681518110612e3d57fe5b9061371b565b8483815181106141bd57fe5b6020026020010181815250506141f96141f2828685815181106141dc57fe5b6020026020010151613c6390919063ffffffff16565b84906120ec565b92505060010161413e565b506060885167ffffffffffffffff8111801561421f57600080fd5b50604051908082528060200260200182016040528015614249578160200160208202803683370190505b50905060005b895181101561431457600084828151811061426657fe5b60200260200101518411156142cd57600061428f61428386614a06565b8d85815181106116f657fe5b905060006142a3828d8681518110612e3d57fe5b90506142c46142bd82670de0b6b3a76400008d900361371b565b83906120ec565b925050506142e4565b8982815181106142d957fe5b602002602001015190505b6142f4818c8481518110612e3d57fe5b83838151811061430057fe5b60209081029190910101525060010161424f565b5060006143238b8b60016133cf565b905060006143338c8460006133cf565b905060006143418284613283565b905061435661434f82614a06565b8b90613c63565b9d9c50505050505050505050505050565b600080614376888860016133cf565b905060006143928261438c876141ab818b6120ec565b90613c63565b905060006143a28a8a848b61447c565b905060006143cc8a8a815181106143b557fe5b6020026020010151836115c890919063ffffffff16565b90506000805b8b518110156143f4576143ea8c82815181106140d157fe5b91506001016143d2565b50600061441d828d8d8151811061440757fe5b602002602001015161328390919063ffffffff16565b9050600061442a82614a06565b905060006144388583613c63565b9050600061444686836115c8565b905061446761446083670de0b6b3a76400008e900361371b565b82906120ec565b99505050505050505050509695505050505050565b60008084518602905060008560008151811061449457fe5b6020026020010151905060008651876000815181106144af57fe5b60200260200101510290506000600190505b8751811015614508576144ed6144e76144e0848b858151811061347257fe5b8a51611576565b886149e6565b91506144fe8882815181106133ef57fe5b92506001016144c1565b5086858151811061451557fe5b602002602001015182039150600061452d8788611576565b9050600061455961454d61454584610b958988611576565b6103e8611576565b8a898151811061347257fe5b9050600061457461456d6145458b896149e6565b86906120ec565b905060008061459061458686866120ec565b610b958d866120ec565b905060005b60ff811015614610578192506145c56145b286612ab58586611576565b610b958e612aaf88612ab5886002611576565b9150828211156145ee576001838303116145e9575097506140209650505050505050565b614608565b600182840311614608575097506140209650505050505050565b600101614595565b50612e78610142612749565b60008061462b888860016133cf565b905060006146418261438c876141ab818b6115c8565b905060006146518a8a848b61447c565b90506000614665828b8b81518110612e3d57fe5b90506000805b8b5181101561468d576146838c82815181106140d157fe5b915060010161466b565b5060006146a0828d8d8151811061440757fe5b905060006146ad82614a06565b905060006146bb8583613c63565b905060006146c986836115c8565b905061446761446083670de0b6b3a76400008e9003612c97565b600080805b865181101561470a576147008782815181106140d157fe5b91506001016146e8565b506060855167ffffffffffffffff8111801561472557600080fd5b5060405190808252806020026020018201604052801561474f578160200160208202803683370190505b5090506000805b88518110156147e9576000614771858b848151811061440757fe5b90506147b38a838151811061478257fe5b60200260200101516147ad8b858151811061479957fe5b60200260200101518d8681518110612dfb57fe5b90613283565b8483815181106147bf57fe5b6020026020010181815250506147de6141f2828685815181106116f657fe5b925050600101614756565b506060885167ffffffffffffffff8111801561480457600080fd5b5060405190808252806020026020018201604052801561482e578160200160208202803683370190505b50905060005b89518110156148ef5760008385838151811061484c57fe5b602002602001015111156148a857600061487161428386670de0b6b3a76400006115c8565b90506000614885828d8681518110612e3d57fe5b905061489f6142bd82670de0b6b3a76400008d9003612c97565b925050506148bf565b8982815181106148b457fe5b602002602001015190505b6148cf818c8481518110612dfb57fe5b8383815181106148db57fe5b602090810291909101015250600101614834565b5060006148fe8b8b60016133cf565b9050600061490e8c8460006133cf565b9050600061491c8284613283565b9050670de0b6b3a76400008111156149685761495a8a7ffffffffffffffffffffffffffffffffffffffffffffffffff21f494c589c00008301612c97565b975050505050505050611907565b6000975050505050505050611907565b60006149a37f2f1a0bc900000000000000000000000000000000000000000000000000000000610f85565b8214806149d757506149d47feb0f24d600000000000000000000000000000000000000000000000000000000610f85565b82145b806107ca57506107ca82614a2c565b60006149f58215156004611655565b8183816149fe57fe5b049392505050565b6000670de0b6b3a76400008210614a1e5760006107ca565b50670de0b6b3a76400000390565b6000614a577f38e9922e00000000000000000000000000000000000000000000000000000000610f85565b8214806107ca5750614a887f50dd6ed900000000000000000000000000000000000000000000000000000000610f85565b909114919050565b80356107ca8161558d565b600082601f830112614aab578081fd5b8135614abe614ab98261556d565b615546565b818152915060208083019084810181840286018201871015614adf57600080fd5b60005b84811015614afe57813584529282019290820190600101614ae2565b505050505092915050565b600082601f830112614b19578081fd5b8151614b27614ab98261556d565b818152915060208083019084810181840286018201871015614b4857600080fd5b60005b84811015614afe57815184529282019290820190600101614b4b565b600082601f830112614b77578081fd5b813567ffffffffffffffff811115614b8d578182fd5b614ba06020601f19601f84011601615546565b9150808252836020828501011115614bb757600080fd5b8060208401602084013760009082016020015292915050565b8051600181106107ca57600080fd5b80356107ca816155b0565b6000610120808385031215614bfd578182fd5b614c0681615546565b915050614c138383614bdf565b8152614c228360208401614a90565b6020820152614c348360408401614a90565b6040820152606082013560608201526080820135608082015260a082013560a0820152614c648360c08401614a90565b60c0820152614c768360e08401614a90565b60e08201526101008083013567ffffffffffffffff811115614c9757600080fd5b614ca385828601614b67565b82840152505092915050565b600060208284031215614cc0578081fd5b8135610a9e8161558d565b60008060408385031215614cdd578081fd5b8235614ce88161558d565b91506020830135614cf88161558d565b809150509250929050565b600080600060608486031215614d17578081fd5b8335614d228161558d565b92506020840135614d328161558d565b929592945050506040919091013590565b600080600080600080600060e0888a031215614d5d578283fd5b8735614d688161558d565b96506020880135614d788161558d565b95506040880135945060608801359350608088013560ff81168114614d9b578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215614dca578182fd5b8235614dd58161558d565b946020939093013593505050565b600080600060608486031215614df7578081fd5b835167ffffffffffffffff80821115614e0e578283fd5b818601915086601f830112614e21578283fd5b8151614e2f614ab98261556d565b80828252602080830192508086018b828387028901011115614e4f578788fd5b8796505b84871015614e7a578051614e668161558d565b845260019690960195928101928101614e53565b508901519097509350505080821115614e91578283fd5b50614e9e86828701614b09565b925050604084015190509250925092565b600060208284031215614ec0578081fd5b8135610a9e816155a2565b600060208284031215614edc578081fd5b8151610a9e816155a2565b600080600080600080600060e0888a031215614f01578081fd5b873596506020880135614f138161558d565b95506040880135614f238161558d565b9450606088013567ffffffffffffffff80821115614f3f578283fd5b614f4b8b838c01614a9b565b955060808a0135945060a08a0135935060c08a0135915080821115614f6e578283fd5b50614f7b8a828b01614b67565b91505092959891949750929550565b600060208284031215614f9b578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610a9e578182fd5b600060208284031215614fdb578081fd5b8151610a9e8161558d565b60008060408385031215614ff8578182fd5b82356150038161558d565b9150602083013567ffffffffffffffff81111561501e578182fd5b61502a85828601614b67565b9150509250929050565b600060208284031215615045578081fd5b610a9e8383614bd0565b60008060408385031215615061578182fd5b61506b8484614bd0565b9150602083015190509250929050565b60006020828403121561508c578081fd5b8151610a9e816155b0565b600080604083850312156150a9578182fd5b82516150b4816155b0565b602084015190925067ffffffffffffffff8111156150d0578182fd5b61502a85828601614b09565b600080600080608085870312156150f1578182fd5b843567ffffffffffffffff80821115615108578384fd5b61511488838901614bea565b95506020870135915080821115615129578384fd5b5061513687828801614a9b565b949794965050505060408301359260600135919050565b600080600060608486031215615161578081fd5b833567ffffffffffffffff811115615177578182fd5b61518386828701614bea565b9660208601359650604090950135949350505050565b6000602082840312156151aa578081fd5b5035919050565b6000602082840312156151c2578081fd5b5051919050565b600080604083850312156151db578182fd5b50508035926020909101359150565b600080600080608085870312156151ff578182fd5b845193506020850151925060408501519150606085015161521f8161558d565b939692955090935050565b6000815180845260208085019450808401835b838110156152595781518752958201959082019060010161523d565b509495945050505050565b60008151808452815b818110156152895760208185018101518683018201520161526d565b8181111561529a5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b8181101561537a5783516001600160a01b031683529284019291840191600101615355565b50909695505050505050565b600060208252610a9e602083018461522a565b6000604082526153ac604083018561522a565b8281036020840152611907818561522a565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000838252604060208301526140206040830184615264565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610a9e6020830184615264565b600083825260406020830152614020604083018461522a565b9283529015156020830152604082015260600190565b918252602082015260400190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561556557600080fd5b604052919050565b600067ffffffffffffffff821115615583578081fd5b5060209081020190565b6001600160a01b03811681146107e157600080fd5b80151581146107e157600080fd5b600281106107e157600080fdfea26469706673582212209be207960c602875159d44a232a262638e45325c9174ced67dfbb16fb5e1fb4064736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100715760003560e01c80634555fb8d116100505780634555fb8d146100c05780636634b753146100e05780638d928af81461010057610071565b8062c194db14610076578063174481fa146100945780632da47c40146100aa575b600080fd5b61007e610108565b60405161008b9190610a05565b60405180910390f35b61009c610127565b60405161008b9291906109d3565b6100b261016d565b60405161008b929190610b50565b6100d36100ce3660046107e0565b6101d7565b60405161008b9190610a18565b6100f36100ee3660046107c4565b61029d565b60405161008b91906109fa565b6100d36102c8565b60606101226040518060200160405280600081525061034b565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156101c957807f000000000000000000000000000000000000000000000000000000000000000003925062278d0091506101d2565b60009250600091505b509091565b60008060006101e461016d565b9150915061028e6040518061016001604052806101ff6102c8565b73ffffffffffffffffffffffffffffffffffffffff1681526020018d81526020018c81526020018b81526020018981526020018881526020018a81526020018781526020018481526020018381526020018673ffffffffffffffffffffffffffffffffffffffff1681525060405160200161027a9190610a39565b604051602081830303815290604052610424565b9b9a5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061034573ffffffffffffffffffffffffffffffffffffffff831615156101ac6104af565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016104168183866104c1565b505050505050505050919050565b6000806104308361053b565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b816104bd576104bd81610583565b5050565b5b602081106104ff5781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016104c2565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600060606105488361034b565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811661057c573d6000803e3d6000fd5b9392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b80356105fb81610ba5565b92915050565b600082601f830112610611578081fd5b813561062461061f82610b85565b610b5e565b81815291506020808301908481018184028601820187101561064557600080fd5b60005b8481101561066d57813561065b81610ba5565b84529282019290820190600101610648565b505050505092915050565b600082601f830112610688578081fd5b813561069661061f82610b85565b8181529150602080830190848101818402860182018710156106b757600080fd5b60005b8481101561066d5781356106cd81610ba5565b845292820192908201906001016106ba565b600082601f8301126106ef578081fd5b81356106fd61061f82610b85565b81815291506020808301908481018184028601820187101561071e57600080fd5b60005b8481101561066d57813584529282019290820190600101610721565b600082601f83011261074d578081fd5b813567ffffffffffffffff811115610763578182fd5b61079460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610b5e565b91508082528360208285010111156107ab57600080fd5b8060208401602084013760009082016020015292915050565b6000602082840312156107d5578081fd5b813561057c81610ba5565b600080600080600080600080610100898b0312156107fc578384fd5b883567ffffffffffffffff80821115610813578586fd5b61081f8c838d0161073d565b995060208b0135915080821115610834578586fd5b6108408c838d0161073d565b985060408b0135915080821115610855578586fd5b6108618c838d01610601565b975060608b0135965060808b013591508082111561087d578586fd5b6108898c838d01610678565b955060a08b013591508082111561089e578485fd5b506108ab8b828c016106df565b93505060c089013591506108c28a60e08b016105f0565b90509295985092959890939650565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208085019450808401835b8381101561093057815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016108fe565b509495945050505050565b6000815180845260208085019450808401835b838110156109305781518752958201959082019060010161094e565b60008151808452815b8181101561098f57602081850181015186830182015201610973565b818111156109a05782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b60006020825261057c602083018461096a565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600060208252610a4d6020830184516108d1565b6020830151610160806040850152610a6961018085018361096a565b915060408501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080868503016060870152610aa5848361096a565b93506060870151915080868503016080870152610ac284836108eb565b935060808701519150808685030160a0870152610adf84836108eb565b935060a08701519150808685030160c087015250610afd838261093b565b60c087015160e0878101919091528701516101008088019190915287015161012080880191909152870151610140808801919091528701519093509050610b46828601826108d1565b5090949350505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610b7d57600080fd5b604052919050565b600067ffffffffffffffff821115610b9b578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff81168114610bc757600080fd5b5056fea26469706673582212203412ec5f53a2471ff1e7c917c5ca78f89bbf7fd00003c0b478f37b2dcd49d0a064736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/index.ts b/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/index.ts new file mode 100644 index 0000000..35cd42c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/index.ts @@ -0,0 +1,8 @@ +import { Task, TaskRunOptions } from '@src'; +import { StablePhantomPoolDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as StablePhantomPoolDeployment; + const args = [input.Vault]; + await task.deployAndVerify('StablePhantomPoolFactory', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/input.ts b/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/input.ts new file mode 100644 index 0000000..70f5493 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type StablePhantomPoolDeployment = { + Vault: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/output/arbitrum.json new file mode 100644 index 0000000..cc5a9b3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "StablePhantomPoolFactory": "0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/output/goerli.json new file mode 100644 index 0000000..e3d5db4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/output/goerli.json @@ -0,0 +1,3 @@ +{ + "StablePhantomPoolFactory": "0x41E9036AE350baEDCC7107760A020Dca3c0731ec" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/output/kovan.json b/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/output/kovan.json new file mode 100644 index 0000000..ae18fc2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/output/kovan.json @@ -0,0 +1,3 @@ +{ + "StablePhantomPoolFactory": "0x6c7F4D97269eCE163fd08D5C2584A21E4a33934c" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/output/mainnet.json new file mode 100644 index 0000000..e924d1d --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "StablePhantomPoolFactory": "0xb08E16cFc07C684dAA2f93C70323BAdb2A6CBFd2" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/output/polygon.json new file mode 100644 index 0000000..c9a4e1e --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/output/polygon.json @@ -0,0 +1,3 @@ +{ + "StablePhantomPoolFactory": "0xC128a9954e6c874eA3d62ce62B468bA073093F25" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/readme.md b/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/readme.md new file mode 100644 index 0000000..e90a997 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20211208-stable-phantom-pool/readme.md @@ -0,0 +1,15 @@ +# 2021-12-08 - Preminted BPT Meta Stable Pool + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This factory and associated Pools have been deprecated due to numerical issues when one of the token depegs. It was superseded by this [updated version (also now deprecated)](../20221122-composable-stable-pool-v2). + +Deployment of the `StablePhantomPoolFactory`, for Meta Stable Pools with preminted BPT of up to 4 tokens. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet address](./output/arbitrum.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`StablePhantomPoolFactory` artifact](./artifact/StablePhantomPoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20220304-erc4626-linear-pool/artifact/ERC4626LinearPool.json b/balpy/balancer-deployments/tasks/deprecated/20220304-erc4626-linear-pool/artifact/ERC4626LinearPool.json new file mode 100644 index 0000000..30ac27c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220304-erc4626-linear-pool/artifact/ERC4626LinearPool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20", "name": "mainToken", "type": "address"}, {"internalType": "contract IERC20", "name": "wrappedToken", "type": "address"}, {"internalType": "uint256", "name": "upperTarget", "type": "uint256"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "address", "name": "owner", "type": "address"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "lowerTarget", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "upperTarget", "type": "uint256"}], "name": "TargetsSet", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getBptIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMainIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMainToken", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getScalingFactors", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getTargets", "outputs": [{"internalType": "uint256", "name": "lowerTarget", "type": "uint256"}, {"internalType": "uint256", "name": "upperTarget", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVirtualSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedToken", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedTokenRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "indexIn", "type": "uint256"}, {"internalType": "uint256", "name": "indexOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "bytes", "name": "poolConfig", "type": "bytes"}], "name": "setAssetManagerPoolConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bool", "name": "paused", "type": "bool"}], "name": "setPaused", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "newLowerTarget", "type": "uint256"}, {"internalType": "uint256", "name": "newUpperTarget", "type": "uint256"}], "name": "setTargets", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220304-erc4626-linear-pool/artifact/ERC4626LinearPoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20220304-erc4626-linear-pool/artifact/ERC4626LinearPoolFactory.json new file mode 100644 index 0000000..dadf3e8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220304-erc4626-linear-pool/artifact/ERC4626LinearPoolFactory.json @@ -0,0 +1,165 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ERC4626LinearPoolFactory", + "sourceName": "contracts/erc4626/ERC4626LinearPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract LinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101406040523480156200001257600080fd5b5060405162005fc238038062005fc28339810160408190526200003591620001c3565b80604051806020016200004890620001b5565b601f1982820381018352601f909101166040528051819060006002820460a081905280830360e0819052818552909150836200009081620000f9602090811b620002eb17901c565b60601b6001600160601b0319166080528285018051838252620000bf82620000f9602090811b620002eb17901c565b6001600160601b0319606091821b811660c0529690935290529590951b90911661010052505050426276a700016101205250620001f39050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001476001600160a01b03831615156101ac6200014d565b50919050565b816200015e576200015e8162000162565b5050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b61545a8062000b6883390190565b600060208284031215620001d5578081fd5b81516001600160a01b0381168114620001ec578182fd5b9392505050565b60805160601c60a05160c05160601c60e0516101005160601c61012051610913620002556000398061023852806102615250806102c952508061035252508061014a52806103ce52508061037352508061012952806103aa52506109136000f3fe608060405234801561001057600080fd5b50600436106100715760003560e01c80632da47c40116100505780632da47c40146100ca5780636634b753146100e05780638d928af81461010057610071565b8062c194db14610076578063174481fa146100945780632ccb254a146100aa575b600080fd5b61007e610108565b60405161008b91906107f0565b60405180910390f35b61009c610127565b60405161008b9291906107be565b6100bd6100b83660046106a7565b61016d565b60405161008b9190610803565b6100d2610232565b60405161008b9291906108aa565b6100f36100ee36600461068b565b61029c565b60405161008b91906107e5565b6100bd6102c7565b60606101226040518060200160405280600081525061034a565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080600061017a610232565b9150915060006101c161018b6102c7565b8c8c8c8c8c8c8a8a8e6040516020016101ad9a99989796959493929190610824565b604051602081830303815290604052610423565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561020b57600080fd5b505af115801561021f573d6000803e3d6000fd5b50929d9c50505050505050505050505050565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561028e57807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610297565b60009250600091505b509091565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061034473ffffffffffffffffffffffffffffffffffffffff831615156101ac6104ae565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016104158183866104c0565b505050505050505050919050565b60008061042f8361053a565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b816104bc576104bc81610582565b5050565b5b602081106104fe5781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016104c1565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600060606105478361034a565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811661057b573d6000803e3d6000fd5b9392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600082601f8301126105ff578081fd5b813567ffffffffffffffff80821115610616578283fd5b60405160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501168201018181108382111715610654578485fd5b60405282815292508284830160200186101561066f57600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121561069c578081fd5b813561057b816108b8565b600080600080600080600060e0888a0312156106c1578283fd5b873567ffffffffffffffff808211156106d8578485fd5b6106e48b838c016105ef565b985060208a01359150808211156106f9578485fd5b506107068a828b016105ef565b9650506040880135610717816108b8565b94506060880135610727816108b8565b93506080880135925060a0880135915060c0880135610745816108b8565b8091505092959891949750929550565b60008151808452815b8181101561077a5760208185018101518683018201520161075e565b8181111561078b5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b60006020825261057b6020830184610755565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600061014073ffffffffffffffffffffffffffffffffffffffff808e1684528160208501526108558285018e610755565b91508382036040850152610869828d610755565b9a811660608501529889166080840152505060a081019590955260c085019390935260e0840191909152610100830152909116610120909101529392505050565b918252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff811681146108da57600080fd5b5056fea2646970667358221220cf8fd2a13d121cb64f3b9f3da109cb422cb3a45583c9fb8a66c81a7a20dd7e5464736f6c634300070100336102c06040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b506040516200545a3803806200545a8339810160408190526200005a9162000bd0565b898989898989898989898960008a8a620000768b8b30620004f5565b6040805160038082526080820190925290602082016060803683370190505089898989828289898d8280604051806040016040528060018152602001603160f81b81525085858a336001600160a01b031660001b806080818152505050806001600160a01b031660a0816001600160a01b031660601b815250505081600390805190602001906200010992919062000a5c565b5080516200011f90600490602084019062000a5c565b505060058054601260ff1990911617905550815160209283012060c052805191012060e052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6101005260601b6001600160601b03191661014052506200019290506276a700831115610194620005c4565b620001a662278d00821115610195620005c4565b4290910161016081905201610180528551620001c8906002111560c8620005c4565b620001e2620001d6620005d9565b8751111560c9620005c4565b620001f886620005de60201b620014891760201c565b6200020384620005ea565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f9062000234908d9060040162000d6e565b602060405180830381600087803b1580156200024f57600080fd5b505af115801562000264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028a919062000bb7565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002bf9084908b908b9060040162000cd2565b600060405180830381600087803b158015620002da57600080fd5b505af1158015620002ef573d6000803e3d6000fd5b50505050806101a081815250505050505050505050505050866001600160a01b03166101c0816001600160a01b031660601b81525050856001600160a01b03166101e0816001600160a01b031660601b8152505060008060006200035b8a8a306200067660201b60201c565b610200819052610220839052610240829052919450925090506200037f8a6200076c565b610260526200038e896200076c565b610280526000620003a18b828b62000840565b50505050505050505050505050506000866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620003eb57600080fd5b505afa15801562000400573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000426919062000caf565b60ff1690506000886001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200046757600080fd5b505afa1580156200047c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a2919062000caf565b60ff1690506000620004da82620004c6601286620008ee60201b620014931760201c565b6200090b60201b620014a51790919060201c565b600a0a6102a0525062000da69b505050505050505050505050565b6060600080806200050887878762000676565b60408051600380825260808201909252939650919450925060208201606080368337019050509350868484815181106200053e57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050858483815181106200056c57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050848482815181106200059a57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505050509392505050565b81620005d557620005d58162000923565b5050565b600390565b80620005d58162000976565b620005ff64e8d4a5100082101560cb620005c4565b6200061767016345785d8a000082111560ca620005c4565b620006368160c060085462000a0360201b620014bb179092919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906200066b90839062000d83565b60405180910390a150565b6000806000846001600160a01b0316866001600160a01b03161015620006ff57836001600160a01b0316856001600160a01b03161015620006c257506000915060019050600262000763565b836001600160a01b0316866001600160a01b03161015620006ee57506000915060029050600162000763565b506001915060029050600062000763565b846001600160a01b0316846001600160a01b031610156200072b57506002915060019050600062000763565b856001600160a01b0316846001600160a01b031610156200075757506002915060009050600162000763565b50600191506000905060025b93509350939050565b60006001600160a01b038216301415620007905750670de0b6b3a76400006200083b565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620007cc57600080fd5b505afa158015620007e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000807919062000caf565b60ff1690506000620008266012836200090b60201b620014a51760201c565b905080600a0a670de0b6b3a764000002925050505b919050565b620008518183111561014c620005c4565b620008696001600160601b0382111561014d620005c4565b620008a46200088582606062000a1860201b620014d11760201c565b6200089d84600062000a1860201b620014d11760201c565b1762000a1c565b826001600160a01b03167fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d12808383604051620008e192919062000d8c565b60405180910390a2505050565b6000828201620009028482101583620005c4565b90505b92915050565b60006200091d838311156001620005c4565b50900390565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600281511015620009875762000a00565b6000816000815181106200099757fe5b602002602001015190506000600190505b8251811015620009fd576000838281518110620009c157fe5b60200260200101519050620009f2816001600160a01b0316846001600160a01b0316106065620005c460201b60201c565b9150600101620009a8565b50505b50565b6001600160401b03811b1992909216911b1790565b1b90565b62000a3b81600060085462000a4160201b620014d5179092919060201c565b60085550565b6001600160c01b03828116821b90821b198416179392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000a9f57805160ff191683800117855562000acf565b8280016001018555821562000acf579182015b8281111562000acf57825182559160200191906001019062000ab2565b5062000add92915062000ae1565b5090565b5b8082111562000add576000815560010162000ae2565b80516001600160a01b03811681146200090557600080fd5b600082601f83011262000b21578081fd5b81516001600160401b038082111562000b38578283fd5b6040516020601f8401601f191682018101838111838210171562000b5a578586fd5b8060405250819450838252868185880101111562000b7757600080fd5b600092505b8383101562000b9b578583018101518284018201529182019162000b7c565b8383111562000bad5760008185840101525b5050505092915050565b60006020828403121562000bc9578081fd5b5051919050565b6000806000806000806000806000806101408b8d03121562000bf0578586fd5b62000bfc8c8c62000af8565b60208c0151909a506001600160401b038082111562000c19578788fd5b62000c278e838f0162000b10565b9a5060408d015191508082111562000c3d578788fd5b5062000c4c8d828e0162000b10565b98505062000c5e8c60608d0162000af8565b965062000c6f8c60808d0162000af8565b955060a08b0151945060c08b0151935060e08b015192506101008b0151915062000c9e8c6101208d0162000af8565b90509295989b9194979a5092959850565b60006020828403121562000cc1578081fd5b815160ff8116811462000902578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000d1e5762000d0b855162000d9a565b8352938301939183019160010162000cf6565b505084810360408601528551808252908201925081860190845b8181101562000d605762000d4d835162000d9a565b8552938301939183019160010162000d38565b509298975050505050505050565b602081016003831062000d7d57fe5b91905290565b90815260200190565b918252602082015260400190565b6001600160a01b031690565b60805160a05160601c60c05160e05161010051610120516101405160601c61016051610180516101a0516101c05160601c6101e05160601c61020051610220516102405161026051610280516102a0516144dd62000f7d600039806125f15250806115af52508061154b528061241d5250806107c75280610b7a52806115d7528061280652806129b65280612b0d5280612c7f5280612e1b5280612f725250806109755280610b40528061156d5280611c2052806127d2528061293b52806129825280612a975280612ad95280612c4b5280612da55280612de75280612efc5280612f3e525080610bbb5280610d8a5280610e77528061140a52806116185280612362528061283d52806129ed5280612b445280612cb65280612e525280612fa9528061318e52806131c652508061145d528061173352806117ff5280612443528061278752806128c75280612c015280612d31525080610999528061101652806116ea52806117b65280611c5652806123e2528061274852806128695280612a235280612bc25280612ce25280612e885250806109165250806119df5250806119bb525080610f375250806110cc525080611ae5525080611b27525080611b06525080610f13525080610e9d52506144dd6000f3fe608060405234801561001057600080fd5b50600436106102d35760003560e01c8063679aefce1161018657806395d89b41116100e3578063d505accf11610097578063de82cd3411610071578063de82cd341461056b578063f174e24114610573578063f5431aa81461057b576102d3565b8063d505accf14610532578063d5c096c414610545578063dd62ed3e14610558576102d3565b8063a457c2d7116100c8578063a457c2d714610504578063a9059cbb14610517578063aaabadc51461052a576102d3565b806395d89b41146104e95780639f11080e146104f1576102d3565b806382687a561161013a57806387ec68171161011f57806387ec6817146104c6578063893d20e8146104d95780638d928af8146104e1576102d3565b806382687a56146104ab578063851c1bb3146104b3576102d3565b806374f3b0091161016b57806374f3b0091461046f5780637ecebe00146104905780638129fc1c146104a3576102d3565b8063679aefce1461045457806370a082311461045c576102d3565b80633644e515116102345780634de046d5116101e857806355c67628116101cd57806355c67628146104155780636028bfd41461041d57806363fe3b561461043e576102d3565b80634de046d5146103ed57806350dd6ed914610402576102d3565b806338fff2d01161021957806338fff2d0146103ca57806339509351146103d25780634d64cd74146103e5576102d3565b80633644e515146103af57806338e9922e146103b7576102d3565b806318160ddd1161028b5780631dd746ea116102705780631dd746ea1461037257806323b872dd14610387578063313ce5671461039a576102d3565b806318160ddd146103535780631c0de0511461035b576102d3565b8063095ea7b3116102bc578063095ea7b31461031657806316b8d6ff1461033657806316c38b3c1461033e576102d3565b806301ec954a146102d857806306fdde0314610301575b600080fd5b6102eb6102e6366004613f11565b610583565b6040516102f89190614231565b60405180910390f35b6103096106f9565b6040516102f891906143e9565b610329610324366004613c4e565b6107ae565b6040516102f8919061420e565b6102eb6107c5565b61035161034c366004613d45565b6107e9565b005b6102eb6107fd565b610363610803565b6040516102f893929190614219565b61037a61082c565b6040516102f891906141d6565b610329610395366004613b99565b61083b565b6103a26108cf565b6040516102f89190614423565b6102eb6108d8565b6103516103c5366004614030565b6108e2565b6102eb610914565b6103296103e0366004613c4e565b610938565b6102eb610973565b6103f5610997565b6040516102f891906141c2565b610351610410366004613e7c565b6109bb565b6102eb6109d9565b61043061042b366004613d7d565b6109ea565b6040516102f89291906143fc565b610446610a21565b6040516102f8929190614415565b6102eb610a4f565b6102eb61046a366004613b45565b610c03565b61048261047d366004613d7d565b610c22565b6040516102f89291906141e9565b6102eb61049e366004613b45565b610ca0565b610351610cbb565b6102eb610e75565b6102eb6104c1366004613e20565b610e99565b6104306104d4366004613d7d565b610eeb565b6103f5610f11565b6103f5610f35565b610309610f59565b6103516104ff366004614060565b610fd8565b610329610512366004613c4e565b611042565b610329610525366004613c4e565b611080565b6103f561108d565b610351610540366004613bd9565b611097565b610482610553366004613d7d565b6111e0565b6102eb610566366004613b61565b611311565b6102eb61136c565b6103f561145b565b6102eb61147f565b600084608001516105b0610595610f35565b6001600160a01b0316336001600160a01b03161460cd611501565b6105c56105bb610914565b82146101f4611501565b6105cd61150f565b6105e76003851080156105e05750600384105b6064611501565b60606105f1611524565b90506105fd8682611651565b600080610608610a21565b9150915061061461399c565b60405180606001604052806106276109d9565b815260208101859052604001839052905060008a51600181111561064757fe5b14156106ab5761066e8a60600151858a8151811061066157fe5b60200260200101516116b2565b60608b015260006106808b8b846116be565b905061069f81868a8151811061069257fe5b6020026020010151611785565b965050505050506106f0565b6106bf8a6060015185898151811061066157fe5b60608b015260006106d18b8b84611791565b905061069f81868b815181106106e357fe5b6020026020010151611846565b50949350505050565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107a35780601f10610778576101008083540402835291602001916107a3565b820191906000526020600020905b81548152906001019060200180831161078657829003601f168201915b505050505090505b90565b60006107bb338484611852565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6107f16118ba565b6107fa81611900565b50565b60025490565b600080600061081061199c565b15925061081b6119b9565b91506108256119dd565b9050909192565b6060610836611524565b905090565b6000806108488533611311565b905061086c336001600160a01b03871614806108645750838210155b61019e611501565b610877858585611a01565b336001600160a01b038616148015906108b057507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114155b156108c2576108c28533858403611852565b60019150505b9392505050565b60055460ff1690565b6000610836611ae1565b6000806108ed610a21565b915091506109066108fe8383611b7e565b61014f611501565b61090f83611c96565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916107bb91859061096e9086611493565b611852565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6109c36118ba565b6109cb61150f565b6109d58282611caf565b5050565b6008546000906108369060c0611d8f565b60006060610a0086516109fb611d9d565b611da2565b610a1589898989898989611daf611e53611eb4565b97509795505050505050565b6000806000610a2e612044565b9050610a3b81600061204a565b9250610a4881606061204a565b9150509091565b600080610a5a610914565b90506060610a66610f35565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610a919190614231565b60006040518083038186803b158015610aa957600080fd5b505afa158015610abd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ae59190810190613c79565b50915050610afa81610af5611524565b611651565b600080610b05610a21565b91509150610b1161399c565b6040518060600160405280610b246109d9565b81526020018481526020018381525090506000610bb0610b77867f000000000000000000000000000000000000000000000000000000000000000081518110610b6957fe5b60200260200101518461205c565b867f000000000000000000000000000000000000000000000000000000000000000081518110610ba357fe5b60200260200101516120bd565b9050610bf8610bf1867f000000000000000000000000000000000000000000000000000000000000000081518110610be457fe5b60200260200101516120c9565b82906120dc565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610c31610595610f35565b610c3c6105bb610914565b6060610c46611524565b9050610c528882611651565b6000606080610c678e8e8e8e8e8e8a8f611daf565b925092509250610c778d84612133565b610c818285611e53565b610c8b8185611e53565b909550935050505b5097509795505050505050565b6001600160a01b031660009081526006602052604090205490565b6000610cc5610914565b90506060610cd1610f35565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610cfc9190614231565b60006040518083038186803b158015610d1457600080fd5b505afa158015610d28573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d509190810190613c79565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff817f000000000000000000000000000000000000000000000000000000000000000081518110610db357fe5b602002602001018181525050610dc76139bd565b6040518060800160405280610ddb856107ab565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610e0c610f35565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610e3d9493929190614259565b600060405180830381600087803b158015610e5757600080fd5b505af1158015610e6b573d6000803e3d6000fd5b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610ece92919061414c565b604051602081830303815290604052805190602001209050919050565b60006060610efc86516109fb611d9d565b610a158989898989898961213d61215b611eb4565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107a35780601f10610778576101008083540402835291602001916107a3565b610fe06118ba565b600080610feb610a21565b91509150610ffc6108fe8383611b7e565b6110116110098585611b7e565b610157611501565b61103c7f000000000000000000000000000000000000000000000000000000000000000085856121bc565b50505050565b60008061104f3385611311565b90508083106110695761106433856000611852565b611076565b6110763385858403611852565b5060019392505050565b60006107bb338484611a01565b600061083661224d565b6110a58442111560d1611501565b6001600160a01b03871660009081526006602090815260408083205490519092916110fc917f0000000000000000000000000000000000000000000000000000000000000000918c918c918c9188918d910161433b565b604051602081830303815290604052805190602001209050600061111f826122c7565b905060006001828888886040516000815260200160405260405161114694939291906143cb565b6020604051602081039080840390855afa158015611168573d6000803e3d6000fd5b5050604051601f19015191506111aa90506001600160a01b038216158015906111a257508b6001600160a01b0316826001600160a01b0316145b6101f8611501565b6001600160a01b038b1660009081526006602052604090206001850190556111d38b8b8b611852565b5050505050505050505050565b606080886111ef610595610f35565b6111fa6105bb610914565b6060611204611524565b905061120e6107fd565b6112c157600060606112238d8d8d868b6122e3565b9150915061123c6112326123a4565b83101560cc611501565b61124e60006112496123a4565b6123a9565b6112618b61125a6123a4565b84036123a9565b61126b818461215b565b80611274611d9d565b67ffffffffffffffff8111801561128a57600080fd5b506040519080825280602002602001820160405280156112b4578160200160208202803683370190505b5095509550505050610c93565b6112cb8882611651565b60006060806112e08e8e8e8e8e8e8a8f61213d565b9250925092506112f08c846123a9565b6112fa828561215b565b6113048185611e53565b9095509350610c93915050565b600061131b610f35565b6001600160a01b0316826001600160a01b0316141561135b57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6107bf565b61136583836123b3565b90506107bf565b60006060611378610f35565b6001600160a01b031663f94d466861138e610914565b6040518263ffffffff1660e01b81526004016113aa9190614231565b60006040518083038186803b1580156113c257600080fd5b505afa1580156113d6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113fe9190810190613c79565b509150506000611449827f00000000000000000000000000000000000000000000000000000000000000008151811061143357fe5b6020026020010151611444306123de565b6116b2565b9050611454816124b8565b9250505090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108366124cc565b806109d581612625565b60008282016108c88482101583611501565b60006114b5838311156001611501565b50900390565b67ffffffffffffffff811b1992909216911b1790565b1b90565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116821b90821b198416179392505050565b816109d5576109d58161269e565b61152261151a61199c565b610192611501565b565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f00000000000000000000000000000000000000000000000000000000000000008151811061159657fe5b6020026020010181815250506115d46115ad6124cc565b7f00000000000000000000000000000000000000000000000000000000000000009061270b565b817f00000000000000000000000000000000000000000000000000000000000000008151811061160057fe5b602002602001018181525050670de0b6b3a7640000817f00000000000000000000000000000000000000000000000000000000000000008151811061164157fe5b6020908102919091010152905090565b60005b61165c611d9d565b81101561090f5761169383828151811061167257fe5b602002602001015183838151811061168657fe5b602002602001015161270b565b83828151811061169f57fe5b6020908102919091010152600101611654565b60006108c8838361270b565b60208301516000906001600160a01b03163014156116e8576116e1848484612741565b90506108c8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415611731576116e18484846128c0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b0316141561177a576116e1848484612a1c565b6108c861013561269e565b60006108c88383612b73565b60408301516000906001600160a01b03163014156117b4576116e1848484612bbb565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156117fd576116e1848484612d2a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b0316141561177a576116e1848484612e81565b60006108c883836120dc565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906118ad908590614231565b60405180910390a3505050565b60006118e96000357fffffffff0000000000000000000000000000000000000000000000000000000016610e99565b90506107fa6118f88233612fd8565b610191611501565b80156119205761191b6119116119b9565b4210610193611501565b611935565b61193561192b6119dd565b42106101a9611501565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be649061199190839061420e565b60405180910390a150565b60006119a66119dd565b42118061083657505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b611a186001600160a01b0384161515610198611501565b611a2f6001600160a01b0383161515610199611501565b611a3a83838361090f565b6001600160a01b038316600090815260208190526040902054611a6090826101a06130c1565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611a8f9082611493565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906118ad908590614231565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611b4e6130d7565b30604051602001611b6395949392919061436f565b60405160208183030381529060405280519060200120905090565b600080611b89610914565b90506060611b95610f35565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401611bc09190614231565b60006040518083038186803b158015611bd857600080fd5b505afa158015611bec573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c149190810190613c79565b509150506000611c7a827f000000000000000000000000000000000000000000000000000000000000000081518110611c4957fe5b60200260200101516114447f00000000000000000000000000000000000000000000000000000000000000006123de565b9050858110158015611c8c5750848111155b9695505050505050565b611c9e6118ba565b611ca661150f565b6107fa816130db565b6000611cb9610914565b90506000611cc5610f35565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b8152600401611cf29291906143b4565b60806040518083038186803b158015611d0a57600080fd5b505afa158015611d1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d429190614081565b6040517f18e736d40000000000000000000000000000000000000000000000000000000081529094506001600160a01b03851693506318e736d49250610e3d91508590879060040161439b565b1c67ffffffffffffffff1690565b600390565b6109d58183146067611501565b60006060806000611dbf85613146565b90506000818015611dcc57fe5b14611de157611ddc61014e61269e565b611e44565b611de961315c565b611df38986613170565b9094509250611e00611d9d565b67ffffffffffffffff81118015611e1657600080fd5b50604051908082528060200260200182016040528015611e40578160200160208202803683370190505b5091505b50985098509895505050505050565b60005b611e5e611d9d565b81101561090f57611e95838281518110611e7457fe5b6020026020010151838381518110611e8857fe5b6020026020010151612b73565b838281518110611ea157fe5b6020908102919091010152600101611e56565b333014611fa3576000306001600160a01b0316600036604051611ed892919061417c565b6000604051808303816000865af19150503d8060008114611f15576040519150601f19603f3d011682016040523d82523d6000602084013e611f1a565b606091505b505090508060008114611f2957fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611f85573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b6060611fad611524565b9050611fb98782611651565b60006060611fd18c8c8c8c8c8c898d8d63ffffffff16565b5091509150611fe481848663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08301526020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b60085490565b1c6bffffffffffffffffffffffff1690565b600081602001518310156120955781516020830151600091612081918690039061270b565b905061208d84826114a5565b9150506107bf565b816040015183116120a75750816107bf565b815160408301516000916120819186039061270b565b60006108c88383611493565b6dffffffffffffffffffffffffffff0390565b60006120eb8215156004611501565b826120f8575060006107bf565b670de0b6b3a76400008381029061211b9085838161211257fe5b04146005611501565b82600182038161212757fe5b046001019150506107bf565b6109d582826131f7565b600060608061214d61014e61269e565b985098509895505050505050565b60005b612166611d9d565b81101561090f5761219d83828151811061217c57fe5b602002602001015183838151811061219057fe5b60200260200101516120dc565b8382815181106121a957fe5b602090810291909101015260010161215e565b6121cb8183111561014c611501565b6121e66bffffffffffffffffffffffff82111561014d611501565b6122056121f48260606114d1565b6121ff8460006114d1565b176132b3565b826001600160a01b03167fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d12808383604051612240929190614415565b60405180910390a2505050565b6000612257610f35565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561228f57600080fd5b505afa1580156122a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108369190613e60565b60006122d1611ae1565b82604051602001610ece92919061418c565b600060606122ef61150f565b6123066001600160a01b0387163014610156611501565b61231d6001600160a01b0386163014610156611501565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff817f00000000000000000000000000000000000000000000000000000000000000008151811061238b57fe5b6020908102919091010152909890975095505050505050565b600090565b6109d582826132c8565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561244157507f0000000000000000000000000000000000000000000000000000000000000000610c1d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561248d576124866115ad6124cc565b9050610c1d565b6001600160a01b0382163014156124ad5750670de0b6b3a7640000610c1d565b610c1d61013561269e565b60006107bf826124c66107fd565b906114a5565b6000806124d761145b565b90506000816001600160a01b03166301e1d1146040518163ffffffff1660e01b815260040160206040518083038186803b15801561251457600080fd5b505afa158015612528573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254c9190614048565b90506000826001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561258957600080fd5b505afa15801561259d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c19190614048565b90508115806125ce575080155b156125e657670de0b6b3a764000093505050506107ab565b600061261c826126167f000000000000000000000000000000000000000000000000000000000000000086613356565b90613370565b94505050505090565b600281511015612634576107fa565b60008160008151811061264357fe5b602002602001015190506000600190505b825181101561090f57600083828151811061266b57fe5b60200260200101519050612694816001600160a01b0316846001600160a01b0316106065611501565b9150600101612654565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600082820261272f84158061272857508385838161272557fe5b04145b6003611501565b670de0b6b3a764000090049392505050565b60006127c77f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b031614806127bf57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b610135611501565b6128b88460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106127fb57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061282f57fe5b6020026020010151612866877f000000000000000000000000000000000000000000000000000000000000000081518110610be457fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b0316146128ac576133906128b0565b6133f05b63ffffffff16565b949350505050565b600061291c7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b031614806127bf575060408501516001600160a01b03163014610135611501565b60408401516001600160a01b03163014612977576129728460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061296457fe5b602002602001015184613459565b6128b8565b6128b88460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106129ab57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106129df57fe5b6020026020010151612a16877f000000000000000000000000000000000000000000000000000000000000000081518110610be457fe5b86613489565b6000612a787f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b031614806127bf575060408501516001600160a01b03163014610135611501565b60408401516001600160a01b03163014612ace576129728460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612ac057fe5b6020026020010151846134ef565b6128b88460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612b0257fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612b3657fe5b6020026020010151612b6d877f000000000000000000000000000000000000000000000000000000000000000081518110610be457fe5b8661352f565b6000612b828215156004611501565b82612b8f575060006107bf565b670de0b6b3a764000083810290612ba99085838161211257fe5b828181612bb257fe5b049150506107bf565b6000612c407f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b031614806127bf57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b031614610135611501565b6128b88460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612c7457fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612ca857fe5b6020026020010151612cdf877f000000000000000000000000000000000000000000000000000000000000000081518110610be457fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b031614612d25576135966128b0565b6135ed565b6000612d867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b031614806127bf575060208501516001600160a01b03163014610135611501565b60208401516001600160a01b03163014612ddc576129728460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612dce57fe5b602002602001015184613657565b6128b88460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612e1057fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612e4457fe5b6020026020010151612e7b877f000000000000000000000000000000000000000000000000000000000000000081518110610be457fe5b86613681565b6000612edd7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b031614806127bf575060208501516001600160a01b03163014610135611501565b60208401516001600160a01b03163014612f33576129728460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f2557fe5b6020026020010151846136d0565b6128b88460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f6757fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f9b57fe5b6020026020010151612fd2877f000000000000000000000000000000000000000000000000000000000000000081518110610be457fe5b86613705565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b612ff7610f11565b6001600160a01b031614158015613012575061301283613759565b1561303a5761301f610f11565b6001600160a01b0316336001600160a01b03161490506107bf565b61304261224d565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016130719392919061423a565b60206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113659190613d61565b60006130d08484111583611501565b5050900390565b4690565b6130ee64e8d4a5100082101560cb611501565b61310467016345785d8a000082111560ca611501565b600854613113908260c06114bb565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611991908390614231565b6000818060200190518101906107bf9190613eca565b61152261316761199c565b156101af611501565b60006060600061317f84613795565b905060606131ea86836131c4897f0000000000000000000000000000000000000000000000000000000000000000815181106131b757fe5b60200260200101516124b8565b7f00000000000000000000000000000000000000000000000000000000000000006137ab565b9196919550909350505050565b61320e6001600160a01b038316151561019b611501565b61321a8260008361090f565b6001600160a01b03821660009081526020819052604090205461324090826101b26130c1565b6001600160a01b0383166000908152602081905260409020556002546132669082613867565b6002556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906132a7908590614231565b60405180910390a35050565b6008546132c2908260006114d5565b60085550565b6132d46000838361090f565b6002546132e19082611493565b6002556001600160a01b0382166000908152602081905260409020546133079082611493565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906132a7908590614231565b60008282026108c884158061272857508385838161272557fe5b600061337f8215156004611501565b81838161338857fe5b049392505050565b60008061339d868461205c565b905060006133ab82876120bd565b905060006133b9868a6114a5565b905060006133d4846124c66133ce8587613356565b8a613875565b90506133e088826114a5565b9450505050505b95945050505050565b6000806133fd868461205c565b9050600061340b82876120bd565b9050600061342261341c838b613356565b87613370565b9050600061343084836114a5565b9050600061343e82886138a8565b905061344a8a826114a5565b9b9a5050505050505050505050565b600080613466848461205c565b9050600061347d6134778688611493565b8561205c565b9050611c8c81836114a5565b6000826134a15761349a868361205c565b90506133e7565b60006134ad868461205c565b905060006134be613477888a611493565b905060006134cc82846114a5565b905060006134da84896120bd565b90506133e06134e98884613356565b82613370565b6000806134fc848461205c565b9050600061350a82876114a5565b9050600061351882866138a8565b905061352486826114a5565b979650505050505050565b60008261353d5750846133e7565b6000613549868461205c565b9050600061355782876120bd565b90506000613565878a611493565b9050600061357384836120bd565b9050600061358a6135848984613356565b85613370565b905061344a81896114a5565b6000826135a45750846133e7565b60006135b0868461205c565b905060006135be82876120bd565b905060006135cc868a611493565b905060006135e1846124c66133ce8587613356565b90506133e081896114a5565b6000826135fe5761349a86836138a8565b600061360a868461205c565b9050600061361882876120bd565b9050600061362f613629838b613356565b87613875565b9050600061363d8483611493565b9050600061364b82886138a8565b905061344a818b6114a5565b600080613664848461205c565b9050600061367561347786886114a5565b9050611c8c82826114a5565b60008061368e868461205c565b9050600061369f613477888a6114a5565b905060006136ad83836114a5565b905060006136bb84896120bd565b90506133e06136ca8884613356565b82613875565b6000806136dd848461205c565b905060006136eb8287611493565b905060006136f982866138a8565b905061352481876114a5565b600080613712868461205c565b9050600061372082876120bd565b9050600061372e878a6114a5565b9050600061373c84836120bd565b9050600061374d6135848984613356565b905061344a88826114a5565b60006137847f9f11080e00000000000000000000000000000000000000000000000000000000610e99565b8214806107bf57506107bf82613938565b6000818060200190518101906108c89190613ee5565b606060006137b98585612b73565b90506060865167ffffffffffffffff811180156137d557600080fd5b506040519080825280602002602001820160405280156137ff578160200160208202803683370190505b50905060005b875181101561385c578481146138545761383b8389838151811061382557fe5b602002602001015161270b90919063ffffffff16565b82828151811061384757fe5b6020026020010181815250505b600101613805565b509695505050505050565b60006108c8838360016130c1565b60006138848215156004611501565b82613891575060006107bf565b81600184038161389d57fe5b0460010190506107bf565b600081602001518310156138f1578151611365906138cf90670de0b6b3a764000090611493565b602084015184516138eb916138e4919061270b565b8690611493565b90612b73565b816040015183116139035750816107bf565b81516113659061391c90670de0b6b3a7640000906114a5565b604084015184516138eb91613931919061270b565b86906114a5565b60006139637f38e9922e00000000000000000000000000000000000000000000000000000000610e99565b8214806107bf57506139947f50dd6ed900000000000000000000000000000000000000000000000000000000610e99565b909114919050565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b80356107bf81614484565b600082601f830112613a02578081fd5b8135613a15613a1082614458565b614431565b818152915060208083019084810181840286018201871015613a3657600080fd5b60005b84811015613a5557813584529282019290820190600101613a39565b505050505092915050565b600082601f830112613a70578081fd5b8151613a7e613a1082614458565b818152915060208083019084810181840286018201871015613a9f57600080fd5b60005b84811015613a5557815184529282019290820190600101613aa2565b600082601f830112613ace578081fd5b813567ffffffffffffffff811115613ae4578182fd5b613af76020601f19601f84011601614431565b9150808252836020828501011115613b0e57600080fd5b8060208401602084013760009082016020015292915050565b8051600181106107bf57600080fd5b8035600281106107bf57600080fd5b600060208284031215613b56578081fd5b81356108c881614484565b60008060408385031215613b73578081fd5b8235613b7e81614484565b91506020830135613b8e81614484565b809150509250929050565b600080600060608486031215613bad578081fd5b8335613bb881614484565b92506020840135613bc881614484565b929592945050506040919091013590565b600080600080600080600060e0888a031215613bf3578283fd5b8735613bfe81614484565b96506020880135613c0e81614484565b95506040880135945060608801359350608088013560ff81168114613c31578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613c60578182fd5b8235613c6b81614484565b946020939093013593505050565b600080600060608486031215613c8d578081fd5b835167ffffffffffffffff80821115613ca4578283fd5b818601915086601f830112613cb7578283fd5b8151613cc5613a1082614458565b80828252602080830192508086018b828387028901011115613ce5578788fd5b8796505b84871015613d10578051613cfc81614484565b845260019690960195928101928101613ce9565b508901519097509350505080821115613d27578283fd5b50613d3486828701613a60565b925050604084015190509250925092565b600060208284031215613d56578081fd5b81356108c881614499565b600060208284031215613d72578081fd5b81516108c881614499565b600080600080600080600060e0888a031215613d97578081fd5b873596506020880135613da981614484565b95506040880135613db981614484565b9450606088013567ffffffffffffffff80821115613dd5578283fd5b613de18b838c016139f2565b955060808a0135945060a08a0135935060c08a0135915080821115613e04578283fd5b50613e118a828b01613abe565b91505092959891949750929550565b600060208284031215613e31578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c8578182fd5b600060208284031215613e71578081fd5b81516108c881614484565b60008060408385031215613e8e578182fd5b8235613e9981614484565b9150602083013567ffffffffffffffff811115613eb4578182fd5b613ec085828601613abe565b9150509250929050565b600060208284031215613edb578081fd5b6108c88383613b27565b60008060408385031215613ef7578182fd5b613f018484613b27565b9150602083015190509250929050565b60008060008060808587031215613f26578182fd5b843567ffffffffffffffff80821115613f3d578384fd5b818701915061012080838a031215613f53578485fd5b613f5c81614431565b9050613f688984613b36565b8152613f7789602085016139e7565b6020820152613f8989604085016139e7565b6040820152606083013560608201526080830135608082015260a083013560a0820152613fb98960c085016139e7565b60c0820152613fcb8960e085016139e7565b60e08201526101008084013583811115613fe3578687fd5b613fef8b828701613abe565b82840152505080965050602087013591508082111561400c578384fd5b50614019878288016139f2565b949794965050505060408301359260600135919050565b600060208284031215614041578081fd5b5035919050565b600060208284031215614059578081fd5b5051919050565b60008060408385031215614072578182fd5b50508035926020909101359150565b60008060008060808587031215614096578182fd5b84519350602085015192506040850151915060608501516140b681614484565b939692955090935050565b6000815180845260208085019450808401835b838110156140f0578151875295820195908201906001016140d4565b509495945050505050565b15159052565b60008151808452815b818110156141265760208185018101518683018201520161410a565b818111156141375782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6000602082526108c860208301846140c1565b6000604082526141fc60408301856140c1565b82810360208401526133e781856140c1565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156142ca576142b48451614478565b82529284019260019290920191908401906142a2565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a087015261430881856140c1565b935050506040850151818584030160c08601526143258382614101565b92505050606084015161385c60e08501826140fb565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000838252604060208301526128b86040830184614101565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526108c86020830184614101565b6000838252604060208301526128b860408301846140c1565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561445057600080fd5b604052919050565b600067ffffffffffffffff82111561446e578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146107fa57600080fd5b80151581146107fa57600080fdfea2646970667358221220b636112632f715f59c9c6dbdf377917a589c32f3e1bf0e8ae9d2a2df5894186f64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100715760003560e01c80632da47c40116100505780632da47c40146100ca5780636634b753146100e05780638d928af81461010057610071565b8062c194db14610076578063174481fa146100945780632ccb254a146100aa575b600080fd5b61007e610108565b60405161008b91906107f0565b60405180910390f35b61009c610127565b60405161008b9291906107be565b6100bd6100b83660046106a7565b61016d565b60405161008b9190610803565b6100d2610232565b60405161008b9291906108aa565b6100f36100ee36600461068b565b61029c565b60405161008b91906107e5565b6100bd6102c7565b60606101226040518060200160405280600081525061034a565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080600061017a610232565b9150915060006101c161018b6102c7565b8c8c8c8c8c8c8a8a8e6040516020016101ad9a99989796959493929190610824565b604051602081830303815290604052610423565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561020b57600080fd5b505af115801561021f573d6000803e3d6000fd5b50929d9c50505050505050505050505050565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561028e57807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610297565b60009250600091505b509091565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061034473ffffffffffffffffffffffffffffffffffffffff831615156101ac6104ae565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016104158183866104c0565b505050505050505050919050565b60008061042f8361053a565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b816104bc576104bc81610582565b5050565b5b602081106104fe5781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016104c1565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600060606105478361034a565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811661057b573d6000803e3d6000fd5b9392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600082601f8301126105ff578081fd5b813567ffffffffffffffff80821115610616578283fd5b60405160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501168201018181108382111715610654578485fd5b60405282815292508284830160200186101561066f57600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121561069c578081fd5b813561057b816108b8565b600080600080600080600060e0888a0312156106c1578283fd5b873567ffffffffffffffff808211156106d8578485fd5b6106e48b838c016105ef565b985060208a01359150808211156106f9578485fd5b506107068a828b016105ef565b9650506040880135610717816108b8565b94506060880135610727816108b8565b93506080880135925060a0880135915060c0880135610745816108b8565b8091505092959891949750929550565b60008151808452815b8181101561077a5760208185018101518683018201520161075e565b8181111561078b5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b60006020825261057b6020830184610755565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600061014073ffffffffffffffffffffffffffffffffffffffff808e1684528160208501526108558285018e610755565b91508382036040850152610869828d610755565b9a811660608501529889166080840152505060a081019590955260c085019390935260e0840191909152610100830152909116610120909101529392505050565b918252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff811681146108da57600080fd5b5056fea2646970667358221220cf8fd2a13d121cb64f3b9f3da109cb422cb3a45583c9fb8a66c81a7a20dd7e5464736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220304-erc4626-linear-pool/index.ts b/balpy/balancer-deployments/tasks/deprecated/20220304-erc4626-linear-pool/index.ts new file mode 100644 index 0000000..3df9699 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220304-erc4626-linear-pool/index.ts @@ -0,0 +1,8 @@ +import { Task, TaskRunOptions } from '@src'; +import { ERC4626LinearPoolDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as ERC4626LinearPoolDeployment; + const args = [input.Vault]; + await task.deployAndVerify('ERC4626LinearPoolFactory', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220304-erc4626-linear-pool/input.ts b/balpy/balancer-deployments/tasks/deprecated/20220304-erc4626-linear-pool/input.ts new file mode 100644 index 0000000..3a09f1c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220304-erc4626-linear-pool/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type ERC4626LinearPoolDeployment = { + Vault: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220304-erc4626-linear-pool/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20220304-erc4626-linear-pool/output/polygon.json new file mode 100644 index 0000000..93dcfd1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220304-erc4626-linear-pool/output/polygon.json @@ -0,0 +1,3 @@ +{ + "ERC4626LinearPoolFactory": "0xC6bD2497332d24094eC16a7261eec5C412B5a2C1" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220304-erc4626-linear-pool/readme.md b/balpy/balancer-deployments/tasks/deprecated/20220304-erc4626-linear-pool/readme.md new file mode 100644 index 0000000..43f4531 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220304-erc4626-linear-pool/readme.md @@ -0,0 +1,12 @@ +# 2022-03-04 - ERC4626 Linear Pool V1 + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This factory and associated Pools have been deprecated due to changes to the EIP-4626 standard. It was superseded by this [updated version (also now deprecated)](../20220404-erc4626-linear-pool-v2). + +Preliminary deployment of the `ERC4626LinearPoolFactory`, for Linear Pools with a ERC4626 yield-bearing token. + +## Useful Files + +- [Polygon mainnet addresses](./output/polygon.json) +- [`ERC4626LinearPoolFactory` artifact](./artifact/ERC4626LinearPoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/artifact/BatchRelayerLibrary.json b/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/artifact/BatchRelayerLibrary.json new file mode 100644 index 0000000..f29cf17 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/artifact/BatchRelayerLibrary.json @@ -0,0 +1,890 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BatchRelayerLibrary", + "sourceName": "contracts/BatchRelayerLibrary.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wstETH", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approveVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "assetInIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "assetOutIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IVault.BatchSwapStep[]", + "name": "swaps", + "type": "tuple[]" + }, + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + }, + { + "internalType": "int256[]", + "name": "limits", + "type": "int256[]" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "key", + "type": "uint256" + } + ], + "internalType": "struct VaultActions.OutputReference[]", + "name": "outputReferences", + "type": "tuple[]" + } + ], + "name": "batchSwap", + "outputs": [ + { + "internalType": "int256[]", + "name": "", + "type": "int256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "enum VaultActions.PoolKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "minAmountsOut", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.ExitPoolRequest", + "name": "request", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "key", + "type": "uint256" + } + ], + "internalType": "struct VaultActions.OutputReference[]", + "name": "outputReferences", + "type": "tuple[]" + } + ], + "name": "exitPool", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "getEntrypoint", + "outputs": [ + { + "internalType": "contract IBalancerRelayer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "enum VaultActions.PoolKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "maxAmountsIn", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.JoinPoolRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "joinPool", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.UserBalanceOpKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IAsset", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + } + ], + "internalType": "struct IVault.UserBalanceOp[]", + "name": "ops", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "manageUserBalance", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "relayer", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "authorisation", + "type": "bytes" + } + ], + "name": "setRelayerApproval", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "stakeETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "stakeETHAndWrap", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IAsset", + "name": "assetIn", + "type": "address" + }, + { + "internalType": "contract IAsset", + "name": "assetOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IVault.SingleSwap", + "name": "singleSwap", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "limit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "swap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStaticATokenLM", + "name": "staticToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "toUnderlying", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapAaveStaticToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC4626", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapERC4626", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IUnbuttonToken", + "name": "wrapperToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapUnbuttonToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapWstETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20Permit", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "vaultPermit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20PermitDAI", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "holder", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "vaultPermitDAI", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStaticATokenLM", + "name": "staticToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "fromUnderlying", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapAaveDynamicToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC4626", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapERC4626", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapStETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IUnbuttonToken", + "name": "wrapperToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "uAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapUnbuttonToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x6101406040527fae1dc54057af8e8e5ce068cdd4383149c7efcb30e8fb95b592ee1594367fb50960e0523480156200003657600080fd5b5060405162004ae138038062004ae18339810160408190526200005991620001fa565b8082806001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200009557600080fd5b505afa158015620000aa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d0919062000238565b6001600160601b0319606091821b81166080529082901b1660a05260405181903090620000fd90620001ec565b6200010a9291906200025e565b604051809103906000f08015801562000127573d6000803e3d6000fd5b5060601b6001600160601b03191660c052506001600160a01b03811662000150576000620001c7565b806001600160a01b031663c1fe3e486040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200018c57600080fd5b505af1158015620001a1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001c7919062000238565b6001600160601b0319606091821b81166101005291901b166101205250620002919050565b61074f806200439283390190565b600080604083850312156200020d578182fd5b82516200021a8162000278565b60208401519092506200022d8162000278565b809150509250929050565b6000602082840312156200024a578081fd5b8151620002578162000278565b9392505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03811681146200028e57600080fd5b50565b60805160601c60a05160601c60c05160601c60e0516101005160601c6101205160601c614071620003216000398061038e52806104225280610488528061081852806108c85280610991528061204852806120a052508061079652806107eb5280610a595280610b3852806121695250806125e95250806113a85250806114a8528061154a5250506140716000f3fe60806040526004361061016a5760003560e01c806380db15bd116100cb578063abf6d3991161007f578063db4c0e9111610059578063db4c0e9114610308578063ecc026371461031b578063efe691081461032e5761016a565b8063abf6d399146102c2578063b6d24737146102d5578063d80952d5146102f55761016a565b80638d928af8116100b05780638d928af8146102875780638fe4624f1461029c578063959fc17a146102af5761016a565b806380db15bd146102615780638d64cfbc146102745761016a565b8063433b0865116101225780636d307ea8116101075780636d307ea8146102195780637ab6e03c1461022c5780637fd0e5d51461023f5761016a565b8063433b0865146101f3578063611b90dd146102065761016a565b80631c982441116101535780631c982441146101ad5780632cbec84e146101c05780632e6272ea146101d35761016a565b80631089e5e31461016f5780631836944614610184575b600080fd5b61018261017d366004612f7e565b610341565b005b610197610192366004613500565b610531565b6040516101a49190613ace565b60405180910390f35b6101826101bb366004612eac565b61073e565b6101826101ce366004612f7e565b610a3b565b6101e66101e13660046135fc565b610b6f565b6040516101a49190613f35565b6101826102013660046133ba565b610c9c565b610182610214366004613360565b610f4b565b610182610227366004613360565b611066565b61018261023a3660046133ba565b611291565b34801561024b57600080fd5b506102546113a6565b6040516101a4919061394a565b61018261026f366004612ef1565b6113ca565b6101826102823660046132c7565b6114ce565b34801561029357600080fd5b50610254611548565b6101826102aa3660046131b7565b61156c565b6101826102bd366004613246565b6117a3565b6101826102d0366004613360565b611820565b3480156102e157600080fd5b506101826102f0366004613335565b6119d6565b61018261030336600461310f565b611a62565b610182610316366004612eac565b611ff0565b610182610329366004613042565b6121a0565b61018261033c366004613360565b612298565b61034a82612341565b1561035b576103588261238c565b91505b6040517fb0e389000000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b0e38900906103c3908690600401613f35565b60206040518083038186803b1580156103db57600080fd5b505afa1580156103ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041391906136ea565b90506104486001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016846123a6565b6001600160a01b0384163014610513576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906104bf9087908590600401613a66565b602060405180830381600087803b1580156104d957600080fd5b505af11580156104ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051191906130f3565b505b61051c82612341565b1561052b5761052b8282612420565b50505050565b60603361054160208a018a612e74565b6001600160a01b0316148061056a57503061055f60208a018a612e74565b6001600160a01b0316145b61058f5760405162461bcd60e51b815260040161058690613e05565b60405180910390fd5b60005b8b518110156105f45760008c82815181106105a957fe5b60200260200101516060015190506105c081612341565b156105eb576105ce8161238c565b8d83815181106105da57fe5b602002602001015160600181815250505b50600101610592565b5060606105ff611548565b6001600160a01b031663945bcec9868f8f8f8f8f8f8f8f6040518a63ffffffff1660e01b8152600401610639989796959493929190613cfc565b6000604051808303818588803b15801561065257600080fd5b505af1158015610666573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405261068f9190810190612fb2565b905060005b8381101561072d576106ba8585838181106106ab57fe5b90506040020160200135612341565b6106d65760405162461bcd60e51b815260040161058690613e73565b6107258585838181106106e557fe5b90506040020160200135610720848888868181106106ff57fe5b905060400201600001358151811061071357fe5b6020026020010151612433565b612420565b600101610694565b509c9b505050505050505050505050565b61074782612341565b15610758576107558261238c565b91505b6001600160a01b03841630146107bb576001600160a01b03841633146107905760405162461bcd60e51b815260040161058690613e05565b6107bb847f00000000000000000000000000000000000000000000000000000000000000008461244d565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b390610842907f0000000000000000000000000000000000000000000000000000000000000000908690600401613a66565b602060405180830381600087803b15801561085c57600080fd5b505af1158015610870573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089491906130f3565b506040517fea598cb00000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ea598cb0906108fd908690600401613f35565b602060405180830381600087803b15801561091757600080fd5b505af115801561092b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094f91906136ea565b90506001600160a01b0384163014610a1c576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906109c89087908590600401613a66565b602060405180830381600087803b1580156109e257600080fd5b505af11580156109f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1a91906130f3565b505b610a2582612341565b15610a3457610a348282612420565b5050505050565b610a4482612341565b15610a5557610a528261238c565b91505b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a1903eab84306040518363ffffffff1660e01b8152600401610aa4919061394a565b6020604051808303818588803b158015610abd57600080fd5b505af1158015610ad1573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610af691906136ea565b90506001600160a01b0384163014610513576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906104bf9087908590600401613a66565b600033610b7f6020880188612e74565b6001600160a01b03161480610ba8575030610b9d6020880188612e74565b6001600160a01b0316145b610bc45760405162461bcd60e51b815260040161058690613e05565b610bd18760800151612341565b15610be957610be3876080015161238c565b60808801525b6000610bf3611548565b6001600160a01b03166352bbbe29858a8a8a8a6040518663ffffffff1660e01b8152600401610c259493929190613eaa565b6020604051808303818588803b158015610c3e57600080fd5b505af1158015610c52573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610c7791906136ea565b9050610c8283612341565b15610c9157610c918382612420565b979650505050505050565b610ca583612341565b15610cb657610cb38361238c565b92505b600082610d3557866001600160a01b03166351c0e0616040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610cf857600080fd5b505af1158015610d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d309190612e90565b610da8565b866001600160a01b0316634800d97f6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610d7057600080fd5b505af1158015610d84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da89190612e90565b90506001600160a01b0386163014610ded576001600160a01b0386163314610de25760405162461bcd60e51b815260040161058690613e05565b610ded86828661244d565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b390610e34908a908890600401613a66565b602060405180830381600087803b158015610e4e57600080fd5b505af1158015610e62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8691906130f3565b506040517f2f2cab870000000000000000000000000000000000000000000000000000000081526000906001600160a01b03891690632f2cab8790610ed5908990899086908a90600401613aa2565b602060405180830381600087803b158015610eef57600080fd5b505af1158015610f03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2791906136ea565b9050610f3283612341565b15610f4157610f418382612420565b5050505050505050565b610f5482612341565b15610f6557610f628261238c565b91505b6001600160a01b0384163014610fa8576001600160a01b0384163314610f9d5760405162461bcd60e51b815260040161058690613e05565b610fa884868461244d565b6040517fea785a5e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b0387169063ea785a5e90610ff29087908790600401613a66565b602060405180830381600087803b15801561100c57600080fd5b505af1158015611020573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104491906136ea565b905061104f82612341565b1561105e5761105e8282612420565b505050505050565b61106f82612341565b156110805761107d8261238c565b91505b6000856001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110bb57600080fd5b505afa1580156110cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f39190612e90565b90506001600160a01b0385163014611138576001600160a01b038516331461112d5760405162461bcd60e51b815260040161058690613e05565b61113885828561244d565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b39061117f9089908790600401613a66565b602060405180830381600087803b15801561119957600080fd5b505af11580156111ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d191906130f3565b506040517f6e553f650000000000000000000000000000000000000000000000000000000081526000906001600160a01b03881690636e553f659061121c9087908990600401613f3e565b602060405180830381600087803b15801561123657600080fd5b505af115801561124a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126e91906136ea565b905061127983612341565b15611288576112888382612420565b50505050505050565b61129a83612341565b156112ab576112a88361238c565b92505b6001600160a01b03851630146112ee576001600160a01b03851633146112e35760405162461bcd60e51b815260040161058690613e05565b6112ee85878561244d565b6040517fead5d3590000000000000000000000000000000000000000000000000000000081526000906001600160a01b0388169063ead5d3599061133a90889088908890600401613a7f565b6040805180830381600087803b15801561135357600080fd5b505af1158015611367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138b9190613702565b91505061139782612341565b15611288576112888282612420565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b0384163014806113df575082155b6113fb5760405162461bcd60e51b815260040161058690613e3c565b606063fa6e671d60e01b33868660405160240161141a9392919061395e565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009095169490941790935251611489928691869101613917565b60408051601f19818403018152919052905061105e6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016826124e9565b866001600160a01b031663d505accf876114e6611548565b88888888886040518863ffffffff1660e01b815260040161150d9796959493929190613a25565b600060405180830381600087803b15801561152757600080fd5b505af115801561153b573d6000803e3d6000fd5b5050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b03851633148061158b57506001600160a01b03851630145b6115a75760405162461bcd60e51b815260040161058690613e05565b60006115b288612561565b905060006115bf83612341565b6115ca57600061165f565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038316906370a082319061160f90899060040161394a565b60206040518083038186803b15801561162757600080fd5b505afa15801561163b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165f91906136ea565b905061166f888660400151612567565b604086015261167c611548565b6001600160a01b031663b95cac28858b8a8a8a6040518663ffffffff1660e01b81526004016116ae9493929190613c56565b6000604051808303818588803b1580156116c757600080fd5b505af11580156116db573d6000803e3d6000fd5b50505050506116e983612341565b15611798576040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038416906370a0823190611736908a9060040161394a565b60206040518083038186803b15801561174e57600080fd5b505afa158015611762573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178691906136ea565b9050611796846107208385612595565b505b505050505050505050565b876001600160a01b0316638fcbaf0c886117bb611548565b8989898989896040518963ffffffff1660e01b81526004016117e49897969594939291906139dc565b600060405180830381600087803b1580156117fe57600080fd5b505af1158015611812573d6000803e3d6000fd5b505050505050505050505050565b61182982612341565b1561183a576118378261238c565b91505b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561187557600080fd5b505afa158015611889573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ad9190612e90565b90506001600160a01b03851630146118f2576001600160a01b03851633146118e75760405162461bcd60e51b815260040161058690613e05565b6118f285828561244d565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b3906119399089908790600401613a66565b602060405180830381600087803b15801561195357600080fd5b505af1158015611967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198b91906130f3565b506040517f2f4f21e20000000000000000000000000000000000000000000000000000000081526000906001600160a01b03881690632f4f21e29061121c9088908890600401613a66565b816001600160a01b031663095ea7b36119ed611548565b836040518363ffffffff1660e01b8152600401611a0b929190613a66565b602060405180830381600087803b158015611a2557600080fd5b505af1158015611a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5d91906130f3565b505050565b6001600160a01b038516331480611a8157506001600160a01b03851630145b611a9d5760405162461bcd60e51b815260040161058690613e05565b60608167ffffffffffffffff81118015611ab657600080fd5b50604051908082528060200260200182016040528015611ae0578160200160208202803683370190505b50905060608267ffffffffffffffff81118015611afc57600080fd5b50604051908082528060200260200182016040528015611b26578160200160208202803683370190505b50905060005b83811015611c9657611b438585838181106106ab57fe5b611b5f5760405162461bcd60e51b815260040161058690613e73565b8551600090868684818110611b7057fe5b9050604002016000013581518110611b8457fe5b60200260200101519050866060015115611bd257611ba1816125ab565b848381518110611bad57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050611c8d565b611bdb816125ae565b611c6857611be8816125ab565b6001600160a01b03166370a08231896040518263ffffffff1660e01b8152600401611c13919061394a565b60206040518083038186803b158015611c2b57600080fd5b505afa158015611c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6391906136ea565b611c74565b876001600160a01b0316315b838381518110611c8057fe5b6020026020010181815250505b50600101611b2c565b50846060015115611d2d57611ca9611548565b6001600160a01b0316630f5a6efa87846040518363ffffffff1660e01b8152600401611cd6929190613982565b60006040518083038186803b158015611cee57600080fd5b505afa158015611d02573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d2a91908101906130b8565b90505b611d3b8886604001516125bb565b6040860152611d48611548565b6001600160a01b0316638bdb39138a8989896040518563ffffffff1660e01b8152600401611d799493929190613c56565b600060405180830381600087803b158015611d9357600080fd5b505af1158015611da7573d6000803e3d6000fd5b50606092508591505067ffffffffffffffff81118015611dc657600080fd5b50604051908082528060200260200182016040528015611df0578160200160208202803683370190505b509050856060015115611e8d57611e05611548565b6001600160a01b0316630f5a6efa88856040518363ffffffff1660e01b8152600401611e32929190613982565b60006040518083038186803b158015611e4a57600080fd5b505afa158015611e5e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e8691908101906130b8565b9050611f8b565b60005b84811015611f89578651600090878784818110611ea957fe5b9050604002016000013581518110611ebd57fe5b60200260200101519050611ed0816125ae565b611f5d57611edd816125ab565b6001600160a01b03166370a082318a6040518263ffffffff1660e01b8152600401611f08919061394a565b60206040518083038186803b158015611f2057600080fd5b505afa158015611f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5891906136ea565b611f69565b886001600160a01b0316315b838381518110611f7557fe5b602090810291909101015250600101611e90565b505b60005b8481101561153b57611fe8868683818110611fa557fe5b90506040020160200135610720858481518110611fbe57fe5b6020026020010151858581518110611fd257fe5b602002602001015161259590919063ffffffff16565b600101611f8e565b611ff982612341565b1561200a576120078261238c565b91505b6001600160a01b038416301461206d576001600160a01b03841633146120425760405162461bcd60e51b815260040161058690613e05565b61206d847f00000000000000000000000000000000000000000000000000000000000000008461244d565b6040517fde0e9a3e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063de0e9a3e906120d5908690600401613f35565b602060405180830381600087803b1580156120ef57600080fd5b505af1158015612103573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212791906136ea565b90506001600160a01b0384163014610a1c576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906109c89087908590600401613a66565b60005b8281101561223457338484838181106121b857fe5b905060a0020160600160208101906121d09190612e74565b6001600160a01b031614806122105750308484838181106121ed57fe5b905060a0020160600160208101906122059190612e74565b6001600160a01b0316145b61222c5760405162461bcd60e51b815260040161058690613e05565b6001016121a3565b5061223d611548565b6001600160a01b0316630e8e3e848285856040518463ffffffff1660e01b815260040161226b929190613b12565b6000604051808303818588803b15801561228457600080fd5b505af1158015610f41573d6000803e3d6000fd5b6122a182612341565b156122b2576122af8261238c565b91505b6001600160a01b03841630146122f5576001600160a01b03841633146122ea5760405162461bcd60e51b815260040161058690613e05565b6122f584868461244d565b6040517fba0876520000000000000000000000000000000000000000000000000000000081526000906001600160a01b0387169063ba08765290610ff290869088903090600401613f55565b7fba100000000000000000000000000000000000000000000000000000000000007fffff0000000000000000000000000000000000000000000000000000000000008216145b919050565b600080612398836125e2565b805460009091559392505050565b6123b5814710156101a3612638565b6000826001600160a01b0316826040516123ce906125ab565b60006040518083038185875af1925050503d806000811461240b576040519150601f19603f3d011682016040523d82523d6000602084013e612410565b606091505b50509050611a5d816101a4612638565b600061242b836125e2565b919091555050565b60008082136124455781600003612447565b815b92915050565b8061245757611a5d565b60408051600180825281830190925260609160208083019080368337019050509050828160008151811061248757fe5b6001600160a01b03929092166020928302919091019091015260408051600180825281830190925260609181602001602082028036833701905050905082816000815181106124d257fe5b602002602001018181525050610a3485838361264a565b606060006060846001600160a01b03168460405161250791906138fb565b6000604051808303816000865af19150503d8060008114612544576040519150601f19603f3d011682016040523d82523d6000602084013e612549565b606091505b50915091506125588282612784565b95945050505050565b60601c90565b6060600083801561257457fe5b141561258a57612583826127ae565b9050612447565b6124476101366127eb565b60006125a5838311156001612638565b50900390565b90565b6001600160a01b03161590565b606060008380156125c857fe5b14156125d7576125838261283e565b6124476101506127eb565b60006001827f000000000000000000000000000000000000000000000000000000000000000060405160200161261992919061393c565b60408051808303601f1901815291905280516020909101200392915050565b8161264657612646816127eb565b5050565b6060825167ffffffffffffffff8111801561266457600080fd5b5060405190808252806020026020018201604052801561269e57816020015b61268b612a58565b8152602001906001900390816126835790505b50905060005b8351811015612736576040805160a0810190915280600381526020018583815181106126cc57fe5b60200260200101516001600160a01b031681526020018483815181106126ee57fe5b60200260200101518152602001866001600160a01b03168152602001306001600160a01b031681525082828151811061272357fe5b60209081029190910101526001016126a4565b5061273f611548565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b815260040161276a9190613bc0565b600060405180830381600087803b15801561228457600080fd5b60608215612793575080612447565b8151156127a35781518083602001fd5b6124476101ae6127eb565b606060006127bb83612887565b905060018160038111156127cb57fe5b14156127e2576127da8361289d565b915050612387565b82915050612387565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6060600061284b83612887565b9050600081600381111561285b57fe5b141561286a576127da8361294b565b600181600381111561287857fe5b14156127e2576127da836129ae565b6000818060200190518101906124479190613429565b60608060006128ab84612a01565b915091506000805b83518110156129115760008482815181106128ca57fe5b602002602001015190506128dd81612341565b15612908576128eb8161238c565b8583815181106128f757fe5b602002602001018181525050600192505b506001016128b3565b508061291d5784612558565b6001838360405160200161293393929190613cca565b60405160208183030381529060405295945050505050565b606060008061295984612a24565b9150915061296682612341565b156129a4576129748261238c565b91506000828260405160200161298c93929190613ca9565b60405160208183030381529060405292505050612387565b8392505050612387565b606060006129bb83612a3b565b90506129c681612341565b156127e2576129d48161238c565b90506001816040516020016129ea929190613c92565b604051602081830303815290604052915050612387565b6060600082806020019051810190612a1991906134a8565b909590945092505050565b60008082806020019051810190612a199190613472565b600081806020019051810190612a519190613445565b9392505050565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b80356124478161400b565b60008083601f840112612aa4578182fd5b50813567ffffffffffffffff811115612abb578182fd5b6020830191508360208083028501011115612ad557600080fd5b9250929050565b600082601f830112612aec578081fd5b8135612aff612afa82613f9b565b613f74565b818152915060208083019084810181840286018201871015612b2057600080fd5b60005b84811015612b48578135612b368161400b565b84529282019290820190600101612b23565b505050505092915050565b600082601f830112612b63578081fd5b8135612b71612afa82613f9b565b818152915060208083019084810160005b84811015612b48578135870160a080601f19838c03011215612ba357600080fd5b612bac81613f74565b85830135815260408084013587830152606080850135828401526080915081850135818401525082840135925067ffffffffffffffff831115612bee57600080fd5b612bfc8c8885870101612d1e565b90820152865250509282019290820190600101612b82565b60008083601f840112612c25578182fd5b50813567ffffffffffffffff811115612c3c578182fd5b602083019150836020604083028501011115612ad557600080fd5b600082601f830112612c67578081fd5b8135612c75612afa82613f9b565b818152915060208083019084810181840286018201871015612c9657600080fd5b60005b84811015612b4857813584529282019290820190600101612c99565b600082601f830112612cc5578081fd5b8151612cd3612afa82613f9b565b818152915060208083019084810181840286018201871015612cf457600080fd5b60005b84811015612b4857815184529282019290820190600101612cf7565b803561244781614020565b600082601f830112612d2e578081fd5b813567ffffffffffffffff811115612d44578182fd5b612d576020601f19601f84011601613f74565b9150808252836020828501011115612d6e57600080fd5b8060208401602084013760009082016020015292915050565b80356001811061244757600080fd5b80356002811061244757600080fd5b600060808284031215612db6578081fd5b612dc06080613f74565b9050813567ffffffffffffffff80821115612dda57600080fd5b612de685838601612adc565b83526020840135915080821115612dfc57600080fd5b612e0885838601612c57565b60208401526040840135915080821115612e2157600080fd5b50612e2e84828501612d1e565b604083015250612e418360608401612d13565b606082015292915050565b600060808284031215612e5d578081fd5b50919050565b803560ff8116811461244757600080fd5b600060208284031215612e85578081fd5b8135612a518161400b565b600060208284031215612ea1578081fd5b8151612a518161400b565b60008060008060808587031215612ec1578283fd5b8435612ecc8161400b565b93506020850135612edc8161400b565b93969395505050506040820135916060013590565b60008060008060608587031215612f06578182fd5b8435612f118161400b565b93506020850135612f2181614020565b9250604085013567ffffffffffffffff80821115612f3d578384fd5b818701915087601f830112612f50578384fd5b813581811115612f5e578485fd5b886020828501011115612f6f578485fd5b95989497505060200194505050565b600080600060608486031215612f92578081fd5b8335612f9d8161400b565b95602085013595506040909401359392505050565b60006020808385031215612fc4578182fd5b825167ffffffffffffffff811115612fda578283fd5b8301601f81018513612fea578283fd5b8051612ff8612afa82613f9b565b8181528381019083850185840285018601891015613014578687fd5b8694505b83851015613036578051835260019490940193918501918501613018565b50979650505050505050565b600080600060408486031215613056578081fd5b833567ffffffffffffffff8082111561306d578283fd5b818601915086601f830112613080578283fd5b81358181111561308e578384fd5b87602060a0830285010111156130a2578384fd5b6020928301989097509590910135949350505050565b6000602082840312156130c9578081fd5b815167ffffffffffffffff8111156130df578182fd5b6130eb84828501612cb5565b949350505050565b600060208284031215613104578081fd5b8151612a5181614020565b600080600080600080600060c0888a031215613129578485fd5b8735965061313a8960208a01612d87565b9550604088013561314a8161400b565b9450606088013561315a8161400b565b9350608088013567ffffffffffffffff80821115613176578485fd5b6131828b838c01612da5565b945060a08a0135915080821115613197578384fd5b506131a48a828b01612c14565b989b979a50959850939692959293505050565b600080600080600080600060e0888a0312156131d1578081fd5b873596506131e28960208a01612d87565b955060408801356131f28161400b565b945060608801356132028161400b565b9350608088013567ffffffffffffffff81111561321d578182fd5b6132298a828b01612da5565b93505060a0880135915060c0880135905092959891949750929550565b600080600080600080600080610100898b031215613262578182fd5b883561326d8161400b565b9750602089013561327d8161400b565b96506040890135955060608901359450608089013561329b81614020565b93506132aa8a60a08b01612e63565b925060c0890135915060e089013590509295985092959890939650565b600080600080600080600060e0888a0312156132e1578081fd5b87356132ec8161400b565b965060208801356132fc8161400b565b955060408801359450606088013593506133198960808a01612e63565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215613347578182fd5b82356133528161400b565b946020939093013593505050565b600080600080600060a08688031215613377578283fd5b85356133828161400b565b945060208601356133928161400b565b935060408601356133a28161400b565b94979396509394606081013594506080013592915050565b60008060008060008060c087890312156133d2578384fd5b86356133dd8161400b565b955060208701356133ed8161400b565b945060408701356133fd8161400b565b935060608701359250608087013561341481614020565b8092505060a087013590509295509295509295565b60006020828403121561343a578081fd5b8151612a518161402e565b60008060408385031215613457578182fd5b82516134628161402e565b6020939093015192949293505050565b600080600060608486031215613486578081fd5b83516134918161402e565b602085015160409095015190969495509392505050565b6000806000606084860312156134bc578081fd5b83516134c78161402e565b602085015190935067ffffffffffffffff8111156134e3578182fd5b6134ef86828701612cb5565b925050604084015190509250925092565b60008060008060008060008060008060006101608c8e031215613521578485fd5b61352b8d8d612d96565b9a5067ffffffffffffffff8060208e01351115613546578586fd5b6135568e60208f01358f01612b53565b9a508060408e01351115613568578586fd5b6135788e60408f01358f01612a93565b909a50985061358a8e60608f01612e4c565b97508060e08e0135111561359c578586fd5b6135ac8e60e08f01358f01612a93565b90975095506101008d013594506101208d013593506101408d01358110156135d2578283fd5b506135e48d6101408e01358e01612c14565b81935080925050509295989b509295989b9093969950565b6000806000806000806101208789031215613615578384fd5b863567ffffffffffffffff8082111561362c578586fd5b9088019060c0828b03121561363f578586fd5b61364960c0613f74565b8235815261365a8b60208501612d96565b6020820152604083013561366d8161400b565b604082015261367f8b60608501612a88565b60608201526080830135608082015260a08301358281111561369f578788fd5b6136ab8c828601612d1e565b60a0830152508098505050506136c48860208901612e4c565b959895975050505060a08401359360c08101359360e08201359350610100909101359150565b6000602082840312156136fb578081fd5b5051919050565b60008060408385031215613714578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b60008284526020808501945082825b8581101561376f5781356137548161400b565b6001600160a01b031687529582019590820190600101613741565b509495945050505050565b60008284526020808501945082825b8581101561376f57813587529582019590820190600101613789565b6000815180845260208085019450808401835b8381101561376f578151875295820195908201906001016137b8565b15159052565b600081518084526137f2816020860160208601613fc8565b601f01601f19169290920160200192915050565b8051608080845281519084018190526000916020919082019060a0860190845b8181101561384b5783516001600160a01b031683529284019291840191600101613826565b50508285015191508581038387015261386481836137a5565b925050506040830151848203604086015261387f82826137da565b915050606083015161389460608601826137d4565b509392505050565b80356138a78161400b565b6001600160a01b0390811683526020820135906138c382614020565b90151560208401526040820135906138da8261400b565b16604083015260608101356138ee81614020565b8015156060840152505050565b6000825161390d818460208701613fc8565b9190910192915050565b60008451613929818460208901613fc8565b8201838582379092019182525092915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000604082016001600160a01b03808616845260206040818601528286518085526060870191508288019450855b818110156139ce5785518516835294830194918301916001016139b0565b509098975050505050505050565b6001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b6001600160a01b03949094168452602084019290925261ffff1660408301521515606082015260800190565b6020808252825182820181905260009190848201906040850190845b81811015613b0657835183529284019291840191600101613aea565b50909695505050505050565b6020808252818101839052600090604080840186845b87811015613bb3578135613b3b8161402e565b613b4481613ff4565b835281850135613b538161400b565b6001600160a01b03168386015281840135848401526060613b7681840184613fbb565b613b8282860182613725565b50506080613b9281840184613fbb565b613b9e82860182613725565b505060a0928301929190910190600101613b28565b5090979650505050505050565b602080825282518282018190526000919060409081850190868401855b82811015613c495781518051613bf281613ff4565b8552808701516001600160a01b0316878601528581015186860152606080820151613c1f82880182613725565b505060809081015190613c3486820183613725565b505060a0939093019290850190600101613bdd565b5091979650505050505050565b60008582526001600160a01b03808616602084015280851660408401525060806060830152613c886080830184613806565b9695505050505050565b60408101613c9f84613ff4565b9281526020015290565b60608101613cb685613ff4565b938152602081019290925260409091015290565b6000613cd585613ff4565b84825260606020830152613cec60608301856137a5565b9050826040830152949350505050565b6000610120808301613d0d8c614001565b8b84526020808501929092528a5190819052610140808501928281028601909101918c8201855b82811015613db4578785037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec00186528151805186528481015185870152604080820151908701526060808201519087015260809081015160a091870182905290613da0818801836137da565b978601979650505090830190600101613d34565b505050508381036040850152613dcb818a8c613732565b915050613ddb606084018861389c565b82810360e0840152613dee81868861377a565b915050826101008301529998505050505050505050565b60208082526010908201527f496e636f72726563742073656e64657200000000000000000000000000000000604082015260600190565b6020808252601f908201527f52656c617965722063616e206f6e6c7920617070726f766520697473656c6600604082015260600190565b60208082526019908201527f696e76616c696420636861696e6564207265666572656e636500000000000000604082015260600190565b600060e08252855160e08301526020860151613ec581614001565b61010083015260408601516001600160a01b03908116610120840152606087015116610140830152608086015161016083015260a086015160c0610180840152613f136101a08401826137da565b915050613f23602083018661389c565b60a082019390935260c0015292915050565b90815260200190565b9182526001600160a01b0316602082015260400190565b9283526001600160a01b03918216602084015216604082015260600190565b60405181810167ffffffffffffffff81118282101715613f9357600080fd5b604052919050565b600067ffffffffffffffff821115613fb1578081fd5b5060209081020190565b60008235612a518161400b565b60005b83811015613fe3578181015183820152602001613fcb565b8381111561052b5750506000910152565b60048110613ffe57fe5b50565b60028110613ffe57fe5b6001600160a01b0381168114613ffe57600080fd5b8015158114613ffe57600080fd5b60048110613ffe57600080fdfea264697066735822122025243bbdfb65ba86b5f803d93a3a51b76dfd9a870b570145fb0333e20f93cf5f64736f6c6343000701003360c060405234801561001057600080fd5b5060405161074f38038061074f83398101604081905261002f91610052565b60016000556001600160601b0319606092831b8116608052911b1660a0526100a3565b60008060408385031215610064578182fd5b825161006f8161008b565b60208401519092506100808161008b565b809150509250929050565b6001600160a01b03811681146100a057600080fd5b50565b60805160601c60a05160601c61067b6100d46000398060fc528061020f52508060585280610120525061067b6000f3fe6080604052600436106100385760003560e01c80637678922e146100885780638d928af8146100b3578063ac9650d8146100c857610083565b36610083576100813373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146102066100e8565b005b600080fd5b34801561009457600080fd5b5061009d6100fa565b6040516100aa91906104d6565b60405180910390f35b3480156100bf57600080fd5b5061009d61011e565b6100db6100d6366004610448565b610142565b6040516100aa91906104f7565b816100f6576100f68161026e565b5050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b606061014c6102db565b8167ffffffffffffffff8111801561016357600080fd5b5060405190808252806020026020018201604052801561019757816020015b60608152602001906001900390816101825790505b50905060005b82811015610257576102388484838181106101b457fe5b90506020028101906101c691906105ab565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929150506102f4565b82828151811061024457fe5b602090810291909101015260010161019d565b50610260610377565b61026861038b565b92915050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6102ed600260005414156101906100e8565b6002600055565b6060600060608473ffffffffffffffffffffffffffffffffffffffff168460405161031f91906104b7565b600060405180830381855af49150503d806000811461035a576040519150601f19603f3d011682016040523d82523d6000602084013e61035f565b606091505b509150915061036e8282610392565b95945050505050565b4780156103885761038833826103bc565b50565b6001600055565b606082156103a1575080610268565b8151156103b15781518083602001fd5b6102686101ae61026e565b6103cb814710156101a36100e8565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516103f1906104d3565b60006040518083038185875af1925050503d806000811461042e576040519150601f19603f3d011682016040523d82523d6000602084013e610433565b606091505b50509050610443816101a46100e8565b505050565b6000806020838503121561045a578182fd5b823567ffffffffffffffff80821115610471578384fd5b818501915085601f830112610484578384fd5b813581811115610492578485fd5b86602080830285010111156104a5578485fd5b60209290920196919550909350505050565b600082516104c9818460208701610615565b9190910192915050565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561059e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845281518051808752610561818989018a8501610615565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169590950186019450928501929085019060010161051c565b5092979650505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126105df578283fd5b83018035915067ffffffffffffffff8211156105f9578283fd5b60200191503681900382131561060e57600080fd5b9250929050565b60005b83811015610630578181015183820152602001610618565b8381111561063f576000848401525b5050505056fea26469706673582212207bec353e9208321ecbb5e97f79b940fc6df900afa85b759a6fc41b9c6709c0fe64736f6c63430007010033", + "deployedBytecode": "0x60806040526004361061016a5760003560e01c806380db15bd116100cb578063abf6d3991161007f578063db4c0e9111610059578063db4c0e9114610308578063ecc026371461031b578063efe691081461032e5761016a565b8063abf6d399146102c2578063b6d24737146102d5578063d80952d5146102f55761016a565b80638d928af8116100b05780638d928af8146102875780638fe4624f1461029c578063959fc17a146102af5761016a565b806380db15bd146102615780638d64cfbc146102745761016a565b8063433b0865116101225780636d307ea8116101075780636d307ea8146102195780637ab6e03c1461022c5780637fd0e5d51461023f5761016a565b8063433b0865146101f3578063611b90dd146102065761016a565b80631c982441116101535780631c982441146101ad5780632cbec84e146101c05780632e6272ea146101d35761016a565b80631089e5e31461016f5780631836944614610184575b600080fd5b61018261017d366004612f7e565b610341565b005b610197610192366004613500565b610531565b6040516101a49190613ace565b60405180910390f35b6101826101bb366004612eac565b61073e565b6101826101ce366004612f7e565b610a3b565b6101e66101e13660046135fc565b610b6f565b6040516101a49190613f35565b6101826102013660046133ba565b610c9c565b610182610214366004613360565b610f4b565b610182610227366004613360565b611066565b61018261023a3660046133ba565b611291565b34801561024b57600080fd5b506102546113a6565b6040516101a4919061394a565b61018261026f366004612ef1565b6113ca565b6101826102823660046132c7565b6114ce565b34801561029357600080fd5b50610254611548565b6101826102aa3660046131b7565b61156c565b6101826102bd366004613246565b6117a3565b6101826102d0366004613360565b611820565b3480156102e157600080fd5b506101826102f0366004613335565b6119d6565b61018261030336600461310f565b611a62565b610182610316366004612eac565b611ff0565b610182610329366004613042565b6121a0565b61018261033c366004613360565b612298565b61034a82612341565b1561035b576103588261238c565b91505b6040517fb0e389000000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b0e38900906103c3908690600401613f35565b60206040518083038186803b1580156103db57600080fd5b505afa1580156103ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041391906136ea565b90506104486001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016846123a6565b6001600160a01b0384163014610513576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906104bf9087908590600401613a66565b602060405180830381600087803b1580156104d957600080fd5b505af11580156104ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051191906130f3565b505b61051c82612341565b1561052b5761052b8282612420565b50505050565b60603361054160208a018a612e74565b6001600160a01b0316148061056a57503061055f60208a018a612e74565b6001600160a01b0316145b61058f5760405162461bcd60e51b815260040161058690613e05565b60405180910390fd5b60005b8b518110156105f45760008c82815181106105a957fe5b60200260200101516060015190506105c081612341565b156105eb576105ce8161238c565b8d83815181106105da57fe5b602002602001015160600181815250505b50600101610592565b5060606105ff611548565b6001600160a01b031663945bcec9868f8f8f8f8f8f8f8f6040518a63ffffffff1660e01b8152600401610639989796959493929190613cfc565b6000604051808303818588803b15801561065257600080fd5b505af1158015610666573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405261068f9190810190612fb2565b905060005b8381101561072d576106ba8585838181106106ab57fe5b90506040020160200135612341565b6106d65760405162461bcd60e51b815260040161058690613e73565b6107258585838181106106e557fe5b90506040020160200135610720848888868181106106ff57fe5b905060400201600001358151811061071357fe5b6020026020010151612433565b612420565b600101610694565b509c9b505050505050505050505050565b61074782612341565b15610758576107558261238c565b91505b6001600160a01b03841630146107bb576001600160a01b03841633146107905760405162461bcd60e51b815260040161058690613e05565b6107bb847f00000000000000000000000000000000000000000000000000000000000000008461244d565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b390610842907f0000000000000000000000000000000000000000000000000000000000000000908690600401613a66565b602060405180830381600087803b15801561085c57600080fd5b505af1158015610870573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089491906130f3565b506040517fea598cb00000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ea598cb0906108fd908690600401613f35565b602060405180830381600087803b15801561091757600080fd5b505af115801561092b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094f91906136ea565b90506001600160a01b0384163014610a1c576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906109c89087908590600401613a66565b602060405180830381600087803b1580156109e257600080fd5b505af11580156109f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1a91906130f3565b505b610a2582612341565b15610a3457610a348282612420565b5050505050565b610a4482612341565b15610a5557610a528261238c565b91505b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a1903eab84306040518363ffffffff1660e01b8152600401610aa4919061394a565b6020604051808303818588803b158015610abd57600080fd5b505af1158015610ad1573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610af691906136ea565b90506001600160a01b0384163014610513576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906104bf9087908590600401613a66565b600033610b7f6020880188612e74565b6001600160a01b03161480610ba8575030610b9d6020880188612e74565b6001600160a01b0316145b610bc45760405162461bcd60e51b815260040161058690613e05565b610bd18760800151612341565b15610be957610be3876080015161238c565b60808801525b6000610bf3611548565b6001600160a01b03166352bbbe29858a8a8a8a6040518663ffffffff1660e01b8152600401610c259493929190613eaa565b6020604051808303818588803b158015610c3e57600080fd5b505af1158015610c52573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610c7791906136ea565b9050610c8283612341565b15610c9157610c918382612420565b979650505050505050565b610ca583612341565b15610cb657610cb38361238c565b92505b600082610d3557866001600160a01b03166351c0e0616040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610cf857600080fd5b505af1158015610d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d309190612e90565b610da8565b866001600160a01b0316634800d97f6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610d7057600080fd5b505af1158015610d84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da89190612e90565b90506001600160a01b0386163014610ded576001600160a01b0386163314610de25760405162461bcd60e51b815260040161058690613e05565b610ded86828661244d565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b390610e34908a908890600401613a66565b602060405180830381600087803b158015610e4e57600080fd5b505af1158015610e62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8691906130f3565b506040517f2f2cab870000000000000000000000000000000000000000000000000000000081526000906001600160a01b03891690632f2cab8790610ed5908990899086908a90600401613aa2565b602060405180830381600087803b158015610eef57600080fd5b505af1158015610f03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2791906136ea565b9050610f3283612341565b15610f4157610f418382612420565b5050505050505050565b610f5482612341565b15610f6557610f628261238c565b91505b6001600160a01b0384163014610fa8576001600160a01b0384163314610f9d5760405162461bcd60e51b815260040161058690613e05565b610fa884868461244d565b6040517fea785a5e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b0387169063ea785a5e90610ff29087908790600401613a66565b602060405180830381600087803b15801561100c57600080fd5b505af1158015611020573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104491906136ea565b905061104f82612341565b1561105e5761105e8282612420565b505050505050565b61106f82612341565b156110805761107d8261238c565b91505b6000856001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110bb57600080fd5b505afa1580156110cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f39190612e90565b90506001600160a01b0385163014611138576001600160a01b038516331461112d5760405162461bcd60e51b815260040161058690613e05565b61113885828561244d565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b39061117f9089908790600401613a66565b602060405180830381600087803b15801561119957600080fd5b505af11580156111ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d191906130f3565b506040517f6e553f650000000000000000000000000000000000000000000000000000000081526000906001600160a01b03881690636e553f659061121c9087908990600401613f3e565b602060405180830381600087803b15801561123657600080fd5b505af115801561124a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126e91906136ea565b905061127983612341565b15611288576112888382612420565b50505050505050565b61129a83612341565b156112ab576112a88361238c565b92505b6001600160a01b03851630146112ee576001600160a01b03851633146112e35760405162461bcd60e51b815260040161058690613e05565b6112ee85878561244d565b6040517fead5d3590000000000000000000000000000000000000000000000000000000081526000906001600160a01b0388169063ead5d3599061133a90889088908890600401613a7f565b6040805180830381600087803b15801561135357600080fd5b505af1158015611367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138b9190613702565b91505061139782612341565b15611288576112888282612420565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b0384163014806113df575082155b6113fb5760405162461bcd60e51b815260040161058690613e3c565b606063fa6e671d60e01b33868660405160240161141a9392919061395e565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009095169490941790935251611489928691869101613917565b60408051601f19818403018152919052905061105e6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016826124e9565b866001600160a01b031663d505accf876114e6611548565b88888888886040518863ffffffff1660e01b815260040161150d9796959493929190613a25565b600060405180830381600087803b15801561152757600080fd5b505af115801561153b573d6000803e3d6000fd5b5050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b03851633148061158b57506001600160a01b03851630145b6115a75760405162461bcd60e51b815260040161058690613e05565b60006115b288612561565b905060006115bf83612341565b6115ca57600061165f565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038316906370a082319061160f90899060040161394a565b60206040518083038186803b15801561162757600080fd5b505afa15801561163b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165f91906136ea565b905061166f888660400151612567565b604086015261167c611548565b6001600160a01b031663b95cac28858b8a8a8a6040518663ffffffff1660e01b81526004016116ae9493929190613c56565b6000604051808303818588803b1580156116c757600080fd5b505af11580156116db573d6000803e3d6000fd5b50505050506116e983612341565b15611798576040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038416906370a0823190611736908a9060040161394a565b60206040518083038186803b15801561174e57600080fd5b505afa158015611762573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178691906136ea565b9050611796846107208385612595565b505b505050505050505050565b876001600160a01b0316638fcbaf0c886117bb611548565b8989898989896040518963ffffffff1660e01b81526004016117e49897969594939291906139dc565b600060405180830381600087803b1580156117fe57600080fd5b505af1158015611812573d6000803e3d6000fd5b505050505050505050505050565b61182982612341565b1561183a576118378261238c565b91505b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561187557600080fd5b505afa158015611889573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ad9190612e90565b90506001600160a01b03851630146118f2576001600160a01b03851633146118e75760405162461bcd60e51b815260040161058690613e05565b6118f285828561244d565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b3906119399089908790600401613a66565b602060405180830381600087803b15801561195357600080fd5b505af1158015611967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198b91906130f3565b506040517f2f4f21e20000000000000000000000000000000000000000000000000000000081526000906001600160a01b03881690632f4f21e29061121c9088908890600401613a66565b816001600160a01b031663095ea7b36119ed611548565b836040518363ffffffff1660e01b8152600401611a0b929190613a66565b602060405180830381600087803b158015611a2557600080fd5b505af1158015611a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5d91906130f3565b505050565b6001600160a01b038516331480611a8157506001600160a01b03851630145b611a9d5760405162461bcd60e51b815260040161058690613e05565b60608167ffffffffffffffff81118015611ab657600080fd5b50604051908082528060200260200182016040528015611ae0578160200160208202803683370190505b50905060608267ffffffffffffffff81118015611afc57600080fd5b50604051908082528060200260200182016040528015611b26578160200160208202803683370190505b50905060005b83811015611c9657611b438585838181106106ab57fe5b611b5f5760405162461bcd60e51b815260040161058690613e73565b8551600090868684818110611b7057fe5b9050604002016000013581518110611b8457fe5b60200260200101519050866060015115611bd257611ba1816125ab565b848381518110611bad57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050611c8d565b611bdb816125ae565b611c6857611be8816125ab565b6001600160a01b03166370a08231896040518263ffffffff1660e01b8152600401611c13919061394a565b60206040518083038186803b158015611c2b57600080fd5b505afa158015611c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6391906136ea565b611c74565b876001600160a01b0316315b838381518110611c8057fe5b6020026020010181815250505b50600101611b2c565b50846060015115611d2d57611ca9611548565b6001600160a01b0316630f5a6efa87846040518363ffffffff1660e01b8152600401611cd6929190613982565b60006040518083038186803b158015611cee57600080fd5b505afa158015611d02573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d2a91908101906130b8565b90505b611d3b8886604001516125bb565b6040860152611d48611548565b6001600160a01b0316638bdb39138a8989896040518563ffffffff1660e01b8152600401611d799493929190613c56565b600060405180830381600087803b158015611d9357600080fd5b505af1158015611da7573d6000803e3d6000fd5b50606092508591505067ffffffffffffffff81118015611dc657600080fd5b50604051908082528060200260200182016040528015611df0578160200160208202803683370190505b509050856060015115611e8d57611e05611548565b6001600160a01b0316630f5a6efa88856040518363ffffffff1660e01b8152600401611e32929190613982565b60006040518083038186803b158015611e4a57600080fd5b505afa158015611e5e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e8691908101906130b8565b9050611f8b565b60005b84811015611f89578651600090878784818110611ea957fe5b9050604002016000013581518110611ebd57fe5b60200260200101519050611ed0816125ae565b611f5d57611edd816125ab565b6001600160a01b03166370a082318a6040518263ffffffff1660e01b8152600401611f08919061394a565b60206040518083038186803b158015611f2057600080fd5b505afa158015611f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5891906136ea565b611f69565b886001600160a01b0316315b838381518110611f7557fe5b602090810291909101015250600101611e90565b505b60005b8481101561153b57611fe8868683818110611fa557fe5b90506040020160200135610720858481518110611fbe57fe5b6020026020010151858581518110611fd257fe5b602002602001015161259590919063ffffffff16565b600101611f8e565b611ff982612341565b1561200a576120078261238c565b91505b6001600160a01b038416301461206d576001600160a01b03841633146120425760405162461bcd60e51b815260040161058690613e05565b61206d847f00000000000000000000000000000000000000000000000000000000000000008461244d565b6040517fde0e9a3e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063de0e9a3e906120d5908690600401613f35565b602060405180830381600087803b1580156120ef57600080fd5b505af1158015612103573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212791906136ea565b90506001600160a01b0384163014610a1c576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906109c89087908590600401613a66565b60005b8281101561223457338484838181106121b857fe5b905060a0020160600160208101906121d09190612e74565b6001600160a01b031614806122105750308484838181106121ed57fe5b905060a0020160600160208101906122059190612e74565b6001600160a01b0316145b61222c5760405162461bcd60e51b815260040161058690613e05565b6001016121a3565b5061223d611548565b6001600160a01b0316630e8e3e848285856040518463ffffffff1660e01b815260040161226b929190613b12565b6000604051808303818588803b15801561228457600080fd5b505af1158015610f41573d6000803e3d6000fd5b6122a182612341565b156122b2576122af8261238c565b91505b6001600160a01b03841630146122f5576001600160a01b03841633146122ea5760405162461bcd60e51b815260040161058690613e05565b6122f584868461244d565b6040517fba0876520000000000000000000000000000000000000000000000000000000081526000906001600160a01b0387169063ba08765290610ff290869088903090600401613f55565b7fba100000000000000000000000000000000000000000000000000000000000007fffff0000000000000000000000000000000000000000000000000000000000008216145b919050565b600080612398836125e2565b805460009091559392505050565b6123b5814710156101a3612638565b6000826001600160a01b0316826040516123ce906125ab565b60006040518083038185875af1925050503d806000811461240b576040519150601f19603f3d011682016040523d82523d6000602084013e612410565b606091505b50509050611a5d816101a4612638565b600061242b836125e2565b919091555050565b60008082136124455781600003612447565b815b92915050565b8061245757611a5d565b60408051600180825281830190925260609160208083019080368337019050509050828160008151811061248757fe5b6001600160a01b03929092166020928302919091019091015260408051600180825281830190925260609181602001602082028036833701905050905082816000815181106124d257fe5b602002602001018181525050610a3485838361264a565b606060006060846001600160a01b03168460405161250791906138fb565b6000604051808303816000865af19150503d8060008114612544576040519150601f19603f3d011682016040523d82523d6000602084013e612549565b606091505b50915091506125588282612784565b95945050505050565b60601c90565b6060600083801561257457fe5b141561258a57612583826127ae565b9050612447565b6124476101366127eb565b60006125a5838311156001612638565b50900390565b90565b6001600160a01b03161590565b606060008380156125c857fe5b14156125d7576125838261283e565b6124476101506127eb565b60006001827f000000000000000000000000000000000000000000000000000000000000000060405160200161261992919061393c565b60408051808303601f1901815291905280516020909101200392915050565b8161264657612646816127eb565b5050565b6060825167ffffffffffffffff8111801561266457600080fd5b5060405190808252806020026020018201604052801561269e57816020015b61268b612a58565b8152602001906001900390816126835790505b50905060005b8351811015612736576040805160a0810190915280600381526020018583815181106126cc57fe5b60200260200101516001600160a01b031681526020018483815181106126ee57fe5b60200260200101518152602001866001600160a01b03168152602001306001600160a01b031681525082828151811061272357fe5b60209081029190910101526001016126a4565b5061273f611548565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b815260040161276a9190613bc0565b600060405180830381600087803b15801561228457600080fd5b60608215612793575080612447565b8151156127a35781518083602001fd5b6124476101ae6127eb565b606060006127bb83612887565b905060018160038111156127cb57fe5b14156127e2576127da8361289d565b915050612387565b82915050612387565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6060600061284b83612887565b9050600081600381111561285b57fe5b141561286a576127da8361294b565b600181600381111561287857fe5b14156127e2576127da836129ae565b6000818060200190518101906124479190613429565b60608060006128ab84612a01565b915091506000805b83518110156129115760008482815181106128ca57fe5b602002602001015190506128dd81612341565b15612908576128eb8161238c565b8583815181106128f757fe5b602002602001018181525050600192505b506001016128b3565b508061291d5784612558565b6001838360405160200161293393929190613cca565b60405160208183030381529060405295945050505050565b606060008061295984612a24565b9150915061296682612341565b156129a4576129748261238c565b91506000828260405160200161298c93929190613ca9565b60405160208183030381529060405292505050612387565b8392505050612387565b606060006129bb83612a3b565b90506129c681612341565b156127e2576129d48161238c565b90506001816040516020016129ea929190613c92565b604051602081830303815290604052915050612387565b6060600082806020019051810190612a1991906134a8565b909590945092505050565b60008082806020019051810190612a199190613472565b600081806020019051810190612a519190613445565b9392505050565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b80356124478161400b565b60008083601f840112612aa4578182fd5b50813567ffffffffffffffff811115612abb578182fd5b6020830191508360208083028501011115612ad557600080fd5b9250929050565b600082601f830112612aec578081fd5b8135612aff612afa82613f9b565b613f74565b818152915060208083019084810181840286018201871015612b2057600080fd5b60005b84811015612b48578135612b368161400b565b84529282019290820190600101612b23565b505050505092915050565b600082601f830112612b63578081fd5b8135612b71612afa82613f9b565b818152915060208083019084810160005b84811015612b48578135870160a080601f19838c03011215612ba357600080fd5b612bac81613f74565b85830135815260408084013587830152606080850135828401526080915081850135818401525082840135925067ffffffffffffffff831115612bee57600080fd5b612bfc8c8885870101612d1e565b90820152865250509282019290820190600101612b82565b60008083601f840112612c25578182fd5b50813567ffffffffffffffff811115612c3c578182fd5b602083019150836020604083028501011115612ad557600080fd5b600082601f830112612c67578081fd5b8135612c75612afa82613f9b565b818152915060208083019084810181840286018201871015612c9657600080fd5b60005b84811015612b4857813584529282019290820190600101612c99565b600082601f830112612cc5578081fd5b8151612cd3612afa82613f9b565b818152915060208083019084810181840286018201871015612cf457600080fd5b60005b84811015612b4857815184529282019290820190600101612cf7565b803561244781614020565b600082601f830112612d2e578081fd5b813567ffffffffffffffff811115612d44578182fd5b612d576020601f19601f84011601613f74565b9150808252836020828501011115612d6e57600080fd5b8060208401602084013760009082016020015292915050565b80356001811061244757600080fd5b80356002811061244757600080fd5b600060808284031215612db6578081fd5b612dc06080613f74565b9050813567ffffffffffffffff80821115612dda57600080fd5b612de685838601612adc565b83526020840135915080821115612dfc57600080fd5b612e0885838601612c57565b60208401526040840135915080821115612e2157600080fd5b50612e2e84828501612d1e565b604083015250612e418360608401612d13565b606082015292915050565b600060808284031215612e5d578081fd5b50919050565b803560ff8116811461244757600080fd5b600060208284031215612e85578081fd5b8135612a518161400b565b600060208284031215612ea1578081fd5b8151612a518161400b565b60008060008060808587031215612ec1578283fd5b8435612ecc8161400b565b93506020850135612edc8161400b565b93969395505050506040820135916060013590565b60008060008060608587031215612f06578182fd5b8435612f118161400b565b93506020850135612f2181614020565b9250604085013567ffffffffffffffff80821115612f3d578384fd5b818701915087601f830112612f50578384fd5b813581811115612f5e578485fd5b886020828501011115612f6f578485fd5b95989497505060200194505050565b600080600060608486031215612f92578081fd5b8335612f9d8161400b565b95602085013595506040909401359392505050565b60006020808385031215612fc4578182fd5b825167ffffffffffffffff811115612fda578283fd5b8301601f81018513612fea578283fd5b8051612ff8612afa82613f9b565b8181528381019083850185840285018601891015613014578687fd5b8694505b83851015613036578051835260019490940193918501918501613018565b50979650505050505050565b600080600060408486031215613056578081fd5b833567ffffffffffffffff8082111561306d578283fd5b818601915086601f830112613080578283fd5b81358181111561308e578384fd5b87602060a0830285010111156130a2578384fd5b6020928301989097509590910135949350505050565b6000602082840312156130c9578081fd5b815167ffffffffffffffff8111156130df578182fd5b6130eb84828501612cb5565b949350505050565b600060208284031215613104578081fd5b8151612a5181614020565b600080600080600080600060c0888a031215613129578485fd5b8735965061313a8960208a01612d87565b9550604088013561314a8161400b565b9450606088013561315a8161400b565b9350608088013567ffffffffffffffff80821115613176578485fd5b6131828b838c01612da5565b945060a08a0135915080821115613197578384fd5b506131a48a828b01612c14565b989b979a50959850939692959293505050565b600080600080600080600060e0888a0312156131d1578081fd5b873596506131e28960208a01612d87565b955060408801356131f28161400b565b945060608801356132028161400b565b9350608088013567ffffffffffffffff81111561321d578182fd5b6132298a828b01612da5565b93505060a0880135915060c0880135905092959891949750929550565b600080600080600080600080610100898b031215613262578182fd5b883561326d8161400b565b9750602089013561327d8161400b565b96506040890135955060608901359450608089013561329b81614020565b93506132aa8a60a08b01612e63565b925060c0890135915060e089013590509295985092959890939650565b600080600080600080600060e0888a0312156132e1578081fd5b87356132ec8161400b565b965060208801356132fc8161400b565b955060408801359450606088013593506133198960808a01612e63565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215613347578182fd5b82356133528161400b565b946020939093013593505050565b600080600080600060a08688031215613377578283fd5b85356133828161400b565b945060208601356133928161400b565b935060408601356133a28161400b565b94979396509394606081013594506080013592915050565b60008060008060008060c087890312156133d2578384fd5b86356133dd8161400b565b955060208701356133ed8161400b565b945060408701356133fd8161400b565b935060608701359250608087013561341481614020565b8092505060a087013590509295509295509295565b60006020828403121561343a578081fd5b8151612a518161402e565b60008060408385031215613457578182fd5b82516134628161402e565b6020939093015192949293505050565b600080600060608486031215613486578081fd5b83516134918161402e565b602085015160409095015190969495509392505050565b6000806000606084860312156134bc578081fd5b83516134c78161402e565b602085015190935067ffffffffffffffff8111156134e3578182fd5b6134ef86828701612cb5565b925050604084015190509250925092565b60008060008060008060008060008060006101608c8e031215613521578485fd5b61352b8d8d612d96565b9a5067ffffffffffffffff8060208e01351115613546578586fd5b6135568e60208f01358f01612b53565b9a508060408e01351115613568578586fd5b6135788e60408f01358f01612a93565b909a50985061358a8e60608f01612e4c565b97508060e08e0135111561359c578586fd5b6135ac8e60e08f01358f01612a93565b90975095506101008d013594506101208d013593506101408d01358110156135d2578283fd5b506135e48d6101408e01358e01612c14565b81935080925050509295989b509295989b9093969950565b6000806000806000806101208789031215613615578384fd5b863567ffffffffffffffff8082111561362c578586fd5b9088019060c0828b03121561363f578586fd5b61364960c0613f74565b8235815261365a8b60208501612d96565b6020820152604083013561366d8161400b565b604082015261367f8b60608501612a88565b60608201526080830135608082015260a08301358281111561369f578788fd5b6136ab8c828601612d1e565b60a0830152508098505050506136c48860208901612e4c565b959895975050505060a08401359360c08101359360e08201359350610100909101359150565b6000602082840312156136fb578081fd5b5051919050565b60008060408385031215613714578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b60008284526020808501945082825b8581101561376f5781356137548161400b565b6001600160a01b031687529582019590820190600101613741565b509495945050505050565b60008284526020808501945082825b8581101561376f57813587529582019590820190600101613789565b6000815180845260208085019450808401835b8381101561376f578151875295820195908201906001016137b8565b15159052565b600081518084526137f2816020860160208601613fc8565b601f01601f19169290920160200192915050565b8051608080845281519084018190526000916020919082019060a0860190845b8181101561384b5783516001600160a01b031683529284019291840191600101613826565b50508285015191508581038387015261386481836137a5565b925050506040830151848203604086015261387f82826137da565b915050606083015161389460608601826137d4565b509392505050565b80356138a78161400b565b6001600160a01b0390811683526020820135906138c382614020565b90151560208401526040820135906138da8261400b565b16604083015260608101356138ee81614020565b8015156060840152505050565b6000825161390d818460208701613fc8565b9190910192915050565b60008451613929818460208901613fc8565b8201838582379092019182525092915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000604082016001600160a01b03808616845260206040818601528286518085526060870191508288019450855b818110156139ce5785518516835294830194918301916001016139b0565b509098975050505050505050565b6001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b6001600160a01b03949094168452602084019290925261ffff1660408301521515606082015260800190565b6020808252825182820181905260009190848201906040850190845b81811015613b0657835183529284019291840191600101613aea565b50909695505050505050565b6020808252818101839052600090604080840186845b87811015613bb3578135613b3b8161402e565b613b4481613ff4565b835281850135613b538161400b565b6001600160a01b03168386015281840135848401526060613b7681840184613fbb565b613b8282860182613725565b50506080613b9281840184613fbb565b613b9e82860182613725565b505060a0928301929190910190600101613b28565b5090979650505050505050565b602080825282518282018190526000919060409081850190868401855b82811015613c495781518051613bf281613ff4565b8552808701516001600160a01b0316878601528581015186860152606080820151613c1f82880182613725565b505060809081015190613c3486820183613725565b505060a0939093019290850190600101613bdd565b5091979650505050505050565b60008582526001600160a01b03808616602084015280851660408401525060806060830152613c886080830184613806565b9695505050505050565b60408101613c9f84613ff4565b9281526020015290565b60608101613cb685613ff4565b938152602081019290925260409091015290565b6000613cd585613ff4565b84825260606020830152613cec60608301856137a5565b9050826040830152949350505050565b6000610120808301613d0d8c614001565b8b84526020808501929092528a5190819052610140808501928281028601909101918c8201855b82811015613db4578785037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec00186528151805186528481015185870152604080820151908701526060808201519087015260809081015160a091870182905290613da0818801836137da565b978601979650505090830190600101613d34565b505050508381036040850152613dcb818a8c613732565b915050613ddb606084018861389c565b82810360e0840152613dee81868861377a565b915050826101008301529998505050505050505050565b60208082526010908201527f496e636f72726563742073656e64657200000000000000000000000000000000604082015260600190565b6020808252601f908201527f52656c617965722063616e206f6e6c7920617070726f766520697473656c6600604082015260600190565b60208082526019908201527f696e76616c696420636861696e6564207265666572656e636500000000000000604082015260600190565b600060e08252855160e08301526020860151613ec581614001565b61010083015260408601516001600160a01b03908116610120840152606087015116610140830152608086015161016083015260a086015160c0610180840152613f136101a08401826137da565b915050613f23602083018661389c565b60a082019390935260c0015292915050565b90815260200190565b9182526001600160a01b0316602082015260400190565b9283526001600160a01b03918216602084015216604082015260600190565b60405181810167ffffffffffffffff81118282101715613f9357600080fd5b604052919050565b600067ffffffffffffffff821115613fb1578081fd5b5060209081020190565b60008235612a518161400b565b60005b83811015613fe3578181015183820152602001613fcb565b8381111561052b5750506000910152565b60048110613ffe57fe5b50565b60028110613ffe57fe5b6001600160a01b0381168114613ffe57600080fd5b8015158114613ffe57600080fd5b60048110613ffe57600080fdfea264697066735822122025243bbdfb65ba86b5f803d93a3a51b76dfd9a870b570145fb0333e20f93cf5f64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/index.ts b/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/index.ts new file mode 100644 index 0000000..4a0a28b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/index.ts @@ -0,0 +1,16 @@ +import { Task, TaskRunOptions } from '@src'; +import { BatchRelayerDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as BatchRelayerDeployment; + + const relayerLibraryArgs = [input.Vault, input.wstETH]; + const relayerLibrary = await task.deployAndVerify('BatchRelayerLibrary', relayerLibraryArgs, from, force); + + // The relayer library automatically also deploys the relayer itself: we must verify it + const relayer: string = await relayerLibrary.getEntrypoint(); + + const relayerArgs = [input.Vault, relayerLibrary.address]; // See BalancerRelayer's constructor + await task.verify('BalancerRelayer', relayer, relayerArgs); + await task.save({ BalancerRelayer: relayer }); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/input.ts b/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/input.ts new file mode 100644 index 0000000..a34f90c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/input.ts @@ -0,0 +1,28 @@ +import { Task, TaskMode } from '@src'; + +export type BatchRelayerDeployment = { + Vault: string; + wstETH: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, + // wstETH is only deployed on mainnet, kovan and goerli. + mainnet: { + wstETH: '0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0', + }, + kovan: { + wstETH: '0xa387b91e393cfb9356a460370842bc8dbb2f29af', + }, + polygon: { + wstETH: '0x0000000000000000000000000000000000000000', + }, + arbitrum: { + wstETH: '0x0000000000000000000000000000000000000000', + }, + goerli: { + wstETH: '0x6320cD32aA674d2898A68ec82e869385Fc5f7E2f', + }, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/output/arbitrum.json new file mode 100644 index 0000000..8e7cbc6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/output/arbitrum.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x1554ee754707D5C93b7934AF404747Aba521Aaf2", + "BalancerRelayer": "0x440eC9C8b78518D420E6fb6c6c838421F28BC280" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/output/goerli.json new file mode 100644 index 0000000..38b7cc8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/output/goerli.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x10aF508f3b0e067Dd5eA3149A003457F49C8bB69", + "BalancerRelayer": "0x12A39C1A0d17f354d02670961DEf678223Aa15Da" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/output/kovan.json b/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/output/kovan.json new file mode 100644 index 0000000..03e98ee --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/output/kovan.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x029FAC26e77e6f781B6A466ACf539C8bDf5e26c3", + "BalancerRelayer": "0xbC74ae15b2d7196729a0dFB1E3C38Dc97299C55b" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/output/mainnet.json new file mode 100644 index 0000000..d87972d --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0xd45369c11870e2057D5be17Cc106d32Ea416F7c4", + "BalancerRelayer": "0x51CC53375A8920aE54C0561E73a9d0423A74832e" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/output/polygon.json new file mode 100644 index 0000000..ec341b7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/output/polygon.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0xC4eD21Aa0Bec959ED7e4A83B2CD46dd00a0205dA", + "BalancerRelayer": "0xF537dDd7f4cc72C6C08866b62EAe9378f1F62da8" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/readme.md b/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/readme.md new file mode 100644 index 0000000..a95c991 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220318-batch-relayer-v2/readme.md @@ -0,0 +1,15 @@ +# 2022-03-18 - Batch Relayer V2 + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This relayer was deprecated in favor of an [updated version (also now deprecated)](../20220720-batch-relayer-v3) with more features. + +Deployment of the second `BalancerRelayer` using `BatchRelayerLibrary`, for combining multiple operations (swaps, joins, etc.) in a single transaction. This version focuses on adding new wrapping functionality for various types of linear pools. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`BatchRelayerLibrary` artifact](./artifact/BatchRelayerLibrary.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-gauge-adder/artifact/GaugeAdder.json b/balpy/balancer-deployments/tasks/deprecated/20220325-gauge-adder/artifact/GaugeAdder.json new file mode 100644 index 0000000..cb1f73c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-gauge-adder/artifact/GaugeAdder.json @@ -0,0 +1,255 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GaugeAdder", + "sourceName": "contracts/admin/GaugeAdder.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IGaugeController", + "name": "gaugeController", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IGaugeAdder.GaugeType", + "name": "gaugeType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "contract ILiquidityGaugeFactory", + "name": "gaugeFactory", + "type": "address" + } + ], + "name": "GaugeFactoryAdded", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "rootGauge", + "type": "address" + } + ], + "name": "addArbitrumGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStakingLiquidityGauge", + "name": "gauge", + "type": "address" + } + ], + "name": "addEthereumGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ILiquidityGaugeFactory", + "name": "factory", + "type": "address" + }, + { + "internalType": "enum IGaugeAdder.GaugeType", + "name": "gaugeType", + "type": "uint8" + } + ], + "name": "addGaugeFactory", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "rootGauge", + "type": "address" + } + ], + "name": "addPolygonGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizerAdaptor", + "outputs": [ + { + "internalType": "contract IAuthorizerAdaptor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IGaugeAdder.GaugeType", + "name": "gaugeType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getFactoryForGaugeType", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IGaugeAdder.GaugeType", + "name": "gaugeType", + "type": "uint8" + } + ], + "name": "getFactoryForGaugeTypeCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeController", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "pool", + "type": "address" + } + ], + "name": "getPoolGauge", + "outputs": [ + { + "internalType": "contract ILiquidityGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + }, + { + "internalType": "enum IGaugeAdder.GaugeType", + "name": "gaugeType", + "type": "uint8" + } + ], + "name": "isGaugeFromValidFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60e060405234801561001057600080fd5b506040516113783803806113788339818101604052602081101561003357600080fd5b50513060805260016000908155604080516303e1469160e61b815290516001600160a01b0384169163f851a440916004808301926020929190829003018186803b15801561008057600080fd5b505afa158015610094573d6000803e3d6000fd5b505050506040513d60208110156100aa57600080fd5b5051604080516311b2515f60e31b815290519192506001600160a01b03831691638d928af891600480820192602092909190829003018186803b1580156100f057600080fd5b505afa158015610104573d6000803e3d6000fd5b505050506040513d602081101561011a57600080fd5b5051606081811b6001600160601b031990811660a0529084901b1660c052600180546001600160a01b0319166001600160a01b039384161790556080519290821691166111e961018f60003980610366528061049d528061060a5280610cde52508061098b52508061091e52506111e96000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c8063a8ea68751161008c578063bf2972d511610066578063bf2972d514610290578063e758d36b146102c3578063f3d8b4cf146102cb578063f87fcfa2146102eb576100df565b8063a8ea687514610205578063aaabadc514610238578063abfca00914610240576100df565b80636440e973116100bd5780636440e97314610170578063851c1bb3146101ac5780638d928af8146101fd576100df565b806352854ed7146100e457806358de9ade146101335780635e45a2731461013b575b600080fd5b61010a600480360360408110156100fa57600080fd5b5060ff813516906020013561031e565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61010a610364565b61016e6004803603602081101561015157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610388565b005b61016e6004803603604081101561018657600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013560ff16610600565b6101eb600480360360208110156101c257600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016610918565b60408051918252519081900360200190f35b61010a610989565b61010a6004803603602081101561021b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166109ad565b61010a6109d8565b61027c6004803603604081101561025657600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013560ff16610a58565b604080519115158252519081900360200190f35b61016e600480360360208110156102a657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610b5f565b61010a610b75565b6101eb600480360360208110156102e157600080fd5b503560ff16610b91565b61016e6004803603602081101561030157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610bc4565b600061035b826002600086600481111561033457fe5b600481111561033f57fe5b8152602001908152602001600020610bd790919063ffffffff16565b90505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b610390610bf3565b60008173ffffffffffffffffffffffffffffffffffffffff166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b1580156103d857600080fd5b505afa1580156103ec573d6000803e3d6000fd5b505050506040513d602081101561040257600080fd5b505173ffffffffffffffffffffffffffffffffffffffff808216600090815260036020526040902054919250161561049b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4475706c69636174652067617567650000000000000000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561050157600080fd5b505afa158015610515573d6000803e3d6000fd5b505050506040513d602081101561052b57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff8281169116141561059e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061118d6027913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff818116600090815260036020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556105fc826002610c39565b5050565b610608610bf3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639fba03a16040518163ffffffff1660e01b815260040160206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b5051600f0b8160048111156106a957fe5b1061071557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e76616c696420676175676520747970650000000000000000000000000000604482015290519081900360640190fd5b604080517fce3cc8bd00000000000000000000000000000000000000000000000000000000815260006004820152905173ffffffffffffffffffffffffffffffffffffffff84169163ce3cc8bd916024808301926020929190829003018186803b15801561078257600080fd5b505afa158015610796573d6000803e3d6000fd5b505050506040513d60208110156107ac57600080fd5b50511561081a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f496e76616c696420666163746f727920696d706c656d656e746174696f6e0000604482015290519081900360640190fd5b60006002600083600481111561082c57fe5b600481111561083757fe5b8152602081019190915260400160002090506108538184610f54565b6108be57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f466163746f727920616c72656164792061646465640000000000000000000000604482015290519081900360640190fd5b8160048111156108ca57fe5b6040805173ffffffffffffffffffffffffffffffffffffffff8616815290517f39a43f795b6ee7259df4404784d3b77b09d09d5fee8454c3d641d48a888e188d9181900360200190a2505050565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600360205260409020541690565b60006109e2610989565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015610a2757600080fd5b505afa158015610a3b573d6000803e3d6000fd5b505050506040513d6020811015610a5157600080fd5b5051905090565b60008060026000846004811115610a6b57fe5b6004811115610a7657fe5b815260200190815260200160002090506000610a9182610fdc565b905060005b81811015610b5357610aa88382610fe0565b73ffffffffffffffffffffffffffffffffffffffff1663ce3cc8bd876040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610b0e57600080fd5b505afa158015610b22573d6000803e3d6000fd5b505050506040513d6020811015610b3857600080fd5b505115610b4b576001935050505061035e565b600101610a96565b50600095945050505050565b610b67610bf3565b610b72816004610c39565b50565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b600061035e60026000846004811115610ba657fe5b6004811115610bb157fe5b8152602001908152602001600020610fdc565b610bcc610bf3565b610b72816003610c39565b8154600090610be9908310606461101a565b61035b8383610fe0565b6000610c226000357fffffffff0000000000000000000000000000000000000000000000000000000016610918565b9050610b72610c318233611028565b61019161101a565b610c438282610a58565b610cae57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c696420676175676500000000000000000000000000000000000000604482015290519081900360640190fd5b60015460405173ffffffffffffffffffffffffffffffffffffffff84811660248301908152921691634036176a917f0000000000000000000000000000000000000000000000000000000000000000917f3a04f900000000000000000000000000000000000000000000000000000000009187918791604401826004811115610d3357fe5b81526040805180830381526020928301825291820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000978816178152815160e08a901b909716875273ffffffffffffffffffffffffffffffffffffffff881660048801908152602488019283528351604489015283519397909650919450606490910192509080838360005b83811015610df7578181015183820152602001610ddf565b50505050905090810190601f168015610e245780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b158015610e4457600080fd5b505af1158015610e58573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015610e9f57600080fd5b8101908080516040519392919084640100000000821115610ebf57600080fd5b908301906020820185811115610ed457600080fd5b8251640100000000811182820188101715610eee57600080fd5b82525081516020918201929091019080838360005b83811015610f1b578181015183820152602001610f03565b50505050905090810190601f168015610f485780820380516001836020036101000a031916815260200191505b50604052505050505050565b6000610f6083836110f1565b610fd457508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86169081179091558554908252828601909352604090209190915561035e565b50600061035e565b5490565b6000826000018281548110610ff157fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169392505050565b816105fc576105fc8161111f565b60006110326109d8565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b1580156110be57600080fd5b505afa1580156110d2573d6000803e3d6000fd5b505050506040513d60208110156110e857600080fd5b50519392505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001919091016020526040902054151590565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fdfe43616e6e6f742061646420676175676520666f722038302f32302042414c2d5745544820425054a2646970667358221220701f0e80282beec551605e201d9e186e8738d26040af7c013aa3672f7793950264736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100df5760003560e01c8063a8ea68751161008c578063bf2972d511610066578063bf2972d514610290578063e758d36b146102c3578063f3d8b4cf146102cb578063f87fcfa2146102eb576100df565b8063a8ea687514610205578063aaabadc514610238578063abfca00914610240576100df565b80636440e973116100bd5780636440e97314610170578063851c1bb3146101ac5780638d928af8146101fd576100df565b806352854ed7146100e457806358de9ade146101335780635e45a2731461013b575b600080fd5b61010a600480360360408110156100fa57600080fd5b5060ff813516906020013561031e565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61010a610364565b61016e6004803603602081101561015157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610388565b005b61016e6004803603604081101561018657600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013560ff16610600565b6101eb600480360360208110156101c257600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016610918565b60408051918252519081900360200190f35b61010a610989565b61010a6004803603602081101561021b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166109ad565b61010a6109d8565b61027c6004803603604081101561025657600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013560ff16610a58565b604080519115158252519081900360200190f35b61016e600480360360208110156102a657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610b5f565b61010a610b75565b6101eb600480360360208110156102e157600080fd5b503560ff16610b91565b61016e6004803603602081101561030157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610bc4565b600061035b826002600086600481111561033457fe5b600481111561033f57fe5b8152602001908152602001600020610bd790919063ffffffff16565b90505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b610390610bf3565b60008173ffffffffffffffffffffffffffffffffffffffff166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b1580156103d857600080fd5b505afa1580156103ec573d6000803e3d6000fd5b505050506040513d602081101561040257600080fd5b505173ffffffffffffffffffffffffffffffffffffffff808216600090815260036020526040902054919250161561049b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4475706c69636174652067617567650000000000000000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561050157600080fd5b505afa158015610515573d6000803e3d6000fd5b505050506040513d602081101561052b57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff8281169116141561059e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061118d6027913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff818116600090815260036020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556105fc826002610c39565b5050565b610608610bf3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639fba03a16040518163ffffffff1660e01b815260040160206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b5051600f0b8160048111156106a957fe5b1061071557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e76616c696420676175676520747970650000000000000000000000000000604482015290519081900360640190fd5b604080517fce3cc8bd00000000000000000000000000000000000000000000000000000000815260006004820152905173ffffffffffffffffffffffffffffffffffffffff84169163ce3cc8bd916024808301926020929190829003018186803b15801561078257600080fd5b505afa158015610796573d6000803e3d6000fd5b505050506040513d60208110156107ac57600080fd5b50511561081a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f496e76616c696420666163746f727920696d706c656d656e746174696f6e0000604482015290519081900360640190fd5b60006002600083600481111561082c57fe5b600481111561083757fe5b8152602081019190915260400160002090506108538184610f54565b6108be57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f466163746f727920616c72656164792061646465640000000000000000000000604482015290519081900360640190fd5b8160048111156108ca57fe5b6040805173ffffffffffffffffffffffffffffffffffffffff8616815290517f39a43f795b6ee7259df4404784d3b77b09d09d5fee8454c3d641d48a888e188d9181900360200190a2505050565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600360205260409020541690565b60006109e2610989565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015610a2757600080fd5b505afa158015610a3b573d6000803e3d6000fd5b505050506040513d6020811015610a5157600080fd5b5051905090565b60008060026000846004811115610a6b57fe5b6004811115610a7657fe5b815260200190815260200160002090506000610a9182610fdc565b905060005b81811015610b5357610aa88382610fe0565b73ffffffffffffffffffffffffffffffffffffffff1663ce3cc8bd876040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610b0e57600080fd5b505afa158015610b22573d6000803e3d6000fd5b505050506040513d6020811015610b3857600080fd5b505115610b4b576001935050505061035e565b600101610a96565b50600095945050505050565b610b67610bf3565b610b72816004610c39565b50565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b600061035e60026000846004811115610ba657fe5b6004811115610bb157fe5b8152602001908152602001600020610fdc565b610bcc610bf3565b610b72816003610c39565b8154600090610be9908310606461101a565b61035b8383610fe0565b6000610c226000357fffffffff0000000000000000000000000000000000000000000000000000000016610918565b9050610b72610c318233611028565b61019161101a565b610c438282610a58565b610cae57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c696420676175676500000000000000000000000000000000000000604482015290519081900360640190fd5b60015460405173ffffffffffffffffffffffffffffffffffffffff84811660248301908152921691634036176a917f0000000000000000000000000000000000000000000000000000000000000000917f3a04f900000000000000000000000000000000000000000000000000000000009187918791604401826004811115610d3357fe5b81526040805180830381526020928301825291820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000978816178152815160e08a901b909716875273ffffffffffffffffffffffffffffffffffffffff881660048801908152602488019283528351604489015283519397909650919450606490910192509080838360005b83811015610df7578181015183820152602001610ddf565b50505050905090810190601f168015610e245780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b158015610e4457600080fd5b505af1158015610e58573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015610e9f57600080fd5b8101908080516040519392919084640100000000821115610ebf57600080fd5b908301906020820185811115610ed457600080fd5b8251640100000000811182820188101715610eee57600080fd5b82525081516020918201929091019080838360005b83811015610f1b578181015183820152602001610f03565b50505050905090810190601f168015610f485780820380516001836020036101000a031916815260200191505b50604052505050505050565b6000610f6083836110f1565b610fd457508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86169081179091558554908252828601909352604090209190915561035e565b50600061035e565b5490565b6000826000018281548110610ff157fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169392505050565b816105fc576105fc8161111f565b60006110326109d8565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b1580156110be57600080fd5b505afa1580156110d2573d6000803e3d6000fd5b505050506040513d60208110156110e857600080fd5b50519392505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001919091016020526040902054151590565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fdfe43616e6e6f742061646420676175676520666f722038302f32302042414c2d5745544820425054a2646970667358221220701f0e80282beec551605e201d9e186e8738d26040af7c013aa3672f7793950264736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-gauge-adder/index.ts b/balpy/balancer-deployments/tasks/deprecated/20220325-gauge-adder/index.ts new file mode 100644 index 0000000..af443cb --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-gauge-adder/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { GaugeAdderDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as GaugeAdderDeployment; + + const gaugeAdderArgs = [input.GaugeController]; + await task.deployAndVerify('GaugeAdder', gaugeAdderArgs, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-gauge-adder/input.ts b/balpy/balancer-deployments/tasks/deprecated/20220325-gauge-adder/input.ts new file mode 100644 index 0000000..be3e61c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-gauge-adder/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type GaugeAdderDeployment = { + GaugeController: string; +}; + +const GaugeController = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); + +export default { + GaugeController, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-gauge-adder/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20220325-gauge-adder/output/goerli.json new file mode 100644 index 0000000..9644de7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-gauge-adder/output/goerli.json @@ -0,0 +1,3 @@ +{ + "GaugeAdder": "0x0Df18b22fB1DD4c1D4bfBF783A8acF0758979328" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-gauge-adder/output/kovan.json b/balpy/balancer-deployments/tasks/deprecated/20220325-gauge-adder/output/kovan.json new file mode 100644 index 0000000..2897ebe --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-gauge-adder/output/kovan.json @@ -0,0 +1,3 @@ +{ + "GaugeAdder": "0x1c99324EDC771c82A0DCCB780CC7DDA0045E50e7" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-gauge-adder/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20220325-gauge-adder/output/mainnet.json new file mode 100644 index 0000000..108b1af --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-gauge-adder/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "GaugeAdder": "0xEd5ba579bB5D516263ff6E1C10fcAc1040075Fe2" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-gauge-adder/readme.md b/balpy/balancer-deployments/tasks/deprecated/20220325-gauge-adder/readme.md new file mode 100644 index 0000000..595388b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-gauge-adder/readme.md @@ -0,0 +1,13 @@ +# 2022-03-25 - GaugeAdder + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This first version has been deprecated. Here is the [current version](../../20230519-gauge-adder-v4/). + +Deployment of the `GaugeAdder`, a helper contract which helps prevent some forms of improper configuration on the `GaugeController`. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`GaugeAdder` artifact](./artifact/GaugeAdder.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/artifact/LiquidityGaugeFactory.json b/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/artifact/LiquidityGaugeFactory.json new file mode 100644 index 0000000..11f298c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/artifact/LiquidityGaugeFactory.json @@ -0,0 +1,111 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "LiquidityGaugeFactory", + "sourceName": "contracts/gauges/ethereum/LiquidityGaugeFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract ILiquidityGauge", + "name": "gauge", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "gauge", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "GaugeCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeImplementation", + "outputs": [ + { + "internalType": "contract ILiquidityGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "getPoolGauge", + "outputs": [ + { + "internalType": "contract ILiquidityGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "isGaugeFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a060405234801561001057600080fd5b5060405161054b38038061054b83398101604081905261002f91610044565b60601b6001600160601b031916608052610072565b600060208284031215610055578081fd5b81516001600160a01b038116811461006b578182fd5b9392505050565b60805160601c6104b86100936000398060b7528061014a52506104b86000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806339312dee146100515780639ed933181461006f578063a8ea687514610082578063ce3cc8bd14610095575b600080fd5b6100596100b5565b60405161006691906103e8565b60405180910390f35b61005961007d3660046103ad565b6100d9565b6100596100903660046103ad565b6102aa565b6100a86100a33660046103ad565b6102d5565b6040516100669190610409565b7f000000000000000000000000000000000000000000000000000000000000000090565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526001602052604081205490911615610143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013a90610414565b60405180910390fd5b600061016e7f0000000000000000000000000000000000000000000000000000000000000000610300565b6040517fc4d66de800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063c4d66de8906101c39086906004016103e8565b600060405180830381600087803b1580156101dd57600080fd5b505af11580156101f1573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff81811660008181526020818152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091559488168084529490915280822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517fbc0aff029cf899fe358381e295caa21dd2e8c1a6607e2b9e6c7ec915db15bd539190a390505b919050565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600160205260409020541690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff81166102a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013a9061044b565b6000602082840312156103be578081fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146103e1578182fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b60208082526014908201527f476175676520616c726561647920657869737473000000000000000000000000604082015260600190565b60208082526016908201527f455243313136373a20637265617465206661696c65640000000000000000000060408201526060019056fea2646970667358221220c8bcb512d185826a523e34d12bfb4dfb477cb7c3a8e9a517795e546d6b434c8e64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806339312dee146100515780639ed933181461006f578063a8ea687514610082578063ce3cc8bd14610095575b600080fd5b6100596100b5565b60405161006691906103e8565b60405180910390f35b61005961007d3660046103ad565b6100d9565b6100596100903660046103ad565b6102aa565b6100a86100a33660046103ad565b6102d5565b6040516100669190610409565b7f000000000000000000000000000000000000000000000000000000000000000090565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526001602052604081205490911615610143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013a90610414565b60405180910390fd5b600061016e7f0000000000000000000000000000000000000000000000000000000000000000610300565b6040517fc4d66de800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063c4d66de8906101c39086906004016103e8565b600060405180830381600087803b1580156101dd57600080fd5b505af11580156101f1573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff81811660008181526020818152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091559488168084529490915280822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517fbc0aff029cf899fe358381e295caa21dd2e8c1a6607e2b9e6c7ec915db15bd539190a390505b919050565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600160205260409020541690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff81166102a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013a9061044b565b6000602082840312156103be578081fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146103e1578182fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b60208082526014908201527f476175676520616c726561647920657869737473000000000000000000000000604082015260600190565b60208082526016908201527f455243313136373a20637265617465206661696c65640000000000000000000060408201526060019056fea2646970667358221220c8bcb512d185826a523e34d12bfb4dfb477cb7c3a8e9a517795e546d6b434c8e64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/artifact/LiquidityGaugeV5.json b/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/artifact/LiquidityGaugeV5.json new file mode 100644 index 0000000..ba5651a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/artifact/LiquidityGaugeV5.json @@ -0,0 +1,1015 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "LiquidityGaugeV5", + "sourceName": "@balancer-labs/liquidity-mining/contracts/LiquidityGaugeV5.vy", + "abi": [ + { + "name": "Deposit", + "inputs": [ + { + "name": "provider", + "type": "address", + "indexed": true + }, + { + "name": "value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Withdraw", + "inputs": [ + { + "name": "provider", + "type": "address", + "indexed": true + }, + { + "name": "value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "UpdateLiquidityLimit", + "inputs": [ + { + "name": "user", + "type": "address", + "indexed": true + }, + { + "name": "original_balance", + "type": "uint256", + "indexed": false + }, + { + "name": "original_supply", + "type": "uint256", + "indexed": false + }, + { + "name": "working_balance", + "type": "uint256", + "indexed": false + }, + { + "name": "working_supply", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Transfer", + "inputs": [ + { + "name": "_from", + "type": "address", + "indexed": true + }, + { + "name": "_to", + "type": "address", + "indexed": true + }, + { + "name": "_value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Approval", + "inputs": [ + { + "name": "_owner", + "type": "address", + "indexed": true + }, + { + "name": "_spender", + "type": "address", + "indexed": true + }, + { + "name": "_value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "RewardDistributorUpdated", + "inputs": [ + { + "name": "reward_token", + "type": "address", + "indexed": true + }, + { + "name": "distributor", + "type": "address", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "stateMutability": "nonpayable", + "type": "constructor", + "inputs": [ + { + "name": "minter", + "type": "address" + }, + { + "name": "veBoostProxy", + "type": "address" + }, + { + "name": "authorizerAdaptor", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit", + "inputs": [ + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit", + "inputs": [ + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_addr", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit", + "inputs": [ + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_addr", + "type": "address" + }, + { + "name": "_claim_rewards", + "type": "bool" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "withdraw", + "inputs": [ + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "withdraw", + "inputs": [ + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_claim_rewards", + "type": "bool" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claim_rewards", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claim_rewards", + "inputs": [ + { + "name": "_addr", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claim_rewards", + "inputs": [ + { + "name": "_addr", + "type": "address" + }, + { + "name": "_receiver", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "transfer", + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "permit", + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_deadline", + "type": "uint256" + }, + { + "name": "_v", + "type": "uint8" + }, + { + "name": "_r", + "type": "bytes32" + }, + { + "name": "_s", + "type": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "increaseAllowance", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_added_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "decreaseAllowance", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_subtracted_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "user_checkpoint", + "inputs": [ + { + "name": "addr", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "set_rewards_receiver", + "inputs": [ + { + "name": "_receiver", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "kick", + "inputs": [ + { + "name": "addr", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit_reward_token", + "inputs": [ + { + "name": "_reward_token", + "type": "address" + }, + { + "name": "_amount", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "add_reward", + "inputs": [ + { + "name": "_reward_token", + "type": "address" + }, + { + "name": "_distributor", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "set_reward_distributor", + "inputs": [ + { + "name": "_reward_token", + "type": "address" + }, + { + "name": "_distributor", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "killGauge", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "unkillGauge", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "claimed_reward", + "inputs": [ + { + "name": "_addr", + "type": "address" + }, + { + "name": "_token", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "claimable_reward", + "inputs": [ + { + "name": "_user", + "type": "address" + }, + { + "name": "_reward_token", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claimable_tokens", + "inputs": [ + { + "name": "addr", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_checkpoint", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "future_epoch_time", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "inflation_rate", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "decimals", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "version", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "allowance", + "inputs": [ + { + "name": "owner", + "type": "address" + }, + { + "name": "spender", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "_lp_token", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "DOMAIN_SEPARATOR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "nonces", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "lp_token", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "is_killed", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_count", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_data", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "components": [ + { + "name": "token", + "type": "address" + }, + { + "name": "distributor", + "type": "address" + }, + { + "name": "period_finish", + "type": "uint256" + }, + { + "name": "rate", + "type": "uint256" + }, + { + "name": "last_update", + "type": "uint256" + }, + { + "name": "integral", + "type": "uint256" + } + ] + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "rewards_receiver", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_integral_for", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "working_balances", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "working_supply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_inv_supply_of", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_checkpoint_of", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_fraction", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "period", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "int128" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_tokens", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "period_timestamp", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_inv_supply", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + } + ], + "bytecode": "0x6020612dc46080396080518060a01c612dbf5760e05260206020612dc4016080396080518060a01c612dbf576101005260206040612dc4016080396080518060a01c612dbf57610120526358de9ade610160526020610160600461017c60e0515afa610070573d600060003e3d6000fd5b601f3d1115612dbf57610160518060a01c612dbf576101405263e6dec36f610180526020610180600461019c60e0515afa6100b0573d600060003e3d6000fd5b601f3d1115612dbf57610180518060a01c612dbf57610160526101605161018052638d928af86101a05260206101a060046101bc610160515afa6100f9573d600060003e3d6000fd5b601f3d1115612dbf576101a0518060a01c612dbf576101e052610120516101a052610140516101c05260e0516102005263dfe05031610220526020610220600461023c610140515afa610151573d600060003e3d6000fd5b601f3d1115612dbf57610220518060a01c612dbf5761026052610100516102205261dead600c55612d5b56600436101561000d57611e2f565b60046000601c3760005134612bd95763b6b55f258118610037573361040052600061042052610086565b636e553f65811861005c576024358060a01c612bd95761040052600061042052610086565b6383df67478118610220576024358060a01c612bd957610400526044358060011c612bd957610420525b600054612bd95760016000556104005160e0526100a1611e99565b6000600435146101b3576000600f541415610440526002546104605261044051156100eb576104005160e052610460516101005261042051610120526000610140526100eb61243a565b61046080516004358181830110612bd9578082019050905081525060016104005160a0526080526040608020546004358181830110612bd95780820190509050610480526104805160016104005160a052608052604060802055610460516002556104005160e0526104805161010052610460516101205261016b612867565b6323b872dd6104a052336104c052306104e0526004356105005260206104a060646104bc6000600c545af16101a5573d600060003e3d6000fd5b601f3d1115612bd9576104a0505b610400517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c600435610440526020610440a26104005160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600435610440526020610440a36000600055005b632e1a7d4d811861023657600061040052610251565b6338d0743681186103cd576024358060011c612bd957610400525b600054612bd95760016000553360e052610269611e99565b600060043514610366576000600f541415610420526002546104405261042051156102b0573360e052610440516101005261040051610120526000610140526102b061243a565b6104408051600435808210612bd9578082039050905081525060013360a052608052604060802054600435808210612bd95780820390509050610460526104605160013360a052608052604060802055610440516002553360e05261046051610100526104405161012052610323612867565b63a9059cbb61048052336104a0526004356104c0526020610480604461049c6000600c545af1610358573d600060003e3d6000fd5b601f3d1115612bd957610480505b337f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364600435610420526020610420a26000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600435610420526020610420a36000600055005b63e6f1daf281186103e8573361040052600061042052610437565b6384e9bd7e811861040d576004358060a01c612bd95761040052600061042052610437565b639faceb1b8118610484576004358060a01c612bd957610400526024358060a01c612bd957610420525b600054612bd95760016000556000610420511461045957336104005118612bd9575b6104005160e05260025461010052600161012052610420516101405261047d61243a565b6000600055005b6323b872dd8118610567576004358060a01c612bd9576104c0526024358060a01c612bd9576104e052600054612bd95760016000556104c05160e05233610100526104d0610520611e35565b61052051610500527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61050051146105365761050051604435808210612bd9578082039050905060036104c05160a05260805260406080203360a0526080526040608020555b6104c051610400526104e0516104205260443561044052610555612a51565b60016105205260206105206000600055f35b63a9059cbb81186105bb576004358060a01c612bd9576104c052600054612bd957600160005533610400526104c05161042052602435610440526105a9612a51565b60016104e05260206104e06000600055f35b63095ea7b38118610633576004358060a01c612bd95760e05260243560033360a052608052604060802060e05160a05260805260406080205560e051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602435610100526020610100a36001610100526020610100f35b63d505accf81186109a0576004358060a01c612bd95760e0526024358060a01c612bd957610100526084358060081c612bd95761012052600060e05114612bd9576064354211612bd957600b60e05160a0526080526040608020546101405260006002610400527f1901000000000000000000000000000000000000000000000000000000000000610420526104006002806020846106000101826020850160045afa505080518201915050600a546020826106000101526020810190507f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96105405260e0516105605261010051610580526044356105a052610140516105c0526064356105e05260c0610520526105208051602082012090506020826106000101526020810190508061060052610600905080516020820120905061016052600060e0513b116107b45760e0516101605161018052610120516101a052604060a46101c03760206080608061018060015afa5060805118612bd957610914565b600060a4356102205260c435610240526040610200526102006040806020846102c00101826020850160045afa505080518201915050601f60016020820661026001602082840111612bd9576020806102808261012060045afa5050818152905090506001806020846102c00101826020850160045afa505080518201915050806102c0526102c09050805160200180610180828460045afa905050507f1626ba7e00000000000000000000000000000000000000000000000000000000631626ba7e610200526102208060406101605182526020820191508082528083018061018080516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810150505050602061020060c461021c60e0515afa610901573d600060003e3d6000fd5b601f3d1115612bd9576102005118612bd9575b604435600360e05160a05260805260406080206101005160a0526080526040608020556101405160018181830110612bd95780820190509050600b60e05160a0526080526040608020556101005160e0517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925604435610180526020610180a36001610180526020610180f35b63395093518118610a4f576004358060a01c612bd957610120523360e05261012051610100526109d1610160611e35565b610160516024358181830110612bd95780820190509050610140526101405160033360a05260805260406080206101205160a05260805260406080205561012051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92561014051610160526020610160a36001610160526020610160f35b63a457c2d78118610afc576004358060a01c612bd957610120523360e0526101205161010052610a80610160611e35565b61016051602435808210612bd95780820390509050610140526101405160033360a05260805260406080206101205160a05260805260406080205561012051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92561014051610160526020610160a36001610160526020610160f35b634b8200938118610bc0576004358060a01c612bd9576103005261030051610340526020606038036080396080516103605260006103205261032060c060006002818352015b60c05160200261034001513318610b5c5760018352610b6c565b8151600101808352811415610b42575b5050506103205115612bd9576103005160e052610b87611e99565b6103005160e05260016103005160a0526080526040608020546101005260025461012052610bb3612867565b6001610320526020610320f35b63bdf981168118610bed576004358060a01c612bd95760e05260e05160113360a052608052604060802055005b6396c551758118610d9d576004358060a01c612bd9576103005260176103005160a0526080526040608020546103205263da020a186103a052610300516103c05263010ae7576103605261030051610380526020610360602461037c6020604038036080396080515afa610c66573d600060003e3d6000fd5b601f3d1115612bd957610360516103e05260206103a060446103bc6020604038036080396080515afa610c9e573d600060003e3d6000fd5b601f3d1115612bd9576103a0516103405260016103005160a052608052604060802054610360526370a082316103c052610300516103e05260206103c060246103dc6020604038036080396080515afa610cfd573d600060003e3d6000fd5b601f3d1115612bd9576103c05115610d1d57610320516103405111610d20565b60015b15612bd957610360516028808202821582848304141715612bd9579050905060648082049050905060146103005160a0526080526040608020541115612bd9576103005160e052610d6f611e99565b6103005160e05260016103005160a0526080526040608020546101005260025461012052610d9b612867565b005b6393f7aa678118610faf576004358060a01c612bd95761040052600054612bd9576001600055600160106104005160a052608052604060802001543318612bd957600060e05260025461010052600061012052600061014052610dfe61243a565b6323b872dd6104645260043361048452306104a4526024356104c45260600161046052610460506020610520610460516104806000610400515af1610e48573d600060003e3d6000fd5b61050060203d808211610e5b5781610e5d565b805b905090508152805160200180610420828460045afa9050505060006104205114610e9c57610440516104205181816020036008021c9050905015612bd9575b600260106104005160a052608052604060802001546104605261046051421015610f44576104605142808210612bd957808203905090506104805261048051600360106104005160a05260805260406080200154808202821582848304141715612bd957905090506104a0526024356104a0518181830110612bd9578082019050905062093a8080820490509050600360106104005160a05260805260406080200155610f68565b60243562093a8080820490509050600360106104005160a052608052604060802001555b42600460106104005160a052608052604060802001554262093a808181830110612bd95780820190509050600260106104005160a052608052604060802001556000600055005b63e8de0d4d811861109b576004358060a01c612bd95760e0526024358060a01c612bd9576101005260006101005114612bd957602060a038036080396080513318612bd957600f54610120526008610120511015612bd9576001601060e05160a05260805260406080200154612bd957610100516001601060e05160a0526080526040608020015560e0516001610120516008811015612bd95702601a01556101205160018181830110612bd95780820190509050600f5560e0517f1df95772db25c427e0df149fe4cd5b7c2e970e096ee7305ff86f6e1167281d7b61010051610140526020610140a2005b63058a3a248118611162576004358060a01c612bd95760e0526024358060a01c612bd957610100526001601060e05160a05260805260406080200154610120526101205133186110ec5760016110fb565b602060a0380360803960805133145b15612bd95760006101205114612bd95760006101005114612bd957610100516001601060e05160a0526080526040608020015560e0517f1df95772db25c427e0df149fe4cd5b7c2e970e096ee7305ff86f6e1167281d7b61010051610140526020610140a2005b63ab8f0945811861118657602060a038036080396080513318612bd9576001600d55005b63d34fb26781186111aa57602060a038036080396080513318612bd9576000600d55005b63e77e74378118611216576004358060a01c612bd95760e0526024358060a01c612bd95761010052601360e05160a05260805260406080206101005160a05260805260406080205470010000000000000000000000000000000080820690509050610120526020610120f35b6333fd6f7481186113ea576004358060a01c612bd95760e0526024358060a01c612bd95761010052600560106101005160a052608052604060802001546101205260025461014052600061014051146113355742600260106101005160a0526080526040608020015480821161128c578161128e565b805b905090506101605261016051600460106101005160a05260805260406080200154808210612bd9578082039050905061018052610120805161018051600360106101005160a05260805260406080200154808202821582848304141715612bd95790509050670de0b6b3a7640000808202821582848304141715612bd9579050905061014051808015612bd9578204905090508181830110612bd957808201905090508152505b60126101005160a052608052604060802060e05160a05260805260406080205461016052600160e05160a0526080526040608020546101205161016051808210612bd95780820390509050808202821582848304141715612bd95790509050670de0b6b3a76400008082049050905061018052601360e05160a05260805260406080206101005160a05260805260406080205460801c610180518181830110612bd957808201905090506101a05260206101a0f35b63331345838118611488576004358060a01c612bd957610300526103005160e052611413611e99565b60186103005160a052608052604060802054638b752bb061032052610300516103405230610360526020610320604461033c6020606038036080396080515afa611462573d600060003e3d6000fd5b601f3d1115612bd95761032051808210612bd95780820390509050610380526020610380f35b63d31f3f6d81186114bb5760016019546c01431e0fae6d7217caa0000000811015612bd957026022015460e052602060e0f35b63be5d1be981186114d557600e5460d81c60e052602060e0f35b63180692d0811861151057600e547b010000000000000000000000000000000000000000000000000000008082069050905060e052602060e0f35b63313ce567811861152657601260e052602060e0f35b6354fd4d5081186115c057610120806020808252600660e0527f76352e302e3000000000000000000000000000000000000000000000000000006101005260e0818401808280516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f82010390509050905090508101905090509050610120f35b63dd62ed3e8118611612576004358060a01c612bd957610120526024358060a01c612bd957610140526101205160e0526101405161010052611603610160611e35565b61016051610180526020610180f35b63c4d66de88118611983576004358060a01c612bd95760e052600c54612bd95760e051600c556395d89b41610140526060610140600461015c60e0515afa61165f573d600060003e3d6000fd5b603f3d1115612bd95761014051610140016020815111612bd95780805160200180610100828460045afa905090505050600060096101a0527f42616c616e6365722000000000000000000000000000000000000000000000006101c0526101a06009806020846102200101826020850160045afa5050805182019150506101006020806020846102200101826020850160045afa505080518201915050600e6101e0527f204761756765204465706f736974000000000000000000000000000000000000610200526101e0600e806020846102200101826020850160045afa50508051820191505080610220526102209050805160200180610140828460045afa90505050610140806004602082510160c060006003818352015b8260c051602002111561178c576117ab565b60c05160200285015160c051850155815160010180835281141561177a575b50505050505060006101006020806020846101e00101826020850160045afa50508051820191505060066101a0527f2d676175676500000000000000000000000000000000000000000000000000006101c0526101a06006806020846101e00101826020850160045afa505080518201915050806101e0526101e09050806007602082510160c060006003818352015b8260c051602002111561184d5761186c565b60c05160200285015160c051850155815160010180835281141561183b575b5050505050507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610280526101408051602082012090506102a0527f572f01d824885a118d5d21c74542f263b131d2897955c62a721594f1d7c3b2e26102c052466102e052306103005260a061026052610260805160208201209050600a554260225563b26b238e6101a05260206101a060046101bc6000602060e038036080396080515af1611921573d600060003e3d6000fd5b601f3d1115612bd9576101a05160d81b632c4e722e6101e05260206101e060046101fc602060e038036080396080515afa611961573d600060003e3d6000fd5b601f3d1115612bd9576101e0518181830110612bd95780820190509050600e55005b6370a0823181186119b8576004358060a01c612bd95760e052600160e05160a052608052604060802054610100526020610100f35b6318160ddd81186119cf5760025460e052602060e0f35b6306fdde038118611a725760e08060208082528083018060048082602082540160c060006003818352015b8260c0516020021115611a0c57611a2b565b60c05185015460c05160200285015281516001018083528114156119fa575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810190509050905060e0f35b6395d89b418118611b155760e08060208082528083018060078082602082540160c060006003818352015b8260c0516020021115611aaf57611ace565b60c05185015460c0516020028501528151600101808352811415611a9d575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810190509050905060e0f35b633644e5158118611b2c57600a5460e052602060e0f35b637ecebe008118611b61576004358060a01c612bd95760e052600b60e05160a052608052604060802054610100526020610100f35b6382c630668118611b7857600c5460e052602060e0f35b639c868ac08118611b8f57600d5460e052602060e0f35b63963c94b98118611ba657600f5460e052602060e0f35b6348e9c65e8118611c0a576004358060a01c612bd95760e052601060e05160a052608052604060802080546101005260018101546101205260028101546101405260038101546101605260048101546101805260058101546101a0525060c0610100f35b6301ddabf18118611c3f576004358060a01c612bd95760e052601160e05160a052608052604060802054610100526020610100f35b63f05cc0588118611c92576004358060a01c612bd95760e0526024358060a01c612bd95761010052601260e05160a05260805260406080206101005160a052608052604060802054610120526020610120f35b6313ecb1ca8118611cc7576004358060a01c612bd95760e052601460e05160a052608052604060802054610100526020610100f35b6317e280898118611cde5760155460e052602060e0f35b63de263bfa8118611d13576004358060a01c612bd95760e052601660e05160a052608052604060802054610100526020610100f35b639bd324f28118611d48576004358060a01c612bd95760e052601760e05160a052608052604060802054610100526020610100f35b63094007078118611d7d576004358060a01c612bd95760e052601860e05160a052608052604060802054610100526020610100f35b63ef78d4fd8118611d945760195460e052602060e0f35b6354c49fe98118611dbb5760016004356008811015612bd95702601a015460e052602060e0f35b637598108c8118611dee5760016004356c01431e0fae6d7217caa0000000811015612bd957026022015460e052602060e0f35b63fec8ee0c8118611e2d5760016004356c01431e0fae6d7217caa0000000811015612bd957026c01431e0fae6d72100000000022015460e052602060e0f35b505b60006000fd5b602060c038036080396080516101005118611e73577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815250611e97565b600360e05160a05260805260406080206101005160a0526080526040608020548152505b565b601954610100526001610100516c01431e0fae6d7217caa0000000811015612bd9570260220154610120526001610100516c01431e0fae6d7217caa0000000811015612bd957026c01431e0fae6d72100000000022015461014052600e5461016052610160517b0100000000000000000000000000000000000000000000000000000080820690509050610180526101605160d81c6101a052610180516101c052610120516101a05110611fe257632c4e722e6101e05260206101e060046101fc602060e038036080396080515afa611f77573d600060003e3d6000fd5b601f3d1115612bd9576101e0516101c05263b26b238e6101e05260206101e060046101fc6000602060e038036080396080515af1611fba573d600060003e3d6000fd5b601f3d1115612bd9576101e05160d81b6101c0518181830110612bd95780820190509050600e555b600d5415611ff75760006101805260006101c0525b61012051421115612316576015546101e05263615e52376102005230610220526020608038036080396080513b15612bd95760006000602461021c60006020608038036080396080515af1612051573d600060003e3d6000fd5b61012051610200526101205162093a808181830110612bd9578082019050905062093a808082049050905062093a80808202821582848304141715612bd95790509050428082116120a257816120a4565b805b905090506102205261024060006101f4818352015b6102205161020051808210612bd957808203905090506102605263d3078c946102a052306102c0526102005162093a808082049050905062093a80808202821582848304141715612bd957905090506102e05260206102a060446102bc6020608038036080396080515afa612133573d600060003e3d6000fd5b601f3d1115612bd9576102a0516102805260006101e05111156122bc57610200516101a051101561216557600061216f565b610220516101a051105b6121d55761014080516101805161028051808202821582848304141715612bd9579050905061026051808202821582848304141715612bd957905090506101e051808015612bd9578204905090508181830110612bd957808201905090508152506122bc565b61014080516101805161028051808202821582848304141715612bd957905090506101a05161020051808210612bd95780820390509050808202821582848304141715612bd957905090506101e051808015612bd9578204905090508181830110612bd957808201905090508152506101c0516101805261014080516101805161028051808202821582848304141715612bd95790509050610220516101a051808210612bd95780820390509050808202821582848304141715612bd957905090506101e051808015612bd9578204905090508181830110612bd957808201905090508152505b4261022051186122cb57612313565b61022051610200526102205162093a808181830110612bd95780820190509050428082116122f957816122fb565b805b905090506102205281516001018083528114156120b9575b50505b610100805160018082018060801d81607f1d18612bd9579050905081525061010051601955426001610100516c01431e0fae6d7217caa0000000811015612bd9570260220155610140516001610100516c01431e0fae6d7217caa0000000811015612bd957026c01431e0fae6d721000000000220155601460e05160a0526080526040608020546101e052601860e05160a052608052604060802080546101e05161014051601660e05160a052608052604060802054808210612bd95780820390509050808202821582848304141715612bd95790509050670de0b6b3a7640000808204905090508181830110612bd9578082019050905081555061014051601660e05160a05260805260406080205542601760e05160a052608052604060802055565b6000610160526101405161018052600060e051146124a657600160e05160a052608052604060802054610160526101205161247657600061247c565b61014051155b156124a657601160e05160a05260805260406080205461018052610180516124a65760e051610180525b600f546101a0526101c060006008818352015b6101a0516101c051186124cb57612863565b60016101c0516008811015612bd95702601a01546101e052600560106101e05160a052608052604060802001546102005242600260106101e05160a0526080526040608020015480821161251f5781612521565b805b905090506102205261022051600460106101e05160a05260805260406080200154808210612bd9578082039050905061024052600061024051146126105761022051600460106101e05160a052608052604060802001556000610100511461261057610200805161024051600360106101e05160a05260805260406080200154808202821582848304141715612bd95790509050670de0b6b3a7640000808202821582848304141715612bd9579050905061010051808015612bd9578204905090508181830110612bd9578082019050905081525061020051600560106101e05160a052608052604060802001555b600060e051146128535760126101e05160a052608052604060802060e05160a05260805260406080205461026052600061028052610200516102605110156126b9576102005160126101e05160a052608052604060802060e05160a052608052604060802055610160516102005161026051808210612bd95780820390509050808202821582848304141715612bd95790509050670de0b6b3a764000080820490509050610280525b601360e05160a05260805260406080206101e05160a0526080526040608020546102a0526102a05160801c610280518181830110612bd957808201905090506102c05260006102c0511115612853576102a051700100000000000000000000000000000000808206905090506102e0526101205161277d576000610280511115612853576102e0516102c05160801b8181830110612bd95780820190509050601360e05160a05260805260406080206101e05160a052608052604060802055612853565b63a9059cbb61034452600461018051610364526102c05161038452604001610340526103405060206103e06103405161036060006101e0515af16127c6573d600060003e3d6000fd5b6103c060203d8082116127d957816127db565b805b905090508152805160200180610300828460045afa905050506000610300511461281a57610320516103005181816020036008021c9050905015612bd9575b6102e0516102c0518181830110612bd95780820190509050601360e05160a05260805260406080206101e05160a0526080526040608020555b81516001018083528114156124b9575b5050565b63bbf7408a6101605260e051610180526020610160602461017c6020602038036080396080515afa61289e573d600060003e3d6000fd5b601f3d1115612bd95761016051610140526318160ddd610180526020610180600461019c6020604038036080396080515afa6128df573d600060003e3d6000fd5b601f3d1115612bd9576101805161016052610100516028808202821582848304141715612bd957905090506064808204905090506101805260006101605111156129885761018080516101205161014051808202821582848304141715612bd9579050905061016051808015612bd957820490509050603c808202821582848304141715612bd957905090506064808204905090508181830110612bd957808201905090508152505b610100516101805180821161299d578161299f565b805b9050905061018052601460e05160a0526080526040608020546101a05261018051601460e05160a052608052604060802055601554610180518181830110612bd957808201905090506101a051808210612bd957808203905090506101c0526101c05160155560e0517f7ecd84343f76a23d2227290e0288da3251b045541698e575a5515af4f04197a3610100516101e052610120516102005261018051610220526101c0516102405260806101e0a2565b6104005160e052612a60611e99565b6104205160e052612a6f611e99565b60006104405114612ba057600254610460526000600f541415610480526104805115612ab8576104005160e0526104605161010052600061012052600061014052612ab861243a565b60016104005160a05260805260406080205461044051808210612bd957808203905090506104a0526104a05160016104005160a0526080526040608020556104005160e0526104a051610100526104605161012052612b15612867565b6104805115612b41576104205160e0526104605161010052600061012052600061014052612b4161243a565b60016104205160a052608052604060802054610440518181830110612bd957808201905090506104a0526104a05160016104205160a0526080526040608020556104205160e0526104a051610100526104605161012052612ba0612867565b61042051610400517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61044051610460526020610460a3565b600080fd5b61017d612d5b0361017d6102803961017d612d5b03610180518161028001526101a051816102c001526101c051816102e001526101e051816102a001526102005181610300015261022051816103400152610260518161032001528060e001610280f35b600080fd", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/index.ts b/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/index.ts new file mode 100644 index 0000000..4c4f2da --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/index.ts @@ -0,0 +1,12 @@ +import { Task, TaskRunOptions } from '@src'; +import { LiquidityGaugeFactoryDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as LiquidityGaugeFactoryDeployment; + + const gaugeImplementationArgs = [input.BalancerMinter, input.VotingEscrowDelegationProxy, input.AuthorizerAdaptor]; + const gaugeImplementation = await task.deploy('LiquidityGaugeV5', gaugeImplementationArgs, from, force); + + const args = [gaugeImplementation.address]; + await task.deployAndVerify('LiquidityGaugeFactory', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/input.ts b/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/input.ts new file mode 100644 index 0000000..a47df3a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/input.ts @@ -0,0 +1,17 @@ +import { Task, TaskMode } from '@src'; + +export type LiquidityGaugeFactoryDeployment = { + AuthorizerAdaptor: string; + BalancerMinter: string; + VotingEscrowDelegationProxy: string; +}; + +const AuthorizerAdaptor = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY); +const BalancerMinter = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); +const VotingEscrowDelegationProxy = new Task('20220325-ve-delegation', TaskMode.READ_ONLY); + +export default { + AuthorizerAdaptor, + BalancerMinter, + VotingEscrowDelegationProxy, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/output/goerli.json new file mode 100644 index 0000000..92ba835 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/output/goerli.json @@ -0,0 +1,4 @@ +{ + "LiquidityGaugeV5": "0xfE734760aD346d4013FD597c4f4a897aef332128", + "LiquidityGaugeFactory": "0x224E808FBD9e491Be8988B8A0451FBF777C81B8A" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/output/kovan.json b/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/output/kovan.json new file mode 100644 index 0000000..20b5e13 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/output/kovan.json @@ -0,0 +1,4 @@ +{ + "LiquidityGaugeV5": "0xe5F96070CA00cd54795416B1a4b4c2403231c548", + "LiquidityGaugeFactory": "0xf1665E19bc105BE4EDD3739F88315cC699cc5b65" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/output/mainnet.json new file mode 100644 index 0000000..7a0f135 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "LiquidityGaugeV5": "0x3b8cA519122CdD8efb272b0D3085453404B25bD0", + "LiquidityGaugeFactory": "0x4E7bBd911cf1EFa442BC1b2e9Ea01ffE785412EC" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/readme.md b/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/readme.md new file mode 100644 index 0000000..bc27f95 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-mainnet-gauge-factory/readme.md @@ -0,0 +1,14 @@ +# 2022-03-25 - Liquidity Gauge Factory + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This relayer has been deprecated in favor of an [updated version](../../20220822-mainnet-gauge-factory-v2) with weight-capped gauges. + +Deployment of the `LiquidityGaugeFactory`, for liquidity gauges to be used with pools on mainnet. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`LiquidityGaugeV5` artifact](./artifact/LiquidityGaugeV5.json) +- [`LiquidityGaugeFactory` artifact](./artifact/LiquidityGaugeFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-single-recipient-gauge-factory/artifact/SingleRecipientGaugeFactory.json b/balpy/balancer-deployments/tasks/deprecated/20220325-single-recipient-gauge-factory/artifact/SingleRecipientGaugeFactory.json new file mode 100644 index 0000000..6cb3365 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-single-recipient-gauge-factory/artifact/SingleRecipientGaugeFactory.json @@ -0,0 +1,130 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SingleRecipientGaugeFactory", + "sourceName": "contracts/gauges/ethereum/SingleRecipientGaugeFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IBalancerMinter", + "name": "minter", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "gauge", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "SingleRecipientGaugeCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeImplementation", + "outputs": [ + { + "internalType": "contract ISingleRecipientGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "getGaugeRecipient", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "getRecipientGauge", + "outputs": [ + { + "internalType": "contract ILiquidityGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "isGaugeFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5060405161191238038061191283398101604081905261002f91610096565b8060405161003c90610089565b61004691906100c4565b604051809103906000f080158015610062573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b0392909216919091179055506100d8565b6112a48061066e83390190565b6000602082840312156100a7578081fd5b81516001600160a01b03811681146100bd578182fd5b9392505050565b6001600160a01b0391909116815260200190565b610587806100e76000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80639ed93318116100505780639ed933181461009d578063ce3cc8bd146100b0578063fa72ce95146100d057610067565b806339312dee1461006c5780637d5d0d101461008a575b600080fd5b6100746100e3565b6040516100819190610492565b60405180910390f35b610074610098366004610453565b6100ff565b6100746100ab366004610453565b61012d565b6100c36100be366004610453565b6102f5565b60405161008191906104b3565b6100746100de366004610453565b610320565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260026020526040902054165b919050565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526002602052604081205490911615610197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018e906104be565b60405180910390fd5b600080546101ba9073ffffffffffffffffffffffffffffffffffffffff166103a6565b6040517fc4d66de800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063c4d66de89061020f908690600401610492565b600060405180830381600087803b15801561022957600080fd5b505af115801561023d573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff818116600081815260016020818152604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909317909255938716808352600290945280822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517f8cef09b96018886e359c85f62ed52d97cf7b7263e23efde6031acea9661163b79190a392915050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60008173ffffffffffffffffffffffffffffffffffffffff16631b88094d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561036857600080fd5b505afa15801561037c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a09190610476565b92915050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff8116610128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018e906104f5565b600060208284031215610464578081fd5b813561046f8161052c565b9392505050565b600060208284031215610487578081fd5b815161046f8161052c565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b60208082526014908201527f476175676520616c726561647920657869737473000000000000000000000000604082015260600190565b60208082526016908201527f455243313136373a20637265617465206661696c656400000000000000000000604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff8116811461054e57600080fd5b5056fea2646970667358221220e254c24ca506bb18bb1746af9cf90f46c091a664e261f418599bf38e5470007a64736f6c634300070100336101806040523480156200001257600080fd5b50604051620012a4380380620012a4833981810160405260208110156200003857600080fd5b5051600160009081556040805163e6dec36f60e01b815290518392916001600160a01b0384169163e6dec36f91600480820192602092909190829003018186803b1580156200008657600080fd5b505afa1580156200009b573d6000803e3d6000fd5b505050506040513d6020811015620000b257600080fd5b50516040805163c003969960e01b815290519192506000916001600160a01b0384169163c0039699916004808301926020929190829003018186803b158015620000fb57600080fd5b505afa15801562000110573d6000803e3d6000fd5b505050506040513d60208110156200012757600080fd5b505160408051632c6f4d6f60e11b815290519192506000916001600160a01b038616916358de9ade916004808301926020929190829003018186803b1580156200017057600080fd5b505afa15801562000185573d6000803e3d6000fd5b505050506040513d60208110156200019c57600080fd5b50516001600160601b0319606084811b821660805285811b821660a05286811b821660c05282901b1660e052604080516303e1469160e61b815290519192506001600160a01b0383169163f851a44091600480820192602092909190829003018186803b1580156200020d57600080fd5b505afa15801562000222573d6000803e3d6000fd5b505050506040513d60208110156200023957600080fd5b505160601b6001600160601b0319166101005260408051635c3dab0b60e11b815290516001600160a01b0385169163b87b5616916004808301926020929190829003018186803b1580156200028d57600080fd5b505afa158015620002a2573d6000803e3d6000fd5b505050506040513d6020811015620002b957600080fd5b505161012052604080516321609bbf60e01b815290516001600160a01b038516916321609bbf916004808301926020929190829003018186803b1580156200030057600080fd5b505afa15801562000315573d6000803e3d6000fd5b505050506040513d60208110156200032c57600080fd5b505161014052604080516303f7d6c760e51b815290516001600160a01b03851691637efad8e0916004808301926020929190829003018186803b1580156200037357600080fd5b505afa15801562000388573d6000803e3d6000fd5b505050506040513d60208110156200039f57600080fd5b505161016052505060001960025550505060805160601c60a05160601c60c05160601c60e05160601c6101005160601c610120516101405161016051610e6e62000436600039806106515250806106305250806104fa528061069d5250806102c4528061039f528061088f525080610488528061058c525080610793525080610a525280610b4f5250806109a75250610e6e6000f3fe60806040526004361061007b5760003560e01c8063ab8f09451161004e578063ab8f094514610179578063c2c4c5c114610190578063c4d66de814610198578063d34fb267146101d85761007b565b806309400707146100805780631b88094d146100d25780634b820093146101105780639c868ac014610164575b600080fd5b34801561008c57600080fd5b506100c0600480360360208110156100a357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166101ed565b60408051918252519081900360200190f35b3480156100de57600080fd5b506100e761027b565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561011c57600080fd5b506101506004803603602081101561013357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661029d565b604080519115158252519081900360200190f35b34801561017057600080fd5b506101506102a3565b34801561018557600080fd5b5061018e6102ac565b005b61015061037d565b3480156101a457600080fd5b5061018e600480360360208110156101bb57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610823565b3480156101e457600080fd5b5061018e610877565b600073ffffffffffffffffffffffffffffffffffffffff8216301461027357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060045490565b600554610100900473ffffffffffffffffffffffffffffffffffffffff165b90565b50600190565b60055460ff1690565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461035057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000610387610945565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461042b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600254600061043861095e565b90508082101561081557604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b1580156104cf57600080fd5b505af11580156104e3573d6000803e3d6000fd5b5050600180546003549590910194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff01811015610728578481111561053457610728565b604080517fd3078c9400000000000000000000000000000000000000000000000000000000815230600482015262093a808302602482018190529151600091829173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163d3078c9491604480830192602092919082900301818787803b1580156105d357600080fd5b505af11580156105e7573d6000803e3d6000fd5b505050506040513d60208110156105fd57600080fd5b5051905082851080159061061557508262093a800185105b156106ce57828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000089028161067957fe5b04975062093a80819003670de0b6b3a7640000838a02820260018b905560038990557f000000000000000000000000000000000000000000000000000000000000000090980197049390930192506106e39050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a25093909301925060010161051c565b50600284905560048054830190558115801590610748575060055460ff16155b1561081157604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b1580156107db57600080fd5b505af11580156107ef573d6000803e3d6000fd5b505050506040513d602081101561080557600080fd5b50610811905082610989565b5050505b60019250505061029a6109d8565b61082b6109df565b6005805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461091b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b61095760026000541415610190610be7565b6002600055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b6005546109d59073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081169161010090041683610bf9565b50565b6001600055565b60025415610a4e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ab657600080fd5b505afa158015610aca573d6000803e3d6000fd5b505050506040513d6020811015610ae057600080fd5b5051905080610b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180610e156024913960400191505060405180910390fd5b6001819055610b4761095e565b6002819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610bb557600080fd5b505af1158015610bc9573d6000803e3d6000fd5b505050506040513d6020811015610bdf57600080fd5b505160035550565b81610bf557610bf581610c8b565b5050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610c86908490610cf8565b505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b60208310610d6157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d24565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610dc3576040519150601f19603f3d011682016040523d82523d6000602084013e610dc8565b606091505b50915091506000821415610de0573d6000803e3d6000fd5b610e0e815160001480610e065750818060200190516020811015610e0357600080fd5b50515b6101a2610be7565b5050505056fe42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a2646970667358221220744f7d4940e0873869cb324c9f636ac553db2d69bea2009ab2420ae67d7538de64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80639ed93318116100505780639ed933181461009d578063ce3cc8bd146100b0578063fa72ce95146100d057610067565b806339312dee1461006c5780637d5d0d101461008a575b600080fd5b6100746100e3565b6040516100819190610492565b60405180910390f35b610074610098366004610453565b6100ff565b6100746100ab366004610453565b61012d565b6100c36100be366004610453565b6102f5565b60405161008191906104b3565b6100746100de366004610453565b610320565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260026020526040902054165b919050565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526002602052604081205490911615610197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018e906104be565b60405180910390fd5b600080546101ba9073ffffffffffffffffffffffffffffffffffffffff166103a6565b6040517fc4d66de800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063c4d66de89061020f908690600401610492565b600060405180830381600087803b15801561022957600080fd5b505af115801561023d573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff818116600081815260016020818152604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909317909255938716808352600290945280822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517f8cef09b96018886e359c85f62ed52d97cf7b7263e23efde6031acea9661163b79190a392915050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60008173ffffffffffffffffffffffffffffffffffffffff16631b88094d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561036857600080fd5b505afa15801561037c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a09190610476565b92915050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff8116610128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018e906104f5565b600060208284031215610464578081fd5b813561046f8161052c565b9392505050565b600060208284031215610487578081fd5b815161046f8161052c565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b60208082526014908201527f476175676520616c726561647920657869737473000000000000000000000000604082015260600190565b60208082526016908201527f455243313136373a20637265617465206661696c656400000000000000000000604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff8116811461054e57600080fd5b5056fea2646970667358221220e254c24ca506bb18bb1746af9cf90f46c091a664e261f418599bf38e5470007a64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-single-recipient-gauge-factory/index.ts b/balpy/balancer-deployments/tasks/deprecated/20220325-single-recipient-gauge-factory/index.ts new file mode 100644 index 0000000..a087d47 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-single-recipient-gauge-factory/index.ts @@ -0,0 +1,13 @@ +import { Task, TaskRunOptions } from '@src'; +import { SingleRecipientFactoryDelegationDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as SingleRecipientFactoryDelegationDeployment; + + const args = [input.BalancerMinter]; + const factory = await task.deployAndVerify('SingleRecipientGaugeFactory', args, from, force); + + const implementation = await factory.getGaugeImplementation(); + await task.verify('SingleRecipientGauge', implementation, [input.BalancerMinter]); + await task.save({ SingleRecipientGauge: implementation }); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-single-recipient-gauge-factory/input.ts b/balpy/balancer-deployments/tasks/deprecated/20220325-single-recipient-gauge-factory/input.ts new file mode 100644 index 0000000..aadc6bd --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-single-recipient-gauge-factory/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type SingleRecipientFactoryDelegationDeployment = { + BalancerMinter: string; +}; + +const BalancerMinter = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); + +export default { + BalancerMinter, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-single-recipient-gauge-factory/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20220325-single-recipient-gauge-factory/output/goerli.json new file mode 100644 index 0000000..ed7c9a2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-single-recipient-gauge-factory/output/goerli.json @@ -0,0 +1,4 @@ +{ + "SingleRecipientGaugeFactory": "0xd14FFA46C211eac64338c27549c3312380f850Fa", + "SingleRecipientGauge": "0x5825120665066E3B54D1B21ce45889aff5d41f62" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-single-recipient-gauge-factory/output/kovan.json b/balpy/balancer-deployments/tasks/deprecated/20220325-single-recipient-gauge-factory/output/kovan.json new file mode 100644 index 0000000..8744d09 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-single-recipient-gauge-factory/output/kovan.json @@ -0,0 +1,3 @@ +{ + "SingleRecipientGaugeFactory": "0x866D4B65694c66fbFD15Dd6fa933D0A6b3940A36" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-single-recipient-gauge-factory/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20220325-single-recipient-gauge-factory/output/mainnet.json new file mode 100644 index 0000000..f24656a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-single-recipient-gauge-factory/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "SingleRecipientGaugeFactory": "0x94f68b54191F62f781Fe8298A8A5Fa3ed772d227", + "SingleRecipientGauge": "0x5D3d2D18148baAcE45D09254513BcF2C548C4480" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220325-single-recipient-gauge-factory/readme.md b/balpy/balancer-deployments/tasks/deprecated/20220325-single-recipient-gauge-factory/readme.md new file mode 100644 index 0000000..c8f23c2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220325-single-recipient-gauge-factory/readme.md @@ -0,0 +1,14 @@ +# 2022-03-25 - Single Recipient Gauge Factory + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This factory has been deprecated in favor of an [updated version](../../20230215-single-recipient-gauge-factory-v2/) with weight-capped gauges. + +Deployment of the `SingleRecipientGaugeFactory`, for liquidity gauges which forward their entire BAL allowance onto a single address. + + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`SingleRecipientGaugeFactory` artifact](./artifact/SingleRecipientGaugeFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/artifact/ERC4626LinearPool.json b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/artifact/ERC4626LinearPool.json new file mode 100644 index 0000000..536389f --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/artifact/ERC4626LinearPool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20", "name": "mainToken", "type": "address"}, {"internalType": "contract IERC4626", "name": "wrappedToken", "type": "address"}, {"internalType": "uint256", "name": "upperTarget", "type": "uint256"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "address", "name": "owner", "type": "address"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "lowerTarget", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "upperTarget", "type": "uint256"}], "name": "TargetsSet", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getBptIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMainIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMainToken", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getScalingFactors", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getTargets", "outputs": [{"internalType": "uint256", "name": "lowerTarget", "type": "uint256"}, {"internalType": "uint256", "name": "upperTarget", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVirtualSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedToken", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedTokenRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "indexIn", "type": "uint256"}, {"internalType": "uint256", "name": "indexOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "bytes", "name": "poolConfig", "type": "bytes"}], "name": "setAssetManagerPoolConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bool", "name": "paused", "type": "bool"}], "name": "setPaused", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "newLowerTarget", "type": "uint256"}, {"internalType": "uint256", "name": "newUpperTarget", "type": "uint256"}], "name": "setTargets", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/artifact/ERC4626LinearPoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/artifact/ERC4626LinearPoolFactory.json new file mode 100644 index 0000000..292308c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/artifact/ERC4626LinearPoolFactory.json @@ -0,0 +1,165 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ERC4626LinearPoolFactory", + "sourceName": "contracts/erc4626/ERC4626LinearPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC4626", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract LinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101406040523480156200001257600080fd5b5060405162005f4638038062005f468339810160408190526200003591620001c3565b80604051806020016200004890620001b5565b601f1982820381018352601f909101166040528051819060006002820460a081905280830360e0819052818552909150836200009081620000f9602090811b620002eb17901c565b60601b6001600160601b0319166080528285018051838252620000bf82620000f9602090811b620002eb17901c565b6001600160601b0319606091821b811660c0529690935290529590951b90911661010052505050426276a700016101205250620001f39050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001476001600160a01b03831615156101ac6200014d565b50919050565b816200015e576200015e8162000162565b5050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6153de8062000b6883390190565b600060208284031215620001d5578081fd5b81516001600160a01b0381168114620001ec578182fd5b9392505050565b60805160601c60a05160c05160601c60e0516101005160601c61012051610913620002556000398061023852806102615250806102c952508061035252508061014a52806103ce52508061037352508061012952806103aa52506109136000f3fe608060405234801561001057600080fd5b50600436106100715760003560e01c80632da47c40116100505780632da47c40146100ca5780636634b753146100e05780638d928af81461010057610071565b8062c194db14610076578063174481fa146100945780632ccb254a146100aa575b600080fd5b61007e610108565b60405161008b91906107f0565b60405180910390f35b61009c610127565b60405161008b9291906107be565b6100bd6100b83660046106a7565b61016d565b60405161008b9190610803565b6100d2610232565b60405161008b9291906108aa565b6100f36100ee36600461068b565b61029c565b60405161008b91906107e5565b6100bd6102c7565b60606101226040518060200160405280600081525061034a565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080600061017a610232565b9150915060006101c161018b6102c7565b8c8c8c8c8c8c8a8a8e6040516020016101ad9a99989796959493929190610824565b604051602081830303815290604052610423565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561020b57600080fd5b505af115801561021f573d6000803e3d6000fd5b50929d9c50505050505050505050505050565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561028e57807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610297565b60009250600091505b509091565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061034473ffffffffffffffffffffffffffffffffffffffff831615156101ac6104ae565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016104158183866104c0565b505050505050505050919050565b60008061042f8361053a565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b816104bc576104bc81610582565b5050565b5b602081106104fe5781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016104c1565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600060606105478361034a565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811661057b573d6000803e3d6000fd5b9392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600082601f8301126105ff578081fd5b813567ffffffffffffffff80821115610616578283fd5b60405160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501168201018181108382111715610654578485fd5b60405282815292508284830160200186101561066f57600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121561069c578081fd5b813561057b816108b8565b600080600080600080600060e0888a0312156106c1578283fd5b873567ffffffffffffffff808211156106d8578485fd5b6106e48b838c016105ef565b985060208a01359150808211156106f9578485fd5b506107068a828b016105ef565b9650506040880135610717816108b8565b94506060880135610727816108b8565b93506080880135925060a0880135915060c0880135610745816108b8565b8091505092959891949750929550565b60008151808452815b8181101561077a5760208185018101518683018201520161075e565b8181111561078b5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b60006020825261057b6020830184610755565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600061014073ffffffffffffffffffffffffffffffffffffffff808e1684528160208501526108558285018e610755565b91508382036040850152610869828d610755565b9a811660608501529889166080840152505060a081019590955260c085019390935260e0840191909152610100830152909116610120909101529392505050565b918252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff811681146108da57600080fd5b5056fea2646970667358221220a5c0aa9d95e4596854764f3af36a908ca52cc39d141927e9cbae5a5702764f9064736f6c634300070100336102c06040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b50604051620053de380380620053de8339810160408190526200005a9162000bd0565b898989898989898989898960008a8a620000768b8b30620004f5565b6040805160038082526080820190925290602082016060803683370190505089898989828289898d8280604051806040016040528060018152602001603160f81b81525085858a336001600160a01b031660001b806080818152505050806001600160a01b031660a0816001600160a01b031660601b815250505081600390805190602001906200010992919062000a5c565b5080516200011f90600490602084019062000a5c565b505060058054601260ff1990911617905550815160209283012060c052805191012060e052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6101005260601b6001600160601b03191661014052506200019290506276a700831115610194620005c4565b620001a662278d00821115610195620005c4565b4290910161016081905201610180528551620001c8906002111560c8620005c4565b620001e2620001d6620005d9565b8751111560c9620005c4565b620001f886620005de60201b620014881760201c565b6200020384620005ea565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f9062000234908d9060040162000d6e565b602060405180830381600087803b1580156200024f57600080fd5b505af115801562000264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028a919062000bb7565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002bf9084908b908b9060040162000cd2565b600060405180830381600087803b158015620002da57600080fd5b505af1158015620002ef573d6000803e3d6000fd5b50505050806101a081815250505050505050505050505050866001600160a01b03166101c0816001600160a01b031660601b81525050856001600160a01b03166101e0816001600160a01b031660601b8152505060008060006200035b8a8a306200067660201b60201c565b610200819052610220839052610240829052919450925090506200037f8a6200076c565b610260526200038e896200076c565b610280526000620003a18b828b62000840565b50505050505050505050505050506000866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620003eb57600080fd5b505afa15801562000400573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000426919062000caf565b60ff1690506000886001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200046757600080fd5b505afa1580156200047c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a2919062000caf565b60ff1690506000620004da82620004c6601286620008ee60201b620014921760201c565b6200090b60201b620014a41790919060201c565b600a0a6102a0525062000da69b505050505050505050505050565b6060600080806200050887878762000676565b60408051600380825260808201909252939650919450925060208201606080368337019050509350868484815181106200053e57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050858483815181106200056c57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050848482815181106200059a57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505050509392505050565b81620005d557620005d58162000923565b5050565b600390565b80620005d58162000976565b620005ff64e8d4a5100082101560cb620005c4565b6200061767016345785d8a000082111560ca620005c4565b620006368160c060085462000a0360201b620014ba179092919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906200066b90839062000d83565b60405180910390a150565b6000806000846001600160a01b0316866001600160a01b03161015620006ff57836001600160a01b0316856001600160a01b03161015620006c257506000915060019050600262000763565b836001600160a01b0316866001600160a01b03161015620006ee57506000915060029050600162000763565b506001915060029050600062000763565b846001600160a01b0316846001600160a01b031610156200072b57506002915060019050600062000763565b856001600160a01b0316846001600160a01b031610156200075757506002915060009050600162000763565b50600191506000905060025b93509350939050565b60006001600160a01b038216301415620007905750670de0b6b3a76400006200083b565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620007cc57600080fd5b505afa158015620007e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000807919062000caf565b60ff1690506000620008266012836200090b60201b620014a41760201c565b905080600a0a670de0b6b3a764000002925050505b919050565b620008518183111561014c620005c4565b620008696001600160601b0382111561014d620005c4565b620008a46200088582606062000a1860201b620014d01760201c565b6200089d84600062000a1860201b620014d01760201c565b1762000a1c565b826001600160a01b03167fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d12808383604051620008e192919062000d8c565b60405180910390a2505050565b6000828201620009028482101583620005c4565b90505b92915050565b60006200091d838311156001620005c4565b50900390565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600281511015620009875762000a00565b6000816000815181106200099757fe5b602002602001015190506000600190505b8251811015620009fd576000838281518110620009c157fe5b60200260200101519050620009f2816001600160a01b0316846001600160a01b0316106065620005c460201b60201c565b9150600101620009a8565b50505b50565b6001600160401b03811b1992909216911b1790565b1b90565b62000a3b81600060085462000a4160201b620014d4179092919060201c565b60085550565b6001600160c01b03828116821b90821b198416179392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000a9f57805160ff191683800117855562000acf565b8280016001018555821562000acf579182015b8281111562000acf57825182559160200191906001019062000ab2565b5062000add92915062000ae1565b5090565b5b8082111562000add576000815560010162000ae2565b80516001600160a01b03811681146200090557600080fd5b600082601f83011262000b21578081fd5b81516001600160401b038082111562000b38578283fd5b6040516020601f8401601f191682018101838111838210171562000b5a578586fd5b8060405250819450838252868185880101111562000b7757600080fd5b600092505b8383101562000b9b578583018101518284018201529182019162000b7c565b8383111562000bad5760008185840101525b5050505092915050565b60006020828403121562000bc9578081fd5b5051919050565b6000806000806000806000806000806101408b8d03121562000bf0578586fd5b62000bfc8c8c62000af8565b60208c0151909a506001600160401b038082111562000c19578788fd5b62000c278e838f0162000b10565b9a5060408d015191508082111562000c3d578788fd5b5062000c4c8d828e0162000b10565b98505062000c5e8c60608d0162000af8565b965062000c6f8c60808d0162000af8565b955060a08b0151945060c08b0151935060e08b015192506101008b0151915062000c9e8c6101208d0162000af8565b90509295989b9194979a5092959850565b60006020828403121562000cc1578081fd5b815160ff8116811462000902578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000d1e5762000d0b855162000d9a565b8352938301939183019160010162000cf6565b505084810360408601528551808252908201925081860190845b8181101562000d605762000d4d835162000d9a565b8552938301939183019160010162000d38565b509298975050505050505050565b602081016003831062000d7d57fe5b91905290565b90815260200190565b918252602082015260400190565b6001600160a01b031690565b60805160a05160601c60c05160e05161010051610120516101405160601c61016051610180516101a0516101c05160601c6101e05160601c61020051610220516102405161026051610280516102a05161446162000f7d600039806125775250806115ae52508061154a528061241f5250806107c65280610b7952806115d6528061278a528061293a5280612a915280612c035280612d9f5280612ef65250806109745280610b3f528061156c5280611c1f528061275652806128bf52806129065280612a1b5280612a5d5280612bcf5280612d295280612d6b5280612e805280612ec2525080610bba5280610d895280610e7652806114095280611617528061236452806127c152806129715280612ac85280612c3a5280612dd65280612f2d5280613112528061314a52508061145c528061173252806117fe5280612445528061270b528061284b5280612b855280612cb5525080610998528061101552806116e952806117b55280611c5552806123e452806126cc52806127ed52806129a75280612b465280612c665280612e0c5250806109155250806119de5250806119ba525080610f365250806110cb525080611ae4525080611b26525080611b05525080610f12525080610e9c52506144616000f3fe608060405234801561001057600080fd5b50600436106102d35760003560e01c8063679aefce1161018657806395d89b41116100e3578063d505accf11610097578063de82cd3411610071578063de82cd341461056b578063f174e24114610573578063f5431aa81461057b576102d3565b8063d505accf14610532578063d5c096c414610545578063dd62ed3e14610558576102d3565b8063a457c2d7116100c8578063a457c2d714610504578063a9059cbb14610517578063aaabadc51461052a576102d3565b806395d89b41146104e95780639f11080e146104f1576102d3565b806382687a561161013a57806387ec68171161011f57806387ec6817146104c6578063893d20e8146104d95780638d928af8146104e1576102d3565b806382687a56146104ab578063851c1bb3146104b3576102d3565b806374f3b0091161016b57806374f3b0091461046f5780637ecebe00146104905780638129fc1c146104a3576102d3565b8063679aefce1461045457806370a082311461045c576102d3565b80633644e515116102345780634de046d5116101e857806355c67628116101cd57806355c67628146104155780636028bfd41461041d57806363fe3b561461043e576102d3565b80634de046d5146103ed57806350dd6ed914610402576102d3565b806338fff2d01161021957806338fff2d0146103ca57806339509351146103d25780634d64cd74146103e5576102d3565b80633644e515146103af57806338e9922e146103b7576102d3565b806318160ddd1161028b5780631dd746ea116102705780631dd746ea1461037257806323b872dd14610387578063313ce5671461039a576102d3565b806318160ddd146103535780631c0de0511461035b576102d3565b8063095ea7b3116102bc578063095ea7b31461031657806316b8d6ff1461033657806316c38b3c1461033e576102d3565b806301ec954a146102d857806306fdde0314610301575b600080fd5b6102eb6102e6366004613e95565b610583565b6040516102f891906141b5565b60405180910390f35b6103096106f9565b6040516102f8919061436d565b610329610324366004613bd2565b6107ad565b6040516102f89190614192565b6102eb6107c4565b61035161034c366004613cc9565b6107e8565b005b6102eb6107fc565b610363610802565b6040516102f89392919061419d565b61037a61082b565b6040516102f8919061415a565b610329610395366004613b1d565b61083a565b6103a26108ce565b6040516102f891906143a7565b6102eb6108d7565b6103516103c5366004613fb4565b6108e1565b6102eb610913565b6103296103e0366004613bd2565b610937565b6102eb610972565b6103f5610996565b6040516102f89190614146565b610351610410366004613e00565b6109ba565b6102eb6109d8565b61043061042b366004613d01565b6109e9565b6040516102f8929190614380565b610446610a20565b6040516102f8929190614399565b6102eb610a4e565b6102eb61046a366004613ac9565b610c02565b61048261047d366004613d01565b610c21565b6040516102f892919061416d565b6102eb61049e366004613ac9565b610c9f565b610351610cba565b6102eb610e74565b6102eb6104c1366004613da4565b610e98565b6104306104d4366004613d01565b610eea565b6103f5610f10565b6103f5610f34565b610309610f58565b6103516104ff366004613fe4565b610fd7565b610329610512366004613bd2565b611041565b610329610525366004613bd2565b61107f565b6103f561108c565b610351610540366004613b5d565b611096565b610482610553366004613d01565b6111df565b6102eb610566366004613ae5565b611310565b6102eb61136b565b6103f561145a565b6102eb61147e565b600084608001516105b0610595610f34565b6001600160a01b0316336001600160a01b03161460cd611500565b6105c56105bb610913565b82146101f4611500565b6105cd61150e565b6105e76003851080156105e05750600384105b6064611500565b60606105f1611523565b90506105fd8682611650565b600080610608610a20565b91509150610614613920565b60405180606001604052806106276109d8565b815260208101859052604001839052905060008a51600181111561064757fe5b14156106ab5761066e8a60600151858a8151811061066157fe5b60200260200101516116b1565b60608b015260006106808b8b846116bd565b905061069f81868a8151811061069257fe5b6020026020010151611784565b965050505050506106f0565b6106bf8a6060015185898151811061066157fe5b60608b015260006106d18b8b84611790565b905061069f81868b815181106106e357fe5b6020026020010151611845565b50949350505050565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107a35780601f10610778576101008083540402835291602001916107a3565b820191906000526020600020905b81548152906001019060200180831161078657829003601f168201915b5050505050905090565b60006107ba338484611851565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6107f06118b9565b6107f9816118ff565b50565b60025490565b600080600061080f61199b565b15925061081a6119b8565b91506108246119dc565b9050909192565b6060610835611523565b905090565b6000806108478533611310565b905061086b336001600160a01b03871614806108635750838210155b61019e611500565b610876858585611a00565b336001600160a01b038616148015906108af57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114155b156108c1576108c18533858403611851565b60019150505b9392505050565b60055460ff1690565b6000610835611ae0565b6000806108ec610a20565b915091506109056108fd8383611b7d565b61014f611500565b61090e83611c95565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916107ba91859061096d9086611492565b611851565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6109c26118b9565b6109ca61150e565b6109d48282611cae565b5050565b6008546000906108359060c0611d8e565b600060606109ff86516109fa611d9c565b611da1565b610a1489898989898989611dae611e52611eb3565b97509795505050505050565b6000806000610a2d612043565b9050610a3a816000612049565b9250610a47816060612049565b9150509091565b600080610a59610913565b90506060610a65610f34565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610a9091906141b5565b60006040518083038186803b158015610aa857600080fd5b505afa158015610abc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ae49190810190613bfd565b50915050610af981610af4611523565b611650565b600080610b04610a20565b91509150610b10613920565b6040518060600160405280610b236109d8565b81526020018481526020018381525090506000610baf610b76867f000000000000000000000000000000000000000000000000000000000000000081518110610b6857fe5b60200260200101518461205b565b867f000000000000000000000000000000000000000000000000000000000000000081518110610ba257fe5b60200260200101516120bc565b9050610bf7610bf0867f000000000000000000000000000000000000000000000000000000000000000081518110610be357fe5b60200260200101516120c8565b82906120db565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610c30610595610f34565b610c3b6105bb610913565b6060610c45611523565b9050610c518882611650565b6000606080610c668e8e8e8e8e8e8a8f611dae565b925092509250610c768d84612132565b610c808285611e52565b610c8a8185611e52565b909550935050505b5097509795505050505050565b6001600160a01b031660009081526006602052604090205490565b6000610cc4610913565b90506060610cd0610f34565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610cfb91906141b5565b60006040518083038186803b158015610d1357600080fd5b505afa158015610d27573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d4f9190810190613bfd565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff817f000000000000000000000000000000000000000000000000000000000000000081518110610db257fe5b602002602001018181525050610dc6613941565b6040518060800160405280610dda8561213c565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610e0b610f34565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610e3c94939291906141dd565b600060405180830381600087803b158015610e5657600080fd5b505af1158015610e6a573d6000803e3d6000fd5b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610ecd9291906140d0565b604051602081830303815290604052805190602001209050919050565b60006060610efb86516109fa611d9c565b610a148989898989898961213f61215d611eb3565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107a35780601f10610778576101008083540402835291602001916107a3565b610fdf6118b9565b600080610fea610a20565b91509150610ffb6108fd8383611b7d565b6110106110088585611b7d565b610157611500565b61103b7f000000000000000000000000000000000000000000000000000000000000000085856121be565b50505050565b60008061104e3385611310565b90508083106110685761106333856000611851565b611075565b6110753385858403611851565b5060019392505050565b60006107ba338484611a00565b600061083561224f565b6110a48442111560d1611500565b6001600160a01b03871660009081526006602090815260408083205490519092916110fb917f0000000000000000000000000000000000000000000000000000000000000000918c918c918c9188918d91016142bf565b604051602081830303815290604052805190602001209050600061111e826122c9565b9050600060018288888860405160008152602001604052604051611145949392919061434f565b6020604051602081039080840390855afa158015611167573d6000803e3d6000fd5b5050604051601f19015191506111a990506001600160a01b038216158015906111a157508b6001600160a01b0316826001600160a01b0316145b6101f8611500565b6001600160a01b038b1660009081526006602052604090206001850190556111d28b8b8b611851565b5050505050505050505050565b606080886111ee610595610f34565b6111f96105bb610913565b6060611203611523565b905061120d6107fc565b6112c057600060606112228d8d8d868b6122e5565b9150915061123b6112316123a6565b83101560cc611500565b61124d60006112486123a6565b6123ab565b6112608b6112596123a6565b84036123ab565b61126a818461215d565b80611273611d9c565b67ffffffffffffffff8111801561128957600080fd5b506040519080825280602002602001820160405280156112b3578160200160208202803683370190505b5095509550505050610c92565b6112ca8882611650565b60006060806112df8e8e8e8e8e8e8a8f61213f565b9250925092506112ef8c846123ab565b6112f9828561215d565b6113038185611e52565b9095509350610c92915050565b600061131a610f34565b6001600160a01b0316826001600160a01b0316141561135a57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6107be565b61136483836123b5565b90506107be565b60006060611377610f34565b6001600160a01b031663f94d466861138d610913565b6040518263ffffffff1660e01b81526004016113a991906141b5565b60006040518083038186803b1580156113c157600080fd5b505afa1580156113d5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113fd9190810190613bfd565b509150506000611448827f00000000000000000000000000000000000000000000000000000000000000008151811061143257fe5b6020026020010151611443306123e0565b6116b1565b9050611453816124ba565b9250505090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108356124ce565b806109d4816125a9565b60008282016108c78482101583611500565b60006114b4838311156001611500565b50900390565b67ffffffffffffffff811b1992909216911b1790565b1b90565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116821b90821b198416179392505050565b816109d4576109d481612622565b61152161151961199b565b610192611500565b565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f00000000000000000000000000000000000000000000000000000000000000008151811061159557fe5b6020026020010181815250506115d36115ac6124ce565b7f00000000000000000000000000000000000000000000000000000000000000009061268f565b817f0000000000000000000000000000000000000000000000000000000000000000815181106115ff57fe5b602002602001018181525050670de0b6b3a7640000817f00000000000000000000000000000000000000000000000000000000000000008151811061164057fe5b6020908102919091010152905090565b60005b61165b611d9c565b81101561090e5761169283828151811061167157fe5b602002602001015183838151811061168557fe5b602002602001015161268f565b83828151811061169e57fe5b6020908102919091010152600101611653565b60006108c7838361268f565b60208301516000906001600160a01b03163014156116e7576116e08484846126c5565b90506108c7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415611730576116e0848484612844565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415611779576116e08484846129a0565b6108c7610135612622565b60006108c78383612af7565b60408301516000906001600160a01b03163014156117b3576116e0848484612b3f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156117fc576116e0848484612cae565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b03161415611779576116e0848484612e05565b60006108c783836120db565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906118ac9085906141b5565b60405180910390a3505050565b60006118e86000357fffffffff0000000000000000000000000000000000000000000000000000000016610e98565b90506107f96118f78233612f5c565b610191611500565b801561191f5761191a6119106119b8565b4210610193611500565b611934565b61193461192a6119dc565b42106101a9611500565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611990908390614192565b60405180910390a150565b60006119a56119dc565b42118061083557505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b611a176001600160a01b0384161515610198611500565b611a2e6001600160a01b0383161515610199611500565b611a3983838361090e565b6001600160a01b038316600090815260208190526040902054611a5f90826101a0613045565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611a8e9082611492565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906118ac9085906141b5565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611b4d61305b565b30604051602001611b629594939291906142f3565b60405160208183030381529060405280519060200120905090565b600080611b88610913565b90506060611b94610f34565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401611bbf91906141b5565b60006040518083038186803b158015611bd757600080fd5b505afa158015611beb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c139190810190613bfd565b509150506000611c79827f000000000000000000000000000000000000000000000000000000000000000081518110611c4857fe5b60200260200101516114437f00000000000000000000000000000000000000000000000000000000000000006123e0565b9050858110158015611c8b5750848111155b9695505050505050565b611c9d6118b9565b611ca561150e565b6107f98161305f565b6000611cb8610913565b90506000611cc4610f34565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b8152600401611cf1929190614338565b60806040518083038186803b158015611d0957600080fd5b505afa158015611d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d419190614005565b6040517f18e736d40000000000000000000000000000000000000000000000000000000081529094506001600160a01b03851693506318e736d49250610e3c91508590879060040161431f565b1c67ffffffffffffffff1690565b600390565b6109d48183146067611500565b60006060806000611dbe856130ca565b90506000818015611dcb57fe5b14611de057611ddb61014e612622565b611e43565b611de86130e0565b611df289866130f4565b9094509250611dff611d9c565b67ffffffffffffffff81118015611e1557600080fd5b50604051908082528060200260200182016040528015611e3f578160200160208202803683370190505b5091505b50985098509895505050505050565b60005b611e5d611d9c565b81101561090e57611e94838281518110611e7357fe5b6020026020010151838381518110611e8757fe5b6020026020010151612af7565b838281518110611ea057fe5b6020908102919091010152600101611e55565b333014611fa2576000306001600160a01b0316600036604051611ed7929190614100565b6000604051808303816000865af19150503d8060008114611f14576040519150601f19603f3d011682016040523d82523d6000602084013e611f19565b606091505b505090508060008114611f2857fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611f84573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b6060611fac611523565b9050611fb88782611650565b60006060611fd08c8c8c8c8c8c898d8d63ffffffff16565b5091509150611fe381848663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08301526020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b60085490565b1c6bffffffffffffffffffffffff1690565b600081602001518310156120945781516020830151600091612080918690039061268f565b905061208c84826114a4565b9150506107be565b816040015183116120a65750816107be565b815160408301516000916120809186039061268f565b60006108c78383611492565b6dffffffffffffffffffffffffffff0390565b60006120ea8215156004611500565b826120f7575060006107be565b670de0b6b3a76400008381029061211a9085838161211157fe5b04146005611500565b82600182038161212657fe5b046001019150506107be565b6109d4828261317b565b90565b600060608061214f61014e612622565b985098509895505050505050565b60005b612168611d9c565b81101561090e5761219f83828151811061217e57fe5b602002602001015183838151811061219257fe5b60200260200101516120db565b8382815181106121ab57fe5b6020908102919091010152600101612160565b6121cd8183111561014c611500565b6121e86bffffffffffffffffffffffff82111561014d611500565b6122076121f68260606114d0565b6122018460006114d0565b17613237565b826001600160a01b03167fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d12808383604051612242929190614399565b60405180910390a2505050565b6000612259610f34565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561229157600080fd5b505afa1580156122a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108359190613de4565b60006122d3611ae0565b82604051602001610ecd929190614110565b600060606122f161150e565b6123086001600160a01b0387163014610156611500565b61231f6001600160a01b0386163014610156611500565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff817f00000000000000000000000000000000000000000000000000000000000000008151811061238d57fe5b6020908102919091010152909890975095505050505050565b600090565b6109d4828261324c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561244357507f0000000000000000000000000000000000000000000000000000000000000000610c1c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561248f576124886115ac6124ce565b9050610c1c565b6001600160a01b0382163014156124af5750670de0b6b3a7640000610c1c565b610c1c610135612622565b60006107be826124c86107fc565b906114a4565b6000806124d961145a565b90506000816001600160a01b03166307a2d13a670de0b6b3a76400006040518263ffffffff1660e01b815260040161251191906141b5565b60206040518083038186803b15801561252957600080fd5b505afa15801561253d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125619190613fcc565b905060006125a1670de0b6b3a764000061259b847f00000000000000000000000000000000000000000000000000000000000000006132da565b906132f4565b935050505090565b6002815110156125b8576107f9565b6000816000815181106125c757fe5b602002602001015190506000600190505b825181101561090e5760008382815181106125ef57fe5b60200260200101519050612618816001600160a01b0316846001600160a01b0316106065611500565b91506001016125d8565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b60008282026126b38415806126ac5750838583816126a957fe5b04145b6003611500565b670de0b6b3a764000090049392505050565b600061274b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316148061274357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b610135611500565b61283c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061277f57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106127b357fe5b60200260200101516127ea877f000000000000000000000000000000000000000000000000000000000000000081518110610be357fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b03161461283057613314612834565b6133745b63ffffffff16565b949350505050565b60006128a07f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612743575060408501516001600160a01b03163014610135611500565b60408401516001600160a01b031630146128fb576128f68460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106128e857fe5b6020026020010151846133dd565b61283c565b61283c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061292f57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061296357fe5b602002602001015161299a877f000000000000000000000000000000000000000000000000000000000000000081518110610be357fe5b8661340d565b60006129fc7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612743575060408501516001600160a01b03163014610135611500565b60408401516001600160a01b03163014612a52576128f68460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612a4457fe5b602002602001015184613473565b61283c8460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612a8657fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612aba57fe5b6020026020010151612af1877f000000000000000000000000000000000000000000000000000000000000000081518110610be357fe5b866134b3565b6000612b068215156004611500565b82612b13575060006107be565b670de0b6b3a764000083810290612b2d9085838161211157fe5b828181612b3657fe5b049150506107be565b6000612bc47f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b0316148061274357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b031614610135611500565b61283c8460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612bf857fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612c2c57fe5b6020026020010151612c63877f000000000000000000000000000000000000000000000000000000000000000081518110610be357fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b031614612ca95761351a612834565b613571565b6000612d0a7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612743575060208501516001600160a01b03163014610135611500565b60208401516001600160a01b03163014612d60576128f68460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612d5257fe5b6020026020010151846135db565b61283c8460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612d9457fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612dc857fe5b6020026020010151612dff877f000000000000000000000000000000000000000000000000000000000000000081518110610be357fe5b86613605565b6000612e617f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612743575060208501516001600160a01b03163014610135611500565b60208401516001600160a01b03163014612eb7576128f68460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612ea957fe5b602002602001015184613654565b61283c8460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612eeb57fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f1f57fe5b6020026020010151612f56877f000000000000000000000000000000000000000000000000000000000000000081518110610be357fe5b86613689565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b612f7b610f10565b6001600160a01b031614158015612f965750612f96836136dd565b15612fbe57612fa3610f10565b6001600160a01b0316336001600160a01b03161490506107be565b612fc661224f565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b8152600401612ff5939291906141be565b60206040518083038186803b15801561300d57600080fd5b505afa158015613021573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113649190613ce5565b60006130548484111583611500565b5050900390565b4690565b61307264e8d4a5100082101560cb611500565b61308867016345785d8a000082111560ca611500565b600854613097908260c06114ba565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906119909083906141b5565b6000818060200190518101906107be9190613e4e565b6115216130eb61199b565b156101af611500565b60006060600061310384613719565b9050606061316e8683613148897f00000000000000000000000000000000000000000000000000000000000000008151811061313b57fe5b60200260200101516124ba565b7f000000000000000000000000000000000000000000000000000000000000000061372f565b9196919550909350505050565b6131926001600160a01b038316151561019b611500565b61319e8260008361090e565b6001600160a01b0382166000908152602081905260409020546131c490826101b2613045565b6001600160a01b0383166000908152602081905260409020556002546131ea90826137eb565b6002556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061322b9085906141b5565b60405180910390a35050565b600854613246908260006114d4565b60085550565b6132586000838361090e565b6002546132659082611492565b6002556001600160a01b03821660009081526020819052604090205461328b9082611492565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061322b9085906141b5565b60008282026108c78415806126ac5750838583816126a957fe5b60006133038215156004611500565b81838161330c57fe5b049392505050565b600080613321868461205b565b9050600061332f82876120bc565b9050600061333d868a6114a4565b90506000613358846124c861335285876132da565b8a6137f9565b905061336488826114a4565b9450505050505b95945050505050565b600080613381868461205b565b9050600061338f82876120bc565b905060006133a66133a0838b6132da565b876132f4565b905060006133b484836114a4565b905060006133c2828861382c565b90506133ce8a826114a4565b9b9a5050505050505050505050565b6000806133ea848461205b565b905060006134016133fb8688611492565b8561205b565b9050611c8b81836114a4565b6000826134255761341e868361205b565b905061336b565b6000613431868461205b565b905060006134426133fb888a611492565b9050600061345082846114a4565b9050600061345e84896120bc565b905061336461346d88846132da565b826132f4565b600080613480848461205b565b9050600061348e82876114a4565b9050600061349c828661382c565b90506134a886826114a4565b979650505050505050565b6000826134c157508461336b565b60006134cd868461205b565b905060006134db82876120bc565b905060006134e9878a611492565b905060006134f784836120bc565b9050600061350e61350889846132da565b856132f4565b90506133ce81896114a4565b60008261352857508461336b565b6000613534868461205b565b9050600061354282876120bc565b90506000613550868a611492565b90506000613565846124c861335285876132da565b905061336481896114a4565b6000826135825761341e868361382c565b600061358e868461205b565b9050600061359c82876120bc565b905060006135b36135ad838b6132da565b876137f9565b905060006135c18483611492565b905060006135cf828861382c565b90506133ce818b6114a4565b6000806135e8848461205b565b905060006135f96133fb86886114a4565b9050611c8b82826114a4565b600080613612868461205b565b905060006136236133fb888a6114a4565b9050600061363183836114a4565b9050600061363f84896120bc565b905061336461364e88846132da565b826137f9565b600080613661848461205b565b9050600061366f8287611492565b9050600061367d828661382c565b90506134a881876114a4565b600080613696868461205b565b905060006136a482876120bc565b905060006136b2878a6114a4565b905060006136c084836120bc565b905060006136d161350889846132da565b90506133ce88826114a4565b60006137087f9f11080e00000000000000000000000000000000000000000000000000000000610e98565b8214806107be57506107be826138bc565b6000818060200190518101906108c79190613e69565b6060600061373d8585612af7565b90506060865167ffffffffffffffff8111801561375957600080fd5b50604051908082528060200260200182016040528015613783578160200160208202803683370190505b50905060005b87518110156137e0578481146137d8576137bf838983815181106137a957fe5b602002602001015161268f90919063ffffffff16565b8282815181106137cb57fe5b6020026020010181815250505b600101613789565b509695505050505050565b60006108c783836001613045565b60006138088215156004611500565b82613815575060006107be565b81600184038161382157fe5b0460010190506107be565b600081602001518310156138755781516113649061385390670de0b6b3a764000090611492565b6020840151845161386f91613868919061268f565b8690611492565b90612af7565b816040015183116138875750816107be565b8151611364906138a090670de0b6b3a7640000906114a4565b6040840151845161386f916138b5919061268f565b86906114a4565b60006138e77f38e9922e00000000000000000000000000000000000000000000000000000000610e98565b8214806107be57506139187f50dd6ed900000000000000000000000000000000000000000000000000000000610e98565b909114919050565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b80356107be81614408565b600082601f830112613986578081fd5b8135613999613994826143dc565b6143b5565b8181529150602080830190848101818402860182018710156139ba57600080fd5b60005b848110156139d9578135845292820192908201906001016139bd565b505050505092915050565b600082601f8301126139f4578081fd5b8151613a02613994826143dc565b818152915060208083019084810181840286018201871015613a2357600080fd5b60005b848110156139d957815184529282019290820190600101613a26565b600082601f830112613a52578081fd5b813567ffffffffffffffff811115613a68578182fd5b613a7b6020601f19601f840116016143b5565b9150808252836020828501011115613a9257600080fd5b8060208401602084013760009082016020015292915050565b8051600181106107be57600080fd5b8035600281106107be57600080fd5b600060208284031215613ada578081fd5b81356108c781614408565b60008060408385031215613af7578081fd5b8235613b0281614408565b91506020830135613b1281614408565b809150509250929050565b600080600060608486031215613b31578081fd5b8335613b3c81614408565b92506020840135613b4c81614408565b929592945050506040919091013590565b600080600080600080600060e0888a031215613b77578283fd5b8735613b8281614408565b96506020880135613b9281614408565b95506040880135945060608801359350608088013560ff81168114613bb5578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613be4578182fd5b8235613bef81614408565b946020939093013593505050565b600080600060608486031215613c11578081fd5b835167ffffffffffffffff80821115613c28578283fd5b818601915086601f830112613c3b578283fd5b8151613c49613994826143dc565b80828252602080830192508086018b828387028901011115613c69578788fd5b8796505b84871015613c94578051613c8081614408565b845260019690960195928101928101613c6d565b508901519097509350505080821115613cab578283fd5b50613cb8868287016139e4565b925050604084015190509250925092565b600060208284031215613cda578081fd5b81356108c78161441d565b600060208284031215613cf6578081fd5b81516108c78161441d565b600080600080600080600060e0888a031215613d1b578081fd5b873596506020880135613d2d81614408565b95506040880135613d3d81614408565b9450606088013567ffffffffffffffff80821115613d59578283fd5b613d658b838c01613976565b955060808a0135945060a08a0135935060c08a0135915080821115613d88578283fd5b50613d958a828b01613a42565b91505092959891949750929550565b600060208284031215613db5578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c7578182fd5b600060208284031215613df5578081fd5b81516108c781614408565b60008060408385031215613e12578182fd5b8235613e1d81614408565b9150602083013567ffffffffffffffff811115613e38578182fd5b613e4485828601613a42565b9150509250929050565b600060208284031215613e5f578081fd5b6108c78383613aab565b60008060408385031215613e7b578182fd5b613e858484613aab565b9150602083015190509250929050565b60008060008060808587031215613eaa578182fd5b843567ffffffffffffffff80821115613ec1578384fd5b818701915061012080838a031215613ed7578485fd5b613ee0816143b5565b9050613eec8984613aba565b8152613efb896020850161396b565b6020820152613f0d896040850161396b565b6040820152606083013560608201526080830135608082015260a083013560a0820152613f3d8960c0850161396b565b60c0820152613f4f8960e0850161396b565b60e08201526101008084013583811115613f67578687fd5b613f738b828701613a42565b828401525050809650506020870135915080821115613f90578384fd5b50613f9d87828801613976565b949794965050505060408301359260600135919050565b600060208284031215613fc5578081fd5b5035919050565b600060208284031215613fdd578081fd5b5051919050565b60008060408385031215613ff6578182fd5b50508035926020909101359150565b6000806000806080858703121561401a578182fd5b845193506020850151925060408501519150606085015161403a81614408565b939692955090935050565b6000815180845260208085019450808401835b8381101561407457815187529582019590820190600101614058565b509495945050505050565b15159052565b60008151808452815b818110156140aa5760208185018101518683018201520161408e565b818111156140bb5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6000602082526108c76020830184614045565b6000604082526141806040830185614045565b828103602084015261336b8185614045565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b8083101561424e5761423884516143fc565b8252928401926001929092019190840190614226565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a087015261428c8185614045565b935050506040850151818584030160c08601526142a98382614085565b9250505060608401516137e060e085018261407f565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60008382526040602083015261283c6040830184614085565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526108c76020830184614085565b60008382526040602083015261283c6040830184614045565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156143d457600080fd5b604052919050565b600067ffffffffffffffff8211156143f2578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146107f957600080fd5b80151581146107f957600080fdfea26469706673582212200fbadc367b8879628dc7ed74c8e19d9c31dab509d2a82dea92ea8a0a495594d764736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100715760003560e01c80632da47c40116100505780632da47c40146100ca5780636634b753146100e05780638d928af81461010057610071565b8062c194db14610076578063174481fa146100945780632ccb254a146100aa575b600080fd5b61007e610108565b60405161008b91906107f0565b60405180910390f35b61009c610127565b60405161008b9291906107be565b6100bd6100b83660046106a7565b61016d565b60405161008b9190610803565b6100d2610232565b60405161008b9291906108aa565b6100f36100ee36600461068b565b61029c565b60405161008b91906107e5565b6100bd6102c7565b60606101226040518060200160405280600081525061034a565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080600061017a610232565b9150915060006101c161018b6102c7565b8c8c8c8c8c8c8a8a8e6040516020016101ad9a99989796959493929190610824565b604051602081830303815290604052610423565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561020b57600080fd5b505af115801561021f573d6000803e3d6000fd5b50929d9c50505050505050505050505050565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561028e57807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610297565b60009250600091505b509091565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061034473ffffffffffffffffffffffffffffffffffffffff831615156101ac6104ae565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016104158183866104c0565b505050505050505050919050565b60008061042f8361053a565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b816104bc576104bc81610582565b5050565b5b602081106104fe5781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016104c1565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600060606105478361034a565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811661057b573d6000803e3d6000fd5b9392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600082601f8301126105ff578081fd5b813567ffffffffffffffff80821115610616578283fd5b60405160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501168201018181108382111715610654578485fd5b60405282815292508284830160200186101561066f57600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121561069c578081fd5b813561057b816108b8565b600080600080600080600060e0888a0312156106c1578283fd5b873567ffffffffffffffff808211156106d8578485fd5b6106e48b838c016105ef565b985060208a01359150808211156106f9578485fd5b506107068a828b016105ef565b9650506040880135610717816108b8565b94506060880135610727816108b8565b93506080880135925060a0880135915060c0880135610745816108b8565b8091505092959891949750929550565b60008151808452815b8181101561077a5760208185018101518683018201520161075e565b8181111561078b5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b60006020825261057b6020830184610755565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600061014073ffffffffffffffffffffffffffffffffffffffff808e1684528160208501526108558285018e610755565b91508382036040850152610869828d610755565b9a811660608501529889166080840152505060a081019590955260c085019390935260e0840191909152610100830152909116610120909101529392505050565b918252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff811681146108da57600080fd5b5056fea2646970667358221220a5c0aa9d95e4596854764f3af36a908ca52cc39d141927e9cbae5a5702764f9064736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/index.ts b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/index.ts new file mode 100644 index 0000000..3df9699 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/index.ts @@ -0,0 +1,8 @@ +import { Task, TaskRunOptions } from '@src'; +import { ERC4626LinearPoolDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as ERC4626LinearPoolDeployment; + const args = [input.Vault]; + await task.deployAndVerify('ERC4626LinearPoolFactory', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/input.ts b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/input.ts new file mode 100644 index 0000000..3a09f1c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type ERC4626LinearPoolDeployment = { + Vault: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/output/arbitrum.json new file mode 100644 index 0000000..5f47dc8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "ERC4626LinearPoolFactory": "0x2794953110874981a0d301286c986992022A62a1" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/output/gnosis.json b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/output/gnosis.json new file mode 100644 index 0000000..c8a95dd --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "ERC4626LinearPoolFactory": "0x4132f7AcC9dB7A6cF7BE2Dd3A9DC8b30C7E6E6c8" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/output/goerli.json new file mode 100644 index 0000000..08cac69 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/output/goerli.json @@ -0,0 +1,3 @@ +{ + "ERC4626LinearPoolFactory": "0xdc15A3C5D16413C1C1F75Db0f75c4ae2a4104650" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/output/kovan.json b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/output/kovan.json new file mode 100644 index 0000000..9454a85 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/output/kovan.json @@ -0,0 +1,3 @@ +{ + "ERC4626LinearPoolFactory": "0x44284efFA14964feF15CB13e4a6579D3b3AD7e14" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/output/mainnet.json new file mode 100644 index 0000000..d233fb2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "ERC4626LinearPoolFactory": "0xE061bF85648e9FA7b59394668CfEef980aEc4c66" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/output/optimism.json b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/output/optimism.json new file mode 100644 index 0000000..6ea2344 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/output/optimism.json @@ -0,0 +1,3 @@ +{ + "ERC4626LinearPoolFactory": "0x4C4287b07d293E361281bCeEe8715c8CDeB64E34" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/output/polygon.json new file mode 100644 index 0000000..7db6205 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/output/polygon.json @@ -0,0 +1,3 @@ +{ + "ERC4626LinearPoolFactory": "0x6637dA12881f66dC7E42b8879B0a79faF43C9be2" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/readme.md b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/readme.md new file mode 100644 index 0000000..ddc29ec --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220404-erc4626-linear-pool-v2/readme.md @@ -0,0 +1,18 @@ +# 2022-04-04 - ERC4626 Linear Pool V2 + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This deployment has been deprecated in favor of a new version with critical fixes: [erc4626-linear-pool-v3](../20230206-erc4626-linear-pool-v3/). +> See https://forum.balancer.fi/t/reentrancy-vulnerability-scope-expanded/4345 for more details about the fixed vulnerability. + +Second deployment of the `ERC4626LinearPoolFactory`, for Linear Pools with a ERC4626 yield-bearing token. This version supersedes the previous, which was released prior to finalization of EIP-4626. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`ERC4626LinearPoolFactory` artifact](./artifact/ERC4626LinearPoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20220413-arbitrum-root-gauge-factory/artifact/ArbitrumRootGaugeFactory.json b/balpy/balancer-deployments/tasks/deprecated/20220413-arbitrum-root-gauge-factory/artifact/ArbitrumRootGaugeFactory.json new file mode 100644 index 0000000..91bdcef --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220413-arbitrum-root-gauge-factory/artifact/ArbitrumRootGaugeFactory.json @@ -0,0 +1,271 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ArbitrumRootGaugeFactory", + "sourceName": "contracts/gauges/arbitrum/ArbitrumRootGaugeFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IBalancerMinter", + "name": "minter", + "type": "address" + }, + { + "internalType": "contract IGatewayRouter", + "name": "gatewayRouter", + "type": "address" + }, + { + "internalType": "uint64", + "name": "gasLimit", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "gasPrice", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "maxSubmissionCost", + "type": "uint64" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "gasPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "maxSubmissionCost", + "type": "uint256" + } + ], + "name": "ArbitrumFeesModified", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "gauge", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "ArbitrumRootGaugeCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getArbitrumFees", + "outputs": [ + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "gasPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxSubmissionCost", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "getGaugeRecipient", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "getRecipientGauge", + "outputs": [ + { + "internalType": "contract ILiquidityGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "isGaugeFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "gasLimit", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "gasPrice", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "maxSubmissionCost", + "type": "uint64" + } + ], + "name": "setArbitrumFees", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60c06040523480156200001157600080fd5b506040516200240138038062002401833981016040819052620000349162000136565b306080526001600160601b0319606087901b1660a052604051859085906200005c906200010a565b62000069929190620001c1565b604051809103906000f08015801562000086573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b0392909216919091179055600380546001600160401b0319166001600160401b0394851617600160401b600160801b031916680100000000000000009385169390930292909217600160801b600160c01b031916600160801b919093160291909117905550620001f4915050565b6116cc8062000d3583390190565b80516001600160401b03811681146200013057600080fd5b92915050565b60008060008060008060c087890312156200014f578182fd5b86516200015c81620001db565b60208801519096506200016f81620001db565b60408801519095506200018281620001db565b935062000193886060890162000118565b9250620001a4886080890162000118565b9150620001b58860a0890162000118565b90509295509295509295565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0381168114620001f157600080fd5b50565b60805160a05160601c610b1a6200021b600039806102345250806101e45250610b1a6000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c8063aaabadc511610076578063ce3cc8bd1161005b578063ce3cc8bd1461014e578063e9bde6041461016e578063fa72ce9514610183576100be565b8063aaabadc51461012f578063ac8288c014610137576100be565b8063851c1bb3116100a7578063851c1bb3146100f45780638d928af8146101145780639ed933181461011c576100be565b806339312dee146100c35780637d5d0d10146100e1575b600080fd5b6100cb610196565b6040516100d891906109b9565b60405180910390f35b6100cb6100ef3660046108ac565b6101b2565b610107610102366004610904565b6101e0565b6040516100d891906109e5565b6100cb610232565b6100cb61012a3660046108ac565b610256565b6100cb61041e565b61013f6104aa565b6040516100d893929190610a88565b61016161015c3660046108ac565b6104e3565b6040516100d891906109da565b61018161017c366004610944565b61050e565b005b6100cb6101913660046108ac565b6105fc565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260026020526040902054165b919050565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610215929190610989565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b73ffffffffffffffffffffffffffffffffffffffff818116600090815260026020526040812054909116156102c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b790610a1a565b60405180910390fd5b600080546102e39073ffffffffffffffffffffffffffffffffffffffff16610682565b6040517fc4d66de800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063c4d66de8906103389086906004016109b9565b600060405180830381600087803b15801561035257600080fd5b505af1158015610366573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff818116600081815260016020818152604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909317909255938716808352600290945280822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517f7b5a78afeb182d33f2d682540e1db4413ee8d4f1203a92c9edf1f525057a91229190a392915050565b6000610428610232565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561046d57600080fd5b505afa158015610481573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a591906108c8565b905090565b60035467ffffffffffffffff80821692680100000000000000008304821692700100000000000000000000000000000000900490911690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b61051661072f565b600380547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff858116919091177fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000085831602177fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff16700100000000000000000000000000000000918416919091021790556040517f3db8f737ebeecf95c5dc9b279051cab0e7b70a8e3d63148b38faafcf7d42314e906105ef90859085908590610a9e565b60405180910390a1505050565b60008173ffffffffffffffffffffffffffffffffffffffff16631b88094d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561064457600080fd5b505afa158015610658573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067c91906108c8565b92915050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff81166101db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b790610a51565b600061075e6000357fffffffff00000000000000000000000000000000000000000000000000000000166101e0565b905061077561076d8233610778565b610191610815565b50565b600061078261041e565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b81526004016107be939291906109ee565b60206040518083038186803b1580156107d657600080fd5b505afa1580156107ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080e91906108e4565b9392505050565b816108235761082381610827565b5050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b803567ffffffffffffffff8116811461067c57600080fd5b6000602082840312156108bd578081fd5b813561080e81610ac2565b6000602082840312156108d9578081fd5b815161080e81610ac2565b6000602082840312156108f5578081fd5b8151801515811461080e578182fd5b600060208284031215610915578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461080e578182fd5b600080600060608486031215610958578182fd5b6109628585610894565b92506109718560208601610894565b91506109808560408601610894565b90509250925092565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60208082526014908201527f476175676520616c726561647920657869737473000000000000000000000000604082015260600190565b60208082526016908201527f455243313136373a20637265617465206661696c656400000000000000000000604082015260600190565b9283526020830191909152604082015260600190565b67ffffffffffffffff93841681529183166020830152909116604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff8116811461077557600080fdfea2646970667358221220faf614b7f957ceb80b93b1668c4f3862ff44188b2eb8ee5e5a05f2d2c182be3664736f6c634300070100336101e06040523480156200001257600080fd5b50604051620016cc380380620016cc833981810160405260408110156200003857600080fd5b508051602091820151600160009081556040805163e6dec36f60e01b815290519394929385936001600160a01b0385169263e6dec36f9260048083019392829003018186803b1580156200008b57600080fd5b505afa158015620000a0573d6000803e3d6000fd5b505050506040513d6020811015620000b757600080fd5b50516040805163c003969960e01b815290519192506000916001600160a01b0384169163c0039699916004808301926020929190829003018186803b1580156200010057600080fd5b505afa15801562000115573d6000803e3d6000fd5b505050506040513d60208110156200012c57600080fd5b505160408051632c6f4d6f60e11b815290519192506000916001600160a01b038616916358de9ade916004808301926020929190829003018186803b1580156200017557600080fd5b505afa1580156200018a573d6000803e3d6000fd5b505050506040513d6020811015620001a157600080fd5b50516001600160601b0319606084811b821660805285811b821660a05286811b821660c05282901b1660e052604080516303e1469160e61b815290519192506001600160a01b0383169163f851a44091600480820192602092909190829003018186803b1580156200021257600080fd5b505afa15801562000227573d6000803e3d6000fd5b505050506040513d60208110156200023e57600080fd5b505160601b6001600160601b0319166101005260408051635c3dab0b60e11b815290516001600160a01b0385169163b87b5616916004808301926020929190829003018186803b1580156200029257600080fd5b505afa158015620002a7573d6000803e3d6000fd5b505050506040513d6020811015620002be57600080fd5b505161012052604080516321609bbf60e01b815290516001600160a01b038516916321609bbf916004808301926020929190829003018186803b1580156200030557600080fd5b505afa1580156200031a573d6000803e3d6000fd5b505050506040513d60208110156200033157600080fd5b505161014052604080516303f7d6c760e51b815290516001600160a01b03851691637efad8e0916004808301926020929190829003018186803b1580156200037857600080fd5b505afa1580156200038d573d6000803e3d6000fd5b505050506040513d6020811015620003a457600080fd5b505161016052505060001960025550506040805163c003969960e01b815290516001600160a01b038084169263bda009fe929186169163c003969991600480820192602092909190829003018186803b1580156200040157600080fd5b505afa15801562000416573d6000803e3d6000fd5b505050506040513d60208110156200042d57600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b039092166004830152516024808301926020929190829003018186803b1580156200047557600080fd5b505afa1580156200048a573d6000803e3d6000fd5b505050506040513d6020811015620004a157600080fd5b50516001600160601b0319606091821b81166101805291811b9091166101a05233901b6101c0525060805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205161014051610160516101805160601c6101a05160601c6101c05160601c61114c62000580600039806103b55280610ba2525080610ca8525080610abc52508061074052508061071f5250806105e9528061078c5250806102f4528061048e528061097e525080610577528061067b525080610882525080610ede5280610fdb525080610a805280610ce5525061114c6000f3fe6080604052600436106100965760003560e01c8063ab8f094511610069578063c2c4c5c11161004e578063c2c4c5c1146101c0578063c4d66de8146101c8578063d34fb2671461020857610096565b8063ab8f094514610194578063b0245225146101ab57610096565b8063094007071461009b5780631b88094d146100ed5780634b8200931461012b5780639c868ac01461017f575b600080fd5b3480156100a757600080fd5b506100db600480360360208110156100be57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661021d565b60408051918252519081900360200190f35b3480156100f957600080fd5b506101026102ab565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561013757600080fd5b5061016b6004803603602081101561014e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166102cd565b604080519115158252519081900360200190f35b34801561018b57600080fd5b5061016b6102d3565b3480156101a057600080fd5b506101a96102dc565b005b3480156101b757600080fd5b506100db6103ad565b61016b61046c565b3480156101d457600080fd5b506101a9600480360360208110156101eb57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610912565b34801561021457600080fd5b506101a9610966565b600073ffffffffffffffffffffffffffffffffffffffff821630146102a357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060045490565b600554610100900473ffffffffffffffffffffffffffffffffffffffff165b90565b50600190565b60055460ff1690565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461038057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000806000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ac8288c06040518163ffffffff1660e01b815260040160606040518083038186803b15801561041957600080fd5b505afa15801561042d573d6000803e3d6000fd5b505050506040513d606081101561044357600080fd5b50805160208201516040909201519094509092509050610464838383610a34565b935050505090565b6000610476610a3a565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461051a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b6002546000610527610a53565b90508082101561090457604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b1580156105be57600080fd5b505af11580156105d2573d6000803e3d6000fd5b5050600180546003549590910194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff01811015610817578481111561062357610817565b604080517fd3078c9400000000000000000000000000000000000000000000000000000000815230600482015262093a808302602482018190529151600091829173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163d3078c9491604480830192602092919082900301818787803b1580156106c257600080fd5b505af11580156106d6573d6000803e3d6000fd5b505050506040513d60208110156106ec57600080fd5b5051905082851080159061070457508262093a800185105b156107bd57828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000089028161076857fe5b04975062093a80819003670de0b6b3a7640000838a02820260018b905560038990557f000000000000000000000000000000000000000000000000000000000000000090980197049390930192506107d29050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a25093909301925060010161060b565b50600284905560048054830190558115801590610837575060055460ff16155b1561090057604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b1580156108ca57600080fd5b505af11580156108de573d6000803e3d6000fd5b505050506040513d60208110156108f457600080fd5b50610900905082610a7e565b5050505b6001925050506102ca610e64565b61091a610e6b565b6005805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610a0a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b91020190565b610a4c60026000541415610190611073565b6002600055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610b2f57600080fd5b505af1158015610b43573d6000803e3d6000fd5b505050506040513d6020811015610b5957600080fd5b5050604080517fac8288c000000000000000000000000000000000000000000000000000000000815290516000918291829173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163ac8288c091600480820192606092909190829003018186803b158015610be957600080fd5b505afa158015610bfd573d6000803e3d6000fd5b505050506040513d6060811015610c1357600080fd5b508051602082015160409092015190945090925090506000610c36848484610a34565b9050803414610ca657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f496e636f7272656374206d73672e76616c756520706173736564000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d2ce7d65827f0000000000000000000000000000000000000000000000000000000000000000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16898989896040516020018082815260200180602001828103825260008152602001602001925050506040516020818303038152906040526040518863ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610df4578181015183820152602001610ddc565b50505050905090810190601f168015610e215780820380516001836020036101000a031916815260200191505b509750505050505050506000604051808303818588803b158015610e4457600080fd5b505af1158015610e58573d6000803e3d6000fd5b50505050505050505050565b6001600055565b60025415610eda57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f4257600080fd5b505afa158015610f56573d6000803e3d6000fd5b505050506040513d6020811015610f6c57600080fd5b5051905080610fc6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806110f36024913960400191505060405180910390fd5b6001819055610fd3610a53565b6002819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561104157600080fd5b505af1158015611055573d6000803e3d6000fd5b505050506040513d602081101561106b57600080fd5b505160035550565b816110815761108181611085565b5050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fdfe42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a2646970667358221220350f0fd516da006e394fab28c3a603ad7aff745d47c15ed73ec71d23354b9fc564736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100be5760003560e01c8063aaabadc511610076578063ce3cc8bd1161005b578063ce3cc8bd1461014e578063e9bde6041461016e578063fa72ce9514610183576100be565b8063aaabadc51461012f578063ac8288c014610137576100be565b8063851c1bb3116100a7578063851c1bb3146100f45780638d928af8146101145780639ed933181461011c576100be565b806339312dee146100c35780637d5d0d10146100e1575b600080fd5b6100cb610196565b6040516100d891906109b9565b60405180910390f35b6100cb6100ef3660046108ac565b6101b2565b610107610102366004610904565b6101e0565b6040516100d891906109e5565b6100cb610232565b6100cb61012a3660046108ac565b610256565b6100cb61041e565b61013f6104aa565b6040516100d893929190610a88565b61016161015c3660046108ac565b6104e3565b6040516100d891906109da565b61018161017c366004610944565b61050e565b005b6100cb6101913660046108ac565b6105fc565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260026020526040902054165b919050565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610215929190610989565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b73ffffffffffffffffffffffffffffffffffffffff818116600090815260026020526040812054909116156102c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b790610a1a565b60405180910390fd5b600080546102e39073ffffffffffffffffffffffffffffffffffffffff16610682565b6040517fc4d66de800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063c4d66de8906103389086906004016109b9565b600060405180830381600087803b15801561035257600080fd5b505af1158015610366573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff818116600081815260016020818152604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909317909255938716808352600290945280822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517f7b5a78afeb182d33f2d682540e1db4413ee8d4f1203a92c9edf1f525057a91229190a392915050565b6000610428610232565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561046d57600080fd5b505afa158015610481573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a591906108c8565b905090565b60035467ffffffffffffffff80821692680100000000000000008304821692700100000000000000000000000000000000900490911690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b61051661072f565b600380547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff858116919091177fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000085831602177fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff16700100000000000000000000000000000000918416919091021790556040517f3db8f737ebeecf95c5dc9b279051cab0e7b70a8e3d63148b38faafcf7d42314e906105ef90859085908590610a9e565b60405180910390a1505050565b60008173ffffffffffffffffffffffffffffffffffffffff16631b88094d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561064457600080fd5b505afa158015610658573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067c91906108c8565b92915050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff81166101db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b790610a51565b600061075e6000357fffffffff00000000000000000000000000000000000000000000000000000000166101e0565b905061077561076d8233610778565b610191610815565b50565b600061078261041e565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b81526004016107be939291906109ee565b60206040518083038186803b1580156107d657600080fd5b505afa1580156107ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080e91906108e4565b9392505050565b816108235761082381610827565b5050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b803567ffffffffffffffff8116811461067c57600080fd5b6000602082840312156108bd578081fd5b813561080e81610ac2565b6000602082840312156108d9578081fd5b815161080e81610ac2565b6000602082840312156108f5578081fd5b8151801515811461080e578182fd5b600060208284031215610915578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461080e578182fd5b600080600060608486031215610958578182fd5b6109628585610894565b92506109718560208601610894565b91506109808560408601610894565b90509250925092565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60208082526014908201527f476175676520616c726561647920657869737473000000000000000000000000604082015260600190565b60208082526016908201527f455243313136373a20637265617465206661696c656400000000000000000000604082015260600190565b9283526020830191909152604082015260600190565b67ffffffffffffffff93841681529183166020830152909116604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff8116811461077557600080fdfea2646970667358221220faf614b7f957ceb80b93b1668c4f3862ff44188b2eb8ee5e5a05f2d2c182be3664736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220413-arbitrum-root-gauge-factory/index.ts b/balpy/balancer-deployments/tasks/deprecated/20220413-arbitrum-root-gauge-factory/index.ts new file mode 100644 index 0000000..4c222cd --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220413-arbitrum-root-gauge-factory/index.ts @@ -0,0 +1,21 @@ +import { Task, TaskRunOptions } from '@src'; +import { ArbitrumRootGaugeFactoryDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as ArbitrumRootGaugeFactoryDeployment; + + const args = [ + input.Vault, + input.BalancerMinter, + input.GatewayRouter, + input.GasLimit, + input.GasPrice, + input.MaxSubmissionCost, + ]; + + const factory = await task.deployAndVerify('ArbitrumRootGaugeFactory', args, from, force); + + const implementation = await factory.getGaugeImplementation(); + await task.verify('ArbitrumRootGauge', implementation, [input.BalancerMinter, input.GatewayRouter]); + await task.save({ ArbitrumRootGauge: implementation }); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220413-arbitrum-root-gauge-factory/input.ts b/balpy/balancer-deployments/tasks/deprecated/20220413-arbitrum-root-gauge-factory/input.ts new file mode 100644 index 0000000..f369c95 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220413-arbitrum-root-gauge-factory/input.ts @@ -0,0 +1,27 @@ +import { Task, TaskMode } from '@src'; + +export type ArbitrumRootGaugeFactoryDeployment = { + Vault: string; + BalancerMinter: string; + GatewayRouter: string; + GasLimit: number; + GasPrice: number; + MaxSubmissionCost: number; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerMinter = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); + +export default { + mainnet: { + Vault, + BalancerMinter, + // From https://developer.offchainlabs.com/docs/useful_addresses#token-bridge + GatewayRouter: '0x72Ce9c846789fdB6fC1f34aC4AD25Dd9ef7031ef', + // The following values (along with the GatewayRouter) were retrieved at deployment time from Curve's + // arbitrum-tricrypto gauge, located at 0x9044E12fB1732f88ed0c93cfa5E9bB9bD2990cE5. + GasLimit: 1000000, + GasPrice: 1990000000, + MaxSubmissionCost: 10000000000000, + }, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220413-arbitrum-root-gauge-factory/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20220413-arbitrum-root-gauge-factory/output/mainnet.json new file mode 100644 index 0000000..359566b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220413-arbitrum-root-gauge-factory/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "ArbitrumRootGaugeFactory": "0xad901309d9e9DbC5Df19c84f729f429F0189a633", + "ArbitrumRootGauge": "0x715C777C6149C31A75D0d29633bbBE0A14370bDC" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220413-arbitrum-root-gauge-factory/readme.md b/balpy/balancer-deployments/tasks/deprecated/20220413-arbitrum-root-gauge-factory/readme.md new file mode 100644 index 0000000..53533d4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220413-arbitrum-root-gauge-factory/readme.md @@ -0,0 +1,12 @@ +# 2022-04-13 - Arbitrum Root Gauge Factory + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This relayer has been deprecated in favor of an [updated version](../../20220823-arbitrum-root-gauge-factory-v2) with weight-capped gauges. + +Deployment of the `ArbitrumRootGaugeFactory`, for stakeless gauges that bridge funds to their Arbitrum counterparts. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [`ArbitrumRootGaugeFactory` artifact](./artifact/ArbitrumRootGaugeFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20220413-arbitrum-root-gauge-factory/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20220413-arbitrum-root-gauge-factory/test/task.fork.ts new file mode 100644 index 0000000..e250a87 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220413-arbitrum-root-gauge-factory/test/task.fork.ts @@ -0,0 +1,247 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import { BigNumber, FP_ONE } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { advanceTime, currentWeekTimestamp, DAY, WEEK } from '@helpers/time'; +import * as expectEvent from '@helpers/expectEvent'; + +import { expectEqualWithError } from '@helpers/relativeError'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import { range } from 'lodash'; +import { expectTransferEvent } from '@helpers/expectTransfer'; + +import { describeForkTest, getSigner, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; + +describeForkTest('ArbitrumRootGaugeFactory', 'mainnet', 14600000, function () { + let veBALHolder: SignerWithAddress, admin: SignerWithAddress, recipient: SignerWithAddress; + let factory: Contract, gauge: Contract; + let vault: Contract, + authorizer: Contract, + authorizerAdaptor: Contract, + BALTokenAdmin: Contract, + gaugeController: Contract, + gaugeAdder: Contract; + let BAL: string; + + let task: Task; + + const VEBAL_HOLDER = '0xCB3593C7c0dFe13129Ff2B6add9bA402f76c797e'; + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + + before('run task', async () => { + task = new Task('20220413-arbitrum-root-gauge-factory', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('ArbitrumRootGaugeFactory'); + }); + + before('advance time', async () => { + // This causes all voting cooldowns to expire, letting the veBAL holder vote again + await advanceTime(DAY * 12); + }); + + before('setup accounts', async () => { + admin = await getSigner(0); + recipient = await getSigner(1); + + veBALHolder = await impersonate(VEBAL_HOLDER); + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.instanceAt('Vault', '0xBA12222222228d8Ba445958a75a0704d566BF2C8'); // vaultTask.output({ network: 'mainnet' }).Vault + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + + const authorizerAdaptorTask = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizerAdaptor = await authorizerAdaptorTask.instanceAt( + 'AuthorizerAdaptor', + '0x8f42adbba1b16eaae3bb5754915e0d06059add75' // authorizerAdaptorTask.output({ network: 'mainnet' }).AuthorizerAdaptor + ); + + const gaugeAdderTask = new Task('20220325-gauge-adder', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeAdder = await gaugeAdderTask.instanceAt( + 'GaugeAdder', + '0xEd5ba579bB5D516263ff6E1C10fcAc1040075Fe2' // gaugeAdderTask.output({ network: 'mainnet' }).GaugeAdder + ); + + const balancerTokenAdminTask = new Task('20220325-balancer-token-admin', TaskMode.READ_ONLY, getForkedNetwork(hre)); + BALTokenAdmin = await balancerTokenAdminTask.instanceAt( + 'BalancerTokenAdmin', + '0xf302f9F50958c5593770FDf4d4812309fF77414f' // balancerTokenAdminTask.output({ network: 'mainnet' }).BalancerTokenAdmin + ); + + BAL = await BALTokenAdmin.getBalancerToken(); + + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeController = await gaugeControllerTask.instanceAt( + 'GaugeController', + '0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD' // gaugeControllerTask.output({ network: 'mainnet' }).GaugeController + ); + }); + + it('create gauge', async () => { + const tx = await factory.create(recipient.address); + const event = expectEvent.inReceipt(await tx.wait(), 'ArbitrumRootGaugeCreated'); + + gauge = await task.instanceAt('ArbitrumRootGauge', event.args.gauge); + expect(event.args.recipient).to.equal(recipient.address); + + expect(await factory.isGaugeFromFactory(gauge.address)).to.be.true; + expect(await factory.getRecipientGauge(recipient.address)).to.equal(gauge.address); + expect(await factory.getGaugeRecipient(gauge.address)).to.equal(recipient.address); + }); + + it('grant permissions', async () => { + // We need to grant permission to the admin to add the Arbitrum factory to the GaugeAdder, and also to then add + // gauges from said factory to the GaugeController. + const govMultisig = await impersonate(GOV_MULTISIG); + + const selectors = ['addGaugeFactory', 'addArbitrumGauge'].map((method) => gaugeAdder.interface.getSighash(method)); + await Promise.all( + selectors.map( + async (selector) => + await authorizer.connect(govMultisig).grantRole(await gaugeAdder.getActionId(selector), admin.address) + ) + ); + + // We also need to grant permissions to mint in the gauges, which is done via the Authorizer Adaptor + await authorizer + .connect(govMultisig) + .grantRole(await authorizerAdaptor.getActionId(gauge.interface.getSighash('checkpoint')), admin.address); + }); + + it('add gauge to gauge controller', async () => { + await gaugeAdder.addGaugeFactory(factory.address, 4); // Arbitrum is Gauge Type 4 + await gaugeAdder.addArbitrumGauge(gauge.address); + + expect(await gaugeController.gauge_exists(gauge.address)).to.be.true; + }); + + it('vote for gauge', async () => { + expect(await gaugeController.get_gauge_weight(gauge.address)).to.equal(0); + await gaugeController.connect(veBALHolder).vote_for_gauge_weights(gauge.address, 10000); // Max voting power is 10k points + + // We now need to go through an epoch for the votes to be locked in + await advanceTime(DAY * 8); + + await gaugeController.checkpoint(); + expect(await gaugeController['gauge_relative_weight(address)'](gauge.address)).to.be.gt(0); + }); + + it('mint & bridge tokens', async () => { + // The gauge has votes for this week, and it will mint the first batch of tokens. We store the current gauge + // relative weight, as it will change as time goes by due to vote decay. + const firstMintWeekTimestamp = await currentWeekTimestamp(); + const gaugeRelativeWeight = await gaugeController['gauge_relative_weight(address)'](gauge.address); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + + // Even though the gauge has relative weight, it cannot mint yet as it needs for the epoch to finish + const bridgeETH = await gauge.getTotalBridgeCost(); + const zeroMintTx = await authorizerAdaptor + .connect(admin) + .performAction(gauge.address, calldata, { value: bridgeETH }); + expectEvent.inIndirectReceipt(await zeroMintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp.sub(WEEK), // Process past week, which had zero votes + periodEmissions: 0, + }); + // No token transfers are performed if the emissions are zero, but we can't test for a lack of those + + await advanceTime(WEEK); + + // The gauge should now mint and send all minted tokens to the Arbitrum bridge + const mintTx = await authorizerAdaptor.connect(admin).performAction(gauge.address, calldata, { value: bridgeETH }); + const event = expectEvent.inIndirectReceipt(await mintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp, + }); + const actualEmissions = event.args.periodEmissions; + + // The amount of tokens minted should equal the weekly emissions rate times the relative weight of the gauge + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + + const expectedEmissions = gaugeRelativeWeight.mul(weeklyRate).div(FP_ONE); + expectEqualWithError(actualEmissions, expectedEmissions, 0.001); + + // Tokens are minted for the gauge + expectTransferEvent( + await mintTx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + value: actualEmissions, + }, + BAL + ); + + // And the gauge then deposits those in the predicate via the bridge mechanism + const bridgeInterface = new ethers.utils.Interface([ + 'event DepositInitiated(address l1Token, address indexed from, address indexed to, uint256 indexed sequenceNumber, uint256 amount)', + ]); + + expectEvent.inIndirectReceipt(await mintTx.wait(), bridgeInterface, 'DepositInitiated', { + from: gauge.address, + to: recipient.address, + l1Token: BAL, + amount: actualEmissions, + }); + }); + + it('mint multiple weeks', async () => { + const numberOfWeeks = 5; + await advanceTime(WEEK * numberOfWeeks); + await gaugeController.checkpoint_gauge(gauge.address); + + const weekTimestamp = await currentWeekTimestamp(); + + // We can query the relative weight of the gauge for each of the weeks that have passed + const relativeWeights: BigNumber[] = await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, weekTimestamp.sub(WEEK * weekIndex)) + ) + ); + + // The amount of tokens minted should equal the sum of the weekly emissions rate times the relative weight of the + // gauge (this assumes we're not crossing an emissions rate epoch so that the inflation remains constant). + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + const expectedEmissions = relativeWeights + .map((weight) => weight.mul(weeklyRate).div(FP_ONE)) + .reduce((sum, value) => sum.add(value)); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + const tx = await authorizerAdaptor + .connect(admin) + .performAction(gauge.address, calldata, { value: await gauge.getTotalBridgeCost() }); + + await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + expectEvent.inIndirectReceipt(await tx.wait(), gauge.interface, 'Checkpoint', { + periodTime: weekTimestamp.sub(WEEK * weekIndex), + }) + ) + ); + + // Tokens are minted for the gauge + expectTransferEvent( + await tx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + value: expectedEmissions, + }, + BAL + ); + + // And the gauge then deposits those in the predicate via the bridge mechanism + const bridgeInterface = new ethers.utils.Interface([ + 'event DepositInitiated(address l1Token, address indexed from, address indexed to, uint256 indexed sequenceNumber, uint256 amount)', + ]); + + expectEvent.inIndirectReceipt(await tx.wait(), bridgeInterface, 'DepositInitiated', { + from: gauge.address, + to: recipient.address, + l1Token: BAL, + amount: expectedEmissions, + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20220413-polygon-root-gauge-factory/artifact/PolygonRootGaugeFactory.json b/balpy/balancer-deployments/tasks/deprecated/20220413-polygon-root-gauge-factory/artifact/PolygonRootGaugeFactory.json new file mode 100644 index 0000000..ddd6bf5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220413-polygon-root-gauge-factory/artifact/PolygonRootGaugeFactory.json @@ -0,0 +1,140 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PolygonRootGaugeFactory", + "sourceName": "contracts/gauges/polygon/PolygonRootGaugeFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IBalancerMinter", + "name": "minter", + "type": "address" + }, + { + "internalType": "contract IPolygonRootChainManager", + "name": "polygonRootChainManager", + "type": "address" + }, + { + "internalType": "address", + "name": "polygonERC20Predicate", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "gauge", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "PolygonRootGaugeCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeImplementation", + "outputs": [ + { + "internalType": "contract ISingleRecipientGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "getGaugeRecipient", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "getRecipientGauge", + "outputs": [ + { + "internalType": "contract ILiquidityGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "isGaugeFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50604051611a99380380611a9983398101604081905261002f9161009d565b82828260405161003e90610090565b61004a939291906100e9565b604051809103906000f080158015610066573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905550610124915050565b6113df806106ba83390190565b6000806000606084860312156100b1578283fd5b83516100bc8161010c565b60208501519093506100cd8161010c565b60408501519092506100de8161010c565b809150509250925092565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b038116811461012157600080fd5b50565b610587806101336000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80639ed93318116100505780639ed933181461009d578063ce3cc8bd146100b0578063fa72ce95146100d057610067565b806339312dee1461006c5780637d5d0d101461008a575b600080fd5b6100746100e3565b6040516100819190610492565b60405180910390f35b610074610098366004610453565b6100ff565b6100746100ab366004610453565b61012d565b6100c36100be366004610453565b6102f5565b60405161008191906104b3565b6100746100de366004610453565b610320565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260026020526040902054165b919050565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526002602052604081205490911615610197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018e906104be565b60405180910390fd5b600080546101ba9073ffffffffffffffffffffffffffffffffffffffff166103a6565b6040517fc4d66de800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063c4d66de89061020f908690600401610492565b600060405180830381600087803b15801561022957600080fd5b505af115801561023d573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff818116600081815260016020818152604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909317909255938716808352600290945280822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517f75d10ca42c0d6da28eb371f9b49d012d2429f61681a865c2ec6d9933a560e4119190a392915050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60008173ffffffffffffffffffffffffffffffffffffffff16631b88094d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561036857600080fd5b505afa15801561037c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a09190610476565b92915050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff8116610128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018e906104f5565b600060208284031215610464578081fd5b813561046f8161052c565b9392505050565b600060208284031215610487578081fd5b815161046f8161052c565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b60208082526014908201527f476175676520616c726561647920657869737473000000000000000000000000604082015260600190565b60208082526016908201527f455243313136373a20637265617465206661696c656400000000000000000000604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff8116811461054e57600080fd5b5056fea26469706673582212207ff8d91f6b5cacb67b8ba529053a0dc859b90e305041ecc65784c7af321acb9864736f6c634300070100336101c06040523480156200001257600080fd5b50604051620013df380380620013df833981810160405260608110156200003857600080fd5b50805160208083015160409384015160016000908155855163e6dec36f60e01b81529551949592949193869391926001600160a01b0385169263e6dec36f926004808301939192829003018186803b1580156200009457600080fd5b505afa158015620000a9573d6000803e3d6000fd5b505050506040513d6020811015620000c057600080fd5b50516040805163c003969960e01b815290519192506000916001600160a01b0384169163c0039699916004808301926020929190829003018186803b1580156200010957600080fd5b505afa1580156200011e573d6000803e3d6000fd5b505050506040513d60208110156200013557600080fd5b505160408051632c6f4d6f60e11b815290519192506000916001600160a01b038616916358de9ade916004808301926020929190829003018186803b1580156200017e57600080fd5b505afa15801562000193573d6000803e3d6000fd5b505050506040513d6020811015620001aa57600080fd5b50516001600160601b0319606084811b821660805285811b821660a05286811b821660c05282901b1660e052604080516303e1469160e61b815290519192506001600160a01b0383169163f851a44091600480820192602092909190829003018186803b1580156200021b57600080fd5b505afa15801562000230573d6000803e3d6000fd5b505050506040513d60208110156200024757600080fd5b505160601b6001600160601b0319166101005260408051635c3dab0b60e11b815290516001600160a01b0385169163b87b5616916004808301926020929190829003018186803b1580156200029b57600080fd5b505afa158015620002b0573d6000803e3d6000fd5b505050506040513d6020811015620002c757600080fd5b505161012052604080516321609bbf60e01b815290516001600160a01b038516916321609bbf916004808301926020929190829003018186803b1580156200030e57600080fd5b505afa15801562000323573d6000803e3d6000fd5b505050506040513d60208110156200033a57600080fd5b505161014052604080516303f7d6c760e51b815290516001600160a01b03851691637efad8e0916004808301926020929190829003018186803b1580156200038157600080fd5b505afa15801562000396573d6000803e3d6000fd5b505050506040513d6020811015620003ad57600080fd5b505161016052505060001960025550506001600160601b0319606092831b811661018052911b166101a0525060805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205161014051610160516101805160601c6101a05160601c610f5762000488600039806109cb5280610a6f5250806109a75280610bb25250806106b152508061069052508061055a52806106fd52508061032452806103ff52806108ef5250806104e852806105ec5250806107f3525080610ce95280610de6525080610a335280610b775250610f576000f3fe6080604052600436106100b15760003560e01c8063c2c4c5c111610069578063d34fb2671161004e578063d34fb2671461020e578063fe022cc914610223578063fe33859e14610238576100b1565b8063c2c4c5c1146101c6578063c4d66de8146101ce576100b1565b80634b8200931161009a5780634b820093146101465780639c868ac01461019a578063ab8f0945146101af576100b1565b806309400707146100b65780631b88094d14610108575b600080fd5b3480156100c257600080fd5b506100f6600480360360208110156100d957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661024d565b60408051918252519081900360200190f35b34801561011457600080fd5b5061011d6102db565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561015257600080fd5b506101866004803603602081101561016957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166102fd565b604080519115158252519081900360200190f35b3480156101a657600080fd5b50610186610303565b3480156101bb57600080fd5b506101c461030c565b005b6101866103dd565b3480156101da57600080fd5b506101c4600480360360208110156101f157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610883565b34801561021a57600080fd5b506101c46108d7565b34801561022f57600080fd5b5061011d6109a5565b34801561024457600080fd5b5061011d6109c9565b600073ffffffffffffffffffffffffffffffffffffffff821630146102d357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060045490565b600554610100900473ffffffffffffffffffffffffffffffffffffffff165b90565b50600190565b60055460ff1690565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146103b057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006103e76109ed565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461048b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b6002546000610498610a06565b90508082101561087557604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b15801561052f57600080fd5b505af1158015610543573d6000803e3d6000fd5b5050600180546003549590910194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff01811015610788578481111561059457610788565b604080517fd3078c9400000000000000000000000000000000000000000000000000000000815230600482015262093a808302602482018190529151600091829173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163d3078c9491604480830192602092919082900301818787803b15801561063357600080fd5b505af1158015610647573d6000803e3d6000fd5b505050506040513d602081101561065d57600080fd5b5051905082851080159061067557508262093a800185105b1561072e57828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008902816106d957fe5b04975062093a80819003670de0b6b3a7640000838a02820260018b905560038990557f000000000000000000000000000000000000000000000000000000000000000090980197049390930192506107439050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a25093909301925060010161057c565b506002849055600480548301905581158015906107a8575060055460ff16155b1561087157604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b15801561083b57600080fd5b505af115801561084f573d6000803e3d6000fd5b505050506040513d602081101561086557600080fd5b50610871905082610a31565b5050505b6001925050506102fa610c6f565b61088b610c76565b6005805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461097b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6109ff60026000541415610190610e7e565b6002600055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610ae257600080fd5b505af1158015610af6573d6000803e3d6000fd5b505050506040513d6020811015610b0c57600080fd5b5050600554604080516020808201859052825180830382018152828401938490527fe3dec8fb0000000000000000000000000000000000000000000000000000000090935273ffffffffffffffffffffffffffffffffffffffff6101009094048416604483018181527f00000000000000000000000000000000000000000000000000000000000000008087166064860152606060848601908152865160a487015286517f00000000000000000000000000000000000000000000000000000000000000009098169763e3dec8fb9794969295919260c4019185019080838360005b83811015610c06578181015183820152602001610bee565b50505050905090810190601f168015610c335780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015610c5457600080fd5b505af1158015610c68573d6000803e3d6000fd5b5050505050565b6001600055565b60025415610ce557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d4d57600080fd5b505afa158015610d61573d6000803e3d6000fd5b505050506040513d6020811015610d7757600080fd5b5051905080610dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180610efe6024913960400191505060405180910390fd5b6001819055610dde610a06565b6002819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610e4c57600080fd5b505af1158015610e60573d6000803e3d6000fd5b505050506040513d6020811015610e7657600080fd5b505160035550565b81610e8c57610e8c81610e90565b5050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fdfe42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a264697066735822122054d61b215cba11d82b83d7621b9826d49b30c87d7ed42c7c69d527905013b54f64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80639ed93318116100505780639ed933181461009d578063ce3cc8bd146100b0578063fa72ce95146100d057610067565b806339312dee1461006c5780637d5d0d101461008a575b600080fd5b6100746100e3565b6040516100819190610492565b60405180910390f35b610074610098366004610453565b6100ff565b6100746100ab366004610453565b61012d565b6100c36100be366004610453565b6102f5565b60405161008191906104b3565b6100746100de366004610453565b610320565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260026020526040902054165b919050565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526002602052604081205490911615610197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018e906104be565b60405180910390fd5b600080546101ba9073ffffffffffffffffffffffffffffffffffffffff166103a6565b6040517fc4d66de800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063c4d66de89061020f908690600401610492565b600060405180830381600087803b15801561022957600080fd5b505af115801561023d573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff818116600081815260016020818152604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909317909255938716808352600290945280822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517f75d10ca42c0d6da28eb371f9b49d012d2429f61681a865c2ec6d9933a560e4119190a392915050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60008173ffffffffffffffffffffffffffffffffffffffff16631b88094d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561036857600080fd5b505afa15801561037c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a09190610476565b92915050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff8116610128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018e906104f5565b600060208284031215610464578081fd5b813561046f8161052c565b9392505050565b600060208284031215610487578081fd5b815161046f8161052c565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b60208082526014908201527f476175676520616c726561647920657869737473000000000000000000000000604082015260600190565b60208082526016908201527f455243313136373a20637265617465206661696c656400000000000000000000604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff8116811461054e57600080fd5b5056fea26469706673582212207ff8d91f6b5cacb67b8ba529053a0dc859b90e305041ecc65784c7af321acb9864736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220413-polygon-root-gauge-factory/index.ts b/balpy/balancer-deployments/tasks/deprecated/20220413-polygon-root-gauge-factory/index.ts new file mode 100644 index 0000000..3f19c1b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220413-polygon-root-gauge-factory/index.ts @@ -0,0 +1,13 @@ +import { Task, TaskRunOptions } from '@src'; +import { PolygonRootGaugeFactoryDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as PolygonRootGaugeFactoryDeployment; + + const args = [input.BalancerMinter, input.PolygonRootChainManager, input.PolygonERC20Predicate]; + const factory = await task.deployAndVerify('PolygonRootGaugeFactory', args, from, force); + + const implementation = await factory.getGaugeImplementation(); + await task.verify('PolygonRootGauge', implementation, args); + await task.save({ PolygonRootGauge: implementation }); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220413-polygon-root-gauge-factory/input.ts b/balpy/balancer-deployments/tasks/deprecated/20220413-polygon-root-gauge-factory/input.ts new file mode 100644 index 0000000..be99579 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220413-polygon-root-gauge-factory/input.ts @@ -0,0 +1,22 @@ +import { Task, TaskMode } from '@src'; + +export type PolygonRootGaugeFactoryDeployment = { + BalancerMinter: string; + PolygonRootChainManager: string; + PolygonERC20Predicate: string; +}; + +const BalancerMinter = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); + +export default { + mainnet: { + BalancerMinter, + // From https://static.matic.network/network/mainnet/v1/index.json, which is linked by the main documentation at + // https://docs.polygon.technology/docs/develop/ethereum-polygon/pos/deployment. Note that the docs instruct to use + // the Proxy addresses. + // These values match the ones hardcoded in the original Curve contracts (deployment addresses can be found at + // https://curve.readthedocs.io/ref-addresses.html#pools-and-gauges, e.g. 0x060e386eCfBacf42Aa72171Af9EFe17b3993fC4F) + PolygonRootChainManager: '0xA0c68C638235ee32657e8f720a23ceC1bFc77C77', + PolygonERC20Predicate: '0x40ec5B33f54e0E8A33A975908C5BA1c14e5BbbDf', + }, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220413-polygon-root-gauge-factory/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20220413-polygon-root-gauge-factory/output/mainnet.json new file mode 100644 index 0000000..030e4e4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220413-polygon-root-gauge-factory/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "PolygonRootGaugeFactory": "0x4C4287b07d293E361281bCeEe8715c8CDeB64E34", + "PolygonRootGauge": "0xe53D8f8aAaFD95FCc7196E393EC5a907Df44495E" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220413-polygon-root-gauge-factory/readme.md b/balpy/balancer-deployments/tasks/deprecated/20220413-polygon-root-gauge-factory/readme.md new file mode 100644 index 0000000..2751c16 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220413-polygon-root-gauge-factory/readme.md @@ -0,0 +1,12 @@ +# 2022-04-13 - Polygon Root Gauge Factory + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This relayer has been deprecated in favor of an [updated version](../../20220823-polygon-root-gauge-factory-v2) with weight-capped gauges. + +Deployment of the `PolygonRootGaugeFactory`, for stakeless gauges that bridge funds to their Polygon counterparts. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [`PolygonRootGaugeFactory` artifact](./artifact/PolygonRootGaugeFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20220413-polygon-root-gauge-factory/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20220413-polygon-root-gauge-factory/test/task.fork.ts new file mode 100644 index 0000000..7b6a011 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220413-polygon-root-gauge-factory/test/task.fork.ts @@ -0,0 +1,242 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { range } from 'lodash'; + +import { BigNumber, FP_ONE } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { advanceTime, currentWeekTimestamp, DAY, WEEK } from '@helpers/time'; +import * as expectEvent from '@helpers/expectEvent'; +import { expectTransferEvent } from '@helpers/expectTransfer'; + +import { expectEqualWithError } from '@helpers/relativeError'; +import { ZERO_ADDRESS } from '@helpers/constants'; + +import { describeForkTest, getSigner, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; + +describeForkTest('PolygonRootGaugeFactory', 'mainnet', 14600000, function () { + let veBALHolder: SignerWithAddress, admin: SignerWithAddress, recipient: SignerWithAddress; + let factory: Contract, gauge: Contract; + let vault: Contract, + authorizer: Contract, + authorizerAdaptor: Contract, + BALTokenAdmin: Contract, + gaugeController: Contract, + gaugeAdder: Contract; + let BAL: string; + + let task: Task; + + const VEBAL_HOLDER = '0xCB3593C7c0dFe13129Ff2B6add9bA402f76c797e'; + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + + before('run task', async () => { + task = new Task('20220413-polygon-root-gauge-factory', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('PolygonRootGaugeFactory'); + }); + + before('advance time', async () => { + // This causes all voting cooldowns to expire, letting the veBAL holder vote again + await advanceTime(DAY * 12); + }); + + before('setup accounts', async () => { + admin = await getSigner(0); + recipient = await getSigner(1); + + veBALHolder = await impersonate(VEBAL_HOLDER); + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.instanceAt('Vault', '0xBA12222222228d8Ba445958a75a0704d566BF2C8'); // vaultTask.output({ network: 'mainnet' }).Vault + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + + const authorizerAdaptorTask = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizerAdaptor = await authorizerAdaptorTask.instanceAt( + 'AuthorizerAdaptor', + '0x8f42adbba1b16eaae3bb5754915e0d06059add75' // authorizerAdaptorTask.output({ network: 'mainnet' }).AuthorizerAdaptor + ); + + const gaugeAdderTask = new Task('20220325-gauge-adder', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeAdder = await gaugeAdderTask.instanceAt( + 'GaugeAdder', + '0xEd5ba579bB5D516263ff6E1C10fcAc1040075Fe2' // gaugeAdderTask.output({ network: 'mainnet' }).GaugeAdder + ); + + const balancerTokenAdminTask = new Task('20220325-balancer-token-admin', TaskMode.READ_ONLY, getForkedNetwork(hre)); + BALTokenAdmin = await balancerTokenAdminTask.instanceAt( + 'BalancerTokenAdmin', + '0xf302f9F50958c5593770FDf4d4812309fF77414f' // balancerTokenAdminTask.output({ network: 'mainnet' }).BalancerTokenAdmin + ); + + BAL = await BALTokenAdmin.getBalancerToken(); + + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeController = await gaugeControllerTask.instanceAt( + 'GaugeController', + '0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD' // gaugeControllerTask.output({ network: 'mainnet' }).GaugeController + ); + }); + + it('create gauge', async () => { + const tx = await factory.create(recipient.address); + const event = expectEvent.inReceipt(await tx.wait(), 'PolygonRootGaugeCreated'); + + gauge = await task.instanceAt('PolygonRootGauge', event.args.gauge); + expect(event.args.recipient).to.equal(recipient.address); + + expect(await factory.isGaugeFromFactory(gauge.address)).to.be.true; + expect(await factory.getRecipientGauge(recipient.address)).to.equal(gauge.address); + expect(await factory.getGaugeRecipient(gauge.address)).to.equal(recipient.address); + }); + + it('grant permissions', async () => { + // We need to grant permission to the admin to add the Polygon factory to the GaugeAdder, and also to then add + // gauges from said factory to the GaugeController. + const govMultisig = await impersonate(GOV_MULTISIG); + + const selectors = ['addGaugeFactory', 'addPolygonGauge'].map((method) => gaugeAdder.interface.getSighash(method)); + await Promise.all( + selectors.map( + async (selector) => + await authorizer.connect(govMultisig).grantRole(await gaugeAdder.getActionId(selector), admin.address) + ) + ); + + // We also need to grant permissions to mint in the gauges, which is done via the Authorizer Adaptor + await authorizer + .connect(govMultisig) + .grantRole(await authorizerAdaptor.getActionId(gauge.interface.getSighash('checkpoint')), admin.address); + }); + + it('add gauge to gauge controller', async () => { + await gaugeAdder.addGaugeFactory(factory.address, 3); // Polygon is Gauge Type 3 + await gaugeAdder.addPolygonGauge(gauge.address); + + expect(await gaugeController.gauge_exists(gauge.address)).to.be.true; + }); + + it('vote for gauge', async () => { + expect(await gaugeController.get_gauge_weight(gauge.address)).to.equal(0); + await gaugeController.connect(veBALHolder).vote_for_gauge_weights(gauge.address, 10000); // Max voting power is 10k points + + // We now need to go through an epoch for the votes to be locked in + await advanceTime(DAY * 8); + + await gaugeController.checkpoint(); + expect(await gaugeController['gauge_relative_weight(address)'](gauge.address)).to.be.gt(0); + }); + + it('mint & bridge tokens', async () => { + // The gauge has votes for this week, and it will mint the first batch of tokens. We store the current gauge + // relative weight, as it will change as time goes by due to vote decay. + const firstMintWeekTimestamp = await currentWeekTimestamp(); + const gaugeRelativeWeight = await gaugeController['gauge_relative_weight(address)'](gauge.address); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + + // Even though the gauge has relative weight, it cannot mint yet as it needs for the epoch to finish + const zeroMintTx = await authorizerAdaptor.connect(admin).performAction(gauge.address, calldata); + expectEvent.inIndirectReceipt(await zeroMintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp.sub(WEEK), // Process past week, which had zero votes + periodEmissions: 0, + }); + // No token transfers are performed if the emissions are zero, but we can't test for a lack of those + + await advanceTime(WEEK); + + // The gauge should now mint and send all minted tokens to the Polygon bridge + const mintTx = await authorizerAdaptor.connect(admin).performAction(gauge.address, calldata); + const event = expectEvent.inIndirectReceipt(await mintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp, + }); + const actualEmissions = event.args.periodEmissions; + + // The amount of tokens minted should equal the weekly emissions rate times the relative weight of the gauge + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + + const expectedEmissions = gaugeRelativeWeight.mul(weeklyRate).div(FP_ONE); + expectEqualWithError(actualEmissions, expectedEmissions, 0.001); + + // Tokens are minted for the gauge + expectTransferEvent( + await mintTx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + value: actualEmissions, + }, + BAL + ); + + // And the gauge then deposits those in the predicate via the bridge mechanism + const bridgeInterface = new ethers.utils.Interface([ + 'event LockedERC20(address indexed depositor, address indexed depositReceiver, address indexed rootToken, uint256 amount)', + ]); + + expectEvent.inIndirectReceipt(await mintTx.wait(), bridgeInterface, 'LockedERC20', { + depositor: gauge.address, + depositReceiver: recipient.address, + rootToken: BAL, + amount: actualEmissions, + }); + }); + + it('mint multiple weeks', async () => { + const numberOfWeeks = 5; + await advanceTime(WEEK * numberOfWeeks); + await gaugeController.checkpoint_gauge(gauge.address); + + const weekTimestamp = await currentWeekTimestamp(); + + // We can query the relative weight of the gauge for each of the weeks that have passed + const relativeWeights: BigNumber[] = await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, weekTimestamp.sub(WEEK * weekIndex)) + ) + ); + + // The amount of tokens minted should equal the sum of the weekly emissions rate times the relative weight of the + // gauge (this assumes we're not crossing an emissions rate epoch so that the inflation remains constant). + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + const expectedEmissions = relativeWeights + .map((weight) => weight.mul(weeklyRate).div(FP_ONE)) + .reduce((sum, value) => sum.add(value)); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + const tx = await authorizerAdaptor.connect(admin).performAction(gauge.address, calldata); + + await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + expectEvent.inIndirectReceipt(await tx.wait(), gauge.interface, 'Checkpoint', { + periodTime: weekTimestamp.sub(WEEK * weekIndex), + }) + ) + ); + + // Tokens are minted for the gauge + expectTransferEvent( + await tx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + value: expectedEmissions, + }, + BAL + ); + + // And the gauge then deposits those in the predicate via the bridge mechanism + const bridgeInterface = new ethers.utils.Interface([ + 'event LockedERC20(address indexed depositor, address indexed depositReceiver, address indexed rootToken, uint256 amount)', + ]); + + expectEvent.inIndirectReceipt(await tx.wait(), bridgeInterface, 'LockedERC20', { + depositor: gauge.address, + depositReceiver: recipient.address, + rootToken: BAL, + amount: expectedEmissions, + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/artifact/FeeDistributor.json b/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/artifact/FeeDistributor.json new file mode 100644 index 0000000..178e43f --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/artifact/FeeDistributor.json @@ -0,0 +1,387 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "FeeDistributor", + "sourceName": "contracts/fee-distribution/FeeDistributor.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVotingEscrow", + "name": "votingEscrow", + "type": "address" + }, + { + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lastCheckpointTimestamp", + "type": "uint256" + } + ], + "name": "TokenCheckpointed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "userTokenTimeCursor", + "type": "uint256" + } + ], + "name": "TokensClaimed", + "type": "event" + }, + { + "inputs": [], + "name": "checkpoint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "checkpointToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "checkpointTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "checkpointUser", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "claimToken", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "claimTokens", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "depositToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "name": "depositTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getTimeCursor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "getTokenLastBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "getTokenTimeCursor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "getTokensDistributedInWeek", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "getTotalSupplyAtTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "getUserBalanceAtTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "getUserTimeCursor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "getUserTokenTimeCursor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVotingEscrow", + "outputs": [ + { + "internalType": "contract IVotingEscrow", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60c06040523480156200001157600080fd5b5060405162001fce38038062001fce83398101604081905262000034916200015d565b60016000556001600160601b0319606083901b16608052620000568162000151565b90506000620000654262000151565b905080821015620000935760405162461bcd60e51b81526004016200008a90620001b0565b60405180910390fd5b80821415620001415760405163bd85b03960e01b81526000906001600160a01b0385169063bd85b03990620000cd9085906004016200022d565b60206040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000121919062000197565b11620001415760405162461bcd60e51b81526004016200008a90620001e5565b5060a08190526001555062000236565b62093a80908190040290565b6000806040838503121562000170578182fd5b82516001600160a01b038116811462000187578283fd5b6020939093015192949293505050565b600060208284031215620001a9578081fd5b5051919050565b6020808252818101527f43616e6e6f74207374617274206265666f72652063757272656e74207765656b604082015260600190565b60208082526028908201527f5a65726f20746f74616c20737570706c7920726573756c747320696e206c6f736040820152677420746f6b656e7360c01b606082015260800190565b90815260200190565b60805160601c60a051611d446200028a600039806104bb528061085452806109a45280610d22525080610276528061077652806109115280610ac4528061122d528061130152806115e65250611d446000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c806382aa5ad4116100b2578063acbc142811610081578063ca31879d11610066578063ca31879d1461023b578063d3dc4ca11461024e578063de681faf146102615761011b565b8063acbc142814610220578063c2c4c5c1146102335761011b565b806382aa5ad4146101d2578063876e69a1146101da57806388720467146101ed578063905d10ac1461020d5761011b565b80633902b9bc116100ee5780633902b9bc146101865780634f3c5090146101995780637b8d6221146101ac5780638050a7ee146101bf5761011b565b806308b0308a1461012057806314866e081461013e5780632308805b14610153578063338b5dea14610173575b600080fd5b610128610274565b6040516101359190611b2f565b60405180910390f35b61015161014c3660046118bc565b610298565b005b6101666101613660046118bc565b6102b4565b6040516101359190611ce3565b610151610181366004611963565b610302565b6101516101943660046118bc565b61034e565b6101666101a7366004611ac6565b610361565b6101516101ba3660046119ce565b610373565b6101666101cd36600461192b565b610456565b61016661046b565b6101666101e83660046118bc565b610471565b6102006101fb3660046118d8565b6104af565b6040516101359190611bdd565b61015161021b36600461198e565b6105e9565b61016661022e3660046118bc565b61061e565b61015161065c565b61016661024936600461192b565b610676565b61016661025c366004611963565b6106b3565b61016661026f366004611963565b6106e8565b7f000000000000000000000000000000000000000000000000000000000000000090565b6102a061071d565b6102a981610736565b6102b1610c93565b50565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1690565b61030a61071d565b610315826000610c9a565b61033773ffffffffffffffffffffffffffffffffffffffff83163330846110c4565b610342826001610c9a565b61034a610c93565b5050565b61035661071d565b6102a9816001610c9a565b60009081526002602052604090205490565b61037b61071d565b6103858382611167565b8260005b81811015610446576103bc8686838181106103a057fe5b90506020020160208101906103b591906118bc565b6000610c9a565b61041333308686858181106103cd57fe5b905060200201358989868181106103e057fe5b90506020020160208101906103f591906118bc565b73ffffffffffffffffffffffffffffffffffffffff169291906110c4565b61043e86868381811061042257fe5b905060200201602081019061043791906118bc565b6001610c9a565b600101610389565b5050610450610c93565b50505050565b60006104628383611174565b90505b92915050565b60015490565b73ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205468010000000000000000900467ffffffffffffffff1690565b60606104b961071d565b7f0000000000000000000000000000000000000000000000000000000000000000421161051b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051290611c86565b60405180910390fd5b61052361120c565b61052c84610736565b8160608167ffffffffffffffff8111801561054657600080fd5b50604051908082528060200260200182016040528015610570578160200160208202803683370190505b50905060005b828110156105d65761058d8686838181106103a057fe5b6105b78787878481811061059d57fe5b90506020020160208101906105b291906118bc565b6113ac565b8282815181106105c357fe5b6020908102919091010152600101610576565b509150506105e2610c93565b9392505050565b6105f161071d565b8060005b818110156106145761060c84848381811061042257fe5b6001016105f5565b505061034a610c93565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205468010000000000000000900467ffffffffffffffff1690565b61066461071d565b61066c61120c565b610674610c93565b565b600061068061071d565b61068861120c565b610693826000610c9a565b61069c83610736565b60006106a884846113ac565b915050610465610c93565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600460209081526040808320938352929052205490565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600660209081526040808320938352929052205490565b61072f60026000541415610190611570565b6002600055565b6040517f010ae75700000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063010ae757906107ab908590600401611b2f565b60206040518083038186803b1580156107c357600080fd5b505afa1580156107d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fb9190611ade565b90508061080857506102b1565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600560205260408120805490916801000000000000000090910467ffffffffffffffff16908161088057610879857f00000000000000000000000000000000000000000000000000000000000000008661157e565b90506108c3565b6108894261169e565b82141561089957505050506102b1565b50815470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff165b806108cc575060015b6108d4611833565b6040517f28d09d4700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906328d09d47906109489089908690600401611bb7565b60806040518083038186803b15801561096057600080fd5b505afa158015610974573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109989190611a57565b905082610a0a576109d57f00000000000000000000000000000000000000000000000000000000000000006109d083604001516116aa565b6116ba565b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff821617855592505b610a12611833565b60005b6032811015610bf85742851115610a2b57610bf8565b82604001518510158015610a3f5750868411155b15610b535760018401935082915086841115610a875760405180608001604052806000600f0b81526020016000600f0b81526020016000815260200160008152509250610b4e565b6040517f28d09d4700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906328d09d4790610afb908b908890600401611bb7565b60806040518083038186803b158015610b1357600080fd5b505afa158015610b27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4b9190611a57565b92505b610bf0565b6000826040015186039050600081846020015102600f0b8460000151600f0b13610b7e576000610b8f565b81846020015102846000015103600f0b5b905080158015610b9e57508886115b15610bb557610bac426116aa565b96505050610bf8565b73ffffffffffffffffffffffffffffffffffffffff8a1660009081526006602090815260408083208a84529091529020555062093a80909401935b600101610a15565b505083546fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9290920167ffffffffffffffff90811670010000000000000000000000000000000002929092177fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff1668010000000000000000939092169290920217909155505050565b6001600055565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805490916801000000000000000090910467ffffffffffffffff169081610d7e57429150610cec4261169e565b83547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff919091161783557f00000000000000000000000000000000000000000000000000000000000000004211610d79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051290611c86565b610dd0565b814203905083610dd0576000610d938361169e565b610d9c4261169e565b14905060006201518042610daf426116aa565b03109050818015610dbe575080155b15610dcd57505050505061034a565b50505b82547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000004267ffffffffffffffff16021783556040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8716906370a0823190610e62903090600401611b2f565b60206040518083038186803b158015610e7a57600080fd5b505afa158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb29190611ade565b8454909150600090610eeb90839070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff166116d1565b905080610efc57505050505061034a565b6fffffffffffffffffffffffffffffffff821115610f46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051290611c4f565b84546fffffffffffffffffffffffffffffffff8084167001000000000000000000000000000000000291161785556000610f7f8561169e565b73ffffffffffffffffffffffffffffffffffffffff8916600090815260046020526040812091925090815b601481101561107c578362093a800192508242101561101a5786158015610fd057508742145b15610fee576000848152602083905260409020805486019055611015565b86884203860281610ffb57fe5b600086815260208590526040902080549290910490910190555b61107c565b8615801561102757508783145b1561104557600084815260208390526040902080548601905561106c565b8688840386028161105257fe5b600086815260208590526040902080549290910490910190555b9196508692508291600101610faa565b507f9b7f1a85a4c9b4e59e1b6527d9969c50cdfb3a1a467d0c4a51fb0ed8bf07f1308a85896040516110b093929190611c21565b60405180910390a150505050505050505050565b610450846323b872dd60e01b8585856040516024016110e593929190611b50565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526116df565b61034a8183146067611570565b73ffffffffffffffffffffffffffffffffffffffff808316600090815260076020908152604080832093851683529290529081205480156111b6579050610465565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260056020908152604080832054938716835260039091529020546112049167ffffffffffffffff90811691166116ba565b949350505050565b600154600061121a4261169e565b90508082111561122b575050610674565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c2c4c5c16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561129357600080fd5b505af11580156112a7573d6000803e3d6000fd5b5050505060005b60148110156113a557818311156112c4576113a5565b6040517fbd85b03900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063bd85b03990611336908690600401611ce3565b60206040518083038186803b15801561134e57600080fd5b505afa158015611362573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113869190611ade565b60008481526002602052604090205562093a80909201916001016112ae565b5050600155565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260408120816113dc8585611174565b82549091506000906114039068010000000000000000900467ffffffffffffffff1661169e565b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600460209081526040808320938b16835260069091528120929350909190805b60148110156114945784861061145557611494565b6000868152600260209081526040808320548683528184205492889052922054028161147d57fe5b62093a809790970196049190910190600101611440565b5073ffffffffffffffffffffffffffffffffffffffff808a166000908152600760209081526040808320938c1683529290522085905580156115645785546fffffffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216849003821602911617865561152673ffffffffffffffffffffffffffffffffffffffff89168a8361178c565b7fff097c7d8b1957a4ff09ef1361b5fb54dcede3941ba836d0beb9d10bec725de68989838860405161155b9493929190611b81565b60405180910390a15b98975050505050505050565b8161034a5761034a816117b0565b60008082815b60808110156116935781831061159957611693565b60028284018101046115a9611833565b6040517f28d09d4700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906328d09d479061161d908c908690600401611bb7565b60806040518083038186803b15801561163557600080fd5b505afa158015611649573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166d9190611a57565b90508781604001511161168257819450611689565b6001820393505b5050600101611584565b509095945050505050565b62093a80908190040290565b600061046562093a7f830161169e565b6000818310156116ca5781610462565b5090919050565b60006104628383600161181d565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516117089190611af6565b6000604051808303816000865af19150503d8060008114611745576040519150601f19603f3d011682016040523d82523d6000602084013e61174a565b606091505b50915091506000821415611762573d6000803e3d6000fd5b6104508151600014806117845750818060200190518101906117849190611a37565b6101a2611570565b6117ab8363a9059cbb60e01b84846040516024016110e5929190611bb7565b505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600061182c8484111583611570565b5050900390565b60405180608001604052806000600f0b81526020016000600f0b815260200160008152602001600081525090565b60008083601f840112611872578182fd5b50813567ffffffffffffffff811115611889578182fd5b60208301915083602080830285010111156118a357600080fd5b9250929050565b8051600f81900b811461046557600080fd5b6000602082840312156118cd578081fd5b81356105e281611cec565b6000806000604084860312156118ec578182fd5b83356118f781611cec565b9250602084013567ffffffffffffffff811115611912578283fd5b61191e86828701611861565b9497909650939450505050565b6000806040838503121561193d578182fd5b823561194881611cec565b9150602083013561195881611cec565b809150509250929050565b60008060408385031215611975578182fd5b823561198081611cec565b946020939093013593505050565b600080602083850312156119a0578182fd5b823567ffffffffffffffff8111156119b6578283fd5b6119c285828601611861565b90969095509350505050565b600080600080604085870312156119e3578081fd5b843567ffffffffffffffff808211156119fa578283fd5b611a0688838901611861565b90965094506020870135915080821115611a1e578283fd5b50611a2b87828801611861565b95989497509550505050565b600060208284031215611a48578081fd5b815180151581146105e2578182fd5b600060808284031215611a68578081fd5b6040516080810181811067ffffffffffffffff82111715611a87578283fd5b604052611a9484846118aa565b8152611aa384602085016118aa565b602082015260408301516040820152606083015160608201528091505092915050565b600060208284031215611ad7578081fd5b5035919050565b600060208284031215611aef578081fd5b5051919050565b60008251815b81811015611b165760208186018101518583015201611afc565b81811115611b245782828501525b509190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152606081019190915260800190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015611c1557835183529284019291840191600101611bf9565b50909695505050505050565b73ffffffffffffffffffffffffffffffffffffffff9390931683526020830191909152604082015260600190565b6020808252601e908201527f4d6178696d756d20746f6b656e2062616c616e63652065786365656465640000604082015260600190565b60208082526024908201527f46656520646973747269627574696f6e20686173206e6f74207374617274656460408201527f2079657400000000000000000000000000000000000000000000000000000000606082015260800190565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff811681146102b157600080fdfea26469706673582212209a51080ef7195ce739746ca23f501c6240580d4514a704c2617480356521ab7764736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061011b5760003560e01c806382aa5ad4116100b2578063acbc142811610081578063ca31879d11610066578063ca31879d1461023b578063d3dc4ca11461024e578063de681faf146102615761011b565b8063acbc142814610220578063c2c4c5c1146102335761011b565b806382aa5ad4146101d2578063876e69a1146101da57806388720467146101ed578063905d10ac1461020d5761011b565b80633902b9bc116100ee5780633902b9bc146101865780634f3c5090146101995780637b8d6221146101ac5780638050a7ee146101bf5761011b565b806308b0308a1461012057806314866e081461013e5780632308805b14610153578063338b5dea14610173575b600080fd5b610128610274565b6040516101359190611b2f565b60405180910390f35b61015161014c3660046118bc565b610298565b005b6101666101613660046118bc565b6102b4565b6040516101359190611ce3565b610151610181366004611963565b610302565b6101516101943660046118bc565b61034e565b6101666101a7366004611ac6565b610361565b6101516101ba3660046119ce565b610373565b6101666101cd36600461192b565b610456565b61016661046b565b6101666101e83660046118bc565b610471565b6102006101fb3660046118d8565b6104af565b6040516101359190611bdd565b61015161021b36600461198e565b6105e9565b61016661022e3660046118bc565b61061e565b61015161065c565b61016661024936600461192b565b610676565b61016661025c366004611963565b6106b3565b61016661026f366004611963565b6106e8565b7f000000000000000000000000000000000000000000000000000000000000000090565b6102a061071d565b6102a981610736565b6102b1610c93565b50565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1690565b61030a61071d565b610315826000610c9a565b61033773ffffffffffffffffffffffffffffffffffffffff83163330846110c4565b610342826001610c9a565b61034a610c93565b5050565b61035661071d565b6102a9816001610c9a565b60009081526002602052604090205490565b61037b61071d565b6103858382611167565b8260005b81811015610446576103bc8686838181106103a057fe5b90506020020160208101906103b591906118bc565b6000610c9a565b61041333308686858181106103cd57fe5b905060200201358989868181106103e057fe5b90506020020160208101906103f591906118bc565b73ffffffffffffffffffffffffffffffffffffffff169291906110c4565b61043e86868381811061042257fe5b905060200201602081019061043791906118bc565b6001610c9a565b600101610389565b5050610450610c93565b50505050565b60006104628383611174565b90505b92915050565b60015490565b73ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205468010000000000000000900467ffffffffffffffff1690565b60606104b961071d565b7f0000000000000000000000000000000000000000000000000000000000000000421161051b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051290611c86565b60405180910390fd5b61052361120c565b61052c84610736565b8160608167ffffffffffffffff8111801561054657600080fd5b50604051908082528060200260200182016040528015610570578160200160208202803683370190505b50905060005b828110156105d65761058d8686838181106103a057fe5b6105b78787878481811061059d57fe5b90506020020160208101906105b291906118bc565b6113ac565b8282815181106105c357fe5b6020908102919091010152600101610576565b509150506105e2610c93565b9392505050565b6105f161071d565b8060005b818110156106145761060c84848381811061042257fe5b6001016105f5565b505061034a610c93565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205468010000000000000000900467ffffffffffffffff1690565b61066461071d565b61066c61120c565b610674610c93565b565b600061068061071d565b61068861120c565b610693826000610c9a565b61069c83610736565b60006106a884846113ac565b915050610465610c93565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600460209081526040808320938352929052205490565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600660209081526040808320938352929052205490565b61072f60026000541415610190611570565b6002600055565b6040517f010ae75700000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063010ae757906107ab908590600401611b2f565b60206040518083038186803b1580156107c357600080fd5b505afa1580156107d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fb9190611ade565b90508061080857506102b1565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600560205260408120805490916801000000000000000090910467ffffffffffffffff16908161088057610879857f00000000000000000000000000000000000000000000000000000000000000008661157e565b90506108c3565b6108894261169e565b82141561089957505050506102b1565b50815470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff165b806108cc575060015b6108d4611833565b6040517f28d09d4700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906328d09d47906109489089908690600401611bb7565b60806040518083038186803b15801561096057600080fd5b505afa158015610974573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109989190611a57565b905082610a0a576109d57f00000000000000000000000000000000000000000000000000000000000000006109d083604001516116aa565b6116ba565b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff821617855592505b610a12611833565b60005b6032811015610bf85742851115610a2b57610bf8565b82604001518510158015610a3f5750868411155b15610b535760018401935082915086841115610a875760405180608001604052806000600f0b81526020016000600f0b81526020016000815260200160008152509250610b4e565b6040517f28d09d4700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906328d09d4790610afb908b908890600401611bb7565b60806040518083038186803b158015610b1357600080fd5b505afa158015610b27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4b9190611a57565b92505b610bf0565b6000826040015186039050600081846020015102600f0b8460000151600f0b13610b7e576000610b8f565b81846020015102846000015103600f0b5b905080158015610b9e57508886115b15610bb557610bac426116aa565b96505050610bf8565b73ffffffffffffffffffffffffffffffffffffffff8a1660009081526006602090815260408083208a84529091529020555062093a80909401935b600101610a15565b505083546fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9290920167ffffffffffffffff90811670010000000000000000000000000000000002929092177fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff1668010000000000000000939092169290920217909155505050565b6001600055565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805490916801000000000000000090910467ffffffffffffffff169081610d7e57429150610cec4261169e565b83547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff919091161783557f00000000000000000000000000000000000000000000000000000000000000004211610d79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051290611c86565b610dd0565b814203905083610dd0576000610d938361169e565b610d9c4261169e565b14905060006201518042610daf426116aa565b03109050818015610dbe575080155b15610dcd57505050505061034a565b50505b82547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000004267ffffffffffffffff16021783556040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8716906370a0823190610e62903090600401611b2f565b60206040518083038186803b158015610e7a57600080fd5b505afa158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb29190611ade565b8454909150600090610eeb90839070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff166116d1565b905080610efc57505050505061034a565b6fffffffffffffffffffffffffffffffff821115610f46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051290611c4f565b84546fffffffffffffffffffffffffffffffff8084167001000000000000000000000000000000000291161785556000610f7f8561169e565b73ffffffffffffffffffffffffffffffffffffffff8916600090815260046020526040812091925090815b601481101561107c578362093a800192508242101561101a5786158015610fd057508742145b15610fee576000848152602083905260409020805486019055611015565b86884203860281610ffb57fe5b600086815260208590526040902080549290910490910190555b61107c565b8615801561102757508783145b1561104557600084815260208390526040902080548601905561106c565b8688840386028161105257fe5b600086815260208590526040902080549290910490910190555b9196508692508291600101610faa565b507f9b7f1a85a4c9b4e59e1b6527d9969c50cdfb3a1a467d0c4a51fb0ed8bf07f1308a85896040516110b093929190611c21565b60405180910390a150505050505050505050565b610450846323b872dd60e01b8585856040516024016110e593929190611b50565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526116df565b61034a8183146067611570565b73ffffffffffffffffffffffffffffffffffffffff808316600090815260076020908152604080832093851683529290529081205480156111b6579050610465565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260056020908152604080832054938716835260039091529020546112049167ffffffffffffffff90811691166116ba565b949350505050565b600154600061121a4261169e565b90508082111561122b575050610674565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c2c4c5c16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561129357600080fd5b505af11580156112a7573d6000803e3d6000fd5b5050505060005b60148110156113a557818311156112c4576113a5565b6040517fbd85b03900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063bd85b03990611336908690600401611ce3565b60206040518083038186803b15801561134e57600080fd5b505afa158015611362573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113869190611ade565b60008481526002602052604090205562093a80909201916001016112ae565b5050600155565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260408120816113dc8585611174565b82549091506000906114039068010000000000000000900467ffffffffffffffff1661169e565b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600460209081526040808320938b16835260069091528120929350909190805b60148110156114945784861061145557611494565b6000868152600260209081526040808320548683528184205492889052922054028161147d57fe5b62093a809790970196049190910190600101611440565b5073ffffffffffffffffffffffffffffffffffffffff808a166000908152600760209081526040808320938c1683529290522085905580156115645785546fffffffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216849003821602911617865561152673ffffffffffffffffffffffffffffffffffffffff89168a8361178c565b7fff097c7d8b1957a4ff09ef1361b5fb54dcede3941ba836d0beb9d10bec725de68989838860405161155b9493929190611b81565b60405180910390a15b98975050505050505050565b8161034a5761034a816117b0565b60008082815b60808110156116935781831061159957611693565b60028284018101046115a9611833565b6040517f28d09d4700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906328d09d479061161d908c908690600401611bb7565b60806040518083038186803b15801561163557600080fd5b505afa158015611649573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166d9190611a57565b90508781604001511161168257819450611689565b6001820393505b5050600101611584565b509095945050505050565b62093a80908190040290565b600061046562093a7f830161169e565b6000818310156116ca5781610462565b5090919050565b60006104628383600161181d565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516117089190611af6565b6000604051808303816000865af19150503d8060008114611745576040519150601f19603f3d011682016040523d82523d6000602084013e61174a565b606091505b50915091506000821415611762573d6000803e3d6000fd5b6104508151600014806117845750818060200190518101906117849190611a37565b6101a2611570565b6117ab8363a9059cbb60e01b84846040516024016110e5929190611bb7565b505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600061182c8484111583611570565b5050900390565b60405180608001604052806000600f0b81526020016000600f0b815260200160008152602001600081525090565b60008083601f840112611872578182fd5b50813567ffffffffffffffff811115611889578182fd5b60208301915083602080830285010111156118a357600080fd5b9250929050565b8051600f81900b811461046557600080fd5b6000602082840312156118cd578081fd5b81356105e281611cec565b6000806000604084860312156118ec578182fd5b83356118f781611cec565b9250602084013567ffffffffffffffff811115611912578283fd5b61191e86828701611861565b9497909650939450505050565b6000806040838503121561193d578182fd5b823561194881611cec565b9150602083013561195881611cec565b809150509250929050565b60008060408385031215611975578182fd5b823561198081611cec565b946020939093013593505050565b600080602083850312156119a0578182fd5b823567ffffffffffffffff8111156119b6578283fd5b6119c285828601611861565b90969095509350505050565b600080600080604085870312156119e3578081fd5b843567ffffffffffffffff808211156119fa578283fd5b611a0688838901611861565b90965094506020870135915080821115611a1e578283fd5b50611a2b87828801611861565b95989497509550505050565b600060208284031215611a48578081fd5b815180151581146105e2578182fd5b600060808284031215611a68578081fd5b6040516080810181811067ffffffffffffffff82111715611a87578283fd5b604052611a9484846118aa565b8152611aa384602085016118aa565b602082015260408301516040820152606083015160608201528091505092915050565b600060208284031215611ad7578081fd5b5035919050565b600060208284031215611aef578081fd5b5051919050565b60008251815b81811015611b165760208186018101518583015201611afc565b81811115611b245782828501525b509190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152606081019190915260800190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015611c1557835183529284019291840191600101611bf9565b50909695505050505050565b73ffffffffffffffffffffffffffffffffffffffff9390931683526020830191909152604082015260600190565b6020808252601e908201527f4d6178696d756d20746f6b656e2062616c616e63652065786365656465640000604082015260600190565b60208082526024908201527f46656520646973747269627574696f6e20686173206e6f74207374617274656460408201527f2079657400000000000000000000000000000000000000000000000000000000606082015260800190565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff811681146102b157600080fdfea26469706673582212209a51080ef7195ce739746ca23f501c6240580d4514a704c2617480356521ab7764736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/index.ts b/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/index.ts new file mode 100644 index 0000000..717c301 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { FeeDistributorDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as FeeDistributorDeployment; + + const args = [input.VotingEscrow, input.startTime]; + await task.deployAndVerify('FeeDistributor', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/input.ts b/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/input.ts new file mode 100644 index 0000000..8b33047 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/input.ts @@ -0,0 +1,21 @@ +import { Task, TaskMode } from '@src'; + +export type FeeDistributorDeployment = { + VotingEscrow: string; + startTime: number; +}; + +const VotingEscrow = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); + +export default { + VotingEscrow, + mainnet: { + startTime: 1649894400, // Thursday, April 14, 2022 00:00:00 UTC + }, + goerli: { + startTime: 1654732800, // Thursday, June 9, 2022 00:00:00 UTC + }, + kovan: { + startTime: 1654732800000, // Thursday, June 9, 2022 00:00:00 UTC + }, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/output/goerli.json new file mode 100644 index 0000000..c376815 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/output/goerli.json @@ -0,0 +1,3 @@ +{ + "FeeDistributor": "0x7F91dcdE02F72b478Dc73cB21730cAcA907c8c44" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/output/kovan.json b/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/output/kovan.json new file mode 100644 index 0000000..bfd2fd8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/output/kovan.json @@ -0,0 +1,3 @@ +{ + "FeeDistributor": "0xcC508a455F5b0073973107Db6a878DdBDab957bC" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/output/mainnet.json new file mode 100644 index 0000000..1785857 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "FeeDistributor": "0x26743984e3357eFC59f2fd6C1aFDC310335a61c9" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/readme.md b/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/readme.md new file mode 100644 index 0000000..b637a1c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/readme.md @@ -0,0 +1,13 @@ +# 2022-04-20 - Fee Distributor + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This distributor has been deprecated due to issues related to multiple checkpoints. Use this [updated version](../../20220714-fee-distributor-v2) instead. + +Deployment of `FeeDistributor`, responsible for distributing tokens to veBAL holders. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`FeeDistributor` artifact](./artifact/FeeDistributor.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/test/test.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/test/test.fork.ts new file mode 100644 index 0000000..7bdfae5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220420-fee-distributor/test/test.fork.ts @@ -0,0 +1,171 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; + +import { fp } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { advanceToTimestamp, currentWeekTimestamp, DAY, WEEK } from '@helpers/time'; +import * as expectEvent from '@helpers/expectEvent'; +import { expectTransferEvent } from '@helpers/expectTransfer'; + +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; + +describeForkTest('FeeDistributor', 'mainnet', 14623150, function () { + let veBALHolder: SignerWithAddress, veBALHolder2: SignerWithAddress, feeCollector: SignerWithAddress; + let distributor: Contract; + + let VEBAL: Contract, BAL: Contract, WETH: Contract; + + let task: Task; + + const VEBAL_HOLDER = '0xCB3593C7c0dFe13129Ff2B6add9bA402f76c797e'; + const VEBAL_HOLDER_2 = '0x49a2dcc237a65cc1f412ed47e0594602f6141936'; + const PROTOCOL_FEE_COLLECTOR = '0xce88686553686da562ce7cea497ce749da109f9f'; + + const BAL_ADDRESS = '0xba100000625a3754423978a60c9317c58a424e3D'; + const WETH_ADDRESS = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'; + + const balAmount = fp(42); + const wethAmount = fp(13.37); + + let firstWeek: BigNumber; + + before('run task', async () => { + task = new Task('20220420-fee-distributor', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + distributor = await task.instanceAt('FeeDistributor', task.output({ network: 'test' }).FeeDistributor); + }); + + before('setup accounts', async () => { + veBALHolder = await impersonate(VEBAL_HOLDER); + veBALHolder2 = await impersonate(VEBAL_HOLDER_2); + feeCollector = await impersonate(PROTOCOL_FEE_COLLECTOR); + }); + + before('setup contracts', async () => { + const veBALTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + VEBAL = await veBALTask.instanceAt('VotingEscrow', await veBALTask.output({ network: 'mainnet' }).VotingEscrow); + + // We reuse this task as it contains an ABI similar to the one in real ERC20 tokens + const testBALTokenTask = new Task('20220325-test-balancer-token', TaskMode.READ_ONLY, getForkedNetwork(hre)); + BAL = await testBALTokenTask.instanceAt('TestBalancerToken', BAL_ADDRESS); + WETH = await testBALTokenTask.instanceAt('TestBalancerToken', WETH_ADDRESS); + }); + + context('in the first week', () => { + before(async () => { + firstWeek = await currentWeekTimestamp(); + }); + + context('with BAL distributed', () => { + before('send BAL to distribute', async () => { + await BAL.connect(feeCollector).approve(distributor.address, balAmount); + await distributor.connect(feeCollector).depositToken(BAL.address, balAmount); + }); + + it('veBAL holders cannot yet claim tokens', async () => { + const balancesBefore = await Promise.all([BAL, WETH].map((token) => token.balanceOf(veBALHolder.address))); + const tx = await distributor.claimTokens(veBALHolder.address, [BAL.address, WETH.address]); + const balancesAfter = await Promise.all([BAL, WETH].map((token) => token.balanceOf(veBALHolder.address))); + + expectEvent.notEmitted(await tx.wait(), 'TokensClaimed'); + + expect(balancesAfter).to.deep.equal(balancesBefore); + }); + }); + }); + + context('in the second week', () => { + before('advance time', async () => { + // 1 day into the second week + await advanceToTimestamp(firstWeek.add(WEEK).add(DAY)); + }); + + context('with WETH distributed', () => { + before('send BAL to distribute', async () => { + await BAL.connect(feeCollector).approve(distributor.address, balAmount.mul(3)); + await distributor.connect(feeCollector).depositToken(BAL.address, balAmount.mul(3)); + }); + + before('send WETH to distribute', async () => { + await WETH.connect(feeCollector).approve(distributor.address, wethAmount); + await distributor.connect(feeCollector).depositToken(WETH.address, wethAmount); + }); + + it('veBAL holders can claim BAL and not WETH', async () => { + const holderFirstWeekBalance = await VEBAL['balanceOf(address,uint256)'](veBALHolder.address, firstWeek); + const firstWeekSupply = await VEBAL['totalSupply(uint256)'](firstWeek); + const expectedBALAmount = balAmount.mul(holderFirstWeekBalance).div(firstWeekSupply); + + const wethBalanceBefore = await WETH.balanceOf(veBALHolder.address); + const tx = await distributor.claimTokens(veBALHolder.address, [BAL.address, WETH.address]); + const wethBalanceAfter = await WETH.balanceOf(veBALHolder.address); + + expectTransferEvent( + await tx.wait(), + { from: distributor.address, to: veBALHolder.address, value: expectedBALAmount }, + BAL.address + ); + expect(wethBalanceAfter).to.equal(wethBalanceBefore); + }); + }); + }); + + context('in the third week', () => { + before('advance time', async () => { + // 1 day into the third week + await advanceToTimestamp(firstWeek.add(2 * WEEK).add(DAY)); + }); + + it('veBAL holders can claim BAL and WETH', async () => { + const secondWeek = firstWeek.add(WEEK); + const holderSecondWeekBalance = await VEBAL['balanceOf(address,uint256)'](veBALHolder.address, secondWeek); + const secondWeekSupply = await VEBAL['totalSupply(uint256)'](secondWeek); + + const expectedBALAmount = balAmount.mul(3).mul(holderSecondWeekBalance).div(secondWeekSupply); + const expectedWETHAmount = wethAmount.mul(holderSecondWeekBalance).div(secondWeekSupply); + + const tx = await distributor.claimTokens(veBALHolder.address, [BAL.address, WETH.address]); + + expectTransferEvent( + await tx.wait(), + { from: distributor.address, to: veBALHolder.address, value: expectedBALAmount }, + BAL.address + ); + + expectTransferEvent( + await tx.wait(), + { from: distributor.address, to: veBALHolder.address, value: expectedWETHAmount }, + WETH.address + ); + }); + + it('veBAL holders can claim all the BAL and WETH at once', async () => { + const holderFirstWeekBalance = await VEBAL['balanceOf(address,uint256)'](veBALHolder2.address, firstWeek); + const firstWeekSupply = await VEBAL['totalSupply(uint256)'](firstWeek); + const balFirstWeekAmount = balAmount.mul(holderFirstWeekBalance).div(firstWeekSupply); + + const secondWeek = firstWeek.add(WEEK); + const holderSecondWeekBalance = await VEBAL['balanceOf(address,uint256)'](veBALHolder2.address, secondWeek); + const secondWeekSupply = await VEBAL['totalSupply(uint256)'](secondWeek); + const balSecondWeekAmount = balAmount.mul(3).mul(holderSecondWeekBalance).div(secondWeekSupply); + + const expectedBALAmount = balFirstWeekAmount.add(balSecondWeekAmount); + const expectedWETHAmount = wethAmount.mul(holderSecondWeekBalance).div(secondWeekSupply); + + const tx = await distributor.claimTokens(veBALHolder2.address, [BAL.address, WETH.address]); + + expectTransferEvent( + await tx.wait(), + { from: distributor.address, to: veBALHolder2.address, value: expectedBALAmount }, + BAL.address + ); + + expectTransferEvent( + await tx.wait(), + { from: distributor.address, to: veBALHolder2.address, value: expectedWETHAmount }, + WETH.address + ); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/artifact/UnbuttonAaveLinearPool.json b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/artifact/UnbuttonAaveLinearPool.json new file mode 100644 index 0000000..4616f5a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/artifact/UnbuttonAaveLinearPool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IUnbuttonToken", "name": "mainToken", "type": "address"}, {"internalType": "contract IUnbuttonToken", "name": "wrappedToken", "type": "address"}, {"internalType": "uint256", "name": "upperTarget", "type": "uint256"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "address", "name": "owner", "type": "address"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "lowerTarget", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "upperTarget", "type": "uint256"}], "name": "TargetsSet", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getBptIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMainIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMainToken", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getScalingFactors", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getTargets", "outputs": [{"internalType": "uint256", "name": "lowerTarget", "type": "uint256"}, {"internalType": "uint256", "name": "upperTarget", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVirtualSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedToken", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedTokenRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "indexIn", "type": "uint256"}, {"internalType": "uint256", "name": "indexOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "bytes", "name": "poolConfig", "type": "bytes"}], "name": "setAssetManagerPoolConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bool", "name": "paused", "type": "bool"}], "name": "setPaused", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "newLowerTarget", "type": "uint256"}, {"internalType": "uint256", "name": "newUpperTarget", "type": "uint256"}], "name": "setTargets", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/artifact/UnbuttonAaveLinearPoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/artifact/UnbuttonAaveLinearPoolFactory.json new file mode 100644 index 0000000..4a28ae8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/artifact/UnbuttonAaveLinearPoolFactory.json @@ -0,0 +1,165 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "UnbuttonAaveLinearPoolFactory", + "sourceName": "contracts/button-wood/UnbuttonAaveLinearPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IUnbuttonToken", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IUnbuttonToken", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract LinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101406040523480156200001257600080fd5b5060405162005fdd38038062005fdd8339810160408190526200003591620001c3565b80604051806020016200004890620001b5565b601f1982820381018352601f909101166040528051819060006002820460a081905280830360e0819052818552909150836200009081620000f9602090811b620002eb17901c565b60601b6001600160601b0319166080528285018051838252620000bf82620000f9602090811b620002eb17901c565b6001600160601b0319606091821b811660c0529690935290529590951b90911661010052505050426276a700016101205250620001f39050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001476001600160a01b03831615156101ac6200014d565b50919050565b816200015e576200015e8162000162565b5050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6154758062000b6883390190565b600060208284031215620001d5578081fd5b81516001600160a01b0381168114620001ec578182fd5b9392505050565b60805160601c60a05160c05160601c60e0516101005160601c61012051610913620002556000398061023852806102615250806102c952508061035252508061014a52806103ce52508061037352508061012952806103aa52506109136000f3fe608060405234801561001057600080fd5b50600436106100715760003560e01c80632da47c40116100505780632da47c40146100ca5780636634b753146100e05780638d928af81461010057610071565b8062c194db14610076578063174481fa146100945780632ccb254a146100aa575b600080fd5b61007e610108565b60405161008b91906107f0565b60405180910390f35b61009c610127565b60405161008b9291906107be565b6100bd6100b83660046106a7565b61016d565b60405161008b9190610803565b6100d2610232565b60405161008b9291906108aa565b6100f36100ee36600461068b565b61029c565b60405161008b91906107e5565b6100bd6102c7565b60606101226040518060200160405280600081525061034a565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080600061017a610232565b9150915060006101c161018b6102c7565b8c8c8c8c8c8c8a8a8e6040516020016101ad9a99989796959493929190610824565b604051602081830303815290604052610423565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561020b57600080fd5b505af115801561021f573d6000803e3d6000fd5b50929d9c50505050505050505050505050565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561028e57807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610297565b60009250600091505b509091565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061034473ffffffffffffffffffffffffffffffffffffffff831615156101ac6104ae565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016104158183866104c0565b505050505050505050919050565b60008061042f8361053a565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b816104bc576104bc81610582565b5050565b5b602081106104fe5781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016104c1565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600060606105478361034a565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811661057b573d6000803e3d6000fd5b9392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600082601f8301126105ff578081fd5b813567ffffffffffffffff80821115610616578283fd5b60405160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501168201018181108382111715610654578485fd5b60405282815292508284830160200186101561066f57600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121561069c578081fd5b813561057b816108b8565b600080600080600080600060e0888a0312156106c1578283fd5b873567ffffffffffffffff808211156106d8578485fd5b6106e48b838c016105ef565b985060208a01359150808211156106f9578485fd5b506107068a828b016105ef565b9650506040880135610717816108b8565b94506060880135610727816108b8565b93506080880135925060a0880135915060c0880135610745816108b8565b8091505092959891949750929550565b60008151808452815b8181101561077a5760208185018101518683018201520161075e565b8181111561078b5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b60006020825261057b6020830184610755565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600061014073ffffffffffffffffffffffffffffffffffffffff808e1684528160208501526108558285018e610755565b91508382036040850152610869828d610755565b9a811660608501529889166080840152505060a081019590955260c085019390935260e0840191909152610100830152909116610120909101529392505050565b918252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff811681146108da57600080fd5b5056fea264697066735822122075c5d37a50e2e532aa33048ffa2178e8ee6aa74ac232c5bf619c34b61ade4f6c64736f6c634300070100336102a06040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b5060405162005475380380620054758339810160408190526200005a9162000c21565b898989898989898989898960008a8a620000768b8b3062000543565b6040805160038082526080820190925290602082016060803683370190505089898989828289898d8280604051806040016040528060018152602001603160f81b81525085858a336001600160a01b031660001b806080818152505050806001600160a01b031660a0816001600160a01b031660601b815250505081600390805190602001906200010992919062000a92565b5080516200011f90600490602084019062000a92565b505060058054601260ff1990911617905550815160209283012060c052805191012060e052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6101005260601b6001600160601b03191661014052506200019290506276a70083111561019462000612565b620001a662278d0082111561019562000612565b4290910161016081905201610180528551620001c8906002111560c862000612565b620001e2620001d662000627565b8751111560c962000612565b620001f8866200062c60201b620014881760201c565b620002038462000638565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f9062000234908d9060040162000dbf565b602060405180830381600087803b1580156200024f57600080fd5b505af115801562000264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028a919062000c08565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002bf9084908b908b9060040162000d23565b600060405180830381600087803b158015620002da57600080fd5b505af1158015620002ef573d6000803e3d6000fd5b50505050806101a081815250505050505050505050505050866001600160a01b03166101c0816001600160a01b031660601b81525050856001600160a01b03166101e0816001600160a01b031660601b8152505060008060006200035b8a8a30620006c460201b60201c565b610200819052610220839052610240829052919450925090506200037f8a620007ba565b610260526200038e89620007ba565b610280526000620003a18b828b6200088e565b50505050505050505050505050506000876001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015620003eb57600080fd5b505afa15801562000400573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000426919062000be2565b90506000876001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156200046457600080fd5b505afa15801562000479573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200049f919062000be2565b6001600160a01b031663b16a19de6040518163ffffffff1660e01b815260040160206040518083038186803b158015620004d857600080fd5b505afa158015620004ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000513919062000be2565b9050620005316001600160a01b038381169083161461020862000612565b50505050505050505050505062000e0d565b60606000808062000556878787620006c4565b60408051600380825260808201909252939650919450925060208201606080368337019050509350868484815181106200058c57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505085848381518110620005ba57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084848281518110620005e857fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505050509392505050565b81620006235762000623816200093c565b5050565b600390565b8062000623816200098f565b6200064d64e8d4a5100082101560cb62000612565b6200066567016345785d8a000082111560ca62000612565b620006848160c060085462000a1c60201b62001492179092919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90620006b990839062000dd4565b60405180910390a150565b6000806000846001600160a01b0316866001600160a01b031610156200074d57836001600160a01b0316856001600160a01b0316101562000710575060009150600190506002620007b1565b836001600160a01b0316866001600160a01b031610156200073c575060009150600290506001620007b1565b5060019150600290506000620007b1565b846001600160a01b0316846001600160a01b0316101562000779575060029150600190506000620007b1565b856001600160a01b0316846001600160a01b03161015620007a5575060029150600090506001620007b1565b50600191506000905060025b93509350939050565b60006001600160a01b038216301415620007de5750670de0b6b3a764000062000889565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200081a57600080fd5b505afa1580156200082f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000855919062000d00565b60ff16905060006200087460128362000a3160201b620014a81760201c565b905080600a0a670de0b6b3a764000002925050505b919050565b6200089f8183111561014c62000612565b620008b76001600160601b0382111561014d62000612565b620008f2620008d382606062000a4e60201b620014be1760201c565b620008eb84600062000a4e60201b620014be1760201c565b1762000a52565b826001600160a01b03167fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d128083836040516200092f92919062000ddd565b60405180910390a2505050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600281511015620009a05762000a19565b600081600081518110620009b057fe5b602002602001015190506000600190505b825181101562000a16576000838281518110620009da57fe5b6020026020010151905062000a0b816001600160a01b0316846001600160a01b03161060656200061260201b60201c565b9150600101620009c1565b50505b50565b6001600160401b03811b1992909216911b1790565b600062000a4383831115600162000612565b508082035b92915050565b1b90565b62000a7181600060085462000a7760201b620014c2179092919060201c565b60085550565b6001600160c01b03828116821b90821b198416179392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000ad557805160ff191683800117855562000b05565b8280016001018555821562000b05579182015b8281111562000b0557825182559160200191906001019062000ae8565b5062000b1392915062000b17565b5090565b5b8082111562000b13576000815560010162000b18565b805162000a488162000df7565b600082601f83011262000b4c578081fd5b81516001600160401b038082111562000b63578283fd5b6040516020601f8401601f191682018101838111838210171562000b85578586fd5b8060405250819450838252868185880101111562000ba257600080fd5b600092505b8383101562000bc6578583018101518284018201529182019162000ba7565b8383111562000bd85760008185840101525b5050505092915050565b60006020828403121562000bf4578081fd5b815162000c018162000df7565b9392505050565b60006020828403121562000c1a578081fd5b5051919050565b6000806000806000806000806000806101408b8d03121562000c41578586fd5b62000c4d8c8c62000b2e565b60208c0151909a506001600160401b038082111562000c6a578788fd5b62000c788e838f0162000b3b565b9a5060408d015191508082111562000c8e578788fd5b5062000c9d8d828e0162000b3b565b98505062000caf8c60608d0162000b2e565b965062000cc08c60808d0162000b2e565b955060a08b0151945060c08b0151935060e08b015192506101008b0151915062000cef8c6101208d0162000b2e565b90509295989b9194979a5092959850565b60006020828403121562000d12578081fd5b815160ff8116811462000c01578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000d6f5762000d5c855162000deb565b8352938301939183019160010162000d47565b505084810360408601528551808252908201925081860190845b8181101562000db15762000d9e835162000deb565b8552938301939183019160010162000d89565b509298975050505050505050565b602081016003831062000dce57fe5b91905290565b90815260200190565b918252602082015260400190565b6001600160a01b031690565b6001600160a01b038116811462000a1957600080fd5b60805160a05160601c60c05160e05161010051610120516101405160601c61016051610180516101a0516101c05160601c6101e05160601c610200516102205161024051610260516102805161449b62000fda6000398061159c525080611538528061241f5250806107c65280610b7952806115c452806127c452806129745280612acb5280612c3d5280612dd95280612f305250806109745280610b3f528061155a5280611c0d528061279052806128f952806129405280612a555280612a975280612c095280612d635280612da55280612eba5280612efc525080610bba5280610d895280610e7652806114095280611605528061236452806127fb52806129ab5280612b025280612c745280612e105280612f67528061314c528061318452508061145c528061172052806117ec5280612445528061274552806128855280612bbf5280612cef525080610998528061101552806116d752806117a35280611c4352806123e45280612706528061282752806129e15280612b805280612ca05280612e465250806109155250806119cc5250806119a8525080610f365250806110cb525080611ad2525080611b14525080611af3525080610f12525080610e9c525061449b6000f3fe608060405234801561001057600080fd5b50600436106102d35760003560e01c8063679aefce1161018657806395d89b41116100e3578063d505accf11610097578063de82cd3411610071578063de82cd341461056b578063f174e24114610573578063f5431aa81461057b576102d3565b8063d505accf14610532578063d5c096c414610545578063dd62ed3e14610558576102d3565b8063a457c2d7116100c8578063a457c2d714610504578063a9059cbb14610517578063aaabadc51461052a576102d3565b806395d89b41146104e95780639f11080e146104f1576102d3565b806382687a561161013a57806387ec68171161011f57806387ec6817146104c6578063893d20e8146104d95780638d928af8146104e1576102d3565b806382687a56146104ab578063851c1bb3146104b3576102d3565b806374f3b0091161016b57806374f3b0091461046f5780637ecebe00146104905780638129fc1c146104a3576102d3565b8063679aefce1461045457806370a082311461045c576102d3565b80633644e515116102345780634de046d5116101e857806355c67628116101cd57806355c67628146104155780636028bfd41461041d57806363fe3b561461043e576102d3565b80634de046d5146103ed57806350dd6ed914610402576102d3565b806338fff2d01161021957806338fff2d0146103ca57806339509351146103d25780634d64cd74146103e5576102d3565b80633644e515146103af57806338e9922e146103b7576102d3565b806318160ddd1161028b5780631dd746ea116102705780631dd746ea1461037257806323b872dd14610387578063313ce5671461039a576102d3565b806318160ddd146103535780631c0de0511461035b576102d3565b8063095ea7b3116102bc578063095ea7b31461031657806316b8d6ff1461033657806316c38b3c1461033e576102d3565b806301ec954a146102d857806306fdde0314610301575b600080fd5b6102eb6102e6366004613ecf565b610583565b6040516102f891906141ef565b60405180910390f35b6103096106f9565b6040516102f891906143a7565b610329610324366004613c0c565b6107ad565b6040516102f891906141cc565b6102eb6107c4565b61035161034c366004613d03565b6107e8565b005b6102eb6107fc565b610363610802565b6040516102f8939291906141d7565b61037a61082b565b6040516102f89190614194565b610329610395366004613b57565b61083a565b6103a26108ce565b6040516102f891906143e1565b6102eb6108d7565b6103516103c5366004613fee565b6108e1565b6102eb610913565b6103296103e0366004613c0c565b610937565b6102eb610972565b6103f5610996565b6040516102f89190614180565b610351610410366004613e3a565b6109ba565b6102eb6109d8565b61043061042b366004613d3b565b6109e9565b6040516102f89291906143ba565b610446610a20565b6040516102f89291906143d3565b6102eb610a4e565b6102eb61046a366004613b03565b610c02565b61048261047d366004613d3b565b610c21565b6040516102f89291906141a7565b6102eb61049e366004613b03565b610c9f565b610351610cba565b6102eb610e74565b6102eb6104c1366004613dde565b610e98565b6104306104d4366004613d3b565b610eea565b6103f5610f10565b6103f5610f34565b610309610f58565b6103516104ff36600461401e565b610fd7565b610329610512366004613c0c565b611041565b610329610525366004613c0c565b61107f565b6103f561108c565b610351610540366004613b97565b611096565b610482610553366004613d3b565b6111df565b6102eb610566366004613b1f565b611310565b6102eb61136b565b6103f561145a565b6102eb61147e565b600084608001516105b0610595610f34565b6001600160a01b0316336001600160a01b03161460cd6114ee565b6105c56105bb610913565b82146101f46114ee565b6105cd6114fc565b6105e76003851080156105e05750600384105b60646114ee565b60606105f1611511565b90506105fd868261163e565b600080610608610a20565b9150915061061461395a565b60405180606001604052806106276109d8565b815260208101859052604001839052905060008a51600181111561064757fe5b14156106ab5761066e8a60600151858a8151811061066157fe5b602002602001015161169f565b60608b015260006106808b8b846116ab565b905061069f81868a8151811061069257fe5b6020026020010151611772565b965050505050506106f0565b6106bf8a6060015185898151811061066157fe5b60608b015260006106d18b8b8461177e565b905061069f81868b815181106106e357fe5b6020026020010151611833565b50949350505050565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107a35780601f10610778576101008083540402835291602001916107a3565b820191906000526020600020905b81548152906001019060200180831161078657829003601f168201915b5050505050905090565b60006107ba33848461183f565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6107f06118a7565b6107f9816118ed565b50565b60025490565b600080600061080f611989565b15925061081a6119a6565b91506108246119ca565b9050909192565b6060610835611511565b905090565b6000806108478533611310565b905061086b336001600160a01b03871614806108635750838210155b61019e6114ee565b6108768585856119ee565b336001600160a01b038616148015906108af57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114155b156108c1576108c1853385840361183f565b60019150505b9392505050565b60055460ff1690565b6000610835611ace565b6000806108ec610a20565b915091506109056108fd8383611b6b565b61014f6114ee565b61090e83611c83565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916107ba91859061096d9086611c9c565b61183f565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6109c26118a7565b6109ca6114fc565b6109d48282611cae565b5050565b6008546000906108359060c0611d8e565b600060606109ff86516109fa611d9c565b611da1565b610a1489898989898989611dae611e52611eb3565b97509795505050505050565b6000806000610a2d612043565b9050610a3a816000612049565b9250610a47816060612049565b9150509091565b600080610a59610913565b90506060610a65610f34565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610a9091906141ef565b60006040518083038186803b158015610aa857600080fd5b505afa158015610abc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ae49190810190613c37565b50915050610af981610af4611511565b61163e565b600080610b04610a20565b91509150610b1061395a565b6040518060600160405280610b236109d8565b81526020018481526020018381525090506000610baf610b76867f000000000000000000000000000000000000000000000000000000000000000081518110610b6857fe5b60200260200101518461205b565b867f000000000000000000000000000000000000000000000000000000000000000081518110610ba257fe5b60200260200101516120bc565b9050610bf7610bf0867f000000000000000000000000000000000000000000000000000000000000000081518110610be357fe5b60200260200101516120c8565b82906120db565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610c30610595610f34565b610c3b6105bb610913565b6060610c45611511565b9050610c51888261163e565b6000606080610c668e8e8e8e8e8e8a8f611dae565b925092509250610c768d84612132565b610c808285611e52565b610c8a8185611e52565b909550935050505b5097509795505050505050565b6001600160a01b031660009081526006602052604090205490565b6000610cc4610913565b90506060610cd0610f34565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610cfb91906141ef565b60006040518083038186803b158015610d1357600080fd5b505afa158015610d27573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d4f9190810190613c37565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff817f000000000000000000000000000000000000000000000000000000000000000081518110610db257fe5b602002602001018181525050610dc661397b565b6040518060800160405280610dda8561213c565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610e0b610f34565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610e3c9493929190614217565b600060405180830381600087803b158015610e5657600080fd5b505af1158015610e6a573d6000803e3d6000fd5b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610ecd92919061410a565b604051602081830303815290604052805190602001209050919050565b60006060610efb86516109fa611d9c565b610a148989898989898961213f61215d611eb3565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107a35780601f10610778576101008083540402835291602001916107a3565b610fdf6118a7565b600080610fea610a20565b91509150610ffb6108fd8383611b6b565b6110106110088585611b6b565b6101576114ee565b61103b7f000000000000000000000000000000000000000000000000000000000000000085856121be565b50505050565b60008061104e3385611310565b9050808310611068576110633385600061183f565b611075565b611075338585840361183f565b5060019392505050565b60006107ba3384846119ee565b600061083561224f565b6110a48442111560d16114ee565b6001600160a01b03871660009081526006602090815260408083205490519092916110fb917f0000000000000000000000000000000000000000000000000000000000000000918c918c918c9188918d91016142f9565b604051602081830303815290604052805190602001209050600061111e826122c9565b90506000600182888888604051600081526020016040526040516111459493929190614389565b6020604051602081039080840390855afa158015611167573d6000803e3d6000fd5b5050604051601f19015191506111a990506001600160a01b038216158015906111a157508b6001600160a01b0316826001600160a01b0316145b6101f86114ee565b6001600160a01b038b1660009081526006602052604090206001850190556111d28b8b8b61183f565b5050505050505050505050565b606080886111ee610595610f34565b6111f96105bb610913565b6060611203611511565b905061120d6107fc565b6112c057600060606112228d8d8d868b6122e5565b9150915061123b6112316123a6565b83101560cc6114ee565b61124d60006112486123a6565b6123ab565b6112608b6112596123a6565b84036123ab565b61126a818461215d565b80611273611d9c565b67ffffffffffffffff8111801561128957600080fd5b506040519080825280602002602001820160405280156112b3578160200160208202803683370190505b5095509550505050610c92565b6112ca888261163e565b60006060806112df8e8e8e8e8e8e8a8f61213f565b9250925092506112ef8c846123ab565b6112f9828561215d565b6113038185611e52565b9095509350610c92915050565b600061131a610f34565b6001600160a01b0316826001600160a01b0316141561135a57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6107be565b61136483836123b5565b90506107be565b60006060611377610f34565b6001600160a01b031663f94d466861138d610913565b6040518263ffffffff1660e01b81526004016113a991906141ef565b60006040518083038186803b1580156113c157600080fd5b505afa1580156113d5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113fd9190810190613c37565b509150506000611448827f00000000000000000000000000000000000000000000000000000000000000008151811061143257fe5b6020026020010151611443306123e0565b61169f565b9050611453816124ba565b9250505090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108356124ce565b806109d4816125e3565b67ffffffffffffffff811b1992909216911b1790565b60006114b88383111560016114ee565b50900390565b1b90565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116821b90821b198416179392505050565b816109d4576109d48161265c565b61150f611507611989565b6101926114ee565b565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f00000000000000000000000000000000000000000000000000000000000000008151811061158357fe5b6020026020010181815250506115c161159a6124ce565b7f0000000000000000000000000000000000000000000000000000000000000000906126c9565b817f0000000000000000000000000000000000000000000000000000000000000000815181106115ed57fe5b602002602001018181525050670de0b6b3a7640000817f00000000000000000000000000000000000000000000000000000000000000008151811061162e57fe5b6020908102919091010152905090565b60005b611649611d9c565b81101561090e5761168083828151811061165f57fe5b602002602001015183838151811061167357fe5b60200260200101516126c9565b83828151811061168c57fe5b6020908102919091010152600101611641565b60006108c783836126c9565b60208301516000906001600160a01b03163014156116d5576116ce8484846126ff565b90506108c7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b0316141561171e576116ce84848461287e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415611767576116ce8484846129da565b6108c761013561265c565b60006108c78383612b31565b60408301516000906001600160a01b03163014156117a1576116ce848484612b79565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156117ea576116ce848484612ce8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b03161415611767576116ce848484612e3f565b60006108c783836120db565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061189a9085906141ef565b60405180910390a3505050565b60006118d66000357fffffffff0000000000000000000000000000000000000000000000000000000016610e98565b90506107f96118e58233612f96565b6101916114ee565b801561190d576119086118fe6119a6565b42106101936114ee565b611922565b6119226119186119ca565b42106101a96114ee565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be649061197e9083906141cc565b60405180910390a150565b60006119936119ca565b42118061083557505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b611a056001600160a01b03841615156101986114ee565b611a1c6001600160a01b03831615156101996114ee565b611a2783838361090e565b6001600160a01b038316600090815260208190526040902054611a4d90826101a061307f565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611a7c9082611c9c565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061189a9085906141ef565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611b3b613095565b30604051602001611b5095949392919061432d565b60405160208183030381529060405280519060200120905090565b600080611b76610913565b90506060611b82610f34565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401611bad91906141ef565b60006040518083038186803b158015611bc557600080fd5b505afa158015611bd9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c019190810190613c37565b509150506000611c67827f000000000000000000000000000000000000000000000000000000000000000081518110611c3657fe5b60200260200101516114437f00000000000000000000000000000000000000000000000000000000000000006123e0565b9050858110158015611c795750848111155b9695505050505050565b611c8b6118a7565b611c936114fc565b6107f981613099565b60008282016108c784821015836114ee565b6000611cb8610913565b90506000611cc4610f34565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b8152600401611cf1929190614372565b60806040518083038186803b158015611d0957600080fd5b505afa158015611d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d41919061403f565b6040517f18e736d40000000000000000000000000000000000000000000000000000000081529094506001600160a01b03851693506318e736d49250610e3c915085908790600401614359565b1c67ffffffffffffffff1690565b600390565b6109d481831460676114ee565b60006060806000611dbe85613104565b90506000818015611dcb57fe5b14611de057611ddb61014e61265c565b611e43565b611de861311a565b611df2898661312e565b9094509250611dff611d9c565b67ffffffffffffffff81118015611e1557600080fd5b50604051908082528060200260200182016040528015611e3f578160200160208202803683370190505b5091505b50985098509895505050505050565b60005b611e5d611d9c565b81101561090e57611e94838281518110611e7357fe5b6020026020010151838381518110611e8757fe5b6020026020010151612b31565b838281518110611ea057fe5b6020908102919091010152600101611e55565b333014611fa2576000306001600160a01b0316600036604051611ed792919061413a565b6000604051808303816000865af19150503d8060008114611f14576040519150601f19603f3d011682016040523d82523d6000602084013e611f19565b606091505b505090508060008114611f2857fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611f84573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b6060611fac611511565b9050611fb8878261163e565b60006060611fd08c8c8c8c8c8c898d8d63ffffffff16565b5091509150611fe381848663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08301526020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b60085490565b1c6bffffffffffffffffffffffff1690565b60008160200151831015612094578151602083015160009161208091869003906126c9565b905061208c84826114a8565b9150506107be565b816040015183116120a65750816107be565b81516040830151600091612080918603906126c9565b60006108c78383611c9c565b6dffffffffffffffffffffffffffff0390565b60006120ea82151560046114ee565b826120f7575060006107be565b670de0b6b3a76400008381029061211a9085838161211157fe5b041460056114ee565b82600182038161212657fe5b046001019150506107be565b6109d482826131b5565b90565b600060608061214f61014e61265c565b985098509895505050505050565b60005b612168611d9c565b81101561090e5761219f83828151811061217e57fe5b602002602001015183838151811061219257fe5b60200260200101516120db565b8382815181106121ab57fe5b6020908102919091010152600101612160565b6121cd8183111561014c6114ee565b6121e86bffffffffffffffffffffffff82111561014d6114ee565b6122076121f68260606114be565b6122018460006114be565b17613271565b826001600160a01b03167fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d128083836040516122429291906143d3565b60405180910390a2505050565b6000612259610f34565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561229157600080fd5b505afa1580156122a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108359190613e1e565b60006122d3611ace565b82604051602001610ecd92919061414a565b600060606122f16114fc565b6123086001600160a01b03871630146101566114ee565b61231f6001600160a01b03861630146101566114ee565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff817f00000000000000000000000000000000000000000000000000000000000000008151811061238d57fe5b6020908102919091010152909890975095505050505050565b600090565b6109d48282613286565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561244357507f0000000000000000000000000000000000000000000000000000000000000000610c1c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561248f5761248861159a6124ce565b9050610c1c565b6001600160a01b0382163014156124af5750670de0b6b3a7640000610c1c565b610c1c61013561265c565b60006107be826124c86107fc565b906114a8565b6000806124d961145a565b6001600160a01b031663aab3b7db670de0b6b3a76400006040518263ffffffff1660e01b815260040161250c91906141ef565b60206040518083038186803b15801561252457600080fd5b505afa158015612538573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061255c9190614006565b90506000612568610996565b6001600160a01b031663ed0287c0836040518263ffffffff1660e01b815260040161259391906141ef565b60206040518083038186803b1580156125ab57600080fd5b505afa1580156125bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114539190614006565b6002815110156125f2576107f9565b60008160008151811061260157fe5b602002602001015190506000600190505b825181101561090e57600083828151811061262957fe5b60200260200101519050612652816001600160a01b0316846001600160a01b03161060656114ee565b9150600101612612565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b60008282026126ed8415806126e65750838583816126e357fe5b04145b60036114ee565b670de0b6b3a764000090049392505050565b60006127857f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316148061277d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b6101356114ee565b6128768460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106127b957fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106127ed57fe5b6020026020010151612824877f000000000000000000000000000000000000000000000000000000000000000081518110610be357fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b03161461286a5761331461286e565b6133745b63ffffffff16565b949350505050565b60006128da7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316148061277d575060408501516001600160a01b031630146101356114ee565b60408401516001600160a01b03163014612935576129308460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061292257fe5b6020026020010151846133dd565b612876565b6128768460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061296957fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061299d57fe5b60200260200101516129d4877f000000000000000000000000000000000000000000000000000000000000000081518110610be357fe5b8661340d565b6000612a367f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316148061277d575060408501516001600160a01b031630146101356114ee565b60408401516001600160a01b03163014612a8c576129308460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612a7e57fe5b602002602001015184613473565b6128768460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612ac057fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612af457fe5b6020026020010151612b2b877f000000000000000000000000000000000000000000000000000000000000000081518110610be357fe5b866134b3565b6000612b4082151560046114ee565b82612b4d575060006107be565b670de0b6b3a764000083810290612b679085838161211157fe5b828181612b7057fe5b049150506107be565b6000612bfe7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b0316148061277d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b0316146101356114ee565b6128768460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612c3257fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612c6657fe5b6020026020010151612c9d877f000000000000000000000000000000000000000000000000000000000000000081518110610be357fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b031614612ce35761351a61286e565b613571565b6000612d447f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b0316148061277d575060208501516001600160a01b031630146101356114ee565b60208401516001600160a01b03163014612d9a576129308460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612d8c57fe5b6020026020010151846135db565b6128768460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612dce57fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612e0257fe5b6020026020010151612e39877f000000000000000000000000000000000000000000000000000000000000000081518110610be357fe5b86613605565b6000612e9b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b0316148061277d575060208501516001600160a01b031630146101356114ee565b60208401516001600160a01b03163014612ef1576129308460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612ee357fe5b602002602001015184613654565b6128768460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f2557fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f5957fe5b6020026020010151612f90877f000000000000000000000000000000000000000000000000000000000000000081518110610be357fe5b86613689565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b612fb5610f10565b6001600160a01b031614158015612fd05750612fd0836136dd565b15612ff857612fdd610f10565b6001600160a01b0316336001600160a01b03161490506107be565b61300061224f565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161302f939291906141f8565b60206040518083038186803b15801561304757600080fd5b505afa15801561305b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113649190613d1f565b600061308e84841115836114ee565b5050900390565b4690565b6130ac64e8d4a5100082101560cb6114ee565b6130c267016345785d8a000082111560ca6114ee565b6008546130d1908260c0611492565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc9061197e9083906141ef565b6000818060200190518101906107be9190613e88565b61150f613125611989565b156101af6114ee565b60006060600061313d84613719565b905060606131a88683613182897f00000000000000000000000000000000000000000000000000000000000000008151811061317557fe5b60200260200101516124ba565b7f000000000000000000000000000000000000000000000000000000000000000061372f565b9196919550909350505050565b6131cc6001600160a01b038316151561019b6114ee565b6131d88260008361090e565b6001600160a01b0382166000908152602081905260409020546131fe90826101b261307f565b6001600160a01b03831660009081526020819052604090205560025461322490826137eb565b6002556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906132659085906141ef565b60405180910390a35050565b600854613280908260006114c2565b60085550565b6132926000838361090e565b60025461329f9082611c9c565b6002556001600160a01b0382166000908152602081905260409020546132c59082611c9c565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906132659085906141ef565b600080613321868461205b565b9050600061332f82876120bc565b9050600061333d868a6114a8565b90506000613358846124c861335285876137f9565b8a613813565b905061336488826114a8565b9450505050505b95945050505050565b600080613381868461205b565b9050600061338f82876120bc565b905060006133a66133a0838b6137f9565b87613846565b905060006133b484836114a8565b905060006133c28288613866565b90506133ce8a826114a8565b9b9a5050505050505050505050565b6000806133ea848461205b565b905060006134016133fb8688611c9c565b8561205b565b9050611c7981836114a8565b6000826134255761341e868361205b565b905061336b565b6000613431868461205b565b905060006134426133fb888a611c9c565b9050600061345082846114a8565b9050600061345e84896120bc565b905061336461346d88846137f9565b82613846565b600080613480848461205b565b9050600061348e82876114a8565b9050600061349c8286613866565b90506134a886826114a8565b979650505050505050565b6000826134c157508461336b565b60006134cd868461205b565b905060006134db82876120bc565b905060006134e9878a611c9c565b905060006134f784836120bc565b9050600061350e61350889846137f9565b85613846565b90506133ce81896114a8565b60008261352857508461336b565b6000613534868461205b565b9050600061354282876120bc565b90506000613550868a611c9c565b90506000613565846124c861335285876137f9565b905061336481896114a8565b6000826135825761341e8683613866565b600061358e868461205b565b9050600061359c82876120bc565b905060006135b36135ad838b6137f9565b87613813565b905060006135c18483611c9c565b905060006135cf8288613866565b90506133ce818b6114a8565b6000806135e8848461205b565b905060006135f96133fb86886114a8565b9050611c7982826114a8565b600080613612868461205b565b905060006136236133fb888a6114a8565b9050600061363183836114a8565b9050600061363f84896120bc565b905061336461364e88846137f9565b82613813565b600080613661848461205b565b9050600061366f8287611c9c565b9050600061367d8286613866565b90506134a881876114a8565b600080613696868461205b565b905060006136a482876120bc565b905060006136b2878a6114a8565b905060006136c084836120bc565b905060006136d161350889846137f9565b90506133ce88826114a8565b60006137087f9f11080e00000000000000000000000000000000000000000000000000000000610e98565b8214806107be57506107be826138f6565b6000818060200190518101906108c79190613ea3565b6060600061373d8585612b31565b90506060865167ffffffffffffffff8111801561375957600080fd5b50604051908082528060200260200182016040528015613783578160200160208202803683370190505b50905060005b87518110156137e0578481146137d8576137bf838983815181106137a957fe5b60200260200101516126c990919063ffffffff16565b8282815181106137cb57fe5b6020026020010181815250505b600101613789565b509695505050505050565b60006108c78383600161307f565b60008282026108c78415806126e65750838583816126e357fe5b600061382282151560046114ee565b8261382f575060006107be565b81600184038161383b57fe5b0460010190506107be565b600061385582151560046114ee565b81838161385e57fe5b049392505050565b600081602001518310156138af5781516113649061388d90670de0b6b3a764000090611c9c565b602084015184516138a9916138a291906126c9565b8690611c9c565b90612b31565b816040015183116138c15750816107be565b8151611364906138da90670de0b6b3a7640000906114a8565b604084015184516138a9916138ef91906126c9565b86906114a8565b60006139217f38e9922e00000000000000000000000000000000000000000000000000000000610e98565b8214806107be57506139527f50dd6ed900000000000000000000000000000000000000000000000000000000610e98565b909114919050565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b80356107be81614442565b600082601f8301126139c0578081fd5b81356139d36139ce82614416565b6143ef565b8181529150602080830190848101818402860182018710156139f457600080fd5b60005b84811015613a13578135845292820192908201906001016139f7565b505050505092915050565b600082601f830112613a2e578081fd5b8151613a3c6139ce82614416565b818152915060208083019084810181840286018201871015613a5d57600080fd5b60005b84811015613a1357815184529282019290820190600101613a60565b600082601f830112613a8c578081fd5b813567ffffffffffffffff811115613aa2578182fd5b613ab56020601f19601f840116016143ef565b9150808252836020828501011115613acc57600080fd5b8060208401602084013760009082016020015292915050565b8051600181106107be57600080fd5b8035600281106107be57600080fd5b600060208284031215613b14578081fd5b81356108c781614442565b60008060408385031215613b31578081fd5b8235613b3c81614442565b91506020830135613b4c81614442565b809150509250929050565b600080600060608486031215613b6b578081fd5b8335613b7681614442565b92506020840135613b8681614442565b929592945050506040919091013590565b600080600080600080600060e0888a031215613bb1578283fd5b8735613bbc81614442565b96506020880135613bcc81614442565b95506040880135945060608801359350608088013560ff81168114613bef578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613c1e578182fd5b8235613c2981614442565b946020939093013593505050565b600080600060608486031215613c4b578081fd5b835167ffffffffffffffff80821115613c62578283fd5b818601915086601f830112613c75578283fd5b8151613c836139ce82614416565b80828252602080830192508086018b828387028901011115613ca3578788fd5b8796505b84871015613cce578051613cba81614442565b845260019690960195928101928101613ca7565b508901519097509350505080821115613ce5578283fd5b50613cf286828701613a1e565b925050604084015190509250925092565b600060208284031215613d14578081fd5b81356108c781614457565b600060208284031215613d30578081fd5b81516108c781614457565b600080600080600080600060e0888a031215613d55578081fd5b873596506020880135613d6781614442565b95506040880135613d7781614442565b9450606088013567ffffffffffffffff80821115613d93578283fd5b613d9f8b838c016139b0565b955060808a0135945060a08a0135935060c08a0135915080821115613dc2578283fd5b50613dcf8a828b01613a7c565b91505092959891949750929550565b600060208284031215613def578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c7578182fd5b600060208284031215613e2f578081fd5b81516108c781614442565b60008060408385031215613e4c578182fd5b8235613e5781614442565b9150602083013567ffffffffffffffff811115613e72578182fd5b613e7e85828601613a7c565b9150509250929050565b600060208284031215613e99578081fd5b6108c78383613ae5565b60008060408385031215613eb5578182fd5b613ebf8484613ae5565b9150602083015190509250929050565b60008060008060808587031215613ee4578182fd5b843567ffffffffffffffff80821115613efb578384fd5b818701915061012080838a031215613f11578485fd5b613f1a816143ef565b9050613f268984613af4565b8152613f3589602085016139a5565b6020820152613f4789604085016139a5565b6040820152606083013560608201526080830135608082015260a083013560a0820152613f778960c085016139a5565b60c0820152613f898960e085016139a5565b60e08201526101008084013583811115613fa1578687fd5b613fad8b828701613a7c565b828401525050809650506020870135915080821115613fca578384fd5b50613fd7878288016139b0565b949794965050505060408301359260600135919050565b600060208284031215613fff578081fd5b5035919050565b600060208284031215614017578081fd5b5051919050565b60008060408385031215614030578182fd5b50508035926020909101359150565b60008060008060808587031215614054578182fd5b845193506020850151925060408501519150606085015161407481614442565b939692955090935050565b6000815180845260208085019450808401835b838110156140ae57815187529582019590820190600101614092565b509495945050505050565b15159052565b60008151808452815b818110156140e4576020818501810151868301820152016140c8565b818111156140f55782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6000602082526108c7602083018461407f565b6000604082526141ba604083018561407f565b828103602084015261336b818561407f565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b80831015614288576142728451614436565b8252928401926001929092019190840190614260565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a08701526142c6818561407f565b935050506040850151818584030160c08601526142e383826140bf565b9250505060608401516137e060e08501826140b9565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60008382526040602083015261287660408301846140bf565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526108c760208301846140bf565b600083825260406020830152612876604083018461407f565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561440e57600080fd5b604052919050565b600067ffffffffffffffff82111561442c578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146107f957600080fd5b80151581146107f957600080fdfea26469706673582212200bbbb2877ee0496900a98f3d9653980e97610cc9b1a65637dbf7573366141ed064736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100715760003560e01c80632da47c40116100505780632da47c40146100ca5780636634b753146100e05780638d928af81461010057610071565b8062c194db14610076578063174481fa146100945780632ccb254a146100aa575b600080fd5b61007e610108565b60405161008b91906107f0565b60405180910390f35b61009c610127565b60405161008b9291906107be565b6100bd6100b83660046106a7565b61016d565b60405161008b9190610803565b6100d2610232565b60405161008b9291906108aa565b6100f36100ee36600461068b565b61029c565b60405161008b91906107e5565b6100bd6102c7565b60606101226040518060200160405280600081525061034a565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080600061017a610232565b9150915060006101c161018b6102c7565b8c8c8c8c8c8c8a8a8e6040516020016101ad9a99989796959493929190610824565b604051602081830303815290604052610423565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561020b57600080fd5b505af115801561021f573d6000803e3d6000fd5b50929d9c50505050505050505050505050565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561028e57807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610297565b60009250600091505b509091565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061034473ffffffffffffffffffffffffffffffffffffffff831615156101ac6104ae565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016104158183866104c0565b505050505050505050919050565b60008061042f8361053a565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b816104bc576104bc81610582565b5050565b5b602081106104fe5781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016104c1565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600060606105478361034a565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811661057b573d6000803e3d6000fd5b9392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600082601f8301126105ff578081fd5b813567ffffffffffffffff80821115610616578283fd5b60405160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501168201018181108382111715610654578485fd5b60405282815292508284830160200186101561066f57600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121561069c578081fd5b813561057b816108b8565b600080600080600080600060e0888a0312156106c1578283fd5b873567ffffffffffffffff808211156106d8578485fd5b6106e48b838c016105ef565b985060208a01359150808211156106f9578485fd5b506107068a828b016105ef565b9650506040880135610717816108b8565b94506060880135610727816108b8565b93506080880135925060a0880135915060c0880135610745816108b8565b8091505092959891949750929550565b60008151808452815b8181101561077a5760208185018101518683018201520161075e565b8181111561078b5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b60006020825261057b6020830184610755565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600061014073ffffffffffffffffffffffffffffffffffffffff808e1684528160208501526108558285018e610755565b91508382036040850152610869828d610755565b9a811660608501529889166080840152505060a081019590955260c085019390935260e0840191909152610100830152909116610120909101529392505050565b918252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff811681146108da57600080fd5b5056fea264697066735822122075c5d37a50e2e532aa33048ffa2178e8ee6aa74ac232c5bf619c34b61ade4f6c64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/index.ts b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/index.ts new file mode 100644 index 0000000..f2bfa8c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/index.ts @@ -0,0 +1,8 @@ +import { Task, TaskRunOptions } from '@src'; +import { UnbuttonAaveLinearPoolDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as UnbuttonAaveLinearPoolDeployment; + const args = [input.Vault]; + await task.deployAndVerify('UnbuttonAaveLinearPoolFactory', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/input.ts b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/input.ts new file mode 100644 index 0000000..58864da --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type UnbuttonAaveLinearPoolDeployment = { + Vault: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/output/arbitrum.json new file mode 100644 index 0000000..7ec2b03 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "UnbuttonAaveLinearPoolFactory": "0x8878f1273466157a79570DdE1A42130e551B6EAd" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/output/gnosis.json b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/output/gnosis.json new file mode 100644 index 0000000..bad1882 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "UnbuttonAaveLinearPoolFactory": "0x4fb47126Fa83A8734991E41B942Ac29A3266C968" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/output/goerli.json new file mode 100644 index 0000000..06a7b6a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/output/goerli.json @@ -0,0 +1,3 @@ +{ + "UnbuttonAaveLinearPoolFactory": "0x4b9A00DD766DB94Df48C2901C321174a5cE75529" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/output/kovan.json b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/output/kovan.json new file mode 100644 index 0000000..cb8a592 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/output/kovan.json @@ -0,0 +1,3 @@ +{ + "UnbuttonAaveLinearPoolFactory": "0x3e197287Cf17bfe139A9E8eDb16765911aAdC5eb" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/output/mainnet.json new file mode 100644 index 0000000..9c25e1d --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "UnbuttonAaveLinearPoolFactory": "0x9588c26142e345f1A0d005CfC0C6DF29A8Fa010C" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/output/optimism.json b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/output/optimism.json new file mode 100644 index 0000000..5960f96 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/output/optimism.json @@ -0,0 +1,3 @@ +{ + "UnbuttonAaveLinearPoolFactory": "0x6d471c05f8A99Bd8f991467A8283e3DC968b8D7c" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/output/polygon.json new file mode 100644 index 0000000..3cd21bc --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/output/polygon.json @@ -0,0 +1,3 @@ +{ + "UnbuttonAaveLinearPoolFactory": "0x6bAF5Fa330F2d7C59f2bB57cF4b2C927B7f160d2" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/readme.md b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/readme.md new file mode 100644 index 0000000..0681793 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220425-unbutton-aave-linear-pool/readme.md @@ -0,0 +1,16 @@ +# 2022-04-25 - Unbutton Aave Linear Pool + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> + +Deployment of the `UnbuttonAaveLinearPoolFactory`, for Aave Linear Pools where both the main and wrapped tokens are UnbuttonTokens employing the IButtonWrapper interface to abstract rebasing functionality. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`UnbuttonAaveLinearPoolFactory` artifact](./artifact/UnbuttonAaveLinearPoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/artifact/StablePool.json b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/artifact/StablePool.json new file mode 100644 index 0000000..461ea17 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/artifact/StablePool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20[]", "name": "tokens", "type": "address[]"}, {"internalType": "uint256", "name": "amplificationParameter", "type": "uint256"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "address", "name": "owner", "type": "address"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "startValue", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "endValue", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "startTime", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "endTime", "type": "uint256"}], "name": "AmpUpdateStarted", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "currentValue", "type": "uint256"}], "name": "AmpUpdateStopped", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "enabled", "type": "bool"}], "name": "RecoveryModeStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "disableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "enableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAmplificationParameter", "outputs": [{"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "bool", "name": "isUpdating", "type": "bool"}, {"internalType": "uint256", "name": "precision", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getLastInvariant", "outputs": [{"internalType": "uint256", "name": "lastInvariant", "type": "uint256"}, {"internalType": "uint256", "name": "lastInvariantAmp", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getScalingFactors", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "inRecoveryMode", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "swapRequest", "type": "tuple"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "indexIn", "type": "uint256"}, {"internalType": "uint256", "name": "indexOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256", "name": "balanceTokenIn", "type": "uint256"}, {"internalType": "uint256", "name": "balanceTokenOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "bytes", "name": "poolConfig", "type": "bytes"}], "name": "setAssetManagerPoolConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "rawEndValue", "type": "uint256"}, {"internalType": "uint256", "name": "endTime", "type": "uint256"}], "name": "startAmplificationParameterUpdate", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "stopAmplificationParameterUpdate", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/artifact/StablePoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/artifact/StablePoolFactory.json new file mode 100644 index 0000000..5da1e67 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/artifact/StablePoolFactory.json @@ -0,0 +1,218 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "StablePoolFactory", + "sourceName": "contracts/StablePoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "amplificationParameter", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101606040523480156200001257600080fd5b506040516200679d3803806200679d8339810160408190526200003591620001ce565b80604051806020016200004890620001c0565b601f1982820381018352601f90910116604052805182903090839060006002820460a081905280830360e081905281855290915083620000948162000104602090811b6200045017901c565b60601b6001600160601b0319166080528285018051838252620000c38262000104602090811b6200045017901c565b6001600160601b0319606091821b811660c0529690935290526101009590955250509290911b90911661012052505050426276a700016101405250620001fe565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001526001600160a01b03831615156101ac62000158565b50919050565b81620001695762000169816200016d565b5050565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6157ec8062000fb183390190565b600060208284031215620001e0578081fd5b81516001600160a01b0381168114620001f7578182fd5b9392505050565b60805160601c60a05160c05160601c60e051610100516101205160601c61014051610d476200026a600039806101f952806102225250806103a75250806103575250806104b75250806101d052806105335250806104d85250806101af528061050f5250610d476000f3fe608060405234801561001057600080fd5b50600436106100bd5760003560e01c80636c57f5a911610076578063851c1bb31161005b578063851c1bb31461015e5780638d928af81461017e578063aaabadc514610186576100bd565b80636c57f5a9146101365780637932c7f31461013e576100bd565b80632da47c40116100a75780632da47c40146100f65780632f2770db1461010c5780636634b75314610116576100bd565b8062c194db146100c2578063174481fa146100e0575b600080fd5b6100ca61018e565b6040516100d79190610bd1565b60405180910390f35b6100e86101ad565b6040516100d7929190610b6a565b6100fe6101f3565b6040516100d7929190610ca1565b61011461025d565b005b6101296101243660046108ec565b6102c2565b6040516100d79190610b91565b6101296102ed565b61015161014c366004610984565b6102f6565b6040516100d79190610b49565b61017161016c366004610928565b610353565b6040516100d79190610b9c565b6101516103a5565b6101516103c9565b60606101a8604051806020016040528060008152506104af565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561024f57807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610258565b60009250600091505b509091565b610265610588565b61026d6105d1565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b60015460ff1690565b60008060006103036101f3565b915091506103466103126103a5565b8a8a8a8a8a88888c60405160200161033299989796959493929190610be4565b6040516020818303038152906040526105e6565b9998505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610388929190610b19565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006103d36103a5565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561041857600080fd5b505afa15801561042c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101a89190610968565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506104a973ffffffffffffffffffffffffffffffffffffffff831615156101ac61067a565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010161057a81838661068c565b505050505050505050919050565b60006105b76000357fffffffff0000000000000000000000000000000000000000000000000000000016610353565b90506105ce6105c68233610706565b61019161067a565b50565b6105e46105dc6102ed565b1560d361067a565b565b60006105f06105d1565b60006105fb836107a5565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b8161068857610688816107ed565b5050565b5b602081106106ca5781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00161068d565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b60006107106103c9565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040161074c93929190610ba5565b60206040518083038186803b15801561076457600080fd5b505afa158015610778573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079c9190610908565b90505b92915050565b600060606107b2836104af565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff81166107e6573d6000803e3d6000fd5b9392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b803561079f81610cef565b600082601f830112610875578081fd5b813567ffffffffffffffff81111561088b578182fd5b6108bc60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610caf565b91508082528360208285010111156108d357600080fd5b8060208401602084013760009082016020015292915050565b6000602082840312156108fd578081fd5b81356107e681610cef565b600060208284031215610919578081fd5b815180151581146107e6578182fd5b600060208284031215610939578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146107e6578182fd5b600060208284031215610979578081fd5b81516107e681610cef565b60008060008060008060c0878903121561099c578182fd5b863567ffffffffffffffff808211156109b3578384fd5b6109bf8a838b01610865565b97506020915081890135818111156109d5578485fd5b6109e18b828c01610865565b9750506040890135818111156109f5578485fd5b8901601f81018b13610a05578485fd5b803582811115610a13578586fd5b8381029250610a23848401610caf565b8181528481019083860185850187018f1015610a3d578889fd5b8895505b83861015610a6757610a538f8261085a565b835260019590950194918601918601610a41565b50985050505060608901359450505060808701359150610a8a8860a0890161085a565b90509295509295509295565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452815b81811015610ad557602081850181015186830182015201610ab9565b81811115610ae65782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825261079c6020830184610ab0565b600061012073ffffffffffffffffffffffffffffffffffffffff8c16835260208181850152610c158285018d610ab0565b91508382036040850152610c29828c610ab0565b84810360608601528a51808252828c01935090820190845b81811015610c6557610c538551610cd6565b83529383019391830191600101610c41565b50508093505050508660808301528560a08301528460c08301528360e0830152610c93610100830184610a96565b9a9950505050505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610cce57600080fd5b604052919050565b73ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff811681146105ce57600080fdfea26469706673582212203e21b58f8af1fae1264b60d1d3943af5dafd322bb7d6bf7b1a35daa2137032de64736f6c634300070100336103206040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960e0523480156200003657600080fd5b50604051620057ec380380620057ec833981016040819052620000599162000b49565b8886516002146200006c5760006200006f565b60025b8989898a516001600160401b03811180156200008a57600080fd5b50604051908082528060200260200182016040528015620000b5578160200160208202803683370190505b508989898980336001600160a01b031660001b84848b8b8f8280604051806040016040528060018152602001603160f81b815250858581600390805190602001906200010392919062000967565b5080516200011990600490602084019062000967565b505060058054601260ff19909116179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260601b6001600160601b03191661010052506200018b90506276a70083111561019462000556565b6200019f62278d0082111561019562000556565b429190910161012081905201610140526101605260601b6001600160601b031916610180528551620001d7906002111560c862000556565b620001f1620001e56200056b565b8751111560c962000556565b62000207866200057060201b620011bd1760201c565b62000212846200057c565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f9062000243908d9060040162000ce5565b602060405180830381600087803b1580156200025e57600080fd5b505af115801562000273573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000299919062000b30565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002ce9084908b908b9060040162000c49565b600060405180830381600087803b158015620002e957600080fd5b505af1158015620002fe573d6000803e3d6000fd5b5050506101a09190915250620003299950505060018d1015965061012c955050620005569350505050565b6200033c61138886111561012d62000556565b85516101c0819052865187906000906200035257fe5b60200260200101516001600160a01b03166101e0816001600160a01b031660601b81525050866001815181106200038557fe5b60200260200101516001600160a01b0316610200816001600160a01b031660601b8152505060028111620003bb576000620003d2565b86600281518110620003c957fe5b60200260200101515b60601b6001600160601b0319166102205260038111620003f45760006200040b565b866003815181106200040257fe5b60200260200101515b60601b6001600160601b03191661024052600481116200042d57600062000444565b866004815181106200043b57fe5b60200260200101515b6001600160a01b0316610260816001600160a01b031660601b8152505062000487876000815181106200047357fe5b60200260200101516200060b60201b60201c565b610280528651620004a090889060019081106200047357fe5b6102a05260028111620004b5576000620004c7565b620004c7876002815181106200047357fe5b6102c05260038111620004dc576000620004ee565b620004ee876003815181106200047357fe5b6102e052600481116200050357600062000515565b62000515876004815181106200047357fe5b6103008181525050600062000538876103e8620006df60201b620011c71760201c565b9050620005458162000710565b505050505050505050505062000d4c565b81620005675762000567816200074f565b5050565b600590565b806200056781620007a2565b6200059164e8d4a5100082101560cb62000556565b620005a967016345785d8a000082111560ca62000556565b620005cb8160c060406008546200082f60201b620011f217909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906200060090839062000cfa565b60405180910390a150565b60006001600160a01b0382163014156200062f5750670de0b6b3a7640000620006da565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200066b57600080fd5b505afa15801562000680573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006a6919062000c26565b60ff1690506000620006c56012836200085460201b6200121a1760201c565b905080600a0a670de0b6b3a764000002925050505b919050565b600082820262000707841580620006ff575083858381620006fc57fe5b04145b600362000556565b90505b92915050565b6200071e818042806200086c565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a02338160405162000600919062000cfa565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600281511015620007b3576200082c565b600081600081518110620007c357fe5b602002602001015190506000600190505b825181101562000829576000838281518110620007ed57fe5b602002602001015190506200081e816001600160a01b0316846001600160a01b03161060656200055660201b60201c565b9150600101620007d4565b50505b50565b60006200083e848484620008df565b506001901b60001901811b1992909216911b1790565b60006200086683831115600162000556565b50900390565b620008868160c060406200093a60201b620012301760201c565b620008a083608060406200093a60201b620012301760201c565b620008b9856040806200093a60201b620012301760201c565b620008d387600060406200093a60201b620012301760201c565b17171760095550505050565b620008f06101008310606462000556565b62000929600182101580156200092157506200091d60ff84610100036200094f60201b620012431760201c565b8211155b606462000556565b6200082983821c156101b462000556565b600062000949848484620008df565b50501b90565b600081831062000960578162000707565b5090919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620009aa57805160ff1916838001178555620009da565b82800160010185558215620009da579182015b82811115620009da578251825591602001919060010190620009bd565b50620009e8929150620009ec565b5090565b5b80821115620009e85760008155600101620009ed565b80516200070a8162000d36565b600082601f83011262000a21578081fd5b81516001600160401b0381111562000a37578182fd5b602080820262000a4982820162000d03565b8381529350818401858301828701840188101562000a6657600080fd5b600092505b8483101562000a9657805162000a818162000d36565b82526001929092019190830190830162000a6b565b505050505092915050565b600082601f83011262000ab2578081fd5b81516001600160401b0381111562000ac8578182fd5b602062000ade601f8301601f1916820162000d03565b9250818352848183860101111562000af557600080fd5b60005b8281101562000b1557848101820151848201830152810162000af8565b8281111562000b275760008284860101525b50505092915050565b60006020828403121562000b42578081fd5b5051919050565b60008060008060008060008060006101208a8c03121562000b68578485fd5b62000b748b8b62000a03565b60208b01519099506001600160401b038082111562000b91578687fd5b62000b9f8d838e0162000aa1565b995060408c015191508082111562000bb5578687fd5b62000bc38d838e0162000aa1565b985060608c015191508082111562000bd9578687fd5b5062000be88c828d0162000a10565b96505060808a0151945060a08a0151935060c08a0151925060e08a0151915062000c178b6101008c0162000a03565b90509295985092959850929598565b60006020828403121562000c38578081fd5b815160ff8116811462000707578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000c955762000c82855162000d2a565b8352938301939183019160010162000c6d565b505084810360408601528551808252908201925081860190845b8181101562000cd75762000cc4835162000d2a565b8552938301939183019160010162000caf565b509298975050505050505050565b602081016003831062000cf457fe5b91905290565b90815260200190565b6040518181016001600160401b038111828210171562000d2257600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b03811681146200082c57600080fd5b60805160a05160c05160e0516101005160601c6101205161014051610160516101805160601c6101a0516101c0516101e05160601c6102005160601c6102205160601c6102405160601c6102605160601c610280516102a0516102c0516102e051610300516149ab62000e416000398061247d5250806124595250806124355250806124115250806123ed525080611ffd525080611fbb525080611f79525080612d7a525080612d48525080611269525080610891525080610c3a525080610bc4525080611556525080611532525080610c5e525080610ef35250806117985250806117da5250806117b952506149ab6000f3fe608060405234801561001057600080fd5b50600436106102c85760003560e01c806370a082311161017b5780639d2c110c116100d8578063b7b814fc1161008c578063d5c096c411610071578063d5c096c414610551578063dd62ed3e14610564578063eb0f24d614610577576102c8565b8063b7b814fc14610536578063d505accf1461053e576102c8565b8063a9059cbb116100bd578063a9059cbb14610513578063aaabadc514610526578063b35056b81461052e576102c8565b80639d2c110c146104ed578063a457c2d714610500576102c8565b806387ec68171161012f5780638d928af8116101145780638d928af8146104c757806395d89b41146104cf5780639b02cdde146104d7576102c8565b806387ec68171461049f578063893d20e8146104b2576102c8565b80637ecebe00116101605780637ecebe00146104715780638456cb5914610484578063851c1bb31461048c576102c8565b806370a082311461043d57806374f3b00914610450576102c8565b806338e9922e1161022957806354a844ba116101dd5780636028bfd4116101c25780636028bfd4146103fd578063679aefce1461041e5780636daccffa14610426576102c8565b806354a844ba146103ed57806355c67628146103f5576102c8565b8063395093511161020e57806339509351146103bf5780633f4ba83a146103d257806350dd6ed9146103da576102c8565b806338e9922e146103a457806338fff2d0146103b7576102c8565b80631dd746ea116102805780632f1a0bc9116102655780632f1a0bc914610372578063313ce567146103875780633644e5151461039c576102c8565b80631dd746ea1461034a57806323b872dd1461035f576102c8565b8063095ea7b3116102b1578063095ea7b31461030b57806318160ddd1461032b5780631c0de05114610333576102c8565b806301ec954a146102cd57806306fdde03146102f6575b600080fd5b6102e06102db3660046144d5565b61057f565b6040516102ed91906147ae565b60405180910390f35b6102fe61061d565b6040516102ed9190614884565b61031e610319366004614166565b6106b4565b6040516102ed919061478b565b6102e06106cb565b61033b6106d1565b6040516102ed93929190614796565b6103526106fa565b6040516102ed9190614753565b61031e61036d3660046140b6565b610709565b6103856103803660046145aa565b61077d565b005b61038f610860565b6040516102ed91906148ef565b6102e0610869565b6103856103b2366004614592565b610873565b6102e061088f565b61031e6103cd366004614166565b6108b3565b6103856108ee565b6103856103e836600461437c565b610902565b610385610920565b6102e0610932565b61041061040b36600461427d565b610945565b6040516102ed929190614897565b6102e061097c565b61042e610a49565b6040516102ed939291906148b0565b6102e061044b366004614062565b610a64565b61046361045e36600461427d565b610a83565b6040516102ed929190614766565b6102e061047f366004614062565b610b93565b610385610bae565b6102e061049a366004614320565b610bc0565b6104106104ad36600461427d565b610c12565b6104ba610c38565b6040516102ed919061473f565b6104ba610c5c565b6102fe610c80565b6104df610ce1565b6040516102ed9291906148c6565b6102e06104fb366004614546565b610ceb565b61031e61050e366004614166565b610e49565b61031e610521366004614166565b610e87565b6104ba610e94565b61031e610e9e565b610385610eac565b61038561054c3660046140f6565b610ebe565b61046361055f36600461427d565b611007565b6102e061057236600461407e565b611154565b610385611191565b600084608001516105ac610591610c5c565b6001600160a01b0316336001600160a01b03161460cd611259565b6105c16105b761088f565b82146101f4611259565b6105d384846105ce611267565b61128b565b60606105dd6112a8565b90506000875160018111156105ee57fe5b146106055761060087878787856113d0565b610612565b6106128787878785611447565b979650505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106a95780601f1061067e576101008083540402835291602001916106a9565b820191906000526020600020905b81548152906001019060200180831161068c57829003601f168201915b505050505090505b90565b60006106c13384846114ab565b5060015b92915050565b60025490565b60008060006106de611513565b1592506106e9611530565b91506106f3611554565b9050909192565b60606107046112a8565b905090565b6000806107168533611154565b905061073a336001600160a01b03871614806107325750838210155b61019e611259565b610745858585611578565b336001600160a01b0386161480159061076057506000198114155b156107725761077285338584036114ab565b506001949350505050565b610785611658565b610795600183101561012c611259565b6107a661138883111561012d611259565b60006107b2824261121a565b90506107c66201518082101561013d611259565b6000806107d161169e565b915091506107e2811561013e611259565b60006107f0866103e86111c7565b9050600083821161081f5761081a61080b62015180866111c7565b61081584886111c7565b611712565b610839565b61083961082f62015180846111c7565b61081586886111c7565b905061084b600282111561013f611259565b61085784834289611745565b50505050505050565b60055460ff1690565b6000610704611794565b61087b611658565b610883611831565b61088c81611844565b50565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106c19185906108e990866118bc565b6114ab565b6108f6611658565b61090060006118ce565b565b61090a611658565b610912611831565b61091c828261195f565b5050565b610928611658565b6109006001611a77565b6008546000906107049060c06040611b45565b6000606061095b8651610956611267565b611b54565b61097089898989898989611b61611ba7611c08565b97509795505050505050565b60006060610988610c5c565b6001600160a01b031663f94d466861099e61088f565b6040518263ffffffff1660e01b81526004016109ba91906147ae565b60006040518083038186803b1580156109d257600080fd5b505afa1580156109e6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a0e9190810190614191565b50915050610a2381610a1e6112a8565b611d98565b6000610a2d61169e565b509050610a428282610a3d6106cb565b611df9565b9250505090565b6000806000610a5661169e565b90949093506103e892509050565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610a92610591610c5c565b610a9d6105b761088f565b6060806000610aab87611e12565b15610b1857610ab8611e41565b895167ffffffffffffffff81118015610ad057600080fd5b50604051908082528060200260200182016040528015610afa578160200160208202803683370190505b509250610b0f8a610b096106cb565b89611e58565b92509050610b76565b610b20611831565b6060610b2a6112a8565b9050610b368b82611d98565b610b5a8e8e8e8e8e610b46610e9e565b610b50578e610b53565b60005b878f611b61565b955093509150610b6a8382611ba7565b610b748482611ba7565b505b610b808c82611e86565b50935091505b5097509795505050505050565b6001600160a01b031660009081526006602052604090205490565b610bb6611658565b61090060016118ce565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610bf59291906146c9565b604051602081830303815290604052805190602001209050919050565b60006060610c238651610956611267565b61097089898989898989611e90611ee1611c08565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106a95780601f1061067e576101008083540402835291602001916106a9565b600a54600b549091565b60008360800151610cfd610591610c5c565b610d086105b761088f565b6000610d178660200151611f42565b90506000610d288760400151611f42565b9050600087516001811115610d3957fe5b1415610dc9576000610d4e8860600151612048565b90506000818960600151039050610d728960200151610d6d8387612069565b612075565b60608901829052610d838885612069565b9750610d8f8784612069565b9650610d9f896060015185612069565b60608a01526000610db18a8a8a612087565b9050610dbd81856120c0565b96505050505050610e41565b610dd38683612069565b9550610ddf8582612069565b9450610def876060015182612069565b60608801526000610e018888886120cc565b9050610e0d81846120fb565b90506000610e1a82612107565b905060008282039050610e358a60200151610d6d8388612069565b509450610e4192505050565b509392505050565b600080610e563385611154565b9050808310610e7057610e6b338560006114ab565b610e7d565b610e7d33858584036114ab565b5060019392505050565b60006106c1338484611578565b600061070461212d565b600754610100900460ff1690565b610eb4611658565b6109006000611a77565b610ecc8442111560d1611259565b6001600160a01b0387166000908152600660209081526040808320549051909291610f23917f0000000000000000000000000000000000000000000000000000000000000000918c918c918c9188918d91016147d6565b6040516020818303038152906040528051906020012090506000610f46826121a7565b9050600060018288888860405160008152602001604052604051610f6d9493929190614866565b6020604051602081039080840390855afa158015610f8f573d6000803e3d6000fd5b5050604051601f1901519150610fd190506001600160a01b03821615801590610fc957508b6001600160a01b0316826001600160a01b0316145b6101f8611259565b6001600160a01b038b166000908152600660205260409020600185019055610ffa8b8b8b6114ab565b5050505050505050505050565b60608088611016610591610c5c565b6110216105b761088f565b606061102b6112a8565b9050611035611831565b61103d6106cb565b6110f057600060606110528d8d8d868b6121c3565b9150915061106b611061612248565b83101560cc611259565b61107d6000611078612248565b61224f565b6110908b611089612248565b840361224f565b61109a8184611ee1565b806110a3611267565b67ffffffffffffffff811180156110b957600080fd5b506040519080825280602002602001820160405280156110e3578160200160208202803683370190505b5095509550505050610b86565b6110fa8882611d98565b60006060806111238e8e8e8e8e61110f610e9e565b611119578e61111c565b60005b8a8f611e90565b9250925092506111338c8461224f565b61113d8285611ee1565b6111478185611ba7565b9095509350610b86915050565b600061115e610c5c565b6001600160a01b0316826001600160a01b0316141561118057506000196106c5565b61118a8383612259565b90506106c5565b611199611658565b6000806111a461169e565b915091506111b481610140611259565b61091c82612284565b8061091c816122bf565b60008282026111eb8415806111e45750838583816111e157fe5b04145b6003611259565b9392505050565b60006111ff848484612338565b5082821b6000196001831b01831b198516175b949350505050565b600061122a838311156001611259565b50900390565b600061123d848484612338565b50501b90565b600081831061125257816111eb565b5090919050565b8161091c5761091c8161237e565b7f000000000000000000000000000000000000000000000000000000000000000090565b6112a3818410801561129c57508183105b6064611259565b505050565b606060006112b4611267565b905060608167ffffffffffffffff811180156112cf57600080fd5b506040519080825280602002602001820160405280156112f9578160200160208202803683370190505b5090506113046123eb565b8160008151811061131157fe5b60200260200101818152505061132561240f565b8160018151811061133257fe5b602002602001018181525050600282111561136d5761134f612433565b8160028151811061135c57fe5b602002602001018181525050611376565b91506106b19050565b600382111561136d57611387612457565b8160038151811061139457fe5b602002602001018181525050600482111561136d576113b161247b565b816004815181106113be57fe5b60200260200101818152505091505090565b60006113dc8583611d98565b6113fd86606001518385815181106113f057fe5b6020026020010151612069565b606087015260006114108787878761249f565b905061142f8184878151811061142257fe5b60200260200101516120fb565b905061143a81612107565b9150505b95945050505050565b60006114568660600151612048565b60608701526114658583611d98565b61147986606001518386815181106113f057fe5b6060870152600061148c878787876124e4565b905061143a8184868151811061149e57fe5b60200260200101516120c0565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906115069085906147ae565b60405180910390a3505050565b600061151d611554565b42118061070457505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b61158f6001600160a01b0384161515610198611259565b6115a66001600160a01b0383161515610199611259565b6115b18383836112a3565b6001600160a01b0383166000908152602081905260409020546115d790826101a061251d565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461160690826118bc565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115069085906147ae565b60006116876000357fffffffff0000000000000000000000000000000000000000000000000000000016610bc0565b905061088c6116968233612533565b610191611259565b6000806000806000806116af61261c565b9350935093509350804210156117025760019450838311156116e65781810382420385850302816116dc57fe5b04840195506116fd565b81810382420384860302816116f757fe5b04840395505b61170a565b600094508295505b505050509091565b60006117218215156004611259565b8261172e575060006106c5565b81600184038161173a57fe5b0460010190506106c5565b6117518484848461267b565b7f1835882ee7a34ac194f717a35e09bb1d24c82a3b9d854ab6c9749525b714cdf28484848460405161178694939291906148d4565b60405180910390a150505050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006118016126ba565b3060405160200161181695949392919061480a565b60405160208183030381529060405280519060200120905090565b61090061183c611513565b610192611259565b61185764e8d4a5100082101560cb611259565b61186d67016345785d8a000082111560ca611259565b60085461187e908260c060406111f2565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906118b19083906147ae565b60405180910390a150565b60008282016111eb8482101583611259565b80156118ee576118e96118df611530565b4210610193611259565b611903565b6119036118f9611554565b42106101a9611259565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be64906118b190839061478b565b600061196961088f565b90506000611975610c5c565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b81526004016119a292919061484f565b60806040518083038186803b1580156119ba57600080fd5b505afa1580156119ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f291906145cb565b6040517f18e736d40000000000000000000000000000000000000000000000000000000081529094506001600160a01b03851693506318e736d49250611a3f915085908790600401614836565b600060405180830381600087803b158015611a5957600080fd5b505af1158015611a6d573d6000803e3d6000fd5b5050505050505050565b611a80816126be565b8061088c576060611a8f610c5c565b6001600160a01b031663f94d4668611aa561088f565b6040518263ffffffff1660e01b8152600401611ac191906147ae565b60006040518083038186803b158015611ad957600080fd5b505afa158015611aed573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b159190810190614191565b50915050611b2581610a1e6112a8565b6000611b2f61169e565b5090506112a3611b3f828461271e565b82612880565b6001901b6000190191901c1690565b61091c8183146067611259565b6000606080611b70888761288b565b9050611b7f888261121a612978565b611b8a8886866129e3565b9093509150611b998883612a6d565b985098509895505050505050565b60005b611bb2611267565b8110156112a357611be9838281518110611bc857fe5b6020026020010151838381518110611bdc57fe5b6020026020010151612a94565b838281518110611bf557fe5b6020908102919091010152600101611baa565b333014611cf7576000306001600160a01b0316600036604051611c2c9291906146f9565b6000604051808303816000865af19150503d8060008114611c69576040519150601f19603f3d011682016040523d82523d6000602084013e611c6e565b606091505b505090508060008114611c7d57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611cd9573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b6060611d016112a8565b9050611d0d8782611d98565b60006060611d258c8c8c8c8c8c898d8d63ffffffff16565b5091509150611d3881848663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08301526020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b60005b611da3611267565b8110156112a357611dda838281518110611db957fe5b6020026020010151838381518110611dcd57fe5b6020026020010151612ae5565b838281518110611de657fe5b6020908102919091010152600101611d9b565b600080611e06848661271e565b905061143e8184612a94565b60008082511180156106c5575060ff801682806020019051810190611e37919061460b565b60ff161492915050565b60075461090090610100900460ff166101b6611259565b600060606000611e6784612b11565b90506060611e76878784612b27565b919350909150505b935093915050565b61091c8282612bd6565b60006060806060611ea1898861288b565b9050611eb0898261121a612978565b60006060611ebf8b8989612c92565b91509150611ecd8b82612ceb565b909d909c50909a5098505050505050505050565b60005b611eec611267565b8110156112a357611f23838281518110611f0257fe5b6020026020010151838381518110611f1657fe5b6020026020010151612cf8565b838281518110611f2f57fe5b6020908102919091010152600101611ee4565b6000611f4d82612d46565b15611f6157611f5a6123eb565b9050610a7e565b611f6a82612d78565b15611f7757611f5a61240f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611fb957611f5a612433565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611ffb57611f5a612457565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561203d57611f5a61247b565b610a7e61013561237e565b60008061205d612056610932565b8490612daa565b90506111eb838261121a565b60006111eb8383612ae5565b61091c61208183612de6565b8261091c565b600061209e612094611267565b60021460d2611259565b60606000806120ae878787612dec565b925092509250610612878484846124e4565b60006111eb8383612a94565b60006120d9612094611267565b60606000806120e9878787612dec565b9250925092506106128784848461249f565b60006111eb8383612cf8565b60006106c5612126612117610932565b670de0b6b3a76400009061121a565b8390612cf8565b6000612137610c5c565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561216f57600080fd5b505afa158015612183573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107049190614360565b60006121b1611794565b82604051602001610bf5929190614709565b6000606060006121d284612ead565b90506121ed60008260028111156121e557fe5b1460ce611259565b60606121f885612ec3565b90506122078151610956611267565b6122118187611d98565b600061221b61169e565b509050600061222a828461271e565b9050806122378184612880565b9b929a509198505050505050505050565b620f424090565b61091c8282612ed9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6122908182424261267b565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a0233816040516118b191906147ae565b6002815110156122ce5761088c565b6000816000815181106122dd57fe5b602002602001015190506000600190505b82518110156112a357600083828151811061230557fe5b6020026020010151905061232e816001600160a01b0316846001600160a01b0316106065611259565b91506001016122ee565b61234761010083106064611259565b61236f6001821015801561129c575061236560ff8461010003611243565b8211156064611259565b6112a383821c156101b4611259565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006124a9611831565b60006124b361169e565b50905060006124c2828761271e565b905060006124d8838888888c6060015187612f67565b98975050505050505050565b60006124ee611831565b60006124f861169e565b5090506000612507828761271e565b905060006124d8838888888c6060015187613010565b600061252c8484111583611259565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b612552610c38565b6001600160a01b03161415801561256d575061256d836130a9565b156125955761257a610c38565b6001600160a01b0316336001600160a01b03161490506106c5565b61259d61212d565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016125cc939291906147b7565b60206040518083038186803b1580156125e457600080fd5b505afa1580156125f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118a919061425d565b60008060008061263b60006040600954611b459092919063ffffffff16565b60095490945061264d90604080611b45565b6009549093506126609060806040611b45565b6009549092506126739060c06040611b45565b905090919293565b6126888160c06040611230565b6126958360806040611230565b6126a185604080611230565b6126ae8760006040611230565b17171760095550505050565b4690565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100831515021790556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c8906118b190839061478b565b80516000908190815b8181101561275f5761275585828151811061273e57fe5b6020026020010151846118bc90919063ffffffff16565b9250600101612727565b5081612770576000925050506106c5565b600082868302825b60ff811015612869578260005b868110156127c6576127bc61279a83876111c7565b6127b78c84815181106127a957fe5b60200260200101518a6111c7565b613117565b9150600101612785565b5083945061281f6127fe6127f86127dd848a6111c7565b6127f26127ea888d6111c7565b6103e8613117565b906118bc565b866111c7565b6127b761280e89600101856111c7565b6127f26127ea6103e889038a6111c7565b9350848411156128475760018585031161284257839750505050505050506106c5565b612860565b60018486031161286057839750505050505050506106c5565b50600101612778565b5061287561014161237e565b505050505092915050565b600a91909155600b55565b606080612896611267565b67ffffffffffffffff811180156128ac57600080fd5b506040519080825280602002602001820160405280156128d6578160200160208202803683370190505b509050826128e55790506106c5565b600080856000815181106128f557fe5b602002602001015190506000600190505b61290e611267565b81101561294557600087828151811061292357fe5b602002602001015190508281111561293c578193508092505b50600101612906565b50612957600b5487600a548589613137565b83838151811061296357fe5b60209081029190910101525090949350505050565b60005b612983611267565b8110156129dd576129be84828151811061299957fe5b60200260200101518483815181106129ad57fe5b60200260200101518463ffffffff16565b8482815181106129ca57fe5b602090810291909101015260010161297b565b50505050565b6000606060006129f284612ead565b90506000816002811115612a0257fe5b1415612a1c57612a128685613199565b9250925050611e7e565b6001816002811115612a2a57fe5b1415612a3a57612a12868561325c565b6002816002811115612a4857fe5b1415612a5957612a1286868661328e565b612a6461015061237e565b50935093915050565b612a7a828261121a612978565b6000612a8461169e565b5090506112a3611b3f828561271e565b6000612aa38215156004611259565b82612ab0575060006106c5565b670de0b6b3a764000083810290612ad390858381612aca57fe5b04146005611259565b828181612adc57fe5b049150506106c5565b6000828202612aff8415806111e45750838583816111e157fe5b670de0b6b3a764000090049392505050565b6000818060200190518101906111eb9190614627565b60606000612b358385612a94565b9050845167ffffffffffffffff81118015612b4f57600080fd5b50604051908082528060200260200182016040528015612b79578160200160208202803683370190505b50915060005b8551811015612bcd57612bae82878381518110612b9857fe5b6020026020010151612ae590919063ffffffff16565b838281518110612bba57fe5b6020908102919091010152600101612b7f565b50509392505050565b612bed6001600160a01b038316151561019b611259565b612bf9826000836112a3565b6001600160a01b038216600090815260208190526040902054612c1f90826101b261251d565b6001600160a01b038316600090815260208190526040902055600254612c459082613301565b6002556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c869085906147ae565b60405180910390a35050565b600060606000612ca184612ead565b90506001816002811115612cb157fe5b1415612cc257612a1286868661330f565b6002816002811115612cd057fe5b1415612ce057612a128685613379565b612a6461013661237e565b612a7a82826118bc612978565b6000612d078215156004611259565b82612d14575060006106c5565b670de0b6b3a764000083810290612d2e90858381612aca57fe5b826001820381612d3a57fe5b046001019150506106c5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b6000828202612dc48415806111e45750838583816111e157fe5b80612dd35760009150506106c5565b670de0b6b3a76400006000198201612d3a565b50600090565b60408051600280825260608281019093526000918291816020016020820280368337019050509250612e218660200151612d46565b15612e675760009150600190508483600081518110612e3c57fe5b6020026020010181815250508383600181518110612e5657fe5b602002602001018181525050612ea4565b60009050600191508383600081518110612e7d57fe5b6020026020010181815250508483600181518110612e9757fe5b6020026020010181815250505b93509350939050565b6000818060200190518101906106c591906143ca565b6060818060200190518101906111eb9190614490565b612ee5600083836112a3565b600254612ef290826118bc565b6002556001600160a01b038216600090815260208190526040902054612f1890826118bc565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c869085906147ae565b6000612f8f83878681518110612f7957fe5b602002602001015161121a90919063ffffffff16565b868581518110612f9b57fe5b6020026020010181815250506000612fb58888858961340e565b905083878681518110612fc457fe5b602002602001015101878681518110612fd957fe5b6020026020010181815250506124d860016127f2898981518110612ff957fe5b60200260200101518461121a90919063ffffffff16565b60006130388387878151811061302257fe5b60200260200101516118bc90919063ffffffff16565b86868151811061304457fe5b602002602001018181525050600061305e8888858861340e565b90508387878151811061306d57fe5b60200260200101510387878151811061308257fe5b6020026020010181815250506124d860016130a3838a8981518110612f7957fe5b9061121a565b60006130d47f2f1a0bc900000000000000000000000000000000000000000000000000000000610bc0565b82148061310857506131057feb0f24d600000000000000000000000000000000000000000000000000000000610bc0565b82145b806106c557506106c5826135cb565b60006131268215156004611259565b81838161312f57fe5b049392505050565b6000806131468787878761340e565b90508086858151811061315557fe5b60200260200101511161316c57600091505061143e565b60008187868151811061317b57fe5b60200260200101510390506124d88482612ae590919063ffffffff16565b600060606000806131a98561362f565b915091506131c16131b8611267565b82106064611259565b60606131cb611267565b67ffffffffffffffff811180156131e157600080fd5b5060405190808252806020026020018201604052801561320b578160200160208202803683370190505b509050600061321861169e565b5090506132378189858761322a6106cb565b613232610932565b613651565b82848151811061324357fe5b6020908102919091010152509196919550909350505050565b60006060600061326b8461376b565b90506060613281868361327c6106cb565b613781565b9196919550909350505050565b6000606080600061329e8561381d565b915091506132af8251610956611267565b6132b98287611d98565b60006132c361169e565b50905060006132e3828a866132d66106cb565b6132de610932565b613835565b90506132f38382111560cf611259565b989297509195505050505050565b60006111eb8383600161251d565b6000606080600061331f8561381d565b9150915061333561332e611267565b8351611b54565b61333f8287611d98565b600061334961169e565b5090506000613369828a8661335c6106cb565b613364610932565b613ac7565b90506132f38382101560d0611259565b600060606000806133898561362f565b915091506133986131b8611267565b60606133a2611267565b67ffffffffffffffff811180156133b857600080fd5b506040519080825280602002602001820160405280156133e2578160200160208202803683370190505b50905060006133ef61169e565b509050613237818985876134016106cb565b613409610932565b613d58565b60008084518602905060008560008151811061342657fe5b60200260200101519050600086518760008151811061344157fe5b60200260200101510290506000600190505b87518110156134a75761348c61348661347f848b858151811061347257fe5b60200260200101516111c7565b8a516111c7565b88613117565b915061349d88828151811061273e57fe5b9250600101613453565b508685815181106134b457fe5b60200260200101518203915060006134cc87886111c7565b905060006134f86134ec6134e48461081589886111c7565b6103e86111c7565b8a898151811061347257fe5b9050600061351361350c6134e48b89613117565b86906118bc565b905060008061352f61352586866118bc565b6108158d866118bc565b905060005b60ff8110156135af57819250613564613551866127f285866111c7565b6108158e6130a3886127f28860026111c7565b91508282111561358d57600183830311613588575097506112129650505050505050565b6135a7565b6001828403116135a7575097506112129650505050505050565b600101613534565b506135bb61014261237e565b5050505050505050949350505050565b60006135f67f38e9922e00000000000000000000000000000000000000000000000000000000610bc0565b8214806106c557506136277f50dd6ed900000000000000000000000000000000000000000000000000000000610bc0565b909114919050565b60008082806020019051810190613646919061445a565b909590945092505050565b60008061365e888861271e565b905060006136808261367a87613674818b61121a565b90612cf8565b90612daa565b905060006136908a8a848b61340e565b905060006136a4828b8b81518110612f7957fe5b90506000805b8b518110156136e3576136d98c82815181106136c257fe5b6020026020010151836118bc90919063ffffffff16565b91506001016136aa565b50600061370c828d8d815181106136f657fe5b6020026020010151612a9490919063ffffffff16565b9050600061371982613e33565b905060006137278583612daa565b90506000613735868361121a565b905061375661374f83670de0b6b3a76400008e9003612ae5565b82906118bc565b99505050505050505050509695505050505050565b6000818060200190518101906111eb919061442d565b6060600061378f8484612a94565b90506060855167ffffffffffffffff811180156137ab57600080fd5b506040519080825280602002602001820160405280156137d5578160200160208202803683370190505b50905060005b8651811015613813576137f483888381518110612b9857fe5b82828151811061380057fe5b60209081029190910101526001016137db565b5095945050505050565b606060008280602001905181019061364691906143e6565b600080805b865181101561385c576138528782815181106136c257fe5b915060010161383a565b506060855167ffffffffffffffff8111801561387757600080fd5b506040519080825280602002602001820160405280156138a1578160200160208202803683370190505b5090506000805b88518110156139685760006138d9858b84815181106138c357fe5b6020026020010151612cf890919063ffffffff16565b90506139158a83815181106138ea57fe5b60200260200101516136748b858151811061390157fe5b60200260200101518d8681518110612f7957fe5b84838151811061392157fe5b60200260200101818152505061395d6139568286858151811061394057fe5b6020026020010151612daa90919063ffffffff16565b84906118bc565b9250506001016138a8565b506060885167ffffffffffffffff8111801561398357600080fd5b506040519080825280602002602001820160405280156139ad578160200160208202803683370190505b50905060005b8951811015613a785760008482815181106139ca57fe5b6020026020010151841115613a315760006139f36139e786613e33565b8d8581518110612b9857fe5b90506000613a07828d8681518110612f7957fe5b9050613a28613a2182670de0b6b3a76400008d9003612cf8565b83906118bc565b92505050613a48565b898281518110613a3d57fe5b602002602001015190505b613a58818c8481518110612f7957fe5b838381518110613a6457fe5b6020908102919091010152506001016139b3565b506000613a858b8b61271e565b90506000613a938c8461271e565b90506000613aa18284612a94565b9050613ab6613aaf82613e33565b8b90612daa565b9d9c50505050505050505050505050565b600080805b8651811015613aee57613ae48782815181106136c257fe5b9150600101613acc565b506060855167ffffffffffffffff81118015613b0957600080fd5b50604051908082528060200260200182016040528015613b33578160200160208202803683370190505b5090506000805b8851811015613bcd576000613b55858b84815181106136f657fe5b9050613b978a8381518110613b6657fe5b6020026020010151613b918b8581518110613b7d57fe5b60200260200101518d868151811061302257fe5b90612a94565b848381518110613ba357fe5b602002602001018181525050613bc261395682868581518110612b9857fe5b925050600101613b3a565b506060885167ffffffffffffffff81118015613be857600080fd5b50604051908082528060200260200182016040528015613c12578160200160208202803683370190505b50905060005b8951811015613cd357600083858381518110613c3057fe5b60200260200101511115613c8c576000613c556139e786670de0b6b3a764000061121a565b90506000613c69828d8681518110612f7957fe5b9050613c83613a2182670de0b6b3a76400008d9003612ae5565b92505050613ca3565b898281518110613c9857fe5b602002602001015190505b613cb3818c848151811061302257fe5b838381518110613cbf57fe5b602090810291909101015250600101613c18565b506000613ce08b8b61271e565b90506000613cee8c8461271e565b90506000613cfc8284612a94565b9050670de0b6b3a7640000811115613d4857613d3a8a7ffffffffffffffffffffffffffffffffffffffffffffffffff21f494c589c00008301612ae5565b97505050505050505061143e565b600097505050505050505061143e565b600080613d65888861271e565b90506000613d7b8261367a87613674818b6118bc565b90506000613d8b8a8a848b61340e565b90506000613db58a8a81518110613d9e57fe5b60200260200101518361121a90919063ffffffff16565b90506000805b8b51811015613ddd57613dd38c82815181106136c257fe5b9150600101613dbb565b506000613df0828d8d815181106136f657fe5b90506000613dfd82613e33565b90506000613e0b8583612daa565b90506000613e19868361121a565b905061375661374f83670de0b6b3a76400008e9003612cf8565b6000670de0b6b3a76400008210613e4b5760006106c5565b50670de0b6b3a76400000390565b80356106c581614944565b600082601f830112613e74578081fd5b8135613e87613e8282614924565b6148fd565b818152915060208083019084810181840286018201871015613ea857600080fd5b60005b8481101561287557813584529282019290820190600101613eab565b600082601f830112613ed7578081fd5b8151613ee5613e8282614924565b818152915060208083019084810181840286018201871015613f0657600080fd5b60005b8481101561287557815184529282019290820190600101613f09565b600082601f830112613f35578081fd5b813567ffffffffffffffff811115613f4b578182fd5b613f5e6020601f19601f840116016148fd565b9150808252836020828501011115613f7557600080fd5b8060208401602084013760009082016020015292915050565b8035600281106106c557600080fd5b6000610120808385031215613fb0578182fd5b613fb9816148fd565b915050613fc68383613f8e565b8152613fd58360208401613e59565b6020820152613fe78360408401613e59565b6040820152606082013560608201526080820135608082015260a082013560a08201526140178360c08401613e59565b60c08201526140298360e08401613e59565b60e08201526101008083013567ffffffffffffffff81111561404a57600080fd5b61405685828601613f25565b82840152505092915050565b600060208284031215614073578081fd5b81356111eb81614944565b60008060408385031215614090578081fd5b823561409b81614944565b915060208301356140ab81614944565b809150509250929050565b6000806000606084860312156140ca578081fd5b83356140d581614944565b925060208401356140e581614944565b929592945050506040919091013590565b600080600080600080600060e0888a031215614110578283fd5b873561411b81614944565b9650602088013561412b81614944565b95506040880135945060608801359350608088013561414981614966565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215614178578182fd5b823561418381614944565b946020939093013593505050565b6000806000606084860312156141a5578081fd5b835167ffffffffffffffff808211156141bc578283fd5b818601915086601f8301126141cf578283fd5b81516141dd613e8282614924565b80828252602080830192508086018b8283870289010111156141fd578788fd5b8796505b8487101561422857805161421481614944565b845260019690960195928101928101614201565b50890151909750935050508082111561423f578283fd5b5061424c86828701613ec7565b925050604084015190509250925092565b60006020828403121561426e578081fd5b815180151581146111eb578182fd5b600080600080600080600060e0888a031215614297578081fd5b8735965060208801356142a981614944565b955060408801356142b981614944565b9450606088013567ffffffffffffffff808211156142d5578283fd5b6142e18b838c01613e64565b955060808a0135945060a08a0135935060c08a0135915080821115614304578283fd5b506143118a828b01613f25565b91505092959891949750929550565b600060208284031215614331578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146111eb578182fd5b600060208284031215614371578081fd5b81516111eb81614944565b6000806040838503121561438e578182fd5b823561439981614944565b9150602083013567ffffffffffffffff8111156143b4578182fd5b6143c085828601613f25565b9150509250929050565b6000602082840312156143db578081fd5b81516111eb81614959565b6000806000606084860312156143fa578081fd5b835161440581614959565b602085015190935067ffffffffffffffff811115614421578182fd5b61424c86828701613ec7565b6000806040838503121561443f578182fd5b825161444a81614959565b6020939093015192949293505050565b60008060006060848603121561446e578081fd5b835161447981614959565b602085015160409095015190969495509392505050565b600080604083850312156144a2578182fd5b82516144ad81614959565b602084015190925067ffffffffffffffff8111156144c9578182fd5b6143c085828601613ec7565b600080600080608085870312156144ea578182fd5b843567ffffffffffffffff80821115614501578384fd5b61450d88838901613f9d565b95506020870135915080821115614522578384fd5b5061452f87828801613e64565b949794965050505060408301359260600135919050565b60008060006060848603121561455a578081fd5b833567ffffffffffffffff811115614570578182fd5b61457c86828701613f9d565b9660208601359650604090950135949350505050565b6000602082840312156145a3578081fd5b5035919050565b600080604083850312156145bc578182fd5b50508035926020909101359150565b600080600080608085870312156145e0578182fd5b845193506020850151925060408501519150606085015161460081614944565b939692955090935050565b60006020828403121561461c578081fd5b81516111eb81614966565b60008060408385031215614639578182fd5b825161444a81614966565b6000815180845260208085019450808401835b8381101561467357815187529582019590820190600101614657565b509495945050505050565b60008151808452815b818110156146a357602081850181015186830182015201614687565b818111156146b45782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6000602082526111eb6020830184614644565b6000604082526147796040830185614644565b828103602084015261143e8185614644565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b600083825260406020830152611212604083018461467e565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526111eb602083018461467e565b6000838252604060208301526112126040830184614644565b9283529015156020830152604082015260600190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561491c57600080fd5b604052919050565b600067ffffffffffffffff82111561493a578081fd5b5060209081020190565b6001600160a01b038116811461088c57600080fd5b6003811061088c57600080fd5b60ff8116811461088c57600080fdfea26469706673582212200b4ccacd36cf60706a9f9f10be90785ff089fc18314f4312da2aaa6f4a1ddf3264736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100bd5760003560e01c80636c57f5a911610076578063851c1bb31161005b578063851c1bb31461015e5780638d928af81461017e578063aaabadc514610186576100bd565b80636c57f5a9146101365780637932c7f31461013e576100bd565b80632da47c40116100a75780632da47c40146100f65780632f2770db1461010c5780636634b75314610116576100bd565b8062c194db146100c2578063174481fa146100e0575b600080fd5b6100ca61018e565b6040516100d79190610bd1565b60405180910390f35b6100e86101ad565b6040516100d7929190610b6a565b6100fe6101f3565b6040516100d7929190610ca1565b61011461025d565b005b6101296101243660046108ec565b6102c2565b6040516100d79190610b91565b6101296102ed565b61015161014c366004610984565b6102f6565b6040516100d79190610b49565b61017161016c366004610928565b610353565b6040516100d79190610b9c565b6101516103a5565b6101516103c9565b60606101a8604051806020016040528060008152506104af565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561024f57807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610258565b60009250600091505b509091565b610265610588565b61026d6105d1565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b60015460ff1690565b60008060006103036101f3565b915091506103466103126103a5565b8a8a8a8a8a88888c60405160200161033299989796959493929190610be4565b6040516020818303038152906040526105e6565b9998505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610388929190610b19565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006103d36103a5565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561041857600080fd5b505afa15801561042c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101a89190610968565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506104a973ffffffffffffffffffffffffffffffffffffffff831615156101ac61067a565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010161057a81838661068c565b505050505050505050919050565b60006105b76000357fffffffff0000000000000000000000000000000000000000000000000000000016610353565b90506105ce6105c68233610706565b61019161067a565b50565b6105e46105dc6102ed565b1560d361067a565b565b60006105f06105d1565b60006105fb836107a5565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b8161068857610688816107ed565b5050565b5b602081106106ca5781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00161068d565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b60006107106103c9565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040161074c93929190610ba5565b60206040518083038186803b15801561076457600080fd5b505afa158015610778573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079c9190610908565b90505b92915050565b600060606107b2836104af565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff81166107e6573d6000803e3d6000fd5b9392505050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b803561079f81610cef565b600082601f830112610875578081fd5b813567ffffffffffffffff81111561088b578182fd5b6108bc60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610caf565b91508082528360208285010111156108d357600080fd5b8060208401602084013760009082016020015292915050565b6000602082840312156108fd578081fd5b81356107e681610cef565b600060208284031215610919578081fd5b815180151581146107e6578182fd5b600060208284031215610939578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146107e6578182fd5b600060208284031215610979578081fd5b81516107e681610cef565b60008060008060008060c0878903121561099c578182fd5b863567ffffffffffffffff808211156109b3578384fd5b6109bf8a838b01610865565b97506020915081890135818111156109d5578485fd5b6109e18b828c01610865565b9750506040890135818111156109f5578485fd5b8901601f81018b13610a05578485fd5b803582811115610a13578586fd5b8381029250610a23848401610caf565b8181528481019083860185850187018f1015610a3d578889fd5b8895505b83861015610a6757610a538f8261085a565b835260019590950194918601918601610a41565b50985050505060608901359450505060808701359150610a8a8860a0890161085a565b90509295509295509295565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452815b81811015610ad557602081850181015186830182015201610ab9565b81811115610ae65782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825261079c6020830184610ab0565b600061012073ffffffffffffffffffffffffffffffffffffffff8c16835260208181850152610c158285018d610ab0565b91508382036040850152610c29828c610ab0565b84810360608601528a51808252828c01935090820190845b81811015610c6557610c538551610cd6565b83529383019391830191600101610c41565b50508093505050508660808301528560a08301528460c08301528360e0830152610c93610100830184610a96565b9a9950505050505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610cce57600080fd5b604052919050565b73ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff811681146105ce57600080fdfea26469706673582212203e21b58f8af1fae1264b60d1d3943af5dafd322bb7d6bf7b1a35daa2137032de64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/index.ts b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/index.ts new file mode 100644 index 0000000..0caf67a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { StablePoolV2Deployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as StablePoolV2Deployment; + + const args = [input.Vault]; + await task.deployAndVerify('StablePoolFactory', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/input.ts b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/input.ts new file mode 100644 index 0000000..aa94455 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/input.ts @@ -0,0 +1,11 @@ +import { Task, TaskMode } from '@src'; + +export type StablePoolV2Deployment = { + Vault: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); + +export default { + Vault, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/output/arbitrum.json new file mode 100644 index 0000000..0d8edbf --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "StablePoolFactory": "0xEF44D6786b2b4d544b7850Fe67CE6381626Bf2D6" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/output/gnosis.json b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/output/gnosis.json new file mode 100644 index 0000000..081b1a0 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "StablePoolFactory": "0xf23b4DB826DbA14c0e857029dfF076b1c0264843" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/output/goerli.json new file mode 100644 index 0000000..f3abc9b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/output/goerli.json @@ -0,0 +1,3 @@ +{ + "StablePoolFactory": "0xD360B8afb3d7463bE823bE1Ec3c33aA173EbE86e" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/output/kovan.json b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/output/kovan.json new file mode 100644 index 0000000..fa45281 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/output/kovan.json @@ -0,0 +1,3 @@ +{ + "StablePoolFactory": "0x1F47AB83420Cd1F818Df9aCBD6Ee68341bB91592" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/output/mainnet.json new file mode 100644 index 0000000..6f79d42 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "StablePoolFactory": "0x8df6EfEc5547e31B0eb7d1291B511FF8a2bf987c" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/output/optimism.json b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/output/optimism.json new file mode 100644 index 0000000..20fbaae --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/output/optimism.json @@ -0,0 +1,3 @@ +{ + "StablePoolFactory": "0xeb151668006CD04DAdD098AFd0a82e78F77076c3" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/output/polygon.json new file mode 100644 index 0000000..579c346 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/output/polygon.json @@ -0,0 +1,3 @@ +{ + "StablePoolFactory": "0xcA96C4f198d343E251b1a01F3EBA061ef3DA73C1" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/readme.md b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/readme.md new file mode 100644 index 0000000..0678131 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/readme.md @@ -0,0 +1,20 @@ +# 2022-06-09 - Stable Pool V2 + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> + +Deployment of a new version of `StablePoolFactory` corresponding to the [Phase I milestone](https://github.com/balancer-labs/balancer-v2-monorepo/milestone/13) of the re-release of Stable Pools, including features such as: + +- a wider invariant convergence range, preventing failures in case of tokens de-pegging +- introduction of Recovery Mode, which ensures LPs will always be able to exit the Pool, even under extreme failure conditions +- miscellaneous bug fixes + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`StablePoolFactory` artifact](./artifact/StablePoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/test/task.fork.ts new file mode 100644 index 0000000..26f4194 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220609-stable-pool-v2/test/task.fork.ts @@ -0,0 +1,232 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { BasePoolEncoder } from '@helpers/models/pools/utils/encoder'; +import { StablePoolEncoder } from '@helpers/models/pools/stable/encoder'; +import { SwapKind } from '@helpers/models/types/types'; +import * as expectEvent from '@helpers/expectEvent'; +import { bn, fp } from '@helpers/numbers'; +import { calculateInvariant } from '@helpers/models/pools/stable/math'; +import { expectEqualWithError } from '@helpers/relativeError'; +import { actionId } from '@helpers/models/misc/actions'; +import { MAX_UINT256 } from '@helpers/constants'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; + +import { describeForkTest, getSigner, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; + +describeForkTest('StablePoolFactory', 'mainnet', 14850000, function () { + let owner: SignerWithAddress, whale: SignerWithAddress, govMultisig: SignerWithAddress; + let factory: Contract, vault: Contract, authorizer: Contract, usdc: Contract, dai: Contract, usdt: Contract; + + let task: Task; + + const DAI = '0x6b175474e89094c44da98b954eedeac495271d0f'; + const USDC = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'; + const USDT = '0xdac17f958d2ee523a2206206994597c13d831ec7'; + + const tokens = [DAI, USDC]; + const amplificationParameter = bn(100); + const swapFeePercentage = fp(0.01); + const initialBalanceDAI = fp(1e6); + const initialBalanceUSDC = fp(1e6).div(1e12); // 6 digits + const initialBalances = [initialBalanceDAI, initialBalanceUSDC]; + const upscaledInitialBalances = [initialBalanceDAI, initialBalanceUSDC.mul(1e12)]; + + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + const LARGE_TOKEN_HOLDER = '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503'; + + before('run task', async () => { + task = new Task('20220609-stable-pool-v2', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('StablePoolFactory'); + }); + + before('load signers', async () => { + owner = await getSigner(); + whale = await impersonate(LARGE_TOKEN_HOLDER); + + govMultisig = await impersonate(GOV_MULTISIG); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + authorizer = await new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance( + 'Authorizer' + ); + + dai = await task.instanceAt('IERC20', DAI); + usdc = await task.instanceAt('IERC20', USDC); + usdt = await task.instanceAt('IERC20', USDT); + }); + + describe('create and swap', () => { + let pool: Contract; + let poolId: string; + + it('deploy a stable pool', async () => { + const tx = await factory.create('', '', tokens, amplificationParameter, swapFeePercentage, owner.address); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await task.instanceAt('StablePool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + }); + + it('initialize the pool', async () => { + await dai.connect(whale).approve(vault.address, MAX_UINT256); + await usdc.connect(whale).approve(vault.address, MAX_UINT256); + + const userData = StablePoolEncoder.joinInit(initialBalances); + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: tokens, + maxAmountsIn: initialBalances, + fromInternalBalance: false, + userData, + }); + + const { balances } = await vault.getPoolTokens(poolId); + expect(balances).to.deep.equal(initialBalances); + + const expectedInvariant = calculateInvariant(upscaledInitialBalances, amplificationParameter); + expectEqualWithError(await pool.balanceOf(owner.address), expectedInvariant, 0.001); + }); + + it('swap in the pool', async () => { + const amount = fp(500); + await dai.connect(whale).transfer(owner.address, amount); + await dai.connect(owner).approve(vault.address, amount); + + await vault + .connect(owner) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: DAI, assetOut: USDC, amount, userData: '0x' }, + { sender: owner.address, recipient: owner.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert pool swap + const expectedUSDC = amount.div(1e12); + expectEqualWithError(await dai.balanceOf(owner.address), 0, 0.0001); + expectEqualWithError(await usdc.balanceOf(owner.address), expectedUSDC, 0.1); + }); + }); + + describe('extremely unbalanced pools', () => { + it('the invariant converges', async () => { + const unbalancedTokens = [DAI, USDC, USDT]; + const unbalancedBalanceDAI = fp(0.00000001); + const unbalancedBalanceUSDC = fp(1200000000).div(1e12); // 6 digits + const unbalancedBalanceUSDT = fp(300).div(1e12); // 6 digits + const unbalancedBalances = [unbalancedBalanceDAI, unbalancedBalanceUSDC, unbalancedBalanceUSDT]; + const upscaledUnbalancedBalances = [ + unbalancedBalanceDAI, + unbalancedBalanceUSDC.mul(1e12), + unbalancedBalanceUSDT.mul(1e12), + ]; + + const tx = await factory.create( + '', + '', + unbalancedTokens, + amplificationParameter, + swapFeePercentage, + owner.address + ); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + const pool = await task.instanceAt('StablePool', event.args.pool); + const poolId = await pool.getPoolId(); + + // Initialize the pool + await dai.connect(whale).approve(vault.address, MAX_UINT256); + await usdc.connect(whale).approve(vault.address, MAX_UINT256); + await usdt.connect(whale).approve(vault.address, MAX_UINT256); + + const userData = StablePoolEncoder.joinInit(unbalancedBalances); + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: unbalancedTokens, + maxAmountsIn: unbalancedBalances, + fromInternalBalance: false, + userData, + }); + + // The fact that joining the pool did not revert is proof enough that the invariant converges, but we can also + // explicitly check the last invariant. + + const expectedInvariant = calculateInvariant(upscaledUnbalancedBalances, amplificationParameter); + const [lastInvariant] = await pool.getLastInvariant(); + expectEqualWithError(lastInvariant, expectedInvariant, 0.001); + }); + }); + + describe('recovery mode', () => { + let pool: Contract; + let poolId: string; + + before('deploy and initialize a stable pool', async () => { + const tx = await factory.create('', '', tokens, amplificationParameter, swapFeePercentage, owner.address); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await task.instanceAt('StablePool', event.args.pool); + poolId = await pool.getPoolId(); + + await dai.connect(whale).approve(vault.address, MAX_UINT256); + await usdc.connect(whale).approve(vault.address, MAX_UINT256); + + const userData = StablePoolEncoder.joinInit(initialBalances); + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: tokens, + maxAmountsIn: initialBalances, + fromInternalBalance: false, + userData, + }); + }); + + before('enter recovery mode', async () => { + await authorizer.connect(govMultisig).grantRole(await actionId(pool, 'enableRecoveryMode'), govMultisig.address); + await pool.connect(govMultisig).enableRecoveryMode(); + expect(await pool.inRecoveryMode()).to.be.true; + }); + + it('can exit via recovery mode', async () => { + const bptBalance = await pool.balanceOf(owner.address); + expect(bptBalance).to.gt(0); + + const vaultUSDCBalanceBeforeExit = await usdc.balanceOf(vault.address); + const ownerUSDCBalanceBeforeExit = await usdc.balanceOf(owner.address); + + const userData = BasePoolEncoder.recoveryModeExit(bptBalance); + await vault.connect(owner).exitPool(poolId, owner.address, owner.address, { + assets: tokens, + minAmountsOut: Array(tokens.length).fill(0), + fromInternalBalance: false, + userData, + }); + + const remainingBalance = await pool.balanceOf(owner.address); + expect(remainingBalance).to.equal(0); + + const vaultUSDCBalanceAfterExit = await usdc.balanceOf(vault.address); + const ownerUSDCBalanceAfterExit = await usdc.balanceOf(owner.address); + + expect(vaultUSDCBalanceAfterExit).to.lt(vaultUSDCBalanceBeforeExit); + expect(ownerUSDCBalanceAfterExit).to.gt(ownerUSDCBalanceBeforeExit); + }); + }); + + describe('factory disable', () => { + it('the factory can be disabled', async () => { + await authorizer.connect(govMultisig).grantRole(await actionId(factory, 'disable'), govMultisig.address); + await factory.connect(govMultisig).disable(); + + expect(await factory.isDisabled()).to.be.true; + await expect( + factory.create('', '', tokens, amplificationParameter, swapFeePercentage, owner.address) + ).to.be.revertedWith('BAL#211'); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20220628-gauge-adder-v2/artifact/GaugeAdder.json b/balpy/balancer-deployments/tasks/deprecated/20220628-gauge-adder-v2/artifact/GaugeAdder.json new file mode 100644 index 0000000..1a80890 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220628-gauge-adder-v2/artifact/GaugeAdder.json @@ -0,0 +1,299 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GaugeAdder", + "sourceName": "contracts/admin/GaugeAdder.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IGaugeController", + "name": "gaugeController", + "type": "address" + }, + { + "internalType": "contract IGaugeAdder", + "name": "previousGaugeAdder", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IGaugeAdder.GaugeType", + "name": "gaugeType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "contract ILiquidityGaugeFactory", + "name": "gaugeFactory", + "type": "address" + } + ], + "name": "GaugeFactoryAdded", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "rootGauge", + "type": "address" + } + ], + "name": "addArbitrumGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStakingLiquidityGauge", + "name": "gauge", + "type": "address" + } + ], + "name": "addEthereumGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ILiquidityGaugeFactory", + "name": "factory", + "type": "address" + }, + { + "internalType": "enum IGaugeAdder.GaugeType", + "name": "gaugeType", + "type": "uint8" + } + ], + "name": "addGaugeFactory", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "rootGauge", + "type": "address" + } + ], + "name": "addGnosisGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "rootGauge", + "type": "address" + } + ], + "name": "addOptimismGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "rootGauge", + "type": "address" + } + ], + "name": "addPolygonGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "rootGauge", + "type": "address" + } + ], + "name": "addZKSyncGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizerAdaptor", + "outputs": [ + { + "internalType": "contract IAuthorizerAdaptor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IGaugeAdder.GaugeType", + "name": "gaugeType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getFactoryForGaugeType", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IGaugeAdder.GaugeType", + "name": "gaugeType", + "type": "uint8" + } + ], + "name": "getFactoryForGaugeTypeCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeController", + "outputs": [ + { + "internalType": "contract IGaugeController", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "pool", + "type": "address" + } + ], + "name": "getPoolGauge", + "outputs": [ + { + "internalType": "contract ILiquidityGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + }, + { + "internalType": "enum IGaugeAdder.GaugeType", + "name": "gaugeType", + "type": "uint8" + } + ], + "name": "isGaugeFromValidFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101206040523480156200001257600080fd5b506040516200163638038062001636833981810160405260408110156200003857600080fd5b508051602091820151604080516303e1469160e61b81529051929391926001600160a01b0385169263f851a4409260048082019391829003018186803b1580156200008257600080fd5b505afa15801562000097573d6000803e3d6000fd5b505050506040513d6020811015620000ae57600080fd5b5051604080516311b2515f60e31b815290516001600160a01b0390921691638d928af891600480820192602092909190829003018186803b158015620000f357600080fd5b505afa15801562000108573d6000803e3d6000fd5b505050506040513d60208110156200011f57600080fd5b5051306080526001600160601b0319606091821b811660a05260016000559083901b1660c052604080516303e1469160e61b815290516001600160a01b0384169163f851a440916004808301926020929190829003018186803b1580156200018657600080fd5b505afa1580156200019b573d6000803e3d6000fd5b505050506040513d6020811015620001b257600080fd5b5051600180546001600160a01b0319166001600160a01b03928316179055606082901b6001600160601b0319166101005260408051637e062a3560e11b815290519184169163fc0c546a91600480820192602092909190829003018186803b1580156200021e57600080fd5b505afa15801562000233573d6000803e3d6000fd5b505050506040513d60208110156200024a57600080fd5b50516001600160601b031960609190911b1660e052505060805160a05160601c60c05160601c60e05160601c6101005160601c61137a620002bc60003980610a605280610a9f52508061056552508061043652806106745280610e53525080610a0952508061099b525061137a6000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c8063a8ea687511610097578063c86f3a3911610066578063c86f3a391461034a578063e758d36b1461037d578063f3d8b4cf14610385578063f87fcfa2146103a557610100565b8063a8ea68751461028c578063aaabadc5146102bf578063abfca009146102c7578063bf2972d51461031757610100565b80636440e973116100d35780636440e973146101c45780638171bad914610200578063851c1bb3146102335780638d928af81461028457610100565b80633c6fc5a91461010557806352854ed71461013a57806358de9ade146101895780635e45a27314610191575b600080fd5b6101386004803603602081101561011b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166103d8565b005b6101606004803603604081101561015057600080fd5b5060ff81351690602001356103ee565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610160610434565b610138600480360360208110156101a757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610458565b610138600480360360408110156101da57600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013560ff1661066a565b6101386004803603602081101561021657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610982565b6102726004803603602081101561024957600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016610995565b60408051918252519081900360200190f35b610160610a07565b610160600480360360208110156102a257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610a2b565b610160610b59565b610303600480360360408110156102dd57600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013560ff16610bd9565b604080519115158252519081900360200190f35b6101386004803603602081101561032d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610ce0565b6101386004803603602081101561036057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610cf3565b610160610d06565b6102726004803603602081101561039b57600080fd5b503560ff16610d22565b610138600480360360208110156103bb57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610d55565b6103e0610d68565b6103eb816007610dae565b50565b600061042b826002600086600781111561040457fe5b600781111561040f57fe5b81526020019081526020016000206110c990919063ffffffff16565b90505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b610460610d68565b60008173ffffffffffffffffffffffffffffffffffffffff166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b1580156104a857600080fd5b505afa1580156104bc573d6000803e3d6000fd5b505050506040513d60208110156104d257600080fd5b5051905060006104e182610a2b565b73ffffffffffffffffffffffffffffffffffffffff161461056357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4475706c69636174652067617567650000000000000000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610608576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061131e6027913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff818116600090815260036020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055610666826002610dae565b5050565b610672610d68565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639fba03a16040518163ffffffff1660e01b815260040160206040518083038186803b1580156106d857600080fd5b505afa1580156106ec573d6000803e3d6000fd5b505050506040513d602081101561070257600080fd5b5051600f0b81600781111561071357fe5b1061077f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e76616c696420676175676520747970650000000000000000000000000000604482015290519081900360640190fd5b604080517fce3cc8bd00000000000000000000000000000000000000000000000000000000815260006004820152905173ffffffffffffffffffffffffffffffffffffffff84169163ce3cc8bd916024808301926020929190829003018186803b1580156107ec57600080fd5b505afa158015610800573d6000803e3d6000fd5b505050506040513d602081101561081657600080fd5b50511561088457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f496e76616c696420666163746f727920696d706c656d656e746174696f6e0000604482015290519081900360640190fd5b60006002600083600781111561089657fe5b60078111156108a157fe5b8152602081019190915260400160002090506108bd81846110e5565b61092857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f466163746f727920616c72656164792061646465640000000000000000000000604482015290519081900360640190fd5b81600781111561093457fe5b6040805173ffffffffffffffffffffffffffffffffffffffff8616815290517f39a43f795b6ee7259df4404784d3b77b09d09d5fee8454c3d641d48a888e188d9181900360200190a2505050565b61098a610d68565b6103eb816005610dae565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff0000000000000000000000000000000000000000000000000000000084168284015282516024818403018152604490920190925280519101205b919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b73ffffffffffffffffffffffffffffffffffffffff80821660009081526003602052604081205490911680158015610a9857507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b1561042e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a8ea6875846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610b2457600080fd5b505afa158015610b38573d6000803e3d6000fd5b505050506040513d6020811015610b4e57600080fd5b50519150610a029050565b6000610b63610a07565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015610ba857600080fd5b505afa158015610bbc573d6000803e3d6000fd5b505050506040513d6020811015610bd257600080fd5b5051905090565b60008060026000846007811115610bec57fe5b6007811115610bf757fe5b815260200190815260200160002090506000610c128261116d565b905060005b81811015610cd457610c298382611171565b73ffffffffffffffffffffffffffffffffffffffff1663ce3cc8bd876040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610c8f57600080fd5b505afa158015610ca3573d6000803e3d6000fd5b505050506040513d6020811015610cb957600080fd5b505115610ccc576001935050505061042e565b600101610c17565b50600095945050505050565b610ce8610d68565b6103eb816004610dae565b610cfb610d68565b6103eb816006610dae565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b600061042e60026000846007811115610d3757fe5b6007811115610d4257fe5b815260200190815260200160002061116d565b610d5d610d68565b6103eb816003610dae565b6000610d976000357fffffffff0000000000000000000000000000000000000000000000000000000016610995565b90506103eb610da682336111ab565b610191611274565b610db88282610bd9565b610e2357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c696420676175676500000000000000000000000000000000000000604482015290519081900360640190fd5b60015460405173ffffffffffffffffffffffffffffffffffffffff84811660248301908152921691634036176a917f0000000000000000000000000000000000000000000000000000000000000000917f3a04f900000000000000000000000000000000000000000000000000000000009187918791604401826007811115610ea857fe5b81526040805180830381526020928301825291820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000978816178152815160e08a901b909716875273ffffffffffffffffffffffffffffffffffffffff881660048801908152602488019283528351604489015283519397909650919450606490910192509080838360005b83811015610f6c578181015183820152602001610f54565b50505050905090810190601f168015610f995780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b158015610fb957600080fd5b505af1158015610fcd573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052602081101561101457600080fd5b810190808051604051939291908464010000000082111561103457600080fd5b90830190602082018581111561104957600080fd5b825164010000000081118282018810171561106357600080fd5b82525081516020918201929091019080838360005b83811015611090578181015183820152602001611078565b50505050905090810190601f1680156110bd5780820380516001836020036101000a031916815260200191505b50604052505050505050565b81546000906110db9083106064611274565b61042b8383611171565b60006110f18383611282565b61116557508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86169081179091558554908252828601909352604090209190915561042e565b50600061042e565b5490565b600082600001828154811061118257fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169392505050565b60006111b5610b59565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b15801561124157600080fd5b505afa158015611255573d6000803e3d6000fd5b505050506040513d602081101561126b57600080fd5b50519392505050565b8161066657610666816112b0565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001919091016020526040902054151590565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fdfe43616e6e6f742061646420676175676520666f722038302f32302042414c2d5745544820425054a26469706673582212209fe2afdd9f01303d51f4f6f0f90a84f71f71d27095426abe7d4a54ef3169856b64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101005760003560e01c8063a8ea687511610097578063c86f3a3911610066578063c86f3a391461034a578063e758d36b1461037d578063f3d8b4cf14610385578063f87fcfa2146103a557610100565b8063a8ea68751461028c578063aaabadc5146102bf578063abfca009146102c7578063bf2972d51461031757610100565b80636440e973116100d35780636440e973146101c45780638171bad914610200578063851c1bb3146102335780638d928af81461028457610100565b80633c6fc5a91461010557806352854ed71461013a57806358de9ade146101895780635e45a27314610191575b600080fd5b6101386004803603602081101561011b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166103d8565b005b6101606004803603604081101561015057600080fd5b5060ff81351690602001356103ee565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610160610434565b610138600480360360208110156101a757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610458565b610138600480360360408110156101da57600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013560ff1661066a565b6101386004803603602081101561021657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610982565b6102726004803603602081101561024957600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016610995565b60408051918252519081900360200190f35b610160610a07565b610160600480360360208110156102a257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610a2b565b610160610b59565b610303600480360360408110156102dd57600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013560ff16610bd9565b604080519115158252519081900360200190f35b6101386004803603602081101561032d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610ce0565b6101386004803603602081101561036057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610cf3565b610160610d06565b6102726004803603602081101561039b57600080fd5b503560ff16610d22565b610138600480360360208110156103bb57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610d55565b6103e0610d68565b6103eb816007610dae565b50565b600061042b826002600086600781111561040457fe5b600781111561040f57fe5b81526020019081526020016000206110c990919063ffffffff16565b90505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b610460610d68565b60008173ffffffffffffffffffffffffffffffffffffffff166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b1580156104a857600080fd5b505afa1580156104bc573d6000803e3d6000fd5b505050506040513d60208110156104d257600080fd5b5051905060006104e182610a2b565b73ffffffffffffffffffffffffffffffffffffffff161461056357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4475706c69636174652067617567650000000000000000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610608576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061131e6027913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff818116600090815260036020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055610666826002610dae565b5050565b610672610d68565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639fba03a16040518163ffffffff1660e01b815260040160206040518083038186803b1580156106d857600080fd5b505afa1580156106ec573d6000803e3d6000fd5b505050506040513d602081101561070257600080fd5b5051600f0b81600781111561071357fe5b1061077f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e76616c696420676175676520747970650000000000000000000000000000604482015290519081900360640190fd5b604080517fce3cc8bd00000000000000000000000000000000000000000000000000000000815260006004820152905173ffffffffffffffffffffffffffffffffffffffff84169163ce3cc8bd916024808301926020929190829003018186803b1580156107ec57600080fd5b505afa158015610800573d6000803e3d6000fd5b505050506040513d602081101561081657600080fd5b50511561088457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f496e76616c696420666163746f727920696d706c656d656e746174696f6e0000604482015290519081900360640190fd5b60006002600083600781111561089657fe5b60078111156108a157fe5b8152602081019190915260400160002090506108bd81846110e5565b61092857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f466163746f727920616c72656164792061646465640000000000000000000000604482015290519081900360640190fd5b81600781111561093457fe5b6040805173ffffffffffffffffffffffffffffffffffffffff8616815290517f39a43f795b6ee7259df4404784d3b77b09d09d5fee8454c3d641d48a888e188d9181900360200190a2505050565b61098a610d68565b6103eb816005610dae565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff0000000000000000000000000000000000000000000000000000000084168284015282516024818403018152604490920190925280519101205b919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b73ffffffffffffffffffffffffffffffffffffffff80821660009081526003602052604081205490911680158015610a9857507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615155b1561042e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a8ea6875846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610b2457600080fd5b505afa158015610b38573d6000803e3d6000fd5b505050506040513d6020811015610b4e57600080fd5b50519150610a029050565b6000610b63610a07565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015610ba857600080fd5b505afa158015610bbc573d6000803e3d6000fd5b505050506040513d6020811015610bd257600080fd5b5051905090565b60008060026000846007811115610bec57fe5b6007811115610bf757fe5b815260200190815260200160002090506000610c128261116d565b905060005b81811015610cd457610c298382611171565b73ffffffffffffffffffffffffffffffffffffffff1663ce3cc8bd876040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610c8f57600080fd5b505afa158015610ca3573d6000803e3d6000fd5b505050506040513d6020811015610cb957600080fd5b505115610ccc576001935050505061042e565b600101610c17565b50600095945050505050565b610ce8610d68565b6103eb816004610dae565b610cfb610d68565b6103eb816006610dae565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b600061042e60026000846007811115610d3757fe5b6007811115610d4257fe5b815260200190815260200160002061116d565b610d5d610d68565b6103eb816003610dae565b6000610d976000357fffffffff0000000000000000000000000000000000000000000000000000000016610995565b90506103eb610da682336111ab565b610191611274565b610db88282610bd9565b610e2357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c696420676175676500000000000000000000000000000000000000604482015290519081900360640190fd5b60015460405173ffffffffffffffffffffffffffffffffffffffff84811660248301908152921691634036176a917f0000000000000000000000000000000000000000000000000000000000000000917f3a04f900000000000000000000000000000000000000000000000000000000009187918791604401826007811115610ea857fe5b81526040805180830381526020928301825291820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000978816178152815160e08a901b909716875273ffffffffffffffffffffffffffffffffffffffff881660048801908152602488019283528351604489015283519397909650919450606490910192509080838360005b83811015610f6c578181015183820152602001610f54565b50505050905090810190601f168015610f995780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b158015610fb957600080fd5b505af1158015610fcd573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052602081101561101457600080fd5b810190808051604051939291908464010000000082111561103457600080fd5b90830190602082018581111561104957600080fd5b825164010000000081118282018810171561106357600080fd5b82525081516020918201929091019080838360005b83811015611090578181015183820152602001611078565b50505050905090810190601f1680156110bd5780820380516001836020036101000a031916815260200191505b50604052505050505050565b81546000906110db9083106064611274565b61042b8383611171565b60006110f18383611282565b61116557508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86169081179091558554908252828601909352604090209190915561042e565b50600061042e565b5490565b600082600001828154811061118257fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169392505050565b60006111b5610b59565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b15801561124157600080fd5b505afa158015611255573d6000803e3d6000fd5b505050506040513d602081101561126b57600080fd5b50519392505050565b8161066657610666816112b0565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001919091016020526040902054151590565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fdfe43616e6e6f742061646420676175676520666f722038302f32302042414c2d5745544820425054a26469706673582212209fe2afdd9f01303d51f4f6f0f90a84f71f71d27095426abe7d4a54ef3169856b64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220628-gauge-adder-v2/index.ts b/balpy/balancer-deployments/tasks/deprecated/20220628-gauge-adder-v2/index.ts new file mode 100644 index 0000000..14c6f72 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220628-gauge-adder-v2/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { GaugeAdderDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as GaugeAdderDeployment; + + const gaugeAdderArgs = [input.GaugeController, input.PreviousGaugeAdder]; + await task.deployAndVerify('GaugeAdder', gaugeAdderArgs, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220628-gauge-adder-v2/input.ts b/balpy/balancer-deployments/tasks/deprecated/20220628-gauge-adder-v2/input.ts new file mode 100644 index 0000000..863128e --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220628-gauge-adder-v2/input.ts @@ -0,0 +1,19 @@ +import { Task, TaskMode } from '@src'; + +export type GaugeAdderDeployment = { + PreviousGaugeAdder: string; + GaugeController: string; +}; + +const GaugeAdder = new Task('20220325-gauge-adder', TaskMode.READ_ONLY); +const GaugeController = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); + +export default { + GaugeController, + mainnet: { + PreviousGaugeAdder: GaugeAdder.output({ network: 'mainnet' }).GaugeAdder, + }, + goerli: { + PreviousGaugeAdder: GaugeAdder.output({ network: 'goerli' }).GaugeAdder, + }, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220628-gauge-adder-v2/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20220628-gauge-adder-v2/output/goerli.json new file mode 100644 index 0000000..370670d --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220628-gauge-adder-v2/output/goerli.json @@ -0,0 +1,3 @@ +{ + "GaugeAdder": "0x42bAF6db21250fa76d015621D2F6DF172858A5cb" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220628-gauge-adder-v2/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20220628-gauge-adder-v2/output/mainnet.json new file mode 100644 index 0000000..26aac5e --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220628-gauge-adder-v2/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "GaugeAdder": "0x2fFB7B215Ae7F088eC2530C7aa8E1B24E398f26a" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220628-gauge-adder-v2/readme.md b/balpy/balancer-deployments/tasks/deprecated/20220628-gauge-adder-v2/readme.md new file mode 100644 index 0000000..89c6bdb --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220628-gauge-adder-v2/readme.md @@ -0,0 +1,14 @@ +# 2022-06-28 - GaugeAdder V2 + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This version has been deprecated. Here is the [current version](../../20230519-gauge-adder-v4), which uses the Authorizer Adaptor Entrypoint and supports dynamic gauge types. + +Deployment of the new `GaugeAdder`, a helper contract which helps prevent some forms of improper configuration on the `GaugeController`. This version adds support for deploying gauges with the types for use with the Optimism, Gnosis Chain, and ZKSync networks. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`GaugeAdder` artifact](./artifact/GaugeAdder.json) +- [Previous `GaugeAdder` deployment](../20220325-gauge-adder/) diff --git a/balpy/balancer-deployments/tasks/deprecated/20220628-optimism-root-gauge-factory/artifact/OptimismRootGauge.json b/balpy/balancer-deployments/tasks/deprecated/20220628-optimism-root-gauge-factory/artifact/OptimismRootGauge.json new file mode 100644 index 0000000..ed3809a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220628-optimism-root-gauge-factory/artifact/OptimismRootGauge.json @@ -0,0 +1,181 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "OptimismRootGauge", + "sourceName": "contracts/gauges/optimism/OptimismRootGauge.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IBalancerMinter", + "name": "minter", + "type": "address" + }, + { + "internalType": "contract IL1StandardBridge", + "name": "optimismL1StandardBridge", + "type": "address" + }, + { + "internalType": "address", + "name": "optimismBal", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "periodTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "periodEmissions", + "type": "uint256" + } + ], + "name": "Checkpoint", + "type": "event" + }, + { + "inputs": [], + "name": "checkpoint", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "getOptimismBal", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOptimismBridge", + "outputs": [ + { + "internalType": "contract IL1StandardBridge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRecipient", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "integrate_fraction", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "is_killed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "killGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unkillGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "user_checkpoint", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x6101e06040523480156200001257600080fd5b50604051620014a8380380620014a8833981810160405260608110156200003857600080fd5b50805160208083015160409384015160016000908155855163e6dec36f60e01b81529551949592949193869391926001600160a01b0385169263e6dec36f926004808301939192829003018186803b1580156200009457600080fd5b505afa158015620000a9573d6000803e3d6000fd5b505050506040513d6020811015620000c057600080fd5b50516040805163c003969960e01b815290519192506000916001600160a01b0384169163c0039699916004808301926020929190829003018186803b1580156200010957600080fd5b505afa1580156200011e573d6000803e3d6000fd5b505050506040513d60208110156200013557600080fd5b505160408051632c6f4d6f60e11b815290519192506000916001600160a01b038616916358de9ade916004808301926020929190829003018186803b1580156200017e57600080fd5b505afa15801562000193573d6000803e3d6000fd5b505050506040513d6020811015620001aa57600080fd5b50516001600160601b0319606084811b821660805285811b821660a05286811b821660c05282901b1660e052604080516303e1469160e61b815290519192506001600160a01b0383169163f851a44091600480820192602092909190829003018186803b1580156200021b57600080fd5b505afa15801562000230573d6000803e3d6000fd5b505050506040513d60208110156200024757600080fd5b505160601b6001600160601b0319166101005260408051635c3dab0b60e11b815290516001600160a01b0385169163b87b5616916004808301926020929190829003018186803b1580156200029b57600080fd5b505afa158015620002b0573d6000803e3d6000fd5b505050506040513d6020811015620002c757600080fd5b505161012052604080516321609bbf60e01b815290516001600160a01b038516916321609bbf916004808301926020929190829003018186803b1580156200030e57600080fd5b505afa15801562000323573d6000803e3d6000fd5b505050506040513d60208110156200033a57600080fd5b505161014052604080516303f7d6c760e51b815290516001600160a01b03851691637efad8e0916004808301926020929190829003018186803b1580156200038157600080fd5b505afa15801562000396573d6000803e3d6000fd5b505050506040513d6020811015620003ad57600080fd5b505161016052505060001960025550506001600160601b0319606092831b81166101805290821b166101a05233901b6101c0525060805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205161014051610160516101805160601c6101a05160601c6101c05160601c611006620004a260003980610bca5250806103295280610b9d5250806102ff5280610a6f5280610b515250806106f95250806106d85250806105a2528061074552508061036c52806104475280610937525080610530528061063452508061083b525080610d985280610e95525080610a335280610b7b52506110066000f3fe6080604052600436106100b15760003560e01c80639c868ac011610069578063c2c4c5c11161004e578063c2c4c5c1146101f0578063c4d66de8146101f8578063d34fb26714610238576100b1565b80639c868ac0146101c4578063ab8f0945146101d9576100b1565b80632d8411af1161009a5780632d8411af146101465780634b8200931461015b57806360b630c4146101af576100b1565b806309400707146100b65780631b88094d14610108575b600080fd5b3480156100c257600080fd5b506100f6600480360360208110156100d957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661024d565b60408051918252519081900360200190f35b34801561011457600080fd5b5061011d6102db565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561015257600080fd5b5061011d6102fd565b34801561016757600080fd5b5061019b6004803603602081101561017e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610321565b604080519115158252519081900360200190f35b3480156101bb57600080fd5b5061011d610327565b3480156101d057600080fd5b5061019b61034b565b3480156101e557600080fd5b506101ee610354565b005b61019b610425565b34801561020457600080fd5b506101ee6004803603602081101561021b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166108cb565b34801561024457600080fd5b506101ee61091f565b600073ffffffffffffffffffffffffffffffffffffffff821630146102d357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060045490565b600554610100900473ffffffffffffffffffffffffffffffffffffffff165b90565b7f000000000000000000000000000000000000000000000000000000000000000090565b50600190565b7f000000000000000000000000000000000000000000000000000000000000000090565b60055460ff1690565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146103f857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600061042f6109ed565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146104d357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b60025460006104e0610a06565b9050808210156108bd57604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b15801561057757600080fd5b505af115801561058b573d6000803e3d6000fd5b5050600180546003549590910194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff018110156107d057848111156105dc576107d0565b604080517fd3078c9400000000000000000000000000000000000000000000000000000000815230600482015262093a808302602482018190529151600091829173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163d3078c9491604480830192602092919082900301818787803b15801561067b57600080fd5b505af115801561068f573d6000803e3d6000fd5b505050506040513d60208110156106a557600080fd5b505190508285108015906106bd57508262093a800185105b1561077657828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000089028161072157fe5b04975062093a80819003670de0b6b3a7640000838a02820260018b905560038990557f0000000000000000000000000000000000000000000000000000000000000000909801970493909301925061078b9050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a2509390930192506001016105c4565b506002849055600480548301905581158015906107f0575060055460ff16155b156108b957604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b15801561088357600080fd5b505af1158015610897573d6000803e3d6000fd5b505050506040513d60208110156108ad57600080fd5b506108b9905082610a31565b5050505b6001925050506102fa610d1e565b6108d3610d25565b6005805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146109c357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6109ff60026000541415610190610f2d565b6002600055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610ae257600080fd5b505af1158015610af6573d6000803e3d6000fd5b505050506040513d6020811015610b0c57600080fd5b5050600554604080517fa0566e72000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081169363838b2520937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361010090930483169288927f00000000000000000000000000000000000000000000000000000000000000009091169163a0566e7291600480820192602092909190829003018186803b158015610c1357600080fd5b505afa158015610c27573d6000803e3d6000fd5b505050506040513d6020811015610c3d57600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b16815273ffffffffffffffffffffffffffffffffffffffff96871660048201529486166024860152929094166044840152606483015263ffffffff909216608482015260c060a4820152600260c48201527f307800000000000000000000000000000000000000000000000000000000000060e4820152905161010480830192600092919082900301818387803b158015610d0357600080fd5b505af1158015610d17573d6000803e3d6000fd5b5050505050565b6001600055565b60025415610d9457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610dfc57600080fd5b505afa158015610e10573d6000803e3d6000fd5b505050506040513d6020811015610e2657600080fd5b5051905080610e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180610fad6024913960400191505060405180910390fd5b6001819055610e8d610a06565b6002819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610efb57600080fd5b505af1158015610f0f573d6000803e3d6000fd5b505050506040513d6020811015610f2557600080fd5b505160035550565b81610f3b57610f3b81610f3f565b5050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fdfe42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a264697066735822122026c4dfe21ccd5b1ccc393f2e6c38f090bc6c0f102a9446c04b48acfa8b1c794664736f6c63430007010033", + "deployedBytecode": "0x6080604052600436106100b15760003560e01c80639c868ac011610069578063c2c4c5c11161004e578063c2c4c5c1146101f0578063c4d66de8146101f8578063d34fb26714610238576100b1565b80639c868ac0146101c4578063ab8f0945146101d9576100b1565b80632d8411af1161009a5780632d8411af146101465780634b8200931461015b57806360b630c4146101af576100b1565b806309400707146100b65780631b88094d14610108575b600080fd5b3480156100c257600080fd5b506100f6600480360360208110156100d957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661024d565b60408051918252519081900360200190f35b34801561011457600080fd5b5061011d6102db565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561015257600080fd5b5061011d6102fd565b34801561016757600080fd5b5061019b6004803603602081101561017e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610321565b604080519115158252519081900360200190f35b3480156101bb57600080fd5b5061011d610327565b3480156101d057600080fd5b5061019b61034b565b3480156101e557600080fd5b506101ee610354565b005b61019b610425565b34801561020457600080fd5b506101ee6004803603602081101561021b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166108cb565b34801561024457600080fd5b506101ee61091f565b600073ffffffffffffffffffffffffffffffffffffffff821630146102d357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060045490565b600554610100900473ffffffffffffffffffffffffffffffffffffffff165b90565b7f000000000000000000000000000000000000000000000000000000000000000090565b50600190565b7f000000000000000000000000000000000000000000000000000000000000000090565b60055460ff1690565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146103f857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600061042f6109ed565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146104d357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b60025460006104e0610a06565b9050808210156108bd57604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b15801561057757600080fd5b505af115801561058b573d6000803e3d6000fd5b5050600180546003549590910194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff018110156107d057848111156105dc576107d0565b604080517fd3078c9400000000000000000000000000000000000000000000000000000000815230600482015262093a808302602482018190529151600091829173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163d3078c9491604480830192602092919082900301818787803b15801561067b57600080fd5b505af115801561068f573d6000803e3d6000fd5b505050506040513d60208110156106a557600080fd5b505190508285108015906106bd57508262093a800185105b1561077657828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000089028161072157fe5b04975062093a80819003670de0b6b3a7640000838a02820260018b905560038990557f0000000000000000000000000000000000000000000000000000000000000000909801970493909301925061078b9050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a2509390930192506001016105c4565b506002849055600480548301905581158015906107f0575060055460ff16155b156108b957604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b15801561088357600080fd5b505af1158015610897573d6000803e3d6000fd5b505050506040513d60208110156108ad57600080fd5b506108b9905082610a31565b5050505b6001925050506102fa610d1e565b6108d3610d25565b6005805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146109c357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6109ff60026000541415610190610f2d565b6002600055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610ae257600080fd5b505af1158015610af6573d6000803e3d6000fd5b505050506040513d6020811015610b0c57600080fd5b5050600554604080517fa0566e72000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081169363838b2520937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361010090930483169288927f00000000000000000000000000000000000000000000000000000000000000009091169163a0566e7291600480820192602092909190829003018186803b158015610c1357600080fd5b505afa158015610c27573d6000803e3d6000fd5b505050506040513d6020811015610c3d57600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b16815273ffffffffffffffffffffffffffffffffffffffff96871660048201529486166024860152929094166044840152606483015263ffffffff909216608482015260c060a4820152600260c48201527f307800000000000000000000000000000000000000000000000000000000000060e4820152905161010480830192600092919082900301818387803b158015610d0357600080fd5b505af1158015610d17573d6000803e3d6000fd5b5050505050565b6001600055565b60025415610d9457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610dfc57600080fd5b505afa158015610e10573d6000803e3d6000fd5b505050506040513d6020811015610e2657600080fd5b5051905080610e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180610fad6024913960400191505060405180910390fd5b6001819055610e8d610a06565b6002819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610efb57600080fd5b505af1158015610f0f573d6000803e3d6000fd5b505050506040513d6020811015610f2557600080fd5b505160035550565b81610f3b57610f3b81610f3f565b5050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fdfe42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a264697066735822122026c4dfe21ccd5b1ccc393f2e6c38f090bc6c0f102a9446c04b48acfa8b1c794664736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220628-optimism-root-gauge-factory/artifact/OptimismRootGaugeFactory.json b/balpy/balancer-deployments/tasks/deprecated/20220628-optimism-root-gauge-factory/artifact/OptimismRootGaugeFactory.json new file mode 100644 index 0000000..1ff0706 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220628-optimism-root-gauge-factory/artifact/OptimismRootGaugeFactory.json @@ -0,0 +1,234 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "OptimismRootGaugeFactory", + "sourceName": "contracts/gauges/optimism/OptimismRootGaugeFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IBalancerMinter", + "name": "minter", + "type": "address" + }, + { + "internalType": "contract IL1StandardBridge", + "name": "optimismL1StandardBridge", + "type": "address" + }, + { + "internalType": "address", + "name": "optimismBal", + "type": "address" + }, + { + "internalType": "uint32", + "name": "gasLimit", + "type": "uint32" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + } + ], + "name": "OptimismGasLimitModified", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "gauge", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "OptimismRootGaugeCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeImplementation", + "outputs": [ + { + "internalType": "contract ISingleRecipientGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "getGaugeRecipient", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOptimismGasLimit", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "getRecipientGauge", + "outputs": [ + { + "internalType": "contract ILiquidityGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "isGaugeFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "gasLimit", + "type": "uint32" + } + ], + "name": "setOptimismGasLimit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60c060405234801561001057600080fd5b5060405161206438038061206483398101604081905261002f916100d1565b306080526001600160601b0319606086901b1660a052604051849084908490610057906100c4565b6100639392919061014d565b604051809103906000f08015801561007f573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b03929092169190911790556003805463ffffffff191663ffffffff929092169190911790555061018892505050565b6114a880610bbc83390190565b600080600080600060a086880312156100e8578081fd5b85516100f381610170565b602087015190955061010481610170565b604087015190945061011581610170565b606087015190935061012681610170565b608087015190925063ffffffff8116811461013f578182fd5b809150509295509295909350565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b038116811461018557600080fd5b50565b60805160a05160601c610a0e6101ae600039806102325250806101e25250610a0e6000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c8063a0566e7211610076578063bf5fa7721161005b578063bf5fa7721461014c578063ce3cc8bd14610161578063fa72ce9514610181576100be565b8063a0566e721461012f578063aaabadc514610144576100be565b8063851c1bb3116100a7578063851c1bb3146100f45780638d928af8146101145780639ed933181461011c576100be565b806339312dee146100c35780637d5d0d10146100e1575b600080fd5b6100cb610194565b6040516100d891906108d6565b60405180910390f35b6100cb6100ef3660046107ea565b6101b0565b610107610102366004610842565b6101de565b6040516100d89190610902565b6100cb610230565b6100cb61012a3660046107ea565b610254565b61013761041c565b6040516100d891906109a5565b6100cb610428565b61015f61015a366004610882565b6104b4565b005b61017461016f3660046107ea565b610527565b6040516100d891906108f7565b6100cb61018f3660046107ea565b610552565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260026020526040902054165b919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016102139291906108a6565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b73ffffffffffffffffffffffffffffffffffffffff818116600090815260026020526040812054909116156102be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b590610937565b60405180910390fd5b600080546102e19073ffffffffffffffffffffffffffffffffffffffff166105d8565b6040517fc4d66de800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063c4d66de8906103369086906004016108d6565b600060405180830381600087803b15801561035057600080fd5b505af1158015610364573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff818116600081815260016020818152604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909317909255938716808352600290945280822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517ff6bf7c6be6d4f86298f62bf53a2ac2abda41e9fa7fd22fceed43f61166f00e2f9190a392915050565b60035463ffffffff1690565b6000610432610230565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561047757600080fd5b505afa15801561048b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104af9190610806565b905090565b6104bc610685565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff83161790556040517f7c1820748876489d9c02f32c788d21f7a0719b00e777eca80532dd5d77c481ce9061051c9083906109a5565b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60008173ffffffffffffffffffffffffffffffffffffffff16631b88094d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561059a57600080fd5b505afa1580156105ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d29190610806565b92915050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff81166101d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b59061096e565b60006106b46000357fffffffff00000000000000000000000000000000000000000000000000000000166101de565b90506106cb6106c382336106ce565b61019161076b565b50565b60006106d8610428565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b81526004016107149392919061090b565b60206040518083038186803b15801561072c57600080fd5b505afa158015610740573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107649190610822565b9392505050565b81610779576107798161077d565b5050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6000602082840312156107fb578081fd5b8135610764816109b6565b600060208284031215610817578081fd5b8151610764816109b6565b600060208284031215610833578081fd5b81518015158114610764578182fd5b600060208284031215610853578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610764578182fd5b600060208284031215610893578081fd5b813563ffffffff81168114610764578182fd5b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60208082526014908201527f476175676520616c726561647920657869737473000000000000000000000000604082015260600190565b60208082526016908201527f455243313136373a20637265617465206661696c656400000000000000000000604082015260600190565b63ffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff811681146106cb57600080fdfea264697066735822122075123ef7ea84f3638f05333973067967fbba5706b93c3377131beb7307a52fab64736f6c634300070100336101e06040523480156200001257600080fd5b50604051620014a8380380620014a8833981810160405260608110156200003857600080fd5b50805160208083015160409384015160016000908155855163e6dec36f60e01b81529551949592949193869391926001600160a01b0385169263e6dec36f926004808301939192829003018186803b1580156200009457600080fd5b505afa158015620000a9573d6000803e3d6000fd5b505050506040513d6020811015620000c057600080fd5b50516040805163c003969960e01b815290519192506000916001600160a01b0384169163c0039699916004808301926020929190829003018186803b1580156200010957600080fd5b505afa1580156200011e573d6000803e3d6000fd5b505050506040513d60208110156200013557600080fd5b505160408051632c6f4d6f60e11b815290519192506000916001600160a01b038616916358de9ade916004808301926020929190829003018186803b1580156200017e57600080fd5b505afa15801562000193573d6000803e3d6000fd5b505050506040513d6020811015620001aa57600080fd5b50516001600160601b0319606084811b821660805285811b821660a05286811b821660c05282901b1660e052604080516303e1469160e61b815290519192506001600160a01b0383169163f851a44091600480820192602092909190829003018186803b1580156200021b57600080fd5b505afa15801562000230573d6000803e3d6000fd5b505050506040513d60208110156200024757600080fd5b505160601b6001600160601b0319166101005260408051635c3dab0b60e11b815290516001600160a01b0385169163b87b5616916004808301926020929190829003018186803b1580156200029b57600080fd5b505afa158015620002b0573d6000803e3d6000fd5b505050506040513d6020811015620002c757600080fd5b505161012052604080516321609bbf60e01b815290516001600160a01b038516916321609bbf916004808301926020929190829003018186803b1580156200030e57600080fd5b505afa15801562000323573d6000803e3d6000fd5b505050506040513d60208110156200033a57600080fd5b505161014052604080516303f7d6c760e51b815290516001600160a01b03851691637efad8e0916004808301926020929190829003018186803b1580156200038157600080fd5b505afa15801562000396573d6000803e3d6000fd5b505050506040513d6020811015620003ad57600080fd5b505161016052505060001960025550506001600160601b0319606092831b81166101805290821b166101a05233901b6101c0525060805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205161014051610160516101805160601c6101a05160601c6101c05160601c611006620004a260003980610bca5250806103295280610b9d5250806102ff5280610a6f5280610b515250806106f95250806106d85250806105a2528061074552508061036c52806104475280610937525080610530528061063452508061083b525080610d985280610e95525080610a335280610b7b52506110066000f3fe6080604052600436106100b15760003560e01c80639c868ac011610069578063c2c4c5c11161004e578063c2c4c5c1146101f0578063c4d66de8146101f8578063d34fb26714610238576100b1565b80639c868ac0146101c4578063ab8f0945146101d9576100b1565b80632d8411af1161009a5780632d8411af146101465780634b8200931461015b57806360b630c4146101af576100b1565b806309400707146100b65780631b88094d14610108575b600080fd5b3480156100c257600080fd5b506100f6600480360360208110156100d957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661024d565b60408051918252519081900360200190f35b34801561011457600080fd5b5061011d6102db565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561015257600080fd5b5061011d6102fd565b34801561016757600080fd5b5061019b6004803603602081101561017e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610321565b604080519115158252519081900360200190f35b3480156101bb57600080fd5b5061011d610327565b3480156101d057600080fd5b5061019b61034b565b3480156101e557600080fd5b506101ee610354565b005b61019b610425565b34801561020457600080fd5b506101ee6004803603602081101561021b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166108cb565b34801561024457600080fd5b506101ee61091f565b600073ffffffffffffffffffffffffffffffffffffffff821630146102d357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060045490565b600554610100900473ffffffffffffffffffffffffffffffffffffffff165b90565b7f000000000000000000000000000000000000000000000000000000000000000090565b50600190565b7f000000000000000000000000000000000000000000000000000000000000000090565b60055460ff1690565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146103f857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600061042f6109ed565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146104d357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b60025460006104e0610a06565b9050808210156108bd57604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b15801561057757600080fd5b505af115801561058b573d6000803e3d6000fd5b5050600180546003549590910194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff018110156107d057848111156105dc576107d0565b604080517fd3078c9400000000000000000000000000000000000000000000000000000000815230600482015262093a808302602482018190529151600091829173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163d3078c9491604480830192602092919082900301818787803b15801561067b57600080fd5b505af115801561068f573d6000803e3d6000fd5b505050506040513d60208110156106a557600080fd5b505190508285108015906106bd57508262093a800185105b1561077657828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000089028161072157fe5b04975062093a80819003670de0b6b3a7640000838a02820260018b905560038990557f0000000000000000000000000000000000000000000000000000000000000000909801970493909301925061078b9050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a2509390930192506001016105c4565b506002849055600480548301905581158015906107f0575060055460ff16155b156108b957604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b15801561088357600080fd5b505af1158015610897573d6000803e3d6000fd5b505050506040513d60208110156108ad57600080fd5b506108b9905082610a31565b5050505b6001925050506102fa610d1e565b6108d3610d25565b6005805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146109c357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6109ff60026000541415610190610f2d565b6002600055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610ae257600080fd5b505af1158015610af6573d6000803e3d6000fd5b505050506040513d6020811015610b0c57600080fd5b5050600554604080517fa0566e72000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081169363838b2520937f0000000000000000000000000000000000000000000000000000000000000000937f00000000000000000000000000000000000000000000000000000000000000009361010090930483169288927f00000000000000000000000000000000000000000000000000000000000000009091169163a0566e7291600480820192602092909190829003018186803b158015610c1357600080fd5b505afa158015610c27573d6000803e3d6000fd5b505050506040513d6020811015610c3d57600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b16815273ffffffffffffffffffffffffffffffffffffffff96871660048201529486166024860152929094166044840152606483015263ffffffff909216608482015260c060a4820152600260c48201527f307800000000000000000000000000000000000000000000000000000000000060e4820152905161010480830192600092919082900301818387803b158015610d0357600080fd5b505af1158015610d17573d6000803e3d6000fd5b5050505050565b6001600055565b60025415610d9457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610dfc57600080fd5b505afa158015610e10573d6000803e3d6000fd5b505050506040513d6020811015610e2657600080fd5b5051905080610e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180610fad6024913960400191505060405180910390fd5b6001819055610e8d610a06565b6002819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610efb57600080fd5b505af1158015610f0f573d6000803e3d6000fd5b505050506040513d6020811015610f2557600080fd5b505160035550565b81610f3b57610f3b81610f3f565b5050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fdfe42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a264697066735822122026c4dfe21ccd5b1ccc393f2e6c38f090bc6c0f102a9446c04b48acfa8b1c794664736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100be5760003560e01c8063a0566e7211610076578063bf5fa7721161005b578063bf5fa7721461014c578063ce3cc8bd14610161578063fa72ce9514610181576100be565b8063a0566e721461012f578063aaabadc514610144576100be565b8063851c1bb3116100a7578063851c1bb3146100f45780638d928af8146101145780639ed933181461011c576100be565b806339312dee146100c35780637d5d0d10146100e1575b600080fd5b6100cb610194565b6040516100d891906108d6565b60405180910390f35b6100cb6100ef3660046107ea565b6101b0565b610107610102366004610842565b6101de565b6040516100d89190610902565b6100cb610230565b6100cb61012a3660046107ea565b610254565b61013761041c565b6040516100d891906109a5565b6100cb610428565b61015f61015a366004610882565b6104b4565b005b61017461016f3660046107ea565b610527565b6040516100d891906108f7565b6100cb61018f3660046107ea565b610552565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260026020526040902054165b919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016102139291906108a6565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b73ffffffffffffffffffffffffffffffffffffffff818116600090815260026020526040812054909116156102be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b590610937565b60405180910390fd5b600080546102e19073ffffffffffffffffffffffffffffffffffffffff166105d8565b6040517fc4d66de800000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063c4d66de8906103369086906004016108d6565b600060405180830381600087803b15801561035057600080fd5b505af1158015610364573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff818116600081815260016020818152604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909317909255938716808352600290945280822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517ff6bf7c6be6d4f86298f62bf53a2ac2abda41e9fa7fd22fceed43f61166f00e2f9190a392915050565b60035463ffffffff1690565b6000610432610230565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561047757600080fd5b505afa15801561048b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104af9190610806565b905090565b6104bc610685565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff83161790556040517f7c1820748876489d9c02f32c788d21f7a0719b00e777eca80532dd5d77c481ce9061051c9083906109a5565b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60008173ffffffffffffffffffffffffffffffffffffffff16631b88094d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561059a57600080fd5b505afa1580156105ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d29190610806565b92915050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff81166101d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b59061096e565b60006106b46000357fffffffff00000000000000000000000000000000000000000000000000000000166101de565b90506106cb6106c382336106ce565b61019161076b565b50565b60006106d8610428565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b81526004016107149392919061090b565b60206040518083038186803b15801561072c57600080fd5b505afa158015610740573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107649190610822565b9392505050565b81610779576107798161077d565b5050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6000602082840312156107fb578081fd5b8135610764816109b6565b600060208284031215610817578081fd5b8151610764816109b6565b600060208284031215610833578081fd5b81518015158114610764578182fd5b600060208284031215610853578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610764578182fd5b600060208284031215610893578081fd5b813563ffffffff81168114610764578182fd5b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60208082526014908201527f476175676520616c726561647920657869737473000000000000000000000000604082015260600190565b60208082526016908201527f455243313136373a20637265617465206661696c656400000000000000000000604082015260600190565b63ffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff811681146106cb57600080fdfea264697066735822122075123ef7ea84f3638f05333973067967fbba5706b93c3377131beb7307a52fab64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220628-optimism-root-gauge-factory/index.ts b/balpy/balancer-deployments/tasks/deprecated/20220628-optimism-root-gauge-factory/index.ts new file mode 100644 index 0000000..5ca344b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220628-optimism-root-gauge-factory/index.ts @@ -0,0 +1,18 @@ +import { Task, TaskRunOptions } from '@src'; +import { OptimismRootGaugeFactoryDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as OptimismRootGaugeFactoryDeployment; + + const args = [input.Vault, input.BalancerMinter, input.L1StandardBridge, input.OptimismBAL, input.GasLimit]; + + const factory = await task.deployAndVerify('OptimismRootGaugeFactory', args, from, force); + + const implementation = await factory.getGaugeImplementation(); + await task.verify('OptimismRootGauge', implementation, [ + input.BalancerMinter, + input.L1StandardBridge, + input.OptimismBAL, + ]); + await task.save({ OptimismRootGauge: implementation }); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220628-optimism-root-gauge-factory/input.ts b/balpy/balancer-deployments/tasks/deprecated/20220628-optimism-root-gauge-factory/input.ts new file mode 100644 index 0000000..477f833 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220628-optimism-root-gauge-factory/input.ts @@ -0,0 +1,29 @@ +import { Task, TaskMode } from '@src'; + +export type OptimismRootGaugeFactoryDeployment = { + Vault: string; + BalancerMinter: string; + OptimismBAL: string; + L1StandardBridge: string; + GasLimit: number; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerMinter = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); + +export default { + mainnet: { + Vault, + BalancerMinter, + // There is no strictly canonical BAL on Optimism (The bridge supports a one-to-many L1-to-L2 tokens relationship) + // so we can't read this from onchain. This token holds all of Optimism's BAL TVL currently. + // https://optimistic.etherscan.io/token/0xFE8B128bA8C78aabC59d4c64cEE7fF28e9379921 + OptimismBAL: '0xFE8B128bA8C78aabC59d4c64cEE7fF28e9379921', + // Can't find a source for this but its BAL holding match up with the total supply of BAL on Optimism. + L1StandardBridge: '0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1', + // This value is the current maximum amount of gas which doesn't trigger the spam prevention mechanism. + // https://github.com/ethereum-optimism/optimism/blob/68fc3fed54390ab42e5444c0091a6231fb5191c4/packages/contracts/contracts/L1/rollup/CanonicalTransactionChain.sol#L38 + // Value can be read at: https://etherscan.io/address/0x5e4e65926ba27467555eb562121fac00d24e9dd2#readContract + GasLimit: 1920000, + }, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220628-optimism-root-gauge-factory/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20220628-optimism-root-gauge-factory/output/mainnet.json new file mode 100644 index 0000000..714beb4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220628-optimism-root-gauge-factory/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "OptimismRootGaugeFactory": "0x3083A1C455ff38d39e58Dbac5040f465cF73C5c8", + "OptimismRootGauge": "0xcA734aD0b286EA7dD6367a504a48FB75cd12a97F" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220628-optimism-root-gauge-factory/readme.md b/balpy/balancer-deployments/tasks/deprecated/20220628-optimism-root-gauge-factory/readme.md new file mode 100644 index 0000000..bcd1af7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220628-optimism-root-gauge-factory/readme.md @@ -0,0 +1,13 @@ +# 2022-06-28 - Optimism Root Gauge Factory + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This relayer has been deprecated in favor of an [updated version](../../20220823-optimism-root-gauge-factory-v2) with weight-capped gauges. + +Deployment of the `OptimismRootGaugeFactory`, for stakeless gauges that bridge funds to their Optimism counterparts. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [`OptimismRootGauge` artifact](./artifact/OptimismRootGauge.json) +- [`OptimismRootGaugeFactory` artifact](./artifact/OptimismRootGaugeFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20220628-optimism-root-gauge-factory/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20220628-optimism-root-gauge-factory/test/task.fork.ts new file mode 100644 index 0000000..512567b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220628-optimism-root-gauge-factory/test/task.fork.ts @@ -0,0 +1,241 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { range } from 'lodash'; + +import { BigNumber, FP_ONE } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { advanceTime, currentWeekTimestamp, DAY, WEEK } from '@helpers/time'; +import * as expectEvent from '@helpers/expectEvent'; + +import { expectEqualWithError } from '@helpers/relativeError'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import { expectTransferEvent } from '@helpers/expectTransfer'; + +import { describeForkTest, getSigner, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; + +// We currently do not have a GaugeAdder which supports deploying gauges with a type of "Optimism". +// We then place the gauge deployed for this test into the "Arbitrum" type. +// In production a proper gauge type should be created for the gauges deployed by this factory. + +describeForkTest('OptimismRootGaugeFactory', 'mainnet', 14850000, function () { + let veBALHolder: SignerWithAddress, admin: SignerWithAddress, recipient: SignerWithAddress; + let factory: Contract, gauge: Contract; + let vault: Contract, + authorizer: Contract, + authorizerAdaptor: Contract, + BALTokenAdmin: Contract, + gaugeController: Contract, + gaugeAdder: Contract; + let BAL: string; + + let task: Task; + let OptimismBAL: string; + + const VEBAL_HOLDER = '0xCB3593C7c0dFe13129Ff2B6add9bA402f76c797e'; + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + + before('run task', async () => { + task = new Task('20220628-optimism-root-gauge-factory', TaskMode.TEST, getForkedNetwork(hre)); + ({ OptimismBAL } = task.input()); + await task.run({ force: true }); + factory = await task.deployedInstance('OptimismRootGaugeFactory'); + }); + + before('advance time', async () => { + // This causes all voting cooldowns to expire, letting the veBAL holder vote again + await advanceTime(DAY * 12); + }); + + before('setup accounts', async () => { + admin = await getSigner(0); + recipient = await getSigner(1); + + veBALHolder = await impersonate(VEBAL_HOLDER); + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.deployedInstance('Vault'); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + + const authorizerAdaptorTask = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizerAdaptor = await authorizerAdaptorTask.deployedInstance('AuthorizerAdaptor'); + + const gaugeAdderTask = new Task('20220325-gauge-adder', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeAdder = await gaugeAdderTask.deployedInstance('GaugeAdder'); + + const balancerTokenAdminTask = new Task('20220325-balancer-token-admin', TaskMode.READ_ONLY, getForkedNetwork(hre)); + BALTokenAdmin = await balancerTokenAdminTask.deployedInstance('BalancerTokenAdmin'); + + BAL = await BALTokenAdmin.getBalancerToken(); + + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeController = await gaugeControllerTask.deployedInstance('GaugeController'); + + // Remove the existing vote to free up some voting power. + await gaugeController.connect(veBALHolder).vote_for_gauge_weights('0xE867AD0a48e8f815DC0cda2CDb275e0F163A480b', 0); + }); + + it('create gauge', async () => { + const tx = await factory.create(recipient.address); + const event = expectEvent.inReceipt(await tx.wait(), 'OptimismRootGaugeCreated'); + + gauge = await task.instanceAt('OptimismRootGauge', event.args.gauge); + expect(event.args.recipient).to.equal(recipient.address); + + expect(await factory.isGaugeFromFactory(gauge.address)).to.be.true; + expect(await factory.getRecipientGauge(recipient.address)).to.equal(gauge.address); + expect(await factory.getGaugeRecipient(gauge.address)).to.equal(recipient.address); + }); + + it('grant permissions', async () => { + // We need to grant permission to the admin to add the Optimism factory to the GaugeAdder, and also to then add + // gauges from said factory to the GaugeController. + const govMultisig = await impersonate(GOV_MULTISIG); + + const selectors = ['addGaugeFactory', 'addArbitrumGauge'].map((method) => gaugeAdder.interface.getSighash(method)); + await Promise.all( + selectors.map( + async (selector) => + await authorizer.connect(govMultisig).grantRole(await gaugeAdder.getActionId(selector), admin.address) + ) + ); + + // We also need to grant permissions to mint in the gauges, which is done via the Authorizer Adaptor + await authorizer + .connect(govMultisig) + .grantRole(await authorizerAdaptor.getActionId(gauge.interface.getSighash('checkpoint')), admin.address); + }); + + it('add gauge to gauge controller', async () => { + await gaugeAdder.addGaugeFactory(factory.address, 4); // Arbitrum is Gauge Type 4 + await gaugeAdder.addArbitrumGauge(gauge.address); + + expect(await gaugeController.gauge_exists(gauge.address)).to.be.true; + }); + + it('vote for gauge', async () => { + expect(await gaugeController.get_gauge_weight(gauge.address)).to.equal(0); + await gaugeController.connect(veBALHolder).vote_for_gauge_weights(gauge.address, 10000); // Max voting power is 10k points + + // We now need to go through an epoch for the votes to be locked in + await advanceTime(DAY * 8); + + await gaugeController.checkpoint(); + expect(await gaugeController['gauge_relative_weight(address)'](gauge.address)).to.be.gt(0); + }); + + it('mint & bridge tokens', async () => { + // The gauge has votes for this week, and it will mint the first batch of tokens. We store the current gauge + // relative weight, as it will change as time goes by due to vote decay. + const firstMintWeekTimestamp = await currentWeekTimestamp(); + const gaugeRelativeWeight = await gaugeController['gauge_relative_weight(address)'](gauge.address); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + + // Even though the gauge has relative weight, it cannot mint yet as it needs for the epoch to finish + const zeroMintTx = await authorizerAdaptor.connect(admin).performAction(gauge.address, calldata); + expectEvent.inIndirectReceipt(await zeroMintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp.sub(WEEK), // Process past week, which had zero votes + periodEmissions: 0, + }); + // No token transfers are performed if the emissions are zero, but we can't test for a lack of those + + await advanceTime(WEEK); + + // The gauge should now mint and send all minted tokens to the Arbitrum bridge + const mintTx = await authorizerAdaptor.connect(admin).performAction(gauge.address, calldata); + const event = expectEvent.inIndirectReceipt(await mintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp, + }); + const actualEmissions = event.args.periodEmissions; + + // The amount of tokens minted should equal the weekly emissions rate times the relative weight of the gauge + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + + const expectedEmissions = gaugeRelativeWeight.mul(weeklyRate).div(FP_ONE); + expectEqualWithError(actualEmissions, expectedEmissions, 0.001); + + // Tokens are minted for the gauge + expectTransferEvent( + await mintTx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + value: actualEmissions, + }, + BAL + ); + + // And the gauge then deposits those in the predicate via the bridge mechanism + const bridgeInterface = new ethers.utils.Interface([ + 'event ERC20DepositInitiated(address indexed _l1Token, address indexed _l2Token, address indexed _from, address _to, uint256 _amount, bytes _data)', + ]); + + expectEvent.inIndirectReceipt(await mintTx.wait(), bridgeInterface, 'ERC20DepositInitiated', { + _l1Token: BAL, + _l2Token: OptimismBAL, + _from: gauge.address, + _to: recipient.address, + _amount: actualEmissions, + }); + }); + + it('mint multiple weeks', async () => { + const numberOfWeeks = 5; + await advanceTime(WEEK * numberOfWeeks); + await gaugeController.checkpoint_gauge(gauge.address); + + const weekTimestamp = await currentWeekTimestamp(); + + // We can query the relative weight of the gauge for each of the weeks that have passed + const relativeWeights: BigNumber[] = await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, weekTimestamp.sub(WEEK * weekIndex)) + ) + ); + + // The amount of tokens minted should equal the sum of the weekly emissions rate times the relative weight of the + // gauge (this assumes we're not crossing an emissions rate epoch so that the inflation remains constant). + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + const expectedEmissions = relativeWeights + .map((weight) => weight.mul(weeklyRate).div(FP_ONE)) + .reduce((sum, value) => sum.add(value)); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + const tx = await authorizerAdaptor.connect(admin).performAction(gauge.address, calldata); + + await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + expectEvent.inIndirectReceipt(await tx.wait(), gauge.interface, 'Checkpoint', { + periodTime: weekTimestamp.sub(WEEK * weekIndex), + }) + ) + ); + + // Tokens are minted for the gauge + expectTransferEvent( + await tx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + value: expectedEmissions, + }, + BAL + ); + + // And the gauge then deposits those in the predicate via the bridge mechanism + const bridgeInterface = new ethers.utils.Interface([ + 'event ERC20DepositInitiated(address indexed _l1Token, address indexed _l2Token, address indexed _from, address _to, uint256 _amount, bytes _data)', + ]); + + expectEvent.inIndirectReceipt(await tx.wait(), bridgeInterface, 'ERC20DepositInitiated', { + _l1Token: BAL, + _l2Token: OptimismBAL, + _from: gauge.address, + _to: recipient.address, + _amount: expectedEmissions, + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/artifact/BatchRelayerLibrary.json b/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/artifact/BatchRelayerLibrary.json new file mode 100644 index 0000000..6ef1aaa --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/artifact/BatchRelayerLibrary.json @@ -0,0 +1,1020 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BatchRelayerLibrary", + "sourceName": "contracts/BatchRelayerLibrary.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wstETH", + "type": "address" + }, + { + "internalType": "contract IBalancerMinter", + "name": "minter", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approveVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "assetInIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "assetOutIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IVault.BatchSwapStep[]", + "name": "swaps", + "type": "tuple[]" + }, + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + }, + { + "internalType": "int256[]", + "name": "limits", + "type": "int256[]" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "key", + "type": "uint256" + } + ], + "internalType": "struct VaultActions.OutputReference[]", + "name": "outputReferences", + "type": "tuple[]" + } + ], + "name": "batchSwap", + "outputs": [ + { + "internalType": "int256[]", + "name": "", + "type": "int256[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "enum VaultActions.PoolKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "minAmountsOut", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.ExitPoolRequest", + "name": "request", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "key", + "type": "uint256" + } + ], + "internalType": "struct VaultActions.OutputReference[]", + "name": "outputReferences", + "type": "tuple[]" + } + ], + "name": "exitPool", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStakingLiquidityGauge[]", + "name": "gauges", + "type": "address[]" + } + ], + "name": "gaugeClaimRewards", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStakingLiquidityGauge", + "name": "gauge", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "gaugeDeposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "gauges", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "gaugeMint", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "approval", + "type": "bool" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "gaugeSetMinterApproval", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStakingLiquidityGauge", + "name": "gauge", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "gaugeWithdraw", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "getEntrypoint", + "outputs": [ + { + "internalType": "contract IBalancerRelayer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "enum VaultActions.PoolKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "maxAmountsIn", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.JoinPoolRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "joinPool", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.UserBalanceOpKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IAsset", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + } + ], + "internalType": "struct IVault.UserBalanceOp[]", + "name": "ops", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "manageUserBalance", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "relayer", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "authorisation", + "type": "bytes" + } + ], + "name": "setRelayerApproval", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "stakeETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "stakeETHAndWrap", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IAsset", + "name": "assetIn", + "type": "address" + }, + { + "internalType": "contract IAsset", + "name": "assetOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IVault.SingleSwap", + "name": "singleSwap", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "limit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "swap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStaticATokenLM", + "name": "staticToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "toUnderlying", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapAaveStaticToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC4626", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapERC4626", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IUnbuttonToken", + "name": "wrapperToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapUnbuttonToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapWstETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20Permit", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "vaultPermit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20PermitDAI", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "holder", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "vaultPermitDAI", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStaticATokenLM", + "name": "staticToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "fromUnderlying", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapAaveDynamicToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC4626", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapERC4626", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapStETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IUnbuttonToken", + "name": "wrapperToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "uAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapUnbuttonToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x6101606040527fae1dc54057af8e8e5ce068cdd4383149c7efcb30e8fb95b592ee1594367fb50960e0523480156200003657600080fd5b50604051620053a8380380620053a8833981016040819052620000599162000209565b818184806001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200009657600080fd5b505afa158015620000ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d191906200025c565b6001600160601b0319606091821b81166080529082901b1660a05260405181903090620000fe90620001fb565b6200010b92919062000282565b604051809103906000f08015801562000128573d6000803e3d6000fd5b506001600160601b0319606091821b811660c05292901b90911661010052506001600160a01b0381166200015e576000620001d5565b806001600160a01b031663c1fe3e486040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200019a57600080fd5b505af1158015620001af573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d591906200025c565b6001600160601b0319606091821b81166101205291901b166101405250620002b5915050565b61074f8062004c5983390190565b6000806000606084860312156200021e578283fd5b83516200022b816200029c565b60208501519093506200023e816200029c565b604085015190925062000251816200029c565b809150509250925092565b6000602082840312156200026e578081fd5b81516200027b816200029c565b9392505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0381168114620002b257600080fd5b50565b60805160601c60a05160601c60c05160601c60e0516101005160601c6101205160601c6101405160601c61490262000357600039806104bf528061055352806105b9528061094352806109f35280610abc52806126b952806127115250806108c152806109165280610b845280610c6352806127da525080610dfa5280611ad1525080612c5a52508061197b525080611a7b5280611bc85250506149026000f3fe6080604052600436106101a15760003560e01c80637fd0e5d5116100e1578063959fc17a1161008a578063d80952d511610064578063d80952d51461038b578063db4c0e911461039e578063ecc02637146103b1578063efe69108146103c4576101a1565b8063959fc17a14610345578063abf6d39914610358578063b6d247371461036b576101a1565b80638d64cfbc116100bb5780638d64cfbc1461030a5780638d928af81461031d5780638fe4624f14610332576101a1565b80637fd0e5d5146102c257806380db15bd146102e45780638c57198b146102f7576101a1565b80633f85d3901161014e57806365ca48041161012857806365ca4804146102765780636d307ea8146102895780637ab6e03c1461029c5780637bc008f5146102af576101a1565b80633f85d3901461023d578063433b086514610250578063611b90dd14610263576101a1565b80631c9824411161017f5780631c982441146101f75780632cbec84e1461020a5780632e6272ea1461021d576101a1565b80630e248fea146101a65780631089e5e3146101bb57806318369446146101ce575b600080fd5b6101b96101b4366004613692565b6103d7565b005b6101b96101c9366004613614565b610472565b6101e16101dc366004613cec565b61065c565b6040516101ee919061435e565b60405180910390f35b6101b9610205366004613542565b610869565b6101b9610218366004613614565b610b66565b61023061022b366004613de8565b610c9a565b6040516101ee91906147c6565b6101b961024b366004613648565b610dc7565b6101b961025e366004613b8d565b610e90565b6101b9610271366004613ae3565b61113f565b6101b9610284366004613b3d565b61125a565b6101b9610297366004613ae3565b61144d565b6101b96102aa366004613b8d565b611678565b6101b96102bd366004613b3d565b61178d565b3480156102ce57600080fd5b506102d7611979565b6040516101ee9190614136565b6101b96102f2366004613587565b61199d565b6101b961030536600461382f565b611aa1565b6101b9610318366004613a4a565b611b4c565b34801561032957600080fd5b506102d7611bc6565b6101b961034036600461393a565b611bea565b6101b96103533660046139c9565b611e14565b6101b9610366366004613ae3565b611e91565b34801561037757600080fd5b506101b9610386366004613ab8565b612047565b6101b9610399366004613892565b6120d3565b6101b96103ac366004613542565b612661565b6101b96103bf366004613762565b612811565b6101b96103d2366004613ae3565b612909565b8060005b8181101561046c578383828181106103ef57fe5b9050602002016020810190610404919061350a565b6001600160a01b03166384e9bd7e336040518263ffffffff1660e01b815260040161042f9190614136565b600060405180830381600087803b15801561044957600080fd5b505af115801561045d573d6000803e3d6000fd5b505050508060010190506103db565b50505050565b61047b826129b2565b1561048c57610489826129fd565b91505b6040517fb0e389000000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b0e38900906104f49086906004016147c6565b60206040518083038186803b15801561050c57600080fd5b505afa158015610520573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105449190613ed6565b90506105796001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001684612a17565b6001600160a01b0384163014610644576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906105f09087908590600401614296565b602060405180830381600087803b15801561060a57600080fd5b505af115801561061e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106429190613813565b505b61064d826129b2565b1561046c5761046c8282612a91565b60603361066c60208a018a61350a565b6001600160a01b0316148061069557503061068a60208a018a61350a565b6001600160a01b0316145b6106ba5760405162461bcd60e51b81526004016106b190614696565b60405180910390fd5b60005b8b5181101561071f5760008c82815181106106d457fe5b60200260200101516060015190506106eb816129b2565b15610716576106f9816129fd565b8d838151811061070557fe5b602002602001015160600181815250505b506001016106bd565b50606061072a611bc6565b6001600160a01b031663945bcec9868f8f8f8f8f8f8f8f6040518a63ffffffff1660e01b815260040161076498979695949392919061458d565b6000604051808303818588803b15801561077d57600080fd5b505af1158015610791573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526107ba91908101906136d2565b905060005b83811015610858576107e58585838181106107d657fe5b905060400201602001356129b2565b6108015760405162461bcd60e51b81526004016106b190614704565b61085085858381811061081057fe5b9050604002016020013561084b8488888681811061082a57fe5b905060400201600001358151811061083e57fe5b6020026020010151612aa4565b612a91565b6001016107bf565b509c9b505050505050505050505050565b610872826129b2565b1561088357610880826129fd565b91505b6001600160a01b03841630146108e6576001600160a01b03841633146108bb5760405162461bcd60e51b81526004016106b190614696565b6108e6847f000000000000000000000000000000000000000000000000000000000000000084612abe565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b39061096d907f0000000000000000000000000000000000000000000000000000000000000000908690600401614296565b602060405180830381600087803b15801561098757600080fd5b505af115801561099b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109bf9190613813565b506040517fea598cb00000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ea598cb090610a289086906004016147c6565b602060405180830381600087803b158015610a4257600080fd5b505af1158015610a56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7a9190613ed6565b90506001600160a01b0384163014610b47576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90610af39087908590600401614296565b602060405180830381600087803b158015610b0d57600080fd5b505af1158015610b21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b459190613813565b505b610b50826129b2565b15610b5f57610b5f8282612a91565b5050505050565b610b6f826129b2565b15610b8057610b7d826129fd565b91505b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a1903eab84306040518363ffffffff1660e01b8152600401610bcf9190614136565b6020604051808303818588803b158015610be857600080fd5b505af1158015610bfc573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610c219190613ed6565b90506001600160a01b0384163014610644576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906105f09087908590600401614296565b600033610caa602088018861350a565b6001600160a01b03161480610cd3575030610cc8602088018861350a565b6001600160a01b0316145b610cef5760405162461bcd60e51b81526004016106b190614696565b610cfc87608001516129b2565b15610d1457610d0e87608001516129fd565b60808801525b6000610d1e611bc6565b6001600160a01b03166352bbbe29858a8a8a8a6040518663ffffffff1660e01b8152600401610d50949392919061473b565b6020604051808303818588803b158015610d6957600080fd5b505af1158015610d7d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610da29190613ed6565b9050610dad836129b2565b15610dbc57610dbc8382612a91565b979650505050505050565b6040517f3b9f73840000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633b9f738490610e33908790879033906004016142fe565b602060405180830381600087803b158015610e4d57600080fd5b505af1158015610e61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e859190613ed6565b905061064d826129b2565b610e99836129b2565b15610eaa57610ea7836129fd565b92505b600082610f2957866001600160a01b03166351c0e0616040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610eec57600080fd5b505af1158015610f00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f249190613526565b610f9c565b866001600160a01b0316634800d97f6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f6457600080fd5b505af1158015610f78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9c9190613526565b90506001600160a01b0386163014610fe1576001600160a01b0386163314610fd65760405162461bcd60e51b81526004016106b190614696565b610fe1868286612abe565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b390611028908a908890600401614296565b602060405180830381600087803b15801561104257600080fd5b505af1158015611056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107a9190613813565b506040517f2f2cab870000000000000000000000000000000000000000000000000000000081526000906001600160a01b03891690632f2cab87906110c9908990899086908a906004016142d2565b602060405180830381600087803b1580156110e357600080fd5b505af11580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b9190613ed6565b9050611126836129b2565b15611135576111358382612a91565b5050505050505050565b611148826129b2565b1561115957611156826129fd565b91505b6001600160a01b038416301461119c576001600160a01b03841633146111915760405162461bcd60e51b81526004016106b190614696565b61119c848684612abe565b6040517fea785a5e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b0387169063ea785a5e906111e69087908790600401614296565b602060405180830381600087803b15801561120057600080fd5b505af1158015611214573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112389190613ed6565b9050611243826129b2565b15611252576112528282612a91565b505050505050565b611263816129b2565b1561127457611271816129fd565b90505b6001600160a01b03831630146112b7576001600160a01b03831633146112ac5760405162461bcd60e51b81526004016106b190614696565b6112b7838583612abe565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526001600160a01b03851690632e1a7d4d906112fc9084906004016147c6565b600060405180830381600087803b15801561131657600080fd5b505af115801561132a573d6000803e3d6000fd5b505050506001600160a01b038216301461046c576000846001600160a01b03166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b15801561137957600080fd5b505afa15801561138d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b19190613526565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081529091506001600160a01b0382169063a9059cbb906113fb9086908690600401614296565b602060405180830381600087803b15801561141557600080fd5b505af1158015611429573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112529190613813565b611456826129b2565b1561146757611464826129fd565b91505b6000856001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114a257600080fd5b505afa1580156114b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114da9190613526565b90506001600160a01b038516301461151f576001600160a01b03851633146115145760405162461bcd60e51b81526004016106b190614696565b61151f858285612abe565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b3906115669089908790600401614296565b602060405180830381600087803b15801561158057600080fd5b505af1158015611594573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b89190613813565b506040517f6e553f650000000000000000000000000000000000000000000000000000000081526000906001600160a01b03881690636e553f659061160390879089906004016147cf565b602060405180830381600087803b15801561161d57600080fd5b505af1158015611631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116559190613ed6565b9050611660836129b2565b1561166f5761166f8382612a91565b50505050505050565b611681836129b2565b156116925761168f836129fd565b92505b6001600160a01b03851630146116d5576001600160a01b03851633146116ca5760405162461bcd60e51b81526004016106b190614696565b6116d5858785612abe565b6040517fead5d3590000000000000000000000000000000000000000000000000000000081526000906001600160a01b0388169063ead5d35990611721908890889088906004016142af565b6040805180830381600087803b15801561173a57600080fd5b505af115801561174e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117729190613eee565b91505061177e826129b2565b1561166f5761166f8282612a91565b611796816129b2565b156117a7576117a4816129fd565b90505b6000846001600160a01b03166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b1580156117e257600080fd5b505afa1580156117f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181a9190613526565b90506001600160a01b038416301461185f576001600160a01b03841633146118545760405162461bcd60e51b81526004016106b190614696565b61185f848284612abe565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b3906118a69088908690600401614296565b602060405180830381600087803b1580156118c057600080fd5b505af11580156118d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f89190613813565b506040517f6e553f650000000000000000000000000000000000000000000000000000000081526001600160a01b03861690636e553f659061194090859087906004016147cf565b600060405180830381600087803b15801561195a57600080fd5b505af115801561196e573d6000803e3d6000fd5b505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b0384163014806119b2575082155b6119ce5760405162461bcd60e51b81526004016106b1906146cd565b606063fa6e671d60e01b3386866040516024016119ed9392919061414a565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009095169490941790935251611a5c928691869101614103565b60408051601f1981840301815291905290506112526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001682612b5a565b6040517fc65427940000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c654279490611b129030908a908a908a908a908a908a90600401614252565b600060405180830381600087803b158015611b2c57600080fd5b505af1158015611b40573d6000803e3d6000fd5b50505050505050505050565b866001600160a01b031663d505accf87611b64611bc6565b88888888886040518863ffffffff1660e01b8152600401611b8b9796959493929190614211565b600060405180830381600087803b158015611ba557600080fd5b505af1158015611bb9573d6000803e3d6000fd5b5050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b038516331480611c0957506001600160a01b03851630145b611c255760405162461bcd60e51b81526004016106b190614696565b6000611c3088612bd2565b90506000611c3d836129b2565b611c48576000611cdd565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038316906370a0823190611c8d908990600401614136565b60206040518083038186803b158015611ca557600080fd5b505afa158015611cb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cdd9190613ed6565b9050611ced888660400151612bd8565b6040860152611cfa611bc6565b6001600160a01b031663b95cac28858b8a8a8a6040518663ffffffff1660e01b8152600401611d2c94939291906144e6565b6000604051808303818588803b158015611d4557600080fd5b505af1158015611d59573d6000803e3d6000fd5b5050505050611d67836129b2565b1561196e576040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038416906370a0823190611db4908a90600401614136565b60206040518083038186803b158015611dcc57600080fd5b505afa158015611de0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e049190613ed6565b9050611b408461084b8385612c06565b876001600160a01b0316638fcbaf0c88611e2c611bc6565b8989898989896040518963ffffffff1660e01b8152600401611e559897969594939291906141c8565b600060405180830381600087803b158015611e6f57600080fd5b505af1158015611e83573d6000803e3d6000fd5b505050505050505050505050565b611e9a826129b2565b15611eab57611ea8826129fd565b91505b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015611ee657600080fd5b505afa158015611efa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1e9190613526565b90506001600160a01b0385163014611f63576001600160a01b0385163314611f585760405162461bcd60e51b81526004016106b190614696565b611f63858285612abe565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b390611faa9089908790600401614296565b602060405180830381600087803b158015611fc457600080fd5b505af1158015611fd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffc9190613813565b506040517f2f4f21e20000000000000000000000000000000000000000000000000000000081526000906001600160a01b03881690632f4f21e2906116039088908890600401614296565b816001600160a01b031663095ea7b361205e611bc6565b836040518363ffffffff1660e01b815260040161207c929190614296565b602060405180830381600087803b15801561209657600080fd5b505af11580156120aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ce9190613813565b505050565b6001600160a01b0385163314806120f257506001600160a01b03851630145b61210e5760405162461bcd60e51b81526004016106b190614696565b60608167ffffffffffffffff8111801561212757600080fd5b50604051908082528060200260200182016040528015612151578160200160208202803683370190505b50905060608267ffffffffffffffff8111801561216d57600080fd5b50604051908082528060200260200182016040528015612197578160200160208202803683370190505b50905060005b83811015612307576121b48585838181106107d657fe5b6121d05760405162461bcd60e51b81526004016106b190614704565b85516000908686848181106121e157fe5b90506040020160000135815181106121f557fe5b602002602001015190508660600151156122435761221281612c1c565b84838151811061221e57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506122fe565b61224c81612c1f565b6122d95761225981612c1c565b6001600160a01b03166370a08231896040518263ffffffff1660e01b81526004016122849190614136565b60206040518083038186803b15801561229c57600080fd5b505afa1580156122b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d49190613ed6565b6122e5565b876001600160a01b0316315b8383815181106122f157fe5b6020026020010181815250505b5060010161219d565b5084606001511561239e5761231a611bc6565b6001600160a01b0316630f5a6efa87846040518363ffffffff1660e01b815260040161234792919061416e565b60006040518083038186803b15801561235f57600080fd5b505afa158015612373573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261239b91908101906137d8565b90505b6123ac888660400151612c2c565b60408601526123b9611bc6565b6001600160a01b0316638bdb39138a8989896040518563ffffffff1660e01b81526004016123ea94939291906144e6565b600060405180830381600087803b15801561240457600080fd5b505af1158015612418573d6000803e3d6000fd5b50606092508591505067ffffffffffffffff8111801561243757600080fd5b50604051908082528060200260200182016040528015612461578160200160208202803683370190505b5090508560600151156124fe57612476611bc6565b6001600160a01b0316630f5a6efa88856040518363ffffffff1660e01b81526004016124a392919061416e565b60006040518083038186803b1580156124bb57600080fd5b505afa1580156124cf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124f791908101906137d8565b90506125fc565b60005b848110156125fa57865160009087878481811061251a57fe5b905060400201600001358151811061252e57fe5b6020026020010151905061254181612c1f565b6125ce5761254e81612c1c565b6001600160a01b03166370a082318a6040518263ffffffff1660e01b81526004016125799190614136565b60206040518083038186803b15801561259157600080fd5b505afa1580156125a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c99190613ed6565b6125da565b886001600160a01b0316315b8383815181106125e657fe5b602090810291909101015250600101612501565b505b60005b84811015611bb95761265986868381811061261657fe5b9050604002016020013561084b85848151811061262f57fe5b602002602001015185858151811061264357fe5b6020026020010151612c0690919063ffffffff16565b6001016125ff565b61266a826129b2565b1561267b57612678826129fd565b91505b6001600160a01b03841630146126de576001600160a01b03841633146126b35760405162461bcd60e51b81526004016106b190614696565b6126de847f000000000000000000000000000000000000000000000000000000000000000084612abe565b6040517fde0e9a3e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063de0e9a3e906127469086906004016147c6565b602060405180830381600087803b15801561276057600080fd5b505af1158015612774573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127989190613ed6565b90506001600160a01b0384163014610b47576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90610af39087908590600401614296565b60005b828110156128a5573384848381811061282957fe5b905060a002016060016020810190612841919061350a565b6001600160a01b0316148061288157503084848381811061285e57fe5b905060a002016060016020810190612876919061350a565b6001600160a01b0316145b61289d5760405162461bcd60e51b81526004016106b190614696565b600101612814565b506128ae611bc6565b6001600160a01b0316630e8e3e848285856040518463ffffffff1660e01b81526004016128dc9291906143a2565b6000604051808303818588803b1580156128f557600080fd5b505af1158015611135573d6000803e3d6000fd5b612912826129b2565b1561292357612920826129fd565b91505b6001600160a01b0384163014612966576001600160a01b038416331461295b5760405162461bcd60e51b81526004016106b190614696565b612966848684612abe565b6040517fba0876520000000000000000000000000000000000000000000000000000000081526000906001600160a01b0387169063ba087652906111e6908690889030906004016147e6565b7fba100000000000000000000000000000000000000000000000000000000000007fffff0000000000000000000000000000000000000000000000000000000000008216145b919050565b600080612a0983612c53565b805460009091559392505050565b612a26814710156101a3612ca9565b6000826001600160a01b031682604051612a3f90612c1c565b60006040518083038185875af1925050503d8060008114612a7c576040519150601f19603f3d011682016040523d82523d6000602084013e612a81565b606091505b505090506120ce816101a4612ca9565b6000612a9c83612c53565b919091555050565b6000808213612ab65781600003612ab8565b815b92915050565b80612ac8576120ce565b604080516001808252818301909252606091602080830190803683370190505090508281600081518110612af857fe5b6001600160a01b0392909216602092830291909101909101526040805160018082528183019092526060918160200160208202803683370190505090508281600081518110612b4357fe5b602002602001018181525050610b5f858383612cbb565b606060006060846001600160a01b031684604051612b7891906140e7565b6000604051808303816000865af19150503d8060008114612bb5576040519150601f19603f3d011682016040523d82523d6000602084013e612bba565b606091505b5091509150612bc98282612df5565b95945050505050565b60601c90565b60606000838015612be557fe5b1415612bfb57612bf482612e1f565b9050612ab8565b612ab8610136612e5c565b6000612c16838311156001612ca9565b50900390565b90565b6001600160a01b03161590565b60606000838015612c3957fe5b1415612c4857612bf482612eaf565b612ab8610150612e5c565b60006001827f0000000000000000000000000000000000000000000000000000000000000000604051602001612c8a929190614128565b60408051808303601f1901815291905280516020909101200392915050565b81612cb757612cb781612e5c565b5050565b6060825167ffffffffffffffff81118015612cd557600080fd5b50604051908082528060200260200182016040528015612d0f57816020015b612cfc6130df565b815260200190600190039081612cf45790505b50905060005b8351811015612da7576040805160a081019091528060038152602001858381518110612d3d57fe5b60200260200101516001600160a01b03168152602001848381518110612d5f57fe5b60200260200101518152602001866001600160a01b03168152602001306001600160a01b0316815250828281518110612d9457fe5b6020908102919091010152600101612d15565b50612db0611bc6565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b8152600401612ddb9190614450565b600060405180830381600087803b1580156128f557600080fd5b60608215612e04575080612ab8565b815115612e145781518083602001fd5b612ab86101ae612e5c565b60606000612e2c83612ef8565b90506001816004811115612e3c57fe5b1415612e5357612e4b83612f0e565b9150506129f8565b829150506129f8565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b60606000612ebc83612fbc565b90506000816003811115612ecc57fe5b1415612edb57612e4b83612fd2565b6001816003811115612ee957fe5b1415612e5357612e4b83613035565b600081806020019051810190612ab89190613c7b565b6060806000612f1c84613088565b915091506000805b8351811015612f82576000848281518110612f3b57fe5b60200260200101519050612f4e816129b2565b15612f7957612f5c816129fd565b858381518110612f6857fe5b602002602001018181525050600192505b50600101612f24565b5080612f8e5784612bc9565b60018383604051602001612fa49392919061455a565b60405160208183030381529060405295945050505050565b600081806020019051810190612ab89190613bfc565b6060600080612fe0846130ab565b91509150612fed826129b2565b1561302b57612ffb826129fd565b91506000828260405160200161301393929190614539565b604051602081830303815290604052925050506129f8565b83925050506129f8565b60606000613042836130c2565b905061304d816129b2565b15612e535761305b816129fd565b9050600181604051602001613071929190614522565b6040516020818303038152906040529150506129f8565b60606000828060200190518101906130a09190613c96565b909590945092505050565b600080828060200190518101906130a09190613c45565b6000818060200190518101906130d89190613c18565b9392505050565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b8035612ab88161489c565b60008083601f84011261312b578182fd5b50813567ffffffffffffffff811115613142578182fd5b602083019150836020808302850101111561315c57600080fd5b9250929050565b600082601f830112613173578081fd5b81356131866131818261482c565b614805565b8181529150602080830190848101818402860182018710156131a757600080fd5b60005b848110156131cf5781356131bd8161489c565b845292820192908201906001016131aa565b505050505092915050565b600082601f8301126131ea578081fd5b81356131f86131818261482c565b818152915060208083019084810160005b848110156131cf578135870160a080601f19838c0301121561322a57600080fd5b61323381614805565b85830135815260408084013587830152606080850135828401526080915081850135818401525082840135925067ffffffffffffffff83111561327557600080fd5b6132838c88858701016133a5565b90820152865250509282019290820190600101613209565b60008083601f8401126132ac578182fd5b50813567ffffffffffffffff8111156132c3578182fd5b60208301915083602060408302850101111561315c57600080fd5b600082601f8301126132ee578081fd5b81356132fc6131818261482c565b81815291506020808301908481018184028601820187101561331d57600080fd5b60005b848110156131cf57813584529282019290820190600101613320565b600082601f83011261334c578081fd5b815161335a6131818261482c565b81815291506020808301908481018184028601820187101561337b57600080fd5b60005b848110156131cf5781518452928201929082019060010161337e565b8035612ab8816148b1565b600082601f8301126133b5578081fd5b813567ffffffffffffffff8111156133cb578182fd5b6133de6020601f19601f84011601614805565b91508082528360208285010111156133f557600080fd5b8060208401602084013760009082016020015292915050565b805160058110612ab857600080fd5b803560018110612ab857600080fd5b803560028110612ab857600080fd5b60006080828403121561344c578081fd5b6134566080614805565b9050813567ffffffffffffffff8082111561347057600080fd5b61347c85838601613163565b8352602084013591508082111561349257600080fd5b61349e858386016132de565b602084015260408401359150808211156134b757600080fd5b506134c4848285016133a5565b6040830152506134d7836060840161339a565b606082015292915050565b6000608082840312156134f3578081fd5b50919050565b803560ff81168114612ab857600080fd5b60006020828403121561351b578081fd5b81356130d88161489c565b600060208284031215613537578081fd5b81516130d88161489c565b60008060008060808587031215613557578283fd5b84356135628161489c565b935060208501356135728161489c565b93969395505050506040820135916060013590565b6000806000806060858703121561359c578182fd5b84356135a78161489c565b935060208501356135b7816148b1565b9250604085013567ffffffffffffffff808211156135d3578384fd5b818701915087601f8301126135e6578384fd5b8135818111156135f4578485fd5b886020828501011115613605578485fd5b95989497505060200194505050565b600080600060608486031215613628578081fd5b83356136338161489c565b95602085013595506040909401359392505050565b60008060006040848603121561365c578081fd5b833567ffffffffffffffff811115613672578182fd5b61367e8682870161311a565b909790965060209590950135949350505050565b600080602083850312156136a4578182fd5b823567ffffffffffffffff8111156136ba578283fd5b6136c68582860161311a565b90969095509350505050565b600060208083850312156136e4578182fd5b825167ffffffffffffffff8111156136fa578283fd5b8301601f8101851361370a578283fd5b80516137186131818261482c565b8181528381019083850185840285018601891015613734578687fd5b8694505b83851015613756578051835260019490940193918501918501613738565b50979650505050505050565b600080600060408486031215613776578081fd5b833567ffffffffffffffff8082111561378d578283fd5b818601915086601f8301126137a0578283fd5b8135818111156137ae578384fd5b87602060a0830285010111156137c2578384fd5b6020928301989097509590910135949350505050565b6000602082840312156137e9578081fd5b815167ffffffffffffffff8111156137ff578182fd5b61380b8482850161333c565b949350505050565b600060208284031215613824578081fd5b81516130d8816148b1565b60008060008060008060c08789031215613847578384fd5b8635613852816148b1565b955060208701356138628161489c565b94506040870135935061387888606089016134f9565b92506080870135915060a087013590509295509295509295565b600080600080600080600060c0888a0312156138ac578485fd5b873596506138bd8960208a0161341d565b955060408801356138cd8161489c565b945060608801356138dd8161489c565b9350608088013567ffffffffffffffff808211156138f9578283fd5b6139058b838c0161343b565b945060a08a013591508082111561391a578283fd5b506139278a828b0161329b565b989b979a50959850939692959293505050565b600080600080600080600060e0888a031215613954578081fd5b873596506139658960208a0161341d565b955060408801356139758161489c565b945060608801356139858161489c565b9350608088013567ffffffffffffffff8111156139a0578182fd5b6139ac8a828b0161343b565b93505060a0880135915060c0880135905092959891949750929550565b600080600080600080600080610100898b0312156139e5578182fd5b88356139f08161489c565b97506020890135613a008161489c565b965060408901359550606089013594506080890135613a1e816148b1565b9350613a2d8a60a08b016134f9565b925060c0890135915060e089013590509295985092959890939650565b600080600080600080600060e0888a031215613a64578081fd5b8735613a6f8161489c565b96506020880135613a7f8161489c565b95506040880135945060608801359350613a9c8960808a016134f9565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215613aca578182fd5b8235613ad58161489c565b946020939093013593505050565b600080600080600060a08688031215613afa578283fd5b8535613b058161489c565b94506020860135613b158161489c565b93506040860135613b258161489c565b94979396509394606081013594506080013592915050565b60008060008060808587031215613b52578182fd5b8435613b5d8161489c565b93506020850135613b6d8161489c565b92506040850135613b7d8161489c565b9396929550929360600135925050565b60008060008060008060c08789031215613ba5578384fd5b8635613bb08161489c565b95506020870135613bc08161489c565b94506040870135613bd08161489c565b9350606087013592506080870135613be7816148b1565b8092505060a087013590509295509295509295565b600060208284031215613c0d578081fd5b81516130d8816148bf565b60008060408385031215613c2a578182fd5b8251613c35816148bf565b6020939093015192949293505050565b600080600060608486031215613c59578081fd5b8351613c64816148bf565b602085015160409095015190969495509392505050565b600060208284031215613c8c578081fd5b6130d8838361340e565b600080600060608486031215613caa578081fd5b613cb4858561340e565b9250602084015167ffffffffffffffff811115613ccf578182fd5b613cdb8682870161333c565b925050604084015190509250925092565b60008060008060008060008060008060006101608c8e031215613d0d578485fd5b613d178d8d61342c565b9a5067ffffffffffffffff8060208e01351115613d32578586fd5b613d428e60208f01358f016131da565b9a508060408e01351115613d54578586fd5b613d648e60408f01358f0161311a565b909a509850613d768e60608f016134e2565b97508060e08e01351115613d88578586fd5b613d988e60e08f01358f0161311a565b90975095506101008d013594506101208d013593506101408d0135811015613dbe578283fd5b50613dd08d6101408e01358e0161329b565b81935080925050509295989b509295989b9093969950565b6000806000806000806101208789031215613e01578384fd5b863567ffffffffffffffff80821115613e18578586fd5b9088019060c0828b031215613e2b578586fd5b613e3560c0614805565b82358152613e468b6020850161342c565b60208201526040830135613e598161489c565b6040820152613e6b8b6060850161310f565b60608201526080830135608082015260a083013582811115613e8b578788fd5b613e978c8286016133a5565b60a083015250809850505050613eb088602089016134e2565b959895975050505060a08401359360c08101359360e08201359350610100909101359150565b600060208284031215613ee7578081fd5b5051919050565b60008060408385031215613f00578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b60008284526020808501945082825b85811015613f5b578135613f408161489c565b6001600160a01b031687529582019590820190600101613f2d565b509495945050505050565b60008284526020808501945082825b85811015613f5b57813587529582019590820190600101613f75565b6000815180845260208085019450808401835b83811015613f5b57815187529582019590820190600101613fa4565b15159052565b60008151808452613fde816020860160208601614859565b601f01601f19169290920160200192915050565b8051608080845281519084018190526000916020919082019060a0860190845b818110156140375783516001600160a01b031683529284019291840191600101614012565b5050828501519150858103838701526140508183613f91565b925050506040830151848203604086015261406b8282613fc6565b91505060608301516140806060860182613fc0565b509392505050565b80356140938161489c565b6001600160a01b0390811683526020820135906140af826148b1565b90151560208401526040820135906140c68261489c565b16604083015260608101356140da816148b1565b8015156060840152505050565b600082516140f9818460208701614859565b9190910192915050565b60008451614115818460208901614859565b8201838582379092019182525092915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000604082016001600160a01b03808616845260206040818601528286518085526060870191508288019450855b818110156141ba57855185168352948301949183019160010161419c565b509098975050505050505050565b6001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b0397881681529515156020870152939095166040850152606084019190915260ff16608083015260a082019290925260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b6001600160a01b03949094168452602084019290925261ffff1660408301521515606082015260800190565b6040808252810183905260008460608301825b8681101561434157602083356143268161489c565b6001600160a01b031683529283019290910190600101614311565b5080925050506001600160a01b0383166020830152949350505050565b6020808252825182820181905260009190848201906040850190845b818110156143965783518352928401929184019160010161437a565b50909695505050505050565b6020808252818101839052600090604080840186845b878110156144435781356143cb816148bf565b6143d481614885565b8352818501356143e38161489c565b6001600160a01b031683860152818401358484015260606144068184018461484c565b61441282860182613f11565b505060806144228184018461484c565b61442e82860182613f11565b505060a09283019291909101906001016143b8565b5090979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156144d9578151805161448281614885565b8552808701516001600160a01b03168786015285810151868601526060808201516144af82880182613f11565b5050608090810151906144c486820183613f11565b505060a093909301929085019060010161446d565b5091979650505050505050565b60008582526001600160a01b038086166020840152808516604084015250608060608301526145186080830184613ff2565b9695505050505050565b6040810161452f84614885565b9281526020015290565b6060810161454685614885565b938152602081019290925260409091015290565b60006005851061456657fe5b8482526060602083015261457d6060830185613f91565b9050826040830152949350505050565b600061012080830161459e8c614892565b8b84526020808501929092528a5190819052610140808501928281028601909101918c8201855b82811015614645578785037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec00186528151805186528481015185870152604080820151908701526060808201519087015260809081015160a09187018290529061463181880183613fc6565b9786019796505050908301906001016145c5565b50505050838103604085015261465c818a8c613f1e565b91505061466c6060840188614088565b82810360e084015261467f818688613f66565b915050826101008301529998505050505050505050565b60208082526010908201527f496e636f72726563742073656e64657200000000000000000000000000000000604082015260600190565b6020808252601f908201527f52656c617965722063616e206f6e6c7920617070726f766520697473656c6600604082015260600190565b60208082526019908201527f696e76616c696420636861696e6564207265666572656e636500000000000000604082015260600190565b600060e08252855160e0830152602086015161475681614892565b61010083015260408601516001600160a01b03908116610120840152606087015116610140830152608086015161016083015260a086015160c06101808401526147a46101a0840182613fc6565b9150506147b46020830186614088565b60a082019390935260c0015292915050565b90815260200190565b9182526001600160a01b0316602082015260400190565b9283526001600160a01b03918216602084015216604082015260600190565b60405181810167ffffffffffffffff8111828210171561482457600080fd5b604052919050565b600067ffffffffffffffff821115614842578081fd5b5060209081020190565b600082356130d88161489c565b60005b8381101561487457818101518382015260200161485c565b8381111561046c5750506000910152565b6004811061488f57fe5b50565b6002811061488f57fe5b6001600160a01b038116811461488f57600080fd5b801515811461488f57600080fd5b6004811061488f57600080fdfea26469706673582212200d8843c75c8ce5dd1add9350da94dc5e9c6541e978b53349f0ceb5c2c212c27f64736f6c6343000701003360c060405234801561001057600080fd5b5060405161074f38038061074f83398101604081905261002f91610052565b60016000556001600160601b0319606092831b8116608052911b1660a0526100a3565b60008060408385031215610064578182fd5b825161006f8161008b565b60208401519092506100808161008b565b809150509250929050565b6001600160a01b03811681146100a057600080fd5b50565b60805160601c60a05160601c61067b6100d46000398060fc528061020f52508060585280610120525061067b6000f3fe6080604052600436106100385760003560e01c80637678922e146100885780638d928af8146100b3578063ac9650d8146100c857610083565b36610083576100813373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146102066100e8565b005b600080fd5b34801561009457600080fd5b5061009d6100fa565b6040516100aa91906104d6565b60405180910390f35b3480156100bf57600080fd5b5061009d61011e565b6100db6100d6366004610448565b610142565b6040516100aa91906104f7565b816100f6576100f68161026e565b5050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b606061014c6102db565b8167ffffffffffffffff8111801561016357600080fd5b5060405190808252806020026020018201604052801561019757816020015b60608152602001906001900390816101825790505b50905060005b82811015610257576102388484838181106101b457fe5b90506020028101906101c691906105ab565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929150506102f4565b82828151811061024457fe5b602090810291909101015260010161019d565b50610260610377565b61026861038b565b92915050565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b6102ed600260005414156101906100e8565b6002600055565b6060600060608473ffffffffffffffffffffffffffffffffffffffff168460405161031f91906104b7565b600060405180830381855af49150503d806000811461035a576040519150601f19603f3d011682016040523d82523d6000602084013e61035f565b606091505b509150915061036e8282610392565b95945050505050565b4780156103885761038833826103bc565b50565b6001600055565b606082156103a1575080610268565b8151156103b15781518083602001fd5b6102686101ae61026e565b6103cb814710156101a36100e8565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516103f1906104d3565b60006040518083038185875af1925050503d806000811461042e576040519150601f19603f3d011682016040523d82523d6000602084013e610433565b606091505b50509050610443816101a46100e8565b505050565b6000806020838503121561045a578182fd5b823567ffffffffffffffff80821115610471578384fd5b818501915085601f830112610484578384fd5b813581811115610492578485fd5b86602080830285010111156104a5578485fd5b60209290920196919550909350505050565b600082516104c9818460208701610615565b9190910192915050565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561059e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845281518051808752610561818989018a8501610615565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169590950186019450928501929085019060010161051c565b5092979650505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126105df578283fd5b83018035915067ffffffffffffffff8211156105f9578283fd5b60200191503681900382131561060e57600080fd5b9250929050565b60005b83811015610630578181015183820152602001610618565b8381111561063f576000848401525b5050505056fea264697066735822122054b608fcf43934ad986df87a466c652bcea4e6541a5d0812fdee07ac5684170f64736f6c63430007010033", + "deployedBytecode": "0x6080604052600436106101a15760003560e01c80637fd0e5d5116100e1578063959fc17a1161008a578063d80952d511610064578063d80952d51461038b578063db4c0e911461039e578063ecc02637146103b1578063efe69108146103c4576101a1565b8063959fc17a14610345578063abf6d39914610358578063b6d247371461036b576101a1565b80638d64cfbc116100bb5780638d64cfbc1461030a5780638d928af81461031d5780638fe4624f14610332576101a1565b80637fd0e5d5146102c257806380db15bd146102e45780638c57198b146102f7576101a1565b80633f85d3901161014e57806365ca48041161012857806365ca4804146102765780636d307ea8146102895780637ab6e03c1461029c5780637bc008f5146102af576101a1565b80633f85d3901461023d578063433b086514610250578063611b90dd14610263576101a1565b80631c9824411161017f5780631c982441146101f75780632cbec84e1461020a5780632e6272ea1461021d576101a1565b80630e248fea146101a65780631089e5e3146101bb57806318369446146101ce575b600080fd5b6101b96101b4366004613692565b6103d7565b005b6101b96101c9366004613614565b610472565b6101e16101dc366004613cec565b61065c565b6040516101ee919061435e565b60405180910390f35b6101b9610205366004613542565b610869565b6101b9610218366004613614565b610b66565b61023061022b366004613de8565b610c9a565b6040516101ee91906147c6565b6101b961024b366004613648565b610dc7565b6101b961025e366004613b8d565b610e90565b6101b9610271366004613ae3565b61113f565b6101b9610284366004613b3d565b61125a565b6101b9610297366004613ae3565b61144d565b6101b96102aa366004613b8d565b611678565b6101b96102bd366004613b3d565b61178d565b3480156102ce57600080fd5b506102d7611979565b6040516101ee9190614136565b6101b96102f2366004613587565b61199d565b6101b961030536600461382f565b611aa1565b6101b9610318366004613a4a565b611b4c565b34801561032957600080fd5b506102d7611bc6565b6101b961034036600461393a565b611bea565b6101b96103533660046139c9565b611e14565b6101b9610366366004613ae3565b611e91565b34801561037757600080fd5b506101b9610386366004613ab8565b612047565b6101b9610399366004613892565b6120d3565b6101b96103ac366004613542565b612661565b6101b96103bf366004613762565b612811565b6101b96103d2366004613ae3565b612909565b8060005b8181101561046c578383828181106103ef57fe5b9050602002016020810190610404919061350a565b6001600160a01b03166384e9bd7e336040518263ffffffff1660e01b815260040161042f9190614136565b600060405180830381600087803b15801561044957600080fd5b505af115801561045d573d6000803e3d6000fd5b505050508060010190506103db565b50505050565b61047b826129b2565b1561048c57610489826129fd565b91505b6040517fb0e389000000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b0e38900906104f49086906004016147c6565b60206040518083038186803b15801561050c57600080fd5b505afa158015610520573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105449190613ed6565b90506105796001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001684612a17565b6001600160a01b0384163014610644576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906105f09087908590600401614296565b602060405180830381600087803b15801561060a57600080fd5b505af115801561061e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106429190613813565b505b61064d826129b2565b1561046c5761046c8282612a91565b60603361066c60208a018a61350a565b6001600160a01b0316148061069557503061068a60208a018a61350a565b6001600160a01b0316145b6106ba5760405162461bcd60e51b81526004016106b190614696565b60405180910390fd5b60005b8b5181101561071f5760008c82815181106106d457fe5b60200260200101516060015190506106eb816129b2565b15610716576106f9816129fd565b8d838151811061070557fe5b602002602001015160600181815250505b506001016106bd565b50606061072a611bc6565b6001600160a01b031663945bcec9868f8f8f8f8f8f8f8f6040518a63ffffffff1660e01b815260040161076498979695949392919061458d565b6000604051808303818588803b15801561077d57600080fd5b505af1158015610791573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526107ba91908101906136d2565b905060005b83811015610858576107e58585838181106107d657fe5b905060400201602001356129b2565b6108015760405162461bcd60e51b81526004016106b190614704565b61085085858381811061081057fe5b9050604002016020013561084b8488888681811061082a57fe5b905060400201600001358151811061083e57fe5b6020026020010151612aa4565b612a91565b6001016107bf565b509c9b505050505050505050505050565b610872826129b2565b1561088357610880826129fd565b91505b6001600160a01b03841630146108e6576001600160a01b03841633146108bb5760405162461bcd60e51b81526004016106b190614696565b6108e6847f000000000000000000000000000000000000000000000000000000000000000084612abe565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b39061096d907f0000000000000000000000000000000000000000000000000000000000000000908690600401614296565b602060405180830381600087803b15801561098757600080fd5b505af115801561099b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109bf9190613813565b506040517fea598cb00000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ea598cb090610a289086906004016147c6565b602060405180830381600087803b158015610a4257600080fd5b505af1158015610a56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7a9190613ed6565b90506001600160a01b0384163014610b47576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90610af39087908590600401614296565b602060405180830381600087803b158015610b0d57600080fd5b505af1158015610b21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b459190613813565b505b610b50826129b2565b15610b5f57610b5f8282612a91565b5050505050565b610b6f826129b2565b15610b8057610b7d826129fd565b91505b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a1903eab84306040518363ffffffff1660e01b8152600401610bcf9190614136565b6020604051808303818588803b158015610be857600080fd5b505af1158015610bfc573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610c219190613ed6565b90506001600160a01b0384163014610644576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906105f09087908590600401614296565b600033610caa602088018861350a565b6001600160a01b03161480610cd3575030610cc8602088018861350a565b6001600160a01b0316145b610cef5760405162461bcd60e51b81526004016106b190614696565b610cfc87608001516129b2565b15610d1457610d0e87608001516129fd565b60808801525b6000610d1e611bc6565b6001600160a01b03166352bbbe29858a8a8a8a6040518663ffffffff1660e01b8152600401610d50949392919061473b565b6020604051808303818588803b158015610d6957600080fd5b505af1158015610d7d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610da29190613ed6565b9050610dad836129b2565b15610dbc57610dbc8382612a91565b979650505050505050565b6040517f3b9f73840000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633b9f738490610e33908790879033906004016142fe565b602060405180830381600087803b158015610e4d57600080fd5b505af1158015610e61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e859190613ed6565b905061064d826129b2565b610e99836129b2565b15610eaa57610ea7836129fd565b92505b600082610f2957866001600160a01b03166351c0e0616040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610eec57600080fd5b505af1158015610f00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f249190613526565b610f9c565b866001600160a01b0316634800d97f6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f6457600080fd5b505af1158015610f78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9c9190613526565b90506001600160a01b0386163014610fe1576001600160a01b0386163314610fd65760405162461bcd60e51b81526004016106b190614696565b610fe1868286612abe565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b390611028908a908890600401614296565b602060405180830381600087803b15801561104257600080fd5b505af1158015611056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107a9190613813565b506040517f2f2cab870000000000000000000000000000000000000000000000000000000081526000906001600160a01b03891690632f2cab87906110c9908990899086908a906004016142d2565b602060405180830381600087803b1580156110e357600080fd5b505af11580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b9190613ed6565b9050611126836129b2565b15611135576111358382612a91565b5050505050505050565b611148826129b2565b1561115957611156826129fd565b91505b6001600160a01b038416301461119c576001600160a01b03841633146111915760405162461bcd60e51b81526004016106b190614696565b61119c848684612abe565b6040517fea785a5e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b0387169063ea785a5e906111e69087908790600401614296565b602060405180830381600087803b15801561120057600080fd5b505af1158015611214573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112389190613ed6565b9050611243826129b2565b15611252576112528282612a91565b505050505050565b611263816129b2565b1561127457611271816129fd565b90505b6001600160a01b03831630146112b7576001600160a01b03831633146112ac5760405162461bcd60e51b81526004016106b190614696565b6112b7838583612abe565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526001600160a01b03851690632e1a7d4d906112fc9084906004016147c6565b600060405180830381600087803b15801561131657600080fd5b505af115801561132a573d6000803e3d6000fd5b505050506001600160a01b038216301461046c576000846001600160a01b03166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b15801561137957600080fd5b505afa15801561138d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b19190613526565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081529091506001600160a01b0382169063a9059cbb906113fb9086908690600401614296565b602060405180830381600087803b15801561141557600080fd5b505af1158015611429573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112529190613813565b611456826129b2565b1561146757611464826129fd565b91505b6000856001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114a257600080fd5b505afa1580156114b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114da9190613526565b90506001600160a01b038516301461151f576001600160a01b03851633146115145760405162461bcd60e51b81526004016106b190614696565b61151f858285612abe565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b3906115669089908790600401614296565b602060405180830381600087803b15801561158057600080fd5b505af1158015611594573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b89190613813565b506040517f6e553f650000000000000000000000000000000000000000000000000000000081526000906001600160a01b03881690636e553f659061160390879089906004016147cf565b602060405180830381600087803b15801561161d57600080fd5b505af1158015611631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116559190613ed6565b9050611660836129b2565b1561166f5761166f8382612a91565b50505050505050565b611681836129b2565b156116925761168f836129fd565b92505b6001600160a01b03851630146116d5576001600160a01b03851633146116ca5760405162461bcd60e51b81526004016106b190614696565b6116d5858785612abe565b6040517fead5d3590000000000000000000000000000000000000000000000000000000081526000906001600160a01b0388169063ead5d35990611721908890889088906004016142af565b6040805180830381600087803b15801561173a57600080fd5b505af115801561174e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117729190613eee565b91505061177e826129b2565b1561166f5761166f8282612a91565b611796816129b2565b156117a7576117a4816129fd565b90505b6000846001600160a01b03166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b1580156117e257600080fd5b505afa1580156117f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181a9190613526565b90506001600160a01b038416301461185f576001600160a01b03841633146118545760405162461bcd60e51b81526004016106b190614696565b61185f848284612abe565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b3906118a69088908690600401614296565b602060405180830381600087803b1580156118c057600080fd5b505af11580156118d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f89190613813565b506040517f6e553f650000000000000000000000000000000000000000000000000000000081526001600160a01b03861690636e553f659061194090859087906004016147cf565b600060405180830381600087803b15801561195a57600080fd5b505af115801561196e573d6000803e3d6000fd5b505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b0384163014806119b2575082155b6119ce5760405162461bcd60e51b81526004016106b1906146cd565b606063fa6e671d60e01b3386866040516024016119ed9392919061414a565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009095169490941790935251611a5c928691869101614103565b60408051601f1981840301815291905290506112526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001682612b5a565b6040517fc65427940000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c654279490611b129030908a908a908a908a908a908a90600401614252565b600060405180830381600087803b158015611b2c57600080fd5b505af1158015611b40573d6000803e3d6000fd5b50505050505050505050565b866001600160a01b031663d505accf87611b64611bc6565b88888888886040518863ffffffff1660e01b8152600401611b8b9796959493929190614211565b600060405180830381600087803b158015611ba557600080fd5b505af1158015611bb9573d6000803e3d6000fd5b5050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b038516331480611c0957506001600160a01b03851630145b611c255760405162461bcd60e51b81526004016106b190614696565b6000611c3088612bd2565b90506000611c3d836129b2565b611c48576000611cdd565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038316906370a0823190611c8d908990600401614136565b60206040518083038186803b158015611ca557600080fd5b505afa158015611cb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cdd9190613ed6565b9050611ced888660400151612bd8565b6040860152611cfa611bc6565b6001600160a01b031663b95cac28858b8a8a8a6040518663ffffffff1660e01b8152600401611d2c94939291906144e6565b6000604051808303818588803b158015611d4557600080fd5b505af1158015611d59573d6000803e3d6000fd5b5050505050611d67836129b2565b1561196e576040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038416906370a0823190611db4908a90600401614136565b60206040518083038186803b158015611dcc57600080fd5b505afa158015611de0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e049190613ed6565b9050611b408461084b8385612c06565b876001600160a01b0316638fcbaf0c88611e2c611bc6565b8989898989896040518963ffffffff1660e01b8152600401611e559897969594939291906141c8565b600060405180830381600087803b158015611e6f57600080fd5b505af1158015611e83573d6000803e3d6000fd5b505050505050505050505050565b611e9a826129b2565b15611eab57611ea8826129fd565b91505b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015611ee657600080fd5b505afa158015611efa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1e9190613526565b90506001600160a01b0385163014611f63576001600160a01b0385163314611f585760405162461bcd60e51b81526004016106b190614696565b611f63858285612abe565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b390611faa9089908790600401614296565b602060405180830381600087803b158015611fc457600080fd5b505af1158015611fd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffc9190613813565b506040517f2f4f21e20000000000000000000000000000000000000000000000000000000081526000906001600160a01b03881690632f4f21e2906116039088908890600401614296565b816001600160a01b031663095ea7b361205e611bc6565b836040518363ffffffff1660e01b815260040161207c929190614296565b602060405180830381600087803b15801561209657600080fd5b505af11580156120aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ce9190613813565b505050565b6001600160a01b0385163314806120f257506001600160a01b03851630145b61210e5760405162461bcd60e51b81526004016106b190614696565b60608167ffffffffffffffff8111801561212757600080fd5b50604051908082528060200260200182016040528015612151578160200160208202803683370190505b50905060608267ffffffffffffffff8111801561216d57600080fd5b50604051908082528060200260200182016040528015612197578160200160208202803683370190505b50905060005b83811015612307576121b48585838181106107d657fe5b6121d05760405162461bcd60e51b81526004016106b190614704565b85516000908686848181106121e157fe5b90506040020160000135815181106121f557fe5b602002602001015190508660600151156122435761221281612c1c565b84838151811061221e57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506122fe565b61224c81612c1f565b6122d95761225981612c1c565b6001600160a01b03166370a08231896040518263ffffffff1660e01b81526004016122849190614136565b60206040518083038186803b15801561229c57600080fd5b505afa1580156122b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d49190613ed6565b6122e5565b876001600160a01b0316315b8383815181106122f157fe5b6020026020010181815250505b5060010161219d565b5084606001511561239e5761231a611bc6565b6001600160a01b0316630f5a6efa87846040518363ffffffff1660e01b815260040161234792919061416e565b60006040518083038186803b15801561235f57600080fd5b505afa158015612373573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261239b91908101906137d8565b90505b6123ac888660400151612c2c565b60408601526123b9611bc6565b6001600160a01b0316638bdb39138a8989896040518563ffffffff1660e01b81526004016123ea94939291906144e6565b600060405180830381600087803b15801561240457600080fd5b505af1158015612418573d6000803e3d6000fd5b50606092508591505067ffffffffffffffff8111801561243757600080fd5b50604051908082528060200260200182016040528015612461578160200160208202803683370190505b5090508560600151156124fe57612476611bc6565b6001600160a01b0316630f5a6efa88856040518363ffffffff1660e01b81526004016124a392919061416e565b60006040518083038186803b1580156124bb57600080fd5b505afa1580156124cf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124f791908101906137d8565b90506125fc565b60005b848110156125fa57865160009087878481811061251a57fe5b905060400201600001358151811061252e57fe5b6020026020010151905061254181612c1f565b6125ce5761254e81612c1c565b6001600160a01b03166370a082318a6040518263ffffffff1660e01b81526004016125799190614136565b60206040518083038186803b15801561259157600080fd5b505afa1580156125a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c99190613ed6565b6125da565b886001600160a01b0316315b8383815181106125e657fe5b602090810291909101015250600101612501565b505b60005b84811015611bb95761265986868381811061261657fe5b9050604002016020013561084b85848151811061262f57fe5b602002602001015185858151811061264357fe5b6020026020010151612c0690919063ffffffff16565b6001016125ff565b61266a826129b2565b1561267b57612678826129fd565b91505b6001600160a01b03841630146126de576001600160a01b03841633146126b35760405162461bcd60e51b81526004016106b190614696565b6126de847f000000000000000000000000000000000000000000000000000000000000000084612abe565b6040517fde0e9a3e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063de0e9a3e906127469086906004016147c6565b602060405180830381600087803b15801561276057600080fd5b505af1158015612774573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127989190613ed6565b90506001600160a01b0384163014610b47576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90610af39087908590600401614296565b60005b828110156128a5573384848381811061282957fe5b905060a002016060016020810190612841919061350a565b6001600160a01b0316148061288157503084848381811061285e57fe5b905060a002016060016020810190612876919061350a565b6001600160a01b0316145b61289d5760405162461bcd60e51b81526004016106b190614696565b600101612814565b506128ae611bc6565b6001600160a01b0316630e8e3e848285856040518463ffffffff1660e01b81526004016128dc9291906143a2565b6000604051808303818588803b1580156128f557600080fd5b505af1158015611135573d6000803e3d6000fd5b612912826129b2565b1561292357612920826129fd565b91505b6001600160a01b0384163014612966576001600160a01b038416331461295b5760405162461bcd60e51b81526004016106b190614696565b612966848684612abe565b6040517fba0876520000000000000000000000000000000000000000000000000000000081526000906001600160a01b0387169063ba087652906111e6908690889030906004016147e6565b7fba100000000000000000000000000000000000000000000000000000000000007fffff0000000000000000000000000000000000000000000000000000000000008216145b919050565b600080612a0983612c53565b805460009091559392505050565b612a26814710156101a3612ca9565b6000826001600160a01b031682604051612a3f90612c1c565b60006040518083038185875af1925050503d8060008114612a7c576040519150601f19603f3d011682016040523d82523d6000602084013e612a81565b606091505b505090506120ce816101a4612ca9565b6000612a9c83612c53565b919091555050565b6000808213612ab65781600003612ab8565b815b92915050565b80612ac8576120ce565b604080516001808252818301909252606091602080830190803683370190505090508281600081518110612af857fe5b6001600160a01b0392909216602092830291909101909101526040805160018082528183019092526060918160200160208202803683370190505090508281600081518110612b4357fe5b602002602001018181525050610b5f858383612cbb565b606060006060846001600160a01b031684604051612b7891906140e7565b6000604051808303816000865af19150503d8060008114612bb5576040519150601f19603f3d011682016040523d82523d6000602084013e612bba565b606091505b5091509150612bc98282612df5565b95945050505050565b60601c90565b60606000838015612be557fe5b1415612bfb57612bf482612e1f565b9050612ab8565b612ab8610136612e5c565b6000612c16838311156001612ca9565b50900390565b90565b6001600160a01b03161590565b60606000838015612c3957fe5b1415612c4857612bf482612eaf565b612ab8610150612e5c565b60006001827f0000000000000000000000000000000000000000000000000000000000000000604051602001612c8a929190614128565b60408051808303601f1901815291905280516020909101200392915050565b81612cb757612cb781612e5c565b5050565b6060825167ffffffffffffffff81118015612cd557600080fd5b50604051908082528060200260200182016040528015612d0f57816020015b612cfc6130df565b815260200190600190039081612cf45790505b50905060005b8351811015612da7576040805160a081019091528060038152602001858381518110612d3d57fe5b60200260200101516001600160a01b03168152602001848381518110612d5f57fe5b60200260200101518152602001866001600160a01b03168152602001306001600160a01b0316815250828281518110612d9457fe5b6020908102919091010152600101612d15565b50612db0611bc6565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b8152600401612ddb9190614450565b600060405180830381600087803b1580156128f557600080fd5b60608215612e04575080612ab8565b815115612e145781518083602001fd5b612ab86101ae612e5c565b60606000612e2c83612ef8565b90506001816004811115612e3c57fe5b1415612e5357612e4b83612f0e565b9150506129f8565b829150506129f8565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b60606000612ebc83612fbc565b90506000816003811115612ecc57fe5b1415612edb57612e4b83612fd2565b6001816003811115612ee957fe5b1415612e5357612e4b83613035565b600081806020019051810190612ab89190613c7b565b6060806000612f1c84613088565b915091506000805b8351811015612f82576000848281518110612f3b57fe5b60200260200101519050612f4e816129b2565b15612f7957612f5c816129fd565b858381518110612f6857fe5b602002602001018181525050600192505b50600101612f24565b5080612f8e5784612bc9565b60018383604051602001612fa49392919061455a565b60405160208183030381529060405295945050505050565b600081806020019051810190612ab89190613bfc565b6060600080612fe0846130ab565b91509150612fed826129b2565b1561302b57612ffb826129fd565b91506000828260405160200161301393929190614539565b604051602081830303815290604052925050506129f8565b83925050506129f8565b60606000613042836130c2565b905061304d816129b2565b15612e535761305b816129fd565b9050600181604051602001613071929190614522565b6040516020818303038152906040529150506129f8565b60606000828060200190518101906130a09190613c96565b909590945092505050565b600080828060200190518101906130a09190613c45565b6000818060200190518101906130d89190613c18565b9392505050565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b8035612ab88161489c565b60008083601f84011261312b578182fd5b50813567ffffffffffffffff811115613142578182fd5b602083019150836020808302850101111561315c57600080fd5b9250929050565b600082601f830112613173578081fd5b81356131866131818261482c565b614805565b8181529150602080830190848101818402860182018710156131a757600080fd5b60005b848110156131cf5781356131bd8161489c565b845292820192908201906001016131aa565b505050505092915050565b600082601f8301126131ea578081fd5b81356131f86131818261482c565b818152915060208083019084810160005b848110156131cf578135870160a080601f19838c0301121561322a57600080fd5b61323381614805565b85830135815260408084013587830152606080850135828401526080915081850135818401525082840135925067ffffffffffffffff83111561327557600080fd5b6132838c88858701016133a5565b90820152865250509282019290820190600101613209565b60008083601f8401126132ac578182fd5b50813567ffffffffffffffff8111156132c3578182fd5b60208301915083602060408302850101111561315c57600080fd5b600082601f8301126132ee578081fd5b81356132fc6131818261482c565b81815291506020808301908481018184028601820187101561331d57600080fd5b60005b848110156131cf57813584529282019290820190600101613320565b600082601f83011261334c578081fd5b815161335a6131818261482c565b81815291506020808301908481018184028601820187101561337b57600080fd5b60005b848110156131cf5781518452928201929082019060010161337e565b8035612ab8816148b1565b600082601f8301126133b5578081fd5b813567ffffffffffffffff8111156133cb578182fd5b6133de6020601f19601f84011601614805565b91508082528360208285010111156133f557600080fd5b8060208401602084013760009082016020015292915050565b805160058110612ab857600080fd5b803560018110612ab857600080fd5b803560028110612ab857600080fd5b60006080828403121561344c578081fd5b6134566080614805565b9050813567ffffffffffffffff8082111561347057600080fd5b61347c85838601613163565b8352602084013591508082111561349257600080fd5b61349e858386016132de565b602084015260408401359150808211156134b757600080fd5b506134c4848285016133a5565b6040830152506134d7836060840161339a565b606082015292915050565b6000608082840312156134f3578081fd5b50919050565b803560ff81168114612ab857600080fd5b60006020828403121561351b578081fd5b81356130d88161489c565b600060208284031215613537578081fd5b81516130d88161489c565b60008060008060808587031215613557578283fd5b84356135628161489c565b935060208501356135728161489c565b93969395505050506040820135916060013590565b6000806000806060858703121561359c578182fd5b84356135a78161489c565b935060208501356135b7816148b1565b9250604085013567ffffffffffffffff808211156135d3578384fd5b818701915087601f8301126135e6578384fd5b8135818111156135f4578485fd5b886020828501011115613605578485fd5b95989497505060200194505050565b600080600060608486031215613628578081fd5b83356136338161489c565b95602085013595506040909401359392505050565b60008060006040848603121561365c578081fd5b833567ffffffffffffffff811115613672578182fd5b61367e8682870161311a565b909790965060209590950135949350505050565b600080602083850312156136a4578182fd5b823567ffffffffffffffff8111156136ba578283fd5b6136c68582860161311a565b90969095509350505050565b600060208083850312156136e4578182fd5b825167ffffffffffffffff8111156136fa578283fd5b8301601f8101851361370a578283fd5b80516137186131818261482c565b8181528381019083850185840285018601891015613734578687fd5b8694505b83851015613756578051835260019490940193918501918501613738565b50979650505050505050565b600080600060408486031215613776578081fd5b833567ffffffffffffffff8082111561378d578283fd5b818601915086601f8301126137a0578283fd5b8135818111156137ae578384fd5b87602060a0830285010111156137c2578384fd5b6020928301989097509590910135949350505050565b6000602082840312156137e9578081fd5b815167ffffffffffffffff8111156137ff578182fd5b61380b8482850161333c565b949350505050565b600060208284031215613824578081fd5b81516130d8816148b1565b60008060008060008060c08789031215613847578384fd5b8635613852816148b1565b955060208701356138628161489c565b94506040870135935061387888606089016134f9565b92506080870135915060a087013590509295509295509295565b600080600080600080600060c0888a0312156138ac578485fd5b873596506138bd8960208a0161341d565b955060408801356138cd8161489c565b945060608801356138dd8161489c565b9350608088013567ffffffffffffffff808211156138f9578283fd5b6139058b838c0161343b565b945060a08a013591508082111561391a578283fd5b506139278a828b0161329b565b989b979a50959850939692959293505050565b600080600080600080600060e0888a031215613954578081fd5b873596506139658960208a0161341d565b955060408801356139758161489c565b945060608801356139858161489c565b9350608088013567ffffffffffffffff8111156139a0578182fd5b6139ac8a828b0161343b565b93505060a0880135915060c0880135905092959891949750929550565b600080600080600080600080610100898b0312156139e5578182fd5b88356139f08161489c565b97506020890135613a008161489c565b965060408901359550606089013594506080890135613a1e816148b1565b9350613a2d8a60a08b016134f9565b925060c0890135915060e089013590509295985092959890939650565b600080600080600080600060e0888a031215613a64578081fd5b8735613a6f8161489c565b96506020880135613a7f8161489c565b95506040880135945060608801359350613a9c8960808a016134f9565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215613aca578182fd5b8235613ad58161489c565b946020939093013593505050565b600080600080600060a08688031215613afa578283fd5b8535613b058161489c565b94506020860135613b158161489c565b93506040860135613b258161489c565b94979396509394606081013594506080013592915050565b60008060008060808587031215613b52578182fd5b8435613b5d8161489c565b93506020850135613b6d8161489c565b92506040850135613b7d8161489c565b9396929550929360600135925050565b60008060008060008060c08789031215613ba5578384fd5b8635613bb08161489c565b95506020870135613bc08161489c565b94506040870135613bd08161489c565b9350606087013592506080870135613be7816148b1565b8092505060a087013590509295509295509295565b600060208284031215613c0d578081fd5b81516130d8816148bf565b60008060408385031215613c2a578182fd5b8251613c35816148bf565b6020939093015192949293505050565b600080600060608486031215613c59578081fd5b8351613c64816148bf565b602085015160409095015190969495509392505050565b600060208284031215613c8c578081fd5b6130d8838361340e565b600080600060608486031215613caa578081fd5b613cb4858561340e565b9250602084015167ffffffffffffffff811115613ccf578182fd5b613cdb8682870161333c565b925050604084015190509250925092565b60008060008060008060008060008060006101608c8e031215613d0d578485fd5b613d178d8d61342c565b9a5067ffffffffffffffff8060208e01351115613d32578586fd5b613d428e60208f01358f016131da565b9a508060408e01351115613d54578586fd5b613d648e60408f01358f0161311a565b909a509850613d768e60608f016134e2565b97508060e08e01351115613d88578586fd5b613d988e60e08f01358f0161311a565b90975095506101008d013594506101208d013593506101408d0135811015613dbe578283fd5b50613dd08d6101408e01358e0161329b565b81935080925050509295989b509295989b9093969950565b6000806000806000806101208789031215613e01578384fd5b863567ffffffffffffffff80821115613e18578586fd5b9088019060c0828b031215613e2b578586fd5b613e3560c0614805565b82358152613e468b6020850161342c565b60208201526040830135613e598161489c565b6040820152613e6b8b6060850161310f565b60608201526080830135608082015260a083013582811115613e8b578788fd5b613e978c8286016133a5565b60a083015250809850505050613eb088602089016134e2565b959895975050505060a08401359360c08101359360e08201359350610100909101359150565b600060208284031215613ee7578081fd5b5051919050565b60008060408385031215613f00578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b60008284526020808501945082825b85811015613f5b578135613f408161489c565b6001600160a01b031687529582019590820190600101613f2d565b509495945050505050565b60008284526020808501945082825b85811015613f5b57813587529582019590820190600101613f75565b6000815180845260208085019450808401835b83811015613f5b57815187529582019590820190600101613fa4565b15159052565b60008151808452613fde816020860160208601614859565b601f01601f19169290920160200192915050565b8051608080845281519084018190526000916020919082019060a0860190845b818110156140375783516001600160a01b031683529284019291840191600101614012565b5050828501519150858103838701526140508183613f91565b925050506040830151848203604086015261406b8282613fc6565b91505060608301516140806060860182613fc0565b509392505050565b80356140938161489c565b6001600160a01b0390811683526020820135906140af826148b1565b90151560208401526040820135906140c68261489c565b16604083015260608101356140da816148b1565b8015156060840152505050565b600082516140f9818460208701614859565b9190910192915050565b60008451614115818460208901614859565b8201838582379092019182525092915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000604082016001600160a01b03808616845260206040818601528286518085526060870191508288019450855b818110156141ba57855185168352948301949183019160010161419c565b509098975050505050505050565b6001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b0397881681529515156020870152939095166040850152606084019190915260ff16608083015260a082019290925260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b6001600160a01b03949094168452602084019290925261ffff1660408301521515606082015260800190565b6040808252810183905260008460608301825b8681101561434157602083356143268161489c565b6001600160a01b031683529283019290910190600101614311565b5080925050506001600160a01b0383166020830152949350505050565b6020808252825182820181905260009190848201906040850190845b818110156143965783518352928401929184019160010161437a565b50909695505050505050565b6020808252818101839052600090604080840186845b878110156144435781356143cb816148bf565b6143d481614885565b8352818501356143e38161489c565b6001600160a01b031683860152818401358484015260606144068184018461484c565b61441282860182613f11565b505060806144228184018461484c565b61442e82860182613f11565b505060a09283019291909101906001016143b8565b5090979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156144d9578151805161448281614885565b8552808701516001600160a01b03168786015285810151868601526060808201516144af82880182613f11565b5050608090810151906144c486820183613f11565b505060a093909301929085019060010161446d565b5091979650505050505050565b60008582526001600160a01b038086166020840152808516604084015250608060608301526145186080830184613ff2565b9695505050505050565b6040810161452f84614885565b9281526020015290565b6060810161454685614885565b938152602081019290925260409091015290565b60006005851061456657fe5b8482526060602083015261457d6060830185613f91565b9050826040830152949350505050565b600061012080830161459e8c614892565b8b84526020808501929092528a5190819052610140808501928281028601909101918c8201855b82811015614645578785037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec00186528151805186528481015185870152604080820151908701526060808201519087015260809081015160a09187018290529061463181880183613fc6565b9786019796505050908301906001016145c5565b50505050838103604085015261465c818a8c613f1e565b91505061466c6060840188614088565b82810360e084015261467f818688613f66565b915050826101008301529998505050505050505050565b60208082526010908201527f496e636f72726563742073656e64657200000000000000000000000000000000604082015260600190565b6020808252601f908201527f52656c617965722063616e206f6e6c7920617070726f766520697473656c6600604082015260600190565b60208082526019908201527f696e76616c696420636861696e6564207265666572656e636500000000000000604082015260600190565b600060e08252855160e0830152602086015161475681614892565b61010083015260408601516001600160a01b03908116610120840152606087015116610140830152608086015161016083015260a086015160c06101808401526147a46101a0840182613fc6565b9150506147b46020830186614088565b60a082019390935260c0015292915050565b90815260200190565b9182526001600160a01b0316602082015260400190565b9283526001600160a01b03918216602084015216604082015260600190565b60405181810167ffffffffffffffff8111828210171561482457600080fd5b604052919050565b600067ffffffffffffffff821115614842578081fd5b5060209081020190565b600082356130d88161489c565b60005b8381101561487457818101518382015260200161485c565b8381111561046c5750506000910152565b6004811061488f57fe5b50565b6002811061488f57fe5b6001600160a01b038116811461488f57600080fd5b801515811461488f57600080fd5b6004811061488f57600080fdfea26469706673582212200d8843c75c8ce5dd1add9350da94dc5e9c6541e978b53349f0ceb5c2c212c27f64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/index.ts b/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/index.ts new file mode 100644 index 0000000..552b495 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/index.ts @@ -0,0 +1,16 @@ +import { Task, TaskRunOptions } from '@src'; +import { BatchRelayerDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as BatchRelayerDeployment; + + const relayerLibraryArgs = [input.Vault, input.wstETH, input.BalancerMinter]; + const relayerLibrary = await task.deployAndVerify('BatchRelayerLibrary', relayerLibraryArgs, from, force); + + // The relayer library automatically also deploys the relayer itself: we must verify it + const relayer: string = await relayerLibrary.getEntrypoint(); + + const relayerArgs = [input.Vault, relayerLibrary.address]; // See BalancerRelayer's constructor + await task.verify('BalancerRelayer', relayer, relayerArgs); + await task.save({ BalancerRelayer: relayer }); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/input.ts b/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/input.ts new file mode 100644 index 0000000..2a70a9a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/input.ts @@ -0,0 +1,39 @@ +import { Task, TaskMode } from '@src'; + +export type BatchRelayerDeployment = { + Vault: string; + wstETH: string; + BalancerMinter: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerMinter = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); + +export default { + Vault, + // wstETH and BalancerMinter are only deployed on mainnet, kovan and goerli. + mainnet: { + wstETH: '0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0', + BalancerMinter, + }, + kovan: { + wstETH: '0xa387b91e393cfb9356a460370842bc8dbb2f29af', + BalancerMinter, + }, + goerli: { + wstETH: '0x6320cD32aA674d2898A68ec82e869385Fc5f7E2f', + BalancerMinter, + }, + polygon: { + wstETH: '0x0000000000000000000000000000000000000000', + BalancerMinter: '0x0000000000000000000000000000000000000000', + }, + arbitrum: { + wstETH: '0x0000000000000000000000000000000000000000', + BalancerMinter: '0x0000000000000000000000000000000000000000', + }, + optimism: { + wstETH: '0x0000000000000000000000000000000000000000', + BalancerMinter: '0x0000000000000000000000000000000000000000', + }, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/output/arbitrum.json new file mode 100644 index 0000000..abca2e8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/output/arbitrum.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x4f4269F7008430860693aeDB86b0C55962D6E9b7", + "BalancerRelayer": "0x42E49B48573c725ee32d2579060Ed06894f97002" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/output/goerli.json new file mode 100644 index 0000000..9012d52 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/output/goerli.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0xdcdbf71A870cc60C6F9B621E28a7D3Ffd6Dd4965", + "BalancerRelayer": "0x7b9B6f094DC2Bd1c12024b0D9CC63d6993Be1888" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/output/mainnet.json new file mode 100644 index 0000000..f070da1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0xD966d712F470067B60D37246404D6DFe5Bf0B419", + "BalancerRelayer": "0x886A3Ec7bcC508B8795990B60Fa21f85F9dB7948" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/output/optimism.json b/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/output/optimism.json new file mode 100644 index 0000000..5bba196 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/output/optimism.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x5c89d9E1A668d0B39F4EC242F280bdDd445C633c", + "BalancerRelayer": "0x195CcCBE464EF9073d1f7A1ba1C9Bf0f56dfFFff" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/output/polygon.json new file mode 100644 index 0000000..d06da77 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/output/polygon.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x5ef4c5352882b10893b70DbcaA0C000965bd23c5", + "BalancerRelayer": "0xcf6a66E32dCa0e26AcC3426b851FD8aCbF12Dac7" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/readme.md b/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/readme.md new file mode 100644 index 0000000..5f1edb1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/readme.md @@ -0,0 +1,18 @@ +# 2022-07-20 - Batch Relayer V3 + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This relayer has been deprecated in favor of an [updated version](../20220916-batch-relayer-v4) with new features, such as read-only references and a 'peek' reference public method. + +Deployment of the second `BalancerRelayer` using `BatchRelayerLibrary`, for combining multiple operations (swaps, joins, etc.) in a single transaction. + +This new version adds support for Liquidity Gauge interactions, including staking, unstaking, minting, etc. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`BatchRelayerLibrary` artifact](./artifact/BatchRelayerLibrary.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/test/test.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/test/test.fork.ts new file mode 100644 index 0000000..5aafa6b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220720-batch-relayer-v3/test/test.fork.ts @@ -0,0 +1,150 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; + +import { BigNumberish } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { WeightedPoolEncoder } from '@helpers/models/pools/weighted/encoder'; + +import { MAX_UINT256 } from '@helpers/constants'; +import { defaultAbiCoder } from '@ethersproject/abi/lib/abi-coder'; + +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; + +describeForkTest('BatchRelayerLibrary', 'mainnet', 15150000, function () { + let task: Task; + + let relayer: Contract, library: Contract; + let sender: SignerWithAddress; + let vault: Contract, authorizer: Contract; + + const WETH = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'; + + const ETH_STETH_POOL = '0x32296969ef14eb0c6d29669c550d4a0449130230000200000000000000000080'; + const ETH_STETH_GAUGE = '0xcD4722B7c24C29e0413BDCd9e51404B4539D14aE'; + + const ETH_DAI_POOL = '0x0b09dea16768f0799065c475be02919503cb2a3500020000000000000000001a'; + const ETH_DAI_GAUGE = '0x4ca6AC0509E6381Ca7CD872a6cdC0Fbf00600Fa1'; + + const STAKED_ETH_STETH_HOLDER = '0x4B581dedA2f2C0650C3dFC506C86a8C140d9f699'; + + const CHAINED_REFERENCE_PREFIX = 'ba10'; + function toChainedReference(key: BigNumberish): BigNumber { + // The full padded prefix is 66 characters long, with 64 hex characters and the 0x prefix. + const paddedPrefix = `0x${CHAINED_REFERENCE_PREFIX}${'0'.repeat(64 - CHAINED_REFERENCE_PREFIX.length)}`; + + return BigNumber.from(paddedPrefix).add(key); + } + + before('run task', async () => { + task = new Task('20220720-batch-relayer-v3', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + library = await task.deployedInstance('BatchRelayerLibrary'); + relayer = await task.instanceAt('BalancerRelayer', await library.getEntrypoint()); + }); + + before('load vault and tokens', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + + vault = await vaultTask.instanceAt('Vault', await library.getVault()); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + }); + + before('load signers', async () => { + // We impersonate an account that holds staked BPT for the ETH_STETH Pool. + sender = await impersonate(STAKED_ETH_STETH_HOLDER); + }); + + before('approve relayer at the authorizer', async () => { + const relayerActionIds = await Promise.all( + ['swap', 'batchSwap', 'joinPool', 'exitPool', 'setRelayerApproval', 'manageUserBalance'].map((action) => + vault.getActionId(vault.interface.getSighash(action)) + ) + ); + + // We impersonate an account with the default admin role in order to be able to approve the relayer. This assumes + // such an account exists. + const admin = await impersonate(await authorizer.getRoleMember(await authorizer.DEFAULT_ADMIN_ROLE(), 0)); + + // Grant relayer permission to call all relayer functions + await authorizer.connect(admin).grantRoles(relayerActionIds, relayer.address); + }); + + before('approve relayer by the user', async () => { + await vault.connect(sender).setRelayerApproval(sender.address, relayer.address, true); + }); + + it('sender can unstake, exit, join and stake', async () => { + const destinationGauge = await task.instanceAt('IERC20', ETH_DAI_GAUGE); + expect(await destinationGauge.balanceOf(sender.address)).to.be.equal(0); + + // We use the relayer as the intermediate token holder as that saves gas (since there's fewer transfers, relayer + // permission checks, etc.) and also sidesteps the issue that not all BPT has Vault allowance (which is required to + // transfer them via the Vault, e.g. for staking). + + const stakedBalance = await (await task.instanceAt('IERC20', ETH_STETH_GAUGE)).balanceOf(sender.address); + + // There's no chained output here as the input equals the output + const unstakeCalldata = library.interface.encodeFunctionData('gaugeWithdraw', [ + ETH_STETH_GAUGE, + sender.address, + relayer.address, + stakedBalance, + ]); + + // Exit into WETH (it'd be more expensive to use ETH, and we'd have to use the relayer as an intermediary as we'd + // need to use said ETH). + + const ethStethTokens: Array = (await vault.getPoolTokens(ETH_STETH_POOL)).tokens; + const stableWethIndex = ethStethTokens.findIndex((token) => token.toLowerCase() == WETH.toLowerCase()); + + const exitCalldata = library.interface.encodeFunctionData('exitPool', [ + ETH_STETH_POOL, + 0, // Even if this a Stable Pool, the Batch Relayer is unaware of their encodings and the Weighted Pool encoding + // happens to match here + relayer.address, + relayer.address, + { + assets: ethStethTokens, + minAmountsOut: ethStethTokens.map(() => 0), + // Note that we use the same input as before + userData: defaultAbiCoder.encode(['uint256', 'uint256', 'uint256'], [0, stakedBalance, stableWethIndex]), + toInternalBalance: true, + }, + // Only store a chained reference for the WETH amount out, as the rest will be zero + [{ key: toChainedReference(42), index: stableWethIndex }], + ]); + + // Join from WETH + const ethDaiTokens: Array = (await vault.getPoolTokens(ETH_DAI_POOL)).tokens; + const ethDaiAmountsIn = ethDaiTokens.map((token) => + token.toLowerCase() == WETH.toLowerCase() ? toChainedReference(42) : 0 + ); + + const joinCalldata = library.interface.encodeFunctionData('joinPool', [ + ETH_DAI_POOL, + 0, // Weighted Pool + relayer.address, + relayer.address, + { + assets: ethDaiTokens, + maxAmountsIn: ethDaiTokens.map(() => MAX_UINT256), + userData: WeightedPoolEncoder.joinExactTokensInForBPTOut(ethDaiAmountsIn, 0), + fromInternalBalance: true, // Since we're joining from internal balance, we don't need to grant token allowance + }, + 0, // No eth + toChainedReference(17), // Store a reference for later staking + ]); + + const stakeCalldata = library.interface.encodeFunctionData('gaugeDeposit', [ + ETH_DAI_GAUGE, + relayer.address, + sender.address, + toChainedReference(17), // Stake all BPT from the join + ]); + + await relayer.connect(sender).multicall([unstakeCalldata, exitCalldata, joinCalldata, stakeCalldata]); + + expect(await destinationGauge.balanceOf(sender.address)).to.be.gt(0); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/artifact/AaveLinearPool.json b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/artifact/AaveLinearPool.json new file mode 100644 index 0000000..992e5e1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/artifact/AaveLinearPool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"components": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20", "name": "mainToken", "type": "address"}, {"internalType": "contract IERC20", "name": "wrappedToken", "type": "address"}, {"internalType": "address", "name": "assetManager", "type": "address"}, {"internalType": "uint256", "name": "upperTarget", "type": "uint256"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "address", "name": "owner", "type": "address"}], "internalType": "struct AaveLinearPool.ConstructorArgs", "name": "args", "type": "tuple"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "enabled", "type": "bool"}], "name": "RecoveryModeStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "lowerTarget", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "upperTarget", "type": "uint256"}], "name": "TargetsSet", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "disableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "enableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getBptIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getDomainSeparator", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMainIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMainToken", "outputs": [{"internalType": "contract IERC20", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "getNextNonce", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getProtocolFeesCollector", "outputs": [{"internalType": "contract IProtocolFeesCollector", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getScalingFactors", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getTargets", "outputs": [{"internalType": "uint256", "name": "lowerTarget", "type": "uint256"}, {"internalType": "uint256", "name": "upperTarget", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVirtualSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedToken", "outputs": [{"internalType": "contract IERC20", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedTokenRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "inRecoveryMode", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "indexIn", "type": "uint256"}, {"internalType": "uint256", "name": "indexOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "bytes", "name": "poolConfig", "type": "bytes"}], "name": "setAssetManagerPoolConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "newLowerTarget", "type": "uint256"}, {"internalType": "uint256", "name": "newUpperTarget", "type": "uint256"}], "name": "setTargets", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/artifact/AaveLinearPoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/artifact/AaveLinearPoolFactory.json new file mode 100644 index 0000000..07511de --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/artifact/AaveLinearPoolFactory.json @@ -0,0 +1,241 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "AaveLinearPoolFactory", + "sourceName": "contracts/aave/AaveLinearPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IBalancerQueries", + "name": "queries", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract AaveLinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastCreatedPool", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101806040523480156200001257600080fd5b5060405162008e5938038062008e59833981016040819052620000359162000200565b81604051806020016200004890620001f2565b601f1982820381018352601f90910116604052805182903090839060006002820460a081905280830360e081905281855290915083620000948162000113602090811b6200074417901c565b60601b6001600160601b0319166080528285018051838252620000c38262000113602090811b6200074417901c565b6001600160601b0319606091821b811660c05296909352905261010095909552505092821b831661012052506001600255426276a70001610140529390931b909216610160525062000254915050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001616001600160a01b03831615156101ac62000167565b50919050565b81620001785762000178816200017c565b5050565b6200018e816210905360ea1b62000191565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b61596580620034f483390190565b6000806040838503121562000213578182fd5b825162000220816200023e565b602084015190925062000233816200023e565b809150509250929050565b6001600160a01b03811681146200018e57600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c610140516101605160601c613227620002cd6000398061028d525080610520528061054a5250806106955250806106435250806107ad52508061022052806108295250806107ce5250806101ff528061080552506132276000f3fe60806040523480156200001157600080fd5b5060043610620000db5760003560e01c80635ed31282116200008d578063851c1bb31162000063578063851c1bb314620001a25780638d928af814620001c8578063aaabadc514620001d257620000db565b80635ed3128214620001685780636634b75314620001725780636c57f5a9146200019857620000db565b80632ccb254a11620000c35780632ccb254a146200011c5780632da47c4014620001425780632f2770db146200015c57620000db565b8062c194db14620000e0578063174481fa1462000102575b600080fd5b620000ea620001dc565b604051620000f9919062001172565b60405180910390f35b6200010c620001fd565b604051620000f99291906200110b565b620001336200012d36600462000f20565b62000243565b604051620000f99190620010ea565b6200014c6200051a565b604051620000f992919062001348565b6200016662000586565b005b62000133620005ef565b620001896200018336600462000e7e565b6200060b565b604051620000f9919062001132565b6200018962000636565b620001b9620001b336600462000ebf565b6200063f565b604051620000f991906200113d565b6200013362000693565b62000133620006b7565b6060620001f860405180602001604052806000815250620007a5565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b60006200024f62000880565b60038054600181019091556040516060906200026e6020820162000d26565b601f1982820381018352601f909101166040526200028b62000693565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001620002bf9291906200110b565b60408051601f1981840301815290829052620002df9291602001620010b7565b604051602081830303815290604052905060006200030583838051906020012062000899565b9050600080620003146200051a565b915091506200032262000d34565b6040518061016001604052806200033862000693565b73ffffffffffffffffffffffffffffffffffffffff1681526020018f81526020018e81526020018d73ffffffffffffffffffffffffffffffffffffffff1681526020018c73ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018b81526020018a81526020018481526020018381526020018973ffffffffffffffffffffffffffffffffffffffff1681525090506000620004158260405160200162000400919062001263565b604051602081830303815290604052620008af565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200046057600080fd5b505af115801562000475573d6000803e3d6000fd5b505050506000620004896000898962000904565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614620004fc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004f390620011f5565b60405180910390fd5b5096505050505050506200050f620009e2565b979650505050505050565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200057857807f000000000000000000000000000000000000000000000000000000000000000003925062278d00915062000581565b60009250600091505b509091565b62000590620009e9565b6200059a62000a38565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60045473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b60015460ff1690565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016200067692919062001087565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000620006c362000693565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200070957600080fd5b505afa1580156200071e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f8919062000f01565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506200079f73ffffffffffffffffffffffffffffffffffffffff831615156101ac62000a51565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016200087281838662000a66565b505050505050505050919050565b6200089360028054141561019062000a51565b60028055565b6000620008a883833062000ac4565b9392505050565b600080620008bd8362000b05565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790559392505050565b6000808447101562000944576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004f39062001187565b82516200097f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004f3906200122c565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff8116620009da576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004f390620011be565b949350505050565b6001600255565b600062000a1a6000357fffffffff00000000000000000000000000000000000000000000000000000000166200063f565b905062000a3562000a2c823362000b9d565b61019162000a51565b50565b62000a4f62000a4662000636565b1560d362000a51565b565b8162000a625762000a628162000c3b565b5050565b5b6020811062000a88578151835260209283019290910190601f190162000a67565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b60008060ff60f81b83868660405160200162000ae4949392919062001023565b60408051808303601f19018152919052805160209091012095945050505050565b600062000b1162000a38565b600062000b1e8362000c67565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b600062000ba9620006b7565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000be79392919062001146565b60206040518083038186803b15801562000c0057600080fd5b505afa15801562000c15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008a8919062000e9d565b62000a35817f42414c000000000000000000000000000000000000000000000000000000000062000cab565b6000606062000c7683620007a5565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff8116620008a8573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611e4580620013ad83390190565b604051806101600160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b600082601f83011262000e0d578081fd5b813567ffffffffffffffff8082111562000e25578283fd5b6040516020601f19601f850116820101818110838211171562000e46578485fd5b60405282815292508284830160200186101562000e6257600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121562000e90578081fd5b8135620008a88162001389565b60006020828403121562000eaf578081fd5b81518015158114620008a8578182fd5b60006020828403121562000ed1578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114620008a8578182fd5b60006020828403121562000f13578081fd5b8151620008a88162001389565b600080600080600080600060e0888a03121562000f3b578283fd5b873567ffffffffffffffff8082111562000f53578485fd5b62000f618b838c0162000dfc565b985060208a013591508082111562000f77578485fd5b5062000f868a828b0162000dfc565b965050604088013562000f998162001389565b9450606088013562000fab8162001389565b93506080880135925060a0880135915060c088013562000fcb8162001389565b8091505092959891949750929550565b73ffffffffffffffffffffffffffffffffffffffff169052565b600081518084526200100f81602086016020860162001356565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60008351620010cb81846020880162001356565b835190830190620010e181836020880162001356565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b600060208252620008a8602083018462000ff5565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b6000602082526200127960208301845162000fdb565b60208301516101608060408501526200129761018085018362000ff5565b91506040850151601f19858403016060860152620012b6838262000ff5565b9250506060850151620012cd608086018262000fdb565b506080850151620012e260a086018262000fdb565b5060a0850151620012f760c086018262000fdb565b5060c085015160e0858101919091528501516101008086019190915285015161012080860191909152850151610140808601919091528501516200133e8286018262000fdb565b5090949350505050565b918252602082015260400190565b60005b838110156200137357818101518382015260200162001359565b8381111562001383576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000a3557600080fdfe6101606040523480156200001257600080fd5b5060405162001e4538038062001e45833981016040819052620000359162000462565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000378565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200012591908101906200039e565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000449565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000449565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000378565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000378565b6001600160601b0319606091821b811660e05292811b8316610120521b166101405250620004e0915050565b6000602082840312156200038a578081fd5b81516200039781620004c7565b9392505050565b60006020808385031215620003b1578182fd5b82516001600160401b0380821115620003c8578384fd5b818501915085601f830112620003dc578384fd5b815181811115620003eb578485fd5b8381029150620003fd848301620004a0565b8181528481019084860184860187018a101562000418578788fd5b8795505b838610156200043c5780518352600195909501949186019186016200041c565b5098975050505050505050565b6000602082840312156200045b578081fd5b5051919050565b6000806040838503121562000475578081fd5b82516200048281620004c7565b60208401519092506200049581620004c7565b809150509250929050565b6040518181016001600160401b0381118282101715620004bf57600080fd5b604052919050565b6001600160a01b0381168114620004dd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c611882620005c36000398061050b52806108235250806101355280610c145280610f5f52806110195250806103c152508061046e528061059b528061074a52806108ee5280610cbf52806110ad52806111a5528061125f52508060ea5280610192528061043252806105ce528061063352806106d4528061078652806108b352806111785250806101715280610404528061071c5280610a7d5280610b5c5280610dbb5280610e9a5250806099528061030b52506118826000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b919061159f565b60405180910390f35b610077610072366004611456565b6100bb565b60405161005b91906117eb565b610077610092366004611479565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610124565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308561025b565b61011b83610124565b90505b92915050565b60008061012f610304565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101ce929190611704565b60806040518083038186803b1580156101e657600080fd5b505afa1580156101fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021e91906114ff565b50505090508181101561024057610237818303856103ed565b925050506100c9565b818111156102545761023782820385610705565b5050919050565b6102fe846323b872dd60e01b85858560405160240161027c939291906115c0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610913565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a691906114dc565b9150915060006002828401816103b857fe5b0490506103e5817f00000000000000000000000000000000000000000000000000000000000000006109c0565b935050505090565b60006103f76113a3565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104cb611406565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105429086908690600401611728565b602060405180830381600087803b15801561055c57600080fd5b505af1158015610570573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059491906114c4565b90506105c07f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c981610c82565b6105f37f000000000000000000000000000000000000000000000000000000000000000087610d4f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a082319061066890309060040161159f565b60206040518083038186803b15801561068057600080fd5b505afa158015610694573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b891906114c4565b90506106fb73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016878361104e565b9695505050505050565b600061070f6113a3565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e3611406565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061085a9086908690600401611728565b602060405180830381600087803b15801561087457600080fd5b505af1158015610888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ac91906114c4565b90506108d87f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e96108e48261106d565b61113b565b6105f37f000000000000000000000000000000000000000000000000000000000000000082610d4f565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093c9190611583565b6000604051808303816000865af19150503d8060008114610979576040519150601f19603f3d011682016040523d82523d6000602084013e61097e565b606091505b50915091506000821415610996573d6000803e3d6000fd5b6102fe8151600014806109b85750818060200190518101906109b891906114a4565b6101a26112f2565b60006109cf82151560046112f2565b826109dc5750600061011e565b670de0b6b3a7640000838102906109ff908583816109f657fe5b041460056112f2565b828181610a0857fe5b0491505061011e565b6040805160028082526060828101909352816020015b610a2f61142d565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b908490600401611680565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517fead5d35900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ead5d35990610cf99030908590600190600401611617565b6040805180830381600087803b158015610d1257600080fd5b505af1158015610d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4a91906114dc565b505050565b6040805160028082526060828101909352816020015b610d6d61142d565b815260200190600190039081610d65579050509050600281600081518110610d9157fe5b6020026020010151600001906002811115610da857fe5b90816002811115610db557fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de757fe5b602002602001015160200181815250508181600081518110610e0557fe5b602002602001015160600181815250508281600081518110610e2357fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e7057fe5b6020026020010151600001906002811115610e8757fe5b90816002811115610e9457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec657fe5b602002602001015160200181815250508181600181518110610ee457fe5b602002602001015160600181815250508281600181518110610f0257fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517f095ea7b30000000000000000000000000000000000000000000000000000000081529084169063095ea7b390610f89907f00000000000000000000000000000000000000000000000000000000000000009086906004016115f1565b602060405180830381600087803b158015610fa357600080fd5b505af1158015610fb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdb91906114a4565b506040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b908490600401611680565b610d4a8363a9059cbb60e01b848460405160240161027c9291906115f1565b6040517ff57d0b4000000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f57d0b40906110e29085906004016117eb565b60206040518083038186803b1580156110fa57600080fd5b505afa15801561110e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113291906114c4565b60010192915050565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906111cf907f00000000000000000000000000000000000000000000000000000000000000009085906004016115f1565b602060405180830381600087803b1580156111e957600080fd5b505af11580156111fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122191906114a4565b506040517f2f2cab8700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632f2cab879061129c9030908590600090600190600401611647565b602060405180830381600087803b1580156112b657600080fd5b505af11580156112ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ee91906114c4565b5050565b816112ee576112ee81611325817f42414c0000000000000000000000000000000000000000000000000000000000611328565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b600060208284031215611467578081fd5b81356114728161182a565b9392505050565b6000806040838503121561148b578081fd5b82356114968161182a565b946020939093013593505050565b6000602082840312156114b5578081fd5b81518015158114611472578182fd5b6000602082840312156114d5578081fd5b5051919050565b600080604083850312156114ee578182fd5b505080516020909101519092909150565b60008060008060808587031215611514578182fd5b84519350602085015192506040850151915060608501516115348161182a565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b600082516115958184602087016117f4565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff93909316835260208301919091521515604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff949094168452602084019290925261ffff1660408301521515606082015260800190565b602080825282518282018190526000919060409081850190868401855b828110156116f75781518051600381106116b357fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff1686860152606090810151908501526080909301929085019060010161169d565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a0830152602084015161174381611820565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c06101408401528051806101608501526101806117af82828701602086016117f4565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401168601019350505050611472602083018461153f565b90815260200190565b60005b8381101561180f5781810151838201526020016117f7565b838111156102fe5750506000910152565b6002811061132557fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461132557600080fdfea264697066735822122005e052f73c844913f8ecf9c352aca4b24ac8c3ab79ae78423eca3617ccb9fe9c64736f6c63430007010033a2646970667358221220dbe28387b1fae9d5aecaea6e06cf45380b6d8d21e8cf95839657740d4001a28a64736f6c634300070100336102c06040523480156200001257600080fd5b506040516200596538038062005965833981016040819052620000359162000ee0565b8051602082015160408301516060840151608085015160c08601516200005b8762000563565b60e08801516101008901516101208a01516101408b01518a60008b8b620000848c8c30620005ed565b620000918d8d8c620006bc565b89898989828289898d85336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000de92919062000d70565b508051620000f490600490602084019062000d70565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b1661012052506200017290506276a700831115610194620007d6565b6200018662278d00821115610195620007d6565b4290910161014081905201610160528551620001a8906002111560c8620007d6565b620001c2620001b6620007eb565b8751111560c9620007d6565b620001d886620007f060201b620014971760201c565b620001e384620007fc565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f9062000214908d90600401620010ce565b602060405180830381600087803b1580156200022f57600080fd5b505af115801562000244573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026a919062000ec7565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d2906200029f9084908b908b9060040162001032565b600060405180830381600087803b158015620002ba57600080fd5b505af1158015620002cf573d6000803e3d6000fd5b505050508061018081815250508a6001600160a01b031663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031657600080fd5b505afa1580156200032b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000351919062000ea8565b6001600160a01b03166101a0816001600160a01b031660601b815250505050505050505050505050876001600160a01b03166101c0816001600160a01b031660601b81525050866001600160a01b03166101e0816001600160a01b031660601b815250506000806000620003cd8b8b306200089060201b60201c565b61020081905261022083905261024082905291945092509050620003f18b62000986565b61026052620004008a62000986565b610280526000620004138c828c62000a55565b50505050505050505050505050505080608001516001600160a01b031663b4dcfc776040518163ffffffff1660e01b815260040160206040518083038186803b1580156200046057600080fd5b505afa15801562000475573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200049b919062000ea8565b6001600160a01b03166102a0816001600160a01b031660601b815250506200055c81608001516001600160a01b0316634800d97f6040518163ffffffff1660e01b815260040160206040518083038186803b158015620004fa57600080fd5b505afa1580156200050f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000535919062000ea8565b6001600160a01b031682606001516001600160a01b031614610208620007d660201b60201c565b5062001143565b6040805160028082526060808301845292839291906020830190803683370190505090508260a00151816000815181106200059a57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260a0015181600181518110620005cd57fe5b6001600160a01b039092166020928302919091019091015290505b919050565b6060600080806200060087878762000890565b60408051600380825260808201909252939650919450925060208201606080368337019050509350868484815181106200063657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050858483815181106200066457fe5b60200260200101906001600160a01b031690816001600160a01b031681525050848482815181106200069257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505050509392505050565b60606000620006cd85853062000890565b92505050606083516001016001600160401b0381118015620006ee57600080fd5b5060405190808252806020026020018201604052801562000719578160200160208202803683370190505b50905060005b8151811015620007cc57828110156200077a578481815181106200073f57fe5b60200260200101518282815181106200075457fe5b60200260200101906001600160a01b031690816001600160a01b031681525050620007c3565b8281111562000793578460018203815181106200073f57fe5b6000828281518110620007a257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b6001016200071f565b5095945050505050565b81620007e757620007e78162000b4d565b5050565b600390565b80620007e78162000b62565b620008156200080a62000bee565b82101560cb620007d6565b6200082e6200082362000bf7565b82111560ca620007d6565b620008508160c0603f60085462000c0360201b620014a117909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc9062000885908390620010e3565b60405180910390a150565b6000806000846001600160a01b0316866001600160a01b031610156200091957836001600160a01b0316856001600160a01b03161015620008dc5750600091506001905060026200097d565b836001600160a01b0316866001600160a01b03161015620009085750600091506002905060016200097d565b50600191506002905060006200097d565b846001600160a01b0316846001600160a01b03161015620009455750600291506001905060006200097d565b856001600160a01b0316846001600160a01b03161015620009715750600291506000905060016200097d565b50600191506000905060025b93509350939050565b60006001600160a01b038216301415620009aa5750670de0b6b3a7640000620005e8565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620009e657600080fd5b505afa158015620009fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a2191906200100f565b60ff169050600062000a4060128362000c2860201b620014c41760201c565b600a0a670de0b6b3a764000002949350505050565b62000a668183111561014c620007d6565b62000a836b0de0b6b39983494c589c000082111561014d620007d6565b62000a9d670de0b6b3a7640000825b0615610161620007d6565b62000ab1670de0b6b3a76400008362000a92565b62000b0362000ad9670de0b6b3a764000083046040602062000c4560201b620014da1760201c565b62000afc670de0b6b3a7640000850460208062000c4560201b620014da1760201c565b1762000c5a565b826001600160a01b03167fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280838360405162000b40929190620010ec565b60405180910390a2505050565b62000b5f816210905360ea1b62000c7f565b50565b60028151101562000b735762000b5f565b60008160008151811062000b8357fe5b602002602001015190506000600190505b825181101562000be957600083828151811062000bad57fe5b6020026020010151905062000bde816001600160a01b0316846001600160a01b0316106065620007d660201b60201c565b915060010162000b94565b505050565b64e8d4a5100090565b67016345785d8a000090565b600062000c1284848462000ce0565b506001901b60001901811b1992909216911b1790565b600062000c3a838311156001620007d6565b508082035b92915050565b600062000c5484848462000ce0565b50501b90565b62000c7981600060085462000d3b60201b620014ed179092919060201c565b60085550565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b62000cf161010083106064620007d6565b62000d2a6001821015801562000d22575062000d1e60ff846101000362000d5660201b620015191760201c565b8211155b6064620007d6565b62000be983821c156101b4620007d6565b6001600160c01b03828116821b90821b198416179392505050565b600081831062000d67578162000d69565b825b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000db357805160ff191683800117855562000de3565b8280016001018555821562000de3579182015b8281111562000de357825182559160200191906001019062000dc6565b5062000df192915062000df5565b5090565b5b8082111562000df1576000815560010162000df6565b805162000c3f816200112d565b600082601f83011262000e2a578081fd5b81516001600160401b0381111562000e40578182fd5b602062000e56601f8301601f19168201620010fa565b9250818352848183860101111562000e6d57600080fd5b60005b8281101562000e8d57848101820151848201830152810162000e70565b8281111562000e9f5760008284860101525b50505092915050565b60006020828403121562000eba578081fd5b815162000d69816200112d565b60006020828403121562000ed9578081fd5b5051919050565b60006020828403121562000ef2578081fd5b81516001600160401b038082111562000f09578283fd5b818401915061016080838703121562000f20578384fd5b62000f2b81620010fa565b905062000f39868462000e0c565b815260208301518281111562000f4d578485fd5b62000f5b8782860162000e19565b60208301525060408301518281111562000f73578485fd5b62000f818782860162000e19565b60408301525062000f96866060850162000e0c565b606082015262000faa866080850162000e0c565b608082015262000fbe8660a0850162000e0c565b60a082015260c0838101519082015260e08084015190820152610100808401519082015261012080840151908201526101409150620010008683850162000e0c565b91810191909152949350505050565b60006020828403121562001021578081fd5b815160ff8116811462000d69578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b818110156200107e576200106b855162001121565b8352938301939183019160010162001056565b505084810360408601528551808252908201925081860190845b81811015620010c057620010ad835162001121565b8552938301939183019160010162001098565b509298975050505050505050565b6020810160038310620010dd57fe5b91905290565b90815260200190565b918252602082015260400190565b6040518181016001600160401b03811182821017156200111957600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b038116811462000b5f57600080fd5b60805160a05160c05160e0516101005160601c6101205160601c6101405161016051610180516101a05160601c6101c05160601c6101e05160601c61020051610220516102405161026051610280516102a05160601c61465462001311600039806125225250806115d052508061156c5280612fdb52508061082d5280610bed52806115f852806127b452806129645280612abb5280612c2d5280612dc95280612f205250806109bd5280610bb3528061158e528061278052806128e952806129305280612a455280612a875280612bf95280612d535280612d955280612eaa5280612eec525080610c2e5280610e725280610f5f5280611639528061240452806127eb528061299b5280612af25280612c645280612e005280612f5752508061146b528061175c5280611828528061273552806128755280612baf5280612cdf52806130015250806109e1528061110d528061171352806117df5280611a4d5280611aec52806126f6528061281752806129d15280612b705280612c905280612e365280612fa05250806111b352508061094a52508061192652508061190252508061103152508061100d525080610f975250806124845250806124c65250806124a552506146546000f3fe608060405234801561001057600080fd5b50600436106103205760003560e01c80637ecebe00116101a7578063a9059cbb116100ee578063d5c096c411610097578063ed24911d11610071578063ed24911d146105f0578063f174e241146105f8578063f5431aa81461060057610320565b8063d5c096c4146105c2578063dd62ed3e146105d5578063de82cd34146105e857610320565b8063b7b814fc116100c8578063b7b814fc1461059f578063d2946c2b146105a7578063d505accf146105af57610320565b8063a9059cbb1461057c578063aaabadc51461058f578063b35056b81461059757610320565b8063893d20e81161015057806395d89b411161012a57806395d89b411461054e5780639f11080e14610556578063a457c2d71461056957610320565b8063893d20e81461052b5780638d928af81461053357806390193b7c1461053b57610320565b80638456cb59116101815780638456cb59146104fd578063851c1bb31461050557806387ec68171461051857610320565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f557610320565b8063395093511161026b57806355c6762811610214578063679aefce116101ee578063679aefce1461049e57806370a08231146104a657806374f3b009146104b957610320565b806355c676281461045f5780636028bfd41461046757806363fe3b561461048857610320565b80634de046d5116102455780634de046d51461042f57806350dd6ed91461044457806354a844ba1461045757610320565b8063395093511461040c5780633f4ba83a1461041f5780634d64cd741461042757610320565b80631dd746ea116102cd5780633644e515116102a75780633644e515146103e757806338e9922e146103ef57806338fff2d01461040457610320565b80631dd746ea146103aa57806323b872dd146103bf578063313ce567146103d257610320565b806316b8d6ff116102fe57806316b8d6ff1461038357806318160ddd1461038b5780631c0de0511461039357610320565b806301ec954a1461032557806306fdde031461034e578063095ea7b314610363575b600080fd5b610338610333366004614033565b610608565b604051610345919061439c565b60405180910390f35b61035661077e565b604051610345919061455f565b610376610371366004613dcf565b610814565b6040516103459190614379565b61033861082b565b61033861084f565b61039b610855565b60405161034593929190614384565b6103b261087e565b6040516103459190614341565b6103766103cd366004613d1f565b61088d565b6103da610903565b6040516103459190614599565b61033861090c565b6104026103fd366004614152565b610916565b005b610338610948565b61037661041a366004613dcf565b61096c565b6104026109a7565b6103386109bb565b6104376109df565b604051610345919061432d565b610402610452366004613fe5565b610a03565b610402610a21565b610338610a33565b61047a610475366004613ee6565b610a46565b604051610345929190614572565b610490610a7d565b60405161034592919061458b565b610338610ac2565b6103386104b4366004613ccb565b610c76565b6104cc6104c7366004613ee6565b610c95565b604051610345929190614354565b6103386104e8366004613ccb565b610d98565b610402610da3565b610338610f5d565b610402610f81565b610338610513366004613f89565b610f93565b61047a610526366004613ee6565b610fe5565b61043761100b565b61043761102f565b610338610549366004613ccb565b611053565b61035661106e565b610402610564366004614182565b6110cf565b610376610577366004613dcf565b611139565b61037661058a366004613dcf565b611177565b610437611184565b61037661118e565b61040261119f565b6104376111b1565b6104026105bd366004613d5f565b6111d5565b6104cc6105d0366004613ee6565b611256565b6103386105e3366004613ce7565b611379565b6103386113b6565b61033861145f565b610437611469565b61033861148d565b6000846080015161063561061a61102f565b6001600160a01b0316336001600160a01b03161460cd61152f565b61064a610640610948565b82146101f461152f565b61065261153d565b61066c6003851080156106655750600384105b606461152f565b6060610676611545565b90506106828682611672565b60008061068d610a7d565b91509150610699613b31565b60405180606001604052806106ac610a33565b815260208101859052604001839052905060008a5160018111156106cc57fe5b1415610730576106f38a60600151858a815181106106e657fe5b60200260200101516116db565b60608b015260006107058b8b846116e7565b905061072481868a8151811061071757fe5b60200260200101516117ae565b96505050505050610775565b6107448a606001518589815181106106e657fe5b60608b015260006107568b8b846117ba565b905061072481868b8151811061076857fe5b602002602001015161186f565b50949350505050565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561080a5780601f106107df5761010080835404028352916020019161080a565b820191906000526020600020905b8154815290600101906020018083116107ed57829003601f168201915b5050505050905090565b600061082133848461187b565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b60008060006108626118e3565b15925061086d611900565b9150610877611924565b9050909192565b6060610888611545565b905090565b60008061089a8533611379565b90506108be336001600160a01b03871614806108b65750838210155b61019e61152f565b6108c9858585611948565b336001600160a01b038616148015906108e457506000198114155b156108f6576108f6853385840361187b565b60019150505b9392505050565b60055460ff1690565b600061088861145f565b600080610921610a7d565b9150915061093a6109328383611a28565b61014f61152f565b61094383611b31565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916108219185906109a29086611b4d565b61187b565b6109af611b5f565b6109b96000611ba5565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a0b611b5f565b610a13611c41565b610a1d8282611c54565b5050565b610a29611b5f565b6109b96001611d34565b6008546000906108889060c0603f611d76565b60006060610a5c8651610a57611d85565b611d8a565b610a7189898989898989611d97611db3611e1c565b97509795505050505050565b6000806000610a8a611fb3565b9050670de0b6b3a7640000610aa182602080611d76565b029250670de0b6b3a7640000610aba8260406020611d76565b029150509091565b600080610acd610948565b90506060610ad961102f565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b04919061439c565b60006040518083038186803b158015610b1c57600080fd5b505afa158015610b30573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b589190810190613dfa565b50915050610b6d81610b68611545565b611672565b600080610b78610a7d565b91509150610b84613b31565b6040518060600160405280610b97610a33565b81526020018481526020018381525090506000610c23610bea867f000000000000000000000000000000000000000000000000000000000000000081518110610bdc57fe5b602002602001015184611fb9565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c1657fe5b602002602001015161201a565b9050610c6b610c64867f000000000000000000000000000000000000000000000000000000000000000081518110610c5757fe5b6020026020010151612026565b829061203a565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ca461061a61102f565b610caf610640610948565b60606000610cbc86612091565b15610ce457610cc96120c0565b610cdb89610cd561084f565b886120d3565b92509050610d36565b610cec61153d565b6060610cf6611545565b9050610d028a82611672565b610d268d8d8d8d8d610d1261118e565b610d1c578d610d1f565b60005b878e611d97565b93509150610d348382611db3565b505b610d408b8261212b565b81895167ffffffffffffffff81118015610d5957600080fd5b50604051908082528060200260200182016040528015610d83578160200160208202803683370190505b509450945050505b5097509795505050505050565b600061082582611053565b6000610dad610948565b90506060610db961102f565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de4919061439c565b60006040518083038186803b158015610dfc57600080fd5b505afa158015610e10573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e389190810190613dfa565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff817f000000000000000000000000000000000000000000000000000000000000000081518110610e9b57fe5b602002602001018181525050610eaf613b52565b6040518060800160405280610ec385612135565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ef461102f565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f2594939291906143c4565b600060405180830381600087803b158015610f3f57600080fd5b505af1158015610f53573d6000803e3d6000fd5b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b610f89611b5f565b6109b96001611ba5565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610fc89291906142b7565b604051602081830303815290604052805190602001209050919050565b60006060610ff68651610a57611d85565b610a7189898989898989611d97612138611e1c565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561080a5780601f106107df5761010080835404028352916020019161080a565b6110d7611b5f565b6000806110e2610a7d565b915091506110f36109328383611a28565b6111086111008585611a28565b61015761152f565b6111337f000000000000000000000000000000000000000000000000000000000000000085856121a1565b50505050565b6000806111463385611379565b90508083106111605761115b3385600061187b565b61116d565b61116d338585840361187b565b5060019392505050565b6000610821338484611948565b6000610888612273565b6008546000906108889060ff6122ed565b6111a7611b5f565b6109b96000611d34565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886112048c611053565b8960405160200161121a969594939291906144b1565b60405160208183030381529060405280519060200120905061124b88826112428787876122f7565b886101f8612336565b610f5388888861187b565b6060808861126561061a61102f565b611270610640610948565b61127861153d565b6060611282611545565b905061128c61084f565b61133957600060606112a18d8d8d868b61238d565b915091506112ba6112b0612446565b83101560cc61152f565b6112cc60006112c7612446565b61244b565b6112df8b6112d8612446565b840361244b565b6112e98184612138565b808a5167ffffffffffffffff8111801561130257600080fd5b5060405190808252806020026020018201604052801561132c578160200160208202803683370190505b5095509550505050610d8b565b6113438882611672565b6000606061136b8d8d8d8d8d61135761118e565b611361578d611364565b60005b898e611d97565b915091506112df8b8361244b565b600061138361102f565b6001600160a01b0316826001600160a01b031614156113a55750600019610825565b6113af8383612455565b9050610825565b60008060006113c361102f565b6001600160a01b031663b05f8e486113d9610948565b306040518363ffffffff1660e01b81526004016113f792919061452a565b60806040518083038186803b15801561140f57600080fd5b505afa158015611423573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144791906141a3565b505091509150611458818301612026565b9250505090565b6000610888612480565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061088861251d565b80610a1d816125d0565b60006114ae848484612649565b506001901b60001901811b1992909216911b1790565b60006114d483831115600161152f565b50900390565b60006114e7848484612649565b50501b90565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116821b90821b198416179392505050565b600081831061152857816108fc565b5090919050565b81610a1d57610a1d8161268f565b6109b9611c41565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106115b757fe5b6020026020010181815250506115f56115ce61251d565b7f0000000000000000000000000000000000000000000000000000000000000000906126b9565b817f00000000000000000000000000000000000000000000000000000000000000008151811061162157fe5b602002602001018181525050670de0b6b3a7640000817f00000000000000000000000000000000000000000000000000000000000000008151811061166257fe5b6020908102919091010152905090565b81518151611681908290611d8a565b60005b81811015611133576116bc84828151811061169b57fe5b60200260200101518483815181106116af57fe5b60200260200101516126b9565b8482815181106116c857fe5b6020908102919091010152600101611684565b60006108fc83836126b9565b60208301516000906001600160a01b03163014156117115761170a8484846126ef565b90506108fc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b0316141561175a5761170a84848461286e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b031614156117a35761170a8484846129ca565b6108fc61013561268f565b60006108fc8383612b21565b60408301516000906001600160a01b03163014156117dd5761170a848484612b69565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156118265761170a848484612cd8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156117a35761170a848484612e2f565b60006108fc838361203a565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906118d690859061439c565b60405180910390a3505050565b60006118ed611924565b42118061088857505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b61195f6001600160a01b038416151561019861152f565b6119766001600160a01b038316151561019961152f565b611981838383610943565b6001600160a01b0383166000908152602081905260409020546119a790826101a0612f86565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119d69082611b4d565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906118d690859061439c565b6000806000611a3561102f565b6001600160a01b031663b05f8e48611a4b610948565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611a8992919061452a565b60806040518083038186803b158015611aa157600080fd5b505afa158015611ab5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad991906141a3565b5050915091506000611b15828401611b107f0000000000000000000000000000000000000000000000000000000000000000612f9c565b6116db565b9050858110158015611b275750848111155b9695505050505050565b611b39611b5f565b611b41611c41565b611b4a81613076565b50565b60008282016108fc848210158361152f565b6000611b8e6000357fffffffff0000000000000000000000000000000000000000000000000000000016610f93565b9050611b4a611b9d82336130e4565b61019161152f565b8015611bc557611bc0611bb6611900565b421061019361152f565b611bda565b611bda611bd0611924565b42106101a961152f565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611c36908390614379565b60405180910390a150565b6109b9611c4c6118e3565b61019261152f565b6000611c5e610948565b90506000611c6a61102f565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b8152600401611c9792919061452a565b60806040518083038186803b158015611caf57600080fd5b505afa158015611cc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce791906141a3565b6040517f18e736d40000000000000000000000000000000000000000000000000000000081529094506001600160a01b03851693506318e736d49250610f25915085908790600401614511565b600854611d43908260ff6131cd565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611c36908390614379565b6001901b6000190191901c1690565b600390565b610a1d818314606761152f565b60006060611da661014e61268f565b9850989650505050505050565b81518151611dc2908290611d8a565b60005b8181101561113357611dfd848281518110611ddc57fe5b6020026020010151848381518110611df057fe5b6020026020010151612b21565b848281518110611e0957fe5b6020908102919091010152600101611dc5565b333014611f0b576000306001600160a01b0316600036604051611e409291906142e7565b6000604051808303816000865af19150503d8060008114611e7d576040519150601f19603f3d011682016040523d82523d6000602084013e611e82565b606091505b505090508060008114611e9157fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611eed573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b611f1361153d565b6060611f1d611545565b9050611f298782611672565b60006060611f418c8c8c8c8c8c898d8d63ffffffff16565b91509150611f5381848663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08301526020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b60085490565b60008160200151831015611ff25781516020830151600091611fde91869003906126b9565b9050611fea84826114c4565b915050610825565b81604001518311612004575081610825565b81516040830151600091611fde918603906126b9565b60006108fc8383611b4d565b60006108258261203461084f565b906114c4565b6000612049821515600461152f565b8261205657506000610825565b670de0b6b3a7640000838102906120799085838161207057fe5b0414600561152f565b82600182038161208557fe5b04600101915050610825565b6000808251118015610825575060ff8016828060200190518101906120b691906141e3565b60ff161492915050565b6109b96120cb61118e565b6101b661152f565b60006060600060606120fb876120f5896120eb610f5d565b81518110610c5757fe5b876131f4565b9150915060008161210a610f5d565b8151811061211457fe5b602090810291909101015290969095509350505050565b610a1d8282613220565b90565b81518151612147908290611d8a565b60005b818110156111335761218284828151811061216157fe5b602002602001015184838151811061217557fe5b602002602001015161203a565b84828151811061218e57fe5b602090810291909101015260010161214a565b6121b08183111561014c61152f565b6121cb6b0de0b6b39983494c589c000082111561014d61152f565b6121e3670de0b6b3a7640000825b061561016161152f565b6121f5670de0b6b3a7640000836121d9565b61222b61220f670de0b6b3a76400008304604060206114da565b612225670de0b6b3a764000085046020806114da565b176132ec565b826001600160a01b03167fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280838360405161226692919061458b565b60405180910390a2505050565b600061227d61102f565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156122b557600080fd5b505afa1580156122c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108889190613fc9565b1c60019081161490565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b600061234185613301565b905061235761235187838761331d565b8361152f565b612366428410156101b861152f565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606123a86001600160a01b038716301461015661152f565b6123bf6001600160a01b038616301461015661152f565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff817f00000000000000000000000000000000000000000000000000000000000000008151811061242d57fe5b6020908102919091010152909890975095505050505050565b600090565b610a1d82826133cc565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006124ed61345f565b306040516020016125029594939291906144e5565b60405160208183030381529060405280519060200120905090565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d15e00536125576109df565b6040518263ffffffff1660e01b8152600401612573919061432d565b60206040518083038186803b15801561258b57600080fd5b505afa15801561259f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c3919061416a565b633b9aca00900492915050565b6002815110156125df57611b4a565b6000816000815181106125ee57fe5b602002602001015190506000600190505b825181101561094357600083828151811061261657fe5b6020026020010151905061263f816001600160a01b0316846001600160a01b031610606561152f565b91506001016125ff565b6126586101008310606461152f565b61268060018210158015610665575061267660ff8461010003611519565b821115606461152f565b61094383821c156101b461152f565b611b4a817f42414c0000000000000000000000000000000000000000000000000000000000613463565b60008282026126dd8415806126d65750838583816126d357fe5b04145b600361152f565b670de0b6b3a764000090049392505050565b60006127757f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316148061276d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561152f565b6128668460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106127a957fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106127dd57fe5b6020026020010151612814877f000000000000000000000000000000000000000000000000000000000000000081518110610c5757fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b03161461285a576134de61285e565b61353e5b63ffffffff16565b949350505050565b60006128ca7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316148061276d575060408501516001600160a01b0316301461013561152f565b60408401516001600160a01b03163014612925576129208460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061291257fe5b6020026020010151846135a7565b612866565b6128668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061295957fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061298d57fe5b60200260200101516129c4877f000000000000000000000000000000000000000000000000000000000000000081518110610c5757fe5b866135d7565b6000612a267f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316148061276d575060408501516001600160a01b0316301461013561152f565b60408401516001600160a01b03163014612a7c576129208460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612a6e57fe5b60200260200101518461363d565b6128668460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612ab057fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612ae457fe5b6020026020010151612b1b877f000000000000000000000000000000000000000000000000000000000000000081518110610c5757fe5b8661367d565b6000612b30821515600461152f565b82612b3d57506000610825565b670de0b6b3a764000083810290612b579085838161207057fe5b828181612b6057fe5b04915050610825565b6000612bee7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b0316148061276d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561152f565b6128668460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612c2257fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612c5657fe5b6020026020010151612c8d877f000000000000000000000000000000000000000000000000000000000000000081518110610c5757fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b031614612cd3576136e461285e565b61373b565b6000612d347f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b0316148061276d575060208501516001600160a01b0316301461013561152f565b60208401516001600160a01b03163014612d8a576129208460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612d7c57fe5b6020026020010151846137a5565b6128668460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612dbe57fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612df257fe5b6020026020010151612e29877f000000000000000000000000000000000000000000000000000000000000000081518110610c5757fe5b866137cf565b6000612e8b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b0316148061276d575060208501516001600160a01b0316301461013561152f565b60208401516001600160a01b03163014612ee1576129208460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612ed357fe5b60200260200101518461381e565b6128668460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f1557fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f4957fe5b6020026020010151612f80877f000000000000000000000000000000000000000000000000000000000000000081518110610c5757fe5b86613853565b6000612f95848411158361152f565b5050900390565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612fff57507f0000000000000000000000000000000000000000000000000000000000000000610c90565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561304b576130446115ce61251d565b9050610c90565b6001600160a01b03821630141561306b5750670de0b6b3a7640000610c90565b610c9061013561268f565b61308b6130816138a7565b82101560cb61152f565b6130a06130966138b0565b82111560ca61152f565b6008546130b1908260c0603f6114a1565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611c3690839061439c565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b61310361100b565b6001600160a01b03161415801561311e575061311e836138bc565b156131465761312b61100b565b6001600160a01b0316336001600160a01b0316149050610825565b61314e612273565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161317d939291906143a5565b60206040518083038186803b15801561319557600080fd5b505afa1580156131a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113af9190613ec6565b60006001821b19841682846131e35760006131e6565b60015b60ff16901b17949350505050565b600060606000613203846138f8565b9050606061321287878461390e565b919791965090945050505050565b6132376001600160a01b038316151561019b61152f565b61324382600083610943565b6001600160a01b03821660009081526020819052604090205461326990826101b2612f86565b6001600160a01b03831660009081526020819052604090205561329c6132978261329161084f565b906139bd565b6139cb565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516132e0919061439c565b60405180910390a35050565b6008546132fb908260006114ed565b60085550565b600061330b612480565b82604051602001610fc89291906142f7565b600061332f82516041146101b961152f565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190613368908990859088908890614541565b6020604051602081039080840390855afa15801561338a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906133c05750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b6133d860008383610943565b6133ed613297826133e761084f565b90611b4d565b6001600160a01b0382166000908152602081905260409020546134109082611b4d565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906132e090859061439c565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000806134eb8684611fb9565b905060006134f9828761201a565b90506000613507868a6114c4565b905060006135228461203461351c85876139d0565b8a6139ea565b905061352e88826114c4565b9450505050505b95945050505050565b60008061354b8684611fb9565b90506000613559828761201a565b9050600061357061356a838b6139d0565b87613a1d565b9050600061357e84836114c4565b9050600061358c8288613a3d565b90506135988a826114c4565b9b9a5050505050505050505050565b6000806135b48484611fb9565b905060006135cb6135c58688611b4d565b85611fb9565b9050611b2781836114c4565b6000826135ef576135e88683611fb9565b9050613535565b60006135fb8684611fb9565b9050600061360c6135c5888a611b4d565b9050600061361a82846114c4565b90506000613628848961201a565b905061352e61363788846139d0565b82613a1d565b60008061364a8484611fb9565b9050600061365882876114c4565b905060006136668286613a3d565b905061367286826114c4565b979650505050505050565b60008261368b575084613535565b60006136978684611fb9565b905060006136a5828761201a565b905060006136b3878a611b4d565b905060006136c1848361201a565b905060006136d86136d289846139d0565b85613a1d565b905061359881896114c4565b6000826136f2575084613535565b60006136fe8684611fb9565b9050600061370c828761201a565b9050600061371a868a611b4d565b9050600061372f8461203461351c85876139d0565b905061352e81896114c4565b60008261374c576135e88683613a3d565b60006137588684611fb9565b90506000613766828761201a565b9050600061377d613777838b6139d0565b876139ea565b9050600061378b8483611b4d565b905060006137998288613a3d565b9050613598818b6114c4565b6000806137b28484611fb9565b905060006137c36135c586886114c4565b9050611b2782826114c4565b6000806137dc8684611fb9565b905060006137ed6135c5888a6114c4565b905060006137fb83836114c4565b90506000613809848961201a565b905061352e61381888846139d0565b826139ea565b60008061382b8484611fb9565b905060006138398287611b4d565b905060006138478286613a3d565b905061367281876114c4565b6000806138608684611fb9565b9050600061386e828761201a565b9050600061387c878a6114c4565b9050600061388a848361201a565b9050600061389b6136d289846139d0565b905061359888826114c4565b64e8d4a5100090565b67016345785d8a000090565b60006138e77f9f11080e00000000000000000000000000000000000000000000000000000000610f93565b821480610825575061082582613acd565b6000818060200190518101906108fc91906141ff565b6060600061391c8385612b21565b9050845167ffffffffffffffff8111801561393657600080fd5b50604051908082528060200260200182016040528015613960578160200160208202803683370190505b50915060005b85518110156139b4576139958287838151811061397f57fe5b60200260200101516126b990919063ffffffff16565b8382815181106139a157fe5b6020908102919091010152600101613966565b50509392505050565b60006108fc83836001612f86565b600255565b60008282026108fc8415806126d65750838583816126d357fe5b60006139f9821515600461152f565b82613a0657506000610825565b816001840381613a1257fe5b046001019050610825565b6000613a2c821515600461152f565b818381613a3557fe5b049392505050565b60008160200151831015613a865781516113af90613a6490670de0b6b3a764000090611b4d565b60208401518451613a8091613a7991906126b9565b8690611b4d565b90612b21565b81604001518311613a98575081610825565b81516113af90613ab190670de0b6b3a7640000906114c4565b60408401518451613a8091613ac691906126b9565b86906114c4565b6000613af87f38e9922e00000000000000000000000000000000000000000000000000000000610f93565b8214806108255750613b297f50dd6ed900000000000000000000000000000000000000000000000000000000610f93565b909114919050565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b8035610825816145fa565b600082601f830112613b97578081fd5b8135613baa613ba5826145ce565b6145a7565b818152915060208083019084810181840286018201871015613bcb57600080fd5b60005b84811015613bea57813584529282019290820190600101613bce565b505050505092915050565b600082601f830112613c05578081fd5b8151613c13613ba5826145ce565b818152915060208083019084810181840286018201871015613c3457600080fd5b60005b84811015613bea57815184529282019290820190600101613c37565b600082601f830112613c63578081fd5b813567ffffffffffffffff811115613c79578182fd5b613c8c6020601f19601f840116016145a7565b9150808252836020828501011115613ca357600080fd5b8060208401602084013760009082016020015292915050565b80356002811061082557600080fd5b600060208284031215613cdc578081fd5b81356108fc816145fa565b60008060408385031215613cf9578081fd5b8235613d04816145fa565b91506020830135613d14816145fa565b809150509250929050565b600080600060608486031215613d33578081fd5b8335613d3e816145fa565b92506020840135613d4e816145fa565b929592945050506040919091013590565b600080600080600080600060e0888a031215613d79578283fd5b8735613d84816145fa565b96506020880135613d94816145fa565b955060408801359450606088013593506080880135613db28161460f565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613de1578182fd5b8235613dec816145fa565b946020939093013593505050565b600080600060608486031215613e0e578081fd5b835167ffffffffffffffff80821115613e25578283fd5b818601915086601f830112613e38578283fd5b8151613e46613ba5826145ce565b80828252602080830192508086018b828387028901011115613e66578788fd5b8796505b84871015613e91578051613e7d816145fa565b845260019690960195928101928101613e6a565b508901519097509350505080821115613ea8578283fd5b50613eb586828701613bf5565b925050604084015190509250925092565b600060208284031215613ed7578081fd5b815180151581146108fc578182fd5b600080600080600080600060e0888a031215613f00578081fd5b873596506020880135613f12816145fa565b95506040880135613f22816145fa565b9450606088013567ffffffffffffffff80821115613f3e578283fd5b613f4a8b838c01613b87565b955060808a0135945060a08a0135935060c08a0135915080821115613f6d578283fd5b50613f7a8a828b01613c53565b91505092959891949750929550565b600060208284031215613f9a578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108fc578182fd5b600060208284031215613fda578081fd5b81516108fc816145fa565b60008060408385031215613ff7578182fd5b8235614002816145fa565b9150602083013567ffffffffffffffff81111561401d578182fd5b61402985828601613c53565b9150509250929050565b60008060008060808587031215614048578182fd5b843567ffffffffffffffff8082111561405f578384fd5b818701915061012080838a031215614075578485fd5b61407e816145a7565b905061408a8984613cbc565b81526140998960208501613b7c565b60208201526140ab8960408501613b7c565b6040820152606083013560608201526080830135608082015260a083013560a08201526140db8960c08501613b7c565b60c08201526140ed8960e08501613b7c565b60e08201526101008084013583811115614105578687fd5b6141118b828701613c53565b82840152505080965050602087013591508082111561412e578384fd5b5061413b87828801613b87565b949794965050505060408301359260600135919050565b600060208284031215614163578081fd5b5035919050565b60006020828403121561417b578081fd5b5051919050565b60008060408385031215614194578182fd5b50508035926020909101359150565b600080600080608085870312156141b8578182fd5b84519350602085015192506040850151915060608501516141d8816145fa565b939692955090935050565b6000602082840312156141f4578081fd5b81516108fc8161460f565b60008060408385031215614211578182fd5b825161421c8161460f565b6020939093015192949293505050565b6000815180845260208085019450808401835b8381101561425b5781518752958201959082019060010161423f565b509495945050505050565b15159052565b60008151808452815b8181101561429157602081850181015186830182015201614275565b818111156142a25782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6000602082526108fc602083018461422c565b600060408252614367604083018561422c565b8281036020840152613535818561422c565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156144355761441f84516145ee565b825292840192600192909201919084019061440d565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a0870152614473818561422c565b935050506040850151818584030160c0860152614490838261426c565b9250505060608401516144a660e0850182614266565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b600083825260406020830152612866604083018461426c565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526108fc602083018461426c565b600083825260406020830152612866604083018461422c565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156145c657600080fd5b604052919050565b600067ffffffffffffffff8211156145e4578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114611b4a57600080fd5b60ff81168114611b4a57600080fdfea2646970667358221220d8afe5acfdfe992cfb3410e7c05bf745ade8933c23a2c846ba802167a8445e0b64736f6c63430007010033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000db5760003560e01c80635ed31282116200008d578063851c1bb31162000063578063851c1bb314620001a25780638d928af814620001c8578063aaabadc514620001d257620000db565b80635ed3128214620001685780636634b75314620001725780636c57f5a9146200019857620000db565b80632ccb254a11620000c35780632ccb254a146200011c5780632da47c4014620001425780632f2770db146200015c57620000db565b8062c194db14620000e0578063174481fa1462000102575b600080fd5b620000ea620001dc565b604051620000f9919062001172565b60405180910390f35b6200010c620001fd565b604051620000f99291906200110b565b620001336200012d36600462000f20565b62000243565b604051620000f99190620010ea565b6200014c6200051a565b604051620000f992919062001348565b6200016662000586565b005b62000133620005ef565b620001896200018336600462000e7e565b6200060b565b604051620000f9919062001132565b6200018962000636565b620001b9620001b336600462000ebf565b6200063f565b604051620000f991906200113d565b6200013362000693565b62000133620006b7565b6060620001f860405180602001604052806000815250620007a5565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b60006200024f62000880565b60038054600181019091556040516060906200026e6020820162000d26565b601f1982820381018352601f909101166040526200028b62000693565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001620002bf9291906200110b565b60408051601f1981840301815290829052620002df9291602001620010b7565b604051602081830303815290604052905060006200030583838051906020012062000899565b9050600080620003146200051a565b915091506200032262000d34565b6040518061016001604052806200033862000693565b73ffffffffffffffffffffffffffffffffffffffff1681526020018f81526020018e81526020018d73ffffffffffffffffffffffffffffffffffffffff1681526020018c73ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018b81526020018a81526020018481526020018381526020018973ffffffffffffffffffffffffffffffffffffffff1681525090506000620004158260405160200162000400919062001263565b604051602081830303815290604052620008af565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200046057600080fd5b505af115801562000475573d6000803e3d6000fd5b505050506000620004896000898962000904565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614620004fc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004f390620011f5565b60405180910390fd5b5096505050505050506200050f620009e2565b979650505050505050565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200057857807f000000000000000000000000000000000000000000000000000000000000000003925062278d00915062000581565b60009250600091505b509091565b62000590620009e9565b6200059a62000a38565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60045473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b60015460ff1690565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016200067692919062001087565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000620006c362000693565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200070957600080fd5b505afa1580156200071e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f8919062000f01565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506200079f73ffffffffffffffffffffffffffffffffffffffff831615156101ac62000a51565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016200087281838662000a66565b505050505050505050919050565b6200089360028054141561019062000a51565b60028055565b6000620008a883833062000ac4565b9392505050565b600080620008bd8362000b05565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790559392505050565b6000808447101562000944576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004f39062001187565b82516200097f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004f3906200122c565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff8116620009da576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004f390620011be565b949350505050565b6001600255565b600062000a1a6000357fffffffff00000000000000000000000000000000000000000000000000000000166200063f565b905062000a3562000a2c823362000b9d565b61019162000a51565b50565b62000a4f62000a4662000636565b1560d362000a51565b565b8162000a625762000a628162000c3b565b5050565b5b6020811062000a88578151835260209283019290910190601f190162000a67565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b60008060ff60f81b83868660405160200162000ae4949392919062001023565b60408051808303601f19018152919052805160209091012095945050505050565b600062000b1162000a38565b600062000b1e8362000c67565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b600062000ba9620006b7565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000be79392919062001146565b60206040518083038186803b15801562000c0057600080fd5b505afa15801562000c15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008a8919062000e9d565b62000a35817f42414c000000000000000000000000000000000000000000000000000000000062000cab565b6000606062000c7683620007a5565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff8116620008a8573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611e4580620013ad83390190565b604051806101600160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b600082601f83011262000e0d578081fd5b813567ffffffffffffffff8082111562000e25578283fd5b6040516020601f19601f850116820101818110838211171562000e46578485fd5b60405282815292508284830160200186101562000e6257600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121562000e90578081fd5b8135620008a88162001389565b60006020828403121562000eaf578081fd5b81518015158114620008a8578182fd5b60006020828403121562000ed1578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114620008a8578182fd5b60006020828403121562000f13578081fd5b8151620008a88162001389565b600080600080600080600060e0888a03121562000f3b578283fd5b873567ffffffffffffffff8082111562000f53578485fd5b62000f618b838c0162000dfc565b985060208a013591508082111562000f77578485fd5b5062000f868a828b0162000dfc565b965050604088013562000f998162001389565b9450606088013562000fab8162001389565b93506080880135925060a0880135915060c088013562000fcb8162001389565b8091505092959891949750929550565b73ffffffffffffffffffffffffffffffffffffffff169052565b600081518084526200100f81602086016020860162001356565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60008351620010cb81846020880162001356565b835190830190620010e181836020880162001356565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b600060208252620008a8602083018462000ff5565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b6000602082526200127960208301845162000fdb565b60208301516101608060408501526200129761018085018362000ff5565b91506040850151601f19858403016060860152620012b6838262000ff5565b9250506060850151620012cd608086018262000fdb565b506080850151620012e260a086018262000fdb565b5060a0850151620012f760c086018262000fdb565b5060c085015160e0858101919091528501516101008086019190915285015161012080860191909152850151610140808601919091528501516200133e8286018262000fdb565b5090949350505050565b918252602082015260400190565b60005b838110156200137357818101518382015260200162001359565b8381111562001383576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000a3557600080fdfe6101606040523480156200001257600080fd5b5060405162001e4538038062001e45833981016040819052620000359162000462565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000378565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200012591908101906200039e565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000449565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000449565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000378565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000378565b6001600160601b0319606091821b811660e05292811b8316610120521b166101405250620004e0915050565b6000602082840312156200038a578081fd5b81516200039781620004c7565b9392505050565b60006020808385031215620003b1578182fd5b82516001600160401b0380821115620003c8578384fd5b818501915085601f830112620003dc578384fd5b815181811115620003eb578485fd5b8381029150620003fd848301620004a0565b8181528481019084860184860187018a101562000418578788fd5b8795505b838610156200043c5780518352600195909501949186019186016200041c565b5098975050505050505050565b6000602082840312156200045b578081fd5b5051919050565b6000806040838503121562000475578081fd5b82516200048281620004c7565b60208401519092506200049581620004c7565b809150509250929050565b6040518181016001600160401b0381118282101715620004bf57600080fd5b604052919050565b6001600160a01b0381168114620004dd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c611882620005c36000398061050b52806108235250806101355280610c145280610f5f52806110195250806103c152508061046e528061059b528061074a52806108ee5280610cbf52806110ad52806111a5528061125f52508060ea5280610192528061043252806105ce528061063352806106d4528061078652806108b352806111785250806101715280610404528061071c5280610a7d5280610b5c5280610dbb5280610e9a5250806099528061030b52506118826000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b919061159f565b60405180910390f35b610077610072366004611456565b6100bb565b60405161005b91906117eb565b610077610092366004611479565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610124565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308561025b565b61011b83610124565b90505b92915050565b60008061012f610304565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101ce929190611704565b60806040518083038186803b1580156101e657600080fd5b505afa1580156101fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021e91906114ff565b50505090508181101561024057610237818303856103ed565b925050506100c9565b818111156102545761023782820385610705565b5050919050565b6102fe846323b872dd60e01b85858560405160240161027c939291906115c0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610913565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a691906114dc565b9150915060006002828401816103b857fe5b0490506103e5817f00000000000000000000000000000000000000000000000000000000000000006109c0565b935050505090565b60006103f76113a3565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104cb611406565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105429086908690600401611728565b602060405180830381600087803b15801561055c57600080fd5b505af1158015610570573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059491906114c4565b90506105c07f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c981610c82565b6105f37f000000000000000000000000000000000000000000000000000000000000000087610d4f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a082319061066890309060040161159f565b60206040518083038186803b15801561068057600080fd5b505afa158015610694573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b891906114c4565b90506106fb73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016878361104e565b9695505050505050565b600061070f6113a3565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e3611406565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061085a9086908690600401611728565b602060405180830381600087803b15801561087457600080fd5b505af1158015610888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ac91906114c4565b90506108d87f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e96108e48261106d565b61113b565b6105f37f000000000000000000000000000000000000000000000000000000000000000082610d4f565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093c9190611583565b6000604051808303816000865af19150503d8060008114610979576040519150601f19603f3d011682016040523d82523d6000602084013e61097e565b606091505b50915091506000821415610996573d6000803e3d6000fd5b6102fe8151600014806109b85750818060200190518101906109b891906114a4565b6101a26112f2565b60006109cf82151560046112f2565b826109dc5750600061011e565b670de0b6b3a7640000838102906109ff908583816109f657fe5b041460056112f2565b828181610a0857fe5b0491505061011e565b6040805160028082526060828101909352816020015b610a2f61142d565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b908490600401611680565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517fead5d35900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ead5d35990610cf99030908590600190600401611617565b6040805180830381600087803b158015610d1257600080fd5b505af1158015610d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4a91906114dc565b505050565b6040805160028082526060828101909352816020015b610d6d61142d565b815260200190600190039081610d65579050509050600281600081518110610d9157fe5b6020026020010151600001906002811115610da857fe5b90816002811115610db557fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de757fe5b602002602001015160200181815250508181600081518110610e0557fe5b602002602001015160600181815250508281600081518110610e2357fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e7057fe5b6020026020010151600001906002811115610e8757fe5b90816002811115610e9457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec657fe5b602002602001015160200181815250508181600181518110610ee457fe5b602002602001015160600181815250508281600181518110610f0257fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517f095ea7b30000000000000000000000000000000000000000000000000000000081529084169063095ea7b390610f89907f00000000000000000000000000000000000000000000000000000000000000009086906004016115f1565b602060405180830381600087803b158015610fa357600080fd5b505af1158015610fb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdb91906114a4565b506040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b908490600401611680565b610d4a8363a9059cbb60e01b848460405160240161027c9291906115f1565b6040517ff57d0b4000000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f57d0b40906110e29085906004016117eb565b60206040518083038186803b1580156110fa57600080fd5b505afa15801561110e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113291906114c4565b60010192915050565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906111cf907f00000000000000000000000000000000000000000000000000000000000000009085906004016115f1565b602060405180830381600087803b1580156111e957600080fd5b505af11580156111fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122191906114a4565b506040517f2f2cab8700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632f2cab879061129c9030908590600090600190600401611647565b602060405180830381600087803b1580156112b657600080fd5b505af11580156112ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ee91906114c4565b5050565b816112ee576112ee81611325817f42414c0000000000000000000000000000000000000000000000000000000000611328565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b600060208284031215611467578081fd5b81356114728161182a565b9392505050565b6000806040838503121561148b578081fd5b82356114968161182a565b946020939093013593505050565b6000602082840312156114b5578081fd5b81518015158114611472578182fd5b6000602082840312156114d5578081fd5b5051919050565b600080604083850312156114ee578182fd5b505080516020909101519092909150565b60008060008060808587031215611514578182fd5b84519350602085015192506040850151915060608501516115348161182a565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b600082516115958184602087016117f4565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff93909316835260208301919091521515604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff949094168452602084019290925261ffff1660408301521515606082015260800190565b602080825282518282018190526000919060409081850190868401855b828110156116f75781518051600381106116b357fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff1686860152606090810151908501526080909301929085019060010161169d565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a0830152602084015161174381611820565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c06101408401528051806101608501526101806117af82828701602086016117f4565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401168601019350505050611472602083018461153f565b90815260200190565b60005b8381101561180f5781810151838201526020016117f7565b838111156102fe5750506000910152565b6002811061132557fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461132557600080fdfea264697066735822122005e052f73c844913f8ecf9c352aca4b24ac8c3ab79ae78423eca3617ccb9fe9c64736f6c63430007010033a2646970667358221220dbe28387b1fae9d5aecaea6e06cf45380b6d8d21e8cf95839657740d4001a28a64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/index.ts b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/index.ts new file mode 100644 index 0000000..62a2a7a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { AaveLinearPoolDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as AaveLinearPoolDeployment; + const args = [input.Vault, input.BalancerQueries]; + + await task.deployAndVerify('AaveLinearPoolFactory', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/input.ts b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/input.ts new file mode 100644 index 0000000..ebd69f5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/input.ts @@ -0,0 +1,14 @@ +import { Task, TaskMode } from '@src'; + +export type AaveLinearPoolDeployment = { + Vault: string; + BalancerQueries: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerQueries = new Task('20220721-balancer-queries', TaskMode.READ_ONLY); + +export default { + Vault, + BalancerQueries, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/output/arbitrum.json new file mode 100644 index 0000000..c41098a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "AaveLinearPoolFactory": "0xe2E901AB09f37884BA31622dF3Ca7FC19AA443Be" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/output/bsc.json b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/output/bsc.json new file mode 100644 index 0000000..482ef2c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/output/bsc.json @@ -0,0 +1,3 @@ +{ + "AaveLinearPoolFactory": "0x2E96068b3D5B5BAE3D7515da4A1D2E52d08A2647" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/output/goerli.json new file mode 100644 index 0000000..66c6a9b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/output/goerli.json @@ -0,0 +1,3 @@ +{ + "AaveLinearPoolFactory": "0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/output/mainnet.json new file mode 100644 index 0000000..6cc2ea9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "AaveLinearPoolFactory": "0x6A0AC04f5C2A10297D5FA79FA6358837a8770041" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/output/optimism.json b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/output/optimism.json new file mode 100644 index 0000000..626e4ad --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/output/optimism.json @@ -0,0 +1,3 @@ +{ + "AaveLinearPoolFactory": "0x994086630773dC6cB54D3A5E0Ef0963532789E75" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/output/polygon.json new file mode 100644 index 0000000..05310b4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/output/polygon.json @@ -0,0 +1,3 @@ +{ + "AaveLinearPoolFactory": "0x8df6EfEc5547e31B0eb7d1291B511FF8a2bf987c" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/readme.md b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/readme.md new file mode 100644 index 0000000..2b923f2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/readme.md @@ -0,0 +1,17 @@ +# 2022-08-17 - Aave Rebalanced Linear Pool + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This relayer was deprecated in favor of an [updated version (also now deprecated)](../20221207-aave-rebalanced-linear-pool-v3), which improves the Rebalancer contract to handle more tokens and fixes a potential issue where a malicious contract being called while fetching the wrapped token rate could extract value from the pool. + +Deployment of the `AaveLinearPoolFactory`, for Linear Pools with a wrapped aToken. This new deployment includes a permissionless rebalancing contract that has Asset Manager privileges. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet address](./output/arbitrum.json) +- [Optimism mainnet address](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`AaveLinearPoolFactory` artifact](./artifact/AaveLinearPoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/test/test.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/test/test.fork.ts new file mode 100644 index 0000000..51ed3a4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220817-aave-rebalanced-linear-pool/test/test.fork.ts @@ -0,0 +1,265 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import * as expectEvent from '@helpers/expectEvent'; +import { bn, fp, FP_ONE } from '@helpers/numbers'; +import { MAX_UINT256 } from '@helpers/constants'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { SwapKind } from '@helpers/models/types/types'; +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode, getSigners } from '@src'; + +describeForkTest('AaveLinearPoolFactory', 'mainnet', 15225000, function () { + let owner: SignerWithAddress, holder: SignerWithAddress, other: SignerWithAddress; + let factory: Contract, vault: Contract, usdc: Contract; + let rebalancer: Contract; + + let task: Task; + + const USDC = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'; + const waUSDC = '0xd093fA4Fb80D09bB30817FDcd442d4d02eD3E5de'; + + const USDC_SCALING = bn(1e12); // USDC has 6 decimals, so its scaling factor is 1e12 + + const USDC_HOLDER = '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503'; + + const SWAP_FEE_PERCENTAGE = fp(0.01); // 1% + + // The targets are set using 18 decimals, even if the token has fewer (as is the case for USDC); + const INITIAL_UPPER_TARGET = fp(1e7); + + // The initial midpoint (upper target / 2) must be between the final lower and upper targets + const FINAL_LOWER_TARGET = fp(0.2e7); + const FINAL_UPPER_TARGET = fp(5e7); + + let pool: Contract; + let poolId: string; + + before('run task', async () => { + task = new Task('20220817-aave-rebalanced-linear-pool', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('AaveLinearPoolFactory'); + }); + + before('load signers', async () => { + [, owner, other] = await getSigners(); + + holder = await impersonate(USDC_HOLDER); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + + usdc = await task.instanceAt('IERC20', USDC); + await usdc.connect(holder).approve(vault.address, MAX_UINT256); + }); + + enum LinearPoolState { + BALANCED, + MAIN_EXCESS, + MAIN_LACK, + } + + function itRebalancesThePool(expectedState: LinearPoolState) { + it('rebalance the pool', async () => { + const { lowerTarget, upperTarget } = await pool.getTargets(); + + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + + let fees; + if (scaledCash.gt(upperTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_EXCESS); + + const excess = scaledCash.sub(upperTarget); + fees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else if (scaledCash.lt(lowerTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_LACK); + + const lack = lowerTarget.sub(scaledCash); + fees = lack.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else { + expect(expectedState).to.equal(LinearPoolState.BALANCED); + + fees = 0; + } + + const initialRecipientMainBalance = await usdc.balanceOf(other.address); + if (expectedState != LinearPoolState.BALANCED) { + await rebalancer.connect(holder).rebalance(other.address); + } else { + await rebalancer.connect(holder).rebalanceWithExtraMain(other.address, 5); + } + const finalRecipientMainBalance = await usdc.balanceOf(other.address); + + if (fees > 0) { + // The recipient of the rebalance call should get the fees that were collected (though there's some rounding + // error in the main-wrapped conversion). + expect(finalRecipientMainBalance.sub(initialRecipientMainBalance)).to.be.almostEqual( + fees.div(USDC_SCALING), + 0.00000001 + ); + } else { + // The recipient of the rebalance call will get any extra main tokens that were not utilized. + expect(finalRecipientMainBalance).to.be.almostEqual(initialRecipientMainBalance, 0.00000001); + } + + const mainInfo = await vault.getPoolTokenInfo(poolId, USDC); + + const expectedMainBalance = lowerTarget.add(upperTarget).div(2); + expect(mainInfo.cash.mul(USDC_SCALING)).to.equal(expectedMainBalance); + expect(mainInfo.managed).to.equal(0); + }); + } + + describe('create, join, and rebalance', () => { + it('deploy a linear pool', async () => { + const tx = await factory.create('', '', USDC, waUSDC, INITIAL_UPPER_TARGET, SWAP_FEE_PERCENTAGE, owner.address); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await task.instanceAt('AaveLinearPool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + const { assetManager } = await vault.getPoolTokenInfo(poolId, USDC); // We could query for either USDC or waUSDC + rebalancer = await task.instanceAt('AaveLinearPoolRebalancer', assetManager); + + await usdc.connect(holder).approve(rebalancer.address, MAX_UINT256); // To send extra main on rebalance + }); + + it('join the pool', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const joinAmount = INITIAL_UPPER_TARGET.mul(2).div(USDC_SCALING); + + await vault + .connect(holder) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: USDC, assetOut: pool.address, amount: joinAmount, userData: '0x' }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert join amount - some fees will be collected as we're going over the upper target. + const excess = joinAmount.mul(USDC_SCALING).sub(INITIAL_UPPER_TARGET); + const joinCollectedFees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + + const expectedBPT = joinAmount.mul(USDC_SCALING).sub(joinCollectedFees); + expect(await pool.balanceOf(holder.address)).to.equal(expectedBPT); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + + it('set final targets', async () => { + await pool.connect(owner).setTargets(FINAL_LOWER_TARGET, FINAL_UPPER_TARGET); + }); + }); + + describe('generate excess of main token and rebalance', () => { + it('deposit main tokens', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const { upperTarget } = await pool.getTargets(); + const joinAmount = upperTarget.mul(5).div(USDC_SCALING); + + await vault + .connect(holder) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: USDC, assetOut: pool.address, amount: joinAmount, userData: '0x' }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + }); + + describe('generate lack of main token and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to withdraw enough man token to bring the Pool below its lower target, which will let us later + // rebalance. + + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_LACK); + }); + + describe('join below upper target and rebalance', () => { + it('deposit main tokens', async () => { + // We're going to join with few tokens, causing the Pool to not reach its upper target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const joinAmount = midpoint.div(100).div(USDC_SCALING); + + await vault + .connect(holder) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: USDC, assetOut: pool.address, amount: joinAmount, userData: '0x' }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('exit above lower target and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to exit with few tokens, causing for the Pool to not reach its lower target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const exitAmount = midpoint.div(100).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalance repeatedly', () => { + itRebalancesThePool(LinearPoolState.BALANCED); + itRebalancesThePool(LinearPoolState.BALANCED); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/artifact/ComposableStablePool.json b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/artifact/ComposableStablePool.json new file mode 100644 index 0000000..ee40770 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/artifact/ComposableStablePool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"components": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "contract IProtocolFeePercentagesProvider", "name": "protocolFeeProvider", "type": "address"}, {"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20[]", "name": "tokens", "type": "address[]"}, {"internalType": "contract IRateProvider[]", "name": "rateProviders", "type": "address[]"}, {"internalType": "uint256[]", "name": "tokenRateCacheDurations", "type": "uint256[]"}, {"internalType": "bool[]", "name": "exemptFromYieldProtocolFeeFlags", "type": "bool[]"}, {"internalType": "uint256", "name": "amplificationParameter", "type": "uint256"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "address", "name": "owner", "type": "address"}], "internalType": "struct ComposableStablePool.NewPoolParams", "name": "params", "type": "tuple"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "startValue", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "endValue", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "startTime", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "endTime", "type": "uint256"}], "name": "AmpUpdateStarted", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "currentValue", "type": "uint256"}], "name": "AmpUpdateStopped", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "feeType", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "protocolFeePercentage", "type": "uint256"}], "name": "ProtocolFeePercentageCacheUpdated", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "enabled", "type": "bool"}], "name": "RecoveryModeStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "tokenIndex", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "rate", "type": "uint256"}], "name": "TokenRateCacheUpdated", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "tokenIndex", "type": "uint256"}, {"indexed": true, "internalType": "contract IRateProvider", "name": "provider", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "cacheDuration", "type": "uint256"}], "name": "TokenRateProviderSet", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DELEGATE_PROTOCOL_SWAP_FEES_SENTINEL", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "disableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "enableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getActualSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAmplificationParameter", "outputs": [{"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "bool", "name": "isUpdating", "type": "bool"}, {"internalType": "uint256", "name": "precision", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getBptIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getDomainSeparator", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getLastJoinExitData", "outputs": [{"internalType": "uint256", "name": "lastJoinExitAmplification", "type": "uint256"}, {"internalType": "uint256", "name": "lastPostJoinExitInvariant", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMinimumBpt", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "pure", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "getNextNonce", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "feeType", "type": "uint256"}], "name": "getProtocolFeePercentageCache", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getProtocolFeesCollector", "outputs": [{"internalType": "contract IProtocolFeesCollector", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getProtocolSwapFeeDelegation", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRateProviders", "outputs": [{"internalType": "contract IRateProvider[]", "name": "", "type": "address[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getScalingFactors", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "getTokenRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "getTokenRateCache", "outputs": [{"internalType": "uint256", "name": "rate", "type": "uint256"}, {"internalType": "uint256", "name": "oldRate", "type": "uint256"}, {"internalType": "uint256", "name": "duration", "type": "uint256"}, {"internalType": "uint256", "name": "expires", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "inRecoveryMode", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "isTokenExemptFromYieldProtocolFee", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "swapRequest", "type": "tuple"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "indexIn", "type": "uint256"}, {"internalType": "uint256", "name": "indexOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "bytes", "name": "poolConfig", "type": "bytes"}], "name": "setAssetManagerPoolConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "uint256", "name": "duration", "type": "uint256"}], "name": "setTokenRateCacheDuration", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "rawEndValue", "type": "uint256"}, {"internalType": "uint256", "name": "endTime", "type": "uint256"}], "name": "startAmplificationParameterUpdate", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "stopAmplificationParameterUpdate", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "updateProtocolFeePercentageCache", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "updateTokenRateCache", "outputs": [], "stateMutability": "nonpayable", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/artifact/ComposableStablePoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/artifact/ComposableStablePoolFactory.json new file mode 100644 index 0000000..64d5f5c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/artifact/ComposableStablePoolFactory.json @@ -0,0 +1,238 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ComposableStablePoolFactory", + "sourceName": "contracts/ComposableStablePoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "amplificationParameter", + "type": "uint256" + }, + { + "internalType": "contract IRateProvider[]", + "name": "rateProviders", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenRateCacheDurations", + "type": "uint256[]" + }, + { + "internalType": "bool[]", + "name": "exemptFromYieldProtocolFeeFlags", + "type": "bool[]" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract ComposableStablePool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101606040523480156200001257600080fd5b50604051620091c3380380620091c3833981016040819052620000359162000217565b8160405180602001620000489062000209565b601f1982820381018352601f90910116604052805182903090839060006002820460a081905280830360e08190528185529091508362000094816200012a602090811b620004fc17901c565b60601b6001600160601b0319166080528285018051838252620000c3826200012a602090811b620004fc17901c565b606090811b6001600160601b031990811660c0529690935290526101009586529590951b9091166101205250506276a70042016101405260018054610100600160a81b0319166001600160a01b039690961690910294909417909355506200026b92505050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001786001600160a01b03831615156101ac6200017e565b50919050565b816200018f576200018f8162000193565b5050565b620001a5816210905360ea1b620001a8565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b617de380620013e083390190565b600080604083850312156200022a578182fd5b8251620002378162000255565b60208401519092506200024a8162000255565b809150509250929050565b6001600160a01b0381168114620001a557600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c61014051611109620002d7600039806101f952806102225250806104535250806104035250806105635250806101d052806105df5250806105845250806101af52806105bb52506111096000f3fe608060405234801561001057600080fd5b50600436106100bd5760003560e01c806366b59f6c11610076578063851c1bb31161005b578063851c1bb31461015e5780638d928af81461017e578063aaabadc514610186576100bd565b806366b59f6c146101365780636c57f5a914610156576100bd565b80632da47c40116100a75780632da47c40146100f65780632f2770db1461010c5780636634b75314610116576100bd565b8062c194db146100c2578063174481fa146100e0575b600080fd5b6100ca61018e565b6040516100d79190610ed0565b60405180910390f35b6100e86101ad565b6040516100d7929190610e69565b6100fe6101f3565b6040516100d792919061104e565b61011461025d565b005b610129610124366004610b5d565b6102c2565b6040516100d79190610e90565b610149610144366004610bf1565b6102ed565b6040516100d79190610ee3565b6101296103f6565b61017161016c366004610b95565b6103ff565b6040516100d79190610e9b565b610149610451565b610149610475565b60606101a86040518060200160405280600081525061055b565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561024f57807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610258565b60009250600091505b509091565b610265610634565b61026d61067d565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b60008060006102fa6101f3565b915091506103e6604051806101a00160405280610315610451565b73ffffffffffffffffffffffffffffffffffffffff16815260200160018054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018e81526020018d81526020018c81526020018a81526020018981526020018881526020018b81526020018781526020018481526020018381526020018673ffffffffffffffffffffffffffffffffffffffff168152506040516020016103d29190610f04565b604051602081830303815290604052610692565b9c9b505050505050505050505050565b60015460ff1690565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610434929190610e39565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061047f610451565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156104c457600080fd5b505afa1580156104d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101a89190610bd5565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061055573ffffffffffffffffffffffffffffffffffffffff831615156101ac610726565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c5060208981019089850101610626818386610738565b505050505050505050919050565b60006106636000357fffffffff00000000000000000000000000000000000000000000000000000000166103ff565b905061067a61067282336107b2565b610191610726565b50565b6106906106886103f6565b1560d3610726565b565b600061069c61067d565b60006106a783610851565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b816107345761073481610899565b5050565b5b602081106107765781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001610739565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b60006107bc610475565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b81526004016107f893929190610ea4565b60206040518083038186803b15801561081057600080fd5b505afa158015610824573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108489190610b79565b90505b92915050565b6000606061085e8361055b565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff8116610892573d6000803e3d6000fd5b9392505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b60445261067a917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b803561084b816110a3565b600082601f830112610943578081fd5b813561095661095182611083565b61105c565b81815291506020808301908481018184028601820187101561097757600080fd5b60005b8481101561099f57813561098d816110c5565b8452928201929082019060010161097a565b505050505092915050565b600082601f8301126109ba578081fd5b81356109c861095182611083565b8181529150602080830190848101818402860182018710156109e957600080fd5b60005b8481101561099f5781356109ff816110a3565b845292820192908201906001016109ec565b600082601f830112610a21578081fd5b8135610a2f61095182611083565b818152915060208083019084810181840286018201871015610a5057600080fd5b60005b8481101561099f578135610a66816110a3565b84529282019290820190600101610a53565b600082601f830112610a88578081fd5b8135610a9661095182611083565b818152915060208083019084810181840286018201871015610ab757600080fd5b60005b8481101561099f57813584529282019290820190600101610aba565b600082601f830112610ae6578081fd5b813567ffffffffffffffff811115610afc578182fd5b610b2d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161105c565b9150808252836020828501011115610b4457600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215610b6e578081fd5b8135610892816110a3565b600060208284031215610b8a578081fd5b8151610892816110c5565b600060208284031215610ba6578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610892578182fd5b600060208284031215610be6578081fd5b8151610892816110a3565b60008060008060008060008060006101208a8c031215610c0f578485fd5b893567ffffffffffffffff80821115610c26578687fd5b610c328d838e01610ad6565b9a5060208c0135915080821115610c47578687fd5b610c538d838e01610ad6565b995060408c0135915080821115610c68578687fd5b610c748d838e016109aa565b985060608c0135975060808c0135915080821115610c90578687fd5b610c9c8d838e01610a11565b965060a08c0135915080821115610cb1578586fd5b610cbd8d838e01610a78565b955060c08c0135915080821115610cd2578485fd5b50610cdf8c828d01610933565b93505060e08a01359150610cf78b6101008c01610928565b90509295985092959850929598565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208085019450808401835b83811015610d51578151151587529582019590820190600101610d33565b509495945050505050565b6000815180845260208085019450808401835b83811015610d5157815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101610d6f565b6000815180845260208085019450808401835b83811015610d5157815187529582019590820190600101610db4565b60008151808452815b81811015610df557602081850181015186830182015201610dd9565b81811115610e065782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b6000602082526108486020830184610dd0565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600060208252610f18602083018451610d06565b6020830151610f2a6040840182610d06565b5060408301516101a0806060850152610f476101c0850183610dd0565b915060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080868503016080870152610f838483610dd0565b935060808701519150808685030160a0870152610fa08483610d5c565b935060a08701519150808685030160c0870152610fbd8483610d5c565b935060c08701519150808685030160e0870152610fda8483610da1565b935060e08701519150610100818786030181880152610ff98584610d20565b90880151610120888101919091528801516101408089019190915288015161016080890191909152880151610180808901919091528801519094509150611044905082860182610d06565b5090949350505050565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561107b57600080fd5b604052919050565b600067ffffffffffffffff821115611099578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff8116811461067a57600080fd5b801515811461067a57600080fdfea2646970667358221220cf4938a5f02093a10c020552684e4823d287dae5816d66627b84ee93e485cd3864736f6c634300070100336105006040523480156200001257600080fd5b5060405162007de338038062007de3833981016040819052620000359162001b39565b6020810151600019620000488362000d77565b620000538462000db0565b8461010001518560000151600087604001518860600151620000808a608001513062000df960201b60201c565b8a60800151516001016001600160401b03811180156200009f57600080fd5b50604051908082528060200260200182016040528015620000ca578160200160208202803683370190505b508b61012001518c61014001518d61016001518e6101800151828289898d85336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b815250878781600390805190602001906200012c929190620017d6565b50805162000142906004906020840190620017d6565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001c090506276a70083111561019462000f93565b620001d462278d0082111561019562000f93565b4290910161014081905201610160528551620001f6906002111560c862000f93565b620002106200020462000fa8565b8751111560c962000f93565b620002268662000fad60201b620014da1760201c565b620002318462000fb9565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f9062000262908d9060040162001d99565b602060405180830381600087803b1580156200027d57600080fd5b505af115801562000292573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b8919062001b01565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002ed9084908b908b9060040162001cfd565b600060405180830381600087803b1580156200030857600080fd5b505af11580156200031d573d6000803e3d6000fd5b505050508061018081815250508a6001600160a01b031663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200036457600080fd5b505afa15801562000379573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200039f919062001b1a565b60601b6001600160601b0319166101a05250620003d1995050506001891015965061012c955062000f93945050505050565b620003e461138882111561012d62000f93565b6000620003ff826103e86200104d60201b620014e41760201c565b90506200040c816200107c565b5050805151620004216002821160c862000f93565b6200044660018203836020015151846040015151620010bb60201b6200150f1760201c565b6101c0819052815180516000906200045a57fe5b60200260200101516001600160a01b0316610200816001600160a01b031660601b8152505081600001516001815181106200049157fe5b60200260200101516001600160a01b0316610220816001600160a01b031660601b815250508160000151600281518110620004c857fe5b60200260200101516001600160a01b0316610240816001600160a01b031660601b8152505060038111620004fe57600062000517565b8151805160039081106200050e57fe5b60200260200101515b60601b6001600160601b03191661026052600481116200053957600062000552565b8151805160049081106200054957fe5b60200260200101515b60601b6001600160601b0319166102805260058111620005745760006200058d565b8151805160059081106200058457fe5b60200260200101515b60601b6001600160601b0319166102a05281518051620005c69190600090620005b257fe5b6020026020010151620010db60201b60201c565b6102c05281518051620005e091906001908110620005b257fe5b6102e05281518051620005fa91906002908110620005b257fe5b61030052600381116200060f57600062000625565b620006258260000151600381518110620005b257fe5b61032052600481116200063a57600062000650565b620006508260000151600481518110620005b257fe5b6103405260058111620006655760006200067b565b6200067b8260000151600581518110620005b257fe5b61036052815151600019015b600081118015620006b857508251805130919083908110620006a557fe5b60200260200101516001600160a01b0316115b15620006c8576000190162000687565b6101e08190528251516060906001600160401b0381118015620006ea57600080fd5b5060405190808252806020026020018201604052801562000715578160200160208202803683370190505b50905060008080805b8751518110156200093857858110156200085457876020015181815181106200074357fe5b60200260200101518582815181106200075857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050620007c160006001600160a01b03168683815181106200079457fe5b60200260200101516001600160a01b031614158260060186620011aa60201b6200152c179092919060201c565b935087604001518181518110620007d457fe5b60200260200101511562000849576200082060006001600160a01b0316868381518110620007fe57fe5b60200260200101516001600160a01b0316141561015562000f9360201b60201c565b6200083d60018286620011aa60201b6200152c179092919060201c565b9350600192506200084e565b600191505b6200092f565b8581146200092f57876020015160018203815181106200087057fe5b60200260200101518582815181106200088557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050620008c160006001600160a01b03168683815181106200079457fe5b935087604001516001820381518110620008d757fe5b6020026020010151156200092a576200090160006001600160a01b0316868381518110620007fe57fe5b6200091e60018286620011aa60201b6200152c179092919060201c565b9350600192506200092f565b600191505b6001016200071e565b50811560f890811b610460528115901b61048052835184906000906200095a57fe5b60200260200101516001600160a01b0316610380816001600160a01b031660601b81525050836001815181106200098d57fe5b60200260200101516001600160a01b03166103a0816001600160a01b031660601b8152505083600281518110620009c057fe5b60200260200101516001600160a01b03166103c0816001600160a01b031660601b815250506003845111620009f757600062000a0e565b8360038151811062000a0557fe5b60200260200101515b60601b6001600160601b0319166103e052835160041062000a3157600062000a48565b8360048151811062000a3f57fe5b60200260200101515b60601b6001600160601b03191661040052835160051062000a6b57600062000a82565b8360058151811062000a7957fe5b60200260200101515b60601b6001600160601b0319166104205250506104405250508251516020808501515160408601515162000ac595509293509190620010bb811b6200150f17901c565b805160609062000ad6903062000df9565b8051909150600019015b60008111801562000b165750306001600160a01b031682828151811062000b0357fe5b60200260200101516001600160a01b0316115b1562000b26576000190162000ae0565b6000805b84515181101562000c3f578281141562000b4357600191505b60208501518051828401916000918490811062000b5c57fe5b60200260200101516001600160a01b03161462000c355762000bb6818760200151848151811062000b8957fe5b60200260200101518860400151858151811062000ba257fe5b6020026020010151620011d360201b60201c565b8560200151828151811062000bc757fe5b60200260200101516001600160a01b0316817fdd6d1c9badb346de6925b358a472c937b41698d2632696759e43fd6527feeec48860400151858151811062000c0b57fe5b602002602001015160405162000c22919062001dae565b60405180910390a362000c3581620012ce565b5060010162000b2a565b5050505050600019811460f881901b6104c0526001600160601b0319606084901b166104a05262000c728360026200130d565b62000c7f8360036200130d565b801562000c995762000c938360006200130d565b62000d58565b60405163178b2b9360e21b815262000d2d906001600160a01b03851690635e2cae4c9062000ccd9060009060040162001dae565b60206040518083038186803b15801562000ce657600080fd5b505afa15801562000cfb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d21919062001b01565b83111561025862000f93565b600060008051602062007dc38339815191528360405162000d4f919062001dae565b60405180910390a25b8062000d65578162000d68565b60005b6104e0525062001e2092505050565b62000d8162001857565b6040518060600160405280836080015181526020018360a0015181526020018360c0015181525090505b919050565b62000dba62001857565b604051806060016040528062000ddb84608001513062000df960201b60201c565b81526020018360a0015181526020018360e001518152509050919050565b606082516001016001600160401b038111801562000e1657600080fd5b5060405190808252806020026020018201604052801562000e41578160200160208202803683370190505b50905082516000141562000e8457818160008151811062000e5e57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505062000f8d565b82515b60008111801562000ec05750826001600160a01b031684600183038151811062000ead57fe5b60200260200101516001600160a01b0316115b1562000f0d5783600182038151811062000ed657fe5b602002602001015182828151811062000eeb57fe5b6001600160a01b03909216602092830291909101909101526000190162000e87565b60005b8181101562000f5c5784818151811062000f2657fe5b602002602001015183828151811062000f3b57fe5b6001600160a01b039092166020928302919091019091015260010162000f10565b508282828151811062000f6b57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050505b92915050565b8162000fa45762000fa481620014b8565b5050565b600690565b8062000fa481620014cd565b62000fd262000fc762001554565b82101560cb62000f93565b62000feb62000fe06200155d565b82111560ca62000f93565b6200100d8160c0603f6008546200156960201b6200155317909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906200104290839062001dae565b60405180910390a150565b6000828202620010758415806200106d5750838583816200106a57fe5b04145b600362000f93565b9392505050565b6200108a818042806200158e565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a02338160405162001042919062001dae565b620010d68284148015620010ce57508183145b606762000f93565b505050565b60006001600160a01b038216301415620010ff5750670de0b6b3a764000062000dab565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200113b57600080fd5b505afa15801562001150573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001176919062001cda565b60ff1690506000620011956012836200160160201b6200157b1760201c565b600a0a670de0b6b3a764000002949350505050565b60006001821b1984168284620011c2576000620011c5565b60015b60ff16901b17949350505050565b6000826001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200120f57600080fd5b505afa15801562001224573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200124a919062001b01565b6000858152600a602090815260409091205491925062001279908290849086906200159162001619821b17901c565b6000868152600a602052604090819020919091555185907fb77a83204ca282e08dc3a65b0a1ca32ea4e6875c38ef0bf5bf75e52a67354fac90620012bf90859062001dae565b60405180910390a25050505050565b6000818152600a602090815260409091205490620012f7908290620015c962001675821b17901c565b6000928352600a60205260409092209190915550565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c3263906200133e90859060040162001dae565b60206040518083038186803b1580156200135757600080fd5b505afa1580156200136c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001392919062001b01565b905081620013d657620013b081620016a060201b620015e11760201c565b600b80546001600160401b0319166001600160401b03929092169190911790556200148a565b60028214156200142c57620013f681620016a060201b620015e11760201c565b600b80546001600160401b03929092166801000000000000000002600160401b600160801b03199092169190911790556200148a565b60038214156200147d576200144c81620016a060201b620015e11760201c565b600b80546001600160401b0392909216600160801b02600160801b600160c01b03199092169190911790556200148a565b6200148a6101bb620014b8565b8160008051602062007dc383398151915282604051620014ab919062001dae565b60405180910390a2505050565b620014ca816210905360ea1b620016be565b50565b600281511015620014de57620014ca565b600081600081518110620014ee57fe5b602002602001015190506000600190505b8251811015620010d65760008382815181106200151857fe5b6020026020010151905062001549816001600160a01b0316846001600160a01b031610606562000f9360201b60201c565b9150600101620014ff565b64e8d4a5100090565b67016345785d8a000090565b6000620015788484846200171f565b506001901b60001901811b1992909216911b1790565b620015a88160c060406200177a60201b620015fe1760201c565b620015c283608060406200177a60201b620015fe1760201c565b620015db856040806200177a60201b620015fe1760201c565b620015f587600060406200177a60201b620015fe1760201c565b17171760095550505050565b60006200161383831115600162000f93565b50900390565b60006200162e606084901c1561014962000f93565b6200166d42830160e06020620016578660c083838c8c600060606200155362001569871b17861c565b6200156960201b6200155317909392919060201c565b949350505050565b600062000f8d62001686836200178f565b606080856200156960201b6200155317909392919060201c565b6000620016ba6001600160401b038311156101ba62000f93565b5090565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b620017306101008310606462000f93565b62001769600182101580156200176157506200175d60ff8461010003620017af60201b620016111760201c565b8211155b606462000f93565b620010d683821c156101b462000f93565b6000620017898484846200171f565b50501b90565b600062000f8d6000606084620017c760201b62001627179092919060201c565b6000818310620017c0578162001075565b5090919050565b6001901b6000190191901c1690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200181957805160ff191683800117855562001849565b8280016001018555821562001849579182015b82811115620018495782518255916020019190600101906200182c565b50620016ba92915062001878565b60405180606001604052806060815260200160608152602001606081525090565b5b80821115620016ba576000815560010162001879565b805162000f8d8162001e0a565b600082601f830112620018ad578081fd5b8151620018c4620018be8262001dde565b62001db7565b818152915060208083019084810181840286018201871015620018e657600080fd5b6000805b8581101562001916578251801515811462001903578283fd5b85529383019391830191600101620018ea565b50505050505092915050565b600082601f83011262001933578081fd5b815162001944620018be8262001dde565b8181529150602080830190848101818402860182018710156200196657600080fd5b60005b84811015620019925781516200197f8162001e0a565b8452928201929082019060010162001969565b505050505092915050565b600082601f830112620019ae578081fd5b8151620019bf620018be8262001dde565b818152915060208083019084810181840286018201871015620019e157600080fd5b60005b8481101562001992578151620019fa8162001e0a565b84529282019290820190600101620019e4565b600082601f83011262001a1e578081fd5b815162001a2f620018be8262001dde565b81815291506020808301908481018184028601820187101562001a5157600080fd5b60005b84811015620019925781518452928201929082019060010162001a54565b600082601f83011262001a83578081fd5b81516001600160401b0381111562001a99578182fd5b602062001aaf601f8301601f1916820162001db7565b9250818352848183860101111562001ac657600080fd5b60005b8281101562001ae657848101820151848201830152810162001ac9565b8281111562001af85760008284860101525b50505092915050565b60006020828403121562001b13578081fd5b5051919050565b60006020828403121562001b2c578081fd5b8151620010758162001e0a565b60006020828403121562001b4b578081fd5b81516001600160401b038082111562001b62578283fd5b81840191506101a080838703121562001b79578384fd5b62001b848162001db7565b905062001b9286846200188f565b815262001ba386602085016200188f565b602082015260408301518281111562001bba578485fd5b62001bc88782860162001a72565b60408301525060608301518281111562001be0578485fd5b62001bee8782860162001a72565b60608301525060808301518281111562001c06578485fd5b62001c148782860162001922565b60808301525060a08301518281111562001c2c578485fd5b62001c3a878286016200199d565b60a08301525060c08301518281111562001c52578485fd5b62001c608782860162001a0d565b60c08301525060e08301518281111562001c78578485fd5b62001c86878286016200189c565b60e0830152506101008381015190820152610120808401519082015261014080840151908201526101608084015190820152610180915062001ccb868385016200188f565b91810191909152949350505050565b60006020828403121562001cec578081fd5b815160ff8116811462001075578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562001d495762001d36855162001dfe565b8352938301939183019160010162001d21565b505084810360408601528551808252908201925081860190845b8181101562001d8b5762001d78835162001dfe565b8552938301939183019160010162001d63565b509298975050505050505050565b602081016003831062001da857fe5b91905290565b90815260200190565b6040518181016001600160401b038111828210171562001dd657600080fd5b604052919050565b60006001600160401b0382111562001df4578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114620014ca57600080fd5b60805160a05160c05160e0516101005160601c6101205160601c6101405161016051610180516101a05160601c6101c0516101e0516102005160601c6102205160601c6102405160601c6102605160601c6102805160601c6102a05160601c6102c0516102e051610300516103205161034051610360516103805160601c6103a05160601c6103c05160601c6103e05160601c6104005160601c6104205160601c610440516104605160f81c6104805160f81c6104a05160601c6104c05160f81c6104e051615de562001fde60003980610db15250806108f752508061087752806108a252806108cd5250806146c152508061469d525080612ac85280614352525080611be8525080611bb8525080611b88525080611b58525080611b28525080611af8525080612f58525080612f28525080612ef8525080612ec8525080612e98525080612e68525080611e45525080611e03525080611dc1525080611d7f525080611d3d525080611cfb525080610fda525080611656525080611205525080610bd1525080611acc525080611aa85250806110da5250806110b6525080611012525080612cd6525080612d18525080612cf75250615de56000f3fe608060405234801561001057600080fd5b506004361061036d5760003560e01c806370464016116101d3578063a457c2d711610104578063d505accf116100a2578063ddf4627b1161007c578063ddf4627b146106d0578063eb0f24d6146106d8578063ed24911d146106e0578063f4b7964d146106e85761036d565b8063d505accf14610697578063d5c096c4146106aa578063dd62ed3e146106bd5761036d565b8063ab7759f1116100de578063ab7759f11461066c578063b35056b81461067f578063b7b814fc14610687578063d2946c2b1461068f5761036d565b8063a457c2d71461063e578063a9059cbb14610651578063aaabadc5146106645761036d565b8063851c1bb311610171578063893d20e81161014b578063893d20e8146106065780638d928af81461061b57806390193b7c1461062357806395d89b41146106365761036d565b8063851c1bb3146105d8578063876f303b146105eb57806387ec6817146105f35761036d565b80637ecebe00116101ad5780637ecebe00146105925780637f1260d1146105a557806382687a56146105c85780638456cb59146105d05761036d565b8063704640161461054b57806370a082311461055e57806374f3b009146105715761036d565b8063313ce567116102ad57806350dd6ed91161024b57806355c676281161022557806355c67628146105035780636028bfd41461050b578063679aefce1461052c5780636daccffa146105345761036d565b806350dd6ed9146104d557806354a844ba146104e857806354dea00a146104f05761036d565b806338fff2d01161028757806338fff2d01461049c57806339509351146104a45780633c975d51146104b75780633f4ba83a146104cd5761036d565b8063313ce5671461046c5780633644e5151461048157806338e9922e146104895761036d565b806318160ddd1161031a578063238a2d59116102f4578063238a2d591461041e57806323b872dd146104335780632df2c7c0146104465780632f1a0bc9146104595761036d565b806318160ddd146103ea5780631c0de051146103f25780631dd746ea146104095761036d565b8063095ea7b31161034b578063095ea7b3146103b85780630da0669c146103d857806315b0015b146103e25761036d565b806301ec954a1461037257806304842d4c1461039b57806306fdde03146103a3575b600080fd5b610385610380366004615838565b6106fb565b6040516103929190615be8565b60405180910390f35b6103856107a1565b6103ab6107b0565b6040516103929190615cbe565b6103cb6103c636600461546f565b610846565b6040516103929190615bc5565b6103e061085d565b005b6103cb6108f5565b610385610919565b6103fa61091f565b60405161039293929190615bd0565b610411610948565b6040516103929190615b8d565b610426610952565b6040516103929190615b40565b6103cb6104413660046153bf565b6109ed565b6103e061045436600461536b565b610a61565b6103e0610467366004615987565b610abd565b610474610ba0565b6040516103929190615d29565b610385610ba9565b6103e0610497366004615957565b610bb3565b610385610bcf565b6103cb6104b236600461546f565b610bf3565b6104bf610c2e565b604051610392929190615d00565b6103e0610c59565b6103e06104e3366004615685565b610c6b565b6103e0610c89565b6103856104fe36600461536b565b610c9b565b610385610cb6565b61051e610519366004615586565b610cc9565b604051610392929190615cd1565b610385610d00565b61053c610d6c565b60405161039293929190615cea565b610385610559366004615957565b610d87565b61038561056c36600461536b565b610e4d565b61058461057f366004615586565b610e68565b604051610392929190615ba0565b6103856105a036600461536b565b610f6b565b6105b86105b336600461536b565b610f76565b6040516103929493929190615d0e565b610385610fd8565b6103e0610ffc565b6103856105e6366004615629565b61100e565b610385611060565b61051e610601366004615586565b61108e565b61060e6110b4565b6040516103929190615b2c565b61060e6110d8565b61038561063136600461536b565b6110fc565b6103ab611117565b6103cb61064c36600461546f565b611178565b6103cb61065f36600461546f565b6111b6565b61060e6111c3565b6103cb61067a36600461536b565b6111cd565b6103cb6111e0565b6103e06111f1565b61060e611203565b6103e06106a53660046153ff565b611227565b6105846106b8366004615586565b6112b2565b6103856106cb366004615387565b6113d5565b610385611412565b6103e0611418565b610385611444565b6103e06106f636600461546f565b61144e565b6000846080015161072861070d6110d8565b6001600160a01b0316336001600160a01b03161460cd611636565b61073d610733610bcf565b82146101f4611636565b610745611644565b6107578484610752611654565b611678565b6060610761611690565b905060008751600181111561077257fe5b14610789576107848787878785611729565b610796565b6107968787878785611782565b979650505050505050565b60006107ab6117bd565b905090565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b5050505050905090565b60006108533384846117c4565b5060015b92915050565b61086561182c565b61086d6108f5565b1561089d5761089d7f00000000000000000000000000000000000000000000000000000000000000006000611899565b6108c87f00000000000000000000000000000000000000000000000000000000000000006002611899565b6108f37f00000000000000000000000000000000000000000000000000000000000000006003611899565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061092c611a89565b159250610937611aa6565b9150610941611aca565b9050909192565b60606107ab611690565b6060600061095e611654565b905060608167ffffffffffffffff8111801561097957600080fd5b506040519080825280602002602001820160405280156109a3578160200160208202803683370190505b50905060005b828110156109e6576109ba81611aee565b8282815181106109c657fe5b6001600160a01b03909216602092830291909101909101526001016109a9565b5091505090565b6000806109fa85336113d5565b9050610a1e336001600160a01b0387161480610a165750838210155b61019e611636565b610a29858585611c17565b336001600160a01b03861614801590610a4457506000198114155b15610a5657610a5685338584036117c4565b506001949350505050565b6000610a6c82611cf7565b90506000610a7982611aee565b9050610a926001600160a01b0382161515610155611636565b6000828152600a6020526040812054610aaa90611e85565b9050610ab7838383611e94565b50505050565b610ac5611f77565b610ad5600183101561012c611636565b610ae661138883111561012d611636565b6000610af2824261157b565b9050610b066201518082101561013d611636565b600080610b11611fbd565b91509150610b22811561013e611636565b6000610b30866103e86114e4565b90506000838211610b5f57610b5a610b4b62015180866114e4565b610b5584886114e4565b612031565b610b79565b610b79610b6f62015180846114e4565b610b5586886114e4565b9050610b8b600282111561013f611636565b610b9784834289612064565b50505050505050565b60055460ff1690565b60006107ab611444565b610bbb611f77565b610bc36120b3565b610bcc816120c6565b50565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610853918590610c29908661213f565b6117c4565b600c546000908190610c438160e96017611627565b9250610c5281600060e9611627565b9150509091565b610c61611f77565b6108f36000612151565b610c73611f77565b610c7b6120b3565b610c8582826121e2565b5050565b610c91611f77565b6108f360016122f0565b6000610cae610ca983611cf7565b612347565b90505b919050565b6008546000906107ab9060c0603f611627565b60006060610cdf8651610cda611654565b61239a565b610cf4898989898989896123a76123c9612432565b97509795505050505050565b60006060600080600080610d126125c9565b9398509196509450925090506000610d2a858561213f565b90506000610d36611fbd565b5090506000848214610d5157610d4c82896126b9565b610d53565b835b9050610d5f818461281b565b9850505050505050505090565b6000806000610d79611fbd565b90949093506103e892509050565b6000610d916111e0565b15610d9e57506000610cb1565b81610dea57610dab6108f5565b610dd5577f0000000000000000000000000000000000000000000000000000000000000000610de3565b600b5467ffffffffffffffff165b9050610cb1565b6002821415610e125750600b5468010000000000000000900467ffffffffffffffff16610cb1565b6003821415610e425750600b54700100000000000000000000000000000000900467ffffffffffffffff16610cb1565b610cb16101bb61286c565b6001600160a01b031660009081526020819052604090205490565b60608088610e7761070d6110d8565b610e82610733610bcf565b60606000610e8f86612896565b15610eb757610e9c6128c5565b610eae89610ea8610919565b886128d8565b92509050610f09565b610ebf611644565b6060610ec9611690565b9050610ed58a8261291c565b610ef98d8d8d8d8d610ee56111e0565b610eef578d610ef2565b60005b878e6123a7565b93509150610f0783826123c9565b505b610f138b82612985565b81895167ffffffffffffffff81118015610f2c57600080fd5b50604051908082528060200260200182016040528015610f56578160200160208202803683370190505b509450945050505b5097509795505050505050565b6000610cae826110fc565b6000806000806000600a6000610f8b88611cf7565b81526020810191909152604001600020549050610fac811515610155611636565b610fb58161298f565b9450610fc08161299d565b9350610fcb816129ab565b9597949650949392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b611004611f77565b6108f36001612151565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001611043929190615ab6565b604051602081830303815290604052805190602001209050919050565b600080600061106d6125c9565b50509250925050611087818361213f90919063ffffffff16565b9250505090565b6000606061109f8651610cda611654565b610cf4898989898989896129cd6129de612432565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561083c5780601f106108115761010080835404028352916020019161083c565b60008061118533856113d5565b905080831061119f5761119a338560006117c4565b6111ac565b6111ac33858584036117c4565b5060019392505050565b6000610853338484611c17565b60006107ab612a47565b6000610cae6111db83611cf7565b612ac1565b6008546000906107ab9060ff612ae9565b6111f9611f77565b6108f360006122f0565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886112568c6110fc565b8960405160200161126c96959493929190615c10565b60405160208183030381529060405280519060200120905061129d8882611294878787612af3565b886101f8612b32565b6112a88888886117c4565b5050505050505050565b606080886112c161070d6110d8565b6112cc610733610bcf565b6112d4611644565b60606112de611690565b90506112e8610919565b61139557600060606112fd8d8d8d868b612b89565b9150915061131661130c6117bd565b83101560cc611636565b61132860006113236117bd565b612c62565b61133b8b6113346117bd565b8403612c62565b61134581846129de565b808a5167ffffffffffffffff8111801561135e57600080fd5b50604051908082528060200260200182016040528015611388578160200160208202803683370190505b5095509550505050610f5e565b61139f888261291c565b600060606113c78d8d8d8d8d6113b36111e0565b6113bd578d6113c0565b60005b898e6129cd565b9150915061133b8b83612c62565b60006113df6110d8565b6001600160a01b0316826001600160a01b031614156114015750600019610857565b61140b8383612c6c565b9050610857565b60001981565b611420611f77565b60008061142b611fbd565b9150915061143b81610140611636565b610c8582612c97565b60006107ab612cd2565b611456611f77565b600061146183611cf7565b9050600061146e82611aee565b90506114876001600160a01b0382161515610155611636565b611492828285611e94565b806001600160a01b0316827fdd6d1c9badb346de6925b358a472c937b41698d2632696759e43fd6527feeec4856040516114cc9190615be8565b60405180910390a350505050565b80610c8581612d6f565b60008282026115088415806115015750838583816114fe57fe5b04145b6003611636565b9392505050565b611527828414801561152057508183145b6067611636565b505050565b60006001821b1984168284611542576000611545565b60015b60ff16901b17949350505050565b6000611560848484612de8565b5082821b6000196001831b01831b198516175b949350505050565b600061158b838311156001611636565b50900390565b60006115a4606084901c15610149611636565b61157342830160e060206115c18660c083838c8c60006060611553565b929190611553565b6000610cae6115d78361298f565b8390606080611553565b60006115fa67ffffffffffffffff8311156101ba611636565b5090565b600061160b848484612de8565b50501b90565b60008183106116205781611508565b5090919050565b6001901b6000190191901c1690565b81610c8557610c858161286c565b61164c612e2e565b6108f3612e36565b7f000000000000000000000000000000000000000000000000000000000000000090565b611527818410801561168957508183105b6064611636565b6060600061169c611654565b905060608167ffffffffffffffff811180156116b757600080fd5b506040519080825280602002602001820160405280156116e1578160200160208202803683370190505b50905060005b828110156109e65761170a6116fb82612347565b61170483612e5e565b90612f7c565b82828151811061171657fe5b60209081029190910101526001016116e7565b60208501516000906001600160a01b0316301480611753575060408601516001600160a01b031630145b611769576117648686868686612fa8565b611776565b6117768686868686613012565b90505b95945050505050565b60208501516000906001600160a01b03163014806117ac575060408601516001600160a01b031630145b611769576117648686868686613116565b620f424090565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061181f908590615be8565b60405180910390a3505050565b6118346120b3565b606060008060006118436125c9565b945094509450509350600083111561185e5761185e8361316d565b6000611868611fbd565b50905060008382146118835761187e82876126b9565b611885565b825b9050611891828261317e565b505050505050565b6040517f1a7c32630000000000000000000000000000000000000000000000000000000081526000906001600160a01b03841690631a7c3263906118e1908590600401615be8565b60206040518083038186803b1580156118f957600080fd5b505afa15801561190d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611931919061596f565b90508161197f57611941816115e1565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055611a4c565b60028214156119dc57611991816115e1565b600b805467ffffffffffffffff9290921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055611a4c565b6003821415611a41576119ee816115e1565b600b805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff909216919091179055611a4c565b611a4c6101bb61286c565b817f6bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a82604051611a7c9190615be8565b60405180910390a2505050565b6000611a93611aca565b4211806107ab57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b600081611b1c57507f0000000000000000000000000000000000000000000000000000000000000000610cb1565b8160011415611b4c57507f0000000000000000000000000000000000000000000000000000000000000000610cb1565b8160021415611b7c57507f0000000000000000000000000000000000000000000000000000000000000000610cb1565b8160031415611bac57507f0000000000000000000000000000000000000000000000000000000000000000610cb1565b8160041415611bdc57507f0000000000000000000000000000000000000000000000000000000000000000610cb1565b8160051415611c0c57507f0000000000000000000000000000000000000000000000000000000000000000610cb1565b610cb161013561286c565b611c2e6001600160a01b0384161515610198611636565b611c456001600160a01b0383161515610199611636565b611c50838383611527565b6001600160a01b038316600090815260208190526040902054611c7690826101a06131a4565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611ca5908261213f565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061181f908590615be8565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611d3b57506000610cb1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611d7d57506001610cb1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611dbf57506002610cb1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e0157506003610cb1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e4357506004610cb1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611c0c57506005610cb1565b6000610cae8260c06020611627565b6000826001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ecf57600080fd5b505afa158015611ee3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f07919061596f565b6000858152600a6020526040902054909150611f24818385611591565b6000868152600a602052604090819020919091555185907fb77a83204ca282e08dc3a65b0a1ca32ea4e6875c38ef0bf5bf75e52a67354fac90611f68908590615be8565b60405180910390a25050505050565b6000611fa66000357fffffffff000000000000000000000000000000000000000000000000000000001661100e565b9050610bcc611fb582336131ba565b610191611636565b600080600080600080611fce6132a3565b935093509350935080421015612021576001945083831115612005578181038242038585030281611ffb57fe5b048401955061201c565b818103824203848603028161201657fe5b04840395505b612029565b600094508295505b505050509091565b60006120408215156004611636565b8261204d57506000610857565b81600184038161205957fe5b046001019050610857565b61207084848484613302565b7f1835882ee7a34ac194f717a35e09bb1d24c82a3b9d854ab6c9749525b714cdf2848484846040516120a59493929190615d0e565b60405180910390a150505050565b6108f36120be611a89565b610192611636565b6120db6120d1613341565b82101560cb611636565b6120f06120e661334a565b82111560ca611636565b600854612101908260c0603f611553565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90612134908390615be8565b60405180910390a150565b60008282016115088482101583611636565b80156121715761216c612162611aa6565b4210610193611636565b612186565b61218661217c611aca565b42106101a9611636565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490612134908390615bc5565b60006121ec610bcf565b905060006121f86110d8565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b8152600401612225929190615c89565b60806040518083038186803b15801561223d57600080fd5b505afa158015612251573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227591906159a8565b6040517f18e736d40000000000000000000000000000000000000000000000000000000081529094506001600160a01b03851693506318e736d492506122c2915085908790600401615c70565b600060405180830381600087803b1580156122dc57600080fd5b505af11580156112a8573d6000803e3d6000fd5b6008546122ff908260ff61152c565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890612332908390615bc5565b60405180910390a180610bcc57610bcc613356565b6000612351610fd8565b8214156123675750670de0b6b3a7640000610cb1565b6000828152600a6020526040902054801561238a576123858161298f565b611508565b670de0b6b3a76400009392505050565b610c858183146067611636565b600060606123b86000888686613428565b915091509850989650505050505050565b815181516123d890829061239a565b60005b81811015610ab7576124138482815181106123f257fe5b602002602001015184838151811061240657fe5b602002602001015161281b565b84828151811061241f57fe5b60209081029190910101526001016123db565b333014612521576000306001600160a01b0316600036604051612456929190615ae6565b6000604051808303816000865af19150503d8060008114612493576040519150601f19603f3d011682016040523d82523d6000602084013e612498565b606091505b5050905080600081146124a757fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114612503573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b612529611644565b6060612533611690565b905061253f878261291c565b600060606125578c8c8c8c8c8c898d8d63ffffffff16565b9150915061256981848663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08301526020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b606060008060008060606125db6110d8565b6001600160a01b031663f94d46686125f1610bcf565b6040518263ffffffff1660e01b815260040161260d9190615be8565b60006040518083038186803b15801561262557600080fd5b505afa158015612639573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612661919081019061549a565b5091505061267681612671611690565b61291c565b61267f816134d6565b96509450600061268d610c2e565b9094509050600061269f88868461350f565b945090506126ad878261359c565b95505050509091929394565b80516000908190815b818110156126fa576126f08582815181106126d957fe5b60200260200101518461213f90919063ffffffff16565b92506001016126c2565b508161270b57600092505050610857565b600082868302825b60ff811015612804578260005b868110156127615761275761273583876114e4565b6127528c848151811061274457fe5b60200260200101518a6114e4565b6135ba565b9150600101612720565b508394506127ba612799612793612778848a6114e4565b61278d612785888d6114e4565b6103e86135ba565b9061213f565b866114e4565b6127526127a989600101856114e4565b61278d6127856103e889038a6114e4565b9350848411156127e2576001858503116127dd5783975050505050505050610857565b6127fb565b6001848603116127fb5783975050505050505050610857565b50600101612713565b5061281061014161286c565b505050505092915050565b600061282a8215156004611636565b8261283757506000610857565b670de0b6b3a76400008381029061285a9085838161285157fe5b04146005611636565b82818161286357fe5b04915050610857565b610bcc817f42414c00000000000000000000000000000000000000000000000000000000006135da565b6000808251118015610cae575060ff8016828060200190518101906128bb91906159e8565b60ff161492915050565b6108f36128d06111e0565b6101b6611636565b60006060600060606128e9876134d6565b91509150600060606128fc838589613655565b915091508161290c826000613681565b9550955050505050935093915050565b8151815161292b90829061239a565b60005b81811015610ab75761296684828151811061294557fe5b602002602001015184838151811061295957fe5b6020026020010151612f7c565b84828151811061297257fe5b602090810291909101015260010161292e565b610c85828261373e565b6000610cae82826060611627565b6000610cae82606080611627565b6000806129b783611e85565b91506129c68360e06020611627565b9050915091565b600060606123b86001888686613428565b815181516129ed90829061239a565b60005b81811015610ab757612a28848281518110612a0757fe5b6020026020010151848381518110612a1b57fe5b602002602001015161380a565b848281518110612a3457fe5b60209081029190910101526001016129f0565b6000612a516110d8565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015612a8957600080fd5b505afa158015612a9d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ab9190615669565b6000610cae7f0000000000000000000000000000000000000000000000000000000000000000835b1c60019081161490565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b6000612b3d85613858565b9050612b53612b4d878387613874565b83611636565b612b62428410156101b8611636565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606000612b9884613923565b9050612bb36000826002811115612bab57fe5b1460ce611636565b6060612bbe85613939565b9050612bcc8151875161239a565b612bd6818761291c565b6000612be0611fbd565b5090506060612bee8361394f565b90506000612bfc83836126b9565b9050806000612c196d80000000000000000000000000008361157b565b9050612c258d82612c62565b8086612c2f610fd8565b81518110612c3957fe5b602002602001018181525050612c4f858461317e565b509c939b50929950505050505050505050565b610c8582826139f1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b612ca381824242613302565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a0233816040516121349190615be8565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612d3f613a7e565b30604051602001612d54959493929190615c44565b60405160208183030381529060405280519060200120905090565b600281511015612d7e57610bcc565b600081600081518110612d8d57fe5b602002602001015190506000600190505b8251811015611527576000838281518110612db557fe5b60200260200101519050612dde816001600160a01b0316846001600160a01b0316106065611636565b9150600101612d9e565b612df761010083106064611636565b612e1f600182101580156116895750612e1560ff8461010003611611565b8211156064611636565b61152783821c156101b4611636565b6108f36120b3565b6000612e40611654565b905060005b81811015610c8557612e5681613a82565b600101612e45565b600081612e8c57507f0000000000000000000000000000000000000000000000000000000000000000610cb1565b8160011415612ebc57507f0000000000000000000000000000000000000000000000000000000000000000610cb1565b8160021415612eec57507f0000000000000000000000000000000000000000000000000000000000000000610cb1565b8160031415612f1c57507f0000000000000000000000000000000000000000000000000000000000000000610cb1565b8160041415612f4c57507f0000000000000000000000000000000000000000000000000000000000000000610cb1565b8160051415611c0c57507f0000000000000000000000000000000000000000000000000000000000000000610cb1565b6000828202612f968415806115015750838583816114fe57fe5b670de0b6b3a764000090049392505050565b6000612fb4858361291c565b612fd58660600151838581518110612fc857fe5b6020026020010151613ad6565b60608701526000612fe887878787613ae2565b905061300781848781518110612ffa57fe5b6020026020010151613af6565b905061079681613b02565b600080808751600181111561302357fe5b149050613030868461291c565b613050876060015184836130445786613046565b875b81518110612fc857fe5b876060018181525050600060606000806130698a613b1e565b935093509350935060008061307c610fd8565b8a146130a25761309d878e60600151876130958e613b87565b888b89613bbc565b6130bd565b6130bd878e60600151876130b58f613b87565b888b89613bf5565b915091506130ce8486858985613c19565b866130e8576130e3828a8d81518110612ffa57fe5b613105565b613105828a8c815181106130f857fe5b6020026020010151613c99565b9d9c50505050505050505050505050565b60006131258660600151613ca5565b6060870152613134858361291c565b6131488660600151838681518110612fc857fe5b6060870152600061315b87878787613cc6565b9050610796818486815181106130f857fe5b610bcc613178611203565b82612c62565b61318b81600060e96115fe565b6131988360e960176115fe565b17600c55610c85613cda565b60006131b38484111583611636565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6131d96110b4565b6001600160a01b0316141580156131f457506131f483613d10565b1561321c576132016110b4565b6001600160a01b0316336001600160a01b0316149050610857565b613224612a47565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161325393929190615bf1565b60206040518083038186803b15801561326b57600080fd5b505afa15801561327f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140b9190615566565b6000806000806132c2600060406009546116279092919063ffffffff16565b6009549094506132d490604080611627565b6009549093506132e79060806040611627565b6009549092506132fa9060c06040611627565b905090919293565b61330f8160c060406115fe565b61331c83608060406115fe565b613328856040806115fe565b61333587600060406115fe565b17171760095550505050565b64e8d4a5100090565b67016345785d8a000090565b60606133606110d8565b6001600160a01b031663f94d4668613376610bcf565b6040518263ffffffff1660e01b81526004016133929190615be8565b60006040518083038186803b1580156133aa57600080fd5b505afa1580156133be573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133e6919081019061549a565b509150506133f681612671611690565b60606134018261394f565b9050600061340d611fbd565b509050600061341c82846126b9565b9050610ab7828261317e565b600060606000606060008061343c89613b1e565b935093509350935061521a8a61345457613d1b613458565b613d915b905060006060613470868689878f8f8963ffffffff16565b9150915061521a8d6134845761157b613488565b61213f5b9050613495878383613df0565b60006134a589858463ffffffff16565b90506134b48789888c85613c19565b836134c0846000613681565b9a509a5050505050505050505094509492505050565b600060606134fd836134e6610fd8565b815181106134f057fe5b6020026020010151613e64565b6135068461394f565b91509150915091565b60008060008060006135218888613e78565b925092509250600086841161353757600061353b565b8684035b9050600084841161354d576000613551565b8484035b9050600061356c6135626000610d87565b611704858761281b565b9050600061358761357d6002610d87565b611704858861281b565b919091019b939a509298505050505050505050565b60006115086135aa83613efa565b6135b48585612f7c565b9061281b565b60006135c98215156004611636565b8183816135d257fe5b049392505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60006060600061366484613f20565b90506060613673878784613f36565b919791965090945050505050565b6060825160010167ffffffffffffffff8111801561369e57600080fd5b506040519080825280602002602001820160405280156136c8578160200160208202803683370190505b50905060005b8151811015613737576136df610fd8565b811461371657836136ee610fd8565b82106136fd57600182036136ff565b815b8151811061370957fe5b6020026020010151613718565b825b82828151811061372457fe5b60209081029190910101526001016136ce565b5092915050565b6137556001600160a01b038316151561019b611636565b61376182600083611527565b6001600160a01b03821660009081526020819052604090205461378790826101b26131a4565b6001600160a01b0383166000908152602081905260409020556137ba6137b5826137af610919565b90613fe5565b613ff3565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516137fe9190615be8565b60405180910390a35050565b60006138198215156004611636565b8261382657506000610857565b670de0b6b3a7640000838102906138409085838161285157fe5b82600182038161384c57fe5b04600101915050610857565b6000613862612cd2565b82604051602001611043929190615af6565b600061388682516041146101b9611636565b60208281015160408085015160608601518251600080825295019283905292939092811a916001906138bf908990859088908890615ca0565b6020604051602081039080840390855afa1580156138e1573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906139175750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b600081806020019051810190610cae919061576c565b6060818060200190518101906115089190615787565b606080600183510367ffffffffffffffff8111801561396d57600080fd5b50604051908082528060200260200182016040528015613997578160200160208202803683370190505b50905060005b815181101561373757836139af610fd8565b82106139be57816001016139c0565b815b815181106139ca57fe5b60200260200101518282815181106139de57fe5b602090810291909101015260010161399d565b6139fd60008383611527565b613a0c6137b58261278d610919565b6001600160a01b038216600090815260208190526040902054613a2f908261213f565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906137fe908590615be8565b4690565b613a8a610fd8565b811415613a9657610bcc565b6000818152600a60205260409020548015610c8557600080613ab7836129ab565b9150915080421115610ab757610ab784613ad086611aee565b84611e94565b60006115088383612f7c565b600061177960008660600151868686613ff8565b6000611508838361380a565b6000610cae613b17613b12610cb6565b613efa565b839061380a565b60006060600080600080613b30610c2e565b91509150600060606000613b458a868661406a565b9250925092506000613b55611fbd565b5090506000868214613b7057613b6b82856126b9565b613b72565b825b949c939b509099509297509095505050505050565b6000613b9e613b94610fd8565b8314156064611636565b613ba6610fd8565b82106115fa57613bb782600161157b565b610cae565b60008088613bd757613bd28888888888886140c2565b613be5565b613be5888888888888614199565b9150915097509795505050505050565b60008088613c0b57613bd28888888888886141fa565b613be5888888888888614260565b6000613c2586866126b9565b90506000613c33838561281b565b90506000613c418683612f7c565b905080831115613c8f578083036000613c6b613c6583613c6084610d87565b6114e4565b866135ba565b90508015613c8c576000613c7f878361359c565b9050613c8a8161316d565b505b50505b6112a8888461317e565b6000611508838361281b565b600080613cba613cb3610cb6565b849061430f565b9050611508838261157b565b600061177960018660600151868686613ff8565b6000613ce4611654565b905060005b81811015610c8557613cfa8161434b565b15613d0857613d088161437a565b600101613ce9565b6000610cae826143a8565b600060606000613d2a846143b3565b90506001816001811115613d3a57fe5b1415613d5857613d4e87878a8c89896143c9565b9250925050613d86565b6000816001811115613d6657fe5b1415613d7957613d4e87878a8c88614428565b613d8461015061286c565b505b965096945050505050565b600060606000613da084613923565b90506001816002811115613db057fe5b1415613dc457613d4e87878a8c89896144c9565b6002816002811115613dd257fe5b1415613de557613d4e87878a8c88614518565b613d8461013661286c565b82518251613dff90829061239a565b60005b81811015613e5d57613e3e858281518110613e1957fe5b6020026020010151858381518110613e2d57fe5b60200260200101518563ffffffff16565b858281518110613e4a57fe5b6020908102919091010152600101613e02565b5050505050565b6000610cae82613e72610919565b9061157b565b6000806000613e9184613e8c876001614592565b6126b9565b9250613e9b61469b565b15613eb457613eaa84866126b9565b9150819050613ef3565b613ebc6146bf565b15613ed557829150613ece84866126b9565b9050613ef3565b613ee484613e8c876000614592565b9150613ef084866126b9565b90505b9250925092565b6000670de0b6b3a76400008210613f12576000610cae565b50670de0b6b3a76400000390565b6000818060200190518101906115089190615a04565b60606000613f44838561281b565b9050845167ffffffffffffffff81118015613f5e57600080fd5b50604051908082528060200260200182016040528015613f88578160200160208202803683370190505b50915060005b8551811015613fdc57613fbd82878381518110613fa757fe5b6020026020010151612f7c90919063ffffffff16565b838281518110613fc957fe5b6020908102919091010152600101613f8e565b50509392505050565b6000611508838360016131a4565b600255565b600060606140058561394f565b9050600061401285613b87565b9050600061401f85613b87565b9050600061402b611fbd565b509050600061403a82866126b9565b90508a1561405c57614050828686868e866146e3565b95505050505050611779565b614050828686868e8661476e565b60006060600080606061407c886134d6565b9150915060008061408e838a8a61350f565b91509150600061409e858461359c565b905080156140af576140af8161316d565b9390930199919850919650945050505050565b6000806060875167ffffffffffffffff811180156140df57600080fd5b50604051908082528060200260200182016040528015614109578160200160208202803683370190505b5090508881888151811061411957fe5b602002602001018181525050600061413c878a848989614137610cb6565b614801565b90506141648a8a8a8151811061414e57fe5b602002602001015161157b90919063ffffffff16565b89898151811061417057fe5b60209081029190910101526000614187878361157b565b919b919a509098505050505050505050565b60008060006141b48689898c89896141af610cb6565b614a91565b90506141c68189898151811061414e57fe5b8888815181106141d257fe5b602090810291909101015260006141e9868b61157b565b919a91995090975050505050505050565b60008060006142158689898c8989614210610cb6565b614b80565b905061423d8189898151811061422757fe5b602002602001015161213f90919063ffffffff16565b88888151811061424957fe5b602090810291909101015260006141e9868b61213f565b6000806060875167ffffffffffffffff8111801561427d57600080fd5b506040519080825280602002602001820160405280156142a7578160200160208202803683370190505b509050888188815181106142b757fe5b60200260200101818152505060006142da878a8489896142d5610cb6565b614c4d565b90506142ec8a8a8a8151811061422757fe5b8989815181106142f857fe5b60209081029190910101526000614187878361213f565b60008282026143298415806115015750838583816114fe57fe5b80614338576000915050610857565b670de0b6b3a7640000600019820161384c565b6000610cae7f000000000000000000000000000000000000000000000000000000000000000060068401612ae9565b6000818152600a6020526040902054614392816115c9565b6000928352600a60205260409092209190915550565b6000610cae82614ec8565b600081806020019051810190610cae91906156d3565b600060608060006143d985614f04565b915091506143e98251885161239a565b6143f6826126718861394f565b60006144088989858e8e614137610cb6565b90506144188282111560cf611636565b9a91995090975050505050505050565b6000606060008061443885614f27565b9150915061444a865182106064611636565b6060865167ffffffffffffffff8111801561446457600080fd5b5060405190808252806020026020018201604052801561448e578160200160208202803683370190505b5090506144a2888884868e8e6141af610cb6565b8183815181106144ae57fe5b60209081029190910101529199919850909650505050505050565b600060608060006144d985614f3e565b915091506144e98751835161239a565b6144f6826126718861394f565b60006145088989858e8e6142d5610cb6565b90506144188282101560d0611636565b6000606060008061452885614f56565b9150915061453a865182106064611636565b6060865167ffffffffffffffff8111801561455457600080fd5b5060405190808252806020026020018201604052801561457e578160200160208202803683370190505b5090506144a2888884868e8e614210610cb6565b8151606090818167ffffffffffffffff811180156145af57600080fd5b506040519080825280602002602001820160405280156145d9578160200160208202803683370190505b50905060005b828110156146925760006145f1610fd8565b8210156145fe5781614603565b816001015b905061460e81612ac1565b80614625575085801561462557506146258161434b565b6146425786828151811061463557fe5b6020026020010151614672565b61467287838151811061465157fe5b6020026020010151600a600084815260200190815260200160002054614f6d565b83838151811061467e57fe5b6020908102919091010152506001016145df565b50949350505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006146f58387878151811061422757fe5b86868151811061470157fe5b602002602001018181525050600061471b88888588614f88565b90508387878151811061472a57fe5b60200260200101510387878151811061473f57fe5b6020026020010181815250506147606001613e72838a898151811061414e57fe5b9150505b9695505050505050565b60006147808387868151811061414e57fe5b86858151811061478c57fe5b60200260200101818152505060006147a688888589614f88565b9050838786815181106147b557fe5b6020026020010151018786815181106147ca57fe5b602002602001018181525050614760600161278d8989815181106147ea57fe5b60200260200101518461157b90919063ffffffff16565b600080805b875181101561483f5761483588828151811061481e57fe5b60200260200101518361213f90919063ffffffff16565b9150600101614806565b506060865167ffffffffffffffff8111801561485a57600080fd5b50604051908082528060200260200182016040528015614884578160200160208202803683370190505b5090506000805b89518110156149515760006148bc858c84815181106148a657fe5b602002602001015161380a90919063ffffffff16565b90506148fe8b83815181106148cd57fe5b60200260200101516148f88c85815181106148e457fe5b60200260200101518e868151811061414e57fe5b9061380a565b84838151811061490a57fe5b60200260200101818152505061494661493f8286858151811061492957fe5b602002602001015161430f90919063ffffffff16565b849061213f565b92505060010161488b565b506060895167ffffffffffffffff8111801561496c57600080fd5b50604051908082528060200260200182016040528015614996578160200160208202803683370190505b50905060005b8a51811015614a615760008482815181106149b357fe5b6020026020010151841115614a1a5760006149dc6149d086613efa565b8e8581518110613fa757fe5b905060006149f0828e868151811061414e57fe5b9050614a11614a0a82670de0b6b3a76400008d900361380a565b839061213f565b92505050614a31565b8a8281518110614a2657fe5b602002602001015190505b614a41818d848151811061414e57fe5b838381518110614a4d57fe5b60209081029190910101525060010161499c565b506000614a6e8c836126b9565b90506000614a7c828a61281b565b9050613105614a8a82613efa565b8b9061430f565b600080614aac84614aa6876148f8818b61157b565b9061430f565b90506000614abc8a8a848b614f88565b90506000614ad0828b8b8151811061414e57fe5b90506000805b8b51811015614af857614aee8c828151811061481e57fe5b9150600101614ad6565b506000614b21828d8d81518110614b0b57fe5b602002602001015161281b90919063ffffffff16565b90506000614b2e82613efa565b90506000614b3c858361430f565b90506000614b4a868361157b565b9050614b6b614b6483670de0b6b3a76400008d9003612f7c565b829061213f565b98505050505050505050979650505050505050565b600080614b9584614aa6876148f8818b61213f565b90506000614ba58a8a848b614f88565b90506000614bcf8a8a81518110614bb857fe5b60200260200101518361157b90919063ffffffff16565b90506000805b8b51811015614bf757614bed8c828151811061481e57fe5b9150600101614bd5565b506000614c0a828d8d81518110614b0b57fe5b90506000614c1782613efa565b90506000614c25858361430f565b90506000614c33868361157b565b9050614b6b614b6483670de0b6b3a76400008d900361380a565b600080805b8751811015614c7457614c6a88828151811061481e57fe5b9150600101614c52565b506060865167ffffffffffffffff81118015614c8f57600080fd5b50604051908082528060200260200182016040528015614cb9578160200160208202803683370190505b5090506000805b8951811015614d4d576000614cdb858c8481518110614b0b57fe5b9050614d178b8381518110614cec57fe5b60200260200101516135b48c8581518110614d0357fe5b60200260200101518e868151811061422757fe5b848381518110614d2357fe5b602002602001018181525050614d4261493f82868581518110613fa757fe5b925050600101614cc0565b506060895167ffffffffffffffff81118015614d6857600080fd5b50604051908082528060200260200182016040528015614d92578160200160208202803683370190505b50905060005b8a51811015614e5357600083858381518110614db057fe5b60200260200101511115614e0c576000614dd56149d086670de0b6b3a764000061157b565b90506000614de9828e868151811061414e57fe5b9050614e03614a0a82670de0b6b3a76400008d9003612f7c565b92505050614e23565b8a8281518110614e1857fe5b602002602001015190505b614e33818d848151811061422757fe5b838381518110614e3f57fe5b602090810291909101015250600101614d98565b506000614e608c836126b9565b90506000614e6e828a61281b565b9050670de0b6b3a7640000811115614eb957614eac8a7ffffffffffffffffffffffffffffffffffffffffffffffffff21f494c589c00008301612f7c565b9650505050505050614764565b60009650505050505050614764565b6000614ef37ff4b7964d0000000000000000000000000000000000000000000000000000000061100e565b821480610cae5750610cae82615145565b6060600082806020019051810190614f1c91906156ef565b909590945092505050565b60008082806020019051810190614f1c9190615736565b6060600082806020019051810190614f1c91906157ca565b60008082806020019051810190614f1c9190615803565b6000611508614f7f84613c608561299d565b6127528461298f565b600080845186029050600085600081518110614fa057fe5b602002602001015190506000865187600081518110614fbb57fe5b60200260200101510290506000600190505b875181101561502157615006615000614ff9848b8581518110614fec57fe5b60200260200101516114e4565b8a516114e4565b886135ba565b91506150178882815181106126d957fe5b9250600101614fcd565b5086858151811061502e57fe5b602002602001015182039150600061504687886114e4565b9050600061507261506661505e84610b5589886114e4565b6103e86114e4565b8a8981518110614fec57fe5b9050600061508d61508661505e8b896135ba565b869061213f565b90506000806150a961509f868661213f565b610b558d8661213f565b905060005b60ff811015615129578192506150de6150cb8661278d85866114e4565b610b558e613e728861278d8860026114e4565b91508282111561510757600183830311615102575097506115739650505050505050565b615121565b600182840311615121575097506115739650505050505050565b6001016150ae565b5061513561014261286c565b5050505050505050949350505050565b60006151707f2f1a0bc90000000000000000000000000000000000000000000000000000000061100e565b8214806151a457506151a17feb0f24d60000000000000000000000000000000000000000000000000000000061100e565b82145b80610cae5750610cae8260006151d97f38e9922e0000000000000000000000000000000000000000000000000000000061100e565b82148061520d575061520a7f50dd6ed90000000000000000000000000000000000000000000000000000000061100e565b82145b80610cae57506000610cae565bfe5b803561085781615d7e565b600082601f830112615237578081fd5b813561524a61524582615d5e565b615d37565b81815291506020808301908481018184028601820187101561526b57600080fd5b60005b848110156128105781358452928201929082019060010161526e565b600082601f83011261529a578081fd5b81516152a861524582615d5e565b8181529150602080830190848101818402860182018710156152c957600080fd5b60005b84811015612810578151845292820192908201906001016152cc565b600082601f8301126152f8578081fd5b813567ffffffffffffffff81111561530e578182fd5b6153216020601f19601f84011601615d37565b915080825283602082850101111561533857600080fd5b8060208401602084013760009082016020015292915050565b80516003811061085757600080fd5b803561085781615d93565b60006020828403121561537c578081fd5b813561150881615d7e565b60008060408385031215615399578081fd5b82356153a481615d7e565b915060208301356153b481615d7e565b809150509250929050565b6000806000606084860312156153d3578081fd5b83356153de81615d7e565b925060208401356153ee81615d7e565b929592945050506040919091013590565b600080600080600080600060e0888a031215615419578283fd5b873561542481615d7e565b9650602088013561543481615d7e565b95506040880135945060608801359350608088013561545281615da0565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215615481578182fd5b823561548c81615d7e565b946020939093013593505050565b6000806000606084860312156154ae578081fd5b835167ffffffffffffffff808211156154c5578283fd5b818601915086601f8301126154d8578283fd5b81516154e661524582615d5e565b80828252602080830192508086018b828387028901011115615506578788fd5b8796505b8487101561553157805161551d81615d7e565b84526001969096019592810192810161550a565b508901519097509350505080821115615548578283fd5b506155558682870161528a565b925050604084015190509250925092565b600060208284031215615577578081fd5b81518015158114611508578182fd5b600080600080600080600060e0888a0312156155a0578081fd5b8735965060208801356155b281615d7e565b955060408801356155c281615d7e565b9450606088013567ffffffffffffffff808211156155de578283fd5b6155ea8b838c01615227565b955060808a0135945060a08a0135935060c08a013591508082111561560d578283fd5b5061561a8a828b016152e8565b91505092959891949750929550565b60006020828403121561563a578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611508578182fd5b60006020828403121561567a578081fd5b815161150881615d7e565b60008060408385031215615697578182fd5b82356156a281615d7e565b9150602083013567ffffffffffffffff8111156156bd578182fd5b6156c9858286016152e8565b9150509250929050565b6000602082840312156156e4578081fd5b815161150881615d93565b600080600060608486031215615703578081fd5b835161570e81615d93565b602085015190935067ffffffffffffffff81111561572a578182fd5b6155558682870161528a565b60008060006060848603121561574a578081fd5b835161575581615d93565b602085015160409095015190969495509392505050565b60006020828403121561577d578081fd5b6115088383615351565b60008060408385031215615799578182fd5b6157a38484615351565b9150602083015167ffffffffffffffff8111156157be578182fd5b6156c98582860161528a565b6000806000606084860312156157de578081fd5b6157e88585615351565b9250602084015167ffffffffffffffff81111561572a578182fd5b600080600060608486031215615817578081fd5b6158218585615351565b925060208401519150604084015190509250925092565b6000806000806080858703121561584d578182fd5b843567ffffffffffffffff80821115615864578384fd5b818701915061012080838a03121561587a578485fd5b61588381615d37565b905061588f8984615360565b815261589e896020850161521c565b60208201526158b0896040850161521c565b6040820152606083013560608201526080830135608082015260a083013560a08201526158e08960c0850161521c565b60c08201526158f28960e0850161521c565b60e0820152610100808401358381111561590a578687fd5b6159168b8287016152e8565b828401525050809650506020870135915080821115615933578384fd5b5061594087828801615227565b949794965050505060408301359260600135919050565b600060208284031215615968578081fd5b5035919050565b600060208284031215615980578081fd5b5051919050565b60008060408385031215615999578182fd5b50508035926020909101359150565b600080600080608085870312156159bd578182fd5b84519350602085015192506040850151915060608501516159dd81615d7e565b939692955090935050565b6000602082840312156159f9578081fd5b815161150881615da0565b60008060408385031215615a16578182fd5b8251615a2181615da0565b6020939093015192949293505050565b6000815180845260208085019450808401835b83811015615a6057815187529582019590820190600101615a44565b509495945050505050565b60008151808452815b81811015615a9057602081850181015186830182015201615a74565b81811115615aa15782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b81811015615b815783516001600160a01b031683529284019291840191600101615b5c565b50909695505050505050565b6000602082526115086020830184615a31565b600060408252615bb36040830185615a31565b82810360208401526117798185615a31565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000838252604060208301526115736040830184615a6b565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526115086020830184615a6b565b6000838252604060208301526115736040830184615a31565b9283529015156020830152604082015260600190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615d5657600080fd5b604052919050565b600067ffffffffffffffff821115615d74578081fd5b5060209081020190565b6001600160a01b0381168114610bcc57600080fd5b60028110610bcc57600080fd5b60ff81168114610bcc57600080fdfea2646970667358221220ce8725614f9b4df2ebaf6bb6ccba00eb16100f9cd9efe29dbebda5b8dfca78f864736f6c634300070100336bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100bd5760003560e01c806366b59f6c11610076578063851c1bb31161005b578063851c1bb31461015e5780638d928af81461017e578063aaabadc514610186576100bd565b806366b59f6c146101365780636c57f5a914610156576100bd565b80632da47c40116100a75780632da47c40146100f65780632f2770db1461010c5780636634b75314610116576100bd565b8062c194db146100c2578063174481fa146100e0575b600080fd5b6100ca61018e565b6040516100d79190610ed0565b60405180910390f35b6100e86101ad565b6040516100d7929190610e69565b6100fe6101f3565b6040516100d792919061104e565b61011461025d565b005b610129610124366004610b5d565b6102c2565b6040516100d79190610e90565b610149610144366004610bf1565b6102ed565b6040516100d79190610ee3565b6101296103f6565b61017161016c366004610b95565b6103ff565b6040516100d79190610e9b565b610149610451565b610149610475565b60606101a86040518060200160405280600081525061055b565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561024f57807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610258565b60009250600091505b509091565b610265610634565b61026d61067d565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b60008060006102fa6101f3565b915091506103e6604051806101a00160405280610315610451565b73ffffffffffffffffffffffffffffffffffffffff16815260200160018054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018e81526020018d81526020018c81526020018a81526020018981526020018881526020018b81526020018781526020018481526020018381526020018673ffffffffffffffffffffffffffffffffffffffff168152506040516020016103d29190610f04565b604051602081830303815290604052610692565b9c9b505050505050505050505050565b60015460ff1690565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610434929190610e39565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061047f610451565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156104c457600080fd5b505afa1580156104d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101a89190610bd5565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061055573ffffffffffffffffffffffffffffffffffffffff831615156101ac610726565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c5060208981019089850101610626818386610738565b505050505050505050919050565b60006106636000357fffffffff00000000000000000000000000000000000000000000000000000000166103ff565b905061067a61067282336107b2565b610191610726565b50565b6106906106886103f6565b1560d3610726565b565b600061069c61067d565b60006106a783610851565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b816107345761073481610899565b5050565b5b602081106107765781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001610739565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b60006107bc610475565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b81526004016107f893929190610ea4565b60206040518083038186803b15801561081057600080fd5b505afa158015610824573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108489190610b79565b90505b92915050565b6000606061085e8361055b565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff8116610892573d6000803e3d6000fd5b9392505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b60445261067a917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b803561084b816110a3565b600082601f830112610943578081fd5b813561095661095182611083565b61105c565b81815291506020808301908481018184028601820187101561097757600080fd5b60005b8481101561099f57813561098d816110c5565b8452928201929082019060010161097a565b505050505092915050565b600082601f8301126109ba578081fd5b81356109c861095182611083565b8181529150602080830190848101818402860182018710156109e957600080fd5b60005b8481101561099f5781356109ff816110a3565b845292820192908201906001016109ec565b600082601f830112610a21578081fd5b8135610a2f61095182611083565b818152915060208083019084810181840286018201871015610a5057600080fd5b60005b8481101561099f578135610a66816110a3565b84529282019290820190600101610a53565b600082601f830112610a88578081fd5b8135610a9661095182611083565b818152915060208083019084810181840286018201871015610ab757600080fd5b60005b8481101561099f57813584529282019290820190600101610aba565b600082601f830112610ae6578081fd5b813567ffffffffffffffff811115610afc578182fd5b610b2d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161105c565b9150808252836020828501011115610b4457600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215610b6e578081fd5b8135610892816110a3565b600060208284031215610b8a578081fd5b8151610892816110c5565b600060208284031215610ba6578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610892578182fd5b600060208284031215610be6578081fd5b8151610892816110a3565b60008060008060008060008060006101208a8c031215610c0f578485fd5b893567ffffffffffffffff80821115610c26578687fd5b610c328d838e01610ad6565b9a5060208c0135915080821115610c47578687fd5b610c538d838e01610ad6565b995060408c0135915080821115610c68578687fd5b610c748d838e016109aa565b985060608c0135975060808c0135915080821115610c90578687fd5b610c9c8d838e01610a11565b965060a08c0135915080821115610cb1578586fd5b610cbd8d838e01610a78565b955060c08c0135915080821115610cd2578485fd5b50610cdf8c828d01610933565b93505060e08a01359150610cf78b6101008c01610928565b90509295985092959850929598565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208085019450808401835b83811015610d51578151151587529582019590820190600101610d33565b509495945050505050565b6000815180845260208085019450808401835b83811015610d5157815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101610d6f565b6000815180845260208085019450808401835b83811015610d5157815187529582019590820190600101610db4565b60008151808452815b81811015610df557602081850181015186830182015201610dd9565b81811115610e065782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b6000602082526108486020830184610dd0565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600060208252610f18602083018451610d06565b6020830151610f2a6040840182610d06565b5060408301516101a0806060850152610f476101c0850183610dd0565b915060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080868503016080870152610f838483610dd0565b935060808701519150808685030160a0870152610fa08483610d5c565b935060a08701519150808685030160c0870152610fbd8483610d5c565b935060c08701519150808685030160e0870152610fda8483610da1565b935060e08701519150610100818786030181880152610ff98584610d20565b90880151610120888101919091528801516101408089019190915288015161016080890191909152880151610180808901919091528801519094509150611044905082860182610d06565b5090949350505050565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561107b57600080fd5b604052919050565b600067ffffffffffffffff821115611099578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff8116811461067a57600080fd5b801515811461067a57600080fdfea2646970667358221220cf4938a5f02093a10c020552684e4823d287dae5816d66627b84ee93e485cd3864736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/index.ts b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/index.ts new file mode 100644 index 0000000..f84712f --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { ComposableStablePoolDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as ComposableStablePoolDeployment; + + const args = [input.Vault, input.ProtocolFeePercentagesProvider]; + await task.deployAndVerify('ComposableStablePoolFactory', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/input.ts b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/input.ts new file mode 100644 index 0000000..e6973ce --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/input.ts @@ -0,0 +1,14 @@ +import { Task, TaskMode } from '@src'; + +export type ComposableStablePoolDeployment = { + Vault: string; + ProtocolFeePercentagesProvider: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); + +export default { + Vault, + ProtocolFeePercentagesProvider, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/output/arbitrum.json new file mode 100644 index 0000000..1f0ae09 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "ComposableStablePoolFactory": "0xaEb406b0E430BF5Ea2Dc0B9Fe62E4E53f74B3a33" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/output/bsc.json b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/output/bsc.json new file mode 100644 index 0000000..050a6ef --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/output/bsc.json @@ -0,0 +1,3 @@ +{ + "ComposableStablePoolFactory": "0xf302f9F50958c5593770FDf4d4812309fF77414f" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/output/goerli.json new file mode 100644 index 0000000..4e4b3c9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/output/goerli.json @@ -0,0 +1,3 @@ +{ + "ComposableStablePoolFactory": "0xB848f50141F3D4255b37aC288C25C109104F2158" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/output/mainnet.json new file mode 100644 index 0000000..2cefb79 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "ComposableStablePoolFactory": "0xf9ac7B9dF2b3454E841110CcE5550bD5AC6f875F" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/output/optimism.json b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/output/optimism.json new file mode 100644 index 0000000..2a759a7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/output/optimism.json @@ -0,0 +1,3 @@ +{ + "ComposableStablePoolFactory": "0xf145caFB67081895EE80eB7c04A30Cf87f07b745" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/output/polygon.json new file mode 100644 index 0000000..1850aed --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/output/polygon.json @@ -0,0 +1,3 @@ +{ + "ComposableStablePoolFactory": "0x136FD06Fa01eCF624C7F2B3CB15742c1339dC2c4" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/readme.md b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/readme.md new file mode 100644 index 0000000..b20c09a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220906-composable-stable-pool/readme.md @@ -0,0 +1,17 @@ +# 2022-09-06 - Composable Stable Pool + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This factory and associated Pools were deprecated in favor of a new version that supported proportional joins and exits. The factory was superseded by this [updated version (also now deprecated)](../20221122-composable-stable-pool-v2). + +Deployment of `ComposableStablePoolFactory`, which allows creating Stable Pools that are suitable to be included in other Pools. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`ComposableStablePoolFactory` artifact](./artifact/ComposableStablePoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/artifact/WeightedPool.json b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/artifact/WeightedPool.json new file mode 100644 index 0000000..c3518fa --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/artifact/WeightedPool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"components": [{"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20[]", "name": "tokens", "type": "address[]"}, {"internalType": "uint256[]", "name": "normalizedWeights", "type": "uint256[]"}, {"internalType": "contract IRateProvider[]", "name": "rateProviders", "type": "address[]"}, {"internalType": "address[]", "name": "assetManagers", "type": "address[]"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "internalType": "struct WeightedPool.NewPoolParams", "name": "params", "type": "tuple"}, {"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "contract IProtocolFeePercentagesProvider", "name": "protocolFeeProvider", "type": "address"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "address", "name": "owner", "type": "address"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "feeType", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "protocolFeePercentage", "type": "uint256"}], "name": "ProtocolFeePercentageCacheUpdated", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "enabled", "type": "bool"}], "name": "RecoveryModeStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DELEGATE_PROTOCOL_SWAP_FEES_SENTINEL", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "disableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "enableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "getATHRateProduct", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getActualSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getDomainSeparator", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getInvariant", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getLastPostJoinExitInvariant", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "getNextNonce", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getNormalizedWeights", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "feeType", "type": "uint256"}], "name": "getProtocolFeePercentageCache", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getProtocolFeesCollector", "outputs": [{"internalType": "contract IProtocolFeesCollector", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getProtocolSwapFeeDelegation", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRateProviders", "outputs": [{"internalType": "contract IRateProvider[]", "name": "", "type": "address[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getScalingFactors", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "inRecoveryMode", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256", "name": "balanceTokenIn", "type": "uint256"}, {"internalType": "uint256", "name": "balanceTokenOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "bytes", "name": "poolConfig", "type": "bytes"}], "name": "setAssetManagerPoolConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "updateProtocolFeePercentageCache", "outputs": [], "stateMutability": "nonpayable", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/artifact/WeightedPoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/artifact/WeightedPoolFactory.json new file mode 100644 index 0000000..bade294 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/artifact/WeightedPoolFactory.json @@ -0,0 +1,241 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "WeightedPoolFactory", + "sourceName": "contracts/WeightedPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "normalizedWeights", + "type": "uint256[]" + }, + { + "internalType": "contract IRateProvider[]", + "name": "rateProviders", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeePercentagesProvider", + "outputs": [ + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101806040523480156200001257600080fd5b5060405162008d0038038062008d008339810160408190526200003591620001fc565b8181604051806020016200004990620001ee565b601f1982820381018352601f90910116604052805183903090839060006002820460a081905280830360e08190528185529091508362000095816200010f602090811b620004fe17901c565b60601b6001600160601b0319166080528285018051838252620000c4826200010f602090811b620004fe17901c565b6001600160601b0319606091821b811660c05296909352905261010095909552505092821b831661012052509290921b90911661014052505050426276a70001610160525062000250565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506200015d6001600160a01b03831615156101ac62000163565b50919050565b816200017457620001748162000178565b5050565b6200018a816210905360ea1b6200018d565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b617a3180620012cf83390190565b600080604083850312156200020f578182fd5b82516200021c816200023a565b60208401519092506200022f816200023a565b809150509250929050565b6001600160a01b03811681146200018a57600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405160601c61016051611006620002c96000398061020c528061023552508061030b5250806104555250806104055250806105655250806101e352806105e15250806105865250806101c252806105bd52506110066000f3fe608060405234801561001057600080fd5b50600436106100c85760003560e01c80636c57f5a911610081578063851c1bb31161005b578063851c1bb3146101715780638d928af814610191578063aaabadc514610199576100c8565b80636c57f5a914610141578063739238d61461014957806380773a931461015e576100c8565b80632da47c40116100b25780632da47c40146101015780632f2770db146101175780636634b75314610121576100c8565b8062c194db146100cd578063174481fa146100eb575b600080fd5b6100d56101a1565b6040516100e29190610e31565b60405180910390f35b6100f36101c0565b6040516100e2929190610dca565b610109610206565b6040516100e2929190610f59565b61011f610270565b005b61013461012f366004610af8565b6102d5565b6040516100e29190610df1565b610134610300565b610151610309565b6040516100e29190610da9565b61015161016c366004610b90565b61032d565b61018461017f366004610b34565b610401565b6040516100e29190610dfc565b610151610453565b610151610477565b60606101bb6040518060200160405280600081525061055d565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561026257807f000000000000000000000000000000000000000000000000000000000000000003925062278d00915061026b565b60009250600091505b509091565b610278610636565b61028061067f565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b60015460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b600080600061033a610206565b915091506103f16040518060e001604052808c81526020018b81526020018a81526020018981526020018881526020018a5167ffffffffffffffff8111801561038257600080fd5b506040519080825280602002602001820160405280156103ac578160200160208202803683370190505b5081526020018790526103bd610453565b6103c5610309565b8585896040516020016103dd96959493929190610e44565b604051602081830303815290604052610694565b925050505b979650505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610436929190610d79565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610481610453565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156104c657600080fd5b505afa1580156104da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101bb9190610b74565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061055773ffffffffffffffffffffffffffffffffffffffff831615156101ac610728565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010161062881838661073a565b505050505050505050919050565b60006106656000357fffffffff0000000000000000000000000000000000000000000000000000000016610401565b905061067c61067482336107b4565b610191610728565b50565b61069261068a610300565b1560d3610728565b565b600061069e61067f565b60006106a983610853565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b81610736576107368161089b565b5050565b5b602081106107785781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00161073b565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b60006107be610477565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b81526004016107fa93929190610e05565b60206040518083038186803b15801561081257600080fd5b505afa158015610826573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084a9190610b14565b90505b92915050565b600060606108608361055d565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff8116610894573d6000803e3d6000fd5b9392505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b60445261067c917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b803561084d81610fae565b600082601f830112610945578081fd5b813561095861095382610f8e565b610f67565b81815291506020808301908481018184028601820187101561097957600080fd5b60005b848110156109a157813561098f81610fae565b8452928201929082019060010161097c565b505050505092915050565b600082601f8301126109bc578081fd5b81356109ca61095382610f8e565b8181529150602080830190848101818402860182018710156109eb57600080fd5b60005b848110156109a1578135610a0181610fae565b845292820192908201906001016109ee565b600082601f830112610a23578081fd5b8135610a3161095382610f8e565b818152915060208083019084810181840286018201871015610a5257600080fd5b60005b848110156109a157813584529282019290820190600101610a55565b600082601f830112610a81578081fd5b813567ffffffffffffffff811115610a97578182fd5b610ac860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610f67565b9150808252836020828501011115610adf57600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215610b09578081fd5b813561089481610fae565b600060208284031215610b25578081fd5b81518015158114610894578182fd5b600060208284031215610b45578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610894578182fd5b600060208284031215610b85578081fd5b815161089481610fae565b600080600080600080600060e0888a031215610baa578283fd5b873567ffffffffffffffff80821115610bc1578485fd5b610bcd8b838c01610a71565b985060208a0135915080821115610be2578485fd5b610bee8b838c01610a71565b975060408a0135915080821115610c03578485fd5b610c0f8b838c01610935565b965060608a0135915080821115610c24578485fd5b610c308b838c01610a13565b955060808a0135915080821115610c45578485fd5b50610c528a828b016109ac565b93505060a08801359150610c698960c08a0161092a565b905092959891949750929550565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208085019450808401835b83811015610cd657815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101610ca4565b509495945050505050565b6000815180845260208085019450808401835b83811015610cd657815187529582019590820190600101610cf4565b60008151808452815b81811015610d3557602081850181015186830182015201610d19565b81811115610d465782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825261084a6020830184610d10565b600060c08252875160e060c0840152610e616101a0840182610d10565b905060208901517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff40808584030160e0860152610e9d8383610d10565b925060408b015191508085840301610100860152610ebb8383610c91565b925060608b015191508085840301610120860152610ed98383610ce1565b925060808b015191508085840301610140860152610ef78383610c91565b925060a08b01519150808584030161016086015250610f168282610c91565b60c08b01516101808601529250610f339150506020830188610c77565b610f406040830187610c77565b8460608301528360808301526103f660a0830184610c77565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610f8657600080fd5b604052919050565b600067ffffffffffffffff821115610fa4578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff8116811461067c57600080fdfea2646970667358221220945ea5d7f5bd6cda5e8ab82fa08ee9dd72ed81a441b6645dc91678219a0f94c164736f6c634300070100336106606040523480156200001257600080fd5b5060405162007a3138038062007a318339810160408190526200003591620014f6565b856040015151866080015185600019888a600001518b602001518c604001518d60a001518e60c001518c8c8c6000898751600214801562000074575081155b6200008157600162000084565b60025b8a8a8a8a8a8a8a8a828289898d85336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000d5929190620011ca565b508051620000eb906004906020840190620011ca565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b1661012052506200016990506276a70083111561019462000c29565b6200017d62278d0082111561019562000c29565b42909101610140819052016101605285516200019f906002111560c862000c29565b620001b9620001ad62000c3e565b8751111560c962000c29565b620001cf8662000c4360201b620014531760201c565b620001da8462000c4f565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f906200020b908d906004016200173e565b602060405180830381600087803b1580156200022657600080fd5b505af11580156200023b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002619190620014be565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002969084908b908b90600401620016a2565b600060405180830381600087803b158015620002b157600080fd5b505af1158015620002c6573d6000803e3d6000fd5b505050508061018081815250508a6001600160a01b031663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200030d57600080fd5b505afa15801562000322573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003489190620014d7565b6001600160a01b03166101a0816001600160a01b031660601b815250505050505050505050505050505050505050505050506000600019821490508015156101e081151560f81b81525050826001600160a01b03166101c0816001600160a01b031660601b81525050620003c483600262000ce360201b60201c565b620003d183600362000ce3565b8015620003eb57620003e583600062000ce3565b620004aa565b60405163178b2b9360e21b81526200047f906001600160a01b03851690635e2cae4c906200041f9060009060040162001753565b60206040518083038186803b1580156200043857600080fd5b505afa1580156200044d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004739190620014be565b83111561025862000c29565b600060008051602062007a1183398151915283604051620004a1919062001753565b60405180910390a25b80620004b75781620004ba565b60005b6102005250620004d3915050600883111560c962000c29565b620004eb82825162000e8e60201b6200145d1760201c565b620004f68162000e9d565b151560f81b61032052805181906000906200050d57fe5b60200260200101516001600160a01b0316610220816001600160a01b031660601b81525050806001815181106200054057fe5b60200260200101516001600160a01b0316610240816001600160a01b031660601b8152505060028211620005765760006200058d565b806002815181106200058457fe5b60200260200101515b60601b6001600160601b0319166102605260038211620005af576000620005c6565b80600381518110620005bd57fe5b60200260200101515b60601b6001600160601b0319166102805260048211620005e8576000620005ff565b80600481518110620005f657fe5b60200260200101515b60601b6001600160601b0319166102a052600582116200062157600062000638565b806005815181106200062f57fe5b60200260200101515b60601b6001600160601b0319166102c052600682116200065a57600062000671565b806006815181106200066857fe5b60200260200101515b60601b6001600160601b0319166102e0526007821162000693576000620006aa565b80600781518110620006a157fe5b60200260200101515b6001600160a01b0316610300816001600160a01b031660601b81525050505060008660400151519050620006ef8188606001515162000e8e60201b6200145d1760201c565b6103408190526000805b828160ff1610156200076957600089606001518260ff16815181106200071b57fe5b6020026020010151905062000743662386f26fc1000082101561012e62000c2960201b60201c565b6200075d818462000ef960201b6200146a1790919060201c565b925050600101620006f9565b5062000782670de0b6b3a7640000821461013462000c29565b87604001516000815181106200079457fe5b60200260200101516001600160a01b0316610360816001600160a01b031660601b815250508760400151600181518110620007cb57fe5b60200260200101516001600160a01b0316610380816001600160a01b031660601b8152505060028211620008015760006200081c565b87604001516002815181106200081357fe5b60200260200101515b60601b6001600160601b0319166103a052600382116200083e57600062000859565b87604001516003815181106200085057fe5b60200260200101515b60601b6001600160601b0319166103c052600482116200087b57600062000896565b87604001516004815181106200088d57fe5b60200260200101515b60601b6001600160601b0319166103e05260058211620008b8576000620008d3565b8760400151600581518110620008ca57fe5b60200260200101515b60601b6001600160601b0319166104005260068211620008f557600062000910565b87604001516006815181106200090757fe5b60200260200101515b60601b6001600160601b0319166104205260078211620009325760006200094d565b87604001516007815181106200094457fe5b60200260200101515b6001600160a01b0316610440816001600160a01b031660601b815250506200099488604001516000815181106200098057fe5b602002602001015162000f1660201b60201c565b6104605260408801518051620009b1919060019081106200098057fe5b6104805260028211620009c6576000620009dc565b620009dc88604001516002815181106200098057fe5b6104a05260038211620009f157600062000a07565b62000a0788604001516003815181106200098057fe5b6104c0526004821162000a1c57600062000a32565b62000a3288604001516004815181106200098057fe5b6104e0526005821162000a4757600062000a5d565b62000a5d88604001516005815181106200098057fe5b610500526006821162000a7257600062000a88565b62000a8888604001516006815181106200098057fe5b610520526007821162000a9d57600062000ab3565b62000ab388604001516007815181106200098057fe5b610540526060880151805160009062000ac857fe5b60200260200101516105608181525050876060015160018151811062000aea57fe5b602002602001015161058081815250506002821162000b0b57600062000b26565b876060015160028151811062000b1d57fe5b60200260200101515b6105a0526003821162000b3b57600062000b56565b876060015160038151811062000b4d57fe5b60200260200101515b6105c0526004821162000b6b57600062000b86565b876060015160048151811062000b7d57fe5b60200260200101515b6105e0526005821162000b9b57600062000bb6565b876060015160058151811062000bad57fe5b60200260200101515b610600526006821162000bcb57600062000be6565b876060015160068151811062000bdd57fe5b60200260200101515b610620526007821162000bfb57600062000c16565b876060015160078151811062000c0d57fe5b60200260200101515b6106405250620017c59650505050505050565b8162000c3a5762000c3a8162000fe5565b5050565b600890565b8062000c3a8162000ffa565b62000c6862000c5d62001086565b82101560cb62000c29565b62000c8162000c766200108f565b82111560ca62000c29565b62000ca38160c0603f6008546200109b60201b6200147c17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc9062000cd890839062001753565b60405180910390a150565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c32639062000d1490859060040162001753565b60206040518083038186803b15801562000d2d57600080fd5b505afa15801562000d42573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d689190620014be565b90508162000dac5762000d8681620010c060201b6200149f1760201c565b600980546001600160401b0319166001600160401b039290921691909117905562000e60565b600282141562000e025762000dcc81620010c060201b6200149f1760201c565b600980546001600160401b03929092166801000000000000000002600160401b600160801b031990921691909117905562000e60565b600382141562000e535762000e2281620010c060201b6200149f1760201c565b600980546001600160401b0392909216600160801b02600160801b600160c01b031990921691909117905562000e60565b62000e606101bb62000fe5565b8160008051602062007a118339815191528260405162000e81919062001753565b60405180910390a2505050565b62000c3a828214606762000c29565b6000805b825181101562000eee5760006001600160a01b031683828151811062000ec357fe5b60200260200101516001600160a01b03161462000ee557600091505062000ef4565b60010162000ea1565b50600190505b919050565b600082820162000f0d848210158362000c29565b90505b92915050565b60006001600160a01b03821630141562000f3a5750670de0b6b3a764000062000ef4565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801562000f7657600080fd5b505afa15801562000f8b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fb191906200167f565b60ff169050600062000fd0601283620010de60201b620014bc1760201c565b600a0a670de0b6b3a764000002949350505050565b62000ff7816210905360ea1b620010f6565b50565b6002815110156200100b5762000ff7565b6000816000815181106200101b57fe5b602002602001015190506000600190505b8251811015620010815760008382815181106200104557fe5b6020026020010151905062001076816001600160a01b0316846001600160a01b031610606562000c2960201b60201c565b91506001016200102c565b505050565b64e8d4a5100090565b67016345785d8a000090565b6000620010aa84848462001157565b506001901b60001901811b1992909216911b1790565b6000620010da6001600160401b038311156101ba62000c29565b5090565b6000620010f083831115600162000c29565b50900390565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b620011686101008310606462000c29565b620011a1600182101580156200119957506200119560ff8461010003620011b260201b620014d21760201c565b8211155b606462000c29565b6200108183821c156101b462000c29565b6000818310620011c3578162000f0d565b5090919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200120d57805160ff19168380011785556200123d565b828001600101855582156200123d579182015b828111156200123d57825182559160200191906001019062001220565b50620010da9291505b80821115620010da576000815560010162001246565b805162000f1081620017af565b600082601f8301126200127a578081fd5b8151620012916200128b8262001783565b6200175c565b818152915060208083019084810181840286018201871015620012b357600080fd5b60005b84811015620012df578151620012cc81620017af565b84529282019290820190600101620012b6565b505050505092915050565b600082601f830112620012fb578081fd5b81516200130c6200128b8262001783565b8181529150602080830190848101818402860182018710156200132e57600080fd5b60005b84811015620012df5781516200134781620017af565b8452928201929082019060010162001331565b600082601f8301126200136b578081fd5b81516200137c6200128b8262001783565b8181529150602080830190848101818402860182018710156200139e57600080fd5b60005b84811015620012df578151620013b781620017af565b84529282019290820190600101620013a1565b600082601f830112620013db578081fd5b8151620013ec6200128b8262001783565b8181529150602080830190848101818402860182018710156200140e57600080fd5b60005b84811015620012df5781518452928201929082019060010162001411565b600082601f83011262001440578081fd5b81516001600160401b0381111562001456578182fd5b60206200146c601f8301601f191682016200175c565b925081835284818386010111156200148357600080fd5b60005b82811015620014a357848101820151848201830152810162001486565b82811115620014b55760008284860101525b50505092915050565b600060208284031215620014d0578081fd5b5051919050565b600060208284031215620014e9578081fd5b815162000f0d81620017af565b60008060008060008060c087890312156200150f578182fd5b86516001600160401b038082111562001526578384fd5b9088019060e0828b0312156200153a578384fd5b6200154660e06200175c565b82518281111562001555578586fd5b620015638c8286016200142f565b82525060208301518281111562001578578586fd5b620015868c8286016200142f565b6020830152506040830151828111156200159e578586fd5b620015ac8c828601620012ea565b604083015250606083015182811115620015c4578586fd5b620015d28c828601620013ca565b606083015250608083015182811115620015ea578586fd5b620015f88c8286016200135a565b60808301525060a08301518281111562001610578586fd5b6200161e8c82860162001269565b60a08301525060c083015160c08201528098505050506200164388602089016200125c565b94506200165488604089016200125c565b93506060870151925060808701519150620016738860a089016200125c565b90509295509295509295565b60006020828403121562001691578081fd5b815160ff8116811462000f0d578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b81811015620016ee57620016db8551620017a3565b83529383019391830191600101620016c6565b505084810360408601528551808252908201925081860190845b8181101562001730576200171d8351620017a3565b8552938301939183019160010162001708565b509298975050505050505050565b60208101600383106200174d57fe5b91905290565b90815260200190565b6040518181016001600160401b03811182821017156200177b57600080fd5b604052919050565b60006001600160401b0382111562001799578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b038116811462000ff757600080fd5b60805160a05160c05160e0516101005160601c6101205160601c6101405161016051610180516101a05160601c6101c05160601c6101e05160f81c610200516102205160601c6102405160601c6102605160601c6102805160601c6102a05160601c6102c05160601c6102e05160601c6103005160601c6103205160f81c610340516103605160601c6103805160601c6103a05160601c6103c05160601c6103e05160601c6104005160601c6104205160601c6104405160601c61046051610480516104a0516104c0516104e05161050051610520516105405161056051610580516105a0516105c0516105e051610600516106205161064051615fa462001a6d6000398061232352806135a55250806122e0528061354452508061229d52806134e352508061225a528061348252508061221752806134215250806121d452806133c0525080612191528061335f52508061215752806132fe525080612bab525080612b87525080612b63525080612b3f525080612b1b525080612af7525080612ad3525080612aaf525080612616528061356a5250806125d4528061350952508061259252806134a8525080612550528061344752508061250e52806133e65250806124cc528061338552508061248a528061332452508061244852806132c352508061199f52508061385e525080610a585280613abf525080610a015280613a735250806109aa5280613a2752508061095352806139db5250806108fc528061398f525080610897528061392e52508061084052806138dd5250806107f2528061389f525080610c6b52508061073c5250806106bc52806106e7528061071252508061122c525080610b585250806117e45250806117c0525080610f46525080610f22525080610e705250806129355250806129775250806129565250615fa46000f3fe608060405234801561001057600080fd5b50600436106103155760003560e01c80637ecebe00116101a7578063aaabadc5116100ee578063d505accf11610097578063ddf4627b11610071578063ddf4627b146105dc578063ed24911d146105e4578063f89f27ed146105ec57610315565b8063d505accf146105a3578063d5c096c4146105b6578063dd62ed3e146105c957610315565b8063b7b814fc116100c8578063b7b814fc1461058b578063c0ff1a1514610593578063d2946c2b1461059b57610315565b8063aaabadc514610573578063b10962781461057b578063b35056b81461058357610315565b80638d928af8116101505780639d2c110c1161012a5780639d2c110c1461053a578063a457c2d71461054d578063a9059cbb1461056057610315565b80638d928af81461051757806390193b7c1461051f57806395d89b411461053257610315565b8063876f303b11610181578063876f303b146104e757806387ec6817146104ef578063893d20e81461050257610315565b80637ecebe00146104b95780638456cb59146104cc578063851c1bb3146104d457610315565b80633644e5151161026b57806354a844ba1161021457806370464016116101ee578063704640161461047257806370a082311461048557806374f3b0091461049857610315565b806354a844ba1461044157806355c67628146104495780636028bfd41461045157610315565b8063395093511161024557806339509351146104135780633f4ba83a1461042657806350dd6ed91461042e57610315565b80633644e515146103f057806338e9922e146103f857806338fff2d01461040b57610315565b80631c0de051116102cd57806323b872dd116102a757806323b872dd146103c057806323ef89ed146103d3578063313ce567146103db57610315565b80631c0de0511461037f5780631dd746ea14610396578063238a2d59146103ab57610315565b80630da0669c116102fe5780630da0669c1461035857806315b0015b1461036257806318160ddd1461036a57610315565b806306fdde031461031a578063095ea7b314610338575b600080fd5b6103226105f4565b60405161032f9190615ec9565b60405180910390f35b61034b610346366004615652565b61068b565b60405161032f9190615dd0565b6103606106a2565b005b61034b61073a565b61037261075e565b60405161032f9190615df3565b610387610764565b60405161032f93929190615ddb565b61039e61078d565b60405161032f9190615d98565b6103b361079c565b60405161032f9190615d4b565b61034b6103ce3660046155a2565b610aab565b610372610b21565b6103e3610b27565b60405161032f9190615ef5565b610372610b30565b610360610406366004615b83565b610b3a565b610372610b56565b61034b610421366004615652565b610b7a565b610360610bb5565b61036061043c3660046158c2565b610bc7565b610360610be5565b610372610bf7565b61046461045f366004615769565b610c0a565b60405161032f929190615edc565b610372610480366004615b83565b610c41565b61037261049336600461554e565b610d0c565b6104ab6104a6366004615769565b610d27565b60405161032f929190615dab565b6103726104c736600461554e565b610e4f565b610360610e5a565b6103726104e2366004615866565b610e6c565b610372610ebe565b6104646104fd366004615769565b610efa565b61050a610f20565b60405161032f9190615d37565b61050a610f44565b61037261052d36600461554e565b610f68565b610322610f83565b610372610548366004615a87565b610fe4565b61034b61055b366004615652565b6110dd565b61034b61056e366004615652565b61111b565b61050a611128565b610372611132565b61034b61114a565b61036061115b565b61037261116d565b61050a61122a565b6103606105b13660046155e2565b61124e565b6104ab6105c4366004615769565b6112d9565b6103726105d736600461556a565b6113fc565b610372611439565b61037261143f565b61039e611449565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106805780601f1061065557610100808354040283529160200191610680565b820191906000526020600020905b81548152906001019060200180831161066357829003601f168201915b505050505090505b90565b60006106983384846114e8565b5060015b92915050565b6106aa611550565b6106b261073a565b156106e2576106e27f000000000000000000000000000000000000000000000000000000000000000060006115b1565b61070d7f000000000000000000000000000000000000000000000000000000000000000060026115b1565b6107387f000000000000000000000000000000000000000000000000000000000000000060036115b1565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b60008060006107716117a1565b15925061077c6117be565b91506107866117e2565b9050909192565b6060610797611806565b905090565b606060006107a861199d565b905060608167ffffffffffffffff811180156107c357600080fd5b506040519080825280602002602001820160405280156107ed578160200160208202803683370190505b5090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061081e57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061086c57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060028211156108e8577f0000000000000000000000000000000000000000000000000000000000000000816002815181106108c357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506108f1565b91506106889050565b60038211156108e8577f00000000000000000000000000000000000000000000000000000000000000008160038151811061092857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060048211156108e8577f00000000000000000000000000000000000000000000000000000000000000008160048151811061097f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060058211156108e8577f0000000000000000000000000000000000000000000000000000000000000000816005815181106109d657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060068211156108e8577f000000000000000000000000000000000000000000000000000000000000000081600681518110610a2d57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060078211156108e8577f000000000000000000000000000000000000000000000000000000000000000081600781518110610a8457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b91505090565b600080610ab885336113fc565b9050610adc336001600160a01b0387161480610ad45750838210155b61019e6119c1565b610ae78585856119cf565b336001600160a01b03861614801590610b0257506000198114155b15610b1457610b1485338584036114e8565b60019150505b9392505050565b600a5490565b60055460ff1690565b600061079761143f565b610b42611aaf565b610b4a611af5565b610b5381611b08565b50565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610698918590610bb0908661146a565b6114e8565b610bbd611aaf565b6107386000611b81565b610bcf611aaf565b610bd7611af5565b610be18282611c12565b5050565b610bed611aaf565b6107386001611d20565b6008546000906107979060c0603f611d77565b60006060610c208651610c1b61199d565b61145d565b610c3589898989898989611d86611de8611e57565b97509795505050505050565b6000610c4b61114a565b15610c5857506000610d07565b81610ca457610c6561073a565b610c8f577f0000000000000000000000000000000000000000000000000000000000000000610c9d565b60095467ffffffffffffffff165b9050610d07565b6002821415610ccc575060095468010000000000000000900467ffffffffffffffff16610d07565b6003821415610cfc5750600954700100000000000000000000000000000000900467ffffffffffffffff16610d07565b610d076101bb611fee565b919050565b6001600160a01b031660009081526020819052604090205490565b60608088610d51610d36610f44565b6001600160a01b0316336001600160a01b03161460cd6119c1565b610d66610d5c610b56565b82146101f46119c1565b60606000610d7386612018565b15610d9b57610d80612047565b610d9289610d8c61075e565b8861205a565b92509050610ded565b610da3612086565b6060610dad611806565b9050610db98a8261208e565b610ddd8d8d8d8d8d610dc961114a565b610dd3578d610dd6565b60005b878e611d86565b93509150610deb8382611de8565b505b610df78b826120f7565b81895167ffffffffffffffff81118015610e1057600080fd5b50604051908082528060200260200182016040528015610e3a578160200160208202803683370190505b509450945050505b5097509795505050505050565b600061069c82610f68565b610e62611aaf565b6107386001611b81565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610ea1929190615cc1565b604051602081830303815290604052805190602001209050919050565b600080610ec961075e565b90506000610ee6610ed861116d565b610ee0612101565b8461234f565b509050610ef3828261146a565b9250505090565b60006060610f0b8651610c1b61199d565b610c35898989898989896123926123db611e57565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106805780601f1061065557610100808354040283529160200191610680565b60008360800151610ff6610d36610f44565b611001610d5c610b56565b611009612086565b60006110188660200151612444565b905060006110298760400151612444565b90506110358683612661565b95506110418582612661565b945060008751600181111561105257fe5b141561109e57611065876060015161266d565b606088018190526110769083612661565b6060880152600061108888888861268e565b905061109481836126c1565b94505050506110d5565b6110ac876060015182612661565b606088015260006110be8888886126cd565b90506110ca81846126f8565b905061109481612704565b509392505050565b6000806110ea33856113fc565b9050808310611104576110ff338560006114e8565b611111565b61111133858584036114e8565b5060019392505050565b60006106983384846119cf565b6000610797612720565b6000610797600060c061114361279a565b9190611d77565b6008546000906107979060ff6127a0565b611163611aaf565b6107386000611d20565b60006060611179610f44565b6001600160a01b031663f94d466861118f610b56565b6040518263ffffffff1660e01b81526004016111ab9190615df3565b60006040518083038186803b1580156111c357600080fd5b505afa1580156111d7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111ff919081019061567d565b509150506112148161120f611806565b61208e565b606061121e612101565b9050610ef381836127aa565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861127d8c610f68565b8960405160200161129396959493929190615e1b565b6040516020818303038152906040528051906020012090506112c488826112bb87878761281c565b886101f861285b565b6112cf8888886114e8565b5050505050505050565b606080886112e8610d36610f44565b6112f3610d5c610b56565b6112fb612086565b6060611305611806565b905061130f61075e565b6113bc57600060606113248d8d8d868b6128b2565b9150915061133d6113336128f5565b83101560cc6119c1565b61134f600061134a6128f5565b6128fc565b6113628b61135b6128f5565b84036128fc565b61136c81846123db565b808a5167ffffffffffffffff8111801561138557600080fd5b506040519080825280602002602001820160405280156113af578160200160208202803683370190505b5095509550505050610e42565b6113c6888261208e565b600060606113ee8d8d8d8d8d6113da61114a565b6113e4578d6113e7565b60005b898e612392565b915091506113628b836128fc565b6000611406610f44565b6001600160a01b0316826001600160a01b03161415611428575060001961069c565b6114328383612906565b905061069c565b60001981565b6000610797612931565b6060610797612101565b80610be1816129ce565b610be181831460676119c1565b6000828201610b1a84821015836119c1565b6000611489848484612a47565b506001901b60001901811b1992909216911b1790565b60006114b867ffffffffffffffff8311156101ba6119c1565b5090565b60006114cc8383111560016119c1565b50900390565b60008183106114e15781610b1a565b5090919050565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611543908590615df3565b60405180910390a3505050565b611558611af5565b600061156261116d565b905060008061158083611573612101565b61157b61075e565b61234f565b909250905081156115945761159482612a8e565b61159d83612a9f565b80156115ac576115ac81612aa8565b505050565b6040517f1a7c32630000000000000000000000000000000000000000000000000000000081526000906001600160a01b03841690631a7c3263906115f9908590600401615df3565b60206040518083038186803b15801561161157600080fd5b505afa158015611625573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116499190615b9b565b905081611697576116598161149f565b600980547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055611764565b60028214156116f4576116a98161149f565b6009805467ffffffffffffffff9290921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055611764565b6003821415611759576117068161149f565b6009805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff909216919091179055611764565b6117646101bb611fee565b817f6bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a826040516117949190615df3565b60405180910390a2505050565b60006117ab6117e2565b42118061079757505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6060600061181261199d565b905060608167ffffffffffffffff8111801561182d57600080fd5b50604051908082528060200260200182016040528015611857578160200160208202803683370190505b509050611862612aad565b8160008151811061186f57fe5b602002602001018181525050611883612ad1565b8160018151811061189057fe5b60200260200101818152505060028211156108e8576118ad612af5565b816002815181106118ba57fe5b60200260200101818152505060038211156108e8576118d7612b19565b816003815181106118e457fe5b60200260200101818152505060048211156108e857611901612b3d565b8160048151811061190e57fe5b60200260200101818152505060058211156108e85761192b612b61565b8160058151811061193857fe5b60200260200101818152505060068211156108e857611955612b85565b8160068151811061196257fe5b60200260200101818152505060078211156108e85761197f612ba9565b8160078151811061198c57fe5b602002602001018181525050610aa5565b7f000000000000000000000000000000000000000000000000000000000000000090565b81610be157610be181611fee565b6119e66001600160a01b03841615156101986119c1565b6119fd6001600160a01b03831615156101996119c1565b611a088383836115ac565b6001600160a01b038316600090815260208190526040902054611a2e90826101a0612bcd565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611a5d908261146a565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611543908590615df3565b6000611ade6000357fffffffff0000000000000000000000000000000000000000000000000000000016610e6c565b9050610b53611aed8233612be3565b6101916119c1565b610738611b006117a1565b6101926119c1565b611b1d611b13612ccc565b82101560cb6119c1565b611b32611b28612cd5565b82111560ca6119c1565b600854611b43908260c0603f61147c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611b76908390615df3565b60405180910390a150565b8015611ba157611b9c611b926117be565b42106101936119c1565b611bb6565b611bb6611bac6117e2565b42106101a96119c1565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611b76908390615dd0565b6000611c1c610b56565b90506000611c28610f44565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b8152600401611c55929190615e94565b60806040518083038186803b158015611c6d57600080fd5b505afa158015611c81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca59190615bb3565b6040517f18e736d40000000000000000000000000000000000000000000000000000000081529094506001600160a01b03851693506318e736d49250611cf2915085908790600401615e7b565b600060405180830381600087803b158015611d0c57600080fd5b505af11580156112cf573d6000803e3d6000fd5b600854611d2f908260ff612ce1565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611d62908390615dd0565b60405180910390a180610b5357610b53612d08565b6001901b6000190191901c1690565b6000606080611d93612101565b9050600080611da28a84612d50565b9150915060006060611db88e8d878c888d612db6565b9092509050611dd4838d838888611dcf81896114bc565b612e49565b909e909d509b505050505050505050505050565b81518151611df790829061145d565b60005b81811015611e5157611e32848281518110611e1157fe5b6020026020010151848381518110611e2557fe5b6020026020010151612e73565b848281518110611e3e57fe5b6020908102919091010152600101611dfa565b50505050565b333014611f46576000306001600160a01b0316600036604051611e7b929190615cf1565b6000604051808303816000865af19150503d8060008114611eb8576040519150601f19603f3d011682016040523d82523d6000602084013e611ebd565b606091505b505090508060008114611ecc57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611f28573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b611f4e612086565b6060611f58611806565b9050611f64878261208e565b60006060611f7c8c8c8c8c8c8c898d8d63ffffffff16565b91509150611f8e81848663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08301526020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b610b53817f42414c0000000000000000000000000000000000000000000000000000000000612ec4565b600080825111801561069c575060ff80168280602001905181019061203d9190615bf3565b60ff161492915050565b61073861205261114a565b6101b66119c1565b60006060600061206984612f3f565b90506060612078878784612f55565b919791965090945050505050565b610738611af5565b8151815161209d90829061145d565b60005b81811015611e51576120d88482815181106120b757fe5b60200260200101518483815181106120cb57fe5b6020026020010151613004565b8482815181106120e457fe5b60209081029190910101526001016120a0565b610be1828261303a565b6060600061210d61199d565b905060608167ffffffffffffffff8111801561212857600080fd5b50604051908082528060200260200182016040528015612152578160200160208202803683370190505b5090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061218357fe5b6020026020010181815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106121bd57fe5b60200260200101818152505060028211156108e8577f00000000000000000000000000000000000000000000000000000000000000008160028151811061220057fe5b60200260200101818152505060038211156108e8577f00000000000000000000000000000000000000000000000000000000000000008160038151811061224357fe5b60200260200101818152505060048211156108e8577f00000000000000000000000000000000000000000000000000000000000000008160048151811061228657fe5b60200260200101818152505060058211156108e8577f0000000000000000000000000000000000000000000000000000000000000000816005815181106122c957fe5b60200260200101818152505060068211156108e8577f00000000000000000000000000000000000000000000000000000000000000008160068151811061230c57fe5b60200260200101818152505060078211156108e8577f00000000000000000000000000000000000000000000000000000000000000008160078151811061198c57fe5b6000806000612367866123626000610c41565b613106565b90506000806123758761312c565b915091506123858683850161319c565b9890975095505050505050565b600060608061239f612101565b90506000806123ae8a84612d50565b91509150600060606123c48e8d878c888d6131b9565b9092509050611dd4838d838888611dcf818961146a565b815181516123ea90829061145d565b60005b81811015611e515761242584828151811061240457fe5b602002602001015184838151811061241857fe5b6020026020010151613235565b84828151811061243157fe5b60209081029190910101526001016123ed565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561248857610c9d612aad565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156124ca57610c9d612ad1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561250c57610c9d612af5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561254e57610c9d612b19565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561259057610c9d612b3d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156125d257610c9d612b61565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561261457610c9d612b85565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561265657610c9d612ba9565b610d07610135611fee565b6000610b1a8383613004565b60008061268261267b610bf7565b8490613283565b9050610b1a83826114bc565b60006126b9836126a186602001516132bf565b846126af88604001516132bf565b88606001516135c9565b949350505050565b6000610b1a8383612e73565b60006126b9836126e086602001516132bf565b846126ee88604001516132bf565b8860600151613644565b6000610b1a8383613235565b600061069c612719612714610bf7565b6136ba565b8390613235565b600061272a610f44565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561276257600080fd5b505afa158015612776573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079791906158a6565b60085490565b1c60019081161490565b670de0b6b3a764000060005b835181101561280c576128026127fb8583815181106127d157fe5b60200260200101518584815181106127e557fe5b60200260200101516136e090919063ffffffff16565b8390613004565b91506001016127b6565b5061069c600082116101376119c1565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b600061286685613791565b905061287c6128768783876137ad565b836119c1565b61288b428410156101b86119c1565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606128be61385c565b6128da576128da6128d56128d0612101565b613880565b612aa8565b6128e78787878787613ae3565b915091509550959350505050565b620f424090565b610be18282613b73565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061299e613c06565b306040516020016129b3959493929190615e4f565b60405160208183030381529060405280519060200120905090565b6002815110156129dd57610b53565b6000816000815181106129ec57fe5b602002602001015190506000600190505b82518110156115ac576000838281518110612a1457fe5b60200260200101519050612a3d816001600160a01b0316846001600160a01b03161060656119c1565b91506001016129fd565b612a56610100831060646119c1565b612a7f60018210158015612a785750612a7460ff84610100036114d2565b8211155b60646119c1565b6115ac83821c156101b46119c1565b610b53612a9961122a565b826128fc565b610b5381613c0a565b600a55565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000612bdc84841115836119c1565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b612c02610f20565b6001600160a01b031614158015612c1d5750612c1d83613c2a565b15612c4557612c2a610f20565b6001600160a01b0316336001600160a01b031614905061069c565b612c4d612720565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b8152600401612c7c93929190615dfc565b60206040518083038186803b158015612c9457600080fd5b505afa158015612ca8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114329190615749565b64e8d4a5100090565b67016345785d8a000090565b60006001821b1984168284612cf7576000612cfa565b60015b60ff16901b17949350505050565b612d18612d1361116d565b612a9f565b612d2061385c565b610738576000612d2e610b21565b90506000612d3d6128d0612101565b905081811115610be157610be181612aa8565b6000806000612d5d61075e565b90506000612d6b85876127aa565b9050600080612d7b83888661234f565b90925090508015612d8f57612d8f81612aa8565b8115612d9e57612d9e82612a8e565b612da8848361146a565b989297509195505050505050565b600060606000612dc584613c8e565b90506000816003811115612dd557fe5b1415612df157612de788888787613ca4565b9250925050612e3e565b6001816003811115612dff57fe5b1415612e1057612de7888686613d73565b6002816003811115612e1e57fe5b1415612e3157612de78888888888613d91565b612e3c610150611fee565b505b965096945050505050565b6000612e59878787878787613df0565b90508015612e6a57612e6a81612a8e565b50505050505050565b6000612e8282151560046119c1565b82612e8f5750600061069c565b670de0b6b3a764000083810290612eb290858381612ea957fe5b041460056119c1565b828181612ebb57fe5b0491505061069c565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b600081806020019051810190610b1a9190615c0f565b60606000612f638385612e73565b9050845167ffffffffffffffff81118015612f7d57600080fd5b50604051908082528060200260200182016040528015612fa7578160200160208202803683370190505b50915060005b8551811015612ffb57612fdc82878381518110612fc657fe5b602002602001015161300490919063ffffffff16565b838281518110612fe857fe5b6020908102919091010152600101612fad565b50509392505050565b600082820261302884158061302157508385838161301e57fe5b04145b60036119c1565b670de0b6b3a764000090049392505050565b6130516001600160a01b038316151561019b6119c1565b61305d826000836115ac565b6001600160a01b03821660009081526020819052604090205461308390826101b2612bcd565b6001600160a01b0383166000908152602081905260409020556130b66130b1826130ab61075e565b90613ee9565b613ef7565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516130fa9190615df3565b60405180910390a35050565b6000610b1a61311d613116611132565b8590612e73565b670de0b6b3a764000084613efc565b60008061313761385c565b1561314757506000905080613197565b600a54600061315585613880565b905081811161316c57600080935093505050613197565b6131916131798284612e73565b670de0b6b3a764000061318c6002610c41565b613efc565b93509150505b915091565b6000610b1a6131ab8484613f43565b6131b4846136ba565b613f5d565b6000606060006131c884613f7d565b905060018160048111156131d857fe5b14156131eb57612de78888888888613f93565b60028160048111156131f957fe5b141561320b57612de788888787613fe3565b600381600481111561321957fe5b141561322a57612de7888686614041565b612e3c610136611fee565b600061324482151560046119c1565b826132515750600061069c565b670de0b6b3a76400008381029061326b90858381612ea957fe5b82600182038161327757fe5b0460010191505061069c565b600082820261329d84158061302157508385838161301e57fe5b806132ac57600091505061069c565b670de0b6b3a76400006000198201613277565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561332257507f0000000000000000000000000000000000000000000000000000000000000000610d07565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561338357507f0000000000000000000000000000000000000000000000000000000000000000610d07565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156133e457507f0000000000000000000000000000000000000000000000000000000000000000610d07565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561344557507f0000000000000000000000000000000000000000000000000000000000000000610d07565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156134a657507f0000000000000000000000000000000000000000000000000000000000000000610d07565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561350757507f0000000000000000000000000000000000000000000000000000000000000000610d07565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561356857507f0000000000000000000000000000000000000000000000000000000000000000610d07565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561265657507f0000000000000000000000000000000000000000000000000000000000000000610d07565b60006135eb6135e087670429d069189e0000613004565b8311156101306119c1565b60006135f7878461146a565b905060006136058883613235565b905060006136138887612e73565b90506000613621838361405f565b905061363661362f826136ba565b8990613004565b9a9950505050505050505050565b600061366661365b85670429d069189e0000613004565b8311156101316119c1565b600061367c61367586856114bc565b8690613235565b9050600061368a8588613235565b90506000613698838361405f565b905060006136ae82670de0b6b3a76400006114bc565b90506136368a82613283565b6000670de0b6b3a764000082106136d257600061069c565b50670de0b6b3a76400000390565b6000670de0b6b3a76400008214156136f957508161069c565b671bc16d674ec80000821415613713576114328384613004565b673782dace9d90000082141561374357600061372f8485613004565b905061373b8182613004565b91505061069c565b600061374f84846140e5565b9050600061376961376283612710613283565b600161146a565b90508082101561377e5760009250505061069c565b61378882826114bc565b9250505061069c565b600061379b612931565b82604051602001610ea1929190615d01565b60006137bf82516041146101b96119c1565b60208281015160408085015160608601518251600080825295019283905292939092811a916001906137f8908990859088908890615eab565b6020604051602081039080840390855afa15801561381a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906138505750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b8051600090816139066138c385838561389557fe5b60200260200101517f00000000000000000000000000000000000000000000000000000000000000006141fb565b613901866001815181106138d357fe5b60200260200101517f00000000000000000000000000000000000000000000000000000000000000006141fb565b613004565b90506002821115613960576139596139528560028151811061392457fe5b60200260200101517f00000000000000000000000000000000000000000000000000000000000000006141fb565b8290613004565b9050613969565b9150610d079050565b6003821115613960576139b36139528560038151811061398557fe5b60200260200101517f00000000000000000000000000000000000000000000000000000000000000006141fb565b90506004821115613960576139ff613952856004815181106139d157fe5b60200260200101517f00000000000000000000000000000000000000000000000000000000000000006141fb565b9050600582111561396057613a4b61395285600581518110613a1d57fe5b60200260200101517f00000000000000000000000000000000000000000000000000000000000000006141fb565b9050600682111561396057613a9761395285600681518110613a6957fe5b60200260200101517f00000000000000000000000000000000000000000000000000000000000000006141fb565b90506007821115610b1a576126b961395285600781518110613ab557fe5b60200260200101517f00000000000000000000000000000000000000000000000000000000000000006141fb565b600060606000613af284613f7d565b9050613b0d6000826004811115613b0557fe5b1460ce6119c1565b6060613b188561429c565b9050613b268151875161145d565b613b30818761208e565b6060613b3a612101565b90506000613b4882846127aa565b90506000613b57828551613f43565b9050613b6282612a9f565b9b929a509198505050505050505050565b613b7f600083836115ac565b613b946130b182613b8e61075e565b9061146a565b6001600160a01b038216600090815260208190526040902054613bb7908261146a565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906130fa908590615df3565b4690565b610b53613c2582600060c0613c1d61279a565b92919061147c565b6142b2565b6000613c557f38e9922e00000000000000000000000000000000000000000000000000000000610e6c565b82148061069c5750613c867f50dd6ed900000000000000000000000000000000000000000000000000000000610e6c565b909114919050565b60008180602001905181019061069c9190615910565b60006060600080613cb4856142c7565b91509150613cc68851821060646119c1565b6000613d02898381518110613cd757fe5b6020026020010151898481518110613ceb57fe5b6020026020010151858a613cfd610bf7565b6142e9565b90506060895167ffffffffffffffff81118015613d1e57600080fd5b50604051908082528060200260200182016040528015613d48578160200160208202803683370190505b50905081818481518110613d5857fe5b60209081029190910101529299929850919650505050505050565b600060606000613d828461439f565b905060606120788783886143b5565b60006060806000613da185614451565b91509150613db182518a5161145d565b613dbb828861208e565b6000613dd18a8a858a613dcc610bf7565b614469565b9050613de18282111560cf6119c1565b99919850909650505050505050565b600082821015815b8751811015613e8a5781613e3b57613e36888281518110613e1557fe5b6020026020010151888381518110613e2957fe5b6020026020010151613ee9565b613e6b565b613e6b888281518110613e4a57fe5b6020026020010151888381518110613e5e57fe5b602002602001015161146a565b888281518110613e7757fe5b6020908102919091010152600101613df8565b506000613e9786896127aa565b90506000613ea56000610c41565b9050613eb082612a9f565b80613ec15760009350505050613edf565b6000613ed8613ed0848d612e73565b8888856145a7565b9450505050505b9695505050505050565b6000610b1a83836001612bcd565b600255565b60008383101580613f0b575081155b15613f1857506000610b1a565b6000613f248486612e73565b670de0b6b3a7640000039050613f3a8184613004565b95945050505050565b6000828202610b1a84158061302157508385838161301e57fe5b6000613f6c82151560046119c1565b818381613f7557fe5b049392505050565b60008180602001905181019061069c91906159d1565b60006060806000613fa3856145ca565b91509150613fb38951835161145d565b613fbd828861208e565b6000613fd38a8a858a613fce610bf7565b6145e2565b9050613de18282101560d06119c1565b60006060600080613ff38561471d565b915091506140058851821060646119c1565b6000613d0289838151811061401657fe5b602002602001015189848151811061402a57fe5b6020026020010151858a61403c610bf7565b614734565b600060606000614050846147ca565b905060606120788783886147e0565b6000670de0b6b3a764000082141561407857508161069c565b671bc16d674ec80000821415614092576114328384613283565b673782dace9d9000008214156140ba5760006140ae8485613283565b905061373b8182613283565b60006140c684846140e5565b905060006140d961376283612710613283565b9050613788828261146a565b6000816140fb5750670de0b6b3a764000061069c565b826141085750600061069c565b61411860ff84901c1560066119c1565b8261413e770bce5086492111aea88f4bb1ca6bcf584181ea8059f76532841060076119c1565b826000670c7d713b49da00008313801561415f5750670f43fc2c04ee000083125b1561419657600061416f84614872565b9050670de0b6b3a764000080820784020583670de0b6b3a7640000830502019150506141a4565b816141a0846149a9565b0290505b670de0b6b3a764000090056141f27ffffffffffffffffffffffffffffffffffffffffffffffffdc702bd3a30fc000082128015906141eb575068070c1cc73b00c800008213155b60086119c1565b613edf81614d49565b60006001600160a01b0382161561428c5761428783836001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b15801561424957600080fd5b505afa15801561425d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142819190615b9b565b906136e0565b610b1a565b50670de0b6b3a764000092915050565b606081806020019051810190610b1a91906159ec565b6008546142c190826000615219565b60085550565b600080828060200190518101906142de919061599c565b909590945092505050565b600080614300846142fa81886114bc565b90613235565b90506143196709b6e64a8ec600008210156101326119c1565b6000614337614330670de0b6b3a764000089612e73565b839061405f565b9050600061434e614347836136ba565b8a90613004565b9050600061436561435e8a6136ba565b8390613283565b9050600061437383836114bc565b9050600061438361267b896136ba565b905061438f828261146a565b9c9b505050505050505050505050565b600081806020019051810190610b1a9190615970565b606060006143c38484612e73565b90506060855167ffffffffffffffff811180156143df57600080fd5b50604051908082528060200260200182016040528015614409578160200160208202803683370190505b50905060005b86518110156144475761442883888381518110612fc657fe5b82828151811061443457fe5b602090810291909101015260010161440f565b5095945050505050565b60606000828060200190518101906142de919061592b565b60006060845167ffffffffffffffff8111801561448557600080fd5b506040519080825280602002602001820160405280156144af578160200160208202803683370190505b5090506000805b88518110156145745761450f8982815181106144ce57fe5b60200260200101516142fa8984815181106144e557fe5b60200260200101518c85815181106144f957fe5b60200260200101516114bc90919063ffffffff16565b83828151811061451b57fe5b60200260200101818152505061456a61456389838151811061453957fe5b602002602001015185848151811061454d57fe5b602002602001015161328390919063ffffffff16565b839061146a565b91506001016144b6565b50600061458589898986868a615245565b905061459a614593826136ba565b8790613283565b9998505050505050505050565b6000806145be866145b88688612e73565b85613efc565b9050613edf848261319c565b60606000828060200190518101906142de9190615a2f565b60006060845167ffffffffffffffff811180156145fe57600080fd5b50604051908082528060200260200182016040528015614628578160200160208202803683370190505b5090506000805b88518110156146d65761468e89828151811061464757fe5b602002602001015161468889848151811061465e57fe5b60200260200101518c858151811061467257fe5b602002602001015161146a90919063ffffffff16565b90612e73565b83828151811061469a57fe5b6020026020010181815250506146cc6145638983815181106146b857fe5b6020026020010151858481518110612fc657fe5b915060010161462f565b5060006146e789898986868a615354565b90506000670de0b6b3a76400008211614701576000613636565b61363661471683670de0b6b3a76400006114bc565b8890613004565b600080828060200190518101906142de9190615a69565b600080614745846142fa818861146a565b905061475e6729a2241af62c00008211156101336119c1565b6000614775614330670de0b6b3a764000089613235565b9050600061479561478e83670de0b6b3a76400006114bc565b8a90613283565b905060006147a561435e8a6136ba565b905060006147b383836114bc565b905060006143836147c3896136ba565b8490613235565b600081806020019051810190610b1a9190615a4d565b606060006147ee8484613235565b90506060855167ffffffffffffffff8111801561480a57600080fd5b50604051908082528060200260200182016040528015614834578160200160208202803683370190505b50905060005b8651811015614447576148538388838151811061454d57fe5b82828151811061485f57fe5b602090810291909101015260010161483a565b670de0b6b3a7640000026000806ec097ce7bc90715b34b9f1000000000808401907fffffffffffffffffffffffffffffffffff3f68318436f8ea4cb460f000000000850102816148be57fe5b05905060006ec097ce7bc90715b34b9f100000000082800205905081806ec097ce7bc90715b34b9f100000000081840205915060038205016ec097ce7bc90715b34b9f100000000082840205915060058205016ec097ce7bc90715b34b9f100000000082840205915060078205016ec097ce7bc90715b34b9f100000000082840205915060098205016ec097ce7bc90715b34b9f1000000000828402059150600b8205016ec097ce7bc90715b34b9f1000000000828402059150600d8205016ec097ce7bc90715b34b9f1000000000828402059150600f826002919005919091010295945050505050565b6000670de0b6b3a76400008212156149e6576149dc826ec097ce7bc90715b34b9f1000000000816149d657fe5b056149a9565b6000039050610d07565b60007e1600ef3172e58d2e933ec884fde10064c63b5372d805e203c00000000000008312614a3757770195e54c5dd42177f53a27172fa9ec630262827000000000830592506806f05b59d3b2000000015b73011798004d755d3c8bc8e03204cf44619e0000008312614a6f576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff00840008312614ab7576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a7008312614af2576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf8508312614b2957693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e28312614b6057690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d038312614b955768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb417461211108312614bc057680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d8312614bf5576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f17757889379378312614c2a576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b2866038312614c5e576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac8312614c92576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b600068056bc75e2d63100000840168056bc75e2d631000008086030281614cb557fe5b059050600068056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b6000614d8e7ffffffffffffffffffffffffffffffffffffffffffffffffdc702bd3a30fc00008312158015614d87575068070c1cc73b00c800008313155b60096119c1565b6000821215614dc257614da382600003614d49565b6ec097ce7bc90715b34b9f100000000081614dba57fe5b059050610d07565b60006806f05b59d3b20000008312614e1857507ffffffffffffffffffffffffffffffffffffffffffffffff90fa4a62c4e00000090910190770195e54c5dd42177f53a27172fa9ec630262827000000000614e64565b6803782dace9d90000008312614e6057507ffffffffffffffffffffffffffffffffffffffffffffffffc87d2531627000000909101906b1425982cf597cd205cef7380614e64565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac620000008412614eca577fffffffffffffffffffffffffffffffffffffffffffffff5287143a539e0000009093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d6310000008412614f1c577fffffffffffffffffffffffffffffffffffffffffffffffa9438a1d29cf0000009093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b188000008412614f6c577fffffffffffffffffffffffffffffffffffffffffffffffd4a1c50e94e78000009093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c4000008412614fbc577fffffffffffffffffffffffffffffffffffffffffffffffea50e2874a73c000009093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac6200000841261500b577ffffffffffffffffffffffffffffffffffffffffffffffff5287143a539e000009093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d63100000841261505a577ffffffffffffffffffffffffffffffffffffffffffffffffa9438a1d29cf000009093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b188000084126150a9577ffffffffffffffffffffffffffffffffffffffffffffffffd4a1c50e94e7800009093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c4000084126150f8577ffffffffffffffffffffffffffffffffffffffffffffffffea50e2874a73c00009093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116821b90821b198416179392505050565b670de0b6b3a764000060005b875181101561534957600085828151811061526857fe5b60200260200101518511156152cb576000615291615285876136ba565b8b8581518110612fc657fe5b905060006152a5828a86815181106144f957fe5b905060006152b5612719886136ba565b90506152c1838261146a565b93505050506152e2565b8682815181106152d757fe5b602002602001015190505b600061530b8a84815181106152f357fe5b6020026020010151614688848d87815181106144f957fe5b905061533d6153368a858151811061531f57fe5b6020026020010151836136e090919063ffffffff16565b8590613004565b93505050600101615251565b509695505050505050565b670de0b6b3a764000060005b87518110156153495760008486838151811061537857fe5b602002602001015111156153df57600061539d61528587670de0b6b3a76400006114bc565b905060006153b1828a86815181106144f957fe5b905060006153bf8288613283565b90506153d56153ce83836114bc565b849061146a565b93505050506153f6565b8682815181106153eb57fe5b602002602001015190505b600061541f8a848151811061540757fe5b6020026020010151614688848d878151811061467257fe5b90506154336153368a858151811061531f57fe5b93505050600101615360565b803561069c81615f4a565b600082601f83011261545a578081fd5b815161546d61546882615f2a565b615f03565b81815291506020808301908481018184028601820187101561548e57600080fd5b60005b848110156154ad57815184529282019290820190600101615491565b505050505092915050565b600082601f8301126154c8578081fd5b813567ffffffffffffffff8111156154de578182fd5b6154f16020601f19601f84011601615f03565b915080825283602082850101111561550857600080fd5b8060208401602084013760009082016020015292915050565b80516004811061069c57600080fd5b80516005811061069c57600080fd5b80356002811061069c57600080fd5b60006020828403121561555f578081fd5b8135610b1a81615f4a565b6000806040838503121561557c578081fd5b823561558781615f4a565b9150602083013561559781615f4a565b809150509250929050565b6000806000606084860312156155b6578081fd5b83356155c181615f4a565b925060208401356155d181615f4a565b929592945050506040919091013590565b600080600080600080600060e0888a0312156155fc578283fd5b873561560781615f4a565b9650602088013561561781615f4a565b95506040880135945060608801359350608088013561563581615f5f565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215615664578182fd5b823561566f81615f4a565b946020939093013593505050565b600080600060608486031215615691578081fd5b835167ffffffffffffffff808211156156a8578283fd5b818601915086601f8301126156bb578283fd5b81516156c961546882615f2a565b80828252602080830192508086018b8283870289010111156156e9578788fd5b8796505b8487101561571457805161570081615f4a565b8452600196909601959281019281016156ed565b50890151909750935050508082111561572b578283fd5b506157388682870161544a565b925050604084015190509250925092565b60006020828403121561575a578081fd5b81518015158114610b1a578182fd5b600080600080600080600060e0888a031215615783578081fd5b8735965060208089013561579681615f4a565b965060408901356157a681615f4a565b9550606089013567ffffffffffffffff808211156157c2578384fd5b818b0191508b601f8301126157d5578384fd5b81356157e361546882615f2a565b8082825285820191508585018f878886028801011115615801578788fd5b8795505b83861015615823578035835260019590950194918601918601615805565b509850505060808b0135955060a08b0135945060c08b0135925080831115615849578384fd5b50506158578a828b016154b8565b91505092959891949750929550565b600060208284031215615877578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610b1a578182fd5b6000602082840312156158b7578081fd5b8151610b1a81615f4a565b600080604083850312156158d4578182fd5b82356158df81615f4a565b9150602083013567ffffffffffffffff8111156158fa578182fd5b615906858286016154b8565b9150509250929050565b600060208284031215615921578081fd5b610b1a8383615521565b60008060006060848603121561593f578081fd5b6159498585615521565b9250602084015167ffffffffffffffff811115615964578182fd5b6157388682870161544a565b60008060408385031215615982578182fd5b61598c8484615521565b9150602083015190509250929050565b6000806000606084860312156159b0578081fd5b6159ba8585615521565b925060208401519150604084015190509250925092565b6000602082840312156159e2578081fd5b610b1a8383615530565b600080604083850312156159fe578182fd5b615a088484615530565b9150602083015167ffffffffffffffff811115615a23578182fd5b6159068582860161544a565b600080600060608486031215615a43578081fd5b6159498585615530565b60008060408385031215615a5f578182fd5b61598c8484615530565b600080600060608486031215615a7d578081fd5b6159ba8585615530565b600080600060608486031215615a9b578081fd5b833567ffffffffffffffff80821115615ab2578283fd5b8186019150610120808389031215615ac8578384fd5b615ad181615f03565b9050615add888461553f565b8152615aec886020850161543f565b6020820152615afe886040850161543f565b6040820152606083013560608201526080830135608082015260a083013560a0820152615b2e8860c0850161543f565b60c0820152615b408860e0850161543f565b60e08201526101008084013583811115615b58578586fd5b615b648a8287016154b8565b9183019190915250976020870135975060409096013595945050505050565b600060208284031215615b94578081fd5b5035919050565b600060208284031215615bac578081fd5b5051919050565b60008060008060808587031215615bc8578182fd5b8451935060208501519250604085015191506060850151615be881615f4a565b939692955090935050565b600060208284031215615c04578081fd5b8151610b1a81615f5f565b60008060408385031215615c21578182fd5b8251615c2c81615f5f565b6020939093015192949293505050565b6000815180845260208085019450808401835b83811015615c6b57815187529582019590820190600101615c4f565b509495945050505050565b60008151808452815b81811015615c9b57602081850181015186830182015201615c7f565b81811115615cac5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b81811015615d8c5783516001600160a01b031683529284019291840191600101615d67565b50909695505050505050565b600060208252610b1a6020830184615c3c565b600060408252615dbe6040830185615c3c565b8281036020840152613f3a8185615c3c565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000838252604060208301526126b96040830184615c76565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610b1a6020830184615c76565b6000838252604060208301526126b96040830184615c3c565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615f2257600080fd5b604052919050565b600067ffffffffffffffff821115615f40578081fd5b5060209081020190565b6001600160a01b0381168114610b5357600080fd5b60ff81168114610b5357600080fdfea264697066735822122014087a596f0dfd31e8fc0a1c22c2158641859450b5e7a32662b9904ceded3d8b64736f6c634300070100336bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c85760003560e01c80636c57f5a911610081578063851c1bb31161005b578063851c1bb3146101715780638d928af814610191578063aaabadc514610199576100c8565b80636c57f5a914610141578063739238d61461014957806380773a931461015e576100c8565b80632da47c40116100b25780632da47c40146101015780632f2770db146101175780636634b75314610121576100c8565b8062c194db146100cd578063174481fa146100eb575b600080fd5b6100d56101a1565b6040516100e29190610e31565b60405180910390f35b6100f36101c0565b6040516100e2929190610dca565b610109610206565b6040516100e2929190610f59565b61011f610270565b005b61013461012f366004610af8565b6102d5565b6040516100e29190610df1565b610134610300565b610151610309565b6040516100e29190610da9565b61015161016c366004610b90565b61032d565b61018461017f366004610b34565b610401565b6040516100e29190610dfc565b610151610453565b610151610477565b60606101bb6040518060200160405280600081525061055d565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561026257807f000000000000000000000000000000000000000000000000000000000000000003925062278d00915061026b565b60009250600091505b509091565b610278610636565b61028061067f565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b60015460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b600080600061033a610206565b915091506103f16040518060e001604052808c81526020018b81526020018a81526020018981526020018881526020018a5167ffffffffffffffff8111801561038257600080fd5b506040519080825280602002602001820160405280156103ac578160200160208202803683370190505b5081526020018790526103bd610453565b6103c5610309565b8585896040516020016103dd96959493929190610e44565b604051602081830303815290604052610694565b925050505b979650505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610436929190610d79565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610481610453565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156104c657600080fd5b505afa1580156104da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101bb9190610b74565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061055773ffffffffffffffffffffffffffffffffffffffff831615156101ac610728565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010161062881838661073a565b505050505050505050919050565b60006106656000357fffffffff0000000000000000000000000000000000000000000000000000000016610401565b905061067c61067482336107b4565b610191610728565b50565b61069261068a610300565b1560d3610728565b565b600061069e61067f565b60006106a983610853565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b81610736576107368161089b565b5050565b5b602081106107785781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00161073b565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b60006107be610477565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b81526004016107fa93929190610e05565b60206040518083038186803b15801561081257600080fd5b505afa158015610826573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084a9190610b14565b90505b92915050565b600060606108608361055d565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff8116610894573d6000803e3d6000fd5b9392505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b60445261067c917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b803561084d81610fae565b600082601f830112610945578081fd5b813561095861095382610f8e565b610f67565b81815291506020808301908481018184028601820187101561097957600080fd5b60005b848110156109a157813561098f81610fae565b8452928201929082019060010161097c565b505050505092915050565b600082601f8301126109bc578081fd5b81356109ca61095382610f8e565b8181529150602080830190848101818402860182018710156109eb57600080fd5b60005b848110156109a1578135610a0181610fae565b845292820192908201906001016109ee565b600082601f830112610a23578081fd5b8135610a3161095382610f8e565b818152915060208083019084810181840286018201871015610a5257600080fd5b60005b848110156109a157813584529282019290820190600101610a55565b600082601f830112610a81578081fd5b813567ffffffffffffffff811115610a97578182fd5b610ac860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610f67565b9150808252836020828501011115610adf57600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215610b09578081fd5b813561089481610fae565b600060208284031215610b25578081fd5b81518015158114610894578182fd5b600060208284031215610b45578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610894578182fd5b600060208284031215610b85578081fd5b815161089481610fae565b600080600080600080600060e0888a031215610baa578283fd5b873567ffffffffffffffff80821115610bc1578485fd5b610bcd8b838c01610a71565b985060208a0135915080821115610be2578485fd5b610bee8b838c01610a71565b975060408a0135915080821115610c03578485fd5b610c0f8b838c01610935565b965060608a0135915080821115610c24578485fd5b610c308b838c01610a13565b955060808a0135915080821115610c45578485fd5b50610c528a828b016109ac565b93505060a08801359150610c698960c08a0161092a565b905092959891949750929550565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208085019450808401835b83811015610cd657815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101610ca4565b509495945050505050565b6000815180845260208085019450808401835b83811015610cd657815187529582019590820190600101610cf4565b60008151808452815b81811015610d3557602081850181015186830182015201610d19565b81811115610d465782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825261084a6020830184610d10565b600060c08252875160e060c0840152610e616101a0840182610d10565b905060208901517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff40808584030160e0860152610e9d8383610d10565b925060408b015191508085840301610100860152610ebb8383610c91565b925060608b015191508085840301610120860152610ed98383610ce1565b925060808b015191508085840301610140860152610ef78383610c91565b925060a08b01519150808584030161016086015250610f168282610c91565b60c08b01516101808601529250610f339150506020830188610c77565b610f406040830187610c77565b8460608301528360808301526103f660a0830184610c77565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610f8657600080fd5b604052919050565b600067ffffffffffffffff821115610fa4578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff8116811461067c57600080fdfea2646970667358221220945ea5d7f5bd6cda5e8ab82fa08ee9dd72ed81a441b6645dc91678219a0f94c164736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/index.ts b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/index.ts new file mode 100644 index 0000000..b175cbe --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { WeightedPoolDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as WeightedPoolDeployment; + + const args = [input.Vault, input.ProtocolFeePercentagesProvider]; + await task.deployAndVerify('WeightedPoolFactory', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/input.ts b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/input.ts new file mode 100644 index 0000000..896a19f --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/input.ts @@ -0,0 +1,14 @@ +import { Task, TaskMode } from '@src'; + +export type WeightedPoolDeployment = { + Vault: string; + ProtocolFeePercentagesProvider: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); + +export default { + Vault, + ProtocolFeePercentagesProvider, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/output/arbitrum.json new file mode 100644 index 0000000..5a9e90d --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/output/arbitrum.json @@ -0,0 +1,3 @@ +{ + "WeightedPoolFactory": "0x8df6EfEc5547e31B0eb7d1291B511FF8a2bf987c" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/output/bsc.json b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/output/bsc.json new file mode 100644 index 0000000..0c94dee --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/output/bsc.json @@ -0,0 +1,3 @@ +{ + "WeightedPoolFactory": "0xC128a9954e6c874eA3d62ce62B468bA073093F25" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/output/gnosis.json b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/output/gnosis.json new file mode 100644 index 0000000..f2d0c58 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/output/gnosis.json @@ -0,0 +1,3 @@ +{ + "WeightedPoolFactory": "0xf302f9F50958c5593770FDf4d4812309fF77414f" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/output/goerli.json new file mode 100644 index 0000000..cdcb3da --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/output/goerli.json @@ -0,0 +1,3 @@ +{ + "WeightedPoolFactory": "0x94f68b54191F62f781Fe8298A8A5Fa3ed772d227" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/output/mainnet.json new file mode 100644 index 0000000..462e5fa --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "WeightedPoolFactory": "0xcC508a455F5b0073973107Db6a878DdBDab957bC" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/output/optimism.json b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/output/optimism.json new file mode 100644 index 0000000..c654848 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/output/optimism.json @@ -0,0 +1,3 @@ +{ + "WeightedPoolFactory": "0xad901309d9e9DbC5Df19c84f729f429F0189a633" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/output/polygon.json new file mode 100644 index 0000000..56fb305 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/output/polygon.json @@ -0,0 +1,3 @@ +{ + "WeightedPoolFactory": "0x0e39C3D9b2ec765eFd9c5c70BB290B1fCD8536E3" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/readme.md b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/readme.md new file mode 100644 index 0000000..d5fc4ac --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220908-weighted-pool-v2/readme.md @@ -0,0 +1,23 @@ +# 2022-09-08 - Weighted Pool Factory V2 + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> This deployment was deprecated in favor of a new version with critical fixes: [weighted-pool-v3](../20230206-weighted-pool-v3/). +> See this [forum post](https://forum.balancer.fi/t/reentrancy-vulnerability-scope-expanded/4345) for more details about the fixed vulnerability. + + +Deployment of the `WeightedPoolFactory`, which allows creating Weighted Pools which include a number of improvements, including: + +- Optimized `FixedPoint.powDown` for cheaper swaps in common token weight ratios. +- Paying protocol fees in BPT. +- Awareness of yield-bearing tokens. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`WeightedPoolFactory` artifact](./artifact/WeightedPoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/artifact/BatchRelayerLibrary.json b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/artifact/BatchRelayerLibrary.json new file mode 100644 index 0000000..5a0a667 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/artifact/BatchRelayerLibrary.json @@ -0,0 +1,1093 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BatchRelayerLibrary", + "sourceName": "contracts/BatchRelayerLibrary.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wstETH", + "type": "address" + }, + { + "internalType": "contract IBalancerMinter", + "name": "minter", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approveVault", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "assetInIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "assetOutIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IVault.BatchSwapStep[]", + "name": "swaps", + "type": "tuple[]" + }, + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + }, + { + "internalType": "int256[]", + "name": "limits", + "type": "int256[]" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "key", + "type": "uint256" + } + ], + "internalType": "struct VaultActions.OutputReference[]", + "name": "outputReferences", + "type": "tuple[]" + } + ], + "name": "batchSwap", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "enum VaultActions.PoolKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "minAmountsOut", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.ExitPoolRequest", + "name": "request", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "key", + "type": "uint256" + } + ], + "internalType": "struct VaultActions.OutputReference[]", + "name": "outputReferences", + "type": "tuple[]" + } + ], + "name": "exitPool", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStakingLiquidityGauge[]", + "name": "gauges", + "type": "address[]" + } + ], + "name": "gaugeClaimRewards", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStakingLiquidityGauge", + "name": "gauge", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "gaugeDeposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "gauges", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "gaugeMint", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "approval", + "type": "bool" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "gaugeSetMinterApproval", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStakingLiquidityGauge", + "name": "gauge", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "gaugeWithdraw", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "getEntrypoint", + "outputs": [ + { + "internalType": "contract IBalancerRelayer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "enum VaultActions.PoolKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "components": [ + { + "internalType": "contract IAsset[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "maxAmountsIn", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.JoinPoolRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "joinPool", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.UserBalanceOpKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IAsset", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + } + ], + "internalType": "struct IVault.UserBalanceOp[]", + "name": "ops", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "manageUserBalance", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "ref", + "type": "uint256" + } + ], + "name": "peekChainedReferenceValue", + "outputs": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "relayer", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "authorisation", + "type": "bytes" + } + ], + "name": "setRelayerApproval", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "stakeETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "stakeETHAndWrap", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IAsset", + "name": "assetIn", + "type": "address" + }, + { + "internalType": "contract IAsset", + "name": "assetOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IVault.SingleSwap", + "name": "singleSwap", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "bool", + "name": "fromInternalBalance", + "type": "bool" + }, + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "toInternalBalance", + "type": "bool" + } + ], + "internalType": "struct IVault.FundManagement", + "name": "funds", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "limit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "swap", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStaticATokenLM", + "name": "staticToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "toUnderlying", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapAaveStaticToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC4626", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapERC4626", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IReaperTokenVault", + "name": "vaultToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapReaperVaultToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IUnbuttonToken", + "name": "wrapperToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapUnbuttonToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "unwrapWstETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20Permit", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "vaultPermit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20PermitDAI", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "holder", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "vaultPermitDAI", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStaticATokenLM", + "name": "staticToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "fromUnderlying", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapAaveDynamicToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC4626", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapERC4626", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IReaperTokenVault", + "name": "vaultToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapReaperVaultToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapStETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IUnbuttonToken", + "name": "wrapperToken", + "type": "address" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "uAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "outputReference", + "type": "uint256" + } + ], + "name": "wrapUnbuttonToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x6101606040527fae1dc54057af8e8e5ce068cdd4383149c7efcb30e8fb95b592ee1594367fb50960e0523480156200003657600080fd5b50604051620059f3380380620059f3833981016040819052620000599162000209565b818184806001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200009657600080fd5b505afa158015620000ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d191906200025c565b6001600160601b0319606091821b81166080529082901b1660a05260405181903090620000fe90620001fb565b6200010b92919062000282565b604051809103906000f08015801562000128573d6000803e3d6000fd5b506001600160601b0319606091821b811660c05292901b90911661010052506001600160a01b0381166200015e576000620001d5565b806001600160a01b031663c1fe3e486040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200019a57600080fd5b505af1158015620001af573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d591906200025c565b6001600160601b0319606091821b81166101205291901b166101405250620002b5915050565b610787806200526c83390190565b6000806000606084860312156200021e578283fd5b83516200022b816200029c565b60208501519093506200023e816200029c565b604085015190925062000251816200029c565b809150509250925092565b6000602082840312156200026e578081fd5b81516200027b816200029c565b9392505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0381168114620002b257600080fd5b50565b60805160601c60a05160601c60c05160601c60e0516101005160601c6101205160601c6101405160601c614f15620003576000398061051952806105ad528061061352806109995280610a495280610b12528061299552806129ed525080610917528061096c5280610bda5280610cb95280612ab6525080610e4c5280611b0b5250806132965250806119b5525080611ab55280611c02525050614f156000f3fe6080604052600436106101c25760003560e01c806380db15bd116100f7578063b6d2473711610095578063e8210e3c11610064578063e8210e3c146103cb578063ecc02637146103de578063efe69108146103f1578063f3cab68514610404576101c2565b8063b6d2473714610372578063d293f29014610392578063d80952d5146103a5578063db4c0e91146103b8576101c2565b80638d928af8116100d15780638d928af8146103245780638fe4624f14610339578063959fc17a1461034c578063abf6d3991461035f576101c2565b806380db15bd146102eb5780638c57198b146102fe5780638d64cfbc14610311576101c2565b8063433b0865116101645780636d307ea81161013e5780636d307ea8146102875780637ab6e03c1461029a5780637bc008f5146102ad5780637fd0e5d5146102c0576101c2565b8063433b08651461024e578063611b90dd1461026157806365ca480414610274576101c2565b80631c982441116101a05780631c982441146102025780632cbec84e146102155780632e6272ea146102285780633f85d3901461023b576101c2565b80630e248fea146101c75780631089e5e3146101dc57806318369446146101ef575b600080fd5b6101da6101d5366004613cee565b610431565b005b6101da6101ea366004613c70565b6104cc565b6101da6101fd36600461432f565b6106b6565b6101da610210366004613b9e565b6108bf565b6101da610223366004613c70565b610bbc565b6101da61023636600461442b565b610cf0565b6101da610249366004613ca4565b610e19565b6101da61025c3660046141e9565b610ee2565b6101da61026f36600461413f565b611191565b6101da610282366004614199565b6112ac565b6101da61029536600461413f565b61149f565b6101da6102a83660046141e9565b6116c1565b6101da6102bb366004614199565b6117c7565b3480156102cc57600080fd5b506102d56119b3565b6040516102e29190614791565b60405180910390f35b6101da6102f9366004613be3565b6119d7565b6101da61030c366004613e8b565b611adb565b6101da61031f3660046140a6565b611b86565b34801561033057600080fd5b506102d5611c00565b6101da610347366004613f96565b611c24565b6101da61035a366004614025565b611e4e565b6101da61036d36600461413f565b611ecb565b34801561037e57600080fd5b506101da61038d366004614114565b612081565b6101da6103a036600461413f565b612127565b6101da6103b3366004613eee565b6123af565b6101da6103c6366004613b9e565b61293d565b6101da6103d936600461413f565b612aed565b6101da6103ec366004613dbe565b612db2565b6101da6103ff36600461413f565b612eaa565b34801561041057600080fd5b5061042461041f366004614519565b612f53565b6040516102e29190614ddc565b8060005b818110156104c65783838281811061044957fe5b905060200201602081019061045e9190613b66565b6001600160a01b03166384e9bd7e336040518263ffffffff1660e01b81526004016104899190614791565b600060405180830381600087803b1580156104a357600080fd5b505af11580156104b7573d6000803e3d6000fd5b50505050806001019050610435565b50505050565b6104d582612f65565b156104e6576104e382612fb0565b91505b6040517fb0e389000000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b0e389009061054e908690600401614ddc565b60206040518083038186803b15801561056657600080fd5b505afa15801561057a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059e9190614531565b90506105d36001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001684612fdb565b6001600160a01b038416301461069e576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb9061064a90879085906004016148f1565b602060405180830381600087803b15801561066457600080fd5b505af1158015610678573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069c9190613e6f565b505b6106a782612f65565b156104c6576104c68282613055565b336106c46020890189613b66565b6001600160a01b031614806106ed5750306106e26020890189613b66565b6001600160a01b0316145b6107125760405162461bcd60e51b815260040161070990614cac565b60405180910390fd5b60005b8a518110156107775760008b828151811061072c57fe5b602002602001015160600151905061074381612f65565b1561076e5761075181612fb0565b8c838151811061075d57fe5b602002602001015160600181815250505b50600101610715565b506060610782611c00565b6001600160a01b031663945bcec9858e8e8e8e8e8e8e8e6040518a63ffffffff1660e01b81526004016107bc989796959493929190614ba3565b6000604051808303818588803b1580156107d557600080fd5b505af11580156107e9573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526108129190810190613d2e565b905060005b828110156108b05761083d84848381811061082e57fe5b90506040020160200135612f65565b6108595760405162461bcd60e51b815260040161070990614d1a565b6108a884848381811061086857fe5b905060400201602001356108a38487878681811061088257fe5b905060400201600001358151811061089657fe5b6020026020010151613068565b613055565b600101610817565b50505050505050505050505050565b6108c882612f65565b156108d9576108d682612fb0565b91505b6001600160a01b038416301461093c576001600160a01b03841633146109115760405162461bcd60e51b815260040161070990614cac565b61093c847f000000000000000000000000000000000000000000000000000000000000000084613082565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906109c3907f00000000000000000000000000000000000000000000000000000000000000009086906004016148f1565b602060405180830381600087803b1580156109dd57600080fd5b505af11580156109f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a159190613e6f565b506040517fea598cb00000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ea598cb090610a7e908690600401614ddc565b602060405180830381600087803b158015610a9857600080fd5b505af1158015610aac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad09190614531565b90506001600160a01b0384163014610b9d576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90610b4990879085906004016148f1565b602060405180830381600087803b158015610b6357600080fd5b505af1158015610b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9b9190613e6f565b505b610ba682612f65565b15610bb557610bb58282613055565b5050505050565b610bc582612f65565b15610bd657610bd382612fb0565b91505b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a1903eab84306040518363ffffffff1660e01b8152600401610c259190614791565b6020604051808303818588803b158015610c3e57600080fd5b505af1158015610c52573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610c779190614531565b90506001600160a01b038416301461069e576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb9061064a90879085906004016148f1565b33610cfe6020870187613b66565b6001600160a01b03161480610d27575030610d1c6020870187613b66565b6001600160a01b0316145b610d435760405162461bcd60e51b815260040161070990614cac565b610d508660800151612f65565b15610d6857610d628660800151612fb0565b60808701525b6000610d72611c00565b6001600160a01b03166352bbbe2984898989896040518663ffffffff1660e01b8152600401610da49493929190614d51565b6020604051808303818588803b158015610dbd57600080fd5b505af1158015610dd1573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610df69190614531565b9050610e0182612f65565b15610e1057610e108282613055565b50505050505050565b6040517f3b9f73840000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633b9f738490610e8590879087903390600401614959565b602060405180830381600087803b158015610e9f57600080fd5b505af1158015610eb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed79190614531565b90506106a782612f65565b610eeb83612f65565b15610efc57610ef983612fb0565b92505b600082610f7b57866001600160a01b03166351c0e0616040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f3e57600080fd5b505af1158015610f52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f769190613b82565b610fee565b866001600160a01b0316634800d97f6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610fb657600080fd5b505af1158015610fca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fee9190613b82565b90506001600160a01b0386163014611033576001600160a01b03861633146110285760405162461bcd60e51b815260040161070990614cac565b611033868286613082565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b39061107a908a9088906004016148f1565b602060405180830381600087803b15801561109457600080fd5b505af11580156110a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cc9190613e6f565b506040517f2f2cab870000000000000000000000000000000000000000000000000000000081526000906001600160a01b03891690632f2cab879061111b908990899086908a9060040161492d565b602060405180830381600087803b15801561113557600080fd5b505af1158015611149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116d9190614531565b905061117883612f65565b15611187576111878382613055565b5050505050505050565b61119a82612f65565b156111ab576111a882612fb0565b91505b6001600160a01b03841630146111ee576001600160a01b03841633146111e35760405162461bcd60e51b815260040161070990614cac565b6111ee848684613082565b6040517fea785a5e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b0387169063ea785a5e9061123890879087906004016148f1565b602060405180830381600087803b15801561125257600080fd5b505af1158015611266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128a9190614531565b905061129582612f65565b156112a4576112a48282613055565b505050505050565b6112b581612f65565b156112c6576112c381612fb0565b90505b6001600160a01b0383163014611309576001600160a01b03831633146112fe5760405162461bcd60e51b815260040161070990614cac565b611309838583613082565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526001600160a01b03851690632e1a7d4d9061134e908490600401614ddc565b600060405180830381600087803b15801561136857600080fd5b505af115801561137c573d6000803e3d6000fd5b505050506001600160a01b03821630146104c6576000846001600160a01b03166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b1580156113cb57600080fd5b505afa1580156113df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114039190613b82565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081529091506001600160a01b0382169063a9059cbb9061144d90869086906004016148f1565b602060405180830381600087803b15801561146757600080fd5b505af115801561147b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a49190613e6f565b6114a882612f65565b156114b9576114b682612fb0565b91505b6000856001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114f457600080fd5b505afa158015611508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152c9190613b82565b90506001600160a01b0385163014611571576001600160a01b03851633146115665760405162461bcd60e51b815260040161070990614cac565b611571858285613082565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b3906115b890899087906004016148f1565b602060405180830381600087803b1580156115d257600080fd5b505af11580156115e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160a9190613e6f565b506040517f6e553f650000000000000000000000000000000000000000000000000000000081526000906001600160a01b03881690636e553f65906116559087908990600401614de5565b602060405180830381600087803b15801561166f57600080fd5b505af1158015611683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a79190614531565b90506116b283612f65565b15610e1057610e108382613055565b6116ca83612f65565b156116db576116d883612fb0565b92505b6001600160a01b038516301461171e576001600160a01b03851633146117135760405162461bcd60e51b815260040161070990614cac565b61171e858785613082565b6040517fead5d3590000000000000000000000000000000000000000000000000000000081526000906001600160a01b0388169063ead5d3599061176a9088908890889060040161490a565b6040805180830381600087803b15801561178357600080fd5b505af1158015611797573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117bb9190614549565b915050610e0182612f65565b6117d081612f65565b156117e1576117de81612fb0565b90505b6000846001600160a01b03166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b15801561181c57600080fd5b505afa158015611830573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118549190613b82565b90506001600160a01b0384163014611899576001600160a01b038416331461188e5760405162461bcd60e51b815260040161070990614cac565b611899848284613082565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b3906118e090889086906004016148f1565b602060405180830381600087803b1580156118fa57600080fd5b505af115801561190e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119329190613e6f565b506040517f6e553f650000000000000000000000000000000000000000000000000000000081526001600160a01b03861690636e553f659061197a9085908790600401614de5565b600060405180830381600087803b15801561199457600080fd5b505af11580156119a8573d6000803e3d6000fd5b505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b0384163014806119ec575082155b611a085760405162461bcd60e51b815260040161070990614ce3565b606063fa6e671d60e01b338686604051602401611a27939291906147a5565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009095169490941790935251611a9692869186910161475e565b60408051601f1981840301815291905290506112a46001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168261311e565b6040517fc65427940000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c654279490611b4c9030908a908a908a908a908a908a906004016148ad565b600060405180830381600087803b158015611b6657600080fd5b505af1158015611b7a573d6000803e3d6000fd5b50505050505050505050565b866001600160a01b031663d505accf87611b9e611c00565b88888888886040518863ffffffff1660e01b8152600401611bc5979695949392919061486c565b600060405180830381600087803b158015611bdf57600080fd5b505af1158015611bf3573d6000803e3d6000fd5b5050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b038516331480611c4357506001600160a01b03851630145b611c5f5760405162461bcd60e51b815260040161070990614cac565b6000611c6a88613196565b90506000611c7783612f65565b611c82576000611d17565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038316906370a0823190611cc7908990600401614791565b60206040518083038186803b158015611cdf57600080fd5b505afa158015611cf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d179190614531565b9050611d2788866040015161319c565b6040860152611d34611c00565b6001600160a01b031663b95cac28858b8a8a8a6040518663ffffffff1660e01b8152600401611d669493929190614afd565b6000604051808303818588803b158015611d7f57600080fd5b505af1158015611d93573d6000803e3d6000fd5b5050505050611da183612f65565b156119a8576040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038416906370a0823190611dee908a90600401614791565b60206040518083038186803b158015611e0657600080fd5b505afa158015611e1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3e9190614531565b9050611b7a846108a383856131ca565b876001600160a01b0316638fcbaf0c88611e66611c00565b8989898989896040518963ffffffff1660e01b8152600401611e8f989796959493929190614823565b600060405180830381600087803b158015611ea957600080fd5b505af1158015611ebd573d6000803e3d6000fd5b505050505050505050505050565b611ed482612f65565b15611ee557611ee282612fb0565b91505b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015611f2057600080fd5b505afa158015611f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f589190613b82565b90506001600160a01b0385163014611f9d576001600160a01b0385163314611f925760405162461bcd60e51b815260040161070990614cac565b611f9d858285613082565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b390611fe490899087906004016148f1565b602060405180830381600087803b158015611ffe57600080fd5b505af1158015612012573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120369190613e6f565b506040517f2f4f21e20000000000000000000000000000000000000000000000000000000081526000906001600160a01b03881690632f4f21e29061165590889088906004016148f1565b61208a81612f65565b1561209b5761209881612fb0565b90505b816001600160a01b031663095ea7b36120b2611c00565b836040518363ffffffff1660e01b81526004016120d09291906148f1565b602060405180830381600087803b1580156120ea57600080fd5b505af11580156120fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121229190613e6f565b505050565b61213082612f65565b156121415761213e82612fb0565b91505b6001600160a01b0384163014612184576001600160a01b03841633146121795760405162461bcd60e51b815260040161070990614cac565b612184848684613082565b6000856001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156121bf57600080fd5b505afa1580156121d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f79190613b82565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081529091506001600160a01b03871690632e1a7d4d9061223f908690600401614ddc565b600060405180830381600087803b15801561225957600080fd5b505af115801561226d573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b03841691506370a08231906122b9903090600401614791565b60206040518083038186803b1580156122d157600080fd5b505afa1580156122e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123099190614531565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081529091506001600160a01b0383169063a9059cbb9061235390889085906004016148f1565b602060405180830381600087803b15801561236d57600080fd5b505af1158015612381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a59190613e6f565b506116b283612f65565b6001600160a01b0385163314806123ce57506001600160a01b03851630145b6123ea5760405162461bcd60e51b815260040161070990614cac565b60608167ffffffffffffffff8111801561240357600080fd5b5060405190808252806020026020018201604052801561242d578160200160208202803683370190505b50905060608267ffffffffffffffff8111801561244957600080fd5b50604051908082528060200260200182016040528015612473578160200160208202803683370190505b50905060005b838110156125e35761249085858381811061082e57fe5b6124ac5760405162461bcd60e51b815260040161070990614d1a565b85516000908686848181106124bd57fe5b90506040020160000135815181106124d157fe5b6020026020010151905086606001511561251f576124ee816131e0565b8483815181106124fa57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506125da565b612528816131e3565b6125b557612535816131e0565b6001600160a01b03166370a08231896040518263ffffffff1660e01b81526004016125609190614791565b60206040518083038186803b15801561257857600080fd5b505afa15801561258c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b09190614531565b6125c1565b876001600160a01b0316315b8383815181106125cd57fe5b6020026020010181815250505b50600101612479565b5084606001511561267a576125f6611c00565b6001600160a01b0316630f5a6efa87846040518363ffffffff1660e01b81526004016126239291906147c9565b60006040518083038186803b15801561263b57600080fd5b505afa15801561264f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126779190810190613e34565b90505b6126888886604001516131f0565b6040860152612695611c00565b6001600160a01b0316638bdb39138a8989896040518563ffffffff1660e01b81526004016126c69493929190614afd565b600060405180830381600087803b1580156126e057600080fd5b505af11580156126f4573d6000803e3d6000fd5b50606092508591505067ffffffffffffffff8111801561271357600080fd5b5060405190808252806020026020018201604052801561273d578160200160208202803683370190505b5090508560600151156127da57612752611c00565b6001600160a01b0316630f5a6efa88856040518363ffffffff1660e01b815260040161277f9291906147c9565b60006040518083038186803b15801561279757600080fd5b505afa1580156127ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526127d39190810190613e34565b90506128d8565b60005b848110156128d65786516000908787848181106127f657fe5b905060400201600001358151811061280a57fe5b6020026020010151905061281d816131e3565b6128aa5761282a816131e0565b6001600160a01b03166370a082318a6040518263ffffffff1660e01b81526004016128559190614791565b60206040518083038186803b15801561286d57600080fd5b505afa158015612881573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a59190614531565b6128b6565b886001600160a01b0316315b8383815181106128c257fe5b6020908102919091010152506001016127dd565b505b60005b84811015611bf3576129358686838181106128f257fe5b905060400201602001356108a385848151811061290b57fe5b602002602001015185858151811061291f57fe5b60200260200101516131ca90919063ffffffff16565b6001016128db565b61294682612f65565b156129575761295482612fb0565b91505b6001600160a01b03841630146129ba576001600160a01b038416331461298f5760405162461bcd60e51b815260040161070990614cac565b6129ba847f000000000000000000000000000000000000000000000000000000000000000084613082565b6040517fde0e9a3e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063de0e9a3e90612a22908690600401614ddc565b602060405180830381600087803b158015612a3c57600080fd5b505af1158015612a50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a749190614531565b90506001600160a01b0384163014610b9d576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90610b4990879085906004016148f1565b612af682612f65565b15612b0757612b0482612fb0565b91505b6000856001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612b4257600080fd5b505afa158015612b56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b7a9190613b82565b90506001600160a01b0385163014612bbf576001600160a01b0385163314612bb45760405162461bcd60e51b815260040161070990614cac565b612bbf858285613082565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b390612c0690899087906004016148f1565b602060405180830381600087803b158015612c2057600080fd5b505af1158015612c34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c589190613e6f565b506040517fb6b55f250000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063b6b55f2590612c9e908690600401614ddc565b600060405180830381600087803b158015612cb857600080fd5b505af1158015612ccc573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b03891691506370a0823190612d18903090600401614791565b60206040518083038186803b158015612d3057600080fd5b505afa158015612d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d689190614531565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081529091506001600160a01b0388169063a9059cbb9061235390889085906004016148f1565b60005b82811015612e465733848483818110612dca57fe5b905060a002016060016020810190612de29190613b66565b6001600160a01b03161480612e22575030848483818110612dff57fe5b905060a002016060016020810190612e179190613b66565b6001600160a01b0316145b612e3e5760405162461bcd60e51b815260040161070990614cac565b600101612db5565b50612e4f611c00565b6001600160a01b0316630e8e3e848285856040518463ffffffff1660e01b8152600401612e7d9291906149b9565b6000604051808303818588803b158015612e9657600080fd5b505af1158015611187573d6000803e3d6000fd5b612eb382612f65565b15612ec457612ec182612fb0565b91505b6001600160a01b0384163014612f07576001600160a01b0384163314612efc5760405162461bcd60e51b815260040161070990614cac565b612f07848684613082565b6040517fba0876520000000000000000000000000000000000000000000000000000000081526000906001600160a01b0387169063ba0876529061123890869088903090600401614dfc565b6000612f5e82613217565b9392505050565b7fba100000000000000000000000000000000000000000000000000000000000007ffff00000000000000000000000000000000000000000000000000000000000008216145b919050565b6000806000612fbe84613217565b91509150612fcb8461322e565b15612f5e57600082559392505050565b612fea814710156101a3613275565b6000826001600160a01b031682604051613003906131e0565b60006040518083038185875af1925050503d8060008114613040576040519150601f19603f3d011682016040523d82523d6000602084013e613045565b606091505b50509050612122816101a4613275565b600061306083613287565b919091555050565b600080821361307a578160000361307c565b815b92915050565b8061308c57612122565b6040805160018082528183019092526060916020808301908036833701905050905082816000815181106130bc57fe5b6001600160a01b039290921660209283029190910190910152604080516001808252818301909252606091816020016020820280368337019050509050828160008151811061310757fe5b602002602001018181525050610bb58583836132e5565b606060006060846001600160a01b03168460405161313c9190614742565b6000604051808303816000865af19150503d8060008114613179576040519150601f19603f3d011682016040523d82523d6000602084013e61317e565b606091505b509150915061318d828261341f565b95945050505050565b60601c90565b606060008380156131a957fe5b14156131bf576131b882613449565b905061307c565b61307c610136613486565b60006131da838311156001613275565b50900390565b90565b6001600160a01b03161590565b606060008380156131fd57fe5b141561320c576131b8826134b3565b61307c610150613486565b60008061322383613287565b915081549050915091565b7fffff000000000000000000000000000000000000000000000000000000000000167fba100000000000000000000000000000000000000000000000000000000000001490565b816132835761328381613486565b5050565b60006001613294836134fc565b7f00000000000000000000000000000000000000000000000000000000000000006040516020016132c6929190614783565b60408051808303601f1901815291905280516020909101200392915050565b6060825167ffffffffffffffff811180156132ff57600080fd5b5060405190808252806020026020018201604052801561333957816020015b61332661374a565b81526020019060019003908161331e5790505b50905060005b83518110156133d1576040805160a08101909152806003815260200185838151811061336757fe5b60200260200101516001600160a01b0316815260200184838151811061338957fe5b60200260200101518152602001866001600160a01b03168152602001306001600160a01b03168152508282815181106133be57fe5b602090810291909101015260010161333f565b506133da611c00565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b81526004016134059190614a67565b600060405180830381600087803b158015612e9657600080fd5b6060821561342e57508061307c565b81511561343e5781518083602001fd5b61307c6101ae613486565b606060006134568361351f565b9050600181600381111561346657fe5b141561347d5761347583613535565b915050612fab565b82915050612fab565b6134b0817f42414c00000000000000000000000000000000000000000000000000000000006135e3565b50565b606060006134c08361351f565b905060008160038111156134d057fe5b14156134df5761347583613644565b60018160038111156134ed57fe5b141561347d57613475836136a7565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b60008180602001905181019061307c9190614258565b6060806000613543846136fa565b915091506000805b83518110156135a957600084828151811061356257fe5b6020026020010151905061357581612f65565b156135a05761358381612fb0565b85838151811061358f57fe5b602002602001018181525050600192505b5060010161354b565b50806135b5578461318d565b600183836040516020016135cb93929190614b71565b60405160208183030381529060405295945050505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60606000806136528461371d565b9150915061365f82612f65565b1561369d5761366d82612fb0565b91506000828260405160200161368593929190614b50565b60405160208183030381529060405292505050612fab565b8392505050612fab565b606060006136b483613734565b90506136bf81612f65565b1561347d576136cd81612fb0565b90506001816040516020016136e3929190614b39565b604051602081830303815290604052915050612fab565b606060008280602001905181019061371291906142d7565b909590945092505050565b6000808280602001905181019061371291906142a1565b600081806020019051810190612f5e9190614274565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561307c81614eaf565b60008083601f840112613796578182fd5b50813567ffffffffffffffff8111156137ad578182fd5b60208301915083602080830285010111156137c757600080fd5b9250929050565b600082601f8301126137de578081fd5b81356137f16137ec82614e42565b614e1b565b81815291506020808301908481018184028601820187101561381257600080fd5b60005b8481101561383a57813561382881614eaf565b84529282019290820190600101613815565b505050505092915050565b600082601f830112613855578081fd5b81356138636137ec82614e42565b818152915060208083019084810160005b8481101561383a578135870160a080601f19838c0301121561389557600080fd5b61389e81614e1b565b85830135815260408084013587830152606080850135828401526080915081850135818401525082840135925067ffffffffffffffff8311156138e057600080fd5b6138ee8c8885870101613a10565b90820152865250509282019290820190600101613874565b60008083601f840112613917578182fd5b50813567ffffffffffffffff81111561392e578182fd5b6020830191508360206040830285010111156137c757600080fd5b600082601f830112613959578081fd5b81356139676137ec82614e42565b81815291506020808301908481018184028601820187101561398857600080fd5b60005b8481101561383a5781358452928201929082019060010161398b565b600082601f8301126139b7578081fd5b81516139c56137ec82614e42565b8181529150602080830190848101818402860182018710156139e657600080fd5b60005b8481101561383a578151845292820192908201906001016139e9565b803561307c81614ec4565b600082601f830112613a20578081fd5b813567ffffffffffffffff811115613a36578182fd5b613a496020601f19601f84011601614e1b565b9150808252836020828501011115613a6057600080fd5b8060208401602084013760009082016020015292915050565b80356001811061307c57600080fd5b80356002811061307c57600080fd5b600060808284031215613aa8578081fd5b613ab26080614e1b565b9050813567ffffffffffffffff80821115613acc57600080fd5b613ad8858386016137ce565b83526020840135915080821115613aee57600080fd5b613afa85838601613949565b60208401526040840135915080821115613b1357600080fd5b50613b2084828501613a10565b604083015250613b338360608401613a05565b606082015292915050565b600060808284031215613b4f578081fd5b50919050565b803560ff8116811461307c57600080fd5b600060208284031215613b77578081fd5b8135612f5e81614eaf565b600060208284031215613b93578081fd5b8151612f5e81614eaf565b60008060008060808587031215613bb3578283fd5b8435613bbe81614eaf565b93506020850135613bce81614eaf565b93969395505050506040820135916060013590565b60008060008060608587031215613bf8578182fd5b8435613c0381614eaf565b93506020850135613c1381614ec4565b9250604085013567ffffffffffffffff80821115613c2f578384fd5b818701915087601f830112613c42578384fd5b813581811115613c50578485fd5b886020828501011115613c61578485fd5b95989497505060200194505050565b600080600060608486031215613c84578081fd5b8335613c8f81614eaf565b95602085013595506040909401359392505050565b600080600060408486031215613cb8578081fd5b833567ffffffffffffffff811115613cce578182fd5b613cda86828701613785565b909790965060209590950135949350505050565b60008060208385031215613d00578182fd5b823567ffffffffffffffff811115613d16578283fd5b613d2285828601613785565b90969095509350505050565b60006020808385031215613d40578182fd5b825167ffffffffffffffff811115613d56578283fd5b8301601f81018513613d66578283fd5b8051613d746137ec82614e42565b8181528381019083850185840285018601891015613d90578687fd5b8694505b83851015613db2578051835260019490940193918501918501613d94565b50979650505050505050565b600080600060408486031215613dd2578081fd5b833567ffffffffffffffff80821115613de9578283fd5b818601915086601f830112613dfc578283fd5b813581811115613e0a578384fd5b87602060a083028501011115613e1e578384fd5b6020928301989097509590910135949350505050565b600060208284031215613e45578081fd5b815167ffffffffffffffff811115613e5b578182fd5b613e67848285016139a7565b949350505050565b600060208284031215613e80578081fd5b8151612f5e81614ec4565b60008060008060008060c08789031215613ea3578384fd5b8635613eae81614ec4565b95506020870135613ebe81614eaf565b945060408701359350613ed48860608901613b55565b92506080870135915060a087013590509295509295509295565b600080600080600080600060c0888a031215613f08578485fd5b87359650613f198960208a01613a79565b95506040880135613f2981614eaf565b94506060880135613f3981614eaf565b9350608088013567ffffffffffffffff80821115613f55578283fd5b613f618b838c01613a97565b945060a08a0135915080821115613f76578283fd5b50613f838a828b01613906565b989b979a50959850939692959293505050565b600080600080600080600060e0888a031215613fb0578081fd5b87359650613fc18960208a01613a79565b95506040880135613fd181614eaf565b94506060880135613fe181614eaf565b9350608088013567ffffffffffffffff811115613ffc578182fd5b6140088a828b01613a97565b93505060a0880135915060c0880135905092959891949750929550565b600080600080600080600080610100898b031215614041578182fd5b883561404c81614eaf565b9750602089013561405c81614eaf565b96506040890135955060608901359450608089013561407a81614ec4565b93506140898a60a08b01613b55565b925060c0890135915060e089013590509295985092959890939650565b600080600080600080600060e0888a0312156140c0578081fd5b87356140cb81614eaf565b965060208801356140db81614eaf565b955060408801359450606088013593506140f88960808a01613b55565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215614126578182fd5b823561413181614eaf565b946020939093013593505050565b600080600080600060a08688031215614156578283fd5b853561416181614eaf565b9450602086013561417181614eaf565b9350604086013561418181614eaf565b94979396509394606081013594506080013592915050565b600080600080608085870312156141ae578182fd5b84356141b981614eaf565b935060208501356141c981614eaf565b925060408501356141d981614eaf565b9396929550929360600135925050565b60008060008060008060c08789031215614201578384fd5b863561420c81614eaf565b9550602087013561421c81614eaf565b9450604087013561422c81614eaf565b935060608701359250608087013561424381614ec4565b8092505060a087013590509295509295509295565b600060208284031215614269578081fd5b8151612f5e81614ed2565b60008060408385031215614286578182fd5b825161429181614ed2565b6020939093015192949293505050565b6000806000606084860312156142b5578081fd5b83516142c081614ed2565b602085015160409095015190969495509392505050565b6000806000606084860312156142eb578081fd5b83516142f681614ed2565b602085015190935067ffffffffffffffff811115614312578182fd5b61431e868287016139a7565b925050604084015190509250925092565b60008060008060008060008060008060006101608c8e031215614350578485fd5b61435a8d8d613a88565b9a5067ffffffffffffffff8060208e01351115614375578586fd5b6143858e60208f01358f01613845565b9a508060408e01351115614397578586fd5b6143a78e60408f01358f01613785565b909a5098506143b98e60608f01613b3e565b97508060e08e013511156143cb578586fd5b6143db8e60e08f01358f01613785565b90975095506101008d013594506101208d013593506101408d0135811015614401578283fd5b506144138d6101408e01358e01613906565b81935080925050509295989b509295989b9093969950565b6000806000806000806101208789031215614444578384fd5b863567ffffffffffffffff8082111561445b578586fd5b9088019060c0828b03121561446e578586fd5b61447860c0614e1b565b823581526144898b60208501613a88565b6020820152604083013561449c81614eaf565b60408201526144ae8b6060850161377a565b60608201526080830135608082015260a0830135828111156144ce578788fd5b6144da8c828601613a10565b60a0830152508098505050506144f38860208901613b3e565b959895975050505060a08401359360c08101359360e08201359350610100909101359150565b60006020828403121561452a578081fd5b5035919050565b600060208284031215614542578081fd5b5051919050565b6000806040838503121561455b578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b60008284526020808501945082825b858110156145b657813561459b81614eaf565b6001600160a01b031687529582019590820190600101614588565b509495945050505050565b60008284526020808501945082825b858110156145b6578135875295820195908201906001016145d0565b6000815180845260208085019450808401835b838110156145b6578151875295820195908201906001016145ff565b15159052565b60008151808452614639816020860160208601614e6f565b601f01601f19169290920160200192915050565b8051608080845281519084018190526000916020919082019060a0860190845b818110156146925783516001600160a01b03168352928401929184019160010161466d565b5050828501519150858103838701526146ab81836145ec565b92505050604083015184820360408601526146c68282614621565b91505060608301516146db606086018261461b565b509392505050565b80356146ee81614eaf565b6001600160a01b03908116835260208201359061470a82614ec4565b901515602084015260408201359061472182614eaf565b166040830152606081013561473581614ec4565b8015156060840152505050565b60008251614754818460208701614e6f565b9190910192915050565b60008451614770818460208901614e6f565b8201838582379092019182525092915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000604082016001600160a01b03808616845260206040818601528286518085526060870191508288019450855b818110156148155785518516835294830194918301916001016147f7565b509098975050505050505050565b6001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b0397881681529515156020870152939095166040850152606084019190915260ff16608083015260a082019290925260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b6001600160a01b03949094168452602084019290925261ffff1660408301521515606082015260800190565b6040808252810183905260008460608301825b8681101561499c576020833561498181614eaf565b6001600160a01b03168352928301929091019060010161496c565b5080925050506001600160a01b0383166020830152949350505050565b6020808252818101839052600090604080840186845b87811015614a5a5781356149e281614ed2565b6149eb81614e9b565b8352818501356149fa81614eaf565b6001600160a01b03168386015281840135848401526060614a1d81840184614e62565b614a298286018261456c565b50506080614a3981840184614e62565b614a458286018261456c565b505060a09283019291909101906001016149cf565b5090979650505050505050565b602080825282518282018190526000919060409081850190868401855b82811015614af05781518051614a9981614e9b565b8552808701516001600160a01b0316878601528581015186860152606080820151614ac68288018261456c565b505060809081015190614adb8682018361456c565b505060a0939093019290850190600101614a84565b5091979650505050505050565b60008582526001600160a01b03808616602084015280851660408401525060806060830152614b2f608083018461464d565b9695505050505050565b60408101614b4684614e9b565b9281526020015290565b60608101614b5d85614e9b565b938152602081019290925260409091015290565b6000614b7c85614e9b565b84825260606020830152614b9360608301856145ec565b9050826040830152949350505050565b6000610120808301614bb48c614ea5565b8b84526020808501929092528a5190819052610140808501928281028601909101918c8201855b82811015614c5b578785037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec00186528151805186528481015185870152604080820151908701526060808201519087015260809081015160a091870182905290614c4781880183614621565b978601979650505090830190600101614bdb565b505050508381036040850152614c72818a8c614579565b915050614c8260608401886146e3565b82810360e0840152614c958186886145c1565b915050826101008301529998505050505050505050565b60208082526010908201527f496e636f72726563742073656e64657200000000000000000000000000000000604082015260600190565b6020808252601f908201527f52656c617965722063616e206f6e6c7920617070726f766520697473656c6600604082015260600190565b60208082526019908201527f696e76616c696420636861696e6564207265666572656e636500000000000000604082015260600190565b600060e08252855160e08301526020860151614d6c81614ea5565b61010083015260408601516001600160a01b03908116610120840152606087015116610140830152608086015161016083015260a086015160c0610180840152614dba6101a0840182614621565b915050614dca60208301866146e3565b60a082019390935260c0015292915050565b90815260200190565b9182526001600160a01b0316602082015260400190565b9283526001600160a01b03918216602084015216604082015260600190565b60405181810167ffffffffffffffff81118282101715614e3a57600080fd5b604052919050565b600067ffffffffffffffff821115614e58578081fd5b5060209081020190565b60008235612f5e81614eaf565b60005b83811015614e8a578181015183820152602001614e72565b838111156104c65750506000910152565b600481106134b057fe5b600281106134b057fe5b6001600160a01b03811681146134b057600080fd5b80151581146134b057600080fd5b600481106134b057600080fdfea264697066735822122050b32f1916dd2bfb3a1d0a43f7959f7e0894f8a708f95ba38dda2a8251d8bb9564736f6c6343000701003360c060405234801561001057600080fd5b5060405161078738038061078783398101604081905261002f91610052565b60016000556001600160601b0319606092831b8116608052911b1660a0526100a3565b60008060408385031215610064578182fd5b825161006f8161008b565b60208401519092506100808161008b565b809150509250929050565b6001600160a01b03811681146100a057600080fd5b50565b60805160601c60a05160601c6106b36100d46000398060fc528061020f5250806058528061012052506106b36000f3fe6080604052600436106100385760003560e01c80637678922e146100885780638d928af8146100b3578063ac9650d8146100c857610083565b36610083576100813373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146102066100e8565b005b600080fd5b34801561009457600080fd5b5061009d6100fa565b6040516100aa919061050e565b60405180910390f35b3480156100bf57600080fd5b5061009d61011e565b6100db6100d6366004610480565b610142565b6040516100aa919061052f565b816100f6576100f68161026e565b5050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b606061014c61029b565b8167ffffffffffffffff8111801561016357600080fd5b5060405190808252806020026020018201604052801561019757816020015b60608152602001906001900390816101825790505b50905060005b82811015610257576102388484838181106101b457fe5b90506020028101906101c691906105e3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929150506102b4565b82828151811061024457fe5b602090810291909101015260010161019d565b50610260610337565b610268610348565b92915050565b610298817f42414c000000000000000000000000000000000000000000000000000000000061034f565b50565b6102ad600260005414156101906100e8565b6002600055565b6060600060608473ffffffffffffffffffffffffffffffffffffffff16846040516102df91906104ef565b600060405180830381855af49150503d806000811461031a576040519150601f19603f3d011682016040523d82523d6000602084013e61031f565b606091505b509150915061032e82826103ca565b95945050505050565b4780156102985761029833826103f4565b6001600055565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b606082156103d9575080610268565b8151156103e95781518083602001fd5b6102686101ae61026e565b610403814710156101a36100e8565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516104299061050b565b60006040518083038185875af1925050503d8060008114610466576040519150601f19603f3d011682016040523d82523d6000602084013e61046b565b606091505b5050905061047b816101a46100e8565b505050565b60008060208385031215610492578182fd5b823567ffffffffffffffff808211156104a9578384fd5b818501915085601f8301126104bc578384fd5b8135818111156104ca578485fd5b86602080830285010111156104dd578485fd5b60209290920196919550909350505050565b6000825161050181846020870161064d565b9190910192915050565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156105d6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845281518051808752610599818989018a850161064d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01695909501860194509285019290850190600101610554565b5092979650505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610617578283fd5b83018035915067ffffffffffffffff821115610631578283fd5b60200191503681900382131561064657600080fd5b9250929050565b60005b83811015610668578181015183820152602001610650565b83811115610677576000848401525b5050505056fea2646970667358221220063fdaaad6c7f32fb6dd53f100269a9ea16c7241c4a9587b1f83f82a35b5424264736f6c63430007010033", + "deployedBytecode": "0x6080604052600436106101c25760003560e01c806380db15bd116100f7578063b6d2473711610095578063e8210e3c11610064578063e8210e3c146103cb578063ecc02637146103de578063efe69108146103f1578063f3cab68514610404576101c2565b8063b6d2473714610372578063d293f29014610392578063d80952d5146103a5578063db4c0e91146103b8576101c2565b80638d928af8116100d15780638d928af8146103245780638fe4624f14610339578063959fc17a1461034c578063abf6d3991461035f576101c2565b806380db15bd146102eb5780638c57198b146102fe5780638d64cfbc14610311576101c2565b8063433b0865116101645780636d307ea81161013e5780636d307ea8146102875780637ab6e03c1461029a5780637bc008f5146102ad5780637fd0e5d5146102c0576101c2565b8063433b08651461024e578063611b90dd1461026157806365ca480414610274576101c2565b80631c982441116101a05780631c982441146102025780632cbec84e146102155780632e6272ea146102285780633f85d3901461023b576101c2565b80630e248fea146101c75780631089e5e3146101dc57806318369446146101ef575b600080fd5b6101da6101d5366004613cee565b610431565b005b6101da6101ea366004613c70565b6104cc565b6101da6101fd36600461432f565b6106b6565b6101da610210366004613b9e565b6108bf565b6101da610223366004613c70565b610bbc565b6101da61023636600461442b565b610cf0565b6101da610249366004613ca4565b610e19565b6101da61025c3660046141e9565b610ee2565b6101da61026f36600461413f565b611191565b6101da610282366004614199565b6112ac565b6101da61029536600461413f565b61149f565b6101da6102a83660046141e9565b6116c1565b6101da6102bb366004614199565b6117c7565b3480156102cc57600080fd5b506102d56119b3565b6040516102e29190614791565b60405180910390f35b6101da6102f9366004613be3565b6119d7565b6101da61030c366004613e8b565b611adb565b6101da61031f3660046140a6565b611b86565b34801561033057600080fd5b506102d5611c00565b6101da610347366004613f96565b611c24565b6101da61035a366004614025565b611e4e565b6101da61036d36600461413f565b611ecb565b34801561037e57600080fd5b506101da61038d366004614114565b612081565b6101da6103a036600461413f565b612127565b6101da6103b3366004613eee565b6123af565b6101da6103c6366004613b9e565b61293d565b6101da6103d936600461413f565b612aed565b6101da6103ec366004613dbe565b612db2565b6101da6103ff36600461413f565b612eaa565b34801561041057600080fd5b5061042461041f366004614519565b612f53565b6040516102e29190614ddc565b8060005b818110156104c65783838281811061044957fe5b905060200201602081019061045e9190613b66565b6001600160a01b03166384e9bd7e336040518263ffffffff1660e01b81526004016104899190614791565b600060405180830381600087803b1580156104a357600080fd5b505af11580156104b7573d6000803e3d6000fd5b50505050806001019050610435565b50505050565b6104d582612f65565b156104e6576104e382612fb0565b91505b6040517fb0e389000000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b0e389009061054e908690600401614ddc565b60206040518083038186803b15801561056657600080fd5b505afa15801561057a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059e9190614531565b90506105d36001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001684612fdb565b6001600160a01b038416301461069e576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb9061064a90879085906004016148f1565b602060405180830381600087803b15801561066457600080fd5b505af1158015610678573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069c9190613e6f565b505b6106a782612f65565b156104c6576104c68282613055565b336106c46020890189613b66565b6001600160a01b031614806106ed5750306106e26020890189613b66565b6001600160a01b0316145b6107125760405162461bcd60e51b815260040161070990614cac565b60405180910390fd5b60005b8a518110156107775760008b828151811061072c57fe5b602002602001015160600151905061074381612f65565b1561076e5761075181612fb0565b8c838151811061075d57fe5b602002602001015160600181815250505b50600101610715565b506060610782611c00565b6001600160a01b031663945bcec9858e8e8e8e8e8e8e8e6040518a63ffffffff1660e01b81526004016107bc989796959493929190614ba3565b6000604051808303818588803b1580156107d557600080fd5b505af11580156107e9573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526108129190810190613d2e565b905060005b828110156108b05761083d84848381811061082e57fe5b90506040020160200135612f65565b6108595760405162461bcd60e51b815260040161070990614d1a565b6108a884848381811061086857fe5b905060400201602001356108a38487878681811061088257fe5b905060400201600001358151811061089657fe5b6020026020010151613068565b613055565b600101610817565b50505050505050505050505050565b6108c882612f65565b156108d9576108d682612fb0565b91505b6001600160a01b038416301461093c576001600160a01b03841633146109115760405162461bcd60e51b815260040161070990614cac565b61093c847f000000000000000000000000000000000000000000000000000000000000000084613082565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906109c3907f00000000000000000000000000000000000000000000000000000000000000009086906004016148f1565b602060405180830381600087803b1580156109dd57600080fd5b505af11580156109f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a159190613e6f565b506040517fea598cb00000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ea598cb090610a7e908690600401614ddc565b602060405180830381600087803b158015610a9857600080fd5b505af1158015610aac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad09190614531565b90506001600160a01b0384163014610b9d576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90610b4990879085906004016148f1565b602060405180830381600087803b158015610b6357600080fd5b505af1158015610b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9b9190613e6f565b505b610ba682612f65565b15610bb557610bb58282613055565b5050505050565b610bc582612f65565b15610bd657610bd382612fb0565b91505b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a1903eab84306040518363ffffffff1660e01b8152600401610c259190614791565b6020604051808303818588803b158015610c3e57600080fd5b505af1158015610c52573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610c779190614531565b90506001600160a01b038416301461069e576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb9061064a90879085906004016148f1565b33610cfe6020870187613b66565b6001600160a01b03161480610d27575030610d1c6020870187613b66565b6001600160a01b0316145b610d435760405162461bcd60e51b815260040161070990614cac565b610d508660800151612f65565b15610d6857610d628660800151612fb0565b60808701525b6000610d72611c00565b6001600160a01b03166352bbbe2984898989896040518663ffffffff1660e01b8152600401610da49493929190614d51565b6020604051808303818588803b158015610dbd57600080fd5b505af1158015610dd1573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610df69190614531565b9050610e0182612f65565b15610e1057610e108282613055565b50505050505050565b6040517f3b9f73840000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633b9f738490610e8590879087903390600401614959565b602060405180830381600087803b158015610e9f57600080fd5b505af1158015610eb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed79190614531565b90506106a782612f65565b610eeb83612f65565b15610efc57610ef983612fb0565b92505b600082610f7b57866001600160a01b03166351c0e0616040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f3e57600080fd5b505af1158015610f52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f769190613b82565b610fee565b866001600160a01b0316634800d97f6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610fb657600080fd5b505af1158015610fca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fee9190613b82565b90506001600160a01b0386163014611033576001600160a01b03861633146110285760405162461bcd60e51b815260040161070990614cac565b611033868286613082565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b39061107a908a9088906004016148f1565b602060405180830381600087803b15801561109457600080fd5b505af11580156110a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cc9190613e6f565b506040517f2f2cab870000000000000000000000000000000000000000000000000000000081526000906001600160a01b03891690632f2cab879061111b908990899086908a9060040161492d565b602060405180830381600087803b15801561113557600080fd5b505af1158015611149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116d9190614531565b905061117883612f65565b15611187576111878382613055565b5050505050505050565b61119a82612f65565b156111ab576111a882612fb0565b91505b6001600160a01b03841630146111ee576001600160a01b03841633146111e35760405162461bcd60e51b815260040161070990614cac565b6111ee848684613082565b6040517fea785a5e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b0387169063ea785a5e9061123890879087906004016148f1565b602060405180830381600087803b15801561125257600080fd5b505af1158015611266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128a9190614531565b905061129582612f65565b156112a4576112a48282613055565b505050505050565b6112b581612f65565b156112c6576112c381612fb0565b90505b6001600160a01b0383163014611309576001600160a01b03831633146112fe5760405162461bcd60e51b815260040161070990614cac565b611309838583613082565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526001600160a01b03851690632e1a7d4d9061134e908490600401614ddc565b600060405180830381600087803b15801561136857600080fd5b505af115801561137c573d6000803e3d6000fd5b505050506001600160a01b03821630146104c6576000846001600160a01b03166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b1580156113cb57600080fd5b505afa1580156113df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114039190613b82565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081529091506001600160a01b0382169063a9059cbb9061144d90869086906004016148f1565b602060405180830381600087803b15801561146757600080fd5b505af115801561147b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a49190613e6f565b6114a882612f65565b156114b9576114b682612fb0565b91505b6000856001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114f457600080fd5b505afa158015611508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152c9190613b82565b90506001600160a01b0385163014611571576001600160a01b03851633146115665760405162461bcd60e51b815260040161070990614cac565b611571858285613082565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b3906115b890899087906004016148f1565b602060405180830381600087803b1580156115d257600080fd5b505af11580156115e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160a9190613e6f565b506040517f6e553f650000000000000000000000000000000000000000000000000000000081526000906001600160a01b03881690636e553f65906116559087908990600401614de5565b602060405180830381600087803b15801561166f57600080fd5b505af1158015611683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a79190614531565b90506116b283612f65565b15610e1057610e108382613055565b6116ca83612f65565b156116db576116d883612fb0565b92505b6001600160a01b038516301461171e576001600160a01b03851633146117135760405162461bcd60e51b815260040161070990614cac565b61171e858785613082565b6040517fead5d3590000000000000000000000000000000000000000000000000000000081526000906001600160a01b0388169063ead5d3599061176a9088908890889060040161490a565b6040805180830381600087803b15801561178357600080fd5b505af1158015611797573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117bb9190614549565b915050610e0182612f65565b6117d081612f65565b156117e1576117de81612fb0565b90505b6000846001600160a01b03166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b15801561181c57600080fd5b505afa158015611830573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118549190613b82565b90506001600160a01b0384163014611899576001600160a01b038416331461188e5760405162461bcd60e51b815260040161070990614cac565b611899848284613082565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b3906118e090889086906004016148f1565b602060405180830381600087803b1580156118fa57600080fd5b505af115801561190e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119329190613e6f565b506040517f6e553f650000000000000000000000000000000000000000000000000000000081526001600160a01b03861690636e553f659061197a9085908790600401614de5565b600060405180830381600087803b15801561199457600080fd5b505af11580156119a8573d6000803e3d6000fd5b505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b0384163014806119ec575082155b611a085760405162461bcd60e51b815260040161070990614ce3565b606063fa6e671d60e01b338686604051602401611a27939291906147a5565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009095169490941790935251611a9692869186910161475e565b60408051601f1981840301815291905290506112a46001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168261311e565b6040517fc65427940000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c654279490611b4c9030908a908a908a908a908a908a906004016148ad565b600060405180830381600087803b158015611b6657600080fd5b505af1158015611b7a573d6000803e3d6000fd5b50505050505050505050565b866001600160a01b031663d505accf87611b9e611c00565b88888888886040518863ffffffff1660e01b8152600401611bc5979695949392919061486c565b600060405180830381600087803b158015611bdf57600080fd5b505af1158015611bf3573d6000803e3d6000fd5b5050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b038516331480611c4357506001600160a01b03851630145b611c5f5760405162461bcd60e51b815260040161070990614cac565b6000611c6a88613196565b90506000611c7783612f65565b611c82576000611d17565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038316906370a0823190611cc7908990600401614791565b60206040518083038186803b158015611cdf57600080fd5b505afa158015611cf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d179190614531565b9050611d2788866040015161319c565b6040860152611d34611c00565b6001600160a01b031663b95cac28858b8a8a8a6040518663ffffffff1660e01b8152600401611d669493929190614afd565b6000604051808303818588803b158015611d7f57600080fd5b505af1158015611d93573d6000803e3d6000fd5b5050505050611da183612f65565b156119a8576040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038416906370a0823190611dee908a90600401614791565b60206040518083038186803b158015611e0657600080fd5b505afa158015611e1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3e9190614531565b9050611b7a846108a383856131ca565b876001600160a01b0316638fcbaf0c88611e66611c00565b8989898989896040518963ffffffff1660e01b8152600401611e8f989796959493929190614823565b600060405180830381600087803b158015611ea957600080fd5b505af1158015611ebd573d6000803e3d6000fd5b505050505050505050505050565b611ed482612f65565b15611ee557611ee282612fb0565b91505b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015611f2057600080fd5b505afa158015611f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f589190613b82565b90506001600160a01b0385163014611f9d576001600160a01b0385163314611f925760405162461bcd60e51b815260040161070990614cac565b611f9d858285613082565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b390611fe490899087906004016148f1565b602060405180830381600087803b158015611ffe57600080fd5b505af1158015612012573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120369190613e6f565b506040517f2f4f21e20000000000000000000000000000000000000000000000000000000081526000906001600160a01b03881690632f4f21e29061165590889088906004016148f1565b61208a81612f65565b1561209b5761209881612fb0565b90505b816001600160a01b031663095ea7b36120b2611c00565b836040518363ffffffff1660e01b81526004016120d09291906148f1565b602060405180830381600087803b1580156120ea57600080fd5b505af11580156120fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121229190613e6f565b505050565b61213082612f65565b156121415761213e82612fb0565b91505b6001600160a01b0384163014612184576001600160a01b03841633146121795760405162461bcd60e51b815260040161070990614cac565b612184848684613082565b6000856001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156121bf57600080fd5b505afa1580156121d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f79190613b82565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081529091506001600160a01b03871690632e1a7d4d9061223f908690600401614ddc565b600060405180830381600087803b15801561225957600080fd5b505af115801561226d573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b03841691506370a08231906122b9903090600401614791565b60206040518083038186803b1580156122d157600080fd5b505afa1580156122e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123099190614531565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081529091506001600160a01b0383169063a9059cbb9061235390889085906004016148f1565b602060405180830381600087803b15801561236d57600080fd5b505af1158015612381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a59190613e6f565b506116b283612f65565b6001600160a01b0385163314806123ce57506001600160a01b03851630145b6123ea5760405162461bcd60e51b815260040161070990614cac565b60608167ffffffffffffffff8111801561240357600080fd5b5060405190808252806020026020018201604052801561242d578160200160208202803683370190505b50905060608267ffffffffffffffff8111801561244957600080fd5b50604051908082528060200260200182016040528015612473578160200160208202803683370190505b50905060005b838110156125e35761249085858381811061082e57fe5b6124ac5760405162461bcd60e51b815260040161070990614d1a565b85516000908686848181106124bd57fe5b90506040020160000135815181106124d157fe5b6020026020010151905086606001511561251f576124ee816131e0565b8483815181106124fa57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506125da565b612528816131e3565b6125b557612535816131e0565b6001600160a01b03166370a08231896040518263ffffffff1660e01b81526004016125609190614791565b60206040518083038186803b15801561257857600080fd5b505afa15801561258c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b09190614531565b6125c1565b876001600160a01b0316315b8383815181106125cd57fe5b6020026020010181815250505b50600101612479565b5084606001511561267a576125f6611c00565b6001600160a01b0316630f5a6efa87846040518363ffffffff1660e01b81526004016126239291906147c9565b60006040518083038186803b15801561263b57600080fd5b505afa15801561264f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126779190810190613e34565b90505b6126888886604001516131f0565b6040860152612695611c00565b6001600160a01b0316638bdb39138a8989896040518563ffffffff1660e01b81526004016126c69493929190614afd565b600060405180830381600087803b1580156126e057600080fd5b505af11580156126f4573d6000803e3d6000fd5b50606092508591505067ffffffffffffffff8111801561271357600080fd5b5060405190808252806020026020018201604052801561273d578160200160208202803683370190505b5090508560600151156127da57612752611c00565b6001600160a01b0316630f5a6efa88856040518363ffffffff1660e01b815260040161277f9291906147c9565b60006040518083038186803b15801561279757600080fd5b505afa1580156127ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526127d39190810190613e34565b90506128d8565b60005b848110156128d65786516000908787848181106127f657fe5b905060400201600001358151811061280a57fe5b6020026020010151905061281d816131e3565b6128aa5761282a816131e0565b6001600160a01b03166370a082318a6040518263ffffffff1660e01b81526004016128559190614791565b60206040518083038186803b15801561286d57600080fd5b505afa158015612881573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a59190614531565b6128b6565b886001600160a01b0316315b8383815181106128c257fe5b6020908102919091010152506001016127dd565b505b60005b84811015611bf3576129358686838181106128f257fe5b905060400201602001356108a385848151811061290b57fe5b602002602001015185858151811061291f57fe5b60200260200101516131ca90919063ffffffff16565b6001016128db565b61294682612f65565b156129575761295482612fb0565b91505b6001600160a01b03841630146129ba576001600160a01b038416331461298f5760405162461bcd60e51b815260040161070990614cac565b6129ba847f000000000000000000000000000000000000000000000000000000000000000084613082565b6040517fde0e9a3e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063de0e9a3e90612a22908690600401614ddc565b602060405180830381600087803b158015612a3c57600080fd5b505af1158015612a50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a749190614531565b90506001600160a01b0384163014610b9d576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90610b4990879085906004016148f1565b612af682612f65565b15612b0757612b0482612fb0565b91505b6000856001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612b4257600080fd5b505afa158015612b56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b7a9190613b82565b90506001600160a01b0385163014612bbf576001600160a01b0385163314612bb45760405162461bcd60e51b815260040161070990614cac565b612bbf858285613082565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063095ea7b390612c0690899087906004016148f1565b602060405180830381600087803b158015612c2057600080fd5b505af1158015612c34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c589190613e6f565b506040517fb6b55f250000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063b6b55f2590612c9e908690600401614ddc565b600060405180830381600087803b158015612cb857600080fd5b505af1158015612ccc573d6000803e3d6000fd5b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152600092506001600160a01b03891691506370a0823190612d18903090600401614791565b60206040518083038186803b158015612d3057600080fd5b505afa158015612d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d689190614531565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081529091506001600160a01b0388169063a9059cbb9061235390889085906004016148f1565b60005b82811015612e465733848483818110612dca57fe5b905060a002016060016020810190612de29190613b66565b6001600160a01b03161480612e22575030848483818110612dff57fe5b905060a002016060016020810190612e179190613b66565b6001600160a01b0316145b612e3e5760405162461bcd60e51b815260040161070990614cac565b600101612db5565b50612e4f611c00565b6001600160a01b0316630e8e3e848285856040518463ffffffff1660e01b8152600401612e7d9291906149b9565b6000604051808303818588803b158015612e9657600080fd5b505af1158015611187573d6000803e3d6000fd5b612eb382612f65565b15612ec457612ec182612fb0565b91505b6001600160a01b0384163014612f07576001600160a01b0384163314612efc5760405162461bcd60e51b815260040161070990614cac565b612f07848684613082565b6040517fba0876520000000000000000000000000000000000000000000000000000000081526000906001600160a01b0387169063ba0876529061123890869088903090600401614dfc565b6000612f5e82613217565b9392505050565b7fba100000000000000000000000000000000000000000000000000000000000007ffff00000000000000000000000000000000000000000000000000000000000008216145b919050565b6000806000612fbe84613217565b91509150612fcb8461322e565b15612f5e57600082559392505050565b612fea814710156101a3613275565b6000826001600160a01b031682604051613003906131e0565b60006040518083038185875af1925050503d8060008114613040576040519150601f19603f3d011682016040523d82523d6000602084013e613045565b606091505b50509050612122816101a4613275565b600061306083613287565b919091555050565b600080821361307a578160000361307c565b815b92915050565b8061308c57612122565b6040805160018082528183019092526060916020808301908036833701905050905082816000815181106130bc57fe5b6001600160a01b039290921660209283029190910190910152604080516001808252818301909252606091816020016020820280368337019050509050828160008151811061310757fe5b602002602001018181525050610bb58583836132e5565b606060006060846001600160a01b03168460405161313c9190614742565b6000604051808303816000865af19150503d8060008114613179576040519150601f19603f3d011682016040523d82523d6000602084013e61317e565b606091505b509150915061318d828261341f565b95945050505050565b60601c90565b606060008380156131a957fe5b14156131bf576131b882613449565b905061307c565b61307c610136613486565b60006131da838311156001613275565b50900390565b90565b6001600160a01b03161590565b606060008380156131fd57fe5b141561320c576131b8826134b3565b61307c610150613486565b60008061322383613287565b915081549050915091565b7fffff000000000000000000000000000000000000000000000000000000000000167fba100000000000000000000000000000000000000000000000000000000000001490565b816132835761328381613486565b5050565b60006001613294836134fc565b7f00000000000000000000000000000000000000000000000000000000000000006040516020016132c6929190614783565b60408051808303601f1901815291905280516020909101200392915050565b6060825167ffffffffffffffff811180156132ff57600080fd5b5060405190808252806020026020018201604052801561333957816020015b61332661374a565b81526020019060019003908161331e5790505b50905060005b83518110156133d1576040805160a08101909152806003815260200185838151811061336757fe5b60200260200101516001600160a01b0316815260200184838151811061338957fe5b60200260200101518152602001866001600160a01b03168152602001306001600160a01b03168152508282815181106133be57fe5b602090810291909101015260010161333f565b506133da611c00565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b81526004016134059190614a67565b600060405180830381600087803b158015612e9657600080fd5b6060821561342e57508061307c565b81511561343e5781518083602001fd5b61307c6101ae613486565b606060006134568361351f565b9050600181600381111561346657fe5b141561347d5761347583613535565b915050612fab565b82915050612fab565b6134b0817f42414c00000000000000000000000000000000000000000000000000000000006135e3565b50565b606060006134c08361351f565b905060008160038111156134d057fe5b14156134df5761347583613644565b60018160038111156134ed57fe5b141561347d57613475836136a7565b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b60008180602001905181019061307c9190614258565b6060806000613543846136fa565b915091506000805b83518110156135a957600084828151811061356257fe5b6020026020010151905061357581612f65565b156135a05761358381612fb0565b85838151811061358f57fe5b602002602001018181525050600192505b5060010161354b565b50806135b5578461318d565b600183836040516020016135cb93929190614b71565b60405160208183030381529060405295945050505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60606000806136528461371d565b9150915061365f82612f65565b1561369d5761366d82612fb0565b91506000828260405160200161368593929190614b50565b60405160208183030381529060405292505050612fab565b8392505050612fab565b606060006136b483613734565b90506136bf81612f65565b1561347d576136cd81612fb0565b90506001816040516020016136e3929190614b39565b604051602081830303815290604052915050612fab565b606060008280602001905181019061371291906142d7565b909590945092505050565b6000808280602001905181019061371291906142a1565b600081806020019051810190612f5e9190614274565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561307c81614eaf565b60008083601f840112613796578182fd5b50813567ffffffffffffffff8111156137ad578182fd5b60208301915083602080830285010111156137c757600080fd5b9250929050565b600082601f8301126137de578081fd5b81356137f16137ec82614e42565b614e1b565b81815291506020808301908481018184028601820187101561381257600080fd5b60005b8481101561383a57813561382881614eaf565b84529282019290820190600101613815565b505050505092915050565b600082601f830112613855578081fd5b81356138636137ec82614e42565b818152915060208083019084810160005b8481101561383a578135870160a080601f19838c0301121561389557600080fd5b61389e81614e1b565b85830135815260408084013587830152606080850135828401526080915081850135818401525082840135925067ffffffffffffffff8311156138e057600080fd5b6138ee8c8885870101613a10565b90820152865250509282019290820190600101613874565b60008083601f840112613917578182fd5b50813567ffffffffffffffff81111561392e578182fd5b6020830191508360206040830285010111156137c757600080fd5b600082601f830112613959578081fd5b81356139676137ec82614e42565b81815291506020808301908481018184028601820187101561398857600080fd5b60005b8481101561383a5781358452928201929082019060010161398b565b600082601f8301126139b7578081fd5b81516139c56137ec82614e42565b8181529150602080830190848101818402860182018710156139e657600080fd5b60005b8481101561383a578151845292820192908201906001016139e9565b803561307c81614ec4565b600082601f830112613a20578081fd5b813567ffffffffffffffff811115613a36578182fd5b613a496020601f19601f84011601614e1b565b9150808252836020828501011115613a6057600080fd5b8060208401602084013760009082016020015292915050565b80356001811061307c57600080fd5b80356002811061307c57600080fd5b600060808284031215613aa8578081fd5b613ab26080614e1b565b9050813567ffffffffffffffff80821115613acc57600080fd5b613ad8858386016137ce565b83526020840135915080821115613aee57600080fd5b613afa85838601613949565b60208401526040840135915080821115613b1357600080fd5b50613b2084828501613a10565b604083015250613b338360608401613a05565b606082015292915050565b600060808284031215613b4f578081fd5b50919050565b803560ff8116811461307c57600080fd5b600060208284031215613b77578081fd5b8135612f5e81614eaf565b600060208284031215613b93578081fd5b8151612f5e81614eaf565b60008060008060808587031215613bb3578283fd5b8435613bbe81614eaf565b93506020850135613bce81614eaf565b93969395505050506040820135916060013590565b60008060008060608587031215613bf8578182fd5b8435613c0381614eaf565b93506020850135613c1381614ec4565b9250604085013567ffffffffffffffff80821115613c2f578384fd5b818701915087601f830112613c42578384fd5b813581811115613c50578485fd5b886020828501011115613c61578485fd5b95989497505060200194505050565b600080600060608486031215613c84578081fd5b8335613c8f81614eaf565b95602085013595506040909401359392505050565b600080600060408486031215613cb8578081fd5b833567ffffffffffffffff811115613cce578182fd5b613cda86828701613785565b909790965060209590950135949350505050565b60008060208385031215613d00578182fd5b823567ffffffffffffffff811115613d16578283fd5b613d2285828601613785565b90969095509350505050565b60006020808385031215613d40578182fd5b825167ffffffffffffffff811115613d56578283fd5b8301601f81018513613d66578283fd5b8051613d746137ec82614e42565b8181528381019083850185840285018601891015613d90578687fd5b8694505b83851015613db2578051835260019490940193918501918501613d94565b50979650505050505050565b600080600060408486031215613dd2578081fd5b833567ffffffffffffffff80821115613de9578283fd5b818601915086601f830112613dfc578283fd5b813581811115613e0a578384fd5b87602060a083028501011115613e1e578384fd5b6020928301989097509590910135949350505050565b600060208284031215613e45578081fd5b815167ffffffffffffffff811115613e5b578182fd5b613e67848285016139a7565b949350505050565b600060208284031215613e80578081fd5b8151612f5e81614ec4565b60008060008060008060c08789031215613ea3578384fd5b8635613eae81614ec4565b95506020870135613ebe81614eaf565b945060408701359350613ed48860608901613b55565b92506080870135915060a087013590509295509295509295565b600080600080600080600060c0888a031215613f08578485fd5b87359650613f198960208a01613a79565b95506040880135613f2981614eaf565b94506060880135613f3981614eaf565b9350608088013567ffffffffffffffff80821115613f55578283fd5b613f618b838c01613a97565b945060a08a0135915080821115613f76578283fd5b50613f838a828b01613906565b989b979a50959850939692959293505050565b600080600080600080600060e0888a031215613fb0578081fd5b87359650613fc18960208a01613a79565b95506040880135613fd181614eaf565b94506060880135613fe181614eaf565b9350608088013567ffffffffffffffff811115613ffc578182fd5b6140088a828b01613a97565b93505060a0880135915060c0880135905092959891949750929550565b600080600080600080600080610100898b031215614041578182fd5b883561404c81614eaf565b9750602089013561405c81614eaf565b96506040890135955060608901359450608089013561407a81614ec4565b93506140898a60a08b01613b55565b925060c0890135915060e089013590509295985092959890939650565b600080600080600080600060e0888a0312156140c0578081fd5b87356140cb81614eaf565b965060208801356140db81614eaf565b955060408801359450606088013593506140f88960808a01613b55565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215614126578182fd5b823561413181614eaf565b946020939093013593505050565b600080600080600060a08688031215614156578283fd5b853561416181614eaf565b9450602086013561417181614eaf565b9350604086013561418181614eaf565b94979396509394606081013594506080013592915050565b600080600080608085870312156141ae578182fd5b84356141b981614eaf565b935060208501356141c981614eaf565b925060408501356141d981614eaf565b9396929550929360600135925050565b60008060008060008060c08789031215614201578384fd5b863561420c81614eaf565b9550602087013561421c81614eaf565b9450604087013561422c81614eaf565b935060608701359250608087013561424381614ec4565b8092505060a087013590509295509295509295565b600060208284031215614269578081fd5b8151612f5e81614ed2565b60008060408385031215614286578182fd5b825161429181614ed2565b6020939093015192949293505050565b6000806000606084860312156142b5578081fd5b83516142c081614ed2565b602085015160409095015190969495509392505050565b6000806000606084860312156142eb578081fd5b83516142f681614ed2565b602085015190935067ffffffffffffffff811115614312578182fd5b61431e868287016139a7565b925050604084015190509250925092565b60008060008060008060008060008060006101608c8e031215614350578485fd5b61435a8d8d613a88565b9a5067ffffffffffffffff8060208e01351115614375578586fd5b6143858e60208f01358f01613845565b9a508060408e01351115614397578586fd5b6143a78e60408f01358f01613785565b909a5098506143b98e60608f01613b3e565b97508060e08e013511156143cb578586fd5b6143db8e60e08f01358f01613785565b90975095506101008d013594506101208d013593506101408d0135811015614401578283fd5b506144138d6101408e01358e01613906565b81935080925050509295989b509295989b9093969950565b6000806000806000806101208789031215614444578384fd5b863567ffffffffffffffff8082111561445b578586fd5b9088019060c0828b03121561446e578586fd5b61447860c0614e1b565b823581526144898b60208501613a88565b6020820152604083013561449c81614eaf565b60408201526144ae8b6060850161377a565b60608201526080830135608082015260a0830135828111156144ce578788fd5b6144da8c828601613a10565b60a0830152508098505050506144f38860208901613b3e565b959895975050505060a08401359360c08101359360e08201359350610100909101359150565b60006020828403121561452a578081fd5b5035919050565b600060208284031215614542578081fd5b5051919050565b6000806040838503121561455b578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b60008284526020808501945082825b858110156145b657813561459b81614eaf565b6001600160a01b031687529582019590820190600101614588565b509495945050505050565b60008284526020808501945082825b858110156145b6578135875295820195908201906001016145d0565b6000815180845260208085019450808401835b838110156145b6578151875295820195908201906001016145ff565b15159052565b60008151808452614639816020860160208601614e6f565b601f01601f19169290920160200192915050565b8051608080845281519084018190526000916020919082019060a0860190845b818110156146925783516001600160a01b03168352928401929184019160010161466d565b5050828501519150858103838701526146ab81836145ec565b92505050604083015184820360408601526146c68282614621565b91505060608301516146db606086018261461b565b509392505050565b80356146ee81614eaf565b6001600160a01b03908116835260208201359061470a82614ec4565b901515602084015260408201359061472182614eaf565b166040830152606081013561473581614ec4565b8015156060840152505050565b60008251614754818460208701614e6f565b9190910192915050565b60008451614770818460208901614e6f565b8201838582379092019182525092915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000604082016001600160a01b03808616845260206040818601528286518085526060870191508288019450855b818110156148155785518516835294830194918301916001016147f7565b509098975050505050505050565b6001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b0397881681529515156020870152939095166040850152606084019190915260ff16608083015260a082019290925260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b6001600160a01b03949094168452602084019290925261ffff1660408301521515606082015260800190565b6040808252810183905260008460608301825b8681101561499c576020833561498181614eaf565b6001600160a01b03168352928301929091019060010161496c565b5080925050506001600160a01b0383166020830152949350505050565b6020808252818101839052600090604080840186845b87811015614a5a5781356149e281614ed2565b6149eb81614e9b565b8352818501356149fa81614eaf565b6001600160a01b03168386015281840135848401526060614a1d81840184614e62565b614a298286018261456c565b50506080614a3981840184614e62565b614a458286018261456c565b505060a09283019291909101906001016149cf565b5090979650505050505050565b602080825282518282018190526000919060409081850190868401855b82811015614af05781518051614a9981614e9b565b8552808701516001600160a01b0316878601528581015186860152606080820151614ac68288018261456c565b505060809081015190614adb8682018361456c565b505060a0939093019290850190600101614a84565b5091979650505050505050565b60008582526001600160a01b03808616602084015280851660408401525060806060830152614b2f608083018461464d565b9695505050505050565b60408101614b4684614e9b565b9281526020015290565b60608101614b5d85614e9b565b938152602081019290925260409091015290565b6000614b7c85614e9b565b84825260606020830152614b9360608301856145ec565b9050826040830152949350505050565b6000610120808301614bb48c614ea5565b8b84526020808501929092528a5190819052610140808501928281028601909101918c8201855b82811015614c5b578785037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec00186528151805186528481015185870152604080820151908701526060808201519087015260809081015160a091870182905290614c4781880183614621565b978601979650505090830190600101614bdb565b505050508381036040850152614c72818a8c614579565b915050614c8260608401886146e3565b82810360e0840152614c958186886145c1565b915050826101008301529998505050505050505050565b60208082526010908201527f496e636f72726563742073656e64657200000000000000000000000000000000604082015260600190565b6020808252601f908201527f52656c617965722063616e206f6e6c7920617070726f766520697473656c6600604082015260600190565b60208082526019908201527f696e76616c696420636861696e6564207265666572656e636500000000000000604082015260600190565b600060e08252855160e08301526020860151614d6c81614ea5565b61010083015260408601516001600160a01b03908116610120840152606087015116610140830152608086015161016083015260a086015160c0610180840152614dba6101a0840182614621565b915050614dca60208301866146e3565b60a082019390935260c0015292915050565b90815260200190565b9182526001600160a01b0316602082015260400190565b9283526001600160a01b03918216602084015216604082015260600190565b60405181810167ffffffffffffffff81118282101715614e3a57600080fd5b604052919050565b600067ffffffffffffffff821115614e58578081fd5b5060209081020190565b60008235612f5e81614eaf565b60005b83811015614e8a578181015183820152602001614e72565b838111156104c65750506000910152565b600481106134b057fe5b600281106134b057fe5b6001600160a01b03811681146134b057600080fd5b80151581146134b057600080fd5b600481106134b057600080fdfea264697066735822122050b32f1916dd2bfb3a1d0a43f7959f7e0894f8a708f95ba38dda2a8251d8bb9564736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/index.ts b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/index.ts new file mode 100644 index 0000000..552b495 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/index.ts @@ -0,0 +1,16 @@ +import { Task, TaskRunOptions } from '@src'; +import { BatchRelayerDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as BatchRelayerDeployment; + + const relayerLibraryArgs = [input.Vault, input.wstETH, input.BalancerMinter]; + const relayerLibrary = await task.deployAndVerify('BatchRelayerLibrary', relayerLibraryArgs, from, force); + + // The relayer library automatically also deploys the relayer itself: we must verify it + const relayer: string = await relayerLibrary.getEntrypoint(); + + const relayerArgs = [input.Vault, relayerLibrary.address]; // See BalancerRelayer's constructor + await task.verify('BalancerRelayer', relayer, relayerArgs); + await task.save({ BalancerRelayer: relayer }); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/input.ts b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/input.ts new file mode 100644 index 0000000..e3557f5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/input.ts @@ -0,0 +1,47 @@ +import { Task, TaskMode } from '@src'; + +export type BatchRelayerDeployment = { + Vault: string; + wstETH: string; + BalancerMinter: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerMinter = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); + +export default { + Vault, + // wstETH and BalancerMinter are only deployed on mainnet, and goerli. + mainnet: { + wstETH: '0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0', + BalancerMinter, + }, + goerli: { + wstETH: '0x6320cD32aA674d2898A68ec82e869385Fc5f7E2f', + BalancerMinter, + }, + polygon: { + wstETH: '0x0000000000000000000000000000000000000000', + BalancerMinter: '0x0000000000000000000000000000000000000000', + }, + arbitrum: { + wstETH: '0x0000000000000000000000000000000000000000', + BalancerMinter: '0x0000000000000000000000000000000000000000', + }, + optimism: { + wstETH: '0x0000000000000000000000000000000000000000', + BalancerMinter: '0x0000000000000000000000000000000000000000', + }, + gnosis: { + wstETH: '0x0000000000000000000000000000000000000000', + BalancerMinter: '0x0000000000000000000000000000000000000000', + }, + bsc: { + wstETH: '0x0000000000000000000000000000000000000000', + BalancerMinter: '0x0000000000000000000000000000000000000000', + }, + avalanche: { + wstETH: '0x0000000000000000000000000000000000000000', + BalancerMinter: '0x0000000000000000000000000000000000000000', + }, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/arbitrum.json new file mode 100644 index 0000000..33523b3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/arbitrum.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x967F7AdD4Fd5AF0553B7A45F225ec26EDD699E61", + "BalancerRelayer": "0x5bf3B7c14b10f16939d63Bd679264A1Aa951B4D5" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/avalanche.json b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/avalanche.json new file mode 100644 index 0000000..208af2e --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/avalanche.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x6f5a2eE11E7a772AeB5114A20d0D7c0ff61EB8A0", + "BalancerRelayer": "0x9A7b723101ba5A4672960A3b65840AB3b7805048" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/bsc.json b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/bsc.json new file mode 100644 index 0000000..13dbbcb --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/bsc.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x8F42aDBbA1B16EaAE3BB5754915E0D06059aDd75", + "BalancerRelayer": "0x4574ccBcC09A00C9eE55fB92Fe353699A4fA800e" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/gnosis.json b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/gnosis.json new file mode 100644 index 0000000..5531d35 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/gnosis.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0xD7FAD3bd59D6477cbe1BE7f646F7f1BA25b230f8", + "BalancerRelayer": "0xeF606F58A4FD0fCcb066c6203d0994694d3eB2D3" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/goerli.json new file mode 100644 index 0000000..4eae814 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/goerli.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0xeb151668006CD04DAdD098AFd0a82e78F77076c3", + "BalancerRelayer": "0x00e695aA8000df01B8DC8401B4C34Fba5D56BBb2" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/mainnet.json new file mode 100644 index 0000000..f2cc623 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0xd02992266BB6a6324A3aB8B62FeCBc9a3C58d1F9", + "BalancerRelayer": "0x2536dfeeCB7A0397CF98eDaDA8486254533b1aFA" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/optimism.json b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/optimism.json new file mode 100644 index 0000000..f69ff4c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/optimism.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x8E5698dC4897DC12243c8642e77B4f21349Db97C", + "BalancerRelayer": "0x1a58897Ab366082028ced3740900ecBD765Af738" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/polygon.json new file mode 100644 index 0000000..1f2e11a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/output/polygon.json @@ -0,0 +1,4 @@ +{ + "BatchRelayerLibrary": "0x156C628135327F41748D8c8802fC043870714E9a", + "BalancerRelayer": "0x28A224d9d398a1eBB7BA69BCA515898966Bb1B6b" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/readme.md b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/readme.md new file mode 100644 index 0000000..d7f8e1a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/readme.md @@ -0,0 +1,21 @@ +# 2022-09-16 - Batch Relayer V4 + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> This deployment has been deprecated in favor of a new version with full support for stable pools and new protocols. +> The new version is: [batch-relayer-v5](../../20230314-batch-relayer-v5/). + +Deployment of the fourth `BalancerRelayer` using `BatchRelayerLibrary`, for combining multiple operations (swaps, joins, etc.) in a single transaction. + +This new version provides quality of life improvements, like read-only chained references and ways to read them. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`BatchRelayerLibrary` artifact](./artifact/BatchRelayerLibrary.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/test/test.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/test/test.fork.ts new file mode 100644 index 0000000..e970fbf --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20220916-batch-relayer-v4/test/test.fork.ts @@ -0,0 +1,151 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; + +import { BigNumberish } from '@helpers/numbers'; + +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { WeightedPoolEncoder } from '@helpers/models/pools/weighted/encoder'; + +import { MAX_UINT256 } from '@helpers/constants'; +import { defaultAbiCoder } from '@ethersproject/abi/lib/abi-coder'; + +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; + +describeForkTest('BatchRelayerLibrary', 'mainnet', 15485000, function () { + let task: Task; + + let relayer: Contract, library: Contract; + let sender: SignerWithAddress; + let vault: Contract, authorizer: Contract; + + const WETH = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'; + + const ETH_STETH_POOL = '0x32296969ef14eb0c6d29669c550d4a0449130230000200000000000000000080'; + const ETH_STETH_GAUGE = '0xcD4722B7c24C29e0413BDCd9e51404B4539D14aE'; + + const ETH_DAI_POOL = '0x0b09dea16768f0799065c475be02919503cb2a3500020000000000000000001a'; + const ETH_DAI_GAUGE = '0x4ca6AC0509E6381Ca7CD872a6cdC0Fbf00600Fa1'; + + const STAKED_ETH_STETH_HOLDER = '0x4B581dedA2f2C0650C3dFC506C86a8C140d9f699'; + + const CHAINED_REFERENCE_PREFIX = 'ba10'; + function toChainedReference(key: BigNumberish): BigNumber { + // The full padded prefix is 66 characters long, with 64 hex characters and the 0x prefix. + const paddedPrefix = `0x${CHAINED_REFERENCE_PREFIX}${'0'.repeat(64 - CHAINED_REFERENCE_PREFIX.length)}`; + + return BigNumber.from(paddedPrefix).add(key); + } + + before('run task', async () => { + task = new Task('20220916-batch-relayer-v4', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + library = await task.deployedInstance('BatchRelayerLibrary'); + relayer = await task.instanceAt('BalancerRelayer', await library.getEntrypoint()); + }); + + before('load vault and tokens', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + + vault = await vaultTask.instanceAt('Vault', await library.getVault()); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + }); + + before('load signers', async () => { + // We impersonate an account that holds staked BPT for the ETH_STETH Pool. + sender = await impersonate(STAKED_ETH_STETH_HOLDER); + }); + + before('approve relayer at the authorizer', async () => { + const relayerActionIds = await Promise.all( + ['swap', 'batchSwap', 'joinPool', 'exitPool', 'setRelayerApproval', 'manageUserBalance'].map((action) => + vault.getActionId(vault.interface.getSighash(action)) + ) + ); + + // We impersonate an account with the default admin role in order to be able to approve the relayer. This assumes + // such an account exists. + const admin = await impersonate(await authorizer.getRoleMember(await authorizer.DEFAULT_ADMIN_ROLE(), 0)); + + // Grant relayer permission to call all relayer functions + await authorizer.connect(admin).grantRoles(relayerActionIds, relayer.address); + }); + + before('approve relayer by the user', async () => { + await vault.connect(sender).setRelayerApproval(sender.address, relayer.address, true); + }); + + it('sender can unstake, exit, join and stake', async () => { + const destinationGauge = await task.instanceAt('IERC20', ETH_DAI_GAUGE); + expect(await destinationGauge.balanceOf(sender.address)).to.be.equal(0); + + // We use the relayer as the intermediate token holder as that saves gas (since there's fewer transfers, relayer + // permission checks, etc.) and also sidesteps the issue that not all BPT has Vault allowance (which is required to + // transfer them via the Vault, e.g. for staking). + + const stakedBalance = await (await task.instanceAt('IERC20', ETH_STETH_GAUGE)).balanceOf(sender.address); + + // There's no chained output here as the input equals the output + const unstakeCalldata = library.interface.encodeFunctionData('gaugeWithdraw', [ + ETH_STETH_GAUGE, + sender.address, + relayer.address, + stakedBalance, + ]); + + // Exit into WETH (it'd be more expensive to use ETH, and we'd have to use the relayer as an intermediary as we'd + // need to use said ETH). + + const ethStethTokens: Array = (await vault.getPoolTokens(ETH_STETH_POOL)).tokens; + const stableWethIndex = ethStethTokens.findIndex((token) => token.toLowerCase() == WETH.toLowerCase()); + + const exitCalldata = library.interface.encodeFunctionData('exitPool', [ + ETH_STETH_POOL, + 0, // Even if this a Stable Pool, the Batch Relayer is unaware of their encodings and the Weighted Pool encoding + // happens to match here + relayer.address, + relayer.address, + { + assets: ethStethTokens, + minAmountsOut: ethStethTokens.map(() => 0), + // Note that we use the same input as before + userData: defaultAbiCoder.encode(['uint256', 'uint256', 'uint256'], [0, stakedBalance, stableWethIndex]), + toInternalBalance: true, + }, + // Only store a chained reference for the WETH amount out, as the rest will be zero + [{ key: toChainedReference(42), index: stableWethIndex }], + ]); + + // Join from WETH + const ethDaiTokens: Array = (await vault.getPoolTokens(ETH_DAI_POOL)).tokens; + const ethDaiAmountsIn = ethDaiTokens.map((token) => + token.toLowerCase() == WETH.toLowerCase() ? toChainedReference(42) : 0 + ); + + const joinCalldata = library.interface.encodeFunctionData('joinPool', [ + ETH_DAI_POOL, + 0, // Weighted Pool + relayer.address, + relayer.address, + { + assets: ethDaiTokens, + maxAmountsIn: ethDaiTokens.map(() => MAX_UINT256), + userData: WeightedPoolEncoder.joinExactTokensInForBPTOut(ethDaiAmountsIn, 0), + fromInternalBalance: true, // Since we're joining from internal balance, we don't need to grant token allowance + }, + 0, // No eth + toChainedReference(17), // Store a reference for later staking + ]); + + const stakeCalldata = library.interface.encodeFunctionData('gaugeDeposit', [ + ETH_DAI_GAUGE, + relayer.address, + sender.address, + toChainedReference(17), // Stake all BPT from the join + ]); + + await relayer.connect(sender).multicall([unstakeCalldata, exitCalldata, joinCalldata, stakeCalldata]); + + expect(await destinationGauge.balanceOf(sender.address)).to.be.gt(0); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/artifact/CircuitBreakerLib.json b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/artifact/CircuitBreakerLib.json new file mode 100644 index 0000000..64c9b66 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/artifact/CircuitBreakerLib.json @@ -0,0 +1,40 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "CircuitBreakerLib", + "sourceName": "contracts/lib/CircuitBreakerLib.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "bound", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isLowerBound", + "type": "bool" + } + ], + "name": "calcAdjustedBound", + "outputs": [ + { + "internalType": "uint256", + "name": "boundRatio", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x610cf8610026600b82828239805160001a60731461001957fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063f4d8cb7c1461003a575b600080fd5b6100656004803603606081101561005057600080fd5b50803590602081013590604001351515610077565b60408051918252519081900360200190f35b600061009f84610086856100a7565b84610093576100b9610097565b6101735b63ffffffff16565b949350505050565b670de0b6b3a764000081810391100290565b6000670de0b6b3a76400008214156100d257508161016d565b671bc16d674ec800008214156100f3576100ec83846101f9565b905061016d565b673782dace9d90000082141561012357600061010f84856101f9565b905061011b81826101f9565b91505061016d565b600061012f848461022f565b9050600061014961014283612710610339565b6001610371565b90508082101561015e5760009250505061016d565b610168828261038a565b925050505b92915050565b6000670de0b6b3a764000082141561018c57508161016d565b671bc16d674ec800008214156101a6576100ec8384610339565b673782dace9d9000008214156101ce5760006101c28485610339565b905061011b8182610339565b60006101da848461022f565b905060006101ed61014283612710610339565b90506101688282610371565b600082820261021d84158061021657508385838161021357fe5b04145b60036103a0565b670de0b6b3a764000090049392505050565b6000816102455750670de0b6b3a764000061016d565b826102525750600061016d565b61026260ff84901c1560066103a0565b82610288770bce5086492111aea88f4bb1ca6bcf584181ea8059f76532841060076103a0565b826000670c7d713b49da0000831380156102a95750670f43fc2c04ee000083125b156102e05760006102b9846103b2565b9050670de0b6b3a764000080820784020583670de0b6b3a7640000830502019150506102ee565b816102ea846104d2565b0290505b670de0b6b3a76400009005610326680238fd42c5cf03ffff19821280159061031f575068070c1cc73b00c800008213155b60086103a0565b61032f81610871565b9695505050505050565b600082820261035384158061021657508385838161021357fe5b6001670de0b6b3a76400006001830304018115150291505092915050565b600082820161038384821015836103a0565b9392505050565b600061039a8383111560016103a0565b50900390565b816103ae576103ae81610c4e565b5050565b670de0b6b3a7640000026000806a0c097ce7bc90715b34b9f160241b808401906ec097ce7bc90715b34b9f0fffffffff19850102816103ed57fe5b05905060006a0c097ce7bc90715b34b9f160241b82800205905081806a0c097ce7bc90715b34b9f160241b81840205915060038205016a0c097ce7bc90715b34b9f160241b82840205915060058205016a0c097ce7bc90715b34b9f160241b82840205915060078205016a0c097ce7bc90715b34b9f160241b82840205915060098205016a0c097ce7bc90715b34b9f160241b828402059150600b8205016a0c097ce7bc90715b34b9f160241b828402059150600d8205016a0c097ce7bc90715b34b9f160241b828402059150600f820581019050806002029450505050505b919050565b6000670de0b6b3a764000082121561050e57610504826a0c097ce7bc90715b34b9f160241b816104fe57fe5b056104d2565b60000390506104cd565b60007e1600ef3172e58d2e933ec884fde10064c63b5372d805e203c0000000000000831261055f57770195e54c5dd42177f53a27172fa9ec630262827000000000830592506806f05b59d3b2000000015b73011798004d755d3c8bc8e03204cf44619e0000008312610597576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff008400083126105df576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a700831261061a576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf850831261065157693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e2831261068857690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d0383126106bd5768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb4174612111083126106e857680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d831261071d576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f17757889379378312610752576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b2866038312610786576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac83126107ba576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b600068056bc75e2d63100000840168056bc75e2d6310000080860302816107dd57fe5b059050600068056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b60006108a0680238fd42c5cf03ffff198312158015610899575068070c1cc73b00c800008313155b60096103a0565b60008212156108d3576108b582600003610871565b6a0c097ce7bc90715b34b9f160241b816108cb57fe5b0590506104cd565b60006806f05b59d3b2000000831261091357506806f05b59d3b1ffffff1990910190770195e54c5dd42177f53a27172fa9ec630262827000000000610949565b6803782dace9d9000000831261094557506803782dace9d8ffffff19909101906b1425982cf597cd205cef7380610949565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac6200000084126109995768ad78ebc5ac61ffffff199093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d63100000084126109d5576856bc75e2d630ffffff199093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b188000008412610a0f57682b5e3af16b187fffff199093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c4000008412610a49576815af1d78b58c3fffff199093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac62000008412610a8257680ad78ebc5ac61fffff199093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d631000008412610abb5768056bc75e2d630fffff199093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b18800008412610af4576802b5e3af16b187ffff199093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c400008412610b2d5768015af1d78b58c3ffff199093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b610c5e816210905360ea1b610c61565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fdfea2646970667358221220a77afb65b9ec0ccef6b6e0c4d51569c85351cf30401a6040a347ae03ecceaf5864736f6c63430007010033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063f4d8cb7c1461003a575b600080fd5b6100656004803603606081101561005057600080fd5b50803590602081013590604001351515610077565b60408051918252519081900360200190f35b600061009f84610086856100a7565b84610093576100b9610097565b6101735b63ffffffff16565b949350505050565b670de0b6b3a764000081810391100290565b6000670de0b6b3a76400008214156100d257508161016d565b671bc16d674ec800008214156100f3576100ec83846101f9565b905061016d565b673782dace9d90000082141561012357600061010f84856101f9565b905061011b81826101f9565b91505061016d565b600061012f848461022f565b9050600061014961014283612710610339565b6001610371565b90508082101561015e5760009250505061016d565b610168828261038a565b925050505b92915050565b6000670de0b6b3a764000082141561018c57508161016d565b671bc16d674ec800008214156101a6576100ec8384610339565b673782dace9d9000008214156101ce5760006101c28485610339565b905061011b8182610339565b60006101da848461022f565b905060006101ed61014283612710610339565b90506101688282610371565b600082820261021d84158061021657508385838161021357fe5b04145b60036103a0565b670de0b6b3a764000090049392505050565b6000816102455750670de0b6b3a764000061016d565b826102525750600061016d565b61026260ff84901c1560066103a0565b82610288770bce5086492111aea88f4bb1ca6bcf584181ea8059f76532841060076103a0565b826000670c7d713b49da0000831380156102a95750670f43fc2c04ee000083125b156102e05760006102b9846103b2565b9050670de0b6b3a764000080820784020583670de0b6b3a7640000830502019150506102ee565b816102ea846104d2565b0290505b670de0b6b3a76400009005610326680238fd42c5cf03ffff19821280159061031f575068070c1cc73b00c800008213155b60086103a0565b61032f81610871565b9695505050505050565b600082820261035384158061021657508385838161021357fe5b6001670de0b6b3a76400006001830304018115150291505092915050565b600082820161038384821015836103a0565b9392505050565b600061039a8383111560016103a0565b50900390565b816103ae576103ae81610c4e565b5050565b670de0b6b3a7640000026000806a0c097ce7bc90715b34b9f160241b808401906ec097ce7bc90715b34b9f0fffffffff19850102816103ed57fe5b05905060006a0c097ce7bc90715b34b9f160241b82800205905081806a0c097ce7bc90715b34b9f160241b81840205915060038205016a0c097ce7bc90715b34b9f160241b82840205915060058205016a0c097ce7bc90715b34b9f160241b82840205915060078205016a0c097ce7bc90715b34b9f160241b82840205915060098205016a0c097ce7bc90715b34b9f160241b828402059150600b8205016a0c097ce7bc90715b34b9f160241b828402059150600d8205016a0c097ce7bc90715b34b9f160241b828402059150600f820581019050806002029450505050505b919050565b6000670de0b6b3a764000082121561050e57610504826a0c097ce7bc90715b34b9f160241b816104fe57fe5b056104d2565b60000390506104cd565b60007e1600ef3172e58d2e933ec884fde10064c63b5372d805e203c0000000000000831261055f57770195e54c5dd42177f53a27172fa9ec630262827000000000830592506806f05b59d3b2000000015b73011798004d755d3c8bc8e03204cf44619e0000008312610597576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff008400083126105df576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a700831261061a576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf850831261065157693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e2831261068857690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d0383126106bd5768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb4174612111083126106e857680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d831261071d576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f17757889379378312610752576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b2866038312610786576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac83126107ba576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b600068056bc75e2d63100000840168056bc75e2d6310000080860302816107dd57fe5b059050600068056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b60006108a0680238fd42c5cf03ffff198312158015610899575068070c1cc73b00c800008313155b60096103a0565b60008212156108d3576108b582600003610871565b6a0c097ce7bc90715b34b9f160241b816108cb57fe5b0590506104cd565b60006806f05b59d3b2000000831261091357506806f05b59d3b1ffffff1990910190770195e54c5dd42177f53a27172fa9ec630262827000000000610949565b6803782dace9d9000000831261094557506803782dace9d8ffffff19909101906b1425982cf597cd205cef7380610949565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac6200000084126109995768ad78ebc5ac61ffffff199093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d63100000084126109d5576856bc75e2d630ffffff199093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b188000008412610a0f57682b5e3af16b187fffff199093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c4000008412610a49576815af1d78b58c3fffff199093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac62000008412610a8257680ad78ebc5ac61fffff199093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d631000008412610abb5768056bc75e2d630fffff199093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b18800008412610af4576802b5e3af16b187ffff199093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c400008412610b2d5768015af1d78b58c3ffff199093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b610c5e816210905360ea1b610c61565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fdfea2646970667358221220a77afb65b9ec0ccef6b6e0c4d51569c85351cf30401a6040a347ae03ecceaf5864736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/artifact/ManagedPool.json b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/artifact/ManagedPool.json new file mode 100644 index 0000000..4439139 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/artifact/ManagedPool.json @@ -0,0 +1,1786 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ManagedPool", + "sourceName": "contracts/managed/ManagedPool.sol", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "normalizedWeights", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "assetManagers", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "swapEnabledOnStart", + "type": "bool" + }, + { + "internalType": "bool", + "name": "mustAllowlistLPs", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "managementAumFeePercentage", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "aumFeeId", + "type": "uint256" + } + ], + "internalType": "struct ManagedPoolSettings.NewPoolParams", + "name": "params", + "type": "tuple" + }, + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "contract IExternalWeightedMath", + "name": "weightedMath", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "member", + "type": "address" + } + ], + "name": "AllowlistAddressAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "member", + "type": "address" + } + ], + "name": "AllowlistAddressRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "bptPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lowerBoundPercentage", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "upperBoundPercentage", + "type": "uint256" + } + ], + "name": "CircuitBreakerSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "startSwapFeePercentage", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "endSwapFeePercentage", + "type": "uint256" + } + ], + "name": "GradualSwapFeeUpdateScheduled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "startWeights", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "endWeights", + "type": "uint256[]" + } + ], + "name": "GradualWeightUpdateScheduled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "bptAmount", + "type": "uint256" + } + ], + "name": "ManagementAumFeeCollected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "managementAumFeePercentage", + "type": "uint256" + } + ], + "name": "ManagementAumFeePercentageChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "mustAllowlistLPs", + "type": "bool" + } + ], + "name": "MustAllowlistLPsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "paused", + "type": "bool" + } + ], + "name": "PausedStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "feeCache", + "type": "bytes32" + } + ], + "name": "ProtocolFeePercentageCacheUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "RecoveryModeStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "swapEnabled", + "type": "bool" + } + ], + "name": "SwapEnabledSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "normalizedWeight", + "type": "uint256" + } + ], + "name": "TokenAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "TokenRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "member", + "type": "address" + } + ], + "name": "addAllowedAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "tokenToAdd", + "type": "address" + }, + { + "internalType": "address", + "name": "assetManager", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenToAddNormalizedWeight", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "mintAmount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "addToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collectAumManagementFees", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "enableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getActualSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "getCircuitBreakerState", + "outputs": [ + { + "internalType": "uint256", + "name": "bptPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "referenceWeight", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lowerBound", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "upperBound", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lowerBptPriceBound", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "upperBptPriceBound", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGradualSwapFeeUpdateParams", + "outputs": [ + { + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "startSwapFeePercentage", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endSwapFeePercentage", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGradualWeightUpdateParams", + "outputs": [ + { + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "startWeights", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "endWeights", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getManagementAumFeeParams", + "outputs": [ + { + "internalType": "uint256", + "name": "aumFeePercentage", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastCollectionTimestamp", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMustAllowlistLPs", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getNextNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNormalizedWeights", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPausedState", + "outputs": [ + { + "internalType": "bool", + "name": "paused", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "pauseWindowEndTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodEndTime", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "feeType", + "type": "uint256" + } + ], + "name": "getProtocolFeePercentageCache", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeesCollector", + "outputs": [ + { + "internalType": "contract IProtocolFeesCollector", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "feeType", + "type": "uint256" + } + ], + "name": "getProviderFeeId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getScalingFactors", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSwapEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSwapFeePercentage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "inRecoveryMode", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "member", + "type": "address" + } + ], + "name": "isAddressOnAllowlist", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onExitPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "dueProtocolFees", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onJoinPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "dueProtocolFees", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IERC20", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IPoolSwapStructs.SwapRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "indexIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "indexOut", + "type": "uint256" + } + ], + "name": "onSwap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IERC20", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IPoolSwapStructs.SwapRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "balanceTokenIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balanceTokenOut", + "type": "uint256" + } + ], + "name": "onSwap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryExit", + "outputs": [ + { + "internalType": "uint256", + "name": "bptIn", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryJoin", + "outputs": [ + { + "internalType": "uint256", + "name": "bptOut", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "member", + "type": "address" + } + ], + "name": "removeAllowedAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "tokenToRemove", + "type": "address" + }, + { + "internalType": "uint256", + "name": "burnAmount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "removeToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "bptPrices", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "lowerBoundPercentages", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "upperBoundPercentages", + "type": "uint256[]" + } + ], + "name": "setCircuitBreakers", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "managementAumFeePercentage", + "type": "uint256" + } + ], + "name": "setManagementAumFeePercentage", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "mustAllowlistLPs", + "type": "bool" + } + ], + "name": "setMustAllowlistLPs", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "swapEnabled", + "type": "bool" + } + ], + "name": "setSwapEnabled", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "updateProtocolFeePercentageCache", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "startSwapFeePercentage", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endSwapFeePercentage", + "type": "uint256" + } + ], + "name": "updateSwapFeeGradually", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "endWeights", + "type": "uint256[]" + } + ], + "name": "updateWeightsGradually", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6102206040523480156200001257600080fd5b506040516200775e3803806200775e833981016040819052620000359162001385565b86858060405180606001604052806000815260200160028152602001846101200151815250896200007d8b60018e604001518f60800151620003fe60201b620018e61760201c565b8c600001518d6020015189898c828286868a85336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000d3929190620010ae565b508051620000e9906004906020840190620010ae565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b1661012052506200016790506276a700831115610194620005cc565b6200017b62278d00821115610195620005cc565b4290910161014081905201610160526101808690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001d157600080fd5b505afa158015620001e6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020c919062001366565b606090811b6001600160601b03199081166101a052908a901b166101c05250505050604084015160009350620002559250905060106008620005e1602090811b62001a9917901c565b62000276836020015160086000016008620005e160201b62001a991760201c565b62000294846000015160006008620005e160201b62001a991760201c565b17176101e08190529050620002aa8382620005f6565b505050604082015151620002c4600282101560c8620005cc565b620002d5603282111560c9620005cc565b620002f7818460600151518560800151516200087c60201b62001aac1760201c565b61010083015162000308906200089c565b60005b8181101562000383576000846040015182815181106200032757fe5b602002602001015190506200036081866060015184815181106200034757fe5b60200260200101516200090e60201b62001ac91760201c565b6001600160a01b039091166000908152600b60205260409020556001016200030b565b50620003a542428560600151866060015187604001516200093260201b60201c565b60a0830151620003ba90429081908062000a8f565b60c0830151620003ca9062000b0a565b60e0830151620003da9062000b58565b505050505060609190911b6001600160601b03191661020052506200170e92505050565b6000620004168362000ba660201b62001ae21760201c565b606083516001016001600160401b03811180156200043357600080fd5b506040519080825280602002602001820160405280156200045e578160200160208202803683370190505b50905030816000815181106200047057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b8451811015620004e357848181518110620004aa57fe5b6020026020010151828260010181518110620004c257fe5b6001600160a01b039092166020928302919091019091015260010162000493565b50606083516001016001600160401b03811180156200050157600080fd5b506040519080825280602002602001820160405280156200052c578160200160208202803683370190505b5090506000816000815181106200053f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b8451811015620005b2578481815181106200057957fe5b60200260200101518282600101815181106200059157fe5b6001600160a01b039092166020928302919091019091015260010162000562565b50620005c18787848462000bb2565b979650505050505050565b81620005dd57620005dd8162000cac565b5050565b6000620005f084848462000cc1565b50501b90565b6000826001600160a01b0316631a7c326362000625600060088662000d1c60201b62001af0179092919060201c565b6040518263ffffffff1660e01b8152600401620006439190620015a9565b60206040518083038186803b1580156200065c57600080fd5b505afa15801562000671573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200069791906200134d565b905060006001600160a01b038416631a7c3263620006c48560088062000d1c602090811b62001af017901c565b6040518263ffffffff1660e01b8152600401620006e29190620015a9565b60206040518083038186803b158015620006fb57600080fd5b505afa15801562000710573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200073691906200134d565b905060006001600160a01b038516631a7c326362000764866010600862000d1c602090811b62001af017901c565b6040518263ffffffff1660e01b8152600401620007829190620015a9565b60206040518083038186803b1580156200079b57600080fd5b505afa158015620007b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007d691906200134d565b90506000620007f982604080600001016040620005e160201b62001a991760201c565b620008168460406000016040620005e160201b62001a991760201c565b620008308660006040620005e160201b62001a991760201c565b17179050806008819055507fc3f0acc358200d8e08ac6ce20bc2f9f27893a344f813bf682b7859b3e521502e816040516200086c9190620015a9565b60405180910390a1505050505050565b6200089782841480156200088f57508183145b6067620005cc565b505050565b620008b5670d2f13f7789f0000821115610160620005cc565b620008ce600a548262000d2b60201b62001aff1760201c565b600a556040517f556cdf4052d939f8acbe593d83668d2e18500b032bcf51cbbf82b181c6094dd79062000903908390620015a9565b60405180910390a150565b60006200091c818462000d53565b90506200092b81838062000e03565b9392505050565b6000805b835181101562000a215760008482815181106200094f57fe5b6020026020010151905062000977662386f26fc1000082101561012e620005cc60201b60201c565b62000991818462000e4560201b62001b0e1790919060201c565b92506000848381518110620009a257fe5b60200260200101519050620009fd600b6000836001600160a01b03166001600160a01b0316815260200190815260200160002054888581518110620009e357fe5b60200260200101518462000e0360201b62001b201760201c565b6001600160a01b039091166000908152600b60205260409020555060010162000936565b5062000a3a670de0b6b3a76400008214610134620005cc565b62000a54600954878762000e5960201b62001b3d1760201c565b6009556040517f0f3631f9dab08169d1db21c6dc5f32536fb2b0a6b9bb5330d71c52132f968be0906200086c90889088908890889062001655565b62000a9a8262000e8d565b62000aa58162000e8d565b62000ac16009548585858562000eba60201b62001b5b1760201c565b6009556040517fc42eae0298d32208994ed5d58e525fa31c2911e95451d98f8df3355259c4a13d9062000afc9086908690869086906200168a565b60405180910390a150505050565b62000b236009548262000f3660201b62001b9b1760201c565b6009556040517f5a9e84f78f7957cb4ed7478eb0fcad35ee4ecbe2e0f298420b28a3955392573f90620009039083906200159e565b62000b716009548262000f5260201b62001ba91760201c565b6009556040517f5353e2cb47d505ba9b628610daec53fc41f3a4259dab35a757b0f1d5a58bc1c390620009039083906200159e565b80620005dd8162000f6e565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040162000be3919062001640565b602060405180830381600087803b15801562000bfe57600080fd5b505af115801562000c13573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c3991906200134d565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000c6e90849088908890600401620015b2565b600060405180830381600087803b15801562000c8957600080fd5b505af115801562000c9e573d6000803e3d6000fd5b509298975050505050505050565b62000cbe816210905360ea1b62000ff5565b50565b62000cd261010083106064620005cc565b62000d0b6001821015801562000d03575062000cff60ff84610100036200105660201b62001bb71760201c565b8211155b6064620005cc565b6200089783821c156101b4620005cc565b6001901b6000190191901c1690565b60006200092b826000603c866200106260201b62001bc317909392919060201c565b92915050565b60006200092b62000deb836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801562000d9757600080fd5b505afa15801562000dac573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000dd291906200153f565b60ff1660126200108760201b62001be61790919060201c565b84906080600562001062602090811b62001bc317901c565b600062000e3d8260408062000e278888878462001062602090811b62001bc317901c565b6200106260201b62001bc317909392919060201c565b949350505050565b60008282016200092b8482101583620005cc565b600062000e73848483602062001bc362001062821b17811c565b935062000e3d848360208062001bc362001062821b17811c565b62000ea264e8d4a5100082101560cb620005cc565b62000cbe670d2f13f7789f000082111560ca620005cc565b600062000ed586866040602062001bc362001062821b17811c565b955062000ef086856060602062001bc362001062821b17811c565b955062000f0e86846080603e62001062602090811b62001bc317901c565b955062000f2c868360be603e62001062602090811b62001bc317901c565b9695505050505050565b60006200092b838360fc6200109f602090811b62001bfc17901c565b60006200092b838360fd6200109f602090811b62001bfc17901c565b60028151101562000f7f5762000cbe565b60008160008151811062000f8f57fe5b602002602001015190506000600190505b82518110156200089757600083828151811062000fb957fe5b6020026020010151905062000fea816001600160a01b0316846001600160a01b0316106065620005cc60201b60201c565b915060010162000fa0565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b80820390821102900390565b60006200107184848462000cc1565b506001901b60001901811b1992909216911b1790565b600062001099838311156001620005cc565b50900390565b6001811b1992909216911b1790565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620010f157805160ff191683800117855562001121565b8280016001018555821562001121579182015b828111156200112157825182559160200191906001019062001104565b506200112f92915062001133565b5090565b5b808211156200112f576000815560010162001134565b805162000d4d81620016f8565b600082601f83011262001168578081fd5b81516200117f6200117982620016cc565b620016a5565b818152915060208083019084810181840286018201871015620011a157600080fd5b60005b84811015620011cd578151620011ba81620016f8565b84529282019290820190600101620011a4565b505050505092915050565b600082601f830112620011e9578081fd5b8151620011fa6200117982620016cc565b8181529150602080830190848101818402860182018710156200121c57600080fd5b60005b84811015620011cd5781516200123581620016f8565b845292820192908201906001016200121f565b600082601f83011262001259578081fd5b81516200126a6200117982620016cc565b8181529150602080830190848101818402860182018710156200128c57600080fd5b60005b84811015620011cd578151845292820192908201906001016200128f565b8051801515811462000d4d57600080fd5b600082601f830112620012cf578081fd5b81516001600160401b03811115620012e5578182fd5b6020620012fb601f8301601f19168201620016a5565b925081835284818386010111156200131257600080fd5b60005b828110156200133257848101820151848201830152810162001315565b82811115620013445760008284860101525b50505092915050565b6000602082840312156200135f578081fd5b5051919050565b60006020828403121562001378578081fd5b81516200092b81620016f8565b600080600080600080600060e0888a031215620013a0578283fd5b87516001600160401b0380821115620013b7578485fd5b818a01915061014080838d031215620013ce578586fd5b620013d981620016a5565b9050825182811115620013ea578687fd5b620013f88d828601620012be565b8252506020830151828111156200140d578687fd5b6200141b8d828601620012be565b60208301525060408301518281111562001433578687fd5b620014418d828601620011d8565b60408301525060608301518281111562001459578687fd5b620014678d82860162001248565b6060830152506080830151828111156200147f578687fd5b6200148d8d82860162001157565b60808301525060a083015160a0820152620014ac8c60c08501620012ad565b60c0820152620014c08c60e08501620012ad565b60e082015261010083810151908201526101209283015192810192909252509650620014f08960208a016200114a565b9550620015018960408a016200114a565b9450620015128960608a016200114a565b9350620015238960808a016200114a565b925060a0880151915060c0880151905092959891949750929550565b60006020828403121562001551578081fd5b815160ff811681146200092b578182fd5b6000815180845260208085019450808401835b83811015620015935781518752958201959082019060010162001575565b509495945050505050565b901515815260200190565b90815260200190565b60006060820185835260206060818501528186518084526080860191508288019350845b81811015620015fe57620015eb8551620016ec565b83529383019391830191600101620015d6565b505084810360408601528551808252908201925081860190845b8181101562000c9e576200162d8351620016ec565b8552938301939183019160010162001618565b60208101600383106200164f57fe5b91905290565b60008582528460208301526080604083015262001676608083018562001562565b8281036060840152620005c1818562001562565b93845260208401929092526040830152606082015260800190565b6040518181016001600160401b0381118282101715620016c457600080fd5b604052919050565b60006001600160401b03821115620016e2578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b038116811462000cbe57600080fd5b60805160a05160c05160e0516101005160601c6101205160601c6101405161016051610180516101a05160601c6101c05160601c6101e0516102005160601c615fac620017b2600039806145ca5250806108ca5280610cee5250806108a95250806115f2525080610bc3525080611f1b525080611ef752508061127f52508061124e5250806111da5250806130c45250806131065250806130e55250615fac6000f3fe608060405234801561001057600080fd5b50600436106103995760003560e01c80637beed220116101e9578063a457c2d71161010f578063d505accf116100ad578063ebf1b7421161007c578063ebf1b74214610747578063ed24911d1461076c578063f885a4bb14610774578063f89f27ed1461078757610399565b8063d505accf146106fb578063d5c096c41461070e578063dd62ed3e14610721578063e01af92c1461073457610399565b8063b35056b8116100e9578063b35056b8146106d0578063b62c1f06146106d8578063b7b814fc146106eb578063d2946c2b146106f357610399565b8063a457c2d7146106a2578063a9059cbb146106b5578063aaabadc5146106c857610399565b806387ec68171161018757806390193b7c1161015657806390193b7c1461066157806395d89b411461067457806397bb15c91461067c5780639d2c110c1461068f57610399565b806387ec681714610629578063893d20e81461063c5780638d027466146106515780638d928af81461065957610399565b8063819c70f3116101c3578063819c70f3146105f35780638456cb5914610606578063851c1bb31461060e578063876f303b1461062157610399565b80637beed220146105b55780637ecebe00146105cd57806381788e2b146105e057610399565b806339509351116102ce5780636028bfd41161026c57806370a082311161023b57806370a082311461056657806373656f891461057957806374f3b009146105815780637b749c45146105a257610399565b80636028bfd4146105045780636a2efb2c146105255780636b47273b1461053d578063704640161461055357610399565b806347bc4d92116102a857806347bc4d92146104d95780634df77ce0146104e157806354a844ba146104f457806355c67628146104fc57610399565b806339509351146104ab5780633c9d93b8146104be5780633f4ba83a146104d157610399565b806323b872dd1161033b57806334a36df81161031557806334a36df8146104755780633644e5151461048857806336eb097b1461049057806338fff2d0146104a357610399565b806323b872dd1461043a5780632a9a03231461044d578063313ce5671461046057610399565b80630da0669c116103775780630da0669c146103fc57806318160ddd146104065780631c0de0511461040e5780631dd746ea1461042557610399565b806301ec954a1461039e57806306fdde03146103c7578063095ea7b3146103dc575b600080fd5b6103b16103ac36600461578f565b61078f565b6040516103be9190615bd4565b60405180910390f35b6103cf6107ef565b6040516103be9190615de6565b6103ef6103ea366004615344565b610885565b6040516103be9190615bb1565b61040461089c565b005b6103b16108f0565b6104166108f6565b6040516103be93929190615bbc565b61042d61091f565b6040516103be9190615aa3565b6103ef610448366004615294565b61093c565b6103b161045b36600461584a565b6109b2565b6104686109f1565b6040516103be9190615ee5565b610404610483366004615674565b6109fa565b6103b1610b90565b6103ef61049e366004615240565b610b9f565b6103b1610bc1565b6103ef6104b9366004615344565b610be5565b6104046104cc366004615240565b610c20565b610404610c8d565b6103ef610c9f565b6103b16104ef36600461584a565b610cac565b610404610d15565b6103b1610d69565b610517610512366004615525565b610d76565b6040516103be929190615df9565b61052d610d94565b6040516103be9493929190615e7f565b610545610db3565b6040516103be929190615e12565b6103b161056136600461584a565b610de0565b6103b1610574366004615240565b610e42565b6103b1610e5d565b61059461058f366004615525565b610e8a565b6040516103be929190615ab6565b6104046105b03660046154d5565b610f4b565b6105bd610f67565b6040516103be9493929190615e20565b6103b16105db366004615240565b61109d565b6104046105ee366004615240565b6110a8565b610404610601366004615890565b611119565b6104046111c4565b6103b161061c366004615630565b6111d6565b6103b1611228565b610517610637366004615525565b61123a565b61064461124c565b6040516103be9190615a8f565b6103ef611270565b61064461127d565b6103b161066f366004615240565b6112a1565b6103cf6112bc565b61040461068a3660046156d2565b61131d565b6103b161069d3660046157ff565b6114e0565b6103ef6106b0366004615344565b611519565b6103ef6106c3366004615344565b611557565b610644611564565b6103ef61156e565b6104046106e6366004615915565b61157b565b6104046115a6565b6106446115f0565b6104046107093660046152d4565b611614565b61059461071c366004615525565b61169f565b6103b161072f36600461525c565b611735565b6104046107423660046154d5565b611772565b61075a610755366004615240565b61178b565b6040516103be96959493929190615ebd565b6103b161182f565b6104046107823660046153c5565b611839565b61042d6118cf565b600084608001516107bc6107a161127d565b6001600160a01b0316336001600160a01b03161460cd611c0b565b6107d16107c7610bc1565b82146101f4611c0b565b6107d9611c19565b6107e586868686611c2c565b9695505050505050565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561087b5780601f106108505761010080835404028352916020019161087b565b820191906000526020600020905b81548152906001019060200180831161085e57829003601f168201915b5050505050905090565b6000610892338484611c39565b5060015b92915050565b6108a4611ca1565b6108ee7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611cc4565b565b60025490565b6000806000610903611ed8565b15925061090e611ef5565b9150610918611f19565b9050909192565b60608061092a611f3d565b50905061093681611fea565b91505090565b6000806109498533611735565b905061096d336001600160a01b03871614806109655750838210155b61019e611c0b565b6109788585856120a4565b336001600160a01b0386161480159061099357506000198114155b156109a5576109a58533858403611c39565b60019150505b9392505050565b60006109bc612184565b6109c4611c19565b60006109ce6121b2565b905080156109e2576109df8161225c565b91505b6109eb83612318565b50919050565b60055460ff1690565b610a02612184565b610a0a611c19565b6000610a146121b2565b9050610a246000821160ce611c0b565b610a2d8161225c565b50506060610a39611f3d565b509050610a4f60328251600101111560c9611c0b565b600060608073__$6d134cfc25e59b25943ff4bfa0c28ca096$__631face20a610a7661127d565b610a7e610bc1565b60095488610a8b8a612379565b8f8f8f6040518963ffffffff1660e01b8152600401610ab1989796959493929190615d17565b60006040518083038186803b158015610ac957600080fd5b505af4158015610add573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b0591908101906155c7565b6001600160a01b038c166000908152600b6020526040902083905591945092509050610b344280838086612444565b8515610b4457610b448587612566565b886001600160a01b03167ff4c563a3ea86ff1f4275e8c207df0375a51963f2b831b7bf4da8be938d92876c88604051610b7d9190615bd4565b60405180910390a2505050505050505050565b6000610b9a61182f565b905090565b6001600160a01b0381166000908152600d602052604090205460ff165b919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610892918590610c1b9086611b0e565b611c39565b610c28612184565b610c30611c19565b610c44610c3c82610b9f565b6101b1611c0b565b6001600160a01b0381166000818152600d6020526040808220805460ff19169055517f89aa0423af0b4cf311bfb79f61549f2b82b335f041e4f7ae674618059b51a4cb9190a250565b610c95612184565b6108ee6000612570565b6000610b9a6009546125e3565b60008082610cbc57506000610ce9565b6002831415610ccd57506008610ce9565b6003831415610cde57506010610ce9565b610ce96101bb6125f0565b6109ab7f0000000000000000000000000000000000000000000000000000000000000000826008611af0565b610d1d612184565b610d25612600565b610d2f6001612614565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610d5f9190615bb1565b60405180910390a1565b6000610b9a600954612630565b60006060610d88888785612655612718565b97509795505050505050565b600080600080610da5600954612812565b935093509350935090919293565b600080610dc1600a5461285a565b6009549193509150610dd29061287f565b15610ddc57600091505b9091565b6000610dea61156e565b15610df757506000610bbc565b600082610e0657506000610e33565b6002831415610e1757506040610e33565b6003831415610e2857506080610e33565b610e336101bb6125f0565b6008546109ab90826040611af0565b6001600160a01b031660009081526020819052604090205490565b6000610e67611c19565b6000610e716121b2565b9050610e816000821160ce611c0b565b6109368161225c565b60608088610e996107a161127d565b610ea46107c7610bc1565b6000610eaf8561288c565b15610ed757610ebc6128bb565b610ece88610ec86108f0565b876128ce565b94509050610eef565b610edf611c19565b610eea8a8987612655565b945090505b610ef98a8261290e565b83516001600160401b0381118015610f1057600080fd5b50604051908082528060200260200182016040528015610f3a578160200160208202803683370190505b509250505097509795505050505050565b610f53612184565b610f5b611c19565b610f6481612918565b50565b600080606080610f78600954612957565b90945092506060610f87611f3d565b50905080516001600160401b0381118015610fa157600080fd5b50604051908082528060200260200182016040528015610fcb578160200160208202803683370190505b50925080516001600160401b0381118015610fe557600080fd5b5060405190808252806020026020018201604052801561100f578160200160208202803683370190505b50915060005b81518110156110955761105f600b600084848151811061103157fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054612974565b85838151811061106b57fe5b6020026020010185848151811061107e57fe5b602090810291909101019190915252600101611015565b505090919293565b6000610896826112a1565b6110b0612184565b6110b8611c19565b6110cd6110c482610b9f565b156101b0611c0b565b6001600160a01b0381166000818152600d6020526040808220805460ff19166001179055517fbf5840c727acdcaceea5154edc82998fa82a490aa3dc7aeb66849c8bbea1f5799190a250565b611121612184565b611129611c19565b6060611133611f3d565b509050611144835182518451611aac565b60005b815181101561119e5761119684828151811061115f57fe5b60200260200101516001600160a01b031683838151811061117c57fe5b60200260200101516001600160a01b031614610208611c0b565b600101611147565b506111bd6111ac8686612991565b856111b686612379565b8587612444565b5050505050565b6111cc612184565b6108ee6001612570565b60007f00000000000000000000000000000000000000000000000000000000000000008260405160200161120b929190615a4c565b604051602081830303815290604052805190602001209050919050565b6000610b9a6112356121b2565b6129ae565b60006060610d888887856129d9612718565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610b9a600954612a63565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561087b5780601f106108505761010080835404028352916020019161087b565b611325612184565b61132d611c19565b60006113376121b2565b90506113476000821160ce611c0b565b6113508161225c565b5050606061135c611f3d565b50905061137260026001835103101560c8611c0b565b6001600160a01b0384166000908152600b602052604081205461139d90670de0b6b3a7640000612a70565b905060608073__$6d134cfc25e59b25943ff4bfa0c28ca096$__63a20d2e4d6113c461127d565b6113cc610bc1565b600954886113d98a612379565b8d8a6040518863ffffffff1660e01b81526004016113fd9796959493929190615d7a565b60006040518083038186803b15801561141557600080fd5b505af4158015611429573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611451919081019061536f565b6001600160a01b0389166000908152600b6020526040812055909250905061147c4280838086612444565b85156114a3576114996001600160a01b03861615156101bc611c0b565b6114a3858761290e565b6040516001600160a01b038816907f4c910b69fe65a61f7531b9c5042b2329ca7179c77290aa7e2eb3afa3c8511fd390600090a250505050505050565b600083608001516114f26107a161127d565b6114fd6107c7610bc1565b611505611c19565b611510858585612a93565b95945050505050565b6000806115263385611735565b90508083106115405761153b33856000611c39565b61154d565b61154d3385858403611c39565b5060019392505050565b60006108923384846120a4565b6000610b9a612b5f565b6000610b9a60095461287f565b611583612184565b61158b611c19565b6115a06115988585612991565b848484612bd9565b50505050565b6115ae612184565b6115b66128bb565b6115c06000612614565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610d5f9190615bb1565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886116438c6112a1565b8960405160200161165996959493929190615bfc565b60405160208183030381529060405280519060200120905061168a8882611681878787612c41565b886101f8612c80565b611695888888611c39565b5050505050505050565b606080886116ae6107a161127d565b6116b96107c7610bc1565b60006116c3611c19565b6116cb6108f0565b61171c576116d98a86612cd7565b945090506116f26116e8612e4d565b82101560cc611c0b565b61170460006116ff612e4d565b612566565b61171789611710612e4d565b8303612566565b610ef9565b6117278a89876129d9565b94509050610ef98982612566565b600061173f61127d565b6001600160a01b0316826001600160a01b031614156117615750600019610896565b61176b8383612e54565b9050610896565b61177a612184565b611782611c19565b610f6481612e7f565b6001600160a01b0381166000908152600c6020526040812054819081908190819081906117b781612ebe565b9299509097509550935060006117cc89612f0c565b90506117da82826001612f3b565b93506117e882826000612f3b565b925060006117fd6117f88b613075565b613090565b905061180989826130b4565b985061181585826130b4565b945061182184826130b4565b935050505091939550919395565b6000610b9a6130c0565b611841612184565b611849611c19565b611857845183518351611aac565b6118638451845161315d565b60005b84518110156111bd576118c785828151811061187e57fe5b602002602001015185838151811061189257fe5b60200260200101518584815181106118a657fe5b60200260200101518585815181106118ba57fe5b602002602001015161316a565b600101611866565b6060806118da611f3d565b50905061093681612379565b60006118f183611ae2565b606083516001016001600160401b038111801561190d57600080fd5b50604051908082528060200260200182016040528015611937578160200160208202803683370190505b509050308160008151811061194857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156119b75784818151811061198057fe5b602002602001015182826001018151811061199757fe5b6001600160a01b039092166020928302919091019091015260010161196b565b50606083516001016001600160401b03811180156119d457600080fd5b506040519080825280602002602001820160405280156119fe578160200160208202803683370190505b509050600081600081518110611a1057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b8451811015611a7f57848181518110611a4857fe5b6020026020010151828260010181518110611a5f57fe5b6001600160a01b0390921660209283029190910190910152600101611a33565b50611a8c8787848461320b565b925050505b949350505050565b6000611aa68484846132fb565b50501b90565b611ac48284148015611abd57508183145b6067611c0b565b505050565b6000611ad58184613342565b90506109ab818384611b20565b80611aec816133d1565b5050565b6001901b6000190191901c1690565b60006109ab838383603c611bc3565b60008282016109ab8482101583611c0b565b6000611a9182604080611b3588888784611bc3565b929190611bc3565b6000611b4c8484836020611bc3565b9350611a918483602080611bc3565b6000611b6b868660406020611bc3565b9550611b7b868560606020611bc3565b9550611b8b86846080603e611bc3565b95506107e5868360be603e611bc3565b60006109ab838360fc611bfc565b60006109ab838360fd611bfc565b80820390821102900390565b6000611bd08484846132fb565b506001901b60001901811b1992909216911b1790565b6000611bf6838311156001611c0b565b50900390565b6001811b1992909216911b1790565b81611aec57611aec816125f0565b6108ee611c24611ed8565b610192611c0b565b6000611a916103e66125f0565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611c94908590615bd4565b60405180910390a3505050565b611ca9611c19565b6000611cb36121b2565b90508015610f6457611aec8161225c565b60006001600160a01b038316631a7c3263611ce184846008611af0565b6040518263ffffffff1660e01b8152600401611cfd9190615bd4565b60206040518083038186803b158015611d1557600080fd5b505afa158015611d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4d919061550d565b905060006001600160a01b038416631a7c3263611d6c85600880611af0565b6040518263ffffffff1660e01b8152600401611d889190615bd4565b60206040518083038186803b158015611da057600080fd5b505afa158015611db4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd8919061550d565b905060006001600160a01b038516631a7c3263611df88660106008611af0565b6040518263ffffffff1660e01b8152600401611e149190615bd4565b60206040518083038186803b158015611e2c57600080fd5b505afa158015611e40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e64919061550d565b90506000611e758260806040611a99565b611e8184604080611a99565b611e8e8660006040611a99565b17179050806008819055507fc3f0acc358200d8e08ac6ce20bc2f9f27893a344f813bf682b7859b3e521502e81604051611ec89190615bd4565b60405180910390a1505050505050565b6000611ee2611f19565b421180610b9a57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b606080606080611f4b61127d565b6001600160a01b031663f94d4668611f61610bc1565b6040518263ffffffff1660e01b8152600401611f7d9190615bd4565b60006040518083038186803b158015611f9557600080fd5b505afa158015611fa9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611fd1919081019061546c565b5091509150611fe0828261344a565b9350935050509091565b8051606090806001600160401b038111801561200557600080fd5b5060405190808252806020026020018201604052801561202f578160200160208202803683370190505b50915060005b8181101561209d5761207e600b600086848151811061205057fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054613090565b83828151811061208a57fe5b6020908102919091010152600101612035565b5050919050565b6120bb6001600160a01b0384161515610198611c0b565b6120d26001600160a01b0383161515610199611c0b565b6120dd838383611ac4565b6001600160a01b03831660009081526020819052604090205461210390826101a061346a565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546121329082611b0e565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c94908590615bd4565b600061219b6000356001600160e01b0319166111d6565b9050610f646121aa8233613480565b610191611c0b565b60008060006121bf61127d565b6001600160a01b031663b05f8e486121d5610bc1565b306040518363ffffffff1660e01b81526004016121f3929190615ce2565b60806040518083038186803b15801561220b57600080fd5b505afa15801561221f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224391906158d5565b5050915091508082016122546108f0565b039250505090565b6000806000612269610db3565b91509150600061227b85428486613569565b90506122856135ad565b806122965760009350505050610bbc565b60006122ac6122a56003610de0565b83906135be565b905060006122ba8383611be6565b90506122c582613600565b7f0666d5a83bb8143573350414d5a13dbdcac60a706160576416096ad6a41c0ea5816040516122f49190615bd4565b60405180910390a161230d61230761124c565b82612566565b509095945050505050565b61232f670d2f13f7789f0000821115610160611c0b565b61233b600a5482611aff565b600a556040517f556cdf4052d939f8acbe593d83668d2e18500b032bcf51cbbf82b181c6094dd79061236e908390615bd4565b60405180910390a150565b60606000612388600954613611565b8351909150806001600160401b03811180156123a357600080fd5b506040519080825280602002602001820160405280156123cd578160200160208202803683370190505b50925060005b8181101561243c5761241d600b60008784815181106123ee57fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205484612a70565b84828151811061242957fe5b60209081029190910101526001016123d3565b505050919050565b6000805b835181101561250957600084828151811061245f57fe5b6020026020010151905061247f662386f26fc1000082101561012e611c0b565b6124898382611b0e565b9250600084838151811061249957fe5b602002602001015190506124e6600b6000836001600160a01b03166001600160a01b03168152602001908152602001600020548885815181106124d857fe5b602002602001015184611b20565b6001600160a01b039091166000908152600b602052604090205550600101612448565b50612520670de0b6b3a76400008214610134611c0b565b61252d6009548787611b3d565b6009556040517f0f3631f9dab08169d1db21c6dc5f32536fb2b0a6b9bb5330d71c52132f968be090611ec8908890889088908890615e20565b611aec828261362d565b80156125905761258b612581611ef5565b4210610193611c0b565b6125a5565b6125a561259b611f19565b42106101a9611c0b565b6007805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be649061236e908390615bb1565b60006108968260fc6136d1565b610f64816210905360ea1b6136d8565b6108ee61260b61156e565b156101b5611c0b565b61262060095482613739565b60095580610f6457610f646135ad565b600080600080600061264186612812565b93509350935093506107e582828686613747565b60006060600061266c6126666108f0565b86613761565b95509050606061267a611f3d565b509050606061268882611fea565b905061269487826137a2565b600061269f8461225c565b8401905060606126ae84612379565b90506126be8a8a8386868d61380b565b909750955060016126ce896139c5565b60028111156126d957fe5b146126f6576126f66126eb8389611be6565b858b898560006139db565b6127008684613a75565b61270986613ade565b95505050505050935093915050565b3330146127d6576000306001600160a01b031660003660405161273c929190615a64565b6000604051808303816000865af19150503d8060008114612779576040519150601f19603f3d011682016040523d82523d6000602084013e61277e565b606091505b50509050806000811461278d57fe5b60046000803e6000516001600160e01b0319166343adbafb60e01b81146127b8573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b600060606127e98686868663ffffffff16565b8051601f1982018390526343adbafb603f19830152919350915060200260231982016044820181fd5b60008080806128248560406020611af0565b93506128338560606020611af0565b9250612842856080603e611af0565b91506128518560be603e611af0565b90509193509193565b6000806128698382603c611af0565b915061287883603c6020611af0565b9050915091565b60006108968260fe6136d1565b6000808251118015610896575060ff8016828060200190518101906128b19190615946565b60ff161492915050565b6108ee6128c661156e565b6101b6611c0b565b6000606060006128de8587613761565b965090506128eb84613b69565b92506128f8868483613b7f565b915061290382613ade565b915050935093915050565b611aec8282613c30565b61292460095482611ba9565b6009556040517f5353e2cb47d505ba9b628610daec53fc41f3a4259dab35a757b0f1d5a58bc1c39061236e908390615bb1565b60008061296683826020611af0565b915061287883602080611af0565b60008061298383826040611af0565b915061287883604080611af0565b600061299d4284613ceb565b905061089682821115610146611c0b565b60008060006129bb610db3565b9150915060006129cd85428486613569565b90506115108582611b0e565b6000606060006129ea6126666108f0565b9550905060606129f8611f3d565b5090506060612a0682611fea565b9050612a1287826137a2565b6000612a1d8461225c565b840190506060612a2c84612379565b9050612a3c8a8a8386868d613cf7565b9097509550612a59612a4e8389611b0e565b858b898560016139db565b6127008684613e04565b60006108968260fd6136d1565b60006109ab612a8184836040611af0565b612a8d85604080611af0565b84613e6d565b600080612a9e613ed7565b9050612ab4612aac826125e3565b610147611c0b565b60408501516001600160a01b0316301415612b0d57612ada610c3c828760c00151613edd565b600083612ae56108f0565b0390506000612af38261225c565b82019050612b0387878386613ef8565b93505050506109ab565b60208501516001600160a01b0316301415612b4b57600084612b2d6108f0565b0390506000612b3b8261225c565b82019050612b03878683866140c3565b612b578585858461427e565b9150506109ab565b6000612b6961127d565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015612ba157600080fd5b505afa158015612bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9a9190615658565b612be2826144a8565b612beb816144a8565b612bfa60095485858585611b5b565b6009556040517fc42eae0298d32208994ed5d58e525fa31c2911e95451d98f8df3355259c4a13d90612c33908690869086908690615e7f565b60405180910390a150505050565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b6000612c8b856144d1565b9050612ca1612c9b8783876144ed565b83611c0b565b612cb0428410156101b8611c0b565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b60006060612cef610c3c612ce9613ed7565b86613edd565b6000612cfa8461459c565b9050612d156000826003811115612d0d57fe5b1460ce611c0b565b6060612d1f611f3d565b509050612d2b856145b2565b9250612d398351825161315d565b6060612d4482611fea565b9050612d5084826137a2565b6000612d5a6145c8565b6001600160a01b03166390043a58612d7185612379565b876040518363ffffffff1660e01b8152600401612d8f929190615ab6565b60206040518083038186803b158015612da757600080fd5b505afa158015612dbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ddf919061550d565b9050612dec8186516145ec565b9550612df88583613e04565b6000612e086001606f1b88611be6565b9050612e148982612566565b612e1d86613ade565b95508086600081518110612e2d57fe5b602002602001018181525050612e416135ad565b50505050509250929050565b620f424090565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b612e8b60095482611b9b565b6009556040517f5a9e84f78f7957cb4ed7478eb0fcad35ee4ecbe2e0f298420b28a3955392573f9061236e908390615bb1565b6000808080612ecf85606080611af0565b9350612ede8560206040611af0565b92506030612eef8660006010611af0565b901b91506030612f0186601080611af0565b901b90509193509193565b6001600160a01b0381166000908152600b60205260408120546009546108969190612f3690613611565b612a70565b6000806030612f5b84612f4f576010612f52565b60005b87906010611af0565b901b905080612f6e5760009150506109ab565b6000612f7c86606080611af0565b90506000612f8d8760206040611af0565b9050600081871415612fd057612fc96020678ac7230489e80000612fc289612fb65760e0612fb9565b60c05b8c906020611af0565b9190614606565b905061305e565b604051633d3632df60e21b815273__$6670886e635fd86503a30ff6f4e4ebb80f$__9063f4d8cb7c9061300b9087908b908b90600401615e51565b60206040518083038186803b15801561302357600080fd5b505af4158015613037573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305b919061550d565b90505b61306981848861464c565b98975050505050505050565b6001600160a01b03166000908152600b602052604090205490565b6000806130a08360806005611af0565b600a0a670de0b6b3a7640000029392505050565b60006109ab8383614665565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061312d614693565b30604051602001613142959493929190615cb6565b60405160208183030381529060405280519060200120905090565b611aec8183146067611c0b565b600061317585612f0c565b9050613185811515610135611c0b565b600061319c856131976117f889613075565b614697565b90506131aa818386866146a3565b6001600160a01b0387166000818152600c6020526040908190209290925590517fcad1fdf49cd36960e377075cfe18dcc3aa113e526fbe184544cca2e7115c54f3906131fb90889088908890615e69565b60405180910390a2505050505050565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040161323a9190615dd2565b602060405180830381600087803b15801561325457600080fd5b505af1158015613268573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328c919061550d565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d2906132bf90849088908890600401615c30565b600060405180830381600087803b1580156132d957600080fd5b505af11580156132ed573d6000803e3d6000fd5b509298975050505050505050565b61330a61010083106064611c0b565b6133336001821015801561332c575061332860ff8461010003611bb7565b8211155b6064611c0b565b611ac483821c156101b4611c0b565b60006109ab6133c6836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561338357600080fd5b505afa158015613397573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133bb9190615946565b60129060ff16611be6565b849060806005611bc3565b6002815110156133e057610f64565b6000816000815181106133ef57fe5b602002602001015190506000600190505b8251811015611ac457600083828151811061341757fe5b60200260200101519050613440816001600160a01b0316846001600160a01b0316106065611c0b565b9150600101613400565b815160001990810160209384019081528251909101919092019081529091565b60006134798484111583611c0b565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b61349f61124c565b6001600160a01b0316141580156134ba57506134ba8361489c565b156134e2576134c761124c565b6001600160a01b0316336001600160a01b0316149050610896565b6134ea612b5f565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161351993929190615bdd565b60206040518083038186803b15801561353157600080fd5b505afa158015613545573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176b91906154f1565b60008284111580613578575081155b1561358557506000611a91565b60006135918684614996565b9050838503611a8c6135a383836145ec565b6301e133806149ae565b6135b9600a54426149ce565b600a55565b60008282026135e28415806135db5750838583816135d857fe5b04145b6003611c0b565b6001670de0b6b3a76400006001830304018115150291505092915050565b8015610f6457610f646123076115f0565b600080600061361f84612957565b91509150611a9182826149de565b61363960008383611ac4565b61365361364e826136486108f0565b90611b0e565b614a16565b6001600160a01b0382166000908152602081905260409020546136769082611b0e565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906136c5908590615bd4565b60405180910390a35050565b1c60011690565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60006109ab838360fe611bfc565b60008061375484846149de565b90506107e5868683613e6d565b6000606061378c8360008151811061377557fe5b602002602001015185611be690919063ffffffff16565b8351600019016020909401938452949293505050565b815181516137b190829061315d565b60005b818110156115a0576137ec8482815181106137cb57fe5b60200260200101518483815181106137df57fe5b6020026020010151614665565b8482815181106137f857fe5b60209081029190910101526001016137b4565b600060606000613819613ed7565b90506000613826856139c5565b9050613852613834836125e3565b8061384a5750600182600281111561384857fe5b145b61014a611c0b565b600081600281111561386057fe5b14156139085761386e6145c8565b6001600160a01b0316633d0b05e98a8a8961388887612630565b8a6040518663ffffffff1660e01b81526004016138a9959493929190615b41565b60006040518083038186803b1580156138c157600080fd5b505afa1580156138d5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526138fd9190810190615862565b9350935050506139ba565b600181600281111561391657fe5b1415613953576139246145c8565b6001600160a01b0316631b2db0ea8a88886040518463ffffffff1660e01b81526004016138a993929190615b86565b600281600281111561396157fe5b14156139ac5761396f6145c8565b6001600160a01b0316632ac71a3e8a8a8a8a61398a88612630565b8b6040518763ffffffff1660e01b81526004016138a996959493929190615adb565b6139b76101506125f0565b50505b965096945050505050565b6000818060200190518101906108969190615713565b60005b8451811015613a6c576000613a2d8683815181106139f857fe5b6020026020010151868481518110613a0c57fe5b602002602001015185613a2157611be6613a25565b611b0e5b63ffffffff16565b9050613a636002888481518110613a4057fe5b60200260200101518a84888781518110613a5657fe5b6020026020010151614a1b565b506001016139de565b50505050505050565b81518151613a8490829061315d565b60005b818110156115a057613abf848281518110613a9e57fe5b6020026020010151848381518110613ab257fe5b6020026020010151614aa0565b848281518110613acb57fe5b6020908102919091010152600101613a87565b606081516001016001600160401b0381118015613afa57600080fd5b50604051908082528060200260200182016040528015613b24578160200160208202803683370190505b50905060005b82518110156109eb57828181518110613b3f57fe5b6020026020010151828260010181518110613b5657fe5b6020908102919091010152600101613b2a565b6000818060200190518101906109ab9190615962565b60606000613b8d8484614aa0565b9050606085516001600160401b0381118015613ba857600080fd5b50604051908082528060200260200182016040528015613bd2578160200160208202803683370190505b50905060005b8651811015613c2657613c0783888381518110613bf157fe5b602002602001015161466590919063ffffffff16565b828281518110613c1357fe5b6020908102919091010152600101613bd8565b5095945050505050565b613c476001600160a01b038316151561019b611c0b565b613c5382600083611ac4565b6001600160a01b038216600090815260208190526040902054613c7990826101b261346a565b6001600160a01b038316600090815260208190526040902055613ca761364e82613ca16108f0565b90614aea565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516136c59190615bd4565b80820390821002900390565b600060606000613d05613ed7565b90506000613d128561459c565b9050613d34613d20836125e3565b8061384a5750600382600381111561384857fe5b613d41610c3c838c613edd565b6001816003811115613d4f57fe5b1415613d7857613d5d6145c8565b6001600160a01b031663120c0c638a8a8a8a61398a88612630565b6002816003811115613d8657fe5b1415613dae57613d946145c8565b6001600160a01b031663098e01898a8a8961388887612630565b6003816003811115613dbc57fe5b1415613df957613dca6145c8565b6001600160a01b03166303a5b64b8a88886040518463ffffffff1660e01b81526004016138a993929190615b86565b6139b76101366125f0565b81518151613e1390829061315d565b60005b818110156115a057613e4e848281518110613e2d57fe5b6020026020010151848381518110613e4157fe5b6020026020010151614af8565b848281518110613e5a57fe5b6020908102919091010152600101613e16565b6000670de0b6b3a764000082101580613e8557508284145b15613e915750816109ab565b81613e9d5750826109ab565b82841115613ebe576000613eb383858703614665565b850391506109ab9050565b6000613ecc83868603614665565b850191506109ab9050565b60095490565b6000613ee883612a63565b15806109ab57506109ab82610b9f565b6000806000613f138760200151613f0e86613611565b614b45565b915091506000613f2285612630565b9050613f2e87836130b4565b965060008089516001811115613f4057fe5b1415613fef57613f548960600151846130b4565b60608a0152613f616145c8565b6001600160a01b031663afc4d0db89868c606001518b876040518663ffffffff1660e01b8152600401613f98959493929190615e9a565b60206040518083038186803b158015613fb057600080fd5b505afa158015613fc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fe8919061550d565b9050614081565b613ff76145c8565b6001600160a01b0316637f1ae8a989868c606001518b876040518663ffffffff1660e01b815260040161402e959493929190615e9a565b60206040518083038186803b15801561404657600080fd5b505afa15801561405a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061407e919061550d565b90505b61408e8988836001614b74565b60008951600181111561409d57fe5b14156140ae579350611a9192505050565b6140b88184614d09565b945050505050611a91565b60008060006140d98760400151613f0e86613611565b9150915060006140e885612630565b90506140f487836130b4565b96506000808951600181111561410657fe5b14156141a2576141146145c8565b6001600160a01b0316630ccd894189868c606001518b876040518663ffffffff1660e01b815260040161414b959493929190615e9a565b60206040518083038186803b15801561416357600080fd5b505afa158015614177573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061419b919061550d565b9050614247565b6141b08960600151846130b4565b60608a01526141bd6145c8565b6001600160a01b031663ef2aca7689868c606001518b876040518663ffffffff1660e01b81526004016141f4959493929190615e9a565b60206040518083038186803b15801561420c57600080fd5b505afa158015614220573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614244919061550d565b90505b6142548988836000614b74565b60008951600181111561426357fe5b1415614273576140b88184614697565b9350611a9192505050565b6000614288614f29565b6142928684614d15565b905060006142a76142a285612630565b614d8d565b90506142b78683604001516130b4565b95506142c78583606001516130b4565b9450600080885160018111156142d957fe5b14156143a1576142f1886060015184604001516130b4565b606089018190526000906143059084614665565b905061430f6145c8565b8451602086015160405163063c5da760e11b81526001600160a01b039390931692630c78bb4e92614349928d928d91908890600401615e9a565b60206040518083038186803b15801561436157600080fd5b505afa158015614375573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614399919061550d565b915050614460565b6143b3886060015184606001516130b4565b606089015260006143c26145c8565b8451602086015160608c015160405162d5905160e81b81526001600160a01b03949094169363d590510093614400938e9391928e9290600401615e9a565b60206040518083038186803b15801561441857600080fd5b505afa15801561442c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614450919061550d565b905061445c8184614af8565b9150505b61446d8884898985614d9f565b60008851600181111561447c57fe5b141561449a57614490818460600151614697565b9350505050611a91565b614490818460400151614d09565b6144bb64e8d4a5100082101560cb611c0b565b610f64670d2f13f7789f000082111560ca611c0b565b60006144db6130c0565b8260405160200161120b929190615a74565b60006144ff82516041146101b9611c0b565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190614538908990859088908890615cf9565b6020604051602081039080840390855afa15801561455a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906130695750876001600160a01b0316816001600160a01b0316149450505050509392505050565b6000818060200190518101906108969190615732565b6060818060200190518101906109ab919061574d565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008282026109ab8415806135db5750838583816135d857fe5b60006146236002841015801561332c575060ff8411156064611c0b565b6000196001841b01614639818611156064611c0b565b61151061464686856145ec565b826149ae565b6000611a9183858461466057614665613a25565b6135be565b600082820261467f8415806135db5750838583816135d857fe5b670de0b6b3a7640000815b04949350505050565b4690565b60006109ab8383614aa0565b60006146d88315806146d0575067016345785d8a000084101580156146d05750670de0b6b3a76400008411155b610163611c0b565b6146ef678ac7230489e80000831115610163611c0b565b6147068215806146d0575083831015610163611c0b565b600061471d8560206040611b35858b606080611bc3565b905061473e603084811c906010908190611b359086908a901c600084611bc3565b9050600073__$6670886e635fd86503a30ff6f4e4ebb80f$__63f4d8cb7c868860016040518463ffffffff1660e01b815260040161477e93929190615e51565b60206040518083038186803b15801561479657600080fd5b505af41580156147aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147ce919061550d565b9050600073__$6670886e635fd86503a30ff6f4e4ebb80f$__63f4d8cb7c868960006040518463ffffffff1660e01b815260040161480e93929190615e51565b60206040518083038186803b15801561482657600080fd5b505af415801561483a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061485e919061550d565b9050613069614877826020678ac7230489e80000614e20565b60e06020611b356148918783678ac7230489e80000614e20565b889060c06020611bc3565b60006148ae63819c70f360e01b6111d6565b8214806148c957506148c6635b160f8360e11b6111d6565b82145b806148e257506148df633806be4b60e21b6111d6565b82145b806148fb57506148f86381788e2b60e01b6111d6565b82145b806149145750614911630793b27760e31b6111d6565b82145b8061492d575061492a637b749c4560e01b6111d6565b82145b8061494657506149436306946dbf60e31b6111d6565b82145b8061495f575061495c6397bb15c960e01b6111d6565b82145b806149785750614975632a9a032360e01b6111d6565b82145b80610896575061498e63f885a4bb60e01b6111d6565b909114919050565b60006109ab6149a584846145ec565b6149ae84614d8d565b60006149bd8215156004611c0b565b8183816149c657fe5b049392505050565b60006109ab8383603c6020611bc3565b60008142106149f65750670de0b6b3a7640000610896565b824211614a0557506000610896565b828203428490036115108183614aa0565b600255565b6000614a2685614e66565b90506000866002811115614a3657fe5b1480614a4d57506002866002811115614a4b57fe5b145b15614a6057614a60818585856001614e81565b6001866002811115614a6e57fe5b1480614a8557506002866002811115614a8357fe5b145b15614a9857614a98818585856000614e81565b505050505050565b6000614aaf8215156004611c0b565b670de0b6b3a76400008302614ae1841580614ada5750670de0b6b3a7640000858381614ad757fe5b04145b6005611c0b565b82818161468a57fe5b60006109ab8383600161346a565b6000614b078215156004611c0b565b670de0b6b3a76400008302614b2f841580614ada5750670de0b6b3a7640000858381614ad757fe5b6001836001830304018115150291505092915050565b6000806000614b5385613075565b9050614b5f8185612a70565b9250614b6a81613090565b9150509250929050565b6000808215614bc157600086516001811115614b8c57fe5b14614ba7576060860151614ba1908690611b0e565b84614bb7565b614bb18585611b0e565b86606001515b9092509050614c01565b600086516001811115614bd057fe5b14614be957614bdf8585611be6565b8660600151614bfb565b6060860151614bf9908690611be6565b845b90925090505b606080614c0c611f3d565b915091506060614c1b83612379565b9050614c2f82614c2a85611fea565b6137a2565b606083516001600160401b0381118015614c4857600080fd5b50604051908082528060200260200182016040528015614c72578160200160208202803683370190505b509050600087614c86578a60400151614c8c565b8a602001515b905060005b8551811015614ced57816001600160a01b0316868281518110614cb057fe5b60200260200101516001600160a01b03161415614ce55786838281518110614cd457fe5b602002602001018181525050614ced565b600101614c91565b50614cfc87868685878d6139db565b5050505050505050505050565b60006109ab8383614af8565b614d1d614f29565b6000614d2c8460200151613075565b90506000614d3d8560400151613075565b90506000614d4a85613611565b9050614d568382612a70565b8452614d628282612a70565b6020850152614d7083613090565b6040850152614d7e82613090565b60608501525091949350505050565b670de0b6b3a764000081810391100290565b6000614dac6112356121b2565b90506000808088516001811115614dbf57fe5b14614dcf57838860600151614dd6565b8760600151845b91509150614dff6000896020015185614df8868b611b0e90919063ffffffff16565b8b51614a1b565b60408801516116959060019085614e168986611be6565b8b60200151614a1b565b6000614e3d6002841015801561332c575060ff8411156064611c0b565b614e4b828511156064611c0b565b6000196001841b01611510614e6086836145ec565b846149ae565b6001600160a01b03166000908152600c602052604090205490565b6000614e8e868484612f3b565b9050614a98614ea08685878587614ea9565b15610164611c0b565b600082614eb857506000611510565b6000614ecf614ec788886145ec565b868515614eed565b905082614ede57838111614ee2565b8381105b979650505050505050565b600081614f0357614efe84846149ae565b611a91565b611a9184846000614f178215156004611c0b565b50811515600019909201046001010290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b803561089681615f44565b600082601f830112614f6c578081fd5b8135614f7f614f7a82615f19565b615ef3565b818152915060208083019084810181840286018201871015614fa057600080fd5b60005b84811015614fc8578135614fb681615f44565b84529282019290820190600101614fa3565b505050505092915050565b600082601f830112614fe3578081fd5b8151614ff1614f7a82615f19565b81815291506020808301908481018184028601820187101561501257600080fd5b60005b84811015614fc857815161502881615f44565b84529282019290820190600101615015565b600082601f83011261504a578081fd5b8135615058614f7a82615f19565b81815291506020808301908481018184028601820187101561507957600080fd5b60005b84811015614fc85781358452928201929082019060010161507c565b600082601f8301126150a8578081fd5b81516150b6614f7a82615f19565b8181529150602080830190848101818402860182018710156150d757600080fd5b60005b84811015614fc8578151845292820192908201906001016150da565b600082601f830112615106578081fd5b81356001600160401b0381111561511b578182fd5b61512e601f8201601f1916602001615ef3565b915080825283602082850101111561514557600080fd5b8060208401602084013760009082016020015292915050565b80516004811061089657600080fd5b80356002811061089657600080fd5b600061012080838503121561518f578182fd5b61519881615ef3565b9150506151a5838361516d565b81526151b48360208401614f51565b60208201526151c68360408401614f51565b6040820152606082013560608201526080820135608082015260a082013560a08201526151f68360c08401614f51565b60c08201526152088360e08401614f51565b60e0820152610100808301356001600160401b0381111561522857600080fd5b615234858286016150f6565b82840152505092915050565b600060208284031215615251578081fd5b81356109ab81615f44565b6000806040838503121561526e578081fd5b823561527981615f44565b9150602083013561528981615f44565b809150509250929050565b6000806000606084860312156152a8578081fd5b83356152b381615f44565b925060208401356152c381615f44565b929592945050506040919091013590565b600080600080600080600060e0888a0312156152ee578485fd5b87356152f981615f44565b9650602088013561530981615f44565b95506040880135945060608801359350608088013561532781615f67565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215615356578182fd5b823561536181615f44565b946020939093013593505050565b60008060408385031215615381578182fd5b82516001600160401b0380821115615397578384fd5b6153a386838701614fd3565b935060208501519150808211156153b8578283fd5b50614b6a85828601615098565b600080600080608085870312156153da578182fd5b84356001600160401b03808211156153f0578384fd5b6153fc88838901614f5c565b95506020870135915080821115615411578384fd5b61541d8883890161503a565b94506040870135915080821115615432578384fd5b61543e8883890161503a565b93506060870135915080821115615453578283fd5b506154608782880161503a565b91505092959194509250565b600080600060608486031215615480578081fd5b83516001600160401b0380821115615496578283fd5b6154a287838801614fd3565b945060208601519150808211156154b7578283fd5b506154c486828701615098565b925050604084015190509250925092565b6000602082840312156154e6578081fd5b81356109ab81615f59565b600060208284031215615502578081fd5b81516109ab81615f59565b60006020828403121561551e578081fd5b5051919050565b600080600080600080600060e0888a03121561553f578081fd5b87359650602088013561555181615f44565b9550604088013561556181615f44565b945060608801356001600160401b038082111561557c578283fd5b6155888b838c0161503a565b955060808a0135945060a08a0135935060c08a01359150808211156155ab578283fd5b506155b88a828b016150f6565b91505092959891949750929550565b6000806000606084860312156155db578081fd5b8351925060208401516001600160401b03808211156155f8578283fd5b61560487838801614fd3565b93506040860151915080821115615619578283fd5b5061562686828701615098565b9150509250925092565b600060208284031215615641578081fd5b81356001600160e01b0319811681146109ab578182fd5b600060208284031215615669578081fd5b81516109ab81615f44565b600080600080600060a0868803121561568b578283fd5b853561569681615f44565b945060208601356156a681615f44565b9350604086013592506060860135915060808601356156c481615f44565b809150509295509295909350565b6000806000606084860312156156e6578081fd5b83356156f181615f44565b925060208401359150604084013561570881615f44565b809150509250925092565b600060208284031215615724578081fd5b8151600381106109ab578182fd5b600060208284031215615743578081fd5b6109ab838361515e565b6000806040838503121561575f578182fd5b615769848461515e565b915060208301516001600160401b03811115615783578182fd5b614b6a85828601615098565b600080600080608085870312156157a4578182fd5b84356001600160401b03808211156157ba578384fd5b6157c68883890161517c565b955060208701359150808211156157db578384fd5b506157e88782880161503a565b949794965050505060408301359260600135919050565b600080600060608486031215615813578081fd5b83356001600160401b03811115615828578182fd5b6158348682870161517c565b9660208601359650604090950135949350505050565b60006020828403121561585b578081fd5b5035919050565b60008060408385031215615874578182fd5b8251915060208301516001600160401b03811115615783578182fd5b600080600080608085870312156158a5578182fd5b843593506020850135925060408501356001600160401b03808211156158c9578384fd5b61543e88838901614f5c565b600080600080608085870312156158ea578182fd5b845193506020850151925060408501519150606085015161590a81615f44565b939692955090935050565b6000806000806080858703121561592a578182fd5b5050823594602084013594506040840135936060013592509050565b600060208284031215615957578081fd5b81516109ab81615f67565b60008060408385031215615974578182fd5b825161597f81615f67565b6020939093015192949293505050565b6000815180845260208085019450808401835b838110156159c75781516001600160a01b0316875295820195908201906001016159a2565b509495945050505050565b6000815180845260208085019450808401835b838110156159c7578151875295820195908201906001016159e5565b60008151808452815b81811015615a2657602081850181015186830182015201615a0a565b81811115615a375782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6000602082526109ab60208301846159d2565b600060408252615ac960408301856159d2565b828103602084015261151081856159d2565b600060c08252615aee60c08301896159d2565b8281036020840152615b0081896159d2565b90508281036040840152615b1481886159d2565b905085606084015284608084015282810360a0840152615b348185615a01565b9998505050505050505050565b600060a08252615b5460a08301886159d2565b8281036020840152615b6681886159d2565b905085604084015284606084015282810360808401526130698185615a01565b600060608252615b9960608301866159d2565b84602084015282810360408401526107e58185615a01565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b81811015615c7857615c668551615f38565b83529383019391830191600101615c54565b505084810360408601528551808252908201925081860190845b818110156132ed57615ca48351615f38565b85529383019391830191600101615c92565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b600061010060018060a01b03808c1684528a6020850152896040850152816060850152615d468285018a61598f565b91508382036080850152615d5a82896159d2565b96811660a08501529490941660c08301525060e001525095945050505050565b600060018060a01b03808a16835288602084015287604084015260e06060840152615da860e084018861598f565b8381036080850152615dba81886159d2565b9590911660a0840152505060c0015295945050505050565b6020810160038310615de057fe5b91905290565b6000602082526109ab6020830184615a01565b600083825260406020830152611a9160408301846159d2565b918252602082015260400190565b600085825284602083015260806040830152615e3f60808301856159d2565b8281036060840152614ee281856159d2565b92835260208301919091521515604082015260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b958652602086019490945260408501929092526060840152608083015260a082015260c00190565b60ff91909116815260200190565b6040518181016001600160401b0381118282101715615f1157600080fd5b604052919050565b60006001600160401b03821115615f2e578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114610f6457600080fd5b8015158114610f6457600080fd5b60ff81168114610f6457600080fdfea26469706673582212201cb6c7fd8d57d507c6afc2e6fda8942949b2e6d3b6f14b521f6a636e19d86bcb64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106103995760003560e01c80637beed220116101e9578063a457c2d71161010f578063d505accf116100ad578063ebf1b7421161007c578063ebf1b74214610747578063ed24911d1461076c578063f885a4bb14610774578063f89f27ed1461078757610399565b8063d505accf146106fb578063d5c096c41461070e578063dd62ed3e14610721578063e01af92c1461073457610399565b8063b35056b8116100e9578063b35056b8146106d0578063b62c1f06146106d8578063b7b814fc146106eb578063d2946c2b146106f357610399565b8063a457c2d7146106a2578063a9059cbb146106b5578063aaabadc5146106c857610399565b806387ec68171161018757806390193b7c1161015657806390193b7c1461066157806395d89b411461067457806397bb15c91461067c5780639d2c110c1461068f57610399565b806387ec681714610629578063893d20e81461063c5780638d027466146106515780638d928af81461065957610399565b8063819c70f3116101c3578063819c70f3146105f35780638456cb5914610606578063851c1bb31461060e578063876f303b1461062157610399565b80637beed220146105b55780637ecebe00146105cd57806381788e2b146105e057610399565b806339509351116102ce5780636028bfd41161026c57806370a082311161023b57806370a082311461056657806373656f891461057957806374f3b009146105815780637b749c45146105a257610399565b80636028bfd4146105045780636a2efb2c146105255780636b47273b1461053d578063704640161461055357610399565b806347bc4d92116102a857806347bc4d92146104d95780634df77ce0146104e157806354a844ba146104f457806355c67628146104fc57610399565b806339509351146104ab5780633c9d93b8146104be5780633f4ba83a146104d157610399565b806323b872dd1161033b57806334a36df81161031557806334a36df8146104755780633644e5151461048857806336eb097b1461049057806338fff2d0146104a357610399565b806323b872dd1461043a5780632a9a03231461044d578063313ce5671461046057610399565b80630da0669c116103775780630da0669c146103fc57806318160ddd146104065780631c0de0511461040e5780631dd746ea1461042557610399565b806301ec954a1461039e57806306fdde03146103c7578063095ea7b3146103dc575b600080fd5b6103b16103ac36600461578f565b61078f565b6040516103be9190615bd4565b60405180910390f35b6103cf6107ef565b6040516103be9190615de6565b6103ef6103ea366004615344565b610885565b6040516103be9190615bb1565b61040461089c565b005b6103b16108f0565b6104166108f6565b6040516103be93929190615bbc565b61042d61091f565b6040516103be9190615aa3565b6103ef610448366004615294565b61093c565b6103b161045b36600461584a565b6109b2565b6104686109f1565b6040516103be9190615ee5565b610404610483366004615674565b6109fa565b6103b1610b90565b6103ef61049e366004615240565b610b9f565b6103b1610bc1565b6103ef6104b9366004615344565b610be5565b6104046104cc366004615240565b610c20565b610404610c8d565b6103ef610c9f565b6103b16104ef36600461584a565b610cac565b610404610d15565b6103b1610d69565b610517610512366004615525565b610d76565b6040516103be929190615df9565b61052d610d94565b6040516103be9493929190615e7f565b610545610db3565b6040516103be929190615e12565b6103b161056136600461584a565b610de0565b6103b1610574366004615240565b610e42565b6103b1610e5d565b61059461058f366004615525565b610e8a565b6040516103be929190615ab6565b6104046105b03660046154d5565b610f4b565b6105bd610f67565b6040516103be9493929190615e20565b6103b16105db366004615240565b61109d565b6104046105ee366004615240565b6110a8565b610404610601366004615890565b611119565b6104046111c4565b6103b161061c366004615630565b6111d6565b6103b1611228565b610517610637366004615525565b61123a565b61064461124c565b6040516103be9190615a8f565b6103ef611270565b61064461127d565b6103b161066f366004615240565b6112a1565b6103cf6112bc565b61040461068a3660046156d2565b61131d565b6103b161069d3660046157ff565b6114e0565b6103ef6106b0366004615344565b611519565b6103ef6106c3366004615344565b611557565b610644611564565b6103ef61156e565b6104046106e6366004615915565b61157b565b6104046115a6565b6106446115f0565b6104046107093660046152d4565b611614565b61059461071c366004615525565b61169f565b6103b161072f36600461525c565b611735565b6104046107423660046154d5565b611772565b61075a610755366004615240565b61178b565b6040516103be96959493929190615ebd565b6103b161182f565b6104046107823660046153c5565b611839565b61042d6118cf565b600084608001516107bc6107a161127d565b6001600160a01b0316336001600160a01b03161460cd611c0b565b6107d16107c7610bc1565b82146101f4611c0b565b6107d9611c19565b6107e586868686611c2c565b9695505050505050565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561087b5780601f106108505761010080835404028352916020019161087b565b820191906000526020600020905b81548152906001019060200180831161085e57829003601f168201915b5050505050905090565b6000610892338484611c39565b5060015b92915050565b6108a4611ca1565b6108ee7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611cc4565b565b60025490565b6000806000610903611ed8565b15925061090e611ef5565b9150610918611f19565b9050909192565b60608061092a611f3d565b50905061093681611fea565b91505090565b6000806109498533611735565b905061096d336001600160a01b03871614806109655750838210155b61019e611c0b565b6109788585856120a4565b336001600160a01b0386161480159061099357506000198114155b156109a5576109a58533858403611c39565b60019150505b9392505050565b60006109bc612184565b6109c4611c19565b60006109ce6121b2565b905080156109e2576109df8161225c565b91505b6109eb83612318565b50919050565b60055460ff1690565b610a02612184565b610a0a611c19565b6000610a146121b2565b9050610a246000821160ce611c0b565b610a2d8161225c565b50506060610a39611f3d565b509050610a4f60328251600101111560c9611c0b565b600060608073__$6d134cfc25e59b25943ff4bfa0c28ca096$__631face20a610a7661127d565b610a7e610bc1565b60095488610a8b8a612379565b8f8f8f6040518963ffffffff1660e01b8152600401610ab1989796959493929190615d17565b60006040518083038186803b158015610ac957600080fd5b505af4158015610add573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b0591908101906155c7565b6001600160a01b038c166000908152600b6020526040902083905591945092509050610b344280838086612444565b8515610b4457610b448587612566565b886001600160a01b03167ff4c563a3ea86ff1f4275e8c207df0375a51963f2b831b7bf4da8be938d92876c88604051610b7d9190615bd4565b60405180910390a2505050505050505050565b6000610b9a61182f565b905090565b6001600160a01b0381166000908152600d602052604090205460ff165b919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610892918590610c1b9086611b0e565b611c39565b610c28612184565b610c30611c19565b610c44610c3c82610b9f565b6101b1611c0b565b6001600160a01b0381166000818152600d6020526040808220805460ff19169055517f89aa0423af0b4cf311bfb79f61549f2b82b335f041e4f7ae674618059b51a4cb9190a250565b610c95612184565b6108ee6000612570565b6000610b9a6009546125e3565b60008082610cbc57506000610ce9565b6002831415610ccd57506008610ce9565b6003831415610cde57506010610ce9565b610ce96101bb6125f0565b6109ab7f0000000000000000000000000000000000000000000000000000000000000000826008611af0565b610d1d612184565b610d25612600565b610d2f6001612614565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610d5f9190615bb1565b60405180910390a1565b6000610b9a600954612630565b60006060610d88888785612655612718565b97509795505050505050565b600080600080610da5600954612812565b935093509350935090919293565b600080610dc1600a5461285a565b6009549193509150610dd29061287f565b15610ddc57600091505b9091565b6000610dea61156e565b15610df757506000610bbc565b600082610e0657506000610e33565b6002831415610e1757506040610e33565b6003831415610e2857506080610e33565b610e336101bb6125f0565b6008546109ab90826040611af0565b6001600160a01b031660009081526020819052604090205490565b6000610e67611c19565b6000610e716121b2565b9050610e816000821160ce611c0b565b6109368161225c565b60608088610e996107a161127d565b610ea46107c7610bc1565b6000610eaf8561288c565b15610ed757610ebc6128bb565b610ece88610ec86108f0565b876128ce565b94509050610eef565b610edf611c19565b610eea8a8987612655565b945090505b610ef98a8261290e565b83516001600160401b0381118015610f1057600080fd5b50604051908082528060200260200182016040528015610f3a578160200160208202803683370190505b509250505097509795505050505050565b610f53612184565b610f5b611c19565b610f6481612918565b50565b600080606080610f78600954612957565b90945092506060610f87611f3d565b50905080516001600160401b0381118015610fa157600080fd5b50604051908082528060200260200182016040528015610fcb578160200160208202803683370190505b50925080516001600160401b0381118015610fe557600080fd5b5060405190808252806020026020018201604052801561100f578160200160208202803683370190505b50915060005b81518110156110955761105f600b600084848151811061103157fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054612974565b85838151811061106b57fe5b6020026020010185848151811061107e57fe5b602090810291909101019190915252600101611015565b505090919293565b6000610896826112a1565b6110b0612184565b6110b8611c19565b6110cd6110c482610b9f565b156101b0611c0b565b6001600160a01b0381166000818152600d6020526040808220805460ff19166001179055517fbf5840c727acdcaceea5154edc82998fa82a490aa3dc7aeb66849c8bbea1f5799190a250565b611121612184565b611129611c19565b6060611133611f3d565b509050611144835182518451611aac565b60005b815181101561119e5761119684828151811061115f57fe5b60200260200101516001600160a01b031683838151811061117c57fe5b60200260200101516001600160a01b031614610208611c0b565b600101611147565b506111bd6111ac8686612991565b856111b686612379565b8587612444565b5050505050565b6111cc612184565b6108ee6001612570565b60007f00000000000000000000000000000000000000000000000000000000000000008260405160200161120b929190615a4c565b604051602081830303815290604052805190602001209050919050565b6000610b9a6112356121b2565b6129ae565b60006060610d888887856129d9612718565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610b9a600954612a63565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561087b5780601f106108505761010080835404028352916020019161087b565b611325612184565b61132d611c19565b60006113376121b2565b90506113476000821160ce611c0b565b6113508161225c565b5050606061135c611f3d565b50905061137260026001835103101560c8611c0b565b6001600160a01b0384166000908152600b602052604081205461139d90670de0b6b3a7640000612a70565b905060608073__$6d134cfc25e59b25943ff4bfa0c28ca096$__63a20d2e4d6113c461127d565b6113cc610bc1565b600954886113d98a612379565b8d8a6040518863ffffffff1660e01b81526004016113fd9796959493929190615d7a565b60006040518083038186803b15801561141557600080fd5b505af4158015611429573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611451919081019061536f565b6001600160a01b0389166000908152600b6020526040812055909250905061147c4280838086612444565b85156114a3576114996001600160a01b03861615156101bc611c0b565b6114a3858761290e565b6040516001600160a01b038816907f4c910b69fe65a61f7531b9c5042b2329ca7179c77290aa7e2eb3afa3c8511fd390600090a250505050505050565b600083608001516114f26107a161127d565b6114fd6107c7610bc1565b611505611c19565b611510858585612a93565b95945050505050565b6000806115263385611735565b90508083106115405761153b33856000611c39565b61154d565b61154d3385858403611c39565b5060019392505050565b60006108923384846120a4565b6000610b9a612b5f565b6000610b9a60095461287f565b611583612184565b61158b611c19565b6115a06115988585612991565b848484612bd9565b50505050565b6115ae612184565b6115b66128bb565b6115c06000612614565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610d5f9190615bb1565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886116438c6112a1565b8960405160200161165996959493929190615bfc565b60405160208183030381529060405280519060200120905061168a8882611681878787612c41565b886101f8612c80565b611695888888611c39565b5050505050505050565b606080886116ae6107a161127d565b6116b96107c7610bc1565b60006116c3611c19565b6116cb6108f0565b61171c576116d98a86612cd7565b945090506116f26116e8612e4d565b82101560cc611c0b565b61170460006116ff612e4d565b612566565b61171789611710612e4d565b8303612566565b610ef9565b6117278a89876129d9565b94509050610ef98982612566565b600061173f61127d565b6001600160a01b0316826001600160a01b031614156117615750600019610896565b61176b8383612e54565b9050610896565b61177a612184565b611782611c19565b610f6481612e7f565b6001600160a01b0381166000908152600c6020526040812054819081908190819081906117b781612ebe565b9299509097509550935060006117cc89612f0c565b90506117da82826001612f3b565b93506117e882826000612f3b565b925060006117fd6117f88b613075565b613090565b905061180989826130b4565b985061181585826130b4565b945061182184826130b4565b935050505091939550919395565b6000610b9a6130c0565b611841612184565b611849611c19565b611857845183518351611aac565b6118638451845161315d565b60005b84518110156111bd576118c785828151811061187e57fe5b602002602001015185838151811061189257fe5b60200260200101518584815181106118a657fe5b60200260200101518585815181106118ba57fe5b602002602001015161316a565b600101611866565b6060806118da611f3d565b50905061093681612379565b60006118f183611ae2565b606083516001016001600160401b038111801561190d57600080fd5b50604051908082528060200260200182016040528015611937578160200160208202803683370190505b509050308160008151811061194857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156119b75784818151811061198057fe5b602002602001015182826001018151811061199757fe5b6001600160a01b039092166020928302919091019091015260010161196b565b50606083516001016001600160401b03811180156119d457600080fd5b506040519080825280602002602001820160405280156119fe578160200160208202803683370190505b509050600081600081518110611a1057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b8451811015611a7f57848181518110611a4857fe5b6020026020010151828260010181518110611a5f57fe5b6001600160a01b0390921660209283029190910190910152600101611a33565b50611a8c8787848461320b565b925050505b949350505050565b6000611aa68484846132fb565b50501b90565b611ac48284148015611abd57508183145b6067611c0b565b505050565b6000611ad58184613342565b90506109ab818384611b20565b80611aec816133d1565b5050565b6001901b6000190191901c1690565b60006109ab838383603c611bc3565b60008282016109ab8482101583611c0b565b6000611a9182604080611b3588888784611bc3565b929190611bc3565b6000611b4c8484836020611bc3565b9350611a918483602080611bc3565b6000611b6b868660406020611bc3565b9550611b7b868560606020611bc3565b9550611b8b86846080603e611bc3565b95506107e5868360be603e611bc3565b60006109ab838360fc611bfc565b60006109ab838360fd611bfc565b80820390821102900390565b6000611bd08484846132fb565b506001901b60001901811b1992909216911b1790565b6000611bf6838311156001611c0b565b50900390565b6001811b1992909216911b1790565b81611aec57611aec816125f0565b6108ee611c24611ed8565b610192611c0b565b6000611a916103e66125f0565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611c94908590615bd4565b60405180910390a3505050565b611ca9611c19565b6000611cb36121b2565b90508015610f6457611aec8161225c565b60006001600160a01b038316631a7c3263611ce184846008611af0565b6040518263ffffffff1660e01b8152600401611cfd9190615bd4565b60206040518083038186803b158015611d1557600080fd5b505afa158015611d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4d919061550d565b905060006001600160a01b038416631a7c3263611d6c85600880611af0565b6040518263ffffffff1660e01b8152600401611d889190615bd4565b60206040518083038186803b158015611da057600080fd5b505afa158015611db4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd8919061550d565b905060006001600160a01b038516631a7c3263611df88660106008611af0565b6040518263ffffffff1660e01b8152600401611e149190615bd4565b60206040518083038186803b158015611e2c57600080fd5b505afa158015611e40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e64919061550d565b90506000611e758260806040611a99565b611e8184604080611a99565b611e8e8660006040611a99565b17179050806008819055507fc3f0acc358200d8e08ac6ce20bc2f9f27893a344f813bf682b7859b3e521502e81604051611ec89190615bd4565b60405180910390a1505050505050565b6000611ee2611f19565b421180610b9a57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b606080606080611f4b61127d565b6001600160a01b031663f94d4668611f61610bc1565b6040518263ffffffff1660e01b8152600401611f7d9190615bd4565b60006040518083038186803b158015611f9557600080fd5b505afa158015611fa9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611fd1919081019061546c565b5091509150611fe0828261344a565b9350935050509091565b8051606090806001600160401b038111801561200557600080fd5b5060405190808252806020026020018201604052801561202f578160200160208202803683370190505b50915060005b8181101561209d5761207e600b600086848151811061205057fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054613090565b83828151811061208a57fe5b6020908102919091010152600101612035565b5050919050565b6120bb6001600160a01b0384161515610198611c0b565b6120d26001600160a01b0383161515610199611c0b565b6120dd838383611ac4565b6001600160a01b03831660009081526020819052604090205461210390826101a061346a565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546121329082611b0e565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c94908590615bd4565b600061219b6000356001600160e01b0319166111d6565b9050610f646121aa8233613480565b610191611c0b565b60008060006121bf61127d565b6001600160a01b031663b05f8e486121d5610bc1565b306040518363ffffffff1660e01b81526004016121f3929190615ce2565b60806040518083038186803b15801561220b57600080fd5b505afa15801561221f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224391906158d5565b5050915091508082016122546108f0565b039250505090565b6000806000612269610db3565b91509150600061227b85428486613569565b90506122856135ad565b806122965760009350505050610bbc565b60006122ac6122a56003610de0565b83906135be565b905060006122ba8383611be6565b90506122c582613600565b7f0666d5a83bb8143573350414d5a13dbdcac60a706160576416096ad6a41c0ea5816040516122f49190615bd4565b60405180910390a161230d61230761124c565b82612566565b509095945050505050565b61232f670d2f13f7789f0000821115610160611c0b565b61233b600a5482611aff565b600a556040517f556cdf4052d939f8acbe593d83668d2e18500b032bcf51cbbf82b181c6094dd79061236e908390615bd4565b60405180910390a150565b60606000612388600954613611565b8351909150806001600160401b03811180156123a357600080fd5b506040519080825280602002602001820160405280156123cd578160200160208202803683370190505b50925060005b8181101561243c5761241d600b60008784815181106123ee57fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205484612a70565b84828151811061242957fe5b60209081029190910101526001016123d3565b505050919050565b6000805b835181101561250957600084828151811061245f57fe5b6020026020010151905061247f662386f26fc1000082101561012e611c0b565b6124898382611b0e565b9250600084838151811061249957fe5b602002602001015190506124e6600b6000836001600160a01b03166001600160a01b03168152602001908152602001600020548885815181106124d857fe5b602002602001015184611b20565b6001600160a01b039091166000908152600b602052604090205550600101612448565b50612520670de0b6b3a76400008214610134611c0b565b61252d6009548787611b3d565b6009556040517f0f3631f9dab08169d1db21c6dc5f32536fb2b0a6b9bb5330d71c52132f968be090611ec8908890889088908890615e20565b611aec828261362d565b80156125905761258b612581611ef5565b4210610193611c0b565b6125a5565b6125a561259b611f19565b42106101a9611c0b565b6007805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be649061236e908390615bb1565b60006108968260fc6136d1565b610f64816210905360ea1b6136d8565b6108ee61260b61156e565b156101b5611c0b565b61262060095482613739565b60095580610f6457610f646135ad565b600080600080600061264186612812565b93509350935093506107e582828686613747565b60006060600061266c6126666108f0565b86613761565b95509050606061267a611f3d565b509050606061268882611fea565b905061269487826137a2565b600061269f8461225c565b8401905060606126ae84612379565b90506126be8a8a8386868d61380b565b909750955060016126ce896139c5565b60028111156126d957fe5b146126f6576126f66126eb8389611be6565b858b898560006139db565b6127008684613a75565b61270986613ade565b95505050505050935093915050565b3330146127d6576000306001600160a01b031660003660405161273c929190615a64565b6000604051808303816000865af19150503d8060008114612779576040519150601f19603f3d011682016040523d82523d6000602084013e61277e565b606091505b50509050806000811461278d57fe5b60046000803e6000516001600160e01b0319166343adbafb60e01b81146127b8573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b600060606127e98686868663ffffffff16565b8051601f1982018390526343adbafb603f19830152919350915060200260231982016044820181fd5b60008080806128248560406020611af0565b93506128338560606020611af0565b9250612842856080603e611af0565b91506128518560be603e611af0565b90509193509193565b6000806128698382603c611af0565b915061287883603c6020611af0565b9050915091565b60006108968260fe6136d1565b6000808251118015610896575060ff8016828060200190518101906128b19190615946565b60ff161492915050565b6108ee6128c661156e565b6101b6611c0b565b6000606060006128de8587613761565b965090506128eb84613b69565b92506128f8868483613b7f565b915061290382613ade565b915050935093915050565b611aec8282613c30565b61292460095482611ba9565b6009556040517f5353e2cb47d505ba9b628610daec53fc41f3a4259dab35a757b0f1d5a58bc1c39061236e908390615bb1565b60008061296683826020611af0565b915061287883602080611af0565b60008061298383826040611af0565b915061287883604080611af0565b600061299d4284613ceb565b905061089682821115610146611c0b565b60008060006129bb610db3565b9150915060006129cd85428486613569565b90506115108582611b0e565b6000606060006129ea6126666108f0565b9550905060606129f8611f3d565b5090506060612a0682611fea565b9050612a1287826137a2565b6000612a1d8461225c565b840190506060612a2c84612379565b9050612a3c8a8a8386868d613cf7565b9097509550612a59612a4e8389611b0e565b858b898560016139db565b6127008684613e04565b60006108968260fd6136d1565b60006109ab612a8184836040611af0565b612a8d85604080611af0565b84613e6d565b600080612a9e613ed7565b9050612ab4612aac826125e3565b610147611c0b565b60408501516001600160a01b0316301415612b0d57612ada610c3c828760c00151613edd565b600083612ae56108f0565b0390506000612af38261225c565b82019050612b0387878386613ef8565b93505050506109ab565b60208501516001600160a01b0316301415612b4b57600084612b2d6108f0565b0390506000612b3b8261225c565b82019050612b03878683866140c3565b612b578585858461427e565b9150506109ab565b6000612b6961127d565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015612ba157600080fd5b505afa158015612bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9a9190615658565b612be2826144a8565b612beb816144a8565b612bfa60095485858585611b5b565b6009556040517fc42eae0298d32208994ed5d58e525fa31c2911e95451d98f8df3355259c4a13d90612c33908690869086908690615e7f565b60405180910390a150505050565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b6000612c8b856144d1565b9050612ca1612c9b8783876144ed565b83611c0b565b612cb0428410156101b8611c0b565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b60006060612cef610c3c612ce9613ed7565b86613edd565b6000612cfa8461459c565b9050612d156000826003811115612d0d57fe5b1460ce611c0b565b6060612d1f611f3d565b509050612d2b856145b2565b9250612d398351825161315d565b6060612d4482611fea565b9050612d5084826137a2565b6000612d5a6145c8565b6001600160a01b03166390043a58612d7185612379565b876040518363ffffffff1660e01b8152600401612d8f929190615ab6565b60206040518083038186803b158015612da757600080fd5b505afa158015612dbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ddf919061550d565b9050612dec8186516145ec565b9550612df88583613e04565b6000612e086001606f1b88611be6565b9050612e148982612566565b612e1d86613ade565b95508086600081518110612e2d57fe5b602002602001018181525050612e416135ad565b50505050509250929050565b620f424090565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b612e8b60095482611b9b565b6009556040517f5a9e84f78f7957cb4ed7478eb0fcad35ee4ecbe2e0f298420b28a3955392573f9061236e908390615bb1565b6000808080612ecf85606080611af0565b9350612ede8560206040611af0565b92506030612eef8660006010611af0565b901b91506030612f0186601080611af0565b901b90509193509193565b6001600160a01b0381166000908152600b60205260408120546009546108969190612f3690613611565b612a70565b6000806030612f5b84612f4f576010612f52565b60005b87906010611af0565b901b905080612f6e5760009150506109ab565b6000612f7c86606080611af0565b90506000612f8d8760206040611af0565b9050600081871415612fd057612fc96020678ac7230489e80000612fc289612fb65760e0612fb9565b60c05b8c906020611af0565b9190614606565b905061305e565b604051633d3632df60e21b815273__$6670886e635fd86503a30ff6f4e4ebb80f$__9063f4d8cb7c9061300b9087908b908b90600401615e51565b60206040518083038186803b15801561302357600080fd5b505af4158015613037573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305b919061550d565b90505b61306981848861464c565b98975050505050505050565b6001600160a01b03166000908152600b602052604090205490565b6000806130a08360806005611af0565b600a0a670de0b6b3a7640000029392505050565b60006109ab8383614665565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061312d614693565b30604051602001613142959493929190615cb6565b60405160208183030381529060405280519060200120905090565b611aec8183146067611c0b565b600061317585612f0c565b9050613185811515610135611c0b565b600061319c856131976117f889613075565b614697565b90506131aa818386866146a3565b6001600160a01b0387166000818152600c6020526040908190209290925590517fcad1fdf49cd36960e377075cfe18dcc3aa113e526fbe184544cca2e7115c54f3906131fb90889088908890615e69565b60405180910390a2505050505050565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040161323a9190615dd2565b602060405180830381600087803b15801561325457600080fd5b505af1158015613268573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328c919061550d565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d2906132bf90849088908890600401615c30565b600060405180830381600087803b1580156132d957600080fd5b505af11580156132ed573d6000803e3d6000fd5b509298975050505050505050565b61330a61010083106064611c0b565b6133336001821015801561332c575061332860ff8461010003611bb7565b8211155b6064611c0b565b611ac483821c156101b4611c0b565b60006109ab6133c6836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561338357600080fd5b505afa158015613397573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133bb9190615946565b60129060ff16611be6565b849060806005611bc3565b6002815110156133e057610f64565b6000816000815181106133ef57fe5b602002602001015190506000600190505b8251811015611ac457600083828151811061341757fe5b60200260200101519050613440816001600160a01b0316846001600160a01b0316106065611c0b565b9150600101613400565b815160001990810160209384019081528251909101919092019081529091565b60006134798484111583611c0b565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b61349f61124c565b6001600160a01b0316141580156134ba57506134ba8361489c565b156134e2576134c761124c565b6001600160a01b0316336001600160a01b0316149050610896565b6134ea612b5f565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161351993929190615bdd565b60206040518083038186803b15801561353157600080fd5b505afa158015613545573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176b91906154f1565b60008284111580613578575081155b1561358557506000611a91565b60006135918684614996565b9050838503611a8c6135a383836145ec565b6301e133806149ae565b6135b9600a54426149ce565b600a55565b60008282026135e28415806135db5750838583816135d857fe5b04145b6003611c0b565b6001670de0b6b3a76400006001830304018115150291505092915050565b8015610f6457610f646123076115f0565b600080600061361f84612957565b91509150611a9182826149de565b61363960008383611ac4565b61365361364e826136486108f0565b90611b0e565b614a16565b6001600160a01b0382166000908152602081905260409020546136769082611b0e565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906136c5908590615bd4565b60405180910390a35050565b1c60011690565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60006109ab838360fe611bfc565b60008061375484846149de565b90506107e5868683613e6d565b6000606061378c8360008151811061377557fe5b602002602001015185611be690919063ffffffff16565b8351600019016020909401938452949293505050565b815181516137b190829061315d565b60005b818110156115a0576137ec8482815181106137cb57fe5b60200260200101518483815181106137df57fe5b6020026020010151614665565b8482815181106137f857fe5b60209081029190910101526001016137b4565b600060606000613819613ed7565b90506000613826856139c5565b9050613852613834836125e3565b8061384a5750600182600281111561384857fe5b145b61014a611c0b565b600081600281111561386057fe5b14156139085761386e6145c8565b6001600160a01b0316633d0b05e98a8a8961388887612630565b8a6040518663ffffffff1660e01b81526004016138a9959493929190615b41565b60006040518083038186803b1580156138c157600080fd5b505afa1580156138d5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526138fd9190810190615862565b9350935050506139ba565b600181600281111561391657fe5b1415613953576139246145c8565b6001600160a01b0316631b2db0ea8a88886040518463ffffffff1660e01b81526004016138a993929190615b86565b600281600281111561396157fe5b14156139ac5761396f6145c8565b6001600160a01b0316632ac71a3e8a8a8a8a61398a88612630565b8b6040518763ffffffff1660e01b81526004016138a996959493929190615adb565b6139b76101506125f0565b50505b965096945050505050565b6000818060200190518101906108969190615713565b60005b8451811015613a6c576000613a2d8683815181106139f857fe5b6020026020010151868481518110613a0c57fe5b602002602001015185613a2157611be6613a25565b611b0e5b63ffffffff16565b9050613a636002888481518110613a4057fe5b60200260200101518a84888781518110613a5657fe5b6020026020010151614a1b565b506001016139de565b50505050505050565b81518151613a8490829061315d565b60005b818110156115a057613abf848281518110613a9e57fe5b6020026020010151848381518110613ab257fe5b6020026020010151614aa0565b848281518110613acb57fe5b6020908102919091010152600101613a87565b606081516001016001600160401b0381118015613afa57600080fd5b50604051908082528060200260200182016040528015613b24578160200160208202803683370190505b50905060005b82518110156109eb57828181518110613b3f57fe5b6020026020010151828260010181518110613b5657fe5b6020908102919091010152600101613b2a565b6000818060200190518101906109ab9190615962565b60606000613b8d8484614aa0565b9050606085516001600160401b0381118015613ba857600080fd5b50604051908082528060200260200182016040528015613bd2578160200160208202803683370190505b50905060005b8651811015613c2657613c0783888381518110613bf157fe5b602002602001015161466590919063ffffffff16565b828281518110613c1357fe5b6020908102919091010152600101613bd8565b5095945050505050565b613c476001600160a01b038316151561019b611c0b565b613c5382600083611ac4565b6001600160a01b038216600090815260208190526040902054613c7990826101b261346a565b6001600160a01b038316600090815260208190526040902055613ca761364e82613ca16108f0565b90614aea565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516136c59190615bd4565b80820390821002900390565b600060606000613d05613ed7565b90506000613d128561459c565b9050613d34613d20836125e3565b8061384a5750600382600381111561384857fe5b613d41610c3c838c613edd565b6001816003811115613d4f57fe5b1415613d7857613d5d6145c8565b6001600160a01b031663120c0c638a8a8a8a61398a88612630565b6002816003811115613d8657fe5b1415613dae57613d946145c8565b6001600160a01b031663098e01898a8a8961388887612630565b6003816003811115613dbc57fe5b1415613df957613dca6145c8565b6001600160a01b03166303a5b64b8a88886040518463ffffffff1660e01b81526004016138a993929190615b86565b6139b76101366125f0565b81518151613e1390829061315d565b60005b818110156115a057613e4e848281518110613e2d57fe5b6020026020010151848381518110613e4157fe5b6020026020010151614af8565b848281518110613e5a57fe5b6020908102919091010152600101613e16565b6000670de0b6b3a764000082101580613e8557508284145b15613e915750816109ab565b81613e9d5750826109ab565b82841115613ebe576000613eb383858703614665565b850391506109ab9050565b6000613ecc83868603614665565b850191506109ab9050565b60095490565b6000613ee883612a63565b15806109ab57506109ab82610b9f565b6000806000613f138760200151613f0e86613611565b614b45565b915091506000613f2285612630565b9050613f2e87836130b4565b965060008089516001811115613f4057fe5b1415613fef57613f548960600151846130b4565b60608a0152613f616145c8565b6001600160a01b031663afc4d0db89868c606001518b876040518663ffffffff1660e01b8152600401613f98959493929190615e9a565b60206040518083038186803b158015613fb057600080fd5b505afa158015613fc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fe8919061550d565b9050614081565b613ff76145c8565b6001600160a01b0316637f1ae8a989868c606001518b876040518663ffffffff1660e01b815260040161402e959493929190615e9a565b60206040518083038186803b15801561404657600080fd5b505afa15801561405a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061407e919061550d565b90505b61408e8988836001614b74565b60008951600181111561409d57fe5b14156140ae579350611a9192505050565b6140b88184614d09565b945050505050611a91565b60008060006140d98760400151613f0e86613611565b9150915060006140e885612630565b90506140f487836130b4565b96506000808951600181111561410657fe5b14156141a2576141146145c8565b6001600160a01b0316630ccd894189868c606001518b876040518663ffffffff1660e01b815260040161414b959493929190615e9a565b60206040518083038186803b15801561416357600080fd5b505afa158015614177573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061419b919061550d565b9050614247565b6141b08960600151846130b4565b60608a01526141bd6145c8565b6001600160a01b031663ef2aca7689868c606001518b876040518663ffffffff1660e01b81526004016141f4959493929190615e9a565b60206040518083038186803b15801561420c57600080fd5b505afa158015614220573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614244919061550d565b90505b6142548988836000614b74565b60008951600181111561426357fe5b1415614273576140b88184614697565b9350611a9192505050565b6000614288614f29565b6142928684614d15565b905060006142a76142a285612630565b614d8d565b90506142b78683604001516130b4565b95506142c78583606001516130b4565b9450600080885160018111156142d957fe5b14156143a1576142f1886060015184604001516130b4565b606089018190526000906143059084614665565b905061430f6145c8565b8451602086015160405163063c5da760e11b81526001600160a01b039390931692630c78bb4e92614349928d928d91908890600401615e9a565b60206040518083038186803b15801561436157600080fd5b505afa158015614375573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614399919061550d565b915050614460565b6143b3886060015184606001516130b4565b606089015260006143c26145c8565b8451602086015160608c015160405162d5905160e81b81526001600160a01b03949094169363d590510093614400938e9391928e9290600401615e9a565b60206040518083038186803b15801561441857600080fd5b505afa15801561442c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614450919061550d565b905061445c8184614af8565b9150505b61446d8884898985614d9f565b60008851600181111561447c57fe5b141561449a57614490818460600151614697565b9350505050611a91565b614490818460400151614d09565b6144bb64e8d4a5100082101560cb611c0b565b610f64670d2f13f7789f000082111560ca611c0b565b60006144db6130c0565b8260405160200161120b929190615a74565b60006144ff82516041146101b9611c0b565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190614538908990859088908890615cf9565b6020604051602081039080840390855afa15801561455a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906130695750876001600160a01b0316816001600160a01b0316149450505050509392505050565b6000818060200190518101906108969190615732565b6060818060200190518101906109ab919061574d565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008282026109ab8415806135db5750838583816135d857fe5b60006146236002841015801561332c575060ff8411156064611c0b565b6000196001841b01614639818611156064611c0b565b61151061464686856145ec565b826149ae565b6000611a9183858461466057614665613a25565b6135be565b600082820261467f8415806135db5750838583816135d857fe5b670de0b6b3a7640000815b04949350505050565b4690565b60006109ab8383614aa0565b60006146d88315806146d0575067016345785d8a000084101580156146d05750670de0b6b3a76400008411155b610163611c0b565b6146ef678ac7230489e80000831115610163611c0b565b6147068215806146d0575083831015610163611c0b565b600061471d8560206040611b35858b606080611bc3565b905061473e603084811c906010908190611b359086908a901c600084611bc3565b9050600073__$6670886e635fd86503a30ff6f4e4ebb80f$__63f4d8cb7c868860016040518463ffffffff1660e01b815260040161477e93929190615e51565b60206040518083038186803b15801561479657600080fd5b505af41580156147aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147ce919061550d565b9050600073__$6670886e635fd86503a30ff6f4e4ebb80f$__63f4d8cb7c868960006040518463ffffffff1660e01b815260040161480e93929190615e51565b60206040518083038186803b15801561482657600080fd5b505af415801561483a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061485e919061550d565b9050613069614877826020678ac7230489e80000614e20565b60e06020611b356148918783678ac7230489e80000614e20565b889060c06020611bc3565b60006148ae63819c70f360e01b6111d6565b8214806148c957506148c6635b160f8360e11b6111d6565b82145b806148e257506148df633806be4b60e21b6111d6565b82145b806148fb57506148f86381788e2b60e01b6111d6565b82145b806149145750614911630793b27760e31b6111d6565b82145b8061492d575061492a637b749c4560e01b6111d6565b82145b8061494657506149436306946dbf60e31b6111d6565b82145b8061495f575061495c6397bb15c960e01b6111d6565b82145b806149785750614975632a9a032360e01b6111d6565b82145b80610896575061498e63f885a4bb60e01b6111d6565b909114919050565b60006109ab6149a584846145ec565b6149ae84614d8d565b60006149bd8215156004611c0b565b8183816149c657fe5b049392505050565b60006109ab8383603c6020611bc3565b60008142106149f65750670de0b6b3a7640000610896565b824211614a0557506000610896565b828203428490036115108183614aa0565b600255565b6000614a2685614e66565b90506000866002811115614a3657fe5b1480614a4d57506002866002811115614a4b57fe5b145b15614a6057614a60818585856001614e81565b6001866002811115614a6e57fe5b1480614a8557506002866002811115614a8357fe5b145b15614a9857614a98818585856000614e81565b505050505050565b6000614aaf8215156004611c0b565b670de0b6b3a76400008302614ae1841580614ada5750670de0b6b3a7640000858381614ad757fe5b04145b6005611c0b565b82818161468a57fe5b60006109ab8383600161346a565b6000614b078215156004611c0b565b670de0b6b3a76400008302614b2f841580614ada5750670de0b6b3a7640000858381614ad757fe5b6001836001830304018115150291505092915050565b6000806000614b5385613075565b9050614b5f8185612a70565b9250614b6a81613090565b9150509250929050565b6000808215614bc157600086516001811115614b8c57fe5b14614ba7576060860151614ba1908690611b0e565b84614bb7565b614bb18585611b0e565b86606001515b9092509050614c01565b600086516001811115614bd057fe5b14614be957614bdf8585611be6565b8660600151614bfb565b6060860151614bf9908690611be6565b845b90925090505b606080614c0c611f3d565b915091506060614c1b83612379565b9050614c2f82614c2a85611fea565b6137a2565b606083516001600160401b0381118015614c4857600080fd5b50604051908082528060200260200182016040528015614c72578160200160208202803683370190505b509050600087614c86578a60400151614c8c565b8a602001515b905060005b8551811015614ced57816001600160a01b0316868281518110614cb057fe5b60200260200101516001600160a01b03161415614ce55786838281518110614cd457fe5b602002602001018181525050614ced565b600101614c91565b50614cfc87868685878d6139db565b5050505050505050505050565b60006109ab8383614af8565b614d1d614f29565b6000614d2c8460200151613075565b90506000614d3d8560400151613075565b90506000614d4a85613611565b9050614d568382612a70565b8452614d628282612a70565b6020850152614d7083613090565b6040850152614d7e82613090565b60608501525091949350505050565b670de0b6b3a764000081810391100290565b6000614dac6112356121b2565b90506000808088516001811115614dbf57fe5b14614dcf57838860600151614dd6565b8760600151845b91509150614dff6000896020015185614df8868b611b0e90919063ffffffff16565b8b51614a1b565b60408801516116959060019085614e168986611be6565b8b60200151614a1b565b6000614e3d6002841015801561332c575060ff8411156064611c0b565b614e4b828511156064611c0b565b6000196001841b01611510614e6086836145ec565b846149ae565b6001600160a01b03166000908152600c602052604090205490565b6000614e8e868484612f3b565b9050614a98614ea08685878587614ea9565b15610164611c0b565b600082614eb857506000611510565b6000614ecf614ec788886145ec565b868515614eed565b905082614ede57838111614ee2565b8381105b979650505050505050565b600081614f0357614efe84846149ae565b611a91565b611a9184846000614f178215156004611c0b565b50811515600019909201046001010290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b803561089681615f44565b600082601f830112614f6c578081fd5b8135614f7f614f7a82615f19565b615ef3565b818152915060208083019084810181840286018201871015614fa057600080fd5b60005b84811015614fc8578135614fb681615f44565b84529282019290820190600101614fa3565b505050505092915050565b600082601f830112614fe3578081fd5b8151614ff1614f7a82615f19565b81815291506020808301908481018184028601820187101561501257600080fd5b60005b84811015614fc857815161502881615f44565b84529282019290820190600101615015565b600082601f83011261504a578081fd5b8135615058614f7a82615f19565b81815291506020808301908481018184028601820187101561507957600080fd5b60005b84811015614fc85781358452928201929082019060010161507c565b600082601f8301126150a8578081fd5b81516150b6614f7a82615f19565b8181529150602080830190848101818402860182018710156150d757600080fd5b60005b84811015614fc8578151845292820192908201906001016150da565b600082601f830112615106578081fd5b81356001600160401b0381111561511b578182fd5b61512e601f8201601f1916602001615ef3565b915080825283602082850101111561514557600080fd5b8060208401602084013760009082016020015292915050565b80516004811061089657600080fd5b80356002811061089657600080fd5b600061012080838503121561518f578182fd5b61519881615ef3565b9150506151a5838361516d565b81526151b48360208401614f51565b60208201526151c68360408401614f51565b6040820152606082013560608201526080820135608082015260a082013560a08201526151f68360c08401614f51565b60c08201526152088360e08401614f51565b60e0820152610100808301356001600160401b0381111561522857600080fd5b615234858286016150f6565b82840152505092915050565b600060208284031215615251578081fd5b81356109ab81615f44565b6000806040838503121561526e578081fd5b823561527981615f44565b9150602083013561528981615f44565b809150509250929050565b6000806000606084860312156152a8578081fd5b83356152b381615f44565b925060208401356152c381615f44565b929592945050506040919091013590565b600080600080600080600060e0888a0312156152ee578485fd5b87356152f981615f44565b9650602088013561530981615f44565b95506040880135945060608801359350608088013561532781615f67565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215615356578182fd5b823561536181615f44565b946020939093013593505050565b60008060408385031215615381578182fd5b82516001600160401b0380821115615397578384fd5b6153a386838701614fd3565b935060208501519150808211156153b8578283fd5b50614b6a85828601615098565b600080600080608085870312156153da578182fd5b84356001600160401b03808211156153f0578384fd5b6153fc88838901614f5c565b95506020870135915080821115615411578384fd5b61541d8883890161503a565b94506040870135915080821115615432578384fd5b61543e8883890161503a565b93506060870135915080821115615453578283fd5b506154608782880161503a565b91505092959194509250565b600080600060608486031215615480578081fd5b83516001600160401b0380821115615496578283fd5b6154a287838801614fd3565b945060208601519150808211156154b7578283fd5b506154c486828701615098565b925050604084015190509250925092565b6000602082840312156154e6578081fd5b81356109ab81615f59565b600060208284031215615502578081fd5b81516109ab81615f59565b60006020828403121561551e578081fd5b5051919050565b600080600080600080600060e0888a03121561553f578081fd5b87359650602088013561555181615f44565b9550604088013561556181615f44565b945060608801356001600160401b038082111561557c578283fd5b6155888b838c0161503a565b955060808a0135945060a08a0135935060c08a01359150808211156155ab578283fd5b506155b88a828b016150f6565b91505092959891949750929550565b6000806000606084860312156155db578081fd5b8351925060208401516001600160401b03808211156155f8578283fd5b61560487838801614fd3565b93506040860151915080821115615619578283fd5b5061562686828701615098565b9150509250925092565b600060208284031215615641578081fd5b81356001600160e01b0319811681146109ab578182fd5b600060208284031215615669578081fd5b81516109ab81615f44565b600080600080600060a0868803121561568b578283fd5b853561569681615f44565b945060208601356156a681615f44565b9350604086013592506060860135915060808601356156c481615f44565b809150509295509295909350565b6000806000606084860312156156e6578081fd5b83356156f181615f44565b925060208401359150604084013561570881615f44565b809150509250925092565b600060208284031215615724578081fd5b8151600381106109ab578182fd5b600060208284031215615743578081fd5b6109ab838361515e565b6000806040838503121561575f578182fd5b615769848461515e565b915060208301516001600160401b03811115615783578182fd5b614b6a85828601615098565b600080600080608085870312156157a4578182fd5b84356001600160401b03808211156157ba578384fd5b6157c68883890161517c565b955060208701359150808211156157db578384fd5b506157e88782880161503a565b949794965050505060408301359260600135919050565b600080600060608486031215615813578081fd5b83356001600160401b03811115615828578182fd5b6158348682870161517c565b9660208601359650604090950135949350505050565b60006020828403121561585b578081fd5b5035919050565b60008060408385031215615874578182fd5b8251915060208301516001600160401b03811115615783578182fd5b600080600080608085870312156158a5578182fd5b843593506020850135925060408501356001600160401b03808211156158c9578384fd5b61543e88838901614f5c565b600080600080608085870312156158ea578182fd5b845193506020850151925060408501519150606085015161590a81615f44565b939692955090935050565b6000806000806080858703121561592a578182fd5b5050823594602084013594506040840135936060013592509050565b600060208284031215615957578081fd5b81516109ab81615f67565b60008060408385031215615974578182fd5b825161597f81615f67565b6020939093015192949293505050565b6000815180845260208085019450808401835b838110156159c75781516001600160a01b0316875295820195908201906001016159a2565b509495945050505050565b6000815180845260208085019450808401835b838110156159c7578151875295820195908201906001016159e5565b60008151808452815b81811015615a2657602081850181015186830182015201615a0a565b81811115615a375782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6000602082526109ab60208301846159d2565b600060408252615ac960408301856159d2565b828103602084015261151081856159d2565b600060c08252615aee60c08301896159d2565b8281036020840152615b0081896159d2565b90508281036040840152615b1481886159d2565b905085606084015284608084015282810360a0840152615b348185615a01565b9998505050505050505050565b600060a08252615b5460a08301886159d2565b8281036020840152615b6681886159d2565b905085604084015284606084015282810360808401526130698185615a01565b600060608252615b9960608301866159d2565b84602084015282810360408401526107e58185615a01565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b81811015615c7857615c668551615f38565b83529383019391830191600101615c54565b505084810360408601528551808252908201925081860190845b818110156132ed57615ca48351615f38565b85529383019391830191600101615c92565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b600061010060018060a01b03808c1684528a6020850152896040850152816060850152615d468285018a61598f565b91508382036080850152615d5a82896159d2565b96811660a08501529490941660c08301525060e001525095945050505050565b600060018060a01b03808a16835288602084015287604084015260e06060840152615da860e084018861598f565b8381036080850152615dba81886159d2565b9590911660a0840152505060c0015295945050505050565b6020810160038310615de057fe5b91905290565b6000602082526109ab6020830184615a01565b600083825260406020830152611a9160408301846159d2565b918252602082015260400190565b600085825284602083015260806040830152615e3f60808301856159d2565b8281036060840152614ee281856159d2565b92835260208301919091521515604082015260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b958652602086019490945260408501929092526060840152608083015260a082015260c00190565b60ff91909116815260200190565b6040518181016001600160401b0381118282101715615f1157600080fd5b604052919050565b60006001600160401b03821115615f2e578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114610f6457600080fd5b8015158114610f6457600080fd5b60ff81168114610f6457600080fdfea26469706673582212201cb6c7fd8d57d507c6afc2e6fda8942949b2e6d3b6f14b521f6a636e19d86bcb64736f6c63430007010033", + "linkReferences": { + "contracts/lib/CircuitBreakerLib.sol": { + "CircuitBreakerLib": [ + { + "length": 20, + "start": 18321 + }, + { + "length": 20, + "start": 24310 + }, + { + "length": 20, + "start": 24454 + } + ] + }, + "contracts/managed/ManagedPoolAddRemoveTokenLib.sol": { + "ManagedPoolAddRemoveTokenLib": [ + { + "length": 20, + "start": 8712 + }, + { + "length": 20, + "start": 11094 + } + ] + } + }, + "deployedLinkReferences": { + "contracts/lib/CircuitBreakerLib.sol": { + "CircuitBreakerLib": [ + { + "length": 20, + "start": 12255 + }, + { + "length": 20, + "start": 18244 + }, + { + "length": 20, + "start": 18388 + } + ] + }, + "contracts/managed/ManagedPoolAddRemoveTokenLib.sol": { + "ManagedPoolAddRemoveTokenLib": [ + { + "length": 20, + "start": 2646 + }, + { + "length": 20, + "start": 5028 + } + ] + } + } +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/artifact/ManagedPoolAddRemoveTokenLib.json b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/artifact/ManagedPoolAddRemoveTokenLib.json new file mode 100644 index 0000000..de6882f --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/artifact/ManagedPoolAddRemoveTokenLib.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ManagedPoolAddRemoveTokenLib", + "sourceName": "contracts/managed/ManagedPoolAddRemoveTokenLib.sol", + "abi": [], + "bytecode": "0x610e5b610026600b82828239805160001a60731461001957fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100405760003560e01c80631face20a14610045578063a20d2e4d1461024a575b600080fd5b81801561005157600080fd5b506101aa600480360361010081101561006957600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b81111561009f57600080fd5b8201836020820111156100b157600080fd5b803590602001918460208302840111600160201b831117156100d257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561012157600080fd5b82018360208201111561013357600080fd5b803590602001918460208302840111600160201b8311171561015457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550506001600160a01b038335811694506020840135169260400135915061043d9050565b604051808481526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156101f45781810151838201526020016101dc565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561023357818101518382015260200161021b565b505050509050019550505050505060405180910390f35b81801561025657600080fd5b506103a4600480360360e081101561026d57600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b8111156102a357600080fd5b8201836020820111156102b557600080fd5b803590602001918460208302840111600160201b831117156102d657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561032557600080fd5b82018360208201111561033757600080fd5b803590602001918460208302840111600160201b8311171561035857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550506001600160a01b038335169350505060200135610637565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156103e85781810151838201526020016103d0565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561042757818101518382015260200161040f565b5050505090500194505050505060405180910390f35b600060608061045a6001600160a01b0387163014156101626108c5565b610463896108d7565b61046f8b8b888861090f565b6104798685610a9c565b92506000885160010167ffffffffffffffff8111801561049857600080fd5b506040519080825280602002602001820160405280156104c2578160200160208202803683370190505b509250875160010167ffffffffffffffff811180156104e057600080fd5b5060405190808252806020026020018201604052801561050a578160200160208202803683370190505b50915060005b88518110156105d05789818151811061052557fe5b602002602001015184828151811061053957fe5b6001600160a01b0390921660209283029190910190910152610588610566670de0b6b3a764000088610abc565b8a838151811061057257fe5b6020026020010151610ad290919063ffffffff16565b83828151811061059457fe5b6020026020010181815250506105c68382815181106105af57fe5b602002602001015183610b0a90919063ffffffff16565b9150600101610510565b5086836001855103815181106105e257fe5b6001600160a01b039092166020928302919091019091015261060c670de0b6b3a764000082610abc565b8260018451038151811061061c57fe5b60200260200101818152505050985098509895505050505050565b6060806106526001600160a01b0385163014156101626108c5565b61065b876108d7565b610666898986610b1c565b6000600187510367ffffffffffffffff8111801561068357600080fd5b506040519080825280602002602001820160405280156106ad578160200160208202803683370190505b509250600186510367ffffffffffffffff811180156106cb57600080fd5b506040519080825280602002602001820160405280156106f5578160200160208202803683370190505b50915060005b825181101561085057856001600160a01b031688828151811061071a57fe5b60200260200101516001600160a01b031614156107c5578760018951038151811061074157fe5b602002602001015184828151811061075557fe5b6001600160a01b03909216602092830291909101909101526107a8610782670de0b6b3a764000087610abc565b8860018a51038151811061079257fe5b6020026020010151610c1690919063ffffffff16565b8382815181106107b457fe5b602002602001018181525050610837565b8781815181106107d157fe5b60200260200101518482815181106107e557fe5b6001600160a01b039092166020928302919091019091015261081e610812670de0b6b3a764000087610abc565b88838151811061079257fe5b83828151811061082a57fe5b6020026020010181815250505b6108468382815181106105af57fe5b91506001016106fb565b50670de0b6b3a764000081146108b85761089b610875670de0b6b3a764000083610abc565b8360018551038151811061088557fe5b6020026020010151610b0a90919063ffffffff16565b826001845103815181106108ab57fe5b6020026020010181815250505b5097509795505050505050565b816108d3576108d381610c60565b5050565b6000806108e383610c73565b915091508042101561090a5761090a8242106109015761015c610905565b61015d5b610c60565b505050565b60408051600180825281830190925260609160208083019080368337019050509050828160008151811061093f57fe5b6001600160a01b039290921660209283029190910190910152604080516001808252818301909252606091816020016020820280368337019050509050828160008151811061098a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050856001600160a01b03166366a9c7d28684846040518463ffffffff1660e01b8152600401808481526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610a155781810151838201526020016109fd565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610a54578181015183820152602001610a3c565b5050505090500195505050505050600060405180830381600087803b158015610a7c57600080fd5b505af1158015610a90573d6000803e3d6000fd5b50505050505050505050565b6000610aa88184610c97565b9050610ab5818384610d1a565b9392505050565b6000610acc8383111560016108c5565b50900390565b6000828202610af6841580610aef575083858381610aec57fe5b04145b60036108c5565b670de0b6b3a7640000815b04949350505050565b6000828201610ab584821015836108c5565b604080516001808252818301909252606091602080830190803683370190505090508181600081518110610b4c57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050836001600160a01b0316637d3aeb9684836040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610bd2578181015183820152602001610bba565b505050509050019350505050600060405180830381600087803b158015610bf857600080fd5b505af1158015610c0c573d6000803e3d6000fd5b5050505050505050565b6000610c2582151560046108c5565b670de0b6b3a76400008302610c57841580610c505750670de0b6b3a7640000858381610c4d57fe5b04145b60056108c5565b828181610b0157fe5b610c70816210905360ea1b610d3f565b50565b600080610c8283826020610da0565b9150610c9083602080610da0565b9050915091565b6000610ab5610d0f836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610cd857600080fd5b505afa158015610cec573d6000803e3d6000fd5b505050506040513d6020811015610d0257600080fd5b505160129060ff16610abc565b849060806005610daf565b6000610d3782604080610d2f88888784610daf565b929190610daf565b949350505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6001901b6000190191901c1690565b6000610dbc848484610dd2565b506001901b60001901811b1992909216911b1790565b610de1610100831060646108c5565b610e0a60018210158015610e035750610dff60ff8461010003610e19565b8211155b60646108c5565b61090a83821c156101b46108c5565b8082039082110290039056fea2646970667358221220f5cef853437e49f1855436de34b0c7f01ec380b55585a84d3258eabba8ff40cd64736f6c63430007010033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100405760003560e01c80631face20a14610045578063a20d2e4d1461024a575b600080fd5b81801561005157600080fd5b506101aa600480360361010081101561006957600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b81111561009f57600080fd5b8201836020820111156100b157600080fd5b803590602001918460208302840111600160201b831117156100d257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561012157600080fd5b82018360208201111561013357600080fd5b803590602001918460208302840111600160201b8311171561015457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550506001600160a01b038335811694506020840135169260400135915061043d9050565b604051808481526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156101f45781810151838201526020016101dc565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561023357818101518382015260200161021b565b505050509050019550505050505060405180910390f35b81801561025657600080fd5b506103a4600480360360e081101561026d57600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b8111156102a357600080fd5b8201836020820111156102b557600080fd5b803590602001918460208302840111600160201b831117156102d657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561032557600080fd5b82018360208201111561033757600080fd5b803590602001918460208302840111600160201b8311171561035857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550506001600160a01b038335169350505060200135610637565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156103e85781810151838201526020016103d0565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561042757818101518382015260200161040f565b5050505090500194505050505060405180910390f35b600060608061045a6001600160a01b0387163014156101626108c5565b610463896108d7565b61046f8b8b888861090f565b6104798685610a9c565b92506000885160010167ffffffffffffffff8111801561049857600080fd5b506040519080825280602002602001820160405280156104c2578160200160208202803683370190505b509250875160010167ffffffffffffffff811180156104e057600080fd5b5060405190808252806020026020018201604052801561050a578160200160208202803683370190505b50915060005b88518110156105d05789818151811061052557fe5b602002602001015184828151811061053957fe5b6001600160a01b0390921660209283029190910190910152610588610566670de0b6b3a764000088610abc565b8a838151811061057257fe5b6020026020010151610ad290919063ffffffff16565b83828151811061059457fe5b6020026020010181815250506105c68382815181106105af57fe5b602002602001015183610b0a90919063ffffffff16565b9150600101610510565b5086836001855103815181106105e257fe5b6001600160a01b039092166020928302919091019091015261060c670de0b6b3a764000082610abc565b8260018451038151811061061c57fe5b60200260200101818152505050985098509895505050505050565b6060806106526001600160a01b0385163014156101626108c5565b61065b876108d7565b610666898986610b1c565b6000600187510367ffffffffffffffff8111801561068357600080fd5b506040519080825280602002602001820160405280156106ad578160200160208202803683370190505b509250600186510367ffffffffffffffff811180156106cb57600080fd5b506040519080825280602002602001820160405280156106f5578160200160208202803683370190505b50915060005b825181101561085057856001600160a01b031688828151811061071a57fe5b60200260200101516001600160a01b031614156107c5578760018951038151811061074157fe5b602002602001015184828151811061075557fe5b6001600160a01b03909216602092830291909101909101526107a8610782670de0b6b3a764000087610abc565b8860018a51038151811061079257fe5b6020026020010151610c1690919063ffffffff16565b8382815181106107b457fe5b602002602001018181525050610837565b8781815181106107d157fe5b60200260200101518482815181106107e557fe5b6001600160a01b039092166020928302919091019091015261081e610812670de0b6b3a764000087610abc565b88838151811061079257fe5b83828151811061082a57fe5b6020026020010181815250505b6108468382815181106105af57fe5b91506001016106fb565b50670de0b6b3a764000081146108b85761089b610875670de0b6b3a764000083610abc565b8360018551038151811061088557fe5b6020026020010151610b0a90919063ffffffff16565b826001845103815181106108ab57fe5b6020026020010181815250505b5097509795505050505050565b816108d3576108d381610c60565b5050565b6000806108e383610c73565b915091508042101561090a5761090a8242106109015761015c610905565b61015d5b610c60565b505050565b60408051600180825281830190925260609160208083019080368337019050509050828160008151811061093f57fe5b6001600160a01b039290921660209283029190910190910152604080516001808252818301909252606091816020016020820280368337019050509050828160008151811061098a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050856001600160a01b03166366a9c7d28684846040518463ffffffff1660e01b8152600401808481526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610a155781810151838201526020016109fd565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610a54578181015183820152602001610a3c565b5050505090500195505050505050600060405180830381600087803b158015610a7c57600080fd5b505af1158015610a90573d6000803e3d6000fd5b50505050505050505050565b6000610aa88184610c97565b9050610ab5818384610d1a565b9392505050565b6000610acc8383111560016108c5565b50900390565b6000828202610af6841580610aef575083858381610aec57fe5b04145b60036108c5565b670de0b6b3a7640000815b04949350505050565b6000828201610ab584821015836108c5565b604080516001808252818301909252606091602080830190803683370190505090508181600081518110610b4c57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050836001600160a01b0316637d3aeb9684836040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610bd2578181015183820152602001610bba565b505050509050019350505050600060405180830381600087803b158015610bf857600080fd5b505af1158015610c0c573d6000803e3d6000fd5b5050505050505050565b6000610c2582151560046108c5565b670de0b6b3a76400008302610c57841580610c505750670de0b6b3a7640000858381610c4d57fe5b04145b60056108c5565b828181610b0157fe5b610c70816210905360ea1b610d3f565b50565b600080610c8283826020610da0565b9150610c9083602080610da0565b9050915091565b6000610ab5610d0f836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610cd857600080fd5b505afa158015610cec573d6000803e3d6000fd5b505050506040513d6020811015610d0257600080fd5b505160129060ff16610abc565b849060806005610daf565b6000610d3782604080610d2f88888784610daf565b929190610daf565b949350505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6001901b6000190191901c1690565b6000610dbc848484610dd2565b506001901b60001901811b1992909216911b1790565b610de1610100831060646108c5565b610e0a60018210158015610e035750610dff60ff8461010003610e19565b8211155b60646108c5565b61090a83821c156101b46108c5565b8082039082110290039056fea2646970667358221220f5cef853437e49f1855436de34b0c7f01ec380b55585a84d3258eabba8ff40cd64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/artifact/ManagedPoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/artifact/ManagedPoolFactory.json new file mode 100644 index 0000000..5c66103 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/artifact/ManagedPoolFactory.json @@ -0,0 +1,310 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ManagedPoolFactory", + "sourceName": "contracts/managed/ManagedPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "normalizedWeights", + "type": "uint256[]" + }, + { + "internalType": "address[]", + "name": "assetManagers", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "swapEnabledOnStart", + "type": "bool" + }, + { + "internalType": "bool", + "name": "mustAllowlistLPs", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "managementAumFeePercentage", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "aumFeeId", + "type": "uint256" + } + ], + "internalType": "struct ManagedPoolSettings.NewPoolParams", + "name": "poolParams", + "type": "tuple" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeePercentagesProvider", + "outputs": [ + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWeightedMath", + "outputs": [ + { + "internalType": "contract IExternalWeightedMath", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101a06040523480156200001257600080fd5b506040516200b8ad3803806200b8ad833981016040819052620000359162000248565b81816040518060200162000049906200022c565b601f1982820381018352601f90910116604052805183903090839060006002820460a081905280830360e08190528185529091508362000095816200014d602090811b6200048717901c565b60601b6001600160601b0319166080528285018051838252620000c4826200014d602090811b6200048717901c565b6001600160601b0319606091821b811660c05296909352905261010095909552505092821b831661012052509290921b909116610140525050426276a700016101605260405162000115906200023a565b604051809103906000f08015801562000132573d6000803e3d6000fd5b5060601b6001600160601b03191661018052506200029c9050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506200019b6001600160a01b03831615156101ac620001a1565b50919050565b81620001b257620001b281620001b6565b5050565b620001c8816210905360ea1b620001cb565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b61775e80620011bd83390190565b612f92806200891b83390190565b600080604083850312156200025b578182fd5b8251620002688162000286565b60208401519092506200027b8162000286565b809150509250929050565b6001600160a01b0381168114620001c857600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405160601c610160516101805160601c610e9662000327600039806102d1528061032a5250806101ff52806102285250806103755250806103eb52508061039b5250806104e15250806101d6528061055d5250806105025250806101b552806105395250610e966000f3fe608060405234801561001057600080fd5b50600436106100b35760003560e01c80636634b753116100715780636634b753146101345780636c57f5a914610154578063739238d61461015c578063851c1bb3146101645780638d928af814610184578063aaabadc51461018c576100b3565b8062c194db146100b8578063174481fa146100d65780632da47c40146100ec5780632f2770db1461010257806344da655f1461010c578063508f0eae1461012c575b600080fd5b6100c0610194565b6040516100cd9190610ca3565b60405180910390f35b6100de6101b3565b6040516100cd929190610c56565b6100f46101f9565b6040516100cd929190610de8565b61010a610263565b005b61011f61011a366004610a07565b6102aa565b6040516100cd9190610c42565b61011f610328565b61014761014236600461098b565b61034c565b6040516100cd9190610c70565b61014761036a565b61011f610373565b6101776101723660046109c3565b610397565b6040516100cd9190610c7b565b61011f6103e9565b61011f61040d565b60606101ae604051806020016040528060008152506104d9565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561025557807f000000000000000000000000000000000000000000000000000000000000000003925062278d00915061025e565b60009250600091505b509091565b61026b6105b2565b6102736105e3565b6001805460ff1916811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60008060006102b76101f9565b9150915061031d856102c76103e9565b6102cf610373565b7f00000000000000000000000000000000000000000000000000000000000000008887876040516020016103099796959493929190610cb6565b6040516020818303038152906040526105f8565b925050505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526020819052604090205460ff1690565b60015460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016103cc929190610c2a565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006104176103e9565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561044f57600080fd5b505afa158015610463573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101ae91906109eb565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506104d36001600160a01b03831615156101ac610661565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016105a4818386610673565b505050505050505050919050565b60006105c96000356001600160e01b031916610397565b90506105e06105d882336106b1565b610191610661565b50565b6105f66105ee61036a565b1560d3610661565b565b60006106026105e3565b600061060d83610741565b6001600160a01b038116600081815260208190526040808220805460ff191660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b8161066f5761066f81610775565b5050565b5b60208110610693578151835260209283019290910190601f1901610674565b905182516020929092036101000a6000190180199091169116179052565b60006106bb61040d565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016106ea93929190610c84565b60206040518083038186803b15801561070257600080fd5b505afa158015610716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073a91906109a7565b9392505050565b6000606061074e836104d9565b905060008151602083016000f090506001600160a01b03811661073a573d6000803e3d6000fd5b62461bcd60e51b600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526105e0916210905360ea1b906242414c90606490fd5b803561032281610e3d565b600082601f8301126107eb578081fd5b81356107fe6107f982610e1d565b610df6565b81815291506020808301908481018184028601820187101561081f57600080fd5b60005b8481101561084757813561083581610e3d565b84529282019290820190600101610822565b505050505092915050565b600082601f830112610862578081fd5b81356108706107f982610e1d565b81815291506020808301908481018184028601820187101561089157600080fd5b60005b848110156108475781356108a781610e3d565b84529282019290820190600101610894565b600082601f8301126108c9578081fd5b81356108d76107f982610e1d565b8181529150602080830190848101818402860182018710156108f857600080fd5b60005b84811015610847578135845292820192908201906001016108fb565b803561032281610e52565b600082601f830112610932578081fd5b813567ffffffffffffffff811115610948578182fd5b61095b601f8201601f1916602001610df6565b915080825283602082850101111561097257600080fd5b8060208401602084013760009082016020015292915050565b60006020828403121561099c578081fd5b813561073a81610e3d565b6000602082840312156109b8578081fd5b815161073a81610e52565b6000602082840312156109d4578081fd5b81356001600160e01b03198116811461073a578182fd5b6000602082840312156109fc578081fd5b815161073a81610e3d565b60008060408385031215610a19578081fd5b823567ffffffffffffffff80821115610a30578283fd5b8185019150610140808388031215610a46578384fd5b610a4f81610df6565b9050823582811115610a5f578485fd5b610a6b88828601610922565b825250602083013582811115610a7f578485fd5b610a8b88828601610922565b602083015250604083013582811115610aa2578485fd5b610aae88828601610852565b604083015250606083013582811115610ac5578485fd5b610ad1888286016108b9565b606083015250608083013582811115610ae8578485fd5b610af4888286016107db565b60808301525060a083013560a0820152610b118760c08501610917565b60c0820152610b238760e08501610917565b60e082015261010083810135908201526101209283013592810192909252509150610b5184602085016107d0565b90509250929050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015610b9f5781516001600160a01b031687529582019590820190600101610b7a565b509495945050505050565b6000815180845260208085019450808401835b83811015610b9f57815187529582019590820190600101610bbd565b15159052565b60008151808452815b81811015610c0457602081850181015186830182015201610be8565b81811115610c155782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b901515815260200190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b60006020825261073a6020830184610bdf565b600060e0825288516101408060e0850152610cd5610220850183610bdf565b915060208b015160df19610100818786030181880152610cf58584610bdf565b945060408e01519250610120828887030181890152610d148685610b67565b955060608f01519350828887030185890152610d308685610baa565b955060808f015194508288870301610160890152610d4e8686610b67565b955060a08f015161018089015260c08f01519450610d706101a0890186610bd9565b60e08f01519450610d856101c0890186610bd9565b908e01516101e08801528d015161020087015250919250610dac9150506020830189610b5a565b610db96040830188610b5a565b610dc66060830187610b5a565b610dd36080830186610b5a565b60a082019390935260c0015295945050505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610e1557600080fd5b604052919050565b600067ffffffffffffffff821115610e33578081fd5b5060209081020190565b6001600160a01b03811681146105e057600080fd5b80151581146105e057600080fdfea2646970667358221220817481454a3462d9ac07f7e0bcdb05ce950192e04218fb8a3e403c9dadfb1be064736f6c634300070100336102206040523480156200001257600080fd5b506040516200775e3803806200775e833981016040819052620000359162001385565b86858060405180606001604052806000815260200160028152602001846101200151815250896200007d8b60018e604001518f60800151620003fe60201b620018e61760201c565b8c600001518d6020015189898c828286868a85336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000d3929190620010ae565b508051620000e9906004906020840190620010ae565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b1661012052506200016790506276a700831115610194620005cc565b6200017b62278d00821115610195620005cc565b4290910161014081905201610160526101808690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001d157600080fd5b505afa158015620001e6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020c919062001366565b606090811b6001600160601b03199081166101a052908a901b166101c05250505050604084015160009350620002559250905060106008620005e1602090811b62001a9917901c565b62000276836020015160086000016008620005e160201b62001a991760201c565b62000294846000015160006008620005e160201b62001a991760201c565b17176101e08190529050620002aa8382620005f6565b505050604082015151620002c4600282101560c8620005cc565b620002d5603282111560c9620005cc565b620002f7818460600151518560800151516200087c60201b62001aac1760201c565b61010083015162000308906200089c565b60005b8181101562000383576000846040015182815181106200032757fe5b602002602001015190506200036081866060015184815181106200034757fe5b60200260200101516200090e60201b62001ac91760201c565b6001600160a01b039091166000908152600b60205260409020556001016200030b565b50620003a542428560600151866060015187604001516200093260201b60201c565b60a0830151620003ba90429081908062000a8f565b60c0830151620003ca9062000b0a565b60e0830151620003da9062000b58565b505050505060609190911b6001600160601b03191661020052506200170e92505050565b6000620004168362000ba660201b62001ae21760201c565b606083516001016001600160401b03811180156200043357600080fd5b506040519080825280602002602001820160405280156200045e578160200160208202803683370190505b50905030816000815181106200047057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b8451811015620004e357848181518110620004aa57fe5b6020026020010151828260010181518110620004c257fe5b6001600160a01b039092166020928302919091019091015260010162000493565b50606083516001016001600160401b03811180156200050157600080fd5b506040519080825280602002602001820160405280156200052c578160200160208202803683370190505b5090506000816000815181106200053f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b8451811015620005b2578481815181106200057957fe5b60200260200101518282600101815181106200059157fe5b6001600160a01b039092166020928302919091019091015260010162000562565b50620005c18787848462000bb2565b979650505050505050565b81620005dd57620005dd8162000cac565b5050565b6000620005f084848462000cc1565b50501b90565b6000826001600160a01b0316631a7c326362000625600060088662000d1c60201b62001af0179092919060201c565b6040518263ffffffff1660e01b8152600401620006439190620015a9565b60206040518083038186803b1580156200065c57600080fd5b505afa15801562000671573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200069791906200134d565b905060006001600160a01b038416631a7c3263620006c48560088062000d1c602090811b62001af017901c565b6040518263ffffffff1660e01b8152600401620006e29190620015a9565b60206040518083038186803b158015620006fb57600080fd5b505afa15801562000710573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200073691906200134d565b905060006001600160a01b038516631a7c326362000764866010600862000d1c602090811b62001af017901c565b6040518263ffffffff1660e01b8152600401620007829190620015a9565b60206040518083038186803b1580156200079b57600080fd5b505afa158015620007b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007d691906200134d565b90506000620007f982604080600001016040620005e160201b62001a991760201c565b620008168460406000016040620005e160201b62001a991760201c565b620008308660006040620005e160201b62001a991760201c565b17179050806008819055507fc3f0acc358200d8e08ac6ce20bc2f9f27893a344f813bf682b7859b3e521502e816040516200086c9190620015a9565b60405180910390a1505050505050565b6200089782841480156200088f57508183145b6067620005cc565b505050565b620008b5670d2f13f7789f0000821115610160620005cc565b620008ce600a548262000d2b60201b62001aff1760201c565b600a556040517f556cdf4052d939f8acbe593d83668d2e18500b032bcf51cbbf82b181c6094dd79062000903908390620015a9565b60405180910390a150565b60006200091c818462000d53565b90506200092b81838062000e03565b9392505050565b6000805b835181101562000a215760008482815181106200094f57fe5b6020026020010151905062000977662386f26fc1000082101561012e620005cc60201b60201c565b62000991818462000e4560201b62001b0e1790919060201c565b92506000848381518110620009a257fe5b60200260200101519050620009fd600b6000836001600160a01b03166001600160a01b0316815260200190815260200160002054888581518110620009e357fe5b60200260200101518462000e0360201b62001b201760201c565b6001600160a01b039091166000908152600b60205260409020555060010162000936565b5062000a3a670de0b6b3a76400008214610134620005cc565b62000a54600954878762000e5960201b62001b3d1760201c565b6009556040517f0f3631f9dab08169d1db21c6dc5f32536fb2b0a6b9bb5330d71c52132f968be0906200086c90889088908890889062001655565b62000a9a8262000e8d565b62000aa58162000e8d565b62000ac16009548585858562000eba60201b62001b5b1760201c565b6009556040517fc42eae0298d32208994ed5d58e525fa31c2911e95451d98f8df3355259c4a13d9062000afc9086908690869086906200168a565b60405180910390a150505050565b62000b236009548262000f3660201b62001b9b1760201c565b6009556040517f5a9e84f78f7957cb4ed7478eb0fcad35ee4ecbe2e0f298420b28a3955392573f90620009039083906200159e565b62000b716009548262000f5260201b62001ba91760201c565b6009556040517f5353e2cb47d505ba9b628610daec53fc41f3a4259dab35a757b0f1d5a58bc1c390620009039083906200159e565b80620005dd8162000f6e565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040162000be3919062001640565b602060405180830381600087803b15801562000bfe57600080fd5b505af115801562000c13573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c3991906200134d565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000c6e90849088908890600401620015b2565b600060405180830381600087803b15801562000c8957600080fd5b505af115801562000c9e573d6000803e3d6000fd5b509298975050505050505050565b62000cbe816210905360ea1b62000ff5565b50565b62000cd261010083106064620005cc565b62000d0b6001821015801562000d03575062000cff60ff84610100036200105660201b62001bb71760201c565b8211155b6064620005cc565b6200089783821c156101b4620005cc565b6001901b6000190191901c1690565b60006200092b826000603c866200106260201b62001bc317909392919060201c565b92915050565b60006200092b62000deb836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801562000d9757600080fd5b505afa15801562000dac573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000dd291906200153f565b60ff1660126200108760201b62001be61790919060201c565b84906080600562001062602090811b62001bc317901c565b600062000e3d8260408062000e278888878462001062602090811b62001bc317901c565b6200106260201b62001bc317909392919060201c565b949350505050565b60008282016200092b8482101583620005cc565b600062000e73848483602062001bc362001062821b17811c565b935062000e3d848360208062001bc362001062821b17811c565b62000ea264e8d4a5100082101560cb620005cc565b62000cbe670d2f13f7789f000082111560ca620005cc565b600062000ed586866040602062001bc362001062821b17811c565b955062000ef086856060602062001bc362001062821b17811c565b955062000f0e86846080603e62001062602090811b62001bc317901c565b955062000f2c868360be603e62001062602090811b62001bc317901c565b9695505050505050565b60006200092b838360fc6200109f602090811b62001bfc17901c565b60006200092b838360fd6200109f602090811b62001bfc17901c565b60028151101562000f7f5762000cbe565b60008160008151811062000f8f57fe5b602002602001015190506000600190505b82518110156200089757600083828151811062000fb957fe5b6020026020010151905062000fea816001600160a01b0316846001600160a01b0316106065620005cc60201b60201c565b915060010162000fa0565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b80820390821102900390565b60006200107184848462000cc1565b506001901b60001901811b1992909216911b1790565b600062001099838311156001620005cc565b50900390565b6001811b1992909216911b1790565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620010f157805160ff191683800117855562001121565b8280016001018555821562001121579182015b828111156200112157825182559160200191906001019062001104565b506200112f92915062001133565b5090565b5b808211156200112f576000815560010162001134565b805162000d4d81620016f8565b600082601f83011262001168578081fd5b81516200117f6200117982620016cc565b620016a5565b818152915060208083019084810181840286018201871015620011a157600080fd5b60005b84811015620011cd578151620011ba81620016f8565b84529282019290820190600101620011a4565b505050505092915050565b600082601f830112620011e9578081fd5b8151620011fa6200117982620016cc565b8181529150602080830190848101818402860182018710156200121c57600080fd5b60005b84811015620011cd5781516200123581620016f8565b845292820192908201906001016200121f565b600082601f83011262001259578081fd5b81516200126a6200117982620016cc565b8181529150602080830190848101818402860182018710156200128c57600080fd5b60005b84811015620011cd578151845292820192908201906001016200128f565b8051801515811462000d4d57600080fd5b600082601f830112620012cf578081fd5b81516001600160401b03811115620012e5578182fd5b6020620012fb601f8301601f19168201620016a5565b925081835284818386010111156200131257600080fd5b60005b828110156200133257848101820151848201830152810162001315565b82811115620013445760008284860101525b50505092915050565b6000602082840312156200135f578081fd5b5051919050565b60006020828403121562001378578081fd5b81516200092b81620016f8565b600080600080600080600060e0888a031215620013a0578283fd5b87516001600160401b0380821115620013b7578485fd5b818a01915061014080838d031215620013ce578586fd5b620013d981620016a5565b9050825182811115620013ea578687fd5b620013f88d828601620012be565b8252506020830151828111156200140d578687fd5b6200141b8d828601620012be565b60208301525060408301518281111562001433578687fd5b620014418d828601620011d8565b60408301525060608301518281111562001459578687fd5b620014678d82860162001248565b6060830152506080830151828111156200147f578687fd5b6200148d8d82860162001157565b60808301525060a083015160a0820152620014ac8c60c08501620012ad565b60c0820152620014c08c60e08501620012ad565b60e082015261010083810151908201526101209283015192810192909252509650620014f08960208a016200114a565b9550620015018960408a016200114a565b9450620015128960608a016200114a565b9350620015238960808a016200114a565b925060a0880151915060c0880151905092959891949750929550565b60006020828403121562001551578081fd5b815160ff811681146200092b578182fd5b6000815180845260208085019450808401835b83811015620015935781518752958201959082019060010162001575565b509495945050505050565b901515815260200190565b90815260200190565b60006060820185835260206060818501528186518084526080860191508288019350845b81811015620015fe57620015eb8551620016ec565b83529383019391830191600101620015d6565b505084810360408601528551808252908201925081860190845b8181101562000c9e576200162d8351620016ec565b8552938301939183019160010162001618565b60208101600383106200164f57fe5b91905290565b60008582528460208301526080604083015262001676608083018562001562565b8281036060840152620005c1818562001562565b93845260208401929092526040830152606082015260800190565b6040518181016001600160401b0381118282101715620016c457600080fd5b604052919050565b60006001600160401b03821115620016e2578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b038116811462000cbe57600080fd5b60805160a05160c05160e0516101005160601c6101205160601c6101405161016051610180516101a05160601c6101c05160601c6101e0516102005160601c615fac620017b2600039806145ca5250806108ca5280610cee5250806108a95250806115f2525080610bc3525080611f1b525080611ef752508061127f52508061124e5250806111da5250806130c45250806131065250806130e55250615fac6000f3fe608060405234801561001057600080fd5b50600436106103995760003560e01c80637beed220116101e9578063a457c2d71161010f578063d505accf116100ad578063ebf1b7421161007c578063ebf1b74214610747578063ed24911d1461076c578063f885a4bb14610774578063f89f27ed1461078757610399565b8063d505accf146106fb578063d5c096c41461070e578063dd62ed3e14610721578063e01af92c1461073457610399565b8063b35056b8116100e9578063b35056b8146106d0578063b62c1f06146106d8578063b7b814fc146106eb578063d2946c2b146106f357610399565b8063a457c2d7146106a2578063a9059cbb146106b5578063aaabadc5146106c857610399565b806387ec68171161018757806390193b7c1161015657806390193b7c1461066157806395d89b411461067457806397bb15c91461067c5780639d2c110c1461068f57610399565b806387ec681714610629578063893d20e81461063c5780638d027466146106515780638d928af81461065957610399565b8063819c70f3116101c3578063819c70f3146105f35780638456cb5914610606578063851c1bb31461060e578063876f303b1461062157610399565b80637beed220146105b55780637ecebe00146105cd57806381788e2b146105e057610399565b806339509351116102ce5780636028bfd41161026c57806370a082311161023b57806370a082311461056657806373656f891461057957806374f3b009146105815780637b749c45146105a257610399565b80636028bfd4146105045780636a2efb2c146105255780636b47273b1461053d578063704640161461055357610399565b806347bc4d92116102a857806347bc4d92146104d95780634df77ce0146104e157806354a844ba146104f457806355c67628146104fc57610399565b806339509351146104ab5780633c9d93b8146104be5780633f4ba83a146104d157610399565b806323b872dd1161033b57806334a36df81161031557806334a36df8146104755780633644e5151461048857806336eb097b1461049057806338fff2d0146104a357610399565b806323b872dd1461043a5780632a9a03231461044d578063313ce5671461046057610399565b80630da0669c116103775780630da0669c146103fc57806318160ddd146104065780631c0de0511461040e5780631dd746ea1461042557610399565b806301ec954a1461039e57806306fdde03146103c7578063095ea7b3146103dc575b600080fd5b6103b16103ac36600461578f565b61078f565b6040516103be9190615bd4565b60405180910390f35b6103cf6107ef565b6040516103be9190615de6565b6103ef6103ea366004615344565b610885565b6040516103be9190615bb1565b61040461089c565b005b6103b16108f0565b6104166108f6565b6040516103be93929190615bbc565b61042d61091f565b6040516103be9190615aa3565b6103ef610448366004615294565b61093c565b6103b161045b36600461584a565b6109b2565b6104686109f1565b6040516103be9190615ee5565b610404610483366004615674565b6109fa565b6103b1610b90565b6103ef61049e366004615240565b610b9f565b6103b1610bc1565b6103ef6104b9366004615344565b610be5565b6104046104cc366004615240565b610c20565b610404610c8d565b6103ef610c9f565b6103b16104ef36600461584a565b610cac565b610404610d15565b6103b1610d69565b610517610512366004615525565b610d76565b6040516103be929190615df9565b61052d610d94565b6040516103be9493929190615e7f565b610545610db3565b6040516103be929190615e12565b6103b161056136600461584a565b610de0565b6103b1610574366004615240565b610e42565b6103b1610e5d565b61059461058f366004615525565b610e8a565b6040516103be929190615ab6565b6104046105b03660046154d5565b610f4b565b6105bd610f67565b6040516103be9493929190615e20565b6103b16105db366004615240565b61109d565b6104046105ee366004615240565b6110a8565b610404610601366004615890565b611119565b6104046111c4565b6103b161061c366004615630565b6111d6565b6103b1611228565b610517610637366004615525565b61123a565b61064461124c565b6040516103be9190615a8f565b6103ef611270565b61064461127d565b6103b161066f366004615240565b6112a1565b6103cf6112bc565b61040461068a3660046156d2565b61131d565b6103b161069d3660046157ff565b6114e0565b6103ef6106b0366004615344565b611519565b6103ef6106c3366004615344565b611557565b610644611564565b6103ef61156e565b6104046106e6366004615915565b61157b565b6104046115a6565b6106446115f0565b6104046107093660046152d4565b611614565b61059461071c366004615525565b61169f565b6103b161072f36600461525c565b611735565b6104046107423660046154d5565b611772565b61075a610755366004615240565b61178b565b6040516103be96959493929190615ebd565b6103b161182f565b6104046107823660046153c5565b611839565b61042d6118cf565b600084608001516107bc6107a161127d565b6001600160a01b0316336001600160a01b03161460cd611c0b565b6107d16107c7610bc1565b82146101f4611c0b565b6107d9611c19565b6107e586868686611c2c565b9695505050505050565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561087b5780601f106108505761010080835404028352916020019161087b565b820191906000526020600020905b81548152906001019060200180831161085e57829003601f168201915b5050505050905090565b6000610892338484611c39565b5060015b92915050565b6108a4611ca1565b6108ee7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611cc4565b565b60025490565b6000806000610903611ed8565b15925061090e611ef5565b9150610918611f19565b9050909192565b60608061092a611f3d565b50905061093681611fea565b91505090565b6000806109498533611735565b905061096d336001600160a01b03871614806109655750838210155b61019e611c0b565b6109788585856120a4565b336001600160a01b0386161480159061099357506000198114155b156109a5576109a58533858403611c39565b60019150505b9392505050565b60006109bc612184565b6109c4611c19565b60006109ce6121b2565b905080156109e2576109df8161225c565b91505b6109eb83612318565b50919050565b60055460ff1690565b610a02612184565b610a0a611c19565b6000610a146121b2565b9050610a246000821160ce611c0b565b610a2d8161225c565b50506060610a39611f3d565b509050610a4f60328251600101111560c9611c0b565b600060608073__$6d134cfc25e59b25943ff4bfa0c28ca096$__631face20a610a7661127d565b610a7e610bc1565b60095488610a8b8a612379565b8f8f8f6040518963ffffffff1660e01b8152600401610ab1989796959493929190615d17565b60006040518083038186803b158015610ac957600080fd5b505af4158015610add573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b0591908101906155c7565b6001600160a01b038c166000908152600b6020526040902083905591945092509050610b344280838086612444565b8515610b4457610b448587612566565b886001600160a01b03167ff4c563a3ea86ff1f4275e8c207df0375a51963f2b831b7bf4da8be938d92876c88604051610b7d9190615bd4565b60405180910390a2505050505050505050565b6000610b9a61182f565b905090565b6001600160a01b0381166000908152600d602052604090205460ff165b919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610892918590610c1b9086611b0e565b611c39565b610c28612184565b610c30611c19565b610c44610c3c82610b9f565b6101b1611c0b565b6001600160a01b0381166000818152600d6020526040808220805460ff19169055517f89aa0423af0b4cf311bfb79f61549f2b82b335f041e4f7ae674618059b51a4cb9190a250565b610c95612184565b6108ee6000612570565b6000610b9a6009546125e3565b60008082610cbc57506000610ce9565b6002831415610ccd57506008610ce9565b6003831415610cde57506010610ce9565b610ce96101bb6125f0565b6109ab7f0000000000000000000000000000000000000000000000000000000000000000826008611af0565b610d1d612184565b610d25612600565b610d2f6001612614565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610d5f9190615bb1565b60405180910390a1565b6000610b9a600954612630565b60006060610d88888785612655612718565b97509795505050505050565b600080600080610da5600954612812565b935093509350935090919293565b600080610dc1600a5461285a565b6009549193509150610dd29061287f565b15610ddc57600091505b9091565b6000610dea61156e565b15610df757506000610bbc565b600082610e0657506000610e33565b6002831415610e1757506040610e33565b6003831415610e2857506080610e33565b610e336101bb6125f0565b6008546109ab90826040611af0565b6001600160a01b031660009081526020819052604090205490565b6000610e67611c19565b6000610e716121b2565b9050610e816000821160ce611c0b565b6109368161225c565b60608088610e996107a161127d565b610ea46107c7610bc1565b6000610eaf8561288c565b15610ed757610ebc6128bb565b610ece88610ec86108f0565b876128ce565b94509050610eef565b610edf611c19565b610eea8a8987612655565b945090505b610ef98a8261290e565b83516001600160401b0381118015610f1057600080fd5b50604051908082528060200260200182016040528015610f3a578160200160208202803683370190505b509250505097509795505050505050565b610f53612184565b610f5b611c19565b610f6481612918565b50565b600080606080610f78600954612957565b90945092506060610f87611f3d565b50905080516001600160401b0381118015610fa157600080fd5b50604051908082528060200260200182016040528015610fcb578160200160208202803683370190505b50925080516001600160401b0381118015610fe557600080fd5b5060405190808252806020026020018201604052801561100f578160200160208202803683370190505b50915060005b81518110156110955761105f600b600084848151811061103157fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054612974565b85838151811061106b57fe5b6020026020010185848151811061107e57fe5b602090810291909101019190915252600101611015565b505090919293565b6000610896826112a1565b6110b0612184565b6110b8611c19565b6110cd6110c482610b9f565b156101b0611c0b565b6001600160a01b0381166000818152600d6020526040808220805460ff19166001179055517fbf5840c727acdcaceea5154edc82998fa82a490aa3dc7aeb66849c8bbea1f5799190a250565b611121612184565b611129611c19565b6060611133611f3d565b509050611144835182518451611aac565b60005b815181101561119e5761119684828151811061115f57fe5b60200260200101516001600160a01b031683838151811061117c57fe5b60200260200101516001600160a01b031614610208611c0b565b600101611147565b506111bd6111ac8686612991565b856111b686612379565b8587612444565b5050505050565b6111cc612184565b6108ee6001612570565b60007f00000000000000000000000000000000000000000000000000000000000000008260405160200161120b929190615a4c565b604051602081830303815290604052805190602001209050919050565b6000610b9a6112356121b2565b6129ae565b60006060610d888887856129d9612718565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610b9a600954612a63565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561087b5780601f106108505761010080835404028352916020019161087b565b611325612184565b61132d611c19565b60006113376121b2565b90506113476000821160ce611c0b565b6113508161225c565b5050606061135c611f3d565b50905061137260026001835103101560c8611c0b565b6001600160a01b0384166000908152600b602052604081205461139d90670de0b6b3a7640000612a70565b905060608073__$6d134cfc25e59b25943ff4bfa0c28ca096$__63a20d2e4d6113c461127d565b6113cc610bc1565b600954886113d98a612379565b8d8a6040518863ffffffff1660e01b81526004016113fd9796959493929190615d7a565b60006040518083038186803b15801561141557600080fd5b505af4158015611429573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611451919081019061536f565b6001600160a01b0389166000908152600b6020526040812055909250905061147c4280838086612444565b85156114a3576114996001600160a01b03861615156101bc611c0b565b6114a3858761290e565b6040516001600160a01b038816907f4c910b69fe65a61f7531b9c5042b2329ca7179c77290aa7e2eb3afa3c8511fd390600090a250505050505050565b600083608001516114f26107a161127d565b6114fd6107c7610bc1565b611505611c19565b611510858585612a93565b95945050505050565b6000806115263385611735565b90508083106115405761153b33856000611c39565b61154d565b61154d3385858403611c39565b5060019392505050565b60006108923384846120a4565b6000610b9a612b5f565b6000610b9a60095461287f565b611583612184565b61158b611c19565b6115a06115988585612991565b848484612bd9565b50505050565b6115ae612184565b6115b66128bb565b6115c06000612614565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610d5f9190615bb1565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886116438c6112a1565b8960405160200161165996959493929190615bfc565b60405160208183030381529060405280519060200120905061168a8882611681878787612c41565b886101f8612c80565b611695888888611c39565b5050505050505050565b606080886116ae6107a161127d565b6116b96107c7610bc1565b60006116c3611c19565b6116cb6108f0565b61171c576116d98a86612cd7565b945090506116f26116e8612e4d565b82101560cc611c0b565b61170460006116ff612e4d565b612566565b61171789611710612e4d565b8303612566565b610ef9565b6117278a89876129d9565b94509050610ef98982612566565b600061173f61127d565b6001600160a01b0316826001600160a01b031614156117615750600019610896565b61176b8383612e54565b9050610896565b61177a612184565b611782611c19565b610f6481612e7f565b6001600160a01b0381166000908152600c6020526040812054819081908190819081906117b781612ebe565b9299509097509550935060006117cc89612f0c565b90506117da82826001612f3b565b93506117e882826000612f3b565b925060006117fd6117f88b613075565b613090565b905061180989826130b4565b985061181585826130b4565b945061182184826130b4565b935050505091939550919395565b6000610b9a6130c0565b611841612184565b611849611c19565b611857845183518351611aac565b6118638451845161315d565b60005b84518110156111bd576118c785828151811061187e57fe5b602002602001015185838151811061189257fe5b60200260200101518584815181106118a657fe5b60200260200101518585815181106118ba57fe5b602002602001015161316a565b600101611866565b6060806118da611f3d565b50905061093681612379565b60006118f183611ae2565b606083516001016001600160401b038111801561190d57600080fd5b50604051908082528060200260200182016040528015611937578160200160208202803683370190505b509050308160008151811061194857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156119b75784818151811061198057fe5b602002602001015182826001018151811061199757fe5b6001600160a01b039092166020928302919091019091015260010161196b565b50606083516001016001600160401b03811180156119d457600080fd5b506040519080825280602002602001820160405280156119fe578160200160208202803683370190505b509050600081600081518110611a1057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b8451811015611a7f57848181518110611a4857fe5b6020026020010151828260010181518110611a5f57fe5b6001600160a01b0390921660209283029190910190910152600101611a33565b50611a8c8787848461320b565b925050505b949350505050565b6000611aa68484846132fb565b50501b90565b611ac48284148015611abd57508183145b6067611c0b565b505050565b6000611ad58184613342565b90506109ab818384611b20565b80611aec816133d1565b5050565b6001901b6000190191901c1690565b60006109ab838383603c611bc3565b60008282016109ab8482101583611c0b565b6000611a9182604080611b3588888784611bc3565b929190611bc3565b6000611b4c8484836020611bc3565b9350611a918483602080611bc3565b6000611b6b868660406020611bc3565b9550611b7b868560606020611bc3565b9550611b8b86846080603e611bc3565b95506107e5868360be603e611bc3565b60006109ab838360fc611bfc565b60006109ab838360fd611bfc565b80820390821102900390565b6000611bd08484846132fb565b506001901b60001901811b1992909216911b1790565b6000611bf6838311156001611c0b565b50900390565b6001811b1992909216911b1790565b81611aec57611aec816125f0565b6108ee611c24611ed8565b610192611c0b565b6000611a916103e66125f0565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611c94908590615bd4565b60405180910390a3505050565b611ca9611c19565b6000611cb36121b2565b90508015610f6457611aec8161225c565b60006001600160a01b038316631a7c3263611ce184846008611af0565b6040518263ffffffff1660e01b8152600401611cfd9190615bd4565b60206040518083038186803b158015611d1557600080fd5b505afa158015611d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4d919061550d565b905060006001600160a01b038416631a7c3263611d6c85600880611af0565b6040518263ffffffff1660e01b8152600401611d889190615bd4565b60206040518083038186803b158015611da057600080fd5b505afa158015611db4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd8919061550d565b905060006001600160a01b038516631a7c3263611df88660106008611af0565b6040518263ffffffff1660e01b8152600401611e149190615bd4565b60206040518083038186803b158015611e2c57600080fd5b505afa158015611e40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e64919061550d565b90506000611e758260806040611a99565b611e8184604080611a99565b611e8e8660006040611a99565b17179050806008819055507fc3f0acc358200d8e08ac6ce20bc2f9f27893a344f813bf682b7859b3e521502e81604051611ec89190615bd4565b60405180910390a1505050505050565b6000611ee2611f19565b421180610b9a57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b606080606080611f4b61127d565b6001600160a01b031663f94d4668611f61610bc1565b6040518263ffffffff1660e01b8152600401611f7d9190615bd4565b60006040518083038186803b158015611f9557600080fd5b505afa158015611fa9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611fd1919081019061546c565b5091509150611fe0828261344a565b9350935050509091565b8051606090806001600160401b038111801561200557600080fd5b5060405190808252806020026020018201604052801561202f578160200160208202803683370190505b50915060005b8181101561209d5761207e600b600086848151811061205057fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054613090565b83828151811061208a57fe5b6020908102919091010152600101612035565b5050919050565b6120bb6001600160a01b0384161515610198611c0b565b6120d26001600160a01b0383161515610199611c0b565b6120dd838383611ac4565b6001600160a01b03831660009081526020819052604090205461210390826101a061346a565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546121329082611b0e565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c94908590615bd4565b600061219b6000356001600160e01b0319166111d6565b9050610f646121aa8233613480565b610191611c0b565b60008060006121bf61127d565b6001600160a01b031663b05f8e486121d5610bc1565b306040518363ffffffff1660e01b81526004016121f3929190615ce2565b60806040518083038186803b15801561220b57600080fd5b505afa15801561221f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224391906158d5565b5050915091508082016122546108f0565b039250505090565b6000806000612269610db3565b91509150600061227b85428486613569565b90506122856135ad565b806122965760009350505050610bbc565b60006122ac6122a56003610de0565b83906135be565b905060006122ba8383611be6565b90506122c582613600565b7f0666d5a83bb8143573350414d5a13dbdcac60a706160576416096ad6a41c0ea5816040516122f49190615bd4565b60405180910390a161230d61230761124c565b82612566565b509095945050505050565b61232f670d2f13f7789f0000821115610160611c0b565b61233b600a5482611aff565b600a556040517f556cdf4052d939f8acbe593d83668d2e18500b032bcf51cbbf82b181c6094dd79061236e908390615bd4565b60405180910390a150565b60606000612388600954613611565b8351909150806001600160401b03811180156123a357600080fd5b506040519080825280602002602001820160405280156123cd578160200160208202803683370190505b50925060005b8181101561243c5761241d600b60008784815181106123ee57fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205484612a70565b84828151811061242957fe5b60209081029190910101526001016123d3565b505050919050565b6000805b835181101561250957600084828151811061245f57fe5b6020026020010151905061247f662386f26fc1000082101561012e611c0b565b6124898382611b0e565b9250600084838151811061249957fe5b602002602001015190506124e6600b6000836001600160a01b03166001600160a01b03168152602001908152602001600020548885815181106124d857fe5b602002602001015184611b20565b6001600160a01b039091166000908152600b602052604090205550600101612448565b50612520670de0b6b3a76400008214610134611c0b565b61252d6009548787611b3d565b6009556040517f0f3631f9dab08169d1db21c6dc5f32536fb2b0a6b9bb5330d71c52132f968be090611ec8908890889088908890615e20565b611aec828261362d565b80156125905761258b612581611ef5565b4210610193611c0b565b6125a5565b6125a561259b611f19565b42106101a9611c0b565b6007805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be649061236e908390615bb1565b60006108968260fc6136d1565b610f64816210905360ea1b6136d8565b6108ee61260b61156e565b156101b5611c0b565b61262060095482613739565b60095580610f6457610f646135ad565b600080600080600061264186612812565b93509350935093506107e582828686613747565b60006060600061266c6126666108f0565b86613761565b95509050606061267a611f3d565b509050606061268882611fea565b905061269487826137a2565b600061269f8461225c565b8401905060606126ae84612379565b90506126be8a8a8386868d61380b565b909750955060016126ce896139c5565b60028111156126d957fe5b146126f6576126f66126eb8389611be6565b858b898560006139db565b6127008684613a75565b61270986613ade565b95505050505050935093915050565b3330146127d6576000306001600160a01b031660003660405161273c929190615a64565b6000604051808303816000865af19150503d8060008114612779576040519150601f19603f3d011682016040523d82523d6000602084013e61277e565b606091505b50509050806000811461278d57fe5b60046000803e6000516001600160e01b0319166343adbafb60e01b81146127b8573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b600060606127e98686868663ffffffff16565b8051601f1982018390526343adbafb603f19830152919350915060200260231982016044820181fd5b60008080806128248560406020611af0565b93506128338560606020611af0565b9250612842856080603e611af0565b91506128518560be603e611af0565b90509193509193565b6000806128698382603c611af0565b915061287883603c6020611af0565b9050915091565b60006108968260fe6136d1565b6000808251118015610896575060ff8016828060200190518101906128b19190615946565b60ff161492915050565b6108ee6128c661156e565b6101b6611c0b565b6000606060006128de8587613761565b965090506128eb84613b69565b92506128f8868483613b7f565b915061290382613ade565b915050935093915050565b611aec8282613c30565b61292460095482611ba9565b6009556040517f5353e2cb47d505ba9b628610daec53fc41f3a4259dab35a757b0f1d5a58bc1c39061236e908390615bb1565b60008061296683826020611af0565b915061287883602080611af0565b60008061298383826040611af0565b915061287883604080611af0565b600061299d4284613ceb565b905061089682821115610146611c0b565b60008060006129bb610db3565b9150915060006129cd85428486613569565b90506115108582611b0e565b6000606060006129ea6126666108f0565b9550905060606129f8611f3d565b5090506060612a0682611fea565b9050612a1287826137a2565b6000612a1d8461225c565b840190506060612a2c84612379565b9050612a3c8a8a8386868d613cf7565b9097509550612a59612a4e8389611b0e565b858b898560016139db565b6127008684613e04565b60006108968260fd6136d1565b60006109ab612a8184836040611af0565b612a8d85604080611af0565b84613e6d565b600080612a9e613ed7565b9050612ab4612aac826125e3565b610147611c0b565b60408501516001600160a01b0316301415612b0d57612ada610c3c828760c00151613edd565b600083612ae56108f0565b0390506000612af38261225c565b82019050612b0387878386613ef8565b93505050506109ab565b60208501516001600160a01b0316301415612b4b57600084612b2d6108f0565b0390506000612b3b8261225c565b82019050612b03878683866140c3565b612b578585858461427e565b9150506109ab565b6000612b6961127d565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015612ba157600080fd5b505afa158015612bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9a9190615658565b612be2826144a8565b612beb816144a8565b612bfa60095485858585611b5b565b6009556040517fc42eae0298d32208994ed5d58e525fa31c2911e95451d98f8df3355259c4a13d90612c33908690869086908690615e7f565b60405180910390a150505050565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b6000612c8b856144d1565b9050612ca1612c9b8783876144ed565b83611c0b565b612cb0428410156101b8611c0b565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b60006060612cef610c3c612ce9613ed7565b86613edd565b6000612cfa8461459c565b9050612d156000826003811115612d0d57fe5b1460ce611c0b565b6060612d1f611f3d565b509050612d2b856145b2565b9250612d398351825161315d565b6060612d4482611fea565b9050612d5084826137a2565b6000612d5a6145c8565b6001600160a01b03166390043a58612d7185612379565b876040518363ffffffff1660e01b8152600401612d8f929190615ab6565b60206040518083038186803b158015612da757600080fd5b505afa158015612dbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ddf919061550d565b9050612dec8186516145ec565b9550612df88583613e04565b6000612e086001606f1b88611be6565b9050612e148982612566565b612e1d86613ade565b95508086600081518110612e2d57fe5b602002602001018181525050612e416135ad565b50505050509250929050565b620f424090565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b612e8b60095482611b9b565b6009556040517f5a9e84f78f7957cb4ed7478eb0fcad35ee4ecbe2e0f298420b28a3955392573f9061236e908390615bb1565b6000808080612ecf85606080611af0565b9350612ede8560206040611af0565b92506030612eef8660006010611af0565b901b91506030612f0186601080611af0565b901b90509193509193565b6001600160a01b0381166000908152600b60205260408120546009546108969190612f3690613611565b612a70565b6000806030612f5b84612f4f576010612f52565b60005b87906010611af0565b901b905080612f6e5760009150506109ab565b6000612f7c86606080611af0565b90506000612f8d8760206040611af0565b9050600081871415612fd057612fc96020678ac7230489e80000612fc289612fb65760e0612fb9565b60c05b8c906020611af0565b9190614606565b905061305e565b604051633d3632df60e21b815273__$6670886e635fd86503a30ff6f4e4ebb80f$__9063f4d8cb7c9061300b9087908b908b90600401615e51565b60206040518083038186803b15801561302357600080fd5b505af4158015613037573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305b919061550d565b90505b61306981848861464c565b98975050505050505050565b6001600160a01b03166000908152600b602052604090205490565b6000806130a08360806005611af0565b600a0a670de0b6b3a7640000029392505050565b60006109ab8383614665565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061312d614693565b30604051602001613142959493929190615cb6565b60405160208183030381529060405280519060200120905090565b611aec8183146067611c0b565b600061317585612f0c565b9050613185811515610135611c0b565b600061319c856131976117f889613075565b614697565b90506131aa818386866146a3565b6001600160a01b0387166000818152600c6020526040908190209290925590517fcad1fdf49cd36960e377075cfe18dcc3aa113e526fbe184544cca2e7115c54f3906131fb90889088908890615e69565b60405180910390a2505050505050565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040161323a9190615dd2565b602060405180830381600087803b15801561325457600080fd5b505af1158015613268573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328c919061550d565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d2906132bf90849088908890600401615c30565b600060405180830381600087803b1580156132d957600080fd5b505af11580156132ed573d6000803e3d6000fd5b509298975050505050505050565b61330a61010083106064611c0b565b6133336001821015801561332c575061332860ff8461010003611bb7565b8211155b6064611c0b565b611ac483821c156101b4611c0b565b60006109ab6133c6836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561338357600080fd5b505afa158015613397573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133bb9190615946565b60129060ff16611be6565b849060806005611bc3565b6002815110156133e057610f64565b6000816000815181106133ef57fe5b602002602001015190506000600190505b8251811015611ac457600083828151811061341757fe5b60200260200101519050613440816001600160a01b0316846001600160a01b0316106065611c0b565b9150600101613400565b815160001990810160209384019081528251909101919092019081529091565b60006134798484111583611c0b565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b61349f61124c565b6001600160a01b0316141580156134ba57506134ba8361489c565b156134e2576134c761124c565b6001600160a01b0316336001600160a01b0316149050610896565b6134ea612b5f565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161351993929190615bdd565b60206040518083038186803b15801561353157600080fd5b505afa158015613545573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176b91906154f1565b60008284111580613578575081155b1561358557506000611a91565b60006135918684614996565b9050838503611a8c6135a383836145ec565b6301e133806149ae565b6135b9600a54426149ce565b600a55565b60008282026135e28415806135db5750838583816135d857fe5b04145b6003611c0b565b6001670de0b6b3a76400006001830304018115150291505092915050565b8015610f6457610f646123076115f0565b600080600061361f84612957565b91509150611a9182826149de565b61363960008383611ac4565b61365361364e826136486108f0565b90611b0e565b614a16565b6001600160a01b0382166000908152602081905260409020546136769082611b0e565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906136c5908590615bd4565b60405180910390a35050565b1c60011690565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60006109ab838360fe611bfc565b60008061375484846149de565b90506107e5868683613e6d565b6000606061378c8360008151811061377557fe5b602002602001015185611be690919063ffffffff16565b8351600019016020909401938452949293505050565b815181516137b190829061315d565b60005b818110156115a0576137ec8482815181106137cb57fe5b60200260200101518483815181106137df57fe5b6020026020010151614665565b8482815181106137f857fe5b60209081029190910101526001016137b4565b600060606000613819613ed7565b90506000613826856139c5565b9050613852613834836125e3565b8061384a5750600182600281111561384857fe5b145b61014a611c0b565b600081600281111561386057fe5b14156139085761386e6145c8565b6001600160a01b0316633d0b05e98a8a8961388887612630565b8a6040518663ffffffff1660e01b81526004016138a9959493929190615b41565b60006040518083038186803b1580156138c157600080fd5b505afa1580156138d5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526138fd9190810190615862565b9350935050506139ba565b600181600281111561391657fe5b1415613953576139246145c8565b6001600160a01b0316631b2db0ea8a88886040518463ffffffff1660e01b81526004016138a993929190615b86565b600281600281111561396157fe5b14156139ac5761396f6145c8565b6001600160a01b0316632ac71a3e8a8a8a8a61398a88612630565b8b6040518763ffffffff1660e01b81526004016138a996959493929190615adb565b6139b76101506125f0565b50505b965096945050505050565b6000818060200190518101906108969190615713565b60005b8451811015613a6c576000613a2d8683815181106139f857fe5b6020026020010151868481518110613a0c57fe5b602002602001015185613a2157611be6613a25565b611b0e5b63ffffffff16565b9050613a636002888481518110613a4057fe5b60200260200101518a84888781518110613a5657fe5b6020026020010151614a1b565b506001016139de565b50505050505050565b81518151613a8490829061315d565b60005b818110156115a057613abf848281518110613a9e57fe5b6020026020010151848381518110613ab257fe5b6020026020010151614aa0565b848281518110613acb57fe5b6020908102919091010152600101613a87565b606081516001016001600160401b0381118015613afa57600080fd5b50604051908082528060200260200182016040528015613b24578160200160208202803683370190505b50905060005b82518110156109eb57828181518110613b3f57fe5b6020026020010151828260010181518110613b5657fe5b6020908102919091010152600101613b2a565b6000818060200190518101906109ab9190615962565b60606000613b8d8484614aa0565b9050606085516001600160401b0381118015613ba857600080fd5b50604051908082528060200260200182016040528015613bd2578160200160208202803683370190505b50905060005b8651811015613c2657613c0783888381518110613bf157fe5b602002602001015161466590919063ffffffff16565b828281518110613c1357fe5b6020908102919091010152600101613bd8565b5095945050505050565b613c476001600160a01b038316151561019b611c0b565b613c5382600083611ac4565b6001600160a01b038216600090815260208190526040902054613c7990826101b261346a565b6001600160a01b038316600090815260208190526040902055613ca761364e82613ca16108f0565b90614aea565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516136c59190615bd4565b80820390821002900390565b600060606000613d05613ed7565b90506000613d128561459c565b9050613d34613d20836125e3565b8061384a5750600382600381111561384857fe5b613d41610c3c838c613edd565b6001816003811115613d4f57fe5b1415613d7857613d5d6145c8565b6001600160a01b031663120c0c638a8a8a8a61398a88612630565b6002816003811115613d8657fe5b1415613dae57613d946145c8565b6001600160a01b031663098e01898a8a8961388887612630565b6003816003811115613dbc57fe5b1415613df957613dca6145c8565b6001600160a01b03166303a5b64b8a88886040518463ffffffff1660e01b81526004016138a993929190615b86565b6139b76101366125f0565b81518151613e1390829061315d565b60005b818110156115a057613e4e848281518110613e2d57fe5b6020026020010151848381518110613e4157fe5b6020026020010151614af8565b848281518110613e5a57fe5b6020908102919091010152600101613e16565b6000670de0b6b3a764000082101580613e8557508284145b15613e915750816109ab565b81613e9d5750826109ab565b82841115613ebe576000613eb383858703614665565b850391506109ab9050565b6000613ecc83868603614665565b850191506109ab9050565b60095490565b6000613ee883612a63565b15806109ab57506109ab82610b9f565b6000806000613f138760200151613f0e86613611565b614b45565b915091506000613f2285612630565b9050613f2e87836130b4565b965060008089516001811115613f4057fe5b1415613fef57613f548960600151846130b4565b60608a0152613f616145c8565b6001600160a01b031663afc4d0db89868c606001518b876040518663ffffffff1660e01b8152600401613f98959493929190615e9a565b60206040518083038186803b158015613fb057600080fd5b505afa158015613fc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fe8919061550d565b9050614081565b613ff76145c8565b6001600160a01b0316637f1ae8a989868c606001518b876040518663ffffffff1660e01b815260040161402e959493929190615e9a565b60206040518083038186803b15801561404657600080fd5b505afa15801561405a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061407e919061550d565b90505b61408e8988836001614b74565b60008951600181111561409d57fe5b14156140ae579350611a9192505050565b6140b88184614d09565b945050505050611a91565b60008060006140d98760400151613f0e86613611565b9150915060006140e885612630565b90506140f487836130b4565b96506000808951600181111561410657fe5b14156141a2576141146145c8565b6001600160a01b0316630ccd894189868c606001518b876040518663ffffffff1660e01b815260040161414b959493929190615e9a565b60206040518083038186803b15801561416357600080fd5b505afa158015614177573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061419b919061550d565b9050614247565b6141b08960600151846130b4565b60608a01526141bd6145c8565b6001600160a01b031663ef2aca7689868c606001518b876040518663ffffffff1660e01b81526004016141f4959493929190615e9a565b60206040518083038186803b15801561420c57600080fd5b505afa158015614220573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614244919061550d565b90505b6142548988836000614b74565b60008951600181111561426357fe5b1415614273576140b88184614697565b9350611a9192505050565b6000614288614f29565b6142928684614d15565b905060006142a76142a285612630565b614d8d565b90506142b78683604001516130b4565b95506142c78583606001516130b4565b9450600080885160018111156142d957fe5b14156143a1576142f1886060015184604001516130b4565b606089018190526000906143059084614665565b905061430f6145c8565b8451602086015160405163063c5da760e11b81526001600160a01b039390931692630c78bb4e92614349928d928d91908890600401615e9a565b60206040518083038186803b15801561436157600080fd5b505afa158015614375573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614399919061550d565b915050614460565b6143b3886060015184606001516130b4565b606089015260006143c26145c8565b8451602086015160608c015160405162d5905160e81b81526001600160a01b03949094169363d590510093614400938e9391928e9290600401615e9a565b60206040518083038186803b15801561441857600080fd5b505afa15801561442c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614450919061550d565b905061445c8184614af8565b9150505b61446d8884898985614d9f565b60008851600181111561447c57fe5b141561449a57614490818460600151614697565b9350505050611a91565b614490818460400151614d09565b6144bb64e8d4a5100082101560cb611c0b565b610f64670d2f13f7789f000082111560ca611c0b565b60006144db6130c0565b8260405160200161120b929190615a74565b60006144ff82516041146101b9611c0b565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190614538908990859088908890615cf9565b6020604051602081039080840390855afa15801561455a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906130695750876001600160a01b0316816001600160a01b0316149450505050509392505050565b6000818060200190518101906108969190615732565b6060818060200190518101906109ab919061574d565b7f000000000000000000000000000000000000000000000000000000000000000090565b60008282026109ab8415806135db5750838583816135d857fe5b60006146236002841015801561332c575060ff8411156064611c0b565b6000196001841b01614639818611156064611c0b565b61151061464686856145ec565b826149ae565b6000611a9183858461466057614665613a25565b6135be565b600082820261467f8415806135db5750838583816135d857fe5b670de0b6b3a7640000815b04949350505050565b4690565b60006109ab8383614aa0565b60006146d88315806146d0575067016345785d8a000084101580156146d05750670de0b6b3a76400008411155b610163611c0b565b6146ef678ac7230489e80000831115610163611c0b565b6147068215806146d0575083831015610163611c0b565b600061471d8560206040611b35858b606080611bc3565b905061473e603084811c906010908190611b359086908a901c600084611bc3565b9050600073__$6670886e635fd86503a30ff6f4e4ebb80f$__63f4d8cb7c868860016040518463ffffffff1660e01b815260040161477e93929190615e51565b60206040518083038186803b15801561479657600080fd5b505af41580156147aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147ce919061550d565b9050600073__$6670886e635fd86503a30ff6f4e4ebb80f$__63f4d8cb7c868960006040518463ffffffff1660e01b815260040161480e93929190615e51565b60206040518083038186803b15801561482657600080fd5b505af415801561483a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061485e919061550d565b9050613069614877826020678ac7230489e80000614e20565b60e06020611b356148918783678ac7230489e80000614e20565b889060c06020611bc3565b60006148ae63819c70f360e01b6111d6565b8214806148c957506148c6635b160f8360e11b6111d6565b82145b806148e257506148df633806be4b60e21b6111d6565b82145b806148fb57506148f86381788e2b60e01b6111d6565b82145b806149145750614911630793b27760e31b6111d6565b82145b8061492d575061492a637b749c4560e01b6111d6565b82145b8061494657506149436306946dbf60e31b6111d6565b82145b8061495f575061495c6397bb15c960e01b6111d6565b82145b806149785750614975632a9a032360e01b6111d6565b82145b80610896575061498e63f885a4bb60e01b6111d6565b909114919050565b60006109ab6149a584846145ec565b6149ae84614d8d565b60006149bd8215156004611c0b565b8183816149c657fe5b049392505050565b60006109ab8383603c6020611bc3565b60008142106149f65750670de0b6b3a7640000610896565b824211614a0557506000610896565b828203428490036115108183614aa0565b600255565b6000614a2685614e66565b90506000866002811115614a3657fe5b1480614a4d57506002866002811115614a4b57fe5b145b15614a6057614a60818585856001614e81565b6001866002811115614a6e57fe5b1480614a8557506002866002811115614a8357fe5b145b15614a9857614a98818585856000614e81565b505050505050565b6000614aaf8215156004611c0b565b670de0b6b3a76400008302614ae1841580614ada5750670de0b6b3a7640000858381614ad757fe5b04145b6005611c0b565b82818161468a57fe5b60006109ab8383600161346a565b6000614b078215156004611c0b565b670de0b6b3a76400008302614b2f841580614ada5750670de0b6b3a7640000858381614ad757fe5b6001836001830304018115150291505092915050565b6000806000614b5385613075565b9050614b5f8185612a70565b9250614b6a81613090565b9150509250929050565b6000808215614bc157600086516001811115614b8c57fe5b14614ba7576060860151614ba1908690611b0e565b84614bb7565b614bb18585611b0e565b86606001515b9092509050614c01565b600086516001811115614bd057fe5b14614be957614bdf8585611be6565b8660600151614bfb565b6060860151614bf9908690611be6565b845b90925090505b606080614c0c611f3d565b915091506060614c1b83612379565b9050614c2f82614c2a85611fea565b6137a2565b606083516001600160401b0381118015614c4857600080fd5b50604051908082528060200260200182016040528015614c72578160200160208202803683370190505b509050600087614c86578a60400151614c8c565b8a602001515b905060005b8551811015614ced57816001600160a01b0316868281518110614cb057fe5b60200260200101516001600160a01b03161415614ce55786838281518110614cd457fe5b602002602001018181525050614ced565b600101614c91565b50614cfc87868685878d6139db565b5050505050505050505050565b60006109ab8383614af8565b614d1d614f29565b6000614d2c8460200151613075565b90506000614d3d8560400151613075565b90506000614d4a85613611565b9050614d568382612a70565b8452614d628282612a70565b6020850152614d7083613090565b6040850152614d7e82613090565b60608501525091949350505050565b670de0b6b3a764000081810391100290565b6000614dac6112356121b2565b90506000808088516001811115614dbf57fe5b14614dcf57838860600151614dd6565b8760600151845b91509150614dff6000896020015185614df8868b611b0e90919063ffffffff16565b8b51614a1b565b60408801516116959060019085614e168986611be6565b8b60200151614a1b565b6000614e3d6002841015801561332c575060ff8411156064611c0b565b614e4b828511156064611c0b565b6000196001841b01611510614e6086836145ec565b846149ae565b6001600160a01b03166000908152600c602052604090205490565b6000614e8e868484612f3b565b9050614a98614ea08685878587614ea9565b15610164611c0b565b600082614eb857506000611510565b6000614ecf614ec788886145ec565b868515614eed565b905082614ede57838111614ee2565b8381105b979650505050505050565b600081614f0357614efe84846149ae565b611a91565b611a9184846000614f178215156004611c0b565b50811515600019909201046001010290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b803561089681615f44565b600082601f830112614f6c578081fd5b8135614f7f614f7a82615f19565b615ef3565b818152915060208083019084810181840286018201871015614fa057600080fd5b60005b84811015614fc8578135614fb681615f44565b84529282019290820190600101614fa3565b505050505092915050565b600082601f830112614fe3578081fd5b8151614ff1614f7a82615f19565b81815291506020808301908481018184028601820187101561501257600080fd5b60005b84811015614fc857815161502881615f44565b84529282019290820190600101615015565b600082601f83011261504a578081fd5b8135615058614f7a82615f19565b81815291506020808301908481018184028601820187101561507957600080fd5b60005b84811015614fc85781358452928201929082019060010161507c565b600082601f8301126150a8578081fd5b81516150b6614f7a82615f19565b8181529150602080830190848101818402860182018710156150d757600080fd5b60005b84811015614fc8578151845292820192908201906001016150da565b600082601f830112615106578081fd5b81356001600160401b0381111561511b578182fd5b61512e601f8201601f1916602001615ef3565b915080825283602082850101111561514557600080fd5b8060208401602084013760009082016020015292915050565b80516004811061089657600080fd5b80356002811061089657600080fd5b600061012080838503121561518f578182fd5b61519881615ef3565b9150506151a5838361516d565b81526151b48360208401614f51565b60208201526151c68360408401614f51565b6040820152606082013560608201526080820135608082015260a082013560a08201526151f68360c08401614f51565b60c08201526152088360e08401614f51565b60e0820152610100808301356001600160401b0381111561522857600080fd5b615234858286016150f6565b82840152505092915050565b600060208284031215615251578081fd5b81356109ab81615f44565b6000806040838503121561526e578081fd5b823561527981615f44565b9150602083013561528981615f44565b809150509250929050565b6000806000606084860312156152a8578081fd5b83356152b381615f44565b925060208401356152c381615f44565b929592945050506040919091013590565b600080600080600080600060e0888a0312156152ee578485fd5b87356152f981615f44565b9650602088013561530981615f44565b95506040880135945060608801359350608088013561532781615f67565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215615356578182fd5b823561536181615f44565b946020939093013593505050565b60008060408385031215615381578182fd5b82516001600160401b0380821115615397578384fd5b6153a386838701614fd3565b935060208501519150808211156153b8578283fd5b50614b6a85828601615098565b600080600080608085870312156153da578182fd5b84356001600160401b03808211156153f0578384fd5b6153fc88838901614f5c565b95506020870135915080821115615411578384fd5b61541d8883890161503a565b94506040870135915080821115615432578384fd5b61543e8883890161503a565b93506060870135915080821115615453578283fd5b506154608782880161503a565b91505092959194509250565b600080600060608486031215615480578081fd5b83516001600160401b0380821115615496578283fd5b6154a287838801614fd3565b945060208601519150808211156154b7578283fd5b506154c486828701615098565b925050604084015190509250925092565b6000602082840312156154e6578081fd5b81356109ab81615f59565b600060208284031215615502578081fd5b81516109ab81615f59565b60006020828403121561551e578081fd5b5051919050565b600080600080600080600060e0888a03121561553f578081fd5b87359650602088013561555181615f44565b9550604088013561556181615f44565b945060608801356001600160401b038082111561557c578283fd5b6155888b838c0161503a565b955060808a0135945060a08a0135935060c08a01359150808211156155ab578283fd5b506155b88a828b016150f6565b91505092959891949750929550565b6000806000606084860312156155db578081fd5b8351925060208401516001600160401b03808211156155f8578283fd5b61560487838801614fd3565b93506040860151915080821115615619578283fd5b5061562686828701615098565b9150509250925092565b600060208284031215615641578081fd5b81356001600160e01b0319811681146109ab578182fd5b600060208284031215615669578081fd5b81516109ab81615f44565b600080600080600060a0868803121561568b578283fd5b853561569681615f44565b945060208601356156a681615f44565b9350604086013592506060860135915060808601356156c481615f44565b809150509295509295909350565b6000806000606084860312156156e6578081fd5b83356156f181615f44565b925060208401359150604084013561570881615f44565b809150509250925092565b600060208284031215615724578081fd5b8151600381106109ab578182fd5b600060208284031215615743578081fd5b6109ab838361515e565b6000806040838503121561575f578182fd5b615769848461515e565b915060208301516001600160401b03811115615783578182fd5b614b6a85828601615098565b600080600080608085870312156157a4578182fd5b84356001600160401b03808211156157ba578384fd5b6157c68883890161517c565b955060208701359150808211156157db578384fd5b506157e88782880161503a565b949794965050505060408301359260600135919050565b600080600060608486031215615813578081fd5b83356001600160401b03811115615828578182fd5b6158348682870161517c565b9660208601359650604090950135949350505050565b60006020828403121561585b578081fd5b5035919050565b60008060408385031215615874578182fd5b8251915060208301516001600160401b03811115615783578182fd5b600080600080608085870312156158a5578182fd5b843593506020850135925060408501356001600160401b03808211156158c9578384fd5b61543e88838901614f5c565b600080600080608085870312156158ea578182fd5b845193506020850151925060408501519150606085015161590a81615f44565b939692955090935050565b6000806000806080858703121561592a578182fd5b5050823594602084013594506040840135936060013592509050565b600060208284031215615957578081fd5b81516109ab81615f67565b60008060408385031215615974578182fd5b825161597f81615f67565b6020939093015192949293505050565b6000815180845260208085019450808401835b838110156159c75781516001600160a01b0316875295820195908201906001016159a2565b509495945050505050565b6000815180845260208085019450808401835b838110156159c7578151875295820195908201906001016159e5565b60008151808452815b81811015615a2657602081850181015186830182015201615a0a565b81811115615a375782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6000602082526109ab60208301846159d2565b600060408252615ac960408301856159d2565b828103602084015261151081856159d2565b600060c08252615aee60c08301896159d2565b8281036020840152615b0081896159d2565b90508281036040840152615b1481886159d2565b905085606084015284608084015282810360a0840152615b348185615a01565b9998505050505050505050565b600060a08252615b5460a08301886159d2565b8281036020840152615b6681886159d2565b905085604084015284606084015282810360808401526130698185615a01565b600060608252615b9960608301866159d2565b84602084015282810360408401526107e58185615a01565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b81811015615c7857615c668551615f38565b83529383019391830191600101615c54565b505084810360408601528551808252908201925081860190845b818110156132ed57615ca48351615f38565b85529383019391830191600101615c92565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b600061010060018060a01b03808c1684528a6020850152896040850152816060850152615d468285018a61598f565b91508382036080850152615d5a82896159d2565b96811660a08501529490941660c08301525060e001525095945050505050565b600060018060a01b03808a16835288602084015287604084015260e06060840152615da860e084018861598f565b8381036080850152615dba81886159d2565b9590911660a0840152505060c0015295945050505050565b6020810160038310615de057fe5b91905290565b6000602082526109ab6020830184615a01565b600083825260406020830152611a9160408301846159d2565b918252602082015260400190565b600085825284602083015260806040830152615e3f60808301856159d2565b8281036060840152614ee281856159d2565b92835260208301919091521515604082015260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b958652602086019490945260408501929092526060840152608083015260a082015260c00190565b60ff91909116815260200190565b6040518181016001600160401b0381118282101715615f1157600080fd5b604052919050565b60006001600160401b03821115615f2e578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114610f6457600080fd5b8015158114610f6457600080fd5b60ff81168114610f6457600080fdfea26469706673582212201cb6c7fd8d57d507c6afc2e6fda8942949b2e6d3b6f14b521f6a636e19d86bcb64736f6c63430007010033608060405234801561001057600080fd5b50612f72806100206000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c8063588e1b44116100a2578063afc4d0db11610071578063afc4d0db1461103d578063b540624d14611072578063d59051001461121c578063ef2aca7614611251578063f442dbc41461128657610116565b8063588e1b4414610c455780637351a78614610def5780637f1ae8a914610ee557806390043a5814610f1a57610116565b8063120c0c63116100e9578063120c0c63146104d45780631b2db0ea1461070a5780632ac71a3e146108385780633d0b05e914610a6e5780634c888cbb14610c2257610116565b806303a5b64b1461011b578063098e0189146102a45780630c78bb4e146104585780630ccd89411461049f575b600080fd5b6102496004803603606081101561013157600080fd5b810190602081018135600160201b81111561014b57600080fd5b82018360208201111561015d57600080fd5b803590602001918460208302840111600160201b8311171561017e57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092958435959094909350604081019250602001359050600160201b8111156101d557600080fd5b8201836020820111156101e757600080fd5b803590602001918460018302840111600160201b8311171561020857600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061132c945050505050565b6040518083815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561028f578181015183820152602001610277565b50505050905001935050505060405180910390f35b610249600480360360a08110156102ba57600080fd5b810190602081018135600160201b8111156102d457600080fd5b8201836020820111156102e657600080fd5b803590602001918460208302840111600160201b8311171561030757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561035657600080fd5b82018360208201111561036857600080fd5b803590602001918460208302840111600160201b8311171561038957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295843595602086013595919450925060608101915060400135600160201b8111156103e457600080fd5b8201836020820111156103f657600080fd5b803590602001918460018302840111600160201b8311171561041757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611347945050505050565b61048d600480360360a081101561046e57600080fd5b5080359060208101359060408101359060608101359060800135611366565b60408051918252519081900360200190f35b61048d600480360360a08110156104b557600080fd5b5080359060208101359060408101359060608101359060800135611381565b610249600480360360c08110156104ea57600080fd5b810190602081018135600160201b81111561050457600080fd5b82018360208201111561051657600080fd5b803590602001918460208302840111600160201b8311171561053757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561058657600080fd5b82018360208201111561059857600080fd5b803590602001918460208302840111600160201b831117156105b957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561060857600080fd5b82018360208201111561061a57600080fd5b803590602001918460208302840111600160201b8311171561063b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295843595602086013595919450925060608101915060400135600160201b81111561069657600080fd5b8201836020820111156106a857600080fd5b803590602001918460018302840111600160201b831117156106c957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611390945050505050565b6102496004803603606081101561072057600080fd5b810190602081018135600160201b81111561073a57600080fd5b82018360208201111561074c57600080fd5b803590602001918460208302840111600160201b8311171561076d57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092958435959094909350604081019250602001359050600160201b8111156107c457600080fd5b8201836020820111156107d657600080fd5b803590602001918460018302840111600160201b831117156107f757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506113b1945050505050565b610249600480360360c081101561084e57600080fd5b810190602081018135600160201b81111561086857600080fd5b82018360208201111561087a57600080fd5b803590602001918460208302840111600160201b8311171561089b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156108ea57600080fd5b8201836020820111156108fc57600080fd5b803590602001918460208302840111600160201b8311171561091d57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561096c57600080fd5b82018360208201111561097e57600080fd5b803590602001918460208302840111600160201b8311171561099f57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295843595602086013595919450925060608101915060400135600160201b8111156109fa57600080fd5b820183602082011115610a0c57600080fd5b803590602001918460018302840111600160201b83111715610a2d57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506113c0945050505050565b610249600480360360a0811015610a8457600080fd5b810190602081018135600160201b811115610a9e57600080fd5b820183602082011115610ab057600080fd5b803590602001918460208302840111600160201b83111715610ad157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b2057600080fd5b820183602082011115610b3257600080fd5b803590602001918460208302840111600160201b83111715610b5357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295843595602086013595919450925060608101915060400135600160201b811115610bae57600080fd5b820183602082011115610bc057600080fd5b803590602001918460018302840111600160201b83111715610be157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506113d2945050505050565b61048d60048036036040811015610c3857600080fd5b50803590602001356113e3565b61048d600480360360a0811015610c5b57600080fd5b810190602081018135600160201b811115610c7557600080fd5b820183602082011115610c8757600080fd5b803590602001918460208302840111600160201b83111715610ca857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610cf757600080fd5b820183602082011115610d0957600080fd5b803590602001918460208302840111600160201b83111715610d2a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610d7957600080fd5b820183602082011115610d8b57600080fd5b803590602001918460208302840111600160201b83111715610dac57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356113f8565b610e9560048036036060811015610e0557600080fd5b810190602081018135600160201b811115610e1f57600080fd5b820183602082011115610e3157600080fd5b803590602001918460208302840111600160201b83111715610e5257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505082359350505060200135611407565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610ed1578181015183820152602001610eb9565b505050509050019250505060405180910390f35b61048d600480360360a0811015610efb57600080fd5b508035906020810135906040810135906060810135906080013561141c565b61048d60048036036040811015610f3057600080fd5b810190602081018135600160201b811115610f4a57600080fd5b820183602082011115610f5c57600080fd5b803590602001918460208302840111600160201b83111715610f7d57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610fcc57600080fd5b820183602082011115610fde57600080fd5b803590602001918460208302840111600160201b83111715610fff57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061142b945050505050565b61048d600480360360a081101561105357600080fd5b5080359060208101359060408101359060608101359060800135611437565b61048d600480360360a081101561108857600080fd5b810190602081018135600160201b8111156110a257600080fd5b8201836020820111156110b457600080fd5b803590602001918460208302840111600160201b831117156110d557600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561112457600080fd5b82018360208201111561113657600080fd5b803590602001918460208302840111600160201b8311171561115757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156111a657600080fd5b8201836020820111156111b857600080fd5b803590602001918460208302840111600160201b831117156111d957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505082359350505060200135611446565b61048d600480360360a081101561123257600080fd5b5080359060208101359060408101359060608101359060800135611455565b61048d600480360360a081101561126757600080fd5b5080359060208101359060408101359060608101359060800135611464565b610e956004803603606081101561129c57600080fd5b810190602081018135600160201b8111156112b657600080fd5b8201836020820111156112c857600080fd5b803590602001918460208302840111600160201b831117156112e957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505082359350505060200135611473565b6000606061133b858585611480565b91509150935093915050565b6000606061135887878787876114a4565b915091509550959350505050565b6000611375868686868661156d565b90505b95945050505050565b600061137586868686866115e8565b600060606113a28888888888886116a5565b91509150965096945050505050565b6000606061133b8585856116fe565b600060606113a2888888888888611718565b600060606113588787878787611761565b60006113ef83836117b8565b90505b92915050565b600061137586868686866117fd565b606061141484848461193b565b949350505050565b600061137586868686866119d7565b60006113ef8383611a6d565b60006113758686868686611adf565b60006113758686868686611bee565b60006113758686868686611d03565b60006113758686868686611d79565b6060611414848484611e55565b6000606061148d83611ee7565b915061149a85838661193b565b9050935093915050565b600060606000806114b485611f09565b915091506114c6895182106064611f37565b60006114fb8a83815181106114d757fe5b60200260200101518a84815181106114eb57fe5b6020026020010151858b8b6119d7565b905060608a5167ffffffffffffffff8111801561151757600080fd5b50604051908082528060200260200182016040528015611541578160200160208202803683370190505b5090508181848151811061155157fe5b6020908102919091010152929a92995091975050505050505050565b600061158f61158487670429d069189e0000611f49565b831115610130611f37565b600061159b8784611f81565b905060006115a98883611f93565b905060006115b78887611fea565b905060006115c5838361202a565b90506115da6115d3826120cf565b8990611f49565b9a9950505050505050505050565b6000806115ff846115f981886120e1565b90611f93565b90506116186709b6e64a8ec60000821015610132611f37565b600061163661162f670de0b6b3a764000089611fea565b839061202a565b9050600061164d611646836120cf565b8a90611f49565b9050600061166461165d8a6120cf565b83906120f7565b9050600061167283836120e1565b90506000611689611682896120cf565b84906120f7565b90506116958282611f81565b9c9b505050505050505050505050565b600060608060006116b58561212f565b915091506116c58a5183516121ea565b6116cf82896121f7565b60006116de8b8b858b8b611bee565b90506116ee8282101560d0611f37565b9a91995090975050505050505050565b6000606061170b83611ee7565b915061149a858386611e55565b600060608060006117288561212f565b9150915061173882518b516121ea565b61174282896121f7565b60006117518b8b858b8b6117fd565b90506116ee8282111560cf611f37565b6000606060008061177185611f09565b91509150611783895182106064611f37565b60006114fb8a838151811061179457fe5b60200260200101518a84815181106117a857fe5b6020026020010151858b8b6115e8565b6000806117df6117d0670de0b6b3a7640000856120e1565b670de0b6b3a764000090611fea565b90506114146117f682670de0b6b3a76400006120e1565b8590611f49565b60006060845167ffffffffffffffff8111801561181957600080fd5b50604051908082528060200260200182016040528015611843578160200160208202803683370190505b5090506000805b8851811015611908576118a389828151811061186257fe5b60200260200101516115f989848151811061187957fe5b60200260200101518c858151811061188d57fe5b60200260200101516120e190919063ffffffff16565b8382815181106118af57fe5b6020026020010181815250506118fe6118f78983815181106118cd57fe5b60200260200101518584815181106118e157fe5b60200260200101516120f790919063ffffffff16565b8390611f81565b915060010161184a565b50600061191989898986868a612266565b905061192e611927826120cf565b87906120f7565b9998505050505050505050565b606060006119498484611f93565b90506060855167ffffffffffffffff8111801561196557600080fd5b5060405190808252806020026020018201604052801561198f578160200160208202803683370190505b50905060005b86518110156119cd576119ae838883815181106118e157fe5b8282815181106119ba57fe5b6020908102919091010152600101611995565b5095945050505050565b6000806119e8846115f98188611f81565b9050611a016729a2241af62c0000821115610133611f37565b6000611a1861162f670de0b6b3a764000089611f93565b90506000611a38611a3183670de0b6b3a76400006120e1565b8a906120f7565b90506000611a4861165d8a6120cf565b90506000611a5683836120e1565b90506000611689611a66896120cf565b8490611f93565b670de0b6b3a764000060005b8351811015611acf57611ac5611abe858381518110611a9457fe5b6020026020010151858481518110611aa857fe5b602002602001015161237d90919063ffffffff16565b8390611f49565b9150600101611a79565b506113f260008211610137611f37565b60008080611af788611af18189611f81565b90611fea565b90506000611b17611b07896120cf565b611b11848b611f49565b90611f81565b905080821115611b8a576000670de0b6b3a76400008211611b39576000611b4e565b611b4e8a670de0b6b3a763ffff198401611f49565b90506000611b5c89836120e1565b90506000611b6a82896120f7565b9050611b80611b7983836120e1565b8490611f81565b9550505050611b9e565b86925082611b9e5760009350505050611378565b5060009050611bb188611af18185611f81565b90506000611bbf828961237d565b90506000670de0b6b3a76400008211611bd95760006115da565b6115da87670de0b6b3a763ffff198401611f49565b60006060845167ffffffffffffffff81118015611c0a57600080fd5b50604051908082528060200260200182016040528015611c34578160200160208202803683370190505b5090506000805b8851811015611cf257611c94898281518110611c5357fe5b6020026020010151611af1898481518110611c6a57fe5b60200260200101518c8581518110611c7e57fe5b6020026020010151611f8190919063ffffffff16565b838281518110611ca057fe5b602002602001018181525050611ce86118f7898381518110611cbe57fe5b6020026020010151858481518110611cd257fe5b6020026020010151611f4990919063ffffffff16565b9150600101611c3b565b506000611bbf89898986868a612416565b6000611d25611d1a85670429d069189e0000611f49565b831115610131611f37565b6000611d3b611d3486856120e1565b8690611f93565b90506000611d498588611f93565b90506000611d57838361202a565b90506000611d6d82670de0b6b3a76400006120e1565b90506115da8a826120f7565b600080611d8a876115f981886120e1565b90506000611da4611d9a886120cf565b611b11848a6120f7565b9050600082821115611e00576000611dc5611dbe846120cf565b8b90611f49565b90506000611dd389836120e1565b90506000611dea611de3896120cf565b8390611f93565b9050611df68382611f81565b9350505050611e13565b508580611e135760009350505050611378565b6000611e238a611af181856120e1565b90506000611e31828b61237d565b9050611e46611e3f826120cf565b89906120f7565b9b9a5050505050505050505050565b60606000611e638484611fea565b90506060855167ffffffffffffffff81118015611e7f57600080fd5b50604051908082528060200260200182016040528015611ea9578160200160208202803683370190505b50905060005b86518110156119cd57611ec883888381518110611cd257fe5b828281518110611ed457fe5b6020908102919091010152600101611eaf565b6000818060200190516040811015611efe57600080fd5b506020015192915050565b600080828060200190516060811015611f2157600080fd5b5060208101516040909101519094909350915050565b81611f4557611f4581612522565b5050565b6000828202611f6d841580611f66575083858381611f6357fe5b04145b6003611f37565b670de0b6b3a7640000815b04949350505050565b60008282016113ef8482101583611f37565b6000611fa28215156004611f37565b670de0b6b3a76400008302611fd4841580611fcd5750670de0b6b3a7640000858381611fca57fe5b04145b6005611f37565b6001836001830304018115150291505092915050565b6000611ff98215156004611f37565b670de0b6b3a76400008302612021841580611fcd5750670de0b6b3a7640000858381611fca57fe5b828181611f7857fe5b6000670de0b6b3a76400008214156120435750816113f2565b671bc16d674ec800008214156120645761205d83846120f7565b90506113f2565b673782dace9d90000082141561209457600061208084856120f7565b905061208c81826120f7565b9150506113f2565b60006120a08484612535565b905060006120ba6120b3836127106120f7565b6001611f81565b90506120c68282611f81565b925050506113f2565b670de0b6b3a764000081810391100290565b60006120f1838311156001611f37565b50900390565b6000828202612111841580611f66575083858381611f6357fe5b6001670de0b6b3a76400006001830304018115150291505092915050565b6060600082806020019051606081101561214857600080fd5b815160208301805160405192949293830192919084600160201b82111561216e57600080fd5b90830190602082018581111561218357600080fd5b82518660208202830111600160201b8211171561219f57600080fd5b82525081516020918201928201910280838360005b838110156121cc5781810151838201526020016121b4565b50505050919091016040525060200151929792965091945050505050565b611f458183146067611f37565b815181516122069082906121ea565b60005b818110156122605761224184828151811061222057fe5b602002602001015184838151811061223457fe5b6020026020010151611f49565b84828151811061224d57fe5b6020908102919091010152600101612209565b50505050565b670de0b6b3a764000060005b875181101561237257600085828151811061228957fe5b60200260200101518511156122ec5760006122b26122a6876120cf565b8b8581518110611cd257fe5b905060006122c6828a868151811061188d57fe5b905060006122d6611de3886120cf565b90506122e28382611f81565b9350505050612311565b8682815181106122f857fe5b602002602001015190508060001415612311575061236a565b600061233a8a848151811061232257fe5b6020026020010151611af1848d878151811061188d57fe5b90506123656117f68a858151811061234e57fe5b60200260200101518361237d90919063ffffffff16565b935050505b600101612272565b509695505050505050565b6000670de0b6b3a76400008214156123965750816113f2565b671bc16d674ec800008214156123b05761205d8384611f49565b673782dace9d9000008214156123d85760006123cc8485611f49565b905061208c8182611f49565b60006123e48484612535565b905060006123f76120b3836127106120f7565b90508082101561240c576000925050506113f2565b6120c682826120e1565b670de0b6b3a764000060005b87518110156123725760008486838151811061243a57fe5b602002602001015111156124b3576000670de0b6b3a7640000861161246057600061247a565b61247a670de0b6b3a764000087038b8581518110611cd257fe5b9050600061249886612492848c888151811061188d57fe5b906120f7565b90506124aa818a868151811061188d57fe5b925050506124d8565b8682815181106124bf57fe5b6020026020010151905080600014156124d8575061251a565b60006125018a84815181106124e957fe5b6020026020010151611af1848d8781518110611c7e57fe5b90506125156117f68a858151811061234e57fe5b935050505b600101612422565b612532816210905360ea1b61263f565b50565b60008161254b5750670de0b6b3a76400006113f2565b82612558575060006113f2565b61256860ff84901c156006611f37565b8261258e770bce5086492111aea88f4bb1ca6bcf584181ea8059f7653284106007611f37565b826000670c7d713b49da0000831380156125af5750670f43fc2c04ee000083125b156125e65760006125bf846126a0565b9050670de0b6b3a764000080820784020583670de0b6b3a7640000830502019150506125f4565b816125f0846127c0565b0290505b670de0b6b3a7640000900561262c680238fd42c5cf03ffff198212801590612625575068070c1cc73b00c800008213155b6008611f37565b61263581612b5f565b9695505050505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b670de0b6b3a7640000026000806a0c097ce7bc90715b34b9f160241b808401906ec097ce7bc90715b34b9f0fffffffff19850102816126db57fe5b05905060006a0c097ce7bc90715b34b9f160241b82800205905081806a0c097ce7bc90715b34b9f160241b81840205915060038205016a0c097ce7bc90715b34b9f160241b82840205915060058205016a0c097ce7bc90715b34b9f160241b82840205915060078205016a0c097ce7bc90715b34b9f160241b82840205915060098205016a0c097ce7bc90715b34b9f160241b828402059150600b8205016a0c097ce7bc90715b34b9f160241b828402059150600d8205016a0c097ce7bc90715b34b9f160241b828402059150600f820581019050806002029450505050505b919050565b6000670de0b6b3a76400008212156127fc576127f2826a0c097ce7bc90715b34b9f160241b816127ec57fe5b056127c0565b60000390506127bb565b60007e1600ef3172e58d2e933ec884fde10064c63b5372d805e203c0000000000000831261284d57770195e54c5dd42177f53a27172fa9ec630262827000000000830592506806f05b59d3b2000000015b73011798004d755d3c8bc8e03204cf44619e0000008312612885576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff008400083126128cd576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a7008312612908576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf850831261293f57693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e2831261297657690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d0383126129ab5768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb4174612111083126129d657680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d8312612a0b576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f17757889379378312612a40576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b2866038312612a74576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac8312612aa8576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b600068056bc75e2d63100000840168056bc75e2d631000008086030281612acb57fe5b059050600068056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b6000612b8e680238fd42c5cf03ffff198312158015612b87575068070c1cc73b00c800008313155b6009611f37565b6000821215612bc157612ba382600003612b5f565b6a0c097ce7bc90715b34b9f160241b81612bb957fe5b0590506127bb565b60006806f05b59d3b20000008312612c0157506806f05b59d3b1ffffff1990910190770195e54c5dd42177f53a27172fa9ec630262827000000000612c37565b6803782dace9d90000008312612c3357506803782dace9d8ffffff19909101906b1425982cf597cd205cef7380612c37565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac620000008412612c875768ad78ebc5ac61ffffff199093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d6310000008412612cc3576856bc75e2d630ffffff199093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b188000008412612cfd57682b5e3af16b187fffff199093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c4000008412612d37576815af1d78b58c3fffff199093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac62000008412612d7057680ad78ebc5ac61fffff199093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d631000008412612da95768056bc75e2d630fffff199093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b18800008412612de2576802b5e3af16b187ffff199093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c400008412612e1b5768015af1d78b58c3ffff199093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d6310000084840205850205969550505050505056fea2646970667358221220e964e79f8388e78339f52224a91c178f73f7b39286a8588eb3d3e7ef29670f3264736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b35760003560e01c80636634b753116100715780636634b753146101345780636c57f5a914610154578063739238d61461015c578063851c1bb3146101645780638d928af814610184578063aaabadc51461018c576100b3565b8062c194db146100b8578063174481fa146100d65780632da47c40146100ec5780632f2770db1461010257806344da655f1461010c578063508f0eae1461012c575b600080fd5b6100c0610194565b6040516100cd9190610ca3565b60405180910390f35b6100de6101b3565b6040516100cd929190610c56565b6100f46101f9565b6040516100cd929190610de8565b61010a610263565b005b61011f61011a366004610a07565b6102aa565b6040516100cd9190610c42565b61011f610328565b61014761014236600461098b565b61034c565b6040516100cd9190610c70565b61014761036a565b61011f610373565b6101776101723660046109c3565b610397565b6040516100cd9190610c7b565b61011f6103e9565b61011f61040d565b60606101ae604051806020016040528060008152506104d9565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561025557807f000000000000000000000000000000000000000000000000000000000000000003925062278d00915061025e565b60009250600091505b509091565b61026b6105b2565b6102736105e3565b6001805460ff1916811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60008060006102b76101f9565b9150915061031d856102c76103e9565b6102cf610373565b7f00000000000000000000000000000000000000000000000000000000000000008887876040516020016103099796959493929190610cb6565b6040516020818303038152906040526105f8565b925050505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526020819052604090205460ff1690565b60015460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016103cc929190610c2a565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006104176103e9565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561044f57600080fd5b505afa158015610463573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101ae91906109eb565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506104d36001600160a01b03831615156101ac610661565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016105a4818386610673565b505050505050505050919050565b60006105c96000356001600160e01b031916610397565b90506105e06105d882336106b1565b610191610661565b50565b6105f66105ee61036a565b1560d3610661565b565b60006106026105e3565b600061060d83610741565b6001600160a01b038116600081815260208190526040808220805460ff191660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b8161066f5761066f81610775565b5050565b5b60208110610693578151835260209283019290910190601f1901610674565b905182516020929092036101000a6000190180199091169116179052565b60006106bb61040d565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016106ea93929190610c84565b60206040518083038186803b15801561070257600080fd5b505afa158015610716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073a91906109a7565b9392505050565b6000606061074e836104d9565b905060008151602083016000f090506001600160a01b03811661073a573d6000803e3d6000fd5b62461bcd60e51b600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526105e0916210905360ea1b906242414c90606490fd5b803561032281610e3d565b600082601f8301126107eb578081fd5b81356107fe6107f982610e1d565b610df6565b81815291506020808301908481018184028601820187101561081f57600080fd5b60005b8481101561084757813561083581610e3d565b84529282019290820190600101610822565b505050505092915050565b600082601f830112610862578081fd5b81356108706107f982610e1d565b81815291506020808301908481018184028601820187101561089157600080fd5b60005b848110156108475781356108a781610e3d565b84529282019290820190600101610894565b600082601f8301126108c9578081fd5b81356108d76107f982610e1d565b8181529150602080830190848101818402860182018710156108f857600080fd5b60005b84811015610847578135845292820192908201906001016108fb565b803561032281610e52565b600082601f830112610932578081fd5b813567ffffffffffffffff811115610948578182fd5b61095b601f8201601f1916602001610df6565b915080825283602082850101111561097257600080fd5b8060208401602084013760009082016020015292915050565b60006020828403121561099c578081fd5b813561073a81610e3d565b6000602082840312156109b8578081fd5b815161073a81610e52565b6000602082840312156109d4578081fd5b81356001600160e01b03198116811461073a578182fd5b6000602082840312156109fc578081fd5b815161073a81610e3d565b60008060408385031215610a19578081fd5b823567ffffffffffffffff80821115610a30578283fd5b8185019150610140808388031215610a46578384fd5b610a4f81610df6565b9050823582811115610a5f578485fd5b610a6b88828601610922565b825250602083013582811115610a7f578485fd5b610a8b88828601610922565b602083015250604083013582811115610aa2578485fd5b610aae88828601610852565b604083015250606083013582811115610ac5578485fd5b610ad1888286016108b9565b606083015250608083013582811115610ae8578485fd5b610af4888286016107db565b60808301525060a083013560a0820152610b118760c08501610917565b60c0820152610b238760e08501610917565b60e082015261010083810135908201526101209283013592810192909252509150610b5184602085016107d0565b90509250929050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015610b9f5781516001600160a01b031687529582019590820190600101610b7a565b509495945050505050565b6000815180845260208085019450808401835b83811015610b9f57815187529582019590820190600101610bbd565b15159052565b60008151808452815b81811015610c0457602081850181015186830182015201610be8565b81811115610c155782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b901515815260200190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b60006020825261073a6020830184610bdf565b600060e0825288516101408060e0850152610cd5610220850183610bdf565b915060208b015160df19610100818786030181880152610cf58584610bdf565b945060408e01519250610120828887030181890152610d148685610b67565b955060608f01519350828887030185890152610d308685610baa565b955060808f015194508288870301610160890152610d4e8686610b67565b955060a08f015161018089015260c08f01519450610d706101a0890186610bd9565b60e08f01519450610d856101c0890186610bd9565b908e01516101e08801528d015161020087015250919250610dac9150506020830189610b5a565b610db96040830188610b5a565b610dc66060830187610b5a565b610dd36080830186610b5a565b60a082019390935260c0015295945050505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610e1557600080fd5b604052919050565b600067ffffffffffffffff821115610e33578081fd5b5060209081020190565b6001600160a01b03811681146105e057600080fd5b80151581146105e057600080fdfea2646970667358221220817481454a3462d9ac07f7e0bcdb05ce950192e04218fb8a3e403c9dadfb1be064736f6c63430007010033", + "linkReferences": { + "contracts/lib/CircuitBreakerLib.sol": { + "CircuitBreakerLib": [ + { + "length": 20, + "start": 22862 + }, + { + "length": 20, + "start": 28851 + }, + { + "length": 20, + "start": 28995 + } + ] + }, + "contracts/managed/ManagedPoolAddRemoveTokenLib.sol": { + "ManagedPoolAddRemoveTokenLib": [ + { + "length": 20, + "start": 13253 + }, + { + "length": 20, + "start": 15635 + } + ] + } + }, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/index.ts b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/index.ts new file mode 100644 index 0000000..be308c7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/index.ts @@ -0,0 +1,18 @@ +import { Task, TaskRunOptions } from '@src'; +import { ManagedPoolDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as ManagedPoolDeployment; + + const addRemoveTokenLib = await task.deployAndVerify('ManagedPoolAddRemoveTokenLib', [], from, force); + const circuitBreakerLib = await task.deployAndVerify('CircuitBreakerLib', [], from, force); + + const args = [input.Vault, input.ProtocolFeePercentagesProvider]; + const factory = await task.deployAndVerify('ManagedPoolFactory', args, from, force, { + CircuitBreakerLib: circuitBreakerLib.address, + ManagedPoolAddRemoveTokenLib: addRemoveTokenLib.address, + }); + + const math = await factory.getWeightedMath(); + await task.verify('ExternalWeightedMath', math, []); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/input.ts b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/input.ts new file mode 100644 index 0000000..236f74b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/input.ts @@ -0,0 +1,14 @@ +import { Task, TaskMode } from '@src'; + +export type ManagedPoolDeployment = { + Vault: string; + ProtocolFeePercentagesProvider: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); + +export default { + Vault, + ProtocolFeePercentagesProvider, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/output/arbitrum.json new file mode 100644 index 0000000..1e77642 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/output/arbitrum.json @@ -0,0 +1,5 @@ +{ + "ManagedPoolAddRemoveTokenLib": "0xF24917fB88261a37Cc57F686eBC831a5c0B9fD39", + "CircuitBreakerLib": "0xE42FFA682A26EF8F25891db4882932711D42e467", + "ManagedPoolFactory": "0x956CCab09898C0AF2aCa5e6C229c3aD4E93d9288" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/output/goerli.json new file mode 100644 index 0000000..66d3104 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/output/goerli.json @@ -0,0 +1,5 @@ +{ + "ManagedPoolAddRemoveTokenLib": "0x0343311A33994a3d27273505560ED73dC2BD0Db3", + "CircuitBreakerLib": "0x782640c4e71F523152AE0942ee7589fB24c8367D", + "ManagedPoolFactory": "0x3EAd2FdcBEE244d9fA5b8d233EfedD34Bb7D2434" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/output/mainnet.json new file mode 100644 index 0000000..148ed0a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/output/mainnet.json @@ -0,0 +1,5 @@ +{ + "ManagedPoolAddRemoveTokenLib": "0xE42FFA682A26EF8F25891db4882932711D42e467", + "CircuitBreakerLib": "0x956CCab09898C0AF2aCa5e6C229c3aD4E93d9288", + "ManagedPoolFactory": "0x9Ac3E70dB606659Bf32D4BdFbb687AD193FD1F5B" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/output/optimism.json b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/output/optimism.json new file mode 100644 index 0000000..1e77642 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/output/optimism.json @@ -0,0 +1,5 @@ +{ + "ManagedPoolAddRemoveTokenLib": "0xF24917fB88261a37Cc57F686eBC831a5c0B9fD39", + "CircuitBreakerLib": "0xE42FFA682A26EF8F25891db4882932711D42e467", + "ManagedPoolFactory": "0x956CCab09898C0AF2aCa5e6C229c3aD4E93d9288" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/output/polygon.json new file mode 100644 index 0000000..148ed0a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/output/polygon.json @@ -0,0 +1,5 @@ +{ + "ManagedPoolAddRemoveTokenLib": "0xE42FFA682A26EF8F25891db4882932711D42e467", + "CircuitBreakerLib": "0x956CCab09898C0AF2aCa5e6C229c3aD4E93d9288", + "ManagedPoolFactory": "0x9Ac3E70dB606659Bf32D4BdFbb687AD193FD1F5B" +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/readme.md b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/readme.md new file mode 100644 index 0000000..0247a5f --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/readme.md @@ -0,0 +1,27 @@ +# 2022-10-21 - Managed Pool Factory + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This factory and associated Pools have been deprecated due to dependencies requiring extra features: this deployment's Pools are not expected to ever be used. +> +> Superseded by this [updated version](../../20230411-managed-pool-v2), which has reentrancy protection, create2, configurable pause window, and other improvements. + +Deployment of the `ManagedPoolFactory`, which allows creating Managed Pools. + +A Managed Pool is a Weighted Pool with mutable tokens and weights, designed to be used in conjunction with an owner contract containing specific business logic. This in turn may support many asset management use cases, such as large token counts, rebalancing through token changes, gradual weight or fee updates, fine-grained control of protocol and management fees, allowlisting of LPs, and more. + +> ⚠️ **DO NOT USE DIRECTLY** ⚠️ +> +> Managed Pools should always be paired with another contract acting as their owner, which should implement sensible security policies. The owner of a Managed Pool has full control over all of its assets. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`ManagedPool` artifact](./artifact/ManagedPool.json) +- [`ManagedPoolFactory` artifact](./artifact/ManagedPoolFactory.json) +- [`ManagedPoolAddRemoveTokenLib` artifact](./artifact/ManagedPoolAddRemoveTokenLib.json) +- [`CircuitBreakerLib` artifact](./artifact/CircuitBreakerLib.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/test/task.fork.ts new file mode 100644 index 0000000..190b3e4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221021-managed-pool/test/task.fork.ts @@ -0,0 +1,248 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumberish, Contract } from 'ethers'; +import { BasePoolEncoder } from '@helpers/models/pools/utils/encoder'; +import { WeightedPoolEncoder } from '@helpers/models/pools/weighted/encoder'; +import { SwapKind } from '@helpers/models/types/types'; +import { toNormalizedWeights } from '@helpers/models/pools/weighted/normalizedWeights'; +import * as expectEvent from '@helpers/expectEvent'; +import { fp } from '@helpers/numbers'; +import { expectEqualWithError } from '@helpers/relativeError'; +import { actionId } from '@helpers/models/misc/actions'; +import { MAX_UINT256, ZERO_ADDRESS } from '@helpers/constants'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { ProtocolFee } from '@helpers/models/types/types'; + +import { getSigner, impersonate, getForkedNetwork, Task, TaskMode, describeForkTest } from '@src'; + +type ManagedPoolParams = { + name: string; + symbol: string; + assetManagers: string[]; + tokens: string[]; + normalizedWeights: BigNumberish[]; + swapFeePercentage: BigNumberish; + swapEnabledOnStart: boolean; + mustAllowlistLPs: boolean; + managementAumFeePercentage: BigNumberish; + aumFeeId: BigNumberish; +}; + +describeForkTest('ManagedPoolFactory', 'mainnet', 15634000, function () { + let owner: SignerWithAddress, whale: SignerWithAddress, govMultisig: SignerWithAddress; + let factory: Contract, + vault: Contract, + authorizer: Contract, + uni: Contract, + comp: Contract, + aave: Contract, + math: Contract; + + let task: Task; + + const COMP = '0xc00e94cb662c3520282e6f5717214004a7f26888'; + const UNI = '0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984'; + const AAVE = '0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9'; + + const tokens = [UNI, AAVE, COMP]; + const initialBalanceCOMP = fp(1e4); + const initialBalanceUNI = fp(1e5); + const initialBalanceAAVE = fp(1e4); + const initialBalances = [initialBalanceUNI, initialBalanceAAVE, initialBalanceCOMP]; + + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + const LARGE_TOKEN_HOLDER = '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503'; + + const NAME = 'Balancer Pool Token'; + const SYMBOL = 'BPT'; + const POOL_SWAP_FEE_PERCENTAGE = fp(0.01); + const POOL_MANAGEMENT_AUM_FEE_PERCENTAGE = fp(0.01); + const WEIGHTS = toNormalizedWeights([fp(20), fp(30), fp(50)]); + + before('run task', async () => { + task = new Task('20221021-managed-pool', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('ManagedPoolFactory'); + math = await task.instanceAt('ExternalWeightedMath', await factory.getWeightedMath()); + }); + + before('load signers', async () => { + owner = await getSigner(); + whale = await impersonate(LARGE_TOKEN_HOLDER); + + govMultisig = await impersonate(GOV_MULTISIG); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + authorizer = await new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance( + 'Authorizer' + ); + + comp = await task.instanceAt('IERC20', COMP); + uni = await task.instanceAt('IERC20', UNI); + aave = await task.instanceAt('IERC20', AAVE); + }); + + async function createPool(swapEnabled = true, mustAllowlistLPs = false): Promise { + const assetManagers: string[] = Array(tokens.length).fill(ZERO_ADDRESS); + assetManagers[0] = owner.address; + + const newPoolParams: ManagedPoolParams = { + name: NAME, + symbol: SYMBOL, + tokens: tokens, + normalizedWeights: WEIGHTS, + assetManagers: assetManagers, + swapFeePercentage: POOL_SWAP_FEE_PERCENTAGE, + swapEnabledOnStart: swapEnabled, + mustAllowlistLPs: mustAllowlistLPs, + managementAumFeePercentage: POOL_MANAGEMENT_AUM_FEE_PERCENTAGE, + aumFeeId: ProtocolFee.AUM, + }; + + const receipt = await (await factory.connect(owner).create(newPoolParams, owner.address)).wait(); + + const event = expectEvent.inReceipt(receipt, 'PoolCreated'); + return task.instanceAt('ManagedPool', event.args.pool); + } + + describe('create and swap', () => { + let pool: Contract; + let poolId: string; + + it('deploy a managed pool', async () => { + pool = await createPool(); + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + + expect(registeredAddress).to.equal(pool.address); + }); + + it('initialize the pool', async () => { + await comp.connect(whale).approve(vault.address, MAX_UINT256); + await uni.connect(whale).approve(vault.address, MAX_UINT256); + await aave.connect(whale).approve(vault.address, MAX_UINT256); + + const userData = WeightedPoolEncoder.joinInit(initialBalances); + // This is a composable pool, so assets array has to contain BPT. + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: [pool.address, ...tokens], + maxAmountsIn: [MAX_UINT256, ...initialBalances], + fromInternalBalance: false, + userData, + }); + + const { balances } = await vault.getPoolTokens(poolId); + const totalSupply = await pool.totalSupply(); + const ownerBpt = await pool.balanceOf(owner.address); + const minBpt = await pool.balanceOf(ZERO_ADDRESS); + + expect(balances).to.deep.equal([totalSupply.sub(ownerBpt).sub(minBpt), ...initialBalances]); + }); + + it('swap in the pool', async () => { + const amount = fp(500); + await comp.connect(whale).transfer(owner.address, amount); + await comp.connect(owner).approve(vault.address, amount); + + await vault + .connect(owner) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: COMP, assetOut: UNI, amount, userData: '0x' }, + { sender: owner.address, recipient: owner.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert pool swap + const expectedUNI = await math.calcOutGivenIn( + initialBalanceCOMP, + WEIGHTS[tokens.indexOf(COMP)], + initialBalanceUNI, + WEIGHTS[tokens.indexOf(UNI)], + amount + ); + expectEqualWithError(await comp.balanceOf(owner.address), 0, 0.0001); + expectEqualWithError(await uni.balanceOf(owner.address), expectedUNI, 0.1); + }); + }); + + describe('recovery mode', () => { + let pool: Contract; + let poolId: string; + + before('deploy and initialize a stable pool', async () => { + pool = await createPool(); + poolId = await pool.getPoolId(); + + await comp.connect(whale).approve(vault.address, MAX_UINT256); + await uni.connect(whale).approve(vault.address, MAX_UINT256); + await aave.connect(whale).approve(vault.address, MAX_UINT256); + + const userData = WeightedPoolEncoder.joinInit(initialBalances); + // This is a composable pool, so assets array has to contain BPT. + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: [pool.address, ...tokens], + maxAmountsIn: [MAX_UINT256, ...initialBalances], + fromInternalBalance: false, + userData, + }); + }); + + before('enter recovery mode', async () => { + await authorizer.connect(govMultisig).grantRole(await actionId(pool, 'enableRecoveryMode'), govMultisig.address); + await pool.connect(govMultisig).enableRecoveryMode(); + expect(await pool.inRecoveryMode()).to.be.true; + }); + + it('can exit via recovery mode', async () => { + const bptBalance = await pool.balanceOf(owner.address); + expect(bptBalance).to.gt(0); + + const vaultUNIBalanceBeforeExit = await uni.balanceOf(vault.address); + const ownerUNIBalanceBeforeExit = await uni.balanceOf(owner.address); + + const userData = BasePoolEncoder.recoveryModeExit(bptBalance); + const tokensWithBpt = [pool.address, ...tokens]; + await vault.connect(owner).exitPool(poolId, owner.address, owner.address, { + assets: tokensWithBpt, + minAmountsOut: Array(tokensWithBpt.length).fill(0), + fromInternalBalance: false, + userData, + }); + + const remainingBalance = await pool.balanceOf(owner.address); + expect(remainingBalance).to.equal(0); + + const vaultUNIBalanceAfterExit = await uni.balanceOf(vault.address); + const ownerUNIBalanceAfterExit = await uni.balanceOf(owner.address); + + expect(vaultUNIBalanceAfterExit).to.lt(vaultUNIBalanceBeforeExit); + expect(ownerUNIBalanceAfterExit).to.gt(ownerUNIBalanceBeforeExit); + }); + }); + + describe('factory disable', () => { + it('the factory can be disabled', async () => { + await authorizer.connect(govMultisig).grantRole(await actionId(factory, 'disable'), govMultisig.address); + await factory.connect(govMultisig).disable(); + + expect(await factory.isDisabled()).to.be.true; + + const newPoolParams: ManagedPoolParams = { + name: NAME, + symbol: SYMBOL, + tokens: tokens, + normalizedWeights: WEIGHTS, + assetManagers: Array(tokens.length).fill(ZERO_ADDRESS), + swapFeePercentage: POOL_SWAP_FEE_PERCENTAGE, + swapEnabledOnStart: true, + mustAllowlistLPs: true, + managementAumFeePercentage: POOL_MANAGEMENT_AUM_FEE_PERCENTAGE, + aumFeeId: ProtocolFee.AUM, + }; + await expect(factory.connect(owner).create(newPoolParams, owner.address)).to.be.revertedWith('BAL#211'); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/artifact/ComposableStablePool.json b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/artifact/ComposableStablePool.json new file mode 100644 index 0000000..9f0001b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/artifact/ComposableStablePool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"components": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "contract IProtocolFeePercentagesProvider", "name": "protocolFeeProvider", "type": "address"}, {"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20[]", "name": "tokens", "type": "address[]"}, {"internalType": "contract IRateProvider[]", "name": "rateProviders", "type": "address[]"}, {"internalType": "uint256[]", "name": "tokenRateCacheDurations", "type": "uint256[]"}, {"internalType": "bool[]", "name": "exemptFromYieldProtocolFeeFlags", "type": "bool[]"}, {"internalType": "uint256", "name": "amplificationParameter", "type": "uint256"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "string", "name": "version", "type": "string"}], "internalType": "struct ComposableStablePool.NewPoolParams", "name": "params", "type": "tuple"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "startValue", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "endValue", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "startTime", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "endTime", "type": "uint256"}], "name": "AmpUpdateStarted", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "currentValue", "type": "uint256"}], "name": "AmpUpdateStopped", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "feeType", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "protocolFeePercentage", "type": "uint256"}], "name": "ProtocolFeePercentageCacheUpdated", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "enabled", "type": "bool"}], "name": "RecoveryModeStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "tokenIndex", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "rate", "type": "uint256"}], "name": "TokenRateCacheUpdated", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "tokenIndex", "type": "uint256"}, {"indexed": true, "internalType": "contract IRateProvider", "name": "provider", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "cacheDuration", "type": "uint256"}], "name": "TokenRateProviderSet", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DELEGATE_PROTOCOL_SWAP_FEES_SENTINEL", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "disableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "enableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getActualSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAmplificationParameter", "outputs": [{"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "bool", "name": "isUpdating", "type": "bool"}, {"internalType": "uint256", "name": "precision", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getBptIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getDomainSeparator", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getLastJoinExitData", "outputs": [{"internalType": "uint256", "name": "lastJoinExitAmplification", "type": "uint256"}, {"internalType": "uint256", "name": "lastPostJoinExitInvariant", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMinimumBpt", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "pure", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "getNextNonce", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "feeType", "type": "uint256"}], "name": "getProtocolFeePercentageCache", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getProtocolFeesCollector", "outputs": [{"internalType": "contract IProtocolFeesCollector", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getProtocolSwapFeeDelegation", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRateProviders", "outputs": [{"internalType": "contract IRateProvider[]", "name": "", "type": "address[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getScalingFactors", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "getTokenRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "getTokenRateCache", "outputs": [{"internalType": "uint256", "name": "rate", "type": "uint256"}, {"internalType": "uint256", "name": "oldRate", "type": "uint256"}, {"internalType": "uint256", "name": "duration", "type": "uint256"}, {"internalType": "uint256", "name": "expires", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "inRecoveryMode", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "isTokenExemptFromYieldProtocolFee", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "swapRequest", "type": "tuple"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "indexIn", "type": "uint256"}, {"internalType": "uint256", "name": "indexOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "bytes", "name": "poolConfig", "type": "bytes"}], "name": "setAssetManagerPoolConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "uint256", "name": "duration", "type": "uint256"}], "name": "setTokenRateCacheDuration", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "rawEndValue", "type": "uint256"}, {"internalType": "uint256", "name": "endTime", "type": "uint256"}], "name": "startAmplificationParameterUpdate", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "stopAmplificationParameterUpdate", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "updateProtocolFeePercentageCache", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "updateTokenRateCache", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "version", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/artifact/ComposableStablePoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/artifact/ComposableStablePoolFactory.json new file mode 100644 index 0000000..0da8ddd --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/artifact/ComposableStablePoolFactory.json @@ -0,0 +1,287 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ComposableStablePoolFactory", + "sourceName": "contracts/ComposableStablePoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "poolVersion", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "amplificationParameter", + "type": "uint256" + }, + { + "internalType": "contract IRateProvider[]", + "name": "rateProviders", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenRateCacheDurations", + "type": "uint256[]" + }, + { + "internalType": "bool[]", + "name": "exemptFromYieldProtocolFeeFlags", + "type": "bool[]" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract ComposableStablePool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeePercentagesProvider", + "outputs": [ + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101806040523480156200001257600080fd5b50604051620097243803806200972483398101604081905262000035916200036d565b83836040518060200162000049906200021c565b601f1982820381018352601f90910116604052805183903090839060006002820460a081905280830360e08190528185529091508362000095816200013d602090811b6200067c17901c565b60601b6001600160601b0319166080528285018051838252620000c4826200013d602090811b6200067c17901c565b6001600160601b0319606091821b811660c05296909352905261010095909552505092821b831661012052509290921b909116610140525050426276a700016101605281516200011c9060029060208501906200022a565b508051620001329060039060208401906200022a565b505050505062000415565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506200018b6001600160a01b03831615156101ac62000191565b50919050565b81620001a257620001a281620001a6565b5050565b620001b8816210905360ea1b620001bb565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b617ff3806200173183390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200026d57805160ff19168380011785556200029d565b828001600101855582156200029d579182015b828111156200029d57825182559160200191906001019062000280565b50620002ab929150620002af565b5090565b5b80821115620002ab5760008155600101620002b0565b600082601f830112620002d7578081fd5b81516001600160401b0380821115620002ee578283fd5b6040516020601f8401601f191682018101838111838210171562000310578586fd5b806040525081945083825286818588010111156200032d57600080fd5b600092505b8383101562000351578583018101518284018201529182019162000332565b83831115620003635760008185840101525b5050505092915050565b6000806000806080858703121562000383578384fd5b84516200039081620003ff565b6020860151909450620003a381620003ff565b60408601519093506001600160401b0380821115620003c0578384fd5b620003ce88838901620002c6565b93506060870151915080821115620003e4578283fd5b50620003f387828801620002c6565b91505092959194509250565b6001600160a01b0381168114620001b857600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405160601c610160516112a36200048e60003980610232528061025b52508061055d5250806105d35250806105835250806106e3525080610209528061075f5250806107045250806101e8528061073b52506112a36000f3fe608060405234801561001057600080fd5b50600436106100de5760003560e01c80636634b7531161008c578063739238d611610066578063739238d61461018f578063851c1bb3146101975780638d928af8146101b7578063aaabadc5146101bf576100de565b80636634b7531461014757806366b59f6c146101675780636c57f5a914610187576100de565b80632f2770db116100bd5780632f2770db1461012d5780633f819b6f1461013757806354fd4d501461013f576100de565b8062c194db146100e3578063174481fa146101015780632da47c4014610117575b600080fd5b6100eb6101c7565b6040516100f89190611050565b60405180910390f35b6101096101e6565b6040516100f8929190610fe9565b61011f61022c565b6040516100f89291906111e8565b610135610296565b005b6100eb6102fb565b6100eb6103af565b61015a610155366004610cdd565b61042b565b6040516100f89190611010565b61017a610175366004610d71565b610456565b6040516100f89190611063565b61015a610552565b61017a61055b565b6101aa6101a5366004610d15565b61057f565b6040516100f8919061101b565b61017a6105d1565b61017a6105f5565b60606101e1604051806020016040528060008152506106db565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561028857807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610291565b60009250600091505b509091565b61029e6107b4565b6102a66107fd565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156103a55780601f1061037a576101008083540402835291602001916103a5565b820191906000526020600020905b81548152906001019060200180831161038857829003601f168201915b5050505050905090565b60028054604080516020601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156103a55780601f1061037a576101008083540402835291602001916103a5565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b600080600061046361022c565b91509150610542604051806101c0016040528061047e6105d1565b73ffffffffffffffffffffffffffffffffffffffff1681526020016104a161055b565b73ffffffffffffffffffffffffffffffffffffffff1681526020018e81526020018d81526020018c81526020018a81526020018981526020018881526020018b81526020018781526020018481526020018381526020018673ffffffffffffffffffffffffffffffffffffffff16815260200161051c6102fb565b905260405161052e9190602001611084565b604051602081830303815290604052610812565b9c9b505050505050505050505050565b60015460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016105b4929190610fb9565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006105ff6105d1565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561064457600080fd5b505afa158015610658573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e19190610d55565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506106d573ffffffffffffffffffffffffffffffffffffffff831615156101ac6108a6565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016107a68183866108b8565b505050505050505050919050565b60006107e36000357fffffffff000000000000000000000000000000000000000000000000000000001661057f565b90506107fa6107f28233610932565b6101916108a6565b50565b610810610808610552565b1560d36108a6565b565b600061081c6107fd565b6000610827836109d1565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b816108b4576108b481610a19565b5050565b5b602081106108f65781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016108b9565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600061093c6105f5565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040161097893929190611024565b60206040518083038186803b15801561099057600080fd5b505afa1580156109a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c89190610cf9565b90505b92915050565b600060606109de836106db565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff8116610a12573d6000803e3d6000fd5b9392505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526107fa917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b80356109cb8161123d565b600082601f830112610ac3578081fd5b8135610ad6610ad18261121d565b6111f6565b818152915060208083019084810181840286018201871015610af757600080fd5b60005b84811015610b1f578135610b0d8161125f565b84529282019290820190600101610afa565b505050505092915050565b600082601f830112610b3a578081fd5b8135610b48610ad18261121d565b818152915060208083019084810181840286018201871015610b6957600080fd5b60005b84811015610b1f578135610b7f8161123d565b84529282019290820190600101610b6c565b600082601f830112610ba1578081fd5b8135610baf610ad18261121d565b818152915060208083019084810181840286018201871015610bd057600080fd5b60005b84811015610b1f578135610be68161123d565b84529282019290820190600101610bd3565b600082601f830112610c08578081fd5b8135610c16610ad18261121d565b818152915060208083019084810181840286018201871015610c3757600080fd5b60005b84811015610b1f57813584529282019290820190600101610c3a565b600082601f830112610c66578081fd5b813567ffffffffffffffff811115610c7c578182fd5b610cad60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016111f6565b9150808252836020828501011115610cc457600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215610cee578081fd5b8135610a128161123d565b600060208284031215610d0a578081fd5b8151610a128161125f565b600060208284031215610d26578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610a12578182fd5b600060208284031215610d66578081fd5b8151610a128161123d565b60008060008060008060008060006101208a8c031215610d8f578485fd5b893567ffffffffffffffff80821115610da6578687fd5b610db28d838e01610c56565b9a5060208c0135915080821115610dc7578687fd5b610dd38d838e01610c56565b995060408c0135915080821115610de8578687fd5b610df48d838e01610b2a565b985060608c0135975060808c0135915080821115610e10578687fd5b610e1c8d838e01610b91565b965060a08c0135915080821115610e31578586fd5b610e3d8d838e01610bf8565b955060c08c0135915080821115610e52578485fd5b50610e5f8c828d01610ab3565b93505060e08a01359150610e778b6101008c01610aa8565b90509295985092959850929598565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208085019450808401835b83811015610ed1578151151587529582019590820190600101610eb3565b509495945050505050565b6000815180845260208085019450808401835b83811015610ed157815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101610eef565b6000815180845260208085019450808401835b83811015610ed157815187529582019590820190600101610f34565b60008151808452815b81811015610f7557602081850181015186830182015201610f59565b81811115610f865782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b6000602082526109c86020830184610f50565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600060208252611098602083018451610e86565b60208301516110aa6040840182610e86565b5060408301516101c08060608501526110c76101e0850183610f50565b915060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808685030160808701526111038483610f50565b935060808701519150808685030160a08701526111208483610edc565b935060a08701519150808685030160c087015261113d8483610edc565b935060c08701519150808685030160e087015261115a8483610f21565b935060e087015191506101008187860301818801526111798584610ea0565b908801516101208881019190915288015161014080890191909152880151610160808901919091528801516101808089019190915288015190945091506101a06111c581880184610e86565b8701518685039091018387015290506111de8382610f50565b9695505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561121557600080fd5b604052919050565b600067ffffffffffffffff821115611233578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff811681146107fa57600080fd5b80151581146107fa57600080fdfea2646970667358221220139c11f5919330a49b431e9ec65da6abcaecfa2895b17cea9c855010670ff62c64736f6c634300070100336105006040523480156200001257600080fd5b5060405162007ff338038062007ff3833981016040819052620000359162001b55565b6020810151600019620000488362000d93565b620000538462000dcc565b8461010001518560000151600087604001518860600151620000808a608001513062000e1560201b60201c565b8a60800151516001016001600160401b03811180156200009f57600080fd5b50604051908082528060200260200182016040528015620000ca578160200160208202803683370190505b508b61012001518c61014001518d61016001518e6101800151828289898d85336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b815250878781600390805190602001906200012c929190620017f2565b50805162000142906004906020840190620017f2565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001c090506276a70083111561019462000faf565b620001d462278d0082111561019562000faf565b4290910161014081905201610160528551620001f6906002111560c862000faf565b620002106200020462000fc4565b8751111560c962000faf565b620002268662000fc960201b6200154e1760201c565b620002318462000fd5565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f9062000262908d9060040162001ddb565b602060405180830381600087803b1580156200027d57600080fd5b505af115801562000292573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b8919062001b1d565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002ed9084908b908b9060040162001d3f565b600060405180830381600087803b1580156200030857600080fd5b505af11580156200031d573d6000803e3d6000fd5b505050508061018081815250508a6001600160a01b031663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200036457600080fd5b505afa15801562000379573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200039f919062001b36565b60601b6001600160601b0319166101a05250620003d1995050506001891015965061012c955062000faf945050505050565b620003e461138882111561012d62000faf565b6000620003ff826103e86200106960201b620015581760201c565b90506200040c8162001098565b5050805151620004216002821160c862000faf565b6200044660018203836020015151846040015151620010d760201b620015831760201c565b6101c0819052815180516000906200045a57fe5b60200260200101516001600160a01b0316610200816001600160a01b031660601b8152505081600001516001815181106200049157fe5b60200260200101516001600160a01b0316610220816001600160a01b031660601b815250508160000151600281518110620004c857fe5b60200260200101516001600160a01b0316610240816001600160a01b031660601b8152505060038111620004fe57600062000517565b8151805160039081106200050e57fe5b60200260200101515b60601b6001600160601b03191661026052600481116200053957600062000552565b8151805160049081106200054957fe5b60200260200101515b60601b6001600160601b0319166102805260058111620005745760006200058d565b8151805160059081106200058457fe5b60200260200101515b60601b6001600160601b0319166102a05281518051620005c69190600090620005b257fe5b6020026020010151620010f760201b60201c565b6102c05281518051620005e091906001908110620005b257fe5b6102e05281518051620005fa91906002908110620005b257fe5b61030052600381116200060f57600062000625565b620006258260000151600381518110620005b257fe5b61032052600481116200063a57600062000650565b620006508260000151600481518110620005b257fe5b6103405260058111620006655760006200067b565b6200067b8260000151600581518110620005b257fe5b61036052815151600019015b600081118015620006b857508251805130919083908110620006a557fe5b60200260200101516001600160a01b0316115b15620006c8576000190162000687565b6101e08190528251516060906001600160401b0381118015620006ea57600080fd5b5060405190808252806020026020018201604052801562000715578160200160208202803683370190505b50905060008080805b8751518110156200093857858110156200085457876020015181815181106200074357fe5b60200260200101518582815181106200075857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050620007c160006001600160a01b03168683815181106200079457fe5b60200260200101516001600160a01b031614158260060186620011c660201b620015a0179092919060201c565b935087604001518181518110620007d457fe5b60200260200101511562000849576200082060006001600160a01b0316868381518110620007fe57fe5b60200260200101516001600160a01b0316141561015562000faf60201b60201c565b6200083d60018286620011c660201b620015a0179092919060201c565b9350600192506200084e565b600191505b6200092f565b8581146200092f57876020015160018203815181106200087057fe5b60200260200101518582815181106200088557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050620008c160006001600160a01b03168683815181106200079457fe5b935087604001516001820381518110620008d757fe5b6020026020010151156200092a576200090160006001600160a01b0316868381518110620007fe57fe5b6200091e60018286620011c660201b620015a0179092919060201c565b9350600192506200092f565b600191505b6001016200071e565b50811560f890811b610460528115901b61048052835184906000906200095a57fe5b60200260200101516001600160a01b0316610380816001600160a01b031660601b81525050836001815181106200098d57fe5b60200260200101516001600160a01b03166103a0816001600160a01b031660601b8152505083600281518110620009c057fe5b60200260200101516001600160a01b03166103c0816001600160a01b031660601b815250506003845111620009f757600062000a0e565b8360038151811062000a0557fe5b60200260200101515b60601b6001600160601b0319166103e052835160041062000a3157600062000a48565b8360048151811062000a3f57fe5b60200260200101515b60601b6001600160601b03191661040052835160051062000a6b57600062000a82565b8360058151811062000a7957fe5b60200260200101515b60601b6001600160601b0319166104205250506104405250508251516020808501515160408601515162000ac595509293509190620010d7811b6200158317901c565b805160609062000ad6903062000e15565b8051909150600019015b60008111801562000b165750306001600160a01b031682828151811062000b0357fe5b60200260200101516001600160a01b0316115b1562000b26576000190162000ae0565b6000805b84515181101562000c3f578281141562000b4357600191505b60208501518051828401916000918490811062000b5c57fe5b60200260200101516001600160a01b03161462000c355762000bb6818760200151848151811062000b8957fe5b60200260200101518860400151858151811062000ba257fe5b6020026020010151620011ef60201b60201c565b8560200151828151811062000bc757fe5b60200260200101516001600160a01b0316817fdd6d1c9badb346de6925b358a472c937b41698d2632696759e43fd6527feeec48860400151858151811062000c0b57fe5b602002602001015160405162000c22919062001df0565b60405180910390a362000c3581620012ea565b5060010162000b2a565b5050505050600019811460f881901b6104c0526001600160601b0319606084901b166104a05262000c7283600262001329565b62000c7f83600362001329565b801562000c995762000c9383600062001329565b62000d58565b60405163178b2b9360e21b815262000d2d906001600160a01b03851690635e2cae4c9062000ccd9060009060040162001df0565b60206040518083038186803b15801562000ce657600080fd5b505afa15801562000cfb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d21919062001b1d565b83111561025862000faf565b600060008051602062007fd38339815191528360405162000d4f919062001df0565b60405180910390a25b8062000d65578162000d68565b60005b6104e0525050506101a0810151805162000d8b91600d91602090910190620017f2565b505062001e62565b62000d9d62001873565b6040518060600160405280836080015181526020018360a0015181526020018360c0015181525090505b919050565b62000dd662001873565b604051806060016040528062000df784608001513062000e1560201b60201c565b81526020018360a0015181526020018360e001518152509050919050565b606082516001016001600160401b038111801562000e3257600080fd5b5060405190808252806020026020018201604052801562000e5d578160200160208202803683370190505b50905082516000141562000ea057818160008151811062000e7a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505062000fa9565b82515b60008111801562000edc5750826001600160a01b031684600183038151811062000ec957fe5b60200260200101516001600160a01b0316115b1562000f295783600182038151811062000ef257fe5b602002602001015182828151811062000f0757fe5b6001600160a01b03909216602092830291909101909101526000190162000ea3565b60005b8181101562000f785784818151811062000f4257fe5b602002602001015183828151811062000f5757fe5b6001600160a01b039092166020928302919091019091015260010162000f2c565b508282828151811062000f8757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050505b92915050565b8162000fc05762000fc081620014d4565b5050565b600690565b8062000fc081620014e9565b62000fee62000fe362001570565b82101560cb62000faf565b6200100762000ffc62001579565b82111560ca62000faf565b620010298160c0603f6008546200158560201b620015c717909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906200105e90839062001df0565b60405180910390a150565b600082820262001091841580620010895750838583816200108657fe5b04145b600362000faf565b9392505050565b620010a681804280620015aa565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a0233816040516200105e919062001df0565b620010f28284148015620010ea57508183145b606762000faf565b505050565b60006001600160a01b0382163014156200111b5750670de0b6b3a764000062000dc7565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200115757600080fd5b505afa1580156200116c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001192919062001d1c565b60ff1690506000620011b16012836200161d60201b620015ef1760201c565b600a0a670de0b6b3a764000002949350505050565b60006001821b1984168284620011de576000620011e1565b60015b60ff16901b17949350505050565b6000826001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200122b57600080fd5b505afa15801562001240573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001266919062001b1d565b6000858152600a602090815260409091205491925062001295908290849086906200160562001635821b17901c565b6000868152600a602052604090819020919091555185907fb77a83204ca282e08dc3a65b0a1ca32ea4e6875c38ef0bf5bf75e52a67354fac90620012db90859062001df0565b60405180910390a25050505050565b6000818152600a602090815260409091205490620013139082906200163d62001691821b17901c565b6000928352600a60205260409092209190915550565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c3263906200135a90859060040162001df0565b60206040518083038186803b1580156200137357600080fd5b505afa15801562001388573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620013ae919062001b1d565b905081620013f257620013cc81620016bc60201b620016551760201c565b600b80546001600160401b0319166001600160401b0392909216919091179055620014a6565b600282141562001448576200141281620016bc60201b620016551760201c565b600b80546001600160401b03929092166801000000000000000002600160401b600160801b0319909216919091179055620014a6565b600382141562001499576200146881620016bc60201b620016551760201c565b600b80546001600160401b0392909216600160801b02600160801b600160c01b0319909216919091179055620014a6565b620014a66101bb620014d4565b8160008051602062007fd383398151915282604051620014c7919062001df0565b60405180910390a2505050565b620014e6816210905360ea1b620016da565b50565b600281511015620014fa57620014e6565b6000816000815181106200150a57fe5b602002602001015190506000600190505b8251811015620010f25760008382815181106200153457fe5b6020026020010151905062001565816001600160a01b0316846001600160a01b031610606562000faf60201b60201c565b91506001016200151b565b64e8d4a5100090565b67016345785d8a000090565b6000620015948484846200173b565b506001901b60001901811b1992909216911b1790565b620015c48160c060406200179660201b620016721760201c565b620015de83608060406200179660201b620016721760201c565b620015f7856040806200179660201b620016721760201c565b6200161187600060406200179660201b620016721760201c565b17171760095550505050565b60006200162f83831115600162000faf565b50900390565b60006200164a606084901c1561014962000faf565b6200168942830160e06020620016738660c083838c8c60006060620015c762001585871b17861c565b6200158560201b620015c717909392919060201c565b949350505050565b600062000fa9620016a283620017ab565b606080856200158560201b620015c717909392919060201c565b6000620016d66001600160401b038311156101ba62000faf565b5090565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6200174c6101008310606462000faf565b62001785600182101580156200177d57506200177960ff8461010003620017cb60201b620016851760201c565b8211155b606462000faf565b620010f283821c156101b462000faf565b6000620017a58484846200173b565b50501b90565b600062000fa96000606084620017e360201b6200169b179092919060201c565b6000818310620017dc578162001091565b5090919050565b6001901b6000190191901c1690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200183557805160ff191683800117855562001865565b8280016001018555821562001865579182015b828111156200186557825182559160200191906001019062001848565b50620016d692915062001894565b60405180606001604052806060815260200160608152602001606081525090565b5b80821115620016d6576000815560010162001895565b805162000fa98162001e4c565b600082601f830112620018c9578081fd5b8151620018e0620018da8262001e20565b62001df9565b8181529150602080830190848101818402860182018710156200190257600080fd5b6000805b858110156200193257825180151581146200191f578283fd5b8552938301939183019160010162001906565b50505050505092915050565b600082601f8301126200194f578081fd5b815162001960620018da8262001e20565b8181529150602080830190848101818402860182018710156200198257600080fd5b60005b84811015620019ae5781516200199b8162001e4c565b8452928201929082019060010162001985565b505050505092915050565b600082601f830112620019ca578081fd5b8151620019db620018da8262001e20565b818152915060208083019084810181840286018201871015620019fd57600080fd5b60005b84811015620019ae57815162001a168162001e4c565b8452928201929082019060010162001a00565b600082601f83011262001a3a578081fd5b815162001a4b620018da8262001e20565b81815291506020808301908481018184028601820187101562001a6d57600080fd5b60005b84811015620019ae5781518452928201929082019060010162001a70565b600082601f83011262001a9f578081fd5b81516001600160401b0381111562001ab5578182fd5b602062001acb601f8301601f1916820162001df9565b9250818352848183860101111562001ae257600080fd5b60005b8281101562001b0257848101820151848201830152810162001ae5565b8281111562001b145760008284860101525b50505092915050565b60006020828403121562001b2f578081fd5b5051919050565b60006020828403121562001b48578081fd5b8151620010918162001e4c565b60006020828403121562001b67578081fd5b81516001600160401b038082111562001b7e578283fd5b81840191506101c080838703121562001b95578384fd5b62001ba08162001df9565b905062001bae8684620018ab565b815262001bbf8660208501620018ab565b602082015260408301518281111562001bd6578485fd5b62001be48782860162001a8e565b60408301525060608301518281111562001bfc578485fd5b62001c0a8782860162001a8e565b60608301525060808301518281111562001c22578485fd5b62001c30878286016200193e565b60808301525060a08301518281111562001c48578485fd5b62001c5687828601620019b9565b60a08301525060c08301518281111562001c6e578485fd5b62001c7c8782860162001a29565b60c08301525060e08301518281111562001c94578485fd5b62001ca287828601620018b8565b60e083015250610100838101519082015261012080840151908201526101408084015190820152610160808401519082015261018062001ce587828601620018ab565b908201526101a0838101518381111562001cfd578586fd5b62001d0b8882870162001a8e565b918301919091525095945050505050565b60006020828403121562001d2e578081fd5b815160ff8116811462001091578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562001d8b5762001d78855162001e40565b8352938301939183019160010162001d63565b505084810360408601528551808252908201925081860190845b8181101562001dcd5762001dba835162001e40565b8552938301939183019160010162001da5565b509298975050505050505050565b602081016003831062001dea57fe5b91905290565b90815260200190565b6040518181016001600160401b038111828210171562001e1857600080fd5b604052919050565b60006001600160401b0382111562001e36578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114620014e657600080fd5b60805160a05160c05160e0516101005160601c6101205160601c6101405161016051610180516101a05160601c6101c0516101e0516102005160601c6102205160601c6102405160601c6102605160601c6102805160601c6102a05160601c6102c0516102e051610300516103205161034051610360516103805160601c6103a05160601c6103c05160601c6103e05160601c6104005160601c6104205160601c610440516104605160f81c6104805160f81c6104a05160601c6104c05160f81c6104e051615fb36200202060003980610e2552508061090a52508061088a52806108b552806108e05250806147a9525080614785525080612b3c52806143fe525080611c5c525080611c2c525080611bfc525080611bcc525080611b9c525080611b6c525080612fcc525080612f9c525080612f6c525080612f3c525080612f0c525080612edc525080611eb9525080611e77525080611e35525080611df3525080611db1525080611d6f52508061104e5250806116ca525080611279525080610be4525080611b40525080611b1c52508061114e52508061112a525080611086525080612d4a525080612d8c525080612d6b5250615fb36000f3fe608060405234801561001057600080fd5b50600436106103785760003560e01c806370464016116101d3578063a457c2d711610104578063d505accf116100a2578063ddf4627b1161007c578063ddf4627b146106e3578063eb0f24d6146106eb578063ed24911d146106f3578063f4b7964d146106fb57610378565b8063d505accf146106aa578063d5c096c4146106bd578063dd62ed3e146106d057610378565b8063ab7759f1116100de578063ab7759f11461067f578063b35056b814610692578063b7b814fc1461069a578063d2946c2b146106a257610378565b8063a457c2d714610651578063a9059cbb14610664578063aaabadc51461067757610378565b8063851c1bb311610171578063893d20e81161014b578063893d20e8146106195780638d928af81461062e57806390193b7c1461063657806395d89b411461064957610378565b8063851c1bb3146105eb578063876f303b146105fe57806387ec68171461060657610378565b80637ecebe00116101ad5780637ecebe00146105a55780637f1260d1146105b857806382687a56146105db5780638456cb59146105e357610378565b8063704640161461055e57806370a082311461057157806374f3b0091461058457610378565b80633644e515116102ad57806354a844ba1161024b57806355c676281161022557806355c67628146105165780636028bfd41461051e578063679aefce1461053f5780636daccffa1461054757610378565b806354a844ba146104f357806354dea00a146104fb57806354fd4d501461050e57610378565b8063395093511161028757806339509351146104af5780633c975d51146104c25780633f4ba83a146104d857806350dd6ed9146104e057610378565b80633644e5151461048c57806338e9922e1461049457806338fff2d0146104a757610378565b80631c0de0511161031a57806323b872dd116102f457806323b872dd1461043e5780632df2c7c0146104515780632f1a0bc914610464578063313ce5671461047757610378565b80631c0de051146103fd5780631dd746ea14610414578063238a2d591461042957610378565b8063095ea7b311610356578063095ea7b3146103c35780630da0669c146103e357806315b0015b146103ed57806318160ddd146103f557610378565b806301ec954a1461037d57806304842d4c146103a657806306fdde03146103ae575b600080fd5b61039061038b366004615a13565b61070e565b60405161039d9190615dc3565b60405180910390f35b6103906107b4565b6103b66107c3565b60405161039d9190615e99565b6103d66103d1366004615638565b610859565b60405161039d9190615da0565b6103eb610870565b005b6103d6610908565b61039061092c565b610405610932565b60405161039d93929190615dab565b61041c61095b565b60405161039d9190615d68565b610431610965565b60405161039d9190615d1b565b6103d661044c366004615588565b610a00565b6103eb61045f366004615534565b610a74565b6103eb610472366004615b62565b610ad0565b61047f610bb3565b60405161039d9190615f04565b610390610bbc565b6103eb6104a2366004615b32565b610bc6565b610390610be2565b6103d66104bd366004615638565b610c06565b6104ca610c41565b60405161039d929190615edb565b6103eb610c6c565b6103eb6104ee36600461584e565b610c7e565b6103eb610c9c565b610390610509366004615534565b610cae565b6103b6610cc9565b610390610d2a565b61053161052c36600461574f565b610d3d565b60405161039d929190615eac565b610390610d74565b61054f610de0565b60405161039d93929190615ec5565b61039061056c366004615b32565b610dfb565b61039061057f366004615534565b610ec1565b61059761059236600461574f565b610edc565b60405161039d929190615d7b565b6103906105b3366004615534565b610fdf565b6105cb6105c6366004615534565b610fea565b60405161039d9493929190615ee9565b61039061104c565b6103eb611070565b6103906105f93660046157f2565b611082565b6103906110d4565b61053161061436600461574f565b611102565b610621611128565b60405161039d9190615d07565b61062161114c565b610390610644366004615534565b611170565b6103b661118b565b6103d661065f366004615638565b6111ec565b6103d6610672366004615638565b61122a565b610621611237565b6103d661068d366004615534565b611241565b6103d6611254565b6103eb611265565b610621611277565b6103eb6106b83660046155c8565b61129b565b6105976106cb36600461574f565b611326565b6103906106de366004615550565b611449565b610390611486565b6103eb61148c565b6103906114b8565b6103eb610709366004615638565b6114c2565b6000846080015161073b61072061114c565b6001600160a01b0316336001600160a01b03161460cd6116aa565b610750610746610be2565b82146101f46116aa565b6107586116b8565b61076a84846107656116c8565b6116ec565b6060610774611704565b905060008751600181111561078557fe5b1461079c57610797878787878561179d565b6107a9565b6107a987878787856117f6565b979650505050505050565b60006107be611831565b905090565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561084f5780601f106108245761010080835404028352916020019161084f565b820191906000526020600020905b81548152906001019060200180831161083257829003601f168201915b5050505050905090565b6000610866338484611838565b5060015b92915050565b6108786118a0565b610880610908565b156108b0576108b07f0000000000000000000000000000000000000000000000000000000000000000600061190d565b6108db7f0000000000000000000000000000000000000000000000000000000000000000600261190d565b6109067f0000000000000000000000000000000000000000000000000000000000000000600361190d565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061093f611afd565b15925061094a611b1a565b9150610954611b3e565b9050909192565b60606107be611704565b606060006109716116c8565b905060608167ffffffffffffffff8111801561098c57600080fd5b506040519080825280602002602001820160405280156109b6578160200160208202803683370190505b50905060005b828110156109f9576109cd81611b62565b8282815181106109d957fe5b6001600160a01b03909216602092830291909101909101526001016109bc565b5091505090565b600080610a0d8533611449565b9050610a31336001600160a01b0387161480610a295750838210155b61019e6116aa565b610a3c858585611c8b565b336001600160a01b03861614801590610a5757506000198114155b15610a6957610a698533858403611838565b506001949350505050565b6000610a7f82611d6b565b90506000610a8c82611b62565b9050610aa56001600160a01b03821615156101556116aa565b6000828152600a6020526040812054610abd90611ef9565b9050610aca838383611f08565b50505050565b610ad8611feb565b610ae8600183101561012c6116aa565b610af961138883111561012d6116aa565b6000610b0582426115ef565b9050610b196201518082101561013d6116aa565b600080610b24612031565b91509150610b35811561013e6116aa565b6000610b43866103e8611558565b90506000838211610b7257610b6d610b5e6201518086611558565b610b688488611558565b6120a5565b610b8c565b610b8c610b826201518084611558565b610b688688611558565b9050610b9e600282111561013f6116aa565b610baa848342896120d8565b50505050505050565b60055460ff1690565b60006107be6114b8565b610bce611feb565b610bd6612127565b610bdf8161213a565b50565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610866918590610c3c90866121b3565b611838565b600c546000908190610c568160e9601761169b565b9250610c6581600060e961169b565b9150509091565b610c74611feb565b61090660006121c5565b610c86611feb565b610c8e612127565b610c988282612256565b5050565b610ca4611feb565b6109066001612364565b6000610cc1610cbc83611d6b565b6123bb565b90505b919050565b600d8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561084f5780601f106108245761010080835404028352916020019161084f565b6008546000906107be9060c0603f61169b565b60006060610d538651610d4e6116c8565b61240e565b610d688989898989898961241b61243d6124a6565b97509795505050505050565b60006060600080600080610d8661263d565b9398509196509450925090506000610d9e85856121b3565b90506000610daa612031565b5090506000848214610dc557610dc0828961272d565b610dc7565b835b9050610dd3818461288f565b9850505050505050505090565b6000806000610ded612031565b90949093506103e892509050565b6000610e05611254565b15610e1257506000610cc4565b81610e5e57610e1f610908565b610e49577f0000000000000000000000000000000000000000000000000000000000000000610e57565b600b5467ffffffffffffffff165b9050610cc4565b6002821415610e865750600b5468010000000000000000900467ffffffffffffffff16610cc4565b6003821415610eb65750600b54700100000000000000000000000000000000900467ffffffffffffffff16610cc4565b610cc46101bb6128e0565b6001600160a01b031660009081526020819052604090205490565b60608088610eeb61072061114c565b610ef6610746610be2565b60606000610f038661290a565b15610f2b57610f10612939565b610f2289610f1c61092c565b8861294c565b92509050610f7d565b610f336116b8565b6060610f3d611704565b9050610f498a82612990565b610f6d8d8d8d8d8d610f59611254565b610f63578d610f66565b60005b878e61241b565b93509150610f7b838261243d565b505b610f878b826129f9565b81895167ffffffffffffffff81118015610fa057600080fd5b50604051908082528060200260200182016040528015610fca578160200160208202803683370190505b509450945050505b5097509795505050505050565b6000610cc182611170565b6000806000806000600a6000610fff88611d6b565b815260208101919091526040016000205490506110208115156101556116aa565b61102981612a03565b945061103481612a11565b935061103f81612a1f565b9597949650949392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b611078611feb565b61090660016121c5565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016110b7929190615c91565b604051602081830303815290604052805190602001209050919050565b60008060006110e161263d565b505092509250506110fb81836121b390919063ffffffff16565b9250505090565b600060606111138651610d4e6116c8565b610d6889898989898989612a41612a526124a6565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561084f5780601f106108245761010080835404028352916020019161084f565b6000806111f93385611449565b90508083106112135761120e33856000611838565b611220565b6112203385858403611838565b5060019392505050565b6000610866338484611c8b565b60006107be612abb565b6000610cc161124f83611d6b565b612b35565b6008546000906107be9060ff612b5d565b61126d611feb565b6109066000612364565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886112ca8c611170565b896040516020016112e096959493929190615deb565b6040516020818303038152906040528051906020012090506113118882611308878787612b67565b886101f8612ba6565b61131c888888611838565b5050505050505050565b6060808861133561072061114c565b611340610746610be2565b6113486116b8565b6060611352611704565b905061135c61092c565b61140957600060606113718d8d8d868b612bfd565b9150915061138a611380611831565b83101560cc6116aa565b61139c6000611397611831565b612cd6565b6113af8b6113a8611831565b8403612cd6565b6113b98184612a52565b808a5167ffffffffffffffff811180156113d257600080fd5b506040519080825280602002602001820160405280156113fc578160200160208202803683370190505b5095509550505050610fd2565b6114138882612990565b6000606061143b8d8d8d8d8d611427611254565b611431578d611434565b60005b898e612a41565b915091506113af8b83612cd6565b600061145361114c565b6001600160a01b0316826001600160a01b03161415611475575060001961086a565b61147f8383612ce0565b905061086a565b60001981565b611494611feb565b60008061149f612031565b915091506114af816101406116aa565b610c9882612d0b565b60006107be612d46565b6114ca611feb565b60006114d583611d6b565b905060006114e282611b62565b90506114fb6001600160a01b03821615156101556116aa565b611506828285611f08565b806001600160a01b0316827fdd6d1c9badb346de6925b358a472c937b41698d2632696759e43fd6527feeec4856040516115409190615dc3565b60405180910390a350505050565b80610c9881612de3565b600082820261157c84158061157557508385838161157257fe5b04145b60036116aa565b9392505050565b61159b828414801561159457508183145b60676116aa565b505050565b60006001821b19841682846115b65760006115b9565b60015b60ff16901b17949350505050565b60006115d4848484612e5c565b5082821b6000196001831b01831b198516175b949350505050565b60006115ff8383111560016116aa565b50900390565b6000611618606084901c156101496116aa565b6115e742830160e060206116358660c083838c8c600060606115c7565b9291906115c7565b6000610cc161164b83612a03565b83906060806115c7565b600061166e67ffffffffffffffff8311156101ba6116aa565b5090565b600061167f848484612e5c565b50501b90565b6000818310611694578161157c565b5090919050565b6001901b6000190191901c1690565b81610c9857610c98816128e0565b6116c0612ea2565b610906612eaa565b7f000000000000000000000000000000000000000000000000000000000000000090565b61159b81841080156116fd57508183105b60646116aa565b606060006117106116c8565b905060608167ffffffffffffffff8111801561172b57600080fd5b50604051908082528060200260200182016040528015611755578160200160208202803683370190505b50905060005b828110156109f95761177e61176f826123bb565b61177883612ed2565b90612ff0565b82828151811061178a57fe5b602090810291909101015260010161175b565b60208501516000906001600160a01b03163014806117c7575060408601516001600160a01b031630145b6117dd576117d8868686868661301c565b6117ea565b6117ea8686868686613086565b90505b95945050505050565b60208501516000906001600160a01b0316301480611820575060408601516001600160a01b031630145b6117dd576117d8868686868661318a565b620f424090565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611893908590615dc3565b60405180910390a3505050565b6118a8612127565b606060008060006118b761263d565b94509450945050935060008311156118d2576118d2836131e1565b60006118dc612031565b50905060008382146118f7576118f2828761272d565b6118f9565b825b905061190582826131f2565b505050505050565b6040517f1a7c32630000000000000000000000000000000000000000000000000000000081526000906001600160a01b03841690631a7c326390611955908590600401615dc3565b60206040518083038186803b15801561196d57600080fd5b505afa158015611981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a59190615b4a565b9050816119f3576119b581611655565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055611ac0565b6002821415611a5057611a0581611655565b600b805467ffffffffffffffff9290921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055611ac0565b6003821415611ab557611a6281611655565b600b805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff909216919091179055611ac0565b611ac06101bb6128e0565b817f6bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a82604051611af09190615dc3565b60405180910390a2505050565b6000611b07611b3e565b4211806107be57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b600081611b9057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b8160011415611bc057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b8160021415611bf057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b8160031415611c2057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b8160041415611c5057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b8160051415611c8057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b610cc46101356128e0565b611ca26001600160a01b03841615156101986116aa565b611cb96001600160a01b03831615156101996116aa565b611cc483838361159b565b6001600160a01b038316600090815260208190526040902054611cea90826101a0613218565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611d1990826121b3565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611893908590615dc3565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611daf57506000610cc4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611df157506001610cc4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e3357506002610cc4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e7557506003610cc4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611eb757506004610cc4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611c8057506005610cc4565b6000610cc18260c0602061169b565b6000826001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f4357600080fd5b505afa158015611f57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7b9190615b4a565b6000858152600a6020526040902054909150611f98818385611605565b6000868152600a602052604090819020919091555185907fb77a83204ca282e08dc3a65b0a1ca32ea4e6875c38ef0bf5bf75e52a67354fac90611fdc908590615dc3565b60405180910390a25050505050565b600061201a6000357fffffffff0000000000000000000000000000000000000000000000000000000016611082565b9050610bdf612029823361322e565b6101916116aa565b600080600080600080612042613317565b93509350935093508042101561209557600194508383111561207957818103824203858503028161206f57fe5b0484019550612090565b818103824203848603028161208a57fe5b04840395505b61209d565b600094508295505b505050509091565b60006120b482151560046116aa565b826120c15750600061086a565b8160018403816120cd57fe5b04600101905061086a565b6120e484848484613376565b7f1835882ee7a34ac194f717a35e09bb1d24c82a3b9d854ab6c9749525b714cdf2848484846040516121199493929190615ee9565b60405180910390a150505050565b610906612132611afd565b6101926116aa565b61214f6121456133b5565b82101560cb6116aa565b61216461215a6133be565b82111560ca6116aa565b600854612175908260c0603f6115c7565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906121a8908390615dc3565b60405180910390a150565b600082820161157c84821015836116aa565b80156121e5576121e06121d6611b1a565b42106101936116aa565b6121fa565b6121fa6121f0611b3e565b42106101a96116aa565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be64906121a8908390615da0565b6000612260610be2565b9050600061226c61114c565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b8152600401612299929190615e64565b60806040518083038186803b1580156122b157600080fd5b505afa1580156122c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e99190615b83565b6040517f18e736d40000000000000000000000000000000000000000000000000000000081529094506001600160a01b03851693506318e736d49250612336915085908790600401615e4b565b600060405180830381600087803b15801561235057600080fd5b505af115801561131c573d6000803e3d6000fd5b600854612373908260ff6115a0565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c8906123a6908390615da0565b60405180910390a180610bdf57610bdf6133ca565b60006123c561104c565b8214156123db5750670de0b6b3a7640000610cc4565b6000828152600a602052604090205480156123fe576123f981612a03565b61157c565b670de0b6b3a76400009392505050565b610c9881831460676116aa565b6000606061242c600088868661349c565b915091509850989650505050505050565b8151815161244c90829061240e565b60005b81811015610aca5761248784828151811061246657fe5b602002602001015184838151811061247a57fe5b602002602001015161288f565b84828151811061249357fe5b602090810291909101015260010161244f565b333014612595576000306001600160a01b03166000366040516124ca929190615cc1565b6000604051808303816000865af19150503d8060008114612507576040519150601f19603f3d011682016040523d82523d6000602084013e61250c565b606091505b50509050806000811461251b57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114612577573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b61259d6116b8565b60606125a7611704565b90506125b38782612990565b600060606125cb8c8c8c8c8c8c898d8d63ffffffff16565b915091506125dd81848663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08301526020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b6060600080600080606061264f61114c565b6001600160a01b031663f94d4668612665610be2565b6040518263ffffffff1660e01b81526004016126819190615dc3565b60006040518083038186803b15801561269957600080fd5b505afa1580156126ad573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126d59190810190615663565b509150506126ea816126e5611704565b612990565b6126f38161354a565b965094506000612701610c41565b90945090506000612713888684613583565b945090506127218782613610565b95505050509091929394565b80516000908190815b8181101561276e5761276485828151811061274d57fe5b6020026020010151846121b390919063ffffffff16565b9250600101612736565b508161277f5760009250505061086a565b600082868302825b60ff811015612878578260005b868110156127d5576127cb6127a98387611558565b6127c68c84815181106127b857fe5b60200260200101518a611558565b613628565b9150600101612794565b5083945061282e61280d6128076127ec848a611558565b6128016127f9888d611558565b6103e8613628565b906121b3565b86611558565b6127c661281d8960010185611558565b6128016127f96103e889038a611558565b93508484111561285657600185850311612851578397505050505050505061086a565b61286f565b60018486031161286f578397505050505050505061086a565b50600101612787565b506128846101416128e0565b505050505092915050565b600061289e82151560046116aa565b826128ab5750600061086a565b670de0b6b3a7640000838102906128ce908583816128c557fe5b041460056116aa565b8281816128d757fe5b0491505061086a565b610bdf817f42414c0000000000000000000000000000000000000000000000000000000000613648565b6000808251118015610cc1575060ff80168280602001905181019061292f9190615bc3565b60ff161492915050565b610906612944611254565b6101b66116aa565b600060606000606061295d8761354a565b91509150600060606129708385896136c3565b91509150816129808260006136ef565b9550955050505050935093915050565b8151815161299f90829061240e565b60005b81811015610aca576129da8482815181106129b957fe5b60200260200101518483815181106129cd57fe5b6020026020010151612ff0565b8482815181106129e657fe5b60209081029190910101526001016129a2565b610c9882826137ac565b6000610cc18282606061169b565b6000610cc18260608061169b565b600080612a2b83611ef9565b9150612a3a8360e0602061169b565b9050915091565b6000606061242c600188868661349c565b81518151612a6190829061240e565b60005b81811015610aca57612a9c848281518110612a7b57fe5b6020026020010151848381518110612a8f57fe5b6020026020010151613878565b848281518110612aa857fe5b6020908102919091010152600101612a64565b6000612ac561114c565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015612afd57600080fd5b505afa158015612b11573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107be9190615832565b6000610cc17f0000000000000000000000000000000000000000000000000000000000000000835b1c60019081161490565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b6000612bb1856138c6565b9050612bc7612bc18783876138e2565b836116aa565b612bd6428410156101b86116aa565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606000612c0c84613991565b9050612c276000826003811115612c1f57fe5b1460ce6116aa565b6060612c32856139a7565b9050612c408151875161240e565b612c4a8187612990565b6000612c54612031565b5090506060612c62836139bd565b90506000612c70838361272d565b9050806000612c8d6d8000000000000000000000000000836115ef565b9050612c998d82612cd6565b8086612ca361104c565b81518110612cad57fe5b602002602001018181525050612cc385846131f2565b509c939b50929950505050505050505050565b610c988282613a5f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b612d1781824242613376565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a0233816040516121a89190615dc3565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612db3613aec565b30604051602001612dc8959493929190615e1f565b60405160208183030381529060405280519060200120905090565b600281511015612df257610bdf565b600081600081518110612e0157fe5b602002602001015190506000600190505b825181101561159b576000838281518110612e2957fe5b60200260200101519050612e52816001600160a01b0316846001600160a01b03161060656116aa565b9150600101612e12565b612e6b610100831060646116aa565b612e93600182101580156116fd5750612e8960ff8461010003611685565b82111560646116aa565b61159b83821c156101b46116aa565b610906612127565b6000612eb46116c8565b905060005b81811015610c9857612eca81613af0565b600101612eb9565b600081612f0057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b8160011415612f3057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b8160021415612f6057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b8160031415612f9057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b8160041415612fc057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b8160051415611c8057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b600082820261300a84158061157557508385838161157257fe5b670de0b6b3a764000090049392505050565b60006130288583612990565b613049866060015183858151811061303c57fe5b6020026020010151613b44565b6060870152600061305c87878787613b50565b905061307b8184878151811061306e57fe5b6020026020010151613b64565b90506107a981613b70565b600080808751600181111561309757fe5b1490506130a48684612990565b6130c4876060015184836130b857866130ba565b875b8151811061303c57fe5b876060018181525050600060606000806130dd8a613b8c565b93509350935093506000806130f061104c565b8a1461311657613111878e60600151876131098e613bf5565b888b89613c2a565b613131565b613131878e60600151876131298f613bf5565b888b89613c63565b915091506131428486858985613c87565b8661315c57613157828a8d8151811061306e57fe5b613179565b613179828a8c8151811061316c57fe5b6020026020010151613d07565b9d9c50505050505050505050505050565b60006131998660600151613d13565b60608701526131a88583612990565b6131bc866060015183868151811061303c57fe5b606087015260006131cf87878787613d34565b90506107a98184868151811061316c57fe5b610bdf6131ec611277565b82612cd6565b6131ff81600060e9611672565b61320c8360e96017611672565b17600c55610c98613d48565b600061322784841115836116aa565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b61324d611128565b6001600160a01b031614158015613268575061326883613d7e565b1561329057613275611128565b6001600160a01b0316336001600160a01b031614905061086a565b613298612abb565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016132c793929190615dcc565b60206040518083038186803b1580156132df57600080fd5b505afa1580156132f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147f919061572f565b6000806000806133366000604060095461169b9092919063ffffffff16565b6009549094506133489060408061169b565b60095490935061335b906080604061169b565b60095490925061336e9060c0604061169b565b905090919293565b6133838160c06040611672565b6133908360806040611672565b61339c85604080611672565b6133a98760006040611672565b17171760095550505050565b64e8d4a5100090565b67016345785d8a000090565b60606133d461114c565b6001600160a01b031663f94d46686133ea610be2565b6040518263ffffffff1660e01b81526004016134069190615dc3565b60006040518083038186803b15801561341e57600080fd5b505afa158015613432573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261345a9190810190615663565b5091505061346a816126e5611704565b6060613475826139bd565b90506000613481612031565b5090506000613490828461272d565b9050610aca82826131f2565b60006060600060606000806134b089613b8c565b93509350935093506153d08a6134c857613d896134cc565b613e1e5b9050600060606134e4868689878f8f8963ffffffff16565b915091506153d08d6134f8576115ef6134fc565b6121b35b9050613509878383613e9c565b600061351989858463ffffffff16565b90506135288789888c85613c87565b836135348460006136ef565b9a509a5050505050505050505094509492505050565b600060606135718361355a61104c565b8151811061356457fe5b6020026020010151613f10565b61357a846139bd565b91509150915091565b60008060008060006135958888613f24565b92509250925060008684116135ab5760006135af565b8684035b905060008484116135c15760006135c5565b8484035b905060006135e06135d66000610dfb565b611778858761288f565b905060006135fb6135f16002610dfb565b611778858861288f565b919091019b939a509298505050505050505050565b600061157c61361f8484611558565b6127c684613fa6565b600061363782151560046116aa565b81838161364057fe5b049392505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000606060006136d284613fcc565b905060606136e1878784613fe2565b919791965090945050505050565b6060825160010167ffffffffffffffff8111801561370c57600080fd5b50604051908082528060200260200182016040528015613736578160200160208202803683370190505b50905060005b81518110156137a55761374d61104c565b8114613784578361375c61104c565b821061376b576001820361376d565b815b8151811061377757fe5b6020026020010151613786565b825b82828151811061379257fe5b602090810291909101015260010161373c565b5092915050565b6137c36001600160a01b038316151561019b6116aa565b6137cf8260008361159b565b6001600160a01b0382166000908152602081905260409020546137f590826101b2613218565b6001600160a01b0383166000908152602081905260409020556138286138238261381d61092c565b90614091565b61409f565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161386c9190615dc3565b60405180910390a35050565b600061388782151560046116aa565b826138945750600061086a565b670de0b6b3a7640000838102906138ae908583816128c557fe5b8260018203816138ba57fe5b0460010191505061086a565b60006138d0612d46565b826040516020016110b7929190615cd1565b60006138f482516041146101b96116aa565b60208281015160408085015160608601518251600080825295019283905292939092811a9160019061392d908990859088908890615e7b565b6020604051602081039080840390855afa15801561394f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906139855750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b600081806020019051810190610cc1919061595d565b60608180602001905181019061157c9190615978565b606080600183510367ffffffffffffffff811180156139db57600080fd5b50604051908082528060200260200182016040528015613a05578160200160208202803683370190505b50905060005b81518110156137a55783613a1d61104c565b8210613a2c5781600101613a2e565b815b81518110613a3857fe5b6020026020010151828281518110613a4c57fe5b6020908102919091010152600101613a0b565b613a6b6000838361159b565b613a7a6138238261280161092c565b6001600160a01b038216600090815260208190526040902054613a9d90826121b3565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061386c908590615dc3565b4690565b613af861104c565b811415613b0457610bdf565b6000818152600a60205260409020548015610c9857600080613b2583612a1f565b9150915080421115610aca57610aca84613b3e86611b62565b84611f08565b600061157c8383612ff0565b60006117ed600086606001518686866140a4565b600061157c8383613878565b6000610cc1613b85613b80610d2a565b613fa6565b8390613878565b60006060600080600080613b9e610c41565b91509150600060606000613bb38a8686614116565b9250925092506000613bc3612031565b5090506000868214613bde57613bd9828561272d565b613be0565b825b949c939b509099509297509095505050505050565b6000613c0c613c0261104c565b83141560646116aa565b613c1461104c565b821061166e57613c258260016115ef565b610cc1565b60008088613c4557613c4088888888888861416e565b613c53565b613c53888888888888614245565b9150915097509795505050505050565b60008088613c7957613c408888888888886142a6565b613c5388888888888861430c565b6000613c93868661272d565b90506000613ca1838561288f565b90506000613caf8683612ff0565b905080831115613cfd578083036000613cd9613cd383613cce84610dfb565b611558565b86613628565b90508015613cfa576000613ced8783613610565b9050613cf8816131e1565b505b50505b61131c88846131f2565b600061157c838361288f565b600080613d28613d21610d2a565b84906143bb565b905061157c83826115ef565b60006117ed600186606001518686866140a4565b6000613d526116c8565b905060005b81811015610c9857613d68816143f7565b15613d7657613d7681614426565b600101613d57565b6000610cc182614454565b600060606000613d988461445f565b90506001816002811115613da857fe5b1415613dc657613dbc87878a8c8989614475565b9250925050613e13565b6002816002811115613dd457fe5b1415613de557613dbc878a866144d4565b6000816002811115613df357fe5b1415613e0657613dbc87878a8c886144f2565b613e116101506128e0565b505b965096945050505050565b600060606000613e2d84613991565b90506001816003811115613e3d57fe5b1415613e5157613dbc87878a8c8989614593565b6003816003811115613e5f57fe5b1415613e7057613dbc878a866145e2565b6002816003811115613e7e57fe5b1415613e9157613dbc87878a8c88614600565b613e116101366128e0565b82518251613eab90829061240e565b60005b81811015613f0957613eea858281518110613ec557fe5b6020026020010151858381518110613ed957fe5b60200260200101518563ffffffff16565b858281518110613ef657fe5b6020908102919091010152600101613eae565b5050505050565b6000610cc182613f1e61092c565b906115ef565b6000806000613f3d84613f3887600161467a565b61272d565b9250613f47614783565b15613f6057613f56848661272d565b9150819050613f9f565b613f686147a7565b15613f8157829150613f7a848661272d565b9050613f9f565b613f9084613f3887600061467a565b9150613f9c848661272d565b90505b9250925092565b6000670de0b6b3a76400008210613fbe576000610cc1565b50670de0b6b3a76400000390565b60008180602001905181019061157c9190615bdf565b60606000613ff0838561288f565b9050845167ffffffffffffffff8111801561400a57600080fd5b50604051908082528060200260200182016040528015614034578160200160208202803683370190505b50915060005b8551811015614088576140698287838151811061405357fe5b6020026020010151612ff090919063ffffffff16565b83828151811061407557fe5b602090810291909101015260010161403a565b50509392505050565b600061157c83836001613218565b600255565b600060606140b1856139bd565b905060006140be85613bf5565b905060006140cb85613bf5565b905060006140d7612031565b50905060006140e6828661272d565b90508a15614108576140fc828686868e866147cb565b955050505050506117ed565b6140fc828686868e86614856565b6000606060008060606141288861354a565b9150915060008061413a838a8a613583565b91509150600061414a8584613610565b9050801561415b5761415b816131e1565b9390930199919850919650945050505050565b6000806060875167ffffffffffffffff8111801561418b57600080fd5b506040519080825280602002602001820160405280156141b5578160200160208202803683370190505b509050888188815181106141c557fe5b60200260200101818152505060006141e8878a8489896141e3610d2a565b6148e9565b90506142108a8a8a815181106141fa57fe5b60200260200101516115ef90919063ffffffff16565b89898151811061421c57fe5b6020908102919091010152600061423387836115ef565b919b919a509098505050505050505050565b60008060006142608689898c898961425b610d2a565b614b79565b9050614272818989815181106141fa57fe5b88888151811061427e57fe5b60209081029190910101526000614295868b6115ef565b919a91995090975050505050505050565b60008060006142c18689898c89896142bc610d2a565b614c68565b90506142e9818989815181106142d357fe5b60200260200101516121b390919063ffffffff16565b8888815181106142f557fe5b60209081029190910101526000614295868b6121b3565b6000806060875167ffffffffffffffff8111801561432957600080fd5b50604051908082528060200260200182016040528015614353578160200160208202803683370190505b5090508881888151811061436357fe5b6020026020010181815250506000614386878a848989614381610d2a565b614d35565b90506143988a8a8a815181106142d357fe5b8989815181106143a457fe5b6020908102919091010152600061423387836121b3565b60008282026143d584158061157557508385838161157257fe5b806143e457600091505061086a565b670de0b6b3a764000060001982016138ba565b6000610cc17f000000000000000000000000000000000000000000000000000000000000000060068401612b5d565b6000818152600a602052604090205461443e8161163d565b6000928352600a60205260409092209190915550565b6000610cc182614fb6565b600081806020019051810190610cc1919061589c565b6000606080600061448585614ff2565b915091506144958251885161240e565b6144a2826126e5886139bd565b60006144b48989858e8e6141e3610d2a565b90506144c48282111560cf6116aa565b9a91995090975050505050505050565b6000606060006144e384615015565b905060606136e1868884613fe2565b600060606000806145028561502b565b915091506145148651821060646116aa565b6060865167ffffffffffffffff8111801561452e57600080fd5b50604051908082528060200260200182016040528015614558578160200160208202803683370190505b50905061456c888884868e8e61425b610d2a565b81838151811061457857fe5b60209081029190910101529199919850909650505050505050565b600060608060006145a385615042565b915091506145b38751835161240e565b6145c0826126e5886139bd565b60006145d28989858e8e614381610d2a565b90506144c48282101560d06116aa565b6000606060006145f18461505a565b905060606136e1868389615070565b600060606000806146108561510c565b915091506146228651821060646116aa565b6060865167ffffffffffffffff8111801561463c57600080fd5b50604051908082528060200260200182016040528015614666578160200160208202803683370190505b50905061456c888884868e8e6142bc610d2a565b8151606090818167ffffffffffffffff8111801561469757600080fd5b506040519080825280602002602001820160405280156146c1578160200160208202803683370190505b50905060005b8281101561477a5760006146d961104c565b8210156146e657816146eb565b816001015b90506146f681612b35565b8061470d575085801561470d575061470d816143f7565b61472a5786828151811061471d57fe5b602002602001015161475a565b61475a87838151811061473957fe5b6020026020010151600a600084815260200190815260200160002054615123565b83838151811061476657fe5b6020908102919091010152506001016146c7565b50949350505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006147dd838787815181106142d357fe5b8686815181106147e957fe5b60200260200101818152505060006148038888858861513e565b90508387878151811061481257fe5b60200260200101510387878151811061482757fe5b6020026020010181815250506148486001613f1e838a89815181106141fa57fe5b9150505b9695505050505050565b6000614868838786815181106141fa57fe5b86858151811061487457fe5b602002602001018181525050600061488e8888858961513e565b90508387868151811061489d57fe5b6020026020010151018786815181106148b257fe5b60200260200101818152505061484860016128018989815181106148d257fe5b6020026020010151846115ef90919063ffffffff16565b600080805b87518110156149275761491d88828151811061490657fe5b6020026020010151836121b390919063ffffffff16565b91506001016148ee565b506060865167ffffffffffffffff8111801561494257600080fd5b5060405190808252806020026020018201604052801561496c578160200160208202803683370190505b5090506000805b8951811015614a395760006149a4858c848151811061498e57fe5b602002602001015161387890919063ffffffff16565b90506149e68b83815181106149b557fe5b60200260200101516149e08c85815181106149cc57fe5b60200260200101518e86815181106141fa57fe5b90613878565b8483815181106149f257fe5b602002602001018181525050614a2e614a2782868581518110614a1157fe5b60200260200101516143bb90919063ffffffff16565b84906121b3565b925050600101614973565b506060895167ffffffffffffffff81118015614a5457600080fd5b50604051908082528060200260200182016040528015614a7e578160200160208202803683370190505b50905060005b8a51811015614b49576000848281518110614a9b57fe5b6020026020010151841115614b02576000614ac4614ab886613fa6565b8e858151811061405357fe5b90506000614ad8828e86815181106141fa57fe5b9050614af9614af282670de0b6b3a76400008d9003613878565b83906121b3565b92505050614b19565b8a8281518110614b0e57fe5b602002602001015190505b614b29818d84815181106141fa57fe5b838381518110614b3557fe5b602090810291909101015250600101614a84565b506000614b568c8361272d565b90506000614b64828a61288f565b9050613179614b7282613fa6565b8b906143bb565b600080614b9484614b8e876149e0818b6115ef565b906143bb565b90506000614ba48a8a848b61513e565b90506000614bb8828b8b815181106141fa57fe5b90506000805b8b51811015614be057614bd68c828151811061490657fe5b9150600101614bbe565b506000614c09828d8d81518110614bf357fe5b602002602001015161288f90919063ffffffff16565b90506000614c1682613fa6565b90506000614c2485836143bb565b90506000614c3286836115ef565b9050614c53614c4c83670de0b6b3a76400008d9003612ff0565b82906121b3565b98505050505050505050979650505050505050565b600080614c7d84614b8e876149e0818b6121b3565b90506000614c8d8a8a848b61513e565b90506000614cb78a8a81518110614ca057fe5b6020026020010151836115ef90919063ffffffff16565b90506000805b8b51811015614cdf57614cd58c828151811061490657fe5b9150600101614cbd565b506000614cf2828d8d81518110614bf357fe5b90506000614cff82613fa6565b90506000614d0d85836143bb565b90506000614d1b86836115ef565b9050614c53614c4c83670de0b6b3a76400008d9003613878565b600080805b8751811015614d5c57614d5288828151811061490657fe5b9150600101614d3a565b506060865167ffffffffffffffff81118015614d7757600080fd5b50604051908082528060200260200182016040528015614da1578160200160208202803683370190505b5090506000805b8951811015614e3b576000614dc3858c8481518110614bf357fe5b9050614e058b8381518110614dd457fe5b6020026020010151614dff8c8581518110614deb57fe5b60200260200101518e86815181106142d357fe5b9061288f565b848381518110614e1157fe5b602002602001018181525050614e30614a278286858151811061405357fe5b925050600101614da8565b506060895167ffffffffffffffff81118015614e5657600080fd5b50604051908082528060200260200182016040528015614e80578160200160208202803683370190505b50905060005b8a51811015614f4157600083858381518110614e9e57fe5b60200260200101511115614efa576000614ec3614ab886670de0b6b3a76400006115ef565b90506000614ed7828e86815181106141fa57fe5b9050614ef1614af282670de0b6b3a76400008d9003612ff0565b92505050614f11565b8a8281518110614f0657fe5b602002602001015190505b614f21818d84815181106142d357fe5b838381518110614f2d57fe5b602090810291909101015250600101614e86565b506000614f4e8c8361272d565b90506000614f5c828a61288f565b9050670de0b6b3a7640000811115614fa757614f9a8a7ffffffffffffffffffffffffffffffffffffffffffffffffff21f494c589c00008301612ff0565b965050505050505061484c565b6000965050505050505061484c565b6000614fe17ff4b7964d00000000000000000000000000000000000000000000000000000000611082565b821480610cc15750610cc1826152fb565b606060008280602001905181019061500a91906158b7565b909590945092505050565b60008180602001905181019061157c91906158fc565b6000808280602001905181019061500a9190615928565b606060008280602001905181019061500a91906159bb565b60008180602001905181019061157c91906159d9565b6060600061507e8484613878565b90506060855167ffffffffffffffff8111801561509a57600080fd5b506040519080825280602002602001820160405280156150c4578160200160208202803683370190505b50905060005b8651811015615102576150e383888381518110614a1157fe5b8282815181106150ef57fe5b60209081029190910101526001016150ca565b5095945050505050565b6000808280602001905181019061500a91906159f5565b600061157c61513584613cce85612a11565b6127c684612a03565b60008084518602905060008560008151811061515657fe5b60200260200101519050600086518760008151811061517157fe5b60200260200101510290506000600190505b87518110156151d7576151bc6151b66151af848b85815181106151a257fe5b6020026020010151611558565b8a51611558565b88613628565b91506151cd88828151811061274d57fe5b9250600101615183565b508685815181106151e457fe5b60200260200101518203915060006151fc8788611558565b9050600061522861521c61521484610b688988611558565b6103e8611558565b8a89815181106151a257fe5b9050600061524361523c6152148b89613628565b86906121b3565b905060008061525f61525586866121b3565b610b688d866121b3565b905060005b60ff8110156152df57819250615294615281866128018586611558565b610b688e613f1e88612801886002611558565b9150828211156152bd576001838303116152b8575097506115e79650505050505050565b6152d7565b6001828403116152d7575097506115e79650505050505050565b600101615264565b506152eb6101426128e0565b5050505050505050949350505050565b60006153267f2f1a0bc900000000000000000000000000000000000000000000000000000000611082565b82148061535a57506153577feb0f24d600000000000000000000000000000000000000000000000000000000611082565b82145b80610cc15750610cc182600061538f7f38e9922e00000000000000000000000000000000000000000000000000000000611082565b8214806153c357506153c07f50dd6ed900000000000000000000000000000000000000000000000000000000611082565b82145b80610cc157506000610cc1565bfe5b803561086a81615f59565b600082601f8301126153ed578081fd5b81356154006153fb82615f39565b615f12565b81815291506020808301908481018184028601820187101561542157600080fd5b60005b8481101561288457813584529282019290820190600101615424565b600082601f830112615450578081fd5b815161545e6153fb82615f39565b81815291506020808301908481018184028601820187101561547f57600080fd5b60005b8481101561288457815184529282019290820190600101615482565b600082601f8301126154ae578081fd5b813567ffffffffffffffff8111156154c4578182fd5b6154d76020601f19601f84011601615f12565b91508082528360208285010111156154ee57600080fd5b8060208401602084013760009082016020015292915050565b80516003811061086a57600080fd5b80516004811061086a57600080fd5b80356002811061086a57600080fd5b600060208284031215615545578081fd5b813561157c81615f59565b60008060408385031215615562578081fd5b823561556d81615f59565b9150602083013561557d81615f59565b809150509250929050565b60008060006060848603121561559c578081fd5b83356155a781615f59565b925060208401356155b781615f59565b929592945050506040919091013590565b600080600080600080600060e0888a0312156155e2578283fd5b87356155ed81615f59565b965060208801356155fd81615f59565b95506040880135945060608801359350608088013561561b81615f6e565b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561564a578182fd5b823561565581615f59565b946020939093013593505050565b600080600060608486031215615677578081fd5b835167ffffffffffffffff8082111561568e578283fd5b818601915086601f8301126156a1578283fd5b81516156af6153fb82615f39565b80828252602080830192508086018b8283870289010111156156cf578788fd5b8796505b848710156156fa5780516156e681615f59565b8452600196909601959281019281016156d3565b508901519097509350505080821115615711578283fd5b5061571e86828701615440565b925050604084015190509250925092565b600060208284031215615740578081fd5b8151801515811461157c578182fd5b600080600080600080600060e0888a031215615769578081fd5b87359650602088013561577b81615f59565b9550604088013561578b81615f59565b9450606088013567ffffffffffffffff808211156157a7578283fd5b6157b38b838c016153dd565b955060808a0135945060a08a0135935060c08a01359150808211156157d6578283fd5b506157e38a828b0161549e565b91505092959891949750929550565b600060208284031215615803578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461157c578182fd5b600060208284031215615843578081fd5b815161157c81615f59565b60008060408385031215615860578182fd5b823561586b81615f59565b9150602083013567ffffffffffffffff811115615886578182fd5b6158928582860161549e565b9150509250929050565b6000602082840312156158ad578081fd5b61157c8383615507565b6000806000606084860312156158cb578081fd5b6158d58585615507565b9250602084015167ffffffffffffffff8111156158f0578182fd5b61571e86828701615440565b6000806040838503121561590e578182fd5b6159188484615507565b9150602083015190509250929050565b60008060006060848603121561593c578081fd5b6159468585615507565b925060208401519150604084015190509250925092565b60006020828403121561596e578081fd5b61157c8383615516565b6000806040838503121561598a578182fd5b6159948484615516565b9150602083015167ffffffffffffffff8111156159af578182fd5b61589285828601615440565b6000806000606084860312156159cf578081fd5b6158d58585615516565b600080604083850312156159eb578182fd5b6159188484615516565b600080600060608486031215615a09578081fd5b6159468585615516565b60008060008060808587031215615a28578182fd5b843567ffffffffffffffff80821115615a3f578384fd5b818701915061012080838a031215615a55578485fd5b615a5e81615f12565b9050615a6a8984615525565b8152615a7989602085016153d2565b6020820152615a8b89604085016153d2565b6040820152606083013560608201526080830135608082015260a083013560a0820152615abb8960c085016153d2565b60c0820152615acd8960e085016153d2565b60e08201526101008084013583811115615ae5578687fd5b615af18b82870161549e565b828401525050809650506020870135915080821115615b0e578384fd5b50615b1b878288016153dd565b949794965050505060408301359260600135919050565b600060208284031215615b43578081fd5b5035919050565b600060208284031215615b5b578081fd5b5051919050565b60008060408385031215615b74578182fd5b50508035926020909101359150565b60008060008060808587031215615b98578182fd5b8451935060208501519250604085015191506060850151615bb881615f59565b939692955090935050565b600060208284031215615bd4578081fd5b815161157c81615f6e565b60008060408385031215615bf1578182fd5b8251615bfc81615f6e565b6020939093015192949293505050565b6000815180845260208085019450808401835b83811015615c3b57815187529582019590820190600101615c1f565b509495945050505050565b60008151808452815b81811015615c6b57602081850181015186830182015201615c4f565b81811115615c7c5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b81811015615d5c5783516001600160a01b031683529284019291840191600101615d37565b50909695505050505050565b60006020825261157c6020830184615c0c565b600060408252615d8e6040830185615c0c565b82810360208401526117ed8185615c0c565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000838252604060208301526115e76040830184615c46565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825261157c6020830184615c46565b6000838252604060208301526115e76040830184615c0c565b9283529015156020830152604082015260600190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615f3157600080fd5b604052919050565b600067ffffffffffffffff821115615f4f578081fd5b5060209081020190565b6001600160a01b0381168114610bdf57600080fd5b60ff81168114610bdf57600080fdfea2646970667358221220dcc30bf1aa1b16ae6ad0c83c0807514f1e6fdbe66d9e246a013ce46ba54d53bf64736f6c634300070100336bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100de5760003560e01c80636634b7531161008c578063739238d611610066578063739238d61461018f578063851c1bb3146101975780638d928af8146101b7578063aaabadc5146101bf576100de565b80636634b7531461014757806366b59f6c146101675780636c57f5a914610187576100de565b80632f2770db116100bd5780632f2770db1461012d5780633f819b6f1461013757806354fd4d501461013f576100de565b8062c194db146100e3578063174481fa146101015780632da47c4014610117575b600080fd5b6100eb6101c7565b6040516100f89190611050565b60405180910390f35b6101096101e6565b6040516100f8929190610fe9565b61011f61022c565b6040516100f89291906111e8565b610135610296565b005b6100eb6102fb565b6100eb6103af565b61015a610155366004610cdd565b61042b565b6040516100f89190611010565b61017a610175366004610d71565b610456565b6040516100f89190611063565b61015a610552565b61017a61055b565b6101aa6101a5366004610d15565b61057f565b6040516100f8919061101b565b61017a6105d1565b61017a6105f5565b60606101e1604051806020016040528060008152506106db565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561028857807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610291565b60009250600091505b509091565b61029e6107b4565b6102a66107fd565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156103a55780601f1061037a576101008083540402835291602001916103a5565b820191906000526020600020905b81548152906001019060200180831161038857829003601f168201915b5050505050905090565b60028054604080516020601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156103a55780601f1061037a576101008083540402835291602001916103a5565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b600080600061046361022c565b91509150610542604051806101c0016040528061047e6105d1565b73ffffffffffffffffffffffffffffffffffffffff1681526020016104a161055b565b73ffffffffffffffffffffffffffffffffffffffff1681526020018e81526020018d81526020018c81526020018a81526020018981526020018881526020018b81526020018781526020018481526020018381526020018673ffffffffffffffffffffffffffffffffffffffff16815260200161051c6102fb565b905260405161052e9190602001611084565b604051602081830303815290604052610812565b9c9b505050505050505050505050565b60015460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016105b4929190610fb9565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006105ff6105d1565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561064457600080fd5b505afa158015610658573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e19190610d55565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506106d573ffffffffffffffffffffffffffffffffffffffff831615156101ac6108a6565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016107a68183866108b8565b505050505050505050919050565b60006107e36000357fffffffff000000000000000000000000000000000000000000000000000000001661057f565b90506107fa6107f28233610932565b6101916108a6565b50565b610810610808610552565b1560d36108a6565b565b600061081c6107fd565b6000610827836109d1565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b816108b4576108b481610a19565b5050565b5b602081106108f65781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016108b9565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600061093c6105f5565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040161097893929190611024565b60206040518083038186803b15801561099057600080fd5b505afa1580156109a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c89190610cf9565b90505b92915050565b600060606109de836106db565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff8116610a12573d6000803e3d6000fd5b9392505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526107fa917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b80356109cb8161123d565b600082601f830112610ac3578081fd5b8135610ad6610ad18261121d565b6111f6565b818152915060208083019084810181840286018201871015610af757600080fd5b60005b84811015610b1f578135610b0d8161125f565b84529282019290820190600101610afa565b505050505092915050565b600082601f830112610b3a578081fd5b8135610b48610ad18261121d565b818152915060208083019084810181840286018201871015610b6957600080fd5b60005b84811015610b1f578135610b7f8161123d565b84529282019290820190600101610b6c565b600082601f830112610ba1578081fd5b8135610baf610ad18261121d565b818152915060208083019084810181840286018201871015610bd057600080fd5b60005b84811015610b1f578135610be68161123d565b84529282019290820190600101610bd3565b600082601f830112610c08578081fd5b8135610c16610ad18261121d565b818152915060208083019084810181840286018201871015610c3757600080fd5b60005b84811015610b1f57813584529282019290820190600101610c3a565b600082601f830112610c66578081fd5b813567ffffffffffffffff811115610c7c578182fd5b610cad60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016111f6565b9150808252836020828501011115610cc457600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215610cee578081fd5b8135610a128161123d565b600060208284031215610d0a578081fd5b8151610a128161125f565b600060208284031215610d26578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610a12578182fd5b600060208284031215610d66578081fd5b8151610a128161123d565b60008060008060008060008060006101208a8c031215610d8f578485fd5b893567ffffffffffffffff80821115610da6578687fd5b610db28d838e01610c56565b9a5060208c0135915080821115610dc7578687fd5b610dd38d838e01610c56565b995060408c0135915080821115610de8578687fd5b610df48d838e01610b2a565b985060608c0135975060808c0135915080821115610e10578687fd5b610e1c8d838e01610b91565b965060a08c0135915080821115610e31578586fd5b610e3d8d838e01610bf8565b955060c08c0135915080821115610e52578485fd5b50610e5f8c828d01610ab3565b93505060e08a01359150610e778b6101008c01610aa8565b90509295985092959850929598565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208085019450808401835b83811015610ed1578151151587529582019590820190600101610eb3565b509495945050505050565b6000815180845260208085019450808401835b83811015610ed157815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101610eef565b6000815180845260208085019450808401835b83811015610ed157815187529582019590820190600101610f34565b60008151808452815b81811015610f7557602081850181015186830182015201610f59565b81811115610f865782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b6000602082526109c86020830184610f50565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600060208252611098602083018451610e86565b60208301516110aa6040840182610e86565b5060408301516101c08060608501526110c76101e0850183610f50565b915060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808685030160808701526111038483610f50565b935060808701519150808685030160a08701526111208483610edc565b935060a08701519150808685030160c087015261113d8483610edc565b935060c08701519150808685030160e087015261115a8483610f21565b935060e087015191506101008187860301818801526111798584610ea0565b908801516101208881019190915288015161014080890191909152880151610160808901919091528801516101808089019190915288015190945091506101a06111c581880184610e86565b8701518685039091018387015290506111de8382610f50565b9695505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561121557600080fd5b604052919050565b600067ffffffffffffffff821115611233578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff811681146107fa57600080fd5b80151581146107fa57600080fdfea2646970667358221220139c11f5919330a49b431e9ec65da6abcaecfa2895b17cea9c855010670ff62c64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/bytecode/ComposableStablePoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/bytecode/ComposableStablePoolFactory.json new file mode 100644 index 0000000..fd7bbef --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/bytecode/ComposableStablePoolFactory.json @@ -0,0 +1,3 @@ +{ + "creationCode": "6101806040523480156200001257600080fd5b50604051620097243803806200972483398101604081905262000035916200036d565b83836040518060200162000049906200021c565b601f1982820381018352601f90910116604052805183903090839060006002820460a081905280830360e08190528185529091508362000095816200013d602090811b6200067c17901c565b60601b6001600160601b0319166080528285018051838252620000c4826200013d602090811b6200067c17901c565b6001600160601b0319606091821b811660c05296909352905261010095909552505092821b831661012052509290921b909116610140525050426276a700016101605281516200011c9060029060208501906200022a565b508051620001329060039060208401906200022a565b505050505062000415565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506200018b6001600160a01b03831615156101ac62000191565b50919050565b81620001a257620001a281620001a6565b5050565b620001b8816210905360ea1b620001bb565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b617ff3806200173183390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200026d57805160ff19168380011785556200029d565b828001600101855582156200029d579182015b828111156200029d57825182559160200191906001019062000280565b50620002ab929150620002af565b5090565b5b80821115620002ab5760008155600101620002b0565b600082601f830112620002d7578081fd5b81516001600160401b0380821115620002ee578283fd5b6040516020601f8401601f191682018101838111838210171562000310578586fd5b806040525081945083825286818588010111156200032d57600080fd5b600092505b8383101562000351578583018101518284018201529182019162000332565b83831115620003635760008185840101525b5050505092915050565b6000806000806080858703121562000383578384fd5b84516200039081620003ff565b6020860151909450620003a381620003ff565b60408601519093506001600160401b0380821115620003c0578384fd5b620003ce88838901620002c6565b93506060870151915080821115620003e4578283fd5b50620003f387828801620002c6565b91505092959194509250565b6001600160a01b0381168114620001b857600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405160601c610160516112a36200048e60003980610232528061025b52508061055d5250806105d35250806105835250806106e3525080610209528061075f5250806107045250806101e8528061073b52506112a36000f3fe608060405234801561001057600080fd5b50600436106100de5760003560e01c80636634b7531161008c578063739238d611610066578063739238d61461018f578063851c1bb3146101975780638d928af8146101b7578063aaabadc5146101bf576100de565b80636634b7531461014757806366b59f6c146101675780636c57f5a914610187576100de565b80632f2770db116100bd5780632f2770db1461012d5780633f819b6f1461013757806354fd4d501461013f576100de565b8062c194db146100e3578063174481fa146101015780632da47c4014610117575b600080fd5b6100eb6101c7565b6040516100f89190611050565b60405180910390f35b6101096101e6565b6040516100f8929190610fe9565b61011f61022c565b6040516100f89291906111e8565b610135610296565b005b6100eb6102fb565b6100eb6103af565b61015a610155366004610cdd565b61042b565b6040516100f89190611010565b61017a610175366004610d71565b610456565b6040516100f89190611063565b61015a610552565b61017a61055b565b6101aa6101a5366004610d15565b61057f565b6040516100f8919061101b565b61017a6105d1565b61017a6105f5565b60606101e1604051806020016040528060008152506106db565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561028857807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610291565b60009250600091505b509091565b61029e6107b4565b6102a66107fd565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156103a55780601f1061037a576101008083540402835291602001916103a5565b820191906000526020600020905b81548152906001019060200180831161038857829003601f168201915b5050505050905090565b60028054604080516020601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156103a55780601f1061037a576101008083540402835291602001916103a5565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b600080600061046361022c565b91509150610542604051806101c0016040528061047e6105d1565b73ffffffffffffffffffffffffffffffffffffffff1681526020016104a161055b565b73ffffffffffffffffffffffffffffffffffffffff1681526020018e81526020018d81526020018c81526020018a81526020018981526020018881526020018b81526020018781526020018481526020018381526020018673ffffffffffffffffffffffffffffffffffffffff16815260200161051c6102fb565b905260405161052e9190602001611084565b604051602081830303815290604052610812565b9c9b505050505050505050505050565b60015460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016105b4929190610fb9565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006105ff6105d1565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561064457600080fd5b505afa158015610658573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e19190610d55565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506106d573ffffffffffffffffffffffffffffffffffffffff831615156101ac6108a6565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016107a68183866108b8565b505050505050505050919050565b60006107e36000357fffffffff000000000000000000000000000000000000000000000000000000001661057f565b90506107fa6107f28233610932565b6101916108a6565b50565b610810610808610552565b1560d36108a6565b565b600061081c6107fd565b6000610827836109d1565b73ffffffffffffffffffffffffffffffffffffffff811660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b816108b4576108b481610a19565b5050565b5b602081106108f65781518352602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016108b9565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600061093c6105f5565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040161097893929190611024565b60206040518083038186803b15801561099057600080fd5b505afa1580156109a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c89190610cf9565b90505b92915050565b600060606109de836106db565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff8116610a12573d6000803e3d6000fd5b9392505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526107fa917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b80356109cb8161123d565b600082601f830112610ac3578081fd5b8135610ad6610ad18261121d565b6111f6565b818152915060208083019084810181840286018201871015610af757600080fd5b60005b84811015610b1f578135610b0d8161125f565b84529282019290820190600101610afa565b505050505092915050565b600082601f830112610b3a578081fd5b8135610b48610ad18261121d565b818152915060208083019084810181840286018201871015610b6957600080fd5b60005b84811015610b1f578135610b7f8161123d565b84529282019290820190600101610b6c565b600082601f830112610ba1578081fd5b8135610baf610ad18261121d565b818152915060208083019084810181840286018201871015610bd057600080fd5b60005b84811015610b1f578135610be68161123d565b84529282019290820190600101610bd3565b600082601f830112610c08578081fd5b8135610c16610ad18261121d565b818152915060208083019084810181840286018201871015610c3757600080fd5b60005b84811015610b1f57813584529282019290820190600101610c3a565b600082601f830112610c66578081fd5b813567ffffffffffffffff811115610c7c578182fd5b610cad60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016111f6565b9150808252836020828501011115610cc457600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215610cee578081fd5b8135610a128161123d565b600060208284031215610d0a578081fd5b8151610a128161125f565b600060208284031215610d26578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610a12578182fd5b600060208284031215610d66578081fd5b8151610a128161123d565b60008060008060008060008060006101208a8c031215610d8f578485fd5b893567ffffffffffffffff80821115610da6578687fd5b610db28d838e01610c56565b9a5060208c0135915080821115610dc7578687fd5b610dd38d838e01610c56565b995060408c0135915080821115610de8578687fd5b610df48d838e01610b2a565b985060608c0135975060808c0135915080821115610e10578687fd5b610e1c8d838e01610b91565b965060a08c0135915080821115610e31578586fd5b610e3d8d838e01610bf8565b955060c08c0135915080821115610e52578485fd5b50610e5f8c828d01610ab3565b93505060e08a01359150610e778b6101008c01610aa8565b90509295985092959850929598565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208085019450808401835b83811015610ed1578151151587529582019590820190600101610eb3565b509495945050505050565b6000815180845260208085019450808401835b83811015610ed157815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101610eef565b6000815180845260208085019450808401835b83811015610ed157815187529582019590820190600101610f34565b60008151808452815b81811015610f7557602081850181015186830182015201610f59565b81811115610f865782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b6000602082526109c86020830184610f50565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600060208252611098602083018451610e86565b60208301516110aa6040840182610e86565b5060408301516101c08060608501526110c76101e0850183610f50565b915060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808685030160808701526111038483610f50565b935060808701519150808685030160a08701526111208483610edc565b935060a08701519150808685030160c087015261113d8483610edc565b935060c08701519150808685030160e087015261115a8483610f21565b935060e087015191506101008187860301818801526111798584610ea0565b908801516101208881019190915288015161014080890191909152880151610160808901919091528801516101808089019190915288015190945091506101a06111c581880184610e86565b8701518685039091018387015290506111de8382610f50565b9695505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561121557600080fd5b604052919050565b600067ffffffffffffffff821115611233578081fd5b5060209081020190565b73ffffffffffffffffffffffffffffffffffffffff811681146107fa57600080fd5b80151581146107fa57600080fdfea2646970667358221220139c11f5919330a49b431e9ec65da6abcaecfa2895b17cea9c855010670ff62c64736f6c634300070100336105006040523480156200001257600080fd5b5060405162007ff338038062007ff3833981016040819052620000359162001b55565b6020810151600019620000488362000d93565b620000538462000dcc565b8461010001518560000151600087604001518860600151620000808a608001513062000e1560201b60201c565b8a60800151516001016001600160401b03811180156200009f57600080fd5b50604051908082528060200260200182016040528015620000ca578160200160208202803683370190505b508b61012001518c61014001518d61016001518e6101800151828289898d85336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b815250878781600390805190602001906200012c929190620017f2565b50805162000142906004906020840190620017f2565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001c090506276a70083111561019462000faf565b620001d462278d0082111561019562000faf565b4290910161014081905201610160528551620001f6906002111560c862000faf565b620002106200020462000fc4565b8751111560c962000faf565b620002268662000fc960201b6200154e1760201c565b620002318462000fd5565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f9062000262908d9060040162001ddb565b602060405180830381600087803b1580156200027d57600080fd5b505af115801562000292573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b8919062001b1d565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002ed9084908b908b9060040162001d3f565b600060405180830381600087803b1580156200030857600080fd5b505af11580156200031d573d6000803e3d6000fd5b505050508061018081815250508a6001600160a01b031663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200036457600080fd5b505afa15801562000379573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200039f919062001b36565b60601b6001600160601b0319166101a05250620003d1995050506001891015965061012c955062000faf945050505050565b620003e461138882111561012d62000faf565b6000620003ff826103e86200106960201b620015581760201c565b90506200040c8162001098565b5050805151620004216002821160c862000faf565b6200044660018203836020015151846040015151620010d760201b620015831760201c565b6101c0819052815180516000906200045a57fe5b60200260200101516001600160a01b0316610200816001600160a01b031660601b8152505081600001516001815181106200049157fe5b60200260200101516001600160a01b0316610220816001600160a01b031660601b815250508160000151600281518110620004c857fe5b60200260200101516001600160a01b0316610240816001600160a01b031660601b8152505060038111620004fe57600062000517565b8151805160039081106200050e57fe5b60200260200101515b60601b6001600160601b03191661026052600481116200053957600062000552565b8151805160049081106200054957fe5b60200260200101515b60601b6001600160601b0319166102805260058111620005745760006200058d565b8151805160059081106200058457fe5b60200260200101515b60601b6001600160601b0319166102a05281518051620005c69190600090620005b257fe5b6020026020010151620010f760201b60201c565b6102c05281518051620005e091906001908110620005b257fe5b6102e05281518051620005fa91906002908110620005b257fe5b61030052600381116200060f57600062000625565b620006258260000151600381518110620005b257fe5b61032052600481116200063a57600062000650565b620006508260000151600481518110620005b257fe5b6103405260058111620006655760006200067b565b6200067b8260000151600581518110620005b257fe5b61036052815151600019015b600081118015620006b857508251805130919083908110620006a557fe5b60200260200101516001600160a01b0316115b15620006c8576000190162000687565b6101e08190528251516060906001600160401b0381118015620006ea57600080fd5b5060405190808252806020026020018201604052801562000715578160200160208202803683370190505b50905060008080805b8751518110156200093857858110156200085457876020015181815181106200074357fe5b60200260200101518582815181106200075857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050620007c160006001600160a01b03168683815181106200079457fe5b60200260200101516001600160a01b031614158260060186620011c660201b620015a0179092919060201c565b935087604001518181518110620007d457fe5b60200260200101511562000849576200082060006001600160a01b0316868381518110620007fe57fe5b60200260200101516001600160a01b0316141561015562000faf60201b60201c565b6200083d60018286620011c660201b620015a0179092919060201c565b9350600192506200084e565b600191505b6200092f565b8581146200092f57876020015160018203815181106200087057fe5b60200260200101518582815181106200088557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050620008c160006001600160a01b03168683815181106200079457fe5b935087604001516001820381518110620008d757fe5b6020026020010151156200092a576200090160006001600160a01b0316868381518110620007fe57fe5b6200091e60018286620011c660201b620015a0179092919060201c565b9350600192506200092f565b600191505b6001016200071e565b50811560f890811b610460528115901b61048052835184906000906200095a57fe5b60200260200101516001600160a01b0316610380816001600160a01b031660601b81525050836001815181106200098d57fe5b60200260200101516001600160a01b03166103a0816001600160a01b031660601b8152505083600281518110620009c057fe5b60200260200101516001600160a01b03166103c0816001600160a01b031660601b815250506003845111620009f757600062000a0e565b8360038151811062000a0557fe5b60200260200101515b60601b6001600160601b0319166103e052835160041062000a3157600062000a48565b8360048151811062000a3f57fe5b60200260200101515b60601b6001600160601b03191661040052835160051062000a6b57600062000a82565b8360058151811062000a7957fe5b60200260200101515b60601b6001600160601b0319166104205250506104405250508251516020808501515160408601515162000ac595509293509190620010d7811b6200158317901c565b805160609062000ad6903062000e15565b8051909150600019015b60008111801562000b165750306001600160a01b031682828151811062000b0357fe5b60200260200101516001600160a01b0316115b1562000b26576000190162000ae0565b6000805b84515181101562000c3f578281141562000b4357600191505b60208501518051828401916000918490811062000b5c57fe5b60200260200101516001600160a01b03161462000c355762000bb6818760200151848151811062000b8957fe5b60200260200101518860400151858151811062000ba257fe5b6020026020010151620011ef60201b60201c565b8560200151828151811062000bc757fe5b60200260200101516001600160a01b0316817fdd6d1c9badb346de6925b358a472c937b41698d2632696759e43fd6527feeec48860400151858151811062000c0b57fe5b602002602001015160405162000c22919062001df0565b60405180910390a362000c3581620012ea565b5060010162000b2a565b5050505050600019811460f881901b6104c0526001600160601b0319606084901b166104a05262000c7283600262001329565b62000c7f83600362001329565b801562000c995762000c9383600062001329565b62000d58565b60405163178b2b9360e21b815262000d2d906001600160a01b03851690635e2cae4c9062000ccd9060009060040162001df0565b60206040518083038186803b15801562000ce657600080fd5b505afa15801562000cfb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d21919062001b1d565b83111561025862000faf565b600060008051602062007fd38339815191528360405162000d4f919062001df0565b60405180910390a25b8062000d65578162000d68565b60005b6104e0525050506101a0810151805162000d8b91600d91602090910190620017f2565b505062001e62565b62000d9d62001873565b6040518060600160405280836080015181526020018360a0015181526020018360c0015181525090505b919050565b62000dd662001873565b604051806060016040528062000df784608001513062000e1560201b60201c565b81526020018360a0015181526020018360e001518152509050919050565b606082516001016001600160401b038111801562000e3257600080fd5b5060405190808252806020026020018201604052801562000e5d578160200160208202803683370190505b50905082516000141562000ea057818160008151811062000e7a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505062000fa9565b82515b60008111801562000edc5750826001600160a01b031684600183038151811062000ec957fe5b60200260200101516001600160a01b0316115b1562000f295783600182038151811062000ef257fe5b602002602001015182828151811062000f0757fe5b6001600160a01b03909216602092830291909101909101526000190162000ea3565b60005b8181101562000f785784818151811062000f4257fe5b602002602001015183828151811062000f5757fe5b6001600160a01b039092166020928302919091019091015260010162000f2c565b508282828151811062000f8757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050505b92915050565b8162000fc05762000fc081620014d4565b5050565b600690565b8062000fc081620014e9565b62000fee62000fe362001570565b82101560cb62000faf565b6200100762000ffc62001579565b82111560ca62000faf565b620010298160c0603f6008546200158560201b620015c717909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906200105e90839062001df0565b60405180910390a150565b600082820262001091841580620010895750838583816200108657fe5b04145b600362000faf565b9392505050565b620010a681804280620015aa565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a0233816040516200105e919062001df0565b620010f28284148015620010ea57508183145b606762000faf565b505050565b60006001600160a01b0382163014156200111b5750670de0b6b3a764000062000dc7565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200115757600080fd5b505afa1580156200116c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001192919062001d1c565b60ff1690506000620011b16012836200161d60201b620015ef1760201c565b600a0a670de0b6b3a764000002949350505050565b60006001821b1984168284620011de576000620011e1565b60015b60ff16901b17949350505050565b6000826001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200122b57600080fd5b505afa15801562001240573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001266919062001b1d565b6000858152600a602090815260409091205491925062001295908290849086906200160562001635821b17901c565b6000868152600a602052604090819020919091555185907fb77a83204ca282e08dc3a65b0a1ca32ea4e6875c38ef0bf5bf75e52a67354fac90620012db90859062001df0565b60405180910390a25050505050565b6000818152600a602090815260409091205490620013139082906200163d62001691821b17901c565b6000928352600a60205260409092209190915550565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c3263906200135a90859060040162001df0565b60206040518083038186803b1580156200137357600080fd5b505afa15801562001388573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620013ae919062001b1d565b905081620013f257620013cc81620016bc60201b620016551760201c565b600b80546001600160401b0319166001600160401b0392909216919091179055620014a6565b600282141562001448576200141281620016bc60201b620016551760201c565b600b80546001600160401b03929092166801000000000000000002600160401b600160801b0319909216919091179055620014a6565b600382141562001499576200146881620016bc60201b620016551760201c565b600b80546001600160401b0392909216600160801b02600160801b600160c01b0319909216919091179055620014a6565b620014a66101bb620014d4565b8160008051602062007fd383398151915282604051620014c7919062001df0565b60405180910390a2505050565b620014e6816210905360ea1b620016da565b50565b600281511015620014fa57620014e6565b6000816000815181106200150a57fe5b602002602001015190506000600190505b8251811015620010f25760008382815181106200153457fe5b6020026020010151905062001565816001600160a01b0316846001600160a01b031610606562000faf60201b60201c565b91506001016200151b565b64e8d4a5100090565b67016345785d8a000090565b6000620015948484846200173b565b506001901b60001901811b1992909216911b1790565b620015c48160c060406200179660201b620016721760201c565b620015de83608060406200179660201b620016721760201c565b620015f7856040806200179660201b620016721760201c565b6200161187600060406200179660201b620016721760201c565b17171760095550505050565b60006200162f83831115600162000faf565b50900390565b60006200164a606084901c1561014962000faf565b6200168942830160e06020620016738660c083838c8c60006060620015c762001585871b17861c565b6200158560201b620015c717909392919060201c565b949350505050565b600062000fa9620016a283620017ab565b606080856200158560201b620015c717909392919060201c565b6000620016d66001600160401b038311156101ba62000faf565b5090565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6200174c6101008310606462000faf565b62001785600182101580156200177d57506200177960ff8461010003620017cb60201b620016851760201c565b8211155b606462000faf565b620010f283821c156101b462000faf565b6000620017a58484846200173b565b50501b90565b600062000fa96000606084620017e360201b6200169b179092919060201c565b6000818310620017dc578162001091565b5090919050565b6001901b6000190191901c1690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200183557805160ff191683800117855562001865565b8280016001018555821562001865579182015b828111156200186557825182559160200191906001019062001848565b50620016d692915062001894565b60405180606001604052806060815260200160608152602001606081525090565b5b80821115620016d6576000815560010162001895565b805162000fa98162001e4c565b600082601f830112620018c9578081fd5b8151620018e0620018da8262001e20565b62001df9565b8181529150602080830190848101818402860182018710156200190257600080fd5b6000805b858110156200193257825180151581146200191f578283fd5b8552938301939183019160010162001906565b50505050505092915050565b600082601f8301126200194f578081fd5b815162001960620018da8262001e20565b8181529150602080830190848101818402860182018710156200198257600080fd5b60005b84811015620019ae5781516200199b8162001e4c565b8452928201929082019060010162001985565b505050505092915050565b600082601f830112620019ca578081fd5b8151620019db620018da8262001e20565b818152915060208083019084810181840286018201871015620019fd57600080fd5b60005b84811015620019ae57815162001a168162001e4c565b8452928201929082019060010162001a00565b600082601f83011262001a3a578081fd5b815162001a4b620018da8262001e20565b81815291506020808301908481018184028601820187101562001a6d57600080fd5b60005b84811015620019ae5781518452928201929082019060010162001a70565b600082601f83011262001a9f578081fd5b81516001600160401b0381111562001ab5578182fd5b602062001acb601f8301601f1916820162001df9565b9250818352848183860101111562001ae257600080fd5b60005b8281101562001b0257848101820151848201830152810162001ae5565b8281111562001b145760008284860101525b50505092915050565b60006020828403121562001b2f578081fd5b5051919050565b60006020828403121562001b48578081fd5b8151620010918162001e4c565b60006020828403121562001b67578081fd5b81516001600160401b038082111562001b7e578283fd5b81840191506101c080838703121562001b95578384fd5b62001ba08162001df9565b905062001bae8684620018ab565b815262001bbf8660208501620018ab565b602082015260408301518281111562001bd6578485fd5b62001be48782860162001a8e565b60408301525060608301518281111562001bfc578485fd5b62001c0a8782860162001a8e565b60608301525060808301518281111562001c22578485fd5b62001c30878286016200193e565b60808301525060a08301518281111562001c48578485fd5b62001c5687828601620019b9565b60a08301525060c08301518281111562001c6e578485fd5b62001c7c8782860162001a29565b60c08301525060e08301518281111562001c94578485fd5b62001ca287828601620018b8565b60e083015250610100838101519082015261012080840151908201526101408084015190820152610160808401519082015261018062001ce587828601620018ab565b908201526101a0838101518381111562001cfd578586fd5b62001d0b8882870162001a8e565b918301919091525095945050505050565b60006020828403121562001d2e578081fd5b815160ff8116811462001091578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562001d8b5762001d78855162001e40565b8352938301939183019160010162001d63565b505084810360408601528551808252908201925081860190845b8181101562001dcd5762001dba835162001e40565b8552938301939183019160010162001da5565b509298975050505050505050565b602081016003831062001dea57fe5b91905290565b90815260200190565b6040518181016001600160401b038111828210171562001e1857600080fd5b604052919050565b60006001600160401b0382111562001e36578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114620014e657600080fd5b60805160a05160c05160e0516101005160601c6101205160601c6101405161016051610180516101a05160601c6101c0516101e0516102005160601c6102205160601c6102405160601c6102605160601c6102805160601c6102a05160601c6102c0516102e051610300516103205161034051610360516103805160601c6103a05160601c6103c05160601c6103e05160601c6104005160601c6104205160601c610440516104605160f81c6104805160f81c6104a05160601c6104c05160f81c6104e051615fb36200202060003980610e2552508061090a52508061088a52806108b552806108e05250806147a9525080614785525080612b3c52806143fe525080611c5c525080611c2c525080611bfc525080611bcc525080611b9c525080611b6c525080612fcc525080612f9c525080612f6c525080612f3c525080612f0c525080612edc525080611eb9525080611e77525080611e35525080611df3525080611db1525080611d6f52508061104e5250806116ca525080611279525080610be4525080611b40525080611b1c52508061114e52508061112a525080611086525080612d4a525080612d8c525080612d6b5250615fb36000f3fe608060405234801561001057600080fd5b50600436106103785760003560e01c806370464016116101d3578063a457c2d711610104578063d505accf116100a2578063ddf4627b1161007c578063ddf4627b146106e3578063eb0f24d6146106eb578063ed24911d146106f3578063f4b7964d146106fb57610378565b8063d505accf146106aa578063d5c096c4146106bd578063dd62ed3e146106d057610378565b8063ab7759f1116100de578063ab7759f11461067f578063b35056b814610692578063b7b814fc1461069a578063d2946c2b146106a257610378565b8063a457c2d714610651578063a9059cbb14610664578063aaabadc51461067757610378565b8063851c1bb311610171578063893d20e81161014b578063893d20e8146106195780638d928af81461062e57806390193b7c1461063657806395d89b411461064957610378565b8063851c1bb3146105eb578063876f303b146105fe57806387ec68171461060657610378565b80637ecebe00116101ad5780637ecebe00146105a55780637f1260d1146105b857806382687a56146105db5780638456cb59146105e357610378565b8063704640161461055e57806370a082311461057157806374f3b0091461058457610378565b80633644e515116102ad57806354a844ba1161024b57806355c676281161022557806355c67628146105165780636028bfd41461051e578063679aefce1461053f5780636daccffa1461054757610378565b806354a844ba146104f357806354dea00a146104fb57806354fd4d501461050e57610378565b8063395093511161028757806339509351146104af5780633c975d51146104c25780633f4ba83a146104d857806350dd6ed9146104e057610378565b80633644e5151461048c57806338e9922e1461049457806338fff2d0146104a757610378565b80631c0de0511161031a57806323b872dd116102f457806323b872dd1461043e5780632df2c7c0146104515780632f1a0bc914610464578063313ce5671461047757610378565b80631c0de051146103fd5780631dd746ea14610414578063238a2d591461042957610378565b8063095ea7b311610356578063095ea7b3146103c35780630da0669c146103e357806315b0015b146103ed57806318160ddd146103f557610378565b806301ec954a1461037d57806304842d4c146103a657806306fdde03146103ae575b600080fd5b61039061038b366004615a13565b61070e565b60405161039d9190615dc3565b60405180910390f35b6103906107b4565b6103b66107c3565b60405161039d9190615e99565b6103d66103d1366004615638565b610859565b60405161039d9190615da0565b6103eb610870565b005b6103d6610908565b61039061092c565b610405610932565b60405161039d93929190615dab565b61041c61095b565b60405161039d9190615d68565b610431610965565b60405161039d9190615d1b565b6103d661044c366004615588565b610a00565b6103eb61045f366004615534565b610a74565b6103eb610472366004615b62565b610ad0565b61047f610bb3565b60405161039d9190615f04565b610390610bbc565b6103eb6104a2366004615b32565b610bc6565b610390610be2565b6103d66104bd366004615638565b610c06565b6104ca610c41565b60405161039d929190615edb565b6103eb610c6c565b6103eb6104ee36600461584e565b610c7e565b6103eb610c9c565b610390610509366004615534565b610cae565b6103b6610cc9565b610390610d2a565b61053161052c36600461574f565b610d3d565b60405161039d929190615eac565b610390610d74565b61054f610de0565b60405161039d93929190615ec5565b61039061056c366004615b32565b610dfb565b61039061057f366004615534565b610ec1565b61059761059236600461574f565b610edc565b60405161039d929190615d7b565b6103906105b3366004615534565b610fdf565b6105cb6105c6366004615534565b610fea565b60405161039d9493929190615ee9565b61039061104c565b6103eb611070565b6103906105f93660046157f2565b611082565b6103906110d4565b61053161061436600461574f565b611102565b610621611128565b60405161039d9190615d07565b61062161114c565b610390610644366004615534565b611170565b6103b661118b565b6103d661065f366004615638565b6111ec565b6103d6610672366004615638565b61122a565b610621611237565b6103d661068d366004615534565b611241565b6103d6611254565b6103eb611265565b610621611277565b6103eb6106b83660046155c8565b61129b565b6105976106cb36600461574f565b611326565b6103906106de366004615550565b611449565b610390611486565b6103eb61148c565b6103906114b8565b6103eb610709366004615638565b6114c2565b6000846080015161073b61072061114c565b6001600160a01b0316336001600160a01b03161460cd6116aa565b610750610746610be2565b82146101f46116aa565b6107586116b8565b61076a84846107656116c8565b6116ec565b6060610774611704565b905060008751600181111561078557fe5b1461079c57610797878787878561179d565b6107a9565b6107a987878787856117f6565b979650505050505050565b60006107be611831565b905090565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561084f5780601f106108245761010080835404028352916020019161084f565b820191906000526020600020905b81548152906001019060200180831161083257829003601f168201915b5050505050905090565b6000610866338484611838565b5060015b92915050565b6108786118a0565b610880610908565b156108b0576108b07f0000000000000000000000000000000000000000000000000000000000000000600061190d565b6108db7f0000000000000000000000000000000000000000000000000000000000000000600261190d565b6109067f0000000000000000000000000000000000000000000000000000000000000000600361190d565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061093f611afd565b15925061094a611b1a565b9150610954611b3e565b9050909192565b60606107be611704565b606060006109716116c8565b905060608167ffffffffffffffff8111801561098c57600080fd5b506040519080825280602002602001820160405280156109b6578160200160208202803683370190505b50905060005b828110156109f9576109cd81611b62565b8282815181106109d957fe5b6001600160a01b03909216602092830291909101909101526001016109bc565b5091505090565b600080610a0d8533611449565b9050610a31336001600160a01b0387161480610a295750838210155b61019e6116aa565b610a3c858585611c8b565b336001600160a01b03861614801590610a5757506000198114155b15610a6957610a698533858403611838565b506001949350505050565b6000610a7f82611d6b565b90506000610a8c82611b62565b9050610aa56001600160a01b03821615156101556116aa565b6000828152600a6020526040812054610abd90611ef9565b9050610aca838383611f08565b50505050565b610ad8611feb565b610ae8600183101561012c6116aa565b610af961138883111561012d6116aa565b6000610b0582426115ef565b9050610b196201518082101561013d6116aa565b600080610b24612031565b91509150610b35811561013e6116aa565b6000610b43866103e8611558565b90506000838211610b7257610b6d610b5e6201518086611558565b610b688488611558565b6120a5565b610b8c565b610b8c610b826201518084611558565b610b688688611558565b9050610b9e600282111561013f6116aa565b610baa848342896120d8565b50505050505050565b60055460ff1690565b60006107be6114b8565b610bce611feb565b610bd6612127565b610bdf8161213a565b50565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610866918590610c3c90866121b3565b611838565b600c546000908190610c568160e9601761169b565b9250610c6581600060e961169b565b9150509091565b610c74611feb565b61090660006121c5565b610c86611feb565b610c8e612127565b610c988282612256565b5050565b610ca4611feb565b6109066001612364565b6000610cc1610cbc83611d6b565b6123bb565b90505b919050565b600d8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561084f5780601f106108245761010080835404028352916020019161084f565b6008546000906107be9060c0603f61169b565b60006060610d538651610d4e6116c8565b61240e565b610d688989898989898961241b61243d6124a6565b97509795505050505050565b60006060600080600080610d8661263d565b9398509196509450925090506000610d9e85856121b3565b90506000610daa612031565b5090506000848214610dc557610dc0828961272d565b610dc7565b835b9050610dd3818461288f565b9850505050505050505090565b6000806000610ded612031565b90949093506103e892509050565b6000610e05611254565b15610e1257506000610cc4565b81610e5e57610e1f610908565b610e49577f0000000000000000000000000000000000000000000000000000000000000000610e57565b600b5467ffffffffffffffff165b9050610cc4565b6002821415610e865750600b5468010000000000000000900467ffffffffffffffff16610cc4565b6003821415610eb65750600b54700100000000000000000000000000000000900467ffffffffffffffff16610cc4565b610cc46101bb6128e0565b6001600160a01b031660009081526020819052604090205490565b60608088610eeb61072061114c565b610ef6610746610be2565b60606000610f038661290a565b15610f2b57610f10612939565b610f2289610f1c61092c565b8861294c565b92509050610f7d565b610f336116b8565b6060610f3d611704565b9050610f498a82612990565b610f6d8d8d8d8d8d610f59611254565b610f63578d610f66565b60005b878e61241b565b93509150610f7b838261243d565b505b610f878b826129f9565b81895167ffffffffffffffff81118015610fa057600080fd5b50604051908082528060200260200182016040528015610fca578160200160208202803683370190505b509450945050505b5097509795505050505050565b6000610cc182611170565b6000806000806000600a6000610fff88611d6b565b815260208101919091526040016000205490506110208115156101556116aa565b61102981612a03565b945061103481612a11565b935061103f81612a1f565b9597949650949392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b611078611feb565b61090660016121c5565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016110b7929190615c91565b604051602081830303815290604052805190602001209050919050565b60008060006110e161263d565b505092509250506110fb81836121b390919063ffffffff16565b9250505090565b600060606111138651610d4e6116c8565b610d6889898989898989612a41612a526124a6565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561084f5780601f106108245761010080835404028352916020019161084f565b6000806111f93385611449565b90508083106112135761120e33856000611838565b611220565b6112203385858403611838565b5060019392505050565b6000610866338484611c8b565b60006107be612abb565b6000610cc161124f83611d6b565b612b35565b6008546000906107be9060ff612b5d565b61126d611feb565b6109066000612364565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886112ca8c611170565b896040516020016112e096959493929190615deb565b6040516020818303038152906040528051906020012090506113118882611308878787612b67565b886101f8612ba6565b61131c888888611838565b5050505050505050565b6060808861133561072061114c565b611340610746610be2565b6113486116b8565b6060611352611704565b905061135c61092c565b61140957600060606113718d8d8d868b612bfd565b9150915061138a611380611831565b83101560cc6116aa565b61139c6000611397611831565b612cd6565b6113af8b6113a8611831565b8403612cd6565b6113b98184612a52565b808a5167ffffffffffffffff811180156113d257600080fd5b506040519080825280602002602001820160405280156113fc578160200160208202803683370190505b5095509550505050610fd2565b6114138882612990565b6000606061143b8d8d8d8d8d611427611254565b611431578d611434565b60005b898e612a41565b915091506113af8b83612cd6565b600061145361114c565b6001600160a01b0316826001600160a01b03161415611475575060001961086a565b61147f8383612ce0565b905061086a565b60001981565b611494611feb565b60008061149f612031565b915091506114af816101406116aa565b610c9882612d0b565b60006107be612d46565b6114ca611feb565b60006114d583611d6b565b905060006114e282611b62565b90506114fb6001600160a01b03821615156101556116aa565b611506828285611f08565b806001600160a01b0316827fdd6d1c9badb346de6925b358a472c937b41698d2632696759e43fd6527feeec4856040516115409190615dc3565b60405180910390a350505050565b80610c9881612de3565b600082820261157c84158061157557508385838161157257fe5b04145b60036116aa565b9392505050565b61159b828414801561159457508183145b60676116aa565b505050565b60006001821b19841682846115b65760006115b9565b60015b60ff16901b17949350505050565b60006115d4848484612e5c565b5082821b6000196001831b01831b198516175b949350505050565b60006115ff8383111560016116aa565b50900390565b6000611618606084901c156101496116aa565b6115e742830160e060206116358660c083838c8c600060606115c7565b9291906115c7565b6000610cc161164b83612a03565b83906060806115c7565b600061166e67ffffffffffffffff8311156101ba6116aa565b5090565b600061167f848484612e5c565b50501b90565b6000818310611694578161157c565b5090919050565b6001901b6000190191901c1690565b81610c9857610c98816128e0565b6116c0612ea2565b610906612eaa565b7f000000000000000000000000000000000000000000000000000000000000000090565b61159b81841080156116fd57508183105b60646116aa565b606060006117106116c8565b905060608167ffffffffffffffff8111801561172b57600080fd5b50604051908082528060200260200182016040528015611755578160200160208202803683370190505b50905060005b828110156109f95761177e61176f826123bb565b61177883612ed2565b90612ff0565b82828151811061178a57fe5b602090810291909101015260010161175b565b60208501516000906001600160a01b03163014806117c7575060408601516001600160a01b031630145b6117dd576117d8868686868661301c565b6117ea565b6117ea8686868686613086565b90505b95945050505050565b60208501516000906001600160a01b0316301480611820575060408601516001600160a01b031630145b6117dd576117d8868686868661318a565b620f424090565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611893908590615dc3565b60405180910390a3505050565b6118a8612127565b606060008060006118b761263d565b94509450945050935060008311156118d2576118d2836131e1565b60006118dc612031565b50905060008382146118f7576118f2828761272d565b6118f9565b825b905061190582826131f2565b505050505050565b6040517f1a7c32630000000000000000000000000000000000000000000000000000000081526000906001600160a01b03841690631a7c326390611955908590600401615dc3565b60206040518083038186803b15801561196d57600080fd5b505afa158015611981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a59190615b4a565b9050816119f3576119b581611655565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055611ac0565b6002821415611a5057611a0581611655565b600b805467ffffffffffffffff9290921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055611ac0565b6003821415611ab557611a6281611655565b600b805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff909216919091179055611ac0565b611ac06101bb6128e0565b817f6bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a82604051611af09190615dc3565b60405180910390a2505050565b6000611b07611b3e565b4211806107be57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b600081611b9057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b8160011415611bc057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b8160021415611bf057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b8160031415611c2057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b8160041415611c5057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b8160051415611c8057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b610cc46101356128e0565b611ca26001600160a01b03841615156101986116aa565b611cb96001600160a01b03831615156101996116aa565b611cc483838361159b565b6001600160a01b038316600090815260208190526040902054611cea90826101a0613218565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611d1990826121b3565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611893908590615dc3565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611daf57506000610cc4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611df157506001610cc4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e3357506002610cc4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e7557506003610cc4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611eb757506004610cc4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611c8057506005610cc4565b6000610cc18260c0602061169b565b6000826001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f4357600080fd5b505afa158015611f57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7b9190615b4a565b6000858152600a6020526040902054909150611f98818385611605565b6000868152600a602052604090819020919091555185907fb77a83204ca282e08dc3a65b0a1ca32ea4e6875c38ef0bf5bf75e52a67354fac90611fdc908590615dc3565b60405180910390a25050505050565b600061201a6000357fffffffff0000000000000000000000000000000000000000000000000000000016611082565b9050610bdf612029823361322e565b6101916116aa565b600080600080600080612042613317565b93509350935093508042101561209557600194508383111561207957818103824203858503028161206f57fe5b0484019550612090565b818103824203848603028161208a57fe5b04840395505b61209d565b600094508295505b505050509091565b60006120b482151560046116aa565b826120c15750600061086a565b8160018403816120cd57fe5b04600101905061086a565b6120e484848484613376565b7f1835882ee7a34ac194f717a35e09bb1d24c82a3b9d854ab6c9749525b714cdf2848484846040516121199493929190615ee9565b60405180910390a150505050565b610906612132611afd565b6101926116aa565b61214f6121456133b5565b82101560cb6116aa565b61216461215a6133be565b82111560ca6116aa565b600854612175908260c0603f6115c7565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906121a8908390615dc3565b60405180910390a150565b600082820161157c84821015836116aa565b80156121e5576121e06121d6611b1a565b42106101936116aa565b6121fa565b6121fa6121f0611b3e565b42106101a96116aa565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be64906121a8908390615da0565b6000612260610be2565b9050600061226c61114c565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b8152600401612299929190615e64565b60806040518083038186803b1580156122b157600080fd5b505afa1580156122c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e99190615b83565b6040517f18e736d40000000000000000000000000000000000000000000000000000000081529094506001600160a01b03851693506318e736d49250612336915085908790600401615e4b565b600060405180830381600087803b15801561235057600080fd5b505af115801561131c573d6000803e3d6000fd5b600854612373908260ff6115a0565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c8906123a6908390615da0565b60405180910390a180610bdf57610bdf6133ca565b60006123c561104c565b8214156123db5750670de0b6b3a7640000610cc4565b6000828152600a602052604090205480156123fe576123f981612a03565b61157c565b670de0b6b3a76400009392505050565b610c9881831460676116aa565b6000606061242c600088868661349c565b915091509850989650505050505050565b8151815161244c90829061240e565b60005b81811015610aca5761248784828151811061246657fe5b602002602001015184838151811061247a57fe5b602002602001015161288f565b84828151811061249357fe5b602090810291909101015260010161244f565b333014612595576000306001600160a01b03166000366040516124ca929190615cc1565b6000604051808303816000865af19150503d8060008114612507576040519150601f19603f3d011682016040523d82523d6000602084013e61250c565b606091505b50509050806000811461251b57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114612577573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b61259d6116b8565b60606125a7611704565b90506125b38782612990565b600060606125cb8c8c8c8c8c8c898d8d63ffffffff16565b915091506125dd81848663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08301526020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b6060600080600080606061264f61114c565b6001600160a01b031663f94d4668612665610be2565b6040518263ffffffff1660e01b81526004016126819190615dc3565b60006040518083038186803b15801561269957600080fd5b505afa1580156126ad573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126d59190810190615663565b509150506126ea816126e5611704565b612990565b6126f38161354a565b965094506000612701610c41565b90945090506000612713888684613583565b945090506127218782613610565b95505050509091929394565b80516000908190815b8181101561276e5761276485828151811061274d57fe5b6020026020010151846121b390919063ffffffff16565b9250600101612736565b508161277f5760009250505061086a565b600082868302825b60ff811015612878578260005b868110156127d5576127cb6127a98387611558565b6127c68c84815181106127b857fe5b60200260200101518a611558565b613628565b9150600101612794565b5083945061282e61280d6128076127ec848a611558565b6128016127f9888d611558565b6103e8613628565b906121b3565b86611558565b6127c661281d8960010185611558565b6128016127f96103e889038a611558565b93508484111561285657600185850311612851578397505050505050505061086a565b61286f565b60018486031161286f578397505050505050505061086a565b50600101612787565b506128846101416128e0565b505050505092915050565b600061289e82151560046116aa565b826128ab5750600061086a565b670de0b6b3a7640000838102906128ce908583816128c557fe5b041460056116aa565b8281816128d757fe5b0491505061086a565b610bdf817f42414c0000000000000000000000000000000000000000000000000000000000613648565b6000808251118015610cc1575060ff80168280602001905181019061292f9190615bc3565b60ff161492915050565b610906612944611254565b6101b66116aa565b600060606000606061295d8761354a565b91509150600060606129708385896136c3565b91509150816129808260006136ef565b9550955050505050935093915050565b8151815161299f90829061240e565b60005b81811015610aca576129da8482815181106129b957fe5b60200260200101518483815181106129cd57fe5b6020026020010151612ff0565b8482815181106129e657fe5b60209081029190910101526001016129a2565b610c9882826137ac565b6000610cc18282606061169b565b6000610cc18260608061169b565b600080612a2b83611ef9565b9150612a3a8360e0602061169b565b9050915091565b6000606061242c600188868661349c565b81518151612a6190829061240e565b60005b81811015610aca57612a9c848281518110612a7b57fe5b6020026020010151848381518110612a8f57fe5b6020026020010151613878565b848281518110612aa857fe5b6020908102919091010152600101612a64565b6000612ac561114c565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015612afd57600080fd5b505afa158015612b11573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107be9190615832565b6000610cc17f0000000000000000000000000000000000000000000000000000000000000000835b1c60019081161490565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b6000612bb1856138c6565b9050612bc7612bc18783876138e2565b836116aa565b612bd6428410156101b86116aa565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606000612c0c84613991565b9050612c276000826003811115612c1f57fe5b1460ce6116aa565b6060612c32856139a7565b9050612c408151875161240e565b612c4a8187612990565b6000612c54612031565b5090506060612c62836139bd565b90506000612c70838361272d565b9050806000612c8d6d8000000000000000000000000000836115ef565b9050612c998d82612cd6565b8086612ca361104c565b81518110612cad57fe5b602002602001018181525050612cc385846131f2565b509c939b50929950505050505050505050565b610c988282613a5f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b612d1781824242613376565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a0233816040516121a89190615dc3565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612db3613aec565b30604051602001612dc8959493929190615e1f565b60405160208183030381529060405280519060200120905090565b600281511015612df257610bdf565b600081600081518110612e0157fe5b602002602001015190506000600190505b825181101561159b576000838281518110612e2957fe5b60200260200101519050612e52816001600160a01b0316846001600160a01b03161060656116aa565b9150600101612e12565b612e6b610100831060646116aa565b612e93600182101580156116fd5750612e8960ff8461010003611685565b82111560646116aa565b61159b83821c156101b46116aa565b610906612127565b6000612eb46116c8565b905060005b81811015610c9857612eca81613af0565b600101612eb9565b600081612f0057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b8160011415612f3057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b8160021415612f6057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b8160031415612f9057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b8160041415612fc057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b8160051415611c8057507f0000000000000000000000000000000000000000000000000000000000000000610cc4565b600082820261300a84158061157557508385838161157257fe5b670de0b6b3a764000090049392505050565b60006130288583612990565b613049866060015183858151811061303c57fe5b6020026020010151613b44565b6060870152600061305c87878787613b50565b905061307b8184878151811061306e57fe5b6020026020010151613b64565b90506107a981613b70565b600080808751600181111561309757fe5b1490506130a48684612990565b6130c4876060015184836130b857866130ba565b875b8151811061303c57fe5b876060018181525050600060606000806130dd8a613b8c565b93509350935093506000806130f061104c565b8a1461311657613111878e60600151876131098e613bf5565b888b89613c2a565b613131565b613131878e60600151876131298f613bf5565b888b89613c63565b915091506131428486858985613c87565b8661315c57613157828a8d8151811061306e57fe5b613179565b613179828a8c8151811061316c57fe5b6020026020010151613d07565b9d9c50505050505050505050505050565b60006131998660600151613d13565b60608701526131a88583612990565b6131bc866060015183868151811061303c57fe5b606087015260006131cf87878787613d34565b90506107a98184868151811061316c57fe5b610bdf6131ec611277565b82612cd6565b6131ff81600060e9611672565b61320c8360e96017611672565b17600c55610c98613d48565b600061322784841115836116aa565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b61324d611128565b6001600160a01b031614158015613268575061326883613d7e565b1561329057613275611128565b6001600160a01b0316336001600160a01b031614905061086a565b613298612abb565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016132c793929190615dcc565b60206040518083038186803b1580156132df57600080fd5b505afa1580156132f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147f919061572f565b6000806000806133366000604060095461169b9092919063ffffffff16565b6009549094506133489060408061169b565b60095490935061335b906080604061169b565b60095490925061336e9060c0604061169b565b905090919293565b6133838160c06040611672565b6133908360806040611672565b61339c85604080611672565b6133a98760006040611672565b17171760095550505050565b64e8d4a5100090565b67016345785d8a000090565b60606133d461114c565b6001600160a01b031663f94d46686133ea610be2565b6040518263ffffffff1660e01b81526004016134069190615dc3565b60006040518083038186803b15801561341e57600080fd5b505afa158015613432573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261345a9190810190615663565b5091505061346a816126e5611704565b6060613475826139bd565b90506000613481612031565b5090506000613490828461272d565b9050610aca82826131f2565b60006060600060606000806134b089613b8c565b93509350935093506153d08a6134c857613d896134cc565b613e1e5b9050600060606134e4868689878f8f8963ffffffff16565b915091506153d08d6134f8576115ef6134fc565b6121b35b9050613509878383613e9c565b600061351989858463ffffffff16565b90506135288789888c85613c87565b836135348460006136ef565b9a509a5050505050505050505094509492505050565b600060606135718361355a61104c565b8151811061356457fe5b6020026020010151613f10565b61357a846139bd565b91509150915091565b60008060008060006135958888613f24565b92509250925060008684116135ab5760006135af565b8684035b905060008484116135c15760006135c5565b8484035b905060006135e06135d66000610dfb565b611778858761288f565b905060006135fb6135f16002610dfb565b611778858861288f565b919091019b939a509298505050505050505050565b600061157c61361f8484611558565b6127c684613fa6565b600061363782151560046116aa565b81838161364057fe5b049392505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000606060006136d284613fcc565b905060606136e1878784613fe2565b919791965090945050505050565b6060825160010167ffffffffffffffff8111801561370c57600080fd5b50604051908082528060200260200182016040528015613736578160200160208202803683370190505b50905060005b81518110156137a55761374d61104c565b8114613784578361375c61104c565b821061376b576001820361376d565b815b8151811061377757fe5b6020026020010151613786565b825b82828151811061379257fe5b602090810291909101015260010161373c565b5092915050565b6137c36001600160a01b038316151561019b6116aa565b6137cf8260008361159b565b6001600160a01b0382166000908152602081905260409020546137f590826101b2613218565b6001600160a01b0383166000908152602081905260409020556138286138238261381d61092c565b90614091565b61409f565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161386c9190615dc3565b60405180910390a35050565b600061388782151560046116aa565b826138945750600061086a565b670de0b6b3a7640000838102906138ae908583816128c557fe5b8260018203816138ba57fe5b0460010191505061086a565b60006138d0612d46565b826040516020016110b7929190615cd1565b60006138f482516041146101b96116aa565b60208281015160408085015160608601518251600080825295019283905292939092811a9160019061392d908990859088908890615e7b565b6020604051602081039080840390855afa15801561394f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906139855750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b600081806020019051810190610cc1919061595d565b60608180602001905181019061157c9190615978565b606080600183510367ffffffffffffffff811180156139db57600080fd5b50604051908082528060200260200182016040528015613a05578160200160208202803683370190505b50905060005b81518110156137a55783613a1d61104c565b8210613a2c5781600101613a2e565b815b81518110613a3857fe5b6020026020010151828281518110613a4c57fe5b6020908102919091010152600101613a0b565b613a6b6000838361159b565b613a7a6138238261280161092c565b6001600160a01b038216600090815260208190526040902054613a9d90826121b3565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061386c908590615dc3565b4690565b613af861104c565b811415613b0457610bdf565b6000818152600a60205260409020548015610c9857600080613b2583612a1f565b9150915080421115610aca57610aca84613b3e86611b62565b84611f08565b600061157c8383612ff0565b60006117ed600086606001518686866140a4565b600061157c8383613878565b6000610cc1613b85613b80610d2a565b613fa6565b8390613878565b60006060600080600080613b9e610c41565b91509150600060606000613bb38a8686614116565b9250925092506000613bc3612031565b5090506000868214613bde57613bd9828561272d565b613be0565b825b949c939b509099509297509095505050505050565b6000613c0c613c0261104c565b83141560646116aa565b613c1461104c565b821061166e57613c258260016115ef565b610cc1565b60008088613c4557613c4088888888888861416e565b613c53565b613c53888888888888614245565b9150915097509795505050505050565b60008088613c7957613c408888888888886142a6565b613c5388888888888861430c565b6000613c93868661272d565b90506000613ca1838561288f565b90506000613caf8683612ff0565b905080831115613cfd578083036000613cd9613cd383613cce84610dfb565b611558565b86613628565b90508015613cfa576000613ced8783613610565b9050613cf8816131e1565b505b50505b61131c88846131f2565b600061157c838361288f565b600080613d28613d21610d2a565b84906143bb565b905061157c83826115ef565b60006117ed600186606001518686866140a4565b6000613d526116c8565b905060005b81811015610c9857613d68816143f7565b15613d7657613d7681614426565b600101613d57565b6000610cc182614454565b600060606000613d988461445f565b90506001816002811115613da857fe5b1415613dc657613dbc87878a8c8989614475565b9250925050613e13565b6002816002811115613dd457fe5b1415613de557613dbc878a866144d4565b6000816002811115613df357fe5b1415613e0657613dbc87878a8c886144f2565b613e116101506128e0565b505b965096945050505050565b600060606000613e2d84613991565b90506001816003811115613e3d57fe5b1415613e5157613dbc87878a8c8989614593565b6003816003811115613e5f57fe5b1415613e7057613dbc878a866145e2565b6002816003811115613e7e57fe5b1415613e9157613dbc87878a8c88614600565b613e116101366128e0565b82518251613eab90829061240e565b60005b81811015613f0957613eea858281518110613ec557fe5b6020026020010151858381518110613ed957fe5b60200260200101518563ffffffff16565b858281518110613ef657fe5b6020908102919091010152600101613eae565b5050505050565b6000610cc182613f1e61092c565b906115ef565b6000806000613f3d84613f3887600161467a565b61272d565b9250613f47614783565b15613f6057613f56848661272d565b9150819050613f9f565b613f686147a7565b15613f8157829150613f7a848661272d565b9050613f9f565b613f9084613f3887600061467a565b9150613f9c848661272d565b90505b9250925092565b6000670de0b6b3a76400008210613fbe576000610cc1565b50670de0b6b3a76400000390565b60008180602001905181019061157c9190615bdf565b60606000613ff0838561288f565b9050845167ffffffffffffffff8111801561400a57600080fd5b50604051908082528060200260200182016040528015614034578160200160208202803683370190505b50915060005b8551811015614088576140698287838151811061405357fe5b6020026020010151612ff090919063ffffffff16565b83828151811061407557fe5b602090810291909101015260010161403a565b50509392505050565b600061157c83836001613218565b600255565b600060606140b1856139bd565b905060006140be85613bf5565b905060006140cb85613bf5565b905060006140d7612031565b50905060006140e6828661272d565b90508a15614108576140fc828686868e866147cb565b955050505050506117ed565b6140fc828686868e86614856565b6000606060008060606141288861354a565b9150915060008061413a838a8a613583565b91509150600061414a8584613610565b9050801561415b5761415b816131e1565b9390930199919850919650945050505050565b6000806060875167ffffffffffffffff8111801561418b57600080fd5b506040519080825280602002602001820160405280156141b5578160200160208202803683370190505b509050888188815181106141c557fe5b60200260200101818152505060006141e8878a8489896141e3610d2a565b6148e9565b90506142108a8a8a815181106141fa57fe5b60200260200101516115ef90919063ffffffff16565b89898151811061421c57fe5b6020908102919091010152600061423387836115ef565b919b919a509098505050505050505050565b60008060006142608689898c898961425b610d2a565b614b79565b9050614272818989815181106141fa57fe5b88888151811061427e57fe5b60209081029190910101526000614295868b6115ef565b919a91995090975050505050505050565b60008060006142c18689898c89896142bc610d2a565b614c68565b90506142e9818989815181106142d357fe5b60200260200101516121b390919063ffffffff16565b8888815181106142f557fe5b60209081029190910101526000614295868b6121b3565b6000806060875167ffffffffffffffff8111801561432957600080fd5b50604051908082528060200260200182016040528015614353578160200160208202803683370190505b5090508881888151811061436357fe5b6020026020010181815250506000614386878a848989614381610d2a565b614d35565b90506143988a8a8a815181106142d357fe5b8989815181106143a457fe5b6020908102919091010152600061423387836121b3565b60008282026143d584158061157557508385838161157257fe5b806143e457600091505061086a565b670de0b6b3a764000060001982016138ba565b6000610cc17f000000000000000000000000000000000000000000000000000000000000000060068401612b5d565b6000818152600a602052604090205461443e8161163d565b6000928352600a60205260409092209190915550565b6000610cc182614fb6565b600081806020019051810190610cc1919061589c565b6000606080600061448585614ff2565b915091506144958251885161240e565b6144a2826126e5886139bd565b60006144b48989858e8e6141e3610d2a565b90506144c48282111560cf6116aa565b9a91995090975050505050505050565b6000606060006144e384615015565b905060606136e1868884613fe2565b600060606000806145028561502b565b915091506145148651821060646116aa565b6060865167ffffffffffffffff8111801561452e57600080fd5b50604051908082528060200260200182016040528015614558578160200160208202803683370190505b50905061456c888884868e8e61425b610d2a565b81838151811061457857fe5b60209081029190910101529199919850909650505050505050565b600060608060006145a385615042565b915091506145b38751835161240e565b6145c0826126e5886139bd565b60006145d28989858e8e614381610d2a565b90506144c48282101560d06116aa565b6000606060006145f18461505a565b905060606136e1868389615070565b600060606000806146108561510c565b915091506146228651821060646116aa565b6060865167ffffffffffffffff8111801561463c57600080fd5b50604051908082528060200260200182016040528015614666578160200160208202803683370190505b50905061456c888884868e8e6142bc610d2a565b8151606090818167ffffffffffffffff8111801561469757600080fd5b506040519080825280602002602001820160405280156146c1578160200160208202803683370190505b50905060005b8281101561477a5760006146d961104c565b8210156146e657816146eb565b816001015b90506146f681612b35565b8061470d575085801561470d575061470d816143f7565b61472a5786828151811061471d57fe5b602002602001015161475a565b61475a87838151811061473957fe5b6020026020010151600a600084815260200190815260200160002054615123565b83838151811061476657fe5b6020908102919091010152506001016146c7565b50949350505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006147dd838787815181106142d357fe5b8686815181106147e957fe5b60200260200101818152505060006148038888858861513e565b90508387878151811061481257fe5b60200260200101510387878151811061482757fe5b6020026020010181815250506148486001613f1e838a89815181106141fa57fe5b9150505b9695505050505050565b6000614868838786815181106141fa57fe5b86858151811061487457fe5b602002602001018181525050600061488e8888858961513e565b90508387868151811061489d57fe5b6020026020010151018786815181106148b257fe5b60200260200101818152505061484860016128018989815181106148d257fe5b6020026020010151846115ef90919063ffffffff16565b600080805b87518110156149275761491d88828151811061490657fe5b6020026020010151836121b390919063ffffffff16565b91506001016148ee565b506060865167ffffffffffffffff8111801561494257600080fd5b5060405190808252806020026020018201604052801561496c578160200160208202803683370190505b5090506000805b8951811015614a395760006149a4858c848151811061498e57fe5b602002602001015161387890919063ffffffff16565b90506149e68b83815181106149b557fe5b60200260200101516149e08c85815181106149cc57fe5b60200260200101518e86815181106141fa57fe5b90613878565b8483815181106149f257fe5b602002602001018181525050614a2e614a2782868581518110614a1157fe5b60200260200101516143bb90919063ffffffff16565b84906121b3565b925050600101614973565b506060895167ffffffffffffffff81118015614a5457600080fd5b50604051908082528060200260200182016040528015614a7e578160200160208202803683370190505b50905060005b8a51811015614b49576000848281518110614a9b57fe5b6020026020010151841115614b02576000614ac4614ab886613fa6565b8e858151811061405357fe5b90506000614ad8828e86815181106141fa57fe5b9050614af9614af282670de0b6b3a76400008d9003613878565b83906121b3565b92505050614b19565b8a8281518110614b0e57fe5b602002602001015190505b614b29818d84815181106141fa57fe5b838381518110614b3557fe5b602090810291909101015250600101614a84565b506000614b568c8361272d565b90506000614b64828a61288f565b9050613179614b7282613fa6565b8b906143bb565b600080614b9484614b8e876149e0818b6115ef565b906143bb565b90506000614ba48a8a848b61513e565b90506000614bb8828b8b815181106141fa57fe5b90506000805b8b51811015614be057614bd68c828151811061490657fe5b9150600101614bbe565b506000614c09828d8d81518110614bf357fe5b602002602001015161288f90919063ffffffff16565b90506000614c1682613fa6565b90506000614c2485836143bb565b90506000614c3286836115ef565b9050614c53614c4c83670de0b6b3a76400008d9003612ff0565b82906121b3565b98505050505050505050979650505050505050565b600080614c7d84614b8e876149e0818b6121b3565b90506000614c8d8a8a848b61513e565b90506000614cb78a8a81518110614ca057fe5b6020026020010151836115ef90919063ffffffff16565b90506000805b8b51811015614cdf57614cd58c828151811061490657fe5b9150600101614cbd565b506000614cf2828d8d81518110614bf357fe5b90506000614cff82613fa6565b90506000614d0d85836143bb565b90506000614d1b86836115ef565b9050614c53614c4c83670de0b6b3a76400008d9003613878565b600080805b8751811015614d5c57614d5288828151811061490657fe5b9150600101614d3a565b506060865167ffffffffffffffff81118015614d7757600080fd5b50604051908082528060200260200182016040528015614da1578160200160208202803683370190505b5090506000805b8951811015614e3b576000614dc3858c8481518110614bf357fe5b9050614e058b8381518110614dd457fe5b6020026020010151614dff8c8581518110614deb57fe5b60200260200101518e86815181106142d357fe5b9061288f565b848381518110614e1157fe5b602002602001018181525050614e30614a278286858151811061405357fe5b925050600101614da8565b506060895167ffffffffffffffff81118015614e5657600080fd5b50604051908082528060200260200182016040528015614e80578160200160208202803683370190505b50905060005b8a51811015614f4157600083858381518110614e9e57fe5b60200260200101511115614efa576000614ec3614ab886670de0b6b3a76400006115ef565b90506000614ed7828e86815181106141fa57fe5b9050614ef1614af282670de0b6b3a76400008d9003612ff0565b92505050614f11565b8a8281518110614f0657fe5b602002602001015190505b614f21818d84815181106142d357fe5b838381518110614f2d57fe5b602090810291909101015250600101614e86565b506000614f4e8c8361272d565b90506000614f5c828a61288f565b9050670de0b6b3a7640000811115614fa757614f9a8a7ffffffffffffffffffffffffffffffffffffffffffffffffff21f494c589c00008301612ff0565b965050505050505061484c565b6000965050505050505061484c565b6000614fe17ff4b7964d00000000000000000000000000000000000000000000000000000000611082565b821480610cc15750610cc1826152fb565b606060008280602001905181019061500a91906158b7565b909590945092505050565b60008180602001905181019061157c91906158fc565b6000808280602001905181019061500a9190615928565b606060008280602001905181019061500a91906159bb565b60008180602001905181019061157c91906159d9565b6060600061507e8484613878565b90506060855167ffffffffffffffff8111801561509a57600080fd5b506040519080825280602002602001820160405280156150c4578160200160208202803683370190505b50905060005b8651811015615102576150e383888381518110614a1157fe5b8282815181106150ef57fe5b60209081029190910101526001016150ca565b5095945050505050565b6000808280602001905181019061500a91906159f5565b600061157c61513584613cce85612a11565b6127c684612a03565b60008084518602905060008560008151811061515657fe5b60200260200101519050600086518760008151811061517157fe5b60200260200101510290506000600190505b87518110156151d7576151bc6151b66151af848b85815181106151a257fe5b6020026020010151611558565b8a51611558565b88613628565b91506151cd88828151811061274d57fe5b9250600101615183565b508685815181106151e457fe5b60200260200101518203915060006151fc8788611558565b9050600061522861521c61521484610b688988611558565b6103e8611558565b8a89815181106151a257fe5b9050600061524361523c6152148b89613628565b86906121b3565b905060008061525f61525586866121b3565b610b688d866121b3565b905060005b60ff8110156152df57819250615294615281866128018586611558565b610b688e613f1e88612801886002611558565b9150828211156152bd576001838303116152b8575097506115e79650505050505050565b6152d7565b6001828403116152d7575097506115e79650505050505050565b600101615264565b506152eb6101426128e0565b5050505050505050949350505050565b60006153267f2f1a0bc900000000000000000000000000000000000000000000000000000000611082565b82148061535a57506153577feb0f24d600000000000000000000000000000000000000000000000000000000611082565b82145b80610cc15750610cc182600061538f7f38e9922e00000000000000000000000000000000000000000000000000000000611082565b8214806153c357506153c07f50dd6ed900000000000000000000000000000000000000000000000000000000611082565b82145b80610cc157506000610cc1565bfe5b803561086a81615f59565b600082601f8301126153ed578081fd5b81356154006153fb82615f39565b615f12565b81815291506020808301908481018184028601820187101561542157600080fd5b60005b8481101561288457813584529282019290820190600101615424565b600082601f830112615450578081fd5b815161545e6153fb82615f39565b81815291506020808301908481018184028601820187101561547f57600080fd5b60005b8481101561288457815184529282019290820190600101615482565b600082601f8301126154ae578081fd5b813567ffffffffffffffff8111156154c4578182fd5b6154d76020601f19601f84011601615f12565b91508082528360208285010111156154ee57600080fd5b8060208401602084013760009082016020015292915050565b80516003811061086a57600080fd5b80516004811061086a57600080fd5b80356002811061086a57600080fd5b600060208284031215615545578081fd5b813561157c81615f59565b60008060408385031215615562578081fd5b823561556d81615f59565b9150602083013561557d81615f59565b809150509250929050565b60008060006060848603121561559c578081fd5b83356155a781615f59565b925060208401356155b781615f59565b929592945050506040919091013590565b600080600080600080600060e0888a0312156155e2578283fd5b87356155ed81615f59565b965060208801356155fd81615f59565b95506040880135945060608801359350608088013561561b81615f6e565b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561564a578182fd5b823561565581615f59565b946020939093013593505050565b600080600060608486031215615677578081fd5b835167ffffffffffffffff8082111561568e578283fd5b818601915086601f8301126156a1578283fd5b81516156af6153fb82615f39565b80828252602080830192508086018b8283870289010111156156cf578788fd5b8796505b848710156156fa5780516156e681615f59565b8452600196909601959281019281016156d3565b508901519097509350505080821115615711578283fd5b5061571e86828701615440565b925050604084015190509250925092565b600060208284031215615740578081fd5b8151801515811461157c578182fd5b600080600080600080600060e0888a031215615769578081fd5b87359650602088013561577b81615f59565b9550604088013561578b81615f59565b9450606088013567ffffffffffffffff808211156157a7578283fd5b6157b38b838c016153dd565b955060808a0135945060a08a0135935060c08a01359150808211156157d6578283fd5b506157e38a828b0161549e565b91505092959891949750929550565b600060208284031215615803578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461157c578182fd5b600060208284031215615843578081fd5b815161157c81615f59565b60008060408385031215615860578182fd5b823561586b81615f59565b9150602083013567ffffffffffffffff811115615886578182fd5b6158928582860161549e565b9150509250929050565b6000602082840312156158ad578081fd5b61157c8383615507565b6000806000606084860312156158cb578081fd5b6158d58585615507565b9250602084015167ffffffffffffffff8111156158f0578182fd5b61571e86828701615440565b6000806040838503121561590e578182fd5b6159188484615507565b9150602083015190509250929050565b60008060006060848603121561593c578081fd5b6159468585615507565b925060208401519150604084015190509250925092565b60006020828403121561596e578081fd5b61157c8383615516565b6000806040838503121561598a578182fd5b6159948484615516565b9150602083015167ffffffffffffffff8111156159af578182fd5b61589285828601615440565b6000806000606084860312156159cf578081fd5b6158d58585615516565b600080604083850312156159eb578182fd5b6159188484615516565b600080600060608486031215615a09578081fd5b6159468585615516565b60008060008060808587031215615a28578182fd5b843567ffffffffffffffff80821115615a3f578384fd5b818701915061012080838a031215615a55578485fd5b615a5e81615f12565b9050615a6a8984615525565b8152615a7989602085016153d2565b6020820152615a8b89604085016153d2565b6040820152606083013560608201526080830135608082015260a083013560a0820152615abb8960c085016153d2565b60c0820152615acd8960e085016153d2565b60e08201526101008084013583811115615ae5578687fd5b615af18b82870161549e565b828401525050809650506020870135915080821115615b0e578384fd5b50615b1b878288016153dd565b949794965050505060408301359260600135919050565b600060208284031215615b43578081fd5b5035919050565b600060208284031215615b5b578081fd5b5051919050565b60008060408385031215615b74578182fd5b50508035926020909101359150565b60008060008060808587031215615b98578182fd5b8451935060208501519250604085015191506060850151615bb881615f59565b939692955090935050565b600060208284031215615bd4578081fd5b815161157c81615f6e565b60008060408385031215615bf1578182fd5b8251615bfc81615f6e565b6020939093015192949293505050565b6000815180845260208085019450808401835b83811015615c3b57815187529582019590820190600101615c1f565b509495945050505050565b60008151808452815b81811015615c6b57602081850181015186830182015201615c4f565b81811115615c7c5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b81811015615d5c5783516001600160a01b031683529284019291840191600101615d37565b50909695505050505050565b60006020825261157c6020830184615c0c565b600060408252615d8e6040830185615c0c565b82810360208401526117ed8185615c0c565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000838252604060208301526115e76040830184615c46565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825261157c6020830184615c46565b6000838252604060208301526115e76040830184615c0c565b9283529015156020830152604082015260600190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615f3157600080fd5b604052919050565b600067ffffffffffffffff821115615f4f578081fd5b5060209081020190565b6001600160a01b0381168114610bdf57600080fd5b60ff81168114610bdf57600080fdfea2646970667358221220dcc30bf1aa1b16ae6ad0c83c0807514f1e6fdbe66d9e246a013ce46ba54d53bf64736f6c634300070100336bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/index.ts b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/index.ts new file mode 100644 index 0000000..130628e --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/index.ts @@ -0,0 +1,85 @@ +import { Task, TaskMode, TaskRunOptions } from '@src'; +import { ComposableStablePoolDeployment } from './input'; + +import { ZERO_ADDRESS } from '@helpers/constants'; +import { bn } from '@helpers/numbers'; +import * as expectEvent from '@helpers/expectEvent'; +import { getContractDeploymentTransactionHash, saveContractDeploymentTransactionHash } from '@src'; +import { ethers } from 'hardhat'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as ComposableStablePoolDeployment; + + const args = [input.Vault, input.ProtocolFeePercentagesProvider, input.FactoryVersion, input.PoolVersion]; + const factory = await task.deployAndVerify('ComposableStablePoolFactory', args, from, force); + + if (task.mode === TaskMode.LIVE) { + // We also create a Pool using the factory and verify it, to let us compute their action IDs and so that future + // Pools are automatically verified. We however don't run any of this code in CHECK mode, since we don't care about + // the contracts deployed here. The action IDs will be checked to be correct via a different mechanism. + + // The pauseWindowDuration and bufferPeriodDuration will be filled in later, but we need to declare them here to + // appease the type system. Those are constructor arguments, but automatically provided by the factory. + + const mockPoolArgs = { + vault: input.Vault, + protocolFeeProvider: input.ProtocolFeePercentagesProvider, + name: 'DO NOT USE - Mock Composable Stable Pool', + symbol: 'TEST', + tokens: [input.WETH, input.BAL].sort(function (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()); + }), + rateProviders: [ZERO_ADDRESS, ZERO_ADDRESS], + tokenRateCacheDurations: [0, 0], + exemptFromYieldProtocolFeeFlags: [false, false], + amplificationParameter: bn(100), + swapFeePercentage: bn(1e12), + pauseWindowDuration: undefined, + bufferPeriodDuration: undefined, + owner: ZERO_ADDRESS, + version: input.PoolVersion, + }; + + // This mimics the logic inside task.deploy + if (force || !task.output({ ensure: false })['MockComposableStablePool']) { + const poolCreationReceipt = await ( + await factory.create( + mockPoolArgs.name, + mockPoolArgs.symbol, + mockPoolArgs.tokens, + mockPoolArgs.amplificationParameter, + mockPoolArgs.rateProviders, + mockPoolArgs.tokenRateCacheDurations, + mockPoolArgs.exemptFromYieldProtocolFeeFlags, + mockPoolArgs.swapFeePercentage, + mockPoolArgs.owner + ) + ).wait(); + const event = expectEvent.inReceipt(poolCreationReceipt, 'PoolCreated'); + const mockPoolAddress = event.args.pool; + + await saveContractDeploymentTransactionHash(mockPoolAddress, poolCreationReceipt.transactionHash, task.network); + await task.save({ MockComposableStablePool: mockPoolAddress }); + } + + const mockPool = await task.instanceAt('ComposableStablePool', task.output()['MockComposableStablePool']); + + // In order to verify the Pool's code, we need to complete its constructor arguments by computing the factory + // provided arguments (pause durations). + + // The durations require knowing when the Pool was created, so we look for the timestamp of its creation block. + const txHash = await getContractDeploymentTransactionHash(mockPool.address, task.network); + const tx = await ethers.provider.getTransactionReceipt(txHash); + const poolCreationBlock = await ethers.provider.getBlock(tx.blockNumber); + + // With those and the period end times, we can compute the durations. + const { pauseWindowEndTime, bufferPeriodEndTime } = await mockPool.getPausedState(); + mockPoolArgs.pauseWindowDuration = pauseWindowEndTime.sub(poolCreationBlock.timestamp); + mockPoolArgs.bufferPeriodDuration = bufferPeriodEndTime + .sub(poolCreationBlock.timestamp) + .sub(mockPoolArgs.pauseWindowDuration); + + // We are now ready to verify the Pool + await task.verify('ComposableStablePool', mockPool.address, [mockPoolArgs]); + } +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/input.ts b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/input.ts new file mode 100644 index 0000000..e96fb17 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/input.ts @@ -0,0 +1,26 @@ +import { Task, TaskMode } from '@src'; + +export type ComposableStablePoolDeployment = { + Vault: string; + ProtocolFeePercentagesProvider: string; + FactoryVersion: string; + PoolVersion: string; + WETH: string; + BAL: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); +const WETH = new Task('00000000-tokens', TaskMode.READ_ONLY); +const BAL = new Task('00000000-tokens', TaskMode.READ_ONLY); + +const BaseVersion = { version: 2, deployment: '20221122-composable-stable-pool-v2' }; + +export default { + Vault, + ProtocolFeePercentagesProvider, + WETH, + BAL, + FactoryVersion: JSON.stringify({ name: 'ComposableStablePoolFactory', ...BaseVersion }), + PoolVersion: JSON.stringify({ name: 'ComposableStablePool', ...BaseVersion }), +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/output/arbitrum.json new file mode 100644 index 0000000..32552c5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/output/arbitrum.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x85a80afee867aDf27B50BdB7b76DA70f1E853062", + "MockComposableStablePool": "0x373b347bc87998b151A5E9B6bB6ca692b766648a" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/output/bsc.json b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/output/bsc.json new file mode 100644 index 0000000..32552c5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/output/bsc.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x85a80afee867aDf27B50BdB7b76DA70f1E853062", + "MockComposableStablePool": "0x373b347bc87998b151A5E9B6bB6ca692b766648a" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/output/gnosis.json b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/output/gnosis.json new file mode 100644 index 0000000..9f50e26 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/output/gnosis.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6", + "MockComposableStablePool": "0x707B7d4a1bAe449d546DCAb869256591bbB3d70b" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/output/goerli.json new file mode 100644 index 0000000..32552c5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/output/goerli.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x85a80afee867aDf27B50BdB7b76DA70f1E853062", + "MockComposableStablePool": "0x373b347bc87998b151A5E9B6bB6ca692b766648a" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/output/mainnet.json new file mode 100644 index 0000000..32552c5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x85a80afee867aDf27B50BdB7b76DA70f1E853062", + "MockComposableStablePool": "0x373b347bc87998b151A5E9B6bB6ca692b766648a" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/output/optimism.json b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/output/optimism.json new file mode 100644 index 0000000..32552c5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/output/optimism.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x85a80afee867aDf27B50BdB7b76DA70f1E853062", + "MockComposableStablePool": "0x373b347bc87998b151A5E9B6bB6ca692b766648a" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/output/polygon.json new file mode 100644 index 0000000..32552c5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/output/polygon.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x85a80afee867aDf27B50BdB7b76DA70f1E853062", + "MockComposableStablePool": "0x373b347bc87998b151A5E9B6bB6ca692b766648a" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/readme.md b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/readme.md new file mode 100644 index 0000000..ad9116b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/readme.md @@ -0,0 +1,19 @@ +# 2022-11-22 - Composable Stable Pool V2 + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This deployment was deprecated in favor of a new version with critical fixes: [composable-stable-pool-v3](../20230206-composable-stable-pool-v3/). +> See this [forum post](https://forum.balancer.fi/t/reentrancy-vulnerability-scope-expanded/4345) for more details about the fixed vulnerability. + +Redeployment of `ComposableStablePoolFactory`, which allows creating Stable Pools that are suitable to be included in other Pools. This version adds proportional joins and exits, to improve the front-end UX. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`ComposableStablePoolFactory` artifact](./artifact/ComposableStablePoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/test/test.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/test/test.fork.ts new file mode 100644 index 0000000..4c93dc3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221122-composable-stable-pool-v2/test/test.fork.ts @@ -0,0 +1,335 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; + +import * as expectEvent from '@helpers/expectEvent'; +import { describeForkTest } from '@src'; +import { Task, TaskMode } from '@src'; +import { getForkedNetwork } from '@src'; +import { getSigner, impersonate } from '@src'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; + +import { MAX_UINT256, ZERO_ADDRESS } from '@helpers/constants'; +import { bn, fp } from '@helpers/numbers'; +import { BasePoolEncoder } from '@helpers/models/pools/utils/encoder'; +import { StablePoolEncoder } from '@helpers/models/pools/stable/encoder'; +import { SwapKind } from '@helpers/models/types/types'; +import { actionId } from '@helpers/models/misc/actions'; +import { expectEqualWithError } from '@helpers/relativeError'; + +describeForkTest('ComposableStablePool', 'mainnet', 16000000, function () { + let task: Task; + + let factory: Contract; + let owner: SignerWithAddress; + let whale: SignerWithAddress; + let govMultisig: SignerWithAddress; + let vault: Contract; + let authorizer: Contract; + let busd: Contract; + let usdt: Contract; + + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + const LARGE_TOKEN_HOLDER = '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503'; + const USDT_SCALING = bn(1e12); // USDT has 6 decimals, so its scaling factor is 1e12 + + const USDT = '0xdac17f958d2ee523a2206206994597c13d831ec7'; + const BUSD = '0x4Fabb145d64652a948d72533023f6E7A623C7C53'; + + const tokens = [BUSD, USDT]; + const amplificationParameter = bn(400); + const swapFeePercentage = fp(0.01); + const initialBalanceBUSD = fp(1e6); + const initialBalanceUSDT = fp(1e6).div(USDT_SCALING); + const initialBalances = [initialBalanceBUSD, initialBalanceUSDT]; + + before('run task', async () => { + task = new Task('20221122-composable-stable-pool-v2', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('ComposableStablePoolFactory'); + }); + + before('load signers', async () => { + owner = await getSigner(); + whale = await impersonate(LARGE_TOKEN_HOLDER, fp(100)); + + govMultisig = await impersonate(GOV_MULTISIG, fp(100)); + }); + + before('load vault and tokens', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.instanceAt('Vault', await factory.getVault()); + authorizer = await new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance( + 'Authorizer' + ); + + busd = await task.instanceAt('ERC20', BUSD); + usdt = await task.instanceAt('ERC20', USDT); + + await busd.connect(whale).approve(vault.address, MAX_UINT256); + await usdt.connect(whale).approve(vault.address, MAX_UINT256); + }); + + async function createPool(tokens: string[], initialize = true): Promise { + const rateProviders: string[] = Array(tokens.length).fill(ZERO_ADDRESS); + const cacheDurations: BigNumber[] = Array(tokens.length).fill(bn(0)); + const exemptFlags: boolean[] = Array(tokens.length).fill(false); + + const tx = await factory.create( + 'CSP', + 'CSBPT', + tokens, + amplificationParameter, + rateProviders, + cacheDurations, + exemptFlags, + swapFeePercentage, + owner.address + ); + + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + const pool = await task.instanceAt('ComposableStablePool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + if (initialize) { + const bptIndex = await pool.getBptIndex(); + const poolId = await pool.getPoolId(); + + const registeredBalances = getRegisteredBalances(bptIndex, initialBalances); + const { tokens: registeredTokens } = await vault.getPoolTokens(poolId); + + const userData = StablePoolEncoder.joinInit(registeredBalances); + // Use this for maxAmountsIn + registeredBalances[bptIndex] = MAX_UINT256; + + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: registeredTokens, + maxAmountsIn: registeredBalances, + fromInternalBalance: false, + userData, + }); + } + + return pool; + } + + function getRegisteredBalances(bptIndex: number, balances: BigNumber[]): BigNumber[] { + return Array.from({ length: balances.length + 1 }).map((_, i) => + i == bptIndex ? bn(0) : i < bptIndex ? balances[i] : balances[i - 1] + ); + } + + describe('getters', () => { + it('check factory version', async () => { + const expectedFactoryVersion = { + name: 'ComposableStablePoolFactory', + version: 2, + deployment: '20221122-composable-stable-pool-v2', + }; + + expect(await factory.version()).to.equal(JSON.stringify(expectedFactoryVersion)); + }); + + it('check pool version', async () => { + const pool = await createPool(tokens); + + const expectedPoolVersion = { + name: 'ComposableStablePool', + version: 2, + deployment: '20221122-composable-stable-pool-v2', + }; + + expect(await pool.version()).to.equal(JSON.stringify(expectedPoolVersion)); + }); + }); + + describe('pool operations', () => { + const amount = fp(500); + + let pool: Contract; + let poolId: string; + let bptIndex: number; + + context('swap', () => { + before('deploy a composable stable pool', async () => { + expect(await factory.isPoolFromFactory(ZERO_ADDRESS)).to.be.false; + + pool = await createPool(tokens); + + poolId = pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + bptIndex = await pool.getBptIndex(); + }); + + it('performs a swap', async () => { + await busd.connect(whale).transfer(owner.address, amount); + await busd.connect(owner).approve(vault.address, amount); + + await vault + .connect(owner) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: BUSD, assetOut: USDT, amount, userData: '0x' }, + { sender: owner.address, recipient: owner.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert pool swap + const expectedUSDT = amount.div(USDT_SCALING); + expectEqualWithError(await busd.balanceOf(owner.address), 0, 0.0001); + expectEqualWithError(await usdt.balanceOf(owner.address), bn(expectedUSDT), 0.1); + }); + }); + + context('proportional join', () => { + before('deploy a composable stable pool', async () => { + expect(await factory.isPoolFromFactory(ZERO_ADDRESS)).to.be.false; + + pool = await createPool(tokens); + + poolId = pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + bptIndex = await pool.getBptIndex(); + }); + + it('joins proportionally', async () => { + const ownerBptBalance = await pool.balanceOf(owner.address); + const bptOut = ownerBptBalance.div(5); + + const { tokens: registeredTokens } = await vault.getPoolTokens(poolId); + // Given the bptOut, the max amounts in should be slightly more than 1/5. Decimals make it a bit complicated. + const adjustedBalances = [ + initialBalanceBUSD.div(fp(4.99)).mul(fp(1)), + initialBalanceUSDT.div(bn(4.99e6)).mul(1e6), + ]; + const maxAmountsIn = getRegisteredBalances(bptIndex, adjustedBalances); + + const tx = await vault.connect(whale).joinPool(poolId, whale.address, whale.address, { + assets: registeredTokens, + maxAmountsIn: maxAmountsIn, + fromInternalBalance: false, + userData: StablePoolEncoder.joinAllTokensInForExactBptOut(bptOut), + }); + const receipt = await (await tx).wait(); + const { deltas: amountsIn } = expectEvent.inReceipt(receipt, 'PoolBalanceChanged').args; + + // Amounts in should be ~ 1/5 the initial balances + expect(amountsIn).to.equalWithError(maxAmountsIn, 0.01); + + // Make sure received BPT is close to what we expect + const currentBptBalance = await pool.balanceOf(whale.address); + expect(currentBptBalance).to.be.equalWithError(bptOut, 0.001); + }); + }); + + context('proportional exit', () => { + before('deploy a composable stable pool', async () => { + expect(await factory.isPoolFromFactory(ZERO_ADDRESS)).to.be.false; + + pool = await createPool(tokens); + + poolId = pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + bptIndex = await pool.getBptIndex(); + }); + + it('exits proportionally', async () => { + const previousBptBalance = await pool.balanceOf(owner.address); + const bptIn = previousBptBalance.div(4); + + const { tokens: registeredTokens, balances: registeredBalances } = await vault.getPoolTokens(poolId); + + const tx = await vault.connect(owner).exitPool(poolId, owner.address, owner.address, { + assets: registeredTokens, + minAmountsOut: Array(registeredTokens.length).fill(0), + fromInternalBalance: false, + userData: StablePoolEncoder.exitExactBptInForTokensOut(bptIn), + }); + const receipt = await (await tx).wait(); + const { deltas } = expectEvent.inReceipt(receipt, 'PoolBalanceChanged').args; + const amountsOut = deltas.map((x: BigNumber) => x.mul(-1)); + + const expectedAmountsOut = (registeredBalances as BigNumber[]).map((b) => b.div(4)); + expectedAmountsOut[bptIndex] = bn(0); + + // Amounts out should be 1/4 the initial balances + expect(amountsOut).to.equalWithError(expectedAmountsOut, 0.00001); + + // Make sure sent BPT is close to what we expect + const currentBptBalance = await pool.balanceOf(owner.address); + expect(currentBptBalance).to.be.equalWithError(bn(previousBptBalance).sub(bptIn), 0.001); + }); + }); + }); + + describe('recovery mode', () => { + let pool: Contract; + let poolId: string; + + before('deploy and initialize a composable stable pool', async () => { + pool = await createPool(tokens); + poolId = await pool.getPoolId(); + }); + + before('enter recovery mode', async () => { + await authorizer.connect(govMultisig).grantRole(await actionId(pool, 'enableRecoveryMode'), govMultisig.address); + await pool.connect(govMultisig).enableRecoveryMode(); + expect(await pool.inRecoveryMode()).to.be.true; + }); + + it('can exit via recovery mode', async () => { + const bptBalance = await pool.balanceOf(owner.address); + expect(bptBalance).to.gt(0); + + const vaultUSDTBalanceBeforeExit = await usdt.balanceOf(vault.address); + const ownerUSDTBalanceBeforeExit = await usdt.balanceOf(owner.address); + + const { tokens: registeredTokens } = await vault.getPoolTokens(poolId); + + const userData = BasePoolEncoder.recoveryModeExit(bptBalance); + await vault.connect(owner).exitPool(poolId, owner.address, owner.address, { + assets: registeredTokens, + minAmountsOut: Array(registeredTokens.length).fill(0), + fromInternalBalance: false, + userData, + }); + + const remainingBalance = await pool.balanceOf(owner.address); + expect(remainingBalance).to.equal(0); + + const vaultUSDTBalanceAfterExit = await usdt.balanceOf(vault.address); + const ownerUSDTBalanceAfterExit = await usdt.balanceOf(owner.address); + + expect(vaultUSDTBalanceAfterExit).to.lt(vaultUSDTBalanceBeforeExit); + expect(ownerUSDTBalanceAfterExit).to.gt(ownerUSDTBalanceBeforeExit); + }); + }); + + describe('factory disable', () => { + it('the factory can be disabled', async () => { + await authorizer.connect(govMultisig).grantRole(await actionId(factory, 'disable'), govMultisig.address); + await factory.connect(govMultisig).disable(); + + expect(await factory.isDisabled()).to.be.true; + await expect( + factory.create( + 'CSP', + 'CSBPT', + tokens, + amplificationParameter, + Array(tokens.length).fill(ZERO_ADDRESS), + Array(tokens.length).fill(0), + Array(tokens.length).fill(false), + swapFeePercentage, + owner.address + ) + ).to.be.revertedWith('BAL#211'); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/artifact/TimelockAuthorizer.json b/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/artifact/TimelockAuthorizer.json new file mode 100644 index 0000000..71d73d3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/artifact/TimelockAuthorizer.json @@ -0,0 +1,1159 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TimelockAuthorizer", + "sourceName": "contracts/authorizer/TimelockAuthorizer.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "contract IAuthorizerAdaptorEntrypoint", + "name": "authorizerAdaptorEntrypoint", + "type": "address" + }, + { + "internalType": "uint256", + "name": "rootTransferDelay", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "ActionDelaySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "name": "ExecutionCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "name": "ExecutionExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "name": "ExecutionScheduled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pendingRoot", + "type": "address" + } + ], + "name": "PendingRootSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "PermissionGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "PermissionRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "root", + "type": "address" + } + ], + "name": "RootSet", + "type": "event" + }, + { + "inputs": [], + "name": "EVERYWHERE", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EXECUTE_ACTION_ID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "GENERAL_PERMISSION_SPECIFIER", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "GRANT_ACTION_ID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_DELAY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_DELAY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REVOKE_ACTION_ID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SCHEDULE_DELAY_ACTION_ID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "name": "canExecute", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "canGrant", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "canPerform", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "canRevoke", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "name": "cancel", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "claimRoot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "name": "execute", + "outputs": [ + { + "internalType": "bytes", + "name": "result", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + } + ], + "name": "getActionIdDelay", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "executionId", + "type": "uint256" + } + ], + "name": "getExecuteExecutionActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getExecutor", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "baseActionId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "specifier", + "type": "bytes32" + } + ], + "name": "getExtendedActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + } + ], + "name": "getGrantPermissionActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPendingRoot", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "getPermissionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + } + ], + "name": "getRevokePermissionActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRoot", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRootTransferDelay", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + } + ], + "name": "getScheduleDelayActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "name": "getScheduledExecution", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "where", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "executed", + "type": "bool" + }, + { + "internalType": "bool", + "name": "cancelled", + "type": "bool" + }, + { + "internalType": "bool", + "name": "protected", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "executableAt", + "type": "uint256" + } + ], + "internalType": "struct TimelockAuthorizer.ScheduledExecution", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "actionIds", + "type": "bytes32[]" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address[]", + "name": "where", + "type": "address[]" + } + ], + "name": "grantPermissions", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "hasPermission", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "isGranter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isPendingRoot", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "isPermissionGrantedOnTarget", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + } + ], + "name": "isRevoker", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isRoot", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "manageGranter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "manageRevoker", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "actionIds", + "type": "bytes32[]" + }, + { + "internalType": "address[]", + "name": "where", + "type": "address[]" + } + ], + "name": "renouncePermissions", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "actionIds", + "type": "bytes32[]" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address[]", + "name": "where", + "type": "address[]" + } + ], + "name": "revokePermissions", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "where", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "address[]", + "name": "executors", + "type": "address[]" + } + ], + "name": "schedule", + "outputs": [ + { + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "newDelay", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "executors", + "type": "address[]" + } + ], + "name": "scheduleDelayChange", + "outputs": [ + { + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + }, + { + "internalType": "address[]", + "name": "executors", + "type": "address[]" + } + ], + "name": "scheduleGrantPermission", + "outputs": [ + { + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "where", + "type": "address" + }, + { + "internalType": "address[]", + "name": "executors", + "type": "address[]" + } + ], + "name": "scheduleRevokePermission", + "outputs": [ + { + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newRoot", + "type": "address" + }, + { + "internalType": "address[]", + "name": "executors", + "type": "address[]" + } + ], + "name": "scheduleRootChange", + "outputs": [ + { + "internalType": "uint256", + "name": "scheduledExecutionId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "setDelay", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pendingRoot", + "type": "address" + } + ], + "name": "setPendingRoot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101e06040523480156200001257600080fd5b506040516200390e3803806200390e8339810160408190526200003591620003df565b6001600055620000458362000265565b816001600160a01b0316638d928af86040518163ffffffff1660e01b815260040160206040518083038186803b1580156200007f57600080fd5b505afa15801562000094573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000ba919062000426565b6001600160a01b0316610160816001600160a01b031660601b81525050816001600160a01b031663e758d36b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200011157600080fd5b505afa15801562000126573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200014c919062000426565b6001600160601b0319606091821b81166101a0529083901b16610180526040516200017790620003d1565b604051809103906000f08015801562000194573d6000803e3d6000fd5b5060601b6001600160601b031916610140526101c08190526000620001c06337c5e2cb60e11b620002af565b90506000620001d6634c07348160e01b620002af565b90506000620001e883600019620002e4565b90506000620001fa83600019620002e4565b90506200020b828860001962000319565b6200021a818860001962000319565b608084905260a08390526200023663fe0d94c160e01b620002af565b60c0526200024b6378422a9160e11b620002af565b60e052610100919091526101205250620004b19350505050565b600180546001600160a01b0319166001600160a01b0383169081179091556040517f39510b933a9d010f906528d6019d3f4e2450a10dc33b10887503b31ed82f111190600090a250565b604051600090620002c7903090849060200162000480565b604051602081830303815290604052805190602001209050919050565b60008282604051602001620002fb92919062000472565b60405160208183030381529060405280519060200120905092915050565b60006200032884848462000399565b60008181526004602052604090205490915060ff166200039357600081815260046020526040808220805460ff19166001179055516001600160a01b03808516929086169187917fef6ee312a0062a24a46be2eba5284183a87ff848110e8d4df979bd690d9e9f6891a45b50505050565b6000838383604051602001620003b2939291906200044c565b6040516020818303038152906040528051906020012090509392505050565b6104ef806200341f83390190565b600080600060608486031215620003f4578283fd5b8351620004018162000498565b6020850151909350620004148162000498565b80925050604084015190509250925092565b60006020828403121562000438578081fd5b8151620004458162000498565b9392505050565b9283526001600160601b0319606092831b81166020850152911b16603482015260480190565b918252602082015260400190565b9182526001600160e01b031916602082015260240190565b6001600160a01b0381168114620004ae57600080fd5b50565b60805160a05160c05160e05161010051610120516101405160601c6101605160601c6101805160601c6101a05160601c6101c051612e916200058e6000398061145b52508061132d5250806113555250806112f152806117ed5250806107ff5280610946528061102252806113ce52806117845280611a9f52806121895250806106f1528061074b5250806106c4528061071e52508061066f52806115835250806109b352806115575250806110d05280611614528061163d52806119295250806107915280611160528061143252806115af5250612e916000f3fe608060405234801561001057600080fd5b50600436106103155760003560e01c80637e1c556d116101a7578063d00bef4d116100ee578063e8104ea011610097578063f1521d7611610071578063f1521d761461060e578063fc78a22814610621578063fe0d94c11461062957610315565b8063e8104ea0146105d5578063f0845522146105e8578063f0bb9406146105fb57610315565b8063df6b0d01116100c8578063df6b0d01146105a7578063e2b4146b146105ba578063e5e6e8ae146105cd57610315565b8063d00bef4d14610579578063d754bad914610581578063d7ad1dcf1461059457610315565b80639be2a88411610150578063c284b6b91161012a578063c284b6b91461054b578063cc63604a14610553578063cf8475da1461056657610315565b80639be2a8841461051d5780639f81aed714610530578063b3eb281d1461053857610315565b8063863bac6b11610181578063863bac6b146104ef57806386ff254b146105025780638d928af81461051557610315565b80637e1c556d146104c157806382938ca8146104c9578063851c1bb3146104dc57610315565b80634125ff901161026b57806362cde1ba116102145780636f8bc596116101ee5780636f8bc59614610488578063715716a21461049b57806378a08377146104ae57610315565b806362cde1ba146104585780636badd2ab146104605780636c1032af1461048057610315565b806355ed08a11161024557806355ed08a11461041d5780635b78b780146104305780635ca1e1651461044357610315565b80634125ff90146103ef5780634c073481146103f7578063557a64031461040a57610315565b80631b3c85eb116102cd5780632e3ed05b116102a75780632e3ed05b146103b65780633bf46797146103c957806340e58ee5146103dc57610315565b80631b3c85eb146103885780632362716d1461039b5780632debdd2e146103ae57610315565b806314ea35e7116102fe57806314ea35e714610358578063151b89d114610362578063169f14681461037557610315565b80630df322a61461031a57806310697a3a14610343575b600080fd5b61032d6103283660046124b0565b610649565b60405161033a9190612ac0565b60405180910390f35b61034b61066d565b60405161033a9190612acb565b610360610691565b005b61034b610370366004612678565b61078a565b61034b610383366004612518565b6107bc565b6103606103963660046124b0565b61092b565b61034b6103a93660046126a8565b61097b565b61034b6109b1565b61034b6103c43660046124cb565b6109d5565b61034b6103d7366004612678565b610aa9565b6103606103ea366004612678565b610abb565b61034b610d11565b6103606104053660046125c6565b610d19565b61032d6104183660046124b0565b610da4565b61034b61042b3660046127a1565b610dc5565b61034b61043e3660046126e5565b610df8565b61044b610ed7565b60405161033a9190612958565b61044b610ef3565b61047361046e366004612678565b610ef9565b60405161033a9190612d29565b61044b611020565b6103606104963660046125c6565b611044565b61032d6104a93660046126a8565b6110c9565b6103606104bc36600461274d565b6110f7565b61034b61115e565b6103606104d7366004612621565b611182565b61034b6104ea366004612806565b6111cb565b61034b6104fd3660046126e5565b6111fe565b61032d6105103660046126a8565b6112c2565b61044b6112ef565b61032d61052b3660046126a8565b611313565b61034b611424565b61032d6105463660046126a8565b61142b565b61034b611459565b61032d610561366004612678565b61147d565b61036061057436600461274d565b6114f6565b61044b611534565b61034b61058f366004612678565b611550565b61034b6105a2366004612678565b61157c565b61032d6105b53660046126a8565b6115a8565b61032d6105c83660046126a8565b6115d6565b61034b611612565b61034b6105e3366004612678565b611636565b61034b6105f63660046127c2565b611662565b6103606106093660046127a1565b611769565b61032d61061c3660046126a8565b611922565b61034b610ef3565b61063c610637366004612678565b611950565b60405161033a9190612b01565b60025473ffffffffffffffffffffffffffffffffffffffff8281169116145b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015460025473ffffffffffffffffffffffffffffffffffffffff91821691166106bf338214610191611b67565b6106ec7f000000000000000000000000000000000000000000000000000000000000000082600019611b75565b6107197f000000000000000000000000000000000000000000000000000000000000000082600019611b75565b6107467f000000000000000000000000000000000000000000000000000000000000000083600019611bfe565b6107737f000000000000000000000000000000000000000000000000000000000000000083600019611bfe565b61077c81611c85565b6107866000611cf4565b5050565b60006107b67f000000000000000000000000000000000000000000000000000000000000000083610dc5565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff84163014156107fd5760405162461bcd60e51b81526004016107f490612b14565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156108695760405162461bcd60e51b81526004016107f490612b71565b60008473ffffffffffffffffffffffffffffffffffffffff1663851c1bb361089086611d63565b6040518263ffffffff1660e01b81526004016108ac9190612ad4565b60206040518083038186803b1580156108c457600080fd5b505afa1580156108d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fc9190612690565b905061091461090c8233886115d6565b610191611b67565b61092081868686611e6f565b9150505b9392505050565b61096f3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610191611b67565b61097881611cf4565b50565b6000838383604051602001610992939291906128dc565b6040516020818303038152906040528051906020012090509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006109e361090c33610da4565b6000610a0e7f1b3c85eb000000000000000000000000000000000000000000000000000000006111cb565b90506060631b3c85eb60e01b85604051602401610a2b9190612958565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050610aa0823083610a9a611459565b88611eb2565b95945050505050565b60009081526005602052604090205490565b6003548110610adc5760405162461bcd60e51b81526004016107f490612cbb565b600060038281548110610aeb57fe5b60009182526020909120600490910201600281015490915060ff1615610b235760405162461bcd60e51b81526004016107f490612cf2565b6002810154610100900460ff1615610b4d5760405162461bcd60e51b81526004016107f490612c84565b805460018083018054604080516020600261010096851615969096026000190190931694909404601f810183900483028501830190915280845273ffffffffffffffffffffffffffffffffffffffff90941693600093859363851c1bb393610c0b9390830182828015610c015780601f10610bd657610100808354040283529160200191610c01565b820191906000526020600020905b815481529060010190602001808311610be457829003601f168201915b5050505050611d63565b6040518263ffffffff1660e01b8152600401610c279190612ad4565b60206040518083038186803b158015610c3f57600080fd5b505afa158015610c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c779190612690565b8354909150610cb290610ca3908390339073ffffffffffffffffffffffffffffffffffffffff166115d6565b8061090c575061090c33610da4565b6002830180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560405184907f2a6bef66de603fc0ec07223576486bd905cd9bb6e05364286d9a5cd1be046ae690600090a250505050565b6303c2670081565b610d25835182516120a6565b60005b8351811015610d9e57610d6561090c858381518110610d4357fe5b602002602001015133858581518110610d5857fe5b60200260200101516110c9565b610d96848281518110610d7457fe5b602002602001015184848481518110610d8957fe5b6020026020010151611bfe565b600101610d28565b50505050565b60015473ffffffffffffffffffffffffffffffffffffffff90811691161490565b60008282604051602001610dda92919061291a565b60405160208183030381529060405280519060200120905092915050565b6000610e0861090c863386611922565b60607f4c07348100000000000000000000000000000000000000000000000000000000610e34876120b3565b86610e3e876120f4565b604051602401610e5093929190612a21565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506000610ebc87611636565b9050610eca81308487611e6f565b925050505b949350505050565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b60001981565b610f016122ef565b60038281548110610f0e57fe5b60009182526020918290206040805160c0810182526004909302909101805473ffffffffffffffffffffffffffffffffffffffff168352600180820180548451601f60026000199584161561010002959095019092169390930490810187900487028301870190945283825293949193858301939192909190830182828015610fd85780601f10610fad57610100808354040283529160200191610fd8565b820191906000526020600020905b815481529060010190602001808311610fbb57829003601f168201915b5050509183525050600282015460ff80821615156020840152610100820481161515604084015262010000909104161515606082015260039091015460809091015292915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b611050835182516120a6565b60005b8351811015610d9e5761109061090c85838151811061106e57fe5b60200260200101513385858151811061108357fe5b60200260200101516115a8565b6110c184828151811061109f57fe5b6020026020010151848484815181106110b457fe5b6020026020010151611b75565b600101611053565b6000610ecf7f0000000000000000000000000000000000000000000000000000000000000000848487612163565b600061110233610da4565b8061111c57508115801561111c575061111c85338561142b565b905061112a81610191611b67565b60006111358661078a565b90506111568186868661114a57611bfe61114e565b611b755b63ffffffff16565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61118e825182516120a6565b60005b82518110156111c6576111be8382815181106111a957fe5b602002602001015133848481518110610d8957fe5b600101611191565b505050565b6040516000906111e19030908490602001612928565b604051602081830303815290604052805190602001209050919050565b600061120e61090c86338661142b565b60607f6f8bc5960000000000000000000000000000000000000000000000000000000061123a876120b3565b86611244876120f4565b60405160240161125693929190612a21565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506000610ebc8761078a565b6000600460006112d386868661097b565b815260208101919091526040016000205460ff16949350505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60003373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614156113a9577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16149050610924565b6000848152600560205260409020546113cc576113c78484846115d6565b610ecf565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161490509392505050565b6206978081565b6000610ecf7f0000000000000000000000000000000000000000000000000000000000000000848487612213565b7f000000000000000000000000000000000000000000000000000000000000000090565b60035460009082106114a15760405162461bcd60e51b81526004016107f490612cbb565b6000600383815481106114b057fe5b60009182526020909120600490910201600281015490915060ff161580156114e257506002810154610100900460ff16155b801561092457506003015442101592915050565b600061150133610da4565b8061151b57508115801561151b575061151b853385611922565b905061152981610191611b67565b600061113586611636565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b60006107b67f000000000000000000000000000000000000000000000000000000000000000083610dc5565b60006107b67f000000000000000000000000000000000000000000000000000000000000000083610dc5565b6000610ecf7f0000000000000000000000000000000000000000000000000000000000000000848487612163565b6000600460006115e786868661097b565b815260208101919091526040016000205460ff1680610ecf5750600460006112d3868660001961097b565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006107b67f000000000000000000000000000000000000000000000000000000000000000083610dc5565b60006303c267008311156116885760405162461bcd60e51b81526004016107f490612c16565b61169461090c33610da4565b600084815260056020526040812054908185106116b457620697806116c3565b6116c38583036206978061224e565b905060006116d08761157c565b9050606063f0bb940660e01b88886040516024016116ef92919061291a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061175d823083868a611eb2565b98975050505050505050565b6117ad3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610191611b67565b6040517f851c1bb300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063851c1bb390611842907f058a628f0000000000000000000000000000000000000000000000000000000090600401612ad4565b60206040518083038186803b15801561185a57600080fd5b505afa15801561186e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118929190612690565b90506000818414806118b257506000828152600560205260409020548311155b9050806118d15760405162461bcd60e51b81526004016107f490612ba8565b600084815260056020526040908190208490555184907f0e182617f9e5f9ce5f761c791ec15ad52176d97f9706b5c2707ffda7b6bdf79090611914908690612acb565b60405180910390a250505050565b6000610ecf7f0000000000000000000000000000000000000000000000000000000000000000848487612213565b606061195a61225a565b600354821061197b5760405162461bcd60e51b81526004016107f490612cbb565b60006003838154811061198a57fe5b60009182526020909120600490910201600281015490915060ff16156119c25760405162461bcd60e51b81526004016107f490612cf2565b6002810154610100900460ff16156119ec5760405162461bcd60e51b81526004016107f490612c84565b8060030154421015611a105760405162461bcd60e51b81526004016107f490612bdf565b600281015462010000900460ff1615611a4e576000611a2e84611550565b90506000611a3d8233306115d6565b9050611a4b81610191611b67565b50505b60028101805460ff1916600190811790915581546040517f1cff79cd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811693631cff79cd93611ada9392169190860190600401612979565b600060405180830381600087803b158015611af457600080fd5b505af1158015611b08573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b309190810190612846565b60405190925083907f4fa5548c15e2d4a0b806eee962935acea143d79644d2340af39f4edf13b335a990600090a250610668612273565b81610786576107868161227a565b6000611b8284848461097b565b60008181526004602052604090205490915060ff16610d9e57600081815260046020526040808220805460ff191660011790555173ffffffffffffffffffffffffffffffffffffffff808516929086169187917fef6ee312a0062a24a46be2eba5284183a87ff848110e8d4df979bd690d9e9f6891a450505050565b6000611c0b84848461097b565b60008181526004602052604090205490915060ff1615610d9e57600081815260046020526040808220805460ff191690555173ffffffffffffffffffffffffffffffffffffffff808516929086169187917f7b42e026d3b17cf41399915c285780d0f724b3464b269297aff73c0de0fe417f91a450505050565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f39510b933a9d010f906528d6019d3f4e2450a10dc33b10887503b31ed82f111190600090a250565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f566fe119ff450afc2580186c62762b6c1258245c8b1b6bb095e7276eb5a75b5590600090a250565b6000600482511015611d7757506000610668565b601882600381518110611d8657fe5b016020015183517fff0000000000000000000000000000000000000000000000000000000000000090911690911c9060109084906002908110611dc557fe5b016020015184517fff0000000000000000000000000000000000000000000000000000000000000090911690911c9060089085906001908110611e0457fe5b016020015185517fff0000000000000000000000000000000000000000000000000000000000000090911690911c908590600090611e3e57fe5b01602001517fff00000000000000000000000000000000000000000000000000000000000000161717179050919050565b60008481526005602052604081205480611e9b5760405162461bcd60e51b81526004016107f490612c4d565b611ea88686868487611eb2565b9695505050505050565b600354604051819087907f26ce5ffb7ab1ce72d9ca4a3e4f906d2b99194d6c53dd9832fd7a59d0b2fc6bed90600090a381516040805160c08101825273ffffffffffffffffffffffffffffffffffffffff888116825260208083018981526000948401859052606084018590529415156080840181905242890160a0850181905260038054600181018255965284517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b600490970296870180547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909516178455955180519195611fcc937fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c90910192910190612325565b50604082015160028201805460608501516080860151151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff95151560ff199094169390931794909416919091171691909117905560a090910151600390910155600061206584611550565b905060005b8551811015612099576120918287838151811061208357fe5b602002602001015130611b75565b60010161206a565b5050505095945050505050565b6107868183146067611b67565b6040805160018082528183019092526060916020808301908036833701905050905081816000815181106120e357fe5b602002602001018181525050919050565b60408051600180825281830190925260609160208083019080368337019050509050818160008151811061212457fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050919050565b6000806121708684610dc5565b600081815260056020526040902054909150156121de577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614915050610ecf565b6121e98186866115d6565b156121f8576001915050610ecf565b600061220687600019610dc5565b9050610eca818787611313565b6000806122208684610dc5565b9050600061223087600019610dc5565b905061223d8287876115d6565b80610eca5750610eca8187876115d6565b80820390821002900390565b61226c60026000541415610190611b67565b6002600055565b6001600055565b62461bcd60e51b600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b604452610978917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b6040805160c08101825260008082526060602083018190529282018190529181018290526080810182905260a081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061236657805160ff1916838001178555612393565b82800160010185558215612393579182015b82811115612393578251825591602001919060010190612378565b5061239f9291506123a3565b5090565b5b8082111561239f57600081556001016123a4565b803573ffffffffffffffffffffffffffffffffffffffff811681146107b657600080fd5b600082601f8301126123ec578081fd5b81356123ff6123fa82612dc6565b612d9f565b81815291506020808301908481018184028601820187101561242057600080fd5b60005b848110156124475761243588836123b8565b84529282019290820190600101612423565b505050505092915050565b600082601f830112612462578081fd5b81356124706123fa82612dc6565b81815291506020808301908481018184028601820187101561249157600080fd5b60005b8481101561244757813584529282019290820190600101612494565b6000602082840312156124c1578081fd5b61092483836123b8565b600080604083850312156124dd578081fd5b6124e784846123b8565b9150602083013567ffffffffffffffff811115612502578182fd5b61250e858286016123dc565b9150509250929050565b60008060006060848603121561252c578081fd5b61253685856123b8565b9250602084013567ffffffffffffffff80821115612552578283fd5b818601915086601f830112612565578283fd5b81356125736123fa82612de6565b818152886020838601011115612587578485fd5b81602085016020830137908101602001849052935060408601359150808211156125af578283fd5b506125bc868287016123dc565b9150509250925092565b6000806000606084860312156125da578283fd5b833567ffffffffffffffff808211156125f1578485fd5b6125fd87838801612452565b945061260c87602088016123b8565b935060408601359150808211156125af578283fd5b60008060408385031215612633578182fd5b823567ffffffffffffffff8082111561264a578384fd5b61265686838701612452565b9350602085013591508082111561266b578283fd5b5061250e858286016123dc565b600060208284031215612689578081fd5b5035919050565b6000602082840312156126a1578081fd5b5051919050565b6000806000606084860312156126bc578283fd5b833592506126cd85602086016123b8565b91506126dc85604086016123b8565b90509250925092565b600080600080608085870312156126fa578081fd5b8435935061270b86602087016123b8565b925061271a86604087016123b8565b9150606085013567ffffffffffffffff811115612735578182fd5b612741878288016123dc565b91505092959194509250565b60008060008060808587031215612762578384fd5b8435935061277386602087016123b8565b925061278286604087016123b8565b915060608501358015158114612796578182fd5b939692955090935050565b600080604083850312156127b3578182fd5b50508035926020909101359150565b6000806000606084860312156127d6578081fd5b8335925060208401359150604084013567ffffffffffffffff8111156127fa578182fd5b6125bc868287016123dc565b600060208284031215612817578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610924578182fd5b600060208284031215612857578081fd5b815167ffffffffffffffff81111561286d578182fd5b8201601f8101841361287d578182fd5b805161288b6123fa82612de6565b81815285602083850101111561289f578384fd5b610aa0826020830160208601612e2f565b600081518084526128c8816020860160208601612e2f565b601f01601f19169290920160200192915050565b9283527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b81166020850152911b16603482015260480190565b918252602082015260400190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60006040820173ffffffffffffffffffffffffffffffffffffffff8516835260206040818501528285546001808216600081146129bd57600181146129db57612a13565b607f6002840416865260ff1983166060890152608088019350612a13565b600283048087526129eb8a612e0a565b885b82811015612a095781548b8201606001529084019087016129ed565b8a01606001955050505b509198975050505050505050565b606080825284519082018190526000906020906080840190828801845b82811015612a5a57815184529284019290840190600101612a3e565b50505073ffffffffffffffffffffffffffffffffffffffff8616848301528381036040850152845180825285830191830190845b81811015612ab257612aa08451612e16565b83529284019291840191600101612a8e565b509098975050505050505050565b901515815260200190565b90815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b60006020825261092460208301846128b0565b60208082526022908201527f43414e4e4f545f5343484544554c455f415554484f52495a45525f414354494f60408201527f4e53000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f415454454d5054494e475f4558454355544f525f5245454e5452414e43590000604082015260600190565b6020808252601c908201527f44454c41595f455843454544535f5345545f415554484f52495a455200000000604082015260600190565b60208082526015908201527f414354494f4e5f4e4f545f45584543555441424c450000000000000000000000604082015260600190565b6020808252600f908201527f44454c41595f544f4f5f4c415247450000000000000000000000000000000000604082015260600190565b60208082526016908201527f43414e4e4f545f5343484544554c455f414354494f4e00000000000000000000604082015260600190565b60208082526018908201527f414354494f4e5f414c52454144595f43414e43454c4c45440000000000000000604082015260600190565b60208082526015908201527f414354494f4e5f444f45535f4e4f545f45584953540000000000000000000000604082015260600190565b60208082526017908201527f414354494f4e5f414c52454144595f4558454355544544000000000000000000604082015260600190565b60006020825273ffffffffffffffffffffffffffffffffffffffff8351166020830152602083015160c06040840152612d6560e08401826128b0565b90506040840151151560608401526060840151151560808401526080840151151560a084015260a084015160c08401528091505092915050565b60405181810167ffffffffffffffff81118282101715612dbe57600080fd5b604052919050565b600067ffffffffffffffff821115612ddc578081fd5b5060209081020190565b600067ffffffffffffffff821115612dfc578081fd5b50601f01601f191660200190565b60009081526020902090565b73ffffffffffffffffffffffffffffffffffffffff1690565b60005b83811015612e4a578181015183820152602001612e32565b83811115610d9e575050600091015256fea26469706673582212207e14d63df701b3a682c04941f31e9595e90b087d36758bc5d3f58c17151385f564736f6c6343000701003360a060405234801561001057600080fd5b5060016000553360601b60805260805160601c6104b061003f600039806101c6528061026e52506104b06000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80631cff79cd1461003b578063d09edf3114610173575b600080fd5b6100fe6004803603604081101561005157600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516919081019060408101602082013564010000000081111561008957600080fd5b82018360208201111561009b57600080fd5b803590602001918460018302840111640100000000831117156100bd57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506101a4945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610138578181015183820152602001610120565b50505050905090810190601f1680156101655780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61017b61026c565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b60606101ae610290565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461025257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552525f53454e4445525f4e4f545f415554484f52495a455200000000000000604482015290519081900360640190fd5b61025c83836102a9565b9050610266610393565b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6102a26002600054141561019061039a565b6002600055565b6060600060608473ffffffffffffffffffffffffffffffffffffffff16846040518082805190602001908083835b6020831061031457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016102d7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610376576040519150601f19603f3d011682016040523d82523d6000602084013e61037b565b606091505b509150915061038a82826103ac565b95945050505050565b6001600055565b816103a8576103a8816103d2565b5050565b606082156103bb575080610266565b8151156103cb5781518083602001fd5b6102666101ae5b6103fc817f42414c00000000000000000000000000000000000000000000000000000000006103ff565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fdfea2646970667358221220c01812c10f3f215bb6990381bdcf73883fb162445142c33e867c1bfb90e5b24864736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106103155760003560e01c80637e1c556d116101a7578063d00bef4d116100ee578063e8104ea011610097578063f1521d7611610071578063f1521d761461060e578063fc78a22814610621578063fe0d94c11461062957610315565b8063e8104ea0146105d5578063f0845522146105e8578063f0bb9406146105fb57610315565b8063df6b0d01116100c8578063df6b0d01146105a7578063e2b4146b146105ba578063e5e6e8ae146105cd57610315565b8063d00bef4d14610579578063d754bad914610581578063d7ad1dcf1461059457610315565b80639be2a88411610150578063c284b6b91161012a578063c284b6b91461054b578063cc63604a14610553578063cf8475da1461056657610315565b80639be2a8841461051d5780639f81aed714610530578063b3eb281d1461053857610315565b8063863bac6b11610181578063863bac6b146104ef57806386ff254b146105025780638d928af81461051557610315565b80637e1c556d146104c157806382938ca8146104c9578063851c1bb3146104dc57610315565b80634125ff901161026b57806362cde1ba116102145780636f8bc596116101ee5780636f8bc59614610488578063715716a21461049b57806378a08377146104ae57610315565b806362cde1ba146104585780636badd2ab146104605780636c1032af1461048057610315565b806355ed08a11161024557806355ed08a11461041d5780635b78b780146104305780635ca1e1651461044357610315565b80634125ff90146103ef5780634c073481146103f7578063557a64031461040a57610315565b80631b3c85eb116102cd5780632e3ed05b116102a75780632e3ed05b146103b65780633bf46797146103c957806340e58ee5146103dc57610315565b80631b3c85eb146103885780632362716d1461039b5780632debdd2e146103ae57610315565b806314ea35e7116102fe57806314ea35e714610358578063151b89d114610362578063169f14681461037557610315565b80630df322a61461031a57806310697a3a14610343575b600080fd5b61032d6103283660046124b0565b610649565b60405161033a9190612ac0565b60405180910390f35b61034b61066d565b60405161033a9190612acb565b610360610691565b005b61034b610370366004612678565b61078a565b61034b610383366004612518565b6107bc565b6103606103963660046124b0565b61092b565b61034b6103a93660046126a8565b61097b565b61034b6109b1565b61034b6103c43660046124cb565b6109d5565b61034b6103d7366004612678565b610aa9565b6103606103ea366004612678565b610abb565b61034b610d11565b6103606104053660046125c6565b610d19565b61032d6104183660046124b0565b610da4565b61034b61042b3660046127a1565b610dc5565b61034b61043e3660046126e5565b610df8565b61044b610ed7565b60405161033a9190612958565b61044b610ef3565b61047361046e366004612678565b610ef9565b60405161033a9190612d29565b61044b611020565b6103606104963660046125c6565b611044565b61032d6104a93660046126a8565b6110c9565b6103606104bc36600461274d565b6110f7565b61034b61115e565b6103606104d7366004612621565b611182565b61034b6104ea366004612806565b6111cb565b61034b6104fd3660046126e5565b6111fe565b61032d6105103660046126a8565b6112c2565b61044b6112ef565b61032d61052b3660046126a8565b611313565b61034b611424565b61032d6105463660046126a8565b61142b565b61034b611459565b61032d610561366004612678565b61147d565b61036061057436600461274d565b6114f6565b61044b611534565b61034b61058f366004612678565b611550565b61034b6105a2366004612678565b61157c565b61032d6105b53660046126a8565b6115a8565b61032d6105c83660046126a8565b6115d6565b61034b611612565b61034b6105e3366004612678565b611636565b61034b6105f63660046127c2565b611662565b6103606106093660046127a1565b611769565b61032d61061c3660046126a8565b611922565b61034b610ef3565b61063c610637366004612678565b611950565b60405161033a9190612b01565b60025473ffffffffffffffffffffffffffffffffffffffff8281169116145b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015460025473ffffffffffffffffffffffffffffffffffffffff91821691166106bf338214610191611b67565b6106ec7f000000000000000000000000000000000000000000000000000000000000000082600019611b75565b6107197f000000000000000000000000000000000000000000000000000000000000000082600019611b75565b6107467f000000000000000000000000000000000000000000000000000000000000000083600019611bfe565b6107737f000000000000000000000000000000000000000000000000000000000000000083600019611bfe565b61077c81611c85565b6107866000611cf4565b5050565b60006107b67f000000000000000000000000000000000000000000000000000000000000000083610dc5565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff84163014156107fd5760405162461bcd60e51b81526004016107f490612b14565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156108695760405162461bcd60e51b81526004016107f490612b71565b60008473ffffffffffffffffffffffffffffffffffffffff1663851c1bb361089086611d63565b6040518263ffffffff1660e01b81526004016108ac9190612ad4565b60206040518083038186803b1580156108c457600080fd5b505afa1580156108d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fc9190612690565b905061091461090c8233886115d6565b610191611b67565b61092081868686611e6f565b9150505b9392505050565b61096f3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610191611b67565b61097881611cf4565b50565b6000838383604051602001610992939291906128dc565b6040516020818303038152906040528051906020012090509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006109e361090c33610da4565b6000610a0e7f1b3c85eb000000000000000000000000000000000000000000000000000000006111cb565b90506060631b3c85eb60e01b85604051602401610a2b9190612958565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050610aa0823083610a9a611459565b88611eb2565b95945050505050565b60009081526005602052604090205490565b6003548110610adc5760405162461bcd60e51b81526004016107f490612cbb565b600060038281548110610aeb57fe5b60009182526020909120600490910201600281015490915060ff1615610b235760405162461bcd60e51b81526004016107f490612cf2565b6002810154610100900460ff1615610b4d5760405162461bcd60e51b81526004016107f490612c84565b805460018083018054604080516020600261010096851615969096026000190190931694909404601f810183900483028501830190915280845273ffffffffffffffffffffffffffffffffffffffff90941693600093859363851c1bb393610c0b9390830182828015610c015780601f10610bd657610100808354040283529160200191610c01565b820191906000526020600020905b815481529060010190602001808311610be457829003601f168201915b5050505050611d63565b6040518263ffffffff1660e01b8152600401610c279190612ad4565b60206040518083038186803b158015610c3f57600080fd5b505afa158015610c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c779190612690565b8354909150610cb290610ca3908390339073ffffffffffffffffffffffffffffffffffffffff166115d6565b8061090c575061090c33610da4565b6002830180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560405184907f2a6bef66de603fc0ec07223576486bd905cd9bb6e05364286d9a5cd1be046ae690600090a250505050565b6303c2670081565b610d25835182516120a6565b60005b8351811015610d9e57610d6561090c858381518110610d4357fe5b602002602001015133858581518110610d5857fe5b60200260200101516110c9565b610d96848281518110610d7457fe5b602002602001015184848481518110610d8957fe5b6020026020010151611bfe565b600101610d28565b50505050565b60015473ffffffffffffffffffffffffffffffffffffffff90811691161490565b60008282604051602001610dda92919061291a565b60405160208183030381529060405280519060200120905092915050565b6000610e0861090c863386611922565b60607f4c07348100000000000000000000000000000000000000000000000000000000610e34876120b3565b86610e3e876120f4565b604051602401610e5093929190612a21565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506000610ebc87611636565b9050610eca81308487611e6f565b925050505b949350505050565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b60001981565b610f016122ef565b60038281548110610f0e57fe5b60009182526020918290206040805160c0810182526004909302909101805473ffffffffffffffffffffffffffffffffffffffff168352600180820180548451601f60026000199584161561010002959095019092169390930490810187900487028301870190945283825293949193858301939192909190830182828015610fd85780601f10610fad57610100808354040283529160200191610fd8565b820191906000526020600020905b815481529060010190602001808311610fbb57829003601f168201915b5050509183525050600282015460ff80821615156020840152610100820481161515604084015262010000909104161515606082015260039091015460809091015292915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b611050835182516120a6565b60005b8351811015610d9e5761109061090c85838151811061106e57fe5b60200260200101513385858151811061108357fe5b60200260200101516115a8565b6110c184828151811061109f57fe5b6020026020010151848484815181106110b457fe5b6020026020010151611b75565b600101611053565b6000610ecf7f0000000000000000000000000000000000000000000000000000000000000000848487612163565b600061110233610da4565b8061111c57508115801561111c575061111c85338561142b565b905061112a81610191611b67565b60006111358661078a565b90506111568186868661114a57611bfe61114e565b611b755b63ffffffff16565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61118e825182516120a6565b60005b82518110156111c6576111be8382815181106111a957fe5b602002602001015133848481518110610d8957fe5b600101611191565b505050565b6040516000906111e19030908490602001612928565b604051602081830303815290604052805190602001209050919050565b600061120e61090c86338661142b565b60607f6f8bc5960000000000000000000000000000000000000000000000000000000061123a876120b3565b86611244876120f4565b60405160240161125693929190612a21565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506000610ebc8761078a565b6000600460006112d386868661097b565b815260208101919091526040016000205460ff16949350505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60003373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614156113a9577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16149050610924565b6000848152600560205260409020546113cc576113c78484846115d6565b610ecf565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161490509392505050565b6206978081565b6000610ecf7f0000000000000000000000000000000000000000000000000000000000000000848487612213565b7f000000000000000000000000000000000000000000000000000000000000000090565b60035460009082106114a15760405162461bcd60e51b81526004016107f490612cbb565b6000600383815481106114b057fe5b60009182526020909120600490910201600281015490915060ff161580156114e257506002810154610100900460ff16155b801561092457506003015442101592915050565b600061150133610da4565b8061151b57508115801561151b575061151b853385611922565b905061152981610191611b67565b600061113586611636565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b60006107b67f000000000000000000000000000000000000000000000000000000000000000083610dc5565b60006107b67f000000000000000000000000000000000000000000000000000000000000000083610dc5565b6000610ecf7f0000000000000000000000000000000000000000000000000000000000000000848487612163565b6000600460006115e786868661097b565b815260208101919091526040016000205460ff1680610ecf5750600460006112d3868660001961097b565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006107b67f000000000000000000000000000000000000000000000000000000000000000083610dc5565b60006303c267008311156116885760405162461bcd60e51b81526004016107f490612c16565b61169461090c33610da4565b600084815260056020526040812054908185106116b457620697806116c3565b6116c38583036206978061224e565b905060006116d08761157c565b9050606063f0bb940660e01b88886040516024016116ef92919061291a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061175d823083868a611eb2565b98975050505050505050565b6117ad3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610191611b67565b6040517f851c1bb300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063851c1bb390611842907f058a628f0000000000000000000000000000000000000000000000000000000090600401612ad4565b60206040518083038186803b15801561185a57600080fd5b505afa15801561186e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118929190612690565b90506000818414806118b257506000828152600560205260409020548311155b9050806118d15760405162461bcd60e51b81526004016107f490612ba8565b600084815260056020526040908190208490555184907f0e182617f9e5f9ce5f761c791ec15ad52176d97f9706b5c2707ffda7b6bdf79090611914908690612acb565b60405180910390a250505050565b6000610ecf7f0000000000000000000000000000000000000000000000000000000000000000848487612213565b606061195a61225a565b600354821061197b5760405162461bcd60e51b81526004016107f490612cbb565b60006003838154811061198a57fe5b60009182526020909120600490910201600281015490915060ff16156119c25760405162461bcd60e51b81526004016107f490612cf2565b6002810154610100900460ff16156119ec5760405162461bcd60e51b81526004016107f490612c84565b8060030154421015611a105760405162461bcd60e51b81526004016107f490612bdf565b600281015462010000900460ff1615611a4e576000611a2e84611550565b90506000611a3d8233306115d6565b9050611a4b81610191611b67565b50505b60028101805460ff1916600190811790915581546040517f1cff79cd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811693631cff79cd93611ada9392169190860190600401612979565b600060405180830381600087803b158015611af457600080fd5b505af1158015611b08573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b309190810190612846565b60405190925083907f4fa5548c15e2d4a0b806eee962935acea143d79644d2340af39f4edf13b335a990600090a250610668612273565b81610786576107868161227a565b6000611b8284848461097b565b60008181526004602052604090205490915060ff16610d9e57600081815260046020526040808220805460ff191660011790555173ffffffffffffffffffffffffffffffffffffffff808516929086169187917fef6ee312a0062a24a46be2eba5284183a87ff848110e8d4df979bd690d9e9f6891a450505050565b6000611c0b84848461097b565b60008181526004602052604090205490915060ff1615610d9e57600081815260046020526040808220805460ff191690555173ffffffffffffffffffffffffffffffffffffffff808516929086169187917f7b42e026d3b17cf41399915c285780d0f724b3464b269297aff73c0de0fe417f91a450505050565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f39510b933a9d010f906528d6019d3f4e2450a10dc33b10887503b31ed82f111190600090a250565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f566fe119ff450afc2580186c62762b6c1258245c8b1b6bb095e7276eb5a75b5590600090a250565b6000600482511015611d7757506000610668565b601882600381518110611d8657fe5b016020015183517fff0000000000000000000000000000000000000000000000000000000000000090911690911c9060109084906002908110611dc557fe5b016020015184517fff0000000000000000000000000000000000000000000000000000000000000090911690911c9060089085906001908110611e0457fe5b016020015185517fff0000000000000000000000000000000000000000000000000000000000000090911690911c908590600090611e3e57fe5b01602001517fff00000000000000000000000000000000000000000000000000000000000000161717179050919050565b60008481526005602052604081205480611e9b5760405162461bcd60e51b81526004016107f490612c4d565b611ea88686868487611eb2565b9695505050505050565b600354604051819087907f26ce5ffb7ab1ce72d9ca4a3e4f906d2b99194d6c53dd9832fd7a59d0b2fc6bed90600090a381516040805160c08101825273ffffffffffffffffffffffffffffffffffffffff888116825260208083018981526000948401859052606084018590529415156080840181905242890160a0850181905260038054600181018255965284517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b600490970296870180547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909516178455955180519195611fcc937fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c90910192910190612325565b50604082015160028201805460608501516080860151151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff95151560ff199094169390931794909416919091171691909117905560a090910151600390910155600061206584611550565b905060005b8551811015612099576120918287838151811061208357fe5b602002602001015130611b75565b60010161206a565b5050505095945050505050565b6107868183146067611b67565b6040805160018082528183019092526060916020808301908036833701905050905081816000815181106120e357fe5b602002602001018181525050919050565b60408051600180825281830190925260609160208083019080368337019050509050818160008151811061212457fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050919050565b6000806121708684610dc5565b600081815260056020526040902054909150156121de577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614915050610ecf565b6121e98186866115d6565b156121f8576001915050610ecf565b600061220687600019610dc5565b9050610eca818787611313565b6000806122208684610dc5565b9050600061223087600019610dc5565b905061223d8287876115d6565b80610eca5750610eca8187876115d6565b80820390821002900390565b61226c60026000541415610190611b67565b6002600055565b6001600055565b62461bcd60e51b600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b604452610978917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b6040805160c08101825260008082526060602083018190529282018190529181018290526080810182905260a081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061236657805160ff1916838001178555612393565b82800160010185558215612393579182015b82811115612393578251825591602001919060010190612378565b5061239f9291506123a3565b5090565b5b8082111561239f57600081556001016123a4565b803573ffffffffffffffffffffffffffffffffffffffff811681146107b657600080fd5b600082601f8301126123ec578081fd5b81356123ff6123fa82612dc6565b612d9f565b81815291506020808301908481018184028601820187101561242057600080fd5b60005b848110156124475761243588836123b8565b84529282019290820190600101612423565b505050505092915050565b600082601f830112612462578081fd5b81356124706123fa82612dc6565b81815291506020808301908481018184028601820187101561249157600080fd5b60005b8481101561244757813584529282019290820190600101612494565b6000602082840312156124c1578081fd5b61092483836123b8565b600080604083850312156124dd578081fd5b6124e784846123b8565b9150602083013567ffffffffffffffff811115612502578182fd5b61250e858286016123dc565b9150509250929050565b60008060006060848603121561252c578081fd5b61253685856123b8565b9250602084013567ffffffffffffffff80821115612552578283fd5b818601915086601f830112612565578283fd5b81356125736123fa82612de6565b818152886020838601011115612587578485fd5b81602085016020830137908101602001849052935060408601359150808211156125af578283fd5b506125bc868287016123dc565b9150509250925092565b6000806000606084860312156125da578283fd5b833567ffffffffffffffff808211156125f1578485fd5b6125fd87838801612452565b945061260c87602088016123b8565b935060408601359150808211156125af578283fd5b60008060408385031215612633578182fd5b823567ffffffffffffffff8082111561264a578384fd5b61265686838701612452565b9350602085013591508082111561266b578283fd5b5061250e858286016123dc565b600060208284031215612689578081fd5b5035919050565b6000602082840312156126a1578081fd5b5051919050565b6000806000606084860312156126bc578283fd5b833592506126cd85602086016123b8565b91506126dc85604086016123b8565b90509250925092565b600080600080608085870312156126fa578081fd5b8435935061270b86602087016123b8565b925061271a86604087016123b8565b9150606085013567ffffffffffffffff811115612735578182fd5b612741878288016123dc565b91505092959194509250565b60008060008060808587031215612762578384fd5b8435935061277386602087016123b8565b925061278286604087016123b8565b915060608501358015158114612796578182fd5b939692955090935050565b600080604083850312156127b3578182fd5b50508035926020909101359150565b6000806000606084860312156127d6578081fd5b8335925060208401359150604084013567ffffffffffffffff8111156127fa578182fd5b6125bc868287016123dc565b600060208284031215612817578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610924578182fd5b600060208284031215612857578081fd5b815167ffffffffffffffff81111561286d578182fd5b8201601f8101841361287d578182fd5b805161288b6123fa82612de6565b81815285602083850101111561289f578384fd5b610aa0826020830160208601612e2f565b600081518084526128c8816020860160208601612e2f565b601f01601f19169290920160200192915050565b9283527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b81166020850152911b16603482015260480190565b918252602082015260400190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60006040820173ffffffffffffffffffffffffffffffffffffffff8516835260206040818501528285546001808216600081146129bd57600181146129db57612a13565b607f6002840416865260ff1983166060890152608088019350612a13565b600283048087526129eb8a612e0a565b885b82811015612a095781548b8201606001529084019087016129ed565b8a01606001955050505b509198975050505050505050565b606080825284519082018190526000906020906080840190828801845b82811015612a5a57815184529284019290840190600101612a3e565b50505073ffffffffffffffffffffffffffffffffffffffff8616848301528381036040850152845180825285830191830190845b81811015612ab257612aa08451612e16565b83529284019291840191600101612a8e565b509098975050505050505050565b901515815260200190565b90815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b60006020825261092460208301846128b0565b60208082526022908201527f43414e4e4f545f5343484544554c455f415554484f52495a45525f414354494f60408201527f4e53000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f415454454d5054494e475f4558454355544f525f5245454e5452414e43590000604082015260600190565b6020808252601c908201527f44454c41595f455843454544535f5345545f415554484f52495a455200000000604082015260600190565b60208082526015908201527f414354494f4e5f4e4f545f45584543555441424c450000000000000000000000604082015260600190565b6020808252600f908201527f44454c41595f544f4f5f4c415247450000000000000000000000000000000000604082015260600190565b60208082526016908201527f43414e4e4f545f5343484544554c455f414354494f4e00000000000000000000604082015260600190565b60208082526018908201527f414354494f4e5f414c52454144595f43414e43454c4c45440000000000000000604082015260600190565b60208082526015908201527f414354494f4e5f444f45535f4e4f545f45584953540000000000000000000000604082015260600190565b60208082526017908201527f414354494f4e5f414c52454144595f4558454355544544000000000000000000604082015260600190565b60006020825273ffffffffffffffffffffffffffffffffffffffff8351166020830152602083015160c06040840152612d6560e08401826128b0565b90506040840151151560608401526060840151151560808401526080840151151560a084015260a084015160c08401528091505092915050565b60405181810167ffffffffffffffff81118282101715612dbe57600080fd5b604052919050565b600067ffffffffffffffff821115612ddc578081fd5b5060209081020190565b600067ffffffffffffffff821115612dfc578081fd5b50601f01601f191660200190565b60009081526020902090565b73ffffffffffffffffffffffffffffffffffffffff1690565b60005b83811015612e4a578181015183820152602001612e32565b83811115610d9e575050600091015256fea26469706673582212207e14d63df701b3a682c04941f31e9595e90b087d36758bc5d3f58c17151385f564736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/artifact/TimelockAuthorizerMigrator.json b/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/artifact/TimelockAuthorizerMigrator.json new file mode 100644 index 0000000..853468d --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/artifact/TimelockAuthorizerMigrator.json @@ -0,0 +1,270 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TimelockAuthorizerMigrator", + "sourceName": "contracts/TimelockAuthorizerMigrator.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_root", + "type": "address" + }, + { + "internalType": "contract IBasicAuthorizer", + "name": "_oldAuthorizer", + "type": "address" + }, + { + "internalType": "contract IAuthorizerAdaptorEntrypoint", + "name": "_authorizerAdaptorEntrypoint", + "type": "address" + }, + { + "components": [ + { + "internalType": "address", + "name": "grantee", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "internalType": "struct TimelockAuthorizerMigrator.RoleData[]", + "name": "_rolesData", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "address", + "name": "grantee", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "internalType": "struct TimelockAuthorizerMigrator.RoleData[]", + "name": "_grantersData", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "address", + "name": "grantee", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "internalType": "struct TimelockAuthorizerMigrator.RoleData[]", + "name": "_revokersData", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "newDelay", + "type": "uint256" + } + ], + "internalType": "struct TimelockAuthorizerMigrator.DelayData[]", + "name": "_executeDelaysData", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "actionId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "newDelay", + "type": "uint256" + } + ], + "internalType": "struct TimelockAuthorizerMigrator.DelayData[]", + "name": "_grantDelaysData", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "CHANGE_ROOT_DELAY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EVERYWHERE", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "GENERAL_PERMISSION_SPECIFIER", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "executeDelays", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "finalizeMigration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "newAuthorizer", + "outputs": [ + { + "internalType": "contract TimelockAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "oldAuthorizer", + "outputs": [ + { + "internalType": "contract IBasicAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "root", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rootChangeExecutionId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "startRootTransfer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "vault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101006040523480156200001257600080fd5b5060405162005626380380620056268339810160408190526200003591620009c4565b600030876224ea006040516200004b906200083a565b620000599392919062000baf565b604051809103906000f08015801562000076573d6000803e3d6000fd5b506001600160601b0319606082811b821660e0528a811b821660c0528b901b1660a052604080516311b2515f60e31b815290519192506001600160a01b03891691638d928af891600480820192602092909190829003018186803b158015620000de57600080fd5b505afa158015620000f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000119919062000b1d565b60601b6001600160601b03191660805260005b8651811015620002a9576200014062000848565b8782815181106200014d57fe5b60200260200101519050896001600160a01b0316639be2a8848260200151836000015184604001516040518463ffffffff1660e01b8152600401620001959392919062000c47565b60206040518083038186803b158015620001ae57600080fd5b505afa158015620001c3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001e9919062000adb565b620002115760405162461bcd60e51b8152600401620002089062000cb7565b60405180910390fd5b826001600160a01b0316636f8bc596620002358360200151620007a260201b60201c565b835160408501516200024790620007e4565b6040518463ffffffff1660e01b8152600401620002679392919062000bd3565b600060405180830381600087803b1580156200028257600080fd5b505af115801562000297573d6000803e3d6000fd5b5050600190930192506200012c915050565b5060005b85518110156200037557816001600160a01b03166378a08377878381518110620002d357fe5b602002602001015160200151888481518110620002ec57fe5b6020026020010151600001518985815181106200030557fe5b60200260200101516040015160016040518563ffffffff1660e01b815260040162000334949392919062000c66565b600060405180830381600087803b1580156200034f57600080fd5b505af115801562000364573d6000803e3d6000fd5b505060019092019150620002ad9050565b5060005b84518110156200044157816001600160a01b031663cf8475da8683815181106200039f57fe5b602002602001015160200151878481518110620003b857fe5b602002602001015160000151888581518110620003d157fe5b60200260200101516040015160016040518563ffffffff1660e01b815260040162000400949392919062000c66565b600060405180830381600087803b1580156200041b57600080fd5b505af115801562000430573d6000803e3d6000fd5b505060019092019150620003799050565b5060005b83518110156200055f5762278d008482815181106200046057fe5b60200260200101516020015111156200048d5760405162461bcd60e51b8152600401620002089062000ce0565b816001600160a01b031663f0845522858381518110620004a957fe5b602002602001015160000151868481518110620004c257fe5b602002602001015160200151620004df30620007e460201b60201c565b6040518463ffffffff1660e01b8152600401620004ff9392919062000c8d565b602060405180830381600087803b1580156200051a57600080fd5b505af11580156200052f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000555919062000b04565b5060010162000445565b5060005b8251811015620006fe5762278d008382815181106200057e57fe5b6020026020010151602001511115620005ab5760405162461bcd60e51b8152600401620002089062000ce0565b816001600160a01b031663f0845522836001600160a01b031663151b89d1868581518110620005d657fe5b6020026020010151600001516040518263ffffffff1660e01b815260040162000600919062000c3e565b60206040518083038186803b1580156200061957600080fd5b505afa1580156200062e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000654919062000b04565b8584815181106200066157fe5b6020026020010151602001516200067e30620007e460201b60201c565b6040518463ffffffff1660e01b81526004016200069e9392919062000c8d565b602060405180830381600087803b158015620006b957600080fd5b505af1158015620006ce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006f4919062000b04565b5060010162000563565b506001600160a01b038116632e3ed05b8a6200071a30620007e4565b6040518363ffffffff1660e01b81526004016200073992919062000b81565b602060405180830381600087803b1580156200075457600080fd5b505af115801562000769573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200078f919062000b04565b6000555062000d77975050505050505050565b604080516001808252818301909252606091602080830190803683370190505090508181600081518110620007d357fe5b602002602001018181525050919050565b6040805160018082528183019092526060916020808301908036833701905050905081816000815181106200081557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050919050565b61390e8062001d1883390190565b604080516060810182526000808252602082018190529181019190915290565b8051620008758162000d5e565b92915050565b600082601f8301126200088c578081fd5b8151620008a36200089d8262000d3e565b62000d17565b8181529150602080830190848101604080850287018301881015620008c757600080fd5b6000805b868110156200090d5782848b031215620008e3578182fd5b620008ee8362000d17565b84518152858501518682015286529484019492820192600101620008cb565b5050505050505092915050565b600082601f8301126200092b578081fd5b81516200093c6200089d8262000d3e565b81815291506020808301908481016060808502870183018810156200096057600080fd5b6000805b868110156200090d5782848b0312156200097c578182fd5b620009878362000d17565b620009938b8662000868565b815285850151868201526040620009ad8c82880162000868565b908201528652948401949282019260010162000964565b600080600080600080600080610100898b031215620009e1578384fd5b620009ed8a8a62000868565b9750620009fe8a60208b0162000868565b965062000a0f8a60408b0162000868565b60608a01519096506001600160401b038082111562000a2c578586fd5b62000a3a8c838d016200091a565b965060808b015191508082111562000a50578586fd5b62000a5e8c838d016200091a565b955060a08b015191508082111562000a74578485fd5b62000a828c838d016200091a565b945060c08b015191508082111562000a98578384fd5b62000aa68c838d016200087b565b935060e08b015191508082111562000abc578283fd5b5062000acb8b828c016200087b565b9150509295985092959890939650565b60006020828403121562000aed578081fd5b8151801515811462000afd578182fd5b9392505050565b60006020828403121562000b16578081fd5b5051919050565b60006020828403121562000b2f578081fd5b815162000afd8162000d5e565b6000815180845260208085019450808401835b8381101562000b765781516001600160a01b03168752958201959082019060010162000b4f565b509495945050505050565b6001600160a01b038316815260406020820181905260009062000ba79083018462000b3c565b949350505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b606080825284519082018190526000906020906080840190828801845b8281101562000c0e5781518452928401929084019060010162000bf0565b5050506001600160a01b03861684830152838103604085015262000c33818662000b3c565b979650505050505050565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9384526001600160a01b039283166020850152911660408301521515606082015260800190565b60008482528360208301526060604083015262000cae606083018462000b3c565b95945050505050565b6020808252600f908201526e554e45585045435445445f524f4c4560881b604082015260600190565b60208082526016908201527f554e45585045435445445f4c415247455f44454c415900000000000000000000604082015260600190565b6040518181016001600160401b038111828210171562000d3657600080fd5b604052919050565b60006001600160401b0382111562000d54578081fd5b5060209081020190565b6001600160a01b038116811462000d7457600080fd5b50565b60805160601c60a05160601c60c05160601c60e05160601c610f2362000df5600039806101a552806102d152806103cb52806104b352806105b9528061069e52806107025280610a365250806108c85280610a9652508061072f5280610aba52508061081d52806109065280610a095280610ade5250610f236000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c8063a217fddf11610081578063ebf0c7171161005b578063ebf0c71714610146578063fbfa77cf1461014e578063fc78a22814610156576100d4565b8063a217fddf1461012e578063b78b608714610136578063c6bfe9ae1461013e576100d4565b80637217d9d1116100b25780637217d9d11461010957806398f85d5c1461011e578063a0c286d814610126576100d4565b806311f13145146100d95780633c44172d146100e357806362cde1ba146100eb575b600080fd5b6100e161015e565b005b6100e1610476565b6100f361066b565b6040516101009190610d0a565b60405180910390f35b61011161068f565b6040516101009190610d2b565b610111610696565b6100f361069c565b6101116106c0565b6100e16106c5565b6100f3610a94565b6100f3610ab8565b6100f3610adc565b61011161066b565b600054158061025257506040517f6badd2ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636badd2ab906101db90600090600401610d2b565b60006040518083038186803b1580156101f357600080fd5b505afa158015610207573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261024d9190810190610c31565b604001515b610291576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028890610e8f565b60405180910390fd5b6000546040517fcc63604a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163cc63604a916103059190600401610d2b565b60206040518083038186803b15801561031d57600080fd5b505afa158015610331573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103559190610bbc565b61038b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028890610e58565b6000546040517ffe0d94c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163fe0d94c1916103ff9190600401610d2b565b600060405180830381600087803b15801561041957600080fd5b505af115801561042d573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526104739190810190610bf6565b50565b6040517fcc63604a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063cc63604a906104e990600090600401610d2b565b60206040518083038186803b15801561050157600080fd5b505afa158015610515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105399190610bbc565b61056f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028890610d8d565b60005b600054811015610473576040517ffe0d94c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063fe0d94c1906105ee908490600401610d2b565b600060405180830381600087803b15801561060857600080fd5b505af115801561061c573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526106629190810190610bf6565b50600101610572565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b6224ea0081565b60005481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081565b6040517f557a640300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063557a640390610757907f000000000000000000000000000000000000000000000000000000000000000090600401610d0a565b60206040518083038186803b15801561076f57600080fd5b505afa158015610783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a79190610bbc565b6107dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028890610dea565b6040517f851c1bb300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063851c1bb390610872907f058a628f0000000000000000000000000000000000000000000000000000000090600401610d60565b60206040518083038186803b15801561088a57600080fd5b505afa15801561089e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c29190610bde565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639be2a88483307f00000000000000000000000000000000000000000000000000000000000000006040518463ffffffff1660e01b815260040161094393929190610d34565b60206040518083038186803b15801561095b57600080fd5b505afa15801561096f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109939190610bbc565b9050806109cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028890610e21565b6040517f058a628f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063058a628f90610a5e907f000000000000000000000000000000000000000000000000000000000000000090600401610d0a565b600060405180830381600087803b158015610a7857600080fd5b505af1158015610a8c573d6000803e3d6000fd5b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b80518015158114610b1057600080fd5b92915050565b600082601f830112610b26578081fd5b815167ffffffffffffffff811115610b3c578182fd5b6020610b6e817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601610ec6565b92508183528481838601011115610b8457600080fd5b60005b82811015610ba2578481018201518482018301528101610b87565b82811115610bb35760008284860101525b50505092915050565b600060208284031215610bcd578081fd5b610bd78383610b00565b9392505050565b600060208284031215610bef578081fd5b5051919050565b600060208284031215610c07578081fd5b815167ffffffffffffffff811115610c1d578182fd5b610c2984828501610b16565b949350505050565b600060208284031215610c42578081fd5b815167ffffffffffffffff80821115610c59578283fd5b9083019060c08286031215610c6c578283fd5b610c7660c0610ec6565b825173ffffffffffffffffffffffffffffffffffffffff81168114610c99578485fd5b8152602083015182811115610cac578485fd5b610cb887828601610b16565b602083015250610ccb8660408501610b00565b6040820152610cdd8660608501610b00565b6060820152610cef8660808501610b00565b608082015260a083015160a082015280935050505092915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b60208082526023908201527f43414e4e4f545f545249474745525f44454c4159535f4d4947524154494f4e5f60408201527f5945540000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f524f4f545f4e4f545f434c41494d45445f594554000000000000000000000000604082015260600190565b6020808252601e908201527f4d49475241544f525f43414e4e4f545f5345545f415554484f52495a45520000604082015260600190565b6020808252601e908201527f43414e4e4f545f545249474745525f524f4f545f4348414e47455f5945540000604082015260600190565b60208082526017908201527f44454c4159535f4e4f545f4d494752415445445f594554000000000000000000604082015260600190565b60405181810167ffffffffffffffff81118282101715610ee557600080fd5b60405291905056fea2646970667358221220b446cc8050b42b9666cd8bda65a6f5b9e6bdbd36e7cac1f72a77ba1fa5bf93e764736f6c634300070100336101e06040523480156200001257600080fd5b506040516200390e3803806200390e8339810160408190526200003591620003df565b6001600055620000458362000265565b816001600160a01b0316638d928af86040518163ffffffff1660e01b815260040160206040518083038186803b1580156200007f57600080fd5b505afa15801562000094573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000ba919062000426565b6001600160a01b0316610160816001600160a01b031660601b81525050816001600160a01b031663e758d36b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200011157600080fd5b505afa15801562000126573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200014c919062000426565b6001600160601b0319606091821b81166101a0529083901b16610180526040516200017790620003d1565b604051809103906000f08015801562000194573d6000803e3d6000fd5b5060601b6001600160601b031916610140526101c08190526000620001c06337c5e2cb60e11b620002af565b90506000620001d6634c07348160e01b620002af565b90506000620001e883600019620002e4565b90506000620001fa83600019620002e4565b90506200020b828860001962000319565b6200021a818860001962000319565b608084905260a08390526200023663fe0d94c160e01b620002af565b60c0526200024b6378422a9160e11b620002af565b60e052610100919091526101205250620004b19350505050565b600180546001600160a01b0319166001600160a01b0383169081179091556040517f39510b933a9d010f906528d6019d3f4e2450a10dc33b10887503b31ed82f111190600090a250565b604051600090620002c7903090849060200162000480565b604051602081830303815290604052805190602001209050919050565b60008282604051602001620002fb92919062000472565b60405160208183030381529060405280519060200120905092915050565b60006200032884848462000399565b60008181526004602052604090205490915060ff166200039357600081815260046020526040808220805460ff19166001179055516001600160a01b03808516929086169187917fef6ee312a0062a24a46be2eba5284183a87ff848110e8d4df979bd690d9e9f6891a45b50505050565b6000838383604051602001620003b2939291906200044c565b6040516020818303038152906040528051906020012090509392505050565b6104ef806200341f83390190565b600080600060608486031215620003f4578283fd5b8351620004018162000498565b6020850151909350620004148162000498565b80925050604084015190509250925092565b60006020828403121562000438578081fd5b8151620004458162000498565b9392505050565b9283526001600160601b0319606092831b81166020850152911b16603482015260480190565b918252602082015260400190565b9182526001600160e01b031916602082015260240190565b6001600160a01b0381168114620004ae57600080fd5b50565b60805160a05160c05160e05161010051610120516101405160601c6101605160601c6101805160601c6101a05160601c6101c051612e916200058e6000398061145b52508061132d5250806113555250806112f152806117ed5250806107ff5280610946528061102252806113ce52806117845280611a9f52806121895250806106f1528061074b5250806106c4528061071e52508061066f52806115835250806109b352806115575250806110d05280611614528061163d52806119295250806107915280611160528061143252806115af5250612e916000f3fe608060405234801561001057600080fd5b50600436106103155760003560e01c80637e1c556d116101a7578063d00bef4d116100ee578063e8104ea011610097578063f1521d7611610071578063f1521d761461060e578063fc78a22814610621578063fe0d94c11461062957610315565b8063e8104ea0146105d5578063f0845522146105e8578063f0bb9406146105fb57610315565b8063df6b0d01116100c8578063df6b0d01146105a7578063e2b4146b146105ba578063e5e6e8ae146105cd57610315565b8063d00bef4d14610579578063d754bad914610581578063d7ad1dcf1461059457610315565b80639be2a88411610150578063c284b6b91161012a578063c284b6b91461054b578063cc63604a14610553578063cf8475da1461056657610315565b80639be2a8841461051d5780639f81aed714610530578063b3eb281d1461053857610315565b8063863bac6b11610181578063863bac6b146104ef57806386ff254b146105025780638d928af81461051557610315565b80637e1c556d146104c157806382938ca8146104c9578063851c1bb3146104dc57610315565b80634125ff901161026b57806362cde1ba116102145780636f8bc596116101ee5780636f8bc59614610488578063715716a21461049b57806378a08377146104ae57610315565b806362cde1ba146104585780636badd2ab146104605780636c1032af1461048057610315565b806355ed08a11161024557806355ed08a11461041d5780635b78b780146104305780635ca1e1651461044357610315565b80634125ff90146103ef5780634c073481146103f7578063557a64031461040a57610315565b80631b3c85eb116102cd5780632e3ed05b116102a75780632e3ed05b146103b65780633bf46797146103c957806340e58ee5146103dc57610315565b80631b3c85eb146103885780632362716d1461039b5780632debdd2e146103ae57610315565b806314ea35e7116102fe57806314ea35e714610358578063151b89d114610362578063169f14681461037557610315565b80630df322a61461031a57806310697a3a14610343575b600080fd5b61032d6103283660046124b0565b610649565b60405161033a9190612ac0565b60405180910390f35b61034b61066d565b60405161033a9190612acb565b610360610691565b005b61034b610370366004612678565b61078a565b61034b610383366004612518565b6107bc565b6103606103963660046124b0565b61092b565b61034b6103a93660046126a8565b61097b565b61034b6109b1565b61034b6103c43660046124cb565b6109d5565b61034b6103d7366004612678565b610aa9565b6103606103ea366004612678565b610abb565b61034b610d11565b6103606104053660046125c6565b610d19565b61032d6104183660046124b0565b610da4565b61034b61042b3660046127a1565b610dc5565b61034b61043e3660046126e5565b610df8565b61044b610ed7565b60405161033a9190612958565b61044b610ef3565b61047361046e366004612678565b610ef9565b60405161033a9190612d29565b61044b611020565b6103606104963660046125c6565b611044565b61032d6104a93660046126a8565b6110c9565b6103606104bc36600461274d565b6110f7565b61034b61115e565b6103606104d7366004612621565b611182565b61034b6104ea366004612806565b6111cb565b61034b6104fd3660046126e5565b6111fe565b61032d6105103660046126a8565b6112c2565b61044b6112ef565b61032d61052b3660046126a8565b611313565b61034b611424565b61032d6105463660046126a8565b61142b565b61034b611459565b61032d610561366004612678565b61147d565b61036061057436600461274d565b6114f6565b61044b611534565b61034b61058f366004612678565b611550565b61034b6105a2366004612678565b61157c565b61032d6105b53660046126a8565b6115a8565b61032d6105c83660046126a8565b6115d6565b61034b611612565b61034b6105e3366004612678565b611636565b61034b6105f63660046127c2565b611662565b6103606106093660046127a1565b611769565b61032d61061c3660046126a8565b611922565b61034b610ef3565b61063c610637366004612678565b611950565b60405161033a9190612b01565b60025473ffffffffffffffffffffffffffffffffffffffff8281169116145b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015460025473ffffffffffffffffffffffffffffffffffffffff91821691166106bf338214610191611b67565b6106ec7f000000000000000000000000000000000000000000000000000000000000000082600019611b75565b6107197f000000000000000000000000000000000000000000000000000000000000000082600019611b75565b6107467f000000000000000000000000000000000000000000000000000000000000000083600019611bfe565b6107737f000000000000000000000000000000000000000000000000000000000000000083600019611bfe565b61077c81611c85565b6107866000611cf4565b5050565b60006107b67f000000000000000000000000000000000000000000000000000000000000000083610dc5565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff84163014156107fd5760405162461bcd60e51b81526004016107f490612b14565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156108695760405162461bcd60e51b81526004016107f490612b71565b60008473ffffffffffffffffffffffffffffffffffffffff1663851c1bb361089086611d63565b6040518263ffffffff1660e01b81526004016108ac9190612ad4565b60206040518083038186803b1580156108c457600080fd5b505afa1580156108d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fc9190612690565b905061091461090c8233886115d6565b610191611b67565b61092081868686611e6f565b9150505b9392505050565b61096f3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610191611b67565b61097881611cf4565b50565b6000838383604051602001610992939291906128dc565b6040516020818303038152906040528051906020012090509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006109e361090c33610da4565b6000610a0e7f1b3c85eb000000000000000000000000000000000000000000000000000000006111cb565b90506060631b3c85eb60e01b85604051602401610a2b9190612958565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050610aa0823083610a9a611459565b88611eb2565b95945050505050565b60009081526005602052604090205490565b6003548110610adc5760405162461bcd60e51b81526004016107f490612cbb565b600060038281548110610aeb57fe5b60009182526020909120600490910201600281015490915060ff1615610b235760405162461bcd60e51b81526004016107f490612cf2565b6002810154610100900460ff1615610b4d5760405162461bcd60e51b81526004016107f490612c84565b805460018083018054604080516020600261010096851615969096026000190190931694909404601f810183900483028501830190915280845273ffffffffffffffffffffffffffffffffffffffff90941693600093859363851c1bb393610c0b9390830182828015610c015780601f10610bd657610100808354040283529160200191610c01565b820191906000526020600020905b815481529060010190602001808311610be457829003601f168201915b5050505050611d63565b6040518263ffffffff1660e01b8152600401610c279190612ad4565b60206040518083038186803b158015610c3f57600080fd5b505afa158015610c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c779190612690565b8354909150610cb290610ca3908390339073ffffffffffffffffffffffffffffffffffffffff166115d6565b8061090c575061090c33610da4565b6002830180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560405184907f2a6bef66de603fc0ec07223576486bd905cd9bb6e05364286d9a5cd1be046ae690600090a250505050565b6303c2670081565b610d25835182516120a6565b60005b8351811015610d9e57610d6561090c858381518110610d4357fe5b602002602001015133858581518110610d5857fe5b60200260200101516110c9565b610d96848281518110610d7457fe5b602002602001015184848481518110610d8957fe5b6020026020010151611bfe565b600101610d28565b50505050565b60015473ffffffffffffffffffffffffffffffffffffffff90811691161490565b60008282604051602001610dda92919061291a565b60405160208183030381529060405280519060200120905092915050565b6000610e0861090c863386611922565b60607f4c07348100000000000000000000000000000000000000000000000000000000610e34876120b3565b86610e3e876120f4565b604051602401610e5093929190612a21565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506000610ebc87611636565b9050610eca81308487611e6f565b925050505b949350505050565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b60001981565b610f016122ef565b60038281548110610f0e57fe5b60009182526020918290206040805160c0810182526004909302909101805473ffffffffffffffffffffffffffffffffffffffff168352600180820180548451601f60026000199584161561010002959095019092169390930490810187900487028301870190945283825293949193858301939192909190830182828015610fd85780601f10610fad57610100808354040283529160200191610fd8565b820191906000526020600020905b815481529060010190602001808311610fbb57829003601f168201915b5050509183525050600282015460ff80821615156020840152610100820481161515604084015262010000909104161515606082015260039091015460809091015292915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b611050835182516120a6565b60005b8351811015610d9e5761109061090c85838151811061106e57fe5b60200260200101513385858151811061108357fe5b60200260200101516115a8565b6110c184828151811061109f57fe5b6020026020010151848484815181106110b457fe5b6020026020010151611b75565b600101611053565b6000610ecf7f0000000000000000000000000000000000000000000000000000000000000000848487612163565b600061110233610da4565b8061111c57508115801561111c575061111c85338561142b565b905061112a81610191611b67565b60006111358661078a565b90506111568186868661114a57611bfe61114e565b611b755b63ffffffff16565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61118e825182516120a6565b60005b82518110156111c6576111be8382815181106111a957fe5b602002602001015133848481518110610d8957fe5b600101611191565b505050565b6040516000906111e19030908490602001612928565b604051602081830303815290604052805190602001209050919050565b600061120e61090c86338661142b565b60607f6f8bc5960000000000000000000000000000000000000000000000000000000061123a876120b3565b86611244876120f4565b60405160240161125693929190612a21565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506000610ebc8761078a565b6000600460006112d386868661097b565b815260208101919091526040016000205460ff16949350505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60003373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614156113a9577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16149050610924565b6000848152600560205260409020546113cc576113c78484846115d6565b610ecf565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161490509392505050565b6206978081565b6000610ecf7f0000000000000000000000000000000000000000000000000000000000000000848487612213565b7f000000000000000000000000000000000000000000000000000000000000000090565b60035460009082106114a15760405162461bcd60e51b81526004016107f490612cbb565b6000600383815481106114b057fe5b60009182526020909120600490910201600281015490915060ff161580156114e257506002810154610100900460ff16155b801561092457506003015442101592915050565b600061150133610da4565b8061151b57508115801561151b575061151b853385611922565b905061152981610191611b67565b600061113586611636565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b60006107b67f000000000000000000000000000000000000000000000000000000000000000083610dc5565b60006107b67f000000000000000000000000000000000000000000000000000000000000000083610dc5565b6000610ecf7f0000000000000000000000000000000000000000000000000000000000000000848487612163565b6000600460006115e786868661097b565b815260208101919091526040016000205460ff1680610ecf5750600460006112d3868660001961097b565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006107b67f000000000000000000000000000000000000000000000000000000000000000083610dc5565b60006303c267008311156116885760405162461bcd60e51b81526004016107f490612c16565b61169461090c33610da4565b600084815260056020526040812054908185106116b457620697806116c3565b6116c38583036206978061224e565b905060006116d08761157c565b9050606063f0bb940660e01b88886040516024016116ef92919061291a565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061175d823083868a611eb2565b98975050505050505050565b6117ad3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610191611b67565b6040517f851c1bb300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063851c1bb390611842907f058a628f0000000000000000000000000000000000000000000000000000000090600401612ad4565b60206040518083038186803b15801561185a57600080fd5b505afa15801561186e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118929190612690565b90506000818414806118b257506000828152600560205260409020548311155b9050806118d15760405162461bcd60e51b81526004016107f490612ba8565b600084815260056020526040908190208490555184907f0e182617f9e5f9ce5f761c791ec15ad52176d97f9706b5c2707ffda7b6bdf79090611914908690612acb565b60405180910390a250505050565b6000610ecf7f0000000000000000000000000000000000000000000000000000000000000000848487612213565b606061195a61225a565b600354821061197b5760405162461bcd60e51b81526004016107f490612cbb565b60006003838154811061198a57fe5b60009182526020909120600490910201600281015490915060ff16156119c25760405162461bcd60e51b81526004016107f490612cf2565b6002810154610100900460ff16156119ec5760405162461bcd60e51b81526004016107f490612c84565b8060030154421015611a105760405162461bcd60e51b81526004016107f490612bdf565b600281015462010000900460ff1615611a4e576000611a2e84611550565b90506000611a3d8233306115d6565b9050611a4b81610191611b67565b50505b60028101805460ff1916600190811790915581546040517f1cff79cd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811693631cff79cd93611ada9392169190860190600401612979565b600060405180830381600087803b158015611af457600080fd5b505af1158015611b08573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b309190810190612846565b60405190925083907f4fa5548c15e2d4a0b806eee962935acea143d79644d2340af39f4edf13b335a990600090a250610668612273565b81610786576107868161227a565b6000611b8284848461097b565b60008181526004602052604090205490915060ff16610d9e57600081815260046020526040808220805460ff191660011790555173ffffffffffffffffffffffffffffffffffffffff808516929086169187917fef6ee312a0062a24a46be2eba5284183a87ff848110e8d4df979bd690d9e9f6891a450505050565b6000611c0b84848461097b565b60008181526004602052604090205490915060ff1615610d9e57600081815260046020526040808220805460ff191690555173ffffffffffffffffffffffffffffffffffffffff808516929086169187917f7b42e026d3b17cf41399915c285780d0f724b3464b269297aff73c0de0fe417f91a450505050565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f39510b933a9d010f906528d6019d3f4e2450a10dc33b10887503b31ed82f111190600090a250565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f566fe119ff450afc2580186c62762b6c1258245c8b1b6bb095e7276eb5a75b5590600090a250565b6000600482511015611d7757506000610668565b601882600381518110611d8657fe5b016020015183517fff0000000000000000000000000000000000000000000000000000000000000090911690911c9060109084906002908110611dc557fe5b016020015184517fff0000000000000000000000000000000000000000000000000000000000000090911690911c9060089085906001908110611e0457fe5b016020015185517fff0000000000000000000000000000000000000000000000000000000000000090911690911c908590600090611e3e57fe5b01602001517fff00000000000000000000000000000000000000000000000000000000000000161717179050919050565b60008481526005602052604081205480611e9b5760405162461bcd60e51b81526004016107f490612c4d565b611ea88686868487611eb2565b9695505050505050565b600354604051819087907f26ce5ffb7ab1ce72d9ca4a3e4f906d2b99194d6c53dd9832fd7a59d0b2fc6bed90600090a381516040805160c08101825273ffffffffffffffffffffffffffffffffffffffff888116825260208083018981526000948401859052606084018590529415156080840181905242890160a0850181905260038054600181018255965284517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b600490970296870180547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909516178455955180519195611fcc937fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c90910192910190612325565b50604082015160028201805460608501516080860151151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff95151560ff199094169390931794909416919091171691909117905560a090910151600390910155600061206584611550565b905060005b8551811015612099576120918287838151811061208357fe5b602002602001015130611b75565b60010161206a565b5050505095945050505050565b6107868183146067611b67565b6040805160018082528183019092526060916020808301908036833701905050905081816000815181106120e357fe5b602002602001018181525050919050565b60408051600180825281830190925260609160208083019080368337019050509050818160008151811061212457fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050919050565b6000806121708684610dc5565b600081815260056020526040902054909150156121de577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614915050610ecf565b6121e98186866115d6565b156121f8576001915050610ecf565b600061220687600019610dc5565b9050610eca818787611313565b6000806122208684610dc5565b9050600061223087600019610dc5565b905061223d8287876115d6565b80610eca5750610eca8187876115d6565b80820390821002900390565b61226c60026000541415610190611b67565b6002600055565b6001600055565b62461bcd60e51b600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b604452610978917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b6040805160c08101825260008082526060602083018190529282018190529181018290526080810182905260a081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061236657805160ff1916838001178555612393565b82800160010185558215612393579182015b82811115612393578251825591602001919060010190612378565b5061239f9291506123a3565b5090565b5b8082111561239f57600081556001016123a4565b803573ffffffffffffffffffffffffffffffffffffffff811681146107b657600080fd5b600082601f8301126123ec578081fd5b81356123ff6123fa82612dc6565b612d9f565b81815291506020808301908481018184028601820187101561242057600080fd5b60005b848110156124475761243588836123b8565b84529282019290820190600101612423565b505050505092915050565b600082601f830112612462578081fd5b81356124706123fa82612dc6565b81815291506020808301908481018184028601820187101561249157600080fd5b60005b8481101561244757813584529282019290820190600101612494565b6000602082840312156124c1578081fd5b61092483836123b8565b600080604083850312156124dd578081fd5b6124e784846123b8565b9150602083013567ffffffffffffffff811115612502578182fd5b61250e858286016123dc565b9150509250929050565b60008060006060848603121561252c578081fd5b61253685856123b8565b9250602084013567ffffffffffffffff80821115612552578283fd5b818601915086601f830112612565578283fd5b81356125736123fa82612de6565b818152886020838601011115612587578485fd5b81602085016020830137908101602001849052935060408601359150808211156125af578283fd5b506125bc868287016123dc565b9150509250925092565b6000806000606084860312156125da578283fd5b833567ffffffffffffffff808211156125f1578485fd5b6125fd87838801612452565b945061260c87602088016123b8565b935060408601359150808211156125af578283fd5b60008060408385031215612633578182fd5b823567ffffffffffffffff8082111561264a578384fd5b61265686838701612452565b9350602085013591508082111561266b578283fd5b5061250e858286016123dc565b600060208284031215612689578081fd5b5035919050565b6000602082840312156126a1578081fd5b5051919050565b6000806000606084860312156126bc578283fd5b833592506126cd85602086016123b8565b91506126dc85604086016123b8565b90509250925092565b600080600080608085870312156126fa578081fd5b8435935061270b86602087016123b8565b925061271a86604087016123b8565b9150606085013567ffffffffffffffff811115612735578182fd5b612741878288016123dc565b91505092959194509250565b60008060008060808587031215612762578384fd5b8435935061277386602087016123b8565b925061278286604087016123b8565b915060608501358015158114612796578182fd5b939692955090935050565b600080604083850312156127b3578182fd5b50508035926020909101359150565b6000806000606084860312156127d6578081fd5b8335925060208401359150604084013567ffffffffffffffff8111156127fa578182fd5b6125bc868287016123dc565b600060208284031215612817578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610924578182fd5b600060208284031215612857578081fd5b815167ffffffffffffffff81111561286d578182fd5b8201601f8101841361287d578182fd5b805161288b6123fa82612de6565b81815285602083850101111561289f578384fd5b610aa0826020830160208601612e2f565b600081518084526128c8816020860160208601612e2f565b601f01601f19169290920160200192915050565b9283527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b81166020850152911b16603482015260480190565b918252602082015260400190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60006040820173ffffffffffffffffffffffffffffffffffffffff8516835260206040818501528285546001808216600081146129bd57600181146129db57612a13565b607f6002840416865260ff1983166060890152608088019350612a13565b600283048087526129eb8a612e0a565b885b82811015612a095781548b8201606001529084019087016129ed565b8a01606001955050505b509198975050505050505050565b606080825284519082018190526000906020906080840190828801845b82811015612a5a57815184529284019290840190600101612a3e565b50505073ffffffffffffffffffffffffffffffffffffffff8616848301528381036040850152845180825285830191830190845b81811015612ab257612aa08451612e16565b83529284019291840191600101612a8e565b509098975050505050505050565b901515815260200190565b90815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b60006020825261092460208301846128b0565b60208082526022908201527f43414e4e4f545f5343484544554c455f415554484f52495a45525f414354494f60408201527f4e53000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f415454454d5054494e475f4558454355544f525f5245454e5452414e43590000604082015260600190565b6020808252601c908201527f44454c41595f455843454544535f5345545f415554484f52495a455200000000604082015260600190565b60208082526015908201527f414354494f4e5f4e4f545f45584543555441424c450000000000000000000000604082015260600190565b6020808252600f908201527f44454c41595f544f4f5f4c415247450000000000000000000000000000000000604082015260600190565b60208082526016908201527f43414e4e4f545f5343484544554c455f414354494f4e00000000000000000000604082015260600190565b60208082526018908201527f414354494f4e5f414c52454144595f43414e43454c4c45440000000000000000604082015260600190565b60208082526015908201527f414354494f4e5f444f45535f4e4f545f45584953540000000000000000000000604082015260600190565b60208082526017908201527f414354494f4e5f414c52454144595f4558454355544544000000000000000000604082015260600190565b60006020825273ffffffffffffffffffffffffffffffffffffffff8351166020830152602083015160c06040840152612d6560e08401826128b0565b90506040840151151560608401526060840151151560808401526080840151151560a084015260a084015160c08401528091505092915050565b60405181810167ffffffffffffffff81118282101715612dbe57600080fd5b604052919050565b600067ffffffffffffffff821115612ddc578081fd5b5060209081020190565b600067ffffffffffffffff821115612dfc578081fd5b50601f01601f191660200190565b60009081526020902090565b73ffffffffffffffffffffffffffffffffffffffff1690565b60005b83811015612e4a578181015183820152602001612e32565b83811115610d9e575050600091015256fea26469706673582212208733c30c130550b060faaef187150faeaeec2b84638906a342649c6d8f3865f964736f6c6343000701003360a060405234801561001057600080fd5b5060016000553360601b60805260805160601c6104b061003f600039806101c6528061026e52506104b06000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80631cff79cd1461003b578063d09edf3114610173575b600080fd5b6100fe6004803603604081101561005157600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516919081019060408101602082013564010000000081111561008957600080fd5b82018360208201111561009b57600080fd5b803590602001918460018302840111640100000000831117156100bd57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506101a4945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610138578181015183820152602001610120565b50505050905090810190601f1680156101655780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61017b61026c565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b60606101ae610290565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461025257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552525f53454e4445525f4e4f545f415554484f52495a455200000000000000604482015290519081900360640190fd5b61025c83836102a9565b9050610266610393565b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6102a26002600054141561019061039a565b6002600055565b6060600060608473ffffffffffffffffffffffffffffffffffffffff16846040518082805190602001908083835b6020831061031457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016102d7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610376576040519150601f19603f3d011682016040523d82523d6000602084013e61037b565b606091505b509150915061038a82826103ac565b95945050505050565b6001600055565b816103a8576103a8816103d2565b5050565b606082156103bb575080610266565b8151156103cb5781518083602001fd5b6102666101ae5b6103fc817f42414c00000000000000000000000000000000000000000000000000000000006103ff565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fdfea26469706673582212202cab8bc2362052d26d734d8e96bf55d57652f71d5c18bad7251afeae8157d17b64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c8063a217fddf11610081578063ebf0c7171161005b578063ebf0c71714610146578063fbfa77cf1461014e578063fc78a22814610156576100d4565b8063a217fddf1461012e578063b78b608714610136578063c6bfe9ae1461013e576100d4565b80637217d9d1116100b25780637217d9d11461010957806398f85d5c1461011e578063a0c286d814610126576100d4565b806311f13145146100d95780633c44172d146100e357806362cde1ba146100eb575b600080fd5b6100e161015e565b005b6100e1610476565b6100f361066b565b6040516101009190610d0a565b60405180910390f35b61011161068f565b6040516101009190610d2b565b610111610696565b6100f361069c565b6101116106c0565b6100e16106c5565b6100f3610a94565b6100f3610ab8565b6100f3610adc565b61011161066b565b600054158061025257506040517f6badd2ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636badd2ab906101db90600090600401610d2b565b60006040518083038186803b1580156101f357600080fd5b505afa158015610207573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261024d9190810190610c31565b604001515b610291576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028890610e8f565b60405180910390fd5b6000546040517fcc63604a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163cc63604a916103059190600401610d2b565b60206040518083038186803b15801561031d57600080fd5b505afa158015610331573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103559190610bbc565b61038b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028890610e58565b6000546040517ffe0d94c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163fe0d94c1916103ff9190600401610d2b565b600060405180830381600087803b15801561041957600080fd5b505af115801561042d573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526104739190810190610bf6565b50565b6040517fcc63604a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063cc63604a906104e990600090600401610d2b565b60206040518083038186803b15801561050157600080fd5b505afa158015610515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105399190610bbc565b61056f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028890610d8d565b60005b600054811015610473576040517ffe0d94c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063fe0d94c1906105ee908490600401610d2b565b600060405180830381600087803b15801561060857600080fd5b505af115801561061c573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526106629190810190610bf6565b50600101610572565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b6224ea0081565b60005481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081565b6040517f557a640300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063557a640390610757907f000000000000000000000000000000000000000000000000000000000000000090600401610d0a565b60206040518083038186803b15801561076f57600080fd5b505afa158015610783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a79190610bbc565b6107dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028890610dea565b6040517f851c1bb300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063851c1bb390610872907f058a628f0000000000000000000000000000000000000000000000000000000090600401610d60565b60206040518083038186803b15801561088a57600080fd5b505afa15801561089e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c29190610bde565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639be2a88483307f00000000000000000000000000000000000000000000000000000000000000006040518463ffffffff1660e01b815260040161094393929190610d34565b60206040518083038186803b15801561095b57600080fd5b505afa15801561096f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109939190610bbc565b9050806109cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028890610e21565b6040517f058a628f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063058a628f90610a5e907f000000000000000000000000000000000000000000000000000000000000000090600401610d0a565b600060405180830381600087803b158015610a7857600080fd5b505af1158015610a8c573d6000803e3d6000fd5b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b80518015158114610b1057600080fd5b92915050565b600082601f830112610b26578081fd5b815167ffffffffffffffff811115610b3c578182fd5b6020610b6e817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601610ec6565b92508183528481838601011115610b8457600080fd5b60005b82811015610ba2578481018201518482018301528101610b87565b82811115610bb35760008284860101525b50505092915050565b600060208284031215610bcd578081fd5b610bd78383610b00565b9392505050565b600060208284031215610bef578081fd5b5051919050565b600060208284031215610c07578081fd5b815167ffffffffffffffff811115610c1d578182fd5b610c2984828501610b16565b949350505050565b600060208284031215610c42578081fd5b815167ffffffffffffffff80821115610c59578283fd5b9083019060c08286031215610c6c578283fd5b610c7660c0610ec6565b825173ffffffffffffffffffffffffffffffffffffffff81168114610c99578485fd5b8152602083015182811115610cac578485fd5b610cb887828601610b16565b602083015250610ccb8660408501610b00565b6040820152610cdd8660608501610b00565b6060820152610cef8660808501610b00565b608082015260a083015160a082015280935050505092915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b60208082526023908201527f43414e4e4f545f545249474745525f44454c4159535f4d4947524154494f4e5f60408201527f5945540000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f524f4f545f4e4f545f434c41494d45445f594554000000000000000000000000604082015260600190565b6020808252601e908201527f4d49475241544f525f43414e4e4f545f5345545f415554484f52495a45520000604082015260600190565b6020808252601e908201527f43414e4e4f545f545249474745525f524f4f545f4348414e47455f5945540000604082015260600190565b60208082526017908201527f44454c4159535f4e4f545f4d494752415445445f594554000000000000000000604082015260600190565b60405181810167ffffffffffffffff81118282101715610ee557600080fd5b60405291905056fea2646970667358221220b446cc8050b42b9666cd8bda65a6f5b9e6bdbd36e7cac1f72a77ba1fa5bf93e764736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/index.ts b/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/index.ts new file mode 100644 index 0000000..86c86d3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/index.ts @@ -0,0 +1,27 @@ +import { Task, TaskRunOptions } from '@src'; +import { TimelockAuthorizerDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as TimelockAuthorizerDeployment; + + const args = [ + input.Root, + input.Authorizer, + input.AuthorizerAdaptorEntrypoint, + input.Roles, + input.Granters, + input.Revokers, + input.ExecuteDelays, + input.GrantDelays, + ]; + const migrator = await task.deployAndVerify('TimelockAuthorizerMigrator', args, from, force); + + const authorizer = await task.instanceAt('TimelockAuthorizer', await migrator.newAuthorizer()); + const authorizerArgs = [migrator.address, input.AuthorizerAdaptorEntrypoint, await migrator.CHANGE_ROOT_DELAY()]; + + await task.verify('TimelockAuthorizer', authorizer.address, authorizerArgs); + await task.save({ TimelockAuthorizer: authorizer }); + + const executor = await task.instanceAt('TimelockExecutor', await authorizer.getExecutor()); + await task.verify('TimelockExecutor', executor.address, []); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/input.ts b/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/input.ts new file mode 100644 index 0000000..ef1074b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/input.ts @@ -0,0 +1,45 @@ +import { Task, TaskMode } from '@src'; +import { DelayData, RoleData } from './input/types'; +import { + root as mainnetRoot, + roles as mainnetRoles, + granters as mainnetGranters, + revokers as mainnetRevokers, + executeDelays as mainnetExecuteDelays, + grantDelays as mainnetGrantDelays, +} from './input/mainnet'; + +export type TimelockAuthorizerDeployment = { + Authorizer: string; + AuthorizerAdaptorEntrypoint: string; + Root: string; + Roles: RoleData[]; + Granters: RoleData[]; + Revokers: RoleData[]; + ExecuteDelays: DelayData[]; + GrantDelays: DelayData[]; +}; + +const Authorizer = new Task('20210418-authorizer', TaskMode.READ_ONLY); +const AuthorizerAdaptorEntrypoint = new Task('20221124-authorizer-adaptor-entrypoint', TaskMode.READ_ONLY); + +export default { + Authorizer, + AuthorizerAdaptorEntrypoint, + mainnet: { + Root: mainnetRoot, + Roles: mainnetRoles, + Granters: mainnetGranters, + Revokers: mainnetRevokers, + ExecuteDelays: mainnetExecuteDelays, + GrantDelays: mainnetGrantDelays, + }, + goerli: { + Root: '0x171C0fF5943CE5f133130436A29bF61E26516003', + Roles: [], + Granters: [], + Revokers: [], + ExecuteDelays: [], + GrantDelays: [], + }, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/input/mainnet.ts b/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/input/mainnet.ts new file mode 100644 index 0000000..82eeede --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/input/mainnet.ts @@ -0,0 +1,279 @@ +import { DAY } from '@helpers/time'; +import { Task, TaskMode } from '@src'; +import { flatten } from 'lodash'; +import { DelayData, RoleData } from './types'; +import { ANY_ADDRESS } from '@helpers/constants'; + +const EVERYWHERE = ANY_ADDRESS; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY, 'mainnet'); +const ProtocolFeesCollector = new Task('20210418-vault', TaskMode.READ_ONLY, 'mainnet'); +const ProtocolFeesWithdrawer = new Task('20220517-protocol-fee-withdrawer', TaskMode.READ_ONLY, 'mainnet'); +const ProtocolFeePercentagesProvider = new Task( + '20220725-protocol-fee-percentages-provider', + TaskMode.READ_ONLY, + 'mainnet' +); + +const BalancerTokenAdmin = new Task('20220325-balancer-token-admin', TaskMode.READ_ONLY, 'mainnet'); +const BalancerMinter = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, 'mainnet'); +const GaugeAdder = new Task('20220628-gauge-adder-v2', TaskMode.READ_ONLY, 'mainnet'); +const GaugeController = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, 'mainnet'); +const VotingEscrowDelegationProxy = new Task('20220325-ve-delegation', TaskMode.READ_ONLY, 'mainnet'); +const SmartWalletChecker = new Task('20220420-smart-wallet-checker', TaskMode.READ_ONLY, 'mainnet'); +const LiquidityGaugeV5 = new Task('20220325-mainnet-gauge-factory', TaskMode.READ_ONLY, 'mainnet'); +const ArbitrumRootGaugeFactory = new Task('20220413-arbitrum-root-gauge-factory', TaskMode.READ_ONLY, 'mainnet'); +const OptimismRootGaugeFactory = new Task('20220628-optimism-root-gauge-factory', TaskMode.READ_ONLY, 'mainnet'); + +const BalancerRelayer = new Task('20211203-batch-relayer', TaskMode.READ_ONLY, 'mainnet'); +// BalancerRelayerV2 is not used on mainnet +const BalancerRelayerV3 = new Task('20220720-batch-relayer-v3', TaskMode.READ_ONLY, 'mainnet'); +const BalancerRelayerV4 = new Task('20220916-batch-relayer-v4', TaskMode.READ_ONLY, 'mainnet'); +const LidoRelayer = new Task('20210812-lido-relayer', TaskMode.READ_ONLY, 'mainnet'); +// https://forum.balancer.fi/t/proposal-balancer-v2-authorize-gnosis-protocol-v2-contracts-as-a-vault-relayer/1938 +// https://etherscan.io/address/0xc92e8bdf79f0507f65a392b0ab4667716bfe0110#code +const GnosisProtocolRelayer = '0xc92e8bdf79f0507f65a392b0ab4667716bfe0110'; + +const SingleRecipientGauge = new Task('20220325-single-recipient-gauge-factory', TaskMode.READ_ONLY, 'mainnet'); + +const StablePool = new Task('20210624-stable-pool', TaskMode.READ_ONLY, 'mainnet'); +const StablePoolV2 = new Task('20220609-stable-pool-v2', TaskMode.READ_ONLY, 'mainnet'); +const MetaStablePool = new Task('20210727-meta-stable-pool', TaskMode.READ_ONLY, 'mainnet'); +const StablePhantomPool = new Task('20211208-stable-phantom-pool', TaskMode.READ_ONLY, 'mainnet'); +const ComposableStablePool = new Task('20220906-composable-stable-pool', TaskMode.READ_ONLY, 'mainnet'); +const WeightedPool = new Task('20210418-weighted-pool', TaskMode.READ_ONLY, 'mainnet'); +const WeightedPoolV2 = new Task('20220908-weighted-pool-v2', TaskMode.READ_ONLY, 'mainnet'); +const AaveLinearPool = new Task('20211208-aave-linear-pool', TaskMode.READ_ONLY, 'mainnet'); + +const createRoleData = (grantee: string, target: string, actionIds: string[]): RoleData[] => + actionIds.map((actionId) => ({ role: actionId, grantee, target })); + +const DAO_MULTISIG = '0x10a19e7ee7d7f8a52822f6817de8ea18204f2e4f'; +const BALLERS_MULTISIG = '0x75a52c0e32397a3fc0c052e2ceb3479802713cf4'; +const BALLERS_MULTISIG_GAUTLET = '0xf4a80929163c5179ca042e1b292f5efbbe3d89e6'; +const LM_MULTISIG = '0xc38c5f97b34e175ffd35407fc91a937300e33860'; +const TREASURY_MULTISIG = '0x7c68c42de679ffb0f16216154c996c354cf1161b'; +const EMERGENCY_SUBDAO_MULTISIG = '0xa29f61256e948f3fb707b4b3b138c5ccb9ef9888'; +const BLABS_OPS_MULTISIG = '0x02f35dA6A02017154367Bc4d47bb6c7D06C7533B'; +const BLABS_VEBAL_MULTISIG = '0xd2eb7bd802a7ca68d9acd209bec4e664a9abdd7b'; +const GAUNTLET_FEE_SETTER = '0xe4a8ed6c1d8d048bd29a00946bfcf2db10e7923b'; + +export const root = DAO_MULTISIG; + +const batchRelayerPermissions = [ + BalancerRelayer.output().BalancerRelayer, + BalancerRelayerV3.output().BalancerRelayer, + BalancerRelayerV4.output().BalancerRelayer, +].flatMap((relayer) => + createRoleData(relayer, Vault.output().Vault, [ + Vault.actionId('Vault', 'setRelayerApproval(address,address,bool)'), + Vault.actionId( + 'Vault', + 'batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)' + ), + Vault.actionId('Vault', 'joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))'), + Vault.actionId( + 'Vault', + 'swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)' + ), + Vault.actionId('Vault', 'exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))'), + Vault.actionId('Vault', 'manageUserBalance((uint8,address,uint256,address,address)[])'), + ]) +); + +const lidoRelayerPermissions = createRoleData(LidoRelayer.output().LidoRelayer, Vault.output().Vault, [ + Vault.actionId( + 'Vault', + 'batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)' + ), + Vault.actionId('Vault', 'joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))'), + Vault.actionId( + 'Vault', + 'swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)' + ), + Vault.actionId('Vault', 'exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))'), + Vault.actionId('Vault', 'manageUserBalance((uint8,address,uint256,address,address)[])'), +]); + +const gnosisProtocolRelayerPermissions = createRoleData(GnosisProtocolRelayer, Vault.output().Vault, [ + Vault.actionId( + 'Vault', + 'batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)' + ), + Vault.actionId('Vault', 'manageUserBalance((uint8,address,uint256,address,address)[])'), +]); + +const protocolFeesPermissions: RoleData[] = flatten([ + createRoleData( + ProtocolFeesWithdrawer.output().ProtocolFeesWithdrawer, + ProtocolFeesCollector.output().ProtocolFeesCollector, + [Vault.actionId('ProtocolFeesCollector', 'withdrawCollectedFees(address[],uint256[],address)')] + ), + createRoleData(TREASURY_MULTISIG, ProtocolFeesWithdrawer.output().ProtocolFeesWithdrawer, [ + ProtocolFeesWithdrawer.actionId('ProtocolFeesWithdrawer', 'withdrawCollectedFees(address[],uint256[],address)'), + ]), + createRoleData(EMERGENCY_SUBDAO_MULTISIG, ProtocolFeesWithdrawer.output().ProtocolFeesWithdrawer, [ + ProtocolFeesWithdrawer.actionId('ProtocolFeesWithdrawer', 'denylistToken(address)'), + ]), +]); + +const veBALPermissions: RoleData[] = flatten([ + createRoleData(BalancerMinter.output().BalancerMinter, BalancerTokenAdmin.output().BalancerTokenAdmin, [ + BalancerTokenAdmin.actionId('BalancerTokenAdmin', 'mint(address,uint256)'), + ]), + createRoleData(GaugeAdder.output().GaugeAdder, GaugeController.output().GaugeController, [ + GaugeController.actionId('GaugeController', 'add_gauge(address,int128)'), + ]), + createRoleData(LM_MULTISIG, GaugeAdder.output().GaugeAdder, [ + GaugeAdder.actionId('GaugeAdder', 'addEthereumGauge(address)'), + GaugeAdder.actionId('GaugeAdder', 'addPolygonGauge(address)'), + GaugeAdder.actionId('GaugeAdder', 'addArbitrumGauge(address)'), + GaugeAdder.actionId('GaugeAdder', 'addOptimismGauge(address)'), + ]), + createRoleData(DAO_MULTISIG, EVERYWHERE, [LiquidityGaugeV5.actionId('LiquidityGaugeV5', 'killGauge()')]), + createRoleData(DAO_MULTISIG, SmartWalletChecker.output().SmartWalletChecker, [ + SmartWalletChecker.actionId('SmartWalletChecker', 'denylistAddress(address)'), + SmartWalletChecker.actionId('SmartWalletChecker', 'allowlistAddress(address)'), + ]), + createRoleData(BLABS_OPS_MULTISIG, EVERYWHERE, [ + // This permission grants powers to call `checkpoint()` on all of SingleRecipientGauges, PolygonRootGauges, ArbitrumRootGauges. + SingleRecipientGauge.actionId('SingleRecipientGauge', 'checkpoint()'), + ]), + createRoleData(BLABS_OPS_MULTISIG, ArbitrumRootGaugeFactory.output().ArbitrumRootGaugeFactory, [ + ArbitrumRootGaugeFactory.actionId('ArbitrumRootGaugeFactory', 'setArbitrumFees(uint64,uint64,uint64)'), + ]), + createRoleData(BLABS_OPS_MULTISIG, OptimismRootGaugeFactory.output().OptimismRootGaugeFactory, [ + OptimismRootGaugeFactory.actionId('OptimismRootGaugeFactory', 'setOptimismGasLimit(uint32)'), + ]), + // BALTokenHolder.withdrawFunds(address, uint256) (veBAL BALTokenHolder) + // Note this actionId can't be pulled from the json file as the BALTokenHolder is not listed there. + { + role: '0x79922681fd17c90b4f3409d605f5b059ffcbcef7b5440321ae93b87f3b5c1c78', + grantee: BLABS_VEBAL_MULTISIG, + target: '0x3c1d00181ff86fbac0c3c52991fbfd11f6491d70', + }, +]); + +const feesAndTargetsPermissions: RoleData[] = flatten([ + createRoleData(DAO_MULTISIG, ProtocolFeesCollector.output().ProtocolFeesCollector, [ + ProtocolFeesCollector.actionId('ProtocolFeesCollector', 'setSwapFeePercentage(uint256)'), + ]), + createRoleData(DAO_MULTISIG, ProtocolFeePercentagesProvider.output().ProtocolFeePercentagesProvider, [ + ProtocolFeePercentagesProvider.actionId('ProtocolFeePercentagesProvider', 'setFeeTypePercentage(uint256,uint256)'), + ]), + createRoleData(DAO_MULTISIG, VotingEscrowDelegationProxy.output().VotingEscrowDelegationProxy, [ + VotingEscrowDelegationProxy.actionId('VotingEscrowDelegationProxy', 'setDelegation(address)'), + ]), + createRoleData( + ProtocolFeePercentagesProvider.output().ProtocolFeePercentagesProvider, + ProtocolFeesCollector.output().ProtocolFeesCollector, + [ + ProtocolFeesCollector.actionId('ProtocolFeesCollector', 'setSwapFeePercentage(uint256)'), + ProtocolFeesCollector.actionId('ProtocolFeesCollector', 'setFlashLoanFeePercentage(uint256)'), + ] + ), + createRoleData(GAUNTLET_FEE_SETTER, EVERYWHERE, [ + StablePool.actionId('StablePool', 'setSwapFeePercentage(uint256)'), + StablePoolV2.actionId('StablePool', 'setSwapFeePercentage(uint256)'), + MetaStablePool.actionId('MetaStablePool', 'setSwapFeePercentage(uint256)'), + StablePhantomPool.actionId('StablePhantomPool', 'setSwapFeePercentage(uint256)'), + ComposableStablePool.actionId('ComposableStablePool', 'setSwapFeePercentage(uint256)'), + WeightedPool.actionId('WeightedPool', 'setSwapFeePercentage(uint256)'), + WeightedPool.actionId('WeightedPool2Tokens', 'setSwapFeePercentage(uint256)'), + WeightedPoolV2.actionId('WeightedPool', 'setSwapFeePercentage(uint256)'), + ]), + createRoleData(BALLERS_MULTISIG, EVERYWHERE, [ + StablePhantomPool.actionId('StablePhantomPool', 'setTokenRateCacheDuration(address,uint256)'), + AaveLinearPool.actionId('AaveLinearPool', 'setSwapFeePercentage(uint256)'), + AaveLinearPool.actionId('AaveLinearPool', 'setTargets(uint256,uint256)'), + ]), + createRoleData(BALLERS_MULTISIG_GAUTLET, EVERYWHERE, [ + ComposableStablePool.actionId('ComposableStablePool', 'startAmplificationParameterUpdate(uint256,uint256)'), + ComposableStablePool.actionId('ComposableStablePool', 'stopAmplificationParameterUpdate()'), + StablePoolV2.actionId('StablePool', 'startAmplificationParameterUpdate(uint256,uint256)'), + StablePoolV2.actionId('StablePool', 'stopAmplificationParameterUpdate()'), + ]), +]); + +export const roles: RoleData[] = flatten([ + ...batchRelayerPermissions, + ...lidoRelayerPermissions, + ...gnosisProtocolRelayerPermissions, + ...protocolFeesPermissions, + ...veBALPermissions, + ...feesAndTargetsPermissions, +]); + +export const granters: RoleData[] = flatten([ + createRoleData(BLABS_OPS_MULTISIG, EVERYWHERE, [ + SingleRecipientGauge.actionId('SingleRecipientGauge', 'checkpoint()'), + ]), +]); +export const revokers: RoleData[] = []; +export const executeDelays: DelayData[] = [ + { actionId: Vault.actionId('Vault', 'setAuthorizer(address)'), newDelay: 30 * DAY }, + { + actionId: SmartWalletChecker.actionId('SmartWalletChecker', 'allowlistAddress(address)'), + newDelay: 7 * DAY, + }, + { + actionId: VotingEscrowDelegationProxy.actionId('VotingEscrowDelegationProxy', 'setDelegation(address)'), + newDelay: 14 * DAY, + }, + { + actionId: GaugeAdder.actionId('GaugeAdder', 'addGaugeFactory(address,uint8)'), + newDelay: 14 * DAY, + }, +]; + +export const grantDelays: DelayData[] = [ + { + actionId: BalancerTokenAdmin.actionId('BalancerTokenAdmin', 'mint(address,uint256)'), + newDelay: 30 * DAY, + }, + { + actionId: Vault.actionId('ProtocolFeesCollector', 'withdrawCollectedFees(address[],uint256[],address)'), + newDelay: 30 * DAY, + }, + { + actionId: GaugeController.actionId('GaugeController', 'add_gauge(address,int128)'), + newDelay: 14 * DAY, + }, + { + actionId: GaugeController.actionId('GaugeController', 'add_gauge(address,int128,uint256)'), + newDelay: 14 * DAY, + }, + // BALTokenHolder.withdrawFunds(address, uint256) (veBAL BALTokenHolder) + // Note this actionId can't be pulled from the json file as the BALTokenHolder is not listed there. + { actionId: '0x79922681fd17c90b4f3409d605f5b059ffcbcef7b5440321ae93b87f3b5c1c78', newDelay: 7 * DAY }, + { + actionId: Vault.actionId('Vault', 'setRelayerApproval(address,address,bool)'), + newDelay: 7 * DAY, + }, + { + actionId: Vault.actionId( + 'Vault', + 'batchSwap(uint8,(bytes32,uint256,uint256,uint256,bytes)[],address[],(address,bool,address,bool),int256[],uint256)' + ), + newDelay: 7 * DAY, + }, + { + actionId: Vault.actionId('Vault', 'joinPool(bytes32,address,address,(address[],uint256[],bytes,bool))'), + newDelay: 7 * DAY, + }, + { + actionId: Vault.actionId( + 'Vault', + 'swap((bytes32,uint8,address,address,uint256,bytes),(address,bool,address,bool),uint256,uint256)' + ), + newDelay: 7 * DAY, + }, + { + actionId: Vault.actionId('Vault', 'exitPool(bytes32,address,address,(address[],uint256[],bytes,bool))'), + newDelay: 7 * DAY, + }, + { + actionId: Vault.actionId('Vault', 'manageUserBalance((uint8,address,uint256,address,address)[])'), + newDelay: 7 * DAY, + }, +]; diff --git a/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/input/types.ts b/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/input/types.ts new file mode 100644 index 0000000..449fa2e --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/input/types.ts @@ -0,0 +1,10 @@ +export type RoleData = { + role: string; + grantee: string; + target: string; +}; + +export type DelayData = { + actionId: string; + newDelay: number; +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/output/goerli.json new file mode 100644 index 0000000..a46a9b1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/output/goerli.json @@ -0,0 +1,4 @@ +{ + "TimelockAuthorizerMigrator": "0xee47ef369CDa5a65639D7794b70a4d247826DdF3", + "TimelockAuthorizer": "0x5D21A65b6Ec0687f471891257F1DA25ab8be6153" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/output/mainnet.json new file mode 100644 index 0000000..9e75d5d --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "TimelockAuthorizerMigrator": "0xf8ee6f1F9B54F9b2C192D703ea2d22112cBC062b", + "TimelockAuthorizer": "0x9E3cD0606Db55ac68845bB60121847823712ae05" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/readme.md b/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/readme.md new file mode 100644 index 0000000..f36605b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/readme.md @@ -0,0 +1,15 @@ +# 2022-12-02 - Timelock Authorizer + +> ⚠️ **DEPRECATED: do not use** ⚠️ + +> Superseded by [20230403-timelock-authorizer](../../20230522-timelock-authorizer/), which provides much better and isolated control over granting, revoking, cancelling and executing permissions. + +Deployment of the `TimelockAuthorizer` in order to replace the basic Authorizer deployed with the Vault. +This Authorizer implementation allows defining a delay per action identifier. Users can only execute functions directly when there is no delay. Otherwise, they're granted permission to schedule an action, which can then be executed by the Authorizer after the delay. It also introduces Granters and Revokers, to allow controlled delegation of permission handling to third parties, which eases the burden on governance and allows the system to scale. For instance, a smaller multisig might be designated as a Granter for certain veBAL-related functions for new pools. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`TimelockAuthorizer` artifact](./artifact/TimelockAuthorizer.json) +- [`TimelockAuthorizerMigrator` artifact](./artifact/TimelockAuthorizerMigrator.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/test/task.fork.ts new file mode 100644 index 0000000..a331414 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221202-timelock-authorizer/test/task.fork.ts @@ -0,0 +1,147 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import { fp } from '@helpers/numbers'; +import { actionId } from '@helpers/models/misc/actions'; +import { advanceTime, DAY, WEEK } from '@helpers/time'; +import * as expectEvent from '@helpers/expectEvent'; +import { ZERO_ADDRESS } from '@helpers/constants'; + +import { describeForkTest } from '@src'; +import { Task, TaskMode } from '@src'; +import { impersonate } from '@src'; +import { getForkedNetwork } from '@src'; +import { AuthorizerDeployment } from '../../../20210418-authorizer/input'; +import { TimelockAuthorizerDeployment } from '../input'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; + +describeForkTest('TimelockAuthorizer', 'mainnet', 16076200, function () { + let input: TimelockAuthorizerDeployment; + let migrator: Contract, vault: Contract, newAuthorizer: Contract, oldAuthorizer: Contract; + let root: SignerWithAddress; + + let task: Task; + + before('run task', async () => { + task = new Task('20221202-timelock-authorizer', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + input = task.input() as TimelockAuthorizerDeployment; + migrator = await task.deployedInstance('TimelockAuthorizerMigrator'); + newAuthorizer = await task.deployedInstance('TimelockAuthorizer'); + + root = await impersonate(input.Root, fp(100)); + }); + + before('load vault', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.instanceAt('Vault', await migrator.vault()); + }); + + before('load old authorizer and impersonate multisig', async () => { + const authorizerTask = new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)); + oldAuthorizer = await authorizerTask.instanceAt('Authorizer', await migrator.oldAuthorizer()); + + const authorizerInput = authorizerTask.input() as AuthorizerDeployment; + const multisig = await impersonate(authorizerInput.admin, fp(100)); + const setAuthorizerActionId = await actionId(vault, 'setAuthorizer'); + await oldAuthorizer.connect(multisig).grantRolesToMany([setAuthorizerActionId], [migrator.address]); + }); + + it('migrates all roles properly', async () => { + for (const roleData of input.Roles) { + expect(await newAuthorizer.hasPermission(roleData.role, roleData.grantee, roleData.target)).to.be.true; + } + }); + + it('sets up granters properly', async () => { + for (const granterData of input.Granters) { + expect(await newAuthorizer.isGranter(granterData.role, granterData.grantee, granterData.target)).to.be.true; + } + }); + + it('sets up revokers properly', async () => { + for (const revokerData of input.Revokers) { + expect(await newAuthorizer.isRevoker(revokerData.role, revokerData.grantee, revokerData.target)).to.be.true; + } + }); + + it('sets up delays properly', async () => { + await advanceTime(5 * DAY); + await migrator.executeDelays(); + + for (const delayData of input.ExecuteDelays) { + expect(await newAuthorizer.getActionIdDelay(delayData.actionId)).to.be.eq(delayData.newDelay); + } + + for (const delayData of input.GrantDelays) { + const grantActionId = await newAuthorizer.getGrantPermissionActionId(delayData.actionId); + expect(await newAuthorizer.getActionIdDelay(grantActionId)).to.be.eq(delayData.newDelay); + } + }); + + it('starts the root transfer', async () => { + await advanceTime(4 * WEEK); + await migrator.startRootTransfer(); + }); + + it('does not set the new authorizer immediately', async () => { + expect(await newAuthorizer.isRoot(migrator.address)).to.be.true; + expect(await vault.getAuthorizer()).to.be.equal(oldAuthorizer.address); + }); + + it('finalizes the migration once new root address claims root status', async () => { + await expect(migrator.finalizeMigration()).to.be.revertedWith('ROOT_NOT_CLAIMED_YET'); + + await newAuthorizer.connect(root).claimRoot(); + + await migrator.finalizeMigration(); + expect(await vault.getAuthorizer()).to.be.equal(newAuthorizer.address); + expect(await newAuthorizer.isRoot(root.address)).to.be.true; + expect(await newAuthorizer.isRoot(migrator.address)).to.be.false; + }); + + it('allows minting after the migration', async () => { + const balancerMinterTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + const balancerMinter = await balancerMinterTask.deployedInstance('BalancerMinter'); + + const balancerTokenAdminTask = new Task('20220325-balancer-token-admin', TaskMode.READ_ONLY, getForkedNetwork(hre)); + const balancerTokenAdmin = await balancerTokenAdminTask.deployedInstance('BalancerTokenAdmin'); + + const tokensTask = new Task('00000000-tokens', TaskMode.READ_ONLY, getForkedNetwork(hre)); + const balAddress = tokensTask.output().BAL; + const balancerToken = await balancerTokenAdminTask.instanceAt('IERC20', balAddress); + + const balancerMinterSigner = await impersonate(balancerMinter.address, fp(100)); + + const tx = await balancerTokenAdmin.connect(balancerMinterSigner).mint(balancerMinter.address, 100); + + expectEvent.inIndirectReceipt(await tx.wait(), balancerToken.interface, 'Transfer', { + from: ZERO_ADDRESS, + to: balancerMinter.address, + value: 100, + }); + }); + + it('allows migrating the authorizer address again', async () => { + const setAuthorizerActionId = await actionId(vault, 'setAuthorizer'); + + expect(await vault.getAuthorizer()).to.be.eq(newAuthorizer.address); + + await newAuthorizer.connect(root).grantPermissions([setAuthorizerActionId], root.address, [vault.address]); + + // Schedule authorizer change + const nextAuthorizer = '0xaF52695E1bB01A16D33D7194C28C42b10e0Dbec2'; + const tx = await newAuthorizer + .connect(root) + .schedule(vault.address, vault.interface.encodeFunctionData('setAuthorizer', [nextAuthorizer]), [root.address]); + const event = expectEvent.inReceipt(await tx.wait(), 'ExecutionScheduled'); + + await advanceTime(30 * DAY); + + // Execute authorizer change + await newAuthorizer.connect(root).execute(event.args.scheduledExecutionId); + + expect(await vault.getAuthorizer()).to.be.eq(nextAuthorizer); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/artifact/AaveLinearPool.json b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/artifact/AaveLinearPool.json new file mode 100644 index 0000000..d59b724 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/artifact/AaveLinearPool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"components": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20", "name": "mainToken", "type": "address"}, {"internalType": "contract IERC20", "name": "wrappedToken", "type": "address"}, {"internalType": "address", "name": "assetManager", "type": "address"}, {"internalType": "uint256", "name": "upperTarget", "type": "uint256"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "string", "name": "version", "type": "string"}], "internalType": "struct AaveLinearPool.ConstructorArgs", "name": "args", "type": "tuple"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "enabled", "type": "bool"}], "name": "RecoveryModeStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "lowerTarget", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "upperTarget", "type": "uint256"}], "name": "TargetsSet", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "disableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "enableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getBptIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "pure", "type": "function"}, {"inputs": [], "name": "getDomainSeparator", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMainIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMainToken", "outputs": [{"internalType": "contract IERC20", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "getNextNonce", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getProtocolFeesCollector", "outputs": [{"internalType": "contract IProtocolFeesCollector", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getScalingFactors", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getTargets", "outputs": [{"internalType": "uint256", "name": "lowerTarget", "type": "uint256"}, {"internalType": "uint256", "name": "upperTarget", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVirtualSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedToken", "outputs": [{"internalType": "contract IERC20", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedTokenRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "inRecoveryMode", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "dueProtocolFees", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "dueProtocolFees", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "indexIn", "type": "uint256"}, {"internalType": "uint256", "name": "indexOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256", "name": "balanceTokenIn", "type": "uint256"}, {"internalType": "uint256", "name": "balanceTokenOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "newLowerTarget", "type": "uint256"}, {"internalType": "uint256", "name": "newUpperTarget", "type": "uint256"}], "name": "setTargets", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "version", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/artifact/AaveLinearPoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/artifact/AaveLinearPoolFactory.json new file mode 100644 index 0000000..f095c6e --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/artifact/AaveLinearPoolFactory.json @@ -0,0 +1,385 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "AaveLinearPoolFactory", + "sourceName": "contracts/aave/AaveLinearPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "contract IBalancerQueries", + "name": "queries", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "poolVersion", + "type": "string" + }, + { + "internalType": "uint256", + "name": "initialPauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "AaveLinearPoolCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "AaveLinearPoolProtocolIdRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract AaveLinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastCreatedPool", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeePercentagesProvider", + "outputs": [ + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "getProtocolName", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "registerProtocolId", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101e06040523480156200001257600080fd5b5060405162009658380380620096588339810160408190526200003591620003be565b86868383604051806020016200004b906200026d565b601f1982820381018352601f909101166040528851839083908790309085908e906200007f9060009060208401906200027b565b505080516002810460a081905280820360e081905281845283620000af816200018e602090811b62000bca17901c565b60601b6001600160601b0319166080528285018051838252620000de826200018e602090811b62000bca17901c565b6001600160601b0319606091821b811660c0529690935290526101009590955250509290911b909116610120525062000121630163f500831115610194620001e2565b620001356276a700821115610195620001e2565b610140829052610160524201610180525050506001600160601b0319606091821b81166101a05260016003559087901b166101c052508251620001809060069060208601906200027b565b50505050505050506200048f565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001dc6001600160a01b03831615156101ac620001e2565b50919050565b81620001f357620001f381620001f7565b5050565b62000209816210905360ea1b6200020c565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6157e08062003e7883390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002be57805160ff1916838001178555620002ee565b82800160010185558215620002ee579182015b82811115620002ee578251825591602001919060010190620002d1565b50620002fc92915062000300565b5090565b5b80821115620002fc576000815560010162000301565b600082601f83011262000328578081fd5b81516001600160401b03808211156200033f578283fd5b6040516020601f8401601f191682018101838111838210171562000361578586fd5b806040525081945083825286818588010111156200037e57600080fd5b600092505b83831015620003a2578583018101518284018201529182019162000383565b83831115620003b45760008185840101525b5050505092915050565b600080600080600080600060e0888a031215620003d9578283fd5b8751620003e68162000479565b6020890151909750620003f98162000479565b60408901519096506200040c8162000479565b60608901519095506001600160401b038082111562000429578485fd5b620004378b838c0162000317565b955060808a01519150808211156200044d578485fd5b506200045c8a828b0162000317565b93505060a0880151915060c0880151905092959891949750929550565b6001600160a01b03811681146200020957600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405161016051610180516101a05160601c6101c05160601c613954620005246000398061085752508061054a5250806102d152806102fb52508061031f525050806106345250806105e2525080610c335250806102a85280610caf525080610c545250806102875280610c8b52506139546000f3fe60806040523480156200001157600080fd5b5060043610620001175760003560e01c80636c57f5a911620000a55780638d928af8116200006f5780638d928af81462000222578063a2de1041146200022c578063aaabadc51462000243578063df8af989146200024d5762000117565b80636c57f5a914620001d1578063739238d614620001db5780637f5d981714620001e5578063851c1bb314620001fc5762000117565b80633f819b6f11620000e75780633f819b6f146200017e57806354fd4d5014620001885780635ed3128214620001925780636634b75314620001ab5762000117565b8062c194db146200011c578063174481fa146200013e5780632da47c4014620001585780632f2770db1462000172575b600080fd5b6200012662000264565b604051620001359190620017d5565b60405180910390f35b6200014862000285565b604051620001359291906200176e565b62000162620002cb565b6040516200013592919062001a3c565b6200017c62000354565b005b62000126620003be565b6200012662000476565b6200019c620004f8565b6040516200013591906200174d565b620001c2620001bc36600462001475565b62000514565b60405162000135919062001795565b620001c26200053f565b6200019c62000548565b6200017c620001f6366004620015f5565b6200056c565b620002136200020d366004620014b6565b620005de565b604051620001359190620017a0565b6200019c62000632565b620001266200023d366004620015dc565b62000656565b6200019c62000780565b6200019c6200025e36600462001517565b6200080d565b6060620002806040518060200160405280600081525062000c2b565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200034657807f00000000000000000000000000000000000000000000000000000000000000000392507f000000000000000000000000000000000000000000000000000000000000000091506200034f565b60009250600091505b509091565b6200035e62000d06565b6200036862000d55565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156200046c5780601f1062000440576101008083540402835291602001916200046c565b820191906000526020600020905b8154815290600101906020018083116200044e57829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156200046c5780601f1062000440576101008083540402835291602001916200046c565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b6200057662000d06565b60008281526007602052604090206001015460ff1615620005ce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005c59062001821565b60405180910390fd5b620005da828262000d6e565b5050565b60007f00000000000000000000000000000000000000000000000000000000000000008260405160200162000615929190620016ea565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60606200066262001262565b6000838152600760209081526040918290208251815460026001821615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911604601f8101849004909302810160609081018552938101838152909391928492849190840182828015620007205780601f10620006f45761010080835404028352916020019162000720565b820191906000526020600020905b8154815290600101906020018083116200070257829003601f168201915b50505091835250506001919091015460ff16151560209182015281015190915062000779576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005c5906200188f565b5192915050565b60006200078c62000632565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620007d257600080fd5b505afa158015620007e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002809190620014f8565b60006200081962000e23565b600480546001810190915560405160609062000838602082016200127a565b601f1982820381018352601f909101166040526200085562000632565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001620008899291906200176e565b60408051601f1981840301815290829052620008a992916020016200171a565b60405160208183030381529060405290506000620008cf83838051906020012062000e3e565b9050600080620008de620002cb565b91509150620008ec62001288565b620008f662000632565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508e81602001819052508d81604001819052508c816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508a8160c0018181525050898160e0018181525050828161010001818152505081816101200181815250508881610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505062000a54620003be565b61016082015260405160009062000a8a9062000a7590849060200162001934565b60405160208183030381529060405262000e54565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562000ad557600080fd5b505af115801562000aea573d6000803e3d6000fd5b50505050600062000afe6000898962000ea9565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161462000b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005c590620018c6565b6040518a9073ffffffffffffffffffffffffffffffffffffffff8416907fdd6d1f79139f1dde24a93542b6f48323b2638466a8bedffc021d605a0d34afd490600090a350965050505050505062000bbe62000f87565b98975050505050505050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000c2573ffffffffffffffffffffffffffffffffffffffff831615156101ac62000f8e565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000cf881838662000f9f565b505050505050505050919050565b600062000d376000357fffffffff0000000000000000000000000000000000000000000000000000000016620005de565b905062000d5262000d49823362000ffd565b61019162000f8e565b50565b62000d6c62000d636200053f565b1560d362000f8e565b565b604080518082018252828152600160208083019190915260008581526007825292909220815180519293919262000da9928492019062001357565b5060209190910151600190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560405182907fdbfa11b874c71b5268dced95badf825ccb2dce683de4d734bc815cefdf47da4e9062000e17908490620017d5565b60405180910390a25050565b62000e376002600354141561019062000f8e565b6002600355565b600062000e4d8383306200109b565b9392505050565b60008062000e6283620010dc565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790559392505050565b6000808447101562000ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005c590620017ea565b825162000f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005c590620018fd565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005c59062001858565b949350505050565b6001600355565b81620005da57620005da8162001177565b5b6020811062000fc1578151835260209283019290910190601f190162000fa0565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b60006200100962000780565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b81526004016200104793929190620017a9565b60206040518083038186803b1580156200106057600080fd5b505afa15801562001075573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000e4d919062001494565b60008060ff60f81b838686604051602001620010bb949392919062001686565b60408051808303601f19018152919052805160209091012095945050505050565b6000620010e862000d55565b6000620010f583620011a3565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b62000d52817f42414c0000000000000000000000000000000000000000000000000000000000620011e7565b60006060620011b28362000c2b565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811662000e4d573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60408051808201909152606081526000602082015290565b611e7e8062001aa183390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200139a57805160ff1916838001178555620013ca565b82800160010185558215620013ca579182015b82811115620013ca578251825591602001919060010190620013ad565b50620013d8929150620013dc565b5090565b5b80821115620013d85760008155600101620013dd565b600082601f83011262001404578081fd5b813567ffffffffffffffff808211156200141c578283fd5b6040516020601f19601f85011682010181811083821117156200143d578485fd5b6040528281529250828483016020018610156200145957600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121562001487578081fd5b813562000e4d8162001a7d565b600060208284031215620014a6578081fd5b8151801515811462000e4d578182fd5b600060208284031215620014c8578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811462000e4d578182fd5b6000602082840312156200150a578081fd5b815162000e4d8162001a7d565b600080600080600080600080610100898b03121562001534578384fd5b883567ffffffffffffffff808211156200154c578586fd5b6200155a8c838d01620013f3565b995060208b013591508082111562001570578586fd5b506200157f8b828c01620013f3565b9750506040890135620015928162001a7d565b95506060890135620015a48162001a7d565b94506080890135935060a0890135925060c0890135620015c48162001a7d565b8092505060e089013590509295985092959890939650565b600060208284031215620015ee578081fd5b5035919050565b6000806040838503121562001608578182fd5b82359150602083013567ffffffffffffffff81111562001626578182fd5b6200163485828601620013f3565b9150509250929050565b73ffffffffffffffffffffffffffffffffffffffff169052565b600081518084526200167281602086016020860162001a4a565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b600083516200172e81846020880162001a4a565b8351908301906200174481836020880162001a4a565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000e4d602083018462001658565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b6020808252601e908201527f50726f746f636f6c20494420616c726561647920726567697374657265640000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601a908201527f50726f746f636f6c204944206e6f742072656769737465726564000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b6000602082526200194a6020830184516200163e565b6020830151610180806040850152620019686101a085018362001658565b91506040850151601f198086850301606087015262001988848362001658565b935060608701519150620019a060808701836200163e565b60808701519150620019b660a08701836200163e565b60a08701519150620019cc60c08701836200163e565b60c087015160e087810191909152870151610100808801919091528701516101208088019190915287015161014080880191909152870151915061016062001a17818801846200163e565b87015186850390910183870152905062001a32838262001658565b9695505050505050565b918252602082015260400190565b60005b8381101562001a6757818101518382015260200162001a4d565b8381111562001a77576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000d5257600080fdfe6101606040523480156200001257600080fd5b5060405162001e7e38038062001e7e833981016040819052620000359162000462565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000378565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200012591908101906200039e565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000449565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000449565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000378565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000378565b6001600160601b0319606091821b811660e05292811b8316610120521b166101405250620004e0915050565b6000602082840312156200038a578081fd5b81516200039781620004c7565b9392505050565b60006020808385031215620003b1578182fd5b82516001600160401b0380821115620003c8578384fd5b818501915085601f830112620003dc578384fd5b815181811115620003eb578485fd5b8381029150620003fd848301620004a0565b8181528481019084860184860187018a101562000418578788fd5b8795505b838610156200043c5780518352600195909501949186019186016200041c565b5098975050505050505050565b6000602082840312156200045b578081fd5b5051919050565b6000806040838503121562000475578081fd5b82516200048281620004c7565b60208401519092506200049581620004c7565b809150509250929050565b6040518181016001600160401b0381118282101715620004bf57600080fd5b604052919050565b6001600160a01b0381168114620004dd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c6118bb620005c36000398061050952806108215250806101335280610c145280610f335280610f955250806103bf52508061046c5280610599528061074852806108ec5280610cbf528061102952806110f3528061115552508060ea5280610190528061043052806105cc528061063152806106d2528061078452806108b152806110d152508061016f5280610402528061071a5280610a7d5280610b5c5280610dbb5280610e9a5250806099528061030952506118bb6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611588565b60405180910390f35b610077610072366004611446565b6100bb565b60405161005b9190611824565b610077610092366004611462565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc92919061173d565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c91906114e8565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a939291906115d0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a491906114c5565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f5611393565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c96113f6565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611761565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059291906114ad565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d4f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611588565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b691906114ad565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fca565b9695505050505050565b600061070d611393565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e16113f6565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611761565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa91906114ad565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fe9565b6110b7565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d4f565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a919061156c565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b6919061148d565b6101a26111e8565b60006109cd82151560046111e8565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b60056111e8565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f61141d565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016116b9565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517fead5d35900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ead5d35990610cf99030908590600190600401611650565b6040805180830381600087803b158015610d1257600080fd5b505af1158015610d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4a91906114c5565b505050565b6040805160028082526060828101909352816020015b610d6d61141d565b815260200190600190039081610d65579050509050600281600081518110610d9157fe5b6020026020010151600001906002811115610da857fe5b90816002811115610db557fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de757fe5b602002602001015160200181815250508181600081518110610e0557fe5b602002602001015160600181815250508281600081518110610e2357fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e7057fe5b6020026020010151600001906002811115610e8757fe5b90816002811115610e9457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec657fe5b602002602001015160200181815250508181600181518110610ee457fe5b602002602001015160600181815250508281600181518110610f0257fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f589084167f0000000000000000000000000000000000000000000000000000000000000000846111f6565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016116b9565b610d4a8363a9059cbb60e01b848460405160240161027a92919061162a565b6040517ff57d0b4000000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f57d0b409061105e908590600401611824565b60206040518083038186803b15801561107657600080fd5b505afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae91906114ad565b60010192915050565b61111873ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f0000000000000000000000000000000000000000000000000000000000000000836111f6565b6040517f2f2cab8700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632f2cab87906111929030908590600090600190600401611680565b602060405180830381600087803b1580156111ac57600080fd5b505af11580156111c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e491906114ad565b5050565b816111e4576111e4816112eb565b80158015906112a757506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e9061125490309086906004016115a9565b60206040518083038186803b15801561126c57600080fd5b505afa158015611280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a491906114ad565b15155b156112cc576112cc8363095ea7b360e01b84600060405160240161027a929190611601565b610d4a8363095ea7b360e01b848460405160240161027a92919061162a565b611315817f42414c0000000000000000000000000000000000000000000000000000000000611318565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b600060208284031215611457578081fd5b813561011b81611863565b60008060408385031215611474578081fd5b823561147f81611863565b946020939093013593505050565b60006020828403121561149e578081fd5b8151801515811461011b578182fd5b6000602082840312156114be578081fd5b5051919050565b600080604083850312156114d7578182fd5b505080516020909101519092909150565b600080600080608085870312156114fd578182fd5b845193506020850151925060408501519150606085015161151d81611863565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161157e81846020870161182d565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff93909316835260208301919091521515604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff949094168452602084019290925261ffff1660408301521515606082015260800190565b602080825282518282018190526000919060409081850190868401855b828110156117305781518051600381106116ec57fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff168686015260609081015190850152608090930192908501906001016116d6565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a0830152602084015161177c81611859565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c06101408401528051806101608501526101806117e8828287016020860161182d565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b6020830184611528565b90815260200190565b60005b83811015611848578181015183820152602001611830565b838111156102fc5750506000910152565b6002811061131557fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461131557600080fdfea2646970667358221220b458099b8cd35b3909154454d41c0d96d31b97558e761dec7f824ddc9307ab7c64736f6c63430007010033a2646970667358221220433eeec5f934cf3756cd8ff1b5833684ad89bd8f21a9ac1ab5d3140de9b5fe9b64736f6c634300070100336102a06040523480156200001257600080fd5b50604051620057e0380380620057e0833981016040819052620000359162000deb565b6101608101518151602083015160408401516060850151608086015160c0870151620000618862000476565b60e08901516101008a01516101208b01516101408c01518a6200009e8160006200008c8c8c620004ff565b89620005b060201b620014141760201c565b8b8b868686828286868a85336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000ec92919062000c74565b5080516200010290600490602084019062000c74565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001819050630163f5008311156101946200077e565b620001956276a7008211156101956200077e565b4290910161014081905201610160526101808690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001eb57600080fd5b505afa15801562000200573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000226919062000dac565b6001600160a01b03166101a0816001600160a01b031660601b8152505050505050505050876001600160a01b03166101c0816001600160a01b031660601b81525050866001600160a01b03166101e0816001600160a01b031660601b81525050866001600160a01b0316886001600160a01b031610620002a8576002620002ab565b60015b60ff16610200526001600160a01b0380881690891610620002ce576001620002d1565b60025b60ff1661022052620002e38862000793565b61024052620002f28762000793565b610260526000620003058982896200083f565b620003108562000939565b50508a51620003339a506009995060208c019850965062000c7495505050505050565b505080608001516001600160a01b031663b4dcfc776040518163ffffffff1660e01b815260040160206040518083038186803b1580156200037357600080fd5b505afa15801562000388573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ae919062000dac565b6001600160a01b0316610280816001600160a01b031660601b815250506200046f81608001516001600160a01b0316634800d97f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200040d57600080fd5b505afa15801562000422573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000448919062000dac565b6001600160a01b031682606001516001600160a01b0316146102086200077e60201b60201c565b5062001068565b6040805160028082526060808301845292839291906020830190803683370190505090508260a0015181600081518110620004ad57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260a0015181600181518110620004e057fe5b6001600160a01b03909216602092830291909101909101529050919050565b60408051600280825260608281019093526001600160a01b03848116908616109183918160200160208202803683370190505090508162000541578362000543565b845b816000815181106200055157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050816200057e578462000580565b835b816001815181106200058e57fe5b6001600160a01b03909216602092830291909101909101529150505b92915050565b6000620005c883620009c860201b620015c91760201c565b606083516001016001600160401b0381118015620005e557600080fd5b5060405190808252806020026020018201604052801562000610578160200160208202803683370190505b50905030816000815181106200062257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b845181101562000695578481815181106200065c57fe5b60200260200101518282600101815181106200067457fe5b6001600160a01b039092166020928302919091019091015260010162000645565b50606083516001016001600160401b0381118015620006b357600080fd5b50604051908082528060200260200182016040528015620006de578160200160208202803683370190505b509050600081600081518110620006f157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b845181101562000764578481815181106200072b57fe5b60200260200101518282600101815181106200074357fe5b6001600160a01b039092166020928302919091019091015260010162000714565b506200077387878484620009d4565b979650505050505050565b816200078f576200078f8162000ace565b5050565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620007d057600080fd5b505afa158015620007e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200080b919062000f42565b60ff16905060006200082a60128362000ae360201b620015d71760201c565b600a0a670de0b6b3a764000002949350505050565b620008508183111561014c6200077e565b6200086d6b0de0b6b39983494c589c000082111561014d6200077e565b62000887670de0b6b3a7640000825b06156101616200077e565b6200089b670de0b6b3a7640000836200087c565b620008ea670de0b6b3a7640000820460406020620008d4670de0b6b3a764000087600854919004602080620015ed62000afb821b17811c565b62000afb60201b620015ed17909392919060201c565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906200092c908590859062001011565b60405180910390a2505050565b6200094e64e8d4a5100082101560cb6200077e565b6200096667016345785d8a000082111560ca6200077e565b620009888160c0603f60085462000afb60201b620015ed17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90620009bd90839062001008565b60405180910390a150565b806200078f8162000b20565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040162000a05919062000ff3565b602060405180830381600087803b15801562000a2057600080fd5b505af115801562000a35573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a5b919062000dd2565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000a909084908890889060040162000f65565b600060405180830381600087803b15801562000aab57600080fd5b505af115801562000ac0573d6000803e3d6000fd5b509298975050505050505050565b62000ae0816210905360ea1b62000bac565b50565b600062000af58383111560016200077e565b50900390565b600062000b0a84848462000c0d565b506001901b60001901811b1992909216911b1790565b60028151101562000b315762000ae0565b60008160008151811062000b4157fe5b602002602001015190506000600190505b825181101562000ba757600083828151811062000b6b57fe5b6020026020010151905062000b9c816001600160a01b0316846001600160a01b03161060656200077e60201b60201c565b915060010162000b52565b505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b62000c1e610100831060646200077e565b62000c576001821015801562000c4f575062000c4b60ff846101000362000c6860201b620016101760201c565b8211155b60646200077e565b62000ba783821c156101b46200077e565b80820390821102900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000cb757805160ff191683800117855562000ce7565b8280016001018555821562000ce7579182015b8281111562000ce757825182559160200191906001019062000cca565b5062000cf592915062000cf9565b5090565b5b8082111562000cf5576000815560010162000cfa565b8051620005aa8162001052565b600082601f83011262000d2e578081fd5b81516001600160401b0381111562000d44578182fd5b602062000d5a601f8301601f191682016200101f565b9250818352848183860101111562000d7157600080fd5b60005b8281101562000d9157848101820151848201830152810162000d74565b8281111562000da35760008284860101525b50505092915050565b60006020828403121562000dbe578081fd5b815162000dcb8162001052565b9392505050565b60006020828403121562000de4578081fd5b5051919050565b60006020828403121562000dfd578081fd5b81516001600160401b038082111562000e14578283fd5b818401915061018080838703121562000e2b578384fd5b62000e36816200101f565b905062000e44868462000d10565b815260208301518281111562000e58578485fd5b62000e668782860162000d1d565b60208301525060408301518281111562000e7e578485fd5b62000e8c8782860162000d1d565b60408301525062000ea1866060850162000d10565b606082015262000eb5866080850162000d10565b608082015262000ec98660a0850162000d10565b60a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014062000f0b8782860162000d10565b90820152610160838101518381111562000f23578586fd5b62000f318882870162000d1d565b918301919091525095945050505050565b60006020828403121562000f54578081fd5b815160ff8116811462000dcb578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000fb15762000f9e855162001046565b8352938301939183019160010162000f89565b505084810360408601528551808252908201925081860190845b8181101562000ac05762000fe0835162001046565b8552938301939183019160010162000fcb565b60208101600383106200100257fe5b91905290565b90815260200190565b918252602082015260400190565b6040518181016001600160401b03811182821017156200103e57600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b038116811462000ae057600080fd5b60805160a05160c05160e0516101005160601c6101205160601c6101405161016051610180516101a05160601c6101c05160601c6101e05160601c610200516102205161024051610260516102805160601c6145e6620011fa600039806118335250806107f452508061079052806129c1525080610718528061081c5280610c495280612e3c5280612fc552806130fd5280613208528061338552806134bd5250806107b252806109b45280610c0f5280612e085280612f4a5280612f91528061308752806130c952806131d4528061330f5280613351528061344752806134895250806113e852806126dd52806127a952806129e75280612dbd5280612ed6528061318a528061329b5250806109d852806110de5280611aa35280611b425280612694528061276052806129865280612d7e5280612e805280613013528061314b528061324c52806133d35250806111bc52508061094152508061180d5250806117e9525080610fc9525080610fa5525080610f555250806123d15250806124135250806123f252506145e66000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e366004613fbe565b610608565b60405161035091906142ad565b60405180910390f35b610361610668565b60405161035091906144f1565b61038161037c366004613d90565b6106ff565b604051610350919061428a565b610343610716565b61034361073a565b6103a6610740565b60405161035093929190614295565b6103bd610769565b6040516103509190614252565b6103816103d8366004613ce0565b610877565b6103e56108ed565b604051610350919061452b565b6103436108f6565b61040d61040836600461407b565b610905565b005b61034361093f565b610381610425366004613d90565b610963565b61040d61099e565b6103436109b2565b6104426109d6565b604051610350919061423e565b61040d6109fa565b610361610a4e565b610343610aaf565b61047a610475366004613ebf565b610ac2565b604051610350929190614504565b610490610ae0565b60405161035092919061451d565b610343610b1e565b6103436104b4366004613c8c565b610cb3565b6104cc6104c7366004613ebf565b610cd2565b604051610350929190614265565b6103436104e8366004613c8c565b610d94565b61040d610d9f565b610343610f3a565b61040d610f3f565b610343610513366004613f62565b610f51565b610442610fa3565b610442610fc7565b610343610536366004613c8c565b610feb565b610361611006565b61034361055136600461402f565b611067565b61040d610564366004614093565b6110a0565b610381610577366004613d90565b61110a565b61038161058a366004613d90565b611148565b610442611155565b61038161115f565b61040d611170565b6104426111ba565b61040d6105bd366004613d20565b6111de565b6104cc6105d0366004613ebf565b61125f565b6103436105e3366004613ca8565b6112f6565b610343611333565b6103436113dc565b6104426113e6565b61034361140a565b6000846080015161063561061a610fc7565b6001600160a01b0316336001600160a01b03161460cd61161c565b61064a61064061093f565b82146101f461161c565b61065261162a565b61065e8686868661163d565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b505050505090505b90565b600061070c338484611762565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074d6117ca565b1592506107586117e7565b915061076261180b565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107db57fe5b6020026020010181815250506108196107f261182f565b7f00000000000000000000000000000000000000000000000000000000000000009061191d565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084557fe5b602002602001018181525050670de0b6b3a76400008160008151811061086757fe5b6020908102919091010152905090565b60008061088485336112f6565b90506108a8336001600160a01b03871614806108a05750838210155b61019e61161c565b6108b3858585611955565b336001600160a01b038616148015906108ce57506000198114155b156108e0576108e08533858403611762565b60019150505b9392505050565b60055460ff1690565b60006109006113dc565b905090565b61090d611a35565b600080610918610ae0565b915091506109316109298383611a7e565b61014f61161c565b61093a83611b85565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070c9185906109999086611bfd565b611762565b6109a6611a35565b6109b06000611c0f565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a02611a35565b610a0a611ca0565b610a146001611cb4565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a44919061428a565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906109009060c0603f611cf6565b60006060610ad4888785611d05611d1c565b97509795505050505050565b6008546000908190670de0b6b3a7640000610afd82602080611cf6565b029250670de0b6b3a7640000610b168260406020611cf6565b029150509091565b600080610b2961093f565b90506060610b35610fc7565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b6091906142ad565b60006040518083038186803b158015610b7857600080fd5b505afa158015610b8c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bb49190810190613dbb565b50915050610bc981610bc4610769565b611e83565b600080610bd4610ae0565b91509150610be0613a2d565b6040518060600160405280610bf3610aaf565b81526020018481526020018381525090506000610c7f610c46867f000000000000000000000000000000000000000000000000000000000000000081518110610c3857fe5b602002602001015184611eec565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7257fe5b6020026020010151611f4d565b9050610ca8610ca186600081518110610c9457fe5b6020026020010151611f59565b8290611f6d565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce161061a610fc7565b610cec61064061093f565b6000610cf785611fc4565b15610d1f57610d04611ff3565b610d1688610d1061073a565b87612006565b94509050610d37565b610d2761162a565b610d328a8987611d05565b945090505b610d418a826120fc565b835167ffffffffffffffff81118015610d5957600080fd5b50604051908082528060200260200182016040528015610d83578160200160208202803683370190505b509250505097509795505050505050565b600061071082610feb565b6000610da961093f565b90506060610db5610fc7565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de091906142ad565b60006040518083038186803b158015610df857600080fd5b505afa158015610e0c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e349190810190613dbb565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e7857fe5b602002602001018181525050610e8c613a4e565b6040518060800160405280610ea0856106fc565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed1610fc7565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f0294939291906142d5565b600060405180830381600087803b158015610f1c57600080fd5b505af1158015610f30573d6000803e3d6000fd5b5050505050505050565b600090565b610f47611a35565b6109b06001611c0f565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f869291906141c8565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161107961061a610fc7565b61108461064061093f565b61108c61162a565b611097858585612106565b95945050505050565b6110a8611a35565b6000806110b3610ae0565b915091506110c46109298383611a7e565b6110d96110d18585611a7e565b61015761161c565b6111047f00000000000000000000000000000000000000000000000000000000000000008585612113565b50505050565b60008061111733856112f6565b90508083106111315761112c33856000611762565b61113e565b61113e3385858403611762565b5060019392505050565b600061070c338484611955565b60006109006121e9565b6008546000906109009060ff612263565b611178611a35565b611180611ff3565b61118a6000611cb4565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a44919061428a565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861120d8c610feb565b89604051602001611223969594939291906143c2565b604051602081830303815290604052805190602001209050611254888261124b87878761226a565b886101f86122a9565b610f30888888611762565b6060808861126e61061a610fc7565b61127961064061093f565b600061128361162a565b61128b61073a565b6112dd5761129a8a8a87612300565b945090506112b36112a9610f3a565b82101560cc61161c565b6112c560006112c0610f3a565b612398565b6112d8896112d1610f3a565b8303612398565b610d41565b6112e88a8987611d05565b94509050610d418982612398565b6000611300610fc7565b6001600160a01b0316826001600160a01b031614156113225750600019610710565b61132c83836123a2565b9050610710565b6000806000611340610fc7565b6001600160a01b031663b05f8e4861135661093f565b306040518363ffffffff1660e01b81526004016113749291906144a8565b60806040518083038186803b15801561138c57600080fd5b505afa1580156113a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c491906140b4565b5050915091506113d5818301611f59565b9250505090565b60006109006123cd565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061090061182f565b600061141f836115c9565b6060835160010167ffffffffffffffff8111801561143c57600080fd5b50604051908082528060200260200182016040528015611466578160200160208202803683370190505b509050308160008151811061147757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114e6578481815181106114af57fe5b60200260200101518282600101815181106114c657fe5b6001600160a01b039092166020928302919091019091015260010161149a565b506060835160010167ffffffffffffffff8111801561150457600080fd5b5060405190808252806020026020018201604052801561152e578160200160208202803683370190505b50905060008160008151811061154057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115af5784818151811061157857fe5b602002602001015182826001018151811061158f57fe5b6001600160a01b0390921660209283029190910190910152600101611563565b506115bc8787848461246a565b925050505b949350505050565b806115d381612573565b5050565b60006115e783831115600161161c565b50900390565b60006115fa8484846125ec565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115d3576115d381612632565b6109b06116356117ca565b61019261161c565b60006116596003841080156116525750600383105b606461161c565b6060611663610769565b905061166f8582611e83565b60008061167a610ae0565b91509150611686613a2d565b6040518060600160405280611699610aaf565b81526020810185905260400183905290506000895160018111156116b957fe5b141561171d576116e089606001518589815181106116d357fe5b602002602001015161265c565b60608a015260006116f28a8a84612668565b90506117118186898151811061170457fe5b602002602001015161272f565b955050505050506115c1565b61173189606001518588815181106116d357fe5b60608a015260006117438a8a8461273b565b905061171181868a8151811061175557fe5b60200260200101516127f0565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117bd9085906142ad565b60405180910390a3505050565b60006117d461180b565b42118061090057505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d15e00536118686109d6565b6040518263ffffffff1660e01b8152600401611884919061423e565b60206040518083038186803b15801561189c57600080fd5b505afa9250505080156118cc575060408051601f3d908101601f191682019092526118c991810190613ea7565b60015b61190f573d8080156118fa576040519150601f19603f3d011682016040523d82523d6000602084013e6118ff565b606091505b50611909816127fc565b506106fc565b633b9aca00900490506106fc565b600082820261194184158061193a57508385838161193757fe5b04145b600361161c565b670de0b6b3a7640000815b04949350505050565b61196c6001600160a01b038416151561019861161c565b6119836001600160a01b038316151561019961161c565b61198e83838361093a565b6001600160a01b0383166000908152602081905260409020546119b490826101a0612883565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119e39082611bfd565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117bd9085906142ad565b6000611a646000357fffffffff0000000000000000000000000000000000000000000000000000000016610f51565b9050611a7b611a738233612899565b61019161161c565b50565b6000806000611a8b610fc7565b6001600160a01b031663b05f8e48611aa161093f565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611adf9291906144a8565b60806040518083038186803b158015611af757600080fd5b505afa158015611b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2f91906140b4565b5050915091506000611b6b828401611b667f0000000000000000000000000000000000000000000000000000000000000000612982565b61265c565b905085811015801561065e57509390931115949350505050565b611b9864e8d4a5100082101560cb61161c565b611bae67016345785d8a000082111560ca61161c565b600854611bbf908260c0603f6115ed565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611bf29083906142ad565b60405180910390a150565b60008282016108e6848210158361161c565b8015611c2f57611c2a611c206117e7565b421061019361161c565b611c44565b611c44611c3a61180b565b42106101a961161c565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611bf290839061428a565b6109b0611cab61115f565b156101b561161c565b600854611cc3908260ff612a5c565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611bf290839061428a565b6001901b6000190191901c1690565b60006060611d146103e6612632565b935093915050565b333014611e0b576000306001600160a01b0316600036604051611d409291906141f8565b6000604051808303816000865af19150503d8060008114611d7d576040519150601f19603f3d011682016040523d82523d6000602084013e611d82565b606091505b505090508060008114611d9157fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611ded573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611e1e8686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611e92908290612a6b565b60005b8181101561110457611ecd848281518110611eac57fe5b6020026020010151848381518110611ec057fe5b602002602001015161191d565b848281518110611ed957fe5b6020908102919091010152600101611e95565b60008160200151831015611f255781516020830151600091611f11918690039061191d565b9050611f1d84826115d7565b915050610710565b81604001518311611f37575081610710565b81516040830151600091611f119186039061191d565b60006108e68383611bfd565b600061071082611f6761073a565b906115d7565b6000611f7c821515600461161c565b670de0b6b3a76400008302611fae841580611fa75750670de0b6b3a7640000858381611fa457fe5b04145b600561161c565b6001836001830304018115150291505092915050565b6000808251118015610710575060ff801682806020019051810190611fe991906140f4565b60ff161492915050565b6109b0611ffe61115f565b6101b661161c565b60006060600061201584612a78565b90506060865167ffffffffffffffff8111801561203157600080fd5b5060405190808252806020026020018201604052801561205b578160200160208202803683370190505b5090506000612068610f3a565b9050600061207b898381518110610c9457fe5b905060006120898583612a8e565b905060005b8a518110156120eb57838114156120a65760006120cc565b6120cc828c83815181106120b657fe5b602002602001015161191d90919063ffffffff16565b8582815181106120d857fe5b602090810291909101015260010161208e565b509399929850919650505050505050565b6115d38282612ace565b60006108e66103e6612632565b6121228183111561014c61161c565b61213d6b0de0b6b39983494c589c000082111561014d61161c565b612155670de0b6b3a7640000825b061561016161161c565b612167670de0b6b3a76400008361214b565b61219c670de0b6b3a7640000820460406020612194670de0b6b3a7640000876008549190046020806115ed565b9291906115ed565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121dc908590859061451d565b60405180910390a2505050565b60006121f3610fc7565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561222b57600080fd5b505afa15801561223f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109009190613fa2565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b60006122b485612b9a565b90506122ca6122c4878387612bb6565b8361161c565b6122d9428410156101b861161c565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b6000606061231b6001600160a01b038616301461015661161c565b6123326001600160a01b038516301461015661161c565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff8160008151811061238157fe5b602090810291909101015290969095509350505050565b6115d38282612c65565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061243a612cf8565b3060405160200161244f95949392919061447c565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040161249991906144dd565b602060405180830381600087803b1580156124b357600080fd5b505af11580156124c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124eb9190613ea7565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d290612537908490889088906004016143f6565b600060405180830381600087803b15801561255157600080fd5b505af1158015612565573d6000803e3d6000fd5b509298975050505050505050565b60028151101561258257611a7b565b60008160008151811061259157fe5b602002602001015190506000600190505b825181101561093a5760008382815181106125b957fe5b602002602001015190506125e2816001600160a01b0316846001600160a01b031610606561161c565b91506001016125a2565b6125fb6101008310606461161c565b61262360018210158015611652575061261960ff8461010003611610565b821115606461161c565b61093a83821c156101b461161c565b611a7b817f42414c0000000000000000000000000000000000000000000000000000000000612cfc565b60006108e6838361191d565b60208301516000906001600160a01b03163014156126925761268b848484612d77565b90506108e6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b031614156126db5761268b848484612ecf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b031614156127245761268b84848461300c565b6108e6610135612632565b60006108e68383612a8e565b60408301516000906001600160a01b031630141561275e5761268b848484613144565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127a75761268b848484613294565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127245761268b8484846133cc565b60006108e68383611f6d565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417612877578160208401fd5b506115d3610165612632565b6000612892848411158361161c565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128b8610fa3565b6001600160a01b0316141580156128d357506128d383613504565b156128fb576128e0610fa3565b6001600160a01b0316336001600160a01b0316149050610710565b6129036121e9565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b8152600401612932939291906142b6565b60206040518083038186803b15801561294a57600080fd5b505afa15801561295e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132c9190613e87565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156129e557507f0000000000000000000000000000000000000000000000000000000000000000610ccd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612a3157612a2a6107f261182f565b9050610ccd565b6001600160a01b038216301415612a515750670de0b6b3a7640000610ccd565b610ccd610135612632565b6001811b1992909216911b1790565b6115d3818314606761161c565b6000818060200190518101906108e69190614110565b6000612a9d821515600461161c565b670de0b6b3a76400008302612ac5841580611fa75750670de0b6b3a7640000858381611fa457fe5b82818161194c57fe5b612ae56001600160a01b038316151561019b61161c565b612af18260008361093a565b6001600160a01b038216600090815260208190526040902054612b1790826101b2612883565b6001600160a01b038316600090815260208190526040902055612b4a612b4582612b3f61073a565b90613568565b613576565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612b8e91906142ad565b60405180910390a35050565b6000612ba46123cd565b82604051602001610f86929190614208565b6000612bc882516041146101b961161c565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612c019089908590889088906144bf565b6020604051602081039080840390855afa158015612c23573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612c595750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612c716000838361093a565b612c86612b4582612c8061073a565b90611bfd565b6001600160a01b038216600090815260208190526040902054612ca99082611bfd565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612b8e9085906142ad565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612dfd7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612df557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561161c565b6115c18460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612e3157fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612e6557fe5b6020026020010151612e7d87600081518110610c9457fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612ec35761357b612ec7565b6135d95b63ffffffff16565b6000612f2b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612df5575060408501516001600160a01b0316301461013561161c565b60408401516001600160a01b03163014612f8657612f818460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f7357fe5b602002602001015184613642565b6115c1565b6115c18460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612fba57fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612fee57fe5b602002602001015161300687600081518110610c9457fe5b86613672565b60006130687f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612df5575060408501516001600160a01b0316301461013561161c565b60408401516001600160a01b031630146130be57612f818460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106130b057fe5b6020026020010151846136d8565b6115c18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106130f257fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061312657fe5b602002602001015161313e87600081518110610c9457fe5b86613718565b60006131c97f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612df557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561161c565b6115c18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131fd57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061323157fe5b602002602001015161324987600081518110610c9457fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461328f5761377f612ec7565b6137d6565b60006132f07f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612df5575060208501516001600160a01b0316301461013561161c565b60208401516001600160a01b0316301461334657612f818460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061333857fe5b602002602001015184613840565b6115c18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061337a57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106133ae57fe5b60200260200101516133c687600081518110610c9457fe5b8661386a565b60006134287f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612df5575060208501516001600160a01b0316301461013561161c565b60208401516001600160a01b0316301461347e57612f818460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061347057fe5b6020026020010151846138b9565b6115c18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106134b257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106134e657fe5b60200260200101516134fe87600081518110610c9457fe5b866138ee565b600061352f7f9f11080e00000000000000000000000000000000000000000000000000000000610f51565b82148061071057506135607f38e9922e00000000000000000000000000000000000000000000000000000000610f51565b909114919050565b60006108e683836001612883565b600255565b6000806135888684611eec565b905060006135968287611f4d565b905060006135a4868a6115d7565b905060006135bf84611f676135b98587613942565b8a61395c565b90506135cb88826115d7565b9a9950505050505050505050565b6000806135e68684611eec565b905060006135f48287611f4d565b9050600061360b613605838b613942565b8761397d565b9050600061361984836115d7565b90506000613627828861399d565b90506136338a826115d7565b9b9a5050505050505050505050565b60008061364f8484611eec565b905060006136666136608688611bfd565b85611eec565b905061065e81836115d7565b60008261368a576136838683611eec565b9050611097565b60006136968684611eec565b905060006136a7613660888a611bfd565b905060006136b582846115d7565b905060006136c38489611f4d565b90506135cb6136d28884613942565b8261397d565b6000806136e58484611eec565b905060006136f382876115d7565b90506000613701828661399d565b905061370d86826115d7565b979650505050505050565b600082613726575084611097565b60006137328684611eec565b905060006137408287611f4d565b9050600061374e878a611bfd565b9050600061375c8483611f4d565b9050600061377361376d8984613942565b8561397d565b905061363381896115d7565b60008261378d575084611097565b60006137998684611eec565b905060006137a78287611f4d565b905060006137b5868a611bfd565b905060006137ca84611f676135b98587613942565b90506135cb81896115d7565b6000826137e757613683868361399d565b60006137f38684611eec565b905060006138018287611f4d565b90506000613818613812838b613942565b8761395c565b905060006138268483611bfd565b90506000613834828861399d565b9050613633818b6115d7565b60008061384d8484611eec565b9050600061385e61366086886115d7565b905061065e82826115d7565b6000806138778684611eec565b90506000613888613660888a6115d7565b9050600061389683836115d7565b905060006138a48489611f4d565b90506135cb6138b38884613942565b8261395c565b6000806138c68484611eec565b905060006138d48287611bfd565b905060006138e2828661399d565b905061370d81876115d7565b6000806138fb8684611eec565b905060006139098287611f4d565b90506000613917878a6115d7565b905060006139258483611f4d565b9050600061393661376d8984613942565b905061363388826115d7565b60008282026108e684158061193a57508385838161193757fe5b600061396b821515600461161c565b50811515600019909201046001010290565b600061398c821515600461161c565b81838161399557fe5b049392505050565b600081602001518310156139e657815161132c906139c490670de0b6b3a764000090611bfd565b602084015184516139e0916139d9919061191d565b8690611bfd565b90612a8e565b816040015183116139f8575081610710565b815161132c90613a1190670de0b6b3a7640000906115d7565b604084015184516139e091613a26919061191d565b86906115d7565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b80356107108161458c565b600082601f830112613a93578081fd5b8135613aa6613aa182614560565b614539565b818152915060208083019084810181840286018201871015613ac757600080fd5b60005b84811015613ae657813584529282019290820190600101613aca565b505050505092915050565b600082601f830112613b01578081fd5b8151613b0f613aa182614560565b818152915060208083019084810181840286018201871015613b3057600080fd5b60005b84811015613ae657815184529282019290820190600101613b33565b600082601f830112613b5f578081fd5b813567ffffffffffffffff811115613b75578182fd5b613b886020601f19601f84011601614539565b9150808252836020828501011115613b9f57600080fd5b8060208401602084013760009082016020015292915050565b80356002811061071057600080fd5b6000610120808385031215613bda578182fd5b613be381614539565b915050613bf08383613bb8565b8152613bff8360208401613a78565b6020820152613c118360408401613a78565b6040820152606082013560608201526080820135608082015260a082013560a0820152613c418360c08401613a78565b60c0820152613c538360e08401613a78565b60e08201526101008083013567ffffffffffffffff811115613c7457600080fd5b613c8085828601613b4f565b82840152505092915050565b600060208284031215613c9d578081fd5b81356108e68161458c565b60008060408385031215613cba578081fd5b8235613cc58161458c565b91506020830135613cd58161458c565b809150509250929050565b600080600060608486031215613cf4578081fd5b8335613cff8161458c565b92506020840135613d0f8161458c565b929592945050506040919091013590565b600080600080600080600060e0888a031215613d3a578283fd5b8735613d458161458c565b96506020880135613d558161458c565b955060408801359450606088013593506080880135613d73816145a1565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613da2578182fd5b8235613dad8161458c565b946020939093013593505050565b600080600060608486031215613dcf578081fd5b835167ffffffffffffffff80821115613de6578283fd5b818601915086601f830112613df9578283fd5b8151613e07613aa182614560565b80828252602080830192508086018b828387028901011115613e27578788fd5b8796505b84871015613e52578051613e3e8161458c565b845260019690960195928101928101613e2b565b508901519097509350505080821115613e69578283fd5b50613e7686828701613af1565b925050604084015190509250925092565b600060208284031215613e98578081fd5b815180151581146108e6578182fd5b600060208284031215613eb8578081fd5b5051919050565b600080600080600080600060e0888a031215613ed9578081fd5b873596506020880135613eeb8161458c565b95506040880135613efb8161458c565b9450606088013567ffffffffffffffff80821115613f17578283fd5b613f238b838c01613a83565b955060808a0135945060a08a0135935060c08a0135915080821115613f46578283fd5b50613f538a828b01613b4f565b91505092959891949750929550565b600060208284031215613f73578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e6578182fd5b600060208284031215613fb3578081fd5b81516108e68161458c565b60008060008060808587031215613fd3578182fd5b843567ffffffffffffffff80821115613fea578384fd5b613ff688838901613bc7565b9550602087013591508082111561400b578384fd5b5061401887828801613a83565b949794965050505060408301359260600135919050565b600080600060608486031215614043578081fd5b833567ffffffffffffffff811115614059578182fd5b61406586828701613bc7565b9660208601359650604090950135949350505050565b60006020828403121561408c578081fd5b5035919050565b600080604083850312156140a5578182fd5b50508035926020909101359150565b600080600080608085870312156140c9578182fd5b84519350602085015192506040850151915060608501516140e98161458c565b939692955090935050565b600060208284031215614105578081fd5b81516108e6816145a1565b60008060408385031215614122578182fd5b825161412d816145a1565b6020939093015192949293505050565b6000815180845260208085019450808401835b8381101561416c57815187529582019590820190600101614150565b509495945050505050565b15159052565b60008151808452815b818110156141a257602081850181015186830182015201614186565b818111156141b35782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6000602082526108e6602083018461413d565b600060408252614278604083018561413d565b8281036020840152611097818561413d565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b80831015614346576143308451614580565b825292840192600192909201919084019061431e565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a0870152614384818561413d565b935050506040850151818584030160c08601526143a1838261417d565b9250505060608401516143b760e0850182614177565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b8181101561443e5761442c8551614580565b8352938301939183019160010161441a565b505084810360408601528551808252908201925081860190845b818110156125655761446a8351614580565b85529383019391830191600101614458565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b60208101600383106144eb57fe5b91905290565b6000602082526108e6602083018461417d565b6000838252604060208301526115c1604083018461413d565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561455857600080fd5b604052919050565b600067ffffffffffffffff821115614576578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114611a7b57600080fd5b60ff81168114611a7b57600080fdfea264697066735822122046c8db593dc65a0a6881e04b6981cfb3ab0c9bb335ff20cb64609736009a80f064736f6c63430007010033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620001175760003560e01c80636c57f5a911620000a55780638d928af8116200006f5780638d928af81462000222578063a2de1041146200022c578063aaabadc51462000243578063df8af989146200024d5762000117565b80636c57f5a914620001d1578063739238d614620001db5780637f5d981714620001e5578063851c1bb314620001fc5762000117565b80633f819b6f11620000e75780633f819b6f146200017e57806354fd4d5014620001885780635ed3128214620001925780636634b75314620001ab5762000117565b8062c194db146200011c578063174481fa146200013e5780632da47c4014620001585780632f2770db1462000172575b600080fd5b6200012662000264565b604051620001359190620017d5565b60405180910390f35b6200014862000285565b604051620001359291906200176e565b62000162620002cb565b6040516200013592919062001a3c565b6200017c62000354565b005b62000126620003be565b6200012662000476565b6200019c620004f8565b6040516200013591906200174d565b620001c2620001bc36600462001475565b62000514565b60405162000135919062001795565b620001c26200053f565b6200019c62000548565b6200017c620001f6366004620015f5565b6200056c565b620002136200020d366004620014b6565b620005de565b604051620001359190620017a0565b6200019c62000632565b620001266200023d366004620015dc565b62000656565b6200019c62000780565b6200019c6200025e36600462001517565b6200080d565b6060620002806040518060200160405280600081525062000c2b565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200034657807f00000000000000000000000000000000000000000000000000000000000000000392507f000000000000000000000000000000000000000000000000000000000000000091506200034f565b60009250600091505b509091565b6200035e62000d06565b6200036862000d55565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156200046c5780601f1062000440576101008083540402835291602001916200046c565b820191906000526020600020905b8154815290600101906020018083116200044e57829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156200046c5780601f1062000440576101008083540402835291602001916200046c565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b6200057662000d06565b60008281526007602052604090206001015460ff1615620005ce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005c59062001821565b60405180910390fd5b620005da828262000d6e565b5050565b60007f00000000000000000000000000000000000000000000000000000000000000008260405160200162000615929190620016ea565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60606200066262001262565b6000838152600760209081526040918290208251815460026001821615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911604601f8101849004909302810160609081018552938101838152909391928492849190840182828015620007205780601f10620006f45761010080835404028352916020019162000720565b820191906000526020600020905b8154815290600101906020018083116200070257829003601f168201915b50505091835250506001919091015460ff16151560209182015281015190915062000779576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005c5906200188f565b5192915050565b60006200078c62000632565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620007d257600080fd5b505afa158015620007e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002809190620014f8565b60006200081962000e23565b600480546001810190915560405160609062000838602082016200127a565b601f1982820381018352601f909101166040526200085562000632565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001620008899291906200176e565b60408051601f1981840301815290829052620008a992916020016200171a565b60405160208183030381529060405290506000620008cf83838051906020012062000e3e565b9050600080620008de620002cb565b91509150620008ec62001288565b620008f662000632565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508e81602001819052508d81604001819052508c816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508a8160c0018181525050898160e0018181525050828161010001818152505081816101200181815250508881610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505062000a54620003be565b61016082015260405160009062000a8a9062000a7590849060200162001934565b60405160208183030381529060405262000e54565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562000ad557600080fd5b505af115801562000aea573d6000803e3d6000fd5b50505050600062000afe6000898962000ea9565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161462000b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005c590620018c6565b6040518a9073ffffffffffffffffffffffffffffffffffffffff8416907fdd6d1f79139f1dde24a93542b6f48323b2638466a8bedffc021d605a0d34afd490600090a350965050505050505062000bbe62000f87565b98975050505050505050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000c2573ffffffffffffffffffffffffffffffffffffffff831615156101ac62000f8e565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000cf881838662000f9f565b505050505050505050919050565b600062000d376000357fffffffff0000000000000000000000000000000000000000000000000000000016620005de565b905062000d5262000d49823362000ffd565b61019162000f8e565b50565b62000d6c62000d636200053f565b1560d362000f8e565b565b604080518082018252828152600160208083019190915260008581526007825292909220815180519293919262000da9928492019062001357565b5060209190910151600190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560405182907fdbfa11b874c71b5268dced95badf825ccb2dce683de4d734bc815cefdf47da4e9062000e17908490620017d5565b60405180910390a25050565b62000e376002600354141561019062000f8e565b6002600355565b600062000e4d8383306200109b565b9392505050565b60008062000e6283620010dc565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790559392505050565b6000808447101562000ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005c590620017ea565b825162000f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005c590620018fd565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005c59062001858565b949350505050565b6001600355565b81620005da57620005da8162001177565b5b6020811062000fc1578151835260209283019290910190601f190162000fa0565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b60006200100962000780565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b81526004016200104793929190620017a9565b60206040518083038186803b1580156200106057600080fd5b505afa15801562001075573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000e4d919062001494565b60008060ff60f81b838686604051602001620010bb949392919062001686565b60408051808303601f19018152919052805160209091012095945050505050565b6000620010e862000d55565b6000620010f583620011a3565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b62000d52817f42414c0000000000000000000000000000000000000000000000000000000000620011e7565b60006060620011b28362000c2b565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811662000e4d573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60408051808201909152606081526000602082015290565b611e7e8062001aa183390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200139a57805160ff1916838001178555620013ca565b82800160010185558215620013ca579182015b82811115620013ca578251825591602001919060010190620013ad565b50620013d8929150620013dc565b5090565b5b80821115620013d85760008155600101620013dd565b600082601f83011262001404578081fd5b813567ffffffffffffffff808211156200141c578283fd5b6040516020601f19601f85011682010181811083821117156200143d578485fd5b6040528281529250828483016020018610156200145957600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121562001487578081fd5b813562000e4d8162001a7d565b600060208284031215620014a6578081fd5b8151801515811462000e4d578182fd5b600060208284031215620014c8578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811462000e4d578182fd5b6000602082840312156200150a578081fd5b815162000e4d8162001a7d565b600080600080600080600080610100898b03121562001534578384fd5b883567ffffffffffffffff808211156200154c578586fd5b6200155a8c838d01620013f3565b995060208b013591508082111562001570578586fd5b506200157f8b828c01620013f3565b9750506040890135620015928162001a7d565b95506060890135620015a48162001a7d565b94506080890135935060a0890135925060c0890135620015c48162001a7d565b8092505060e089013590509295985092959890939650565b600060208284031215620015ee578081fd5b5035919050565b6000806040838503121562001608578182fd5b82359150602083013567ffffffffffffffff81111562001626578182fd5b6200163485828601620013f3565b9150509250929050565b73ffffffffffffffffffffffffffffffffffffffff169052565b600081518084526200167281602086016020860162001a4a565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b600083516200172e81846020880162001a4a565b8351908301906200174481836020880162001a4a565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000e4d602083018462001658565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b6020808252601e908201527f50726f746f636f6c20494420616c726561647920726567697374657265640000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601a908201527f50726f746f636f6c204944206e6f742072656769737465726564000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b6000602082526200194a6020830184516200163e565b6020830151610180806040850152620019686101a085018362001658565b91506040850151601f198086850301606087015262001988848362001658565b935060608701519150620019a060808701836200163e565b60808701519150620019b660a08701836200163e565b60a08701519150620019cc60c08701836200163e565b60c087015160e087810191909152870151610100808801919091528701516101208088019190915287015161014080880191909152870151915061016062001a17818801846200163e565b87015186850390910183870152905062001a32838262001658565b9695505050505050565b918252602082015260400190565b60005b8381101562001a6757818101518382015260200162001a4d565b8381111562001a77576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000d5257600080fdfe6101606040523480156200001257600080fd5b5060405162001e7e38038062001e7e833981016040819052620000359162000462565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000378565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200012591908101906200039e565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000449565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000449565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000378565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000378565b6001600160601b0319606091821b811660e05292811b8316610120521b166101405250620004e0915050565b6000602082840312156200038a578081fd5b81516200039781620004c7565b9392505050565b60006020808385031215620003b1578182fd5b82516001600160401b0380821115620003c8578384fd5b818501915085601f830112620003dc578384fd5b815181811115620003eb578485fd5b8381029150620003fd848301620004a0565b8181528481019084860184860187018a101562000418578788fd5b8795505b838610156200043c5780518352600195909501949186019186016200041c565b5098975050505050505050565b6000602082840312156200045b578081fd5b5051919050565b6000806040838503121562000475578081fd5b82516200048281620004c7565b60208401519092506200049581620004c7565b809150509250929050565b6040518181016001600160401b0381118282101715620004bf57600080fd5b604052919050565b6001600160a01b0381168114620004dd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c6118bb620005c36000398061050952806108215250806101335280610c145280610f335280610f955250806103bf52508061046c5280610599528061074852806108ec5280610cbf528061102952806110f3528061115552508060ea5280610190528061043052806105cc528061063152806106d2528061078452806108b152806110d152508061016f5280610402528061071a5280610a7d5280610b5c5280610dbb5280610e9a5250806099528061030952506118bb6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611588565b60405180910390f35b610077610072366004611446565b6100bb565b60405161005b9190611824565b610077610092366004611462565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc92919061173d565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c91906114e8565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a939291906115d0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a491906114c5565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f5611393565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c96113f6565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611761565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059291906114ad565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d4f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611588565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b691906114ad565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fca565b9695505050505050565b600061070d611393565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e16113f6565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611761565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa91906114ad565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fe9565b6110b7565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d4f565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a919061156c565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b6919061148d565b6101a26111e8565b60006109cd82151560046111e8565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b60056111e8565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f61141d565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016116b9565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517fead5d35900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ead5d35990610cf99030908590600190600401611650565b6040805180830381600087803b158015610d1257600080fd5b505af1158015610d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4a91906114c5565b505050565b6040805160028082526060828101909352816020015b610d6d61141d565b815260200190600190039081610d65579050509050600281600081518110610d9157fe5b6020026020010151600001906002811115610da857fe5b90816002811115610db557fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de757fe5b602002602001015160200181815250508181600081518110610e0557fe5b602002602001015160600181815250508281600081518110610e2357fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e7057fe5b6020026020010151600001906002811115610e8757fe5b90816002811115610e9457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec657fe5b602002602001015160200181815250508181600181518110610ee457fe5b602002602001015160600181815250508281600181518110610f0257fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f589084167f0000000000000000000000000000000000000000000000000000000000000000846111f6565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016116b9565b610d4a8363a9059cbb60e01b848460405160240161027a92919061162a565b6040517ff57d0b4000000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f57d0b409061105e908590600401611824565b60206040518083038186803b15801561107657600080fd5b505afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae91906114ad565b60010192915050565b61111873ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f0000000000000000000000000000000000000000000000000000000000000000836111f6565b6040517f2f2cab8700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632f2cab87906111929030908590600090600190600401611680565b602060405180830381600087803b1580156111ac57600080fd5b505af11580156111c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e491906114ad565b5050565b816111e4576111e4816112eb565b80158015906112a757506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e9061125490309086906004016115a9565b60206040518083038186803b15801561126c57600080fd5b505afa158015611280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a491906114ad565b15155b156112cc576112cc8363095ea7b360e01b84600060405160240161027a929190611601565b610d4a8363095ea7b360e01b848460405160240161027a92919061162a565b611315817f42414c0000000000000000000000000000000000000000000000000000000000611318565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b600060208284031215611457578081fd5b813561011b81611863565b60008060408385031215611474578081fd5b823561147f81611863565b946020939093013593505050565b60006020828403121561149e578081fd5b8151801515811461011b578182fd5b6000602082840312156114be578081fd5b5051919050565b600080604083850312156114d7578182fd5b505080516020909101519092909150565b600080600080608085870312156114fd578182fd5b845193506020850151925060408501519150606085015161151d81611863565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161157e81846020870161182d565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff93909316835260208301919091521515604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff949094168452602084019290925261ffff1660408301521515606082015260800190565b602080825282518282018190526000919060409081850190868401855b828110156117305781518051600381106116ec57fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff168686015260609081015190850152608090930192908501906001016116d6565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a0830152602084015161177c81611859565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c06101408401528051806101608501526101806117e8828287016020860161182d565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b6020830184611528565b90815260200190565b60005b83811015611848578181015183820152602001611830565b838111156102fc5750506000910152565b6002811061131557fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461131557600080fdfea2646970667358221220b458099b8cd35b3909154454d41c0d96d31b97558e761dec7f824ddc9307ab7c64736f6c63430007010033a2646970667358221220433eeec5f934cf3756cd8ff1b5833684ad89bd8f21a9ac1ab5d3140de9b5fe9b64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/index.ts b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/index.ts new file mode 100644 index 0000000..fb6528b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/index.ts @@ -0,0 +1,104 @@ +import { bn } from '@helpers/numbers'; +import { Task, TaskMode, TaskRunOptions } from '@src'; +import { AaveLinearPoolDeployment } from './input'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import * as expectEvent from '@helpers/expectEvent'; +import { ethers } from 'hardhat'; +import { getContractDeploymentTransactionHash, saveContractDeploymentTransactionHash } from '@src'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as AaveLinearPoolDeployment; + const args = [ + input.Vault, + input.ProtocolFeePercentagesProvider, + input.BalancerQueries, + input.FactoryVersion, + input.PoolVersion, + input.InitialPauseWindowDuration, + input.BufferPeriodDuration, + ]; + + const factory = await task.deployAndVerify('AaveLinearPoolFactory', args, from, force); + + if (task.mode === TaskMode.LIVE) { + // We also create a Pool using the factory and verify it, to let us compute their action IDs and so that future + // Pools are automatically verified. We however don't run any of this code in CHECK mode, since we don't care about + // the contracts deployed here. The action IDs will be checked to be correct via a different mechanism. + + // AaveLinearPools require a StaticAToken, which in turn requires a LendingPool. + // These contracts come from 20230410-aave-linear-pool-v5 task + const mockLendingPool = await task.deployAndVerify('MockAaveLendingPool', [], from, force); + const mockStaticATokenArgs = ['DO NOT USE - Mock Static AToken', 'TEST', 18, input.WETH, mockLendingPool.address]; + const mockStaticAToken = await task.deployAndVerify('MockStaticAToken', mockStaticATokenArgs, from, force); + + // The assetManager, pauseWindowDuration and bufferPeriodDuration will be filled in later, but we need to declare + // them here to appease the type system. Those are constructor arguments, but automatically provided by the factory. + const mockPoolArgs = { + vault: input.Vault, + name: 'DO NOT USE - Mock Linear Pool', + symbol: 'TEST', + mainToken: input.WETH, + wrappedToken: mockStaticAToken.address, + assetManager: undefined, + upperTarget: 0, + pauseWindowDuration: undefined, + bufferPeriodDuration: undefined, + swapFeePercentage: bn(1e12), + owner: ZERO_ADDRESS, + version: input.PoolVersion, + }; + + // This mimics the logic inside task.deploy + if (force || !task.output({ ensure: false })['MockAaveLinearPool']) { + const PROTOCOL_ID = 0; + + const poolCreationReceipt = await ( + await factory.create( + mockPoolArgs.name, + mockPoolArgs.symbol, + mockPoolArgs.mainToken, + mockPoolArgs.wrappedToken, + mockPoolArgs.upperTarget, + mockPoolArgs.swapFeePercentage, + mockPoolArgs.owner, + PROTOCOL_ID + ) + ).wait(); + const event = expectEvent.inReceipt(poolCreationReceipt, 'PoolCreated'); + const mockPoolAddress = event.args.pool; + + await saveContractDeploymentTransactionHash(mockPoolAddress, poolCreationReceipt.transactionHash, task.network); + await task.save({ MockAaveLinearPool: mockPoolAddress }); + } + + const mockPool = await task.instanceAt('AaveLinearPool', task.output()['MockAaveLinearPool']); + + // In order to verify the Pool's code, we need to complete its constructor arguments by computing the factory + // provided arguments (asset manager and pause durations). + + // The asset manager is found by querying the Vault + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, task.network); + const vault = await vaultTask.deployedInstance('Vault'); + + const { assetManager: assetManagerAddress } = await vault.getPoolTokenInfo(await mockPool.getPoolId(), input.WETH); + mockPoolArgs.assetManager = assetManagerAddress; + + // The durations require knowing when the Pool was created, so we look for the timestamp of its creation block. + const txHash = await getContractDeploymentTransactionHash(mockPool.address, task.network); + const tx = await ethers.provider.getTransactionReceipt(txHash); + const poolCreationBlock = await ethers.provider.getBlock(tx.blockNumber); + + // With those and the period end times, we can compute the durations. + const { pauseWindowEndTime, bufferPeriodEndTime } = await mockPool.getPausedState(); + mockPoolArgs.pauseWindowDuration = pauseWindowEndTime.sub(poolCreationBlock.timestamp); + mockPoolArgs.bufferPeriodDuration = bufferPeriodEndTime + .sub(poolCreationBlock.timestamp) + .sub(mockPoolArgs.pauseWindowDuration); + + // We are now ready to verify the Pool + await task.verify('AaveLinearPool', mockPool.address, [mockPoolArgs]); + + // We can also verify the Asset Manager + await task.verify('AaveLinearPoolRebalancer', assetManagerAddress, [input.Vault, input.BalancerQueries]); + } +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/input.ts b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/input.ts new file mode 100644 index 0000000..d3da699 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/input.ts @@ -0,0 +1,31 @@ +import { Task, TaskMode } from '@src'; +import { MONTH } from '@helpers/time'; + +export type AaveLinearPoolDeployment = { + Vault: string; + BalancerQueries: string; + ProtocolFeePercentagesProvider: string; + WETH: string; + FactoryVersion: string; + PoolVersion: string; + InitialPauseWindowDuration: number; + BufferPeriodDuration: number; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerQueries = new Task('20220721-balancer-queries', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); +const WETH = new Task('00000000-tokens', TaskMode.READ_ONLY); + +const BaseVersion = { version: 3, deployment: '20221207-aave-rebalanced-linear-pool-v3' }; + +export default { + Vault, + BalancerQueries, + ProtocolFeePercentagesProvider, + WETH, + FactoryVersion: JSON.stringify({ name: 'AaveLinearPoolFactory', ...BaseVersion }), + PoolVersion: JSON.stringify({ name: 'AaveLinearPool', ...BaseVersion }), + InitialPauseWindowDuration: MONTH * 3, + BufferPeriodDuration: MONTH, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/output/arbitrum.json new file mode 100644 index 0000000..c72606b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/output/arbitrum.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0xa2D801064652A269D92EE2A59F3261155ec66830", + "MockAaveLendingPool": "0xAB093cd16e765b5B23D34030aaFaF026558e0A19", + "MockStaticAToken": "0x16ba924752EF283C7946db8A122a6742AA35C1DC", + "MockAaveLinearPool": "0xa612B6AeD2E7ca1A3a4f23FbcA9128461bBB7718" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/output/bsc.json b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/output/bsc.json new file mode 100644 index 0000000..8571f65 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/output/bsc.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0x1cbbE6cEa5E4fE7D69c586b4e362A646DEEf105d", + "MockAaveLendingPool": "0x4C4287b07d293E361281bCeEe8715c8CDeB64E34", + "MockStaticAToken": "0x6d471c05f8A99Bd8f991467A8283e3DC968b8D7c", + "MockAaveLinearPool": "0x1a505Ba1cA84D1A4dCF14c8E4866e556B060c974" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/output/gnosis.json b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/output/gnosis.json new file mode 100644 index 0000000..7bab85e --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/output/gnosis.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0x9dd5Db2d38b50bEF682cE532bCca5DfD203915E1", + "MockAaveLendingPool": "0x9805dcfD25e6De36bad8fe9D3Fe2c9b44B764102", + "MockStaticAToken": "0x5cF4928a3205728bd12830E1840F7DB85c62a4B9", + "MockAaveLinearPool": "0x581Ec1f5e7CeD12B186deaE32256AdB53BDd5B08" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/output/goerli.json new file mode 100644 index 0000000..d296f4e --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/output/goerli.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0x70Bbd023481788e443472e123AB963e5EBF58D06", + "MockAaveLendingPool": "0xBF6d7e9a6db814D2856c9e2f83442f60f9D40738", + "MockStaticAToken": "0xAAda0aF3FA5C819145dA760bab8F180DaeeA8514", + "MockAaveLinearPool": "0xf93F6382913d1dE6Bdf683A94be8349751af8d59" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/output/mainnet.json new file mode 100644 index 0000000..7f56dcf --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/output/mainnet.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0x7d833FEF5BB92ddb578DA85fc0c35cD5Cc00Fb3e", + "MockAaveLendingPool": "0x9061D0D56F162D3de7f855828A34ace1eEd3a5BE", + "MockStaticAToken": "0xf9F5E0f3f74F57755a8c8be7b2FeDcAa40673080", + "MockAaveLinearPool": "0x813E3fE1761f714c502d1d2d3a7CCEB33f37F59D" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/output/optimism.json b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/output/optimism.json new file mode 100644 index 0000000..91560c5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/output/optimism.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0xAd3CC7852382C09fdCE54784292c6aB7fb9Df917", + "MockAaveLendingPool": "0x56017074321ce77E2F88F2233830f5b29d4cf595", + "MockStaticAToken": "0xcA96C4f198d343E251b1a01F3EBA061ef3DA73C1", + "MockAaveLinearPool": "0x5936497ffE0dBA0eF272D6301D65c0122862971A" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/output/polygon.json new file mode 100644 index 0000000..5aec3e9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/output/polygon.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0x35c425234DC42e7402f54cC54573f77842963a56", + "MockAaveLendingPool": "0x1bbfa323155526F54EEc458571Bb5A75e0c41507", + "MockStaticAToken": "0xD487eec3EF2Be7a3d06D37F406d878DC7c50deEF", + "MockAaveLinearPool": "0xFA2C0bd8327C99db5bdE4c9e9E5cbF30946351bb" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/readme.md b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/readme.md new file mode 100644 index 0000000..5243045 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/readme.md @@ -0,0 +1,23 @@ +# 2022-12-07 - Aave Rebalanced Linear Pool v3 + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> Superseded by [Aave Linear Pool V4](../20230206-aave-rebalanced-linear-pool-v4/), which fixes the reentrancy issue described in this [forum post](https://forum.balancer.fi/t/reentrancy-vulnerability-scope-expanded/4345). + +Deployment of the `AaveLinearPoolFactory`, for Linear Pools with a wrapped aToken. This new deployment includes: + +- A fix for the `AaveLinearPool` being susceptible to spoofed revert data from the external call to fetch the wrapped token rate, potentially resulting in manipulation of the exchange rate used by `AaveLinearPoolRebalancer`. +- A fix for the `AaveLinearPoolRebalancer` to handle tokens which do not allow setting an approval without first setting the approval to zero. + +This is version 3 because it is the third generation of Aave Linear Pools, the other two being `20211208-aave-linear-pool` and `20220817-aave-rebalanced-linear-pool`. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`AaveLinearPoolFactory` artifact](./artifact/AaveLinearPoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/test/test.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/test/test.fork.ts new file mode 100644 index 0000000..ba882ac --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20221207-aave-rebalanced-linear-pool-v3/test/test.fork.ts @@ -0,0 +1,332 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { setCode } from '@nomicfoundation/hardhat-network-helpers'; +import * as expectEvent from '@helpers/expectEvent'; +import { bn, fp, FP_ONE } from '@helpers/numbers'; +import { MAX_UINT256 } from '@helpers/constants'; +import { instanceAt, getArtifact } from '@src'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { SwapKind } from '@helpers/models/types/types'; +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode, getSigners } from '@src'; + +describeForkTest('AaveLinearPoolFactory', 'mainnet', 15225000, function () { + let owner: SignerWithAddress, holder: SignerWithAddress, other: SignerWithAddress; + let factory: Contract, vault: Contract, usdt: Contract; + let rebalancer: Contract; + + let task: Task; + + const USDT = '0xdAC17F958D2ee523a2206206994597C13D831ec7'; + const waUSDT = '0xf8Fd466F12e236f4c96F7Cce6c79EAdB819abF58'; + const USDT_LENDING_POOL = '0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9'; + + const USDT_SCALING = bn(1e12); // USDT has 6 decimals, so its scaling factor is 1e12 + + const USDT_HOLDER = '0x5754284f345afc66a98fbb0a0afe71e0f007b949'; + + const SWAP_FEE_PERCENTAGE = fp(0.01); // 1% + + // The targets are set using 18 decimals, even if the token has fewer (as is the case for USDT); + const INITIAL_UPPER_TARGET = fp(1e7); + + // The initial midpoint (upper target / 2) must be between the final lower and upper targets + const FINAL_LOWER_TARGET = fp(0.2e7); + const FINAL_UPPER_TARGET = fp(5e7); + + const PROTOCOL_ID = 0; + + let pool: Contract; + let poolId: string; + + before('run task', async () => { + task = new Task('20221207-aave-rebalanced-linear-pool-v3', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('AaveLinearPoolFactory'); + }); + + before('load signers', async () => { + [, owner, other] = await getSigners(); + + holder = await impersonate(USDT_HOLDER, fp(100)); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + + usdt = await task.instanceAt('IERC20', USDT); + await usdt.connect(holder).approve(vault.address, MAX_UINT256); + }); + + enum LinearPoolState { + BALANCED, + MAIN_EXCESS, + MAIN_LACK, + } + + function itRebalancesThePool(expectedState: LinearPoolState) { + it('rebalance the pool', async () => { + const { lowerTarget, upperTarget } = await pool.getTargets(); + + const { cash } = await vault.getPoolTokenInfo(poolId, USDT); + const scaledCash = cash.mul(USDT_SCALING); + + let fees; + if (scaledCash.gt(upperTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_EXCESS); + + const excess = scaledCash.sub(upperTarget); + fees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else if (scaledCash.lt(lowerTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_LACK); + + const lack = lowerTarget.sub(scaledCash); + fees = lack.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else { + expect(expectedState).to.equal(LinearPoolState.BALANCED); + + fees = 0; + } + + const initialRecipientMainBalance = await usdt.balanceOf(other.address); + if (expectedState != LinearPoolState.BALANCED) { + await rebalancer.connect(holder).rebalance(other.address); + } else { + await rebalancer.connect(holder).rebalanceWithExtraMain(other.address, 5); + } + const finalRecipientMainBalance = await usdt.balanceOf(other.address); + + if (fees > 0) { + // The recipient of the rebalance call should get the fees that were collected (though there's some rounding + // error in the main-wrapped conversion). + expect(finalRecipientMainBalance.sub(initialRecipientMainBalance)).to.be.almostEqual( + fees.div(USDT_SCALING), + 0.00000001 + ); + } else { + // The recipient of the rebalance call will get any extra main tokens that were not utilized. + expect(finalRecipientMainBalance).to.be.almostEqual(initialRecipientMainBalance, 0.00000001); + } + + const mainInfo = await vault.getPoolTokenInfo(poolId, USDT); + + const expectedMainBalance = lowerTarget.add(upperTarget).div(2); + expect(mainInfo.cash.mul(USDT_SCALING)).to.equal(expectedMainBalance); + expect(mainInfo.managed).to.equal(0); + }); + } + + describe('create and check getters', () => { + it('deploy a linear pool', async () => { + const tx = await factory.create( + '', + '', + USDT, + waUSDT, + INITIAL_UPPER_TARGET, + SWAP_FEE_PERCENTAGE, + owner.address, + PROTOCOL_ID + ); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await task.instanceAt('AaveLinearPool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + const { assetManager } = await vault.getPoolTokenInfo(poolId, USDT); // We could query for either USDT or waUSDT + rebalancer = await task.instanceAt('AaveLinearPoolRebalancer', assetManager); + + await usdt.connect(holder).approve(rebalancer.address, MAX_UINT256); // To send extra main on rebalance + }); + + it('check factory version', async () => { + const expectedFactoryVersion = { + name: 'AaveLinearPoolFactory', + version: 3, + deployment: '20221207-aave-rebalanced-linear-pool-v3', + }; + + expect(await factory.version()).to.equal(JSON.stringify(expectedFactoryVersion)); + }); + + it('check pool version', async () => { + const expectedPoolVersion = { + name: 'AaveLinearPool', + version: 3, + deployment: '20221207-aave-rebalanced-linear-pool-v3', + }; + + expect(await pool.version()).to.equal(JSON.stringify(expectedPoolVersion)); + }); + }); + + describe('join, and rebalance', () => { + it('join the pool', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const joinAmount = INITIAL_UPPER_TARGET.mul(2).div(USDT_SCALING); + + await vault + .connect(holder) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: USDT, assetOut: pool.address, amount: joinAmount, userData: '0x' }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert join amount - some fees will be collected as we're going over the upper target. + const excess = joinAmount.mul(USDT_SCALING).sub(INITIAL_UPPER_TARGET); + const joinCollectedFees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + + const expectedBPT = joinAmount.mul(USDT_SCALING).sub(joinCollectedFees); + expect(await pool.balanceOf(holder.address)).to.equal(expectedBPT); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + + it('set final targets', async () => { + await pool.connect(owner).setTargets(FINAL_LOWER_TARGET, FINAL_UPPER_TARGET); + }); + }); + + describe('generate excess of main token and rebalance', () => { + it('deposit main tokens', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const { upperTarget } = await pool.getTargets(); + const joinAmount = upperTarget.mul(5).div(USDT_SCALING); + + await vault + .connect(holder) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: USDT, assetOut: pool.address, amount: joinAmount, userData: '0x' }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + }); + + describe('generate lack of main token and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to withdraw enough man token to bring the Pool below its lower target, which will let us later + // rebalance. + + const { cash } = await vault.getPoolTokenInfo(poolId, USDT); + const scaledCash = cash.mul(USDT_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(USDT_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDT, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_LACK); + }); + + describe('join below upper target and rebalance', () => { + it('deposit main tokens', async () => { + // We're going to join with few tokens, causing the Pool to not reach its upper target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const joinAmount = midpoint.div(100).div(USDT_SCALING); + + await vault + .connect(holder) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: USDT, assetOut: pool.address, amount: joinAmount, userData: '0x' }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('exit above lower target and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to exit with few tokens, causing for the Pool to not reach its lower target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const exitAmount = midpoint.div(100).div(USDT_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDT, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalance repeatedly', () => { + itRebalancesThePool(LinearPoolState.BALANCED); + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalancer query protection', async () => { + it('reverts with a malicious lending pool', async () => { + const { cash } = await vault.getPoolTokenInfo(poolId, USDT); + const scaledCash = cash.mul(USDT_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(USDT_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDT, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + + // MockAaveLendingPool comes from 20230410-aave-linear-pool-v5 task + await setCode(USDT_LENDING_POOL, getArtifact('MockAaveLendingPool').deployedBytecode); + const mockLendingPool = await instanceAt('MockAaveLendingPool', USDT_LENDING_POOL); + + await mockLendingPool.setRevertType(2); // Type 2 is malicious swap query revert + await expect(rebalancer.rebalance(other.address)).to.be.revertedWith('BAL#357'); // MALICIOUS_QUERY_REVERT + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/artifact/GaugeAdder.json b/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/artifact/GaugeAdder.json new file mode 100644 index 0000000..5c62810 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/artifact/GaugeAdder.json @@ -0,0 +1,280 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GaugeAdder", + "sourceName": "contracts/admin/GaugeAdder.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IGaugeController", + "name": "gaugeController", + "type": "address" + }, + { + "internalType": "contract IAuthorizerAdaptorEntrypoint", + "name": "authorizerAdaptorEntrypoint", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "enum IGaugeAdder.GaugeType", + "name": "gaugeType", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "contract ILiquidityGaugeFactory", + "name": "gaugeFactory", + "type": "address" + } + ], + "name": "GaugeFactoryAdded", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "rootGauge", + "type": "address" + } + ], + "name": "addArbitrumGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IStakingLiquidityGauge", + "name": "gauge", + "type": "address" + } + ], + "name": "addEthereumGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ILiquidityGaugeFactory", + "name": "factory", + "type": "address" + }, + { + "internalType": "enum IGaugeAdder.GaugeType", + "name": "gaugeType", + "type": "uint8" + } + ], + "name": "addGaugeFactory", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "rootGauge", + "type": "address" + } + ], + "name": "addGnosisGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "rootGauge", + "type": "address" + } + ], + "name": "addOptimismGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "rootGauge", + "type": "address" + } + ], + "name": "addPolygonGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "rootGauge", + "type": "address" + } + ], + "name": "addZKSyncGauge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizerAdaptorEntrypoint", + "outputs": [ + { + "internalType": "contract IAuthorizerAdaptorEntrypoint", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IGaugeAdder.GaugeType", + "name": "gaugeType", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getFactoryForGaugeType", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "enum IGaugeAdder.GaugeType", + "name": "gaugeType", + "type": "uint8" + } + ], + "name": "getFactoryForGaugeTypeCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeController", + "outputs": [ + { + "internalType": "contract IGaugeController", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + }, + { + "internalType": "enum IGaugeAdder.GaugeType", + "name": "gaugeType", + "type": "uint8" + } + ], + "name": "isGaugeFromValidFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x61010060405234801561001157600080fd5b5060405161135c38038061135c8339818101604052604081101561003457600080fd5b508051602091820151604080516303e1469160e61b81529051929391926001600160a01b0385169263f851a4409260048082019391829003018186803b15801561007d57600080fd5b505afa158015610091573d6000803e3d6000fd5b505050506040513d60208110156100a757600080fd5b5051604080516311b2515f60e31b815290516001600160a01b0390921691638d928af891600480820192602092909190829003018186803b1580156100eb57600080fd5b505afa1580156100ff573d6000803e3d6000fd5b505050506040513d602081101561011557600080fd5b505130608052606090811b6001600160601b031990811660a052600160008190559184901b1660c05280546001600160a01b0319166001600160a01b038381169190911790915560408051637e062a3560e11b815290519184169163fc0c546a91600480820192602092909190829003018186803b15801561019657600080fd5b505afa1580156101aa573d6000803e3d6000fd5b505050506040513d60208110156101c057600080fd5b50516001600160601b031960609190911b1660e052505060805160a05160601c60c05160601c60e05160601c61113d61021f6000398061049a5250806103f852806105445280610bf45250806108f4525080610887525061113d6000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c8063851c1bb311610097578063bf2972d511610066578063bf2972d5146102e1578063c86f3a3914610314578063f3d8b4cf14610347578063f87fcfa214610367576100f5565b8063851c1bb3146102305780638d928af814610281578063aaabadc514610289578063abfca00914610291576100f5565b80635e45a273116100d35780635e45a273146101865780636440e973146101b95780637afcf0e6146101f55780638171bad9146101fd576100f5565b80633c6fc5a9146100fa57806352854ed71461012f57806358de9ade1461017e575b600080fd5b61012d6004803603602081101561011057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661039a565b005b6101556004803603604081101561014557600080fd5b5060ff81351690602001356103b0565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101556103f6565b61012d6004803603602081101561019c57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661041a565b61012d600480360360408110156101cf57600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013560ff1661053a565b610155610852565b61012d6004803603602081101561021357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661086e565b61026f6004803603602081101561024657600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016610881565b60408051918252519081900360200190f35b6101556108f2565b610155610916565b6102cd600480360360408110156102a757600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013560ff16610996565b604080519115158252519081900360200190f35b61012d600480360360208110156102f757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610a9d565b61012d6004803603602081101561032a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610ab0565b61026f6004803603602081101561035d57600080fd5b503560ff16610ac3565b61012d6004803603602081101561037d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610af6565b6103a2610b09565b6103ad816007610b4f565b50565b60006103ed82600260008660078111156103c657fe5b60078111156103d157fe5b8152602001908152602001600020610e6a90919063ffffffff16565b90505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b610422610b09565b60008173ffffffffffffffffffffffffffffffffffffffff166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b15801561046a57600080fd5b505afa15801561047e573d6000803e3d6000fd5b505050506040513d602081101561049457600080fd5b505190507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff908116908216141561052b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806110e16027913960400191505060405180910390fd5b610536826002610b4f565b5050565b610542610b09565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639fba03a16040518163ffffffff1660e01b815260040160206040518083038186803b1580156105a857600080fd5b505afa1580156105bc573d6000803e3d6000fd5b505050506040513d60208110156105d257600080fd5b5051600f0b8160078111156105e357fe5b1061064f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e76616c696420676175676520747970650000000000000000000000000000604482015290519081900360640190fd5b604080517fce3cc8bd00000000000000000000000000000000000000000000000000000000815260006004820152905173ffffffffffffffffffffffffffffffffffffffff84169163ce3cc8bd916024808301926020929190829003018186803b1580156106bc57600080fd5b505afa1580156106d0573d6000803e3d6000fd5b505050506040513d60208110156106e657600080fd5b50511561075457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f496e76616c696420666163746f727920696d706c656d656e746174696f6e0000604482015290519081900360640190fd5b60006002600083600781111561076657fe5b600781111561077157fe5b81526020810191909152604001600020905061078d8184610e86565b6107f857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f466163746f727920616c72656164792061646465640000000000000000000000604482015290519081900360640190fd5b81600781111561080457fe5b6040805173ffffffffffffffffffffffffffffffffffffffff8616815290517f39a43f795b6ee7259df4404784d3b77b09d09d5fee8454c3d641d48a888e188d9181900360200190a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b610876610b09565b6103ad816005610b4f565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006109206108f2565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561096557600080fd5b505afa158015610979573d6000803e3d6000fd5b505050506040513d602081101561098f57600080fd5b5051905090565b600080600260008460078111156109a957fe5b60078111156109b457fe5b8152602001908152602001600020905060006109cf82610f0e565b905060005b81811015610a91576109e68382610f12565b73ffffffffffffffffffffffffffffffffffffffff1663ce3cc8bd876040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610a4c57600080fd5b505afa158015610a60573d6000803e3d6000fd5b505050506040513d6020811015610a7657600080fd5b505115610a8957600193505050506103f0565b6001016109d4565b50600095945050505050565b610aa5610b09565b6103ad816004610b4f565b610ab8610b09565b6103ad816006610b4f565b60006103f060026000846007811115610ad857fe5b6007811115610ae357fe5b8152602001908152602001600020610f0e565b610afe610b09565b6103ad816003610b4f565b6000610b386000357fffffffff0000000000000000000000000000000000000000000000000000000016610881565b90506103ad610b478233610f4c565b610191611015565b610b598282610996565b610bc457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c696420676175676500000000000000000000000000000000000000604482015290519081900360640190fd5b60015460405173ffffffffffffffffffffffffffffffffffffffff84811660248301908152921691634036176a917f0000000000000000000000000000000000000000000000000000000000000000917f3a04f900000000000000000000000000000000000000000000000000000000009187918791604401826007811115610c4957fe5b81526040805180830381526020928301825291820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000978816178152815160e08a901b909716875273ffffffffffffffffffffffffffffffffffffffff881660048801908152602488019283528351604489015283519397909650919450606490910192509080838360005b83811015610d0d578181015183820152602001610cf5565b50505050905090810190601f168015610d3a5780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b158015610d5a57600080fd5b505af1158015610d6e573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015610db557600080fd5b8101908080516040519392919084640100000000821115610dd557600080fd5b908301906020820185811115610dea57600080fd5b8251640100000000811182820188101715610e0457600080fd5b82525081516020918201929091019080838360005b83811015610e31578181015183820152602001610e19565b50505050905090810190601f168015610e5e5780820380516001836020036101000a031916815260200191505b50604052505050505050565b8154600090610e7c9083106064611015565b6103ed8383610f12565b6000610e928383611023565b610f0657508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155855490825282860190935260409020919091556103f0565b5060006103f0565b5490565b6000826000018281548110610f2357fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169392505050565b6000610f56610916565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b158015610fe257600080fd5b505afa158015610ff6573d6000803e3d6000fd5b505050506040513d602081101561100c57600080fd5b50519392505050565b816105365761053681611051565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001919091016020526040902054151590565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526103ad917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fdfe43616e6e6f742061646420676175676520666f722038302f32302042414c2d5745544820425054a26469706673582212202a5e8ef6c93c8491c3cccbaf27de21a942442e8d83fc60aaad23310ad25b822a64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100f55760003560e01c8063851c1bb311610097578063bf2972d511610066578063bf2972d5146102e1578063c86f3a3914610314578063f3d8b4cf14610347578063f87fcfa214610367576100f5565b8063851c1bb3146102305780638d928af814610281578063aaabadc514610289578063abfca00914610291576100f5565b80635e45a273116100d35780635e45a273146101865780636440e973146101b95780637afcf0e6146101f55780638171bad9146101fd576100f5565b80633c6fc5a9146100fa57806352854ed71461012f57806358de9ade1461017e575b600080fd5b61012d6004803603602081101561011057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661039a565b005b6101556004803603604081101561014557600080fd5b5060ff81351690602001356103b0565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101556103f6565b61012d6004803603602081101561019c57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661041a565b61012d600480360360408110156101cf57600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013560ff1661053a565b610155610852565b61012d6004803603602081101561021357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661086e565b61026f6004803603602081101561024657600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016610881565b60408051918252519081900360200190f35b6101556108f2565b610155610916565b6102cd600480360360408110156102a757600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013560ff16610996565b604080519115158252519081900360200190f35b61012d600480360360208110156102f757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610a9d565b61012d6004803603602081101561032a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610ab0565b61026f6004803603602081101561035d57600080fd5b503560ff16610ac3565b61012d6004803603602081101561037d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610af6565b6103a2610b09565b6103ad816007610b4f565b50565b60006103ed82600260008660078111156103c657fe5b60078111156103d157fe5b8152602001908152602001600020610e6a90919063ffffffff16565b90505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b610422610b09565b60008173ffffffffffffffffffffffffffffffffffffffff166382c630666040518163ffffffff1660e01b815260040160206040518083038186803b15801561046a57600080fd5b505afa15801561047e573d6000803e3d6000fd5b505050506040513d602081101561049457600080fd5b505190507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff908116908216141561052b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806110e16027913960400191505060405180910390fd5b610536826002610b4f565b5050565b610542610b09565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639fba03a16040518163ffffffff1660e01b815260040160206040518083038186803b1580156105a857600080fd5b505afa1580156105bc573d6000803e3d6000fd5b505050506040513d60208110156105d257600080fd5b5051600f0b8160078111156105e357fe5b1061064f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e76616c696420676175676520747970650000000000000000000000000000604482015290519081900360640190fd5b604080517fce3cc8bd00000000000000000000000000000000000000000000000000000000815260006004820152905173ffffffffffffffffffffffffffffffffffffffff84169163ce3cc8bd916024808301926020929190829003018186803b1580156106bc57600080fd5b505afa1580156106d0573d6000803e3d6000fd5b505050506040513d60208110156106e657600080fd5b50511561075457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f496e76616c696420666163746f727920696d706c656d656e746174696f6e0000604482015290519081900360640190fd5b60006002600083600781111561076657fe5b600781111561077157fe5b81526020810191909152604001600020905061078d8184610e86565b6107f857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f466163746f727920616c72656164792061646465640000000000000000000000604482015290519081900360640190fd5b81600781111561080457fe5b6040805173ffffffffffffffffffffffffffffffffffffffff8616815290517f39a43f795b6ee7259df4404784d3b77b09d09d5fee8454c3d641d48a888e188d9181900360200190a2505050565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b610876610b09565b6103ad816005610b4f565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006109206108f2565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561096557600080fd5b505afa158015610979573d6000803e3d6000fd5b505050506040513d602081101561098f57600080fd5b5051905090565b600080600260008460078111156109a957fe5b60078111156109b457fe5b8152602001908152602001600020905060006109cf82610f0e565b905060005b81811015610a91576109e68382610f12565b73ffffffffffffffffffffffffffffffffffffffff1663ce3cc8bd876040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610a4c57600080fd5b505afa158015610a60573d6000803e3d6000fd5b505050506040513d6020811015610a7657600080fd5b505115610a8957600193505050506103f0565b6001016109d4565b50600095945050505050565b610aa5610b09565b6103ad816004610b4f565b610ab8610b09565b6103ad816006610b4f565b60006103f060026000846007811115610ad857fe5b6007811115610ae357fe5b8152602001908152602001600020610f0e565b610afe610b09565b6103ad816003610b4f565b6000610b386000357fffffffff0000000000000000000000000000000000000000000000000000000016610881565b90506103ad610b478233610f4c565b610191611015565b610b598282610996565b610bc457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c696420676175676500000000000000000000000000000000000000604482015290519081900360640190fd5b60015460405173ffffffffffffffffffffffffffffffffffffffff84811660248301908152921691634036176a917f0000000000000000000000000000000000000000000000000000000000000000917f3a04f900000000000000000000000000000000000000000000000000000000009187918791604401826007811115610c4957fe5b81526040805180830381526020928301825291820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000978816178152815160e08a901b909716875273ffffffffffffffffffffffffffffffffffffffff881660048801908152602488019283528351604489015283519397909650919450606490910192509080838360005b83811015610d0d578181015183820152602001610cf5565b50505050905090810190601f168015610d3a5780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b158015610d5a57600080fd5b505af1158015610d6e573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015610db557600080fd5b8101908080516040519392919084640100000000821115610dd557600080fd5b908301906020820185811115610dea57600080fd5b8251640100000000811182820188101715610e0457600080fd5b82525081516020918201929091019080838360005b83811015610e31578181015183820152602001610e19565b50505050905090810190601f168015610e5e5780820380516001836020036101000a031916815260200191505b50604052505050505050565b8154600090610e7c9083106064611015565b6103ed8383610f12565b6000610e928383611023565b610f0657508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155855490825282860190935260409020919091556103f0565b5060006103f0565b5490565b6000826000018281548110610f2357fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169392505050565b6000610f56610916565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060206040518083038186803b158015610fe257600080fd5b505afa158015610ff6573d6000803e3d6000fd5b505050506040513d602081101561100c57600080fd5b50519392505050565b816105365761053681611051565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001919091016020526040902054151590565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526103ad917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fdfe43616e6e6f742061646420676175676520666f722038302f32302042414c2d5745544820425054a26469706673582212202a5e8ef6c93c8491c3cccbaf27de21a942442e8d83fc60aaad23310ad25b822a64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/artifact/LiquidityGaugeFactory.json b/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/artifact/LiquidityGaugeFactory.json new file mode 100644 index 0000000..2403adb --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/artifact/LiquidityGaugeFactory.json @@ -0,0 +1,91 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "LiquidityGaugeFactory", + "sourceName": "contracts/gauges/ethereum/LiquidityGaugeFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IStakingLiquidityGauge", + "name": "gauge", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "GaugeCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + }, + { + "internalType": "uint256", + "name": "relativeWeightCap", + "type": "uint256" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeImplementation", + "outputs": [ + { + "internalType": "contract ILiquidityGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "isGaugeFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5060405161049c38038061049c83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610082565b600060208284031215610065578081fd5b81516001600160a01b038116811461007b578182fd5b9392505050565b61040b806100916000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80630ecaea731461004657806339312dee1461006f578063ce3cc8bd14610077575b600080fd5b610059610054366004610322565b610097565b604051610066919061034c565b60405180910390f35b610059610135565b61008a610085366004610300565b610151565b6040516100669190610393565b6000806100a2610180565b6040517fcd6dc68700000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063cd6dc687906100f9908790879060040161036d565b600060405180830381600087803b15801561011357600080fd5b505af1158015610127573d6000803e3d6000fd5b509293505050505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff165b919050565b6000805481906101a59073ffffffffffffffffffffffffffffffffffffffff16610226565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff811661017b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d39061039e565b60405180910390fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461012f57600080fd5b600060208284031215610311578081fd5b61031b83836102dc565b9392505050565b60008060408385031215610334578081fd5b61033e84846102dc565b946020939093013593505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b60208082526016908201527f455243313136373a20637265617465206661696c65640000000000000000000060408201526060019056fea2646970667358221220a97d2f336659dc261d93743164bd518f4c755f4a4f7f21049c2027abfec9a62164736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80630ecaea731461004657806339312dee1461006f578063ce3cc8bd14610077575b600080fd5b610059610054366004610322565b610097565b604051610066919061034c565b60405180910390f35b610059610135565b61008a610085366004610300565b610151565b6040516100669190610393565b6000806100a2610180565b6040517fcd6dc68700000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063cd6dc687906100f9908790879060040161036d565b600060405180830381600087803b15801561011357600080fd5b505af1158015610127573d6000803e3d6000fd5b509293505050505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff165b919050565b6000805481906101a59073ffffffffffffffffffffffffffffffffffffffff16610226565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff811661017b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d39061039e565b60405180910390fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461012f57600080fd5b600060208284031215610311578081fd5b61031b83836102dc565b9392505050565b60008060408385031215610334578081fd5b61033e84846102dc565b946020939093013593505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b60208082526016908201527f455243313136373a20637265617465206661696c65640000000000000000000060408201526060019056fea2646970667358221220a97d2f336659dc261d93743164bd518f4c755f4a4f7f21049c2027abfec9a62164736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/artifact/LiquidityGaugeV5.json b/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/artifact/LiquidityGaugeV5.json new file mode 100644 index 0000000..c6f3480 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/artifact/LiquidityGaugeV5.json @@ -0,0 +1,1084 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "LiquidityGaugeV5", + "sourceName": "@balancer-labs/liquidity-mining/contracts/LiquidityGaugeV5.vy", + "abi": [ + { + "name": "Deposit", + "inputs": [ + { + "name": "provider", + "type": "address", + "indexed": true + }, + { + "name": "value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Withdraw", + "inputs": [ + { + "name": "provider", + "type": "address", + "indexed": true + }, + { + "name": "value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "UpdateLiquidityLimit", + "inputs": [ + { + "name": "user", + "type": "address", + "indexed": true + }, + { + "name": "original_balance", + "type": "uint256", + "indexed": false + }, + { + "name": "original_supply", + "type": "uint256", + "indexed": false + }, + { + "name": "working_balance", + "type": "uint256", + "indexed": false + }, + { + "name": "working_supply", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Transfer", + "inputs": [ + { + "name": "_from", + "type": "address", + "indexed": true + }, + { + "name": "_to", + "type": "address", + "indexed": true + }, + { + "name": "_value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Approval", + "inputs": [ + { + "name": "_owner", + "type": "address", + "indexed": true + }, + { + "name": "_spender", + "type": "address", + "indexed": true + }, + { + "name": "_value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "RewardDistributorUpdated", + "inputs": [ + { + "name": "reward_token", + "type": "address", + "indexed": true + }, + { + "name": "distributor", + "type": "address", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "RelativeWeightCapChanged", + "inputs": [ + { + "name": "new_relative_weight_cap", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "stateMutability": "nonpayable", + "type": "constructor", + "inputs": [ + { + "name": "minter", + "type": "address" + }, + { + "name": "veBoostProxy", + "type": "address" + }, + { + "name": "authorizerAdaptor", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit", + "inputs": [ + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit", + "inputs": [ + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_addr", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit", + "inputs": [ + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_addr", + "type": "address" + }, + { + "name": "_claim_rewards", + "type": "bool" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "withdraw", + "inputs": [ + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "withdraw", + "inputs": [ + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_claim_rewards", + "type": "bool" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claim_rewards", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claim_rewards", + "inputs": [ + { + "name": "_addr", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claim_rewards", + "inputs": [ + { + "name": "_addr", + "type": "address" + }, + { + "name": "_receiver", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "transfer", + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "permit", + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_deadline", + "type": "uint256" + }, + { + "name": "_v", + "type": "uint8" + }, + { + "name": "_r", + "type": "bytes32" + }, + { + "name": "_s", + "type": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "increaseAllowance", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_added_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "decreaseAllowance", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_subtracted_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "user_checkpoint", + "inputs": [ + { + "name": "addr", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "set_rewards_receiver", + "inputs": [ + { + "name": "_receiver", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "kick", + "inputs": [ + { + "name": "addr", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit_reward_token", + "inputs": [ + { + "name": "_reward_token", + "type": "address" + }, + { + "name": "_amount", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "add_reward", + "inputs": [ + { + "name": "_reward_token", + "type": "address" + }, + { + "name": "_distributor", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "set_reward_distributor", + "inputs": [ + { + "name": "_reward_token", + "type": "address" + }, + { + "name": "_distributor", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "killGauge", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "unkillGauge", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "claimed_reward", + "inputs": [ + { + "name": "_addr", + "type": "address" + }, + { + "name": "_token", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "claimable_reward", + "inputs": [ + { + "name": "_user", + "type": "address" + }, + { + "name": "_reward_token", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claimable_tokens", + "inputs": [ + { + "name": "addr", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_checkpoint", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "future_epoch_time", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "inflation_rate", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "decimals", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "version", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "allowance", + "inputs": [ + { + "name": "owner", + "type": "address" + }, + { + "name": "spender", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "_lp_token", + "type": "address" + }, + { + "name": "relative_weight_cap", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "setRelativeWeightCap", + "inputs": [ + { + "name": "relative_weight_cap", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "getRelativeWeightCap", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "getCappedRelativeWeight", + "inputs": [ + { + "name": "time", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "pure", + "type": "function", + "name": "getMaxRelativeWeightCap", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "DOMAIN_SEPARATOR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "nonces", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "lp_token", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "is_killed", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_count", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_data", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "components": [ + { + "name": "token", + "type": "address" + }, + { + "name": "distributor", + "type": "address" + }, + { + "name": "period_finish", + "type": "uint256" + }, + { + "name": "rate", + "type": "uint256" + }, + { + "name": "last_update", + "type": "uint256" + }, + { + "name": "integral", + "type": "uint256" + } + ] + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "rewards_receiver", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_integral_for", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "working_balances", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "working_supply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_inv_supply_of", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_checkpoint_of", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_fraction", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "period", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "int128" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_tokens", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "period_timestamp", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_inv_supply", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + } + ], + "bytecode": "0x6020612fa26080396080518060a01c612f9d5760e05260206020612fa2016080396080518060a01c612f9d576101005260206040612fa2016080396080518060a01c612f9d57610120526358de9ade610160526020610160600461017c60e0515afa610070573d600060003e3d6000fd5b601f3d1115612f9d57610160518060a01c612f9d576101405263e6dec36f610180526020610180600461019c60e0515afa6100b0573d600060003e3d6000fd5b601f3d1115612f9d57610180518060a01c612f9d57610160526101605161018052638d928af86101a05260206101a060046101bc610160515afa6100f9573d600060003e3d6000fd5b601f3d1115612f9d576101a0518060a01c612f9d576101e052610120516101a052610140516101c05260e0516102005263dfe05031610220526020610220600461023c610140515afa610151573d600060003e3d6000fd5b601f3d1115612f9d57610220518060a01c612f9d5761026052610100516102205261dead600c55612f3956600436101561000d57611edd565b60046000601c3760005134612db75763b6b55f258118610037573361040052600061042052610086565b636e553f65811861005c576024358060a01c612db75761040052600061042052610086565b6383df67478118610221576024358060a01c612db757610400526044358060011c612db757610420525b600054612db757600160005561040051610160526100a2611fb7565b6000600435146101b4576000600f541415610440526002546104605261044051156100ec576104005160e052610460516101005261042051610120526000610140526100ec612529565b61046080516004358181830110612db7578082019050905081525060016104005160a0526080526040608020546004358181830110612db75780820190509050610480526104805160016104005160a052608052604060802055610460516002556104005160e0526104805161010052610460516101205261016c612956565b6323b872dd6104a052336104c052306104e0526004356105005260206104a060646104bc6000600c545af16101a6573d600060003e3d6000fd5b601f3d1115612db7576104a0505b610400517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c600435610440526020610440a26104005160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600435610440526020610440a36000600055005b632e1a7d4d811861023757600061040052610252565b6338d0743681186103cf576024358060011c612db757610400525b600054612db7576001600055336101605261026b611fb7565b600060043514610368576000600f541415610420526002546104405261042051156102b2573360e052610440516101005261040051610120526000610140526102b2612529565b6104408051600435808210612db7578082039050905081525060013360a052608052604060802054600435808210612db75780820390509050610460526104605160013360a052608052604060802055610440516002553360e05261046051610100526104405161012052610325612956565b63a9059cbb61048052336104a0526004356104c0526020610480604461049c6000600c545af161035a573d600060003e3d6000fd5b601f3d1115612db757610480505b337f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364600435610420526020610420a26000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600435610420526020610420a36000600055005b63e6f1daf281186103ea573361040052600061042052610439565b6384e9bd7e811861040f576004358060a01c612db75761040052600061042052610439565b639faceb1b8118610486576004358060a01c612db757610400526024358060a01c612db757610420525b600054612db75760016000556000610420511461045b57336104005118612db7575b6104005160e05260025461010052600161012052610420516101405261047f612529565b6000600055005b6323b872dd8118610569576004358060a01c612db7576104c0526024358060a01c612db7576104e052600054612db75760016000556104c05160e05233610100526104d2610520611ee3565b61052051610500527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61050051146105385761050051604435808210612db7578082039050905060036104c05160a05260805260406080203360a0526080526040608020555b6104c051610400526104e0516104205260443561044052610557612b40565b60016105205260206105206000600055f35b63a9059cbb81186105bd576004358060a01c612db7576104c052600054612db757600160005533610400526104c05161042052602435610440526105ab612b40565b60016104e05260206104e06000600055f35b63095ea7b38118610635576004358060a01c612db75760e05260243560033360a052608052604060802060e05160a05260805260406080205560e051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602435610100526020610100a36001610100526020610100f35b63d505accf81186109a2576004358060a01c612db75760e0526024358060a01c612db757610100526084358060081c612db75761012052600060e05114612db7576064354211612db757600b60e05160a0526080526040608020546101405260006002610400527f1901000000000000000000000000000000000000000000000000000000000000610420526104006002806020846106000101826020850160045afa505080518201915050600a546020826106000101526020810190507f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96105405260e0516105605261010051610580526044356105a052610140516105c0526064356105e05260c0610520526105208051602082012090506020826106000101526020810190508061060052610600905080516020820120905061016052600060e0513b116107b65760e0516101605161018052610120516101a052604060a46101c03760206080608061018060015afa5060805118612db757610916565b600060a4356102205260c435610240526040610200526102006040806020846102c00101826020850160045afa505080518201915050601f60016020820661026001602082840111612db7576020806102808261012060045afa5050818152905090506001806020846102c00101826020850160045afa505080518201915050806102c0526102c09050805160200180610180828460045afa905050507f1626ba7e00000000000000000000000000000000000000000000000000000000631626ba7e610200526102208060406101605182526020820191508082528083018061018080516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810150505050602061020060c461021c60e0515afa610903573d600060003e3d6000fd5b601f3d1115612db7576102005118612db7575b604435600360e05160a05260805260406080206101005160a0526080526040608020556101405160018181830110612db75780820190509050600b60e05160a0526080526040608020556101005160e0517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925604435610180526020610180a36001610180526020610180f35b63395093518118610a51576004358060a01c612db757610120523360e05261012051610100526109d3610160611ee3565b610160516024358181830110612db75780820190509050610140526101405160033360a05260805260406080206101205160a05260805260406080205561012051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92561014051610160526020610160a36001610160526020610160f35b63a457c2d78118610afe576004358060a01c612db757610120523360e0526101205161010052610a82610160611ee3565b61016051602435808210612db75780820390509050610140526101405160033360a05260805260406080206101205160a05260805260406080205561012051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92561014051610160526020610160a36001610160526020610160f35b634b8200938118610bc3576004358060a01c612db7576103405261034051610380526020606038036080396080516103a05260006103605261036060c060006002818352015b60c05160200261038001513318610b5e5760018352610b6e565b8151600101808352811415610b44575b5050506103605115612db7576103405161016052610b8a611fb7565b6103405160e05260016103405160a0526080526040608020546101005260025461012052610bb6612956565b6001610360526020610360f35b63bdf981168118610bf0576004358060a01c612db75760e05260e05160113360a052608052604060802055005b6396c551758118610da1576004358060a01c612db7576103405260176103405160a0526080526040608020546103605263da020a186103e052610340516104005263010ae7576103a052610340516103c05260206103a060246103bc6020604038036080396080515afa610c69573d600060003e3d6000fd5b601f3d1115612db7576103a0516104205260206103e060446103fc6020604038036080396080515afa610ca1573d600060003e3d6000fd5b601f3d1115612db7576103e0516103805260016103405160a0526080526040608020546103a0526370a082316104005261034051610420526020610400602461041c6020604038036080396080515afa610d00573d600060003e3d6000fd5b601f3d1115612db7576104005115610d2057610360516103805111610d23565b60015b15612db7576103a0516028808202821582848304141715612db7579050905060648082049050905060146103405160a0526080526040608020541115612db7576103405161016052610d73611fb7565b6103405160e05260016103405160a0526080526040608020546101005260025461012052610d9f612956565b005b6393f7aa678118610fb3576004358060a01c612db75761040052600054612db7576001600055600160106104005160a052608052604060802001543318612db757600060e05260025461010052600061012052600061014052610e02612529565b6323b872dd6104645260043361048452306104a4526024356104c45260600161046052610460506020610520610460516104806000610400515af1610e4c573d600060003e3d6000fd5b61050060203d808211610e5f5781610e61565b805b905090508152805160200180610420828460045afa9050505060006104205114610ea057610440516104205181816020036008021c9050905015612db7575b600260106104005160a052608052604060802001546104605261046051421015610f48576104605142808210612db757808203905090506104805261048051600360106104005160a05260805260406080200154808202821582848304141715612db757905090506104a0526024356104a0518181830110612db7578082019050905062093a8080820490509050600360106104005160a05260805260406080200155610f6c565b60243562093a8080820490509050600360106104005160a052608052604060802001555b42600460106104005160a052608052604060802001554262093a808181830110612db75780820190509050600260106104005160a052608052604060802001556000600055005b63e8de0d4d811861109f576004358060a01c612db75760e0526024358060a01c612db7576101005260006101005114612db757602060a038036080396080513318612db757600f54610120526008610120511015612db7576001601060e05160a05260805260406080200154612db757610100516001601060e05160a0526080526040608020015560e0516001610120516008811015612db75702601a01556101205160018181830110612db75780820190509050600f5560e0517f1df95772db25c427e0df149fe4cd5b7c2e970e096ee7305ff86f6e1167281d7b61010051610140526020610140a2005b63058a3a248118611166576004358060a01c612db75760e0526024358060a01c612db757610100526001601060e05160a05260805260406080200154610120526101205133186110f05760016110ff565b602060a0380360803960805133145b15612db75760006101205114612db75760006101005114612db757610100516001601060e05160a0526080526040608020015560e0517f1df95772db25c427e0df149fe4cd5b7c2e970e096ee7305ff86f6e1167281d7b61010051610140526020610140a2005b63ab8f0945811861118a57602060a038036080396080513318612db7576001600d55005b63d34fb26781186111ae57602060a038036080396080513318612db7576000600d55005b63e77e7437811861121a576004358060a01c612db75760e0526024358060a01c612db75761010052601360e05160a05260805260406080206101005160a05260805260406080205470010000000000000000000000000000000080820690509050610120526020610120f35b6333fd6f7481186113ee576004358060a01c612db75760e0526024358060a01c612db75761010052600560106101005160a052608052604060802001546101205260025461014052600061014051146113395742600260106101005160a052608052604060802001548082116112905781611292565b805b905090506101605261016051600460106101005160a05260805260406080200154808210612db7578082039050905061018052610120805161018051600360106101005160a05260805260406080200154808202821582848304141715612db75790509050670de0b6b3a7640000808202821582848304141715612db7579050905061014051808015612db7578204905090508181830110612db757808201905090508152505b60126101005160a052608052604060802060e05160a05260805260406080205461016052600160e05160a0526080526040608020546101205161016051808210612db75780820390509050808202821582848304141715612db75790509050670de0b6b3a76400008082049050905061018052601360e05160a05260805260406080206101005160a05260805260406080205460801c610180518181830110612db757808201905090506101a05260206101a0f35b6333134583811861148d576004358060a01c612db757610340526103405161016052611418611fb7565b60186103405160a052608052604060802054638b752bb0610360526103405161038052306103a0526020610360604461037c6020606038036080396080515afa611467573d600060003e3d6000fd5b601f3d1115612db75761036051808210612db757808203905090506103c05260206103c0f35b63d31f3f6d81186114c05760016019546c01431e0fae6d7217caa0000000811015612db757026022015460e052602060e0f35b63be5d1be981186114da57600e5460d81c60e052602060e0f35b63180692d0811861151557600e547b010000000000000000000000000000000000000000000000000000008082069050905060e052602060e0f35b63313ce567811861152b57601260e052602060e0f35b6354fd4d5081186115c557610120806020808252600660e0527f76352e302e3000000000000000000000000000000000000000000000000000006101005260e0818401808280516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f82010390509050905090508101905090509050610120f35b63dd62ed3e8118611617576004358060a01c612db757610120526024358060a01c612db757610140526101205160e0526101405161010052611608610160611ee3565b61016051610180526020610180f35b63cd6dc6878118611999576004358060a01c612db75761016052600c54612db75761016051600c556395d89b416101c05260606101c060046101dc610160515afa611667573d600060003e3d6000fd5b603f3d1115612db7576101c0516101c0016020815111612db75780805160200180610180828460045afa90509050505060006009610220527f42616c616e636572200000000000000000000000000000000000000000000000610240526102206009806020846102a00101826020850160045afa5050805182019150506101806020806020846102a00101826020850160045afa505080518201915050600e610260527f204761756765204465706f73697400000000000000000000000000000000000061028052610260600e806020846102a00101826020850160045afa505080518201915050806102a0526102a090508051602001806101c0828460045afa905050506101c0806004602082510160c060006003818352015b8260c0516020021115611794576117b3565b60c05160200285015160c0518501558151600101808352811415611782575b50505050505060006101806020806020846102600101826020850160045afa5050805182019150506006610220527f2d67617567650000000000000000000000000000000000000000000000000000610240526102206006806020846102600101826020850160045afa50508051820191505080610260526102609050806007602082510160c060006003818352015b8260c051602002111561185557611874565b60c05160200285015160c0518501558151600101808352811415611843575b5050505050507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610300526101c0805160208201209050610320527f572f01d824885a118d5d21c74542f263b131d2897955c62a721594f1d7c3b2e2610340524661036052306103805260a06102e0526102e0805160208201209050600a554260225563b26b238e610220526020610220600461023c6000602060e038036080396080515af1611929573d600060003e3d6000fd5b601f3d1115612db7576102205160d81b632c4e722e610260526020610260600461027c602060e038036080396080515afa611969573d600060003e3d6000fd5b601f3d1115612db757610260518181830110612db75780820190509050600e5560243560e052611997612cca565b005b6310d3eb0481186119c657602060a038036080396080513318612db75760043560e0526119c4612cca565b005b6383f5c39b81186119e9576c02863c1f5cdae42000000000225460e052602060e0f35b6314e956f58118611a145760043560e052611a05610160611f47565b61016051610180526020610180f35b633547bc7d8118611a3157670de0b6b3a764000060e052602060e0f35b6370a082318118611a66576004358060a01c612db75760e052600160e05160a052608052604060802054610100526020610100f35b6318160ddd8118611a7d5760025460e052602060e0f35b6306fdde038118611b205760e08060208082528083018060048082602082540160c060006003818352015b8260c0516020021115611aba57611ad9565b60c05185015460c0516020028501528151600101808352811415611aa8575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810190509050905060e0f35b6395d89b418118611bc35760e08060208082528083018060078082602082540160c060006003818352015b8260c0516020021115611b5d57611b7c565b60c05185015460c0516020028501528151600101808352811415611b4b575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810190509050905060e0f35b633644e5158118611bda57600a5460e052602060e0f35b637ecebe008118611c0f576004358060a01c612db75760e052600b60e05160a052608052604060802054610100526020610100f35b6382c630668118611c2657600c5460e052602060e0f35b639c868ac08118611c3d57600d5460e052602060e0f35b63963c94b98118611c5457600f5460e052602060e0f35b6348e9c65e8118611cb8576004358060a01c612db75760e052601060e05160a052608052604060802080546101005260018101546101205260028101546101405260038101546101605260048101546101805260058101546101a0525060c0610100f35b6301ddabf18118611ced576004358060a01c612db75760e052601160e05160a052608052604060802054610100526020610100f35b63f05cc0588118611d40576004358060a01c612db75760e0526024358060a01c612db75761010052601260e05160a05260805260406080206101005160a052608052604060802054610120526020610120f35b6313ecb1ca8118611d75576004358060a01c612db75760e052601460e05160a052608052604060802054610100526020610100f35b6317e280898118611d8c5760155460e052602060e0f35b63de263bfa8118611dc1576004358060a01c612db75760e052601660e05160a052608052604060802054610100526020610100f35b639bd324f28118611df6576004358060a01c612db75760e052601760e05160a052608052604060802054610100526020610100f35b63094007078118611e2b576004358060a01c612db75760e052601860e05160a052608052604060802054610100526020610100f35b63ef78d4fd8118611e425760195460e052602060e0f35b6354c49fe98118611e695760016004356008811015612db75702601a015460e052602060e0f35b637598108c8118611e9c5760016004356c01431e0fae6d7217caa0000000811015612db757026022015460e052602060e0f35b63fec8ee0c8118611edb5760016004356c01431e0fae6d7217caa0000000811015612db757026c01431e0fae6d72100000000022015460e052602060e0f35b505b60006000fd5b602060c038036080396080516101005118611f21577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815250611f45565b600360e05160a05260805260406080206101005160a0526080526040608020548152505b565b63d3078c9461010052306101205260e051610140526020610100604461011c6020608038036080396080515afa611f83573d600060003e3d6000fd5b601f3d1115612db757610100516c02863c1f5cdae420000000002254808211611fac5781611fae565b805b90509050815250565b601954610180526001610180516c01431e0fae6d7217caa0000000811015612db75702602201546101a0526001610180516c01431e0fae6d7217caa0000000811015612db757026c01431e0fae6d7210000000002201546101c052600e546101e0526101e0517b0100000000000000000000000000000000000000000000000000000080820690509050610200526101e05160d81c6102205261020051610240526101a051610220511061210057632c4e722e610260526020610260600461027c602060e038036080396080515afa612095573d600060003e3d6000fd5b601f3d1115612db757610260516102405263b26b238e610260526020610260600461027c6000602060e038036080396080515af16120d8573d600060003e3d6000fd5b601f3d1115612db7576102605160d81b610240518181830110612db75780820190509050600e555b600d5415612115576000610200526000610240525b6101a051421115612400576015546102605263615e523761028052306102a0526020608038036080396080513b15612db75760006000602461029c60006020608038036080396080515af161216f573d600060003e3d6000fd5b6101a051610280526101a05162093a808181830110612db7578082019050905062093a808082049050905062093a80808202821582848304141715612db75790509050428082116121c057816121c2565b805b905090506102a0526102c060006101f4818352015b6102a05161028051808210612db757808203905090506102e0526102805162093a808082049050905062093a80808202821582848304141715612db7579050905060e052612226610320611f47565b610320516103005260006102605111156123a6576102805161022051101561224f576000612259565b6102a05161022051105b6122bf576101c080516102005161030051808202821582848304141715612db757905090506102e051808202821582848304141715612db7579050905061026051808015612db7578204905090508181830110612db757808201905090508152506123a6565b6101c080516102005161030051808202821582848304141715612db757905090506102205161028051808210612db75780820390509050808202821582848304141715612db7579050905061026051808015612db7578204905090508181830110612db7578082019050905081525061024051610200526101c080516102005161030051808202821582848304141715612db757905090506102a05161022051808210612db75780820390509050808202821582848304141715612db7579050905061026051808015612db7578204905090508181830110612db757808201905090508152505b426102a051186123b5576123fd565b6102a051610280526102a05162093a808181830110612db75780820190509050428082116123e357816123e5565b805b905090506102a05281516001018083528114156121d7575b50505b610180805160018082018060801d81607f1d18612db7579050905081525061018051601955426001610180516c01431e0fae6d7217caa0000000811015612db75702602201556101c0516001610180516c01431e0fae6d7217caa0000000811015612db757026c01431e0fae6d72100000000022015560146101605160a0526080526040608020546102605260186101605160a05260805260406080208054610260516101c05160166101605160a052608052604060802054808210612db75780820390509050808202821582848304141715612db75790509050670de0b6b3a7640000808204905090508181830110612db757808201905090508155506101c05160166101605160a0526080526040608020554260176101605160a052608052604060802055565b6000610160526101405161018052600060e0511461259557600160e05160a052608052604060802054610160526101205161256557600061256b565b61014051155b1561259557601160e05160a05260805260406080205461018052610180516125955760e051610180525b600f546101a0526101c060006008818352015b6101a0516101c051186125ba57612952565b60016101c0516008811015612db75702601a01546101e052600560106101e05160a052608052604060802001546102005242600260106101e05160a0526080526040608020015480821161260e5781612610565b805b905090506102205261022051600460106101e05160a05260805260406080200154808210612db7578082039050905061024052600061024051146126ff5761022051600460106101e05160a05260805260406080200155600061010051146126ff57610200805161024051600360106101e05160a05260805260406080200154808202821582848304141715612db75790509050670de0b6b3a7640000808202821582848304141715612db7579050905061010051808015612db7578204905090508181830110612db7578082019050905081525061020051600560106101e05160a052608052604060802001555b600060e051146129425760126101e05160a052608052604060802060e05160a05260805260406080205461026052600061028052610200516102605110156127a8576102005160126101e05160a052608052604060802060e05160a052608052604060802055610160516102005161026051808210612db75780820390509050808202821582848304141715612db75790509050670de0b6b3a764000080820490509050610280525b601360e05160a05260805260406080206101e05160a0526080526040608020546102a0526102a05160801c610280518181830110612db757808201905090506102c05260006102c0511115612942576102a051700100000000000000000000000000000000808206905090506102e0526101205161286c576000610280511115612942576102e0516102c05160801b8181830110612db75780820190509050601360e05160a05260805260406080206101e05160a052608052604060802055612942565b63a9059cbb61034452600461018051610364526102c05161038452604001610340526103405060206103e06103405161036060006101e0515af16128b5573d600060003e3d6000fd5b6103c060203d8082116128c857816128ca565b805b905090508152805160200180610300828460045afa905050506000610300511461290957610320516103005181816020036008021c9050905015612db7575b6102e0516102c0518181830110612db75780820190509050601360e05160a05260805260406080206101e05160a0526080526040608020555b81516001018083528114156125a8575b5050565b63bbf7408a6101605260e051610180526020610160602461017c6020602038036080396080515afa61298d573d600060003e3d6000fd5b601f3d1115612db75761016051610140526318160ddd610180526020610180600461019c6020604038036080396080515afa6129ce573d600060003e3d6000fd5b601f3d1115612db7576101805161016052610100516028808202821582848304141715612db75790509050606480820490509050610180526000610160511115612a775761018080516101205161014051808202821582848304141715612db7579050905061016051808015612db757820490509050603c808202821582848304141715612db757905090506064808204905090508181830110612db757808201905090508152505b6101005161018051808211612a8c5781612a8e565b805b9050905061018052601460e05160a0526080526040608020546101a05261018051601460e05160a052608052604060802055601554610180518181830110612db757808201905090506101a051808210612db757808203905090506101c0526101c05160155560e0517f7ecd84343f76a23d2227290e0288da3251b045541698e575a5515af4f04197a3610100516101e052610120516102005261018051610220526101c0516102405260806101e0a2565b6104005161016052612b50611fb7565b6104205161016052612b60611fb7565b60006104405114612c9157600254610460526000600f541415610480526104805115612ba9576104005160e0526104605161010052600061012052600061014052612ba9612529565b60016104005160a05260805260406080205461044051808210612db757808203905090506104a0526104a05160016104005160a0526080526040608020556104005160e0526104a051610100526104605161012052612c06612956565b6104805115612c32576104205160e0526104605161010052600061012052600061014052612c32612529565b60016104205160a052608052604060802054610440518181830110612db757808201905090506104a0526104a05160016104205160a0526080526040608020556104205160e0526104a051610100526104605161012052612c91612956565b61042051610400517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61044051610460526020610460a3565b670de0b6b3a764000060e0511115612d75576034610100527f52656c61746976652077656967687420636170206578636565647320616c6c6f610120527f776564206162736f6c757465206d6178696d756d0000000000000000000000006101405261010050610100518061012001818260206001820306601f82010390500336823750506308c379a060c052602060e0526101005160206001820306601f820103905060440160dcfd5b60e0516c02863c1f5cdae4200000000022557f13e45870490f54cea50d245930d12102c72b502641ef6850d0b15a8c92decfb260e051610100526020610100a1565b600080fd5b61017d612f390361017d6102803961017d612f3903610180518161028001526101a051816102c001526101c051816102e001526101e051816102a001526102005181610300015261022051816103400152610260518161032001528060e001610280f35b600080fd", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/index.ts b/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/index.ts new file mode 100644 index 0000000..7308fdf --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { GaugeAdderDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as GaugeAdderDeployment; + + const gaugeAdderArgs = [input.GaugeController, input.AuthorizerAdaptorEntrypoint]; + await task.deployAndVerify('GaugeAdder', gaugeAdderArgs, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/input.ts b/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/input.ts new file mode 100644 index 0000000..f7074d5 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/input.ts @@ -0,0 +1,22 @@ +import { Task, TaskMode } from '@src'; + +export type GaugeAdderDeployment = { + GaugeController: string; + AuthorizerAdaptorEntrypoint: string; +}; + +const GaugeController = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); +const AuthorizerAdaptorEntrypoint = new Task('20221124-authorizer-adaptor-entrypoint', TaskMode.READ_ONLY); + +export default { + AuthorizerAdaptorEntrypoint, + mainnet: { + GaugeController, + }, + goerli: { + GaugeController, + }, + sepolia: { + GaugeController, + }, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/output/goerli.json new file mode 100644 index 0000000..aef7b38 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/output/goerli.json @@ -0,0 +1,3 @@ +{ + "GaugeAdder": "0xBd35248F8325DD1cB2bBf9D01E80A6bb99a792Dd" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/output/mainnet.json new file mode 100644 index 0000000..36d347a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "GaugeAdder": "0x5efBb12F01f27F0E020565866effC1dA491E91A4" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/output/sepolia.json b/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/output/sepolia.json new file mode 100644 index 0000000..d6eec78 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "GaugeAdder": "0x1DF32616fb1bBaEd07f42F1a1EfD1D0E232AcB4a" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/readme.md b/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/readme.md new file mode 100644 index 0000000..f07da16 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/readme.md @@ -0,0 +1,17 @@ +# 2023-01-09 - GaugeAdder V3 + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> Superseded by [Gauge Adder V4](../../20230519-gauge-adder-v4), introduces dynamic gauge types and canonical gauge factories for each type. + +Deployment of the new `GaugeAdder`, a helper contract which helps prevent some forms of improper configuration on the `GaugeController`. This version adds support for the Authorizer Adapter Entrypoint, and removes the restriction that only allowed a single gauge per pool. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`GaugeAdder` artifact](./artifact/GaugeAdder.json) +- [`LiquidityGaugeFactory` artifact](./artifact/LiquidityGaugeFactory.json) +- [`LiquidityGaugeV5` artifact](./artifact/LiquidityGaugeV5.json) +- [Previous `GaugeAdder` deployment](../20220628-gauge-adder-v2/) diff --git a/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/test/task.fork.ts new file mode 100644 index 0000000..a425ce2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230109-gauge-adder-v3/test/task.fork.ts @@ -0,0 +1,194 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { fp } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import * as expectEvent from '@helpers/expectEvent'; + +import { describeForkTest } from '@src'; +import { Task, TaskMode } from '@src'; +import { getForkedNetwork } from '@src'; +import { getSigner, impersonate } from '@src'; +import { actionId } from '@helpers/models/misc/actions'; +import TimelockAuthorizer from '@helpers/models/authorizer/TimelockAuthorizer'; +import { advanceTime, DAY } from '@helpers/time'; +import { ZERO_ADDRESS } from '@helpers/constants'; + +describeForkTest('GaugeAdderV3', 'mainnet', 16370000, function () { + let factory: Contract; + let adaptorEntrypoint: Contract; + let authorizer: Contract; + let oldAuthorizer: Contract; + let gaugeAdder: Contract; + let daoMultisig: SignerWithAddress; + let gaugeController: Contract; + let migrator: Contract; + let vault: Contract; + + let task: Task; + + const LM_MULTISIG = '0xc38c5f97b34e175ffd35407fc91a937300e33860'; + const LP_TOKEN = '0xbc5F4f9332d8415AAf31180Ab4661c9141CC84E4'; + const DAO_MULTISIG = '0x10a19e7ee7d7f8a52822f6817de8ea18204f2e4f'; + + const weightCap = fp(0.001); + + before('create timelock authorizer', async () => { + const timelockTask = new Task('20221202-timelock-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizer = await timelockTask.deployedInstance('TimelockAuthorizer'); + migrator = await timelockTask.deployedInstance('TimelockAuthorizerMigrator'); + + const adaptorEntrypointTask = new Task('20221124-authorizer-adaptor-entrypoint', TaskMode.READ_ONLY, 'mainnet'); + adaptorEntrypoint = await adaptorEntrypointTask.deployedInstance('AuthorizerAdaptorEntrypoint'); + }); + + before('change authorizer admin to the DAO multisig', async () => { + await migrator.startRootTransfer(); + + daoMultisig = await impersonate(DAO_MULTISIG, fp(100)); + await authorizer.connect(daoMultisig).claimRoot(); + + const authorizerTask = new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)); + oldAuthorizer = await authorizerTask.deployedInstance('Authorizer'); + expect(await migrator.oldAuthorizer()).to.be.eq(oldAuthorizer.address); + + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.deployedInstance('Vault'); + + const setAuthorizerActionId = await actionId(vault, 'setAuthorizer'); + await oldAuthorizer.connect(daoMultisig).grantRolesToMany([setAuthorizerActionId], [migrator.address]); + + await migrator.finalizeMigration(); + }); + + before('run Gauge Adder task', async () => { + task = new Task('20230109-gauge-adder-v3', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + gaugeAdder = await task.deployedInstance('GaugeAdder'); + }); + + context('construction', () => { + it('stores the entrypoint', async () => { + expect(await gaugeAdder.getAuthorizerAdaptorEntrypoint()).to.equal(adaptorEntrypoint.address); + }); + + it('stores the gauge controller', async () => { + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeController = await gaugeControllerTask.deployedInstance('GaugeController'); + + // Ensure we can call functions on the gaugeController + const controllerAdmin = await gaugeController.admin(); + expect(controllerAdmin).to.not.equal(ZERO_ADDRESS); + expect(await gaugeController.gauge_exists(ZERO_ADDRESS)).to.be.false; + + expect(await gaugeAdder.getGaugeController()).to.equal(gaugeController.address); + }); + }); + + context('advanced functions', () => { + let lmMultisig: SignerWithAddress; + let admin: SignerWithAddress; + let gauge: Contract; + + before('load accounts', async () => { + admin = await getSigner(0); + lmMultisig = await impersonate(LM_MULTISIG, fp(100)); + }); + + before('create gauge factory', async () => { + const factoryTask = new Task('20220822-mainnet-gauge-factory-v2', TaskMode.TEST, getForkedNetwork(hre)); + await factoryTask.run({ force: true }); + factory = await factoryTask.deployedInstance('LiquidityGaugeFactory'); + + expect(await factory.isGaugeFromFactory(ZERO_ADDRESS)).to.be.false; + }); + + // We need to grant permission to the admin to add the LiquidityGaugeFactory to the GaugeAdder, and also to add + // gauges from said factory to the GaugeController. + before('grant permissions', async () => { + const addFactoryAction = await actionId(gaugeAdder, 'addGaugeFactory'); + const addGaugeAction = await actionId(gaugeAdder, 'addEthereumGauge'); + const gaugeControllerAddGaugeAction = await actionId( + adaptorEntrypoint, + 'add_gauge(address,int128)', + gaugeController.interface + ); + + await authorizer + .connect(daoMultisig) + .manageGranter(addFactoryAction, lmMultisig.address, TimelockAuthorizer.EVERYWHERE, true); + await authorizer + .connect(daoMultisig) + .manageGranter(addGaugeAction, lmMultisig.address, TimelockAuthorizer.EVERYWHERE, true); + await authorizer + .connect(daoMultisig) + .manageGranter(gaugeControllerAddGaugeAction, lmMultisig.address, TimelockAuthorizer.EVERYWHERE, true); + + let tx = await authorizer + .connect(lmMultisig) + .grantPermissions([addFactoryAction], admin.address, [TimelockAuthorizer.EVERYWHERE]); + expectEvent.inReceipt(await tx.wait(), 'PermissionGranted', { + actionId: addFactoryAction, + account: admin.address, + where: TimelockAuthorizer.EVERYWHERE, + }); + + tx = await authorizer + .connect(lmMultisig) + .grantPermissions([addGaugeAction], admin.address, [TimelockAuthorizer.EVERYWHERE]); + expectEvent.inReceipt(await tx.wait(), 'PermissionGranted', { + actionId: addGaugeAction, + account: admin.address, + where: TimelockAuthorizer.EVERYWHERE, + }); + + // Granting `GaugeController#add_gauge` permissions to the entrypoint has a delay, so the permission needs + // to be scheduled and executed after the required time passes. + tx = await authorizer + .connect(lmMultisig) + .scheduleGrantPermission(gaugeControllerAddGaugeAction, gaugeAdder.address, TimelockAuthorizer.EVERYWHERE, []); + const event = expectEvent.inReceipt(await tx.wait(), 'ExecutionScheduled'); + const scheduledExecutionId = event.args.scheduledExecutionId; + + // The adder cannot add a gauge in the controller before the delay passes. + expect( + await authorizer.canPerform(gaugeControllerAddGaugeAction, gaugeAdder.address, TimelockAuthorizer.EVERYWHERE) + ).to.be.false; + + await advanceTime(14 * DAY); + await authorizer.connect(lmMultisig).execute(scheduledExecutionId); + + expect(await authorizer.canPerform(addFactoryAction, admin.address, TimelockAuthorizer.EVERYWHERE)).to.be.true; + expect(await authorizer.canPerform(addGaugeAction, admin.address, TimelockAuthorizer.EVERYWHERE)).to.be.true; + expect( + await authorizer.canPerform(gaugeControllerAddGaugeAction, gaugeAdder.address, TimelockAuthorizer.EVERYWHERE) + ).to.be.true; + + const entrypoint = await gaugeAdder.getAuthorizerAdaptorEntrypoint(); + const gaugeAdderAuthorizer = await adaptorEntrypoint.getAuthorizer(); + + // Ensure the authorizer we just set the permissions on is the same one the gauge adder is using + expect(entrypoint).to.equal(adaptorEntrypoint.address); + expect(gaugeAdderAuthorizer).to.equal(authorizer.address); + }); + + it('can add factories for a gauge type', async () => { + const tx = await gaugeAdder.connect(admin).addGaugeFactory(factory.address, 2); // Ethereum is type 2 + expectEvent.inReceipt(await tx.wait(), 'GaugeFactoryAdded', { + gaugeType: 2, + gaugeFactory: factory.address, + }); + }); + + it('can add gauge to controller', async () => { + const tx = await factory.create(LP_TOKEN, weightCap); + const event = expectEvent.inReceipt(await tx.wait(), 'GaugeCreated'); + + gauge = await task.instanceAt('LiquidityGaugeV5', event.args.gauge); + + await gaugeAdder.connect(admin).addEthereumGauge(gauge.address); + + expect(await gaugeController.gauge_exists(gauge.address)).to.be.true; + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/artifact/AaveLinearPool.json b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/artifact/AaveLinearPool.json new file mode 100644 index 0000000..d59b724 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/artifact/AaveLinearPool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"components": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20", "name": "mainToken", "type": "address"}, {"internalType": "contract IERC20", "name": "wrappedToken", "type": "address"}, {"internalType": "address", "name": "assetManager", "type": "address"}, {"internalType": "uint256", "name": "upperTarget", "type": "uint256"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "string", "name": "version", "type": "string"}], "internalType": "struct AaveLinearPool.ConstructorArgs", "name": "args", "type": "tuple"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "enabled", "type": "bool"}], "name": "RecoveryModeStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "lowerTarget", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "upperTarget", "type": "uint256"}], "name": "TargetsSet", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "disableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "enableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getBptIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "pure", "type": "function"}, {"inputs": [], "name": "getDomainSeparator", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMainIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMainToken", "outputs": [{"internalType": "contract IERC20", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "getNextNonce", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getProtocolFeesCollector", "outputs": [{"internalType": "contract IProtocolFeesCollector", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getScalingFactors", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getTargets", "outputs": [{"internalType": "uint256", "name": "lowerTarget", "type": "uint256"}, {"internalType": "uint256", "name": "upperTarget", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVirtualSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedToken", "outputs": [{"internalType": "contract IERC20", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedTokenRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "inRecoveryMode", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "dueProtocolFees", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "dueProtocolFees", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "indexIn", "type": "uint256"}, {"internalType": "uint256", "name": "indexOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256", "name": "balanceTokenIn", "type": "uint256"}, {"internalType": "uint256", "name": "balanceTokenOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "newLowerTarget", "type": "uint256"}, {"internalType": "uint256", "name": "newUpperTarget", "type": "uint256"}], "name": "setTargets", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "version", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/artifact/AaveLinearPoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/artifact/AaveLinearPoolFactory.json new file mode 100644 index 0000000..40f29ba --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/artifact/AaveLinearPoolFactory.json @@ -0,0 +1,329 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "AaveLinearPoolFactory", + "sourceName": "contracts/aave-v2-linear-pool/AaveLinearPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "contract IBalancerQueries", + "name": "queries", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "poolVersion", + "type": "string" + }, + { + "internalType": "uint256", + "name": "initialPauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "AaveLinearPoolCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract AaveLinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastCreatedPool", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeePercentagesProvider", + "outputs": [ + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101e06040523480156200001257600080fd5b50604051620093ff380380620093ff8339810160408190526200003591620003be565b86868383604051806020016200004b906200026d565b601f1982820381018352601f909101166040528851839083908790309085908e906200007f9060009060208401906200027b565b505080516002810460a081905280820360e081905281845283620000af816200018e602090811b620009f117901c565b60601b6001600160601b0319166080528285018051838252620000de826200018e602090811b620009f117901c565b6001600160601b0319606091821b811660c0529690935290526101009590955250509290911b909116610120525062000121630163f500831115610194620001e2565b620001356276a700821115610195620001e2565b610140829052610160524201610180525050506001600160601b0319606091821b81166101a05260016003559087901b166101c052508251620001809060069060208601906200027b565b50505050505050506200048f565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001dc6001600160a01b03831615156101ac620001e2565b50919050565b81620001f357620001f381620001f7565b5050565b62000209816210905360ea1b6200020c565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6159958062003a6a83390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002be57805160ff1916838001178555620002ee565b82800160010185558215620002ee579182015b82811115620002ee578251825591602001919060010190620002d1565b50620002fc92915062000300565b5090565b5b80821115620002fc576000815560010162000301565b600082601f83011262000328578081fd5b81516001600160401b03808211156200033f578283fd5b6040516020601f8401601f191682018101838111838210171562000361578586fd5b806040525081945083825286818588010111156200037e57600080fd5b600092505b83831015620003a2578583018101518284018201529182019162000383565b83831115620003b45760008185840101525b5050505092915050565b600080600080600080600060e0888a031215620003d9578283fd5b8751620003e68162000479565b6020890151909750620003f98162000479565b60408901519096506200040c8162000479565b60608901519095506001600160401b038082111562000429578485fd5b620004378b838c0162000317565b955060808a01519150808211156200044d578485fd5b506200045c8a828b0162000317565b93505060a0880151915060c0880151905092959891949750929550565b6001600160a01b03811681146200020957600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405161016051610180516101a05160601c6101c05160601c613546620005246000398061067552508061050452508061028b52806102b55250806102d95250508061057c52508061052a525080610a5a5250806102625280610ad6525080610a7b5250806102415280610ab252506135466000f3fe60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c80636634b7531162000099578063851c1bb3116200006f578063851c1bb314620001cd5780638d928af814620001f3578063aaabadc514620001fd578063df8af989146200020757620000ff565b80636634b75314620001935780636c57f5a914620001b9578063739238d614620001c357620000ff565b80632f2770db11620000db5780632f2770db146200015a5780633f819b6f146200016657806354fd4d5014620001705780635ed31282146200017a57620000ff565b8062c194db1462000104578063174481fa14620001265780632da47c401462000140575b600080fd5b6200010e6200021e565b6040516200011d919062001435565b60405180910390f35b620001306200023f565b6040516200011d929190620013ce565b6200014a62000285565b6040516200011d9291906200162e565b620001646200030e565b005b6200010e62000378565b6200010e62000430565b62000184620004b2565b6040516200011d9190620013ad565b620001aa620001a436600462001137565b620004ce565b6040516200011d9190620013f5565b620001aa620004f9565b6200018462000502565b620001e4620001de36600462001178565b62000526565b6040516200011d919062001400565b620001846200057a565b620001846200059e565b6200018462000218366004620011d9565b6200062b565b60606200023a6040518060200160405280600081525062000a52565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200030057807f00000000000000000000000000000000000000000000000000000000000000000392507f0000000000000000000000000000000000000000000000000000000000000000915062000309565b60009250600091505b509091565b6200031862000b2d565b6200032262000b7c565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b820191906000526020600020905b8154815290600101906020018083116200040857829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016200055d9291906200134a565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000620005aa6200057a565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620005f057600080fd5b505afa15801562000605573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023a9190620011ba565b60006200063762000b95565b6004805460018101909155604051606090620006566020820162000fd8565b601f1982820381018352601f90910116604052620006736200057a565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001620006a7929190620013ce565b60408051601f1981840301815290829052620006c792916020016200137a565b60405160208183030381529060405290506000620006ed83838051906020012062000bb0565b9050600080620006fc62000285565b915091506200070a62000fe6565b620007146200057a565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508e81602001819052508d81604001819052508c816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508a8160c0018181525050898160e0018181525050828161010001818152505081816101200181815250508881610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506200087262000378565b610160820152604051600090620008a8906200089390849060200162001526565b60405160208183030381529060405262000bc6565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620008f357600080fd5b505af115801562000908573d6000803e3d6000fd5b5050505060006200091c6000898962000c1b565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146200098f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200098690620014b8565b60405180910390fd5b6040518a9073ffffffffffffffffffffffffffffffffffffffff8416907fdd6d1f79139f1dde24a93542b6f48323b2638466a8bedffc021d605a0d34afd490600090a3509650505050505050620009e562000cf9565b98975050505050505050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000a4c73ffffffffffffffffffffffffffffffffffffffff831615156101ac62000d00565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000b1f81838662000d15565b505050505050505050919050565b600062000b5e6000357fffffffff000000000000000000000000000000000000000000000000000000001662000526565b905062000b7962000b70823362000d73565b61019162000d00565b50565b62000b9362000b8a620004f9565b1560d362000d00565b565b62000ba96002600354141561019062000d00565b6002600355565b600062000bbf83833062000e11565b9392505050565b60008062000bd48362000e52565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790559392505050565b6000808447101562000c5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000986906200144a565b825162000c96576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200098690620014ef565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009869062001481565b949350505050565b6001600355565b8162000d115762000d118162000eed565b5050565b5b6020811062000d37578151835260209283019290910190601f190162000d16565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000d7f6200059e565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000dbd9392919062001409565b60206040518083038186803b15801562000dd657600080fd5b505afa15801562000deb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bbf919062001156565b60008060ff60f81b83868660405160200162000e319493929190620012e6565b60408051808303601f19018152919052805160209091012095945050505050565b600062000e5e62000b7c565b600062000e6b8362000f19565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b62000b79817f42414c000000000000000000000000000000000000000000000000000000000062000f5d565b6000606062000f288362000a52565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811662000bbf573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611e7e806200169383390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f830112620010c6578081fd5b813567ffffffffffffffff80821115620010de578283fd5b6040516020601f19601f8501168201018181108382111715620010ff578485fd5b6040528281529250828483016020018610156200111b57600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121562001149578081fd5b813562000bbf816200166f565b60006020828403121562001168578081fd5b8151801515811462000bbf578182fd5b6000602082840312156200118a578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811462000bbf578182fd5b600060208284031215620011cc578081fd5b815162000bbf816200166f565b600080600080600080600080610100898b031215620011f6578384fd5b883567ffffffffffffffff808211156200120e578586fd5b6200121c8c838d01620010b5565b995060208b013591508082111562001232578586fd5b50620012418b828c01620010b5565b975050604089013562001254816200166f565b9550606089013562001266816200166f565b94506080890135935060a0890135925060c089013562001286816200166f565b8092505060e089013590509295985092959890939650565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620012d28160208601602086016200163c565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b600083516200138e8184602088016200163c565b835190830190620013a48183602088016200163c565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000bbf6020830184620012b8565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b6000602082526200153c6020830184516200129e565b60208301516101808060408501526200155a6101a0850183620012b8565b91506040850151601f19808685030160608701526200157a8483620012b8565b9350606087015191506200159260808701836200129e565b60808701519150620015a860a08701836200129e565b60a08701519150620015be60c08701836200129e565b60c087015160e087810191909152870151610100808801919091528701516101208088019190915287015161014080880191909152870151915061016062001609818801846200129e565b870151868503909101838701529050620016248382620012b8565b9695505050505050565b918252602082015260400190565b60005b83811015620016595781810151838201526020016200163f565b8381111562001669576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000b7957600080fdfe6101606040523480156200001257600080fd5b5060405162001e7e38038062001e7e833981016040819052620000359162000462565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000378565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200012591908101906200039e565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000449565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000449565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000378565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000378565b6001600160601b0319606091821b811660e05292811b8316610120521b166101405250620004e0915050565b6000602082840312156200038a578081fd5b81516200039781620004c7565b9392505050565b60006020808385031215620003b1578182fd5b82516001600160401b0380821115620003c8578384fd5b818501915085601f830112620003dc578384fd5b815181811115620003eb578485fd5b8381029150620003fd848301620004a0565b8181528481019084860184860187018a101562000418578788fd5b8795505b838610156200043c5780518352600195909501949186019186016200041c565b5098975050505050505050565b6000602082840312156200045b578081fd5b5051919050565b6000806040838503121562000475578081fd5b82516200048281620004c7565b60208401519092506200049581620004c7565b809150509250929050565b6040518181016001600160401b0381118282101715620004bf57600080fd5b604052919050565b6001600160a01b0381168114620004dd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c6118bb620005c36000398061050952806108215250806101335280610c145280610f335280610f955250806103bf52508061046c5280610599528061074852806108ec5280610cbf528061102952806110f3528061115552508060ea5280610190528061043052806105cc528061063152806106d2528061078452806108b152806110d152508061016f5280610402528061071a5280610a7d5280610b5c5280610dbb5280610e9a5250806099528061030952506118bb6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611588565b60405180910390f35b610077610072366004611446565b6100bb565b60405161005b9190611824565b610077610092366004611462565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc92919061173d565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c91906114e8565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a939291906115d0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a491906114c5565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f5611393565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c96113f6565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611761565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059291906114ad565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d4f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611588565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b691906114ad565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fca565b9695505050505050565b600061070d611393565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e16113f6565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611761565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa91906114ad565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fe9565b6110b7565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d4f565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a919061156c565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b6919061148d565b6101a26111e8565b60006109cd82151560046111e8565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b60056111e8565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f61141d565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016116b9565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517fead5d35900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ead5d35990610cf99030908590600190600401611650565b6040805180830381600087803b158015610d1257600080fd5b505af1158015610d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4a91906114c5565b505050565b6040805160028082526060828101909352816020015b610d6d61141d565b815260200190600190039081610d65579050509050600281600081518110610d9157fe5b6020026020010151600001906002811115610da857fe5b90816002811115610db557fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de757fe5b602002602001015160200181815250508181600081518110610e0557fe5b602002602001015160600181815250508281600081518110610e2357fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e7057fe5b6020026020010151600001906002811115610e8757fe5b90816002811115610e9457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec657fe5b602002602001015160200181815250508181600181518110610ee457fe5b602002602001015160600181815250508281600181518110610f0257fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f589084167f0000000000000000000000000000000000000000000000000000000000000000846111f6565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016116b9565b610d4a8363a9059cbb60e01b848460405160240161027a92919061162a565b6040517ff57d0b4000000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f57d0b409061105e908590600401611824565b60206040518083038186803b15801561107657600080fd5b505afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae91906114ad565b60010192915050565b61111873ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f0000000000000000000000000000000000000000000000000000000000000000836111f6565b6040517f2f2cab8700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632f2cab87906111929030908590600090600190600401611680565b602060405180830381600087803b1580156111ac57600080fd5b505af11580156111c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e491906114ad565b5050565b816111e4576111e4816112eb565b80158015906112a757506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e9061125490309086906004016115a9565b60206040518083038186803b15801561126c57600080fd5b505afa158015611280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a491906114ad565b15155b156112cc576112cc8363095ea7b360e01b84600060405160240161027a929190611601565b610d4a8363095ea7b360e01b848460405160240161027a92919061162a565b611315817f42414c0000000000000000000000000000000000000000000000000000000000611318565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b600060208284031215611457578081fd5b813561011b81611863565b60008060408385031215611474578081fd5b823561147f81611863565b946020939093013593505050565b60006020828403121561149e578081fd5b8151801515811461011b578182fd5b6000602082840312156114be578081fd5b5051919050565b600080604083850312156114d7578182fd5b505080516020909101519092909150565b600080600080608085870312156114fd578182fd5b845193506020850151925060408501519150606085015161151d81611863565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161157e81846020870161182d565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff93909316835260208301919091521515604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff949094168452602084019290925261ffff1660408301521515606082015260800190565b602080825282518282018190526000919060409081850190868401855b828110156117305781518051600381106116ec57fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff168686015260609081015190850152608090930192908501906001016116d6565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a0830152602084015161177c81611859565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c06101408401528051806101608501526101806117e8828287016020860161182d565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b6020830184611528565b90815260200190565b60005b83811015611848578181015183820152602001611830565b838111156102fc5750506000910152565b6002811061131557fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461131557600080fdfea264697066735822122071c747d079b6f1053812d61a96fcbf5bc452dc911a12f909d0042f154ded1ef764736f6c63430007010033a264697066735822122065ecf3480bf9ad478cba15525995609f6af30da1335ab0131715c1e05345e78564736f6c634300070100336102c06040523480156200001257600080fd5b506040516200599538038062005995833981016040819052620000359162000df2565b6101608101518151602083015160408401516060850151608086015160c087015162000061886200047d565b60e08901516101008a01516101208b01516101408c01518a6200009e8160006200008c8c8c62000506565b89620005b760201b620014241760201c565b8b8b86868686838387878b86336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000ed92919062000c7b565b5080516200010390600490602084019062000c7b565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001829050630163f50083111561019462000785565b620001966276a70082111561019562000785565b4291909101610140819052016101605260601b6001600160601b031916610180526101a08690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000db3565b6001600160a01b03166101c0816001600160a01b031660601b8152505050505050505050876001600160a01b03166101e0816001600160a01b031660601b81525050866001600160a01b0316610200816001600160a01b031660601b81525050866001600160a01b0316886001600160a01b031610620002bb576002620002be565b60015b60ff16610220526001600160a01b0380881690891610620002e1576001620002e4565b60025b60ff1661024052620002f6886200079a565b6102605262000305876200079a565b6102805260006200031889828962000846565b620003238562000940565b50508a51620003469a506009995060208c019850965062000c7b95505050505050565b5050620003ec81608001516001600160a01b0316634800d97f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038a57600080fd5b505afa1580156200039f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003c5919062000db3565b6001600160a01b031682606001516001600160a01b0316146102086200078560201b60201c565b80608001516001600160a01b031663b4dcfc776040518163ffffffff1660e01b815260040160206040518083038186803b1580156200042a57600080fd5b505afa1580156200043f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000465919062000db3565b60601b6001600160601b0319166102a052506200106f565b6040805160028082526060808301845292839291906020830190803683370190505090508260a0015181600081518110620004b457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260a0015181600181518110620004e757fe5b6001600160a01b03909216602092830291909101909101529050919050565b60408051600280825260608281019093526001600160a01b0384811690861610918391816020016020820280368337019050509050816200054857836200054a565b845b816000815181106200055857fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508162000585578462000587565b835b816001815181106200059557fe5b6001600160a01b03909216602092830291909101909101529150505b92915050565b6000620005cf83620009cf60201b620015d91760201c565b606083516001016001600160401b0381118015620005ec57600080fd5b5060405190808252806020026020018201604052801562000617578160200160208202803683370190505b50905030816000815181106200062957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156200069c578481815181106200066357fe5b60200260200101518282600101815181106200067b57fe5b6001600160a01b03909216602092830291909101909101526001016200064c565b50606083516001016001600160401b0381118015620006ba57600080fd5b50604051908082528060200260200182016040528015620006e5578160200160208202803683370190505b509050600081600081518110620006f857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156200076b578481815181106200073257fe5b60200260200101518282600101815181106200074a57fe5b6001600160a01b03909216602092830291909101909101526001016200071b565b506200077a87878484620009db565b979650505050505050565b816200079657620007968162000ad5565b5050565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620007d757600080fd5b505afa158015620007ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000812919062000f49565b60ff16905060006200083160128362000aea60201b620015e71760201c565b600a0a670de0b6b3a764000002949350505050565b620008578183111561014c62000785565b620008746b0de0b6b39983494c589c000082111561014d62000785565b6200088e670de0b6b3a7640000825b061561016162000785565b620008a2670de0b6b3a76400008362000883565b620008f1670de0b6b3a7640000820460406020620008db670de0b6b3a764000087600854919004602080620015fd62000b02821b17811c565b62000b0260201b620015fd17909392919060201c565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d12809062000933908590859062001018565b60405180910390a2505050565b6200095564e8d4a5100082101560cb62000785565b6200096d67016345785d8a000082111560ca62000785565b6200098f8160c0603f60085462000b0260201b620015fd17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90620009c49083906200100f565b60405180910390a150565b80620007968162000b27565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040162000a0c919062000ffa565b602060405180830381600087803b15801562000a2757600080fd5b505af115801562000a3c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a62919062000dd9565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000a979084908890889060040162000f6c565b600060405180830381600087803b15801562000ab257600080fd5b505af115801562000ac7573d6000803e3d6000fd5b509298975050505050505050565b62000ae7816210905360ea1b62000bb3565b50565b600062000afc83831115600162000785565b50900390565b600062000b1184848462000c14565b506001901b60001901811b1992909216911b1790565b60028151101562000b385762000ae7565b60008160008151811062000b4857fe5b602002602001015190506000600190505b825181101562000bae57600083828151811062000b7257fe5b6020026020010151905062000ba3816001600160a01b0316846001600160a01b03161060656200078560201b60201c565b915060010162000b59565b505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b62000c256101008310606462000785565b62000c5e6001821015801562000c56575062000c5260ff846101000362000c6f60201b620016201760201c565b8211155b606462000785565b62000bae83821c156101b462000785565b80820390821102900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000cbe57805160ff191683800117855562000cee565b8280016001018555821562000cee579182015b8281111562000cee57825182559160200191906001019062000cd1565b5062000cfc92915062000d00565b5090565b5b8082111562000cfc576000815560010162000d01565b8051620005b18162001059565b600082601f83011262000d35578081fd5b81516001600160401b0381111562000d4b578182fd5b602062000d61601f8301601f1916820162001026565b9250818352848183860101111562000d7857600080fd5b60005b8281101562000d9857848101820151848201830152810162000d7b565b8281111562000daa5760008284860101525b50505092915050565b60006020828403121562000dc5578081fd5b815162000dd28162001059565b9392505050565b60006020828403121562000deb578081fd5b5051919050565b60006020828403121562000e04578081fd5b81516001600160401b038082111562000e1b578283fd5b818401915061018080838703121562000e32578384fd5b62000e3d8162001026565b905062000e4b868462000d17565b815260208301518281111562000e5f578485fd5b62000e6d8782860162000d24565b60208301525060408301518281111562000e85578485fd5b62000e938782860162000d24565b60408301525062000ea8866060850162000d17565b606082015262000ebc866080850162000d17565b608082015262000ed08660a0850162000d17565b60a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014062000f128782860162000d17565b90820152610160838101518381111562000f2a578586fd5b62000f388882870162000d24565b918301919091525095945050505050565b60006020828403121562000f5b578081fd5b815160ff8116811462000dd2578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000fb85762000fa585516200104d565b8352938301939183019160010162000f90565b505084810360408601528551808252908201925081860190845b8181101562000ac75762000fe783516200104d565b8552938301939183019160010162000fd2565b60208101600383106200100957fe5b91905290565b90815260200190565b918252602082015260400190565b6040518181016001600160401b03811182821017156200104557600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b038116811462000ae757600080fd5b60805160a05160c05160e0516101005160601c6101205160601c61014051610160516101805160601c6101a0516101c05160601c6101e05160601c6102005160601c610220516102405161026051610280516102a05160601c61478c62001209600039806118435250806107f45250806107905280612a93525080610718528061081c5280610c515280612f0e528061309752806131cf52806132da5280613457528061358f5250806107b252806109bc5280610c175280612eda528061301c52806130635280613159528061319b52806132a652806133e152806134235280613519528061355b5250806113f852806126fd52806127c95280612ab95280612e8f5280612fa8528061325c528061336d5250806109e052806110ee5280611ac35280611b6252806126b452806127805280612a585280612e505280612f5252806130e5528061321d528061331e52806134a55250806111cc5250806109495250508061181d5250806117f9525080610fd1525080610fad525080610f5d5250806123f1525080612433525080612412525061478c6000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e3660046140c0565b610608565b6040516103509190614453565b60405180910390f35b610361610668565b6040516103509190614697565b61038161037c366004613e92565b6106ff565b6040516103509190614430565b610343610716565b61034361073a565b6103a6610740565b6040516103509392919061443b565b6103bd610769565b60405161035091906143f8565b6103816103d8366004613de2565b610877565b6103e56108ed565b60405161035091906146d1565b6103436108f6565b61040d61040836600461417d565b610905565b005b610343610947565b610381610425366004613e92565b61096b565b61040d6109a6565b6103436109ba565b6104426109de565b604051610350919061434d565b61040d610a02565b610361610a56565b610343610ab7565b61047a610475366004613fc1565b610aca565b6040516103509291906146aa565b610490610ae8565b6040516103509291906146c3565b610343610b26565b6103436104b4366004613d8e565b610cbb565b6104cc6104c7366004613fc1565b610cda565b60405161035092919061440b565b6103436104e8366004613d8e565b610d9c565b61040d610da7565b610343610f42565b61040d610f47565b610343610513366004614064565b610f59565b610442610fab565b610442610fcf565b610343610536366004613d8e565b610ff3565b61036161100e565b610343610551366004614131565b61106f565b61040d610564366004614195565b6110a8565b610381610577366004613e92565b61111a565b61038161058a366004613e92565b611158565b610442611165565b61038161116f565b61040d611180565b6104426111ca565b61040d6105bd366004613e22565b6111ee565b6104cc6105d0366004613fc1565b61126f565b6103436105e3366004613daa565b611306565b610343611343565b6103436113ec565b6104426113f6565b61034361141a565b6000846080015161063561061a610fcf565b6001600160a01b0316336001600160a01b03161460cd61162c565b61064a610640610947565b82146101f461162c565b61065261163a565b61065e8686868661164d565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b505050505090505b90565b600061070c338484611772565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074d6117da565b1592506107586117f7565b915061076261181b565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107db57fe5b6020026020010181815250506108196107f261183f565b7f00000000000000000000000000000000000000000000000000000000000000009061192d565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084557fe5b602002602001018181525050670de0b6b3a76400008160008151811061086757fe5b6020908102919091010152905090565b6000806108848533611306565b90506108a8336001600160a01b03871614806108a05750838210155b61019e61162c565b6108b3858585611965565b336001600160a01b038616148015906108ce57506000198114155b156108e0576108e08533858403611772565b60019150505b9392505050565b60055460ff1690565b60006109006113ec565b905090565b61090d611a45565b610915611a8e565b600080610920610ae8565b915091506109396109318383611a9e565b61014f61162c565b61094283611ba5565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070c9185906109a19086611c1d565b611772565b6109ae611a45565b6109b86000611c2f565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a0a611a45565b610a12611cc0565b610a1c6001611cd4565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4c9190614430565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906109009060c0603f611d16565b60006060610adc888785611d25611d3c565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0582602080611d16565b029250670de0b6b3a7640000610b1e8260406020611d16565b029150509091565b600080610b31610947565b90506060610b3d610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b689190614453565b60006040518083038186803b158015610b8057600080fd5b505afa158015610b94573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbc9190810190613ebd565b50915050610bd181610bcc610769565b611ea3565b600080610bdc610ae8565b91509150610be8613aff565b6040518060600160405280610bfb610ab7565b81526020018481526020018381525090506000610c87610c4e867f000000000000000000000000000000000000000000000000000000000000000081518110610c4057fe5b602002602001015184611f0c565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7a57fe5b6020026020010151611f6d565b9050610cb0610ca986600081518110610c9c57fe5b6020026020010151611f79565b8290611f8d565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce961061a610fcf565b610cf4610640610947565b6000610cff85611fe4565b15610d2757610d0c612013565b610d1e88610d1861073a565b87612026565b94509050610d3f565b610d2f61163a565b610d3a8a8987611d25565b945090505b610d498a8261211c565b835167ffffffffffffffff81118015610d6157600080fd5b50604051908082528060200260200182016040528015610d8b578160200160208202803683370190505b509250505097509795505050505050565b600061071082610ff3565b6000610db1610947565b90506060610dbd610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de89190614453565b60006040518083038186803b158015610e0057600080fd5b505afa158015610e14573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3c9190810190613ebd565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e8057fe5b602002602001018181525050610e94613b20565b6040518060800160405280610ea8856106fc565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed9610fcf565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f0a949392919061447b565b600060405180830381600087803b158015610f2457600080fd5b505af1158015610f38573d6000803e3d6000fd5b5050505050505050565b600090565b610f4f611a45565b6109b86001611c2f565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8e9291906142d7565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108161061a610fcf565b61108c610640610947565b61109461163a565b61109f858585612126565b95945050505050565b6110b0611a45565b6110b8611a8e565b6000806110c3610ae8565b915091506110d46109318383611a9e565b6110e96110e18585611a9e565b61015761162c565b6111147f00000000000000000000000000000000000000000000000000000000000000008585612133565b50505050565b6000806111273385611306565b90508083106111415761113c33856000611772565b61114e565b61114e3385858403611772565b5060019392505050565b600061070c338484611965565b6000610900612209565b6008546000906109009060ff612283565b611188611a45565b611190612013565b61119a6000611cd4565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4c9190614430565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121d8c610ff3565b8960405160200161123396959493929190614568565b604051602081830303815290604052805190602001209050611264888261125b87878761228a565b886101f86122c9565b610f38888888611772565b6060808861127e61061a610fcf565b611289610640610947565b600061129361163a565b61129b61073a565b6112ed576112aa8a8a87612320565b945090506112c36112b9610f42565b82101560cc61162c565b6112d560006112d0610f42565b6123b8565b6112e8896112e1610f42565b83036123b8565b610d49565b6112f88a8987611d25565b94509050610d4989826123b8565b6000611310610fcf565b6001600160a01b0316826001600160a01b031614156113325750600019610710565b61133c83836123c2565b9050610710565b6000806000611350610fcf565b6001600160a01b031663b05f8e48611366610947565b306040518363ffffffff1660e01b815260040161138492919061464e565b60806040518083038186803b15801561139c57600080fd5b505afa1580156113b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d491906141b6565b5050915091506113e5818301611f79565b9250505090565b60006109006123ed565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061090061183f565b600061142f836115d9565b6060835160010167ffffffffffffffff8111801561144c57600080fd5b50604051908082528060200260200182016040528015611476578160200160208202803683370190505b509050308160008151811061148757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f6578481815181106114bf57fe5b60200260200101518282600101815181106114d657fe5b6001600160a01b03909216602092830291909101909101526001016114aa565b506060835160010167ffffffffffffffff8111801561151457600080fd5b5060405190808252806020026020018201604052801561153e578160200160208202803683370190505b50905060008160008151811061155057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115bf5784818151811061158857fe5b602002602001015182826001018151811061159f57fe5b6001600160a01b0390921660209283029190910190910152600101611573565b506115cc8787848461248a565b925050505b949350505050565b806115e381612593565b5050565b60006115f783831115600161162c565b50900390565b600061160a84848461260c565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e3576115e381612652565b6109b86116456117da565b61019261162c565b60006116696003841080156116625750600383105b606461162c565b6060611673610769565b905061167f8582611ea3565b60008061168a610ae8565b91509150611696613aff565b60405180606001604052806116a9610ab7565b81526020810185905260400183905290506000895160018111156116c957fe5b141561172d576116f089606001518589815181106116e357fe5b602002602001015161267c565b60608a015260006117028a8a84612688565b90506117218186898151811061171457fe5b602002602001015161274f565b955050505050506115d1565b61174189606001518588815181106116e357fe5b60608a015260006117538a8a8461275b565b905061172181868a8151811061176557fe5b6020026020010151612810565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cd908590614453565b60405180910390a3505050565b60006117e461181b565b42118061090057505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d15e00536118786109de565b6040518263ffffffff1660e01b8152600401611894919061434d565b60206040518083038186803b1580156118ac57600080fd5b505afa9250505080156118dc575060408051601f3d908101601f191682019092526118d991810190613fa9565b60015b61191f573d80801561190a576040519150601f19603f3d011682016040523d82523d6000602084013e61190f565b606091505b506119198161281c565b506106fc565b633b9aca00900490506106fc565b600082820261195184158061194a57508385838161194757fe5b04145b600361162c565b670de0b6b3a7640000815b04949350505050565b61197c6001600160a01b038416151561019861162c565b6119936001600160a01b038316151561019961162c565b61199e838383610942565b6001600160a01b0383166000908152602081905260409020546119c490826101a06128a3565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119f39082611c1d565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cd908590614453565b6000611a746000357fffffffff0000000000000000000000000000000000000000000000000000000016610f59565b9050611a8b611a8382336128b9565b61019161162c565b50565b6109b8611a99610fcf565b6129a2565b6000806000611aab610fcf565b6001600160a01b031663b05f8e48611ac1610947565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611aff92919061464e565b60806040518083038186803b158015611b1757600080fd5b505afa158015611b2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4f91906141b6565b5050915091506000611b8b828401611b867f0000000000000000000000000000000000000000000000000000000000000000612a54565b61267c565b905085811015801561065e57509390931115949350505050565b611bb864e8d4a5100082101560cb61162c565b611bce67016345785d8a000082111560ca61162c565b600854611bdf908260c0603f6115fd565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611c12908390614453565b60405180910390a150565b60008282016108e6848210158361162c565b8015611c4f57611c4a611c406117f7565b421061019361162c565b611c64565b611c64611c5a61181b565b42106101a961162c565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611c12908390614430565b6109b8611ccb61116f565b156101b561162c565b600854611ce3908260ff612b2e565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611c12908390614430565b6001901b6000190191901c1690565b60006060611d346103e6612652565b935093915050565b333014611e2b576000306001600160a01b0316600036604051611d60929190614307565b6000604051808303816000865af19150503d8060008114611d9d576040519150601f19603f3d011682016040523d82523d6000602084013e611da2565b606091505b505090508060008114611db157fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611e0d573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611e3e8686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611eb2908290612b3d565b60005b8181101561111457611eed848281518110611ecc57fe5b6020026020010151848381518110611ee057fe5b602002602001015161192d565b848281518110611ef957fe5b6020908102919091010152600101611eb5565b60008160200151831015611f455781516020830151600091611f31918690039061192d565b9050611f3d84826115e7565b915050610710565b81604001518311611f57575081610710565b81516040830151600091611f319186039061192d565b60006108e68383611c1d565b600061071082611f8761073a565b906115e7565b6000611f9c821515600461162c565b670de0b6b3a76400008302611fce841580611fc75750670de0b6b3a7640000858381611fc457fe5b04145b600561162c565b6001836001830304018115150291505092915050565b6000808251118015610710575060ff80168280602001905181019061200991906141f6565b60ff161492915050565b6109b861201e61116f565b6101b661162c565b60006060600061203584612b4a565b90506060865167ffffffffffffffff8111801561205157600080fd5b5060405190808252806020026020018201604052801561207b578160200160208202803683370190505b5090506000612088610f42565b9050600061209b898381518110610c9c57fe5b905060006120a98583612b60565b905060005b8a5181101561210b57838114156120c65760006120ec565b6120ec828c83815181106120d657fe5b602002602001015161192d90919063ffffffff16565b8582815181106120f857fe5b60209081029190910101526001016120ae565b509399929850919650505050505050565b6115e38282612ba0565b60006108e66103e6612652565b6121428183111561014c61162c565b61215d6b0de0b6b39983494c589c000082111561014d61162c565b612175670de0b6b3a7640000825b061561016161162c565b612187670de0b6b3a76400008361216b565b6121bc670de0b6b3a76400008204604060206121b4670de0b6b3a7640000876008549190046020806115fd565b9291906115fd565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121fc90859085906146c3565b60405180910390a2505050565b6000612213610fcf565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561224b57600080fd5b505afa15801561225f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090091906140a4565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b60006122d485612c6c565b90506122ea6122e4878387612c88565b8361162c565b6122f9428410156101b861162c565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b6000606061233b6001600160a01b038616301461015661162c565b6123526001600160a01b038516301461015661162c565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff816000815181106123a157fe5b602090810291909101015290969095509350505050565b6115e38282612d37565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061245a612dca565b3060405160200161246f959493929190614622565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016124b99190614683565b602060405180830381600087803b1580156124d357600080fd5b505af11580156124e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250b9190613fa9565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d2906125579084908890889060040161459c565b600060405180830381600087803b15801561257157600080fd5b505af1158015612585573d6000803e3d6000fd5b509298975050505050505050565b6002815110156125a257611a8b565b6000816000815181106125b157fe5b602002602001015190506000600190505b82518110156109425760008382815181106125d957fe5b60200260200101519050612602816001600160a01b0316846001600160a01b031610606561162c565b91506001016125c2565b61261b6101008310606461162c565b61264360018210158015611662575061263960ff8461010003611620565b821115606461162c565b61094283821c156101b461162c565b611a8b817f42414c0000000000000000000000000000000000000000000000000000000000612dce565b60006108e6838361192d565b60208301516000906001600160a01b03163014156126b2576126ab848484612e49565b90506108e6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b031614156126fb576126ab848484612fa1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612744576126ab8484846130de565b6108e6610135612652565b60006108e68383612b60565b60408301516000906001600160a01b031630141561277e576126ab848484613216565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127c7576126ab848484613366565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b03161415612744576126ab84848461349e565b60006108e68383611f8d565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417612897578160208401fd5b506115e3610165612652565b60006128b2848411158361162c565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128d8610fab565b6001600160a01b0316141580156128f357506128f3836135d6565b1561291b57612900610fab565b6001600160a01b0316336001600160a01b0316149050610710565b612923612209565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016129529392919061445c565b60206040518083038186803b15801561296a57600080fd5b505afa15801561297e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133c9190613f89565b604080516000808252602082019092526060916129d5565b6129c2613b4a565b8152602001906001900390816129ba5790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e8490612a1e908490600401614361565b600060405180830381600087803b158015612a3857600080fd5b505af1158015612a4c573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612ab757507f0000000000000000000000000000000000000000000000000000000000000000610cd5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612b0357612afc6107f261183f565b9050610cd5565b6001600160a01b038216301415612b235750670de0b6b3a7640000610cd5565b610cd5610135612652565b6001811b1992909216911b1790565b6115e3818314606761162c565b6000818060200190518101906108e69190614212565b6000612b6f821515600461162c565b670de0b6b3a76400008302612b97841580611fc75750670de0b6b3a7640000858381611fc457fe5b82818161195c57fe5b612bb76001600160a01b038316151561019b61162c565b612bc382600083610942565b6001600160a01b038216600090815260208190526040902054612be990826101b26128a3565b6001600160a01b038316600090815260208190526040902055612c1c612c1782612c1161073a565b9061363a565b613648565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c609190614453565b60405180910390a35050565b6000612c766123ed565b82604051602001610f8e929190614317565b6000612c9a82516041146101b961162c565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612cd3908990859088908890614665565b6020604051602081039080840390855afa158015612cf5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612d2b5750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612d4360008383610942565b612d58612c1782612d5261073a565b90611c1d565b6001600160a01b038216600090815260208190526040902054612d7b9082611c1d565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c60908590614453565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612ecf7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162c565b6115d18460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f0357fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f3757fe5b6020026020010151612f4f87600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612f955761364d612f99565b6136ab5b63ffffffff16565b6000612ffd7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec7575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b03163014613058576130538460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061304557fe5b602002602001015184613714565b6115d1565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061308c57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130c057fe5b60200260200101516130d887600081518110610c9c57fe5b86613744565b600061313a7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec7575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b03163014613190576130538460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061318257fe5b6020026020010151846137aa565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131c457fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106131f857fe5b602002602001015161321087600081518110610c9c57fe5b866137ea565b600061329b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162c565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132cf57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061330357fe5b602002602001015161331b87600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461336157613851612f99565b6138a8565b60006133c27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec7575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b03163014613418576130538460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061340a57fe5b602002602001015184613912565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061344c57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061348057fe5b602002602001015161349887600081518110610c9c57fe5b8661393c565b60006134fa7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec7575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b03163014613550576130538460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061354257fe5b60200260200101518461398b565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061358457fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106135b857fe5b60200260200101516135d087600081518110610c9c57fe5b866139c0565b60006136017f9f11080e00000000000000000000000000000000000000000000000000000000610f59565b82148061071057506136327f38e9922e00000000000000000000000000000000000000000000000000000000610f59565b909114919050565b60006108e6838360016128a3565b600255565b60008061365a8684611f0c565b905060006136688287611f6d565b90506000613676868a6115e7565b9050600061369184611f8761368b8587613a14565b8a613a2e565b905061369d88826115e7565b9a9950505050505050505050565b6000806136b88684611f0c565b905060006136c68287611f6d565b905060006136dd6136d7838b613a14565b87613a4f565b905060006136eb84836115e7565b905060006136f98288613a6f565b90506137058a826115e7565b9b9a5050505050505050505050565b6000806137218484611f0c565b905060006137386137328688611c1d565b85611f0c565b905061065e81836115e7565b60008261375c576137558683611f0c565b905061109f565b60006137688684611f0c565b90506000613779613732888a611c1d565b9050600061378782846115e7565b905060006137958489611f6d565b905061369d6137a48884613a14565b82613a4f565b6000806137b78484611f0c565b905060006137c582876115e7565b905060006137d38286613a6f565b90506137df86826115e7565b979650505050505050565b6000826137f857508461109f565b60006138048684611f0c565b905060006138128287611f6d565b90506000613820878a611c1d565b9050600061382e8483611f6d565b9050600061384561383f8984613a14565b85613a4f565b905061370581896115e7565b60008261385f57508461109f565b600061386b8684611f0c565b905060006138798287611f6d565b90506000613887868a611c1d565b9050600061389c84611f8761368b8587613a14565b905061369d81896115e7565b6000826138b9576137558683613a6f565b60006138c58684611f0c565b905060006138d38287611f6d565b905060006138ea6138e4838b613a14565b87613a2e565b905060006138f88483611c1d565b905060006139068288613a6f565b9050613705818b6115e7565b60008061391f8484611f0c565b9050600061393061373286886115e7565b905061065e82826115e7565b6000806139498684611f0c565b9050600061395a613732888a6115e7565b9050600061396883836115e7565b905060006139768489611f6d565b905061369d6139858884613a14565b82613a2e565b6000806139988484611f0c565b905060006139a68287611c1d565b905060006139b48286613a6f565b90506137df81876115e7565b6000806139cd8684611f0c565b905060006139db8287611f6d565b905060006139e9878a6115e7565b905060006139f78483611f6d565b90506000613a0861383f8984613a14565b905061370588826115e7565b60008282026108e684158061194a57508385838161194757fe5b6000613a3d821515600461162c565b50811515600019909201046001010290565b6000613a5e821515600461162c565b818381613a6757fe5b049392505050565b60008160200151831015613ab857815161133c90613a9690670de0b6b3a764000090611c1d565b60208401518451613ab291613aab919061192d565b8690611c1d565b90612b60565b81604001518311613aca575081610710565b815161133c90613ae390670de0b6b3a7640000906115e7565b60408401518451613ab291613af8919061192d565b86906115e7565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561071081614732565b600082601f830112613b95578081fd5b8135613ba8613ba382614706565b6146df565b818152915060208083019084810181840286018201871015613bc957600080fd5b60005b84811015613be857813584529282019290820190600101613bcc565b505050505092915050565b600082601f830112613c03578081fd5b8151613c11613ba382614706565b818152915060208083019084810181840286018201871015613c3257600080fd5b60005b84811015613be857815184529282019290820190600101613c35565b600082601f830112613c61578081fd5b813567ffffffffffffffff811115613c77578182fd5b613c8a6020601f19601f840116016146df565b9150808252836020828501011115613ca157600080fd5b8060208401602084013760009082016020015292915050565b80356002811061071057600080fd5b6000610120808385031215613cdc578182fd5b613ce5816146df565b915050613cf28383613cba565b8152613d018360208401613b7a565b6020820152613d138360408401613b7a565b6040820152606082013560608201526080820135608082015260a082013560a0820152613d438360c08401613b7a565b60c0820152613d558360e08401613b7a565b60e08201526101008083013567ffffffffffffffff811115613d7657600080fd5b613d8285828601613c51565b82840152505092915050565b600060208284031215613d9f578081fd5b81356108e681614732565b60008060408385031215613dbc578081fd5b8235613dc781614732565b91506020830135613dd781614732565b809150509250929050565b600080600060608486031215613df6578081fd5b8335613e0181614732565b92506020840135613e1181614732565b929592945050506040919091013590565b600080600080600080600060e0888a031215613e3c578283fd5b8735613e4781614732565b96506020880135613e5781614732565b955060408801359450606088013593506080880135613e7581614747565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613ea4578182fd5b8235613eaf81614732565b946020939093013593505050565b600080600060608486031215613ed1578081fd5b835167ffffffffffffffff80821115613ee8578283fd5b818601915086601f830112613efb578283fd5b8151613f09613ba382614706565b80828252602080830192508086018b828387028901011115613f29578788fd5b8796505b84871015613f54578051613f4081614732565b845260019690960195928101928101613f2d565b508901519097509350505080821115613f6b578283fd5b50613f7886828701613bf3565b925050604084015190509250925092565b600060208284031215613f9a578081fd5b815180151581146108e6578182fd5b600060208284031215613fba578081fd5b5051919050565b600080600080600080600060e0888a031215613fdb578081fd5b873596506020880135613fed81614732565b95506040880135613ffd81614732565b9450606088013567ffffffffffffffff80821115614019578283fd5b6140258b838c01613b85565b955060808a0135945060a08a0135935060c08a0135915080821115614048578283fd5b506140558a828b01613c51565b91505092959891949750929550565b600060208284031215614075578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e6578182fd5b6000602082840312156140b5578081fd5b81516108e681614732565b600080600080608085870312156140d5578182fd5b843567ffffffffffffffff808211156140ec578384fd5b6140f888838901613cc9565b9550602087013591508082111561410d578384fd5b5061411a87828801613b85565b949794965050505060408301359260600135919050565b600080600060608486031215614145578081fd5b833567ffffffffffffffff81111561415b578182fd5b61416786828701613cc9565b9660208601359650604090950135949350505050565b60006020828403121561418e578081fd5b5035919050565b600080604083850312156141a7578182fd5b50508035926020909101359150565b600080600080608085870312156141cb578182fd5b84519350602085015192506040850151915060608501516141eb81614732565b939692955090935050565b600060208284031215614207578081fd5b81516108e681614747565b60008060408385031215614224578182fd5b825161422f81614747565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b8381101561427b5781518752958201959082019060010161425f565b509495945050505050565b15159052565b60008151808452815b818110156142b157602081850181015186830182015201614295565b818111156142c25782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b828110156143eb57815180516004811061439457fe5b8552808701516143a68887018261423f565b5085810151868601526060808201516143c18288018261423f565b5050608090810151906143d68682018361423f565b505060a093909301929085019060010161437e565b5091979650505050505050565b6000602082526108e6602083018461424c565b60006040825261441e604083018561424c565b828103602084015261109f818561424c565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156144ec576144d68451614726565b82529284019260019290920191908401906144c4565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a087015261452a818561424c565b935050506040850151818584030160c0860152614547838261428c565b92505050606084015161455d60e0850182614286565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b818110156145e4576145d28551614726565b835293830193918301916001016145c0565b505084810360408601528551808252908201925081860190845b81811015612585576146108351614726565b855293830193918301916001016145fe565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016003831061469157fe5b91905290565b6000602082526108e6602083018461428c565b6000838252604060208301526115d1604083018461424c565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156146fe57600080fd5b604052919050565b600067ffffffffffffffff82111561471c578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114611a8b57600080fd5b60ff81168114611a8b57600080fdfea2646970667358221220588505da1c7b424bb407ae12f31adc253e7a153717ef17b6fe17e9d51fd7271464736f6c63430007010033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c80636634b7531162000099578063851c1bb3116200006f578063851c1bb314620001cd5780638d928af814620001f3578063aaabadc514620001fd578063df8af989146200020757620000ff565b80636634b75314620001935780636c57f5a914620001b9578063739238d614620001c357620000ff565b80632f2770db11620000db5780632f2770db146200015a5780633f819b6f146200016657806354fd4d5014620001705780635ed31282146200017a57620000ff565b8062c194db1462000104578063174481fa14620001265780632da47c401462000140575b600080fd5b6200010e6200021e565b6040516200011d919062001435565b60405180910390f35b620001306200023f565b6040516200011d929190620013ce565b6200014a62000285565b6040516200011d9291906200162e565b620001646200030e565b005b6200010e62000378565b6200010e62000430565b62000184620004b2565b6040516200011d9190620013ad565b620001aa620001a436600462001137565b620004ce565b6040516200011d9190620013f5565b620001aa620004f9565b6200018462000502565b620001e4620001de36600462001178565b62000526565b6040516200011d919062001400565b620001846200057a565b620001846200059e565b6200018462000218366004620011d9565b6200062b565b60606200023a6040518060200160405280600081525062000a52565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200030057807f00000000000000000000000000000000000000000000000000000000000000000392507f0000000000000000000000000000000000000000000000000000000000000000915062000309565b60009250600091505b509091565b6200031862000b2d565b6200032262000b7c565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b820191906000526020600020905b8154815290600101906020018083116200040857829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016200055d9291906200134a565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000620005aa6200057a565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620005f057600080fd5b505afa15801562000605573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023a9190620011ba565b60006200063762000b95565b6004805460018101909155604051606090620006566020820162000fd8565b601f1982820381018352601f90910116604052620006736200057a565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001620006a7929190620013ce565b60408051601f1981840301815290829052620006c792916020016200137a565b60405160208183030381529060405290506000620006ed83838051906020012062000bb0565b9050600080620006fc62000285565b915091506200070a62000fe6565b620007146200057a565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508e81602001819052508d81604001819052508c816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508a8160c0018181525050898160e0018181525050828161010001818152505081816101200181815250508881610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506200087262000378565b610160820152604051600090620008a8906200089390849060200162001526565b60405160208183030381529060405262000bc6565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620008f357600080fd5b505af115801562000908573d6000803e3d6000fd5b5050505060006200091c6000898962000c1b565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146200098f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200098690620014b8565b60405180910390fd5b6040518a9073ffffffffffffffffffffffffffffffffffffffff8416907fdd6d1f79139f1dde24a93542b6f48323b2638466a8bedffc021d605a0d34afd490600090a3509650505050505050620009e562000cf9565b98975050505050505050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000a4c73ffffffffffffffffffffffffffffffffffffffff831615156101ac62000d00565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000b1f81838662000d15565b505050505050505050919050565b600062000b5e6000357fffffffff000000000000000000000000000000000000000000000000000000001662000526565b905062000b7962000b70823362000d73565b61019162000d00565b50565b62000b9362000b8a620004f9565b1560d362000d00565b565b62000ba96002600354141561019062000d00565b6002600355565b600062000bbf83833062000e11565b9392505050565b60008062000bd48362000e52565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790559392505050565b6000808447101562000c5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000986906200144a565b825162000c96576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200098690620014ef565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009869062001481565b949350505050565b6001600355565b8162000d115762000d118162000eed565b5050565b5b6020811062000d37578151835260209283019290910190601f190162000d16565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000d7f6200059e565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000dbd9392919062001409565b60206040518083038186803b15801562000dd657600080fd5b505afa15801562000deb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bbf919062001156565b60008060ff60f81b83868660405160200162000e319493929190620012e6565b60408051808303601f19018152919052805160209091012095945050505050565b600062000e5e62000b7c565b600062000e6b8362000f19565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b62000b79817f42414c000000000000000000000000000000000000000000000000000000000062000f5d565b6000606062000f288362000a52565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811662000bbf573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611e7e806200169383390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f830112620010c6578081fd5b813567ffffffffffffffff80821115620010de578283fd5b6040516020601f19601f8501168201018181108382111715620010ff578485fd5b6040528281529250828483016020018610156200111b57600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121562001149578081fd5b813562000bbf816200166f565b60006020828403121562001168578081fd5b8151801515811462000bbf578182fd5b6000602082840312156200118a578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811462000bbf578182fd5b600060208284031215620011cc578081fd5b815162000bbf816200166f565b600080600080600080600080610100898b031215620011f6578384fd5b883567ffffffffffffffff808211156200120e578586fd5b6200121c8c838d01620010b5565b995060208b013591508082111562001232578586fd5b50620012418b828c01620010b5565b975050604089013562001254816200166f565b9550606089013562001266816200166f565b94506080890135935060a0890135925060c089013562001286816200166f565b8092505060e089013590509295985092959890939650565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620012d28160208601602086016200163c565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b600083516200138e8184602088016200163c565b835190830190620013a48183602088016200163c565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000bbf6020830184620012b8565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b6000602082526200153c6020830184516200129e565b60208301516101808060408501526200155a6101a0850183620012b8565b91506040850151601f19808685030160608701526200157a8483620012b8565b9350606087015191506200159260808701836200129e565b60808701519150620015a860a08701836200129e565b60a08701519150620015be60c08701836200129e565b60c087015160e087810191909152870151610100808801919091528701516101208088019190915287015161014080880191909152870151915061016062001609818801846200129e565b870151868503909101838701529050620016248382620012b8565b9695505050505050565b918252602082015260400190565b60005b83811015620016595781810151838201526020016200163f565b8381111562001669576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000b7957600080fdfe6101606040523480156200001257600080fd5b5060405162001e7e38038062001e7e833981016040819052620000359162000462565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000378565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200012591908101906200039e565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000449565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000449565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000378565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000378565b6001600160601b0319606091821b811660e05292811b8316610120521b166101405250620004e0915050565b6000602082840312156200038a578081fd5b81516200039781620004c7565b9392505050565b60006020808385031215620003b1578182fd5b82516001600160401b0380821115620003c8578384fd5b818501915085601f830112620003dc578384fd5b815181811115620003eb578485fd5b8381029150620003fd848301620004a0565b8181528481019084860184860187018a101562000418578788fd5b8795505b838610156200043c5780518352600195909501949186019186016200041c565b5098975050505050505050565b6000602082840312156200045b578081fd5b5051919050565b6000806040838503121562000475578081fd5b82516200048281620004c7565b60208401519092506200049581620004c7565b809150509250929050565b6040518181016001600160401b0381118282101715620004bf57600080fd5b604052919050565b6001600160a01b0381168114620004dd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c6118bb620005c36000398061050952806108215250806101335280610c145280610f335280610f955250806103bf52508061046c5280610599528061074852806108ec5280610cbf528061102952806110f3528061115552508060ea5280610190528061043052806105cc528061063152806106d2528061078452806108b152806110d152508061016f5280610402528061071a5280610a7d5280610b5c5280610dbb5280610e9a5250806099528061030952506118bb6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611588565b60405180910390f35b610077610072366004611446565b6100bb565b60405161005b9190611824565b610077610092366004611462565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc92919061173d565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c91906114e8565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a939291906115d0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a491906114c5565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f5611393565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c96113f6565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611761565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059291906114ad565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d4f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611588565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b691906114ad565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fca565b9695505050505050565b600061070d611393565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e16113f6565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611761565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa91906114ad565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fe9565b6110b7565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d4f565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a919061156c565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b6919061148d565b6101a26111e8565b60006109cd82151560046111e8565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b60056111e8565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f61141d565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016116b9565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517fead5d35900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ead5d35990610cf99030908590600190600401611650565b6040805180830381600087803b158015610d1257600080fd5b505af1158015610d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4a91906114c5565b505050565b6040805160028082526060828101909352816020015b610d6d61141d565b815260200190600190039081610d65579050509050600281600081518110610d9157fe5b6020026020010151600001906002811115610da857fe5b90816002811115610db557fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de757fe5b602002602001015160200181815250508181600081518110610e0557fe5b602002602001015160600181815250508281600081518110610e2357fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e7057fe5b6020026020010151600001906002811115610e8757fe5b90816002811115610e9457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec657fe5b602002602001015160200181815250508181600181518110610ee457fe5b602002602001015160600181815250508281600181518110610f0257fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f589084167f0000000000000000000000000000000000000000000000000000000000000000846111f6565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016116b9565b610d4a8363a9059cbb60e01b848460405160240161027a92919061162a565b6040517ff57d0b4000000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063f57d0b409061105e908590600401611824565b60206040518083038186803b15801561107657600080fd5b505afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae91906114ad565b60010192915050565b61111873ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f0000000000000000000000000000000000000000000000000000000000000000836111f6565b6040517f2f2cab8700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632f2cab87906111929030908590600090600190600401611680565b602060405180830381600087803b1580156111ac57600080fd5b505af11580156111c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e491906114ad565b5050565b816111e4576111e4816112eb565b80158015906112a757506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e9061125490309086906004016115a9565b60206040518083038186803b15801561126c57600080fd5b505afa158015611280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a491906114ad565b15155b156112cc576112cc8363095ea7b360e01b84600060405160240161027a929190611601565b610d4a8363095ea7b360e01b848460405160240161027a92919061162a565b611315817f42414c0000000000000000000000000000000000000000000000000000000000611318565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b600060208284031215611457578081fd5b813561011b81611863565b60008060408385031215611474578081fd5b823561147f81611863565b946020939093013593505050565b60006020828403121561149e578081fd5b8151801515811461011b578182fd5b6000602082840312156114be578081fd5b5051919050565b600080604083850312156114d7578182fd5b505080516020909101519092909150565b600080600080608085870312156114fd578182fd5b845193506020850151925060408501519150606085015161151d81611863565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161157e81846020870161182d565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff93909316835260208301919091521515604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff949094168452602084019290925261ffff1660408301521515606082015260800190565b602080825282518282018190526000919060409081850190868401855b828110156117305781518051600381106116ec57fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff168686015260609081015190850152608090930192908501906001016116d6565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a0830152602084015161177c81611859565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c06101408401528051806101608501526101806117e8828287016020860161182d565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b6020830184611528565b90815260200190565b60005b83811015611848578181015183820152602001611830565b838111156102fc5750506000910152565b6002811061131557fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461131557600080fdfea264697066735822122071c747d079b6f1053812d61a96fcbf5bc452dc911a12f909d0042f154ded1ef764736f6c63430007010033a264697066735822122065ecf3480bf9ad478cba15525995609f6af30da1335ab0131715c1e05345e78564736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/index.ts b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/index.ts new file mode 100644 index 0000000..5a4466d --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/index.ts @@ -0,0 +1,103 @@ +import { bn } from '@helpers/numbers'; +import { Task, TaskMode, TaskRunOptions } from '@src'; +import { AaveLinearPoolDeployment } from './input'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import * as expectEvent from '@helpers/expectEvent'; +import { ethers } from 'hardhat'; +import { getContractDeploymentTransactionHash, saveContractDeploymentTransactionHash } from '@src'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as AaveLinearPoolDeployment; + const args = [ + input.Vault, + input.ProtocolFeePercentagesProvider, + input.BalancerQueries, + input.FactoryVersion, + input.PoolVersion, + input.InitialPauseWindowDuration, + input.BufferPeriodDuration, + ]; + + const factory = await task.deployAndVerify('AaveLinearPoolFactory', args, from, force); + + if (task.mode === TaskMode.LIVE) { + // We also create a Pool using the factory and verify it, to let us compute their action IDs and so that future + // Pools are automatically verified. We however don't run any of this code in CHECK mode, since we don't care about + // the contracts deployed here. The action IDs will be checked to be correct via a different mechanism. + + // AaveLinearPools require a StaticAToken, which in turn requires a LendingPool. + const mockLendingPool = await task.deployAndVerify('MockAaveLendingPool', [], from, force); + const mockStaticATokenArgs = ['DO NOT USE - Mock Static AToken', 'TEST', 18, input.WETH, mockLendingPool.address]; + const mockStaticAToken = await task.deployAndVerify('MockStaticAToken', mockStaticATokenArgs, from, force); + + // The assetManager, pauseWindowDuration and bufferPeriodDuration will be filled in later, but we need to declare + // them here to appease the type system. Those are constructor arguments, but automatically provided by the factory. + const mockPoolArgs = { + vault: input.Vault, + name: 'DO NOT USE - Mock Linear Pool', + symbol: 'TEST', + mainToken: input.WETH, + wrappedToken: mockStaticAToken.address, + assetManager: undefined, + upperTarget: 0, + pauseWindowDuration: undefined, + bufferPeriodDuration: undefined, + swapFeePercentage: bn(1e12), + owner: ZERO_ADDRESS, + version: input.PoolVersion, + }; + + // This mimics the logic inside task.deploy + if (force || !task.output({ ensure: false })['MockAaveLinearPool']) { + const PROTOCOL_ID = 0; + + const poolCreationReceipt = await ( + await factory.create( + mockPoolArgs.name, + mockPoolArgs.symbol, + mockPoolArgs.mainToken, + mockPoolArgs.wrappedToken, + mockPoolArgs.upperTarget, + mockPoolArgs.swapFeePercentage, + mockPoolArgs.owner, + PROTOCOL_ID + ) + ).wait(); + const event = expectEvent.inReceipt(poolCreationReceipt, 'PoolCreated'); + const mockPoolAddress = event.args.pool; + + await saveContractDeploymentTransactionHash(mockPoolAddress, poolCreationReceipt.transactionHash, task.network); + await task.save({ MockAaveLinearPool: mockPoolAddress }); + } + + const mockPool = await task.instanceAt('AaveLinearPool', task.output()['MockAaveLinearPool']); + + // In order to verify the Pool's code, we need to complete its constructor arguments by computing the factory + // provided arguments (asset manager and pause durations). + + // The asset manager is found by querying the Vault + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, task.network); + const vault = await vaultTask.deployedInstance('Vault'); + + const { assetManager: assetManagerAddress } = await vault.getPoolTokenInfo(await mockPool.getPoolId(), input.WETH); + mockPoolArgs.assetManager = assetManagerAddress; + + // The durations require knowing when the Pool was created, so we look for the timestamp of its creation block. + const txHash = await getContractDeploymentTransactionHash(mockPool.address, task.network); + const tx = await ethers.provider.getTransactionReceipt(txHash); + const poolCreationBlock = await ethers.provider.getBlock(tx.blockNumber); + + // With those and the period end times, we can compute the durations. + const { pauseWindowEndTime, bufferPeriodEndTime } = await mockPool.getPausedState(); + mockPoolArgs.pauseWindowDuration = pauseWindowEndTime.sub(poolCreationBlock.timestamp); + mockPoolArgs.bufferPeriodDuration = bufferPeriodEndTime + .sub(poolCreationBlock.timestamp) + .sub(mockPoolArgs.pauseWindowDuration); + + // We are now ready to verify the Pool + await task.verify('AaveLinearPool', mockPool.address, [mockPoolArgs]); + + // We can also verify the Asset Manager + await task.verify('AaveLinearPoolRebalancer', assetManagerAddress, [input.Vault, input.BalancerQueries]); + } +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/input.ts b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/input.ts new file mode 100644 index 0000000..b14a3c3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/input.ts @@ -0,0 +1,31 @@ +import { Task, TaskMode } from '@src'; +import { MONTH } from '@helpers/time'; + +export type AaveLinearPoolDeployment = { + Vault: string; + BalancerQueries: string; + ProtocolFeePercentagesProvider: string; + WETH: string; + FactoryVersion: string; + PoolVersion: string; + InitialPauseWindowDuration: number; + BufferPeriodDuration: number; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerQueries = new Task('20220721-balancer-queries', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); +const WETH = new Task('00000000-tokens', TaskMode.READ_ONLY); + +const BaseVersion = { version: 4, deployment: '20230206-aave-rebalanced-linear-pool-v4' }; + +export default { + Vault, + BalancerQueries, + ProtocolFeePercentagesProvider, + WETH, + FactoryVersion: JSON.stringify({ name: 'AaveLinearPoolFactory', ...BaseVersion }), + PoolVersion: JSON.stringify({ name: 'AaveLinearPool', ...BaseVersion }), + InitialPauseWindowDuration: MONTH * 3, + BufferPeriodDuration: MONTH, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/output/arbitrum.json new file mode 100644 index 0000000..128fac2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/output/arbitrum.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0xf23b4DB826DbA14c0e857029dfF076b1c0264843", + "MockAaveLendingPool": "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6", + "MockStaticAToken": "0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88", + "MockAaveLinearPool": "0x11884dA90FB4221b3aa288a7741C51eC4Fc43B2f" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/output/bsc.json b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/output/bsc.json new file mode 100644 index 0000000..128fac2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/output/bsc.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0xf23b4DB826DbA14c0e857029dfF076b1c0264843", + "MockAaveLendingPool": "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6", + "MockStaticAToken": "0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88", + "MockAaveLinearPool": "0x11884dA90FB4221b3aa288a7741C51eC4Fc43B2f" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/output/gnosis.json b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/output/gnosis.json new file mode 100644 index 0000000..cd733b1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/output/gnosis.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0x9dA18982a33FD0c7051B19F0d7C76F2d5E7e017c", + "MockAaveLendingPool": "0x81cFAE226343B24BA12EC6521Db2C79E7aeeb310", + "MockStaticAToken": "0xa523f47A933D5020b23629dDf689695AA94612Dc", + "MockAaveLinearPool": "0x225E0047671939A8d78e08EBd692788Abe63f15c" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/output/goerli.json new file mode 100644 index 0000000..8bcde51 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/output/goerli.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6", + "MockAaveLendingPool": "0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88", + "MockStaticAToken": "0x9dd5Db2d38b50bEF682cE532bCca5DfD203915E1", + "MockAaveLinearPool": "0x707B7d4a1bAe449d546DCAb869256591bbB3d70b" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/output/mainnet.json new file mode 100644 index 0000000..27bfb1e --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/output/mainnet.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88", + "MockAaveLendingPool": "0x9dd5Db2d38b50bEF682cE532bCca5DfD203915E1", + "MockStaticAToken": "0x9805dcfD25e6De36bad8fe9D3Fe2c9b44B764102", + "MockAaveLinearPool": "0x331d50e0b00fc1C32742F151E56B9B616227E23E" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/output/optimism.json b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/output/optimism.json new file mode 100644 index 0000000..128fac2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/output/optimism.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0xf23b4DB826DbA14c0e857029dfF076b1c0264843", + "MockAaveLendingPool": "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6", + "MockStaticAToken": "0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88", + "MockAaveLinearPool": "0x11884dA90FB4221b3aa288a7741C51eC4Fc43B2f" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/output/polygon.json new file mode 100644 index 0000000..128fac2 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/output/polygon.json @@ -0,0 +1,6 @@ +{ + "AaveLinearPoolFactory": "0xf23b4DB826DbA14c0e857029dfF076b1c0264843", + "MockAaveLendingPool": "0x76578ecf9a141296Ec657847fb45B0585bCDa3a6", + "MockStaticAToken": "0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88", + "MockAaveLinearPool": "0x11884dA90FB4221b3aa288a7741C51eC4Fc43B2f" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/readme.md b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/readme.md new file mode 100644 index 0000000..8bf4940 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/readme.md @@ -0,0 +1,19 @@ +# 2023-02-06 - Aave Rebalanced Linear Pool v4 + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> This deployment has been deprecated in favor of a new version that uses create2 for pool deployments: [aave-linear-pool-v5](../../20230410-aave-linear-pool-v5/). + +Deployment of the `AaveLinearPoolFactory`, for Linear Pools with a wrapped aToken. + +Supersedes `20221207-aave-rebalanced-linear-pool-v3`, fixing the reentrancy issue described in this [forum post](https://forum.balancer.fi/t/reentrancy-vulnerability-scope-expanded/4345). + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`AaveLinearPoolFactory` artifact](./artifact/AaveLinearPoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/test/test.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/test/test.fork.ts new file mode 100644 index 0000000..f432f2b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-aave-rebalanced-linear-pool-v4/test/test.fork.ts @@ -0,0 +1,383 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; +import { setCode } from '@nomicfoundation/hardhat-network-helpers'; +import * as expectEvent from '@helpers/expectEvent'; +import { bn, fp, FP_ONE } from '@helpers/numbers'; +import { MAX_UINT256 } from '@helpers/constants'; +import { deploy, instanceAt, getArtifact } from '@src'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; +import { SwapKind } from '@helpers/models/types/types'; +import { describeForkTest, impersonate, getForkedNetwork, Task, TaskMode, getSigners } from '@src'; + +describeForkTest('AaveLinearPoolFactory V4', 'mainnet', 16592300, function () { + let owner: SignerWithAddress, holder: SignerWithAddress, other: SignerWithAddress; + let factory: Contract, vault: Contract, usdt: Contract; + let rebalancer: Contract; + + let task: Task; + + const USDT = '0xdAC17F958D2ee523a2206206994597C13D831ec7'; + const waUSDT = '0xf8Fd466F12e236f4c96F7Cce6c79EAdB819abF58'; + const USDT_LENDING_POOL = '0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9'; + + const USDT_SCALING = bn(1e12); // USDT has 6 decimals, so its scaling factor is 1e12 + + const USDT_HOLDER = '0x5754284f345afc66a98fbb0a0afe71e0f007b949'; + + const SWAP_FEE_PERCENTAGE = fp(0.01); // 1% + + // The targets are set using 18 decimals, even if the token has fewer (as is the case for USDT); + const INITIAL_UPPER_TARGET = fp(1e7); + + // The initial midpoint (upper target / 2) must be between the final lower and upper targets + const FINAL_LOWER_TARGET = fp(0.2e7); + const FINAL_UPPER_TARGET = fp(5e7); + + const PROTOCOL_ID = 0; + + enum AttackType { + SET_TARGETS, + SET_SWAP_FEE, + } + + let pool: Contract; + let poolId: string; + + before('run task', async () => { + task = new Task('20230206-aave-rebalanced-linear-pool-v4', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('AaveLinearPoolFactory'); + }); + + before('load signers', async () => { + [, owner, other] = await getSigners(); + + holder = await impersonate(USDT_HOLDER, fp(100)); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + + usdt = await task.instanceAt('IERC20', USDT); + await usdt.connect(holder).approve(vault.address, MAX_UINT256); + }); + + enum LinearPoolState { + BALANCED, + MAIN_EXCESS, + MAIN_LACK, + } + + function itRebalancesThePool(expectedState: LinearPoolState) { + it('rebalance the pool', async () => { + const { lowerTarget, upperTarget } = await pool.getTargets(); + + const { cash } = await vault.getPoolTokenInfo(poolId, USDT); + const scaledCash = cash.mul(USDT_SCALING); + + let fees; + if (scaledCash.gt(upperTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_EXCESS); + + const excess = scaledCash.sub(upperTarget); + fees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else if (scaledCash.lt(lowerTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_LACK); + + const lack = lowerTarget.sub(scaledCash); + fees = lack.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else { + expect(expectedState).to.equal(LinearPoolState.BALANCED); + + fees = 0; + } + + const initialRecipientMainBalance = await usdt.balanceOf(other.address); + if (expectedState != LinearPoolState.BALANCED) { + await rebalancer.connect(holder).rebalance(other.address); + } else { + await rebalancer.connect(holder).rebalanceWithExtraMain(other.address, 5); + } + const finalRecipientMainBalance = await usdt.balanceOf(other.address); + + if (fees > 0) { + // The recipient of the rebalance call should get the fees that were collected (though there's some rounding + // error in the main-wrapped conversion). + expect(finalRecipientMainBalance.sub(initialRecipientMainBalance)).to.be.almostEqual( + fees.div(USDT_SCALING), + 0.00000001 + ); + } else { + // The recipient of the rebalance call will get any extra main tokens that were not utilized. + expect(finalRecipientMainBalance).to.be.almostEqual(initialRecipientMainBalance, 0.00000001); + } + + const mainInfo = await vault.getPoolTokenInfo(poolId, USDT); + + const expectedMainBalance = lowerTarget.add(upperTarget).div(2); + expect(mainInfo.cash.mul(USDT_SCALING)).to.equal(expectedMainBalance); + expect(mainInfo.managed).to.equal(0); + }); + } + + describe('create and check getters', () => { + it('deploy a linear pool', async () => { + const tx = await factory.create( + '', + '', + USDT, + waUSDT, + INITIAL_UPPER_TARGET, + SWAP_FEE_PERCENTAGE, + owner.address, + PROTOCOL_ID + ); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await task.instanceAt('AaveLinearPool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + const { assetManager } = await vault.getPoolTokenInfo(poolId, USDT); // We could query for either USDT or waUSDT + rebalancer = await task.instanceAt('AaveLinearPoolRebalancer', assetManager); + + await usdt.connect(holder).approve(rebalancer.address, MAX_UINT256); // To send extra main on rebalance + }); + + it('check factory version', async () => { + const expectedFactoryVersion = { + name: 'AaveLinearPoolFactory', + version: 4, + deployment: '20230206-aave-rebalanced-linear-pool-v4', + }; + + expect(await factory.version()).to.equal(JSON.stringify(expectedFactoryVersion)); + }); + + it('check pool version', async () => { + const expectedPoolVersion = { + name: 'AaveLinearPool', + version: 4, + deployment: '20230206-aave-rebalanced-linear-pool-v4', + }; + + expect(await pool.version()).to.equal(JSON.stringify(expectedPoolVersion)); + }); + }); + + describe('join, and rebalance', () => { + it('join the pool', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const joinAmount = INITIAL_UPPER_TARGET.mul(2).div(USDT_SCALING); + + await vault + .connect(holder) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: USDT, assetOut: pool.address, amount: joinAmount, userData: '0x' }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert join amount - some fees will be collected as we're going over the upper target. + const excess = joinAmount.mul(USDT_SCALING).sub(INITIAL_UPPER_TARGET); + const joinCollectedFees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + + const expectedBPT = joinAmount.mul(USDT_SCALING).sub(joinCollectedFees); + expect(await pool.balanceOf(holder.address)).to.equal(expectedBPT); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + + it('set final targets', async () => { + await pool.connect(owner).setTargets(FINAL_LOWER_TARGET, FINAL_UPPER_TARGET); + }); + }); + + describe('generate excess of main token and rebalance', () => { + it('deposit main tokens', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const { upperTarget } = await pool.getTargets(); + const joinAmount = upperTarget.mul(5).div(USDT_SCALING); + + await vault + .connect(holder) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: USDT, assetOut: pool.address, amount: joinAmount, userData: '0x' }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + }); + + describe('generate lack of main token and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to withdraw enough man token to bring the Pool below its lower target, which will let us later + // rebalance. + + const { cash } = await vault.getPoolTokenInfo(poolId, USDT); + const scaledCash = cash.mul(USDT_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(USDT_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDT, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_LACK); + }); + + describe('join below upper target and rebalance', () => { + it('deposit main tokens', async () => { + // We're going to join with few tokens, causing the Pool to not reach its upper target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const joinAmount = midpoint.div(100).div(USDT_SCALING); + + await vault + .connect(holder) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: USDT, assetOut: pool.address, amount: joinAmount, userData: '0x' }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('exit above lower target and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to exit with few tokens, causing for the Pool to not reach its lower target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const exitAmount = midpoint.div(100).div(USDT_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDT, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalance repeatedly', () => { + itRebalancesThePool(LinearPoolState.BALANCED); + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalancer query protection', async () => { + it('reverts with a malicious lending pool', async () => { + const { cash } = await vault.getPoolTokenInfo(poolId, USDT); + const scaledCash = cash.mul(USDT_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(USDT_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDT, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + + // These artifacts come from 20221207-aave-rebalanced-linear-pool-v3 task (deprecated). + await setCode(USDT_LENDING_POOL, getArtifact('MockAaveLendingPool').deployedBytecode); + const mockLendingPool = await instanceAt('MockAaveLendingPool', USDT_LENDING_POOL); + + await mockLendingPool.setRevertType(2); // Type 2 is malicious swap query revert + await expect(rebalancer.rebalance(other.address)).to.be.revertedWith('BAL#357'); // MALICIOUS_QUERY_REVERT + }); + }); + + describe('read-only reentrancy protection', () => { + let attacker: Contract; + + before('deploy attacker', async () => { + // Using ReadOnlyReentrancyAttackerAaveLP from 20230410-aave-linear-pool-v5 task + attacker = await deploy('ReadOnlyReentrancyAttackerAaveLP', [vault.address]); + }); + + async function performAttack(attackType: AttackType, ethAmount: BigNumber, expectRevert: boolean) { + // To trigger the callback and revert, send more than we need for the deposit + // If we send just enough, there will be no "extra" ETH, and it won't trigger the callback and attack + const amountToSend = expectRevert ? ethAmount.add(1) : ethAmount; + + const attack = attacker.startAttack(pool.address, attackType, ethAmount, { value: amountToSend }); + if (expectRevert) { + await expect(attack).to.be.revertedWith('BAL#420'); + } else { + await expect(attack).to.not.be.reverted; + } + } + + function itPerformsAttack(expectRevert: boolean) { + const action = expectRevert ? 'triggers' : 'does not trigger'; + + context('set targets', () => { + it(`${action} the set targets attack`, async () => { + await performAttack(AttackType.SET_TARGETS, fp(1), expectRevert); + }); + }); + + context('set swap fee', () => { + it(`${action} the set swap fee attack`, async () => { + await performAttack(AttackType.SET_SWAP_FEE, fp(1), expectRevert); + }); + }); + } + + context('when exactly enough ETH is sent', () => { + itPerformsAttack(false); + }); + + context('when too much ETH is sent', () => { + itPerformsAttack(true); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/artifact/ComposableStablePool.json b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/artifact/ComposableStablePool.json new file mode 100644 index 0000000..ff77a28 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/artifact/ComposableStablePool.json @@ -0,0 +1,1418 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ComposableStablePool", + "sourceName": "contracts/ComposableStablePool.sol", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "contract IRateProvider[]", + "name": "rateProviders", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenRateCacheDurations", + "type": "uint256[]" + }, + { + "internalType": "bool[]", + "name": "exemptFromYieldProtocolFeeFlags", + "type": "bool[]" + }, + { + "internalType": "uint256", + "name": "amplificationParameter", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + } + ], + "internalType": "struct ComposableStablePool.NewPoolParams", + "name": "params", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "startValue", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "endValue", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "startTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + } + ], + "name": "AmpUpdateStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "currentValue", + "type": "uint256" + } + ], + "name": "AmpUpdateStopped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "paused", + "type": "bool" + } + ], + "name": "PausedStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "feeType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "protocolFeePercentage", + "type": "uint256" + } + ], + "name": "ProtocolFeePercentageCacheUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "RecoveryModeStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + } + ], + "name": "SwapFeePercentageChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rate", + "type": "uint256" + } + ], + "name": "TokenRateCacheUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "tokenIndex", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "contract IRateProvider", + "name": "provider", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "cacheDuration", + "type": "uint256" + } + ], + "name": "TokenRateProviderSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DELEGATE_PROTOCOL_SWAP_FEES_SENTINEL", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "enableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getActualSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAmplificationParameter", + "outputs": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isUpdating", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "precision", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBptIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastJoinExitData", + "outputs": [ + { + "internalType": "uint256", + "name": "lastJoinExitAmplification", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastPostJoinExitInvariant", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMinimumBpt", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getNextNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPausedState", + "outputs": [ + { + "internalType": "bool", + "name": "paused", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "pauseWindowEndTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodEndTime", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "feeType", + "type": "uint256" + } + ], + "name": "getProtocolFeePercentageCache", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeesCollector", + "outputs": [ + { + "internalType": "contract IProtocolFeesCollector", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolSwapFeeDelegation", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRateProviders", + "outputs": [ + { + "internalType": "contract IRateProvider[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getScalingFactors", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSwapFeePercentage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "getTokenRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "getTokenRateCache", + "outputs": [ + { + "internalType": "uint256", + "name": "rate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "oldRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expires", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "inRecoveryMode", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "isTokenExemptFromYieldProtocolFee", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolSwapFeePercentage", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onExitPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolSwapFeePercentage", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onJoinPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IERC20", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IPoolSwapStructs.SwapRequest", + "name": "swapRequest", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "indexIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "indexOut", + "type": "uint256" + } + ], + "name": "onSwap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolSwapFeePercentage", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryExit", + "outputs": [ + { + "internalType": "uint256", + "name": "bptIn", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolSwapFeePercentage", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryJoin", + "outputs": [ + { + "internalType": "uint256", + "name": "bptOut", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "bytes", + "name": "poolConfig", + "type": "bytes" + } + ], + "name": "setAssetManagerPoolConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + } + ], + "name": "setSwapFeePercentage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "setTokenRateCacheDuration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "rawEndValue", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + } + ], + "name": "startAmplificationParameterUpdate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "stopAmplificationParameterUpdate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "updateProtocolFeePercentageCache", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "updateTokenRateCache", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6105006040523480156200001257600080fd5b5060405162007f5638038062007f56833981016040819052620000359162001b55565b6020810151600019620000488362000d93565b620000538462000dcc565b8461010001518560000151600087604001518860600151620000808a608001513062000e1560201b60201c565b8a60800151516001016001600160401b03811180156200009f57600080fd5b50604051908082528060200260200182016040528015620000ca578160200160208202803683370190505b508b61012001518c61014001518d61016001518e6101800151828289898d85336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b815250878781600390805190602001906200012c929190620017f2565b50805162000142906004906020840190620017f2565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001c090506276a70083111561019462000faf565b620001d462278d0082111561019562000faf565b4290910161014081905201610160528551620001f6906002111560c862000faf565b620002106200020462000fc4565b8751111560c962000faf565b620002268662000fc960201b620015511760201c565b620002318462000fd5565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f9062000262908d9060040162001ddb565b602060405180830381600087803b1580156200027d57600080fd5b505af115801562000292573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b8919062001b1d565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002ed9084908b908b9060040162001d3f565b600060405180830381600087803b1580156200030857600080fd5b505af11580156200031d573d6000803e3d6000fd5b505050508061018081815250508a6001600160a01b031663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200036457600080fd5b505afa15801562000379573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200039f919062001b36565b60601b6001600160601b0319166101a05250620003d1995050506001891015965061012c955062000faf945050505050565b620003e461138882111561012d62000faf565b6000620003ff826103e86200106960201b6200155b1760201c565b90506200040c8162001098565b5050805151620004216002821160c862000faf565b6200044660018203836020015151846040015151620010d760201b620015861760201c565b6101c0819052815180516000906200045a57fe5b60200260200101516001600160a01b0316610200816001600160a01b031660601b8152505081600001516001815181106200049157fe5b60200260200101516001600160a01b0316610220816001600160a01b031660601b815250508160000151600281518110620004c857fe5b60200260200101516001600160a01b0316610240816001600160a01b031660601b8152505060038111620004fe57600062000517565b8151805160039081106200050e57fe5b60200260200101515b60601b6001600160601b03191661026052600481116200053957600062000552565b8151805160049081106200054957fe5b60200260200101515b60601b6001600160601b0319166102805260058111620005745760006200058d565b8151805160059081106200058457fe5b60200260200101515b60601b6001600160601b0319166102a05281518051620005c69190600090620005b257fe5b6020026020010151620010f760201b60201c565b6102c05281518051620005e091906001908110620005b257fe5b6102e05281518051620005fa91906002908110620005b257fe5b61030052600381116200060f57600062000625565b620006258260000151600381518110620005b257fe5b61032052600481116200063a57600062000650565b620006508260000151600481518110620005b257fe5b6103405260058111620006655760006200067b565b6200067b8260000151600581518110620005b257fe5b61036052815151600019015b600081118015620006b857508251805130919083908110620006a557fe5b60200260200101516001600160a01b0316115b15620006c8576000190162000687565b6101e08190528251516060906001600160401b0381118015620006ea57600080fd5b5060405190808252806020026020018201604052801562000715578160200160208202803683370190505b50905060008080805b8751518110156200093857858110156200085457876020015181815181106200074357fe5b60200260200101518582815181106200075857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050620007c160006001600160a01b03168683815181106200079457fe5b60200260200101516001600160a01b031614158260060186620011c660201b620015a3179092919060201c565b935087604001518181518110620007d457fe5b60200260200101511562000849576200082060006001600160a01b0316868381518110620007fe57fe5b60200260200101516001600160a01b0316141561015562000faf60201b60201c565b6200083d60018286620011c660201b620015a3179092919060201c565b9350600192506200084e565b600191505b6200092f565b8581146200092f57876020015160018203815181106200087057fe5b60200260200101518582815181106200088557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050620008c160006001600160a01b03168683815181106200079457fe5b935087604001516001820381518110620008d757fe5b6020026020010151156200092a576200090160006001600160a01b0316868381518110620007fe57fe5b6200091e60018286620011c660201b620015a3179092919060201c565b9350600192506200092f565b600191505b6001016200071e565b50811560f890811b610460528115901b61048052835184906000906200095a57fe5b60200260200101516001600160a01b0316610380816001600160a01b031660601b81525050836001815181106200098d57fe5b60200260200101516001600160a01b03166103a0816001600160a01b031660601b8152505083600281518110620009c057fe5b60200260200101516001600160a01b03166103c0816001600160a01b031660601b815250506003845111620009f757600062000a0e565b8360038151811062000a0557fe5b60200260200101515b60601b6001600160601b0319166103e052835160041062000a3157600062000a48565b8360048151811062000a3f57fe5b60200260200101515b60601b6001600160601b03191661040052835160051062000a6b57600062000a82565b8360058151811062000a7957fe5b60200260200101515b60601b6001600160601b0319166104205250506104405250508251516020808501515160408601515162000ac595509293509190620010d7811b6200158617901c565b805160609062000ad6903062000e15565b8051909150600019015b60008111801562000b165750306001600160a01b031682828151811062000b0357fe5b60200260200101516001600160a01b0316115b1562000b26576000190162000ae0565b6000805b84515181101562000c3f578281141562000b4357600191505b60208501518051828401916000918490811062000b5c57fe5b60200260200101516001600160a01b03161462000c355762000bb6818760200151848151811062000b8957fe5b60200260200101518860400151858151811062000ba257fe5b6020026020010151620011ef60201b60201c565b8560200151828151811062000bc757fe5b60200260200101516001600160a01b0316817fdd6d1c9badb346de6925b358a472c937b41698d2632696759e43fd6527feeec48860400151858151811062000c0b57fe5b602002602001015160405162000c22919062001df0565b60405180910390a362000c3581620012ea565b5060010162000b2a565b5050505050600019811460f881901b6104c0526001600160601b0319606084901b166104a05262000c7283600262001329565b62000c7f83600362001329565b801562000c995762000c9383600062001329565b62000d58565b60405163178b2b9360e21b815262000d2d906001600160a01b03851690635e2cae4c9062000ccd9060009060040162001df0565b60206040518083038186803b15801562000ce657600080fd5b505afa15801562000cfb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d21919062001b1d565b83111561025862000faf565b600060008051602062007f368339815191528360405162000d4f919062001df0565b60405180910390a25b8062000d65578162000d68565b60005b6104e0525050506101a0810151805162000d8b91600d91602090910190620017f2565b505062001e62565b62000d9d62001873565b6040518060600160405280836080015181526020018360a0015181526020018360c0015181525090505b919050565b62000dd662001873565b604051806060016040528062000df784608001513062000e1560201b60201c565b81526020018360a0015181526020018360e001518152509050919050565b606082516001016001600160401b038111801562000e3257600080fd5b5060405190808252806020026020018201604052801562000e5d578160200160208202803683370190505b50905082516000141562000ea057818160008151811062000e7a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505062000fa9565b82515b60008111801562000edc5750826001600160a01b031684600183038151811062000ec957fe5b60200260200101516001600160a01b0316115b1562000f295783600182038151811062000ef257fe5b602002602001015182828151811062000f0757fe5b6001600160a01b03909216602092830291909101909101526000190162000ea3565b60005b8181101562000f785784818151811062000f4257fe5b602002602001015183828151811062000f5757fe5b6001600160a01b039092166020928302919091019091015260010162000f2c565b508282828151811062000f8757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050505b92915050565b8162000fc05762000fc081620014d4565b5050565b600690565b8062000fc081620014e9565b62000fee62000fe362001570565b82101560cb62000faf565b6200100762000ffc62001579565b82111560ca62000faf565b620010298160c0603f6008546200158560201b620015ca17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906200105e90839062001df0565b60405180910390a150565b600082820262001091841580620010895750838583816200108657fe5b04145b600362000faf565b9392505050565b620010a681804280620015aa565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a0233816040516200105e919062001df0565b620010f28284148015620010ea57508183145b606762000faf565b505050565b60006001600160a01b0382163014156200111b5750670de0b6b3a764000062000dc7565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200115757600080fd5b505afa1580156200116c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001192919062001d1c565b60ff1690506000620011b16012836200161d60201b620015f21760201c565b600a0a670de0b6b3a764000002949350505050565b60006001821b1984168284620011de576000620011e1565b60015b60ff16901b17949350505050565b6000826001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200122b57600080fd5b505afa15801562001240573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001266919062001b1d565b6000858152600a602090815260409091205491925062001295908290849086906200160862001635821b17901c565b6000868152600a602052604090819020919091555185907fb77a83204ca282e08dc3a65b0a1ca32ea4e6875c38ef0bf5bf75e52a67354fac90620012db90859062001df0565b60405180910390a25050505050565b6000818152600a602090815260409091205490620013139082906200164062001691821b17901c565b6000928352600a60205260409092209190915550565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c3263906200135a90859060040162001df0565b60206040518083038186803b1580156200137357600080fd5b505afa15801562001388573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620013ae919062001b1d565b905081620013f257620013cc81620016bc60201b620016581760201c565b600b80546001600160401b0319166001600160401b0392909216919091179055620014a6565b600282141562001448576200141281620016bc60201b620016581760201c565b600b80546001600160401b03929092166801000000000000000002600160401b600160801b0319909216919091179055620014a6565b600382141562001499576200146881620016bc60201b620016581760201c565b600b80546001600160401b0392909216600160801b02600160801b600160c01b0319909216919091179055620014a6565b620014a66101bb620014d4565b8160008051602062007f3683398151915282604051620014c7919062001df0565b60405180910390a2505050565b620014e6816210905360ea1b620016da565b50565b600281511015620014fa57620014e6565b6000816000815181106200150a57fe5b602002602001015190506000600190505b8251811015620010f25760008382815181106200153457fe5b6020026020010151905062001565816001600160a01b0316846001600160a01b031610606562000faf60201b60201c565b91506001016200151b565b64e8d4a5100090565b67016345785d8a000090565b6000620015948484846200173b565b506001901b60001901811b1992909216911b1790565b620015c48160c060406200179660201b620016751760201c565b620015de83608060406200179660201b620016751760201c565b620015f7856040806200179660201b620016751760201c565b6200161187600060406200179660201b620016751760201c565b17171760095550505050565b60006200162f83831115600162000faf565b50900390565b60006200164a606084901c1561014962000faf565b6200168942830160e06020620016738660c083838c8c60006060620015ca62001585871b17861c565b6200158560201b620015ca17909392919060201c565b949350505050565b600062000fa9620016a283620017ab565b606080856200158560201b620015ca17909392919060201c565b6000620016d66001600160401b038311156101ba62000faf565b5090565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6200174c6101008310606462000faf565b62001785600182101580156200177d57506200177960ff8461010003620017cb60201b620016881760201c565b8211155b606462000faf565b620010f283821c156101b462000faf565b6000620017a58484846200173b565b50501b90565b600062000fa96000606084620017e360201b6200169e179092919060201c565b6000818310620017dc578162001091565b5090919050565b6001901b6000190191901c1690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200183557805160ff191683800117855562001865565b8280016001018555821562001865579182015b828111156200186557825182559160200191906001019062001848565b50620016d692915062001894565b60405180606001604052806060815260200160608152602001606081525090565b5b80821115620016d6576000815560010162001895565b805162000fa98162001e4c565b600082601f830112620018c9578081fd5b8151620018e0620018da8262001e20565b62001df9565b8181529150602080830190848101818402860182018710156200190257600080fd5b6000805b858110156200193257825180151581146200191f578283fd5b8552938301939183019160010162001906565b50505050505092915050565b600082601f8301126200194f578081fd5b815162001960620018da8262001e20565b8181529150602080830190848101818402860182018710156200198257600080fd5b60005b84811015620019ae5781516200199b8162001e4c565b8452928201929082019060010162001985565b505050505092915050565b600082601f830112620019ca578081fd5b8151620019db620018da8262001e20565b818152915060208083019084810181840286018201871015620019fd57600080fd5b60005b84811015620019ae57815162001a168162001e4c565b8452928201929082019060010162001a00565b600082601f83011262001a3a578081fd5b815162001a4b620018da8262001e20565b81815291506020808301908481018184028601820187101562001a6d57600080fd5b60005b84811015620019ae5781518452928201929082019060010162001a70565b600082601f83011262001a9f578081fd5b81516001600160401b0381111562001ab5578182fd5b602062001acb601f8301601f1916820162001df9565b9250818352848183860101111562001ae257600080fd5b60005b8281101562001b0257848101820151848201830152810162001ae5565b8281111562001b145760008284860101525b50505092915050565b60006020828403121562001b2f578081fd5b5051919050565b60006020828403121562001b48578081fd5b8151620010918162001e4c565b60006020828403121562001b67578081fd5b81516001600160401b038082111562001b7e578283fd5b81840191506101c080838703121562001b95578384fd5b62001ba08162001df9565b905062001bae8684620018ab565b815262001bbf8660208501620018ab565b602082015260408301518281111562001bd6578485fd5b62001be48782860162001a8e565b60408301525060608301518281111562001bfc578485fd5b62001c0a8782860162001a8e565b60608301525060808301518281111562001c22578485fd5b62001c30878286016200193e565b60808301525060a08301518281111562001c48578485fd5b62001c5687828601620019b9565b60a08301525060c08301518281111562001c6e578485fd5b62001c7c8782860162001a29565b60c08301525060e08301518281111562001c94578485fd5b62001ca287828601620018b8565b60e083015250610100838101519082015261012080840151908201526101408084015190820152610160808401519082015261018062001ce587828601620018ab565b908201526101a0838101518381111562001cfd578586fd5b62001d0b8882870162001a8e565b918301919091525095945050505050565b60006020828403121562001d2e578081fd5b815160ff8116811462001091578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562001d8b5762001d78855162001e40565b8352938301939183019160010162001d63565b505084810360408601528551808252908201925081860190845b8181101562001dcd5762001dba835162001e40565b8552938301939183019160010162001da5565b509298975050505050505050565b602081016003831062001dea57fe5b91905290565b90815260200190565b6040518181016001600160401b038111828210171562001e1857600080fd5b604052919050565b60006001600160401b0382111562001e36578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114620014e657600080fd5b60805160a05160c05160e0516101005160601c6101205160601c6101405161016051610180516101a05160601c6101c0516101e0516102005160601c6102205160601c6102405160601c6102605160601c6102805160601c6102a05160601c6102c0516102e051610300516103205161034051610360516103805160601c6103a05160601c6103c05160601c6103e05160601c6104005160601c6104205160601c610440516104605160f81c6104805160f81c6104a05160601c6104c05160f81c6104e051615f166200202060003980610e2d52508061090a52508061088a52806108b552806108e05250806147175250806146f3525080612ac3528061436c525080611c1b525080611beb525080611bbb525080611b8b525080611b5b525080611b2b525080612f53525080612f23525080612ef3525080612ec3525080612e93525080612e63525080611f16525080611ed4525080611e92525080611e50525080611e0e525080611dcc5250806110495250806116cd525080611274525080610bec525080611aff525080611adb525080611149525080611125525080611081525080612cd1525080612d13525080612cf25250615f166000f3fe608060405234801561001057600080fd5b50600436106103785760003560e01c806370464016116101d3578063a457c2d711610104578063d505accf116100a2578063ddf4627b1161007c578063ddf4627b146106e3578063eb0f24d6146106eb578063ed24911d146106f3578063f4b7964d146106fb57610378565b8063d505accf146106aa578063d5c096c4146106bd578063dd62ed3e146106d057610378565b8063ab7759f1116100de578063ab7759f11461067f578063b35056b814610692578063b7b814fc1461069a578063d2946c2b146106a257610378565b8063a457c2d714610651578063a9059cbb14610664578063aaabadc51461067757610378565b8063851c1bb311610171578063893d20e81161014b578063893d20e8146106195780638d928af81461062e57806390193b7c1461063657806395d89b411461064957610378565b8063851c1bb3146105eb578063876f303b146105fe57806387ec68171461060657610378565b80637ecebe00116101ad5780637ecebe00146105a55780637f1260d1146105b857806382687a56146105db5780638456cb59146105e357610378565b8063704640161461055e57806370a082311461057157806374f3b0091461058457610378565b80633644e515116102ad57806354a844ba1161024b57806355c676281161022557806355c67628146105165780636028bfd41461051e578063679aefce1461053f5780636daccffa1461054757610378565b806354a844ba146104f357806354dea00a146104fb57806354fd4d501461050e57610378565b8063395093511161028757806339509351146104af5780633c975d51146104c25780633f4ba83a146104d857806350dd6ed9146104e057610378565b80633644e5151461048c57806338e9922e1461049457806338fff2d0146104a757610378565b80631c0de0511161031a57806323b872dd116102f457806323b872dd1461043e5780632df2c7c0146104515780632f1a0bc914610464578063313ce5671461047757610378565b80631c0de051146103fd5780631dd746ea14610414578063238a2d591461042957610378565b8063095ea7b311610356578063095ea7b3146103c35780630da0669c146103e357806315b0015b146103ed57806318160ddd146103f557610378565b806301ec954a1461037d57806304842d4c146103a657806306fdde03146103ae575b600080fd5b61039061038b366004615905565b61070e565b60405161039d9190615d26565b60405180910390f35b6103906107b4565b6103b66107c3565b60405161039d9190615dfc565b6103d66103d1366004615542565b610859565b60405161039d9190615d03565b6103eb610870565b005b6103d6610908565b61039061092c565b610405610932565b60405161039d93929190615d0e565b61041c61095b565b60405161039d9190615ccb565b610431610965565b60405161039d9190615be7565b6103d661044c366004615492565b610a00565b6103eb61045f36600461543e565b610a74565b6103eb610472366004615a54565b610ad8565b61047f610bbb565b60405161039d9190615e67565b610390610bc4565b6103eb6104a2366004615a24565b610bce565b610390610bea565b6103d66104bd366004615542565b610c0e565b6104ca610c49565b60405161039d929190615e3e565b6103eb610c74565b6103eb6104ee366004615740565b610c86565b6103eb610ca4565b61039061050936600461543e565b610cb6565b6103b6610cd1565b610390610d32565b61053161052c366004615659565b610d45565b60405161039d929190615e0f565b610390610d7c565b61054f610de8565b60405161039d93929190615e28565b61039061056c366004615a24565b610e03565b61039061057f36600461543e565b610ebc565b610597610592366004615659565b610ed7565b60405161039d929190615cde565b6103906105b336600461543e565b610fda565b6105cb6105c636600461543e565b610fe5565b60405161039d9493929190615e4c565b610390611047565b6103eb61106b565b6103906105f93660046156fc565b61107d565b6103906110cf565b610531610614366004615659565b6110fd565b610621611123565b60405161039d9190615bd3565b610621611147565b61039061064436600461543e565b61116b565b6103b6611186565b6103d661065f366004615542565b6111e7565b6103d6610672366004615542565b611225565b610621611232565b6103d661068d36600461543e565b61123c565b6103d661124f565b6103eb611260565b610621611272565b6103eb6106b83660046154d2565b611296565b6105976106cb366004615659565b611321565b6103906106de36600461545a565b611444565b610390611481565b6103eb611487565b6103906114b3565b6103eb610709366004615542565b6114bd565b6000846080015161073b610720611147565b6001600160a01b0316336001600160a01b03161460cd6116ad565b610750610746610bea565b82146101f46116ad565b6107586116bb565b61076a84846107656116cb565b6116ef565b6060610774611707565b905060008751600181111561078557fe5b1461079c5761079787878787856117a0565b6107a9565b6107a987878787856117f9565b979650505050505050565b60006107be611834565b905090565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561084f5780601f106108245761010080835404028352916020019161084f565b820191906000526020600020905b81548152906001019060200180831161083257829003601f168201915b5050505050905090565b600061086633848461183b565b5060015b92915050565b6108786118a3565b610880610908565b156108b0576108b07f00000000000000000000000000000000000000000000000000000000000000006000611918565b6108db7f00000000000000000000000000000000000000000000000000000000000000006002611918565b6109067f00000000000000000000000000000000000000000000000000000000000000006003611918565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061093f611abc565b15925061094a611ad9565b9150610954611afd565b9050909192565b60606107be611707565b606060006109716116cb565b905060608167ffffffffffffffff8111801561098c57600080fd5b506040519080825280602002602001820160405280156109b6578160200160208202803683370190505b50905060005b828110156109f9576109cd81611b21565b8282815181106109d957fe5b6001600160a01b03909216602092830291909101909101526001016109bc565b5091505090565b600080610a0d8533611444565b9050610a31336001600160a01b0387161480610a295750838210155b61019e6116ad565b610a3c858585611c4a565b336001600160a01b03861614801590610a5757506000198114155b15610a6957610a69853385840361183b565b506001949350505050565b610a7c611d2a565b6000610a8782611dc8565b90506000610a9482611b21565b9050610aad6001600160a01b03821615156101556116ad565b6000828152600a6020526040812054610ac590611f56565b9050610ad2838383611f65565b50505050565b610ae0612048565b610af0600183101561012c6116ad565b610b0161138883111561012d6116ad565b6000610b0d82426115f2565b9050610b216201518082101561013d6116ad565b600080610b2c612076565b91509150610b3d811561013e6116ad565b6000610b4b866103e861155b565b90506000838211610b7a57610b75610b66620151808661155b565b610b70848861155b565b6120ea565b610b94565b610b94610b8a620151808461155b565b610b70868861155b565b9050610ba6600282111561013f6116ad565b610bb28483428961211d565b50505050505050565b60055460ff1690565b60006107be6114b3565b610bd6612048565b610bde61216c565b610be78161217f565b50565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610866918590610c4490866121f8565b61183b565b600c546000908190610c5e8160e9601761169e565b9250610c6d81600060e961169e565b9150509091565b610c7c612048565b610906600061220a565b610c8e612048565b610c9661216c565b610ca0828261227d565b5050565b610cac612048565b6109066001612372565b6000610cc9610cc483611dc8565b6123c9565b90505b919050565b600d8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561084f5780601f106108245761010080835404028352916020019161084f565b6008546000906107be9060c0603f61169e565b60006060610d5b8651610d566116cb565b61241c565b610d708989898989898961242961244b6124b4565b97509795505050505050565b60006060600080600080610d8e6125de565b9398509196509450925090506000610da685856121f8565b90506000610db2612076565b5090506000848214610dcd57610dc882896126ce565b610dcf565b835b9050610ddb8184612830565b9850505050505050505090565b6000806000610df5612076565b90949093506103e892509050565b6000610e0d61124f565b15610e1a57506000610ccc565b81610e6657610e27610908565b610e51577f0000000000000000000000000000000000000000000000000000000000000000610e5f565b600b5467ffffffffffffffff165b9050610ccc565b6002821415610e8e5750600b5468010000000000000000900467ffffffffffffffff16610ccc565b6003821415610eb15750600b54600160801b900467ffffffffffffffff16610ccc565b610ccc6101bb612881565b6001600160a01b031660009081526020819052604090205490565b60608088610ee6610720611147565b610ef1610746610bea565b60606000610efe86612891565b15610f2657610f0b6128c0565b610f1d89610f1761092c565b886128d3565b92509050610f78565b610f2e6116bb565b6060610f38611707565b9050610f448a82612917565b610f688d8d8d8d8d610f5461124f565b610f5e578d610f61565b60005b878e612429565b93509150610f76838261244b565b505b610f828b82612980565b81895167ffffffffffffffff81118015610f9b57600080fd5b50604051908082528060200260200182016040528015610fc5578160200160208202803683370190505b509450945050505b5097509795505050505050565b6000610cc98261116b565b6000806000806000600a6000610ffa88611dc8565b8152602081019190915260400160002054905061101b8115156101556116ad565b6110248161298a565b945061102f81612998565b935061103a816129a6565b9597949650949392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b611073612048565b610906600161220a565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016110b2929190615b90565b604051602081830303815290604052805190602001209050919050565b60008060006110dc6125de565b505092509250506110f681836121f890919063ffffffff16565b9250505090565b6000606061110e8651610d566116cb565b610d70898989898989896129c86129d96124b4565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561084f5780601f106108245761010080835404028352916020019161084f565b6000806111f43385611444565b905080831061120e576112093385600061183b565b61121b565b61121b338585840361183b565b5060019392505050565b6000610866338484611c4a565b60006107be612a42565b6000610cc961124a83611dc8565b612abc565b6008546000906107be9060ff612ae4565b611268612048565b6109066000612372565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886112c58c61116b565b896040516020016112db96959493929190615d4e565b60405160208183030381529060405280519060200120905061130c8882611303878787612aee565b886101f8612b2d565b61131788888861183b565b5050505050505050565b60608088611330610720611147565b61133b610746610bea565b6113436116bb565b606061134d611707565b905061135761092c565b611404576000606061136c8d8d8d868b612b84565b9150915061138561137b611834565b83101560cc6116ad565b6113976000611392611834565b612c5d565b6113aa8b6113a3611834565b8403612c5d565b6113b481846129d9565b808a5167ffffffffffffffff811180156113cd57600080fd5b506040519080825280602002602001820160405280156113f7578160200160208202803683370190505b5095509550505050610fcd565b61140e8882612917565b600060606114368d8d8d8d8d61142261124f565b61142c578d61142f565b60005b898e6129c8565b915091506113aa8b83612c5d565b600061144e611147565b6001600160a01b0316826001600160a01b03161415611470575060001961086a565b61147a8383612c67565b905061086a565b60001981565b61148f612048565b60008061149a612076565b915091506114aa816101406116ad565b610ca082612c92565b60006107be612ccd565b6114c5612048565b6114cd611d2a565b60006114d883611dc8565b905060006114e582611b21565b90506114fe6001600160a01b03821615156101556116ad565b611509828285611f65565b806001600160a01b0316827fdd6d1c9badb346de6925b358a472c937b41698d2632696759e43fd6527feeec4856040516115439190615d26565b60405180910390a350505050565b80610ca081612d6a565b600082820261157f84158061157857508385838161157557fe5b04145b60036116ad565b9392505050565b61159e828414801561159757508183145b60676116ad565b505050565b60006001821b19841682846115b95760006115bc565b60015b60ff16901b17949350505050565b60006115d7848484612de3565b5082821b6000196001831b01831b198516175b949350505050565b60006116028383111560016116ad565b50900390565b600061161b606084901c156101496116ad565b6115ea42830160e060206116388660c083838c8c600060606115ca565b9291906115ca565b6000610cc961164e8361298a565b83906060806115ca565b600061167167ffffffffffffffff8311156101ba6116ad565b5090565b6000611682848484612de3565b50501b90565b6000818310611697578161157f565b5090919050565b6001901b6000190191901c1690565b81610ca057610ca081612881565b6116c3612e29565b610906612e31565b7f000000000000000000000000000000000000000000000000000000000000000090565b61159e818410801561170057508183105b60646116ad565b606060006117136116cb565b905060608167ffffffffffffffff8111801561172e57600080fd5b50604051908082528060200260200182016040528015611758578160200160208202803683370190505b50905060005b828110156109f957611781611772826123c9565b61177b83612e59565b90612f77565b82828151811061178d57fe5b602090810291909101015260010161175e565b60208501516000906001600160a01b03163014806117ca575060408601516001600160a01b031630145b6117e0576117db8686868686612fa3565b6117ed565b6117ed868686868661300d565b90505b95945050505050565b60208501516000906001600160a01b0316301480611823575060408601516001600160a01b031630145b6117e0576117db8686868686613111565b620f424090565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611896908590615d26565b60405180910390a3505050565b6118ab611d2a565b6118b361216c565b606060008060006118c26125de565b94509450945050935060008311156118dd576118dd83613168565b60006118e7612076565b5090506000838214611902576118fd82876126ce565b611904565b825b90506119108282613179565b505050505050565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c326390611947908590600401615d26565b60206040518083038186803b15801561195f57600080fd5b505afa158015611973573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119979190615a3c565b9050816119ce576119a781611658565b600b805467ffffffffffffffff191667ffffffffffffffff92909216919091179055611a7f565b6002821415611a1c576119e081611658565b600b805467ffffffffffffffff9290921668010000000000000000026fffffffffffffffff000000000000000019909216919091179055611a7f565b6003821415611a7457611a2e81611658565b600b805467ffffffffffffffff92909216600160801b027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff909216919091179055611a7f565b611a7f6101bb612881565b817f6bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a82604051611aaf9190615d26565b60405180910390a2505050565b6000611ac6611afd565b4211806107be57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b600081611b4f57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160011415611b7f57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160021415611baf57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160031415611bdf57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160041415611c0f57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160051415611c3f57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b610ccc610135612881565b611c616001600160a01b03841615156101986116ad565b611c786001600160a01b03831615156101996116ad565b611c8383838361159e565b6001600160a01b038316600090815260208190526040902054611ca990826101a061319f565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611cd890826121f8565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611896908590615d26565b60408051600080825260208201909252606091611d5d565b611d4a6152aa565b815260200190600190039081611d425790505b509050611d68611147565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b8152600401611d939190615c34565b600060405180830381600087803b158015611dad57600080fd5b505af1158015611dc1573d6000803e3d6000fd5b5050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e0c57506000610ccc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e4e57506001610ccc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e9057506002610ccc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611ed257506003610ccc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611f1457506004610ccc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611c3f57506005610ccc565b6000610cc98260c0602061169e565b6000826001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b158015611fa057600080fd5b505afa158015611fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd89190615a3c565b6000858152600a6020526040902054909150611ff5818385611608565b6000868152600a602052604090819020919091555185907fb77a83204ca282e08dc3a65b0a1ca32ea4e6875c38ef0bf5bf75e52a67354fac90612039908590615d26565b60405180910390a25050505050565b600061205f6000356001600160e01b03191661107d565b9050610be761206e82336131b5565b6101916116ad565b60008060008060008061208761329e565b9350935093509350804210156120da5760019450838311156120be5781810382420385850302816120b457fe5b04840195506120d5565b81810382420384860302816120cf57fe5b04840395505b6120e2565b600094508295505b505050509091565b60006120f982151560046116ad565b826121065750600061086a565b81600184038161211257fe5b04600101905061086a565b612129848484846132fd565b7f1835882ee7a34ac194f717a35e09bb1d24c82a3b9d854ab6c9749525b714cdf28484848460405161215e9493929190615e4c565b60405180910390a150505050565b610906612177611abc565b6101926116ad565b61219461218a61333c565b82101560cb6116ad565b6121a961219f613345565b82111560ca6116ad565b6008546121ba908260c0603f6115ca565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906121ed908390615d26565b60405180910390a150565b600082820161157f84821015836116ad565b801561222a5761222561221b611ad9565b42106101936116ad565b61223f565b61223f612235611afd565b42106101a96116ad565b6007805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be64906121ed908390615d03565b6000612287610bea565b90506000612293611147565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b81526004016122c0929190615dc7565b60806040518083038186803b1580156122d857600080fd5b505afa1580156122ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123109190615a75565b604051630639cdb560e21b81529094506001600160a01b03851693506318e736d49250612344915085908790600401615dae565b600060405180830381600087803b15801561235e57600080fd5b505af1158015611317573d6000803e3d6000fd5b600854612381908260ff6115a3565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c8906123b4908390615d03565b60405180910390a180610be757610be7613351565b60006123d3611047565b8214156123e95750670de0b6b3a7640000610ccc565b6000828152600a6020526040902054801561240c576124078161298a565b61157f565b670de0b6b3a76400009392505050565b610ca081831460676116ad565b6000606061243a600088868661342b565b915091509850989650505050505050565b8151815161245a90829061241c565b60005b81811015610ad25761249584828151811061247457fe5b602002602001015184838151811061248857fe5b6020026020010151612830565b8482815181106124a157fe5b602090810291909101015260010161245d565b333014612572576000306001600160a01b03166000366040516124d8929190615ba8565b6000604051808303816000865af19150503d8060008114612515576040519150601f19603f3d011682016040523d82523d6000602084013e61251a565b606091505b50509050806000811461252957fe5b60046000803e6000516001600160e01b0319166343adbafb60e01b8114612554573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b61257a6116bb565b6060612584611707565b90506125908782612917565b600060606125a88c8c8c8c8c8c898d8d63ffffffff16565b915091506125ba81848663ffffffff16565b8051601f1982018390526343adbafb603f1983015260200260231982016044820181fd5b606060008060008060606125f0611147565b6001600160a01b031663f94d4668612606610bea565b6040518263ffffffff1660e01b81526004016126229190615d26565b60006040518083038186803b15801561263a57600080fd5b505afa15801561264e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612676919081019061556d565b5091505061268b81612686611707565b612917565b612694816134d9565b9650945060006126a2610c49565b909450905060006126b4888684613512565b945090506126c2878261359f565b95505050509091929394565b80516000908190815b8181101561270f576127058582815181106126ee57fe5b6020026020010151846121f890919063ffffffff16565b92506001016126d7565b50816127205760009250505061086a565b600082868302825b60ff811015612819578260005b868110156127765761276c61274a838761155b565b6127678c848151811061275957fe5b60200260200101518a61155b565b6135b7565b9150600101612735565b508394506127cf6127ae6127a861278d848a61155b565b6127a261279a888d61155b565b6103e86135b7565b906121f8565b8661155b565b6127676127be896001018561155b565b6127a261279a6103e889038a61155b565b9350848411156127f7576001858503116127f2578397505050505050505061086a565b612810565b600184860311612810578397505050505050505061086a565b50600101612728565b50612825610141612881565b505050505092915050565b600061283f82151560046116ad565b8261284c5750600061086a565b670de0b6b3a76400008381029061286f9085838161286657fe5b041460056116ad565b82818161287857fe5b0491505061086a565b610be7816210905360ea1b6135d7565b6000808251118015610cc9575060ff8016828060200190518101906128b69190615ab5565b60ff161492915050565b6109066128cb61124f565b6101b66116ad565b60006060600060606128e4876134d9565b91509150600060606128f7838589613638565b9150915081612907826000613664565b9550955050505050935093915050565b8151815161292690829061241c565b60005b81811015610ad25761296184828151811061294057fe5b602002602001015184838151811061295457fe5b6020026020010151612f77565b84828151811061296d57fe5b6020908102919091010152600101612929565b610ca08282613721565b6000610cc98282606061169e565b6000610cc98260608061169e565b6000806129b283611f56565b91506129c18360e0602061169e565b9050915091565b6000606061243a600188868661342b565b815181516129e890829061241c565b60005b81811015610ad257612a23848281518110612a0257fe5b6020026020010151848381518110612a1657fe5b60200260200101516137ed565b848281518110612a2f57fe5b60209081029190910101526001016129eb565b6000612a4c611147565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015612a8457600080fd5b505afa158015612a98573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107be9190615724565b6000610cc97f0000000000000000000000000000000000000000000000000000000000000000835b1c60019081161490565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b6000612b388561383b565b9050612b4e612b48878387613857565b836116ad565b612b5d428410156101b86116ad565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606000612b9384613906565b9050612bae6000826003811115612ba657fe5b1460ce6116ad565b6060612bb98561391c565b9050612bc78151875161241c565b612bd18187612917565b6000612bdb612076565b5090506060612be983613932565b90506000612bf783836126ce565b9050806000612c146d8000000000000000000000000000836115f2565b9050612c208d82612c5d565b8086612c2a611047565b81518110612c3457fe5b602002602001018181525050612c4a8584613179565b509c939b50929950505050505050505050565b610ca082826139d4565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b612c9e818242426132fd565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a0233816040516121ed9190615d26565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612d3a613a61565b30604051602001612d4f959493929190615d82565b60405160208183030381529060405280519060200120905090565b600281511015612d7957610be7565b600081600081518110612d8857fe5b602002602001015190506000600190505b825181101561159e576000838281518110612db057fe5b60200260200101519050612dd9816001600160a01b0316846001600160a01b03161060656116ad565b9150600101612d99565b612df2610100831060646116ad565b612e1a600182101580156117005750612e1060ff8461010003611688565b82111560646116ad565b61159e83821c156101b46116ad565b61090661216c565b6000612e3b6116cb565b905060005b81811015610ca057612e5181613a65565b600101612e40565b600081612e8757507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160011415612eb757507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160021415612ee757507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160031415612f1757507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160041415612f4757507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160051415611c3f57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b6000828202612f9184158061157857508385838161157557fe5b670de0b6b3a764000090049392505050565b6000612faf8583612917565b612fd08660600151838581518110612fc357fe5b6020026020010151613ab9565b60608701526000612fe387878787613ac5565b905061300281848781518110612ff557fe5b6020026020010151613ad9565b90506107a981613ae5565b600080808751600181111561301e57fe5b14905061302b8684612917565b61304b8760600151848361303f5786613041565b875b81518110612fc357fe5b876060018181525050600060606000806130648a613b01565b9350935093509350600080613077611047565b8a1461309d57613098878e60600151876130908e613b6a565b888b89613b9f565b6130b8565b6130b8878e60600151876130b08f613b6a565b888b89613bd8565b915091506130c98486858985613bfc565b866130e3576130de828a8d81518110612ff557fe5b613100565b613100828a8c815181106130f357fe5b6020026020010151613c7c565b9d9c50505050505050505050505050565b60006131208660600151613c88565b606087015261312f8583612917565b6131438660600151838681518110612fc357fe5b6060870152600061315687878787613ca9565b90506107a9818486815181106130f357fe5b610be7613173611272565b82612c5d565b61318681600060e9611675565b6131938360e96017611675565b17600c55610ca0613cbd565b60006131ae84841115836116ad565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6131d4611123565b6001600160a01b0316141580156131ef57506131ef83613cf3565b15613217576131fc611123565b6001600160a01b0316336001600160a01b031614905061086a565b61321f612a42565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161324e93929190615d2f565b60206040518083038186803b15801561326657600080fd5b505afa15801561327a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147a9190615639565b6000806000806132bd6000604060095461169e9092919063ffffffff16565b6009549094506132cf9060408061169e565b6009549093506132e2906080604061169e565b6009549092506132f59060c0604061169e565b905090919293565b61330a8160c06040611675565b6133178360806040611675565b61332385604080611675565b6133308760006040611675565b17171760095550505050565b64e8d4a5100090565b67016345785d8a000090565b613359611d2a565b6060613363611147565b6001600160a01b031663f94d4668613379610bea565b6040518263ffffffff1660e01b81526004016133959190615d26565b60006040518083038186803b1580156133ad57600080fd5b505afa1580156133c1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133e9919081019061556d565b509150506133f981612686611707565b606061340482613932565b90506000613410612076565b509050600061341f82846126ce565b9050610ad28282613179565b600060606000606060008061343f89613b01565b93509350935093506152da8a61345757613cfe61345b565b613d935b905060006060613473868689878f8f8963ffffffff16565b915091506152da8d613487576115f261348b565b6121f85b9050613498878383613e11565b60006134a889858463ffffffff16565b90506134b78789888c85613bfc565b836134c3846000613664565b9a509a5050505050505050505094509492505050565b60006060613500836134e9611047565b815181106134f357fe5b6020026020010151613e7e565b61350984613932565b91509150915091565b60008060008060006135248888613e92565b925092509250600086841161353a57600061353e565b8684035b90506000848411613550576000613554565b8484035b9050600061356f6135656000610e03565b61177b8587612830565b9050600061358a6135806002610e03565b61177b8588612830565b919091019b939a509298505050505050505050565b600061157f6135ae848461155b565b61276784613f14565b60006135c682151560046116ad565b8183816135cf57fe5b049392505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60006060600061364784613f3a565b90506060613656878784613f50565b919791965090945050505050565b6060825160010167ffffffffffffffff8111801561368157600080fd5b506040519080825280602002602001820160405280156136ab578160200160208202803683370190505b50905060005b815181101561371a576136c2611047565b81146136f957836136d1611047565b82106136e057600182036136e2565b815b815181106136ec57fe5b60200260200101516136fb565b825b82828151811061370757fe5b60209081029190910101526001016136b1565b5092915050565b6137386001600160a01b038316151561019b6116ad565b6137448260008361159e565b6001600160a01b03821660009081526020819052604090205461376a90826101b261319f565b6001600160a01b03831660009081526020819052604090205561379d6137988261379261092c565b90613fff565b61400d565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516137e19190615d26565b60405180910390a35050565b60006137fc82151560046116ad565b826138095750600061086a565b670de0b6b3a7640000838102906138239085838161286657fe5b82600182038161382f57fe5b0460010191505061086a565b6000613845612ccd565b826040516020016110b2929190615bb8565b600061386982516041146101b96116ad565b60208281015160408085015160608601518251600080825295019283905292939092811a916001906138a2908990859088908890615dde565b6020604051602081039080840390855afa1580156138c4573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906138fa5750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b600081806020019051810190610cc9919061584f565b60608180602001905181019061157f919061586a565b606080600183510367ffffffffffffffff8111801561395057600080fd5b5060405190808252806020026020018201604052801561397a578160200160208202803683370190505b50905060005b815181101561371a5783613992611047565b82106139a157816001016139a3565b815b815181106139ad57fe5b60200260200101518282815181106139c157fe5b6020908102919091010152600101613980565b6139e06000838361159e565b6139ef613798826127a261092c565b6001600160a01b038216600090815260208190526040902054613a1290826121f8565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906137e1908590615d26565b4690565b613a6d611047565b811415613a7957610be7565b6000818152600a60205260409020548015610ca057600080613a9a836129a6565b9150915080421115610ad257610ad284613ab386611b21565b84611f65565b600061157f8383612f77565b60006117f060008660600151868686614012565b600061157f83836137ed565b6000610cc9613afa613af5610d32565b613f14565b83906137ed565b60006060600080600080613b13610c49565b91509150600060606000613b288a8686614084565b9250925092506000613b38612076565b5090506000868214613b5357613b4e82856126ce565b613b55565b825b949c939b509099509297509095505050505050565b6000613b81613b77611047565b83141560646116ad565b613b89611047565b821061167157613b9a8260016115f2565b610cc9565b60008088613bba57613bb58888888888886140dc565b613bc8565b613bc88888888888886141b3565b9150915097509795505050505050565b60008088613bee57613bb5888888888888614214565b613bc888888888888861427a565b6000613c0886866126ce565b90506000613c168385612830565b90506000613c248683612f77565b905080831115613c72578083036000613c4e613c4883613c4384610e03565b61155b565b866135b7565b90508015613c6f576000613c62878361359f565b9050613c6d81613168565b505b50505b6113178884613179565b600061157f8383612830565b600080613c9d613c96610d32565b8490614329565b905061157f83826115f2565b60006117f060018660600151868686614012565b6000613cc76116cb565b905060005b81811015610ca057613cdd81614365565b15613ceb57613ceb81614394565b600101613ccc565b6000610cc9826143c2565b600060606000613d0d846143cd565b90506001816002811115613d1d57fe5b1415613d3b57613d3187878a8c89896143e3565b9250925050613d88565b6002816002811115613d4957fe5b1415613d5a57613d31878a86614442565b6000816002811115613d6857fe5b1415613d7b57613d3187878a8c88614460565b613d86610150612881565b505b965096945050505050565b600060606000613da284613906565b90506001816003811115613db257fe5b1415613dc657613d3187878a8c8989614501565b6003816003811115613dd457fe5b1415613de557613d31878a86614550565b6002816003811115613df357fe5b1415613e0657613d3187878a8c8861456e565b613d86610136612881565b82518251613e2090829061241c565b60005b81811015611dc157613e5f858281518110613e3a57fe5b6020026020010151858381518110613e4e57fe5b60200260200101518563ffffffff16565b858281518110613e6b57fe5b6020908102919091010152600101613e23565b6000610cc982613e8c61092c565b906115f2565b6000806000613eab84613ea68760016145e8565b6126ce565b9250613eb56146f1565b15613ece57613ec484866126ce565b9150819050613f0d565b613ed6614715565b15613eef57829150613ee884866126ce565b9050613f0d565b613efe84613ea68760006145e8565b9150613f0a84866126ce565b90505b9250925092565b6000670de0b6b3a76400008210613f2c576000610cc9565b50670de0b6b3a76400000390565b60008180602001905181019061157f9190615ad1565b60606000613f5e8385612830565b9050845167ffffffffffffffff81118015613f7857600080fd5b50604051908082528060200260200182016040528015613fa2578160200160208202803683370190505b50915060005b8551811015613ff657613fd782878381518110613fc157fe5b6020026020010151612f7790919063ffffffff16565b838281518110613fe357fe5b6020908102919091010152600101613fa8565b50509392505050565b600061157f8383600161319f565b600255565b6000606061401f85613932565b9050600061402c85613b6a565b9050600061403985613b6a565b90506000614045612076565b509050600061405482866126ce565b90508a156140765761406a828686868e86614739565b955050505050506117f0565b61406a828686868e866147c4565b600060606000806060614096886134d9565b915091506000806140a8838a8a613512565b9150915060006140b8858461359f565b905080156140c9576140c981613168565b9390930199919850919650945050505050565b6000806060875167ffffffffffffffff811180156140f957600080fd5b50604051908082528060200260200182016040528015614123578160200160208202803683370190505b5090508881888151811061413357fe5b6020026020010181815250506000614156878a848989614151610d32565b614857565b905061417e8a8a8a8151811061416857fe5b60200260200101516115f290919063ffffffff16565b89898151811061418a57fe5b602090810291909101015260006141a187836115f2565b919b919a509098505050505050505050565b60008060006141ce8689898c89896141c9610d32565b614ae7565b90506141e08189898151811061416857fe5b8888815181106141ec57fe5b60209081029190910101526000614203868b6115f2565b919a91995090975050505050505050565b600080600061422f8689898c898961422a610d32565b614bd6565b90506142578189898151811061424157fe5b60200260200101516121f890919063ffffffff16565b88888151811061426357fe5b60209081029190910101526000614203868b6121f8565b6000806060875167ffffffffffffffff8111801561429757600080fd5b506040519080825280602002602001820160405280156142c1578160200160208202803683370190505b509050888188815181106142d157fe5b60200260200101818152505060006142f4878a8489896142ef610d32565b614ca3565b90506143068a8a8a8151811061424157fe5b89898151811061431257fe5b602090810291909101015260006141a187836121f8565b600082820261434384158061157857508385838161157557fe5b8061435257600091505061086a565b670de0b6b3a7640000600019820161382f565b6000610cc97f000000000000000000000000000000000000000000000000000000000000000060068401612ae4565b6000818152600a60205260409020546143ac81611640565b6000928352600a60205260409092209190915550565b6000610cc982614f0d565b600081806020019051810190610cc9919061578e565b600060608060006143f385614f30565b915091506144038251885161241c565b6144108261268688613932565b60006144228989858e8e614151610d32565b90506144328282111560cf6116ad565b9a91995090975050505050505050565b60006060600061445184614f53565b90506060613656868884613f50565b6000606060008061447085614f69565b915091506144828651821060646116ad565b6060865167ffffffffffffffff8111801561449c57600080fd5b506040519080825280602002602001820160405280156144c6578160200160208202803683370190505b5090506144da888884868e8e6141c9610d32565b8183815181106144e657fe5b60209081029190910101529199919850909650505050505050565b6000606080600061451185614f80565b915091506145218751835161241c565b61452e8261268688613932565b60006145408989858e8e6142ef610d32565b90506144328282101560d06116ad565b60006060600061455f84614f98565b90506060613656868389614fae565b6000606060008061457e8561504a565b915091506145908651821060646116ad565b6060865167ffffffffffffffff811180156145aa57600080fd5b506040519080825280602002602001820160405280156145d4578160200160208202803683370190505b5090506144da888884868e8e61422a610d32565b8151606090818167ffffffffffffffff8111801561460557600080fd5b5060405190808252806020026020018201604052801561462f578160200160208202803683370190505b50905060005b828110156146e8576000614647611047565b8210156146545781614659565b816001015b905061466481612abc565b8061467b575085801561467b575061467b81614365565b6146985786828151811061468b57fe5b60200260200101516146c8565b6146c88783815181106146a757fe5b6020026020010151600a600084815260200190815260200160002054615061565b8383815181106146d457fe5b602090810291909101015250600101614635565b50949350505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061474b8387878151811061424157fe5b86868151811061475757fe5b60200260200101818152505060006147718888858861507c565b90508387878151811061478057fe5b60200260200101510387878151811061479557fe5b6020026020010181815250506147b66001613e8c838a898151811061416857fe5b9150505b9695505050505050565b60006147d68387868151811061416857fe5b8685815181106147e257fe5b60200260200101818152505060006147fc8888858961507c565b90508387868151811061480b57fe5b60200260200101510187868151811061482057fe5b6020026020010181815250506147b660016127a289898151811061484057fe5b6020026020010151846115f290919063ffffffff16565b600080805b87518110156148955761488b88828151811061487457fe5b6020026020010151836121f890919063ffffffff16565b915060010161485c565b506060865167ffffffffffffffff811180156148b057600080fd5b506040519080825280602002602001820160405280156148da578160200160208202803683370190505b5090506000805b89518110156149a7576000614912858c84815181106148fc57fe5b60200260200101516137ed90919063ffffffff16565b90506149548b838151811061492357fe5b602002602001015161494e8c858151811061493a57fe5b60200260200101518e868151811061416857fe5b906137ed565b84838151811061496057fe5b60200260200101818152505061499c6149958286858151811061497f57fe5b602002602001015161432990919063ffffffff16565b84906121f8565b9250506001016148e1565b506060895167ffffffffffffffff811180156149c257600080fd5b506040519080825280602002602001820160405280156149ec578160200160208202803683370190505b50905060005b8a51811015614ab7576000848281518110614a0957fe5b6020026020010151841115614a70576000614a32614a2686613f14565b8e8581518110613fc157fe5b90506000614a46828e868151811061416857fe5b9050614a67614a6082670de0b6b3a76400008d90036137ed565b83906121f8565b92505050614a87565b8a8281518110614a7c57fe5b602002602001015190505b614a97818d848151811061416857fe5b838381518110614aa357fe5b6020908102919091010152506001016149f2565b506000614ac48c836126ce565b90506000614ad2828a612830565b9050613100614ae082613f14565b8b90614329565b600080614b0284614afc8761494e818b6115f2565b90614329565b90506000614b128a8a848b61507c565b90506000614b26828b8b8151811061416857fe5b90506000805b8b51811015614b4e57614b448c828151811061487457fe5b9150600101614b2c565b506000614b77828d8d81518110614b6157fe5b602002602001015161283090919063ffffffff16565b90506000614b8482613f14565b90506000614b928583614329565b90506000614ba086836115f2565b9050614bc1614bba83670de0b6b3a76400008d9003612f77565b82906121f8565b98505050505050505050979650505050505050565b600080614beb84614afc8761494e818b6121f8565b90506000614bfb8a8a848b61507c565b90506000614c258a8a81518110614c0e57fe5b6020026020010151836115f290919063ffffffff16565b90506000805b8b51811015614c4d57614c438c828151811061487457fe5b9150600101614c2b565b506000614c60828d8d81518110614b6157fe5b90506000614c6d82613f14565b90506000614c7b8583614329565b90506000614c8986836115f2565b9050614bc1614bba83670de0b6b3a76400008d90036137ed565b600080805b8751811015614cca57614cc088828151811061487457fe5b9150600101614ca8565b506060865167ffffffffffffffff81118015614ce557600080fd5b50604051908082528060200260200182016040528015614d0f578160200160208202803683370190505b5090506000805b8951811015614da9576000614d31858c8481518110614b6157fe5b9050614d738b8381518110614d4257fe5b6020026020010151614d6d8c8581518110614d5957fe5b60200260200101518e868151811061424157fe5b90612830565b848381518110614d7f57fe5b602002602001018181525050614d9e61499582868581518110613fc157fe5b925050600101614d16565b506060895167ffffffffffffffff81118015614dc457600080fd5b50604051908082528060200260200182016040528015614dee578160200160208202803683370190505b50905060005b8a51811015614eaf57600083858381518110614e0c57fe5b60200260200101511115614e68576000614e31614a2686670de0b6b3a76400006115f2565b90506000614e45828e868151811061416857fe5b9050614e5f614a6082670de0b6b3a76400008d9003612f77565b92505050614e7f565b8a8281518110614e7457fe5b602002602001015190505b614e8f818d848151811061424157fe5b838381518110614e9b57fe5b602090810291909101015250600101614df4565b506000614ebc8c836126ce565b90506000614eca828a612830565b9050670de0b6b3a7640000811115614efe57614ef18a670de0b6b3a763ffff198301612f77565b96505050505050506147ba565b600096505050505050506147ba565b6000614f1f63f4b7964d60e01b61107d565b821480610cc95750610cc982615239565b6060600082806020019051810190614f4891906157a9565b909590945092505050565b60008180602001905181019061157f91906157ee565b60008082806020019051810190614f48919061581a565b6060600082806020019051810190614f4891906158ad565b60008180602001905181019061157f91906158cb565b60606000614fbc84846137ed565b90506060855167ffffffffffffffff81118015614fd857600080fd5b50604051908082528060200260200182016040528015615002578160200160208202803683370190505b50905060005b8651811015615040576150218388838151811061497f57fe5b82828151811061502d57fe5b6020908102919091010152600101615008565b5095945050505050565b60008082806020019051810190614f4891906158e7565b600061157f61507384613c4385612998565b6127678461298a565b60008084518602905060008560008151811061509457fe5b6020026020010151905060008651876000815181106150af57fe5b60200260200101510290506000600190505b8751811015615115576150fa6150f46150ed848b85815181106150e057fe5b602002602001015161155b565b8a5161155b565b886135b7565b915061510b8882815181106126ee57fe5b92506001016150c1565b5086858151811061512257fe5b602002602001015182039150600061513a878861155b565b9050600061516661515a61515284610b70898861155b565b6103e861155b565b8a89815181106150e057fe5b9050600061518161517a6151528b896135b7565b86906121f8565b905060008061519d61519386866121f8565b610b708d866121f8565b905060005b60ff81101561521d578192506151d26151bf866127a2858661155b565b610b708e613e8c886127a288600261155b565b9150828211156151fb576001838303116151f6575097506115ea9650505050505050565b615215565b600182840311615215575097506115ea9650505050505050565b6001016151a2565b50615229610142612881565b5050505050505050949350505050565b600061524b632f1a0bc960e01b61107d565b8214806152665750615263637587926b60e11b61107d565b82145b80610cc95750610cc9826000615282631c74c91760e11b61107d565b82148061529d575061529a6350dd6ed960e01b61107d565b82145b80610cc957506000610cc9565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565bfe5b803561086a81615ebc565b600082601f8301126152f7578081fd5b813561530a61530582615e9c565b615e75565b81815291506020808301908481018184028601820187101561532b57600080fd5b60005b848110156128255781358452928201929082019060010161532e565b600082601f83011261535a578081fd5b815161536861530582615e9c565b81815291506020808301908481018184028601820187101561538957600080fd5b60005b848110156128255781518452928201929082019060010161538c565b600082601f8301126153b8578081fd5b813567ffffffffffffffff8111156153ce578182fd5b6153e1601f8201601f1916602001615e75565b91508082528360208285010111156153f857600080fd5b8060208401602084013760009082016020015292915050565b80516003811061086a57600080fd5b80516004811061086a57600080fd5b80356002811061086a57600080fd5b60006020828403121561544f578081fd5b813561157f81615ebc565b6000806040838503121561546c578081fd5b823561547781615ebc565b9150602083013561548781615ebc565b809150509250929050565b6000806000606084860312156154a6578081fd5b83356154b181615ebc565b925060208401356154c181615ebc565b929592945050506040919091013590565b600080600080600080600060e0888a0312156154ec578283fd5b87356154f781615ebc565b9650602088013561550781615ebc565b95506040880135945060608801359350608088013561552581615ed1565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215615554578182fd5b823561555f81615ebc565b946020939093013593505050565b600080600060608486031215615581578081fd5b835167ffffffffffffffff80821115615598578283fd5b818601915086601f8301126155ab578283fd5b81516155b961530582615e9c565b80828252602080830192508086018b8283870289010111156155d9578788fd5b8796505b848710156156045780516155f081615ebc565b8452600196909601959281019281016155dd565b50890151909750935050508082111561561b578283fd5b506156288682870161534a565b925050604084015190509250925092565b60006020828403121561564a578081fd5b8151801515811461157f578182fd5b600080600080600080600060e0888a031215615673578081fd5b87359650602088013561568581615ebc565b9550604088013561569581615ebc565b9450606088013567ffffffffffffffff808211156156b1578283fd5b6156bd8b838c016152e7565b955060808a0135945060a08a0135935060c08a01359150808211156156e0578283fd5b506156ed8a828b016153a8565b91505092959891949750929550565b60006020828403121561570d578081fd5b81356001600160e01b03198116811461157f578182fd5b600060208284031215615735578081fd5b815161157f81615ebc565b60008060408385031215615752578182fd5b823561575d81615ebc565b9150602083013567ffffffffffffffff811115615778578182fd5b615784858286016153a8565b9150509250929050565b60006020828403121561579f578081fd5b61157f8383615411565b6000806000606084860312156157bd578081fd5b6157c78585615411565b9250602084015167ffffffffffffffff8111156157e2578182fd5b6156288682870161534a565b60008060408385031215615800578182fd5b61580a8484615411565b9150602083015190509250929050565b60008060006060848603121561582e578081fd5b6158388585615411565b925060208401519150604084015190509250925092565b600060208284031215615860578081fd5b61157f8383615420565b6000806040838503121561587c578182fd5b6158868484615420565b9150602083015167ffffffffffffffff8111156158a1578182fd5b6157848582860161534a565b6000806000606084860312156158c1578081fd5b6157c78585615420565b600080604083850312156158dd578182fd5b61580a8484615420565b6000806000606084860312156158fb578081fd5b6158388585615420565b6000806000806080858703121561591a578182fd5b843567ffffffffffffffff80821115615931578384fd5b818701915061012080838a031215615947578485fd5b61595081615e75565b905061595c898461542f565b815261596b89602085016152dc565b602082015261597d89604085016152dc565b6040820152606083013560608201526080830135608082015260a083013560a08201526159ad8960c085016152dc565b60c08201526159bf8960e085016152dc565b60e082015261010080840135838111156159d7578687fd5b6159e38b8287016153a8565b828401525050809650506020870135915080821115615a00578384fd5b50615a0d878288016152e7565b949794965050505060408301359260600135919050565b600060208284031215615a35578081fd5b5035919050565b600060208284031215615a4d578081fd5b5051919050565b60008060408385031215615a66578182fd5b50508035926020909101359150565b60008060008060808587031215615a8a578182fd5b8451935060208501519250604085015191506060850151615aaa81615ebc565b939692955090935050565b600060208284031215615ac6578081fd5b815161157f81615ed1565b60008060408385031215615ae3578182fd5b8251615aee81615ed1565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015615b3a57815187529582019590820190600101615b1e565b509495945050505050565b60008151808452815b81811015615b6a57602081850181015186830182015201615b4e565b81811115615b7b5782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b81811015615c285783516001600160a01b031683529284019291840191600101615c03565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015615cbe578151805160048110615c6757fe5b855280870151615c7988870182615afe565b508581015186860152606080820151615c9482880182615afe565b505060809081015190615ca986820183615afe565b505060a0939093019290850190600101615c51565b5091979650505050505050565b60006020825261157f6020830184615b0b565b600060408252615cf16040830185615b0b565b82810360208401526117f08185615b0b565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000838252604060208301526115ea6040830184615b45565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825261157f6020830184615b45565b6000838252604060208301526115ea6040830184615b0b565b9283529015156020830152604082015260600190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615e9457600080fd5b604052919050565b600067ffffffffffffffff821115615eb2578081fd5b5060209081020190565b6001600160a01b0381168114610be757600080fd5b60ff81168114610be757600080fdfea2646970667358221220b1e5ec4de2ef1abf9e959c7f4391d7d01e93ab6b319e2acf4aba7247f67b09a664736f6c634300070100336bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106103785760003560e01c806370464016116101d3578063a457c2d711610104578063d505accf116100a2578063ddf4627b1161007c578063ddf4627b146106e3578063eb0f24d6146106eb578063ed24911d146106f3578063f4b7964d146106fb57610378565b8063d505accf146106aa578063d5c096c4146106bd578063dd62ed3e146106d057610378565b8063ab7759f1116100de578063ab7759f11461067f578063b35056b814610692578063b7b814fc1461069a578063d2946c2b146106a257610378565b8063a457c2d714610651578063a9059cbb14610664578063aaabadc51461067757610378565b8063851c1bb311610171578063893d20e81161014b578063893d20e8146106195780638d928af81461062e57806390193b7c1461063657806395d89b411461064957610378565b8063851c1bb3146105eb578063876f303b146105fe57806387ec68171461060657610378565b80637ecebe00116101ad5780637ecebe00146105a55780637f1260d1146105b857806382687a56146105db5780638456cb59146105e357610378565b8063704640161461055e57806370a082311461057157806374f3b0091461058457610378565b80633644e515116102ad57806354a844ba1161024b57806355c676281161022557806355c67628146105165780636028bfd41461051e578063679aefce1461053f5780636daccffa1461054757610378565b806354a844ba146104f357806354dea00a146104fb57806354fd4d501461050e57610378565b8063395093511161028757806339509351146104af5780633c975d51146104c25780633f4ba83a146104d857806350dd6ed9146104e057610378565b80633644e5151461048c57806338e9922e1461049457806338fff2d0146104a757610378565b80631c0de0511161031a57806323b872dd116102f457806323b872dd1461043e5780632df2c7c0146104515780632f1a0bc914610464578063313ce5671461047757610378565b80631c0de051146103fd5780631dd746ea14610414578063238a2d591461042957610378565b8063095ea7b311610356578063095ea7b3146103c35780630da0669c146103e357806315b0015b146103ed57806318160ddd146103f557610378565b806301ec954a1461037d57806304842d4c146103a657806306fdde03146103ae575b600080fd5b61039061038b366004615905565b61070e565b60405161039d9190615d26565b60405180910390f35b6103906107b4565b6103b66107c3565b60405161039d9190615dfc565b6103d66103d1366004615542565b610859565b60405161039d9190615d03565b6103eb610870565b005b6103d6610908565b61039061092c565b610405610932565b60405161039d93929190615d0e565b61041c61095b565b60405161039d9190615ccb565b610431610965565b60405161039d9190615be7565b6103d661044c366004615492565b610a00565b6103eb61045f36600461543e565b610a74565b6103eb610472366004615a54565b610ad8565b61047f610bbb565b60405161039d9190615e67565b610390610bc4565b6103eb6104a2366004615a24565b610bce565b610390610bea565b6103d66104bd366004615542565b610c0e565b6104ca610c49565b60405161039d929190615e3e565b6103eb610c74565b6103eb6104ee366004615740565b610c86565b6103eb610ca4565b61039061050936600461543e565b610cb6565b6103b6610cd1565b610390610d32565b61053161052c366004615659565b610d45565b60405161039d929190615e0f565b610390610d7c565b61054f610de8565b60405161039d93929190615e28565b61039061056c366004615a24565b610e03565b61039061057f36600461543e565b610ebc565b610597610592366004615659565b610ed7565b60405161039d929190615cde565b6103906105b336600461543e565b610fda565b6105cb6105c636600461543e565b610fe5565b60405161039d9493929190615e4c565b610390611047565b6103eb61106b565b6103906105f93660046156fc565b61107d565b6103906110cf565b610531610614366004615659565b6110fd565b610621611123565b60405161039d9190615bd3565b610621611147565b61039061064436600461543e565b61116b565b6103b6611186565b6103d661065f366004615542565b6111e7565b6103d6610672366004615542565b611225565b610621611232565b6103d661068d36600461543e565b61123c565b6103d661124f565b6103eb611260565b610621611272565b6103eb6106b83660046154d2565b611296565b6105976106cb366004615659565b611321565b6103906106de36600461545a565b611444565b610390611481565b6103eb611487565b6103906114b3565b6103eb610709366004615542565b6114bd565b6000846080015161073b610720611147565b6001600160a01b0316336001600160a01b03161460cd6116ad565b610750610746610bea565b82146101f46116ad565b6107586116bb565b61076a84846107656116cb565b6116ef565b6060610774611707565b905060008751600181111561078557fe5b1461079c5761079787878787856117a0565b6107a9565b6107a987878787856117f9565b979650505050505050565b60006107be611834565b905090565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561084f5780601f106108245761010080835404028352916020019161084f565b820191906000526020600020905b81548152906001019060200180831161083257829003601f168201915b5050505050905090565b600061086633848461183b565b5060015b92915050565b6108786118a3565b610880610908565b156108b0576108b07f00000000000000000000000000000000000000000000000000000000000000006000611918565b6108db7f00000000000000000000000000000000000000000000000000000000000000006002611918565b6109067f00000000000000000000000000000000000000000000000000000000000000006003611918565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061093f611abc565b15925061094a611ad9565b9150610954611afd565b9050909192565b60606107be611707565b606060006109716116cb565b905060608167ffffffffffffffff8111801561098c57600080fd5b506040519080825280602002602001820160405280156109b6578160200160208202803683370190505b50905060005b828110156109f9576109cd81611b21565b8282815181106109d957fe5b6001600160a01b03909216602092830291909101909101526001016109bc565b5091505090565b600080610a0d8533611444565b9050610a31336001600160a01b0387161480610a295750838210155b61019e6116ad565b610a3c858585611c4a565b336001600160a01b03861614801590610a5757506000198114155b15610a6957610a69853385840361183b565b506001949350505050565b610a7c611d2a565b6000610a8782611dc8565b90506000610a9482611b21565b9050610aad6001600160a01b03821615156101556116ad565b6000828152600a6020526040812054610ac590611f56565b9050610ad2838383611f65565b50505050565b610ae0612048565b610af0600183101561012c6116ad565b610b0161138883111561012d6116ad565b6000610b0d82426115f2565b9050610b216201518082101561013d6116ad565b600080610b2c612076565b91509150610b3d811561013e6116ad565b6000610b4b866103e861155b565b90506000838211610b7a57610b75610b66620151808661155b565b610b70848861155b565b6120ea565b610b94565b610b94610b8a620151808461155b565b610b70868861155b565b9050610ba6600282111561013f6116ad565b610bb28483428961211d565b50505050505050565b60055460ff1690565b60006107be6114b3565b610bd6612048565b610bde61216c565b610be78161217f565b50565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610866918590610c4490866121f8565b61183b565b600c546000908190610c5e8160e9601761169e565b9250610c6d81600060e961169e565b9150509091565b610c7c612048565b610906600061220a565b610c8e612048565b610c9661216c565b610ca0828261227d565b5050565b610cac612048565b6109066001612372565b6000610cc9610cc483611dc8565b6123c9565b90505b919050565b600d8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561084f5780601f106108245761010080835404028352916020019161084f565b6008546000906107be9060c0603f61169e565b60006060610d5b8651610d566116cb565b61241c565b610d708989898989898961242961244b6124b4565b97509795505050505050565b60006060600080600080610d8e6125de565b9398509196509450925090506000610da685856121f8565b90506000610db2612076565b5090506000848214610dcd57610dc882896126ce565b610dcf565b835b9050610ddb8184612830565b9850505050505050505090565b6000806000610df5612076565b90949093506103e892509050565b6000610e0d61124f565b15610e1a57506000610ccc565b81610e6657610e27610908565b610e51577f0000000000000000000000000000000000000000000000000000000000000000610e5f565b600b5467ffffffffffffffff165b9050610ccc565b6002821415610e8e5750600b5468010000000000000000900467ffffffffffffffff16610ccc565b6003821415610eb15750600b54600160801b900467ffffffffffffffff16610ccc565b610ccc6101bb612881565b6001600160a01b031660009081526020819052604090205490565b60608088610ee6610720611147565b610ef1610746610bea565b60606000610efe86612891565b15610f2657610f0b6128c0565b610f1d89610f1761092c565b886128d3565b92509050610f78565b610f2e6116bb565b6060610f38611707565b9050610f448a82612917565b610f688d8d8d8d8d610f5461124f565b610f5e578d610f61565b60005b878e612429565b93509150610f76838261244b565b505b610f828b82612980565b81895167ffffffffffffffff81118015610f9b57600080fd5b50604051908082528060200260200182016040528015610fc5578160200160208202803683370190505b509450945050505b5097509795505050505050565b6000610cc98261116b565b6000806000806000600a6000610ffa88611dc8565b8152602081019190915260400160002054905061101b8115156101556116ad565b6110248161298a565b945061102f81612998565b935061103a816129a6565b9597949650949392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b611073612048565b610906600161220a565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016110b2929190615b90565b604051602081830303815290604052805190602001209050919050565b60008060006110dc6125de565b505092509250506110f681836121f890919063ffffffff16565b9250505090565b6000606061110e8651610d566116cb565b610d70898989898989896129c86129d96124b4565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561084f5780601f106108245761010080835404028352916020019161084f565b6000806111f43385611444565b905080831061120e576112093385600061183b565b61121b565b61121b338585840361183b565b5060019392505050565b6000610866338484611c4a565b60006107be612a42565b6000610cc961124a83611dc8565b612abc565b6008546000906107be9060ff612ae4565b611268612048565b6109066000612372565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886112c58c61116b565b896040516020016112db96959493929190615d4e565b60405160208183030381529060405280519060200120905061130c8882611303878787612aee565b886101f8612b2d565b61131788888861183b565b5050505050505050565b60608088611330610720611147565b61133b610746610bea565b6113436116bb565b606061134d611707565b905061135761092c565b611404576000606061136c8d8d8d868b612b84565b9150915061138561137b611834565b83101560cc6116ad565b6113976000611392611834565b612c5d565b6113aa8b6113a3611834565b8403612c5d565b6113b481846129d9565b808a5167ffffffffffffffff811180156113cd57600080fd5b506040519080825280602002602001820160405280156113f7578160200160208202803683370190505b5095509550505050610fcd565b61140e8882612917565b600060606114368d8d8d8d8d61142261124f565b61142c578d61142f565b60005b898e6129c8565b915091506113aa8b83612c5d565b600061144e611147565b6001600160a01b0316826001600160a01b03161415611470575060001961086a565b61147a8383612c67565b905061086a565b60001981565b61148f612048565b60008061149a612076565b915091506114aa816101406116ad565b610ca082612c92565b60006107be612ccd565b6114c5612048565b6114cd611d2a565b60006114d883611dc8565b905060006114e582611b21565b90506114fe6001600160a01b03821615156101556116ad565b611509828285611f65565b806001600160a01b0316827fdd6d1c9badb346de6925b358a472c937b41698d2632696759e43fd6527feeec4856040516115439190615d26565b60405180910390a350505050565b80610ca081612d6a565b600082820261157f84158061157857508385838161157557fe5b04145b60036116ad565b9392505050565b61159e828414801561159757508183145b60676116ad565b505050565b60006001821b19841682846115b95760006115bc565b60015b60ff16901b17949350505050565b60006115d7848484612de3565b5082821b6000196001831b01831b198516175b949350505050565b60006116028383111560016116ad565b50900390565b600061161b606084901c156101496116ad565b6115ea42830160e060206116388660c083838c8c600060606115ca565b9291906115ca565b6000610cc961164e8361298a565b83906060806115ca565b600061167167ffffffffffffffff8311156101ba6116ad565b5090565b6000611682848484612de3565b50501b90565b6000818310611697578161157f565b5090919050565b6001901b6000190191901c1690565b81610ca057610ca081612881565b6116c3612e29565b610906612e31565b7f000000000000000000000000000000000000000000000000000000000000000090565b61159e818410801561170057508183105b60646116ad565b606060006117136116cb565b905060608167ffffffffffffffff8111801561172e57600080fd5b50604051908082528060200260200182016040528015611758578160200160208202803683370190505b50905060005b828110156109f957611781611772826123c9565b61177b83612e59565b90612f77565b82828151811061178d57fe5b602090810291909101015260010161175e565b60208501516000906001600160a01b03163014806117ca575060408601516001600160a01b031630145b6117e0576117db8686868686612fa3565b6117ed565b6117ed868686868661300d565b90505b95945050505050565b60208501516000906001600160a01b0316301480611823575060408601516001600160a01b031630145b6117e0576117db8686868686613111565b620f424090565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611896908590615d26565b60405180910390a3505050565b6118ab611d2a565b6118b361216c565b606060008060006118c26125de565b94509450945050935060008311156118dd576118dd83613168565b60006118e7612076565b5090506000838214611902576118fd82876126ce565b611904565b825b90506119108282613179565b505050505050565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c326390611947908590600401615d26565b60206040518083038186803b15801561195f57600080fd5b505afa158015611973573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119979190615a3c565b9050816119ce576119a781611658565b600b805467ffffffffffffffff191667ffffffffffffffff92909216919091179055611a7f565b6002821415611a1c576119e081611658565b600b805467ffffffffffffffff9290921668010000000000000000026fffffffffffffffff000000000000000019909216919091179055611a7f565b6003821415611a7457611a2e81611658565b600b805467ffffffffffffffff92909216600160801b027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff909216919091179055611a7f565b611a7f6101bb612881565b817f6bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a82604051611aaf9190615d26565b60405180910390a2505050565b6000611ac6611afd565b4211806107be57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b600081611b4f57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160011415611b7f57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160021415611baf57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160031415611bdf57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160041415611c0f57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160051415611c3f57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b610ccc610135612881565b611c616001600160a01b03841615156101986116ad565b611c786001600160a01b03831615156101996116ad565b611c8383838361159e565b6001600160a01b038316600090815260208190526040902054611ca990826101a061319f565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611cd890826121f8565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611896908590615d26565b60408051600080825260208201909252606091611d5d565b611d4a6152aa565b815260200190600190039081611d425790505b509050611d68611147565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b8152600401611d939190615c34565b600060405180830381600087803b158015611dad57600080fd5b505af1158015611dc1573d6000803e3d6000fd5b5050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e0c57506000610ccc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e4e57506001610ccc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e9057506002610ccc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611ed257506003610ccc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611f1457506004610ccc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611c3f57506005610ccc565b6000610cc98260c0602061169e565b6000826001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b158015611fa057600080fd5b505afa158015611fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd89190615a3c565b6000858152600a6020526040902054909150611ff5818385611608565b6000868152600a602052604090819020919091555185907fb77a83204ca282e08dc3a65b0a1ca32ea4e6875c38ef0bf5bf75e52a67354fac90612039908590615d26565b60405180910390a25050505050565b600061205f6000356001600160e01b03191661107d565b9050610be761206e82336131b5565b6101916116ad565b60008060008060008061208761329e565b9350935093509350804210156120da5760019450838311156120be5781810382420385850302816120b457fe5b04840195506120d5565b81810382420384860302816120cf57fe5b04840395505b6120e2565b600094508295505b505050509091565b60006120f982151560046116ad565b826121065750600061086a565b81600184038161211257fe5b04600101905061086a565b612129848484846132fd565b7f1835882ee7a34ac194f717a35e09bb1d24c82a3b9d854ab6c9749525b714cdf28484848460405161215e9493929190615e4c565b60405180910390a150505050565b610906612177611abc565b6101926116ad565b61219461218a61333c565b82101560cb6116ad565b6121a961219f613345565b82111560ca6116ad565b6008546121ba908260c0603f6115ca565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906121ed908390615d26565b60405180910390a150565b600082820161157f84821015836116ad565b801561222a5761222561221b611ad9565b42106101936116ad565b61223f565b61223f612235611afd565b42106101a96116ad565b6007805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be64906121ed908390615d03565b6000612287610bea565b90506000612293611147565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b81526004016122c0929190615dc7565b60806040518083038186803b1580156122d857600080fd5b505afa1580156122ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123109190615a75565b604051630639cdb560e21b81529094506001600160a01b03851693506318e736d49250612344915085908790600401615dae565b600060405180830381600087803b15801561235e57600080fd5b505af1158015611317573d6000803e3d6000fd5b600854612381908260ff6115a3565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c8906123b4908390615d03565b60405180910390a180610be757610be7613351565b60006123d3611047565b8214156123e95750670de0b6b3a7640000610ccc565b6000828152600a6020526040902054801561240c576124078161298a565b61157f565b670de0b6b3a76400009392505050565b610ca081831460676116ad565b6000606061243a600088868661342b565b915091509850989650505050505050565b8151815161245a90829061241c565b60005b81811015610ad25761249584828151811061247457fe5b602002602001015184838151811061248857fe5b6020026020010151612830565b8482815181106124a157fe5b602090810291909101015260010161245d565b333014612572576000306001600160a01b03166000366040516124d8929190615ba8565b6000604051808303816000865af19150503d8060008114612515576040519150601f19603f3d011682016040523d82523d6000602084013e61251a565b606091505b50509050806000811461252957fe5b60046000803e6000516001600160e01b0319166343adbafb60e01b8114612554573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b61257a6116bb565b6060612584611707565b90506125908782612917565b600060606125a88c8c8c8c8c8c898d8d63ffffffff16565b915091506125ba81848663ffffffff16565b8051601f1982018390526343adbafb603f1983015260200260231982016044820181fd5b606060008060008060606125f0611147565b6001600160a01b031663f94d4668612606610bea565b6040518263ffffffff1660e01b81526004016126229190615d26565b60006040518083038186803b15801561263a57600080fd5b505afa15801561264e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612676919081019061556d565b5091505061268b81612686611707565b612917565b612694816134d9565b9650945060006126a2610c49565b909450905060006126b4888684613512565b945090506126c2878261359f565b95505050509091929394565b80516000908190815b8181101561270f576127058582815181106126ee57fe5b6020026020010151846121f890919063ffffffff16565b92506001016126d7565b50816127205760009250505061086a565b600082868302825b60ff811015612819578260005b868110156127765761276c61274a838761155b565b6127678c848151811061275957fe5b60200260200101518a61155b565b6135b7565b9150600101612735565b508394506127cf6127ae6127a861278d848a61155b565b6127a261279a888d61155b565b6103e86135b7565b906121f8565b8661155b565b6127676127be896001018561155b565b6127a261279a6103e889038a61155b565b9350848411156127f7576001858503116127f2578397505050505050505061086a565b612810565b600184860311612810578397505050505050505061086a565b50600101612728565b50612825610141612881565b505050505092915050565b600061283f82151560046116ad565b8261284c5750600061086a565b670de0b6b3a76400008381029061286f9085838161286657fe5b041460056116ad565b82818161287857fe5b0491505061086a565b610be7816210905360ea1b6135d7565b6000808251118015610cc9575060ff8016828060200190518101906128b69190615ab5565b60ff161492915050565b6109066128cb61124f565b6101b66116ad565b60006060600060606128e4876134d9565b91509150600060606128f7838589613638565b9150915081612907826000613664565b9550955050505050935093915050565b8151815161292690829061241c565b60005b81811015610ad25761296184828151811061294057fe5b602002602001015184838151811061295457fe5b6020026020010151612f77565b84828151811061296d57fe5b6020908102919091010152600101612929565b610ca08282613721565b6000610cc98282606061169e565b6000610cc98260608061169e565b6000806129b283611f56565b91506129c18360e0602061169e565b9050915091565b6000606061243a600188868661342b565b815181516129e890829061241c565b60005b81811015610ad257612a23848281518110612a0257fe5b6020026020010151848381518110612a1657fe5b60200260200101516137ed565b848281518110612a2f57fe5b60209081029190910101526001016129eb565b6000612a4c611147565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015612a8457600080fd5b505afa158015612a98573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107be9190615724565b6000610cc97f0000000000000000000000000000000000000000000000000000000000000000835b1c60019081161490565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b6000612b388561383b565b9050612b4e612b48878387613857565b836116ad565b612b5d428410156101b86116ad565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606000612b9384613906565b9050612bae6000826003811115612ba657fe5b1460ce6116ad565b6060612bb98561391c565b9050612bc78151875161241c565b612bd18187612917565b6000612bdb612076565b5090506060612be983613932565b90506000612bf783836126ce565b9050806000612c146d8000000000000000000000000000836115f2565b9050612c208d82612c5d565b8086612c2a611047565b81518110612c3457fe5b602002602001018181525050612c4a8584613179565b509c939b50929950505050505050505050565b610ca082826139d4565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b612c9e818242426132fd565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a0233816040516121ed9190615d26565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612d3a613a61565b30604051602001612d4f959493929190615d82565b60405160208183030381529060405280519060200120905090565b600281511015612d7957610be7565b600081600081518110612d8857fe5b602002602001015190506000600190505b825181101561159e576000838281518110612db057fe5b60200260200101519050612dd9816001600160a01b0316846001600160a01b03161060656116ad565b9150600101612d99565b612df2610100831060646116ad565b612e1a600182101580156117005750612e1060ff8461010003611688565b82111560646116ad565b61159e83821c156101b46116ad565b61090661216c565b6000612e3b6116cb565b905060005b81811015610ca057612e5181613a65565b600101612e40565b600081612e8757507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160011415612eb757507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160021415612ee757507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160031415612f1757507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160041415612f4757507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160051415611c3f57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b6000828202612f9184158061157857508385838161157557fe5b670de0b6b3a764000090049392505050565b6000612faf8583612917565b612fd08660600151838581518110612fc357fe5b6020026020010151613ab9565b60608701526000612fe387878787613ac5565b905061300281848781518110612ff557fe5b6020026020010151613ad9565b90506107a981613ae5565b600080808751600181111561301e57fe5b14905061302b8684612917565b61304b8760600151848361303f5786613041565b875b81518110612fc357fe5b876060018181525050600060606000806130648a613b01565b9350935093509350600080613077611047565b8a1461309d57613098878e60600151876130908e613b6a565b888b89613b9f565b6130b8565b6130b8878e60600151876130b08f613b6a565b888b89613bd8565b915091506130c98486858985613bfc565b866130e3576130de828a8d81518110612ff557fe5b613100565b613100828a8c815181106130f357fe5b6020026020010151613c7c565b9d9c50505050505050505050505050565b60006131208660600151613c88565b606087015261312f8583612917565b6131438660600151838681518110612fc357fe5b6060870152600061315687878787613ca9565b90506107a9818486815181106130f357fe5b610be7613173611272565b82612c5d565b61318681600060e9611675565b6131938360e96017611675565b17600c55610ca0613cbd565b60006131ae84841115836116ad565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6131d4611123565b6001600160a01b0316141580156131ef57506131ef83613cf3565b15613217576131fc611123565b6001600160a01b0316336001600160a01b031614905061086a565b61321f612a42565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161324e93929190615d2f565b60206040518083038186803b15801561326657600080fd5b505afa15801561327a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147a9190615639565b6000806000806132bd6000604060095461169e9092919063ffffffff16565b6009549094506132cf9060408061169e565b6009549093506132e2906080604061169e565b6009549092506132f59060c0604061169e565b905090919293565b61330a8160c06040611675565b6133178360806040611675565b61332385604080611675565b6133308760006040611675565b17171760095550505050565b64e8d4a5100090565b67016345785d8a000090565b613359611d2a565b6060613363611147565b6001600160a01b031663f94d4668613379610bea565b6040518263ffffffff1660e01b81526004016133959190615d26565b60006040518083038186803b1580156133ad57600080fd5b505afa1580156133c1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133e9919081019061556d565b509150506133f981612686611707565b606061340482613932565b90506000613410612076565b509050600061341f82846126ce565b9050610ad28282613179565b600060606000606060008061343f89613b01565b93509350935093506152da8a61345757613cfe61345b565b613d935b905060006060613473868689878f8f8963ffffffff16565b915091506152da8d613487576115f261348b565b6121f85b9050613498878383613e11565b60006134a889858463ffffffff16565b90506134b78789888c85613bfc565b836134c3846000613664565b9a509a5050505050505050505094509492505050565b60006060613500836134e9611047565b815181106134f357fe5b6020026020010151613e7e565b61350984613932565b91509150915091565b60008060008060006135248888613e92565b925092509250600086841161353a57600061353e565b8684035b90506000848411613550576000613554565b8484035b9050600061356f6135656000610e03565b61177b8587612830565b9050600061358a6135806002610e03565b61177b8588612830565b919091019b939a509298505050505050505050565b600061157f6135ae848461155b565b61276784613f14565b60006135c682151560046116ad565b8183816135cf57fe5b049392505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60006060600061364784613f3a565b90506060613656878784613f50565b919791965090945050505050565b6060825160010167ffffffffffffffff8111801561368157600080fd5b506040519080825280602002602001820160405280156136ab578160200160208202803683370190505b50905060005b815181101561371a576136c2611047565b81146136f957836136d1611047565b82106136e057600182036136e2565b815b815181106136ec57fe5b60200260200101516136fb565b825b82828151811061370757fe5b60209081029190910101526001016136b1565b5092915050565b6137386001600160a01b038316151561019b6116ad565b6137448260008361159e565b6001600160a01b03821660009081526020819052604090205461376a90826101b261319f565b6001600160a01b03831660009081526020819052604090205561379d6137988261379261092c565b90613fff565b61400d565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516137e19190615d26565b60405180910390a35050565b60006137fc82151560046116ad565b826138095750600061086a565b670de0b6b3a7640000838102906138239085838161286657fe5b82600182038161382f57fe5b0460010191505061086a565b6000613845612ccd565b826040516020016110b2929190615bb8565b600061386982516041146101b96116ad565b60208281015160408085015160608601518251600080825295019283905292939092811a916001906138a2908990859088908890615dde565b6020604051602081039080840390855afa1580156138c4573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906138fa5750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b600081806020019051810190610cc9919061584f565b60608180602001905181019061157f919061586a565b606080600183510367ffffffffffffffff8111801561395057600080fd5b5060405190808252806020026020018201604052801561397a578160200160208202803683370190505b50905060005b815181101561371a5783613992611047565b82106139a157816001016139a3565b815b815181106139ad57fe5b60200260200101518282815181106139c157fe5b6020908102919091010152600101613980565b6139e06000838361159e565b6139ef613798826127a261092c565b6001600160a01b038216600090815260208190526040902054613a1290826121f8565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906137e1908590615d26565b4690565b613a6d611047565b811415613a7957610be7565b6000818152600a60205260409020548015610ca057600080613a9a836129a6565b9150915080421115610ad257610ad284613ab386611b21565b84611f65565b600061157f8383612f77565b60006117f060008660600151868686614012565b600061157f83836137ed565b6000610cc9613afa613af5610d32565b613f14565b83906137ed565b60006060600080600080613b13610c49565b91509150600060606000613b288a8686614084565b9250925092506000613b38612076565b5090506000868214613b5357613b4e82856126ce565b613b55565b825b949c939b509099509297509095505050505050565b6000613b81613b77611047565b83141560646116ad565b613b89611047565b821061167157613b9a8260016115f2565b610cc9565b60008088613bba57613bb58888888888886140dc565b613bc8565b613bc88888888888886141b3565b9150915097509795505050505050565b60008088613bee57613bb5888888888888614214565b613bc888888888888861427a565b6000613c0886866126ce565b90506000613c168385612830565b90506000613c248683612f77565b905080831115613c72578083036000613c4e613c4883613c4384610e03565b61155b565b866135b7565b90508015613c6f576000613c62878361359f565b9050613c6d81613168565b505b50505b6113178884613179565b600061157f8383612830565b600080613c9d613c96610d32565b8490614329565b905061157f83826115f2565b60006117f060018660600151868686614012565b6000613cc76116cb565b905060005b81811015610ca057613cdd81614365565b15613ceb57613ceb81614394565b600101613ccc565b6000610cc9826143c2565b600060606000613d0d846143cd565b90506001816002811115613d1d57fe5b1415613d3b57613d3187878a8c89896143e3565b9250925050613d88565b6002816002811115613d4957fe5b1415613d5a57613d31878a86614442565b6000816002811115613d6857fe5b1415613d7b57613d3187878a8c88614460565b613d86610150612881565b505b965096945050505050565b600060606000613da284613906565b90506001816003811115613db257fe5b1415613dc657613d3187878a8c8989614501565b6003816003811115613dd457fe5b1415613de557613d31878a86614550565b6002816003811115613df357fe5b1415613e0657613d3187878a8c8861456e565b613d86610136612881565b82518251613e2090829061241c565b60005b81811015611dc157613e5f858281518110613e3a57fe5b6020026020010151858381518110613e4e57fe5b60200260200101518563ffffffff16565b858281518110613e6b57fe5b6020908102919091010152600101613e23565b6000610cc982613e8c61092c565b906115f2565b6000806000613eab84613ea68760016145e8565b6126ce565b9250613eb56146f1565b15613ece57613ec484866126ce565b9150819050613f0d565b613ed6614715565b15613eef57829150613ee884866126ce565b9050613f0d565b613efe84613ea68760006145e8565b9150613f0a84866126ce565b90505b9250925092565b6000670de0b6b3a76400008210613f2c576000610cc9565b50670de0b6b3a76400000390565b60008180602001905181019061157f9190615ad1565b60606000613f5e8385612830565b9050845167ffffffffffffffff81118015613f7857600080fd5b50604051908082528060200260200182016040528015613fa2578160200160208202803683370190505b50915060005b8551811015613ff657613fd782878381518110613fc157fe5b6020026020010151612f7790919063ffffffff16565b838281518110613fe357fe5b6020908102919091010152600101613fa8565b50509392505050565b600061157f8383600161319f565b600255565b6000606061401f85613932565b9050600061402c85613b6a565b9050600061403985613b6a565b90506000614045612076565b509050600061405482866126ce565b90508a156140765761406a828686868e86614739565b955050505050506117f0565b61406a828686868e866147c4565b600060606000806060614096886134d9565b915091506000806140a8838a8a613512565b9150915060006140b8858461359f565b905080156140c9576140c981613168565b9390930199919850919650945050505050565b6000806060875167ffffffffffffffff811180156140f957600080fd5b50604051908082528060200260200182016040528015614123578160200160208202803683370190505b5090508881888151811061413357fe5b6020026020010181815250506000614156878a848989614151610d32565b614857565b905061417e8a8a8a8151811061416857fe5b60200260200101516115f290919063ffffffff16565b89898151811061418a57fe5b602090810291909101015260006141a187836115f2565b919b919a509098505050505050505050565b60008060006141ce8689898c89896141c9610d32565b614ae7565b90506141e08189898151811061416857fe5b8888815181106141ec57fe5b60209081029190910101526000614203868b6115f2565b919a91995090975050505050505050565b600080600061422f8689898c898961422a610d32565b614bd6565b90506142578189898151811061424157fe5b60200260200101516121f890919063ffffffff16565b88888151811061426357fe5b60209081029190910101526000614203868b6121f8565b6000806060875167ffffffffffffffff8111801561429757600080fd5b506040519080825280602002602001820160405280156142c1578160200160208202803683370190505b509050888188815181106142d157fe5b60200260200101818152505060006142f4878a8489896142ef610d32565b614ca3565b90506143068a8a8a8151811061424157fe5b89898151811061431257fe5b602090810291909101015260006141a187836121f8565b600082820261434384158061157857508385838161157557fe5b8061435257600091505061086a565b670de0b6b3a7640000600019820161382f565b6000610cc97f000000000000000000000000000000000000000000000000000000000000000060068401612ae4565b6000818152600a60205260409020546143ac81611640565b6000928352600a60205260409092209190915550565b6000610cc982614f0d565b600081806020019051810190610cc9919061578e565b600060608060006143f385614f30565b915091506144038251885161241c565b6144108261268688613932565b60006144228989858e8e614151610d32565b90506144328282111560cf6116ad565b9a91995090975050505050505050565b60006060600061445184614f53565b90506060613656868884613f50565b6000606060008061447085614f69565b915091506144828651821060646116ad565b6060865167ffffffffffffffff8111801561449c57600080fd5b506040519080825280602002602001820160405280156144c6578160200160208202803683370190505b5090506144da888884868e8e6141c9610d32565b8183815181106144e657fe5b60209081029190910101529199919850909650505050505050565b6000606080600061451185614f80565b915091506145218751835161241c565b61452e8261268688613932565b60006145408989858e8e6142ef610d32565b90506144328282101560d06116ad565b60006060600061455f84614f98565b90506060613656868389614fae565b6000606060008061457e8561504a565b915091506145908651821060646116ad565b6060865167ffffffffffffffff811180156145aa57600080fd5b506040519080825280602002602001820160405280156145d4578160200160208202803683370190505b5090506144da888884868e8e61422a610d32565b8151606090818167ffffffffffffffff8111801561460557600080fd5b5060405190808252806020026020018201604052801561462f578160200160208202803683370190505b50905060005b828110156146e8576000614647611047565b8210156146545781614659565b816001015b905061466481612abc565b8061467b575085801561467b575061467b81614365565b6146985786828151811061468b57fe5b60200260200101516146c8565b6146c88783815181106146a757fe5b6020026020010151600a600084815260200190815260200160002054615061565b8383815181106146d457fe5b602090810291909101015250600101614635565b50949350505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061474b8387878151811061424157fe5b86868151811061475757fe5b60200260200101818152505060006147718888858861507c565b90508387878151811061478057fe5b60200260200101510387878151811061479557fe5b6020026020010181815250506147b66001613e8c838a898151811061416857fe5b9150505b9695505050505050565b60006147d68387868151811061416857fe5b8685815181106147e257fe5b60200260200101818152505060006147fc8888858961507c565b90508387868151811061480b57fe5b60200260200101510187868151811061482057fe5b6020026020010181815250506147b660016127a289898151811061484057fe5b6020026020010151846115f290919063ffffffff16565b600080805b87518110156148955761488b88828151811061487457fe5b6020026020010151836121f890919063ffffffff16565b915060010161485c565b506060865167ffffffffffffffff811180156148b057600080fd5b506040519080825280602002602001820160405280156148da578160200160208202803683370190505b5090506000805b89518110156149a7576000614912858c84815181106148fc57fe5b60200260200101516137ed90919063ffffffff16565b90506149548b838151811061492357fe5b602002602001015161494e8c858151811061493a57fe5b60200260200101518e868151811061416857fe5b906137ed565b84838151811061496057fe5b60200260200101818152505061499c6149958286858151811061497f57fe5b602002602001015161432990919063ffffffff16565b84906121f8565b9250506001016148e1565b506060895167ffffffffffffffff811180156149c257600080fd5b506040519080825280602002602001820160405280156149ec578160200160208202803683370190505b50905060005b8a51811015614ab7576000848281518110614a0957fe5b6020026020010151841115614a70576000614a32614a2686613f14565b8e8581518110613fc157fe5b90506000614a46828e868151811061416857fe5b9050614a67614a6082670de0b6b3a76400008d90036137ed565b83906121f8565b92505050614a87565b8a8281518110614a7c57fe5b602002602001015190505b614a97818d848151811061416857fe5b838381518110614aa357fe5b6020908102919091010152506001016149f2565b506000614ac48c836126ce565b90506000614ad2828a612830565b9050613100614ae082613f14565b8b90614329565b600080614b0284614afc8761494e818b6115f2565b90614329565b90506000614b128a8a848b61507c565b90506000614b26828b8b8151811061416857fe5b90506000805b8b51811015614b4e57614b448c828151811061487457fe5b9150600101614b2c565b506000614b77828d8d81518110614b6157fe5b602002602001015161283090919063ffffffff16565b90506000614b8482613f14565b90506000614b928583614329565b90506000614ba086836115f2565b9050614bc1614bba83670de0b6b3a76400008d9003612f77565b82906121f8565b98505050505050505050979650505050505050565b600080614beb84614afc8761494e818b6121f8565b90506000614bfb8a8a848b61507c565b90506000614c258a8a81518110614c0e57fe5b6020026020010151836115f290919063ffffffff16565b90506000805b8b51811015614c4d57614c438c828151811061487457fe5b9150600101614c2b565b506000614c60828d8d81518110614b6157fe5b90506000614c6d82613f14565b90506000614c7b8583614329565b90506000614c8986836115f2565b9050614bc1614bba83670de0b6b3a76400008d90036137ed565b600080805b8751811015614cca57614cc088828151811061487457fe5b9150600101614ca8565b506060865167ffffffffffffffff81118015614ce557600080fd5b50604051908082528060200260200182016040528015614d0f578160200160208202803683370190505b5090506000805b8951811015614da9576000614d31858c8481518110614b6157fe5b9050614d738b8381518110614d4257fe5b6020026020010151614d6d8c8581518110614d5957fe5b60200260200101518e868151811061424157fe5b90612830565b848381518110614d7f57fe5b602002602001018181525050614d9e61499582868581518110613fc157fe5b925050600101614d16565b506060895167ffffffffffffffff81118015614dc457600080fd5b50604051908082528060200260200182016040528015614dee578160200160208202803683370190505b50905060005b8a51811015614eaf57600083858381518110614e0c57fe5b60200260200101511115614e68576000614e31614a2686670de0b6b3a76400006115f2565b90506000614e45828e868151811061416857fe5b9050614e5f614a6082670de0b6b3a76400008d9003612f77565b92505050614e7f565b8a8281518110614e7457fe5b602002602001015190505b614e8f818d848151811061424157fe5b838381518110614e9b57fe5b602090810291909101015250600101614df4565b506000614ebc8c836126ce565b90506000614eca828a612830565b9050670de0b6b3a7640000811115614efe57614ef18a670de0b6b3a763ffff198301612f77565b96505050505050506147ba565b600096505050505050506147ba565b6000614f1f63f4b7964d60e01b61107d565b821480610cc95750610cc982615239565b6060600082806020019051810190614f4891906157a9565b909590945092505050565b60008180602001905181019061157f91906157ee565b60008082806020019051810190614f48919061581a565b6060600082806020019051810190614f4891906158ad565b60008180602001905181019061157f91906158cb565b60606000614fbc84846137ed565b90506060855167ffffffffffffffff81118015614fd857600080fd5b50604051908082528060200260200182016040528015615002578160200160208202803683370190505b50905060005b8651811015615040576150218388838151811061497f57fe5b82828151811061502d57fe5b6020908102919091010152600101615008565b5095945050505050565b60008082806020019051810190614f4891906158e7565b600061157f61507384613c4385612998565b6127678461298a565b60008084518602905060008560008151811061509457fe5b6020026020010151905060008651876000815181106150af57fe5b60200260200101510290506000600190505b8751811015615115576150fa6150f46150ed848b85815181106150e057fe5b602002602001015161155b565b8a5161155b565b886135b7565b915061510b8882815181106126ee57fe5b92506001016150c1565b5086858151811061512257fe5b602002602001015182039150600061513a878861155b565b9050600061516661515a61515284610b70898861155b565b6103e861155b565b8a89815181106150e057fe5b9050600061518161517a6151528b896135b7565b86906121f8565b905060008061519d61519386866121f8565b610b708d866121f8565b905060005b60ff81101561521d578192506151d26151bf866127a2858661155b565b610b708e613e8c886127a288600261155b565b9150828211156151fb576001838303116151f6575097506115ea9650505050505050565b615215565b600182840311615215575097506115ea9650505050505050565b6001016151a2565b50615229610142612881565b5050505050505050949350505050565b600061524b632f1a0bc960e01b61107d565b8214806152665750615263637587926b60e11b61107d565b82145b80610cc95750610cc9826000615282631c74c91760e11b61107d565b82148061529d575061529a6350dd6ed960e01b61107d565b82145b80610cc957506000610cc9565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565bfe5b803561086a81615ebc565b600082601f8301126152f7578081fd5b813561530a61530582615e9c565b615e75565b81815291506020808301908481018184028601820187101561532b57600080fd5b60005b848110156128255781358452928201929082019060010161532e565b600082601f83011261535a578081fd5b815161536861530582615e9c565b81815291506020808301908481018184028601820187101561538957600080fd5b60005b848110156128255781518452928201929082019060010161538c565b600082601f8301126153b8578081fd5b813567ffffffffffffffff8111156153ce578182fd5b6153e1601f8201601f1916602001615e75565b91508082528360208285010111156153f857600080fd5b8060208401602084013760009082016020015292915050565b80516003811061086a57600080fd5b80516004811061086a57600080fd5b80356002811061086a57600080fd5b60006020828403121561544f578081fd5b813561157f81615ebc565b6000806040838503121561546c578081fd5b823561547781615ebc565b9150602083013561548781615ebc565b809150509250929050565b6000806000606084860312156154a6578081fd5b83356154b181615ebc565b925060208401356154c181615ebc565b929592945050506040919091013590565b600080600080600080600060e0888a0312156154ec578283fd5b87356154f781615ebc565b9650602088013561550781615ebc565b95506040880135945060608801359350608088013561552581615ed1565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215615554578182fd5b823561555f81615ebc565b946020939093013593505050565b600080600060608486031215615581578081fd5b835167ffffffffffffffff80821115615598578283fd5b818601915086601f8301126155ab578283fd5b81516155b961530582615e9c565b80828252602080830192508086018b8283870289010111156155d9578788fd5b8796505b848710156156045780516155f081615ebc565b8452600196909601959281019281016155dd565b50890151909750935050508082111561561b578283fd5b506156288682870161534a565b925050604084015190509250925092565b60006020828403121561564a578081fd5b8151801515811461157f578182fd5b600080600080600080600060e0888a031215615673578081fd5b87359650602088013561568581615ebc565b9550604088013561569581615ebc565b9450606088013567ffffffffffffffff808211156156b1578283fd5b6156bd8b838c016152e7565b955060808a0135945060a08a0135935060c08a01359150808211156156e0578283fd5b506156ed8a828b016153a8565b91505092959891949750929550565b60006020828403121561570d578081fd5b81356001600160e01b03198116811461157f578182fd5b600060208284031215615735578081fd5b815161157f81615ebc565b60008060408385031215615752578182fd5b823561575d81615ebc565b9150602083013567ffffffffffffffff811115615778578182fd5b615784858286016153a8565b9150509250929050565b60006020828403121561579f578081fd5b61157f8383615411565b6000806000606084860312156157bd578081fd5b6157c78585615411565b9250602084015167ffffffffffffffff8111156157e2578182fd5b6156288682870161534a565b60008060408385031215615800578182fd5b61580a8484615411565b9150602083015190509250929050565b60008060006060848603121561582e578081fd5b6158388585615411565b925060208401519150604084015190509250925092565b600060208284031215615860578081fd5b61157f8383615420565b6000806040838503121561587c578182fd5b6158868484615420565b9150602083015167ffffffffffffffff8111156158a1578182fd5b6157848582860161534a565b6000806000606084860312156158c1578081fd5b6157c78585615420565b600080604083850312156158dd578182fd5b61580a8484615420565b6000806000606084860312156158fb578081fd5b6158388585615420565b6000806000806080858703121561591a578182fd5b843567ffffffffffffffff80821115615931578384fd5b818701915061012080838a031215615947578485fd5b61595081615e75565b905061595c898461542f565b815261596b89602085016152dc565b602082015261597d89604085016152dc565b6040820152606083013560608201526080830135608082015260a083013560a08201526159ad8960c085016152dc565b60c08201526159bf8960e085016152dc565b60e082015261010080840135838111156159d7578687fd5b6159e38b8287016153a8565b828401525050809650506020870135915080821115615a00578384fd5b50615a0d878288016152e7565b949794965050505060408301359260600135919050565b600060208284031215615a35578081fd5b5035919050565b600060208284031215615a4d578081fd5b5051919050565b60008060408385031215615a66578182fd5b50508035926020909101359150565b60008060008060808587031215615a8a578182fd5b8451935060208501519250604085015191506060850151615aaa81615ebc565b939692955090935050565b600060208284031215615ac6578081fd5b815161157f81615ed1565b60008060408385031215615ae3578182fd5b8251615aee81615ed1565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015615b3a57815187529582019590820190600101615b1e565b509495945050505050565b60008151808452815b81811015615b6a57602081850181015186830182015201615b4e565b81811115615b7b5782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b81811015615c285783516001600160a01b031683529284019291840191600101615c03565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015615cbe578151805160048110615c6757fe5b855280870151615c7988870182615afe565b508581015186860152606080820151615c9482880182615afe565b505060809081015190615ca986820183615afe565b505060a0939093019290850190600101615c51565b5091979650505050505050565b60006020825261157f6020830184615b0b565b600060408252615cf16040830185615b0b565b82810360208401526117f08185615b0b565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000838252604060208301526115ea6040830184615b45565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825261157f6020830184615b45565b6000838252604060208301526115ea6040830184615b0b565b9283529015156020830152604082015260600190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615e9457600080fd5b604052919050565b600067ffffffffffffffff821115615eb2578081fd5b5060209081020190565b6001600160a01b0381168114610be757600080fd5b60ff81168114610be757600080fdfea2646970667358221220b1e5ec4de2ef1abf9e959c7f4391d7d01e93ab6b319e2acf4aba7247f67b09a664736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/artifact/ComposableStablePoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/artifact/ComposableStablePoolFactory.json new file mode 100644 index 0000000..4205626 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/artifact/ComposableStablePoolFactory.json @@ -0,0 +1,287 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ComposableStablePoolFactory", + "sourceName": "contracts/ComposableStablePoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "poolVersion", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "amplificationParameter", + "type": "uint256" + }, + { + "internalType": "contract IRateProvider[]", + "name": "rateProviders", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenRateCacheDurations", + "type": "uint256[]" + }, + { + "internalType": "bool[]", + "name": "exemptFromYieldProtocolFeeFlags", + "type": "bool[]" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract ComposableStablePool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeePercentagesProvider", + "outputs": [ + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101806040523480156200001257600080fd5b506040516200943a3803806200943a83398101604081905262000035916200036d565b83836040518060200162000049906200021c565b601f1982820381018352601f90910116604052805183903090839060006002820460a081905280830360e08190528185529091508362000095816200013d602090811b620005e117901c565b60601b6001600160601b0319166080528285018051838252620000c4826200013d602090811b620005e117901c565b6001600160601b0319606091821b811660c05296909352905261010095909552505092821b831661012052509290921b909116610140525050426276a700016101605281516200011c9060029060208501906200022a565b508051620001329060039060208401906200022a565b505050505062000415565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506200018b6001600160a01b03831615156101ac62000191565b50919050565b81620001a257620001a281620001a6565b5050565b620001b8816210905360ea1b620001bb565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b617f5680620014e483390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200026d57805160ff19168380011785556200029d565b828001600101855582156200029d579182015b828111156200029d57825182559160200191906001019062000280565b50620002ab929150620002af565b5090565b5b80821115620002ab5760008155600101620002b0565b600082601f830112620002d7578081fd5b81516001600160401b0380821115620002ee578283fd5b6040516020601f8401601f191682018101838111838210171562000310578586fd5b806040525081945083825286818588010111156200032d57600080fd5b600092505b8383101562000351578583018101518284018201529182019162000332565b83831115620003635760008185840101525b5050505092915050565b6000806000806080858703121562000383578384fd5b84516200039081620003ff565b6020860151909450620003a381620003ff565b60408601519093506001600160401b0380821115620003c0578384fd5b620003ce88838901620002c6565b93506060870151915080821115620003e4578283fd5b50620003f387828801620002c6565b91505092959194509250565b6001600160a01b0381168114620001b857600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405160601c610160516110566200048e60003980610232528061025b5250806104cf5250806105455250806104f552508061063b52508061020952806106b752508061065c5250806101e8528061069352506110566000f3fe608060405234801561001057600080fd5b50600436106100de5760003560e01c80636634b7531161008c578063739238d611610066578063739238d61461018f578063851c1bb3146101975780638d928af8146101b7578063aaabadc5146101bf576100de565b80636634b7531461014757806366b59f6c146101675780636c57f5a914610187576100de565b80632f2770db116100bd5780632f2770db1461012d5780633f819b6f1461013757806354fd4d501461013f576100de565b8062c194db146100e3578063174481fa146101015780632da47c4014610117575b600080fd5b6100eb6101c7565b6040516100f89190610e3b565b60405180910390f35b6101096101e6565b6040516100f8929190610dee565b61011f61022c565b6040516100f8929190610fa8565b610135610296565b005b6100eb6102dd565b6100eb610373565b61015a610155366004610b4a565b6103d1565b6040516100f89190610e08565b61017a610175366004610bc6565b6103ef565b6040516100f89190610e4e565b61015a6104c4565b61017a6104cd565b6101aa6101a5366004610b82565b6104f1565b6040516100f89190610e13565b61017a610543565b61017a610567565b60606101e160405180602001604052806000815250610633565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561028857807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610291565b60009250600091505b509091565b61029e61070c565b6102a661073d565b6001805460ff1916811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156103695780601f1061033e57610100808354040283529160200191610369565b820191906000526020600020905b81548152906001019060200180831161034c57829003601f168201915b5050505050905090565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156103695780601f1061033e57610100808354040283529160200191610369565b6001600160a01b031660009081526020819052604090205460ff1690565b60008060006103fc61022c565b915091506104b4604051806101c00160405280610417610543565b6001600160a01b0316815260200161042d6104cd565b6001600160a01b031681526020018e81526020018d81526020018c81526020018a81526020018981526020018881526020018b8152602001878152602001848152602001838152602001866001600160a01b0316815260200161048e6102dd565b90526040516104a09190602001610e62565b604051602081830303815290604052610752565b9c9b505050505050505050505050565b60015460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610526929190610dd6565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610571610543565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156105a957600080fd5b505afa1580156105bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e19190610baa565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061062d6001600160a01b03831615156101ac6107bb565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016106fe8183866107cd565b505050505050505050919050565b60006107236000356001600160e01b0319166104f1565b905061073a610732823361080b565b6101916107bb565b50565b6107506107486104c4565b1560d36107bb565b565b600061075c61073d565b60006107678361089d565b6001600160a01b038116600081815260208190526040808220805460ff191660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b816107c9576107c9816108d8565b5050565b5b602081106107ed578151835260209283019290910190601f19016107ce565b905182516020929092036101000a6000190180199091169116179052565b6000610815610567565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161084493929190610e1c565b60206040518083038186803b15801561085c57600080fd5b505afa158015610870573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108949190610b66565b90505b92915050565b600060606108aa83610633565b905060008151602083016000f090506001600160a01b0381166108d1573d6000803e3d6000fd5b9392505050565b62461bcd60e51b600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b60445261073a916210905360ea1b906242414c90606490fd5b803561089781610ffd565b600082601f83011261094e578081fd5b813561096161095c82610fdd565b610fb6565b81815291506020808301908481018184028601820187101561098257600080fd5b60005b848110156109aa57813561099881611012565b84529282019290820190600101610985565b505050505092915050565b600082601f8301126109c5578081fd5b81356109d361095c82610fdd565b8181529150602080830190848101818402860182018710156109f457600080fd5b60005b848110156109aa578135610a0a81610ffd565b845292820192908201906001016109f7565b600082601f830112610a2c578081fd5b8135610a3a61095c82610fdd565b818152915060208083019084810181840286018201871015610a5b57600080fd5b60005b848110156109aa578135610a7181610ffd565b84529282019290820190600101610a5e565b600082601f830112610a93578081fd5b8135610aa161095c82610fdd565b818152915060208083019084810181840286018201871015610ac257600080fd5b60005b848110156109aa57813584529282019290820190600101610ac5565b600082601f830112610af1578081fd5b813567ffffffffffffffff811115610b07578182fd5b610b1a601f8201601f1916602001610fb6565b9150808252836020828501011115610b3157600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215610b5b578081fd5b81356108d181610ffd565b600060208284031215610b77578081fd5b81516108d181611012565b600060208284031215610b93578081fd5b81356001600160e01b0319811681146108d1578182fd5b600060208284031215610bbb578081fd5b81516108d181610ffd565b60008060008060008060008060006101208a8c031215610be4578485fd5b893567ffffffffffffffff80821115610bfb578687fd5b610c078d838e01610ae1565b9a5060208c0135915080821115610c1c578687fd5b610c288d838e01610ae1565b995060408c0135915080821115610c3d578687fd5b610c498d838e016109b5565b985060608c0135975060808c0135915080821115610c65578687fd5b610c718d838e01610a1c565b965060a08c0135915080821115610c86578586fd5b610c928d838e01610a83565b955060c08c0135915080821115610ca7578485fd5b50610cb48c828d0161093e565b93505060e08a01359150610ccc8b6101008c01610933565b90509295985092959850929598565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015610d19578151151587529582019590820190600101610cfb565b509495945050505050565b6000815180845260208085019450808401835b83811015610d195781516001600160a01b031687529582019590820190600101610d37565b6000815180845260208085019450808401835b83811015610d1957815187529582019590820190600101610d6f565b60008151808452815b81811015610db057602081850181015186830182015201610d94565b81811115610dc15782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6001600160a01b0392831681529116602082015260400190565b901515815260200190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b6000602082526108946020830184610d8b565b6001600160a01b0391909116815260200190565b600060208252610e76602083018451610cdb565b6020830151610e886040840182610cdb565b5060408301516101c0806060850152610ea56101e0850183610d8b565b91506060850151601f1980868503016080870152610ec38483610d8b565b935060808701519150808685030160a0870152610ee08483610d24565b935060a08701519150808685030160c0870152610efd8483610d24565b935060c08701519150808685030160e0870152610f1a8483610d5c565b935060e08701519150610100818786030181880152610f398584610ce8565b908801516101208881019190915288015161014080890191909152880151610160808901919091528801516101808089019190915288015190945091506101a0610f8581880184610cdb565b870151868503909101838701529050610f9e8382610d8b565b9695505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610fd557600080fd5b604052919050565b600067ffffffffffffffff821115610ff3578081fd5b5060209081020190565b6001600160a01b038116811461073a57600080fd5b801515811461073a57600080fdfea264697066735822122061705dd8404abd5eb78108c577a8e4e0a5bc44af05a8a94d80a46f3c79ca12dc64736f6c634300070100336105006040523480156200001257600080fd5b5060405162007f5638038062007f56833981016040819052620000359162001b55565b6020810151600019620000488362000d93565b620000538462000dcc565b8461010001518560000151600087604001518860600151620000808a608001513062000e1560201b60201c565b8a60800151516001016001600160401b03811180156200009f57600080fd5b50604051908082528060200260200182016040528015620000ca578160200160208202803683370190505b508b61012001518c61014001518d61016001518e6101800151828289898d85336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b815250878781600390805190602001906200012c929190620017f2565b50805162000142906004906020840190620017f2565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001c090506276a70083111561019462000faf565b620001d462278d0082111561019562000faf565b4290910161014081905201610160528551620001f6906002111560c862000faf565b620002106200020462000fc4565b8751111560c962000faf565b620002268662000fc960201b620015511760201c565b620002318462000fd5565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f9062000262908d9060040162001ddb565b602060405180830381600087803b1580156200027d57600080fd5b505af115801562000292573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b8919062001b1d565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002ed9084908b908b9060040162001d3f565b600060405180830381600087803b1580156200030857600080fd5b505af11580156200031d573d6000803e3d6000fd5b505050508061018081815250508a6001600160a01b031663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200036457600080fd5b505afa15801562000379573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200039f919062001b36565b60601b6001600160601b0319166101a05250620003d1995050506001891015965061012c955062000faf945050505050565b620003e461138882111561012d62000faf565b6000620003ff826103e86200106960201b6200155b1760201c565b90506200040c8162001098565b5050805151620004216002821160c862000faf565b6200044660018203836020015151846040015151620010d760201b620015861760201c565b6101c0819052815180516000906200045a57fe5b60200260200101516001600160a01b0316610200816001600160a01b031660601b8152505081600001516001815181106200049157fe5b60200260200101516001600160a01b0316610220816001600160a01b031660601b815250508160000151600281518110620004c857fe5b60200260200101516001600160a01b0316610240816001600160a01b031660601b8152505060038111620004fe57600062000517565b8151805160039081106200050e57fe5b60200260200101515b60601b6001600160601b03191661026052600481116200053957600062000552565b8151805160049081106200054957fe5b60200260200101515b60601b6001600160601b0319166102805260058111620005745760006200058d565b8151805160059081106200058457fe5b60200260200101515b60601b6001600160601b0319166102a05281518051620005c69190600090620005b257fe5b6020026020010151620010f760201b60201c565b6102c05281518051620005e091906001908110620005b257fe5b6102e05281518051620005fa91906002908110620005b257fe5b61030052600381116200060f57600062000625565b620006258260000151600381518110620005b257fe5b61032052600481116200063a57600062000650565b620006508260000151600481518110620005b257fe5b6103405260058111620006655760006200067b565b6200067b8260000151600581518110620005b257fe5b61036052815151600019015b600081118015620006b857508251805130919083908110620006a557fe5b60200260200101516001600160a01b0316115b15620006c8576000190162000687565b6101e08190528251516060906001600160401b0381118015620006ea57600080fd5b5060405190808252806020026020018201604052801562000715578160200160208202803683370190505b50905060008080805b8751518110156200093857858110156200085457876020015181815181106200074357fe5b60200260200101518582815181106200075857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050620007c160006001600160a01b03168683815181106200079457fe5b60200260200101516001600160a01b031614158260060186620011c660201b620015a3179092919060201c565b935087604001518181518110620007d457fe5b60200260200101511562000849576200082060006001600160a01b0316868381518110620007fe57fe5b60200260200101516001600160a01b0316141561015562000faf60201b60201c565b6200083d60018286620011c660201b620015a3179092919060201c565b9350600192506200084e565b600191505b6200092f565b8581146200092f57876020015160018203815181106200087057fe5b60200260200101518582815181106200088557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050620008c160006001600160a01b03168683815181106200079457fe5b935087604001516001820381518110620008d757fe5b6020026020010151156200092a576200090160006001600160a01b0316868381518110620007fe57fe5b6200091e60018286620011c660201b620015a3179092919060201c565b9350600192506200092f565b600191505b6001016200071e565b50811560f890811b610460528115901b61048052835184906000906200095a57fe5b60200260200101516001600160a01b0316610380816001600160a01b031660601b81525050836001815181106200098d57fe5b60200260200101516001600160a01b03166103a0816001600160a01b031660601b8152505083600281518110620009c057fe5b60200260200101516001600160a01b03166103c0816001600160a01b031660601b815250506003845111620009f757600062000a0e565b8360038151811062000a0557fe5b60200260200101515b60601b6001600160601b0319166103e052835160041062000a3157600062000a48565b8360048151811062000a3f57fe5b60200260200101515b60601b6001600160601b03191661040052835160051062000a6b57600062000a82565b8360058151811062000a7957fe5b60200260200101515b60601b6001600160601b0319166104205250506104405250508251516020808501515160408601515162000ac595509293509190620010d7811b6200158617901c565b805160609062000ad6903062000e15565b8051909150600019015b60008111801562000b165750306001600160a01b031682828151811062000b0357fe5b60200260200101516001600160a01b0316115b1562000b26576000190162000ae0565b6000805b84515181101562000c3f578281141562000b4357600191505b60208501518051828401916000918490811062000b5c57fe5b60200260200101516001600160a01b03161462000c355762000bb6818760200151848151811062000b8957fe5b60200260200101518860400151858151811062000ba257fe5b6020026020010151620011ef60201b60201c565b8560200151828151811062000bc757fe5b60200260200101516001600160a01b0316817fdd6d1c9badb346de6925b358a472c937b41698d2632696759e43fd6527feeec48860400151858151811062000c0b57fe5b602002602001015160405162000c22919062001df0565b60405180910390a362000c3581620012ea565b5060010162000b2a565b5050505050600019811460f881901b6104c0526001600160601b0319606084901b166104a05262000c7283600262001329565b62000c7f83600362001329565b801562000c995762000c9383600062001329565b62000d58565b60405163178b2b9360e21b815262000d2d906001600160a01b03851690635e2cae4c9062000ccd9060009060040162001df0565b60206040518083038186803b15801562000ce657600080fd5b505afa15801562000cfb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d21919062001b1d565b83111561025862000faf565b600060008051602062007f368339815191528360405162000d4f919062001df0565b60405180910390a25b8062000d65578162000d68565b60005b6104e0525050506101a0810151805162000d8b91600d91602090910190620017f2565b505062001e62565b62000d9d62001873565b6040518060600160405280836080015181526020018360a0015181526020018360c0015181525090505b919050565b62000dd662001873565b604051806060016040528062000df784608001513062000e1560201b60201c565b81526020018360a0015181526020018360e001518152509050919050565b606082516001016001600160401b038111801562000e3257600080fd5b5060405190808252806020026020018201604052801562000e5d578160200160208202803683370190505b50905082516000141562000ea057818160008151811062000e7a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505062000fa9565b82515b60008111801562000edc5750826001600160a01b031684600183038151811062000ec957fe5b60200260200101516001600160a01b0316115b1562000f295783600182038151811062000ef257fe5b602002602001015182828151811062000f0757fe5b6001600160a01b03909216602092830291909101909101526000190162000ea3565b60005b8181101562000f785784818151811062000f4257fe5b602002602001015183828151811062000f5757fe5b6001600160a01b039092166020928302919091019091015260010162000f2c565b508282828151811062000f8757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050505b92915050565b8162000fc05762000fc081620014d4565b5050565b600690565b8062000fc081620014e9565b62000fee62000fe362001570565b82101560cb62000faf565b6200100762000ffc62001579565b82111560ca62000faf565b620010298160c0603f6008546200158560201b620015ca17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906200105e90839062001df0565b60405180910390a150565b600082820262001091841580620010895750838583816200108657fe5b04145b600362000faf565b9392505050565b620010a681804280620015aa565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a0233816040516200105e919062001df0565b620010f28284148015620010ea57508183145b606762000faf565b505050565b60006001600160a01b0382163014156200111b5750670de0b6b3a764000062000dc7565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200115757600080fd5b505afa1580156200116c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001192919062001d1c565b60ff1690506000620011b16012836200161d60201b620015f21760201c565b600a0a670de0b6b3a764000002949350505050565b60006001821b1984168284620011de576000620011e1565b60015b60ff16901b17949350505050565b6000826001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200122b57600080fd5b505afa15801562001240573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001266919062001b1d565b6000858152600a602090815260409091205491925062001295908290849086906200160862001635821b17901c565b6000868152600a602052604090819020919091555185907fb77a83204ca282e08dc3a65b0a1ca32ea4e6875c38ef0bf5bf75e52a67354fac90620012db90859062001df0565b60405180910390a25050505050565b6000818152600a602090815260409091205490620013139082906200164062001691821b17901c565b6000928352600a60205260409092209190915550565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c3263906200135a90859060040162001df0565b60206040518083038186803b1580156200137357600080fd5b505afa15801562001388573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620013ae919062001b1d565b905081620013f257620013cc81620016bc60201b620016581760201c565b600b80546001600160401b0319166001600160401b0392909216919091179055620014a6565b600282141562001448576200141281620016bc60201b620016581760201c565b600b80546001600160401b03929092166801000000000000000002600160401b600160801b0319909216919091179055620014a6565b600382141562001499576200146881620016bc60201b620016581760201c565b600b80546001600160401b0392909216600160801b02600160801b600160c01b0319909216919091179055620014a6565b620014a66101bb620014d4565b8160008051602062007f3683398151915282604051620014c7919062001df0565b60405180910390a2505050565b620014e6816210905360ea1b620016da565b50565b600281511015620014fa57620014e6565b6000816000815181106200150a57fe5b602002602001015190506000600190505b8251811015620010f25760008382815181106200153457fe5b6020026020010151905062001565816001600160a01b0316846001600160a01b031610606562000faf60201b60201c565b91506001016200151b565b64e8d4a5100090565b67016345785d8a000090565b6000620015948484846200173b565b506001901b60001901811b1992909216911b1790565b620015c48160c060406200179660201b620016751760201c565b620015de83608060406200179660201b620016751760201c565b620015f7856040806200179660201b620016751760201c565b6200161187600060406200179660201b620016751760201c565b17171760095550505050565b60006200162f83831115600162000faf565b50900390565b60006200164a606084901c1561014962000faf565b6200168942830160e06020620016738660c083838c8c60006060620015ca62001585871b17861c565b6200158560201b620015ca17909392919060201c565b949350505050565b600062000fa9620016a283620017ab565b606080856200158560201b620015ca17909392919060201c565b6000620016d66001600160401b038311156101ba62000faf565b5090565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6200174c6101008310606462000faf565b62001785600182101580156200177d57506200177960ff8461010003620017cb60201b620016881760201c565b8211155b606462000faf565b620010f283821c156101b462000faf565b6000620017a58484846200173b565b50501b90565b600062000fa96000606084620017e360201b6200169e179092919060201c565b6000818310620017dc578162001091565b5090919050565b6001901b6000190191901c1690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200183557805160ff191683800117855562001865565b8280016001018555821562001865579182015b828111156200186557825182559160200191906001019062001848565b50620016d692915062001894565b60405180606001604052806060815260200160608152602001606081525090565b5b80821115620016d6576000815560010162001895565b805162000fa98162001e4c565b600082601f830112620018c9578081fd5b8151620018e0620018da8262001e20565b62001df9565b8181529150602080830190848101818402860182018710156200190257600080fd5b6000805b858110156200193257825180151581146200191f578283fd5b8552938301939183019160010162001906565b50505050505092915050565b600082601f8301126200194f578081fd5b815162001960620018da8262001e20565b8181529150602080830190848101818402860182018710156200198257600080fd5b60005b84811015620019ae5781516200199b8162001e4c565b8452928201929082019060010162001985565b505050505092915050565b600082601f830112620019ca578081fd5b8151620019db620018da8262001e20565b818152915060208083019084810181840286018201871015620019fd57600080fd5b60005b84811015620019ae57815162001a168162001e4c565b8452928201929082019060010162001a00565b600082601f83011262001a3a578081fd5b815162001a4b620018da8262001e20565b81815291506020808301908481018184028601820187101562001a6d57600080fd5b60005b84811015620019ae5781518452928201929082019060010162001a70565b600082601f83011262001a9f578081fd5b81516001600160401b0381111562001ab5578182fd5b602062001acb601f8301601f1916820162001df9565b9250818352848183860101111562001ae257600080fd5b60005b8281101562001b0257848101820151848201830152810162001ae5565b8281111562001b145760008284860101525b50505092915050565b60006020828403121562001b2f578081fd5b5051919050565b60006020828403121562001b48578081fd5b8151620010918162001e4c565b60006020828403121562001b67578081fd5b81516001600160401b038082111562001b7e578283fd5b81840191506101c080838703121562001b95578384fd5b62001ba08162001df9565b905062001bae8684620018ab565b815262001bbf8660208501620018ab565b602082015260408301518281111562001bd6578485fd5b62001be48782860162001a8e565b60408301525060608301518281111562001bfc578485fd5b62001c0a8782860162001a8e565b60608301525060808301518281111562001c22578485fd5b62001c30878286016200193e565b60808301525060a08301518281111562001c48578485fd5b62001c5687828601620019b9565b60a08301525060c08301518281111562001c6e578485fd5b62001c7c8782860162001a29565b60c08301525060e08301518281111562001c94578485fd5b62001ca287828601620018b8565b60e083015250610100838101519082015261012080840151908201526101408084015190820152610160808401519082015261018062001ce587828601620018ab565b908201526101a0838101518381111562001cfd578586fd5b62001d0b8882870162001a8e565b918301919091525095945050505050565b60006020828403121562001d2e578081fd5b815160ff8116811462001091578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562001d8b5762001d78855162001e40565b8352938301939183019160010162001d63565b505084810360408601528551808252908201925081860190845b8181101562001dcd5762001dba835162001e40565b8552938301939183019160010162001da5565b509298975050505050505050565b602081016003831062001dea57fe5b91905290565b90815260200190565b6040518181016001600160401b038111828210171562001e1857600080fd5b604052919050565b60006001600160401b0382111562001e36578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114620014e657600080fd5b60805160a05160c05160e0516101005160601c6101205160601c6101405161016051610180516101a05160601c6101c0516101e0516102005160601c6102205160601c6102405160601c6102605160601c6102805160601c6102a05160601c6102c0516102e051610300516103205161034051610360516103805160601c6103a05160601c6103c05160601c6103e05160601c6104005160601c6104205160601c610440516104605160f81c6104805160f81c6104a05160601c6104c05160f81c6104e051615f166200202060003980610e2d52508061090a52508061088a52806108b552806108e05250806147175250806146f3525080612ac3528061436c525080611c1b525080611beb525080611bbb525080611b8b525080611b5b525080611b2b525080612f53525080612f23525080612ef3525080612ec3525080612e93525080612e63525080611f16525080611ed4525080611e92525080611e50525080611e0e525080611dcc5250806110495250806116cd525080611274525080610bec525080611aff525080611adb525080611149525080611125525080611081525080612cd1525080612d13525080612cf25250615f166000f3fe608060405234801561001057600080fd5b50600436106103785760003560e01c806370464016116101d3578063a457c2d711610104578063d505accf116100a2578063ddf4627b1161007c578063ddf4627b146106e3578063eb0f24d6146106eb578063ed24911d146106f3578063f4b7964d146106fb57610378565b8063d505accf146106aa578063d5c096c4146106bd578063dd62ed3e146106d057610378565b8063ab7759f1116100de578063ab7759f11461067f578063b35056b814610692578063b7b814fc1461069a578063d2946c2b146106a257610378565b8063a457c2d714610651578063a9059cbb14610664578063aaabadc51461067757610378565b8063851c1bb311610171578063893d20e81161014b578063893d20e8146106195780638d928af81461062e57806390193b7c1461063657806395d89b411461064957610378565b8063851c1bb3146105eb578063876f303b146105fe57806387ec68171461060657610378565b80637ecebe00116101ad5780637ecebe00146105a55780637f1260d1146105b857806382687a56146105db5780638456cb59146105e357610378565b8063704640161461055e57806370a082311461057157806374f3b0091461058457610378565b80633644e515116102ad57806354a844ba1161024b57806355c676281161022557806355c67628146105165780636028bfd41461051e578063679aefce1461053f5780636daccffa1461054757610378565b806354a844ba146104f357806354dea00a146104fb57806354fd4d501461050e57610378565b8063395093511161028757806339509351146104af5780633c975d51146104c25780633f4ba83a146104d857806350dd6ed9146104e057610378565b80633644e5151461048c57806338e9922e1461049457806338fff2d0146104a757610378565b80631c0de0511161031a57806323b872dd116102f457806323b872dd1461043e5780632df2c7c0146104515780632f1a0bc914610464578063313ce5671461047757610378565b80631c0de051146103fd5780631dd746ea14610414578063238a2d591461042957610378565b8063095ea7b311610356578063095ea7b3146103c35780630da0669c146103e357806315b0015b146103ed57806318160ddd146103f557610378565b806301ec954a1461037d57806304842d4c146103a657806306fdde03146103ae575b600080fd5b61039061038b366004615905565b61070e565b60405161039d9190615d26565b60405180910390f35b6103906107b4565b6103b66107c3565b60405161039d9190615dfc565b6103d66103d1366004615542565b610859565b60405161039d9190615d03565b6103eb610870565b005b6103d6610908565b61039061092c565b610405610932565b60405161039d93929190615d0e565b61041c61095b565b60405161039d9190615ccb565b610431610965565b60405161039d9190615be7565b6103d661044c366004615492565b610a00565b6103eb61045f36600461543e565b610a74565b6103eb610472366004615a54565b610ad8565b61047f610bbb565b60405161039d9190615e67565b610390610bc4565b6103eb6104a2366004615a24565b610bce565b610390610bea565b6103d66104bd366004615542565b610c0e565b6104ca610c49565b60405161039d929190615e3e565b6103eb610c74565b6103eb6104ee366004615740565b610c86565b6103eb610ca4565b61039061050936600461543e565b610cb6565b6103b6610cd1565b610390610d32565b61053161052c366004615659565b610d45565b60405161039d929190615e0f565b610390610d7c565b61054f610de8565b60405161039d93929190615e28565b61039061056c366004615a24565b610e03565b61039061057f36600461543e565b610ebc565b610597610592366004615659565b610ed7565b60405161039d929190615cde565b6103906105b336600461543e565b610fda565b6105cb6105c636600461543e565b610fe5565b60405161039d9493929190615e4c565b610390611047565b6103eb61106b565b6103906105f93660046156fc565b61107d565b6103906110cf565b610531610614366004615659565b6110fd565b610621611123565b60405161039d9190615bd3565b610621611147565b61039061064436600461543e565b61116b565b6103b6611186565b6103d661065f366004615542565b6111e7565b6103d6610672366004615542565b611225565b610621611232565b6103d661068d36600461543e565b61123c565b6103d661124f565b6103eb611260565b610621611272565b6103eb6106b83660046154d2565b611296565b6105976106cb366004615659565b611321565b6103906106de36600461545a565b611444565b610390611481565b6103eb611487565b6103906114b3565b6103eb610709366004615542565b6114bd565b6000846080015161073b610720611147565b6001600160a01b0316336001600160a01b03161460cd6116ad565b610750610746610bea565b82146101f46116ad565b6107586116bb565b61076a84846107656116cb565b6116ef565b6060610774611707565b905060008751600181111561078557fe5b1461079c5761079787878787856117a0565b6107a9565b6107a987878787856117f9565b979650505050505050565b60006107be611834565b905090565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561084f5780601f106108245761010080835404028352916020019161084f565b820191906000526020600020905b81548152906001019060200180831161083257829003601f168201915b5050505050905090565b600061086633848461183b565b5060015b92915050565b6108786118a3565b610880610908565b156108b0576108b07f00000000000000000000000000000000000000000000000000000000000000006000611918565b6108db7f00000000000000000000000000000000000000000000000000000000000000006002611918565b6109067f00000000000000000000000000000000000000000000000000000000000000006003611918565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061093f611abc565b15925061094a611ad9565b9150610954611afd565b9050909192565b60606107be611707565b606060006109716116cb565b905060608167ffffffffffffffff8111801561098c57600080fd5b506040519080825280602002602001820160405280156109b6578160200160208202803683370190505b50905060005b828110156109f9576109cd81611b21565b8282815181106109d957fe5b6001600160a01b03909216602092830291909101909101526001016109bc565b5091505090565b600080610a0d8533611444565b9050610a31336001600160a01b0387161480610a295750838210155b61019e6116ad565b610a3c858585611c4a565b336001600160a01b03861614801590610a5757506000198114155b15610a6957610a69853385840361183b565b506001949350505050565b610a7c611d2a565b6000610a8782611dc8565b90506000610a9482611b21565b9050610aad6001600160a01b03821615156101556116ad565b6000828152600a6020526040812054610ac590611f56565b9050610ad2838383611f65565b50505050565b610ae0612048565b610af0600183101561012c6116ad565b610b0161138883111561012d6116ad565b6000610b0d82426115f2565b9050610b216201518082101561013d6116ad565b600080610b2c612076565b91509150610b3d811561013e6116ad565b6000610b4b866103e861155b565b90506000838211610b7a57610b75610b66620151808661155b565b610b70848861155b565b6120ea565b610b94565b610b94610b8a620151808461155b565b610b70868861155b565b9050610ba6600282111561013f6116ad565b610bb28483428961211d565b50505050505050565b60055460ff1690565b60006107be6114b3565b610bd6612048565b610bde61216c565b610be78161217f565b50565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610866918590610c4490866121f8565b61183b565b600c546000908190610c5e8160e9601761169e565b9250610c6d81600060e961169e565b9150509091565b610c7c612048565b610906600061220a565b610c8e612048565b610c9661216c565b610ca0828261227d565b5050565b610cac612048565b6109066001612372565b6000610cc9610cc483611dc8565b6123c9565b90505b919050565b600d8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561084f5780601f106108245761010080835404028352916020019161084f565b6008546000906107be9060c0603f61169e565b60006060610d5b8651610d566116cb565b61241c565b610d708989898989898961242961244b6124b4565b97509795505050505050565b60006060600080600080610d8e6125de565b9398509196509450925090506000610da685856121f8565b90506000610db2612076565b5090506000848214610dcd57610dc882896126ce565b610dcf565b835b9050610ddb8184612830565b9850505050505050505090565b6000806000610df5612076565b90949093506103e892509050565b6000610e0d61124f565b15610e1a57506000610ccc565b81610e6657610e27610908565b610e51577f0000000000000000000000000000000000000000000000000000000000000000610e5f565b600b5467ffffffffffffffff165b9050610ccc565b6002821415610e8e5750600b5468010000000000000000900467ffffffffffffffff16610ccc565b6003821415610eb15750600b54600160801b900467ffffffffffffffff16610ccc565b610ccc6101bb612881565b6001600160a01b031660009081526020819052604090205490565b60608088610ee6610720611147565b610ef1610746610bea565b60606000610efe86612891565b15610f2657610f0b6128c0565b610f1d89610f1761092c565b886128d3565b92509050610f78565b610f2e6116bb565b6060610f38611707565b9050610f448a82612917565b610f688d8d8d8d8d610f5461124f565b610f5e578d610f61565b60005b878e612429565b93509150610f76838261244b565b505b610f828b82612980565b81895167ffffffffffffffff81118015610f9b57600080fd5b50604051908082528060200260200182016040528015610fc5578160200160208202803683370190505b509450945050505b5097509795505050505050565b6000610cc98261116b565b6000806000806000600a6000610ffa88611dc8565b8152602081019190915260400160002054905061101b8115156101556116ad565b6110248161298a565b945061102f81612998565b935061103a816129a6565b9597949650949392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b611073612048565b610906600161220a565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016110b2929190615b90565b604051602081830303815290604052805190602001209050919050565b60008060006110dc6125de565b505092509250506110f681836121f890919063ffffffff16565b9250505090565b6000606061110e8651610d566116cb565b610d70898989898989896129c86129d96124b4565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561084f5780601f106108245761010080835404028352916020019161084f565b6000806111f43385611444565b905080831061120e576112093385600061183b565b61121b565b61121b338585840361183b565b5060019392505050565b6000610866338484611c4a565b60006107be612a42565b6000610cc961124a83611dc8565b612abc565b6008546000906107be9060ff612ae4565b611268612048565b6109066000612372565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886112c58c61116b565b896040516020016112db96959493929190615d4e565b60405160208183030381529060405280519060200120905061130c8882611303878787612aee565b886101f8612b2d565b61131788888861183b565b5050505050505050565b60608088611330610720611147565b61133b610746610bea565b6113436116bb565b606061134d611707565b905061135761092c565b611404576000606061136c8d8d8d868b612b84565b9150915061138561137b611834565b83101560cc6116ad565b6113976000611392611834565b612c5d565b6113aa8b6113a3611834565b8403612c5d565b6113b481846129d9565b808a5167ffffffffffffffff811180156113cd57600080fd5b506040519080825280602002602001820160405280156113f7578160200160208202803683370190505b5095509550505050610fcd565b61140e8882612917565b600060606114368d8d8d8d8d61142261124f565b61142c578d61142f565b60005b898e6129c8565b915091506113aa8b83612c5d565b600061144e611147565b6001600160a01b0316826001600160a01b03161415611470575060001961086a565b61147a8383612c67565b905061086a565b60001981565b61148f612048565b60008061149a612076565b915091506114aa816101406116ad565b610ca082612c92565b60006107be612ccd565b6114c5612048565b6114cd611d2a565b60006114d883611dc8565b905060006114e582611b21565b90506114fe6001600160a01b03821615156101556116ad565b611509828285611f65565b806001600160a01b0316827fdd6d1c9badb346de6925b358a472c937b41698d2632696759e43fd6527feeec4856040516115439190615d26565b60405180910390a350505050565b80610ca081612d6a565b600082820261157f84158061157857508385838161157557fe5b04145b60036116ad565b9392505050565b61159e828414801561159757508183145b60676116ad565b505050565b60006001821b19841682846115b95760006115bc565b60015b60ff16901b17949350505050565b60006115d7848484612de3565b5082821b6000196001831b01831b198516175b949350505050565b60006116028383111560016116ad565b50900390565b600061161b606084901c156101496116ad565b6115ea42830160e060206116388660c083838c8c600060606115ca565b9291906115ca565b6000610cc961164e8361298a565b83906060806115ca565b600061167167ffffffffffffffff8311156101ba6116ad565b5090565b6000611682848484612de3565b50501b90565b6000818310611697578161157f565b5090919050565b6001901b6000190191901c1690565b81610ca057610ca081612881565b6116c3612e29565b610906612e31565b7f000000000000000000000000000000000000000000000000000000000000000090565b61159e818410801561170057508183105b60646116ad565b606060006117136116cb565b905060608167ffffffffffffffff8111801561172e57600080fd5b50604051908082528060200260200182016040528015611758578160200160208202803683370190505b50905060005b828110156109f957611781611772826123c9565b61177b83612e59565b90612f77565b82828151811061178d57fe5b602090810291909101015260010161175e565b60208501516000906001600160a01b03163014806117ca575060408601516001600160a01b031630145b6117e0576117db8686868686612fa3565b6117ed565b6117ed868686868661300d565b90505b95945050505050565b60208501516000906001600160a01b0316301480611823575060408601516001600160a01b031630145b6117e0576117db8686868686613111565b620f424090565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611896908590615d26565b60405180910390a3505050565b6118ab611d2a565b6118b361216c565b606060008060006118c26125de565b94509450945050935060008311156118dd576118dd83613168565b60006118e7612076565b5090506000838214611902576118fd82876126ce565b611904565b825b90506119108282613179565b505050505050565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c326390611947908590600401615d26565b60206040518083038186803b15801561195f57600080fd5b505afa158015611973573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119979190615a3c565b9050816119ce576119a781611658565b600b805467ffffffffffffffff191667ffffffffffffffff92909216919091179055611a7f565b6002821415611a1c576119e081611658565b600b805467ffffffffffffffff9290921668010000000000000000026fffffffffffffffff000000000000000019909216919091179055611a7f565b6003821415611a7457611a2e81611658565b600b805467ffffffffffffffff92909216600160801b027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff909216919091179055611a7f565b611a7f6101bb612881565b817f6bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a82604051611aaf9190615d26565b60405180910390a2505050565b6000611ac6611afd565b4211806107be57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b600081611b4f57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160011415611b7f57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160021415611baf57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160031415611bdf57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160041415611c0f57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160051415611c3f57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b610ccc610135612881565b611c616001600160a01b03841615156101986116ad565b611c786001600160a01b03831615156101996116ad565b611c8383838361159e565b6001600160a01b038316600090815260208190526040902054611ca990826101a061319f565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611cd890826121f8565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611896908590615d26565b60408051600080825260208201909252606091611d5d565b611d4a6152aa565b815260200190600190039081611d425790505b509050611d68611147565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b8152600401611d939190615c34565b600060405180830381600087803b158015611dad57600080fd5b505af1158015611dc1573d6000803e3d6000fd5b5050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e0c57506000610ccc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e4e57506001610ccc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e9057506002610ccc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611ed257506003610ccc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611f1457506004610ccc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611c3f57506005610ccc565b6000610cc98260c0602061169e565b6000826001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b158015611fa057600080fd5b505afa158015611fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd89190615a3c565b6000858152600a6020526040902054909150611ff5818385611608565b6000868152600a602052604090819020919091555185907fb77a83204ca282e08dc3a65b0a1ca32ea4e6875c38ef0bf5bf75e52a67354fac90612039908590615d26565b60405180910390a25050505050565b600061205f6000356001600160e01b03191661107d565b9050610be761206e82336131b5565b6101916116ad565b60008060008060008061208761329e565b9350935093509350804210156120da5760019450838311156120be5781810382420385850302816120b457fe5b04840195506120d5565b81810382420384860302816120cf57fe5b04840395505b6120e2565b600094508295505b505050509091565b60006120f982151560046116ad565b826121065750600061086a565b81600184038161211257fe5b04600101905061086a565b612129848484846132fd565b7f1835882ee7a34ac194f717a35e09bb1d24c82a3b9d854ab6c9749525b714cdf28484848460405161215e9493929190615e4c565b60405180910390a150505050565b610906612177611abc565b6101926116ad565b61219461218a61333c565b82101560cb6116ad565b6121a961219f613345565b82111560ca6116ad565b6008546121ba908260c0603f6115ca565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906121ed908390615d26565b60405180910390a150565b600082820161157f84821015836116ad565b801561222a5761222561221b611ad9565b42106101936116ad565b61223f565b61223f612235611afd565b42106101a96116ad565b6007805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be64906121ed908390615d03565b6000612287610bea565b90506000612293611147565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b81526004016122c0929190615dc7565b60806040518083038186803b1580156122d857600080fd5b505afa1580156122ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123109190615a75565b604051630639cdb560e21b81529094506001600160a01b03851693506318e736d49250612344915085908790600401615dae565b600060405180830381600087803b15801561235e57600080fd5b505af1158015611317573d6000803e3d6000fd5b600854612381908260ff6115a3565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c8906123b4908390615d03565b60405180910390a180610be757610be7613351565b60006123d3611047565b8214156123e95750670de0b6b3a7640000610ccc565b6000828152600a6020526040902054801561240c576124078161298a565b61157f565b670de0b6b3a76400009392505050565b610ca081831460676116ad565b6000606061243a600088868661342b565b915091509850989650505050505050565b8151815161245a90829061241c565b60005b81811015610ad25761249584828151811061247457fe5b602002602001015184838151811061248857fe5b6020026020010151612830565b8482815181106124a157fe5b602090810291909101015260010161245d565b333014612572576000306001600160a01b03166000366040516124d8929190615ba8565b6000604051808303816000865af19150503d8060008114612515576040519150601f19603f3d011682016040523d82523d6000602084013e61251a565b606091505b50509050806000811461252957fe5b60046000803e6000516001600160e01b0319166343adbafb60e01b8114612554573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b61257a6116bb565b6060612584611707565b90506125908782612917565b600060606125a88c8c8c8c8c8c898d8d63ffffffff16565b915091506125ba81848663ffffffff16565b8051601f1982018390526343adbafb603f1983015260200260231982016044820181fd5b606060008060008060606125f0611147565b6001600160a01b031663f94d4668612606610bea565b6040518263ffffffff1660e01b81526004016126229190615d26565b60006040518083038186803b15801561263a57600080fd5b505afa15801561264e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612676919081019061556d565b5091505061268b81612686611707565b612917565b612694816134d9565b9650945060006126a2610c49565b909450905060006126b4888684613512565b945090506126c2878261359f565b95505050509091929394565b80516000908190815b8181101561270f576127058582815181106126ee57fe5b6020026020010151846121f890919063ffffffff16565b92506001016126d7565b50816127205760009250505061086a565b600082868302825b60ff811015612819578260005b868110156127765761276c61274a838761155b565b6127678c848151811061275957fe5b60200260200101518a61155b565b6135b7565b9150600101612735565b508394506127cf6127ae6127a861278d848a61155b565b6127a261279a888d61155b565b6103e86135b7565b906121f8565b8661155b565b6127676127be896001018561155b565b6127a261279a6103e889038a61155b565b9350848411156127f7576001858503116127f2578397505050505050505061086a565b612810565b600184860311612810578397505050505050505061086a565b50600101612728565b50612825610141612881565b505050505092915050565b600061283f82151560046116ad565b8261284c5750600061086a565b670de0b6b3a76400008381029061286f9085838161286657fe5b041460056116ad565b82818161287857fe5b0491505061086a565b610be7816210905360ea1b6135d7565b6000808251118015610cc9575060ff8016828060200190518101906128b69190615ab5565b60ff161492915050565b6109066128cb61124f565b6101b66116ad565b60006060600060606128e4876134d9565b91509150600060606128f7838589613638565b9150915081612907826000613664565b9550955050505050935093915050565b8151815161292690829061241c565b60005b81811015610ad25761296184828151811061294057fe5b602002602001015184838151811061295457fe5b6020026020010151612f77565b84828151811061296d57fe5b6020908102919091010152600101612929565b610ca08282613721565b6000610cc98282606061169e565b6000610cc98260608061169e565b6000806129b283611f56565b91506129c18360e0602061169e565b9050915091565b6000606061243a600188868661342b565b815181516129e890829061241c565b60005b81811015610ad257612a23848281518110612a0257fe5b6020026020010151848381518110612a1657fe5b60200260200101516137ed565b848281518110612a2f57fe5b60209081029190910101526001016129eb565b6000612a4c611147565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015612a8457600080fd5b505afa158015612a98573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107be9190615724565b6000610cc97f0000000000000000000000000000000000000000000000000000000000000000835b1c60019081161490565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b6000612b388561383b565b9050612b4e612b48878387613857565b836116ad565b612b5d428410156101b86116ad565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606000612b9384613906565b9050612bae6000826003811115612ba657fe5b1460ce6116ad565b6060612bb98561391c565b9050612bc78151875161241c565b612bd18187612917565b6000612bdb612076565b5090506060612be983613932565b90506000612bf783836126ce565b9050806000612c146d8000000000000000000000000000836115f2565b9050612c208d82612c5d565b8086612c2a611047565b81518110612c3457fe5b602002602001018181525050612c4a8584613179565b509c939b50929950505050505050505050565b610ca082826139d4565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b612c9e818242426132fd565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a0233816040516121ed9190615d26565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612d3a613a61565b30604051602001612d4f959493929190615d82565b60405160208183030381529060405280519060200120905090565b600281511015612d7957610be7565b600081600081518110612d8857fe5b602002602001015190506000600190505b825181101561159e576000838281518110612db057fe5b60200260200101519050612dd9816001600160a01b0316846001600160a01b03161060656116ad565b9150600101612d99565b612df2610100831060646116ad565b612e1a600182101580156117005750612e1060ff8461010003611688565b82111560646116ad565b61159e83821c156101b46116ad565b61090661216c565b6000612e3b6116cb565b905060005b81811015610ca057612e5181613a65565b600101612e40565b600081612e8757507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160011415612eb757507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160021415612ee757507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160031415612f1757507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160041415612f4757507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160051415611c3f57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b6000828202612f9184158061157857508385838161157557fe5b670de0b6b3a764000090049392505050565b6000612faf8583612917565b612fd08660600151838581518110612fc357fe5b6020026020010151613ab9565b60608701526000612fe387878787613ac5565b905061300281848781518110612ff557fe5b6020026020010151613ad9565b90506107a981613ae5565b600080808751600181111561301e57fe5b14905061302b8684612917565b61304b8760600151848361303f5786613041565b875b81518110612fc357fe5b876060018181525050600060606000806130648a613b01565b9350935093509350600080613077611047565b8a1461309d57613098878e60600151876130908e613b6a565b888b89613b9f565b6130b8565b6130b8878e60600151876130b08f613b6a565b888b89613bd8565b915091506130c98486858985613bfc565b866130e3576130de828a8d81518110612ff557fe5b613100565b613100828a8c815181106130f357fe5b6020026020010151613c7c565b9d9c50505050505050505050505050565b60006131208660600151613c88565b606087015261312f8583612917565b6131438660600151838681518110612fc357fe5b6060870152600061315687878787613ca9565b90506107a9818486815181106130f357fe5b610be7613173611272565b82612c5d565b61318681600060e9611675565b6131938360e96017611675565b17600c55610ca0613cbd565b60006131ae84841115836116ad565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6131d4611123565b6001600160a01b0316141580156131ef57506131ef83613cf3565b15613217576131fc611123565b6001600160a01b0316336001600160a01b031614905061086a565b61321f612a42565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161324e93929190615d2f565b60206040518083038186803b15801561326657600080fd5b505afa15801561327a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147a9190615639565b6000806000806132bd6000604060095461169e9092919063ffffffff16565b6009549094506132cf9060408061169e565b6009549093506132e2906080604061169e565b6009549092506132f59060c0604061169e565b905090919293565b61330a8160c06040611675565b6133178360806040611675565b61332385604080611675565b6133308760006040611675565b17171760095550505050565b64e8d4a5100090565b67016345785d8a000090565b613359611d2a565b6060613363611147565b6001600160a01b031663f94d4668613379610bea565b6040518263ffffffff1660e01b81526004016133959190615d26565b60006040518083038186803b1580156133ad57600080fd5b505afa1580156133c1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133e9919081019061556d565b509150506133f981612686611707565b606061340482613932565b90506000613410612076565b509050600061341f82846126ce565b9050610ad28282613179565b600060606000606060008061343f89613b01565b93509350935093506152da8a61345757613cfe61345b565b613d935b905060006060613473868689878f8f8963ffffffff16565b915091506152da8d613487576115f261348b565b6121f85b9050613498878383613e11565b60006134a889858463ffffffff16565b90506134b78789888c85613bfc565b836134c3846000613664565b9a509a5050505050505050505094509492505050565b60006060613500836134e9611047565b815181106134f357fe5b6020026020010151613e7e565b61350984613932565b91509150915091565b60008060008060006135248888613e92565b925092509250600086841161353a57600061353e565b8684035b90506000848411613550576000613554565b8484035b9050600061356f6135656000610e03565b61177b8587612830565b9050600061358a6135806002610e03565b61177b8588612830565b919091019b939a509298505050505050505050565b600061157f6135ae848461155b565b61276784613f14565b60006135c682151560046116ad565b8183816135cf57fe5b049392505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60006060600061364784613f3a565b90506060613656878784613f50565b919791965090945050505050565b6060825160010167ffffffffffffffff8111801561368157600080fd5b506040519080825280602002602001820160405280156136ab578160200160208202803683370190505b50905060005b815181101561371a576136c2611047565b81146136f957836136d1611047565b82106136e057600182036136e2565b815b815181106136ec57fe5b60200260200101516136fb565b825b82828151811061370757fe5b60209081029190910101526001016136b1565b5092915050565b6137386001600160a01b038316151561019b6116ad565b6137448260008361159e565b6001600160a01b03821660009081526020819052604090205461376a90826101b261319f565b6001600160a01b03831660009081526020819052604090205561379d6137988261379261092c565b90613fff565b61400d565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516137e19190615d26565b60405180910390a35050565b60006137fc82151560046116ad565b826138095750600061086a565b670de0b6b3a7640000838102906138239085838161286657fe5b82600182038161382f57fe5b0460010191505061086a565b6000613845612ccd565b826040516020016110b2929190615bb8565b600061386982516041146101b96116ad565b60208281015160408085015160608601518251600080825295019283905292939092811a916001906138a2908990859088908890615dde565b6020604051602081039080840390855afa1580156138c4573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906138fa5750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b600081806020019051810190610cc9919061584f565b60608180602001905181019061157f919061586a565b606080600183510367ffffffffffffffff8111801561395057600080fd5b5060405190808252806020026020018201604052801561397a578160200160208202803683370190505b50905060005b815181101561371a5783613992611047565b82106139a157816001016139a3565b815b815181106139ad57fe5b60200260200101518282815181106139c157fe5b6020908102919091010152600101613980565b6139e06000838361159e565b6139ef613798826127a261092c565b6001600160a01b038216600090815260208190526040902054613a1290826121f8565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906137e1908590615d26565b4690565b613a6d611047565b811415613a7957610be7565b6000818152600a60205260409020548015610ca057600080613a9a836129a6565b9150915080421115610ad257610ad284613ab386611b21565b84611f65565b600061157f8383612f77565b60006117f060008660600151868686614012565b600061157f83836137ed565b6000610cc9613afa613af5610d32565b613f14565b83906137ed565b60006060600080600080613b13610c49565b91509150600060606000613b288a8686614084565b9250925092506000613b38612076565b5090506000868214613b5357613b4e82856126ce565b613b55565b825b949c939b509099509297509095505050505050565b6000613b81613b77611047565b83141560646116ad565b613b89611047565b821061167157613b9a8260016115f2565b610cc9565b60008088613bba57613bb58888888888886140dc565b613bc8565b613bc88888888888886141b3565b9150915097509795505050505050565b60008088613bee57613bb5888888888888614214565b613bc888888888888861427a565b6000613c0886866126ce565b90506000613c168385612830565b90506000613c248683612f77565b905080831115613c72578083036000613c4e613c4883613c4384610e03565b61155b565b866135b7565b90508015613c6f576000613c62878361359f565b9050613c6d81613168565b505b50505b6113178884613179565b600061157f8383612830565b600080613c9d613c96610d32565b8490614329565b905061157f83826115f2565b60006117f060018660600151868686614012565b6000613cc76116cb565b905060005b81811015610ca057613cdd81614365565b15613ceb57613ceb81614394565b600101613ccc565b6000610cc9826143c2565b600060606000613d0d846143cd565b90506001816002811115613d1d57fe5b1415613d3b57613d3187878a8c89896143e3565b9250925050613d88565b6002816002811115613d4957fe5b1415613d5a57613d31878a86614442565b6000816002811115613d6857fe5b1415613d7b57613d3187878a8c88614460565b613d86610150612881565b505b965096945050505050565b600060606000613da284613906565b90506001816003811115613db257fe5b1415613dc657613d3187878a8c8989614501565b6003816003811115613dd457fe5b1415613de557613d31878a86614550565b6002816003811115613df357fe5b1415613e0657613d3187878a8c8861456e565b613d86610136612881565b82518251613e2090829061241c565b60005b81811015611dc157613e5f858281518110613e3a57fe5b6020026020010151858381518110613e4e57fe5b60200260200101518563ffffffff16565b858281518110613e6b57fe5b6020908102919091010152600101613e23565b6000610cc982613e8c61092c565b906115f2565b6000806000613eab84613ea68760016145e8565b6126ce565b9250613eb56146f1565b15613ece57613ec484866126ce565b9150819050613f0d565b613ed6614715565b15613eef57829150613ee884866126ce565b9050613f0d565b613efe84613ea68760006145e8565b9150613f0a84866126ce565b90505b9250925092565b6000670de0b6b3a76400008210613f2c576000610cc9565b50670de0b6b3a76400000390565b60008180602001905181019061157f9190615ad1565b60606000613f5e8385612830565b9050845167ffffffffffffffff81118015613f7857600080fd5b50604051908082528060200260200182016040528015613fa2578160200160208202803683370190505b50915060005b8551811015613ff657613fd782878381518110613fc157fe5b6020026020010151612f7790919063ffffffff16565b838281518110613fe357fe5b6020908102919091010152600101613fa8565b50509392505050565b600061157f8383600161319f565b600255565b6000606061401f85613932565b9050600061402c85613b6a565b9050600061403985613b6a565b90506000614045612076565b509050600061405482866126ce565b90508a156140765761406a828686868e86614739565b955050505050506117f0565b61406a828686868e866147c4565b600060606000806060614096886134d9565b915091506000806140a8838a8a613512565b9150915060006140b8858461359f565b905080156140c9576140c981613168565b9390930199919850919650945050505050565b6000806060875167ffffffffffffffff811180156140f957600080fd5b50604051908082528060200260200182016040528015614123578160200160208202803683370190505b5090508881888151811061413357fe5b6020026020010181815250506000614156878a848989614151610d32565b614857565b905061417e8a8a8a8151811061416857fe5b60200260200101516115f290919063ffffffff16565b89898151811061418a57fe5b602090810291909101015260006141a187836115f2565b919b919a509098505050505050505050565b60008060006141ce8689898c89896141c9610d32565b614ae7565b90506141e08189898151811061416857fe5b8888815181106141ec57fe5b60209081029190910101526000614203868b6115f2565b919a91995090975050505050505050565b600080600061422f8689898c898961422a610d32565b614bd6565b90506142578189898151811061424157fe5b60200260200101516121f890919063ffffffff16565b88888151811061426357fe5b60209081029190910101526000614203868b6121f8565b6000806060875167ffffffffffffffff8111801561429757600080fd5b506040519080825280602002602001820160405280156142c1578160200160208202803683370190505b509050888188815181106142d157fe5b60200260200101818152505060006142f4878a8489896142ef610d32565b614ca3565b90506143068a8a8a8151811061424157fe5b89898151811061431257fe5b602090810291909101015260006141a187836121f8565b600082820261434384158061157857508385838161157557fe5b8061435257600091505061086a565b670de0b6b3a7640000600019820161382f565b6000610cc97f000000000000000000000000000000000000000000000000000000000000000060068401612ae4565b6000818152600a60205260409020546143ac81611640565b6000928352600a60205260409092209190915550565b6000610cc982614f0d565b600081806020019051810190610cc9919061578e565b600060608060006143f385614f30565b915091506144038251885161241c565b6144108261268688613932565b60006144228989858e8e614151610d32565b90506144328282111560cf6116ad565b9a91995090975050505050505050565b60006060600061445184614f53565b90506060613656868884613f50565b6000606060008061447085614f69565b915091506144828651821060646116ad565b6060865167ffffffffffffffff8111801561449c57600080fd5b506040519080825280602002602001820160405280156144c6578160200160208202803683370190505b5090506144da888884868e8e6141c9610d32565b8183815181106144e657fe5b60209081029190910101529199919850909650505050505050565b6000606080600061451185614f80565b915091506145218751835161241c565b61452e8261268688613932565b60006145408989858e8e6142ef610d32565b90506144328282101560d06116ad565b60006060600061455f84614f98565b90506060613656868389614fae565b6000606060008061457e8561504a565b915091506145908651821060646116ad565b6060865167ffffffffffffffff811180156145aa57600080fd5b506040519080825280602002602001820160405280156145d4578160200160208202803683370190505b5090506144da888884868e8e61422a610d32565b8151606090818167ffffffffffffffff8111801561460557600080fd5b5060405190808252806020026020018201604052801561462f578160200160208202803683370190505b50905060005b828110156146e8576000614647611047565b8210156146545781614659565b816001015b905061466481612abc565b8061467b575085801561467b575061467b81614365565b6146985786828151811061468b57fe5b60200260200101516146c8565b6146c88783815181106146a757fe5b6020026020010151600a600084815260200190815260200160002054615061565b8383815181106146d457fe5b602090810291909101015250600101614635565b50949350505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061474b8387878151811061424157fe5b86868151811061475757fe5b60200260200101818152505060006147718888858861507c565b90508387878151811061478057fe5b60200260200101510387878151811061479557fe5b6020026020010181815250506147b66001613e8c838a898151811061416857fe5b9150505b9695505050505050565b60006147d68387868151811061416857fe5b8685815181106147e257fe5b60200260200101818152505060006147fc8888858961507c565b90508387868151811061480b57fe5b60200260200101510187868151811061482057fe5b6020026020010181815250506147b660016127a289898151811061484057fe5b6020026020010151846115f290919063ffffffff16565b600080805b87518110156148955761488b88828151811061487457fe5b6020026020010151836121f890919063ffffffff16565b915060010161485c565b506060865167ffffffffffffffff811180156148b057600080fd5b506040519080825280602002602001820160405280156148da578160200160208202803683370190505b5090506000805b89518110156149a7576000614912858c84815181106148fc57fe5b60200260200101516137ed90919063ffffffff16565b90506149548b838151811061492357fe5b602002602001015161494e8c858151811061493a57fe5b60200260200101518e868151811061416857fe5b906137ed565b84838151811061496057fe5b60200260200101818152505061499c6149958286858151811061497f57fe5b602002602001015161432990919063ffffffff16565b84906121f8565b9250506001016148e1565b506060895167ffffffffffffffff811180156149c257600080fd5b506040519080825280602002602001820160405280156149ec578160200160208202803683370190505b50905060005b8a51811015614ab7576000848281518110614a0957fe5b6020026020010151841115614a70576000614a32614a2686613f14565b8e8581518110613fc157fe5b90506000614a46828e868151811061416857fe5b9050614a67614a6082670de0b6b3a76400008d90036137ed565b83906121f8565b92505050614a87565b8a8281518110614a7c57fe5b602002602001015190505b614a97818d848151811061416857fe5b838381518110614aa357fe5b6020908102919091010152506001016149f2565b506000614ac48c836126ce565b90506000614ad2828a612830565b9050613100614ae082613f14565b8b90614329565b600080614b0284614afc8761494e818b6115f2565b90614329565b90506000614b128a8a848b61507c565b90506000614b26828b8b8151811061416857fe5b90506000805b8b51811015614b4e57614b448c828151811061487457fe5b9150600101614b2c565b506000614b77828d8d81518110614b6157fe5b602002602001015161283090919063ffffffff16565b90506000614b8482613f14565b90506000614b928583614329565b90506000614ba086836115f2565b9050614bc1614bba83670de0b6b3a76400008d9003612f77565b82906121f8565b98505050505050505050979650505050505050565b600080614beb84614afc8761494e818b6121f8565b90506000614bfb8a8a848b61507c565b90506000614c258a8a81518110614c0e57fe5b6020026020010151836115f290919063ffffffff16565b90506000805b8b51811015614c4d57614c438c828151811061487457fe5b9150600101614c2b565b506000614c60828d8d81518110614b6157fe5b90506000614c6d82613f14565b90506000614c7b8583614329565b90506000614c8986836115f2565b9050614bc1614bba83670de0b6b3a76400008d90036137ed565b600080805b8751811015614cca57614cc088828151811061487457fe5b9150600101614ca8565b506060865167ffffffffffffffff81118015614ce557600080fd5b50604051908082528060200260200182016040528015614d0f578160200160208202803683370190505b5090506000805b8951811015614da9576000614d31858c8481518110614b6157fe5b9050614d738b8381518110614d4257fe5b6020026020010151614d6d8c8581518110614d5957fe5b60200260200101518e868151811061424157fe5b90612830565b848381518110614d7f57fe5b602002602001018181525050614d9e61499582868581518110613fc157fe5b925050600101614d16565b506060895167ffffffffffffffff81118015614dc457600080fd5b50604051908082528060200260200182016040528015614dee578160200160208202803683370190505b50905060005b8a51811015614eaf57600083858381518110614e0c57fe5b60200260200101511115614e68576000614e31614a2686670de0b6b3a76400006115f2565b90506000614e45828e868151811061416857fe5b9050614e5f614a6082670de0b6b3a76400008d9003612f77565b92505050614e7f565b8a8281518110614e7457fe5b602002602001015190505b614e8f818d848151811061424157fe5b838381518110614e9b57fe5b602090810291909101015250600101614df4565b506000614ebc8c836126ce565b90506000614eca828a612830565b9050670de0b6b3a7640000811115614efe57614ef18a670de0b6b3a763ffff198301612f77565b96505050505050506147ba565b600096505050505050506147ba565b6000614f1f63f4b7964d60e01b61107d565b821480610cc95750610cc982615239565b6060600082806020019051810190614f4891906157a9565b909590945092505050565b60008180602001905181019061157f91906157ee565b60008082806020019051810190614f48919061581a565b6060600082806020019051810190614f4891906158ad565b60008180602001905181019061157f91906158cb565b60606000614fbc84846137ed565b90506060855167ffffffffffffffff81118015614fd857600080fd5b50604051908082528060200260200182016040528015615002578160200160208202803683370190505b50905060005b8651811015615040576150218388838151811061497f57fe5b82828151811061502d57fe5b6020908102919091010152600101615008565b5095945050505050565b60008082806020019051810190614f4891906158e7565b600061157f61507384613c4385612998565b6127678461298a565b60008084518602905060008560008151811061509457fe5b6020026020010151905060008651876000815181106150af57fe5b60200260200101510290506000600190505b8751811015615115576150fa6150f46150ed848b85815181106150e057fe5b602002602001015161155b565b8a5161155b565b886135b7565b915061510b8882815181106126ee57fe5b92506001016150c1565b5086858151811061512257fe5b602002602001015182039150600061513a878861155b565b9050600061516661515a61515284610b70898861155b565b6103e861155b565b8a89815181106150e057fe5b9050600061518161517a6151528b896135b7565b86906121f8565b905060008061519d61519386866121f8565b610b708d866121f8565b905060005b60ff81101561521d578192506151d26151bf866127a2858661155b565b610b708e613e8c886127a288600261155b565b9150828211156151fb576001838303116151f6575097506115ea9650505050505050565b615215565b600182840311615215575097506115ea9650505050505050565b6001016151a2565b50615229610142612881565b5050505050505050949350505050565b600061524b632f1a0bc960e01b61107d565b8214806152665750615263637587926b60e11b61107d565b82145b80610cc95750610cc9826000615282631c74c91760e11b61107d565b82148061529d575061529a6350dd6ed960e01b61107d565b82145b80610cc957506000610cc9565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565bfe5b803561086a81615ebc565b600082601f8301126152f7578081fd5b813561530a61530582615e9c565b615e75565b81815291506020808301908481018184028601820187101561532b57600080fd5b60005b848110156128255781358452928201929082019060010161532e565b600082601f83011261535a578081fd5b815161536861530582615e9c565b81815291506020808301908481018184028601820187101561538957600080fd5b60005b848110156128255781518452928201929082019060010161538c565b600082601f8301126153b8578081fd5b813567ffffffffffffffff8111156153ce578182fd5b6153e1601f8201601f1916602001615e75565b91508082528360208285010111156153f857600080fd5b8060208401602084013760009082016020015292915050565b80516003811061086a57600080fd5b80516004811061086a57600080fd5b80356002811061086a57600080fd5b60006020828403121561544f578081fd5b813561157f81615ebc565b6000806040838503121561546c578081fd5b823561547781615ebc565b9150602083013561548781615ebc565b809150509250929050565b6000806000606084860312156154a6578081fd5b83356154b181615ebc565b925060208401356154c181615ebc565b929592945050506040919091013590565b600080600080600080600060e0888a0312156154ec578283fd5b87356154f781615ebc565b9650602088013561550781615ebc565b95506040880135945060608801359350608088013561552581615ed1565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215615554578182fd5b823561555f81615ebc565b946020939093013593505050565b600080600060608486031215615581578081fd5b835167ffffffffffffffff80821115615598578283fd5b818601915086601f8301126155ab578283fd5b81516155b961530582615e9c565b80828252602080830192508086018b8283870289010111156155d9578788fd5b8796505b848710156156045780516155f081615ebc565b8452600196909601959281019281016155dd565b50890151909750935050508082111561561b578283fd5b506156288682870161534a565b925050604084015190509250925092565b60006020828403121561564a578081fd5b8151801515811461157f578182fd5b600080600080600080600060e0888a031215615673578081fd5b87359650602088013561568581615ebc565b9550604088013561569581615ebc565b9450606088013567ffffffffffffffff808211156156b1578283fd5b6156bd8b838c016152e7565b955060808a0135945060a08a0135935060c08a01359150808211156156e0578283fd5b506156ed8a828b016153a8565b91505092959891949750929550565b60006020828403121561570d578081fd5b81356001600160e01b03198116811461157f578182fd5b600060208284031215615735578081fd5b815161157f81615ebc565b60008060408385031215615752578182fd5b823561575d81615ebc565b9150602083013567ffffffffffffffff811115615778578182fd5b615784858286016153a8565b9150509250929050565b60006020828403121561579f578081fd5b61157f8383615411565b6000806000606084860312156157bd578081fd5b6157c78585615411565b9250602084015167ffffffffffffffff8111156157e2578182fd5b6156288682870161534a565b60008060408385031215615800578182fd5b61580a8484615411565b9150602083015190509250929050565b60008060006060848603121561582e578081fd5b6158388585615411565b925060208401519150604084015190509250925092565b600060208284031215615860578081fd5b61157f8383615420565b6000806040838503121561587c578182fd5b6158868484615420565b9150602083015167ffffffffffffffff8111156158a1578182fd5b6157848582860161534a565b6000806000606084860312156158c1578081fd5b6157c78585615420565b600080604083850312156158dd578182fd5b61580a8484615420565b6000806000606084860312156158fb578081fd5b6158388585615420565b6000806000806080858703121561591a578182fd5b843567ffffffffffffffff80821115615931578384fd5b818701915061012080838a031215615947578485fd5b61595081615e75565b905061595c898461542f565b815261596b89602085016152dc565b602082015261597d89604085016152dc565b6040820152606083013560608201526080830135608082015260a083013560a08201526159ad8960c085016152dc565b60c08201526159bf8960e085016152dc565b60e082015261010080840135838111156159d7578687fd5b6159e38b8287016153a8565b828401525050809650506020870135915080821115615a00578384fd5b50615a0d878288016152e7565b949794965050505060408301359260600135919050565b600060208284031215615a35578081fd5b5035919050565b600060208284031215615a4d578081fd5b5051919050565b60008060408385031215615a66578182fd5b50508035926020909101359150565b60008060008060808587031215615a8a578182fd5b8451935060208501519250604085015191506060850151615aaa81615ebc565b939692955090935050565b600060208284031215615ac6578081fd5b815161157f81615ed1565b60008060408385031215615ae3578182fd5b8251615aee81615ed1565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015615b3a57815187529582019590820190600101615b1e565b509495945050505050565b60008151808452815b81811015615b6a57602081850181015186830182015201615b4e565b81811115615b7b5782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b81811015615c285783516001600160a01b031683529284019291840191600101615c03565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015615cbe578151805160048110615c6757fe5b855280870151615c7988870182615afe565b508581015186860152606080820151615c9482880182615afe565b505060809081015190615ca986820183615afe565b505060a0939093019290850190600101615c51565b5091979650505050505050565b60006020825261157f6020830184615b0b565b600060408252615cf16040830185615b0b565b82810360208401526117f08185615b0b565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000838252604060208301526115ea6040830184615b45565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825261157f6020830184615b45565b6000838252604060208301526115ea6040830184615b0b565b9283529015156020830152604082015260600190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615e9457600080fd5b604052919050565b600067ffffffffffffffff821115615eb2578081fd5b5060209081020190565b6001600160a01b0381168114610be757600080fd5b60ff81168114610be757600080fdfea2646970667358221220b1e5ec4de2ef1abf9e959c7f4391d7d01e93ab6b319e2acf4aba7247f67b09a664736f6c634300070100336bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100de5760003560e01c80636634b7531161008c578063739238d611610066578063739238d61461018f578063851c1bb3146101975780638d928af8146101b7578063aaabadc5146101bf576100de565b80636634b7531461014757806366b59f6c146101675780636c57f5a914610187576100de565b80632f2770db116100bd5780632f2770db1461012d5780633f819b6f1461013757806354fd4d501461013f576100de565b8062c194db146100e3578063174481fa146101015780632da47c4014610117575b600080fd5b6100eb6101c7565b6040516100f89190610e3b565b60405180910390f35b6101096101e6565b6040516100f8929190610dee565b61011f61022c565b6040516100f8929190610fa8565b610135610296565b005b6100eb6102dd565b6100eb610373565b61015a610155366004610b4a565b6103d1565b6040516100f89190610e08565b61017a610175366004610bc6565b6103ef565b6040516100f89190610e4e565b61015a6104c4565b61017a6104cd565b6101aa6101a5366004610b82565b6104f1565b6040516100f89190610e13565b61017a610543565b61017a610567565b60606101e160405180602001604052806000815250610633565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561028857807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610291565b60009250600091505b509091565b61029e61070c565b6102a661073d565b6001805460ff1916811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156103695780601f1061033e57610100808354040283529160200191610369565b820191906000526020600020905b81548152906001019060200180831161034c57829003601f168201915b5050505050905090565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156103695780601f1061033e57610100808354040283529160200191610369565b6001600160a01b031660009081526020819052604090205460ff1690565b60008060006103fc61022c565b915091506104b4604051806101c00160405280610417610543565b6001600160a01b0316815260200161042d6104cd565b6001600160a01b031681526020018e81526020018d81526020018c81526020018a81526020018981526020018881526020018b8152602001878152602001848152602001838152602001866001600160a01b0316815260200161048e6102dd565b90526040516104a09190602001610e62565b604051602081830303815290604052610752565b9c9b505050505050505050505050565b60015460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610526929190610dd6565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610571610543565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156105a957600080fd5b505afa1580156105bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e19190610baa565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061062d6001600160a01b03831615156101ac6107bb565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016106fe8183866107cd565b505050505050505050919050565b60006107236000356001600160e01b0319166104f1565b905061073a610732823361080b565b6101916107bb565b50565b6107506107486104c4565b1560d36107bb565b565b600061075c61073d565b60006107678361089d565b6001600160a01b038116600081815260208190526040808220805460ff191660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b816107c9576107c9816108d8565b5050565b5b602081106107ed578151835260209283019290910190601f19016107ce565b905182516020929092036101000a6000190180199091169116179052565b6000610815610567565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161084493929190610e1c565b60206040518083038186803b15801561085c57600080fd5b505afa158015610870573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108949190610b66565b90505b92915050565b600060606108aa83610633565b905060008151602083016000f090506001600160a01b0381166108d1573d6000803e3d6000fd5b9392505050565b62461bcd60e51b600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b60445261073a916210905360ea1b906242414c90606490fd5b803561089781610ffd565b600082601f83011261094e578081fd5b813561096161095c82610fdd565b610fb6565b81815291506020808301908481018184028601820187101561098257600080fd5b60005b848110156109aa57813561099881611012565b84529282019290820190600101610985565b505050505092915050565b600082601f8301126109c5578081fd5b81356109d361095c82610fdd565b8181529150602080830190848101818402860182018710156109f457600080fd5b60005b848110156109aa578135610a0a81610ffd565b845292820192908201906001016109f7565b600082601f830112610a2c578081fd5b8135610a3a61095c82610fdd565b818152915060208083019084810181840286018201871015610a5b57600080fd5b60005b848110156109aa578135610a7181610ffd565b84529282019290820190600101610a5e565b600082601f830112610a93578081fd5b8135610aa161095c82610fdd565b818152915060208083019084810181840286018201871015610ac257600080fd5b60005b848110156109aa57813584529282019290820190600101610ac5565b600082601f830112610af1578081fd5b813567ffffffffffffffff811115610b07578182fd5b610b1a601f8201601f1916602001610fb6565b9150808252836020828501011115610b3157600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215610b5b578081fd5b81356108d181610ffd565b600060208284031215610b77578081fd5b81516108d181611012565b600060208284031215610b93578081fd5b81356001600160e01b0319811681146108d1578182fd5b600060208284031215610bbb578081fd5b81516108d181610ffd565b60008060008060008060008060006101208a8c031215610be4578485fd5b893567ffffffffffffffff80821115610bfb578687fd5b610c078d838e01610ae1565b9a5060208c0135915080821115610c1c578687fd5b610c288d838e01610ae1565b995060408c0135915080821115610c3d578687fd5b610c498d838e016109b5565b985060608c0135975060808c0135915080821115610c65578687fd5b610c718d838e01610a1c565b965060a08c0135915080821115610c86578586fd5b610c928d838e01610a83565b955060c08c0135915080821115610ca7578485fd5b50610cb48c828d0161093e565b93505060e08a01359150610ccc8b6101008c01610933565b90509295985092959850929598565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015610d19578151151587529582019590820190600101610cfb565b509495945050505050565b6000815180845260208085019450808401835b83811015610d195781516001600160a01b031687529582019590820190600101610d37565b6000815180845260208085019450808401835b83811015610d1957815187529582019590820190600101610d6f565b60008151808452815b81811015610db057602081850181015186830182015201610d94565b81811115610dc15782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6001600160a01b0392831681529116602082015260400190565b901515815260200190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b6000602082526108946020830184610d8b565b6001600160a01b0391909116815260200190565b600060208252610e76602083018451610cdb565b6020830151610e886040840182610cdb565b5060408301516101c0806060850152610ea56101e0850183610d8b565b91506060850151601f1980868503016080870152610ec38483610d8b565b935060808701519150808685030160a0870152610ee08483610d24565b935060a08701519150808685030160c0870152610efd8483610d24565b935060c08701519150808685030160e0870152610f1a8483610d5c565b935060e08701519150610100818786030181880152610f398584610ce8565b908801516101208881019190915288015161014080890191909152880151610160808901919091528801516101808089019190915288015190945091506101a0610f8581880184610cdb565b870151868503909101838701529050610f9e8382610d8b565b9695505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610fd557600080fd5b604052919050565b600067ffffffffffffffff821115610ff3578081fd5b5060209081020190565b6001600160a01b038116811461073a57600080fd5b801515811461073a57600080fdfea264697066735822122061705dd8404abd5eb78108c577a8e4e0a5bc44af05a8a94d80a46f3c79ca12dc64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/index.ts b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/index.ts new file mode 100644 index 0000000..130628e --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/index.ts @@ -0,0 +1,85 @@ +import { Task, TaskMode, TaskRunOptions } from '@src'; +import { ComposableStablePoolDeployment } from './input'; + +import { ZERO_ADDRESS } from '@helpers/constants'; +import { bn } from '@helpers/numbers'; +import * as expectEvent from '@helpers/expectEvent'; +import { getContractDeploymentTransactionHash, saveContractDeploymentTransactionHash } from '@src'; +import { ethers } from 'hardhat'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as ComposableStablePoolDeployment; + + const args = [input.Vault, input.ProtocolFeePercentagesProvider, input.FactoryVersion, input.PoolVersion]; + const factory = await task.deployAndVerify('ComposableStablePoolFactory', args, from, force); + + if (task.mode === TaskMode.LIVE) { + // We also create a Pool using the factory and verify it, to let us compute their action IDs and so that future + // Pools are automatically verified. We however don't run any of this code in CHECK mode, since we don't care about + // the contracts deployed here. The action IDs will be checked to be correct via a different mechanism. + + // The pauseWindowDuration and bufferPeriodDuration will be filled in later, but we need to declare them here to + // appease the type system. Those are constructor arguments, but automatically provided by the factory. + + const mockPoolArgs = { + vault: input.Vault, + protocolFeeProvider: input.ProtocolFeePercentagesProvider, + name: 'DO NOT USE - Mock Composable Stable Pool', + symbol: 'TEST', + tokens: [input.WETH, input.BAL].sort(function (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()); + }), + rateProviders: [ZERO_ADDRESS, ZERO_ADDRESS], + tokenRateCacheDurations: [0, 0], + exemptFromYieldProtocolFeeFlags: [false, false], + amplificationParameter: bn(100), + swapFeePercentage: bn(1e12), + pauseWindowDuration: undefined, + bufferPeriodDuration: undefined, + owner: ZERO_ADDRESS, + version: input.PoolVersion, + }; + + // This mimics the logic inside task.deploy + if (force || !task.output({ ensure: false })['MockComposableStablePool']) { + const poolCreationReceipt = await ( + await factory.create( + mockPoolArgs.name, + mockPoolArgs.symbol, + mockPoolArgs.tokens, + mockPoolArgs.amplificationParameter, + mockPoolArgs.rateProviders, + mockPoolArgs.tokenRateCacheDurations, + mockPoolArgs.exemptFromYieldProtocolFeeFlags, + mockPoolArgs.swapFeePercentage, + mockPoolArgs.owner + ) + ).wait(); + const event = expectEvent.inReceipt(poolCreationReceipt, 'PoolCreated'); + const mockPoolAddress = event.args.pool; + + await saveContractDeploymentTransactionHash(mockPoolAddress, poolCreationReceipt.transactionHash, task.network); + await task.save({ MockComposableStablePool: mockPoolAddress }); + } + + const mockPool = await task.instanceAt('ComposableStablePool', task.output()['MockComposableStablePool']); + + // In order to verify the Pool's code, we need to complete its constructor arguments by computing the factory + // provided arguments (pause durations). + + // The durations require knowing when the Pool was created, so we look for the timestamp of its creation block. + const txHash = await getContractDeploymentTransactionHash(mockPool.address, task.network); + const tx = await ethers.provider.getTransactionReceipt(txHash); + const poolCreationBlock = await ethers.provider.getBlock(tx.blockNumber); + + // With those and the period end times, we can compute the durations. + const { pauseWindowEndTime, bufferPeriodEndTime } = await mockPool.getPausedState(); + mockPoolArgs.pauseWindowDuration = pauseWindowEndTime.sub(poolCreationBlock.timestamp); + mockPoolArgs.bufferPeriodDuration = bufferPeriodEndTime + .sub(poolCreationBlock.timestamp) + .sub(mockPoolArgs.pauseWindowDuration); + + // We are now ready to verify the Pool + await task.verify('ComposableStablePool', mockPool.address, [mockPoolArgs]); + } +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/input.ts b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/input.ts new file mode 100644 index 0000000..1645d93 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/input.ts @@ -0,0 +1,26 @@ +import { Task, TaskMode } from '@src'; + +export type ComposableStablePoolDeployment = { + Vault: string; + ProtocolFeePercentagesProvider: string; + FactoryVersion: string; + PoolVersion: string; + WETH: string; + BAL: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); +const WETH = new Task('00000000-tokens', TaskMode.READ_ONLY); +const BAL = new Task('00000000-tokens', TaskMode.READ_ONLY); + +const BaseVersion = { version: 3, deployment: '20230206-composable-stable-pool-v3' }; + +export default { + Vault, + ProtocolFeePercentagesProvider, + WETH, + BAL, + FactoryVersion: JSON.stringify({ name: 'ComposableStablePoolFactory', ...BaseVersion }), + PoolVersion: JSON.stringify({ name: 'ComposableStablePool', ...BaseVersion }), +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/output/arbitrum.json new file mode 100644 index 0000000..6684299 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/output/arbitrum.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x1c99324EDC771c82A0DCCB780CC7DDA0045E50e7", + "MockComposableStablePool": "0x231B05F3a92d578EFf772f2Ddf6DacFFB3609749" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/output/bsc.json b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/output/bsc.json new file mode 100644 index 0000000..995a116 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/output/bsc.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0xacAaC3e6D6Df918Bf3c809DFC7d42de0e4a72d4C", + "MockComposableStablePool": "0xB521E108c8aC5aD91Dc16d0001b7253D3B3beBC5" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/output/gnosis.json b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/output/gnosis.json new file mode 100644 index 0000000..b9e5605 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/output/gnosis.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD", + "MockComposableStablePool": "0x07c896050dD6E273c199f06d7516F8A4A369d23A" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/output/goerli.json new file mode 100644 index 0000000..d1ad592 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/output/goerli.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0xbfD9769b061E57e478690299011A028194D66e3C", + "MockComposableStablePool": "0x2EF26d97B5870600BE341561298938c2e5df84f0" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/output/mainnet.json new file mode 100644 index 0000000..10908e4 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0xdba127fBc23fb20F5929C546af220A991b5C6e01", + "MockComposableStablePool": "0x222bc81C6F3C17e9e9Aba47a12f55a1Dea42f163" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/output/optimism.json b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/output/optimism.json new file mode 100644 index 0000000..30ea363 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/output/optimism.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0xe2E901AB09f37884BA31622dF3Ca7FC19AA443Be", + "MockComposableStablePool": "0x9BF7c3b63c77b4B4F2717776F15A4bec1b532a28" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/output/polygon.json new file mode 100644 index 0000000..e7963f1 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/output/polygon.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x7bc6C0E73EDAa66eF3F6E2f27b0EE8661834c6C9", + "MockComposableStablePool": "0xeff1d57A28167E6982DCa1D63321810400f73929" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/readme.md b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/readme.md new file mode 100644 index 0000000..6f703b7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/readme.md @@ -0,0 +1,20 @@ +# 2023-02-06 - Composable Stable Pool V3 + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This deployment was deprecated in favor of a new version which uses create2 for pool deployment: [composable-stable-pool-v4](../20230320-composable-stable-pool-v4/). The active version of the composable stable pool can be found [here](../../20230711-composable-stable-pool-v5/). + +Deployment of `ComposableStablePoolFactory`, which allows creating Stable Pools that are suitable to be included in other Pools. +Supersedes `20221122-composable-stable-pool-v2`, fixing the reentrancy issue described in this [forum post](https://forum.balancer.fi/t/reentrancy-vulnerability-scope-expanded/4345). + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`ComposableStablePool` artifact](./artifact/ComposableStablePool.json) +- [`ComposableStablePoolFactory` artifact](./artifact/ComposableStablePoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/test/test.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/test/test.fork.ts new file mode 100644 index 0000000..2dc8be3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-composable-stable-pool-v3/test/test.fork.ts @@ -0,0 +1,451 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; + +import * as expectEvent from '@helpers/expectEvent'; +import { describeForkTest } from '@src'; +import { Task, TaskMode } from '@src'; +import { getForkedNetwork } from '@src'; +import { getSigner, impersonate } from '@src'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; + +import { sharedBeforeEach } from '@helpers/sharedBeforeEach'; +import { MAX_UINT256, ZERO_ADDRESS } from '@helpers/constants'; +import { bn, fp } from '@helpers/numbers'; +import { BasePoolEncoder } from '@helpers/models/pools/utils/encoder'; +import { StablePoolEncoder } from '@helpers/models/pools/stable/encoder'; +import { SwapKind } from '@helpers/models/types/types'; +import { actionId } from '@helpers/models/misc/actions'; +import { expectEqualWithError } from '@helpers/relativeError'; +import { deploy } from '@src'; + +describeForkTest('ComposableStablePool V3', 'mainnet', 16577000, function () { + let task: Task; + + let factory: Contract; + let owner: SignerWithAddress; + let whale: SignerWithAddress, auraWhale: SignerWithAddress; + let govMultisig: SignerWithAddress; + let vault: Contract; + let authorizer: Contract; + let busd: Contract, usdc: Contract, aura: Contract, graviAura: Contract; + + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + const LARGE_TOKEN_HOLDER = '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503'; + const USDC_SCALING = bn(1e12); // USDC has 6 decimals, so its scaling factor is 1e12 + const AURA_HOLDER = '0x2af2b2e485e1854fd71590c7ffd104db0f66f8a6'; + + const USDC = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'; + const BUSD = '0x4Fabb145d64652a948d72533023f6E7A623C7C53'; + const AURA = '0xC0c293ce456fF0ED870ADd98a0828Dd4d2903DBF'; + const GRAVIAURA = '0xBA485b556399123261a5F9c95d413B4f93107407'; + + const tokens = [BUSD, USDC]; + const amplificationParameter = bn(400); + const swapFeePercentage = fp(0.01); + const initialBalanceBUSD = fp(1e6); + const initialBalanceUSDC = fp(1e6).div(USDC_SCALING); + const initialBalances = [initialBalanceBUSD, initialBalanceUSDC]; + + // Pool deployed from previous factory version (GRAVI AURA - AURA) + const GRAVI_AURA_POOL = '0x6A9603E481Fb8F2c09804ea9AdaB49A338855B90'; + + enum AttackType { + DISABLE_RECOVERY_MODE, + UPDATE_PROTOCOL_FEE_CACHE, + UPDATE_TOKEN_RATE_CACHE, + SET_TOKEN_RATE_CACHE_DURATION, + } + + before('run task', async () => { + task = new Task('20230206-composable-stable-pool-v3', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('ComposableStablePoolFactory'); + }); + + before('load signers', async () => { + owner = await getSigner(); + whale = await impersonate(LARGE_TOKEN_HOLDER, fp(100)); + auraWhale = await impersonate(AURA_HOLDER, fp(100)); + + govMultisig = await impersonate(GOV_MULTISIG, fp(100)); + }); + + before('load vault and tokens', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.instanceAt('Vault', await factory.getVault()); + authorizer = await new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance( + 'Authorizer' + ); + + busd = await task.instanceAt('ERC20', BUSD); + usdc = await task.instanceAt('ERC20', USDC); + aura = await task.instanceAt('ERC20', AURA); + graviAura = await task.instanceAt('ERC20', GRAVIAURA); + + await busd.connect(whale).approve(vault.address, MAX_UINT256); + await usdc.connect(whale).approve(vault.address, MAX_UINT256); + }); + + async function createPool(tokens: string[], rateProvider = ZERO_ADDRESS, initialize = true): Promise { + const rateProviders: string[] = Array(tokens.length).fill(rateProvider); + const cacheDurations: BigNumber[] = Array(tokens.length).fill(bn(0)); + const exemptFlags: boolean[] = Array(tokens.length).fill(false); + + const tx = await factory.create( + 'CSP', + 'CSBPT', + tokens, + amplificationParameter, + rateProviders, + cacheDurations, + exemptFlags, + swapFeePercentage, + owner.address + ); + + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + const pool = await task.instanceAt('ComposableStablePool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + if (initialize) { + const bptIndex = await pool.getBptIndex(); + const poolId = await pool.getPoolId(); + + const registeredBalances = getRegisteredBalances(bptIndex, initialBalances); + const { tokens: registeredTokens } = await vault.getPoolTokens(poolId); + + const userData = StablePoolEncoder.joinInit(registeredBalances); + // Use this for maxAmountsIn + registeredBalances[bptIndex] = MAX_UINT256; + + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: registeredTokens, + maxAmountsIn: registeredBalances, + fromInternalBalance: false, + userData, + }); + } + + return pool; + } + + function getRegisteredBalances(bptIndex: number, balances: BigNumber[]): BigNumber[] { + return Array.from({ length: balances.length + 1 }).map((_, i) => + i == bptIndex ? bn(0) : i < bptIndex ? balances[i] : balances[i - 1] + ); + } + + describe('getters', () => { + it('check factory version', async () => { + const expectedFactoryVersion = { + name: 'ComposableStablePoolFactory', + version: 3, + deployment: '20230206-composable-stable-pool-v3', + }; + + expect(await factory.version()).to.equal(JSON.stringify(expectedFactoryVersion)); + }); + + it('check pool version', async () => { + const pool = await createPool(tokens); + + const expectedPoolVersion = { + name: 'ComposableStablePool', + version: 3, + deployment: '20230206-composable-stable-pool-v3', + }; + + expect(await pool.version()).to.equal(JSON.stringify(expectedPoolVersion)); + }); + }); + + describe('pool operations', () => { + const amount = fp(500); + + let pool: Contract; + let poolId: string; + let bptIndex: number; + + context('swap', () => { + before('deploy a composable stable pool', async () => { + expect(await factory.isPoolFromFactory(ZERO_ADDRESS)).to.be.false; + + pool = await createPool(tokens); + + poolId = pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + bptIndex = await pool.getBptIndex(); + }); + + it('performs a swap', async () => { + await busd.connect(whale).transfer(owner.address, amount); + await busd.connect(owner).approve(vault.address, amount); + + await vault + .connect(owner) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: BUSD, assetOut: USDC, amount, userData: '0x' }, + { sender: owner.address, recipient: owner.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert pool swap + const expectedUSDC = amount.div(USDC_SCALING); + expectEqualWithError(await busd.balanceOf(owner.address), 0, 0.0001); + expectEqualWithError(await usdc.balanceOf(owner.address), bn(expectedUSDC), 0.1); + }); + }); + + context('proportional join', () => { + before('deploy a composable stable pool', async () => { + expect(await factory.isPoolFromFactory(ZERO_ADDRESS)).to.be.false; + + pool = await createPool(tokens); + + poolId = pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + bptIndex = await pool.getBptIndex(); + }); + + it('joins proportionally', async () => { + const ownerBptBalance = await pool.balanceOf(owner.address); + const bptOut = ownerBptBalance.div(5); + + const { tokens: registeredTokens } = await vault.getPoolTokens(poolId); + // Given the bptOut, the max amounts in should be slightly more than 1/5. Decimals make it a bit complicated. + const adjustedBalances = [ + initialBalanceBUSD.div(fp(4.99)).mul(fp(1)), + initialBalanceUSDC.div(bn(4.99e6)).mul(1e6), + ]; + const maxAmountsIn = getRegisteredBalances(bptIndex, adjustedBalances); + + const tx = await vault.connect(whale).joinPool(poolId, whale.address, whale.address, { + assets: registeredTokens, + maxAmountsIn: maxAmountsIn, + fromInternalBalance: false, + userData: StablePoolEncoder.joinAllTokensInForExactBptOut(bptOut), + }); + const receipt = await (await tx).wait(); + const { deltas: amountsIn } = expectEvent.inReceipt(receipt, 'PoolBalanceChanged').args; + + // Amounts in should be ~ 1/5 the initial balances + expect(amountsIn).to.equalWithError(maxAmountsIn, 0.01); + + // Make sure received BPT is close to what we expect + const currentBptBalance = await pool.balanceOf(whale.address); + expect(currentBptBalance).to.be.equalWithError(bptOut, 0.001); + }); + }); + + context('proportional exit', () => { + before('deploy a composable stable pool', async () => { + expect(await factory.isPoolFromFactory(ZERO_ADDRESS)).to.be.false; + + pool = await createPool(tokens); + + poolId = pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + bptIndex = await pool.getBptIndex(); + }); + + it('exits proportionally', async () => { + const previousBptBalance = await pool.balanceOf(owner.address); + const bptIn = previousBptBalance.div(4); + + const { tokens: registeredTokens, balances: registeredBalances } = await vault.getPoolTokens(poolId); + + const tx = await vault.connect(owner).exitPool(poolId, owner.address, owner.address, { + assets: registeredTokens, + minAmountsOut: Array(registeredTokens.length).fill(0), + fromInternalBalance: false, + userData: StablePoolEncoder.exitExactBptInForTokensOut(bptIn), + }); + const receipt = await (await tx).wait(); + const { deltas } = expectEvent.inReceipt(receipt, 'PoolBalanceChanged').args; + const amountsOut = deltas.map((x: BigNumber) => x.mul(-1)); + + const expectedAmountsOut = (registeredBalances as BigNumber[]).map((b) => b.div(4)); + expectedAmountsOut[bptIndex] = bn(0); + + // Amounts out should be 1/4 the initial balances + expect(amountsOut).to.equalWithError(expectedAmountsOut, 0.00001); + + // Make sure sent BPT is close to what we expect + const currentBptBalance = await pool.balanceOf(owner.address); + expect(currentBptBalance).to.be.equalWithError(bn(previousBptBalance).sub(bptIn), 0.001); + }); + }); + }); + + describe('read-only reentrancy protection', () => { + let pool: Contract; + let poolId: string; + let attacker: Contract; + // Actual amounts do not matter for the attack, so we pick an arbitrary value that the whale can transfer. + // The same amount will actually represent different quantities since the decimals may vary from token to token, + // but this is fine since we only need a valid join. + const attackerFunds = 1000; + + sharedBeforeEach('deploy and fund attacker', async () => { + attacker = await deploy('ReadOnlyReentrancyAttackerCSP', [vault.address]); + await busd.connect(whale).transfer(attacker.address, attackerFunds); + await usdc.connect(whale).transfer(attacker.address, attackerFunds); + await aura.connect(auraWhale).transfer(attacker.address, attackerFunds); + await graviAura.connect(auraWhale).transfer(attacker.address, attackerFunds); + }); + + context('when the target pool is not protected', () => { + sharedBeforeEach('get affected pool instance', async () => { + pool = await task.instanceAt('ComposableStablePool', GRAVI_AURA_POOL); + poolId = await pool.getPoolId(); + }); + + itPerformsAttack(false); + }); + + context('when the target pool is protected', () => { + sharedBeforeEach('deploy pool with rate providers', async () => { + const rateProvider = await deploy('MockRateProvider'); + pool = await createPool(tokens, rateProvider.address); + poolId = await pool.getPoolId(); + }); + + itPerformsAttack(true); + }); + + function itPerformsAttack(expectRevert: boolean) { + const action = expectRevert ? 'rejects' : 'does not reject'; + + context('update protocol fee cache', () => { + it(`${action} protocol fee cache attack`, async () => { + await performAttack(AttackType.UPDATE_PROTOCOL_FEE_CACHE, expectRevert); + }); + }); + + context('update token rate cache', () => { + it(`${action} token rate cache attack`, async () => { + await performAttack(AttackType.UPDATE_TOKEN_RATE_CACHE, expectRevert); + }); + }); + + context('update token rate cache duration', () => { + sharedBeforeEach('grant permissions to attacker', async () => { + await authorizer + .connect(govMultisig) + .grantRole(await actionId(pool, 'setTokenRateCacheDuration'), attacker.address); + }); + + it(`${action} token rate cache duration attack`, async () => { + await performAttack(AttackType.SET_TOKEN_RATE_CACHE_DURATION, expectRevert); + }); + }); + + context('disable recovery mode', () => { + sharedBeforeEach('grant permissions to attacker', async () => { + await authorizer + .connect(govMultisig) + .grantRole(await actionId(pool, 'disableRecoveryMode'), attacker.address); + }); + + it(`${action} disable recovery mode attack`, async () => { + await performAttack(AttackType.DISABLE_RECOVERY_MODE, expectRevert); + }); + }); + } + + async function performAttack(attackType: AttackType, expectRevert: boolean) { + const allTokens = (await vault.getPoolTokens(poolId)).tokens; + // Amounts in must not include BPT in user data. + const userData = StablePoolEncoder.joinExactTokensInForBPTOut(Array(allTokens.length - 1).fill(attackerFunds), 0); + + // We are doing exact tokens in, so max amounts are not relevant. + const joinRequest = { + assets: allTokens, + maxAmountsIn: Array(allTokens.length).fill(MAX_UINT256), + userData, + fromInternalBalance: false, + }; + + if (expectRevert) { + await expect(attacker.startAttack(poolId, joinRequest, attackType, { value: 10 })).to.be.revertedWith( + 'BAL#420' + ); + } else { + await attacker.startAttack(poolId, joinRequest, attackType, { value: 10 }); + } + } + }); + + describe('recovery mode', () => { + let pool: Contract; + let poolId: string; + + before('deploy and initialize a composable stable pool', async () => { + pool = await createPool(tokens); + poolId = await pool.getPoolId(); + }); + + before('enter recovery mode', async () => { + await authorizer.connect(govMultisig).grantRole(await actionId(pool, 'enableRecoveryMode'), govMultisig.address); + await pool.connect(govMultisig).enableRecoveryMode(); + expect(await pool.inRecoveryMode()).to.be.true; + }); + + it('can exit via recovery mode', async () => { + const bptBalance = await pool.balanceOf(owner.address); + expect(bptBalance).to.gt(0); + + const vaultUSDCBalanceBeforeExit = await usdc.balanceOf(vault.address); + const ownerUSDCBalanceBeforeExit = await usdc.balanceOf(owner.address); + + const { tokens: registeredTokens } = await vault.getPoolTokens(poolId); + + const userData = BasePoolEncoder.recoveryModeExit(bptBalance); + await vault.connect(owner).exitPool(poolId, owner.address, owner.address, { + assets: registeredTokens, + minAmountsOut: Array(registeredTokens.length).fill(0), + fromInternalBalance: false, + userData, + }); + + const remainingBalance = await pool.balanceOf(owner.address); + expect(remainingBalance).to.equal(0); + + const vaultUSDCBalanceAfterExit = await usdc.balanceOf(vault.address); + const ownerUSDCBalanceAfterExit = await usdc.balanceOf(owner.address); + + expect(vaultUSDCBalanceAfterExit).to.lt(vaultUSDCBalanceBeforeExit); + expect(ownerUSDCBalanceAfterExit).to.gt(ownerUSDCBalanceBeforeExit); + }); + }); + + describe('factory disable', () => { + it('the factory can be disabled', async () => { + await authorizer.connect(govMultisig).grantRole(await actionId(factory, 'disable'), govMultisig.address); + await factory.connect(govMultisig).disable(); + + expect(await factory.isDisabled()).to.be.true; + await expect( + factory.create( + 'CSP', + 'CSBPT', + tokens, + amplificationParameter, + Array(tokens.length).fill(ZERO_ADDRESS), + Array(tokens.length).fill(0), + Array(tokens.length).fill(false), + swapFeePercentage, + owner.address + ) + ).to.be.revertedWith('BAL#211'); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/artifact/ERC4626LinearPool.json b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/artifact/ERC4626LinearPool.json new file mode 100644 index 0000000..0902c84 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/artifact/ERC4626LinearPool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"components": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20", "name": "mainToken", "type": "address"}, {"internalType": "contract IERC20", "name": "wrappedToken", "type": "address"}, {"internalType": "address", "name": "assetManager", "type": "address"}, {"internalType": "uint256", "name": "upperTarget", "type": "uint256"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "string", "name": "version", "type": "string"}], "internalType": "struct ERC4626LinearPool.ConstructorArgs", "name": "args", "type": "tuple"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "enabled", "type": "bool"}], "name": "RecoveryModeStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "contract IERC20", "name": "token", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "lowerTarget", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "upperTarget", "type": "uint256"}], "name": "TargetsSet", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "disableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "enableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getBptIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "pure", "type": "function"}, {"inputs": [], "name": "getDomainSeparator", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMainIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMainToken", "outputs": [{"internalType": "contract IERC20", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "getNextNonce", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getProtocolFeesCollector", "outputs": [{"internalType": "contract IProtocolFeesCollector", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getScalingFactors", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getTargets", "outputs": [{"internalType": "uint256", "name": "lowerTarget", "type": "uint256"}, {"internalType": "uint256", "name": "upperTarget", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVirtualSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedToken", "outputs": [{"internalType": "contract IERC20", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getWrappedTokenRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "inRecoveryMode", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "dueProtocolFees", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "dueProtocolFees", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "indexIn", "type": "uint256"}, {"internalType": "uint256", "name": "indexOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple"}, {"internalType": "uint256", "name": "balanceTokenIn", "type": "uint256"}, {"internalType": "uint256", "name": "balanceTokenOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "newLowerTarget", "type": "uint256"}, {"internalType": "uint256", "name": "newUpperTarget", "type": "uint256"}], "name": "setTargets", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "version", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/artifact/ERC4626LinearPoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/artifact/ERC4626LinearPoolFactory.json new file mode 100644 index 0000000..4e240f6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/artifact/ERC4626LinearPoolFactory.json @@ -0,0 +1,329 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ERC4626LinearPoolFactory", + "sourceName": "contracts/erc4626-linear-pool/ERC4626LinearPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "contract IBalancerQueries", + "name": "queries", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "poolVersion", + "type": "string" + }, + { + "internalType": "uint256", + "name": "initialPauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "Erc4626LinearPoolCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract LinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastCreatedPool", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeePercentagesProvider", + "outputs": [ + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101e06040523480156200001257600080fd5b5060405162009336380380620093368339810160408190526200003591620003be565b86868383604051806020016200004b906200026d565b601f1982820381018352601f909101166040528851839083908790309085908e906200007f9060009060208401906200027b565b505080516002810460a081905280820360e081905281845283620000af816200018e602090811b620009f117901c565b60601b6001600160601b0319166080528285018051838252620000de826200018e602090811b620009f117901c565b6001600160601b0319606091821b811660c0529690935290526101009590955250509290911b909116610120525062000121630163f500831115610194620001e2565b620001356276a700821115610195620001e2565b610140829052610160524201610180525050506001600160601b0319606091821b81166101a05260016003559087901b166101c052508251620001809060069060208601906200027b565b50505050505050506200048f565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001dc6001600160a01b03831615156101ac620001e2565b50919050565b81620001f357620001f381620001f7565b5050565b62000209816210905360ea1b6200020c565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b61596a80620039cc83390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002be57805160ff1916838001178555620002ee565b82800160010185558215620002ee579182015b82811115620002ee578251825591602001919060010190620002d1565b50620002fc92915062000300565b5090565b5b80821115620002fc576000815560010162000301565b600082601f83011262000328578081fd5b81516001600160401b03808211156200033f578283fd5b6040516020601f8401601f191682018101838111838210171562000361578586fd5b806040525081945083825286818588010111156200037e57600080fd5b600092505b83831015620003a2578583018101518284018201529182019162000383565b83831115620003b45760008185840101525b5050505092915050565b600080600080600080600060e0888a031215620003d9578283fd5b8751620003e68162000479565b6020890151909750620003f98162000479565b60408901519096506200040c8162000479565b60608901519095506001600160401b038082111562000429578485fd5b620004378b838c0162000317565b955060808a01519150808211156200044d578485fd5b506200045c8a828b0162000317565b93505060a0880151915060c0880151905092959891949750929550565b6001600160a01b03811681146200020957600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405161016051610180516101a05160601c6101c05160601c6134a8620005246000398061067552508061050452508061028b52806102b55250806102d95250508061057c52508061052a525080610a5a5250806102625280610ad6525080610a7b5250806102415280610ab252506134a86000f3fe60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c80636634b7531162000099578063851c1bb3116200006f578063851c1bb314620001cd5780638d928af814620001f3578063aaabadc514620001fd578063df8af989146200020757620000ff565b80636634b75314620001935780636c57f5a914620001b9578063739238d614620001c357620000ff565b80632f2770db11620000db5780632f2770db146200015a5780633f819b6f146200016657806354fd4d5014620001705780635ed31282146200017a57620000ff565b8062c194db1462000104578063174481fa14620001265780632da47c401462000140575b600080fd5b6200010e6200021e565b6040516200011d919062001435565b60405180910390f35b620001306200023f565b6040516200011d929190620013ce565b6200014a62000285565b6040516200011d9291906200162e565b620001646200030e565b005b6200010e62000378565b6200010e62000430565b62000184620004b2565b6040516200011d9190620013ad565b620001aa620001a436600462001137565b620004ce565b6040516200011d9190620013f5565b620001aa620004f9565b6200018462000502565b620001e4620001de36600462001178565b62000526565b6040516200011d919062001400565b620001846200057a565b620001846200059e565b6200018462000218366004620011d9565b6200062b565b60606200023a6040518060200160405280600081525062000a52565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200030057807f00000000000000000000000000000000000000000000000000000000000000000392507f0000000000000000000000000000000000000000000000000000000000000000915062000309565b60009250600091505b509091565b6200031862000b2d565b6200032262000b7c565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b820191906000526020600020905b8154815290600101906020018083116200040857829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016200055d9291906200134a565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000620005aa6200057a565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620005f057600080fd5b505afa15801562000605573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023a9190620011ba565b60006200063762000b95565b6004805460018101909155604051606090620006566020820162000fd8565b601f1982820381018352601f90910116604052620006736200057a565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001620006a7929190620013ce565b60408051601f1981840301815290829052620006c792916020016200137a565b60405160208183030381529060405290506000620006ed83838051906020012062000bb0565b9050600080620006fc62000285565b915091506200070a62000fe6565b620007146200057a565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508e81602001819052508d81604001819052508c816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508a8160c0018181525050898160e0018181525050828161010001818152505081816101200181815250508881610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506200087262000378565b610160820152604051600090620008a8906200089390849060200162001526565b60405160208183030381529060405262000bc6565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620008f357600080fd5b505af115801562000908573d6000803e3d6000fd5b5050505060006200091c6000898962000c1b565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146200098f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200098690620014b8565b60405180910390fd5b6040518a9073ffffffffffffffffffffffffffffffffffffffff8416907f45dd615d2ed7994f98fec837b2d092af933c6520b8717c3a64317961caa532ea90600090a3509650505050505050620009e562000cf9565b98975050505050505050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000a4c73ffffffffffffffffffffffffffffffffffffffff831615156101ac62000d00565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000b1f81838662000d15565b505050505050505050919050565b600062000b5e6000357fffffffff000000000000000000000000000000000000000000000000000000001662000526565b905062000b7962000b70823362000d73565b61019162000d00565b50565b62000b9362000b8a620004f9565b1560d362000d00565b565b62000ba96002600354141561019062000d00565b6002600355565b600062000bbf83833062000e11565b9392505050565b60008062000bd48362000e52565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790559392505050565b6000808447101562000c5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000986906200144a565b825162000c96576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200098690620014ef565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009869062001481565b949350505050565b6001600355565b8162000d115762000d118162000eed565b5050565b5b6020811062000d37578151835260209283019290910190601f190162000d16565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000d7f6200059e565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000dbd9392919062001409565b60206040518083038186803b15801562000dd657600080fd5b505afa15801562000deb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bbf919062001156565b60008060ff60f81b83868660405160200162000e319493929190620012e6565b60408051808303601f19018152919052805160209091012095945050505050565b600062000e5e62000b7c565b600062000e6b8362000f19565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b62000b79817f42414c000000000000000000000000000000000000000000000000000000000062000f5d565b6000606062000f288362000a52565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811662000bbf573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611de0806200169383390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f830112620010c6578081fd5b813567ffffffffffffffff80821115620010de578283fd5b6040516020601f19601f8501168201018181108382111715620010ff578485fd5b6040528281529250828483016020018610156200111b57600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121562001149578081fd5b813562000bbf816200166f565b60006020828403121562001168578081fd5b8151801515811462000bbf578182fd5b6000602082840312156200118a578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811462000bbf578182fd5b600060208284031215620011cc578081fd5b815162000bbf816200166f565b600080600080600080600080610100898b031215620011f6578384fd5b883567ffffffffffffffff808211156200120e578586fd5b6200121c8c838d01620010b5565b995060208b013591508082111562001232578586fd5b50620012418b828c01620010b5565b975050604089013562001254816200166f565b9550606089013562001266816200166f565b94506080890135935060a0890135925060c089013562001286816200166f565b8092505060e089013590509295985092959890939650565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620012d28160208601602086016200163c565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b600083516200138e8184602088016200163c565b835190830190620013a48183602088016200163c565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000bbf6020830184620012b8565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b6000602082526200153c6020830184516200129e565b60208301516101808060408501526200155a6101a0850183620012b8565b91506040850151601f19808685030160608701526200157a8483620012b8565b9350606087015191506200159260808701836200129e565b60808701519150620015a860a08701836200129e565b60a08701519150620015be60c08701836200129e565b60c087015160e087810191909152870151610100808801919091528701516101208088019190915287015161014080880191909152870151915061016062001609818801846200129e565b870151868503909101838701529050620016248382620012b8565b9695505050505050565b918252602082015260400190565b60005b83811015620016595781810151838201526020016200163f565b8381111562001669576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000b7957600080fdfe6101606040523480156200001257600080fd5b5060405162001de038038062001de0833981016040819052620000359162000462565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000378565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200012591908101906200039e565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000449565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000449565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000378565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000378565b6001600160601b0319606091821b811660e05292811b8316610120521b166101405250620004e0915050565b6000602082840312156200038a578081fd5b81516200039781620004c7565b9392505050565b60006020808385031215620003b1578182fd5b82516001600160401b0380821115620003c8578384fd5b818501915085601f830112620003dc578384fd5b815181811115620003eb578485fd5b8381029150620003fd848301620004a0565b8181528481019084860184860187018a101562000418578788fd5b8795505b838610156200043c5780518352600195909501949186019186016200041c565b5098975050505050505050565b6000602082840312156200045b578081fd5b5051919050565b6000806040838503121562000475578081fd5b82516200048281620004c7565b60208401519092506200049581620004c7565b809150509250929050565b6040518181016001600160401b0381118282101715620004bf57600080fd5b604052919050565b6001600160a01b0381168114620004dd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c61181d620005c36000398061050952806108215250806101335280610c145280610f325280610f945250806103bf52508061046c5280610599528061074852806108ec5280610cbf528061102d52806110ee528061115052508060ea5280610190528061043052806105cc528061063152806106d2528061078452806108b152806110cc52508061016f5280610402528061071a5280610a7d5280610b5c5280610dba5280610e9952508060995280610309525061181d6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611527565b60405180910390f35b6100776100723660046113e5565b6100bb565b60405161005b919061175a565b610077610092366004611401565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc929190611673565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c9190611487565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a9392919061156f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a49190611464565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f5611332565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c9611395565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611697565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610592919061144c565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d4e565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611527565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b6919061144c565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fc9565b9695505050505050565b600061070d611332565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e1611395565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611697565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa919061144c565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fed565b6110b2565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d4e565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a919061150b565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b6919061142c565b6101a2611187565b60006109cd8215156004611187565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b6005611187565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f6113bc565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016115ef565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517fba08765200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ba08765290610cf890849030908190600401611763565b602060405180830381600087803b158015610d1257600080fd5b505af1158015610d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4a919061144c565b5050565b6040805160028082526060828101909352816020015b610d6c6113bc565b815260200190600190039081610d64579050509050600281600081518110610d9057fe5b6020026020010151600001906002811115610da757fe5b90816002811115610db457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de657fe5b602002602001015160200181815250508181600081518110610e0457fe5b602002602001015160600181815250508281600081518110610e2257fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e6f57fe5b6020026020010151600001906002811115610e8657fe5b90816002811115610e9357fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec557fe5b602002602001015160200181815250508181600181518110610ee357fe5b602002602001015160600181815250508281600181518110610f0157fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f579084167f000000000000000000000000000000000000000000000000000000000000000084611195565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016115ef565b610fe88363a9059cbb60e01b848460405160240161027a9291906115c9565b505050565b6040517fb3d7f6b900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b3d7f6b99061106290859060040161175a565b60206040518083038186803b15801561107a57600080fd5b505afa15801561108e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100c6919061144c565b61111373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611195565b6040517f6e553f6500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636e553f6590610cf89084903090600401611673565b81610d4a57610d4a8161128a565b801580159061124657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e906111f39030908690600401611548565b60206040518083038186803b15801561120b57600080fd5b505afa15801561121f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611243919061144c565b15155b1561126b5761126b8363095ea7b360e01b84600060405160240161027a9291906115a0565b610fe88363095ea7b360e01b848460405160240161027a9291906115c9565b6112b4817f42414c00000000000000000000000000000000000000000000000000000000006112b7565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6000602082840312156113f6578081fd5b813561011b816117c5565b60008060408385031215611413578081fd5b823561141e816117c5565b946020939093013593505050565b60006020828403121561143d578081fd5b8151801515811461011b578182fd5b60006020828403121561145d578081fd5b5051919050565b60008060408385031215611476578182fd5b505080516020909101519092909150565b6000806000806080858703121561149c578182fd5b84519350602085015192506040850151915060608501516114bc816117c5565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161151d81846020870161178f565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561166657815180516003811061162257fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff1686860152606090810151908501526080909301929085019060010161160c565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a083015260208401516116b2816117bb565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c061014084015280518061016085015261018061171e828287016020860161178f565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b60208301846114c7565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60005b838110156117aa578181015183820152602001611792565b838111156102fc5750506000910152565b600281106112b457fe5b73ffffffffffffffffffffffffffffffffffffffff811681146112b457600080fdfea26469706673582212206599bb96b2654fbeb5e88228085dec13024ea3b0200b38992201ef3d5afda06d64736f6c63430007010033a2646970667358221220fbcc0518f666dfdce8e0b1b9f4750d34dc805e68d46737e82e81396839308c9464736f6c634300070100336102c06040523480156200001257600080fd5b506040516200596a3803806200596a833981016040819052620000359162000dd1565b6101608101518151602083015160408401516060850151608086015160c087015162000061886200045c565b60e08901516101008a01516101208b01516101408c01518a6200009e8160006200008c8c8c620004e5565b896200059660201b620014241760201c565b8b8b86868686838387878b86336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000ed92919062000c5a565b5080516200010390600490602084019062000c5a565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001829050630163f50083111561019462000764565b620001966276a70082111561019562000764565b4291909101610140819052016101605260601b6001600160601b031916610180526101a08690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000dab565b6001600160a01b03166101c0816001600160a01b031660601b8152505050505050505050876001600160a01b03166101e0816001600160a01b031660601b81525050866001600160a01b0316610200816001600160a01b031660601b81525050866001600160a01b0316886001600160a01b031610620002bb576002620002be565b60015b60ff16610220526001600160a01b0380881690891610620002e1576001620002e4565b60025b60ff1661024052620002f68862000779565b61026052620003058762000779565b6102805260006200031889828962000825565b62000323856200091f565b50508a51620003469a506009995060208c019850965062000c5a95505050505050565b5050600081608001516001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038857600080fd5b505afa1580156200039d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003c3919062000f28565b60ff169050600082606001516001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200040857600080fd5b505afa1580156200041d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000443919062000f28565b60ff16909103601201600a0a6102a052506200104e9050565b6040805160028082526060808301845292839291906020830190803683370190505090508260a00151816000815181106200049357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260a0015181600181518110620004c657fe5b6001600160a01b03909216602092830291909101909101529050919050565b60408051600280825260608281019093526001600160a01b03848116908616109183918160200160208202803683370190505090508162000527578362000529565b845b816000815181106200053757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508162000564578462000566565b835b816001815181106200057457fe5b6001600160a01b03909216602092830291909101909101529150505b92915050565b6000620005ae83620009ae60201b620015d91760201c565b606083516001016001600160401b0381118015620005cb57600080fd5b50604051908082528060200260200182016040528015620005f6578160200160208202803683370190505b50905030816000815181106200060857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156200067b578481815181106200064257fe5b60200260200101518282600101815181106200065a57fe5b6001600160a01b03909216602092830291909101909101526001016200062b565b50606083516001016001600160401b03811180156200069957600080fd5b50604051908082528060200260200182016040528015620006c4578160200160208202803683370190505b509050600081600081518110620006d757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156200074a578481815181106200071157fe5b60200260200101518282600101815181106200072957fe5b6001600160a01b0390921660209283029190910190910152600101620006fa565b506200075987878484620009ba565b979650505050505050565b816200077557620007758162000ab4565b5050565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620007b657600080fd5b505afa158015620007cb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007f1919062000f28565b60ff16905060006200081060128362000ac960201b620015e71760201c565b600a0a670de0b6b3a764000002949350505050565b620008368183111561014c62000764565b620008536b0de0b6b39983494c589c000082111561014d62000764565b6200086d670de0b6b3a7640000825b061561016162000764565b62000881670de0b6b3a76400008362000862565b620008d0670de0b6b3a7640000820460406020620008ba670de0b6b3a764000087600854919004602080620015fd62000ae1821b17811c565b62000ae160201b620015fd17909392919060201c565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d12809062000912908590859062000ff7565b60405180910390a2505050565b6200093464e8d4a5100082101560cb62000764565b6200094c67016345785d8a000082111560ca62000764565b6200096e8160c0603f60085462000ae160201b620015fd17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90620009a390839062000fee565b60405180910390a150565b80620007758162000b06565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b8152600401620009eb919062000fd9565b602060405180830381600087803b15801562000a0657600080fd5b505af115801562000a1b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a41919062000d92565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000a769084908890889060040162000f4b565b600060405180830381600087803b15801562000a9157600080fd5b505af115801562000aa6573d6000803e3d6000fd5b509298975050505050505050565b62000ac6816210905360ea1b62000b92565b50565b600062000adb83831115600162000764565b50900390565b600062000af084848462000bf3565b506001901b60001901811b1992909216911b1790565b60028151101562000b175762000ac6565b60008160008151811062000b2757fe5b602002602001015190506000600190505b825181101562000b8d57600083828151811062000b5157fe5b6020026020010151905062000b82816001600160a01b0316846001600160a01b03161060656200076460201b60201c565b915060010162000b38565b505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b62000c046101008310606462000764565b62000c3d6001821015801562000c35575062000c3160ff846101000362000c4e60201b620016201760201c565b8211155b606462000764565b62000b8d83821c156101b462000764565b80820390821102900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000c9d57805160ff191683800117855562000ccd565b8280016001018555821562000ccd579182015b8281111562000ccd57825182559160200191906001019062000cb0565b5062000cdb92915062000cdf565b5090565b5b8082111562000cdb576000815560010162000ce0565b8051620005908162001038565b600082601f83011262000d14578081fd5b81516001600160401b0381111562000d2a578182fd5b602062000d40601f8301601f1916820162001005565b9250818352848183860101111562000d5757600080fd5b60005b8281101562000d7757848101820151848201830152810162000d5a565b8281111562000d895760008284860101525b50505092915050565b60006020828403121562000da4578081fd5b5051919050565b60006020828403121562000dbd578081fd5b815162000dca8162001038565b9392505050565b60006020828403121562000de3578081fd5b81516001600160401b038082111562000dfa578283fd5b818401915061018080838703121562000e11578384fd5b62000e1c8162001005565b905062000e2a868462000cf6565b815260208301518281111562000e3e578485fd5b62000e4c8782860162000d03565b60208301525060408301518281111562000e64578485fd5b62000e728782860162000d03565b60408301525062000e87866060850162000cf6565b606082015262000e9b866080850162000cf6565b608082015262000eaf8660a0850162000cf6565b60a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014062000ef18782860162000cf6565b90820152610160838101518381111562000f09578586fd5b62000f178882870162000d03565b918301919091525095945050505050565b60006020828403121562000f3a578081fd5b815160ff8116811462000dca578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000f975762000f8485516200102c565b8352938301939183019160010162000f6f565b505084810360408601528551808252908201925081860190845b8181101562000aa65762000fc683516200102c565b8552938301939183019160010162000fb1565b602081016003831062000fe857fe5b91905290565b90815260200190565b918252602082015260400190565b6040518181016001600160401b03811182821017156200102457600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b038116811462000ac657600080fd5b60805160a05160c05160e0516101005160601c6101205160601c61014051610160516101805160601c6101a0516101c05160601c6101e05160601c6102005160601c610220516102405161026051610280516102a051614785620011e5600039806118595250806107f45250806107905280612a8c525080610718528061081c5280610c515280612f07528061309052806131c852806132d3528061345052806135885250806107b252806109bc5280610c175280612ed35280613015528061305c52806131525280613194528061329f52806133da528061341c528061351252806135545250806113f852806126f652806127c25280612ab25280612e885280612fa1528061325552806133665250806109e052806110ee5280611abc5280611b5b52806126ad52806127795280612a515280612e495280612f4b52806130de52806132165280613317528061349e5250806111cc5250806109495250508061181d5250806117f9525080610fd1525080610fad525080610f5d5250806123ea52508061242c52508061240b52506147856000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e3660046140b9565b610608565b604051610350919061444c565b60405180910390f35b610361610668565b6040516103509190614690565b61038161037c366004613e8b565b6106ff565b6040516103509190614429565b610343610716565b61034361073a565b6103a6610740565b60405161035093929190614434565b6103bd610769565b60405161035091906143f1565b6103816103d8366004613ddb565b610877565b6103e56108ed565b60405161035091906146ca565b6103436108f6565b61040d610408366004614176565b610905565b005b610343610947565b610381610425366004613e8b565b61096b565b61040d6109a6565b6103436109ba565b6104426109de565b6040516103509190614346565b61040d610a02565b610361610a56565b610343610ab7565b61047a610475366004613fba565b610aca565b6040516103509291906146a3565b610490610ae8565b6040516103509291906146bc565b610343610b26565b6103436104b4366004613d87565b610cbb565b6104cc6104c7366004613fba565b610cda565b604051610350929190614404565b6103436104e8366004613d87565b610d9c565b61040d610da7565b610343610f42565b61040d610f47565b61034361051336600461405d565b610f59565b610442610fab565b610442610fcf565b610343610536366004613d87565b610ff3565b61036161100e565b61034361055136600461412a565b61106f565b61040d61056436600461418e565b6110a8565b610381610577366004613e8b565b61111a565b61038161058a366004613e8b565b611158565b610442611165565b61038161116f565b61040d611180565b6104426111ca565b61040d6105bd366004613e1b565b6111ee565b6104cc6105d0366004613fba565b61126f565b6103436105e3366004613da3565b611306565b610343611343565b6103436113ec565b6104426113f6565b61034361141a565b6000846080015161063561061a610fcf565b6001600160a01b0316336001600160a01b03161460cd61162c565b61064a610640610947565b82146101f461162c565b61065261163a565b61065e8686868661164d565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b505050505090505b90565b600061070c338484611772565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074d6117da565b1592506107586117f7565b915061076261181b565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107db57fe5b6020026020010181815250506108196107f261183f565b7f000000000000000000000000000000000000000000000000000000000000000090611926565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084557fe5b602002602001018181525050670de0b6b3a76400008160008151811061086757fe5b6020908102919091010152905090565b6000806108848533611306565b90506108a8336001600160a01b03871614806108a05750838210155b61019e61162c565b6108b385858561195e565b336001600160a01b038616148015906108ce57506000198114155b156108e0576108e08533858403611772565b60019150505b9392505050565b60055460ff1690565b60006109006113ec565b905090565b61090d611a3e565b610915611a87565b600080610920610ae8565b915091506109396109318383611a97565b61014f61162c565b61094283611b9e565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070c9185906109a19086611c16565b611772565b6109ae611a3e565b6109b86000611c28565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a0a611a3e565b610a12611cb9565b610a1c6001611ccd565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4c9190614429565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906109009060c0603f611d0f565b60006060610adc888785611d1e611d35565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0582602080611d0f565b029250670de0b6b3a7640000610b1e8260406020611d0f565b029150509091565b600080610b31610947565b90506060610b3d610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b68919061444c565b60006040518083038186803b158015610b8057600080fd5b505afa158015610b94573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbc9190810190613eb6565b50915050610bd181610bcc610769565b611e9c565b600080610bdc610ae8565b91509150610be8613af8565b6040518060600160405280610bfb610ab7565b81526020018481526020018381525090506000610c87610c4e867f000000000000000000000000000000000000000000000000000000000000000081518110610c4057fe5b602002602001015184611f05565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7a57fe5b6020026020010151611f66565b9050610cb0610ca986600081518110610c9c57fe5b6020026020010151611f72565b8290611f86565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce961061a610fcf565b610cf4610640610947565b6000610cff85611fdd565b15610d2757610d0c61200c565b610d1e88610d1861073a565b8761201f565b94509050610d3f565b610d2f61163a565b610d3a8a8987611d1e565b945090505b610d498a82612115565b835167ffffffffffffffff81118015610d6157600080fd5b50604051908082528060200260200182016040528015610d8b578160200160208202803683370190505b509250505097509795505050505050565b600061071082610ff3565b6000610db1610947565b90506060610dbd610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de8919061444c565b60006040518083038186803b158015610e0057600080fd5b505afa158015610e14573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3c9190810190613eb6565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e8057fe5b602002602001018181525050610e94613b19565b6040518060800160405280610ea8856106fc565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed9610fcf565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f0a9493929190614474565b600060405180830381600087803b158015610f2457600080fd5b505af1158015610f38573d6000803e3d6000fd5b5050505050505050565b600090565b610f4f611a3e565b6109b86001611c28565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8e9291906142d0565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108161061a610fcf565b61108c610640610947565b61109461163a565b61109f85858561211f565b95945050505050565b6110b0611a3e565b6110b8611a87565b6000806110c3610ae8565b915091506110d46109318383611a97565b6110e96110e18585611a97565b61015761162c565b6111147f0000000000000000000000000000000000000000000000000000000000000000858561212c565b50505050565b6000806111273385611306565b90508083106111415761113c33856000611772565b61114e565b61114e3385858403611772565b5060019392505050565b600061070c33848461195e565b6000610900612202565b6008546000906109009060ff61227c565b611188611a3e565b61119061200c565b61119a6000611ccd565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4c9190614429565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121d8c610ff3565b8960405160200161123396959493929190614561565b604051602081830303815290604052805190602001209050611264888261125b878787612283565b886101f86122c2565b610f38888888611772565b6060808861127e61061a610fcf565b611289610640610947565b600061129361163a565b61129b61073a565b6112ed576112aa8a8a87612319565b945090506112c36112b9610f42565b82101560cc61162c565b6112d560006112d0610f42565b6123b1565b6112e8896112e1610f42565b83036123b1565b610d49565b6112f88a8987611d1e565b94509050610d4989826123b1565b6000611310610fcf565b6001600160a01b0316826001600160a01b031614156113325750600019610710565b61133c83836123bb565b9050610710565b6000806000611350610fcf565b6001600160a01b031663b05f8e48611366610947565b306040518363ffffffff1660e01b8152600401611384929190614647565b60806040518083038186803b15801561139c57600080fd5b505afa1580156113b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d491906141af565b5050915091506113e5818301611f72565b9250505090565b60006109006123e6565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061090061183f565b600061142f836115d9565b6060835160010167ffffffffffffffff8111801561144c57600080fd5b50604051908082528060200260200182016040528015611476578160200160208202803683370190505b509050308160008151811061148757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f6578481815181106114bf57fe5b60200260200101518282600101815181106114d657fe5b6001600160a01b03909216602092830291909101909101526001016114aa565b506060835160010167ffffffffffffffff8111801561151457600080fd5b5060405190808252806020026020018201604052801561153e578160200160208202803683370190505b50905060008160008151811061155057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115bf5784818151811061158857fe5b602002602001015182826001018151811061159f57fe5b6001600160a01b0390921660209283029190910190910152600101611573565b506115cc87878484612483565b925050505b949350505050565b806115e38161258c565b5050565b60006115f783831115600161162c565b50900390565b600061160a848484612605565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e3576115e38161264b565b6109b86116456117da565b61019261162c565b60006116696003841080156116625750600383105b606461162c565b6060611673610769565b905061167f8582611e9c565b60008061168a610ae8565b91509150611696613af8565b60405180606001604052806116a9610ab7565b81526020810185905260400183905290506000895160018111156116c957fe5b141561172d576116f089606001518589815181106116e357fe5b6020026020010151612675565b60608a015260006117028a8a84612681565b90506117218186898151811061171457fe5b6020026020010151612748565b955050505050506115d1565b61174189606001518588815181106116e357fe5b60608a015260006117538a8a84612754565b905061172181868a8151811061176557fe5b6020026020010151612809565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cd90859061444c565b60405180910390a3505050565b60006117e461181b565b42118061090057505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006118496113f6565b6001600160a01b03166307a2d13a7f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401611894919061444c565b60206040518083038186803b1580156118ac57600080fd5b505afa9250505080156118dc575060408051601f3d908101601f191682019092526118d991810190613fa2565b60015b61191f573d80801561190a576040519150601f19603f3d011682016040523d82523d6000602084013e61190f565b606091505b5061191981612815565b506106fc565b90506106fc565b600082820261194a84158061194357508385838161194057fe5b04145b600361162c565b670de0b6b3a7640000815b04949350505050565b6119756001600160a01b038416151561019861162c565b61198c6001600160a01b038316151561019961162c565b611997838383610942565b6001600160a01b0383166000908152602081905260409020546119bd90826101a061289c565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119ec9082611c16565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cd90859061444c565b6000611a6d6000357fffffffff0000000000000000000000000000000000000000000000000000000016610f59565b9050611a84611a7c82336128b2565b61019161162c565b50565b6109b8611a92610fcf565b61299b565b6000806000611aa4610fcf565b6001600160a01b031663b05f8e48611aba610947565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611af8929190614647565b60806040518083038186803b158015611b1057600080fd5b505afa158015611b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4891906141af565b5050915091506000611b84828401611b7f7f0000000000000000000000000000000000000000000000000000000000000000612a4d565b612675565b905085811015801561065e57509390931115949350505050565b611bb164e8d4a5100082101560cb61162c565b611bc767016345785d8a000082111560ca61162c565b600854611bd8908260c0603f6115fd565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611c0b90839061444c565b60405180910390a150565b60008282016108e6848210158361162c565b8015611c4857611c43611c396117f7565b421061019361162c565b611c5d565b611c5d611c5361181b565b42106101a961162c565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611c0b908390614429565b6109b8611cc461116f565b156101b561162c565b600854611cdc908260ff612b27565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611c0b908390614429565b6001901b6000190191901c1690565b60006060611d2d6103e661264b565b935093915050565b333014611e24576000306001600160a01b0316600036604051611d59929190614300565b6000604051808303816000865af19150503d8060008114611d96576040519150601f19603f3d011682016040523d82523d6000602084013e611d9b565b606091505b505090508060008114611daa57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611e06573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611e378686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611eab908290612b36565b60005b8181101561111457611ee6848281518110611ec557fe5b6020026020010151848381518110611ed957fe5b6020026020010151611926565b848281518110611ef257fe5b6020908102919091010152600101611eae565b60008160200151831015611f3e5781516020830151600091611f2a9186900390611926565b9050611f3684826115e7565b915050610710565b81604001518311611f50575081610710565b81516040830151600091611f2a91860390611926565b60006108e68383611c16565b600061071082611f8061073a565b906115e7565b6000611f95821515600461162c565b670de0b6b3a76400008302611fc7841580611fc05750670de0b6b3a7640000858381611fbd57fe5b04145b600561162c565b6001836001830304018115150291505092915050565b6000808251118015610710575060ff80168280602001905181019061200291906141ef565b60ff161492915050565b6109b861201761116f565b6101b661162c565b60006060600061202e84612b43565b90506060865167ffffffffffffffff8111801561204a57600080fd5b50604051908082528060200260200182016040528015612074578160200160208202803683370190505b5090506000612081610f42565b90506000612094898381518110610c9c57fe5b905060006120a28583612b59565b905060005b8a5181101561210457838114156120bf5760006120e5565b6120e5828c83815181106120cf57fe5b602002602001015161192690919063ffffffff16565b8582815181106120f157fe5b60209081029190910101526001016120a7565b509399929850919650505050505050565b6115e38282612b99565b60006108e66103e661264b565b61213b8183111561014c61162c565b6121566b0de0b6b39983494c589c000082111561014d61162c565b61216e670de0b6b3a7640000825b061561016161162c565b612180670de0b6b3a764000083612164565b6121b5670de0b6b3a76400008204604060206121ad670de0b6b3a7640000876008549190046020806115fd565b9291906115fd565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121f590859085906146bc565b60405180910390a2505050565b600061220c610fcf565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561224457600080fd5b505afa158015612258573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610900919061409d565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b60006122cd85612c65565b90506122e36122dd878387612c81565b8361162c565b6122f2428410156101b861162c565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606123346001600160a01b038616301461015661162c565b61234b6001600160a01b038516301461015661162c565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff8160008151811061239a57fe5b602090810291909101015290969095509350505050565b6115e38282612d30565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612453612dc3565b3060405160200161246895949392919061461b565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016124b2919061467c565b602060405180830381600087803b1580156124cc57600080fd5b505af11580156124e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125049190613fa2565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d29061255090849088908890600401614595565b600060405180830381600087803b15801561256a57600080fd5b505af115801561257e573d6000803e3d6000fd5b509298975050505050505050565b60028151101561259b57611a84565b6000816000815181106125aa57fe5b602002602001015190506000600190505b82518110156109425760008382815181106125d257fe5b602002602001015190506125fb816001600160a01b0316846001600160a01b031610606561162c565b91506001016125bb565b6126146101008310606461162c565b61263c60018210158015611662575061263260ff8461010003611620565b821115606461162c565b61094283821c156101b461162c565b611a84817f42414c0000000000000000000000000000000000000000000000000000000000612dc7565b60006108e68383611926565b60208301516000906001600160a01b03163014156126ab576126a4848484612e42565b90506108e6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b031614156126f4576126a4848484612f9a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b0316141561273d576126a48484846130d7565b6108e661013561264b565b60006108e68383612b59565b60408301516000906001600160a01b0316301415612777576126a484848461320f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127c0576126a484848461335f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b0316141561273d576126a4848484613497565b60006108e68383611f86565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417612890578160208401fd5b506115e361016561264b565b60006128ab848411158361162c565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128d1610fab565b6001600160a01b0316141580156128ec57506128ec836135cf565b15612914576128f9610fab565b6001600160a01b0316336001600160a01b0316149050610710565b61291c612202565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161294b93929190614455565b60206040518083038186803b15801561296357600080fd5b505afa158015612977573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133c9190613f82565b604080516000808252602082019092526060916129ce565b6129bb613b43565b8152602001906001900390816129b35790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e8490612a1790849060040161435a565b600060405180830381600087803b158015612a3157600080fd5b505af1158015612a45573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612ab057507f0000000000000000000000000000000000000000000000000000000000000000610cd5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612afc57612af56107f261183f565b9050610cd5565b6001600160a01b038216301415612b1c5750670de0b6b3a7640000610cd5565b610cd561013561264b565b6001811b1992909216911b1790565b6115e3818314606761162c565b6000818060200190518101906108e6919061420b565b6000612b68821515600461162c565b670de0b6b3a76400008302612b90841580611fc05750670de0b6b3a7640000858381611fbd57fe5b82818161195557fe5b612bb06001600160a01b038316151561019b61162c565b612bbc82600083610942565b6001600160a01b038216600090815260208190526040902054612be290826101b261289c565b6001600160a01b038316600090815260208190526040902055612c15612c1082612c0a61073a565b90613633565b613641565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c59919061444c565b60405180910390a35050565b6000612c6f6123e6565b82604051602001610f8e929190614310565b6000612c9382516041146101b961162c565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612ccc90899085908890889061465e565b6020604051602081039080840390855afa158015612cee573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612d245750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612d3c60008383610942565b612d51612c1082612d4b61073a565b90611c16565b6001600160a01b038216600090815260208190526040902054612d749082611c16565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c5990859061444c565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612ec87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162c565b6115d18460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612efc57fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f3057fe5b6020026020010151612f4887600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612f8e57613646612f92565b6136a45b63ffffffff16565b6000612ff67f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec0575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b031630146130515761304c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061303e57fe5b60200260200101518461370d565b6115d1565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061308557fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130b957fe5b60200260200101516130d187600081518110610c9c57fe5b8661373d565b60006131337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612ec0575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b031630146131895761304c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061317b57fe5b6020026020010151846137a3565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131bd57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106131f157fe5b602002602001015161320987600081518110610c9c57fe5b866137e3565b60006132947f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162c565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132c857fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106132fc57fe5b602002602001015161331487600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461335a5761384a612f92565b6138a1565b60006133bb7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec0575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b031630146134115761304c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061340357fe5b60200260200101518461390b565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061344557fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061347957fe5b602002602001015161349187600081518110610c9c57fe5b86613935565b60006134f37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612ec0575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b031630146135495761304c8460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061353b57fe5b602002602001015184613984565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061357d57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106135b157fe5b60200260200101516135c987600081518110610c9c57fe5b866139b9565b60006135fa7f9f11080e00000000000000000000000000000000000000000000000000000000610f59565b821480610710575061362b7f38e9922e00000000000000000000000000000000000000000000000000000000610f59565b909114919050565b60006108e68383600161289c565b600255565b6000806136538684611f05565b905060006136618287611f66565b9050600061366f868a6115e7565b9050600061368a84611f806136848587613a0d565b8a613a27565b905061369688826115e7565b9a9950505050505050505050565b6000806136b18684611f05565b905060006136bf8287611f66565b905060006136d66136d0838b613a0d565b87613a48565b905060006136e484836115e7565b905060006136f28288613a68565b90506136fe8a826115e7565b9b9a5050505050505050505050565b60008061371a8484611f05565b9050600061373161372b8688611c16565b85611f05565b905061065e81836115e7565b6000826137555761374e8683611f05565b905061109f565b60006137618684611f05565b9050600061377261372b888a611c16565b9050600061378082846115e7565b9050600061378e8489611f66565b905061369661379d8884613a0d565b82613a48565b6000806137b08484611f05565b905060006137be82876115e7565b905060006137cc8286613a68565b90506137d886826115e7565b979650505050505050565b6000826137f157508461109f565b60006137fd8684611f05565b9050600061380b8287611f66565b90506000613819878a611c16565b905060006138278483611f66565b9050600061383e6138388984613a0d565b85613a48565b90506136fe81896115e7565b60008261385857508461109f565b60006138648684611f05565b905060006138728287611f66565b90506000613880868a611c16565b9050600061389584611f806136848587613a0d565b905061369681896115e7565b6000826138b25761374e8683613a68565b60006138be8684611f05565b905060006138cc8287611f66565b905060006138e36138dd838b613a0d565b87613a27565b905060006138f18483611c16565b905060006138ff8288613a68565b90506136fe818b6115e7565b6000806139188484611f05565b9050600061392961372b86886115e7565b905061065e82826115e7565b6000806139428684611f05565b9050600061395361372b888a6115e7565b9050600061396183836115e7565b9050600061396f8489611f66565b905061369661397e8884613a0d565b82613a27565b6000806139918484611f05565b9050600061399f8287611c16565b905060006139ad8286613a68565b90506137d881876115e7565b6000806139c68684611f05565b905060006139d48287611f66565b905060006139e2878a6115e7565b905060006139f08483611f66565b90506000613a016138388984613a0d565b90506136fe88826115e7565b60008282026108e684158061194357508385838161194057fe5b6000613a36821515600461162c565b50811515600019909201046001010290565b6000613a57821515600461162c565b818381613a6057fe5b049392505050565b60008160200151831015613ab157815161133c90613a8f90670de0b6b3a764000090611c16565b60208401518451613aab91613aa49190611926565b8690611c16565b90612b59565b81604001518311613ac3575081610710565b815161133c90613adc90670de0b6b3a7640000906115e7565b60408401518451613aab91613af19190611926565b86906115e7565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b80356107108161472b565b600082601f830112613b8e578081fd5b8135613ba1613b9c826146ff565b6146d8565b818152915060208083019084810181840286018201871015613bc257600080fd5b60005b84811015613be157813584529282019290820190600101613bc5565b505050505092915050565b600082601f830112613bfc578081fd5b8151613c0a613b9c826146ff565b818152915060208083019084810181840286018201871015613c2b57600080fd5b60005b84811015613be157815184529282019290820190600101613c2e565b600082601f830112613c5a578081fd5b813567ffffffffffffffff811115613c70578182fd5b613c836020601f19601f840116016146d8565b9150808252836020828501011115613c9a57600080fd5b8060208401602084013760009082016020015292915050565b80356002811061071057600080fd5b6000610120808385031215613cd5578182fd5b613cde816146d8565b915050613ceb8383613cb3565b8152613cfa8360208401613b73565b6020820152613d0c8360408401613b73565b6040820152606082013560608201526080820135608082015260a082013560a0820152613d3c8360c08401613b73565b60c0820152613d4e8360e08401613b73565b60e08201526101008083013567ffffffffffffffff811115613d6f57600080fd5b613d7b85828601613c4a565b82840152505092915050565b600060208284031215613d98578081fd5b81356108e68161472b565b60008060408385031215613db5578081fd5b8235613dc08161472b565b91506020830135613dd08161472b565b809150509250929050565b600080600060608486031215613def578081fd5b8335613dfa8161472b565b92506020840135613e0a8161472b565b929592945050506040919091013590565b600080600080600080600060e0888a031215613e35578283fd5b8735613e408161472b565b96506020880135613e508161472b565b955060408801359450606088013593506080880135613e6e81614740565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613e9d578182fd5b8235613ea88161472b565b946020939093013593505050565b600080600060608486031215613eca578081fd5b835167ffffffffffffffff80821115613ee1578283fd5b818601915086601f830112613ef4578283fd5b8151613f02613b9c826146ff565b80828252602080830192508086018b828387028901011115613f22578788fd5b8796505b84871015613f4d578051613f398161472b565b845260019690960195928101928101613f26565b508901519097509350505080821115613f64578283fd5b50613f7186828701613bec565b925050604084015190509250925092565b600060208284031215613f93578081fd5b815180151581146108e6578182fd5b600060208284031215613fb3578081fd5b5051919050565b600080600080600080600060e0888a031215613fd4578081fd5b873596506020880135613fe68161472b565b95506040880135613ff68161472b565b9450606088013567ffffffffffffffff80821115614012578283fd5b61401e8b838c01613b7e565b955060808a0135945060a08a0135935060c08a0135915080821115614041578283fd5b5061404e8a828b01613c4a565b91505092959891949750929550565b60006020828403121561406e578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e6578182fd5b6000602082840312156140ae578081fd5b81516108e68161472b565b600080600080608085870312156140ce578182fd5b843567ffffffffffffffff808211156140e5578384fd5b6140f188838901613cc2565b95506020870135915080821115614106578384fd5b5061411387828801613b7e565b949794965050505060408301359260600135919050565b60008060006060848603121561413e578081fd5b833567ffffffffffffffff811115614154578182fd5b61416086828701613cc2565b9660208601359650604090950135949350505050565b600060208284031215614187578081fd5b5035919050565b600080604083850312156141a0578182fd5b50508035926020909101359150565b600080600080608085870312156141c4578182fd5b84519350602085015192506040850151915060608501516141e48161472b565b939692955090935050565b600060208284031215614200578081fd5b81516108e681614740565b6000806040838503121561421d578182fd5b825161422881614740565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b8381101561427457815187529582019590820190600101614258565b509495945050505050565b15159052565b60008151808452815b818110156142aa5760208185018101518683018201520161428e565b818111156142bb5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b828110156143e457815180516004811061438d57fe5b85528087015161439f88870182614238565b5085810151868601526060808201516143ba82880182614238565b5050608090810151906143cf86820183614238565b505060a0939093019290850190600101614377565b5091979650505050505050565b6000602082526108e66020830184614245565b6000604082526144176040830185614245565b828103602084015261109f8185614245565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156144e5576144cf845161471f565b82529284019260019290920191908401906144bd565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a08701526145238185614245565b935050506040850151818584030160c08601526145408382614285565b92505050606084015161455660e085018261427f565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b818110156145dd576145cb855161471f565b835293830193918301916001016145b9565b505084810360408601528551808252908201925081860190845b8181101561257e57614609835161471f565b855293830193918301916001016145f7565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016003831061468a57fe5b91905290565b6000602082526108e66020830184614285565b6000838252604060208301526115d16040830184614245565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156146f757600080fd5b604052919050565b600067ffffffffffffffff821115614715578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114611a8457600080fd5b60ff81168114611a8457600080fdfea2646970667358221220376410f3a8ce7d5a72fbb9c4f3a4295cf2158bfcb6dc458d2ac628c0708eade164736f6c63430007010033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c80636634b7531162000099578063851c1bb3116200006f578063851c1bb314620001cd5780638d928af814620001f3578063aaabadc514620001fd578063df8af989146200020757620000ff565b80636634b75314620001935780636c57f5a914620001b9578063739238d614620001c357620000ff565b80632f2770db11620000db5780632f2770db146200015a5780633f819b6f146200016657806354fd4d5014620001705780635ed31282146200017a57620000ff565b8062c194db1462000104578063174481fa14620001265780632da47c401462000140575b600080fd5b6200010e6200021e565b6040516200011d919062001435565b60405180910390f35b620001306200023f565b6040516200011d929190620013ce565b6200014a62000285565b6040516200011d9291906200162e565b620001646200030e565b005b6200010e62000378565b6200010e62000430565b62000184620004b2565b6040516200011d9190620013ad565b620001aa620001a436600462001137565b620004ce565b6040516200011d9190620013f5565b620001aa620004f9565b6200018462000502565b620001e4620001de36600462001178565b62000526565b6040516200011d919062001400565b620001846200057a565b620001846200059e565b6200018462000218366004620011d9565b6200062b565b60606200023a6040518060200160405280600081525062000a52565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200030057807f00000000000000000000000000000000000000000000000000000000000000000392507f0000000000000000000000000000000000000000000000000000000000000000915062000309565b60009250600091505b509091565b6200031862000b2d565b6200032262000b7c565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b820191906000526020600020905b8154815290600101906020018083116200040857829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016200055d9291906200134a565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000620005aa6200057a565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620005f057600080fd5b505afa15801562000605573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023a9190620011ba565b60006200063762000b95565b6004805460018101909155604051606090620006566020820162000fd8565b601f1982820381018352601f90910116604052620006736200057a565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001620006a7929190620013ce565b60408051601f1981840301815290829052620006c792916020016200137a565b60405160208183030381529060405290506000620006ed83838051906020012062000bb0565b9050600080620006fc62000285565b915091506200070a62000fe6565b620007146200057a565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508e81602001819052508d81604001819052508c816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508a8160c0018181525050898160e0018181525050828161010001818152505081816101200181815250508881610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506200087262000378565b610160820152604051600090620008a8906200089390849060200162001526565b60405160208183030381529060405262000bc6565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620008f357600080fd5b505af115801562000908573d6000803e3d6000fd5b5050505060006200091c6000898962000c1b565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146200098f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200098690620014b8565b60405180910390fd5b6040518a9073ffffffffffffffffffffffffffffffffffffffff8416907f45dd615d2ed7994f98fec837b2d092af933c6520b8717c3a64317961caa532ea90600090a3509650505050505050620009e562000cf9565b98975050505050505050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000a4c73ffffffffffffffffffffffffffffffffffffffff831615156101ac62000d00565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000b1f81838662000d15565b505050505050505050919050565b600062000b5e6000357fffffffff000000000000000000000000000000000000000000000000000000001662000526565b905062000b7962000b70823362000d73565b61019162000d00565b50565b62000b9362000b8a620004f9565b1560d362000d00565b565b62000ba96002600354141561019062000d00565b6002600355565b600062000bbf83833062000e11565b9392505050565b60008062000bd48362000e52565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790559392505050565b6000808447101562000c5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000986906200144a565b825162000c96576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200098690620014ef565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009869062001481565b949350505050565b6001600355565b8162000d115762000d118162000eed565b5050565b5b6020811062000d37578151835260209283019290910190601f190162000d16565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000d7f6200059e565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000dbd9392919062001409565b60206040518083038186803b15801562000dd657600080fd5b505afa15801562000deb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bbf919062001156565b60008060ff60f81b83868660405160200162000e319493929190620012e6565b60408051808303601f19018152919052805160209091012095945050505050565b600062000e5e62000b7c565b600062000e6b8362000f19565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b62000b79817f42414c000000000000000000000000000000000000000000000000000000000062000f5d565b6000606062000f288362000a52565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811662000bbf573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611de0806200169383390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f830112620010c6578081fd5b813567ffffffffffffffff80821115620010de578283fd5b6040516020601f19601f8501168201018181108382111715620010ff578485fd5b6040528281529250828483016020018610156200111b57600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121562001149578081fd5b813562000bbf816200166f565b60006020828403121562001168578081fd5b8151801515811462000bbf578182fd5b6000602082840312156200118a578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811462000bbf578182fd5b600060208284031215620011cc578081fd5b815162000bbf816200166f565b600080600080600080600080610100898b031215620011f6578384fd5b883567ffffffffffffffff808211156200120e578586fd5b6200121c8c838d01620010b5565b995060208b013591508082111562001232578586fd5b50620012418b828c01620010b5565b975050604089013562001254816200166f565b9550606089013562001266816200166f565b94506080890135935060a0890135925060c089013562001286816200166f565b8092505060e089013590509295985092959890939650565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620012d28160208601602086016200163c565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b600083516200138e8184602088016200163c565b835190830190620013a48183602088016200163c565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000bbf6020830184620012b8565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b6000602082526200153c6020830184516200129e565b60208301516101808060408501526200155a6101a0850183620012b8565b91506040850151601f19808685030160608701526200157a8483620012b8565b9350606087015191506200159260808701836200129e565b60808701519150620015a860a08701836200129e565b60a08701519150620015be60c08701836200129e565b60c087015160e087810191909152870151610100808801919091528701516101208088019190915287015161014080880191909152870151915061016062001609818801846200129e565b870151868503909101838701529050620016248382620012b8565b9695505050505050565b918252602082015260400190565b60005b83811015620016595781810151838201526020016200163f565b8381111562001669576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000b7957600080fdfe6101606040523480156200001257600080fd5b5060405162001de038038062001de0833981016040819052620000359162000462565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000378565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200012591908101906200039e565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000449565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000449565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000378565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000378565b6001600160601b0319606091821b811660e05292811b8316610120521b166101405250620004e0915050565b6000602082840312156200038a578081fd5b81516200039781620004c7565b9392505050565b60006020808385031215620003b1578182fd5b82516001600160401b0380821115620003c8578384fd5b818501915085601f830112620003dc578384fd5b815181811115620003eb578485fd5b8381029150620003fd848301620004a0565b8181528481019084860184860187018a101562000418578788fd5b8795505b838610156200043c5780518352600195909501949186019186016200041c565b5098975050505050505050565b6000602082840312156200045b578081fd5b5051919050565b6000806040838503121562000475578081fd5b82516200048281620004c7565b60208401519092506200049581620004c7565b809150509250929050565b6040518181016001600160401b0381118282101715620004bf57600080fd5b604052919050565b6001600160a01b0381168114620004dd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c61181d620005c36000398061050952806108215250806101335280610c145280610f325280610f945250806103bf52508061046c5280610599528061074852806108ec5280610cbf528061102d52806110ee528061115052508060ea5280610190528061043052806105cc528061063152806106d2528061078452806108b152806110cc52508061016f5280610402528061071a5280610a7d5280610b5c5280610dba5280610e9952508060995280610309525061181d6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611527565b60405180910390f35b6100776100723660046113e5565b6100bb565b60405161005b919061175a565b610077610092366004611401565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc929190611673565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c9190611487565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a9392919061156f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a49190611464565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f5611332565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c9611395565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611697565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610592919061144c565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d4e565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611527565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b6919061144c565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fc9565b9695505050505050565b600061070d611332565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e1611395565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611697565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa919061144c565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fed565b6110b2565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d4e565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a919061150b565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b6919061142c565b6101a2611187565b60006109cd8215156004611187565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b6005611187565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f6113bc565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016115ef565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517fba08765200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ba08765290610cf890849030908190600401611763565b602060405180830381600087803b158015610d1257600080fd5b505af1158015610d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4a919061144c565b5050565b6040805160028082526060828101909352816020015b610d6c6113bc565b815260200190600190039081610d64579050509050600281600081518110610d9057fe5b6020026020010151600001906002811115610da757fe5b90816002811115610db457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de657fe5b602002602001015160200181815250508181600081518110610e0457fe5b602002602001015160600181815250508281600081518110610e2257fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e6f57fe5b6020026020010151600001906002811115610e8657fe5b90816002811115610e9357fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec557fe5b602002602001015160200181815250508181600181518110610ee357fe5b602002602001015160600181815250508281600181518110610f0157fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f579084167f000000000000000000000000000000000000000000000000000000000000000084611195565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016115ef565b610fe88363a9059cbb60e01b848460405160240161027a9291906115c9565b505050565b6040517fb3d7f6b900000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b3d7f6b99061106290859060040161175a565b60206040518083038186803b15801561107a57600080fd5b505afa15801561108e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100c6919061144c565b61111373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611195565b6040517f6e553f6500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636e553f6590610cf89084903090600401611673565b81610d4a57610d4a8161128a565b801580159061124657506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e906111f39030908690600401611548565b60206040518083038186803b15801561120b57600080fd5b505afa15801561121f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611243919061144c565b15155b1561126b5761126b8363095ea7b360e01b84600060405160240161027a9291906115a0565b610fe88363095ea7b360e01b848460405160240161027a9291906115c9565b6112b4817f42414c00000000000000000000000000000000000000000000000000000000006112b7565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6000602082840312156113f6578081fd5b813561011b816117c5565b60008060408385031215611413578081fd5b823561141e816117c5565b946020939093013593505050565b60006020828403121561143d578081fd5b8151801515811461011b578182fd5b60006020828403121561145d578081fd5b5051919050565b60008060408385031215611476578182fd5b505080516020909101519092909150565b6000806000806080858703121561149c578182fd5b84519350602085015192506040850151915060608501516114bc816117c5565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161151d81846020870161178f565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561166657815180516003811061162257fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff1686860152606090810151908501526080909301929085019060010161160c565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a083015260208401516116b2816117bb565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c061014084015280518061016085015261018061171e828287016020860161178f565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b60208301846114c7565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60005b838110156117aa578181015183820152602001611792565b838111156102fc5750506000910152565b600281106112b457fe5b73ffffffffffffffffffffffffffffffffffffffff811681146112b457600080fdfea26469706673582212206599bb96b2654fbeb5e88228085dec13024ea3b0200b38992201ef3d5afda06d64736f6c63430007010033a2646970667358221220fbcc0518f666dfdce8e0b1b9f4750d34dc805e68d46737e82e81396839308c9464736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/index.ts b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/index.ts new file mode 100644 index 0000000..7c64def --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/index.ts @@ -0,0 +1,103 @@ +import { bn } from '@helpers/numbers'; +import { Task, TaskMode, TaskRunOptions } from '@src'; +import { ERC4626LinearPoolDeployment } from './input'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import * as expectEvent from '@helpers/expectEvent'; +import { ethers } from 'hardhat'; +import { getContractDeploymentTransactionHash, saveContractDeploymentTransactionHash } from '@src'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as ERC4626LinearPoolDeployment; + const args = [ + input.Vault, + input.ProtocolFeePercentagesProvider, + input.BalancerQueries, + input.FactoryVersion, + input.PoolVersion, + input.InitialPauseWindowDuration, + input.BufferPeriodDuration, + ]; + + const factory = await task.deployAndVerify('ERC4626LinearPoolFactory', args, from, force); + + if (task.mode === TaskMode.LIVE) { + // We also create a Pool using the factory and verify it, to let us compute their action IDs and so that future + // Pools are automatically verified. We however don't run any of this code in CHECK mode, since we don't care about + // the contracts deployed here. The action IDs will be checked to be correct via a different mechanism. + + // ERC4626LinearPools require an ERC4626 Token + const mockErc4626TokenArgs = ['DO NOT USE - Mock ERC4626 Token', 'TEST', 18, input.WETH]; + // Using MockERC4626Token from 20230409-erc4626-linear-pool-v4 task + const mockErc4626Token = await task.deployAndVerify('MockERC4626Token', mockErc4626TokenArgs, from, force); + + // The assetManager, pauseWindowDuration and bufferPeriodDuration will be filled in later, but we need to declare + // them here to appease the type system. Those are constructor arguments, but automatically provided by the factory. + const mockPoolArgs = { + vault: input.Vault, + name: 'DO NOT USE - Mock Linear Pool', + symbol: 'TEST', + mainToken: input.WETH, + wrappedToken: mockErc4626Token.address, + assetManager: undefined, + upperTarget: 0, + pauseWindowDuration: undefined, + bufferPeriodDuration: undefined, + swapFeePercentage: bn(1e12), + owner: ZERO_ADDRESS, + version: input.PoolVersion, + }; + + // This mimics the logic inside task.deploy + if (force || !task.output({ ensure: false })['MockERC4626LinearPool']) { + const PROTOCOL_ID = 0; + + const poolCreationReceipt = await ( + await factory.create( + mockPoolArgs.name, + mockPoolArgs.symbol, + mockPoolArgs.mainToken, + mockPoolArgs.wrappedToken, + mockPoolArgs.upperTarget, + mockPoolArgs.swapFeePercentage, + mockPoolArgs.owner, + PROTOCOL_ID + ) + ).wait(); + const event = expectEvent.inReceipt(poolCreationReceipt, 'PoolCreated'); + const mockPoolAddress = event.args.pool; + + await saveContractDeploymentTransactionHash(mockPoolAddress, poolCreationReceipt.transactionHash, task.network); + await task.save({ MockERC4626LinearPool: mockPoolAddress }); + } + + const mockPool = await task.instanceAt('ERC4626LinearPool', task.output()['MockERC4626LinearPool']); + + // In order to verify the Pool's code, we need to complete its constructor arguments by computing the factory + // provided arguments (asset manager and pause durations). + + // The asset manager is found by querying the Vault + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, task.network); + const vault = await vaultTask.deployedInstance('Vault'); + + const { assetManager: assetManagerAddress } = await vault.getPoolTokenInfo(await mockPool.getPoolId(), input.WETH); + mockPoolArgs.assetManager = assetManagerAddress; + + // The durations require knowing when the Pool was created, so we look for the timestamp of its creation block. + const txHash = await getContractDeploymentTransactionHash(mockPool.address, task.network); + const tx = await ethers.provider.getTransactionReceipt(txHash); + const poolCreationBlock = await ethers.provider.getBlock(tx.blockNumber); + + // With those and the period end times, we can compute the durations. + const { pauseWindowEndTime, bufferPeriodEndTime } = await mockPool.getPausedState(); + mockPoolArgs.pauseWindowDuration = pauseWindowEndTime.sub(poolCreationBlock.timestamp); + mockPoolArgs.bufferPeriodDuration = bufferPeriodEndTime + .sub(poolCreationBlock.timestamp) + .sub(mockPoolArgs.pauseWindowDuration); + + // We are now ready to verify the Pool + await task.verify('ERC4626LinearPool', mockPool.address, [mockPoolArgs]); + + // We can also verify the Asset Manager + await task.verify('ERC4626LinearPoolRebalancer', assetManagerAddress, [input.Vault, input.BalancerQueries]); + } +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/input.ts b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/input.ts new file mode 100644 index 0000000..55be76b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/input.ts @@ -0,0 +1,31 @@ +import { Task, TaskMode } from '@src'; +import { MONTH } from '@helpers/time'; + +export type ERC4626LinearPoolDeployment = { + Vault: string; + BalancerQueries: string; + ProtocolFeePercentagesProvider: string; + WETH: string; + FactoryVersion: string; + PoolVersion: string; + InitialPauseWindowDuration: number; + BufferPeriodDuration: number; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerQueries = new Task('20220721-balancer-queries', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); +const WETH = new Task('00000000-tokens', TaskMode.READ_ONLY); + +const BaseVersion = { version: 3, deployment: '20230206-erc4626-linear-pool-v3' }; + +export default { + Vault, + BalancerQueries, + ProtocolFeePercentagesProvider, + WETH, + FactoryVersion: JSON.stringify({ name: 'ERC4626LinearPoolFactory', ...BaseVersion }), + PoolVersion: JSON.stringify({ name: 'ERC4626LinearPool', ...BaseVersion }), + InitialPauseWindowDuration: MONTH * 3, + BufferPeriodDuration: MONTH, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/output/arbitrum.json new file mode 100644 index 0000000..e05a84e --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/output/arbitrum.json @@ -0,0 +1,5 @@ +{ + "ERC4626LinearPoolFactory": "0xa3B9515A9c557455BC53F7a535A85219b59e8B2E", + "MockERC4626Token": "0x62aaB12865d7281048c337D53a4dde9d770321E6", + "MockERC4626LinearPool": "0xf984eb2B8a7eF780245a797A2fCcd82f346409ca" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/output/goerli.json new file mode 100644 index 0000000..79a001a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/output/goerli.json @@ -0,0 +1,5 @@ +{ + "ERC4626LinearPoolFactory": "0xBa240C856498e2d7a70AF4911AaFae0D6b565a5B", + "MockERC4626Token": "0xa1C22168262fbaf5a87b9Aa6A13122BE630085E9", + "MockERC4626LinearPool": "0x744644537fB1AE7c4E05f6331e87126b4fd0C325" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/output/mainnet.json new file mode 100644 index 0000000..f983827 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/output/mainnet.json @@ -0,0 +1,5 @@ +{ + "ERC4626LinearPoolFactory": "0x67A25ca2350Ebf4a0C475cA74C257C94a373b828", + "MockERC4626Token": "0xE605Dbe1cA85dCdb8F43CEfA427f3B0fC06f6ba6", + "MockERC4626LinearPool": "0xfeF969638C52899f91781f1Be594aF6f40B99BAd" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/output/optimism.json b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/output/optimism.json new file mode 100644 index 0000000..e05a84e --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/output/optimism.json @@ -0,0 +1,5 @@ +{ + "ERC4626LinearPoolFactory": "0xa3B9515A9c557455BC53F7a535A85219b59e8B2E", + "MockERC4626Token": "0x62aaB12865d7281048c337D53a4dde9d770321E6", + "MockERC4626LinearPool": "0xf984eb2B8a7eF780245a797A2fCcd82f346409ca" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/output/polygon.json new file mode 100644 index 0000000..7cff2f6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/output/polygon.json @@ -0,0 +1,5 @@ +{ + "ERC4626LinearPoolFactory": "0xa3B9515A9c557455BC53F7a535A85219b59e8B2E", + "MockERC4626Token": "0x040dBA12Bb3D5C0A73ddfe84C220Be3ddBA06966", + "MockERC4626LinearPool": "0xf984eb2B8a7eF780245a797A2fCcd82f346409ca" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/readme.md b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/readme.md new file mode 100644 index 0000000..1419b4b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/readme.md @@ -0,0 +1,18 @@ +# 2023-02-06 - ERC4626 Linear Pool V3 + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This deployment was deprecated in favor of a new version which uses create2 for pool deployment: [erc4626-linear-pool-v4](../../20230409-erc4626-linear-pool-v4/). + +Third deployment of the `ERC4626LinearPoolFactory`, for Linear Pools with a ERC4626 yield-bearing token. +Supersedes `20220404-erc4626-linear-pool-v2`, fixing the reentrancy issue described in https://forum.balancer.fi/t/reentrancy-vulnerability-scope-expanded/4345. +Also has a fix in the `ERC4626LinearPoolRebalancer` to handle tokens which require the `SafeERC20` library for approvals. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`ERC4626LinearPoolFactory` artifact](./artifact/ERC4626LinearPoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/test/task.fork.ts new file mode 100644 index 0000000..47db704 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-erc4626-linear-pool-v3/test/task.fork.ts @@ -0,0 +1,460 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { setCode } from '@nomicfoundation/hardhat-network-helpers'; +import * as expectEvent from '@helpers/expectEvent'; +import { bn, fp, FP_ONE } from '@helpers/numbers'; +import { MAX_UINT256 } from '@helpers/constants'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; + +import { impersonate, getForkedNetwork, Task, TaskMode, getSigners } from '@src'; +import { describeForkTest } from '@src'; +import { deploy, instanceAt, getArtifact } from '@src'; +import { actionId } from '@helpers/models/misc/actions'; + +export enum SwapKind { + GivenIn = 0, + GivenOut, +} + +describeForkTest('ERC4626LinearPoolFactory', 'mainnet', 16550500, function () { + let owner: SignerWithAddress, holder: SignerWithAddress, other: SignerWithAddress; + let govMultisig: SignerWithAddress; + let vault: Contract, authorizer: Contract, mainToken: Contract; + let factory: Contract; + let rebalancer: Contract; + + let task: Task; + + const frxEth = '0x5E8422345238F34275888049021821E8E08CAa1f'; + + const WETH = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'; + const erc4626Token = '0xac3e018457b222d93114458476f3e3416abbe38f'; + + const WETH_SCALING = bn(1); // WETH has 18 decimals, so its scaling factor is 1 + const FRXETH_SCALING = bn(1); // frxEth has 18 decimals, so its scaling factor is 1 + + const WETH_HOLDER = '0xF04a5cC80B1E94C69B48f5ee68a08CD2F09A7c3E'; + const FRXETH_HOLDER = '0xa1f8a6807c402e4a15ef4eba36528a3fed24e577'; + + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + + const SWAP_FEE_PERCENTAGE = fp(0.01); // 1% + + // The targets are set using 18 decimals, even if the token has fewer (as is the case for USDC); + const INITIAL_UPPER_TARGET = fp(1e2); + + // The initial midpoint (upper target / 2) must be between the final lower and upper targets + const FINAL_LOWER_TARGET = fp(0.2e2); + const FINAL_UPPER_TARGET = fp(5e2); + + const PROTOCOL_ID = 0; + + enum AttackType { + SET_TARGETS, + SET_SWAP_FEE, + } + + let pool: Contract; + let poolId: string; + + before('run task', async () => { + task = new Task('20230206-erc4626-linear-pool-v3', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('ERC4626LinearPoolFactory'); + }); + + before('load signers', async () => { + [, owner, other] = await getSigners(); + + holder = await impersonate(FRXETH_HOLDER, fp(100)); + govMultisig = await impersonate(GOV_MULTISIG); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + authorizer = await new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance( + 'Authorizer' + ); + + mainToken = await task.instanceAt('IERC20', frxEth); + await mainToken.connect(holder).approve(vault.address, MAX_UINT256); + }); + + enum LinearPoolState { + BALANCED, + MAIN_EXCESS, + MAIN_LACK, + } + + function itRebalancesThePool(expectedState: LinearPoolState) { + it('rebalance the pool', async () => { + const { lowerTarget, upperTarget } = await pool.getTargets(); + + const { cash } = await vault.getPoolTokenInfo(poolId, frxEth); + const scaledCash = cash.mul(FRXETH_SCALING); + + let fees; + if (scaledCash.gt(upperTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_EXCESS); + + const excess = scaledCash.sub(upperTarget); + fees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else if (scaledCash.lt(lowerTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_LACK); + + const lack = lowerTarget.sub(scaledCash); + fees = lack.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else { + expect(expectedState).to.equal(LinearPoolState.BALANCED); + + fees = 0; + } + + const initialRecipientMainBalance = await mainToken.balanceOf(other.address); + if (expectedState != LinearPoolState.BALANCED) { + await rebalancer.connect(holder).rebalance(other.address); + } else { + await rebalancer.connect(holder).rebalanceWithExtraMain(other.address, 5); + } + const finalRecipientMainBalance = await mainToken.balanceOf(other.address); + + if (fees > 0) { + // The recipient of the rebalance call should get the fees that were collected (though there's some rounding + // error in the main-wrapped conversion). + expect(finalRecipientMainBalance.sub(initialRecipientMainBalance)).to.be.almostEqual( + fees.div(FRXETH_SCALING), + 0.00000001 + ); + } else { + // The recipient of the rebalance call will get any extra main tokens that were not utilized. + expect(finalRecipientMainBalance).to.be.almostEqual(initialRecipientMainBalance, 0.00000001); + } + + const mainInfo = await vault.getPoolTokenInfo(poolId, frxEth); + + const expectedMainBalance = lowerTarget.add(upperTarget).div(2); + expect(mainInfo.cash.mul(FRXETH_SCALING)).to.equal(expectedMainBalance); + expect(mainInfo.managed).to.equal(0); + }); + } + + describe('create and check getters', () => { + it('deploy a linear pool', async () => { + const tx = await factory.create( + '', + '', + frxEth, + erc4626Token, + INITIAL_UPPER_TARGET, + SWAP_FEE_PERCENTAGE, + owner.address, + PROTOCOL_ID + ); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await task.instanceAt('ERC4626LinearPool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + const { assetManager } = await vault.getPoolTokenInfo(poolId, frxEth); // We could query for either frxEth or erc4626Token + rebalancer = await task.instanceAt('ERC4626LinearPoolRebalancer', assetManager); + }); + + it('check factory version', async () => { + const expectedFactoryVersion = { + name: 'ERC4626LinearPoolFactory', + version: 3, + deployment: '20230206-erc4626-linear-pool-v3', + }; + + expect(await factory.version()).to.equal(JSON.stringify(expectedFactoryVersion)); + }); + + it('check pool version', async () => { + const expectedPoolVersion = { + name: 'ERC4626LinearPool', + version: 3, + deployment: '20230206-erc4626-linear-pool-v3', + }; + + expect(await pool.version()).to.equal(JSON.stringify(expectedPoolVersion)); + }); + }); + + describe('join, and rebalance', () => { + it('join the pool', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const joinAmount = INITIAL_UPPER_TARGET.mul(2).div(FRXETH_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: frxEth, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert join amount - some fees will be collected as we're going over the upper target. + const excess = joinAmount.mul(FRXETH_SCALING).sub(INITIAL_UPPER_TARGET); + const joinCollectedFees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + + const expectedBPT = joinAmount.mul(FRXETH_SCALING).sub(joinCollectedFees); + expect(await pool.balanceOf(holder.address)).to.equal(expectedBPT); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + + it('set final targets', async () => { + await expect(pool.connect(owner).setTargets(FINAL_LOWER_TARGET, FINAL_UPPER_TARGET)).to.not.be.reverted; + }); + }); + + describe('generate excess of main token and rebalance', () => { + before('approve the rebalancer', async () => { + await mainToken.connect(holder).approve(rebalancer.address, MAX_UINT256); // To send extra main on rebalance + }); + + it('deposit main tokens', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const { upperTarget } = await pool.getTargets(); + const joinAmount = upperTarget.mul(5).div(FRXETH_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: frxEth, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + }); + + describe('generate lack of main token and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to withdraw enough man token to bring the Pool below its lower target, which will let us later + // rebalance. + + const { cash } = await vault.getPoolTokenInfo(poolId, frxEth); + const scaledCash = cash.mul(FRXETH_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(FRXETH_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: frxEth, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_LACK); + }); + + describe('join below upper target and rebalance', () => { + it('deposit main tokens', async () => { + // We're going to join with few tokens, causing the Pool to not reach its upper target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const joinAmount = midpoint.div(100).div(FRXETH_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: frxEth, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('exit above lower target and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to exit with few tokens, causing for the Pool to not reach its lower target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const exitAmount = midpoint.div(100).div(FRXETH_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: frxEth, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalance repeatedly', () => { + itRebalancesThePool(LinearPoolState.BALANCED); + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('read-only reentrancy protection', () => { + let wethPool: Contract; + let wethHolder: SignerWithAddress; + let poolId: string; + let attacker: Contract; + + before('use WETH', async () => { + wethHolder = await impersonate(WETH_HOLDER, fp(100)); + const weth = await instanceAt('IERC20', WETH); + await weth.connect(wethHolder).approve(vault.address, MAX_UINT256); + }); + + before('deploy attacker', async () => { + // Using MockERC4626Token from 20230409-erc4626-linear-pool-v4 task + attacker = await deploy('ReadOnlyReentrancyAttackerLP', [vault.address]); + }); + + before('deploy pool and prepare', async () => { + const tx = await factory.create( + '', + '', + WETH, + erc4626Token, + INITIAL_UPPER_TARGET, + SWAP_FEE_PERCENTAGE, + owner.address, + PROTOCOL_ID + ); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + wethPool = await task.instanceAt('ERC4626LinearPool', event.args.pool); + + poolId = await wethPool.getPoolId(); + + const joinAmount = INITIAL_UPPER_TARGET.div(2).div(WETH_SCALING); + + await vault.connect(wethHolder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: WETH, + assetOut: wethPool.address, + amount: joinAmount, + userData: '0x', + }, + { + sender: wethHolder.address, + recipient: wethHolder.address, + fromInternalBalance: false, + toInternalBalance: false, + }, + 0, + MAX_UINT256 + ); + + await authorizer.connect(govMultisig).grantRole(await actionId(wethPool, 'enableRecoveryMode'), other.address); + + // The functions to attack are permissioned, so the attacker needs permissions before starting. + await authorizer.connect(govMultisig).grantRole(await actionId(wethPool, 'setTargets'), attacker.address); + await authorizer + .connect(govMultisig) + .grantRole(await actionId(wethPool, 'setSwapFeePercentage'), attacker.address); + + await wethPool.connect(other).enableRecoveryMode(); + + const bptBalance = await wethPool.balanceOf(wethHolder.address); + await wethPool.connect(wethHolder).transfer(attacker.address, bptBalance); + }); + + async function performAttack(attackType: AttackType) { + // Any BPT amount works as long as the attacker has the funds. + const attack = attacker.startAttack(wethPool.address, attackType, await wethPool.balanceOf(attacker.address)); + await expect(attack).to.be.revertedWith('BAL#420'); + } + + context('set targets', () => { + it(`performs the set targets attack`, async () => { + await performAttack(AttackType.SET_TARGETS); + }); + }); + + context('set swap fee', () => { + it(`performs the set swap fee attack`, async () => { + await performAttack(AttackType.SET_SWAP_FEE); + }); + }); + }); + + describe('rebalancer query protection', async () => { + it('reverts with a malicious lending pool', async () => { + const { cash } = await vault.getPoolTokenInfo(poolId, frxEth); + const scaledCash = cash.mul(FRXETH_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(FRXETH_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: frxEth, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + + // Using MockERC4626Token from 20230409-erc4626-linear-pool-v4 task + await setCode(erc4626Token, getArtifact('MockERC4626Token').deployedBytecode); + const mockLendingPool = await instanceAt('MockERC4626Token', erc4626Token); + + await mockLendingPool.setRevertType(2); // Type 2 is malicious swap query revert + await expect(rebalancer.rebalance(other.address)).to.be.revertedWith('BAL#357'); // MALICIOUS_QUERY_REVERT + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/artifact/WeightedPool.json b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/artifact/WeightedPool.json new file mode 100644 index 0000000..f14fea3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/artifact/WeightedPool.json @@ -0,0 +1,1164 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "WeightedPool", + "sourceName": "contracts/WeightedPool.sol", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "normalizedWeights", + "type": "uint256[]" + }, + { + "internalType": "contract IRateProvider[]", + "name": "rateProviders", + "type": "address[]" + }, + { + "internalType": "address[]", + "name": "assetManagers", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + } + ], + "internalType": "struct WeightedPool.NewPoolParams", + "name": "params", + "type": "tuple" + }, + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "paused", + "type": "bool" + } + ], + "name": "PausedStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "feeType", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "protocolFeePercentage", + "type": "uint256" + } + ], + "name": "ProtocolFeePercentageCacheUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "RecoveryModeStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + } + ], + "name": "SwapFeePercentageChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DELEGATE_PROTOCOL_SWAP_FEES_SENTINEL", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "enableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getATHRateProduct", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getActualSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getInvariant", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastPostJoinExitInvariant", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getNextNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNormalizedWeights", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPausedState", + "outputs": [ + { + "internalType": "bool", + "name": "paused", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "pauseWindowEndTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodEndTime", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "feeType", + "type": "uint256" + } + ], + "name": "getProtocolFeePercentageCache", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeesCollector", + "outputs": [ + { + "internalType": "contract IProtocolFeesCollector", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolSwapFeeDelegation", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRateProviders", + "outputs": [ + { + "internalType": "contract IRateProvider[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getScalingFactors", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSwapFeePercentage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "inRecoveryMode", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolSwapFeePercentage", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onExitPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolSwapFeePercentage", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onJoinPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IERC20", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IPoolSwapStructs.SwapRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "balanceTokenIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balanceTokenOut", + "type": "uint256" + } + ], + "name": "onSwap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolSwapFeePercentage", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryExit", + "outputs": [ + { + "internalType": "uint256", + "name": "bptIn", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "protocolSwapFeePercentage", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryJoin", + "outputs": [ + { + "internalType": "uint256", + "name": "bptOut", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "bytes", + "name": "poolConfig", + "type": "bytes" + } + ], + "name": "setAssetManagerPoolConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + } + ], + "name": "setSwapFeePercentage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "updateProtocolFeePercentageCache", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6106606040523480156200001257600080fd5b50604051620079863803806200798683398101604081905262000035916200150d565b866040015151876080015186600019898b600001518c602001518d604001518e60a001518f60c001518d8d8d6000898751600214801562000074575081155b6200008157600162000084565b60025b8a8a8a8a8a8a8a8a828289898d85336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000d5929190620011e1565b508051620000eb906004906020840190620011e1565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b1661012052506200016990506276a70083111561019462000c40565b6200017d62278d0082111561019562000c40565b42909101610140819052016101605285516200019f906002111560c862000c40565b620001b9620001ad62000c55565b8751111560c962000c40565b620001cf8662000c5a60201b620014ba1760201c565b620001da8462000c66565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f906200020b908d906004016200177b565b602060405180830381600087803b1580156200022657600080fd5b505af11580156200023b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002619190620014d5565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002969084908b908b90600401620016df565b600060405180830381600087803b158015620002b157600080fd5b505af1158015620002c6573d6000803e3d6000fd5b505050508061018081815250508a6001600160a01b031663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200030d57600080fd5b505afa15801562000322573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003489190620014ee565b6001600160a01b03166101a0816001600160a01b031660601b815250505050505050505050505050505050505050505050506000600019821490508015156101e081151560f81b81525050826001600160a01b03166101c0816001600160a01b031660601b81525050620003c483600262000cfa60201b60201c565b620003d183600362000cfa565b8015620003eb57620003e583600062000cfa565b620004aa565b60405163178b2b9360e21b81526200047f906001600160a01b03851690635e2cae4c906200041f9060009060040162001790565b60206040518083038186803b1580156200043857600080fd5b505afa1580156200044d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004739190620014d5565b83111561025862000c40565b60006000805160206200796683398151915283604051620004a1919062001790565b60405180910390a25b80620004b75781620004ba565b60005b6102005250620004d3915050600883111560c962000c40565b620004eb82825162000ea560201b620014c41760201c565b620004f68162000eb4565b151560f81b61032052805181906000906200050d57fe5b60200260200101516001600160a01b0316610220816001600160a01b031660601b81525050806001815181106200054057fe5b60200260200101516001600160a01b0316610240816001600160a01b031660601b8152505060028211620005765760006200058d565b806002815181106200058457fe5b60200260200101515b60601b6001600160601b0319166102605260038211620005af576000620005c6565b80600381518110620005bd57fe5b60200260200101515b60601b6001600160601b0319166102805260048211620005e8576000620005ff565b80600481518110620005f657fe5b60200260200101515b60601b6001600160601b0319166102a052600582116200062157600062000638565b806005815181106200062f57fe5b60200260200101515b60601b6001600160601b0319166102c052600682116200065a57600062000671565b806006815181106200066857fe5b60200260200101515b60601b6001600160601b0319166102e0526007821162000693576000620006aa565b80600781518110620006a157fe5b60200260200101515b6001600160a01b0316610300816001600160a01b031660601b81525050505060008760400151519050620006ef8189606001515162000ea560201b620014c41760201c565b61034081905281516200070a90600b906020850190620011e1565b506000805b828160ff1610156200077f5760008a606001518260ff16815181106200073157fe5b6020026020010151905062000759662386f26fc1000082101561012e62000c4060201b60201c565b62000773818462000f1060201b620014d11790919060201c565b9250506001016200070f565b5062000798670de0b6b3a7640000821461013462000c40565b8860400151600081518110620007aa57fe5b60200260200101516001600160a01b0316610360816001600160a01b031660601b815250508860400151600181518110620007e157fe5b60200260200101516001600160a01b0316610380816001600160a01b031660601b81525050600282116200081757600062000832565b88604001516002815181106200082957fe5b60200260200101515b60601b6001600160601b0319166103a05260038211620008545760006200086f565b88604001516003815181106200086657fe5b60200260200101515b60601b6001600160601b0319166103c0526004821162000891576000620008ac565b8860400151600481518110620008a357fe5b60200260200101515b60601b6001600160601b0319166103e05260058211620008ce576000620008e9565b8860400151600581518110620008e057fe5b60200260200101515b60601b6001600160601b03191661040052600682116200090b57600062000926565b88604001516006815181106200091d57fe5b60200260200101515b60601b6001600160601b03191661042052600782116200094857600062000963565b88604001516007815181106200095a57fe5b60200260200101515b6001600160a01b0316610440816001600160a01b031660601b81525050620009aa89604001516000815181106200099657fe5b602002602001015162000f2d60201b60201c565b6104605260408901518051620009c7919060019081106200099657fe5b6104805260028211620009dc576000620009f2565b620009f289604001516002815181106200099657fe5b6104a0526003821162000a0757600062000a1d565b62000a1d89604001516003815181106200099657fe5b6104c0526004821162000a3257600062000a48565b62000a4889604001516004815181106200099657fe5b6104e0526005821162000a5d57600062000a73565b62000a7389604001516005815181106200099657fe5b610500526006821162000a8857600062000a9e565b62000a9e89604001516006815181106200099657fe5b610520526007821162000ab357600062000ac9565b62000ac989604001516007815181106200099657fe5b610540526060890151805160009062000ade57fe5b60200260200101516105608181525050886060015160018151811062000b0057fe5b602002602001015161058081815250506002821162000b2157600062000b3c565b886060015160028151811062000b3357fe5b60200260200101515b6105a0526003821162000b5157600062000b6c565b886060015160038151811062000b6357fe5b60200260200101515b6105c0526004821162000b8157600062000b9c565b886060015160048151811062000b9357fe5b60200260200101515b6105e0526005821162000bb157600062000bcc565b886060015160058151811062000bc357fe5b60200260200101515b610600526006821162000be157600062000bfc565b886060015160068151811062000bf357fe5b60200260200101515b610620526007821162000c1157600062000c2c565b886060015160078151811062000c2357fe5b60200260200101515b610640525062001802975050505050505050565b8162000c515762000c518162000ffc565b5050565b600890565b8062000c518162001011565b62000c7f62000c746200109d565b82101560cb62000c40565b62000c9862000c8d620010a6565b82111560ca62000c40565b62000cba8160c0603f600854620010b260201b620014e317909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc9062000cef90839062001790565b60405180910390a150565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c32639062000d2b90859060040162001790565b60206040518083038186803b15801562000d4457600080fd5b505afa15801562000d59573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d7f9190620014d5565b90508162000dc35762000d9d81620010d760201b620015061760201c565b600980546001600160401b0319166001600160401b039290921691909117905562000e77565b600282141562000e195762000de381620010d760201b620015061760201c565b600980546001600160401b03929092166801000000000000000002600160401b600160801b031990921691909117905562000e77565b600382141562000e6a5762000e3981620010d760201b620015061760201c565b600980546001600160401b0392909216600160801b02600160801b600160c01b031990921691909117905562000e77565b62000e776101bb62000ffc565b81600080516020620079668339815191528260405162000e98919062001790565b60405180910390a2505050565b62000c51828214606762000c40565b6000805b825181101562000f055760006001600160a01b031683828151811062000eda57fe5b60200260200101516001600160a01b03161462000efc57600091505062000f0b565b60010162000eb8565b50600190505b919050565b600082820162000f24848210158362000c40565b90505b92915050565b60006001600160a01b03821630141562000f515750670de0b6b3a764000062000f0b565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801562000f8d57600080fd5b505afa15801562000fa2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fc89190620016bc565b60ff169050600062000fe7601283620010f560201b620015231760201c565b600a0a670de0b6b3a764000002949350505050565b6200100e816210905360ea1b6200110d565b50565b60028151101562001022576200100e565b6000816000815181106200103257fe5b602002602001015190506000600190505b8251811015620010985760008382815181106200105c57fe5b602002602001015190506200108d816001600160a01b0316846001600160a01b031610606562000c4060201b60201c565b915060010162001043565b505050565b64e8d4a5100090565b67016345785d8a000090565b6000620010c18484846200116e565b506001901b60001901811b1992909216911b1790565b6000620010f16001600160401b038311156101ba62000c40565b5090565b60006200110783831115600162000c40565b50900390565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6200117f6101008310606462000c40565b620011b860018210158015620011b05750620011ac60ff8461010003620011c960201b620015391760201c565b8211155b606462000c40565b6200109883821c156101b462000c40565b6000818310620011da578162000f24565b5090919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200122457805160ff191683800117855562001254565b8280016001018555821562001254579182015b828111156200125457825182559160200191906001019062001237565b50620010f19291505b80821115620010f157600081556001016200125d565b805162000f2781620017ec565b600082601f83011262001291578081fd5b8151620012a8620012a282620017c0565b62001799565b818152915060208083019084810181840286018201871015620012ca57600080fd5b60005b84811015620012f6578151620012e381620017ec565b84529282019290820190600101620012cd565b505050505092915050565b600082601f83011262001312578081fd5b815162001323620012a282620017c0565b8181529150602080830190848101818402860182018710156200134557600080fd5b60005b84811015620012f65781516200135e81620017ec565b8452928201929082019060010162001348565b600082601f83011262001382578081fd5b815162001393620012a282620017c0565b818152915060208083019084810181840286018201871015620013b557600080fd5b60005b84811015620012f6578151620013ce81620017ec565b84529282019290820190600101620013b8565b600082601f830112620013f2578081fd5b815162001403620012a282620017c0565b8181529150602080830190848101818402860182018710156200142557600080fd5b60005b84811015620012f65781518452928201929082019060010162001428565b600082601f83011262001457578081fd5b81516001600160401b038111156200146d578182fd5b602062001483601f8301601f1916820162001799565b925081835284818386010111156200149a57600080fd5b60005b82811015620014ba5784810182015184820183015281016200149d565b82811115620014cc5760008284860101525b50505092915050565b600060208284031215620014e7578081fd5b5051919050565b60006020828403121562001500578081fd5b815162000f2481620017ec565b600080600080600080600060e0888a03121562001528578283fd5b87516001600160401b03808211156200153f578485fd5b9089019060e0828c03121562001553578485fd5b6200155f60e062001799565b8251828111156200156e578687fd5b6200157c8d82860162001446565b82525060208301518281111562001591578687fd5b6200159f8d82860162001446565b602083015250604083015182811115620015b7578687fd5b620015c58d82860162001301565b604083015250606083015182811115620015dd578687fd5b620015eb8d828601620013e1565b60608301525060808301518281111562001603578687fd5b620016118d82860162001371565b60808301525060a08301518281111562001629578687fd5b620016378d82860162001280565b60a08301525060c083810151908201529850620016588b60208c0162001273565b9750620016698b60408c0162001273565b965060608a0151955060808a01519450620016888b60a08c0162001273565b935060c08a01519150808211156200169e578283fd5b50620016ad8a828b0162001446565b91505092959891949750929550565b600060208284031215620016ce578081fd5b815160ff8116811462000f24578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b818110156200172b57620017188551620017e0565b8352938301939183019160010162001703565b505084810360408601528551808252908201925081860190845b818110156200176d576200175a8351620017e0565b8552938301939183019160010162001745565b509298975050505050505050565b60208101600383106200178a57fe5b91905290565b90815260200190565b6040518181016001600160401b0381118282101715620017b857600080fd5b604052919050565b60006001600160401b03821115620017d6578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146200100e57600080fd5b60805160a05160c05160e0516101005160601c6101205160601c6101405161016051610180516101a05160601c6101c05160601c6101e05160f81c610200516102205160601c6102405160601c6102605160601c6102805160601c6102a05160601c6102c05160601c6102e05160601c6103005160601c6103205160f81c610340516103605160601c6103805160601c6103a05160601c6103c05160601c6103e05160601c6104005160601c6104205160601c6104405160601c61046051610480516104a0516104c0516104e05161050051610520516105405161056051610580516105a0516105c0516105e051610600516106205161064051615ebc62001aaa60003980612270528061357e52508061222d528061351d5250806121ea52806134bc5250806121a7528061345b52508061216452806133fa52508061212152806133995250806120de52806133385250806120a452806132d7525080612b96525080612b72525080612b4e525080612b2a525080612b06525080612ae2525080612abe525080612a9a525080612563528061354352508061252152806134e25250806124df528061348152508061249d528061342052508061245b52806133bf525080612419528061335e5250806123d752806132fd525080612395528061329c5250806119c2525080613837525080610a6b5280613a98525080610a145280613a4c5250806109bd5280613a0052508061096652806139b452508061090f52806139685250806108aa528061390752508061085352806138b65250806108055280613878525080610cdf52508061074f5250806106cf52806106fa5280610725525080611293525080610b6b5250806118075250806117e3525080610fad525080610f89525080610ed75250806128825250806128c45250806128a35250615ebc6000f3fe608060405234801561001057600080fd5b50600436106103205760003560e01c80637ecebe00116101a7578063aaabadc5116100ee578063d505accf11610097578063ddf4627b11610071578063ddf4627b146105ef578063ed24911d146105f7578063f89f27ed146105ff57610320565b8063d505accf146105b6578063d5c096c4146105c9578063dd62ed3e146105dc57610320565b8063b7b814fc116100c8578063b7b814fc1461059e578063c0ff1a15146105a6578063d2946c2b146105ae57610320565b8063aaabadc514610586578063b10962781461058e578063b35056b81461059657610320565b80638d928af8116101505780639d2c110c1161012a5780639d2c110c1461054d578063a457c2d714610560578063a9059cbb1461057357610320565b80638d928af81461052a57806390193b7c1461053257806395d89b411461054557610320565b8063876f303b11610181578063876f303b146104fa57806387ec681714610502578063893d20e81461051557610320565b80637ecebe00146104cc5780638456cb59146104df578063851c1bb3146104e757610320565b806338e9922e1161026b57806354fd4d501161021457806370464016116101ee578063704640161461048557806370a082311461049857806374f3b009146104ab57610320565b806354fd4d501461045457806355c676281461045c5780636028bfd41461046457610320565b80633f4ba83a116102455780633f4ba83a1461043157806350dd6ed91461043957806354a844ba1461044c57610320565b806338e9922e1461040357806338fff2d014610416578063395093511461041e57610320565b80631dd746ea116102cd57806323ef89ed116102a757806323ef89ed146103de578063313ce567146103e65780633644e515146103fb57610320565b80631dd746ea146103a1578063238a2d59146103b657806323b872dd146103cb57610320565b806315b0015b116102fe57806315b0015b1461036d57806318160ddd146103755780631c0de0511461038a57610320565b806306fdde0314610325578063095ea7b3146103435780630da0669c14610363575b600080fd5b61032d610607565b60405161033a9190615de1565b60405180910390f35b610356610351366004615511565b61069e565b60405161033a9190615ce8565b61036b6106b5565b005b61035661074d565b61037d610771565b60405161033a9190615d0b565b610392610777565b60405161033a93929190615cf3565b6103a96107a0565b60405161033a9190615cb0565b6103be6107af565b60405161033a9190615bcc565b6103566103d9366004615461565b610abe565b61037d610b34565b6103ee610b3a565b60405161033a9190615e0d565b61037d610b43565b61036b610411366004615a2a565b610b4d565b61037d610b69565b61035661042c366004615511565b610b8d565b61036b610bc8565b61036b610447366004615769565b610bda565b61036b610bf8565b61032d610c0a565b61037d610c6b565b610477610472366004615628565b610c7e565b60405161033a929190615df4565b61037d610493366004615a2a565b610cb5565b61037d6104a636600461540d565b610d73565b6104be6104b9366004615628565b610d8e565b60405161033a929190615cc3565b61037d6104da36600461540d565b610eb6565b61036b610ec1565b61037d6104f5366004615725565b610ed3565b61037d610f25565b610477610510366004615628565b610f61565b61051d610f87565b60405161033a9190615bb8565b61051d610fab565b61037d61054036600461540d565b610fcf565b61032d610fea565b61037d61055b36600461592e565b61104b565b61035661056e366004615511565b611144565b610356610581366004615511565b611182565b61051d61118f565b61037d611199565b6103566111b1565b61036b6111c2565b61037d6111d4565b61051d611291565b61036b6105c43660046154a1565b6112b5565b6104be6105d7366004615628565b611340565b61037d6105ea366004615429565b611463565b61037d6114a0565b61037d6114a6565b6103a96114b0565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106935780601f1061066857610100808354040283529160200191610693565b820191906000526020600020905b81548152906001019060200180831161067657829003601f168201915b505050505090505b90565b60006106ab33848461154f565b5060015b92915050565b6106bd6115b7565b6106c561074d565b156106f5576106f57f00000000000000000000000000000000000000000000000000000000000000006000611620565b6107207f00000000000000000000000000000000000000000000000000000000000000006002611620565b61074b7f00000000000000000000000000000000000000000000000000000000000000006003611620565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b60008060006107846117c4565b15925061078f6117e1565b9150610799611805565b9050909192565b60606107aa611829565b905090565b606060006107bb6119c0565b905060608167ffffffffffffffff811180156107d657600080fd5b50604051908082528060200260200182016040528015610800578160200160208202803683370190505b5090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061083157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061087f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060028211156108fb577f0000000000000000000000000000000000000000000000000000000000000000816002815181106108d657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610904565b915061069b9050565b60038211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160038151811061093b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060048211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160048151811061099257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060058211156108fb577f0000000000000000000000000000000000000000000000000000000000000000816005815181106109e957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060068211156108fb577f000000000000000000000000000000000000000000000000000000000000000081600681518110610a4057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060078211156108fb577f000000000000000000000000000000000000000000000000000000000000000081600781518110610a9757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b91505090565b600080610acb8533611463565b9050610aef336001600160a01b0387161480610ae75750838210155b61019e6119e4565b610afa8585856119f2565b336001600160a01b03861614801590610b1557506000198114155b15610b2757610b27853385840361154f565b60019150505b9392505050565b600a5490565b60055460ff1690565b60006107aa6114a6565b610b55611ad2565b610b5d611b00565b610b6681611b13565b50565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106ab918590610bc390866114d1565b61154f565b610bd0611ad2565b61074b6000611b8c565b610be2611ad2565b610bea611b00565b610bf48282611bff565b5050565b610c00611ad2565b61074b6001611cf4565b600b8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106935780601f1061066857610100808354040283529160200191610693565b6008546000906107aa9060c0603f611d4b565b60006060610c948651610c8f6119c0565b6114c4565b610ca989898989898989611d5a611dbc611e2b565b97509795505050505050565b6000610cbf6111b1565b15610ccc57506000610d6e565b81610d1857610cd961074d565b610d03577f0000000000000000000000000000000000000000000000000000000000000000610d11565b60095467ffffffffffffffff165b9050610d6e565b6002821415610d40575060095468010000000000000000900467ffffffffffffffff16610d6e565b6003821415610d635750600954600160801b900467ffffffffffffffff16610d6e565b610d6e6101bb611f55565b919050565b6001600160a01b031660009081526020819052604090205490565b60608088610db8610d9d610fab565b6001600160a01b0316336001600160a01b03161460cd6119e4565b610dcd610dc3610b69565b82146101f46119e4565b60606000610dda86611f65565b15610e0257610de7611f94565b610df989610df3610771565b88611fa7565b92509050610e54565b610e0a611fd3565b6060610e14611829565b9050610e208a82611fdb565b610e448d8d8d8d8d610e306111b1565b610e3a578d610e3d565b60005b878e611d5a565b93509150610e528382611dbc565b505b610e5e8b82612044565b81895167ffffffffffffffff81118015610e7757600080fd5b50604051908082528060200260200182016040528015610ea1578160200160208202803683370190505b509450945050505b5097509795505050505050565b60006106af82610fcf565b610ec9611ad2565b61074b6001611b8c565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f08929190615b75565b604051602081830303815290604052805190602001209050919050565b600080610f30610771565b90506000610f4d610f3f6111d4565b610f4761204e565b8461229c565b509050610f5a82826114d1565b9250505090565b60006060610f728651610c8f6119c0565b610ca9898989898989896122df612328611e2b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106935780601f1061066857610100808354040283529160200191610693565b6000836080015161105d610d9d610fab565b611068610dc3610b69565b611070611fd3565b600061107f8660200151612391565b905060006110908760400151612391565b905061109c86836125ae565b95506110a885826125ae565b94506000875160018111156110b957fe5b1415611105576110cc87606001516125ba565b606088018190526110dd90836125ae565b606088015260006110ef8888886125db565b90506110fb818361260e565b945050505061113c565b6111138760600151826125ae565b6060880152600061112588888861261a565b90506111318184612645565b90506110fb81612651565b509392505050565b6000806111513385611463565b905080831061116b576111663385600061154f565b611178565b611178338585840361154f565b5060019392505050565b60006106ab3384846119f2565b60006107aa61266d565b60006107aa600060c06111aa6126e7565b9190611d4b565b6008546000906107aa9060ff6126ed565b6111ca611ad2565b61074b6000611cf4565b600060606111e0610fab565b6001600160a01b031663f94d46686111f6610b69565b6040518263ffffffff1660e01b81526004016112129190615d0b565b60006040518083038186803b15801561122a57600080fd5b505afa15801561123e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611266919081019061553c565b5091505061127b81611276611829565b611fdb565b606061128561204e565b9050610f5a81836126f7565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886112e48c610fcf565b896040516020016112fa96959493929190615d33565b60405160208183030381529060405280519060200120905061132b8882611322878787612769565b886101f86127a8565b61133688888861154f565b5050505050505050565b6060808861134f610d9d610fab565b61135a610dc3610b69565b611362611fd3565b606061136c611829565b9050611376610771565b611423576000606061138b8d8d8d868b6127ff565b915091506113a461139a612842565b83101560cc6119e4565b6113b660006113b1612842565b612849565b6113c98b6113c2612842565b8403612849565b6113d38184612328565b808a5167ffffffffffffffff811180156113ec57600080fd5b50604051908082528060200260200182016040528015611416578160200160208202803683370190505b5095509550505050610ea9565b61142d8882611fdb565b600060606114558d8d8d8d8d6114416111b1565b61144b578d61144e565b60005b898e6122df565b915091506113c98b83612849565b600061146d610fab565b6001600160a01b0316826001600160a01b0316141561148f57506000196106af565b6114998383612853565b90506106af565b60001981565b60006107aa61287e565b60606107aa61204e565b80610bf48161291b565b610bf481831460676119e4565b6000828201610b2d84821015836119e4565b60006114f0848484612994565b506001901b60001901811b1992909216911b1790565b600061151f67ffffffffffffffff8311156101ba6119e4565b5090565b60006115338383111560016119e4565b50900390565b60008183106115485781610b2d565b5090919050565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906115aa908590615d0b565b60405180910390a3505050565b6115bf6129db565b6115c7611b00565b60006115d16111d4565b90506000806115ef836115e261204e565b6115ea610771565b61229c565b909250905081156116035761160382612a79565b61160c83612a8a565b801561161b5761161b81612a93565b505050565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c32639061164f908590600401615d0b565b60206040518083038186803b15801561166757600080fd5b505afa15801561167b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169f9190615a42565b9050816116d6576116af81611506565b6009805467ffffffffffffffff191667ffffffffffffffff92909216919091179055611787565b6002821415611724576116e881611506565b6009805467ffffffffffffffff9290921668010000000000000000026fffffffffffffffff000000000000000019909216919091179055611787565b600382141561177c5761173681611506565b6009805467ffffffffffffffff92909216600160801b027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff909216919091179055611787565b6117876101bb611f55565b817f6bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a826040516117b79190615d0b565b60405180910390a2505050565b60006117ce611805565b4211806107aa57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b606060006118356119c0565b905060608167ffffffffffffffff8111801561185057600080fd5b5060405190808252806020026020018201604052801561187a578160200160208202803683370190505b509050611885612a98565b8160008151811061189257fe5b6020026020010181815250506118a6612abc565b816001815181106118b357fe5b60200260200101818152505060028211156108fb576118d0612ae0565b816002815181106118dd57fe5b60200260200101818152505060038211156108fb576118fa612b04565b8160038151811061190757fe5b60200260200101818152505060048211156108fb57611924612b28565b8160048151811061193157fe5b60200260200101818152505060058211156108fb5761194e612b4c565b8160058151811061195b57fe5b60200260200101818152505060068211156108fb57611978612b70565b8160068151811061198557fe5b60200260200101818152505060078211156108fb576119a2612b94565b816007815181106119af57fe5b602002602001018181525050610ab8565b7f000000000000000000000000000000000000000000000000000000000000000090565b81610bf457610bf481611f55565b611a096001600160a01b03841615156101986119e4565b611a206001600160a01b03831615156101996119e4565b611a2b83838361161b565b6001600160a01b038316600090815260208190526040902054611a5190826101a0612bb8565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611a8090826114d1565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115aa908590615d0b565b6000611ae96000356001600160e01b031916610ed3565b9050610b66611af88233612bce565b6101916119e4565b61074b611b0b6117c4565b6101926119e4565b611b28611b1e612cb7565b82101560cb6119e4565b611b3d611b33612cc0565b82111560ca6119e4565b600854611b4e908260c0603f6114e3565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611b81908390615d0b565b60405180910390a150565b8015611bac57611ba7611b9d6117e1565b42106101936119e4565b611bc1565b611bc1611bb7611805565b42106101a96119e4565b6007805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611b81908390615ce8565b6000611c09610b69565b90506000611c15610fab565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b8152600401611c42929190615dac565b60806040518083038186803b158015611c5a57600080fd5b505afa158015611c6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c929190615a5a565b604051630639cdb560e21b81529094506001600160a01b03851693506318e736d49250611cc6915085908790600401615d93565b600060405180830381600087803b158015611ce057600080fd5b505af1158015611336573d6000803e3d6000fd5b600854611d03908260ff612ccc565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611d36908390615ce8565b60405180910390a180610b6657610b66612cf3565b6001901b6000190191901c1690565b6000606080611d6761204e565b9050600080611d768a84612d43565b9150915060006060611d8c8e8d878c888d612da9565b9092509050611da8838d838888611da38189611523565b612e3c565b909e909d509b505050505050505050505050565b81518151611dcb9082906114c4565b60005b81811015611e2557611e06848281518110611de557fe5b6020026020010151848381518110611df957fe5b6020026020010151612e66565b848281518110611e1257fe5b6020908102919091010152600101611dce565b50505050565b333014611ee9576000306001600160a01b0316600036604051611e4f929190615b8d565b6000604051808303816000865af19150503d8060008114611e8c576040519150601f19603f3d011682016040523d82523d6000602084013e611e91565b606091505b505090508060008114611ea057fe5b60046000803e6000516001600160e01b0319166343adbafb60e01b8114611ecb573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b611ef1611fd3565b6060611efb611829565b9050611f078782611fdb565b60006060611f1f8c8c8c8c8c8c898d8d63ffffffff16565b91509150611f3181848663ffffffff16565b8051601f1982018390526343adbafb603f1983015260200260231982016044820181fd5b610b66816210905360ea1b612eb7565b60008082511180156106af575060ff801682806020019051810190611f8a9190615a9a565b60ff161492915050565b61074b611f9f6111b1565b6101b66119e4565b600060606000611fb684612f18565b90506060611fc5878784612f2e565b919791965090945050505050565b61074b611b00565b81518151611fea9082906114c4565b60005b81811015611e255761202584828151811061200457fe5b602002602001015184838151811061201857fe5b6020026020010151612fdd565b84828151811061203157fe5b6020908102919091010152600101611fed565b610bf48282613013565b6060600061205a6119c0565b905060608167ffffffffffffffff8111801561207557600080fd5b5060405190808252806020026020018201604052801561209f578160200160208202803683370190505b5090507f0000000000000000000000000000000000000000000000000000000000000000816000815181106120d057fe5b6020026020010181815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061210a57fe5b60200260200101818152505060028211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160028151811061214d57fe5b60200260200101818152505060038211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160038151811061219057fe5b60200260200101818152505060048211156108fb577f0000000000000000000000000000000000000000000000000000000000000000816004815181106121d357fe5b60200260200101818152505060058211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160058151811061221657fe5b60200260200101818152505060068211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160068151811061225957fe5b60200260200101818152505060078211156108fb577f0000000000000000000000000000000000000000000000000000000000000000816007815181106119af57fe5b60008060006122b4866122af6000610cb5565b6130df565b90506000806122c287613105565b915091506122d286838501613175565b9890975095505050505050565b60006060806122ec61204e565b90506000806122fb8a84612d43565b91509150600060606123118e8d878c888d613192565b9092509050611da8838d838888611da381896114d1565b815181516123379082906114c4565b60005b81811015611e255761237284828151811061235157fe5b602002602001015184838151811061236557fe5b602002602001015161320e565b84828151811061237e57fe5b602090810291909101015260010161233a565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156123d557610d11612a98565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561241757610d11612abc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561245957610d11612ae0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561249b57610d11612b04565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156124dd57610d11612b28565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561251f57610d11612b4c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561256157610d11612b70565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156125a357610d11612b94565b610d6e610135611f55565b6000610b2d8383612fdd565b6000806125cf6125c8610c6b565b849061325c565b9050610b2d8382611523565b6000612606836125ee8660200151613298565b846125fc8860400151613298565b88606001516135a2565b949350505050565b6000610b2d8383612e66565b60006126068361262d8660200151613298565b8461263b8860400151613298565b886060015161361d565b6000610b2d838361320e565b60006106af612666612661610c6b565b613693565b839061320e565b6000612677610fab565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156126af57600080fd5b505afa1580156126c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107aa919061574d565b60085490565b1c60019081161490565b670de0b6b3a764000060005b83518110156127595761274f61274885838151811061271e57fe5b602002602001015185848151811061273257fe5b60200260200101516136b990919063ffffffff16565b8390612fdd565b9150600101612703565b506106af600082116101376119e4565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b60006127b38561376a565b90506127c96127c3878387613786565b836119e4565b6127d8428410156101b86119e4565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b6000606061280b613835565b6128275761282761282261281d61204e565b613859565b612a93565b6128348787878787613abc565b915091509550959350505050565b620f424090565b610bf48282613b4c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006128eb613bdf565b30604051602001612900959493929190615d67565b60405160208183030381529060405280519060200120905090565b60028151101561292a57610b66565b60008160008151811061293957fe5b602002602001015190506000600190505b825181101561161b57600083828151811061296157fe5b6020026020010151905061298a816001600160a01b0316846001600160a01b03161060656119e4565b915060010161294a565b6129a3610100831060646119e4565b6129cc600182101580156129c557506129c160ff8461010003611539565b8211155b60646119e4565b61161b83821c156101b46119e4565b60408051600080825260208201909252606091612a0e565b6129fb6152ce565b8152602001906001900390816129f35790505b509050612a19610fab565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b8152600401612a449190615c19565b600060405180830381600087803b158015612a5e57600080fd5b505af1158015612a72573d6000803e3d6000fd5b5050505050565b610b66612a84611291565b82612849565b610b6681613be3565b600a55565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000612bc784841115836119e4565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b612bed610f87565b6001600160a01b031614158015612c085750612c0883613c03565b15612c3057612c15610f87565b6001600160a01b0316336001600160a01b03161490506106af565b612c3861266d565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b8152600401612c6793929190615d14565b60206040518083038186803b158015612c7f57600080fd5b505afa158015612c93573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114999190615608565b64e8d4a5100090565b67016345785d8a000090565b60006001821b1984168284612ce2576000612ce5565b60015b60ff16901b17949350505050565b612cfb6129db565b612d0b612d066111d4565b612a8a565b612d13613835565b61074b576000612d21610b34565b90506000612d3061281d61204e565b905081811115610bf457610bf481612a93565b6000806000612d50610771565b90506000612d5e85876126f7565b9050600080612d6e83888661229c565b90925090508015612d8257612d8281612a93565b8115612d9157612d9182612a79565b612d9b84836114d1565b989297509195505050505050565b600060606000612db884613c35565b90506000816003811115612dc857fe5b1415612de457612dda88888787613c4b565b9250925050612e31565b6001816003811115612df257fe5b1415612e0357612dda888686613d1a565b6002816003811115612e1157fe5b1415612e2457612dda8888888888613d38565b612e2f610150611f55565b505b965096945050505050565b6000612e4c878787878787613d97565b90508015612e5d57612e5d81612a79565b50505050505050565b6000612e7582151560046119e4565b82612e82575060006106af565b670de0b6b3a764000083810290612ea590858381612e9c57fe5b041460056119e4565b828181612eae57fe5b049150506106af565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b600081806020019051810190610b2d9190615ab6565b60606000612f3c8385612e66565b9050845167ffffffffffffffff81118015612f5657600080fd5b50604051908082528060200260200182016040528015612f80578160200160208202803683370190505b50915060005b8551811015612fd457612fb582878381518110612f9f57fe5b6020026020010151612fdd90919063ffffffff16565b838281518110612fc157fe5b6020908102919091010152600101612f86565b50509392505050565b6000828202613001841580612ffa575083858381612ff757fe5b04145b60036119e4565b670de0b6b3a764000090049392505050565b61302a6001600160a01b038316151561019b6119e4565b6130368260008361161b565b6001600160a01b03821660009081526020819052604090205461305c90826101b2612bb8565b6001600160a01b03831660009081526020819052604090205561308f61308a82613084610771565b90613e90565b613e9e565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516130d39190615d0b565b60405180910390a35050565b6000610b2d6130f66130ef611199565b8590612e66565b670de0b6b3a764000084613ea3565b600080613110613835565b1561312057506000905080613170565b600a54600061312e85613859565b905081811161314557600080935093505050613170565b61316a6131528284612e66565b670de0b6b3a76400006131656002610cb5565b613ea3565b93509150505b915091565b6000610b2d6131848484613eea565b61318d84613693565b613f04565b6000606060006131a184613f24565b905060018160048111156131b157fe5b14156131c457612dda8888888888613f3a565b60028160048111156131d257fe5b14156131e457612dda88888787613f8a565b60038160048111156131f257fe5b141561320357612dda888686613fe8565b612e2f610136611f55565b600061321d82151560046119e4565b8261322a575060006106af565b670de0b6b3a76400008381029061324490858381612e9c57fe5b82600182038161325057fe5b046001019150506106af565b6000828202613276841580612ffa575083858381612ff757fe5b806132855760009150506106af565b670de0b6b3a76400006000198201613250565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156132fb57507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561335c57507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156133bd57507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561341e57507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561347f57507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156134e057507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561354157507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156125a357507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b60006135c46135b987670429d069189e0000612fdd565b8311156101306119e4565b60006135d087846114d1565b905060006135de888361320e565b905060006135ec8887612e66565b905060006135fa8383614006565b905061360f61360882613693565b8990612fdd565b9a9950505050505050505050565b600061363f61363485670429d069189e0000612fdd565b8311156101316119e4565b600061365561364e8685611523565b869061320e565b90506000613663858861320e565b905060006136718383614006565b9050600061368782670de0b6b3a7640000611523565b905061360f8a8261325c565b6000670de0b6b3a764000082106136ab5760006106af565b50670de0b6b3a76400000390565b6000670de0b6b3a76400008214156136d25750816106af565b671bc16d674ec800008214156136ec576114998384612fdd565b673782dace9d90000082141561371c5760006137088485612fdd565b90506137148182612fdd565b9150506106af565b6000613728848461408c565b9050600061374261373b8361271061325c565b60016114d1565b905080821015613757576000925050506106af565b6137618282611523565b925050506106af565b600061377461287e565b82604051602001610f08929190615b9d565b600061379882516041146101b96119e4565b60208281015160408085015160608601518251600080825295019283905292939092811a916001906137d1908990859088908890615dc3565b6020604051602081039080840390855afa1580156137f3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906138295750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b8051600090816138df61389c85838561386e57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b6138da866001815181106138ac57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b612fdd565b905060028211156139395761393261392b856002815181106138fd57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b8290612fdd565b9050613942565b9150610d6e9050565b60038211156139395761398c61392b8560038151811061395e57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b90506004821115613939576139d861392b856004815181106139aa57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b9050600582111561393957613a2461392b856005815181106139f657fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b9050600682111561393957613a7061392b85600681518110613a4257fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b90506007821115610b2d5761260661392b85600781518110613a8e57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b600060606000613acb84613f24565b9050613ae66000826004811115613ade57fe5b1460ce6119e4565b6060613af18561422d565b9050613aff815187516114c4565b613b098187611fdb565b6060613b1361204e565b90506000613b2182846126f7565b90506000613b30828551613eea565b9050613b3b82612a8a565b9b929a509198505050505050505050565b613b586000838361161b565b613b6d61308a82613b67610771565b906114d1565b6001600160a01b038216600090815260208190526040902054613b9090826114d1565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906130d3908590615d0b565b4690565b610b66613bfe82600060c0613bf66126e7565b9291906114e3565b614243565b6000613c15631c74c91760e11b610ed3565b8214806106af5750613c2d6350dd6ed960e01b610ed3565b909114919050565b6000818060200190518101906106af91906157b7565b60006060600080613c5b85614258565b91509150613c6d8851821060646119e4565b6000613ca9898381518110613c7e57fe5b6020026020010151898481518110613c9257fe5b6020026020010151858a613ca4610c6b565b61427a565b90506060895167ffffffffffffffff81118015613cc557600080fd5b50604051908082528060200260200182016040528015613cef578160200160208202803683370190505b50905081818481518110613cff57fe5b60209081029190910101529299929850919650505050505050565b600060606000613d2984614330565b90506060611fc5878388614346565b60006060806000613d48856143e2565b91509150613d5882518a516114c4565b613d628288611fdb565b6000613d788a8a858a613d73610c6b565b6143fa565b9050613d888282111560cf6119e4565b99919850909650505050505050565b600082821015815b8751811015613e315781613de257613ddd888281518110613dbc57fe5b6020026020010151888381518110613dd057fe5b6020026020010151613e90565b613e12565b613e12888281518110613df157fe5b6020026020010151888381518110613e0557fe5b60200260200101516114d1565b888281518110613e1e57fe5b6020908102919091010152600101613d9f565b506000613e3e86896126f7565b90506000613e4c6000610cb5565b9050613e5782612a8a565b80613e685760009350505050613e86565b6000613e7f613e77848d612e66565b888885614538565b9450505050505b9695505050505050565b6000610b2d83836001612bb8565b600255565b60008383101580613eb2575081155b15613ebf57506000610b2d565b6000613ecb8486612e66565b670de0b6b3a7640000039050613ee18184612fdd565b95945050505050565b6000828202610b2d841580612ffa575083858381612ff757fe5b6000613f1382151560046119e4565b818381613f1c57fe5b049392505050565b6000818060200190518101906106af9190615878565b60006060806000613f4a8561455b565b91509150613f5a895183516114c4565b613f648288611fdb565b6000613f7a8a8a858a613f75610c6b565b614573565b9050613d888282101560d06119e4565b60006060600080613f9a856146ae565b91509150613fac8851821060646119e4565b6000613ca9898381518110613fbd57fe5b6020026020010151898481518110613fd157fe5b6020026020010151858a613fe3610c6b565b6146c5565b600060606000613ff78461475b565b90506060611fc5878388614771565b6000670de0b6b3a764000082141561401f5750816106af565b671bc16d674ec8000082141561403957611499838461325c565b673782dace9d900000821415614061576000614055848561325c565b9050613714818261325c565b600061406d848461408c565b9050600061408061373b8361271061325c565b905061376182826114d1565b6000816140a25750670de0b6b3a76400006106af565b826140af575060006106af565b6140bf60ff84901c1560066119e4565b826140e5770bce5086492111aea88f4bb1ca6bcf584181ea8059f76532841060076119e4565b826000670c7d713b49da0000831380156141065750670f43fc2c04ee000083125b1561413d57600061411684614803565b9050670de0b6b3a764000080820784020583670de0b6b3a76400008305020191505061414b565b816141478461492a565b0290505b670de0b6b3a76400009005614183680238fd42c5cf03ffff19821280159061417c575068070c1cc73b00c800008213155b60086119e4565b613e8681614cca565b60006001600160a01b0382161561421d5761421883836001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b1580156141da57600080fd5b505afa1580156141ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142129190615a42565b906136b9565b610b2d565b50670de0b6b3a764000092915050565b606081806020019051810190610b2d9190615893565b600854614252908260006150a8565b60085550565b6000808280602001905181019061426f9190615843565b909590945092505050565b6000806142918461428b8188611523565b9061320e565b90506142aa6709b6e64a8ec600008210156101326119e4565b60006142c86142c1670de0b6b3a764000089612e66565b8390614006565b905060006142df6142d883613693565b8a90612fdd565b905060006142f66142ef8a613693565b839061325c565b905060006143048383611523565b905060006143146125c889613693565b905061432082826114d1565b9c9b505050505050505050505050565b600081806020019051810190610b2d9190615817565b606060006143548484612e66565b90506060855167ffffffffffffffff8111801561437057600080fd5b5060405190808252806020026020018201604052801561439a578160200160208202803683370190505b50905060005b86518110156143d8576143b983888381518110612f9f57fe5b8282815181106143c557fe5b60209081029190910101526001016143a0565b5095945050505050565b606060008280602001905181019061426f91906157d2565b60006060845167ffffffffffffffff8111801561441657600080fd5b50604051908082528060200260200182016040528015614440578160200160208202803683370190505b5090506000805b8851811015614505576144a089828151811061445f57fe5b602002602001015161428b89848151811061447657fe5b60200260200101518c858151811061448a57fe5b602002602001015161152390919063ffffffff16565b8382815181106144ac57fe5b6020026020010181815250506144fb6144f48983815181106144ca57fe5b60200260200101518584815181106144de57fe5b602002602001015161325c90919063ffffffff16565b83906114d1565b9150600101614447565b50600061451689898986868a6150d4565b905061452b61452482613693565b879061325c565b9998505050505050505050565b60008061454f866145498688612e66565b85613ea3565b9050613e868482613175565b606060008280602001905181019061426f91906158d6565b60006060845167ffffffffffffffff8111801561458f57600080fd5b506040519080825280602002602001820160405280156145b9578160200160208202803683370190505b5090506000805b88518110156146675761461f8982815181106145d857fe5b60200260200101516146198984815181106145ef57fe5b60200260200101518c858151811061460357fe5b60200260200101516114d190919063ffffffff16565b90612e66565b83828151811061462b57fe5b60200260200101818152505061465d6144f489838151811061464957fe5b6020026020010151858481518110612f9f57fe5b91506001016145c0565b50600061467889898986868a6151e3565b90506000670de0b6b3a7640000821161469257600061360f565b61360f6146a783670de0b6b3a7640000611523565b8890612fdd565b6000808280602001905181019061426f9190615910565b6000806146d68461428b81886114d1565b90506146ef6729a2241af62c00008211156101336119e4565b60006147066142c1670de0b6b3a76400008961320e565b9050600061472661471f83670de0b6b3a7640000611523565b8a9061325c565b905060006147366142ef8a613693565b905060006147448383611523565b9050600061431461475489613693565b849061320e565b600081806020019051810190610b2d91906158f4565b6060600061477f848461320e565b90506060855167ffffffffffffffff8111801561479b57600080fd5b506040519080825280602002602001820160405280156147c5578160200160208202803683370190505b50905060005b86518110156143d8576147e4838883815181106144de57fe5b8282815181106147f057fe5b60209081029190910101526001016147cb565b670de0b6b3a7640000026000806ec097ce7bc90715b34b9f1000000000808401906ec097ce7bc90715b34b9f0fffffffff198501028161483f57fe5b05905060006ec097ce7bc90715b34b9f100000000082800205905081806ec097ce7bc90715b34b9f100000000081840205915060038205016ec097ce7bc90715b34b9f100000000082840205915060058205016ec097ce7bc90715b34b9f100000000082840205915060078205016ec097ce7bc90715b34b9f100000000082840205915060098205016ec097ce7bc90715b34b9f1000000000828402059150600b8205016ec097ce7bc90715b34b9f1000000000828402059150600d8205016ec097ce7bc90715b34b9f1000000000828402059150600f826002919005919091010295945050505050565b6000670de0b6b3a76400008212156149675761495d826ec097ce7bc90715b34b9f10000000008161495757fe5b0561492a565b6000039050610d6e565b60007e1600ef3172e58d2e933ec884fde10064c63b5372d805e203c000000000000083126149b857770195e54c5dd42177f53a27172fa9ec630262827000000000830592506806f05b59d3b2000000015b73011798004d755d3c8bc8e03204cf44619e00000083126149f0576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff00840008312614a38576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a7008312614a73576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf8508312614aaa57693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e28312614ae157690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d038312614b165768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb417461211108312614b4157680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d8312614b76576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f17757889379378312614bab576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b2866038312614bdf576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac8312614c13576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b600068056bc75e2d63100000840168056bc75e2d631000008086030281614c3657fe5b059050600068056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b6000614cf9680238fd42c5cf03ffff198312158015614cf2575068070c1cc73b00c800008313155b60096119e4565b6000821215614d2d57614d0e82600003614cca565b6ec097ce7bc90715b34b9f100000000081614d2557fe5b059050610d6e565b60006806f05b59d3b20000008312614d6d57506806f05b59d3b1ffffff1990910190770195e54c5dd42177f53a27172fa9ec630262827000000000614da3565b6803782dace9d90000008312614d9f57506803782dace9d8ffffff19909101906b1425982cf597cd205cef7380614da3565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac620000008412614df35768ad78ebc5ac61ffffff199093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d6310000008412614e2f576856bc75e2d630ffffff199093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b188000008412614e6957682b5e3af16b187fffff199093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c4000008412614ea3576815af1d78b58c3fffff199093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac62000008412614edc57680ad78ebc5ac61fffff199093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d631000008412614f155768056bc75e2d630fffff199093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b18800008412614f4e576802b5e3af16b187ffff199093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c400008412614f875768015af1d78b58c3ffff199093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116821b90821b198416179392505050565b670de0b6b3a764000060005b87518110156151d85760008582815181106150f757fe5b602002602001015185111561515a57600061512061511487613693565b8b8581518110612f9f57fe5b90506000615134828a868151811061448a57fe5b9050600061514461266688613693565b905061515083826114d1565b9350505050615171565b86828151811061516657fe5b602002602001015190505b600061519a8a848151811061518257fe5b6020026020010151614619848d878151811061448a57fe5b90506151cc6151c58a85815181106151ae57fe5b6020026020010151836136b990919063ffffffff16565b8590612fdd565b935050506001016150e0565b509695505050505050565b670de0b6b3a764000060005b87518110156151d85760008486838151811061520757fe5b6020026020010151111561526e57600061522c61511487670de0b6b3a7640000611523565b90506000615240828a868151811061448a57fe5b9050600061524e828861325c565b905061526461525d8383611523565b84906114d1565b9350505050615285565b86828151811061527a57fe5b602002602001015190505b60006152ae8a848151811061529657fe5b6020026020010151614619848d878151811061460357fe5b90506152c26151c58a85815181106151ae57fe5b935050506001016151ef565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b80356106af81615e62565b600082601f830112615319578081fd5b815161532c61532782615e42565b615e1b565b81815291506020808301908481018184028601820187101561534d57600080fd5b60005b8481101561536c57815184529282019290820190600101615350565b505050505092915050565b600082601f830112615387578081fd5b813567ffffffffffffffff81111561539d578182fd5b6153b0601f8201601f1916602001615e1b565b91508082528360208285010111156153c757600080fd5b8060208401602084013760009082016020015292915050565b8051600481106106af57600080fd5b8051600581106106af57600080fd5b8035600281106106af57600080fd5b60006020828403121561541e578081fd5b8135610b2d81615e62565b6000806040838503121561543b578081fd5b823561544681615e62565b9150602083013561545681615e62565b809150509250929050565b600080600060608486031215615475578081fd5b833561548081615e62565b9250602084013561549081615e62565b929592945050506040919091013590565b600080600080600080600060e0888a0312156154bb578283fd5b87356154c681615e62565b965060208801356154d681615e62565b9550604088013594506060880135935060808801356154f481615e77565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215615523578182fd5b823561552e81615e62565b946020939093013593505050565b600080600060608486031215615550578081fd5b835167ffffffffffffffff80821115615567578283fd5b818601915086601f83011261557a578283fd5b815161558861532782615e42565b80828252602080830192508086018b8283870289010111156155a8578788fd5b8796505b848710156155d35780516155bf81615e62565b8452600196909601959281019281016155ac565b5089015190975093505050808211156155ea578283fd5b506155f786828701615309565b925050604084015190509250925092565b600060208284031215615619578081fd5b81518015158114610b2d578182fd5b600080600080600080600060e0888a031215615642578081fd5b8735965060208089013561565581615e62565b9650604089013561566581615e62565b9550606089013567ffffffffffffffff80821115615681578384fd5b818b0191508b601f830112615694578384fd5b81356156a261532782615e42565b8082825285820191508585018f8788860288010111156156c0578788fd5b8795505b838610156156e25780358352600195909501949186019186016156c4565b509850505060808b0135955060a08b0135945060c08b0135925080831115615708578384fd5b50506157168a828b01615377565b91505092959891949750929550565b600060208284031215615736578081fd5b81356001600160e01b031981168114610b2d578182fd5b60006020828403121561575e578081fd5b8151610b2d81615e62565b6000806040838503121561577b578182fd5b823561578681615e62565b9150602083013567ffffffffffffffff8111156157a1578182fd5b6157ad85828601615377565b9150509250929050565b6000602082840312156157c8578081fd5b610b2d83836153e0565b6000806000606084860312156157e6578081fd5b6157f085856153e0565b9250602084015167ffffffffffffffff81111561580b578182fd5b6155f786828701615309565b60008060408385031215615829578182fd5b61583384846153e0565b9150602083015190509250929050565b600080600060608486031215615857578081fd5b61586185856153e0565b925060208401519150604084015190509250925092565b600060208284031215615889578081fd5b610b2d83836153ef565b600080604083850312156158a5578182fd5b6158af84846153ef565b9150602083015167ffffffffffffffff8111156158ca578182fd5b6157ad85828601615309565b6000806000606084860312156158ea578081fd5b6157f085856153ef565b60008060408385031215615906578182fd5b61583384846153ef565b600080600060608486031215615924578081fd5b61586185856153ef565b600080600060608486031215615942578081fd5b833567ffffffffffffffff80821115615959578283fd5b818601915061012080838903121561596f578384fd5b61597881615e1b565b905061598488846153fe565b815261599388602085016152fe565b60208201526159a588604085016152fe565b6040820152606083013560608201526080830135608082015260a083013560a08201526159d58860c085016152fe565b60c08201526159e78860e085016152fe565b60e082015261010080840135838111156159ff578586fd5b615a0b8a828701615377565b9183019190915250976020870135975060409096013595945050505050565b600060208284031215615a3b578081fd5b5035919050565b600060208284031215615a53578081fd5b5051919050565b60008060008060808587031215615a6f578182fd5b8451935060208501519250604085015191506060850151615a8f81615e62565b939692955090935050565b600060208284031215615aab578081fd5b8151610b2d81615e77565b60008060408385031215615ac8578182fd5b8251615ad381615e77565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015615b1f57815187529582019590820190600101615b03565b509495945050505050565b60008151808452815b81811015615b4f57602081850181015186830182015201615b33565b81811115615b605782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b81811015615c0d5783516001600160a01b031683529284019291840191600101615be8565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015615ca3578151805160048110615c4c57fe5b855280870151615c5e88870182615ae3565b508581015186860152606080820151615c7982880182615ae3565b505060809081015190615c8e86820183615ae3565b505060a0939093019290850190600101615c36565b5091979650505050505050565b600060208252610b2d6020830184615af0565b600060408252615cd66040830185615af0565b8281036020840152613ee18185615af0565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000838252604060208301526126066040830184615b2a565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610b2d6020830184615b2a565b6000838252604060208301526126066040830184615af0565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615e3a57600080fd5b604052919050565b600067ffffffffffffffff821115615e58578081fd5b5060209081020190565b6001600160a01b0381168114610b6657600080fd5b60ff81168114610b6657600080fdfea26469706673582212208e9a1a26b64de4f87bb963cb83363cb8bc872f588f58e43e43715bf71d5b477264736f6c634300070100336bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106103205760003560e01c80637ecebe00116101a7578063aaabadc5116100ee578063d505accf11610097578063ddf4627b11610071578063ddf4627b146105ef578063ed24911d146105f7578063f89f27ed146105ff57610320565b8063d505accf146105b6578063d5c096c4146105c9578063dd62ed3e146105dc57610320565b8063b7b814fc116100c8578063b7b814fc1461059e578063c0ff1a15146105a6578063d2946c2b146105ae57610320565b8063aaabadc514610586578063b10962781461058e578063b35056b81461059657610320565b80638d928af8116101505780639d2c110c1161012a5780639d2c110c1461054d578063a457c2d714610560578063a9059cbb1461057357610320565b80638d928af81461052a57806390193b7c1461053257806395d89b411461054557610320565b8063876f303b11610181578063876f303b146104fa57806387ec681714610502578063893d20e81461051557610320565b80637ecebe00146104cc5780638456cb59146104df578063851c1bb3146104e757610320565b806338e9922e1161026b57806354fd4d501161021457806370464016116101ee578063704640161461048557806370a082311461049857806374f3b009146104ab57610320565b806354fd4d501461045457806355c676281461045c5780636028bfd41461046457610320565b80633f4ba83a116102455780633f4ba83a1461043157806350dd6ed91461043957806354a844ba1461044c57610320565b806338e9922e1461040357806338fff2d014610416578063395093511461041e57610320565b80631dd746ea116102cd57806323ef89ed116102a757806323ef89ed146103de578063313ce567146103e65780633644e515146103fb57610320565b80631dd746ea146103a1578063238a2d59146103b657806323b872dd146103cb57610320565b806315b0015b116102fe57806315b0015b1461036d57806318160ddd146103755780631c0de0511461038a57610320565b806306fdde0314610325578063095ea7b3146103435780630da0669c14610363575b600080fd5b61032d610607565b60405161033a9190615de1565b60405180910390f35b610356610351366004615511565b61069e565b60405161033a9190615ce8565b61036b6106b5565b005b61035661074d565b61037d610771565b60405161033a9190615d0b565b610392610777565b60405161033a93929190615cf3565b6103a96107a0565b60405161033a9190615cb0565b6103be6107af565b60405161033a9190615bcc565b6103566103d9366004615461565b610abe565b61037d610b34565b6103ee610b3a565b60405161033a9190615e0d565b61037d610b43565b61036b610411366004615a2a565b610b4d565b61037d610b69565b61035661042c366004615511565b610b8d565b61036b610bc8565b61036b610447366004615769565b610bda565b61036b610bf8565b61032d610c0a565b61037d610c6b565b610477610472366004615628565b610c7e565b60405161033a929190615df4565b61037d610493366004615a2a565b610cb5565b61037d6104a636600461540d565b610d73565b6104be6104b9366004615628565b610d8e565b60405161033a929190615cc3565b61037d6104da36600461540d565b610eb6565b61036b610ec1565b61037d6104f5366004615725565b610ed3565b61037d610f25565b610477610510366004615628565b610f61565b61051d610f87565b60405161033a9190615bb8565b61051d610fab565b61037d61054036600461540d565b610fcf565b61032d610fea565b61037d61055b36600461592e565b61104b565b61035661056e366004615511565b611144565b610356610581366004615511565b611182565b61051d61118f565b61037d611199565b6103566111b1565b61036b6111c2565b61037d6111d4565b61051d611291565b61036b6105c43660046154a1565b6112b5565b6104be6105d7366004615628565b611340565b61037d6105ea366004615429565b611463565b61037d6114a0565b61037d6114a6565b6103a96114b0565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106935780601f1061066857610100808354040283529160200191610693565b820191906000526020600020905b81548152906001019060200180831161067657829003601f168201915b505050505090505b90565b60006106ab33848461154f565b5060015b92915050565b6106bd6115b7565b6106c561074d565b156106f5576106f57f00000000000000000000000000000000000000000000000000000000000000006000611620565b6107207f00000000000000000000000000000000000000000000000000000000000000006002611620565b61074b7f00000000000000000000000000000000000000000000000000000000000000006003611620565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b60008060006107846117c4565b15925061078f6117e1565b9150610799611805565b9050909192565b60606107aa611829565b905090565b606060006107bb6119c0565b905060608167ffffffffffffffff811180156107d657600080fd5b50604051908082528060200260200182016040528015610800578160200160208202803683370190505b5090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061083157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061087f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060028211156108fb577f0000000000000000000000000000000000000000000000000000000000000000816002815181106108d657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610904565b915061069b9050565b60038211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160038151811061093b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060048211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160048151811061099257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060058211156108fb577f0000000000000000000000000000000000000000000000000000000000000000816005815181106109e957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060068211156108fb577f000000000000000000000000000000000000000000000000000000000000000081600681518110610a4057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060078211156108fb577f000000000000000000000000000000000000000000000000000000000000000081600781518110610a9757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b91505090565b600080610acb8533611463565b9050610aef336001600160a01b0387161480610ae75750838210155b61019e6119e4565b610afa8585856119f2565b336001600160a01b03861614801590610b1557506000198114155b15610b2757610b27853385840361154f565b60019150505b9392505050565b600a5490565b60055460ff1690565b60006107aa6114a6565b610b55611ad2565b610b5d611b00565b610b6681611b13565b50565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106ab918590610bc390866114d1565b61154f565b610bd0611ad2565b61074b6000611b8c565b610be2611ad2565b610bea611b00565b610bf48282611bff565b5050565b610c00611ad2565b61074b6001611cf4565b600b8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106935780601f1061066857610100808354040283529160200191610693565b6008546000906107aa9060c0603f611d4b565b60006060610c948651610c8f6119c0565b6114c4565b610ca989898989898989611d5a611dbc611e2b565b97509795505050505050565b6000610cbf6111b1565b15610ccc57506000610d6e565b81610d1857610cd961074d565b610d03577f0000000000000000000000000000000000000000000000000000000000000000610d11565b60095467ffffffffffffffff165b9050610d6e565b6002821415610d40575060095468010000000000000000900467ffffffffffffffff16610d6e565b6003821415610d635750600954600160801b900467ffffffffffffffff16610d6e565b610d6e6101bb611f55565b919050565b6001600160a01b031660009081526020819052604090205490565b60608088610db8610d9d610fab565b6001600160a01b0316336001600160a01b03161460cd6119e4565b610dcd610dc3610b69565b82146101f46119e4565b60606000610dda86611f65565b15610e0257610de7611f94565b610df989610df3610771565b88611fa7565b92509050610e54565b610e0a611fd3565b6060610e14611829565b9050610e208a82611fdb565b610e448d8d8d8d8d610e306111b1565b610e3a578d610e3d565b60005b878e611d5a565b93509150610e528382611dbc565b505b610e5e8b82612044565b81895167ffffffffffffffff81118015610e7757600080fd5b50604051908082528060200260200182016040528015610ea1578160200160208202803683370190505b509450945050505b5097509795505050505050565b60006106af82610fcf565b610ec9611ad2565b61074b6001611b8c565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f08929190615b75565b604051602081830303815290604052805190602001209050919050565b600080610f30610771565b90506000610f4d610f3f6111d4565b610f4761204e565b8461229c565b509050610f5a82826114d1565b9250505090565b60006060610f728651610c8f6119c0565b610ca9898989898989896122df612328611e2b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106935780601f1061066857610100808354040283529160200191610693565b6000836080015161105d610d9d610fab565b611068610dc3610b69565b611070611fd3565b600061107f8660200151612391565b905060006110908760400151612391565b905061109c86836125ae565b95506110a885826125ae565b94506000875160018111156110b957fe5b1415611105576110cc87606001516125ba565b606088018190526110dd90836125ae565b606088015260006110ef8888886125db565b90506110fb818361260e565b945050505061113c565b6111138760600151826125ae565b6060880152600061112588888861261a565b90506111318184612645565b90506110fb81612651565b509392505050565b6000806111513385611463565b905080831061116b576111663385600061154f565b611178565b611178338585840361154f565b5060019392505050565b60006106ab3384846119f2565b60006107aa61266d565b60006107aa600060c06111aa6126e7565b9190611d4b565b6008546000906107aa9060ff6126ed565b6111ca611ad2565b61074b6000611cf4565b600060606111e0610fab565b6001600160a01b031663f94d46686111f6610b69565b6040518263ffffffff1660e01b81526004016112129190615d0b565b60006040518083038186803b15801561122a57600080fd5b505afa15801561123e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611266919081019061553c565b5091505061127b81611276611829565b611fdb565b606061128561204e565b9050610f5a81836126f7565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886112e48c610fcf565b896040516020016112fa96959493929190615d33565b60405160208183030381529060405280519060200120905061132b8882611322878787612769565b886101f86127a8565b61133688888861154f565b5050505050505050565b6060808861134f610d9d610fab565b61135a610dc3610b69565b611362611fd3565b606061136c611829565b9050611376610771565b611423576000606061138b8d8d8d868b6127ff565b915091506113a461139a612842565b83101560cc6119e4565b6113b660006113b1612842565b612849565b6113c98b6113c2612842565b8403612849565b6113d38184612328565b808a5167ffffffffffffffff811180156113ec57600080fd5b50604051908082528060200260200182016040528015611416578160200160208202803683370190505b5095509550505050610ea9565b61142d8882611fdb565b600060606114558d8d8d8d8d6114416111b1565b61144b578d61144e565b60005b898e6122df565b915091506113c98b83612849565b600061146d610fab565b6001600160a01b0316826001600160a01b0316141561148f57506000196106af565b6114998383612853565b90506106af565b60001981565b60006107aa61287e565b60606107aa61204e565b80610bf48161291b565b610bf481831460676119e4565b6000828201610b2d84821015836119e4565b60006114f0848484612994565b506001901b60001901811b1992909216911b1790565b600061151f67ffffffffffffffff8311156101ba6119e4565b5090565b60006115338383111560016119e4565b50900390565b60008183106115485781610b2d565b5090919050565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906115aa908590615d0b565b60405180910390a3505050565b6115bf6129db565b6115c7611b00565b60006115d16111d4565b90506000806115ef836115e261204e565b6115ea610771565b61229c565b909250905081156116035761160382612a79565b61160c83612a8a565b801561161b5761161b81612a93565b505050565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c32639061164f908590600401615d0b565b60206040518083038186803b15801561166757600080fd5b505afa15801561167b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169f9190615a42565b9050816116d6576116af81611506565b6009805467ffffffffffffffff191667ffffffffffffffff92909216919091179055611787565b6002821415611724576116e881611506565b6009805467ffffffffffffffff9290921668010000000000000000026fffffffffffffffff000000000000000019909216919091179055611787565b600382141561177c5761173681611506565b6009805467ffffffffffffffff92909216600160801b027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff909216919091179055611787565b6117876101bb611f55565b817f6bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a826040516117b79190615d0b565b60405180910390a2505050565b60006117ce611805565b4211806107aa57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b606060006118356119c0565b905060608167ffffffffffffffff8111801561185057600080fd5b5060405190808252806020026020018201604052801561187a578160200160208202803683370190505b509050611885612a98565b8160008151811061189257fe5b6020026020010181815250506118a6612abc565b816001815181106118b357fe5b60200260200101818152505060028211156108fb576118d0612ae0565b816002815181106118dd57fe5b60200260200101818152505060038211156108fb576118fa612b04565b8160038151811061190757fe5b60200260200101818152505060048211156108fb57611924612b28565b8160048151811061193157fe5b60200260200101818152505060058211156108fb5761194e612b4c565b8160058151811061195b57fe5b60200260200101818152505060068211156108fb57611978612b70565b8160068151811061198557fe5b60200260200101818152505060078211156108fb576119a2612b94565b816007815181106119af57fe5b602002602001018181525050610ab8565b7f000000000000000000000000000000000000000000000000000000000000000090565b81610bf457610bf481611f55565b611a096001600160a01b03841615156101986119e4565b611a206001600160a01b03831615156101996119e4565b611a2b83838361161b565b6001600160a01b038316600090815260208190526040902054611a5190826101a0612bb8565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611a8090826114d1565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115aa908590615d0b565b6000611ae96000356001600160e01b031916610ed3565b9050610b66611af88233612bce565b6101916119e4565b61074b611b0b6117c4565b6101926119e4565b611b28611b1e612cb7565b82101560cb6119e4565b611b3d611b33612cc0565b82111560ca6119e4565b600854611b4e908260c0603f6114e3565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611b81908390615d0b565b60405180910390a150565b8015611bac57611ba7611b9d6117e1565b42106101936119e4565b611bc1565b611bc1611bb7611805565b42106101a96119e4565b6007805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611b81908390615ce8565b6000611c09610b69565b90506000611c15610fab565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b8152600401611c42929190615dac565b60806040518083038186803b158015611c5a57600080fd5b505afa158015611c6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c929190615a5a565b604051630639cdb560e21b81529094506001600160a01b03851693506318e736d49250611cc6915085908790600401615d93565b600060405180830381600087803b158015611ce057600080fd5b505af1158015611336573d6000803e3d6000fd5b600854611d03908260ff612ccc565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611d36908390615ce8565b60405180910390a180610b6657610b66612cf3565b6001901b6000190191901c1690565b6000606080611d6761204e565b9050600080611d768a84612d43565b9150915060006060611d8c8e8d878c888d612da9565b9092509050611da8838d838888611da38189611523565b612e3c565b909e909d509b505050505050505050505050565b81518151611dcb9082906114c4565b60005b81811015611e2557611e06848281518110611de557fe5b6020026020010151848381518110611df957fe5b6020026020010151612e66565b848281518110611e1257fe5b6020908102919091010152600101611dce565b50505050565b333014611ee9576000306001600160a01b0316600036604051611e4f929190615b8d565b6000604051808303816000865af19150503d8060008114611e8c576040519150601f19603f3d011682016040523d82523d6000602084013e611e91565b606091505b505090508060008114611ea057fe5b60046000803e6000516001600160e01b0319166343adbafb60e01b8114611ecb573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b611ef1611fd3565b6060611efb611829565b9050611f078782611fdb565b60006060611f1f8c8c8c8c8c8c898d8d63ffffffff16565b91509150611f3181848663ffffffff16565b8051601f1982018390526343adbafb603f1983015260200260231982016044820181fd5b610b66816210905360ea1b612eb7565b60008082511180156106af575060ff801682806020019051810190611f8a9190615a9a565b60ff161492915050565b61074b611f9f6111b1565b6101b66119e4565b600060606000611fb684612f18565b90506060611fc5878784612f2e565b919791965090945050505050565b61074b611b00565b81518151611fea9082906114c4565b60005b81811015611e255761202584828151811061200457fe5b602002602001015184838151811061201857fe5b6020026020010151612fdd565b84828151811061203157fe5b6020908102919091010152600101611fed565b610bf48282613013565b6060600061205a6119c0565b905060608167ffffffffffffffff8111801561207557600080fd5b5060405190808252806020026020018201604052801561209f578160200160208202803683370190505b5090507f0000000000000000000000000000000000000000000000000000000000000000816000815181106120d057fe5b6020026020010181815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061210a57fe5b60200260200101818152505060028211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160028151811061214d57fe5b60200260200101818152505060038211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160038151811061219057fe5b60200260200101818152505060048211156108fb577f0000000000000000000000000000000000000000000000000000000000000000816004815181106121d357fe5b60200260200101818152505060058211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160058151811061221657fe5b60200260200101818152505060068211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160068151811061225957fe5b60200260200101818152505060078211156108fb577f0000000000000000000000000000000000000000000000000000000000000000816007815181106119af57fe5b60008060006122b4866122af6000610cb5565b6130df565b90506000806122c287613105565b915091506122d286838501613175565b9890975095505050505050565b60006060806122ec61204e565b90506000806122fb8a84612d43565b91509150600060606123118e8d878c888d613192565b9092509050611da8838d838888611da381896114d1565b815181516123379082906114c4565b60005b81811015611e255761237284828151811061235157fe5b602002602001015184838151811061236557fe5b602002602001015161320e565b84828151811061237e57fe5b602090810291909101015260010161233a565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156123d557610d11612a98565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561241757610d11612abc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561245957610d11612ae0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561249b57610d11612b04565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156124dd57610d11612b28565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561251f57610d11612b4c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561256157610d11612b70565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156125a357610d11612b94565b610d6e610135611f55565b6000610b2d8383612fdd565b6000806125cf6125c8610c6b565b849061325c565b9050610b2d8382611523565b6000612606836125ee8660200151613298565b846125fc8860400151613298565b88606001516135a2565b949350505050565b6000610b2d8383612e66565b60006126068361262d8660200151613298565b8461263b8860400151613298565b886060015161361d565b6000610b2d838361320e565b60006106af612666612661610c6b565b613693565b839061320e565b6000612677610fab565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156126af57600080fd5b505afa1580156126c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107aa919061574d565b60085490565b1c60019081161490565b670de0b6b3a764000060005b83518110156127595761274f61274885838151811061271e57fe5b602002602001015185848151811061273257fe5b60200260200101516136b990919063ffffffff16565b8390612fdd565b9150600101612703565b506106af600082116101376119e4565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b60006127b38561376a565b90506127c96127c3878387613786565b836119e4565b6127d8428410156101b86119e4565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b6000606061280b613835565b6128275761282761282261281d61204e565b613859565b612a93565b6128348787878787613abc565b915091509550959350505050565b620f424090565b610bf48282613b4c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006128eb613bdf565b30604051602001612900959493929190615d67565b60405160208183030381529060405280519060200120905090565b60028151101561292a57610b66565b60008160008151811061293957fe5b602002602001015190506000600190505b825181101561161b57600083828151811061296157fe5b6020026020010151905061298a816001600160a01b0316846001600160a01b03161060656119e4565b915060010161294a565b6129a3610100831060646119e4565b6129cc600182101580156129c557506129c160ff8461010003611539565b8211155b60646119e4565b61161b83821c156101b46119e4565b60408051600080825260208201909252606091612a0e565b6129fb6152ce565b8152602001906001900390816129f35790505b509050612a19610fab565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b8152600401612a449190615c19565b600060405180830381600087803b158015612a5e57600080fd5b505af1158015612a72573d6000803e3d6000fd5b5050505050565b610b66612a84611291565b82612849565b610b6681613be3565b600a55565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000612bc784841115836119e4565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b612bed610f87565b6001600160a01b031614158015612c085750612c0883613c03565b15612c3057612c15610f87565b6001600160a01b0316336001600160a01b03161490506106af565b612c3861266d565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b8152600401612c6793929190615d14565b60206040518083038186803b158015612c7f57600080fd5b505afa158015612c93573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114999190615608565b64e8d4a5100090565b67016345785d8a000090565b60006001821b1984168284612ce2576000612ce5565b60015b60ff16901b17949350505050565b612cfb6129db565b612d0b612d066111d4565b612a8a565b612d13613835565b61074b576000612d21610b34565b90506000612d3061281d61204e565b905081811115610bf457610bf481612a93565b6000806000612d50610771565b90506000612d5e85876126f7565b9050600080612d6e83888661229c565b90925090508015612d8257612d8281612a93565b8115612d9157612d9182612a79565b612d9b84836114d1565b989297509195505050505050565b600060606000612db884613c35565b90506000816003811115612dc857fe5b1415612de457612dda88888787613c4b565b9250925050612e31565b6001816003811115612df257fe5b1415612e0357612dda888686613d1a565b6002816003811115612e1157fe5b1415612e2457612dda8888888888613d38565b612e2f610150611f55565b505b965096945050505050565b6000612e4c878787878787613d97565b90508015612e5d57612e5d81612a79565b50505050505050565b6000612e7582151560046119e4565b82612e82575060006106af565b670de0b6b3a764000083810290612ea590858381612e9c57fe5b041460056119e4565b828181612eae57fe5b049150506106af565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b600081806020019051810190610b2d9190615ab6565b60606000612f3c8385612e66565b9050845167ffffffffffffffff81118015612f5657600080fd5b50604051908082528060200260200182016040528015612f80578160200160208202803683370190505b50915060005b8551811015612fd457612fb582878381518110612f9f57fe5b6020026020010151612fdd90919063ffffffff16565b838281518110612fc157fe5b6020908102919091010152600101612f86565b50509392505050565b6000828202613001841580612ffa575083858381612ff757fe5b04145b60036119e4565b670de0b6b3a764000090049392505050565b61302a6001600160a01b038316151561019b6119e4565b6130368260008361161b565b6001600160a01b03821660009081526020819052604090205461305c90826101b2612bb8565b6001600160a01b03831660009081526020819052604090205561308f61308a82613084610771565b90613e90565b613e9e565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516130d39190615d0b565b60405180910390a35050565b6000610b2d6130f66130ef611199565b8590612e66565b670de0b6b3a764000084613ea3565b600080613110613835565b1561312057506000905080613170565b600a54600061312e85613859565b905081811161314557600080935093505050613170565b61316a6131528284612e66565b670de0b6b3a76400006131656002610cb5565b613ea3565b93509150505b915091565b6000610b2d6131848484613eea565b61318d84613693565b613f04565b6000606060006131a184613f24565b905060018160048111156131b157fe5b14156131c457612dda8888888888613f3a565b60028160048111156131d257fe5b14156131e457612dda88888787613f8a565b60038160048111156131f257fe5b141561320357612dda888686613fe8565b612e2f610136611f55565b600061321d82151560046119e4565b8261322a575060006106af565b670de0b6b3a76400008381029061324490858381612e9c57fe5b82600182038161325057fe5b046001019150506106af565b6000828202613276841580612ffa575083858381612ff757fe5b806132855760009150506106af565b670de0b6b3a76400006000198201613250565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156132fb57507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561335c57507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156133bd57507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561341e57507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561347f57507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156134e057507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561354157507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156125a357507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b60006135c46135b987670429d069189e0000612fdd565b8311156101306119e4565b60006135d087846114d1565b905060006135de888361320e565b905060006135ec8887612e66565b905060006135fa8383614006565b905061360f61360882613693565b8990612fdd565b9a9950505050505050505050565b600061363f61363485670429d069189e0000612fdd565b8311156101316119e4565b600061365561364e8685611523565b869061320e565b90506000613663858861320e565b905060006136718383614006565b9050600061368782670de0b6b3a7640000611523565b905061360f8a8261325c565b6000670de0b6b3a764000082106136ab5760006106af565b50670de0b6b3a76400000390565b6000670de0b6b3a76400008214156136d25750816106af565b671bc16d674ec800008214156136ec576114998384612fdd565b673782dace9d90000082141561371c5760006137088485612fdd565b90506137148182612fdd565b9150506106af565b6000613728848461408c565b9050600061374261373b8361271061325c565b60016114d1565b905080821015613757576000925050506106af565b6137618282611523565b925050506106af565b600061377461287e565b82604051602001610f08929190615b9d565b600061379882516041146101b96119e4565b60208281015160408085015160608601518251600080825295019283905292939092811a916001906137d1908990859088908890615dc3565b6020604051602081039080840390855afa1580156137f3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906138295750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b8051600090816138df61389c85838561386e57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b6138da866001815181106138ac57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b612fdd565b905060028211156139395761393261392b856002815181106138fd57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b8290612fdd565b9050613942565b9150610d6e9050565b60038211156139395761398c61392b8560038151811061395e57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b90506004821115613939576139d861392b856004815181106139aa57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b9050600582111561393957613a2461392b856005815181106139f657fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b9050600682111561393957613a7061392b85600681518110613a4257fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b90506007821115610b2d5761260661392b85600781518110613a8e57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b600060606000613acb84613f24565b9050613ae66000826004811115613ade57fe5b1460ce6119e4565b6060613af18561422d565b9050613aff815187516114c4565b613b098187611fdb565b6060613b1361204e565b90506000613b2182846126f7565b90506000613b30828551613eea565b9050613b3b82612a8a565b9b929a509198505050505050505050565b613b586000838361161b565b613b6d61308a82613b67610771565b906114d1565b6001600160a01b038216600090815260208190526040902054613b9090826114d1565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906130d3908590615d0b565b4690565b610b66613bfe82600060c0613bf66126e7565b9291906114e3565b614243565b6000613c15631c74c91760e11b610ed3565b8214806106af5750613c2d6350dd6ed960e01b610ed3565b909114919050565b6000818060200190518101906106af91906157b7565b60006060600080613c5b85614258565b91509150613c6d8851821060646119e4565b6000613ca9898381518110613c7e57fe5b6020026020010151898481518110613c9257fe5b6020026020010151858a613ca4610c6b565b61427a565b90506060895167ffffffffffffffff81118015613cc557600080fd5b50604051908082528060200260200182016040528015613cef578160200160208202803683370190505b50905081818481518110613cff57fe5b60209081029190910101529299929850919650505050505050565b600060606000613d2984614330565b90506060611fc5878388614346565b60006060806000613d48856143e2565b91509150613d5882518a516114c4565b613d628288611fdb565b6000613d788a8a858a613d73610c6b565b6143fa565b9050613d888282111560cf6119e4565b99919850909650505050505050565b600082821015815b8751811015613e315781613de257613ddd888281518110613dbc57fe5b6020026020010151888381518110613dd057fe5b6020026020010151613e90565b613e12565b613e12888281518110613df157fe5b6020026020010151888381518110613e0557fe5b60200260200101516114d1565b888281518110613e1e57fe5b6020908102919091010152600101613d9f565b506000613e3e86896126f7565b90506000613e4c6000610cb5565b9050613e5782612a8a565b80613e685760009350505050613e86565b6000613e7f613e77848d612e66565b888885614538565b9450505050505b9695505050505050565b6000610b2d83836001612bb8565b600255565b60008383101580613eb2575081155b15613ebf57506000610b2d565b6000613ecb8486612e66565b670de0b6b3a7640000039050613ee18184612fdd565b95945050505050565b6000828202610b2d841580612ffa575083858381612ff757fe5b6000613f1382151560046119e4565b818381613f1c57fe5b049392505050565b6000818060200190518101906106af9190615878565b60006060806000613f4a8561455b565b91509150613f5a895183516114c4565b613f648288611fdb565b6000613f7a8a8a858a613f75610c6b565b614573565b9050613d888282101560d06119e4565b60006060600080613f9a856146ae565b91509150613fac8851821060646119e4565b6000613ca9898381518110613fbd57fe5b6020026020010151898481518110613fd157fe5b6020026020010151858a613fe3610c6b565b6146c5565b600060606000613ff78461475b565b90506060611fc5878388614771565b6000670de0b6b3a764000082141561401f5750816106af565b671bc16d674ec8000082141561403957611499838461325c565b673782dace9d900000821415614061576000614055848561325c565b9050613714818261325c565b600061406d848461408c565b9050600061408061373b8361271061325c565b905061376182826114d1565b6000816140a25750670de0b6b3a76400006106af565b826140af575060006106af565b6140bf60ff84901c1560066119e4565b826140e5770bce5086492111aea88f4bb1ca6bcf584181ea8059f76532841060076119e4565b826000670c7d713b49da0000831380156141065750670f43fc2c04ee000083125b1561413d57600061411684614803565b9050670de0b6b3a764000080820784020583670de0b6b3a76400008305020191505061414b565b816141478461492a565b0290505b670de0b6b3a76400009005614183680238fd42c5cf03ffff19821280159061417c575068070c1cc73b00c800008213155b60086119e4565b613e8681614cca565b60006001600160a01b0382161561421d5761421883836001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b1580156141da57600080fd5b505afa1580156141ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142129190615a42565b906136b9565b610b2d565b50670de0b6b3a764000092915050565b606081806020019051810190610b2d9190615893565b600854614252908260006150a8565b60085550565b6000808280602001905181019061426f9190615843565b909590945092505050565b6000806142918461428b8188611523565b9061320e565b90506142aa6709b6e64a8ec600008210156101326119e4565b60006142c86142c1670de0b6b3a764000089612e66565b8390614006565b905060006142df6142d883613693565b8a90612fdd565b905060006142f66142ef8a613693565b839061325c565b905060006143048383611523565b905060006143146125c889613693565b905061432082826114d1565b9c9b505050505050505050505050565b600081806020019051810190610b2d9190615817565b606060006143548484612e66565b90506060855167ffffffffffffffff8111801561437057600080fd5b5060405190808252806020026020018201604052801561439a578160200160208202803683370190505b50905060005b86518110156143d8576143b983888381518110612f9f57fe5b8282815181106143c557fe5b60209081029190910101526001016143a0565b5095945050505050565b606060008280602001905181019061426f91906157d2565b60006060845167ffffffffffffffff8111801561441657600080fd5b50604051908082528060200260200182016040528015614440578160200160208202803683370190505b5090506000805b8851811015614505576144a089828151811061445f57fe5b602002602001015161428b89848151811061447657fe5b60200260200101518c858151811061448a57fe5b602002602001015161152390919063ffffffff16565b8382815181106144ac57fe5b6020026020010181815250506144fb6144f48983815181106144ca57fe5b60200260200101518584815181106144de57fe5b602002602001015161325c90919063ffffffff16565b83906114d1565b9150600101614447565b50600061451689898986868a6150d4565b905061452b61452482613693565b879061325c565b9998505050505050505050565b60008061454f866145498688612e66565b85613ea3565b9050613e868482613175565b606060008280602001905181019061426f91906158d6565b60006060845167ffffffffffffffff8111801561458f57600080fd5b506040519080825280602002602001820160405280156145b9578160200160208202803683370190505b5090506000805b88518110156146675761461f8982815181106145d857fe5b60200260200101516146198984815181106145ef57fe5b60200260200101518c858151811061460357fe5b60200260200101516114d190919063ffffffff16565b90612e66565b83828151811061462b57fe5b60200260200101818152505061465d6144f489838151811061464957fe5b6020026020010151858481518110612f9f57fe5b91506001016145c0565b50600061467889898986868a6151e3565b90506000670de0b6b3a7640000821161469257600061360f565b61360f6146a783670de0b6b3a7640000611523565b8890612fdd565b6000808280602001905181019061426f9190615910565b6000806146d68461428b81886114d1565b90506146ef6729a2241af62c00008211156101336119e4565b60006147066142c1670de0b6b3a76400008961320e565b9050600061472661471f83670de0b6b3a7640000611523565b8a9061325c565b905060006147366142ef8a613693565b905060006147448383611523565b9050600061431461475489613693565b849061320e565b600081806020019051810190610b2d91906158f4565b6060600061477f848461320e565b90506060855167ffffffffffffffff8111801561479b57600080fd5b506040519080825280602002602001820160405280156147c5578160200160208202803683370190505b50905060005b86518110156143d8576147e4838883815181106144de57fe5b8282815181106147f057fe5b60209081029190910101526001016147cb565b670de0b6b3a7640000026000806ec097ce7bc90715b34b9f1000000000808401906ec097ce7bc90715b34b9f0fffffffff198501028161483f57fe5b05905060006ec097ce7bc90715b34b9f100000000082800205905081806ec097ce7bc90715b34b9f100000000081840205915060038205016ec097ce7bc90715b34b9f100000000082840205915060058205016ec097ce7bc90715b34b9f100000000082840205915060078205016ec097ce7bc90715b34b9f100000000082840205915060098205016ec097ce7bc90715b34b9f1000000000828402059150600b8205016ec097ce7bc90715b34b9f1000000000828402059150600d8205016ec097ce7bc90715b34b9f1000000000828402059150600f826002919005919091010295945050505050565b6000670de0b6b3a76400008212156149675761495d826ec097ce7bc90715b34b9f10000000008161495757fe5b0561492a565b6000039050610d6e565b60007e1600ef3172e58d2e933ec884fde10064c63b5372d805e203c000000000000083126149b857770195e54c5dd42177f53a27172fa9ec630262827000000000830592506806f05b59d3b2000000015b73011798004d755d3c8bc8e03204cf44619e00000083126149f0576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff00840008312614a38576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a7008312614a73576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf8508312614aaa57693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e28312614ae157690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d038312614b165768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb417461211108312614b4157680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d8312614b76576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f17757889379378312614bab576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b2866038312614bdf576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac8312614c13576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b600068056bc75e2d63100000840168056bc75e2d631000008086030281614c3657fe5b059050600068056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b6000614cf9680238fd42c5cf03ffff198312158015614cf2575068070c1cc73b00c800008313155b60096119e4565b6000821215614d2d57614d0e82600003614cca565b6ec097ce7bc90715b34b9f100000000081614d2557fe5b059050610d6e565b60006806f05b59d3b20000008312614d6d57506806f05b59d3b1ffffff1990910190770195e54c5dd42177f53a27172fa9ec630262827000000000614da3565b6803782dace9d90000008312614d9f57506803782dace9d8ffffff19909101906b1425982cf597cd205cef7380614da3565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac620000008412614df35768ad78ebc5ac61ffffff199093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d6310000008412614e2f576856bc75e2d630ffffff199093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b188000008412614e6957682b5e3af16b187fffff199093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c4000008412614ea3576815af1d78b58c3fffff199093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac62000008412614edc57680ad78ebc5ac61fffff199093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d631000008412614f155768056bc75e2d630fffff199093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b18800008412614f4e576802b5e3af16b187ffff199093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c400008412614f875768015af1d78b58c3ffff199093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116821b90821b198416179392505050565b670de0b6b3a764000060005b87518110156151d85760008582815181106150f757fe5b602002602001015185111561515a57600061512061511487613693565b8b8581518110612f9f57fe5b90506000615134828a868151811061448a57fe5b9050600061514461266688613693565b905061515083826114d1565b9350505050615171565b86828151811061516657fe5b602002602001015190505b600061519a8a848151811061518257fe5b6020026020010151614619848d878151811061448a57fe5b90506151cc6151c58a85815181106151ae57fe5b6020026020010151836136b990919063ffffffff16565b8590612fdd565b935050506001016150e0565b509695505050505050565b670de0b6b3a764000060005b87518110156151d85760008486838151811061520757fe5b6020026020010151111561526e57600061522c61511487670de0b6b3a7640000611523565b90506000615240828a868151811061448a57fe5b9050600061524e828861325c565b905061526461525d8383611523565b84906114d1565b9350505050615285565b86828151811061527a57fe5b602002602001015190505b60006152ae8a848151811061529657fe5b6020026020010151614619848d878151811061460357fe5b90506152c26151c58a85815181106151ae57fe5b935050506001016151ef565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b80356106af81615e62565b600082601f830112615319578081fd5b815161532c61532782615e42565b615e1b565b81815291506020808301908481018184028601820187101561534d57600080fd5b60005b8481101561536c57815184529282019290820190600101615350565b505050505092915050565b600082601f830112615387578081fd5b813567ffffffffffffffff81111561539d578182fd5b6153b0601f8201601f1916602001615e1b565b91508082528360208285010111156153c757600080fd5b8060208401602084013760009082016020015292915050565b8051600481106106af57600080fd5b8051600581106106af57600080fd5b8035600281106106af57600080fd5b60006020828403121561541e578081fd5b8135610b2d81615e62565b6000806040838503121561543b578081fd5b823561544681615e62565b9150602083013561545681615e62565b809150509250929050565b600080600060608486031215615475578081fd5b833561548081615e62565b9250602084013561549081615e62565b929592945050506040919091013590565b600080600080600080600060e0888a0312156154bb578283fd5b87356154c681615e62565b965060208801356154d681615e62565b9550604088013594506060880135935060808801356154f481615e77565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215615523578182fd5b823561552e81615e62565b946020939093013593505050565b600080600060608486031215615550578081fd5b835167ffffffffffffffff80821115615567578283fd5b818601915086601f83011261557a578283fd5b815161558861532782615e42565b80828252602080830192508086018b8283870289010111156155a8578788fd5b8796505b848710156155d35780516155bf81615e62565b8452600196909601959281019281016155ac565b5089015190975093505050808211156155ea578283fd5b506155f786828701615309565b925050604084015190509250925092565b600060208284031215615619578081fd5b81518015158114610b2d578182fd5b600080600080600080600060e0888a031215615642578081fd5b8735965060208089013561565581615e62565b9650604089013561566581615e62565b9550606089013567ffffffffffffffff80821115615681578384fd5b818b0191508b601f830112615694578384fd5b81356156a261532782615e42565b8082825285820191508585018f8788860288010111156156c0578788fd5b8795505b838610156156e25780358352600195909501949186019186016156c4565b509850505060808b0135955060a08b0135945060c08b0135925080831115615708578384fd5b50506157168a828b01615377565b91505092959891949750929550565b600060208284031215615736578081fd5b81356001600160e01b031981168114610b2d578182fd5b60006020828403121561575e578081fd5b8151610b2d81615e62565b6000806040838503121561577b578182fd5b823561578681615e62565b9150602083013567ffffffffffffffff8111156157a1578182fd5b6157ad85828601615377565b9150509250929050565b6000602082840312156157c8578081fd5b610b2d83836153e0565b6000806000606084860312156157e6578081fd5b6157f085856153e0565b9250602084015167ffffffffffffffff81111561580b578182fd5b6155f786828701615309565b60008060408385031215615829578182fd5b61583384846153e0565b9150602083015190509250929050565b600080600060608486031215615857578081fd5b61586185856153e0565b925060208401519150604084015190509250925092565b600060208284031215615889578081fd5b610b2d83836153ef565b600080604083850312156158a5578182fd5b6158af84846153ef565b9150602083015167ffffffffffffffff8111156158ca578182fd5b6157ad85828601615309565b6000806000606084860312156158ea578081fd5b6157f085856153ef565b60008060408385031215615906578182fd5b61583384846153ef565b600080600060608486031215615924578081fd5b61586185856153ef565b600080600060608486031215615942578081fd5b833567ffffffffffffffff80821115615959578283fd5b818601915061012080838903121561596f578384fd5b61597881615e1b565b905061598488846153fe565b815261599388602085016152fe565b60208201526159a588604085016152fe565b6040820152606083013560608201526080830135608082015260a083013560a08201526159d58860c085016152fe565b60c08201526159e78860e085016152fe565b60e082015261010080840135838111156159ff578586fd5b615a0b8a828701615377565b9183019190915250976020870135975060409096013595945050505050565b600060208284031215615a3b578081fd5b5035919050565b600060208284031215615a53578081fd5b5051919050565b60008060008060808587031215615a6f578182fd5b8451935060208501519250604085015191506060850151615a8f81615e62565b939692955090935050565b600060208284031215615aab578081fd5b8151610b2d81615e77565b60008060408385031215615ac8578182fd5b8251615ad381615e77565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015615b1f57815187529582019590820190600101615b03565b509495945050505050565b60008151808452815b81811015615b4f57602081850181015186830182015201615b33565b81811115615b605782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b81811015615c0d5783516001600160a01b031683529284019291840191600101615be8565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015615ca3578151805160048110615c4c57fe5b855280870151615c5e88870182615ae3565b508581015186860152606080820151615c7982880182615ae3565b505060809081015190615c8e86820183615ae3565b505060a0939093019290850190600101615c36565b5091979650505050505050565b600060208252610b2d6020830184615af0565b600060408252615cd66040830185615af0565b8281036020840152613ee18185615af0565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000838252604060208301526126066040830184615b2a565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610b2d6020830184615b2a565b6000838252604060208301526126066040830184615af0565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615e3a57600080fd5b604052919050565b600067ffffffffffffffff821115615e58578081fd5b5060209081020190565b6001600160a01b0381168114610b6657600080fd5b60ff81168114610b6657600080fdfea26469706673582212208e9a1a26b64de4f87bb963cb83363cb8bc872f588f58e43e43715bf71d5b477264736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/artifact/WeightedPoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/artifact/WeightedPoolFactory.json new file mode 100644 index 0000000..7357311 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/artifact/WeightedPoolFactory.json @@ -0,0 +1,277 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "WeightedPoolFactory", + "sourceName": "contracts/WeightedPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "poolVersion", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "normalizedWeights", + "type": "uint256[]" + }, + { + "internalType": "contract IRateProvider[]", + "name": "rateProviders", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeePercentagesProvider", + "outputs": [ + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101806040523480156200001257600080fd5b5060405162008d6138038062008d6183398101604081905262000035916200036d565b83836040518060200162000049906200021c565b601f1982820381018352601f90910116604052805183903090839060006002820460a081905280830360e08190528185529091508362000095816200013d602090811b620005e717901c565b60601b6001600160601b0319166080528285018051838252620000c4826200013d602090811b620005e717901c565b6001600160601b0319606091821b811660c05296909352905261010095909552505092821b831661012052509290921b909116610140525050426276a700016101605281516200011c9060029060208501906200022a565b508051620001329060039060208401906200022a565b505050505062000415565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506200018b6001600160a01b03831615156101ac62000191565b50919050565b81620001a257620001a281620001a6565b5050565b620001b8816210905360ea1b620001bb565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b61798680620013db83390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200026d57805160ff19168380011785556200029d565b828001600101855582156200029d579182015b828111156200029d57825182559160200191906001019062000280565b50620002ab929150620002af565b5090565b5b80821115620002ab5760008155600101620002b0565b600082601f830112620002d7578081fd5b81516001600160401b0380821115620002ee578283fd5b6040516020601f8401601f191682018101838111838210171562000310578586fd5b806040525081945083825286818588010111156200032d57600080fd5b600092505b8383101562000351578583018101518284018201529182019162000332565b83831115620003635760008185840101525b5050505092915050565b6000806000806080858703121562000383578384fd5b84516200039081620003ff565b6020860151909450620003a381620003ff565b60408601519093506001600160401b0380821115620003c0578384fd5b620003ce88838901620002c6565b93506060870151915080821115620003e4578283fd5b50620003f387828801620002c6565b91505092959194509250565b6001600160a01b0381168114620001b857600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405160601c61016051610f4d6200048e60003980610232528061025b5250806103fa52508061054b5250806104fb52508061064152508061020952806106bd5250806106625250806101e852806106995250610f4d6000f3fe608060405234801561001057600080fd5b50600436106100de5760003560e01c80636634b7531161008c57806380773a931161006657806380773a9314610184578063851c1bb3146101975780638d928af8146101b7578063aaabadc5146101bf576100de565b80636634b753146101475780636c57f5a914610167578063739238d61461016f576100de565b80632f2770db116100bd5780632f2770db1461012d5780633f819b6f1461013757806354fd4d501461013f576100de565b8062c194db146100e3578063174481fa146101015780632da47c4014610117575b600080fd5b6100eb6101c7565b6040516100f89190610d93565b60405180910390f35b6101096101e6565b6040516100f8929190610d46565b61011f61022c565b6040516100f8929190610ead565b610135610296565b005b6100eb6102dd565b6100eb610373565b61015a610155366004610ae9565b6103d1565b6040516100f89190610d60565b61015a6103ef565b6101776103f8565b6040516100f89190610d32565b610177610192366004610b69565b61041c565b6101aa6101a5366004610b25565b6104f7565b6040516100f89190610d6b565b610177610549565b61017761056d565b60606101e160405180602001604052806000815250610639565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561028857807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610291565b60009250600091505b509091565b61029e610712565b6102a6610743565b6001805460ff1916811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156103695780601f1061033e57610100808354040283529160200191610369565b820191906000526020600020905b81548152906001019060200180831161034c57829003601f168201915b5050505050905090565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156103695780601f1061033e57610100808354040283529160200191610369565b6001600160a01b031660009081526020819052604090205460ff1690565b60015460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b600080600061042961022c565b915091506104e96040518060e001604052808c81526020018b81526020018a81526020018981526020018881526020018a5167ffffffffffffffff8111801561047157600080fd5b5060405190808252806020026020018201604052801561049b578160200160208202803683370190505b5081526020018790526104ac610549565b6104b46103f8565b8585896104bf6102dd565b6040516020016104d59796959493929190610da6565b604051602081830303815290604052610758565b9a9950505050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000008260405160200161052c929190610d1a565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610577610549565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156105af57600080fd5b505afa1580156105c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e19190610b4d565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506106336001600160a01b03831615156101ac6107c1565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016107048183866107d3565b505050505050505050919050565b60006107296000356001600160e01b0319166104f7565b90506107406107388233610811565b6101916107c1565b50565b61075661074e6103ef565b1560d36107c1565b565b6000610762610743565b600061076d836108a3565b6001600160a01b038116600081815260208190526040808220805460ff191660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b816107cf576107cf816108de565b5050565b5b602081106107f3578151835260209283019290910190601f19016107d4565b905182516020929092036101000a6000190180199091169116179052565b600061081b61056d565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161084a93929190610d74565b60206040518083038186803b15801561086257600080fd5b505afa158015610876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089a9190610b05565b90505b92915050565b600060606108b083610639565b905060008151602083016000f090506001600160a01b0381166108d7573d6000803e3d6000fd5b9392505050565b62461bcd60e51b600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b604452610740916210905360ea1b906242414c90606490fd5b803561089d81610f02565b600082601f830112610954578081fd5b813561096761096282610ee2565b610ebb565b81815291506020808301908481018184028601820187101561098857600080fd5b60005b848110156109b057813561099e81610f02565b8452928201929082019060010161098b565b505050505092915050565b600082601f8301126109cb578081fd5b81356109d961096282610ee2565b8181529150602080830190848101818402860182018710156109fa57600080fd5b60005b848110156109b0578135610a1081610f02565b845292820192908201906001016109fd565b600082601f830112610a32578081fd5b8135610a4061096282610ee2565b818152915060208083019084810181840286018201871015610a6157600080fd5b60005b848110156109b057813584529282019290820190600101610a64565b600082601f830112610a90578081fd5b813567ffffffffffffffff811115610aa6578182fd5b610ab9601f8201601f1916602001610ebb565b9150808252836020828501011115610ad057600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215610afa578081fd5b81356108d781610f02565b600060208284031215610b16578081fd5b815180151581146108d7578182fd5b600060208284031215610b36578081fd5b81356001600160e01b0319811681146108d7578182fd5b600060208284031215610b5e578081fd5b81516108d781610f02565b600080600080600080600060e0888a031215610b83578283fd5b873567ffffffffffffffff80821115610b9a578485fd5b610ba68b838c01610a80565b985060208a0135915080821115610bbb578485fd5b610bc78b838c01610a80565b975060408a0135915080821115610bdc578485fd5b610be88b838c01610944565b965060608a0135915080821115610bfd578485fd5b610c098b838c01610a22565b955060808a0135915080821115610c1e578485fd5b50610c2b8a828b016109bb565b93505060a08801359150610c428960c08a01610939565b905092959891949750929550565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015610c955781516001600160a01b031687529582019590820190600101610c70565b509495945050505050565b6000815180845260208085019450808401835b83811015610c9557815187529582019590820190600101610cb3565b60008151808452815b81811015610cf457602081850181015186830182015201610cd8565b81811115610d055782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b901515815260200190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b60006020825261089a6020830184610ccf565b600060e08252885160e080840152610dc26101c0840182610ccf565b905060208a015160df198085840301610100860152610de18383610ccf565b925060408c015191508085840301610120860152610dff8383610c5d565b925060608c015191508085840301610140860152610e1d8383610ca0565b925060808c015191508085840301610160860152610e3b8383610c5d565b925060a08c01519150808584030161018086015250610e5a8282610c5d565b91505060c08a01516101a0840152610e75602084018a610c50565b610e826040840189610c50565b866060840152856080840152610e9b60a0840186610c50565b82810360c08401526104e98185610ccf565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610eda57600080fd5b604052919050565b600067ffffffffffffffff821115610ef8578081fd5b5060209081020190565b6001600160a01b038116811461074057600080fdfea2646970667358221220f75d421bbe3257fe4fb00b1a536d6d85e7ce33db14aec242e3d17b5c352a779264736f6c634300070100336106606040523480156200001257600080fd5b50604051620079863803806200798683398101604081905262000035916200150d565b866040015151876080015186600019898b600001518c602001518d604001518e60a001518f60c001518d8d8d6000898751600214801562000074575081155b6200008157600162000084565b60025b8a8a8a8a8a8a8a8a828289898d85336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000d5929190620011e1565b508051620000eb906004906020840190620011e1565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b1661012052506200016990506276a70083111561019462000c40565b6200017d62278d0082111561019562000c40565b42909101610140819052016101605285516200019f906002111560c862000c40565b620001b9620001ad62000c55565b8751111560c962000c40565b620001cf8662000c5a60201b620014ba1760201c565b620001da8462000c66565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f906200020b908d906004016200177b565b602060405180830381600087803b1580156200022657600080fd5b505af11580156200023b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002619190620014d5565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002969084908b908b90600401620016df565b600060405180830381600087803b158015620002b157600080fd5b505af1158015620002c6573d6000803e3d6000fd5b505050508061018081815250508a6001600160a01b031663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200030d57600080fd5b505afa15801562000322573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003489190620014ee565b6001600160a01b03166101a0816001600160a01b031660601b815250505050505050505050505050505050505050505050506000600019821490508015156101e081151560f81b81525050826001600160a01b03166101c0816001600160a01b031660601b81525050620003c483600262000cfa60201b60201c565b620003d183600362000cfa565b8015620003eb57620003e583600062000cfa565b620004aa565b60405163178b2b9360e21b81526200047f906001600160a01b03851690635e2cae4c906200041f9060009060040162001790565b60206040518083038186803b1580156200043857600080fd5b505afa1580156200044d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004739190620014d5565b83111561025862000c40565b60006000805160206200796683398151915283604051620004a1919062001790565b60405180910390a25b80620004b75781620004ba565b60005b6102005250620004d3915050600883111560c962000c40565b620004eb82825162000ea560201b620014c41760201c565b620004f68162000eb4565b151560f81b61032052805181906000906200050d57fe5b60200260200101516001600160a01b0316610220816001600160a01b031660601b81525050806001815181106200054057fe5b60200260200101516001600160a01b0316610240816001600160a01b031660601b8152505060028211620005765760006200058d565b806002815181106200058457fe5b60200260200101515b60601b6001600160601b0319166102605260038211620005af576000620005c6565b80600381518110620005bd57fe5b60200260200101515b60601b6001600160601b0319166102805260048211620005e8576000620005ff565b80600481518110620005f657fe5b60200260200101515b60601b6001600160601b0319166102a052600582116200062157600062000638565b806005815181106200062f57fe5b60200260200101515b60601b6001600160601b0319166102c052600682116200065a57600062000671565b806006815181106200066857fe5b60200260200101515b60601b6001600160601b0319166102e0526007821162000693576000620006aa565b80600781518110620006a157fe5b60200260200101515b6001600160a01b0316610300816001600160a01b031660601b81525050505060008760400151519050620006ef8189606001515162000ea560201b620014c41760201c565b61034081905281516200070a90600b906020850190620011e1565b506000805b828160ff1610156200077f5760008a606001518260ff16815181106200073157fe5b6020026020010151905062000759662386f26fc1000082101561012e62000c4060201b60201c565b62000773818462000f1060201b620014d11790919060201c565b9250506001016200070f565b5062000798670de0b6b3a7640000821461013462000c40565b8860400151600081518110620007aa57fe5b60200260200101516001600160a01b0316610360816001600160a01b031660601b815250508860400151600181518110620007e157fe5b60200260200101516001600160a01b0316610380816001600160a01b031660601b81525050600282116200081757600062000832565b88604001516002815181106200082957fe5b60200260200101515b60601b6001600160601b0319166103a05260038211620008545760006200086f565b88604001516003815181106200086657fe5b60200260200101515b60601b6001600160601b0319166103c0526004821162000891576000620008ac565b8860400151600481518110620008a357fe5b60200260200101515b60601b6001600160601b0319166103e05260058211620008ce576000620008e9565b8860400151600581518110620008e057fe5b60200260200101515b60601b6001600160601b03191661040052600682116200090b57600062000926565b88604001516006815181106200091d57fe5b60200260200101515b60601b6001600160601b03191661042052600782116200094857600062000963565b88604001516007815181106200095a57fe5b60200260200101515b6001600160a01b0316610440816001600160a01b031660601b81525050620009aa89604001516000815181106200099657fe5b602002602001015162000f2d60201b60201c565b6104605260408901518051620009c7919060019081106200099657fe5b6104805260028211620009dc576000620009f2565b620009f289604001516002815181106200099657fe5b6104a0526003821162000a0757600062000a1d565b62000a1d89604001516003815181106200099657fe5b6104c0526004821162000a3257600062000a48565b62000a4889604001516004815181106200099657fe5b6104e0526005821162000a5d57600062000a73565b62000a7389604001516005815181106200099657fe5b610500526006821162000a8857600062000a9e565b62000a9e89604001516006815181106200099657fe5b610520526007821162000ab357600062000ac9565b62000ac989604001516007815181106200099657fe5b610540526060890151805160009062000ade57fe5b60200260200101516105608181525050886060015160018151811062000b0057fe5b602002602001015161058081815250506002821162000b2157600062000b3c565b886060015160028151811062000b3357fe5b60200260200101515b6105a0526003821162000b5157600062000b6c565b886060015160038151811062000b6357fe5b60200260200101515b6105c0526004821162000b8157600062000b9c565b886060015160048151811062000b9357fe5b60200260200101515b6105e0526005821162000bb157600062000bcc565b886060015160058151811062000bc357fe5b60200260200101515b610600526006821162000be157600062000bfc565b886060015160068151811062000bf357fe5b60200260200101515b610620526007821162000c1157600062000c2c565b886060015160078151811062000c2357fe5b60200260200101515b610640525062001802975050505050505050565b8162000c515762000c518162000ffc565b5050565b600890565b8062000c518162001011565b62000c7f62000c746200109d565b82101560cb62000c40565b62000c9862000c8d620010a6565b82111560ca62000c40565b62000cba8160c0603f600854620010b260201b620014e317909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc9062000cef90839062001790565b60405180910390a150565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c32639062000d2b90859060040162001790565b60206040518083038186803b15801562000d4457600080fd5b505afa15801562000d59573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d7f9190620014d5565b90508162000dc35762000d9d81620010d760201b620015061760201c565b600980546001600160401b0319166001600160401b039290921691909117905562000e77565b600282141562000e195762000de381620010d760201b620015061760201c565b600980546001600160401b03929092166801000000000000000002600160401b600160801b031990921691909117905562000e77565b600382141562000e6a5762000e3981620010d760201b620015061760201c565b600980546001600160401b0392909216600160801b02600160801b600160c01b031990921691909117905562000e77565b62000e776101bb62000ffc565b81600080516020620079668339815191528260405162000e98919062001790565b60405180910390a2505050565b62000c51828214606762000c40565b6000805b825181101562000f055760006001600160a01b031683828151811062000eda57fe5b60200260200101516001600160a01b03161462000efc57600091505062000f0b565b60010162000eb8565b50600190505b919050565b600082820162000f24848210158362000c40565b90505b92915050565b60006001600160a01b03821630141562000f515750670de0b6b3a764000062000f0b565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801562000f8d57600080fd5b505afa15801562000fa2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fc89190620016bc565b60ff169050600062000fe7601283620010f560201b620015231760201c565b600a0a670de0b6b3a764000002949350505050565b6200100e816210905360ea1b6200110d565b50565b60028151101562001022576200100e565b6000816000815181106200103257fe5b602002602001015190506000600190505b8251811015620010985760008382815181106200105c57fe5b602002602001015190506200108d816001600160a01b0316846001600160a01b031610606562000c4060201b60201c565b915060010162001043565b505050565b64e8d4a5100090565b67016345785d8a000090565b6000620010c18484846200116e565b506001901b60001901811b1992909216911b1790565b6000620010f16001600160401b038311156101ba62000c40565b5090565b60006200110783831115600162000c40565b50900390565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6200117f6101008310606462000c40565b620011b860018210158015620011b05750620011ac60ff8461010003620011c960201b620015391760201c565b8211155b606462000c40565b6200109883821c156101b462000c40565b6000818310620011da578162000f24565b5090919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200122457805160ff191683800117855562001254565b8280016001018555821562001254579182015b828111156200125457825182559160200191906001019062001237565b50620010f19291505b80821115620010f157600081556001016200125d565b805162000f2781620017ec565b600082601f83011262001291578081fd5b8151620012a8620012a282620017c0565b62001799565b818152915060208083019084810181840286018201871015620012ca57600080fd5b60005b84811015620012f6578151620012e381620017ec565b84529282019290820190600101620012cd565b505050505092915050565b600082601f83011262001312578081fd5b815162001323620012a282620017c0565b8181529150602080830190848101818402860182018710156200134557600080fd5b60005b84811015620012f65781516200135e81620017ec565b8452928201929082019060010162001348565b600082601f83011262001382578081fd5b815162001393620012a282620017c0565b818152915060208083019084810181840286018201871015620013b557600080fd5b60005b84811015620012f6578151620013ce81620017ec565b84529282019290820190600101620013b8565b600082601f830112620013f2578081fd5b815162001403620012a282620017c0565b8181529150602080830190848101818402860182018710156200142557600080fd5b60005b84811015620012f65781518452928201929082019060010162001428565b600082601f83011262001457578081fd5b81516001600160401b038111156200146d578182fd5b602062001483601f8301601f1916820162001799565b925081835284818386010111156200149a57600080fd5b60005b82811015620014ba5784810182015184820183015281016200149d565b82811115620014cc5760008284860101525b50505092915050565b600060208284031215620014e7578081fd5b5051919050565b60006020828403121562001500578081fd5b815162000f2481620017ec565b600080600080600080600060e0888a03121562001528578283fd5b87516001600160401b03808211156200153f578485fd5b9089019060e0828c03121562001553578485fd5b6200155f60e062001799565b8251828111156200156e578687fd5b6200157c8d82860162001446565b82525060208301518281111562001591578687fd5b6200159f8d82860162001446565b602083015250604083015182811115620015b7578687fd5b620015c58d82860162001301565b604083015250606083015182811115620015dd578687fd5b620015eb8d828601620013e1565b60608301525060808301518281111562001603578687fd5b620016118d82860162001371565b60808301525060a08301518281111562001629578687fd5b620016378d82860162001280565b60a08301525060c083810151908201529850620016588b60208c0162001273565b9750620016698b60408c0162001273565b965060608a0151955060808a01519450620016888b60a08c0162001273565b935060c08a01519150808211156200169e578283fd5b50620016ad8a828b0162001446565b91505092959891949750929550565b600060208284031215620016ce578081fd5b815160ff8116811462000f24578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b818110156200172b57620017188551620017e0565b8352938301939183019160010162001703565b505084810360408601528551808252908201925081860190845b818110156200176d576200175a8351620017e0565b8552938301939183019160010162001745565b509298975050505050505050565b60208101600383106200178a57fe5b91905290565b90815260200190565b6040518181016001600160401b0381118282101715620017b857600080fd5b604052919050565b60006001600160401b03821115620017d6578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146200100e57600080fd5b60805160a05160c05160e0516101005160601c6101205160601c6101405161016051610180516101a05160601c6101c05160601c6101e05160f81c610200516102205160601c6102405160601c6102605160601c6102805160601c6102a05160601c6102c05160601c6102e05160601c6103005160601c6103205160f81c610340516103605160601c6103805160601c6103a05160601c6103c05160601c6103e05160601c6104005160601c6104205160601c6104405160601c61046051610480516104a0516104c0516104e05161050051610520516105405161056051610580516105a0516105c0516105e051610600516106205161064051615ebc62001aaa60003980612270528061357e52508061222d528061351d5250806121ea52806134bc5250806121a7528061345b52508061216452806133fa52508061212152806133995250806120de52806133385250806120a452806132d7525080612b96525080612b72525080612b4e525080612b2a525080612b06525080612ae2525080612abe525080612a9a525080612563528061354352508061252152806134e25250806124df528061348152508061249d528061342052508061245b52806133bf525080612419528061335e5250806123d752806132fd525080612395528061329c5250806119c2525080613837525080610a6b5280613a98525080610a145280613a4c5250806109bd5280613a0052508061096652806139b452508061090f52806139685250806108aa528061390752508061085352806138b65250806108055280613878525080610cdf52508061074f5250806106cf52806106fa5280610725525080611293525080610b6b5250806118075250806117e3525080610fad525080610f89525080610ed75250806128825250806128c45250806128a35250615ebc6000f3fe608060405234801561001057600080fd5b50600436106103205760003560e01c80637ecebe00116101a7578063aaabadc5116100ee578063d505accf11610097578063ddf4627b11610071578063ddf4627b146105ef578063ed24911d146105f7578063f89f27ed146105ff57610320565b8063d505accf146105b6578063d5c096c4146105c9578063dd62ed3e146105dc57610320565b8063b7b814fc116100c8578063b7b814fc1461059e578063c0ff1a15146105a6578063d2946c2b146105ae57610320565b8063aaabadc514610586578063b10962781461058e578063b35056b81461059657610320565b80638d928af8116101505780639d2c110c1161012a5780639d2c110c1461054d578063a457c2d714610560578063a9059cbb1461057357610320565b80638d928af81461052a57806390193b7c1461053257806395d89b411461054557610320565b8063876f303b11610181578063876f303b146104fa57806387ec681714610502578063893d20e81461051557610320565b80637ecebe00146104cc5780638456cb59146104df578063851c1bb3146104e757610320565b806338e9922e1161026b57806354fd4d501161021457806370464016116101ee578063704640161461048557806370a082311461049857806374f3b009146104ab57610320565b806354fd4d501461045457806355c676281461045c5780636028bfd41461046457610320565b80633f4ba83a116102455780633f4ba83a1461043157806350dd6ed91461043957806354a844ba1461044c57610320565b806338e9922e1461040357806338fff2d014610416578063395093511461041e57610320565b80631dd746ea116102cd57806323ef89ed116102a757806323ef89ed146103de578063313ce567146103e65780633644e515146103fb57610320565b80631dd746ea146103a1578063238a2d59146103b657806323b872dd146103cb57610320565b806315b0015b116102fe57806315b0015b1461036d57806318160ddd146103755780631c0de0511461038a57610320565b806306fdde0314610325578063095ea7b3146103435780630da0669c14610363575b600080fd5b61032d610607565b60405161033a9190615de1565b60405180910390f35b610356610351366004615511565b61069e565b60405161033a9190615ce8565b61036b6106b5565b005b61035661074d565b61037d610771565b60405161033a9190615d0b565b610392610777565b60405161033a93929190615cf3565b6103a96107a0565b60405161033a9190615cb0565b6103be6107af565b60405161033a9190615bcc565b6103566103d9366004615461565b610abe565b61037d610b34565b6103ee610b3a565b60405161033a9190615e0d565b61037d610b43565b61036b610411366004615a2a565b610b4d565b61037d610b69565b61035661042c366004615511565b610b8d565b61036b610bc8565b61036b610447366004615769565b610bda565b61036b610bf8565b61032d610c0a565b61037d610c6b565b610477610472366004615628565b610c7e565b60405161033a929190615df4565b61037d610493366004615a2a565b610cb5565b61037d6104a636600461540d565b610d73565b6104be6104b9366004615628565b610d8e565b60405161033a929190615cc3565b61037d6104da36600461540d565b610eb6565b61036b610ec1565b61037d6104f5366004615725565b610ed3565b61037d610f25565b610477610510366004615628565b610f61565b61051d610f87565b60405161033a9190615bb8565b61051d610fab565b61037d61054036600461540d565b610fcf565b61032d610fea565b61037d61055b36600461592e565b61104b565b61035661056e366004615511565b611144565b610356610581366004615511565b611182565b61051d61118f565b61037d611199565b6103566111b1565b61036b6111c2565b61037d6111d4565b61051d611291565b61036b6105c43660046154a1565b6112b5565b6104be6105d7366004615628565b611340565b61037d6105ea366004615429565b611463565b61037d6114a0565b61037d6114a6565b6103a96114b0565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106935780601f1061066857610100808354040283529160200191610693565b820191906000526020600020905b81548152906001019060200180831161067657829003601f168201915b505050505090505b90565b60006106ab33848461154f565b5060015b92915050565b6106bd6115b7565b6106c561074d565b156106f5576106f57f00000000000000000000000000000000000000000000000000000000000000006000611620565b6107207f00000000000000000000000000000000000000000000000000000000000000006002611620565b61074b7f00000000000000000000000000000000000000000000000000000000000000006003611620565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b60008060006107846117c4565b15925061078f6117e1565b9150610799611805565b9050909192565b60606107aa611829565b905090565b606060006107bb6119c0565b905060608167ffffffffffffffff811180156107d657600080fd5b50604051908082528060200260200182016040528015610800578160200160208202803683370190505b5090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061083157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061087f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060028211156108fb577f0000000000000000000000000000000000000000000000000000000000000000816002815181106108d657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050610904565b915061069b9050565b60038211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160038151811061093b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060048211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160048151811061099257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060058211156108fb577f0000000000000000000000000000000000000000000000000000000000000000816005815181106109e957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060068211156108fb577f000000000000000000000000000000000000000000000000000000000000000081600681518110610a4057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060078211156108fb577f000000000000000000000000000000000000000000000000000000000000000081600781518110610a9757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b91505090565b600080610acb8533611463565b9050610aef336001600160a01b0387161480610ae75750838210155b61019e6119e4565b610afa8585856119f2565b336001600160a01b03861614801590610b1557506000198114155b15610b2757610b27853385840361154f565b60019150505b9392505050565b600a5490565b60055460ff1690565b60006107aa6114a6565b610b55611ad2565b610b5d611b00565b610b6681611b13565b50565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106ab918590610bc390866114d1565b61154f565b610bd0611ad2565b61074b6000611b8c565b610be2611ad2565b610bea611b00565b610bf48282611bff565b5050565b610c00611ad2565b61074b6001611cf4565b600b8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106935780601f1061066857610100808354040283529160200191610693565b6008546000906107aa9060c0603f611d4b565b60006060610c948651610c8f6119c0565b6114c4565b610ca989898989898989611d5a611dbc611e2b565b97509795505050505050565b6000610cbf6111b1565b15610ccc57506000610d6e565b81610d1857610cd961074d565b610d03577f0000000000000000000000000000000000000000000000000000000000000000610d11565b60095467ffffffffffffffff165b9050610d6e565b6002821415610d40575060095468010000000000000000900467ffffffffffffffff16610d6e565b6003821415610d635750600954600160801b900467ffffffffffffffff16610d6e565b610d6e6101bb611f55565b919050565b6001600160a01b031660009081526020819052604090205490565b60608088610db8610d9d610fab565b6001600160a01b0316336001600160a01b03161460cd6119e4565b610dcd610dc3610b69565b82146101f46119e4565b60606000610dda86611f65565b15610e0257610de7611f94565b610df989610df3610771565b88611fa7565b92509050610e54565b610e0a611fd3565b6060610e14611829565b9050610e208a82611fdb565b610e448d8d8d8d8d610e306111b1565b610e3a578d610e3d565b60005b878e611d5a565b93509150610e528382611dbc565b505b610e5e8b82612044565b81895167ffffffffffffffff81118015610e7757600080fd5b50604051908082528060200260200182016040528015610ea1578160200160208202803683370190505b509450945050505b5097509795505050505050565b60006106af82610fcf565b610ec9611ad2565b61074b6001611b8c565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f08929190615b75565b604051602081830303815290604052805190602001209050919050565b600080610f30610771565b90506000610f4d610f3f6111d4565b610f4761204e565b8461229c565b509050610f5a82826114d1565b9250505090565b60006060610f728651610c8f6119c0565b610ca9898989898989896122df612328611e2b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106935780601f1061066857610100808354040283529160200191610693565b6000836080015161105d610d9d610fab565b611068610dc3610b69565b611070611fd3565b600061107f8660200151612391565b905060006110908760400151612391565b905061109c86836125ae565b95506110a885826125ae565b94506000875160018111156110b957fe5b1415611105576110cc87606001516125ba565b606088018190526110dd90836125ae565b606088015260006110ef8888886125db565b90506110fb818361260e565b945050505061113c565b6111138760600151826125ae565b6060880152600061112588888861261a565b90506111318184612645565b90506110fb81612651565b509392505050565b6000806111513385611463565b905080831061116b576111663385600061154f565b611178565b611178338585840361154f565b5060019392505050565b60006106ab3384846119f2565b60006107aa61266d565b60006107aa600060c06111aa6126e7565b9190611d4b565b6008546000906107aa9060ff6126ed565b6111ca611ad2565b61074b6000611cf4565b600060606111e0610fab565b6001600160a01b031663f94d46686111f6610b69565b6040518263ffffffff1660e01b81526004016112129190615d0b565b60006040518083038186803b15801561122a57600080fd5b505afa15801561123e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611266919081019061553c565b5091505061127b81611276611829565b611fdb565b606061128561204e565b9050610f5a81836126f7565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886112e48c610fcf565b896040516020016112fa96959493929190615d33565b60405160208183030381529060405280519060200120905061132b8882611322878787612769565b886101f86127a8565b61133688888861154f565b5050505050505050565b6060808861134f610d9d610fab565b61135a610dc3610b69565b611362611fd3565b606061136c611829565b9050611376610771565b611423576000606061138b8d8d8d868b6127ff565b915091506113a461139a612842565b83101560cc6119e4565b6113b660006113b1612842565b612849565b6113c98b6113c2612842565b8403612849565b6113d38184612328565b808a5167ffffffffffffffff811180156113ec57600080fd5b50604051908082528060200260200182016040528015611416578160200160208202803683370190505b5095509550505050610ea9565b61142d8882611fdb565b600060606114558d8d8d8d8d6114416111b1565b61144b578d61144e565b60005b898e6122df565b915091506113c98b83612849565b600061146d610fab565b6001600160a01b0316826001600160a01b0316141561148f57506000196106af565b6114998383612853565b90506106af565b60001981565b60006107aa61287e565b60606107aa61204e565b80610bf48161291b565b610bf481831460676119e4565b6000828201610b2d84821015836119e4565b60006114f0848484612994565b506001901b60001901811b1992909216911b1790565b600061151f67ffffffffffffffff8311156101ba6119e4565b5090565b60006115338383111560016119e4565b50900390565b60008183106115485781610b2d565b5090919050565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906115aa908590615d0b565b60405180910390a3505050565b6115bf6129db565b6115c7611b00565b60006115d16111d4565b90506000806115ef836115e261204e565b6115ea610771565b61229c565b909250905081156116035761160382612a79565b61160c83612a8a565b801561161b5761161b81612a93565b505050565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c32639061164f908590600401615d0b565b60206040518083038186803b15801561166757600080fd5b505afa15801561167b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169f9190615a42565b9050816116d6576116af81611506565b6009805467ffffffffffffffff191667ffffffffffffffff92909216919091179055611787565b6002821415611724576116e881611506565b6009805467ffffffffffffffff9290921668010000000000000000026fffffffffffffffff000000000000000019909216919091179055611787565b600382141561177c5761173681611506565b6009805467ffffffffffffffff92909216600160801b027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff909216919091179055611787565b6117876101bb611f55565b817f6bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a826040516117b79190615d0b565b60405180910390a2505050565b60006117ce611805565b4211806107aa57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b606060006118356119c0565b905060608167ffffffffffffffff8111801561185057600080fd5b5060405190808252806020026020018201604052801561187a578160200160208202803683370190505b509050611885612a98565b8160008151811061189257fe5b6020026020010181815250506118a6612abc565b816001815181106118b357fe5b60200260200101818152505060028211156108fb576118d0612ae0565b816002815181106118dd57fe5b60200260200101818152505060038211156108fb576118fa612b04565b8160038151811061190757fe5b60200260200101818152505060048211156108fb57611924612b28565b8160048151811061193157fe5b60200260200101818152505060058211156108fb5761194e612b4c565b8160058151811061195b57fe5b60200260200101818152505060068211156108fb57611978612b70565b8160068151811061198557fe5b60200260200101818152505060078211156108fb576119a2612b94565b816007815181106119af57fe5b602002602001018181525050610ab8565b7f000000000000000000000000000000000000000000000000000000000000000090565b81610bf457610bf481611f55565b611a096001600160a01b03841615156101986119e4565b611a206001600160a01b03831615156101996119e4565b611a2b83838361161b565b6001600160a01b038316600090815260208190526040902054611a5190826101a0612bb8565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611a8090826114d1565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115aa908590615d0b565b6000611ae96000356001600160e01b031916610ed3565b9050610b66611af88233612bce565b6101916119e4565b61074b611b0b6117c4565b6101926119e4565b611b28611b1e612cb7565b82101560cb6119e4565b611b3d611b33612cc0565b82111560ca6119e4565b600854611b4e908260c0603f6114e3565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611b81908390615d0b565b60405180910390a150565b8015611bac57611ba7611b9d6117e1565b42106101936119e4565b611bc1565b611bc1611bb7611805565b42106101a96119e4565b6007805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611b81908390615ce8565b6000611c09610b69565b90506000611c15610fab565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b8152600401611c42929190615dac565b60806040518083038186803b158015611c5a57600080fd5b505afa158015611c6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c929190615a5a565b604051630639cdb560e21b81529094506001600160a01b03851693506318e736d49250611cc6915085908790600401615d93565b600060405180830381600087803b158015611ce057600080fd5b505af1158015611336573d6000803e3d6000fd5b600854611d03908260ff612ccc565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611d36908390615ce8565b60405180910390a180610b6657610b66612cf3565b6001901b6000190191901c1690565b6000606080611d6761204e565b9050600080611d768a84612d43565b9150915060006060611d8c8e8d878c888d612da9565b9092509050611da8838d838888611da38189611523565b612e3c565b909e909d509b505050505050505050505050565b81518151611dcb9082906114c4565b60005b81811015611e2557611e06848281518110611de557fe5b6020026020010151848381518110611df957fe5b6020026020010151612e66565b848281518110611e1257fe5b6020908102919091010152600101611dce565b50505050565b333014611ee9576000306001600160a01b0316600036604051611e4f929190615b8d565b6000604051808303816000865af19150503d8060008114611e8c576040519150601f19603f3d011682016040523d82523d6000602084013e611e91565b606091505b505090508060008114611ea057fe5b60046000803e6000516001600160e01b0319166343adbafb60e01b8114611ecb573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b611ef1611fd3565b6060611efb611829565b9050611f078782611fdb565b60006060611f1f8c8c8c8c8c8c898d8d63ffffffff16565b91509150611f3181848663ffffffff16565b8051601f1982018390526343adbafb603f1983015260200260231982016044820181fd5b610b66816210905360ea1b612eb7565b60008082511180156106af575060ff801682806020019051810190611f8a9190615a9a565b60ff161492915050565b61074b611f9f6111b1565b6101b66119e4565b600060606000611fb684612f18565b90506060611fc5878784612f2e565b919791965090945050505050565b61074b611b00565b81518151611fea9082906114c4565b60005b81811015611e255761202584828151811061200457fe5b602002602001015184838151811061201857fe5b6020026020010151612fdd565b84828151811061203157fe5b6020908102919091010152600101611fed565b610bf48282613013565b6060600061205a6119c0565b905060608167ffffffffffffffff8111801561207557600080fd5b5060405190808252806020026020018201604052801561209f578160200160208202803683370190505b5090507f0000000000000000000000000000000000000000000000000000000000000000816000815181106120d057fe5b6020026020010181815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061210a57fe5b60200260200101818152505060028211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160028151811061214d57fe5b60200260200101818152505060038211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160038151811061219057fe5b60200260200101818152505060048211156108fb577f0000000000000000000000000000000000000000000000000000000000000000816004815181106121d357fe5b60200260200101818152505060058211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160058151811061221657fe5b60200260200101818152505060068211156108fb577f00000000000000000000000000000000000000000000000000000000000000008160068151811061225957fe5b60200260200101818152505060078211156108fb577f0000000000000000000000000000000000000000000000000000000000000000816007815181106119af57fe5b60008060006122b4866122af6000610cb5565b6130df565b90506000806122c287613105565b915091506122d286838501613175565b9890975095505050505050565b60006060806122ec61204e565b90506000806122fb8a84612d43565b91509150600060606123118e8d878c888d613192565b9092509050611da8838d838888611da381896114d1565b815181516123379082906114c4565b60005b81811015611e255761237284828151811061235157fe5b602002602001015184838151811061236557fe5b602002602001015161320e565b84828151811061237e57fe5b602090810291909101015260010161233a565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156123d557610d11612a98565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561241757610d11612abc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561245957610d11612ae0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561249b57610d11612b04565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156124dd57610d11612b28565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561251f57610d11612b4c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561256157610d11612b70565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156125a357610d11612b94565b610d6e610135611f55565b6000610b2d8383612fdd565b6000806125cf6125c8610c6b565b849061325c565b9050610b2d8382611523565b6000612606836125ee8660200151613298565b846125fc8860400151613298565b88606001516135a2565b949350505050565b6000610b2d8383612e66565b60006126068361262d8660200151613298565b8461263b8860400151613298565b886060015161361d565b6000610b2d838361320e565b60006106af612666612661610c6b565b613693565b839061320e565b6000612677610fab565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156126af57600080fd5b505afa1580156126c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107aa919061574d565b60085490565b1c60019081161490565b670de0b6b3a764000060005b83518110156127595761274f61274885838151811061271e57fe5b602002602001015185848151811061273257fe5b60200260200101516136b990919063ffffffff16565b8390612fdd565b9150600101612703565b506106af600082116101376119e4565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b60006127b38561376a565b90506127c96127c3878387613786565b836119e4565b6127d8428410156101b86119e4565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b6000606061280b613835565b6128275761282761282261281d61204e565b613859565b612a93565b6128348787878787613abc565b915091509550959350505050565b620f424090565b610bf48282613b4c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006128eb613bdf565b30604051602001612900959493929190615d67565b60405160208183030381529060405280519060200120905090565b60028151101561292a57610b66565b60008160008151811061293957fe5b602002602001015190506000600190505b825181101561161b57600083828151811061296157fe5b6020026020010151905061298a816001600160a01b0316846001600160a01b03161060656119e4565b915060010161294a565b6129a3610100831060646119e4565b6129cc600182101580156129c557506129c160ff8461010003611539565b8211155b60646119e4565b61161b83821c156101b46119e4565b60408051600080825260208201909252606091612a0e565b6129fb6152ce565b8152602001906001900390816129f35790505b509050612a19610fab565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b8152600401612a449190615c19565b600060405180830381600087803b158015612a5e57600080fd5b505af1158015612a72573d6000803e3d6000fd5b5050505050565b610b66612a84611291565b82612849565b610b6681613be3565b600a55565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000612bc784841115836119e4565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b612bed610f87565b6001600160a01b031614158015612c085750612c0883613c03565b15612c3057612c15610f87565b6001600160a01b0316336001600160a01b03161490506106af565b612c3861266d565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b8152600401612c6793929190615d14565b60206040518083038186803b158015612c7f57600080fd5b505afa158015612c93573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114999190615608565b64e8d4a5100090565b67016345785d8a000090565b60006001821b1984168284612ce2576000612ce5565b60015b60ff16901b17949350505050565b612cfb6129db565b612d0b612d066111d4565b612a8a565b612d13613835565b61074b576000612d21610b34565b90506000612d3061281d61204e565b905081811115610bf457610bf481612a93565b6000806000612d50610771565b90506000612d5e85876126f7565b9050600080612d6e83888661229c565b90925090508015612d8257612d8281612a93565b8115612d9157612d9182612a79565b612d9b84836114d1565b989297509195505050505050565b600060606000612db884613c35565b90506000816003811115612dc857fe5b1415612de457612dda88888787613c4b565b9250925050612e31565b6001816003811115612df257fe5b1415612e0357612dda888686613d1a565b6002816003811115612e1157fe5b1415612e2457612dda8888888888613d38565b612e2f610150611f55565b505b965096945050505050565b6000612e4c878787878787613d97565b90508015612e5d57612e5d81612a79565b50505050505050565b6000612e7582151560046119e4565b82612e82575060006106af565b670de0b6b3a764000083810290612ea590858381612e9c57fe5b041460056119e4565b828181612eae57fe5b049150506106af565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b600081806020019051810190610b2d9190615ab6565b60606000612f3c8385612e66565b9050845167ffffffffffffffff81118015612f5657600080fd5b50604051908082528060200260200182016040528015612f80578160200160208202803683370190505b50915060005b8551811015612fd457612fb582878381518110612f9f57fe5b6020026020010151612fdd90919063ffffffff16565b838281518110612fc157fe5b6020908102919091010152600101612f86565b50509392505050565b6000828202613001841580612ffa575083858381612ff757fe5b04145b60036119e4565b670de0b6b3a764000090049392505050565b61302a6001600160a01b038316151561019b6119e4565b6130368260008361161b565b6001600160a01b03821660009081526020819052604090205461305c90826101b2612bb8565b6001600160a01b03831660009081526020819052604090205561308f61308a82613084610771565b90613e90565b613e9e565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516130d39190615d0b565b60405180910390a35050565b6000610b2d6130f66130ef611199565b8590612e66565b670de0b6b3a764000084613ea3565b600080613110613835565b1561312057506000905080613170565b600a54600061312e85613859565b905081811161314557600080935093505050613170565b61316a6131528284612e66565b670de0b6b3a76400006131656002610cb5565b613ea3565b93509150505b915091565b6000610b2d6131848484613eea565b61318d84613693565b613f04565b6000606060006131a184613f24565b905060018160048111156131b157fe5b14156131c457612dda8888888888613f3a565b60028160048111156131d257fe5b14156131e457612dda88888787613f8a565b60038160048111156131f257fe5b141561320357612dda888686613fe8565b612e2f610136611f55565b600061321d82151560046119e4565b8261322a575060006106af565b670de0b6b3a76400008381029061324490858381612e9c57fe5b82600182038161325057fe5b046001019150506106af565b6000828202613276841580612ffa575083858381612ff757fe5b806132855760009150506106af565b670de0b6b3a76400006000198201613250565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156132fb57507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561335c57507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156133bd57507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561341e57507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561347f57507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156134e057507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561354157507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156125a357507f0000000000000000000000000000000000000000000000000000000000000000610d6e565b60006135c46135b987670429d069189e0000612fdd565b8311156101306119e4565b60006135d087846114d1565b905060006135de888361320e565b905060006135ec8887612e66565b905060006135fa8383614006565b905061360f61360882613693565b8990612fdd565b9a9950505050505050505050565b600061363f61363485670429d069189e0000612fdd565b8311156101316119e4565b600061365561364e8685611523565b869061320e565b90506000613663858861320e565b905060006136718383614006565b9050600061368782670de0b6b3a7640000611523565b905061360f8a8261325c565b6000670de0b6b3a764000082106136ab5760006106af565b50670de0b6b3a76400000390565b6000670de0b6b3a76400008214156136d25750816106af565b671bc16d674ec800008214156136ec576114998384612fdd565b673782dace9d90000082141561371c5760006137088485612fdd565b90506137148182612fdd565b9150506106af565b6000613728848461408c565b9050600061374261373b8361271061325c565b60016114d1565b905080821015613757576000925050506106af565b6137618282611523565b925050506106af565b600061377461287e565b82604051602001610f08929190615b9d565b600061379882516041146101b96119e4565b60208281015160408085015160608601518251600080825295019283905292939092811a916001906137d1908990859088908890615dc3565b6020604051602081039080840390855afa1580156137f3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906138295750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b8051600090816138df61389c85838561386e57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b6138da866001815181106138ac57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b612fdd565b905060028211156139395761393261392b856002815181106138fd57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b8290612fdd565b9050613942565b9150610d6e9050565b60038211156139395761398c61392b8560038151811061395e57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b90506004821115613939576139d861392b856004815181106139aa57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b9050600582111561393957613a2461392b856005815181106139f657fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b9050600682111561393957613a7061392b85600681518110613a4257fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b90506007821115610b2d5761260661392b85600781518110613a8e57fe5b60200260200101517f000000000000000000000000000000000000000000000000000000000000000061418c565b600060606000613acb84613f24565b9050613ae66000826004811115613ade57fe5b1460ce6119e4565b6060613af18561422d565b9050613aff815187516114c4565b613b098187611fdb565b6060613b1361204e565b90506000613b2182846126f7565b90506000613b30828551613eea565b9050613b3b82612a8a565b9b929a509198505050505050505050565b613b586000838361161b565b613b6d61308a82613b67610771565b906114d1565b6001600160a01b038216600090815260208190526040902054613b9090826114d1565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906130d3908590615d0b565b4690565b610b66613bfe82600060c0613bf66126e7565b9291906114e3565b614243565b6000613c15631c74c91760e11b610ed3565b8214806106af5750613c2d6350dd6ed960e01b610ed3565b909114919050565b6000818060200190518101906106af91906157b7565b60006060600080613c5b85614258565b91509150613c6d8851821060646119e4565b6000613ca9898381518110613c7e57fe5b6020026020010151898481518110613c9257fe5b6020026020010151858a613ca4610c6b565b61427a565b90506060895167ffffffffffffffff81118015613cc557600080fd5b50604051908082528060200260200182016040528015613cef578160200160208202803683370190505b50905081818481518110613cff57fe5b60209081029190910101529299929850919650505050505050565b600060606000613d2984614330565b90506060611fc5878388614346565b60006060806000613d48856143e2565b91509150613d5882518a516114c4565b613d628288611fdb565b6000613d788a8a858a613d73610c6b565b6143fa565b9050613d888282111560cf6119e4565b99919850909650505050505050565b600082821015815b8751811015613e315781613de257613ddd888281518110613dbc57fe5b6020026020010151888381518110613dd057fe5b6020026020010151613e90565b613e12565b613e12888281518110613df157fe5b6020026020010151888381518110613e0557fe5b60200260200101516114d1565b888281518110613e1e57fe5b6020908102919091010152600101613d9f565b506000613e3e86896126f7565b90506000613e4c6000610cb5565b9050613e5782612a8a565b80613e685760009350505050613e86565b6000613e7f613e77848d612e66565b888885614538565b9450505050505b9695505050505050565b6000610b2d83836001612bb8565b600255565b60008383101580613eb2575081155b15613ebf57506000610b2d565b6000613ecb8486612e66565b670de0b6b3a7640000039050613ee18184612fdd565b95945050505050565b6000828202610b2d841580612ffa575083858381612ff757fe5b6000613f1382151560046119e4565b818381613f1c57fe5b049392505050565b6000818060200190518101906106af9190615878565b60006060806000613f4a8561455b565b91509150613f5a895183516114c4565b613f648288611fdb565b6000613f7a8a8a858a613f75610c6b565b614573565b9050613d888282101560d06119e4565b60006060600080613f9a856146ae565b91509150613fac8851821060646119e4565b6000613ca9898381518110613fbd57fe5b6020026020010151898481518110613fd157fe5b6020026020010151858a613fe3610c6b565b6146c5565b600060606000613ff78461475b565b90506060611fc5878388614771565b6000670de0b6b3a764000082141561401f5750816106af565b671bc16d674ec8000082141561403957611499838461325c565b673782dace9d900000821415614061576000614055848561325c565b9050613714818261325c565b600061406d848461408c565b9050600061408061373b8361271061325c565b905061376182826114d1565b6000816140a25750670de0b6b3a76400006106af565b826140af575060006106af565b6140bf60ff84901c1560066119e4565b826140e5770bce5086492111aea88f4bb1ca6bcf584181ea8059f76532841060076119e4565b826000670c7d713b49da0000831380156141065750670f43fc2c04ee000083125b1561413d57600061411684614803565b9050670de0b6b3a764000080820784020583670de0b6b3a76400008305020191505061414b565b816141478461492a565b0290505b670de0b6b3a76400009005614183680238fd42c5cf03ffff19821280159061417c575068070c1cc73b00c800008213155b60086119e4565b613e8681614cca565b60006001600160a01b0382161561421d5761421883836001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b1580156141da57600080fd5b505afa1580156141ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142129190615a42565b906136b9565b610b2d565b50670de0b6b3a764000092915050565b606081806020019051810190610b2d9190615893565b600854614252908260006150a8565b60085550565b6000808280602001905181019061426f9190615843565b909590945092505050565b6000806142918461428b8188611523565b9061320e565b90506142aa6709b6e64a8ec600008210156101326119e4565b60006142c86142c1670de0b6b3a764000089612e66565b8390614006565b905060006142df6142d883613693565b8a90612fdd565b905060006142f66142ef8a613693565b839061325c565b905060006143048383611523565b905060006143146125c889613693565b905061432082826114d1565b9c9b505050505050505050505050565b600081806020019051810190610b2d9190615817565b606060006143548484612e66565b90506060855167ffffffffffffffff8111801561437057600080fd5b5060405190808252806020026020018201604052801561439a578160200160208202803683370190505b50905060005b86518110156143d8576143b983888381518110612f9f57fe5b8282815181106143c557fe5b60209081029190910101526001016143a0565b5095945050505050565b606060008280602001905181019061426f91906157d2565b60006060845167ffffffffffffffff8111801561441657600080fd5b50604051908082528060200260200182016040528015614440578160200160208202803683370190505b5090506000805b8851811015614505576144a089828151811061445f57fe5b602002602001015161428b89848151811061447657fe5b60200260200101518c858151811061448a57fe5b602002602001015161152390919063ffffffff16565b8382815181106144ac57fe5b6020026020010181815250506144fb6144f48983815181106144ca57fe5b60200260200101518584815181106144de57fe5b602002602001015161325c90919063ffffffff16565b83906114d1565b9150600101614447565b50600061451689898986868a6150d4565b905061452b61452482613693565b879061325c565b9998505050505050505050565b60008061454f866145498688612e66565b85613ea3565b9050613e868482613175565b606060008280602001905181019061426f91906158d6565b60006060845167ffffffffffffffff8111801561458f57600080fd5b506040519080825280602002602001820160405280156145b9578160200160208202803683370190505b5090506000805b88518110156146675761461f8982815181106145d857fe5b60200260200101516146198984815181106145ef57fe5b60200260200101518c858151811061460357fe5b60200260200101516114d190919063ffffffff16565b90612e66565b83828151811061462b57fe5b60200260200101818152505061465d6144f489838151811061464957fe5b6020026020010151858481518110612f9f57fe5b91506001016145c0565b50600061467889898986868a6151e3565b90506000670de0b6b3a7640000821161469257600061360f565b61360f6146a783670de0b6b3a7640000611523565b8890612fdd565b6000808280602001905181019061426f9190615910565b6000806146d68461428b81886114d1565b90506146ef6729a2241af62c00008211156101336119e4565b60006147066142c1670de0b6b3a76400008961320e565b9050600061472661471f83670de0b6b3a7640000611523565b8a9061325c565b905060006147366142ef8a613693565b905060006147448383611523565b9050600061431461475489613693565b849061320e565b600081806020019051810190610b2d91906158f4565b6060600061477f848461320e565b90506060855167ffffffffffffffff8111801561479b57600080fd5b506040519080825280602002602001820160405280156147c5578160200160208202803683370190505b50905060005b86518110156143d8576147e4838883815181106144de57fe5b8282815181106147f057fe5b60209081029190910101526001016147cb565b670de0b6b3a7640000026000806ec097ce7bc90715b34b9f1000000000808401906ec097ce7bc90715b34b9f0fffffffff198501028161483f57fe5b05905060006ec097ce7bc90715b34b9f100000000082800205905081806ec097ce7bc90715b34b9f100000000081840205915060038205016ec097ce7bc90715b34b9f100000000082840205915060058205016ec097ce7bc90715b34b9f100000000082840205915060078205016ec097ce7bc90715b34b9f100000000082840205915060098205016ec097ce7bc90715b34b9f1000000000828402059150600b8205016ec097ce7bc90715b34b9f1000000000828402059150600d8205016ec097ce7bc90715b34b9f1000000000828402059150600f826002919005919091010295945050505050565b6000670de0b6b3a76400008212156149675761495d826ec097ce7bc90715b34b9f10000000008161495757fe5b0561492a565b6000039050610d6e565b60007e1600ef3172e58d2e933ec884fde10064c63b5372d805e203c000000000000083126149b857770195e54c5dd42177f53a27172fa9ec630262827000000000830592506806f05b59d3b2000000015b73011798004d755d3c8bc8e03204cf44619e00000083126149f0576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff00840008312614a38576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a7008312614a73576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf8508312614aaa57693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e28312614ae157690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d038312614b165768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb417461211108312614b4157680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d8312614b76576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f17757889379378312614bab576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b2866038312614bdf576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac8312614c13576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b600068056bc75e2d63100000840168056bc75e2d631000008086030281614c3657fe5b059050600068056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b6000614cf9680238fd42c5cf03ffff198312158015614cf2575068070c1cc73b00c800008313155b60096119e4565b6000821215614d2d57614d0e82600003614cca565b6ec097ce7bc90715b34b9f100000000081614d2557fe5b059050610d6e565b60006806f05b59d3b20000008312614d6d57506806f05b59d3b1ffffff1990910190770195e54c5dd42177f53a27172fa9ec630262827000000000614da3565b6803782dace9d90000008312614d9f57506803782dace9d8ffffff19909101906b1425982cf597cd205cef7380614da3565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac620000008412614df35768ad78ebc5ac61ffffff199093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d6310000008412614e2f576856bc75e2d630ffffff199093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b188000008412614e6957682b5e3af16b187fffff199093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c4000008412614ea3576815af1d78b58c3fffff199093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac62000008412614edc57680ad78ebc5ac61fffff199093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d631000008412614f155768056bc75e2d630fffff199093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b18800008412614f4e576802b5e3af16b187ffff199093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c400008412614f875768015af1d78b58c3ffff199093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116821b90821b198416179392505050565b670de0b6b3a764000060005b87518110156151d85760008582815181106150f757fe5b602002602001015185111561515a57600061512061511487613693565b8b8581518110612f9f57fe5b90506000615134828a868151811061448a57fe5b9050600061514461266688613693565b905061515083826114d1565b9350505050615171565b86828151811061516657fe5b602002602001015190505b600061519a8a848151811061518257fe5b6020026020010151614619848d878151811061448a57fe5b90506151cc6151c58a85815181106151ae57fe5b6020026020010151836136b990919063ffffffff16565b8590612fdd565b935050506001016150e0565b509695505050505050565b670de0b6b3a764000060005b87518110156151d85760008486838151811061520757fe5b6020026020010151111561526e57600061522c61511487670de0b6b3a7640000611523565b90506000615240828a868151811061448a57fe5b9050600061524e828861325c565b905061526461525d8383611523565b84906114d1565b9350505050615285565b86828151811061527a57fe5b602002602001015190505b60006152ae8a848151811061529657fe5b6020026020010151614619848d878151811061460357fe5b90506152c26151c58a85815181106151ae57fe5b935050506001016151ef565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b80356106af81615e62565b600082601f830112615319578081fd5b815161532c61532782615e42565b615e1b565b81815291506020808301908481018184028601820187101561534d57600080fd5b60005b8481101561536c57815184529282019290820190600101615350565b505050505092915050565b600082601f830112615387578081fd5b813567ffffffffffffffff81111561539d578182fd5b6153b0601f8201601f1916602001615e1b565b91508082528360208285010111156153c757600080fd5b8060208401602084013760009082016020015292915050565b8051600481106106af57600080fd5b8051600581106106af57600080fd5b8035600281106106af57600080fd5b60006020828403121561541e578081fd5b8135610b2d81615e62565b6000806040838503121561543b578081fd5b823561544681615e62565b9150602083013561545681615e62565b809150509250929050565b600080600060608486031215615475578081fd5b833561548081615e62565b9250602084013561549081615e62565b929592945050506040919091013590565b600080600080600080600060e0888a0312156154bb578283fd5b87356154c681615e62565b965060208801356154d681615e62565b9550604088013594506060880135935060808801356154f481615e77565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215615523578182fd5b823561552e81615e62565b946020939093013593505050565b600080600060608486031215615550578081fd5b835167ffffffffffffffff80821115615567578283fd5b818601915086601f83011261557a578283fd5b815161558861532782615e42565b80828252602080830192508086018b8283870289010111156155a8578788fd5b8796505b848710156155d35780516155bf81615e62565b8452600196909601959281019281016155ac565b5089015190975093505050808211156155ea578283fd5b506155f786828701615309565b925050604084015190509250925092565b600060208284031215615619578081fd5b81518015158114610b2d578182fd5b600080600080600080600060e0888a031215615642578081fd5b8735965060208089013561565581615e62565b9650604089013561566581615e62565b9550606089013567ffffffffffffffff80821115615681578384fd5b818b0191508b601f830112615694578384fd5b81356156a261532782615e42565b8082825285820191508585018f8788860288010111156156c0578788fd5b8795505b838610156156e25780358352600195909501949186019186016156c4565b509850505060808b0135955060a08b0135945060c08b0135925080831115615708578384fd5b50506157168a828b01615377565b91505092959891949750929550565b600060208284031215615736578081fd5b81356001600160e01b031981168114610b2d578182fd5b60006020828403121561575e578081fd5b8151610b2d81615e62565b6000806040838503121561577b578182fd5b823561578681615e62565b9150602083013567ffffffffffffffff8111156157a1578182fd5b6157ad85828601615377565b9150509250929050565b6000602082840312156157c8578081fd5b610b2d83836153e0565b6000806000606084860312156157e6578081fd5b6157f085856153e0565b9250602084015167ffffffffffffffff81111561580b578182fd5b6155f786828701615309565b60008060408385031215615829578182fd5b61583384846153e0565b9150602083015190509250929050565b600080600060608486031215615857578081fd5b61586185856153e0565b925060208401519150604084015190509250925092565b600060208284031215615889578081fd5b610b2d83836153ef565b600080604083850312156158a5578182fd5b6158af84846153ef565b9150602083015167ffffffffffffffff8111156158ca578182fd5b6157ad85828601615309565b6000806000606084860312156158ea578081fd5b6157f085856153ef565b60008060408385031215615906578182fd5b61583384846153ef565b600080600060608486031215615924578081fd5b61586185856153ef565b600080600060608486031215615942578081fd5b833567ffffffffffffffff80821115615959578283fd5b818601915061012080838903121561596f578384fd5b61597881615e1b565b905061598488846153fe565b815261599388602085016152fe565b60208201526159a588604085016152fe565b6040820152606083013560608201526080830135608082015260a083013560a08201526159d58860c085016152fe565b60c08201526159e78860e085016152fe565b60e082015261010080840135838111156159ff578586fd5b615a0b8a828701615377565b9183019190915250976020870135975060409096013595945050505050565b600060208284031215615a3b578081fd5b5035919050565b600060208284031215615a53578081fd5b5051919050565b60008060008060808587031215615a6f578182fd5b8451935060208501519250604085015191506060850151615a8f81615e62565b939692955090935050565b600060208284031215615aab578081fd5b8151610b2d81615e77565b60008060408385031215615ac8578182fd5b8251615ad381615e77565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015615b1f57815187529582019590820190600101615b03565b509495945050505050565b60008151808452815b81811015615b4f57602081850181015186830182015201615b33565b81811115615b605782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b81811015615c0d5783516001600160a01b031683529284019291840191600101615be8565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015615ca3578151805160048110615c4c57fe5b855280870151615c5e88870182615ae3565b508581015186860152606080820151615c7982880182615ae3565b505060809081015190615c8e86820183615ae3565b505060a0939093019290850190600101615c36565b5091979650505050505050565b600060208252610b2d6020830184615af0565b600060408252615cd66040830185615af0565b8281036020840152613ee18185615af0565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000838252604060208301526126066040830184615b2a565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610b2d6020830184615b2a565b6000838252604060208301526126066040830184615af0565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615e3a57600080fd5b604052919050565b600067ffffffffffffffff821115615e58578081fd5b5060209081020190565b6001600160a01b0381168114610b6657600080fd5b60ff81168114610b6657600080fdfea26469706673582212208e9a1a26b64de4f87bb963cb83363cb8bc872f588f58e43e43715bf71d5b477264736f6c634300070100336bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100de5760003560e01c80636634b7531161008c57806380773a931161006657806380773a9314610184578063851c1bb3146101975780638d928af8146101b7578063aaabadc5146101bf576100de565b80636634b753146101475780636c57f5a914610167578063739238d61461016f576100de565b80632f2770db116100bd5780632f2770db1461012d5780633f819b6f1461013757806354fd4d501461013f576100de565b8062c194db146100e3578063174481fa146101015780632da47c4014610117575b600080fd5b6100eb6101c7565b6040516100f89190610d93565b60405180910390f35b6101096101e6565b6040516100f8929190610d46565b61011f61022c565b6040516100f8929190610ead565b610135610296565b005b6100eb6102dd565b6100eb610373565b61015a610155366004610ae9565b6103d1565b6040516100f89190610d60565b61015a6103ef565b6101776103f8565b6040516100f89190610d32565b610177610192366004610b69565b61041c565b6101aa6101a5366004610b25565b6104f7565b6040516100f89190610d6b565b610177610549565b61017761056d565b60606101e160405180602001604052806000815250610639565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561028857807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610291565b60009250600091505b509091565b61029e610712565b6102a6610743565b6001805460ff1916811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156103695780601f1061033e57610100808354040283529160200191610369565b820191906000526020600020905b81548152906001019060200180831161034c57829003601f168201915b5050505050905090565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156103695780601f1061033e57610100808354040283529160200191610369565b6001600160a01b031660009081526020819052604090205460ff1690565b60015460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b600080600061042961022c565b915091506104e96040518060e001604052808c81526020018b81526020018a81526020018981526020018881526020018a5167ffffffffffffffff8111801561047157600080fd5b5060405190808252806020026020018201604052801561049b578160200160208202803683370190505b5081526020018790526104ac610549565b6104b46103f8565b8585896104bf6102dd565b6040516020016104d59796959493929190610da6565b604051602081830303815290604052610758565b9a9950505050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000008260405160200161052c929190610d1a565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610577610549565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156105af57600080fd5b505afa1580156105c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e19190610b4d565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506106336001600160a01b03831615156101ac6107c1565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016107048183866107d3565b505050505050505050919050565b60006107296000356001600160e01b0319166104f7565b90506107406107388233610811565b6101916107c1565b50565b61075661074e6103ef565b1560d36107c1565b565b6000610762610743565b600061076d836108a3565b6001600160a01b038116600081815260208190526040808220805460ff191660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b816107cf576107cf816108de565b5050565b5b602081106107f3578151835260209283019290910190601f19016107d4565b905182516020929092036101000a6000190180199091169116179052565b600061081b61056d565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161084a93929190610d74565b60206040518083038186803b15801561086257600080fd5b505afa158015610876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089a9190610b05565b90505b92915050565b600060606108b083610639565b905060008151602083016000f090506001600160a01b0381166108d7573d6000803e3d6000fd5b9392505050565b62461bcd60e51b600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b604452610740916210905360ea1b906242414c90606490fd5b803561089d81610f02565b600082601f830112610954578081fd5b813561096761096282610ee2565b610ebb565b81815291506020808301908481018184028601820187101561098857600080fd5b60005b848110156109b057813561099e81610f02565b8452928201929082019060010161098b565b505050505092915050565b600082601f8301126109cb578081fd5b81356109d961096282610ee2565b8181529150602080830190848101818402860182018710156109fa57600080fd5b60005b848110156109b0578135610a1081610f02565b845292820192908201906001016109fd565b600082601f830112610a32578081fd5b8135610a4061096282610ee2565b818152915060208083019084810181840286018201871015610a6157600080fd5b60005b848110156109b057813584529282019290820190600101610a64565b600082601f830112610a90578081fd5b813567ffffffffffffffff811115610aa6578182fd5b610ab9601f8201601f1916602001610ebb565b9150808252836020828501011115610ad057600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215610afa578081fd5b81356108d781610f02565b600060208284031215610b16578081fd5b815180151581146108d7578182fd5b600060208284031215610b36578081fd5b81356001600160e01b0319811681146108d7578182fd5b600060208284031215610b5e578081fd5b81516108d781610f02565b600080600080600080600060e0888a031215610b83578283fd5b873567ffffffffffffffff80821115610b9a578485fd5b610ba68b838c01610a80565b985060208a0135915080821115610bbb578485fd5b610bc78b838c01610a80565b975060408a0135915080821115610bdc578485fd5b610be88b838c01610944565b965060608a0135915080821115610bfd578485fd5b610c098b838c01610a22565b955060808a0135915080821115610c1e578485fd5b50610c2b8a828b016109bb565b93505060a08801359150610c428960c08a01610939565b905092959891949750929550565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015610c955781516001600160a01b031687529582019590820190600101610c70565b509495945050505050565b6000815180845260208085019450808401835b83811015610c9557815187529582019590820190600101610cb3565b60008151808452815b81811015610cf457602081850181015186830182015201610cd8565b81811115610d055782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b901515815260200190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b60006020825261089a6020830184610ccf565b600060e08252885160e080840152610dc26101c0840182610ccf565b905060208a015160df198085840301610100860152610de18383610ccf565b925060408c015191508085840301610120860152610dff8383610c5d565b925060608c015191508085840301610140860152610e1d8383610ca0565b925060808c015191508085840301610160860152610e3b8383610c5d565b925060a08c01519150808584030161018086015250610e5a8282610c5d565b91505060c08a01516101a0840152610e75602084018a610c50565b610e826040840189610c50565b866060840152856080840152610e9b60a0840186610c50565b82810360c08401526104e98185610ccf565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610eda57600080fd5b604052919050565b600067ffffffffffffffff821115610ef8578081fd5b5060209081020190565b6001600160a01b038116811461074057600080fdfea2646970667358221220f75d421bbe3257fe4fb00b1a536d6d85e7ce33db14aec242e3d17b5c352a779264736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/index.ts b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/index.ts new file mode 100644 index 0000000..977ee1d --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/index.ts @@ -0,0 +1,92 @@ +import { ethers } from 'hardhat'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import { bn, fp } from '@helpers/numbers'; +import * as expectEvent from '@helpers/expectEvent'; + +import { getContractDeploymentTransactionHash, saveContractDeploymentTransactionHash } from '@src'; +import { Task, TaskMode, TaskRunOptions } from '@src'; +import { WeightedPoolDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as WeightedPoolDeployment; + + const args = [input.Vault, input.ProtocolFeePercentagesProvider, input.FactoryVersion, input.PoolVersion]; + const factory = await task.deployAndVerify('WeightedPoolFactory', args, from, force); + + if (task.mode === TaskMode.LIVE) { + // We also create a Pool using the factory and verify it, to let us compute their action IDs and so that future + // Pools are automatically verified. We however don't run any of this code in CHECK mode, since we don't care about + // the contracts deployed here. The action IDs will be checked to be correct via a different mechanism. + const newWeightedPoolParams = { + name: 'DO NOT USE - Mock Weighted Pool', + symbol: 'TEST', + tokens: [input.WETH, input.BAL].sort(function (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()); + }), + normalizedWeights: [fp(0.8), fp(0.2)], + rateProviders: [ZERO_ADDRESS, ZERO_ADDRESS], + assetManagers: [ZERO_ADDRESS, ZERO_ADDRESS], + swapFeePercentage: bn(1e12), + }; + + // The pauseWindowDuration and bufferPeriodDuration will be filled in later, but we need to declare them here to + // appease the type system. Those are constructor arguments, but automatically provided by the factory. + const mockPoolArgs = { + params: newWeightedPoolParams, + vault: input.Vault, + protocolFeeProvider: input.ProtocolFeePercentagesProvider, + pauseWindowDuration: undefined, + bufferPeriodDuration: undefined, + owner: ZERO_ADDRESS, + version: input.PoolVersion, + }; + + // This mimics the logic inside task.deploy + if (force || !task.output({ ensure: false })['MockWeightedPool']) { + const poolCreationReceipt = await ( + await factory.create( + mockPoolArgs.params.name, + mockPoolArgs.params.symbol, + mockPoolArgs.params.tokens, + mockPoolArgs.params.normalizedWeights, + mockPoolArgs.params.rateProviders, + mockPoolArgs.params.swapFeePercentage, + mockPoolArgs.owner + ) + ).wait(); + const event = expectEvent.inReceipt(poolCreationReceipt, 'PoolCreated'); + const mockPoolAddress = event.args.pool; + + await saveContractDeploymentTransactionHash(mockPoolAddress, poolCreationReceipt.transactionHash, task.network); + await task.save({ MockWeightedPool: mockPoolAddress }); + } + + const mockPool = await task.instanceAt('WeightedPool', task.output()['MockWeightedPool']); + + // In order to verify the Pool's code, we need to complete its constructor arguments by computing the factory + // provided arguments (pause durations). + + // The durations require knowing when the Pool was created, so we look for the timestamp of its creation block. + const txHash = await getContractDeploymentTransactionHash(mockPool.address, task.network); + const tx = await ethers.provider.getTransactionReceipt(txHash); + const poolCreationBlock = await ethers.provider.getBlock(tx.blockNumber); + + // With those and the period end times, we can compute the durations. + const { pauseWindowEndTime, bufferPeriodEndTime } = await mockPool.getPausedState(); + mockPoolArgs.pauseWindowDuration = pauseWindowEndTime.sub(poolCreationBlock.timestamp); + mockPoolArgs.bufferPeriodDuration = bufferPeriodEndTime + .sub(poolCreationBlock.timestamp) + .sub(mockPoolArgs.pauseWindowDuration); + + // We are now ready to verify the Pool + await task.verify('WeightedPool', mockPool.address, [ + mockPoolArgs.params, + mockPoolArgs.vault, + mockPoolArgs.protocolFeeProvider, + mockPoolArgs.pauseWindowDuration, + mockPoolArgs.bufferPeriodDuration, + mockPoolArgs.owner, + mockPoolArgs.version, + ]); + } +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/input.ts b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/input.ts new file mode 100644 index 0000000..be6d4c3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/input.ts @@ -0,0 +1,26 @@ +import { Task, TaskMode } from '@src'; + +export type WeightedPoolDeployment = { + Vault: string; + ProtocolFeePercentagesProvider: string; + FactoryVersion: string; + PoolVersion: string; + WETH: string; + BAL: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); +const WETH = new Task('00000000-tokens', TaskMode.READ_ONLY); +const BAL = new Task('00000000-tokens', TaskMode.READ_ONLY); + +const BaseVersion = { version: 3, deployment: '20230206-weighted-pool-v3' }; + +export default { + Vault, + ProtocolFeePercentagesProvider, + WETH, + BAL, + FactoryVersion: JSON.stringify({ name: 'WeightedPoolFactory', ...BaseVersion }), + PoolVersion: JSON.stringify({ name: 'WeightedPool', ...BaseVersion }), +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/arbitrum.json new file mode 100644 index 0000000..7cee5f9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/arbitrum.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0xf1665E19bc105BE4EDD3739F88315cC699cc5b65", + "MockWeightedPool": "0x96d7e549eA1d810725e4Cd1f51ed6b4AE8496338" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/avalanche.json b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/avalanche.json new file mode 100644 index 0000000..456412d --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/avalanche.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0x94f68b54191F62f781Fe8298A8A5Fa3ed772d227", + "MockWeightedPool": "0xE867AD0a48e8f815DC0cda2CDb275e0F163A480b" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/bsc.json b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/bsc.json new file mode 100644 index 0000000..485773a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/bsc.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0x6e4cF292C5349c79cCd66349c3Ed56357dD11B46", + "MockWeightedPool": "0x463957510888720f1EA65B599e996aaD4264206A" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/gnosis.json b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/gnosis.json new file mode 100644 index 0000000..2d49425 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/gnosis.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0xC128a9954e6c874eA3d62ce62B468bA073093F25", + "MockWeightedPool": "0xE051605A83dEAe38d26a7346B100EF1AC2ef8a0b" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/goerli.json new file mode 100644 index 0000000..e44b759 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/goerli.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0x26575A44755E0aaa969FDda1E4291Df22C5624Ea", + "MockWeightedPool": "0x0441ff033652bcEB75a011887F17B5dfC84Ddc6f" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/mainnet.json new file mode 100644 index 0000000..f5c80cf --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0x5Dd94Da3644DDD055fcf6B3E1aa310Bb7801EB8b", + "MockWeightedPool": "0x1576d472d82A72a1Ec7C57FcA770BD752D124A62" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/optimism.json b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/optimism.json new file mode 100644 index 0000000..32e9bf6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/optimism.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0xA0DAbEBAAd1b243BBb243f933013d560819eB66f", + "MockWeightedPool": "0xbC99aa9bD55d3f8431Ecec24Da03AEc1D6e62754" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/polygon.json new file mode 100644 index 0000000..3211668 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/output/polygon.json @@ -0,0 +1,4 @@ +{ + "WeightedPoolFactory": "0x82e4cFaef85b1B6299935340c964C942280327f4", + "MockWeightedPool": "0x93ECf386cD53718aF16a09C325a56D1bB60aDc37" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/readme.md b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/readme.md new file mode 100644 index 0000000..b0d2539 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/readme.md @@ -0,0 +1,20 @@ +# 2023-02-06 - Weighted Pool Factory V3 + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> This deployment has been deprecated in favor of a new version that uses create2 for pool deployments: [weighted-pool-v4](../../20230320-weighted-pool-v4/). + +Deployment of the `WeightedPoolFactory`, which allows creating Weighted Pools. +Supersedes `20220908-weighted-pool-v2`, fixing the reentrancy issue described in this [forum post](https://forum.balancer.fi/t/reentrancy-vulnerability-scope-expanded/4345). + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`WeightedPool` artifact](./artifact/WeightedPool.json) +- [`WeightedPoolFactory` artifact](./artifact/WeightedPoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/test/task.fork.ts new file mode 100644 index 0000000..302da0c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230206-weighted-pool-v3/test/task.fork.ts @@ -0,0 +1,342 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { sharedBeforeEach } from '@helpers/sharedBeforeEach'; +import { BasePoolEncoder } from '@helpers/models/pools/utils/encoder'; +import { WeightedPoolEncoder } from '@helpers/models/pools/weighted/encoder'; +import { SwapKind } from '@helpers/models/types/types'; +import { toNormalizedWeights } from '@helpers/models/pools/weighted/normalizedWeights'; +import * as expectEvent from '@helpers/expectEvent'; +import { fp } from '@helpers/numbers'; +import { expectEqualWithError } from '@helpers/relativeError'; +import { actionId } from '@helpers/models/misc/actions'; +import { MAX_UINT256, ZERO_ADDRESS } from '@helpers/constants'; +import { deploy } from '@src'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; + +import { getSigner, impersonate, getForkedNetwork, Task, TaskMode, describeForkTest } from '@src'; + +describeForkTest('WeightedPool V3', 'mainnet', 16577000, function () { + let owner: SignerWithAddress, + whale: SignerWithAddress, + wstEthWhale: SignerWithAddress, + govMultisig: SignerWithAddress; + let factory: Contract, + vault: Contract, + authorizer: Contract, + uni: Contract, + comp: Contract, + aave: Contract, + wstEth: Contract, + math: Contract; + + let task: Task; + + const COMP = '0xc00e94cb662c3520282e6f5717214004a7f26888'; + const UNI = '0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984'; + const AAVE = '0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9'; + const WSTETH = '0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0'; + + const tokens = [UNI, AAVE, COMP]; + const initialBalanceCOMP = fp(1e4); + const initialBalanceUNI = fp(1e5); + const initialBalanceAAVE = fp(1e4); + const initialBalances = [initialBalanceUNI, initialBalanceAAVE, initialBalanceCOMP]; + + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + const LARGE_TOKEN_HOLDER = '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503'; + const WSTETH_TOKEN_HOLDER = '0x4b5a787ac6921cdefc57d8823ebd4d211f8e0519'; + + const NAME = 'Balancer Pool Token'; + const SYMBOL = 'BPT'; + const POOL_SWAP_FEE_PERCENTAGE = fp(0.01); + const WEIGHTS = toNormalizedWeights([fp(20), fp(30), fp(50)]); + + const COMP_WSTETH_WEIGHTED_POOL_V2 = '0x496ff26B76b8d23bbc6cF1Df1eeE4a48795490F7'; + + enum AttackType { + DISABLE_RECOVERY_MODE, + UPDATE_PROTOCOL_FEE_CACHE, + } + + before('run task', async () => { + task = new Task('20230206-weighted-pool-v3', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('WeightedPoolFactory'); + }); + + before('load signers', async () => { + owner = await getSigner(); + whale = await impersonate(LARGE_TOKEN_HOLDER); + wstEthWhale = await impersonate(WSTETH_TOKEN_HOLDER); + + govMultisig = await impersonate(GOV_MULTISIG); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + authorizer = await new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance( + 'Authorizer' + ); + const managedPoolTask = await new Task('20221021-managed-pool', TaskMode.READ_ONLY, getForkedNetwork(hre)); + const managedPoolFactory = await managedPoolTask.deployedInstance('ManagedPoolFactory'); + math = await managedPoolTask.instanceAt('ExternalWeightedMath', await managedPoolFactory.getWeightedMath()); + + comp = await task.instanceAt('IERC20', COMP); + uni = await task.instanceAt('IERC20', UNI); + aave = await task.instanceAt('IERC20', AAVE); + wstEth = await task.instanceAt('IERC20', WSTETH); + }); + + async function createPool(): Promise { + const receipt = await ( + await factory.create( + NAME, + SYMBOL, + tokens, + WEIGHTS, + [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS], + POOL_SWAP_FEE_PERCENTAGE, + owner.address + ) + ).wait(); + + const event = expectEvent.inReceipt(receipt, 'PoolCreated'); + return task.instanceAt('WeightedPool', event.args.pool); + } + + async function initPool(poolId: string) { + await comp.connect(whale).approve(vault.address, MAX_UINT256); + await uni.connect(whale).approve(vault.address, MAX_UINT256); + await aave.connect(whale).approve(vault.address, MAX_UINT256); + + const userData = WeightedPoolEncoder.joinInit(initialBalances); + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: tokens, + maxAmountsIn: initialBalances, + fromInternalBalance: false, + userData, + }); + } + + describe('getters', () => { + it('check factory version', async () => { + const expectedFactoryVersion = { + name: 'WeightedPoolFactory', + version: 3, + deployment: '20230206-weighted-pool-v3', + }; + + expect(await factory.version()).to.equal(JSON.stringify(expectedFactoryVersion)); + }); + + it('check pool version', async () => { + const pool = await createPool(); + + const expectedPoolVersion = { + name: 'WeightedPool', + version: 3, + deployment: '20230206-weighted-pool-v3', + }; + + expect(await pool.version()).to.equal(JSON.stringify(expectedPoolVersion)); + }); + }); + + describe('create and swap', () => { + let pool: Contract; + let poolId: string; + + it('deploy a weighted pool', async () => { + pool = await createPool(); + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + + expect(registeredAddress).to.equal(pool.address); + }); + + it('initialize the pool', async () => { + await initPool(poolId); + + const { balances } = await vault.getPoolTokens(poolId); + expect(balances).to.deep.equal(initialBalances); + }); + + it('swap in the pool', async () => { + const amount = fp(500); + await comp.connect(whale).transfer(owner.address, amount); + await comp.connect(owner).approve(vault.address, amount); + + await vault + .connect(owner) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: COMP, assetOut: UNI, amount, userData: '0x' }, + { sender: owner.address, recipient: owner.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert pool swap + const expectedUNI = await math.calcOutGivenIn( + initialBalanceCOMP, + WEIGHTS[tokens.indexOf(COMP)], + initialBalanceUNI, + WEIGHTS[tokens.indexOf(UNI)], + amount + ); + expectEqualWithError(await comp.balanceOf(owner.address), 0, 0.0001); + expectEqualWithError(await uni.balanceOf(owner.address), expectedUNI, 0.1); + }); + }); + + describe('read-only reentrancy protection', () => { + let pool: Contract; + let poolId: string; + let attacker: Contract; + const attackerFunds = fp(1); + + sharedBeforeEach('deploy and fund attacker', async () => { + attacker = await deploy('ReadOnlyReentrancyAttackerWP', [vault.address]); + await comp.connect(whale).transfer(attacker.address, attackerFunds); + await uni.connect(whale).transfer(attacker.address, attackerFunds); + await aave.connect(whale).transfer(attacker.address, attackerFunds); + await wstEth.connect(wstEthWhale).transfer(attacker.address, attackerFunds); + }); + + context('when the target pool is not protected', () => { + sharedBeforeEach('get affected pool instance', async () => { + pool = await task.instanceAt('WeightedPool', COMP_WSTETH_WEIGHTED_POOL_V2); + poolId = await pool.getPoolId(); + }); + + itPerformsAttack(false); + }); + + context('when the target pool is protected', () => { + sharedBeforeEach('deploy pool and attacker', async () => { + pool = await createPool(); + poolId = await pool.getPoolId(); + + await initPool(poolId); + }); + + itPerformsAttack(true); + }); + + function itPerformsAttack(expectRevert: boolean) { + const action = expectRevert ? 'rejects' : 'does not reject'; + + context('update protocol fee cache', () => { + it(`${action} protocol fee cache attack`, async () => { + await performAttack(AttackType.UPDATE_PROTOCOL_FEE_CACHE, expectRevert); + }); + }); + + context('disable recovery mode', () => { + sharedBeforeEach('grant permissions to attacker', async () => { + await authorizer + .connect(govMultisig) + .grantRole(await actionId(pool, 'disableRecoveryMode'), attacker.address); + }); + + it(`${action} disable recovery mode attack`, async () => { + await performAttack(AttackType.DISABLE_RECOVERY_MODE, expectRevert); + }); + }); + } + + async function performAttack(attackType: AttackType, expectRevert: boolean) { + const attackTokens = (await vault.getPoolTokens(poolId)).tokens; + + const joinRequest = { + assets: attackTokens, + maxAmountsIn: Array(attackTokens.length).fill(MAX_UINT256), + userData: WeightedPoolEncoder.joinExactTokensInForBPTOut(Array(attackTokens.length).fill(attackerFunds), 0), + fromInternalBalance: false, + }; + + const attack = attacker.startAttack(poolId, joinRequest, attackType, { value: 10 }); + if (expectRevert) { + await expect(attack).to.be.revertedWith('BAL#420'); + } else { + await expect(attack).to.not.be.reverted; + } + } + }); + + describe('recovery mode', () => { + let pool: Contract; + let poolId: string; + + before('deploy and initialize a weighted pool', async () => { + pool = await createPool(); + poolId = await pool.getPoolId(); + + await comp.connect(whale).approve(vault.address, MAX_UINT256); + await uni.connect(whale).approve(vault.address, MAX_UINT256); + await aave.connect(whale).approve(vault.address, MAX_UINT256); + + const userData = WeightedPoolEncoder.joinInit(initialBalances); + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: tokens, + maxAmountsIn: initialBalances, + fromInternalBalance: false, + userData, + }); + }); + + before('enter recovery mode', async () => { + await authorizer.connect(govMultisig).grantRole(await actionId(pool, 'enableRecoveryMode'), govMultisig.address); + await pool.connect(govMultisig).enableRecoveryMode(); + expect(await pool.inRecoveryMode()).to.be.true; + }); + + it('can exit via recovery mode', async () => { + const bptBalance = await pool.balanceOf(owner.address); + expect(bptBalance).to.gt(0); + + const vaultUNIBalanceBeforeExit = await uni.balanceOf(vault.address); + const ownerUNIBalanceBeforeExit = await uni.balanceOf(owner.address); + + const userData = BasePoolEncoder.recoveryModeExit(bptBalance); + await vault.connect(owner).exitPool(poolId, owner.address, owner.address, { + assets: tokens, + minAmountsOut: Array(tokens.length).fill(0), + fromInternalBalance: false, + userData, + }); + + const remainingBalance = await pool.balanceOf(owner.address); + expect(remainingBalance).to.equal(0); + + const vaultUNIBalanceAfterExit = await uni.balanceOf(vault.address); + const ownerUNIBalanceAfterExit = await uni.balanceOf(owner.address); + + expect(vaultUNIBalanceAfterExit).to.lt(vaultUNIBalanceBeforeExit); + expect(ownerUNIBalanceAfterExit).to.gt(ownerUNIBalanceBeforeExit); + }); + }); + + describe('factory disable', () => { + it('the factory can be disabled', async () => { + await authorizer.connect(govMultisig).grantRole(await actionId(factory, 'disable'), govMultisig.address); + await factory.connect(govMultisig).disable(); + + expect(await factory.isDisabled()).to.be.true; + + await expect( + factory + .connect(owner) + .create( + NAME, + SYMBOL, + tokens, + WEIGHTS, + [ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS], + POOL_SWAP_FEE_PERCENTAGE, + owner.address + ) + ).to.be.revertedWith('BAL#211'); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/artifact/GearboxLinearPool.json b/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/artifact/GearboxLinearPool.json new file mode 100644 index 0000000..28520cc --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/artifact/GearboxLinearPool.json @@ -0,0 +1,1245 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GearboxLinearPool", + "sourceName": "contracts/gearbox-linear-pool/GearboxLinearPool.sol", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "assetManager", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + } + ], + "internalType": "struct GearboxLinearPool.ConstructorArgs", + "name": "args", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "paused", + "type": "bool" + } + ], + "name": "PausedStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "RecoveryModeStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + } + ], + "name": "SwapFeePercentageChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lowerTarget", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + } + ], + "name": "TargetsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "enableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBptIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMainIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMainToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getNextNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPausedState", + "outputs": [ + { + "internalType": "bool", + "name": "paused", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "pauseWindowEndTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodEndTime", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeesCollector", + "outputs": [ + { + "internalType": "contract IProtocolFeesCollector", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getScalingFactors", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSwapFeePercentage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTargets", + "outputs": [ + { + "internalType": "uint256", + "name": "lowerTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVirtualSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedTokenRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "inRecoveryMode", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onExitPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "dueProtocolFees", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onJoinPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "dueProtocolFees", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IERC20", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IPoolSwapStructs.SwapRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "indexIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "indexOut", + "type": "uint256" + } + ], + "name": "onSwap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IERC20", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IPoolSwapStructs.SwapRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "balanceTokenIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balanceTokenOut", + "type": "uint256" + } + ], + "name": "onSwap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryExit", + "outputs": [ + { + "internalType": "uint256", + "name": "bptIn", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryJoin", + "outputs": [ + { + "internalType": "uint256", + "name": "bptOut", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + } + ], + "name": "setSwapFeePercentage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newLowerTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newUpperTarget", + "type": "uint256" + } + ], + "name": "setTargets", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6102c06040523480156200001257600080fd5b506040516200598338038062005983833981016040819052620000359162000df2565b6101608101518151602083015160408401516060850151608086015160c087015162000061886200047d565b60e08901516101008a01516101208b01516101408c01518a6200009e8160006200008c8c8c62000506565b89620005b760201b620014241760201c565b8b8b86868686838387878b86336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000ed92919062000c7b565b5080516200010390600490602084019062000c7b565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001829050630163f50083111561019462000785565b620001966276a70082111561019562000785565b4291909101610140819052016101605260601b6001600160601b031916610180526101a08690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000db3565b6001600160a01b03166101c0816001600160a01b031660601b8152505050505050505050876001600160a01b03166101e0816001600160a01b031660601b81525050866001600160a01b0316610200816001600160a01b031660601b81525050866001600160a01b0316886001600160a01b031610620002bb576002620002be565b60015b60ff16610220526001600160a01b0380881690891610620002e1576001620002e4565b60025b60ff1661024052620002f6886200079a565b6102605262000305876200079a565b6102805260006200031889828962000846565b620003238562000940565b50508a51620003469a506009995060208c019850965062000c7b95505050505050565b5050600081608001516001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038857600080fd5b505afa1580156200039d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003c3919062000db3565b905062000465816001600160a01b0316632495a5996040518163ffffffff1660e01b815260040160206040518083038186803b1580156200040357600080fd5b505afa15801562000418573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200043e919062000db3565b6001600160a01b031683606001516001600160a01b0316146102086200078560201b60201c565b60601b6001600160601b0319166102a052506200106f565b6040805160028082526060808301845292839291906020830190803683370190505090508260a0015181600081518110620004b457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260a0015181600181518110620004e757fe5b6001600160a01b03909216602092830291909101909101529050919050565b60408051600280825260608281019093526001600160a01b0384811690861610918391816020016020820280368337019050509050816200054857836200054a565b845b816000815181106200055857fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508162000585578462000587565b835b816001815181106200059557fe5b6001600160a01b03909216602092830291909101909101529150505b92915050565b6000620005cf83620009cf60201b620015d91760201c565b606083516001016001600160401b0381118015620005ec57600080fd5b5060405190808252806020026020018201604052801562000617578160200160208202803683370190505b50905030816000815181106200062957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156200069c578481815181106200066357fe5b60200260200101518282600101815181106200067b57fe5b6001600160a01b03909216602092830291909101909101526001016200064c565b50606083516001016001600160401b0381118015620006ba57600080fd5b50604051908082528060200260200182016040528015620006e5578160200160208202803683370190505b509050600081600081518110620006f857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156200076b578481815181106200073257fe5b60200260200101518282600101815181106200074a57fe5b6001600160a01b03909216602092830291909101909101526001016200071b565b506200077a87878484620009db565b979650505050505050565b816200079657620007968162000ad5565b5050565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620007d757600080fd5b505afa158015620007ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000812919062000f49565b60ff16905060006200083160128362000aea60201b620015e71760201c565b600a0a670de0b6b3a764000002949350505050565b620008578183111561014c62000785565b620008746b0de0b6b39983494c589c000082111561014d62000785565b6200088e670de0b6b3a7640000825b061561016162000785565b620008a2670de0b6b3a76400008362000883565b620008f1670de0b6b3a7640000820460406020620008db670de0b6b3a764000087600854919004602080620015fd62000b02821b17811c565b62000b0260201b620015fd17909392919060201c565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d12809062000933908590859062001018565b60405180910390a2505050565b6200095564e8d4a5100082101560cb62000785565b6200096d67016345785d8a000082111560ca62000785565b6200098f8160c0603f60085462000b0260201b620015fd17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90620009c49083906200100f565b60405180910390a150565b80620007968162000b27565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040162000a0c919062000ffa565b602060405180830381600087803b15801562000a2757600080fd5b505af115801562000a3c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a62919062000dd9565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000a979084908890889060040162000f6c565b600060405180830381600087803b15801562000ab257600080fd5b505af115801562000ac7573d6000803e3d6000fd5b509298975050505050505050565b62000ae7816210905360ea1b62000bb3565b50565b600062000afc83831115600162000785565b50900390565b600062000b1184848462000c14565b506001901b60001901811b1992909216911b1790565b60028151101562000b385762000ae7565b60008160008151811062000b4857fe5b602002602001015190506000600190505b825181101562000bae57600083828151811062000b7257fe5b6020026020010151905062000ba3816001600160a01b0316846001600160a01b03161060656200078560201b60201c565b915060010162000b59565b505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b62000c256101008310606462000785565b62000c5e6001821015801562000c56575062000c5260ff846101000362000c6f60201b620016201760201c565b8211155b606462000785565b62000bae83821c156101b462000785565b80820390821102900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000cbe57805160ff191683800117855562000cee565b8280016001018555821562000cee579182015b8281111562000cee57825182559160200191906001019062000cd1565b5062000cfc92915062000d00565b5090565b5b8082111562000cfc576000815560010162000d01565b8051620005b18162001059565b600082601f83011262000d35578081fd5b81516001600160401b0381111562000d4b578182fd5b602062000d61601f8301601f1916820162001026565b9250818352848183860101111562000d7857600080fd5b60005b8281101562000d9857848101820151848201830152810162000d7b565b8281111562000daa5760008284860101525b50505092915050565b60006020828403121562000dc5578081fd5b815162000dd28162001059565b9392505050565b60006020828403121562000deb578081fd5b5051919050565b60006020828403121562000e04578081fd5b81516001600160401b038082111562000e1b578283fd5b818401915061018080838703121562000e32578384fd5b62000e3d8162001026565b905062000e4b868462000d17565b815260208301518281111562000e5f578485fd5b62000e6d8782860162000d24565b60208301525060408301518281111562000e85578485fd5b62000e938782860162000d24565b60408301525062000ea8866060850162000d17565b606082015262000ebc866080850162000d17565b608082015262000ed08660a0850162000d17565b60a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014062000f128782860162000d17565b90820152610160838101518381111562000f2a578586fd5b62000f388882870162000d24565b918301919091525095945050505050565b60006020828403121562000f5b578081fd5b815160ff8116811462000dd2578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000fb85762000fa585516200104d565b8352938301939183019160010162000f90565b505084810360408601528551808252908201925081860190845b8181101562000ac75762000fe783516200104d565b8552938301939183019160010162000fd2565b60208101600383106200100957fe5b91905290565b90815260200190565b918252602082015260400190565b6040518181016001600160401b03811182821017156200104557600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b038116811462000ae757600080fd5b60805160a05160c05160e0516101005160601c6101205160601c61014051610160516101805160601c6101a0516101c05160601c6101e05160601c6102005160601c610220516102405161026051610280516102a05160601c61477a62001209600039806118435250806107f45250806107905280612a81525080610718528061081c5280610c515280612efc528061308552806131bd52806132c85280613445528061357d5250806107b252806109bc5280610c175280612ec8528061300a528061305152806131475280613189528061329452806133cf5280613411528061350752806135495250806113f852806126eb52806127b75280612aa75280612e7d5280612f96528061324a528061335b5250806109e052806110ee5280611ab15280611b5052806126a2528061276e5280612a465280612e3e5280612f4052806130d3528061320b528061330c52806134935250806111cc5250806109495250508061181d5250806117f9525080610fd1525080610fad525080610f5d5250806123df525080612421525080612400525061477a6000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e3660046140ae565b610608565b6040516103509190614441565b60405180910390f35b610361610668565b6040516103509190614685565b61038161037c366004613e80565b6106ff565b604051610350919061441e565b610343610716565b61034361073a565b6103a6610740565b60405161035093929190614429565b6103bd610769565b60405161035091906143e6565b6103816103d8366004613dd0565b610877565b6103e56108ed565b60405161035091906146bf565b6103436108f6565b61040d61040836600461416b565b610905565b005b610343610947565b610381610425366004613e80565b61096b565b61040d6109a6565b6103436109ba565b6104426109de565b604051610350919061433b565b61040d610a02565b610361610a56565b610343610ab7565b61047a610475366004613faf565b610aca565b604051610350929190614698565b610490610ae8565b6040516103509291906146b1565b610343610b26565b6103436104b4366004613d7c565b610cbb565b6104cc6104c7366004613faf565b610cda565b6040516103509291906143f9565b6103436104e8366004613d7c565b610d9c565b61040d610da7565b610343610f42565b61040d610f47565b610343610513366004614052565b610f59565b610442610fab565b610442610fcf565b610343610536366004613d7c565b610ff3565b61036161100e565b61034361055136600461411f565b61106f565b61040d610564366004614183565b6110a8565b610381610577366004613e80565b61111a565b61038161058a366004613e80565b611158565b610442611165565b61038161116f565b61040d611180565b6104426111ca565b61040d6105bd366004613e10565b6111ee565b6104cc6105d0366004613faf565b61126f565b6103436105e3366004613d98565b611306565b610343611343565b6103436113ec565b6104426113f6565b61034361141a565b6000846080015161063561061a610fcf565b6001600160a01b0316336001600160a01b03161460cd61162c565b61064a610640610947565b82146101f461162c565b61065261163a565b61065e8686868661164d565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b505050505090505b90565b600061070c338484611772565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074d6117da565b1592506107586117f7565b915061076261181b565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107db57fe5b6020026020010181815250506108196107f261183f565b7f00000000000000000000000000000000000000000000000000000000000000009061191b565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084557fe5b602002602001018181525050670de0b6b3a76400008160008151811061086757fe5b6020908102919091010152905090565b6000806108848533611306565b90506108a8336001600160a01b03871614806108a05750838210155b61019e61162c565b6108b3858585611953565b336001600160a01b038616148015906108ce57506000198114155b156108e0576108e08533858403611772565b60019150505b9392505050565b60055460ff1690565b60006109006113ec565b905090565b61090d611a33565b610915611a7c565b600080610920610ae8565b915091506109396109318383611a8c565b61014f61162c565b61094283611b93565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070c9185906109a19086611c0b565b611772565b6109ae611a33565b6109b86000611c1d565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a0a611a33565b610a12611cae565b610a1c6001611cc2565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4c919061441e565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906109009060c0603f611d04565b60006060610adc888785611d13611d2a565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0582602080611d04565b029250670de0b6b3a7640000610b1e8260406020611d04565b029150509091565b600080610b31610947565b90506060610b3d610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b689190614441565b60006040518083038186803b158015610b8057600080fd5b505afa158015610b94573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbc9190810190613eab565b50915050610bd181610bcc610769565b611e91565b600080610bdc610ae8565b91509150610be8613aed565b6040518060600160405280610bfb610ab7565b81526020018481526020018381525090506000610c87610c4e867f000000000000000000000000000000000000000000000000000000000000000081518110610c4057fe5b602002602001015184611efa565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7a57fe5b6020026020010151611f5b565b9050610cb0610ca986600081518110610c9c57fe5b6020026020010151611f67565b8290611f7b565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce961061a610fcf565b610cf4610640610947565b6000610cff85611fd2565b15610d2757610d0c612001565b610d1e88610d1861073a565b87612014565b94509050610d3f565b610d2f61163a565b610d3a8a8987611d13565b945090505b610d498a8261210a565b835167ffffffffffffffff81118015610d6157600080fd5b50604051908082528060200260200182016040528015610d8b578160200160208202803683370190505b509250505097509795505050505050565b600061071082610ff3565b6000610db1610947565b90506060610dbd610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de89190614441565b60006040518083038186803b158015610e0057600080fd5b505afa158015610e14573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3c9190810190613eab565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e8057fe5b602002602001018181525050610e94613b0e565b6040518060800160405280610ea8856106fc565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed9610fcf565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f0a9493929190614469565b600060405180830381600087803b158015610f2457600080fd5b505af1158015610f38573d6000803e3d6000fd5b5050505050505050565b600090565b610f4f611a33565b6109b86001611c1d565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8e9291906142c5565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108161061a610fcf565b61108c610640610947565b61109461163a565b61109f858585612114565b95945050505050565b6110b0611a33565b6110b8611a7c565b6000806110c3610ae8565b915091506110d46109318383611a8c565b6110e96110e18585611a8c565b61015761162c565b6111147f00000000000000000000000000000000000000000000000000000000000000008585612121565b50505050565b6000806111273385611306565b90508083106111415761113c33856000611772565b61114e565b61114e3385858403611772565b5060019392505050565b600061070c338484611953565b60006109006121f7565b6008546000906109009060ff612271565b611188611a33565b611190612001565b61119a6000611cc2565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4c919061441e565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121d8c610ff3565b8960405160200161123396959493929190614556565b604051602081830303815290604052805190602001209050611264888261125b878787612278565b886101f86122b7565b610f38888888611772565b6060808861127e61061a610fcf565b611289610640610947565b600061129361163a565b61129b61073a565b6112ed576112aa8a8a8761230e565b945090506112c36112b9610f42565b82101560cc61162c565b6112d560006112d0610f42565b6123a6565b6112e8896112e1610f42565b83036123a6565b610d49565b6112f88a8987611d13565b94509050610d4989826123a6565b6000611310610fcf565b6001600160a01b0316826001600160a01b031614156113325750600019610710565b61133c83836123b0565b9050610710565b6000806000611350610fcf565b6001600160a01b031663b05f8e48611366610947565b306040518363ffffffff1660e01b815260040161138492919061463c565b60806040518083038186803b15801561139c57600080fd5b505afa1580156113b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d491906141a4565b5050915091506113e5818301611f67565b9250505090565b60006109006123db565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061090061183f565b600061142f836115d9565b6060835160010167ffffffffffffffff8111801561144c57600080fd5b50604051908082528060200260200182016040528015611476578160200160208202803683370190505b509050308160008151811061148757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f6578481815181106114bf57fe5b60200260200101518282600101815181106114d657fe5b6001600160a01b03909216602092830291909101909101526001016114aa565b506060835160010167ffffffffffffffff8111801561151457600080fd5b5060405190808252806020026020018201604052801561153e578160200160208202803683370190505b50905060008160008151811061155057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115bf5784818151811061158857fe5b602002602001015182826001018151811061159f57fe5b6001600160a01b0390921660209283029190910190910152600101611573565b506115cc87878484612478565b925050505b949350505050565b806115e381612581565b5050565b60006115f783831115600161162c565b50900390565b600061160a8484846125fa565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e3576115e381612640565b6109b86116456117da565b61019261162c565b60006116696003841080156116625750600383105b606461162c565b6060611673610769565b905061167f8582611e91565b60008061168a610ae8565b91509150611696613aed565b60405180606001604052806116a9610ab7565b81526020810185905260400183905290506000895160018111156116c957fe5b141561172d576116f089606001518589815181106116e357fe5b602002602001015161266a565b60608a015260006117028a8a84612676565b90506117218186898151811061171457fe5b602002602001015161273d565b955050505050506115d1565b61174189606001518588815181106116e357fe5b60608a015260006117538a8a84612749565b905061172181868a8151811061176557fe5b60200260200101516127fe565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cd908590614441565b60405180910390a3505050565b60006117e461181b565b42118061090057505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663788c6bfe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561189a57600080fd5b505afa9250505080156118ca575060408051601f3d908101601f191682019092526118c791810190613f97565b60015b61190d573d8080156118f8576040519150601f19603f3d011682016040523d82523d6000602084013e6118fd565b606091505b506119078161280a565b506106fc565b633b9aca00900490506106fc565b600082820261193f84158061193857508385838161193557fe5b04145b600361162c565b670de0b6b3a7640000815b04949350505050565b61196a6001600160a01b038416151561019861162c565b6119816001600160a01b038316151561019961162c565b61198c838383610942565b6001600160a01b0383166000908152602081905260409020546119b290826101a0612891565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119e19082611c0b565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cd908590614441565b6000611a626000357fffffffff0000000000000000000000000000000000000000000000000000000016610f59565b9050611a79611a7182336128a7565b61019161162c565b50565b6109b8611a87610fcf565b612990565b6000806000611a99610fcf565b6001600160a01b031663b05f8e48611aaf610947565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611aed92919061463c565b60806040518083038186803b158015611b0557600080fd5b505afa158015611b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3d91906141a4565b5050915091506000611b79828401611b747f0000000000000000000000000000000000000000000000000000000000000000612a42565b61266a565b905085811015801561065e57509390931115949350505050565b611ba664e8d4a5100082101560cb61162c565b611bbc67016345785d8a000082111560ca61162c565b600854611bcd908260c0603f6115fd565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611c00908390614441565b60405180910390a150565b60008282016108e6848210158361162c565b8015611c3d57611c38611c2e6117f7565b421061019361162c565b611c52565b611c52611c4861181b565b42106101a961162c565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611c0090839061441e565b6109b8611cb961116f565b156101b561162c565b600854611cd1908260ff612b1c565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611c0090839061441e565b6001901b6000190191901c1690565b60006060611d226103e6612640565b935093915050565b333014611e19576000306001600160a01b0316600036604051611d4e9291906142f5565b6000604051808303816000865af19150503d8060008114611d8b576040519150601f19603f3d011682016040523d82523d6000602084013e611d90565b606091505b505090508060008114611d9f57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611dfb573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611e2c8686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611ea0908290612b2b565b60005b8181101561111457611edb848281518110611eba57fe5b6020026020010151848381518110611ece57fe5b602002602001015161191b565b848281518110611ee757fe5b6020908102919091010152600101611ea3565b60008160200151831015611f335781516020830151600091611f1f918690039061191b565b9050611f2b84826115e7565b915050610710565b81604001518311611f45575081610710565b81516040830151600091611f1f9186039061191b565b60006108e68383611c0b565b600061071082611f7561073a565b906115e7565b6000611f8a821515600461162c565b670de0b6b3a76400008302611fbc841580611fb55750670de0b6b3a7640000858381611fb257fe5b04145b600561162c565b6001836001830304018115150291505092915050565b6000808251118015610710575060ff801682806020019051810190611ff791906141e4565b60ff161492915050565b6109b861200c61116f565b6101b661162c565b60006060600061202384612b38565b90506060865167ffffffffffffffff8111801561203f57600080fd5b50604051908082528060200260200182016040528015612069578160200160208202803683370190505b5090506000612076610f42565b90506000612089898381518110610c9c57fe5b905060006120978583612b4e565b905060005b8a518110156120f957838114156120b45760006120da565b6120da828c83815181106120c457fe5b602002602001015161191b90919063ffffffff16565b8582815181106120e657fe5b602090810291909101015260010161209c565b509399929850919650505050505050565b6115e38282612b8e565b60006108e66103e6612640565b6121308183111561014c61162c565b61214b6b0de0b6b39983494c589c000082111561014d61162c565b612163670de0b6b3a7640000825b061561016161162c565b612175670de0b6b3a764000083612159565b6121aa670de0b6b3a76400008204604060206121a2670de0b6b3a7640000876008549190046020806115fd565b9291906115fd565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121ea90859085906146b1565b60405180910390a2505050565b6000612201610fcf565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561223957600080fd5b505afa15801561224d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109009190614092565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b60006122c285612c5a565b90506122d86122d2878387612c76565b8361162c565b6122e7428410156101b861162c565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606123296001600160a01b038616301461015661162c565b6123406001600160a01b038516301461015661162c565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff8160008151811061238f57fe5b602090810291909101015290969095509350505050565b6115e38282612d25565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612448612db8565b3060405160200161245d959493929190614610565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016124a79190614671565b602060405180830381600087803b1580156124c157600080fd5b505af11580156124d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f99190613f97565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d2906125459084908890889060040161458a565b600060405180830381600087803b15801561255f57600080fd5b505af1158015612573573d6000803e3d6000fd5b509298975050505050505050565b60028151101561259057611a79565b60008160008151811061259f57fe5b602002602001015190506000600190505b82518110156109425760008382815181106125c757fe5b602002602001015190506125f0816001600160a01b0316846001600160a01b031610606561162c565b91506001016125b0565b6126096101008310606461162c565b61263160018210158015611662575061262760ff8461010003611620565b821115606461162c565b61094283821c156101b461162c565b611a79817f42414c0000000000000000000000000000000000000000000000000000000000612dbc565b60006108e6838361191b565b60208301516000906001600160a01b03163014156126a057612699848484612e37565b90506108e6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b031614156126e957612699848484612f8f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612732576126998484846130cc565b6108e6610135612640565b60006108e68383612b4e565b60408301516000906001600160a01b031630141561276c57612699848484613204565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127b557612699848484613354565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127325761269984848461348c565b60006108e68383611f7b565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417612885578160208401fd5b506115e3610165612640565b60006128a0848411158361162c565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128c6610fab565b6001600160a01b0316141580156128e157506128e1836135c4565b15612909576128ee610fab565b6001600160a01b0316336001600160a01b0316149050610710565b6129116121f7565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016129409392919061444a565b60206040518083038186803b15801561295857600080fd5b505afa15801561296c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133c9190613f77565b604080516000808252602082019092526060916129c3565b6129b0613b38565b8152602001906001900390816129a85790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e8490612a0c90849060040161434f565b600060405180830381600087803b158015612a2657600080fd5b505af1158015612a3a573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612aa557507f0000000000000000000000000000000000000000000000000000000000000000610cd5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612af157612aea6107f261183f565b9050610cd5565b6001600160a01b038216301415612b115750670de0b6b3a7640000610cd5565b610cd5610135612640565b6001811b1992909216911b1790565b6115e3818314606761162c565b6000818060200190518101906108e69190614200565b6000612b5d821515600461162c565b670de0b6b3a76400008302612b85841580611fb55750670de0b6b3a7640000858381611fb257fe5b82818161194a57fe5b612ba56001600160a01b038316151561019b61162c565b612bb182600083610942565b6001600160a01b038216600090815260208190526040902054612bd790826101b2612891565b6001600160a01b038316600090815260208190526040902055612c0a612c0582612bff61073a565b90613628565b613636565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c4e9190614441565b60405180910390a35050565b6000612c646123db565b82604051602001610f8e929190614305565b6000612c8882516041146101b961162c565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612cc1908990859088908890614653565b6020604051602081039080840390855afa158015612ce3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612d195750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612d3160008383610942565b612d46612c0582612d4061073a565b90611c0b565b6001600160a01b038216600090815260208190526040902054612d699082611c0b565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c4e908590614441565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612ebd7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eb557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162c565b6115d18460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612ef157fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f2557fe5b6020026020010151612f3d87600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612f835761363b612f87565b6136995b63ffffffff16565b6000612feb7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eb5575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b03163014613046576130418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061303357fe5b602002602001015184613702565b6115d1565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061307a57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130ae57fe5b60200260200101516130c687600081518110610c9c57fe5b86613732565b60006131287f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eb5575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b0316301461317e576130418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061317057fe5b602002602001015184613798565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131b257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106131e657fe5b60200260200101516131fe87600081518110610c9c57fe5b866137d8565b60006132897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eb557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162c565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132bd57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106132f157fe5b602002602001015161330987600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461334f5761383f612f87565b613896565b60006133b07f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eb5575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b03163014613406576130418460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106133f857fe5b602002602001015184613900565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061343a57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061346e57fe5b602002602001015161348687600081518110610c9c57fe5b8661392a565b60006134e87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eb5575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b0316301461353e576130418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061353057fe5b602002602001015184613979565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061357257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106135a657fe5b60200260200101516135be87600081518110610c9c57fe5b866139ae565b60006135ef7f9f11080e00000000000000000000000000000000000000000000000000000000610f59565b82148061071057506136207f38e9922e00000000000000000000000000000000000000000000000000000000610f59565b909114919050565b60006108e683836001612891565b600255565b6000806136488684611efa565b905060006136568287611f5b565b90506000613664868a6115e7565b9050600061367f84611f756136798587613a02565b8a613a1c565b905061368b88826115e7565b9a9950505050505050505050565b6000806136a68684611efa565b905060006136b48287611f5b565b905060006136cb6136c5838b613a02565b87613a3d565b905060006136d984836115e7565b905060006136e78288613a5d565b90506136f38a826115e7565b9b9a5050505050505050505050565b60008061370f8484611efa565b905060006137266137208688611c0b565b85611efa565b905061065e81836115e7565b60008261374a576137438683611efa565b905061109f565b60006137568684611efa565b90506000613767613720888a611c0b565b9050600061377582846115e7565b905060006137838489611f5b565b905061368b6137928884613a02565b82613a3d565b6000806137a58484611efa565b905060006137b382876115e7565b905060006137c18286613a5d565b90506137cd86826115e7565b979650505050505050565b6000826137e657508461109f565b60006137f28684611efa565b905060006138008287611f5b565b9050600061380e878a611c0b565b9050600061381c8483611f5b565b9050600061383361382d8984613a02565b85613a3d565b90506136f381896115e7565b60008261384d57508461109f565b60006138598684611efa565b905060006138678287611f5b565b90506000613875868a611c0b565b9050600061388a84611f756136798587613a02565b905061368b81896115e7565b6000826138a7576137438683613a5d565b60006138b38684611efa565b905060006138c18287611f5b565b905060006138d86138d2838b613a02565b87613a1c565b905060006138e68483611c0b565b905060006138f48288613a5d565b90506136f3818b6115e7565b60008061390d8484611efa565b9050600061391e61372086886115e7565b905061065e82826115e7565b6000806139378684611efa565b90506000613948613720888a6115e7565b9050600061395683836115e7565b905060006139648489611f5b565b905061368b6139738884613a02565b82613a1c565b6000806139868484611efa565b905060006139948287611c0b565b905060006139a28286613a5d565b90506137cd81876115e7565b6000806139bb8684611efa565b905060006139c98287611f5b565b905060006139d7878a6115e7565b905060006139e58483611f5b565b905060006139f661382d8984613a02565b90506136f388826115e7565b60008282026108e684158061193857508385838161193557fe5b6000613a2b821515600461162c565b50811515600019909201046001010290565b6000613a4c821515600461162c565b818381613a5557fe5b049392505050565b60008160200151831015613aa657815161133c90613a8490670de0b6b3a764000090611c0b565b60208401518451613aa091613a99919061191b565b8690611c0b565b90612b4e565b81604001518311613ab8575081610710565b815161133c90613ad190670de0b6b3a7640000906115e7565b60408401518451613aa091613ae6919061191b565b86906115e7565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561071081614720565b600082601f830112613b83578081fd5b8135613b96613b91826146f4565b6146cd565b818152915060208083019084810181840286018201871015613bb757600080fd5b60005b84811015613bd657813584529282019290820190600101613bba565b505050505092915050565b600082601f830112613bf1578081fd5b8151613bff613b91826146f4565b818152915060208083019084810181840286018201871015613c2057600080fd5b60005b84811015613bd657815184529282019290820190600101613c23565b600082601f830112613c4f578081fd5b813567ffffffffffffffff811115613c65578182fd5b613c786020601f19601f840116016146cd565b9150808252836020828501011115613c8f57600080fd5b8060208401602084013760009082016020015292915050565b80356002811061071057600080fd5b6000610120808385031215613cca578182fd5b613cd3816146cd565b915050613ce08383613ca8565b8152613cef8360208401613b68565b6020820152613d018360408401613b68565b6040820152606082013560608201526080820135608082015260a082013560a0820152613d318360c08401613b68565b60c0820152613d438360e08401613b68565b60e08201526101008083013567ffffffffffffffff811115613d6457600080fd5b613d7085828601613c3f565b82840152505092915050565b600060208284031215613d8d578081fd5b81356108e681614720565b60008060408385031215613daa578081fd5b8235613db581614720565b91506020830135613dc581614720565b809150509250929050565b600080600060608486031215613de4578081fd5b8335613def81614720565b92506020840135613dff81614720565b929592945050506040919091013590565b600080600080600080600060e0888a031215613e2a578283fd5b8735613e3581614720565b96506020880135613e4581614720565b955060408801359450606088013593506080880135613e6381614735565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613e92578182fd5b8235613e9d81614720565b946020939093013593505050565b600080600060608486031215613ebf578081fd5b835167ffffffffffffffff80821115613ed6578283fd5b818601915086601f830112613ee9578283fd5b8151613ef7613b91826146f4565b80828252602080830192508086018b828387028901011115613f17578788fd5b8796505b84871015613f42578051613f2e81614720565b845260019690960195928101928101613f1b565b508901519097509350505080821115613f59578283fd5b50613f6686828701613be1565b925050604084015190509250925092565b600060208284031215613f88578081fd5b815180151581146108e6578182fd5b600060208284031215613fa8578081fd5b5051919050565b600080600080600080600060e0888a031215613fc9578081fd5b873596506020880135613fdb81614720565b95506040880135613feb81614720565b9450606088013567ffffffffffffffff80821115614007578283fd5b6140138b838c01613b73565b955060808a0135945060a08a0135935060c08a0135915080821115614036578283fd5b506140438a828b01613c3f565b91505092959891949750929550565b600060208284031215614063578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e6578182fd5b6000602082840312156140a3578081fd5b81516108e681614720565b600080600080608085870312156140c3578182fd5b843567ffffffffffffffff808211156140da578384fd5b6140e688838901613cb7565b955060208701359150808211156140fb578384fd5b5061410887828801613b73565b949794965050505060408301359260600135919050565b600080600060608486031215614133578081fd5b833567ffffffffffffffff811115614149578182fd5b61415586828701613cb7565b9660208601359650604090950135949350505050565b60006020828403121561417c578081fd5b5035919050565b60008060408385031215614195578182fd5b50508035926020909101359150565b600080600080608085870312156141b9578182fd5b84519350602085015192506040850151915060608501516141d981614720565b939692955090935050565b6000602082840312156141f5578081fd5b81516108e681614735565b60008060408385031215614212578182fd5b825161421d81614735565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156142695781518752958201959082019060010161424d565b509495945050505050565b15159052565b60008151808452815b8181101561429f57602081850181015186830182015201614283565b818111156142b05782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b828110156143d957815180516004811061438257fe5b8552808701516143948887018261422d565b5085810151868601526060808201516143af8288018261422d565b5050608090810151906143c48682018361422d565b505060a093909301929085019060010161436c565b5091979650505050505050565b6000602082526108e6602083018461423a565b60006040825261440c604083018561423a565b828103602084015261109f818561423a565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156144da576144c48451614714565b82529284019260019290920191908401906144b2565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a0870152614518818561423a565b935050506040850151818584030160c0860152614535838261427a565b92505050606084015161454b60e0850182614274565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b818110156145d2576145c08551614714565b835293830193918301916001016145ae565b505084810360408601528551808252908201925081860190845b81811015612573576145fe8351614714565b855293830193918301916001016145ec565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016003831061467f57fe5b91905290565b6000602082526108e6602083018461427a565b6000838252604060208301526115d1604083018461423a565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156146ec57600080fd5b604052919050565b600067ffffffffffffffff82111561470a578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114611a7957600080fd5b60ff81168114611a7957600080fdfea26469706673582212209d9a043c5469f9ae318713c223e3d4cae3b6dc6f5705cc6a4f84082c6bc18c3064736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e3660046140ae565b610608565b6040516103509190614441565b60405180910390f35b610361610668565b6040516103509190614685565b61038161037c366004613e80565b6106ff565b604051610350919061441e565b610343610716565b61034361073a565b6103a6610740565b60405161035093929190614429565b6103bd610769565b60405161035091906143e6565b6103816103d8366004613dd0565b610877565b6103e56108ed565b60405161035091906146bf565b6103436108f6565b61040d61040836600461416b565b610905565b005b610343610947565b610381610425366004613e80565b61096b565b61040d6109a6565b6103436109ba565b6104426109de565b604051610350919061433b565b61040d610a02565b610361610a56565b610343610ab7565b61047a610475366004613faf565b610aca565b604051610350929190614698565b610490610ae8565b6040516103509291906146b1565b610343610b26565b6103436104b4366004613d7c565b610cbb565b6104cc6104c7366004613faf565b610cda565b6040516103509291906143f9565b6103436104e8366004613d7c565b610d9c565b61040d610da7565b610343610f42565b61040d610f47565b610343610513366004614052565b610f59565b610442610fab565b610442610fcf565b610343610536366004613d7c565b610ff3565b61036161100e565b61034361055136600461411f565b61106f565b61040d610564366004614183565b6110a8565b610381610577366004613e80565b61111a565b61038161058a366004613e80565b611158565b610442611165565b61038161116f565b61040d611180565b6104426111ca565b61040d6105bd366004613e10565b6111ee565b6104cc6105d0366004613faf565b61126f565b6103436105e3366004613d98565b611306565b610343611343565b6103436113ec565b6104426113f6565b61034361141a565b6000846080015161063561061a610fcf565b6001600160a01b0316336001600160a01b03161460cd61162c565b61064a610640610947565b82146101f461162c565b61065261163a565b61065e8686868661164d565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b505050505090505b90565b600061070c338484611772565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074d6117da565b1592506107586117f7565b915061076261181b565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107db57fe5b6020026020010181815250506108196107f261183f565b7f00000000000000000000000000000000000000000000000000000000000000009061191b565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084557fe5b602002602001018181525050670de0b6b3a76400008160008151811061086757fe5b6020908102919091010152905090565b6000806108848533611306565b90506108a8336001600160a01b03871614806108a05750838210155b61019e61162c565b6108b3858585611953565b336001600160a01b038616148015906108ce57506000198114155b156108e0576108e08533858403611772565b60019150505b9392505050565b60055460ff1690565b60006109006113ec565b905090565b61090d611a33565b610915611a7c565b600080610920610ae8565b915091506109396109318383611a8c565b61014f61162c565b61094283611b93565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070c9185906109a19086611c0b565b611772565b6109ae611a33565b6109b86000611c1d565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a0a611a33565b610a12611cae565b610a1c6001611cc2565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4c919061441e565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906109009060c0603f611d04565b60006060610adc888785611d13611d2a565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0582602080611d04565b029250670de0b6b3a7640000610b1e8260406020611d04565b029150509091565b600080610b31610947565b90506060610b3d610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b689190614441565b60006040518083038186803b158015610b8057600080fd5b505afa158015610b94573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbc9190810190613eab565b50915050610bd181610bcc610769565b611e91565b600080610bdc610ae8565b91509150610be8613aed565b6040518060600160405280610bfb610ab7565b81526020018481526020018381525090506000610c87610c4e867f000000000000000000000000000000000000000000000000000000000000000081518110610c4057fe5b602002602001015184611efa565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7a57fe5b6020026020010151611f5b565b9050610cb0610ca986600081518110610c9c57fe5b6020026020010151611f67565b8290611f7b565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce961061a610fcf565b610cf4610640610947565b6000610cff85611fd2565b15610d2757610d0c612001565b610d1e88610d1861073a565b87612014565b94509050610d3f565b610d2f61163a565b610d3a8a8987611d13565b945090505b610d498a8261210a565b835167ffffffffffffffff81118015610d6157600080fd5b50604051908082528060200260200182016040528015610d8b578160200160208202803683370190505b509250505097509795505050505050565b600061071082610ff3565b6000610db1610947565b90506060610dbd610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de89190614441565b60006040518083038186803b158015610e0057600080fd5b505afa158015610e14573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3c9190810190613eab565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e8057fe5b602002602001018181525050610e94613b0e565b6040518060800160405280610ea8856106fc565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed9610fcf565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f0a9493929190614469565b600060405180830381600087803b158015610f2457600080fd5b505af1158015610f38573d6000803e3d6000fd5b5050505050505050565b600090565b610f4f611a33565b6109b86001611c1d565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8e9291906142c5565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108161061a610fcf565b61108c610640610947565b61109461163a565b61109f858585612114565b95945050505050565b6110b0611a33565b6110b8611a7c565b6000806110c3610ae8565b915091506110d46109318383611a8c565b6110e96110e18585611a8c565b61015761162c565b6111147f00000000000000000000000000000000000000000000000000000000000000008585612121565b50505050565b6000806111273385611306565b90508083106111415761113c33856000611772565b61114e565b61114e3385858403611772565b5060019392505050565b600061070c338484611953565b60006109006121f7565b6008546000906109009060ff612271565b611188611a33565b611190612001565b61119a6000611cc2565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4c919061441e565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121d8c610ff3565b8960405160200161123396959493929190614556565b604051602081830303815290604052805190602001209050611264888261125b878787612278565b886101f86122b7565b610f38888888611772565b6060808861127e61061a610fcf565b611289610640610947565b600061129361163a565b61129b61073a565b6112ed576112aa8a8a8761230e565b945090506112c36112b9610f42565b82101560cc61162c565b6112d560006112d0610f42565b6123a6565b6112e8896112e1610f42565b83036123a6565b610d49565b6112f88a8987611d13565b94509050610d4989826123a6565b6000611310610fcf565b6001600160a01b0316826001600160a01b031614156113325750600019610710565b61133c83836123b0565b9050610710565b6000806000611350610fcf565b6001600160a01b031663b05f8e48611366610947565b306040518363ffffffff1660e01b815260040161138492919061463c565b60806040518083038186803b15801561139c57600080fd5b505afa1580156113b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d491906141a4565b5050915091506113e5818301611f67565b9250505090565b60006109006123db565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061090061183f565b600061142f836115d9565b6060835160010167ffffffffffffffff8111801561144c57600080fd5b50604051908082528060200260200182016040528015611476578160200160208202803683370190505b509050308160008151811061148757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f6578481815181106114bf57fe5b60200260200101518282600101815181106114d657fe5b6001600160a01b03909216602092830291909101909101526001016114aa565b506060835160010167ffffffffffffffff8111801561151457600080fd5b5060405190808252806020026020018201604052801561153e578160200160208202803683370190505b50905060008160008151811061155057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115bf5784818151811061158857fe5b602002602001015182826001018151811061159f57fe5b6001600160a01b0390921660209283029190910190910152600101611573565b506115cc87878484612478565b925050505b949350505050565b806115e381612581565b5050565b60006115f783831115600161162c565b50900390565b600061160a8484846125fa565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e3576115e381612640565b6109b86116456117da565b61019261162c565b60006116696003841080156116625750600383105b606461162c565b6060611673610769565b905061167f8582611e91565b60008061168a610ae8565b91509150611696613aed565b60405180606001604052806116a9610ab7565b81526020810185905260400183905290506000895160018111156116c957fe5b141561172d576116f089606001518589815181106116e357fe5b602002602001015161266a565b60608a015260006117028a8a84612676565b90506117218186898151811061171457fe5b602002602001015161273d565b955050505050506115d1565b61174189606001518588815181106116e357fe5b60608a015260006117538a8a84612749565b905061172181868a8151811061176557fe5b60200260200101516127fe565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cd908590614441565b60405180910390a3505050565b60006117e461181b565b42118061090057505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663788c6bfe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561189a57600080fd5b505afa9250505080156118ca575060408051601f3d908101601f191682019092526118c791810190613f97565b60015b61190d573d8080156118f8576040519150601f19603f3d011682016040523d82523d6000602084013e6118fd565b606091505b506119078161280a565b506106fc565b633b9aca00900490506106fc565b600082820261193f84158061193857508385838161193557fe5b04145b600361162c565b670de0b6b3a7640000815b04949350505050565b61196a6001600160a01b038416151561019861162c565b6119816001600160a01b038316151561019961162c565b61198c838383610942565b6001600160a01b0383166000908152602081905260409020546119b290826101a0612891565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119e19082611c0b565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cd908590614441565b6000611a626000357fffffffff0000000000000000000000000000000000000000000000000000000016610f59565b9050611a79611a7182336128a7565b61019161162c565b50565b6109b8611a87610fcf565b612990565b6000806000611a99610fcf565b6001600160a01b031663b05f8e48611aaf610947565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611aed92919061463c565b60806040518083038186803b158015611b0557600080fd5b505afa158015611b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3d91906141a4565b5050915091506000611b79828401611b747f0000000000000000000000000000000000000000000000000000000000000000612a42565b61266a565b905085811015801561065e57509390931115949350505050565b611ba664e8d4a5100082101560cb61162c565b611bbc67016345785d8a000082111560ca61162c565b600854611bcd908260c0603f6115fd565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611c00908390614441565b60405180910390a150565b60008282016108e6848210158361162c565b8015611c3d57611c38611c2e6117f7565b421061019361162c565b611c52565b611c52611c4861181b565b42106101a961162c565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611c0090839061441e565b6109b8611cb961116f565b156101b561162c565b600854611cd1908260ff612b1c565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611c0090839061441e565b6001901b6000190191901c1690565b60006060611d226103e6612640565b935093915050565b333014611e19576000306001600160a01b0316600036604051611d4e9291906142f5565b6000604051808303816000865af19150503d8060008114611d8b576040519150601f19603f3d011682016040523d82523d6000602084013e611d90565b606091505b505090508060008114611d9f57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611dfb573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611e2c8686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611ea0908290612b2b565b60005b8181101561111457611edb848281518110611eba57fe5b6020026020010151848381518110611ece57fe5b602002602001015161191b565b848281518110611ee757fe5b6020908102919091010152600101611ea3565b60008160200151831015611f335781516020830151600091611f1f918690039061191b565b9050611f2b84826115e7565b915050610710565b81604001518311611f45575081610710565b81516040830151600091611f1f9186039061191b565b60006108e68383611c0b565b600061071082611f7561073a565b906115e7565b6000611f8a821515600461162c565b670de0b6b3a76400008302611fbc841580611fb55750670de0b6b3a7640000858381611fb257fe5b04145b600561162c565b6001836001830304018115150291505092915050565b6000808251118015610710575060ff801682806020019051810190611ff791906141e4565b60ff161492915050565b6109b861200c61116f565b6101b661162c565b60006060600061202384612b38565b90506060865167ffffffffffffffff8111801561203f57600080fd5b50604051908082528060200260200182016040528015612069578160200160208202803683370190505b5090506000612076610f42565b90506000612089898381518110610c9c57fe5b905060006120978583612b4e565b905060005b8a518110156120f957838114156120b45760006120da565b6120da828c83815181106120c457fe5b602002602001015161191b90919063ffffffff16565b8582815181106120e657fe5b602090810291909101015260010161209c565b509399929850919650505050505050565b6115e38282612b8e565b60006108e66103e6612640565b6121308183111561014c61162c565b61214b6b0de0b6b39983494c589c000082111561014d61162c565b612163670de0b6b3a7640000825b061561016161162c565b612175670de0b6b3a764000083612159565b6121aa670de0b6b3a76400008204604060206121a2670de0b6b3a7640000876008549190046020806115fd565b9291906115fd565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121ea90859085906146b1565b60405180910390a2505050565b6000612201610fcf565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561223957600080fd5b505afa15801561224d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109009190614092565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b60006122c285612c5a565b90506122d86122d2878387612c76565b8361162c565b6122e7428410156101b861162c565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606123296001600160a01b038616301461015661162c565b6123406001600160a01b038516301461015661162c565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff8160008151811061238f57fe5b602090810291909101015290969095509350505050565b6115e38282612d25565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612448612db8565b3060405160200161245d959493929190614610565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016124a79190614671565b602060405180830381600087803b1580156124c157600080fd5b505af11580156124d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f99190613f97565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d2906125459084908890889060040161458a565b600060405180830381600087803b15801561255f57600080fd5b505af1158015612573573d6000803e3d6000fd5b509298975050505050505050565b60028151101561259057611a79565b60008160008151811061259f57fe5b602002602001015190506000600190505b82518110156109425760008382815181106125c757fe5b602002602001015190506125f0816001600160a01b0316846001600160a01b031610606561162c565b91506001016125b0565b6126096101008310606461162c565b61263160018210158015611662575061262760ff8461010003611620565b821115606461162c565b61094283821c156101b461162c565b611a79817f42414c0000000000000000000000000000000000000000000000000000000000612dbc565b60006108e6838361191b565b60208301516000906001600160a01b03163014156126a057612699848484612e37565b90506108e6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b031614156126e957612699848484612f8f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612732576126998484846130cc565b6108e6610135612640565b60006108e68383612b4e565b60408301516000906001600160a01b031630141561276c57612699848484613204565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127b557612699848484613354565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127325761269984848461348c565b60006108e68383611f7b565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417612885578160208401fd5b506115e3610165612640565b60006128a0848411158361162c565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128c6610fab565b6001600160a01b0316141580156128e157506128e1836135c4565b15612909576128ee610fab565b6001600160a01b0316336001600160a01b0316149050610710565b6129116121f7565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016129409392919061444a565b60206040518083038186803b15801561295857600080fd5b505afa15801561296c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133c9190613f77565b604080516000808252602082019092526060916129c3565b6129b0613b38565b8152602001906001900390816129a85790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e8490612a0c90849060040161434f565b600060405180830381600087803b158015612a2657600080fd5b505af1158015612a3a573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612aa557507f0000000000000000000000000000000000000000000000000000000000000000610cd5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612af157612aea6107f261183f565b9050610cd5565b6001600160a01b038216301415612b115750670de0b6b3a7640000610cd5565b610cd5610135612640565b6001811b1992909216911b1790565b6115e3818314606761162c565b6000818060200190518101906108e69190614200565b6000612b5d821515600461162c565b670de0b6b3a76400008302612b85841580611fb55750670de0b6b3a7640000858381611fb257fe5b82818161194a57fe5b612ba56001600160a01b038316151561019b61162c565b612bb182600083610942565b6001600160a01b038216600090815260208190526040902054612bd790826101b2612891565b6001600160a01b038316600090815260208190526040902055612c0a612c0582612bff61073a565b90613628565b613636565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c4e9190614441565b60405180910390a35050565b6000612c646123db565b82604051602001610f8e929190614305565b6000612c8882516041146101b961162c565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612cc1908990859088908890614653565b6020604051602081039080840390855afa158015612ce3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612d195750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612d3160008383610942565b612d46612c0582612d4061073a565b90611c0b565b6001600160a01b038216600090815260208190526040902054612d699082611c0b565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c4e908590614441565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612ebd7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eb557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162c565b6115d18460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612ef157fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f2557fe5b6020026020010151612f3d87600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612f835761363b612f87565b6136995b63ffffffff16565b6000612feb7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eb5575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b03163014613046576130418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061303357fe5b602002602001015184613702565b6115d1565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061307a57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130ae57fe5b60200260200101516130c687600081518110610c9c57fe5b86613732565b60006131287f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eb5575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b0316301461317e576130418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061317057fe5b602002602001015184613798565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131b257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106131e657fe5b60200260200101516131fe87600081518110610c9c57fe5b866137d8565b60006132897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eb557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162c565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132bd57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106132f157fe5b602002602001015161330987600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461334f5761383f612f87565b613896565b60006133b07f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eb5575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b03163014613406576130418460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106133f857fe5b602002602001015184613900565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061343a57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061346e57fe5b602002602001015161348687600081518110610c9c57fe5b8661392a565b60006134e87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eb5575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b0316301461353e576130418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061353057fe5b602002602001015184613979565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061357257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106135a657fe5b60200260200101516135be87600081518110610c9c57fe5b866139ae565b60006135ef7f9f11080e00000000000000000000000000000000000000000000000000000000610f59565b82148061071057506136207f38e9922e00000000000000000000000000000000000000000000000000000000610f59565b909114919050565b60006108e683836001612891565b600255565b6000806136488684611efa565b905060006136568287611f5b565b90506000613664868a6115e7565b9050600061367f84611f756136798587613a02565b8a613a1c565b905061368b88826115e7565b9a9950505050505050505050565b6000806136a68684611efa565b905060006136b48287611f5b565b905060006136cb6136c5838b613a02565b87613a3d565b905060006136d984836115e7565b905060006136e78288613a5d565b90506136f38a826115e7565b9b9a5050505050505050505050565b60008061370f8484611efa565b905060006137266137208688611c0b565b85611efa565b905061065e81836115e7565b60008261374a576137438683611efa565b905061109f565b60006137568684611efa565b90506000613767613720888a611c0b565b9050600061377582846115e7565b905060006137838489611f5b565b905061368b6137928884613a02565b82613a3d565b6000806137a58484611efa565b905060006137b382876115e7565b905060006137c18286613a5d565b90506137cd86826115e7565b979650505050505050565b6000826137e657508461109f565b60006137f28684611efa565b905060006138008287611f5b565b9050600061380e878a611c0b565b9050600061381c8483611f5b565b9050600061383361382d8984613a02565b85613a3d565b90506136f381896115e7565b60008261384d57508461109f565b60006138598684611efa565b905060006138678287611f5b565b90506000613875868a611c0b565b9050600061388a84611f756136798587613a02565b905061368b81896115e7565b6000826138a7576137438683613a5d565b60006138b38684611efa565b905060006138c18287611f5b565b905060006138d86138d2838b613a02565b87613a1c565b905060006138e68483611c0b565b905060006138f48288613a5d565b90506136f3818b6115e7565b60008061390d8484611efa565b9050600061391e61372086886115e7565b905061065e82826115e7565b6000806139378684611efa565b90506000613948613720888a6115e7565b9050600061395683836115e7565b905060006139648489611f5b565b905061368b6139738884613a02565b82613a1c565b6000806139868484611efa565b905060006139948287611c0b565b905060006139a28286613a5d565b90506137cd81876115e7565b6000806139bb8684611efa565b905060006139c98287611f5b565b905060006139d7878a6115e7565b905060006139e58483611f5b565b905060006139f661382d8984613a02565b90506136f388826115e7565b60008282026108e684158061193857508385838161193557fe5b6000613a2b821515600461162c565b50811515600019909201046001010290565b6000613a4c821515600461162c565b818381613a5557fe5b049392505050565b60008160200151831015613aa657815161133c90613a8490670de0b6b3a764000090611c0b565b60208401518451613aa091613a99919061191b565b8690611c0b565b90612b4e565b81604001518311613ab8575081610710565b815161133c90613ad190670de0b6b3a7640000906115e7565b60408401518451613aa091613ae6919061191b565b86906115e7565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561071081614720565b600082601f830112613b83578081fd5b8135613b96613b91826146f4565b6146cd565b818152915060208083019084810181840286018201871015613bb757600080fd5b60005b84811015613bd657813584529282019290820190600101613bba565b505050505092915050565b600082601f830112613bf1578081fd5b8151613bff613b91826146f4565b818152915060208083019084810181840286018201871015613c2057600080fd5b60005b84811015613bd657815184529282019290820190600101613c23565b600082601f830112613c4f578081fd5b813567ffffffffffffffff811115613c65578182fd5b613c786020601f19601f840116016146cd565b9150808252836020828501011115613c8f57600080fd5b8060208401602084013760009082016020015292915050565b80356002811061071057600080fd5b6000610120808385031215613cca578182fd5b613cd3816146cd565b915050613ce08383613ca8565b8152613cef8360208401613b68565b6020820152613d018360408401613b68565b6040820152606082013560608201526080820135608082015260a082013560a0820152613d318360c08401613b68565b60c0820152613d438360e08401613b68565b60e08201526101008083013567ffffffffffffffff811115613d6457600080fd5b613d7085828601613c3f565b82840152505092915050565b600060208284031215613d8d578081fd5b81356108e681614720565b60008060408385031215613daa578081fd5b8235613db581614720565b91506020830135613dc581614720565b809150509250929050565b600080600060608486031215613de4578081fd5b8335613def81614720565b92506020840135613dff81614720565b929592945050506040919091013590565b600080600080600080600060e0888a031215613e2a578283fd5b8735613e3581614720565b96506020880135613e4581614720565b955060408801359450606088013593506080880135613e6381614735565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613e92578182fd5b8235613e9d81614720565b946020939093013593505050565b600080600060608486031215613ebf578081fd5b835167ffffffffffffffff80821115613ed6578283fd5b818601915086601f830112613ee9578283fd5b8151613ef7613b91826146f4565b80828252602080830192508086018b828387028901011115613f17578788fd5b8796505b84871015613f42578051613f2e81614720565b845260019690960195928101928101613f1b565b508901519097509350505080821115613f59578283fd5b50613f6686828701613be1565b925050604084015190509250925092565b600060208284031215613f88578081fd5b815180151581146108e6578182fd5b600060208284031215613fa8578081fd5b5051919050565b600080600080600080600060e0888a031215613fc9578081fd5b873596506020880135613fdb81614720565b95506040880135613feb81614720565b9450606088013567ffffffffffffffff80821115614007578283fd5b6140138b838c01613b73565b955060808a0135945060a08a0135935060c08a0135915080821115614036578283fd5b506140438a828b01613c3f565b91505092959891949750929550565b600060208284031215614063578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e6578182fd5b6000602082840312156140a3578081fd5b81516108e681614720565b600080600080608085870312156140c3578182fd5b843567ffffffffffffffff808211156140da578384fd5b6140e688838901613cb7565b955060208701359150808211156140fb578384fd5b5061410887828801613b73565b949794965050505060408301359260600135919050565b600080600060608486031215614133578081fd5b833567ffffffffffffffff811115614149578182fd5b61415586828701613cb7565b9660208601359650604090950135949350505050565b60006020828403121561417c578081fd5b5035919050565b60008060408385031215614195578182fd5b50508035926020909101359150565b600080600080608085870312156141b9578182fd5b84519350602085015192506040850151915060608501516141d981614720565b939692955090935050565b6000602082840312156141f5578081fd5b81516108e681614735565b60008060408385031215614212578182fd5b825161421d81614735565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156142695781518752958201959082019060010161424d565b509495945050505050565b15159052565b60008151808452815b8181101561429f57602081850181015186830182015201614283565b818111156142b05782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b828110156143d957815180516004811061438257fe5b8552808701516143948887018261422d565b5085810151868601526060808201516143af8288018261422d565b5050608090810151906143c48682018361422d565b505060a093909301929085019060010161436c565b5091979650505050505050565b6000602082526108e6602083018461423a565b60006040825261440c604083018561423a565b828103602084015261109f818561423a565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156144da576144c48451614714565b82529284019260019290920191908401906144b2565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a0870152614518818561423a565b935050506040850151818584030160c0860152614535838261427a565b92505050606084015161454b60e0850182614274565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b818110156145d2576145c08551614714565b835293830193918301916001016145ae565b505084810360408601528551808252908201925081860190845b81811015612573576145fe8351614714565b855293830193918301916001016145ec565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016003831061467f57fe5b91905290565b6000602082526108e6602083018461427a565b6000838252604060208301526115d1604083018461423a565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156146ec57600080fd5b604052919050565b600067ffffffffffffffff82111561470a578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114611a7957600080fd5b60ff81168114611a7957600080fdfea26469706673582212209d9a043c5469f9ae318713c223e3d4cae3b6dc6f5705cc6a4f84082c6bc18c3064736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/artifact/GearboxLinearPoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/artifact/GearboxLinearPoolFactory.json new file mode 100644 index 0000000..f07ac6b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/artifact/GearboxLinearPoolFactory.json @@ -0,0 +1,329 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GearboxLinearPoolFactory", + "sourceName": "contracts/gearbox-linear-pool/GearboxLinearPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "contract IBalancerQueries", + "name": "queries", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "poolVersion", + "type": "string" + }, + { + "internalType": "uint256", + "name": "initialPauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "GearboxLinearPoolCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract GearboxLinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastCreatedPool", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeePercentagesProvider", + "outputs": [ + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101e06040523480156200001257600080fd5b5060405162009464380380620094648339810160408190526200003591620003be565b86868383604051806020016200004b906200026d565b601f1982820381018352601f909101166040528851839083908790309085908e906200007f9060009060208401906200027b565b505080516002810460a081905280820360e081905281845283620000af816200018e602090811b620009f117901c565b60601b6001600160601b0319166080528285018051838252620000de826200018e602090811b620009f117901c565b6001600160601b0319606091821b811660c0529690935290526101009590955250509290911b909116610120525062000121630163f500831115610194620001e2565b620001356276a700821115610195620001e2565b610140829052610160524201610180525050506001600160601b0319606091821b81166101a05260016003559087901b166101c052508251620001809060069060208601906200027b565b50505050505050506200048f565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001dc6001600160a01b03831615156101ac620001e2565b50919050565b81620001f357620001f381620001f7565b5050565b62000209816210905360ea1b6200020c565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6159838062003ae183390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002be57805160ff1916838001178555620002ee565b82800160010185558215620002ee579182015b82811115620002ee578251825591602001919060010190620002d1565b50620002fc92915062000300565b5090565b5b80821115620002fc576000815560010162000301565b600082601f83011262000328578081fd5b81516001600160401b03808211156200033f578283fd5b6040516020601f8401601f191682018101838111838210171562000361578586fd5b806040525081945083825286818588010111156200037e57600080fd5b600092505b83831015620003a2578583018101518284018201529182019162000383565b83831115620003b45760008185840101525b5050505092915050565b600080600080600080600060e0888a031215620003d9578283fd5b8751620003e68162000479565b6020890151909750620003f98162000479565b60408901519096506200040c8162000479565b60608901519095506001600160401b038082111562000429578485fd5b620004378b838c0162000317565b955060808a01519150808211156200044d578485fd5b506200045c8a828b0162000317565b93505060a0880151915060c0880151905092959891949750929550565b6001600160a01b03811681146200020957600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405161016051610180516101a05160601c6101c05160601c6135bd620005246000398061067552508061050452508061028b52806102b55250806102d95250508061057c52508061052a525080610a5a5250806102625280610ad6525080610a7b5250806102415280610ab252506135bd6000f3fe60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c80636634b7531162000099578063851c1bb3116200006f578063851c1bb314620001cd5780638d928af814620001f3578063aaabadc514620001fd578063df8af989146200020757620000ff565b80636634b75314620001935780636c57f5a914620001b9578063739238d614620001c357620000ff565b80632f2770db11620000db5780632f2770db146200015a5780633f819b6f146200016657806354fd4d5014620001705780635ed31282146200017a57620000ff565b8062c194db1462000104578063174481fa14620001265780632da47c401462000140575b600080fd5b6200010e6200021e565b6040516200011d919062001435565b60405180910390f35b620001306200023f565b6040516200011d929190620013ce565b6200014a62000285565b6040516200011d9291906200162e565b620001646200030e565b005b6200010e62000378565b6200010e62000430565b62000184620004b2565b6040516200011d9190620013ad565b620001aa620001a436600462001137565b620004ce565b6040516200011d9190620013f5565b620001aa620004f9565b6200018462000502565b620001e4620001de36600462001178565b62000526565b6040516200011d919062001400565b620001846200057a565b620001846200059e565b6200018462000218366004620011d9565b6200062b565b60606200023a6040518060200160405280600081525062000a52565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200030057807f00000000000000000000000000000000000000000000000000000000000000000392507f0000000000000000000000000000000000000000000000000000000000000000915062000309565b60009250600091505b509091565b6200031862000b2d565b6200032262000b7c565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b820191906000526020600020905b8154815290600101906020018083116200040857829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016200055d9291906200134a565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000620005aa6200057a565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620005f057600080fd5b505afa15801562000605573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023a9190620011ba565b60006200063762000b95565b6004805460018101909155604051606090620006566020820162000fd8565b601f1982820381018352601f90910116604052620006736200057a565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001620006a7929190620013ce565b60408051601f1981840301815290829052620006c792916020016200137a565b60405160208183030381529060405290506000620006ed83838051906020012062000bb0565b9050600080620006fc62000285565b915091506200070a62000fe6565b620007146200057a565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508e81602001819052508d81604001819052508c816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508a8160c0018181525050898160e0018181525050828161010001818152505081816101200181815250508881610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506200087262000378565b610160820152604051600090620008a8906200089390849060200162001526565b60405160208183030381529060405262000bc6565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620008f357600080fd5b505af115801562000908573d6000803e3d6000fd5b5050505060006200091c6000898962000c1b565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146200098f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200098690620014b8565b60405180910390fd5b6040518a9073ffffffffffffffffffffffffffffffffffffffff8416907ff7e9cc0138f2460de56932c3eced1d4e1579a83664506c19d4304af26aa48bd490600090a3509650505050505050620009e562000cf9565b98975050505050505050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000a4c73ffffffffffffffffffffffffffffffffffffffff831615156101ac62000d00565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000b1f81838662000d15565b505050505050505050919050565b600062000b5e6000357fffffffff000000000000000000000000000000000000000000000000000000001662000526565b905062000b7962000b70823362000d73565b61019162000d00565b50565b62000b9362000b8a620004f9565b1560d362000d00565b565b62000ba96002600354141561019062000d00565b6002600355565b600062000bbf83833062000e11565b9392505050565b60008062000bd48362000e52565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790559392505050565b6000808447101562000c5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000986906200144a565b825162000c96576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200098690620014ef565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009869062001481565b949350505050565b6001600355565b8162000d115762000d118162000eed565b5050565b5b6020811062000d37578151835260209283019290910190601f190162000d16565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000d7f6200059e565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000dbd9392919062001409565b60206040518083038186803b15801562000dd657600080fd5b505afa15801562000deb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bbf919062001156565b60008060ff60f81b83868660405160200162000e319493929190620012e6565b60408051808303601f19018152919052805160209091012095945050505050565b600062000e5e62000b7c565b600062000e6b8362000f19565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b62000b79817f42414c000000000000000000000000000000000000000000000000000000000062000f5d565b6000606062000f288362000a52565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811662000bbf573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611ef5806200169383390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f830112620010c6578081fd5b813567ffffffffffffffff80821115620010de578283fd5b6040516020601f19601f8501168201018181108382111715620010ff578485fd5b6040528281529250828483016020018610156200111b57600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121562001149578081fd5b813562000bbf816200166f565b60006020828403121562001168578081fd5b8151801515811462000bbf578182fd5b6000602082840312156200118a578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811462000bbf578182fd5b600060208284031215620011cc578081fd5b815162000bbf816200166f565b600080600080600080600080610100898b031215620011f6578384fd5b883567ffffffffffffffff808211156200120e578586fd5b6200121c8c838d01620010b5565b995060208b013591508082111562001232578586fd5b50620012418b828c01620010b5565b975050604089013562001254816200166f565b9550606089013562001266816200166f565b94506080890135935060a0890135925060c089013562001286816200166f565b8092505060e089013590509295985092959890939650565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620012d28160208601602086016200163c565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b600083516200138e8184602088016200163c565b835190830190620013a48183602088016200163c565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000bbf6020830184620012b8565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b6000602082526200153c6020830184516200129e565b60208301516101808060408501526200155a6101a0850183620012b8565b91506040850151601f19808685030160608701526200157a8483620012b8565b9350606087015191506200159260808701836200129e565b60808701519150620015a860a08701836200129e565b60a08701519150620015be60c08701836200129e565b60c087015160e087810191909152870151610100808801919091528701516101208088019190915287015161014080880191909152870151915061016062001609818801846200129e565b870151868503909101838701529050620016248382620012b8565b9695505050505050565b918252602082015260400190565b60005b83811015620016595781810151838201526020016200163f565b8381111562001669576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000b7957600080fdfe6101806040523480156200001257600080fd5b5060405162001ef538038062001ef5833981016040819052620000359162000582565b6200003f6200041c565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b1580156200007b57600080fd5b505afa15801562000090573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620000ba9190810190620004be565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b158015620000f457600080fd5b505afa15801562000109573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200012f919062000569565b815181106200013a57fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200019957600080fd5b505afa158015620001ae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d4919062000569565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200021557600080fd5b505afa1580156200022a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000250919062000498565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b158015620002a657600080fd5b505afa158015620002bb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e1919062000498565b6001600160601b0319606091821b811660e05292811b8316610120521b1661014052506000620003106200041c565b90506000816001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200034e57600080fd5b505afa15801562000363573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000389919062000498565b9050806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015620003c557600080fd5b505afa158015620003da573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000400919062000498565b60601b6001600160601b03191661016052506200060092505050565b6000336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200045857600080fd5b505afa1580156200046d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000493919062000498565b905090565b600060208284031215620004aa578081fd5b8151620004b781620005e7565b9392505050565b60006020808385031215620004d1578182fd5b82516001600160401b0380821115620004e8578384fd5b818501915085601f830112620004fc578384fd5b8151818111156200050b578485fd5b83810291506200051d848301620005c0565b8181528481019084860184860187018a101562000538578788fd5b8795505b838610156200055c5780518352600195909501949186019186016200053c565b5098975050505050505050565b6000602082840312156200057b578081fd5b5051919050565b6000806040838503121562000595578081fd5b8251620005a281620005e7565b6020840151909250620005b581620005e7565b809150509250929050565b6040518181016001600160401b0381118282101715620005df57600080fd5b604052919050565b6001600160a01b0381168114620005fd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c6101605160601c61180a620006eb60003980610cbf528061100a52806110d4528061113652508061050952806108215250806101335280610c145280610f0f5280610f715250806103bf52508061046c5280610599528061074852806108ec52508060ea5280610190528061043052806105cc528061063152806106d2528061078452806108b152806110b252508061016f5280610402528061071a5280610a7d5280610b5c5280610d975280610e7652508060995280610309525061180a6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611514565b60405180910390f35b6100776100723660046113d2565b6100bb565b60405161005b9190611747565b6100776100923660046113ee565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc929190611660565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c9190611474565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a9392919061155c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a49190611451565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f561131f565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c9611382565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611684565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105929190611439565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d2b565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611514565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b69190611439565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fa6565b9695505050505050565b600061070d61131f565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e1611382565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611684565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa9190611439565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fca565b611098565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d2b565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a91906114f8565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b69190611419565b6101a2611170565b60006109cd8215156004611170565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b6005611170565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f6113a9565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016115dc565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517f05fe138b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906305fe138b90610cf69084903090600401611660565b600060405180830381600087803b158015610d1057600080fd5b505af1158015610d24573d6000803e3d6000fd5b5050505050565b6040805160028082526060828101909352816020015b610d496113a9565b815260200190600190039081610d41579050509050600281600081518110610d6d57fe5b6020026020010151600001906002811115610d8457fe5b90816002811115610d9157fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610dc357fe5b602002602001015160200181815250508181600081518110610de157fe5b602002602001015160600181815250508281600081518110610dff57fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e4c57fe5b6020026020010151600001906002811115610e6357fe5b90816002811115610e7057fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ea257fe5b602002602001015160200181815250508181600181518110610ec057fe5b602002602001015160600181815250508281600181518110610ede57fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f349084167f000000000000000000000000000000000000000000000000000000000000000084611182565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016115dc565b610fc58363a9059cbb60e01b848460405160240161027a9291906115b6565b505050565b6040517f5427c93800000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635427c9389061103f908590600401611747565b60206040518083038186803b15801561105757600080fd5b505afa15801561106b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108f9190611439565b60010192915050565b6110f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611182565b6040517f9aa5d46200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639aa5d46290610cf69084903090600090600401611750565b8161117e5761117e81611277565b5050565b801580159061123357506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e906111e09030908690600401611535565b60206040518083038186803b1580156111f857600080fd5b505afa15801561120c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112309190611439565b15155b15611258576112588363095ea7b360e01b84600060405160240161027a92919061158d565b610fc58363095ea7b360e01b848460405160240161027a9291906115b6565b6112a1817f42414c00000000000000000000000000000000000000000000000000000000006112a4565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6000602082840312156113e3578081fd5b813561011b816117b2565b60008060408385031215611400578081fd5b823561140b816117b2565b946020939093013593505050565b60006020828403121561142a578081fd5b8151801515811461011b578182fd5b60006020828403121561144a578081fd5b5051919050565b60008060408385031215611463578182fd5b505080516020909101519092909150565b60008060008060808587031215611489578182fd5b84519350602085015192506040850151915060608501516114a9816117b2565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161150a81846020870161177c565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561165357815180516003811061160f57fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff168686015260609081015190850152608090930192908501906001016115f9565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a0830152602084015161169f816117a8565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c061014084015280518061016085015261018061170b828287016020860161177c565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b60208301846114b4565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff919091166020830152604082015260600190565b60005b8381101561179757818101518382015260200161177f565b838111156102fc5750506000910152565b600281106112a157fe5b73ffffffffffffffffffffffffffffffffffffffff811681146112a157600080fdfea2646970667358221220a3ec33f4d31e9d7f57d60a45a18ed992e3e68902209e08490c4ddb3ce48cdce764736f6c63430007010033a264697066735822122036ba2d4227cbffdc12383a8c64eec9984ed125306f74687ef7f67667d7f0209864736f6c634300070100336102c06040523480156200001257600080fd5b506040516200598338038062005983833981016040819052620000359162000df2565b6101608101518151602083015160408401516060850151608086015160c087015162000061886200047d565b60e08901516101008a01516101208b01516101408c01518a6200009e8160006200008c8c8c62000506565b89620005b760201b620014241760201c565b8b8b86868686838387878b86336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000ed92919062000c7b565b5080516200010390600490602084019062000c7b565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001829050630163f50083111561019462000785565b620001966276a70082111561019562000785565b4291909101610140819052016101605260601b6001600160601b031916610180526101a08690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000db3565b6001600160a01b03166101c0816001600160a01b031660601b8152505050505050505050876001600160a01b03166101e0816001600160a01b031660601b81525050866001600160a01b0316610200816001600160a01b031660601b81525050866001600160a01b0316886001600160a01b031610620002bb576002620002be565b60015b60ff16610220526001600160a01b0380881690891610620002e1576001620002e4565b60025b60ff1661024052620002f6886200079a565b6102605262000305876200079a565b6102805260006200031889828962000846565b620003238562000940565b50508a51620003469a506009995060208c019850965062000c7b95505050505050565b5050600081608001516001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038857600080fd5b505afa1580156200039d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003c3919062000db3565b905062000465816001600160a01b0316632495a5996040518163ffffffff1660e01b815260040160206040518083038186803b1580156200040357600080fd5b505afa15801562000418573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200043e919062000db3565b6001600160a01b031683606001516001600160a01b0316146102086200078560201b60201c565b60601b6001600160601b0319166102a052506200106f565b6040805160028082526060808301845292839291906020830190803683370190505090508260a0015181600081518110620004b457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260a0015181600181518110620004e757fe5b6001600160a01b03909216602092830291909101909101529050919050565b60408051600280825260608281019093526001600160a01b0384811690861610918391816020016020820280368337019050509050816200054857836200054a565b845b816000815181106200055857fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508162000585578462000587565b835b816001815181106200059557fe5b6001600160a01b03909216602092830291909101909101529150505b92915050565b6000620005cf83620009cf60201b620015d91760201c565b606083516001016001600160401b0381118015620005ec57600080fd5b5060405190808252806020026020018201604052801562000617578160200160208202803683370190505b50905030816000815181106200062957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156200069c578481815181106200066357fe5b60200260200101518282600101815181106200067b57fe5b6001600160a01b03909216602092830291909101909101526001016200064c565b50606083516001016001600160401b0381118015620006ba57600080fd5b50604051908082528060200260200182016040528015620006e5578160200160208202803683370190505b509050600081600081518110620006f857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156200076b578481815181106200073257fe5b60200260200101518282600101815181106200074a57fe5b6001600160a01b03909216602092830291909101909101526001016200071b565b506200077a87878484620009db565b979650505050505050565b816200079657620007968162000ad5565b5050565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620007d757600080fd5b505afa158015620007ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000812919062000f49565b60ff16905060006200083160128362000aea60201b620015e71760201c565b600a0a670de0b6b3a764000002949350505050565b620008578183111561014c62000785565b620008746b0de0b6b39983494c589c000082111561014d62000785565b6200088e670de0b6b3a7640000825b061561016162000785565b620008a2670de0b6b3a76400008362000883565b620008f1670de0b6b3a7640000820460406020620008db670de0b6b3a764000087600854919004602080620015fd62000b02821b17811c565b62000b0260201b620015fd17909392919060201c565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d12809062000933908590859062001018565b60405180910390a2505050565b6200095564e8d4a5100082101560cb62000785565b6200096d67016345785d8a000082111560ca62000785565b6200098f8160c0603f60085462000b0260201b620015fd17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90620009c49083906200100f565b60405180910390a150565b80620007968162000b27565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040162000a0c919062000ffa565b602060405180830381600087803b15801562000a2757600080fd5b505af115801562000a3c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a62919062000dd9565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000a979084908890889060040162000f6c565b600060405180830381600087803b15801562000ab257600080fd5b505af115801562000ac7573d6000803e3d6000fd5b509298975050505050505050565b62000ae7816210905360ea1b62000bb3565b50565b600062000afc83831115600162000785565b50900390565b600062000b1184848462000c14565b506001901b60001901811b1992909216911b1790565b60028151101562000b385762000ae7565b60008160008151811062000b4857fe5b602002602001015190506000600190505b825181101562000bae57600083828151811062000b7257fe5b6020026020010151905062000ba3816001600160a01b0316846001600160a01b03161060656200078560201b60201c565b915060010162000b59565b505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b62000c256101008310606462000785565b62000c5e6001821015801562000c56575062000c5260ff846101000362000c6f60201b620016201760201c565b8211155b606462000785565b62000bae83821c156101b462000785565b80820390821102900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000cbe57805160ff191683800117855562000cee565b8280016001018555821562000cee579182015b8281111562000cee57825182559160200191906001019062000cd1565b5062000cfc92915062000d00565b5090565b5b8082111562000cfc576000815560010162000d01565b8051620005b18162001059565b600082601f83011262000d35578081fd5b81516001600160401b0381111562000d4b578182fd5b602062000d61601f8301601f1916820162001026565b9250818352848183860101111562000d7857600080fd5b60005b8281101562000d9857848101820151848201830152810162000d7b565b8281111562000daa5760008284860101525b50505092915050565b60006020828403121562000dc5578081fd5b815162000dd28162001059565b9392505050565b60006020828403121562000deb578081fd5b5051919050565b60006020828403121562000e04578081fd5b81516001600160401b038082111562000e1b578283fd5b818401915061018080838703121562000e32578384fd5b62000e3d8162001026565b905062000e4b868462000d17565b815260208301518281111562000e5f578485fd5b62000e6d8782860162000d24565b60208301525060408301518281111562000e85578485fd5b62000e938782860162000d24565b60408301525062000ea8866060850162000d17565b606082015262000ebc866080850162000d17565b608082015262000ed08660a0850162000d17565b60a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014062000f128782860162000d17565b90820152610160838101518381111562000f2a578586fd5b62000f388882870162000d24565b918301919091525095945050505050565b60006020828403121562000f5b578081fd5b815160ff8116811462000dd2578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000fb85762000fa585516200104d565b8352938301939183019160010162000f90565b505084810360408601528551808252908201925081860190845b8181101562000ac75762000fe783516200104d565b8552938301939183019160010162000fd2565b60208101600383106200100957fe5b91905290565b90815260200190565b918252602082015260400190565b6040518181016001600160401b03811182821017156200104557600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b038116811462000ae757600080fd5b60805160a05160c05160e0516101005160601c6101205160601c61014051610160516101805160601c6101a0516101c05160601c6101e05160601c6102005160601c610220516102405161026051610280516102a05160601c61477a62001209600039806118435250806107f45250806107905280612a81525080610718528061081c5280610c515280612efc528061308552806131bd52806132c85280613445528061357d5250806107b252806109bc5280610c175280612ec8528061300a528061305152806131475280613189528061329452806133cf5280613411528061350752806135495250806113f852806126eb52806127b75280612aa75280612e7d5280612f96528061324a528061335b5250806109e052806110ee5280611ab15280611b5052806126a2528061276e5280612a465280612e3e5280612f4052806130d3528061320b528061330c52806134935250806111cc5250806109495250508061181d5250806117f9525080610fd1525080610fad525080610f5d5250806123df525080612421525080612400525061477a6000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e3660046140ae565b610608565b6040516103509190614441565b60405180910390f35b610361610668565b6040516103509190614685565b61038161037c366004613e80565b6106ff565b604051610350919061441e565b610343610716565b61034361073a565b6103a6610740565b60405161035093929190614429565b6103bd610769565b60405161035091906143e6565b6103816103d8366004613dd0565b610877565b6103e56108ed565b60405161035091906146bf565b6103436108f6565b61040d61040836600461416b565b610905565b005b610343610947565b610381610425366004613e80565b61096b565b61040d6109a6565b6103436109ba565b6104426109de565b604051610350919061433b565b61040d610a02565b610361610a56565b610343610ab7565b61047a610475366004613faf565b610aca565b604051610350929190614698565b610490610ae8565b6040516103509291906146b1565b610343610b26565b6103436104b4366004613d7c565b610cbb565b6104cc6104c7366004613faf565b610cda565b6040516103509291906143f9565b6103436104e8366004613d7c565b610d9c565b61040d610da7565b610343610f42565b61040d610f47565b610343610513366004614052565b610f59565b610442610fab565b610442610fcf565b610343610536366004613d7c565b610ff3565b61036161100e565b61034361055136600461411f565b61106f565b61040d610564366004614183565b6110a8565b610381610577366004613e80565b61111a565b61038161058a366004613e80565b611158565b610442611165565b61038161116f565b61040d611180565b6104426111ca565b61040d6105bd366004613e10565b6111ee565b6104cc6105d0366004613faf565b61126f565b6103436105e3366004613d98565b611306565b610343611343565b6103436113ec565b6104426113f6565b61034361141a565b6000846080015161063561061a610fcf565b6001600160a01b0316336001600160a01b03161460cd61162c565b61064a610640610947565b82146101f461162c565b61065261163a565b61065e8686868661164d565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b505050505090505b90565b600061070c338484611772565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074d6117da565b1592506107586117f7565b915061076261181b565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107db57fe5b6020026020010181815250506108196107f261183f565b7f00000000000000000000000000000000000000000000000000000000000000009061191b565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084557fe5b602002602001018181525050670de0b6b3a76400008160008151811061086757fe5b6020908102919091010152905090565b6000806108848533611306565b90506108a8336001600160a01b03871614806108a05750838210155b61019e61162c565b6108b3858585611953565b336001600160a01b038616148015906108ce57506000198114155b156108e0576108e08533858403611772565b60019150505b9392505050565b60055460ff1690565b60006109006113ec565b905090565b61090d611a33565b610915611a7c565b600080610920610ae8565b915091506109396109318383611a8c565b61014f61162c565b61094283611b93565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070c9185906109a19086611c0b565b611772565b6109ae611a33565b6109b86000611c1d565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a0a611a33565b610a12611cae565b610a1c6001611cc2565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4c919061441e565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906109009060c0603f611d04565b60006060610adc888785611d13611d2a565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0582602080611d04565b029250670de0b6b3a7640000610b1e8260406020611d04565b029150509091565b600080610b31610947565b90506060610b3d610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b689190614441565b60006040518083038186803b158015610b8057600080fd5b505afa158015610b94573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbc9190810190613eab565b50915050610bd181610bcc610769565b611e91565b600080610bdc610ae8565b91509150610be8613aed565b6040518060600160405280610bfb610ab7565b81526020018481526020018381525090506000610c87610c4e867f000000000000000000000000000000000000000000000000000000000000000081518110610c4057fe5b602002602001015184611efa565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7a57fe5b6020026020010151611f5b565b9050610cb0610ca986600081518110610c9c57fe5b6020026020010151611f67565b8290611f7b565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce961061a610fcf565b610cf4610640610947565b6000610cff85611fd2565b15610d2757610d0c612001565b610d1e88610d1861073a565b87612014565b94509050610d3f565b610d2f61163a565b610d3a8a8987611d13565b945090505b610d498a8261210a565b835167ffffffffffffffff81118015610d6157600080fd5b50604051908082528060200260200182016040528015610d8b578160200160208202803683370190505b509250505097509795505050505050565b600061071082610ff3565b6000610db1610947565b90506060610dbd610fcf565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de89190614441565b60006040518083038186803b158015610e0057600080fd5b505afa158015610e14573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3c9190810190613eab565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e8057fe5b602002602001018181525050610e94613b0e565b6040518060800160405280610ea8856106fc565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed9610fcf565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f0a9493929190614469565b600060405180830381600087803b158015610f2457600080fd5b505af1158015610f38573d6000803e3d6000fd5b5050505050505050565b600090565b610f4f611a33565b6109b86001611c1d565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8e9291906142c5565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108161061a610fcf565b61108c610640610947565b61109461163a565b61109f858585612114565b95945050505050565b6110b0611a33565b6110b8611a7c565b6000806110c3610ae8565b915091506110d46109318383611a8c565b6110e96110e18585611a8c565b61015761162c565b6111147f00000000000000000000000000000000000000000000000000000000000000008585612121565b50505050565b6000806111273385611306565b90508083106111415761113c33856000611772565b61114e565b61114e3385858403611772565b5060019392505050565b600061070c338484611953565b60006109006121f7565b6008546000906109009060ff612271565b611188611a33565b611190612001565b61119a6000611cc2565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4c919061441e565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121d8c610ff3565b8960405160200161123396959493929190614556565b604051602081830303815290604052805190602001209050611264888261125b878787612278565b886101f86122b7565b610f38888888611772565b6060808861127e61061a610fcf565b611289610640610947565b600061129361163a565b61129b61073a565b6112ed576112aa8a8a8761230e565b945090506112c36112b9610f42565b82101560cc61162c565b6112d560006112d0610f42565b6123a6565b6112e8896112e1610f42565b83036123a6565b610d49565b6112f88a8987611d13565b94509050610d4989826123a6565b6000611310610fcf565b6001600160a01b0316826001600160a01b031614156113325750600019610710565b61133c83836123b0565b9050610710565b6000806000611350610fcf565b6001600160a01b031663b05f8e48611366610947565b306040518363ffffffff1660e01b815260040161138492919061463c565b60806040518083038186803b15801561139c57600080fd5b505afa1580156113b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d491906141a4565b5050915091506113e5818301611f67565b9250505090565b60006109006123db565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061090061183f565b600061142f836115d9565b6060835160010167ffffffffffffffff8111801561144c57600080fd5b50604051908082528060200260200182016040528015611476578160200160208202803683370190505b509050308160008151811061148757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f6578481815181106114bf57fe5b60200260200101518282600101815181106114d657fe5b6001600160a01b03909216602092830291909101909101526001016114aa565b506060835160010167ffffffffffffffff8111801561151457600080fd5b5060405190808252806020026020018201604052801561153e578160200160208202803683370190505b50905060008160008151811061155057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115bf5784818151811061158857fe5b602002602001015182826001018151811061159f57fe5b6001600160a01b0390921660209283029190910190910152600101611573565b506115cc87878484612478565b925050505b949350505050565b806115e381612581565b5050565b60006115f783831115600161162c565b50900390565b600061160a8484846125fa565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e3576115e381612640565b6109b86116456117da565b61019261162c565b60006116696003841080156116625750600383105b606461162c565b6060611673610769565b905061167f8582611e91565b60008061168a610ae8565b91509150611696613aed565b60405180606001604052806116a9610ab7565b81526020810185905260400183905290506000895160018111156116c957fe5b141561172d576116f089606001518589815181106116e357fe5b602002602001015161266a565b60608a015260006117028a8a84612676565b90506117218186898151811061171457fe5b602002602001015161273d565b955050505050506115d1565b61174189606001518588815181106116e357fe5b60608a015260006117538a8a84612749565b905061172181868a8151811061176557fe5b60200260200101516127fe565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cd908590614441565b60405180910390a3505050565b60006117e461181b565b42118061090057505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663788c6bfe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561189a57600080fd5b505afa9250505080156118ca575060408051601f3d908101601f191682019092526118c791810190613f97565b60015b61190d573d8080156118f8576040519150601f19603f3d011682016040523d82523d6000602084013e6118fd565b606091505b506119078161280a565b506106fc565b633b9aca00900490506106fc565b600082820261193f84158061193857508385838161193557fe5b04145b600361162c565b670de0b6b3a7640000815b04949350505050565b61196a6001600160a01b038416151561019861162c565b6119816001600160a01b038316151561019961162c565b61198c838383610942565b6001600160a01b0383166000908152602081905260409020546119b290826101a0612891565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119e19082611c0b565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cd908590614441565b6000611a626000357fffffffff0000000000000000000000000000000000000000000000000000000016610f59565b9050611a79611a7182336128a7565b61019161162c565b50565b6109b8611a87610fcf565b612990565b6000806000611a99610fcf565b6001600160a01b031663b05f8e48611aaf610947565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611aed92919061463c565b60806040518083038186803b158015611b0557600080fd5b505afa158015611b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3d91906141a4565b5050915091506000611b79828401611b747f0000000000000000000000000000000000000000000000000000000000000000612a42565b61266a565b905085811015801561065e57509390931115949350505050565b611ba664e8d4a5100082101560cb61162c565b611bbc67016345785d8a000082111560ca61162c565b600854611bcd908260c0603f6115fd565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611c00908390614441565b60405180910390a150565b60008282016108e6848210158361162c565b8015611c3d57611c38611c2e6117f7565b421061019361162c565b611c52565b611c52611c4861181b565b42106101a961162c565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611c0090839061441e565b6109b8611cb961116f565b156101b561162c565b600854611cd1908260ff612b1c565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611c0090839061441e565b6001901b6000190191901c1690565b60006060611d226103e6612640565b935093915050565b333014611e19576000306001600160a01b0316600036604051611d4e9291906142f5565b6000604051808303816000865af19150503d8060008114611d8b576040519150601f19603f3d011682016040523d82523d6000602084013e611d90565b606091505b505090508060008114611d9f57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611dfb573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611e2c8686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611ea0908290612b2b565b60005b8181101561111457611edb848281518110611eba57fe5b6020026020010151848381518110611ece57fe5b602002602001015161191b565b848281518110611ee757fe5b6020908102919091010152600101611ea3565b60008160200151831015611f335781516020830151600091611f1f918690039061191b565b9050611f2b84826115e7565b915050610710565b81604001518311611f45575081610710565b81516040830151600091611f1f9186039061191b565b60006108e68383611c0b565b600061071082611f7561073a565b906115e7565b6000611f8a821515600461162c565b670de0b6b3a76400008302611fbc841580611fb55750670de0b6b3a7640000858381611fb257fe5b04145b600561162c565b6001836001830304018115150291505092915050565b6000808251118015610710575060ff801682806020019051810190611ff791906141e4565b60ff161492915050565b6109b861200c61116f565b6101b661162c565b60006060600061202384612b38565b90506060865167ffffffffffffffff8111801561203f57600080fd5b50604051908082528060200260200182016040528015612069578160200160208202803683370190505b5090506000612076610f42565b90506000612089898381518110610c9c57fe5b905060006120978583612b4e565b905060005b8a518110156120f957838114156120b45760006120da565b6120da828c83815181106120c457fe5b602002602001015161191b90919063ffffffff16565b8582815181106120e657fe5b602090810291909101015260010161209c565b509399929850919650505050505050565b6115e38282612b8e565b60006108e66103e6612640565b6121308183111561014c61162c565b61214b6b0de0b6b39983494c589c000082111561014d61162c565b612163670de0b6b3a7640000825b061561016161162c565b612175670de0b6b3a764000083612159565b6121aa670de0b6b3a76400008204604060206121a2670de0b6b3a7640000876008549190046020806115fd565b9291906115fd565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121ea90859085906146b1565b60405180910390a2505050565b6000612201610fcf565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561223957600080fd5b505afa15801561224d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109009190614092565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b60006122c285612c5a565b90506122d86122d2878387612c76565b8361162c565b6122e7428410156101b861162c565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606123296001600160a01b038616301461015661162c565b6123406001600160a01b038516301461015661162c565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff8160008151811061238f57fe5b602090810291909101015290969095509350505050565b6115e38282612d25565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612448612db8565b3060405160200161245d959493929190614610565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016124a79190614671565b602060405180830381600087803b1580156124c157600080fd5b505af11580156124d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f99190613f97565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d2906125459084908890889060040161458a565b600060405180830381600087803b15801561255f57600080fd5b505af1158015612573573d6000803e3d6000fd5b509298975050505050505050565b60028151101561259057611a79565b60008160008151811061259f57fe5b602002602001015190506000600190505b82518110156109425760008382815181106125c757fe5b602002602001015190506125f0816001600160a01b0316846001600160a01b031610606561162c565b91506001016125b0565b6126096101008310606461162c565b61263160018210158015611662575061262760ff8461010003611620565b821115606461162c565b61094283821c156101b461162c565b611a79817f42414c0000000000000000000000000000000000000000000000000000000000612dbc565b60006108e6838361191b565b60208301516000906001600160a01b03163014156126a057612699848484612e37565b90506108e6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b031614156126e957612699848484612f8f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612732576126998484846130cc565b6108e6610135612640565b60006108e68383612b4e565b60408301516000906001600160a01b031630141561276c57612699848484613204565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127b557612699848484613354565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156127325761269984848461348c565b60006108e68383611f7b565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417612885578160208401fd5b506115e3610165612640565b60006128a0848411158361162c565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128c6610fab565b6001600160a01b0316141580156128e157506128e1836135c4565b15612909576128ee610fab565b6001600160a01b0316336001600160a01b0316149050610710565b6129116121f7565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016129409392919061444a565b60206040518083038186803b15801561295857600080fd5b505afa15801561296c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133c9190613f77565b604080516000808252602082019092526060916129c3565b6129b0613b38565b8152602001906001900390816129a85790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e8490612a0c90849060040161434f565b600060405180830381600087803b158015612a2657600080fd5b505af1158015612a3a573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612aa557507f0000000000000000000000000000000000000000000000000000000000000000610cd5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612af157612aea6107f261183f565b9050610cd5565b6001600160a01b038216301415612b115750670de0b6b3a7640000610cd5565b610cd5610135612640565b6001811b1992909216911b1790565b6115e3818314606761162c565b6000818060200190518101906108e69190614200565b6000612b5d821515600461162c565b670de0b6b3a76400008302612b85841580611fb55750670de0b6b3a7640000858381611fb257fe5b82818161194a57fe5b612ba56001600160a01b038316151561019b61162c565b612bb182600083610942565b6001600160a01b038216600090815260208190526040902054612bd790826101b2612891565b6001600160a01b038316600090815260208190526040902055612c0a612c0582612bff61073a565b90613628565b613636565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c4e9190614441565b60405180910390a35050565b6000612c646123db565b82604051602001610f8e929190614305565b6000612c8882516041146101b961162c565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612cc1908990859088908890614653565b6020604051602081039080840390855afa158015612ce3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612d195750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612d3160008383610942565b612d46612c0582612d4061073a565b90611c0b565b6001600160a01b038216600090815260208190526040902054612d699082611c0b565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c4e908590614441565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612ebd7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eb557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162c565b6115d18460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612ef157fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f2557fe5b6020026020010151612f3d87600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612f835761363b612f87565b6136995b63ffffffff16565b6000612feb7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eb5575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b03163014613046576130418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061303357fe5b602002602001015184613702565b6115d1565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061307a57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130ae57fe5b60200260200101516130c687600081518110610c9c57fe5b86613732565b60006131287f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eb5575060408501516001600160a01b0316301461013561162c565b60408401516001600160a01b0316301461317e576130418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061317057fe5b602002602001015184613798565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131b257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106131e657fe5b60200260200101516131fe87600081518110610c9c57fe5b866137d8565b60006132897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eb557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162c565b6115d18460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132bd57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106132f157fe5b602002602001015161330987600081518110610c9c57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461334f5761383f612f87565b613896565b60006133b07f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eb5575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b03163014613406576130418460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106133f857fe5b602002602001015184613900565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061343a57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061346e57fe5b602002602001015161348687600081518110610c9c57fe5b8661392a565b60006134e87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eb5575060208501516001600160a01b0316301461013561162c565b60208401516001600160a01b0316301461353e576130418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061353057fe5b602002602001015184613979565b6115d18460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061357257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106135a657fe5b60200260200101516135be87600081518110610c9c57fe5b866139ae565b60006135ef7f9f11080e00000000000000000000000000000000000000000000000000000000610f59565b82148061071057506136207f38e9922e00000000000000000000000000000000000000000000000000000000610f59565b909114919050565b60006108e683836001612891565b600255565b6000806136488684611efa565b905060006136568287611f5b565b90506000613664868a6115e7565b9050600061367f84611f756136798587613a02565b8a613a1c565b905061368b88826115e7565b9a9950505050505050505050565b6000806136a68684611efa565b905060006136b48287611f5b565b905060006136cb6136c5838b613a02565b87613a3d565b905060006136d984836115e7565b905060006136e78288613a5d565b90506136f38a826115e7565b9b9a5050505050505050505050565b60008061370f8484611efa565b905060006137266137208688611c0b565b85611efa565b905061065e81836115e7565b60008261374a576137438683611efa565b905061109f565b60006137568684611efa565b90506000613767613720888a611c0b565b9050600061377582846115e7565b905060006137838489611f5b565b905061368b6137928884613a02565b82613a3d565b6000806137a58484611efa565b905060006137b382876115e7565b905060006137c18286613a5d565b90506137cd86826115e7565b979650505050505050565b6000826137e657508461109f565b60006137f28684611efa565b905060006138008287611f5b565b9050600061380e878a611c0b565b9050600061381c8483611f5b565b9050600061383361382d8984613a02565b85613a3d565b90506136f381896115e7565b60008261384d57508461109f565b60006138598684611efa565b905060006138678287611f5b565b90506000613875868a611c0b565b9050600061388a84611f756136798587613a02565b905061368b81896115e7565b6000826138a7576137438683613a5d565b60006138b38684611efa565b905060006138c18287611f5b565b905060006138d86138d2838b613a02565b87613a1c565b905060006138e68483611c0b565b905060006138f48288613a5d565b90506136f3818b6115e7565b60008061390d8484611efa565b9050600061391e61372086886115e7565b905061065e82826115e7565b6000806139378684611efa565b90506000613948613720888a6115e7565b9050600061395683836115e7565b905060006139648489611f5b565b905061368b6139738884613a02565b82613a1c565b6000806139868484611efa565b905060006139948287611c0b565b905060006139a28286613a5d565b90506137cd81876115e7565b6000806139bb8684611efa565b905060006139c98287611f5b565b905060006139d7878a6115e7565b905060006139e58483611f5b565b905060006139f661382d8984613a02565b90506136f388826115e7565b60008282026108e684158061193857508385838161193557fe5b6000613a2b821515600461162c565b50811515600019909201046001010290565b6000613a4c821515600461162c565b818381613a5557fe5b049392505050565b60008160200151831015613aa657815161133c90613a8490670de0b6b3a764000090611c0b565b60208401518451613aa091613a99919061191b565b8690611c0b565b90612b4e565b81604001518311613ab8575081610710565b815161133c90613ad190670de0b6b3a7640000906115e7565b60408401518451613aa091613ae6919061191b565b86906115e7565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561071081614720565b600082601f830112613b83578081fd5b8135613b96613b91826146f4565b6146cd565b818152915060208083019084810181840286018201871015613bb757600080fd5b60005b84811015613bd657813584529282019290820190600101613bba565b505050505092915050565b600082601f830112613bf1578081fd5b8151613bff613b91826146f4565b818152915060208083019084810181840286018201871015613c2057600080fd5b60005b84811015613bd657815184529282019290820190600101613c23565b600082601f830112613c4f578081fd5b813567ffffffffffffffff811115613c65578182fd5b613c786020601f19601f840116016146cd565b9150808252836020828501011115613c8f57600080fd5b8060208401602084013760009082016020015292915050565b80356002811061071057600080fd5b6000610120808385031215613cca578182fd5b613cd3816146cd565b915050613ce08383613ca8565b8152613cef8360208401613b68565b6020820152613d018360408401613b68565b6040820152606082013560608201526080820135608082015260a082013560a0820152613d318360c08401613b68565b60c0820152613d438360e08401613b68565b60e08201526101008083013567ffffffffffffffff811115613d6457600080fd5b613d7085828601613c3f565b82840152505092915050565b600060208284031215613d8d578081fd5b81356108e681614720565b60008060408385031215613daa578081fd5b8235613db581614720565b91506020830135613dc581614720565b809150509250929050565b600080600060608486031215613de4578081fd5b8335613def81614720565b92506020840135613dff81614720565b929592945050506040919091013590565b600080600080600080600060e0888a031215613e2a578283fd5b8735613e3581614720565b96506020880135613e4581614720565b955060408801359450606088013593506080880135613e6381614735565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613e92578182fd5b8235613e9d81614720565b946020939093013593505050565b600080600060608486031215613ebf578081fd5b835167ffffffffffffffff80821115613ed6578283fd5b818601915086601f830112613ee9578283fd5b8151613ef7613b91826146f4565b80828252602080830192508086018b828387028901011115613f17578788fd5b8796505b84871015613f42578051613f2e81614720565b845260019690960195928101928101613f1b565b508901519097509350505080821115613f59578283fd5b50613f6686828701613be1565b925050604084015190509250925092565b600060208284031215613f88578081fd5b815180151581146108e6578182fd5b600060208284031215613fa8578081fd5b5051919050565b600080600080600080600060e0888a031215613fc9578081fd5b873596506020880135613fdb81614720565b95506040880135613feb81614720565b9450606088013567ffffffffffffffff80821115614007578283fd5b6140138b838c01613b73565b955060808a0135945060a08a0135935060c08a0135915080821115614036578283fd5b506140438a828b01613c3f565b91505092959891949750929550565b600060208284031215614063578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e6578182fd5b6000602082840312156140a3578081fd5b81516108e681614720565b600080600080608085870312156140c3578182fd5b843567ffffffffffffffff808211156140da578384fd5b6140e688838901613cb7565b955060208701359150808211156140fb578384fd5b5061410887828801613b73565b949794965050505060408301359260600135919050565b600080600060608486031215614133578081fd5b833567ffffffffffffffff811115614149578182fd5b61415586828701613cb7565b9660208601359650604090950135949350505050565b60006020828403121561417c578081fd5b5035919050565b60008060408385031215614195578182fd5b50508035926020909101359150565b600080600080608085870312156141b9578182fd5b84519350602085015192506040850151915060608501516141d981614720565b939692955090935050565b6000602082840312156141f5578081fd5b81516108e681614735565b60008060408385031215614212578182fd5b825161421d81614735565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156142695781518752958201959082019060010161424d565b509495945050505050565b15159052565b60008151808452815b8181101561429f57602081850181015186830182015201614283565b818111156142b05782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b828110156143d957815180516004811061438257fe5b8552808701516143948887018261422d565b5085810151868601526060808201516143af8288018261422d565b5050608090810151906143c48682018361422d565b505060a093909301929085019060010161436c565b5091979650505050505050565b6000602082526108e6602083018461423a565b60006040825261440c604083018561423a565b828103602084015261109f818561423a565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156144da576144c48451614714565b82529284019260019290920191908401906144b2565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a0870152614518818561423a565b935050506040850151818584030160c0860152614535838261427a565b92505050606084015161454b60e0850182614274565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b818110156145d2576145c08551614714565b835293830193918301916001016145ae565b505084810360408601528551808252908201925081860190845b81811015612573576145fe8351614714565b855293830193918301916001016145ec565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016003831061467f57fe5b91905290565b6000602082526108e6602083018461427a565b6000838252604060208301526115d1604083018461423a565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156146ec57600080fd5b604052919050565b600067ffffffffffffffff82111561470a578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114611a7957600080fd5b60ff81168114611a7957600080fdfea26469706673582212209d9a043c5469f9ae318713c223e3d4cae3b6dc6f5705cc6a4f84082c6bc18c3064736f6c63430007010033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c80636634b7531162000099578063851c1bb3116200006f578063851c1bb314620001cd5780638d928af814620001f3578063aaabadc514620001fd578063df8af989146200020757620000ff565b80636634b75314620001935780636c57f5a914620001b9578063739238d614620001c357620000ff565b80632f2770db11620000db5780632f2770db146200015a5780633f819b6f146200016657806354fd4d5014620001705780635ed31282146200017a57620000ff565b8062c194db1462000104578063174481fa14620001265780632da47c401462000140575b600080fd5b6200010e6200021e565b6040516200011d919062001435565b60405180910390f35b620001306200023f565b6040516200011d929190620013ce565b6200014a62000285565b6040516200011d9291906200162e565b620001646200030e565b005b6200010e62000378565b6200010e62000430565b62000184620004b2565b6040516200011d9190620013ad565b620001aa620001a436600462001137565b620004ce565b6040516200011d9190620013f5565b620001aa620004f9565b6200018462000502565b620001e4620001de36600462001178565b62000526565b6040516200011d919062001400565b620001846200057a565b620001846200059e565b6200018462000218366004620011d9565b6200062b565b60606200023a6040518060200160405280600081525062000a52565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200030057807f00000000000000000000000000000000000000000000000000000000000000000392507f0000000000000000000000000000000000000000000000000000000000000000915062000309565b60009250600091505b509091565b6200031862000b2d565b6200032262000b7c565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b820191906000526020600020905b8154815290600101906020018083116200040857829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016200055d9291906200134a565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000620005aa6200057a565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620005f057600080fd5b505afa15801562000605573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023a9190620011ba565b60006200063762000b95565b6004805460018101909155604051606090620006566020820162000fd8565b601f1982820381018352601f90910116604052620006736200057a565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001620006a7929190620013ce565b60408051601f1981840301815290829052620006c792916020016200137a565b60405160208183030381529060405290506000620006ed83838051906020012062000bb0565b9050600080620006fc62000285565b915091506200070a62000fe6565b620007146200057a565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508e81602001819052508d81604001819052508c816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508a8160c0018181525050898160e0018181525050828161010001818152505081816101200181815250508881610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506200087262000378565b610160820152604051600090620008a8906200089390849060200162001526565b60405160208183030381529060405262000bc6565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620008f357600080fd5b505af115801562000908573d6000803e3d6000fd5b5050505060006200091c6000898962000c1b565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146200098f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200098690620014b8565b60405180910390fd5b6040518a9073ffffffffffffffffffffffffffffffffffffffff8416907ff7e9cc0138f2460de56932c3eced1d4e1579a83664506c19d4304af26aa48bd490600090a3509650505050505050620009e562000cf9565b98975050505050505050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000a4c73ffffffffffffffffffffffffffffffffffffffff831615156101ac62000d00565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000b1f81838662000d15565b505050505050505050919050565b600062000b5e6000357fffffffff000000000000000000000000000000000000000000000000000000001662000526565b905062000b7962000b70823362000d73565b61019162000d00565b50565b62000b9362000b8a620004f9565b1560d362000d00565b565b62000ba96002600354141561019062000d00565b6002600355565b600062000bbf83833062000e11565b9392505050565b60008062000bd48362000e52565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790559392505050565b6000808447101562000c5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000986906200144a565b825162000c96576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200098690620014ef565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009869062001481565b949350505050565b6001600355565b8162000d115762000d118162000eed565b5050565b5b6020811062000d37578151835260209283019290910190601f190162000d16565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000d7f6200059e565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000dbd9392919062001409565b60206040518083038186803b15801562000dd657600080fd5b505afa15801562000deb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bbf919062001156565b60008060ff60f81b83868660405160200162000e319493929190620012e6565b60408051808303601f19018152919052805160209091012095945050505050565b600062000e5e62000b7c565b600062000e6b8362000f19565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b62000b79817f42414c000000000000000000000000000000000000000000000000000000000062000f5d565b6000606062000f288362000a52565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811662000bbf573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611ef5806200169383390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f830112620010c6578081fd5b813567ffffffffffffffff80821115620010de578283fd5b6040516020601f19601f8501168201018181108382111715620010ff578485fd5b6040528281529250828483016020018610156200111b57600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121562001149578081fd5b813562000bbf816200166f565b60006020828403121562001168578081fd5b8151801515811462000bbf578182fd5b6000602082840312156200118a578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811462000bbf578182fd5b600060208284031215620011cc578081fd5b815162000bbf816200166f565b600080600080600080600080610100898b031215620011f6578384fd5b883567ffffffffffffffff808211156200120e578586fd5b6200121c8c838d01620010b5565b995060208b013591508082111562001232578586fd5b50620012418b828c01620010b5565b975050604089013562001254816200166f565b9550606089013562001266816200166f565b94506080890135935060a0890135925060c089013562001286816200166f565b8092505060e089013590509295985092959890939650565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620012d28160208601602086016200163c565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b600083516200138e8184602088016200163c565b835190830190620013a48183602088016200163c565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000bbf6020830184620012b8565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b6000602082526200153c6020830184516200129e565b60208301516101808060408501526200155a6101a0850183620012b8565b91506040850151601f19808685030160608701526200157a8483620012b8565b9350606087015191506200159260808701836200129e565b60808701519150620015a860a08701836200129e565b60a08701519150620015be60c08701836200129e565b60c087015160e087810191909152870151610100808801919091528701516101208088019190915287015161014080880191909152870151915061016062001609818801846200129e565b870151868503909101838701529050620016248382620012b8565b9695505050505050565b918252602082015260400190565b60005b83811015620016595781810151838201526020016200163f565b8381111562001669576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000b7957600080fdfe6101806040523480156200001257600080fd5b5060405162001ef538038062001ef5833981016040819052620000359162000582565b6200003f6200041c565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b1580156200007b57600080fd5b505afa15801562000090573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620000ba9190810190620004be565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b158015620000f457600080fd5b505afa15801562000109573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200012f919062000569565b815181106200013a57fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200019957600080fd5b505afa158015620001ae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d4919062000569565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200021557600080fd5b505afa1580156200022a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000250919062000498565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b158015620002a657600080fd5b505afa158015620002bb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e1919062000498565b6001600160601b0319606091821b811660e05292811b8316610120521b1661014052506000620003106200041c565b90506000816001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200034e57600080fd5b505afa15801562000363573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000389919062000498565b9050806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015620003c557600080fd5b505afa158015620003da573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000400919062000498565b60601b6001600160601b03191661016052506200060092505050565b6000336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200045857600080fd5b505afa1580156200046d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000493919062000498565b905090565b600060208284031215620004aa578081fd5b8151620004b781620005e7565b9392505050565b60006020808385031215620004d1578182fd5b82516001600160401b0380821115620004e8578384fd5b818501915085601f830112620004fc578384fd5b8151818111156200050b578485fd5b83810291506200051d848301620005c0565b8181528481019084860184860187018a101562000538578788fd5b8795505b838610156200055c5780518352600195909501949186019186016200053c565b5098975050505050505050565b6000602082840312156200057b578081fd5b5051919050565b6000806040838503121562000595578081fd5b8251620005a281620005e7565b6020840151909250620005b581620005e7565b809150509250929050565b6040518181016001600160401b0381118282101715620005df57600080fd5b604052919050565b6001600160a01b0381168114620005fd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c6101605160601c61180a620006eb60003980610cbf528061100a52806110d4528061113652508061050952806108215250806101335280610c145280610f0f5280610f715250806103bf52508061046c5280610599528061074852806108ec52508060ea5280610190528061043052806105cc528061063152806106d2528061078452806108b152806110b252508061016f5280610402528061071a5280610a7d5280610b5c5280610d975280610e7652508060995280610309525061180a6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611514565b60405180910390f35b6100776100723660046113d2565b6100bb565b60405161005b9190611747565b6100776100923660046113ee565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc929190611660565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c9190611474565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a9392919061155c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a49190611451565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f561131f565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c9611382565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611684565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105929190611439565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d2b565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611514565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b69190611439565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fa6565b9695505050505050565b600061070d61131f565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e1611382565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611684565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa9190611439565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fca565b611098565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d2b565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a91906114f8565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b69190611419565b6101a2611170565b60006109cd8215156004611170565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b6005611170565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f6113a9565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016115dc565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517f05fe138b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906305fe138b90610cf69084903090600401611660565b600060405180830381600087803b158015610d1057600080fd5b505af1158015610d24573d6000803e3d6000fd5b5050505050565b6040805160028082526060828101909352816020015b610d496113a9565b815260200190600190039081610d41579050509050600281600081518110610d6d57fe5b6020026020010151600001906002811115610d8457fe5b90816002811115610d9157fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610dc357fe5b602002602001015160200181815250508181600081518110610de157fe5b602002602001015160600181815250508281600081518110610dff57fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e4c57fe5b6020026020010151600001906002811115610e6357fe5b90816002811115610e7057fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ea257fe5b602002602001015160200181815250508181600181518110610ec057fe5b602002602001015160600181815250508281600181518110610ede57fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f349084167f000000000000000000000000000000000000000000000000000000000000000084611182565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016115dc565b610fc58363a9059cbb60e01b848460405160240161027a9291906115b6565b505050565b6040517f5427c93800000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635427c9389061103f908590600401611747565b60206040518083038186803b15801561105757600080fd5b505afa15801561106b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108f9190611439565b60010192915050565b6110f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611182565b6040517f9aa5d46200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639aa5d46290610cf69084903090600090600401611750565b8161117e5761117e81611277565b5050565b801580159061123357506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e906111e09030908690600401611535565b60206040518083038186803b1580156111f857600080fd5b505afa15801561120c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112309190611439565b15155b15611258576112588363095ea7b360e01b84600060405160240161027a92919061158d565b610fc58363095ea7b360e01b848460405160240161027a9291906115b6565b6112a1817f42414c00000000000000000000000000000000000000000000000000000000006112a4565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6000602082840312156113e3578081fd5b813561011b816117b2565b60008060408385031215611400578081fd5b823561140b816117b2565b946020939093013593505050565b60006020828403121561142a578081fd5b8151801515811461011b578182fd5b60006020828403121561144a578081fd5b5051919050565b60008060408385031215611463578182fd5b505080516020909101519092909150565b60008060008060808587031215611489578182fd5b84519350602085015192506040850151915060608501516114a9816117b2565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161150a81846020870161177c565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561165357815180516003811061160f57fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff168686015260609081015190850152608090930192908501906001016115f9565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a0830152602084015161169f816117a8565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c061014084015280518061016085015261018061170b828287016020860161177c565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b60208301846114b4565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff919091166020830152604082015260600190565b60005b8381101561179757818101518382015260200161177f565b838111156102fc5750506000910152565b600281106112a157fe5b73ffffffffffffffffffffffffffffffffffffffff811681146112a157600080fdfea2646970667358221220a3ec33f4d31e9d7f57d60a45a18ed992e3e68902209e08490c4ddb3ce48cdce764736f6c63430007010033a264697066735822122036ba2d4227cbffdc12383a8c64eec9984ed125306f74687ef7f67667d7f0209864736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/artifact/GearboxLinearPoolRebalancer.json b/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/artifact/GearboxLinearPoolRebalancer.json new file mode 100644 index 0000000..a2933cf --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/artifact/GearboxLinearPoolRebalancer.json @@ -0,0 +1,83 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GearboxLinearPoolRebalancer", + "sourceName": "contracts/gearbox-linear-pool/GearboxLinearPoolRebalancer.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IBalancerQueries", + "name": "queries", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "getPool", + "outputs": [ + { + "internalType": "contract ILinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "rebalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "extraMain", + "type": "uint256" + } + ], + "name": "rebalanceWithExtraMain", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101806040523480156200001257600080fd5b5060405162001ef538038062001ef5833981016040819052620000359162000582565b6200003f6200041c565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b1580156200007b57600080fd5b505afa15801562000090573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620000ba9190810190620004be565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b158015620000f457600080fd5b505afa15801562000109573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200012f919062000569565b815181106200013a57fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200019957600080fd5b505afa158015620001ae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d4919062000569565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200021557600080fd5b505afa1580156200022a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000250919062000498565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b158015620002a657600080fd5b505afa158015620002bb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e1919062000498565b6001600160601b0319606091821b811660e05292811b8316610120521b1661014052506000620003106200041c565b90506000816001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200034e57600080fd5b505afa15801562000363573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000389919062000498565b9050806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015620003c557600080fd5b505afa158015620003da573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000400919062000498565b60601b6001600160601b03191661016052506200060092505050565b6000336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200045857600080fd5b505afa1580156200046d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000493919062000498565b905090565b600060208284031215620004aa578081fd5b8151620004b781620005e7565b9392505050565b60006020808385031215620004d1578182fd5b82516001600160401b0380821115620004e8578384fd5b818501915085601f830112620004fc578384fd5b8151818111156200050b578485fd5b83810291506200051d848301620005c0565b8181528481019084860184860187018a101562000538578788fd5b8795505b838610156200055c5780518352600195909501949186019186016200053c565b5098975050505050505050565b6000602082840312156200057b578081fd5b5051919050565b6000806040838503121562000595578081fd5b8251620005a281620005e7565b6020840151909250620005b581620005e7565b809150509250929050565b6040518181016001600160401b0381118282101715620005df57600080fd5b604052919050565b6001600160a01b0381168114620005fd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c6101605160601c61180a620006eb60003980610cbf528061100a52806110d4528061113652508061050952806108215250806101335280610c145280610f0f5280610f715250806103bf52508061046c5280610599528061074852806108ec52508060ea5280610190528061043052806105cc528061063152806106d2528061078452806108b152806110b252508061016f5280610402528061071a5280610a7d5280610b5c5280610d975280610e7652508060995280610309525061180a6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611514565b60405180910390f35b6100776100723660046113d2565b6100bb565b60405161005b9190611747565b6100776100923660046113ee565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc929190611660565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c9190611474565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a9392919061155c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a49190611451565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f561131f565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c9611382565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611684565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105929190611439565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d2b565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611514565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b69190611439565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fa6565b9695505050505050565b600061070d61131f565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e1611382565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611684565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa9190611439565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fca565b611098565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d2b565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a91906114f8565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b69190611419565b6101a2611170565b60006109cd8215156004611170565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b6005611170565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f6113a9565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016115dc565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517f05fe138b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906305fe138b90610cf69084903090600401611660565b600060405180830381600087803b158015610d1057600080fd5b505af1158015610d24573d6000803e3d6000fd5b5050505050565b6040805160028082526060828101909352816020015b610d496113a9565b815260200190600190039081610d41579050509050600281600081518110610d6d57fe5b6020026020010151600001906002811115610d8457fe5b90816002811115610d9157fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610dc357fe5b602002602001015160200181815250508181600081518110610de157fe5b602002602001015160600181815250508281600081518110610dff57fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e4c57fe5b6020026020010151600001906002811115610e6357fe5b90816002811115610e7057fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ea257fe5b602002602001015160200181815250508181600181518110610ec057fe5b602002602001015160600181815250508281600181518110610ede57fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f349084167f000000000000000000000000000000000000000000000000000000000000000084611182565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016115dc565b610fc58363a9059cbb60e01b848460405160240161027a9291906115b6565b505050565b6040517f5427c93800000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635427c9389061103f908590600401611747565b60206040518083038186803b15801561105757600080fd5b505afa15801561106b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108f9190611439565b60010192915050565b6110f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611182565b6040517f9aa5d46200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639aa5d46290610cf69084903090600090600401611750565b8161117e5761117e81611277565b5050565b801580159061123357506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e906111e09030908690600401611535565b60206040518083038186803b1580156111f857600080fd5b505afa15801561120c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112309190611439565b15155b15611258576112588363095ea7b360e01b84600060405160240161027a92919061158d565b610fc58363095ea7b360e01b848460405160240161027a9291906115b6565b6112a1817f42414c00000000000000000000000000000000000000000000000000000000006112a4565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6000602082840312156113e3578081fd5b813561011b816117b2565b60008060408385031215611400578081fd5b823561140b816117b2565b946020939093013593505050565b60006020828403121561142a578081fd5b8151801515811461011b578182fd5b60006020828403121561144a578081fd5b5051919050565b60008060408385031215611463578182fd5b505080516020909101519092909150565b60008060008060808587031215611489578182fd5b84519350602085015192506040850151915060608501516114a9816117b2565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161150a81846020870161177c565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561165357815180516003811061160f57fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff168686015260609081015190850152608090930192908501906001016115f9565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a0830152602084015161169f816117a8565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c061014084015280518061016085015261018061170b828287016020860161177c565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b60208301846114b4565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff919091166020830152604082015260600190565b60005b8381101561179757818101518382015260200161177f565b838111156102fc5750506000910152565b600281106112a157fe5b73ffffffffffffffffffffffffffffffffffffffff811681146112a157600080fdfea2646970667358221220a3ec33f4d31e9d7f57d60a45a18ed992e3e68902209e08490c4ddb3ce48cdce764736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611514565b60405180910390f35b6100776100723660046113d2565b6100bb565b60405161005b9190611747565b6100776100923660046113ee565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610122565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333085610259565b61011b83610122565b9392505050565b60008061012d610302565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101cc929190611660565b60806040518083038186803b1580156101e457600080fd5b505afa1580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c9190611474565b50505090508181101561023e57610235818303856103eb565b925050506100c9565b818111156102525761023582820385610703565b5050919050565b6102fc846323b872dd60e01b85858560405160240161027a9392919061155c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610911565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036c57600080fd5b505afa158015610380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a49190611451565b9150915060006002828401816103b657fe5b0490506103e3817f00000000000000000000000000000000000000000000000000000000000000006109be565b935050505090565b60006103f561131f565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104c9611382565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906105409086908690600401611684565b602060405180830381600087803b15801561055a57600080fd5b505af115801561056e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105929190611439565b90506105be7f000000000000000000000000000000000000000000000000000000000000000082610a11565b6105c781610c82565b6105f17f000000000000000000000000000000000000000000000000000000000000000087610d2b565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610666903090600401611514565b60206040518083038186803b15801561067e57600080fd5b505afa158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b69190611439565b90506106f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fa6565b9695505050505050565b600061070d61131f565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e1611382565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906108589086908690600401611684565b602060405180830381600087803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa9190611439565b90506108d67f000000000000000000000000000000000000000000000000000000000000000087610a11565b6108e76108e282610fca565b611098565b6105f17f000000000000000000000000000000000000000000000000000000000000000082610d2b565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093a91906114f8565b6000604051808303816000865af19150503d8060008114610977576040519150601f19603f3d011682016040523d82523d6000602084013e61097c565b606091505b50915091506000821415610994573d6000803e3d6000fd5b6102fc8151600014806109b65750818060200190518101906109b69190611419565b6101a2611170565b60006109cd8215156004611170565b670de0b6b3a764000083026109ff8415806109f85750670de0b6b3a76400008583816109f557fe5b04145b6005611170565b828181610a0857fe5b04949350505050565b6040805160028082526060828101909352816020015b610a2f6113a9565b815260200190600190039081610a27579050509050600081600081518110610a5357fe5b6020026020010151600001906002811115610a6a57fe5b90816002811115610a7757fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aa957fe5b602002602001015160200181815250508181600081518110610ac757fe5b602002602001015160600181815250508281600081518110610ae557fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3257fe5b6020026020010151600001906002811115610b4957fe5b90816002811115610b5657fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8857fe5b60200260200101516020018181525050600081600181518110610ba757fe5b602002602001015160600181815250508281600181518110610bc557fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4b9084906004016115dc565b600060405180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b50505050505050565b6040517f05fe138b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906305fe138b90610cf69084903090600401611660565b600060405180830381600087803b158015610d1057600080fd5b505af1158015610d24573d6000803e3d6000fd5b5050505050565b6040805160028082526060828101909352816020015b610d496113a9565b815260200190600190039081610d41579050509050600281600081518110610d6d57fe5b6020026020010151600001906002811115610d8457fe5b90816002811115610d9157fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610dc357fe5b602002602001015160200181815250508181600081518110610de157fe5b602002602001015160600181815250508281600081518110610dff57fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e4c57fe5b6020026020010151600001906002811115610e6357fe5b90816002811115610e7057fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ea257fe5b602002602001015160200181815250508181600181518110610ec057fe5b602002602001015160600181815250508281600181518110610ede57fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f349084167f000000000000000000000000000000000000000000000000000000000000000084611182565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4b9084906004016115dc565b610fc58363a9059cbb60e01b848460405160240161027a9291906115b6565b505050565b6040517f5427c93800000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690635427c9389061103f908590600401611747565b60206040518083038186803b15801561105757600080fd5b505afa15801561106b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108f9190611439565b60010192915050565b6110f973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611182565b6040517f9aa5d46200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639aa5d46290610cf69084903090600090600401611750565b8161117e5761117e81611277565b5050565b801580159061123357506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e906111e09030908690600401611535565b60206040518083038186803b1580156111f857600080fd5b505afa15801561120c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112309190611439565b15155b15611258576112588363095ea7b360e01b84600060405160240161027a92919061158d565b610fc58363095ea7b360e01b848460405160240161027a9291906115b6565b6112a1817f42414c00000000000000000000000000000000000000000000000000000000006112a4565b50565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6000602082840312156113e3578081fd5b813561011b816117b2565b60008060408385031215611400578081fd5b823561140b816117b2565b946020939093013593505050565b60006020828403121561142a578081fd5b8151801515811461011b578182fd5b60006020828403121561144a578081fd5b5051919050565b60008060408385031215611463578182fd5b505080516020909101519092909150565b60008060008060808587031215611489578182fd5b84519350602085015192506040850151915060608501516114a9816117b2565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b6000825161150a81846020870161177c565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561165357815180516003811061160f57fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff168686015260609081015190850152608090930192908501906001016115f9565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a0830152602084015161169f816117a8565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c061014084015280518061016085015261018061170b828287016020860161177c565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116860101935050505061011b60208301846114b4565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff919091166020830152604082015260600190565b60005b8381101561179757818101518382015260200161177f565b838111156102fc5750506000910152565b600281106112a157fe5b73ffffffffffffffffffffffffffffffffffffffff811681146112a157600080fdfea2646970667358221220a3ec33f4d31e9d7f57d60a45a18ed992e3e68902209e08490c4ddb3ce48cdce764736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/index.ts b/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/index.ts new file mode 100644 index 0000000..c593239 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/index.ts @@ -0,0 +1,105 @@ +import { bn } from '@helpers/numbers'; +import { Task, TaskMode, TaskRunOptions } from '@src'; +import { GearboxLinearPoolDeployment } from './input'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import * as expectEvent from '@helpers/expectEvent'; +import { ethers } from 'hardhat'; +import { getContractDeploymentTransactionHash, saveContractDeploymentTransactionHash } from '@src'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as GearboxLinearPoolDeployment; + const args = [ + input.Vault, + input.ProtocolFeePercentagesProvider, + input.BalancerQueries, + input.FactoryVersion, + input.PoolVersion, + input.InitialPauseWindowDuration, + input.BufferPeriodDuration, + ]; + + const factory = await task.deployAndVerify('GearboxLinearPoolFactory', args, from, force); + + if (task.mode === TaskMode.LIVE) { + // We also create a Pool using the factory and verify it, to let us compute their action IDs and so that future + // Pools are automatically verified. We however don't run any of this code in CHECK mode, since we don't care about + // the contracts deployed here. The action IDs will be checked to be correct via a different mechanism. + + // GearboxLinearPools require a Gearbox (Diesel) Token + // Using MockGearboxVault from 20230409-gearbox-linear-pool-v2 + const mockGearboxVault = await task.deployAndVerify('MockGearboxVault', [input.WETH], from, force); + const mockDieselTokenArgs = ['DO NOT USE - Mock Diesel Token', 'TEST', 18, mockGearboxVault.address]; + // Using MockGearboxDieselToken from 20230409-gearbox-linear-pool-v2 + const mockDieselToken = await task.deployAndVerify('MockGearboxDieselToken', mockDieselTokenArgs, from, force); + + // The assetManager, pauseWindowDuration and bufferPeriodDuration will be filled in later, but we need to declare + // them here to appease the type system. Those are constructor arguments, but automatically provided by the factory. + const mockPoolArgs = { + vault: input.Vault, + name: 'DO NOT USE - Mock Linear Pool', + symbol: 'TEST', + mainToken: input.WETH, + wrappedToken: mockDieselToken.address, + assetManager: undefined, + upperTarget: 0, + pauseWindowDuration: undefined, + bufferPeriodDuration: undefined, + swapFeePercentage: bn(1e12), + owner: ZERO_ADDRESS, + version: input.PoolVersion, + }; + + // This mimics the logic inside task.deploy + if (force || !task.output({ ensure: false })['MockGearboxLinearPool']) { + const PROTOCOL_ID = 0; + + const poolCreationReceipt = await ( + await factory.create( + mockPoolArgs.name, + mockPoolArgs.symbol, + mockPoolArgs.mainToken, + mockPoolArgs.wrappedToken, + mockPoolArgs.upperTarget, + mockPoolArgs.swapFeePercentage, + mockPoolArgs.owner, + PROTOCOL_ID + ) + ).wait(); + const event = expectEvent.inReceipt(poolCreationReceipt, 'PoolCreated'); + const mockPoolAddress = event.args.pool; + + await saveContractDeploymentTransactionHash(mockPoolAddress, poolCreationReceipt.transactionHash, task.network); + await task.save({ MockGearboxLinearPool: mockPoolAddress }); + } + + const mockPool = await task.instanceAt('GearboxLinearPool', task.output()['MockGearboxLinearPool']); + + // In order to verify the Pool's code, we need to complete its constructor arguments by computing the factory + // provided arguments (asset manager and pause durations). + + // The asset manager is found by querying the Vault + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, task.network); + const vault = await vaultTask.deployedInstance('Vault'); + + const { assetManager: assetManagerAddress } = await vault.getPoolTokenInfo(await mockPool.getPoolId(), input.WETH); + mockPoolArgs.assetManager = assetManagerAddress; + + // The durations require knowing when the Pool was created, so we look for the timestamp of its creation block. + const txHash = await getContractDeploymentTransactionHash(mockPool.address, task.network); + const tx = await ethers.provider.getTransactionReceipt(txHash); + const poolCreationBlock = await ethers.provider.getBlock(tx.blockNumber); + + // With those and the period end times, we can compute the durations. + const { pauseWindowEndTime, bufferPeriodEndTime } = await mockPool.getPausedState(); + mockPoolArgs.pauseWindowDuration = pauseWindowEndTime.sub(poolCreationBlock.timestamp); + mockPoolArgs.bufferPeriodDuration = bufferPeriodEndTime + .sub(poolCreationBlock.timestamp) + .sub(mockPoolArgs.pauseWindowDuration); + + // We are now ready to verify the Pool + await task.verify('GearboxLinearPool', mockPool.address, [mockPoolArgs]); + + // We can also verify the Asset Manager + await task.verify('GearboxLinearPoolRebalancer', assetManagerAddress, [input.Vault, input.BalancerQueries]); + } +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/input.ts b/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/input.ts new file mode 100644 index 0000000..62ce161 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/input.ts @@ -0,0 +1,31 @@ +import { Task, TaskMode } from '@src'; +import { MONTH } from '@helpers/time'; + +export type GearboxLinearPoolDeployment = { + Vault: string; + BalancerQueries: string; + ProtocolFeePercentagesProvider: string; + WETH: string; + FactoryVersion: string; + PoolVersion: string; + InitialPauseWindowDuration: number; + BufferPeriodDuration: number; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerQueries = new Task('20220721-balancer-queries', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); +const WETH = new Task('00000000-tokens', TaskMode.READ_ONLY); + +const BaseVersion = { version: 1, deployment: '20230213-gearbox-linear-pool' }; + +export default { + Vault, + BalancerQueries, + ProtocolFeePercentagesProvider, + WETH, + FactoryVersion: JSON.stringify({ name: 'GearboxLinearPoolFactory', ...BaseVersion }), + PoolVersion: JSON.stringify({ name: 'GearboxLinearPool', ...BaseVersion }), + InitialPauseWindowDuration: MONTH * 3, + BufferPeriodDuration: MONTH, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/output/goerli.json new file mode 100644 index 0000000..27990ab --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/output/goerli.json @@ -0,0 +1,6 @@ +{ + "GearboxLinearPoolFactory": "0x806E02Dea8d4a0882caD9fA3Fa75B212328692dE", + "MockGearboxVault": "0xa496bE32F7C9Abc49E8ba91A23d37cF6fA58651B", + "MockGearboxDieselToken": "0x4E11AEec21baF1660b1a46472963cB3DA7811C89", + "MockGearboxLinearPool": "0x007E1830BcC05039c3926d6478F6B2912376e52E" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/output/mainnet.json new file mode 100644 index 0000000..c50e2ee --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/output/mainnet.json @@ -0,0 +1,6 @@ +{ + "GearboxLinearPoolFactory": "0x2EbE41E1aa44D61c206A94474932dADC7D3FD9E3", + "MockGearboxVault": "0x7ADbdabaA80F654568421887c12F09E0C7BD9629", + "MockGearboxDieselToken": "0x4bE0E4d6184348c5BA845a4010528CFC779610b8", + "MockGearboxLinearPool": "0xa8b103A10A94f4f2D7Ed2FdCd5545E8075573307" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/readme.md b/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/readme.md new file mode 100644 index 0000000..a688abe --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/readme.md @@ -0,0 +1,17 @@ +# 2023-02-13 - Gearbox Linear Pool + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This deployment was deprecated in favor of a new version which uses create2 for pool deployment: [gearbox-linear-pool-v2](../../20230409-gearbox-linear-pool-v2/). + +First deployment of the `GearboxLinearPoolFactory`, for Linear Pools with a Gearbox yield-bearing token (dieselToken). +Already fixes the reentrancy issue described in https://forum.balancer.fi/t/reentrancy-vulnerability-scope-expanded/4345. +Also has a fix in the `GearboxLinearPoolRebalancer` to handle tokens which require the `SafeERC20` library for approvals. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`GearboxLinearPoolFactory` artifact](./artifact/GearboxLinearPoolFactory.json) +- [`GearboxLinearPool` artifact](./artifact/GearboxLinearPool.json) +- [`GearboxLinearPoolRebalancer` artifact](./artifact/GearboxLinearPoolRebalancer.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/test/task.fork.ts new file mode 100644 index 0000000..8c37740 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-gearbox-linear-pool/test/task.fork.ts @@ -0,0 +1,406 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; +import { setCode } from '@nomicfoundation/hardhat-network-helpers'; +import * as expectEvent from '@helpers/expectEvent'; +import { bn, fp, FP_ONE } from '@helpers/numbers'; +import { MAX_UINT256 } from '@helpers/constants'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; + +import { impersonate, getForkedNetwork, Task, TaskMode, getSigners } from '@src'; +import { describeForkTest } from '@src'; +import { deploy, instanceAt, getArtifact } from '@src'; + +export enum SwapKind { + GivenIn = 0, + GivenOut, +} + +describeForkTest('GearboxLinearPoolFactory', 'mainnet', 16636000, function () { + let owner: SignerWithAddress, holder: SignerWithAddress, other: SignerWithAddress; + let vault: Contract, mainToken: Contract; + let factory: Contract; + let rebalancer: Contract; + + let task: Task; + + const USDC = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'; + // Diesel USDC Token + const dUSDC = '0xc411db5f5eb3f7d552f9b8454b2d74097ccde6e3'; + const USDC_SCALING = bn(1e12); // USDC has 6 decimals, so its scaling factor is 1e12 + const USDC_HOLDER = '0xdfd5293d8e347dfe59e90efd55b2956a1343963d'; + const GEARBOX_VAULT = '0x86130bDD69143D8a4E5fc50bf4323D48049E98E4'; + + const SWAP_FEE_PERCENTAGE = fp(0.01); // 1% + + // The targets are set using 18 decimals, even if the token has fewer (as is the case for USDC); + const INITIAL_UPPER_TARGET = fp(1e6); + + // The initial midpoint (upper target / 2) must be between the final lower and upper targets + const FINAL_LOWER_TARGET = fp(0.2e6); + const FINAL_UPPER_TARGET = fp(5e6); + + const PROTOCOL_ID = 0; + + enum AttackType { + SET_TARGETS, + SET_SWAP_FEE, + } + + let pool: Contract; + let poolId: string; + + before('run task', async () => { + task = new Task('20230213-gearbox-linear-pool', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('GearboxLinearPoolFactory'); + }); + + before('load signers', async () => { + [, owner, other] = await getSigners(); + + holder = await impersonate(USDC_HOLDER, fp(100)); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + + mainToken = await task.instanceAt('IERC20', USDC); + await mainToken.connect(holder).approve(vault.address, MAX_UINT256); + }); + + enum LinearPoolState { + BALANCED, + MAIN_EXCESS, + MAIN_LACK, + } + + function itRebalancesThePool(expectedState: LinearPoolState) { + it('rebalance the pool', async () => { + const { lowerTarget, upperTarget } = await pool.getTargets(); + + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + + let fees; + if (scaledCash.gt(upperTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_EXCESS); + + const excess = scaledCash.sub(upperTarget); + fees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else if (scaledCash.lt(lowerTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_LACK); + + const lack = lowerTarget.sub(scaledCash); + fees = lack.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else { + expect(expectedState).to.equal(LinearPoolState.BALANCED); + + fees = 0; + } + + const initialRecipientMainBalance = await mainToken.balanceOf(other.address); + if (expectedState != LinearPoolState.BALANCED) { + await rebalancer.connect(holder).rebalance(other.address); + } else { + await rebalancer.connect(holder).rebalanceWithExtraMain(other.address, 5); + } + const finalRecipientMainBalance = await mainToken.balanceOf(other.address); + + if (fees > 0) { + // The recipient of the rebalance call should get the fees that were collected (though there's some rounding + // error in the main-wrapped conversion). + expect(finalRecipientMainBalance.sub(initialRecipientMainBalance)).to.be.almostEqual( + fees.div(USDC_SCALING), + 0.0001 + ); + } else { + // The recipient of the rebalance call will get any extra main tokens that were not utilized. + expect(finalRecipientMainBalance).to.be.almostEqual(initialRecipientMainBalance, 0.0001); + } + + const mainInfo = await vault.getPoolTokenInfo(poolId, USDC); + + const expectedMainBalance = lowerTarget.add(upperTarget).div(2); + expect(mainInfo.cash.mul(USDC_SCALING)).to.equal(expectedMainBalance); + expect(mainInfo.managed).to.equal(0); + }); + } + + describe('create and check getters', () => { + it('deploy a linear pool', async () => { + const tx = await factory.create( + '', + '', + USDC, + dUSDC, + INITIAL_UPPER_TARGET, + SWAP_FEE_PERCENTAGE, + owner.address, + PROTOCOL_ID + ); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await task.instanceAt('GearboxLinearPool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + const { assetManager } = await vault.getPoolTokenInfo(poolId, USDC); + rebalancer = await task.instanceAt('GearboxLinearPoolRebalancer', assetManager); + }); + + it('check factory version', async () => { + const expectedFactoryVersion = { + name: 'GearboxLinearPoolFactory', + version: 1, + deployment: '20230213-gearbox-linear-pool', + }; + + expect(await factory.version()).to.equal(JSON.stringify(expectedFactoryVersion)); + }); + + it('check pool version', async () => { + const expectedPoolVersion = { + name: 'GearboxLinearPool', + version: 1, + deployment: '20230213-gearbox-linear-pool', + }; + + expect(await pool.version()).to.equal(JSON.stringify(expectedPoolVersion)); + }); + }); + + describe('join, and rebalance', () => { + it('join the pool', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const joinAmount = INITIAL_UPPER_TARGET.mul(2).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: USDC, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert join amount - some fees will be collected as we're going over the upper target. + const excess = joinAmount.mul(USDC_SCALING).sub(INITIAL_UPPER_TARGET); + const joinCollectedFees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + + const expectedBPT = joinAmount.mul(USDC_SCALING).sub(joinCollectedFees); + expect(await pool.balanceOf(holder.address)).to.equal(expectedBPT); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + + it('set final targets', async () => { + await expect(pool.connect(owner).setTargets(FINAL_LOWER_TARGET, FINAL_UPPER_TARGET)).to.not.be.reverted; + }); + }); + + describe('generate excess of main token and rebalance', () => { + before('approve the rebalancer', async () => { + await mainToken.connect(holder).approve(rebalancer.address, MAX_UINT256); // To send extra main on rebalance + }); + + it('deposit main tokens', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const { upperTarget } = await pool.getTargets(); + const joinAmount = upperTarget.mul(5).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: USDC, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + }); + + describe('generate lack of main token and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to withdraw enough man token to bring the Pool below its lower target, which will let us later + // rebalance. + + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_LACK); + }); + + describe('join below upper target and rebalance', () => { + it('deposit main tokens', async () => { + // We're going to join with few tokens, causing the Pool to not reach its upper target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const joinAmount = midpoint.div(100).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: USDC, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('exit above lower target and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to exit with few tokens, causing for the Pool to not reach its lower target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const exitAmount = midpoint.div(100).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalance repeatedly', () => { + itRebalancesThePool(LinearPoolState.BALANCED); + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalancer query protection', async () => { + it('reverts with a malicious lending pool', async () => { + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + + // Using MockGearboxVault from 20230409-gearbox-linear-pool-v2 + await setCode(GEARBOX_VAULT, getArtifact('MockGearboxVault').deployedBytecode); + const mockLendingPool = await instanceAt('MockGearboxVault', GEARBOX_VAULT); + + await mockLendingPool.setRevertType(2); // Type 2 is malicious swap query revert + await expect(rebalancer.rebalance(other.address)).to.be.revertedWith('BAL#357'); // MALICIOUS_QUERY_REVERT + }); + }); + + describe('read-only reentrancy protection', () => { + let attacker: Contract; + + before('deploy attacker', async () => { + // Using Reentrancy Attacker from Aave Fork Test (task 20230206-aave-rebalanced-linear-pool-v4) + attacker = await deploy('ReadOnlyReentrancyAttackerAaveLP', [vault.address]); + }); + + async function performAttack(attackType: AttackType, ethAmount: BigNumber, expectRevert: boolean) { + // To trigger the callback and revert, send more than we need for the deposit + // If we send just enough, there will be no "extra" ETH, and it won't trigger the callback and attack + const amountToSend = expectRevert ? ethAmount.add(1) : ethAmount; + + const attack = attacker.startAttack(pool.address, attackType, ethAmount, { value: amountToSend }); + if (expectRevert) { + await expect(attack).to.be.revertedWith('BAL#420'); + } else { + await expect(attack).to.not.be.reverted; + } + } + + function itPerformsAttack(expectRevert: boolean) { + const action = expectRevert ? 'triggers' : 'does not trigger'; + + context('set targets', () => { + it(`${action} the set targets attack`, async () => { + await performAttack(AttackType.SET_TARGETS, fp(1), expectRevert); + }); + }); + + context('set swap fee', () => { + it(`${action} the set swap fee attack`, async () => { + await performAttack(AttackType.SET_SWAP_FEE, fp(1), expectRevert); + }); + }); + } + + context('when exactly enough ETH is sent', () => { + itPerformsAttack(false); + }); + + context('when too much ETH is sent', () => { + itPerformsAttack(true); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/artifact/YearnLinearPool.json b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/artifact/YearnLinearPool.json new file mode 100644 index 0000000..8936d30 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/artifact/YearnLinearPool.json @@ -0,0 +1,1245 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "YearnLinearPool", + "sourceName": "contracts/yearn-linear-pool/YearnLinearPool.sol", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "assetManager", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + } + ], + "internalType": "struct YearnLinearPool.ConstructorArgs", + "name": "args", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "paused", + "type": "bool" + } + ], + "name": "PausedStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "RecoveryModeStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + } + ], + "name": "SwapFeePercentageChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lowerTarget", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + } + ], + "name": "TargetsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "enableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBptIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMainIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMainToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getNextNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPausedState", + "outputs": [ + { + "internalType": "bool", + "name": "paused", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "pauseWindowEndTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodEndTime", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeesCollector", + "outputs": [ + { + "internalType": "contract IProtocolFeesCollector", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getScalingFactors", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSwapFeePercentage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTargets", + "outputs": [ + { + "internalType": "uint256", + "name": "lowerTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVirtualSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedTokenRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "inRecoveryMode", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onExitPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "dueProtocolFees", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onJoinPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "dueProtocolFees", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IERC20", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IPoolSwapStructs.SwapRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "indexIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "indexOut", + "type": "uint256" + } + ], + "name": "onSwap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IERC20", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IPoolSwapStructs.SwapRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "balanceTokenIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balanceTokenOut", + "type": "uint256" + } + ], + "name": "onSwap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryExit", + "outputs": [ + { + "internalType": "uint256", + "name": "bptIn", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryJoin", + "outputs": [ + { + "internalType": "uint256", + "name": "bptOut", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + } + ], + "name": "setSwapFeePercentage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newLowerTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newUpperTarget", + "type": "uint256" + } + ], + "name": "setTargets", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6102a06040523480156200001257600080fd5b5060405162005a8838038062005a88833981016040819052620000359162000d68565b6101608101518151602083015160408401516060850151608086015160c08701516200006188620003f3565b60e08901516101008a01516101208b01516101408c01518a6200009e8160006200008c8c8c6200047c565b896200052d60201b620014231760201c565b8b8b86868686838387878b86336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000ed92919062000bf1565b5080516200010390600490602084019062000bf1565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001829050630163f500831115610194620006fb565b620001966276a700821115610195620006fb565b4291909101610140819052016101605260601b6001600160601b031916610180526101a08690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000d29565b6001600160a01b03166101c0816001600160a01b031660601b8152505050505050505050876001600160a01b03166101e0816001600160a01b031660601b81525050866001600160a01b0316610200816001600160a01b031660601b81525050866001600160a01b0316886001600160a01b031610620002bb576002620002be565b60015b60ff16610220526001600160a01b0380881690891610620002e1576001620002e4565b60025b60ff1661024052620002f68862000710565b61026052620003058762000710565b61028052600062000318898289620007bc565b6200032385620008b6565b50508a51620003469a506009995060208c019850965062000bf195505050505050565b5050620003ec81608001516001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038a57600080fd5b505afa1580156200039f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003c5919062000d29565b6001600160a01b031682606001516001600160a01b031614610208620006fb60201b60201c565b5062000fe5565b6040805160028082526060808301845292839291906020830190803683370190505090508260a00151816000815181106200042a57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260a00151816001815181106200045d57fe5b6001600160a01b03909216602092830291909101909101529050919050565b60408051600280825260608281019093526001600160a01b038481169086161091839181602001602082028036833701905050905081620004be5783620004c0565b845b81600081518110620004ce57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081620004fb5784620004fd565b835b816001815181106200050b57fe5b6001600160a01b03909216602092830291909101909101529150505b92915050565b600062000545836200094560201b620015d81760201c565b606083516001016001600160401b03811180156200056257600080fd5b506040519080825280602002602001820160405280156200058d578160200160208202803683370190505b50905030816000815181106200059f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156200061257848181518110620005d957fe5b6020026020010151828260010181518110620005f157fe5b6001600160a01b0390921660209283029190910190910152600101620005c2565b50606083516001016001600160401b03811180156200063057600080fd5b506040519080825280602002602001820160405280156200065b578160200160208202803683370190505b5090506000816000815181106200066e57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b8451811015620006e157848181518110620006a857fe5b6020026020010151828260010181518110620006c057fe5b6001600160a01b039092166020928302919091019091015260010162000691565b50620006f08787848462000951565b979650505050505050565b816200070c576200070c8162000a4b565b5050565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200074d57600080fd5b505afa15801562000762573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000788919062000ebf565b60ff1690506000620007a760128362000a6060201b620015e61760201c565b600a0a670de0b6b3a764000002949350505050565b620007cd8183111561014c620006fb565b620007ea6b0de0b6b39983494c589c000082111561014d620006fb565b62000804670de0b6b3a7640000825b0615610161620006fb565b62000818670de0b6b3a764000083620007f9565b62000867670de0b6b3a764000082046040602062000851670de0b6b3a764000087600854919004602080620015fc62000a78821b17811c565b62000a7860201b620015fc17909392919060201c565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d128090620008a9908590859062000f8e565b60405180910390a2505050565b620008cb64e8d4a5100082101560cb620006fb565b620008e367016345785d8a000082111560ca620006fb565b620009058160c0603f60085462000a7860201b620015fc17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906200093a90839062000f85565b60405180910390a150565b806200070c8162000a9d565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040162000982919062000f70565b602060405180830381600087803b1580156200099d57600080fd5b505af1158015620009b2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009d8919062000d4f565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000a0d9084908890889060040162000ee2565b600060405180830381600087803b15801562000a2857600080fd5b505af115801562000a3d573d6000803e3d6000fd5b509298975050505050505050565b62000a5d816210905360ea1b62000b29565b50565b600062000a72838311156001620006fb565b50900390565b600062000a8784848462000b8a565b506001901b60001901811b1992909216911b1790565b60028151101562000aae5762000a5d565b60008160008151811062000abe57fe5b602002602001015190506000600190505b825181101562000b2457600083828151811062000ae857fe5b6020026020010151905062000b19816001600160a01b0316846001600160a01b0316106065620006fb60201b60201c565b915060010162000acf565b505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b62000b9b61010083106064620006fb565b62000bd46001821015801562000bcc575062000bc860ff846101000362000be560201b6200161f1760201c565b8211155b6064620006fb565b62000b2483821c156101b4620006fb565b80820390821102900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000c3457805160ff191683800117855562000c64565b8280016001018555821562000c64579182015b8281111562000c6457825182559160200191906001019062000c47565b5062000c7292915062000c76565b5090565b5b8082111562000c72576000815560010162000c77565b8051620005278162000fcf565b600082601f83011262000cab578081fd5b81516001600160401b0381111562000cc1578182fd5b602062000cd7601f8301601f1916820162000f9c565b9250818352848183860101111562000cee57600080fd5b60005b8281101562000d0e57848101820151848201830152810162000cf1565b8281111562000d205760008284860101525b50505092915050565b60006020828403121562000d3b578081fd5b815162000d488162000fcf565b9392505050565b60006020828403121562000d61578081fd5b5051919050565b60006020828403121562000d7a578081fd5b81516001600160401b038082111562000d91578283fd5b818401915061018080838703121562000da8578384fd5b62000db38162000f9c565b905062000dc1868462000c8d565b815260208301518281111562000dd5578485fd5b62000de38782860162000c9a565b60208301525060408301518281111562000dfb578485fd5b62000e098782860162000c9a565b60408301525062000e1e866060850162000c8d565b606082015262000e32866080850162000c8d565b608082015262000e468660a0850162000c8d565b60a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014062000e888782860162000c8d565b90820152610160838101518381111562000ea0578586fd5b62000eae8882870162000c9a565b918301919091525095945050505050565b60006020828403121562000ed1578081fd5b815160ff8116811462000d48578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000f2e5762000f1b855162000fc3565b8352938301939183019160010162000f06565b505084810360408601528551808252908201925081860190845b8181101562000a3d5762000f5d835162000fc3565b8552938301939183019160010162000f48565b602081016003831062000f7f57fe5b91905290565b90815260200190565b918252602082015260400190565b6040518181016001600160401b038111828210171562000fbb57600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b038116811462000a5d57600080fd5b60805160a05160c05160e0516101005160601c6101205160601c61014051610160516101805160601c6101a0516101c05160601c6101e05160601c6102005160601c6102205161024051610260516102805161491662001172600039806107f352508061078f5280612981525080610717528061081b5280610c505280612dfc5280612f8552806130bd52806131c85280613345528061347d5250806107b152806109bb5280610c165280612dc85280612f0a5280612f5152806130475280613089528061319452806132cf5280613311528061340752806134495250806113f7528061262c52806126f852806129a75280612d7d5280612e96528061314a528061325b5250806109df52806110ed52806119ef5280611a8e52806125e352806126af52806129465280612d3e5280612e405280612fd3528061310b528061320c52806133935250806111cb5250806109485250508061181c5250806117f8525080610fd0525080610fac525080610f5c52508061232052508061236252508061234152506149166000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e36600461424a565b610608565b60405161035091906145dd565b60405180910390f35b610361610668565b6040516103509190614821565b61038161037c36600461401c565b6106fe565b60405161035091906145ba565b610343610715565b610343610739565b6103a661073f565b604051610350939291906145c5565b6103bd610768565b6040516103509190614582565b6103816103d8366004613f6c565b610876565b6103e56108ec565b604051610350919061485b565b6103436108f5565b61040d610408366004614307565b610904565b005b610343610946565b61038161042536600461401c565b61096a565b61040d6109a5565b6103436109b9565b6104426109dd565b60405161035091906144d7565b61040d610a01565b610361610a55565b610343610ab6565b61047a61047536600461414b565b610ac9565b604051610350929190614834565b610490610ae7565b60405161035092919061484d565b610343610b25565b6103436104b4366004613f18565b610cba565b6104cc6104c736600461414b565b610cd9565b604051610350929190614595565b6103436104e8366004613f18565b610d9b565b61040d610da6565b610343610f41565b61040d610f46565b6103436105133660046141ee565b610f58565b610442610faa565b610442610fce565b610343610536366004613f18565b610ff2565b61036161100d565b6103436105513660046142bb565b61106e565b61040d61056436600461431f565b6110a7565b61038161057736600461401c565b611119565b61038161058a36600461401c565b611157565b610442611164565b61038161116e565b61040d61117f565b6104426111c9565b61040d6105bd366004613fac565b6111ed565b6104cc6105d036600461414b565b61126e565b6103436105e3366004613f34565b611305565b610343611342565b6103436113eb565b6104426113f5565b610343611419565b6000846080015161063561061a610fce565b6001600160a01b0316336001600160a01b03161460cd61162b565b61064a610640610946565b82146101f461162b565b610652611639565b61065e8686868661164c565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050905090565b600061070b338484611771565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074c6117d9565b1592506107576117f6565b915061076161181a565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107da57fe5b6020026020010181815250506108186107f161183e565b7f000000000000000000000000000000000000000000000000000000000000000090611859565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084457fe5b602002602001018181525050670de0b6b3a76400008160008151811061086657fe5b6020908102919091010152905090565b6000806108838533611305565b90506108a7336001600160a01b038716148061089f5750838210155b61019e61162b565b6108b2858585611891565b336001600160a01b038616148015906108cd57506000198114155b156108df576108df8533858403611771565b60019150505b9392505050565b60055460ff1690565b60006108ff6113eb565b905090565b61090c611971565b6109146119ba565b60008061091f610ae7565b9150915061093861093083836119ca565b61014f61162b565b61094183611ad1565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070b9185906109a09086611b49565b611771565b6109ad611971565b6109b76000611b5b565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a09611971565b610a11611bec565b610a1b6001611c00565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4b91906145ba565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906108ff9060c0603f611c42565b60006060610adb888785611c51611c68565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0482602080611c42565b029250670de0b6b3a7640000610b1d8260406020611c42565b029150509091565b600080610b30610946565b90506060610b3c610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b6791906145dd565b60006040518083038186803b158015610b7f57600080fd5b505afa158015610b93573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbb9190810190614047565b50915050610bd081610bcb610768565b611dcf565b600080610bdb610ae7565b91509150610be7613c89565b6040518060600160405280610bfa610ab6565b81526020018481526020018381525090506000610c86610c4d867f000000000000000000000000000000000000000000000000000000000000000081518110610c3f57fe5b602002602001015184611e38565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7957fe5b6020026020010151611e99565b9050610caf610ca886600081518110610c9b57fe5b6020026020010151611ea5565b8290611eb9565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce861061a610fce565b610cf3610640610946565b6000610cfe85611f10565b15610d2657610d0b611f3f565b610d1d88610d17610739565b87611f52565b94509050610d3e565b610d2e611639565b610d398a8987611c51565b945090505b610d488a82612048565b835167ffffffffffffffff81118015610d6057600080fd5b50604051908082528060200260200182016040528015610d8a578160200160208202803683370190505b509250505097509795505050505050565b600061070f82610ff2565b6000610db0610946565b90506060610dbc610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de791906145dd565b60006040518083038186803b158015610dff57600080fd5b505afa158015610e13573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3b9190810190614047565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e7f57fe5b602002602001018181525050610e93613caa565b6040518060800160405280610ea785612052565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed8610fce565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f099493929190614605565b600060405180830381600087803b158015610f2357600080fd5b505af1158015610f37573d6000803e3d6000fd5b5050505050505050565b600090565b610f4e611971565b6109b76001611b5b565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8d929190614461565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108061061a610fce565b61108b610640610946565b611093611639565b61109e858585612055565b95945050505050565b6110af611971565b6110b76119ba565b6000806110c2610ae7565b915091506110d361093083836119ca565b6110e86110e085856119ca565b61015761162b565b6111137f00000000000000000000000000000000000000000000000000000000000000008585612062565b50505050565b6000806111263385611305565b90508083106111405761113b33856000611771565b61114d565b61114d3385858403611771565b5060019392505050565b600061070b338484611891565b60006108ff612138565b6008546000906108ff9060ff6121b2565b611187611971565b61118f611f3f565b6111996000611c00565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4b91906145ba565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121c8c610ff2565b89604051602001611232969594939291906146f2565b604051602081830303815290604052805190602001209050611263888261125a8787876121b9565b886101f86121f8565b610f37888888611771565b6060808861127d61061a610fce565b611288610640610946565b6000611292611639565b61129a610739565b6112ec576112a98a8a8761224f565b945090506112c26112b8610f41565b82101560cc61162b565b6112d460006112cf610f41565b6122e7565b6112e7896112e0610f41565b83036122e7565b610d48565b6112f78a8987611c51565b94509050610d4889826122e7565b600061130f610fce565b6001600160a01b0316826001600160a01b03161415611331575060001961070f565b61133b83836122f1565b905061070f565b600080600061134f610fce565b6001600160a01b031663b05f8e48611365610946565b306040518363ffffffff1660e01b81526004016113839291906147d8565b60806040518083038186803b15801561139b57600080fd5b505afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190614340565b5050915091506113e4818301611ea5565b9250505090565b60006108ff61231c565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff61183e565b600061142e836115d8565b6060835160010167ffffffffffffffff8111801561144b57600080fd5b50604051908082528060200260200182016040528015611475578160200160208202803683370190505b509050308160008151811061148657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f5578481815181106114be57fe5b60200260200101518282600101815181106114d557fe5b6001600160a01b03909216602092830291909101909101526001016114a9565b506060835160010167ffffffffffffffff8111801561151357600080fd5b5060405190808252806020026020018201604052801561153d578160200160208202803683370190505b50905060008160008151811061154f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115be5784818151811061158757fe5b602002602001015182826001018151811061159e57fe5b6001600160a01b0390921660209283029190910190910152600101611572565b506115cb878784846123b9565b925050505b949350505050565b806115e2816124c2565b5050565b60006115f683831115600161162b565b50900390565b600061160984848461253b565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e2576115e281612581565b6109b76116446117d9565b61019261162b565b60006116686003841080156116615750600383105b606461162b565b6060611672610768565b905061167e8582611dcf565b600080611689610ae7565b91509150611695613c89565b60405180606001604052806116a8610ab6565b81526020810185905260400183905290506000895160018111156116c857fe5b141561172c576116ef89606001518589815181106116e257fe5b60200260200101516125ab565b60608a015260006117018a8a846125b7565b90506117208186898151811061171357fe5b602002602001015161267e565b955050505050506115d0565b61174089606001518588815181106116e257fe5b60608a015260006117528a8a8461268a565b905061172081868a8151811061176457fe5b602002602001015161273f565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cc9085906145dd565b60405180910390a3505050565b60006117e361181a565b4211806108ff57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff61184b6113f5565b670de0b6b3a764000061274b565b600082820261187d84158061187657508385838161187357fe5b04145b600361162b565b670de0b6b3a7640000815b04949350505050565b6118a86001600160a01b038416151561019861162b565b6118bf6001600160a01b038316151561019961162b565b6118ca838383610941565b6001600160a01b0383166000908152602081905260409020546118f090826101a0612791565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461191f9082611b49565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cc9085906145dd565b60006119a06000357fffffffff0000000000000000000000000000000000000000000000000000000016610f58565b90506119b76119af82336127a7565b61019161162b565b50565b6109b76119c5610fce565b612890565b60008060006119d7610fce565b6001600160a01b031663b05f8e486119ed610946565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611a2b9291906147d8565b60806040518083038186803b158015611a4357600080fd5b505afa158015611a57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7b9190614340565b5050915091506000611ab7828401611ab27f0000000000000000000000000000000000000000000000000000000000000000612942565b6125ab565b905085811015801561065e57509390931115949350505050565b611ae464e8d4a5100082101560cb61162b565b611afa67016345785d8a000082111560ca61162b565b600854611b0b908260c0603f6115fc565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611b3e9083906145dd565b60405180910390a150565b60008282016108e5848210158361162b565b8015611b7b57611b76611b6c6117f6565b421061019361162b565b611b90565b611b90611b8661181a565b42106101a961162b565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611b3e9083906145ba565b6109b7611bf761116e565b156101b561162b565b600854611c0f908260ff612a1c565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611b3e9083906145ba565b6001901b6000190191901c1690565b60006060611c606103e6612581565b935093915050565b333014611d57576000306001600160a01b0316600036604051611c8c929190614491565b6000604051808303816000865af19150503d8060008114611cc9576040519150601f19603f3d011682016040523d82523d6000602084013e611cce565b606091505b505090508060008114611cdd57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611d39573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611d6a8686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611dde908290612a2b565b60005b8181101561111357611e19848281518110611df857fe5b6020026020010151848381518110611e0c57fe5b6020026020010151611859565b848281518110611e2557fe5b6020908102919091010152600101611de1565b60008160200151831015611e715781516020830151600091611e5d9186900390611859565b9050611e6984826115e6565b91505061070f565b81604001518311611e8357508161070f565b81516040830151600091611e5d91860390611859565b60006108e58383611b49565b600061070f82611eb3610739565b906115e6565b6000611ec8821515600461162b565b670de0b6b3a76400008302611efa841580611ef35750670de0b6b3a7640000858381611ef057fe5b04145b600561162b565b6001836001830304018115150291505092915050565b600080825111801561070f575060ff801682806020019051810190611f359190614380565b60ff161492915050565b6109b7611f4a61116e565b6101b661162b565b600060606000611f6184612a38565b90506060865167ffffffffffffffff81118015611f7d57600080fd5b50604051908082528060200260200182016040528015611fa7578160200160208202803683370190505b5090506000611fb4610f41565b90506000611fc7898381518110610c9b57fe5b90506000611fd58583612a4e565b905060005b8a518110156120375783811415611ff2576000612018565b612018828c838151811061200257fe5b602002602001015161185990919063ffffffff16565b85828151811061202457fe5b6020908102919091010152600101611fda565b509399929850919650505050505050565b6115e28282612a8e565b90565b60006108e56103e6612581565b6120718183111561014c61162b565b61208c6b0de0b6b39983494c589c000082111561014d61162b565b6120a4670de0b6b3a7640000825b061561016161162b565b6120b6670de0b6b3a76400008361209a565b6120eb670de0b6b3a76400008204604060206120e3670de0b6b3a7640000876008549190046020806115fc565b9291906115fc565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d12809061212b908590859061484d565b60405180910390a2505050565b6000612142610fce565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561217a57600080fd5b505afa15801561218e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ff919061422e565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b600061220385612b5a565b9050612219612213878387612b76565b8361162b565b612228428410156101b861162b565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b6000606061226a6001600160a01b038616301461015661162b565b6122816001600160a01b038516301461015661162b565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff816000815181106122d057fe5b602090810291909101015290969095509350505050565b6115e28282612c25565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612389612cb8565b3060405160200161239e9594939291906147ac565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016123e8919061480d565b602060405180830381600087803b15801561240257600080fd5b505af1158015612416573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243a9190614133565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d29061248690849088908890600401614726565b600060405180830381600087803b1580156124a057600080fd5b505af11580156124b4573d6000803e3d6000fd5b509298975050505050505050565b6002815110156124d1576119b7565b6000816000815181106124e057fe5b602002602001015190506000600190505b825181101561094157600083828151811061250857fe5b60200260200101519050612531816001600160a01b0316846001600160a01b031610606561162b565b91506001016124f1565b61254a6101008310606461162b565b61257260018210158015611661575061256860ff846101000361161f565b821115606461162b565b61094183821c156101b461162b565b6119b7817f42414c0000000000000000000000000000000000000000000000000000000000612cbc565b60006108e58383611859565b60208301516000906001600160a01b03163014156125e1576125da848484612d37565b90506108e5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b0316141561262a576125da848484612e8f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612673576125da848484612fcc565b6108e5610135612581565b60006108e58383612a4e565b60408301516000906001600160a01b03163014156126ad576125da848484613104565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156126f6576125da848484613254565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b03161415612673576125da84848461338c565b60006108e58383611eb9565b600080612757846134c4565b905080612767578291505061070f565b600061277285613572565b90506127888261278286846135e6565b90613600565b9250505061070f565b60006127a0848411158361162b565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6127c6610faa565b6001600160a01b0316141580156127e157506127e183613620565b15612809576127ee610faa565b6001600160a01b0316336001600160a01b031614905061070f565b612811612138565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b8152600401612840939291906145e6565b60206040518083038186803b15801561285857600080fd5b505afa15801561286c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b9190614113565b604080516000808252602082019092526060916128c3565b6128b0613cd4565b8152602001906001900390816128a85790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e849061290c9084906004016144eb565b600060405180830381600087803b15801561292657600080fd5b505af115801561293a573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156129a557507f0000000000000000000000000000000000000000000000000000000000000000610cd4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156129f1576129ea6107f161183e565b9050610cd4565b6001600160a01b038216301415612a115750670de0b6b3a7640000610cd4565b610cd4610135612581565b6001811b1992909216911b1790565b6115e2818314606761162b565b6000818060200190518101906108e5919061439c565b6000612a5d821515600461162b565b670de0b6b3a76400008302612a85841580611ef35750670de0b6b3a7640000858381611ef057fe5b82818161188857fe5b612aa56001600160a01b038316151561019b61162b565b612ab182600083610941565b6001600160a01b038216600090815260208190526040902054612ad790826101b2612791565b6001600160a01b038316600090815260208190526040902055612b0a612b0582612aff610739565b90613684565b613692565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612b4e91906145dd565b60405180910390a35050565b6000612b6461231c565b82604051602001610f8d9291906144a1565b6000612b8882516041146101b961162b565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612bc19089908590889088906147ef565b6020604051602081039080840390855afa158015612be3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612c195750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612c3160008383610941565b612c46612b0582612c40610739565b90611b49565b6001600160a01b038216600090815260208190526040902054612c699082611b49565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612b4e9085906145dd565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612dbd7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612db557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162b565b6115d08460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612df157fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612e2557fe5b6020026020010151612e3d87600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612e8357613697612e87565b6136f55b63ffffffff16565b6000612eeb7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612db5575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b03163014612f4657612f418460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f3357fe5b60200260200101518461375e565b6115d0565b6115d08460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f7a57fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612fae57fe5b6020026020010151612fc687600081518110610c9b57fe5b8661378e565b60006130287f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612db5575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b0316301461307e57612f418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061307057fe5b6020026020010151846137f4565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106130b257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130e657fe5b60200260200101516130fe87600081518110610c9b57fe5b86613829565b60006131897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612db557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162b565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131bd57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106131f157fe5b602002602001015161320987600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461324f57613890612e87565b6138e7565b60006132b07f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612db5575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b0316301461330657612f418460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132f857fe5b602002602001015184613951565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061333a57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061336e57fe5b602002602001015161338687600081518110610c9b57fe5b8661397b565b60006133e87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612db5575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b0316301461343e57612f418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061343057fe5b6020026020010151846139ca565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061347257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106134a657fe5b60200260200101516134be87600081518110610c9b57fe5b866139ff565b6000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b505afa92505050801561352f575060408051601f3d908101601f1916820190925261352c91810190614133565b60015b6129ea573d80801561355d576040519150601f19603f3d011682016040523d82523d6000602084013e613562565b606091505b5061356c81613a53565b50610cd4565b60008061357e83613ada565b9050600061358b84613b15565b905060006135a261359b86613b50565b42906115e6565b905060006135b96135b287613b8b565b83906135e6565b905060006135cf846135ca84613bc6565b611859565b90506135db85826115e6565b979650505050505050565b60008282026108e584158061187657508385838161187357fe5b600061360f821515600461162b565b81838161361857fe5b049392505050565b600061364b7f9f11080e00000000000000000000000000000000000000000000000000000000610f58565b82148061070f575061367c7f38e9922e00000000000000000000000000000000000000000000000000000000610f58565b909114919050565b60006108e583836001612791565b600255565b6000806136a48684611e38565b905060006136b28287611e99565b905060006136c0868a6115e6565b905060006136db84611eb36136d585876135e6565b8a613bd8565b90506136e788826115e6565b9a9950505050505050505050565b6000806137028684611e38565b905060006137108287611e99565b90506000613727613721838b6135e6565b87613600565b9050600061373584836115e6565b905060006137438288613bf9565b905061374f8a826115e6565b9b9a5050505050505050505050565b60008061376b8484611e38565b9050600061378261377c8688611b49565b85611e38565b905061065e81836115e6565b6000826137a65761379f8683611e38565b905061109e565b60006137b28684611e38565b905060006137c361377c888a611b49565b905060006137d182846115e6565b905060006137df8489611e99565b90506136e76137ee88846135e6565b82613600565b6000806138018484611e38565b9050600061380f82876115e6565b9050600061381d8286613bf9565b90506135db86826115e6565b60008261383757508461109e565b60006138438684611e38565b905060006138518287611e99565b9050600061385f878a611b49565b9050600061386d8483611e99565b9050600061388461387e89846135e6565b85613600565b905061374f81896115e6565b60008261389e57508461109e565b60006138aa8684611e38565b905060006138b88287611e99565b905060006138c6868a611b49565b905060006138db84611eb36136d585876135e6565b90506136e781896115e6565b6000826138f85761379f8683613bf9565b60006139048684611e38565b905060006139128287611e99565b90506000613929613923838b6135e6565b87613bd8565b905060006139378483611b49565b905060006139458288613bf9565b905061374f818b6115e6565b60008061395e8484611e38565b9050600061396f61377c86886115e6565b905061065e82826115e6565b6000806139888684611e38565b9050600061399961377c888a6115e6565b905060006139a783836115e6565b905060006139b58489611e99565b90506136e76139c488846135e6565b82613bd8565b6000806139d78484611e38565b905060006139e58287611b49565b905060006139f38286613bf9565b90506135db81876115e6565b600080613a0c8684611e38565b90506000613a1a8287611e99565b90506000613a28878a6115e6565b90506000613a368483611e99565b90506000613a4761387e89846135e6565b905061374f88826115e6565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417613ace578160208401fd5b506115e2610165612581565b6000816001600160a01b03166301e1d1146040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b6000816001600160a01b03166344b813966040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b6000816001600160a01b031663c3535b526040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b6000816001600160a01b031663422327166040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b670de0b6b3a764000081810391100290565b6000613be7821515600461162b565b50811515600019909201046001010290565b60008160200151831015613c4257815161133b90613c2090670de0b6b3a764000090611b49565b60208401518451613c3c91613c359190611859565b8690611b49565b90612a4e565b81604001518311613c5457508161070f565b815161133b90613c6d90670de0b6b3a7640000906115e6565b60408401518451613c3c91613c829190611859565b86906115e6565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561070f816148bc565b600082601f830112613d1f578081fd5b8135613d32613d2d82614890565b614869565b818152915060208083019084810181840286018201871015613d5357600080fd5b60005b84811015613d7257813584529282019290820190600101613d56565b505050505092915050565b600082601f830112613d8d578081fd5b8151613d9b613d2d82614890565b818152915060208083019084810181840286018201871015613dbc57600080fd5b60005b84811015613d7257815184529282019290820190600101613dbf565b600082601f830112613deb578081fd5b813567ffffffffffffffff811115613e01578182fd5b613e146020601f19601f84011601614869565b9150808252836020828501011115613e2b57600080fd5b8060208401602084013760009082016020015292915050565b80356002811061070f57600080fd5b6000610120808385031215613e66578182fd5b613e6f81614869565b915050613e7c8383613e44565b8152613e8b8360208401613d04565b6020820152613e9d8360408401613d04565b6040820152606082013560608201526080820135608082015260a082013560a0820152613ecd8360c08401613d04565b60c0820152613edf8360e08401613d04565b60e08201526101008083013567ffffffffffffffff811115613f0057600080fd5b613f0c85828601613ddb565b82840152505092915050565b600060208284031215613f29578081fd5b81356108e5816148bc565b60008060408385031215613f46578081fd5b8235613f51816148bc565b91506020830135613f61816148bc565b809150509250929050565b600080600060608486031215613f80578081fd5b8335613f8b816148bc565b92506020840135613f9b816148bc565b929592945050506040919091013590565b600080600080600080600060e0888a031215613fc6578283fd5b8735613fd1816148bc565b96506020880135613fe1816148bc565b955060408801359450606088013593506080880135613fff816148d1565b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561402e578182fd5b8235614039816148bc565b946020939093013593505050565b60008060006060848603121561405b578081fd5b835167ffffffffffffffff80821115614072578283fd5b818601915086601f830112614085578283fd5b8151614093613d2d82614890565b80828252602080830192508086018b8283870289010111156140b3578788fd5b8796505b848710156140de5780516140ca816148bc565b8452600196909601959281019281016140b7565b5089015190975093505050808211156140f5578283fd5b5061410286828701613d7d565b925050604084015190509250925092565b600060208284031215614124578081fd5b815180151581146108e5578182fd5b600060208284031215614144578081fd5b5051919050565b600080600080600080600060e0888a031215614165578081fd5b873596506020880135614177816148bc565b95506040880135614187816148bc565b9450606088013567ffffffffffffffff808211156141a3578283fd5b6141af8b838c01613d0f565b955060808a0135945060a08a0135935060c08a01359150808211156141d2578283fd5b506141df8a828b01613ddb565b91505092959891949750929550565b6000602082840312156141ff578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e5578182fd5b60006020828403121561423f578081fd5b81516108e5816148bc565b6000806000806080858703121561425f578182fd5b843567ffffffffffffffff80821115614276578384fd5b61428288838901613e53565b95506020870135915080821115614297578384fd5b506142a487828801613d0f565b949794965050505060408301359260600135919050565b6000806000606084860312156142cf578081fd5b833567ffffffffffffffff8111156142e5578182fd5b6142f186828701613e53565b9660208601359650604090950135949350505050565b600060208284031215614318578081fd5b5035919050565b60008060408385031215614331578182fd5b50508035926020909101359150565b60008060008060808587031215614355578182fd5b8451935060208501519250604085015191506060850151614375816148bc565b939692955090935050565b600060208284031215614391578081fd5b81516108e5816148d1565b600080604083850312156143ae578182fd5b82516143b9816148d1565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015614405578151875295820195908201906001016143e9565b509495945050505050565b15159052565b60008151808452815b8181101561443b5760208185018101518683018201520161441f565b8181111561444c5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b8281101561457557815180516004811061451e57fe5b855280870151614530888701826143c9565b50858101518686015260608082015161454b828801826143c9565b505060809081015190614560868201836143c9565b505060a0939093019290850190600101614508565b5091979650505050505050565b6000602082526108e560208301846143d6565b6000604082526145a860408301856143d6565b828103602084015261109e81856143d6565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156146765761466084516148b0565b825292840192600192909201919084019061464e565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a08701526146b481856143d6565b935050506040850151818584030160c08601526146d18382614416565b9250505060608401516146e760e0850182614410565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b8181101561476e5761475c85516148b0565b8352938301939183019160010161474a565b505084810360408601528551808252908201925081860190845b818110156124b45761479a83516148b0565b85529383019391830191600101614788565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016003831061481b57fe5b91905290565b6000602082526108e56020830184614416565b6000838252604060208301526115d060408301846143d6565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561488857600080fd5b604052919050565b600067ffffffffffffffff8211156148a6578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146119b757600080fd5b60ff811681146119b757600080fdfea2646970667358221220fed6a84d1aa6f096f67263c8b34d9d987a78802ccde3b74c7c9c7fc1a36d827864736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e36600461424a565b610608565b60405161035091906145dd565b60405180910390f35b610361610668565b6040516103509190614821565b61038161037c36600461401c565b6106fe565b60405161035091906145ba565b610343610715565b610343610739565b6103a661073f565b604051610350939291906145c5565b6103bd610768565b6040516103509190614582565b6103816103d8366004613f6c565b610876565b6103e56108ec565b604051610350919061485b565b6103436108f5565b61040d610408366004614307565b610904565b005b610343610946565b61038161042536600461401c565b61096a565b61040d6109a5565b6103436109b9565b6104426109dd565b60405161035091906144d7565b61040d610a01565b610361610a55565b610343610ab6565b61047a61047536600461414b565b610ac9565b604051610350929190614834565b610490610ae7565b60405161035092919061484d565b610343610b25565b6103436104b4366004613f18565b610cba565b6104cc6104c736600461414b565b610cd9565b604051610350929190614595565b6103436104e8366004613f18565b610d9b565b61040d610da6565b610343610f41565b61040d610f46565b6103436105133660046141ee565b610f58565b610442610faa565b610442610fce565b610343610536366004613f18565b610ff2565b61036161100d565b6103436105513660046142bb565b61106e565b61040d61056436600461431f565b6110a7565b61038161057736600461401c565b611119565b61038161058a36600461401c565b611157565b610442611164565b61038161116e565b61040d61117f565b6104426111c9565b61040d6105bd366004613fac565b6111ed565b6104cc6105d036600461414b565b61126e565b6103436105e3366004613f34565b611305565b610343611342565b6103436113eb565b6104426113f5565b610343611419565b6000846080015161063561061a610fce565b6001600160a01b0316336001600160a01b03161460cd61162b565b61064a610640610946565b82146101f461162b565b610652611639565b61065e8686868661164c565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050905090565b600061070b338484611771565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074c6117d9565b1592506107576117f6565b915061076161181a565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107da57fe5b6020026020010181815250506108186107f161183e565b7f000000000000000000000000000000000000000000000000000000000000000090611859565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084457fe5b602002602001018181525050670de0b6b3a76400008160008151811061086657fe5b6020908102919091010152905090565b6000806108838533611305565b90506108a7336001600160a01b038716148061089f5750838210155b61019e61162b565b6108b2858585611891565b336001600160a01b038616148015906108cd57506000198114155b156108df576108df8533858403611771565b60019150505b9392505050565b60055460ff1690565b60006108ff6113eb565b905090565b61090c611971565b6109146119ba565b60008061091f610ae7565b9150915061093861093083836119ca565b61014f61162b565b61094183611ad1565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070b9185906109a09086611b49565b611771565b6109ad611971565b6109b76000611b5b565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a09611971565b610a11611bec565b610a1b6001611c00565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4b91906145ba565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906108ff9060c0603f611c42565b60006060610adb888785611c51611c68565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0482602080611c42565b029250670de0b6b3a7640000610b1d8260406020611c42565b029150509091565b600080610b30610946565b90506060610b3c610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b6791906145dd565b60006040518083038186803b158015610b7f57600080fd5b505afa158015610b93573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbb9190810190614047565b50915050610bd081610bcb610768565b611dcf565b600080610bdb610ae7565b91509150610be7613c89565b6040518060600160405280610bfa610ab6565b81526020018481526020018381525090506000610c86610c4d867f000000000000000000000000000000000000000000000000000000000000000081518110610c3f57fe5b602002602001015184611e38565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7957fe5b6020026020010151611e99565b9050610caf610ca886600081518110610c9b57fe5b6020026020010151611ea5565b8290611eb9565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce861061a610fce565b610cf3610640610946565b6000610cfe85611f10565b15610d2657610d0b611f3f565b610d1d88610d17610739565b87611f52565b94509050610d3e565b610d2e611639565b610d398a8987611c51565b945090505b610d488a82612048565b835167ffffffffffffffff81118015610d6057600080fd5b50604051908082528060200260200182016040528015610d8a578160200160208202803683370190505b509250505097509795505050505050565b600061070f82610ff2565b6000610db0610946565b90506060610dbc610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de791906145dd565b60006040518083038186803b158015610dff57600080fd5b505afa158015610e13573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3b9190810190614047565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e7f57fe5b602002602001018181525050610e93613caa565b6040518060800160405280610ea785612052565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed8610fce565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f099493929190614605565b600060405180830381600087803b158015610f2357600080fd5b505af1158015610f37573d6000803e3d6000fd5b5050505050505050565b600090565b610f4e611971565b6109b76001611b5b565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8d929190614461565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108061061a610fce565b61108b610640610946565b611093611639565b61109e858585612055565b95945050505050565b6110af611971565b6110b76119ba565b6000806110c2610ae7565b915091506110d361093083836119ca565b6110e86110e085856119ca565b61015761162b565b6111137f00000000000000000000000000000000000000000000000000000000000000008585612062565b50505050565b6000806111263385611305565b90508083106111405761113b33856000611771565b61114d565b61114d3385858403611771565b5060019392505050565b600061070b338484611891565b60006108ff612138565b6008546000906108ff9060ff6121b2565b611187611971565b61118f611f3f565b6111996000611c00565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4b91906145ba565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121c8c610ff2565b89604051602001611232969594939291906146f2565b604051602081830303815290604052805190602001209050611263888261125a8787876121b9565b886101f86121f8565b610f37888888611771565b6060808861127d61061a610fce565b611288610640610946565b6000611292611639565b61129a610739565b6112ec576112a98a8a8761224f565b945090506112c26112b8610f41565b82101560cc61162b565b6112d460006112cf610f41565b6122e7565b6112e7896112e0610f41565b83036122e7565b610d48565b6112f78a8987611c51565b94509050610d4889826122e7565b600061130f610fce565b6001600160a01b0316826001600160a01b03161415611331575060001961070f565b61133b83836122f1565b905061070f565b600080600061134f610fce565b6001600160a01b031663b05f8e48611365610946565b306040518363ffffffff1660e01b81526004016113839291906147d8565b60806040518083038186803b15801561139b57600080fd5b505afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190614340565b5050915091506113e4818301611ea5565b9250505090565b60006108ff61231c565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff61183e565b600061142e836115d8565b6060835160010167ffffffffffffffff8111801561144b57600080fd5b50604051908082528060200260200182016040528015611475578160200160208202803683370190505b509050308160008151811061148657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f5578481815181106114be57fe5b60200260200101518282600101815181106114d557fe5b6001600160a01b03909216602092830291909101909101526001016114a9565b506060835160010167ffffffffffffffff8111801561151357600080fd5b5060405190808252806020026020018201604052801561153d578160200160208202803683370190505b50905060008160008151811061154f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115be5784818151811061158757fe5b602002602001015182826001018151811061159e57fe5b6001600160a01b0390921660209283029190910190910152600101611572565b506115cb878784846123b9565b925050505b949350505050565b806115e2816124c2565b5050565b60006115f683831115600161162b565b50900390565b600061160984848461253b565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e2576115e281612581565b6109b76116446117d9565b61019261162b565b60006116686003841080156116615750600383105b606461162b565b6060611672610768565b905061167e8582611dcf565b600080611689610ae7565b91509150611695613c89565b60405180606001604052806116a8610ab6565b81526020810185905260400183905290506000895160018111156116c857fe5b141561172c576116ef89606001518589815181106116e257fe5b60200260200101516125ab565b60608a015260006117018a8a846125b7565b90506117208186898151811061171357fe5b602002602001015161267e565b955050505050506115d0565b61174089606001518588815181106116e257fe5b60608a015260006117528a8a8461268a565b905061172081868a8151811061176457fe5b602002602001015161273f565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cc9085906145dd565b60405180910390a3505050565b60006117e361181a565b4211806108ff57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff61184b6113f5565b670de0b6b3a764000061274b565b600082820261187d84158061187657508385838161187357fe5b04145b600361162b565b670de0b6b3a7640000815b04949350505050565b6118a86001600160a01b038416151561019861162b565b6118bf6001600160a01b038316151561019961162b565b6118ca838383610941565b6001600160a01b0383166000908152602081905260409020546118f090826101a0612791565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461191f9082611b49565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cc9085906145dd565b60006119a06000357fffffffff0000000000000000000000000000000000000000000000000000000016610f58565b90506119b76119af82336127a7565b61019161162b565b50565b6109b76119c5610fce565b612890565b60008060006119d7610fce565b6001600160a01b031663b05f8e486119ed610946565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611a2b9291906147d8565b60806040518083038186803b158015611a4357600080fd5b505afa158015611a57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7b9190614340565b5050915091506000611ab7828401611ab27f0000000000000000000000000000000000000000000000000000000000000000612942565b6125ab565b905085811015801561065e57509390931115949350505050565b611ae464e8d4a5100082101560cb61162b565b611afa67016345785d8a000082111560ca61162b565b600854611b0b908260c0603f6115fc565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611b3e9083906145dd565b60405180910390a150565b60008282016108e5848210158361162b565b8015611b7b57611b76611b6c6117f6565b421061019361162b565b611b90565b611b90611b8661181a565b42106101a961162b565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611b3e9083906145ba565b6109b7611bf761116e565b156101b561162b565b600854611c0f908260ff612a1c565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611b3e9083906145ba565b6001901b6000190191901c1690565b60006060611c606103e6612581565b935093915050565b333014611d57576000306001600160a01b0316600036604051611c8c929190614491565b6000604051808303816000865af19150503d8060008114611cc9576040519150601f19603f3d011682016040523d82523d6000602084013e611cce565b606091505b505090508060008114611cdd57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611d39573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611d6a8686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611dde908290612a2b565b60005b8181101561111357611e19848281518110611df857fe5b6020026020010151848381518110611e0c57fe5b6020026020010151611859565b848281518110611e2557fe5b6020908102919091010152600101611de1565b60008160200151831015611e715781516020830151600091611e5d9186900390611859565b9050611e6984826115e6565b91505061070f565b81604001518311611e8357508161070f565b81516040830151600091611e5d91860390611859565b60006108e58383611b49565b600061070f82611eb3610739565b906115e6565b6000611ec8821515600461162b565b670de0b6b3a76400008302611efa841580611ef35750670de0b6b3a7640000858381611ef057fe5b04145b600561162b565b6001836001830304018115150291505092915050565b600080825111801561070f575060ff801682806020019051810190611f359190614380565b60ff161492915050565b6109b7611f4a61116e565b6101b661162b565b600060606000611f6184612a38565b90506060865167ffffffffffffffff81118015611f7d57600080fd5b50604051908082528060200260200182016040528015611fa7578160200160208202803683370190505b5090506000611fb4610f41565b90506000611fc7898381518110610c9b57fe5b90506000611fd58583612a4e565b905060005b8a518110156120375783811415611ff2576000612018565b612018828c838151811061200257fe5b602002602001015161185990919063ffffffff16565b85828151811061202457fe5b6020908102919091010152600101611fda565b509399929850919650505050505050565b6115e28282612a8e565b90565b60006108e56103e6612581565b6120718183111561014c61162b565b61208c6b0de0b6b39983494c589c000082111561014d61162b565b6120a4670de0b6b3a7640000825b061561016161162b565b6120b6670de0b6b3a76400008361209a565b6120eb670de0b6b3a76400008204604060206120e3670de0b6b3a7640000876008549190046020806115fc565b9291906115fc565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d12809061212b908590859061484d565b60405180910390a2505050565b6000612142610fce565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561217a57600080fd5b505afa15801561218e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ff919061422e565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b600061220385612b5a565b9050612219612213878387612b76565b8361162b565b612228428410156101b861162b565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b6000606061226a6001600160a01b038616301461015661162b565b6122816001600160a01b038516301461015661162b565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff816000815181106122d057fe5b602090810291909101015290969095509350505050565b6115e28282612c25565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612389612cb8565b3060405160200161239e9594939291906147ac565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016123e8919061480d565b602060405180830381600087803b15801561240257600080fd5b505af1158015612416573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243a9190614133565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d29061248690849088908890600401614726565b600060405180830381600087803b1580156124a057600080fd5b505af11580156124b4573d6000803e3d6000fd5b509298975050505050505050565b6002815110156124d1576119b7565b6000816000815181106124e057fe5b602002602001015190506000600190505b825181101561094157600083828151811061250857fe5b60200260200101519050612531816001600160a01b0316846001600160a01b031610606561162b565b91506001016124f1565b61254a6101008310606461162b565b61257260018210158015611661575061256860ff846101000361161f565b821115606461162b565b61094183821c156101b461162b565b6119b7817f42414c0000000000000000000000000000000000000000000000000000000000612cbc565b60006108e58383611859565b60208301516000906001600160a01b03163014156125e1576125da848484612d37565b90506108e5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b0316141561262a576125da848484612e8f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612673576125da848484612fcc565b6108e5610135612581565b60006108e58383612a4e565b60408301516000906001600160a01b03163014156126ad576125da848484613104565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156126f6576125da848484613254565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b03161415612673576125da84848461338c565b60006108e58383611eb9565b600080612757846134c4565b905080612767578291505061070f565b600061277285613572565b90506127888261278286846135e6565b90613600565b9250505061070f565b60006127a0848411158361162b565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6127c6610faa565b6001600160a01b0316141580156127e157506127e183613620565b15612809576127ee610faa565b6001600160a01b0316336001600160a01b031614905061070f565b612811612138565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b8152600401612840939291906145e6565b60206040518083038186803b15801561285857600080fd5b505afa15801561286c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b9190614113565b604080516000808252602082019092526060916128c3565b6128b0613cd4565b8152602001906001900390816128a85790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e849061290c9084906004016144eb565b600060405180830381600087803b15801561292657600080fd5b505af115801561293a573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156129a557507f0000000000000000000000000000000000000000000000000000000000000000610cd4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156129f1576129ea6107f161183e565b9050610cd4565b6001600160a01b038216301415612a115750670de0b6b3a7640000610cd4565b610cd4610135612581565b6001811b1992909216911b1790565b6115e2818314606761162b565b6000818060200190518101906108e5919061439c565b6000612a5d821515600461162b565b670de0b6b3a76400008302612a85841580611ef35750670de0b6b3a7640000858381611ef057fe5b82818161188857fe5b612aa56001600160a01b038316151561019b61162b565b612ab182600083610941565b6001600160a01b038216600090815260208190526040902054612ad790826101b2612791565b6001600160a01b038316600090815260208190526040902055612b0a612b0582612aff610739565b90613684565b613692565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612b4e91906145dd565b60405180910390a35050565b6000612b6461231c565b82604051602001610f8d9291906144a1565b6000612b8882516041146101b961162b565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612bc19089908590889088906147ef565b6020604051602081039080840390855afa158015612be3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612c195750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612c3160008383610941565b612c46612b0582612c40610739565b90611b49565b6001600160a01b038216600090815260208190526040902054612c699082611b49565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612b4e9085906145dd565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612dbd7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612db557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162b565b6115d08460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612df157fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612e2557fe5b6020026020010151612e3d87600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612e8357613697612e87565b6136f55b63ffffffff16565b6000612eeb7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612db5575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b03163014612f4657612f418460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f3357fe5b60200260200101518461375e565b6115d0565b6115d08460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f7a57fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612fae57fe5b6020026020010151612fc687600081518110610c9b57fe5b8661378e565b60006130287f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612db5575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b0316301461307e57612f418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061307057fe5b6020026020010151846137f4565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106130b257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130e657fe5b60200260200101516130fe87600081518110610c9b57fe5b86613829565b60006131897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612db557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162b565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131bd57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106131f157fe5b602002602001015161320987600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461324f57613890612e87565b6138e7565b60006132b07f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612db5575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b0316301461330657612f418460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132f857fe5b602002602001015184613951565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061333a57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061336e57fe5b602002602001015161338687600081518110610c9b57fe5b8661397b565b60006133e87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612db5575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b0316301461343e57612f418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061343057fe5b6020026020010151846139ca565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061347257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106134a657fe5b60200260200101516134be87600081518110610c9b57fe5b866139ff565b6000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b505afa92505050801561352f575060408051601f3d908101601f1916820190925261352c91810190614133565b60015b6129ea573d80801561355d576040519150601f19603f3d011682016040523d82523d6000602084013e613562565b606091505b5061356c81613a53565b50610cd4565b60008061357e83613ada565b9050600061358b84613b15565b905060006135a261359b86613b50565b42906115e6565b905060006135b96135b287613b8b565b83906135e6565b905060006135cf846135ca84613bc6565b611859565b90506135db85826115e6565b979650505050505050565b60008282026108e584158061187657508385838161187357fe5b600061360f821515600461162b565b81838161361857fe5b049392505050565b600061364b7f9f11080e00000000000000000000000000000000000000000000000000000000610f58565b82148061070f575061367c7f38e9922e00000000000000000000000000000000000000000000000000000000610f58565b909114919050565b60006108e583836001612791565b600255565b6000806136a48684611e38565b905060006136b28287611e99565b905060006136c0868a6115e6565b905060006136db84611eb36136d585876135e6565b8a613bd8565b90506136e788826115e6565b9a9950505050505050505050565b6000806137028684611e38565b905060006137108287611e99565b90506000613727613721838b6135e6565b87613600565b9050600061373584836115e6565b905060006137438288613bf9565b905061374f8a826115e6565b9b9a5050505050505050505050565b60008061376b8484611e38565b9050600061378261377c8688611b49565b85611e38565b905061065e81836115e6565b6000826137a65761379f8683611e38565b905061109e565b60006137b28684611e38565b905060006137c361377c888a611b49565b905060006137d182846115e6565b905060006137df8489611e99565b90506136e76137ee88846135e6565b82613600565b6000806138018484611e38565b9050600061380f82876115e6565b9050600061381d8286613bf9565b90506135db86826115e6565b60008261383757508461109e565b60006138438684611e38565b905060006138518287611e99565b9050600061385f878a611b49565b9050600061386d8483611e99565b9050600061388461387e89846135e6565b85613600565b905061374f81896115e6565b60008261389e57508461109e565b60006138aa8684611e38565b905060006138b88287611e99565b905060006138c6868a611b49565b905060006138db84611eb36136d585876135e6565b90506136e781896115e6565b6000826138f85761379f8683613bf9565b60006139048684611e38565b905060006139128287611e99565b90506000613929613923838b6135e6565b87613bd8565b905060006139378483611b49565b905060006139458288613bf9565b905061374f818b6115e6565b60008061395e8484611e38565b9050600061396f61377c86886115e6565b905061065e82826115e6565b6000806139888684611e38565b9050600061399961377c888a6115e6565b905060006139a783836115e6565b905060006139b58489611e99565b90506136e76139c488846135e6565b82613bd8565b6000806139d78484611e38565b905060006139e58287611b49565b905060006139f38286613bf9565b90506135db81876115e6565b600080613a0c8684611e38565b90506000613a1a8287611e99565b90506000613a28878a6115e6565b90506000613a368483611e99565b90506000613a4761387e89846135e6565b905061374f88826115e6565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417613ace578160208401fd5b506115e2610165612581565b6000816001600160a01b03166301e1d1146040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b6000816001600160a01b03166344b813966040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b6000816001600160a01b031663c3535b526040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b6000816001600160a01b031663422327166040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b670de0b6b3a764000081810391100290565b6000613be7821515600461162b565b50811515600019909201046001010290565b60008160200151831015613c4257815161133b90613c2090670de0b6b3a764000090611b49565b60208401518451613c3c91613c359190611859565b8690611b49565b90612a4e565b81604001518311613c5457508161070f565b815161133b90613c6d90670de0b6b3a7640000906115e6565b60408401518451613c3c91613c829190611859565b86906115e6565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561070f816148bc565b600082601f830112613d1f578081fd5b8135613d32613d2d82614890565b614869565b818152915060208083019084810181840286018201871015613d5357600080fd5b60005b84811015613d7257813584529282019290820190600101613d56565b505050505092915050565b600082601f830112613d8d578081fd5b8151613d9b613d2d82614890565b818152915060208083019084810181840286018201871015613dbc57600080fd5b60005b84811015613d7257815184529282019290820190600101613dbf565b600082601f830112613deb578081fd5b813567ffffffffffffffff811115613e01578182fd5b613e146020601f19601f84011601614869565b9150808252836020828501011115613e2b57600080fd5b8060208401602084013760009082016020015292915050565b80356002811061070f57600080fd5b6000610120808385031215613e66578182fd5b613e6f81614869565b915050613e7c8383613e44565b8152613e8b8360208401613d04565b6020820152613e9d8360408401613d04565b6040820152606082013560608201526080820135608082015260a082013560a0820152613ecd8360c08401613d04565b60c0820152613edf8360e08401613d04565b60e08201526101008083013567ffffffffffffffff811115613f0057600080fd5b613f0c85828601613ddb565b82840152505092915050565b600060208284031215613f29578081fd5b81356108e5816148bc565b60008060408385031215613f46578081fd5b8235613f51816148bc565b91506020830135613f61816148bc565b809150509250929050565b600080600060608486031215613f80578081fd5b8335613f8b816148bc565b92506020840135613f9b816148bc565b929592945050506040919091013590565b600080600080600080600060e0888a031215613fc6578283fd5b8735613fd1816148bc565b96506020880135613fe1816148bc565b955060408801359450606088013593506080880135613fff816148d1565b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561402e578182fd5b8235614039816148bc565b946020939093013593505050565b60008060006060848603121561405b578081fd5b835167ffffffffffffffff80821115614072578283fd5b818601915086601f830112614085578283fd5b8151614093613d2d82614890565b80828252602080830192508086018b8283870289010111156140b3578788fd5b8796505b848710156140de5780516140ca816148bc565b8452600196909601959281019281016140b7565b5089015190975093505050808211156140f5578283fd5b5061410286828701613d7d565b925050604084015190509250925092565b600060208284031215614124578081fd5b815180151581146108e5578182fd5b600060208284031215614144578081fd5b5051919050565b600080600080600080600060e0888a031215614165578081fd5b873596506020880135614177816148bc565b95506040880135614187816148bc565b9450606088013567ffffffffffffffff808211156141a3578283fd5b6141af8b838c01613d0f565b955060808a0135945060a08a0135935060c08a01359150808211156141d2578283fd5b506141df8a828b01613ddb565b91505092959891949750929550565b6000602082840312156141ff578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e5578182fd5b60006020828403121561423f578081fd5b81516108e5816148bc565b6000806000806080858703121561425f578182fd5b843567ffffffffffffffff80821115614276578384fd5b61428288838901613e53565b95506020870135915080821115614297578384fd5b506142a487828801613d0f565b949794965050505060408301359260600135919050565b6000806000606084860312156142cf578081fd5b833567ffffffffffffffff8111156142e5578182fd5b6142f186828701613e53565b9660208601359650604090950135949350505050565b600060208284031215614318578081fd5b5035919050565b60008060408385031215614331578182fd5b50508035926020909101359150565b60008060008060808587031215614355578182fd5b8451935060208501519250604085015191506060850151614375816148bc565b939692955090935050565b600060208284031215614391578081fd5b81516108e5816148d1565b600080604083850312156143ae578182fd5b82516143b9816148d1565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015614405578151875295820195908201906001016143e9565b509495945050505050565b15159052565b60008151808452815b8181101561443b5760208185018101518683018201520161441f565b8181111561444c5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b8281101561457557815180516004811061451e57fe5b855280870151614530888701826143c9565b50858101518686015260608082015161454b828801826143c9565b505060809081015190614560868201836143c9565b505060a0939093019290850190600101614508565b5091979650505050505050565b6000602082526108e560208301846143d6565b6000604082526145a860408301856143d6565b828103602084015261109e81856143d6565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156146765761466084516148b0565b825292840192600192909201919084019061464e565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a08701526146b481856143d6565b935050506040850151818584030160c08601526146d18382614416565b9250505060608401516146e760e0850182614410565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b8181101561476e5761475c85516148b0565b8352938301939183019160010161474a565b505084810360408601528551808252908201925081860190845b818110156124b45761479a83516148b0565b85529383019391830191600101614788565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016003831061481b57fe5b91905290565b6000602082526108e56020830184614416565b6000838252604060208301526115d060408301846143d6565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561488857600080fd5b604052919050565b600067ffffffffffffffff8211156148a6578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146119b757600080fd5b60ff811681146119b757600080fdfea2646970667358221220fed6a84d1aa6f096f67263c8b34d9d987a78802ccde3b74c7c9c7fc1a36d827864736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/artifact/YearnLinearPoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/artifact/YearnLinearPoolFactory.json new file mode 100644 index 0000000..1322332 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/artifact/YearnLinearPoolFactory.json @@ -0,0 +1,329 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "YearnLinearPoolFactory", + "sourceName": "contracts/yearn-linear-pool/YearnLinearPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "contract IBalancerQueries", + "name": "queries", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "poolVersion", + "type": "string" + }, + { + "internalType": "uint256", + "name": "initialPauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "YearnLinearPoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract LinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastCreatedPool", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeePercentagesProvider", + "outputs": [ + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101e06040523480156200001257600080fd5b5060405162009773380380620097738339810160408190526200003591620003be565b86868383604051806020016200004b906200026d565b601f1982820381018352601f909101166040528851839083908790309085908e906200007f9060009060208401906200027b565b505080516002810460a081905280820360e081905281845283620000af816200018e602090811b620009f117901c565b60601b6001600160601b0319166080528285018051838252620000de826200018e602090811b620009f117901c565b6001600160601b0319606091821b811660c0529690935290526101009590955250509290911b909116610120525062000121630163f500831115610194620001e2565b620001356276a700821115610195620001e2565b610140829052610160524201610180525050506001600160601b0319606091821b81166101a05260016003559087901b166101c052508251620001809060069060208601906200027b565b50505050505050506200048f565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001dc6001600160a01b03831615156101ac620001e2565b50919050565b81620001f357620001f381620001f7565b5050565b62000209816210905360ea1b6200020c565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b615a888062003ceb83390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002be57805160ff1916838001178555620002ee565b82800160010185558215620002ee579182015b82811115620002ee578251825591602001919060010190620002d1565b50620002fc92915062000300565b5090565b5b80821115620002fc576000815560010162000301565b600082601f83011262000328578081fd5b81516001600160401b03808211156200033f578283fd5b6040516020601f8401601f191682018101838111838210171562000361578586fd5b806040525081945083825286818588010111156200037e57600080fd5b600092505b83831015620003a2578583018101518284018201529182019162000383565b83831115620003b45760008185840101525b5050505092915050565b600080600080600080600060e0888a031215620003d9578283fd5b8751620003e68162000479565b6020890151909750620003f98162000479565b60408901519096506200040c8162000479565b60608901519095506001600160401b038082111562000429578485fd5b620004378b838c0162000317565b955060808a01519150808211156200044d578485fd5b506200045c8a828b0162000317565b93505060a0880151915060c0880151905092959891949750929550565b6001600160a01b03811681146200020957600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405161016051610180516101a05160601c6101c05160601c6137c7620005246000398061067552508061050452508061028b52806102b55250806102d95250508061057c52508061052a525080610a5a5250806102625280610ad6525080610a7b5250806102415280610ab252506137c76000f3fe60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c80636634b7531162000099578063851c1bb3116200006f578063851c1bb314620001cd5780638d928af814620001f3578063aaabadc514620001fd578063df8af989146200020757620000ff565b80636634b75314620001935780636c57f5a914620001b9578063739238d614620001c357620000ff565b80632f2770db11620000db5780632f2770db146200015a5780633f819b6f146200016657806354fd4d5014620001705780635ed31282146200017a57620000ff565b8062c194db1462000104578063174481fa14620001265780632da47c401462000140575b600080fd5b6200010e6200021e565b6040516200011d919062001435565b60405180910390f35b620001306200023f565b6040516200011d929190620013ce565b6200014a62000285565b6040516200011d9291906200162e565b620001646200030e565b005b6200010e62000378565b6200010e62000430565b62000184620004b2565b6040516200011d9190620013ad565b620001aa620001a436600462001137565b620004ce565b6040516200011d9190620013f5565b620001aa620004f9565b6200018462000502565b620001e4620001de36600462001178565b62000526565b6040516200011d919062001400565b620001846200057a565b620001846200059e565b6200018462000218366004620011d9565b6200062b565b60606200023a6040518060200160405280600081525062000a52565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200030057807f00000000000000000000000000000000000000000000000000000000000000000392507f0000000000000000000000000000000000000000000000000000000000000000915062000309565b60009250600091505b509091565b6200031862000b2d565b6200032262000b7c565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b820191906000526020600020905b8154815290600101906020018083116200040857829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016200055d9291906200134a565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000620005aa6200057a565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620005f057600080fd5b505afa15801562000605573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023a9190620011ba565b60006200063762000b95565b6004805460018101909155604051606090620006566020820162000fd8565b601f1982820381018352601f90910116604052620006736200057a565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001620006a7929190620013ce565b60408051601f1981840301815290829052620006c792916020016200137a565b60405160208183030381529060405290506000620006ed83838051906020012062000bb0565b9050600080620006fc62000285565b915091506200070a62000fe6565b620007146200057a565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508e81602001819052508d81604001819052508c816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508a8160c0018181525050898160e0018181525050828161010001818152505081816101200181815250508881610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506200087262000378565b610160820152604051600090620008a8906200089390849060200162001526565b60405160208183030381529060405262000bc6565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620008f357600080fd5b505af115801562000908573d6000803e3d6000fd5b5050505060006200091c6000898962000c1b565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146200098f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200098690620014b8565b60405180910390fd5b6040518a9073ffffffffffffffffffffffffffffffffffffffff8416907fda2f557d6e80d2dcf3894f2bb74fe9840e4d558e350f6aad63af0e0b12f1a58690600090a3509650505050505050620009e562000cf9565b98975050505050505050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000a4c73ffffffffffffffffffffffffffffffffffffffff831615156101ac62000d00565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000b1f81838662000d15565b505050505050505050919050565b600062000b5e6000357fffffffff000000000000000000000000000000000000000000000000000000001662000526565b905062000b7962000b70823362000d73565b61019162000d00565b50565b62000b9362000b8a620004f9565b1560d362000d00565b565b62000ba96002600354141561019062000d00565b6002600355565b600062000bbf83833062000e11565b9392505050565b60008062000bd48362000e52565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790559392505050565b6000808447101562000c5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000986906200144a565b825162000c96576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200098690620014ef565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009869062001481565b949350505050565b6001600355565b8162000d115762000d118162000eed565b5050565b5b6020811062000d37578151835260209283019290910190601f190162000d16565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000d7f6200059e565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000dbd9392919062001409565b60206040518083038186803b15801562000dd657600080fd5b505afa15801562000deb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bbf919062001156565b60008060ff60f81b83868660405160200162000e319493929190620012e6565b60408051808303601f19018152919052805160209091012095945050505050565b600062000e5e62000b7c565b600062000e6b8362000f19565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b62000b79817f42414c000000000000000000000000000000000000000000000000000000000062000f5d565b6000606062000f288362000a52565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811662000bbf573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6120ff806200169383390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f830112620010c6578081fd5b813567ffffffffffffffff80821115620010de578283fd5b6040516020601f19601f8501168201018181108382111715620010ff578485fd5b6040528281529250828483016020018610156200111b57600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121562001149578081fd5b813562000bbf816200166f565b60006020828403121562001168578081fd5b8151801515811462000bbf578182fd5b6000602082840312156200118a578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811462000bbf578182fd5b600060208284031215620011cc578081fd5b815162000bbf816200166f565b600080600080600080600080610100898b031215620011f6578384fd5b883567ffffffffffffffff808211156200120e578586fd5b6200121c8c838d01620010b5565b995060208b013591508082111562001232578586fd5b50620012418b828c01620010b5565b975050604089013562001254816200166f565b9550606089013562001266816200166f565b94506080890135935060a0890135925060c089013562001286816200166f565b8092505060e089013590509295985092959890939650565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620012d28160208601602086016200163c565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b600083516200138e8184602088016200163c565b835190830190620013a48183602088016200163c565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000bbf6020830184620012b8565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b6000602082526200153c6020830184516200129e565b60208301516101808060408501526200155a6101a0850183620012b8565b91506040850151601f19808685030160608701526200157a8483620012b8565b9350606087015191506200159260808701836200129e565b60808701519150620015a860a08701836200129e565b60a08701519150620015be60c08701836200129e565b60c087015160e087810191909152870151610100808801919091528701516101208088019190915287015161014080880191909152870151915061016062001609818801846200129e565b870151868503909101838701529050620016248382620012b8565b9695505050505050565b918252602082015260400190565b60005b83811015620016595781810151838201526020016200163f565b8381111562001669576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000b7957600080fdfe6101606040523480156200001257600080fd5b50604051620020ff380380620020ff833981016040819052620000359162000462565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000378565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200012591908101906200039e565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000449565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000449565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000378565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000378565b6001600160601b0319606091821b811660e05292811b8316610120521b166101405250620004e0915050565b6000602082840312156200038a578081fd5b81516200039781620004c7565b9392505050565b60006020808385031215620003b1578182fd5b82516001600160401b0380821115620003c8578384fd5b818501915085601f830112620003dc578384fd5b815181811115620003eb578485fd5b8381029150620003fd848301620004a0565b8181528481019084860184860187018a101562000418578788fd5b8795505b838610156200043c5780518352600195909501949186019186016200041c565b5098975050505050505050565b6000602082840312156200045b578081fd5b5051919050565b6000806040838503121562000475578081fd5b82516200048281620004c7565b60208401519092506200049581620004c7565b809150509250929050565b6040518181016001600160401b0381118282101715620004bf57600080fd5b604052919050565b6001600160a01b0381168114620004dd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c611b3c620005c36000398061050b52806108235250806101355280610c165280610f305280610f925250806103c152508061046e528061059b528061074a52806108ee5280610cc05280610ff2528061105c52806110be52508060ea5280610192528061043252806105ce528061063352806106d4528061078652806108b3528061103a5250806101715280610404528061071c5280610a7f5280610b5e5280610db85280610e975250806099528061030b5250611b3c6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b919061186b565b60405180910390f35b610077610072366004611729565b6100bb565b60405161005b9190611aa5565b610077610092366004611745565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610124565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308561025b565b61011b83610124565b90505b92915050565b60008061012f610304565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101ce9291906119b7565b60806040518083038186803b1580156101e657600080fd5b505afa1580156101fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021e91906117cb565b50505090508181101561024057610237818303856103ed565b925050506100c9565b818111156102545761023782820385610705565b5050919050565b6102fe846323b872dd60e01b85858560405160240161027c939291906118b3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610913565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a691906117a8565b9150915060006002828401816103b857fe5b0490506103e5817f00000000000000000000000000000000000000000000000000000000000000006109c0565b935050505090565b60006103f7611676565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104cb6116d9565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061054290869086906004016119db565b602060405180830381600087803b15801561055c57600080fd5b505af1158015610570573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105949190611790565b90506105c07f000000000000000000000000000000000000000000000000000000000000000082610a13565b6105c981610c84565b6105f37f000000000000000000000000000000000000000000000000000000000000000087610d4c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a082319061066890309060040161186b565b60206040518083038186803b15801561068057600080fd5b505afa158015610694573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b89190611790565b90506106fb73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fc7565b9695505050505050565b600061070f611676565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e36116d9565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061085a90869086906004016119db565b602060405180830381600087803b15801561087457600080fd5b505af1158015610888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ac9190611790565b90506108d87f000000000000000000000000000000000000000000000000000000000000000087610a13565b6108e96108e482610feb565b611020565b6105f37f000000000000000000000000000000000000000000000000000000000000000082610d4c565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093c919061184f565b6000604051808303816000865af19150503d8060008114610979576040519150601f19603f3d011682016040523d82523d6000602084013e61097e565b606091505b50915091506000821415610996573d6000803e3d6000fd5b6102fe8151600014806109b85750818060200190518101906109b89190611770565b6101a26110f5565b60006109cf82151560046110f5565b670de0b6b3a76400008302610a018415806109fa5750670de0b6b3a76400008583816109f757fe5b04145b60056110f5565b828181610a0a57fe5b04949350505050565b6040805160028082526060828101909352816020015b610a31611700565b815260200190600190039081610a29579050509050600081600081518110610a5557fe5b6020026020010151600001906002811115610a6c57fe5b90816002811115610a7957fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aab57fe5b602002602001015160200181815250508181600081518110610ac957fe5b602002602001015160600181815250508281600081518110610ae757fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3457fe5b6020026020010151600001906002811115610b4b57fe5b90816002811115610b5857fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8a57fe5b60200260200101516020018181525050600081600181518110610ba957fe5b602002602001015160600181815250508281600181518110610bc757fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4d908490600401611933565b600060405180830381600087803b158015610c6757600080fd5b505af1158015610c7b573d6000803e3d6000fd5b50505050505050565b6040517ef714ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169062f714ce90610cf690849030906004016119b7565b602060405180830381600087803b158015610d1057600080fd5b505af1158015610d24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d489190611790565b5050565b6040805160028082526060828101909352816020015b610d6a611700565b815260200190600190039081610d62579050509050600281600081518110610d8e57fe5b6020026020010151600001906002811115610da557fe5b90816002811115610db257fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de457fe5b602002602001015160200181815250508181600081518110610e0257fe5b602002602001015160600181815250508281600081518110610e2057fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e6d57fe5b6020026020010151600001906002811115610e8457fe5b90816002811115610e9157fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec357fe5b602002602001015160200181815250508181600181518110610ee157fe5b602002602001015160600181815250508281600181518110610eff57fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f559084167f000000000000000000000000000000000000000000000000000000000000000084611103565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4d908490600401611933565b610fe68363a9059cbb60e01b848460405160240161027c92919061190d565b505050565b60006110177f0000000000000000000000000000000000000000000000000000000000000000836111f8565b60010192915050565b61108173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611103565b6040517f6e553f6500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636e553f6590610cf690849030906004016119b7565b81610d4857610d488161123e565b80158015906111b457506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e90611161903090869060040161188c565b60206040518083038186803b15801561117957600080fd5b505afa15801561118d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b19190611790565b15155b156111d9576111d98363095ea7b360e01b84600060405160240161027c9291906118e4565b610fe68363095ea7b360e01b848460405160240161027c92919061190d565b6000806112048461126b565b905080611214578291505061011e565b600061121f8561134b565b90506112358261122f86846113bf565b906113e3565b9250505061011e565b611268817f42414c0000000000000000000000000000000000000000000000000000000000611403565b50565b60008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b505afa925050508015611301575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526112fe91810190611790565b60015b611344573d80801561132f576040519150601f19603f3d011682016040523d82523d6000602084013e611334565b606091505b5061133e8161147e565b506100c9565b90506100c9565b60008061135783611505565b905060006113648461154d565b9050600061137b61137486611595565b42906115dd565b9050600061139261138b876115f3565b83906113bf565b905060006113a8846113a38461163b565b61164d565b90506113b485826115dd565b979650505050505050565b600082820261011b8415806113dc5750838583816113d957fe5b04145b60036110f5565b60006113f282151560046110f5565b8183816113fb57fe5b049392505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc12000000000000000000000000000000000000000000000000000000008214176114f9578160208401fd5b50610d4861016561123e565b60008173ffffffffffffffffffffffffffffffffffffffff166301e1d1146040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff166344b813966040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663c3535b526040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60006115ed8383111560016110f5565b50900390565b60008173ffffffffffffffffffffffffffffffffffffffff1663422327166040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b670de0b6b3a764000081810391100290565b60008282026116678415806113dc5750838583816113d957fe5b670de0b6b3a764000081610a0a565b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b60006020828403121561173a578081fd5b813561011b81611ae4565b60008060408385031215611757578081fd5b823561176281611ae4565b946020939093013593505050565b600060208284031215611781578081fd5b8151801515811461011b578182fd5b6000602082840312156117a1578081fd5b5051919050565b600080604083850312156117ba578182fd5b505080516020909101519092909150565b600080600080608085870312156117e0578182fd5b845193506020850151925060408501519150606085015161180081611ae4565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b60008251611861818460208701611aae565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b828110156119aa57815180516003811061196657fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff16868601526060908101519085015260809093019290850190600101611950565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a083015260208401516119f681611ada565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c0610140840152805180610160850152610180611a628282870160208601611aae565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401168601019350505050611a9e602083018461180b565b9392505050565b90815260200190565b60005b83811015611ac9578181015183820152602001611ab1565b838111156102fe5750506000910152565b6002811061126857fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461126857600080fdfea26469706673582212208beb7817193b118865b9e09fbe3db18b401c8700b7d556fbd4b00fcb8b5d27ea64736f6c63430007010033a26469706673582212209fbcb0dead2daf898c54d10157ac2cd6beae5f4d9f7288ed8af8316016a47e6d64736f6c634300070100336102a06040523480156200001257600080fd5b5060405162005a8838038062005a88833981016040819052620000359162000d68565b6101608101518151602083015160408401516060850151608086015160c08701516200006188620003f3565b60e08901516101008a01516101208b01516101408c01518a6200009e8160006200008c8c8c6200047c565b896200052d60201b620014231760201c565b8b8b86868686838387878b86336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000ed92919062000bf1565b5080516200010390600490602084019062000bf1565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001829050630163f500831115610194620006fb565b620001966276a700821115610195620006fb565b4291909101610140819052016101605260601b6001600160601b031916610180526101a08690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000d29565b6001600160a01b03166101c0816001600160a01b031660601b8152505050505050505050876001600160a01b03166101e0816001600160a01b031660601b81525050866001600160a01b0316610200816001600160a01b031660601b81525050866001600160a01b0316886001600160a01b031610620002bb576002620002be565b60015b60ff16610220526001600160a01b0380881690891610620002e1576001620002e4565b60025b60ff1661024052620002f68862000710565b61026052620003058762000710565b61028052600062000318898289620007bc565b6200032385620008b6565b50508a51620003469a506009995060208c019850965062000bf195505050505050565b5050620003ec81608001516001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038a57600080fd5b505afa1580156200039f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003c5919062000d29565b6001600160a01b031682606001516001600160a01b031614610208620006fb60201b60201c565b5062000fe5565b6040805160028082526060808301845292839291906020830190803683370190505090508260a00151816000815181106200042a57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260a00151816001815181106200045d57fe5b6001600160a01b03909216602092830291909101909101529050919050565b60408051600280825260608281019093526001600160a01b038481169086161091839181602001602082028036833701905050905081620004be5783620004c0565b845b81600081518110620004ce57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081620004fb5784620004fd565b835b816001815181106200050b57fe5b6001600160a01b03909216602092830291909101909101529150505b92915050565b600062000545836200094560201b620015d81760201c565b606083516001016001600160401b03811180156200056257600080fd5b506040519080825280602002602001820160405280156200058d578160200160208202803683370190505b50905030816000815181106200059f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156200061257848181518110620005d957fe5b6020026020010151828260010181518110620005f157fe5b6001600160a01b0390921660209283029190910190910152600101620005c2565b50606083516001016001600160401b03811180156200063057600080fd5b506040519080825280602002602001820160405280156200065b578160200160208202803683370190505b5090506000816000815181106200066e57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b8451811015620006e157848181518110620006a857fe5b6020026020010151828260010181518110620006c057fe5b6001600160a01b039092166020928302919091019091015260010162000691565b50620006f08787848462000951565b979650505050505050565b816200070c576200070c8162000a4b565b5050565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200074d57600080fd5b505afa15801562000762573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000788919062000ebf565b60ff1690506000620007a760128362000a6060201b620015e61760201c565b600a0a670de0b6b3a764000002949350505050565b620007cd8183111561014c620006fb565b620007ea6b0de0b6b39983494c589c000082111561014d620006fb565b62000804670de0b6b3a7640000825b0615610161620006fb565b62000818670de0b6b3a764000083620007f9565b62000867670de0b6b3a764000082046040602062000851670de0b6b3a764000087600854919004602080620015fc62000a78821b17811c565b62000a7860201b620015fc17909392919060201c565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d128090620008a9908590859062000f8e565b60405180910390a2505050565b620008cb64e8d4a5100082101560cb620006fb565b620008e367016345785d8a000082111560ca620006fb565b620009058160c0603f60085462000a7860201b620015fc17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906200093a90839062000f85565b60405180910390a150565b806200070c8162000a9d565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040162000982919062000f70565b602060405180830381600087803b1580156200099d57600080fd5b505af1158015620009b2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009d8919062000d4f565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000a0d9084908890889060040162000ee2565b600060405180830381600087803b15801562000a2857600080fd5b505af115801562000a3d573d6000803e3d6000fd5b509298975050505050505050565b62000a5d816210905360ea1b62000b29565b50565b600062000a72838311156001620006fb565b50900390565b600062000a8784848462000b8a565b506001901b60001901811b1992909216911b1790565b60028151101562000aae5762000a5d565b60008160008151811062000abe57fe5b602002602001015190506000600190505b825181101562000b2457600083828151811062000ae857fe5b6020026020010151905062000b19816001600160a01b0316846001600160a01b0316106065620006fb60201b60201c565b915060010162000acf565b505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b62000b9b61010083106064620006fb565b62000bd46001821015801562000bcc575062000bc860ff846101000362000be560201b6200161f1760201c565b8211155b6064620006fb565b62000b2483821c156101b4620006fb565b80820390821102900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000c3457805160ff191683800117855562000c64565b8280016001018555821562000c64579182015b8281111562000c6457825182559160200191906001019062000c47565b5062000c7292915062000c76565b5090565b5b8082111562000c72576000815560010162000c77565b8051620005278162000fcf565b600082601f83011262000cab578081fd5b81516001600160401b0381111562000cc1578182fd5b602062000cd7601f8301601f1916820162000f9c565b9250818352848183860101111562000cee57600080fd5b60005b8281101562000d0e57848101820151848201830152810162000cf1565b8281111562000d205760008284860101525b50505092915050565b60006020828403121562000d3b578081fd5b815162000d488162000fcf565b9392505050565b60006020828403121562000d61578081fd5b5051919050565b60006020828403121562000d7a578081fd5b81516001600160401b038082111562000d91578283fd5b818401915061018080838703121562000da8578384fd5b62000db38162000f9c565b905062000dc1868462000c8d565b815260208301518281111562000dd5578485fd5b62000de38782860162000c9a565b60208301525060408301518281111562000dfb578485fd5b62000e098782860162000c9a565b60408301525062000e1e866060850162000c8d565b606082015262000e32866080850162000c8d565b608082015262000e468660a0850162000c8d565b60a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014062000e888782860162000c8d565b90820152610160838101518381111562000ea0578586fd5b62000eae8882870162000c9a565b918301919091525095945050505050565b60006020828403121562000ed1578081fd5b815160ff8116811462000d48578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000f2e5762000f1b855162000fc3565b8352938301939183019160010162000f06565b505084810360408601528551808252908201925081860190845b8181101562000a3d5762000f5d835162000fc3565b8552938301939183019160010162000f48565b602081016003831062000f7f57fe5b91905290565b90815260200190565b918252602082015260400190565b6040518181016001600160401b038111828210171562000fbb57600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b038116811462000a5d57600080fd5b60805160a05160c05160e0516101005160601c6101205160601c61014051610160516101805160601c6101a0516101c05160601c6101e05160601c6102005160601c6102205161024051610260516102805161491662001172600039806107f352508061078f5280612981525080610717528061081b5280610c505280612dfc5280612f8552806130bd52806131c85280613345528061347d5250806107b152806109bb5280610c165280612dc85280612f0a5280612f5152806130475280613089528061319452806132cf5280613311528061340752806134495250806113f7528061262c52806126f852806129a75280612d7d5280612e96528061314a528061325b5250806109df52806110ed52806119ef5280611a8e52806125e352806126af52806129465280612d3e5280612e405280612fd3528061310b528061320c52806133935250806111cb5250806109485250508061181c5250806117f8525080610fd0525080610fac525080610f5c52508061232052508061236252508061234152506149166000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e36600461424a565b610608565b60405161035091906145dd565b60405180910390f35b610361610668565b6040516103509190614821565b61038161037c36600461401c565b6106fe565b60405161035091906145ba565b610343610715565b610343610739565b6103a661073f565b604051610350939291906145c5565b6103bd610768565b6040516103509190614582565b6103816103d8366004613f6c565b610876565b6103e56108ec565b604051610350919061485b565b6103436108f5565b61040d610408366004614307565b610904565b005b610343610946565b61038161042536600461401c565b61096a565b61040d6109a5565b6103436109b9565b6104426109dd565b60405161035091906144d7565b61040d610a01565b610361610a55565b610343610ab6565b61047a61047536600461414b565b610ac9565b604051610350929190614834565b610490610ae7565b60405161035092919061484d565b610343610b25565b6103436104b4366004613f18565b610cba565b6104cc6104c736600461414b565b610cd9565b604051610350929190614595565b6103436104e8366004613f18565b610d9b565b61040d610da6565b610343610f41565b61040d610f46565b6103436105133660046141ee565b610f58565b610442610faa565b610442610fce565b610343610536366004613f18565b610ff2565b61036161100d565b6103436105513660046142bb565b61106e565b61040d61056436600461431f565b6110a7565b61038161057736600461401c565b611119565b61038161058a36600461401c565b611157565b610442611164565b61038161116e565b61040d61117f565b6104426111c9565b61040d6105bd366004613fac565b6111ed565b6104cc6105d036600461414b565b61126e565b6103436105e3366004613f34565b611305565b610343611342565b6103436113eb565b6104426113f5565b610343611419565b6000846080015161063561061a610fce565b6001600160a01b0316336001600160a01b03161460cd61162b565b61064a610640610946565b82146101f461162b565b610652611639565b61065e8686868661164c565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050905090565b600061070b338484611771565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074c6117d9565b1592506107576117f6565b915061076161181a565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107da57fe5b6020026020010181815250506108186107f161183e565b7f000000000000000000000000000000000000000000000000000000000000000090611859565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084457fe5b602002602001018181525050670de0b6b3a76400008160008151811061086657fe5b6020908102919091010152905090565b6000806108838533611305565b90506108a7336001600160a01b038716148061089f5750838210155b61019e61162b565b6108b2858585611891565b336001600160a01b038616148015906108cd57506000198114155b156108df576108df8533858403611771565b60019150505b9392505050565b60055460ff1690565b60006108ff6113eb565b905090565b61090c611971565b6109146119ba565b60008061091f610ae7565b9150915061093861093083836119ca565b61014f61162b565b61094183611ad1565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070b9185906109a09086611b49565b611771565b6109ad611971565b6109b76000611b5b565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a09611971565b610a11611bec565b610a1b6001611c00565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4b91906145ba565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906108ff9060c0603f611c42565b60006060610adb888785611c51611c68565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0482602080611c42565b029250670de0b6b3a7640000610b1d8260406020611c42565b029150509091565b600080610b30610946565b90506060610b3c610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b6791906145dd565b60006040518083038186803b158015610b7f57600080fd5b505afa158015610b93573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbb9190810190614047565b50915050610bd081610bcb610768565b611dcf565b600080610bdb610ae7565b91509150610be7613c89565b6040518060600160405280610bfa610ab6565b81526020018481526020018381525090506000610c86610c4d867f000000000000000000000000000000000000000000000000000000000000000081518110610c3f57fe5b602002602001015184611e38565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7957fe5b6020026020010151611e99565b9050610caf610ca886600081518110610c9b57fe5b6020026020010151611ea5565b8290611eb9565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce861061a610fce565b610cf3610640610946565b6000610cfe85611f10565b15610d2657610d0b611f3f565b610d1d88610d17610739565b87611f52565b94509050610d3e565b610d2e611639565b610d398a8987611c51565b945090505b610d488a82612048565b835167ffffffffffffffff81118015610d6057600080fd5b50604051908082528060200260200182016040528015610d8a578160200160208202803683370190505b509250505097509795505050505050565b600061070f82610ff2565b6000610db0610946565b90506060610dbc610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de791906145dd565b60006040518083038186803b158015610dff57600080fd5b505afa158015610e13573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3b9190810190614047565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e7f57fe5b602002602001018181525050610e93613caa565b6040518060800160405280610ea785612052565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed8610fce565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f099493929190614605565b600060405180830381600087803b158015610f2357600080fd5b505af1158015610f37573d6000803e3d6000fd5b5050505050505050565b600090565b610f4e611971565b6109b76001611b5b565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8d929190614461565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108061061a610fce565b61108b610640610946565b611093611639565b61109e858585612055565b95945050505050565b6110af611971565b6110b76119ba565b6000806110c2610ae7565b915091506110d361093083836119ca565b6110e86110e085856119ca565b61015761162b565b6111137f00000000000000000000000000000000000000000000000000000000000000008585612062565b50505050565b6000806111263385611305565b90508083106111405761113b33856000611771565b61114d565b61114d3385858403611771565b5060019392505050565b600061070b338484611891565b60006108ff612138565b6008546000906108ff9060ff6121b2565b611187611971565b61118f611f3f565b6111996000611c00565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4b91906145ba565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121c8c610ff2565b89604051602001611232969594939291906146f2565b604051602081830303815290604052805190602001209050611263888261125a8787876121b9565b886101f86121f8565b610f37888888611771565b6060808861127d61061a610fce565b611288610640610946565b6000611292611639565b61129a610739565b6112ec576112a98a8a8761224f565b945090506112c26112b8610f41565b82101560cc61162b565b6112d460006112cf610f41565b6122e7565b6112e7896112e0610f41565b83036122e7565b610d48565b6112f78a8987611c51565b94509050610d4889826122e7565b600061130f610fce565b6001600160a01b0316826001600160a01b03161415611331575060001961070f565b61133b83836122f1565b905061070f565b600080600061134f610fce565b6001600160a01b031663b05f8e48611365610946565b306040518363ffffffff1660e01b81526004016113839291906147d8565b60806040518083038186803b15801561139b57600080fd5b505afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190614340565b5050915091506113e4818301611ea5565b9250505090565b60006108ff61231c565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff61183e565b600061142e836115d8565b6060835160010167ffffffffffffffff8111801561144b57600080fd5b50604051908082528060200260200182016040528015611475578160200160208202803683370190505b509050308160008151811061148657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f5578481815181106114be57fe5b60200260200101518282600101815181106114d557fe5b6001600160a01b03909216602092830291909101909101526001016114a9565b506060835160010167ffffffffffffffff8111801561151357600080fd5b5060405190808252806020026020018201604052801561153d578160200160208202803683370190505b50905060008160008151811061154f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115be5784818151811061158757fe5b602002602001015182826001018151811061159e57fe5b6001600160a01b0390921660209283029190910190910152600101611572565b506115cb878784846123b9565b925050505b949350505050565b806115e2816124c2565b5050565b60006115f683831115600161162b565b50900390565b600061160984848461253b565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e2576115e281612581565b6109b76116446117d9565b61019261162b565b60006116686003841080156116615750600383105b606461162b565b6060611672610768565b905061167e8582611dcf565b600080611689610ae7565b91509150611695613c89565b60405180606001604052806116a8610ab6565b81526020810185905260400183905290506000895160018111156116c857fe5b141561172c576116ef89606001518589815181106116e257fe5b60200260200101516125ab565b60608a015260006117018a8a846125b7565b90506117208186898151811061171357fe5b602002602001015161267e565b955050505050506115d0565b61174089606001518588815181106116e257fe5b60608a015260006117528a8a8461268a565b905061172081868a8151811061176457fe5b602002602001015161273f565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cc9085906145dd565b60405180910390a3505050565b60006117e361181a565b4211806108ff57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff61184b6113f5565b670de0b6b3a764000061274b565b600082820261187d84158061187657508385838161187357fe5b04145b600361162b565b670de0b6b3a7640000815b04949350505050565b6118a86001600160a01b038416151561019861162b565b6118bf6001600160a01b038316151561019961162b565b6118ca838383610941565b6001600160a01b0383166000908152602081905260409020546118f090826101a0612791565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461191f9082611b49565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cc9085906145dd565b60006119a06000357fffffffff0000000000000000000000000000000000000000000000000000000016610f58565b90506119b76119af82336127a7565b61019161162b565b50565b6109b76119c5610fce565b612890565b60008060006119d7610fce565b6001600160a01b031663b05f8e486119ed610946565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611a2b9291906147d8565b60806040518083038186803b158015611a4357600080fd5b505afa158015611a57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7b9190614340565b5050915091506000611ab7828401611ab27f0000000000000000000000000000000000000000000000000000000000000000612942565b6125ab565b905085811015801561065e57509390931115949350505050565b611ae464e8d4a5100082101560cb61162b565b611afa67016345785d8a000082111560ca61162b565b600854611b0b908260c0603f6115fc565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611b3e9083906145dd565b60405180910390a150565b60008282016108e5848210158361162b565b8015611b7b57611b76611b6c6117f6565b421061019361162b565b611b90565b611b90611b8661181a565b42106101a961162b565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611b3e9083906145ba565b6109b7611bf761116e565b156101b561162b565b600854611c0f908260ff612a1c565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611b3e9083906145ba565b6001901b6000190191901c1690565b60006060611c606103e6612581565b935093915050565b333014611d57576000306001600160a01b0316600036604051611c8c929190614491565b6000604051808303816000865af19150503d8060008114611cc9576040519150601f19603f3d011682016040523d82523d6000602084013e611cce565b606091505b505090508060008114611cdd57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611d39573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611d6a8686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611dde908290612a2b565b60005b8181101561111357611e19848281518110611df857fe5b6020026020010151848381518110611e0c57fe5b6020026020010151611859565b848281518110611e2557fe5b6020908102919091010152600101611de1565b60008160200151831015611e715781516020830151600091611e5d9186900390611859565b9050611e6984826115e6565b91505061070f565b81604001518311611e8357508161070f565b81516040830151600091611e5d91860390611859565b60006108e58383611b49565b600061070f82611eb3610739565b906115e6565b6000611ec8821515600461162b565b670de0b6b3a76400008302611efa841580611ef35750670de0b6b3a7640000858381611ef057fe5b04145b600561162b565b6001836001830304018115150291505092915050565b600080825111801561070f575060ff801682806020019051810190611f359190614380565b60ff161492915050565b6109b7611f4a61116e565b6101b661162b565b600060606000611f6184612a38565b90506060865167ffffffffffffffff81118015611f7d57600080fd5b50604051908082528060200260200182016040528015611fa7578160200160208202803683370190505b5090506000611fb4610f41565b90506000611fc7898381518110610c9b57fe5b90506000611fd58583612a4e565b905060005b8a518110156120375783811415611ff2576000612018565b612018828c838151811061200257fe5b602002602001015161185990919063ffffffff16565b85828151811061202457fe5b6020908102919091010152600101611fda565b509399929850919650505050505050565b6115e28282612a8e565b90565b60006108e56103e6612581565b6120718183111561014c61162b565b61208c6b0de0b6b39983494c589c000082111561014d61162b565b6120a4670de0b6b3a7640000825b061561016161162b565b6120b6670de0b6b3a76400008361209a565b6120eb670de0b6b3a76400008204604060206120e3670de0b6b3a7640000876008549190046020806115fc565b9291906115fc565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d12809061212b908590859061484d565b60405180910390a2505050565b6000612142610fce565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561217a57600080fd5b505afa15801561218e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ff919061422e565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b600061220385612b5a565b9050612219612213878387612b76565b8361162b565b612228428410156101b861162b565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b6000606061226a6001600160a01b038616301461015661162b565b6122816001600160a01b038516301461015661162b565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff816000815181106122d057fe5b602090810291909101015290969095509350505050565b6115e28282612c25565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612389612cb8565b3060405160200161239e9594939291906147ac565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016123e8919061480d565b602060405180830381600087803b15801561240257600080fd5b505af1158015612416573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243a9190614133565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d29061248690849088908890600401614726565b600060405180830381600087803b1580156124a057600080fd5b505af11580156124b4573d6000803e3d6000fd5b509298975050505050505050565b6002815110156124d1576119b7565b6000816000815181106124e057fe5b602002602001015190506000600190505b825181101561094157600083828151811061250857fe5b60200260200101519050612531816001600160a01b0316846001600160a01b031610606561162b565b91506001016124f1565b61254a6101008310606461162b565b61257260018210158015611661575061256860ff846101000361161f565b821115606461162b565b61094183821c156101b461162b565b6119b7817f42414c0000000000000000000000000000000000000000000000000000000000612cbc565b60006108e58383611859565b60208301516000906001600160a01b03163014156125e1576125da848484612d37565b90506108e5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b0316141561262a576125da848484612e8f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612673576125da848484612fcc565b6108e5610135612581565b60006108e58383612a4e565b60408301516000906001600160a01b03163014156126ad576125da848484613104565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b031614156126f6576125da848484613254565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b03161415612673576125da84848461338c565b60006108e58383611eb9565b600080612757846134c4565b905080612767578291505061070f565b600061277285613572565b90506127888261278286846135e6565b90613600565b9250505061070f565b60006127a0848411158361162b565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6127c6610faa565b6001600160a01b0316141580156127e157506127e183613620565b15612809576127ee610faa565b6001600160a01b0316336001600160a01b031614905061070f565b612811612138565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b8152600401612840939291906145e6565b60206040518083038186803b15801561285857600080fd5b505afa15801561286c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b9190614113565b604080516000808252602082019092526060916128c3565b6128b0613cd4565b8152602001906001900390816128a85790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e849061290c9084906004016144eb565b600060405180830381600087803b15801561292657600080fd5b505af115801561293a573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156129a557507f0000000000000000000000000000000000000000000000000000000000000000610cd4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156129f1576129ea6107f161183e565b9050610cd4565b6001600160a01b038216301415612a115750670de0b6b3a7640000610cd4565b610cd4610135612581565b6001811b1992909216911b1790565b6115e2818314606761162b565b6000818060200190518101906108e5919061439c565b6000612a5d821515600461162b565b670de0b6b3a76400008302612a85841580611ef35750670de0b6b3a7640000858381611ef057fe5b82818161188857fe5b612aa56001600160a01b038316151561019b61162b565b612ab182600083610941565b6001600160a01b038216600090815260208190526040902054612ad790826101b2612791565b6001600160a01b038316600090815260208190526040902055612b0a612b0582612aff610739565b90613684565b613692565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612b4e91906145dd565b60405180910390a35050565b6000612b6461231c565b82604051602001610f8d9291906144a1565b6000612b8882516041146101b961162b565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612bc19089908590889088906147ef565b6020604051602081039080840390855afa158015612be3573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590612c195750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b612c3160008383610941565b612c46612b0582612c40610739565b90611b49565b6001600160a01b038216600090815260208190526040902054612c699082611b49565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612b4e9085906145dd565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612dbd7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612db557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162b565b6115d08460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612df157fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612e2557fe5b6020026020010151612e3d87600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612e8357613697612e87565b6136f55b63ffffffff16565b6000612eeb7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612db5575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b03163014612f4657612f418460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f3357fe5b60200260200101518461375e565b6115d0565b6115d08460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f7a57fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612fae57fe5b6020026020010151612fc687600081518110610c9b57fe5b8661378e565b60006130287f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612db5575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b0316301461307e57612f418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061307057fe5b6020026020010151846137f4565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106130b257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130e657fe5b60200260200101516130fe87600081518110610c9b57fe5b86613829565b60006131897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612db557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162b565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131bd57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106131f157fe5b602002602001015161320987600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461324f57613890612e87565b6138e7565b60006132b07f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612db5575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b0316301461330657612f418460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132f857fe5b602002602001015184613951565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061333a57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061336e57fe5b602002602001015161338687600081518110610c9b57fe5b8661397b565b60006133e87f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612db5575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b0316301461343e57612f418460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061343057fe5b6020026020010151846139ca565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061347257fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106134a657fe5b60200260200101516134be87600081518110610c9b57fe5b866139ff565b6000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b505afa92505050801561352f575060408051601f3d908101601f1916820190925261352c91810190614133565b60015b6129ea573d80801561355d576040519150601f19603f3d011682016040523d82523d6000602084013e613562565b606091505b5061356c81613a53565b50610cd4565b60008061357e83613ada565b9050600061358b84613b15565b905060006135a261359b86613b50565b42906115e6565b905060006135b96135b287613b8b565b83906135e6565b905060006135cf846135ca84613bc6565b611859565b90506135db85826115e6565b979650505050505050565b60008282026108e584158061187657508385838161187357fe5b600061360f821515600461162b565b81838161361857fe5b049392505050565b600061364b7f9f11080e00000000000000000000000000000000000000000000000000000000610f58565b82148061070f575061367c7f38e9922e00000000000000000000000000000000000000000000000000000000610f58565b909114919050565b60006108e583836001612791565b600255565b6000806136a48684611e38565b905060006136b28287611e99565b905060006136c0868a6115e6565b905060006136db84611eb36136d585876135e6565b8a613bd8565b90506136e788826115e6565b9a9950505050505050505050565b6000806137028684611e38565b905060006137108287611e99565b90506000613727613721838b6135e6565b87613600565b9050600061373584836115e6565b905060006137438288613bf9565b905061374f8a826115e6565b9b9a5050505050505050505050565b60008061376b8484611e38565b9050600061378261377c8688611b49565b85611e38565b905061065e81836115e6565b6000826137a65761379f8683611e38565b905061109e565b60006137b28684611e38565b905060006137c361377c888a611b49565b905060006137d182846115e6565b905060006137df8489611e99565b90506136e76137ee88846135e6565b82613600565b6000806138018484611e38565b9050600061380f82876115e6565b9050600061381d8286613bf9565b90506135db86826115e6565b60008261383757508461109e565b60006138438684611e38565b905060006138518287611e99565b9050600061385f878a611b49565b9050600061386d8483611e99565b9050600061388461387e89846135e6565b85613600565b905061374f81896115e6565b60008261389e57508461109e565b60006138aa8684611e38565b905060006138b88287611e99565b905060006138c6868a611b49565b905060006138db84611eb36136d585876135e6565b90506136e781896115e6565b6000826138f85761379f8683613bf9565b60006139048684611e38565b905060006139128287611e99565b90506000613929613923838b6135e6565b87613bd8565b905060006139378483611b49565b905060006139458288613bf9565b905061374f818b6115e6565b60008061395e8484611e38565b9050600061396f61377c86886115e6565b905061065e82826115e6565b6000806139888684611e38565b9050600061399961377c888a6115e6565b905060006139a783836115e6565b905060006139b58489611e99565b90506136e76139c488846135e6565b82613bd8565b6000806139d78484611e38565b905060006139e58287611b49565b905060006139f38286613bf9565b90506135db81876115e6565b600080613a0c8684611e38565b90506000613a1a8287611e99565b90506000613a28878a6115e6565b90506000613a368483611e99565b90506000613a4761387e89846135e6565b905061374f88826115e6565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417613ace578160208401fd5b506115e2610165612581565b6000816001600160a01b03166301e1d1146040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b6000816001600160a01b03166344b813966040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b6000816001600160a01b031663c3535b526040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b6000816001600160a01b031663422327166040518163ffffffff1660e01b815260040160206040518083038186803b1580156134ff57600080fd5b670de0b6b3a764000081810391100290565b6000613be7821515600461162b565b50811515600019909201046001010290565b60008160200151831015613c4257815161133b90613c2090670de0b6b3a764000090611b49565b60208401518451613c3c91613c359190611859565b8690611b49565b90612a4e565b81604001518311613c5457508161070f565b815161133b90613c6d90670de0b6b3a7640000906115e6565b60408401518451613c3c91613c829190611859565b86906115e6565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561070f816148bc565b600082601f830112613d1f578081fd5b8135613d32613d2d82614890565b614869565b818152915060208083019084810181840286018201871015613d5357600080fd5b60005b84811015613d7257813584529282019290820190600101613d56565b505050505092915050565b600082601f830112613d8d578081fd5b8151613d9b613d2d82614890565b818152915060208083019084810181840286018201871015613dbc57600080fd5b60005b84811015613d7257815184529282019290820190600101613dbf565b600082601f830112613deb578081fd5b813567ffffffffffffffff811115613e01578182fd5b613e146020601f19601f84011601614869565b9150808252836020828501011115613e2b57600080fd5b8060208401602084013760009082016020015292915050565b80356002811061070f57600080fd5b6000610120808385031215613e66578182fd5b613e6f81614869565b915050613e7c8383613e44565b8152613e8b8360208401613d04565b6020820152613e9d8360408401613d04565b6040820152606082013560608201526080820135608082015260a082013560a0820152613ecd8360c08401613d04565b60c0820152613edf8360e08401613d04565b60e08201526101008083013567ffffffffffffffff811115613f0057600080fd5b613f0c85828601613ddb565b82840152505092915050565b600060208284031215613f29578081fd5b81356108e5816148bc565b60008060408385031215613f46578081fd5b8235613f51816148bc565b91506020830135613f61816148bc565b809150509250929050565b600080600060608486031215613f80578081fd5b8335613f8b816148bc565b92506020840135613f9b816148bc565b929592945050506040919091013590565b600080600080600080600060e0888a031215613fc6578283fd5b8735613fd1816148bc565b96506020880135613fe1816148bc565b955060408801359450606088013593506080880135613fff816148d1565b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561402e578182fd5b8235614039816148bc565b946020939093013593505050565b60008060006060848603121561405b578081fd5b835167ffffffffffffffff80821115614072578283fd5b818601915086601f830112614085578283fd5b8151614093613d2d82614890565b80828252602080830192508086018b8283870289010111156140b3578788fd5b8796505b848710156140de5780516140ca816148bc565b8452600196909601959281019281016140b7565b5089015190975093505050808211156140f5578283fd5b5061410286828701613d7d565b925050604084015190509250925092565b600060208284031215614124578081fd5b815180151581146108e5578182fd5b600060208284031215614144578081fd5b5051919050565b600080600080600080600060e0888a031215614165578081fd5b873596506020880135614177816148bc565b95506040880135614187816148bc565b9450606088013567ffffffffffffffff808211156141a3578283fd5b6141af8b838c01613d0f565b955060808a0135945060a08a0135935060c08a01359150808211156141d2578283fd5b506141df8a828b01613ddb565b91505092959891949750929550565b6000602082840312156141ff578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e5578182fd5b60006020828403121561423f578081fd5b81516108e5816148bc565b6000806000806080858703121561425f578182fd5b843567ffffffffffffffff80821115614276578384fd5b61428288838901613e53565b95506020870135915080821115614297578384fd5b506142a487828801613d0f565b949794965050505060408301359260600135919050565b6000806000606084860312156142cf578081fd5b833567ffffffffffffffff8111156142e5578182fd5b6142f186828701613e53565b9660208601359650604090950135949350505050565b600060208284031215614318578081fd5b5035919050565b60008060408385031215614331578182fd5b50508035926020909101359150565b60008060008060808587031215614355578182fd5b8451935060208501519250604085015191506060850151614375816148bc565b939692955090935050565b600060208284031215614391578081fd5b81516108e5816148d1565b600080604083850312156143ae578182fd5b82516143b9816148d1565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015614405578151875295820195908201906001016143e9565b509495945050505050565b15159052565b60008151808452815b8181101561443b5760208185018101518683018201520161441f565b8181111561444c5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b8281101561457557815180516004811061451e57fe5b855280870151614530888701826143c9565b50858101518686015260608082015161454b828801826143c9565b505060809081015190614560868201836143c9565b505060a0939093019290850190600101614508565b5091979650505050505050565b6000602082526108e560208301846143d6565b6000604082526145a860408301856143d6565b828103602084015261109e81856143d6565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b808310156146765761466084516148b0565b825292840192600192909201919084019061464e565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a08701526146b481856143d6565b935050506040850151818584030160c08601526146d18382614416565b9250505060608401516146e760e0850182614410565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b8181101561476e5761475c85516148b0565b8352938301939183019160010161474a565b505084810360408601528551808252908201925081860190845b818110156124b45761479a83516148b0565b85529383019391830191600101614788565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081016003831061481b57fe5b91905290565b6000602082526108e56020830184614416565b6000838252604060208301526115d060408301846143d6565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561488857600080fd5b604052919050565b600067ffffffffffffffff8211156148a6578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146119b757600080fd5b60ff811681146119b757600080fdfea2646970667358221220fed6a84d1aa6f096f67263c8b34d9d987a78802ccde3b74c7c9c7fc1a36d827864736f6c63430007010033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c80636634b7531162000099578063851c1bb3116200006f578063851c1bb314620001cd5780638d928af814620001f3578063aaabadc514620001fd578063df8af989146200020757620000ff565b80636634b75314620001935780636c57f5a914620001b9578063739238d614620001c357620000ff565b80632f2770db11620000db5780632f2770db146200015a5780633f819b6f146200016657806354fd4d5014620001705780635ed31282146200017a57620000ff565b8062c194db1462000104578063174481fa14620001265780632da47c401462000140575b600080fd5b6200010e6200021e565b6040516200011d919062001435565b60405180910390f35b620001306200023f565b6040516200011d929190620013ce565b6200014a62000285565b6040516200011d9291906200162e565b620001646200030e565b005b6200010e62000378565b6200010e62000430565b62000184620004b2565b6040516200011d9190620013ad565b620001aa620001a436600462001137565b620004ce565b6040516200011d9190620013f5565b620001aa620004f9565b6200018462000502565b620001e4620001de36600462001178565b62000526565b6040516200011d919062001400565b620001846200057a565b620001846200059e565b6200018462000218366004620011d9565b6200062b565b60606200023a6040518060200160405280600081525062000a52565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200030057807f00000000000000000000000000000000000000000000000000000000000000000392507f0000000000000000000000000000000000000000000000000000000000000000915062000309565b60009250600091505b509091565b6200031862000b2d565b6200032262000b7c565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b820191906000526020600020905b8154815290600101906020018083116200040857829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016200055d9291906200134a565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000620005aa6200057a565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620005f057600080fd5b505afa15801562000605573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023a9190620011ba565b60006200063762000b95565b6004805460018101909155604051606090620006566020820162000fd8565b601f1982820381018352601f90910116604052620006736200057a565b7f0000000000000000000000000000000000000000000000000000000000000000604051602001620006a7929190620013ce565b60408051601f1981840301815290829052620006c792916020016200137a565b60405160208183030381529060405290506000620006ed83838051906020012062000bb0565b9050600080620006fc62000285565b915091506200070a62000fe6565b620007146200057a565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508e81602001819052508d81604001819052508c816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508a8160c0018181525050898160e0018181525050828161010001818152505081816101200181815250508881610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506200087262000378565b610160820152604051600090620008a8906200089390849060200162001526565b60405160208183030381529060405262000bc6565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620008f357600080fd5b505af115801562000908573d6000803e3d6000fd5b5050505060006200091c6000898962000c1b565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146200098f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200098690620014b8565b60405180910390fd5b6040518a9073ffffffffffffffffffffffffffffffffffffffff8416907fda2f557d6e80d2dcf3894f2bb74fe9840e4d558e350f6aad63af0e0b12f1a58690600090a3509650505050505050620009e562000cf9565b98975050505050505050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000a4c73ffffffffffffffffffffffffffffffffffffffff831615156101ac62000d00565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000b1f81838662000d15565b505050505050505050919050565b600062000b5e6000357fffffffff000000000000000000000000000000000000000000000000000000001662000526565b905062000b7962000b70823362000d73565b61019162000d00565b50565b62000b9362000b8a620004f9565b1560d362000d00565b565b62000ba96002600354141561019062000d00565b6002600355565b600062000bbf83833062000e11565b9392505050565b60008062000bd48362000e52565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790559392505050565b6000808447101562000c5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000986906200144a565b825162000c96576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200098690620014ef565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009869062001481565b949350505050565b6001600355565b8162000d115762000d118162000eed565b5050565b5b6020811062000d37578151835260209283019290910190601f190162000d16565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000d7f6200059e565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000dbd9392919062001409565b60206040518083038186803b15801562000dd657600080fd5b505afa15801562000deb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bbf919062001156565b60008060ff60f81b83868660405160200162000e319493929190620012e6565b60408051808303601f19018152919052805160209091012095945050505050565b600062000e5e62000b7c565b600062000e6b8362000f19565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b62000b79817f42414c000000000000000000000000000000000000000000000000000000000062000f5d565b6000606062000f288362000a52565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811662000bbf573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6120ff806200169383390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f830112620010c6578081fd5b813567ffffffffffffffff80821115620010de578283fd5b6040516020601f19601f8501168201018181108382111715620010ff578485fd5b6040528281529250828483016020018610156200111b57600080fd5b8260208601602083013760006020848301015250505092915050565b60006020828403121562001149578081fd5b813562000bbf816200166f565b60006020828403121562001168578081fd5b8151801515811462000bbf578182fd5b6000602082840312156200118a578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811462000bbf578182fd5b600060208284031215620011cc578081fd5b815162000bbf816200166f565b600080600080600080600080610100898b031215620011f6578384fd5b883567ffffffffffffffff808211156200120e578586fd5b6200121c8c838d01620010b5565b995060208b013591508082111562001232578586fd5b50620012418b828c01620010b5565b975050604089013562001254816200166f565b9550606089013562001266816200166f565b94506080890135935060a0890135925060c089013562001286816200166f565b8092505060e089013590509295985092959890939650565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620012d28160208601602086016200163c565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b600083516200138e8184602088016200163c565b835190830190620013a48183602088016200163c565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000bbf6020830184620012b8565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b6000602082526200153c6020830184516200129e565b60208301516101808060408501526200155a6101a0850183620012b8565b91506040850151601f19808685030160608701526200157a8483620012b8565b9350606087015191506200159260808701836200129e565b60808701519150620015a860a08701836200129e565b60a08701519150620015be60c08701836200129e565b60c087015160e087810191909152870151610100808801919091528701516101208088019190915287015161014080880191909152870151915061016062001609818801846200129e565b870151868503909101838701529050620016248382620012b8565b9695505050505050565b918252602082015260400190565b60005b83811015620016595781810151838201526020016200163f565b8381111562001669576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000b7957600080fdfe6101606040523480156200001257600080fd5b50604051620020ff380380620020ff833981016040819052620000359162000462565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000378565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200012591908101906200039e565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000449565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000449565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000378565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000378565b6001600160601b0319606091821b811660e05292811b8316610120521b166101405250620004e0915050565b6000602082840312156200038a578081fd5b81516200039781620004c7565b9392505050565b60006020808385031215620003b1578182fd5b82516001600160401b0380821115620003c8578384fd5b818501915085601f830112620003dc578384fd5b815181811115620003eb578485fd5b8381029150620003fd848301620004a0565b8181528481019084860184860187018a101562000418578788fd5b8795505b838610156200043c5780518352600195909501949186019186016200041c565b5098975050505050505050565b6000602082840312156200045b578081fd5b5051919050565b6000806040838503121562000475578081fd5b82516200048281620004c7565b60208401519092506200049581620004c7565b809150509250929050565b6040518181016001600160401b0381118282101715620004bf57600080fd5b604052919050565b6001600160a01b0381168114620004dd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c611b3c620005c36000398061050b52806108235250806101355280610c165280610f305280610f925250806103c152508061046e528061059b528061074a52806108ee5280610cc05280610ff2528061105c52806110be52508060ea5280610192528061043252806105ce528061063352806106d4528061078652806108b3528061103a5250806101715280610404528061071c5280610a7f5280610b5e5280610db85280610e975250806099528061030b5250611b3c6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b919061186b565b60405180910390f35b610077610072366004611729565b6100bb565b60405161005b9190611aa5565b610077610092366004611745565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610124565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308561025b565b61011b83610124565b90505b92915050565b60008061012f610304565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101ce9291906119b7565b60806040518083038186803b1580156101e657600080fd5b505afa1580156101fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021e91906117cb565b50505090508181101561024057610237818303856103ed565b925050506100c9565b818111156102545761023782820385610705565b5050919050565b6102fe846323b872dd60e01b85858560405160240161027c939291906118b3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610913565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a691906117a8565b9150915060006002828401816103b857fe5b0490506103e5817f00000000000000000000000000000000000000000000000000000000000000006109c0565b935050505090565b60006103f7611676565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104cb6116d9565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061054290869086906004016119db565b602060405180830381600087803b15801561055c57600080fd5b505af1158015610570573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105949190611790565b90506105c07f000000000000000000000000000000000000000000000000000000000000000082610a13565b6105c981610c84565b6105f37f000000000000000000000000000000000000000000000000000000000000000087610d4c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a082319061066890309060040161186b565b60206040518083038186803b15801561068057600080fd5b505afa158015610694573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b89190611790565b90506106fb73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fc7565b9695505050505050565b600061070f611676565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e36116d9565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061085a90869086906004016119db565b602060405180830381600087803b15801561087457600080fd5b505af1158015610888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ac9190611790565b90506108d87f000000000000000000000000000000000000000000000000000000000000000087610a13565b6108e96108e482610feb565b611020565b6105f37f000000000000000000000000000000000000000000000000000000000000000082610d4c565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093c919061184f565b6000604051808303816000865af19150503d8060008114610979576040519150601f19603f3d011682016040523d82523d6000602084013e61097e565b606091505b50915091506000821415610996573d6000803e3d6000fd5b6102fe8151600014806109b85750818060200190518101906109b89190611770565b6101a26110f5565b60006109cf82151560046110f5565b670de0b6b3a76400008302610a018415806109fa5750670de0b6b3a76400008583816109f757fe5b04145b60056110f5565b828181610a0a57fe5b04949350505050565b6040805160028082526060828101909352816020015b610a31611700565b815260200190600190039081610a29579050509050600081600081518110610a5557fe5b6020026020010151600001906002811115610a6c57fe5b90816002811115610a7957fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aab57fe5b602002602001015160200181815250508181600081518110610ac957fe5b602002602001015160600181815250508281600081518110610ae757fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3457fe5b6020026020010151600001906002811115610b4b57fe5b90816002811115610b5857fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8a57fe5b60200260200101516020018181525050600081600181518110610ba957fe5b602002602001015160600181815250508281600181518110610bc757fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4d908490600401611933565b600060405180830381600087803b158015610c6757600080fd5b505af1158015610c7b573d6000803e3d6000fd5b50505050505050565b6040517ef714ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169062f714ce90610cf690849030906004016119b7565b602060405180830381600087803b158015610d1057600080fd5b505af1158015610d24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d489190611790565b5050565b6040805160028082526060828101909352816020015b610d6a611700565b815260200190600190039081610d62579050509050600281600081518110610d8e57fe5b6020026020010151600001906002811115610da557fe5b90816002811115610db257fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de457fe5b602002602001015160200181815250508181600081518110610e0257fe5b602002602001015160600181815250508281600081518110610e2057fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e6d57fe5b6020026020010151600001906002811115610e8457fe5b90816002811115610e9157fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec357fe5b602002602001015160200181815250508181600181518110610ee157fe5b602002602001015160600181815250508281600181518110610eff57fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f559084167f000000000000000000000000000000000000000000000000000000000000000084611103565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4d908490600401611933565b610fe68363a9059cbb60e01b848460405160240161027c92919061190d565b505050565b60006110177f0000000000000000000000000000000000000000000000000000000000000000836111f8565b60010192915050565b61108173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611103565b6040517f6e553f6500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636e553f6590610cf690849030906004016119b7565b81610d4857610d488161123e565b80158015906111b457506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e90611161903090869060040161188c565b60206040518083038186803b15801561117957600080fd5b505afa15801561118d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b19190611790565b15155b156111d9576111d98363095ea7b360e01b84600060405160240161027c9291906118e4565b610fe68363095ea7b360e01b848460405160240161027c92919061190d565b6000806112048461126b565b905080611214578291505061011e565b600061121f8561134b565b90506112358261122f86846113bf565b906113e3565b9250505061011e565b611268817f42414c0000000000000000000000000000000000000000000000000000000000611403565b50565b60008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b505afa925050508015611301575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526112fe91810190611790565b60015b611344573d80801561132f576040519150601f19603f3d011682016040523d82523d6000602084013e611334565b606091505b5061133e8161147e565b506100c9565b90506100c9565b60008061135783611505565b905060006113648461154d565b9050600061137b61137486611595565b42906115dd565b9050600061139261138b876115f3565b83906113bf565b905060006113a8846113a38461163b565b61164d565b90506113b485826115dd565b979650505050505050565b600082820261011b8415806113dc5750838583816113d957fe5b04145b60036110f5565b60006113f282151560046110f5565b8183816113fb57fe5b049392505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc12000000000000000000000000000000000000000000000000000000008214176114f9578160208401fd5b50610d4861016561123e565b60008173ffffffffffffffffffffffffffffffffffffffff166301e1d1146040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff166344b813966040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663c3535b526040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60006115ed8383111560016110f5565b50900390565b60008173ffffffffffffffffffffffffffffffffffffffff1663422327166040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b670de0b6b3a764000081810391100290565b60008282026116678415806113dc5750838583816113d957fe5b670de0b6b3a764000081610a0a565b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b60006020828403121561173a578081fd5b813561011b81611ae4565b60008060408385031215611757578081fd5b823561176281611ae4565b946020939093013593505050565b600060208284031215611781578081fd5b8151801515811461011b578182fd5b6000602082840312156117a1578081fd5b5051919050565b600080604083850312156117ba578182fd5b505080516020909101519092909150565b600080600080608085870312156117e0578182fd5b845193506020850151925060408501519150606085015161180081611ae4565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b60008251611861818460208701611aae565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b828110156119aa57815180516003811061196657fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff16868601526060908101519085015260809093019290850190600101611950565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a083015260208401516119f681611ada565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c0610140840152805180610160850152610180611a628282870160208601611aae565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401168601019350505050611a9e602083018461180b565b9392505050565b90815260200190565b60005b83811015611ac9578181015183820152602001611ab1565b838111156102fe5750506000910152565b6002811061126857fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461126857600080fdfea26469706673582212208beb7817193b118865b9e09fbe3db18b401c8700b7d556fbd4b00fcb8b5d27ea64736f6c63430007010033a26469706673582212209fbcb0dead2daf898c54d10157ac2cd6beae5f4d9f7288ed8af8316016a47e6d64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/artifact/YearnLinearPoolRebalancer.json b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/artifact/YearnLinearPoolRebalancer.json new file mode 100644 index 0000000..6d847fa --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/artifact/YearnLinearPoolRebalancer.json @@ -0,0 +1,83 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "YearnLinearPoolRebalancer", + "sourceName": "contracts/yearn-linear-pool/YearnLinearPoolRebalancer.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IBalancerQueries", + "name": "queries", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "getPool", + "outputs": [ + { + "internalType": "contract ILinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "rebalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "extraMain", + "type": "uint256" + } + ], + "name": "rebalanceWithExtraMain", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101606040523480156200001257600080fd5b50604051620020ff380380620020ff833981016040819052620000359162000462565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000378565b8282826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200012591908101906200039e565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000449565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000449565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000378565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000378565b6001600160601b0319606091821b811660e05292811b8316610120521b166101405250620004e0915050565b6000602082840312156200038a578081fd5b81516200039781620004c7565b9392505050565b60006020808385031215620003b1578182fd5b82516001600160401b0380821115620003c8578384fd5b818501915085601f830112620003dc578384fd5b815181811115620003eb578485fd5b8381029150620003fd848301620004a0565b8181528481019084860184860187018a101562000418578788fd5b8795505b838610156200043c5780518352600195909501949186019186016200041c565b5098975050505050505050565b6000602082840312156200045b578081fd5b5051919050565b6000806040838503121562000475578081fd5b82516200048281620004c7565b60208401519092506200049581620004c7565b809150509250929050565b6040518181016001600160401b0381118282101715620004bf57600080fd5b604052919050565b6001600160a01b0381168114620004dd57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c611b3c620005c36000398061050b52806108235250806101355280610c165280610f305280610f925250806103c152508061046e528061059b528061074a52806108ee5280610cc05280610ff2528061105c52806110be52508060ea5280610192528061043252806105ce528061063352806106d4528061078652806108b3528061103a5250806101715280610404528061071c5280610a7f5280610b5e5280610db85280610e975250806099528061030b5250611b3c6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b919061186b565b60405180910390f35b610077610072366004611729565b6100bb565b60405161005b9190611aa5565b610077610092366004611745565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610124565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308561025b565b61011b83610124565b90505b92915050565b60008061012f610304565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101ce9291906119b7565b60806040518083038186803b1580156101e657600080fd5b505afa1580156101fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021e91906117cb565b50505090508181101561024057610237818303856103ed565b925050506100c9565b818111156102545761023782820385610705565b5050919050565b6102fe846323b872dd60e01b85858560405160240161027c939291906118b3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610913565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a691906117a8565b9150915060006002828401816103b857fe5b0490506103e5817f00000000000000000000000000000000000000000000000000000000000000006109c0565b935050505090565b60006103f7611676565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104cb6116d9565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061054290869086906004016119db565b602060405180830381600087803b15801561055c57600080fd5b505af1158015610570573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105949190611790565b90506105c07f000000000000000000000000000000000000000000000000000000000000000082610a13565b6105c981610c84565b6105f37f000000000000000000000000000000000000000000000000000000000000000087610d4c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a082319061066890309060040161186b565b60206040518083038186803b15801561068057600080fd5b505afa158015610694573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b89190611790565b90506106fb73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fc7565b9695505050505050565b600061070f611676565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e36116d9565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061085a90869086906004016119db565b602060405180830381600087803b15801561087457600080fd5b505af1158015610888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ac9190611790565b90506108d87f000000000000000000000000000000000000000000000000000000000000000087610a13565b6108e96108e482610feb565b611020565b6105f37f000000000000000000000000000000000000000000000000000000000000000082610d4c565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093c919061184f565b6000604051808303816000865af19150503d8060008114610979576040519150601f19603f3d011682016040523d82523d6000602084013e61097e565b606091505b50915091506000821415610996573d6000803e3d6000fd5b6102fe8151600014806109b85750818060200190518101906109b89190611770565b6101a26110f5565b60006109cf82151560046110f5565b670de0b6b3a76400008302610a018415806109fa5750670de0b6b3a76400008583816109f757fe5b04145b60056110f5565b828181610a0a57fe5b04949350505050565b6040805160028082526060828101909352816020015b610a31611700565b815260200190600190039081610a29579050509050600081600081518110610a5557fe5b6020026020010151600001906002811115610a6c57fe5b90816002811115610a7957fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aab57fe5b602002602001015160200181815250508181600081518110610ac957fe5b602002602001015160600181815250508281600081518110610ae757fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3457fe5b6020026020010151600001906002811115610b4b57fe5b90816002811115610b5857fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8a57fe5b60200260200101516020018181525050600081600181518110610ba957fe5b602002602001015160600181815250508281600181518110610bc757fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4d908490600401611933565b600060405180830381600087803b158015610c6757600080fd5b505af1158015610c7b573d6000803e3d6000fd5b50505050505050565b6040517ef714ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169062f714ce90610cf690849030906004016119b7565b602060405180830381600087803b158015610d1057600080fd5b505af1158015610d24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d489190611790565b5050565b6040805160028082526060828101909352816020015b610d6a611700565b815260200190600190039081610d62579050509050600281600081518110610d8e57fe5b6020026020010151600001906002811115610da557fe5b90816002811115610db257fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de457fe5b602002602001015160200181815250508181600081518110610e0257fe5b602002602001015160600181815250508281600081518110610e2057fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e6d57fe5b6020026020010151600001906002811115610e8457fe5b90816002811115610e9157fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec357fe5b602002602001015160200181815250508181600181518110610ee157fe5b602002602001015160600181815250508281600181518110610eff57fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f559084167f000000000000000000000000000000000000000000000000000000000000000084611103565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4d908490600401611933565b610fe68363a9059cbb60e01b848460405160240161027c92919061190d565b505050565b60006110177f0000000000000000000000000000000000000000000000000000000000000000836111f8565b60010192915050565b61108173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611103565b6040517f6e553f6500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636e553f6590610cf690849030906004016119b7565b81610d4857610d488161123e565b80158015906111b457506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e90611161903090869060040161188c565b60206040518083038186803b15801561117957600080fd5b505afa15801561118d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b19190611790565b15155b156111d9576111d98363095ea7b360e01b84600060405160240161027c9291906118e4565b610fe68363095ea7b360e01b848460405160240161027c92919061190d565b6000806112048461126b565b905080611214578291505061011e565b600061121f8561134b565b90506112358261122f86846113bf565b906113e3565b9250505061011e565b611268817f42414c0000000000000000000000000000000000000000000000000000000000611403565b50565b60008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b505afa925050508015611301575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526112fe91810190611790565b60015b611344573d80801561132f576040519150601f19603f3d011682016040523d82523d6000602084013e611334565b606091505b5061133e8161147e565b506100c9565b90506100c9565b60008061135783611505565b905060006113648461154d565b9050600061137b61137486611595565b42906115dd565b9050600061139261138b876115f3565b83906113bf565b905060006113a8846113a38461163b565b61164d565b90506113b485826115dd565b979650505050505050565b600082820261011b8415806113dc5750838583816113d957fe5b04145b60036110f5565b60006113f282151560046110f5565b8183816113fb57fe5b049392505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc12000000000000000000000000000000000000000000000000000000008214176114f9578160208401fd5b50610d4861016561123e565b60008173ffffffffffffffffffffffffffffffffffffffff166301e1d1146040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff166344b813966040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663c3535b526040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60006115ed8383111560016110f5565b50900390565b60008173ffffffffffffffffffffffffffffffffffffffff1663422327166040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b670de0b6b3a764000081810391100290565b60008282026116678415806113dc5750838583816113d957fe5b670de0b6b3a764000081610a0a565b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b60006020828403121561173a578081fd5b813561011b81611ae4565b60008060408385031215611757578081fd5b823561176281611ae4565b946020939093013593505050565b600060208284031215611781578081fd5b8151801515811461011b578182fd5b6000602082840312156117a1578081fd5b5051919050565b600080604083850312156117ba578182fd5b505080516020909101519092909150565b600080600080608085870312156117e0578182fd5b845193506020850151925060408501519150606085015161180081611ae4565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b60008251611861818460208701611aae565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b828110156119aa57815180516003811061196657fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff16868601526060908101519085015260809093019290850190600101611950565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a083015260208401516119f681611ada565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c0610140840152805180610160850152610180611a628282870160208601611aae565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401168601019350505050611a9e602083018461180b565b9392505050565b90815260200190565b60005b83811015611ac9578181015183820152602001611ab1565b838111156102fe5750506000910152565b6002811061126857fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461126857600080fdfea26469706673582212208beb7817193b118865b9e09fbe3db18b401c8700b7d556fbd4b00fcb8b5d27ea64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b919061186b565b60405180910390f35b610077610072366004611729565b6100bb565b60405161005b9190611aa5565b610077610092366004611745565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610124565b90505b919050565b600061011273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308561025b565b61011b83610124565b90505b92915050565b60008061012f610304565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101ce9291906119b7565b60806040518083038186803b1580156101e657600080fd5b505afa1580156101fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021e91906117cb565b50505090508181101561024057610237818303856103ed565b925050506100c9565b818111156102545761023782820385610705565b5050919050565b6102fe846323b872dd60e01b85858560405160240161027c939291906118b3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610913565b50505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561036e57600080fd5b505afa158015610382573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a691906117a8565b9150915060006002828401816103b857fe5b0490506103e5817f00000000000000000000000000000000000000000000000000000000000000006109c0565b935050505090565b60006103f7611676565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506104cb6116d9565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061054290869086906004016119db565b602060405180830381600087803b15801561055c57600080fd5b505af1158015610570573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105949190611790565b90506105c07f000000000000000000000000000000000000000000000000000000000000000082610a13565b6105c981610c84565b6105f37f000000000000000000000000000000000000000000000000000000000000000087610d4c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a082319061066890309060040161186b565b60206040518083038186803b15801561068057600080fd5b505afa158015610694573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b89190611790565b90506106fb73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783610fc7565b9695505050505050565b600061070f611676565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018581526020016040518060200160405280600081525081525090506107e36116d9565b6040517fe969f6b300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b39061085a90869086906004016119db565b602060405180830381600087803b15801561087457600080fd5b505af1158015610888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ac9190611790565b90506108d87f000000000000000000000000000000000000000000000000000000000000000087610a13565b6108e96108e482610feb565b611020565b6105f37f000000000000000000000000000000000000000000000000000000000000000082610d4c565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161093c919061184f565b6000604051808303816000865af19150503d8060008114610979576040519150601f19603f3d011682016040523d82523d6000602084013e61097e565b606091505b50915091506000821415610996573d6000803e3d6000fd5b6102fe8151600014806109b85750818060200190518101906109b89190611770565b6101a26110f5565b60006109cf82151560046110f5565b670de0b6b3a76400008302610a018415806109fa5750670de0b6b3a76400008583816109f757fe5b04145b60056110f5565b828181610a0a57fe5b04949350505050565b6040805160028082526060828101909352816020015b610a31611700565b815260200190600190039081610a29579050509050600081600081518110610a5557fe5b6020026020010151600001906002811115610a6c57fe5b90816002811115610a7957fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610aab57fe5b602002602001015160200181815250508181600081518110610ac957fe5b602002602001015160600181815250508281600081518110610ae757fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600281600181518110610b3457fe5b6020026020010151600001906002811115610b4b57fe5b90816002811115610b5857fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610b8a57fe5b60200260200101516020018181525050600081600181518110610ba957fe5b602002602001015160600181815250508281600181518110610bc757fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610c4d908490600401611933565b600060405180830381600087803b158015610c6757600080fd5b505af1158015610c7b573d6000803e3d6000fd5b50505050505050565b6040517ef714ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169062f714ce90610cf690849030906004016119b7565b602060405180830381600087803b158015610d1057600080fd5b505af1158015610d24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d489190611790565b5050565b6040805160028082526060828101909352816020015b610d6a611700565b815260200190600190039081610d62579050509050600281600081518110610d8e57fe5b6020026020010151600001906002811115610da557fe5b90816002811115610db257fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610de457fe5b602002602001015160200181815250508181600081518110610e0257fe5b602002602001015160600181815250508281600081518110610e2057fe5b60200260200101516040019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181600181518110610e6d57fe5b6020026020010151600001906002811115610e8457fe5b90816002811115610e9157fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ec357fe5b602002602001015160200181815250508181600181518110610ee157fe5b602002602001015160600181815250508281600181518110610eff57fe5b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff918216604090910152610f559084167f000000000000000000000000000000000000000000000000000000000000000084611103565b6040517fe6c4609200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610c4d908490600401611933565b610fe68363a9059cbb60e01b848460405160240161027c92919061190d565b505050565b60006110177f0000000000000000000000000000000000000000000000000000000000000000836111f8565b60010192915050565b61108173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083611103565b6040517f6e553f6500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636e553f6590610cf690849030906004016119b7565b81610d4857610d488161123e565b80158015906111b457506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e90611161903090869060040161188c565b60206040518083038186803b15801561117957600080fd5b505afa15801561118d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b19190611790565b15155b156111d9576111d98363095ea7b360e01b84600060405160240161027c9291906118e4565b610fe68363095ea7b360e01b848460405160240161027c92919061190d565b6000806112048461126b565b905080611214578291505061011e565b600061121f8561134b565b90506112358261122f86846113bf565b906113e3565b9250505061011e565b611268817f42414c0000000000000000000000000000000000000000000000000000000000611403565b50565b60008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b505afa925050508015611301575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526112fe91810190611790565b60015b611344573d80801561132f576040519150601f19603f3d011682016040523d82523d6000602084013e611334565b606091505b5061133e8161147e565b506100c9565b90506100c9565b60008061135783611505565b905060006113648461154d565b9050600061137b61137486611595565b42906115dd565b9050600061139261138b876115f3565b83906113bf565b905060006113a8846113a38461163b565b61164d565b90506113b485826115dd565b979650505050505050565b600082820261011b8415806113dc5750838583816113d957fe5b04145b60036110f5565b60006113f282151560046110f5565b8183816113fb57fe5b049392505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc12000000000000000000000000000000000000000000000000000000008214176114f9578160208401fd5b50610d4861016561123e565b60008173ffffffffffffffffffffffffffffffffffffffff166301e1d1146040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff166344b813966040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663c3535b526040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b60006115ed8383111560016110f5565b50900390565b60008173ffffffffffffffffffffffffffffffffffffffff1663422327166040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b357600080fd5b670de0b6b3a764000081810391100290565b60008282026116678415806113dc5750838583816113d957fe5b670de0b6b3a764000081610a0a565b6040805160c08101909152600080825260208201908152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b60006020828403121561173a578081fd5b813561011b81611ae4565b60008060408385031215611757578081fd5b823561176281611ae4565b946020939093013593505050565b600060208284031215611781578081fd5b8151801515811461011b578182fd5b6000602082840312156117a1578081fd5b5051919050565b600080604083850312156117ba578182fd5b505080516020909101519092909150565b600080600080608085870312156117e0578182fd5b845193506020850151925060408501519150606085015161180081611ae4565b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b60008251611861818460208701611aae565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff92909216825260ff16602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b828110156119aa57815180516003811061196657fe5b855280870151878601528581015173ffffffffffffffffffffffffffffffffffffffff16868601526060908101519085015260809093019290850190600101611950565b5091979650505050505050565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b600060a08252835160a083015260208401516119f681611ada565b8060c084015250604084015173ffffffffffffffffffffffffffffffffffffffff80821660e0850152806060870151166101008501525050608084015161012083015260a084015160c0610140840152805180610160850152610180611a628282870160208601611aae565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401168601019350505050611a9e602083018461180b565b9392505050565b90815260200190565b60005b83811015611ac9578181015183820152602001611ab1565b838111156102fe5750506000910152565b6002811061126857fe5b73ffffffffffffffffffffffffffffffffffffffff8116811461126857600080fdfea26469706673582212208beb7817193b118865b9e09fbe3db18b401c8700b7d556fbd4b00fcb8b5d27ea64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/artifact/YearnShareValueHelper.json b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/artifact/YearnShareValueHelper.json new file mode 100644 index 0000000..a5bc85f --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/artifact/YearnShareValueHelper.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "YearnShareValueHelper", + "sourceName": "contracts/yearn-linear-pool/YearnShareValueHelper.sol", + "abi": [], + "bytecode": "0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea26469706673582212203618cfe1b9194bd14b72f379bd87b402f00e2f55bd10b2b871b921a079c65cf664736f6c63430007010033", + "deployedBytecode": "0x6080604052600080fdfea26469706673582212203618cfe1b9194bd14b72f379bd87b402f00e2f55bd10b2b871b921a079c65cf664736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/index.ts b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/index.ts new file mode 100644 index 0000000..ff4e511 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/index.ts @@ -0,0 +1,103 @@ +import { bn } from '@helpers/numbers'; +import { Task, TaskMode, TaskRunOptions } from '@src'; +import { YearnLinearPoolDeployment } from './input'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import * as expectEvent from '@helpers/expectEvent'; +import { ethers } from 'hardhat'; +import { getContractDeploymentTransactionHash, saveContractDeploymentTransactionHash } from '@src'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as YearnLinearPoolDeployment; + const args = [ + input.Vault, + input.ProtocolFeePercentagesProvider, + input.BalancerQueries, + input.FactoryVersion, + input.PoolVersion, + input.InitialPauseWindowDuration, + input.BufferPeriodDuration, + ]; + + const factory = await task.deployAndVerify('YearnLinearPoolFactory', args, from, force); + + if (task.mode === TaskMode.LIVE) { + // We also create a Pool using the factory and verify it, to let us compute their action IDs and so that future + // Pools are automatically verified. We however don't run any of this code in CHECK mode, since we don't care about + // the contracts deployed here. The action IDs will be checked to be correct via a different mechanism. + + // YearnLinearPools require a Yearn Token + const mockShareTokenArgs = ['DO NOT USE - Mock Yearn Token', 'TEST', 18, input.WETH]; + // Using MockYearnTokenVault from task 20230409-yearn-linear-pool-v2 + const mockShareToken = await task.deployAndVerify('MockYearnTokenVault', mockShareTokenArgs, from, force); + + // The assetManager, pauseWindowDuration and bufferPeriodDuration will be filled in later, but we need to declare + // them here to appease the type system. Those are constructor arguments, but automatically provided by the factory. + const mockPoolArgs = { + vault: input.Vault, + name: 'DO NOT USE - Mock Linear Pool', + symbol: 'TEST', + mainToken: input.WETH, + wrappedToken: mockShareToken.address, + assetManager: undefined, + upperTarget: 0, + pauseWindowDuration: undefined, + bufferPeriodDuration: undefined, + swapFeePercentage: bn(1e12), + owner: ZERO_ADDRESS, + version: input.PoolVersion, + }; + + // This mimics the logic inside task.deploy + if (force || !task.output({ ensure: false })['MockYearnLinearPool']) { + const PROTOCOL_ID = 0; + + const poolCreationReceipt = await ( + await factory.create( + mockPoolArgs.name, + mockPoolArgs.symbol, + mockPoolArgs.mainToken, + mockPoolArgs.wrappedToken, + mockPoolArgs.upperTarget, + mockPoolArgs.swapFeePercentage, + mockPoolArgs.owner, + PROTOCOL_ID + ) + ).wait(); + const event = expectEvent.inReceipt(poolCreationReceipt, 'PoolCreated'); + const mockPoolAddress = event.args.pool; + + await saveContractDeploymentTransactionHash(mockPoolAddress, poolCreationReceipt.transactionHash, task.network); + await task.save({ MockYearnLinearPool: mockPoolAddress }); + } + + const mockPool = await task.instanceAt('YearnLinearPool', task.output()['MockYearnLinearPool']); + + // In order to verify the Pool's code, we need to complete its constructor arguments by computing the factory + // provided arguments (asset manager and pause durations). + + // The asset manager is found by querying the Vault + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, task.network); + const vault = await vaultTask.deployedInstance('Vault'); + + const { assetManager: assetManagerAddress } = await vault.getPoolTokenInfo(await mockPool.getPoolId(), input.WETH); + mockPoolArgs.assetManager = assetManagerAddress; + + // The durations require knowing when the Pool was created, so we look for the timestamp of its creation block. + const txHash = await getContractDeploymentTransactionHash(mockPool.address, task.network); + const tx = await ethers.provider.getTransactionReceipt(txHash); + const poolCreationBlock = await ethers.provider.getBlock(tx.blockNumber); + + // With those and the period end times, we can compute the durations. + const { pauseWindowEndTime, bufferPeriodEndTime } = await mockPool.getPausedState(); + mockPoolArgs.pauseWindowDuration = pauseWindowEndTime.sub(poolCreationBlock.timestamp); + mockPoolArgs.bufferPeriodDuration = bufferPeriodEndTime + .sub(poolCreationBlock.timestamp) + .sub(mockPoolArgs.pauseWindowDuration); + + // We are now ready to verify the Pool + await task.verify('YearnLinearPool', mockPool.address, [mockPoolArgs]); + + // We can also verify the Asset Manager + await task.verify('YearnLinearPoolRebalancer', assetManagerAddress, [input.Vault, input.BalancerQueries]); + } +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/input.ts b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/input.ts new file mode 100644 index 0000000..819a572 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/input.ts @@ -0,0 +1,31 @@ +import { Task, TaskMode } from '@src'; +import { MONTH } from '@helpers/time'; + +export type YearnLinearPoolDeployment = { + Vault: string; + BalancerQueries: string; + ProtocolFeePercentagesProvider: string; + WETH: string; + FactoryVersion: string; + PoolVersion: string; + InitialPauseWindowDuration: number; + BufferPeriodDuration: number; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerQueries = new Task('20220721-balancer-queries', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); +const WETH = new Task('00000000-tokens', TaskMode.READ_ONLY); + +const BaseVersion = { version: 1, deployment: '20230213-yearn-linear-pool' }; + +export default { + Vault, + BalancerQueries, + ProtocolFeePercentagesProvider, + WETH, + FactoryVersion: JSON.stringify({ name: 'YearnLinearPoolFactory', ...BaseVersion }), + PoolVersion: JSON.stringify({ name: 'YearnLinearPool', ...BaseVersion }), + InitialPauseWindowDuration: MONTH * 3, + BufferPeriodDuration: MONTH, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/output/arbitrum.json new file mode 100644 index 0000000..ef25d5d --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/output/arbitrum.json @@ -0,0 +1,5 @@ +{ + "YearnLinearPoolFactory": "0xD8B6b96c88ad626EB6209c4876e3B14f45f8803A", + "MockYearnTokenVault": "0x1b986138a4F2aA538E79fdEC222dad93F8d66703", + "MockYearnLinearPool": "0x81fC12C60ee5b753cf5fD0ADC342dFb5f3817E32" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/output/goerli.json new file mode 100644 index 0000000..7947f98 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/output/goerli.json @@ -0,0 +1,5 @@ +{ + "YearnLinearPoolFactory": "0x2a12a248f9b56cE6e7fAbA62D1bBA8735FB513F9", + "MockYearnTokenVault": "0x057Cf03e3E0EC8D5a5FaFb3A0fC99a0aA0C1989e", + "MockYearnLinearPool": "0x6D2b8b4EBa8ac88F8467D84bE010d344bFBD90e2" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/output/mainnet.json new file mode 100644 index 0000000..be8460a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/output/mainnet.json @@ -0,0 +1,5 @@ +{ + "YearnLinearPoolFactory": "0x8b7854708c0C54f9D7d1FF351D4F84E6dE0E134C", + "MockYearnTokenVault": "0x5C5fCf8fBd4cd563cED27e7D066b88ee20E1867A", + "MockYearnLinearPool": "0x0a0fb4ff697de5ac5b6770cd8ee1b72af80b57cf" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/output/optimism.json b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/output/optimism.json new file mode 100644 index 0000000..ef25d5d --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/output/optimism.json @@ -0,0 +1,5 @@ +{ + "YearnLinearPoolFactory": "0xD8B6b96c88ad626EB6209c4876e3B14f45f8803A", + "MockYearnTokenVault": "0x1b986138a4F2aA538E79fdEC222dad93F8d66703", + "MockYearnLinearPool": "0x81fC12C60ee5b753cf5fD0ADC342dFb5f3817E32" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/output/polygon.json new file mode 100644 index 0000000..d1cd58a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/output/polygon.json @@ -0,0 +1,5 @@ +{ + "YearnLinearPoolFactory": "0x7396f99B48e7436b152427bfA3DD6Aa8C7C6d05B", + "MockYearnTokenVault": "0x533a16F90E7d3Ca31dbc608E5EC54967710F0D2A", + "MockYearnLinearPool": "0x0320C1C5B6df19A194D48882aaEC1c72940081D9" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/readme.md b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/readme.md new file mode 100644 index 0000000..8a6c29f --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/readme.md @@ -0,0 +1,20 @@ +# 2023-02-13 - Yearn Linear Pool + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> This deployment has been deprecated in favor of a new version that uses create2 for pool deployments: [yearn-linear-pool-v2](../../20230409-yearn-linear-pool-v2/). + +First deployment of the `YearnLinearPoolFactory`, for Linear Pools with a Yearn yield-bearing token. +Already fixes the reentrancy issue described in https://forum.balancer.fi/t/reentrancy-vulnerability-scope-expanded/4345. +Also has a fix in the `YearnLinearPoolRebalancer` to handle tokens which require the `SafeERC20` library for approvals. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`YearnLinearPoolFactory` artifact](./artifact/YearnLinearPoolFactory.json) +- [`YearnLinearPool` artifact](./artifact/YearnLinearPool.json) +- [`YearnLinearPoolRebalancer` artifact](./artifact/YearnLinearPoolRebalancer.json) +- [`YearnShareValueHelper` artifact](./artifact/YearnShareValueHelper.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/test/task.fork.ts new file mode 100644 index 0000000..1013403 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230213-yearn-linear-pool/test/task.fork.ts @@ -0,0 +1,407 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; +import { setCode } from '@nomicfoundation/hardhat-network-helpers'; +import * as expectEvent from '@helpers/expectEvent'; +import { bn, fp, FP_ONE } from '@helpers/numbers'; +import { MAX_UINT256 } from '@helpers/constants'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; + +import { impersonate, getForkedNetwork, Task, TaskMode, getSigners } from '@src'; +import { describeForkTest } from '@src'; +import { deploy, instanceAt, getArtifact } from '@src'; + +export enum SwapKind { + GivenIn = 0, + GivenOut, +} + +describeForkTest('YearnLinearPoolFactory', 'mainnet', 16610000, function () { + let owner: SignerWithAddress, holder: SignerWithAddress, other: SignerWithAddress; + let vault: Contract, mainToken: Contract; + let factory: Contract; + let rebalancer: Contract; + + let task: Task; + + const USDC = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'; + const yvUSDC = '0xa354F35829Ae975e850e23e9615b11Da1B3dC4DE'; + + const USDC_SCALING = bn(1e12); // USDC has 6 decimals, so its scaling factor is 1e12 + + const USDC_HOLDER = '0x7713974908Be4BEd47172370115e8b1219F4A5f0'; + + const SWAP_FEE_PERCENTAGE = fp(0.01); // 1% + + // The targets are set using 18 decimals, even if the token has fewer (as is the case for USDC); + const INITIAL_UPPER_TARGET = fp(1e5); + + // The initial midpoint (upper target / 2) must be between the final lower and upper targets + const FINAL_LOWER_TARGET = fp(0.2e5); + const FINAL_UPPER_TARGET = fp(5e5); + + const PROTOCOL_ID = 3; + + enum AttackType { + SET_TARGETS, + SET_SWAP_FEE, + } + + let pool: Contract; + let poolId: string; + + before('run task', async () => { + task = new Task('20230213-yearn-linear-pool', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('YearnLinearPoolFactory'); + }); + + before('load signers', async () => { + [, owner, other] = await getSigners(); + + holder = await impersonate(USDC_HOLDER, fp(100)); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + + mainToken = await task.instanceAt('IERC20', USDC); + await mainToken.connect(holder).approve(vault.address, MAX_UINT256); + }); + + enum LinearPoolState { + BALANCED, + MAIN_EXCESS, + MAIN_LACK, + } + + function itRebalancesThePool(expectedState: LinearPoolState) { + it('rebalance the pool', async () => { + const { lowerTarget, upperTarget } = await pool.getTargets(); + + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + + let fees; + if (scaledCash.gt(upperTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_EXCESS); + + const excess = scaledCash.sub(upperTarget); + fees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else if (scaledCash.lt(lowerTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_LACK); + + const lack = lowerTarget.sub(scaledCash); + fees = lack.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else { + expect(expectedState).to.equal(LinearPoolState.BALANCED); + + fees = 0; + } + + const initialRecipientMainBalance = await mainToken.balanceOf(other.address); + + if (expectedState != LinearPoolState.BALANCED) { + await rebalancer.connect(holder).rebalance(other.address); + } else { + await rebalancer.connect(holder).rebalanceWithExtraMain(other.address, 5); + } + const finalRecipientMainBalance = await mainToken.balanceOf(other.address); + + if (fees > 0) { + // The recipient of the rebalance call should get the fees that were collected (though there's some rounding + // error in the main-wrapped conversion). + expect(finalRecipientMainBalance.sub(initialRecipientMainBalance)).to.be.almostEqual( + fees.div(USDC_SCALING), + 0.0001 + ); + } else { + // The recipient of the rebalance call will get any extra main tokens that were not utilized. + expect(finalRecipientMainBalance).to.be.almostEqual(initialRecipientMainBalance, 0.0001); + } + + const mainInfo = await vault.getPoolTokenInfo(poolId, USDC); + + const expectedMainBalance = lowerTarget.add(upperTarget).div(2); + expect(mainInfo.cash.mul(USDC_SCALING)).to.equal(expectedMainBalance); + expect(mainInfo.managed).to.equal(0); + }); + } + + describe('create and check getters', () => { + it('deploy a linear pool', async () => { + const tx = await factory.create( + '', + '', + USDC, + yvUSDC, + INITIAL_UPPER_TARGET, + SWAP_FEE_PERCENTAGE, + owner.address, + PROTOCOL_ID + ); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await task.instanceAt('YearnLinearPool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + const { assetManager } = await vault.getPoolTokenInfo(poolId, USDC); + rebalancer = await task.instanceAt('YearnLinearPoolRebalancer', assetManager); + }); + + it('check factory version', async () => { + const expectedFactoryVersion = { + name: 'YearnLinearPoolFactory', + version: 1, + deployment: '20230213-yearn-linear-pool', + }; + + expect(await factory.version()).to.equal(JSON.stringify(expectedFactoryVersion)); + }); + + it('check pool version', async () => { + const expectedPoolVersion = { + name: 'YearnLinearPool', + version: 1, + deployment: '20230213-yearn-linear-pool', + }; + + expect(await pool.version()).to.equal(JSON.stringify(expectedPoolVersion)); + }); + }); + + describe('join, and rebalance', () => { + it('join the pool', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const joinAmount = INITIAL_UPPER_TARGET.mul(2).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: USDC, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert join amount - some fees will be collected as we're going over the upper target. + const excess = joinAmount.mul(USDC_SCALING).sub(INITIAL_UPPER_TARGET); + const joinCollectedFees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + + const expectedBPT = joinAmount.mul(USDC_SCALING).sub(joinCollectedFees); + expect(await pool.balanceOf(holder.address)).to.equal(expectedBPT); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + + it('set final targets', async () => { + await expect(pool.connect(owner).setTargets(FINAL_LOWER_TARGET, FINAL_UPPER_TARGET)).to.not.be.reverted; + }); + }); + + describe('generate excess of main token and rebalance', () => { + before('approve the rebalancer', async () => { + await mainToken.connect(holder).approve(rebalancer.address, MAX_UINT256); // To send extra main on rebalance + }); + + it('deposit main tokens', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const { upperTarget } = await pool.getTargets(); + const joinAmount = upperTarget.mul(5).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: USDC, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + }); + + describe('generate lack of main token and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to withdraw enough man token to bring the Pool below its lower target, which will let us later + // rebalance. + + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_LACK); + }); + + describe('join below upper target and rebalance', () => { + it('deposit main tokens', async () => { + // We're going to join with few tokens, causing the Pool to not reach its upper target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const joinAmount = midpoint.div(100).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: USDC, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('exit above lower target and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to exit with few tokens, causing for the Pool to not reach its lower target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const exitAmount = midpoint.div(100).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalance repeatedly', () => { + itRebalancesThePool(LinearPoolState.BALANCED); + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalancer query protection', async () => { + it('reverts with a malicious lending pool', async () => { + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + + // Using MockYearnTokenVault from task 20230409-yearn-linear-pool-v2 + await setCode(yvUSDC, getArtifact('MockYearnTokenVault').deployedBytecode); + const mockYearnTokenVault = await instanceAt('MockYearnTokenVault', yvUSDC); + + await mockYearnTokenVault.setRevertType(2); // Type 2 is malicious swap query revert + await expect(rebalancer.rebalance(other.address)).to.be.revertedWith('BAL#357'); // MALICIOUS_QUERY_REVERT + }); + }); + + describe('read-only reentrancy protection', () => { + let attacker: Contract; + + before('deploy attacker', async () => { + // Using Reentrancy Attacker from Aave Fork Test (task 20230206-aave-rebalanced-linear-pool-v4) + attacker = await deploy('ReadOnlyReentrancyAttackerAaveLP', [vault.address]); + }); + + async function performAttack(attackType: AttackType, ethAmount: BigNumber, expectRevert: boolean) { + // To trigger the callback and revert, send more than we need for the deposit + // If we send just enough, there will be no "extra" ETH, and it won't trigger the callback and attack + const amountToSend = expectRevert ? ethAmount.add(1) : ethAmount; + + const attack = attacker.startAttack(pool.address, attackType, ethAmount, { value: amountToSend }); + if (expectRevert) { + await expect(attack).to.be.revertedWith('BAL#420'); + } else { + await expect(attack).to.not.be.reverted; + } + } + + function itPerformsAttack(expectRevert: boolean) { + const action = expectRevert ? 'triggers' : 'does not trigger'; + + context('set targets', () => { + it(`${action} the set targets attack`, async () => { + await performAttack(AttackType.SET_TARGETS, fp(1), expectRevert); + }); + }); + + context('set swap fee', () => { + it(`${action} the set swap fee attack`, async () => { + await performAttack(AttackType.SET_SWAP_FEE, fp(1), expectRevert); + }); + }); + } + + context('when exactly enough ETH is sent', () => { + itPerformsAttack(false); + }); + + context('when too much ETH is sent', () => { + itPerformsAttack(true); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/artifact/SiloLinearPool.json b/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/artifact/SiloLinearPool.json new file mode 100644 index 0000000..f2a1000 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/artifact/SiloLinearPool.json @@ -0,0 +1,1245 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SiloLinearPool", + "sourceName": "contracts/silo-linear-pool/SiloLinearPool.sol", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "address", + "name": "assetManager", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + } + ], + "internalType": "struct SiloLinearPool.ConstructorArgs", + "name": "args", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "paused", + "type": "bool" + } + ], + "name": "PausedStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "RecoveryModeStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + } + ], + "name": "SwapFeePercentageChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lowerTarget", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + } + ], + "name": "TargetsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "enableRecoveryMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBptIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMainIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMainToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getNextNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPausedState", + "outputs": [ + { + "internalType": "bool", + "name": "paused", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "pauseWindowEndTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodEndTime", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeesCollector", + "outputs": [ + { + "internalType": "contract IProtocolFeesCollector", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getScalingFactors", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSwapFeePercentage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTargets", + "outputs": [ + { + "internalType": "uint256", + "name": "lowerTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVirtualSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWrappedTokenRate", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "inRecoveryMode", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onExitPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "dueProtocolFees", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "onJoinPool", + "outputs": [ + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "dueProtocolFees", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IERC20", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IPoolSwapStructs.SwapRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "indexIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "indexOut", + "type": "uint256" + } + ], + "name": "onSwap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "enum IVault.SwapKind", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "contract IERC20", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "poolId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "lastChangeBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "internalType": "struct IPoolSwapStructs.SwapRequest", + "name": "request", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "balanceTokenIn", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balanceTokenOut", + "type": "uint256" + } + ], + "name": "onSwap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryExit", + "outputs": [ + { + "internalType": "uint256", + "name": "bptIn", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsOut", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "userData", + "type": "bytes" + } + ], + "name": "queryJoin", + "outputs": [ + { + "internalType": "uint256", + "name": "bptOut", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "amountsIn", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + } + ], + "name": "setSwapFeePercentage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newLowerTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newUpperTarget", + "type": "uint256" + } + ], + "name": "setTargets", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6102c06040523480156200001257600080fd5b506040516200603338038062006033833981016040819052620000359162000df5565b6101608101518151602083015160408401516060850151608086015160c0870151620000618862000480565b60e08901516101008a01516101208b01516101408c01518a6200009e8160006200008c8c8c62000509565b89620005ba60201b620014231760201c565b8b8b86868686838387878b86336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000ed92919062000c7e565b5080516200010390600490602084019062000c7e565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001829050630163f50083111561019462000788565b620001966276a70082111561019562000788565b4291909101610140819052016101605260601b6001600160601b031916610180526101a08690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000db6565b6001600160a01b03166101c0816001600160a01b031660601b8152505050505050505050876001600160a01b03166101e0816001600160a01b031660601b81525050866001600160a01b0316610200816001600160a01b031660601b81525050866001600160a01b0316886001600160a01b031610620002bb576002620002be565b60015b60ff16610220526001600160a01b0380881690891610620002e1576001620002e4565b60025b60ff1661024052620002f6886200079d565b6102605262000305876200079d565b6102805260006200031889828962000849565b620003238562000943565b50508a51620003469a506009995060208c019850965062000c7e95505050505050565b5050600081608001519050620003f1816001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038f57600080fd5b505afa158015620003a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ca919062000db6565b6001600160a01b031683606001516001600160a01b0316146102086200078860201b60201c565b806001600160a01b031663eb3beb296040518163ffffffff1660e01b815260040160206040518083038186803b1580156200042b57600080fd5b505afa15801562000440573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000466919062000db6565b60601b6001600160601b0319166102a05250620010729050565b6040805160028082526060808301845292839291906020830190803683370190505090508260a0015181600081518110620004b757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260a0015181600181518110620004ea57fe5b6001600160a01b03909216602092830291909101909101529050919050565b60408051600280825260608281019093526001600160a01b0384811690861610918391816020016020820280368337019050509050816200054b57836200054d565b845b816000815181106200055b57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050816200058857846200058a565b835b816001815181106200059857fe5b6001600160a01b03909216602092830291909101909101529150505b92915050565b6000620005d283620009d260201b620015d81760201c565b606083516001016001600160401b0381118015620005ef57600080fd5b506040519080825280602002602001820160405280156200061a578160200160208202803683370190505b50905030816000815181106200062c57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156200069f578481815181106200066657fe5b60200260200101518282600101815181106200067e57fe5b6001600160a01b03909216602092830291909101909101526001016200064f565b50606083516001016001600160401b0381118015620006bd57600080fd5b50604051908082528060200260200182016040528015620006e8578160200160208202803683370190505b509050600081600081518110620006fb57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156200076e578481815181106200073557fe5b60200260200101518282600101815181106200074d57fe5b6001600160a01b03909216602092830291909101909101526001016200071e565b506200077d87878484620009de565b979650505050505050565b816200079957620007998162000ad8565b5050565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620007da57600080fd5b505afa158015620007ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000815919062000f4c565b60ff16905060006200083460128362000aed60201b620015e61760201c565b600a0a670de0b6b3a764000002949350505050565b6200085a8183111561014c62000788565b620008776b0de0b6b39983494c589c000082111561014d62000788565b62000891670de0b6b3a7640000825b061561016162000788565b620008a5670de0b6b3a76400008362000886565b620008f4670de0b6b3a7640000820460406020620008de670de0b6b3a764000087600854919004602080620015fc62000b05821b17811c565b62000b0560201b620015fc17909392919060201c565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906200093690859085906200101b565b60405180910390a2505050565b6200095864e8d4a5100082101560cb62000788565b6200097067016345785d8a000082111560ca62000788565b620009928160c0603f60085462000b0560201b620015fc17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90620009c790839062001012565b60405180910390a150565b80620007998162000b2a565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040162000a0f919062000ffd565b602060405180830381600087803b15801562000a2a57600080fd5b505af115801562000a3f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a65919062000ddc565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000a9a9084908890889060040162000f6f565b600060405180830381600087803b15801562000ab557600080fd5b505af115801562000aca573d6000803e3d6000fd5b509298975050505050505050565b62000aea816210905360ea1b62000bb6565b50565b600062000aff83831115600162000788565b50900390565b600062000b1484848462000c17565b506001901b60001901811b1992909216911b1790565b60028151101562000b3b5762000aea565b60008160008151811062000b4b57fe5b602002602001015190506000600190505b825181101562000bb157600083828151811062000b7557fe5b6020026020010151905062000ba6816001600160a01b0316846001600160a01b03161060656200078860201b60201c565b915060010162000b5c565b505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b62000c286101008310606462000788565b62000c616001821015801562000c59575062000c5560ff846101000362000c7260201b6200161f1760201c565b8211155b606462000788565b62000bb183821c156101b462000788565b80820390821102900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000cc157805160ff191683800117855562000cf1565b8280016001018555821562000cf1579182015b8281111562000cf157825182559160200191906001019062000cd4565b5062000cff92915062000d03565b5090565b5b8082111562000cff576000815560010162000d04565b8051620005b4816200105c565b600082601f83011262000d38578081fd5b81516001600160401b0381111562000d4e578182fd5b602062000d64601f8301601f1916820162001029565b9250818352848183860101111562000d7b57600080fd5b60005b8281101562000d9b57848101820151848201830152810162000d7e565b8281111562000dad5760008284860101525b50505092915050565b60006020828403121562000dc8578081fd5b815162000dd5816200105c565b9392505050565b60006020828403121562000dee578081fd5b5051919050565b60006020828403121562000e07578081fd5b81516001600160401b038082111562000e1e578283fd5b818401915061018080838703121562000e35578384fd5b62000e408162001029565b905062000e4e868462000d1a565b815260208301518281111562000e62578485fd5b62000e708782860162000d27565b60208301525060408301518281111562000e88578485fd5b62000e968782860162000d27565b60408301525062000eab866060850162000d1a565b606082015262000ebf866080850162000d1a565b608082015262000ed38660a0850162000d1a565b60a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014062000f158782860162000d1a565b90820152610160838101518381111562000f2d578586fd5b62000f3b8882870162000d27565b918301919091525095945050505050565b60006020828403121562000f5e578081fd5b815160ff8116811462000dd5578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000fbb5762000fa8855162001050565b8352938301939183019160010162000f93565b505084810360408601528551808252908201925081860190845b8181101562000aca5762000fea835162001050565b8552938301939183019160010162000fd5565b60208101600383106200100c57fe5b91905290565b90815260200190565b918252602082015260400190565b6040518181016001600160401b03811182821017156200104857600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b038116811462000aea57600080fd5b60805160a05160c05160e0516101005160601c6101205160601c61014051610160516101805160601c6101a0516101c05160601c6101e05160601c6102005160601c610220516102405161026051610280516102a05160601c614e276200120c600039806118455250806107f352508061078f5280612aa7525080610717528061081b5280610c505280612f2152806130aa52806131e252806132ed528061346a52806135a25250806107b152806109bb5280610c165280612eed528061302f5280613076528061316c52806131ae52806132b952806133f45280613436528061352c528061356e5250806113f7528061264452806127105280612acd5280612ea25280612fbb528061326f52806133805250806109df52806110ed5280611a075280611aa652806125fb52806126c75280612a6c5280612e635280612f6552806130f85280613230528061333152806134b85250806111cb5250806109485250508061181c5250806117f8525080610fd0525080610fac525080610f5c52508061233852508061237a5250806123595250614e276000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e36600461471d565b610608565b6040516103509190614aee565b60405180910390f35b610361610668565b6040516103509190614d32565b61038161037c366004614412565b6106fe565b6040516103509190614acb565b610343610715565b610343610739565b6103a661073f565b60405161035093929190614ad6565b6103bd610768565b6040516103509190614a93565b6103816103d8366004614362565b610876565b6103e56108ec565b6040516103509190614d6c565b6103436108f5565b61040d6104083660046147da565b610904565b005b610343610946565b610381610425366004614412565b61096a565b61040d6109a5565b6103436109b9565b6104426109dd565b60405161035091906149aa565b61040d610a01565b610361610a55565b610343610ab6565b61047a610475366004614541565b610ac9565b604051610350929190614d45565b610490610ae7565b604051610350929190614d5e565b610343610b25565b6103436104b436600461430e565b610cba565b6104cc6104c7366004614541565b610cd9565b604051610350929190614aa6565b6103436104e836600461430e565b610d9b565b61040d610da6565b610343610f41565b61040d610f46565b6103436105133660046145e4565b610f58565b610442610faa565b610442610fce565b61034361053636600461430e565b610ff2565b61036161100d565b61034361055136600461478e565b61106e565b61040d6105643660046147f2565b6110a7565b610381610577366004614412565b611119565b61038161058a366004614412565b611157565b610442611164565b61038161116e565b61040d61117f565b6104426111c9565b61040d6105bd3660046143a2565b6111ed565b6104cc6105d0366004614541565b61126e565b6103436105e336600461432a565b611305565b610343611342565b6103436113eb565b6104426113f5565b610343611419565b6000846080015161063561061a610fce565b6001600160a01b0316336001600160a01b03161460cd61162b565b61064a610640610946565b82146101f461162b565b610652611639565b61065e8686868661164c565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050905090565b600061070b338484611771565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074c6117d9565b1592506107576117f6565b915061076161181a565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107da57fe5b6020026020010181815250506108186107f161183e565b7f000000000000000000000000000000000000000000000000000000000000000090611871565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084457fe5b602002602001018181525050670de0b6b3a76400008160008151811061086657fe5b6020908102919091010152905090565b6000806108838533611305565b90506108a7336001600160a01b038716148061089f5750838210155b61019e61162b565b6108b28585856118a9565b336001600160a01b038616148015906108cd57506000198114155b156108df576108df8533858403611771565b60019150505b9392505050565b60055460ff1690565b60006108ff6113eb565b905090565b61090c611989565b6109146119d2565b60008061091f610ae7565b9150915061093861093083836119e2565b61014f61162b565b61094183611ae9565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070b9185906109a09086611b61565b611771565b6109ad611989565b6109b76000611b73565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a09611989565b610a11611c04565b610a1b6001611c18565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4b9190614acb565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906108ff9060c0603f611c5a565b60006060610adb888785611c69611c80565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0482602080611c5a565b029250670de0b6b3a7640000610b1d8260406020611c5a565b029150509091565b600080610b30610946565b90506060610b3c610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b679190614aee565b60006040518083038186803b158015610b7f57600080fd5b505afa158015610b93573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbb919081019061443d565b50915050610bd081610bcb610768565b611de7565b600080610bdb610ae7565b91509150610be7614009565b6040518060600160405280610bfa610ab6565b81526020018481526020018381525090506000610c86610c4d867f000000000000000000000000000000000000000000000000000000000000000081518110610c3f57fe5b602002602001015184611e50565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7957fe5b6020026020010151611eb1565b9050610caf610ca886600081518110610c9b57fe5b6020026020010151611ebd565b8290611ed1565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce861061a610fce565b610cf3610640610946565b6000610cfe85611f28565b15610d2657610d0b611f57565b610d1d88610d17610739565b87611f6a565b94509050610d3e565b610d2e611639565b610d398a8987611c69565b945090505b610d488a82612060565b835167ffffffffffffffff81118015610d6057600080fd5b50604051908082528060200260200182016040528015610d8a578160200160208202803683370190505b509250505097509795505050505050565b600061070f82610ff2565b6000610db0610946565b90506060610dbc610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de79190614aee565b60006040518083038186803b158015610dff57600080fd5b505afa158015610e13573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3b919081019061443d565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e7f57fe5b602002602001018181525050610e9361402a565b6040518060800160405280610ea78561206a565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed8610fce565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f099493929190614b16565b600060405180830381600087803b158015610f2357600080fd5b505af1158015610f37573d6000803e3d6000fd5b5050505050505050565b600090565b610f4e611989565b6109b76001611b73565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8d929190614934565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108061061a610fce565b61108b610640610946565b611093611639565b61109e85858561206d565b95945050505050565b6110af611989565b6110b76119d2565b6000806110c2610ae7565b915091506110d361093083836119e2565b6110e86110e085856119e2565b61015761162b565b6111137f0000000000000000000000000000000000000000000000000000000000000000858561207a565b50505050565b6000806111263385611305565b90508083106111405761113b33856000611771565b61114d565b61114d3385858403611771565b5060019392505050565b600061070b3384846118a9565b60006108ff612150565b6008546000906108ff9060ff6121ca565b611187611989565b61118f611f57565b6111996000611c18565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4b9190614acb565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121c8c610ff2565b8960405160200161123296959493929190614c03565b604051602081830303815290604052805190602001209050611263888261125a8787876121d1565b886101f8612210565b610f37888888611771565b6060808861127d61061a610fce565b611288610640610946565b6000611292611639565b61129a610739565b6112ec576112a98a8a87612267565b945090506112c26112b8610f41565b82101560cc61162b565b6112d460006112cf610f41565b6122ff565b6112e7896112e0610f41565b83036122ff565b610d48565b6112f78a8987611c69565b94509050610d4889826122ff565b600061130f610fce565b6001600160a01b0316826001600160a01b03161415611331575060001961070f565b61133b8383612309565b905061070f565b600080600061134f610fce565b6001600160a01b031663b05f8e48611365610946565b306040518363ffffffff1660e01b8152600401611383929190614ce9565b60806040518083038186803b15801561139b57600080fd5b505afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190614813565b5050915091506113e4818301611ebd565b9250505090565b60006108ff612334565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff61183e565b600061142e836115d8565b6060835160010167ffffffffffffffff8111801561144b57600080fd5b50604051908082528060200260200182016040528015611475578160200160208202803683370190505b509050308160008151811061148657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f5578481815181106114be57fe5b60200260200101518282600101815181106114d557fe5b6001600160a01b03909216602092830291909101909101526001016114a9565b506060835160010167ffffffffffffffff8111801561151357600080fd5b5060405190808252806020026020018201604052801561153d578160200160208202803683370190505b50905060008160008151811061154f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115be5784818151811061158757fe5b602002602001015182826001018151811061159e57fe5b6001600160a01b0390921660209283029190910190910152600101611572565b506115cb878784846123d1565b925050505b949350505050565b806115e2816124da565b5050565b60006115f683831115600161162b565b50900390565b6000611609848484612553565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e2576115e281612599565b6109b76116446117d9565b61019261162b565b60006116686003841080156116615750600383105b606461162b565b6060611672610768565b905061167e8582611de7565b600080611689610ae7565b91509150611695614009565b60405180606001604052806116a8610ab6565b81526020810185905260400183905290506000895160018111156116c857fe5b141561172c576116ef89606001518589815181106116e257fe5b60200260200101516125c3565b60608a015260006117018a8a846125cf565b90506117208186898151811061171357fe5b6020026020010151612696565b955050505050506115d0565b61174089606001518588815181106116e257fe5b60608a015260006117528a8a846126a2565b905061172081868a8151811061176457fe5b6020026020010151612757565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cc908590614aee565b60405180910390a3505050565b60006117e361181a565b4211806108ff57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff7f000000000000000000000000000000000000000000000000000000000000000061186c6109dd565b612763565b600082820261189584158061188e57508385838161188b57fe5b04145b600361162b565b670de0b6b3a7640000815b04949350505050565b6118c06001600160a01b038416151561019861162b565b6118d76001600160a01b038316151561019961162b565b6118e2838383610941565b6001600160a01b03831660009081526020819052604090205461190890826101a06128b7565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119379082611b61565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cc908590614aee565b60006119b86000357fffffffff0000000000000000000000000000000000000000000000000000000016610f58565b90506119cf6119c782336128cd565b61019161162b565b50565b6109b76119dd610fce565b6129b6565b60008060006119ef610fce565b6001600160a01b031663b05f8e48611a05610946565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611a43929190614ce9565b60806040518083038186803b158015611a5b57600080fd5b505afa158015611a6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a939190614813565b5050915091506000611acf828401611aca7f0000000000000000000000000000000000000000000000000000000000000000612a68565b6125c3565b905085811015801561065e57509390931115949350505050565b611afc64e8d4a5100082101560cb61162b565b611b1267016345785d8a000082111560ca61162b565b600854611b23908260c0603f6115fc565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611b56908390614aee565b60405180910390a150565b60008282016108e5848210158361162b565b8015611b9357611b8e611b846117f6565b421061019361162b565b611ba8565b611ba8611b9e61181a565b42106101a961162b565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611b56908390614acb565b6109b7611c0f61116e565b156101b561162b565b600854611c27908260ff612b42565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611b56908390614acb565b6001901b6000190191901c1690565b60006060611c786103e6612599565b935093915050565b333014611d6f576000306001600160a01b0316600036604051611ca4929190614964565b6000604051808303816000865af19150503d8060008114611ce1576040519150601f19603f3d011682016040523d82523d6000602084013e611ce6565b606091505b505090508060008114611cf557fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611d51573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611d828686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611df6908290612b51565b60005b8181101561111357611e31848281518110611e1057fe5b6020026020010151848381518110611e2457fe5b6020026020010151611871565b848281518110611e3d57fe5b6020908102919091010152600101611df9565b60008160200151831015611e895781516020830151600091611e759186900390611871565b9050611e8184826115e6565b91505061070f565b81604001518311611e9b57508161070f565b81516040830151600091611e7591860390611871565b60006108e58383611b61565b600061070f82611ecb610739565b906115e6565b6000611ee0821515600461162b565b670de0b6b3a76400008302611f12841580611f0b5750670de0b6b3a7640000858381611f0857fe5b04145b600561162b565b6001836001830304018115150291505092915050565b600080825111801561070f575060ff801682806020019051810190611f4d9190614853565b60ff161492915050565b6109b7611f6261116e565b6101b661162b565b600060606000611f7984612b5e565b90506060865167ffffffffffffffff81118015611f9557600080fd5b50604051908082528060200260200182016040528015611fbf578160200160208202803683370190505b5090506000611fcc610f41565b90506000611fdf898381518110610c9b57fe5b90506000611fed8583612b74565b905060005b8a5181101561204f578381141561200a576000612030565b612030828c838151811061201a57fe5b602002602001015161187190919063ffffffff16565b85828151811061203c57fe5b6020908102919091010152600101611ff2565b509399929850919650505050505050565b6115e28282612bb4565b90565b60006108e56103e6612599565b6120898183111561014c61162b565b6120a46b0de0b6b39983494c589c000082111561014d61162b565b6120bc670de0b6b3a7640000825b061561016161162b565b6120ce670de0b6b3a7640000836120b2565b612103670de0b6b3a76400008204604060206120fb670de0b6b3a7640000876008549190046020806115fc565b9291906115fc565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121439085908590614d5e565b60405180910390a2505050565b600061215a610fce565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561219257600080fd5b505afa1580156121a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ff9190614624565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b600061221b85612c80565b905061223161222b878387612c9c565b8361162b565b612240428410156101b861162b565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606122826001600160a01b038616301461015661162b565b6122996001600160a01b038516301461015661162b565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff816000815181106122e857fe5b602090810291909101015290969095509350505050565b6115e28282612d4a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006123a1612ddd565b306040516020016123b6959493929190614cbd565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016124009190614d1e565b602060405180830381600087803b15801561241a57600080fd5b505af115801561242e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124529190614529565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d29061249e90849088908890600401614c37565b600060405180830381600087803b1580156124b857600080fd5b505af11580156124cc573d6000803e3d6000fd5b509298975050505050505050565b6002815110156124e9576119cf565b6000816000815181106124f857fe5b602002602001015190506000600190505b825181101561094157600083828151811061252057fe5b60200260200101519050612549816001600160a01b0316846001600160a01b031610606561162b565b9150600101612509565b6125626101008310606461162b565b61258a60018210158015611661575061258060ff846101000361161f565b821115606461162b565b61094183821c156101b461162b565b6119cf817f42414c0000000000000000000000000000000000000000000000000000000000612de1565b60006108e58383611871565b60208301516000906001600160a01b03163014156125f9576125f2848484612e5c565b90506108e5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612642576125f2848484612fb4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b0316141561268b576125f28484846130f1565b6108e5610135612599565b60006108e58383612b74565b60408301516000906001600160a01b03163014156126c5576125f2848484613229565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b0316141561270e576125f2848484613379565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b0316141561268b576125f28484846134b1565b60006108e58383611ed1565b600061276d614054565b61277784846135e9565b90506127816140a5565b61278b85856136c1565b90506000816040015167ffffffffffffffff169050600083606001519050600084600001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127e857600080fd5b505afa1580156127fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128209190614529565b90504283146128a15760006128358989613753565b905060006128428a613847565b90506000866020015190506000806000612869868c60a0015161187190919063ffffffff16565b9050670de0b6b3a764000085820204925083838501101561288957831992505b82810391506128988883611b61565b97505050505050505b6128ab8282612b74565b98975050505050505050565b60006128c6848411158361162b565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128ec610faa565b6001600160a01b031614158015612907575061290783613910565b1561292f57612914610faa565b6001600160a01b0316336001600160a01b031614905061070f565b612937612150565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161296693929190614af7565b60206040518083038186803b15801561297e57600080fd5b505afa158015612992573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b9190614509565b604080516000808252602082019092526060916129e9565b6129d66140ca565b8152602001906001900390816129ce5790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e8490612a329084906004016149fc565b600060405180830381600087803b158015612a4c57600080fd5b505af1158015612a60573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612acb57507f0000000000000000000000000000000000000000000000000000000000000000610cd4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612b1757612b106107f161183e565b9050610cd4565b6001600160a01b038216301415612b375750670de0b6b3a7640000610cd4565b610cd4610135612599565b6001811b1992909216911b1790565b6115e2818314606761162b565b6000818060200190518101906108e5919061486f565b6000612b83821515600461162b565b670de0b6b3a76400008302612bab841580611f0b5750670de0b6b3a7640000858381611f0857fe5b8281816118a057fe5b612bcb6001600160a01b038316151561019b61162b565b612bd782600083610941565b6001600160a01b038216600090815260208190526040902054612bfd90826101b26128b7565b6001600160a01b038316600090815260208190526040902055612c30612c2b82612c25610739565b90613974565b613982565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c749190614aee565b60405180910390a35050565b6000612c8a612334565b82604051602001610f8d929190614974565b6000612cae82516041146101b961162b565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612ce7908990859088908890614d00565b6020604051602081039080840390855afa158015612d09573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906128ab5750876001600160a01b0316816001600160a01b03161498975050505050505050565b612d5660008383610941565b612d6b612c2b82612d65610739565b90611b61565b6001600160a01b038216600090815260208190526040902054612d8e9082611b61565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c74908590614aee565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612ee27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eda57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162b565b6115d08460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f1657fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f4a57fe5b6020026020010151612f6287600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612fa857613987612fac565b6139e55b63ffffffff16565b60006130107f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eda575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b0316301461306b576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061305857fe5b602002602001015184613a4e565b6115d0565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061309f57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130d357fe5b60200260200101516130eb87600081518110610c9b57fe5b86613a7e565b600061314d7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eda575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b031630146131a3576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061319557fe5b602002602001015184613ae4565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131d757fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061320b57fe5b602002602001015161322387600081518110610c9b57fe5b86613b24565b60006132ae7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eda57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162b565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132e257fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061331657fe5b602002602001015161332e87600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461337457613b8b612fac565b613be2565b60006133d57f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eda575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b0316301461342b576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061341d57fe5b602002602001015184613c4c565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061345f57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061349357fe5b60200260200101516134ab87600081518110610c9b57fe5b86613c76565b600061350d7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eda575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b03163014613563576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061355557fe5b602002602001015184613cc5565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061359757fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106135cb57fe5b60200260200101516135e387600081518110610c9b57fe5b86613cfa565b6135f1614054565b6040517fbf2730410000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063bf273041906136369085906004016149aa565b60c06040518083038186803b15801561364e57600080fd5b505afa92505050801561367e575060408051601f3d908101601f1916820190925261367b918101906146a5565b60015b61133b573d8080156136ac576040519150601f19603f3d011682016040523d82523d6000602084013e6136b1565b606091505b506136bb81613d4e565b5061070f565b6136c96140a5565b6040517ffb2557030000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063fb2557039061370e9085906004016149aa565b60806040518083038186803b15801561372657600080fd5b505afa92505050801561367e575060408051601f3d908101601f1916820190925261367b91810190614640565b6000806137608484613dd5565b6040517fb1e017650000000000000000000000000000000000000000000000000000000081529091506001600160a01b0382169063b1e01765906137ac908790879042906004016149d8565b60206040518083038186803b1580156137c457600080fd5b505afa9250505080156137f4575060408051601f3d908101601f191682019092526137f191810190614529565b60015b613837573d808015613822576040519150601f19603f3d011682016040523d82523d6000602084013e613827565b606091505b5061383181613d4e565b50613840565b915061070f9050565b5092915050565b60008061385383613e70565b9050806001600160a01b03166325ed3d446040518163ffffffff1660e01b815260040160206040518083038186803b15801561388e57600080fd5b505afa9250505080156138be575060408051601f3d908101601f191682019092526138bb91810190614529565b60015b613901573d8080156138ec576040519150601f19603f3d011682016040523d82523d6000602084013e6138f1565b606091505b506138fb81613d4e565b5061390a565b9150610cd49050565b50919050565b600061393b7f9f11080e00000000000000000000000000000000000000000000000000000000610f58565b82148061070f575061396c7f38e9922e00000000000000000000000000000000000000000000000000000000610f58565b909114919050565b60006108e5838360016128b7565b600255565b6000806139948684611e50565b905060006139a28287611eb1565b905060006139b0868a6115e6565b905060006139cb84611ecb6139c58587613f1e565b8a613f38565b90506139d788826115e6565b9a9950505050505050505050565b6000806139f28684611e50565b90506000613a008287611eb1565b90506000613a17613a11838b613f1e565b87613f59565b90506000613a2584836115e6565b90506000613a338288613f79565b9050613a3f8a826115e6565b9b9a5050505050505050505050565b600080613a5b8484611e50565b90506000613a72613a6c8688611b61565b85611e50565b905061065e81836115e6565b600082613a9657613a8f8683611e50565b905061109e565b6000613aa28684611e50565b90506000613ab3613a6c888a611b61565b90506000613ac182846115e6565b90506000613acf8489611eb1565b90506139d7613ade8884613f1e565b82613f59565b600080613af18484611e50565b90506000613aff82876115e6565b90506000613b0d8286613f79565b9050613b1986826115e6565b979650505050505050565b600082613b3257508461109e565b6000613b3e8684611e50565b90506000613b4c8287611eb1565b90506000613b5a878a611b61565b90506000613b688483611eb1565b90506000613b7f613b798984613f1e565b85613f59565b9050613a3f81896115e6565b600082613b9957508461109e565b6000613ba58684611e50565b90506000613bb38287611eb1565b90506000613bc1868a611b61565b90506000613bd684611ecb6139c58587613f1e565b90506139d781896115e6565b600082613bf357613a8f8683613f79565b6000613bff8684611e50565b90506000613c0d8287611eb1565b90506000613c24613c1e838b613f1e565b87613f38565b90506000613c328483611b61565b90506000613c408288613f79565b9050613a3f818b6115e6565b600080613c598484611e50565b90506000613c6a613a6c86886115e6565b905061065e82826115e6565b600080613c838684611e50565b90506000613c94613a6c888a6115e6565b90506000613ca283836115e6565b90506000613cb08489611eb1565b90506139d7613cbf8884613f1e565b82613f38565b600080613cd28484611e50565b90506000613ce08287611b61565b90506000613cee8286613f79565b9050613b1981876115e6565b600080613d078684611e50565b90506000613d158287611eb1565b90506000613d23878a6115e6565b90506000613d318483611eb1565b90506000613d42613b798984613f1e565b9050613a3f88826115e6565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417613dc9578160208401fd5b506115e2610165612599565b600080613de184613e70565b6040517f48b3eabc0000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906348b3eabc90613e2b90879087906004016149be565b60206040518083038186803b158015613e4357600080fd5b505afa9250505080156137f4575060408051601f3d908101601f191682019092526137f191810190614624565b6000816001600160a01b031663bde127186040518163ffffffff1660e01b815260040160206040518083038186803b158015613eab57600080fd5b505afa925050508015613edb575060408051601f3d908101601f19168201909252613ed891810190614624565b60015b612b10573d808015613f09576040519150601f19603f3d011682016040523d82523d6000602084013e613f0e565b606091505b50613f1881613d4e565b50610cd4565b60008282026108e584158061188e57508385838161188b57fe5b6000613f47821515600461162b565b50811515600019909201046001010290565b6000613f68821515600461162b565b818381613f7157fe5b049392505050565b60008160200151831015613fc257815161133b90613fa090670de0b6b3a764000090611b61565b60208401518451613fbc91613fb59190611871565b8690611b61565b90612b74565b81604001518311613fd457508161070f565b815161133b90613fed90670de0b6b3a7640000906115e6565b60408401518451613fbc916140029190611871565b86906115e6565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040805160808101825260008082526020820181905291810182905290606082015290565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561070f81614dcd565b600082601f830112614115578081fd5b813561412861412382614da1565b614d7a565b81815291506020808301908481018184028601820187101561414957600080fd5b60005b848110156141685781358452928201929082019060010161414c565b505050505092915050565b600082601f830112614183578081fd5b815161419161412382614da1565b8181529150602080830190848101818402860182018710156141b257600080fd5b60005b84811015614168578151845292820192908201906001016141b5565b600082601f8301126141e1578081fd5b813567ffffffffffffffff8111156141f7578182fd5b61420a6020601f19601f84011601614d7a565b915080825283602082850101111561422157600080fd5b8060208401602084013760009082016020015292915050565b80356002811061070f57600080fd5b600061012080838503121561425c578182fd5b61426581614d7a565b915050614272838361423a565b815261428183602084016140fa565b602082015261429383604084016140fa565b6040820152606082013560608201526080820135608082015260a082013560a08201526142c38360c084016140fa565b60c08201526142d58360e084016140fa565b60e08201526101008083013567ffffffffffffffff8111156142f657600080fd5b614302858286016141d1565b82840152505092915050565b60006020828403121561431f578081fd5b81356108e581614dcd565b6000806040838503121561433c578081fd5b823561434781614dcd565b9150602083013561435781614dcd565b809150509250929050565b600080600060608486031215614376578081fd5b833561438181614dcd565b9250602084013561439181614dcd565b929592945050506040919091013590565b600080600080600080600060e0888a0312156143bc578485fd5b87356143c781614dcd565b965060208801356143d781614dcd565b9550604088013594506060880135935060808801356143f581614de2565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215614424578182fd5b823561442f81614dcd565b946020939093013593505050565b600080600060608486031215614451578081fd5b835167ffffffffffffffff80821115614468578283fd5b818601915086601f83011261447b578283fd5b815161448961412382614da1565b80828252602080830192508086018b8283870289010111156144a9578788fd5b8796505b848710156144d45780516144c081614dcd565b8452600196909601959281019281016144ad565b5089015190975093505050808211156144eb578283fd5b506144f886828701614173565b925050604084015190509250925092565b60006020828403121561451a578081fd5b815180151581146108e5578182fd5b60006020828403121561453a578081fd5b5051919050565b600080600080600080600060e0888a03121561455b578081fd5b87359650602088013561456d81614dcd565b9550604088013561457d81614dcd565b9450606088013567ffffffffffffffff80821115614599578283fd5b6145a58b838c01614105565b955060808a0135945060a08a0135935060c08a01359150808211156145c8578283fd5b506145d58a828b016141d1565b91505092959891949750929550565b6000602082840312156145f5578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e5578182fd5b600060208284031215614635578081fd5b81516108e581614dcd565b600060808284031215614651578081fd5b61465b6080614d7a565b8251815260208301516020820152604083015167ffffffffffffffff81168114614683578283fd5b6040820152606083015160038110614699578283fd5b60608201529392505050565b600060c082840312156146b6578081fd5b6146c060c0614d7a565b82516146cb81614dcd565b815260208301516146db81614dcd565b602082015260408301516146ee81614dcd565b80604083015250606083015160608201526080830151608082015260a083015160a08201528091505092915050565b60008060008060808587031215614732578182fd5b843567ffffffffffffffff80821115614749578384fd5b61475588838901614249565b9550602087013591508082111561476a578384fd5b5061477787828801614105565b949794965050505060408301359260600135919050565b6000806000606084860312156147a2578081fd5b833567ffffffffffffffff8111156147b8578182fd5b6147c486828701614249565b9660208601359650604090950135949350505050565b6000602082840312156147eb578081fd5b5035919050565b60008060408385031215614804578182fd5b50508035926020909101359150565b60008060008060808587031215614828578182fd5b845193506020850151925060408501519150606085015161484881614dcd565b939692955090935050565b600060208284031215614864578081fd5b81516108e581614de2565b60008060408385031215614881578182fd5b825161488c81614de2565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156148d8578151875295820195908201906001016148bc565b509495945050505050565b15159052565b60008151808452815b8181101561490e576020818501810151868301820152016148f2565b8181111561491f5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b602080825282518282018190526000919060409081850190868401855b82811015614a86578151805160048110614a2f57fe5b855280870151614a418887018261489c565b508581015186860152606080820151614a5c8288018261489c565b505060809081015190614a718682018361489c565b505060a0939093019290850190600101614a19565b5091979650505050505050565b6000602082526108e560208301846148a9565b600060408252614ab960408301856148a9565b828103602084015261109e81856148a9565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b80831015614b8757614b718451614dc1565b8252928401926001929092019190840190614b5f565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a0870152614bc581856148a9565b935050506040850151818584030160c0860152614be283826148e9565b925050506060840151614bf860e08501826148e3565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b81811015614c7f57614c6d8551614dc1565b83529383019391830191600101614c5b565b505084810360408601528551808252908201925081860190845b818110156124cc57614cab8351614dc1565b85529383019391830191600101614c99565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6020810160038310614d2c57fe5b91905290565b6000602082526108e560208301846148e9565b6000838252604060208301526115d060408301846148a9565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715614d9957600080fd5b604052919050565b600067ffffffffffffffff821115614db7578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146119cf57600080fd5b60ff811681146119cf57600080fdfea26469706673582212209b3da14b073f20ab77b04b8beb3f06232c6f1664501a7726adcbfcc3a968f24864736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e36600461471d565b610608565b6040516103509190614aee565b60405180910390f35b610361610668565b6040516103509190614d32565b61038161037c366004614412565b6106fe565b6040516103509190614acb565b610343610715565b610343610739565b6103a661073f565b60405161035093929190614ad6565b6103bd610768565b6040516103509190614a93565b6103816103d8366004614362565b610876565b6103e56108ec565b6040516103509190614d6c565b6103436108f5565b61040d6104083660046147da565b610904565b005b610343610946565b610381610425366004614412565b61096a565b61040d6109a5565b6103436109b9565b6104426109dd565b60405161035091906149aa565b61040d610a01565b610361610a55565b610343610ab6565b61047a610475366004614541565b610ac9565b604051610350929190614d45565b610490610ae7565b604051610350929190614d5e565b610343610b25565b6103436104b436600461430e565b610cba565b6104cc6104c7366004614541565b610cd9565b604051610350929190614aa6565b6103436104e836600461430e565b610d9b565b61040d610da6565b610343610f41565b61040d610f46565b6103436105133660046145e4565b610f58565b610442610faa565b610442610fce565b61034361053636600461430e565b610ff2565b61036161100d565b61034361055136600461478e565b61106e565b61040d6105643660046147f2565b6110a7565b610381610577366004614412565b611119565b61038161058a366004614412565b611157565b610442611164565b61038161116e565b61040d61117f565b6104426111c9565b61040d6105bd3660046143a2565b6111ed565b6104cc6105d0366004614541565b61126e565b6103436105e336600461432a565b611305565b610343611342565b6103436113eb565b6104426113f5565b610343611419565b6000846080015161063561061a610fce565b6001600160a01b0316336001600160a01b03161460cd61162b565b61064a610640610946565b82146101f461162b565b610652611639565b61065e8686868661164c565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050905090565b600061070b338484611771565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074c6117d9565b1592506107576117f6565b915061076161181a565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107da57fe5b6020026020010181815250506108186107f161183e565b7f000000000000000000000000000000000000000000000000000000000000000090611871565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084457fe5b602002602001018181525050670de0b6b3a76400008160008151811061086657fe5b6020908102919091010152905090565b6000806108838533611305565b90506108a7336001600160a01b038716148061089f5750838210155b61019e61162b565b6108b28585856118a9565b336001600160a01b038616148015906108cd57506000198114155b156108df576108df8533858403611771565b60019150505b9392505050565b60055460ff1690565b60006108ff6113eb565b905090565b61090c611989565b6109146119d2565b60008061091f610ae7565b9150915061093861093083836119e2565b61014f61162b565b61094183611ae9565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070b9185906109a09086611b61565b611771565b6109ad611989565b6109b76000611b73565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a09611989565b610a11611c04565b610a1b6001611c18565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4b9190614acb565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906108ff9060c0603f611c5a565b60006060610adb888785611c69611c80565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0482602080611c5a565b029250670de0b6b3a7640000610b1d8260406020611c5a565b029150509091565b600080610b30610946565b90506060610b3c610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b679190614aee565b60006040518083038186803b158015610b7f57600080fd5b505afa158015610b93573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbb919081019061443d565b50915050610bd081610bcb610768565b611de7565b600080610bdb610ae7565b91509150610be7614009565b6040518060600160405280610bfa610ab6565b81526020018481526020018381525090506000610c86610c4d867f000000000000000000000000000000000000000000000000000000000000000081518110610c3f57fe5b602002602001015184611e50565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7957fe5b6020026020010151611eb1565b9050610caf610ca886600081518110610c9b57fe5b6020026020010151611ebd565b8290611ed1565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce861061a610fce565b610cf3610640610946565b6000610cfe85611f28565b15610d2657610d0b611f57565b610d1d88610d17610739565b87611f6a565b94509050610d3e565b610d2e611639565b610d398a8987611c69565b945090505b610d488a82612060565b835167ffffffffffffffff81118015610d6057600080fd5b50604051908082528060200260200182016040528015610d8a578160200160208202803683370190505b509250505097509795505050505050565b600061070f82610ff2565b6000610db0610946565b90506060610dbc610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de79190614aee565b60006040518083038186803b158015610dff57600080fd5b505afa158015610e13573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3b919081019061443d565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e7f57fe5b602002602001018181525050610e9361402a565b6040518060800160405280610ea78561206a565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed8610fce565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f099493929190614b16565b600060405180830381600087803b158015610f2357600080fd5b505af1158015610f37573d6000803e3d6000fd5b5050505050505050565b600090565b610f4e611989565b6109b76001611b73565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8d929190614934565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108061061a610fce565b61108b610640610946565b611093611639565b61109e85858561206d565b95945050505050565b6110af611989565b6110b76119d2565b6000806110c2610ae7565b915091506110d361093083836119e2565b6110e86110e085856119e2565b61015761162b565b6111137f0000000000000000000000000000000000000000000000000000000000000000858561207a565b50505050565b6000806111263385611305565b90508083106111405761113b33856000611771565b61114d565b61114d3385858403611771565b5060019392505050565b600061070b3384846118a9565b60006108ff612150565b6008546000906108ff9060ff6121ca565b611187611989565b61118f611f57565b6111996000611c18565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4b9190614acb565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121c8c610ff2565b8960405160200161123296959493929190614c03565b604051602081830303815290604052805190602001209050611263888261125a8787876121d1565b886101f8612210565b610f37888888611771565b6060808861127d61061a610fce565b611288610640610946565b6000611292611639565b61129a610739565b6112ec576112a98a8a87612267565b945090506112c26112b8610f41565b82101560cc61162b565b6112d460006112cf610f41565b6122ff565b6112e7896112e0610f41565b83036122ff565b610d48565b6112f78a8987611c69565b94509050610d4889826122ff565b600061130f610fce565b6001600160a01b0316826001600160a01b03161415611331575060001961070f565b61133b8383612309565b905061070f565b600080600061134f610fce565b6001600160a01b031663b05f8e48611365610946565b306040518363ffffffff1660e01b8152600401611383929190614ce9565b60806040518083038186803b15801561139b57600080fd5b505afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190614813565b5050915091506113e4818301611ebd565b9250505090565b60006108ff612334565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff61183e565b600061142e836115d8565b6060835160010167ffffffffffffffff8111801561144b57600080fd5b50604051908082528060200260200182016040528015611475578160200160208202803683370190505b509050308160008151811061148657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f5578481815181106114be57fe5b60200260200101518282600101815181106114d557fe5b6001600160a01b03909216602092830291909101909101526001016114a9565b506060835160010167ffffffffffffffff8111801561151357600080fd5b5060405190808252806020026020018201604052801561153d578160200160208202803683370190505b50905060008160008151811061154f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115be5784818151811061158757fe5b602002602001015182826001018151811061159e57fe5b6001600160a01b0390921660209283029190910190910152600101611572565b506115cb878784846123d1565b925050505b949350505050565b806115e2816124da565b5050565b60006115f683831115600161162b565b50900390565b6000611609848484612553565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e2576115e281612599565b6109b76116446117d9565b61019261162b565b60006116686003841080156116615750600383105b606461162b565b6060611672610768565b905061167e8582611de7565b600080611689610ae7565b91509150611695614009565b60405180606001604052806116a8610ab6565b81526020810185905260400183905290506000895160018111156116c857fe5b141561172c576116ef89606001518589815181106116e257fe5b60200260200101516125c3565b60608a015260006117018a8a846125cf565b90506117208186898151811061171357fe5b6020026020010151612696565b955050505050506115d0565b61174089606001518588815181106116e257fe5b60608a015260006117528a8a846126a2565b905061172081868a8151811061176457fe5b6020026020010151612757565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cc908590614aee565b60405180910390a3505050565b60006117e361181a565b4211806108ff57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff7f000000000000000000000000000000000000000000000000000000000000000061186c6109dd565b612763565b600082820261189584158061188e57508385838161188b57fe5b04145b600361162b565b670de0b6b3a7640000815b04949350505050565b6118c06001600160a01b038416151561019861162b565b6118d76001600160a01b038316151561019961162b565b6118e2838383610941565b6001600160a01b03831660009081526020819052604090205461190890826101a06128b7565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119379082611b61565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cc908590614aee565b60006119b86000357fffffffff0000000000000000000000000000000000000000000000000000000016610f58565b90506119cf6119c782336128cd565b61019161162b565b50565b6109b76119dd610fce565b6129b6565b60008060006119ef610fce565b6001600160a01b031663b05f8e48611a05610946565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611a43929190614ce9565b60806040518083038186803b158015611a5b57600080fd5b505afa158015611a6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a939190614813565b5050915091506000611acf828401611aca7f0000000000000000000000000000000000000000000000000000000000000000612a68565b6125c3565b905085811015801561065e57509390931115949350505050565b611afc64e8d4a5100082101560cb61162b565b611b1267016345785d8a000082111560ca61162b565b600854611b23908260c0603f6115fc565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611b56908390614aee565b60405180910390a150565b60008282016108e5848210158361162b565b8015611b9357611b8e611b846117f6565b421061019361162b565b611ba8565b611ba8611b9e61181a565b42106101a961162b565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611b56908390614acb565b6109b7611c0f61116e565b156101b561162b565b600854611c27908260ff612b42565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611b56908390614acb565b6001901b6000190191901c1690565b60006060611c786103e6612599565b935093915050565b333014611d6f576000306001600160a01b0316600036604051611ca4929190614964565b6000604051808303816000865af19150503d8060008114611ce1576040519150601f19603f3d011682016040523d82523d6000602084013e611ce6565b606091505b505090508060008114611cf557fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611d51573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611d828686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611df6908290612b51565b60005b8181101561111357611e31848281518110611e1057fe5b6020026020010151848381518110611e2457fe5b6020026020010151611871565b848281518110611e3d57fe5b6020908102919091010152600101611df9565b60008160200151831015611e895781516020830151600091611e759186900390611871565b9050611e8184826115e6565b91505061070f565b81604001518311611e9b57508161070f565b81516040830151600091611e7591860390611871565b60006108e58383611b61565b600061070f82611ecb610739565b906115e6565b6000611ee0821515600461162b565b670de0b6b3a76400008302611f12841580611f0b5750670de0b6b3a7640000858381611f0857fe5b04145b600561162b565b6001836001830304018115150291505092915050565b600080825111801561070f575060ff801682806020019051810190611f4d9190614853565b60ff161492915050565b6109b7611f6261116e565b6101b661162b565b600060606000611f7984612b5e565b90506060865167ffffffffffffffff81118015611f9557600080fd5b50604051908082528060200260200182016040528015611fbf578160200160208202803683370190505b5090506000611fcc610f41565b90506000611fdf898381518110610c9b57fe5b90506000611fed8583612b74565b905060005b8a5181101561204f578381141561200a576000612030565b612030828c838151811061201a57fe5b602002602001015161187190919063ffffffff16565b85828151811061203c57fe5b6020908102919091010152600101611ff2565b509399929850919650505050505050565b6115e28282612bb4565b90565b60006108e56103e6612599565b6120898183111561014c61162b565b6120a46b0de0b6b39983494c589c000082111561014d61162b565b6120bc670de0b6b3a7640000825b061561016161162b565b6120ce670de0b6b3a7640000836120b2565b612103670de0b6b3a76400008204604060206120fb670de0b6b3a7640000876008549190046020806115fc565b9291906115fc565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121439085908590614d5e565b60405180910390a2505050565b600061215a610fce565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561219257600080fd5b505afa1580156121a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ff9190614624565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b600061221b85612c80565b905061223161222b878387612c9c565b8361162b565b612240428410156101b861162b565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606122826001600160a01b038616301461015661162b565b6122996001600160a01b038516301461015661162b565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff816000815181106122e857fe5b602090810291909101015290969095509350505050565b6115e28282612d4a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006123a1612ddd565b306040516020016123b6959493929190614cbd565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016124009190614d1e565b602060405180830381600087803b15801561241a57600080fd5b505af115801561242e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124529190614529565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d29061249e90849088908890600401614c37565b600060405180830381600087803b1580156124b857600080fd5b505af11580156124cc573d6000803e3d6000fd5b509298975050505050505050565b6002815110156124e9576119cf565b6000816000815181106124f857fe5b602002602001015190506000600190505b825181101561094157600083828151811061252057fe5b60200260200101519050612549816001600160a01b0316846001600160a01b031610606561162b565b9150600101612509565b6125626101008310606461162b565b61258a60018210158015611661575061258060ff846101000361161f565b821115606461162b565b61094183821c156101b461162b565b6119cf817f42414c0000000000000000000000000000000000000000000000000000000000612de1565b60006108e58383611871565b60208301516000906001600160a01b03163014156125f9576125f2848484612e5c565b90506108e5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612642576125f2848484612fb4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b0316141561268b576125f28484846130f1565b6108e5610135612599565b60006108e58383612b74565b60408301516000906001600160a01b03163014156126c5576125f2848484613229565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b0316141561270e576125f2848484613379565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b0316141561268b576125f28484846134b1565b60006108e58383611ed1565b600061276d614054565b61277784846135e9565b90506127816140a5565b61278b85856136c1565b90506000816040015167ffffffffffffffff169050600083606001519050600084600001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127e857600080fd5b505afa1580156127fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128209190614529565b90504283146128a15760006128358989613753565b905060006128428a613847565b90506000866020015190506000806000612869868c60a0015161187190919063ffffffff16565b9050670de0b6b3a764000085820204925083838501101561288957831992505b82810391506128988883611b61565b97505050505050505b6128ab8282612b74565b98975050505050505050565b60006128c6848411158361162b565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128ec610faa565b6001600160a01b031614158015612907575061290783613910565b1561292f57612914610faa565b6001600160a01b0316336001600160a01b031614905061070f565b612937612150565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161296693929190614af7565b60206040518083038186803b15801561297e57600080fd5b505afa158015612992573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b9190614509565b604080516000808252602082019092526060916129e9565b6129d66140ca565b8152602001906001900390816129ce5790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e8490612a329084906004016149fc565b600060405180830381600087803b158015612a4c57600080fd5b505af1158015612a60573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612acb57507f0000000000000000000000000000000000000000000000000000000000000000610cd4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612b1757612b106107f161183e565b9050610cd4565b6001600160a01b038216301415612b375750670de0b6b3a7640000610cd4565b610cd4610135612599565b6001811b1992909216911b1790565b6115e2818314606761162b565b6000818060200190518101906108e5919061486f565b6000612b83821515600461162b565b670de0b6b3a76400008302612bab841580611f0b5750670de0b6b3a7640000858381611f0857fe5b8281816118a057fe5b612bcb6001600160a01b038316151561019b61162b565b612bd782600083610941565b6001600160a01b038216600090815260208190526040902054612bfd90826101b26128b7565b6001600160a01b038316600090815260208190526040902055612c30612c2b82612c25610739565b90613974565b613982565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c749190614aee565b60405180910390a35050565b6000612c8a612334565b82604051602001610f8d929190614974565b6000612cae82516041146101b961162b565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612ce7908990859088908890614d00565b6020604051602081039080840390855afa158015612d09573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906128ab5750876001600160a01b0316816001600160a01b03161498975050505050505050565b612d5660008383610941565b612d6b612c2b82612d65610739565b90611b61565b6001600160a01b038216600090815260208190526040902054612d8e9082611b61565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c74908590614aee565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612ee27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eda57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162b565b6115d08460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f1657fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f4a57fe5b6020026020010151612f6287600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612fa857613987612fac565b6139e55b63ffffffff16565b60006130107f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eda575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b0316301461306b576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061305857fe5b602002602001015184613a4e565b6115d0565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061309f57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130d357fe5b60200260200101516130eb87600081518110610c9b57fe5b86613a7e565b600061314d7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eda575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b031630146131a3576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061319557fe5b602002602001015184613ae4565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131d757fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061320b57fe5b602002602001015161322387600081518110610c9b57fe5b86613b24565b60006132ae7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eda57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162b565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132e257fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061331657fe5b602002602001015161332e87600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461337457613b8b612fac565b613be2565b60006133d57f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eda575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b0316301461342b576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061341d57fe5b602002602001015184613c4c565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061345f57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061349357fe5b60200260200101516134ab87600081518110610c9b57fe5b86613c76565b600061350d7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eda575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b03163014613563576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061355557fe5b602002602001015184613cc5565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061359757fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106135cb57fe5b60200260200101516135e387600081518110610c9b57fe5b86613cfa565b6135f1614054565b6040517fbf2730410000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063bf273041906136369085906004016149aa565b60c06040518083038186803b15801561364e57600080fd5b505afa92505050801561367e575060408051601f3d908101601f1916820190925261367b918101906146a5565b60015b61133b573d8080156136ac576040519150601f19603f3d011682016040523d82523d6000602084013e6136b1565b606091505b506136bb81613d4e565b5061070f565b6136c96140a5565b6040517ffb2557030000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063fb2557039061370e9085906004016149aa565b60806040518083038186803b15801561372657600080fd5b505afa92505050801561367e575060408051601f3d908101601f1916820190925261367b91810190614640565b6000806137608484613dd5565b6040517fb1e017650000000000000000000000000000000000000000000000000000000081529091506001600160a01b0382169063b1e01765906137ac908790879042906004016149d8565b60206040518083038186803b1580156137c457600080fd5b505afa9250505080156137f4575060408051601f3d908101601f191682019092526137f191810190614529565b60015b613837573d808015613822576040519150601f19603f3d011682016040523d82523d6000602084013e613827565b606091505b5061383181613d4e565b50613840565b915061070f9050565b5092915050565b60008061385383613e70565b9050806001600160a01b03166325ed3d446040518163ffffffff1660e01b815260040160206040518083038186803b15801561388e57600080fd5b505afa9250505080156138be575060408051601f3d908101601f191682019092526138bb91810190614529565b60015b613901573d8080156138ec576040519150601f19603f3d011682016040523d82523d6000602084013e6138f1565b606091505b506138fb81613d4e565b5061390a565b9150610cd49050565b50919050565b600061393b7f9f11080e00000000000000000000000000000000000000000000000000000000610f58565b82148061070f575061396c7f38e9922e00000000000000000000000000000000000000000000000000000000610f58565b909114919050565b60006108e5838360016128b7565b600255565b6000806139948684611e50565b905060006139a28287611eb1565b905060006139b0868a6115e6565b905060006139cb84611ecb6139c58587613f1e565b8a613f38565b90506139d788826115e6565b9a9950505050505050505050565b6000806139f28684611e50565b90506000613a008287611eb1565b90506000613a17613a11838b613f1e565b87613f59565b90506000613a2584836115e6565b90506000613a338288613f79565b9050613a3f8a826115e6565b9b9a5050505050505050505050565b600080613a5b8484611e50565b90506000613a72613a6c8688611b61565b85611e50565b905061065e81836115e6565b600082613a9657613a8f8683611e50565b905061109e565b6000613aa28684611e50565b90506000613ab3613a6c888a611b61565b90506000613ac182846115e6565b90506000613acf8489611eb1565b90506139d7613ade8884613f1e565b82613f59565b600080613af18484611e50565b90506000613aff82876115e6565b90506000613b0d8286613f79565b9050613b1986826115e6565b979650505050505050565b600082613b3257508461109e565b6000613b3e8684611e50565b90506000613b4c8287611eb1565b90506000613b5a878a611b61565b90506000613b688483611eb1565b90506000613b7f613b798984613f1e565b85613f59565b9050613a3f81896115e6565b600082613b9957508461109e565b6000613ba58684611e50565b90506000613bb38287611eb1565b90506000613bc1868a611b61565b90506000613bd684611ecb6139c58587613f1e565b90506139d781896115e6565b600082613bf357613a8f8683613f79565b6000613bff8684611e50565b90506000613c0d8287611eb1565b90506000613c24613c1e838b613f1e565b87613f38565b90506000613c328483611b61565b90506000613c408288613f79565b9050613a3f818b6115e6565b600080613c598484611e50565b90506000613c6a613a6c86886115e6565b905061065e82826115e6565b600080613c838684611e50565b90506000613c94613a6c888a6115e6565b90506000613ca283836115e6565b90506000613cb08489611eb1565b90506139d7613cbf8884613f1e565b82613f38565b600080613cd28484611e50565b90506000613ce08287611b61565b90506000613cee8286613f79565b9050613b1981876115e6565b600080613d078684611e50565b90506000613d158287611eb1565b90506000613d23878a6115e6565b90506000613d318483611eb1565b90506000613d42613b798984613f1e565b9050613a3f88826115e6565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417613dc9578160208401fd5b506115e2610165612599565b600080613de184613e70565b6040517f48b3eabc0000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906348b3eabc90613e2b90879087906004016149be565b60206040518083038186803b158015613e4357600080fd5b505afa9250505080156137f4575060408051601f3d908101601f191682019092526137f191810190614624565b6000816001600160a01b031663bde127186040518163ffffffff1660e01b815260040160206040518083038186803b158015613eab57600080fd5b505afa925050508015613edb575060408051601f3d908101601f19168201909252613ed891810190614624565b60015b612b10573d808015613f09576040519150601f19603f3d011682016040523d82523d6000602084013e613f0e565b606091505b50613f1881613d4e565b50610cd4565b60008282026108e584158061188e57508385838161188b57fe5b6000613f47821515600461162b565b50811515600019909201046001010290565b6000613f68821515600461162b565b818381613f7157fe5b049392505050565b60008160200151831015613fc257815161133b90613fa090670de0b6b3a764000090611b61565b60208401518451613fbc91613fb59190611871565b8690611b61565b90612b74565b81604001518311613fd457508161070f565b815161133b90613fed90670de0b6b3a7640000906115e6565b60408401518451613fbc916140029190611871565b86906115e6565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040805160808101825260008082526020820181905291810182905290606082015290565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561070f81614dcd565b600082601f830112614115578081fd5b813561412861412382614da1565b614d7a565b81815291506020808301908481018184028601820187101561414957600080fd5b60005b848110156141685781358452928201929082019060010161414c565b505050505092915050565b600082601f830112614183578081fd5b815161419161412382614da1565b8181529150602080830190848101818402860182018710156141b257600080fd5b60005b84811015614168578151845292820192908201906001016141b5565b600082601f8301126141e1578081fd5b813567ffffffffffffffff8111156141f7578182fd5b61420a6020601f19601f84011601614d7a565b915080825283602082850101111561422157600080fd5b8060208401602084013760009082016020015292915050565b80356002811061070f57600080fd5b600061012080838503121561425c578182fd5b61426581614d7a565b915050614272838361423a565b815261428183602084016140fa565b602082015261429383604084016140fa565b6040820152606082013560608201526080820135608082015260a082013560a08201526142c38360c084016140fa565b60c08201526142d58360e084016140fa565b60e08201526101008083013567ffffffffffffffff8111156142f657600080fd5b614302858286016141d1565b82840152505092915050565b60006020828403121561431f578081fd5b81356108e581614dcd565b6000806040838503121561433c578081fd5b823561434781614dcd565b9150602083013561435781614dcd565b809150509250929050565b600080600060608486031215614376578081fd5b833561438181614dcd565b9250602084013561439181614dcd565b929592945050506040919091013590565b600080600080600080600060e0888a0312156143bc578485fd5b87356143c781614dcd565b965060208801356143d781614dcd565b9550604088013594506060880135935060808801356143f581614de2565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215614424578182fd5b823561442f81614dcd565b946020939093013593505050565b600080600060608486031215614451578081fd5b835167ffffffffffffffff80821115614468578283fd5b818601915086601f83011261447b578283fd5b815161448961412382614da1565b80828252602080830192508086018b8283870289010111156144a9578788fd5b8796505b848710156144d45780516144c081614dcd565b8452600196909601959281019281016144ad565b5089015190975093505050808211156144eb578283fd5b506144f886828701614173565b925050604084015190509250925092565b60006020828403121561451a578081fd5b815180151581146108e5578182fd5b60006020828403121561453a578081fd5b5051919050565b600080600080600080600060e0888a03121561455b578081fd5b87359650602088013561456d81614dcd565b9550604088013561457d81614dcd565b9450606088013567ffffffffffffffff80821115614599578283fd5b6145a58b838c01614105565b955060808a0135945060a08a0135935060c08a01359150808211156145c8578283fd5b506145d58a828b016141d1565b91505092959891949750929550565b6000602082840312156145f5578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e5578182fd5b600060208284031215614635578081fd5b81516108e581614dcd565b600060808284031215614651578081fd5b61465b6080614d7a565b8251815260208301516020820152604083015167ffffffffffffffff81168114614683578283fd5b6040820152606083015160038110614699578283fd5b60608201529392505050565b600060c082840312156146b6578081fd5b6146c060c0614d7a565b82516146cb81614dcd565b815260208301516146db81614dcd565b602082015260408301516146ee81614dcd565b80604083015250606083015160608201526080830151608082015260a083015160a08201528091505092915050565b60008060008060808587031215614732578182fd5b843567ffffffffffffffff80821115614749578384fd5b61475588838901614249565b9550602087013591508082111561476a578384fd5b5061477787828801614105565b949794965050505060408301359260600135919050565b6000806000606084860312156147a2578081fd5b833567ffffffffffffffff8111156147b8578182fd5b6147c486828701614249565b9660208601359650604090950135949350505050565b6000602082840312156147eb578081fd5b5035919050565b60008060408385031215614804578182fd5b50508035926020909101359150565b60008060008060808587031215614828578182fd5b845193506020850151925060408501519150606085015161484881614dcd565b939692955090935050565b600060208284031215614864578081fd5b81516108e581614de2565b60008060408385031215614881578182fd5b825161488c81614de2565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156148d8578151875295820195908201906001016148bc565b509495945050505050565b15159052565b60008151808452815b8181101561490e576020818501810151868301820152016148f2565b8181111561491f5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b602080825282518282018190526000919060409081850190868401855b82811015614a86578151805160048110614a2f57fe5b855280870151614a418887018261489c565b508581015186860152606080820151614a5c8288018261489c565b505060809081015190614a718682018361489c565b505060a0939093019290850190600101614a19565b5091979650505050505050565b6000602082526108e560208301846148a9565b600060408252614ab960408301856148a9565b828103602084015261109e81856148a9565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b80831015614b8757614b718451614dc1565b8252928401926001929092019190840190614b5f565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a0870152614bc581856148a9565b935050506040850151818584030160c0860152614be283826148e9565b925050506060840151614bf860e08501826148e3565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b81811015614c7f57614c6d8551614dc1565b83529383019391830191600101614c5b565b505084810360408601528551808252908201925081860190845b818110156124cc57614cab8351614dc1565b85529383019391830191600101614c99565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6020810160038310614d2c57fe5b91905290565b6000602082526108e560208301846148e9565b6000838252604060208301526115d060408301846148a9565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715614d9957600080fd5b604052919050565b600067ffffffffffffffff821115614db7578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146119cf57600080fd5b60ff811681146119cf57600080fdfea26469706673582212209b3da14b073f20ab77b04b8beb3f06232c6f1664501a7726adcbfcc3a968f24864736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/artifact/SiloLinearPoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/artifact/SiloLinearPoolFactory.json new file mode 100644 index 0000000..f9b7bb7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/artifact/SiloLinearPoolFactory.json @@ -0,0 +1,329 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SiloLinearPoolFactory", + "sourceName": "contracts/silo-linear-pool/SiloLinearPoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "contract IBalancerQueries", + "name": "queries", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "poolVersion", + "type": "string" + }, + { + "internalType": "uint256", + "name": "initialPauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "SiloLinearPoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20", + "name": "mainToken", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "wrappedToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "upperTarget", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "protocolId", + "type": "uint256" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract SiloLinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastCreatedPool", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeePercentagesProvider", + "outputs": [ + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101e06040523480156200001257600080fd5b506040516200a1493803806200a1498339810160408190526200003591620003be565b86868383604051806020016200004b906200026d565b601f1982820381018352601f909101166040528851839083908790309085908e906200007f9060009060208401906200027b565b505080516002810460a081905280820360e081905281845283620000af816200018e602090811b620009f317901c565b60601b6001600160601b0319166080528285018051838252620000de826200018e602090811b620009f317901c565b6001600160601b0319606091821b811660c0529690935290526101009590955250509290911b909116610120525062000121630163f500831115610194620001e2565b620001356276a700821115610195620001e2565b610140829052610160524201610180525050506001600160601b0319606091821b81166101a05260016003559087901b166101c052508251620001809060069060208601906200027b565b50505050505050506200048f565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f09084529150620001dc6001600160a01b03831615156101ac620001e2565b50919050565b81620001f357620001f381620001f7565b5050565b62000209816210905360ea1b6200020c565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b616033806200411683390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002be57805160ff1916838001178555620002ee565b82800160010185558215620002ee579182015b82811115620002ee578251825591602001919060010190620002d1565b50620002fc92915062000300565b5090565b5b80821115620002fc576000815560010162000301565b600082601f83011262000328578081fd5b81516001600160401b03808211156200033f578283fd5b6040516020601f8401601f191682018101838111838210171562000361578586fd5b806040525081945083825286818588010111156200037e57600080fd5b600092505b83831015620003a2578583018101518284018201529182019162000383565b83831115620003b45760008185840101525b5050505092915050565b600080600080600080600060e0888a031215620003d9578283fd5b8751620003e68162000479565b6020890151909750620003f98162000479565b60408901519096506200040c8162000479565b60608901519095506001600160401b038082111562000429578485fd5b620004378b838c0162000317565b955060808a01519150808211156200044d578485fd5b506200045c8a828b0162000317565b93505060a0880151915060c0880151905092959891949750929550565b6001600160a01b03811681146200020957600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405161016051610180516101a05160601c6101c05160601c613bf2620005246000398061067552508061050452508061028b52806102b55250806102d95250508061057c52508061052a525080610a5c5250806102625280610ad8525080610a7d5250806102415280610ab45250613bf26000f3fe60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c80636634b7531162000099578063851c1bb3116200006f578063851c1bb314620001cd5780638d928af814620001f3578063aaabadc514620001fd578063df8af989146200020757620000ff565b80636634b75314620001935780636c57f5a914620001b9578063739238d614620001c357620000ff565b80632f2770db11620000db5780632f2770db146200015a5780633f819b6f146200016657806354fd4d5014620001705780635ed31282146200017a57620000ff565b8062c194db1462000104578063174481fa14620001265780632da47c401462000140575b600080fd5b6200010e6200021e565b6040516200011d919062001437565b60405180910390f35b620001306200023f565b6040516200011d929190620013d0565b6200014a62000285565b6040516200011d92919062001660565b620001646200030e565b005b6200010e62000378565b6200010e62000430565b62000184620004b2565b6040516200011d9190620013af565b620001aa620001a436600462001139565b620004ce565b6040516200011d9190620013f7565b620001aa620004f9565b6200018462000502565b620001e4620001de3660046200117a565b62000526565b6040516200011d919062001402565b620001846200057a565b620001846200059e565b6200018462000218366004620011db565b6200062b565b60606200023a6040518060200160405280600081525062000a54565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200030057807f00000000000000000000000000000000000000000000000000000000000000000392507f0000000000000000000000000000000000000000000000000000000000000000915062000309565b60009250600091505b509091565b6200031862000b2f565b6200032262000b7e565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b820191906000526020600020905b8154815290600101906020018083116200040857829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016200055d9291906200134c565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000620005aa6200057a565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620005f057600080fd5b505afa15801562000605573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023a9190620011bc565b60006200063762000b97565b6004805460018101909155604051606090620006566020820162000fda565b601f1982820381018352601f90910116604052620006736200057a565b7f00000000000000000000000000000000000000000000000000000000000000008a604051602001620006a9939291906200144c565b60408051601f1981840301815290829052620006c992916020016200137c565b60405160208183030381529060405290506000620006ef83838051906020012062000bb2565b9050600080620006fe62000285565b915091506200070c62000fe8565b620007166200057a565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508e81602001819052508d81604001819052508c816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508a8160c0018181525050898160e0018181525050828161010001818152505081816101200181815250508881610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506200087462000378565b610160820152604051600090620008aa906200089590849060200162001558565b60405160208183030381529060405262000bc8565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620008f557600080fd5b505af11580156200090a573d6000803e3d6000fd5b5050505060006200091e6000898962000c1d565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161462000991576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200098890620014ea565b60405180910390fd5b6040518a9073ffffffffffffffffffffffffffffffffffffffff8416907f33ff149e9e224f85522bd94ff587bd54aaf8aa5a16fd924ff001375d729cad2990600090a3509650505050505050620009e762000cfb565b98975050505050505050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000a4e73ffffffffffffffffffffffffffffffffffffffff831615156101ac62000d02565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000b2181838662000d17565b505050505050505050919050565b600062000b606000357fffffffff000000000000000000000000000000000000000000000000000000001662000526565b905062000b7b62000b72823362000d75565b61019162000d02565b50565b62000b9562000b8c620004f9565b1560d362000d02565b565b62000bab6002600354141561019062000d02565b6002600355565b600062000bc183833062000e13565b9392505050565b60008062000bd68362000e54565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790559392505050565b6000808447101562000c5d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000988906200147c565b825162000c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009889062001521565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200098890620014b3565b949350505050565b6001600355565b8162000d135762000d138162000eef565b5050565b5b6020811062000d39578151835260209283019290910190601f190162000d18565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000d816200059e565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000dbf939291906200140b565b60206040518083038186803b15801562000dd857600080fd5b505afa15801562000ded573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bc1919062001158565b60008060ff60f81b83868660405160200162000e339493929190620012e8565b60408051808303601f19018152919052805160209091012095945050505050565b600062000e6062000b7e565b600062000e6d8362000f1b565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b62000b7b817f42414c000000000000000000000000000000000000000000000000000000000062000f5f565b6000606062000f2a8362000a54565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811662000bc1573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6124f880620016c583390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f830112620010c8578081fd5b813567ffffffffffffffff80821115620010e0578283fd5b6040516020601f19601f850116820101818110838211171562001101578485fd5b6040528281529250828483016020018610156200111d57600080fd5b8260208601602083013760006020848301015250505092915050565b6000602082840312156200114b578081fd5b813562000bc181620016a1565b6000602082840312156200116a578081fd5b8151801515811462000bc1578182fd5b6000602082840312156200118c578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811462000bc1578182fd5b600060208284031215620011ce578081fd5b815162000bc181620016a1565b600080600080600080600080610100898b031215620011f8578384fd5b883567ffffffffffffffff8082111562001210578586fd5b6200121e8c838d01620010b7565b995060208b013591508082111562001234578586fd5b50620012438b828c01620010b7565b97505060408901356200125681620016a1565b955060608901356200126881620016a1565b94506080890135935060a0890135925060c08901356200128881620016a1565b8092505060e089013590509295985092959890939650565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620012d48160208601602086016200166e565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60008351620013908184602088016200166e565b835190830190620013a68183602088016200166e565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000bc16020830184620012ba565b73ffffffffffffffffffffffffffffffffffffffff93841681529183166020830152909116604082015260600190565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b6000602082526200156e602083018451620012a0565b60208301516101808060408501526200158c6101a0850183620012ba565b91506040850151601f1980868503016060870152620015ac8483620012ba565b935060608701519150620015c46080870183620012a0565b60808701519150620015da60a0870183620012a0565b60a08701519150620015f060c0870183620012a0565b60c087015160e08781019190915287015161010080880191909152870151610120808801919091528701516101408088019190915287015191506101606200163b81880184620012a0565b870151868503909101838701529050620016568382620012ba565b9695505050505050565b918252602082015260400190565b60005b838110156200168b57818101518382015260200162001671565b838111156200169b576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000b7b57600080fdfe6101606040523480156200001257600080fd5b50604051620024f8380380620024f883398101604081905262000035916200051c565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000432565b8383826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000125919081019062000458565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000503565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000503565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000432565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000432565b606090811b6001600160601b031990811660e05292811b8316610120521b166101405250600080546001600160a01b0319166001600160a01b0383811691909117918290556040805163eb3beb2960e01b81529051929091169163eb3beb2991600480820192602092909190829003018186803b158015620003cd57600080fd5b505afa158015620003e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000408919062000432565b600180546001600160a01b0319166001600160a01b039290921691909117905550620005af915050565b60006020828403121562000444578081fd5b8151620004518162000596565b9392505050565b600060208083850312156200046b578182fd5b82516001600160401b038082111562000482578384fd5b818501915085601f83011262000496578384fd5b815181811115620004a5578485fd5b8381029150620004b78483016200056f565b8181528481019084860184860187018a1015620004d2578788fd5b8795505b83861015620004f6578051835260019590950194918601918601620004d6565b5098975050505050505050565b60006020828403121562000515578081fd5b5051919050565b60008060006060848603121562000531578182fd5b83516200053e8162000596565b6020850151909350620005518162000596565b6040850151909250620005648162000596565b809150509250925092565b6040518181016001600160401b03811182821017156200058e57600080fd5b604052919050565b6001600160a01b0381168114620005ac57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c611e66620006926000398061049f52806107765250806101285280610b355280610e5a5280610eaf52508061037c52508061041c528061052f52806106c4528061084152508060dd528061017852806103ed528061056252806105ba528061064e52806106f352806108065280610bb85280610c1f5280610f1d5280610f5c5280610fc652508061015752806103bf528061069652806109c55280610a8a5280610d095280610dce525080609952806102d35250611e666000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611be5565b60405180910390f35b6100776100723660046119b7565b6100bb565b60405161005b9190611db5565b6100776100923660046119d3565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610117565b90505b919050565b60006101056001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085610241565b61010e83610117565b90505b92915050565b6000806101226102cc565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101b4929190611d06565b60806040518083038186803b1580156101cc57600080fd5b505afa1580156101e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102049190611b52565b5050509050818110156102265761021d818303856103a8565b925050506100c9565b8181111561023a5761021d8282038561067f565b5050919050565b6102c6846323b872dd60e01b85858560405160240161026293929190611c13565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610866565b50505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561032957600080fd5b505afa15801561033d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103619190611b2f565b91509150600060028284018161037357fe5b0490506103a0817f0000000000000000000000000000000000000000000000000000000000000000610906565b935050505090565b60006103b26118a8565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815260200185815260200160405180602001604052806000815250815250905061046c6118f1565b6040517fe969f6b30000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906104d69086908690600401611d1d565b602060405180830381600087803b1580156104f057600080fd5b505af1158015610504573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105289190611b17565b90506105547f000000000000000000000000000000000000000000000000000000000000000082610959565b61055d81610ba3565b6105877f000000000000000000000000000000000000000000000000000000000000000087610c9d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906105ef903090600401611be5565b60206040518083038186803b15801561060757600080fd5b505afa15801561061b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063f9190611b17565b90506106756001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168783610ee4565b9695505050505050565b60006106896118a8565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020018581526020016040518060200160405280600081525081525090506107436118f1565b6040517fe969f6b30000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906107ad9086908690600401611d1d565b602060405180830381600087803b1580156107c757600080fd5b505af11580156107db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ff9190611b17565b905061082b7f000000000000000000000000000000000000000000000000000000000000000087610959565b61083c61083782610f08565b610f4b565b6105877f000000000000000000000000000000000000000000000000000000000000000082610c9d565b60006060836001600160a01b0316836040516108829190611bc9565b6000604051808303816000865af19150503d80600081146108bf576040519150601f19603f3d011682016040523d82523d6000602084013e6108c4565b606091505b509150915060008214156108dc573d6000803e3d6000fd5b6102c68151600014806108fe5750818060200190518101906108fe91906119fe565b6101a2611044565b60006109158215156004611044565b670de0b6b3a764000083026109478415806109405750670de0b6b3a764000085838161093d57fe5b04145b6005611044565b82818161095057fe5b04949350505050565b6040805160028082526060828101909352816020015b610977611918565b81526020019060019003908161096f57905050905060008160008151811061099b57fe5b60200260200101516000019060028111156109b257fe5b908160028111156109bf57fe5b815250507f0000000000000000000000000000000000000000000000000000000000000000816000815181106109f157fe5b602002602001015160200181815250508181600081518110610a0f57fe5b602002602001015160600181815250508281600081518110610a2d57fe5b6020026020010151604001906001600160a01b031690816001600160a01b031681525050600281600181518110610a6057fe5b6020026020010151600001906002811115610a7757fe5b90816002811115610a8457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ab657fe5b60200260200101516020018181525050600081600181518110610ad557fe5b602002602001015160600181815250508281600181518110610af357fe5b60209081029190910101516001600160a01b03918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610b6c908490600401611c8f565b600060405180830381600087803b158015610b8657600080fd5b505af1158015610b9a573d6000803e3d6000fd5b50505050505050565b600154600090610bdd906001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000084611056565b6001546040517fead5d3590000000000000000000000000000000000000000000000000000000081529192506001600160a01b03169063ead5d35990610c4c907f0000000000000000000000000000000000000000000000000000000000000000908590600090600401611c6c565b6040805180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102c69190611b2f565b6040805160028082526060828101909352816020015b610cbb611918565b815260200190600190039081610cb3579050509050600281600081518110610cdf57fe5b6020026020010151600001906002811115610cf657fe5b90816002811115610d0357fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610d3557fe5b602002602001015160200181815250508181600081518110610d5357fe5b602002602001015160600181815250508281600081518110610d7157fe5b6020026020010151604001906001600160a01b031690816001600160a01b031681525050600181600181518110610da457fe5b6020026020010151600001906002811115610dbb57fe5b90816002811115610dc857fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610dfa57fe5b602002602001015160200181815250508181600181518110610e1857fe5b602002602001015160600181815250508281600181518110610e3657fe5b60209081029190910101516001600160a01b03918216604090910152610e7f9084167f00000000000000000000000000000000000000000000000000000000000000008461107a565b6040517fe6c460920000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610b6c908490600401611c8f565b610f038363a9059cbb60e01b8484604051602401610262929190611c53565b505050565b600154600090610f42906001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000084611056565b60010192915050565b600154610f85906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691168361107a565b6001546040517f3edd11280000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690633edd112890610ff3907f0000000000000000000000000000000000000000000000000000000000000000908590600090600401611c6c565b6040805180830381600087803b15801561100c57600080fd5b505af1158015611020573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f039190611b2f565b816110525761105281611162565b5050565b600080611063858561118f565b905061106f83826112e3565b9150505b9392505050565b801580159061111e57506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063dd62ed3e906110cb9030908690600401611bf9565b60206040518083038186803b1580156110e357600080fd5b505afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b9190611b17565b15155b15611143576111438363095ea7b360e01b846000604051602401610262929190611c37565b610f038363095ea7b360e01b8484604051602401610262929190611c53565b61118c817f42414c0000000000000000000000000000000000000000000000000000000000611316565b50565b6000611199611941565b6111a38484611391565b90506111ad611992565b6111b78585611470565b90506000816040015167ffffffffffffffff169050600083606001519050600084600001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561121457600080fd5b505afa158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190611b17565b90504283146112cd5760006112618989611502565b9050600061126e8a6115f6565b90506000866020015190506000806000611295868c60a001516112e390919063ffffffff16565b9050670de0b6b3a76400008582020492508383850110156112b557831992505b82810391506112c488836116bf565b97505050505050505b6112d78282610906565b98975050505050505050565b60008282026113078415806113005750838583816112fd57fe5b04145b6003611044565b670de0b6b3a764000081610950565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611399611941565b6040517fbf2730410000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063bf273041906113de908590600401611be5565b60c06040518083038186803b1580156113f657600080fd5b505afa925050508015611426575060408051601f3d908101601f1916820190925261142391810190611a9f565b60015b611469573d808015611454576040519150601f19603f3d011682016040523d82523d6000602084013e611459565b606091505b50611463816116d1565b50610111565b9050610111565b611478611992565b6040517ffb2557030000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063fb255703906114bd908590600401611be5565b60806040518083038186803b1580156114d557600080fd5b505afa925050508015611426575060408051601f3d908101601f1916820190925261142391810190611a3a565b60008061150f8484611758565b6040517fb1e017650000000000000000000000000000000000000000000000000000000081529091506001600160a01b0382169063b1e017659061155b90879087904290600401611c13565b60206040518083038186803b15801561157357600080fd5b505afa9250505080156115a3575060408051601f3d908101601f191682019092526115a091810190611b17565b60015b6115e6573d8080156115d1576040519150601f19603f3d011682016040523d82523d6000602084013e6115d6565b606091505b506115e0816116d1565b506115ef565b91506101119050565b5092915050565b600080611602836117f3565b9050806001600160a01b03166325ed3d446040518163ffffffff1660e01b815260040160206040518083038186803b15801561163d57600080fd5b505afa92505050801561166d575060408051601f3d908101601f1916820190925261166a91810190611b17565b60015b6116b0573d80801561169b576040519150601f19603f3d011682016040523d82523d6000602084013e6116a0565b606091505b506116aa816116d1565b506116b9565b91506100c99050565b50919050565b600082820161010e8482101583611044565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc120000000000000000000000000000000000000000000000000000000082141761174c578160208401fd5b50611052610165611162565b600080611764846117f3565b6040517f48b3eabc0000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906348b3eabc906117ae9087908790600401611bf9565b60206040518083038186803b1580156117c657600080fd5b505afa9250505080156115a3575060408051601f3d908101601f191682019092526115a091810190611a1e565b6000816001600160a01b031663bde127186040518163ffffffff1660e01b815260040160206040518083038186803b15801561182e57600080fd5b505afa92505050801561185e575060408051601f3d908101601f1916820190925261185b91810190611a1e565b60015b6118a1573d80801561188c576040519150601f19603f3d011682016040523d82523d6000602084013e611891565b606091505b5061189b816116d1565b506100c9565b90506100c9565b6040805160c0810190915260008082526020820190815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040805160808101825260008082526020820181905291810182905290606082015290565b6000602082840312156119c8578081fd5b813561010e81611e1b565b600080604083850312156119e5578081fd5b82356119f081611e1b565b946020939093013593505050565b600060208284031215611a0f578081fd5b8151801515811461010e578182fd5b600060208284031215611a2f578081fd5b815161010e81611e1b565b600060808284031215611a4b578081fd5b611a556080611dbe565b8251815260208301516020820152604083015167ffffffffffffffff81168114611a7d578283fd5b6040820152606083015160038110611a93578283fd5b60608201529392505050565b600060c08284031215611ab0578081fd5b611aba60c0611dbe565b8251611ac581611e1b565b81526020830151611ad581611e1b565b60208201526040830151611ae881611e1b565b80604083015250606083015160608201526080830151608082015260a083015160a08201528091505092915050565b600060208284031215611b28578081fd5b5051919050565b60008060408385031215611b41578182fd5b505080516020909101519092909150565b60008060008060808587031215611b67578182fd5b8451935060208501519250604085015191506060850151611b8781611e1b565b939692955090935050565b6001600160a01b03808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b60008251611bdb818460208701611de5565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0392909216825260ff16602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b602080825282518282018190526000919060409081850190868401855b82811015611cf9578151805160038110611cc257fe5b85528087015187860152858101516001600160a01b0316868601526060908101519085015260809093019290850190600101611cac565b5091979650505050505050565b9182526001600160a01b0316602082015260400190565b600060a08252835160a08301526020840151611d3881611e11565b8060c08401525060408401516001600160a01b0380821660e0850152806060870151166101008501525050608084015161012083015260a084015160c0610140840152805180610160850152610180611d978282870160208601611de5565b80601f19601f84011686010193505050506110736020830184611b92565b90815260200190565b60405181810167ffffffffffffffff81118282101715611ddd57600080fd5b604052919050565b60005b83811015611e00578181015183820152602001611de8565b838111156102c65750506000910152565b6002811061118c57fe5b6001600160a01b038116811461118c57600080fdfea264697066735822122090e565ce6d4b10ae5de465aaed55049ecc172eb4d46de92acd33f0a9fb4cf84164736f6c63430007010033a2646970667358221220a83c2d00838e8bccb749c4679dfe2c5ed617a54a3ea8d1bc76a347409c8a7a4664736f6c634300070100336102c06040523480156200001257600080fd5b506040516200603338038062006033833981016040819052620000359162000df5565b6101608101518151602083015160408401516060850151608086015160c0870151620000618862000480565b60e08901516101008a01516101208b01516101408c01518a6200009e8160006200008c8c8c62000509565b89620005ba60201b620014231760201c565b8b8b86868686838387878b86336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b81525087878160039080519060200190620000ed92919062000c7e565b5080516200010390600490602084019062000c7e565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001829050630163f50083111561019462000788565b620001966276a70082111561019562000788565b4291909101610140819052016101605260601b6001600160601b031916610180526101a08690526040805163d2946c2b60e01b815290516001600160a01b0389169163d2946c2b916004808301926020929190829003018186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000db6565b6001600160a01b03166101c0816001600160a01b031660601b8152505050505050505050876001600160a01b03166101e0816001600160a01b031660601b81525050866001600160a01b0316610200816001600160a01b031660601b81525050866001600160a01b0316886001600160a01b031610620002bb576002620002be565b60015b60ff16610220526001600160a01b0380881690891610620002e1576001620002e4565b60025b60ff1661024052620002f6886200079d565b6102605262000305876200079d565b6102805260006200031889828962000849565b620003238562000943565b50508a51620003469a506009995060208c019850965062000c7e95505050505050565b5050600081608001519050620003f1816001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038f57600080fd5b505afa158015620003a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ca919062000db6565b6001600160a01b031683606001516001600160a01b0316146102086200078860201b60201c565b806001600160a01b031663eb3beb296040518163ffffffff1660e01b815260040160206040518083038186803b1580156200042b57600080fd5b505afa15801562000440573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000466919062000db6565b60601b6001600160601b0319166102a05250620010729050565b6040805160028082526060808301845292839291906020830190803683370190505090508260a0015181600081518110620004b757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260a0015181600181518110620004ea57fe5b6001600160a01b03909216602092830291909101909101529050919050565b60408051600280825260608281019093526001600160a01b0384811690861610918391816020016020820280368337019050509050816200054b57836200054d565b845b816000815181106200055b57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050816200058857846200058a565b835b816001815181106200059857fe5b6001600160a01b03909216602092830291909101909101529150505b92915050565b6000620005d283620009d260201b620015d81760201c565b606083516001016001600160401b0381118015620005ef57600080fd5b506040519080825280602002602001820160405280156200061a578160200160208202803683370190505b50905030816000815181106200062c57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156200069f578481815181106200066657fe5b60200260200101518282600101815181106200067e57fe5b6001600160a01b03909216602092830291909101909101526001016200064f565b50606083516001016001600160401b0381118015620006bd57600080fd5b50604051908082528060200260200182016040528015620006e8578160200160208202803683370190505b509050600081600081518110620006fb57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156200076e578481815181106200073557fe5b60200260200101518282600101815181106200074d57fe5b6001600160a01b03909216602092830291909101909101526001016200071e565b506200077d87878484620009de565b979650505050505050565b816200079957620007998162000ad8565b5050565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620007da57600080fd5b505afa158015620007ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000815919062000f4c565b60ff16905060006200083460128362000aed60201b620015e61760201c565b600a0a670de0b6b3a764000002949350505050565b6200085a8183111561014c62000788565b620008776b0de0b6b39983494c589c000082111561014d62000788565b62000891670de0b6b3a7640000825b061561016162000788565b620008a5670de0b6b3a76400008362000886565b620008f4670de0b6b3a7640000820460406020620008de670de0b6b3a764000087600854919004602080620015fc62000b05821b17811c565b62000b0560201b620015fc17909392919060201c565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906200093690859085906200101b565b60405180910390a2505050565b6200095864e8d4a5100082101560cb62000788565b6200097067016345785d8a000082111560ca62000788565b620009928160c0603f60085462000b0560201b620015fc17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90620009c790839062001012565b60405180910390a150565b80620007998162000b2a565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b815260040162000a0f919062000ffd565b602060405180830381600087803b15801562000a2a57600080fd5b505af115801562000a3f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a65919062000ddc565b604051633354e3e960e11b81529091506001600160a01b038716906366a9c7d29062000a9a9084908890889060040162000f6f565b600060405180830381600087803b15801562000ab557600080fd5b505af115801562000aca573d6000803e3d6000fd5b509298975050505050505050565b62000aea816210905360ea1b62000bb6565b50565b600062000aff83831115600162000788565b50900390565b600062000b1484848462000c17565b506001901b60001901811b1992909216911b1790565b60028151101562000b3b5762000aea565b60008160008151811062000b4b57fe5b602002602001015190506000600190505b825181101562000bb157600083828151811062000b7557fe5b6020026020010151905062000ba6816001600160a01b0316846001600160a01b03161060656200078860201b60201c565b915060010162000b5c565b505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b62000c286101008310606462000788565b62000c616001821015801562000c59575062000c5560ff846101000362000c7260201b6200161f1760201c565b8211155b606462000788565b62000bb183821c156101b462000788565b80820390821102900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000cc157805160ff191683800117855562000cf1565b8280016001018555821562000cf1579182015b8281111562000cf157825182559160200191906001019062000cd4565b5062000cff92915062000d03565b5090565b5b8082111562000cff576000815560010162000d04565b8051620005b4816200105c565b600082601f83011262000d38578081fd5b81516001600160401b0381111562000d4e578182fd5b602062000d64601f8301601f1916820162001029565b9250818352848183860101111562000d7b57600080fd5b60005b8281101562000d9b57848101820151848201830152810162000d7e565b8281111562000dad5760008284860101525b50505092915050565b60006020828403121562000dc8578081fd5b815162000dd5816200105c565b9392505050565b60006020828403121562000dee578081fd5b5051919050565b60006020828403121562000e07578081fd5b81516001600160401b038082111562000e1e578283fd5b818401915061018080838703121562000e35578384fd5b62000e408162001029565b905062000e4e868462000d1a565b815260208301518281111562000e62578485fd5b62000e708782860162000d27565b60208301525060408301518281111562000e88578485fd5b62000e968782860162000d27565b60408301525062000eab866060850162000d1a565b606082015262000ebf866080850162000d1a565b608082015262000ed38660a0850162000d1a565b60a082015260c083015160c082015260e083015160e082015261010080840151818301525061012080840151818301525061014062000f158782860162000d1a565b90820152610160838101518381111562000f2d578586fd5b62000f3b8882870162000d27565b918301919091525095945050505050565b60006020828403121562000f5e578081fd5b815160ff8116811462000dd5578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000fbb5762000fa8855162001050565b8352938301939183019160010162000f93565b505084810360408601528551808252908201925081860190845b8181101562000aca5762000fea835162001050565b8552938301939183019160010162000fd5565b60208101600383106200100c57fe5b91905290565b90815260200190565b918252602082015260400190565b6040518181016001600160401b03811182821017156200104857600080fd5b604052919050565b6001600160a01b031690565b6001600160a01b038116811462000aea57600080fd5b60805160a05160c05160e0516101005160601c6101205160601c61014051610160516101805160601c6101a0516101c05160601c6101e05160601c6102005160601c610220516102405161026051610280516102a05160601c614e276200120c600039806118455250806107f352508061078f5280612aa7525080610717528061081b5280610c505280612f2152806130aa52806131e252806132ed528061346a52806135a25250806107b152806109bb5280610c165280612eed528061302f5280613076528061316c52806131ae52806132b952806133f45280613436528061352c528061356e5250806113f7528061264452806127105280612acd5280612ea25280612fbb528061326f52806133805250806109df52806110ed5280611a075280611aa652806125fb52806126c75280612a6c5280612e635280612f6552806130f85280613230528061333152806134b85250806111cb5250806109485250508061181c5250806117f8525080610fd0525080610fac525080610f5c52508061233852508061237a5250806123595250614e276000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c80637ecebe00116101b2578063a457c2d7116100f9578063d505accf116100a2578063de82cd341161007c578063de82cd34146105e8578063ed24911d146105f0578063f174e241146105f8578063f5431aa8146106005761032b565b8063d505accf146105af578063d5c096c4146105c2578063dd62ed3e146105d55761032b565b8063b35056b8116100d3578063b35056b814610597578063b7b814fc1461059f578063d2946c2b146105a75761032b565b8063a457c2d714610569578063a9059cbb1461057c578063aaabadc51461058f5761032b565b8063893d20e81161015b57806395d89b411161013557806395d89b411461053b5780639d2c110c146105435780639f11080e146105565761032b565b8063893d20e8146105185780638d928af81461052057806390193b7c146105285761032b565b80638456cb591161018c5780638456cb59146104fd578063851c1bb31461050557806387ec6817146104675761032b565b80637ecebe00146104da5780638129fc1c146104ed57806382687a56146104f55761032b565b8063395093511161027657806355c676281161021f578063679aefce116101f9578063679aefce1461049e57806370a08231146104a657806374f3b009146104b95761032b565b806355c676281461045f5780636028bfd41461046757806363fe3b56146104885761032b565b80634de046d5116102505780634de046d51461043a57806354a844ba1461044f57806354fd4d50146104575761032b565b806339509351146104175780633f4ba83a1461042a5780634d64cd74146104325761032b565b80631dd746ea116102d85780633644e515116102b25780633644e515146103f257806338e9922e146103fa57806338fff2d01461040f5761032b565b80631dd746ea146103b557806323b872dd146103ca578063313ce567146103dd5761032b565b806316b8d6ff1161030957806316b8d6ff1461038e57806318160ddd146103965780631c0de0511461039e5761032b565b806301ec954a1461033057806306fdde0314610359578063095ea7b31461036e575b600080fd5b61034361033e36600461471d565b610608565b6040516103509190614aee565b60405180910390f35b610361610668565b6040516103509190614d32565b61038161037c366004614412565b6106fe565b6040516103509190614acb565b610343610715565b610343610739565b6103a661073f565b60405161035093929190614ad6565b6103bd610768565b6040516103509190614a93565b6103816103d8366004614362565b610876565b6103e56108ec565b6040516103509190614d6c565b6103436108f5565b61040d6104083660046147da565b610904565b005b610343610946565b610381610425366004614412565b61096a565b61040d6109a5565b6103436109b9565b6104426109dd565b60405161035091906149aa565b61040d610a01565b610361610a55565b610343610ab6565b61047a610475366004614541565b610ac9565b604051610350929190614d45565b610490610ae7565b604051610350929190614d5e565b610343610b25565b6103436104b436600461430e565b610cba565b6104cc6104c7366004614541565b610cd9565b604051610350929190614aa6565b6103436104e836600461430e565b610d9b565b61040d610da6565b610343610f41565b61040d610f46565b6103436105133660046145e4565b610f58565b610442610faa565b610442610fce565b61034361053636600461430e565b610ff2565b61036161100d565b61034361055136600461478e565b61106e565b61040d6105643660046147f2565b6110a7565b610381610577366004614412565b611119565b61038161058a366004614412565b611157565b610442611164565b61038161116e565b61040d61117f565b6104426111c9565b61040d6105bd3660046143a2565b6111ed565b6104cc6105d0366004614541565b61126e565b6103436105e336600461432a565b611305565b610343611342565b6103436113eb565b6104426113f5565b610343611419565b6000846080015161063561061a610fce565b6001600160a01b0316336001600160a01b03161460cd61162b565b61064a610640610946565b82146101f461162b565b610652611639565b61065e8686868661164c565b9695505050505050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050905090565b600061070b338484611771565b5060015b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061074c6117d9565b1592506107576117f6565b915061076161181a565b9050909192565b604080516003808252608082019092526060918291906020820183803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000817f0000000000000000000000000000000000000000000000000000000000000000815181106107da57fe5b6020026020010181815250506108186107f161183e565b7f000000000000000000000000000000000000000000000000000000000000000090611871565b817f00000000000000000000000000000000000000000000000000000000000000008151811061084457fe5b602002602001018181525050670de0b6b3a76400008160008151811061086657fe5b6020908102919091010152905090565b6000806108838533611305565b90506108a7336001600160a01b038716148061089f5750838210155b61019e61162b565b6108b28585856118a9565b336001600160a01b038616148015906108cd57506000198114155b156108df576108df8533858403611771565b60019150505b9392505050565b60055460ff1690565b60006108ff6113eb565b905090565b61090c611989565b6109146119d2565b60008061091f610ae7565b9150915061093861093083836119e2565b61014f61162b565b61094183611ae9565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161070b9185906109a09086611b61565b611771565b6109ad611989565b6109b76000611b73565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b610a09611989565b610a11611c04565b610a1b6001611c18565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86001604051610a4b9190614acb565b60405180910390a1565b60098054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6008546000906108ff9060c0603f611c5a565b60006060610adb888785611c69611c80565b97509795505050505050565b6008546000908190670de0b6b3a7640000610b0482602080611c5a565b029250670de0b6b3a7640000610b1d8260406020611c5a565b029150509091565b600080610b30610946565b90506060610b3c610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610b679190614aee565b60006040518083038186803b158015610b7f57600080fd5b505afa158015610b93573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bbb919081019061443d565b50915050610bd081610bcb610768565b611de7565b600080610bdb610ae7565b91509150610be7614009565b6040518060600160405280610bfa610ab6565b81526020018481526020018381525090506000610c86610c4d867f000000000000000000000000000000000000000000000000000000000000000081518110610c3f57fe5b602002602001015184611e50565b867f000000000000000000000000000000000000000000000000000000000000000081518110610c7957fe5b6020026020010151611eb1565b9050610caf610ca886600081518110610c9b57fe5b6020026020010151611ebd565b8290611ed1565b965050505050505090565b6001600160a01b0381166000908152602081905260409020545b919050565b60608088610ce861061a610fce565b610cf3610640610946565b6000610cfe85611f28565b15610d2657610d0b611f57565b610d1d88610d17610739565b87611f6a565b94509050610d3e565b610d2e611639565b610d398a8987611c69565b945090505b610d488a82612060565b835167ffffffffffffffff81118015610d6057600080fd5b50604051908082528060200260200182016040528015610d8a578160200160208202803683370190505b509250505097509795505050505050565b600061070f82610ff2565b6000610db0610946565b90506060610dbc610fce565b6001600160a01b031663f94d4668836040518263ffffffff1660e01b8152600401610de79190614aee565b60006040518083038186803b158015610dff57600080fd5b505afa158015610e13573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3b919081019061443d565b505060408051600380825260808201909252919250606091906020820183803683370190505090506dffffffffffffffffffffffffffff81600081518110610e7f57fe5b602002602001018181525050610e9361402a565b6040518060800160405280610ea78561206a565b8152602001838152602001604051806020016040528060008152508152602001600015158152509050610ed8610fce565b6001600160a01b031663b95cac28853030856040518563ffffffff1660e01b8152600401610f099493929190614b16565b600060405180830381600087803b158015610f2357600080fd5b505af1158015610f37573d6000803e3d6000fd5b5050505050505050565b600090565b610f4e611989565b6109b76001611b73565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610f8d929190614934565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106f45780601f106106c9576101008083540402835291602001916106f4565b6000836080015161108061061a610fce565b61108b610640610946565b611093611639565b61109e85858561206d565b95945050505050565b6110af611989565b6110b76119d2565b6000806110c2610ae7565b915091506110d361093083836119e2565b6110e86110e085856119e2565b61015761162b565b6111137f0000000000000000000000000000000000000000000000000000000000000000858561207a565b50505050565b6000806111263385611305565b90508083106111405761113b33856000611771565b61114d565b61114d3385858403611771565b5060019392505050565b600061070b3384846118a9565b60006108ff612150565b6008546000906108ff9060ff6121ca565b611187611989565b61118f611f57565b6111996000611c18565b7feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c86000604051610a4b9190614acb565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861121c8c610ff2565b8960405160200161123296959493929190614c03565b604051602081830303815290604052805190602001209050611263888261125a8787876121d1565b886101f8612210565b610f37888888611771565b6060808861127d61061a610fce565b611288610640610946565b6000611292611639565b61129a610739565b6112ec576112a98a8a87612267565b945090506112c26112b8610f41565b82101560cc61162b565b6112d460006112cf610f41565b6122ff565b6112e7896112e0610f41565b83036122ff565b610d48565b6112f78a8987611c69565b94509050610d4889826122ff565b600061130f610fce565b6001600160a01b0316826001600160a01b03161415611331575060001961070f565b61133b8383612309565b905061070f565b600080600061134f610fce565b6001600160a01b031663b05f8e48611365610946565b306040518363ffffffff1660e01b8152600401611383929190614ce9565b60806040518083038186803b15801561139b57600080fd5b505afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190614813565b5050915091506113e4818301611ebd565b9250505090565b60006108ff612334565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff61183e565b600061142e836115d8565b6060835160010167ffffffffffffffff8111801561144b57600080fd5b50604051908082528060200260200182016040528015611475578160200160208202803683370190505b509050308160008151811061148657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156114f5578481815181106114be57fe5b60200260200101518282600101815181106114d557fe5b6001600160a01b03909216602092830291909101909101526001016114a9565b506060835160010167ffffffffffffffff8111801561151357600080fd5b5060405190808252806020026020018201604052801561153d578160200160208202803683370190505b50905060008160008151811061154f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b84518110156115be5784818151811061158757fe5b602002602001015182826001018151811061159e57fe5b6001600160a01b0390921660209283029190910190910152600101611572565b506115cb878784846123d1565b925050505b949350505050565b806115e2816124da565b5050565b60006115f683831115600161162b565b50900390565b6000611609848484612553565b506001901b60001901811b1992909216911b1790565b80820390821102900390565b816115e2576115e281612599565b6109b76116446117d9565b61019261162b565b60006116686003841080156116615750600383105b606461162b565b6060611672610768565b905061167e8582611de7565b600080611689610ae7565b91509150611695614009565b60405180606001604052806116a8610ab6565b81526020810185905260400183905290506000895160018111156116c857fe5b141561172c576116ef89606001518589815181106116e257fe5b60200260200101516125c3565b60608a015260006117018a8a846125cf565b90506117208186898151811061171357fe5b6020026020010151612696565b955050505050506115d0565b61174089606001518588815181106116e257fe5b60608a015260006117528a8a846126a2565b905061172081868a8151811061176457fe5b6020026020010151612757565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906117cc908590614aee565b60405180910390a3505050565b60006117e361181a565b4211806108ff57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006108ff7f000000000000000000000000000000000000000000000000000000000000000061186c6109dd565b612763565b600082820261189584158061188e57508385838161188b57fe5b04145b600361162b565b670de0b6b3a7640000815b04949350505050565b6118c06001600160a01b038416151561019861162b565b6118d76001600160a01b038316151561019961162b565b6118e2838383610941565b6001600160a01b03831660009081526020819052604090205461190890826101a06128b7565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546119379082611b61565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906117cc908590614aee565b60006119b86000357fffffffff0000000000000000000000000000000000000000000000000000000016610f58565b90506119cf6119c782336128cd565b61019161162b565b50565b6109b76119dd610fce565b6129b6565b60008060006119ef610fce565b6001600160a01b031663b05f8e48611a05610946565b7f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611a43929190614ce9565b60806040518083038186803b158015611a5b57600080fd5b505afa158015611a6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a939190614813565b5050915091506000611acf828401611aca7f0000000000000000000000000000000000000000000000000000000000000000612a68565b6125c3565b905085811015801561065e57509390931115949350505050565b611afc64e8d4a5100082101560cb61162b565b611b1267016345785d8a000082111560ca61162b565b600854611b23908260c0603f6115fc565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611b56908390614aee565b60405180910390a150565b60008282016108e5848210158361162b565b8015611b9357611b8e611b846117f6565b421061019361162b565b611ba8565b611ba8611b9e61181a565b42106101a961162b565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611b56908390614acb565b6109b7611c0f61116e565b156101b561162b565b600854611c27908260ff612b42565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890611b56908390614acb565b6001901b6000190191901c1690565b60006060611c786103e6612599565b935093915050565b333014611d6f576000306001600160a01b0316600036604051611ca4929190614964565b6000604051808303816000865af19150503d8060008114611ce1576040519150601f19603f3d011682016040523d82523d6000602084013e611ce6565b606091505b505090508060008114611cf557fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611d51573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b60006060611d828686868663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc083015291935091506020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b81518151611df6908290612b51565b60005b8181101561111357611e31848281518110611e1057fe5b6020026020010151848381518110611e2457fe5b6020026020010151611871565b848281518110611e3d57fe5b6020908102919091010152600101611df9565b60008160200151831015611e895781516020830151600091611e759186900390611871565b9050611e8184826115e6565b91505061070f565b81604001518311611e9b57508161070f565b81516040830151600091611e7591860390611871565b60006108e58383611b61565b600061070f82611ecb610739565b906115e6565b6000611ee0821515600461162b565b670de0b6b3a76400008302611f12841580611f0b5750670de0b6b3a7640000858381611f0857fe5b04145b600561162b565b6001836001830304018115150291505092915050565b600080825111801561070f575060ff801682806020019051810190611f4d9190614853565b60ff161492915050565b6109b7611f6261116e565b6101b661162b565b600060606000611f7984612b5e565b90506060865167ffffffffffffffff81118015611f9557600080fd5b50604051908082528060200260200182016040528015611fbf578160200160208202803683370190505b5090506000611fcc610f41565b90506000611fdf898381518110610c9b57fe5b90506000611fed8583612b74565b905060005b8a5181101561204f578381141561200a576000612030565b612030828c838151811061201a57fe5b602002602001015161187190919063ffffffff16565b85828151811061203c57fe5b6020908102919091010152600101611ff2565b509399929850919650505050505050565b6115e28282612bb4565b90565b60006108e56103e6612599565b6120898183111561014c61162b565b6120a46b0de0b6b39983494c589c000082111561014d61162b565b6120bc670de0b6b3a7640000825b061561016161162b565b6120ce670de0b6b3a7640000836120b2565b612103670de0b6b3a76400008204604060206120fb670de0b6b3a7640000876008549190046020806115fc565b9291906115fc565b6008556040516001600160a01b038416907fd0e27a0d0c2cb09280fa5e4487315455b32afcdcf012dc35b6ef2a0e3c4d1280906121439085908590614d5e565b60405180910390a2505050565b600061215a610fce565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561219257600080fd5b505afa1580156121a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ff9190614624565b1c60011690565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b600061221b85612c80565b905061223161222b878387612c9c565b8361162b565b612240428410156101b861162b565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606122826001600160a01b038616301461015661162b565b6122996001600160a01b038516301461015661162b565b604080516003808252608082019092526dffffffffffffffffffffffffffff91606091906020820183803683370190505090506dffffffffffffffffffffffffffff816000815181106122e857fe5b602090810291909101015290969095509350505050565b6115e28282612d4a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006123a1612ddd565b306040516020016123b6959493929190614cbd565b60405160208183030381529060405280519060200120905090565b600080856001600160a01b03166309b2760f866040518263ffffffff1660e01b81526004016124009190614d1e565b602060405180830381600087803b15801561241a57600080fd5b505af115801561242e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124529190614529565b6040517f66a9c7d20000000000000000000000000000000000000000000000000000000081529091506001600160a01b038716906366a9c7d29061249e90849088908890600401614c37565b600060405180830381600087803b1580156124b857600080fd5b505af11580156124cc573d6000803e3d6000fd5b509298975050505050505050565b6002815110156124e9576119cf565b6000816000815181106124f857fe5b602002602001015190506000600190505b825181101561094157600083828151811061252057fe5b60200260200101519050612549816001600160a01b0316846001600160a01b031610606561162b565b9150600101612509565b6125626101008310606461162b565b61258a60018210158015611661575061258060ff846101000361161f565b821115606461162b565b61094183821c156101b461162b565b6119cf817f42414c0000000000000000000000000000000000000000000000000000000000612de1565b60006108e58383611871565b60208301516000906001600160a01b03163014156125f9576125f2848484612e5c565b90506108e5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b03161415612642576125f2848484612fb4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684602001516001600160a01b0316141561268b576125f28484846130f1565b6108e5610135612599565b60006108e58383612b74565b60408301516000906001600160a01b03163014156126c5576125f2848484613229565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b0316141561270e576125f2848484613379565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684604001516001600160a01b0316141561268b576125f28484846134b1565b60006108e58383611ed1565b600061276d614054565b61277784846135e9565b90506127816140a5565b61278b85856136c1565b90506000816040015167ffffffffffffffff169050600083606001519050600084600001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127e857600080fd5b505afa1580156127fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128209190614529565b90504283146128a15760006128358989613753565b905060006128428a613847565b90506000866020015190506000806000612869868c60a0015161187190919063ffffffff16565b9050670de0b6b3a764000085820204925083838501101561288957831992505b82810391506128988883611b61565b97505050505050505b6128ab8282612b74565b98975050505050505050565b60006128c6848411158361162b565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6128ec610faa565b6001600160a01b031614158015612907575061290783613910565b1561292f57612914610faa565b6001600160a01b0316336001600160a01b031614905061070f565b612937612150565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161296693929190614af7565b60206040518083038186803b15801561297e57600080fd5b505afa158015612992573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b9190614509565b604080516000808252602082019092526060916129e9565b6129d66140ca565b8152602001906001900390816129ce5790505b506040517f0e8e3e840000000000000000000000000000000000000000000000000000000081529091506001600160a01b03831690630e8e3e8490612a329084906004016149fc565b600060405180830381600087803b158015612a4c57600080fd5b505af1158015612a60573d6000803e3d6000fd5b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612acb57507f0000000000000000000000000000000000000000000000000000000000000000610cd4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612b1757612b106107f161183e565b9050610cd4565b6001600160a01b038216301415612b375750670de0b6b3a7640000610cd4565b610cd4610135612599565b6001811b1992909216911b1790565b6115e2818314606761162b565b6000818060200190518101906108e5919061486f565b6000612b83821515600461162b565b670de0b6b3a76400008302612bab841580611f0b5750670de0b6b3a7640000858381611f0857fe5b8281816118a057fe5b612bcb6001600160a01b038316151561019b61162b565b612bd782600083610941565b6001600160a01b038216600090815260208190526040902054612bfd90826101b26128b7565b6001600160a01b038316600090815260208190526040902055612c30612c2b82612c25610739565b90613974565b613982565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c749190614aee565b60405180910390a35050565b6000612c8a612334565b82604051602001610f8d929190614974565b6000612cae82516041146101b961162b565b60208281015160408085015160608601518251600080825295019283905292939092811a91600190612ce7908990859088908890614d00565b6020604051602081039080840390855afa158015612d09573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906128ab5750876001600160a01b0316816001600160a01b03161498975050505050505050565b612d5660008383610941565b612d6b612c2b82612d65610739565b90611b61565b6001600160a01b038216600090815260208190526040902054612d8e9082611b61565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c74908590614aee565b4690565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6000612ee27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eda57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b0316145b61013561162b565b6115d08460600151847f000000000000000000000000000000000000000000000000000000000000000081518110612f1657fe5b6020026020010151857f000000000000000000000000000000000000000000000000000000000000000081518110612f4a57fe5b6020026020010151612f6287600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a604001516001600160a01b031614612fa857613987612fac565b6139e55b63ffffffff16565b60006130107f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eda575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b0316301461306b576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061305857fe5b602002602001015184613a4e565b6115d0565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061309f57fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106130d357fe5b60200260200101516130eb87600081518110610c9b57fe5b86613a7e565b600061314d7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685604001516001600160a01b03161480612eda575060408501516001600160a01b0316301461013561162b565b60408401516001600160a01b031630146131a3576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061319557fe5b602002602001015184613ae4565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106131d757fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061320b57fe5b602002602001015161322387600081518110610c9b57fe5b86613b24565b60006132ae7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eda57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161461013561162b565b6115d08460600151847f0000000000000000000000000000000000000000000000000000000000000000815181106132e257fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061331657fe5b602002602001015161332e87600081518110610c9b57fe5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a602001516001600160a01b03161461337457613b8b612fac565b613be2565b60006133d57f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eda575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b0316301461342b576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061341d57fe5b602002602001015184613c4c565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061345f57fe5b6020026020010151857f00000000000000000000000000000000000000000000000000000000000000008151811061349357fe5b60200260200101516134ab87600081518110610c9b57fe5b86613c76565b600061350d7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685602001516001600160a01b03161480612eda575060208501516001600160a01b0316301461013561162b565b60208401516001600160a01b03163014613563576130668460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061355557fe5b602002602001015184613cc5565b6115d08460600151847f00000000000000000000000000000000000000000000000000000000000000008151811061359757fe5b6020026020010151857f0000000000000000000000000000000000000000000000000000000000000000815181106135cb57fe5b60200260200101516135e387600081518110610c9b57fe5b86613cfa565b6135f1614054565b6040517fbf2730410000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063bf273041906136369085906004016149aa565b60c06040518083038186803b15801561364e57600080fd5b505afa92505050801561367e575060408051601f3d908101601f1916820190925261367b918101906146a5565b60015b61133b573d8080156136ac576040519150601f19603f3d011682016040523d82523d6000602084013e6136b1565b606091505b506136bb81613d4e565b5061070f565b6136c96140a5565b6040517ffb2557030000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063fb2557039061370e9085906004016149aa565b60806040518083038186803b15801561372657600080fd5b505afa92505050801561367e575060408051601f3d908101601f1916820190925261367b91810190614640565b6000806137608484613dd5565b6040517fb1e017650000000000000000000000000000000000000000000000000000000081529091506001600160a01b0382169063b1e01765906137ac908790879042906004016149d8565b60206040518083038186803b1580156137c457600080fd5b505afa9250505080156137f4575060408051601f3d908101601f191682019092526137f191810190614529565b60015b613837573d808015613822576040519150601f19603f3d011682016040523d82523d6000602084013e613827565b606091505b5061383181613d4e565b50613840565b915061070f9050565b5092915050565b60008061385383613e70565b9050806001600160a01b03166325ed3d446040518163ffffffff1660e01b815260040160206040518083038186803b15801561388e57600080fd5b505afa9250505080156138be575060408051601f3d908101601f191682019092526138bb91810190614529565b60015b613901573d8080156138ec576040519150601f19603f3d011682016040523d82523d6000602084013e6138f1565b606091505b506138fb81613d4e565b5061390a565b9150610cd49050565b50919050565b600061393b7f9f11080e00000000000000000000000000000000000000000000000000000000610f58565b82148061070f575061396c7f38e9922e00000000000000000000000000000000000000000000000000000000610f58565b909114919050565b60006108e5838360016128b7565b600255565b6000806139948684611e50565b905060006139a28287611eb1565b905060006139b0868a6115e6565b905060006139cb84611ecb6139c58587613f1e565b8a613f38565b90506139d788826115e6565b9a9950505050505050505050565b6000806139f28684611e50565b90506000613a008287611eb1565b90506000613a17613a11838b613f1e565b87613f59565b90506000613a2584836115e6565b90506000613a338288613f79565b9050613a3f8a826115e6565b9b9a5050505050505050505050565b600080613a5b8484611e50565b90506000613a72613a6c8688611b61565b85611e50565b905061065e81836115e6565b600082613a9657613a8f8683611e50565b905061109e565b6000613aa28684611e50565b90506000613ab3613a6c888a611b61565b90506000613ac182846115e6565b90506000613acf8489611eb1565b90506139d7613ade8884613f1e565b82613f59565b600080613af18484611e50565b90506000613aff82876115e6565b90506000613b0d8286613f79565b9050613b1986826115e6565b979650505050505050565b600082613b3257508461109e565b6000613b3e8684611e50565b90506000613b4c8287611eb1565b90506000613b5a878a611b61565b90506000613b688483611eb1565b90506000613b7f613b798984613f1e565b85613f59565b9050613a3f81896115e6565b600082613b9957508461109e565b6000613ba58684611e50565b90506000613bb38287611eb1565b90506000613bc1868a611b61565b90506000613bd684611ecb6139c58587613f1e565b90506139d781896115e6565b600082613bf357613a8f8683613f79565b6000613bff8684611e50565b90506000613c0d8287611eb1565b90506000613c24613c1e838b613f1e565b87613f38565b90506000613c328483611b61565b90506000613c408288613f79565b9050613a3f818b6115e6565b600080613c598484611e50565b90506000613c6a613a6c86886115e6565b905061065e82826115e6565b600080613c838684611e50565b90506000613c94613a6c888a6115e6565b90506000613ca283836115e6565b90506000613cb08489611eb1565b90506139d7613cbf8884613f1e565b82613f38565b600080613cd28484611e50565b90506000613ce08287611b61565b90506000613cee8286613f79565b9050613b1981876115e6565b600080613d078684611e50565b90506000613d158287611eb1565b90506000613d23878a6115e6565b90506000613d318483611eb1565b90506000613d42613b798984613f1e565b9050613a3f88826115e6565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc1200000000000000000000000000000000000000000000000000000000821417613dc9578160208401fd5b506115e2610165612599565b600080613de184613e70565b6040517f48b3eabc0000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906348b3eabc90613e2b90879087906004016149be565b60206040518083038186803b158015613e4357600080fd5b505afa9250505080156137f4575060408051601f3d908101601f191682019092526137f191810190614624565b6000816001600160a01b031663bde127186040518163ffffffff1660e01b815260040160206040518083038186803b158015613eab57600080fd5b505afa925050508015613edb575060408051601f3d908101601f19168201909252613ed891810190614624565b60015b612b10573d808015613f09576040519150601f19603f3d011682016040523d82523d6000602084013e613f0e565b606091505b50613f1881613d4e565b50610cd4565b60008282026108e584158061188e57508385838161188b57fe5b6000613f47821515600461162b565b50811515600019909201046001010290565b6000613f68821515600461162b565b818381613f7157fe5b049392505050565b60008160200151831015613fc257815161133b90613fa090670de0b6b3a764000090611b61565b60208401518451613fbc91613fb59190611871565b8690611b61565b90612b74565b81604001518311613fd457508161070f565b815161133b90613fed90670de0b6b3a7640000906115e6565b60408401518451613fbc916140029190611871565b86906115e6565b60405180606001604052806000815260200160008152602001600081525090565b60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040805160808101825260008082526020820181905291810182905290606082015290565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565b803561070f81614dcd565b600082601f830112614115578081fd5b813561412861412382614da1565b614d7a565b81815291506020808301908481018184028601820187101561414957600080fd5b60005b848110156141685781358452928201929082019060010161414c565b505050505092915050565b600082601f830112614183578081fd5b815161419161412382614da1565b8181529150602080830190848101818402860182018710156141b257600080fd5b60005b84811015614168578151845292820192908201906001016141b5565b600082601f8301126141e1578081fd5b813567ffffffffffffffff8111156141f7578182fd5b61420a6020601f19601f84011601614d7a565b915080825283602082850101111561422157600080fd5b8060208401602084013760009082016020015292915050565b80356002811061070f57600080fd5b600061012080838503121561425c578182fd5b61426581614d7a565b915050614272838361423a565b815261428183602084016140fa565b602082015261429383604084016140fa565b6040820152606082013560608201526080820135608082015260a082013560a08201526142c38360c084016140fa565b60c08201526142d58360e084016140fa565b60e08201526101008083013567ffffffffffffffff8111156142f657600080fd5b614302858286016141d1565b82840152505092915050565b60006020828403121561431f578081fd5b81356108e581614dcd565b6000806040838503121561433c578081fd5b823561434781614dcd565b9150602083013561435781614dcd565b809150509250929050565b600080600060608486031215614376578081fd5b833561438181614dcd565b9250602084013561439181614dcd565b929592945050506040919091013590565b600080600080600080600060e0888a0312156143bc578485fd5b87356143c781614dcd565b965060208801356143d781614dcd565b9550604088013594506060880135935060808801356143f581614de2565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215614424578182fd5b823561442f81614dcd565b946020939093013593505050565b600080600060608486031215614451578081fd5b835167ffffffffffffffff80821115614468578283fd5b818601915086601f83011261447b578283fd5b815161448961412382614da1565b80828252602080830192508086018b8283870289010111156144a9578788fd5b8796505b848710156144d45780516144c081614dcd565b8452600196909601959281019281016144ad565b5089015190975093505050808211156144eb578283fd5b506144f886828701614173565b925050604084015190509250925092565b60006020828403121561451a578081fd5b815180151581146108e5578182fd5b60006020828403121561453a578081fd5b5051919050565b600080600080600080600060e0888a03121561455b578081fd5b87359650602088013561456d81614dcd565b9550604088013561457d81614dcd565b9450606088013567ffffffffffffffff80821115614599578283fd5b6145a58b838c01614105565b955060808a0135945060a08a0135935060c08a01359150808211156145c8578283fd5b506145d58a828b016141d1565b91505092959891949750929550565b6000602082840312156145f5578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108e5578182fd5b600060208284031215614635578081fd5b81516108e581614dcd565b600060808284031215614651578081fd5b61465b6080614d7a565b8251815260208301516020820152604083015167ffffffffffffffff81168114614683578283fd5b6040820152606083015160038110614699578283fd5b60608201529392505050565b600060c082840312156146b6578081fd5b6146c060c0614d7a565b82516146cb81614dcd565b815260208301516146db81614dcd565b602082015260408301516146ee81614dcd565b80604083015250606083015160608201526080830151608082015260a083015160a08201528091505092915050565b60008060008060808587031215614732578182fd5b843567ffffffffffffffff80821115614749578384fd5b61475588838901614249565b9550602087013591508082111561476a578384fd5b5061477787828801614105565b949794965050505060408301359260600135919050565b6000806000606084860312156147a2578081fd5b833567ffffffffffffffff8111156147b8578182fd5b6147c486828701614249565b9660208601359650604090950135949350505050565b6000602082840312156147eb578081fd5b5035919050565b60008060408385031215614804578182fd5b50508035926020909101359150565b60008060008060808587031215614828578182fd5b845193506020850151925060408501519150606085015161484881614dcd565b939692955090935050565b600060208284031215614864578081fd5b81516108e581614de2565b60008060408385031215614881578182fd5b825161488c81614de2565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156148d8578151875295820195908201906001016148bc565b509495945050505050565b15159052565b60008151808452815b8181101561490e576020818501810151868301820152016148f2565b8181111561491f5782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b602080825282518282018190526000919060409081850190868401855b82811015614a86578151805160048110614a2f57fe5b855280870151614a418887018261489c565b508581015186860152606080820151614a5c8288018261489c565b505060809081015190614a718682018361489c565b505060a0939093019290850190600101614a19565b5091979650505050505050565b6000602082526108e560208301846148a9565b600060408252614ab960408301856148a9565b828103602084015261109e81856148a9565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b600085825260206001600160a01b038087168285015280861660408501525060806060840152610100830184516080808601528181518084526101208701915084830193508592505b80831015614b8757614b718451614dc1565b8252928401926001929092019190840190614b5f565b508387015193507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809250828682030160a0870152614bc581856148a9565b935050506040850151818584030160c0860152614be283826148e9565b925050506060840151614bf860e08501826148e3565b509695505050505050565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b60006060820185835260206060818501528186518084526080860191508288019350845b81811015614c7f57614c6d8551614dc1565b83529383019391830191600101614c5b565b505084810360408601528551808252908201925081860190845b818110156124cc57614cab8351614dc1565b85529383019391830191600101614c99565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6020810160038310614d2c57fe5b91905290565b6000602082526108e560208301846148e9565b6000838252604060208301526115d060408301846148a9565b918252602082015260400190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715614d9957600080fd5b604052919050565b600067ffffffffffffffff821115614db7578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146119cf57600080fd5b60ff811681146119cf57600080fdfea26469706673582212209b3da14b073f20ab77b04b8beb3f06232c6f1664501a7726adcbfcc3a968f24864736f6c63430007010033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c80636634b7531162000099578063851c1bb3116200006f578063851c1bb314620001cd5780638d928af814620001f3578063aaabadc514620001fd578063df8af989146200020757620000ff565b80636634b75314620001935780636c57f5a914620001b9578063739238d614620001c357620000ff565b80632f2770db11620000db5780632f2770db146200015a5780633f819b6f146200016657806354fd4d5014620001705780635ed31282146200017a57620000ff565b8062c194db1462000104578063174481fa14620001265780632da47c401462000140575b600080fd5b6200010e6200021e565b6040516200011d919062001437565b60405180910390f35b620001306200023f565b6040516200011d929190620013d0565b6200014a62000285565b6040516200011d92919062001660565b620001646200030e565b005b6200010e62000378565b6200010e62000430565b62000184620004b2565b6040516200011d9190620013af565b620001aa620001a436600462001139565b620004ce565b6040516200011d9190620013f7565b620001aa620004f9565b6200018462000502565b620001e4620001de3660046200117a565b62000526565b6040516200011d919062001402565b620001846200057a565b620001846200059e565b6200018462000218366004620011db565b6200062b565b60606200023a6040518060200160405280600081525062000a54565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f00000000000000000000000000000000000000000000000000000000000000008110156200030057807f00000000000000000000000000000000000000000000000000000000000000000392507f0000000000000000000000000000000000000000000000000000000000000000915062000309565b60009250600091505b509091565b6200031862000b2f565b6200032262000b7e565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b820191906000526020600020905b8154815290600101906020018083116200040857829003601f168201915b5050505050905090565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620004265780601f10620003fa5761010080835404028352916020019162000426565b60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60025460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016200055d9291906200134c565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000620005aa6200057a565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015620005f057600080fd5b505afa15801562000605573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023a9190620011bc565b60006200063762000b97565b6004805460018101909155604051606090620006566020820162000fda565b601f1982820381018352601f90910116604052620006736200057a565b7f00000000000000000000000000000000000000000000000000000000000000008a604051602001620006a9939291906200144c565b60408051601f1981840301815290829052620006c992916020016200137c565b60405160208183030381529060405290506000620006ef83838051906020012062000bb2565b9050600080620006fe62000285565b915091506200070c62000fe8565b620007166200057a565b816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508e81602001819052508d81604001819052508c816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508b816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508a8160c0018181525050898160e0018181525050828161010001818152505081816101200181815250508881610140019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506200087462000378565b610160820152604051600090620008aa906200089590849060200162001558565b60405160208183030381529060405262000bc8565b90508073ffffffffffffffffffffffffffffffffffffffff16638129fc1c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620008f557600080fd5b505af11580156200090a573d6000803e3d6000fd5b5050505060006200091e6000898962000c1d565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161462000991576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200098890620014ea565b60405180910390fd5b6040518a9073ffffffffffffffffffffffffffffffffffffffff8416907f33ff149e9e224f85522bd94ff587bd54aaf8aa5a16fd924ff001375d729cad2990600090a3509650505050505050620009e762000cfb565b98975050505050505050565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915062000a4e73ffffffffffffffffffffffffffffffffffffffff831615156101ac62000d02565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c506020898101908985010162000b2181838662000d17565b505050505050505050919050565b600062000b606000357fffffffff000000000000000000000000000000000000000000000000000000001662000526565b905062000b7b62000b72823362000d75565b61019162000d02565b50565b62000b9562000b8c620004f9565b1560d362000d02565b565b62000bab6002600354141561019062000d02565b6002600355565b600062000bc183833062000e13565b9392505050565b60008062000bd68362000e54565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790559392505050565b6000808447101562000c5d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000988906200147c565b825162000c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009889062001521565b8383516020850187f5905073ffffffffffffffffffffffffffffffffffffffff811662000cf3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200098890620014b3565b949350505050565b6001600355565b8162000d135762000d138162000eef565b5050565b5b6020811062000d39578151835260209283019290910190601f190162000d18565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b600062000d816200059e565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040162000dbf939291906200140b565b60206040518083038186803b15801562000dd857600080fd5b505afa15801562000ded573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bc1919062001158565b60008060ff60f81b83868660405160200162000e339493929190620012e8565b60408051808303601f19018152919052805160209091012095945050505050565b600062000e6062000b7e565b600062000e6d8362000f1b565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a292915050565b62000b7b817f42414c000000000000000000000000000000000000000000000000000000000062000f5f565b6000606062000f2a8362000a54565b905060008151602083016000f0905073ffffffffffffffffffffffffffffffffffffffff811662000bc1573d6000803e3d6000fd5b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6124f880620016c583390190565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f830112620010c8578081fd5b813567ffffffffffffffff80821115620010e0578283fd5b6040516020601f19601f850116820101818110838211171562001101578485fd5b6040528281529250828483016020018610156200111d57600080fd5b8260208601602083013760006020848301015250505092915050565b6000602082840312156200114b578081fd5b813562000bc181620016a1565b6000602082840312156200116a578081fd5b8151801515811462000bc1578182fd5b6000602082840312156200118c578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811462000bc1578182fd5b600060208284031215620011ce578081fd5b815162000bc181620016a1565b600080600080600080600080610100898b031215620011f8578384fd5b883567ffffffffffffffff8082111562001210578586fd5b6200121e8c838d01620010b7565b995060208b013591508082111562001234578586fd5b50620012438b828c01620010b7565b97505060408901356200125681620016a1565b955060608901356200126881620016a1565b94506080890135935060a0890135925060c08901356200128881620016a1565b8092505060e089013590509295985092959890939650565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452620012d48160208601602086016200166e565b601f01601f19169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b60008351620013908184602088016200166e565b835190830190620013a68183602088016200166e565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825262000bc16020830184620012ba565b73ffffffffffffffffffffffffffffffffffffffff93841681529183166020830152909116604082015260600190565b6020808252601c908201527f435245415445325f494e53554646494349454e545f42414c414e434500000000604082015260600190565b60208082526015908201527f435245415445325f4445504c4f595f4641494c45440000000000000000000000604082015260600190565b6020808252601c908201527f526562616c616e636572206465706c6f796d656e74206661696c656400000000604082015260600190565b60208082526015908201527f435245415445325f42595445434f44455f5a45524f0000000000000000000000604082015260600190565b6000602082526200156e602083018451620012a0565b60208301516101808060408501526200158c6101a0850183620012ba565b91506040850151601f1980868503016060870152620015ac8483620012ba565b935060608701519150620015c46080870183620012a0565b60808701519150620015da60a0870183620012a0565b60a08701519150620015f060c0870183620012a0565b60c087015160e08781019190915287015161010080880191909152870151610120808801919091528701516101408088019190915287015191506101606200163b81880184620012a0565b870151868503909101838701529050620016568382620012ba565b9695505050505050565b918252602082015260400190565b60005b838110156200168b57818101518382015260200162001671565b838111156200169b576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811462000b7b57600080fdfe6101606040523480156200001257600080fd5b50604051620024f8380380620024f883398101604081905262000035916200051c565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000432565b8383826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000125919081019062000458565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000503565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000503565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000432565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000432565b606090811b6001600160601b031990811660e05292811b8316610120521b166101405250600080546001600160a01b0319166001600160a01b0383811691909117918290556040805163eb3beb2960e01b81529051929091169163eb3beb2991600480820192602092909190829003018186803b158015620003cd57600080fd5b505afa158015620003e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000408919062000432565b600180546001600160a01b0319166001600160a01b039290921691909117905550620005af915050565b60006020828403121562000444578081fd5b8151620004518162000596565b9392505050565b600060208083850312156200046b578182fd5b82516001600160401b038082111562000482578384fd5b818501915085601f83011262000496578384fd5b815181811115620004a5578485fd5b8381029150620004b78483016200056f565b8181528481019084860184860187018a1015620004d2578788fd5b8795505b83861015620004f6578051835260019590950194918601918601620004d6565b5098975050505050505050565b60006020828403121562000515578081fd5b5051919050565b60008060006060848603121562000531578182fd5b83516200053e8162000596565b6020850151909350620005518162000596565b6040850151909250620005648162000596565b809150509250925092565b6040518181016001600160401b03811182821017156200058e57600080fd5b604052919050565b6001600160a01b0381168114620005ac57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c611e66620006926000398061049f52806107765250806101285280610b355280610e5a5280610eaf52508061037c52508061041c528061052f52806106c4528061084152508060dd528061017852806103ed528061056252806105ba528061064e52806106f352806108065280610bb85280610c1f5280610f1d5280610f5c5280610fc652508061015752806103bf528061069652806109c55280610a8a5280610d095280610dce525080609952806102d35250611e666000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611be5565b60405180910390f35b6100776100723660046119b7565b6100bb565b60405161005b9190611db5565b6100776100923660046119d3565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610117565b90505b919050565b60006101056001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085610241565b61010e83610117565b90505b92915050565b6000806101226102cc565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101b4929190611d06565b60806040518083038186803b1580156101cc57600080fd5b505afa1580156101e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102049190611b52565b5050509050818110156102265761021d818303856103a8565b925050506100c9565b8181111561023a5761021d8282038561067f565b5050919050565b6102c6846323b872dd60e01b85858560405160240161026293929190611c13565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610866565b50505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561032957600080fd5b505afa15801561033d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103619190611b2f565b91509150600060028284018161037357fe5b0490506103a0817f0000000000000000000000000000000000000000000000000000000000000000610906565b935050505090565b60006103b26118a8565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815260200185815260200160405180602001604052806000815250815250905061046c6118f1565b6040517fe969f6b30000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906104d69086908690600401611d1d565b602060405180830381600087803b1580156104f057600080fd5b505af1158015610504573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105289190611b17565b90506105547f000000000000000000000000000000000000000000000000000000000000000082610959565b61055d81610ba3565b6105877f000000000000000000000000000000000000000000000000000000000000000087610c9d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906105ef903090600401611be5565b60206040518083038186803b15801561060757600080fd5b505afa15801561061b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063f9190611b17565b90506106756001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168783610ee4565b9695505050505050565b60006106896118a8565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020018581526020016040518060200160405280600081525081525090506107436118f1565b6040517fe969f6b30000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906107ad9086908690600401611d1d565b602060405180830381600087803b1580156107c757600080fd5b505af11580156107db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ff9190611b17565b905061082b7f000000000000000000000000000000000000000000000000000000000000000087610959565b61083c61083782610f08565b610f4b565b6105877f000000000000000000000000000000000000000000000000000000000000000082610c9d565b60006060836001600160a01b0316836040516108829190611bc9565b6000604051808303816000865af19150503d80600081146108bf576040519150601f19603f3d011682016040523d82523d6000602084013e6108c4565b606091505b509150915060008214156108dc573d6000803e3d6000fd5b6102c68151600014806108fe5750818060200190518101906108fe91906119fe565b6101a2611044565b60006109158215156004611044565b670de0b6b3a764000083026109478415806109405750670de0b6b3a764000085838161093d57fe5b04145b6005611044565b82818161095057fe5b04949350505050565b6040805160028082526060828101909352816020015b610977611918565b81526020019060019003908161096f57905050905060008160008151811061099b57fe5b60200260200101516000019060028111156109b257fe5b908160028111156109bf57fe5b815250507f0000000000000000000000000000000000000000000000000000000000000000816000815181106109f157fe5b602002602001015160200181815250508181600081518110610a0f57fe5b602002602001015160600181815250508281600081518110610a2d57fe5b6020026020010151604001906001600160a01b031690816001600160a01b031681525050600281600181518110610a6057fe5b6020026020010151600001906002811115610a7757fe5b90816002811115610a8457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ab657fe5b60200260200101516020018181525050600081600181518110610ad557fe5b602002602001015160600181815250508281600181518110610af357fe5b60209081029190910101516001600160a01b03918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610b6c908490600401611c8f565b600060405180830381600087803b158015610b8657600080fd5b505af1158015610b9a573d6000803e3d6000fd5b50505050505050565b600154600090610bdd906001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000084611056565b6001546040517fead5d3590000000000000000000000000000000000000000000000000000000081529192506001600160a01b03169063ead5d35990610c4c907f0000000000000000000000000000000000000000000000000000000000000000908590600090600401611c6c565b6040805180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102c69190611b2f565b6040805160028082526060828101909352816020015b610cbb611918565b815260200190600190039081610cb3579050509050600281600081518110610cdf57fe5b6020026020010151600001906002811115610cf657fe5b90816002811115610d0357fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610d3557fe5b602002602001015160200181815250508181600081518110610d5357fe5b602002602001015160600181815250508281600081518110610d7157fe5b6020026020010151604001906001600160a01b031690816001600160a01b031681525050600181600181518110610da457fe5b6020026020010151600001906002811115610dbb57fe5b90816002811115610dc857fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610dfa57fe5b602002602001015160200181815250508181600181518110610e1857fe5b602002602001015160600181815250508281600181518110610e3657fe5b60209081029190910101516001600160a01b03918216604090910152610e7f9084167f00000000000000000000000000000000000000000000000000000000000000008461107a565b6040517fe6c460920000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610b6c908490600401611c8f565b610f038363a9059cbb60e01b8484604051602401610262929190611c53565b505050565b600154600090610f42906001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000084611056565b60010192915050565b600154610f85906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691168361107a565b6001546040517f3edd11280000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690633edd112890610ff3907f0000000000000000000000000000000000000000000000000000000000000000908590600090600401611c6c565b6040805180830381600087803b15801561100c57600080fd5b505af1158015611020573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f039190611b2f565b816110525761105281611162565b5050565b600080611063858561118f565b905061106f83826112e3565b9150505b9392505050565b801580159061111e57506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063dd62ed3e906110cb9030908690600401611bf9565b60206040518083038186803b1580156110e357600080fd5b505afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b9190611b17565b15155b15611143576111438363095ea7b360e01b846000604051602401610262929190611c37565b610f038363095ea7b360e01b8484604051602401610262929190611c53565b61118c817f42414c0000000000000000000000000000000000000000000000000000000000611316565b50565b6000611199611941565b6111a38484611391565b90506111ad611992565b6111b78585611470565b90506000816040015167ffffffffffffffff169050600083606001519050600084600001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561121457600080fd5b505afa158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190611b17565b90504283146112cd5760006112618989611502565b9050600061126e8a6115f6565b90506000866020015190506000806000611295868c60a001516112e390919063ffffffff16565b9050670de0b6b3a76400008582020492508383850110156112b557831992505b82810391506112c488836116bf565b97505050505050505b6112d78282610906565b98975050505050505050565b60008282026113078415806113005750838583816112fd57fe5b04145b6003611044565b670de0b6b3a764000081610950565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611399611941565b6040517fbf2730410000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063bf273041906113de908590600401611be5565b60c06040518083038186803b1580156113f657600080fd5b505afa925050508015611426575060408051601f3d908101601f1916820190925261142391810190611a9f565b60015b611469573d808015611454576040519150601f19603f3d011682016040523d82523d6000602084013e611459565b606091505b50611463816116d1565b50610111565b9050610111565b611478611992565b6040517ffb2557030000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063fb255703906114bd908590600401611be5565b60806040518083038186803b1580156114d557600080fd5b505afa925050508015611426575060408051601f3d908101601f1916820190925261142391810190611a3a565b60008061150f8484611758565b6040517fb1e017650000000000000000000000000000000000000000000000000000000081529091506001600160a01b0382169063b1e017659061155b90879087904290600401611c13565b60206040518083038186803b15801561157357600080fd5b505afa9250505080156115a3575060408051601f3d908101601f191682019092526115a091810190611b17565b60015b6115e6573d8080156115d1576040519150601f19603f3d011682016040523d82523d6000602084013e6115d6565b606091505b506115e0816116d1565b506115ef565b91506101119050565b5092915050565b600080611602836117f3565b9050806001600160a01b03166325ed3d446040518163ffffffff1660e01b815260040160206040518083038186803b15801561163d57600080fd5b505afa92505050801561166d575060408051601f3d908101601f1916820190925261166a91810190611b17565b60015b6116b0573d80801561169b576040519150601f19603f3d011682016040523d82523d6000602084013e6116a0565b606091505b506116aa816116d1565b506116b9565b91506100c99050565b50919050565b600082820161010e8482101583611044565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc120000000000000000000000000000000000000000000000000000000082141761174c578160208401fd5b50611052610165611162565b600080611764846117f3565b6040517f48b3eabc0000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906348b3eabc906117ae9087908790600401611bf9565b60206040518083038186803b1580156117c657600080fd5b505afa9250505080156115a3575060408051601f3d908101601f191682019092526115a091810190611a1e565b6000816001600160a01b031663bde127186040518163ffffffff1660e01b815260040160206040518083038186803b15801561182e57600080fd5b505afa92505050801561185e575060408051601f3d908101601f1916820190925261185b91810190611a1e565b60015b6118a1573d80801561188c576040519150601f19603f3d011682016040523d82523d6000602084013e611891565b606091505b5061189b816116d1565b506100c9565b90506100c9565b6040805160c0810190915260008082526020820190815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040805160808101825260008082526020820181905291810182905290606082015290565b6000602082840312156119c8578081fd5b813561010e81611e1b565b600080604083850312156119e5578081fd5b82356119f081611e1b565b946020939093013593505050565b600060208284031215611a0f578081fd5b8151801515811461010e578182fd5b600060208284031215611a2f578081fd5b815161010e81611e1b565b600060808284031215611a4b578081fd5b611a556080611dbe565b8251815260208301516020820152604083015167ffffffffffffffff81168114611a7d578283fd5b6040820152606083015160038110611a93578283fd5b60608201529392505050565b600060c08284031215611ab0578081fd5b611aba60c0611dbe565b8251611ac581611e1b565b81526020830151611ad581611e1b565b60208201526040830151611ae881611e1b565b80604083015250606083015160608201526080830151608082015260a083015160a08201528091505092915050565b600060208284031215611b28578081fd5b5051919050565b60008060408385031215611b41578182fd5b505080516020909101519092909150565b60008060008060808587031215611b67578182fd5b8451935060208501519250604085015191506060850151611b8781611e1b565b939692955090935050565b6001600160a01b03808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b60008251611bdb818460208701611de5565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0392909216825260ff16602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b602080825282518282018190526000919060409081850190868401855b82811015611cf9578151805160038110611cc257fe5b85528087015187860152858101516001600160a01b0316868601526060908101519085015260809093019290850190600101611cac565b5091979650505050505050565b9182526001600160a01b0316602082015260400190565b600060a08252835160a08301526020840151611d3881611e11565b8060c08401525060408401516001600160a01b0380821660e0850152806060870151166101008501525050608084015161012083015260a084015160c0610140840152805180610160850152610180611d978282870160208601611de5565b80601f19601f84011686010193505050506110736020830184611b92565b90815260200190565b60405181810167ffffffffffffffff81118282101715611ddd57600080fd5b604052919050565b60005b83811015611e00578181015183820152602001611de8565b838111156102c65750506000910152565b6002811061118c57fe5b6001600160a01b038116811461118c57600080fdfea264697066735822122090e565ce6d4b10ae5de465aaed55049ecc172eb4d46de92acd33f0a9fb4cf84164736f6c63430007010033a2646970667358221220a83c2d00838e8bccb749c4679dfe2c5ed617a54a3ea8d1bc76a347409c8a7a4664736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/artifact/SiloLinearPoolRebalancer.json b/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/artifact/SiloLinearPoolRebalancer.json new file mode 100644 index 0000000..a3173dd --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/artifact/SiloLinearPoolRebalancer.json @@ -0,0 +1,88 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SiloLinearPoolRebalancer", + "sourceName": "contracts/silo-linear-pool/SiloLinearPoolRebalancer.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IBalancerQueries", + "name": "queries", + "type": "address" + }, + { + "internalType": "address", + "name": "wrappedToken", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "getPool", + "outputs": [ + { + "internalType": "contract ILinearPool", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "rebalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "extraMain", + "type": "uint256" + } + ], + "name": "rebalanceWithExtraMain", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6101606040523480156200001257600080fd5b50604051620024f8380380620024f883398101604081905262000035916200051c565b336001600160a01b0316635ed312826040518163ffffffff1660e01b815260040160206040518083038186803b1580156200006f57600080fd5b505afa15801562000084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000aa919062000432565b8383826001600160a01b0316631dd746ea6040518163ffffffff1660e01b815260040160006040518083038186803b158015620000e657600080fd5b505afa158015620000fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000125919081019062000458565b836001600160a01b0316634d64cd746040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019a919062000503565b81518110620001a557fe5b602090810291909101810151610100526001600160601b0319606085901b166080526040805163038fff2d60e41b815290516001600160a01b038616926338fff2d09260048082019391829003018186803b1580156200020457600080fd5b505afa15801562000219573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023f919062000503565b60a08181525050826001600160a01b0316634de046d56040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028057600080fd5b505afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000432565b6001600160a01b031660c0816001600160a01b031660601b81525050826001600160a01b031663f174e2416040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000432565b606090811b6001600160601b031990811660e05292811b8316610120521b166101405250600080546001600160a01b0319166001600160a01b0383811691909117918290556040805163eb3beb2960e01b81529051929091169163eb3beb2991600480820192602092909190829003018186803b158015620003cd57600080fd5b505afa158015620003e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000408919062000432565b600180546001600160a01b0319166001600160a01b039290921691909117905550620005af915050565b60006020828403121562000444578081fd5b8151620004518162000596565b9392505050565b600060208083850312156200046b578182fd5b82516001600160401b038082111562000482578384fd5b818501915085601f83011262000496578384fd5b815181811115620004a5578485fd5b8381029150620004b78483016200056f565b8181528481019084860184860187018a1015620004d2578788fd5b8795505b83861015620004f6578051835260019590950194918601918601620004d6565b5098975050505050505050565b60006020828403121562000515578081fd5b5051919050565b60008060006060848603121562000531578182fd5b83516200053e8162000596565b6020850151909350620005518162000596565b6040850151909250620005648162000596565b809150509250925092565b6040518181016001600160401b03811182821017156200058e57600080fd5b604052919050565b6001600160a01b0381168114620005ac57600080fd5b50565b60805160601c60a05160c05160601c60e05160601c610100516101205160601c6101405160601c611e66620006926000398061049f52806107765250806101285280610b355280610e5a5280610eaf52508061037c52508061041c528061052f52806106c4528061084152508060dd528061017852806103ed528061056252806105ba528061064e52806106f352806108065280610bb85280610c1f5280610f1d5280610f5c5280610fc652508061015752806103bf528061069652806109c55280610a8a5280610d095280610dce525080609952806102d35250611e666000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611be5565b60405180910390f35b6100776100723660046119b7565b6100bb565b60405161005b9190611db5565b6100776100923660046119d3565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610117565b90505b919050565b60006101056001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085610241565b61010e83610117565b90505b92915050565b6000806101226102cc565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101b4929190611d06565b60806040518083038186803b1580156101cc57600080fd5b505afa1580156101e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102049190611b52565b5050509050818110156102265761021d818303856103a8565b925050506100c9565b8181111561023a5761021d8282038561067f565b5050919050565b6102c6846323b872dd60e01b85858560405160240161026293929190611c13565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610866565b50505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561032957600080fd5b505afa15801561033d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103619190611b2f565b91509150600060028284018161037357fe5b0490506103a0817f0000000000000000000000000000000000000000000000000000000000000000610906565b935050505090565b60006103b26118a8565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815260200185815260200160405180602001604052806000815250815250905061046c6118f1565b6040517fe969f6b30000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906104d69086908690600401611d1d565b602060405180830381600087803b1580156104f057600080fd5b505af1158015610504573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105289190611b17565b90506105547f000000000000000000000000000000000000000000000000000000000000000082610959565b61055d81610ba3565b6105877f000000000000000000000000000000000000000000000000000000000000000087610c9d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906105ef903090600401611be5565b60206040518083038186803b15801561060757600080fd5b505afa15801561061b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063f9190611b17565b90506106756001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168783610ee4565b9695505050505050565b60006106896118a8565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020018581526020016040518060200160405280600081525081525090506107436118f1565b6040517fe969f6b30000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906107ad9086908690600401611d1d565b602060405180830381600087803b1580156107c757600080fd5b505af11580156107db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ff9190611b17565b905061082b7f000000000000000000000000000000000000000000000000000000000000000087610959565b61083c61083782610f08565b610f4b565b6105877f000000000000000000000000000000000000000000000000000000000000000082610c9d565b60006060836001600160a01b0316836040516108829190611bc9565b6000604051808303816000865af19150503d80600081146108bf576040519150601f19603f3d011682016040523d82523d6000602084013e6108c4565b606091505b509150915060008214156108dc573d6000803e3d6000fd5b6102c68151600014806108fe5750818060200190518101906108fe91906119fe565b6101a2611044565b60006109158215156004611044565b670de0b6b3a764000083026109478415806109405750670de0b6b3a764000085838161093d57fe5b04145b6005611044565b82818161095057fe5b04949350505050565b6040805160028082526060828101909352816020015b610977611918565b81526020019060019003908161096f57905050905060008160008151811061099b57fe5b60200260200101516000019060028111156109b257fe5b908160028111156109bf57fe5b815250507f0000000000000000000000000000000000000000000000000000000000000000816000815181106109f157fe5b602002602001015160200181815250508181600081518110610a0f57fe5b602002602001015160600181815250508281600081518110610a2d57fe5b6020026020010151604001906001600160a01b031690816001600160a01b031681525050600281600181518110610a6057fe5b6020026020010151600001906002811115610a7757fe5b90816002811115610a8457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ab657fe5b60200260200101516020018181525050600081600181518110610ad557fe5b602002602001015160600181815250508281600181518110610af357fe5b60209081029190910101516001600160a01b03918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610b6c908490600401611c8f565b600060405180830381600087803b158015610b8657600080fd5b505af1158015610b9a573d6000803e3d6000fd5b50505050505050565b600154600090610bdd906001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000084611056565b6001546040517fead5d3590000000000000000000000000000000000000000000000000000000081529192506001600160a01b03169063ead5d35990610c4c907f0000000000000000000000000000000000000000000000000000000000000000908590600090600401611c6c565b6040805180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102c69190611b2f565b6040805160028082526060828101909352816020015b610cbb611918565b815260200190600190039081610cb3579050509050600281600081518110610cdf57fe5b6020026020010151600001906002811115610cf657fe5b90816002811115610d0357fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610d3557fe5b602002602001015160200181815250508181600081518110610d5357fe5b602002602001015160600181815250508281600081518110610d7157fe5b6020026020010151604001906001600160a01b031690816001600160a01b031681525050600181600181518110610da457fe5b6020026020010151600001906002811115610dbb57fe5b90816002811115610dc857fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610dfa57fe5b602002602001015160200181815250508181600181518110610e1857fe5b602002602001015160600181815250508281600181518110610e3657fe5b60209081029190910101516001600160a01b03918216604090910152610e7f9084167f00000000000000000000000000000000000000000000000000000000000000008461107a565b6040517fe6c460920000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610b6c908490600401611c8f565b610f038363a9059cbb60e01b8484604051602401610262929190611c53565b505050565b600154600090610f42906001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000084611056565b60010192915050565b600154610f85906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691168361107a565b6001546040517f3edd11280000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690633edd112890610ff3907f0000000000000000000000000000000000000000000000000000000000000000908590600090600401611c6c565b6040805180830381600087803b15801561100c57600080fd5b505af1158015611020573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f039190611b2f565b816110525761105281611162565b5050565b600080611063858561118f565b905061106f83826112e3565b9150505b9392505050565b801580159061111e57506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063dd62ed3e906110cb9030908690600401611bf9565b60206040518083038186803b1580156110e357600080fd5b505afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b9190611b17565b15155b15611143576111438363095ea7b360e01b846000604051602401610262929190611c37565b610f038363095ea7b360e01b8484604051602401610262929190611c53565b61118c817f42414c0000000000000000000000000000000000000000000000000000000000611316565b50565b6000611199611941565b6111a38484611391565b90506111ad611992565b6111b78585611470565b90506000816040015167ffffffffffffffff169050600083606001519050600084600001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561121457600080fd5b505afa158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190611b17565b90504283146112cd5760006112618989611502565b9050600061126e8a6115f6565b90506000866020015190506000806000611295868c60a001516112e390919063ffffffff16565b9050670de0b6b3a76400008582020492508383850110156112b557831992505b82810391506112c488836116bf565b97505050505050505b6112d78282610906565b98975050505050505050565b60008282026113078415806113005750838583816112fd57fe5b04145b6003611044565b670de0b6b3a764000081610950565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611399611941565b6040517fbf2730410000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063bf273041906113de908590600401611be5565b60c06040518083038186803b1580156113f657600080fd5b505afa925050508015611426575060408051601f3d908101601f1916820190925261142391810190611a9f565b60015b611469573d808015611454576040519150601f19603f3d011682016040523d82523d6000602084013e611459565b606091505b50611463816116d1565b50610111565b9050610111565b611478611992565b6040517ffb2557030000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063fb255703906114bd908590600401611be5565b60806040518083038186803b1580156114d557600080fd5b505afa925050508015611426575060408051601f3d908101601f1916820190925261142391810190611a3a565b60008061150f8484611758565b6040517fb1e017650000000000000000000000000000000000000000000000000000000081529091506001600160a01b0382169063b1e017659061155b90879087904290600401611c13565b60206040518083038186803b15801561157357600080fd5b505afa9250505080156115a3575060408051601f3d908101601f191682019092526115a091810190611b17565b60015b6115e6573d8080156115d1576040519150601f19603f3d011682016040523d82523d6000602084013e6115d6565b606091505b506115e0816116d1565b506115ef565b91506101119050565b5092915050565b600080611602836117f3565b9050806001600160a01b03166325ed3d446040518163ffffffff1660e01b815260040160206040518083038186803b15801561163d57600080fd5b505afa92505050801561166d575060408051601f3d908101601f1916820190925261166a91810190611b17565b60015b6116b0573d80801561169b576040519150601f19603f3d011682016040523d82523d6000602084013e6116a0565b606091505b506116aa816116d1565b506116b9565b91506100c99050565b50919050565b600082820161010e8482101583611044565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc120000000000000000000000000000000000000000000000000000000082141761174c578160208401fd5b50611052610165611162565b600080611764846117f3565b6040517f48b3eabc0000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906348b3eabc906117ae9087908790600401611bf9565b60206040518083038186803b1580156117c657600080fd5b505afa9250505080156115a3575060408051601f3d908101601f191682019092526115a091810190611a1e565b6000816001600160a01b031663bde127186040518163ffffffff1660e01b815260040160206040518083038186803b15801561182e57600080fd5b505afa92505050801561185e575060408051601f3d908101601f1916820190925261185b91810190611a1e565b60015b6118a1573d80801561188c576040519150601f19603f3d011682016040523d82523d6000602084013e611891565b606091505b5061189b816116d1565b506100c9565b90506100c9565b6040805160c0810190915260008082526020820190815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040805160808101825260008082526020820181905291810182905290606082015290565b6000602082840312156119c8578081fd5b813561010e81611e1b565b600080604083850312156119e5578081fd5b82356119f081611e1b565b946020939093013593505050565b600060208284031215611a0f578081fd5b8151801515811461010e578182fd5b600060208284031215611a2f578081fd5b815161010e81611e1b565b600060808284031215611a4b578081fd5b611a556080611dbe565b8251815260208301516020820152604083015167ffffffffffffffff81168114611a7d578283fd5b6040820152606083015160038110611a93578283fd5b60608201529392505050565b600060c08284031215611ab0578081fd5b611aba60c0611dbe565b8251611ac581611e1b565b81526020830151611ad581611e1b565b60208201526040830151611ae881611e1b565b80604083015250606083015160608201526080830151608082015260a083015160a08201528091505092915050565b600060208284031215611b28578081fd5b5051919050565b60008060408385031215611b41578182fd5b505080516020909101519092909150565b60008060008060808587031215611b67578182fd5b8451935060208501519250604085015191506060850151611b8781611e1b565b939692955090935050565b6001600160a01b03808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b60008251611bdb818460208701611de5565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0392909216825260ff16602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b602080825282518282018190526000919060409081850190868401855b82811015611cf9578151805160038110611cc257fe5b85528087015187860152858101516001600160a01b0316868601526060908101519085015260809093019290850190600101611cac565b5091979650505050505050565b9182526001600160a01b0316602082015260400190565b600060a08252835160a08301526020840151611d3881611e11565b8060c08401525060408401516001600160a01b0380821660e0850152806060870151166101008501525050608084015161012083015260a084015160c0610140840152805180610160850152610180611d978282870160208601611de5565b80601f19601f84011686010193505050506110736020830184611b92565b90815260200190565b60405181810167ffffffffffffffff81118282101715611ddd57600080fd5b604052919050565b60005b83811015611e00578181015183820152602001611de8565b838111156102c65750506000910152565b6002811061118c57fe5b6001600160a01b038116811461118c57600080fdfea264697066735822122090e565ce6d4b10ae5de465aaed55049ecc172eb4d46de92acd33f0a9fb4cf84164736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063026b1d5f1461004657806321c2819114610064578063df633d8d14610084575b600080fd5b61004e610097565b60405161005b9190611be5565b60405180910390f35b6100776100723660046119b7565b6100bb565b60405161005b9190611db5565b6100776100923660046119d3565b6100ce565b7f000000000000000000000000000000000000000000000000000000000000000090565b60006100c682610117565b90505b919050565b60006101056001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085610241565b61010e83610117565b90505b92915050565b6000806101226102cc565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b05f8e487f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b81526004016101b4929190611d06565b60806040518083038186803b1580156101cc57600080fd5b505afa1580156101e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102049190611b52565b5050509050818110156102265761021d818303856103a8565b925050506100c9565b8181111561023a5761021d8282038561067f565b5050919050565b6102c6846323b872dd60e01b85858560405160240161026293929190611c13565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610866565b50505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166363fe3b566040518163ffffffff1660e01b8152600401604080518083038186803b15801561032957600080fd5b505afa15801561033d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103619190611b2f565b91509150600060028284018161037357fe5b0490506103a0817f0000000000000000000000000000000000000000000000000000000000000000610906565b935050505090565b60006103b26118a8565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815260200185815260200160405180602001604052806000815250815250905061046c6118f1565b6040517fe969f6b30000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906104d69086908690600401611d1d565b602060405180830381600087803b1580156104f057600080fd5b505af1158015610504573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105289190611b17565b90506105547f000000000000000000000000000000000000000000000000000000000000000082610959565b61055d81610ba3565b6105877f000000000000000000000000000000000000000000000000000000000000000087610c9d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906105ef903090600401611be5565b60206040518083038186803b15801561060757600080fd5b505afa15801561061b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063f9190611b17565b90506106756001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168783610ee4565b9695505050505050565b60006106896118a8565b6040805160c081019091527f0000000000000000000000000000000000000000000000000000000000000000815260208101600181526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020018581526020016040518060200160405280600081525081525090506107436118f1565b6040517fe969f6b30000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e969f6b3906107ad9086908690600401611d1d565b602060405180830381600087803b1580156107c757600080fd5b505af11580156107db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ff9190611b17565b905061082b7f000000000000000000000000000000000000000000000000000000000000000087610959565b61083c61083782610f08565b610f4b565b6105877f000000000000000000000000000000000000000000000000000000000000000082610c9d565b60006060836001600160a01b0316836040516108829190611bc9565b6000604051808303816000865af19150503d80600081146108bf576040519150601f19603f3d011682016040523d82523d6000602084013e6108c4565b606091505b509150915060008214156108dc573d6000803e3d6000fd5b6102c68151600014806108fe5750818060200190518101906108fe91906119fe565b6101a2611044565b60006109158215156004611044565b670de0b6b3a764000083026109478415806109405750670de0b6b3a764000085838161093d57fe5b04145b6005611044565b82818161095057fe5b04949350505050565b6040805160028082526060828101909352816020015b610977611918565b81526020019060019003908161096f57905050905060008160008151811061099b57fe5b60200260200101516000019060028111156109b257fe5b908160028111156109bf57fe5b815250507f0000000000000000000000000000000000000000000000000000000000000000816000815181106109f157fe5b602002602001015160200181815250508181600081518110610a0f57fe5b602002602001015160600181815250508281600081518110610a2d57fe5b6020026020010151604001906001600160a01b031690816001600160a01b031681525050600281600181518110610a6057fe5b6020026020010151600001906002811115610a7757fe5b90816002811115610a8457fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610ab657fe5b60200260200101516020018181525050600081600181518110610ad557fe5b602002602001015160600181815250508281600181518110610af357fe5b60209081029190910101516001600160a01b03918216604091820152517fe6c460920000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063e6c4609290610b6c908490600401611c8f565b600060405180830381600087803b158015610b8657600080fd5b505af1158015610b9a573d6000803e3d6000fd5b50505050505050565b600154600090610bdd906001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000084611056565b6001546040517fead5d3590000000000000000000000000000000000000000000000000000000081529192506001600160a01b03169063ead5d35990610c4c907f0000000000000000000000000000000000000000000000000000000000000000908590600090600401611c6c565b6040805180830381600087803b158015610c6557600080fd5b505af1158015610c79573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102c69190611b2f565b6040805160028082526060828101909352816020015b610cbb611918565b815260200190600190039081610cb3579050509050600281600081518110610cdf57fe5b6020026020010151600001906002811115610cf657fe5b90816002811115610d0357fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600081518110610d3557fe5b602002602001015160200181815250508181600081518110610d5357fe5b602002602001015160600181815250508281600081518110610d7157fe5b6020026020010151604001906001600160a01b031690816001600160a01b031681525050600181600181518110610da457fe5b6020026020010151600001906002811115610dbb57fe5b90816002811115610dc857fe5b815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610dfa57fe5b602002602001015160200181815250508181600181518110610e1857fe5b602002602001015160600181815250508281600181518110610e3657fe5b60209081029190910101516001600160a01b03918216604090910152610e7f9084167f00000000000000000000000000000000000000000000000000000000000000008461107a565b6040517fe6c460920000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e6c4609290610b6c908490600401611c8f565b610f038363a9059cbb60e01b8484604051602401610262929190611c53565b505050565b600154600090610f42906001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000084611056565b60010192915050565b600154610f85906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691168361107a565b6001546040517f3edd11280000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690633edd112890610ff3907f0000000000000000000000000000000000000000000000000000000000000000908590600090600401611c6c565b6040805180830381600087803b15801561100c57600080fd5b505af1158015611020573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f039190611b2f565b816110525761105281611162565b5050565b600080611063858561118f565b905061106f83826112e3565b9150505b9392505050565b801580159061111e57506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063dd62ed3e906110cb9030908690600401611bf9565b60206040518083038186803b1580156110e357600080fd5b505afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b9190611b17565b15155b15611143576111438363095ea7b360e01b846000604051602401610262929190611c37565b610f038363095ea7b360e01b8484604051602401610262929190611c53565b61118c817f42414c0000000000000000000000000000000000000000000000000000000000611316565b50565b6000611199611941565b6111a38484611391565b90506111ad611992565b6111b78585611470565b90506000816040015167ffffffffffffffff169050600083606001519050600084600001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561121457600080fd5b505afa158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190611b17565b90504283146112cd5760006112618989611502565b9050600061126e8a6115f6565b90506000866020015190506000806000611295868c60a001516112e390919063ffffffff16565b9050670de0b6b3a76400008582020492508383850110156112b557831992505b82810391506112c488836116bf565b97505050505050505b6112d78282610906565b98975050505050505050565b60008282026113078415806113005750838583816112fd57fe5b04145b6003611044565b670de0b6b3a764000081610950565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b611399611941565b6040517fbf2730410000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063bf273041906113de908590600401611be5565b60c06040518083038186803b1580156113f657600080fd5b505afa925050508015611426575060408051601f3d908101601f1916820190925261142391810190611a9f565b60015b611469573d808015611454576040519150601f19603f3d011682016040523d82523d6000602084013e611459565b606091505b50611463816116d1565b50610111565b9050610111565b611478611992565b6040517ffb2557030000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063fb255703906114bd908590600401611be5565b60806040518083038186803b1580156114d557600080fd5b505afa925050508015611426575060408051601f3d908101601f1916820190925261142391810190611a3a565b60008061150f8484611758565b6040517fb1e017650000000000000000000000000000000000000000000000000000000081529091506001600160a01b0382169063b1e017659061155b90879087904290600401611c13565b60206040518083038186803b15801561157357600080fd5b505afa9250505080156115a3575060408051601f3d908101601f191682019092526115a091810190611b17565b60015b6115e6573d8080156115d1576040519150601f19603f3d011682016040523d82523d6000602084013e6115d6565b606091505b506115e0816116d1565b506115ef565b91506101119050565b5092915050565b600080611602836117f3565b9050806001600160a01b03166325ed3d446040518163ffffffff1660e01b815260040160206040518083038186803b15801561163d57600080fd5b505afa92505050801561166d575060408051601f3d908101601f1916820190925261166a91810190611b17565b60015b6116b0573d80801561169b576040519150601f19603f3d011682016040523d82523d6000602084013e6116a0565b606091505b506116aa816116d1565b506116b9565b91506100c99050565b50919050565b600082820161010e8482101583611044565b805160208201517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb0000000000000000000000000000000000000000000000000000000081147ffa61cc120000000000000000000000000000000000000000000000000000000082141761174c578160208401fd5b50611052610165611162565b600080611764846117f3565b6040517f48b3eabc0000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906348b3eabc906117ae9087908790600401611bf9565b60206040518083038186803b1580156117c657600080fd5b505afa9250505080156115a3575060408051601f3d908101601f191682019092526115a091810190611a1e565b6000816001600160a01b031663bde127186040518163ffffffff1660e01b815260040160206040518083038186803b15801561182e57600080fd5b505afa92505050801561185e575060408051601f3d908101601f1916820190925261185b91810190611a1e565b60015b6118a1573d80801561188c576040519150601f19603f3d011682016040523d82523d6000602084013e611891565b606091505b5061189b816116d1565b506100c9565b90506100c9565b6040805160c0810190915260008082526020820190815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001606081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6040805160808101825260008082526020820181905291810182905290606082015290565b6000602082840312156119c8578081fd5b813561010e81611e1b565b600080604083850312156119e5578081fd5b82356119f081611e1b565b946020939093013593505050565b600060208284031215611a0f578081fd5b8151801515811461010e578182fd5b600060208284031215611a2f578081fd5b815161010e81611e1b565b600060808284031215611a4b578081fd5b611a556080611dbe565b8251815260208301516020820152604083015167ffffffffffffffff81168114611a7d578283fd5b6040820152606083015160038110611a93578283fd5b60608201529392505050565b600060c08284031215611ab0578081fd5b611aba60c0611dbe565b8251611ac581611e1b565b81526020830151611ad581611e1b565b60208201526040830151611ae881611e1b565b80604083015250606083015160608201526080830151608082015260a083015160a08201528091505092915050565b600060208284031215611b28578081fd5b5051919050565b60008060408385031215611b41578182fd5b505080516020909101519092909150565b60008060008060808587031215611b67578182fd5b8451935060208501519250604085015191506060850151611b8781611e1b565b939692955090935050565b6001600160a01b03808251168352602082015115156020840152806040830151166040840152506060810151151560608301525050565b60008251611bdb818460208701611de5565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0392909216825260ff16602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b602080825282518282018190526000919060409081850190868401855b82811015611cf9578151805160038110611cc257fe5b85528087015187860152858101516001600160a01b0316868601526060908101519085015260809093019290850190600101611cac565b5091979650505050505050565b9182526001600160a01b0316602082015260400190565b600060a08252835160a08301526020840151611d3881611e11565b8060c08401525060408401516001600160a01b0380821660e0850152806060870151166101008501525050608084015161012083015260a084015160c0610140840152805180610160850152610180611d978282870160208601611de5565b80601f19601f84011686010193505050506110736020830184611b92565b90815260200190565b60405181810167ffffffffffffffff81118282101715611ddd57600080fd5b604052919050565b60005b83811015611e00578181015183820152602001611de8565b838111156102c65750506000910152565b6002811061118c57fe5b6001600160a01b038116811461118c57600080fdfea264697066735822122090e565ce6d4b10ae5de465aaed55049ecc172eb4d46de92acd33f0a9fb4cf84164736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/index.ts b/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/index.ts new file mode 100644 index 0000000..9213018 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/index.ts @@ -0,0 +1,149 @@ +import { bn, fp } from '@helpers/numbers'; +import { Task, TaskMode, TaskRunOptions } from '@src'; +import { SiloLinearPoolDeployment } from './input'; +import { ZERO_ADDRESS } from '@helpers/constants'; +import * as expectEvent from '@helpers/expectEvent'; +import { ethers } from 'hardhat'; +import { getContractDeploymentTransactionHash, saveContractDeploymentTransactionHash } from '@src'; +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as SiloLinearPoolDeployment; + const args = [ + input.Vault, + input.ProtocolFeePercentagesProvider, + input.BalancerQueries, + input.FactoryVersion, + input.PoolVersion, + input.InitialPauseWindowDuration, + input.BufferPeriodDuration, + ]; + + // Enums needed for Mock Silos interest data + enum AssetStatus { + Undefined, + Active, + Removed, + } + + const factory = await task.deployAndVerify('SiloLinearPoolFactory', args, from, force); + + if (task.mode === TaskMode.LIVE) { + // We also create a Pool using the factory and verify it, to let us compute their action IDs and so that future + // Pools are automatically verified. We however don't run any of this code in CHECK mode, since we don't care about + // the contracts deployed here. The action IDs will be checked to be correct via a different mechanism. + + // A Silo requires a Silo Repository + const mockSiloRepoArgs = [0, 0]; + const mockSiloRepo = await task.deployAndVerify('MockSiloRepository', mockSiloRepoArgs, from, force); + + // shareTokens require a Silo liquidity pool + const mockSiloArgs = [mockSiloRepo.address, input.WETH]; + const mockSilo = await task.deployAndVerify('MockSilo', mockSiloArgs, from, force); + + // SiloLinearPools require an Silo Token + const mockShareTokenArgs = ['DO NOT USE - Mock Share Token', 'TEST', mockSilo.address, input.WETH, 18]; + const mockShareToken = await task.deployAndVerify('MockShareToken', mockShareTokenArgs, from, force); + + // It is necessary to set a total supply for the shareToken, as well as initialize assetStorage and interestData within the mockSilo. + // This is done in order to avoid divide by 0 errors when creating a MockSiloLinearPool from the Factory. + await mockShareToken.setTotalSupply(fp(1)); + await mockSilo.setAssetStorage( + input.WETH, + mockShareToken.address, + mockShareToken.address, + mockShareToken.address, + fp(1), + fp(1), + fp(1) + ); + + await mockSilo.setInterestData( + input.WETH, // interestBearingAsset + 0, // harvestedProtocolFees + 0, // protocolFees + 0, // interestRateTimestamp + AssetStatus.Active // status + ); + + // The assetManager, pauseWindowDuration and bufferPeriodDuration will be filled in later, but we need to declare + // them here to appease the type system. Those are constructor arguments, but automatically provided by the factory. + const mockPoolArgs = { + vault: input.Vault, + name: 'DO NOT USE - Mock Linear Pool', + symbol: 'TEST', + mainToken: input.WETH, + wrappedToken: mockShareToken.address, + assetManager: undefined, + upperTarget: 0, + pauseWindowDuration: undefined, + bufferPeriodDuration: undefined, + swapFeePercentage: bn(1e12), + owner: ZERO_ADDRESS, + version: input.PoolVersion, + }; + + // This mimics the logic inside task.deploy + if (force || !task.output({ ensure: false })['MockSiloLinearPool']) { + const PROTOCOL_ID = 0; + + const poolCreationReceipt = await ( + await factory.create( + mockPoolArgs.name, + mockPoolArgs.symbol, + mockPoolArgs.mainToken, + mockPoolArgs.wrappedToken, + mockPoolArgs.upperTarget, + mockPoolArgs.swapFeePercentage, + mockPoolArgs.owner, + PROTOCOL_ID + ) + ).wait(); + + const event = expectEvent.inReceipt(poolCreationReceipt, 'PoolCreated'); + const mockPoolAddress = event.args.pool; + + await saveContractDeploymentTransactionHash(mockPoolAddress, poolCreationReceipt.transactionHash, task.network); + await task.save({ MockSiloLinearPool: mockPoolAddress }); + } + + const mockSiloLinearPool = await task.instanceAt('SiloLinearPool', task.output()['MockSiloLinearPool']); + + // In order to verify the Pool's code, we need to complete its constructor arguments by computing the factory + // provided arguments (asset manager and pause durations). + + // The asset manager is found by querying the Vault + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, task.network); + const vault = await vaultTask.deployedInstance('Vault'); + + const { assetManager: assetManagerAddress } = await vault.getPoolTokenInfo( + await mockSiloLinearPool.getPoolId(), + input.WETH + ); + mockPoolArgs.assetManager = assetManagerAddress; + + // The durations require knowing when the Pool was created, so we look for the timestamp of its creation block. + + const txHash = await getContractDeploymentTransactionHash(mockSiloLinearPool.address, task.network); + + const tx = await ethers.provider.getTransactionReceipt(txHash); + const poolCreationBlock = await ethers.provider.getBlock(tx.blockNumber); + + // With those and the period end times, we can compute the durations. + + const { pauseWindowEndTime, bufferPeriodEndTime } = await mockSiloLinearPool.getPausedState(); + + mockPoolArgs.pauseWindowDuration = pauseWindowEndTime.sub(poolCreationBlock.timestamp); + mockPoolArgs.bufferPeriodDuration = bufferPeriodEndTime + .sub(poolCreationBlock.timestamp) + .sub(mockPoolArgs.pauseWindowDuration); + + // We are now ready to verify the Pool + await task.verify('SiloLinearPool', mockSiloLinearPool.address, [mockPoolArgs]); + + // We can also verify the Asset Manager + await task.verify('SiloLinearPoolRebalancer', assetManagerAddress, [ + input.Vault, + input.BalancerQueries, + mockShareToken.address, + ]); + } +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/input.ts b/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/input.ts new file mode 100644 index 0000000..2812273 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/input.ts @@ -0,0 +1,31 @@ +import { Task, TaskMode } from '@src'; +import { MONTH } from '@helpers/time'; + +export type SiloLinearPoolDeployment = { + Vault: string; + BalancerQueries: string; + ProtocolFeePercentagesProvider: string; + WETH: string; + FactoryVersion: string; + PoolVersion: string; + InitialPauseWindowDuration: number; + BufferPeriodDuration: number; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerQueries = new Task('20220721-balancer-queries', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); +const WETH = new Task('00000000-tokens', TaskMode.READ_ONLY); + +const BaseVersion = { version: 1, deployment: '20230315-silo-linear-pool' }; + +export default { + Vault, + BalancerQueries, + ProtocolFeePercentagesProvider, + WETH, + FactoryVersion: JSON.stringify({ name: 'SiloLinearPoolFactory', ...BaseVersion }), + PoolVersion: JSON.stringify({ name: 'SiloLinearPool', ...BaseVersion }), + InitialPauseWindowDuration: MONTH * 3, + BufferPeriodDuration: MONTH, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/output/goerli.json new file mode 100644 index 0000000..675739f --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/output/goerli.json @@ -0,0 +1,7 @@ +{ + "SiloLinearPoolFactory": "0x18C100415988bEF4354EfFAd1188d1c22041B046", + "MockSiloRepository": "0xac190662aD9b53A4E6D4CD321dbf5d3ECD0E29b0", + "MockSilo": "0x144245D4223FC7e4D463401a30522C960298a16e", + "MockShareToken": "0x3eFCeb450fb799f67cd97cDC27a0F4Cd7B02B63B", + "MockSiloLinearPool": "0x58cA9F130d2e27EC94d19e53a6BEb2C4084f2638" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/output/mainnet.json new file mode 100644 index 0000000..125744a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/output/mainnet.json @@ -0,0 +1,7 @@ +{ + "SiloLinearPoolFactory": "0xfd1c0e6f02f71842b6ffF7CdC7A017eE1Fd3CdAC", + "MockSiloRepository": "0xdB6dF721A6E7Fdb97363079B01F107860Ac156F9", + "MockSilo": "0xE719Aef17468c7e10c0c205be62C990754DFF7E5", + "MockShareToken": "0xBc4099300E69Ff4e52F3b18728054EF00449b9e5", + "MockSiloLinearPool": "0x395d8A1D9aD82B5ABE558F8AbbFe183B27138af4" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/readme.md b/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/readme.md new file mode 100644 index 0000000..cfa09d0 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/readme.md @@ -0,0 +1,16 @@ +# 2022-03-15 - Silo Linear Pool + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> This deployment has been deprecated in favor of a new version that uses create2 for pool deployments: [silo-linear-pool-v2](../../20230410-silo-linear-pool-v2/). + +First deployment of the `SiloLinearPoolFactory`, for Linear Pools with a Silo yield-bearing token (shareToken). +Already fixes the reentrancy issue described in https://forum.balancer.fi/t/reentrancy-vulnerability-scope-expanded/4345. +Also has a fix in the `SiloLinearPoolRebalancer` to handle tokens which require the `SafeERC20` library for approvals. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Goerli testnet addresses](./output/goerli.json) +- [`SiloLinearPool` artifact](./artifact/SiloLinearPool.json) +- [`SiloLinearPoolFactory` artifact](./artifact/SiloLinearPoolFactory.json) +- [`SiloLinearPoolRebalancer` artifact](./artifact/SiloLinearPoolRebalancer.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/test/test.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/test/test.fork.ts new file mode 100644 index 0000000..36971d7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230315-silo-linear-pool/test/test.fork.ts @@ -0,0 +1,358 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { setCode } from '@nomicfoundation/hardhat-network-helpers'; +import * as expectEvent from '@helpers/expectEvent'; +import { bn, fp, FP_ONE } from '@helpers/numbers'; +import { MAX_UINT256 } from '@helpers/constants'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/dist/src/signer-with-address'; + +import { impersonate, getForkedNetwork, Task, TaskMode, getSigners } from '@src'; +import { describeForkTest } from '@src'; +import { instanceAt, getArtifact } from '@src'; + +export enum SwapKind { + GivenIn = 0, + GivenOut, +} + +describeForkTest('SiloLinearPoolFactory', 'mainnet', 16478568, function () { + let owner: SignerWithAddress, holder: SignerWithAddress, other: SignerWithAddress; + let factory: Contract, vault: Contract, usdc: Contract; + let rebalancer: Contract; + + let task: Task; + + // USDC Mainnet address + const USDC = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'; + // Share Token address for USDC + const sUSDC = '0x416DE9AD46C53AAAb2352F91120952393946d2ac'; + // USDC holder address + const USDC_HOLDER = '0xda9ce944a37d218c3302f6b82a094844c6eceb17'; + // USDC Silo Address + const USDC_SILO = '0xfccc27aabd0ab7a0b2ad2b7760037b1eab61616b'; + + // Scaling factory is 1e12 due to USDC only having 6 decimals + const USDC_SCALING = bn(1e12); + + const SWAP_FEE_PERCENTAGE = fp(0.01); // 1% + + // The targets are set using 18 decimals, even if the token has fewer (as is the case for USDC); + const INITIAL_UPPER_TARGET = fp(1e6); + + // The initial midpoint (upper target / 2) must be between the final lower and upper targets + const FINAL_LOWER_TARGET = fp(0.2e6); + const FINAL_UPPER_TARGET = fp(5e6); + + const PROTOCOL_ID = 5; + + let pool: Contract; + let poolId: string; + + before('run task', async () => { + task = new Task('20230315-silo-linear-pool', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('SiloLinearPoolFactory'); + }); + + before('load signers', async () => { + [, owner, other] = await getSigners(); + + holder = await impersonate(USDC_HOLDER, fp(100)); + }); + + before('setup contracts', async () => { + vault = await new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance('Vault'); + + usdc = await task.instanceAt('IERC20', USDC); + await usdc.connect(holder).approve(vault.address, MAX_UINT256); + }); + + enum LinearPoolState { + BALANCED, + MAIN_EXCESS, + MAIN_LACK, + } + + function itRebalancesThePool(expectedState: LinearPoolState) { + it('rebalance the pool', async () => { + const { lowerTarget, upperTarget } = await pool.getTargets(); + + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + + let fees; + + if (scaledCash.gt(upperTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_EXCESS); + + const excess = scaledCash.sub(upperTarget); + fees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else if (scaledCash.lt(lowerTarget)) { + expect(expectedState).to.equal(LinearPoolState.MAIN_LACK); + + const lack = lowerTarget.sub(scaledCash); + fees = lack.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + } else { + expect(expectedState).to.equal(LinearPoolState.BALANCED); + + fees = 0; + } + + const initialRecipientMainBalance = await usdc.balanceOf(other.address); + + if (expectedState != LinearPoolState.BALANCED) { + await rebalancer.connect(holder).rebalance(other.address); + } else { + await rebalancer.connect(holder).rebalanceWithExtraMain(other.address, 5); + } + const finalRecipientMainBalance = await usdc.balanceOf(other.address); + + if (fees > 0) { + // The recipient of the rebalance call should get the fees that were collected (though there's some rounding + // error in the main-wrapped conversion). + expect(finalRecipientMainBalance.sub(initialRecipientMainBalance)).to.be.almostEqual( + fees.div(USDC_SCALING), + 0.000001 + ); + } else { + // The recipient of the rebalance call will get any extra main tokens that were not utilized. + expect(finalRecipientMainBalance).to.be.almostEqual(initialRecipientMainBalance, 0.000001); + } + + const mainInfo = await vault.getPoolTokenInfo(poolId, USDC); + + const expectedMainBalance = lowerTarget.add(upperTarget).div(2); + expect(mainInfo.cash.mul(USDC_SCALING)).to.equal(expectedMainBalance); + expect(mainInfo.managed).to.equal(0); + }); + } + + describe('create and check getters', () => { + it('deploy a linear pool', async () => { + const tx = await factory.create( + 'USDC', + 'sUSDC', + USDC, + sUSDC, + INITIAL_UPPER_TARGET, + SWAP_FEE_PERCENTAGE, + owner.address, + PROTOCOL_ID + ); + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + + pool = await task.instanceAt('SiloLinearPool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + poolId = await pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + const { assetManager } = await vault.getPoolTokenInfo(poolId, USDC); // We could query for either frxEth or SiloToken + rebalancer = await task.instanceAt('SiloLinearPoolRebalancer', assetManager); + + await usdc.connect(holder).approve(rebalancer.address, MAX_UINT256); // To send extra main on rebalance + }); + + it('check factory version', async () => { + const expectedFactoryVersion = { + name: 'SiloLinearPoolFactory', + version: 1, + deployment: '20230315-silo-linear-pool', + }; + + expect(await factory.version()).to.equal(JSON.stringify(expectedFactoryVersion)); + }); + + it('check pool version', async () => { + const expectedPoolVersion = { + name: 'SiloLinearPool', + version: 1, + deployment: '20230315-silo-linear-pool', + }; + + expect(await pool.version()).to.equal(JSON.stringify(expectedPoolVersion)); + }); + }); + + describe('join, and rebalance', () => { + it('join the pool', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const joinAmount = INITIAL_UPPER_TARGET.mul(2).div(USDC_SCALING); + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: USDC, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert join amount - some fees will be collected as we're going over the upper target. + const excess = joinAmount.mul(USDC_SCALING).sub(INITIAL_UPPER_TARGET); + const joinCollectedFees = excess.mul(SWAP_FEE_PERCENTAGE).div(FP_ONE); + + const expectedBPT = joinAmount.mul(USDC_SCALING).sub(joinCollectedFees); + expect(await pool.balanceOf(holder.address)).to.equal(expectedBPT); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + + it('set final targets', async () => { + await pool.connect(owner).setTargets(FINAL_LOWER_TARGET, FINAL_UPPER_TARGET); + }); + }); + + describe('generate excess of main token and rebalance', () => { + it('deposit main tokens', async () => { + // We're going to join with enough main token to bring the Pool above its upper target, which will let us later + // rebalance. + + const { upperTarget } = await pool.getTargets(); + const joinAmount = upperTarget.mul(5).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: USDC, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_EXCESS); + }); + + describe('generate lack of main token and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to withdraw enough man token to bring the Pool below its lower target, which will let us later + // rebalance. + + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.MAIN_LACK); + }); + + describe('join below upper target and rebalance', () => { + it('deposit main tokens', async () => { + // We're going to join with few tokens, causing the Pool to not reach its upper target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const joinAmount = midpoint.div(100).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenIn, + poolId, + assetIn: USDC, + assetOut: pool.address, + amount: joinAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('exit above lower target and rebalance', () => { + it('withdraw main tokens', async () => { + // We're going to exit with few tokens, causing for the Pool to not reach its lower target. + + const { lowerTarget, upperTarget } = await pool.getTargets(); + const midpoint = lowerTarget.add(upperTarget).div(2); + + const exitAmount = midpoint.div(100).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + }); + + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalance repeatedly', () => { + itRebalancesThePool(LinearPoolState.BALANCED); + itRebalancesThePool(LinearPoolState.BALANCED); + }); + + describe('rebalancer query protection', async () => { + it('reverts with a malicious lending pool', async () => { + const { cash } = await vault.getPoolTokenInfo(poolId, USDC); + const scaledCash = cash.mul(USDC_SCALING); + const { lowerTarget } = await pool.getTargets(); + + const exitAmount = scaledCash.sub(lowerTarget.div(3)).div(USDC_SCALING); + + await vault.connect(holder).swap( + { + kind: SwapKind.GivenOut, + poolId, + assetIn: pool.address, + assetOut: USDC, + amount: exitAmount, + userData: '0x', + }, + { sender: holder.address, recipient: holder.address, fromInternalBalance: false, toInternalBalance: false }, + MAX_UINT256, + MAX_UINT256 + ); + + // Using MockSilo from 20230410-silo-linear-pool-v2 + await setCode(USDC_SILO, getArtifact('MockSilo').deployedBytecode); + const mockLendingPool = await instanceAt('MockSilo', USDC_SILO); + + await mockLendingPool.setRevertType(2); // Type 2 is malicious swap query revert + await expect(rebalancer.rebalance(other.address)).to.be.revertedWith('BAL#357'); // MALICIOUS_QUERY_REVERT + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20230316-avax-child-chain-gauge-factory-v2/artifact/ChildChainGauge.json b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-child-chain-gauge-factory-v2/artifact/ChildChainGauge.json new file mode 100644 index 0000000..56b65b8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-child-chain-gauge-factory-v2/artifact/ChildChainGauge.json @@ -0,0 +1,1043 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ChildChainGauge", + "sourceName": "@balancer-labs/liquidity-mining/contracts/gauges/ChildChainGauge.vy", + "abi": [ + { + "name": "Approval", + "inputs": [ + { + "name": "_owner", + "type": "address", + "indexed": true + }, + { + "name": "_spender", + "type": "address", + "indexed": true + }, + { + "name": "_value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Transfer", + "inputs": [ + { + "name": "_from", + "type": "address", + "indexed": true + }, + { + "name": "_to", + "type": "address", + "indexed": true + }, + { + "name": "_value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Deposit", + "inputs": [ + { + "name": "_user", + "type": "address", + "indexed": true + }, + { + "name": "_value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "Withdraw", + "inputs": [ + { + "name": "_user", + "type": "address", + "indexed": true + }, + { + "name": "_value", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "name": "UpdateLiquidityLimit", + "inputs": [ + { + "name": "_user", + "type": "address", + "indexed": true + }, + { + "name": "_original_balance", + "type": "uint256", + "indexed": false + }, + { + "name": "_original_supply", + "type": "uint256", + "indexed": false + }, + { + "name": "_working_balance", + "type": "uint256", + "indexed": false + }, + { + "name": "_working_supply", + "type": "uint256", + "indexed": false + } + ], + "anonymous": false, + "type": "event" + }, + { + "stateMutability": "nonpayable", + "type": "constructor", + "inputs": [ + { + "name": "_voting_escrow_delegation_proxy", + "type": "address" + }, + { + "name": "_bal_pseudo_minter", + "type": "address" + }, + { + "name": "_authorizer_adaptor", + "type": "address" + }, + { + "name": "_version", + "type": "string" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit", + "inputs": [ + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit", + "inputs": [ + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_user", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "withdraw", + "inputs": [ + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "withdraw", + "inputs": [ + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_user", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "permit", + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_deadline", + "type": "uint256" + }, + { + "name": "_v", + "type": "uint8" + }, + { + "name": "_r", + "type": "bytes32" + }, + { + "name": "_s", + "type": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "transfer", + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "increaseAllowance", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_added_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "decreaseAllowance", + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_subtracted_value", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "user_checkpoint", + "inputs": [ + { + "name": "addr", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claimable_tokens", + "inputs": [ + { + "name": "addr", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "claimed_reward", + "inputs": [ + { + "name": "_addr", + "type": "address" + }, + { + "name": "_token", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "claimable_reward", + "inputs": [ + { + "name": "_user", + "type": "address" + }, + { + "name": "_reward_token", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "set_rewards_receiver", + "inputs": [ + { + "name": "_receiver", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claim_rewards", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claim_rewards", + "inputs": [ + { + "name": "_addr", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claim_rewards", + "inputs": [ + { + "name": "_addr", + "type": "address" + }, + { + "name": "_receiver", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "claim_rewards", + "inputs": [ + { + "name": "_addr", + "type": "address" + }, + { + "name": "_receiver", + "type": "address" + }, + { + "name": "_reward_indexes", + "type": "uint256[]" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "add_reward", + "inputs": [ + { + "name": "_reward_token", + "type": "address" + }, + { + "name": "_distributor", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "set_reward_distributor", + "inputs": [ + { + "name": "_reward_token", + "type": "address" + }, + { + "name": "_distributor", + "type": "address" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "deposit_reward_token", + "inputs": [ + { + "name": "_reward_token", + "type": "address" + }, + { + "name": "_amount", + "type": "uint256" + } + ], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "killGauge", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "unkillGauge", + "inputs": [], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "decimals", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "allowance", + "inputs": [ + { + "name": "owner", + "type": "address" + }, + { + "name": "spender", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_checkpoint", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "bal_token", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "bal_pseudo_minter", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "voting_escrow_delegation_proxy", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "authorizer_adaptor", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "nonpayable", + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "_lp_token", + "type": "address" + }, + { + "name": "_version", + "type": "string" + } + ], + "outputs": [] + }, + { + "stateMutability": "view", + "type": "function", + "name": "DOMAIN_SEPARATOR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "nonces", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "lp_token", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "version", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "factory", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "working_balances", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "working_supply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "period", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "period_timestamp", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_checkpoint_of", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_fraction", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_inv_supply", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "integrate_inv_supply_of", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_count", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_tokens", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_data", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "components": [ + { + "name": "distributor", + "type": "address" + }, + { + "name": "period_finish", + "type": "uint256" + }, + { + "name": "rate", + "type": "uint256" + }, + { + "name": "last_update", + "type": "uint256" + }, + { + "name": "integral", + "type": "uint256" + } + ] + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "rewards_receiver", + "inputs": [ + { + "name": "arg0", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "address" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "reward_integral_for", + "inputs": [ + { + "name": "arg0", + "type": "address" + }, + { + "name": "arg1", + "type": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "is_killed", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool" + } + ] + }, + { + "stateMutability": "view", + "type": "function", + "name": "inflation_rate", + "inputs": [ + { + "name": "arg0", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256" + } + ] + } + ], + "bytecode": "0x602061305d6000396000518060a01c61305857604052602061307d6000396000518060a01c61305857606052602061309d6000396000518060a01c6130585760805260206130bd600039600051608060208261305d01600039600051116130585760208161305d016000396000518060a05260208201818161305d0160c03950505061dead600b5560a05180600c556000602082601f0104600481116130585780156100bf57905b6020810260c0015181600d01556001018181186100a7575b50505061dead6011556040516300002f09526060516300002ee95263c0039699610140526020610140600461015c6060515afa610101573d600060003e3d6000fd5b60203d1061305857610140518060a01c6130585761018052610180516300002ec9526080516300002f4952638d928af8610140526020610140600461015c6080515afa610153573d600060003e3d6000fd5b60203d1061305857610140518060a01c6130585761018052610180516300002f2952612ec961018e630000000039612ec960a0016300000000f3600436101561000d5761216d565b60003560e01c34612ec45763b6b55f25811861002d57336106e052610048565b636e553f6581186101ec576024358060a01c612ec4576106e0525b600054612ec45760016000556106e051604052610063612173565b60043561006f576101e5565b600a546107005260096106e0516020526000526040600020546004358181830110612ec45780820190509050610720526000601a54146100d3576106e05161018052610700516101a05260006101c05260006101e0526000610200526100d3612765565b610700516004358181830110612ec45780820190509050610700526107205160096106e05160205260005260406000205561070051600a556106e0516040526107205160605261070051608052610128612523565b6323b872dd61074052336107605230610780526004356107a0526020610740606461075c6000600b545af1610162573d600060003e3d6000fd5b60203d10612ec457610740518060011c612ec4576107c0526107c0506106e0517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c600435610740526020610740a26106e05160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600435610740526020610740a35b6000600055005b632e1a7d4d811861020157336106e05261021b565b62f714ce81186103ad576024358060a01c612ec4576106e0525b600054612ec45760016000556106e051604052610236612173565b600435610242576103a6565b600a5461070052600933602052600052604060002054600435808210612ec45780820390509050610720526000601a54146102a1576106e05161018052610700516101a05260006101c05260006101e0526000610200526102a1612765565b61070051600435808210612ec45780820390509050610700526107205160093360205260005260406000205561070051600a553360405261072051606052610700516080526102ee612523565b63a9059cbb610740526106e05161076052600435610780526020610740604461075c6000600b545af1610326573d600060003e3d6000fd5b60203d10612ec457610740518060011c612ec4576107a0526107a0506106e0517f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364600435610740526020610740a26000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600435610740526020610740a35b6000600055005b6323b872dd8118610492576004358060a01c612ec4576107e0526024358060a01c612ec45761080052600054612ec45760016000556107e051604052336060526103f8610840612e60565b61084051610820527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61082051146104615761082051604435808210612ec4578082039050905060086107e0516020526000526040600020803360205260005260406000209050555b6107e0516106e052610800516107005260443561072052610480612ce7565b60016108405260206108406000600055f35b63095ea7b38118610509576004358060a01c612ec4576040526024356008336020526000526040600020806040516020526000526040600020905055604051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560243560605260206060a3600160605260206060f35b63d505accf81186109d5576004358060a01c612ec4576040526024358060a01c612ec4576060526084358060081c612ec457608052600060405114156105a657600d60a0527f494e56414c49445f4f574e45520000000000000000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b60643542111561060d57601060a0527f444541444c494e455f455850495245440000000000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b600260405160205260005260406000205460a05260006002610360527f1901000000000000000000000000000000000000000000000000000000000000610380526103608051602082018361058001815181525050808301925050506001548161058001526020810190507f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96104a0526040516104c0526060516104e0526044356105005260a051610520526064356105405260c0610480526104808051602082012090508161058001526020810190508061056052610560905080516020820120905060c05260006040513b116107a15760c051610100526080516101205260a4356101405260c4356101605260206000608061010060015afa5060005160e05260405160e0511461094d57600b610100527f494e56414c49445f534947000000000000000000000000000000000000000000610120526101005061010051806101200181600003601f1636823750506308c379a060c052602060e052601f19601f61010051011660440160dcfd61094d565b600060a4356101805260c4356101a05260406101605261016080516020820183610240018281848460045afa90505050808301925050506080516101c0526101c06020602011612ec457601f81018051610200525060016101e0526101e090508051602082018361024001815181525050808301925050508061022052610220905080518060e0526020820181610100838360045afa9050905050507f1626ba7e00000000000000000000000000000000000000000000000000000000631626ba7e61016052604060c05161018052806101a052806101800160e0518082526020820181818361010060045afa90505050805180602083010181600003601f163682375050601f19601f82516020010116905081015050602061016060c461017c6040515afa6108d6573d600060003e3d6000fd5b60203d10612ec457610160511461094d57600b610240527f494e56414c49445f534947000000000000000000000000000000000000000000610260526102405061024051806102600181600003601f1636823750506308c379a061020052602061022052601f19601f61024051011660440161021cfd5b6044356008604051602052600052604060002080606051602052600052604060002090505560a05160018181830110612ec4578082019050905060026040516020526000526040600020556060516040517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560443560e052602060e0a3600160e052602060e0f35b63a9059cbb8118610a29576004358060a01c612ec4576107e052600054612ec4576001600055336106e0526107e0516107005260243561072052610a17612ce7565b60016108005260206108006000600055f35b63395093518118610acd576004358060a01c612ec45760805233604052608051606052610a5660c0612e60565b60c0516024358181830110612ec4578082019050905060a05260a0516008336020526000526040600020806080516020526000526040600020905055608051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560a05160c052602060c0a3600160c052602060c0f35b63a457c2d78118610b6f576004358060a01c612ec45760805233604052608051606052610afa60c0612e60565b60c051602435808210612ec4578082039050905060a05260a0516008336020526000526040600020806080516020526000526040600020905055608051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560a05160c052602060c0a3600160c052602060c0f35b634b8200938118610bcf576004358060a01c612ec4576101a0526101a051604052610b98612173565b6101a05160405260096101a051602052600052604060002054606052600a54608052610bc2612523565b60016101c05260206101c0f35b63331345838118610c6b576004358060a01c612ec4576101805261018051604052610bf8612173565b601761018051602052600052604060002054638b752bb06101a052610180516101c052306101e05260206101a060446101bc6020612ee96000396000515afa610c46573d600060003e3d6000fd5b60203d10612ec4576101a051808210612ec45780820390509050610200526020610200f35b63e77e74378118610cd6576004358060a01c612ec4576040526024358060a01c612ec457606052602660405160205260005260406000208060605160205260005260406000209050547001000000000000000000000000000000008082069050905060805260206080f35b6333fd6f748118610ea0576004358060a01c612ec4576040526024358060a01c612ec4576060526023606051602052600052604060002060048101905054608052600a5460a052600060a05114610dec574260236060516020526000526040600020600181019050548082811882841002189050905060c05260c0516023606051602052600052604060002060038101905054808210612ec4578082039050905060e05260805160e0516023606051602052600052604060002060028101905054808202821582848304141715612ec45790509050670de0b6b3a7640000808202821582848304141715612ec4579050905060a051808015612ec4578204905090508181830110612ec457808201905090506080525b6025606051602052600052604060002080604051602052600052604060002090505460c052600960405160205260005260406000205460805160c051808210612ec45780820390509050808202821582848304141715612ec45790509050670de0b6b3a76400008082049050905060e0526026604051602052600052604060002080606051602052600052604060002090505460801c60e0518181830110612ec45780820190509050610100526020610100f35b63bdf981168118610ecd576004358060a01c612ec457604052604051602433602052600052604060002055005b63e6f1daf28118610ee957336106e05260403661070037610f95565b6384e9bd7e8118610f0f576004358060a01c612ec4576106e05260403661070037610f95565b639faceb1b8118610f43576004358060a01c612ec4576106e0526024358060a01c612ec45761070052600061072052610f95565b632a6acd978118611065576004358060a01c612ec4576106e0526024358060a01c612ec457610700526044356004016008813511612ec457803580610720526020820160208202808261074037505050505b600054612ec45760016000556000610700511461101c57336106e0511461101c576015610840527f43414e4e4f545f52454449524543545f434c41494d0000000000000000000000610860526108405061084051806108600181600003601f1636823750506308c379a061080052602061082052601f19601f61084051011660440161081cfd5b6106e05161018052600a546101a05260016101c052610700516101e05261072051806102005260208102806102208261074060045afa9050505061105e612765565b6000600055005b63e8de0d4d811861128c576004358060a01c612ec4576040526024358060a01c612ec4576060526020612f4960003960005133146110fa5760126080527f53454e4445525f4e4f545f414c4c4f574544000000000000000000000000000060a0526080506080518060a00181600003601f1636823750506308c379a06040526020606052601f19601f6080510116604401605cfd5b6020612ec9600039600051604051141561116b5760156080527f43414e4e4f545f4144445f42414c5f524557415244000000000000000000000060a0526080506080518060a00181600003601f1636823750506308c379a06040526020606052601f19601f6080510116604401605cfd5b601a546080526008608051106111d857601360a0527f4d41585f524557415244535f524541434845440000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b60236040516020526000526040600020541561124b57601560a0527f5245574152445f414c52454144595f455849535453000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b60605160236040516020526000526040600020556040516080516008811015612ec457601b015560805160018181830110612ec45780820190509050601a55005b63058a3a24811861145e576004358060a01c612ec4576040526024358060a01c612ec45760605260236040516020526000526040600020546080523360805160c0526020612f4960003960005160e052600060a05260006002905b6020810260c0015183186112ff57600160a05261130a565b6001018181186112e7575b505060a0519050611378576012610100527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000610120526101005061010051806101200181600003601f1636823750506308c379a060c052602060e052601f19601f61010051011660440160dcfd5b600060805114156113e057601060a0527f5245574152445f4e4f545f41444445440000000000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b6000606051141561144857601360a0527f494e56414c49445f4449535452494255544f520000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b6060516023604051602052600052604060002055005b6393f7aa67811861174b576004358060a01c612ec4576106e052600054612ec457600160005560236106e0516020526000526040600020543314611502576012610700527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000610720526107005061070051806107200181600003601f1636823750506308c379a06106c05260206106e052601f19601f6107005101166044016106dcfd5b600061018052600a546101a05260006101c05260006101e052600061020052611529612765565b6323b872dd610744526004336107645230610784526024356107a452606001610740526107405060206108006107405161076060006106e0515af1611573573d600060003e3d6000fd5b6107e060203d8082116115865781611588565b805b9050905081528051806107005260208201805161072052505050600061070051146116265761072051610700516020036008021c611626576015610740527f5452414e534645525f46524f4d5f4641494c5552450000000000000000000000610760526107405061074051806107600181600003601f1636823750506308c379a061070052602061072052601f19601f61074051011660440161071cfd5b60236106e05160205260005260406000206001810190505461074052610740514210156116d7576107405142808210612ec45780820390509050610760526107605160236106e051602052600052604060002060028101905054808202821582848304141715612ec4579050905061078052602435610780518181830110612ec4578082019050905062093a808082049050905060236106e0516020526000526040600020600281019050556116fe565b60243562093a808082049050905060236106e0516020526000526040600020600281019050555b4260236106e0516020526000526040600020600381019050554262093a808181830110612ec4578082019050905060236106e0516020526000526040600020600181019050556000600055005b63ab8f094581186117cb576020612f4960003960005133146117c45760126040527f53454e4445525f4e4f545f414c4c4f57454400000000000000000000000000006060526040506040518060600181600003601f1636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6001602755005b63d34fb267811861184b576020612f4960003960005133146118445760126040527f53454e4445525f4e4f545f414c4c4f57454400000000000000000000000000006060526040506040518060600181600003601f1636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6000602755005b63313ce567811861186157601260405260206040f35b63dd62ed3e81186118a4576004358060a01c612ec4576080526024358060a01c612ec45760a052602060805160405260a0516060526118a060c0612e60565b60c0f35b63d31f3f6d81186118c957601560145460205260005260406000205460405260206040f35b6329421d5081186118e8576020612ec960003960005160405260206040f35b6339f4caba8118611907576020612ee960003960005160405260206040f35b636246c22e8118611926576020612f0960003960005160405260206040f35b6355341bc38118611945576020612f4960003960005160405260206040f35b63f399e22e8118611cca576004358060a01c612ec4576040526024356004016080813511612ec457803580606052602082018181608037505050600b54156119ea576013610100527f414c52454144595f494e495449414c495a454400000000000000000000000000610120526101005061010051806101200181600003601f1636823750506308c379a060c052602060e052601f19601f61010051011660440160dcfd5b604051600b5560605180600c556000602082601f010460048111612ec4578015611a2857905b602081026080015181600d0155600101818118611a10575b505050336011556395d89b41610140526060610140600461015c6040515afa611a56573d600060003e3d6000fd5b60403d10612ec4576101405161014001601a815111612ec4578051806101c0526020820180516101e0525050506101c08051806101005260208201805161012052505050600060096101a0527f42616c616e6365722000000000000000000000000000000000000000000000006101c0526101a080516020820183610240018151815250508083019250505061010051816102400161012051815250808201915050600e6101e0527f204761756765204465706f736974000000000000000000000000000000000000610200526101e080516020820183610240018151815250508083019250505080610220526102209050805180610140526020820181610160838360045afa90509050505061014051806003556000602082601f010460028111612ec4578015611b9d57905b6020810261016001518160040155600101818118611b84575b50505060006101005181610200016101205181525080820191505060066101a0527f2d676175676500000000000000000000000000000000000000000000000000006101c0526101a0805160208201836102000181518152505080830192505050806101e0526101e0905080518060065560208201805160075550505042601560006020526000526040600020557f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6103c05261014051610160206103e052600c5480610300526000602082601f010460048111612ec4578015611c9657905b80600d0154602082026103200152600101818118611c7d575b505050610300805160208201209050610400524661042052306104405260a06103a0526103a0805160208201209050600155005b633644e5158118611ce15760015460405260206040f35b637ecebe008118611d14576004358060a01c612ec457604052600260405160205260005260406000205460605260206060f35b6306fdde038118611d915760208060405280604001600354808252602082016000602083601f010460028111612ec4578015611d6357905b806004015460208202840152600101818118611d4c575b50505050805180602083010181600003601f163682375050601f19601f825160200101169050810190506040f35b6395d89b418118611de157602080604052806040016006548082526020820160075481525050805180602083010181600003601f163682375050601f19601f825160200101169050810190506040f35b6370a082318118611e14576004358060a01c612ec457604052600960405160205260005260406000205460605260206060f35b6318160ddd8118611e2b57600a5460405260206040f35b6382c630668118611e4257600b5460405260206040f35b6354fd4d508118611ebf5760208060405280604001600c54808252602082016000602083601f010460048111612ec4578015611e9157905b80600d015460208202840152600101818118611e7a575b50505050805180602083010181600003601f163682375050601f19601f825160200101169050810190506040f35b63c45a01558118611ed65760115460405260206040f35b6313ecb1ca8118611f09576004358060a01c612ec457604052601260405160205260005260406000205460605260206060f35b6317e280898118611f205760135460405260206040f35b63ef78d4fd8118611f375760145460405260206040f35b637598108c8118611f5c57601560043560205260005260406000205460405260206040f35b639bd324f28118611f8f576004358060a01c612ec457604052601660405160205260005260406000205460605260206060f35b63094007078118611fc2576004358060a01c612ec457604052601760405160205260005260406000205460605260206060f35b63fec8ee0c8118611fe757601860043560205260005260406000205460405260206040f35b63de263bfa811861201a576004358060a01c612ec457604052601960405160205260005260406000205460605260206060f35b63963c94b9811861203157601a5460405260206040f35b6354c49fe98118612055576004356008811015612ec457601b015460405260206040f35b6348e9c65e81186120aa576004358060a01c612ec4576040526023604051602052600052604060002080546060526001810154608052600281015460a052600381015460c052600481015460e0525060a06060f35b6301ddabf181186120dd576004358060a01c612ec457604052602460405160205260005260406000205460605260206060f35b63f05cc058811861212f576004358060a01c612ec4576040526024358060a01c612ec4576060526025604051602052600052604060002080606051602052600052604060002090505460805260206080f35b639c868ac081186121465760275460405260206040f35b63fadd59ab811861216b57602860043560205260005260406000205460405260206040f35b505b60006000fd5b6014546060526015606051602052600052604060002054608052601860605160205260005260406000205460a05260805142116121b15760006121b6565b602754155b156123085760135460c05260805160e05260805162093a808181830110612ec4578082019050905062093a808082049050905062093a80808202821582848304141715612ec457905090504280828118828410021890509050610100526000610100905b80610120526101005160e051808210612ec4578082039050905061014052600060c051146122ba5760a051602860e05162093a8080820490509050602052600052604060002054670de0b6b3a7640000808202821582848304141715612ec4579050905061014051808202821582848304141715612ec4579050905060c051808015612ec4578204905090508181830110612ec4578082019050905060a0525b4261010051186122c957612305565b6101005160e0526101005162093a808181830110612ec4578082019050905042808281188284100218905090506101005260010181811861221a575b50505b6370a0823160e0523061010052602060e0602460fc6020612ec96000396000515afa612339573d600060003e3d6000fd5b60203d10612ec45760e05160c052600060c05114612435574262093a808082049050905060e052602860e0516020526000526040600020805460c05160e05160018181830110612ec4578082019050905062093a80808202821582848304141715612ec4579050905042808210612ec45780820390509050808015612ec4578204905090508181830110612ec4578082019050905081555063a9059cbb610100526020612ee96000396000516101205260c051610140526020610100604461011c60006020612ec96000396000515af1612418573d600060003e3d6000fd5b60203d10612ec457610100518060011c612ec45761016052610160505b60605160018181830110612ec4578082019050905060605260605160145542601560605160205260005260406000205560a0516018606051602052600052604060002055601260405160205260005260406000205460e05260176040516020526000526040600020805460e05160a0516019604051602052600052604060002054808210612ec45780820390509050808202821582848304141715612ec45790509050670de0b6b3a7640000808204905090508181830110612ec4578082019050905081555060a0516019604051602052600052604060002055426016604051602052600052604060002055565b6060516028808202821582848304141715612ec4579050905060648082049050905060a0526020612f0960003960005160c052600060c05114612655576318160ddd610100526020610100600461011c60c0515afa612587573d600060003e3d6000fd5b60203d10612ec4576101005160e052600060e0511461265557632579841861012052604051610140526020610120602461013c60c0515afa6125ce573d600060003e3d6000fd5b60203d10612ec457610120516101005260a05160805161010051808202821582848304141715612ec4579050905060e051808015612ec457820490509050603c808202821582848304141715612ec457905090506064808204905090508181830110612ec4578082019050905060a05260605160a0518082811882841002189050905060a0525b601260405160205260005260406000205460e05260a051601260405160205260005260406000205560135460a0518181830110612ec4578082019050905060e051808210612ec4578082039050905061010052610100516013556040517f7ecd84343f76a23d2227290e0288da3251b045541698e575a5515af4f04197a3606051610120526080516101405260a0516101605261010051610180526080610120a2565b600060405260006008905b8061016052601a54610160511061271957612743565b60405160078111612ec4576001810160405261016051602082026060015250600101818118612703575b50506040518082526020810260208301818183606060045afa90509050505050565b6000610320526101e05161034052600061018051146127d557600961018051602052600052604060002054610320526101c0516127a35760006127a9565b6101e051155b156127d55760246101805160205260005260406000205461034052610340516127d55761018051610340525b601a5461036052600061038052610200511561280d5761020051806103805260208102806103a08261022060045afa9050505061283d565b6128186104a06126f8565b6104a0805180610380526020820160208202806103a0828460045afa90509050905050505b60006103805160088111612ec4578015612ce357905b602081026103a001516104a052610360516104a051106128d35760146104c0527f494e56414c49445f5245574152445f494e4445580000000000000000000000006104e0526104c0506104c051806104e00181600003601f1636823750506308c379a06104805260206104a052601f19601f6104c051011660440161049cfd5b6104a0516008811015612ec457601b01546104c05260236104c0516020526000526040600020600481019050546104e0524260236104c05160205260005260406000206001810190505480828118828410021890509050610500526105005160236104c051602052600052604060002060038101905054808210612ec457808203905090506105205260006105205114612a21576105005160236104c05160205260005260406000206003810190505560006101a05114612a21576104e0516105205160236104c051602052600052604060002060028101905054808202821582848304141715612ec45790509050670de0b6b3a7640000808202821582848304141715612ec457905090506101a051808015612ec4578204905090508181830110612ec457808201905090506104e0526104e05160236104c0516020526000526040600020600481019050555b60006101805114612cd85760256104c051602052600052604060002080610180516020526000526040600020905054610540526000610560526104e051610540511015612ad3576104e05160256104c051602052600052604060002080610180516020526000526040600020905055610320516104e05161054051808210612ec45780820390509050808202821582848304141715612ec45790509050670de0b6b3a764000080820490509050610560525b6026610180516020526000526040600020806104c0516020526000526040600020905054610580526105805160801c610560518181830110612ec457808201905090506105a05260006105a0511115612cd85761058051700100000000000000000000000000000000808206905090506105c0526101c051612b9f576000610560511115612cd8576105c0516105a05160801b8181830110612ec457808201905090506026610180516020526000526040600020806104c0516020526000526040600020905055612cd8565b63a9059cbb61062452600461034051610644526105a05161066452604001610620526106205060206106c06106205161064060006104c0515af1612be8573d600060003e3d6000fd5b6106a060203d808211612bfb5781612bfd565b805b9050905081528051806105e0526020820180516106005250505060006105e05114612c9b57610600516105e0516020036008021c612c9b576010610620527f5452414e534645525f4641494c55524500000000000000000000000000000000610640526106205061062051806106400181600003601f1636823750506308c379a06105e052602061060052601f19601f6106205101166044016105fcfd5b6105c0516105a0518181830110612ec457808201905090506026610180516020526000526040600020806104c05160205260005260406000209050555b600101818118612853575b5050565b61072051612cf457612e5e565b600a54610740526000601a541415610760526106e0516107a052610700516107c05260006002905b602081026107a001516107805261078051604052612d38612173565b6107805161018052610740516101a05260006101c05260006101e052600061020052612d62612765565b600101818118612d1c57505060096106e05160205260005260406000205461072051808210612ec45780820390509050610780526107805160096106e0516020526000526040600020556106e0516040526107805160605261074051608052612dc9612523565b600961070051602052600052604060002054610720518181830110612ec457808201905090506107805261078051600961070051602052600052604060002055610700516040526107805160605261074051608052612e26612523565b610700516106e0517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610720516107a05260206107a0a35b565b6020612f2960003960005160605118612e9c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815250612ec2565b600860405160205260005260406000208060605160205260005260406000209050548152505b565b600080fd005b600080fd", + "deployedBytecode": "0x600436101561000d5761216d565b60003560e01c34612ec45763b6b55f25811861002d57336106e052610048565b636e553f6581186101ec576024358060a01c612ec4576106e0525b600054612ec45760016000556106e051604052610063612173565b60043561006f576101e5565b600a546107005260096106e0516020526000526040600020546004358181830110612ec45780820190509050610720526000601a54146100d3576106e05161018052610700516101a05260006101c05260006101e0526000610200526100d3612765565b610700516004358181830110612ec45780820190509050610700526107205160096106e05160205260005260406000205561070051600a556106e0516040526107205160605261070051608052610128612523565b6323b872dd61074052336107605230610780526004356107a0526020610740606461075c6000600b545af1610162573d600060003e3d6000fd5b60203d10612ec457610740518060011c612ec4576107c0526107c0506106e0517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c600435610740526020610740a26106e05160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600435610740526020610740a35b6000600055005b632e1a7d4d811861020157336106e05261021b565b62f714ce81186103ad576024358060a01c612ec4576106e0525b600054612ec45760016000556106e051604052610236612173565b600435610242576103a6565b600a5461070052600933602052600052604060002054600435808210612ec45780820390509050610720526000601a54146102a1576106e05161018052610700516101a05260006101c05260006101e0526000610200526102a1612765565b61070051600435808210612ec45780820390509050610700526107205160093360205260005260406000205561070051600a553360405261072051606052610700516080526102ee612523565b63a9059cbb610740526106e05161076052600435610780526020610740604461075c6000600b545af1610326573d600060003e3d6000fd5b60203d10612ec457610740518060011c612ec4576107a0526107a0506106e0517f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364600435610740526020610740a26000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600435610740526020610740a35b6000600055005b6323b872dd8118610492576004358060a01c612ec4576107e0526024358060a01c612ec45761080052600054612ec45760016000556107e051604052336060526103f8610840612e60565b61084051610820527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61082051146104615761082051604435808210612ec4578082039050905060086107e0516020526000526040600020803360205260005260406000209050555b6107e0516106e052610800516107005260443561072052610480612ce7565b60016108405260206108406000600055f35b63095ea7b38118610509576004358060a01c612ec4576040526024356008336020526000526040600020806040516020526000526040600020905055604051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560243560605260206060a3600160605260206060f35b63d505accf81186109d5576004358060a01c612ec4576040526024358060a01c612ec4576060526084358060081c612ec457608052600060405114156105a657600d60a0527f494e56414c49445f4f574e45520000000000000000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b60643542111561060d57601060a0527f444541444c494e455f455850495245440000000000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b600260405160205260005260406000205460a05260006002610360527f1901000000000000000000000000000000000000000000000000000000000000610380526103608051602082018361058001815181525050808301925050506001548161058001526020810190507f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96104a0526040516104c0526060516104e0526044356105005260a051610520526064356105405260c0610480526104808051602082012090508161058001526020810190508061056052610560905080516020820120905060c05260006040513b116107a15760c051610100526080516101205260a4356101405260c4356101605260206000608061010060015afa5060005160e05260405160e0511461094d57600b610100527f494e56414c49445f534947000000000000000000000000000000000000000000610120526101005061010051806101200181600003601f1636823750506308c379a060c052602060e052601f19601f61010051011660440160dcfd61094d565b600060a4356101805260c4356101a05260406101605261016080516020820183610240018281848460045afa90505050808301925050506080516101c0526101c06020602011612ec457601f81018051610200525060016101e0526101e090508051602082018361024001815181525050808301925050508061022052610220905080518060e0526020820181610100838360045afa9050905050507f1626ba7e00000000000000000000000000000000000000000000000000000000631626ba7e61016052604060c05161018052806101a052806101800160e0518082526020820181818361010060045afa90505050805180602083010181600003601f163682375050601f19601f82516020010116905081015050602061016060c461017c6040515afa6108d6573d600060003e3d6000fd5b60203d10612ec457610160511461094d57600b610240527f494e56414c49445f534947000000000000000000000000000000000000000000610260526102405061024051806102600181600003601f1636823750506308c379a061020052602061022052601f19601f61024051011660440161021cfd5b6044356008604051602052600052604060002080606051602052600052604060002090505560a05160018181830110612ec4578082019050905060026040516020526000526040600020556060516040517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560443560e052602060e0a3600160e052602060e0f35b63a9059cbb8118610a29576004358060a01c612ec4576107e052600054612ec4576001600055336106e0526107e0516107005260243561072052610a17612ce7565b60016108005260206108006000600055f35b63395093518118610acd576004358060a01c612ec45760805233604052608051606052610a5660c0612e60565b60c0516024358181830110612ec4578082019050905060a05260a0516008336020526000526040600020806080516020526000526040600020905055608051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560a05160c052602060c0a3600160c052602060c0f35b63a457c2d78118610b6f576004358060a01c612ec45760805233604052608051606052610afa60c0612e60565b60c051602435808210612ec4578082039050905060a05260a0516008336020526000526040600020806080516020526000526040600020905055608051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560a05160c052602060c0a3600160c052602060c0f35b634b8200938118610bcf576004358060a01c612ec4576101a0526101a051604052610b98612173565b6101a05160405260096101a051602052600052604060002054606052600a54608052610bc2612523565b60016101c05260206101c0f35b63331345838118610c6b576004358060a01c612ec4576101805261018051604052610bf8612173565b601761018051602052600052604060002054638b752bb06101a052610180516101c052306101e05260206101a060446101bc6020612ee96000396000515afa610c46573d600060003e3d6000fd5b60203d10612ec4576101a051808210612ec45780820390509050610200526020610200f35b63e77e74378118610cd6576004358060a01c612ec4576040526024358060a01c612ec457606052602660405160205260005260406000208060605160205260005260406000209050547001000000000000000000000000000000008082069050905060805260206080f35b6333fd6f748118610ea0576004358060a01c612ec4576040526024358060a01c612ec4576060526023606051602052600052604060002060048101905054608052600a5460a052600060a05114610dec574260236060516020526000526040600020600181019050548082811882841002189050905060c05260c0516023606051602052600052604060002060038101905054808210612ec4578082039050905060e05260805160e0516023606051602052600052604060002060028101905054808202821582848304141715612ec45790509050670de0b6b3a7640000808202821582848304141715612ec4579050905060a051808015612ec4578204905090508181830110612ec457808201905090506080525b6025606051602052600052604060002080604051602052600052604060002090505460c052600960405160205260005260406000205460805160c051808210612ec45780820390509050808202821582848304141715612ec45790509050670de0b6b3a76400008082049050905060e0526026604051602052600052604060002080606051602052600052604060002090505460801c60e0518181830110612ec45780820190509050610100526020610100f35b63bdf981168118610ecd576004358060a01c612ec457604052604051602433602052600052604060002055005b63e6f1daf28118610ee957336106e05260403661070037610f95565b6384e9bd7e8118610f0f576004358060a01c612ec4576106e05260403661070037610f95565b639faceb1b8118610f43576004358060a01c612ec4576106e0526024358060a01c612ec45761070052600061072052610f95565b632a6acd978118611065576004358060a01c612ec4576106e0526024358060a01c612ec457610700526044356004016008813511612ec457803580610720526020820160208202808261074037505050505b600054612ec45760016000556000610700511461101c57336106e0511461101c576015610840527f43414e4e4f545f52454449524543545f434c41494d0000000000000000000000610860526108405061084051806108600181600003601f1636823750506308c379a061080052602061082052601f19601f61084051011660440161081cfd5b6106e05161018052600a546101a05260016101c052610700516101e05261072051806102005260208102806102208261074060045afa9050505061105e612765565b6000600055005b63e8de0d4d811861128c576004358060a01c612ec4576040526024358060a01c612ec4576060526020612f4960003960005133146110fa5760126080527f53454e4445525f4e4f545f414c4c4f574544000000000000000000000000000060a0526080506080518060a00181600003601f1636823750506308c379a06040526020606052601f19601f6080510116604401605cfd5b6020612ec9600039600051604051141561116b5760156080527f43414e4e4f545f4144445f42414c5f524557415244000000000000000000000060a0526080506080518060a00181600003601f1636823750506308c379a06040526020606052601f19601f6080510116604401605cfd5b601a546080526008608051106111d857601360a0527f4d41585f524557415244535f524541434845440000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b60236040516020526000526040600020541561124b57601560a0527f5245574152445f414c52454144595f455849535453000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b60605160236040516020526000526040600020556040516080516008811015612ec457601b015560805160018181830110612ec45780820190509050601a55005b63058a3a24811861145e576004358060a01c612ec4576040526024358060a01c612ec45760605260236040516020526000526040600020546080523360805160c0526020612f4960003960005160e052600060a05260006002905b6020810260c0015183186112ff57600160a05261130a565b6001018181186112e7575b505060a0519050611378576012610100527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000610120526101005061010051806101200181600003601f1636823750506308c379a060c052602060e052601f19601f61010051011660440160dcfd5b600060805114156113e057601060a0527f5245574152445f4e4f545f41444445440000000000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b6000606051141561144857601360a0527f494e56414c49445f4449535452494255544f520000000000000000000000000060c05260a05060a0518060c00181600003601f1636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b6060516023604051602052600052604060002055005b6393f7aa67811861174b576004358060a01c612ec4576106e052600054612ec457600160005560236106e0516020526000526040600020543314611502576012610700527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000610720526107005061070051806107200181600003601f1636823750506308c379a06106c05260206106e052601f19601f6107005101166044016106dcfd5b600061018052600a546101a05260006101c05260006101e052600061020052611529612765565b6323b872dd610744526004336107645230610784526024356107a452606001610740526107405060206108006107405161076060006106e0515af1611573573d600060003e3d6000fd5b6107e060203d8082116115865781611588565b805b9050905081528051806107005260208201805161072052505050600061070051146116265761072051610700516020036008021c611626576015610740527f5452414e534645525f46524f4d5f4641494c5552450000000000000000000000610760526107405061074051806107600181600003601f1636823750506308c379a061070052602061072052601f19601f61074051011660440161071cfd5b60236106e05160205260005260406000206001810190505461074052610740514210156116d7576107405142808210612ec45780820390509050610760526107605160236106e051602052600052604060002060028101905054808202821582848304141715612ec4579050905061078052602435610780518181830110612ec4578082019050905062093a808082049050905060236106e0516020526000526040600020600281019050556116fe565b60243562093a808082049050905060236106e0516020526000526040600020600281019050555b4260236106e0516020526000526040600020600381019050554262093a808181830110612ec4578082019050905060236106e0516020526000526040600020600181019050556000600055005b63ab8f094581186117cb576020612f4960003960005133146117c45760126040527f53454e4445525f4e4f545f414c4c4f57454400000000000000000000000000006060526040506040518060600181600003601f1636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6001602755005b63d34fb267811861184b576020612f4960003960005133146118445760126040527f53454e4445525f4e4f545f414c4c4f57454400000000000000000000000000006060526040506040518060600181600003601f1636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6000602755005b63313ce567811861186157601260405260206040f35b63dd62ed3e81186118a4576004358060a01c612ec4576080526024358060a01c612ec45760a052602060805160405260a0516060526118a060c0612e60565b60c0f35b63d31f3f6d81186118c957601560145460205260005260406000205460405260206040f35b6329421d5081186118e8576020612ec960003960005160405260206040f35b6339f4caba8118611907576020612ee960003960005160405260206040f35b636246c22e8118611926576020612f0960003960005160405260206040f35b6355341bc38118611945576020612f4960003960005160405260206040f35b63f399e22e8118611cca576004358060a01c612ec4576040526024356004016080813511612ec457803580606052602082018181608037505050600b54156119ea576013610100527f414c52454144595f494e495449414c495a454400000000000000000000000000610120526101005061010051806101200181600003601f1636823750506308c379a060c052602060e052601f19601f61010051011660440160dcfd5b604051600b5560605180600c556000602082601f010460048111612ec4578015611a2857905b602081026080015181600d0155600101818118611a10575b505050336011556395d89b41610140526060610140600461015c6040515afa611a56573d600060003e3d6000fd5b60403d10612ec4576101405161014001601a815111612ec4578051806101c0526020820180516101e0525050506101c08051806101005260208201805161012052505050600060096101a0527f42616c616e6365722000000000000000000000000000000000000000000000006101c0526101a080516020820183610240018151815250508083019250505061010051816102400161012051815250808201915050600e6101e0527f204761756765204465706f736974000000000000000000000000000000000000610200526101e080516020820183610240018151815250508083019250505080610220526102209050805180610140526020820181610160838360045afa90509050505061014051806003556000602082601f010460028111612ec4578015611b9d57905b6020810261016001518160040155600101818118611b84575b50505060006101005181610200016101205181525080820191505060066101a0527f2d676175676500000000000000000000000000000000000000000000000000006101c0526101a0805160208201836102000181518152505080830192505050806101e0526101e0905080518060065560208201805160075550505042601560006020526000526040600020557f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6103c05261014051610160206103e052600c5480610300526000602082601f010460048111612ec4578015611c9657905b80600d0154602082026103200152600101818118611c7d575b505050610300805160208201209050610400524661042052306104405260a06103a0526103a0805160208201209050600155005b633644e5158118611ce15760015460405260206040f35b637ecebe008118611d14576004358060a01c612ec457604052600260405160205260005260406000205460605260206060f35b6306fdde038118611d915760208060405280604001600354808252602082016000602083601f010460028111612ec4578015611d6357905b806004015460208202840152600101818118611d4c575b50505050805180602083010181600003601f163682375050601f19601f825160200101169050810190506040f35b6395d89b418118611de157602080604052806040016006548082526020820160075481525050805180602083010181600003601f163682375050601f19601f825160200101169050810190506040f35b6370a082318118611e14576004358060a01c612ec457604052600960405160205260005260406000205460605260206060f35b6318160ddd8118611e2b57600a5460405260206040f35b6382c630668118611e4257600b5460405260206040f35b6354fd4d508118611ebf5760208060405280604001600c54808252602082016000602083601f010460048111612ec4578015611e9157905b80600d015460208202840152600101818118611e7a575b50505050805180602083010181600003601f163682375050601f19601f825160200101169050810190506040f35b63c45a01558118611ed65760115460405260206040f35b6313ecb1ca8118611f09576004358060a01c612ec457604052601260405160205260005260406000205460605260206060f35b6317e280898118611f205760135460405260206040f35b63ef78d4fd8118611f375760145460405260206040f35b637598108c8118611f5c57601560043560205260005260406000205460405260206040f35b639bd324f28118611f8f576004358060a01c612ec457604052601660405160205260005260406000205460605260206060f35b63094007078118611fc2576004358060a01c612ec457604052601760405160205260005260406000205460605260206060f35b63fec8ee0c8118611fe757601860043560205260005260406000205460405260206040f35b63de263bfa811861201a576004358060a01c612ec457604052601960405160205260005260406000205460605260206060f35b63963c94b9811861203157601a5460405260206040f35b6354c49fe98118612055576004356008811015612ec457601b015460405260206040f35b6348e9c65e81186120aa576004358060a01c612ec4576040526023604051602052600052604060002080546060526001810154608052600281015460a052600381015460c052600481015460e0525060a06060f35b6301ddabf181186120dd576004358060a01c612ec457604052602460405160205260005260406000205460605260206060f35b63f05cc058811861212f576004358060a01c612ec4576040526024358060a01c612ec4576060526025604051602052600052604060002080606051602052600052604060002090505460805260206080f35b639c868ac081186121465760275460405260206040f35b63fadd59ab811861216b57602860043560205260005260406000205460405260206040f35b505b60006000fd5b6014546060526015606051602052600052604060002054608052601860605160205260005260406000205460a05260805142116121b15760006121b6565b602754155b156123085760135460c05260805160e05260805162093a808181830110612ec4578082019050905062093a808082049050905062093a80808202821582848304141715612ec457905090504280828118828410021890509050610100526000610100905b80610120526101005160e051808210612ec4578082039050905061014052600060c051146122ba5760a051602860e05162093a8080820490509050602052600052604060002054670de0b6b3a7640000808202821582848304141715612ec4579050905061014051808202821582848304141715612ec4579050905060c051808015612ec4578204905090508181830110612ec4578082019050905060a0525b4261010051186122c957612305565b6101005160e0526101005162093a808181830110612ec4578082019050905042808281188284100218905090506101005260010181811861221a575b50505b6370a0823160e0523061010052602060e0602460fc6020612ec96000396000515afa612339573d600060003e3d6000fd5b60203d10612ec45760e05160c052600060c05114612435574262093a808082049050905060e052602860e0516020526000526040600020805460c05160e05160018181830110612ec4578082019050905062093a80808202821582848304141715612ec4579050905042808210612ec45780820390509050808015612ec4578204905090508181830110612ec4578082019050905081555063a9059cbb610100526020612ee96000396000516101205260c051610140526020610100604461011c60006020612ec96000396000515af1612418573d600060003e3d6000fd5b60203d10612ec457610100518060011c612ec45761016052610160505b60605160018181830110612ec4578082019050905060605260605160145542601560605160205260005260406000205560a0516018606051602052600052604060002055601260405160205260005260406000205460e05260176040516020526000526040600020805460e05160a0516019604051602052600052604060002054808210612ec45780820390509050808202821582848304141715612ec45790509050670de0b6b3a7640000808204905090508181830110612ec4578082019050905081555060a0516019604051602052600052604060002055426016604051602052600052604060002055565b6060516028808202821582848304141715612ec4579050905060648082049050905060a0526020612f0960003960005160c052600060c05114612655576318160ddd610100526020610100600461011c60c0515afa612587573d600060003e3d6000fd5b60203d10612ec4576101005160e052600060e0511461265557632579841861012052604051610140526020610120602461013c60c0515afa6125ce573d600060003e3d6000fd5b60203d10612ec457610120516101005260a05160805161010051808202821582848304141715612ec4579050905060e051808015612ec457820490509050603c808202821582848304141715612ec457905090506064808204905090508181830110612ec4578082019050905060a05260605160a0518082811882841002189050905060a0525b601260405160205260005260406000205460e05260a051601260405160205260005260406000205560135460a0518181830110612ec4578082019050905060e051808210612ec4578082039050905061010052610100516013556040517f7ecd84343f76a23d2227290e0288da3251b045541698e575a5515af4f04197a3606051610120526080516101405260a0516101605261010051610180526080610120a2565b600060405260006008905b8061016052601a54610160511061271957612743565b60405160078111612ec4576001810160405261016051602082026060015250600101818118612703575b50506040518082526020810260208301818183606060045afa90509050505050565b6000610320526101e05161034052600061018051146127d557600961018051602052600052604060002054610320526101c0516127a35760006127a9565b6101e051155b156127d55760246101805160205260005260406000205461034052610340516127d55761018051610340525b601a5461036052600061038052610200511561280d5761020051806103805260208102806103a08261022060045afa9050505061283d565b6128186104a06126f8565b6104a0805180610380526020820160208202806103a0828460045afa90509050905050505b60006103805160088111612ec4578015612ce357905b602081026103a001516104a052610360516104a051106128d35760146104c0527f494e56414c49445f5245574152445f494e4445580000000000000000000000006104e0526104c0506104c051806104e00181600003601f1636823750506308c379a06104805260206104a052601f19601f6104c051011660440161049cfd5b6104a0516008811015612ec457601b01546104c05260236104c0516020526000526040600020600481019050546104e0524260236104c05160205260005260406000206001810190505480828118828410021890509050610500526105005160236104c051602052600052604060002060038101905054808210612ec457808203905090506105205260006105205114612a21576105005160236104c05160205260005260406000206003810190505560006101a05114612a21576104e0516105205160236104c051602052600052604060002060028101905054808202821582848304141715612ec45790509050670de0b6b3a7640000808202821582848304141715612ec457905090506101a051808015612ec4578204905090508181830110612ec457808201905090506104e0526104e05160236104c0516020526000526040600020600481019050555b60006101805114612cd85760256104c051602052600052604060002080610180516020526000526040600020905054610540526000610560526104e051610540511015612ad3576104e05160256104c051602052600052604060002080610180516020526000526040600020905055610320516104e05161054051808210612ec45780820390509050808202821582848304141715612ec45790509050670de0b6b3a764000080820490509050610560525b6026610180516020526000526040600020806104c0516020526000526040600020905054610580526105805160801c610560518181830110612ec457808201905090506105a05260006105a0511115612cd85761058051700100000000000000000000000000000000808206905090506105c0526101c051612b9f576000610560511115612cd8576105c0516105a05160801b8181830110612ec457808201905090506026610180516020526000526040600020806104c0516020526000526040600020905055612cd8565b63a9059cbb61062452600461034051610644526105a05161066452604001610620526106205060206106c06106205161064060006104c0515af1612be8573d600060003e3d6000fd5b6106a060203d808211612bfb5781612bfd565b805b9050905081528051806105e0526020820180516106005250505060006105e05114612c9b57610600516105e0516020036008021c612c9b576010610620527f5452414e534645525f4641494c55524500000000000000000000000000000000610640526106205061062051806106400181600003601f1636823750506308c379a06105e052602061060052601f19601f6106205101166044016105fcfd5b6105c0516105a0518181830110612ec457808201905090506026610180516020526000526040600020806104c05160205260005260406000209050555b600101818118612853575b5050565b61072051612cf457612e5e565b600a54610740526000601a541415610760526106e0516107a052610700516107c05260006002905b602081026107a001516107805261078051604052612d38612173565b6107805161018052610740516101a05260006101c05260006101e052600061020052612d62612765565b600101818118612d1c57505060096106e05160205260005260406000205461072051808210612ec45780820390509050610780526107805160096106e0516020526000526040600020556106e0516040526107805160605261074051608052612dc9612523565b600961070051602052600052604060002054610720518181830110612ec457808201905090506107805261078051600961070051602052600052604060002055610700516040526107805160605261074051608052612e26612523565b610700516106e0517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610720516107a05260206107a0a35b565b6020612f2960003960005160605118612e9c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815250612ec2565b600860405160205260005260406000208060605160205260005260406000209050548152505b565b600080fd", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230316-avax-child-chain-gauge-factory-v2/artifact/ChildChainGaugeFactory.json b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-child-chain-gauge-factory-v2/artifact/ChildChainGaugeFactory.json new file mode 100644 index 0000000..b70ed8d --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-child-chain-gauge-factory-v2/artifact/ChildChainGaugeFactory.json @@ -0,0 +1,122 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ChildChainGaugeFactory", + "sourceName": "contracts/gauges/ChildChainGaugeFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IChildChainGauge", + "name": "gaugeImplementation", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "productVersion", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "GaugeCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProductVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "isGaugeFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60806040523480156200001157600080fd5b50604051620009b9380380620009b98339810160408190526200003491620002aa565b8282620000418162000174565b50600180546001600160a01b0319166001600160a01b0392909216919091179055604051620000759082906020016200036e565b60405160208183030381529060405280519060200120836001600160a01b03166354fd4d506040518163ffffffff1660e01b815260040160006040518083038186803b158015620000c557600080fd5b505afa158015620000da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000104919081019062000330565b6040516020016200011691906200036e565b6040516020818303038152906040528051906020012014620001555760405162461bcd60e51b81526004016200014c906200038c565b60405180910390fd5b80516200016a9060039060208401906200018d565b50505050620003e9565b8051620001899060009060208401906200018d565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001d057805160ff191683800117855562000200565b8280016001018555821562000200579182015b8281111562000200578251825591602001919060010190620001e3565b506200020e92915062000212565b5090565b5b808211156200020e576000815560010162000213565b600082601f8301126200023a578081fd5b81516001600160401b038082111562000251578283fd5b604051601f8301601f19168101602001828111828210171562000272578485fd5b6040528281529250828483016020018610156200028e57600080fd5b620002a1836020830160208801620003b6565b50505092915050565b600080600060608486031215620002bf578283fd5b83516001600160a01b0381168114620002d6578384fd5b60208501519093506001600160401b0380821115620002f3578384fd5b620003018783880162000229565b9350604086015191508082111562000317578283fd5b50620003268682870162000229565b9150509250925092565b60006020828403121562000342578081fd5b81516001600160401b0381111562000358578182fd5b620003668482850162000229565b949350505050565b6000825162000382818460208701620003b6565b9190910192915050565b60208082526010908201526f0ac8aa4a6929e9cbe9a92a69a82a886960831b604082015260600190565b60005b83811015620003d3578181015183820152602001620003b9565b83811115620003e3576000848401525b50505050565b6105c080620003f96000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c806354fd4d501161005057806354fd4d501461009f5780639ed93318146100a7578063ce3cc8bd146100ba57610067565b806318d6186f1461006c57806339312dee1461008a575b600080fd5b6100746100da565b6040516100819190610540565b60405180910390f35b61009261018e565b60405161008191906104dd565b6100746101aa565b6100926100b5366004610439565b610229565b6100cd6100c8366004610439565b6102b3565b6040516100819190610535565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156101845780601f1061015957610100808354040283529160200191610184565b820191906000526020600020905b81548152906001019060200180831161016757829003601f168201915b5050505050905090565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156101845780601f1061015957610100808354040283529160200191610184565b6000806102346102de565b90508073ffffffffffffffffffffffffffffffffffffffff1663f399e22e8461025b6100da565b6040518363ffffffff1660e01b81526004016102789291906104fe565b600060405180830381600087803b15801561029257600080fd5b505af11580156102a6573d6000803e3d6000fd5b509293505050505b919050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205460ff1690565b60015460009081906103059073ffffffffffffffffffffffffffffffffffffffff16610383565b73ffffffffffffffffffffffffffffffffffffffff811660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff81166102ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043090610553565b60405180910390fd5b60006020828403121561044a578081fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461046d578182fd5b9392505050565b60008151808452815b818110156104995760208185018101518683018201520161047d565b818111156104aa5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff841682526040602083015261052d6040830184610474565b949350505050565b901515815260200190565b60006020825261046d6020830184610474565b60208082526016908201527f455243313136373a20637265617465206661696c65640000000000000000000060408201526060019056fea2646970667358221220de88abf80cf4ef8f042feb2edec2b1707b7d1780091c6586a40f7e9b40f7187d64736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c806354fd4d501161005057806354fd4d501461009f5780639ed93318146100a7578063ce3cc8bd146100ba57610067565b806318d6186f1461006c57806339312dee1461008a575b600080fd5b6100746100da565b6040516100819190610540565b60405180910390f35b61009261018e565b60405161008191906104dd565b6100746101aa565b6100926100b5366004610439565b610229565b6100cd6100c8366004610439565b6102b3565b6040516100819190610535565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156101845780601f1061015957610100808354040283529160200191610184565b820191906000526020600020905b81548152906001019060200180831161016757829003601f168201915b5050505050905090565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156101845780601f1061015957610100808354040283529160200191610184565b6000806102346102de565b90508073ffffffffffffffffffffffffffffffffffffffff1663f399e22e8461025b6100da565b6040518363ffffffff1660e01b81526004016102789291906104fe565b600060405180830381600087803b15801561029257600080fd5b505af11580156102a6573d6000803e3d6000fd5b509293505050505b919050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205460ff1690565b60015460009081906103059073ffffffffffffffffffffffffffffffffffffffff16610383565b73ffffffffffffffffffffffffffffffffffffffff811660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff81166102ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043090610553565b60405180910390fd5b60006020828403121561044a578081fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461046d578182fd5b9392505050565b60008151808452815b818110156104995760208185018101518683018201520161047d565b818111156104aa5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff841682526040602083015261052d6040830184610474565b949350505050565b901515815260200190565b60006020825261046d6020830184610474565b60208082526016908201527f455243313136373a20637265617465206661696c65640000000000000000000060408201526060019056fea2646970667358221220de88abf80cf4ef8f042feb2edec2b1707b7d1780091c6586a40f7e9b40f7187d64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230316-avax-child-chain-gauge-factory-v2/index.ts b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-child-chain-gauge-factory-v2/index.ts new file mode 100644 index 0000000..8395d14 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-child-chain-gauge-factory-v2/index.ts @@ -0,0 +1,24 @@ +import { Task, TaskRunOptions } from '@src'; +import { ChildChainLiquidityGaugeFactoryDeployment } from './input'; + +export type ExtraInputs = { + VotingEscrowDelegationProxy: string; + L2BalancerPseudoMinter: string; +}; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as ChildChainLiquidityGaugeFactoryDeployment; + + const gaugeArgs = [ + input.VotingEscrowDelegationProxy, + input.L2BalancerPseudoMinter, + input.AuthorizerAdaptor, + input.ProductVersion, + ]; + + // ChildChainGauge is written in Vyper, so we only deploy. + const gaugeImplementation = await task.deploy('ChildChainGauge', gaugeArgs, from, force); + + const factoryArgs = [gaugeImplementation.address, input.FactoryVersion, input.ProductVersion]; + await task.deployAndVerify('ChildChainGaugeFactory', factoryArgs, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230316-avax-child-chain-gauge-factory-v2/input.ts b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-child-chain-gauge-factory-v2/input.ts new file mode 100644 index 0000000..09fa08b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-child-chain-gauge-factory-v2/input.ts @@ -0,0 +1,22 @@ +import { Task, TaskMode } from '@src'; + +export type ChildChainLiquidityGaugeFactoryDeployment = { + VotingEscrowDelegationProxy: string; + AuthorizerAdaptor: string; + L2BalancerPseudoMinter: string; + FactoryVersion: string; + ProductVersion: string; +}; + +const VotingEscrowDelegationProxy = new Task('20230316-l2-ve-delegation-proxy', TaskMode.READ_ONLY); +const AuthorizerAdaptor = new Task('20220325-authorizer-adaptor', TaskMode.READ_ONLY); +const L2BalancerPseudoMinter = new Task('20230316-avax-l2-balancer-pseudo-minter', TaskMode.READ_ONLY); +const BaseVersion = { version: 2, deployment: '20230316-child-chain-gauge-factory-v2' }; + +export default { + VotingEscrowDelegationProxy, + AuthorizerAdaptor, + L2BalancerPseudoMinter, + FactoryVersion: JSON.stringify({ name: 'ChildChainGaugeFactory', ...BaseVersion }), + ProductVersion: JSON.stringify({ name: 'ChildChainGauge', ...BaseVersion }), +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230316-avax-child-chain-gauge-factory-v2/output/avalanche.json b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-child-chain-gauge-factory-v2/output/avalanche.json new file mode 100644 index 0000000..62abec8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-child-chain-gauge-factory-v2/output/avalanche.json @@ -0,0 +1,4 @@ +{ + "ChildChainGauge": "0x4b7b369989e613ff2C65768B7Cf930cC927F901E", + "ChildChainGaugeFactory": "0x161f4014C27773840ccb4EC1957113e6DD028846" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230316-avax-child-chain-gauge-factory-v2/readme.md b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-child-chain-gauge-factory-v2/readme.md new file mode 100644 index 0000000..cd08078 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-child-chain-gauge-factory-v2/readme.md @@ -0,0 +1,15 @@ +# 2023-03-16 - Child Chain Gauge Factory + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> This deployment has been deprecated in Avalanche because the BAL token address changed, and this contract requires it to work. +> See previous BAL address [here](../00000000-avax-tokens/output/avalanche.json) and current address [here](../../00000000-tokens/output/avalanche.json). +> The contract has been redeployed with the same build-info and the new configuration in the [original task](../../20230316-child-chain-gauge-factory-v2). + +Deployment of the `ChildChainGaugeFactory` V2, for liquidity gauges to be used with pools on networks other than Ethereum. +This version simplifies the system to distribute BAL and allows veBAL boosts on L2s and sidechains other than Mainnet. + +## Useful Files + +- [Avalanche mainnet addresses](./output/avalanche.json) +- [`ChildChainGauge` artifact](./artifact/ChildChainGauge.json) +- [`ChildChainGaugeFactory` artifact](./artifact/ChildChainGaugeFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20230316-avax-l2-balancer-pseudo-minter/artifact/L2BalancerPseudoMinter.json b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-l2-balancer-pseudo-minter/artifact/L2BalancerPseudoMinter.json new file mode 100644 index 0000000..cdc5601 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-l2-balancer-pseudo-minter/artifact/L2BalancerPseudoMinter.json @@ -0,0 +1,501 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "L2BalancerPseudoMinter", + "sourceName": "contracts/L2BalancerPseudoMinter.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "balancerToken", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract ILiquidityGaugeFactory", + "name": "factory", + "type": "address" + } + ], + "name": "GaugeFactoryAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract ILiquidityGaugeFactory", + "name": "factory", + "type": "address" + } + ], + "name": "GaugeFactoryRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "gauge", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "minted", + "type": "uint256" + } + ], + "name": "Minted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approval", + "type": "bool" + } + ], + "name": "MinterApprovalSet", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "contract ILiquidityGaugeFactory", + "name": "factory", + "type": "address" + } + ], + "name": "addGaugeFactory", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "allowed_to_mint_for", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBalancerToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "getMinterApproval", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getNextNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ILiquidityGaugeFactory", + "name": "factory", + "type": "address" + } + ], + "name": "isValidGaugeFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "mintFor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "gauges", + "type": "address[]" + } + ], + "name": "mintMany", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "gauges", + "type": "address[]" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "mintManyFor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "mint_for", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[8]", + "name": "gauges", + "type": "address[8]" + } + ], + "name": "mint_many", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "minted", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ILiquidityGaugeFactory", + "name": "factory", + "type": "address" + } + ], + "name": "removeGaugeFactory", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "internalType": "bool", + "name": "approval", + "type": "bool" + } + ], + "name": "setMinterApproval", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + }, + { + "internalType": "bool", + "name": "approval", + "type": "bool" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "setMinterApprovalWithSignature", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "minter", + "type": "address" + } + ], + "name": "toggle_approve_mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x61014060405234801561001157600080fd5b5060405161186a38038061186a8339818101604052604081101561003457600080fd5b508051602091820151604080518082018252601681527f42616c616e6365722050736575646f204d696e7465720000000000000000000081860190815282518084019093526001808452603160f81b968401968752600055905190206080525190922060a0527f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c0526001600160601b0319606092831b811660e0523061010052911b166101205260805160a05160c05160e05160601c610100516101205160601c61173e61012c600039806109eb525080610953525080610b19525080610e25525080610e67525080610e46525061173e6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c8063851c1bb3116100d8578063a51e19041161008c578063c654279411610066578063c6542794146104c1578063dd289d6014610512578063ed24911d1461053857610177565b8063a51e190414610494578063aaabadc5146104b1578063c0039699146104b957610177565b80638d928af8116100bd5780638d928af81461044a57806390193b7c1461046e578063a0990033146102fb57610177565b8063851c1bb3146103dd5780638b752bb01461041c57610177565b80633c543bc61161012f5780636c71e920116101145780636c71e920146103635780637504a15d146103895780637a60e63a146103b757610177565b80633c543bc6146102fb5780636a6278421461033d57610177565b806338f121521161016057806338f12152146101da578063397ada21146102005780633b9f73841461028257610177565b80630de54ba01461017c57806327f18ae3146101ac575b600080fd5b6101aa6004803603604081101561019257600080fd5b506001600160a01b0381351690602001351515610540565b005b6101aa600480360360408110156101c257600080fd5b506001600160a01b038135811691602001351661054f565b6101aa600480360360208110156101f057600080fd5b50356001600160a01b0316610597565b6102706004803603602081101561021657600080fd5b81019060208101813564010000000081111561023157600080fd5b82018360208201111561024357600080fd5b8035906020019184602083028401116401000000008311171561026557600080fd5b509092509050610691565b60408051918252519081900360200190f35b6102706004803603604081101561029857600080fd5b8101906020810181356401000000008111156102b357600080fd5b8201836020820111156102c557600080fd5b803590602001918460208302840111640100000000831117156102e757600080fd5b9193509150356001600160a01b03166106b6565b6103296004803603604081101561031157600080fd5b506001600160a01b0381358116916020013516610758565b604080519115158252519081900360200190f35b6102706004803603602081101561035357600080fd5b50356001600160a01b0316610786565b6103296004803603602081101561037957600080fd5b50356001600160a01b03166107a9565b6102706004803603604081101561039f57600080fd5b506001600160a01b03813581169160200135166107c7565b6101aa600480360360208110156103cd57600080fd5b50356001600160a01b0316610857565b610270600480360360208110156103f357600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661094d565b6102706004803603604081101561043257600080fd5b506001600160a01b03813581169160200135166109be565b6104526109e9565b604080516001600160a01b039092168252519081900360200190f35b6102706004803603602081101561048457600080fd5b50356001600160a01b0316610a0d565b6101aa60048036036101008110156104ab57600080fd5b50610a28565b610452610aa4565b610452610b17565b6101aa600480360360e08110156104d757600080fd5b506001600160a01b03813581169160208101351515916040820135169060608101359060ff6080820135169060a08101359060c00135610b3b565b6101aa6004803603602081101561052857600080fd5b50356001600160a01b0316610be0565b610270610c13565b61054b823383610c22565b5050565b610557610cb1565b3360009081526003602090815260408083206001600160a01b038516845290915290205460ff161561058f5761058d8282610cca565b505b61054b610ce2565b61059f610ce9565b6001600160a01b03811660009081526004602052604090205460ff161561062757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f464143544f52595f414c52454144595f41444445440000000000000000000000604482015290519081900360640190fd5b6001600160a01b03811660008181526004602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f8e2924dc08a7879532dca0c2c0460bd67eb431ab342df45afd2c4f7288aab9b79190a250565b600061069b610cb1565b6106a6838333610d2f565b90506106b0610ce2565b92915050565b60006106c0610cb1565b3360009081526003602090815260408083206001600160a01b038616845290915290205460ff1661073c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806116e66023913960400191505060405180910390fd5b610747848484610d2f565b9050610751610ce2565b9392505050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b6000610790610cb1565b61079a8233610cca565b90506107a4610ce2565b919050565b6001600160a01b031660009081526004602052604090205460ff1690565b60006107d1610cb1565b3360009081526003602090815260408083206001600160a01b038616845290915290205460ff1661084d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806116e66023913960400191505060405180910390fd5b6106a68383610cca565b61085f610ce9565b6001600160a01b03811660009081526004602052604090205460ff166108e657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f464143544f52595f4e4f545f4144444544000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03811660008181526004602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517fdc66290a40b716cd9557c1d6c84315e06de88697ee252b89e1a9a9b053dc307b9190a250565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526001602052604090205490565b610a30610cb1565b60005b6008811015610a98576000828260088110610a4a57fe5b60200201356001600160a01b03166001600160a01b03161415610a6c57610a98565b610a8f828260088110610a7b57fe5b60200201356001600160a01b031633610cca565b50600101610a33565b50610aa1610ce2565b50565b6000610aae6109e9565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015610ae657600080fd5b505afa158015610afa573d6000803e3d6000fd5b505050506040513d6020811015610b1057600080fd5b5051905090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007fc87351a089bbdc3b2b9299d2ce29f08fd982826b275b3642939a2f7fdd8153808888610b6989610a0d565b604080516020808201969096526001600160a01b03909416848201529115156060840152608083015260a08083018990528151808403909101815260c0909201905280519101209050610bcb8682610bc2878787610d88565b886101f8610dc7565b610bd6888789610c22565b5050505050505050565b6001600160a01b0381166000908152600360209081526040808320338452909152902054610aa190829060ff1615610540565b6000610c1d610e21565b905090565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155825190815291519293927fa3ffb51320bbca4e61e7423e3c97dd7bd7e31b6ea7429eb26ef92780e84572a09281900390910190a3505050565b610cc360026000541415610190610edf565b6002600055565b6000610cd68383610eed565b90506106b082826111f1565b6001600055565b6000610d186000357fffffffff000000000000000000000000000000000000000000000000000000001661094d565b9050610aa1610d278233611214565b610191610edf565b600082815b81811015610d7557610d6b610d64878784818110610d4e57fe5b905060200201356001600160a01b031686610eed565b84906112b6565b9250600101610d34565b50610d8083836111f1565b509392505050565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b6000610dd2856112c8565b9050610de8610de287838761132f565b83610edf565b610df7428410156101b8610edf565b5050506001600160a01b039092166000908152600160208190526040909120805490910190555050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e8e61141a565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b031681526020019550505050505060405160208183030381529060405280519060200120905090565b8161054b5761054b8161141e565b6000808390506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2e57600080fd5b505afa158015610f42573d6000803e3d6000fd5b505050506040513d6020811015610f5857600080fd5b50519050610f65816107a9565b610fd057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f494e56414c49445f47415547455f464143544f52590000000000000000000000604482015290519081900360640190fd5b806001600160a01b031663ce3cc8bd866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561101d57600080fd5b505afa158015611031573d6000803e3d6000fd5b505050506040513d602081101561104757600080fd5b50516110b457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f494e56414c49445f474155474500000000000000000000000000000000000000604482015290519081900360640190fd5b816001600160a01b0316634b820093856040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561110357600080fd5b505af1158015611117573d6000803e3d6000fd5b505050506040513d602081101561112d57600080fd5b5050604080517f094007070000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015291516000928516916309400707916024808301926020929190829003018186803b15801561119357600080fd5b505afa1580156111a7573d6000803e3d6000fd5b505050506040513d60208110156111bd57600080fd5b505190506111d56111ce86886109be565b8290611448565b935083156111e8576111e8858783611456565b50505092915050565b801561054b5761054b8282611204610b17565b6001600160a01b031691906114c0565b600061121e610aa4565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040180848152602001836001600160a01b03168152602001826001600160a01b03168152602001935050505060206040518083038186803b15801561128357600080fd5b505afa158015611297573d6000803e3d6000fd5b505050506040513d60208110156112ad57600080fd5b50519392505050565b60008282016107518482101583610edf565b60006112d2610e21565b8260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b600061134182516041146101b9610edf565b60008060006020850151925060408501519150606085015160001a9050600060018783868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156113ba573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381161580159061140e5750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b4690565b610aa1817f42414c0000000000000000000000000000000000000000000000000000000000611545565b6000610751838360016115c0565b6001600160a01b0380841660008181526002602090815260408083209487168084529482529182902085905581519384528301849052805191927f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0929081900390910190a2505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526115409084906115d6565b505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60006115cf8484111583610edf565b5050900390565b60006060836001600160a01b0316836040518082805190602001908083835b6020831061163257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016115f5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611694576040519150601f19603f3d011682016040523d82523d6000602084013e611699565b606091505b509150915060008214156116b1573d6000803e3d6000fd5b6116df8151600014806116d757508180602001905160208110156116d457600080fd5b50515b6101a2610edf565b5050505056fe43616c6c6572206e6f7420616c6c6f77656420746f206d696e7420666f722075736572a2646970667358221220829313c7074c630cd5c81cc3d5a8b29e85b5eb5e1c82b92e22b50b5801643f8064736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c8063851c1bb3116100d8578063a51e19041161008c578063c654279411610066578063c6542794146104c1578063dd289d6014610512578063ed24911d1461053857610177565b8063a51e190414610494578063aaabadc5146104b1578063c0039699146104b957610177565b80638d928af8116100bd5780638d928af81461044a57806390193b7c1461046e578063a0990033146102fb57610177565b8063851c1bb3146103dd5780638b752bb01461041c57610177565b80633c543bc61161012f5780636c71e920116101145780636c71e920146103635780637504a15d146103895780637a60e63a146103b757610177565b80633c543bc6146102fb5780636a6278421461033d57610177565b806338f121521161016057806338f12152146101da578063397ada21146102005780633b9f73841461028257610177565b80630de54ba01461017c57806327f18ae3146101ac575b600080fd5b6101aa6004803603604081101561019257600080fd5b506001600160a01b0381351690602001351515610540565b005b6101aa600480360360408110156101c257600080fd5b506001600160a01b038135811691602001351661054f565b6101aa600480360360208110156101f057600080fd5b50356001600160a01b0316610597565b6102706004803603602081101561021657600080fd5b81019060208101813564010000000081111561023157600080fd5b82018360208201111561024357600080fd5b8035906020019184602083028401116401000000008311171561026557600080fd5b509092509050610691565b60408051918252519081900360200190f35b6102706004803603604081101561029857600080fd5b8101906020810181356401000000008111156102b357600080fd5b8201836020820111156102c557600080fd5b803590602001918460208302840111640100000000831117156102e757600080fd5b9193509150356001600160a01b03166106b6565b6103296004803603604081101561031157600080fd5b506001600160a01b0381358116916020013516610758565b604080519115158252519081900360200190f35b6102706004803603602081101561035357600080fd5b50356001600160a01b0316610786565b6103296004803603602081101561037957600080fd5b50356001600160a01b03166107a9565b6102706004803603604081101561039f57600080fd5b506001600160a01b03813581169160200135166107c7565b6101aa600480360360208110156103cd57600080fd5b50356001600160a01b0316610857565b610270600480360360208110156103f357600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661094d565b6102706004803603604081101561043257600080fd5b506001600160a01b03813581169160200135166109be565b6104526109e9565b604080516001600160a01b039092168252519081900360200190f35b6102706004803603602081101561048457600080fd5b50356001600160a01b0316610a0d565b6101aa60048036036101008110156104ab57600080fd5b50610a28565b610452610aa4565b610452610b17565b6101aa600480360360e08110156104d757600080fd5b506001600160a01b03813581169160208101351515916040820135169060608101359060ff6080820135169060a08101359060c00135610b3b565b6101aa6004803603602081101561052857600080fd5b50356001600160a01b0316610be0565b610270610c13565b61054b823383610c22565b5050565b610557610cb1565b3360009081526003602090815260408083206001600160a01b038516845290915290205460ff161561058f5761058d8282610cca565b505b61054b610ce2565b61059f610ce9565b6001600160a01b03811660009081526004602052604090205460ff161561062757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f464143544f52595f414c52454144595f41444445440000000000000000000000604482015290519081900360640190fd5b6001600160a01b03811660008181526004602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f8e2924dc08a7879532dca0c2c0460bd67eb431ab342df45afd2c4f7288aab9b79190a250565b600061069b610cb1565b6106a6838333610d2f565b90506106b0610ce2565b92915050565b60006106c0610cb1565b3360009081526003602090815260408083206001600160a01b038616845290915290205460ff1661073c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806116e66023913960400191505060405180910390fd5b610747848484610d2f565b9050610751610ce2565b9392505050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b6000610790610cb1565b61079a8233610cca565b90506107a4610ce2565b919050565b6001600160a01b031660009081526004602052604090205460ff1690565b60006107d1610cb1565b3360009081526003602090815260408083206001600160a01b038616845290915290205460ff1661084d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806116e66023913960400191505060405180910390fd5b6106a68383610cca565b61085f610ce9565b6001600160a01b03811660009081526004602052604090205460ff166108e657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f464143544f52595f4e4f545f4144444544000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03811660008181526004602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517fdc66290a40b716cd9557c1d6c84315e06de88697ee252b89e1a9a9b053dc307b9190a250565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008416828401528251602481840301815260449092019092528051910120919050565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526001602052604090205490565b610a30610cb1565b60005b6008811015610a98576000828260088110610a4a57fe5b60200201356001600160a01b03166001600160a01b03161415610a6c57610a98565b610a8f828260088110610a7b57fe5b60200201356001600160a01b031633610cca565b50600101610a33565b50610aa1610ce2565b50565b6000610aae6109e9565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015610ae657600080fd5b505afa158015610afa573d6000803e3d6000fd5b505050506040513d6020811015610b1057600080fd5b5051905090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007fc87351a089bbdc3b2b9299d2ce29f08fd982826b275b3642939a2f7fdd8153808888610b6989610a0d565b604080516020808201969096526001600160a01b03909416848201529115156060840152608083015260a08083018990528151808403909101815260c0909201905280519101209050610bcb8682610bc2878787610d88565b886101f8610dc7565b610bd6888789610c22565b5050505050505050565b6001600160a01b0381166000908152600360209081526040808320338452909152902054610aa190829060ff1615610540565b6000610c1d610e21565b905090565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155825190815291519293927fa3ffb51320bbca4e61e7423e3c97dd7bd7e31b6ea7429eb26ef92780e84572a09281900390910190a3505050565b610cc360026000541415610190610edf565b6002600055565b6000610cd68383610eed565b90506106b082826111f1565b6001600055565b6000610d186000357fffffffff000000000000000000000000000000000000000000000000000000001661094d565b9050610aa1610d278233611214565b610191610edf565b600082815b81811015610d7557610d6b610d64878784818110610d4e57fe5b905060200201356001600160a01b031686610eed565b84906112b6565b9250600101610d34565b50610d8083836111f1565b509392505050565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b6000610dd2856112c8565b9050610de8610de287838761132f565b83610edf565b610df7428410156101b8610edf565b5050506001600160a01b039092166000908152600160208190526040909120805490910190555050565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610e8e61141a565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b031681526020019550505050505060405160208183030381529060405280519060200120905090565b8161054b5761054b8161141e565b6000808390506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2e57600080fd5b505afa158015610f42573d6000803e3d6000fd5b505050506040513d6020811015610f5857600080fd5b50519050610f65816107a9565b610fd057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f494e56414c49445f47415547455f464143544f52590000000000000000000000604482015290519081900360640190fd5b806001600160a01b031663ce3cc8bd866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561101d57600080fd5b505afa158015611031573d6000803e3d6000fd5b505050506040513d602081101561104757600080fd5b50516110b457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f494e56414c49445f474155474500000000000000000000000000000000000000604482015290519081900360640190fd5b816001600160a01b0316634b820093856040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561110357600080fd5b505af1158015611117573d6000803e3d6000fd5b505050506040513d602081101561112d57600080fd5b5050604080517f094007070000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015291516000928516916309400707916024808301926020929190829003018186803b15801561119357600080fd5b505afa1580156111a7573d6000803e3d6000fd5b505050506040513d60208110156111bd57600080fd5b505190506111d56111ce86886109be565b8290611448565b935083156111e8576111e8858783611456565b50505092915050565b801561054b5761054b8282611204610b17565b6001600160a01b031691906114c0565b600061121e610aa4565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040180848152602001836001600160a01b03168152602001826001600160a01b03168152602001935050505060206040518083038186803b15801561128357600080fd5b505afa158015611297573d6000803e3d6000fd5b505050506040513d60208110156112ad57600080fd5b50519392505050565b60008282016107518482101583610edf565b60006112d2610e21565b8260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b600061134182516041146101b9610edf565b60008060006020850151925060408501519150606085015160001a9050600060018783868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156113ba573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381161580159061140e5750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b4690565b610aa1817f42414c0000000000000000000000000000000000000000000000000000000000611545565b6000610751838360016115c0565b6001600160a01b0380841660008181526002602090815260408083209487168084529482529182902085905581519384528301849052805191927f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0929081900390910190a2505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526115409084906115d6565b505050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60006115cf8484111583610edf565b5050900390565b60006060836001600160a01b0316836040518082805190602001908083835b6020831061163257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016115f5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611694576040519150601f19603f3d011682016040523d82523d6000602084013e611699565b606091505b509150915060008214156116b1573d6000803e3d6000fd5b6116df8151600014806116d757508180602001905160208110156116d457600080fd5b50515b6101a2610edf565b5050505056fe43616c6c6572206e6f7420616c6c6f77656420746f206d696e7420666f722075736572a2646970667358221220829313c7074c630cd5c81cc3d5a8b29e85b5eb5e1c82b92e22b50b5801643f8064736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230316-avax-l2-balancer-pseudo-minter/index.ts b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-l2-balancer-pseudo-minter/index.ts new file mode 100644 index 0000000..387a014 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-l2-balancer-pseudo-minter/index.ts @@ -0,0 +1,8 @@ +import { Task, TaskRunOptions } from '@src'; +import { L2BalancerPseudoMinterDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as L2BalancerPseudoMinterDeployment; + + await task.deployAndVerify('L2BalancerPseudoMinter', [input.Vault, input.BAL], from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230316-avax-l2-balancer-pseudo-minter/input.ts b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-l2-balancer-pseudo-minter/input.ts new file mode 100644 index 0000000..317f25a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-l2-balancer-pseudo-minter/input.ts @@ -0,0 +1,14 @@ +import { Task, TaskMode } from '@src'; + +export type L2BalancerPseudoMinterDeployment = { + Vault: string; + BAL: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BAL = new Task('00000000-avax-tokens', TaskMode.READ_ONLY); + +export default { + Vault, + BAL, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230316-avax-l2-balancer-pseudo-minter/output/avalanche.json b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-l2-balancer-pseudo-minter/output/avalanche.json new file mode 100644 index 0000000..718dc35 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-l2-balancer-pseudo-minter/output/avalanche.json @@ -0,0 +1,3 @@ +{ + "L2BalancerPseudoMinter": "0xEa924b45a3fcDAAdf4E5cFB1665823B8F8F2039B" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230316-avax-l2-balancer-pseudo-minter/readme.md b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-l2-balancer-pseudo-minter/readme.md new file mode 100644 index 0000000..6005ac9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-l2-balancer-pseudo-minter/readme.md @@ -0,0 +1,15 @@ +# 2023-03-16 - L2 Balancer Pseudo Minter + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> This deployment has been deprecated in Avalanche because the BAL token address changed, and this contract requires it to work. +> See previous BAL address [here](../00000000-avax-tokens/output/avalanche.json) and current address [here](../../00000000-tokens/output/avalanche.json). +> The contract has been redeployed with the same build-info and the new configuration in the [original task](../../20230316-l2-balancer-pseudo-minter/). + +Deployment of the `L2BalancerPseudoMinter`, which distributes bridged BAL tokens on networks other than Mainnet and keeps track of the rewards that have already been distributed for each user. +It is analogous to the `BalancerMinter` deployed to Mainnet as part of the [Gauge Controller deployment](../../20220325-gauge-controller/output/mainnet.json), providing a similar user interface. +The main difference between the two is that the pseudo minter does not actually mint tokens; it just distributes bridged tokens instead. + +## Useful Files + +- [Avalanche mainnet addresses](./output/avalanche.json) +- [`L2BalancerPseudoMinter` artifact](./artifact/L2BalancerPseudoMinter.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20230316-avax-l2-balancer-pseudo-minter/test/test.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-l2-balancer-pseudo-minter/test/test.fork.ts new file mode 100644 index 0000000..8dd8d1c --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230316-avax-l2-balancer-pseudo-minter/test/test.fork.ts @@ -0,0 +1,59 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import { fp } from '@helpers/numbers'; +import { actionId } from '@helpers/models/misc/actions'; +import * as expectEvent from '@helpers/expectEvent'; + +import { describeForkTest } from '@src'; +import { Task, TaskMode } from '@src'; +import { getForkedNetwork } from '@src'; +import { impersonate } from '@src'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { ANY_ADDRESS } from '@helpers/constants'; + +describeForkTest('L2BalancerPseudoMinter', 'arbitrum', 70407500, function () { + let vault: Contract, authorizer: Contract; + let pseudoMinter: Contract; + let admin: SignerWithAddress; + + let task: Task; + + const GOV_MULTISIG = '0xaf23dc5983230e9eeaf93280e312e57539d098d0'; + + before('run task', async () => { + task = new Task('20230316-l2-balancer-pseudo-minter', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + pseudoMinter = await task.deployedInstance('L2BalancerPseudoMinter'); + }); + + before('setup accounts', async () => { + [, admin] = await ethers.getSigners(); + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.deployedInstance('Vault'); + authorizer = await vaultTask.instanceAt('Authorizer', await vault.getAuthorizer()); + }); + + before('grant register and rename permissions to admin', async () => { + const govMultisig = await impersonate(GOV_MULTISIG, fp(100)); + + await authorizer.connect(govMultisig).grantRole(await actionId(pseudoMinter, 'addGaugeFactory'), admin.address); + await authorizer.connect(govMultisig).grantRole(await actionId(pseudoMinter, 'removeGaugeFactory'), admin.address); + }); + + it('adds a gauge factory', async () => { + const tx = await pseudoMinter.connect(admin).addGaugeFactory(ANY_ADDRESS); + expectEvent.inReceipt(await tx.wait(), 'GaugeFactoryAdded', { factory: ANY_ADDRESS }); + expect(await pseudoMinter.isValidGaugeFactory(ANY_ADDRESS)).to.be.true; + }); + + it('remove a gauge factory', async () => { + const tx = await pseudoMinter.connect(admin).removeGaugeFactory(ANY_ADDRESS); + expectEvent.inReceipt(await tx.wait(), 'GaugeFactoryRemoved', { factory: ANY_ADDRESS }); + expect(await pseudoMinter.isValidGaugeFactory(ANY_ADDRESS)).to.be.false; + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/artifact/ComposableStablePool.json b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/artifact/ComposableStablePool.json new file mode 100644 index 0000000..9f0001b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/artifact/ComposableStablePool.json @@ -0,0 +1 @@ +{"abi": [{"inputs": [{"components": [{"internalType": "contract IVault", "name": "vault", "type": "address"}, {"internalType": "contract IProtocolFeePercentagesProvider", "name": "protocolFeeProvider", "type": "address"}, {"internalType": "string", "name": "name", "type": "string"}, {"internalType": "string", "name": "symbol", "type": "string"}, {"internalType": "contract IERC20[]", "name": "tokens", "type": "address[]"}, {"internalType": "contract IRateProvider[]", "name": "rateProviders", "type": "address[]"}, {"internalType": "uint256[]", "name": "tokenRateCacheDurations", "type": "uint256[]"}, {"internalType": "bool[]", "name": "exemptFromYieldProtocolFeeFlags", "type": "bool[]"}, {"internalType": "uint256", "name": "amplificationParameter", "type": "uint256"}, {"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}, {"internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256"}, {"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "string", "name": "version", "type": "string"}], "internalType": "struct ComposableStablePool.NewPoolParams", "name": "params", "type": "tuple"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "startValue", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "endValue", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "startTime", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "endTime", "type": "uint256"}], "name": "AmpUpdateStarted", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "currentValue", "type": "uint256"}], "name": "AmpUpdateStopped", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "paused", "type": "bool"}], "name": "PausedStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "feeType", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "protocolFeePercentage", "type": "uint256"}], "name": "ProtocolFeePercentageCacheUpdated", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "bool", "name": "enabled", "type": "bool"}], "name": "RecoveryModeStateChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "SwapFeePercentageChanged", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "tokenIndex", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "rate", "type": "uint256"}], "name": "TokenRateCacheUpdated", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "tokenIndex", "type": "uint256"}, {"indexed": true, "internalType": "contract IRateProvider", "name": "provider", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "cacheDuration", "type": "uint256"}], "name": "TokenRateProviderSet", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "DELEGATE_PROTOCOL_SWAP_FEES_SENTINEL", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "decreaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "disableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "enableRecoveryMode", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes4", "name": "selector", "type": "bytes4"}], "name": "getActionId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getActualSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAmplificationParameter", "outputs": [{"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "bool", "name": "isUpdating", "type": "bool"}, {"internalType": "uint256", "name": "precision", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getAuthorizer", "outputs": [{"internalType": "contract IAuthorizer", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getBptIndex", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getDomainSeparator", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getLastJoinExitData", "outputs": [{"internalType": "uint256", "name": "lastJoinExitAmplification", "type": "uint256"}, {"internalType": "uint256", "name": "lastPostJoinExitInvariant", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMinimumBpt", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "pure", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "getNextNonce", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getOwner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPausedState", "outputs": [{"internalType": "bool", "name": "paused", "type": "bool"}, {"internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256"}, {"internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getPoolId", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "feeType", "type": "uint256"}], "name": "getProtocolFeePercentageCache", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getProtocolFeesCollector", "outputs": [{"internalType": "contract IProtocolFeesCollector", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getProtocolSwapFeeDelegation", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getRateProviders", "outputs": [{"internalType": "contract IRateProvider[]", "name": "", "type": "address[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getScalingFactors", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getSwapFeePercentage", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "getTokenRate", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "getTokenRateCache", "outputs": [{"internalType": "uint256", "name": "rate", "type": "uint256"}, {"internalType": "uint256", "name": "oldRate", "type": "uint256"}, {"internalType": "uint256", "name": "duration", "type": "uint256"}, {"internalType": "uint256", "name": "expires", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getVault", "outputs": [{"internalType": "contract IVault", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "inRecoveryMode", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "addedValue", "type": "uint256"}], "name": "increaseAllowance", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "isTokenExemptFromYieldProtocolFee", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}], "name": "nonces", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onExitPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "onJoinPool", "outputs": [{"internalType": "uint256[]", "name": "", "type": "uint256[]"}, {"internalType": "uint256[]", "name": "", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8"}, {"internalType": "contract IERC20", "name": "tokenIn", "type": "address"}, {"internalType": "contract IERC20", "name": "tokenOut", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}, {"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "swapRequest", "type": "tuple"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "indexIn", "type": "uint256"}, {"internalType": "uint256", "name": "indexOut", "type": "uint256"}], "name": "onSwap", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint8", "name": "v", "type": "uint8"}, {"internalType": "bytes32", "name": "r", "type": "bytes32"}, {"internalType": "bytes32", "name": "s", "type": "bytes32"}], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryExit", "outputs": [{"internalType": "uint256", "name": "bptIn", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "poolId", "type": "bytes32"}, {"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256[]", "name": "balances", "type": "uint256[]"}, {"internalType": "uint256", "name": "lastChangeBlock", "type": "uint256"}, {"internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256"}, {"internalType": "bytes", "name": "userData", "type": "bytes"}], "name": "queryJoin", "outputs": [{"internalType": "uint256", "name": "bptOut", "type": "uint256"}, {"internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "bytes", "name": "poolConfig", "type": "bytes"}], "name": "setAssetManagerPoolConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "swapFeePercentage", "type": "uint256"}], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}, {"internalType": "uint256", "name": "duration", "type": "uint256"}], "name": "setTokenRateCacheDuration", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "rawEndValue", "type": "uint256"}, {"internalType": "uint256", "name": "endTime", "type": "uint256"}], "name": "startAmplificationParameterUpdate", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "stopAmplificationParameterUpdate", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "updateProtocolFeePercentageCache", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "contract IERC20", "name": "token", "type": "address"}], "name": "updateTokenRateCache", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "version", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}]} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/artifact/ComposableStablePoolFactory.json b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/artifact/ComposableStablePoolFactory.json new file mode 100644 index 0000000..8a6cdd8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/artifact/ComposableStablePoolFactory.json @@ -0,0 +1,292 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ComposableStablePoolFactory", + "sourceName": "contracts/ComposableStablePoolFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "protocolFeeProvider", + "type": "address" + }, + { + "internalType": "string", + "name": "factoryVersion", + "type": "string" + }, + { + "internalType": "string", + "name": "poolVersion", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "FactoryDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "PoolCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "amplificationParameter", + "type": "uint256" + }, + { + "internalType": "contract IRateProvider[]", + "name": "rateProviders", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "tokenRateCacheDurations", + "type": "uint256[]" + }, + { + "internalType": "bool[]", + "name": "exemptFromYieldProtocolFeeFlags", + "type": "bool[]" + }, + { + "internalType": "uint256", + "name": "swapFeePercentage", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "contract ComposableStablePool", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCode", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCreationCodeContracts", + "outputs": [ + { + "internalType": "address", + "name": "contractA", + "type": "address" + }, + { + "internalType": "address", + "name": "contractB", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPauseConfiguration", + "outputs": [ + { + "internalType": "uint256", + "name": "pauseWindowDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bufferPeriodDuration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProtocolFeePercentagesProvider", + "outputs": [ + { + "internalType": "contract IProtocolFeePercentagesProvider", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDisabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "isPoolFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6101806040523480156200001257600080fd5b506040516200944b3803806200944b83398101604081905262000035916200036d565b83836040518060200162000049906200021c565b601f1982820381018352601f90910116604052805183903090839060006002820460a081905280830360e08190528185529091508362000095816200013d602090811b620005e317901c565b60601b6001600160601b0319166080528285018051838252620000c4826200013d602090811b620005e317901c565b6001600160601b0319606091821b811660c05296909352905261010095909552505092821b831661012052509290921b909116610140525050426276a700016101605281516200011c9060029060208501906200022a565b508051620001329060039060208401906200022a565b505050505062000415565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f090845291506200018b6001600160a01b03831615156101ac62000191565b50919050565b81620001a257620001a281620001a6565b5050565b620001b8816210905360ea1b620001bb565b50565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b617f5680620014f583390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200026d57805160ff19168380011785556200029d565b828001600101855582156200029d579182015b828111156200029d57825182559160200191906001019062000280565b50620002ab929150620002af565b5090565b5b80821115620002ab5760008155600101620002b0565b600082601f830112620002d7578081fd5b81516001600160401b0380821115620002ee578283fd5b6040516020601f8401601f191682018101838111838210171562000310578586fd5b806040525081945083825286818588010111156200032d57600080fd5b600092505b8383101562000351578583018101518284018201529182019162000332565b83831115620003635760008185840101525b5050505092915050565b6000806000806080858703121562000383578384fd5b84516200039081620003ff565b6020860151909450620003a381620003ff565b60408601519093506001600160401b0380821115620003c0578384fd5b620003ce88838901620002c6565b93506060870151915080821115620003e4578283fd5b50620003f387828801620002c6565b91505092959194509250565b6001600160a01b0381168114620001b857600080fd5b60805160601c60a05160c05160601c60e051610100516101205160601c6101405160601c610160516110676200048e60003980610232528061025b5250806104d15250806105475250806104f752508061063d52508061020952806106b952508061065e5250806101e8528061069552506110676000f3fe608060405234801561001057600080fd5b50600436106100de5760003560e01c806354fd4d501161008c578063739238d611610066578063739238d61461018f578063851c1bb3146101975780638d928af8146101b7578063aaabadc5146101bf576100de565b806354fd4d501461015f5780636634b753146101675780636c57f5a914610187576100de565b80632f2770db116100bd5780632f2770db1461012d5780633f819b6f14610137578063549673e31461013f576100de565b8062c194db146100e3578063174481fa146101015780632da47c4014610117575b600080fd5b6100eb6101c7565b6040516100f89190610e4c565b60405180910390f35b6101096101e6565b6040516100f8929190610dff565b61011f61022c565b6040516100f8929190610fb9565b610135610296565b005b6100eb6102dd565b61015261014d366004610bcc565b610373565b6040516100f89190610e5f565b6100eb61044a565b61017a610175366004610b50565b6104a8565b6040516100f89190610e19565b61017a6104c6565b6101526104cf565b6101aa6101a5366004610b88565b6104f3565b6040516100f89190610e24565b610152610545565b610152610569565b60606101e160405180602001604052806000815250610635565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561028857807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610291565b60009250600091505b509091565b61029e61070e565b6102a661073f565b6001805460ff1916811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156103695780601f1061033e57610100808354040283529160200191610369565b820191906000526020600020905b81548152906001019060200180831161034c57829003601f168201915b5050505050905090565b600080600061038061022c565b91509150610439604051806101c0016040528061039b610545565b6001600160a01b031681526020016103b16104cf565b6001600160a01b031681526020018f81526020018e81526020018d81526020018b81526020018a81526020018981526020018c8152602001888152602001848152602001838152602001876001600160a01b031681526020016104126102dd565b90526040516104249190602001610e73565b60405160208183030381529060405285610754565b9d9c50505050505050505050505050565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156103695780601f1061033e57610100808354040283529160200191610369565b6001600160a01b031660009081526020819052604090205460ff1690565b60015460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610528929190610de7565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610573610545565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156105ab57600080fd5b505afa1580156105bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e19190610bb0565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061062f6001600160a01b03831615156101ac6107c1565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016107008183866107d3565b505050505050505050919050565b60006107256000356001600160e01b0319166104f3565b905061073c6107348233610811565b6101916107c1565b50565b61075261074a6104c6565b1560d36107c1565b565b600061075e61073f565b600061076a84846108a1565b6001600160a01b038116600081815260208190526040808220805460ff191660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a290505b92915050565b816107cf576107cf816108de565b5050565b5b602081106107f3578151835260209283019290910190601f19016107d4565b905182516020929092036101000a6000190180199091169116179052565b600061081b610569565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161084a93929190610e2d565b60206040518083038186803b15801561086257600080fd5b505afa158015610876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089a9190610b6c565b9392505050565b600060606108ae84610635565b90506000838251602084016000f590506001600160a01b0381166108d6573d6000803e3d6000fd5b949350505050565b62461bcd60e51b600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b60445261073c916210905360ea1b906242414c90606490fd5b80356107bb8161100e565b600082601f830112610954578081fd5b813561096761096282610fee565b610fc7565b81815291506020808301908481018184028601820187101561098857600080fd5b60005b848110156109b057813561099e81611023565b8452928201929082019060010161098b565b505050505092915050565b600082601f8301126109cb578081fd5b81356109d961096282610fee565b8181529150602080830190848101818402860182018710156109fa57600080fd5b60005b848110156109b0578135610a108161100e565b845292820192908201906001016109fd565b600082601f830112610a32578081fd5b8135610a4061096282610fee565b818152915060208083019084810181840286018201871015610a6157600080fd5b60005b848110156109b0578135610a778161100e565b84529282019290820190600101610a64565b600082601f830112610a99578081fd5b8135610aa761096282610fee565b818152915060208083019084810181840286018201871015610ac857600080fd5b60005b848110156109b057813584529282019290820190600101610acb565b600082601f830112610af7578081fd5b813567ffffffffffffffff811115610b0d578182fd5b610b20601f8201601f1916602001610fc7565b9150808252836020828501011115610b3757600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215610b61578081fd5b813561089a8161100e565b600060208284031215610b7d578081fd5b815161089a81611023565b600060208284031215610b99578081fd5b81356001600160e01b03198116811461089a578182fd5b600060208284031215610bc1578081fd5b815161089a8161100e565b6000806000806000806000806000806101408b8d031215610beb578586fd5b8a3567ffffffffffffffff80821115610c02578788fd5b610c0e8e838f01610ae7565b9b5060208d0135915080821115610c23578788fd5b610c2f8e838f01610ae7565b9a5060408d0135915080821115610c44578788fd5b610c508e838f016109bb565b995060608d0135985060808d0135915080821115610c6c578788fd5b610c788e838f01610a22565b975060a08d0135915080821115610c8d578687fd5b610c998e838f01610a89565b965060c08d0135915080821115610cae578586fd5b50610cbb8d828e01610944565b94505060e08b01359250610cd38c6101008d01610939565b91506101208b013590509295989b9194979a5092959850565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015610d2a578151151587529582019590820190600101610d0c565b509495945050505050565b6000815180845260208085019450808401835b83811015610d2a5781516001600160a01b031687529582019590820190600101610d48565b6000815180845260208085019450808401835b83811015610d2a57815187529582019590820190600101610d80565b60008151808452815b81811015610dc157602081850181015186830182015201610da5565b81811115610dd25782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6001600160a01b0392831681529116602082015260400190565b901515815260200190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b60006020825261089a6020830184610d9c565b6001600160a01b0391909116815260200190565b600060208252610e87602083018451610cec565b6020830151610e996040840182610cec565b5060408301516101c0806060850152610eb66101e0850183610d9c565b91506060850151601f1980868503016080870152610ed48483610d9c565b935060808701519150808685030160a0870152610ef18483610d35565b935060a08701519150808685030160c0870152610f0e8483610d35565b935060c08701519150808685030160e0870152610f2b8483610d6d565b935060e08701519150610100818786030181880152610f4a8584610cf9565b908801516101208881019190915288015161014080890191909152880151610160808901919091528801516101808089019190915288015190945091506101a0610f9681880184610cec565b870151868503909101838701529050610faf8382610d9c565b9695505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610fe657600080fd5b604052919050565b600067ffffffffffffffff821115611004578081fd5b5060209081020190565b6001600160a01b038116811461073c57600080fd5b801515811461073c57600080fdfea2646970667358221220dc4ac16f23962bc6b71bd25e14e6d179b03cf8659c20ca0d8218eda975fe7d2d64736f6c634300070100336105006040523480156200001257600080fd5b5060405162007f5638038062007f56833981016040819052620000359162001b55565b6020810151600019620000488362000d93565b620000538462000dcc565b8461010001518560000151600087604001518860600151620000808a608001513062000e1560201b60201c565b8a60800151516001016001600160401b03811180156200009f57600080fd5b50604051908082528060200260200182016040528015620000ca578160200160208202803683370190505b508b61012001518c61014001518d61016001518e6101800151828289898d85336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b815250878781600390805190602001906200012c929190620017f2565b50805162000142906004906020840190620017f2565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001c090506276a70083111561019462000faf565b620001d462278d0082111561019562000faf565b4290910161014081905201610160528551620001f6906002111560c862000faf565b620002106200020462000fc4565b8751111560c962000faf565b620002268662000fc960201b620015511760201c565b620002318462000fd5565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f9062000262908d9060040162001ddb565b602060405180830381600087803b1580156200027d57600080fd5b505af115801562000292573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b8919062001b1d565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002ed9084908b908b9060040162001d3f565b600060405180830381600087803b1580156200030857600080fd5b505af11580156200031d573d6000803e3d6000fd5b505050508061018081815250508a6001600160a01b031663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200036457600080fd5b505afa15801562000379573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200039f919062001b36565b60601b6001600160601b0319166101a05250620003d1995050506001891015965061012c955062000faf945050505050565b620003e461138882111561012d62000faf565b6000620003ff826103e86200106960201b6200155b1760201c565b90506200040c8162001098565b5050805151620004216002821160c862000faf565b6200044660018203836020015151846040015151620010d760201b620015861760201c565b6101c0819052815180516000906200045a57fe5b60200260200101516001600160a01b0316610200816001600160a01b031660601b8152505081600001516001815181106200049157fe5b60200260200101516001600160a01b0316610220816001600160a01b031660601b815250508160000151600281518110620004c857fe5b60200260200101516001600160a01b0316610240816001600160a01b031660601b8152505060038111620004fe57600062000517565b8151805160039081106200050e57fe5b60200260200101515b60601b6001600160601b03191661026052600481116200053957600062000552565b8151805160049081106200054957fe5b60200260200101515b60601b6001600160601b0319166102805260058111620005745760006200058d565b8151805160059081106200058457fe5b60200260200101515b60601b6001600160601b0319166102a05281518051620005c69190600090620005b257fe5b6020026020010151620010f760201b60201c565b6102c05281518051620005e091906001908110620005b257fe5b6102e05281518051620005fa91906002908110620005b257fe5b61030052600381116200060f57600062000625565b620006258260000151600381518110620005b257fe5b61032052600481116200063a57600062000650565b620006508260000151600481518110620005b257fe5b6103405260058111620006655760006200067b565b6200067b8260000151600581518110620005b257fe5b61036052815151600019015b600081118015620006b857508251805130919083908110620006a557fe5b60200260200101516001600160a01b0316115b15620006c8576000190162000687565b6101e08190528251516060906001600160401b0381118015620006ea57600080fd5b5060405190808252806020026020018201604052801562000715578160200160208202803683370190505b50905060008080805b8751518110156200093857858110156200085457876020015181815181106200074357fe5b60200260200101518582815181106200075857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050620007c160006001600160a01b03168683815181106200079457fe5b60200260200101516001600160a01b031614158260060186620011c660201b620015a3179092919060201c565b935087604001518181518110620007d457fe5b60200260200101511562000849576200082060006001600160a01b0316868381518110620007fe57fe5b60200260200101516001600160a01b0316141561015562000faf60201b60201c565b6200083d60018286620011c660201b620015a3179092919060201c565b9350600192506200084e565b600191505b6200092f565b8581146200092f57876020015160018203815181106200087057fe5b60200260200101518582815181106200088557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050620008c160006001600160a01b03168683815181106200079457fe5b935087604001516001820381518110620008d757fe5b6020026020010151156200092a576200090160006001600160a01b0316868381518110620007fe57fe5b6200091e60018286620011c660201b620015a3179092919060201c565b9350600192506200092f565b600191505b6001016200071e565b50811560f890811b610460528115901b61048052835184906000906200095a57fe5b60200260200101516001600160a01b0316610380816001600160a01b031660601b81525050836001815181106200098d57fe5b60200260200101516001600160a01b03166103a0816001600160a01b031660601b8152505083600281518110620009c057fe5b60200260200101516001600160a01b03166103c0816001600160a01b031660601b815250506003845111620009f757600062000a0e565b8360038151811062000a0557fe5b60200260200101515b60601b6001600160601b0319166103e052835160041062000a3157600062000a48565b8360048151811062000a3f57fe5b60200260200101515b60601b6001600160601b03191661040052835160051062000a6b57600062000a82565b8360058151811062000a7957fe5b60200260200101515b60601b6001600160601b0319166104205250506104405250508251516020808501515160408601515162000ac595509293509190620010d7811b6200158617901c565b805160609062000ad6903062000e15565b8051909150600019015b60008111801562000b165750306001600160a01b031682828151811062000b0357fe5b60200260200101516001600160a01b0316115b1562000b26576000190162000ae0565b6000805b84515181101562000c3f578281141562000b4357600191505b60208501518051828401916000918490811062000b5c57fe5b60200260200101516001600160a01b03161462000c355762000bb6818760200151848151811062000b8957fe5b60200260200101518860400151858151811062000ba257fe5b6020026020010151620011ef60201b60201c565b8560200151828151811062000bc757fe5b60200260200101516001600160a01b0316817fdd6d1c9badb346de6925b358a472c937b41698d2632696759e43fd6527feeec48860400151858151811062000c0b57fe5b602002602001015160405162000c22919062001df0565b60405180910390a362000c3581620012ea565b5060010162000b2a565b5050505050600019811460f881901b6104c0526001600160601b0319606084901b166104a05262000c7283600262001329565b62000c7f83600362001329565b801562000c995762000c9383600062001329565b62000d58565b60405163178b2b9360e21b815262000d2d906001600160a01b03851690635e2cae4c9062000ccd9060009060040162001df0565b60206040518083038186803b15801562000ce657600080fd5b505afa15801562000cfb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d21919062001b1d565b83111561025862000faf565b600060008051602062007f368339815191528360405162000d4f919062001df0565b60405180910390a25b8062000d65578162000d68565b60005b6104e0525050506101a0810151805162000d8b91600d91602090910190620017f2565b505062001e62565b62000d9d62001873565b6040518060600160405280836080015181526020018360a0015181526020018360c0015181525090505b919050565b62000dd662001873565b604051806060016040528062000df784608001513062000e1560201b60201c565b81526020018360a0015181526020018360e001518152509050919050565b606082516001016001600160401b038111801562000e3257600080fd5b5060405190808252806020026020018201604052801562000e5d578160200160208202803683370190505b50905082516000141562000ea057818160008151811062000e7a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505062000fa9565b82515b60008111801562000edc5750826001600160a01b031684600183038151811062000ec957fe5b60200260200101516001600160a01b0316115b1562000f295783600182038151811062000ef257fe5b602002602001015182828151811062000f0757fe5b6001600160a01b03909216602092830291909101909101526000190162000ea3565b60005b8181101562000f785784818151811062000f4257fe5b602002602001015183828151811062000f5757fe5b6001600160a01b039092166020928302919091019091015260010162000f2c565b508282828151811062000f8757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050505b92915050565b8162000fc05762000fc081620014d4565b5050565b600690565b8062000fc081620014e9565b62000fee62000fe362001570565b82101560cb62000faf565b6200100762000ffc62001579565b82111560ca62000faf565b620010298160c0603f6008546200158560201b620015ca17909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906200105e90839062001df0565b60405180910390a150565b600082820262001091841580620010895750838583816200108657fe5b04145b600362000faf565b9392505050565b620010a681804280620015aa565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a0233816040516200105e919062001df0565b620010f28284148015620010ea57508183145b606762000faf565b505050565b60006001600160a01b0382163014156200111b5750670de0b6b3a764000062000dc7565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200115757600080fd5b505afa1580156200116c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001192919062001d1c565b60ff1690506000620011b16012836200161d60201b620015f21760201c565b600a0a670de0b6b3a764000002949350505050565b60006001821b1984168284620011de576000620011e1565b60015b60ff16901b17949350505050565b6000826001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200122b57600080fd5b505afa15801562001240573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001266919062001b1d565b6000858152600a602090815260409091205491925062001295908290849086906200160862001635821b17901c565b6000868152600a602052604090819020919091555185907fb77a83204ca282e08dc3a65b0a1ca32ea4e6875c38ef0bf5bf75e52a67354fac90620012db90859062001df0565b60405180910390a25050505050565b6000818152600a602090815260409091205490620013139082906200164062001691821b17901c565b6000928352600a60205260409092209190915550565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c3263906200135a90859060040162001df0565b60206040518083038186803b1580156200137357600080fd5b505afa15801562001388573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620013ae919062001b1d565b905081620013f257620013cc81620016bc60201b620016581760201c565b600b80546001600160401b0319166001600160401b0392909216919091179055620014a6565b600282141562001448576200141281620016bc60201b620016581760201c565b600b80546001600160401b03929092166801000000000000000002600160401b600160801b0319909216919091179055620014a6565b600382141562001499576200146881620016bc60201b620016581760201c565b600b80546001600160401b0392909216600160801b02600160801b600160c01b0319909216919091179055620014a6565b620014a66101bb620014d4565b8160008051602062007f3683398151915282604051620014c7919062001df0565b60405180910390a2505050565b620014e6816210905360ea1b620016da565b50565b600281511015620014fa57620014e6565b6000816000815181106200150a57fe5b602002602001015190506000600190505b8251811015620010f25760008382815181106200153457fe5b6020026020010151905062001565816001600160a01b0316846001600160a01b031610606562000faf60201b60201c565b91506001016200151b565b64e8d4a5100090565b67016345785d8a000090565b6000620015948484846200173b565b506001901b60001901811b1992909216911b1790565b620015c48160c060406200179660201b620016751760201c565b620015de83608060406200179660201b620016751760201c565b620015f7856040806200179660201b620016751760201c565b6200161187600060406200179660201b620016751760201c565b17171760095550505050565b60006200162f83831115600162000faf565b50900390565b60006200164a606084901c1561014962000faf565b6200168942830160e06020620016738660c083838c8c60006060620015ca62001585871b17861c565b6200158560201b620015ca17909392919060201c565b949350505050565b600062000fa9620016a283620017ab565b606080856200158560201b620015ca17909392919060201c565b6000620016d66001600160401b038311156101ba62000faf565b5090565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6200174c6101008310606462000faf565b62001785600182101580156200177d57506200177960ff8461010003620017cb60201b620016881760201c565b8211155b606462000faf565b620010f283821c156101b462000faf565b6000620017a58484846200173b565b50501b90565b600062000fa96000606084620017e360201b6200169e179092919060201c565b6000818310620017dc578162001091565b5090919050565b6001901b6000190191901c1690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200183557805160ff191683800117855562001865565b8280016001018555821562001865579182015b828111156200186557825182559160200191906001019062001848565b50620016d692915062001894565b60405180606001604052806060815260200160608152602001606081525090565b5b80821115620016d6576000815560010162001895565b805162000fa98162001e4c565b600082601f830112620018c9578081fd5b8151620018e0620018da8262001e20565b62001df9565b8181529150602080830190848101818402860182018710156200190257600080fd5b6000805b858110156200193257825180151581146200191f578283fd5b8552938301939183019160010162001906565b50505050505092915050565b600082601f8301126200194f578081fd5b815162001960620018da8262001e20565b8181529150602080830190848101818402860182018710156200198257600080fd5b60005b84811015620019ae5781516200199b8162001e4c565b8452928201929082019060010162001985565b505050505092915050565b600082601f830112620019ca578081fd5b8151620019db620018da8262001e20565b818152915060208083019084810181840286018201871015620019fd57600080fd5b60005b84811015620019ae57815162001a168162001e4c565b8452928201929082019060010162001a00565b600082601f83011262001a3a578081fd5b815162001a4b620018da8262001e20565b81815291506020808301908481018184028601820187101562001a6d57600080fd5b60005b84811015620019ae5781518452928201929082019060010162001a70565b600082601f83011262001a9f578081fd5b81516001600160401b0381111562001ab5578182fd5b602062001acb601f8301601f1916820162001df9565b9250818352848183860101111562001ae257600080fd5b60005b8281101562001b0257848101820151848201830152810162001ae5565b8281111562001b145760008284860101525b50505092915050565b60006020828403121562001b2f578081fd5b5051919050565b60006020828403121562001b48578081fd5b8151620010918162001e4c565b60006020828403121562001b67578081fd5b81516001600160401b038082111562001b7e578283fd5b81840191506101c080838703121562001b95578384fd5b62001ba08162001df9565b905062001bae8684620018ab565b815262001bbf8660208501620018ab565b602082015260408301518281111562001bd6578485fd5b62001be48782860162001a8e565b60408301525060608301518281111562001bfc578485fd5b62001c0a8782860162001a8e565b60608301525060808301518281111562001c22578485fd5b62001c30878286016200193e565b60808301525060a08301518281111562001c48578485fd5b62001c5687828601620019b9565b60a08301525060c08301518281111562001c6e578485fd5b62001c7c8782860162001a29565b60c08301525060e08301518281111562001c94578485fd5b62001ca287828601620018b8565b60e083015250610100838101519082015261012080840151908201526101408084015190820152610160808401519082015261018062001ce587828601620018ab565b908201526101a0838101518381111562001cfd578586fd5b62001d0b8882870162001a8e565b918301919091525095945050505050565b60006020828403121562001d2e578081fd5b815160ff8116811462001091578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562001d8b5762001d78855162001e40565b8352938301939183019160010162001d63565b505084810360408601528551808252908201925081860190845b8181101562001dcd5762001dba835162001e40565b8552938301939183019160010162001da5565b509298975050505050505050565b602081016003831062001dea57fe5b91905290565b90815260200190565b6040518181016001600160401b038111828210171562001e1857600080fd5b604052919050565b60006001600160401b0382111562001e36578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b0381168114620014e657600080fd5b60805160a05160c05160e0516101005160601c6101205160601c6101405161016051610180516101a05160601c6101c0516101e0516102005160601c6102205160601c6102405160601c6102605160601c6102805160601c6102a05160601c6102c0516102e051610300516103205161034051610360516103805160601c6103a05160601c6103c05160601c6103e05160601c6104005160601c6104205160601c610440516104605160f81c6104805160f81c6104a05160601c6104c05160f81c6104e051615f166200202060003980610e2d52508061090a52508061088a52806108b552806108e05250806147175250806146f3525080612ac3528061436c525080611c1b525080611beb525080611bbb525080611b8b525080611b5b525080611b2b525080612f53525080612f23525080612ef3525080612ec3525080612e93525080612e63525080611f16525080611ed4525080611e92525080611e50525080611e0e525080611dcc5250806110495250806116cd525080611274525080610bec525080611aff525080611adb525080611149525080611125525080611081525080612cd1525080612d13525080612cf25250615f166000f3fe608060405234801561001057600080fd5b50600436106103785760003560e01c806370464016116101d3578063a457c2d711610104578063d505accf116100a2578063ddf4627b1161007c578063ddf4627b146106e3578063eb0f24d6146106eb578063ed24911d146106f3578063f4b7964d146106fb57610378565b8063d505accf146106aa578063d5c096c4146106bd578063dd62ed3e146106d057610378565b8063ab7759f1116100de578063ab7759f11461067f578063b35056b814610692578063b7b814fc1461069a578063d2946c2b146106a257610378565b8063a457c2d714610651578063a9059cbb14610664578063aaabadc51461067757610378565b8063851c1bb311610171578063893d20e81161014b578063893d20e8146106195780638d928af81461062e57806390193b7c1461063657806395d89b411461064957610378565b8063851c1bb3146105eb578063876f303b146105fe57806387ec68171461060657610378565b80637ecebe00116101ad5780637ecebe00146105a55780637f1260d1146105b857806382687a56146105db5780638456cb59146105e357610378565b8063704640161461055e57806370a082311461057157806374f3b0091461058457610378565b80633644e515116102ad57806354a844ba1161024b57806355c676281161022557806355c67628146105165780636028bfd41461051e578063679aefce1461053f5780636daccffa1461054757610378565b806354a844ba146104f357806354dea00a146104fb57806354fd4d501461050e57610378565b8063395093511161028757806339509351146104af5780633c975d51146104c25780633f4ba83a146104d857806350dd6ed9146104e057610378565b80633644e5151461048c57806338e9922e1461049457806338fff2d0146104a757610378565b80631c0de0511161031a57806323b872dd116102f457806323b872dd1461043e5780632df2c7c0146104515780632f1a0bc914610464578063313ce5671461047757610378565b80631c0de051146103fd5780631dd746ea14610414578063238a2d591461042957610378565b8063095ea7b311610356578063095ea7b3146103c35780630da0669c146103e357806315b0015b146103ed57806318160ddd146103f557610378565b806301ec954a1461037d57806304842d4c146103a657806306fdde03146103ae575b600080fd5b61039061038b366004615905565b61070e565b60405161039d9190615d26565b60405180910390f35b6103906107b4565b6103b66107c3565b60405161039d9190615dfc565b6103d66103d1366004615542565b610859565b60405161039d9190615d03565b6103eb610870565b005b6103d6610908565b61039061092c565b610405610932565b60405161039d93929190615d0e565b61041c61095b565b60405161039d9190615ccb565b610431610965565b60405161039d9190615be7565b6103d661044c366004615492565b610a00565b6103eb61045f36600461543e565b610a74565b6103eb610472366004615a54565b610ad8565b61047f610bbb565b60405161039d9190615e67565b610390610bc4565b6103eb6104a2366004615a24565b610bce565b610390610bea565b6103d66104bd366004615542565b610c0e565b6104ca610c49565b60405161039d929190615e3e565b6103eb610c74565b6103eb6104ee366004615740565b610c86565b6103eb610ca4565b61039061050936600461543e565b610cb6565b6103b6610cd1565b610390610d32565b61053161052c366004615659565b610d45565b60405161039d929190615e0f565b610390610d7c565b61054f610de8565b60405161039d93929190615e28565b61039061056c366004615a24565b610e03565b61039061057f36600461543e565b610ebc565b610597610592366004615659565b610ed7565b60405161039d929190615cde565b6103906105b336600461543e565b610fda565b6105cb6105c636600461543e565b610fe5565b60405161039d9493929190615e4c565b610390611047565b6103eb61106b565b6103906105f93660046156fc565b61107d565b6103906110cf565b610531610614366004615659565b6110fd565b610621611123565b60405161039d9190615bd3565b610621611147565b61039061064436600461543e565b61116b565b6103b6611186565b6103d661065f366004615542565b6111e7565b6103d6610672366004615542565b611225565b610621611232565b6103d661068d36600461543e565b61123c565b6103d661124f565b6103eb611260565b610621611272565b6103eb6106b83660046154d2565b611296565b6105976106cb366004615659565b611321565b6103906106de36600461545a565b611444565b610390611481565b6103eb611487565b6103906114b3565b6103eb610709366004615542565b6114bd565b6000846080015161073b610720611147565b6001600160a01b0316336001600160a01b03161460cd6116ad565b610750610746610bea565b82146101f46116ad565b6107586116bb565b61076a84846107656116cb565b6116ef565b6060610774611707565b905060008751600181111561078557fe5b1461079c5761079787878787856117a0565b6107a9565b6107a987878787856117f9565b979650505050505050565b60006107be611834565b905090565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561084f5780601f106108245761010080835404028352916020019161084f565b820191906000526020600020905b81548152906001019060200180831161083257829003601f168201915b5050505050905090565b600061086633848461183b565b5060015b92915050565b6108786118a3565b610880610908565b156108b0576108b07f00000000000000000000000000000000000000000000000000000000000000006000611918565b6108db7f00000000000000000000000000000000000000000000000000000000000000006002611918565b6109067f00000000000000000000000000000000000000000000000000000000000000006003611918565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b600080600061093f611abc565b15925061094a611ad9565b9150610954611afd565b9050909192565b60606107be611707565b606060006109716116cb565b905060608167ffffffffffffffff8111801561098c57600080fd5b506040519080825280602002602001820160405280156109b6578160200160208202803683370190505b50905060005b828110156109f9576109cd81611b21565b8282815181106109d957fe5b6001600160a01b03909216602092830291909101909101526001016109bc565b5091505090565b600080610a0d8533611444565b9050610a31336001600160a01b0387161480610a295750838210155b61019e6116ad565b610a3c858585611c4a565b336001600160a01b03861614801590610a5757506000198114155b15610a6957610a69853385840361183b565b506001949350505050565b610a7c611d2a565b6000610a8782611dc8565b90506000610a9482611b21565b9050610aad6001600160a01b03821615156101556116ad565b6000828152600a6020526040812054610ac590611f56565b9050610ad2838383611f65565b50505050565b610ae0612048565b610af0600183101561012c6116ad565b610b0161138883111561012d6116ad565b6000610b0d82426115f2565b9050610b216201518082101561013d6116ad565b600080610b2c612076565b91509150610b3d811561013e6116ad565b6000610b4b866103e861155b565b90506000838211610b7a57610b75610b66620151808661155b565b610b70848861155b565b6120ea565b610b94565b610b94610b8a620151808461155b565b610b70868861155b565b9050610ba6600282111561013f6116ad565b610bb28483428961211d565b50505050505050565b60055460ff1690565b60006107be6114b3565b610bd6612048565b610bde61216c565b610be78161217f565b50565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610866918590610c4490866121f8565b61183b565b600c546000908190610c5e8160e9601761169e565b9250610c6d81600060e961169e565b9150509091565b610c7c612048565b610906600061220a565b610c8e612048565b610c9661216c565b610ca0828261227d565b5050565b610cac612048565b6109066001612372565b6000610cc9610cc483611dc8565b6123c9565b90505b919050565b600d8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561084f5780601f106108245761010080835404028352916020019161084f565b6008546000906107be9060c0603f61169e565b60006060610d5b8651610d566116cb565b61241c565b610d708989898989898961242961244b6124b4565b97509795505050505050565b60006060600080600080610d8e6125de565b9398509196509450925090506000610da685856121f8565b90506000610db2612076565b5090506000848214610dcd57610dc882896126ce565b610dcf565b835b9050610ddb8184612830565b9850505050505050505090565b6000806000610df5612076565b90949093506103e892509050565b6000610e0d61124f565b15610e1a57506000610ccc565b81610e6657610e27610908565b610e51577f0000000000000000000000000000000000000000000000000000000000000000610e5f565b600b5467ffffffffffffffff165b9050610ccc565b6002821415610e8e5750600b5468010000000000000000900467ffffffffffffffff16610ccc565b6003821415610eb15750600b54600160801b900467ffffffffffffffff16610ccc565b610ccc6101bb612881565b6001600160a01b031660009081526020819052604090205490565b60608088610ee6610720611147565b610ef1610746610bea565b60606000610efe86612891565b15610f2657610f0b6128c0565b610f1d89610f1761092c565b886128d3565b92509050610f78565b610f2e6116bb565b6060610f38611707565b9050610f448a82612917565b610f688d8d8d8d8d610f5461124f565b610f5e578d610f61565b60005b878e612429565b93509150610f76838261244b565b505b610f828b82612980565b81895167ffffffffffffffff81118015610f9b57600080fd5b50604051908082528060200260200182016040528015610fc5578160200160208202803683370190505b509450945050505b5097509795505050505050565b6000610cc98261116b565b6000806000806000600a6000610ffa88611dc8565b8152602081019190915260400160002054905061101b8115156101556116ad565b6110248161298a565b945061102f81612998565b935061103a816129a6565b9597949650949392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b611073612048565b610906600161220a565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016110b2929190615b90565b604051602081830303815290604052805190602001209050919050565b60008060006110dc6125de565b505092509250506110f681836121f890919063ffffffff16565b9250505090565b6000606061110e8651610d566116cb565b610d70898989898989896129c86129d96124b4565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561084f5780601f106108245761010080835404028352916020019161084f565b6000806111f43385611444565b905080831061120e576112093385600061183b565b61121b565b61121b338585840361183b565b5060019392505050565b6000610866338484611c4a565b60006107be612a42565b6000610cc961124a83611dc8565b612abc565b6008546000906107be9060ff612ae4565b611268612048565b6109066000612372565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886112c58c61116b565b896040516020016112db96959493929190615d4e565b60405160208183030381529060405280519060200120905061130c8882611303878787612aee565b886101f8612b2d565b61131788888861183b565b5050505050505050565b60608088611330610720611147565b61133b610746610bea565b6113436116bb565b606061134d611707565b905061135761092c565b611404576000606061136c8d8d8d868b612b84565b9150915061138561137b611834565b83101560cc6116ad565b6113976000611392611834565b612c5d565b6113aa8b6113a3611834565b8403612c5d565b6113b481846129d9565b808a5167ffffffffffffffff811180156113cd57600080fd5b506040519080825280602002602001820160405280156113f7578160200160208202803683370190505b5095509550505050610fcd565b61140e8882612917565b600060606114368d8d8d8d8d61142261124f565b61142c578d61142f565b60005b898e6129c8565b915091506113aa8b83612c5d565b600061144e611147565b6001600160a01b0316826001600160a01b03161415611470575060001961086a565b61147a8383612c67565b905061086a565b60001981565b61148f612048565b60008061149a612076565b915091506114aa816101406116ad565b610ca082612c92565b60006107be612ccd565b6114c5612048565b6114cd611d2a565b60006114d883611dc8565b905060006114e582611b21565b90506114fe6001600160a01b03821615156101556116ad565b611509828285611f65565b806001600160a01b0316827fdd6d1c9badb346de6925b358a472c937b41698d2632696759e43fd6527feeec4856040516115439190615d26565b60405180910390a350505050565b80610ca081612d6a565b600082820261157f84158061157857508385838161157557fe5b04145b60036116ad565b9392505050565b61159e828414801561159757508183145b60676116ad565b505050565b60006001821b19841682846115b95760006115bc565b60015b60ff16901b17949350505050565b60006115d7848484612de3565b5082821b6000196001831b01831b198516175b949350505050565b60006116028383111560016116ad565b50900390565b600061161b606084901c156101496116ad565b6115ea42830160e060206116388660c083838c8c600060606115ca565b9291906115ca565b6000610cc961164e8361298a565b83906060806115ca565b600061167167ffffffffffffffff8311156101ba6116ad565b5090565b6000611682848484612de3565b50501b90565b6000818310611697578161157f565b5090919050565b6001901b6000190191901c1690565b81610ca057610ca081612881565b6116c3612e29565b610906612e31565b7f000000000000000000000000000000000000000000000000000000000000000090565b61159e818410801561170057508183105b60646116ad565b606060006117136116cb565b905060608167ffffffffffffffff8111801561172e57600080fd5b50604051908082528060200260200182016040528015611758578160200160208202803683370190505b50905060005b828110156109f957611781611772826123c9565b61177b83612e59565b90612f77565b82828151811061178d57fe5b602090810291909101015260010161175e565b60208501516000906001600160a01b03163014806117ca575060408601516001600160a01b031630145b6117e0576117db8686868686612fa3565b6117ed565b6117ed868686868661300d565b90505b95945050505050565b60208501516000906001600160a01b0316301480611823575060408601516001600160a01b031630145b6117e0576117db8686868686613111565b620f424090565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611896908590615d26565b60405180910390a3505050565b6118ab611d2a565b6118b361216c565b606060008060006118c26125de565b94509450945050935060008311156118dd576118dd83613168565b60006118e7612076565b5090506000838214611902576118fd82876126ce565b611904565b825b90506119108282613179565b505050505050565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c326390611947908590600401615d26565b60206040518083038186803b15801561195f57600080fd5b505afa158015611973573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119979190615a3c565b9050816119ce576119a781611658565b600b805467ffffffffffffffff191667ffffffffffffffff92909216919091179055611a7f565b6002821415611a1c576119e081611658565b600b805467ffffffffffffffff9290921668010000000000000000026fffffffffffffffff000000000000000019909216919091179055611a7f565b6003821415611a7457611a2e81611658565b600b805467ffffffffffffffff92909216600160801b027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff909216919091179055611a7f565b611a7f6101bb612881565b817f6bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a82604051611aaf9190615d26565b60405180910390a2505050565b6000611ac6611afd565b4211806107be57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b600081611b4f57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160011415611b7f57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160021415611baf57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160031415611bdf57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160041415611c0f57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160051415611c3f57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b610ccc610135612881565b611c616001600160a01b03841615156101986116ad565b611c786001600160a01b03831615156101996116ad565b611c8383838361159e565b6001600160a01b038316600090815260208190526040902054611ca990826101a061319f565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611cd890826121f8565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611896908590615d26565b60408051600080825260208201909252606091611d5d565b611d4a6152aa565b815260200190600190039081611d425790505b509050611d68611147565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b8152600401611d939190615c34565b600060405180830381600087803b158015611dad57600080fd5b505af1158015611dc1573d6000803e3d6000fd5b5050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e0c57506000610ccc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e4e57506001610ccc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e9057506002610ccc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611ed257506003610ccc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611f1457506004610ccc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611c3f57506005610ccc565b6000610cc98260c0602061169e565b6000826001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b158015611fa057600080fd5b505afa158015611fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd89190615a3c565b6000858152600a6020526040902054909150611ff5818385611608565b6000868152600a602052604090819020919091555185907fb77a83204ca282e08dc3a65b0a1ca32ea4e6875c38ef0bf5bf75e52a67354fac90612039908590615d26565b60405180910390a25050505050565b600061205f6000356001600160e01b03191661107d565b9050610be761206e82336131b5565b6101916116ad565b60008060008060008061208761329e565b9350935093509350804210156120da5760019450838311156120be5781810382420385850302816120b457fe5b04840195506120d5565b81810382420384860302816120cf57fe5b04840395505b6120e2565b600094508295505b505050509091565b60006120f982151560046116ad565b826121065750600061086a565b81600184038161211257fe5b04600101905061086a565b612129848484846132fd565b7f1835882ee7a34ac194f717a35e09bb1d24c82a3b9d854ab6c9749525b714cdf28484848460405161215e9493929190615e4c565b60405180910390a150505050565b610906612177611abc565b6101926116ad565b61219461218a61333c565b82101560cb6116ad565b6121a961219f613345565b82111560ca6116ad565b6008546121ba908260c0603f6115ca565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc906121ed908390615d26565b60405180910390a150565b600082820161157f84821015836116ad565b801561222a5761222561221b611ad9565b42106101936116ad565b61223f565b61223f612235611afd565b42106101a96116ad565b6007805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be64906121ed908390615d03565b6000612287610bea565b90506000612293611147565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b81526004016122c0929190615dc7565b60806040518083038186803b1580156122d857600080fd5b505afa1580156122ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123109190615a75565b604051630639cdb560e21b81529094506001600160a01b03851693506318e736d49250612344915085908790600401615dae565b600060405180830381600087803b15801561235e57600080fd5b505af1158015611317573d6000803e3d6000fd5b600854612381908260ff6115a3565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c8906123b4908390615d03565b60405180910390a180610be757610be7613351565b60006123d3611047565b8214156123e95750670de0b6b3a7640000610ccc565b6000828152600a6020526040902054801561240c576124078161298a565b61157f565b670de0b6b3a76400009392505050565b610ca081831460676116ad565b6000606061243a600088868661342b565b915091509850989650505050505050565b8151815161245a90829061241c565b60005b81811015610ad25761249584828151811061247457fe5b602002602001015184838151811061248857fe5b6020026020010151612830565b8482815181106124a157fe5b602090810291909101015260010161245d565b333014612572576000306001600160a01b03166000366040516124d8929190615ba8565b6000604051808303816000865af19150503d8060008114612515576040519150601f19603f3d011682016040523d82523d6000602084013e61251a565b606091505b50509050806000811461252957fe5b60046000803e6000516001600160e01b0319166343adbafb60e01b8114612554573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b61257a6116bb565b6060612584611707565b90506125908782612917565b600060606125a88c8c8c8c8c8c898d8d63ffffffff16565b915091506125ba81848663ffffffff16565b8051601f1982018390526343adbafb603f1983015260200260231982016044820181fd5b606060008060008060606125f0611147565b6001600160a01b031663f94d4668612606610bea565b6040518263ffffffff1660e01b81526004016126229190615d26565b60006040518083038186803b15801561263a57600080fd5b505afa15801561264e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612676919081019061556d565b5091505061268b81612686611707565b612917565b612694816134d9565b9650945060006126a2610c49565b909450905060006126b4888684613512565b945090506126c2878261359f565b95505050509091929394565b80516000908190815b8181101561270f576127058582815181106126ee57fe5b6020026020010151846121f890919063ffffffff16565b92506001016126d7565b50816127205760009250505061086a565b600082868302825b60ff811015612819578260005b868110156127765761276c61274a838761155b565b6127678c848151811061275957fe5b60200260200101518a61155b565b6135b7565b9150600101612735565b508394506127cf6127ae6127a861278d848a61155b565b6127a261279a888d61155b565b6103e86135b7565b906121f8565b8661155b565b6127676127be896001018561155b565b6127a261279a6103e889038a61155b565b9350848411156127f7576001858503116127f2578397505050505050505061086a565b612810565b600184860311612810578397505050505050505061086a565b50600101612728565b50612825610141612881565b505050505092915050565b600061283f82151560046116ad565b8261284c5750600061086a565b670de0b6b3a76400008381029061286f9085838161286657fe5b041460056116ad565b82818161287857fe5b0491505061086a565b610be7816210905360ea1b6135d7565b6000808251118015610cc9575060ff8016828060200190518101906128b69190615ab5565b60ff161492915050565b6109066128cb61124f565b6101b66116ad565b60006060600060606128e4876134d9565b91509150600060606128f7838589613638565b9150915081612907826000613664565b9550955050505050935093915050565b8151815161292690829061241c565b60005b81811015610ad25761296184828151811061294057fe5b602002602001015184838151811061295457fe5b6020026020010151612f77565b84828151811061296d57fe5b6020908102919091010152600101612929565b610ca08282613721565b6000610cc98282606061169e565b6000610cc98260608061169e565b6000806129b283611f56565b91506129c18360e0602061169e565b9050915091565b6000606061243a600188868661342b565b815181516129e890829061241c565b60005b81811015610ad257612a23848281518110612a0257fe5b6020026020010151848381518110612a1657fe5b60200260200101516137ed565b848281518110612a2f57fe5b60209081029190910101526001016129eb565b6000612a4c611147565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015612a8457600080fd5b505afa158015612a98573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107be9190615724565b6000610cc97f0000000000000000000000000000000000000000000000000000000000000000835b1c60019081161490565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b6000612b388561383b565b9050612b4e612b48878387613857565b836116ad565b612b5d428410156101b86116ad565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606000612b9384613906565b9050612bae6000826003811115612ba657fe5b1460ce6116ad565b6060612bb98561391c565b9050612bc78151875161241c565b612bd18187612917565b6000612bdb612076565b5090506060612be983613932565b90506000612bf783836126ce565b9050806000612c146d8000000000000000000000000000836115f2565b9050612c208d82612c5d565b8086612c2a611047565b81518110612c3457fe5b602002602001018181525050612c4a8584613179565b509c939b50929950505050505050505050565b610ca082826139d4565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b612c9e818242426132fd565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a0233816040516121ed9190615d26565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612d3a613a61565b30604051602001612d4f959493929190615d82565b60405160208183030381529060405280519060200120905090565b600281511015612d7957610be7565b600081600081518110612d8857fe5b602002602001015190506000600190505b825181101561159e576000838281518110612db057fe5b60200260200101519050612dd9816001600160a01b0316846001600160a01b03161060656116ad565b9150600101612d99565b612df2610100831060646116ad565b612e1a600182101580156117005750612e1060ff8461010003611688565b82111560646116ad565b61159e83821c156101b46116ad565b61090661216c565b6000612e3b6116cb565b905060005b81811015610ca057612e5181613a65565b600101612e40565b600081612e8757507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160011415612eb757507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160021415612ee757507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160031415612f1757507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160041415612f4757507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b8160051415611c3f57507f0000000000000000000000000000000000000000000000000000000000000000610ccc565b6000828202612f9184158061157857508385838161157557fe5b670de0b6b3a764000090049392505050565b6000612faf8583612917565b612fd08660600151838581518110612fc357fe5b6020026020010151613ab9565b60608701526000612fe387878787613ac5565b905061300281848781518110612ff557fe5b6020026020010151613ad9565b90506107a981613ae5565b600080808751600181111561301e57fe5b14905061302b8684612917565b61304b8760600151848361303f5786613041565b875b81518110612fc357fe5b876060018181525050600060606000806130648a613b01565b9350935093509350600080613077611047565b8a1461309d57613098878e60600151876130908e613b6a565b888b89613b9f565b6130b8565b6130b8878e60600151876130b08f613b6a565b888b89613bd8565b915091506130c98486858985613bfc565b866130e3576130de828a8d81518110612ff557fe5b613100565b613100828a8c815181106130f357fe5b6020026020010151613c7c565b9d9c50505050505050505050505050565b60006131208660600151613c88565b606087015261312f8583612917565b6131438660600151838681518110612fc357fe5b6060870152600061315687878787613ca9565b90506107a9818486815181106130f357fe5b610be7613173611272565b82612c5d565b61318681600060e9611675565b6131938360e96017611675565b17600c55610ca0613cbd565b60006131ae84841115836116ad565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6131d4611123565b6001600160a01b0316141580156131ef57506131ef83613cf3565b15613217576131fc611123565b6001600160a01b0316336001600160a01b031614905061086a565b61321f612a42565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161324e93929190615d2f565b60206040518083038186803b15801561326657600080fd5b505afa15801561327a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147a9190615639565b6000806000806132bd6000604060095461169e9092919063ffffffff16565b6009549094506132cf9060408061169e565b6009549093506132e2906080604061169e565b6009549092506132f59060c0604061169e565b905090919293565b61330a8160c06040611675565b6133178360806040611675565b61332385604080611675565b6133308760006040611675565b17171760095550505050565b64e8d4a5100090565b67016345785d8a000090565b613359611d2a565b6060613363611147565b6001600160a01b031663f94d4668613379610bea565b6040518263ffffffff1660e01b81526004016133959190615d26565b60006040518083038186803b1580156133ad57600080fd5b505afa1580156133c1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133e9919081019061556d565b509150506133f981612686611707565b606061340482613932565b90506000613410612076565b509050600061341f82846126ce565b9050610ad28282613179565b600060606000606060008061343f89613b01565b93509350935093506152da8a61345757613cfe61345b565b613d935b905060006060613473868689878f8f8963ffffffff16565b915091506152da8d613487576115f261348b565b6121f85b9050613498878383613e11565b60006134a889858463ffffffff16565b90506134b78789888c85613bfc565b836134c3846000613664565b9a509a5050505050505050505094509492505050565b60006060613500836134e9611047565b815181106134f357fe5b6020026020010151613e7e565b61350984613932565b91509150915091565b60008060008060006135248888613e92565b925092509250600086841161353a57600061353e565b8684035b90506000848411613550576000613554565b8484035b9050600061356f6135656000610e03565b61177b8587612830565b9050600061358a6135806002610e03565b61177b8588612830565b919091019b939a509298505050505050505050565b600061157f6135ae848461155b565b61276784613f14565b60006135c682151560046116ad565b8183816135cf57fe5b049392505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60006060600061364784613f3a565b90506060613656878784613f50565b919791965090945050505050565b6060825160010167ffffffffffffffff8111801561368157600080fd5b506040519080825280602002602001820160405280156136ab578160200160208202803683370190505b50905060005b815181101561371a576136c2611047565b81146136f957836136d1611047565b82106136e057600182036136e2565b815b815181106136ec57fe5b60200260200101516136fb565b825b82828151811061370757fe5b60209081029190910101526001016136b1565b5092915050565b6137386001600160a01b038316151561019b6116ad565b6137448260008361159e565b6001600160a01b03821660009081526020819052604090205461376a90826101b261319f565b6001600160a01b03831660009081526020819052604090205561379d6137988261379261092c565b90613fff565b61400d565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516137e19190615d26565b60405180910390a35050565b60006137fc82151560046116ad565b826138095750600061086a565b670de0b6b3a7640000838102906138239085838161286657fe5b82600182038161382f57fe5b0460010191505061086a565b6000613845612ccd565b826040516020016110b2929190615bb8565b600061386982516041146101b96116ad565b60208281015160408085015160608601518251600080825295019283905292939092811a916001906138a2908990859088908890615dde565b6020604051602081039080840390855afa1580156138c4573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906138fa5750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b600081806020019051810190610cc9919061584f565b60608180602001905181019061157f919061586a565b606080600183510367ffffffffffffffff8111801561395057600080fd5b5060405190808252806020026020018201604052801561397a578160200160208202803683370190505b50905060005b815181101561371a5783613992611047565b82106139a157816001016139a3565b815b815181106139ad57fe5b60200260200101518282815181106139c157fe5b6020908102919091010152600101613980565b6139e06000838361159e565b6139ef613798826127a261092c565b6001600160a01b038216600090815260208190526040902054613a1290826121f8565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906137e1908590615d26565b4690565b613a6d611047565b811415613a7957610be7565b6000818152600a60205260409020548015610ca057600080613a9a836129a6565b9150915080421115610ad257610ad284613ab386611b21565b84611f65565b600061157f8383612f77565b60006117f060008660600151868686614012565b600061157f83836137ed565b6000610cc9613afa613af5610d32565b613f14565b83906137ed565b60006060600080600080613b13610c49565b91509150600060606000613b288a8686614084565b9250925092506000613b38612076565b5090506000868214613b5357613b4e82856126ce565b613b55565b825b949c939b509099509297509095505050505050565b6000613b81613b77611047565b83141560646116ad565b613b89611047565b821061167157613b9a8260016115f2565b610cc9565b60008088613bba57613bb58888888888886140dc565b613bc8565b613bc88888888888886141b3565b9150915097509795505050505050565b60008088613bee57613bb5888888888888614214565b613bc888888888888861427a565b6000613c0886866126ce565b90506000613c168385612830565b90506000613c248683612f77565b905080831115613c72578083036000613c4e613c4883613c4384610e03565b61155b565b866135b7565b90508015613c6f576000613c62878361359f565b9050613c6d81613168565b505b50505b6113178884613179565b600061157f8383612830565b600080613c9d613c96610d32565b8490614329565b905061157f83826115f2565b60006117f060018660600151868686614012565b6000613cc76116cb565b905060005b81811015610ca057613cdd81614365565b15613ceb57613ceb81614394565b600101613ccc565b6000610cc9826143c2565b600060606000613d0d846143cd565b90506001816002811115613d1d57fe5b1415613d3b57613d3187878a8c89896143e3565b9250925050613d88565b6002816002811115613d4957fe5b1415613d5a57613d31878a86614442565b6000816002811115613d6857fe5b1415613d7b57613d3187878a8c88614460565b613d86610150612881565b505b965096945050505050565b600060606000613da284613906565b90506001816003811115613db257fe5b1415613dc657613d3187878a8c8989614501565b6003816003811115613dd457fe5b1415613de557613d31878a86614550565b6002816003811115613df357fe5b1415613e0657613d3187878a8c8861456e565b613d86610136612881565b82518251613e2090829061241c565b60005b81811015611dc157613e5f858281518110613e3a57fe5b6020026020010151858381518110613e4e57fe5b60200260200101518563ffffffff16565b858281518110613e6b57fe5b6020908102919091010152600101613e23565b6000610cc982613e8c61092c565b906115f2565b6000806000613eab84613ea68760016145e8565b6126ce565b9250613eb56146f1565b15613ece57613ec484866126ce565b9150819050613f0d565b613ed6614715565b15613eef57829150613ee884866126ce565b9050613f0d565b613efe84613ea68760006145e8565b9150613f0a84866126ce565b90505b9250925092565b6000670de0b6b3a76400008210613f2c576000610cc9565b50670de0b6b3a76400000390565b60008180602001905181019061157f9190615ad1565b60606000613f5e8385612830565b9050845167ffffffffffffffff81118015613f7857600080fd5b50604051908082528060200260200182016040528015613fa2578160200160208202803683370190505b50915060005b8551811015613ff657613fd782878381518110613fc157fe5b6020026020010151612f7790919063ffffffff16565b838281518110613fe357fe5b6020908102919091010152600101613fa8565b50509392505050565b600061157f8383600161319f565b600255565b6000606061401f85613932565b9050600061402c85613b6a565b9050600061403985613b6a565b90506000614045612076565b509050600061405482866126ce565b90508a156140765761406a828686868e86614739565b955050505050506117f0565b61406a828686868e866147c4565b600060606000806060614096886134d9565b915091506000806140a8838a8a613512565b9150915060006140b8858461359f565b905080156140c9576140c981613168565b9390930199919850919650945050505050565b6000806060875167ffffffffffffffff811180156140f957600080fd5b50604051908082528060200260200182016040528015614123578160200160208202803683370190505b5090508881888151811061413357fe5b6020026020010181815250506000614156878a848989614151610d32565b614857565b905061417e8a8a8a8151811061416857fe5b60200260200101516115f290919063ffffffff16565b89898151811061418a57fe5b602090810291909101015260006141a187836115f2565b919b919a509098505050505050505050565b60008060006141ce8689898c89896141c9610d32565b614ae7565b90506141e08189898151811061416857fe5b8888815181106141ec57fe5b60209081029190910101526000614203868b6115f2565b919a91995090975050505050505050565b600080600061422f8689898c898961422a610d32565b614bd6565b90506142578189898151811061424157fe5b60200260200101516121f890919063ffffffff16565b88888151811061426357fe5b60209081029190910101526000614203868b6121f8565b6000806060875167ffffffffffffffff8111801561429757600080fd5b506040519080825280602002602001820160405280156142c1578160200160208202803683370190505b509050888188815181106142d157fe5b60200260200101818152505060006142f4878a8489896142ef610d32565b614ca3565b90506143068a8a8a8151811061424157fe5b89898151811061431257fe5b602090810291909101015260006141a187836121f8565b600082820261434384158061157857508385838161157557fe5b8061435257600091505061086a565b670de0b6b3a7640000600019820161382f565b6000610cc97f000000000000000000000000000000000000000000000000000000000000000060068401612ae4565b6000818152600a60205260409020546143ac81611640565b6000928352600a60205260409092209190915550565b6000610cc982614f0d565b600081806020019051810190610cc9919061578e565b600060608060006143f385614f30565b915091506144038251885161241c565b6144108261268688613932565b60006144228989858e8e614151610d32565b90506144328282111560cf6116ad565b9a91995090975050505050505050565b60006060600061445184614f53565b90506060613656868884613f50565b6000606060008061447085614f69565b915091506144828651821060646116ad565b6060865167ffffffffffffffff8111801561449c57600080fd5b506040519080825280602002602001820160405280156144c6578160200160208202803683370190505b5090506144da888884868e8e6141c9610d32565b8183815181106144e657fe5b60209081029190910101529199919850909650505050505050565b6000606080600061451185614f80565b915091506145218751835161241c565b61452e8261268688613932565b60006145408989858e8e6142ef610d32565b90506144328282101560d06116ad565b60006060600061455f84614f98565b90506060613656868389614fae565b6000606060008061457e8561504a565b915091506145908651821060646116ad565b6060865167ffffffffffffffff811180156145aa57600080fd5b506040519080825280602002602001820160405280156145d4578160200160208202803683370190505b5090506144da888884868e8e61422a610d32565b8151606090818167ffffffffffffffff8111801561460557600080fd5b5060405190808252806020026020018201604052801561462f578160200160208202803683370190505b50905060005b828110156146e8576000614647611047565b8210156146545781614659565b816001015b905061466481612abc565b8061467b575085801561467b575061467b81614365565b6146985786828151811061468b57fe5b60200260200101516146c8565b6146c88783815181106146a757fe5b6020026020010151600a600084815260200190815260200160002054615061565b8383815181106146d457fe5b602090810291909101015250600101614635565b50949350505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061474b8387878151811061424157fe5b86868151811061475757fe5b60200260200101818152505060006147718888858861507c565b90508387878151811061478057fe5b60200260200101510387878151811061479557fe5b6020026020010181815250506147b66001613e8c838a898151811061416857fe5b9150505b9695505050505050565b60006147d68387868151811061416857fe5b8685815181106147e257fe5b60200260200101818152505060006147fc8888858961507c565b90508387868151811061480b57fe5b60200260200101510187868151811061482057fe5b6020026020010181815250506147b660016127a289898151811061484057fe5b6020026020010151846115f290919063ffffffff16565b600080805b87518110156148955761488b88828151811061487457fe5b6020026020010151836121f890919063ffffffff16565b915060010161485c565b506060865167ffffffffffffffff811180156148b057600080fd5b506040519080825280602002602001820160405280156148da578160200160208202803683370190505b5090506000805b89518110156149a7576000614912858c84815181106148fc57fe5b60200260200101516137ed90919063ffffffff16565b90506149548b838151811061492357fe5b602002602001015161494e8c858151811061493a57fe5b60200260200101518e868151811061416857fe5b906137ed565b84838151811061496057fe5b60200260200101818152505061499c6149958286858151811061497f57fe5b602002602001015161432990919063ffffffff16565b84906121f8565b9250506001016148e1565b506060895167ffffffffffffffff811180156149c257600080fd5b506040519080825280602002602001820160405280156149ec578160200160208202803683370190505b50905060005b8a51811015614ab7576000848281518110614a0957fe5b6020026020010151841115614a70576000614a32614a2686613f14565b8e8581518110613fc157fe5b90506000614a46828e868151811061416857fe5b9050614a67614a6082670de0b6b3a76400008d90036137ed565b83906121f8565b92505050614a87565b8a8281518110614a7c57fe5b602002602001015190505b614a97818d848151811061416857fe5b838381518110614aa357fe5b6020908102919091010152506001016149f2565b506000614ac48c836126ce565b90506000614ad2828a612830565b9050613100614ae082613f14565b8b90614329565b600080614b0284614afc8761494e818b6115f2565b90614329565b90506000614b128a8a848b61507c565b90506000614b26828b8b8151811061416857fe5b90506000805b8b51811015614b4e57614b448c828151811061487457fe5b9150600101614b2c565b506000614b77828d8d81518110614b6157fe5b602002602001015161283090919063ffffffff16565b90506000614b8482613f14565b90506000614b928583614329565b90506000614ba086836115f2565b9050614bc1614bba83670de0b6b3a76400008d9003612f77565b82906121f8565b98505050505050505050979650505050505050565b600080614beb84614afc8761494e818b6121f8565b90506000614bfb8a8a848b61507c565b90506000614c258a8a81518110614c0e57fe5b6020026020010151836115f290919063ffffffff16565b90506000805b8b51811015614c4d57614c438c828151811061487457fe5b9150600101614c2b565b506000614c60828d8d81518110614b6157fe5b90506000614c6d82613f14565b90506000614c7b8583614329565b90506000614c8986836115f2565b9050614bc1614bba83670de0b6b3a76400008d90036137ed565b600080805b8751811015614cca57614cc088828151811061487457fe5b9150600101614ca8565b506060865167ffffffffffffffff81118015614ce557600080fd5b50604051908082528060200260200182016040528015614d0f578160200160208202803683370190505b5090506000805b8951811015614da9576000614d31858c8481518110614b6157fe5b9050614d738b8381518110614d4257fe5b6020026020010151614d6d8c8581518110614d5957fe5b60200260200101518e868151811061424157fe5b90612830565b848381518110614d7f57fe5b602002602001018181525050614d9e61499582868581518110613fc157fe5b925050600101614d16565b506060895167ffffffffffffffff81118015614dc457600080fd5b50604051908082528060200260200182016040528015614dee578160200160208202803683370190505b50905060005b8a51811015614eaf57600083858381518110614e0c57fe5b60200260200101511115614e68576000614e31614a2686670de0b6b3a76400006115f2565b90506000614e45828e868151811061416857fe5b9050614e5f614a6082670de0b6b3a76400008d9003612f77565b92505050614e7f565b8a8281518110614e7457fe5b602002602001015190505b614e8f818d848151811061424157fe5b838381518110614e9b57fe5b602090810291909101015250600101614df4565b506000614ebc8c836126ce565b90506000614eca828a612830565b9050670de0b6b3a7640000811115614efe57614ef18a670de0b6b3a763ffff198301612f77565b96505050505050506147ba565b600096505050505050506147ba565b6000614f1f63f4b7964d60e01b61107d565b821480610cc95750610cc982615239565b6060600082806020019051810190614f4891906157a9565b909590945092505050565b60008180602001905181019061157f91906157ee565b60008082806020019051810190614f48919061581a565b6060600082806020019051810190614f4891906158ad565b60008180602001905181019061157f91906158cb565b60606000614fbc84846137ed565b90506060855167ffffffffffffffff81118015614fd857600080fd5b50604051908082528060200260200182016040528015615002578160200160208202803683370190505b50905060005b8651811015615040576150218388838151811061497f57fe5b82828151811061502d57fe5b6020908102919091010152600101615008565b5095945050505050565b60008082806020019051810190614f4891906158e7565b600061157f61507384613c4385612998565b6127678461298a565b60008084518602905060008560008151811061509457fe5b6020026020010151905060008651876000815181106150af57fe5b60200260200101510290506000600190505b8751811015615115576150fa6150f46150ed848b85815181106150e057fe5b602002602001015161155b565b8a5161155b565b886135b7565b915061510b8882815181106126ee57fe5b92506001016150c1565b5086858151811061512257fe5b602002602001015182039150600061513a878861155b565b9050600061516661515a61515284610b70898861155b565b6103e861155b565b8a89815181106150e057fe5b9050600061518161517a6151528b896135b7565b86906121f8565b905060008061519d61519386866121f8565b610b708d866121f8565b905060005b60ff81101561521d578192506151d26151bf866127a2858661155b565b610b708e613e8c886127a288600261155b565b9150828211156151fb576001838303116151f6575097506115ea9650505050505050565b615215565b600182840311615215575097506115ea9650505050505050565b6001016151a2565b50615229610142612881565b5050505050505050949350505050565b600061524b632f1a0bc960e01b61107d565b8214806152665750615263637587926b60e11b61107d565b82145b80610cc95750610cc9826000615282631c74c91760e11b61107d565b82148061529d575061529a6350dd6ed960e01b61107d565b82145b80610cc957506000610cc9565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565bfe5b803561086a81615ebc565b600082601f8301126152f7578081fd5b813561530a61530582615e9c565b615e75565b81815291506020808301908481018184028601820187101561532b57600080fd5b60005b848110156128255781358452928201929082019060010161532e565b600082601f83011261535a578081fd5b815161536861530582615e9c565b81815291506020808301908481018184028601820187101561538957600080fd5b60005b848110156128255781518452928201929082019060010161538c565b600082601f8301126153b8578081fd5b813567ffffffffffffffff8111156153ce578182fd5b6153e1601f8201601f1916602001615e75565b91508082528360208285010111156153f857600080fd5b8060208401602084013760009082016020015292915050565b80516003811061086a57600080fd5b80516004811061086a57600080fd5b80356002811061086a57600080fd5b60006020828403121561544f578081fd5b813561157f81615ebc565b6000806040838503121561546c578081fd5b823561547781615ebc565b9150602083013561548781615ebc565b809150509250929050565b6000806000606084860312156154a6578081fd5b83356154b181615ebc565b925060208401356154c181615ebc565b929592945050506040919091013590565b600080600080600080600060e0888a0312156154ec578283fd5b87356154f781615ebc565b9650602088013561550781615ebc565b95506040880135945060608801359350608088013561552581615ed1565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215615554578182fd5b823561555f81615ebc565b946020939093013593505050565b600080600060608486031215615581578081fd5b835167ffffffffffffffff80821115615598578283fd5b818601915086601f8301126155ab578283fd5b81516155b961530582615e9c565b80828252602080830192508086018b8283870289010111156155d9578788fd5b8796505b848710156156045780516155f081615ebc565b8452600196909601959281019281016155dd565b50890151909750935050508082111561561b578283fd5b506156288682870161534a565b925050604084015190509250925092565b60006020828403121561564a578081fd5b8151801515811461157f578182fd5b600080600080600080600060e0888a031215615673578081fd5b87359650602088013561568581615ebc565b9550604088013561569581615ebc565b9450606088013567ffffffffffffffff808211156156b1578283fd5b6156bd8b838c016152e7565b955060808a0135945060a08a0135935060c08a01359150808211156156e0578283fd5b506156ed8a828b016153a8565b91505092959891949750929550565b60006020828403121561570d578081fd5b81356001600160e01b03198116811461157f578182fd5b600060208284031215615735578081fd5b815161157f81615ebc565b60008060408385031215615752578182fd5b823561575d81615ebc565b9150602083013567ffffffffffffffff811115615778578182fd5b615784858286016153a8565b9150509250929050565b60006020828403121561579f578081fd5b61157f8383615411565b6000806000606084860312156157bd578081fd5b6157c78585615411565b9250602084015167ffffffffffffffff8111156157e2578182fd5b6156288682870161534a565b60008060408385031215615800578182fd5b61580a8484615411565b9150602083015190509250929050565b60008060006060848603121561582e578081fd5b6158388585615411565b925060208401519150604084015190509250925092565b600060208284031215615860578081fd5b61157f8383615420565b6000806040838503121561587c578182fd5b6158868484615420565b9150602083015167ffffffffffffffff8111156158a1578182fd5b6157848582860161534a565b6000806000606084860312156158c1578081fd5b6157c78585615420565b600080604083850312156158dd578182fd5b61580a8484615420565b6000806000606084860312156158fb578081fd5b6158388585615420565b6000806000806080858703121561591a578182fd5b843567ffffffffffffffff80821115615931578384fd5b818701915061012080838a031215615947578485fd5b61595081615e75565b905061595c898461542f565b815261596b89602085016152dc565b602082015261597d89604085016152dc565b6040820152606083013560608201526080830135608082015260a083013560a08201526159ad8960c085016152dc565b60c08201526159bf8960e085016152dc565b60e082015261010080840135838111156159d7578687fd5b6159e38b8287016153a8565b828401525050809650506020870135915080821115615a00578384fd5b50615a0d878288016152e7565b949794965050505060408301359260600135919050565b600060208284031215615a35578081fd5b5035919050565b600060208284031215615a4d578081fd5b5051919050565b60008060408385031215615a66578182fd5b50508035926020909101359150565b60008060008060808587031215615a8a578182fd5b8451935060208501519250604085015191506060850151615aaa81615ebc565b939692955090935050565b600060208284031215615ac6578081fd5b815161157f81615ed1565b60008060408385031215615ae3578182fd5b8251615aee81615ed1565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015615b3a57815187529582019590820190600101615b1e565b509495945050505050565b60008151808452815b81811015615b6a57602081850181015186830182015201615b4e565b81811115615b7b5782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b81811015615c285783516001600160a01b031683529284019291840191600101615c03565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015615cbe578151805160048110615c6757fe5b855280870151615c7988870182615afe565b508581015186860152606080820151615c9482880182615afe565b505060809081015190615ca986820183615afe565b505060a0939093019290850190600101615c51565b5091979650505050505050565b60006020825261157f6020830184615b0b565b600060408252615cf16040830185615b0b565b82810360208401526117f08185615b0b565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000838252604060208301526115ea6040830184615b45565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825261157f6020830184615b45565b6000838252604060208301526115ea6040830184615b0b565b9283529015156020830152604082015260600190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615e9457600080fd5b604052919050565b600067ffffffffffffffff821115615eb2578081fd5b5060209081020190565b6001600160a01b0381168114610be757600080fd5b60ff81168114610be757600080fdfea2646970667358221220b1e5ec4de2ef1abf9e959c7f4391d7d01e93ab6b319e2acf4aba7247f67b09a664736f6c634300070100336bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100de5760003560e01c806354fd4d501161008c578063739238d611610066578063739238d61461018f578063851c1bb3146101975780638d928af8146101b7578063aaabadc5146101bf576100de565b806354fd4d501461015f5780636634b753146101675780636c57f5a914610187576100de565b80632f2770db116100bd5780632f2770db1461012d5780633f819b6f14610137578063549673e31461013f576100de565b8062c194db146100e3578063174481fa146101015780632da47c4014610117575b600080fd5b6100eb6101c7565b6040516100f89190610e4c565b60405180910390f35b6101096101e6565b6040516100f8929190610dff565b61011f61022c565b6040516100f8929190610fb9565b610135610296565b005b6100eb6102dd565b61015261014d366004610bcc565b610373565b6040516100f89190610e5f565b6100eb61044a565b61017a610175366004610b50565b6104a8565b6040516100f89190610e19565b61017a6104c6565b6101526104cf565b6101aa6101a5366004610b88565b6104f3565b6040516100f89190610e24565b610152610545565b610152610569565b60606101e160405180602001604052806000815250610635565b905090565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000009091565b600080427f000000000000000000000000000000000000000000000000000000000000000081101561028857807f000000000000000000000000000000000000000000000000000000000000000003925062278d009150610291565b60009250600091505b509091565b61029e61070e565b6102a661073f565b6001805460ff1916811790556040517f432acbfd662dbb5d8b378384a67159b47ca9d0f1b79f97cf64cf8585fa362d5090600090a1565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156103695780601f1061033e57610100808354040283529160200191610369565b820191906000526020600020905b81548152906001019060200180831161034c57829003601f168201915b5050505050905090565b600080600061038061022c565b91509150610439604051806101c0016040528061039b610545565b6001600160a01b031681526020016103b16104cf565b6001600160a01b031681526020018f81526020018e81526020018d81526020018b81526020018a81526020018981526020018c8152602001888152602001848152602001838152602001876001600160a01b031681526020016104126102dd565b90526040516104249190602001610e73565b60405160208183030381529060405285610754565b9d9c50505050505050505050505050565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156103695780601f1061033e57610100808354040283529160200191610369565b6001600160a01b031660009081526020819052604090205460ff1690565b60015460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610528929190610de7565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610573610545565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b1580156105ab57600080fd5b505afa1580156105bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e19190610bb0565b80517f602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe808352600091602081018484f0908452915061062f6001600160a01b03831615156101ac6107c1565b50919050565b8051604080517f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000818101858101848101602090810190965280855293957f00000000000000000000000000000000000000000000000000000000000000009592947f000000000000000000000000000000000000000000000000000000000000000094938801866000828a3c846000888301883c50602089810190898501016107008183866107d3565b505050505050505050919050565b60006107256000356001600160e01b0319166104f3565b905061073c6107348233610811565b6101916107c1565b50565b61075261074a6104c6565b1560d36107c1565b565b600061075e61073f565b600061076a84846108a1565b6001600160a01b038116600081815260208190526040808220805460ff191660011790555192935090917f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc9190a290505b92915050565b816107cf576107cf816108de565b5050565b5b602081106107f3578151835260209283019290910190601f19016107d4565b905182516020929092036101000a6000190180199091169116179052565b600061081b610569565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161084a93929190610e2d565b60206040518083038186803b15801561086257600080fd5b505afa158015610876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089a9190610b6c565b9392505050565b600060606108ae84610635565b90506000838251602084016000f590506001600160a01b0381166108d6573d6000803e3d6000fd5b949350505050565b62461bcd60e51b600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b60445261073c916210905360ea1b906242414c90606490fd5b80356107bb8161100e565b600082601f830112610954578081fd5b813561096761096282610fee565b610fc7565b81815291506020808301908481018184028601820187101561098857600080fd5b60005b848110156109b057813561099e81611023565b8452928201929082019060010161098b565b505050505092915050565b600082601f8301126109cb578081fd5b81356109d961096282610fee565b8181529150602080830190848101818402860182018710156109fa57600080fd5b60005b848110156109b0578135610a108161100e565b845292820192908201906001016109fd565b600082601f830112610a32578081fd5b8135610a4061096282610fee565b818152915060208083019084810181840286018201871015610a6157600080fd5b60005b848110156109b0578135610a778161100e565b84529282019290820190600101610a64565b600082601f830112610a99578081fd5b8135610aa761096282610fee565b818152915060208083019084810181840286018201871015610ac857600080fd5b60005b848110156109b057813584529282019290820190600101610acb565b600082601f830112610af7578081fd5b813567ffffffffffffffff811115610b0d578182fd5b610b20601f8201601f1916602001610fc7565b9150808252836020828501011115610b3757600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215610b61578081fd5b813561089a8161100e565b600060208284031215610b7d578081fd5b815161089a81611023565b600060208284031215610b99578081fd5b81356001600160e01b03198116811461089a578182fd5b600060208284031215610bc1578081fd5b815161089a8161100e565b6000806000806000806000806000806101408b8d031215610beb578586fd5b8a3567ffffffffffffffff80821115610c02578788fd5b610c0e8e838f01610ae7565b9b5060208d0135915080821115610c23578788fd5b610c2f8e838f01610ae7565b9a5060408d0135915080821115610c44578788fd5b610c508e838f016109bb565b995060608d0135985060808d0135915080821115610c6c578788fd5b610c788e838f01610a22565b975060a08d0135915080821115610c8d578687fd5b610c998e838f01610a89565b965060c08d0135915080821115610cae578586fd5b50610cbb8d828e01610944565b94505060e08b01359250610cd38c6101008d01610939565b91506101208b013590509295989b9194979a5092959850565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015610d2a578151151587529582019590820190600101610d0c565b509495945050505050565b6000815180845260208085019450808401835b83811015610d2a5781516001600160a01b031687529582019590820190600101610d48565b6000815180845260208085019450808401835b83811015610d2a57815187529582019590820190600101610d80565b60008151808452815b81811015610dc157602081850181015186830182015201610da5565b81811115610dd25782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6001600160a01b0392831681529116602082015260400190565b901515815260200190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b60006020825261089a6020830184610d9c565b6001600160a01b0391909116815260200190565b600060208252610e87602083018451610cec565b6020830151610e996040840182610cec565b5060408301516101c0806060850152610eb66101e0850183610d9c565b91506060850151601f1980868503016080870152610ed48483610d9c565b935060808701519150808685030160a0870152610ef18483610d35565b935060a08701519150808685030160c0870152610f0e8483610d35565b935060c08701519150808685030160e0870152610f2b8483610d6d565b935060e08701519150610100818786030181880152610f4a8584610cf9565b908801516101208881019190915288015161014080890191909152880151610160808901919091528801516101808089019190915288015190945091506101a0610f9681880184610cec565b870151868503909101838701529050610faf8382610d9c565b9695505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715610fe657600080fd5b604052919050565b600067ffffffffffffffff821115611004578081fd5b5060209081020190565b6001600160a01b038116811461073c57600080fd5b801515811461073c57600080fdfea2646970667358221220dc4ac16f23962bc6b71bd25e14e6d179b03cf8659c20ca0d8218eda975fe7d2d64736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/index.ts b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/index.ts new file mode 100644 index 0000000..12388d3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/index.ts @@ -0,0 +1,86 @@ +import { Task, TaskMode, TaskRunOptions } from '@src'; +import { ComposableStablePoolDeployment } from './input'; + +import { ZERO_ADDRESS, ZERO_BYTES32 } from '@helpers/constants'; +import { bn } from '@helpers/numbers'; +import * as expectEvent from '@helpers/expectEvent'; +import { getContractDeploymentTransactionHash, saveContractDeploymentTransactionHash } from '@src'; +import { ethers } from 'hardhat'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as ComposableStablePoolDeployment; + + const args = [input.Vault, input.ProtocolFeePercentagesProvider, input.FactoryVersion, input.PoolVersion]; + const factory = await task.deployAndVerify('ComposableStablePoolFactory', args, from, force); + + if (task.mode === TaskMode.LIVE) { + // We also create a Pool using the factory and verify it, to let us compute their action IDs and so that future + // Pools are automatically verified. We however don't run any of this code in CHECK mode, since we don't care about + // the contracts deployed here. The action IDs will be checked to be correct via a different mechanism. + + // The pauseWindowDuration and bufferPeriodDuration will be filled in later, but we need to declare them here to + // appease the type system. Those are constructor arguments, but automatically provided by the factory. + + const mockPoolArgs = { + vault: input.Vault, + protocolFeeProvider: input.ProtocolFeePercentagesProvider, + name: 'DO NOT USE - Mock Composable Stable Pool', + symbol: 'TEST', + tokens: [input.WETH, input.BAL].sort(function (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()); + }), + rateProviders: [ZERO_ADDRESS, ZERO_ADDRESS], + tokenRateCacheDurations: [0, 0], + exemptFromYieldProtocolFeeFlags: [false, false], + amplificationParameter: bn(100), + swapFeePercentage: bn(1e12), + pauseWindowDuration: undefined, + bufferPeriodDuration: undefined, + owner: ZERO_ADDRESS, + version: input.PoolVersion, + }; + + // This mimics the logic inside task.deploy + if (force || !task.output({ ensure: false })['MockComposableStablePool']) { + const poolCreationReceipt = await ( + await factory.create( + mockPoolArgs.name, + mockPoolArgs.symbol, + mockPoolArgs.tokens, + mockPoolArgs.amplificationParameter, + mockPoolArgs.rateProviders, + mockPoolArgs.tokenRateCacheDurations, + mockPoolArgs.exemptFromYieldProtocolFeeFlags, + mockPoolArgs.swapFeePercentage, + mockPoolArgs.owner, + ZERO_BYTES32 + ) + ).wait(); + const event = expectEvent.inReceipt(poolCreationReceipt, 'PoolCreated'); + const mockPoolAddress = event.args.pool; + + await saveContractDeploymentTransactionHash(mockPoolAddress, poolCreationReceipt.transactionHash, task.network); + await task.save({ MockComposableStablePool: mockPoolAddress }); + } + + const mockPool = await task.instanceAt('ComposableStablePool', task.output()['MockComposableStablePool']); + + // In order to verify the Pool's code, we need to complete its constructor arguments by computing the factory + // provided arguments (pause durations). + + // The durations require knowing when the Pool was created, so we look for the timestamp of its creation block. + const txHash = await getContractDeploymentTransactionHash(mockPool.address, task.network); + const tx = await ethers.provider.getTransactionReceipt(txHash); + const poolCreationBlock = await ethers.provider.getBlock(tx.blockNumber); + + // With those and the period end times, we can compute the durations. + const { pauseWindowEndTime, bufferPeriodEndTime } = await mockPool.getPausedState(); + mockPoolArgs.pauseWindowDuration = pauseWindowEndTime.sub(poolCreationBlock.timestamp); + mockPoolArgs.bufferPeriodDuration = bufferPeriodEndTime + .sub(poolCreationBlock.timestamp) + .sub(mockPoolArgs.pauseWindowDuration); + + // We are now ready to verify the Pool + await task.verify('ComposableStablePool', mockPool.address, [mockPoolArgs]); + } +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/input.ts b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/input.ts new file mode 100644 index 0000000..75f1962 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/input.ts @@ -0,0 +1,26 @@ +import { Task, TaskMode } from '@src'; + +export type ComposableStablePoolDeployment = { + Vault: string; + ProtocolFeePercentagesProvider: string; + FactoryVersion: string; + PoolVersion: string; + WETH: string; + BAL: string; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const ProtocolFeePercentagesProvider = new Task('20220725-protocol-fee-percentages-provider', TaskMode.READ_ONLY); +const WETH = new Task('00000000-tokens', TaskMode.READ_ONLY); +const BAL = new Task('00000000-tokens', TaskMode.READ_ONLY); + +const BaseVersion = { version: 4, deployment: '20230320-composable-stable-pool-v4' }; + +export default { + Vault, + ProtocolFeePercentagesProvider, + WETH, + BAL, + FactoryVersion: JSON.stringify({ name: 'ComposableStablePoolFactory', ...BaseVersion }), + PoolVersion: JSON.stringify({ name: 'ComposableStablePool', ...BaseVersion }), +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/arbitrum.json b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/arbitrum.json new file mode 100644 index 0000000..ca7483d --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/arbitrum.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x2498A2B0d6462d2260EAC50aE1C3e03F4829BA95", + "MockComposableStablePool": "0xFF7e6B102516e071dcDA763EE9D02c1515481db5" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/avalanche.json b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/avalanche.json new file mode 100644 index 0000000..689cdaf --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/avalanche.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x3B1eb8EB7b43882b385aB30533D9A2BeF9052a98", + "MockComposableStablePool": "0xEa4643102dFC03d5e382e7827Bf767f6587E9965" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/bsc.json b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/bsc.json new file mode 100644 index 0000000..c7f5d19 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/bsc.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x1802953277FD955f9a254B80Aa0582f193cF1d77", + "MockComposableStablePool": "0x7C53dBf28a23faB07E322fb35eC53A296f548a45" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/gnosis.json b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/gnosis.json new file mode 100644 index 0000000..8516951 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/gnosis.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0xD87F44Df0159DC78029AB9CA7D7e57E7249F5ACD", + "MockComposableStablePool": "0xf3678A0b54C61ccD88Ce321c2e07f87aC75F08B9" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/goerli.json b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/goerli.json new file mode 100644 index 0000000..2bf9f21 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/goerli.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x1802953277FD955f9a254B80Aa0582f193cF1d77", + "MockComposableStablePool": "0x5D343D374A769D1AB102e0418a516DadB08A86E4" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/mainnet.json new file mode 100644 index 0000000..7427434 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0xfADa0f4547AB2de89D1304A668C39B3E09Aa7c76", + "MockComposableStablePool": "0x5537f945D8c3FCFDc1b8DECEEBD220FAD26aFdA8" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/optimism.json b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/optimism.json new file mode 100644 index 0000000..952eb91 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/optimism.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x1802953277FD955f9a254B80Aa0582f193cF1d77", + "MockComposableStablePool": "0x11A4cF51Bb0Bb4D925CAdFDA61FcDA952d64889C" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/polygon.json b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/polygon.json new file mode 100644 index 0000000..3a72a3a --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/polygon.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x6Ab5549bBd766A43aFb687776ad8466F8b42f777", + "MockComposableStablePool": "0x0f25823cF786b78696b16536e2F2B9835289AB51" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/sepolia.json b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/sepolia.json new file mode 100644 index 0000000..1ba1177 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/sepolia.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0xA3fd20E29358c056B727657E83DFd139abBC9924", + "MockComposableStablePool": "0xA8D865FE1D68a405B29f884358468c9B52d4841d" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/zkevm.json b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/zkevm.json new file mode 100644 index 0000000..dbb0632 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/output/zkevm.json @@ -0,0 +1,4 @@ +{ + "ComposableStablePoolFactory": "0x8eA89804145c007e7D226001A96955ad53836087", + "MockComposableStablePool": "0x6f5F794A3CeF904b8517C4c311DE2FA837Ff24a0" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/readme.md b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/readme.md new file mode 100644 index 0000000..444d948 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/readme.md @@ -0,0 +1,21 @@ +# 2023-03-20 - Composable Stable Pool V4 + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> This deployment has been deprecated in favor of a new version that is resilient to abrupt changes in the value reported by the tokens' rate providers: [`20230711-composable-stable-pool-v5`](../../20230711-composable-stable-pool-v5). This factory is unsafe to use with yield-bearing tokens in general and should not be used. + +Deployment of `ComposableStablePoolFactory`, which allows creating Composable Stable Pools using `create2` instead of `create`. +Supersedes `20230206-composable-stable-pool-v3`. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Polygon mainnet addresses](./output/polygon.json) +- [Arbitrum mainnet addresses](./output/arbitrum.json) +- [Optimism mainnet addresses](./output/optimism.json) +- [BSC mainnet addresses](./output/bsc.json) +- [Gnosis mainnet addresses](./output/gnosis.json) +- [Avalanche mainnet addresses](./output/avalanche.json) +- [Polygon zkeVM mainnet addresses](./output/zkevm.json) +- [Goerli testnet addresses](./output/goerli.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`ComposableStablePoolFactory` artifact](./artifact/ComposableStablePoolFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/test/test.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/test/test.fork.ts new file mode 100644 index 0000000..f42992f --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230320-composable-stable-pool-v4/test/test.fork.ts @@ -0,0 +1,468 @@ +import hre from 'hardhat'; +import { expect } from 'chai'; +import { BigNumber, Contract } from 'ethers'; + +import * as expectEvent from '@helpers/expectEvent'; +import { describeForkTest } from '@src'; +import { Task, TaskMode } from '@src'; +import { getForkedNetwork } from '@src'; +import { getSigner, impersonate } from '@src'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; + +import { sharedBeforeEach } from '@helpers/sharedBeforeEach'; +import { MAX_UINT256, ONES_BYTES32, ZERO_ADDRESS, ZERO_BYTES32 } from '@helpers/constants'; +import { bn, fp } from '@helpers/numbers'; +import { BasePoolEncoder } from '@helpers/models/pools/utils/encoder'; +import { StablePoolEncoder } from '@helpers/models/pools/stable/encoder'; +import { SwapKind } from '@helpers/models/types/types'; +import { actionId } from '@helpers/models/misc/actions'; +import { expectEqualWithError } from '@helpers/relativeError'; +import { deploy } from '@src'; +import { randomBytes } from 'ethers/lib/utils'; + +describeForkTest('ComposableStablePool V4', 'mainnet', 16577000, function () { + let task: Task; + + let factory: Contract; + let owner: SignerWithAddress; + let whale: SignerWithAddress, auraWhale: SignerWithAddress; + let govMultisig: SignerWithAddress; + let vault: Contract; + let authorizer: Contract; + let busd: Contract, usdc: Contract, aura: Contract, graviAura: Contract; + + const GOV_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + const LARGE_TOKEN_HOLDER = '0x47ac0fb4f2d84898e4d9e7b4dab3c24507a6d503'; + const USDC_SCALING = bn(1e12); // USDC has 6 decimals, so its scaling factor is 1e12 + const AURA_HOLDER = '0x2af2b2e485e1854fd71590c7ffd104db0f66f8a6'; + + const USDC = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'; + const BUSD = '0x4Fabb145d64652a948d72533023f6E7A623C7C53'; + const AURA = '0xC0c293ce456fF0ED870ADd98a0828Dd4d2903DBF'; + const GRAVIAURA = '0xBA485b556399123261a5F9c95d413B4f93107407'; + + const tokens = [BUSD, USDC]; + const amplificationParameter = bn(400); + const swapFeePercentage = fp(0.01); + const initialBalanceBUSD = fp(1e6); + const initialBalanceUSDC = fp(1e6).div(USDC_SCALING); + const initialBalances = [initialBalanceBUSD, initialBalanceUSDC]; + + // Pool deployed from previous factory version (GRAVI AURA - AURA) + const GRAVI_AURA_POOL = '0x6A9603E481Fb8F2c09804ea9AdaB49A338855B90'; + + enum AttackType { + DISABLE_RECOVERY_MODE, + UPDATE_PROTOCOL_FEE_CACHE, + UPDATE_TOKEN_RATE_CACHE, + SET_TOKEN_RATE_CACHE_DURATION, + } + + before('run task', async () => { + task = new Task('20230320-composable-stable-pool-v4', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('ComposableStablePoolFactory'); + }); + + before('load signers', async () => { + owner = await getSigner(); + whale = await impersonate(LARGE_TOKEN_HOLDER, fp(100)); + auraWhale = await impersonate(AURA_HOLDER, fp(100)); + + govMultisig = await impersonate(GOV_MULTISIG, fp(100)); + }); + + before('load vault and tokens', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.instanceAt('Vault', await factory.getVault()); + authorizer = await new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)).deployedInstance( + 'Authorizer' + ); + + busd = await task.instanceAt('ERC20', BUSD); + usdc = await task.instanceAt('ERC20', USDC); + aura = await task.instanceAt('ERC20', AURA); + graviAura = await task.instanceAt('ERC20', GRAVIAURA); + + await busd.connect(whale).approve(vault.address, MAX_UINT256); + await usdc.connect(whale).approve(vault.address, MAX_UINT256); + }); + + async function createPool( + tokens: string[], + rateProvider = ZERO_ADDRESS, + initialize = true, + salt = '' + ): Promise { + const rateProviders: string[] = Array(tokens.length).fill(rateProvider); + const cacheDurations: BigNumber[] = Array(tokens.length).fill(bn(0)); + const exemptFlags: boolean[] = Array(tokens.length).fill(false); + + const tx = await factory.create( + 'CSP', + 'CSBPT', + tokens, + amplificationParameter, + rateProviders, + cacheDurations, + exemptFlags, + swapFeePercentage, + owner.address, + salt == '' ? randomBytes(32) : salt + ); + + const event = expectEvent.inReceipt(await tx.wait(), 'PoolCreated'); + const pool = await task.instanceAt('ComposableStablePool', event.args.pool); + expect(await factory.isPoolFromFactory(pool.address)).to.be.true; + + if (initialize) { + const bptIndex = await pool.getBptIndex(); + const poolId = await pool.getPoolId(); + + const registeredBalances = getRegisteredBalances(bptIndex, initialBalances); + const { tokens: registeredTokens } = await vault.getPoolTokens(poolId); + + const userData = StablePoolEncoder.joinInit(registeredBalances); + // Use this for maxAmountsIn + registeredBalances[bptIndex] = MAX_UINT256; + + await vault.connect(whale).joinPool(poolId, whale.address, owner.address, { + assets: registeredTokens, + maxAmountsIn: registeredBalances, + fromInternalBalance: false, + userData, + }); + } + + return pool; + } + + function getRegisteredBalances(bptIndex: number, balances: BigNumber[]): BigNumber[] { + return Array.from({ length: balances.length + 1 }).map((_, i) => + i == bptIndex ? bn(0) : i < bptIndex ? balances[i] : balances[i - 1] + ); + } + + describe('getters', () => { + it('check factory version', async () => { + const expectedFactoryVersion = { + name: 'ComposableStablePoolFactory', + version: 4, + deployment: '20230320-composable-stable-pool-v4', + }; + + expect(await factory.version()).to.equal(JSON.stringify(expectedFactoryVersion)); + }); + + it('check pool version', async () => { + const pool = await createPool(tokens); + + const expectedPoolVersion = { + name: 'ComposableStablePool', + version: 4, + deployment: '20230320-composable-stable-pool-v4', + }; + + expect(await pool.version()).to.equal(JSON.stringify(expectedPoolVersion)); + }); + }); + + describe('pool operations', () => { + const amount = fp(500); + + let pool: Contract; + let poolId: string; + let bptIndex: number; + + context('swap', () => { + before('deploy a composable stable pool', async () => { + expect(await factory.isPoolFromFactory(ZERO_ADDRESS)).to.be.false; + + pool = await createPool(tokens); + + poolId = pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + bptIndex = await pool.getBptIndex(); + }); + + it('performs a swap', async () => { + await busd.connect(whale).transfer(owner.address, amount); + await busd.connect(owner).approve(vault.address, amount); + + await vault + .connect(owner) + .swap( + { kind: SwapKind.GivenIn, poolId, assetIn: BUSD, assetOut: USDC, amount, userData: '0x' }, + { sender: owner.address, recipient: owner.address, fromInternalBalance: false, toInternalBalance: false }, + 0, + MAX_UINT256 + ); + + // Assert pool swap + const expectedUSDC = amount.div(USDC_SCALING); + expectEqualWithError(await busd.balanceOf(owner.address), 0, 0.0001); + expectEqualWithError(await usdc.balanceOf(owner.address), bn(expectedUSDC), 0.1); + }); + }); + + context('proportional join', () => { + before('deploy a composable stable pool', async () => { + expect(await factory.isPoolFromFactory(ZERO_ADDRESS)).to.be.false; + + pool = await createPool(tokens); + + poolId = pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + bptIndex = await pool.getBptIndex(); + }); + + it('joins proportionally', async () => { + const ownerBptBalance = await pool.balanceOf(owner.address); + const bptOut = ownerBptBalance.div(5); + + const { tokens: registeredTokens } = await vault.getPoolTokens(poolId); + // Given the bptOut, the max amounts in should be slightly more than 1/5. Decimals make it a bit complicated. + const adjustedBalances = [ + initialBalanceBUSD.div(fp(4.99)).mul(fp(1)), + initialBalanceUSDC.div(bn(4.99e6)).mul(1e6), + ]; + const maxAmountsIn = getRegisteredBalances(bptIndex, adjustedBalances); + + const tx = await vault.connect(whale).joinPool(poolId, whale.address, whale.address, { + assets: registeredTokens, + maxAmountsIn: maxAmountsIn, + fromInternalBalance: false, + userData: StablePoolEncoder.joinAllTokensInForExactBptOut(bptOut), + }); + const receipt = await (await tx).wait(); + const { deltas: amountsIn } = expectEvent.inReceipt(receipt, 'PoolBalanceChanged').args; + + // Amounts in should be ~ 1/5 the initial balances + expect(amountsIn).to.equalWithError(maxAmountsIn, 0.01); + + // Make sure received BPT is close to what we expect + const currentBptBalance = await pool.balanceOf(whale.address); + expect(currentBptBalance).to.be.equalWithError(bptOut, 0.001); + }); + }); + + context('proportional exit', () => { + before('deploy a composable stable pool', async () => { + expect(await factory.isPoolFromFactory(ZERO_ADDRESS)).to.be.false; + + pool = await createPool(tokens); + + poolId = pool.getPoolId(); + const [registeredAddress] = await vault.getPool(poolId); + expect(registeredAddress).to.equal(pool.address); + + bptIndex = await pool.getBptIndex(); + }); + + it('exits proportionally', async () => { + const previousBptBalance = await pool.balanceOf(owner.address); + const bptIn = previousBptBalance.div(4); + + const { tokens: registeredTokens, balances: registeredBalances } = await vault.getPoolTokens(poolId); + + const tx = await vault.connect(owner).exitPool(poolId, owner.address, owner.address, { + assets: registeredTokens, + minAmountsOut: Array(registeredTokens.length).fill(0), + fromInternalBalance: false, + userData: StablePoolEncoder.exitExactBptInForTokensOut(bptIn), + }); + const receipt = await (await tx).wait(); + const { deltas } = expectEvent.inReceipt(receipt, 'PoolBalanceChanged').args; + const amountsOut = deltas.map((x: BigNumber) => x.mul(-1)); + + const expectedAmountsOut = (registeredBalances as BigNumber[]).map((b) => b.div(4)); + expectedAmountsOut[bptIndex] = bn(0); + + // Amounts out should be 1/4 the initial balances + expect(amountsOut).to.equalWithError(expectedAmountsOut, 0.00001); + + // Make sure sent BPT is close to what we expect + const currentBptBalance = await pool.balanceOf(owner.address); + expect(currentBptBalance).to.be.equalWithError(bn(previousBptBalance).sub(bptIn), 0.001); + }); + }); + }); + + describe('read-only reentrancy protection', () => { + let pool: Contract; + let poolId: string; + let attacker: Contract; + // Actual amounts do not matter for the attack, so we pick an arbitrary value that the whale can transfer. + // The same amount will actually represent different quantities since the decimals may vary from token to token, + // but this is fine since we only need a valid join. + const attackerFunds = 1000; + + sharedBeforeEach('deploy and fund attacker', async () => { + attacker = await deploy('ReadOnlyReentrancyAttackerCSP', [vault.address]); + await busd.connect(whale).transfer(attacker.address, attackerFunds); + await usdc.connect(whale).transfer(attacker.address, attackerFunds); + await aura.connect(auraWhale).transfer(attacker.address, attackerFunds); + await graviAura.connect(auraWhale).transfer(attacker.address, attackerFunds); + }); + + context('when the target pool is not protected', () => { + sharedBeforeEach('get affected pool instance', async () => { + pool = await task.instanceAt('ComposableStablePool', GRAVI_AURA_POOL); + poolId = await pool.getPoolId(); + }); + + itPerformsAttack(false); + }); + + context('when the target pool is protected', () => { + sharedBeforeEach('deploy pool with rate providers', async () => { + const rateProvider = await deploy('MockRateProvider'); + pool = await createPool(tokens, rateProvider.address); + poolId = await pool.getPoolId(); + }); + + itPerformsAttack(true); + }); + + function itPerformsAttack(expectRevert: boolean) { + const action = expectRevert ? 'rejects' : 'does not reject'; + + context('update protocol fee cache', () => { + it(`${action} protocol fee cache attack`, async () => { + await performAttack(AttackType.UPDATE_PROTOCOL_FEE_CACHE, expectRevert); + }); + }); + + context('update token rate cache', () => { + it(`${action} token rate cache attack`, async () => { + await performAttack(AttackType.UPDATE_TOKEN_RATE_CACHE, expectRevert); + }); + }); + + context('update token rate cache duration', () => { + sharedBeforeEach('grant permissions to attacker', async () => { + await authorizer + .connect(govMultisig) + .grantRole(await actionId(pool, 'setTokenRateCacheDuration'), attacker.address); + }); + + it(`${action} token rate cache duration attack`, async () => { + await performAttack(AttackType.SET_TOKEN_RATE_CACHE_DURATION, expectRevert); + }); + }); + + context('disable recovery mode', () => { + sharedBeforeEach('grant permissions to attacker', async () => { + await authorizer + .connect(govMultisig) + .grantRole(await actionId(pool, 'disableRecoveryMode'), attacker.address); + }); + + it(`${action} disable recovery mode attack`, async () => { + await performAttack(AttackType.DISABLE_RECOVERY_MODE, expectRevert); + }); + }); + } + + async function performAttack(attackType: AttackType, expectRevert: boolean) { + const allTokens = (await vault.getPoolTokens(poolId)).tokens; + // Amounts in must not include BPT in user data. + const userData = StablePoolEncoder.joinExactTokensInForBPTOut(Array(allTokens.length - 1).fill(attackerFunds), 0); + + // We are doing exact tokens in, so max amounts are not relevant. + const joinRequest = { + assets: allTokens, + maxAmountsIn: Array(allTokens.length).fill(MAX_UINT256), + userData, + fromInternalBalance: false, + }; + + if (expectRevert) { + await expect(attacker.startAttack(poolId, joinRequest, attackType, { value: 10 })).to.be.revertedWith( + 'BAL#420' + ); + } else { + await attacker.startAttack(poolId, joinRequest, attackType, { value: 10 }); + } + } + }); + + describe('recovery mode', () => { + let pool: Contract; + let poolId: string; + + before('deploy and initialize a composable stable pool', async () => { + pool = await createPool(tokens); + poolId = await pool.getPoolId(); + }); + + before('enter recovery mode', async () => { + await authorizer.connect(govMultisig).grantRole(await actionId(pool, 'enableRecoveryMode'), govMultisig.address); + await pool.connect(govMultisig).enableRecoveryMode(); + expect(await pool.inRecoveryMode()).to.be.true; + }); + + it('can exit via recovery mode', async () => { + const bptBalance = await pool.balanceOf(owner.address); + expect(bptBalance).to.gt(0); + + const vaultUSDCBalanceBeforeExit = await usdc.balanceOf(vault.address); + const ownerUSDCBalanceBeforeExit = await usdc.balanceOf(owner.address); + + const { tokens: registeredTokens } = await vault.getPoolTokens(poolId); + + const userData = BasePoolEncoder.recoveryModeExit(bptBalance); + await vault.connect(owner).exitPool(poolId, owner.address, owner.address, { + assets: registeredTokens, + minAmountsOut: Array(registeredTokens.length).fill(0), + fromInternalBalance: false, + userData, + }); + + const remainingBalance = await pool.balanceOf(owner.address); + expect(remainingBalance).to.equal(0); + + const vaultUSDCBalanceAfterExit = await usdc.balanceOf(vault.address); + const ownerUSDCBalanceAfterExit = await usdc.balanceOf(owner.address); + + expect(vaultUSDCBalanceAfterExit).to.lt(vaultUSDCBalanceBeforeExit); + expect(ownerUSDCBalanceAfterExit).to.gt(ownerUSDCBalanceBeforeExit); + }); + }); + + describe('create2 functionality', () => { + it('can be deployed with a different salt', async () => { + const pool = await createPool(tokens, ZERO_ADDRESS, false, ZERO_BYTES32); + const pool2 = await createPool(tokens, ZERO_ADDRESS, false, ONES_BYTES32); + + expect(pool2.address).to.not.equal(pool.address); + }); + }); + + describe('factory disable', () => { + it('the factory can be disabled', async () => { + await authorizer.connect(govMultisig).grantRole(await actionId(factory, 'disable'), govMultisig.address); + await factory.connect(govMultisig).disable(); + + expect(await factory.isDisabled()).to.be.true; + await expect( + factory.create( + 'CSP', + 'CSBPT', + tokens, + amplificationParameter, + Array(tokens.length).fill(ZERO_ADDRESS), + Array(tokens.length).fill(0), + Array(tokens.length).fill(false), + swapFeePercentage, + owner.address, + ZERO_BYTES32 + ) + ).to.be.revertedWith('BAL#211'); + }); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20230527-l2-gauge-checkpointer/artifact/L2GaugeCheckpointer.json b/balpy/balancer-deployments/tasks/deprecated/20230527-l2-gauge-checkpointer/artifact/L2GaugeCheckpointer.json new file mode 100644 index 0000000..a860216 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230527-l2-gauge-checkpointer/artifact/L2GaugeCheckpointer.json @@ -0,0 +1,367 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "L2GaugeCheckpointer", + "sourceName": "contracts/gauges/L2GaugeCheckpointer.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IGaugeAdder", + "name": "gaugeAdder", + "type": "address" + }, + { + "internalType": "contract IAuthorizerAdaptorEntrypoint", + "name": "authorizerAdaptorEntrypoint", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IStakelessGauge", + "name": "gauge", + "type": "address" + }, + { + "indexed": true, + "internalType": "string", + "name": "indexedGaugeType", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "gaugeType", + "type": "string" + } + ], + "name": "GaugeAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IStakelessGauge", + "name": "gauge", + "type": "address" + }, + { + "indexed": true, + "internalType": "string", + "name": "indexedGaugeType", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "gaugeType", + "type": "string" + } + ], + "name": "GaugeRemoved", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "contract IStakelessGauge[]", + "name": "gauges", + "type": "address[]" + } + ], + "name": "addGauges", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "contract IStakelessGauge[]", + "name": "gauges", + "type": "address[]" + } + ], + "name": "addGaugesWithVerifiedType", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "minRelativeWeight", + "type": "uint256" + } + ], + "name": "checkpointGaugesAboveRelativeWeight", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "uint256", + "name": "minRelativeWeight", + "type": "uint256" + } + ], + "name": "checkpointGaugesOfTypeAboveRelativeWeight", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "checkpointSingleGauge", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeAdder", + "outputs": [ + { + "internalType": "contract IGaugeAdder", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getGaugeAtIndex", + "outputs": [ + { + "internalType": "contract IStakelessGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "getSingleBridgeCost", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "minRelativeWeight", + "type": "uint256" + } + ], + "name": "getTotalBridgeCost", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + } + ], + "name": "getTotalGauges", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "contract IStakelessGauge", + "name": "gauge", + "type": "address" + } + ], + "name": "hasGauge", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + } + ], + "name": "isValidGaugeType", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "contract IStakelessGauge[]", + "name": "gauges", + "type": "address[]" + } + ], + "name": "removeGauges", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x61014060405262000012610160620001f9565b60408051601f19818403018152919052805160209091012060c0523480156200003a57600080fd5b50604051620029eb380380620029eb8339810160408190526200005d9162000195565b806001600160a01b0316638d928af86040518163ffffffff1660e01b815260040160206040518083038186803b1580156200009757600080fd5b505afa158015620000ac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d29190620001d3565b6001600055306080526001600160601b0319606091821b811660a05283821b8116610100529082901b1660e05260408051632c6f4d6f60e11b815290516001600160a01b038416916358de9ade916004808301926020929190829003018186803b1580156200014057600080fd5b505afa15801562000155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200017b9190620001d3565b60601b6001600160601b0319166101205250620002269050565b60008060408385031215620001a8578182fd5b8251620001b5816200020d565b6020840151909250620001c8816200020d565b809150509250929050565b600060208284031215620001e5578081fd5b8151620001f2816200020d565b9392505050565b67417262697472756d60c01b815260080190565b6001600160a01b03811681146200022357600080fd5b50565b60805160a05160601c60c05160e05160601c6101005160601c6101205160601c612724620002c7600039806105255280611550528061178352508061032252806103b2528061079852806108b45280610ade5280610d525280610e425280610f6d5280611070528061117a5280611929525080610baa5280611b605280611cff5250806106b952806114db525080610c9f525080610c4f52506127246000f3fe6080604052600436106100f35760003560e01c8063851c1bb31161008a578063d14cfe3b11610059578063d14cfe3b1461027c578063d8dba2ce1461028f578063db5d1225146102af578063f7178b88146102c2576100f3565b8063851c1bb3146102125780638d928af814610232578063aaabadc514610247578063c91be0431461025c576100f3565b80634db34d2a116100c65780634db34d2a146101a857806373ebd060146101c85780637c1fef51146101ea5780637d0a6616146101ff576100f3565b806316e772bc146100f857806327cb2a3b1461012e57806327f791071461015b5780632adbe5ac14610188575b600080fd5b34801561010457600080fd5b50610118610113366004612116565b6102e2565b60405161012591906123e9565b60405180910390f35b34801561013a57600080fd5b5061014e610149366004612254565b6103ad565b604051610125919061236b565b34801561016757600080fd5b5061017b610176366004612297565b6104b1565b60405161012591906123f4565b34801561019457600080fd5b5061017b6101a3366004612149565b610670565b3480156101b457600080fd5b5061017b6101c3366004612116565b610793565b3480156101d457600080fd5b506101e86101e3366004612199565b610875565b005b3480156101f657600080fd5b5061014e610adc565b6101e861020d366004612149565b610b00565b34801561021e57600080fd5b5061017b61022d36600461206b565b610c4b565b34801561023e57600080fd5b5061014e610c9d565b34801561025357600080fd5b5061014e610cc1565b34801561026857600080fd5b5061011861027736600461222c565b610d4d565b6101e861028a366004612297565b610e29565b34801561029b57600080fd5b506101e86102aa366004612199565b610f2e565b6101e86102bd366004612254565b611029565b3480156102ce57600080fd5b506101e86102dd366004612199565b61113b565b6040517f16e772bc00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc90610357908590600401612429565b60206040518083038186803b15801561036f57600080fd5b505afa158015610383573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a7919061204b565b92915050565b6000827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc826040518263ffffffff1660e01b81526004016104099190612429565b60206040518083038186803b15801561042157600080fd5b505afa158015610435573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610459919061204b565b61047e5760405162461bcd60e51b81526004016104759061258a565b60405180910390fd5b6104a7836001866040516104929190612323565b90815260405190819003602001902090611228565b91505b5092915050565b6000806104bd42611244565b905060006104e560016040516104d29061233f565b9081526020016040518091039020611250565b9050600060016040516104f79061233f565b90815260405190819003602001902090506000805b838110156106665760006105208483611254565b9050877f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9483896040518363ffffffff1660e01b815260040161057e9291906123c3565b60206040518083038186803b15801561059657600080fd5b505afa1580156105aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ce91906122af565b10156105da575061065e565b8073ffffffffffffffffffffffffffffffffffffffff1663b02452256040518163ffffffff1660e01b815260040160206040518083038186803b15801561062057600080fd5b505afa158015610634573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065891906122af565b83019250505b60010161050c565b5095945050505050565b600061069b826001856040516106869190612323565b9081526040519081900360200190209061128e565b6106b75760405162461bcd60e51b8152600401610475906124f6565b7f0000000000000000000000000000000000000000000000000000000000000000836040516020016106e99190612323565b60405160208183030381529060405280519060200120141561078a578173ffffffffffffffffffffffffffffffffffffffff1663b02452256040518163ffffffff1660e01b815260040160206040518083038186803b15801561074b57600080fd5b505afa15801561075f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078391906122af565b90506103a7565b50600092915050565b6000817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc826040518263ffffffff1660e01b81526004016107ef9190612429565b60206040518083038186803b15801561080757600080fd5b505afa15801561081b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083f919061204b565b61085b5760405162461bcd60e51b81526004016104759061258a565b61086e6001846040516104d29190612323565b9392505050565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc906108e9908490600401612429565b60206040518083038186803b15801561090157600080fd5b505afa158015610915573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610939919061204b565b6109555760405162461bcd60e51b81526004016104759061258a565b60006001856040516109679190612323565b9081526020016040518091039020905060005b83811015610ad457600085858381811061099057fe5b90506020020160208101906109a591906120fa565b90508073ffffffffffffffffffffffffffffffffffffffff16639c868ac06040518163ffffffff1660e01b815260040160206040518083038186803b1580156109ed57600080fd5b505afa158015610a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a25919061204b565b610a415760405162461bcd60e51b8152600401610475906125c1565b610a4b83826112bc565b610a675760405162461bcd60e51b8152600401610475906124f6565b86604051610a759190612323565b60405180910390208173ffffffffffffffffffffffffffffffffffffffff167fb87757e0365ca4f80cc1f429f422c0ea7ec26bbd3e5778727e77c809462aad0289604051610ac39190612429565b60405180910390a35060010161097a565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b610b0861146a565b6000610b148383610670565b6040805160048082526024820183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc2c4c5c10000000000000000000000000000000000000000000000000000000017905291517f4036176a00000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692634036176a928592610bdf9288920161238c565b6000604051808303818588803b158015610bf857600080fd5b505af1158015610c0c573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052610c3591908101906120ab565b50610c3e611483565b50610c47611494565b5050565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610c809291906122f3565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610ccb610c9d565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015610d1057600080fd5b505afa158015610d24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4891906120de565b905090565b6000827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc826040518263ffffffff1660e01b8152600401610da99190612429565b60206040518083038186803b158015610dc157600080fd5b505afa158015610dd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df9919061204b565b610e155760405162461bcd60e51b81526004016104759061258a565b6104a7836001866040516106869190612323565b610e3161146a565b6000610e3c42611244565b905060607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663afcb1a866040518163ffffffff1660e01b815260040160006040518083038186803b158015610ea657600080fd5b505afa158015610eba573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ee29190810190611fb0565b905060005b8151811015610f1657610f0e828281518110610eff57fe5b6020026020010151858561149b565b600101610ee7565b50610f213347611626565b5050610f2b611494565b50565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc90610fa2908490600401612429565b60206040518083038186803b158015610fba57600080fd5b505afa158015610fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff2919061204b565b61100e5760405162461bcd60e51b81526004016104759061258a565b6110166116ad565b61102384848460016116f3565b50505050565b61103161146a565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152829073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc906110a5908490600401612429565b60206040518083038186803b1580156110bd57600080fd5b505afa1580156110d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f5919061204b565b6111115760405162461bcd60e51b81526004016104759061258a565b600061111c42611244565b905061112984848361149b565b611131611483565b5050610c47611494565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc906111af908490600401612429565b60206040518083038186803b1580156111c757600080fd5b505afa1580156111db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ff919061204b565b61121b5760405162461bcd60e51b81526004016104759061258a565b61102384848460006116f3565b815460009061123a9083106064611abf565b61086e8383611254565b62093a80908190040290565b5490565b600082600001828154811061126557fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169392505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001919091016020526040902054151590565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205480156114605783547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80830191018082146113c557600086600001828154811061132a57fe5b600091825260209091200154875473ffffffffffffffffffffffffffffffffffffffff9091169150819088908590811061136057fe5b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff94851617905592909116815260018881019092526040902090830190555b85548690806113d057fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff871682526001888101909152604082209190915593506103a792505050565b60009150506103a7565b61147c60026000541415610190611abf565b6002600055565b478015610f2b57610f2b3382611626565b6001600055565b60006001846040516114ad9190612323565b9081526020016040518091039020905060006114c882611250565b9050806114d6575050611621565b611f157f00000000000000000000000000000000000000000000000000000000000000008660405160200161150b9190612323565b604051602081830303815290604052805190602001201461152e57611acd611532565b611be95b905060005b8281101561161c57600061154b8583611254565b9050867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9483896040518363ffffffff1660e01b81526004016115a99291906123c3565b60206040518083038186803b1580156115c157600080fd5b505afa1580156115d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f991906122af565b10156116055750611614565b611612818463ffffffff16565b505b600101611537565b505050505b505050565b611635814710156101a3611abf565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161165b90612368565b60006040518083038185875af1925050503d8060008114611698576040519150601f19603f3d011682016040523d82523d6000602084013e61169d565b606091505b50509050611621816101a4611abf565b60006116dc6000357fffffffff0000000000000000000000000000000000000000000000000000000016610c4b565b9050610f2b6116eb8233611d8a565b610191611abf565b60006001856040516117059190612323565b9081526020016040518091039020905060005b83811015610ad457600085858381811061172e57fe5b905060200201602081019061174391906120fa565b6040517f61df1bf900000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906361df1bf9906117b890849060040161236b565b60206040518083038186803b1580156117d057600080fd5b505afa1580156117e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611808919061204b565b6118245760405162461bcd60e51b81526004016104759061243c565b8073ffffffffffffffffffffffffffffffffffffffff16639c868ac06040518163ffffffff1660e01b815260040160206040518083038186803b15801561186a57600080fd5b505afa15801561187e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a2919061204b565b156118bf5760405162461bcd60e51b815260040161047590612553565b6118c98382611e20565b6118e55760405162461bcd60e51b8152600401610475906125f8565b8380611a3657506040517f572cb6a500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063572cb6a59061195e908a90600401612429565b60206040518083038186803b15801561197657600080fd5b505afa15801561198a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ae91906120de565b73ffffffffffffffffffffffffffffffffffffffff1663ce3cc8bd826040518263ffffffff1660e01b81526004016119e6919061236b565b60206040518083038186803b1580156119fe57600080fd5b505afa158015611a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a36919061204b565b611a525760405162461bcd60e51b815260040161047590612499565b86604051611a609190612323565b60405180910390208173ffffffffffffffffffffffffffffffffffffffff167fbd3a33b3738a69bcfb84219d93fb0b1b2d91efbf2e5bef206c9af4122290fb5489604051611aae9190612429565b60405180910390a350600101611718565b81610c4757610c4781611ea0565b6040805160048082526024820183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc2c4c5c10000000000000000000000000000000000000000000000000000000017905291517f4036176a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692634036176a92611b939286920161238c565b600060405180830381600087803b158015611bad57600080fd5b505af1158015611bc1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c4791908101906120ab565b60008173ffffffffffffffffffffffffffffffffffffffff1663b02452256040518163ffffffff1660e01b815260040160206040518083038186803b158015611c3157600080fd5b505afa158015611c45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6991906122af565b6040805160048082526024820183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc2c4c5c10000000000000000000000000000000000000000000000000000000017905291517f4036176a00000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692634036176a928592611d349288920161238c565b6000604051808303818588803b158015611d4d57600080fd5b505af1158015611d61573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405261162191908101906120ab565b6000611d94610cc1565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401611dd0939291906123fd565b60206040518083038186803b158015611de857600080fd5b505afa158015611dfc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086e919061204b565b6000611e2c838361128e565b61078a57508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155855490825282860190935260409020919091556103a7565b62461bcd60e51b600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b604452610f2b917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5bfe5b600082601f830112611f27578081fd5b8151611f3a611f358261267c565b612655565b9150808252836020828501011115611f5157600080fd5b6104aa8160208401602086016126a0565b600082601f830112611f72578081fd5b8135611f80611f358261267c565b9150808252836020828501011115611f9757600080fd5b8060208401602084013760009082016020015292915050565b60006020808385031215611fc2578182fd5b825167ffffffffffffffff80821115611fd9578384fd5b818501915085601f830112611fec578384fd5b815181811115611ffa578485fd5b6120078485830201612655565b8181528481019250838501865b8381101561203d5761202b8a888451890101611f17565b85529386019390860190600101612014565b509098975050505050505050565b60006020828403121561205c578081fd5b8151801515811461086e578182fd5b60006020828403121561207c578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461086e578182fd5b6000602082840312156120bc578081fd5b815167ffffffffffffffff8111156120d2578182fd5b6104a784828501611f17565b6000602082840312156120ef578081fd5b815161086e816126cc565b60006020828403121561210b578081fd5b813561086e816126cc565b600060208284031215612127578081fd5b813567ffffffffffffffff81111561213d578182fd5b6104a784828501611f62565b6000806040838503121561215b578081fd5b823567ffffffffffffffff811115612171578182fd5b61217d85828601611f62565b925050602083013561218e816126cc565b809150509250929050565b6000806000604084860312156121ad578081fd5b833567ffffffffffffffff808211156121c4578283fd5b6121d087838801611f62565b945060208601359150808211156121e5578283fd5b818601915086601f8301126121f8578283fd5b813581811115612206578384fd5b8760208083028501011115612219578384fd5b6020830194508093505050509250925092565b6000806040838503121561223e578182fd5b823567ffffffffffffffff811115612171578283fd5b60008060408385031215612266578182fd5b823567ffffffffffffffff81111561227c578283fd5b61228885828601611f62565b95602094909401359450505050565b6000602082840312156122a8578081fd5b5035919050565b6000602082840312156122c0578081fd5b5051919050565b600081518084526122df8160208601602086016126a0565b601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b600082516123358184602087016126a0565b9190910192915050565b7f417262697472756d000000000000000000000000000000000000000000000000815260080190565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff84168252604060208301526123bb60408301846122c7565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825261086e60208301846122c7565b6020808252602a908201527f476175676520776173206e6f7420616464656420746f2074686520476175676560408201527f436f6e74726f6c6c657200000000000000000000000000000000000000000000606082015260800190565b6020808252602e908201527f476175676520646f6573206e6f7420636f72726573706f6e6420746f2074686560408201527f2073656c65637465642074797065000000000000000000000000000000000000606082015260800190565b60208082526027908201527f476175676520776173206e6f7420616464656420746f2074686520636865636b60408201527f706f696e74657200000000000000000000000000000000000000000000000000606082015260800190565b60208082526010908201527f476175676520776173206b696c6c656400000000000000000000000000000000604082015260600190565b60208082526012908201527f496e76616c696420676175676520747970650000000000000000000000000000604082015260600190565b60208082526014908201527f476175676520776173206e6f74206b696c6c6564000000000000000000000000604082015260600190565b60208082526027908201527f476175676520616c726561647920616464656420746f2074686520636865636b60408201527f706f696e74657200000000000000000000000000000000000000000000000000606082015260800190565b60405181810167ffffffffffffffff8111828210171561267457600080fd5b604052919050565b600067ffffffffffffffff821115612692578081fd5b50601f01601f191660200190565b60005b838110156126bb5781810151838201526020016126a3565b838111156110235750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114610f2b57600080fdfea264697066735822122064d8a54ab9b9d7899cbf9eeb8ad3687905bdf49874a310d5471e0de218ba796664736f6c63430007010033", + "deployedBytecode": "0x6080604052600436106100f35760003560e01c8063851c1bb31161008a578063d14cfe3b11610059578063d14cfe3b1461027c578063d8dba2ce1461028f578063db5d1225146102af578063f7178b88146102c2576100f3565b8063851c1bb3146102125780638d928af814610232578063aaabadc514610247578063c91be0431461025c576100f3565b80634db34d2a116100c65780634db34d2a146101a857806373ebd060146101c85780637c1fef51146101ea5780637d0a6616146101ff576100f3565b806316e772bc146100f857806327cb2a3b1461012e57806327f791071461015b5780632adbe5ac14610188575b600080fd5b34801561010457600080fd5b50610118610113366004612116565b6102e2565b60405161012591906123e9565b60405180910390f35b34801561013a57600080fd5b5061014e610149366004612254565b6103ad565b604051610125919061236b565b34801561016757600080fd5b5061017b610176366004612297565b6104b1565b60405161012591906123f4565b34801561019457600080fd5b5061017b6101a3366004612149565b610670565b3480156101b457600080fd5b5061017b6101c3366004612116565b610793565b3480156101d457600080fd5b506101e86101e3366004612199565b610875565b005b3480156101f657600080fd5b5061014e610adc565b6101e861020d366004612149565b610b00565b34801561021e57600080fd5b5061017b61022d36600461206b565b610c4b565b34801561023e57600080fd5b5061014e610c9d565b34801561025357600080fd5b5061014e610cc1565b34801561026857600080fd5b5061011861027736600461222c565b610d4d565b6101e861028a366004612297565b610e29565b34801561029b57600080fd5b506101e86102aa366004612199565b610f2e565b6101e86102bd366004612254565b611029565b3480156102ce57600080fd5b506101e86102dd366004612199565b61113b565b6040517f16e772bc00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc90610357908590600401612429565b60206040518083038186803b15801561036f57600080fd5b505afa158015610383573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a7919061204b565b92915050565b6000827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc826040518263ffffffff1660e01b81526004016104099190612429565b60206040518083038186803b15801561042157600080fd5b505afa158015610435573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610459919061204b565b61047e5760405162461bcd60e51b81526004016104759061258a565b60405180910390fd5b6104a7836001866040516104929190612323565b90815260405190819003602001902090611228565b91505b5092915050565b6000806104bd42611244565b905060006104e560016040516104d29061233f565b9081526020016040518091039020611250565b9050600060016040516104f79061233f565b90815260405190819003602001902090506000805b838110156106665760006105208483611254565b9050877f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9483896040518363ffffffff1660e01b815260040161057e9291906123c3565b60206040518083038186803b15801561059657600080fd5b505afa1580156105aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ce91906122af565b10156105da575061065e565b8073ffffffffffffffffffffffffffffffffffffffff1663b02452256040518163ffffffff1660e01b815260040160206040518083038186803b15801561062057600080fd5b505afa158015610634573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065891906122af565b83019250505b60010161050c565b5095945050505050565b600061069b826001856040516106869190612323565b9081526040519081900360200190209061128e565b6106b75760405162461bcd60e51b8152600401610475906124f6565b7f0000000000000000000000000000000000000000000000000000000000000000836040516020016106e99190612323565b60405160208183030381529060405280519060200120141561078a578173ffffffffffffffffffffffffffffffffffffffff1663b02452256040518163ffffffff1660e01b815260040160206040518083038186803b15801561074b57600080fd5b505afa15801561075f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078391906122af565b90506103a7565b50600092915050565b6000817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc826040518263ffffffff1660e01b81526004016107ef9190612429565b60206040518083038186803b15801561080757600080fd5b505afa15801561081b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083f919061204b565b61085b5760405162461bcd60e51b81526004016104759061258a565b61086e6001846040516104d29190612323565b9392505050565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc906108e9908490600401612429565b60206040518083038186803b15801561090157600080fd5b505afa158015610915573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610939919061204b565b6109555760405162461bcd60e51b81526004016104759061258a565b60006001856040516109679190612323565b9081526020016040518091039020905060005b83811015610ad457600085858381811061099057fe5b90506020020160208101906109a591906120fa565b90508073ffffffffffffffffffffffffffffffffffffffff16639c868ac06040518163ffffffff1660e01b815260040160206040518083038186803b1580156109ed57600080fd5b505afa158015610a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a25919061204b565b610a415760405162461bcd60e51b8152600401610475906125c1565b610a4b83826112bc565b610a675760405162461bcd60e51b8152600401610475906124f6565b86604051610a759190612323565b60405180910390208173ffffffffffffffffffffffffffffffffffffffff167fb87757e0365ca4f80cc1f429f422c0ea7ec26bbd3e5778727e77c809462aad0289604051610ac39190612429565b60405180910390a35060010161097a565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b610b0861146a565b6000610b148383610670565b6040805160048082526024820183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc2c4c5c10000000000000000000000000000000000000000000000000000000017905291517f4036176a00000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692634036176a928592610bdf9288920161238c565b6000604051808303818588803b158015610bf857600080fd5b505af1158015610c0c573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052610c3591908101906120ab565b50610c3e611483565b50610c47611494565b5050565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610c809291906122f3565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610ccb610c9d565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015610d1057600080fd5b505afa158015610d24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4891906120de565b905090565b6000827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc826040518263ffffffff1660e01b8152600401610da99190612429565b60206040518083038186803b158015610dc157600080fd5b505afa158015610dd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df9919061204b565b610e155760405162461bcd60e51b81526004016104759061258a565b6104a7836001866040516106869190612323565b610e3161146a565b6000610e3c42611244565b905060607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663afcb1a866040518163ffffffff1660e01b815260040160006040518083038186803b158015610ea657600080fd5b505afa158015610eba573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ee29190810190611fb0565b905060005b8151811015610f1657610f0e828281518110610eff57fe5b6020026020010151858561149b565b600101610ee7565b50610f213347611626565b5050610f2b611494565b50565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc90610fa2908490600401612429565b60206040518083038186803b158015610fba57600080fd5b505afa158015610fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff2919061204b565b61100e5760405162461bcd60e51b81526004016104759061258a565b6110166116ad565b61102384848460016116f3565b50505050565b61103161146a565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152829073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc906110a5908490600401612429565b60206040518083038186803b1580156110bd57600080fd5b505afa1580156110d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f5919061204b565b6111115760405162461bcd60e51b81526004016104759061258a565b600061111c42611244565b905061112984848361149b565b611131611483565b5050610c47611494565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc906111af908490600401612429565b60206040518083038186803b1580156111c757600080fd5b505afa1580156111db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ff919061204b565b61121b5760405162461bcd60e51b81526004016104759061258a565b61102384848460006116f3565b815460009061123a9083106064611abf565b61086e8383611254565b62093a80908190040290565b5490565b600082600001828154811061126557fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169392505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001919091016020526040902054151590565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205480156114605783547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80830191018082146113c557600086600001828154811061132a57fe5b600091825260209091200154875473ffffffffffffffffffffffffffffffffffffffff9091169150819088908590811061136057fe5b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff94851617905592909116815260018881019092526040902090830190555b85548690806113d057fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff871682526001888101909152604082209190915593506103a792505050565b60009150506103a7565b61147c60026000541415610190611abf565b6002600055565b478015610f2b57610f2b3382611626565b6001600055565b60006001846040516114ad9190612323565b9081526020016040518091039020905060006114c882611250565b9050806114d6575050611621565b611f157f00000000000000000000000000000000000000000000000000000000000000008660405160200161150b9190612323565b604051602081830303815290604052805190602001201461152e57611acd611532565b611be95b905060005b8281101561161c57600061154b8583611254565b9050867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9483896040518363ffffffff1660e01b81526004016115a99291906123c3565b60206040518083038186803b1580156115c157600080fd5b505afa1580156115d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f991906122af565b10156116055750611614565b611612818463ffffffff16565b505b600101611537565b505050505b505050565b611635814710156101a3611abf565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161165b90612368565b60006040518083038185875af1925050503d8060008114611698576040519150601f19603f3d011682016040523d82523d6000602084013e61169d565b606091505b50509050611621816101a4611abf565b60006116dc6000357fffffffff0000000000000000000000000000000000000000000000000000000016610c4b565b9050610f2b6116eb8233611d8a565b610191611abf565b60006001856040516117059190612323565b9081526020016040518091039020905060005b83811015610ad457600085858381811061172e57fe5b905060200201602081019061174391906120fa565b6040517f61df1bf900000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906361df1bf9906117b890849060040161236b565b60206040518083038186803b1580156117d057600080fd5b505afa1580156117e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611808919061204b565b6118245760405162461bcd60e51b81526004016104759061243c565b8073ffffffffffffffffffffffffffffffffffffffff16639c868ac06040518163ffffffff1660e01b815260040160206040518083038186803b15801561186a57600080fd5b505afa15801561187e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a2919061204b565b156118bf5760405162461bcd60e51b815260040161047590612553565b6118c98382611e20565b6118e55760405162461bcd60e51b8152600401610475906125f8565b8380611a3657506040517f572cb6a500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063572cb6a59061195e908a90600401612429565b60206040518083038186803b15801561197657600080fd5b505afa15801561198a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ae91906120de565b73ffffffffffffffffffffffffffffffffffffffff1663ce3cc8bd826040518263ffffffff1660e01b81526004016119e6919061236b565b60206040518083038186803b1580156119fe57600080fd5b505afa158015611a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a36919061204b565b611a525760405162461bcd60e51b815260040161047590612499565b86604051611a609190612323565b60405180910390208173ffffffffffffffffffffffffffffffffffffffff167fbd3a33b3738a69bcfb84219d93fb0b1b2d91efbf2e5bef206c9af4122290fb5489604051611aae9190612429565b60405180910390a350600101611718565b81610c4757610c4781611ea0565b6040805160048082526024820183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc2c4c5c10000000000000000000000000000000000000000000000000000000017905291517f4036176a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692634036176a92611b939286920161238c565b600060405180830381600087803b158015611bad57600080fd5b505af1158015611bc1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c4791908101906120ab565b60008173ffffffffffffffffffffffffffffffffffffffff1663b02452256040518163ffffffff1660e01b815260040160206040518083038186803b158015611c3157600080fd5b505afa158015611c45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6991906122af565b6040805160048082526024820183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc2c4c5c10000000000000000000000000000000000000000000000000000000017905291517f4036176a00000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692634036176a928592611d349288920161238c565b6000604051808303818588803b158015611d4d57600080fd5b505af1158015611d61573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405261162191908101906120ab565b6000611d94610cc1565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b8152600401611dd0939291906123fd565b60206040518083038186803b158015611de857600080fd5b505afa158015611dfc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086e919061204b565b6000611e2c838361128e565b61078a57508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155855490825282860190935260409020919091556103a7565b62461bcd60e51b600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b604452610f2b917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5bfe5b600082601f830112611f27578081fd5b8151611f3a611f358261267c565b612655565b9150808252836020828501011115611f5157600080fd5b6104aa8160208401602086016126a0565b600082601f830112611f72578081fd5b8135611f80611f358261267c565b9150808252836020828501011115611f9757600080fd5b8060208401602084013760009082016020015292915050565b60006020808385031215611fc2578182fd5b825167ffffffffffffffff80821115611fd9578384fd5b818501915085601f830112611fec578384fd5b815181811115611ffa578485fd5b6120078485830201612655565b8181528481019250838501865b8381101561203d5761202b8a888451890101611f17565b85529386019390860190600101612014565b509098975050505050505050565b60006020828403121561205c578081fd5b8151801515811461086e578182fd5b60006020828403121561207c578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461086e578182fd5b6000602082840312156120bc578081fd5b815167ffffffffffffffff8111156120d2578182fd5b6104a784828501611f17565b6000602082840312156120ef578081fd5b815161086e816126cc565b60006020828403121561210b578081fd5b813561086e816126cc565b600060208284031215612127578081fd5b813567ffffffffffffffff81111561213d578182fd5b6104a784828501611f62565b6000806040838503121561215b578081fd5b823567ffffffffffffffff811115612171578182fd5b61217d85828601611f62565b925050602083013561218e816126cc565b809150509250929050565b6000806000604084860312156121ad578081fd5b833567ffffffffffffffff808211156121c4578283fd5b6121d087838801611f62565b945060208601359150808211156121e5578283fd5b818601915086601f8301126121f8578283fd5b813581811115612206578384fd5b8760208083028501011115612219578384fd5b6020830194508093505050509250925092565b6000806040838503121561223e578182fd5b823567ffffffffffffffff811115612171578283fd5b60008060408385031215612266578182fd5b823567ffffffffffffffff81111561227c578283fd5b61228885828601611f62565b95602094909401359450505050565b6000602082840312156122a8578081fd5b5035919050565b6000602082840312156122c0578081fd5b5051919050565b600081518084526122df8160208601602086016126a0565b601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b600082516123358184602087016126a0565b9190910192915050565b7f417262697472756d000000000000000000000000000000000000000000000000815260080190565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff84168252604060208301526123bb60408301846122c7565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60006020825261086e60208301846122c7565b6020808252602a908201527f476175676520776173206e6f7420616464656420746f2074686520476175676560408201527f436f6e74726f6c6c657200000000000000000000000000000000000000000000606082015260800190565b6020808252602e908201527f476175676520646f6573206e6f7420636f72726573706f6e6420746f2074686560408201527f2073656c65637465642074797065000000000000000000000000000000000000606082015260800190565b60208082526027908201527f476175676520776173206e6f7420616464656420746f2074686520636865636b60408201527f706f696e74657200000000000000000000000000000000000000000000000000606082015260800190565b60208082526010908201527f476175676520776173206b696c6c656400000000000000000000000000000000604082015260600190565b60208082526012908201527f496e76616c696420676175676520747970650000000000000000000000000000604082015260600190565b60208082526014908201527f476175676520776173206e6f74206b696c6c6564000000000000000000000000604082015260600190565b60208082526027908201527f476175676520616c726561647920616464656420746f2074686520636865636b60408201527f706f696e74657200000000000000000000000000000000000000000000000000606082015260800190565b60405181810167ffffffffffffffff8111828210171561267457600080fd5b604052919050565b600067ffffffffffffffff821115612692578081fd5b50601f01601f191660200190565b60005b838110156126bb5781810151838201526020016126a3565b838111156110235750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114610f2b57600080fdfea264697066735822122064d8a54ab9b9d7899cbf9eeb8ad3687905bdf49874a310d5471e0de218ba796664736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230527-l2-gauge-checkpointer/index.ts b/balpy/balancer-deployments/tasks/deprecated/20230527-l2-gauge-checkpointer/index.ts new file mode 100644 index 0000000..6898163 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230527-l2-gauge-checkpointer/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { L2GaugeCheckpointerDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as L2GaugeCheckpointerDeployment; + + const args = [input.GaugeAdder, input.AuthorizerAdaptorEntrypoint]; + await task.deployAndVerify('L2GaugeCheckpointer', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230527-l2-gauge-checkpointer/input.ts b/balpy/balancer-deployments/tasks/deprecated/20230527-l2-gauge-checkpointer/input.ts new file mode 100644 index 0000000..d8470d3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230527-l2-gauge-checkpointer/input.ts @@ -0,0 +1,14 @@ +import { Task, TaskMode } from '@src'; + +export type L2GaugeCheckpointerDeployment = { + GaugeAdder: string; + AuthorizerAdaptorEntrypoint: string; +}; + +const GaugeAdder = new Task('20230519-gauge-adder-v4', TaskMode.READ_ONLY); +const AuthorizerAdaptorEntrypoint = new Task('20221124-authorizer-adaptor-entrypoint', TaskMode.READ_ONLY); + +export default { + GaugeAdder, + AuthorizerAdaptorEntrypoint, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230527-l2-gauge-checkpointer/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20230527-l2-gauge-checkpointer/output/mainnet.json new file mode 100644 index 0000000..85c6f98 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230527-l2-gauge-checkpointer/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "L2GaugeCheckpointer": "0x343688C5cB92115a52cA485af7f62B4B7A2e9CcC" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230527-l2-gauge-checkpointer/readme.md b/balpy/balancer-deployments/tasks/deprecated/20230527-l2-gauge-checkpointer/readme.md new file mode 100644 index 0000000..5f15b60 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230527-l2-gauge-checkpointer/readme.md @@ -0,0 +1,12 @@ +# 2023-05-27 - L2 Gauge Checkpointer + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This version has been replaced for an updated version: [StakelessGaugeCheckpointer](../20230731-stakeless-gauge-checkpointer/). The new version corrects the period used to perform the checkpoints to the start of the previous week, and adds the capability to checkpoint multiple gauges given their addresses in the same transaction. + +Deployment of the `L2GaugeCheckpointer` contract. It automates the process of performing checkpoints to stakeless root gauges. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [`L2GaugeCheckpointer` artifact](./artifact/L2GaugeCheckpointer.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20230527-l2-gauge-checkpointer/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20230527-l2-gauge-checkpointer/test/task.fork.ts new file mode 100644 index 0000000..439d2bc --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230527-l2-gauge-checkpointer/test/task.fork.ts @@ -0,0 +1,461 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { Contract, ContractReceipt } from 'ethers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; + +import { BigNumber, fp } from '@helpers/numbers'; +import * as expectEvent from '@helpers/expectEvent'; + +import { describeForkTest } from '@src'; +import { Task, TaskMode } from '@src'; +import { getForkedNetwork } from '@src'; +import { impersonate } from '@src'; +import { actionId } from '@helpers/models/misc/actions'; + +// This block number is before the manual weekly checkpoint. This ensures gauges will actually be checkpointed. +// This test verifies the checkpointer against the manual transactions for the given period. +describeForkTest('L2GaugeCheckpointer', 'mainnet', 17332499, function () { + /* eslint-disable @typescript-eslint/no-non-null-assertion */ + + enum GaugeType { + Ethereum, + Polygon, + Arbitrum, + Optimism, + Gnosis, + Avalanche, + PolygonZkEvm, + ZkSync, + } + + let adderCoordinator: Contract; + let L2GaugeCheckpointer: Contract; + let authorizer: Contract, adaptorEntrypoint: Contract; + + let task: Task; + let daoMultisig: SignerWithAddress, admin: SignerWithAddress; + + const DAO_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + const CHECKPOINT_MULTISIG = '0x02f35dA6A02017154367Bc4d47bb6c7D06C7533B'; + + // Event we are looking for is: + // Checkpoint(uint256,uint256) + // Topic: 0x21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced + // See tx: 0x617b441cac07386a37513dfdf351821793d795b3beb1aab1d71dad1bc69a7c86 + + // Search for the topic in the given TX. + // The total expected checkpoints is the amount of checkpoints in the TX + 1 (see Arbitrum gauges below). + const TOTAL_EXPECTED_CHECKPOINTS = 79; + + // Gauges that are NOT killed for the given test block number. + const polygonRootGauges: [address: string, expectedCheckpoints: number][] = [ + ['0x082aacfaf4db8ac0642cbed50df732d3c309e679', 6], + ['0xdd3b4161d2a4c609884e20ed71b4e85be44572e6', 6], + ['0x16289f675ca54312a8fcf99341e7439982888077', 6], + ['0x455f20c54b5712a84454468c7831f7c431aeeb1c', 6], + ['0x39ceebb561a65216a4b776ea752d3137e9d6c0f0', 6], + ['0x1604b7e80975555e0aceaca9c81807fbb4d65cf1', 6], + ['0xc534c30749b6c198d35a7836e26076e7745d8936', 6], + ['0x539d6edbd16f2f069a06716416c3a6e98cc29dd0', 5], + ['0x31f99c542cbe456fcbbe99d4bf849af4d7fb5405', 6], + ['0x47d7269829ba9571d98eb6ddc34e9c8f1a4c327f', 6], + ['0x416d15c36c6daad2b9410b79ae557e6f07dcb642', 1], + ['0xd103dd49b8051a09b399a52e9a8ab629392de2fb', 1], + ]; + + // There were no Arbitrum checkpoints in this TX, but this gauge was not killed the previous week unlike the rest + // of the Arbitrum gauges, so it can be checkpointed. + // It is important to have at least one Arbitrum gauge for the test, because it is the only type that has + // an associated ETH fee. + const arbitrumRootGauges: [address: string, expectedCheckpoints: number][] = [ + ['0x8204b749b808818deb7957dbd030ceea44d1fe18', 1], + ]; + + const optimismRootGauges: [address: string, expectedCheckpoints: number][] = [ + ['0xdacd99029b4b94cd04fe364aac370829621c1c64', 6], + ]; + + const gnosisRootGauges: [address: string, expectedCheckpoints: number][] = [ + ['0xe41736b4e78be41bd03ebaf8f86ea493c6e9ea96', 1], + ['0x21b2ef3dc22b7bd4634205081c667e39742075e2', 1], + ['0x3b6a85b5e1e6205ebf4d4eabf147d10e8e4bf0a5', 1], + ['0xcb2c2af6c3e88b4a89aa2aae1d7c8120eee9ad0e', 6], + ]; + + const singleRecipientGauges: [address: string, expectedCheckpoints: number][] = [ + ['0x56124eb16441A1eF12A4CCAeAbDD3421281b795A', 1], + ['0xE867AD0a48e8f815DC0cda2CDb275e0F163A480b', 1], + ]; + + const checkpointInterface = new ethers.utils.Interface([ + 'function checkpoint()', + 'event Checkpoint(uint256 indexed periodTime, uint256 periodEmissions)', + ]); + + type GaugeData = { + address: string; + weight: BigNumber; + expectedCheckpoints: number; + }; + + const gauges = new Map(); + + before('run task', async () => { + task = new Task('20230527-l2-gauge-checkpointer', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + L2GaugeCheckpointer = await task.deployedInstance('L2GaugeCheckpointer'); + }); + + before('setup governance', async () => { + daoMultisig = await impersonate(DAO_MULTISIG, fp(100)); + admin = await impersonate(CHECKPOINT_MULTISIG, fp(100)); + }); + + before('setup contracts', async () => { + const authorizerTask = new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizer = await authorizerTask.deployedInstance('Authorizer'); + + const adaptorEntrypointTask = new Task( + '20221124-authorizer-adaptor-entrypoint', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ); + adaptorEntrypoint = await adaptorEntrypointTask.deployedInstance('AuthorizerAdaptorEntrypoint'); + }); + + // At this block, the adder coordinator has been deployed but not executed. + // Then, we can fetch the deployed contract and execute it here to setup the correct types in the adder, which are + // necessary for the checkpointer to work correctly. + before('run adder migrator coordinator', async () => { + const adderCoordinatorTask = new Task( + '20230519-gauge-adder-migration-v3-to-v4', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ); + adderCoordinator = await adderCoordinatorTask.deployedInstance('GaugeAdderMigrationCoordinator'); + + await authorizer.connect(daoMultisig).grantRole(await authorizer.DEFAULT_ADMIN_ROLE(), adderCoordinator.address); + await adderCoordinator.performNextStage(); + }); + + before('get gauge relative weights and associate them with their respective address', async () => { + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + const gaugeController = await gaugeControllerTask.deployedInstance('GaugeController'); + + const getGaugesData = async (gaugeInputs: [string, number][]) => { + return Promise.all( + gaugeInputs.map(async (gaugeInput) => { + return { + address: gaugeInput[0], + weight: await gaugeController['gauge_relative_weight(address)'](gaugeInput[0]), + expectedCheckpoints: gaugeInput[1], + }; + }) + ); + }; + const singleRecipientGaugesData: GaugeData[] = await getGaugesData(singleRecipientGauges); + const polygonRootGaugesData: GaugeData[] = await getGaugesData(polygonRootGauges); + const arbitrumRootGaugesData: GaugeData[] = await getGaugesData(arbitrumRootGauges); + const optimismRootGaugesData: GaugeData[] = await getGaugesData(optimismRootGauges); + const gnosisRootGaugesData: GaugeData[] = await getGaugesData(gnosisRootGauges); + + gauges.set(GaugeType.Ethereum, singleRecipientGaugesData); + gauges.set(GaugeType.Polygon, polygonRootGaugesData); + gauges.set(GaugeType.Arbitrum, arbitrumRootGaugesData); + gauges.set(GaugeType.Optimism, optimismRootGaugesData); + gauges.set(GaugeType.Gnosis, gnosisRootGaugesData); + }); + + before('check total expected checkpoints', () => { + let sum = 0; + for (const [, gaugeData] of gauges.entries()) { + if (gaugeData.length > 0) { + sum += gaugeData.map((gaugeData) => gaugeData.expectedCheckpoints).reduce((a, b) => a + b); + } + } + expect(sum).to.be.eq(TOTAL_EXPECTED_CHECKPOINTS); + }); + + before('add gauges to checkpointer', async () => { + // Some gauges were created from previous factories, so they need to be added by governance. + // For simplicity, we just add all of them with the same method. + // The non-permissioned 'addGauges' function is already tested in the unit test. + await authorizer + .connect(daoMultisig) + .grantRole(await actionId(L2GaugeCheckpointer, 'addGaugesWithVerifiedType'), admin.address); + + await Promise.all( + Array.from(gauges).map(([gaugeType, gaugesData]) => { + L2GaugeCheckpointer.connect(admin).addGaugesWithVerifiedType( + GaugeType[gaugeType], + gaugesData.map((gaugeData) => gaugeData.address) + ); + }) + ); + }); + + before('grant checkpoint permission to gauge checkpointer', async () => { + // Any gauge works; we just need the interface. + const gauge = await task.instanceAt('IStakelessGauge', gauges.get(GaugeType.Polygon)![0].address); + + await authorizer + .connect(daoMultisig) + .grantRole( + await adaptorEntrypoint.getActionId(gauge.interface.getSighash('checkpoint')), + L2GaugeCheckpointer.address + ); + }); + + it('checks that gauges were added correctly', async () => { + for (const [gaugeType, gaugesData] of gauges.entries()) { + expect(await L2GaugeCheckpointer.getTotalGauges(GaugeType[gaugeType])).to.be.eq(gaugesData.length); + } + }); + + describe('getTotalBridgeCost', () => { + function itChecksTotalBridgeCost(minRelativeWeight: BigNumber) { + it('checks total bridge cost', async () => { + const arbitrumGauge = await task.instanceAt('ArbitrumRootGauge', gauges.get(GaugeType.Arbitrum)![0].address); + + const gaugesAmountAboveMinWeight = getGaugeDataAboveMinWeight(GaugeType.Arbitrum, minRelativeWeight).length; + const singleGaugeBridgeCost = await arbitrumGauge.getTotalBridgeCost(); + + // Bridge cost per gauge is always the same, so total cost is (single gauge cost) * (number of gauges). + expect(await L2GaugeCheckpointer.getTotalBridgeCost(minRelativeWeight)).to.be.eq( + singleGaugeBridgeCost.mul(gaugesAmountAboveMinWeight) + ); + }); + } + + context('when threshold is 1', () => { + itChecksTotalBridgeCost(fp(1)); + }); + + context('when threshold is 0.0001', () => { + itChecksTotalBridgeCost(fp(0.0001)); + }); + + context('when threshold is 0', () => { + itChecksTotalBridgeCost(fp(0)); + }); + }); + + describe('getSingleBridgeCost', () => { + it('gets the cost for an arbitrum gauge', async () => { + const arbitrumGauge = await task.instanceAt('ArbitrumRootGauge', gauges.get(GaugeType.Arbitrum)![0].address); + const bridgeCost = await arbitrumGauge.getTotalBridgeCost(); + const arbitrumType = GaugeType[GaugeType.Arbitrum]; + expect(await L2GaugeCheckpointer.getSingleBridgeCost(arbitrumType, arbitrumGauge.address)).to.be.eq(bridgeCost); + }); + + it('gets the cost for an non-arbitrum gauge', async () => { + const gnosisGauge = await task.instanceAt('GnosisRootGauge', gauges.get(GaugeType.Gnosis)![0].address); + const gnosisType = GaugeType[GaugeType.Gnosis]; + expect(await L2GaugeCheckpointer.getSingleBridgeCost(gnosisType, gnosisGauge.address)).to.be.eq(0); + }); + + it('reverts when the gauge address is not present in the type', async () => { + const gnosisGauge = await task.instanceAt('GnosisRootGauge', gauges.get(GaugeType.Gnosis)![0].address); + const polygonType = GaugeType[GaugeType.Polygon]; + await expect(L2GaugeCheckpointer.getSingleBridgeCost(polygonType, gnosisGauge.address)).to.be.revertedWith( + 'Gauge was not added to the checkpointer' + ); + }); + }); + + describe('checkpoint', () => { + sharedBeforeEach(async () => { + // Gauges that are above a threshold will get another checkpoint attempt when the threshold is lowered. + // This block takes a snapshot so that gauges can be repeatedly checkpointed without skipping. + }); + + context('when threshold is 1', () => { + itCheckpointsGaugesAboveRelativeWeight(fp(1), 0); + }); + + context('when threshold is 0.0001', () => { + itCheckpointsGaugesAboveRelativeWeight(fp(0.0001), 11); + }); + + context('when threshold is 0', () => { + itCheckpointsGaugesAboveRelativeWeight(fp(0), 20); + }); + + function itCheckpointsGaugesAboveRelativeWeight(minRelativeWeight: BigNumber, gaugesAboveThreshold: number) { + let performCheckpoint: () => Promise; + let gaugeDataAboveMinWeight: GaugeData[] = []; + let ethereumGaugeDataAboveMinWeight: GaugeData[], + polygonGaugeDataAboveMinWeight: GaugeData[], + arbitrumGaugeDataAboveMinWeight: GaugeData[], + optimismGaugeDataAboveMinWeight: GaugeData[], + gnosisGaugeDataAboveMinWeight: GaugeData[]; + + sharedBeforeEach(async () => { + ethereumGaugeDataAboveMinWeight = getGaugeDataAboveMinWeight(GaugeType.Ethereum, minRelativeWeight); + polygonGaugeDataAboveMinWeight = getGaugeDataAboveMinWeight(GaugeType.Polygon, minRelativeWeight); + arbitrumGaugeDataAboveMinWeight = getGaugeDataAboveMinWeight(GaugeType.Arbitrum, minRelativeWeight); + optimismGaugeDataAboveMinWeight = getGaugeDataAboveMinWeight(GaugeType.Optimism, minRelativeWeight); + gnosisGaugeDataAboveMinWeight = getGaugeDataAboveMinWeight(GaugeType.Gnosis, minRelativeWeight); + }); + + context('when checkpointing all types', () => { + sharedBeforeEach(async () => { + performCheckpoint = async () => { + const tx = await L2GaugeCheckpointer.checkpointGaugesAboveRelativeWeight(minRelativeWeight, { + value: await L2GaugeCheckpointer.getTotalBridgeCost(minRelativeWeight), + }); + return await tx.wait(); + }; + gaugeDataAboveMinWeight = [ + ...ethereumGaugeDataAboveMinWeight, + ...polygonGaugeDataAboveMinWeight, + ...arbitrumGaugeDataAboveMinWeight, + ...optimismGaugeDataAboveMinWeight, + ...gnosisGaugeDataAboveMinWeight, + ]; + + expect(gaugeDataAboveMinWeight.length).to.be.eq(gaugesAboveThreshold); + }); + + itPerformsCheckpoint(); + }); + + context('when checkpointing only Ethereum gauges', () => { + sharedBeforeEach(async () => { + performCheckpoint = async () => { + const tx = await L2GaugeCheckpointer.checkpointGaugesOfTypeAboveRelativeWeight( + GaugeType[GaugeType.Ethereum], + minRelativeWeight + ); + return await tx.wait(); + }; + gaugeDataAboveMinWeight = ethereumGaugeDataAboveMinWeight; + }); + + itPerformsCheckpoint(); + }); + + context('when checkpointing only Polygon gauges', () => { + sharedBeforeEach(async () => { + performCheckpoint = async () => { + const tx = await L2GaugeCheckpointer.checkpointGaugesOfTypeAboveRelativeWeight( + GaugeType[GaugeType.Polygon], + minRelativeWeight + ); + return await tx.wait(); + }; + gaugeDataAboveMinWeight = polygonGaugeDataAboveMinWeight; + }); + + itPerformsCheckpoint(); + }); + + context('when checkpointing only Arbitrum gauges', () => { + sharedBeforeEach(async () => { + performCheckpoint = async () => { + const tx = await L2GaugeCheckpointer.checkpointGaugesOfTypeAboveRelativeWeight( + GaugeType[GaugeType.Arbitrum], + minRelativeWeight, + { + value: await L2GaugeCheckpointer.getTotalBridgeCost(minRelativeWeight), + } + ); + return await tx.wait(); + }; + gaugeDataAboveMinWeight = arbitrumGaugeDataAboveMinWeight; + }); + + itPerformsCheckpoint(); + }); + + context('when checkpointing only Optimism gauges', () => { + sharedBeforeEach(async () => { + performCheckpoint = async () => { + const tx = await L2GaugeCheckpointer.checkpointGaugesOfTypeAboveRelativeWeight( + GaugeType[GaugeType.Optimism], + minRelativeWeight + ); + return await tx.wait(); + }; + gaugeDataAboveMinWeight = optimismGaugeDataAboveMinWeight; + }); + + itPerformsCheckpoint(); + }); + + context('when checkpointing only Gnosis gauges', () => { + sharedBeforeEach(async () => { + performCheckpoint = async () => { + const tx = await L2GaugeCheckpointer.checkpointGaugesOfTypeAboveRelativeWeight( + GaugeType[GaugeType.Gnosis], + minRelativeWeight + ); + return await tx.wait(); + }; + gaugeDataAboveMinWeight = gnosisGaugeDataAboveMinWeight; + }); + + itPerformsCheckpoint(); + }); + + function itPerformsCheckpoint() { + it('performs a checkpoint for (non-checkpointed) gauges', async () => { + const receipt = await performCheckpoint(); + // Check that the right amount of checkpoints were actually performed for every gauge that required them. + gaugeDataAboveMinWeight.forEach((gaugeData) => { + expectEvent.inIndirectReceipt( + receipt, + checkpointInterface, + 'Checkpoint', + {}, + gaugeData.address, + gaugeData.expectedCheckpoints + ); + }); + }); + } + } + + describe('single gauge checkpoint', () => { + context('when checkpointing a single Arbitrum gauge', () => { + it('performs a checkpoint for (non-checkpointed) gauges', async () => { + const arbitrumGaugeData = gauges.get(GaugeType.Arbitrum)![0]; + const arbitrumType = GaugeType[GaugeType.Arbitrum]; + + const tx = await L2GaugeCheckpointer.checkpointSingleGauge(arbitrumType, arbitrumGaugeData.address, { + value: await L2GaugeCheckpointer.getSingleBridgeCost(arbitrumType, arbitrumGaugeData.address), + }); + expectEvent.inIndirectReceipt( + await tx.wait(), + checkpointInterface, + 'Checkpoint', + {}, + arbitrumGaugeData.address, + arbitrumGaugeData.expectedCheckpoints + ); + }); + }); + + context('when checkpointing a single non-Arbitrum gauge', () => { + it('performs a checkpoint for (non-checkpointed) gauges', async () => { + const gnosisGaugeData = gauges.get(GaugeType.Gnosis)![0]; + const gnosisType = GaugeType[GaugeType.Gnosis]; + + const tx = await L2GaugeCheckpointer.checkpointSingleGauge(gnosisType, gnosisGaugeData.address); + expectEvent.inIndirectReceipt( + await tx.wait(), + checkpointInterface, + 'Checkpoint', + {}, + gnosisGaugeData.address, + gnosisGaugeData.expectedCheckpoints + ); + }); + }); + }); + }); + + function getGaugeDataAboveMinWeight(gaugeType: GaugeType, fpMinRelativeWeight: BigNumber): GaugeData[] { + return gauges.get(gaugeType)!.filter((addressWeight) => addressWeight.weight.gte(fpMinRelativeWeight)); + } +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20230529-avalanche-root-gauge-factory/artifact/AvalancheRootGaugeFactory.json b/balpy/balancer-deployments/tasks/deprecated/20230529-avalanche-root-gauge-factory/artifact/AvalancheRootGaugeFactory.json new file mode 100644 index 0000000..47343b8 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230529-avalanche-root-gauge-factory/artifact/AvalancheRootGaugeFactory.json @@ -0,0 +1,211 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "AvalancheRootGaugeFactory", + "sourceName": "contracts/gauges/avalanche/AvalancheRootGaugeFactory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVault", + "name": "vault", + "type": "address" + }, + { + "internalType": "contract IMainnetBalancerMinter", + "name": "minter", + "type": "address" + }, + { + "internalType": "contract IMultichainV4Router", + "name": "multichainRouter", + "type": "address" + }, + { + "internalType": "uint256", + "name": "minBridgeAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxBridgeAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "minBridgeAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "maxBridgeAmount", + "type": "uint256" + } + ], + "name": "AvalancheBridgeLimitsModified", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "GaugeCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "relativeWeightCap", + "type": "uint256" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAvalancheBridgeLimits", + "outputs": [ + { + "internalType": "uint256", + "name": "minBridgeAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxBridgeAmount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "isGaugeFromFactory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "minBridgeAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxBridgeAmount", + "type": "uint256" + } + ], + "name": "setAvalancheBridgeLimits", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60c060405234801561001057600080fd5b506040516124ea3803806124ea83398101604081905261002f916100c5565b84306001600160a01b031660001b858560405161004b906100b8565b610056929190610122565b604051809103906000f080158015610072573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905560805260601b6001600160601b03191660a05260029190915560035550610154915050565b611a6c80610a7e83390190565b600080600080600060a086880312156100dc578081fd5b85516100e78161013c565b60208701519095506100f88161013c565b60408701519094506101098161013c565b6060870151608090970151959894975095949392505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b038116811461015157600080fd5b50565b60805160a05160601c61090461017a600039806102e25250806101ff52506109046000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80638bd2a3ef1161005b5780638bd2a3ef146100f45780638d928af814610109578063aaabadc514610111578063ce3cc8bd1461011957610088565b80630ecaea731461008d57806339312dee146100b6578063440d471f146100be578063851c1bb3146100d4575b600080fd5b6100a061009b3660046106b1565b610139565b6040516100ad91906107a9565b60405180910390f35b6100a06101d5565b6100c66101f1565b6040516100ad92919061089e565b6100e76100e23660046106fc565b6101fb565b6040516100ad91906107fb565b610107610102366004610758565b61024e565b005b6100a06102e0565b6100a0610304565b61012c610127366004610695565b610390565b6040516100ad91906107f0565b6000806101446103bb565b6040517fcd6dc68700000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063cd6dc6879061019b90879087906004016107ca565b600060405180830381600087803b1580156101b557600080fd5b505af11580156101c9573d6000803e3d6000fd5b50929695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6002546003549091565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610230929190610779565b6040516020818303038152906040528051906020012090505b919050565b610256610461565b818111610298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028f90610867565b60405180910390fd5b600282905560038190556040517f85e0779269d56538c2999b4bff4a60d2f65d9cf92dbaa6330deaff31f42385d1906102d4908490849061089e565b60405180910390a15050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061030e6102e0565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561035357600080fd5b505afa158015610367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038b919061073c565b905090565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b6000805481906103e09073ffffffffffffffffffffffffffffffffffffffff166104aa565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006104906000357fffffffff00000000000000000000000000000000000000000000000000000000166101fb565b90506104a761049f8233610557565b6101916105f4565b50565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff8116610249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028f90610830565b6000610561610304565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040161059d93929190610804565b60206040518083038186803b1580156105b557600080fd5b505afa1580156105c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ed91906106dc565b9392505050565b816106025761060281610606565b5050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526104a7917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b6000602082840312156106a6578081fd5b81356105ed816108ac565b600080604083850312156106c3578081fd5b82356106ce816108ac565b946020939093013593505050565b6000602082840312156106ed578081fd5b815180151581146105ed578182fd5b60006020828403121561070d578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146105ed578182fd5b60006020828403121561074d578081fd5b81516105ed816108ac565b6000806040838503121561076a578182fd5b50508035926020909101359150565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60208082526016908201527f455243313136373a20637265617465206661696c656400000000000000000000604082015260600190565b60208082526015908201527f496e76616c696420427269646765204c696d6974730000000000000000000000604082015260600190565b918252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff811681146104a757600080fdfea26469706673582212208b945d67fcd13753b247f290904214a9d51188d32d05198a676db0b88601e3c764736f6c634300070100336101e06040523480156200001257600080fd5b5060405162001a6c38038062001a6c833981810160405260408110156200003857600080fd5b508051602091820151600160009081556040805163e6dec36f60e01b815290519394929385936001600160a01b0385169263e6dec36f9260048083019392829003018186803b1580156200008b57600080fd5b505afa158015620000a0573d6000803e3d6000fd5b505050506040513d6020811015620000b757600080fd5b50516040805163c003969960e01b815290519192506000916001600160a01b0384169163c0039699916004808301926020929190829003018186803b1580156200010057600080fd5b505afa15801562000115573d6000803e3d6000fd5b505050506040513d60208110156200012c57600080fd5b505160408051632c6f4d6f60e11b815290519192506000916001600160a01b038616916358de9ade916004808301926020929190829003018186803b1580156200017557600080fd5b505afa1580156200018a573d6000803e3d6000fd5b505050506040513d6020811015620001a157600080fd5b50516001600160601b0319606084811b821660805285811b821660a05286811b821660c05282901b1660e052604080516303e1469160e61b815290519192506001600160a01b0383169163f851a44091600480820192602092909190829003018186803b1580156200021257600080fd5b505afa15801562000227573d6000803e3d6000fd5b505050506040513d60208110156200023e57600080fd5b505160601b6001600160601b0319166101005260408051635c3dab0b60e11b815290516001600160a01b0385169163b87b5616916004808301926020929190829003018186803b1580156200029257600080fd5b505afa158015620002a7573d6000803e3d6000fd5b505050506040513d6020811015620002be57600080fd5b505161012052604080516321609bbf60e01b815290516001600160a01b038516916321609bbf916004808301926020929190829003018186803b1580156200030557600080fd5b505afa1580156200031a573d6000803e3d6000fd5b505050506040513d60208110156200033157600080fd5b505161014052604080516303f7d6c760e51b815290516001600160a01b03851691637efad8e0916004808301926020929190829003018186803b1580156200037857600080fd5b505afa1580156200038d573d6000803e3d6000fd5b505050506040513d6020811015620003a457600080fd5b505161016052505060001960025550506001600160601b0319606092831b81166101805290821b166101a05233901b6101c05260805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205161014051610160516101805160601c6101a05160601c6101c05160601c6115d96200049360003980610d5a5250806104fa5280610edb5280610f745250806109c35250806107ef5250806107ce525080610751528061083b525080610389528061054f52806106105280610be752508061040e52806106df52508061093152508061103b528061111e525080610eb952506115d96000f3fe6080604052600436106100dd5760003560e01c80639c868ac01161007f578063c2c4c5c111610059578063c2c4c5c114610285578063cd6dc6871461028d578063d1c80b4d146102d3578063d34fb267146102e8576100dd565b80639c868ac0146102465780639f8676711461025b578063ab8f094514610270576100dd565b80631b88094d116100bb5780631b88094d1461018a5780634b820093146101c8578063558beb371461021c57806383f5c39b14610231576100dd565b806309400707146100e257806310d3eb041461013457806314e956f514610160575b600080fd5b3480156100ee57600080fd5b506101226004803603602081101561010557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166102fd565b60408051918252519081900360200190f35b34801561014057600080fd5b5061015e6004803603602081101561015757600080fd5b5035610371565b005b34801561016c57600080fd5b506101226004803603602081101561018357600080fd5b5035610407565b34801561019657600080fd5b5061019f6104d5565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101d457600080fd5b50610208600480360360208110156101eb57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166104f2565b604080519115158252519081900360200190f35b34801561022857600080fd5b5061019f6104f8565b34801561023d57600080fd5b5061012261051c565b34801561025257600080fd5b50610208610522565b34801561026757600080fd5b5061012261052b565b34801561027c57600080fd5b5061015e610537565b6102086105ee565b34801561029957600080fd5b5061015e600480360360408110156102b057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356109c1565b3480156102df57600080fd5b5061019f610bb7565b3480156102f457600080fd5b5061015e610bcf565b600073ffffffffffffffffffffffffffffffffffffffff82163014610369576040805162461bcd60e51b815260206004820152601e60248201527f47617567652063616e206f6e6c79206d696e7420666f7220697473656c660000604482015290519081900360640190fd5b505060045490565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146103fb576040805162461bcd60e51b815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b61040481610c83565b50565b60006104cf7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9430856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561049b57600080fd5b505afa1580156104af573d6000803e3d6000fd5b505050506040513d60208110156104c557600080fd5b5051600654610d05565b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff165b90565b50600190565b7f000000000000000000000000000000000000000000000000000000000000000090565b60065490565b60055460ff1690565b670de0b6b3a764000081565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146105c1576040805162461bcd60e51b815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006105f8610d11565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610682576040805162461bcd60e51b815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600254600061068f610d2a565b9050808210156109b357604080517f615e5237000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163615e523791602480830192600092919082900301818387803b15801561072657600080fd5b505af115801561073a573d6000803e3d6000fd5b5050600180546003549590910194909250600091507f000000000000000000000000000000000000000000000000000000000000000001845b8560ff018110156108c6578481111561078b576108c6565b62093a80810260008061079d83610407565b90508285101580156107b357508262093a800185105b1561086c57828503670de0b6b3a764000082890282020492507f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000089028161081757fe5b04975062093a80819003670de0b6b3a7640000838a02820260018b905560038990557f000000000000000000000000000000000000000000000000000000000000000090980197049390930192506108819050565b670de0b6b3a764000062093a80828902020491505b60408051838152905184917f21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced919081900360200190a250939093019250600101610773565b506002849055600480548301905581158015906108e6575060055460ff16155b156109af57604080517f6a627842000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691636a6278429160248083019260209291908290030181600087803b15801561097957600080fd5b505af115801561098d573d6000803e3d6000fd5b505050506040513d60208110156109a357600080fd5b506109af905082610d55565b5050505b6001925050506104ef610fdb565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c00396996040518163ffffffff1660e01b815260040160206040518083038186803b158015610a2757600080fd5b505afa158015610a3b573d6000803e3d6000fd5b505050506040513d6020811015610a5157600080fd5b5051604080517f6f307dc3000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169173cb9d0b8cfd8371143ba5a794c7218d4766c493e291636f307dc39160048083019260209291908290030181600087803b158015610ad257600080fd5b505af1158015610ae6573d6000803e3d6000fd5b505050506040513d6020811015610afc57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1614610b66576040805162461bcd60e51b815260206004820152601560248201527f496e76616c6964205772617070657220546f6b656e0000000000000000000000604482015290519081900360640190fd5b610b6f81610fe2565b50600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73cb9d0b8cfd8371143ba5a794c7218d4766c493e290565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610c59576040805162461bcd60e51b815260206004820152601260248201527f53454e4445525f4e4f545f414c4c4f5745440000000000000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b670de0b6b3a7640000811115610cca5760405162461bcd60e51b815260040180806020018281038252603481526020018061154c6034913960400191505060405180910390fd5b60068190556040805182815290517f13e45870490f54cea50d245930d12102c72b502641ef6850d0b15a8c92decfb29181900360200190a150565b80820390821102900390565b610d23600260005414156101906111c0565b6002600055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62093a8042040190565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663440d471f6040518163ffffffff1660e01b8152600401604080518083038186803b158015610dbd57600080fd5b505afa158015610dd1573d6000803e3d6000fd5b505050506040513d6040811015610de757600080fd5b508051602090910151909250905081831015610e4a576040805162461bcd60e51b815260206004820152601260248201527f42656c6f7720427269646765204c696d69740000000000000000000000000000604482015290519081900360640190fd5b80831115610e9f576040805162461bcd60e51b815260206004820152601260248201527f41626f766520427269646765204c696d69740000000000000000000000000000604482015290519081900360640190fd5b610f0073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f0000000000000000000000000000000000000000000000000000000000000000856111ce565b600754604080517fedbdf5e200000000000000000000000000000000000000000000000000000000815273cb9d0b8cfd8371143ba5a794c7218d4766c493e2600482015273ffffffffffffffffffffffffffffffffffffffff92831660248201526044810186905261a86a606482015290517f00000000000000000000000000000000000000000000000000000000000000009092169163edbdf5e29160848082019260009290919082900301818387803b158015610fbe57600080fd5b505af1158015610fd2573d6000803e3d6000fd5b50505050505050565b6001600055565b60025415611037576040805162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632c4e722e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561109f57600080fd5b505afa1580156110b3573d6000803e3d6000fd5b505050506040513d60208110156110c957600080fd5b50519050806111095760405162461bcd60e51b81526004018080602001828103825260248152602001806115806024913960400191505060405180910390fd5b6001819055611116610d2a565b6002819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a228bced6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561118457600080fd5b505af1158015611198573d6000803e3d6000fd5b505050506040513d60208110156111ae57600080fd5b50516003556111bc82610c83565b5050565b816111bc576111bc816113a4565b801580159061127d5750604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561124e57600080fd5b505afa158015611262573d6000803e3d6000fd5b505050506040513d602081101561127857600080fd5b505115155b15611312576040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260006044808301919091528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b3000000000000000000000000000000000000000000000000000000001790526113129084906113ce565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b30000000000000000000000000000000000000000000000000000000017905261139f9084906113ce565b505050565b610404817f42414c00000000000000000000000000000000000000000000000000000000006114ea565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b6020831061143757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016113fa565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611499576040519150601f19603f3d011682016040523d82523d6000602084013e61149e565b606091505b509150915060008214156114b6573d6000803e3d6000fd5b6114e48151600014806114dc57508180602001905160208110156114d957600080fd5b50515b6101a26111c0565b50505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fdfe52656c61746976652077656967687420636170206578636565647320616c6c6f776564206162736f6c757465206d6178696d756d42616c616e636572546f6b656e41646d696e206e6f742079657420616374697661746564a2646970667358221220f47ba935ab1fdfceb1071f2017fe0d3b945cac1766a4dc088080a733df3a18c064736f6c63430007010033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c80638bd2a3ef1161005b5780638bd2a3ef146100f45780638d928af814610109578063aaabadc514610111578063ce3cc8bd1461011957610088565b80630ecaea731461008d57806339312dee146100b6578063440d471f146100be578063851c1bb3146100d4575b600080fd5b6100a061009b3660046106b1565b610139565b6040516100ad91906107a9565b60405180910390f35b6100a06101d5565b6100c66101f1565b6040516100ad92919061089e565b6100e76100e23660046106fc565b6101fb565b6040516100ad91906107fb565b610107610102366004610758565b61024e565b005b6100a06102e0565b6100a0610304565b61012c610127366004610695565b610390565b6040516100ad91906107f0565b6000806101446103bb565b6040517fcd6dc68700000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063cd6dc6879061019b90879087906004016107ca565b600060405180830381600087803b1580156101b557600080fd5b505af11580156101c9573d6000803e3d6000fd5b50929695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6002546003549091565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610230929190610779565b6040516020818303038152906040528051906020012090505b919050565b610256610461565b818111610298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028f90610867565b60405180910390fd5b600282905560038190556040517f85e0779269d56538c2999b4bff4a60d2f65d9cf92dbaa6330deaff31f42385d1906102d4908490849061089e565b60405180910390a15050565b7f000000000000000000000000000000000000000000000000000000000000000090565b600061030e6102e0565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561035357600080fd5b505afa158015610367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038b919061073c565b905090565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b6000805481906103e09073ffffffffffffffffffffffffffffffffffffffff166104aa565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555192935090917faa98436d09d130af48de49867af8b723bbbebb0d737638b5fe8f1bf31bbb71c09190a2905090565b60006104906000357fffffffff00000000000000000000000000000000000000000000000000000000166101fb565b90506104a761049f8233610557565b6101916105f4565b50565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f091505073ffffffffffffffffffffffffffffffffffffffff8116610249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028f90610830565b6000610561610304565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040161059d93929190610804565b60206040518083038186803b1580156105b557600080fd5b505afa1580156105c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ed91906106dc565b9392505050565b816106025761060281610606565b5050565b7f08c379a000000000000000000000000000000000000000000000000000000000600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b6044526104a7917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5b6000602082840312156106a6578081fd5b81356105ed816108ac565b600080604083850312156106c3578081fd5b82356106ce816108ac565b946020939093013593505050565b6000602082840312156106ed578081fd5b815180151581146105ed578182fd5b60006020828403121561070d578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146105ed578182fd5b60006020828403121561074d578081fd5b81516105ed816108ac565b6000806040838503121561076a578182fd5b50508035926020909101359150565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b60208082526016908201527f455243313136373a20637265617465206661696c656400000000000000000000604082015260600190565b60208082526015908201527f496e76616c696420427269646765204c696d6974730000000000000000000000604082015260600190565b918252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff811681146104a757600080fdfea26469706673582212208b945d67fcd13753b247f290904214a9d51188d32d05198a676db0b88601e3c764736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230529-avalanche-root-gauge-factory/index.ts b/balpy/balancer-deployments/tasks/deprecated/20230529-avalanche-root-gauge-factory/index.ts new file mode 100644 index 0000000..dbc6b54 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230529-avalanche-root-gauge-factory/index.ts @@ -0,0 +1,14 @@ +import { Task, TaskRunOptions } from '@src'; +import { AvalancheRootGaugeFactoryDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as AvalancheRootGaugeFactoryDeployment; + + const args = [input.Vault, input.BalancerMinter, input.MultichainRouter, input.MinBridgeLimit, input.MaxBridgeLimit]; + + const factory = await task.deployAndVerify('AvalancheRootGaugeFactory', args, from, force); + + const implementation = await factory.getGaugeImplementation(); + await task.verify('AvalancheRootGauge', implementation, [input.BalancerMinter, input.MultichainRouter]); + await task.save({ AvalancheRootGauge: implementation }); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230529-avalanche-root-gauge-factory/input.ts b/balpy/balancer-deployments/tasks/deprecated/20230529-avalanche-root-gauge-factory/input.ts new file mode 100644 index 0000000..e4ad7c3 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230529-avalanche-root-gauge-factory/input.ts @@ -0,0 +1,26 @@ +import { BigNumber } from 'ethers'; +import { Task, TaskMode } from '@src'; +import { fp } from '@helpers/numbers'; + +export type AvalancheRootGaugeFactoryDeployment = { + Vault: string; + BalancerMinter: string; + MultichainRouter: string; + MinBridgeLimit: BigNumber; + MaxBridgeLimit: BigNumber; +}; + +const Vault = new Task('20210418-vault', TaskMode.READ_ONLY); +const BalancerMinter = new Task('20220325-gauge-controller', TaskMode.READ_ONLY); + +export default { + mainnet: { + Vault, + BalancerMinter, + // From https://docs.multichain.org/developer-guide/bridge-api-token-list-tx-status + MultichainRouter: '0x765277eebeca2e31912c9946eae1021199b39c61', + // The following values were taken from the router UI: https://app.multichain.org/#/router + MinBridgeLimit: fp(2), // Actual limit is 1.459854 - make slightly higher for a safety margin + MaxBridgeLimit: fp(725000), // Actual limit is 729,927.007299 - make slightly lower for a safety margin + }, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230529-avalanche-root-gauge-factory/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20230529-avalanche-root-gauge-factory/output/mainnet.json new file mode 100644 index 0000000..cecc58e --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230529-avalanche-root-gauge-factory/output/mainnet.json @@ -0,0 +1,4 @@ +{ + "AvalancheRootGaugeFactory": "0x10f3e79911A490aa5B5D5CDA6F111029c4Eab5AC", + "AvalancheRootGauge": "0xc57b4BE50BF6BBe5f6a4fE379DA342B32b37bF2f" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230529-avalanche-root-gauge-factory/readme.md b/balpy/balancer-deployments/tasks/deprecated/20230529-avalanche-root-gauge-factory/readme.md new file mode 100644 index 0000000..444a291 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230529-avalanche-root-gauge-factory/readme.md @@ -0,0 +1,12 @@ +# 2023-05-29 - Avalanche Root Gauge Factory + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This version has been replaced for an updated version: [AvalancheRootGaugeFactory V2](../../20230811-avalanche-root-gauge-factory-v2/). The new version uses a different bridge for the BAL token, which is considered the canonical one. + +Deployment of the `AvalancheRootGaugeFactory`, for stakeless gauges that bridge funds to their Avalanche counterparts. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [`AvalancheRootGaugeFactory` artifact](./artifact/AvalancheRootGaugeFactory.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20230529-avalanche-root-gauge-factory/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20230529-avalanche-root-gauge-factory/test/task.fork.ts new file mode 100644 index 0000000..d829878 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230529-avalanche-root-gauge-factory/test/task.fork.ts @@ -0,0 +1,366 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; + +import { BigNumber, fp, FP_ONE } from '@helpers/numbers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { advanceTime, currentTimestamp, currentWeekTimestamp, DAY, MONTH, WEEK } from '@helpers/time'; +import * as expectEvent from '@helpers/expectEvent'; + +import { expectEqualWithError } from '@helpers/relativeError'; +import { MAX_UINT256, ZERO_ADDRESS } from '@helpers/constants'; +import { range } from 'lodash'; +import { expectTransferEvent } from '@helpers/expectTransfer'; +import { actionId } from '@helpers/models/misc/actions'; + +import { describeForkTest, getSigner, impersonate, getForkedNetwork, Task, TaskMode } from '@src'; +import { WeightedPoolEncoder } from '@helpers/models/pools/weighted/encoder'; + +describeForkTest('AvalancheRootGaugeFactory', 'mainnet', 17395000, function () { + let veBALHolder: SignerWithAddress, admin: SignerWithAddress, recipient: SignerWithAddress; + let daoMultisig: SignerWithAddress; + let factory: Contract, gauge: Contract; + let vault: Contract, + authorizer: Contract, + adaptorEntrypoint: Contract, + BALTokenAdmin: Contract, + gaugeController: Contract, + gaugeAdder: Contract, + veBAL: Contract, + bal80weth20Pool: Contract; + let BAL: string; + + let task: Task; + + // Address of wrapped BAL for the bridge + const ANY_BAL = '0xcb9d0b8CfD8371143ba5A794c7218D4766c493e2'; + const DAO_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + const VEBAL_POOL = '0x5c6ee304399dbdb9c8ef030ab642b10820db8f56'; + const VAULT_BOUNTY = fp(1000); + + const weightCap = fp(0.001); + + const ETHEREUM_HARDHAT_CHAIN_ID = 31337; + const AVALANCHE_CHAIN_ID = 43114; + + // Actual limits are 1.459854 - 729927.007299 + // Use slightly stricter limits for a safety margin. + const MIN_BRIDGE_LIMIT = fp(2); + const MAX_BRIDGE_LIMIT = fp(725000); + + const bridgeInterface = new ethers.utils.Interface([ + 'event LogAnySwapOut(address indexed token, address indexed from, address indexed to, uint amount, uint fromChainID, uint toChainID)', + ]); + + before('run task', async () => { + task = new Task('20230529-avalanche-root-gauge-factory', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + factory = await task.deployedInstance('AvalancheRootGaugeFactory'); + }); + + before('setup accounts', async () => { + admin = await getSigner(0); + recipient = await getSigner(1); + + daoMultisig = await impersonate(DAO_MULTISIG, fp(100)); + // Since the veBAL holder is synthetic, we do not need to start the test advancing the time to reset the voting + // power. Moreover, since the block number is close to the present at this point, advancing days breaks the first + // weight check for the gauge (i.e. before the very first gauge checkpoint), which would make the 'bridge & mint' + // test unnecessarily complex later on. + // + // Specifically, `gauge_relative_weight` returns 0 before the first gauge checkpoint, even when there are votes, + // which would cause the "vote for gauge" test to fail: and we cannot checkpoint it manually there, since the next + // "mint and bridge" needs to test for zero emissions and do its own checkpoint. + veBALHolder = await impersonate((await getSigner(2)).address, VAULT_BOUNTY.add(fp(5))); // plus gas + }); + + before('setup contracts', async () => { + const vaultTask = new Task('20210418-vault', TaskMode.READ_ONLY, getForkedNetwork(hre)); + vault = await vaultTask.deployedInstance('Vault'); + + // Need to get the original Authorizer (getting it from the Vault at this block will yield the AuthorizerWithAdaptorValidation) + const authorizerTask = new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizer = await authorizerTask.deployedInstance('Authorizer'); + + const adaptorEntrypointTask = new Task('20221124-authorizer-adaptor-entrypoint', TaskMode.READ_ONLY, 'mainnet'); + adaptorEntrypoint = await adaptorEntrypointTask.deployedInstance('AuthorizerAdaptorEntrypoint'); + + const gaugeAdderTask = new Task('20230519-gauge-adder-v4', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeAdder = await gaugeAdderTask.deployedInstance('GaugeAdder'); + + const balancerTokenAdminTask = new Task('20220325-balancer-token-admin', TaskMode.READ_ONLY, getForkedNetwork(hre)); + BALTokenAdmin = await balancerTokenAdminTask.deployedInstance('BalancerTokenAdmin'); + + BAL = await BALTokenAdmin.getBalancerToken(); + + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeController = await gaugeControllerTask.deployedInstance('GaugeController'); + veBAL = await gaugeControllerTask.instanceAt( + 'VotingEscrow', + gaugeControllerTask.output({ network: 'mainnet' }).VotingEscrow + ); + + const weightedPoolTask = new Task('20210418-weighted-pool', TaskMode.READ_ONLY, getForkedNetwork(hre)); + bal80weth20Pool = await weightedPoolTask.instanceAt('WeightedPool2Tokens', VEBAL_POOL); + }); + + describe('Factory bridge limits', () => { + const randomInt = (max: number) => Math.floor(Math.random() * Math.floor(max)); + + it('stores the original bridge limits', async () => { + const { minBridgeAmount, maxBridgeAmount } = await factory.getAvalancheBridgeLimits(); + + expect(minBridgeAmount).to.eq(MIN_BRIDGE_LIMIT); + expect(maxBridgeAmount).to.eq(MAX_BRIDGE_LIMIT); + }); + + describe('setting bridge limits', async () => { + const factor = randomInt(10) + 1; + + const newLowerLimit = MIN_BRIDGE_LIMIT.mul(factor); + const newUpperLimit = MAX_BRIDGE_LIMIT.mul(factor); + + context('without permission', () => { + it('fails if the caller has no permission', async () => { + await expect(factory.setAvalancheBridgeLimits(newLowerLimit, newUpperLimit)).to.be.revertedWith('BAL#401'); + }); + }); + + context('with permission', () => { + before('grant permission', async () => { + const setLimitsAction = await actionId(factory, 'setAvalancheBridgeLimits'); + + await authorizer.connect(daoMultisig).grantRole(setLimitsAction, admin.address); + }); + + it('allows updating bridge limits', async () => { + const tx = await factory.connect(admin).setAvalancheBridgeLimits(newLowerLimit, newUpperLimit); + expectEvent.inReceipt(await tx.wait(), 'AvalancheBridgeLimitsModified', { + minBridgeAmount: newLowerLimit, + maxBridgeAmount: newUpperLimit, + }); + + const { minBridgeAmount, maxBridgeAmount } = await factory.getAvalancheBridgeLimits(); + + expect(minBridgeAmount).to.eq(newLowerLimit); + expect(maxBridgeAmount).to.eq(newUpperLimit); + }); + + it('ensure valid bridge limits', async () => { + // Reverse the limits; max must be > min + await expect( + factory.connect(admin).setAvalancheBridgeLimits(newUpperLimit, newLowerLimit) + ).to.be.revertedWith('Invalid Bridge Limits'); + }); + }); + }); + }); + + before('create veBAL whale', async () => { + const poolId = await bal80weth20Pool.getPoolId(); + + await vault.connect(veBALHolder).joinPool( + poolId, + veBALHolder.address, + veBALHolder.address, + { + assets: [BAL, ZERO_ADDRESS], + maxAmountsIn: [0, VAULT_BOUNTY], + fromInternalBalance: false, + userData: WeightedPoolEncoder.joinExactTokensInForBPTOut([0, VAULT_BOUNTY], 0), + }, + { value: VAULT_BOUNTY } + ); + + await bal80weth20Pool.connect(veBALHolder).approve(veBAL.address, MAX_UINT256); + const currentTime = await currentTimestamp(); + await veBAL + .connect(veBALHolder) + .create_lock(await bal80weth20Pool.balanceOf(veBALHolder.address), currentTime.add(MONTH * 12)); + + // Verify non-zero veBAL balance + const now = await currentTimestamp(); + expect(await veBAL['balanceOf(address,uint256)'](veBALHolder.address, now)).to.gt(0); + }); + + it('can create a gauge', async () => { + const tx = await factory.create(recipient.address, weightCap); + const event = expectEvent.inReceipt(await tx.wait(), 'GaugeCreated'); + + gauge = await task.instanceAt('AvalancheRootGauge', event.args.gauge); + + expect(await factory.isGaugeFromFactory(gauge.address)).to.be.true; + + // We need to grant permissions to mint in the gauges, which is done via the Authorizer Adaptor Entrypoint + await authorizer + .connect(daoMultisig) + .grantRole(await adaptorEntrypoint.getActionId(gauge.interface.getSighash('checkpoint')), admin.address); + }); + + before('grant permissions on gauge adder', async () => { + // The adder is already configured with basic types and the permission to add gauges to the `GaugeController` + // at this point. + // So we will need permissions to create the new type, set the factory and add the gauge in the adder. + const addGaugeTypeAction = await actionId(gaugeAdder, 'addGaugeType'); + const setFactoryAction = await actionId(gaugeAdder, 'setGaugeFactory'); + const addGaugeAction = await actionId(gaugeAdder, 'addGauge'); + + await authorizer.connect(daoMultisig).grantRole(addGaugeTypeAction, admin.address); + await authorizer.connect(daoMultisig).grantRole(setFactoryAction, admin.address); + await authorizer.connect(daoMultisig).grantRole(addGaugeAction, admin.address); + }); + + it('add gauge to gauge controller', async () => { + await gaugeAdder.connect(admin).addGaugeType('Avalanche'); + expect(await gaugeAdder.getGaugeTypes()).to.include('Avalanche'); + + await gaugeAdder.connect(admin).setGaugeFactory(factory.address, 'Avalanche'); + await gaugeAdder.connect(admin).addGauge(gauge.address, 'Avalanche'); + + expect(await gaugeAdder.isGaugeFromValidFactory(gauge.address, 'Avalanche')).to.be.true; + + expect(await gaugeController.gauge_exists(gauge.address)).to.be.true; + }); + + it('stores the AnySwap wrapper', async () => { + expect(await gauge.getAnyBAL()).to.eq(ANY_BAL); + }); + + it('stores the Multichain Router', async () => { + expect((await gauge.getMultichainRouter()).toLowerCase()).to.eq(task.input().MultichainRouter.toLowerCase()); + }); + + it('stores the recipient', async () => { + expect(await gauge.getRecipient()).to.eq(recipient.address); + }); + + it('vote for gauge', async () => { + expect(await gaugeController.get_gauge_weight(gauge.address)).to.equal(0); + expect(await gauge.getCappedRelativeWeight(await currentTimestamp())).to.equal(0); + + await gaugeController.connect(veBALHolder).vote_for_gauge_weights(gauge.address, 10000); // Max voting power is 10k points + + // We now need to go through an epoch for the votes to be locked in + await advanceTime(DAY * 8); + + await gaugeController.checkpoint(); + // Gauge weight is equal to the cap, and controller weight for the gauge is greater than the cap. + expect( + await gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, await currentWeekTimestamp()) + ).to.be.gt(weightCap); + expect(await gauge.getCappedRelativeWeight(await currentTimestamp())).to.equal(weightCap); + }); + + it('mint & bridge tokens', async () => { + // The gauge has votes for this week, and it will mint the first batch of tokens. We store the current gauge + // relative weight, as it will change as time goes by due to vote decay. + const firstMintWeekTimestamp = await currentWeekTimestamp(); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + + // Even though the gauge has relative weight, it cannot mint yet as it needs for the epoch to finish + const zeroMintTx = await adaptorEntrypoint.connect(admin).performAction(gauge.address, calldata); + expectEvent.inIndirectReceipt(await zeroMintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp.sub(WEEK), // Process past week, which had zero votes + periodEmissions: 0, + }); + // No token transfers are performed if the emissions are zero, but we can't test for a lack of those + + await advanceTime(WEEK); + + // The gauge should now mint and send all minted tokens to the Polygon ZkEVM bridge + const mintTx = await adaptorEntrypoint.connect(admin).performAction(gauge.address, calldata); + const event = expectEvent.inIndirectReceipt(await mintTx.wait(), gauge.interface, 'Checkpoint', { + periodTime: firstMintWeekTimestamp, + }); + const actualEmissions = event.args.periodEmissions; + + // The amount of tokens minted should equal the weekly emissions rate times the relative weight of the gauge + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + + // Note that instead of the weight, we use the cap (since we expect for the weight to be larger than the cap) + const expectedEmissions = weightCap.mul(weeklyRate).div(FP_ONE); + expectEqualWithError(actualEmissions, expectedEmissions, 0.001); + + // Tokens are minted for the gauge + expectTransferEvent( + await mintTx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + value: actualEmissions, + }, + BAL + ); + + // And the gauge then deposits those via the bridge mechanism + expectEvent.inIndirectReceipt(await mintTx.wait(), bridgeInterface, 'LogAnySwapOut', { + token: ANY_BAL, + from: gauge.address, + to: recipient.address, + amount: actualEmissions, + fromChainID: ETHEREUM_HARDHAT_CHAIN_ID, + toChainID: AVALANCHE_CHAIN_ID, + }); + }); + + it('mint multiple weeks', async () => { + const numberOfWeeks = 5; + await advanceTime(WEEK * numberOfWeeks); + await gaugeController.checkpoint_gauge(gauge.address); + + const weekTimestamp = await currentWeekTimestamp(); + + // We can query the relative weight of the gauge for each of the weeks that have passed + const relativeWeights: BigNumber[] = await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + gaugeController['gauge_relative_weight(address,uint256)'](gauge.address, weekTimestamp.sub(WEEK * weekIndex)) + ) + ); + + // We require that they're all above the cap for simplicity - this lets us use the cap as each week's weight (and + // also tests cap behavior). + for (const relativeWeight of relativeWeights) { + expect(relativeWeight).to.be.gt(weightCap); + } + + // The amount of tokens allocated to the gauge should equal the sum of the weekly emissions rate times the weight + // cap. + const weeklyRate = (await BALTokenAdmin.getInflationRate()).mul(WEEK); + // Note that instead of the weight, we use the cap (since we expect for the weight to be larger than the cap) + const expectedEmissions = weightCap.mul(numberOfWeeks).mul(weeklyRate).div(FP_ONE); + + const calldata = gauge.interface.encodeFunctionData('checkpoint'); + const tx = await adaptorEntrypoint.connect(admin).performAction(gauge.address, calldata); + + await Promise.all( + range(1, numberOfWeeks + 1).map(async (weekIndex) => + expectEvent.inIndirectReceipt(await tx.wait(), gauge.interface, 'Checkpoint', { + periodTime: weekTimestamp.sub(WEEK * weekIndex), + }) + ) + ); + + // Tokens are minted for the gauge + const transferEvent = expectTransferEvent( + await tx.wait(), + { + from: ZERO_ADDRESS, + to: gauge.address, + }, + BAL + ); + + expect(transferEvent.args.value).to.be.almostEqual(expectedEmissions); + + const depositEvent = expectEvent.inIndirectReceipt(await tx.wait(), bridgeInterface, 'LogAnySwapOut', { + token: ANY_BAL, + from: gauge.address, + to: recipient.address, + fromChainID: ETHEREUM_HARDHAT_CHAIN_ID, + toChainID: AVALANCHE_CHAIN_ID, + }); + + expect(depositEvent.args.amount).to.be.almostEqual(expectedEmissions); + }); +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/artifact/StakelessGaugeCheckpointer.json b/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/artifact/StakelessGaugeCheckpointer.json new file mode 100644 index 0000000..73e16c6 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/artifact/StakelessGaugeCheckpointer.json @@ -0,0 +1,411 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "StakelessGaugeCheckpointer", + "sourceName": "contracts/gauges/StakelessGaugeCheckpointer.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IGaugeAdder", + "name": "gaugeAdder", + "type": "address" + }, + { + "internalType": "contract IAuthorizerAdaptorEntrypoint", + "name": "authorizerAdaptorEntrypoint", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IStakelessGauge", + "name": "gauge", + "type": "address" + }, + { + "indexed": true, + "internalType": "string", + "name": "indexedGaugeType", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "gaugeType", + "type": "string" + } + ], + "name": "GaugeAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IStakelessGauge", + "name": "gauge", + "type": "address" + }, + { + "indexed": true, + "internalType": "string", + "name": "indexedGaugeType", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "gaugeType", + "type": "string" + } + ], + "name": "GaugeRemoved", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "contract IStakelessGauge[]", + "name": "gauges", + "type": "address[]" + } + ], + "name": "addGauges", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "contract IStakelessGauge[]", + "name": "gauges", + "type": "address[]" + } + ], + "name": "addGaugesWithVerifiedType", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "minRelativeWeight", + "type": "uint256" + } + ], + "name": "checkpointGaugesAboveRelativeWeight", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "uint256", + "name": "minRelativeWeight", + "type": "uint256" + } + ], + "name": "checkpointGaugesOfTypeAboveRelativeWeight", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string[]", + "name": "gaugeTypes", + "type": "string[]" + }, + { + "internalType": "address[]", + "name": "gauges", + "type": "address[]" + } + ], + "name": "checkpointMultipleGauges", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "checkpointSingleGauge", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "selector", + "type": "bytes4" + } + ], + "name": "getActionId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAuthorizer", + "outputs": [ + { + "internalType": "contract IAuthorizer", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeAdder", + "outputs": [ + { + "internalType": "contract IGaugeAdder", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getGaugeAtIndex", + "outputs": [ + { + "internalType": "contract IStakelessGauge", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGaugeTypes", + "outputs": [ + { + "internalType": "string[]", + "name": "", + "type": "string[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRoundedDownBlockTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "address", + "name": "gauge", + "type": "address" + } + ], + "name": "getSingleBridgeCost", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "minRelativeWeight", + "type": "uint256" + } + ], + "name": "getTotalBridgeCost", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + } + ], + "name": "getTotalGauges", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVault", + "outputs": [ + { + "internalType": "contract IVault", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "contract IStakelessGauge", + "name": "gauge", + "type": "address" + } + ], + "name": "hasGauge", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + } + ], + "name": "isValidGaugeType", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "gaugeType", + "type": "string" + }, + { + "internalType": "contract IStakelessGauge[]", + "name": "gauges", + "type": "address[]" + } + ], + "name": "removeGauges", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x61014060405262000012610160620001f9565b60408051601f19818403018152919052805160209091012060c0523480156200003a57600080fd5b5060405162002fa038038062002fa08339810160408190526200005d9162000195565b806001600160a01b0316638d928af86040518163ffffffff1660e01b815260040160206040518083038186803b1580156200009757600080fd5b505afa158015620000ac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d29190620001d3565b6001600055306080526001600160601b0319606091821b811660a05283821b8116610100529082901b1660e05260408051632c6f4d6f60e11b815290516001600160a01b038416916358de9ade916004808301926020929190829003018186803b1580156200014057600080fd5b505afa15801562000155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200017b9190620001d3565b60601b6001600160601b0319166101205250620002269050565b60008060408385031215620001a8578182fd5b8251620001b5816200020d565b6020840151909250620001c8816200020d565b809150509250929050565b600060208284031215620001e5578081fd5b8151620001f2816200020d565b9392505050565b67417262697472756d60c01b815260080190565b6001600160a01b03811681146200022357600080fd5b50565b60805160a05160601c60c05160e05160601c6101005160601c6101205160601c612cca620002d6600039806105bf528061176c528061185652806118fd5280611b0e5250806103bd528061044d52806109145280610a305280610c5a5280610d9f5280610e445280610f33528061105e528061116152806112605280611cb45250806114665280611eeb528061208a52508061075352806116f7525080610cf2525080610ca25250612cca6000f3fe6080604052600436106101445760003560e01c80637d0a6616116100c0578063c91be04311610074578063d8dba2ce11610059578063d8dba2ce1461032a578063db5d12251461034a578063f7178b881461035d57610144565b8063c91be043146102f7578063d14cfe3b1461031757610144565b80638d928af8116100a55780638d928af8146102ab578063aaabadc5146102c0578063afcb1a86146102d557610144565b80637d0a661614610278578063851c1bb31461028b57610144565b806346583adf116101175780634db34d2a116100fc5780634db34d2a1461022357806373ebd060146102435780637c1fef511461026357610144565b806346583adf146101f95780634a3a1e111461020e57610144565b806316e772bc1461014957806327cb2a3b1461017f57806327f79107146101ac5780632adbe5ac146101d9575b600080fd5b34801561015557600080fd5b506101696101643660046125b2565b61037d565b60405161017691906128db565b60405180910390f35b34801561018b57600080fd5b5061019f61019a3660046126c8565b610448565b60405161017691906127df565b3480156101b857600080fd5b506101cc6101c736600461270b565b61054c565b60405161017691906128e6565b3480156101e557600080fd5b506101cc6101f43660046125e5565b61070a565b34801561020557600080fd5b506101cc61082d565b61022161021c366004612436565b61083c565b005b34801561022f57600080fd5b506101cc61023e3660046125b2565b61090f565b34801561024f57600080fd5b5061022161025e366004612635565b6109f1565b34801561026f57600080fd5b5061019f610c58565b6102216102863660046125e5565b610c7c565b34801561029757600080fd5b506101cc6102a6366004612507565b610c9e565b3480156102b757600080fd5b5061019f610cf0565b3480156102cc57600080fd5b5061019f610d14565b3480156102e157600080fd5b506102ea610d9b565b604051610176919061285d565b34801561030357600080fd5b506101696103123660046125e5565b610e3f565b61022161032536600461270b565b610f1b565b34801561033657600080fd5b50610221610345366004612635565b61101f565b6102216103583660046126c8565b61111a565b34801561036957600080fd5b50610221610378366004612635565b611221565b6040517f16e772bc00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc906103f290859060040161291b565b60206040518083038186803b15801561040a57600080fd5b505afa15801561041e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061044291906124e7565b92915050565b6000827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc826040518263ffffffff1660e01b81526004016104a4919061291b565b60206040518083038186803b1580156104bc57600080fd5b505afa1580156104d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f491906124e7565b6105195760405162461bcd60e51b815260040161051090612b10565b60405180910390fd5b6105428360018660405161052d9190612797565b9081526040519081900360200190209061130e565b91505b5092915050565b60008061055761132a565b9050600061057f600160405161056c906127b3565b908152602001604051809103902061133f565b905060006001604051610591906127b3565b90815260405190819003602001902090506000805b838110156107005760006105ba8483611343565b9050877f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9483896040518363ffffffff1660e01b8152600401610618929190612837565b60206040518083038186803b15801561063057600080fd5b505afa158015610644573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106689190612723565b101561067457506106f8565b8073ffffffffffffffffffffffffffffffffffffffff1663b02452256040518163ffffffff1660e01b815260040160206040518083038186803b1580156106ba57600080fd5b505afa1580156106ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f29190612723565b83019250505b6001016105a6565b5095945050505050565b6000610735826001856040516107209190612797565b9081526040519081900360200190209061137d565b6107515760405162461bcd60e51b815260040161051090612a7c565b7f0000000000000000000000000000000000000000000000000000000000000000836040516020016107839190612797565b604051602081830303815290604052805190602001201415610824578173ffffffffffffffffffffffffffffffffffffffff1663b02452256040518163ffffffff1660e01b815260040160206040518083038186803b1580156107e557600080fd5b505afa1580156107f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081d9190612723565b9050610442565b50600092915050565b600061083761132a565b905090565b6108446113ab565b81518151600182149114806108565750805b6108725760405162461bcd60e51b8152600401610510906129c2565b60008251116108935760405162461bcd60e51b81526004016105109061298b565b815160005b818110156108f8576108f0836108c1578582815181106108b457fe5b60200260200101516108d7565b856000815181106108ce57fe5b60200260200101515b8583815181106108e357fe5b60200260200101516113c4565b600101610898565b506109016114f1565b505061090b611502565b5050565b6000817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc826040518263ffffffff1660e01b815260040161096b919061291b565b60206040518083038186803b15801561098357600080fd5b505afa158015610997573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109bb91906124e7565b6109d75760405162461bcd60e51b815260040161051090612b10565b6109ea60018460405161056c9190612797565b9392505050565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc90610a6590849060040161291b565b60206040518083038186803b158015610a7d57600080fd5b505afa158015610a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab591906124e7565b610ad15760405162461bcd60e51b815260040161051090612b10565b6000600185604051610ae39190612797565b9081526020016040518091039020905060005b83811015610c50576000858583818110610b0c57fe5b9050602002016020810190610b219190612596565b90508073ffffffffffffffffffffffffffffffffffffffff16639c868ac06040518163ffffffff1660e01b815260040160206040518083038186803b158015610b6957600080fd5b505afa158015610b7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba191906124e7565b610bbd5760405162461bcd60e51b815260040161051090612b47565b610bc78382611509565b610be35760405162461bcd60e51b815260040161051090612a7c565b86604051610bf19190612797565b60405180910390208173ffffffffffffffffffffffffffffffffffffffff167fb87757e0365ca4f80cc1f429f422c0ea7ec26bbd3e5778727e77c809462aad0289604051610c3f919061291b565b60405180910390a350600101610af6565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b610c846113ab565b610c8e82826113c4565b610c966114f1565b61090b611502565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610cd3929190612767565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610d1e610cf0565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015610d6357600080fd5b505afa158015610d77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610837919061257a565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663afcb1a866040518163ffffffff1660e01b815260040160006040518083038186803b158015610e0357600080fd5b505afa158015610e17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261083791908101906123ad565b6000827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc826040518263ffffffff1660e01b8152600401610e9b919061291b565b60206040518083038186803b158015610eb357600080fd5b505afa158015610ec7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eeb91906124e7565b610f075760405162461bcd60e51b815260040161051090612b10565b610542836001866040516107209190612797565b610f236113ab565b6000610f2d61132a565b905060607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663afcb1a866040518163ffffffff1660e01b815260040160006040518083038186803b158015610f9757600080fd5b505afa158015610fab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fd391908101906123ad565b905060005b815181101561100757610fff828281518110610ff057fe5b602002602001015185856116b7565b600101610fd8565b5061101233476119b1565b505061101c611502565b50565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc9061109390849060040161291b565b60206040518083038186803b1580156110ab57600080fd5b505afa1580156110bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e391906124e7565b6110ff5760405162461bcd60e51b815260040161051090612b10565b611107611a38565b6111148484846001611a7e565b50505050565b6111226113ab565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152829073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc9061119690849060040161291b565b60206040518083038186803b1580156111ae57600080fd5b505afa1580156111c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e691906124e7565b6112025760405162461bcd60e51b815260040161051090612b10565b600061120c61132a565b90506112198484836116b7565b6109016114f1565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc9061129590849060040161291b565b60206040518083038186803b1580156112ad57600080fd5b505afa1580156112c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e591906124e7565b6113015760405162461bcd60e51b815260040161051090612b10565b6111148484846000611a7e565b81546000906113209083106064611e4a565b6109ea8383611343565b6000600162093a8042040362093a8002905090565b5490565b600082600001828154811061135457fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169392505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001919091016020526040902054151590565b6113bd60026000541415610190611e4a565b6002600055565b60006113d0838361070a565b6040805160048082526024820183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc2c4c5c10000000000000000000000000000000000000000000000000000000017905291517f4036176a00000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692634036176a92859261149b92889201612800565b6000604051808303818588803b1580156114b457600080fd5b505af11580156114c8573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526111149190810190612547565b47801561101c5761101c33826119b1565b6001600055565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205480156116ad5783547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808301910180821461161257600086600001828154811061157757fe5b600091825260209091200154875473ffffffffffffffffffffffffffffffffffffffff909116915081908890859081106115ad57fe5b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff94851617905592909116815260018881019092526040902090830190555b855486908061161d57fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff8716825260018881019091526040822091909155935061044292505050565b6000915050610442565b60006001846040516116c99190612797565b9081526020016040518091039020905060006116e48261133f565b9050806116f25750506119ac565b6122a07f0000000000000000000000000000000000000000000000000000000000000000866040516020016117279190612797565b604051602081830303815290604052805190602001201461174a57611e5861174e565b611f745b905060005b828110156119a75760006117678583611343565b9050857f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a4d7a250836040518263ffffffff1660e01b81526004016117c391906127df565b60206040518083038186803b1580156117db57600080fd5b505afa1580156117ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118139190612723565b10156118be576040517f615e523700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063615e52379061188b9084906004016127df565b600060405180830381600087803b1580156118a557600080fd5b505af11580156118b9573d6000803e3d6000fd5b505050505b6040517fd3078c94000000000000000000000000000000000000000000000000000000008152879073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d3078c94906119349085908b90600401612837565b60206040518083038186803b15801561194c57600080fd5b505afa158015611960573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119849190612723565b1015611990575061199f565b61199d818463ffffffff16565b505b600101611753565b505050505b505050565b6119c0814710156101a3611e4a565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516119e6906127dc565b60006040518083038185875af1925050503d8060008114611a23576040519150601f19603f3d011682016040523d82523d6000602084013e611a28565b606091505b505090506119ac816101a4611e4a565b6000611a676000357fffffffff0000000000000000000000000000000000000000000000000000000016610c9e565b905061101c611a768233612115565b610191611e4a565b6000600185604051611a909190612797565b9081526020016040518091039020905060005b83811015610c50576000858583818110611ab957fe5b9050602002016020810190611ace9190612596565b6040517f61df1bf900000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906361df1bf990611b439084906004016127df565b60206040518083038186803b158015611b5b57600080fd5b505afa158015611b6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9391906124e7565b611baf5760405162461bcd60e51b81526004016105109061292e565b8073ffffffffffffffffffffffffffffffffffffffff16639c868ac06040518163ffffffff1660e01b815260040160206040518083038186803b158015611bf557600080fd5b505afa158015611c09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2d91906124e7565b15611c4a5760405162461bcd60e51b815260040161051090612ad9565b611c5483826121ab565b611c705760405162461bcd60e51b815260040161051090612b7e565b8380611dc157506040517f572cb6a500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063572cb6a590611ce9908a9060040161291b565b60206040518083038186803b158015611d0157600080fd5b505afa158015611d15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d39919061257a565b73ffffffffffffffffffffffffffffffffffffffff1663ce3cc8bd826040518263ffffffff1660e01b8152600401611d7191906127df565b60206040518083038186803b158015611d8957600080fd5b505afa158015611d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc191906124e7565b611ddd5760405162461bcd60e51b815260040161051090612a1f565b86604051611deb9190612797565b60405180910390208173ffffffffffffffffffffffffffffffffffffffff167fbd3a33b3738a69bcfb84219d93fb0b1b2d91efbf2e5bef206c9af4122290fb5489604051611e39919061291b565b60405180910390a350600101611aa3565b8161090b5761090b8161222b565b6040805160048082526024820183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc2c4c5c10000000000000000000000000000000000000000000000000000000017905291517f4036176a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692634036176a92611f1e92869201612800565b600060405180830381600087803b158015611f3857600080fd5b505af1158015611f4c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261090b9190810190612547565b60008173ffffffffffffffffffffffffffffffffffffffff1663b02452256040518163ffffffff1660e01b815260040160206040518083038186803b158015611fbc57600080fd5b505afa158015611fd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff49190612723565b6040805160048082526024820183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc2c4c5c10000000000000000000000000000000000000000000000000000000017905291517f4036176a00000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692634036176a9285926120bf92889201612800565b6000604051808303818588803b1580156120d857600080fd5b505af11580156120ec573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526119ac9190810190612547565b600061211f610d14565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040161215b939291906128ef565b60206040518083038186803b15801561217357600080fd5b505afa158015612187573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ea91906124e7565b60006121b7838361137d565b61082457508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915585549082528286019093526040902091909155610442565b62461bcd60e51b600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b60445261101c917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5bfe5b600082601f8301126122b2578081fd5b81356122c56122c082612c02565b612bdb565b8181529150602080830190848101818402860182018710156122e657600080fd5b60005b8481101561230e5781356122fc81612c72565b845292820192908201906001016122e9565b505050505092915050565b600082601f830112612329578081fd5b81516123376122c082612c22565b915080825283602082850101111561234e57600080fd5b610545816020840160208601612c46565b600082601f83011261236f578081fd5b813561237d6122c082612c22565b915080825283602082850101111561239457600080fd5b8060208401602084013760009082016020015292915050565b600060208083850312156123bf578182fd5b825167ffffffffffffffff8111156123d5578283fd5b8301601f810185136123e5578283fd5b80516123f36122c082612c02565b81815283810190838501865b84811015612428576124168a888451890101612319565b845292860192908601906001016123ff565b509098975050505050505050565b60008060408385031215612448578081fd5b823567ffffffffffffffff8082111561245f578283fd5b818501915085601f830112612472578283fd5b81356124806122c082612c02565b81815260208082019190858101875b858110156124b8576124a68c8484358b010161235f565b8552938201939082019060010161248f565b509197508801359450505050808211156124d0578283fd5b506124dd858286016122a2565b9150509250929050565b6000602082840312156124f8578081fd5b815180151581146109ea578182fd5b600060208284031215612518578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146109ea578182fd5b600060208284031215612558578081fd5b815167ffffffffffffffff81111561256e578182fd5b61054284828501612319565b60006020828403121561258b578081fd5b81516109ea81612c72565b6000602082840312156125a7578081fd5b81356109ea81612c72565b6000602082840312156125c3578081fd5b813567ffffffffffffffff8111156125d9578182fd5b6105428482850161235f565b600080604083850312156125f7578182fd5b823567ffffffffffffffff81111561260d578283fd5b6126198582860161235f565b925050602083013561262a81612c72565b809150509250929050565b600080600060408486031215612649578081fd5b833567ffffffffffffffff80821115612660578283fd5b61266c8783880161235f565b94506020860135915080821115612681578283fd5b818601915086601f830112612694578283fd5b8135818111156126a2578384fd5b87602080830285010111156126b5578384fd5b6020830194508093505050509250925092565b600080604083850312156126da578182fd5b823567ffffffffffffffff8111156126f0578283fd5b6126fc8582860161235f565b95602094909401359450505050565b60006020828403121561271c578081fd5b5035919050565b600060208284031215612734578081fd5b5051919050565b60008151808452612753816020860160208601612c46565b601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b600082516127a9818460208701612c46565b9190910192915050565b7f417262697472756d000000000000000000000000000000000000000000000000815260080190565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff841682526040602083015261282f604083018461273b565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156128ce577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526128bc85835161273b565b94509285019290850190600101612882565b5092979650505050505050565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b6000602082526109ea602083018461273b565b6020808252602a908201527f476175676520776173206e6f7420616464656420746f2074686520476175676560408201527f436f6e74726f6c6c657200000000000000000000000000000000000000000000606082015260800190565b60208082526017908201527f4e6f2067617567657320746f20636865636b706f696e74000000000000000000604082015260600190565b6020808252602a908201527f4d69736d61746368206265747765656e20676175676520747970657320616e6460408201527f2061646472657373657300000000000000000000000000000000000000000000606082015260800190565b6020808252602e908201527f476175676520646f6573206e6f7420636f72726573706f6e6420746f2074686560408201527f2073656c65637465642074797065000000000000000000000000000000000000606082015260800190565b60208082526027908201527f476175676520776173206e6f7420616464656420746f2074686520636865636b60408201527f706f696e74657200000000000000000000000000000000000000000000000000606082015260800190565b60208082526010908201527f476175676520776173206b696c6c656400000000000000000000000000000000604082015260600190565b60208082526012908201527f496e76616c696420676175676520747970650000000000000000000000000000604082015260600190565b60208082526014908201527f476175676520776173206e6f74206b696c6c6564000000000000000000000000604082015260600190565b60208082526027908201527f476175676520616c726561647920616464656420746f2074686520636865636b60408201527f706f696e74657200000000000000000000000000000000000000000000000000606082015260800190565b60405181810167ffffffffffffffff81118282101715612bfa57600080fd5b604052919050565b600067ffffffffffffffff821115612c18578081fd5b5060209081020190565b600067ffffffffffffffff821115612c38578081fd5b50601f01601f191660200190565b60005b83811015612c61578181015183820152602001612c49565b838111156111145750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461101c57600080fdfea2646970667358221220bd2232a8b4de30a99a8853ff26db7df658ee0bb4445ba862f5ca4bb0f779e92464736f6c63430007010033", + "deployedBytecode": "0x6080604052600436106101445760003560e01c80637d0a6616116100c0578063c91be04311610074578063d8dba2ce11610059578063d8dba2ce1461032a578063db5d12251461034a578063f7178b881461035d57610144565b8063c91be043146102f7578063d14cfe3b1461031757610144565b80638d928af8116100a55780638d928af8146102ab578063aaabadc5146102c0578063afcb1a86146102d557610144565b80637d0a661614610278578063851c1bb31461028b57610144565b806346583adf116101175780634db34d2a116100fc5780634db34d2a1461022357806373ebd060146102435780637c1fef511461026357610144565b806346583adf146101f95780634a3a1e111461020e57610144565b806316e772bc1461014957806327cb2a3b1461017f57806327f79107146101ac5780632adbe5ac146101d9575b600080fd5b34801561015557600080fd5b506101696101643660046125b2565b61037d565b60405161017691906128db565b60405180910390f35b34801561018b57600080fd5b5061019f61019a3660046126c8565b610448565b60405161017691906127df565b3480156101b857600080fd5b506101cc6101c736600461270b565b61054c565b60405161017691906128e6565b3480156101e557600080fd5b506101cc6101f43660046125e5565b61070a565b34801561020557600080fd5b506101cc61082d565b61022161021c366004612436565b61083c565b005b34801561022f57600080fd5b506101cc61023e3660046125b2565b61090f565b34801561024f57600080fd5b5061022161025e366004612635565b6109f1565b34801561026f57600080fd5b5061019f610c58565b6102216102863660046125e5565b610c7c565b34801561029757600080fd5b506101cc6102a6366004612507565b610c9e565b3480156102b757600080fd5b5061019f610cf0565b3480156102cc57600080fd5b5061019f610d14565b3480156102e157600080fd5b506102ea610d9b565b604051610176919061285d565b34801561030357600080fd5b506101696103123660046125e5565b610e3f565b61022161032536600461270b565b610f1b565b34801561033657600080fd5b50610221610345366004612635565b61101f565b6102216103583660046126c8565b61111a565b34801561036957600080fd5b50610221610378366004612635565b611221565b6040517f16e772bc00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc906103f290859060040161291b565b60206040518083038186803b15801561040a57600080fd5b505afa15801561041e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061044291906124e7565b92915050565b6000827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc826040518263ffffffff1660e01b81526004016104a4919061291b565b60206040518083038186803b1580156104bc57600080fd5b505afa1580156104d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f491906124e7565b6105195760405162461bcd60e51b815260040161051090612b10565b60405180910390fd5b6105428360018660405161052d9190612797565b9081526040519081900360200190209061130e565b91505b5092915050565b60008061055761132a565b9050600061057f600160405161056c906127b3565b908152602001604051809103902061133f565b905060006001604051610591906127b3565b90815260405190819003602001902090506000805b838110156107005760006105ba8483611343565b9050877f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3078c9483896040518363ffffffff1660e01b8152600401610618929190612837565b60206040518083038186803b15801561063057600080fd5b505afa158015610644573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106689190612723565b101561067457506106f8565b8073ffffffffffffffffffffffffffffffffffffffff1663b02452256040518163ffffffff1660e01b815260040160206040518083038186803b1580156106ba57600080fd5b505afa1580156106ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f29190612723565b83019250505b6001016105a6565b5095945050505050565b6000610735826001856040516107209190612797565b9081526040519081900360200190209061137d565b6107515760405162461bcd60e51b815260040161051090612a7c565b7f0000000000000000000000000000000000000000000000000000000000000000836040516020016107839190612797565b604051602081830303815290604052805190602001201415610824578173ffffffffffffffffffffffffffffffffffffffff1663b02452256040518163ffffffff1660e01b815260040160206040518083038186803b1580156107e557600080fd5b505afa1580156107f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081d9190612723565b9050610442565b50600092915050565b600061083761132a565b905090565b6108446113ab565b81518151600182149114806108565750805b6108725760405162461bcd60e51b8152600401610510906129c2565b60008251116108935760405162461bcd60e51b81526004016105109061298b565b815160005b818110156108f8576108f0836108c1578582815181106108b457fe5b60200260200101516108d7565b856000815181106108ce57fe5b60200260200101515b8583815181106108e357fe5b60200260200101516113c4565b600101610898565b506109016114f1565b505061090b611502565b5050565b6000817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc826040518263ffffffff1660e01b815260040161096b919061291b565b60206040518083038186803b15801561098357600080fd5b505afa158015610997573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109bb91906124e7565b6109d75760405162461bcd60e51b815260040161051090612b10565b6109ea60018460405161056c9190612797565b9392505050565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc90610a6590849060040161291b565b60206040518083038186803b158015610a7d57600080fd5b505afa158015610a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab591906124e7565b610ad15760405162461bcd60e51b815260040161051090612b10565b6000600185604051610ae39190612797565b9081526020016040518091039020905060005b83811015610c50576000858583818110610b0c57fe5b9050602002016020810190610b219190612596565b90508073ffffffffffffffffffffffffffffffffffffffff16639c868ac06040518163ffffffff1660e01b815260040160206040518083038186803b158015610b6957600080fd5b505afa158015610b7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba191906124e7565b610bbd5760405162461bcd60e51b815260040161051090612b47565b610bc78382611509565b610be35760405162461bcd60e51b815260040161051090612a7c565b86604051610bf19190612797565b60405180910390208173ffffffffffffffffffffffffffffffffffffffff167fb87757e0365ca4f80cc1f429f422c0ea7ec26bbd3e5778727e77c809462aad0289604051610c3f919061291b565b60405180910390a350600101610af6565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b610c846113ab565b610c8e82826113c4565b610c966114f1565b61090b611502565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001610cd3929190612767565b604051602081830303815290604052805190602001209050919050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610d1e610cf0565b73ffffffffffffffffffffffffffffffffffffffff1663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015610d6357600080fd5b505afa158015610d77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610837919061257a565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663afcb1a866040518163ffffffff1660e01b815260040160006040518083038186803b158015610e0357600080fd5b505afa158015610e17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261083791908101906123ad565b6000827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166316e772bc826040518263ffffffff1660e01b8152600401610e9b919061291b565b60206040518083038186803b158015610eb357600080fd5b505afa158015610ec7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eeb91906124e7565b610f075760405162461bcd60e51b815260040161051090612b10565b610542836001866040516107209190612797565b610f236113ab565b6000610f2d61132a565b905060607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663afcb1a866040518163ffffffff1660e01b815260040160006040518083038186803b158015610f9757600080fd5b505afa158015610fab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fd391908101906123ad565b905060005b815181101561100757610fff828281518110610ff057fe5b602002602001015185856116b7565b600101610fd8565b5061101233476119b1565b505061101c611502565b50565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc9061109390849060040161291b565b60206040518083038186803b1580156110ab57600080fd5b505afa1580156110bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e391906124e7565b6110ff5760405162461bcd60e51b815260040161051090612b10565b611107611a38565b6111148484846001611a7e565b50505050565b6111226113ab565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152829073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc9061119690849060040161291b565b60206040518083038186803b1580156111ae57600080fd5b505afa1580156111c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e691906124e7565b6112025760405162461bcd60e51b815260040161051090612b10565b600061120c61132a565b90506112198484836116b7565b6109016114f1565b6040517f16e772bc000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906316e772bc9061129590849060040161291b565b60206040518083038186803b1580156112ad57600080fd5b505afa1580156112c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e591906124e7565b6113015760405162461bcd60e51b815260040161051090612b10565b6111148484846000611a7e565b81546000906113209083106064611e4a565b6109ea8383611343565b6000600162093a8042040362093a8002905090565b5490565b600082600001828154811061135457fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169392505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001919091016020526040902054151590565b6113bd60026000541415610190611e4a565b6002600055565b60006113d0838361070a565b6040805160048082526024820183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc2c4c5c10000000000000000000000000000000000000000000000000000000017905291517f4036176a00000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692634036176a92859261149b92889201612800565b6000604051808303818588803b1580156114b457600080fd5b505af11580156114c8573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526111149190810190612547565b47801561101c5761101c33826119b1565b6001600055565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205480156116ad5783547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808301910180821461161257600086600001828154811061157757fe5b600091825260209091200154875473ffffffffffffffffffffffffffffffffffffffff909116915081908890859081106115ad57fe5b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff94851617905592909116815260018881019092526040902090830190555b855486908061161d57fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff8716825260018881019091526040822091909155935061044292505050565b6000915050610442565b60006001846040516116c99190612797565b9081526020016040518091039020905060006116e48261133f565b9050806116f25750506119ac565b6122a07f0000000000000000000000000000000000000000000000000000000000000000866040516020016117279190612797565b604051602081830303815290604052805190602001201461174a57611e5861174e565b611f745b905060005b828110156119a75760006117678583611343565b9050857f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a4d7a250836040518263ffffffff1660e01b81526004016117c391906127df565b60206040518083038186803b1580156117db57600080fd5b505afa1580156117ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118139190612723565b10156118be576040517f615e523700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063615e52379061188b9084906004016127df565b600060405180830381600087803b1580156118a557600080fd5b505af11580156118b9573d6000803e3d6000fd5b505050505b6040517fd3078c94000000000000000000000000000000000000000000000000000000008152879073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d3078c94906119349085908b90600401612837565b60206040518083038186803b15801561194c57600080fd5b505afa158015611960573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119849190612723565b1015611990575061199f565b61199d818463ffffffff16565b505b600101611753565b505050505b505050565b6119c0814710156101a3611e4a565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516119e6906127dc565b60006040518083038185875af1925050503d8060008114611a23576040519150601f19603f3d011682016040523d82523d6000602084013e611a28565b606091505b505090506119ac816101a4611e4a565b6000611a676000357fffffffff0000000000000000000000000000000000000000000000000000000016610c9e565b905061101c611a768233612115565b610191611e4a565b6000600185604051611a909190612797565b9081526020016040518091039020905060005b83811015610c50576000858583818110611ab957fe5b9050602002016020810190611ace9190612596565b6040517f61df1bf900000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906361df1bf990611b439084906004016127df565b60206040518083038186803b158015611b5b57600080fd5b505afa158015611b6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9391906124e7565b611baf5760405162461bcd60e51b81526004016105109061292e565b8073ffffffffffffffffffffffffffffffffffffffff16639c868ac06040518163ffffffff1660e01b815260040160206040518083038186803b158015611bf557600080fd5b505afa158015611c09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2d91906124e7565b15611c4a5760405162461bcd60e51b815260040161051090612ad9565b611c5483826121ab565b611c705760405162461bcd60e51b815260040161051090612b7e565b8380611dc157506040517f572cb6a500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063572cb6a590611ce9908a9060040161291b565b60206040518083038186803b158015611d0157600080fd5b505afa158015611d15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d39919061257a565b73ffffffffffffffffffffffffffffffffffffffff1663ce3cc8bd826040518263ffffffff1660e01b8152600401611d7191906127df565b60206040518083038186803b158015611d8957600080fd5b505afa158015611d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc191906124e7565b611ddd5760405162461bcd60e51b815260040161051090612a1f565b86604051611deb9190612797565b60405180910390208173ffffffffffffffffffffffffffffffffffffffff167fbd3a33b3738a69bcfb84219d93fb0b1b2d91efbf2e5bef206c9af4122290fb5489604051611e39919061291b565b60405180910390a350600101611aa3565b8161090b5761090b8161222b565b6040805160048082526024820183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc2c4c5c10000000000000000000000000000000000000000000000000000000017905291517f4036176a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692634036176a92611f1e92869201612800565b600060405180830381600087803b158015611f3857600080fd5b505af1158015611f4c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261090b9190810190612547565b60008173ffffffffffffffffffffffffffffffffffffffff1663b02452256040518163ffffffff1660e01b815260040160206040518083038186803b158015611fbc57600080fd5b505afa158015611fd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff49190612723565b6040805160048082526024820183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc2c4c5c10000000000000000000000000000000000000000000000000000000017905291517f4036176a00000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692634036176a9285926120bf92889201612800565b6000604051808303818588803b1580156120d857600080fd5b505af11580156120ec573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526119ac9190810190612547565b600061211f610d14565b73ffffffffffffffffffffffffffffffffffffffff16639be2a8848484306040518463ffffffff1660e01b815260040161215b939291906128ef565b60206040518083038186803b15801561217357600080fd5b505afa158015612187573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ea91906124e7565b60006121b7838361137d565b61082457508154600180820184556000848152602080822090930180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915585549082528286019093526040902091909155610442565b62461bcd60e51b600090815260206004526007602452600a808304818106603090810160081b83860601918390049283060160101b016642414c230000300160c81b60445261101c917f42414c0000000000000000000000000000000000000000000000000000000000906242414c90606490fd5bfe5b600082601f8301126122b2578081fd5b81356122c56122c082612c02565b612bdb565b8181529150602080830190848101818402860182018710156122e657600080fd5b60005b8481101561230e5781356122fc81612c72565b845292820192908201906001016122e9565b505050505092915050565b600082601f830112612329578081fd5b81516123376122c082612c22565b915080825283602082850101111561234e57600080fd5b610545816020840160208601612c46565b600082601f83011261236f578081fd5b813561237d6122c082612c22565b915080825283602082850101111561239457600080fd5b8060208401602084013760009082016020015292915050565b600060208083850312156123bf578182fd5b825167ffffffffffffffff8111156123d5578283fd5b8301601f810185136123e5578283fd5b80516123f36122c082612c02565b81815283810190838501865b84811015612428576124168a888451890101612319565b845292860192908601906001016123ff565b509098975050505050505050565b60008060408385031215612448578081fd5b823567ffffffffffffffff8082111561245f578283fd5b818501915085601f830112612472578283fd5b81356124806122c082612c02565b81815260208082019190858101875b858110156124b8576124a68c8484358b010161235f565b8552938201939082019060010161248f565b509197508801359450505050808211156124d0578283fd5b506124dd858286016122a2565b9150509250929050565b6000602082840312156124f8578081fd5b815180151581146109ea578182fd5b600060208284031215612518578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146109ea578182fd5b600060208284031215612558578081fd5b815167ffffffffffffffff81111561256e578182fd5b61054284828501612319565b60006020828403121561258b578081fd5b81516109ea81612c72565b6000602082840312156125a7578081fd5b81356109ea81612c72565b6000602082840312156125c3578081fd5b813567ffffffffffffffff8111156125d9578182fd5b6105428482850161235f565b600080604083850312156125f7578182fd5b823567ffffffffffffffff81111561260d578283fd5b6126198582860161235f565b925050602083013561262a81612c72565b809150509250929050565b600080600060408486031215612649578081fd5b833567ffffffffffffffff80821115612660578283fd5b61266c8783880161235f565b94506020860135915080821115612681578283fd5b818601915086601f830112612694578283fd5b8135818111156126a2578384fd5b87602080830285010111156126b5578384fd5b6020830194508093505050509250925092565b600080604083850312156126da578182fd5b823567ffffffffffffffff8111156126f0578283fd5b6126fc8582860161235f565b95602094909401359450505050565b60006020828403121561271c578081fd5b5035919050565b600060208284031215612734578081fd5b5051919050565b60008151808452612753816020860160208601612c46565b601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b600082516127a9818460208701612c46565b9190910192915050565b7f417262697472756d000000000000000000000000000000000000000000000000815260080190565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff841682526040602083015261282f604083018461273b565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156128ce577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526128bc85835161273b565b94509285019290850190600101612882565b5092979650505050505050565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b6000602082526109ea602083018461273b565b6020808252602a908201527f476175676520776173206e6f7420616464656420746f2074686520476175676560408201527f436f6e74726f6c6c657200000000000000000000000000000000000000000000606082015260800190565b60208082526017908201527f4e6f2067617567657320746f20636865636b706f696e74000000000000000000604082015260600190565b6020808252602a908201527f4d69736d61746368206265747765656e20676175676520747970657320616e6460408201527f2061646472657373657300000000000000000000000000000000000000000000606082015260800190565b6020808252602e908201527f476175676520646f6573206e6f7420636f72726573706f6e6420746f2074686560408201527f2073656c65637465642074797065000000000000000000000000000000000000606082015260800190565b60208082526027908201527f476175676520776173206e6f7420616464656420746f2074686520636865636b60408201527f706f696e74657200000000000000000000000000000000000000000000000000606082015260800190565b60208082526010908201527f476175676520776173206b696c6c656400000000000000000000000000000000604082015260600190565b60208082526012908201527f496e76616c696420676175676520747970650000000000000000000000000000604082015260600190565b60208082526014908201527f476175676520776173206e6f74206b696c6c6564000000000000000000000000604082015260600190565b60208082526027908201527f476175676520616c726561647920616464656420746f2074686520636865636b60408201527f706f696e74657200000000000000000000000000000000000000000000000000606082015260800190565b60405181810167ffffffffffffffff81118282101715612bfa57600080fd5b604052919050565b600067ffffffffffffffff821115612c18578081fd5b5060209081020190565b600067ffffffffffffffff821115612c38578081fd5b50601f01601f191660200190565b60005b83811015612c61578181015183820152602001612c49565b838111156111145750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461101c57600080fdfea2646970667358221220bd2232a8b4de30a99a8853ff26db7df658ee0bb4445ba862f5ca4bb0f779e92464736f6c63430007010033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/index.ts b/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/index.ts new file mode 100644 index 0000000..a883486 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/index.ts @@ -0,0 +1,9 @@ +import { Task, TaskRunOptions } from '@src'; +import { StakelessGaugeCheckpointerDeployment } from './input'; + +export default async (task: Task, { force, from }: TaskRunOptions = {}): Promise => { + const input = task.input() as StakelessGaugeCheckpointerDeployment; + + const args = [input.GaugeAdder, input.AuthorizerAdaptorEntrypoint]; + await task.deployAndVerify('StakelessGaugeCheckpointer', args, from, force); +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/input.ts b/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/input.ts new file mode 100644 index 0000000..92cdf32 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/input.ts @@ -0,0 +1,14 @@ +import { Task, TaskMode } from '@src'; + +export type StakelessGaugeCheckpointerDeployment = { + GaugeAdder: string; + AuthorizerAdaptorEntrypoint: string; +}; + +const GaugeAdder = new Task('20230519-gauge-adder-v4', TaskMode.READ_ONLY); +const AuthorizerAdaptorEntrypoint = new Task('20221124-authorizer-adaptor-entrypoint', TaskMode.READ_ONLY); + +export default { + GaugeAdder, + AuthorizerAdaptorEntrypoint, +}; diff --git a/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/output/mainnet.json b/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/output/mainnet.json new file mode 100644 index 0000000..15f93a7 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/output/mainnet.json @@ -0,0 +1,3 @@ +{ + "StakelessGaugeCheckpointer": "0x0f08eEf2C785AA5e7539684aF04755dEC1347b7c" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/output/sepolia.json b/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/output/sepolia.json new file mode 100644 index 0000000..dc44244 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/output/sepolia.json @@ -0,0 +1,3 @@ +{ + "StakelessGaugeCheckpointer": "0x96484f2aBF5e58b15176dbF1A799627B53F13B6d" +} \ No newline at end of file diff --git a/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/readme.md b/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/readme.md new file mode 100644 index 0000000..9b69bd9 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/readme.md @@ -0,0 +1,14 @@ +# 2023-07-31 - Stakeless Gauge Checkpointer + +> ⚠️ **DEPRECATED: do not use** ⚠️ +> +> This version has been replaced for an updated version: [StakelessGaugeCheckpointer V2](../../20230915-stakeless-gauge-checkpointer-v2/). The new version is more flexible, supporting paid gauges from any type (i.e. not just only Arbitrum). + +Deployment of the `StakelessGaugeCheckpointer` contract. It automates the process of performing checkpoints to stakeless root gauges. +Replaces the [`L2GaugeCheckpointer`](../20230527-l2-gauge-checkpointer/); its former name was changed to avoid confusion between root and child chain gauges, as the checkpointer is intended to work only with root gauges in mainnet. + +## Useful Files + +- [Ethereum mainnet addresses](./output/mainnet.json) +- [Sepolia testnet addresses](./output/sepolia.json) +- [`StakelessGaugeCheckpointer` artifact](./artifact/StakelessGaugeCheckpointer.json) diff --git a/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/test/task-base.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/test/task-base.fork.ts new file mode 100644 index 0000000..ee42b47 --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/test/task-base.fork.ts @@ -0,0 +1,465 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { Contract, ContractReceipt } from 'ethers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; + +import { BigNumber, fp } from '@helpers/numbers'; +import * as expectEvent from '@helpers/expectEvent'; + +import { describeForkTest } from '@src'; +import { Task, TaskMode } from '@src'; +import { getForkedNetwork } from '@src'; +import { impersonate } from '@src'; +import { actionId } from '@helpers/models/misc/actions'; + +// This block number is before the manual weekly checkpoint. This ensures gauges will actually be checkpointed. +// This test verifies the checkpointer against the manual transactions for the given period. +// This test is exactly the same as the one in 20230527-l2-gauge-checkpointer but using the new artifacts. +// It validates that the new version of the checkpointer can still do the same as the previous one in the base case. +describeForkTest('StakelessGaugeCheckpointer - Base', 'mainnet', 17332499, function () { + /* eslint-disable @typescript-eslint/no-non-null-assertion */ + + enum GaugeType { + Ethereum, + Polygon, + Arbitrum, + Optimism, + Gnosis, + Avalanche, + PolygonZkEvm, + ZkSync, + } + + let adderCoordinator: Contract; + let stakelessGaugeCheckpointer: Contract; + let authorizer: Contract, adaptorEntrypoint: Contract; + + let task: Task; + let daoMultisig: SignerWithAddress, admin: SignerWithAddress; + + const DAO_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + const CHECKPOINT_MULTISIG = '0x02f35dA6A02017154367Bc4d47bb6c7D06C7533B'; + + // Event we are looking for is: + // Checkpoint(uint256,uint256) + // Topic: 0x21d81d5d656869e8ce3ba8d65526a2f0dbbcd3d36f5f9999eb7c84360e45eced + // See tx: 0x617b441cac07386a37513dfdf351821793d795b3beb1aab1d71dad1bc69a7c86 + + // Search for the topic in the given TX. + // The total expected checkpoints is the amount of checkpoints in the TX + 1 (see Arbitrum gauges below). + const TOTAL_EXPECTED_CHECKPOINTS = 79; + + // Gauges that are NOT killed for the given test block number. + const polygonRootGauges: [address: string, expectedCheckpoints: number][] = [ + ['0x082aacfaf4db8ac0642cbed50df732d3c309e679', 6], + ['0xdd3b4161d2a4c609884e20ed71b4e85be44572e6', 6], + ['0x16289f675ca54312a8fcf99341e7439982888077', 6], + ['0x455f20c54b5712a84454468c7831f7c431aeeb1c', 6], + ['0x39ceebb561a65216a4b776ea752d3137e9d6c0f0', 6], + ['0x1604b7e80975555e0aceaca9c81807fbb4d65cf1', 6], + ['0xc534c30749b6c198d35a7836e26076e7745d8936', 6], + ['0x539d6edbd16f2f069a06716416c3a6e98cc29dd0', 5], + ['0x31f99c542cbe456fcbbe99d4bf849af4d7fb5405', 6], + ['0x47d7269829ba9571d98eb6ddc34e9c8f1a4c327f', 6], + ['0x416d15c36c6daad2b9410b79ae557e6f07dcb642', 1], + ['0xd103dd49b8051a09b399a52e9a8ab629392de2fb', 1], + ]; + + // There were no Arbitrum checkpoints in this TX, but this gauge was not killed the previous week unlike the rest + // of the Arbitrum gauges, so it can be checkpointed. + // It is important to have at least one Arbitrum gauge for the test, because it is the only type that has + // an associated ETH fee. + const arbitrumRootGauges: [address: string, expectedCheckpoints: number][] = [ + ['0x8204b749b808818deb7957dbd030ceea44d1fe18', 1], + ]; + + const optimismRootGauges: [address: string, expectedCheckpoints: number][] = [ + ['0xdacd99029b4b94cd04fe364aac370829621c1c64', 6], + ]; + + const gnosisRootGauges: [address: string, expectedCheckpoints: number][] = [ + ['0xe41736b4e78be41bd03ebaf8f86ea493c6e9ea96', 1], + ['0x21b2ef3dc22b7bd4634205081c667e39742075e2', 1], + ['0x3b6a85b5e1e6205ebf4d4eabf147d10e8e4bf0a5', 1], + ['0xcb2c2af6c3e88b4a89aa2aae1d7c8120eee9ad0e', 6], + ]; + + const singleRecipientGauges: [address: string, expectedCheckpoints: number][] = [ + ['0x56124eb16441A1eF12A4CCAeAbDD3421281b795A', 1], + ['0xE867AD0a48e8f815DC0cda2CDb275e0F163A480b', 1], + ]; + + const checkpointInterface = new ethers.utils.Interface([ + 'function checkpoint()', + 'event Checkpoint(uint256 indexed periodTime, uint256 periodEmissions)', + ]); + + type GaugeData = { + address: string; + weight: BigNumber; + expectedCheckpoints: number; + }; + + const gauges = new Map(); + + before('run task', async () => { + task = new Task('20230731-stakeless-gauge-checkpointer', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + stakelessGaugeCheckpointer = await task.deployedInstance('StakelessGaugeCheckpointer'); + }); + + before('setup governance', async () => { + daoMultisig = await impersonate(DAO_MULTISIG, fp(100)); + admin = await impersonate(CHECKPOINT_MULTISIG, fp(100)); + }); + + before('setup contracts', async () => { + const authorizerTask = new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizer = await authorizerTask.deployedInstance('Authorizer'); + + const adaptorEntrypointTask = new Task( + '20221124-authorizer-adaptor-entrypoint', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ); + adaptorEntrypoint = await adaptorEntrypointTask.deployedInstance('AuthorizerAdaptorEntrypoint'); + }); + + // At this block, the adder coordinator has been deployed but not executed. + // Then, we can fetch the deployed contract and execute it here to setup the correct types in the adder, which are + // necessary for the checkpointer to work correctly. + before('run adder migrator coordinator', async () => { + const adderCoordinatorTask = new Task( + '20230519-gauge-adder-migration-v3-to-v4', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ); + adderCoordinator = await adderCoordinatorTask.deployedInstance('GaugeAdderMigrationCoordinator'); + + await authorizer.connect(daoMultisig).grantRole(await authorizer.DEFAULT_ADMIN_ROLE(), adderCoordinator.address); + await adderCoordinator.performNextStage(); + }); + + before('get gauge relative weights and associate them with their respective address', async () => { + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + const gaugeController = await gaugeControllerTask.deployedInstance('GaugeController'); + + const getGaugesData = async (gaugeInputs: [string, number][]) => { + return Promise.all( + gaugeInputs.map(async (gaugeInput) => { + return { + address: gaugeInput[0], + weight: await gaugeController['gauge_relative_weight(address)'](gaugeInput[0]), + expectedCheckpoints: gaugeInput[1], + }; + }) + ); + }; + const singleRecipientGaugesData: GaugeData[] = await getGaugesData(singleRecipientGauges); + const polygonRootGaugesData: GaugeData[] = await getGaugesData(polygonRootGauges); + const arbitrumRootGaugesData: GaugeData[] = await getGaugesData(arbitrumRootGauges); + const optimismRootGaugesData: GaugeData[] = await getGaugesData(optimismRootGauges); + const gnosisRootGaugesData: GaugeData[] = await getGaugesData(gnosisRootGauges); + + gauges.set(GaugeType.Ethereum, singleRecipientGaugesData); + gauges.set(GaugeType.Polygon, polygonRootGaugesData); + gauges.set(GaugeType.Arbitrum, arbitrumRootGaugesData); + gauges.set(GaugeType.Optimism, optimismRootGaugesData); + gauges.set(GaugeType.Gnosis, gnosisRootGaugesData); + }); + + before('check total expected checkpoints', () => { + let sum = 0; + for (const [, gaugeData] of gauges.entries()) { + if (gaugeData.length > 0) { + sum += gaugeData.map((gaugeData) => gaugeData.expectedCheckpoints).reduce((a, b) => a + b); + } + } + expect(sum).to.be.eq(TOTAL_EXPECTED_CHECKPOINTS); + }); + + before('add gauges to checkpointer', async () => { + // Some gauges were created from previous factories, so they need to be added by governance. + // For simplicity, we just add all of them with the same method. + // The non-permissioned 'addGauges' function is already tested in the unit test. + await authorizer + .connect(daoMultisig) + .grantRole(await actionId(stakelessGaugeCheckpointer, 'addGaugesWithVerifiedType'), admin.address); + + await Promise.all( + Array.from(gauges).map(([gaugeType, gaugesData]) => { + stakelessGaugeCheckpointer.connect(admin).addGaugesWithVerifiedType( + GaugeType[gaugeType], + gaugesData.map((gaugeData) => gaugeData.address) + ); + }) + ); + }); + + before('grant checkpoint permission to gauge checkpointer', async () => { + // Any gauge works; we just need the interface. + const gauge = await task.instanceAt('IStakelessGauge', gauges.get(GaugeType.Polygon)![0].address); + + await authorizer + .connect(daoMultisig) + .grantRole( + await adaptorEntrypoint.getActionId(gauge.interface.getSighash('checkpoint')), + stakelessGaugeCheckpointer.address + ); + }); + + it('checks that gauges were added correctly', async () => { + for (const [gaugeType, gaugesData] of gauges.entries()) { + expect(await stakelessGaugeCheckpointer.getTotalGauges(GaugeType[gaugeType])).to.be.eq(gaugesData.length); + } + }); + + describe('getTotalBridgeCost', () => { + function itChecksTotalBridgeCost(minRelativeWeight: BigNumber) { + it('checks total bridge cost', async () => { + const arbitrumGauge = await task.instanceAt('ArbitrumRootGauge', gauges.get(GaugeType.Arbitrum)![0].address); + + const gaugesAmountAboveMinWeight = getGaugeDataAboveMinWeight(GaugeType.Arbitrum, minRelativeWeight).length; + const singleGaugeBridgeCost = await arbitrumGauge.getTotalBridgeCost(); + + // Bridge cost per gauge is always the same, so total cost is (single gauge cost) * (number of gauges). + expect(await stakelessGaugeCheckpointer.getTotalBridgeCost(minRelativeWeight)).to.be.eq( + singleGaugeBridgeCost.mul(gaugesAmountAboveMinWeight) + ); + }); + } + + context('when threshold is 1', () => { + itChecksTotalBridgeCost(fp(1)); + }); + + context('when threshold is 0.0001', () => { + itChecksTotalBridgeCost(fp(0.0001)); + }); + + context('when threshold is 0', () => { + itChecksTotalBridgeCost(fp(0)); + }); + }); + + describe('getSingleBridgeCost', () => { + it('gets the cost for an arbitrum gauge', async () => { + const arbitrumGauge = await task.instanceAt('ArbitrumRootGauge', gauges.get(GaugeType.Arbitrum)![0].address); + const bridgeCost = await arbitrumGauge.getTotalBridgeCost(); + const arbitrumType = GaugeType[GaugeType.Arbitrum]; + expect(await stakelessGaugeCheckpointer.getSingleBridgeCost(arbitrumType, arbitrumGauge.address)).to.be.eq( + bridgeCost + ); + }); + + it('gets the cost for an non-arbitrum gauge', async () => { + const gnosisGauge = await task.instanceAt('GnosisRootGauge', gauges.get(GaugeType.Gnosis)![0].address); + const gnosisType = GaugeType[GaugeType.Gnosis]; + expect(await stakelessGaugeCheckpointer.getSingleBridgeCost(gnosisType, gnosisGauge.address)).to.be.eq(0); + }); + + it('reverts when the gauge address is not present in the type', async () => { + const gnosisGauge = await task.instanceAt('GnosisRootGauge', gauges.get(GaugeType.Gnosis)![0].address); + const polygonType = GaugeType[GaugeType.Polygon]; + await expect(stakelessGaugeCheckpointer.getSingleBridgeCost(polygonType, gnosisGauge.address)).to.be.revertedWith( + 'Gauge was not added to the checkpointer' + ); + }); + }); + + describe('checkpoint', () => { + sharedBeforeEach(async () => { + // Gauges that are above a threshold will get another checkpoint attempt when the threshold is lowered. + // This block takes a snapshot so that gauges can be repeatedly checkpointed without skipping. + }); + + context('when threshold is 1', () => { + itCheckpointsGaugesAboveRelativeWeight(fp(1), 0); + }); + + context('when threshold is 0.0001', () => { + itCheckpointsGaugesAboveRelativeWeight(fp(0.0001), 11); + }); + + context('when threshold is 0', () => { + itCheckpointsGaugesAboveRelativeWeight(fp(0), 20); + }); + + function itCheckpointsGaugesAboveRelativeWeight(minRelativeWeight: BigNumber, gaugesAboveThreshold: number) { + let performCheckpoint: () => Promise; + let gaugeDataAboveMinWeight: GaugeData[] = []; + let ethereumGaugeDataAboveMinWeight: GaugeData[], + polygonGaugeDataAboveMinWeight: GaugeData[], + arbitrumGaugeDataAboveMinWeight: GaugeData[], + optimismGaugeDataAboveMinWeight: GaugeData[], + gnosisGaugeDataAboveMinWeight: GaugeData[]; + + sharedBeforeEach(async () => { + ethereumGaugeDataAboveMinWeight = getGaugeDataAboveMinWeight(GaugeType.Ethereum, minRelativeWeight); + polygonGaugeDataAboveMinWeight = getGaugeDataAboveMinWeight(GaugeType.Polygon, minRelativeWeight); + arbitrumGaugeDataAboveMinWeight = getGaugeDataAboveMinWeight(GaugeType.Arbitrum, minRelativeWeight); + optimismGaugeDataAboveMinWeight = getGaugeDataAboveMinWeight(GaugeType.Optimism, minRelativeWeight); + gnosisGaugeDataAboveMinWeight = getGaugeDataAboveMinWeight(GaugeType.Gnosis, minRelativeWeight); + }); + + context('when checkpointing all types', () => { + sharedBeforeEach(async () => { + performCheckpoint = async () => { + const tx = await stakelessGaugeCheckpointer.checkpointGaugesAboveRelativeWeight(minRelativeWeight, { + value: await stakelessGaugeCheckpointer.getTotalBridgeCost(minRelativeWeight), + }); + return await tx.wait(); + }; + gaugeDataAboveMinWeight = [ + ...ethereumGaugeDataAboveMinWeight, + ...polygonGaugeDataAboveMinWeight, + ...arbitrumGaugeDataAboveMinWeight, + ...optimismGaugeDataAboveMinWeight, + ...gnosisGaugeDataAboveMinWeight, + ]; + + expect(gaugeDataAboveMinWeight.length).to.be.eq(gaugesAboveThreshold); + }); + + itPerformsCheckpoint(); + }); + + context('when checkpointing only Ethereum gauges', () => { + sharedBeforeEach(async () => { + performCheckpoint = async () => { + const tx = await stakelessGaugeCheckpointer.checkpointGaugesOfTypeAboveRelativeWeight( + GaugeType[GaugeType.Ethereum], + minRelativeWeight + ); + return await tx.wait(); + }; + gaugeDataAboveMinWeight = ethereumGaugeDataAboveMinWeight; + }); + + itPerformsCheckpoint(); + }); + + context('when checkpointing only Polygon gauges', () => { + sharedBeforeEach(async () => { + performCheckpoint = async () => { + const tx = await stakelessGaugeCheckpointer.checkpointGaugesOfTypeAboveRelativeWeight( + GaugeType[GaugeType.Polygon], + minRelativeWeight + ); + return await tx.wait(); + }; + gaugeDataAboveMinWeight = polygonGaugeDataAboveMinWeight; + }); + + itPerformsCheckpoint(); + }); + + context('when checkpointing only Arbitrum gauges', () => { + sharedBeforeEach(async () => { + performCheckpoint = async () => { + const tx = await stakelessGaugeCheckpointer.checkpointGaugesOfTypeAboveRelativeWeight( + GaugeType[GaugeType.Arbitrum], + minRelativeWeight, + { + value: await stakelessGaugeCheckpointer.getTotalBridgeCost(minRelativeWeight), + } + ); + return await tx.wait(); + }; + gaugeDataAboveMinWeight = arbitrumGaugeDataAboveMinWeight; + }); + + itPerformsCheckpoint(); + }); + + context('when checkpointing only Optimism gauges', () => { + sharedBeforeEach(async () => { + performCheckpoint = async () => { + const tx = await stakelessGaugeCheckpointer.checkpointGaugesOfTypeAboveRelativeWeight( + GaugeType[GaugeType.Optimism], + minRelativeWeight + ); + return await tx.wait(); + }; + gaugeDataAboveMinWeight = optimismGaugeDataAboveMinWeight; + }); + + itPerformsCheckpoint(); + }); + + context('when checkpointing only Gnosis gauges', () => { + sharedBeforeEach(async () => { + performCheckpoint = async () => { + const tx = await stakelessGaugeCheckpointer.checkpointGaugesOfTypeAboveRelativeWeight( + GaugeType[GaugeType.Gnosis], + minRelativeWeight + ); + return await tx.wait(); + }; + gaugeDataAboveMinWeight = gnosisGaugeDataAboveMinWeight; + }); + + itPerformsCheckpoint(); + }); + + function itPerformsCheckpoint() { + it('performs a checkpoint for (non-checkpointed) gauges', async () => { + const receipt = await performCheckpoint(); + // Check that the right amount of checkpoints were actually performed for every gauge that required them. + gaugeDataAboveMinWeight.forEach((gaugeData) => { + expectEvent.inIndirectReceipt( + receipt, + checkpointInterface, + 'Checkpoint', + {}, + gaugeData.address, + gaugeData.expectedCheckpoints + ); + }); + }); + } + } + + describe('single gauge checkpoint', () => { + context('when checkpointing a single Arbitrum gauge', () => { + it('performs a checkpoint for (non-checkpointed) gauges', async () => { + const arbitrumGaugeData = gauges.get(GaugeType.Arbitrum)![0]; + const arbitrumType = GaugeType[GaugeType.Arbitrum]; + + const tx = await stakelessGaugeCheckpointer.checkpointSingleGauge(arbitrumType, arbitrumGaugeData.address, { + value: await stakelessGaugeCheckpointer.getSingleBridgeCost(arbitrumType, arbitrumGaugeData.address), + }); + expectEvent.inIndirectReceipt( + await tx.wait(), + checkpointInterface, + 'Checkpoint', + {}, + arbitrumGaugeData.address, + arbitrumGaugeData.expectedCheckpoints + ); + }); + }); + + context('when checkpointing a single non-Arbitrum gauge', () => { + it('performs a checkpoint for (non-checkpointed) gauges', async () => { + const gnosisGaugeData = gauges.get(GaugeType.Gnosis)![0]; + const gnosisType = GaugeType[GaugeType.Gnosis]; + + const tx = await stakelessGaugeCheckpointer.checkpointSingleGauge(gnosisType, gnosisGaugeData.address); + expectEvent.inIndirectReceipt( + await tx.wait(), + checkpointInterface, + 'Checkpoint', + {}, + gnosisGaugeData.address, + gnosisGaugeData.expectedCheckpoints + ); + }); + }); + }); + }); + + function getGaugeDataAboveMinWeight(gaugeType: GaugeType, fpMinRelativeWeight: BigNumber): GaugeData[] { + return gauges.get(gaugeType)!.filter((addressWeight) => addressWeight.weight.gte(fpMinRelativeWeight)); + } +}); diff --git a/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/test/task.fork.ts b/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/test/task.fork.ts new file mode 100644 index 0000000..7a1b73b --- /dev/null +++ b/balpy/balancer-deployments/tasks/deprecated/20230731-stakeless-gauge-checkpointer/test/task.fork.ts @@ -0,0 +1,180 @@ +import hre, { ethers } from 'hardhat'; +import { expect } from 'chai'; +import { Contract } from 'ethers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; + +import { BigNumber, fp } from '@helpers/numbers'; +import * as expectEvent from '@helpers/expectEvent'; + +import { describeForkTest } from '@src'; +import { Task, TaskMode } from '@src'; +import { getForkedNetwork } from '@src'; +import { impersonate } from '@src'; +import { actionId } from '@helpers/models/misc/actions'; +import { WEEK, currentWeekTimestamp } from '@helpers/time'; + +// This fork test verifies a corner case to validate the changes introduced in this checkpointer's version. +// The only gauge under test should have been checkpointed at this block. +// The contract in `20230527-l2-gauge-checkpointer` would skip it because it measures the gauge relative weight in +// the current week, whereas the new version does so in the previous week. +describeForkTest('StakelessGaugeCheckpointer', 'mainnet', 17431930, function () { + /* eslint-disable @typescript-eslint/no-non-null-assertion */ + + enum GaugeType { + Ethereum, + Polygon, + Arbitrum, + Optimism, + Gnosis, + Avalanche, + PolygonZkEvm, + ZkSync, + } + + let gaugeController: Contract; + let stakelessGaugeCheckpointer: Contract; + let authorizer: Contract, adaptorEntrypoint: Contract; + + let task: Task; + let daoMultisig: SignerWithAddress, admin: SignerWithAddress; + + const WEIGHT_THRESHOLD = fp(0.002); // 0.2% + + const DAO_MULTISIG = '0x10A19e7eE7d7F8a52822f6817de8ea18204F2e4f'; + const CHECKPOINT_MULTISIG = '0x02f35dA6A02017154367Bc4d47bb6c7D06C7533B'; + + const arbitrumRootGauge = '0xB5044FD339A7b858095324cC3F239C212956C179'; + const expectedCheckpoints = 8; + + const checkpointInterface = new ethers.utils.Interface([ + 'function checkpoint()', + 'event Checkpoint(uint256 indexed periodTime, uint256 periodEmissions)', + ]); + + type GaugeData = { + address: string; + weight: BigNumber; + expectedCheckpoints: number; + }; + + let gaugeData: GaugeData; + + before('run task', async () => { + task = new Task('20230731-stakeless-gauge-checkpointer', TaskMode.TEST, getForkedNetwork(hre)); + await task.run({ force: true }); + stakelessGaugeCheckpointer = await task.deployedInstance('StakelessGaugeCheckpointer'); + }); + + before('setup governance', async () => { + daoMultisig = await impersonate(DAO_MULTISIG, fp(100)); + admin = await impersonate(CHECKPOINT_MULTISIG, fp(100)); + }); + + before('setup contracts', async () => { + const authorizerTask = new Task('20210418-authorizer', TaskMode.READ_ONLY, getForkedNetwork(hre)); + authorizer = await authorizerTask.deployedInstance('Authorizer'); + + const adaptorEntrypointTask = new Task( + '20221124-authorizer-adaptor-entrypoint', + TaskMode.READ_ONLY, + getForkedNetwork(hre) + ); + adaptorEntrypoint = await adaptorEntrypointTask.deployedInstance('AuthorizerAdaptorEntrypoint'); + + const gaugeControllerTask = new Task('20220325-gauge-controller', TaskMode.READ_ONLY, getForkedNetwork(hre)); + gaugeController = await gaugeControllerTask.deployedInstance('GaugeController'); + }); + + before('add gauge to checkpointer', async () => { + // This gauge was created by a previous factory, so we just add it via governance providing the right type. + await authorizer + .connect(daoMultisig) + .grantRole(await actionId(stakelessGaugeCheckpointer, 'addGaugesWithVerifiedType'), admin.address); + + await stakelessGaugeCheckpointer + .connect(admin) + .addGaugesWithVerifiedType(GaugeType[GaugeType.Arbitrum], [arbitrumRootGauge]); + }); + + before('grant checkpoint permission to gauge checkpointer', async () => { + // Any gauge works; we just need the interface. + const gauge = await task.instanceAt('IStakelessGauge', arbitrumRootGauge); + + await authorizer + .connect(daoMultisig) + .grantRole( + await adaptorEntrypoint.getActionId(gauge.interface.getSighash('checkpoint')), + stakelessGaugeCheckpointer.address + ); + }); + + before('check relative weight and store gauge data', async () => { + // Here we verify that we are effectively testing a corner case, and that the gauge can still be checkpointed. + // The gauge under test was created several weeks before the block specified in the fork test. + // It meets 3 conditions, explained below. + const currentWeek = await currentWeekTimestamp(); + const previousWeek = currentWeek.sub(WEEK); + const relativeWeightPreviousWeek = await gaugeController['gauge_relative_weight(address,uint256)']( + arbitrumRootGauge, + previousWeek + ); + // 1) The weight of the gauge in the previous week is non-zero, and greater than a given threshold. + expect(relativeWeightPreviousWeek).to.be.gte(WEIGHT_THRESHOLD); + + // 2) The gauge is not up to date in the controller. + const latestCheckpointedTime = await gaugeController.time_weight(arbitrumRootGauge); + expect(latestCheckpointedTime).to.be.lt(currentWeek); + + // 3) The weight at the current week is 0. + const relativeWeightNow = await gaugeController['gauge_relative_weight(address)'](arbitrumRootGauge); + expect(relativeWeightNow).to.be.eq(0); + + gaugeData = { + address: arbitrumRootGauge, + weight: relativeWeightPreviousWeek, + expectedCheckpoints, + }; + }); + + it('checks that gauges were added correctly', async () => { + expect(await stakelessGaugeCheckpointer.getTotalGauges(GaugeType[GaugeType.Arbitrum])).to.be.eq(1); + }); + + describe('checkpoint', () => { + sharedBeforeEach(async () => { + // Gauges that are above a threshold will get another checkpoint attempt when the threshold is lowered. + // This block takes a snapshot so that gauges can be repeatedly checkpointed without skipping. + }); + + context('when threshold is above gauge weight', () => { + const minRelativeWeight = WEIGHT_THRESHOLD.mul(10); + + it('skips the gauge', async () => { + const tx = await stakelessGaugeCheckpointer.checkpointGaugesAboveRelativeWeight(minRelativeWeight, { + value: await stakelessGaugeCheckpointer.getTotalBridgeCost(minRelativeWeight), + }); + + expectEvent.notEmitted(await tx.wait(), 'Checkpoint'); + }); + }); + + context('when threshold below gauge weight', () => { + const minRelativeWeight = WEIGHT_THRESHOLD; + + it('performs the checkpoint', async () => { + const tx = await stakelessGaugeCheckpointer.checkpointGaugesAboveRelativeWeight(minRelativeWeight, { + value: await stakelessGaugeCheckpointer.getTotalBridgeCost(minRelativeWeight), + }); + + expectEvent.inIndirectReceipt( + await tx.wait(), + checkpointInterface, + 'Checkpoint', + {}, + gaugeData.address, + gaugeData.expectedCheckpoints + ); + }); + }); + }); +}); diff --git a/balpy/balancer-deployments/tsconfig.json b/balpy/balancer-deployments/tsconfig.json new file mode 100644 index 0000000..1ca920c --- /dev/null +++ b/balpy/balancer-deployments/tsconfig.json @@ -0,0 +1,76 @@ +{ + "include": ["tasks/**/test", "tasks/**/index.ts", "tasks/**/input.ts", "index.ts", "src", "addresses/**/*.json", "tasks/**/artifact/*.json", "tasks/**/output/*.json"], + "exclude": ["tasks/**/output/test.json"], + "files": ["./hardhat.config.ts"], + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "es2019" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + "declaration": true /* Generates corresponding '.d.ts' file. */, + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + "outDir": "dist", + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, + "baseUrl": "./src", /* Base directory to resolve non-absolute module names. */ + "paths": { /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + "@helpers/*": ["helpers/*"], + "@src": ["./index"] + }, + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "skipLibCheck": true /* Skip type checking of declaration files. */, + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, + "resolveJsonModule": true + } +} diff --git a/balpy/balancer-deployments/yarn.lock b/balpy/balancer-deployments/yarn.lock new file mode 100644 index 0000000..5ef2242 --- /dev/null +++ b/balpy/balancer-deployments/yarn.lock @@ -0,0 +1,12662 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 7 + cacheKey: 9 + +"@babel/code-frame@npm:^7.0.0": + version: 7.21.4 + resolution: "@babel/code-frame@npm:7.21.4" + dependencies: + "@babel/highlight": "npm:^7.18.6" + checksum: 277dd26ebd69a94fc065b51e8cd391712a0738f8a4d0ccff038bc0b31354f9eccb83efba3ffe37e6d5eb881bd4b8d7a7932649ea69c2d36fbbc4a3cbf5f4e9e7 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.18.6": + version: 7.19.1 + resolution: "@babel/helper-validator-identifier@npm:7.19.1" + checksum: 089fdf605ee8dfa3004cd84c69e655ff9ab8bdb4e7fa02bf0012db728c6247acb599ca1118d2f9124d7b417fc5793ee348f2da8bc64be230b3b13ba7cd4364cc + languageName: node + linkType: hard + +"@babel/highlight@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/highlight@npm:7.18.6" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.18.6" + chalk: "npm:^2.0.0" + js-tokens: "npm:^4.0.0" + checksum: b8eeb1d38327c635004b3ae946ff334bb994334a5fdd874e216e62bbe3b8f8f10c901c3795c25db7c8e49eb5a56948b9dbe38c3800c4f977016402997dacedae + languageName: node + linkType: hard + +"@balancer-labs/v2-deployments@workspace:.": + version: 0.0.0-use.local + resolution: "@balancer-labs/v2-deployments@workspace:." + dependencies: + "@balancer-labs/v2-interfaces": "npm:latest" + "@balancer-labs/v2-solidity-utils": "npm:^3.0.2" + "@ethersproject/contracts": "npm:^5.0.0" + "@nomicfoundation/hardhat-network-helpers": "npm:^1.0.6" + "@nomiclabs/hardhat-ethers": "npm:^2.2.1" + "@nomiclabs/hardhat-etherscan": "npm:^3.1.2" + "@nomiclabs/hardhat-vyper": "npm:^3.0.3" + "@nomiclabs/hardhat-waffle": "npm:^2.0.5" + "@solidity-parser/parser": "npm:^0.14.5" + "@types/chai": "npm:^4" + "@types/lodash": "npm:^4.14.186" + "@types/lodash.range": "npm:^3.2.7" + "@types/mocha": "npm:^10" + "@types/node": "npm:^14.14.31" + "@types/node-fetch": "npm:^2.6.2" + "@typescript-eslint/eslint-plugin": "npm:^5.41.0" + "@typescript-eslint/parser": "npm:^5.41.0" + chai: "npm:^4.3.6" + chalk: "npm:^4.1.2" + decimal.js: "npm:^10.4.3" + eslint: "npm:^8.26.0" + eslint-plugin-mocha-no-only: "npm:^1.1.1" + eslint-plugin-prettier: "npm:^4.2.1" + ethereum-waffle: "npm:^3.4.4" + ethereumjs-util: "npm:^7.1.5" + ethers: "npm:^5.7.2" + graphql: "npm:^16.6.0" + graphql-request: "npm:^5.2.0" + hardhat: "npm:^2.12.5" + hardhat-ignore-warnings: "npm:^0.2.8" + hardhat-local-networks-config-plugin: "npm:^0.0.6" + lodash.range: "npm:^3.2.0" + mocha: "npm:^10.2.0" + node-fetch: "npm:^2.6.7" + prettier: "npm:^2.7.1" + prettier-plugin-solidity: "npm:v1.0.0-alpha.59" + solhint: "npm:^3.2.0" + solhint-plugin-prettier: "npm:^0.0.4" + ts-node: "npm:^10.9.1" + tsconfig-paths: "npm:^4.1.2" + typescript: "npm:^4.3.2" + languageName: unknown + linkType: soft + +"@balancer-labs/v2-interfaces@npm:0.3.0": + version: 0.3.0 + resolution: "@balancer-labs/v2-interfaces@npm:0.3.0" + checksum: a8c9a4eee20ae2d9b9834253969b7ef5f1a5429bbc449fd6a6271333e5f847d1d8c7ec2158231b871045b209e45caafd9e024a71529e8a54634fa2b6b772b858 + languageName: node + linkType: hard + +"@balancer-labs/v2-interfaces@npm:latest": + version: 0.4.0 + resolution: "@balancer-labs/v2-interfaces@npm:0.4.0" + checksum: 61a0d7b4b62049728ff751c23eeda4eaa459aa69e12a0dab54041277745767ba6438d12f515a00e65fbf2abea4ad5cef1e85c6d8bb4c3eb3333026ca20fd6c2c + languageName: node + linkType: hard + +"@balancer-labs/v2-solidity-utils@npm:^3.0.2": + version: 3.0.2 + resolution: "@balancer-labs/v2-solidity-utils@npm:3.0.2" + dependencies: + "@balancer-labs/v2-interfaces": "npm:0.3.0" + checksum: 2e3856c508531194687a4d1ddb8a0181eac077faa131c1af57cf36067e5bdcba754b5e2f5aaab51910a779fa9145d60032463c14ecf606bc99b91d300040bf7a + languageName: node + linkType: hard + +"@chainsafe/as-sha256@npm:^0.3.1": + version: 0.3.1 + resolution: "@chainsafe/as-sha256@npm:0.3.1" + checksum: ab55d145a5eaac298752fe814df00754af1bfd15ec2f7dba1909dc9b82e67a639c04c8629e80dd7c31b9c432d2ce572267a8d265ba0152518ccf75ff8762adfa + languageName: node + linkType: hard + +"@chainsafe/persistent-merkle-tree@npm:^0.4.2": + version: 0.4.2 + resolution: "@chainsafe/persistent-merkle-tree@npm:0.4.2" + dependencies: + "@chainsafe/as-sha256": "npm:^0.3.1" + checksum: ceafa44d2fa9fd9e7a2b708b27fb72a8a5b7813edab492d4e2701fa0a86268c259069626b761b066ef29eb65c1c2feab5ba75208ab48999787d968b6ba8ec2c1 + languageName: node + linkType: hard + +"@chainsafe/persistent-merkle-tree@npm:^0.5.0": + version: 0.5.0 + resolution: "@chainsafe/persistent-merkle-tree@npm:0.5.0" + dependencies: + "@chainsafe/as-sha256": "npm:^0.3.1" + checksum: c83417563b6178e09ec593fa991ac5f23cf9bbbfa40b1f49d00e6e483f2fb668ec0b7a8e4c1de98d03a12ea163acea1f81b032e272d88e94079263cdc965b87e + languageName: node + linkType: hard + +"@chainsafe/ssz@npm:^0.10.0": + version: 0.10.2 + resolution: "@chainsafe/ssz@npm:0.10.2" + dependencies: + "@chainsafe/as-sha256": "npm:^0.3.1" + "@chainsafe/persistent-merkle-tree": "npm:^0.5.0" + checksum: 9027d528f084191e05de20d69963bf0ae4533ff03bc704acb565d834d4f8b9bf0d4be6105853950f9ae399b76bbde53263b17777a7dc925a5cb8f24edbd084a8 + languageName: node + linkType: hard + +"@chainsafe/ssz@npm:^0.9.2": + version: 0.9.4 + resolution: "@chainsafe/ssz@npm:0.9.4" + dependencies: + "@chainsafe/as-sha256": "npm:^0.3.1" + "@chainsafe/persistent-merkle-tree": "npm:^0.4.2" + case: "npm:^1.6.3" + checksum: 4b839080524432fe8671061ede8629c168804bb7634c2e4c58c54a072b0ddeff9fb93e9a13c8da1540f764521fa8fe19f4c490437f2d049c3cef8eb874170dbc + languageName: node + linkType: hard + +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": "npm:0.3.9" + checksum: 4327d8e6e4347897f5baf265c43ff094260a3ad7b53920fa07472aa18699ba7d570e5171082e88d19e4b5cce6f35cc1666b1c8ccb8b74d67e4f482395b8c511d + languageName: node + linkType: hard + +"@ensdomains/ens@npm:^0.4.4": + version: 0.4.5 + resolution: "@ensdomains/ens@npm:0.4.5" + dependencies: + bluebird: "npm:^3.5.2" + eth-ens-namehash: "npm:^2.0.8" + solc: "npm:^0.4.20" + testrpc: "npm:0.0.1" + web3-utils: "npm:^1.0.0-beta.31" + checksum: d430076999b185331b276961f8627acd740d340bb70594410dccb45591fccc15721f6afbb54b72ebef7f3c4dd0d2fd2692e882c8776f5f1b03d4de5a1a42981b + languageName: node + linkType: hard + +"@ensdomains/resolver@npm:^0.2.4": + version: 0.2.4 + resolution: "@ensdomains/resolver@npm:0.2.4" + checksum: 08026ad6d8658cae491d5904f4d16759f4a80f7271a989835eccaba362b3e49159052c95c8a672757fa35c303fb965da6edeadea66d73b717d6c6e943c7023d2 + languageName: node + linkType: hard + +"@eslint-community/eslint-utils@npm:^4.2.0": + version: 4.4.0 + resolution: "@eslint-community/eslint-utils@npm:4.4.0" + dependencies: + eslint-visitor-keys: "npm:^3.3.0" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: b9d700a83a743f2e152b4038d02a4bf807bc7363d59efeafec93b9498e59a3aa4d2604d206c213b91966416d628f33d88a4b773b8ff0d384b44353e8072ba922 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.4.0": + version: 4.5.1 + resolution: "@eslint-community/regexpp@npm:4.5.1" + checksum: 3668342e1f924549f8c406bb062118a4b8e94afcc3f2161b600df411d2e270fa6428a6847945f3aaa5a1d540c070489e8104899f176866872ed6d1220c511296 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.0.3": + version: 2.0.3 + resolution: "@eslint/eslintrc@npm:2.0.3" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^9.5.2" + globals: "npm:^13.19.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 41c404e8cbca6e0717bce15425f15d34514c38ebcef5daf99467d405733bae73908227feea4d04edc64906e89cc53f30391c31864a5e51b3d3838a05a3a97356 + languageName: node + linkType: hard + +"@eslint/js@npm:8.40.0": + version: 8.40.0 + resolution: "@eslint/js@npm:8.40.0" + checksum: 3548fb40196129bb640851e7ca8db79a1c065716bbd9ff7b67778236abe81a080d4f19fc0320cb87c5f3fa1fcd23f652f5772a9d0172cff43705acf227bdee55 + languageName: node + linkType: hard + +"@ethereum-waffle/chai@npm:^3.4.4": + version: 3.4.4 + resolution: "@ethereum-waffle/chai@npm:3.4.4" + dependencies: + "@ethereum-waffle/provider": "npm:^3.4.4" + ethers: "npm:^5.5.2" + checksum: 8e4c6daf821a413423fc77275333e5fdf5c32a34a30e338a5cb78dc0287cf3b1c60e1673d01c40308c9826f1d01661a1dd44c321284d3361ac31a35fe647e0f5 + languageName: node + linkType: hard + +"@ethereum-waffle/compiler@npm:^3.4.4": + version: 3.4.4 + resolution: "@ethereum-waffle/compiler@npm:3.4.4" + dependencies: + "@resolver-engine/imports": "npm:^0.3.3" + "@resolver-engine/imports-fs": "npm:^0.3.3" + "@typechain/ethers-v5": "npm:^2.0.0" + "@types/mkdirp": "npm:^0.5.2" + "@types/node-fetch": "npm:^2.5.5" + ethers: "npm:^5.0.1" + mkdirp: "npm:^0.5.1" + node-fetch: "npm:^2.6.1" + solc: "npm:^0.6.3" + ts-generator: "npm:^0.1.1" + typechain: "npm:^3.0.0" + checksum: bcf711c30cb5a8a4646ad53a8bb338eea324df4e90d068bee44ea1a0ecdbd22d44027f6b39090aa2b5e02ba5465d3b6c9213f6753980516c3756e0317df2802b + languageName: node + linkType: hard + +"@ethereum-waffle/ens@npm:^3.4.4": + version: 3.4.4 + resolution: "@ethereum-waffle/ens@npm:3.4.4" + dependencies: + "@ensdomains/ens": "npm:^0.4.4" + "@ensdomains/resolver": "npm:^0.2.4" + ethers: "npm:^5.5.2" + checksum: e4a2926098e809b02b84d2eb18096d14d54cbce73f0de871d40ec17143e6722b955b1ee4b2582a14a8d6b6b8a90b6bb34c0e163ead1c70475636b5c93df23baa + languageName: node + linkType: hard + +"@ethereum-waffle/mock-contract@npm:^3.4.4": + version: 3.4.4 + resolution: "@ethereum-waffle/mock-contract@npm:3.4.4" + dependencies: + "@ethersproject/abi": "npm:^5.5.0" + ethers: "npm:^5.5.2" + checksum: b050deef9265a61bccd768d00406283840b7009f11a225d7159e11db4d7ab4d52b7da36bdddf680757d27124c5683ae74ac9075133b5e8c20579df4f5933572a + languageName: node + linkType: hard + +"@ethereum-waffle/provider@npm:^3.4.4": + version: 3.4.4 + resolution: "@ethereum-waffle/provider@npm:3.4.4" + dependencies: + "@ethereum-waffle/ens": "npm:^3.4.4" + ethers: "npm:^5.5.2" + ganache-core: "npm:^2.13.2" + patch-package: "npm:^6.2.2" + postinstall-postinstall: "npm:^2.1.0" + checksum: 289541b0f361ac6baf456ea1629dd02e83781bc2b99e6f96d84c86f22611cb90aff317222d800f8944f85b45adc50dd28f23c2ad35dbf9fc69e5135b9a8bdb32 + languageName: node + linkType: hard + +"@ethersproject/abi@npm:5.0.0-beta.153": + version: 5.0.0-beta.153 + resolution: "@ethersproject/abi@npm:5.0.0-beta.153" + dependencies: + "@ethersproject/address": "npm:>=5.0.0-beta.128" + "@ethersproject/bignumber": "npm:>=5.0.0-beta.130" + "@ethersproject/bytes": "npm:>=5.0.0-beta.129" + "@ethersproject/constants": "npm:>=5.0.0-beta.128" + "@ethersproject/hash": "npm:>=5.0.0-beta.128" + "@ethersproject/keccak256": "npm:>=5.0.0-beta.127" + "@ethersproject/logger": "npm:>=5.0.0-beta.129" + "@ethersproject/properties": "npm:>=5.0.0-beta.131" + "@ethersproject/strings": "npm:>=5.0.0-beta.130" + checksum: 6bc726c984c9505b6a8e1b6b0f152d3e393c5f67bd0d9da11c92c6f97cb5da5fe9d18443ccd9f449b5066efc8e56895ace904f124ec5196fe6f0cd305a9b5089 + languageName: node + linkType: hard + +"@ethersproject/abi@npm:5.7.0, @ethersproject/abi@npm:^5.1.2, @ethersproject/abi@npm:^5.5.0, @ethersproject/abi@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/abi@npm:5.7.0" + dependencies: + "@ethersproject/address": "npm:^5.7.0" + "@ethersproject/bignumber": "npm:^5.7.0" + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/constants": "npm:^5.7.0" + "@ethersproject/hash": "npm:^5.7.0" + "@ethersproject/keccak256": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + "@ethersproject/properties": "npm:^5.7.0" + "@ethersproject/strings": "npm:^5.7.0" + checksum: d280355626314f5acb1a3c2e81328d27ddafd0ac9fdeeba496de26a6a53c39102076ebd7d74c38362d2a26e5fcc911759d64c4a446e10cc01216eef6220288d6 + languageName: node + linkType: hard + +"@ethersproject/abstract-provider@npm:5.7.0, @ethersproject/abstract-provider@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/abstract-provider@npm:5.7.0" + dependencies: + "@ethersproject/bignumber": "npm:^5.7.0" + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + "@ethersproject/networks": "npm:^5.7.0" + "@ethersproject/properties": "npm:^5.7.0" + "@ethersproject/transactions": "npm:^5.7.0" + "@ethersproject/web": "npm:^5.7.0" + checksum: dd46b5444090a32afa967f507091d04ea9e65d555a24744b728e134449e50e5c60419b1c03720eb934d556ab7fe30b8790f98cb4a8f2d0dc2e188c6966bf147f + languageName: node + linkType: hard + +"@ethersproject/abstract-signer@npm:5.7.0, @ethersproject/abstract-signer@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/abstract-signer@npm:5.7.0" + dependencies: + "@ethersproject/abstract-provider": "npm:^5.7.0" + "@ethersproject/bignumber": "npm:^5.7.0" + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + "@ethersproject/properties": "npm:^5.7.0" + checksum: b97eda8abf6584efe2628456b8933fef9e212ba0e2cdc86e84b303bdc5401f88f9b785c9f123b8fb961dbc809dbe4a0f710ee63c67b79b7f96341d28d9650ee4 + languageName: node + linkType: hard + +"@ethersproject/address@npm:5.7.0, @ethersproject/address@npm:>=5.0.0-beta.128, @ethersproject/address@npm:^5.0.2, @ethersproject/address@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/address@npm:5.7.0" + dependencies: + "@ethersproject/bignumber": "npm:^5.7.0" + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/keccak256": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + "@ethersproject/rlp": "npm:^5.7.0" + checksum: 40d3fc40e075709fef5c986eece2ce21a81803d6fd8c009ae8866de1e50522fa76788771cdd0bc2fb1efc00710caee9c7501a9853844eef8d7a80e7c257414e3 + languageName: node + linkType: hard + +"@ethersproject/base64@npm:5.7.0, @ethersproject/base64@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/base64@npm:5.7.0" + dependencies: + "@ethersproject/bytes": "npm:^5.7.0" + checksum: 920573265a668c4d356b8aa031d2be00901ff16d8d74412a5d4bf5a191af03fae83307e5f9c398ad1e29f9de80bac867b05aa23b942fbc02ea574372e8ffa6dd + languageName: node + linkType: hard + +"@ethersproject/basex@npm:5.7.0, @ethersproject/basex@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/basex@npm:5.7.0" + dependencies: + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/properties": "npm:^5.7.0" + checksum: 72780bc8acc2582148673cbf6171480ab5af3e1f58cb466462568ecb6a3d631d5adffe2e774eca57d7662456fd38b537bab14cf58de5b300834859a10b985b93 + languageName: node + linkType: hard + +"@ethersproject/bignumber@npm:5.7.0, @ethersproject/bignumber@npm:>=5.0.0-beta.130, @ethersproject/bignumber@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/bignumber@npm:5.7.0" + dependencies: + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + bn.js: "npm:^5.2.1" + checksum: 666c8155b98881ac220c15152c24d0e8036c814d036b4105f0d60252777d9582d5d539a34ac41d16d90e28ac89e4816db7478ef2b8e27f793156dcbf4d8a5d4e + languageName: node + linkType: hard + +"@ethersproject/bytes@npm:5.7.0, @ethersproject/bytes@npm:>=5.0.0-beta.129, @ethersproject/bytes@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/bytes@npm:5.7.0" + dependencies: + "@ethersproject/logger": "npm:^5.7.0" + checksum: 65d987c3e7057fcab2407c84dc79341b2e633364532262c635333bf6bb85bf244e2515ab5b582c06407f75b58fe90433b77af9161fa26819ca99fee9026743bc + languageName: node + linkType: hard + +"@ethersproject/constants@npm:5.7.0, @ethersproject/constants@npm:>=5.0.0-beta.128, @ethersproject/constants@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/constants@npm:5.7.0" + dependencies: + "@ethersproject/bignumber": "npm:^5.7.0" + checksum: 1e64c19be14deb69f0c1532c62b24d6d3e8a99df7412004ade36dd5d257a763ff06da9b8729172b7b86aa3d24e59202280d5df3a63dd9860f91109f6fa2356d9 + languageName: node + linkType: hard + +"@ethersproject/contracts@npm:5.7.0, @ethersproject/contracts@npm:^5.0.0": + version: 5.7.0 + resolution: "@ethersproject/contracts@npm:5.7.0" + dependencies: + "@ethersproject/abi": "npm:^5.7.0" + "@ethersproject/abstract-provider": "npm:^5.7.0" + "@ethersproject/abstract-signer": "npm:^5.7.0" + "@ethersproject/address": "npm:^5.7.0" + "@ethersproject/bignumber": "npm:^5.7.0" + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/constants": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + "@ethersproject/properties": "npm:^5.7.0" + "@ethersproject/transactions": "npm:^5.7.0" + checksum: 4e6690b267bf2975f6a02f882c521d11127a65a12c4173d6f4628971e83d5fd76b3921fb754a24bb5ec4abab4776105b40ce0050ec347dc2fa9fd70794aaf1b5 + languageName: node + linkType: hard + +"@ethersproject/hash@npm:5.7.0, @ethersproject/hash@npm:>=5.0.0-beta.128, @ethersproject/hash@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/hash@npm:5.7.0" + dependencies: + "@ethersproject/abstract-signer": "npm:^5.7.0" + "@ethersproject/address": "npm:^5.7.0" + "@ethersproject/base64": "npm:^5.7.0" + "@ethersproject/bignumber": "npm:^5.7.0" + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/keccak256": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + "@ethersproject/properties": "npm:^5.7.0" + "@ethersproject/strings": "npm:^5.7.0" + checksum: a4ea4262760273d657c677447fab9668204061de7f376b27996945efd7926ff96fa7b4227a80b60c626e3f76bee39bc948d0e91f8614af9bc7b4b4a639be4c0b + languageName: node + linkType: hard + +"@ethersproject/hdnode@npm:5.7.0, @ethersproject/hdnode@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/hdnode@npm:5.7.0" + dependencies: + "@ethersproject/abstract-signer": "npm:^5.7.0" + "@ethersproject/basex": "npm:^5.7.0" + "@ethersproject/bignumber": "npm:^5.7.0" + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + "@ethersproject/pbkdf2": "npm:^5.7.0" + "@ethersproject/properties": "npm:^5.7.0" + "@ethersproject/sha2": "npm:^5.7.0" + "@ethersproject/signing-key": "npm:^5.7.0" + "@ethersproject/strings": "npm:^5.7.0" + "@ethersproject/transactions": "npm:^5.7.0" + "@ethersproject/wordlists": "npm:^5.7.0" + checksum: 709bde40fa2aaef1ac47ca69d76a5579edf7648b1519f75a47dffb370945340f81f068c596b84d450184a8e3c93b59b2f7f28f422fb45de0295ca6e4456e1911 + languageName: node + linkType: hard + +"@ethersproject/json-wallets@npm:5.7.0, @ethersproject/json-wallets@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/json-wallets@npm:5.7.0" + dependencies: + "@ethersproject/abstract-signer": "npm:^5.7.0" + "@ethersproject/address": "npm:^5.7.0" + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/hdnode": "npm:^5.7.0" + "@ethersproject/keccak256": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + "@ethersproject/pbkdf2": "npm:^5.7.0" + "@ethersproject/properties": "npm:^5.7.0" + "@ethersproject/random": "npm:^5.7.0" + "@ethersproject/strings": "npm:^5.7.0" + "@ethersproject/transactions": "npm:^5.7.0" + aes-js: "npm:3.0.0" + scrypt-js: "npm:3.0.1" + checksum: 9fc5761b190d26e838a603cd3811dd2dace1c24c099f289b641f80b6199c7098759b7b80c13deccac5a0d1d77d4203abbb8ae0de1e911d384fdfb675147b2297 + languageName: node + linkType: hard + +"@ethersproject/keccak256@npm:5.7.0, @ethersproject/keccak256@npm:>=5.0.0-beta.127, @ethersproject/keccak256@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/keccak256@npm:5.7.0" + dependencies: + "@ethersproject/bytes": "npm:^5.7.0" + js-sha3: "npm:0.8.0" + checksum: a0cace980f416a5395c3b9fed0a87e73fae6ebb1bf49e25b099670f75ea779d8e458e853bd7f3624ef08b2c098cc5fb7c13952dd0ed790ccf5f1bb879213f0ce + languageName: node + linkType: hard + +"@ethersproject/logger@npm:5.7.0, @ethersproject/logger@npm:>=5.0.0-beta.129, @ethersproject/logger@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/logger@npm:5.7.0" + checksum: 41ef0d49aad3677c36d0e79a6e2346ec13cf378cc6a042cfbc0d76aca6bce0b9f7362cb3fa4d60572e2e24df12edc378e5d8bbf1e33f8234c142e09552c87f8a + languageName: node + linkType: hard + +"@ethersproject/networks@npm:5.7.1, @ethersproject/networks@npm:^5.7.0": + version: 5.7.1 + resolution: "@ethersproject/networks@npm:5.7.1" + dependencies: + "@ethersproject/logger": "npm:^5.7.0" + checksum: 5495b6a83a896366e8268da5e790898c5f7812fa6c395d3dffb89c2534a46e7cebaec07c6ae526f342843b482eb0e028013cea7f4e7bb8a266c8d6e22d114bda + languageName: node + linkType: hard + +"@ethersproject/pbkdf2@npm:5.7.0, @ethersproject/pbkdf2@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/pbkdf2@npm:5.7.0" + dependencies: + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/sha2": "npm:^5.7.0" + checksum: 558f025e5ccfdb8f64b7479e7c6d9ca5a5a2e408935ec7f49fdecd2610e80e73e2301c6b925e8b7ce544cdbc74d2195f67536ed6924587ce7a1cb1ded2202f5c + languageName: node + linkType: hard + +"@ethersproject/properties@npm:5.7.0, @ethersproject/properties@npm:>=5.0.0-beta.131, @ethersproject/properties@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/properties@npm:5.7.0" + dependencies: + "@ethersproject/logger": "npm:^5.7.0" + checksum: 776f2d63f4b0ad04934d34db1b35c974f77e8beaec124d8fd267794fcdc0845c6a57ad8398b0637144a1bb57e5e2552bdbb76f9919c3919ec58e9bf2e5d008c3 + languageName: node + linkType: hard + +"@ethersproject/providers@npm:5.7.2, @ethersproject/providers@npm:^5.7.1, @ethersproject/providers@npm:^5.7.2": + version: 5.7.2 + resolution: "@ethersproject/providers@npm:5.7.2" + dependencies: + "@ethersproject/abstract-provider": "npm:^5.7.0" + "@ethersproject/abstract-signer": "npm:^5.7.0" + "@ethersproject/address": "npm:^5.7.0" + "@ethersproject/base64": "npm:^5.7.0" + "@ethersproject/basex": "npm:^5.7.0" + "@ethersproject/bignumber": "npm:^5.7.0" + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/constants": "npm:^5.7.0" + "@ethersproject/hash": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + "@ethersproject/networks": "npm:^5.7.0" + "@ethersproject/properties": "npm:^5.7.0" + "@ethersproject/random": "npm:^5.7.0" + "@ethersproject/rlp": "npm:^5.7.0" + "@ethersproject/sha2": "npm:^5.7.0" + "@ethersproject/strings": "npm:^5.7.0" + "@ethersproject/transactions": "npm:^5.7.0" + "@ethersproject/web": "npm:^5.7.0" + bech32: "npm:1.1.4" + ws: "npm:7.4.6" + checksum: 340672035cefd774ce634f40f32e9233ca93bb225bd03233b2406ef6442b798b00e14b2b2fe3a0c5baee2c636c97b65aaaa7b29916b6d5aa3bf31b01603a0f87 + languageName: node + linkType: hard + +"@ethersproject/random@npm:5.7.0, @ethersproject/random@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/random@npm:5.7.0" + dependencies: + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + checksum: ebc7f95948ecdcf5269c9644be719888b9b71881eb3961d85f6a3fa82083bde4e2675a3fc694079e88a3481a91282277c5f91bf74b4238dce983a210da36267a + languageName: node + linkType: hard + +"@ethersproject/rlp@npm:5.7.0, @ethersproject/rlp@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/rlp@npm:5.7.0" + dependencies: + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + checksum: 41ff1717ee483131747ee3b625a7b78df981d221421e824b818dd598139571598e1cde7a00f40a927d08e8352537f7411685eaa9a004bcb78315b4beb9a16c33 + languageName: node + linkType: hard + +"@ethersproject/sha2@npm:5.7.0, @ethersproject/sha2@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/sha2@npm:5.7.0" + dependencies: + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + hash.js: "npm:1.1.7" + checksum: c0a17628b1657306d695b43cea63061a5e92a16e694bbe4ece96fc3d0bde537d9def02e22457f97181fc9ccbba1f8dc638ede74d7d62e902eefdb51710a1193b + languageName: node + linkType: hard + +"@ethersproject/signing-key@npm:5.7.0, @ethersproject/signing-key@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/signing-key@npm:5.7.0" + dependencies: + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + "@ethersproject/properties": "npm:^5.7.0" + bn.js: "npm:^5.2.1" + elliptic: "npm:6.5.4" + hash.js: "npm:1.1.7" + checksum: 53bf8187e47537f3715a9c50836b10ecd05feb7448cfe865b44b6e2776eb14a716accdca4b60465cdf814fbfe06a7d3c405448d4c448fe96c9d89e5dadddbaaf + languageName: node + linkType: hard + +"@ethersproject/solidity@npm:5.7.0": + version: 5.7.0 + resolution: "@ethersproject/solidity@npm:5.7.0" + dependencies: + "@ethersproject/bignumber": "npm:^5.7.0" + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/keccak256": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + "@ethersproject/sha2": "npm:^5.7.0" + "@ethersproject/strings": "npm:^5.7.0" + checksum: 46e989a04ba61bbd76a2b92a4c0c0a8b51dccf0edff164abe2a6d550e78f24caab8f961c12e7f38a07488cb280aa61ba1190aaa5e40f738a5b15e726d2bf8d1d + languageName: node + linkType: hard + +"@ethersproject/strings@npm:5.7.0, @ethersproject/strings@npm:>=5.0.0-beta.130, @ethersproject/strings@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/strings@npm:5.7.0" + dependencies: + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/constants": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + checksum: 9f6e514c6bbbb9ecd7f567a92884c6ed5eb5d14bc60ac91e04bb2ad74e2bab52cb94b14ba875a4495a0f0d2a76babd842d226442e71537ad83606795691f7f16 + languageName: node + linkType: hard + +"@ethersproject/transactions@npm:5.7.0, @ethersproject/transactions@npm:^5.0.0-beta.135, @ethersproject/transactions@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/transactions@npm:5.7.0" + dependencies: + "@ethersproject/address": "npm:^5.7.0" + "@ethersproject/bignumber": "npm:^5.7.0" + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/constants": "npm:^5.7.0" + "@ethersproject/keccak256": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + "@ethersproject/properties": "npm:^5.7.0" + "@ethersproject/rlp": "npm:^5.7.0" + "@ethersproject/signing-key": "npm:^5.7.0" + checksum: 28ed8fefaad0c5689518393eed5bd65abd7d202ba4d0182f06cf21dddecff51738ae9164aac1f86ff7eac634483dd4265a7d21d81cc0fd478724cac326575e44 + languageName: node + linkType: hard + +"@ethersproject/units@npm:5.7.0": + version: 5.7.0 + resolution: "@ethersproject/units@npm:5.7.0" + dependencies: + "@ethersproject/bignumber": "npm:^5.7.0" + "@ethersproject/constants": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + checksum: ccb4922d8c9fc8898292ab85cf6ee59adad07299057b06502ad923632c55abd0aeb45462b9777c01e865950f9f3924a73a90861201d1cd6f791a87b6f42ab40d + languageName: node + linkType: hard + +"@ethersproject/wallet@npm:5.7.0": + version: 5.7.0 + resolution: "@ethersproject/wallet@npm:5.7.0" + dependencies: + "@ethersproject/abstract-provider": "npm:^5.7.0" + "@ethersproject/abstract-signer": "npm:^5.7.0" + "@ethersproject/address": "npm:^5.7.0" + "@ethersproject/bignumber": "npm:^5.7.0" + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/hash": "npm:^5.7.0" + "@ethersproject/hdnode": "npm:^5.7.0" + "@ethersproject/json-wallets": "npm:^5.7.0" + "@ethersproject/keccak256": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + "@ethersproject/properties": "npm:^5.7.0" + "@ethersproject/random": "npm:^5.7.0" + "@ethersproject/signing-key": "npm:^5.7.0" + "@ethersproject/transactions": "npm:^5.7.0" + "@ethersproject/wordlists": "npm:^5.7.0" + checksum: ac30685185332036adc41bae3517ed9b449c1bf16f8ee7944f831e8cec9e4c5180da4356afc2cd31d5a705bb2fe71d0b7f42fd72aeae886c083c7bdb18e3b387 + languageName: node + linkType: hard + +"@ethersproject/web@npm:5.7.1, @ethersproject/web@npm:^5.7.0": + version: 5.7.1 + resolution: "@ethersproject/web@npm:5.7.1" + dependencies: + "@ethersproject/base64": "npm:^5.7.0" + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + "@ethersproject/properties": "npm:^5.7.0" + "@ethersproject/strings": "npm:^5.7.0" + checksum: 916275c181114ddadaa063d83d1b34817f0fdf996f0b79ddc6204c281883119c095469592babacba4386ec7fa0e1c1ab689d0a56ca267c342fb8f36dc8a7ebff + languageName: node + linkType: hard + +"@ethersproject/wordlists@npm:5.7.0, @ethersproject/wordlists@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/wordlists@npm:5.7.0" + dependencies: + "@ethersproject/bytes": "npm:^5.7.0" + "@ethersproject/hash": "npm:^5.7.0" + "@ethersproject/logger": "npm:^5.7.0" + "@ethersproject/properties": "npm:^5.7.0" + "@ethersproject/strings": "npm:^5.7.0" + checksum: d91fd7360089e8867e40cc0b9395493a310816cc161430bb66d6424df5f03f222350b3c4409418dc6eca543fe4c79995cd8ef2d9933b979ed340866c30f2fe77 + languageName: node + linkType: hard + +"@gar/promisify@npm:^1.1.3": + version: 1.1.3 + resolution: "@gar/promisify@npm:1.1.3" + checksum: 3fadc40481a783ddb90397f5759f92650b57465f7a4a778056bd24b47060595012e9181a55ae547d57a893d37d9776abe9e368f1f6918e37225eb6a83f9a75f8 + languageName: node + linkType: hard + +"@graphql-typed-document-node/core@npm:^3.1.1": + version: 3.2.0 + resolution: "@graphql-typed-document-node/core@npm:3.2.0" + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 9775c4e54324d6ce6ad505940a0c351ee42899088f436702476b3b93eaa60f7f646c459657d08a9e8793a91067cd55c18e1091bf2045b346f2e55fb37a1e8baa + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.11.8": + version: 0.11.8 + resolution: "@humanwhocodes/config-array@npm:0.11.8" + dependencies: + "@humanwhocodes/object-schema": "npm:^1.2.1" + debug: "npm:^4.1.1" + minimatch: "npm:^3.0.5" + checksum: 010892ba3c237e96562df1f21a7e04b611274f2c91b4df6c8263eb7d2ffcec3a5bfcab67b13d9c4acc8a2e3f94cb61d7ced772ecd445b226fb41b88c93e9194c + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 5127055802733906004cf372457fadd0f3d800cfdd3dd39d2291e06f5c44ccc47daa2f22b9f483409f15b0a9ff5e1646deb5570ff43e08ef021f865e42b74608 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^1.2.1": + version: 1.2.1 + resolution: "@humanwhocodes/object-schema@npm:1.2.1" + checksum: c860f96faaaaecd6c5c4ee6912f7c761579031b464c3cf55832e59e18b116968d89b570ef6a9a10b1670a67e7998a530c8c549b4a41b118153340772ad10cea9 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.0.3": + version: 3.1.1 + resolution: "@jridgewell/resolve-uri@npm:3.1.1" + checksum: b3229d85678a8546e48580decab7666678ab7e1c470576e72bd07910b862642f700c802ff99c0166982fc7f6ad3571c0ce59901be38297b595c0c813cf79e9ce + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: b71b5eeb0af50fb1dbdf18e88aa5cf755baa30723f0d5fd2ac069f861d0c73b12b968321314e4db86d5a4d5d89a292211f68ba94767c620fee35247a94c05890 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.0.3" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + checksum: 542c5f0f0ae874121e9de649581f9619cc0c65e33292e1285f1233f5ff3e41e6f4f216d69a4c3f800b4d6db208ff6c710307e19e1ff170ed5304807e346e6cf9 + languageName: node + linkType: hard + +"@metamask/eth-sig-util@npm:^4.0.0": + version: 4.0.1 + resolution: "@metamask/eth-sig-util@npm:4.0.1" + dependencies: + ethereumjs-abi: "npm:^0.6.8" + ethereumjs-util: "npm:^6.2.1" + ethjs-util: "npm:^0.1.6" + tweetnacl: "npm:^1.0.3" + tweetnacl-util: "npm:^0.15.1" + checksum: 47398021bffb0692eaedffee0aff6befaa389411bebdb4499febe9b2b57251a2748e3ec60792c135122bd5ebb2b7d7bddcfd3ef5123f529030bd19d0da17736f + languageName: node + linkType: hard + +"@noble/hashes@npm:1.2.0, @noble/hashes@npm:~1.2.0": + version: 1.2.0 + resolution: "@noble/hashes@npm:1.2.0" + checksum: f8104dac4d87219249652ecb077185d9a9d059dca6366d669264ec0a3589469746db0ea44365bd2047794d7dc10f24f6822d29ba36277e85eb0a35321deeb0fa + languageName: node + linkType: hard + +"@noble/secp256k1@npm:1.7.1, @noble/secp256k1@npm:~1.7.0": + version: 1.7.1 + resolution: "@noble/secp256k1@npm:1.7.1" + checksum: ed3918e72789cfb17ef2b80c998731697ed8ea4abca53e35f7f0ead86a08201fd8ec5a72be44dff7220d0ecb0a7cb882d2a5735c74a16efcd673e4d9fb5be50b + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 5f309a3b375738e97d4f3cf73ace218690d5a1cfdf98202c6b46bfda61f4317e0e0036c81b040b147e7d1632c7da2e2462e47660de428917cacaebfa2a0a20c7 + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 594d04bcf578d15af65b510dbd9c0dc2458d2a7ef1b403924f22f64d397e965efa8c6854b3fee3395244ae642e28d896ab9d04c5ee5c46ef4fda1d48eaaef19c + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 3542284aa2d6e313cfd4ae40a2502b53e1f35da6f4f9890422aad018c04866f6bfb96c4105e23dbd9fb93cfc630cc607777df658a3a525d63a3bfb9bcb2b0f21 + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-block@npm:5.0.1": + version: 5.0.1 + resolution: "@nomicfoundation/ethereumjs-block@npm:5.0.1" + dependencies: + "@nomicfoundation/ethereumjs-common": "npm:4.0.1" + "@nomicfoundation/ethereumjs-rlp": "npm:5.0.1" + "@nomicfoundation/ethereumjs-trie": "npm:6.0.1" + "@nomicfoundation/ethereumjs-tx": "npm:5.0.1" + "@nomicfoundation/ethereumjs-util": "npm:9.0.1" + ethereum-cryptography: "npm:0.1.3" + ethers: "npm:^5.7.1" + checksum: 0fdaf28ac43d58652e0cec9255045b584c9dee2f3f1ad378c44e7f996ab91bf9d454577abaece87c47d1298dd9489f3723d2a726e44432259f10fc8dc35c0221 + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-blockchain@npm:7.0.1": + version: 7.0.1 + resolution: "@nomicfoundation/ethereumjs-blockchain@npm:7.0.1" + dependencies: + "@nomicfoundation/ethereumjs-block": "npm:5.0.1" + "@nomicfoundation/ethereumjs-common": "npm:4.0.1" + "@nomicfoundation/ethereumjs-ethash": "npm:3.0.1" + "@nomicfoundation/ethereumjs-rlp": "npm:5.0.1" + "@nomicfoundation/ethereumjs-trie": "npm:6.0.1" + "@nomicfoundation/ethereumjs-tx": "npm:5.0.1" + "@nomicfoundation/ethereumjs-util": "npm:9.0.1" + abstract-level: "npm:^1.0.3" + debug: "npm:^4.3.3" + ethereum-cryptography: "npm:0.1.3" + level: "npm:^8.0.0" + lru-cache: "npm:^5.1.1" + memory-level: "npm:^1.0.0" + checksum: 4834c94c3cfa7a8d5c58f700ffdc7ccd65ab2bcb061a02d7feedf82e4d18b7550137223fb55e13841c49b6fd405e2ccfd882313a1d707a59f24297383f83601e + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-common@npm:4.0.1": + version: 4.0.1 + resolution: "@nomicfoundation/ethereumjs-common@npm:4.0.1" + dependencies: + "@nomicfoundation/ethereumjs-util": "npm:9.0.1" + crc-32: "npm:^1.2.0" + checksum: 77cbfdac93042bfc4c57d473ce059c6edee02c74b3ef5a113c6adb41e0acd4b1e372e56cee9750d8321421571c063ff7983aa1d7f92e6f55b2d8f3c5d97415d4 + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-ethash@npm:3.0.1": + version: 3.0.1 + resolution: "@nomicfoundation/ethereumjs-ethash@npm:3.0.1" + dependencies: + "@nomicfoundation/ethereumjs-block": "npm:5.0.1" + "@nomicfoundation/ethereumjs-rlp": "npm:5.0.1" + "@nomicfoundation/ethereumjs-util": "npm:9.0.1" + abstract-level: "npm:^1.0.3" + bigint-crypto-utils: "npm:^3.0.23" + ethereum-cryptography: "npm:0.1.3" + checksum: 0f01e9d8f276499408d19bcebb347e2c9b58fed1366d8fa00e74ef98d3f5ab1642b1ede8374b950ac4664f72b09aa6b589039a0bc98217bb1ffe356f2cc9deb4 + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-evm@npm:2.0.1": + version: 2.0.1 + resolution: "@nomicfoundation/ethereumjs-evm@npm:2.0.1" + dependencies: + "@ethersproject/providers": "npm:^5.7.1" + "@nomicfoundation/ethereumjs-common": "npm:4.0.1" + "@nomicfoundation/ethereumjs-tx": "npm:5.0.1" + "@nomicfoundation/ethereumjs-util": "npm:9.0.1" + debug: "npm:^4.3.3" + ethereum-cryptography: "npm:0.1.3" + mcl-wasm: "npm:^0.7.1" + rustbn.js: "npm:~0.2.0" + checksum: 60f10a6ffb588c0e5b666acfacddac04b5fe22ca63e3e10fd2e1370e0fa60be429cfe87c3b951a5e23b765b03969b3126551a6c470211524a9c792b1fe114c74 + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-rlp@npm:5.0.1": + version: 5.0.1 + resolution: "@nomicfoundation/ethereumjs-rlp@npm:5.0.1" + bin: + rlp: bin/rlp + checksum: 8035472298529eeac1bf2bf3ecc8ba00f46b9103e759b9f6916dcbe0ec07d6f9d70c3c398c891a8a68555e66581f84adbcc89dac727c78ad611c24d0b5423ae5 + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-statemanager@npm:2.0.1": + version: 2.0.1 + resolution: "@nomicfoundation/ethereumjs-statemanager@npm:2.0.1" + dependencies: + "@nomicfoundation/ethereumjs-common": "npm:4.0.1" + "@nomicfoundation/ethereumjs-rlp": "npm:5.0.1" + debug: "npm:^4.3.3" + ethereum-cryptography: "npm:0.1.3" + ethers: "npm:^5.7.1" + js-sdsl: "npm:^4.1.4" + checksum: 6cdc064be3e0225205bbed943895920845c6b6749dc91616153ac9f936cb70a2dd5912316cf39c4824b980a2eb634c5afb1622d862d9ef3bdd5f4243aa5b3091 + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-trie@npm:6.0.1": + version: 6.0.1 + resolution: "@nomicfoundation/ethereumjs-trie@npm:6.0.1" + dependencies: + "@nomicfoundation/ethereumjs-rlp": "npm:5.0.1" + "@nomicfoundation/ethereumjs-util": "npm:9.0.1" + "@types/readable-stream": "npm:^2.3.13" + ethereum-cryptography: "npm:0.1.3" + readable-stream: "npm:^3.6.0" + checksum: 2d7a71d7b2111c1afcb05aca80a27ab959421f0724104e3270786f0322d32fee509a0ee9a2d19d60e19f6acc260551f72083c707b89a8682c0ad39e8ca152b2f + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-tx@npm:5.0.1": + version: 5.0.1 + resolution: "@nomicfoundation/ethereumjs-tx@npm:5.0.1" + dependencies: + "@chainsafe/ssz": "npm:^0.9.2" + "@ethersproject/providers": "npm:^5.7.2" + "@nomicfoundation/ethereumjs-common": "npm:4.0.1" + "@nomicfoundation/ethereumjs-rlp": "npm:5.0.1" + "@nomicfoundation/ethereumjs-util": "npm:9.0.1" + ethereum-cryptography: "npm:0.1.3" + checksum: be54d5ccfa60406d0c159ad9e9dc44be9200fad04d24f934e5b0eb5a29ca70249edef2f64f05358b713f5445d36607a31218f9b6836f440f7bb27966d8009f2e + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-util@npm:9.0.1": + version: 9.0.1 + resolution: "@nomicfoundation/ethereumjs-util@npm:9.0.1" + dependencies: + "@chainsafe/ssz": "npm:^0.10.0" + "@nomicfoundation/ethereumjs-rlp": "npm:5.0.1" + ethereum-cryptography: "npm:0.1.3" + checksum: 21f07c04ea74058b5064ba421d0315d6bcdeafe8c2a17f3c5204e758783e7abff86642e6cd6fa167d0ff0c2ea26ca2204668c771ed4192f6fd8a61ebd1ba528c + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-vm@npm:7.0.1": + version: 7.0.1 + resolution: "@nomicfoundation/ethereumjs-vm@npm:7.0.1" + dependencies: + "@nomicfoundation/ethereumjs-block": "npm:5.0.1" + "@nomicfoundation/ethereumjs-blockchain": "npm:7.0.1" + "@nomicfoundation/ethereumjs-common": "npm:4.0.1" + "@nomicfoundation/ethereumjs-evm": "npm:2.0.1" + "@nomicfoundation/ethereumjs-rlp": "npm:5.0.1" + "@nomicfoundation/ethereumjs-statemanager": "npm:2.0.1" + "@nomicfoundation/ethereumjs-trie": "npm:6.0.1" + "@nomicfoundation/ethereumjs-tx": "npm:5.0.1" + "@nomicfoundation/ethereumjs-util": "npm:9.0.1" + debug: "npm:^4.3.3" + ethereum-cryptography: "npm:0.1.3" + mcl-wasm: "npm:^0.7.1" + rustbn.js: "npm:~0.2.0" + checksum: 00fda3577df1c5ee3ac14d4b0ee79159f50f97ae1e929882ed5a2c40e8994864cd0b2c70d284dd66bca97f9d8a7086cffc481d6e9b6fc3dd8be5c711df12bba0 + languageName: node + linkType: hard + +"@nomicfoundation/hardhat-network-helpers@npm:^1.0.6": + version: 1.0.8 + resolution: "@nomicfoundation/hardhat-network-helpers@npm:1.0.8" + dependencies: + ethereumjs-util: "npm:^7.1.4" + peerDependencies: + hardhat: ^2.9.5 + checksum: c45d1d16e8a2eee8b20f54ebc428960bd4d352d0a527f293745d53cda0e3c48a1a2d0d12111e91383fe155a572945c9649cfbcb703ab4f35de9eb8178decbfe0 + languageName: node + linkType: hard + +"@nomicfoundation/solidity-analyzer-darwin-arm64@npm:0.1.1": + version: 0.1.1 + resolution: "@nomicfoundation/solidity-analyzer-darwin-arm64@npm:0.1.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@nomicfoundation/solidity-analyzer-darwin-x64@npm:0.1.1": + version: 0.1.1 + resolution: "@nomicfoundation/solidity-analyzer-darwin-x64@npm:0.1.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@nomicfoundation/solidity-analyzer-freebsd-x64@npm:0.1.1": + version: 0.1.1 + resolution: "@nomicfoundation/solidity-analyzer-freebsd-x64@npm:0.1.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@npm:0.1.1": + version: 0.1.1 + resolution: "@nomicfoundation/solidity-analyzer-linux-arm64-gnu@npm:0.1.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@npm:0.1.1": + version: 0.1.1 + resolution: "@nomicfoundation/solidity-analyzer-linux-arm64-musl@npm:0.1.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@npm:0.1.1": + version: 0.1.1 + resolution: "@nomicfoundation/solidity-analyzer-linux-x64-gnu@npm:0.1.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@npm:0.1.1": + version: 0.1.1 + resolution: "@nomicfoundation/solidity-analyzer-linux-x64-musl@npm:0.1.1" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@npm:0.1.1": + version: 0.1.1 + resolution: "@nomicfoundation/solidity-analyzer-win32-arm64-msvc@npm:0.1.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@npm:0.1.1": + version: 0.1.1 + resolution: "@nomicfoundation/solidity-analyzer-win32-ia32-msvc@npm:0.1.1" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@npm:0.1.1": + version: 0.1.1 + resolution: "@nomicfoundation/solidity-analyzer-win32-x64-msvc@npm:0.1.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@nomicfoundation/solidity-analyzer@npm:^0.1.0": + version: 0.1.1 + resolution: "@nomicfoundation/solidity-analyzer@npm:0.1.1" + dependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64": "npm:0.1.1" + "@nomicfoundation/solidity-analyzer-darwin-x64": "npm:0.1.1" + "@nomicfoundation/solidity-analyzer-freebsd-x64": "npm:0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "npm:0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "npm:0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "npm:0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "npm:0.1.1" + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "npm:0.1.1" + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "npm:0.1.1" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "npm:0.1.1" + dependenciesMeta: + "@nomicfoundation/solidity-analyzer-darwin-arm64": + optional: true + "@nomicfoundation/solidity-analyzer-darwin-x64": + optional: true + "@nomicfoundation/solidity-analyzer-freebsd-x64": + optional: true + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": + optional: true + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": + optional: true + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": + optional: true + "@nomicfoundation/solidity-analyzer-linux-x64-musl": + optional: true + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": + optional: true + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": + optional: true + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": + optional: true + checksum: efa1c650341c668b56d3102df3277c837b719a14c0329f26174740bf8db3969d4422195e0379a67269597d7d9b1d771e89f0bdfcd9e172b7a4ceb61d1ad81551 + languageName: node + linkType: hard + +"@nomiclabs/hardhat-ethers@npm:^2.2.1": + version: 2.2.3 + resolution: "@nomiclabs/hardhat-ethers@npm:2.2.3" + peerDependencies: + ethers: ^5.0.0 + hardhat: ^2.0.0 + checksum: f16b8093d7a8bddf07b5ba54235f3d7d8c1084fe51812ee6427eafd32e7aeae6ee8b192b1927531017e7bbcd849664c873c3a5cee4227a0114a1c2cc2e525a5e + languageName: node + linkType: hard + +"@nomiclabs/hardhat-etherscan@npm:^3.1.2": + version: 3.1.7 + resolution: "@nomiclabs/hardhat-etherscan@npm:3.1.7" + dependencies: + "@ethersproject/abi": "npm:^5.1.2" + "@ethersproject/address": "npm:^5.0.2" + cbor: "npm:^8.1.0" + chalk: "npm:^2.4.2" + debug: "npm:^4.1.1" + fs-extra: "npm:^7.0.1" + lodash: "npm:^4.17.11" + semver: "npm:^6.3.0" + table: "npm:^6.8.0" + undici: "npm:^5.14.0" + peerDependencies: + hardhat: ^2.0.4 + checksum: d9bdaadd3b67dcf9f49c9b2a9d4aac03e25ea500c2312b9c280e320af437f5c0e7869c49126f573692d87ea4d52d4c7a6ded7798fbf3fdbd037f9ceae0850278 + languageName: node + linkType: hard + +"@nomiclabs/hardhat-vyper@npm:^3.0.3": + version: 3.0.3 + resolution: "@nomiclabs/hardhat-vyper@npm:3.0.3" + dependencies: + debug: "npm:^4.1.1" + fs-extra: "npm:^7.0.1" + io-ts: "npm:1.10.4" + lodash: "npm:^4.17.11" + semver: "npm:^6.3.0" + peerDependencies: + hardhat: ^2.8.3 + checksum: da2794403bd56d9e07f7ca1be95194fb9ba02f3292dab6f9f81f4b24f98711381721a75db87004dc976f2e631b3864266a46a8dc9d53f6c9919ec0980c864d66 + languageName: node + linkType: hard + +"@nomiclabs/hardhat-waffle@npm:^2.0.5": + version: 2.0.5 + resolution: "@nomiclabs/hardhat-waffle@npm:2.0.5" + peerDependencies: + "@nomiclabs/hardhat-ethers": ^2.0.0 + ethereum-waffle: "*" + ethers: ^5.0.0 + hardhat: ^2.0.0 + checksum: 25a828b14268ca77b780aa4d82900ad720501079615b5d0fd870cb82f82cf29c57665603c51af54fdbcdd8461497280fc7e89af241462578273346c3c83c9e45 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^2.1.0": + version: 2.1.2 + resolution: "@npmcli/fs@npm:2.1.2" + dependencies: + "@gar/promisify": "npm:^1.1.3" + semver: "npm:^7.3.5" + checksum: 82bc61f832f45e2033ea3522f66a94de50e5561577b1f3af226576ad5467c240375eba948d4ea1ca146e7871740fb3005e7c4f3f1ab616e79a5a5cedd9fdb789 + languageName: node + linkType: hard + +"@npmcli/move-file@npm:^2.0.0": + version: 2.0.1 + resolution: "@npmcli/move-file@npm:2.0.1" + dependencies: + mkdirp: "npm:^1.0.4" + rimraf: "npm:^3.0.2" + checksum: 3557a12cd18dfb5bcd5d5cf910b783832af50ffba28fd5bb510c3c56b2df0481558b9ec6d3008e8eeefb9f2944bdc1d34832b1a8bbf6ad1cd2f256bf12c84ff0 + languageName: node + linkType: hard + +"@resolver-engine/core@npm:^0.3.3": + version: 0.3.3 + resolution: "@resolver-engine/core@npm:0.3.3" + dependencies: + debug: "npm:^3.1.0" + is-url: "npm:^1.2.4" + request: "npm:^2.85.0" + checksum: 3b80c420bb612583caa75773cb15e7d74b40826b754c65f78935ac1525a38ce3b9f9127802a7018bf9c8a42b9982ec8c63d8bec26b09f236fb7869a2bdfc3475 + languageName: node + linkType: hard + +"@resolver-engine/fs@npm:^0.3.3": + version: 0.3.3 + resolution: "@resolver-engine/fs@npm:0.3.3" + dependencies: + "@resolver-engine/core": "npm:^0.3.3" + debug: "npm:^3.1.0" + checksum: 6199eb94cbc30c6bcee4bb44143954464b7b3d111677141af5b0d869b0a19eca10c12e2a7e2596d851813791e97a58d9df62211e338fac7ef16d3cb4c29c1917 + languageName: node + linkType: hard + +"@resolver-engine/imports-fs@npm:^0.3.3": + version: 0.3.3 + resolution: "@resolver-engine/imports-fs@npm:0.3.3" + dependencies: + "@resolver-engine/fs": "npm:^0.3.3" + "@resolver-engine/imports": "npm:^0.3.3" + debug: "npm:^3.1.0" + checksum: 7f29d0ff0dadf59c60f9eb54c03787354136f9cb6a837a9a575adf83d64b4fe3a0f983fc36bd404928c7acfd57536889e1545c7fc9504dce5b4887c10be6b138 + languageName: node + linkType: hard + +"@resolver-engine/imports@npm:^0.3.3": + version: 0.3.3 + resolution: "@resolver-engine/imports@npm:0.3.3" + dependencies: + "@resolver-engine/core": "npm:^0.3.3" + debug: "npm:^3.1.0" + hosted-git-info: "npm:^2.6.0" + path-browserify: "npm:^1.0.0" + url: "npm:^0.11.0" + checksum: dac16d525f0161ab4150504e9c885586b99b41ca9062030a84cc81c1ee5c6af0ffa957c5a71e32e255bd434b09b1401f407eda1ba5d75500f794aae511c42f9b + languageName: node + linkType: hard + +"@scure/base@npm:~1.1.0": + version: 1.1.1 + resolution: "@scure/base@npm:1.1.1" + checksum: 660e4a6c9ad3104c05c8bb3dd4c9f19a0ec1a6d45d68c3e7f418414660e13fe7d389201f347c1a1eefb19ec10ef09e32920e503f48d85b445aa8d43f419907bd + languageName: node + linkType: hard + +"@scure/bip32@npm:1.1.5": + version: 1.1.5 + resolution: "@scure/bip32@npm:1.1.5" + dependencies: + "@noble/hashes": "npm:~1.2.0" + "@noble/secp256k1": "npm:~1.7.0" + "@scure/base": "npm:~1.1.0" + checksum: b642658f7e6807d1c1f9862e2a9c439a2c98cf4e8db311d67b171862c96aab4d0b9238847ef81289c04befb74952eaf843a03972f52452c3d08bfe4c94e961e1 + languageName: node + linkType: hard + +"@scure/bip39@npm:1.1.1": + version: 1.1.1 + resolution: "@scure/bip39@npm:1.1.1" + dependencies: + "@noble/hashes": "npm:~1.2.0" + "@scure/base": "npm:~1.1.0" + checksum: c9f3994042dd1d135be54e958d41e67a1e13a4f06b304632ffabe3ce99e2a8bdc1e20fe8d482efe13785bfc4fa1d47ef5331017767f66bc84c40fe79a4c13352 + languageName: node + linkType: hard + +"@sentry/core@npm:5.30.0": + version: 5.30.0 + resolution: "@sentry/core@npm:5.30.0" + dependencies: + "@sentry/hub": "npm:5.30.0" + "@sentry/minimal": "npm:5.30.0" + "@sentry/types": "npm:5.30.0" + "@sentry/utils": "npm:5.30.0" + tslib: "npm:^1.9.3" + checksum: 65721e9c90d048a03a0ff72f1e234a5b7e9978ab9cd59c1da9185035a7e6c065579f9b96e73490fa24af53bd8ed7b957e2b2a8b1ce21a6cc67ad38e39bb1b3f7 + languageName: node + linkType: hard + +"@sentry/hub@npm:5.30.0": + version: 5.30.0 + resolution: "@sentry/hub@npm:5.30.0" + dependencies: + "@sentry/types": "npm:5.30.0" + "@sentry/utils": "npm:5.30.0" + tslib: "npm:^1.9.3" + checksum: 20985c16a82ab57496c73c514623cb4419650b0eb7ba91c40040b470684da0a850279496e3bf95380e6159e138a64e8103bcbbcdd852eee4d44bb50ed3b83799 + languageName: node + linkType: hard + +"@sentry/minimal@npm:5.30.0": + version: 5.30.0 + resolution: "@sentry/minimal@npm:5.30.0" + dependencies: + "@sentry/hub": "npm:5.30.0" + "@sentry/types": "npm:5.30.0" + tslib: "npm:^1.9.3" + checksum: ebc74bf79e912ddccb47f471c48899af486c42e91785b49b4957235cdf33726b8ddcc3ecd99ab0570b97ac902861be8159b43efc26c3e19fd1ab780755fd450c + languageName: node + linkType: hard + +"@sentry/node@npm:^5.18.1": + version: 5.30.0 + resolution: "@sentry/node@npm:5.30.0" + dependencies: + "@sentry/core": "npm:5.30.0" + "@sentry/hub": "npm:5.30.0" + "@sentry/tracing": "npm:5.30.0" + "@sentry/types": "npm:5.30.0" + "@sentry/utils": "npm:5.30.0" + cookie: "npm:^0.4.1" + https-proxy-agent: "npm:^5.0.0" + lru_map: "npm:^0.3.3" + tslib: "npm:^1.9.3" + checksum: e4060a2a15c0c0507777444ab2f58c4948e71dfa3c7bd77eaf4563547777bf88bcb691483df2460a1f09d107fec8547493d3bb92f5af37b6eeddec011304b4d1 + languageName: node + linkType: hard + +"@sentry/tracing@npm:5.30.0": + version: 5.30.0 + resolution: "@sentry/tracing@npm:5.30.0" + dependencies: + "@sentry/hub": "npm:5.30.0" + "@sentry/minimal": "npm:5.30.0" + "@sentry/types": "npm:5.30.0" + "@sentry/utils": "npm:5.30.0" + tslib: "npm:^1.9.3" + checksum: cd23a3cc3262ea1bc5982fff2f587af118b12e61b2a6e1fe9cfb3f854998d267a2ba2cf9a30bce079173d6e158f73554a8b9373f3bc03ecda2d7ff30da30936e + languageName: node + linkType: hard + +"@sentry/types@npm:5.30.0": + version: 5.30.0 + resolution: "@sentry/types@npm:5.30.0" + checksum: 0dbfc760359dd277ea92e672322aad4ff576f733f227aa93a70fdcd2880128a10f69381b8a0de63f47028905f08d7306401accb5114fead7c2d10c4f531c2724 + languageName: node + linkType: hard + +"@sentry/utils@npm:5.30.0": + version: 5.30.0 + resolution: "@sentry/utils@npm:5.30.0" + dependencies: + "@sentry/types": "npm:5.30.0" + tslib: "npm:^1.9.3" + checksum: 326b5a8e89a18848975fe02fae8f9848ea6d59a9cf8867c6d35233fc06cee77b660e57552d4ec94c658f9d4290315e34c943177e7725c1568a0597143f65cc7b + languageName: node + linkType: hard + +"@sindresorhus/is@npm:^0.14.0": + version: 0.14.0 + resolution: "@sindresorhus/is@npm:0.14.0" + checksum: e1bdaa32fb78c4c018dfc03f642635b417e4022817fb373997731942bc06c6b62b9be7270da4fc6ba19071af7cb724d7ceb1ede13166ff737a86b299ae83c361 + languageName: node + linkType: hard + +"@sindresorhus/is@npm:^4.0.0": + version: 4.6.0 + resolution: "@sindresorhus/is@npm:4.6.0" + checksum: c4326c4f01370580cf5b1b799d5aabab6cb3b0f7f06aec316bec403796064f3b7c68ebd22361313557bf153346266e133f8dd16b3a95e07650f70843321548f3 + languageName: node + linkType: hard + +"@solidity-parser/parser@npm:^0.14.5": + version: 0.14.5 + resolution: "@solidity-parser/parser@npm:0.14.5" + dependencies: + antlr4ts: "npm:^0.5.0-alpha.4" + checksum: b8086c3e87d75a50fdb7928d5a656bf3cb72aae2d83d8963e85c7cc1bc3553ca1b4d9e36df961e5408ff712b506f3f733453d53ba3e472edd3d1394a018299cb + languageName: node + linkType: hard + +"@solidity-parser/parser@npm:^0.16.0": + version: 0.16.0 + resolution: "@solidity-parser/parser@npm:0.16.0" + dependencies: + antlr4ts: "npm:^0.5.0-alpha.4" + checksum: a5f610d93a4df7482d698ec63034ba5574eb5090201a204b2392664cb1277d7fb06caac04dea27ab3c183589a8e06e84942a44d01040699277fe07b481909b75 + languageName: node + linkType: hard + +"@solidity-parser/parser@npm:^0.8.1": + version: 0.8.2 + resolution: "@solidity-parser/parser@npm:0.8.2" + checksum: a09722c61a9d9d7537f0c3b76d8010a29d3a241c38e0ec5eae3a8eeadd1add260f0862c4a3861a6d64e19941e90ad02299e4131b65ed034904002cb43637792d + languageName: node + linkType: hard + +"@szmarczak/http-timer@npm:^1.1.2": + version: 1.1.2 + resolution: "@szmarczak/http-timer@npm:1.1.2" + dependencies: + defer-to-connect: "npm:^1.0.1" + checksum: 08c340133b8541c827235c01f6cc02d8a3c5e48d5397f4af6127587793067a12833ed903dae60b406b9644702bb1aedc877c7dacb44afe4d4feb9ac7a6919bee + languageName: node + linkType: hard + +"@szmarczak/http-timer@npm:^4.0.5": + version: 4.0.6 + resolution: "@szmarczak/http-timer@npm:4.0.6" + dependencies: + defer-to-connect: "npm:^2.0.0" + checksum: d927951bccbbad4cb713af7378ad4d17b34e48725ea4641ad01f79b310564e3db2b173c4f81cb3b945dbf8b3dbcb4da7b8d0f2e754e79dc1b92c69a18ba0ac41 + languageName: node + linkType: hard + +"@tootallnate/once@npm:2": + version: 2.0.0 + resolution: "@tootallnate/once@npm:2.0.0" + checksum: d9f7f2130a0a2e1ea50f3bc90b83a8b99c913bbb80d7a1706f7f4730292ef299d18443c3b57a42dfb17c6559c9085e13f751b1b6c969bcff7bee3eeaf9da4dec + languageName: node + linkType: hard + +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.9 + resolution: "@tsconfig/node10@npm:1.0.9" + checksum: 6ec0cadbcd7942f64b5d00c4b19ff783410a5f1511c1feefa8e99b5df1e57776c4f2ce058870c9d982a4ca460051dbd2a5e57d11989aab40f6c68e98c92b6d14 + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 2ba331a89b6778df0fb49ab0ba3e809c0a0d5ca3d9f898ba4a0a276043616b6047aec5dd4a5d1ae9a09ff267bcddbbc96d968857e6690583fd474a58c25c2e1c + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 8d04150cdfbe5b89be095586bfa35415800b694f9955274df16b1017e1cef9697467185b3f7c64ed588a7e8d48ff6f4cc3125c8265b5e3d4f757884dcc6facbc + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: d75e4f7d3edd74305383430d1fc9fd9bdf9af7fb2387853e6c06660a5325da6bce90846b853f5c69ec70b4e34de9ab05d508c9dc11c95a28ebbb000fc52b963b + languageName: node + linkType: hard + +"@typechain/ethers-v5@npm:^2.0.0": + version: 2.0.0 + resolution: "@typechain/ethers-v5@npm:2.0.0" + dependencies: + ethers: "npm:^5.0.2" + peerDependencies: + ethers: ^5.0.0 + typechain: ^3.0.0 + checksum: 306a66df0353a1f8439d1bdb98cf78e979b32f4cc5691948b0eb895669121e59c87030eb0999bceb402c4edf0ea597f7897eb9448778df402e4278ad00a98de9 + languageName: node + linkType: hard + +"@types/bn.js@npm:^4.11.3, @types/bn.js@npm:^4.11.5": + version: 4.11.6 + resolution: "@types/bn.js@npm:4.11.6" + dependencies: + "@types/node": "npm:*" + checksum: ff1b3f1d21707fde83e74a4dfb328b577f52a87d5d3ea8acb684c400ea8c2e71d935ca995102cba254c001bce9d5f54a7e13603ce0b19536d79347bfa56e12c4 + languageName: node + linkType: hard + +"@types/bn.js@npm:^5.1.0": + version: 5.1.1 + resolution: "@types/bn.js@npm:5.1.1" + dependencies: + "@types/node": "npm:*" + checksum: 06ea38666cacf96b2055aa97e29c271912ee872f9f3f35d6dca609f06104a27350410364603dbf1dffde93e2220b89f563631a827d133a181860f10a17098603 + languageName: node + linkType: hard + +"@types/cacheable-request@npm:^6.0.1": + version: 6.0.3 + resolution: "@types/cacheable-request@npm:6.0.3" + dependencies: + "@types/http-cache-semantics": "npm:*" + "@types/keyv": "npm:^3.1.4" + "@types/node": "npm:*" + "@types/responselike": "npm:^1.0.0" + checksum: 5f54ee509d84e0c3750c4426096b634efb160eb4c38021f829209475bb9167c6b3bcf3b80417040a811b14e68c5961e78f0f43aea3bed4c249b8cdc602849bd6 + languageName: node + linkType: hard + +"@types/chai@npm:^4": + version: 4.3.5 + resolution: "@types/chai@npm:4.3.5" + checksum: 3fba3f516c45abce7b1478d60a5655aa7f2e04a77d0603c1396f060af98feebd914683e501fac4d993670067c320adf20ad64fbbde9608412520f0887603fdef + languageName: node + linkType: hard + +"@types/http-cache-semantics@npm:*": + version: 4.0.1 + resolution: "@types/http-cache-semantics@npm:4.0.1" + checksum: 04aacd353b3823dea511927aa0b0a519a16a876aab4f6cc545828cafcadebddc631dcb1e1a949a09f1c30d37c5512e60e69469e22a75213ff1abf349deaad433 + languageName: node + linkType: hard + +"@types/json-schema@npm:^7.0.9": + version: 7.0.11 + resolution: "@types/json-schema@npm:7.0.11" + checksum: 8e5c6dd393411418e3d803ab0a09862b4ed47f73e7ed990f3b907dd41cc4d2f2b4f7aed9a39c7fd2acaa80314ac1397a5e2e5e6c25a338f01bbfba708cc70d8e + languageName: node + linkType: hard + +"@types/keyv@npm:^3.1.1, @types/keyv@npm:^3.1.4": + version: 3.1.4 + resolution: "@types/keyv@npm:3.1.4" + dependencies: + "@types/node": "npm:*" + checksum: c1fbfe6e2a8c82656c8fc5782d937c82ed336cdca451c4d7a8d08d245531ad21572024d621b38071d34cfb7461702eea79fcf222a03264f00564d75e78bd348d + languageName: node + linkType: hard + +"@types/lodash.range@npm:^3.2.7": + version: 3.2.7 + resolution: "@types/lodash.range@npm:3.2.7" + dependencies: + "@types/lodash": "npm:*" + checksum: bd52c6aee9d50fd1143a9a2ebd4bbcbe67a6687a1d3144472caaa5bd7181083786e9fa6b7ca7115681bffd26958bebb7f0f308b17ffc8c91107f35e89dd99a00 + languageName: node + linkType: hard + +"@types/lodash@npm:*, @types/lodash@npm:^4.14.186": + version: 4.14.194 + resolution: "@types/lodash@npm:4.14.194" + checksum: 64473e6735e51c3f8be18ef907a086f5a9c967117270c573d2b8fdc012b067c4de016a7b030abd6170aa5370f5ecbada19e646c82d9feb7403a080d53cfc86f3 + languageName: node + linkType: hard + +"@types/lru-cache@npm:^5.1.0": + version: 5.1.1 + resolution: "@types/lru-cache@npm:5.1.1" + checksum: 489e4db474be761e347305bcecb443762bdabdd50a6c5aabced24f3c280a748ce3f599c4a5a95d2ff371f931386af5d393127ca3d1172cd95d7aab73d074d479 + languageName: node + linkType: hard + +"@types/mkdirp@npm:^0.5.2": + version: 0.5.2 + resolution: "@types/mkdirp@npm:0.5.2" + dependencies: + "@types/node": "npm:*" + checksum: 7a084a6d2c2042db03c777c2aa02bdb55ffbc347c3a3adc08fd0f01b2ca84767d9c92fe61768501a5908fe8b6e4a7e0e4aa64de49372177b040c245951d66479 + languageName: node + linkType: hard + +"@types/mocha@npm:^10": + version: 10.0.1 + resolution: "@types/mocha@npm:10.0.1" + checksum: 2aa6d54641ec226e57c4ee5304f6ca3c92d1d78b16c2ecd015ce19a2f4c648b0753f33802468c136e63caaadc7f365962dc404380e8f9903a9c0b10485ed187b + languageName: node + linkType: hard + +"@types/node-fetch@npm:^2.5.5, @types/node-fetch@npm:^2.6.2": + version: 2.6.3 + resolution: "@types/node-fetch@npm:2.6.3" + dependencies: + "@types/node": "npm:*" + form-data: "npm:^3.0.0" + checksum: 727026e70cfb6e1b5839cf3dc0a69984294a685ad48f22b466f36011ba5cacaee74511a124e10318a395ff28ddb8ed9f6b7467930cf8158b159164047084e411 + languageName: node + linkType: hard + +"@types/node@npm:*": + version: 20.1.3 + resolution: "@types/node@npm:20.1.3" + checksum: 69eeb75b3c5452116792ffbe9143ed7ed561c1d37887af216926cd30dac5926b6d5e092aa673d80c7af917f315d422bb56ff43b42a1c3727fe34a32b1201940b + languageName: node + linkType: hard + +"@types/node@npm:^12.12.6": + version: 12.20.55 + resolution: "@types/node@npm:12.20.55" + checksum: 9b27dda0808201182f3b075fb38fff9cf5365fe906728a82d23257546ddb9899874f49606d495deb22e39338ddcb1bc381382b799181b3f1faf314c6ec8aa05f + languageName: node + linkType: hard + +"@types/node@npm:^14.14.31": + version: 14.18.46 + resolution: "@types/node@npm:14.18.46" + checksum: 737160b8df4aafe3d1bdab4d5425e01d48fc67dfa296fffa3a7b17d359dea198bbb1652e7cfbb277a0646d59fd9955e3a11119c2e828ef7e44e8bb28134e1de2 + languageName: node + linkType: hard + +"@types/pbkdf2@npm:^3.0.0": + version: 3.1.0 + resolution: "@types/pbkdf2@npm:3.1.0" + dependencies: + "@types/node": "npm:*" + checksum: 1c62f0fa0efe18a7972512fd10246106085181576bd79c8b4afbd8a48f5f73c0731162494b4940555e680cb7c0a02e3d71c0ff88a6a8cac8e3bc2488af70e726 + languageName: node + linkType: hard + +"@types/prettier@npm:^2.1.1": + version: 2.7.2 + resolution: "@types/prettier@npm:2.7.2" + checksum: d4d09d291ec7017ed30cc2bac5a51dbd5de02e2d75389a4c724ac6c3d7bb99da3173f57247d832b8f83c154dc8006cbdc35e565c1f1bf6869718d25857e430db + languageName: node + linkType: hard + +"@types/readable-stream@npm:^2.3.13": + version: 2.3.15 + resolution: "@types/readable-stream@npm:2.3.15" + dependencies: + "@types/node": "npm:*" + safe-buffer: "npm:~5.1.1" + checksum: 3901740754b23881c7634623626294d5efcf25158a4eed8bb8ce9861d6e69585704ee9e0aa77c4ca47caf4711f1ebcf589f6d592558b1d83511e24474ee9b637 + languageName: node + linkType: hard + +"@types/resolve@npm:^0.0.8": + version: 0.0.8 + resolution: "@types/resolve@npm:0.0.8" + dependencies: + "@types/node": "npm:*" + checksum: 36404026ceae29726e48ce37ff835f52285d1efcf5cde1a79f3cfe49f67e7b3952cf1a7c14ff6fa18205e9840cd7ecb0a53a49323580748b7825d687b0f9bba3 + languageName: node + linkType: hard + +"@types/responselike@npm:^1.0.0": + version: 1.0.0 + resolution: "@types/responselike@npm:1.0.0" + dependencies: + "@types/node": "npm:*" + checksum: f6e2bc61d2fbeabfd6c5df826e87832aa89f7b190dc993503ff1bbc19608ba75223f4c41c22bfb9500b66e36bf00e7a2c2c0af9e6abba6c2e5bad808eb324d2c + languageName: node + linkType: hard + +"@types/secp256k1@npm:^4.0.1": + version: 4.0.3 + resolution: "@types/secp256k1@npm:4.0.3" + dependencies: + "@types/node": "npm:*" + checksum: de08145aaf2c32db6f5ef4384b3a0db139ba84e72eda9677e5cbbdb3eac4b40e109db34b550159532042d6b92f08d580d7490c67eaa810044236ca7e1582752d + languageName: node + linkType: hard + +"@types/semver@npm:^7.3.12": + version: 7.5.0 + resolution: "@types/semver@npm:7.5.0" + checksum: dac255fae68157aec375fdb79d483a161c1b9c58e0ab9e18936dd1e9b89dd0ff85d64e482b1505de7e17455b404a0a530c4f9ddd6f21d333c2311c0068687b14 + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^5.41.0": + version: 5.59.5 + resolution: "@typescript-eslint/eslint-plugin@npm:5.59.5" + dependencies: + "@eslint-community/regexpp": "npm:^4.4.0" + "@typescript-eslint/scope-manager": "npm:5.59.5" + "@typescript-eslint/type-utils": "npm:5.59.5" + "@typescript-eslint/utils": "npm:5.59.5" + debug: "npm:^4.3.4" + grapheme-splitter: "npm:^1.0.4" + ignore: "npm:^5.2.0" + natural-compare-lite: "npm:^1.4.0" + semver: "npm:^7.3.7" + tsutils: "npm:^3.21.0" + peerDependencies: + "@typescript-eslint/parser": ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 4405f929e8f0a140601b9e8ca0b013851398605487f2f47dc16349b977e9d701f823f1af7e721d601b0f24013ef247056b569c3b11813fb343243ce655bb5c3d + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^5.41.0": + version: 5.59.5 + resolution: "@typescript-eslint/parser@npm:5.59.5" + dependencies: + "@typescript-eslint/scope-manager": "npm:5.59.5" + "@typescript-eslint/types": "npm:5.59.5" + "@typescript-eslint/typescript-estree": "npm:5.59.5" + debug: "npm:^4.3.4" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: b8e3b56875f802d6cbe3c0f5ec01d268b1f2741931e769ff233a6ce3cbc5f45ec54cb775064cc98d9239e54801d390f87b0a1b62356b393589d429f80e7aabbe + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:5.59.5": + version: 5.59.5 + resolution: "@typescript-eslint/scope-manager@npm:5.59.5" + dependencies: + "@typescript-eslint/types": "npm:5.59.5" + "@typescript-eslint/visitor-keys": "npm:5.59.5" + checksum: 08472ca4ade28f94ba2f1acaa094724d39452b9c5063781fe2fe1c2742c880af3c0291ea01048768d7ebb1165962bad90ad33243e79a634ba873d6d31e638dac + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:5.59.5": + version: 5.59.5 + resolution: "@typescript-eslint/type-utils@npm:5.59.5" + dependencies: + "@typescript-eslint/typescript-estree": "npm:5.59.5" + "@typescript-eslint/utils": "npm:5.59.5" + debug: "npm:^4.3.4" + tsutils: "npm:^3.21.0" + peerDependencies: + eslint: "*" + peerDependenciesMeta: + typescript: + optional: true + checksum: 28325934722af70858f39897bf63cae6d152912750e1815e002b2643e8f6153023e2c40280b60ad96dd048918ce6bf3f18684d4a2b1cf30b3b855cc45c3ed834 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:5.59.5": + version: 5.59.5 + resolution: "@typescript-eslint/types@npm:5.59.5" + checksum: fe3abe4c51918f66b1f0bd2fdac14c52f5d0d30d0d1862952870bea03dbfa417a13dff9229447947aed40b6806f9d14ce23729f943ee21c068cc9028d81c5fed + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:5.59.5": + version: 5.59.5 + resolution: "@typescript-eslint/typescript-estree@npm:5.59.5" + dependencies: + "@typescript-eslint/types": "npm:5.59.5" + "@typescript-eslint/visitor-keys": "npm:5.59.5" + debug: "npm:^4.3.4" + globby: "npm:^11.1.0" + is-glob: "npm:^4.0.3" + semver: "npm:^7.3.7" + tsutils: "npm:^3.21.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: e833fd104f4c9bf7d5890e93b27f336c90e709bdad2920a9767f30ddbfadfcb864304a522797e6bb8d69d9d7df7eb2b9e5dbe71e52c128759d816bb2203c5d07 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:5.59.5": + version: 5.59.5 + resolution: "@typescript-eslint/utils@npm:5.59.5" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@types/json-schema": "npm:^7.0.9" + "@types/semver": "npm:^7.3.12" + "@typescript-eslint/scope-manager": "npm:5.59.5" + "@typescript-eslint/types": "npm:5.59.5" + "@typescript-eslint/typescript-estree": "npm:5.59.5" + eslint-scope: "npm:^5.1.1" + semver: "npm:^7.3.7" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: ee8a44ddc3208901c70f5a214af70ff261a73382b9c01fac3b14e5e09b18860c708565a01bae196e41acff7ab68ea28dfc18678376bba26615a53c75c3e0651e + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:5.59.5": + version: 5.59.5 + resolution: "@typescript-eslint/visitor-keys@npm:5.59.5" + dependencies: + "@typescript-eslint/types": "npm:5.59.5" + eslint-visitor-keys: "npm:^3.3.0" + checksum: a29ff5aabfa1b83bd30778bd509b5dc639fb44b613f474949626b91e262a8981254a14d8cefd50101108e973696cbe8ccf315fe497fa55684f46f955e2ed3361 + languageName: node + linkType: hard + +"@yarnpkg/lockfile@npm:^1.1.0": + version: 1.1.0 + resolution: "@yarnpkg/lockfile@npm:1.1.0" + checksum: 99b0cf35618e556472c7d12dc81b50da38414961a673670f14196583407a0ec2fa83c7fae2514ab1f2c3981eca39673cae37310e67d6a49c9d8a3c0afcad1454 + languageName: node + linkType: hard + +"abbrev@npm:^1.0.0": + version: 1.1.1 + resolution: "abbrev@npm:1.1.1" + checksum: 76e7fb9283b13208d5cf55df46669f9cf5e72007cb66595849be2d5e96c0a43704132d030c5705f9447266183986e1e8a4fc3e9578cb60a1f19cf0157664f957 + languageName: node + linkType: hard + +"abort-controller@npm:^3.0.0": + version: 3.0.0 + resolution: "abort-controller@npm:3.0.0" + dependencies: + event-target-shim: "npm:^5.0.0" + checksum: 336c22d64efef7142681fc2944db3f448d10b2384d816fc90502ea8d32800c854bd9cd586b168e216ba2e5f4cd0bfb431650a6e5dbc18957e614966ca7649764 + languageName: node + linkType: hard + +"abstract-level@npm:^1.0.0, abstract-level@npm:^1.0.2, abstract-level@npm:^1.0.3": + version: 1.0.3 + resolution: "abstract-level@npm:1.0.3" + dependencies: + buffer: "npm:^6.0.3" + catering: "npm:^2.1.0" + is-buffer: "npm:^2.0.5" + level-supports: "npm:^4.0.0" + level-transcoder: "npm:^1.0.1" + module-error: "npm:^1.0.1" + queue-microtask: "npm:^1.2.3" + checksum: 28df83e3a68aa5bdccaf6f4cff7ccb6f977068c48aac3ecebedf4aca3ffc0f31eee8c7a78f7af2b2416bded3bb26cc489f13dfe3264d453f7440737c3a9f9a2b + languageName: node + linkType: hard + +"abstract-leveldown@npm:3.0.0": + version: 3.0.0 + resolution: "abstract-leveldown@npm:3.0.0" + dependencies: + xtend: "npm:~4.0.0" + checksum: cbc4c3f6d0da3b4995845c4ad6765185c74bcd8c03415cc00d5fbb231c95aecd97a897e1d1737dbee8fb233d69cda16dac921bc4348b7a6627d3b81192e92889 + languageName: node + linkType: hard + +"abstract-leveldown@npm:^2.4.1, abstract-leveldown@npm:~2.7.1": + version: 2.7.2 + resolution: "abstract-leveldown@npm:2.7.2" + dependencies: + xtend: "npm:~4.0.0" + checksum: 051ef7adf586e0dfc51f496f333037a4bcd71903f36fade31ac693e4eacb4ee069f46e971413c70fe8e90ee03c573e3d979cbf299134d250762950946d8133fb + languageName: node + linkType: hard + +"abstract-leveldown@npm:^5.0.0, abstract-leveldown@npm:~5.0.0": + version: 5.0.0 + resolution: "abstract-leveldown@npm:5.0.0" + dependencies: + xtend: "npm:~4.0.0" + checksum: 655b8d80a01560ff107f396e7d7e139719abfe8f5c1686874ed9053f8408167d372066f38f6a701ba10ab5c7f707aa5409aa82a2fa38039bffa47f0beedc08a8 + languageName: node + linkType: hard + +"abstract-leveldown@npm:~2.6.0": + version: 2.6.3 + resolution: "abstract-leveldown@npm:2.6.3" + dependencies: + xtend: "npm:~4.0.0" + checksum: 3343d701ffc6c4abd1ddaa92c7f28ee604aedf3f7fdbfbf01c404a329faf9171ade953cda36bbdf4090440989306ede8f4f5c6045e1428c5ff14c3af5641c2aa + languageName: node + linkType: hard + +"accepts@npm:~1.3.8": + version: 1.3.8 + resolution: "accepts@npm:1.3.8" + dependencies: + mime-types: "npm:~2.1.34" + negotiator: "npm:0.6.3" + checksum: 4634cf08b9ccf6a7618a006d54b6a29c159c233eb40194e397373308244ebad0436155d0604463d401673d47c1e1f65ea1237d58cbe8ad780d01f20f61ce19f4 + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 868f313daf8fcab419af9bbde57a739f127bf926856c7d3f2eb7d0d5153a0658331bfe3fd4d185687447538ef4154317e003ca25a9cf5cb4eb69c956740caee8 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.1.1": + version: 8.2.0 + resolution: "acorn-walk@npm:8.2.0" + checksum: 389d3f19998ac0924a590485a6502b72059e3ab67cc820477c2c40cca06b6c50bb8d424bfbb8fe97955eb489b88cb5dc7ee6979fcf9321dce7eb451ba3456d3d + languageName: node + linkType: hard + +"acorn@npm:^8.4.1, acorn@npm:^8.8.0": + version: 8.8.2 + resolution: "acorn@npm:8.8.2" + bin: + acorn: bin/acorn + checksum: 5a47325f0aa08202080cb167d5b8103720d8a1d199f57988afa48bdfbc3c9973270b00e38c2c874240a49929625beaaae8c4ec683f5272b5f07f1119a457e5d0 + languageName: node + linkType: hard + +"adm-zip@npm:^0.4.16": + version: 0.4.16 + resolution: "adm-zip@npm:0.4.16" + checksum: 05dcf055de30774e6299fc8474153da2e0a345edf0480f9085961726083d0d92da523bc633b227e3a54f435b54e78c7f21f01d63896e10e5255f5aacb4280118 + languageName: node + linkType: hard + +"aes-js@npm:3.0.0": + version: 3.0.0 + resolution: "aes-js@npm:3.0.0" + checksum: eb2d636f002bc1a126b54e27138c6af7d88c2a1ea596293056bfa9ee50471d4041e4b4ecf262d597ca9016d8c88f7a9d48eb8940bebbc01e4ad4f36338e238fe + languageName: node + linkType: hard + +"aes-js@npm:^3.1.1": + version: 3.1.2 + resolution: "aes-js@npm:3.1.2" + checksum: e310f90e9862a83a3994ba13b53b20c4e073463fba9c28239fe3510909740b382e50f0cb1bd3b7054f99d4d2fb0357b0a0c50b170224b8acd0a3337d64cec1b1 + languageName: node + linkType: hard + +"agent-base@npm:6, agent-base@npm:^6.0.2": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: "npm:4" + checksum: 2d0cdeccfe3058cb18661db3bcbb6cc092144eaecd7da3ee4321be0490d5654e53dbd08c28690d83f55f791b0369819f5872ee5122a2aad0a39edbc51798f01b + languageName: node + linkType: hard + +"agentkeepalive@npm:^4.2.1": + version: 4.3.0 + resolution: "agentkeepalive@npm:4.3.0" + dependencies: + debug: "npm:^4.1.0" + depd: "npm:^2.0.0" + humanize-ms: "npm:^1.2.1" + checksum: b3cce4e2faf86c01bad23b471a67f4aa2e6001b833bc2f63a3d5a8b2a671636f8aac7d215e6f8243ce1c07c7a5d8d5fa90ab894ff0d9f0c3e05c2cda801103fb + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: "npm:^2.0.0" + indent-string: "npm:^4.0.0" + checksum: 676b1da86a0ff06a29d9a318109752990c28aae4600f6d094845a679f388a2a246402d993d223165d208122d81823235969132dc09439de2eee50a9f48fa9db9 + languageName: node + linkType: hard + +"ajv@npm:^6.10.0, ajv@npm:^6.12.3, ajv@npm:^6.12.4, ajv@npm:^6.12.6": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: c8b4c5eb679d58b3b145c914cb328b49622ead05aecd2c8da490809d542d0796d558602a7988745214eff2a7642dcca784f909414cb746d7235a97a3f89fecee + languageName: node + linkType: hard + +"ajv@npm:^8.0.1": + version: 8.12.0 + resolution: "ajv@npm:8.12.0" + dependencies: + fast-deep-equal: "npm:^3.1.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + uri-js: "npm:^4.2.2" + checksum: adab5a15cfce05aa97767b5f01da510f79f351021c643b5593b001dc5063aac3822d9265da94f7e39fd32cc4054277e43728aa522f83d82daca50858a5c29361 + languageName: node + linkType: hard + +"ansi-colors@npm:4.1.1": + version: 4.1.1 + resolution: "ansi-colors@npm:4.1.1" + checksum: e0851875eb583ed0a4fa7e3f41042a0cb2514e70a58377e30cb211fb938581a522a1178b2ace421bab43739af2b49e69e3e195e867ef596b98ad89ef40703f76 + languageName: node + linkType: hard + +"ansi-colors@npm:^4.1.1": + version: 4.1.3 + resolution: "ansi-colors@npm:4.1.3" + checksum: a185f33883845ae5e37481749adad1cf1abf86c41c3ad3ad4c5b951f911ecb4df6a802da9acd4329726fbed0a29a43ae5ae38d179b453bc33f59bfbbb69a5c38 + languageName: node + linkType: hard + +"ansi-escapes@npm:^4.3.0": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: "npm:^0.21.3" + checksum: da33f33b3b792e7273cefc1ec150afbc332cab602757d2ab70fb90e5c5cfa173b10bc4a0d9d0c60479ed60e25cdf35897a82f1e498987358a6087b99300872cc + languageName: node + linkType: hard + +"ansi-regex@npm:^2.0.0": + version: 2.1.1 + resolution: "ansi-regex@npm:2.1.1" + checksum: 2e99d1e01bb3bb0318b41c595acf106287c23693016753484928b33483cbdced97674ae006b0207a89bbf475c2a8ccbf1f007abfa26defdcebd166d63390c69b + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 627f94ee7fcc5e03186646ebd11ca2ccd954f3cb48fc6a3f42883db6bbf3df5dfba06d62647b2f72c975349fc072c5c44808b7da26d08a9313a7f304acda2efb + languageName: node + linkType: hard + +"ansi-styles@npm:^2.2.1": + version: 2.2.1 + resolution: "ansi-styles@npm:2.2.1" + checksum: 0b71ee0091063f434731dff97ddb561ad99d2a4343ebdf9e24d05bb9b9d43cdeab00ff254e1308c046e17adb3ad2cea0a5a10445cb497b7b65bfa7058ab0b8d4 + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: "npm:^1.9.0" + checksum: 88847a8969fcf787779a2cd03e73cd85ac45cbccace293e1227445dd6452cdf11df752c5f9afdb47343439762b96ae7baad1caf848360576d60be5e92f6842ab + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: d15dab617b78cbc96f10016e929e921ad73695753de4e45a911ecee6e29aa45c71d58f1ffaf8e49889dbe726dbdb2bbe5b4e3a7bf1c517f8740ae83a29b7df25 + languageName: node + linkType: hard + +"antlr4@npm:^4.11.0": + version: 4.12.0 + resolution: "antlr4@npm:4.12.0" + checksum: a094bd00d1660a13ce4b43ef4dd0ef304d6131280670e831e65b1059b7b5e1394b019e6d7e679368fb9a59962eb6e10c99417489256768ee09483df03892a68b + languageName: node + linkType: hard + +"antlr4ts@npm:^0.5.0-alpha.4": + version: 0.5.0-dev + resolution: "antlr4ts@npm:0.5.0-dev" + dependencies: + source-map-support: "npm:^0.5.16" + checksum: e510615503346520da766c975237b6719cbe09f220e3eb308fe3d7730251ebe0ef346941a8fa889878f622112cb5b1ced850afdfb945435b1d022fb358ce1556 + languageName: node + linkType: hard + +"anymatch@npm:~3.1.2": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: "npm:^3.0.0" + picomatch: "npm:^2.0.4" + checksum: 0d50ce459783767bb68ce635c0a8f3e7de9843ebd6e6733accd59e13a49421a84944b8be5d68b5acecf74eca767a06229e07cae48151757744618e1a32dda0ed + languageName: node + linkType: hard + +"aproba@npm:^1.0.3 || ^2.0.0": + version: 2.0.0 + resolution: "aproba@npm:2.0.0" + checksum: 02a080748877ae9a7d8973c37c688669a59971c5ec38a4c44f4a7176a52313da0b0c1e1518f80d3b80d75d0d4a16f25a4151a2316bad3db06bb34cb0245cc4fa + languageName: node + linkType: hard + +"are-we-there-yet@npm:^3.0.0": + version: 3.0.1 + resolution: "are-we-there-yet@npm:3.0.1" + dependencies: + delegates: "npm:^1.0.0" + readable-stream: "npm:^3.6.0" + checksum: 7137e25713c611cf38054434ba377e2f7ad3a4bbdb7ac3565ed5caac786080d1c86ed0b280edd917b4c1001ee0d6ed7bdd53effd69b5af4251e5a4fd18d09fbe + languageName: node + linkType: hard + +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: a60e3881540ab44af1058bf3c9bdbcdd45a82cb930299ae875e609b60b44435410d152b26d55816e8ef2cf1096cfa39271f5b1bd3dd931355f3f24f043dc7ca5 + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: e041432563aadcf1267e543c472a756aaf57bb020ee5280093fe3c59fdde30d8b434c8d3c83614610550572acd18198395e2c20a38b3041a400dfe551320e0fb + languageName: node + linkType: hard + +"arr-diff@npm:^4.0.0": + version: 4.0.0 + resolution: "arr-diff@npm:4.0.0" + checksum: 78a8179b5a19e555e3628d8f846a587e25efb091c0ef0f3327040e1b1e6f50b1f052f24895afb500a9fd41540d8fcc839389a703e3617c60b10fd90b32bd172b + languageName: node + linkType: hard + +"arr-flatten@npm:^1.1.0": + version: 1.1.0 + resolution: "arr-flatten@npm:1.1.0" + checksum: e14e0b554eb39e8a5534db0a35cc2c43032d057b3206a35ce28ecbd30e10b910515ba196eaa7858d7c678fbe23aae09f72b1098f44dde23b3891c15455169421 + languageName: node + linkType: hard + +"arr-union@npm:^3.1.0": + version: 3.1.0 + resolution: "arr-union@npm:3.1.0" + checksum: 33bb361cdf82f358cae449fee5cce600e05a683a2d929a13df32c709a1181121a9235280b19a3e4bf43228a3af6c82377eba91eba0123ebee3eb5d5468d2d522 + languageName: node + linkType: hard + +"array-back@npm:^1.0.3, array-back@npm:^1.0.4": + version: 1.0.4 + resolution: "array-back@npm:1.0.4" + dependencies: + typical: "npm:^2.6.0" + checksum: eece81af69191b2c143c89416dbfa8aa5d0c609128cf0d2a6e934a8bd638cc9401cb1fb28e22cbe97f11348249ff6e5003d3de3257201d6ebd03ac8ff281b937 + languageName: node + linkType: hard + +"array-back@npm:^2.0.0": + version: 2.0.0 + resolution: "array-back@npm:2.0.0" + dependencies: + typical: "npm:^2.6.1" + checksum: ece06114b2ee26224e782f7e25999eec3437a3e0386ae3ec8e523993606016d11a060efa4445434487c30e1b9c5ea3de997473eb0e2f6b07161078c709723bac + languageName: node + linkType: hard + +"array-buffer-byte-length@npm:^1.0.0": + version: 1.0.0 + resolution: "array-buffer-byte-length@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.2" + is-array-buffer: "npm:^3.0.1" + checksum: ff6fd5a16868943441dc2b8de7c0a8b070677457f1953d13b366e6fd01d7bf187a29268412ca5115f14031d3c00cea22c832af6da61569351d9967d8a5d803cb + languageName: node + linkType: hard + +"array-flatten@npm:1.1.1": + version: 1.1.1 + resolution: "array-flatten@npm:1.1.1" + checksum: 4f31d5671990976098f6ea9d82986748f43d0d44e3ab815d84d33cd5369ee964386804213619d4d050b33fe1cefa5e1420e98d350cd0162ab087d9d58c02d1c4 + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 0644809ce6ada3bcf5d25379f3c96f0335dd45516da5303fcb9eb2477dc8ad222fe39be2d0b58a7bbc3207e68d714e5f592316b881e2b13a11cd705d11cc5d45 + languageName: node + linkType: hard + +"array-unique@npm:^0.3.2": + version: 0.3.2 + resolution: "array-unique@npm:0.3.2" + checksum: 1f74f496ca981b2756b5eb3edb85e39d881635fa838784616de3d7e7b3cfa660e492b44f75f7f805cdafdae1d9a14c0c12dfde889a74c4de56a428a929f0f797 + languageName: node + linkType: hard + +"array.prototype.reduce@npm:^1.0.5": + version: 1.0.5 + resolution: "array.prototype.reduce@npm:1.0.5" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.1.4" + es-abstract: "npm:^1.20.4" + es-array-method-boxes-properly: "npm:^1.0.0" + is-string: "npm:^1.0.7" + checksum: cd89d328d3c716b62cc6ad9c4ff78b29ca836cb2f5ead8c39224f60e09155ff1aee6ce3e1b24e7923845905295ed38965a139af5d9573e37df70e71b469b2b67 + languageName: node + linkType: hard + +"asn1.js@npm:^5.2.0": + version: 5.4.1 + resolution: "asn1.js@npm:5.4.1" + dependencies: + bn.js: "npm:^4.0.0" + inherits: "npm:^2.0.1" + minimalistic-assert: "npm:^1.0.0" + safer-buffer: "npm:^2.1.0" + checksum: 5c36f81388e344c9417866bd20acd2d4164d2bc2827d4fd0e35714f8701a249b9c6118c70720758fe710a4723d65699c5be1e827f89e9eff1dbd1bfe910300fd + languageName: node + linkType: hard + +"asn1@npm:~0.2.3": + version: 0.2.6 + resolution: "asn1@npm:0.2.6" + dependencies: + safer-buffer: "npm:~2.1.0" + checksum: 3c97ac9d83ca097850fd9d4228a0f366e18a7a8fd055d749a15d7018a47ed208a3be48f3cfdacea738b44f4b40b56e943f0607de221bbdec812b74129ecf0c22 + languageName: node + linkType: hard + +"assert-plus@npm:1.0.0, assert-plus@npm:^1.0.0": + version: 1.0.0 + resolution: "assert-plus@npm:1.0.0" + checksum: 38cb6f1d545a2cc3b1c30101324720ae0a659c071615b49274b423d8ca7efaecebc85c128d6dc35a46e4d7c6077385783cb46a1901896e3b7f10f619c7111057 + languageName: node + linkType: hard + +"assertion-error@npm:^1.1.0": + version: 1.1.0 + resolution: "assertion-error@npm:1.1.0" + checksum: 8e52a3ca8f1f789419cfa4d6e77a4be12ca441ca9ed64a671fd28a0efb1eac304579ee1d5cceb92a43a61d8caac10e00c3b6326ede54c515e0929572320388c8 + languageName: node + linkType: hard + +"assign-symbols@npm:^1.0.0": + version: 1.0.0 + resolution: "assign-symbols@npm:1.0.0" + checksum: 312d61d37abf72e003e4946683f1e824bd722d0101e6efe5fea016827634dca5f4e92b84f077886a3acd33c435d2f8fca6fbd29d6b08199615df66f919351fcc + languageName: node + linkType: hard + +"ast-parents@npm:^0.0.1": + version: 0.0.1 + resolution: "ast-parents@npm:0.0.1" + checksum: eed3f5d5028d4dd6bf21e157982d5b2811e9b0c4f6056e951183a1cc142bc80d8b898d81fa5468a627e41142cfa1514b64bb4f7898e54f17f8a1ceb6a808f73f + languageName: node + linkType: hard + +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: e24f6eb6f33ba55ffe8d89c60ab490791cd29772a896339388db11efcbfcd6da0d6ed59b655933f7c26ca4c2ae926f86d21bdedb142b69829d9d4a1074faa1d2 + languageName: node + linkType: hard + +"async-eventemitter@npm:^0.2.2": + version: 0.2.4 + resolution: "async-eventemitter@npm:0.2.4" + dependencies: + async: "npm:^2.4.0" + checksum: e7d3399284be7fa5f3532ea18d3fdf75316f3a7b0302a8ee3e656f1f864680f92ca59e8fc87125a1e2cbaffde4d3e253acb00537e37b85662d91be3b18a74223 + languageName: node + linkType: hard + +"async-limiter@npm:~1.0.0": + version: 1.0.1 + resolution: "async-limiter@npm:1.0.1" + checksum: 6e4c39e263e9f424cbfa599051ac53c0dd5f784c70e42845f47d22e4f66d44d6a26a083ef950cbdf06c3564bb0b52690ed3820b10dab63e226cc27dd28db961a + languageName: node + linkType: hard + +"async@npm:2.6.2": + version: 2.6.2 + resolution: "async@npm:2.6.2" + dependencies: + lodash: "npm:^4.17.11" + checksum: 7bfa6f5c06955b64c8fe69df0ebb4241c0481c445dba85743e69a0c4d941058901c11e09022b430da716cf2193ed8e29308fedb674822f6044c787c325b797e2 + languageName: node + linkType: hard + +"async@npm:^1.4.2": + version: 1.5.2 + resolution: "async@npm:1.5.2" + checksum: 51df0a983eaae75e4514ae0066092a4d6e70fe798a27eb78e6b414f55e9576be1bd40475625391fbdba70a024fa7760fa85d3464a71d9008c985bc1f0f25142b + languageName: node + linkType: hard + +"async@npm:^2.0.1, async@npm:^2.1.2, async@npm:^2.4.0, async@npm:^2.5.0, async@npm:^2.6.1": + version: 2.6.4 + resolution: "async@npm:2.6.4" + dependencies: + lodash: "npm:^4.17.14" + checksum: 87b000b0c272771a0695682f874763e40813766e98ccb58f7f54404190b4af44ce494e40ecef813dffe04f60d4f618e18842edc7814d6186765144c0b53357d4 + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: e4d1381289f9effe69a4dbc18e8b4e2059113dfb23634d0f4064226042870dbc53175fbf261f982d055fa2952163a8b7608781ea58314a17bb6a2cd6815af4f1 + languageName: node + linkType: hard + +"at-least-node@npm:^1.0.0": + version: 1.0.0 + resolution: "at-least-node@npm:1.0.0" + checksum: fed1be4307a3752f3a863a6e0219c58fe6838ee95c77ecafffd2a72bbfe4ff33695777e4bffe2a095ef5671c638b803a55e0d39a728c7b0afa9adaa5900444bd + languageName: node + linkType: hard + +"atob@npm:^2.1.2": + version: 2.1.2 + resolution: "atob@npm:2.1.2" + bin: + atob: bin/atob.js + checksum: af5b2c7d2b7beb2ece862c42999ef7e43ed1ecf67857f44b021ea4267fdf7aad4b8ec5f59fde2a2d581b6cbda9108e979274642e2c6ab3b32a4203ee1ddad3d2 + languageName: node + linkType: hard + +"available-typed-arrays@npm:^1.0.5": + version: 1.0.5 + resolution: "available-typed-arrays@npm:1.0.5" + checksum: 6b301a7ec3da82181c73101395cc915c049bbcba7e5f354809dab60c5b492440929328eeb73c07431ef8e35e6fa5af505690b20ed91f548d3bac1a456d458a78 + languageName: node + linkType: hard + +"aws-sign2@npm:~0.7.0": + version: 0.7.0 + resolution: "aws-sign2@npm:0.7.0" + checksum: 6af052d2392aee7cc9e63bc3737e282dcd392c1bfb4c97b8aff45b6b02a59d62eb6a084bcc16c67ccdb63924bb17e0aa14d38e12724345a1e4f4d648b768ecd5 + languageName: node + linkType: hard + +"aws4@npm:^1.8.0": + version: 1.12.0 + resolution: "aws4@npm:1.12.0" + checksum: 62888183a7eb652156c0647e0692d5b6eb710d36010d9c8b70d91c9cf39b1b832c8a9c5855b41b6917b3a5965daa588ddca460300e824e56c4123ac64e39b019 + languageName: node + linkType: hard + +"babel-code-frame@npm:^6.26.0": + version: 6.26.0 + resolution: "babel-code-frame@npm:6.26.0" + dependencies: + chalk: "npm:^1.1.3" + esutils: "npm:^2.0.2" + js-tokens: "npm:^3.0.2" + checksum: 9487af948c25dfd8995b1078ef9fd14a97b70bb3b7c17507a621b7201412e10301cbe86695d6954b8ba675dbc5485beefc5bf52067d60f7ac582ec040b2a41e7 + languageName: node + linkType: hard + +"babel-core@npm:^6.0.14, babel-core@npm:^6.26.0": + version: 6.26.3 + resolution: "babel-core@npm:6.26.3" + dependencies: + babel-code-frame: "npm:^6.26.0" + babel-generator: "npm:^6.26.0" + babel-helpers: "npm:^6.24.1" + babel-messages: "npm:^6.23.0" + babel-register: "npm:^6.26.0" + babel-runtime: "npm:^6.26.0" + babel-template: "npm:^6.26.0" + babel-traverse: "npm:^6.26.0" + babel-types: "npm:^6.26.0" + babylon: "npm:^6.18.0" + convert-source-map: "npm:^1.5.1" + debug: "npm:^2.6.9" + json5: "npm:^0.5.1" + lodash: "npm:^4.17.4" + minimatch: "npm:^3.0.4" + path-is-absolute: "npm:^1.0.1" + private: "npm:^0.1.8" + slash: "npm:^1.0.0" + source-map: "npm:^0.5.7" + checksum: 28a3186c4f5f440c1ad828d5741bb2a1f008e03a19287c86a5e6ab769dc5f56cc332f0d648bbb6188cf8cc7a4a92c6eca5fa6f3cf0b487472c888b6bb8a694a3 + languageName: node + linkType: hard + +"babel-generator@npm:^6.26.0": + version: 6.26.1 + resolution: "babel-generator@npm:6.26.1" + dependencies: + babel-messages: "npm:^6.23.0" + babel-runtime: "npm:^6.26.0" + babel-types: "npm:^6.26.0" + detect-indent: "npm:^4.0.0" + jsesc: "npm:^1.3.0" + lodash: "npm:^4.17.4" + source-map: "npm:^0.5.7" + trim-right: "npm:^1.0.1" + checksum: 425ac1641e5c3242a0f05bd15bae69bd823002a16afc73fc9d9151119196c0c36d39fdf0134ae459720ba0d7c2d3698b969cd0c8f9e45808c609e3fa87052cb9 + languageName: node + linkType: hard + +"babel-helper-builder-binary-assignment-operator-visitor@npm:^6.24.1": + version: 6.24.1 + resolution: "babel-helper-builder-binary-assignment-operator-visitor@npm:6.24.1" + dependencies: + babel-helper-explode-assignable-expression: "npm:^6.24.1" + babel-runtime: "npm:^6.22.0" + babel-types: "npm:^6.24.1" + checksum: c432f098fe02b5c2ecc40093eb7db11e54fd5a2c1bafcbb931701afbdacb29f017a91c5c3f23fdbf48281208d01ea5f4daf1b579685566538a35e3cc4058b130 + languageName: node + linkType: hard + +"babel-helper-call-delegate@npm:^6.24.1": + version: 6.24.1 + resolution: "babel-helper-call-delegate@npm:6.24.1" + dependencies: + babel-helper-hoist-variables: "npm:^6.24.1" + babel-runtime: "npm:^6.22.0" + babel-traverse: "npm:^6.24.1" + babel-types: "npm:^6.24.1" + checksum: bf970dfb52359efb538c118a4f16be769531166f6f1f74d75a8c0eeff19f15f52a910b1ed0c4b531cf07eda2d4ddcd37a50260d47f89cfaba347503b4e1e3781 + languageName: node + linkType: hard + +"babel-helper-define-map@npm:^6.24.1": + version: 6.26.0 + resolution: "babel-helper-define-map@npm:6.26.0" + dependencies: + babel-helper-function-name: "npm:^6.24.1" + babel-runtime: "npm:^6.26.0" + babel-types: "npm:^6.26.0" + lodash: "npm:^4.17.4" + checksum: 43e1b7279aa99aa609ebfbe5c3b3de89b47e5ca083292761d13deaa8f93805a9a118555baf4ecb8aecfa80a70c61adbf1d4d8b549fce93bfa5d71e8f45c0233c + languageName: node + linkType: hard + +"babel-helper-explode-assignable-expression@npm:^6.24.1": + version: 6.24.1 + resolution: "babel-helper-explode-assignable-expression@npm:6.24.1" + dependencies: + babel-runtime: "npm:^6.22.0" + babel-traverse: "npm:^6.24.1" + babel-types: "npm:^6.24.1" + checksum: a12941a44b625113c2227a431f5d5757669ddb022396677bf288152673d84fb84d4d032f225e0b9074854cd6ae642951a57154ae7af9b1324832b839718ac18e + languageName: node + linkType: hard + +"babel-helper-function-name@npm:^6.24.1": + version: 6.24.1 + resolution: "babel-helper-function-name@npm:6.24.1" + dependencies: + babel-helper-get-function-arity: "npm:^6.24.1" + babel-runtime: "npm:^6.22.0" + babel-template: "npm:^6.24.1" + babel-traverse: "npm:^6.24.1" + babel-types: "npm:^6.24.1" + checksum: a33d7a9beafe9b9f9f6b1a21ddc51967325eb9d996ad11d484f306c1a88c0375fbec43a81932fe8ec5effbfc854c579faf905469c7eee8c18db3faec2070c0a9 + languageName: node + linkType: hard + +"babel-helper-get-function-arity@npm:^6.24.1": + version: 6.24.1 + resolution: "babel-helper-get-function-arity@npm:6.24.1" + dependencies: + babel-runtime: "npm:^6.22.0" + babel-types: "npm:^6.24.1" + checksum: 41e08239f2b07a5a97bb3f82a42590cc081e507bab467e77f02dd8257012e949e4a1341ccfdd2c554baebd590d8bf64968e79496afc2939779dc132afb2b7d4a + languageName: node + linkType: hard + +"babel-helper-hoist-variables@npm:^6.24.1": + version: 6.24.1 + resolution: "babel-helper-hoist-variables@npm:6.24.1" + dependencies: + babel-runtime: "npm:^6.22.0" + babel-types: "npm:^6.24.1" + checksum: 69d6ef59c0384fe33249acd42f2de3d7483381f7b308d11e2210a3f2df782134323f597123d20fedb3a52f4fc02244a7cc35ba929f21a55a25fd459458c1ec2f + languageName: node + linkType: hard + +"babel-helper-optimise-call-expression@npm:^6.24.1": + version: 6.24.1 + resolution: "babel-helper-optimise-call-expression@npm:6.24.1" + dependencies: + babel-runtime: "npm:^6.22.0" + babel-types: "npm:^6.24.1" + checksum: 33469ce89b322b4fe145b2428fd3bfa899bdbb315449a0c492347353c747eb87cf0d09bfacadc3a4b5b74c449d59ecf782798bde8ffc6d4afedfee81f2582ae8 + languageName: node + linkType: hard + +"babel-helper-regex@npm:^6.24.1": + version: 6.26.0 + resolution: "babel-helper-regex@npm:6.26.0" + dependencies: + babel-runtime: "npm:^6.26.0" + babel-types: "npm:^6.26.0" + lodash: "npm:^4.17.4" + checksum: f5b6f653b5efe4186a19940680fabeaaf160d61c7b10661842914040cfe7088da11c637cf4862bd5f6c3a88c7a343e87237687ecb2b103db2e489b240a889cf3 + languageName: node + linkType: hard + +"babel-helper-remap-async-to-generator@npm:^6.24.1": + version: 6.24.1 + resolution: "babel-helper-remap-async-to-generator@npm:6.24.1" + dependencies: + babel-helper-function-name: "npm:^6.24.1" + babel-runtime: "npm:^6.22.0" + babel-template: "npm:^6.24.1" + babel-traverse: "npm:^6.24.1" + babel-types: "npm:^6.24.1" + checksum: 4c559bbc1b0e492deaa0a800b8cec8c5d9bb5a2822501cb2e6c4ef541a469b3db2e36dbcccc7ede16e58a63099f87b954339b1eda259a1081c884d659979f5d4 + languageName: node + linkType: hard + +"babel-helper-replace-supers@npm:^6.24.1": + version: 6.24.1 + resolution: "babel-helper-replace-supers@npm:6.24.1" + dependencies: + babel-helper-optimise-call-expression: "npm:^6.24.1" + babel-messages: "npm:^6.23.0" + babel-runtime: "npm:^6.22.0" + babel-template: "npm:^6.24.1" + babel-traverse: "npm:^6.24.1" + babel-types: "npm:^6.24.1" + checksum: 7212d9f674dd8a84356c116d27464603797bee4d688c9190efd3d903c104515b08f23d2de9a79276bbf25a50a7fd7befaf9885a53d6f0d852aa959229fb33ced + languageName: node + linkType: hard + +"babel-helpers@npm:^6.24.1": + version: 6.24.1 + resolution: "babel-helpers@npm:6.24.1" + dependencies: + babel-runtime: "npm:^6.22.0" + babel-template: "npm:^6.24.1" + checksum: 6cec9a19295bff738440c035af852266714d264cd05f58cf4d3a82b8dd5f4f021c7342703032d76b7d9b360ba5f6d2cad6f7cda16218549aa8b875df281e95da + languageName: node + linkType: hard + +"babel-messages@npm:^6.23.0": + version: 6.23.0 + resolution: "babel-messages@npm:6.23.0" + dependencies: + babel-runtime: "npm:^6.22.0" + checksum: 9509a410b4727e00662362d7c3e44552cbb3d2bc010ff90d6fc70f75bacb144a34afa156ab3eb2f0de0696eee88ddcd03d7794a5f1df8f0bc67cc140d845ac55 + languageName: node + linkType: hard + +"babel-plugin-check-es2015-constants@npm:^6.22.0": + version: 6.22.0 + resolution: "babel-plugin-check-es2015-constants@npm:6.22.0" + dependencies: + babel-runtime: "npm:^6.22.0" + checksum: d3d08132bb1681824e09e552ea2c06f443c59984febc969d42c267c28ae52170de933159acc32a3d059809c67986c45c7b8f6cd0d92f66c0122d113d8727d7b7 + languageName: node + linkType: hard + +"babel-plugin-syntax-async-functions@npm:^6.8.0": + version: 6.13.0 + resolution: "babel-plugin-syntax-async-functions@npm:6.13.0" + checksum: 600361d654c27472142e2186703baf1fd5f04a482cd49c983ef6e3d40628218260e0ee8237d52ffcd138a934fbfaf3a55b359e67e3b0f0cfbd01fed36504c58a + languageName: node + linkType: hard + +"babel-plugin-syntax-exponentiation-operator@npm:^6.8.0": + version: 6.13.0 + resolution: "babel-plugin-syntax-exponentiation-operator@npm:6.13.0" + checksum: 931085c323ab8d50ad985248b68f3290e5a1846920f60080b4af0b5dbf28e9e81a086c0ff3cdea2d5321db9dd035ceaa3c96158aa758fe345c36acd3b6fec166 + languageName: node + linkType: hard + +"babel-plugin-syntax-trailing-function-commas@npm:^6.22.0": + version: 6.22.0 + resolution: "babel-plugin-syntax-trailing-function-commas@npm:6.22.0" + checksum: 00fb9798fd00cdac40bb090d7f1c43b4e01ba2eb1323215ea93da231e4f3bdc969d3dc3937d884f15e84e79fba4b3d7c43f91b906c4387857d2b3f36a47c9381 + languageName: node + linkType: hard + +"babel-plugin-transform-async-to-generator@npm:^6.22.0": + version: 6.24.1 + resolution: "babel-plugin-transform-async-to-generator@npm:6.24.1" + dependencies: + babel-helper-remap-async-to-generator: "npm:^6.24.1" + babel-plugin-syntax-async-functions: "npm:^6.8.0" + babel-runtime: "npm:^6.22.0" + checksum: cdecd0bbbde8a3208e76199db474de8ea5242aa2f67ac6c890d6e2a30f4d8330e8bdc800d72b3b15dd7fbcf3bbbabccd1dc5e379f453d21752f29c08f6ddc2e5 + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-arrow-functions@npm:^6.22.0": + version: 6.22.0 + resolution: "babel-plugin-transform-es2015-arrow-functions@npm:6.22.0" + dependencies: + babel-runtime: "npm:^6.22.0" + checksum: c3e1659c93e2d41f02c71a050745ac4c42c540f3a9806cf7f07f7e96a8609ad03eb35b88624b07082fa6c93ff4c04d47ea7675a620ab6e7b26b272da22cb1b71 + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-block-scoped-functions@npm:^6.22.0": + version: 6.22.0 + resolution: "babel-plugin-transform-es2015-block-scoped-functions@npm:6.22.0" + dependencies: + babel-runtime: "npm:^6.22.0" + checksum: 008a84815f83e8cffc643c43e28e1e01f4b34f98847f52e797de19334f13b298e730148e66e8d2786108a0ce802c9187c7221af47e5981c201e0765901c79137 + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-block-scoping@npm:^6.23.0": + version: 6.26.0 + resolution: "babel-plugin-transform-es2015-block-scoping@npm:6.26.0" + dependencies: + babel-runtime: "npm:^6.26.0" + babel-template: "npm:^6.26.0" + babel-traverse: "npm:^6.26.0" + babel-types: "npm:^6.26.0" + lodash: "npm:^4.17.4" + checksum: 406255c6ec1de3b2f28554e9969befe9e7a9adef26476ede0339fb1a5c972e7f37f756e807d777cbd6f8414a0dec126e9ec724d181d95f03a1dad373e660210f + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-classes@npm:^6.23.0": + version: 6.24.1 + resolution: "babel-plugin-transform-es2015-classes@npm:6.24.1" + dependencies: + babel-helper-define-map: "npm:^6.24.1" + babel-helper-function-name: "npm:^6.24.1" + babel-helper-optimise-call-expression: "npm:^6.24.1" + babel-helper-replace-supers: "npm:^6.24.1" + babel-messages: "npm:^6.23.0" + babel-runtime: "npm:^6.22.0" + babel-template: "npm:^6.24.1" + babel-traverse: "npm:^6.24.1" + babel-types: "npm:^6.24.1" + checksum: d548a8575810e361f526c54aa236333558021372dc162cd993c1572cda2e525696b96140f69cb549de0c0e3c2c7890bfd5768dd777060b2142a0eeadb5db850a + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-computed-properties@npm:^6.22.0": + version: 6.24.1 + resolution: "babel-plugin-transform-es2015-computed-properties@npm:6.24.1" + dependencies: + babel-runtime: "npm:^6.22.0" + babel-template: "npm:^6.24.1" + checksum: 4bd52520fd1cec7ef645f14bd2657f21c9bc5d4ade4adc36b13fe492c5410aa8c4804af2ff50c1e3041dc02899b59b7793318b1c7474652748d3118ac8031d43 + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-destructuring@npm:^6.23.0": + version: 6.23.0 + resolution: "babel-plugin-transform-es2015-destructuring@npm:6.23.0" + dependencies: + babel-runtime: "npm:^6.22.0" + checksum: 4e3dd9cf81a00d54bc05e91c00704fcf57a7894730bf219365f1d378268f78231790d8c4162b527766eecdc8f408b6a894550c49f1c452ef1bcff8b5e530cd8d + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-duplicate-keys@npm:^6.22.0": + version: 6.24.1 + resolution: "babel-plugin-transform-es2015-duplicate-keys@npm:6.24.1" + dependencies: + babel-runtime: "npm:^6.22.0" + babel-types: "npm:^6.24.1" + checksum: 22b387e6f5cb6f9c9383b5d61eb219d48d995d0c19c008de5f0dcf0345b1adbe7b144595d2236f9398cc1af898bd006124694936aff171dcb7277063177541b7 + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-for-of@npm:^6.23.0": + version: 6.23.0 + resolution: "babel-plugin-transform-es2015-for-of@npm:6.23.0" + dependencies: + babel-runtime: "npm:^6.22.0" + checksum: 6a9ff9a1d67954e0ecbe8a5500f4142be875cd46a6f59753fd65ccba99950621386f7bc0799ebf54659fe24d14d5eac5801ce0b8c24213fec8858a8c0f673f76 + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-function-name@npm:^6.22.0": + version: 6.24.1 + resolution: "babel-plugin-transform-es2015-function-name@npm:6.24.1" + dependencies: + babel-helper-function-name: "npm:^6.24.1" + babel-runtime: "npm:^6.22.0" + babel-types: "npm:^6.24.1" + checksum: c23fa41f3ea0c3f8c36670ef141c16b43425a68abf871e9fd2de79b66dfb3e2dae1aa46bc32eff39fd8ab1dec3458a34fa6a8f329e1116510ce0406f8a89f20a + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-literals@npm:^6.22.0": + version: 6.22.0 + resolution: "babel-plugin-transform-es2015-literals@npm:6.22.0" + dependencies: + babel-runtime: "npm:^6.22.0" + checksum: 89d591c0a9d4c12829fed7cd2680d8b3497087d852fe2fba783b63b02f3ceb8bdb6606a9e972fc033f8cfde671a0c6f1b6976f2ecd7f6269d7b7310dc2973602 + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-modules-amd@npm:^6.22.0, babel-plugin-transform-es2015-modules-amd@npm:^6.24.1": + version: 6.24.1 + resolution: "babel-plugin-transform-es2015-modules-amd@npm:6.24.1" + dependencies: + babel-plugin-transform-es2015-modules-commonjs: "npm:^6.24.1" + babel-runtime: "npm:^6.22.0" + babel-template: "npm:^6.24.1" + checksum: eefaf80ce5e98c6d25367342c8bb93bb53a20f716ba18a41f28dad539d9f01ae9c40975d9efccc8039ca9d7b3a9a2e664e4dc8265e7a690ca77bc9ed27afe4c5 + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-modules-commonjs@npm:^6.23.0, babel-plugin-transform-es2015-modules-commonjs@npm:^6.24.1": + version: 6.26.2 + resolution: "babel-plugin-transform-es2015-modules-commonjs@npm:6.26.2" + dependencies: + babel-plugin-transform-strict-mode: "npm:^6.24.1" + babel-runtime: "npm:^6.26.0" + babel-template: "npm:^6.26.0" + babel-types: "npm:^6.26.0" + checksum: 955217e03438148cf69c9ba4de626a82be66150528bdcfc5aef690aa7411be875d886018f4b3f5240c710a980310fdb24aacb3d1091966df8cb3ab4b47d6ec18 + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-modules-systemjs@npm:^6.23.0": + version: 6.24.1 + resolution: "babel-plugin-transform-es2015-modules-systemjs@npm:6.24.1" + dependencies: + babel-helper-hoist-variables: "npm:^6.24.1" + babel-runtime: "npm:^6.22.0" + babel-template: "npm:^6.24.1" + checksum: f77ee09cb05fb5ab346c606dce1290701fac1983301c662b2af934b1adfbc695942e1cbc50daaa8368e211b844037989e2c23a278ec30aeb5499a5213d1bdd21 + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-modules-umd@npm:^6.23.0": + version: 6.24.1 + resolution: "babel-plugin-transform-es2015-modules-umd@npm:6.24.1" + dependencies: + babel-plugin-transform-es2015-modules-amd: "npm:^6.24.1" + babel-runtime: "npm:^6.22.0" + babel-template: "npm:^6.24.1" + checksum: a88899bd297fe1499b0e25bff5cbb7dbcf0ffd324f1956ede5eb70e4392e4f408c2f03b6e75eba1dc4979091d415d605fc6fb331b8b624ff80a5d4b8a352f466 + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-object-super@npm:^6.22.0": + version: 6.24.1 + resolution: "babel-plugin-transform-es2015-object-super@npm:6.24.1" + dependencies: + babel-helper-replace-supers: "npm:^6.24.1" + babel-runtime: "npm:^6.22.0" + checksum: d8dcb0a21d193ae2f725c4e5c126c3332e89282f3f197fad67c9067340280a47a39a77eb59632cbdb1461bb939040a5b43061bcc7fe207866b06a9e3d3dc1972 + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-parameters@npm:^6.23.0": + version: 6.24.1 + resolution: "babel-plugin-transform-es2015-parameters@npm:6.24.1" + dependencies: + babel-helper-call-delegate: "npm:^6.24.1" + babel-helper-get-function-arity: "npm:^6.24.1" + babel-runtime: "npm:^6.22.0" + babel-template: "npm:^6.24.1" + babel-traverse: "npm:^6.24.1" + babel-types: "npm:^6.24.1" + checksum: e9819beaca3977d04c140a0ccdffafa95ae19abcfc7cbe751e885171e90037f70f6044e79fc07bd255918e516ddb6d3bf4a513efd9370d51f96d1cc585490b2e + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-shorthand-properties@npm:^6.22.0": + version: 6.24.1 + resolution: "babel-plugin-transform-es2015-shorthand-properties@npm:6.24.1" + dependencies: + babel-runtime: "npm:^6.22.0" + babel-types: "npm:^6.24.1" + checksum: 9a9112e488a04cc0f1bcac71316cd231ec6c45f49ebf5e44f53834866a29d3059ac415db3daa606371bb39066631f55596bfbf502fd173cbb32450f65e27f36e + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-spread@npm:^6.22.0": + version: 6.22.0 + resolution: "babel-plugin-transform-es2015-spread@npm:6.22.0" + dependencies: + babel-runtime: "npm:^6.22.0" + checksum: 9915273d177161c87d72c4c534c1c5bba0d3295c0a48c107b41dd263b5c5123a0466a446662df6dbaa7e26e7be8815c41b1bfd000f6cf9bf6270351071e7e7ff + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-sticky-regex@npm:^6.22.0": + version: 6.24.1 + resolution: "babel-plugin-transform-es2015-sticky-regex@npm:6.24.1" + dependencies: + babel-helper-regex: "npm:^6.24.1" + babel-runtime: "npm:^6.22.0" + babel-types: "npm:^6.24.1" + checksum: 1c98472c1dd04b5bad50b4de7789f864e45a2511427b172d2f180a3e97812f9ee2e30206468252384da3b3d1612a2d6a011eaeb2eb7593ab2913d26e86f22e75 + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-template-literals@npm:^6.22.0": + version: 6.22.0 + resolution: "babel-plugin-transform-es2015-template-literals@npm:6.22.0" + dependencies: + babel-runtime: "npm:^6.22.0" + checksum: ae2bafe37708ca7803ecddef42a22083b365bcaba524cc70977288a58116d34a643a79f804fb5b00b8c5cc34083e4eaa23d408dac8b589062e0589cbddcac386 + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-typeof-symbol@npm:^6.23.0": + version: 6.23.0 + resolution: "babel-plugin-transform-es2015-typeof-symbol@npm:6.23.0" + dependencies: + babel-runtime: "npm:^6.22.0" + checksum: d8c8a4b361d6129e67af5057163f690d1c671050020e3c37916a482b94b031ef556ff2f16efaea59474c9c9a02d39d7c47361b8d5614e5f0ba9762fd0e61c5a9 + languageName: node + linkType: hard + +"babel-plugin-transform-es2015-unicode-regex@npm:^6.22.0": + version: 6.24.1 + resolution: "babel-plugin-transform-es2015-unicode-regex@npm:6.24.1" + dependencies: + babel-helper-regex: "npm:^6.24.1" + babel-runtime: "npm:^6.22.0" + regexpu-core: "npm:^2.0.0" + checksum: 595b56da7e8d81a3a82b9058a1d77bc7ed19c181ea94c286a69d88d4b1792cb7076dfb9504b66834259a23959863c6b9340006d195337b3e3e15c86e8f9ac82f + languageName: node + linkType: hard + +"babel-plugin-transform-exponentiation-operator@npm:^6.22.0": + version: 6.24.1 + resolution: "babel-plugin-transform-exponentiation-operator@npm:6.24.1" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor: "npm:^6.24.1" + babel-plugin-syntax-exponentiation-operator: "npm:^6.8.0" + babel-runtime: "npm:^6.22.0" + checksum: 11c8c1e858daa29f0c738ac93266bed183c53cbfbd226655dce97f72ab6fb39dbf0bd7861fb8d45ad22a5357bdff370d791d04e3ce317c7243c2bd93a5653739 + languageName: node + linkType: hard + +"babel-plugin-transform-regenerator@npm:^6.22.0": + version: 6.26.0 + resolution: "babel-plugin-transform-regenerator@npm:6.26.0" + dependencies: + regenerator-transform: "npm:^0.10.0" + checksum: ef51befd4065541623baea8c0a5a6d3e1013d8831ab7a0edbde3d0bc6d0153043ef76d00b727de634088d4db6179c927842ca10b638fac0a28087def2edbb9ce + languageName: node + linkType: hard + +"babel-plugin-transform-strict-mode@npm:^6.24.1": + version: 6.24.1 + resolution: "babel-plugin-transform-strict-mode@npm:6.24.1" + dependencies: + babel-runtime: "npm:^6.22.0" + babel-types: "npm:^6.24.1" + checksum: 7f0089a0713a23d6d26f22d5c6324062416054545972ec1019194630bb55d451d18763f9e047a319ce5011d22253f60972576761bfd7176513e2341569c2ce28 + languageName: node + linkType: hard + +"babel-preset-env@npm:^1.7.0": + version: 1.7.0 + resolution: "babel-preset-env@npm:1.7.0" + dependencies: + babel-plugin-check-es2015-constants: "npm:^6.22.0" + babel-plugin-syntax-trailing-function-commas: "npm:^6.22.0" + babel-plugin-transform-async-to-generator: "npm:^6.22.0" + babel-plugin-transform-es2015-arrow-functions: "npm:^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions: "npm:^6.22.0" + babel-plugin-transform-es2015-block-scoping: "npm:^6.23.0" + babel-plugin-transform-es2015-classes: "npm:^6.23.0" + babel-plugin-transform-es2015-computed-properties: "npm:^6.22.0" + babel-plugin-transform-es2015-destructuring: "npm:^6.23.0" + babel-plugin-transform-es2015-duplicate-keys: "npm:^6.22.0" + babel-plugin-transform-es2015-for-of: "npm:^6.23.0" + babel-plugin-transform-es2015-function-name: "npm:^6.22.0" + babel-plugin-transform-es2015-literals: "npm:^6.22.0" + babel-plugin-transform-es2015-modules-amd: "npm:^6.22.0" + babel-plugin-transform-es2015-modules-commonjs: "npm:^6.23.0" + babel-plugin-transform-es2015-modules-systemjs: "npm:^6.23.0" + babel-plugin-transform-es2015-modules-umd: "npm:^6.23.0" + babel-plugin-transform-es2015-object-super: "npm:^6.22.0" + babel-plugin-transform-es2015-parameters: "npm:^6.23.0" + babel-plugin-transform-es2015-shorthand-properties: "npm:^6.22.0" + babel-plugin-transform-es2015-spread: "npm:^6.22.0" + babel-plugin-transform-es2015-sticky-regex: "npm:^6.22.0" + babel-plugin-transform-es2015-template-literals: "npm:^6.22.0" + babel-plugin-transform-es2015-typeof-symbol: "npm:^6.23.0" + babel-plugin-transform-es2015-unicode-regex: "npm:^6.22.0" + babel-plugin-transform-exponentiation-operator: "npm:^6.22.0" + babel-plugin-transform-regenerator: "npm:^6.22.0" + browserslist: "npm:^3.2.6" + invariant: "npm:^2.2.2" + semver: "npm:^5.3.0" + checksum: 805b24e11403a6fbd3c31f065daa38ce4d58dfc8ff9f13c4aa87a0d6d408264742c3afe9ffab0e9609b2c217e3bcf2c513a132f1a4859caae57853931ac698b1 + languageName: node + linkType: hard + +"babel-register@npm:^6.26.0": + version: 6.26.0 + resolution: "babel-register@npm:6.26.0" + dependencies: + babel-core: "npm:^6.26.0" + babel-runtime: "npm:^6.26.0" + core-js: "npm:^2.5.0" + home-or-tmp: "npm:^2.0.0" + lodash: "npm:^4.17.4" + mkdirp: "npm:^0.5.1" + source-map-support: "npm:^0.4.15" + checksum: 0a06f7d168c39e65d6f21cc9340a440dfbfb839a8db173b123372a413465b9f24ff9dd7381b84846dc408b32483791682639eb2d287ba5d5f51e5befe5817200 + languageName: node + linkType: hard + +"babel-runtime@npm:^6.18.0, babel-runtime@npm:^6.22.0, babel-runtime@npm:^6.26.0": + version: 6.26.0 + resolution: "babel-runtime@npm:6.26.0" + dependencies: + core-js: "npm:^2.4.0" + regenerator-runtime: "npm:^0.11.0" + checksum: 9ff2870582894fa49190a1943e6be5beb659096ea393adab793f9d1733c4f44fd54c19e08f5bcff7416b241ca1ff89ebcea43c3a00daa61255001479e57d7554 + languageName: node + linkType: hard + +"babel-template@npm:^6.24.1, babel-template@npm:^6.26.0": + version: 6.26.0 + resolution: "babel-template@npm:6.26.0" + dependencies: + babel-runtime: "npm:^6.26.0" + babel-traverse: "npm:^6.26.0" + babel-types: "npm:^6.26.0" + babylon: "npm:^6.18.0" + lodash: "npm:^4.17.4" + checksum: 9391ca7fb630cd529846a2c6337193442b09dbeaba01707372880954f28cf4b64a033710b64fe7e82ccccff1afc3ec58a18b8d4eba7d532d118bc19b4ff5e9bf + languageName: node + linkType: hard + +"babel-traverse@npm:^6.24.1, babel-traverse@npm:^6.26.0": + version: 6.26.0 + resolution: "babel-traverse@npm:6.26.0" + dependencies: + babel-code-frame: "npm:^6.26.0" + babel-messages: "npm:^6.23.0" + babel-runtime: "npm:^6.26.0" + babel-types: "npm:^6.26.0" + babylon: "npm:^6.18.0" + debug: "npm:^2.6.8" + globals: "npm:^9.18.0" + invariant: "npm:^2.2.2" + lodash: "npm:^4.17.4" + checksum: aa3e5fff686de0c91e56b70e13d1dbfeac615655e742b01b766e832f6830c5028a9c4d024df95cb119d387a7aaa5d7ce1c2b4568648b3e1a72e054f5ab3a2b07 + languageName: node + linkType: hard + +"babel-types@npm:^6.19.0, babel-types@npm:^6.24.1, babel-types@npm:^6.26.0": + version: 6.26.0 + resolution: "babel-types@npm:6.26.0" + dependencies: + babel-runtime: "npm:^6.26.0" + esutils: "npm:^2.0.2" + lodash: "npm:^4.17.4" + to-fast-properties: "npm:^1.0.3" + checksum: c45910be4283661d3de64a9835ffe9d5130f836ebacb839b9a2ef3b009c6ac3dec04c89fc644af56c60f37571077a6b440bc054527ee33a250ae04bb44291c63 + languageName: node + linkType: hard + +"babelify@npm:^7.3.0": + version: 7.3.0 + resolution: "babelify@npm:7.3.0" + dependencies: + babel-core: "npm:^6.0.14" + object-assign: "npm:^4.0.0" + checksum: 94fd6bc0435a5a991d0fe751fec7448071dc51fd0dae18b983cf688e487a0f55e3125f548ec924a0d9f0d43d2266fda4b1191bc38b1ffc64dd690b833ff63d64 + languageName: node + linkType: hard + +"babylon@npm:^6.18.0": + version: 6.18.0 + resolution: "babylon@npm:6.18.0" + bin: + babylon: ./bin/babylon.js + checksum: c14bfa585d38e24f8d3db8f140b9b69c6da914bf202b64a9001e1b5a036f3047a4bf65ce2dc6f0fde66c955587ca42985ef479e47ede114e2aa84454745bcadd + languageName: node + linkType: hard + +"backoff@npm:^2.5.0": + version: 2.5.0 + resolution: "backoff@npm:2.5.0" + dependencies: + precond: "npm:0.2" + checksum: 2c73514df8427db607cfc885f1f91f48ec6c49fb293501e49c63d934f755c43d4253ccc8dd8793210fb39d281699abfae89e0f36c02b22de2bf8df7d5b8c0c19 + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9ca7fca1845f06edbd8478e209a2e8eed5bb148a021719e77affeaf0c61e45af20279e4540a9f11942acc27c078fc132ff0ebc9c16a403033cff5af3d8199f40 + languageName: node + linkType: hard + +"base-x@npm:^3.0.2, base-x@npm:^3.0.8": + version: 3.0.9 + resolution: "base-x@npm:3.0.9" + dependencies: + safe-buffer: "npm:^5.0.1" + checksum: fbaf18f82914683d479403061b515e2b861ecf69bf82ec37d41923351a77e3f7cab543e933fe45ce40aab5e3173e13bb76933f5e22600a1f39a89babf4eb477b + languageName: node + linkType: hard + +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: fbd7996978cfe0dd378103fa8999e4acee99b8840d49f452457fa8cb418bad4c20ec9ef6b196a0dc63591f0416a4b8c8d220607292cdaf3998b88685bc0f6c14 + languageName: node + linkType: hard + +"base@npm:^0.11.1": + version: 0.11.2 + resolution: "base@npm:0.11.2" + dependencies: + cache-base: "npm:^1.0.1" + class-utils: "npm:^0.3.5" + component-emitter: "npm:^1.2.1" + define-property: "npm:^1.0.0" + isobject: "npm:^3.0.1" + mixin-deep: "npm:^1.2.0" + pascalcase: "npm:^0.1.1" + checksum: f474b90436bf31d42a4d7cdb46f7bbe63d89173013003f9a4f7f60c8de5b7a3c0a824aeb46557925aa5b854f9d8367c9f8f443db5a57786f16bdee4259ab5f86 + languageName: node + linkType: hard + +"bcrypt-pbkdf@npm:^1.0.0": + version: 1.0.2 + resolution: "bcrypt-pbkdf@npm:1.0.2" + dependencies: + tweetnacl: "npm:^0.14.3" + checksum: 26dacae8fcd8926b2d477eea173937e4fd1255a665435f8c827a016d3939cbe9c2382946cbedcce37e3bdb069716f26be26c663598449dbeb2fefb64eb478df4 + languageName: node + linkType: hard + +"bech32@npm:1.1.4": + version: 1.1.4 + resolution: "bech32@npm:1.1.4" + checksum: 6a956b1770e344255ca1fc23ba39a219a542dd8fbf397435c13c54b24beec32ee76439f53a4bc07d616626e6d0a889e7602ab50bb5dc0dd6ec5089b628c113f6 + languageName: node + linkType: hard + +"bigint-crypto-utils@npm:^3.0.23": + version: 3.2.2 + resolution: "bigint-crypto-utils@npm:3.2.2" + checksum: ca7f59bed6e530eacebcb2458d1d12b3d18468ac8d1de66f58617d386f6fa7a7ffb030ed08a642a59e41409ffab4a0f35f7382e74e7c24c91358bceff54a310d + languageName: node + linkType: hard + +"bignumber.js@npm:^9.0.0": + version: 9.1.1 + resolution: "bignumber.js@npm:9.1.1" + checksum: e44d00804916c299d01e1a83b435111dbced54c6f165df4a0034a8a0a27182d6698f93f408ec804b3ae80896fd6ad8ad43f37939883dc03ecd04a125742f1483 + languageName: node + linkType: hard + +"binary-extensions@npm:^2.0.0": + version: 2.2.0 + resolution: "binary-extensions@npm:2.2.0" + checksum: 16cf7c0cfd2d04c0d7a115473b14054d6b01c077d8894f5eadc53e0cc1a0bea512a6187b314b26c99efd0c5f02b2871ab413017916d9ecaa47fa23d0f519adc6 + languageName: node + linkType: hard + +"bip39@npm:2.5.0": + version: 2.5.0 + resolution: "bip39@npm:2.5.0" + dependencies: + create-hash: "npm:^1.1.0" + pbkdf2: "npm:^3.0.9" + randombytes: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + unorm: "npm:^1.3.3" + checksum: 92bca92d6c247f72391103c13298aee6bf2fab11ebed865bd32af005c4a30d408223004713ca281482148259232d48eee94e60f3127e1179826798514d51b06e + languageName: node + linkType: hard + +"blakejs@npm:^1.1.0": + version: 1.2.1 + resolution: "blakejs@npm:1.2.1" + checksum: 8d9016a94fb8398694d519f6f0dff7effd09cdae656606ea31ecc8869d672c424f457c3ba62398e62c422348a130d3b9485e2d9d92eb261ca7ed91715c0ca9bd + languageName: node + linkType: hard + +"bluebird@npm:^3.5.0, bluebird@npm:^3.5.2": + version: 3.7.2 + resolution: "bluebird@npm:3.7.2" + checksum: 42df9603102ffbb71c0bc66056a66dce510ba136ab746fb2f783daa71843f14b6f22c2897cb224b556cc5546b9a524c224f6b1505e074310273a5ee5b222e072 + languageName: node + linkType: hard + +"bn.js@npm:4.11.6": + version: 4.11.6 + resolution: "bn.js@npm:4.11.6" + checksum: 94b4e92017d624e9f3fa713827ebfa31a8d42d40fadfcb76a0fc2a6533c0d7d8bd0d00895694d9eccf293a19fcb49be398ccf605c9bb6b4507b7712f06bb9e49 + languageName: node + linkType: hard + +"bn.js@npm:^4.0.0, bn.js@npm:^4.1.0, bn.js@npm:^4.10.0, bn.js@npm:^4.11.0, bn.js@npm:^4.11.6, bn.js@npm:^4.11.8, bn.js@npm:^4.11.9, bn.js@npm:^4.8.0": + version: 4.12.0 + resolution: "bn.js@npm:4.12.0" + checksum: bfb4590775a29dad10c8d42da5ba7fca9d4f796f6d278cb27f53c6a6272df5e58a3ca58d879487c9584db9e7a8f73ac843117183bebea2d627c1f0db95848ec8 + languageName: node + linkType: hard + +"bn.js@npm:^5.0.0, bn.js@npm:^5.1.1, bn.js@npm:^5.1.2, bn.js@npm:^5.2.0, bn.js@npm:^5.2.1": + version: 5.2.1 + resolution: "bn.js@npm:5.2.1" + checksum: 0c272b6eeda35a4d2a3bcf5f0cae54080eb876f5aa10789f67322ad891a27dc99f179b4362e1b5fc2e42c408fd8e0014afed4fdf30e4f346561302ea588fd095 + languageName: node + linkType: hard + +"body-parser@npm:1.20.1": + version: 1.20.1 + resolution: "body-parser@npm:1.20.1" + dependencies: + bytes: "npm:3.1.2" + content-type: "npm:~1.0.4" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + on-finished: "npm:2.4.1" + qs: "npm:6.11.0" + raw-body: "npm:2.5.1" + type-is: "npm:~1.6.18" + unpipe: "npm:1.0.0" + checksum: 33f202c9d5e21f9364ecbcc6704b637104e3a802c81e3cc0b05af94681ce3984e2792bb8d05fe5e3471ac0179c13c8d9da80034178a513ebf4b4ab0d56823617 + languageName: node + linkType: hard + +"body-parser@npm:^1.16.0": + version: 1.20.2 + resolution: "body-parser@npm:1.20.2" + dependencies: + bytes: "npm:3.1.2" + content-type: "npm:~1.0.5" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + on-finished: "npm:2.4.1" + qs: "npm:6.11.0" + raw-body: "npm:2.5.2" + type-is: "npm:~1.6.18" + unpipe: "npm:1.0.0" + checksum: 1584963c6e285f19b63890b10570f2e317daf8971cc8e7a603014ee14b62d29d2a1dcd3d1b896fc4f1b5b7f946bec35d7e948ba39c5cf4b4cb24fe1ffafbbf88 + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 5ecc6da29cd3b4d49a832fd8e48f3a8b6ac058f82fe778eb6751ed30a206c5ec5171f6f632aa1946ffb4f8151136740803f620b15edca8437a9348cbb21a8ba8 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: 0f8d0d6a165d636fed93a7dd9321a5ae122cac9a672d8a9e01997e4ae09743cb3cbfb0a6e6b32303cda0f1f40617e2c0953f28f59a6f01d6d12c9698a3f0e41b + languageName: node + linkType: hard + +"braces@npm:^2.3.1": + version: 2.3.2 + resolution: "braces@npm:2.3.2" + dependencies: + arr-flatten: "npm:^1.1.0" + array-unique: "npm:^0.3.2" + extend-shallow: "npm:^2.0.1" + fill-range: "npm:^4.0.0" + isobject: "npm:^3.0.1" + repeat-element: "npm:^1.1.2" + snapdragon: "npm:^0.8.1" + snapdragon-node: "npm:^2.0.1" + split-string: "npm:^3.0.2" + to-regex: "npm:^3.0.1" + checksum: a50c475eebe6ef6b7f70c6fc59731b238662823357dc58d75bbded0dbbed39a2af88f777f91f421a27a9d3c4d9cd838586f46661a8a0e94a16efaa0b21cb2706 + languageName: node + linkType: hard + +"braces@npm:^3.0.2, braces@npm:~3.0.2": + version: 3.0.2 + resolution: "braces@npm:3.0.2" + dependencies: + fill-range: "npm:^7.0.1" + checksum: 1aa7f7f39e1dff23894196303515503dd945f36adcb78073ee067b421ecc595265556911183b24d1bc4e51011d3536d63d117cb4493e5123fcc7456596a93637 + languageName: node + linkType: hard + +"brorand@npm:^1.0.1, brorand@npm:^1.1.0": + version: 1.1.0 + resolution: "brorand@npm:1.1.0" + checksum: f736e127fbac2d704b0b55935c297ec261112b93a178e15170da19c17500d448ebacff3b1edb075821363e8daecc739c062b40e920aa19b8cbed7f4fbe1ff6aa + languageName: node + linkType: hard + +"browser-level@npm:^1.0.1": + version: 1.0.1 + resolution: "browser-level@npm:1.0.1" + dependencies: + abstract-level: "npm:^1.0.2" + catering: "npm:^2.1.1" + module-error: "npm:^1.0.2" + run-parallel-limit: "npm:^1.1.0" + checksum: 89005b8c7bf1e7d528e6d59013e2ce0dc567d7621e55176da38860f6d8fa84181055dc1ffe6bff9fd79a2189c3b6967b5235ac199790031e13f1484a9d06a881 + languageName: node + linkType: hard + +"browser-stdout@npm:1.3.1": + version: 1.3.1 + resolution: "browser-stdout@npm:1.3.1" + checksum: 7741b1c2b005c9ada075d953866522f9d55dd97ae32719dfb4d5a0b8fc271b13152e771702453d2cf8add9dc1c3b048689fc7bb170216e8555282ccfca83a754 + languageName: node + linkType: hard + +"browserify-aes@npm:^1.0.0, browserify-aes@npm:^1.0.4, browserify-aes@npm:^1.2.0": + version: 1.2.0 + resolution: "browserify-aes@npm:1.2.0" + dependencies: + buffer-xor: "npm:^1.0.3" + cipher-base: "npm:^1.0.0" + create-hash: "npm:^1.1.0" + evp_bytestokey: "npm:^1.0.3" + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + checksum: 20e57fc05ef1e4a1c7b1021a38d8497908a0bc59d224277bbb25af90de579bf15ef6cf9fb773af04dc67c9d5255df839a5029d79a30744c8bac0f7bc569de86e + languageName: node + linkType: hard + +"browserify-cipher@npm:^1.0.0": + version: 1.0.1 + resolution: "browserify-cipher@npm:1.0.1" + dependencies: + browserify-aes: "npm:^1.0.4" + browserify-des: "npm:^1.0.0" + evp_bytestokey: "npm:^1.0.0" + checksum: 6b18df4d19c85a24b4f5c603a7bd15ced0104fbaec70d59f5d4a96419769d0a8ed56d081e2b117a6615b27c170e3fa0b3489f684e8d8bd1e94ffabafeda57d28 + languageName: node + linkType: hard + +"browserify-des@npm:^1.0.0": + version: 1.0.2 + resolution: "browserify-des@npm:1.0.2" + dependencies: + cipher-base: "npm:^1.0.1" + des.js: "npm:^1.0.0" + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.1.2" + checksum: 806b7373e09a5d862a0f7eeb589db4071f1636f9fca8857081acf5b87a3b39cdf3a064954a7b578be8b141a7d583364dbd0d3105dcb80f91495dff90e4cf5f76 + languageName: node + linkType: hard + +"browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.0.1": + version: 4.1.0 + resolution: "browserify-rsa@npm:4.1.0" + dependencies: + bn.js: "npm:^5.0.0" + randombytes: "npm:^2.0.1" + checksum: 26189fb42954a20c9f3d396d539736decc3400d179d773f701da4373057e8af03662e07f876d0211360c87b3cf3ee1e8996ca1f39e6c28c959a4faa23a60e40e + languageName: node + linkType: hard + +"browserify-sign@npm:^4.0.0": + version: 4.2.1 + resolution: "browserify-sign@npm:4.2.1" + dependencies: + bn.js: "npm:^5.1.1" + browserify-rsa: "npm:^4.0.1" + create-hash: "npm:^1.2.0" + create-hmac: "npm:^1.1.7" + elliptic: "npm:^6.5.3" + inherits: "npm:^2.0.4" + parse-asn1: "npm:^5.1.5" + readable-stream: "npm:^3.6.0" + safe-buffer: "npm:^5.2.0" + checksum: 1d87600fda7cc67b65f73da21a1a92867d714f1e5629a35b7ae300b5c263f5a49a5d99ab1a6b525e22e238045917b24caaac0b342e53b6b162ca4fa558f60d12 + languageName: node + linkType: hard + +"browserslist@npm:^3.2.6": + version: 3.2.8 + resolution: "browserslist@npm:3.2.8" + dependencies: + caniuse-lite: "npm:^1.0.30000844" + electron-to-chromium: "npm:^1.3.47" + bin: + browserslist: ./cli.js + checksum: 92eabb0af860b12fdda78d7fbf5c0c7efeb67a96038043cb1e5f2cb0a74e799f22aa564bfb12a04f7c1443b935f4433eff9904b25e762cea5f66680d5cfc6725 + languageName: node + linkType: hard + +"bs58@npm:^4.0.0": + version: 4.0.1 + resolution: "bs58@npm:4.0.1" + dependencies: + base-x: "npm:^3.0.2" + checksum: 31702fc34154417085d9bad6102918d25feb0942152c04ed04ba434169321952bca021bcc20b04938dd605bb6868055463038649651498e91323008a5a09857a + languageName: node + linkType: hard + +"bs58check@npm:^2.1.2": + version: 2.1.2 + resolution: "bs58check@npm:2.1.2" + dependencies: + bs58: "npm:^4.0.0" + create-hash: "npm:^1.1.0" + safe-buffer: "npm:^5.1.2" + checksum: 8171f3aebae4ec2d7bb1e5caacb8fe1d86571ff17b9074260440b83d64b19f9daa522a368a0b2aaee8cdaf1f1ac835b2e60b06c1ed717c9fd55bcf89418e6b9c + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 2d8a264381325ee41959bb21bae76dc85b486f253e227a3fa70082c83f14c41665ce227ccda79e93ea2fc12e37a678fe956a6fa01b1876e6142eaf6554585ea4 + languageName: node + linkType: hard + +"buffer-to-arraybuffer@npm:^0.0.5": + version: 0.0.5 + resolution: "buffer-to-arraybuffer@npm:0.0.5" + checksum: f18e05741959abe30dc841b805f019cf8e3032d52f3bbd9de3ec85eaff4f9f77e5b8fb21a89b579e354553a53d35cc01f6681bd19f76933e4365c6737c6dd48d + languageName: node + linkType: hard + +"buffer-xor@npm:^1.0.3": + version: 1.0.3 + resolution: "buffer-xor@npm:1.0.3" + checksum: 057a5740571719edffcb209fbc5842150624b5a3d1ee427f569a85dc5785643e92870fe2506d7812b9125ce8be64e5a295450ae215a678657a738f06044a6adf + languageName: node + linkType: hard + +"buffer-xor@npm:^2.0.1": + version: 2.0.2 + resolution: "buffer-xor@npm:2.0.2" + dependencies: + safe-buffer: "npm:^5.1.1" + checksum: 31a7d0dfaf2d84b256cf4b05ce66dcde8a7d48c4d03e8601d8d83a6a32401f34f41b01548713ca077a8259f075248a041fc1eb7f3c7bb9bd1c6a331dbc4cd65f + languageName: node + linkType: hard + +"buffer@npm:^5.0.5, buffer@npm:^5.2.1, buffer@npm:^5.5.0, buffer@npm:^5.6.0": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 8e611bed4d0309f68565f233d604882560f1c5aece713c7cd4c3111dbfad1ed82bb0e7610685e434f175ee4f39d98bf3a47c5b9b3a3370df0ec85a977dfe837e + languageName: node + linkType: hard + +"buffer@npm:^6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.2.1" + checksum: 8384c4bf1042f6e927d650af0053c54e57734c195f29152921aaa9c6976208e7210ec9202b8cbdac27782e1955497cde631ac9566122ad67062ddc1a04a886c9 + languageName: node + linkType: hard + +"bufferutil@npm:^4.0.1": + version: 4.0.7 + resolution: "bufferutil@npm:4.0.7" + dependencies: + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.3.0" + checksum: 617dd2b9df03ce55171c8c21335d9ed6940d5103002bb1caafd067032c669c5f148413b770de941dab382228c99c9fc2fb279b7c44c92d275849ecc216fba0c0 + languageName: node + linkType: hard + +"busboy@npm:^1.6.0": + version: 1.6.0 + resolution: "busboy@npm:1.6.0" + dependencies: + streamsearch: "npm:^1.1.0" + checksum: 4f9b97d97465ab8d7da3f9ee34129e4e92e473451547f3960224f209249b2546006c0bc66842932c0646c98247facf7f3341a20966114fadd234434e319411ad + languageName: node + linkType: hard + +"bytes@npm:3.1.2": + version: 3.1.2 + resolution: "bytes@npm:3.1.2" + checksum: b9b056ed671c71c7e0f4ce7b60a0c17305d1e3e9b6c967e0e82ce85bd8fad16efa4df992177d429e253b47c45a716e6823a9d046b660b4b5b7e1e21b4801edfe + languageName: node + linkType: hard + +"bytewise-core@npm:^1.2.2": + version: 1.2.3 + resolution: "bytewise-core@npm:1.2.3" + dependencies: + typewise-core: "npm:^1.2" + checksum: ed5a2820a26b49026504dfafe25965824b28c29be41120888bac0484e0095ec08457e82c85bfc177ad0d1b20d98c961d57f8ebf577c553a4642c20def9a010ee + languageName: node + linkType: hard + +"bytewise@npm:~1.1.0": + version: 1.1.0 + resolution: "bytewise@npm:1.1.0" + dependencies: + bytewise-core: "npm:^1.2.2" + typewise: "npm:^1.0.3" + checksum: b9867599d50ad85b9e6d4c2c92a58baec05cca2f128a8afbd57cfee6a7df51a7e92e47f3121baf04d0f3d1c7b09ccbfc39d441e5cea1021a3b39cbd7ecf2ab4b + languageName: node + linkType: hard + +"cacache@npm:^16.1.0": + version: 16.1.3 + resolution: "cacache@npm:16.1.3" + dependencies: + "@npmcli/fs": "npm:^2.1.0" + "@npmcli/move-file": "npm:^2.0.0" + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.1.0" + glob: "npm:^8.0.1" + infer-owner: "npm:^1.0.4" + lru-cache: "npm:^7.7.1" + minipass: "npm:^3.1.6" + minipass-collect: "npm:^1.0.2" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + mkdirp: "npm:^1.0.4" + p-map: "npm:^4.0.0" + promise-inflight: "npm:^1.0.1" + rimraf: "npm:^3.0.2" + ssri: "npm:^9.0.0" + tar: "npm:^6.1.11" + unique-filename: "npm:^2.0.0" + checksum: 54f39565219c47ac624e0efeae123551b5391844f18ae69d0c344f51ce2b9ae4adec62316e5eae7e11cf83c3c21f726a0117d55400182779dce687887ce3f50e + languageName: node + linkType: hard + +"cache-base@npm:^1.0.1": + version: 1.0.1 + resolution: "cache-base@npm:1.0.1" + dependencies: + collection-visit: "npm:^1.0.0" + component-emitter: "npm:^1.2.1" + get-value: "npm:^2.0.6" + has-value: "npm:^1.0.0" + isobject: "npm:^3.0.1" + set-value: "npm:^2.0.0" + to-object-path: "npm:^0.3.0" + union-value: "npm:^1.0.0" + unset-value: "npm:^1.0.0" + checksum: 0d763c37206a635d28d6c508d60595d08aaa1cfe2e193396fa23409b76275da64189d87e9bd4baec666a23e45401ee7902034936da8712e7999359472d3ce7ff + languageName: node + linkType: hard + +"cacheable-lookup@npm:^5.0.3": + version: 5.0.4 + resolution: "cacheable-lookup@npm:5.0.4" + checksum: 08f9009465fbbc867446e41af57c31e1d9f37723d9eab8efe340b71745eded3467b2d707840ec6939d466a961e385493af50bd14c3b4c6854dc2c2e0ec7626b3 + languageName: node + linkType: hard + +"cacheable-request@npm:^6.0.0": + version: 6.1.0 + resolution: "cacheable-request@npm:6.1.0" + dependencies: + clone-response: "npm:^1.0.2" + get-stream: "npm:^5.1.0" + http-cache-semantics: "npm:^4.0.0" + keyv: "npm:^3.0.0" + lowercase-keys: "npm:^2.0.0" + normalize-url: "npm:^4.1.0" + responselike: "npm:^1.0.2" + checksum: 777106606da8b47e511b8728016cdbe6bc5b701e95ddafa9d7544862ffc1009161a48b7c9384d08b12197771ede2e3e7b28f9423733f402fe249ac629b7be766 + languageName: node + linkType: hard + +"cacheable-request@npm:^7.0.2": + version: 7.0.2 + resolution: "cacheable-request@npm:7.0.2" + dependencies: + clone-response: "npm:^1.0.2" + get-stream: "npm:^5.1.0" + http-cache-semantics: "npm:^4.0.0" + keyv: "npm:^4.0.0" + lowercase-keys: "npm:^2.0.0" + normalize-url: "npm:^6.0.1" + responselike: "npm:^2.0.0" + checksum: d48bf325895ea31b1f8a556060676239af59433e7626c37cced3af45f9165e3e62f22eab72e027cd92d86e822a55de682d80a8c31c74af69923fa4fe08dbe3d5 + languageName: node + linkType: hard + +"cachedown@npm:1.0.0": + version: 1.0.0 + resolution: "cachedown@npm:1.0.0" + dependencies: + abstract-leveldown: "npm:^2.4.1" + lru-cache: "npm:^3.2.0" + checksum: 412582c98cec0ff56409fba0ab6301c2b19712a0dda2d8b0e3c711604a16adb92aa4a0667230681f1f9d0688e0676cdf2b01cf873920e77549dc716f5f46ff6e + languageName: node + linkType: hard + +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:~1.0.2": + version: 1.0.2 + resolution: "call-bind@npm:1.0.2" + dependencies: + function-bind: "npm:^1.1.1" + get-intrinsic: "npm:^1.0.2" + checksum: 6fccea8a00310bf2e2b2a07aca0eddbdcd5de2eec9dfe880c1c8b0b7fd3c6809bf28aab0209aa530a35a2fba48587733521df7f83f8d5354047afed78b69a36b + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: a0672a95746fb1be281d90ceedafb6584dd7c33e85bb9987d6caad53ac6eb313874fc2045230e8e08ef076e4aaa899342d99bd9c47bb1dd4f6a2740b62482ca2 + languageName: node + linkType: hard + +"camelcase@npm:^3.0.0": + version: 3.0.0 + resolution: "camelcase@npm:3.0.0" + checksum: f8b64ec77e22516f2d4f0451784025cfee8679f0d00082426b7c12c6b185580fd998ecd2b28203a73c953aa7bc14de36258aeb8ad5854c04887d8bfc5d9483bf + languageName: node + linkType: hard + +"camelcase@npm:^6.0.0": + version: 6.3.0 + resolution: "camelcase@npm:6.3.0" + checksum: 3c802157fc61af58194ed056d1830444ec1268a556bb90c7a3a729db481a897cbfdf86fb9db91b45b5e3b891183024e13bf26c866e8e5a37853ace6fa01b7be1 + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30000844": + version: 1.0.30001486 + resolution: "caniuse-lite@npm:1.0.30001486" + checksum: 1752ba48e6c91adb2299b0205b91df106231d0de305ffcc16d7a7b31bf2dfdde8a1aed980d4d2651fc57e007767d7751df702df082d8e93966555c3c91d44b8b + languageName: node + linkType: hard + +"case@npm:^1.6.3": + version: 1.6.3 + resolution: "case@npm:1.6.3" + checksum: 51755999d6af45778cd86c166a1c54c1c8f509840571d9503ab6a7bf342f427d1cb89d86d628fa7c1a936ecf91c4c54788ea3aa375d77dd1ae0254966949f628 + languageName: node + linkType: hard + +"caseless@npm:~0.12.0": + version: 0.12.0 + resolution: "caseless@npm:0.12.0" + checksum: 33c585c818defa51505672e3957409b0f27d760dd711536d36a782627651d5c0cd3dc02b96b45ed702cd78bb88148e7949eb2aad7b1c4e4274fe70184d789c52 + languageName: node + linkType: hard + +"catering@npm:^2.1.0, catering@npm:^2.1.1": + version: 2.1.1 + resolution: "catering@npm:2.1.1" + checksum: c0e526fe8eb5ab048274e4d12308e98982666521f9b0355abf7a811b91c649d4cc42cc2c2a240de22a39ace97484b2c694cdc5b3b9c311f25678f0607a9c46d7 + languageName: node + linkType: hard + +"cbor@npm:^8.1.0": + version: 8.1.0 + resolution: "cbor@npm:8.1.0" + dependencies: + nofilter: "npm:^3.1.0" + checksum: baa293e7929f3c7d5829089c3dbd6a6c755ad482d41c4b8f8ed8489b93f3d3af630d443599744647606a571ecf02ad3a28bd9f55306ace3e9587bf43645deae8 + languageName: node + linkType: hard + +"chai@npm:^4.3.6": + version: 4.3.7 + resolution: "chai@npm:4.3.7" + dependencies: + assertion-error: "npm:^1.1.0" + check-error: "npm:^1.0.2" + deep-eql: "npm:^4.1.2" + get-func-name: "npm:^2.0.0" + loupe: "npm:^2.3.1" + pathval: "npm:^1.1.1" + type-detect: "npm:^4.0.5" + checksum: 07600143d9c0530811acf71e3fe3d613b13c627d19890e220a01064d9187c49ccd6be76e572a90e061f010f940ca380e9364b383e8a8a3f83313890986f49414 + languageName: node + linkType: hard + +"chalk@npm:^1.1.3": + version: 1.1.3 + resolution: "chalk@npm:1.1.3" + dependencies: + ansi-styles: "npm:^2.2.1" + escape-string-regexp: "npm:^1.0.2" + has-ansi: "npm:^2.0.0" + strip-ansi: "npm:^3.0.0" + supports-color: "npm:^2.0.0" + checksum: 577287c6224796bded023a8dba3907b52f66bfccce6802225c5a0d303d563da76fc2de8523cad5bbb3d006fc19644f88da0388f9884df30cba09e6eb3b0c4700 + languageName: node + linkType: hard + +"chalk@npm:^2.0.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: "npm:^3.2.1" + escape-string-regexp: "npm:^1.0.5" + supports-color: "npm:^5.3.0" + checksum: befd2fe888067cfc8ceac2e7a6a62ee763b26112479dce4ee396981288fa21d5cdf3cc1b45692c94c7c6dc3638c4dc3ee6ec1c794efdf42b02e02f93039285ec + languageName: node + linkType: hard + +"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: cb96ab47eb1b55525e72caac9eed1513bff28e686df7eee6b04379c80922df21c8283d9938af16a645826c94c9e19fb52ad63cbead6b5073d08ae5f8fa2661a2 + languageName: node + linkType: hard + +"check-error@npm:^1.0.2": + version: 1.0.2 + resolution: "check-error@npm:1.0.2" + checksum: 5ef1bce78b7105bd5b3f2e7d80a2c2d405a52c3f53d8c48da34d4b8d05f2a63cda26a66e058c4bcc4111be79246ba9ba93074bc4d8e2a65fe3566f8a3f2f7851 + languageName: node + linkType: hard + +"checkpoint-store@npm:^1.1.0": + version: 1.1.0 + resolution: "checkpoint-store@npm:1.1.0" + dependencies: + functional-red-black-tree: "npm:^1.0.1" + checksum: d0496147d6e5e8589aedf05f38b5d2ea068a3a93576b55856690386c2cdb6c292d4616aa8023b234a87b013e7317b5d43b39f57cae087b484c0c73c86bcc9cab + languageName: node + linkType: hard + +"chokidar@npm:3.5.3, chokidar@npm:^3.4.0": + version: 3.5.3 + resolution: "chokidar@npm:3.5.3" + dependencies: + anymatch: "npm:~3.1.2" + braces: "npm:~3.0.2" + fsevents: "npm:~2.3.2" + glob-parent: "npm:~5.1.2" + is-binary-path: "npm:~2.1.0" + is-glob: "npm:~4.0.1" + normalize-path: "npm:~3.0.0" + readdirp: "npm:~3.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: eb45bf6464f6c871e2b46926eaaf35abc06624d4ca8b894bc7c927d8ac808e680d977c37283276992159360767d51c64b4c9bb91ece91beceaf3cb4abe555f99 + languageName: node + linkType: hard + +"chownr@npm:^1.1.4": + version: 1.1.4 + resolution: "chownr@npm:1.1.4" + checksum: 011dfe9853fe7feed4fdcb25d2d3b2bf67957948f8e7988d7540aaf56e9cbfb5384d5b56808dfa140277be02401acdfa75f5b67b78576497e482ea8036666ed2 + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: 7b240ff920db951fd3841116c5e0e2ec4750e20c85cd044ea78f636202e1fa47ce0a20d48c3c912edc52ea0f1615aba37bdd6297d3a731b517647ed33c3dee09 + languageName: node + linkType: hard + +"ci-info@npm:^2.0.0": + version: 2.0.0 + resolution: "ci-info@npm:2.0.0" + checksum: 3419c7c2e86345d5b9c6d4ee8d43b9b557e45bddcf491e6d0b14f1ea815fc2147a62e328b6da30cf2a748f9592c3ceafc702e68b34b9e2e58fd562c359cae17d + languageName: node + linkType: hard + +"cids@npm:^0.7.1": + version: 0.7.5 + resolution: "cids@npm:0.7.5" + dependencies: + buffer: "npm:^5.5.0" + class-is: "npm:^1.1.0" + multibase: "npm:~0.6.0" + multicodec: "npm:^1.0.0" + multihashes: "npm:~0.4.15" + checksum: c3d1a2d7b92879ea33149a77d2daef4ed282589be09c09c2409550812ff30eb05531c617ef26d97297201441758af940e5328843978a06ecbed0a346aafacad9 + languageName: node + linkType: hard + +"cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": + version: 1.0.4 + resolution: "cipher-base@npm:1.0.4" + dependencies: + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + checksum: 172fced8856f309407e10e2d6dbf0e31a67047267ec1d9ee62f595ab7edfe8e64734434799af09fa1f64f9908f272cdc623a2c2e26de525646c1beee6c263ab9 + languageName: node + linkType: hard + +"class-is@npm:^1.1.0": + version: 1.1.0 + resolution: "class-is@npm:1.1.0" + checksum: 698b67027dfc1e76f2fc7c512d2a1be31e54458517589d83998266d820da120c2398e77f40772b42f0a24894e364a654f29d4d7d7281f480b574fbcf40f9e4c0 + languageName: node + linkType: hard + +"class-utils@npm:^0.3.5": + version: 0.3.6 + resolution: "class-utils@npm:0.3.6" + dependencies: + arr-union: "npm:^3.1.0" + define-property: "npm:^0.2.5" + isobject: "npm:^3.0.0" + static-extend: "npm:^0.1.1" + checksum: e7fc96034dc63955d303b96c41eaa5728ca86b25aa9a14931d8a440bf7a30c6e7f52837d97337716e24bf74a46e703bbf05eba1b8ef8b67324e61955abc6b0aa + languageName: node + linkType: hard + +"classic-level@npm:^1.2.0": + version: 1.3.0 + resolution: "classic-level@npm:1.3.0" + dependencies: + abstract-level: "npm:^1.0.2" + catering: "npm:^2.1.0" + module-error: "npm:^1.0.1" + napi-macros: "npm:^2.2.2" + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.3.0" + checksum: 5858b3aa45342e1c216ce5a20f6dec984cbe95d63dadc0828f948dc760f6eadc006b8be00bc62b4cf7607db85bdaa9d4b0a5b4a557e788cdcfbbd9c24abf968e + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 0a476c914f0a5e9e12b215729e1a633fcbdd47b8c3d508ebe6441f2ef8d5047fdd0800926349dd18253db4bfcab3e48aa0aca1f2e7f5d614f7194778d7851be4 + languageName: node + linkType: hard + +"cliui@npm:^3.2.0": + version: 3.2.0 + resolution: "cliui@npm:3.2.0" + dependencies: + string-width: "npm:^1.0.1" + strip-ansi: "npm:^3.0.1" + wrap-ansi: "npm:^2.0.0" + checksum: 824790681a683d58c14803a53b183e33e0d952e5642cce655f8138dcdaf640cac63eb902a7808199f63257798ad42e80625bd2f38cc860da89883e92c2c7b660 + languageName: node + linkType: hard + +"cliui@npm:^7.0.2": + version: 7.0.4 + resolution: "cliui@npm:7.0.4" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.0" + wrap-ansi: "npm:^7.0.0" + checksum: 11f16da76b7dc4a78bce29ea89445e2ad30cc7cf78954813095d187cc17924461cf42f941d481cd920ab1672221c709af677436179d6cb87f6176139117664aa + languageName: node + linkType: hard + +"clone-response@npm:^1.0.2": + version: 1.0.3 + resolution: "clone-response@npm:1.0.3" + dependencies: + mimic-response: "npm:^1.0.0" + checksum: c62b009bcb5ad7fb11ba8781e04ee702e9e37226d84578ecd3c4f2aa4607313eb49f3e0d9a8435fe9d93d72962dcfff0f3a659a92e40e2917588b27eece4d744 + languageName: node + linkType: hard + +"clone@npm:2.1.2, clone@npm:^2.0.0": + version: 2.1.2 + resolution: "clone@npm:2.1.2" + checksum: 499686055743e023e7a991c76fb3f002f38643efbedacaebe2314913a10c6e09131457218c9dac2c201721666c1f41d4416492a56f4509fff4d47c5f347ddd86 + languageName: node + linkType: hard + +"code-point-at@npm:^1.0.0": + version: 1.1.0 + resolution: "code-point-at@npm:1.1.0" + checksum: aa1fa193a67389a2b0760066d23abf8efb25aa548242c61fefb037ebde908f25a9afccd304124c6ed6f812d21adb77c4d2cb05b38270f9674a524de0f4923c0d + languageName: node + linkType: hard + +"collection-visit@npm:^1.0.0": + version: 1.0.0 + resolution: "collection-visit@npm:1.0.0" + dependencies: + map-visit: "npm:^1.0.0" + object-visit: "npm:^1.0.0" + checksum: 5a9b46e9300bb9b54ff3864cbe23c62597e330351e003b1da785b96cb147f1e3e00113b9e56a2524bba86b5ad2705a9ebae67c600227b025265c304c59581736 + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: "npm:1.1.3" + checksum: 42f852d574dc58609bba286cd7d10a407e213e20515c0d5d1dd8059b3d4373cd76d1057c3a242f441f2dfc6667badeb790a792662082c8038889c9235f4cd9fa + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: bf4d19d12621eae71a531e5b977f46717b15e0d3253f25790f5779b7577124e4d9c4597df05cee79e8f8e8fc14add04e738a659ee4336ee0cc5587ebc3c602e7 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: b7313c98fd745336a5e1d64921591bcd60e4e0b3894afb56286a4793c4fd304d4a38b00b514845381215ca5ed2994be05d2e1a5a80860b996d26f5f285c77dda + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 80acf64638343898f5b36825f4c9715ced380e738400b308f3f90ca2327f2f98f0c2cfb1f1a6447f267a2e1d1ea2214f26e948d8acab547e5478e2b0816c7c30 + languageName: node + linkType: hard + +"color-support@npm:^1.1.3": + version: 1.1.3 + resolution: "color-support@npm:1.1.3" + bin: + color-support: bin.js + checksum: 8dc879a976be92306773276728e0bbb0925478b2373f133a98e563c497ccd58f220b9c30cea37c72678fe071627d7391b3751a1b92aaa5e872cd278b00b96b74 + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: c3224efc798a4f2066ff2f65c28d60b48ec73b38bf76331ecc61814875cc5c8a93beccc268ca08aaa98a141c262de5787d68685b6682b8b67ad2dadb8bd2ddd2 + languageName: node + linkType: hard + +"command-exists@npm:^1.2.8": + version: 1.2.9 + resolution: "command-exists@npm:1.2.9" + checksum: f49018e2479b5b200ff4a1526f85d0670b72bb97f4006021389daf3b64a845211df5c328e63c602188f7e7cb450cb0c35f81941cacf1aaf74f40ebdfcf707b73 + languageName: node + linkType: hard + +"command-line-args@npm:^4.0.7": + version: 4.0.7 + resolution: "command-line-args@npm:4.0.7" + dependencies: + array-back: "npm:^2.0.0" + find-replace: "npm:^1.0.3" + typical: "npm:^2.6.1" + bin: + command-line-args: bin/cli.js + checksum: c69c7d1757b19224cb0ef9586bfd2248677a878f63944ec93f2ce4826e3531908ff226cff73a6ddd9f87e1468401c7fda0d5ecf0d5235b3084cdac94c2315fcd + languageName: node + linkType: hard + +"commander@npm:3.0.2": + version: 3.0.2 + resolution: "commander@npm:3.0.2" + checksum: 3cfe9d5d30f528cca2bf0146c6d0d5e893f01684ebf3ee60736a19065edbdb74f40d5507803bbcd5984b98748f7d81ec691be964f4c472c105809d5bacdf70bb + languageName: node + linkType: hard + +"commander@npm:^10.0.0": + version: 10.0.1 + resolution: "commander@npm:10.0.1" + checksum: b2a03d799104eac407ca031b94126c98198594fcff41554eb253cef748de57fb1a4cdd591baa075de589f2fddf1f968d1ecd1b79e8b47570ee441ab4f3363776 + languageName: node + linkType: hard + +"component-emitter@npm:^1.2.1": + version: 1.3.0 + resolution: "component-emitter@npm:1.3.0" + checksum: e24c33abfa9686ae480530207bf4fe1f096f307f2ad9126500e6c460b76b9c7dd648bc2c7b9eb10d622db69ff53f6f7ee65823719e3d94de301c80e1e944288c + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 88222f18b3a68b71fe4473a146c8ed3315ec0488703104319c53543ad4668af3e79418ab79e2fa8032ee04c3eb45cc478815b89877a048cc5ba34e201bc15c35 + languageName: node + linkType: hard + +"concat-stream@npm:^1.5.1": + version: 1.6.2 + resolution: "concat-stream@npm:1.6.2" + dependencies: + buffer-from: "npm:^1.0.0" + inherits: "npm:^2.0.3" + readable-stream: "npm:^2.2.2" + typedarray: "npm:^0.0.6" + checksum: 4695f901d58390c9f9b3ce39d81d24a3a3d4e05c2d14cdea3d7c0c77d04133670e26e71faa1b94dc4e5adb72cbb14d4ea8bf50b82e94aff974dbf0d40f01dd1a + languageName: node + linkType: hard + +"console-control-strings@npm:^1.1.0": + version: 1.1.0 + resolution: "console-control-strings@npm:1.1.0" + checksum: d286ffd439aac97472557325e6aa4cc3a2eefe495a70a9640b89508880db4bba1bd1b29bb011608c23033d884c84cac8da95c8f12ca0ec69ccc70d6d5f39c618 + languageName: node + linkType: hard + +"content-disposition@npm:0.5.4": + version: 0.5.4 + resolution: "content-disposition@npm:0.5.4" + dependencies: + safe-buffer: "npm:5.2.1" + checksum: d38295838d0d136bf434c58deb24b574d66486234832bc97be293d0bd2350acb95a548def1071817346facde253f352f48e7d4ee187f08995b9a6c8317361a5c + languageName: node + linkType: hard + +"content-hash@npm:^2.5.2": + version: 2.5.2 + resolution: "content-hash@npm:2.5.2" + dependencies: + cids: "npm:^0.7.1" + multicodec: "npm:^0.5.5" + multihashes: "npm:^0.4.15" + checksum: 96f0e515fef09354ac67b74eef5cf1665633c6c35e07b420fcc3ce197e0a6fb9c843d0f3911c87ca19f08824343a84a614ce0b99a5ee2a2cda3b4778a95a7b9b + languageName: node + linkType: hard + +"content-type@npm:~1.0.4, content-type@npm:~1.0.5": + version: 1.0.5 + resolution: "content-type@npm:1.0.5" + checksum: aa41501a6a2040fd19cdb39ac7e077f414c269cbfa0a274dd6b2ce1ef10c8211ea11b9bf3c034ba6872fde5f16d0b234062df62ab5a773b978cce40b60e01747 + languageName: node + linkType: hard + +"convert-source-map@npm:^1.5.1": + version: 1.9.0 + resolution: "convert-source-map@npm:1.9.0" + checksum: 7c665ec75a792623eff22413a59fb6646770063eb871efe7550cfba4f17177137ea300f964c2763db69355384398de491126fbe064fa83b25e3023b87711b6e4 + languageName: node + linkType: hard + +"cookie-signature@npm:1.0.6": + version: 1.0.6 + resolution: "cookie-signature@npm:1.0.6" + checksum: b99cb14f01bd69029eba0a24f3468034a590ff9ca048dcd37dcb344be2edf8691de8bbef8acffbadc2c5b38f6064fd7eb79714054458f6b714af3e25a884a9f5 + languageName: node + linkType: hard + +"cookie@npm:0.5.0": + version: 0.5.0 + resolution: "cookie@npm:0.5.0" + checksum: 23bd6dd64f025869373c6f3c72a870b9bd0e0e6a0ffe734229c032d7aca51972ba584b39100c09141b18043e790862425aae4a60d7449fca565b21cdae0cb3c3 + languageName: node + linkType: hard + +"cookie@npm:^0.4.1": + version: 0.4.2 + resolution: "cookie@npm:0.4.2" + checksum: e2b0be16f59835785be50f5dfe076c26e81ab49c988a6290144444d0dfdf8192e82b0aa1857734b292567795e7af3f2c951d82e5036a2aacb15cd4a6681b5d49 + languageName: node + linkType: hard + +"cookiejar@npm:^2.1.1": + version: 2.1.4 + resolution: "cookiejar@npm:2.1.4" + checksum: 61b09ec3009c2e499e91328e5c72986f0131030863b56cfc51546607f265ed976d118380f94cf88ffd322e4b5f658811c157214ec204e04ec40b7d4bb826a295 + languageName: node + linkType: hard + +"copy-descriptor@npm:^0.1.0": + version: 0.1.1 + resolution: "copy-descriptor@npm:0.1.1" + checksum: 1115ff4bee07bf9dde218367cb2c7bc6499efdfdc607d774e7dd4ca414b2d82fd5a4f6085867ac4ce480e0ee7fcc1131062e873b85316699bbef4edbc28e54f9 + languageName: node + linkType: hard + +"core-js-pure@npm:^3.0.1": + version: 3.30.2 + resolution: "core-js-pure@npm:3.30.2" + checksum: 1f74a03c94b2737b0aaccf473a0194e9fa4a59d72802c3f8e3e11d63dfc1aeb3b2d2a8be79446065ec9aedaf4ca1895f05277b2cae19c1286f1640b49dd21650 + languageName: node + linkType: hard + +"core-js@npm:^2.4.0, core-js@npm:^2.5.0": + version: 2.6.12 + resolution: "core-js@npm:2.6.12" + checksum: 1cab48644f8b5d4c58c9ce82b045d1c683ba0b8025abd7df1b6a91a4dd24c64ea4194cc769849fedc71c0f56e1645cf6bc36808cbadd53b9a6dcb48c821df811 + languageName: node + linkType: hard + +"core-util-is@npm:1.0.2": + version: 1.0.2 + resolution: "core-util-is@npm:1.0.2" + checksum: f6006dfc860ac490b330431be370c58e9b8601d3affe85a08309665970431e12a672ebf1c57799795e145f4fc488c208b2ee992c42fa57faae2649c6f514845e + languageName: node + linkType: hard + +"core-util-is@npm:~1.0.0": + version: 1.0.3 + resolution: "core-util-is@npm:1.0.3" + checksum: 3bd2c52819a46215dbe36b3686ec77a7897dcb288eedf217c352451f0e53c131426d191dca4d06f554e8abdcf4b75a8d0ceec85c25126c762e8fd89292f7e4c9 + languageName: node + linkType: hard + +"cors@npm:^2.8.1": + version: 2.8.5 + resolution: "cors@npm:2.8.5" + dependencies: + object-assign: "npm:^4" + vary: "npm:^1" + checksum: 8451ae4bb9710e6cc03c61283b226747397162b54d12cf77e257184e6bd568387864d6a817bba9752c2febb686fe45a14b7b0ce6f68e3e70d25df2ba6e17e80e + languageName: node + linkType: hard + +"cosmiconfig@npm:^8.0.0": + version: 8.1.3 + resolution: "cosmiconfig@npm:8.1.3" + dependencies: + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + parse-json: "npm:^5.0.0" + path-type: "npm:^4.0.0" + checksum: 953a17b0f3fb5552367f9bc816629ec11f06d7b6dff193e08b4b384dfa6add8a7967bc79f996f570409211faa5597b4512ff5c76b49d14aa455f443d61b456c4 + languageName: node + linkType: hard + +"crc-32@npm:^1.2.0": + version: 1.2.2 + resolution: "crc-32@npm:1.2.2" + bin: + crc32: bin/crc32.njs + checksum: 3412e2f46a8ef7616a1bcd3e656cd075549ae125ab3a965e874d287a5dfda1114b3cc13891007f00ddeef74e1f19a0266fa48871217ac1b3f53f7b5cf1167f70 + languageName: node + linkType: hard + +"create-ecdh@npm:^4.0.0": + version: 4.0.4 + resolution: "create-ecdh@npm:4.0.4" + dependencies: + bn.js: "npm:^4.1.0" + elliptic: "npm:^6.5.3" + checksum: 9d6564526a4f7832163b0f3dc40c88ad4b0f2fb68ac3f3f9eb4ebe38b2d73b187ed18f59417fdf31a9b2d7851791632a60c6bd1f024480a4a11668a13b6517ec + languageName: node + linkType: hard + +"create-hash@npm:^1.1.0, create-hash@npm:^1.1.2, create-hash@npm:^1.2.0": + version: 1.2.0 + resolution: "create-hash@npm:1.2.0" + dependencies: + cipher-base: "npm:^1.0.1" + inherits: "npm:^2.0.1" + md5.js: "npm:^1.3.4" + ripemd160: "npm:^2.0.1" + sha.js: "npm:^2.4.0" + checksum: a5d13f75066993de16f734b54158594295a9c10643b941e3f2e3bbe72905d716059fd37b05bbfb63b4165a6d6124f204b5a0e4b54b88adf2e03750977c7ca6fd + languageName: node + linkType: hard + +"create-hmac@npm:^1.1.0, create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": + version: 1.1.7 + resolution: "create-hmac@npm:1.1.7" + dependencies: + cipher-base: "npm:^1.0.3" + create-hash: "npm:^1.1.0" + inherits: "npm:^2.0.1" + ripemd160: "npm:^2.0.0" + safe-buffer: "npm:^5.0.1" + sha.js: "npm:^2.4.8" + checksum: 391ca2ff28117042086e16e9343f3ad62c7c2d18221d76d838d3d31e678fa33838c3cda2a645c5189ccf104ca1e35d57aa19e4c5c653ff2c82db8b095851d7f3 + languageName: node + linkType: hard + +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: 9db2a6d1a6e69929e4b18045910289a17543f9f07ba4d6027e9c3fdc4c985998cd4b6738a45675ab870287483832332d5aa75a1612c87230149d1fba568ae86a + languageName: node + linkType: hard + +"cross-fetch@npm:^2.1.0, cross-fetch@npm:^2.1.1": + version: 2.2.6 + resolution: "cross-fetch@npm:2.2.6" + dependencies: + node-fetch: "npm:^2.6.7" + whatwg-fetch: "npm:^2.0.4" + checksum: b2df5bd708847cc8fc32e9d2f9eb6f9eb66d289b55b26b02a375201653025e08dbf34fd90501303ac9fadaf7ee6c4d46369cfa9cf0a499790303905ae73afc5e + languageName: node + linkType: hard + +"cross-fetch@npm:^3.1.5": + version: 3.1.5 + resolution: "cross-fetch@npm:3.1.5" + dependencies: + node-fetch: "npm:2.6.7" + checksum: 83fa7b13186c55abf289d6907b7d0be13e8c85066fb7d82a99b1b16ebcbf4cb49bcd9806020e386c94d69c7c09e15c4aade7de56ece40f86dba0147915d5c196 + languageName: node + linkType: hard + +"cross-spawn@npm:^6.0.5": + version: 6.0.5 + resolution: "cross-spawn@npm:6.0.5" + dependencies: + nice-try: "npm:^1.0.4" + path-key: "npm:^2.0.1" + semver: "npm:^5.5.0" + shebang-command: "npm:^1.2.0" + which: "npm:^1.2.9" + checksum: 8a530666300ebbe1f1a1cd08221923443ecee36e2f0dc881099013db42922cf9605efac8364563497402a9ab947cf7785c5cd8cb70c5efa1b992a00007cb2189 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.2": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 37ec685f91f04d4719892f305fa6f632aae256df7f2f3f98d5c36f2197651ad7b77851aaa2d397d19a9555f0fb89fa18f9bb3ff4b440535cc0fb4fe0a72004b9 + languageName: node + linkType: hard + +"crypto-browserify@npm:3.12.0": + version: 3.12.0 + resolution: "crypto-browserify@npm:3.12.0" + dependencies: + browserify-cipher: "npm:^1.0.0" + browserify-sign: "npm:^4.0.0" + create-ecdh: "npm:^4.0.0" + create-hash: "npm:^1.1.0" + create-hmac: "npm:^1.1.0" + diffie-hellman: "npm:^5.0.0" + inherits: "npm:^2.0.1" + pbkdf2: "npm:^3.0.3" + public-encrypt: "npm:^4.0.0" + randombytes: "npm:^2.0.0" + randomfill: "npm:^1.0.3" + checksum: 919c1dc2ef93ca4739e8267895034a1fc825fe1cb19d322cb035580ad43098d874b77013dc221e2cf5fe76805092d09bbf5ae839e94055dc61af692fd99d5e7c + languageName: node + linkType: hard + +"d@npm:1, d@npm:^1.0.1": + version: 1.0.1 + resolution: "d@npm:1.0.1" + dependencies: + es5-ext: "npm:^0.10.50" + type: "npm:^1.0.1" + checksum: 41085148f32d71ee2ea698db3bcc00115a83a44251ffc7180d66b3ff2b7fd9482a8374b048062cb0f1996df5f3449745894c87d2d449c711c5145db78c9559bf + languageName: node + linkType: hard + +"dashdash@npm:^1.12.0": + version: 1.14.1 + resolution: "dashdash@npm:1.14.1" + dependencies: + assert-plus: "npm:^1.0.0" + checksum: 4904e050758457a2c9730e8eb783e1d6ba9c16d115aae263762606479ff94eb5272ed4d3e0e8cadebdb666485af89fcfcc369d32fbc4d78e2cd6088c4be436f4 + languageName: node + linkType: hard + +"debug@npm:2.6.9, debug@npm:^2.2.0, debug@npm:^2.3.3, debug@npm:^2.6.8, debug@npm:^2.6.9": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: "npm:2.0.0" + checksum: 143f776060e764362b11d8788c6ef7b125fe930f0b5766559c11521af6dfc256979726167a66218249d8e2f99548c1a8bdb026aad577deecc86b56b4652d4626 + languageName: node + linkType: hard + +"debug@npm:3.2.6": + version: 3.2.6 + resolution: "debug@npm:3.2.6" + dependencies: + ms: "npm:^2.1.1" + checksum: 2ed2def05047d5f70c43a0572ad3db3a027a61f32bfa6a43d02a6e7d70d6abd1d78b7cd8fd4b89a2d026969b65fd4ab67c5702bc01cdb17d1347298aa69f7e09 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: "npm:2.1.2" + peerDependenciesMeta: + supports-color: + optional: true + checksum: ab50d98b6f2a0e803379e8f789017f4215efd0e085774623e462c691e9f99bfd359a35f7424ff401da3ea58b31f89ceebc9ea35779b4a94f78b0ee3e235b6640 + languageName: node + linkType: hard + +"debug@npm:^3.1.0": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: "npm:^2.1.1" + checksum: b98f479c1004d349128ba45f38fb1af53fa3ab1a3614f27c56e2cfbee34b58cbf7dc060fead0882a5b64924e49d1dd59fb796a5d90ba7b1987d72d426e199253 + languageName: node + linkType: hard + +"decamelize@npm:^1.1.1": + version: 1.2.0 + resolution: "decamelize@npm:1.2.0" + checksum: 78728512bf37e5c8d093bf375191b808d54bea424d3cf61730d4c00fe11f404bde37c02e5bd28da7d4981411a4c5369e67a72d92b038126ddf5e5fcc0d03b645 + languageName: node + linkType: hard + +"decamelize@npm:^4.0.0": + version: 4.0.0 + resolution: "decamelize@npm:4.0.0" + checksum: 28596e0cf52fb5bcc71a48c6f60ef87a2403741ee863b8e197adadb9a565b3da9a91b95c8f0fd411f11a97e791b01e9cbe910bb6feb033fb96f2e65579aa1c53 + languageName: node + linkType: hard + +"decimal.js@npm:^10.4.3": + version: 10.4.3 + resolution: "decimal.js@npm:10.4.3" + checksum: 0fbf4c97adc9826a2f1cf2ae8be8cc00cca3f2b61643ee19f0dd8ee55f11385ed0111d77c8cd234e151c80da1454b20c8e61f0354e3b90b5bec3a72379359049 + languageName: node + linkType: hard + +"decode-uri-component@npm:^0.2.0": + version: 0.2.2 + resolution: "decode-uri-component@npm:0.2.2" + checksum: 470428dd2c9310a948f7a942a64e5e5005a992beba979a6ac0b3635ca1a3915753c7871e3e85d3fd21ea5a7b829f62b7b4c2b368fc8b7cc7455b4d7182807e72 + languageName: node + linkType: hard + +"decompress-response@npm:^3.3.0": + version: 3.3.0 + resolution: "decompress-response@npm:3.3.0" + dependencies: + mimic-response: "npm:^1.0.0" + checksum: 6b6423eebde6911f2bcd1898df0c5b240efe820ebb08cd5e38b27f6962e496cea54d22c984efdcfb98f5b15dc1cdc141c1774e4ed6ea4e0cc1741a7de30a59cb + languageName: node + linkType: hard + +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" + dependencies: + mimic-response: "npm:^3.1.0" + checksum: b4575b109e38fe4bc10a8dc1a9167490da2efc07449bdc2ac9e3444592ee892e84fa89974448639388ad1f56f3a16e95606f3ab9d0c3dbdb84f1cbe432252b9f + languageName: node + linkType: hard + +"deep-eql@npm:^4.1.2": + version: 4.1.3 + resolution: "deep-eql@npm:4.1.3" + dependencies: + type-detect: "npm:^4.0.0" + checksum: b70d39de74834eaa065651e347c41fa3c824f92f52b8c37298ad327e04776f0dfc3f45d8516dc92189f2f493c95b6bae7f91257f350408dc41b8943a7bba9adb + languageName: node + linkType: hard + +"deep-equal@npm:~1.1.1": + version: 1.1.1 + resolution: "deep-equal@npm:1.1.1" + dependencies: + is-arguments: "npm:^1.0.4" + is-date-object: "npm:^1.0.1" + is-regex: "npm:^1.0.4" + object-is: "npm:^1.0.1" + object-keys: "npm:^1.1.1" + regexp.prototype.flags: "npm:^1.2.0" + checksum: 6e3be04cb37d4b6a6f1b16fd9cf2865179357faeb43f9e92079e92cc65e28497f2460a7759bbea7da4bba42b1aee2f5ddf34bcaa3482a4917a345def6330f8f2 + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: dfee7fc148cb00508a2a4af815144cce85a86ec7a5f658525bf6929095baeef7782c166504a0dc3b18872a1f53e27521de3d308a575c6d8063516815fc553a59 + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 367ae28f98c94b2807dd6eba48f4c3d051742c2ab431f1037d60f5cb5af989aac2b170b6a891d5617679bcb95881b4e22a0616161a1f2154894b349b13d384e0 + languageName: node + linkType: hard + +"defer-to-connect@npm:^1.0.1": + version: 1.1.3 + resolution: "defer-to-connect@npm:1.1.3" + checksum: 067d9624b545422565c43588a756223bc2d53e909f29e28c0ed39d47ef4ce65f774f6386e968c8a4ca05a7c851e676c863320d9956ece71b1e6bc5359ffb1b49 + languageName: node + linkType: hard + +"defer-to-connect@npm:^2.0.0": + version: 2.0.1 + resolution: "defer-to-connect@npm:2.0.1" + checksum: b027a4a33d1e6f42d5287ec33a914190ba9b6a949fd4d5b36020be813871009ab93ead8084950ebd59075d464e99fbea96000c59a89c2aa5ec0eae96fb1cbf68 + languageName: node + linkType: hard + +"deferred-leveldown@npm:~1.2.1": + version: 1.2.2 + resolution: "deferred-leveldown@npm:1.2.2" + dependencies: + abstract-leveldown: "npm:~2.6.0" + checksum: fbbd57ac541e3dbd811a2550a3c1edf1f0c675066844c48e6b0cd30096ad32ec4239c736549fc2cd9438db7f153e9fa9bcfe9455c6c022a0ef2e386a61b0b076 + languageName: node + linkType: hard + +"deferred-leveldown@npm:~4.0.0": + version: 4.0.2 + resolution: "deferred-leveldown@npm:4.0.2" + dependencies: + abstract-leveldown: "npm:~5.0.0" + inherits: "npm:^2.0.3" + checksum: e458c21b54a1266aa42d3226466217e4f8c84bc009c0b3eee32fd39c40f369d0b87980200400385a74a2b928483e6cbbabcf505e5b419f4abc5ecf2fffa16e36 + languageName: node + linkType: hard + +"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4, define-properties@npm:^1.2.0": + version: 1.2.0 + resolution: "define-properties@npm:1.2.0" + dependencies: + has-property-descriptors: "npm:^1.0.0" + object-keys: "npm:^1.1.1" + checksum: f7d87afb83055124b9c0d18d1abb349ca0741d3c5c38e79422447ac800cea5ee1d0ffbc01f121f059964fd0f17e4d80602ba5533427b9dec18df0fa6b9c91585 + languageName: node + linkType: hard + +"define-property@npm:^0.2.5": + version: 0.2.5 + resolution: "define-property@npm:0.2.5" + dependencies: + is-descriptor: "npm:^0.1.0" + checksum: 56115d676e058b5190caa7c21251ae01d2b21360972df782e7942676ca0fb8bddd323ebf8cb37cce0ffa19ed2d21212cc0d730d5a27c703a919fc508507c4316 + languageName: node + linkType: hard + +"define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "define-property@npm:1.0.0" + dependencies: + is-descriptor: "npm:^1.0.0" + checksum: cbe268428a690cb006cab599a868688578e2ed40fd4323a14029281df82d6b1313061c824d9ac9ad609f2e84d8759264fe06c989505ae4ced5836e9cefb0d245 + languageName: node + linkType: hard + +"define-property@npm:^2.0.2": + version: 2.0.2 + resolution: "define-property@npm:2.0.2" + dependencies: + is-descriptor: "npm:^1.0.2" + isobject: "npm:^3.0.1" + checksum: 6251ba95705ad29d6ea71aa8681ebcdee3ae1763f5406def305f939868f542ea213ff86f51c0959289238ab443ad5660c2a81e5b91f48d727ee743a10e7553af + languageName: node + linkType: hard + +"defined@npm:~1.0.1": + version: 1.0.1 + resolution: "defined@npm:1.0.1" + checksum: 0035f4bb59053b07593a4646e5b1e84a8fa5ec2ba5cc05ddbd91575038637ab68c5a2158562ef8db54968b1f54a3c643559b740ed96561ff19e0951a663b8ed9 + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 22f11ed342773dbc427e84d5a972e5c67fc34a44bf80eead5a41d8697c9303ae32991e568921cbd82553deeb1b33f3d6ecc148bf0efe3789589c8cb7b0e1a53a + languageName: node + linkType: hard + +"delegates@npm:^1.0.0": + version: 1.0.0 + resolution: "delegates@npm:1.0.0" + checksum: 2ef8c043c6caea7f00f23236e0606b00f10d2b497657d63d230e50efdef307936b070734187b03960b9c4afe64ce9e09a77c01da60e661d42dcefec11ce41c30 + languageName: node + linkType: hard + +"depd@npm:2.0.0, depd@npm:^2.0.0": + version: 2.0.0 + resolution: "depd@npm:2.0.0" + checksum: 170e90bfa90081462303140623fdf938aeba2f066b1c7a9a1c599b257ea8127d36b9d39fad5a9d71f5282a3bb5a8ca287ce4d8c6cecd0f65e6bf3779cc6091be + languageName: node + linkType: hard + +"des.js@npm:^1.0.0": + version: 1.0.1 + resolution: "des.js@npm:1.0.1" + dependencies: + inherits: "npm:^2.0.1" + minimalistic-assert: "npm:^1.0.0" + checksum: db332d75d1ac2085378ff84c9c12ccb2705aeda0f5e6253bb85f3b6e6235682d11231f83e485a12ef2f1c2dee8680289ec930d2b3efdc796750d30967fdd7d9d + languageName: node + linkType: hard + +"destroy@npm:1.2.0": + version: 1.2.0 + resolution: "destroy@npm:1.2.0" + checksum: dc7c93cc92fefb26b1fd5251603da79b0289d06b6891743cb16ac11564aaf0cc985e89efb663322a39a477c4c7f2da51321bf82bb513280a12171cef63b60a21 + languageName: node + linkType: hard + +"detect-indent@npm:^4.0.0": + version: 4.0.0 + resolution: "detect-indent@npm:4.0.0" + dependencies: + repeating: "npm:^2.0.0" + checksum: d3873007e59c65cdac9d7bea018fdd5a1e10e59e0c014cedbef8994d37622d6c8814125a7f29b5a8c675189705d3476c23ff50b29a53995d93afbb49106eccfc + languageName: node + linkType: hard + +"diff@npm:5.0.0": + version: 5.0.0 + resolution: "diff@npm:5.0.0" + checksum: 19f4cad11d6e9d702c34810934074bd2bed661a49200c41d4f2dc3b70c29e92ca2fa18ce1606c8e71db59a86d357ede3234c94e8e3a39b605bcd0df0b4209da9 + languageName: node + linkType: hard + +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: 1b445113c0727e15646a058b2794df63366bd1e32abf078990b78c2a355fe72e4e3c8de3399f2c5d67f06cd461acdebd91b5f71cb2cd02f7300bdb926a3cd6e2 + languageName: node + linkType: hard + +"diffie-hellman@npm:^5.0.0": + version: 5.0.3 + resolution: "diffie-hellman@npm:5.0.3" + dependencies: + bn.js: "npm:^4.1.0" + miller-rabin: "npm:^4.0.0" + randombytes: "npm:^2.0.0" + checksum: e8fa8362bfe35862da10d9d9775c38ac769fe9c7c70248c641efbd4efca9f2b26af4eee21cbdc0fa197066eca0b932b798fc67bf027541c2a739d4c4d9569b01 + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: "npm:^4.0.0" + checksum: 713590b89f9d09b80da82094419260ee15f4e67da692659876ac747ee38788dbb8b2bd5d2749bbcf298ce934888e378569f01895a136a09b54d1b28753e337c7 + languageName: node + linkType: hard + +"dir-to-object@npm:^2.0.0": + version: 2.0.0 + resolution: "dir-to-object@npm:2.0.0" + checksum: 6711d5962e8e3916c6e8ded663d776ecc325033e3360c2d212dc6727a7385692009c0392dfbbd2ba288d83f93e8449d05824c04461c0ea80555332fdf43870fe + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: 6b38a63fa66847d80e130bb85c83c173b1050037fffac3d5f740c8c691243d5b6fadc5ec502ae8297c474680d879eb24ad8ec7f901673704fe40c8dedc1bee62 + languageName: node + linkType: hard + +"dom-walk@npm:^0.1.0": + version: 0.1.2 + resolution: "dom-walk@npm:0.1.2" + checksum: d1cb40e62dd73d55797ee4c16798159f4bfd88bbe5491aafd3f19cf9e5a44cac5c2d6511d10afd890bc6c6b18864bd8aa90d9fb17f6ab4c3d2ceb03c884d5f47 + languageName: node + linkType: hard + +"dotignore@npm:~0.1.2": + version: 0.1.2 + resolution: "dotignore@npm:0.1.2" + dependencies: + minimatch: "npm:^3.0.4" + bin: + ignored: bin/ignored + checksum: b3a92a526fd65241b34716a3db0fc2ff02b137a15a0abc6003720c3ceca3b2f9317427efe28d7f63f76a9dad2fd18af1aa3d80ebdef58f3670fb6aaec9323893 + languageName: node + linkType: hard + +"duplexer3@npm:^0.1.4": + version: 0.1.5 + resolution: "duplexer3@npm:0.1.5" + checksum: 4c8777b01eecfd898893613b0a16cf3debda10ce12420c4d3172dbfe554b68cf2a4c74eaa46609de823c0087f29458b70a7f3134006a9c73368c57d51967e013 + languageName: node + linkType: hard + +"ecc-jsbn@npm:~0.1.1": + version: 0.1.2 + resolution: "ecc-jsbn@npm:0.1.2" + dependencies: + jsbn: "npm:~0.1.0" + safer-buffer: "npm:^2.1.0" + checksum: cef3f6f2462c6c5d03dc1ebe1532afee95655c3bb1aa89c89462588355f0168afa6e7c63b0d2e3989493c1e4090fae33b7f4d1b57d76fdcea226f3555b15fbcd + languageName: node + linkType: hard + +"ee-first@npm:1.1.1": + version: 1.1.1 + resolution: "ee-first@npm:1.1.1" + checksum: 037800fb1ddc8398702b8fdac0507da850804a43bcc623ccb7969a2ebecb384f1d0dec43dc74dc8b11eeb7652ba8fe5cba9ccce26ee6c78454b38439a5051560 + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.3.47": + version: 1.4.393 + resolution: "electron-to-chromium@npm:1.4.393" + checksum: dc0d6abccb5e3fd70c0748b0ee49b93ddc96ab8845d80b61abc166fef88bad5a18b1b99c570d4b7282347890dfa0f650934ab48c2c46cebc5ea0b155e6dbaaf3 + languageName: node + linkType: hard + +"elliptic@npm:6.5.4, elliptic@npm:^6.4.0, elliptic@npm:^6.5.2, elliptic@npm:^6.5.3, elliptic@npm:^6.5.4": + version: 6.5.4 + resolution: "elliptic@npm:6.5.4" + dependencies: + bn.js: "npm:^4.11.9" + brorand: "npm:^1.1.0" + hash.js: "npm:^1.0.0" + hmac-drbg: "npm:^1.0.1" + inherits: "npm:^2.0.4" + minimalistic-assert: "npm:^1.0.1" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 4453b008cf9e741a87f8e1935398c10124291026e7f2b99a512205a645c59586deaeefbb1e7149574481ec2c4cc7f34efc6ae6ae5bc35a94431be71c0375367e + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: 0b84c9059a3f051e3da79112ee450f22bc8466dde2a7e09a0b1fc4eff3b98183596e6e2704d5356266851e2a013d95467421eb81c36408fbab1aeb3fc5e4764f + languageName: node + linkType: hard + +"emoji-regex@npm:^9.0.0": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: ef0642d76f5116a04296a85ec167696b91ca8a1373d3cd13ec3acfb0f6a77d4d1c6ce94192ab31f8bad5ca69fbd01b556638fdf389128fea48fb5f6c2c754b45 + languageName: node + linkType: hard + +"encodeurl@npm:~1.0.2": + version: 1.0.2 + resolution: "encodeurl@npm:1.0.2" + checksum: 3c87693cb4bf8e6e0da8b549c30c12f638e55c51195048de49c412b3b6c63feced7cbf4743d69e41fc4373cc39bbc6519968faad0e3c8ea24a5c125b727aa79d + languageName: node + linkType: hard + +"encoding-down@npm:5.0.4, encoding-down@npm:~5.0.0": + version: 5.0.4 + resolution: "encoding-down@npm:5.0.4" + dependencies: + abstract-leveldown: "npm:^5.0.0" + inherits: "npm:^2.0.3" + level-codec: "npm:^9.0.0" + level-errors: "npm:^2.0.0" + xtend: "npm:^4.0.1" + checksum: 69038613c0097bf435519d16263d849870ff3f8c9eade32da8507c5123cf5f83e3bee84b87872ecfa5a878aa563d74004d6298c0075941b6c6fc0b911ff93b82 + languageName: node + linkType: hard + +"encoding@npm:^0.1.11, encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: "npm:^0.6.2" + checksum: 954eb7d006c8d466207dcda57ddd15b1d6667607b8da15c7ce400d377504aafcc5e2f5507027cfb045cad7aefd15d18aa3f6e14f3a73ed2b26ad5ff08004536b + languageName: node + linkType: hard + +"end-of-stream@npm:^1.1.0": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: "npm:^1.4.0" + checksum: fa73674a01c2e7a3e17c801cb916c1e0c77f2cc719a42cee1bb3ce3550b9425369e4d0a2b2ce6670cb8eff07d34e67333949c83a30e7ec94625cec68aa07664e + languageName: node + linkType: hard + +"enquirer@npm:^2.3.0": + version: 2.3.6 + resolution: "enquirer@npm:2.3.6" + dependencies: + ansi-colors: "npm:^4.1.1" + checksum: 41e3807cd4114ab988860b99038e9724adba119e23e1e99cdb55e96e39113ec1262c1d6b4367cc061396725d94dc843867fc1adfb17eaf9fe0d19eb741a424c8 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 528af3898854262b86b3adb5de09e6c81b8c0e3f4f675750282281b86782ddc3c33ffc13598d903d9eb23652f339ded86c994b61fe06e5f9cbb69a191f62244b + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 12244d58c3eeb73a5ebf633ff615b2366cedaccfea3c2b4d6a3295f6440661052e9574c71f89d6dc8a5466e3d84be0b1994e2a4017ab10e1f037f8be1ca89a37 + languageName: node + linkType: hard + +"errno@npm:~0.1.1": + version: 0.1.8 + resolution: "errno@npm:0.1.8" + dependencies: + prr: "npm:~1.0.1" + bin: + errno: cli.js + checksum: 8897270c7ba0fefd8eb1ae0852324efbfcb2f2d85025f6c36411605f1f1fc1330431d7a06b407fd0dbe3f051948d67574e100aea984400221c4a09f690098e4a + languageName: node + linkType: hard + +"error-ex@npm:^1.2.0, error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: "npm:^0.2.1" + checksum: 5073bf16fe13e68ffd676d0af3d4bab20e52d917af1cd7e47f61c3cc2b6ec52ec874dc45307a9db6e0b7f8cb47b9f6bb831ff468d2d696cb484a3f7caf2990da + languageName: node + linkType: hard + +"es-abstract@npm:^1.19.0, es-abstract@npm:^1.20.4, es-abstract@npm:^1.21.2": + version: 1.21.2 + resolution: "es-abstract@npm:1.21.2" + dependencies: + array-buffer-byte-length: "npm:^1.0.0" + available-typed-arrays: "npm:^1.0.5" + call-bind: "npm:^1.0.2" + es-set-tostringtag: "npm:^2.0.1" + es-to-primitive: "npm:^1.2.1" + function.prototype.name: "npm:^1.1.5" + get-intrinsic: "npm:^1.2.0" + get-symbol-description: "npm:^1.0.0" + globalthis: "npm:^1.0.3" + gopd: "npm:^1.0.1" + has: "npm:^1.0.3" + has-property-descriptors: "npm:^1.0.0" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + internal-slot: "npm:^1.0.5" + is-array-buffer: "npm:^3.0.2" + is-callable: "npm:^1.2.7" + is-negative-zero: "npm:^2.0.2" + is-regex: "npm:^1.1.4" + is-shared-array-buffer: "npm:^1.0.2" + is-string: "npm:^1.0.7" + is-typed-array: "npm:^1.1.10" + is-weakref: "npm:^1.0.2" + object-inspect: "npm:^1.12.3" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.4" + regexp.prototype.flags: "npm:^1.4.3" + safe-regex-test: "npm:^1.0.0" + string.prototype.trim: "npm:^1.2.7" + string.prototype.trimend: "npm:^1.0.6" + string.prototype.trimstart: "npm:^1.0.6" + typed-array-length: "npm:^1.0.4" + unbox-primitive: "npm:^1.0.2" + which-typed-array: "npm:^1.1.9" + checksum: 63800c131f77145c020be1a4340031f8322f03c6c73cd1336d5893cab09bce257f6c217e60a60188539096f72bc1f4885f474e8bbae8fa949edc8679f905dfd2 + languageName: node + linkType: hard + +"es-array-method-boxes-properly@npm:^1.0.0": + version: 1.0.0 + resolution: "es-array-method-boxes-properly@npm:1.0.0" + checksum: 89cdd370a77eba1a5a66dcaeb8f796caaec0ea45644aeecc4a3c4d70e804d0736dcb061d9008def9a9f1780fbcd07eb47d828166e83fc1bb569eab36f596c189 + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.1": + version: 2.0.1 + resolution: "es-set-tostringtag@npm:2.0.1" + dependencies: + get-intrinsic: "npm:^1.1.3" + has: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.0" + checksum: fecdbc1f62b901b58b33d47e2daa6b43105b33dd233792643dc7aa1d7256d2fa13c47816d1e03e121e948d01d009faa366466e436baefb886afa18720945d439 + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.2.1": + version: 1.2.1 + resolution: "es-to-primitive@npm:1.2.1" + dependencies: + is-callable: "npm:^1.1.4" + is-date-object: "npm:^1.0.1" + is-symbol: "npm:^1.0.2" + checksum: b419a547ffcbd08c23272e283a20018723bd2f39cbee39f66a8fd0fb110b01728ede799bf1365d5981e57a7afb6901916ad147f374e87bb2b11613ebb1d1aaec + languageName: node + linkType: hard + +"es5-ext@npm:^0.10.35, es5-ext@npm:^0.10.50": + version: 0.10.62 + resolution: "es5-ext@npm:0.10.62" + dependencies: + es6-iterator: "npm:^2.0.3" + es6-symbol: "npm:^3.1.3" + next-tick: "npm:^1.1.0" + checksum: b24158bdb79a8de8bbe2f3f75c5dc12a4a5f1da0892cc3f84da7c4d11bfab4665077f591f851f113b13c39ff6f0a300b7de0171e0ad3ebe7ac1124058cb35c94 + languageName: node + linkType: hard + +"es6-iterator@npm:^2.0.3": + version: 2.0.3 + resolution: "es6-iterator@npm:2.0.3" + dependencies: + d: "npm:1" + es5-ext: "npm:^0.10.35" + es6-symbol: "npm:^3.1.1" + checksum: 20961c24246d7bfd7c10d182c370022a3cd4fb72162ac6194d45554b8b949e5997e03d98bc33219f65e9a9d707e75359f66e87476a14e0602efb6748cd9b5729 + languageName: node + linkType: hard + +"es6-symbol@npm:^3.1.1, es6-symbol@npm:^3.1.3": + version: 3.1.3 + resolution: "es6-symbol@npm:3.1.3" + dependencies: + d: "npm:^1.0.1" + ext: "npm:^1.1.2" + checksum: 731987d44a45373f003fa360b3db462982746078bd028fbadc8e49954f726664af145b8e74362c0ddecb829ec26e46a7eaf30eff50a5b39a78cd5cba25f83a49 + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.1.1 + resolution: "escalade@npm:3.1.1" + checksum: 37f3535f99193a5ff755af30866bb55828aff044bdc14e1844d0965470ba87ef686761fbbf2cea02955f1bb8510f72c3308e7dbe2d794fa85058a33bf60ea372 + languageName: node + linkType: hard + +"escape-html@npm:~1.0.3": + version: 1.0.3 + resolution: "escape-html@npm:1.0.3" + checksum: c2c0e204bdee0452b5481e18e659d8f0ef909b774cd8140724e53df3254e75c04e8ff30298f658ca0310191f46de5bbb94459fc55103eb978eb6ffaaf499bbd1 + languageName: node + linkType: hard + +"escape-string-regexp@npm:4.0.0, escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 09f81f2e5eb8d6108ea2fe366eb3041b8bc35381c95c7b7e38f0eb64825a3967618bb0840b7a9e950457d9b4c0a6e758b69374fb7906d939a67018d6c53e8cbe + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.2, escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 14d2c74a990b4a0ae55f299409693533a620402a6efa02b201d7e2ea60c71a516c36ccfcaf2aa604262eec6c4628bf8b9647e211fb179277cb479bd870c906fa + languageName: node + linkType: hard + +"eslint-plugin-mocha-no-only@npm:^1.1.1": + version: 1.1.1 + resolution: "eslint-plugin-mocha-no-only@npm:1.1.1" + dependencies: + requireindex: "npm:~1.1.0" + checksum: d436b8c1bb91a42ad100ee9a3a34355049129858d6ee908dce8a4118f15971dfa229f008eae916f5eea37d4567357e80df2f7732e4ac8032889ee3291ba2b18d + languageName: node + linkType: hard + +"eslint-plugin-prettier@npm:^4.2.1": + version: 4.2.1 + resolution: "eslint-plugin-prettier@npm:4.2.1" + dependencies: + prettier-linter-helpers: "npm:^1.0.0" + peerDependencies: + eslint: ">=7.28.0" + prettier: ">=2.0.0" + peerDependenciesMeta: + eslint-config-prettier: + optional: true + checksum: add67757bf011d6c2f1e7c659975117b43aa9f81ebc799d69205fb2c43ed45ec0d36bdbdcfd3f0242ba1ac7030a73b381468adb82dda5aee0d986d450226442c + languageName: node + linkType: hard + +"eslint-scope@npm:^5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^4.1.1" + checksum: 50c26e6abd713f6acf27498e37af26dc08d9b2781c038a32d8c44dbab59744233de58b1bd6b3a21286384ea40458962a80d8f3923c33c90369f4d0e891c69065 + languageName: node + linkType: hard + +"eslint-scope@npm:^7.2.0": + version: 7.2.0 + resolution: "eslint-scope@npm:7.2.0" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: a68b86c2ab4bd4605f3d1f08007c9dcffebaffe80e12a5afe31ffe4350933d10a1b26b679851d5fbc931ffc59f4afab1778d44ac74ca05c0aa4e591acf403859 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1": + version: 3.4.1 + resolution: "eslint-visitor-keys@npm:3.4.1" + checksum: 97db79746bfe11a3ab0e60ce454cd809e7ac167ddd7d28736845ba57b8402d6b5d6c10fed2decf8c4026f7d3d659ebc024336ef30fdf473f0402bb1237c6a410 + languageName: node + linkType: hard + +"eslint@npm:^8.26.0": + version: 8.40.0 + resolution: "eslint@npm:8.40.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.4.0" + "@eslint/eslintrc": "npm:^2.0.3" + "@eslint/js": "npm:8.40.0" + "@humanwhocodes/config-array": "npm:^0.11.8" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@nodelib/fs.walk": "npm:^1.2.8" + ajv: "npm:^6.10.0" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + doctrine: "npm:^3.0.0" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^7.2.0" + eslint-visitor-keys: "npm:^3.4.1" + espree: "npm:^9.5.2" + esquery: "npm:^1.4.2" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^6.0.1" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + globals: "npm:^13.19.0" + grapheme-splitter: "npm:^1.0.4" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.0.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + is-path-inside: "npm:^3.0.3" + js-sdsl: "npm:^4.1.4" + js-yaml: "npm:^4.1.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + levn: "npm:^0.4.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.1" + strip-ansi: "npm:^6.0.1" + strip-json-comments: "npm:^3.1.0" + text-table: "npm:^0.2.0" + bin: + eslint: bin/eslint.js + checksum: bd17385067c8d43fa757370f5e3356de6f14639cf7d64d545a0ffbdabd678d87c5b8bc7e00b949ab36e466460a788a7ed98a4f13a3c795f720ae0f417903a749 + languageName: node + linkType: hard + +"espree@npm:^9.5.2": + version: 9.5.2 + resolution: "espree@npm:9.5.2" + dependencies: + acorn: "npm:^8.8.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 05c52faae1e5c72ba3ab639d06937a0570d64946d9062762cac1918c70921f67a17e1370a3503af1eb9ff27f36f9c1932389fcc810a98e9ee9887597d07911e5 + languageName: node + linkType: hard + +"esprima-extract-comments@npm:^1.1.0": + version: 1.1.0 + resolution: "esprima-extract-comments@npm:1.1.0" + dependencies: + esprima: "npm:^4.0.0" + checksum: e483bb9095fac72f030d1368a15160ac5d1b6f2b4e4c02874158fc7fa82cf3ba5b549c3b9871f2ddb9e10d49cb627b568a4b7338e1163bc8026dd65aa1b86d88 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 08b3015538b1f7f087a4ea49b5a3d8ff9590ecf7eb43511182c9198cfe168a5cc1736c2ae33263c79cfbe9e984c1880ee971b64ad96e7c84db74488e6ee93c1b + languageName: node + linkType: hard + +"esquery@npm:^1.4.2": + version: 1.5.0 + resolution: "esquery@npm:1.5.0" + dependencies: + estraverse: "npm:^5.1.0" + checksum: 4bde95396273b2960a330c296e921d88b7d3fb5c9cbc84a1e29cf75664c318b194b1a8b46f507fce30222a68b64527f70e09bdd5863e14248fa2f6da5e78fdfd + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: c28c10e80803687b81ccbe90b9b66d9b21144a27f672208970ebfd306d7f2f2ee2827754b2effb771c35de48455de944c434f2fcf3c5d7da27956a5f69464a5a + languageName: node + linkType: hard + +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: befc0287c32a7844aa00a3bb474189d51afa4c8c1d754937c2b2e70c0ca5bd0750da7ab2c84809aa130e0e1320dd386ea2381aac205f02b83569436e453e320a + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 4db420d3f0291d3c42e3700aee2986ec1ca8384224236da9441e67555c8af181fe5f883b0b312021ed475f0c138282066b0f5cb2240ee4a0c2ec5142274162d1 + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 179e017b58d3c0c3ecbe5f6d27abf26cdde45cea702c037bc80a74e32b28ab20d7a03820c002c3f7202706fb6baff40bba1a1e0843ec4e8eba6062ab9f976c70 + languageName: node + linkType: hard + +"etag@npm:~1.8.1": + version: 1.8.1 + resolution: "etag@npm:1.8.1" + checksum: 70d88dfb36416dffbb09859cb5c72a71ae9a0b3da550643a75d28d3a853c999fb30076bc33d2a1c3882988e3631093b148bacaee133e070de4798e63753b82ac + languageName: node + linkType: hard + +"eth-block-tracker@npm:^3.0.0": + version: 3.0.1 + resolution: "eth-block-tracker@npm:3.0.1" + dependencies: + eth-query: "npm:^2.1.0" + ethereumjs-tx: "npm:^1.3.3" + ethereumjs-util: "npm:^5.1.3" + ethjs-util: "npm:^0.1.3" + json-rpc-engine: "npm:^3.6.0" + pify: "npm:^2.3.0" + tape: "npm:^4.6.3" + checksum: b3fe1d2ba576e8a881800b844d50c5c068c1e709b24d95e8227139e13c5b2016589ae1d7ca696275cd8fef610f74069449b4c34a89372e817d43f6b869c29ae9 + languageName: node + linkType: hard + +"eth-ens-namehash@npm:2.0.8, eth-ens-namehash@npm:^2.0.8": + version: 2.0.8 + resolution: "eth-ens-namehash@npm:2.0.8" + dependencies: + idna-uts46-hx: "npm:^2.3.1" + js-sha3: "npm:^0.5.7" + checksum: 5e9c00b0c8ca0db1250ea6078251ab3c06f5ed15a2089bf14e5100f48aeeaa68d5cf51eb5bd84575536e6f138c05cce0a2b75f396d1a70206db0b176cf750e86 + languageName: node + linkType: hard + +"eth-json-rpc-infura@npm:^3.1.0": + version: 3.2.1 + resolution: "eth-json-rpc-infura@npm:3.2.1" + dependencies: + cross-fetch: "npm:^2.1.1" + eth-json-rpc-middleware: "npm:^1.5.0" + json-rpc-engine: "npm:^3.4.0" + json-rpc-error: "npm:^2.0.0" + checksum: 8026467fa1542e801aebc0d021366e2d0b8134b277afcebfd78416cf50d5d408ba6726adde1c659e4b3702722cfe0db3288a0c546e5bb7e69bfed81044d28d2c + languageName: node + linkType: hard + +"eth-json-rpc-middleware@npm:^1.5.0": + version: 1.6.0 + resolution: "eth-json-rpc-middleware@npm:1.6.0" + dependencies: + async: "npm:^2.5.0" + eth-query: "npm:^2.1.2" + eth-tx-summary: "npm:^3.1.2" + ethereumjs-block: "npm:^1.6.0" + ethereumjs-tx: "npm:^1.3.3" + ethereumjs-util: "npm:^5.1.2" + ethereumjs-vm: "npm:^2.1.0" + fetch-ponyfill: "npm:^4.0.0" + json-rpc-engine: "npm:^3.6.0" + json-rpc-error: "npm:^2.0.0" + json-stable-stringify: "npm:^1.0.1" + promise-to-callback: "npm:^1.0.0" + tape: "npm:^4.6.3" + checksum: 28eeaf824c85f85f8493d93359dd34bc00c234c71bc85a94d967ccac351eaeedb2aa0cdb525392c0f24d6bbbc1db2615c2f70cc5a874c500101555359e7d7c63 + languageName: node + linkType: hard + +"eth-lib@npm:0.2.8": + version: 0.2.8 + resolution: "eth-lib@npm:0.2.8" + dependencies: + bn.js: "npm:^4.11.6" + elliptic: "npm:^6.4.0" + xhr-request-promise: "npm:^0.1.2" + checksum: fcf5f719a4aaa286f5e84bf927c3973311725671992aea670cfc142df067531f27e49b16717de5966ee1351a7a0015c9f9f89d7dd27766736e34731cae9928ad + languageName: node + linkType: hard + +"eth-lib@npm:^0.1.26": + version: 0.1.29 + resolution: "eth-lib@npm:0.1.29" + dependencies: + bn.js: "npm:^4.11.6" + elliptic: "npm:^6.4.0" + nano-json-stream-parser: "npm:^0.1.2" + servify: "npm:^0.1.12" + ws: "npm:^3.0.0" + xhr-request-promise: "npm:^0.1.2" + checksum: ba1cf048409c004b125465ab3d2d8684fe9e3a323fc1ca1c1a49c44d36daa623d880d4bfa468f803548418034dee26d5d1da7c9e75a3e576619dc69352402623 + languageName: node + linkType: hard + +"eth-query@npm:^2.0.2, eth-query@npm:^2.1.0, eth-query@npm:^2.1.2": + version: 2.1.2 + resolution: "eth-query@npm:2.1.2" + dependencies: + json-rpc-random-id: "npm:^1.0.0" + xtend: "npm:^4.0.1" + checksum: 7964560eb76b463b6b33f00112a622e690afc98bcb5a4c6257ac2c9a6225afc8f0e8dd99091e433a51f31aada4992e71eadd096ca1bc58d756b8c4e0ae187c9d + languageName: node + linkType: hard + +"eth-sig-util@npm:3.0.0": + version: 3.0.0 + resolution: "eth-sig-util@npm:3.0.0" + dependencies: + buffer: "npm:^5.2.1" + elliptic: "npm:^6.4.0" + ethereumjs-abi: "npm:0.6.5" + ethereumjs-util: "npm:^5.1.1" + tweetnacl: "npm:^1.0.0" + tweetnacl-util: "npm:^0.15.0" + checksum: ededcdb73208c36e1b46358ede6aa6ff45633ddf626974ce121cbb04c097a939fb1733e4a888a6895e0629dd44feb07a8f2c499b3b9de2407e0636cacef49a7d + languageName: node + linkType: hard + +"eth-sig-util@npm:^1.4.2": + version: 1.4.2 + resolution: "eth-sig-util@npm:1.4.2" + dependencies: + ethereumjs-abi: "git+https://github.com/ethereumjs/ethereumjs-abi.git" + ethereumjs-util: "npm:^5.1.1" + checksum: b34f3ed46068cbda3a6216629275fe785bf7fac4c372fa85fcbe8d79b1aa37c993429cfbfadb968c3c457687202a02bb1c8ee58143213953925a53292cfb388e + languageName: node + linkType: hard + +"eth-tx-summary@npm:^3.1.2": + version: 3.2.4 + resolution: "eth-tx-summary@npm:3.2.4" + dependencies: + async: "npm:^2.1.2" + clone: "npm:^2.0.0" + concat-stream: "npm:^1.5.1" + end-of-stream: "npm:^1.1.0" + eth-query: "npm:^2.0.2" + ethereumjs-block: "npm:^1.4.1" + ethereumjs-tx: "npm:^1.1.1" + ethereumjs-util: "npm:^5.0.1" + ethereumjs-vm: "npm:^2.6.0" + through2: "npm:^2.0.3" + checksum: 90983cb4186e1814042b560698256ff56bddf047d5aa1ec69d602f902c08d02f4595271be08776afcfd69b7cc9420e233a09db50d3578e227ae8f6e2a0b55812 + languageName: node + linkType: hard + +"ethashjs@npm:~0.0.7": + version: 0.0.8 + resolution: "ethashjs@npm:0.0.8" + dependencies: + async: "npm:^2.1.2" + buffer-xor: "npm:^2.0.1" + ethereumjs-util: "npm:^7.0.2" + miller-rabin: "npm:^4.0.0" + checksum: 1019fa4e20fda0b463e8e9f4eed672bcd90046b7cce44f1f1b5f6ecebce60b6ceffbd04245587f02fd261a8a6aaa5a67972a24e2981dd1f605e4f920424961e7 + languageName: node + linkType: hard + +"ethereum-bloom-filters@npm:^1.0.6": + version: 1.0.10 + resolution: "ethereum-bloom-filters@npm:1.0.10" + dependencies: + js-sha3: "npm:^0.8.0" + checksum: d55cd987c3967bedabda49dd4a965f35cccf2ebd5ffe1db308a0b1dd289f980358730a611c206a1725d29b8a7d78c35e7d53ed9cc193cfe2fc849d9ccc9ea148 + languageName: node + linkType: hard + +"ethereum-common@npm:0.2.0": + version: 0.2.0 + resolution: "ethereum-common@npm:0.2.0" + checksum: 80a95d0a07164398e4c65ef224f12667173ece0ca7cc0e2702ab6ac0b2d5c4e5745cd670ba1deacb7d94b24d295cfd5895cdd8bcf33e4637ba56c48543fe8abc + languageName: node + linkType: hard + +"ethereum-common@npm:^0.0.18": + version: 0.0.18 + resolution: "ethereum-common@npm:0.0.18" + checksum: e598a1aaa7473866d05622d8766bb049c0536c6e239364c3727189b5868878b28bfb9a2c04937deaf7e3972ce185cb9ab7e6b1d1ed446149a61ac582cbdf138f + languageName: node + linkType: hard + +"ethereum-cryptography@npm:0.1.3, ethereum-cryptography@npm:^0.1.3": + version: 0.1.3 + resolution: "ethereum-cryptography@npm:0.1.3" + dependencies: + "@types/pbkdf2": "npm:^3.0.0" + "@types/secp256k1": "npm:^4.0.1" + blakejs: "npm:^1.1.0" + browserify-aes: "npm:^1.2.0" + bs58check: "npm:^2.1.2" + create-hash: "npm:^1.2.0" + create-hmac: "npm:^1.1.7" + hash.js: "npm:^1.1.7" + keccak: "npm:^3.0.0" + pbkdf2: "npm:^3.0.17" + randombytes: "npm:^2.1.0" + safe-buffer: "npm:^5.1.2" + scrypt-js: "npm:^3.0.0" + secp256k1: "npm:^4.0.1" + setimmediate: "npm:^1.0.5" + checksum: 01503e19d7e35c876692b70a979a9af62840dd4516e52cddb93930a11078553e6da804f0bbef0d7bd918313a49bca991db67c24bbc9b90f737962d054826f8b2 + languageName: node + linkType: hard + +"ethereum-cryptography@npm:^1.0.3": + version: 1.2.0 + resolution: "ethereum-cryptography@npm:1.2.0" + dependencies: + "@noble/hashes": "npm:1.2.0" + "@noble/secp256k1": "npm:1.7.1" + "@scure/bip32": "npm:1.1.5" + "@scure/bip39": "npm:1.1.1" + checksum: 0c259224c59afcb3ee90b625903bed81a6b8f6448fb7cc15b8ceebe54111aa8c4d3036dcd93c1a3c26b321b448b1ce3768c882deb25a13f4dc42d2fca884ef59 + languageName: node + linkType: hard + +"ethereum-waffle@npm:^3.4.4": + version: 3.4.4 + resolution: "ethereum-waffle@npm:3.4.4" + dependencies: + "@ethereum-waffle/chai": "npm:^3.4.4" + "@ethereum-waffle/compiler": "npm:^3.4.4" + "@ethereum-waffle/mock-contract": "npm:^3.4.4" + "@ethereum-waffle/provider": "npm:^3.4.4" + ethers: "npm:^5.0.1" + bin: + waffle: bin/waffle + checksum: 8c8806862ee32f52c259684c57b3854c6d69b45c9c1858d5885cb296dd0903672a56a2514a29e4aa1de36c0aa22e6bb2e80280f95452d3f777e88f97ffd6a597 + languageName: node + linkType: hard + +"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": + version: 0.6.8 + resolution: "ethereumjs-abi@https://github.com/ethereumjs/ethereumjs-abi.git#commit=ee3994657fa7a427238e6ba92a84d0b529bbcde0" + dependencies: + bn.js: "npm:^4.11.8" + ethereumjs-util: "npm:^6.0.0" + checksum: 3218ad532a8cad90a24b6ae07a6a5384090d81f1021faa83cf561079ade287fd7486b3fa5c9b6fcef4c80bdb4aab11014a4da67fc6b8baf1a65dbf8e9cf426db + languageName: node + linkType: hard + +"ethereumjs-abi@npm:0.6.5": + version: 0.6.5 + resolution: "ethereumjs-abi@npm:0.6.5" + dependencies: + bn.js: "npm:^4.10.0" + ethereumjs-util: "npm:^4.3.0" + checksum: 0c7f2886800f40d94a70081c36d974d6959f63f41fdc02d40bf6c39588fc232338e1882c274237a70344ba45cdbc01ca0bb40148430c2ff54d4b44bf1052f71f + languageName: node + linkType: hard + +"ethereumjs-abi@npm:0.6.8, ethereumjs-abi@npm:^0.6.8": + version: 0.6.8 + resolution: "ethereumjs-abi@npm:0.6.8" + dependencies: + bn.js: "npm:^4.11.8" + ethereumjs-util: "npm:^6.0.0" + checksum: fcbc51370afbe3ab0a5bb6fed2b8b7d3b3373df74e73efb658da8383d104b619e2fb78a80cb44a8013aa88d3fc1c32c1190436456d13f36c49bef6ac5e7c5835 + languageName: node + linkType: hard + +"ethereumjs-account@npm:3.0.0, ethereumjs-account@npm:^3.0.0": + version: 3.0.0 + resolution: "ethereumjs-account@npm:3.0.0" + dependencies: + ethereumjs-util: "npm:^6.0.0" + rlp: "npm:^2.2.1" + safe-buffer: "npm:^5.1.1" + checksum: ec61ec768f67fc5ac9e9af4bd595f210d567a053663de7b0d82a0c3e0fdeeb4f1877c897b843913c60f4e48b29bc7129dff24d38fb8ad2622e2d1585bac1c16a + languageName: node + linkType: hard + +"ethereumjs-account@npm:^2.0.3": + version: 2.0.5 + resolution: "ethereumjs-account@npm:2.0.5" + dependencies: + ethereumjs-util: "npm:^5.0.0" + rlp: "npm:^2.0.0" + safe-buffer: "npm:^5.1.1" + checksum: d1dd4e67f3e02f9e0ff010fa1e904276a1b8b08e58a2dc7e6dd095cfbf5f11235a3278efaa59b4fecc73b5f798bd16bc30c245e3c1833e06ab04781c4f12c7a7 + languageName: node + linkType: hard + +"ethereumjs-block@npm:2.2.2, ethereumjs-block@npm:^2.2.2, ethereumjs-block@npm:~2.2.0, ethereumjs-block@npm:~2.2.2": + version: 2.2.2 + resolution: "ethereumjs-block@npm:2.2.2" + dependencies: + async: "npm:^2.0.1" + ethereumjs-common: "npm:^1.5.0" + ethereumjs-tx: "npm:^2.1.1" + ethereumjs-util: "npm:^5.0.0" + merkle-patricia-tree: "npm:^2.1.2" + checksum: 3f9e9d16ca13c4127a9ccce451d76e713d69937bed736545c2892d95b8a8d9c3525b716910597ee8c57b15dd37583ffb96285d52ab26d157ec9d34ffa73fa55f + languageName: node + linkType: hard + +"ethereumjs-block@npm:^1.2.2, ethereumjs-block@npm:^1.4.1, ethereumjs-block@npm:^1.6.0": + version: 1.7.1 + resolution: "ethereumjs-block@npm:1.7.1" + dependencies: + async: "npm:^2.0.1" + ethereum-common: "npm:0.2.0" + ethereumjs-tx: "npm:^1.2.2" + ethereumjs-util: "npm:^5.0.0" + merkle-patricia-tree: "npm:^2.1.2" + checksum: bd46205b887ec8568241c873424fe94d46e5150afc96fb04051fe249b8074ace3798226327d97879b7079558b1cfd019ad20efeb24e23e45fed71bf156dd29a6 + languageName: node + linkType: hard + +"ethereumjs-blockchain@npm:^4.0.3": + version: 4.0.4 + resolution: "ethereumjs-blockchain@npm:4.0.4" + dependencies: + async: "npm:^2.6.1" + ethashjs: "npm:~0.0.7" + ethereumjs-block: "npm:~2.2.2" + ethereumjs-common: "npm:^1.5.0" + ethereumjs-util: "npm:^6.1.0" + flow-stoplight: "npm:^1.0.0" + level-mem: "npm:^3.0.1" + lru-cache: "npm:^5.1.1" + rlp: "npm:^2.2.2" + semaphore: "npm:^1.1.0" + checksum: 31acf3a8b7ef7b5dae6fccf20407cdfd8fc27e83dc7df17309114c4b0af5778156e34adbb884a63ddd18c898165c329b18d755ed1868c9ab3cff0bd0fbd0234d + languageName: node + linkType: hard + +"ethereumjs-common@npm:1.5.0": + version: 1.5.0 + resolution: "ethereumjs-common@npm:1.5.0" + checksum: 7e25b2f33f4ee7def14324677cfd73cf5d0f0b8d63f8dcdfbe1fbd23cdafb76714c65ede561fee69123a07a76836d954a850432b5926b79e1c02ab7e66abd2be + languageName: node + linkType: hard + +"ethereumjs-common@npm:^1.1.0, ethereumjs-common@npm:^1.3.2, ethereumjs-common@npm:^1.5.0": + version: 1.5.2 + resolution: "ethereumjs-common@npm:1.5.2" + checksum: 131918f005401ef98ec5d7beeacbbdcea4448e25a913e88e8fdd0fff01a86cfd666f6a99d096f723ba92dad73d770bb1fc824a3c0ae2b342505d9b237d3f87bb + languageName: node + linkType: hard + +"ethereumjs-tx@npm:2.1.2, ethereumjs-tx@npm:^2.1.1, ethereumjs-tx@npm:^2.1.2": + version: 2.1.2 + resolution: "ethereumjs-tx@npm:2.1.2" + dependencies: + ethereumjs-common: "npm:^1.5.0" + ethereumjs-util: "npm:^6.0.0" + checksum: e77aad771c288a54628a7302bc5ebaa185dea14fbff81289b80fa72e3db89766575a882ff84bc9f1d48fbeb0ddd52f1cf766fdbe0a9bc2e7fd72508d7d9f99bb + languageName: node + linkType: hard + +"ethereumjs-tx@npm:^1.1.1, ethereumjs-tx@npm:^1.2.0, ethereumjs-tx@npm:^1.2.2, ethereumjs-tx@npm:^1.3.3": + version: 1.3.7 + resolution: "ethereumjs-tx@npm:1.3.7" + dependencies: + ethereum-common: "npm:^0.0.18" + ethereumjs-util: "npm:^5.0.0" + checksum: 3197eac074e44f35333615985063ad1d4645f9427a98f74596a39c0044d148a27de4d9a374d00fa98e7c9cb3db821466295b1c035b71d9f3e526397ccd07b23e + languageName: node + linkType: hard + +"ethereumjs-util@npm:6.2.1, ethereumjs-util@npm:^6.0.0, ethereumjs-util@npm:^6.1.0, ethereumjs-util@npm:^6.2.0, ethereumjs-util@npm:^6.2.1": + version: 6.2.1 + resolution: "ethereumjs-util@npm:6.2.1" + dependencies: + "@types/bn.js": "npm:^4.11.3" + bn.js: "npm:^4.11.0" + create-hash: "npm:^1.1.2" + elliptic: "npm:^6.5.2" + ethereum-cryptography: "npm:^0.1.3" + ethjs-util: "npm:0.1.6" + rlp: "npm:^2.2.3" + checksum: 0fdc1860803c63b0cb5a2b0d3a77c6d4e9ddfc9b1e44ee44581c5e80c1430681d16bf6dc020f7ef10144948b18248a4d56943a43e4c1bc1069fd76b93543fba1 + languageName: node + linkType: hard + +"ethereumjs-util@npm:^4.3.0": + version: 4.5.1 + resolution: "ethereumjs-util@npm:4.5.1" + dependencies: + bn.js: "npm:^4.8.0" + create-hash: "npm:^1.1.2" + elliptic: "npm:^6.5.2" + ethereum-cryptography: "npm:^0.1.3" + rlp: "npm:^2.0.0" + checksum: a7248dd031468c806ad6eb64f6f1535570c721be598db46fdbd7a4b6a7264e567fa4c3b83ba17e0d7287488c79bcfabfc22f38422b2597924209ba58f22023e4 + languageName: node + linkType: hard + +"ethereumjs-util@npm:^5.0.0, ethereumjs-util@npm:^5.0.1, ethereumjs-util@npm:^5.1.1, ethereumjs-util@npm:^5.1.2, ethereumjs-util@npm:^5.1.3, ethereumjs-util@npm:^5.1.5, ethereumjs-util@npm:^5.2.0": + version: 5.2.1 + resolution: "ethereumjs-util@npm:5.2.1" + dependencies: + bn.js: "npm:^4.11.0" + create-hash: "npm:^1.1.2" + elliptic: "npm:^6.5.2" + ethereum-cryptography: "npm:^0.1.3" + ethjs-util: "npm:^0.1.3" + rlp: "npm:^2.0.0" + safe-buffer: "npm:^5.1.1" + checksum: a9334a1d7428d92650c37ef33f6988214e99da7aa4c2d47fff9fbc895dc1b0ae6fbece03d03260ccc2bcf93378afc44a1255e2030ed2c7f7a50318b6bf494212 + languageName: node + linkType: hard + +"ethereumjs-util@npm:^7.0.2, ethereumjs-util@npm:^7.1.0, ethereumjs-util@npm:^7.1.4, ethereumjs-util@npm:^7.1.5": + version: 7.1.5 + resolution: "ethereumjs-util@npm:7.1.5" + dependencies: + "@types/bn.js": "npm:^5.1.0" + bn.js: "npm:^5.1.2" + create-hash: "npm:^1.1.2" + ethereum-cryptography: "npm:^0.1.3" + rlp: "npm:^2.2.4" + checksum: 36c003459e6140996bdf79cf501ad9f49a17476d49b90b67fb37fd83b1d3e5288a831155d7483ebb4f653936c514db1003a25059a2e0c9a6840fa6d578d75a09 + languageName: node + linkType: hard + +"ethereumjs-vm@npm:4.2.0": + version: 4.2.0 + resolution: "ethereumjs-vm@npm:4.2.0" + dependencies: + async: "npm:^2.1.2" + async-eventemitter: "npm:^0.2.2" + core-js-pure: "npm:^3.0.1" + ethereumjs-account: "npm:^3.0.0" + ethereumjs-block: "npm:^2.2.2" + ethereumjs-blockchain: "npm:^4.0.3" + ethereumjs-common: "npm:^1.5.0" + ethereumjs-tx: "npm:^2.1.2" + ethereumjs-util: "npm:^6.2.0" + fake-merkle-patricia-tree: "npm:^1.0.1" + functional-red-black-tree: "npm:^1.0.1" + merkle-patricia-tree: "npm:^2.3.2" + rustbn.js: "npm:~0.2.0" + safe-buffer: "npm:^5.1.1" + util.promisify: "npm:^1.0.0" + checksum: f51adf2deb63d2f6194ec1a483dc0e760e41cddd03aae0f17411aef46f0a0e23621ca595088576dbfa721f47298ef18423673428c9637f5924edab14793756b9 + languageName: node + linkType: hard + +"ethereumjs-vm@npm:^2.1.0, ethereumjs-vm@npm:^2.3.4, ethereumjs-vm@npm:^2.6.0": + version: 2.6.0 + resolution: "ethereumjs-vm@npm:2.6.0" + dependencies: + async: "npm:^2.1.2" + async-eventemitter: "npm:^0.2.2" + ethereumjs-account: "npm:^2.0.3" + ethereumjs-block: "npm:~2.2.0" + ethereumjs-common: "npm:^1.1.0" + ethereumjs-util: "npm:^6.0.0" + fake-merkle-patricia-tree: "npm:^1.0.1" + functional-red-black-tree: "npm:^1.0.1" + merkle-patricia-tree: "npm:^2.3.2" + rustbn.js: "npm:~0.2.0" + safe-buffer: "npm:^5.1.1" + checksum: 909c60ffa84e5359c275c17ef08796adf500c72153891e0cc0ef30607b5a1f67ec5a3f9c4ad2b80190adbf94c83ae61e8313789825882e7d551f181f1af0aa65 + languageName: node + linkType: hard + +"ethereumjs-wallet@npm:0.6.5": + version: 0.6.5 + resolution: "ethereumjs-wallet@npm:0.6.5" + dependencies: + aes-js: "npm:^3.1.1" + bs58check: "npm:^2.1.2" + ethereum-cryptography: "npm:^0.1.3" + ethereumjs-util: "npm:^6.0.0" + randombytes: "npm:^2.0.6" + safe-buffer: "npm:^5.1.2" + scryptsy: "npm:^1.2.1" + utf8: "npm:^3.0.0" + uuid: "npm:^3.3.2" + checksum: 316eab140c4d8f8515dd441a5389347f154324c69af47b0166875eabf70b7adbed13a09087b99d61f02161649429c07389b1b1b7e17cc0a7cdfefd5c5d5e99a6 + languageName: node + linkType: hard + +"ethers@npm:^5.0.1, ethers@npm:^5.0.2, ethers@npm:^5.5.2, ethers@npm:^5.7.1, ethers@npm:^5.7.2": + version: 5.7.2 + resolution: "ethers@npm:5.7.2" + dependencies: + "@ethersproject/abi": "npm:5.7.0" + "@ethersproject/abstract-provider": "npm:5.7.0" + "@ethersproject/abstract-signer": "npm:5.7.0" + "@ethersproject/address": "npm:5.7.0" + "@ethersproject/base64": "npm:5.7.0" + "@ethersproject/basex": "npm:5.7.0" + "@ethersproject/bignumber": "npm:5.7.0" + "@ethersproject/bytes": "npm:5.7.0" + "@ethersproject/constants": "npm:5.7.0" + "@ethersproject/contracts": "npm:5.7.0" + "@ethersproject/hash": "npm:5.7.0" + "@ethersproject/hdnode": "npm:5.7.0" + "@ethersproject/json-wallets": "npm:5.7.0" + "@ethersproject/keccak256": "npm:5.7.0" + "@ethersproject/logger": "npm:5.7.0" + "@ethersproject/networks": "npm:5.7.1" + "@ethersproject/pbkdf2": "npm:5.7.0" + "@ethersproject/properties": "npm:5.7.0" + "@ethersproject/providers": "npm:5.7.2" + "@ethersproject/random": "npm:5.7.0" + "@ethersproject/rlp": "npm:5.7.0" + "@ethersproject/sha2": "npm:5.7.0" + "@ethersproject/signing-key": "npm:5.7.0" + "@ethersproject/solidity": "npm:5.7.0" + "@ethersproject/strings": "npm:5.7.0" + "@ethersproject/transactions": "npm:5.7.0" + "@ethersproject/units": "npm:5.7.0" + "@ethersproject/wallet": "npm:5.7.0" + "@ethersproject/web": "npm:5.7.1" + "@ethersproject/wordlists": "npm:5.7.0" + checksum: 610a2f023e31be37c859dee025e9f5538009a72e400ba647471e7cc0dd7ed1020d0b9970ee45be80f976cb4d1a9b31eae42b4e3cfdcdfb20785e2fcd67e96a6b + languageName: node + linkType: hard + +"ethjs-unit@npm:0.1.6": + version: 0.1.6 + resolution: "ethjs-unit@npm:0.1.6" + dependencies: + bn.js: "npm:4.11.6" + number-to-bn: "npm:1.7.0" + checksum: 900ebacf0db460f29d40aa37c7ebd1a02aa4cdd77245cbb5078acadfac7dc85e6ad777ad02af91dd04f70aaa4eed1e53202df8e626293db2f1c94a53d4a9d39b + languageName: node + linkType: hard + +"ethjs-util@npm:0.1.6, ethjs-util@npm:^0.1.3, ethjs-util@npm:^0.1.6": + version: 0.1.6 + resolution: "ethjs-util@npm:0.1.6" + dependencies: + is-hex-prefixed: "npm:1.0.0" + strip-hex-prefix: "npm:1.0.0" + checksum: 09c165f5ed331fc179e912255c8f62bb6f09d1399a3a000ee28b93d111dae54fb99ee5eb66c31c4b00f8df1d9a6e979ad6641b14b381f779c79bd3219fa20e23 + languageName: node + linkType: hard + +"event-target-shim@npm:^5.0.0": + version: 5.0.1 + resolution: "event-target-shim@npm:5.0.1" + checksum: 9bac81ec63b29e184fe5d10a8ea09a2957f39dc109a6f594c5e095beae88bf64c63b061ebb867fe883832ca4a8daefda8a92ed55a4f460cedbef25e574fb4466 + languageName: node + linkType: hard + +"eventemitter3@npm:4.0.4": + version: 4.0.4 + resolution: "eventemitter3@npm:4.0.4" + checksum: 7f253b4206adefe817eb250be4736b94878b95d83bd1f4f7f964a0c516175199df013dd0a52d30e6e752ef4131a9adc4fe2b7edd2b4c81eb5e733ad2a0d838e3 + languageName: node + linkType: hard + +"events@npm:^3.0.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: ef0af671f7bdc20f14274c77925c3e47a4df7991563ee1827dff577f66a9ed1a5b63d9adab8bc5949a16a1341883abdaf9df7a1841f8d5d2fc65ab4f5570b32b + languageName: node + linkType: hard + +"evp_bytestokey@npm:^1.0.0, evp_bytestokey@npm:^1.0.3": + version: 1.0.3 + resolution: "evp_bytestokey@npm:1.0.3" + dependencies: + md5.js: "npm:^1.3.4" + node-gyp: "npm:latest" + safe-buffer: "npm:^5.1.1" + checksum: 9422e1f77eb9507d587d94390108d5ab0c0e10189adca0164b88dd8a22821fd8eda74b4299b9faf40cd6578992a8e66a3db581ac7d02be3635d8048d08724670 + languageName: node + linkType: hard + +"expand-brackets@npm:^2.1.4": + version: 2.1.4 + resolution: "expand-brackets@npm:2.1.4" + dependencies: + debug: "npm:^2.3.3" + define-property: "npm:^0.2.5" + extend-shallow: "npm:^2.0.1" + posix-character-classes: "npm:^0.1.0" + regex-not: "npm:^1.0.0" + snapdragon: "npm:^0.8.1" + to-regex: "npm:^3.0.1" + checksum: 066898f0d75a5c3375b5dfd73cd070f78bdce47fb8641cf84b9d4db0b154cd72f5597e5e288a071d2120726ce43ffbcfb291f2410a79d390d0be6b8c5d245c9b + languageName: node + linkType: hard + +"express@npm:^4.14.0": + version: 4.18.2 + resolution: "express@npm:4.18.2" + dependencies: + accepts: "npm:~1.3.8" + array-flatten: "npm:1.1.1" + body-parser: "npm:1.20.1" + content-disposition: "npm:0.5.4" + content-type: "npm:~1.0.4" + cookie: "npm:0.5.0" + cookie-signature: "npm:1.0.6" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + finalhandler: "npm:1.2.0" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + merge-descriptors: "npm:1.0.1" + methods: "npm:~1.1.2" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + path-to-regexp: "npm:0.1.7" + proxy-addr: "npm:~2.0.7" + qs: "npm:6.11.0" + range-parser: "npm:~1.2.1" + safe-buffer: "npm:5.2.1" + send: "npm:0.18.0" + serve-static: "npm:1.15.0" + setprototypeof: "npm:1.2.0" + statuses: "npm:2.0.1" + type-is: "npm:~1.6.18" + utils-merge: "npm:1.0.1" + vary: "npm:~1.1.2" + checksum: 997d5407a0865f35ef7218c68ad23e846a1139d2cfc524ba9f58b7f3a54d9735edc0d992d896aaee62753ccd97be83d77a507511916972f0dfcd8f938216bc3e + languageName: node + linkType: hard + +"ext@npm:^1.1.2": + version: 1.7.0 + resolution: "ext@npm:1.7.0" + dependencies: + type: "npm:^2.7.2" + checksum: 71909e5a40c77848b40613cdc1036864450fc63ae52423f7b87e4491e1efa8662cc2301f3685c101bd38cc8535e4d72efc233f17e56af301f46d233fbcb31f50 + languageName: node + linkType: hard + +"extend-shallow@npm:^2.0.1": + version: 2.0.1 + resolution: "extend-shallow@npm:2.0.1" + dependencies: + is-extendable: "npm:^0.1.0" + checksum: 55d1d466474b90d00dda6926144f41c349ca7d4d1194cdb3d37e9a662a9767cf8f62a9ff659ef0aacd30a35ee98ab801c3a411a438a5d54b275acbd4ee4fedb6 + languageName: node + linkType: hard + +"extend-shallow@npm:^3.0.0, extend-shallow@npm:^3.0.2": + version: 3.0.2 + resolution: "extend-shallow@npm:3.0.2" + dependencies: + assign-symbols: "npm:^1.0.0" + is-extendable: "npm:^1.0.1" + checksum: 7b96b23b8effdbd4c7f35116464bfd420747d5a1f6c7055fdd5c32f1a1ff2e2f1b45464db3f6e23f3189f64b5fd99a32e245a5d0259ea28d67dfd188aa2417ab + languageName: node + linkType: hard + +"extend@npm:~3.0.2": + version: 3.0.2 + resolution: "extend@npm:3.0.2" + checksum: 312babdc3cfd8d5d003b109f02b8b639e8bdf2262f2f06acebfc3c991d8c004b73c2c10eaaaab00cfb2fb2a760845006806af10945b279d9390eed064505dfdb + languageName: node + linkType: hard + +"extglob@npm:^2.0.4": + version: 2.0.4 + resolution: "extglob@npm:2.0.4" + dependencies: + array-unique: "npm:^0.3.2" + define-property: "npm:^1.0.0" + expand-brackets: "npm:^2.1.4" + extend-shallow: "npm:^2.0.1" + fragment-cache: "npm:^0.2.1" + regex-not: "npm:^1.0.0" + snapdragon: "npm:^0.8.1" + to-regex: "npm:^3.0.1" + checksum: b1a97bc3c05ead651268e347c7d1a5f832eac0ddd5134cfad210f6dbd7284d987d22c0adf83f64e077901ec2cd6d584a6705886bc1077d44d1d46002ed070ccc + languageName: node + linkType: hard + +"extract-comments@npm:^1.1.0": + version: 1.1.0 + resolution: "extract-comments@npm:1.1.0" + dependencies: + esprima-extract-comments: "npm:^1.1.0" + parse-code-context: "npm:^1.0.0" + checksum: 712c485d4b9fbc1eeba85900bfb274bfdf083b659e77c210e4ce2139a6d4db1975ef1f889c4193d8d122c5f8535b6f1b03fad74acd806dfdc4c5e788635bf638 + languageName: node + linkType: hard + +"extract-files@npm:^9.0.0": + version: 9.0.0 + resolution: "extract-files@npm:9.0.0" + checksum: 59b9d696fc2082af217c97cfc7509e73c097fe724a0ab4e25465c09df6e23d405b6b05bc49c65d4bb92e875f95820884abf3f83aae96a1a44debb45df3c6ec1f + languageName: node + linkType: hard + +"extsprintf@npm:1.3.0": + version: 1.3.0 + resolution: "extsprintf@npm:1.3.0" + checksum: afdc88aaa7ad260bd3a4aeabc087aa03de8eaf6346a59685a97943549d8ca54c312b2353e8a4fbe234e59eb202b5b45274a6d959f1309b750bf2a15852ca7485 + languageName: node + linkType: hard + +"extsprintf@npm:^1.2.0": + version: 1.4.1 + resolution: "extsprintf@npm:1.4.1" + checksum: 376d6b312a7196c0f4547afd2e9741c40bd173f8b507155366e8b94dd8f4efe61be424c65e95ad71e0525acb26bc16c39414c147b449649c39d46ba6e356fa83 + languageName: node + linkType: hard + +"fake-merkle-patricia-tree@npm:^1.0.1": + version: 1.0.1 + resolution: "fake-merkle-patricia-tree@npm:1.0.1" + dependencies: + checkpoint-store: "npm:^1.1.0" + checksum: 459594b3d85f3538c68c40f678bb2da6695deb1cc49070b6bc6879278b10a5f6e1432990f565964b7cd05571951f10d559683a184f73c081dc2ffd64fbbfa9d1 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 5f83fabf1f0bac0df5117e881ee15756dc8a9ee48c8020ed63cb84a7935d78c338dc0982b3b7b6ad0792905f5ef0c35293db9cae2f3208a6f09071c43887a02f + languageName: node + linkType: hard + +"fast-diff@npm:^1.1.2, fast-diff@npm:^1.2.0": + version: 1.2.0 + resolution: "fast-diff@npm:1.2.0" + checksum: e75206672f583769d2270d4ab9960bef9bce5c0852c0553a2f3f960c977fb330ef01ae55b3e9c5877ed539065014d1e868140b2ee2666d21f1d833e9d0dfd82c + languageName: node + linkType: hard + +"fast-glob@npm:^3.2.9": + version: 3.2.12 + resolution: "fast-glob@npm:3.2.12" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.4" + checksum: 3b98e0cadbf2aea3fa2be76e28b0c895bb18d920ccb7b3d3f603a464e3dc2c6a89a8afb9f9765226bd4d4d74b70e880721ff7a57a267c2eaa11353f35d42d11b + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: cc64810b004155f5ac29b208ebd5c862599a1a8aef3c4d27a34dfb694db7797e121dceda183507ec4a2a5413d9cb59521fd2540d0d00a5589ee6ea6bfac3c12e + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 7814143d0352153a7a51ebd9b21341bf1732b9599ec592a398ab5e4584b516aeb5008834ba2a46502253c221b33dad7dddc93ce3f5054acd09218cce1710c81b + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.15.0 + resolution: "fastq@npm:1.15.0" + dependencies: + reusify: "npm:^1.0.4" + checksum: 9c256d4b1c55c2a494ef198632ad19b801f98fb05b804c761c8c733da58b8f63888fdfe5e4c8ec7144f369135b71f23da1457e71b3aebaa943d2d5337bb86262 + languageName: node + linkType: hard + +"fetch-ponyfill@npm:^4.0.0": + version: 4.1.0 + resolution: "fetch-ponyfill@npm:4.1.0" + dependencies: + node-fetch: "npm:~1.7.1" + checksum: c4ce651d735bdfc50b326b1d65f96e1f6f5fb44449f7e7cf67fb57ef754c77c10dee221950817ef77d04c3c6d1507f07dc856e3657dc9d768c1cfc377f56edd8 + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: "npm:^3.0.4" + checksum: cac7f7775980e696eceb922313887c03204eaea3659e0cd5b9f83ef29c7e5c613a6aa7662a3e9d0f78cf68060b093b82572e554f5464c0b2f626db32ef969cdc + languageName: node + linkType: hard + +"fill-range@npm:^4.0.0": + version: 4.0.0 + resolution: "fill-range@npm:4.0.0" + dependencies: + extend-shallow: "npm:^2.0.1" + is-number: "npm:^3.0.0" + repeat-string: "npm:^1.6.1" + to-regex-range: "npm:^2.1.0" + checksum: fcaf0e34e6c058aa4a0f8334ff56db4c1a3168d97e21676092bccc7109f6f1fb39d604f19247522b7d2daee0b03ac335c4aa1e4e97ee2b07bdd0c6105767f8c9 + languageName: node + linkType: hard + +"fill-range@npm:^7.0.1": + version: 7.0.1 + resolution: "fill-range@npm:7.0.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: e5ccb299de8a12ea5dcef663f658933e2fbdf40aeab3e7e5af9132e82d7f6bdd0984ac2e122dc1825707f33917c308bc40b632b852331c900c317c5d64bb7bf0 + languageName: node + linkType: hard + +"finalhandler@npm:1.2.0": + version: 1.2.0 + resolution: "finalhandler@npm:1.2.0" + dependencies: + debug: "npm:2.6.9" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + statuses: "npm:2.0.1" + unpipe: "npm:~1.0.0" + checksum: 31ca595367c936c6614f67bd94c7e64a31ad9b8bd52751811b4f9deb666928d8da578a230baacf7760845126ef35330382a2e935f0757d22312ba942056dc1c1 + languageName: node + linkType: hard + +"find-replace@npm:^1.0.3": + version: 1.0.3 + resolution: "find-replace@npm:1.0.3" + dependencies: + array-back: "npm:^1.0.4" + test-value: "npm:^2.1.0" + checksum: a8c60d4cbe6cf5b54c41850d15abed0e807d86ad39947e86f35b6e3265430a1afb9a9a4f46f357d869f2598bf4113fee8d6cda311aa57910154366e29b2a106d + languageName: node + linkType: hard + +"find-up@npm:5.0.0, find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 4d6f51423a974f370ce34dd00982d764e160121e4d823f46b2b79b180a34c0a23a1d09aa83851f0d1a78226be8281100ef3b4cd6990b226ed961acfa2be4a36c + languageName: node + linkType: hard + +"find-up@npm:^1.0.0": + version: 1.1.2 + resolution: "find-up@npm:1.1.2" + dependencies: + path-exists: "npm:^2.0.0" + pinkie-promise: "npm:^2.0.0" + checksum: 53e37bd2bee613512b65fd6aea5c428a800732a76ff00df6a87cbe4a783dd680a4d32eaa6709802caf7b0ab420e7a8fbd0787ba2d218c1c9fe6a3858f218883f + languageName: node + linkType: hard + +"find-up@npm:^2.1.0": + version: 2.1.0 + resolution: "find-up@npm:2.1.0" + dependencies: + locate-path: "npm:^2.0.0" + checksum: ba904cac38e7224e3be7923fcaffd177c05cfddb6df41591ccf27159c1fe3e2168c7a4352f9142287dd59419ecc594acd312851df0f6916196dfd7739c11c361 + languageName: node + linkType: hard + +"find-yarn-workspace-root@npm:^1.2.1": + version: 1.2.1 + resolution: "find-yarn-workspace-root@npm:1.2.1" + dependencies: + fs-extra: "npm:^4.0.3" + micromatch: "npm:^3.1.4" + checksum: 280d6878c119ecfe4dcc6605d3692ef859d028107b2d2eda516119ed6f64f3ef6ea9d360ac463c0c173842b8092a2c75294219efcfd7fc95e67d93512d8f4e72 + languageName: node + linkType: hard + +"find-yarn-workspace-root@npm:^2.0.0": + version: 2.0.0 + resolution: "find-yarn-workspace-root@npm:2.0.0" + dependencies: + micromatch: "npm:^4.0.2" + checksum: 32587d3ac2566117c731fe7cbc5fea9bda2b4c22b401ee3f9b7698e66b84d8bff4c44de071b88a65db81f5125b1928e7d52e4106902fa47741659709f5d8fd7d + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.0.4 + resolution: "flat-cache@npm:3.0.4" + dependencies: + flatted: "npm:^3.1.0" + rimraf: "npm:^3.0.2" + checksum: 0a97f11128bd044884981fc0cb381abe69dc3779dc6fdcbffc53d0739fecc580d0f082b6adaeff5e766822dd0d701cb274fbd8afdedddb6b5bc1829cf148b995 + languageName: node + linkType: hard + +"flat@npm:^5.0.2": + version: 5.0.2 + resolution: "flat@npm:5.0.2" + bin: + flat: cli.js + checksum: e632b5163b6f462d31726ac4e4d50723cef3cf745b9eded96872f49af52fb935b6cb1321cff25b58afc0a0655fd26f8a5d1bb465b36971f4920314a1732bb69f + languageName: node + linkType: hard + +"flatted@npm:^3.1.0": + version: 3.2.7 + resolution: "flatted@npm:3.2.7" + checksum: d57a559a56f8743f48067b992e70f222921bec6656de4617ee60dab5e531c2aeba67ace287965b759cca80fa0d3f0c7ffc39341ccc9bc874594f4b73c0fea48c + languageName: node + linkType: hard + +"flow-stoplight@npm:^1.0.0": + version: 1.0.0 + resolution: "flow-stoplight@npm:1.0.0" + checksum: 21d109736823a76f5951e9eb827787d8b5dc94b94dc3d7511ee0cc5f66dd66389fd22d0e80a476d607df511e93091b02b9317c5ccba653aabff47ff6057de4f4 + languageName: node + linkType: hard + +"follow-redirects@npm:^1.12.1": + version: 1.15.2 + resolution: "follow-redirects@npm:1.15.2" + peerDependenciesMeta: + debug: + optional: true + checksum: 930171f8b81bf00e9368df4b17f3b835934762d51192632af53a51a8a608d5510a1ffbc6da5761dce9996cdbd750740490ca844320e5ff11cdaf2329a5a69647 + languageName: node + linkType: hard + +"for-each@npm:^0.3.3, for-each@npm:~0.3.3": + version: 0.3.3 + resolution: "for-each@npm:0.3.3" + dependencies: + is-callable: "npm:^1.1.3" + checksum: dc4e3e28f5ee9472680b6361a85d0d27aa1e8ddbd1720dfb680020456cddc142ee7ba69145921fe12c4ec2d7740f12c1c6c7f90ecdd7ca2b39c7fcd8bc506ad6 + languageName: node + linkType: hard + +"for-in@npm:^1.0.2": + version: 1.0.2 + resolution: "for-in@npm:1.0.2" + checksum: 7e1328a767701fcd94b4244d196f249b35d252ad04b542d2023d1ba5905e81e9134317c9d6b6c9a3c33bd47fe191b31f18c602c4fc9fafd1ee02c8d7c4290e67 + languageName: node + linkType: hard + +"forever-agent@npm:~0.6.1": + version: 0.6.1 + resolution: "forever-agent@npm:0.6.1" + checksum: b426cf45f0bdea79970a4320cb550b84d0bcd0530d544e0424456f44272a19641a000ea921f8e58dba5511b71f94d95c80692e3d13ce5f0b766f18426430efd5 + languageName: node + linkType: hard + +"form-data@npm:^3.0.0": + version: 3.0.1 + resolution: "form-data@npm:3.0.1" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + mime-types: "npm:^2.1.12" + checksum: 4ca2af6f04d3e3914b6ed8e5ea256da66c883bc2ae64651929f5eb842a47b6461fa51cd19c2a1d5ede09f5117593f2622814c34f8e0ac4869b91a4815c401753 + languageName: node + linkType: hard + +"form-data@npm:~2.3.2": + version: 2.3.3 + resolution: "form-data@npm:2.3.3" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.6" + mime-types: "npm:^2.1.12" + checksum: 0f88d2d298ac7751fbef88eb1148e709727560bbe6ed17ca1fd10745b8b572cdab7d51d934b97ccdc411add4e39afdb414bc400580a348de2d39a49401f3f5ec + languageName: node + linkType: hard + +"forwarded@npm:0.2.0": + version: 0.2.0 + resolution: "forwarded@npm:0.2.0" + checksum: d1d18e065b310fb44e3190497119b810db59da95a8ac0ba186e94385484c72e189e9a5da404a209886fdcfaacc1efcb066e7d90c4281dfd7e3ce3ccd18a8dd32 + languageName: node + linkType: hard + +"fp-ts@npm:1.19.3": + version: 1.19.3 + resolution: "fp-ts@npm:1.19.3" + checksum: c38f75cc921861eaa02f191f2e5d7953f4f5d30f2275f4892a932a4bbf0a472af31ed6e681864a8523a208ef35fe5a05a64e3f0db208e3e8662100c23e0625db + languageName: node + linkType: hard + +"fp-ts@npm:^1.0.0": + version: 1.19.5 + resolution: "fp-ts@npm:1.19.5" + checksum: cee85ba8cdb7e8b7e2b087dcd069e0c8777a590bd3505639716ac5a0d846a44ac3dfd676f4745ae06c1dd9afed4d47787d0a9384fa7a96e7fadf86799ba76ff9 + languageName: node + linkType: hard + +"fragment-cache@npm:^0.2.1": + version: 0.2.1 + resolution: "fragment-cache@npm:0.2.1" + dependencies: + map-cache: "npm:^0.2.2" + checksum: 2a3a27cb1381b8ab24227bd3f5bc3df610c8628585945aa549abbbf0faff8dbf919986b3df6325e4a2dd7835466d0d271587d27f660ad007d273f9613f8b36a5 + languageName: node + linkType: hard + +"fresh@npm:0.5.2": + version: 0.5.2 + resolution: "fresh@npm:0.5.2" + checksum: 57c25f8cdc1c8db81fc3477b8073627614c5132ae7070c8e920ff35afbddb32f98d74ab6828d92f1e1c52583b2f8ea16ac7991406ffe2bb4ec752b1aaa94350e + languageName: node + linkType: hard + +"fs-extra@npm:^0.30.0": + version: 0.30.0 + resolution: "fs-extra@npm:0.30.0" + dependencies: + graceful-fs: "npm:^4.1.2" + jsonfile: "npm:^2.1.0" + klaw: "npm:^1.0.0" + path-is-absolute: "npm:^1.0.0" + rimraf: "npm:^2.2.8" + checksum: 29ffbf077eace7938ace5d44174f12064e722c54d99004af53733f31fad446fafa2001bdf27f8475aff4f353dae0d16ef44d9a465afcecdb9226734d30f1a357 + languageName: node + linkType: hard + +"fs-extra@npm:^4.0.2, fs-extra@npm:^4.0.3": + version: 4.0.3 + resolution: "fs-extra@npm:4.0.3" + dependencies: + graceful-fs: "npm:^4.1.2" + jsonfile: "npm:^4.0.0" + universalify: "npm:^0.1.0" + checksum: cd9e41c7083e02a2bba92c74a5db0826a7befc59014dea6f8dfae147aac250e7131dd879cf4b3d7279b458acdfb5d5df80faf8fc26bda06b07b834ba5a2f04d2 + languageName: node + linkType: hard + +"fs-extra@npm:^7.0.0, fs-extra@npm:^7.0.1": + version: 7.0.1 + resolution: "fs-extra@npm:7.0.1" + dependencies: + graceful-fs: "npm:^4.1.2" + jsonfile: "npm:^4.0.0" + universalify: "npm:^0.1.0" + checksum: 6fec9aa96039c488cecb63aaaa02080173b8e884213b53cebb37396338e0f6469f0399f176611910eaa74f6417b76c33251f42755c17b7182a05a199d3aae101 + languageName: node + linkType: hard + +"fs-extra@npm:^9.0.0": + version: 9.1.0 + resolution: "fs-extra@npm:9.1.0" + dependencies: + at-least-node: "npm:^1.0.0" + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: fc8ff3111ca42a4a3118e63247b1ebe4fbe4abc6daed2d51414699efb5661a2b9aeeb1b9283cb63544011a50b8f59c315e53b06d9c1b38a7786be99f8e59dabb + languageName: node + linkType: hard + +"fs-minipass@npm:^1.2.7": + version: 1.2.7 + resolution: "fs-minipass@npm:1.2.7" + dependencies: + minipass: "npm:^2.6.0" + checksum: ec749f8d902ac435b10c1aadecdccb466667d4e98534c7aaa917b9bbd7aeb42768a9efef69d2251c4366eaf24c87cf7ce92186aca4cd70441e6a6065f142b6b9 + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: "npm:^3.0.0" + checksum: 56d19f9a034cbef50b7fe846a71ab1a6a7ee7906205f9f18b7c9696e1f6d83c4d708a0196c65536f34e569205664840dd4f97f1286a26148a4c5bf74a67fe8db + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 477fb3547134ce67d71531a19b2597028d2efaeced56a2fcb125ba9994a4204685d256795e4a5b68e5d866d11d8d0dd9050937cb44037beb4caeb3acb75602e2 + languageName: node + linkType: hard + +"fsevents@npm:~2.3.2": + version: 2.3.2 + resolution: "fsevents@npm:2.3.2" + dependencies: + node-gyp: "npm:latest" + checksum: c85eed7a3e0bbe6908f9feae8a823ee63a796ea2b32e20616ee33f0dda9417976f5a087a8cd2ccf228aae1c5b8b6125c9800f05dd69aaf016c34352a0567dcfb + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": + version: 2.3.2 + resolution: "fsevents@patch:fsevents@npm%3A2.3.2#optional!builtin::version=2.3.2&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.1": + version: 1.1.1 + resolution: "function-bind@npm:1.1.1" + checksum: 8a644b8118679030cb3aeb783b024a9ee358b15c5780bdb49fe5d482f6df54672bda860e19bce87d756a5e165740caaa96f5e8487fa98933c327f631e23a5490 + languageName: node + linkType: hard + +"function.prototype.name@npm:^1.1.5": + version: 1.1.5 + resolution: "function.prototype.name@npm:1.1.5" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.1.3" + es-abstract: "npm:^1.19.0" + functions-have-names: "npm:^1.2.2" + checksum: 3c909b6d1d29db8d856e6816189ba46b117e85b00f8261f2dbad5975db20d9830a0484dc6d2a92034aa8dc1e84205de10dc830882e07c6b4a5cfe3e9aa72f5a7 + languageName: node + linkType: hard + +"functional-red-black-tree@npm:^1.0.1, functional-red-black-tree@npm:~1.0.1": + version: 1.0.1 + resolution: "functional-red-black-tree@npm:1.0.1" + checksum: 275f10e8abe29375137a6dc662b54bf6452704560a4888dde5720b1901b5489703f45169a92e02c758dd0ebc4c6206e2cb57c326a9b9dd6e3992aeaf4038dddc + languageName: node + linkType: hard + +"functions-have-names@npm:^1.2.2, functions-have-names@npm:^1.2.3": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: 2b58e5d607d7338c29e5ff8c285ddf09d79857b6d0ef9f781ee2e80cf666726d6909b5ab635e13d49ded9dcfd3c7abc01a22a52089bf23833848a6bfb6e8dac1 + languageName: node + linkType: hard + +"ganache-core@npm:^2.13.2": + version: 2.13.2 + resolution: "ganache-core@npm:2.13.2" + dependencies: + abstract-leveldown: "npm:3.0.0" + async: "npm:2.6.2" + bip39: "npm:2.5.0" + cachedown: "npm:1.0.0" + clone: "npm:2.1.2" + debug: "npm:3.2.6" + encoding-down: "npm:5.0.4" + eth-sig-util: "npm:3.0.0" + ethereumjs-abi: "npm:0.6.8" + ethereumjs-account: "npm:3.0.0" + ethereumjs-block: "npm:2.2.2" + ethereumjs-common: "npm:1.5.0" + ethereumjs-tx: "npm:2.1.2" + ethereumjs-util: "npm:6.2.1" + ethereumjs-vm: "npm:4.2.0" + ethereumjs-wallet: "npm:0.6.5" + heap: "npm:0.2.6" + keccak: "npm:3.0.1" + level-sublevel: "npm:6.6.4" + levelup: "npm:3.1.1" + lodash: "npm:4.17.20" + lru-cache: "npm:5.1.1" + merkle-patricia-tree: "npm:3.0.0" + patch-package: "npm:6.2.2" + seedrandom: "npm:3.0.1" + source-map-support: "npm:0.5.12" + tmp: "npm:0.1.0" + web3: "npm:1.2.11" + web3-provider-engine: "npm:14.2.1" + websocket: "npm:1.0.32" + dependenciesMeta: + ethereumjs-wallet: + optional: true + web3: + optional: true + checksum: 08a7aa249793f05ef026abea357802c1d41b725944e50f1cc7f2ede11eaaec06628eb9a1a779ee6304ba6817a339a82c50f901cd226a6dff42e4b4a3f7a07bfd + languageName: node + linkType: hard + +"gauge@npm:^4.0.3": + version: 4.0.4 + resolution: "gauge@npm:4.0.4" + dependencies: + aproba: "npm:^1.0.3 || ^2.0.0" + color-support: "npm:^1.1.3" + console-control-strings: "npm:^1.1.0" + has-unicode: "npm:^2.0.1" + signal-exit: "npm:^3.0.7" + string-width: "npm:^4.2.3" + strip-ansi: "npm:^6.0.1" + wide-align: "npm:^1.1.5" + checksum: 4fc68f770dba9962a326918f33f58f2458eddea08442c2d716238357e4291dee4223a812ce11084b54f928d607e4dfb6f380ba28d435b2721de94a22d5600669 + languageName: node + linkType: hard + +"get-caller-file@npm:^1.0.1": + version: 1.0.3 + resolution: "get-caller-file@npm:1.0.3" + checksum: 2bcd2d187dcea64af940b749fef80510dd10b209d816e3e63bc5530ee73f4e942f79601e1c9a1f339cf5e17ab86958f9eb040ac7fd342180b7ab647411185c06 + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: 24c1eb494b27c789e9267d7220bb131e409427b793f9e2b07f772f8d84c44eb0b42b90c258d858ee758ec6a21092c16a1c78c5fac02c0df7c156bb7113307192 + languageName: node + linkType: hard + +"get-func-name@npm:^2.0.0": + version: 2.0.0 + resolution: "get-func-name@npm:2.0.0" + checksum: e56bed23b2160cf3aeedb2677ca019334543dd49790c1976e44d168b5f83283747b1a41675706bc114b7a1563da978dbdf6d2b5e9282534dbdeaa2c1184cae6a + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0": + version: 1.2.0 + resolution: "get-intrinsic@npm:1.2.0" + dependencies: + function-bind: "npm:^1.1.1" + has: "npm:^1.0.3" + has-symbols: "npm:^1.0.3" + checksum: 6db1e521478d0a0f4e61c94c23e7a731b163d2904067b1b6efcac78e8b015404883dab4acb5570517df55aab6eb23eeef6a8d7310de76d9570fcbce4a3f80b18 + languageName: node + linkType: hard + +"get-stream@npm:^4.1.0": + version: 4.1.0 + resolution: "get-stream@npm:4.1.0" + dependencies: + pump: "npm:^3.0.0" + checksum: 064bb37cee53da924b3d46148c948f576fb76a658f020a09d3618923126fa379816936640eb20bbbaa5a4ccef10a6e5e99eaae03e5b939247aa1da2e9a603551 + languageName: node + linkType: hard + +"get-stream@npm:^5.1.0": + version: 5.2.0 + resolution: "get-stream@npm:5.2.0" + dependencies: + pump: "npm:^3.0.0" + checksum: ec44aec324d4143ca4784ecc294d575246d2d4d141065c5d137438ab56226d3a7c83e0c840a0a2192c0262babb96045687c662fe867041cc67ee42ad4296074d + languageName: node + linkType: hard + +"get-symbol-description@npm:^1.0.0": + version: 1.0.0 + resolution: "get-symbol-description@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.1.1" + checksum: 81648604501445f5eb384d0193ff821f0c593c8d231205c3e03054dee679cb9aa4a04fb2cb1a44cd9bc81877e1f3677147a430f7203c851122112b48e12435f6 + languageName: node + linkType: hard + +"get-value@npm:^2.0.3, get-value@npm:^2.0.6": + version: 2.0.6 + resolution: "get-value@npm:2.0.6" + checksum: 76d53ea787af176684a9b29d81ac2d1ede3de60ebabb20e9be91c55e619aeca9928c4b754dd40e12f613d42740357bda7048beb42df2827be663b5181192d687 + languageName: node + linkType: hard + +"getpass@npm:^0.1.1": + version: 0.1.7 + resolution: "getpass@npm:0.1.7" + dependencies: + assert-plus: "npm:^1.0.0" + checksum: ffcc370a58a53b0e9e6c5a92db6c7340e3705d84d6bebd448e4afcf7d8a9329cd65be2c3d47ced58c5c8098c3bda21ee65401ba908e3bd37160bec75748a8f54 + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: "npm:^4.0.1" + checksum: 2a8fd4de469543f6160dbfff5c59950e39494fc8b692ca7e1d0a5564450dee53228370b43bcfdeda82c2f96b26de618ef8aa5ece28090fcd568c411b6148241d + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: "npm:^4.0.3" + checksum: 2a27dfeda346942417ffc7ae85483048b277f275d595a760e51cd276475214b79896a2dad0e461bb4ae515f223439197634d183ff34a3be98c4c2b1cc6de8248 + languageName: node + linkType: hard + +"glob@npm:7.2.0": + version: 7.2.0 + resolution: "glob@npm:7.2.0" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.0.4" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 2453578bad177f4f1614271dcf7a553ef411141c73439d111a45e0ea38a01c38ff475cc8ea62e0cf97fa7e6d73b204eedea454125770a617feae61ec7fe2e5e0 + languageName: node + linkType: hard + +"glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:~7.2.3": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: c55966a5db7ed2f30976a1490f3165f9d4e20ac7cabf01b55da4cc4f8f53a4c506e6f427e469c2fbf68636200871f3acf07e159ba6d9b65e7386216b98474a34 + languageName: node + linkType: hard + +"glob@npm:^8.0.1, glob@npm:^8.0.3": + version: 8.1.0 + resolution: "glob@npm:8.1.0" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^5.0.1" + once: "npm:^1.3.0" + checksum: b2d53aa8d54a3e5b3998f52e72140deea385d292a68719144cda70148c335aa956bd03a643f50f6e4f685ee40ae538ee62a96278cc7b797f731a50a3babfcf63 + languageName: node + linkType: hard + +"global@npm:~4.4.0": + version: 4.4.0 + resolution: "global@npm:4.4.0" + dependencies: + min-document: "npm:^2.19.0" + process: "npm:^0.11.10" + checksum: 7c4f4aa52123864d5a9327e0a8be0890487c95015c06103c108b314f35464aa5afaf9b32ea3c31f0f7efcac528283deb4f7a82dccd7081c4ca3e0b70916dbfd9 + languageName: node + linkType: hard + +"globals@npm:^13.19.0": + version: 13.20.0 + resolution: "globals@npm:13.20.0" + dependencies: + type-fest: "npm:^0.20.2" + checksum: 1ba80ad03f29b8ca83b066c9d9ae305e7f0ee46164de36efac286fc3a58efc48986d688bf1f427f164f2a65bb1bdfa53beb8c56ae3092be255fc097bdcab1f1a + languageName: node + linkType: hard + +"globals@npm:^9.18.0": + version: 9.18.0 + resolution: "globals@npm:9.18.0" + checksum: af5ab58c79c6297ced24cede6c65c3b7ffd207bd8477acbcd07973a811478d9212614e0e32d389bc0f617fcd06587e6699595f2381e76ef4fa05b40717136ee5 + languageName: node + linkType: hard + +"globalthis@npm:^1.0.3": + version: 1.0.3 + resolution: "globalthis@npm:1.0.3" + dependencies: + define-properties: "npm:^1.1.3" + checksum: 712d9e130f2c47067e6590cb1eee418df1106f53ffeddaadb4c8b0793ac0f46039e5f71008c44089523aa2b58d270bb2c4e5721795ddad114bc23d9eb63ec6d5 + languageName: node + linkType: hard + +"globby@npm:^11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + dependencies: + array-union: "npm:^2.1.0" + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.2.9" + ignore: "npm:^5.2.0" + merge2: "npm:^1.4.1" + slash: "npm:^3.0.0" + checksum: 3047df770874d103dafe26084f998f562e8a8e2930896940e0bdbdc27c1f7574570f231dc2aa981d941dc84c93db05ce7cd81667488b040412e88740186fc22e + languageName: node + linkType: hard + +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: "npm:^1.1.3" + checksum: c29f62be0655b0fb6d12d1ba77b1a40fee46fbb80f0a27e0538b696a0ac057899dd997b5aaf3c6daa02bd51af93ec7b8fe2ef7bbb44945c1ea3cf640e4b66cf7 + languageName: node + linkType: hard + +"got@npm:9.6.0": + version: 9.6.0 + resolution: "got@npm:9.6.0" + dependencies: + "@sindresorhus/is": "npm:^0.14.0" + "@szmarczak/http-timer": "npm:^1.1.2" + cacheable-request: "npm:^6.0.0" + decompress-response: "npm:^3.3.0" + duplexer3: "npm:^0.1.4" + get-stream: "npm:^4.1.0" + lowercase-keys: "npm:^1.0.1" + mimic-response: "npm:^1.0.1" + p-cancelable: "npm:^1.0.0" + to-readable-stream: "npm:^1.0.0" + url-parse-lax: "npm:^3.0.0" + checksum: 1cfc615ec5b9b2dde5728e2d0f980acdd61beb63aebb9a96bda6d86b3b1fd07dfb2856732ab94cdffadebc6d376db9819f267a7e4176c929ac93bda06a288a85 + languageName: node + linkType: hard + +"got@npm:^11.8.5": + version: 11.8.6 + resolution: "got@npm:11.8.6" + dependencies: + "@sindresorhus/is": "npm:^4.0.0" + "@szmarczak/http-timer": "npm:^4.0.5" + "@types/cacheable-request": "npm:^6.0.1" + "@types/responselike": "npm:^1.0.0" + cacheable-lookup: "npm:^5.0.3" + cacheable-request: "npm:^7.0.2" + decompress-response: "npm:^6.0.0" + http2-wrapper: "npm:^1.0.0-beta.5.2" + lowercase-keys: "npm:^2.0.0" + p-cancelable: "npm:^2.0.0" + responselike: "npm:^2.0.0" + checksum: a264ac2dbffa19fb66f7399a79894e88406a6fb55733655800a981345d7d94a4909d0fb152397daafd0eb7b5fc97cc916c0e911b82866882a7f31b99c3fc3886 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.1.9, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 0228fc1080e6cb20d31920aff457e5d44f137b8864220c204b5ba6461d2d46d30361557a4c054373a8c04a03b59c92a42d40230104bb59c5ea737072bc15709c + languageName: node + linkType: hard + +"grapheme-splitter@npm:^1.0.4": + version: 1.0.4 + resolution: "grapheme-splitter@npm:1.0.4" + checksum: c67a8e522758dd907770a78ad750e6dfdcce327b0696fdd82f4b7acb8bb22b0574c88f806afb3c6597a536fa9016e6e3486071535fd0e9226b8505c67cf2fb01 + languageName: node + linkType: hard + +"graphql-request@npm:^5.2.0": + version: 5.2.0 + resolution: "graphql-request@npm:5.2.0" + dependencies: + "@graphql-typed-document-node/core": "npm:^3.1.1" + cross-fetch: "npm:^3.1.5" + extract-files: "npm:^9.0.0" + form-data: "npm:^3.0.0" + peerDependencies: + graphql: 14 - 16 + checksum: 12d44536ea429632be0e421b497c9bf7992d21ec3a7b50d2bf5a647cad7312631ced1f4381318d6abb413d991c8e0cda6c13e66e0b7e5251da04e0a8dade1142 + languageName: node + linkType: hard + +"graphql@npm:^16.6.0": + version: 16.6.0 + resolution: "graphql@npm:16.6.0" + checksum: 686582916b9ca247f3562f086c34a6363155475da909e1f891f9a76a3b5273ed6c7034cd5a82e768670ac5a74d539a6f1be282253a92b49be3a489fc82e83a5b + languageName: node + linkType: hard + +"har-schema@npm:^2.0.0": + version: 2.0.0 + resolution: "har-schema@npm:2.0.0" + checksum: 45f992760bede24d0787edd6b5b4407d50fe0db5370904002a55e7d4bf3373cc12e7c4f4414a4fc937b25096cdf8957f8ca97b56be6bae8d173a38b2f390826f + languageName: node + linkType: hard + +"har-validator@npm:~5.1.3": + version: 5.1.5 + resolution: "har-validator@npm:5.1.5" + dependencies: + ajv: "npm:^6.12.3" + har-schema: "npm:^2.0.0" + checksum: 3eb98922f5a5c67bf4973721275b1707b915e2d3dd88131cc0040b2f7dcdb512556cf1a692c90d1c2e0648b873735199bb27884612f7cb7457b4eb1f4cec6db4 + languageName: node + linkType: hard + +"hardhat-ignore-warnings@npm:^0.2.8": + version: 0.2.8 + resolution: "hardhat-ignore-warnings@npm:0.2.8" + dependencies: + minimatch: "npm:^5.1.0" + node-interval-tree: "npm:^2.0.1" + solidity-comments: "npm:^0.0.2" + checksum: 63fc079520bf8a440a4fdd6974e427b941c9732a339c1825c0ab67cd5511b5762f97ee8fcc044a41581ae897acea637363254c9e69ee1d95026911dd5a59c800 + languageName: node + linkType: hard + +"hardhat-local-networks-config-plugin@npm:^0.0.6": + version: 0.0.6 + resolution: "hardhat-local-networks-config-plugin@npm:0.0.6" + dependencies: + deepmerge: "npm:^4.2.2" + peerDependencies: + hardhat: ^2.0.8 + checksum: 52e775380997298e17c379fdc0268cb201acec62eddd25cec15140f900a3a6cb778b41dc2e45c57c3befafd9adc449fa09df8c11ab0c6394e32a7cfa425b6304 + languageName: node + linkType: hard + +"hardhat@npm:^2.12.5": + version: 2.14.0 + resolution: "hardhat@npm:2.14.0" + dependencies: + "@ethersproject/abi": "npm:^5.1.2" + "@metamask/eth-sig-util": "npm:^4.0.0" + "@nomicfoundation/ethereumjs-block": "npm:5.0.1" + "@nomicfoundation/ethereumjs-blockchain": "npm:7.0.1" + "@nomicfoundation/ethereumjs-common": "npm:4.0.1" + "@nomicfoundation/ethereumjs-evm": "npm:2.0.1" + "@nomicfoundation/ethereumjs-rlp": "npm:5.0.1" + "@nomicfoundation/ethereumjs-statemanager": "npm:2.0.1" + "@nomicfoundation/ethereumjs-trie": "npm:6.0.1" + "@nomicfoundation/ethereumjs-tx": "npm:5.0.1" + "@nomicfoundation/ethereumjs-util": "npm:9.0.1" + "@nomicfoundation/ethereumjs-vm": "npm:7.0.1" + "@nomicfoundation/solidity-analyzer": "npm:^0.1.0" + "@sentry/node": "npm:^5.18.1" + "@types/bn.js": "npm:^5.1.0" + "@types/lru-cache": "npm:^5.1.0" + abort-controller: "npm:^3.0.0" + adm-zip: "npm:^0.4.16" + aggregate-error: "npm:^3.0.0" + ansi-escapes: "npm:^4.3.0" + chalk: "npm:^2.4.2" + chokidar: "npm:^3.4.0" + ci-info: "npm:^2.0.0" + debug: "npm:^4.1.1" + enquirer: "npm:^2.3.0" + env-paths: "npm:^2.2.0" + ethereum-cryptography: "npm:^1.0.3" + ethereumjs-abi: "npm:^0.6.8" + find-up: "npm:^2.1.0" + fp-ts: "npm:1.19.3" + fs-extra: "npm:^7.0.1" + glob: "npm:7.2.0" + immutable: "npm:^4.0.0-rc.12" + io-ts: "npm:1.10.4" + keccak: "npm:^3.0.2" + lodash: "npm:^4.17.11" + mnemonist: "npm:^0.38.0" + mocha: "npm:^10.0.0" + p-map: "npm:^4.0.0" + qs: "npm:^6.7.0" + raw-body: "npm:^2.4.1" + resolve: "npm:1.17.0" + semver: "npm:^6.3.0" + solc: "npm:0.7.3" + source-map-support: "npm:^0.5.13" + stacktrace-parser: "npm:^0.1.10" + tsort: "npm:0.0.1" + undici: "npm:^5.14.0" + uuid: "npm:^8.3.2" + ws: "npm:^7.4.6" + peerDependencies: + ts-node: "*" + typescript: "*" + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + bin: + hardhat: internal/cli/bootstrap.js + checksum: 94bff2a87a397b4bfd1b021362f4d439fe8ba867df3ccee6768f66192de8b8d3e9f8f9328f5909004bd57c080ddc33b7592883226e03bdf9012152da98c33755 + languageName: node + linkType: hard + +"has-ansi@npm:^2.0.0": + version: 2.0.0 + resolution: "has-ansi@npm:2.0.0" + dependencies: + ansi-regex: "npm:^2.0.0" + checksum: ef71935b691d60bef2eb91eb2d3f33833da9bc8f49a6a7cf45a8da05c21ed77ec4ce948f168aecffebb83b14a5c46d6f8deb57c159df92bf17a561f23440301b + languageName: node + linkType: hard + +"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": + version: 1.0.2 + resolution: "has-bigints@npm:1.0.2" + checksum: 2f15628a0353cfc818b8710f306ac3b7ea05ca36d469484d1b0b91337720844c83c7d71f7346fbfa61a12fc0e3a3c39a0b1b1b294735f4bd0049697314e18b8a + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: b1cb757b71bca736b4f7a060d52a7914b1438d7bd7ba3cb783f71728c7a72d51520955d477d54fce75e19a859d93fadc9b707de019c141c45f2e560c48beb1f9 + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 71f182c441adda71ea3014dec578691a9d74356dd57c238fb2fc88247a94ca10892fe307cda0eb608b91f982d7da34aa2e46f763c4449351dedac26a0493e591 + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0": + version: 1.0.0 + resolution: "has-property-descriptors@npm:1.0.0" + dependencies: + get-intrinsic: "npm:^1.1.1" + checksum: 74813c8c23b7e2a8cb8253d77094347d2e0cc380e0475962815764f6b60e815290a7ce82bab1df78418e991f22289aa14151972b6bc66483ad22610ea8ab5c7e + languageName: node + linkType: hard + +"has-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "has-proto@npm:1.0.1" + checksum: 0aa0de6013c2132a79fb8b885dc0274b99362807195bed0c69e2469eb0de41bf1695067d5e41adcd4bbd8daed8684250716c55db17478249f225ae3d0846e6bf + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: 2d0abb3382da2945b1b8d9a4afebc8a0770fe07198e727b4fbd7f616c70796f040bf2bd8d6db47e0c590507812a2680594fc77f871238289f6c7870318cf62c9 + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.0": + version: 1.0.0 + resolution: "has-tostringtag@npm:1.0.0" + dependencies: + has-symbols: "npm:^1.0.2" + checksum: b0091adb3db09932e228b5df39275018c5506ef5c5037beb691afe019919d174a79a14f1fc572e2b341e0ce3feaca49a84ed8fc331bb707325d8a7c4289cf729 + languageName: node + linkType: hard + +"has-unicode@npm:^2.0.1": + version: 2.0.1 + resolution: "has-unicode@npm:2.0.1" + checksum: d7f38422bc8e339b52014ed5aea2fdcb6545e583ac252081bc7d0970ae8eaa6efa3d056aa3119ac5825bc51fc289b53fa7b3588a40b8bf71a0dabc346513c485 + languageName: node + linkType: hard + +"has-value@npm:^0.3.1": + version: 0.3.1 + resolution: "has-value@npm:0.3.1" + dependencies: + get-value: "npm:^2.0.3" + has-values: "npm:^0.1.4" + isobject: "npm:^2.0.0" + checksum: 878ef6cb55dc0dce4b1000172c1b159a6c326275401c3abb61c135dd66d1d49fc14504b01e190e8fe5491a9c124dfd421c2f06677742bad9297c0aafaae83f69 + languageName: node + linkType: hard + +"has-value@npm:^1.0.0": + version: 1.0.0 + resolution: "has-value@npm:1.0.0" + dependencies: + get-value: "npm:^2.0.6" + has-values: "npm:^1.0.0" + isobject: "npm:^3.0.0" + checksum: 318450fdded9b0cdd08a166551970b04e64d750be750dd69f17b9f1a827c3110da4a97c2306f9fb3ec68a04440f2d1add2fe79238fa9ed2b1d07bc30cb0d4e9d + languageName: node + linkType: hard + +"has-values@npm:^0.1.4": + version: 0.1.4 + resolution: "has-values@npm:0.1.4" + checksum: 63a02eb81992795e05218cd2757844cdf231aed3d5c93805aa2f04caf1138703762d486ce79532b7d84f401ecba96afd2fdf748f9b89d9b68c11ae52f944e2b1 + languageName: node + linkType: hard + +"has-values@npm:^1.0.0": + version: 1.0.0 + resolution: "has-values@npm:1.0.0" + dependencies: + is-number: "npm:^3.0.0" + kind-of: "npm:^4.0.0" + checksum: 2f79de8562890b08d5d066d8a283f9392bacc2a75a005b12e1bc57df8c04cd5bce419eef9dff4a82398f00368460bba863d4d42bd30976ddca2cf00aacc9e020 + languageName: node + linkType: hard + +"has@npm:^1.0.3, has@npm:~1.0.3": + version: 1.0.3 + resolution: "has@npm:1.0.3" + dependencies: + function-bind: "npm:^1.1.1" + checksum: 3e8c4d87ccd9c160d61a5db829b5fb647acac79e482476c857d5d1dc580517c6a77cf84337808f28361f6263008ce1ce5aff44407bd9241af93c623ef8d8d4f1 + languageName: node + linkType: hard + +"hash-base@npm:^3.0.0": + version: 3.1.0 + resolution: "hash-base@npm:3.1.0" + dependencies: + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.6.0" + safe-buffer: "npm:^5.2.0" + checksum: 31109e871639384b20dcd804d4a82e20008b01d1c96eaf285f70fda42df650970c008da1d3c5d898211bdc84d792c2a6f8075ce931b2fc305defcbb7b4fa27f3 + languageName: node + linkType: hard + +"hash.js@npm:1.1.7, hash.js@npm:^1.0.0, hash.js@npm:^1.0.3, hash.js@npm:^1.1.7": + version: 1.1.7 + resolution: "hash.js@npm:1.1.7" + dependencies: + inherits: "npm:^2.0.3" + minimalistic-assert: "npm:^1.0.1" + checksum: e4266370d194fd31ed7bb51f5a943cf4e3b361321ea19a0dfcaab2e21400c3e581d8dec897364ed4530845c2c1b58d44dd6a9b3682cfd5ec02d0ce7bc802f1db + languageName: node + linkType: hard + +"he@npm:1.2.0": + version: 1.2.0 + resolution: "he@npm:1.2.0" + bin: + he: bin/he + checksum: 624468c0a4a0086a722b756a53eddf35a141a16ab41ab965028d0280010753cd2e12a1181e2e638ffd4c9d5131949e198fd8e509b61645b02e8e36a7bdeadc97 + languageName: node + linkType: hard + +"heap@npm:0.2.6": + version: 0.2.6 + resolution: "heap@npm:0.2.6" + checksum: c97dff92dc9141e33eec0869acd188d854dfc4ef101323b9831d0a9aca53a3bcda030618fed8a6296dc6c089e663b37347e02245e585cdb862323a758cd3f051 + languageName: node + linkType: hard + +"hmac-drbg@npm:^1.0.1": + version: 1.0.1 + resolution: "hmac-drbg@npm:1.0.1" + dependencies: + hash.js: "npm:^1.0.3" + minimalistic-assert: "npm:^1.0.0" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 4e88d58ffc03e027990bbc31c0aa7b90dc4d2b3642ac3a8f3b71e3c43eb03416179ac601f36417312f0375cc382a9e39d80ade1ae239aff188701162bc84226d + languageName: node + linkType: hard + +"home-or-tmp@npm:^2.0.0": + version: 2.0.0 + resolution: "home-or-tmp@npm:2.0.0" + dependencies: + os-homedir: "npm:^1.0.0" + os-tmpdir: "npm:^1.0.1" + checksum: 82f10ac67f63c9e13d8886e3fb4a0010ac0d4309c5a304e26505a647e4eb713af30dfc0d5e053aa31eb538f27241cecf3cd58f5b4df5fe03ac2800a4493c0156 + languageName: node + linkType: hard + +"hosted-git-info@npm:^2.1.4, hosted-git-info@npm:^2.6.0": + version: 2.8.9 + resolution: "hosted-git-info@npm:2.8.9" + checksum: c24da52f98be000bd8c69c1f62c3bd6982a1e1c225d1ba6ccf05048415ec8b1490a9cd8702333166973f8d4e019962e2e2193f3d38ecb0fa7cd9d35fdbfd997e + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 7b4d86f99fb3f07b6a49219420ebdffa077ee99bc5fe1df1f353b84c3d321c767a083a48291afb2fc34a627661b6d54c80a927639a7be9e0c43e8c4f921816bd + languageName: node + linkType: hard + +"http-errors@npm:2.0.0": + version: 2.0.0 + resolution: "http-errors@npm:2.0.0" + dependencies: + depd: "npm:2.0.0" + inherits: "npm:2.0.4" + setprototypeof: "npm:1.2.0" + statuses: "npm:2.0.1" + toidentifier: "npm:1.0.1" + checksum: 4ca64437169c64e448700bfc07ebaf5555bc0bb5c0880ab171a20312580af586f0c9f1bd5e9047336c84b4a31ade801ca7fe8c1c7e1d654f4ea9d5dee71dbb3c + languageName: node + linkType: hard + +"http-https@npm:^1.0.0": + version: 1.0.0 + resolution: "http-https@npm:1.0.0" + checksum: 04fbde11c41e4f4b7f57052b7d4c9acb94bf29f0da0e723cce9fb32f1892a7707ea92ababe57a4779ddaa2d5b24472913cbca6afc41dc5436946b54badef76d6 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^5.0.0": + version: 5.0.0 + resolution: "http-proxy-agent@npm:5.0.0" + dependencies: + "@tootallnate/once": "npm:2" + agent-base: "npm:6" + debug: "npm:4" + checksum: b59a9b4bdd7c1d3450956a2974cb7b685517c758853a873064a536f5a831879ac92a28c717f69eb60ff3c924b262cb5aaf80cf62f5c2c24d1129d2b8dadf1e7c + languageName: node + linkType: hard + +"http-signature@npm:~1.2.0": + version: 1.2.0 + resolution: "http-signature@npm:1.2.0" + dependencies: + assert-plus: "npm:^1.0.0" + jsprim: "npm:^1.2.2" + sshpk: "npm:^1.7.0" + checksum: 4e2f77bd1fc16dbfaf9abc17420c35b09baf0463a300078064446bee1848cfc14778293d62f5b259dac3530ae2ab4823b8508ce8f6f8bbac2099904fad30a59e + languageName: node + linkType: hard + +"http2-wrapper@npm:^1.0.0-beta.5.2": + version: 1.0.3 + resolution: "http2-wrapper@npm:1.0.3" + dependencies: + quick-lru: "npm:^5.1.1" + resolve-alpn: "npm:^1.0.0" + checksum: 3be15184af083b5e075b82a02f00643e99a5b040b676d7819d1d3330e09fc1399523ef17b47d50f9e783749036c8a0d2dedbd9a23a0e8c60cc66644cb35d9e1a + languageName: node + linkType: hard + +"https-proxy-agent@npm:^5.0.0": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: "npm:6" + debug: "npm:4" + checksum: 8e767faec977400c31bca2ef0f5338b843b781b63fd985c00d199adac2d6c8a5ecc6e553588a6821a058198960f167a3c83f014bd64bef9a15b176d992d29dfe + languageName: node + linkType: hard + +"humanize-ms@npm:^1.2.1": + version: 1.2.1 + resolution: "humanize-ms@npm:1.2.1" + dependencies: + ms: "npm:^2.0.0" + checksum: fded981fd3b507fe78f7ce505c3f060e3b53cb2155d279d794a6bddb451bb1c7f865f4ca495dc0bae695ad0c182fd5be3a581b51ba30770e6adfda960bca0e68 + languageName: node + linkType: hard + +"iconv-lite@npm:0.4.24": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3" + checksum: 6cc23a171d6fe7c49ab89956a5f151dfc4db34b48b61cebe887051e35dbb9bebb25bf5e410e8c79efadfd8ed602a0f79f7d7814f77365841e0596c3136408eaf + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 14633c984e398011b4cce3d453e6566e4cc1b58f257e6fc48ae39c25a158b926e6cd7ee6023cd84aff12952a7581bd10bd4e7954af802dd5678e83b4cb8fdbba + languageName: node + linkType: hard + +"idna-uts46-hx@npm:^2.3.1": + version: 2.3.1 + resolution: "idna-uts46-hx@npm:2.3.1" + dependencies: + punycode: "npm:2.1.0" + checksum: 1aee47c7545eec8b6a690e15ae20a095dce3fb44a3c142f2c5c074a8efbb01feab2e16d433c29a1d3babdad31f32e14b0ae568e5169424c3982912bb8beb9e7d + languageName: node + linkType: hard + +"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: b39fbc42879544ab1989f8ff439a3f3545d7c244a07f24607c4223291ba82ce95964a7b7fde24010ba899937046c4dfe01398c8f8bbddb53f9e562c29f18f615 + languageName: node + linkType: hard + +"ignore@npm:^5.2.0, ignore@npm:^5.2.4": + version: 5.2.4 + resolution: "ignore@npm:5.2.4" + checksum: 55c58d848bb753a2b7e0b4a19352f9212eae2e4a05e4a12753e90b921108a6caa140adf958a5084b144bedd886b44e3bc93f6b4839e5aba1fb4a72c6625da4c1 + languageName: node + linkType: hard + +"immediate@npm:^3.2.3": + version: 3.3.0 + resolution: "immediate@npm:3.3.0" + checksum: 1b47c47653bae8541b24e2d3e8880ddf2e2bc193514a677fd6a899210460fefbdda3775b0765afee8591711f56dedb51ea0b652acd98a7177a8b8161df5c2abf + languageName: node + linkType: hard + +"immediate@npm:~3.2.3": + version: 3.2.3 + resolution: "immediate@npm:3.2.3" + checksum: 2cf7f22a30fb69d56331bfd476ddb103a188e10747fb3aadb4d0bb6bbd54a42ab566ec54f8ee1ff721a4040e901f95923d179ee4cfab550ba8d6ec5fe82920a8 + languageName: node + linkType: hard + +"immutable@npm:^4.0.0-rc.12": + version: 4.3.0 + resolution: "immutable@npm:4.3.0" + checksum: 4fcd15a9b7d623e99cbb992f66ea1171218c1c0b2711dbe54a07588d1236c3fc768e47d75313799e9c6b4073bca70e973d57aba8b5c890bc6b22515b0da67e45 + languageName: node + linkType: hard + +"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: "npm:^1.0.0" + resolve-from: "npm:^4.0.0" + checksum: 81ec300d4d16df0ba4f4ed99f4c7e8f312c4c6f48c100afe801deae468479cb8d8209a7c71a943b3e6def4fa0c24ad3eac34e72cb4968424930df39e8d16e9c9 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 6e2473e6083063b9f5f21a9586794b3af5b3f87995bcf60cb64f3824a7323c2ae41b4eaf3d7446e20fb66b5f3410094246aa3c52db7585270c8b10f762b8ffa1 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: f4ab9e229c120377a63fce905062e5fdf1c300ca01b72401dda5aa991e8f614fdb2f99fe7cc37ef3234413da4ab43d5a4f905356fdffb9d078e83806d274719c + languageName: node + linkType: hard + +"infer-owner@npm:^1.0.4": + version: 1.0.4 + resolution: "infer-owner@npm:1.0.4" + checksum: 2020f6d0322e7910ce841134a303c69857e456531d8cd01e336f6eea18122d1085b93ebde961745e5f278233f7f8a3d8b60b9276c8dbd3f49c4c352582ec9504 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 40d0e5db34e05d49b9ad9ac678334269745644f73206862a8dee6e50ada1c8b3e70774ce28d5e6e3b03b7b868c9d9ae1edaf6eff253fc50209e4c69decad1811 + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.1, inherits@npm:~2.0.3, inherits@npm:~2.0.4": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: ca76c7e45ec715bfe6c1dd67b780b9a15068f37b37ab56cf8b773537b2654238469a42950f5f4d301212755e7512be888f627752e778e1863d95cfedefc8b8bd + languageName: node + linkType: hard + +"internal-slot@npm:^1.0.5": + version: 1.0.5 + resolution: "internal-slot@npm:1.0.5" + dependencies: + get-intrinsic: "npm:^1.2.0" + has: "npm:^1.0.3" + side-channel: "npm:^1.0.4" + checksum: 7ba9f797e33d9f7fb623ed4eb63a8f4697da1423e8dd47a336c759707a14aebc9d2e04c7df286a493f4eac30c178c6ffad89f559beb3e9641992b6a57f933088 + languageName: node + linkType: hard + +"invariant@npm:^2.2.2": + version: 2.2.4 + resolution: "invariant@npm:2.2.4" + dependencies: + loose-envify: "npm:^1.0.0" + checksum: 5d5f2b8c4ebf418a43764a94c46932620595bbd434897966394d6db2155ce1f3036c37830674d86fb0552334c49cf9831fa9bfb8fc1d151ba4de93f5ffb4d285 + languageName: node + linkType: hard + +"invert-kv@npm:^1.0.0": + version: 1.0.0 + resolution: "invert-kv@npm:1.0.0" + checksum: 7758df8048d966405c0a3b585db82a4b0ad0782fd6f0f802df48643fc91b090a0e47586883fed4b3105e73b84589711d93767d3869b7f7e0e381d19d61e30562 + languageName: node + linkType: hard + +"io-ts@npm:1.10.4": + version: 1.10.4 + resolution: "io-ts@npm:1.10.4" + dependencies: + fp-ts: "npm:^1.0.0" + checksum: ca9370c85908a5bbe3e6448c43aca041d08fd36766d12e5e2a79e0bf7c88215e941f8a29a2b5aa0a70f64632e587b74cc0a585969ce3b0e2b433e556d686b387 + languageName: node + linkType: hard + +"ip@npm:^2.0.0": + version: 2.0.0 + resolution: "ip@npm:2.0.0" + checksum: 42a7cf251b844d98a4c3373d06997b991cd1a7f8a5d43bcf2b4f610517d39c5504f6eb3e73e77f5c1453ac766690e82dab28a8a05a49a6fd7d4a40fad93640e9 + languageName: node + linkType: hard + +"ipaddr.js@npm:1.9.1": + version: 1.9.1 + resolution: "ipaddr.js@npm:1.9.1" + checksum: 5b70543172617fc9b0456f153d197a4fe2df54d1c808ebb17ee85e3cbcb73cf7159a29288d2f10be294f796bcb0695940d7881f8532c3b2928c8f22a97779d00 + languageName: node + linkType: hard + +"is-accessor-descriptor@npm:^0.1.6": + version: 0.1.6 + resolution: "is-accessor-descriptor@npm:0.1.6" + dependencies: + kind-of: "npm:^3.0.2" + checksum: 2d1d859ecf3bd5a57566d2425f23fc9cc06f7b43d05ba87dd6cd2abbd8c3ae682fbf77778012964b9a6e9e3e0f461b1d270ba9fbdd021aeb46c94366f1cf58c4 + languageName: node + linkType: hard + +"is-accessor-descriptor@npm:^1.0.0": + version: 1.0.0 + resolution: "is-accessor-descriptor@npm:1.0.0" + dependencies: + kind-of: "npm:^6.0.0" + checksum: fbc53a6000984e1a135a5deaaec23193e59dbad5489e198d0ad2564ab875104c751808e2d57d361307365fcd14e8231b01806945e5075c925ac6dcc8e7382428 + languageName: node + linkType: hard + +"is-arguments@npm:^1.0.4": + version: 1.1.1 + resolution: "is-arguments@npm:1.1.1" + dependencies: + call-bind: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.0" + checksum: 3eae41e0267725f644140c795cdcefd265f2ed9f946d4e114b4ccf1f255f42afccfb6f8d79b0124e16cf59ec05841288439435140f9a4450d701f74a271c649c + languageName: node + linkType: hard + +"is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": + version: 3.0.2 + resolution: "is-array-buffer@npm:3.0.2" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.0" + is-typed-array: "npm:^1.1.10" + checksum: a16f8a01bef76922e75984bd33e38dff931c512d8bb7b8e994898643513fbfedfd7c270f375d4a9c41819c5161b23d9e7fff6c9cbcbd97189a97c1f934a3f7c0 + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: c701fd85259ab454cfacf4a30123e3e43542a3e60124a670e89f6e5847590ff4a6e4c0d8ccbe940df64f0001547f65856cf6a13b6528a7ce93da34cf2b2ea23d + languageName: node + linkType: hard + +"is-bigint@npm:^1.0.1": + version: 1.0.4 + resolution: "is-bigint@npm:1.0.4" + dependencies: + has-bigints: "npm:^1.0.1" + checksum: 0e3ca3959ca1a9ee7dd70ce780567f31beeb456993752ba7e33495ed91e734f40decdc258ed450f64f319c0923ea46e2d1de5c4a9dbf89a12de05dc636dd6bfa + languageName: node + linkType: hard + +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: "npm:^2.0.0" + checksum: f6ed933392b85facdc081bbe3539602ac70cf35fe5d3d7e02da0b9c4bc65fa673d815142f16bf6253de84a561332a680382be1ade1406c89c9102832a571620f + languageName: node + linkType: hard + +"is-boolean-object@npm:^1.1.0": + version: 1.1.2 + resolution: "is-boolean-object@npm:1.1.2" + dependencies: + call-bind: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.0" + checksum: 39616788ace17a15b2a4cbc6bee6dbe96be05e86e6afedf8eb1580a2eb05cd6732dfa58949ebc9343a2c9c389fb8a34a4659e0ef7b5bfc4807ccf9814e0cf9b3 + languageName: node + linkType: hard + +"is-buffer@npm:^1.1.5": + version: 1.1.6 + resolution: "is-buffer@npm:1.1.6" + checksum: a3857c313fad2bc168a0e0af61d9e8149fe1aa251bc1bb717cf309f8fc3266c2701f82cdf8b224f24e916e32c248da4ead85151ad43c2787090c57b3469f9af7 + languageName: node + linkType: hard + +"is-buffer@npm:^2.0.5": + version: 2.0.5 + resolution: "is-buffer@npm:2.0.5" + checksum: e3ca83ee43ce9d896ab8389d74b0e5870c960ea06fdbd1e793b4347631038ef12e5494c339fb2645fc3cb18c0e61dda5bb67b2edea2163b20a6b502500c44601 + languageName: node + linkType: hard + +"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 39d7787a6cd66d620ee4e9d09bb36587c29b39f50550d27dd7bea1d0d46b2a87ad9ac2b3d11f751836f08befc20afc4cb36201de1de26aaf02f298c8c512c102 + languageName: node + linkType: hard + +"is-ci@npm:^2.0.0": + version: 2.0.0 + resolution: "is-ci@npm:2.0.0" + dependencies: + ci-info: "npm:^2.0.0" + bin: + is-ci: bin.js + checksum: 84f3a32ef8376c75eac3d451c51884ea58b6024ac18ff5717c86a504977d800980fa89a4c02ab46b4f539087215466cbf47ed306d9ffb5dc99c7d5a207be8e0d + languageName: node + linkType: hard + +"is-core-module@npm:^2.12.0": + version: 2.12.0 + resolution: "is-core-module@npm:2.12.0" + dependencies: + has: "npm:^1.0.3" + checksum: 5619b73eeed50eb88c2941c4df535f080a2add4dc568e13411228121da6d7885da4f55be81167f221f4ddb3cb8feab27b00a36242721508a9b02743198aeaa43 + languageName: node + linkType: hard + +"is-data-descriptor@npm:^0.1.4": + version: 0.1.4 + resolution: "is-data-descriptor@npm:0.1.4" + dependencies: + kind-of: "npm:^3.0.2" + checksum: 159a151e93e09b2ac169ce58787afcb00344f9c8e81ed6f1331ea896230da85fa639c914f4ac0840d031c4041a109ec1a4261f097ca09abe8126d588c8c780d3 + languageName: node + linkType: hard + +"is-data-descriptor@npm:^1.0.0": + version: 1.0.0 + resolution: "is-data-descriptor@npm:1.0.0" + dependencies: + kind-of: "npm:^6.0.0" + checksum: 04507e714ad86c5dd4af86d05c39eacd06dfe593f8150731a097754308a64a2a7204d2f2e352c4433a134d2b90696fbd7f4a2c09b0bff8d7180042c6da7b23e7 + languageName: node + linkType: hard + +"is-date-object@npm:^1.0.1": + version: 1.0.5 + resolution: "is-date-object@npm:1.0.5" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: a961e52c2f846d5522413ccd47d376a926b0ddd04b5db468b8b091f93d455475ca26c4b9beae386202e5d05ad2c75252d15452c8ddf942891712b3f94debd9d4 + languageName: node + linkType: hard + +"is-descriptor@npm:^0.1.0": + version: 0.1.6 + resolution: "is-descriptor@npm:0.1.6" + dependencies: + is-accessor-descriptor: "npm:^0.1.6" + is-data-descriptor: "npm:^0.1.4" + kind-of: "npm:^5.0.0" + checksum: 82d53bbddac41765b5003355ef5e34513f9e1a6a20b619b3dc973d0f60b8447f2ab3d42ab9274d26b007c780a21434354582a2768752926ea27dcf4804840a08 + languageName: node + linkType: hard + +"is-descriptor@npm:^1.0.0, is-descriptor@npm:^1.0.2": + version: 1.0.2 + resolution: "is-descriptor@npm:1.0.2" + dependencies: + is-accessor-descriptor: "npm:^1.0.0" + is-data-descriptor: "npm:^1.0.0" + kind-of: "npm:^6.0.2" + checksum: 3536c35fe3db7e9f2e0f7fce901e0be05cf6fc57b5a3d11bea625098757f7f572c5aca4e7792c05bbcebb82b7de2e9a9de60ecf26e79ddc85ac82c631dac8558 + languageName: node + linkType: hard + +"is-docker@npm:^2.0.0": + version: 2.2.1 + resolution: "is-docker@npm:2.2.1" + bin: + is-docker: cli.js + checksum: 4a6decb5f39980f0be8169474b2f2db9f76f77dc83353cdf815e7790b51ed29775eb316e77a868b5c80c4587e8c98d533eef484c0b76f856c576282a8c52920f + languageName: node + linkType: hard + +"is-extendable@npm:^0.1.0, is-extendable@npm:^0.1.1": + version: 0.1.1 + resolution: "is-extendable@npm:0.1.1" + checksum: ffa5a697b932aeb992b4471674489fd07c223034e0d8ed4b7ef70a7daab850aaccc09519e40d02a36b98b30f978f38697e53cb32e3d4bc3c3d6af229c47a1822 + languageName: node + linkType: hard + +"is-extendable@npm:^1.0.1": + version: 1.0.1 + resolution: "is-extendable@npm:1.0.1" + dependencies: + is-plain-object: "npm:^2.0.4" + checksum: 6fc68b8c8ada0501262a29a35f2e2c11a550c96a8c3ce6cb2ea12a5f48b3f658b9e28f92f195750e80d6d1732a146269473ae5f0f1fa70d26c6e45e9f5976b5a + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 226b9f6eee1e7da52f72c98ed4ea7fc71ee3a087b6d1c62655c9a81c601caa2fd98b9f9be42fb8163eef2720cdbf046bc7c5548a76755651e540f4b08ff3b120 + languageName: node + linkType: hard + +"is-finite@npm:^1.0.0": + version: 1.1.0 + resolution: "is-finite@npm:1.1.0" + checksum: b029a10ab9d71094a11fd177d05d64401972ac0e44f9da3f084822f41f23146933b733807d6388da6baecad2b20c88e925739d5bcac05d1c166943c44065deda + languageName: node + linkType: hard + +"is-fn@npm:^1.0.0": + version: 1.0.0 + resolution: "is-fn@npm:1.0.0" + checksum: dc75e58d043889603314b7512452e58fa4ee40cd5c964efbc5d957164405d024f59bc06cd209c398a810e339309fc68b66eda75500d0c4e9c64374dbcbb024b5 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^1.0.0": + version: 1.0.0 + resolution: "is-fullwidth-code-point@npm:1.0.0" + dependencies: + number-is-nan: "npm:^1.0.0" + checksum: 4ac2325a174bf9bad857527715b947a117d54a6b7b2bc1a059dd7220f30609da5aa4467b4bc523bf78f2b3375d25169bddd31234513713870ab1d8e1d8509d44 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: c06b5792b82dcdedb41858cdb07ca4ae5b9a853ad65c91529533221f384d751bedd8ad8db5a527cb219fd989c32a0faa0833312b6a190fe597acdd23165ef724 + languageName: node + linkType: hard + +"is-function@npm:^1.0.1": + version: 1.0.2 + resolution: "is-function@npm:1.0.2" + checksum: da2dd9cd27c91ee7d2aa20bcc05d45e6b9a614aba81a7f8e4085321379782ca1b5a8ef2bf9cf09708e0072f8d1d4a057accd409fd5fecb3bd081e13c51fd18d7 + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 0b2f6c06162a1d6c764b2f1cf0f2617b6e0cb1e8125c0e3b7e838a3e06caac81268ab3c0a4699052df59229c99e8a1dd0217b30476d7643a37fa17a49f1b50af + languageName: node + linkType: hard + +"is-hex-prefixed@npm:1.0.0": + version: 1.0.0 + resolution: "is-hex-prefixed@npm:1.0.0" + checksum: ebd94c1d909d2b84e29273ba558e664f3e06664c18ccec404eff854d02c4118e8f6598c3e3e71d3e8d65dc66af2f65e071e91b6ad76d8a99427c372544883688 + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 8e761e558bf60bd3682648e6ecb6333e9ad9c5a6fef2a9ca879deef1a40478e5f7e18999fc3630ef8b879cf00bc0248ffa5616aa4251917a7f87f066841310aa + languageName: node + linkType: hard + +"is-negative-zero@npm:^2.0.2": + version: 2.0.2 + resolution: "is-negative-zero@npm:2.0.2" + checksum: ce904d0d03bacd5393b3eba41321333169bd6fe8f87d1341016899e91c700f660e5e6b6dd3f3d9de5a12261cec207cf85914d1a89ad428e19c2983e451a8ac59 + languageName: node + linkType: hard + +"is-number-object@npm:^1.0.4": + version: 1.0.7 + resolution: "is-number-object@npm:1.0.7" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: fd67ff18bad5c64ce2054a03d92c9f264f0f0cd197ea6951207c3dd1b9bea5b40e933be440e7673ea2f1e2a6b265c1842651c94c12d16efd84bbe9310d9cc600 + languageName: node + linkType: hard + +"is-number@npm:^3.0.0": + version: 3.0.0 + resolution: "is-number@npm:3.0.0" + dependencies: + kind-of: "npm:^3.0.2" + checksum: 8c8ffed73c8ae7103daf066c3ff9be8c702edfdcfb8d0fa5d4b70a3b056ba9aaf4c0d6a055fbbd020cb7c622f30763dd2c3cd71319776f4c6ed1520891b5be0e + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 748df55ae14cc960b090a7611932940df9fa703b7e0fb4f73943b4eb94c4b5391f27ba3881fab8f5bf7a2f097490e812db0d58d05c92154e70fdf14f93d6fa95 + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: ca3976bb491e562794ba9d1884d8679e08a68fbc68bdefabbed393bdb3fefd66958c0b8d166ca6c4b502a5283bcd0bede7a2b223bf740e406db6dcffddc833a5 + languageName: node + linkType: hard + +"is-plain-obj@npm:^2.1.0": + version: 2.1.0 + resolution: "is-plain-obj@npm:2.1.0" + checksum: d07f99715f51b58ef452a809a416bd75da7ea10152f53adf469dd30b1e262e60f6f9c1182534a7ceb3e82a5516cd9aa9548d6dfd5df7ce03f6298b19691c81df + languageName: node + linkType: hard + +"is-plain-object@npm:^2.0.3, is-plain-object@npm:^2.0.4": + version: 2.0.4 + resolution: "is-plain-object@npm:2.0.4" + dependencies: + isobject: "npm:^3.0.1" + checksum: fd67792beb6982bbf5d0b0e8e0f743947d0ca6a1068e20b4826d47e7d7b674fdd4860e4c685880081ea3cedb03aeddf55037500ca7d9ee09335908118b46782f + languageName: node + linkType: hard + +"is-regex@npm:^1.0.4, is-regex@npm:^1.1.4, is-regex@npm:~1.1.4": + version: 1.1.4 + resolution: "is-regex@npm:1.1.4" + dependencies: + call-bind: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.0" + checksum: d5a09a3da9ba262b3c92f415a2d917ff42fb2241ec7a6cc58ac4512b1b4b35da765c79a60677d7125467a0a597f90cc8d20c5472da520d20476dd12b663cfa65 + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "is-shared-array-buffer@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + checksum: 89167fd3a2768021900ea3e5d4d844127bffea24fa9f171e5e621cb454ffac2539e224ba95567f71154cf488eda4e995282491eb5863d312daa0f14eefa4346e + languageName: node + linkType: hard + +"is-stream@npm:^1.0.1": + version: 1.1.0 + resolution: "is-stream@npm:1.1.0" + checksum: e04ef26bd08243470b82d5e2dd923663b24bd48313e662c678f9623e67174a19e2cb957bb895f1d1ecbe8b2157946c512b1cf64817da8bdc85a981ed3b51eab3 + languageName: node + linkType: hard + +"is-string@npm:^1.0.5, is-string@npm:^1.0.7": + version: 1.0.7 + resolution: "is-string@npm:1.0.7" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: 1a2c721eeebd6e0b0228d879af6c5e82d4e2574249b5d86fb1975f683ad73f43d1120ea7a36331455a77f7c54c92a4cb5a276ce344a11770dd88fd8ef47aa54b + languageName: node + linkType: hard + +"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": + version: 1.0.4 + resolution: "is-symbol@npm:1.0.4" + dependencies: + has-symbols: "npm:^1.0.2" + checksum: f1bb1364865f405120eb657a70750cdec3e63260eae6bda81509d4c58b456b7e21f22ab1d5cfc55f269e69dddbdc68ba9764757ab4eaa9e3073357ca9c8e17c2 + languageName: node + linkType: hard + +"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.9": + version: 1.1.10 + resolution: "is-typed-array@npm:1.1.10" + dependencies: + available-typed-arrays: "npm:^1.0.5" + call-bind: "npm:^1.0.2" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.0" + checksum: c42bdb03b501a76c1b307f087885bc700952fe1ae1f203264c52e3eb467c8a1f69527c5285bce0898eca66a892a988b94e609ea87bcb78f663c1ab57e6286016 + languageName: node + linkType: hard + +"is-typedarray@npm:^1.0.0, is-typedarray@npm:~1.0.0": + version: 1.0.0 + resolution: "is-typedarray@npm:1.0.0" + checksum: f918df0d4215dbde9d0d29375cf39e353abe59ef3964862afc87bb6ce503e7439f4131260a7b1777074f5fcc64f659c75a4ce5a93ceb603901375cd0b13eedab + languageName: node + linkType: hard + +"is-unicode-supported@npm:^0.1.0": + version: 0.1.0 + resolution: "is-unicode-supported@npm:0.1.0" + checksum: 89a336ffc0aaf907bb1072bd5e8aa7187076620d0099607084911a733a055a52712257d619b2ab2031f6f0eb9ba886504384ebe218a6737d9bac734e6baaa736 + languageName: node + linkType: hard + +"is-url@npm:^1.2.4": + version: 1.2.4 + resolution: "is-url@npm:1.2.4" + checksum: a76fc21634a514fecc984b7f61db97d9423077a6e5ff1d19e1ed89bacf04273f66d8e445295fba15540b5a590dc62e1751a209261fc1d32238cdc1acde7f9826 + languageName: node + linkType: hard + +"is-utf8@npm:^0.2.0": + version: 0.2.1 + resolution: "is-utf8@npm:0.2.1" + checksum: 33edd368af5530114a9d6b94ebf5dfcf043807267769223bb411b22c04a6c4f99a9a000c8e7538f3c6b8393f97d4919f0902dcfca8034e07464de53d72471ec1 + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2": + version: 1.0.2 + resolution: "is-weakref@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + checksum: fdd5b2df8209f8387a86c8a504f6983fff0f90b46aabfe8d97ffbf34d2cbb6f64edbaec8da16deedd876c228b7b721ead65f42f20f1a0e7ebf294f669542c534 + languageName: node + linkType: hard + +"is-windows@npm:^1.0.2": + version: 1.0.2 + resolution: "is-windows@npm:1.0.2" + checksum: ba7ae056a6a1ab995164ff9212cb7ddc764669144dae7c9d6e34431fc36ec2d3a6a831855a0ac21fb80d4a44e8dc2223437aa68999920fc113b662306bbc776c + languageName: node + linkType: hard + +"is-wsl@npm:^2.1.1": + version: 2.2.0 + resolution: "is-wsl@npm:2.2.0" + dependencies: + is-docker: "npm:^2.0.0" + checksum: 44a5dd51a565631dc02905673e6fc1eded217f5039a20ded7ab17ced7352746937f08dac3f4eecafe5ac854528d6fef2378d8d2ffaab0e6d10109f6a36ed4986 + languageName: node + linkType: hard + +"isarray@npm:0.0.1": + version: 0.0.1 + resolution: "isarray@npm:0.0.1" + checksum: 70b0db8fefa7d6552381a70ebd28e98abfa27f65077c019323741342014a6dfd0055cab5a341388c9fdd8a890273040fcbe01929ff77b89deae94317dd2679d1 + languageName: node + linkType: hard + +"isarray@npm:1.0.0, isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: 7b41a2a80d6285328dddeecd3e45a5c73264e8ff8817bb7dc39f6f47323dfaa28e27c13918aac4aa88e48800a4f1eee2e5e966da433e06085ef0a7592dcf6880 + languageName: node + linkType: hard + +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: bd46a907ad163c4c937d08ee6520fc9482cf5457dc0d168457ef755d8f26e75b5e2649962722a4c0f5ab2398a95e431c8469c86a004c42db21230ef40b8720ee + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: b37fe0a7983c0c151c7b31ca716405aaea190ac9cd6ef3f79355f4afb043ed4d3182a6addd73b20df7a0b229269737ad0daf64116821a048bfbe6b8fb7eb842c + languageName: node + linkType: hard + +"isobject@npm:^2.0.0": + version: 2.1.0 + resolution: "isobject@npm:2.1.0" + dependencies: + isarray: "npm:1.0.0" + checksum: 99df852e57e1ab7ec863ad56affadd024944607da525e78c430b813bb2c901f95321c689c9617852c50f808a6b61f2f90246c61df6d32f69f09f80af7f97a145 + languageName: node + linkType: hard + +"isobject@npm:^3.0.0, isobject@npm:^3.0.1": + version: 3.0.1 + resolution: "isobject@npm:3.0.1" + checksum: 63ee4c1b8002898c138728082399ad3f3f77f6e2f1ee8cc286bb4641aebcaaecb0931c608a64525471a95356daf42ea35b2f2610e15ea2c9ba6a6b4ab7b909fc + languageName: node + linkType: hard + +"isstream@npm:~0.1.2": + version: 0.1.2 + resolution: "isstream@npm:0.1.2" + checksum: 0458850e4cc11c29dece587a48a73b44e423738fc8824bfa946f11cc5371ccf94e9e9fcbc4025ced0116c420e08ed3a61cfb14393d2b4c989587888acdd6b0ab + languageName: node + linkType: hard + +"js-sdsl@npm:^4.1.4": + version: 4.4.0 + resolution: "js-sdsl@npm:4.4.0" + checksum: 8c85413f74e8bce8390d49474c8b0ff9d99626bd913ab41ad36f92ad297b89c50198daca84ff56bfb0dd1d5b4e64abfbd0e3ea8b016739dc64b5f076784d3b79 + languageName: node + linkType: hard + +"js-sha3@npm:0.8.0, js-sha3@npm:^0.8.0": + version: 0.8.0 + resolution: "js-sha3@npm:0.8.0" + checksum: f7ae73fb14080ea094e95c7401eea57468bde1df93441052b3e9823af1f7a61e814b0f61610212249b8499adedbe92199cbb467cfca799b5003d17701427c994 + languageName: node + linkType: hard + +"js-sha3@npm:^0.5.7": + version: 0.5.7 + resolution: "js-sha3@npm:0.5.7" + checksum: b3f7e3271c747630cde80bf8e5b881db8136bd6fee287aed3dc2cba4c159993894ea4fa15de65a8d2ebb6ef55a8f33f258c9d2473285a36a01d8b7a413958670 + languageName: node + linkType: hard + +"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 47d1c18dc6b9eed4baf1db3d81b36feb95b463201c82ffce0d7a4d65ede596ba97d6ac2468974199705db9ef8a3433606af41fc7bbe7cb25c1dd601785413d9b + languageName: node + linkType: hard + +"js-tokens@npm:^3.0.2": + version: 3.0.2 + resolution: "js-tokens@npm:3.0.2" + checksum: 59580696b1a9b154aa6be6d73d0991daa1a28c39d6f0a914ef7fdadd467936827b833d436ab35bbfea9d91a90fd97b0dc37fb94fe2d4634255a4e24a84acc654 + languageName: node + linkType: hard + +"js-yaml@npm:4.1.0, js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 03ab64a1008a68bb534a223f855c1dd595c0fc6b2800517f555803ed6e96c1cd365e19088ae46a466329a7b77b1e7951589db76a6ea2d525374a4167f69ac776 + languageName: node + linkType: hard + +"jsbn@npm:~0.1.0": + version: 0.1.1 + resolution: "jsbn@npm:0.1.1" + checksum: b30785edca016891c4da40f97916476858a0e14745ebb14ac59162a9110b5a1f80cdd550b80b627234ba63ea16f83e233502625572e7fdd9dcf703c99a0d753e + languageName: node + linkType: hard + +"jsesc@npm:^1.3.0": + version: 1.3.0 + resolution: "jsesc@npm:1.3.0" + bin: + jsesc: bin/jsesc + checksum: a57ea5860d1a85a22e33b7c16a3f63d70b3f4049a5ac45fbdf2ace9be7d3c2b4f7a6986cac5386efc702d9f811922fd2e6db87bfc893ba46ca029e0cd68da678 + languageName: node + linkType: hard + +"jsesc@npm:~0.5.0": + version: 0.5.0 + resolution: "jsesc@npm:0.5.0" + bin: + jsesc: bin/jsesc + checksum: cba3a1fba9401771cf3bad85c8e0e2c604cfdfd85d7b1a7a8ae84317777f76c4b02d6c52da86cb8a70307ca84c3aa40a214e77bf0d5549557826b04df6df2bdf + languageName: node + linkType: hard + +"json-buffer@npm:3.0.0": + version: 3.0.0 + resolution: "json-buffer@npm:3.0.0" + checksum: 26a96a5875dbbcd4abbef1fc20384645d922117eeaddd266bb0ac6f8fa5714d3da0cf160529e3558f8997065b4e1ef00ae2c4cb1410610b5cfe872156f4e89b9 + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 33bf05e0790ed025751047b51bb8bc0f15942be22d22acaa071c44a4e3277bdf23132f49549a7d8dd89ee67679923f21efa21de2aaa448472372e92a837cea15 + languageName: node + linkType: hard + +"json-parse-even-better-errors@npm:^2.3.0": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: ba9ec77806c99530719c8c2a26aa426f421dccd6faafb4ee32f2d71dff25aefe4d150fba814eb58be8b82e765af5e7dc8e88d1c38c7227a1304f4d20a405a67a + languageName: node + linkType: hard + +"json-rpc-engine@npm:^3.4.0, json-rpc-engine@npm:^3.6.0": + version: 3.8.0 + resolution: "json-rpc-engine@npm:3.8.0" + dependencies: + async: "npm:^2.0.1" + babel-preset-env: "npm:^1.7.0" + babelify: "npm:^7.3.0" + json-rpc-error: "npm:^2.0.0" + promise-to-callback: "npm:^1.0.0" + safe-event-emitter: "npm:^1.0.1" + checksum: bb0c87e270cc8764f3858946ad7ad241e8005047d7476e4a4c120f4c5cca90f67d556a53544bdf291e30180ae95fa60a9e8e8a6f931ba7a3a81d724f45b20f58 + languageName: node + linkType: hard + +"json-rpc-error@npm:^2.0.0": + version: 2.0.0 + resolution: "json-rpc-error@npm:2.0.0" + dependencies: + inherits: "npm:^2.0.1" + checksum: 764b70b63f96a6400bbce4c6b1b9d98e36e5c58f1b2e62984f8cc408ad7e31531601becd8f8974c76e5031e5e0fe403c485a0786878897070c434b2120f1fbe9 + languageName: node + linkType: hard + +"json-rpc-random-id@npm:^1.0.0": + version: 1.0.1 + resolution: "json-rpc-random-id@npm:1.0.1" + checksum: 19b8459ee39408ba11dd400df981666bdfbde48c87606034f7fa8ea0eb8e7f12f70cabc7a14cf600325b6572b9c4c537e40b51a41e24be6290bc6570e1297608 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 4c9b10ebd277b894fa66f7130ffcf6b8c0d2c41754ce3784d82149695dbd928c15523aab230b8206c4be5b48127cafc0467760774673ba61045e1abb52e74de2 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 3da4fc677cfedd1745cce0c1acefebcf508c9cfa8d202ae394e38d31acbb398aea24da8e4959d5f9e44b12ebaa963bb4e4f7c25804e17484b3bfbc00519c58ca + languageName: node + linkType: hard + +"json-schema@npm:0.4.0": + version: 0.4.0 + resolution: "json-schema@npm:0.4.0" + checksum: 54562ace314c3b4441c8daf87eb45db2a454d19aa0fd402cdf4cda5806e444b9e03c79845a93d9c1bca19694386c40d87282c14749ca02915732a6315b3a54b6 + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: fcea02bf8b7e6067bec7e4019b1e4e15a2f1c8148ad9ea5f9fbc3098efee939f93f53f475f27a44f4b8996e9990c56b39bef6ff0bdbb4243e485084f619d5399 + languageName: node + linkType: hard + +"json-stable-stringify@npm:^1.0.1": + version: 1.0.2 + resolution: "json-stable-stringify@npm:1.0.2" + dependencies: + jsonify: "npm:^0.0.1" + checksum: 18c228c7f4ef2616748091ac05978a1002d74b5d722bb26e9e390c5bd72a8fddacadb59db27bac152cf079fad7e00fdb9aaea7e2bcfc610f2701706be42a95a1 + languageName: node + linkType: hard + +"json-stringify-safe@npm:~5.0.1": + version: 5.0.1 + resolution: "json-stringify-safe@npm:5.0.1" + checksum: e86f7bb748bb84f73b171bb68c8209a1e68f40d41f943952f746fa4ca3802c1edf4602e86977c2de44eba1e64e4cabe2498f4499003cc471e99db83bfba95898 + languageName: node + linkType: hard + +"json5@npm:^0.5.1": + version: 0.5.1 + resolution: "json5@npm:0.5.1" + bin: + json5: lib/cli.js + checksum: 72201befd014e40ee453ee05eed9df01e180fc2baca9be06316a0189ef6ae54d72f0504109d8270e5aedebd0570587b3c360c5aa9293a7ec777c4ecbd908adb8 + languageName: node + linkType: hard + +"json5@npm:^2.2.2": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: e298f92c92197e956eb7a93304f74b5b80b4c3fe412f44a1f3d4c966e5ddf2e8ef2ac7ce0b0c40c78735bf2901c29257a653e1da684dae8e7835932e4904d6a0 + languageName: node + linkType: hard + +"jsonfile@npm:^2.1.0": + version: 2.4.0 + resolution: "jsonfile@npm:2.4.0" + dependencies: + graceful-fs: "npm:^4.1.6" + dependenciesMeta: + graceful-fs: + optional: true + checksum: eb9be3becafbc8126bab889ad8fc163713c8c675003d8f70fd7f253652d7cfb4cf77f0f5534e7ca3871bb5d7ae503e9ccd0f4ab9e1687b65052b8438ab240283 + languageName: node + linkType: hard + +"jsonfile@npm:^4.0.0": + version: 4.0.0 + resolution: "jsonfile@npm:4.0.0" + dependencies: + graceful-fs: "npm:^4.1.6" + dependenciesMeta: + graceful-fs: + optional: true + checksum: d85d544514d7bd7968d263442441261c37cfd674ac3ea0120fc76f5868907e68bd5763c67a2917f3496135459beb35812d8e5cafe634d8247825cffec177ab1c + languageName: node + linkType: hard + +"jsonfile@npm:^6.0.1": + version: 6.1.0 + resolution: "jsonfile@npm:6.1.0" + dependencies: + graceful-fs: "npm:^4.1.6" + universalify: "npm:^2.0.0" + dependenciesMeta: + graceful-fs: + optional: true + checksum: d1fe80d443f7b3257aef1ef918231c9cf8a57127f004f74232869dfa408188b6ccf9d8a6724f7dbf7a6797355969cacfe1f2a16779f4ec636999bfaa876c13b0 + languageName: node + linkType: hard + +"jsonify@npm:^0.0.1": + version: 0.0.1 + resolution: "jsonify@npm:0.0.1" + checksum: 42bd23b9bbf9773d6654606778f39b2a0e452e69f3a19254205a5871bde822df93739e7c6c75fa1315725f5654219805c85e28c0612dcc01e3638704cfc3dfc5 + languageName: node + linkType: hard + +"jsprim@npm:^1.2.2": + version: 1.4.2 + resolution: "jsprim@npm:1.4.2" + dependencies: + assert-plus: "npm:1.0.0" + extsprintf: "npm:1.3.0" + json-schema: "npm:0.4.0" + verror: "npm:1.10.0" + checksum: cf143189e848715ee8aae4907dc2bfaf68380539713950a5bf7ce09a16b9d5fbada2c7a588c5881d582cf327aa29d7ccacc92b4491f94bdb5d879c53710b5207 + languageName: node + linkType: hard + +"keccak@npm:3.0.1": + version: 3.0.1 + resolution: "keccak@npm:3.0.1" + dependencies: + node-addon-api: "npm:^2.0.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.2.0" + checksum: 947406205f126f9fb6615c3ace7487a53d94d8232231ccf62f40f5651338d76020a721f0a5421fd8b0bd54a21d6494b8d8381a2acf0c6022f21cf0344f50eaca + languageName: node + linkType: hard + +"keccak@npm:^3.0.0, keccak@npm:^3.0.2": + version: 3.0.3 + resolution: "keccak@npm:3.0.3" + dependencies: + node-addon-api: "npm:^2.0.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.2.0" + readable-stream: "npm:^3.6.0" + checksum: 1ed8bb6b9907f1d163ee61793591177506edc3d3d950a091e59c2e19dae74d066eb304626286a9d8f5961ea3f08e20b69a86db94d413856c6a28578718d57e06 + languageName: node + linkType: hard + +"keyv@npm:^3.0.0": + version: 3.1.0 + resolution: "keyv@npm:3.1.0" + dependencies: + json-buffer: "npm:3.0.0" + checksum: a820d1923a508008cf84894f263d9c29b08d1692f54973894eca647f027288b2fb140605b54df73537d1229f7c3d683eea7b00981d4b0b5346a0ea8a30a2d910 + languageName: node + linkType: hard + +"keyv@npm:^4.0.0": + version: 4.5.2 + resolution: "keyv@npm:4.5.2" + dependencies: + json-buffer: "npm:3.0.1" + checksum: 921f26a3e32ae0cd0baabbcf1e8957bddfa675d51783e2ad19256db423c8d1c40c9aafbe892584dbe72a045389bfdc2572a7f182c4b29e32c6165990df161978 + languageName: node + linkType: hard + +"kind-of@npm:^3.0.2, kind-of@npm:^3.0.3, kind-of@npm:^3.2.0": + version: 3.2.2 + resolution: "kind-of@npm:3.2.2" + dependencies: + is-buffer: "npm:^1.1.5" + checksum: 0d9abb42418672d172161162a115633d0b0573837e649fe7f41e492708a2dbaf41a4f6bee041ca1a54639631355f77d414e308221ac6e2ea2e7552d26507597c + languageName: node + linkType: hard + +"kind-of@npm:^4.0.0": + version: 4.0.0 + resolution: "kind-of@npm:4.0.0" + dependencies: + is-buffer: "npm:^1.1.5" + checksum: 3e64797b13ff40f96b8f04e09cf907460725770904e90e0d22fbc5fddbedab44520b6a6d7040c449231b5576dddebec588ace9ca294642410650269dea7772f5 + languageName: node + linkType: hard + +"kind-of@npm:^5.0.0": + version: 5.1.0 + resolution: "kind-of@npm:5.1.0" + checksum: a2d405abf3554b8ecb90941e5209d5d3712417e98dc4491e57acc509c8033dde1ed720103bd4337bf43b909fc00970524ad1e7f73d7f51f899653f83c17c5d52 + languageName: node + linkType: hard + +"kind-of@npm:^6.0.0, kind-of@npm:^6.0.2": + version: 6.0.3 + resolution: "kind-of@npm:6.0.3" + checksum: 4adceee06111de8a2d02e7b542c957caad38f2d54c522da0387f4735804bf1819b2ccd918c8d1c8a73276caf9d728fc8276b53e142d23879c4728a6edcbdf722 + languageName: node + linkType: hard + +"klaw-sync@npm:^6.0.0": + version: 6.0.0 + resolution: "klaw-sync@npm:6.0.0" + dependencies: + graceful-fs: "npm:^4.1.11" + checksum: 039ecfdc7f5fb10f7c2bfa372ce89f3553e481cb8791939a6f8a92afd3dcb5050120b70a667725a1e966f0dd83d17f7cc9069b8c6e16685767e112fb78ac4373 + languageName: node + linkType: hard + +"klaw@npm:^1.0.0": + version: 1.3.1 + resolution: "klaw@npm:1.3.1" + dependencies: + graceful-fs: "npm:^4.1.9" + dependenciesMeta: + graceful-fs: + optional: true + checksum: 28a2b75eb5d27d88ade4a38d835071ec18b01836aad4699144e7fc327d21133968eecf4a8b723b668c527775fe020fd6891b1e72029e6b41cc8e03892b9ec42e + languageName: node + linkType: hard + +"lcid@npm:^1.0.0": + version: 1.0.0 + resolution: "lcid@npm:1.0.0" + dependencies: + invert-kv: "npm:^1.0.0" + checksum: f0af6ae0ce1f9948f2d04c88af83ba11191e4661f3a0c7e1a13b77d09fd81462a394a95a50c3205c2cc2947c1279cde2796180ab3ad3e213cd05b7aabad0086a + languageName: node + linkType: hard + +"level-codec@npm:^9.0.0": + version: 9.0.2 + resolution: "level-codec@npm:9.0.2" + dependencies: + buffer: "npm:^5.6.0" + checksum: 5761c40cecd84f1d2e560c2dab7216ad522064261f2e4af8ab4a58136808c47da2f757a628dbb1f733dc45ec8aeb2708c4786c0d1e295c465a2abd7be4f049a8 + languageName: node + linkType: hard + +"level-codec@npm:~7.0.0": + version: 7.0.1 + resolution: "level-codec@npm:7.0.1" + checksum: 9389d4c9a90f5cef7312a73c8a798e9b060e0e0eb6194d54caeccf290875f6937413072541165d7ff1922644aaff751e07cdd5af414e16248a50c58d3605006c + languageName: node + linkType: hard + +"level-errors@npm:^1.0.3": + version: 1.1.2 + resolution: "level-errors@npm:1.1.2" + dependencies: + errno: "npm:~0.1.1" + checksum: 6984b2dfb86f2c3dc8b23727f7bc6e9fc0e385ef9e7546f3fb5acb03839ced6f856e119b4e7e3d930fbafb8d6c5268fc442ef33b21f6426758fde6408f7b6564 + languageName: node + linkType: hard + +"level-errors@npm:^2.0.0, level-errors@npm:~2.0.0": + version: 2.0.1 + resolution: "level-errors@npm:2.0.1" + dependencies: + errno: "npm:~0.1.1" + checksum: 1f17ce68a6806410522984052a3ee369b0ce739d287f0fc18f3c675bf182f6a0a615590632205db772f04a017bb43439097199a2540c0c6d761c52835d4c5cff + languageName: node + linkType: hard + +"level-errors@npm:~1.0.3": + version: 1.0.5 + resolution: "level-errors@npm:1.0.5" + dependencies: + errno: "npm:~0.1.1" + checksum: 3c60e4202da5976d8f78762768dacf8e2afb715c59c5dd746ed8b6816ea2e541cf2cd03c50a3c40cd0dc8a30f8bfedbe56d7b4c79aeb251b109dd8f3c03ba148 + languageName: node + linkType: hard + +"level-iterator-stream@npm:^2.0.3": + version: 2.0.3 + resolution: "level-iterator-stream@npm:2.0.3" + dependencies: + inherits: "npm:^2.0.1" + readable-stream: "npm:^2.0.5" + xtend: "npm:^4.0.0" + checksum: 31e4039845ed9dcf7811080f280bebcae97883d42daa861f22089fef66881e12d27c6dd871c51b5b7750551fe1f794674dd49087f0cb64d7dbfbbf3a4de31b06 + languageName: node + linkType: hard + +"level-iterator-stream@npm:~1.3.0": + version: 1.3.1 + resolution: "level-iterator-stream@npm:1.3.1" + dependencies: + inherits: "npm:^2.0.1" + level-errors: "npm:^1.0.3" + readable-stream: "npm:^1.0.33" + xtend: "npm:^4.0.0" + checksum: 6ceeb99b7a26e49d627364de69cd9f87277985f9da3050f430183d3e4de60c6e4a0302d73c912245f405c150a0cf3361129d790083b3c66c39066f695aba8321 + languageName: node + linkType: hard + +"level-iterator-stream@npm:~3.0.0": + version: 3.0.1 + resolution: "level-iterator-stream@npm:3.0.1" + dependencies: + inherits: "npm:^2.0.1" + readable-stream: "npm:^2.3.6" + xtend: "npm:^4.0.0" + checksum: 742d21445ddbe6d157cb1b7d1d91aadcfd01a9b0b96e1c936e79bd2ae914a0050f85c71888eedd66d62b5769a3501045c95917410d66989adf5e01dfb686ef05 + languageName: node + linkType: hard + +"level-mem@npm:^3.0.1": + version: 3.0.1 + resolution: "level-mem@npm:3.0.1" + dependencies: + level-packager: "npm:~4.0.0" + memdown: "npm:~3.0.0" + checksum: 39c5a5ff12fef778a43db5dd3587bad490bb4ba87d86dbe6619223660aa1dde6474fc382b4b3e265e2f3cc813b7aadc811e541ea98c5c8ba35db4baa48c6a196 + languageName: node + linkType: hard + +"level-packager@npm:~4.0.0": + version: 4.0.1 + resolution: "level-packager@npm:4.0.1" + dependencies: + encoding-down: "npm:~5.0.0" + levelup: "npm:^3.0.0" + checksum: 129e57a70773f25259b1b32c00013ca7cdc7ce2376a4f127296433e58ed974c74dfba73de3ff37409753af930069b5c732aaf6676b4e5ab67a06ebbb911b4429 + languageName: node + linkType: hard + +"level-post@npm:^1.0.7": + version: 1.0.7 + resolution: "level-post@npm:1.0.7" + dependencies: + ltgt: "npm:^2.1.2" + checksum: 6afbdeec333fcfa7b91fde578d97efb9228166ecbc8f567c136d9431468a35078faeb1066adbfc92028250a76346972270da4e02ae46a0b09727a6599518840f + languageName: node + linkType: hard + +"level-sublevel@npm:6.6.4": + version: 6.6.4 + resolution: "level-sublevel@npm:6.6.4" + dependencies: + bytewise: "npm:~1.1.0" + level-codec: "npm:^9.0.0" + level-errors: "npm:^2.0.0" + level-iterator-stream: "npm:^2.0.3" + ltgt: "npm:~2.1.1" + pull-defer: "npm:^0.2.2" + pull-level: "npm:^2.0.3" + pull-stream: "npm:^3.6.8" + typewiselite: "npm:~1.0.0" + xtend: "npm:~4.0.0" + checksum: f089e20554f3f0d707f6b0e887ca9d0019f523850cc30c77ae6c9ffd96059132d56cbafcdcb9d08d238d36c1b02335c33459b4b341947d135de02f4064ca1803 + languageName: node + linkType: hard + +"level-supports@npm:^4.0.0": + version: 4.0.1 + resolution: "level-supports@npm:4.0.1" + checksum: 2fe7b725ca7296ed7fa094f0a3a5a182ec206f3598e1e5f0991920973564e0d94ba8d771cdcb67ed1b709d18e9f782167df5eccef759ba74c8307741f5875098 + languageName: node + linkType: hard + +"level-transcoder@npm:^1.0.1": + version: 1.0.1 + resolution: "level-transcoder@npm:1.0.1" + dependencies: + buffer: "npm:^6.0.3" + module-error: "npm:^1.0.1" + checksum: 93401af8fee17c1fb894e71cc9af8457dd51bd481a61ea45d4c8679a4bd185e68bb4c0d9e9165f4f983789a560af87bc5443fa900b9471dd935e0bb85354f01d + languageName: node + linkType: hard + +"level-ws@npm:0.0.0": + version: 0.0.0 + resolution: "level-ws@npm:0.0.0" + dependencies: + readable-stream: "npm:~1.0.15" + xtend: "npm:~2.1.1" + checksum: 1fefd665e3a1b8ca2dab6d11a2580ffbe95ad0f0c5dcf23bde9dbbe2b9ae523fbbd046a1f3891e83bf09e0cca867c00207773916864683943cc2e400e5333cbd + languageName: node + linkType: hard + +"level-ws@npm:^1.0.0": + version: 1.0.0 + resolution: "level-ws@npm:1.0.0" + dependencies: + inherits: "npm:^2.0.3" + readable-stream: "npm:^2.2.8" + xtend: "npm:^4.0.1" + checksum: 318bc81bd288d27a8c489533376c0197e198dd17b1e38d49d6cc1d2f9f77c38dbb5020f6eeb2a604dd9a5bb38385febff41360a7f1da13e0da41ef51ba45f8d6 + languageName: node + linkType: hard + +"level@npm:^8.0.0": + version: 8.0.0 + resolution: "level@npm:8.0.0" + dependencies: + browser-level: "npm:^1.0.1" + classic-level: "npm:^1.2.0" + checksum: 724d801b0aa609c2c01fc96eb8732c2fc55a3acf997051be55ca76a6552163312d550fac60ef72d45bd5d3bc4dd06541a933e67a711d04164c62af5a2d7aa42a + languageName: node + linkType: hard + +"levelup@npm:3.1.1, levelup@npm:^3.0.0": + version: 3.1.1 + resolution: "levelup@npm:3.1.1" + dependencies: + deferred-leveldown: "npm:~4.0.0" + level-errors: "npm:~2.0.0" + level-iterator-stream: "npm:~3.0.0" + xtend: "npm:~4.0.0" + checksum: ed42ceb560ecadff54efd9dbf909f3653f9563e36cabf5f84f21fd9afaccbe608016dd942537ed7612f08c5ce6774f9f97d91cbc19f7eecf9fcce07e2b4b104b + languageName: node + linkType: hard + +"levelup@npm:^1.2.1": + version: 1.3.9 + resolution: "levelup@npm:1.3.9" + dependencies: + deferred-leveldown: "npm:~1.2.1" + level-codec: "npm:~7.0.0" + level-errors: "npm:~1.0.3" + level-iterator-stream: "npm:~1.3.0" + prr: "npm:~1.0.1" + semver: "npm:~5.4.1" + xtend: "npm:~4.0.0" + checksum: 11663836883f11fc5513f5e018595cd30ce85d23f80bf0121eeeae05373e1c4ce91ed58de8a945af4a590a5fa58453d1d9200d9fb2e37d7baeb1bebdb1a99394 + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: "npm:^1.2.1" + type-check: "npm:~0.4.0" + checksum: b281df6770286ddce58d431441772b75ec04f03264af49532c330fdbe070795196538459754cb9e564e7759dbd79c2f88fab01bb3295b2a70249d1a777016cb4 + languageName: node + linkType: hard + +"lines-and-columns@npm:^1.1.6": + version: 1.2.4 + resolution: "lines-and-columns@npm:1.2.4" + checksum: c0807326f935ca3bbb725fe1a90d4a15e9b58939a2e75f5e85aa28e488620088b0f110bac2c384537e3c16cf64134afc67f39dd77f9249dcf7d056400d8c303b + languageName: node + linkType: hard + +"load-json-file@npm:^1.0.0": + version: 1.1.0 + resolution: "load-json-file@npm:1.1.0" + dependencies: + graceful-fs: "npm:^4.1.2" + parse-json: "npm:^2.2.0" + pify: "npm:^2.0.0" + pinkie-promise: "npm:^2.0.0" + strip-bom: "npm:^2.0.0" + checksum: df1a8bbf7b3be57c50e67dc5dc2d361d9c00a13d47be74997bacfc7a0b46d4ed704131191dcd2480587bd6df8626697f2a534b6d6a8bab3e0abb83e4f8e40ed7 + languageName: node + linkType: hard + +"locate-path@npm:^2.0.0": + version: 2.0.0 + resolution: "locate-path@npm:2.0.0" + dependencies: + p-locate: "npm:^2.0.0" + path-exists: "npm:^3.0.0" + checksum: 094f41f295fffe673b069d792ab138998ce04eba2d6a921395e03fa528ef18c683a347af5133f90f33c721aaece8442aaa53d6cd9e573975acd1dbb70773822e + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: "npm:^5.0.0" + checksum: 8a665300e1e248fe80a27db16616059dfb57d7d6cd14a9893f7b66eee097f0bdffeecdc80e8565f74b253efe6c93f46fe65f2af1513883845bcf38956d35667b + languageName: node + linkType: hard + +"lodash.assign@npm:^4.0.3, lodash.assign@npm:^4.0.6": + version: 4.2.0 + resolution: "lodash.assign@npm:4.2.0" + checksum: dfb341ad4b56382aa0def0767b009ef0a5f4f5213fd6a20a58734ca3cef2bd80d5c36c5c3d3f52a9a245b139834bfc9a8fd3611a40029bd98960dd376bfcac21 + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: aab58997bcad5ab91908498bbe8ce4b78e8e5025a944f9a8b6a1f11bd2afba4dae55c61dfdcefadadd6cd04efb0c998109e14c633f4aa1f8b4541e4d252c69ea + languageName: node + linkType: hard + +"lodash.range@npm:^3.2.0": + version: 3.2.0 + resolution: "lodash.range@npm:3.2.0" + checksum: 14c02b0f07fbc9d6e1133699021699741ef7f6d0e34fd375d1973a29d4c43f620c54fa28e36ed752b1599112ecef2bdc1b24ba28b6051a7eccea24532baef359 + languageName: node + linkType: hard + +"lodash.truncate@npm:^4.4.2": + version: 4.4.2 + resolution: "lodash.truncate@npm:4.4.2" + checksum: 9d8b0674297831b56b8e78c9143ded43f360de09310d591713555d76cf26739c9d1df65b7f8c5362c028415f0ebe871e549b289ce9809a764763056278abfdbc + languageName: node + linkType: hard + +"lodash@npm:4.17.20": + version: 4.17.20 + resolution: "lodash@npm:4.17.20" + checksum: 0b00969ccc07bd406072e994a9fa167c2caa84449300e20021f50db047bd70e309a34d2db9ed67c729d8a255c4bf2f4c5f092503f49d145ea7c75843696bb36e + languageName: node + linkType: hard + +"lodash@npm:^4.17.11, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.21, lodash@npm:^4.17.4": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: 3ac18e92108d68f88429fcddee609e42cf2b653583d9bac22308815a4cd6b185b89a0ad0d9b0c670c371d9d6b61571a98fee6b36e1db14e52766ca253ed9cba0 + languageName: node + linkType: hard + +"log-symbols@npm:4.1.0": + version: 4.1.0 + resolution: "log-symbols@npm:4.1.0" + dependencies: + chalk: "npm:^4.1.0" + is-unicode-supported: "npm:^0.1.0" + checksum: 07e344c4cc89ae0184979f26cca88cfd258dd1f05a8737e3942674af7d3d77e6a367c091398d46593d9144ea7673342afd1132b3b901ce6dc78fd1eeb00ea01c + languageName: node + linkType: hard + +"looper@npm:^2.0.0": + version: 2.0.0 + resolution: "looper@npm:2.0.0" + checksum: 3e41f196d19aaa55e3973818e8ba12e21886da9a386430716f5aeac527ae342ceb3465e2eee17bfe894cb957a8c5cda51ec7e5a0633406e25ff1e26c6fccb533 + languageName: node + linkType: hard + +"looper@npm:^3.0.0": + version: 3.0.0 + resolution: "looper@npm:3.0.0" + checksum: a3d372bc2ca74cdb12d8efe051cf4a8cdc38758c6edcebc3b9e4dfb1e806dc33d603ed8eeea923441118cd9b2a2104b45fcdf6e016846ce14f5351c917ec99e9 + languageName: node + linkType: hard + +"loose-envify@npm:^1.0.0": + version: 1.4.0 + resolution: "loose-envify@npm:1.4.0" + dependencies: + js-tokens: "npm:^3.0.0 || ^4.0.0" + bin: + loose-envify: cli.js + checksum: 39c5fc44c6a8f7f8a92cccf174554fbb307477ef493760407920fdd4ed5f6cc1aec5b6a5ab3c3767ef79547b3e1aea09d8ca08d773232c662d910cfe473a0590 + languageName: node + linkType: hard + +"loupe@npm:^2.3.1": + version: 2.3.6 + resolution: "loupe@npm:2.3.6" + dependencies: + get-func-name: "npm:^2.0.0" + checksum: 5a74e2ed6e6578fc03d5a9a119382e74ad1c442445c7ffa27e88b51b4637ede09eb5b216a6a771781f3201c8e4fcd64dd55392c69bbd35f1d0b6b1f1f7501863 + languageName: node + linkType: hard + +"lowercase-keys@npm:^1.0.0, lowercase-keys@npm:^1.0.1": + version: 1.0.1 + resolution: "lowercase-keys@npm:1.0.1" + checksum: 10981eeb3dbf143c09206bff4a4e92524437872840375a69c319b4a450390d6622cc7d5af3ef61e2e0ce229361514da2084cdf19c63ad24d2ab576e1c9d3c34f + languageName: node + linkType: hard + +"lowercase-keys@npm:^2.0.0": + version: 2.0.0 + resolution: "lowercase-keys@npm:2.0.0" + checksum: c305ecdea6e53ab142b74095be2a19174a6265345b043e28e88cfef1845a9a143888898c643707d7ca733bf89ce12577732bdb402106dc34d8dd2b294519726e + languageName: node + linkType: hard + +"lru-cache@npm:5.1.1, lru-cache@npm:^5.1.1": + version: 5.1.1 + resolution: "lru-cache@npm:5.1.1" + dependencies: + yallist: "npm:^3.0.2" + checksum: 7e3274d0936ac64611d0053664b5c722f2b869c4962a007752251602020345f385885cfeabd0162aa45c7d2ee8a21f461d9d628db348f553c126126b170ad6d2 + languageName: node + linkType: hard + +"lru-cache@npm:^3.2.0": + version: 3.2.0 + resolution: "lru-cache@npm:3.2.0" + dependencies: + pseudomap: "npm:^1.0.1" + checksum: 10217060ae4d4f4b4e197cd9a8a4623e4571a30f2c6f4bdbe7f4a44e5b6208665267ba252847e413a84d461f4b5963b479e721e80d5a5795b779cae80df957d5 + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: "npm:^4.0.0" + checksum: b2d72088dd27df27189607554990b0fd31d3fbd4037df909ef66f48a14122baf8ffce7f33edc17e6543ea7cd71fa561136518355dde2ad57676fa0b2ea53b85f + languageName: node + linkType: hard + +"lru-cache@npm:^7.7.1": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: 884c7cb51963cc45bc0d864c704d141c904c93db1bbc236be0eed759e35fc44b5e794a34b0666e193926e5a4320b66e787b1cf531f4f89ed8514a97156f07cb1 + languageName: node + linkType: hard + +"lru_map@npm:^0.3.3": + version: 0.3.3 + resolution: "lru_map@npm:0.3.3" + checksum: 356e840fb3fa884e0150272698f7647ee05fcb82641af4e1f5b6ef3e698e4ac999e03f8b8c4dded2be7a3dd164eb504d3cdbab523c90322e1770c190b40099a1 + languageName: node + linkType: hard + +"ltgt@npm:^2.1.2, ltgt@npm:~2.2.0": + version: 2.2.1 + resolution: "ltgt@npm:2.2.1" + checksum: 41e54f75bf60412885215dc702970144d534f531456ee303acfa12cf5f0dd76dd97345d73490929a5c926454cc98e076da988b4a84e88cd3b0236a85b2d8c339 + languageName: node + linkType: hard + +"ltgt@npm:~2.1.1": + version: 2.1.3 + resolution: "ltgt@npm:2.1.3" + checksum: 8acc98e68f5dc730c16eacd23d8717a832cdd29de10823d37cc6f8cbf9d7c47f7f20fba7173e4c338b021ff117c6a8ff0ad10159498de69988a087a6c536eb06 + languageName: node + linkType: hard + +"make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: 4b81ce1392495d554ce5fd28c8de95066642e5e1a5efd395e3b3413bc75068a025d8a567aefb0738ba6da18e73323ffde17794780f632fe4395e009aa9ebcc8a + languageName: node + linkType: hard + +"make-fetch-happen@npm:^10.0.3": + version: 10.2.1 + resolution: "make-fetch-happen@npm:10.2.1" + dependencies: + agentkeepalive: "npm:^4.2.1" + cacache: "npm:^16.1.0" + http-cache-semantics: "npm:^4.1.0" + http-proxy-agent: "npm:^5.0.0" + https-proxy-agent: "npm:^5.0.0" + is-lambda: "npm:^1.0.1" + lru-cache: "npm:^7.7.1" + minipass: "npm:^3.1.6" + minipass-collect: "npm:^1.0.2" + minipass-fetch: "npm:^2.0.3" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^0.6.3" + promise-retry: "npm:^2.0.1" + socks-proxy-agent: "npm:^7.0.0" + ssri: "npm:^9.0.0" + checksum: cf0d4b94fb0b022d41373fe7ce0f2a170a7c2668c7404f985c4fa6fe465c24cc3d1a6a84e0a6d4b2cd60cf7d41ec26cc5205d258e15f06c33179c14a31a5e4bd + languageName: node + linkType: hard + +"map-cache@npm:^0.2.2": + version: 0.2.2 + resolution: "map-cache@npm:0.2.2" + checksum: b2ab6a18f1157adb0ab9a8a2990c875d7104f8f1a90f306d386700f253ae81df69efde42fdc42687c482148a60fc20e5f647361b33f52dd51c2cafa695c60fdd + languageName: node + linkType: hard + +"map-visit@npm:^1.0.0": + version: 1.0.0 + resolution: "map-visit@npm:1.0.0" + dependencies: + object-visit: "npm:^1.0.0" + checksum: f32be05b8e221dbdd2d629b89b55b4ca37449ff46c760c5605d2fcfa757743ea3ed3a146f9ee88225f468ef607eac9e8eb1585b422be6a37444f33473e9d168f + languageName: node + linkType: hard + +"mcl-wasm@npm:^0.7.1": + version: 0.7.9 + resolution: "mcl-wasm@npm:0.7.9" + checksum: d4e510e68f826032db359abacf8a87d50e601188ccd6cb2fc82f339c8a2f0b37c69c030e58a8668a1b3002776dd662fef559f912777dfa861c0821c9d265bfa3 + languageName: node + linkType: hard + +"md5.js@npm:^1.3.4": + version: 1.3.5 + resolution: "md5.js@npm:1.3.5" + dependencies: + hash-base: "npm:^3.0.0" + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.1.2" + checksum: 8ef352bbd030e0c1332da88131232adedf908e9fa5b3de383acc8e6e56f92e98fdb53e2903497e0c89e501a5b3838db0fb29ac1f54b389155b394e7feb06dace + languageName: node + linkType: hard + +"media-typer@npm:0.3.0": + version: 0.3.0 + resolution: "media-typer@npm:0.3.0" + checksum: 21806e15268f71b2bbf35a57b5eb9a42e14be638b8b855e210fb90282744e622f9d232f34f1cf566dc487819ce66bbb8aa6568e3267f48b12e92e2ba679838ae + languageName: node + linkType: hard + +"memdown@npm:^1.0.0": + version: 1.4.1 + resolution: "memdown@npm:1.4.1" + dependencies: + abstract-leveldown: "npm:~2.7.1" + functional-red-black-tree: "npm:^1.0.1" + immediate: "npm:^3.2.3" + inherits: "npm:~2.0.1" + ltgt: "npm:~2.2.0" + safe-buffer: "npm:~5.1.1" + checksum: 8f700f4b502203c3ae61662eac5f4c4a54b963ce71ffbf167d591e99601c7454db5477059212b659d63383224332e003404d49fe0e19212b6aeff72309b1cf3f + languageName: node + linkType: hard + +"memdown@npm:~3.0.0": + version: 3.0.0 + resolution: "memdown@npm:3.0.0" + dependencies: + abstract-leveldown: "npm:~5.0.0" + functional-red-black-tree: "npm:~1.0.1" + immediate: "npm:~3.2.3" + inherits: "npm:~2.0.1" + ltgt: "npm:~2.2.0" + safe-buffer: "npm:~5.1.1" + checksum: ce48a06ed1e05a78dc38a2ffb0ae53bf872c0985ce1660ead07351dcd1485099400ac871a040469dda6fa129c5e72a8a1da5b80d0b89ec3a785abc9216d7f20a + languageName: node + linkType: hard + +"memory-level@npm:^1.0.0": + version: 1.0.0 + resolution: "memory-level@npm:1.0.0" + dependencies: + abstract-level: "npm:^1.0.0" + functional-red-black-tree: "npm:^1.0.1" + module-error: "npm:^1.0.1" + checksum: 1798fa0b4ae6136819fa77131937a6cc2c3d09e9bdbab6db859c583760e137d32ddc7089af244829b691a197c57f9ee05aa10dfa98f2b26affd2018992b3b635 + languageName: node + linkType: hard + +"memorystream@npm:^0.3.1": + version: 0.3.1 + resolution: "memorystream@npm:0.3.1" + checksum: 0fb0b4e73f99d61cd616e27d386b0781c13031e69464ef4b8f55e43e87f3ac0b91b99be4dae314ad9af742541afd16f0e8585384c8a7b19037e76563d537f33e + languageName: node + linkType: hard + +"merge-descriptors@npm:1.0.1": + version: 1.0.1 + resolution: "merge-descriptors@npm:1.0.1" + checksum: 6c8d19415ddd30b17ebd8e4474897549915cb90bb1caa13bbc55cce27a72d377c289abd300a3e8c6c1a6d61c4ea1fbe297addf032a9d75cb8de2788bc8b9cb2c + languageName: node + linkType: hard + +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: d58d7c31e24ccb93509def2af306eca9a55ad8b8862a26ea7deda3c9338e5d33365f57197ad37af68c319e5e2a1faf089e5d05894d0dc29ff07025b30b8ff8b0 + languageName: node + linkType: hard + +"merkle-patricia-tree@npm:3.0.0": + version: 3.0.0 + resolution: "merkle-patricia-tree@npm:3.0.0" + dependencies: + async: "npm:^2.6.1" + ethereumjs-util: "npm:^5.2.0" + level-mem: "npm:^3.0.1" + level-ws: "npm:^1.0.0" + readable-stream: "npm:^3.0.6" + rlp: "npm:^2.0.0" + semaphore: "npm:>=1.0.1" + checksum: d847a34e922ea8a4a4b4d523076985bb4c020262666146f8fb0db1bb021e94f1d282c852b7f177af4ce8f35a90a0f085171a75a6d69cf6f2a2afcddf160f80fd + languageName: node + linkType: hard + +"merkle-patricia-tree@npm:^2.1.2, merkle-patricia-tree@npm:^2.3.2": + version: 2.3.2 + resolution: "merkle-patricia-tree@npm:2.3.2" + dependencies: + async: "npm:^1.4.2" + ethereumjs-util: "npm:^5.0.0" + level-ws: "npm:0.0.0" + levelup: "npm:^1.2.1" + memdown: "npm:^1.0.0" + readable-stream: "npm:^2.0.0" + rlp: "npm:^2.0.0" + semaphore: "npm:>=1.0.1" + checksum: 734b7b6678bc772d6d552278510a05c8acfa02eef7ce4d985e61b1264d38f88e2f792b4dc24f213362ca4d424ccd267e63f033274056f8733940ba2711308fc6 + languageName: node + linkType: hard + +"methods@npm:~1.1.2": + version: 1.1.2 + resolution: "methods@npm:1.1.2" + checksum: 4641d1eda8231aee6774d28a32249f1d4f04e2a58a86c4a968eed39d178d64594ed829301eb603356decc9bd423eacd68d6bde7874a291475800a1568e547d4e + languageName: node + linkType: hard + +"micromatch@npm:^3.1.4": + version: 3.1.10 + resolution: "micromatch@npm:3.1.10" + dependencies: + arr-diff: "npm:^4.0.0" + array-unique: "npm:^0.3.2" + braces: "npm:^2.3.1" + define-property: "npm:^2.0.2" + extend-shallow: "npm:^3.0.2" + extglob: "npm:^2.0.4" + fragment-cache: "npm:^0.2.1" + kind-of: "npm:^6.0.2" + nanomatch: "npm:^1.2.9" + object.pick: "npm:^1.3.0" + regex-not: "npm:^1.0.0" + snapdragon: "npm:^0.8.1" + to-regex: "npm:^3.0.2" + checksum: 18d92d9dfe9e199611786495eae2c99a9234581ca23b143b6dc5a76c0b83ba57719e8388c2c2f074b8b9893b61cdf51f26f077da19ccdca764767204d6b02bc7 + languageName: node + linkType: hard + +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4": + version: 4.0.5 + resolution: "micromatch@npm:4.0.5" + dependencies: + braces: "npm:^3.0.2" + picomatch: "npm:^2.3.1" + checksum: 260305ba8cb1f073a39bbaa31edc93f7587399a094417541dc771402f83c78819ed76743c810c9fcf1c449f09bfb4de263dad8507d532e4e86063a87158a2ad6 + languageName: node + linkType: hard + +"miller-rabin@npm:^4.0.0": + version: 4.0.1 + resolution: "miller-rabin@npm:4.0.1" + dependencies: + bn.js: "npm:^4.0.0" + brorand: "npm:^1.0.1" + bin: + miller-rabin: bin/miller-rabin + checksum: 7a96be873d88380a65170df45121a8da0e96f6a757793a5973cc5161000cdaae1485b06b68375d79a3334c11f985d0734bb8554003fea739371ce2433abba34a + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 95baf687a3f14ff2cc433e30dea5c4931c7f4b67059d44a0098cfb833858cad63ec13c20f98762bddd088c4e9dac6d95862db1ea9d3fe3fa68f57b69a325000d + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.16, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 51e3b38d1b1b83da082f7c29042bcb22036101346394696b7643ef5da27ebf6bf71643bd45225ee75e4ea2836213780efc8c3dcd2055c84b49eb0afc061419d0 + languageName: node + linkType: hard + +"mime@npm:1.6.0": + version: 1.6.0 + resolution: "mime@npm:1.6.0" + bin: + mime: cli.js + checksum: d54c5e4de47046306425767290edaaefc6964fec09960c7df4a1f429f672b6651a13b01724180c698a0f5f0af556a81494d0380404a23da29460716f8454d6e0 + languageName: node + linkType: hard + +"mimic-response@npm:^1.0.0, mimic-response@npm:^1.0.1": + version: 1.0.1 + resolution: "mimic-response@npm:1.0.1" + checksum: 33f59926ca219581d72d6138f731c0ab09459c83dc01cce629b045cf0f0fc86d2080c0d776f2112dab7c4ef585c1104a3df0b2b8ed31fc6f4d261656f3543d4e + languageName: node + linkType: hard + +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 1d485ca418ab93d27d5a90b0ad701eee79fdf6a7dfd0342f7c83e1f2b421703eadadf9d1c968bff4749dcb42bb2148dc4b6bce795b7b357b46d47731353b7077 + languageName: node + linkType: hard + +"min-document@npm:^2.19.0": + version: 2.19.0 + resolution: "min-document@npm:2.19.0" + dependencies: + dom-walk: "npm:^0.1.0" + checksum: f4c8fad5f2f11b7b1ed1c8c4c68421d67280b8e3d2fc6799e8f52ada5980e2723c9b55453e9d0610a83a938814f01a5dfa6e4455dccbb53df9f28db90750228d + languageName: node + linkType: hard + +"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-assert@npm:1.0.1" + checksum: e2310081d82a7f8a6ee7f338d167c82b3eb5378929b9eda3a9eb633cf0f0f19c029b69e6868264447d4f726644b52fdc4dda3bc985793a1aeba9b02b13ca3f8e + languageName: node + linkType: hard + +"minimalistic-crypto-utils@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-crypto-utils@npm:1.0.1" + checksum: 7d909decd241bd658f941981ce53db4061c834daba807a5082d08fd2a0c488b8ef67904c90af38b70445e0220951a533ae3a181be5724ad342df4d9454286476 + languageName: node + linkType: hard + +"minimatch@npm:5.0.1": + version: 5.0.1 + resolution: "minimatch@npm:5.0.1" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 1c768f6bf115a214eec61cfa4bed358568fa97747f876e5c2fb291880022f8defd3cbdfb5b73dbebad518b4bd88419b3f82f9f680fa3aa814c1aa632ddc55cc0 + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 97f5615ee8f7c0019277dadef7b2b81e5c60d369cb3155cbfb9da72688aef2edb652b105353ff08a6575ae95a6189d1c09a0829b9c254f60849148457c4d8a66 + languageName: node + linkType: hard + +"minimatch@npm:^5.0.1, minimatch@npm:^5.1.0": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 0c0446ede579b1736bfea4efb288c2dea17ce80fd0339d00547625ed97a60ed403c7c2fb141211119937a811bc635b3f0f44debeb9d7870b3f58cf0fe78ddccc + languageName: node + linkType: hard + +"minimist@npm:^1.2.0, minimist@npm:^1.2.6, minimist@npm:~1.2.7": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 8598f846f2b7546b22b01ce486df27da216a302367afe17f2a032da12fcb8d33bfbf2c523051230864abf0b806748bd60d4cd0863fae35fe104da1ff6194a185 + languageName: node + linkType: hard + +"minipass-collect@npm:^1.0.2": + version: 1.0.2 + resolution: "minipass-collect@npm:1.0.2" + dependencies: + minipass: "npm:^3.0.0" + checksum: 4d608e8a292ec87dd1a7d881c314effe341a7d7f52eb416270a243f8ea7f4e23b40b2785f5ce9c6c7841e1453841019efd5db05b427288b897c96f62afbc1f17 + languageName: node + linkType: hard + +"minipass-fetch@npm:^2.0.3": + version: 2.1.2 + resolution: "minipass-fetch@npm:2.1.2" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^3.1.6" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^2.1.2" + dependenciesMeta: + encoding: + optional: true + checksum: 8ec17c0895d8890b863bbdf860e25bc2f81580c0bbc2cfc05d220f8b5bc255203ee1931f54821e299fd1d5a53d63bfaca20a813a2f45e881423d096c24940366 + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 6e851bd0640e5406633b0aa77e889d4175eb3d12b55173e999e6dd1fc06ed13982277e012d6f41dc28a2167278d9480697893f6cd286c46c10fdfd735e05d45d + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: 07dd09bf3c6f546ef407e7a36bca4cd2235d54695c083dc5815052e36cbdd46e55a7c0dae2801983c73257adc7aa613e375c8350587bc50a6a10e1a6b55f9965 + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: "npm:^3.0.0" + checksum: 54591ac7e54571e91df602e3c1018f4048ee12a3407dfab8140e0b03cb149c16ae67e94d36682c0869a683b8443470e354dba123ea83914c87ff22d8d8628fea + languageName: node + linkType: hard + +"minipass@npm:^2.6.0, minipass@npm:^2.9.0": + version: 2.9.0 + resolution: "minipass@npm:2.9.0" + dependencies: + safe-buffer: "npm:^5.1.2" + yallist: "npm:^3.0.0" + checksum: 79b9cc2259608b0474eea420eb6bd32cd5fec44424cb0289e95eb34bff82ff704375b5ee7d3e5c75388ef456b7fe5e4b08ffa66dc4832dd932c89309e19a7868 + languageName: node + linkType: hard + +"minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: 9704cf677a05e82174c1a0765260f877ce3b4f09858b6c80a07a38a41ff661a2913a482f82faa73b89fc23ee3bcc4cff04d7e8ce6951de4fc2c2108d360b6f1f + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: dac2e1960990ca7c288834e7311e029828d9ae4c90fdabae95a3ea269592871feaa755a1ef9241d487e6fe59d86a43e1d8bac41c47f13c3c0add0799ab500a0b + languageName: node + linkType: hard + +"minizlib@npm:^1.3.3": + version: 1.3.3 + resolution: "minizlib@npm:1.3.3" + dependencies: + minipass: "npm:^2.9.0" + checksum: aaa1d887fd71b625e47ead02cf0e7c44f4f6a48c0ecd8dae2c34a3e288b566c905f85c108ca21724de8b7798fc97cd7a5666ef199b85ef0bab9e461cf2f9fea2 + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: "npm:^3.0.0" + yallist: "npm:^4.0.0" + checksum: c0071edb242d6808652840614193316e82d012b79ff1997352de3df1c19b7580d3d4790c462c8506b1f4225f08162ebba88ebceb1529d168304b06b23757e88d + languageName: node + linkType: hard + +"mixin-deep@npm:^1.2.0": + version: 1.3.2 + resolution: "mixin-deep@npm:1.3.2" + dependencies: + for-in: "npm:^1.0.2" + is-extendable: "npm:^1.0.1" + checksum: 22273c9e1f5d6928d9eb2d2fd4408638a9d8efd3dabb57a3b486b3d21861017eb0ff2b7e9cd4f6351f2ccca7a89a4e7ca1b9059bd714b053236fa8e07b18c844 + languageName: node + linkType: hard + +"mkdirp-promise@npm:^5.0.1": + version: 5.0.1 + resolution: "mkdirp-promise@npm:5.0.1" + dependencies: + mkdirp: "npm:*" + checksum: 5984df0b5082ac1ee1760d7ab1a09079725dcce54cc5c219215cd29b5ad23c00af77a2730c7e89dd66bd46eaa89cebb4fded40ff7f6a68b0652cacadb401bcf0 + languageName: node + linkType: hard + +"mkdirp@npm:*": + version: 3.0.1 + resolution: "mkdirp@npm:3.0.1" + bin: + mkdirp: dist/cjs/src/bin.js + checksum: ba81909e0854741a469d8b9bf0a5ecea1d5dc07c16eed57bb82346e41310752f63a688699b117fb4110324b7d0700ca855103e36e1ce83e65f0c4c5fe5310b6e + languageName: node + linkType: hard + +"mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.5": + version: 0.5.6 + resolution: "mkdirp@npm:0.5.6" + dependencies: + minimist: "npm:^1.2.6" + bin: + mkdirp: bin/cmd.js + checksum: 8d9642f5caa481eaf1ec556a101c6a5b1528fa20067afd92115d053dc17043efc52c9b77ade0c0115bca4ebb74169e84cacc7f6004db3d1bd4171e131d512cc5 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: 123361119829ab8115234f36ed8ef8f697b0f6f83ec9f9bc8f76da587487976d74bc874ffa892e7a66df607fa8f2cc758eed8db225e9cd3a84846350209e53db + languageName: node + linkType: hard + +"mnemonist@npm:^0.38.0": + version: 0.38.5 + resolution: "mnemonist@npm:0.38.5" + dependencies: + obliterator: "npm:^2.0.0" + checksum: c16582ad5633fbaafe7b9277883772afd714a8d39401c3a08427c2a8633ca5e81665e57bd450614d452a6a290b2e3b700a2641089dec131eb38abd1607355844 + languageName: node + linkType: hard + +"mocha@npm:^10.0.0, mocha@npm:^10.2.0": + version: 10.2.0 + resolution: "mocha@npm:10.2.0" + dependencies: + ansi-colors: "npm:4.1.1" + browser-stdout: "npm:1.3.1" + chokidar: "npm:3.5.3" + debug: "npm:4.3.4" + diff: "npm:5.0.0" + escape-string-regexp: "npm:4.0.0" + find-up: "npm:5.0.0" + glob: "npm:7.2.0" + he: "npm:1.2.0" + js-yaml: "npm:4.1.0" + log-symbols: "npm:4.1.0" + minimatch: "npm:5.0.1" + ms: "npm:2.1.3" + nanoid: "npm:3.3.3" + serialize-javascript: "npm:6.0.0" + strip-json-comments: "npm:3.1.1" + supports-color: "npm:8.1.1" + workerpool: "npm:6.2.1" + yargs: "npm:16.2.0" + yargs-parser: "npm:20.2.4" + yargs-unparser: "npm:2.0.0" + bin: + _mocha: bin/_mocha + mocha: bin/mocha.js + checksum: cb854c0d7c47dc9c17fc92d03d21a86be7dc680e52deb8932df047b4420efe1d4b0b8f2db5127490016c987116c43f728610a679abdcb50f0a5c3cc46b704c87 + languageName: node + linkType: hard + +"mock-fs@npm:^4.1.0": + version: 4.14.0 + resolution: "mock-fs@npm:4.14.0" + checksum: 680204a37891598ad7ff2a168a4224bddd647fcafe368394f887688264c61795906f71d5666c7020aaa6e1fcee831eca9ffbcfd8e38113ab305bb2221dfb162f + languageName: node + linkType: hard + +"module-error@npm:^1.0.1, module-error@npm:^1.0.2": + version: 1.0.2 + resolution: "module-error@npm:1.0.2" + checksum: 08fbe2a27648b465c87ea6ecf3db7f5de62bd994077d3bd5fde167117be0fdbe3c9126008c9943d63796462b139862a8a6cb792b5c1c575bc2811f5eddde0316 + languageName: node + linkType: hard + +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: de027828fc294bd9673f72caecf73f50eac7baf28a0dec371de03600a0aa5a891b0cb7f84a45071eac306c9dd260aed8e2174695cf3a99eaa37f663871241da9 + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 3f46af60a08158f1c77746c06c2f6c7aba7feddafd41335f9baa2d7e0741d7539774aa7d5d1661a7f2b7eed55a7063771297eea016051924dbb04d4c2bf40bcb + languageName: node + linkType: hard + +"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 78c12f6b473a022ebacc393fc14b76fe40b8feda7218124b86c4684e440e10377a063bec1d3902df1f74714f02b74b36ad7d3a6de9e2fbffa26fc29e5ce018fc + languageName: node + linkType: hard + +"multibase@npm:^0.7.0": + version: 0.7.0 + resolution: "multibase@npm:0.7.0" + dependencies: + base-x: "npm:^3.0.8" + buffer: "npm:^5.5.0" + checksum: 85d724a0c4e7452e615db4f526901e935caeea6f8877fa9a7d2c93a0a08b24b832774a005083b63203661f8a305ca8bcda482f361eeff81e2ce5e18a44aa87a5 + languageName: node + linkType: hard + +"multibase@npm:~0.6.0": + version: 0.6.1 + resolution: "multibase@npm:0.6.1" + dependencies: + base-x: "npm:^3.0.8" + buffer: "npm:^5.5.0" + checksum: 3447c090a2951cf7f13ac0dfc10ce597561c61a33b6750e9bb65b572dbe56306d84ada33443eeb3a8afae4c5d84549d31ceb04d15e466b127bd13b37af66c747 + languageName: node + linkType: hard + +"multicodec@npm:^0.5.5": + version: 0.5.7 + resolution: "multicodec@npm:0.5.7" + dependencies: + varint: "npm:^5.0.0" + checksum: 3cc3084f5dda79045079a28e5534b71145ff4df924d04bd3b1e90cceb5f84781fb89cb4c56d803748cfe99dbddeb475fd9b857d6a4763144dc504e063851b1ea + languageName: node + linkType: hard + +"multicodec@npm:^1.0.0": + version: 1.0.4 + resolution: "multicodec@npm:1.0.4" + dependencies: + buffer: "npm:^5.6.0" + varint: "npm:^5.0.0" + checksum: 9eb373828a97ce2da79329c137baf4fedb010096c9b57927e91f122ae108c8ab081156e64d5d962a25d2621008d96e390e319d5587a25db64467a6f99302e0a0 + languageName: node + linkType: hard + +"multihashes@npm:^0.4.15, multihashes@npm:~0.4.15": + version: 0.4.21 + resolution: "multihashes@npm:0.4.21" + dependencies: + buffer: "npm:^5.5.0" + multibase: "npm:^0.7.0" + varint: "npm:^5.0.0" + checksum: aeb3681037f7d5a16955cc58306839889e7d182b391083460f5c087e218414df95ac5aa2631b085de687b07586d7e69166f0723dc19775a7caab8258d388f661 + languageName: node + linkType: hard + +"nano-json-stream-parser@npm:^0.1.2": + version: 0.1.2 + resolution: "nano-json-stream-parser@npm:0.1.2" + checksum: 8a1704033b1cfb2214c507c5f259b433d5c26688c00109ef2530068b2cc20a250af85be0357b8fa138d5b0b1f51af24fd7223a133d8fbbc0f6cd231a953456a7 + languageName: node + linkType: hard + +"nanoid@npm:3.3.3": + version: 3.3.3 + resolution: "nanoid@npm:3.3.3" + bin: + nanoid: bin/nanoid.cjs + checksum: c87b8384f305756695669e409ec54d5f2f2862f5cb5b138c8f539bbae102619a8e523cb074a24e6b501924d375fc80f860a5ce8fa566e3e5cee08f1f2d98bf30 + languageName: node + linkType: hard + +"nanomatch@npm:^1.2.9": + version: 1.2.13 + resolution: "nanomatch@npm:1.2.13" + dependencies: + arr-diff: "npm:^4.0.0" + array-unique: "npm:^0.3.2" + define-property: "npm:^2.0.2" + extend-shallow: "npm:^3.0.2" + fragment-cache: "npm:^0.2.1" + is-windows: "npm:^1.0.2" + kind-of: "npm:^6.0.2" + object.pick: "npm:^1.3.0" + regex-not: "npm:^1.0.0" + snapdragon: "npm:^0.8.1" + to-regex: "npm:^3.0.1" + checksum: 79de81312ba5ecf18c35f64a7c22c829d4079c7be275e2e047a6f8372a5d40b95b85eae4e14129d319dba99ae8ab4aedb7308e22bdf3ab521b25154233bd6253 + languageName: node + linkType: hard + +"napi-macros@npm:^2.2.2": + version: 2.2.2 + resolution: "napi-macros@npm:2.2.2" + checksum: f5866f21861e95729f9427ef9225b400746f8be3a00a9944a6c5ffc3d0a2eb39a2ce2d1ba1aae7afdc69bc23585ea65ff643025a4f42f7e24fa5613c371220bd + languageName: node + linkType: hard + +"natural-compare-lite@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare-lite@npm:1.4.0" + checksum: e5544056864e990c8fb4fe8ca91d01f8977586969d89adccd2ccea71fea468471b953088021fc90031800410a5042576594dc4005bf02db1794ee4ff0befc07c + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: cf6f4ccd700fbeaae533f0821e4de8582e340f9b0324f1e6d2486484e44a64f95acf7c7e5ef274f963934d5b74c3716c8ae58e367e112effae95d8d021158bff + languageName: node + linkType: hard + +"negotiator@npm:0.6.3, negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: d8e3b42d99638b1f363ce114c98e6906ade395c230058e50644417bd398b01381133dbca4bc49f30f6b1c93254e4b5a2d50cc47adcdabf2a8476b6f16311ad5d + languageName: node + linkType: hard + +"next-tick@npm:^1.1.0": + version: 1.1.0 + resolution: "next-tick@npm:1.1.0" + checksum: 0b44d1797b96711313e6262b70bd3b5f65344544cf157af056946d31d441fa680ecfc4095506b49c99c981dc4a4a7d7ff76ba30881ac29facbb6a1c75edb74c1 + languageName: node + linkType: hard + +"nice-try@npm:^1.0.4": + version: 1.0.5 + resolution: "nice-try@npm:1.0.5" + checksum: 3d457c146c54f2901d4159f5ec97c97d9d5befaeed2c8445ec02e677bdb2833d581b5a9e4c029318cb7f70bfcb52f039394aa7fb616a9a1fbe247d8a4ecbf5b6 + languageName: node + linkType: hard + +"node-addon-api@npm:^2.0.0": + version: 2.0.2 + resolution: "node-addon-api@npm:2.0.2" + dependencies: + node-gyp: "npm:latest" + checksum: cfd20b5ccbf7c459984b60b53b4aa0c1185b8deb08d9aa8fe951c2a02136ece6d87d4854fb4e6b43cd6a52a25d06ac87b4c09409e0cb2e897f2cc50cffdb2bbc + languageName: node + linkType: hard + +"node-fetch@npm:2.6.7": + version: 2.6.7 + resolution: "node-fetch@npm:2.6.7" + dependencies: + whatwg-url: "npm:^5.0.0" + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 05c03fe66f38b9e349e691caf121b693a91adb41ab59c3af17d2c5f9d2f8d927c30b428e7c8049b739c674db06171117ba9d10dc72d6a2cf35ba8901dfb4de83 + languageName: node + linkType: hard + +"node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.7": + version: 2.6.11 + resolution: "node-fetch@npm:2.6.11" + dependencies: + whatwg-url: "npm:^5.0.0" + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 3e7af7c0025f4bebd8f14efd0248344a5f0155253762810bf1be70e9e8d669e3ee74794754ca1a53e7d9ad8f4906d774e2b4e9e5209e2fd5d515e5c7299b3280 + languageName: node + linkType: hard + +"node-fetch@npm:~1.7.1": + version: 1.7.3 + resolution: "node-fetch@npm:1.7.3" + dependencies: + encoding: "npm:^0.1.11" + is-stream: "npm:^1.0.1" + checksum: 9933c0b89424e6d0a4897401fdff1b65b7efc1d60ed6e60a75b4951a5db6785841a8e295578787d0b21eb1692f4d37163d22c96963e91f518da813b0f46b36b7 + languageName: node + linkType: hard + +"node-gyp-build@npm:^4.2.0, node-gyp-build@npm:^4.3.0": + version: 4.6.0 + resolution: "node-gyp-build@npm:4.6.0" + bin: + node-gyp-build: bin.js + node-gyp-build-optional: optional.js + node-gyp-build-test: build-test.js + checksum: 59a4823fb894eda6adff30805cad6883530b4499381252882e5dfff1f6cd7cc835aa0db3ab8c281f3092d9cec0d056bce2b85ec875c274f8068f8ed97763231f + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 9.3.1 + resolution: "node-gyp@npm:9.3.1" + dependencies: + env-paths: "npm:^2.2.0" + glob: "npm:^7.1.4" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^10.0.3" + nopt: "npm:^6.0.0" + npmlog: "npm:^6.0.0" + rimraf: "npm:^3.0.2" + semver: "npm:^7.3.5" + tar: "npm:^6.1.2" + which: "npm:^2.0.2" + bin: + node-gyp: bin/node-gyp.js + checksum: 40aca5b9b3cc5715d5407101d69826927db9a2cf140f113ac52e239a10b15fbae277844ff815c05bcaa9c9fc5256e4e23b3ce3bdace573429d929e3b5df99845 + languageName: node + linkType: hard + +"node-interval-tree@npm:^2.0.1": + version: 2.1.2 + resolution: "node-interval-tree@npm:2.1.2" + dependencies: + shallowequal: "npm:^1.1.0" + checksum: a3695ba18f0f89dabfb4d62b6eddfbd20dca74163b0bcd58b2907cdccefe8b5d516a90dc713db5817e5eb7fa8f79b96b0612bbfc49d1bfd2c58bbba358b90758 + languageName: node + linkType: hard + +"nofilter@npm:^3.1.0": + version: 3.1.0 + resolution: "nofilter@npm:3.1.0" + checksum: 7c848870b7c60bc9439e2f721620fd0f54ad45c5af287757c29a698ad9939fd9ec98c24b4da2f59e3b43d6812bde198f2e215dc589930d552e4dcb69caaeb687 + languageName: node + linkType: hard + +"nopt@npm:^6.0.0": + version: 6.0.0 + resolution: "nopt@npm:6.0.0" + dependencies: + abbrev: "npm:^1.0.0" + bin: + nopt: bin/nopt.js + checksum: 6ae5c083c5b205d0850f3b00c093cb0b1d4fb28fb69c68c3f933048e666695b1f218db6a4a7f61a4bae2f127268f526a7f2764223208e4dd527c51c56c49a5c7 + languageName: node + linkType: hard + +"normalize-package-data@npm:^2.3.2": + version: 2.5.0 + resolution: "normalize-package-data@npm:2.5.0" + dependencies: + hosted-git-info: "npm:^2.1.4" + resolve: "npm:^1.10.0" + semver: "npm:2 || 3 || 4 || 5" + validate-npm-package-license: "npm:^3.0.1" + checksum: bb86822784df42f9a39a48245dc8c013d5b28500c79282db64ad9322da4d5722e274c4d9b63396a3e2fd2f1a33ab2fe3348196d38f267c8c7912dfabfaf805ec + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 66de83885051c8a7266566cb175281ec583e3d66b5054c744b46a0eebc4eaac1e1d74c640aaf72144086a9661aa60e89ac0b5c92eb76608e5b8a5056dbcf9e27 + languageName: node + linkType: hard + +"normalize-url@npm:^4.1.0": + version: 4.5.1 + resolution: "normalize-url@npm:4.5.1" + checksum: 4ab5a90e195941f1c4bb574538858f85d017285b67d05269a35fe0c5c9f217705d476baccc7f6b2599c3156279f9797a00450617da0409b9157dfaed04dbe4fc + languageName: node + linkType: hard + +"normalize-url@npm:^6.0.1": + version: 6.1.0 + resolution: "normalize-url@npm:6.1.0" + checksum: 571335f6aca25545549a75e9f1ef848cbb1b4db08c19e2a1e042a216d14128fc77e039b08de2dbfa4b8341202dc7fff888ab9ba8aa6940568563d1de60867104 + languageName: node + linkType: hard + +"npmlog@npm:^6.0.0": + version: 6.0.2 + resolution: "npmlog@npm:6.0.2" + dependencies: + are-we-there-yet: "npm:^3.0.0" + console-control-strings: "npm:^1.1.0" + gauge: "npm:^4.0.3" + set-blocking: "npm:^2.0.0" + checksum: c04307b2991f128df6f3bb71c36fa56a65397f56f02a565ed269786ecd5609818e6cae36de3371555e52fdf049a5649a3591ac3bb432a2a0146d67093c4be93c + languageName: node + linkType: hard + +"number-is-nan@npm:^1.0.0": + version: 1.0.1 + resolution: "number-is-nan@npm:1.0.1" + checksum: 5d277673bdfae98f79b02c4ea9bb13989df7435f1b90b708b8177d276e0977e9377eb6a391d28a115b577baa0edacaea99c1b755bfeb8b348a7dc9281d32fc02 + languageName: node + linkType: hard + +"number-to-bn@npm:1.7.0": + version: 1.7.0 + resolution: "number-to-bn@npm:1.7.0" + dependencies: + bn.js: "npm:4.11.6" + strip-hex-prefix: "npm:1.0.0" + checksum: 575b9d56857b28e14bffaa357635ff5016c041d406f605cea98e3b1c3d67d6931afd565f3d36a428e0099432a4e58d3d2ffdc26037e8aeb6c94d1f79478616c8 + languageName: node + linkType: hard + +"oauth-sign@npm:~0.9.0": + version: 0.9.0 + resolution: "oauth-sign@npm:0.9.0" + checksum: 7f90bdcedf7b624a85106ef0b7ac65fafd736a1f073554714363becdae7d9f3caed00a282b876eecef39797451c188e4e1dd72b455fa1880469ee6f0710c0a3e + languageName: node + linkType: hard + +"object-assign@npm:^4, object-assign@npm:^4.0.0, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: f5cd1f2f1e82e12207e4f2377d9d7d90fbc0d9822a6afa717a6dcab6930d8925e1ebbbb25df770c31ff11335ee423459ba65ffa2e53999926c328b806b4d73d6 + languageName: node + linkType: hard + +"object-copy@npm:^0.1.0": + version: 0.1.0 + resolution: "object-copy@npm:0.1.0" + dependencies: + copy-descriptor: "npm:^0.1.0" + define-property: "npm:^0.2.5" + kind-of: "npm:^3.0.3" + checksum: df2c44552d01b270c5b95339a3d935709d9657c1c32e551d804b88477a2cf68e01ce5c6f9364cc939e2aaa24d629fec35e939da0f1dc6739e3ee7e170d85766e + languageName: node + linkType: hard + +"object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0, object-inspect@npm:~1.12.3": + version: 1.12.3 + resolution: "object-inspect@npm:1.12.3" + checksum: 052c374ab0a4c85201480374c1039dddac0aaa8ef0fcbe1b04026f4c832c5632db6cb63617d6403b2b9dca08d4302d781aeb6c4d0260de4a84118ecaf1b5ebda + languageName: node + linkType: hard + +"object-is@npm:^1.0.1": + version: 1.1.5 + resolution: "object-is@npm:1.1.5" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.1.3" + checksum: 47c9e548dba76b03c271a8d61281e69f2c96e435d6303cc35194e61e465463a24af732a3e58e249fa5e6ad2eb8fbbcfe34bd5926dd582927436e9c1a66cf8941 + languageName: node + linkType: hard + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: 23343006d68702a85c299dafd4fc4205dbf729561a7d0acc1a75f6211636fcc1bbbdf26f0740119c43a7a98463e56b8afb74cbb4670509452007f5bc2f64cc36 + languageName: node + linkType: hard + +"object-keys@npm:~0.4.0": + version: 0.4.0 + resolution: "object-keys@npm:0.4.0" + checksum: 242f783aa4395b56e7c69639c4841dbe045e23943448791bdd39fcb72faf078ecda9b77681e8d96d7462a00b2dccfc280c8b5de9116c70bddd182f58ac3edb0a + languageName: node + linkType: hard + +"object-visit@npm:^1.0.0": + version: 1.0.1 + resolution: "object-visit@npm:1.0.1" + dependencies: + isobject: "npm:^3.0.0" + checksum: 0e76d72cbe2abf8b5eb4438afe89aaea979f28bbc43dac86ddcf19b3acb092469068f8f93841e404fcc79e4bf89b8d2b0af09361967645f429417c0b7221ed9b + languageName: node + linkType: hard + +"object.assign@npm:^4.1.4": + version: 4.1.4 + resolution: "object.assign@npm:4.1.4" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.1.4" + has-symbols: "npm:^1.0.3" + object-keys: "npm:^1.1.1" + checksum: d1b1bcf947a523140f1f5aa91fcdb9b8fadf6a309e8274bec5e5cfbf897974ead2d0782ac9a2e83ebf59f0ee3994be5cfb1d1483a19e528f472993b2d026a1de + languageName: node + linkType: hard + +"object.getownpropertydescriptors@npm:^2.1.6": + version: 2.1.6 + resolution: "object.getownpropertydescriptors@npm:2.1.6" + dependencies: + array.prototype.reduce: "npm:^1.0.5" + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.21.2" + safe-array-concat: "npm:^1.0.0" + checksum: 1008fa70d89a1e66bb712965ac38a1595dc9ddf21b1d145291408a5efc9d8f1988f62b620f3929b15a6b6e196f1f0f0114bb892b0eeb58b36c1853c25bf2b51d + languageName: node + linkType: hard + +"object.pick@npm:^1.3.0": + version: 1.3.0 + resolution: "object.pick@npm:1.3.0" + dependencies: + isobject: "npm:^3.0.1" + checksum: d276c0d9447ab48a1639595dd770a91d914a37312814c9a391ecc214e716d78013dcf4ae7d06df6cc5ad96cfee45da2b04318c0f09ce414a2927f69cd84b6a0f + languageName: node + linkType: hard + +"obliterator@npm:^2.0.0": + version: 2.0.4 + resolution: "obliterator@npm:2.0.4" + checksum: 66ac986e59518bc55eb128d02ac5e34239c6e32123dfd15a59ddd7e54de79c54bbc3fc9b10cee8f88bb259429ef7c7fa55e90c03da84cc902568b1a76221fe90 + languageName: node + linkType: hard + +"oboe@npm:2.1.4": + version: 2.1.4 + resolution: "oboe@npm:2.1.4" + dependencies: + http-https: "npm:^1.0.0" + checksum: da057a3a4b7f1a9bd5de2a588904a2894ad61ea85c51612a57ed4baabb1abd90ee13bfade361a7ddae46702921369fba9af58f00a27e1f01f3f2e0de5136e5c6 + languageName: node + linkType: hard + +"on-finished@npm:2.4.1": + version: 2.4.1 + resolution: "on-finished@npm:2.4.1" + dependencies: + ee-first: "npm:1.1.1" + checksum: 93ad68cf985df7d5263acef0302610a63f5d28840054b8d9a085776427beec4c7ce5518274c46b302eefd43747e81f6bb7df7dc4a2a2b345c0c49f31ad344385 + languageName: node + linkType: hard + +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 12d5c6ece331855387577e71c96ab5b60269390b131cf9403494206274fa520221c88f8b8d431d7227d080127730460da8907c402ab4142e592c34aacb5c9817 + languageName: node + linkType: hard + +"open@npm:^7.4.2": + version: 7.4.2 + resolution: "open@npm:7.4.2" + dependencies: + is-docker: "npm:^2.0.0" + is-wsl: "npm:^2.1.1" + checksum: b3619842c6ecee8dd4d6010066757e968223678f39cfbaa57c06aa1cb133383f86238b4d3071e5bb693f2526cb67e89eef0e9e6e355964ddbbcf78404853f888 + languageName: node + linkType: hard + +"optionator@npm:^0.9.1": + version: 0.9.1 + resolution: "optionator@npm:0.9.1" + dependencies: + deep-is: "npm:^0.1.3" + fast-levenshtein: "npm:^2.0.6" + levn: "npm:^0.4.1" + prelude-ls: "npm:^1.2.1" + type-check: "npm:^0.4.0" + word-wrap: "npm:^1.2.3" + checksum: bb7b06099c688d6d4bfc193f66b7aac15bfa84190f076f3f8c57821bdd0be761cbbf8972f0a904e7181aa2ca89441ca51c20f87b631690ca8d3f5bad90b7e0f1 + languageName: node + linkType: hard + +"os-homedir@npm:^1.0.0": + version: 1.0.2 + resolution: "os-homedir@npm:1.0.2" + checksum: a9952fc2f0428609088f9be0b399c7029ef090c9a9d065c5cfa1c41b25a7d441df98f19368d2cc7c19c7e932759b918fe9e6cb7ee61b1343341a42f2481ab6ca + languageName: node + linkType: hard + +"os-locale@npm:^1.4.0": + version: 1.4.0 + resolution: "os-locale@npm:1.4.0" + dependencies: + lcid: "npm:^1.0.0" + checksum: 25a506bd656c5ee0ff9878cb04ff1bb5b66e61cea734402620cfd6c9150aad03d6a8e82766faf2cf2ea04603e0ef69a7a5d60f70835bb5d3d4564bb4e960247a + languageName: node + linkType: hard + +"os-tmpdir@npm:^1.0.1, os-tmpdir@npm:~1.0.2": + version: 1.0.2 + resolution: "os-tmpdir@npm:1.0.2" + checksum: c69d1cc11e9da80f1e2b21a08566fec9a690e4b5bc47b3ac996cfe8d24f4e9e6857779a39a326bf322f2e8bc936ada1a92d48aa10c6dda99c13c551c23bdadfb + languageName: node + linkType: hard + +"p-cancelable@npm:^1.0.0": + version: 1.1.0 + resolution: "p-cancelable@npm:1.1.0" + checksum: 3644196b4cdbcc68ca791a4a9f3a22800dcfce92aa5d26804642e442a107796fa45b27591bbcbe16613eabdde59b97bbeecc52816354187c1902bab4912c3f5c + languageName: node + linkType: hard + +"p-cancelable@npm:^2.0.0": + version: 2.1.1 + resolution: "p-cancelable@npm:2.1.1" + checksum: 72b765c431614e7a7c5a22d6d32cee904f14df001a11491913b65cdc5143245dbd932487418b9d673c39381d940c22b1cdd08b2d768666fa3c4a5e199801824f + languageName: node + linkType: hard + +"p-limit@npm:^1.1.0": + version: 1.3.0 + resolution: "p-limit@npm:1.3.0" + dependencies: + p-try: "npm:^1.0.0" + checksum: 174135f738017e19b6f0b4b83233567eeea3aca95b90c15fdfa8de34c7b5e77860b77b010141783be711bd07743566a844dc93fda02b1bf4b3b4d0adb4500dca + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: "npm:^0.1.0" + checksum: c38ea177d6bd9e8b9a8c296145bfe2aa8963f6aae5c864630a4e1728513953319ab13bc113fe00e2b632e0ec039b23daa311f79b4f7f04b0b50f2d8b994fad46 + languageName: node + linkType: hard + +"p-locate@npm:^2.0.0": + version: 2.0.0 + resolution: "p-locate@npm:2.0.0" + dependencies: + p-limit: "npm:^1.1.0" + checksum: bec5584bafa1f21965eef193c7c0d37be9e71d24c4f749a08b3f68d1a10e1c020b4b20e840be4d0be4a9204efe4eaa2f51edc74fdc531d427e909261ad1c67b8 + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: "npm:^3.0.2" + checksum: 6f4c66cf65f6f1955de1978a612b3acb94d41663ba72cc6b60ac21b1aa6d7e3e13b2debbef0017b4339e71087c7917f8fd03b6b06db604af74e7eb55347c5206 + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: "npm:^3.0.0" + checksum: 619df8954fe81933903bc760e9884d85540ef7e8f6c24c4e28e2c8f0ad14d480bb7d4541787eee2e2d61aa0fae8b54abc42f7afc35db457884e589386e78a922 + languageName: node + linkType: hard + +"p-try@npm:^1.0.0": + version: 1.0.0 + resolution: "p-try@npm:1.0.0" + checksum: bb527ed65fac00057d10a437efa2e1ad3fb3e99cbc4dfa99f0fccc4a4be23d4c8b8d31176272c6029bc1947b7904dd31907d629aa24338c1a4c4fe236bc35db1 + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: "npm:^3.0.0" + checksum: ac26e4d08ec70f2e03c7e7b80c384fc3201576c04102ecf8cfef29051980208bd41a552802f1c46d6f3c1f0f864ce4f3cfc1f3077c19561a08df214d7b3fe3ec + languageName: node + linkType: hard + +"parse-asn1@npm:^5.0.0, parse-asn1@npm:^5.1.5": + version: 5.1.6 + resolution: "parse-asn1@npm:5.1.6" + dependencies: + asn1.js: "npm:^5.2.0" + browserify-aes: "npm:^1.0.0" + evp_bytestokey: "npm:^1.0.0" + pbkdf2: "npm:^3.0.3" + safe-buffer: "npm:^5.1.1" + checksum: 0c7c7cd35d6e59dd79f647430ed46a19f9dbf771595fd98605ffc210d6b01bdf1d020a9ef2f84c74c7d17c3466a00ff414fea4ce05306f1d9494051f6a0d9c6d + languageName: node + linkType: hard + +"parse-code-context@npm:^1.0.0": + version: 1.0.0 + resolution: "parse-code-context@npm:1.0.0" + checksum: 9bbbaa24cc1b57d589f64a5668f86b023fae059e8294918cd43e46de72f11c24a0f287d2de5cbc83782f4f570b88cd5e5a129dbce597072fb4f87c1398e2657b + languageName: node + linkType: hard + +"parse-headers@npm:^2.0.0": + version: 2.0.5 + resolution: "parse-headers@npm:2.0.5" + checksum: 7a4d8855e3f067fc28b049e03ca8d2ba6e216a11a6d6c77fe8deaced586e9770e247765a62e7b2f2f18f018c42a3290bb78c0e2a4514ce96a8b0fe1484f8a8e0 + languageName: node + linkType: hard + +"parse-json@npm:^2.2.0": + version: 2.2.0 + resolution: "parse-json@npm:2.2.0" + dependencies: + error-ex: "npm:^1.2.0" + checksum: 1e59757ae711945d654f9ae36bfe613ed5f15895c2cf3829d3243e846a435549facda57ced14085fa3276530bd9c796206f3b9f1a1171c0d33deacb8093f5dde + languageName: node + linkType: hard + +"parse-json@npm:^5.0.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + dependencies: + "@babel/code-frame": "npm:^7.0.0" + error-ex: "npm:^1.3.1" + json-parse-even-better-errors: "npm:^2.3.0" + lines-and-columns: "npm:^1.1.6" + checksum: 0c094e234bde1a643949a0ab6e46f12dfc8c11b38b3b7fd676a6f13499e208fe290ff94a48450abb7d043b556a31e1b4b781ced9ee3a08ac37cb250479396e50 + languageName: node + linkType: hard + +"parseurl@npm:~1.3.3": + version: 1.3.3 + resolution: "parseurl@npm:1.3.3" + checksum: cbd2f45d9ab7fe80e5a742ff88fdedcfae00a32b1e6cca174c4d5c11b9480d0dde9a22b5e9505da44734f047e7cea8457508fced54067b870595a7938d29b467 + languageName: node + linkType: hard + +"pascalcase@npm:^0.1.1": + version: 0.1.1 + resolution: "pascalcase@npm:0.1.1" + checksum: d6743b6f283eecb497b512cb7b2205a49819324aacf61b3b81e9fc2aabf1ec57ca73a156328257458265f4a2e9cb798ddd048979a5a6333984769bddf00e4b6d + languageName: node + linkType: hard + +"patch-package@npm:6.2.2": + version: 6.2.2 + resolution: "patch-package@npm:6.2.2" + dependencies: + "@yarnpkg/lockfile": "npm:^1.1.0" + chalk: "npm:^2.4.2" + cross-spawn: "npm:^6.0.5" + find-yarn-workspace-root: "npm:^1.2.1" + fs-extra: "npm:^7.0.1" + is-ci: "npm:^2.0.0" + klaw-sync: "npm:^6.0.0" + minimist: "npm:^1.2.0" + rimraf: "npm:^2.6.3" + semver: "npm:^5.6.0" + slash: "npm:^2.0.0" + tmp: "npm:^0.0.33" + bin: + patch-package: index.js + checksum: 45a17fe395f9b0adf98710204de2d42eaa2e308f5b707bb4a20d27823e21d791ce461c23da21d5816636026f1198302a86735a2881d5a17da47a4173bc152260 + languageName: node + linkType: hard + +"patch-package@npm:^6.2.2": + version: 6.5.1 + resolution: "patch-package@npm:6.5.1" + dependencies: + "@yarnpkg/lockfile": "npm:^1.1.0" + chalk: "npm:^4.1.2" + cross-spawn: "npm:^6.0.5" + find-yarn-workspace-root: "npm:^2.0.0" + fs-extra: "npm:^9.0.0" + is-ci: "npm:^2.0.0" + klaw-sync: "npm:^6.0.0" + minimist: "npm:^1.2.6" + open: "npm:^7.4.2" + rimraf: "npm:^2.6.3" + semver: "npm:^5.6.0" + slash: "npm:^2.0.0" + tmp: "npm:^0.0.33" + yaml: "npm:^1.10.2" + bin: + patch-package: index.js + checksum: a32c5ba60eed5c3a865f398a4f59d2ead6e415936ef959e2aa344737b58f3a5ea9c77d517edac6b89508b6a5947bd2ef8d2a6050e3d133afd170e8e8bb3e420b + languageName: node + linkType: hard + +"path-browserify@npm:^1.0.0": + version: 1.0.1 + resolution: "path-browserify@npm:1.0.1" + checksum: d650fba4e7cace87cc15f39961022111ad983ab7a5fc215a02f3537732bc8a4410941bbd973ca066cacffdf54ffff68b486344f3791f565da157e29fc907b643 + languageName: node + linkType: hard + +"path-exists@npm:^2.0.0": + version: 2.1.0 + resolution: "path-exists@npm:2.1.0" + dependencies: + pinkie-promise: "npm:^2.0.0" + checksum: 332952a80f3bc4186fa28c40b0f317b287956516b35ffc0ce4be8856ad4adc6dbf9078e51a47d3b8d5cdb55aa2b5d10f181bdc483ead29a88e69673a064c7aa8 + languageName: node + linkType: hard + +"path-exists@npm:^3.0.0": + version: 3.0.0 + resolution: "path-exists@npm:3.0.0" + checksum: 6479d25601e17c2dbe1a02b3f00fe62416f3c8909ab7352f4f492bdc781ed745d8d0ef03fe233c20323a44fac38b3a6c3cc6865b7d0c68635fdff9e2abf7304c + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 28623865ba71cdc25d2d80021407b1500d64bb74d5072f03276221b4febedbb543132f5bcc57d7fc42b32b45f4175bbae919e1810535892faa4ba9e8f2edc6dd + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0, path-is-absolute@npm:^1.0.1": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 6bb8fef4324c3f744e5d216980aa053095e1fc533d40fa47f9c1adc16be7fa52d3c4858370c7685406c32ab143a4dca0798f2e2c0f57d7937af66d8dd79267f6 + languageName: node + linkType: hard + +"path-key@npm:^2.0.1": + version: 2.0.1 + resolution: "path-key@npm:2.0.1" + checksum: 450f7d26a399a0eaefbece71cfe0b593c57e41eb98fadb11472cd6a1a0563ef91e7dd308118e2d1a3fc95630602c1b32744d29d7d33a0c82276f61a41890b9ab + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 93ee8a32e3be43548ece14eba2620bf5164884d0cc1aa3615d136567a39e02066c9b5aeb5b6747d766af55936151c95d9371ba46d4fcf361db9691505650c001 + languageName: node + linkType: hard + +"path-parse@npm:^1.0.6, path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: ca291d7bced407e20480b686d7ef4f9dd112ef00d6f109faa50bbefe8ff9dd51e164781fa0670c7b5d67a88610008e83e594f8294ec809c1b7203c6577ca3777 + languageName: node + linkType: hard + +"path-to-regexp@npm:0.1.7": + version: 0.1.7 + resolution: "path-to-regexp@npm:0.1.7" + checksum: 65caab5a929dda7ae7f6ab3be871a82390317291271694dea898eea5fdcc232ae7fd197a76a3cda4bd6dcef8d82e582578e02eb7d5fa659df0f4d33a53c9753f + languageName: node + linkType: hard + +"path-type@npm:^1.0.0": + version: 1.1.0 + resolution: "path-type@npm:1.1.0" + dependencies: + graceful-fs: "npm:^4.1.2" + pify: "npm:^2.0.0" + pinkie-promise: "npm:^2.0.0" + checksum: eea7038f829ebf7df08ac8008fd7fd53e505c0916c7fed61a138a56fcd6b73e53b288a067d2a47f5bfc06667aa0c3501b5af7d217114ccd5b35eaf2cc74501d9 + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 6a9330ad8d96f31e929feb414cde2959078379ba5a48c9e3eab34f280d7850eec6a0fa3ed5be9150e9e4d7df5139c1ae92f891b18167528553a11382d8f54183 + languageName: node + linkType: hard + +"pathval@npm:^1.1.1": + version: 1.1.1 + resolution: "pathval@npm:1.1.1" + checksum: 13fed3f7d8efa938ed9a5e3e5c6d35c6081e4d05b2fd97274702966477ff28af7599e44418bfeebf032acd407379a77b4db180cc78294e5b8dcd971567a0efe8 + languageName: node + linkType: hard + +"pbkdf2@npm:^3.0.17, pbkdf2@npm:^3.0.3, pbkdf2@npm:^3.0.9": + version: 3.1.2 + resolution: "pbkdf2@npm:3.1.2" + dependencies: + create-hash: "npm:^1.1.2" + create-hmac: "npm:^1.1.4" + ripemd160: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + sha.js: "npm:^2.4.8" + checksum: 5b5e46c0e65c2041f7b2bab88f1eb1132f9f326efdb7e80866e28428e24f979a1b901a695d17ac02ae72ec36e66f6b61a4e9a3878cb106bcef53dd32aee1cc6d + languageName: node + linkType: hard + +"performance-now@npm:^2.1.0": + version: 2.1.0 + resolution: "performance-now@npm:2.1.0" + checksum: a0fae1e610b785e04b20ae146033a7ea1e639f1aa583a1d4d01b36be787dfebe31227402a7ef3b1ffb621d04750ca73c17b03ec943f2389f7416f95236a61e31 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 6ba5938c24af2c5918e94b39aa0ad48d71f2c30634de69d46e0bd32feb666de4e909406db6ffb78f98d39ef450d6a41b6fa3954dc3659d7b2b750766c1261e5e + languageName: node + linkType: hard + +"pify@npm:^2.0.0, pify@npm:^2.3.0": + version: 2.3.0 + resolution: "pify@npm:2.3.0" + checksum: 9a3b2aa18d26ed79db45dee98f52675750ad11ced96b45b4884f4d4368217046137e35481146bfc94698f5709fd838d86f1d2d80d958f5f88767e426d29cbc66 + languageName: node + linkType: hard + +"pinkie-promise@npm:^2.0.0": + version: 2.0.1 + resolution: "pinkie-promise@npm:2.0.1" + dependencies: + pinkie: "npm:^2.0.0" + checksum: 6eb75d26a34d0208ab5721e7272ff968359fddc4c203685df5b0a849a27d15bb73e9f2938d1ab4c900280cb2073b855dfc6b8bc7355c3ffbe9d1ca614d3cf042 + languageName: node + linkType: hard + +"pinkie@npm:^2.0.0": + version: 2.0.4 + resolution: "pinkie@npm:2.0.4" + checksum: 1bc1eb7aab96ec9674e0614146ad0b7ad9856d840140de3268d7900cc0259640ca17353708261659584e3f954b8ad8b39a4245dc5def50fcf7f4ddb09d3d7d20 + languageName: node + linkType: hard + +"pluralize@npm:^8.0.0": + version: 8.0.0 + resolution: "pluralize@npm:8.0.0" + checksum: e3bd882f49d220fbf7996a66c6c7f13fea43fbb7155de11cba8902ebfc7ed2a06cb2a706895738de9f6c089c72542bea8c855dab6abe11e54e75986ad19bfc7e + languageName: node + linkType: hard + +"posix-character-classes@npm:^0.1.0": + version: 0.1.1 + resolution: "posix-character-classes@npm:0.1.1" + checksum: 14790f421e18d173917b1f91ed156f7afa22e823214998ef73d2f4392f6ecaf68bb179c40677b490ea97494bde47d8355028303a62519cf4c1bca31afcafc783 + languageName: node + linkType: hard + +"postinstall-postinstall@npm:^2.1.0": + version: 2.1.0 + resolution: "postinstall-postinstall@npm:2.1.0" + checksum: 96ce970adc32a1f0fbf35d7d165a013d652a57a9b9eb8cb77f91fbaef11d1221c6feb1bb96b460481715e82909e9bb68bd5b5ac2ad4e9fa340476a091c18087b + languageName: node + linkType: hard + +"precond@npm:0.2": + version: 0.2.3 + resolution: "precond@npm:0.2.3" + checksum: d9e4526d34563f2f2f6465e87360a63738a44f788894f350d1069b38b845209d1826765e27367bd492bf2966409bbcc5e6d8415aac7245ffac77eb31c377e64e + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: 0fee0e2ba5dc7793340a5861d9d37ce4f3d8ec246099bfae25e1f2a928a4df1c009a91882c35862bdf245f69081160df4ed0ec2438662ae22e50b621a6b7848f + languageName: node + linkType: hard + +"prepend-http@npm:^2.0.0": + version: 2.0.0 + resolution: "prepend-http@npm:2.0.0" + checksum: c0e029ce18cb1729846c21b3d41d9a366382a386fd1cd07b498657926ee5a4c1f528c3037229069c0b6a8026e0269724d4813fa89878e28a4cd907b3adc0afa7 + languageName: node + linkType: hard + +"prettier-linter-helpers@npm:^1.0.0": + version: 1.0.0 + resolution: "prettier-linter-helpers@npm:1.0.0" + dependencies: + fast-diff: "npm:^1.1.2" + checksum: e9b17d00ae7f7ec97a905050a2887e3fc9c9bcf94a91a7e24a9e33392df0b7355d8002d8f0d81ffafe4c11716bf973975cca065fec90fa15ec36a98e0a1db624 + languageName: node + linkType: hard + +"prettier-plugin-solidity@npm:v1.0.0-alpha.59": + version: 1.0.0-alpha.59 + resolution: "prettier-plugin-solidity@npm:1.0.0-alpha.59" + dependencies: + "@solidity-parser/parser": "npm:^0.8.1" + dir-to-object: "npm:^2.0.0" + emoji-regex: "npm:^9.0.0" + escape-string-regexp: "npm:^4.0.0" + extract-comments: "npm:^1.1.0" + prettier: "npm:^2.0.5" + semver: "npm:^7.3.2" + string-width: "npm:^4.2.0" + checksum: 77ebcb29717ab35128f379315fcf23f24bd5241ee387fc82d3355380defa61481ad0adec9ba7144d69b28202f012aae53dffbf2b5190fb4283f4b902da5e792d + languageName: node + linkType: hard + +"prettier@npm:^2.0.5, prettier@npm:^2.1.2, prettier@npm:^2.7.1, prettier@npm:^2.8.3": + version: 2.8.8 + resolution: "prettier@npm:2.8.8" + bin: + prettier: bin-prettier.js + checksum: 38b0a43ea17e83f54b904f8808f7d0fd1d9705ef9627bb40017ee276cbd6f5e7d15bcf816c4467b64cfe14ef109369a981ce61fad9c6022749d041f74a672188 + languageName: node + linkType: hard + +"private@npm:^0.1.6, private@npm:^0.1.8": + version: 0.1.8 + resolution: "private@npm:0.1.8" + checksum: 6f53c1775032c1b1c878766df01212bef9680161955ed5a555981d000a75d991383e0098df87ee855bd1bdc4175001131f3cbedc353aa51bc1042add98a3a23e + languageName: node + linkType: hard + +"process-nextick-args@npm:~2.0.0": + version: 2.0.1 + resolution: "process-nextick-args@npm:2.0.1" + checksum: 09ec0ec8e28a923bdf8d0b926bfbba475553de2cf0be9232d76904a21a3c8c03b6dd4625738ee0bab8fa10b9b2f2fda8a3f9d18815c3407c30f13b51f84605e9 + languageName: node + linkType: hard + +"process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: e21687b0b8fe1c6812ea43858aa5c1234e05dc6b2c366b280c850fd09d644100cbcf2f3784feec4bc6f57002a465e7eea2901acf1462ffc94ba9ac98f105ede5 + languageName: node + linkType: hard + +"promise-inflight@npm:^1.0.1": + version: 1.0.1 + resolution: "promise-inflight@npm:1.0.1" + checksum: 7671022d3ea7e40e29ee941d30df819ed2a81a3d22b1175ed8c1bd83af542ea94ca47b50bea54634b12f7b1837fcd7dd5bcc7720910befa0076d12582ee56c93 + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: cbff149b3327554f3613196ca300a77aefac289624148c37e5c9236242931691a4ba0a76fd1c6171e6a3e6a2b1edfa2acdf122004857e6f3e3efd1be29df6cd2 + languageName: node + linkType: hard + +"promise-to-callback@npm:^1.0.0": + version: 1.0.0 + resolution: "promise-to-callback@npm:1.0.0" + dependencies: + is-fn: "npm:^1.0.0" + set-immediate-shim: "npm:^1.0.1" + checksum: a77fc7b5ce18ecaf7331d9dfe0deb734d19f25dc0ba4406d726308dc15e27507a2e66dc919e0968c24c6c3ecab9358fca11069bb9ad52c0f361b70aa3d10d336 + languageName: node + linkType: hard + +"proxy-addr@npm:~2.0.7": + version: 2.0.7 + resolution: "proxy-addr@npm:2.0.7" + dependencies: + forwarded: "npm:0.2.0" + ipaddr.js: "npm:1.9.1" + checksum: c03f00d8f882b97636262d0ae7da0c502325474ea215f21b4f0664ad8f40f49d2071b52c18257d011338be3db21ca65a6e8cbc0d95fb23efc00516ce9ee37c27 + languageName: node + linkType: hard + +"prr@npm:~1.0.1": + version: 1.0.1 + resolution: "prr@npm:1.0.1" + checksum: a483b1ca81a9f07f6ce2ed354aaa8baffa6ee050b541f49c164975ad1bf154981c80aed3d69441a17c46c804e89fa5f2892909245465270d6cf6631494981fd0 + languageName: node + linkType: hard + +"pseudomap@npm:^1.0.1": + version: 1.0.2 + resolution: "pseudomap@npm:1.0.2" + checksum: 33cfbb99ac85cfad587ebd29aef15343a570aa2208fa68a3036ee317ef2ef4345cf1a20f7311177393558937cafdf981be4c125e47a90cbd7400d942352239a4 + languageName: node + linkType: hard + +"psl@npm:^1.1.28": + version: 1.9.0 + resolution: "psl@npm:1.9.0" + checksum: cf1d67518a183700bcbccded8ba7f4340bc5c4dbd81229f1460c656d065b0b653142ce1c5379be32bf170b47c9eecdb499e8a3b15eb472c9462825da55d7f512 + languageName: node + linkType: hard + +"public-encrypt@npm:^4.0.0": + version: 4.0.3 + resolution: "public-encrypt@npm:4.0.3" + dependencies: + bn.js: "npm:^4.1.0" + browserify-rsa: "npm:^4.0.0" + create-hash: "npm:^1.1.0" + parse-asn1: "npm:^5.0.0" + randombytes: "npm:^2.0.1" + safe-buffer: "npm:^5.1.2" + checksum: d335b26ce380a53e383848ffa5d868388e03c513f26a7c71df7067d91543bb5b10f209b740efadede5bc1019e244b7475b1ee1aebacb206c07522a8db3ab4e23 + languageName: node + linkType: hard + +"pull-cat@npm:^1.1.9": + version: 1.1.11 + resolution: "pull-cat@npm:1.1.11" + checksum: 68271b0c4133bde718de84208fc7f4e31f71da13c96c7608e80f226cf6e1f51411749fc9e071036f6065b99cc505d81cf3ca6ee25be938a4e34292009243b2dd + languageName: node + linkType: hard + +"pull-defer@npm:^0.2.2": + version: 0.2.3 + resolution: "pull-defer@npm:0.2.3" + checksum: 5bdfc85e31bb6f9821884ab987970ce32bbf1660c48ba56fdcf1baacbd47003bdbc0cae10c10bbe21c7b5a19f3e6f9e7a60bf14d0be9ade6c5d3ac23ec22585d + languageName: node + linkType: hard + +"pull-level@npm:^2.0.3": + version: 2.0.4 + resolution: "pull-level@npm:2.0.4" + dependencies: + level-post: "npm:^1.0.7" + pull-cat: "npm:^1.1.9" + pull-live: "npm:^1.0.1" + pull-pushable: "npm:^2.0.0" + pull-stream: "npm:^3.4.0" + pull-window: "npm:^2.1.4" + stream-to-pull-stream: "npm:^1.7.1" + checksum: 7ad1398a138d1a75204c9d9313abf5737662a07cdafb4e6d06f0dac849db79d61d45355b287d4e3f674f67d72243e628bbe6fb0e5145b305defd4e1d565d6892 + languageName: node + linkType: hard + +"pull-live@npm:^1.0.1": + version: 1.0.1 + resolution: "pull-live@npm:1.0.1" + dependencies: + pull-cat: "npm:^1.1.9" + pull-stream: "npm:^3.4.0" + checksum: 316dc3a881c447442c8ac84d5ab7e681e2b6003424473c9bd22b26fcd0ad9f2f32a755def874078e2ed9ac62fe5012851c8e0d1be1e26ea93bed549d550bf200 + languageName: node + linkType: hard + +"pull-pushable@npm:^2.0.0": + version: 2.2.0 + resolution: "pull-pushable@npm:2.2.0" + checksum: 36d419e5d46e67728bc3e6f18da5f9c90ee726514752101b998db871ce01103818c8c866728947cb8b7157f9321c6e8bfd1ea93cd801bd0e9594c38a1ba24131 + languageName: node + linkType: hard + +"pull-stream@npm:^3.2.3, pull-stream@npm:^3.4.0, pull-stream@npm:^3.6.8": + version: 3.7.0 + resolution: "pull-stream@npm:3.7.0" + checksum: 7a3a767cc9beedb5dd8b584c6de9bb5361e4ddade5f42a317e5f50c00d418aa6def02458cdb03590846ccc8dc3a4f50b14b46def0fbd308138aa1bdab22a5937 + languageName: node + linkType: hard + +"pull-window@npm:^2.1.4": + version: 2.1.4 + resolution: "pull-window@npm:2.1.4" + dependencies: + looper: "npm:^2.0.0" + checksum: f15c882252f510f703735850ee20fd7c7af896052357a9d4a56a1c8f7615941e30f45a054e46f542b0b179c8913a8aa6d0ecf7294f73edd2c6ea3d31f868fcf5 + languageName: node + linkType: hard + +"pump@npm:^3.0.0": + version: 3.0.0 + resolution: "pump@npm:3.0.0" + dependencies: + end-of-stream: "npm:^1.1.0" + once: "npm:^1.3.1" + checksum: b2e6702ce154c091b2895cf6f09b35d4db783a3b9658c177387ff6ad00c0e9f6dd9fc5c70f64a3b360bc3624340fca69ff565fad586a206d6818f5e87d836420 + languageName: node + linkType: hard + +"punycode@npm:1.3.2": + version: 1.3.2 + resolution: "punycode@npm:1.3.2" + checksum: 55b7339478c7e0debfd563c404beb7c9af30f24e191bd728688523cf1dd901977acdb8bd9c6e1005d3d2fc0f40c7f907006735b139ad1cf595c16e071a1fd65a + languageName: node + linkType: hard + +"punycode@npm:2.1.0": + version: 2.1.0 + resolution: "punycode@npm:2.1.0" + checksum: 70172e111c94548261bbda310736d3c8dd7786bc9b130fd7602bfb6cc7cfb67c610da5de60673495b6dd77562c1f81cc8c3942554d1c52edf159efa8c45cef03 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0, punycode@npm:^2.1.1": + version: 2.3.0 + resolution: "punycode@npm:2.3.0" + checksum: c2b408c805927a6614ef581bd3d00deca1fef9f2da0ec95cecaedf6a985d8596a29e931e31f80f7313f94257895f9ac6cf4c2ae81cdca04964daf9c3c3d221c1 + languageName: node + linkType: hard + +"qs@npm:6.11.0": + version: 6.11.0 + resolution: "qs@npm:6.11.0" + dependencies: + side-channel: "npm:^1.0.4" + checksum: 337966e2e957a7d2a69821c528f3d18a8b346ddb0f16cc08d11c6206aed3b6624927781ff437aa3909e54ad32ebdee2c5396ad4094b1c722760774f7082f6124 + languageName: node + linkType: hard + +"qs@npm:^6.7.0": + version: 6.11.1 + resolution: "qs@npm:6.11.1" + dependencies: + side-channel: "npm:^1.0.4" + checksum: 5c9a1a3e1f2a7f53ca71d50ccabc4edb3018692b5d31a31ecad8db7a39d80c8f8ac5ed4cf49a881bac226f6b1c6e4add361e792e3146240c49d90cc610d738f4 + languageName: node + linkType: hard + +"qs@npm:~6.5.2": + version: 6.5.3 + resolution: "qs@npm:6.5.3" + checksum: 6a4be44c9bd3baef6db5d50905a5d305dce4aa11317c27c7599edee3aff835c1d96e582ff5b9205bcb07e8381d9e92de33570d459415c91d243ea926e27b0002 + languageName: node + linkType: hard + +"query-string@npm:^5.0.1": + version: 5.1.1 + resolution: "query-string@npm:5.1.1" + dependencies: + decode-uri-component: "npm:^0.2.0" + object-assign: "npm:^4.1.0" + strict-uri-encode: "npm:^1.0.0" + checksum: 7f04a4f3eb46f253b8091ae025a85b2325abd0d73a1390efe936a8ecc123578601a797750c00640ab9583aa584ec9ce11be8b80770d0dd826d0b134539d01a02 + languageName: node + linkType: hard + +"querystring@npm:0.2.0": + version: 0.2.0 + resolution: "querystring@npm:0.2.0" + checksum: 5804c20d7ebf914b26b9fe3c9a4b4b3104d7ee803106ac7bd35b9edffdcd844ca3d4aceaf5e0b39654b6939ceeadebafb3a3975346cf98f7accea19aa97f04fa + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2, queue-microtask@npm:^1.2.3": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: 84624bee6c25c9d9776242ce0dcc3e15f703d897f4b7d982f32ef4d88c51048507a0999d9ff038ec46f65901655460b69240e414da1cebc2d723987ec81cbae8 + languageName: node + linkType: hard + +"quick-lru@npm:^5.1.1": + version: 5.1.1 + resolution: "quick-lru@npm:5.1.1" + checksum: fefb921f96c5cdf650d25d80b709072122e7a24c374aa08b35c4347f319b7614f331002c1107d337651107fadea4a2b8a66774070645a179f6fc6b21edc2085a + languageName: node + linkType: hard + +"randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5, randombytes@npm:^2.0.6, randombytes@npm:^2.1.0": + version: 2.1.0 + resolution: "randombytes@npm:2.1.0" + dependencies: + safe-buffer: "npm:^5.1.0" + checksum: 5d8b58cc7c397c4e23e4ef7d64ecd4a84d4a12781964b5cbd329a92f77f55beef58dda2e8d2f7582aceaf0fd41dac2a9665c630882af1937be8f2fbb5f69d037 + languageName: node + linkType: hard + +"randomfill@npm:^1.0.3": + version: 1.0.4 + resolution: "randomfill@npm:1.0.4" + dependencies: + randombytes: "npm:^2.0.5" + safe-buffer: "npm:^5.1.0" + checksum: 6d50fc3c3736130c2209407871618ad6d8204db0a54705f3c1a970669760c56e0dac12b875a154fcd1b7b7ff823549d79f40e967ec7eb2e121acad7363011739 + languageName: node + linkType: hard + +"range-parser@npm:~1.2.1": + version: 1.2.1 + resolution: "range-parser@npm:1.2.1" + checksum: fc96933398c1a37a5c0c02bfc84ae171fa71b6f7b3d4360f84c9faeff5f43f29ebc59b404eab9af00073bb03a9717e05f8c46cd191524b6aefc72f227bad54d5 + languageName: node + linkType: hard + +"raw-body@npm:2.5.1": + version: 2.5.1 + resolution: "raw-body@npm:2.5.1" + dependencies: + bytes: "npm:3.1.2" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + unpipe: "npm:1.0.0" + checksum: b5e41c0e7213e078f045a2b2397eb35665e952ad5176ff7462b740f7c7730b3d47d496ab2b1dd31ed36f8ffed41291cf93b035516403e0babea72c42d039b66b + languageName: node + linkType: hard + +"raw-body@npm:2.5.2, raw-body@npm:^2.4.1": + version: 2.5.2 + resolution: "raw-body@npm:2.5.2" + dependencies: + bytes: "npm:3.1.2" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + unpipe: "npm:1.0.0" + checksum: 409733b2b8e85008488eaec74dc09d7ae676a38cc543d3129c2696970056f733aa4819875dfc415d8f3e5e98e792c7378c9b10c2340ecc6405b74916cf33f63d + languageName: node + linkType: hard + +"read-pkg-up@npm:^1.0.1": + version: 1.0.1 + resolution: "read-pkg-up@npm:1.0.1" + dependencies: + find-up: "npm:^1.0.0" + read-pkg: "npm:^1.0.0" + checksum: 67db75f9fef4ccaa81f04bce1fa58a774e42f6c42f26570d9db69232ba358da4219db5db3458f566b049635854e5ff0ba2146a8ea34585374ab84c6ea2c3fc59 + languageName: node + linkType: hard + +"read-pkg@npm:^1.0.0": + version: 1.1.0 + resolution: "read-pkg@npm:1.1.0" + dependencies: + load-json-file: "npm:^1.0.0" + normalize-package-data: "npm:^2.3.2" + path-type: "npm:^1.0.0" + checksum: c12be26451488b0b3aab5dc9341f37236edd0942f6932840e4481e1abcf53ee76c3f9d999b83cb3f4641e1f3bf8a8a2458d6b7292511b32e000b9e5cb932d452 + languageName: node + linkType: hard + +"readable-stream@npm:^1.0.33": + version: 1.1.14 + resolution: "readable-stream@npm:1.1.14" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.1" + isarray: "npm:0.0.1" + string_decoder: "npm:~0.10.x" + checksum: b961628e92084125b88b855c8b3a0b7730d2aee7aff273f0efac23ad89df2b01a7d6c966ec5e42d9e9bcf72489461ab3b24cbe8bd280fb8f22fe299d02c3ce34 + languageName: node + linkType: hard + +"readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.5, readable-stream@npm:^2.2.2, readable-stream@npm:^2.2.8, readable-stream@npm:^2.2.9, readable-stream@npm:^2.3.6, readable-stream@npm:~2.3.6": + version: 2.3.8 + resolution: "readable-stream@npm:2.3.8" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.3" + isarray: "npm:~1.0.0" + process-nextick-args: "npm:~2.0.0" + safe-buffer: "npm:~5.1.1" + string_decoder: "npm:~1.1.1" + util-deprecate: "npm:~1.0.1" + checksum: 266f740b0dc790395f96f784dc090c119a4b3388b2e90ed41cd1e51358dd50b2909d295cc4af7af3c07115b16c6264ce2c9c908b45681a821be741114fff8b3e + languageName: node + linkType: hard + +"readable-stream@npm:^3.0.6, readable-stream@npm:^3.6.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: "npm:^2.0.3" + string_decoder: "npm:^1.1.1" + util-deprecate: "npm:^1.0.1" + checksum: b1cbe0fea6b407fc75bfbe4f6c54d48899e638d54a8a1207b5040c60566dd5f65059b32c3edf0ac0ce621ea46929b3337e8a19410870eff98b8be5a3ba543b7a + languageName: node + linkType: hard + +"readable-stream@npm:~1.0.15": + version: 1.0.34 + resolution: "readable-stream@npm:1.0.34" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.1" + isarray: "npm:0.0.1" + string_decoder: "npm:~0.10.x" + checksum: 6c3abb4a779392e39805fca0f4a58b093673d52acc4f3bfecfa6fd82ef421dad3465f20379354be3e087f9c89d71e81cf5292c80939a32fca4cbee45e53a9994 + languageName: node + linkType: hard + +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: "npm:^2.2.1" + checksum: 9dea77bef6b47b7c7553da4b5f30606449b49cf2aa043de23e22bee909c2d26c97630b8f8fa43775e318731c5a208d2063a10d3c788a3b0e1a9e32c5ab5fe790 + languageName: node + linkType: hard + +"regenerate@npm:^1.2.1": + version: 1.4.2 + resolution: "regenerate@npm:1.4.2" + checksum: f2d97117f52ef5bef7757693c3157395c8c542ef4b856addac6e78c76ed7053f2154435912a18a6d1c3ff09702ad525babeffe30a179ef809cacff200cd4d193 + languageName: node + linkType: hard + +"regenerator-runtime@npm:^0.11.0": + version: 0.11.1 + resolution: "regenerator-runtime@npm:0.11.1" + checksum: 14664043fb2f0f41fa9349df06e962fc888657ea05ece28df05729fba0b9ea626e75547e317452454b80ef182bfe69b7c14d6717b0f7eb1c23d4d74aad9e186c + languageName: node + linkType: hard + +"regenerator-transform@npm:^0.10.0": + version: 0.10.1 + resolution: "regenerator-transform@npm:0.10.1" + dependencies: + babel-runtime: "npm:^6.18.0" + babel-types: "npm:^6.19.0" + private: "npm:^0.1.6" + checksum: b923ac993aca188614f047d7afe86cc8a765ea8c18fb299ae25f6d492e57d0787cc8c699d9f6e95a539753cb4cd8f79ba894b798924ce49ac41b21e1c92feff4 + languageName: node + linkType: hard + +"regex-not@npm:^1.0.0, regex-not@npm:^1.0.2": + version: 1.0.2 + resolution: "regex-not@npm:1.0.2" + dependencies: + extend-shallow: "npm:^3.0.2" + safe-regex: "npm:^1.1.0" + checksum: 98ef0dc9de7cfb315c7a6362e062e16926dc73ab33bf2fec90116a19755a2b1dc8866238a1db1f718f148889584f6e72a6f250059901fb90f34e2a72ace21e94 + languageName: node + linkType: hard + +"regexp.prototype.flags@npm:^1.2.0, regexp.prototype.flags@npm:^1.4.3": + version: 1.5.0 + resolution: "regexp.prototype.flags@npm:1.5.0" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + functions-have-names: "npm:^1.2.3" + checksum: 27e06f7238805b9b315bb43ef60500345cd3c041c9ba2f6b2b7951bd23409314d22741a100e2ce4c6b996d5488dfdc59776486f51f07fef2c2bd36b01dde1092 + languageName: node + linkType: hard + +"regexpu-core@npm:^2.0.0": + version: 2.0.0 + resolution: "regexpu-core@npm:2.0.0" + dependencies: + regenerate: "npm:^1.2.1" + regjsgen: "npm:^0.2.0" + regjsparser: "npm:^0.1.4" + checksum: fd3a6a75664c572631694f22658224c073dc5ab77e506c565b1845bb5b3b18c717921b7b17555f52dc86198420310ba2e96334462ebddbb89a7592995ef13c76 + languageName: node + linkType: hard + +"regjsgen@npm:^0.2.0": + version: 0.2.0 + resolution: "regjsgen@npm:0.2.0" + checksum: 2202fabc568f9cf4cab9907634fd271b47604b07b0bfaa5c04a9a342ea7b7d54a05276535eb9c0263ae279a8d8524704bc6f23fff33eb57b185db4cd7f439074 + languageName: node + linkType: hard + +"regjsparser@npm:^0.1.4": + version: 0.1.5 + resolution: "regjsparser@npm:0.1.5" + dependencies: + jsesc: "npm:~0.5.0" + bin: + regjsparser: bin/parser + checksum: 4e90b2cbb137053a07a2f1758281d75d6cfdb265ab1a08613f19b9a3ddd8e58fa7a6b269d3bd1ac02dd098cf3a034b27461d1f5f173a2094112d76f60efe0983 + languageName: node + linkType: hard + +"repeat-element@npm:^1.1.2": + version: 1.1.4 + resolution: "repeat-element@npm:1.1.4" + checksum: 2ff55b8a4b8112a85738a6b7daf1139380aec40504bec51f145ce8cddb5704db2cca9dab76789948c7f34ce52950edcf4a02cf2fb1bd9a71b8a2feb5dc340dfe + languageName: node + linkType: hard + +"repeat-string@npm:^1.6.1": + version: 1.6.1 + resolution: "repeat-string@npm:1.6.1" + checksum: aa893b7e42c56727dce0f9bf902c5156b9b914c3a31b4a3831e673d43502ce7613311ba38b2c1852c7ea4f9f88e10aa985e162e7ae2e424e0a0ebd761b21f678 + languageName: node + linkType: hard + +"repeating@npm:^2.0.0": + version: 2.0.1 + resolution: "repeating@npm:2.0.1" + dependencies: + is-finite: "npm:^1.0.0" + checksum: eb19209a3c9bd0762e71832f4f54df5e2f7a4f78d8b622fc46bcdc15772b7f880bf1762d1d3566adfaa8b37f243b5e0f83eaa279b2381af762b71c97b6cc186c + languageName: node + linkType: hard + +"request@npm:^2.79.0, request@npm:^2.85.0": + version: 2.88.2 + resolution: "request@npm:2.88.2" + dependencies: + aws-sign2: "npm:~0.7.0" + aws4: "npm:^1.8.0" + caseless: "npm:~0.12.0" + combined-stream: "npm:~1.0.6" + extend: "npm:~3.0.2" + forever-agent: "npm:~0.6.1" + form-data: "npm:~2.3.2" + har-validator: "npm:~5.1.3" + http-signature: "npm:~1.2.0" + is-typedarray: "npm:~1.0.0" + isstream: "npm:~0.1.2" + json-stringify-safe: "npm:~5.0.1" + mime-types: "npm:~2.1.19" + oauth-sign: "npm:~0.9.0" + performance-now: "npm:^2.1.0" + qs: "npm:~6.5.2" + safe-buffer: "npm:^5.1.2" + tough-cookie: "npm:~2.5.0" + tunnel-agent: "npm:^0.6.0" + uuid: "npm:^3.3.2" + checksum: 0b6b8f79ddd55bd51d820b9b8f8c3c16945173e7605de652c300bcff5814b576b7f8fd6538fa9a0c886249fbbeb83d5e4424d9baf6fd4e3332e9a803e6b03319 + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 1b1289dc30006e3c6576dd899ed812921f680d652005118cfabcf5d0679e885ff19a6659219e6705571a6ba7f4278f24d93b17f7e7e9ba28dc4b38e256f35d61 + languageName: node + linkType: hard + +"require-from-string@npm:^1.1.0": + version: 1.2.1 + resolution: "require-from-string@npm:1.2.1" + checksum: 67b8563ae86d38128a35aa56bbc8dc7d7d7db9dc66b585976b6486e6c9d24ec6d732c66616aaac5ce155093ae624c35f4c2963d40b3f6e9110ba53008b25c932 + languageName: node + linkType: hard + +"require-from-string@npm:^2.0.0, require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: 3cd7be0f2b19d49ef2ec59c27cc9dbd64343c950c744651d8e31651026585d5da581df35be7a9b825f00921bf134d619fea292360dabbae11da2c211f2b601f2 + languageName: node + linkType: hard + +"require-main-filename@npm:^1.0.1": + version: 1.0.1 + resolution: "require-main-filename@npm:1.0.1" + checksum: 2d3242f26e1df0859bbe672730eb583f07db46d6efc738e49719566c0b9e0a9bda087dfff8a54bd0adc7ae503963a3b2373bd367973fa70e3627e99866cba14c + languageName: node + linkType: hard + +"requireindex@npm:~1.1.0": + version: 1.1.0 + resolution: "requireindex@npm:1.1.0" + checksum: 79b7b30a92d1f2c51e998f90d385636826e7269e7b84ac89dd8b52e12d7213dfbec192e0191b8effff33157f4dd52f334ada615ef910e18a4c647e2c15728881 + languageName: node + linkType: hard + +"resolve-alpn@npm:^1.0.0": + version: 1.2.1 + resolution: "resolve-alpn@npm:1.2.1" + checksum: e3dfc6bc87269e25615e15afb7c96d8f0c35f64ef9f03ddc7524b05d09c3b6ed5377679aa6fc4fb7e057d8799e2a9b82f12a691212a8bfcd7c26e353bfecb14c + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: bc0ec65a95fae7d644cdb0f14e010c2cbde74d0844232542912f8343a20d66fc30a7b400391a0f118a710b9bc10078a0a13d8444a555f44c00023b3220249865 + languageName: node + linkType: hard + +"resolve-url@npm:^0.2.1": + version: 0.2.1 + resolution: "resolve-url@npm:0.2.1" + checksum: 04512ab3c357b92f86ea4a3852af8e3bbcdd845bfe7385ab229af5ae3d6ff61df664bc99915581660e0630e03a53c361637d03cc711be601072c5f1aa7c7d6ba + languageName: node + linkType: hard + +"resolve@npm:1.17.0": + version: 1.17.0 + resolution: "resolve@npm:1.17.0" + dependencies: + path-parse: "npm:^1.0.6" + checksum: 94995bf00e72b42ef3ecd5405021ac13c097b5420f760f1443dd85c21525484c28d1dc83ac71679ecb5e99dc07cd30f2dc9f13e95cdfe8a013051057521e61fc + languageName: node + linkType: hard + +"resolve@npm:^1.10.0, resolve@npm:^1.8.1, resolve@npm:~1.22.1": + version: 1.22.3 + resolution: "resolve@npm:1.22.3" + dependencies: + is-core-module: "npm:^2.12.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: bf0ce0162ee1b5a2dfe29e982b67fb0867911972ffba9a6903bb2c0c11e6c8eb7db7de5344645f84df7f9ba2a19438d373ddddf3a3125ececba719fccd40dd18 + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A1.17.0#optional!builtin": + version: 1.17.0 + resolution: "resolve@patch:resolve@npm%3A1.17.0#optional!builtin::version=1.17.0&hash=c3c19d" + dependencies: + path-parse: "npm:^1.0.6" + checksum: d92ca94a9d357429954e1546d0e71eb431c8e5e3dfc699ca6bf0564d165e3dfbf3ec7af6c6180935df9bd77dddd73a411bc9a4c1edb9ca1d74202487a5ede901 + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.8.1#optional!builtin, resolve@patch:resolve@npm%3A~1.22.1#optional!builtin": + version: 1.22.3 + resolution: "resolve@patch:resolve@npm%3A1.22.3#optional!builtin::version=1.22.3&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.12.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 9b982fd1fdbcca23f58d4d97df35bf1182eaccad96df6d8bbc4e9006616c382a10d7617e039a540cc86291e5247ddbb7cda9cceb1fd35688b03b03864b5d4360 + languageName: node + linkType: hard + +"responselike@npm:^1.0.2": + version: 1.0.2 + resolution: "responselike@npm:1.0.2" + dependencies: + lowercase-keys: "npm:^1.0.0" + checksum: 239215386286b670a236114a7a1a9b87f901faceffc3aa97ee6ab51fb7ce70262a17b9821e59f816966919ef95c6bd8a57975b1dfdd429c0932cee4344bc50ec + languageName: node + linkType: hard + +"responselike@npm:^2.0.0": + version: 2.0.1 + resolution: "responselike@npm:2.0.1" + dependencies: + lowercase-keys: "npm:^2.0.0" + checksum: 630d53fc31717a5a8cd634d4844feb41e70be4c3d01ffc79a9964b289a978ffefed09c70bd71d7006e74e27ed274e7f8f5bf09b0cf333e562e6ef2505ac3f4e5 + languageName: node + linkType: hard + +"resumer@npm:~0.0.0": + version: 0.0.0 + resolution: "resumer@npm:0.0.0" + dependencies: + through: "npm:~2.3.4" + checksum: 181c12c9f1e66bb8a6ed2c8c5c632b8286f07349dad67600d594111b3caab01c361807eff7d4ac4c7201eebde5a61ddda656b27efc86374650a7b2d77b7f7cdf + languageName: node + linkType: hard + +"ret@npm:~0.1.10": + version: 0.1.15 + resolution: "ret@npm:0.1.15" + checksum: d65bd0cc83122e33a284e87ff9b51f553e5da3d05b0643740a0c07189f6025972a70856e794bdae3d8cdfb36bc8c05a3aad3935bdadbd20bdaa1789b70a21e8c + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 1c3616bdf89aa6f887bcca2b86603c255f4b497577f6a54f33262f4f314b8516d65e251f717b45e2a5ec234359999015a9e2263b38467544188210327e638ac3 + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: 3d0f10293851d5a50453257bb837ad973b046fc51fa489c46f3a480e0e3a9cf249babb30a493ad5f802a71510b2ee4e65a4609a644f98b3413575ab707f841d7 + languageName: node + linkType: hard + +"rimraf@npm:^2.2.8, rimraf@npm:^2.6.3": + version: 2.7.1 + resolution: "rimraf@npm:2.7.1" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: ./bin.js + checksum: 35e2f6ca89242c02380f70895af2caf2b8a31e5a9b05b380ebf0aa5f48005ec9d242eb4fb32d8578a34c42dc012d16866dfc0e0d0b8601ec8c72ff7065755f19 + languageName: node + linkType: hard + +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: bin.js + checksum: b786c9ad52df9fbcd9c7120e105f3150b83b39dd87d9235a93b0c7e806575e1e68936504ff64563dbe67b3f8bbbc00bdfff586157d402ee8990e7143456511c0 + languageName: node + linkType: hard + +"ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1": + version: 2.0.2 + resolution: "ripemd160@npm:2.0.2" + dependencies: + hash-base: "npm:^3.0.0" + inherits: "npm:^2.0.1" + checksum: 4541eb0cc604d08c00681d03e1648911d52a2c0f944df01673420c1bf7f94722e0b604e40a7c5bf1a037efbcf4de906235ed3e6ae0f7b967eab66bec8eff8436 + languageName: node + linkType: hard + +"rlp@npm:^2.0.0, rlp@npm:^2.2.1, rlp@npm:^2.2.2, rlp@npm:^2.2.3, rlp@npm:^2.2.4": + version: 2.2.7 + resolution: "rlp@npm:2.2.7" + dependencies: + bn.js: "npm:^5.2.0" + bin: + rlp: bin/rlp + checksum: b3cdf5caafaabe6bdb507c81cf4358fc7045c67a03dc1628a1b91fd56af7dad689835fc92f580884a66591457d8ea99793e7b82137d5f338ed28d936b2f140de + languageName: node + linkType: hard + +"run-parallel-limit@npm:^1.1.0": + version: 1.1.0 + resolution: "run-parallel-limit@npm:1.1.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: 5aa3d57fc301a3938b824aadafda219abb7bbdc3b63a9c9fd64a37aa8cc5614ee7069e755102619e2558f751fb455b632add76c8b83a5ebea43437b4c1f8dffd + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: 45bff4f6664ae79b8653ebd32c6e9e9e37139683f7bd1d54d5a05c409c9d167ece16c9b7e36a99ac4bb7a08b5f72b4084a1e08eba443bc6e2ca9044ef972752c + languageName: node + linkType: hard + +"rustbn.js@npm:~0.2.0": + version: 0.2.0 + resolution: "rustbn.js@npm:0.2.0" + checksum: 9e30c3bf2e19dd342105e85c80427a661314f513f3a6e5adb1f97c8f8f59f58104d22ed64421e914422e31d6f498926312c9bbebdcff37267aa96e3e63510806 + languageName: node + linkType: hard + +"safe-array-concat@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-array-concat@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.0" + has-symbols: "npm:^1.0.3" + isarray: "npm:^2.0.5" + checksum: 107c4e75daaa4a0adbd59e9eafb31b1531f51f254fcb0f97b0e0effae88461dbb525eeec881455e73b420642338528e3c7797c890d51315c7629bfe065cafd27 + languageName: node + linkType: hard + +"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: da8a21b3336a21c152eb3ba8ab41acde5772644f026d4b6e5f9fd8afa4f0cf407c113b19a362580fab9aea8beea295465432fc7684f9ff38aac559bb1b5528cd + languageName: node + linkType: hard + +"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: 86939c6de6b62c1d39b7da860a56d5e50ede9b0ab35a91b0620bff8a96f1f798084ff910059f605087c2c500dc23dfdf77ff5bc3bcc8d4d38e3d634de2e3e426 + languageName: node + linkType: hard + +"safe-event-emitter@npm:^1.0.1": + version: 1.0.1 + resolution: "safe-event-emitter@npm:1.0.1" + dependencies: + events: "npm:^3.0.0" + checksum: 9bc6d4636479b96225b3e6a58d7d6259efcb7022f10754a2831dedbabf3d34e27d6b2aabc1b7e8597b320f01df1416d70b0b8977685467aca9777b8caa0434bf + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-regex-test@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.1.3" + is-regex: "npm:^1.1.4" + checksum: f7d330e0337cc12ba90dbf88d2f5815106149226c4741a9b5a906aa453f77bc9862570d5b58ca26f20c03807e8e30ed70e5d087fdf2e547da2c0cccaca58931a + languageName: node + linkType: hard + +"safe-regex@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex@npm:1.1.0" + dependencies: + ret: "npm:~0.1.10" + checksum: 6bd6b882088cc0cd2d1dc3dabe1c85edb6f324975b8641b72419afaab3edfa641e8a27f6f5fef8ab2c5aa17527dc07d53da53d3dccbc6fe1fbe8540814175289 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.0.2, safer-buffer@npm:^2.1.0, safer-buffer@npm:~2.1.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: d4199666e9e792968c0b88c2c35dd400f56d3eecb9affbcf5207922822eadf30cc06995bae3c5d0a653851bbd40fc0af578bf046bbf734199ce22433ba4da659 + languageName: node + linkType: hard + +"scrypt-js@npm:3.0.1, scrypt-js@npm:^3.0.0, scrypt-js@npm:^3.0.1": + version: 3.0.1 + resolution: "scrypt-js@npm:3.0.1" + checksum: e2745db7ddc933ac6b73267adaa3f498c56651b26981131494f54eab15295dd8494a0420765092b8d67d3712a0bcb68be40de1f0d5eecbd3798f969f2d4fd591 + languageName: node + linkType: hard + +"scryptsy@npm:^1.2.1": + version: 1.2.1 + resolution: "scryptsy@npm:1.2.1" + dependencies: + pbkdf2: "npm:^3.0.3" + checksum: 60967f0273ff182fc5466cf563edaa02d7e171b89f3ea299dba9c933ac95a7d12c5005f02952babbb83f97a9c7323833615cce336aea94c2491fdc7d41cfbc45 + languageName: node + linkType: hard + +"secp256k1@npm:^4.0.1": + version: 4.0.3 + resolution: "secp256k1@npm:4.0.3" + dependencies: + elliptic: "npm:^6.5.4" + node-addon-api: "npm:^2.0.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.2.0" + checksum: f67a7e2b6e6d02502d425015b09da74382cf33043c733f4d0d5c32b9f243b47fe930fb4df258d5937e84373f1bf7b9073bbf330fab654ca8f0a24a2e25af6007 + languageName: node + linkType: hard + +"seedrandom@npm:3.0.1": + version: 3.0.1 + resolution: "seedrandom@npm:3.0.1" + checksum: b412d7dbeb7b4efd6756fd733a78e59e108424746295a9455ad1b38f038eac2dbbac84c306d7e9d77b6bf18ba24a0328c33fce26bdb466d6d067a93708467370 + languageName: node + linkType: hard + +"semaphore@npm:>=1.0.1, semaphore@npm:^1.0.3, semaphore@npm:^1.1.0": + version: 1.1.0 + resolution: "semaphore@npm:1.1.0" + checksum: 9dd69bd580723b26547d7aab4e5d6042f65e22d8055dbd51cef9fadcc564603b1591b5d0267545772541d845e89647c51388a4b7bdfe5f72c04de3e2af1b683c + languageName: node + linkType: hard + +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.3.0, semver@npm:^5.5.0, semver@npm:^5.6.0": + version: 5.7.1 + resolution: "semver@npm:5.7.1" + bin: + semver: ./bin/semver + checksum: e1d12140b695aeb8917978d134ff3f8fee33489a5eaf6b217111ab0b14cbf45f36753d510db4dfbdc5a6f304e053ff1a4995c5498e9734ad9bf98182e4f39704 + languageName: node + linkType: hard + +"semver@npm:^6.3.0": + version: 6.3.0 + resolution: "semver@npm:6.3.0" + bin: + semver: ./bin/semver.js + checksum: 18f3d42ec70a542e9efc498ecc3d0b9b088099115e8658b49d2bfc6470b46a6144b294374dac3f343fe1600039cbd80d5e830dd356053fd5abd4f1af5118a928 + languageName: node + linkType: hard + +"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7": + version: 7.5.1 + resolution: "semver@npm:7.5.1" + dependencies: + lru-cache: "npm:^6.0.0" + bin: + semver: bin/semver.js + checksum: 20fce7894334634f553a64334b21fa2dc7cccd08a5f31122c187f1c1d3e45b8fc47d599d3fa52342c3fb3ee0bd139a8fbd41bc5b9e849ada8f7e7cc91b18a180 + languageName: node + linkType: hard + +"semver@npm:~5.4.1": + version: 5.4.1 + resolution: "semver@npm:5.4.1" + bin: + semver: ./bin/semver + checksum: 13c701f61417373b412f1360ee5c8f47797052192736e622af238791569469ef57c9f742b49583cceba8127490cfbdfa4472bd74c3d5e93435373663382e64c4 + languageName: node + linkType: hard + +"send@npm:0.18.0": + version: 0.18.0 + resolution: "send@npm:0.18.0" + dependencies: + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + mime: "npm:1.6.0" + ms: "npm:2.1.3" + on-finished: "npm:2.4.1" + range-parser: "npm:~1.2.1" + statuses: "npm:2.0.1" + checksum: 670f134b35017d77ae82b02f04f5529651c4970887a5ffc581f003ed3858f8bda991eb1213e3b94f3c98acdcfc6a16cf83b58d330892662efe41d1d0d7993838 + languageName: node + linkType: hard + +"serialize-javascript@npm:6.0.0": + version: 6.0.0 + resolution: "serialize-javascript@npm:6.0.0" + dependencies: + randombytes: "npm:^2.1.0" + checksum: c54759aaf8581cc1509e838a9a1eb340b0addaf8103f1d7795af0cd2319475e43cc31793fbe2db72aa8059a93218dc22b79ae8277b0e69de474a4f79800cf54f + languageName: node + linkType: hard + +"serve-static@npm:1.15.0": + version: 1.15.0 + resolution: "serve-static@npm:1.15.0" + dependencies: + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + parseurl: "npm:~1.3.3" + send: "npm:0.18.0" + checksum: 38b4b126ef7497103b0466c1b876e2ad9732d3a32a905ef6b54681525802a2defba6e8e48c136f68c666e48f8c2dc869d24060b0a83f1dbdf724632cccf072fe + languageName: node + linkType: hard + +"servify@npm:^0.1.12": + version: 0.1.12 + resolution: "servify@npm:0.1.12" + dependencies: + body-parser: "npm:^1.16.0" + cors: "npm:^2.8.1" + express: "npm:^4.14.0" + request: "npm:^2.79.0" + xhr: "npm:^2.3.3" + checksum: cfb075cbb52afd8253b5b79c58340b5294883491a0f91baae047162db1461385088fe8a24f506de58a603ca5eb6fb836f5dbcf1c6027c36cebee698848dd9e26 + languageName: node + linkType: hard + +"set-blocking@npm:^2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: 9e8f5aeb7cd850a60b5dbf47d42051137c14f58f375d9a70ca227b797d6ffed3dabf659587d2f183231085f1da2dc3067e2af9f5fcd66fb65c98da5fb54a22fb + languageName: node + linkType: hard + +"set-immediate-shim@npm:^1.0.1": + version: 1.0.1 + resolution: "set-immediate-shim@npm:1.0.1" + checksum: 3a848c57105de7b36bc0f17cad38839cfd7239af8e9bc6987e9d0b22094f4854e6b1065d7bb928060da4a04be21d81e070c00c9f988bd23c1c1bdb33b0e5a273 + languageName: node + linkType: hard + +"set-value@npm:^2.0.0, set-value@npm:^2.0.1": + version: 2.0.1 + resolution: "set-value@npm:2.0.1" + dependencies: + extend-shallow: "npm:^2.0.1" + is-extendable: "npm:^0.1.1" + is-plain-object: "npm:^2.0.3" + split-string: "npm:^3.0.1" + checksum: 272c54bf66c4c3457fa5d950a1f7067f17264726cc0a3a393e98d3529f14475598949ed6801ed26ccaa38787be3e5e41e86a0dc492275916e6a00957214e7d68 + languageName: node + linkType: hard + +"setimmediate@npm:^1.0.5": + version: 1.0.5 + resolution: "setimmediate@npm:1.0.5" + checksum: 915f34e42dbc1602fee8407784b4775ff88087ba84a05a069c15711dc7b23e9d6fd514ede7133c8496525afe41c343f1827a6f8f50e925c962b853594a60ac26 + languageName: node + linkType: hard + +"setprototypeof@npm:1.2.0": + version: 1.2.0 + resolution: "setprototypeof@npm:1.2.0" + checksum: ba389f4722581d9070df0a323a29501254594a97fee0e9308e73372f9856dbdb37fff71a0fef1e31c48901384544260d12925b791477e0101d7a68a6e28c23cf + languageName: node + linkType: hard + +"sha.js@npm:^2.4.0, sha.js@npm:^2.4.8": + version: 2.4.11 + resolution: "sha.js@npm:2.4.11" + dependencies: + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + bin: + sha.js: ./bin.js + checksum: c95a5988bc29c4bf645ed67f1eaa8a841cb6332914bd87f63f8f7b83460671878226be0af9eccf28b61dd1746c594c8ce46af1907c77568382b5fe3b84f2dc13 + languageName: node + linkType: hard + +"shallowequal@npm:^1.1.0": + version: 1.1.0 + resolution: "shallowequal@npm:1.1.0" + checksum: 9ffaad8074fc1ff1b0ac6b58b8d3f000daa86d8ad1a3122d0dbf218ec777e3c5d2c753223684b46c1b886a66bc9fcd5cfea811e8bb39964220e05845182ae17a + languageName: node + linkType: hard + +"shebang-command@npm:^1.2.0": + version: 1.2.0 + resolution: "shebang-command@npm:1.2.0" + dependencies: + shebang-regex: "npm:^1.0.0" + checksum: 22bfaefc4193bb9cf3dd02e4661ef1e48e0b1f126f402811a51fc3c9aff417274e0555909635c45d0aeed0b4aead7084dca9cc9bd5a925fcc873e3e6b4878f65 + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: 5907a8d5facbefbd4dc8d21778d2136d5d22d61b5526452d92d46662614f0ed57090e7adf7184fe9d2d5ef75af9f05d7573437e10b37f2e6fdeeeb5f59fd9ada + languageName: node + linkType: hard + +"shebang-regex@npm:^1.0.0": + version: 1.0.0 + resolution: "shebang-regex@npm:1.0.0" + checksum: a8b6ff5f472cdcc7b1a1fc32d7a867f0f31915fd959000ff220566b40d723f440d43c68203a4d729b28fb500c3e84b943b4ea77e04d76cd16a034ca59043e923 + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 6be1588a86ed74d05481d09a6ef6a8db44550fda9785ae08c3df06717abc2e5e9a11804b1d0ac9b0641870c5ebf545e18c8d348bc105ba09227e6a32415ea1d6 + languageName: node + linkType: hard + +"side-channel@npm:^1.0.4": + version: 1.0.4 + resolution: "side-channel@npm:1.0.4" + dependencies: + call-bind: "npm:^1.0.0" + get-intrinsic: "npm:^1.0.2" + object-inspect: "npm:^1.9.0" + checksum: d712a4e682471c1a1c7bf9294a8bb0f066566e016de11fdb01ae0c0ebf8102c97cc2b2d3b0264ca377eb2d3444bf4c06909392c518a162f047b7444608e0e9a2 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.7": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: 5cf7525c55a72d8d104d914acf2e470f74b2c156197277ad7b331bc5de3d8790170fed3c82ff98c7c31adaa8ff941bfd5ba44f55171cbe8ed0e939fa82a8322a + languageName: node + linkType: hard + +"simple-concat@npm:^1.0.0": + version: 1.0.1 + resolution: "simple-concat@npm:1.0.1" + checksum: 1a041737314d8b49247072adf25990fa56430c2f71f3c129013fa275e0d725d935c2e2ca33bd10c22f1391047a8a94e01db3c149bda30b8e2480a833c99b9a30 + languageName: node + linkType: hard + +"simple-get@npm:^2.7.0": + version: 2.8.2 + resolution: "simple-get@npm:2.8.2" + dependencies: + decompress-response: "npm:^3.3.0" + once: "npm:^1.3.1" + simple-concat: "npm:^1.0.0" + checksum: c49348cfe108413181be7d486f6948fc7913927b67e39245b8dddcd015afb768f07e22253a8bf2e6300717db79451301c9705c0c8f91df7a6867cdb462674c71 + languageName: node + linkType: hard + +"slash@npm:^1.0.0": + version: 1.0.0 + resolution: "slash@npm:1.0.0" + checksum: e0e05887dc446179ac39db0676990170778ffde456354cd5798fba7765cfffcd27ac046f99063ef2382338dbee7686043eca21e479b682c3f909f93d2b964a7e + languageName: node + linkType: hard + +"slash@npm:^2.0.0": + version: 2.0.0 + resolution: "slash@npm:2.0.0" + checksum: e53840c4398131459758dcad3ed7f44346198f432f7c7ed96d75b750d3e1814a02368e10252bb3ee312bc87379359887ce0783a91a2a391121c52cef93411ac8 + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: b88a0f1086e3cd20c8b61f50d8afff5fba83f95167a86432f54387565c9424e5d1970612371f768c128ed4b5b1c427120382bafc8c9edf0b3737eb226b733687 + languageName: node + linkType: hard + +"slice-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "slice-ansi@npm:4.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + astral-regex: "npm:^2.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + checksum: ba7c41e1dd5b9dffe4cdf661d0abf3a746917965ec9022126b21380b4a8afd9bbbab6a7407b1d843b94431fdbb30c841e0d325a3afeeb269255c9cdfb5584259 + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: 898a5ce4651108164625916aa54b6f7c13e86279a31dd321737d27c4b795cfaaeb1c30417f8809029d80d20710d8a5045998afd35e0f1080b32648f5670aa99b + languageName: node + linkType: hard + +"snapdragon-node@npm:^2.0.1": + version: 2.1.1 + resolution: "snapdragon-node@npm:2.1.1" + dependencies: + define-property: "npm:^1.0.0" + isobject: "npm:^3.0.0" + snapdragon-util: "npm:^3.0.1" + checksum: 3f2894034cf8f282cad54dab688807eca9eb3d38cee0a503fa0fb7c33896a4f38b84519ec65bdae83651512529f07fd589c535c543fcfbcd87e2d40173a1dbb1 + languageName: node + linkType: hard + +"snapdragon-util@npm:^3.0.1": + version: 3.0.1 + resolution: "snapdragon-util@npm:3.0.1" + dependencies: + kind-of: "npm:^3.2.0" + checksum: 31a4a34b89c37e0bb1c328d83718de19a4d19e999a4fad426beda60bb4730cb5fa43448fa359eb9e3ef0c2933682bc76f1e63434059e67591d0cb02c9c43996b + languageName: node + linkType: hard + +"snapdragon@npm:^0.8.1": + version: 0.8.2 + resolution: "snapdragon@npm:0.8.2" + dependencies: + base: "npm:^0.11.1" + debug: "npm:^2.2.0" + define-property: "npm:^0.2.5" + extend-shallow: "npm:^2.0.1" + map-cache: "npm:^0.2.2" + source-map: "npm:^0.5.6" + source-map-resolve: "npm:^0.5.0" + use: "npm:^3.1.0" + checksum: b110aefa2367ecfd85a874a10a1104e2e058613b51793b678e43c3e35a0e2c183f6b641c6e79f35a9f7150526ebce65dc5dc0102deaedd540c6cb334ed364250 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "socks-proxy-agent@npm:7.0.0" + dependencies: + agent-base: "npm:^6.0.2" + debug: "npm:^4.3.3" + socks: "npm:^2.6.2" + checksum: d57c2c68a2c16a2ac0af30971e1c4899e80cab3bbe405fe2fa3fce26ccd007fe855110b97c0e6d96ddc56926e1e5927a868070cb09185a768d1ad8cbe1a68aa5 + languageName: node + linkType: hard + +"socks@npm:^2.6.2": + version: 2.7.1 + resolution: "socks@npm:2.7.1" + dependencies: + ip: "npm:^2.0.0" + smart-buffer: "npm:^4.2.0" + checksum: a8026d6abfcd168a661240848f6989fbba66276e8fa97ff1cb1079c2f3c6907dcc8284fcbc4f6d3fee8d071afb4fc8313da7e5fbf6d8768f206347a671f1542b + languageName: node + linkType: hard + +"solc@npm:0.7.3": + version: 0.7.3 + resolution: "solc@npm:0.7.3" + dependencies: + command-exists: "npm:^1.2.8" + commander: "npm:3.0.2" + follow-redirects: "npm:^1.12.1" + fs-extra: "npm:^0.30.0" + js-sha3: "npm:0.8.0" + memorystream: "npm:^0.3.1" + require-from-string: "npm:^2.0.0" + semver: "npm:^5.5.0" + tmp: "npm:0.0.33" + bin: + solcjs: solcjs + checksum: 57410f69fd40f2789cda5c083cfcb5a519d627906daff4394333aaacd83ab60bc351e1f02be98673a2699e01022a281c87e83c295cfdcbf771820f94e1336db7 + languageName: node + linkType: hard + +"solc@npm:^0.4.20": + version: 0.4.26 + resolution: "solc@npm:0.4.26" + dependencies: + fs-extra: "npm:^0.30.0" + memorystream: "npm:^0.3.1" + require-from-string: "npm:^1.1.0" + semver: "npm:^5.3.0" + yargs: "npm:^4.7.1" + bin: + solcjs: solcjs + checksum: 000e6a4fdf1ce5e4db521befecb32c0986cb0f8f6c6755e4d0674e640a7040a30dffd843fd9b5f26fdd4a8b3bbb42f3b19c05401eb22e0f93fe82108257e09a3 + languageName: node + linkType: hard + +"solc@npm:^0.6.3": + version: 0.6.12 + resolution: "solc@npm:0.6.12" + dependencies: + command-exists: "npm:^1.2.8" + commander: "npm:3.0.2" + fs-extra: "npm:^0.30.0" + js-sha3: "npm:0.8.0" + memorystream: "npm:^0.3.1" + require-from-string: "npm:^2.0.0" + semver: "npm:^5.5.0" + tmp: "npm:0.0.33" + bin: + solcjs: solcjs + checksum: 16e8fd19d26d5900a8c4f975bb5266693ab6d416b34fdc750f763afe9dadbfc45ef4e7d9d14018c3f4f4ac8748ce56cb86a7513b8ee641c42fc119b1e981553f + languageName: node + linkType: hard + +"solhint-plugin-prettier@npm:^0.0.4": + version: 0.0.4 + resolution: "solhint-plugin-prettier@npm:0.0.4" + dependencies: + prettier-linter-helpers: "npm:^1.0.0" + peerDependencies: + prettier: ^1.15.0 + prettier-plugin-solidity: ^1.0.0-alpha.14 + checksum: 946aca14a9d4a7d36c2f55399cf06539aa6f6ed0a5a3d73f97bd87b121390f5a61562ed9ece800548c76c2a997af600d2a946bf78a3c951a94c09501a82a6ef6 + languageName: node + linkType: hard + +"solhint@npm:^3.2.0": + version: 3.4.1 + resolution: "solhint@npm:3.4.1" + dependencies: + "@solidity-parser/parser": "npm:^0.16.0" + ajv: "npm:^6.12.6" + antlr4: "npm:^4.11.0" + ast-parents: "npm:^0.0.1" + chalk: "npm:^4.1.2" + commander: "npm:^10.0.0" + cosmiconfig: "npm:^8.0.0" + fast-diff: "npm:^1.2.0" + glob: "npm:^8.0.3" + ignore: "npm:^5.2.4" + js-yaml: "npm:^4.1.0" + lodash: "npm:^4.17.21" + pluralize: "npm:^8.0.0" + prettier: "npm:^2.8.3" + semver: "npm:^6.3.0" + strip-ansi: "npm:^6.0.1" + table: "npm:^6.8.1" + text-table: "npm:^0.2.0" + dependenciesMeta: + prettier: + optional: true + bin: + solhint: solhint.js + checksum: 5a53ae84a6d4316fe42b8f3508b58fc516ed3773805123be9cfe40cc392d7a001611af124fbe5a06698bc26610fa424fe5eba4baa0e9d7b18f730e36049342af + languageName: node + linkType: hard + +"solidity-comments-darwin-arm64@npm:0.0.2": + version: 0.0.2 + resolution: "solidity-comments-darwin-arm64@npm:0.0.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"solidity-comments-darwin-x64@npm:0.0.2": + version: 0.0.2 + resolution: "solidity-comments-darwin-x64@npm:0.0.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"solidity-comments-freebsd-x64@npm:0.0.2": + version: 0.0.2 + resolution: "solidity-comments-freebsd-x64@npm:0.0.2" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"solidity-comments-linux-arm64-gnu@npm:0.0.2": + version: 0.0.2 + resolution: "solidity-comments-linux-arm64-gnu@npm:0.0.2" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"solidity-comments-linux-arm64-musl@npm:0.0.2": + version: 0.0.2 + resolution: "solidity-comments-linux-arm64-musl@npm:0.0.2" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"solidity-comments-linux-x64-gnu@npm:0.0.2": + version: 0.0.2 + resolution: "solidity-comments-linux-x64-gnu@npm:0.0.2" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"solidity-comments-linux-x64-musl@npm:0.0.2": + version: 0.0.2 + resolution: "solidity-comments-linux-x64-musl@npm:0.0.2" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"solidity-comments-win32-arm64-msvc@npm:0.0.2": + version: 0.0.2 + resolution: "solidity-comments-win32-arm64-msvc@npm:0.0.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"solidity-comments-win32-ia32-msvc@npm:0.0.2": + version: 0.0.2 + resolution: "solidity-comments-win32-ia32-msvc@npm:0.0.2" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"solidity-comments-win32-x64-msvc@npm:0.0.2": + version: 0.0.2 + resolution: "solidity-comments-win32-x64-msvc@npm:0.0.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"solidity-comments@npm:^0.0.2": + version: 0.0.2 + resolution: "solidity-comments@npm:0.0.2" + dependencies: + solidity-comments-darwin-arm64: "npm:0.0.2" + solidity-comments-darwin-x64: "npm:0.0.2" + solidity-comments-freebsd-x64: "npm:0.0.2" + solidity-comments-linux-arm64-gnu: "npm:0.0.2" + solidity-comments-linux-arm64-musl: "npm:0.0.2" + solidity-comments-linux-x64-gnu: "npm:0.0.2" + solidity-comments-linux-x64-musl: "npm:0.0.2" + solidity-comments-win32-arm64-msvc: "npm:0.0.2" + solidity-comments-win32-ia32-msvc: "npm:0.0.2" + solidity-comments-win32-x64-msvc: "npm:0.0.2" + dependenciesMeta: + solidity-comments-darwin-arm64: + optional: true + solidity-comments-darwin-x64: + optional: true + solidity-comments-freebsd-x64: + optional: true + solidity-comments-linux-arm64-gnu: + optional: true + solidity-comments-linux-arm64-musl: + optional: true + solidity-comments-linux-x64-gnu: + optional: true + solidity-comments-linux-x64-musl: + optional: true + solidity-comments-win32-arm64-msvc: + optional: true + solidity-comments-win32-ia32-msvc: + optional: true + solidity-comments-win32-x64-msvc: + optional: true + checksum: 888919f80a6280e6f10d276feb63ca75857fc938549830d0b702c6271042ec307025c19ea29b4bea47efa043086e3e4bc71a760338446fc2b31f308678977e12 + languageName: node + linkType: hard + +"source-map-resolve@npm:^0.5.0": + version: 0.5.3 + resolution: "source-map-resolve@npm:0.5.3" + dependencies: + atob: "npm:^2.1.2" + decode-uri-component: "npm:^0.2.0" + resolve-url: "npm:^0.2.1" + source-map-url: "npm:^0.4.0" + urix: "npm:^0.1.0" + checksum: 6d112dffb945452a1825e62f57e23a90e0e1132ec0705da2483bec5f8543bb5788d3616dd77ac037f455b43850d23af94ee595b948d9aaf2145d8c92c07d89b9 + languageName: node + linkType: hard + +"source-map-support@npm:0.5.12": + version: 0.5.12 + resolution: "source-map-support@npm:0.5.12" + dependencies: + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: 1fcf0365f241bde5d6aebb1909005606ce1f1b0cb21323bf47af07022be0c4f7aee40ca1e506f938b6860c323837d7ab543caade333c7efa417f4632acc2adea + languageName: node + linkType: hard + +"source-map-support@npm:^0.4.15": + version: 0.4.18 + resolution: "source-map-support@npm:0.4.18" + dependencies: + source-map: "npm:^0.5.6" + checksum: a2d71e33f312cd056773b723a04b85fdb49df23b4e18a6b798999301e1af28b0bfab0b947a06cdb88bf1ffd8a6a6720b3ad1596a4cfae6e1c5911283d2e3285a + languageName: node + linkType: hard + +"source-map-support@npm:^0.5.13, source-map-support@npm:^0.5.16": + version: 0.5.21 + resolution: "source-map-support@npm:0.5.21" + dependencies: + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: ab0f9bfbcfc32018966a7199de5aeafee03a38408852400962d302392aab16d670dc84e6eda937570c5ff09972ae23347804cdffc5fe3c5e382a5b04cee3d580 + languageName: node + linkType: hard + +"source-map-url@npm:^0.4.0": + version: 0.4.1 + resolution: "source-map-url@npm:0.4.1" + checksum: dafa9f0ae5a0c6f3bcdb6b3d96770e45bd75917429475200a8d36894b2366566350b00a9839892e12c2da8bff49629d266b4476efdd7ceec033f968347461770 + languageName: node + linkType: hard + +"source-map@npm:^0.5.6, source-map@npm:^0.5.7": + version: 0.5.7 + resolution: "source-map@npm:0.5.7" + checksum: fd1c3c795c360e43fed3f7e80ff227c2156dbe3c69d20a9bf9c4b299a1cbe412cb6f9561fc6f636496f1bf44a28a06edcc0fb4a16de17db903481a063683f45a + languageName: node + linkType: hard + +"source-map@npm:^0.6.0": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: cba9f44c3a4a0485f44a7760ebe427eecdd3b58011ae0459c05506b54f898835b2302073d6afa563a19b60ee9e54c82e33bc4a032e28bebacdfc635f1d0bf7e0 + languageName: node + linkType: hard + +"spdx-correct@npm:^3.0.0": + version: 3.2.0 + resolution: "spdx-correct@npm:3.2.0" + dependencies: + spdx-expression-parse: "npm:^3.0.0" + spdx-license-ids: "npm:^3.0.0" + checksum: b3e7916d0a96140468e69e4085f303f755fcd3c91f1a18acf59d4fa0b31ebf81acf106fc0ecb973a65be167d96cdb7ddd9130636ae0c89fb525f6cf4f29314ad + languageName: node + linkType: hard + +"spdx-exceptions@npm:^2.1.0": + version: 2.3.0 + resolution: "spdx-exceptions@npm:2.3.0" + checksum: d0cca65b4f9fadbe3a2e29f42a79e1ce41ae914683be6bb3f86de69cf21751f89b5c349fcee29818c4fb1c4ae036bce2f31abaeb7b8432634ab35804570da0b6 + languageName: node + linkType: hard + +"spdx-expression-parse@npm:^3.0.0": + version: 3.0.1 + resolution: "spdx-expression-parse@npm:3.0.1" + dependencies: + spdx-exceptions: "npm:^2.1.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 3872b862c119e7ea292abbf1f9e58f2c07f5c9aedbf4604f635b9fa7ead3b9267864df506bf70c2b4b47e11ac634094e6a8d68feeadf78e1ca9bcc2fd104de08 + languageName: node + linkType: hard + +"spdx-license-ids@npm:^3.0.0": + version: 3.0.13 + resolution: "spdx-license-ids@npm:3.0.13" + checksum: 5e43d82f557b290127ccacd41af7ece79d1c98cdf68ba347b814e76cf2f2970ff2ce87c5306f0ea2df3b5629f0d1dfc0f35a33a396432cfb9fdbffe2124e7ac1 + languageName: node + linkType: hard + +"split-string@npm:^3.0.1, split-string@npm:^3.0.2": + version: 3.1.0 + resolution: "split-string@npm:3.1.0" + dependencies: + extend-shallow: "npm:^3.0.0" + checksum: 00f7ed7c1fde384dc5ad2c8cc8bec2d7470e707350ef9f4842ec46a6cf493134830f5d34060c474e07263b13789726af1def165cc1f9eccf6a5fa65cabbd1962 + languageName: node + linkType: hard + +"sshpk@npm:^1.7.0": + version: 1.17.0 + resolution: "sshpk@npm:1.17.0" + dependencies: + asn1: "npm:~0.2.3" + assert-plus: "npm:^1.0.0" + bcrypt-pbkdf: "npm:^1.0.0" + dashdash: "npm:^1.12.0" + ecc-jsbn: "npm:~0.1.1" + getpass: "npm:^0.1.1" + jsbn: "npm:~0.1.0" + safer-buffer: "npm:^2.0.2" + tweetnacl: "npm:~0.14.0" + bin: + sshpk-conv: bin/sshpk-conv + sshpk-sign: bin/sshpk-sign + sshpk-verify: bin/sshpk-verify + checksum: 4160f860f7d754dbd4f5d0b197d1d743cbce1d1fd48752d0d039e6f9668ea917d6caa79a77ada20b80af530214a85c6fe052e2b78d82525374b3cf6efc92332a + languageName: node + linkType: hard + +"ssri@npm:^9.0.0": + version: 9.0.1 + resolution: "ssri@npm:9.0.1" + dependencies: + minipass: "npm:^3.1.1" + checksum: ec9e6fbb74ccb030391fc33aa1a8373014f1cdde570e389cf25f201604d6889035fc8b4409a6e8e787d75ddad892839c0e5a4ea6b67e7ab91f3c619e5e6e087a + languageName: node + linkType: hard + +"stacktrace-parser@npm:^0.1.10": + version: 0.1.10 + resolution: "stacktrace-parser@npm:0.1.10" + dependencies: + type-fest: "npm:^0.7.1" + checksum: 83c8ef8c37b00fe43a970264907821da16a5d3e35e5f78ab01f3819a53a2414c3f39509cb41870d382d463e4adef7751ef6f90e55a841c91e39cebd58b8d80cf + languageName: node + linkType: hard + +"static-extend@npm:^0.1.1": + version: 0.1.2 + resolution: "static-extend@npm:0.1.2" + dependencies: + define-property: "npm:^0.2.5" + object-copy: "npm:^0.1.0" + checksum: 33081dbfbd4600a2cd9dbabb501eccd7f934d0d57c23bf559d546e100fbf4f791e150aa7506577576e2d7892c7da0816eeac074ee0406f42cf502d6d367d875f + languageName: node + linkType: hard + +"statuses@npm:2.0.1": + version: 2.0.1 + resolution: "statuses@npm:2.0.1" + checksum: a7e9d41901245a442e77b339f715d77ac113c03ab9434d9f81ae45d75ed3437d9824e601ae1a834ad3e471ae3fc78d3c00decec5e826c91552a58d4c38833ecf + languageName: node + linkType: hard + +"stream-to-pull-stream@npm:^1.7.1": + version: 1.7.3 + resolution: "stream-to-pull-stream@npm:1.7.3" + dependencies: + looper: "npm:^3.0.0" + pull-stream: "npm:^3.2.3" + checksum: 93af5651ec832a57eedca15e417a05006965efa9045e6598f0abce032b366fdd9dc8fce2ea3cdaa806752be8bdad3445bb5196786ed962e5414de84a227c78f1 + languageName: node + linkType: hard + +"streamsearch@npm:^1.1.0": + version: 1.1.0 + resolution: "streamsearch@npm:1.1.0" + checksum: 8d7c4b5046cf7ff528421d6e2ee0d8335da82a34edca4c58e2022390f4f73be1c83deeb14010bf939bb71e7990bd06367ca0382b3c6df1b932ecb1b98bb50e22 + languageName: node + linkType: hard + +"strict-uri-encode@npm:^1.0.0": + version: 1.1.0 + resolution: "strict-uri-encode@npm:1.1.0" + checksum: 812e860eb6451bd8329347aada33c7477570d6eccbb5080a7d9bc2d51e27b1d9eb760ba068a96b8518d24fb3de3152d5509f6b399083f3ab8da9c55e8fef7b3e + languageName: node + linkType: hard + +"string-width@npm:^1.0.1": + version: 1.0.2 + resolution: "string-width@npm:1.0.2" + dependencies: + code-point-at: "npm:^1.0.0" + is-fullwidth-code-point: "npm:^1.0.0" + strip-ansi: "npm:^3.0.0" + checksum: 956c33f6e7da724d0b3f40c810f0a83f2384912c9e3d18baa09715d5891181af1da57ac9b2ab13a0264ec696899ca203f84fad910e0b2b43f1472d89bd20e8fb + languageName: node + linkType: hard + +"string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: aa0f3e082b461e0dc8c54334ef2c748b777e7529c34d348ee16e69690da45e24f223804d94060633126462e2aa4906d6fbfab882f34036a9f4ccd3dbcd2d6931 + languageName: node + linkType: hard + +"string.prototype.trim@npm:^1.2.7, string.prototype.trim@npm:~1.2.7": + version: 1.2.7 + resolution: "string.prototype.trim@npm:1.2.7" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.1.4" + es-abstract: "npm:^1.20.4" + checksum: 424e6ba5ec9778a637c225c2c06461882367fa91e03b30ab78a50b275ec95e6516f25cb44439e1b98d43931a4a1d9d023bd5d2dd0f9b203d468b541b7ea205f5 + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.6": + version: 1.0.6 + resolution: "string.prototype.trimend@npm:1.0.6" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.1.4" + es-abstract: "npm:^1.20.4" + checksum: 0c6b262932e2f065b4097fd3b17254b8fa2ac953f26d190e4defa2f01bca3313067c6672ff8b853f66edc2b4743af196f00ecd3c75f131d53fa772b16692cbf8 + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.6": + version: 1.0.6 + resolution: "string.prototype.trimstart@npm:1.0.6" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.1.4" + es-abstract: "npm:^1.20.4" + checksum: 87a4f42e4c0bde3508cb8d95260919c73ae4af5573fdbca1cd173d9ce53153d83b0fc3d218d49b9cabdca440ae71cd44b85a659cddd477b27b3f1344dc023a65 + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: "npm:~5.2.0" + checksum: c6b892bdb15861a68c4f9599bdff3909c70b1a2cee73d226a235b8fbadfc0aa060bdd265cb3fd86e856cee6d98cd0d657f84098cb51241f4fae19d0cacf9e13e + languageName: node + linkType: hard + +"string_decoder@npm:~0.10.x": + version: 0.10.31 + resolution: "string_decoder@npm:0.10.31" + checksum: c0df2eeebb3ced68782bf566226ecac0343fcca909139f97d94290a786e503754c9454c3736cc68daed84af696d5c5330e4243965a89fb8dd34383bbdb7c6258 + languageName: node + linkType: hard + +"string_decoder@npm:~1.1.1": + version: 1.1.1 + resolution: "string_decoder@npm:1.1.1" + dependencies: + safe-buffer: "npm:~5.1.0" + checksum: 385c6f229dc54d087d10279049fbc75b0e648dd56ee63dbf15a526975947875fe2b41e0e26addc2e6f2c6e517753a77cfb05338e61d76ac44f49387e7238e025 + languageName: node + linkType: hard + +"strip-ansi@npm:^3.0.0, strip-ansi@npm:^3.0.1": + version: 3.0.1 + resolution: "strip-ansi@npm:3.0.1" + dependencies: + ansi-regex: "npm:^2.0.0" + checksum: 9ea89aab5ee05cd6b64bf8c919acf0d7b923d7bbb7a8a678b7b5cfb2b0a92cda18a35e1f16d04c5c00d1eb509c06383687ea2039dd8591ce83b8861602a67114 + languageName: node + linkType: hard + +"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 056ca08f8097351060572eee207ec66247937d7248780a3d643b5eed7d6b5ca6a0990a4f921ffd329e8e9b66427a384237892ac3cb47463adf7d040b154084ec + languageName: node + linkType: hard + +"strip-bom@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-bom@npm:2.0.0" + dependencies: + is-utf8: "npm:^0.2.0" + checksum: e1f3e056932a02ed1302aa20e87cadfd3933789e00a10ad6ded932d44acd8972df40fcde899b210e16a72c670d3e7d1ee4e3fa4241f0c1625c8549b1ccc79247 + languageName: node + linkType: hard + +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 115a5e3d9edddfd0f719604747ccb28c47ffb46a914a854e5430af163ef9965aba377b90a692531310e53c72191733c791fbf1751ae5b2bbe492c169fd759314 + languageName: node + linkType: hard + +"strip-hex-prefix@npm:1.0.0": + version: 1.0.0 + resolution: "strip-hex-prefix@npm:1.0.0" + dependencies: + is-hex-prefixed: "npm:1.0.0" + checksum: 876e60e6156147435ce989637bd0bd453d12583c4a4140f1926ce0294ec51ef363dfa29bf50bf10384f293216a5982cbf29148ce78c95574bc5de7c65a603075 + languageName: node + linkType: hard + +"strip-json-comments@npm:3.1.1, strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 20cff3f15267a8b603c4dcec9c3cc5217bcf3f1a66481a4f9ecf262eacc1733a0457756288472328d24efef7705f7755e9511f9c383742389add93d4a9207ae5 + languageName: node + linkType: hard + +"supports-color@npm:8.1.1": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 3fe58a405502d866f7611fe1926cac2410d6aac87658b3aac94b70617576586270d2ec758ae975ca3ba20556a1c013330c820b59a85f983d322a47cd28118b2c + languageName: node + linkType: hard + +"supports-color@npm:^2.0.0": + version: 2.0.0 + resolution: "supports-color@npm:2.0.0" + checksum: f8bfce9d3a1058fac863f974becb7e819c71cd6d27edc738fcc31c638aed2852fa6f334673b2154b3d63529ce01fd1ec066ef4981c3bbce28046324939e011e6 + languageName: node + linkType: hard + +"supports-color@npm:^5.3.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: "npm:^3.0.0" + checksum: 2eca8c4c8fccd2bd0027af240f85e99b1c9cb221186288dd478ce0fc61bdc07394e47f1bba2c91fe3ae432764772e3639e9c48bef19817267f151ae4a9b9ebef + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 9218cc0d12c57f4ae213e6ace98e0cda2d8f47617300f21501a0078e17d9e3b4aa3effdc1006e369dfd5389ff4f99682b9617d4a8fb7566e2964955dd14d4cc3 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 14609489b044de2eaffe0e7549173bb39d6997510ac4b7279d07bf2aafe309205abe172a8c8d248062a24e32ab61a2ae85efc5b4cdf7f932c7cdbe81ca1f39ec + languageName: node + linkType: hard + +"swarm-js@npm:^0.1.40": + version: 0.1.42 + resolution: "swarm-js@npm:0.1.42" + dependencies: + bluebird: "npm:^3.5.0" + buffer: "npm:^5.0.5" + eth-lib: "npm:^0.1.26" + fs-extra: "npm:^4.0.2" + got: "npm:^11.8.5" + mime-types: "npm:^2.1.16" + mkdirp-promise: "npm:^5.0.1" + mock-fs: "npm:^4.1.0" + setimmediate: "npm:^1.0.5" + tar: "npm:^4.0.2" + xhr-request: "npm:^1.0.1" + checksum: d52fd8972372047547c216a65bf3b325f585d15a633e66fab91ec0a95e4e45a315e93d77e70ae8e362fcbf6d75ce313c10e7b7065cf1a985d87d7fc5ba9c9241 + languageName: node + linkType: hard + +"table@npm:^6.8.0, table@npm:^6.8.1": + version: 6.8.1 + resolution: "table@npm:6.8.1" + dependencies: + ajv: "npm:^8.0.1" + lodash.truncate: "npm:^4.4.2" + slice-ansi: "npm:^4.0.0" + string-width: "npm:^4.2.3" + strip-ansi: "npm:^6.0.1" + checksum: 8b59fd3096ae1884a9e42dbe2253ec5f6b917d7d299095c288ecf39feec0027672e07cee53a90fa42e015c7c7d5b43f64c1a9028969f46c7fd7d97ed5cb5407e + languageName: node + linkType: hard + +"tape@npm:^4.6.3": + version: 4.16.2 + resolution: "tape@npm:4.16.2" + dependencies: + call-bind: "npm:~1.0.2" + deep-equal: "npm:~1.1.1" + defined: "npm:~1.0.1" + dotignore: "npm:~0.1.2" + for-each: "npm:~0.3.3" + glob: "npm:~7.2.3" + has: "npm:~1.0.3" + inherits: "npm:~2.0.4" + is-regex: "npm:~1.1.4" + minimist: "npm:~1.2.7" + object-inspect: "npm:~1.12.3" + resolve: "npm:~1.22.1" + resumer: "npm:~0.0.0" + string.prototype.trim: "npm:~1.2.7" + through: "npm:~2.3.8" + bin: + tape: bin/tape + checksum: 6b8c2ededaa97212c16391babd1fb93538cb9902d0b882df5b5b1a34801489b0e79d5eb16220e23408c68eebf9d0fd273f17199daf797243629b7fc397ae97b1 + languageName: node + linkType: hard + +"tar@npm:^4.0.2": + version: 4.4.19 + resolution: "tar@npm:4.4.19" + dependencies: + chownr: "npm:^1.1.4" + fs-minipass: "npm:^1.2.7" + minipass: "npm:^2.9.0" + minizlib: "npm:^1.3.3" + mkdirp: "npm:^0.5.5" + safe-buffer: "npm:^5.2.1" + yallist: "npm:^3.1.1" + checksum: 56fe5b9e8fa056538bffcce25ecc403f018853bbf21fef3b629f50fb3072be1e9b3091fb7efc131e52780fc2a42aade08266da572c24b3d4980691bd6f7eee7a + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.1.2": + version: 6.1.14 + resolution: "tar@npm:6.1.14" + dependencies: + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + minipass: "npm:^5.0.0" + minizlib: "npm:^2.1.1" + mkdirp: "npm:^1.0.3" + yallist: "npm:^4.0.0" + checksum: 5aeff09f5651983534cb7be7f8692ca202b0027c5a799d7037a863f1a1a2ecfdcc2e1358261d9a39459fca7b5bab7f35a0ee118de4bad8c07103d22edb661ec0 + languageName: node + linkType: hard + +"test-value@npm:^2.1.0": + version: 2.1.0 + resolution: "test-value@npm:2.1.0" + dependencies: + array-back: "npm:^1.0.3" + typical: "npm:^2.6.0" + checksum: 3ba9bff2935f19e1ff689851e9b6790cc9c45c2ac759b8b870701c3a22ef966837dc15ce210223e91291a4e58e9573e6c0718d0a7f2ce1d4937c58c61d302fe0 + languageName: node + linkType: hard + +"testrpc@npm:0.0.1": + version: 0.0.1 + resolution: "testrpc@npm:0.0.1" + checksum: 1d0584aeb307a7716349e6d694f0570fb6ba647231a021a3202b1b86b237ea5723ac63e3d3fb1418b3d364d9cfd1de2b1945e3e83484d8436fc3f26aeeadc775 + languageName: node + linkType: hard + +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: 65e9ab9cd26946c5378cd4b8782562f47e017bad4fe8d398356380fdc762d08b177ca6a1c5c8deac14fbe974c46cd09c0cbb86560545cfa49800f3fcacb0c952 + languageName: node + linkType: hard + +"through2@npm:^2.0.3": + version: 2.0.5 + resolution: "through2@npm:2.0.5" + dependencies: + readable-stream: "npm:~2.3.6" + xtend: "npm:~4.0.1" + checksum: d3858dcef8a86805319d8022e5b87d3ee91c983250bd1a1771f354b9181ce33e06d0f9c1635d2fbc1a017b22f893a23db50d6053fa2933042f4c022bf0195f14 + languageName: node + linkType: hard + +"through@npm:~2.3.4, through@npm:~2.3.8": + version: 2.3.8 + resolution: "through@npm:2.3.8" + checksum: c9d6883ace26b3c967283827cafdd4ceee6164fa4d3754865f5032dcb564e0cbdea9dc6f43806afa51e1f2863d8e3beca141cbf7b8dcff989982aef69bb851c0 + languageName: node + linkType: hard + +"timed-out@npm:^4.0.1": + version: 4.0.1 + resolution: "timed-out@npm:4.0.1" + checksum: 4c77d7ae4fd56280897a45e1611c51d52a0ba8e4c98b94fb69fac016fbffaae16ae189ce7980284f995f38315ff21497a45f12ed98389815de9229df02c11a4f + languageName: node + linkType: hard + +"tmp@npm:0.0.33, tmp@npm:^0.0.33": + version: 0.0.33 + resolution: "tmp@npm:0.0.33" + dependencies: + os-tmpdir: "npm:~1.0.2" + checksum: 0800f6e40216bf17e4ecd68f507e4325829723e3db7a1b9ebcfdd28e49d6061a222942265d97251f72c03ced281cf53b42e55f9f9f5135a811fc2294b05a184c + languageName: node + linkType: hard + +"tmp@npm:0.1.0": + version: 0.1.0 + resolution: "tmp@npm:0.1.0" + dependencies: + rimraf: "npm:^2.6.3" + checksum: 1d171df43ec79e2e3007d5b9ff14585eb1afa2abb3877b5761d2560a83323c0d189c9f137e788e5bc37f6a92de1008b39f55fedd547ce33779b0bc490674ecb6 + languageName: node + linkType: hard + +"to-fast-properties@npm:^1.0.3": + version: 1.0.3 + resolution: "to-fast-properties@npm:1.0.3" + checksum: 99b3da7d55577fb8a6d176297dfa3e6e6a815cbc386cd0d5bb48ff42ea3829c920c0e502dc3d14183ea553befb7304784c83d6d1a20a889a68f5731cdd1e3d52 + languageName: node + linkType: hard + +"to-object-path@npm:^0.3.0": + version: 0.3.0 + resolution: "to-object-path@npm:0.3.0" + dependencies: + kind-of: "npm:^3.0.2" + checksum: 9ba07c02471b80b1d9a6f6b8a6f7f67523d6a163e5d875c1a7517ac9ba06163f630e29b4bd7970270ba4343352c4933ff43755906aed3d1100799c28f17d3089 + languageName: node + linkType: hard + +"to-readable-stream@npm:^1.0.0": + version: 1.0.0 + resolution: "to-readable-stream@npm:1.0.0" + checksum: b6d75eb778554cdef26728feef0066d32b81e84a448e9eac1be5b0cad80f46508f42046ee7eae5be3500412dc96ed3323d23e8432d3a75173c057d29c8263af4 + languageName: node + linkType: hard + +"to-regex-range@npm:^2.1.0": + version: 2.1.1 + resolution: "to-regex-range@npm:2.1.1" + dependencies: + is-number: "npm:^3.0.0" + repeat-string: "npm:^1.6.1" + checksum: 0bd7383a3afc95e52d7b480945525df3f99c5e0c8921ef8bc102de4324d374940d7ff3cd12e0792e7ceeb80a77f4fc3dadab834369484cc3ad2a211d117c07c7 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: "npm:^7.0.0" + checksum: 16564897c76bbd25bd3c375ee8d4b1fd3ac965fc4ab550ff034a1dddb53816ec06dc27095468394ad4de5978d5e831a9d1ae4cb31080dc4ebd9ba80a47dc1a4f + languageName: node + linkType: hard + +"to-regex@npm:^3.0.1, to-regex@npm:^3.0.2": + version: 3.0.2 + resolution: "to-regex@npm:3.0.2" + dependencies: + define-property: "npm:^2.0.2" + extend-shallow: "npm:^3.0.2" + regex-not: "npm:^1.0.2" + safe-regex: "npm:^1.1.0" + checksum: c1fa63f38c3fcfb9b5c0a50ca57cb29e46069ffd4428b6e32ad20e60b0c7af5dc8044641a554ad0a50ba9f262aacf9f9a3c290bdccb7c0bc0d47fc484f2a1c5b + languageName: node + linkType: hard + +"toidentifier@npm:1.0.1": + version: 1.0.1 + resolution: "toidentifier@npm:1.0.1" + checksum: ed889234ceb442c0d5f87ab3f2a8fc0679800baa41766c0d9ce1bb82c700052fd6cf5d1656e1304de13d7a7d5974962fedc1bbe9a0e4686c3d8743c716c7dd5f + languageName: node + linkType: hard + +"tough-cookie@npm:~2.5.0": + version: 2.5.0 + resolution: "tough-cookie@npm:2.5.0" + dependencies: + psl: "npm:^1.1.28" + punycode: "npm:^2.1.1" + checksum: 93504e7af3f117ea2feb8ae14f16931430f0ed94a4d0242d7f8efb9ac16e970731bd660242dd7f0afa20b750eb97affd5053cfc8302f77714d123a7b6f4d60b8 + languageName: node + linkType: hard + +"tr46@npm:~0.0.3": + version: 0.0.3 + resolution: "tr46@npm:0.0.3" + checksum: c670667f2df1c0983b48ee7e81d6013ab304f73573e9e4292233821b2219504307bedffc303c32df30813a9138114b8b084c81dea94fb68f08aca7770af98578 + languageName: node + linkType: hard + +"trim-right@npm:^1.0.1": + version: 1.0.1 + resolution: "trim-right@npm:1.0.1" + checksum: 478b7d2d54ecfc244898fb38555319100216f1615b7798d7c49ce83719d814c1c041281b5d24abce79e832eb4605c899844bf5146417eafa0014365c07b2cabd + languageName: node + linkType: hard + +"ts-essentials@npm:^1.0.0": + version: 1.0.4 + resolution: "ts-essentials@npm:1.0.4" + checksum: 8cab546969caf9409a7d2f4b908d944d1bad828044f78df1c40fc2fb237d129534521cb9d83accee0904bcf19cccdb30be64c52fb78992c0411efc29d998f71f + languageName: node + linkType: hard + +"ts-essentials@npm:^6.0.3": + version: 6.0.7 + resolution: "ts-essentials@npm:6.0.7" + peerDependencies: + typescript: ">=3.7.0" + checksum: fd05e240c08dfb0c3f33ff86d1f775ac8672f93675d8cec4b571f77e7e02ec951797fb5a031c6e95d95f04ea3088833ed5f1da5197db2f0bf9a0d09f64fe634a + languageName: node + linkType: hard + +"ts-generator@npm:^0.1.1": + version: 0.1.1 + resolution: "ts-generator@npm:0.1.1" + dependencies: + "@types/mkdirp": "npm:^0.5.2" + "@types/prettier": "npm:^2.1.1" + "@types/resolve": "npm:^0.0.8" + chalk: "npm:^2.4.1" + glob: "npm:^7.1.2" + mkdirp: "npm:^0.5.1" + prettier: "npm:^2.1.2" + resolve: "npm:^1.8.1" + ts-essentials: "npm:^1.0.0" + bin: + ts-generator: dist/cli/run.js + checksum: aee32fb98aeb993616d7b7531461c92ca06fc0856b0ebf0d07e7a71bca1140f3755c7f44223473a3791dddff745ebe6568840d11a55cf0dc8b22fb560194bf30 + languageName: node + linkType: hard + +"ts-node@npm:^10.9.1": + version: 10.9.1 + resolution: "ts-node@npm:10.9.1" + dependencies: + "@cspotcode/source-map-support": "npm:^0.8.0" + "@tsconfig/node10": "npm:^1.0.7" + "@tsconfig/node12": "npm:^1.0.7" + "@tsconfig/node14": "npm:^1.0.0" + "@tsconfig/node16": "npm:^1.0.2" + acorn: "npm:^8.4.1" + acorn-walk: "npm:^8.1.1" + arg: "npm:^4.1.0" + create-require: "npm:^1.1.0" + diff: "npm:^4.0.1" + make-error: "npm:^1.1.1" + v8-compile-cache-lib: "npm:^3.0.1" + yn: "npm:3.1.1" + 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 + 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 + checksum: c4caff4b9bb7a3a44adbb64a38786ce4203c2ebceb8b5373b504d0826cf047f9f23105767a3e130e2f4078629f592a8332cfd8ee1061b57b7d159de49c7d8f6f + languageName: node + linkType: hard + +"tsconfig-paths@npm:^4.1.2": + version: 4.2.0 + resolution: "tsconfig-paths@npm:4.2.0" + dependencies: + json5: "npm:^2.2.2" + minimist: "npm:^1.2.6" + strip-bom: "npm:^3.0.0" + checksum: 928381dcd0d66a99e71ca21211f585e9af371c18a5578ad83cb36a12caf84023bbb826545349e3c64f916291c9a80d177f4adb24d77d463cef91fb64cccee189 + languageName: node + linkType: hard + +"tslib@npm:^1.8.1, tslib@npm:^1.9.3": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: 441af59dc42ad4ae57140e62cb362369620c6076845c2c2b0ecc863c1d719ce24fdbc301e9053433fef43075e061bf84b702318ff1204b496a5bba10baf9eb9f + languageName: node + linkType: hard + +"tsort@npm:0.0.1": + version: 0.0.1 + resolution: "tsort@npm:0.0.1" + checksum: 76c755fec27273903d49844c80344de9b0eb1d1cca9913b764f8988a4fedef9231a75854e4f273959b3ec89fdb7555191cca2e3674a4d0d760cd4e8c5720a93b + languageName: node + linkType: hard + +"tsutils@npm:^3.21.0": + version: 3.21.0 + resolution: "tsutils@npm:3.21.0" + dependencies: + tslib: "npm:^1.8.1" + peerDependencies: + typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + checksum: 723459d516fe94cd9f798436e9424357200f0cccd2804c3240dbe3d2f51fd85207110a756bb46ae0b0b6bd9420083a048e2b3d44a6534224cc34e5821d8aba7f + languageName: node + linkType: hard + +"tunnel-agent@npm:^0.6.0": + version: 0.6.0 + resolution: "tunnel-agent@npm:0.6.0" + dependencies: + safe-buffer: "npm:^5.0.1" + checksum: 04bb1f31a4f757d78547536d3c58bf7d24645735ecc5af75536cf9ee46e8d4d8c802518a16062d9c07f78874946dd2ea600d2df42e5c538cdd9a414994bce54d + languageName: node + linkType: hard + +"tweetnacl-util@npm:^0.15.0, tweetnacl-util@npm:^0.15.1": + version: 0.15.1 + resolution: "tweetnacl-util@npm:0.15.1" + checksum: 8f9bf160c4912bed92ab294a2a0f2e9e427a1cbc0c5c40f732dd6dcc2e3f01df54d1c4557c3707f6f85fb3d9e3fda9c8b2c486977bd78e7ef2a2130bbdc97ea6 + languageName: node + linkType: hard + +"tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": + version: 0.14.5 + resolution: "tweetnacl@npm:0.14.5" + checksum: bd01b852653d25afd67c3145b4241f93db1fda9753b78d3d848f3eed5f32af4f1e49b6cd44571b32b0498d18a7344ff4033d6b1f76c3732c8cf4b85049f9cf49 + languageName: node + linkType: hard + +"tweetnacl@npm:^1.0.0, tweetnacl@npm:^1.0.3": + version: 1.0.3 + resolution: "tweetnacl@npm:1.0.3" + checksum: e6d5730951ebcb2bf67874dd9f70de3e049a3c58d0b0bc5cc70e888fbd253f77e5bab00aea42fb71b605c42807542edda807f00ecdc29324f2154049fc5a341a + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: "npm:^1.2.1" + checksum: 20afe001f1e32be931a04d1ae0529cf48e5e848cc89bb5a98904481916aa04fb4aa61e795cd94dad4f9b8daf7024bc97b90ac7f24885f0797c3f3c0a096bbece + languageName: node + linkType: hard + +"type-detect@npm:^4.0.0, type-detect@npm:^4.0.5": + version: 4.0.8 + resolution: "type-detect@npm:4.0.8" + checksum: 2d2111a44529a381e9be7090066cc89b60ac2c822194e3d213a0d5f630e81abfd07d2b91a324ef4a173973c5b0c68b0bdf29ac6896459cf819914a6f56199e0f + languageName: node + linkType: hard + +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 9f39d342df851a98443ee9858345a8943bb71ffbf35eee36a2716ba601e810b46294a98ee78b39376120c349d6b2631979cb91afc8be6ea41b8d04eddc55f4d5 + languageName: node + linkType: hard + +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: b64cd677e7d579f929d8d14bccdad0ca5da9013124f11457ce9cc255e3141dd453128a46fed2e03f38c0c2319853118edcfb118d1f4e4f09091f6bbdb91ce467 + languageName: node + linkType: hard + +"type-fest@npm:^0.7.1": + version: 0.7.1 + resolution: "type-fest@npm:0.7.1" + checksum: a9b93075cd8a2795f3f94a2932da68d75024b16e92fe6a8e772354814e4fd6793a3945311cc4c4ae268a38e94741c454e79e74fa58ecdb69939e47d80b2b3e34 + languageName: node + linkType: hard + +"type-is@npm:~1.6.18": + version: 1.6.18 + resolution: "type-is@npm:1.6.18" + dependencies: + media-typer: "npm:0.3.0" + mime-types: "npm:~2.1.24" + checksum: 1cf58e1d0c2129201bee6abe8029f5dda621f86a1094955b6510c9baf879a45f725b2e19c7dc1f04a623a0edd8f3cc39cc4d4899287c805b6b1177c961f46564 + languageName: node + linkType: hard + +"type@npm:^1.0.1": + version: 1.2.0 + resolution: "type@npm:1.2.0" + checksum: a86e9a842ca3c1fb124ecd7ff26671224d56dde9105e341a106bb68808524c75a7bf892d184378763fa5e2e6098761f483d334a5f0bea56b2dbfd19be5b02d1a + languageName: node + linkType: hard + +"type@npm:^2.7.2": + version: 2.7.2 + resolution: "type@npm:2.7.2" + checksum: 1b6ec885f5acae713f69fa19007d50f89de616fff3f3e2efb9752a52a70c649ecb1457ad156c8c1962fc9e9dad7e7a60ff437aac258b5cb758417c82403bf294 + languageName: node + linkType: hard + +"typechain@npm:^3.0.0": + version: 3.0.0 + resolution: "typechain@npm:3.0.0" + dependencies: + command-line-args: "npm:^4.0.7" + debug: "npm:^4.1.1" + fs-extra: "npm:^7.0.0" + js-sha3: "npm:^0.8.0" + lodash: "npm:^4.17.15" + ts-essentials: "npm:^6.0.3" + ts-generator: "npm:^0.1.1" + bin: + typechain: ./dist/cli/cli.js + checksum: 8f941739300a3afc0144620a11f190f2fd7e393ee3bfaf62da6c9d37cbcfaf0ea1bd6594888e592e2da0abc3006448204a843dc714cddde99a2047bc87045f40 + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-length@npm:1.0.4" + dependencies: + call-bind: "npm:^1.0.2" + for-each: "npm:^0.3.3" + is-typed-array: "npm:^1.1.9" + checksum: bd196be0cb6c267e1fc8c3d54f19c1059d1082e0baf0f6735b39ed2a01e9dd2fef0593b1b03e0bdb9c29d1e6e34bbb1498f951a19b4c78bc5c7af6786fc3c6b6 + languageName: node + linkType: hard + +"typedarray-to-buffer@npm:^3.1.5": + version: 3.1.5 + resolution: "typedarray-to-buffer@npm:3.1.5" + dependencies: + is-typedarray: "npm:^1.0.0" + checksum: 77dee0df8aedfbe8916f6a6a06d720ff15c5846ee6f1d7097a5421906a3d99be61cd93099de4fb93bc7a6f9b7e9bcb7d25b7c7a71a5f63d00dae2f222f7a5d9d + languageName: node + linkType: hard + +"typedarray@npm:^0.0.6": + version: 0.0.6 + resolution: "typedarray@npm:0.0.6" + checksum: b0b2ee8d06d5827891346d2db9929fdbd2f719ef5b55afed90f5e48b36fc49df0f8280daf362a05b3d971972e13779011dd501b5a53bd36f938ae88f6b8552cb + languageName: node + linkType: hard + +"typescript@npm:^4.3.2": + version: 4.9.5 + resolution: "typescript@npm:4.9.5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 550217a465c00b1d7ef0e0ddc3a6a0b2ae1fd7c1b9f53cde5a1cfe56aa457c7a43fa83792c1b98b2185d2156d0467c9ad6f6600515ad4f4fc2acee54c4bd320e + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^4.3.2#optional!builtin": + version: 4.9.5 + resolution: "typescript@patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 0b1a831cfef3e967a806ff1d4b28cfe4d3b71d06195ae0c8ece14c6353ec20165ae9b79c18be93ecd33529690648189aef56234c88b26aadb500b81ddb902cfc + languageName: node + linkType: hard + +"typewise-core@npm:^1.2, typewise-core@npm:^1.2.0": + version: 1.2.0 + resolution: "typewise-core@npm:1.2.0" + checksum: 75ee97e1412fb62adc8d5c9be3814d06a5a99c58479124606cb6f243ff7eca3f6eae3554595b92fb9d65a84e5b7c2baf090ad26616259672719f9976bbe8e31b + languageName: node + linkType: hard + +"typewise@npm:^1.0.3": + version: 1.0.3 + resolution: "typewise@npm:1.0.3" + dependencies: + typewise-core: "npm:^1.2.0" + checksum: b0bb72944df8f2a9ef13e1c4ad4bc9a7b393245536f6aef441357b2a69bdd35fb234a8359911294f6d5419f35c468c7f754dd9d43e92e40e1826004b6574c41d + languageName: node + linkType: hard + +"typewiselite@npm:~1.0.0": + version: 1.0.0 + resolution: "typewiselite@npm:1.0.0" + checksum: f67fc170049581b79bbb4e888130568c641547040967aefc704bdb44fe95dea986ddd848c2604a5329eb9bc2b3a72297e038ee8000276b832f976519275679a7 + languageName: node + linkType: hard + +"typical@npm:^2.6.0, typical@npm:^2.6.1": + version: 2.6.1 + resolution: "typical@npm:2.6.1" + checksum: d1521ec43bf426e3b20290d19603c99e55c933424f2a80deb4ee8302699984851a0ae6d043111fc3208936d4b201231fd29b235183ff111c750d80967d187821 + languageName: node + linkType: hard + +"ultron@npm:~1.1.0": + version: 1.1.1 + resolution: "ultron@npm:1.1.1" + checksum: 1230950bbd0e065333b4ace9021486dea62e69266d10b0121db56c8b1dff8a6694e8c8e38aeaf9cfededddfd7ebaefca7b81fcc0253b8779eafc64f631f305fc + languageName: node + linkType: hard + +"unbox-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "unbox-primitive@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + has-bigints: "npm:^1.0.2" + has-symbols: "npm:^1.0.3" + which-boxed-primitive: "npm:^1.0.2" + checksum: de21ca5e49bb56d46c7d3672d3d2900b3859ee9541903993bca02a94a317ec1c720b316f025bf5c0f51f7ff9ad383782970acae0408b900ae0537727f614c4e1 + languageName: node + linkType: hard + +"underscore@npm:1.9.1": + version: 1.9.1 + resolution: "underscore@npm:1.9.1" + checksum: 3e3ac75ecb8f84e5dd174981528294a924d9699f782372cbc91c54b2faf7b771ec7aefead3872843ad134a88b04138c364514aed26321097b7e6e76937a82220 + languageName: node + linkType: hard + +"undici@npm:^5.14.0": + version: 5.22.1 + resolution: "undici@npm:5.22.1" + dependencies: + busboy: "npm:^1.6.0" + checksum: 7c5ef3a35037fffff17511fd16712241a7a3cda3d6713434f73c4aa4660d66821649a0a3e95c65016b16566b3912af0ab6481b3afd7414d40872ab3babb2cfb3 + languageName: node + linkType: hard + +"union-value@npm:^1.0.0": + version: 1.0.1 + resolution: "union-value@npm:1.0.1" + dependencies: + arr-union: "npm:^3.1.0" + get-value: "npm:^2.0.6" + is-extendable: "npm:^0.1.1" + set-value: "npm:^2.0.1" + checksum: 22551b59265711bc6df4852c6cf1dd463d46c18ed3ba6cc867c0b92258065f4d81176894c8c42342c67e947c880979ff24e4f83ca929a09db8885ea9dbaddb0b + languageName: node + linkType: hard + +"unique-filename@npm:^2.0.0": + version: 2.0.1 + resolution: "unique-filename@npm:2.0.1" + dependencies: + unique-slug: "npm:^3.0.0" + checksum: 1efaebd1b9df4770537f73b040adc8ef2b7da29b837388d97d6d78a4a739dc67bc491e45d381a377bc80ee838e7e1dc904193b3e73cd6c117d96f92b3a09ed46 + languageName: node + linkType: hard + +"unique-slug@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-slug@npm:3.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: ae31bb1d8126400e512385ec239b3ca40f6a8790af9d6dedb0842b340b3ecc0a7de413ff270f3ea3dae1565c6f745ab6e28363387cd32ecddbe0fc72ee247303 + languageName: node + linkType: hard + +"universalify@npm:^0.1.0": + version: 0.1.2 + resolution: "universalify@npm:0.1.2" + checksum: 056559913f6c9524fc385e576b6d5cfd3435712073ff864aa90b169fd612e2e64af67b29048f49a1a08f6ced01e056353457c63120c54e68c1b725f9e7b79975 + languageName: node + linkType: hard + +"universalify@npm:^2.0.0": + version: 2.0.0 + resolution: "universalify@npm:2.0.0" + checksum: 243b0697a640cda1912e62a79f9439ec24b937df9a9a47ee7dd5fe813c4547300a3dc346e0c7c10dbd925f54a19507e8de915f2562a5e694716bdcd0825d48f6 + languageName: node + linkType: hard + +"unorm@npm:^1.3.3": + version: 1.6.0 + resolution: "unorm@npm:1.6.0" + checksum: c687cece550966e0515e813db098d7504b2ba22103702120cf544e28d5ae1c5118a656708f24e12a16bd66185f5b12fce07cdca4274c7a79f9dc07d084d7de22 + languageName: node + linkType: hard + +"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": + version: 1.0.0 + resolution: "unpipe@npm:1.0.0" + checksum: 0504c357ea2fced264cd144bb1c3e44515a22ea8003eb3c35d3dabcb67181b023febec6bfa6fc6d863877bc556ae5939ede1c26d81a7dfd4a8f06b16bd091ea5 + languageName: node + linkType: hard + +"unset-value@npm:^1.0.0": + version: 1.0.0 + resolution: "unset-value@npm:1.0.0" + dependencies: + has-value: "npm:^0.3.1" + isobject: "npm:^3.0.0" + checksum: cba24229fd6400ebe89d2ab14d81f6cfd6d373977ec5986e9acf3cdfd88c7400b57b652d0806dccfbe446395f8ba19b6715ecf79623b619477cd815e82aed255 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 284fedd1b11512a77e783bfd32b320a9af1f2e39fbfabf4d65d64122344a3f55b8d37ec0c77e0045f7467b99d24bd2c067c1224d74f5c76b069753c7276d8709 + languageName: node + linkType: hard + +"urix@npm:^0.1.0": + version: 0.1.0 + resolution: "urix@npm:0.1.0" + checksum: fce8b11acd7569e826177f36ce9a9db2f4a6a85477874219e01fd132701d3e022eeaa9e760ab10d7cd6f4245c752a5d3fb6483635016bd99aac40c2cd6de01fa + languageName: node + linkType: hard + +"url-parse-lax@npm:^3.0.0": + version: 3.0.0 + resolution: "url-parse-lax@npm:3.0.0" + dependencies: + prepend-http: "npm:^2.0.0" + checksum: f5e84305a7ed1e087bc1c0d263fe05ab432619b4f3ce957a78dcd2b2d989e28b1a3169a7cf8ce9e780e4c45d613f029d38dcf68d7b39b77dbdff197dceb3ac53 + languageName: node + linkType: hard + +"url-set-query@npm:^1.0.0": + version: 1.0.0 + resolution: "url-set-query@npm:1.0.0" + checksum: a751758b21dbe1df28fadef92dd0daad9140184db5c2be2fa45ddd0cecc2bc0dde937bb410501db60745a13c0a48e578de0425b0f934c7ab0e558e744c955890 + languageName: node + linkType: hard + +"url@npm:^0.11.0": + version: 0.11.0 + resolution: "url@npm:0.11.0" + dependencies: + punycode: "npm:1.3.2" + querystring: "npm:0.2.0" + checksum: faa2280706858e1223e032eee89a43c832fe95803d9917f5b48a82a92fb8eec5556811fc6acb6d7c90ced0adb36d59331a55df86a27320c21bddd24f24600d3b + languageName: node + linkType: hard + +"use@npm:^3.1.0": + version: 3.1.1 + resolution: "use@npm:3.1.1" + checksum: 074e49acecdd9f6f094fc9d6e37e8e72a4bbbd904783ec8dc666b8b34aeb0c2cb846094cf241165263e81fa2bb75cb194fe01db372feb7ff504e7b9ffc7f893c + languageName: node + linkType: hard + +"utf-8-validate@npm:^5.0.2": + version: 5.0.10 + resolution: "utf-8-validate@npm:5.0.10" + dependencies: + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.3.0" + checksum: a1367352a2132efec0b492f8bf11a79b73c97258d8503fad65eb2f33d7ea7aaa61e479b47e0db3aa9a759d464626edb643c6eca79a4352c4d2392bbe28701063 + languageName: node + linkType: hard + +"utf8@npm:3.0.0, utf8@npm:^3.0.0": + version: 3.0.0 + resolution: "utf8@npm:3.0.0" + checksum: 3ba955f77245946afd2c49e5c562a0457f5713687ad212c9f1d5a44b9411db45a83a656dc500a766f15dd0324bc4c000535a4aaf8b82cbe2ff406549e0a87e23 + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 6a88ed8344d07f2324b304ee36def365d967953b5a9c15baa3213eb3909e86a7da1ee70a4c2133e80c23d6c1987590e9c3c57d874e20a124f9e41620b462fa57 + languageName: node + linkType: hard + +"util.promisify@npm:^1.0.0": + version: 1.1.2 + resolution: "util.promisify@npm:1.1.2" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + for-each: "npm:^0.3.3" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + object.getownpropertydescriptors: "npm:^2.1.6" + safe-array-concat: "npm:^1.0.0" + checksum: 5cd7bc838625e3e06b9557da50b49f2f27cb6576b33ebef07a97c22d9a9095ded3347d6e2dbeacf5898b693fa631720ca89d9c5159d9416c2ce1a2290fdadd86 + languageName: node + linkType: hard + +"utils-merge@npm:1.0.1": + version: 1.0.1 + resolution: "utils-merge@npm:1.0.1" + checksum: b72b8d7a0f7d63a9b1ced39a44b292994111c93cf9c4da8a561e4fe0d0232af7217a53d5aae3a950fb7ab6f423baf3e0d2d7c7c33dd6c4ec78d0a3c720ee6adb + languageName: node + linkType: hard + +"uuid@npm:3.3.2": + version: 3.3.2 + resolution: "uuid@npm:3.3.2" + bin: + uuid: ./bin/uuid + checksum: 712287d9dde1ae38eb1baee1572ce5b859f644fa417ad1908edc64711491a9f15175d2c661ad7aeb2df427103b78fb1777a33805ac02d5c7a02fcc89f080ebc0 + languageName: node + linkType: hard + +"uuid@npm:^3.3.2": + version: 3.4.0 + resolution: "uuid@npm:3.4.0" + bin: + uuid: ./bin/uuid + checksum: c84dbfcb94389fea5a09020802df2a1227d183ceabaa5256658194dfad045c83fe72366b64b165b6445a480fac8a75d0e982033f3cb393713674b3cd938063fa + languageName: node + linkType: hard + +"uuid@npm:^8.3.2": + version: 8.3.2 + resolution: "uuid@npm:8.3.2" + bin: + uuid: dist/bin/uuid + checksum: 236a12282c6fa32f326aa1b6d5699a843572e9ab7de84a1507a6b7c315fdcf55bf6ed333fd37d35c5c656f4cb96af998844e1c8cae281c442a1ec3b66df62962 + languageName: node + linkType: hard + +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 0ebe342e7f20816fd5d323affd77f60ea65810ef60beecafbb06397870b18b3d6cb76412721e23603f603fcf5b1f3b37e2844adf15e9b708dbd6404f01884b23 + languageName: node + linkType: hard + +"validate-npm-package-license@npm:^3.0.1": + version: 3.0.4 + resolution: "validate-npm-package-license@npm:3.0.4" + dependencies: + spdx-correct: "npm:^3.0.0" + spdx-expression-parse: "npm:^3.0.0" + checksum: 6d62b39e947077e554dfdf6a760fb52e8db73e7724aeeab1a1f4aa742e75b2ca5092b9f7b1b9171778e96f592628932ee07784a2c86f4152411180a32a8824be + languageName: node + linkType: hard + +"varint@npm:^5.0.0": + version: 5.0.2 + resolution: "varint@npm:5.0.2" + checksum: 5e4928b64fbaa028a9f45076b292ba6feafcc9beb53276d951b9a24c20f37d632825767a5b3f63c38019cc17f892b3aa8bec39458dabe239315b005fa571d001 + languageName: node + linkType: hard + +"vary@npm:^1, vary@npm:~1.1.2": + version: 1.1.2 + resolution: "vary@npm:1.1.2" + checksum: b1db20d4be443aec48b8efab73386f83d947b7033b6b2f5a0c7ba4a1f9bc0200cb4cb396712468761f8edfe48dd68a6fdee7c65689b90937a2d767c714d25883 + languageName: node + linkType: hard + +"verror@npm:1.10.0": + version: 1.10.0 + resolution: "verror@npm:1.10.0" + dependencies: + assert-plus: "npm:^1.0.0" + core-util-is: "npm:1.0.2" + extsprintf: "npm:^1.2.0" + checksum: ec26653c2110a7c2cfbaf41e3f3e87a5e08cbde81f7a568603c5ae4c9459acef5a1e81cbec551f4b9d0352e4b99121ee891e77c621b8237be9ff3862764d55f5 + languageName: node + linkType: hard + +"web3-bzz@npm:1.2.11": + version: 1.2.11 + resolution: "web3-bzz@npm:1.2.11" + dependencies: + "@types/node": "npm:^12.12.6" + got: "npm:9.6.0" + swarm-js: "npm:^0.1.40" + underscore: "npm:1.9.1" + checksum: c6b1d91e369bb75730ea31729185f379152981318207fbf174f93703ad6e572c08fd422e809c9486b2e209327634764443fcecc846b40c6634bb7d7c70e9fb7c + languageName: node + linkType: hard + +"web3-core-helpers@npm:1.2.11": + version: 1.2.11 + resolution: "web3-core-helpers@npm:1.2.11" + dependencies: + underscore: "npm:1.9.1" + web3-eth-iban: "npm:1.2.11" + web3-utils: "npm:1.2.11" + checksum: fce27e414cb32d2cecd564138157341ae7a9856cbbe7342bca40a72346ad6ad1a31b5b7d136694242cf5106d6e3ed8b49935f2054eaeb1351a4e0d3dd838e3ac + languageName: node + linkType: hard + +"web3-core-method@npm:1.2.11": + version: 1.2.11 + resolution: "web3-core-method@npm:1.2.11" + dependencies: + "@ethersproject/transactions": "npm:^5.0.0-beta.135" + underscore: "npm:1.9.1" + web3-core-helpers: "npm:1.2.11" + web3-core-promievent: "npm:1.2.11" + web3-core-subscriptions: "npm:1.2.11" + web3-utils: "npm:1.2.11" + checksum: 794f78149814be5deae82ee6cbef10c21b9f69027c7e46b5cc2e31cf22719529bdbfb6783a0f5b1f8a5814894e676b27ac73427d298ae0ce1f0c82817d8fa818 + languageName: node + linkType: hard + +"web3-core-promievent@npm:1.2.11": + version: 1.2.11 + resolution: "web3-core-promievent@npm:1.2.11" + dependencies: + eventemitter3: "npm:4.0.4" + checksum: 1ee092480541fe72db99cba908f5af1b1b54abd22e9eb396c6b1153d33779a67d115664e239758fe114eb1f9c463d4fb43ae34565cc7ebea5dbd0c21d56a18d9 + languageName: node + linkType: hard + +"web3-core-requestmanager@npm:1.2.11": + version: 1.2.11 + resolution: "web3-core-requestmanager@npm:1.2.11" + dependencies: + underscore: "npm:1.9.1" + web3-core-helpers: "npm:1.2.11" + web3-providers-http: "npm:1.2.11" + web3-providers-ipc: "npm:1.2.11" + web3-providers-ws: "npm:1.2.11" + checksum: 328969d97071ea0e0dc06c0f8c2ca822494bf736fce2d013843cd4f8e6716883c889c600bbb0cdf81c4773786e85da19711083e8caf5b9ffd47e231bbcd5f624 + languageName: node + linkType: hard + +"web3-core-subscriptions@npm:1.2.11": + version: 1.2.11 + resolution: "web3-core-subscriptions@npm:1.2.11" + dependencies: + eventemitter3: "npm:4.0.4" + underscore: "npm:1.9.1" + web3-core-helpers: "npm:1.2.11" + checksum: e2cf8eb1dabad1620edb95304ff0310e93aa9d69a62fb8b8a3610970bf135b7a4ab0ce41436397a1febe46e57fdcf597866ab83915c45e0f70eaf964e34d34cc + languageName: node + linkType: hard + +"web3-core@npm:1.2.11": + version: 1.2.11 + resolution: "web3-core@npm:1.2.11" + dependencies: + "@types/bn.js": "npm:^4.11.5" + "@types/node": "npm:^12.12.6" + bignumber.js: "npm:^9.0.0" + web3-core-helpers: "npm:1.2.11" + web3-core-method: "npm:1.2.11" + web3-core-requestmanager: "npm:1.2.11" + web3-utils: "npm:1.2.11" + checksum: e47911f947f9ea2302c6519d077fc28d078097fdcf6b2a8055f1747795b9e6d1c43a8184f8db42cd63c2a32d12e4f46ccce930c653b03124041ceacb9e8363e3 + languageName: node + linkType: hard + +"web3-eth-abi@npm:1.2.11": + version: 1.2.11 + resolution: "web3-eth-abi@npm:1.2.11" + dependencies: + "@ethersproject/abi": "npm:5.0.0-beta.153" + underscore: "npm:1.9.1" + web3-utils: "npm:1.2.11" + checksum: 9f16c51b109978331c97fe3f942c231f6bbf665ccc07365f6f82b64d21739308777b88fafce779b7723f48e6d184e2874f24dc8b310a9a29c7c2ecc83a60be65 + languageName: node + linkType: hard + +"web3-eth-accounts@npm:1.2.11": + version: 1.2.11 + resolution: "web3-eth-accounts@npm:1.2.11" + dependencies: + crypto-browserify: "npm:3.12.0" + eth-lib: "npm:0.2.8" + ethereumjs-common: "npm:^1.3.2" + ethereumjs-tx: "npm:^2.1.1" + scrypt-js: "npm:^3.0.1" + underscore: "npm:1.9.1" + uuid: "npm:3.3.2" + web3-core: "npm:1.2.11" + web3-core-helpers: "npm:1.2.11" + web3-core-method: "npm:1.2.11" + web3-utils: "npm:1.2.11" + checksum: 47f2f3f7caccfc4e5323f7c068fd99fbd96f98f024f2bd7d52c0c92dc2b812ba828df8a51ec23615c3af5d1881e90c30a46c9ba976e5cf07943750cec1d7585d + languageName: node + linkType: hard + +"web3-eth-contract@npm:1.2.11": + version: 1.2.11 + resolution: "web3-eth-contract@npm:1.2.11" + dependencies: + "@types/bn.js": "npm:^4.11.5" + underscore: "npm:1.9.1" + web3-core: "npm:1.2.11" + web3-core-helpers: "npm:1.2.11" + web3-core-method: "npm:1.2.11" + web3-core-promievent: "npm:1.2.11" + web3-core-subscriptions: "npm:1.2.11" + web3-eth-abi: "npm:1.2.11" + web3-utils: "npm:1.2.11" + checksum: 5883ae3f5acbba49e2b8f4eb542fb3b77a9f3411e642c64d958a94aa69e1ee7b8907423ef4cb09190ff49485402c80b329875741ba589a08fcc44e6a5d1a8843 + languageName: node + linkType: hard + +"web3-eth-ens@npm:1.2.11": + version: 1.2.11 + resolution: "web3-eth-ens@npm:1.2.11" + dependencies: + content-hash: "npm:^2.5.2" + eth-ens-namehash: "npm:2.0.8" + underscore: "npm:1.9.1" + web3-core: "npm:1.2.11" + web3-core-helpers: "npm:1.2.11" + web3-core-promievent: "npm:1.2.11" + web3-eth-abi: "npm:1.2.11" + web3-eth-contract: "npm:1.2.11" + web3-utils: "npm:1.2.11" + checksum: d4eb8f69dba33b2dbe09b664899625f576ca4b2963fdee64b98fad3cd73d3cc4f642df41a451b51962b0acaaaf12bd341a7473bb7aacf6d061ba51327de2d096 + languageName: node + linkType: hard + +"web3-eth-iban@npm:1.2.11": + version: 1.2.11 + resolution: "web3-eth-iban@npm:1.2.11" + dependencies: + bn.js: "npm:^4.11.9" + web3-utils: "npm:1.2.11" + checksum: 73d3f99920e57f2cfe144ab0511809c6b2c147fde77d3ebafc06217b8bb42992d34feb052b8c25bbd4c69c995efac285659d4924a5b392134ac6f3bda049c763 + languageName: node + linkType: hard + +"web3-eth-personal@npm:1.2.11": + version: 1.2.11 + resolution: "web3-eth-personal@npm:1.2.11" + dependencies: + "@types/node": "npm:^12.12.6" + web3-core: "npm:1.2.11" + web3-core-helpers: "npm:1.2.11" + web3-core-method: "npm:1.2.11" + web3-net: "npm:1.2.11" + web3-utils: "npm:1.2.11" + checksum: f0bab7418ffbfba3908d7ee033cdd8a55440a10bf9ebe902afbad0404ca22025ab584108686fd62addb35f7832966bfe43ee8ee09c8834f32c2949ff179e7835 + languageName: node + linkType: hard + +"web3-eth@npm:1.2.11": + version: 1.2.11 + resolution: "web3-eth@npm:1.2.11" + dependencies: + underscore: "npm:1.9.1" + web3-core: "npm:1.2.11" + web3-core-helpers: "npm:1.2.11" + web3-core-method: "npm:1.2.11" + web3-core-subscriptions: "npm:1.2.11" + web3-eth-abi: "npm:1.2.11" + web3-eth-accounts: "npm:1.2.11" + web3-eth-contract: "npm:1.2.11" + web3-eth-ens: "npm:1.2.11" + web3-eth-iban: "npm:1.2.11" + web3-eth-personal: "npm:1.2.11" + web3-net: "npm:1.2.11" + web3-utils: "npm:1.2.11" + checksum: f6aba42de55a318567be0129b429808af4254cdc824949c5dfb00658a2e38602e73ae84c0fedc073dd3e3aead89b5644590dee22171ae52e47cecda01990e199 + languageName: node + linkType: hard + +"web3-net@npm:1.2.11": + version: 1.2.11 + resolution: "web3-net@npm:1.2.11" + dependencies: + web3-core: "npm:1.2.11" + web3-core-method: "npm:1.2.11" + web3-utils: "npm:1.2.11" + checksum: db912a565d7975ec988248ffab44b1ebd94f165aae2c8411458c07f518ad905831d294513de26e6c548b66c4112622db27b1b43c0a333534a06ede14d8b89ac8 + languageName: node + linkType: hard + +"web3-provider-engine@npm:14.2.1": + version: 14.2.1 + resolution: "web3-provider-engine@npm:14.2.1" + dependencies: + async: "npm:^2.5.0" + backoff: "npm:^2.5.0" + clone: "npm:^2.0.0" + cross-fetch: "npm:^2.1.0" + eth-block-tracker: "npm:^3.0.0" + eth-json-rpc-infura: "npm:^3.1.0" + eth-sig-util: "npm:^1.4.2" + ethereumjs-block: "npm:^1.2.2" + ethereumjs-tx: "npm:^1.2.0" + ethereumjs-util: "npm:^5.1.5" + ethereumjs-vm: "npm:^2.3.4" + json-rpc-error: "npm:^2.0.0" + json-stable-stringify: "npm:^1.0.1" + promise-to-callback: "npm:^1.0.0" + readable-stream: "npm:^2.2.9" + request: "npm:^2.85.0" + semaphore: "npm:^1.0.3" + ws: "npm:^5.1.1" + xhr: "npm:^2.2.0" + xtend: "npm:^4.0.1" + checksum: 2898ac0baccb55cfcd31b09576105510d4d332afa920181148bd7e0c69f2eb9b0383a344da259501b3edf9d6bc9fd08864e56c187af507155d7bbd194093908f + languageName: node + linkType: hard + +"web3-providers-http@npm:1.2.11": + version: 1.2.11 + resolution: "web3-providers-http@npm:1.2.11" + dependencies: + web3-core-helpers: "npm:1.2.11" + xhr2-cookies: "npm:1.1.0" + checksum: 996a77f44575f686f809a6506c7ed5f2adaafae4dfee967fdb09a808e974ac269ac9825dbad38dbecefbd34d945edd7d0397c46d607a58a352d5380569f57dea + languageName: node + linkType: hard + +"web3-providers-ipc@npm:1.2.11": + version: 1.2.11 + resolution: "web3-providers-ipc@npm:1.2.11" + dependencies: + oboe: "npm:2.1.4" + underscore: "npm:1.9.1" + web3-core-helpers: "npm:1.2.11" + checksum: f4b221de9ae5c0f7edb4b193bdec44ae2c57515574fcefe92b937bc277d06a42b561c0087b3e1d8fad771ba659014eb6895f3fbd6eeea0260f732597ee3868a6 + languageName: node + linkType: hard + +"web3-providers-ws@npm:1.2.11": + version: 1.2.11 + resolution: "web3-providers-ws@npm:1.2.11" + dependencies: + eventemitter3: "npm:4.0.4" + underscore: "npm:1.9.1" + web3-core-helpers: "npm:1.2.11" + websocket: "npm:^1.0.31" + checksum: b124c88a9c13cc648583e402b8806d1f2fc7ec9a05b0f563fb2566111dc1596ad6415e48d737268269da6296d0c22828d97e325fcbfa868b18c006ee7e5f2a64 + languageName: node + linkType: hard + +"web3-shh@npm:1.2.11": + version: 1.2.11 + resolution: "web3-shh@npm:1.2.11" + dependencies: + web3-core: "npm:1.2.11" + web3-core-method: "npm:1.2.11" + web3-core-subscriptions: "npm:1.2.11" + web3-net: "npm:1.2.11" + checksum: 9e4faeee77818ade1c1beadc1611a7e59d607a2fcf3c373191739fd34a2602a402581d610f6706defc8966b17e5ed4a2d8a5c948b57a208ee567f1f8e7e9434a + languageName: node + linkType: hard + +"web3-utils@npm:1.2.11": + version: 1.2.11 + resolution: "web3-utils@npm:1.2.11" + dependencies: + bn.js: "npm:^4.11.9" + eth-lib: "npm:0.2.8" + ethereum-bloom-filters: "npm:^1.0.6" + ethjs-unit: "npm:0.1.6" + number-to-bn: "npm:1.7.0" + randombytes: "npm:^2.1.0" + underscore: "npm:1.9.1" + utf8: "npm:3.0.0" + checksum: b1938a200d49fd71c68b9729c15ab3828fe15235695e0b5679e356297cd661da98f40f3f64eb1bbde55e9d648f65a63943f96df55b3f647aaba139e4c5a3bcca + languageName: node + linkType: hard + +"web3-utils@npm:^1.0.0-beta.31": + version: 1.10.0 + resolution: "web3-utils@npm:1.10.0" + dependencies: + bn.js: "npm:^5.2.1" + ethereum-bloom-filters: "npm:^1.0.6" + ethereumjs-util: "npm:^7.1.0" + ethjs-unit: "npm:0.1.6" + number-to-bn: "npm:1.7.0" + randombytes: "npm:^2.1.0" + utf8: "npm:3.0.0" + checksum: d9b7e126b5248ef1e2cd8f830e659ea06360dd43fe1fee71662b2525a9f37633a893f8c952719adb77ed6564933e8e110ab8f4bc80c7cbd0929365dae5774a42 + languageName: node + linkType: hard + +"web3@npm:1.2.11": + version: 1.2.11 + resolution: "web3@npm:1.2.11" + dependencies: + web3-bzz: "npm:1.2.11" + web3-core: "npm:1.2.11" + web3-eth: "npm:1.2.11" + web3-eth-personal: "npm:1.2.11" + web3-net: "npm:1.2.11" + web3-shh: "npm:1.2.11" + web3-utils: "npm:1.2.11" + checksum: c92877bba4251d20cb30d52d251dcffdbd8b9d507633850ddaae03b238070f04f98b38d3a33c333b1298932826c9a817fd15bfd76faa6444d2ff900cbd9b819e + languageName: node + linkType: hard + +"webidl-conversions@npm:^3.0.0": + version: 3.0.1 + resolution: "webidl-conversions@npm:3.0.1" + checksum: 57c8c5fdd986be5432ea6adacd87d6757144289d3b48b33441e7310bd4f4f6d782dd34acbd74d61e923c142cc50333d27ba58235692fa7248541c0bcce2563e1 + languageName: node + linkType: hard + +"websocket@npm:1.0.32": + version: 1.0.32 + resolution: "websocket@npm:1.0.32" + dependencies: + bufferutil: "npm:^4.0.1" + debug: "npm:^2.2.0" + es5-ext: "npm:^0.10.50" + typedarray-to-buffer: "npm:^3.1.5" + utf-8-validate: "npm:^5.0.2" + yaeti: "npm:^0.0.6" + checksum: af34dc8b845f7d78c3aa88dfa1de512d280ee68261e448f28aab1f50edd5c00682d6d8e0545faa49a854b169ededdfc5624b8900c63f1b6c2a214b6d5063398f + languageName: node + linkType: hard + +"websocket@npm:^1.0.31": + version: 1.0.34 + resolution: "websocket@npm:1.0.34" + dependencies: + bufferutil: "npm:^4.0.1" + debug: "npm:^2.2.0" + es5-ext: "npm:^0.10.50" + typedarray-to-buffer: "npm:^3.1.5" + utf-8-validate: "npm:^5.0.2" + yaeti: "npm:^0.0.6" + checksum: 059b338bd0ce26713d5055a170b4e14daeff9f6fb55b1f45ed6f3ec5abcf214e2a70f9e0a11f86d2e54ab95c897c5b217f2aff70682b159b2eb9f9e2f824c0e3 + languageName: node + linkType: hard + +"whatwg-fetch@npm:^2.0.4": + version: 2.0.4 + resolution: "whatwg-fetch@npm:2.0.4" + checksum: 8bba9a8db4b186733675a76cd17c0f878d789048f5c790103a4cba5ed72dd5cf5260d899f9e130de7ffb2860d3b8af71b02506f1d936b2c25ea464cd11f37c32 + languageName: node + linkType: hard + +"whatwg-url@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-url@npm:5.0.0" + dependencies: + tr46: "npm:~0.0.3" + webidl-conversions: "npm:^3.0.0" + checksum: bd0cc6b75b84b3d032e30712e2f40eefbc07ecd14f093e87b2f81bb68bce10a3961e8eb646a7a8cc9c2352548fb501eeff668c8b2595fd7c6ea91d1406ce11ee + languageName: node + linkType: hard + +"which-boxed-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "which-boxed-primitive@npm:1.0.2" + dependencies: + is-bigint: "npm:^1.0.1" + is-boolean-object: "npm:^1.1.0" + is-number-object: "npm:^1.0.4" + is-string: "npm:^1.0.5" + is-symbol: "npm:^1.0.3" + checksum: 5dca8c7d5df27ace90300270fea1512df427ba557e3509051e18c7992fdbe6f00a89918ae2deb59c346d0771966b3b5da3d2c9bad4e374c09bc2b9aad1e19ae9 + languageName: node + linkType: hard + +"which-module@npm:^1.0.0": + version: 1.0.0 + resolution: "which-module@npm:1.0.0" + checksum: 8efc9639016e71139633375b21b129ee1c1bd987922e64d8c121429ac6f54de148ad7c5333237758950ed3ddf3e33191b432aabb58299837c7f8bc81439f546a + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.9": + version: 1.1.9 + resolution: "which-typed-array@npm:1.1.9" + dependencies: + available-typed-arrays: "npm:^1.0.5" + call-bind: "npm:^1.0.2" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.0" + is-typed-array: "npm:^1.1.10" + checksum: 09e7fe714cb797daf3a35f3499b9f7c969b1296ac0d40d68256f2b70f747a728ad5385b1fb3e7514e26bad3d5ca550a13a80e1a7b22b7e9e12872c46ecb6c4a7 + languageName: node + linkType: hard + +"which@npm:^1.2.9": + version: 1.3.1 + resolution: "which@npm:1.3.1" + dependencies: + isexe: "npm:^2.0.0" + bin: + which: ./bin/which + checksum: 23474adde926da434c2f9b9d8edbe893b48593ba91f59b9035a0be1ef7c15b64b5a9d37566422d291b16e02cf8099e4a35984f81c9bf696dccf264de57d2b954 + languageName: node + linkType: hard + +"which@npm:^2.0.1, which@npm:^2.0.2": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 3728616c789b289c36ba2572887145e0736f06fe3435b8fef17e27eb5ec0696f61a21e356dd7fa58486346e57186863afa1b6c27c7665f7e674c8124f7f61157 + languageName: node + linkType: hard + +"wide-align@npm:^1.1.5": + version: 1.1.5 + resolution: "wide-align@npm:1.1.5" + dependencies: + string-width: "npm:^1.0.2 || 2 || 3 || 4" + checksum: 39915f81cdc6cee1f54bfd7672619cc6d0bd558089f968ea7831324cd4b5ed00e78e710a64f05e5d75ed7880e45eef97295907f68d5aabb9d2899436c917b275 + languageName: node + linkType: hard + +"window-size@npm:^0.2.0": + version: 0.2.0 + resolution: "window-size@npm:0.2.0" + bin: + window-size: cli.js + checksum: d1e36978216a5b33b4d373405eb8d04ecc45d421aab42beb7491ca4bd6d29e1ebf98d513c01413155ca82d318147fa55045643e7bbae5af5c9510ddbccc2c1f5 + languageName: node + linkType: hard + +"word-wrap@npm:^1.2.3": + version: 1.2.3 + resolution: "word-wrap@npm:1.2.3" + checksum: 17267cdb6baa9d5452b0998531adafd2df52a25159f27cbb754b2fdcff4af8808019efe4c0a2bcc5ceb63becb30df07c792c0125ad21991266aefadb940df74a + languageName: node + linkType: hard + +"workerpool@npm:6.2.1": + version: 6.2.1 + resolution: "workerpool@npm:6.2.1" + checksum: e79e2414909a5f74829d3d18b4ae83c6373d62e146c486835417146f3f494fe17be88929d4d35a322cfdde3c03992518a398e081c9a8dc1b207881ec447db690 + languageName: node + linkType: hard + +"wrap-ansi@npm:^2.0.0": + version: 2.1.0 + resolution: "wrap-ansi@npm:2.1.0" + dependencies: + string-width: "npm:^1.0.1" + strip-ansi: "npm:^3.0.1" + checksum: de8f60b356956cc47f6b2d51a3741e7b096eb6176d2b81c7b674a8b2c4e491c46d341594ebd0b9bdd527dfd7d295df200367a6a45c839e269aa1800c5b3cf9e1 + languageName: node + linkType: hard + +"wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: b72e4a1ebd582221c3d7eae2473c7841af1fd435defe08bb3854600013ced559b10efa767b4fdc6725402ab16b79f86f73e5d4edc7cf9214e15733ee34849aa0 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 37d243a577dfeee20586eae1e3208dfb4e4cea1211a2a4116a19b50d91e619ff3dbc5ec934e28ca9baaa11a65df826c8d65c5fd1bb81f0ce0dadb469d47061c2 + languageName: node + linkType: hard + +"ws@npm:7.4.6": + version: 7.4.6 + resolution: "ws@npm:7.4.6" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: e7845f0249f82d2b262b6e794b42a20986092f2feb34d22be75f1a0d46f4824404cb046b3815dadc526eec9f9606f2ae94986745ae136e5197a88cbee1db58a2 + languageName: node + linkType: hard + +"ws@npm:^3.0.0": + version: 3.3.3 + resolution: "ws@npm:3.3.3" + dependencies: + async-limiter: "npm:~1.0.0" + safe-buffer: "npm:~5.1.0" + ultron: "npm:~1.1.0" + checksum: 7fc3ea69ca6342796e144da428c154d756634fb8fa93e78ca2aa81436d9837c2c52eec79753e3045ac00a3b9793e9bfc7d055dd4c3038692289bf084353dd378 + languageName: node + linkType: hard + +"ws@npm:^5.1.1": + version: 5.2.3 + resolution: "ws@npm:5.2.3" + dependencies: + async-limiter: "npm:~1.0.0" + checksum: 8156b83a7e5317f3c9a28391c0dfda51c477ee223a5fc436c719c855aa83912517c8a095bbd3923b86ddd9ec8f9d3898ed7c5d5f2dfbdb277fae58df782f8793 + languageName: node + linkType: hard + +"ws@npm:^7.4.6": + version: 7.5.9 + resolution: "ws@npm:7.5.9" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 5a4f52060e2a65194c324e5506021c998444ef5740365f7f04a59da38d2da5229221f5ab6e7ceee0d5999d03c2c1c73164a5ebdafa481043edeae4c5c42f988c + languageName: node + linkType: hard + +"xhr-request-promise@npm:^0.1.2": + version: 0.1.3 + resolution: "xhr-request-promise@npm:0.1.3" + dependencies: + xhr-request: "npm:^1.1.0" + checksum: 3aed7f8050f23e17d8a208279523ebf0d818f449a60e5108e22c18f9ce73a4a80865411836722c7c5e14ea0e06351b87332df1d3a674aa9ff6a72d247e75a71e + languageName: node + linkType: hard + +"xhr-request@npm:^1.0.1, xhr-request@npm:^1.1.0": + version: 1.1.0 + resolution: "xhr-request@npm:1.1.0" + dependencies: + buffer-to-arraybuffer: "npm:^0.0.5" + object-assign: "npm:^4.1.1" + query-string: "npm:^5.0.1" + simple-get: "npm:^2.7.0" + timed-out: "npm:^4.0.1" + url-set-query: "npm:^1.0.0" + xhr: "npm:^2.0.4" + checksum: bdbbb5be55e482d45e6d3e03e021d93f3d20673056e7b7ced7fe35901de8019f0465faba4c300f8f7f8a421287089f0b4bbee86dc302708a7dc0652e32f14e87 + languageName: node + linkType: hard + +"xhr2-cookies@npm:1.1.0": + version: 1.1.0 + resolution: "xhr2-cookies@npm:1.1.0" + dependencies: + cookiejar: "npm:^2.1.1" + checksum: 92a954b6ad29f5f0431833c105d88ae4807330ff71a12ee3e992aa663bff77cfea87ab223cc8d6c3418fdd6a0782d0325f34941b376a045ed92a58098e0f950e + languageName: node + linkType: hard + +"xhr@npm:^2.0.4, xhr@npm:^2.2.0, xhr@npm:^2.3.3": + version: 2.6.0 + resolution: "xhr@npm:2.6.0" + dependencies: + global: "npm:~4.4.0" + is-function: "npm:^1.0.1" + parse-headers: "npm:^2.0.0" + xtend: "npm:^4.0.0" + checksum: d4dc5778822ea669b946e7d39a62e59ebe800ee576a918b1d3fe43d7b56758c23f0cef46cd21b7a54d857e822ee0b23e4f1ffc43b53914c590d5bdbc69cdbf5b + languageName: node + linkType: hard + +"xtend@npm:^4.0.0, xtend@npm:^4.0.1, xtend@npm:~4.0.0, xtend@npm:~4.0.1": + version: 4.0.2 + resolution: "xtend@npm:4.0.2" + checksum: 3d5d245e44d76b4eaf8a357199541347da8ce522bc0573fdb89b01ff6594b33364569d1dba02ccfe3ee86b384c0d61c06fda1b0cff71f382029e2a18e2f592f7 + languageName: node + linkType: hard + +"xtend@npm:~2.1.1": + version: 2.1.2 + resolution: "xtend@npm:2.1.2" + dependencies: + object-keys: "npm:~0.4.0" + checksum: 395d227955b09ae750768a73fab0e2532a18ccb2fc51e4d1fcfc92464b8079ce4e8f3a2ef6ae70914bf51f7c46677818a55ced779888e922c4ee9d2bd45b386f + languageName: node + linkType: hard + +"y18n@npm:^3.2.1": + version: 3.2.2 + resolution: "y18n@npm:3.2.2" + checksum: 978b2462068c8d9263de6ddd0110a497970a93babde0daaacc200278d3f21a012b5f626353666f270fcf867570da66435629666fbf298ff1fdfb5b36ee32ea77 + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 10a6a4dcab8518b72a500520664b686bffe79d8e756af1a7eedf49fa72ab35e40f508896e0baa534f7f92e08193a6dad4283298c11ea7885e710c76b7e2bcc7a + languageName: node + linkType: hard + +"yaeti@npm:^0.0.6": + version: 0.0.6 + resolution: "yaeti@npm:0.0.6" + checksum: 6b672efb547f6b2171f07da54e6e9a61df42ed08a01b06564af1d8594fe91ffcab98a1f351d726334cbe5c3d54301dd211232a2027dde96550a146545e8ebb8d + languageName: node + linkType: hard + +"yallist@npm:^3.0.0, yallist@npm:^3.0.2, yallist@npm:^3.1.1": + version: 3.1.1 + resolution: "yallist@npm:3.1.1" + checksum: 8d382abef6365eb6800ef86a429e8a78347089b7867cdb7ae146e5f3629baebe41967b9d7715ae22c9514659a2855a10e104d68441e339f5060b286b2f3e11c6 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: cd7fe32508c6942d8b979278fbe13846fe88cd6840d78043d08c6b2c74d67ce38b58bd21618dca8a4e132dcc025fc0e66a7d87ca10cf6ed338465607ebff4378 + languageName: node + linkType: hard + +"yaml@npm:^1.10.2": + version: 1.10.2 + resolution: "yaml@npm:1.10.2" + checksum: d6f04384bdf1105256581aef39991f825e358f3f48f081974b0e0f39ff5240c60ccafb5842cb79d1287517efa2b9ee172c702f2e4855ba6cc46948b40a43aa6e + languageName: node + linkType: hard + +"yargs-parser@npm:20.2.4": + version: 20.2.4 + resolution: "yargs-parser@npm:20.2.4" + checksum: fad75c06cf06b88af025c34e169c40da39d766eac83dfafc75b6ddcbc106f25acbbfe8924a7eb64fecfbda12313c65208575b71b4b5e9138cb16570577f6bb6f + languageName: node + linkType: hard + +"yargs-parser@npm:^2.4.1": + version: 2.4.1 + resolution: "yargs-parser@npm:2.4.1" + dependencies: + camelcase: "npm:^3.0.0" + lodash.assign: "npm:^4.0.6" + checksum: 464176a8bf6675689201fe4ae17c21b664eeb0ae8631dad010554e82577dab04e3e51924bc5e2e26fd81dffef049ba912c94603fe307c5a653212a9a2e643793 + languageName: node + linkType: hard + +"yargs-parser@npm:^20.2.2": + version: 20.2.9 + resolution: "yargs-parser@npm:20.2.9" + checksum: fd739a429b7cde755b8e9d28520619fb8adb94c686b2d75d3c93a6ec199fbc8bf120af6d2be144f8d3075f3d675b09893f8894a362548107aa90bb97ad662c7a + languageName: node + linkType: hard + +"yargs-unparser@npm:2.0.0": + version: 2.0.0 + resolution: "yargs-unparser@npm:2.0.0" + dependencies: + camelcase: "npm:^6.0.0" + decamelize: "npm:^4.0.0" + flat: "npm:^5.0.2" + is-plain-obj: "npm:^2.1.0" + checksum: 981309e58e1cf538bae1c5decbeb7c1a6d784d93cbdf43e27a192a2bdd72d9ec2799c292a304c70d50a445cfdf68bc83b8b42d884f6e36ebb10b31ed194db003 + languageName: node + linkType: hard + +"yargs@npm:16.2.0": + version: 16.2.0 + resolution: "yargs@npm:16.2.0" + dependencies: + cliui: "npm:^7.0.2" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.0" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^20.2.2" + checksum: be4564db8f818c7eeda96653331a62829522ab2a8a773da079ebf3870ab5b875177c397c57f06d6c9238d613567ebe69d4cbac35dbef1cc9928183df7ba8d479 + languageName: node + linkType: hard + +"yargs@npm:^4.7.1": + version: 4.8.1 + resolution: "yargs@npm:4.8.1" + dependencies: + cliui: "npm:^3.2.0" + decamelize: "npm:^1.1.1" + get-caller-file: "npm:^1.0.1" + lodash.assign: "npm:^4.0.3" + os-locale: "npm:^1.4.0" + read-pkg-up: "npm:^1.0.1" + require-directory: "npm:^2.1.1" + require-main-filename: "npm:^1.0.1" + set-blocking: "npm:^2.0.0" + string-width: "npm:^1.0.1" + which-module: "npm:^1.0.0" + window-size: "npm:^0.2.0" + y18n: "npm:^3.2.1" + yargs-parser: "npm:^2.4.1" + checksum: a3c48b65fa831602b917307176a312396695671b78210dd6f97b5894d1ed8fdb8c1a099a15470e9670f53dfd918d1f240a722643c62b9ee59689525a6dbac9c5 + languageName: node + linkType: hard + +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 890a9ce10f1f6691316f521444dcdc2d012dbfba423ec2252444dab5888def4ee48751304e51302c6d14197a1e9407256153a357c955bff1d659df592cfda456 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: 63eceacd482622afd71290541a9823a0e5eed88a6b58a5d136a5fb8151ed4d1549c80f28d74d4ad351582f9890635d49e6cf70f8d3cc64948640f839f6a37c70 + languageName: node + linkType: hard diff --git a/balpy/balancerErrors.py b/balpy/balancerErrors.py index a472ca1..9cd34b5 100644 --- a/balpy/balancerErrors.py +++ b/balpy/balancerErrors.py @@ -1,107 +1,110 @@ -codes = {0:"ADD_OVERFLOW", - 1:"SUB_OVERFLOW", - 2:"SUB_UNDERFLOW", - 3:"MUL_OVERFLOW", - 4:"ZERO_DIVISION", - 5:"DIV_INTERNAL", - 6:"X_OUT_OF_BOUNDS", - 7:"Y_OUT_OF_BOUNDS", - 8:"PRODUCT_OUT_OF_BOUNDS", - 9:"INVALID_EXPONENT", - 100:"OUT_OF_BOUNDS", - 101:"UNSORTED_ARRAY", - 102:"UNSORTED_TOKENS", - 103:"INPUT_LENGTH_MISMATCH", - 104:"ZERO_TOKEN", - 200:"MIN_TOKENS", - 201:"MAX_TOKENS", - 202:"MAX_SWAP_FEE_PERCENTAGE", - 203:"MIN_SWAP_FEE_PERCENTAGE", - 204:"MINIMUM_BPT", - 205:"CALLER_NOT_VAULT", - 206:"UNINITIALIZED", - 207:"BPT_IN_MAX_AMOUNT", - 208:"BPT_OUT_MIN_AMOUNT", - 209:"EXPIRED_PERMIT", - 300:"MIN_AMP", - 301:"MAX_AMP", - 302:"MIN_WEIGHT", - 303:"MAX_STABLE_TOKENS", - 304:"MAX_IN_RATIO", - 305:"MAX_OUT_RATIO", - 306:"MIN_BPT_IN_FOR_TOKEN_OUT", - 307:"MAX_OUT_BPT_FOR_TOKEN_IN", - 308:"NORMALIZED_WEIGHT_INVARIANT", - 309:"INVALID_TOKEN", - 310:"UNHANDLED_JOIN_KIND", - 311:"ZERO_INVARIANT", - 400:"REENTRANCY", - 401:"SENDER_NOT_ALLOWED", - 402:"PAUSED", - 403:"PAUSE_WINDOW_EXPIRED", - 404:"MAX_PAUSE_WINDOW_DURATION", - 405:"MAX_BUFFER_PERIOD_DURATION", - 406:"INSUFFICIENT_BALANCE", - 407:"INSUFFICIENT_ALLOWANCE", - 408:"ERC20_TRANSFER_FROM_ZERO_ADDRESS", - 409:"ERC20_TRANSFER_TO_ZERO_ADDRESS", - 410:"ERC20_MINT_TO_ZERO_ADDRESS", - 411:"ERC20_BURN_FROM_ZERO_ADDRESS", - 412:"ERC20_APPROVE_FROM_ZERO_ADDRESS", - 413:"ERC20_APPROVE_TO_ZERO_ADDRESS", - 414:"ERC20_TRANSFER_EXCEEDS_ALLOWANCE", - 415:"ERC20_DECREASED_ALLOWANCE_BELOW_ZERO", - 416:"ERC20_TRANSFER_EXCEEDS_BALANCE", - 417:"ERC20_BURN_EXCEEDS_ALLOWANCE", - 418:"SAFE_ERC20_CALL_FAILED", - 419:"ADDRESS_INSUFFICIENT_BALANCE", - 420:"ADDRESS_CANNOT_SEND_VALUE", - 421:"SAFE_CAST_VALUE_CANT_FIT_INT256", - 422:"GRANT_SENDER_NOT_ADMIN", - 423:"REVOKE_SENDER_NOT_ADMIN", - 424:"RENOUNCE_SENDER_NOT_ALLOWED", - 425:"BUFFER_PERIOD_EXPIRED", - 500:"INVALID_POOL_ID", - 501:"CALLER_NOT_POOL", - 502:"SENDER_NOT_ASSET_MANAGER", - 503:"USER_DOESNT_ALLOW_RELAYER", - 504:"INVALID_SIGNATURE", - 505:"EXIT_BELOW_MIN", - 506:"JOIN_ABOVE_MAX", - 507:"SWAP_LIMIT", - 508:"SWAP_DEADLINE", - 509:"CANNOT_SWAP_SAME_TOKEN", - 510:"UNKNOWN_AMOUNT_IN_FIRST_SWAP", - 511:"MALCONSTRUCTED_MULTIHOP_SWAP", - 512:"INTERNAL_BALANCE_OVERFLOW", - 513:"INSUFFICIENT_INTERNAL_BALANCE", - 514:"INVALID_ETH_INTERNAL_BALANCE", - 515:"INVALID_POST_LOAN_BALANCE", - 516:"INSUFFICIENT_ETH", - 517:"UNALLOCATED_ETH", - 518:"ETH_TRANSFER", - 519:"CANNOT_USE_ETH_SENTINEL", - 520:"TOKENS_MISMATCH", - 521:"TOKEN_NOT_REGISTERED", - 522:"TOKEN_ALREADY_REGISTERED", - 523:"TOKENS_ALREADY_SET", - 524:"TOKENS_LENGTH_MUST_BE_2", - 525:"NONZERO_TOKEN_BALANCE", - 526:"BALANCE_TOTAL_OVERFLOW", - 600:"SWAP_FEE_PERCENTAGE_TOO_HIGH", - 601:"FLASH_LOAN_FEE_PERCENTAGE_TOO_HIGH", - 602:"INSUFFICIENT_FLASH_LOAN_FEE_AMOUNT" -}; +codes = { + 0: "ADD_OVERFLOW", + 1: "SUB_OVERFLOW", + 2: "SUB_UNDERFLOW", + 3: "MUL_OVERFLOW", + 4: "ZERO_DIVISION", + 5: "DIV_INTERNAL", + 6: "X_OUT_OF_BOUNDS", + 7: "Y_OUT_OF_BOUNDS", + 8: "PRODUCT_OUT_OF_BOUNDS", + 9: "INVALID_EXPONENT", + 100: "OUT_OF_BOUNDS", + 101: "UNSORTED_ARRAY", + 102: "UNSORTED_TOKENS", + 103: "INPUT_LENGTH_MISMATCH", + 104: "ZERO_TOKEN", + 200: "MIN_TOKENS", + 201: "MAX_TOKENS", + 202: "MAX_SWAP_FEE_PERCENTAGE", + 203: "MIN_SWAP_FEE_PERCENTAGE", + 204: "MINIMUM_BPT", + 205: "CALLER_NOT_VAULT", + 206: "UNINITIALIZED", + 207: "BPT_IN_MAX_AMOUNT", + 208: "BPT_OUT_MIN_AMOUNT", + 209: "EXPIRED_PERMIT", + 300: "MIN_AMP", + 301: "MAX_AMP", + 302: "MIN_WEIGHT", + 303: "MAX_STABLE_TOKENS", + 304: "MAX_IN_RATIO", + 305: "MAX_OUT_RATIO", + 306: "MIN_BPT_IN_FOR_TOKEN_OUT", + 307: "MAX_OUT_BPT_FOR_TOKEN_IN", + 308: "NORMALIZED_WEIGHT_INVARIANT", + 309: "INVALID_TOKEN", + 310: "UNHANDLED_JOIN_KIND", + 311: "ZERO_INVARIANT", + 400: "REENTRANCY", + 401: "SENDER_NOT_ALLOWED", + 402: "PAUSED", + 403: "PAUSE_WINDOW_EXPIRED", + 404: "MAX_PAUSE_WINDOW_DURATION", + 405: "MAX_BUFFER_PERIOD_DURATION", + 406: "INSUFFICIENT_BALANCE", + 407: "INSUFFICIENT_ALLOWANCE", + 408: "ERC20_TRANSFER_FROM_ZERO_ADDRESS", + 409: "ERC20_TRANSFER_TO_ZERO_ADDRESS", + 410: "ERC20_MINT_TO_ZERO_ADDRESS", + 411: "ERC20_BURN_FROM_ZERO_ADDRESS", + 412: "ERC20_APPROVE_FROM_ZERO_ADDRESS", + 413: "ERC20_APPROVE_TO_ZERO_ADDRESS", + 414: "ERC20_TRANSFER_EXCEEDS_ALLOWANCE", + 415: "ERC20_DECREASED_ALLOWANCE_BELOW_ZERO", + 416: "ERC20_TRANSFER_EXCEEDS_BALANCE", + 417: "ERC20_BURN_EXCEEDS_ALLOWANCE", + 418: "SAFE_ERC20_CALL_FAILED", + 419: "ADDRESS_INSUFFICIENT_BALANCE", + 420: "ADDRESS_CANNOT_SEND_VALUE", + 421: "SAFE_CAST_VALUE_CANT_FIT_INT256", + 422: "GRANT_SENDER_NOT_ADMIN", + 423: "REVOKE_SENDER_NOT_ADMIN", + 424: "RENOUNCE_SENDER_NOT_ALLOWED", + 425: "BUFFER_PERIOD_EXPIRED", + 500: "INVALID_POOL_ID", + 501: "CALLER_NOT_POOL", + 502: "SENDER_NOT_ASSET_MANAGER", + 503: "USER_DOESNT_ALLOW_RELAYER", + 504: "INVALID_SIGNATURE", + 505: "EXIT_BELOW_MIN", + 506: "JOIN_ABOVE_MAX", + 507: "SWAP_LIMIT", + 508: "SWAP_DEADLINE", + 509: "CANNOT_SWAP_SAME_TOKEN", + 510: "UNKNOWN_AMOUNT_IN_FIRST_SWAP", + 511: "MALCONSTRUCTED_MULTIHOP_SWAP", + 512: "INTERNAL_BALANCE_OVERFLOW", + 513: "INSUFFICIENT_INTERNAL_BALANCE", + 514: "INVALID_ETH_INTERNAL_BALANCE", + 515: "INVALID_POST_LOAN_BALANCE", + 516: "INSUFFICIENT_ETH", + 517: "UNALLOCATED_ETH", + 518: "ETH_TRANSFER", + 519: "CANNOT_USE_ETH_SENTINEL", + 520: "TOKENS_MISMATCH", + 521: "TOKEN_NOT_REGISTERED", + 522: "TOKEN_ALREADY_REGISTERED", + 523: "TOKENS_ALREADY_SET", + 524: "TOKENS_LENGTH_MUST_BE_2", + 525: "NONZERO_TOKEN_BALANCE", + 526: "BALANCE_TOTAL_OVERFLOW", + 600: "SWAP_FEE_PERCENTAGE_TOO_HIGH", + 601: "FLASH_LOAN_FEE_PERCENTAGE_TOO_HIGH", + 602: "INSUFFICIENT_FLASH_LOAN_FEE_AMOUNT", +} + def translateError(code): - return(codes[code]) + return codes[code] + def handleException(error): - stringError = str('{}'.format(error)); - if "BAL#" in stringError: - code = int(stringError.split("BAL#")[1]) - balError = translateError(code); - descriptiveError = "Balancer Smart Contract threw error: " + balError; - return(descriptiveError); - else: - return(stringError); + stringError = str("{}".format(error)) + if "BAL#" in stringError: + code = int(stringError.split("BAL#")[1]) + balError = translateError(code) + descriptiveError = "Balancer Smart Contract threw error: " + balError + return descriptiveError + else: + return stringError diff --git a/balpy/balancerv2cad/scripts/project_helper.py b/balpy/balancerv2cad/scripts/project_helper.py index 7907dc5..2900ecd 100644 --- a/balpy/balancerv2cad/scripts/project_helper.py +++ b/balpy/balancerv2cad/scripts/project_helper.py @@ -6,6 +6,7 @@ import sys import balancerv2cad as ks + # from balancerv2cad import PKG_NAME, BASE_DIR @@ -15,14 +16,15 @@ def stub_gen() -> None: for the package """ out_file = f"src/{ks.__package__}-stubs" - path = str(ks.BASE_DIR / 'src' / f'{ks.__package__}') + path = str(ks.BASE_DIR / "src" / f"{ks.__package__}") try: - sp.run(f'stubgen -p {ks.__package__} -o {out_file}', - check=True, - shell=True) - sp.run(f'mypy {path}', check=True, shell=True) + sp.run( + f"stubgen -p {ks.__package__} -o {out_file}", + check=True, + shell=True) + sp.run(f"mypy {path}", check=True, shell=True) except sp.CalledProcessError as error: - print(f'{error}') + print(f"{error}") sys.exit(1) @@ -30,11 +32,11 @@ def run_analyzer() -> None: """ Run the mypy static type checking analyzer """ - path = str(ks.BASE_DIR / 'src' / f'{ks.__package__}') + path = str(ks.BASE_DIR / "src" / f"{ks.__package__}") try: - sp.run(f'mypy {path}', check=True, shell=True) + sp.run(f"mypy {path}", check=True, shell=True) except sp.CalledProcessError as error: - print(f'{error}') + print(f"{error}") sys.exit(1) @@ -46,7 +48,7 @@ def run_tests(): These functions can be as complicated or as simple as you like """ try: - sp.run('pytest --capture=tee-sys', check=True, shell=True) + sp.run("pytest --capture=tee-sys", check=True, shell=True) except sp.CalledProcessError as error: print(f"{error}") sys.exit(1) diff --git a/balpy/balancerv2cad/src/balancerv2cad/BalancerConstants.py b/balpy/balancerv2cad/src/balancerv2cad/BalancerConstants.py index 4d0e0b2..01dc08e 100644 --- a/balpy/balancerv2cad/src/balancerv2cad/BalancerConstants.py +++ b/balpy/balancerv2cad/src/balancerv2cad/BalancerConstants.py @@ -1,16 +1,15 @@ from decimal import Decimal - -BONE = Decimal('1') -MIN_FEE = Decimal('0.000001') -MAX_FEE = Decimal('0.1') -INIT_POOL_SUPPLY = BONE * Decimal('100') +BONE = Decimal("1") +MIN_FEE = Decimal("0.000001") +MAX_FEE = Decimal("0.1") +INIT_POOL_SUPPLY = BONE * Decimal("100") MIN_BOUND_TOKENS = 2 MAX_BOUND_TOKENS = 8 -AMPLIFICATION_PARAMETER = Decimal('200') +AMPLIFICATION_PARAMETER = Decimal("200") MIN_WEIGHT = 0.01 _MAX_WEIGHTED_TOKENS = 100 _MAX_IN_RATIO = 0.3 _MAX_OUT_RATIO = 0.3 _MAX_INVARIANT_RATIO = 3 -_MIN_INVARIANT_RATIO = 0.7 \ No newline at end of file +_MIN_INVARIANT_RATIO = 0.7 diff --git a/balpy/balancerv2cad/src/balancerv2cad/StableMath.py b/balpy/balancerv2cad/src/balancerv2cad/StableMath.py index 6e6bda8..802514f 100644 --- a/balpy/balancerv2cad/src/balancerv2cad/StableMath.py +++ b/balpy/balancerv2cad/src/balancerv2cad/StableMath.py @@ -1,10 +1,13 @@ -from decimal import * +from decimal import Decimal, getcontext +from math import ceil from typing import List + from attr import dataclass -from math import ceil, floor -from balancerv2cad.util import * +from balancerv2cad.util import complement, divDown, divUp, mulDown, mulUp getcontext().prec = 28 + + @dataclass class BalancerMathResult: result: Decimal @@ -12,11 +15,10 @@ class BalancerMathResult: class StableMath: - -# ------------------------------------- + # ------------------------------------- @staticmethod - def calculateInvariant(amplificationParameter: Decimal, balances: list) -> Decimal: - + def calculateInvariant(amplificationParameter: Decimal, + balances: list) -> Decimal: # /********************************************************************************************** # // invariant // # // D = invariant D^(n+1) // @@ -30,33 +32,44 @@ def calculateInvariant(amplificationParameter: Decimal, balances: list) -> Decim for bal in balances: bal_sum += bal num_tokens = len(balances) - if(bal_sum==0): + if bal_sum == 0: return 0 prevInvariant = 0 invariant = bal_sum - ampTimesTotal = amplificationParameter*num_tokens + ampTimesTotal = amplificationParameter * num_tokens for i in range(255): - P_D = num_tokens*balances[0] + P_D = num_tokens * balances[0] for j in range(1, num_tokens): - P_D = ceil(((P_D*balances[j])*num_tokens)/invariant) + P_D = ceil(((P_D * balances[j]) * num_tokens) / invariant) prevInvariant = invariant - invariant = ceil(((num_tokens*invariant)*invariant + (ampTimesTotal*bal_sum)*P_D) / ((num_tokens + 1)*invariant + (ampTimesTotal - 1)*P_D)) - if(invariant > prevInvariant): - if(invariant - prevInvariant <= 1): + invariant = ceil( + ((num_tokens * invariant) * invariant + + (ampTimesTotal * bal_sum) * P_D) + / ((num_tokens + 1) * invariant + (ampTimesTotal - 1) * P_D) + ) + if invariant > prevInvariant: + if invariant - prevInvariant <= 1: break - elif(prevInvariant - invariant <= 1): + elif prevInvariant - invariant <= 1: break return Decimal(invariant) - - # Flow of calculations: # amountsTokenOut -> amountsOutProportional -> - # amountOutPercentageExcess -> amountOutBeforeFee -> newInvariant -> amountBPTIn + # amountOutPercentageExcess -> amountOutBeforeFee -> newInvariant -> + # amountBPTIn @staticmethod - def calcBptInGivenExactTokensOut(amplificationParameter: Decimal, balances: list, amountsOut: list, bptTotalSupply: Decimal, swapFee: Decimal) -> Decimal: - currentInvariants = StableMath.calculateInvariant(amplificationParameter, balances) + def calcBptInGivenExactTokensOut( + amplificationParameter: Decimal, + balances: list, + amountsOut: list, + bptTotalSupply: Decimal, + swapFee: Decimal, + ) -> Decimal: + currentInvariants = StableMath.calculateInvariant( + amplificationParameter, balances + ) # calculate the sum of all token balances sumBalances = Decimal(0) for i in range(len(balances)): @@ -68,8 +81,12 @@ def calcBptInGivenExactTokensOut(amplificationParameter: Decimal, balances: list getcontext().prec = 28 for i in range(len(balances)): currentWeight = divUp(balances[i], sumBalances) - tokenBalanceRatiosWithoutFee[i] = balances[i] - divUp(amountsOut[i], balances[i]) - weightedBalanceRatio = weightedBalanceRatio + mulUp(tokenBalanceRatiosWithoutFee[i], currentWeight) + tokenBalanceRatiosWithoutFee[i] = balances[i] - divUp( + amountsOut[i], balances[i] + ) + weightedBalanceRatio = weightedBalanceRatio + mulUp( + tokenBalanceRatiosWithoutFee[i], currentWeight + ) newBalances = [] for i in range(len(balances)): @@ -77,23 +94,43 @@ def calcBptInGivenExactTokensOut(amplificationParameter: Decimal, balances: list if weightedBalanceRatio <= tokenBalanceRatiosWithoutFee[i]: tokenBalancePercentageExcess = 0 else: - tokenBalancePercentageExcess = weightedBalanceRatio - Decimal(divUp(tokenBalanceRatiosWithoutFee[i], Decimal(complement(tokenBalanceRatiosWithoutFee[i])))) - - swapFeeExcess = mulUp(swapFee, Decimal(tokenBalancePercentageExcess)) - amountOutBeforeFee = Decimal(divUp(amountsOut[i], complement(swapFeeExcess))) + tokenBalancePercentageExcess = weightedBalanceRatio - Decimal( + divUp( + tokenBalanceRatiosWithoutFee[i], + Decimal(complement(tokenBalanceRatiosWithoutFee[i])), + ) + ) + + swapFeeExcess = mulUp( + swapFee, Decimal(tokenBalancePercentageExcess)) + amountOutBeforeFee = Decimal( + divUp(amountsOut[i], complement(swapFeeExcess)) + ) newBalances.append(balances[i] - amountOutBeforeFee) # get the new invariant, taking Decimalo account swap fees - newInvariant = StableMath.calculateInvariant(amplificationParameter, newBalances) + newInvariant = StableMath.calculateInvariant( + amplificationParameter, newBalances + ) # return amountBPTIn - return bptTotalSupply * Decimal(divUp(newInvariant, complement(currentInvariants))) - + return bptTotalSupply * Decimal( + divUp(newInvariant, complement(currentInvariants)) + ) @staticmethod - def calcBptOutGivenExactTokensIn(amplificationParameter: Decimal, balances: list, amountsIn: list, bptTotalSupply: Decimal, swapFee: Decimal, swapFeePercentage: Decimal) -> Decimal: + def calcBptOutGivenExactTokensIn( + amplificationParameter: Decimal, + balances: list, + amountsIn: list, + bptTotalSupply: Decimal, + swapFee: Decimal, + swapFeePercentage: Decimal, + ) -> Decimal: # get current invariant - currentInvariant = StableMath.calculateInvariant(amplificationParameter, balances) + currentInvariant = StableMath.calculateInvariant( + amplificationParameter, balances + ) sumBalances = Decimal(0) for i in range(len(balances)): @@ -104,8 +141,13 @@ def calcBptOutGivenExactTokensIn(amplificationParameter: Decimal, balances: list weightedBalanceRatio = 0 for i in range(len(balances)): currentWeight = divDown(Decimal(balances[i]), Decimal(sumBalances)) - tokenBalanceRatiosWithoutFee.append(balances[i] + divDown(Decimal(amountsIn[i]), Decimal(balances[i]))) - weightedBalanceRatio = weightedBalanceRatio + mulDown(tokenBalanceRatiosWithoutFee[i], currentWeight) + tokenBalanceRatiosWithoutFee.append( + balances[i] + divDown(Decimal(amountsIn[i]), + Decimal(balances[i])) + ) + weightedBalanceRatio = weightedBalanceRatio + mulDown( + tokenBalanceRatiosWithoutFee[i], currentWeight + ) tokenBalancePercentageExcess = Decimal(0) newBalances = [] @@ -113,22 +155,36 @@ def calcBptOutGivenExactTokensIn(amplificationParameter: Decimal, balances: list if weightedBalanceRatio >= tokenBalanceRatiosWithoutFee[i]: tokenBalancePercentageExcess = Decimal(0) else: - tokenBalancePercentageExcess = tokenBalanceRatiosWithoutFee[i] - divUp(weightedBalanceRatio, (tokenBalanceRatiosWithoutFee[i])) - - swapFeeExcess = mulUp(Decimal(swapFeePercentage), tokenBalancePercentageExcess) - amountInAfterFee = mulDown(Decimal(amountsIn[i]), Decimal(complement(swapFeeExcess))) + tokenBalancePercentageExcess = tokenBalanceRatiosWithoutFee[i] - divUp( + weightedBalanceRatio, (tokenBalanceRatiosWithoutFee[i]) + ) + + swapFeeExcess = mulUp( + Decimal(swapFeePercentage), tokenBalancePercentageExcess + ) + amountInAfterFee = mulDown( + Decimal(amountsIn[i]), Decimal(complement(swapFeeExcess)) + ) newBalances.append(balances[i] + amountInAfterFee) # get new invariant, taking swap fees Decimalo account - newInvariant = Decimal(StableMath.calculateInvariant(amplificationParameter, newBalances)) + newInvariant = Decimal( + StableMath.calculateInvariant(amplificationParameter, newBalances) + ) # return amountBPTOut - return Decimal(mulDown(bptTotalSupply, divDown(newInvariant, currentInvariant))) # TODO omitted subtracting ONE from current_invariant + return Decimal( + mulDown(bptTotalSupply, divDown(newInvariant, currentInvariant)) + ) # TODO omitted subtracting ONE from current_invariant @staticmethod - - - def calcDueTokenProtocolSwapFeeAmount(amplificationParameter: Decimal, balances: list, lastInvariant: Decimal, tokenIndex: int, protocolSwapFeePercentage: float) -> Decimal: + def calcDueTokenProtocolSwapFeeAmount( + amplificationParameter: Decimal, + balances: list, + lastInvariant: Decimal, + tokenIndex: int, + protocolSwapFeePercentage: float, + ) -> Decimal: # /************************************************************************************************************** # // oneTokenSwapFee - polynomial equation to solve // # // af = fee amount to calculate in one token // @@ -140,22 +196,32 @@ def calcDueTokenProtocolSwapFeeAmount(amplificationParameter: Decimal, balances: # // S = sum of final balances but f // # // P = product of final balances but f // # ******* - finalBalanceFeeToken = StableMath.getTokenBalanceGivenInvariantAndAllOtherBalances( - amplificationParameter, - balances, - lastInvariant, - tokenIndex) - - if(balances[tokenIndex] > finalBalanceFeeToken): - accumulatedTokenSwapFees = balances[tokenIndex] - finalBalanceFeeToken + finalBalanceFeeToken = ( + StableMath.getTokenBalanceGivenInvariantAndAllOtherBalances( + amplificationParameter, balances, lastInvariant, tokenIndex + ) + ) + + if balances[tokenIndex] > finalBalanceFeeToken: + accumulatedTokenSwapFees = balances[tokenIndex] - \ + finalBalanceFeeToken else: accumulatedTokenSwapFees = 0 - return divDown(mulDown(accumulatedTokenSwapFees, Decimal(protocolSwapFeePercentage))) + return divDown( + mulDown( + accumulatedTokenSwapFees, + Decimal(protocolSwapFeePercentage)) + ) @staticmethod - def calcInGivenOut(amplificationParameter: Decimal, balances: list, tokenIndexIn: int, tokenIndexOut: int, tokenAmountOut: Decimal) -> Decimal: - + def calcInGivenOut( + amplificationParameter: Decimal, + balances: list, + tokenIndexIn: int, + tokenIndexOut: int, + tokenAmountOut: Decimal, + ) -> Decimal: # /************************************************************************************************************** # // inGivenOut token x for y - polynomial equation to solve // # // ax = amount in to calculate // @@ -168,25 +234,26 @@ def calcInGivenOut(amplificationParameter: Decimal, balances: list, tokenIndexIn # // P = product of final balances but x // # **************************************************************************************************************/ getcontext().prec = 28 - invariant = StableMath.calculateInvariant(amplificationParameter, balances) + invariant = StableMath.calculateInvariant( + amplificationParameter, balances) balances[tokenIndexOut] = balances[tokenIndexOut] - tokenAmountOut finalBalanceIn = StableMath.getTokenBalanceGivenInvariantAndAllOtherBalances( - amplificationParameter, - balances, - invariant, - tokenIndexIn + amplificationParameter, balances, invariant, tokenIndexIn ) - balances[tokenIndexOut] = balances[tokenIndexOut]+ tokenAmountOut - result = finalBalanceIn - balances[tokenIndexIn] + Decimal(1/1e18) + balances[tokenIndexOut] = balances[tokenIndexOut] + tokenAmountOut + result = finalBalanceIn - balances[tokenIndexIn] + Decimal(1 / 1e18) return result @staticmethod - - - def calcOutGivenIn(amplificationParameter: Decimal, balances: list, tokenIndexIn: int, tokenIndexOut: int, tokenAmountIn: Decimal) -> Decimal: - + def calcOutGivenIn( + amplificationParameter: Decimal, + balances: list, + tokenIndexIn: int, + tokenIndexOut: int, + tokenAmountIn: Decimal, + ) -> Decimal: # /************************************************************************************************************** # // outGivenIn token x for y - polynomial equation to solve // # // ay = amount out to calculate // @@ -198,20 +265,25 @@ def calcOutGivenIn(amplificationParameter: Decimal, balances: list, tokenIndexIn # // S = sum of final balances but y // # // P = product of final balances but y // # **************************************************************************************************************/ - print("Context", "OUTGIVENIN" ) - invariant = StableMath.calculateInvariant(amplificationParameter, balances) + print("Context", "OUTGIVENIN") + invariant = StableMath.calculateInvariant( + amplificationParameter, balances) print("Invariant", invariant) balances[tokenIndexIn] = balances[tokenIndexIn] + tokenAmountIn - finalBalanceOut = StableMath.getTokenBalanceGivenInvariantAndAllOtherBalances(amplificationParameter, balances, invariant, tokenIndexOut) + finalBalanceOut = StableMath.getTokenBalanceGivenInvariantAndAllOtherBalances( + amplificationParameter, balances, invariant, tokenIndexOut + ) print("FinalBalance Out", finalBalanceOut) balances[tokenIndexIn] = balances[tokenIndexIn] - tokenAmountIn - result = balances [tokenIndexOut] - finalBalanceOut # TODO took out .sub(1) at the end of this statement + result = ( + balances[tokenIndexOut] - finalBalanceOut + ) # TODO took out .sub(1) at the end of this statement print(result) - print("END-CONTEXT", "OUTGIVENIN" ) + print("END-CONTEXT", "OUTGIVENIN") return result # Flow of calculations: @@ -219,16 +291,25 @@ def calcOutGivenIn(amplificationParameter: Decimal, balances: list, tokenIndexIn # amountInPercentageExcess -> amountIn @staticmethod - - - def calcTokenInGivenExactBptOut(amplificationParameter: Decimal, balances: list, tokenIndex: int, bptAmountOut: Decimal, bptTotalSupply: Decimal, swapFeePercentage: Decimal) -> Decimal: + def calcTokenInGivenExactBptOut( + amplificationParameter: Decimal, + balances: list, + tokenIndex: int, + bptAmountOut: Decimal, + bptTotalSupply: Decimal, + swapFeePercentage: Decimal, + ) -> Decimal: # Token in so we round up overall - #Get the current invariant - currentInvariant = Decimal(StableMath.calculateInvariant(amplificationParameter, balances)) + # Get the current invariant + currentInvariant = Decimal( + StableMath.calculateInvariant(amplificationParameter, balances) + ) # Calculate new invariant - newInvariant = divUp((bptTotalSupply + bptAmountOut), mulUp(bptTotalSupply, currentInvariant)) + newInvariant = divUp( + (bptTotalSupply + bptAmountOut), mulUp(bptTotalSupply, currentInvariant) + ) # First calculate the sum of all token balances, which will be used # to calculate the current weight of each token @@ -237,7 +318,11 @@ def calcTokenInGivenExactBptOut(amplificationParameter: Decimal, balances: list, sumBalances += balances[i] # get amountInAfterFee - newBalanceTokenIndex = StableMath.getTokenBalanceGivenInvariantAndAllOtherBalances(amplificationParameter, balances, newInvariant, tokenIndex) + newBalanceTokenIndex = ( + StableMath.getTokenBalanceGivenInvariantAndAllOtherBalances( + amplificationParameter, balances, newInvariant, tokenIndex + ) + ) amountInAfterFee = newBalanceTokenIndex - balances[tokenIndex] # Get tokenBalancePercentageExcess @@ -248,10 +333,9 @@ def calcTokenInGivenExactBptOut(amplificationParameter: Decimal, balances: list, return divUp(amountInAfterFee, complement(complement(swapFeeExcess))) @staticmethod - - - def calcTokensOutGivenExactBptIn(balances: list, bptAmountIn: Decimal, bptTotalSupply: Decimal) -> list: - + def calcTokensOutGivenExactBptIn( + balances: list, bptAmountIn: Decimal, bptTotalSupply: Decimal + ) -> list: # /********************************************************************************************** # // exactBPTInForTokensOut // # // (per token) // @@ -274,13 +358,22 @@ def calcTokensOutGivenExactBptIn(balances: list, bptAmountIn: Decimal, bptTotalS # amountOutPercentageExcess -> amountOut @staticmethod - - - def calcTokenOutGivenExactBptIn(amplificationParameter, balances: list, tokenIndex: int, bptAmountIn: Decimal, bptTotalSupply: Decimal, swapFeePercentage: Decimal) -> Decimal: + def calcTokenOutGivenExactBptIn( + amplificationParameter, + balances: list, + tokenIndex: int, + bptAmountIn: Decimal, + bptTotalSupply: Decimal, + swapFeePercentage: Decimal, + ) -> Decimal: # Get current invariant - currentInvariant = StableMath.calculateInvariant(amplificationParameter, balances) + currentInvariant = StableMath.calculateInvariant( + amplificationParameter, balances + ) # calculate the new invariant - newInvariant = bptTotalSupply - divUp(bptAmountIn, mulUp(bptTotalSupply, currentInvariant)) + newInvariant = bptTotalSupply - divUp( + bptAmountIn, mulUp(bptTotalSupply, currentInvariant) + ) # calculate the sum of all th etoken balances, which will be used to calculate # the current weight of each token @@ -289,7 +382,11 @@ def calcTokenOutGivenExactBptIn(amplificationParameter, balances: list, tokenInd sumBalances += balances[i] # get amountOutBeforeFee - newBalanceTokenIndex = StableMath.getTokenBalanceGivenInvariantAndAllOtherBalances(amplificationParameter, balances, newInvariant, tokenIndex) + newBalanceTokenIndex = ( + StableMath.getTokenBalanceGivenInvariantAndAllOtherBalances( + amplificationParameter, balances, newInvariant, tokenIndex + ) + ) amountOutBeforeFee = balances[tokenIndex] - newBalanceTokenIndex # calculate tokenBalancePercentageExcess @@ -300,33 +397,37 @@ def calcTokenOutGivenExactBptIn(amplificationParameter, balances: list, tokenInd return mulDown(amountOutBeforeFee, complement(swapFeeExcess)) - # ------------------------------------ @staticmethod - - - def getTokenBalanceGivenInvariantAndAllOtherBalances(amplificationParameter: Decimal, balances: List[Decimal], invariant: Decimal, tokenIndex: int) -> Decimal: + def getTokenBalanceGivenInvariantAndAllOtherBalances( + amplificationParameter: Decimal, + balances: List[Decimal], + invariant: Decimal, + tokenIndex: int, + ) -> Decimal: getcontext().prec = 28 ampTimesTotal = amplificationParameter * len(balances) bal_sum = Decimal(sum(balances)) P_D = len(balances) * balances[0] for i in range(1, len(balances)): - P_D = (P_D*balances[i]*len(balances))/invariant + P_D = (P_D * balances[i] * len(balances)) / invariant bal_sum -= balances[tokenIndex] - c = invariant*invariant/ampTimesTotal + c = invariant * invariant / ampTimesTotal c = divUp(mulUp(c, balances[tokenIndex]), P_D) b = bal_sum + divDown(invariant, ampTimesTotal) prevTokenbalance = 0 - tokenBalance = divUp((invariant*invariant+c), (invariant+b)) + tokenBalance = divUp((invariant * invariant + c), (invariant + b)) for i in range(255): prevTokenbalance = tokenBalance - tokenBalance = divUp((mulUp(tokenBalance,tokenBalance) + c),((tokenBalance*Decimal(2))+b-invariant)) - if(tokenBalance > prevTokenbalance): - if(tokenBalance-prevTokenbalance <= 1/1e18): + tokenBalance = divUp( + (mulUp(tokenBalance, tokenBalance) + c), + ((tokenBalance * Decimal(2)) + b - invariant), + ) + if tokenBalance > prevTokenbalance: + if tokenBalance - prevTokenbalance <= 1 / 1e18: break - elif(prevTokenbalance-tokenBalance <= 1/1e18): + elif prevTokenbalance - tokenBalance <= 1 / 1e18: break return tokenBalance - diff --git a/balpy/balancerv2cad/src/balancerv2cad/StablePool.py b/balpy/balancerv2cad/src/balancerv2cad/StablePool.py index 99011c9..91f8517 100644 --- a/balpy/balancerv2cad/src/balancerv2cad/StablePool.py +++ b/balpy/balancerv2cad/src/balancerv2cad/StablePool.py @@ -1,30 +1,40 @@ -from decimal import * -from typing import List +from decimal import Decimal + +from balancerv2cad.BalancerConstants import ( + AMPLIFICATION_PARAMETER, + INIT_POOL_SUPPLY, + MIN_FEE, +) from balancerv2cad.StableMath import StableMath -from balancerv2cad.WeightedPool import WeightedPool -from balancerv2cad.BalancerConstants import * class StablePool(StableMath): - def __init__(self, initial_pool_supply: Decimal = INIT_POOL_SUPPLY): self._swap_fee = MIN_FEE self._pool_token_supply = initial_pool_supply - self.factory_fees = Decimal('0') + self.factory_fees = Decimal("0") self._balances = {} - def swap(self, token_in: str, token_out: str, amount: Decimal, given_in: bool = True): - if(isinstance(amount,int) or isinstance(amount,float)): + def swap( + self, token_in: str, token_out: str, amount: Decimal, given_in: bool = True + ): + if isinstance(amount, int) or isinstance(amount, float): amount = Decimal(amount) - elif(not isinstance(amount, Decimal)): + elif not isinstance(amount, Decimal): raise Exception("INCORRECT_TYPE") - factory_fee = amount*self._swap_fee + factory_fee = amount * self._swap_fee swap_amount = amount - factory_fee self.factory_fees += factory_fee balances = [self._balances[token_in], self._balances[token_out]] - if(given_in): amount_out = StableMath.calcOutGivenIn(AMPLIFICATION_PARAMETER, balances, 0, 1, swap_amount) - else: amount_out = StableMath.calcInGivenOut(AMPLIFICATION_PARAMETER, balances, 0, 1, swap_amount) + if given_in: + amount_out = StableMath.calcOutGivenIn( + AMPLIFICATION_PARAMETER, balances, 0, 1, swap_amount + ) + else: + amount_out = StableMath.calcInGivenOut( + AMPLIFICATION_PARAMETER, balances, 0, 1, swap_amount + ) self._balances[token_out] -= amount_out self._balances[token_in] += swap_amount @@ -37,7 +47,7 @@ def join_pool(self, balances: dict): if key in self._balances: self._balances[key] += balances[key] else: - self._balances.update({key:balances[key]}) + self._balances.update({key: balances[key]}) def get_amplification_parameter(self): return self.AMPLIFICATION_PARAMETER @@ -48,9 +58,10 @@ def _get_total_tokens(self): def exit_pool(self, balances: dict): bals = self._balances - balances for key in bals: - if(bals[key]<0): bals[key] = 0 + if bals[key] < 0: + bals[key] = 0 self._balances = bals - + def set_swap_fee(self, amount: Decimal): self._swap_fee = amount diff --git a/balpy/balancerv2cad/src/balancerv2cad/WeightedMath.py b/balpy/balancerv2cad/src/balancerv2cad/WeightedMath.py index bb28555..dfb342e 100644 --- a/balpy/balancerv2cad/src/balancerv2cad/WeightedMath.py +++ b/balpy/balancerv2cad/src/balancerv2cad/WeightedMath.py @@ -1,15 +1,22 @@ +import sys # todo delete later from decimal import Decimal -from balancerv2cad.util import * -from balancerv2cad.BalancerConstants import * from typing import List -import sys # todo delete later +from balancerv2cad.util import ( + complement, + divDown, + divUp, + mulDown, + mulUp, + powDown, + powUp, +) -class WeightedMath: +class WeightedMath: @staticmethod - def calculate_invariant(normalized_weights: List[Decimal], balances: List[Decimal]): - + def calculate_invariant( + normalized_weights: List[Decimal], balances: List[Decimal]): # /********************************************************************************************** # // invariant _____ // # // wi = weight index i | | wi // @@ -19,16 +26,19 @@ def calculate_invariant(normalized_weights: List[Decimal], balances: List[Decima invariant = Decimal(1) for i in range(len(normalized_weights)): - invariant = mulDown(invariant, (powDown(balances[i], normalized_weights[i]))) + invariant = mulDown( + invariant, (powDown(balances[i], normalized_weights[i])) + ) return invariant @staticmethod - def calc_out_given_in(balance_in: Decimal, - weight_in: Decimal, - balance_out: Decimal, - weight_out: Decimal, - amount_in: Decimal) -> Decimal: - + def calc_out_given_in( + balance_in: Decimal, + weight_in: Decimal, + balance_out: Decimal, + weight_out: Decimal, + amount_in: Decimal, + ) -> Decimal: # /********************************************************************************************** # // outGivenIn // # // aO = amountOut // @@ -41,18 +51,22 @@ def calc_out_given_in(balance_in: Decimal, denominator = balance_in + amount_in base = divUp(balance_in, denominator) # balanceIn.divUp(denominator); - exponent = divDown(weight_in, weight_out) # weightIn.divDown(weightOut); + # weightIn.divDown(weightOut); + exponent = divDown(weight_in, weight_out) power = powUp(base, exponent) # base.powUp(exponent); - return mulDown(balance_out, complement(power)) # balanceOut.mulDown(power.complement()); + return mulDown( + balance_out, complement(power) + ) # balanceOut.mulDown(power.complement()); @staticmethod - def calc_in_given_out(balance_in: Decimal, - weight_in: Decimal, - balance_out: Decimal, - weight_out: Decimal, - amount_out: Decimal): - + def calc_in_given_out( + balance_in: Decimal, + weight_in: Decimal, + balance_out: Decimal, + weight_out: Decimal, + amount_out: Decimal, + ): # /********************************************************************************************** # // inGivenOut // # // aO = amount_out // @@ -69,33 +83,47 @@ def calc_in_given_out(balance_in: Decimal, ratio = power - Decimal(1) result = mulUp(balance_in, ratio) return result - - @staticmethod - def calc_bpt_out_given_exact_tokens_in(balances: List[Decimal], normalized_weights: List[Decimal], amounts_in: List[Decimal], - bptTotalSupply: Decimal, - swap_fee: Decimal): + @staticmethod + def calc_bpt_out_given_exact_tokens_in( + balances: List[Decimal], + normalized_weights: List[Decimal], + amounts_in: List[Decimal], + bptTotalSupply: Decimal, + swap_fee: Decimal, + ): balance_ratios_with_fee = [None] * len(amounts_in) invariant_ratio_with_fees = 0 for i in range(len(balances)): - balance_ratios_with_fee[i] = divDown((balances[i] + amounts_in[i]), balances[i]) - invariant_ratio_with_fees = mulDown((invariant_ratio_with_fees + balance_ratios_with_fee[i]), normalized_weights[i]) #.add(balance_ratios_with_fee[i].mulDown(normalized_weights[i])); - + balance_ratios_with_fee[i] = divDown( + (balances[i] + amounts_in[i]), balances[i] + ) + invariant_ratio_with_fees = mulDown( + (invariant_ratio_with_fees + balance_ratios_with_fee[i]), + normalized_weights[i], + ) # .add(balance_ratios_with_fee[i].mulDown(normalized_weights[i])); invariant_ratio = Decimal(1) for i in range(len(balances)): amount_in_without_fee = None - if(balance_ratios_with_fee[i] > invariant_ratio_with_fees): - non_taxable_amount = mulDown(balances[i], (invariant_ratio - Decimal(1))) + if balance_ratios_with_fee[i] > invariant_ratio_with_fees: + non_taxable_amount = mulDown( + balances[i], (invariant_ratio - Decimal(1)) + ) taxable_amount = amounts_in[i] - non_taxable_amount - amount_in_without_fee = non_taxable_amount + (mulDown(taxable_amount, Decimal(1) - swap_fee)) + amount_in_without_fee = non_taxable_amount + ( + mulDown(taxable_amount, Decimal(1) - swap_fee) + ) else: amount_in_without_fee = amounts_in[i] - - balance_ratio = divDown((balances[i] + amount_in_without_fee), balances[i]) - invariant_ratio = mulDown(invariant_ratio, (powDown(balance_ratio, normalized_weights[i]))) + balance_ratio = divDown( + (balances[i] + amount_in_without_fee), balances[i]) + invariant_ratio = mulDown( + invariant_ratio, (powDown( + balance_ratio, normalized_weights[i])) + ) if invariant_ratio >= 1: return mulDown(bptTotalSupply, (invariant_ratio - Decimal(1))) @@ -108,9 +136,8 @@ def calc_token_in_given_exact_bpt_out( normalized_weight: Decimal, bpt_amount_out: Decimal, bpt_total_supply: Decimal, - swap_fee: Decimal + swap_fee: Decimal, ) -> Decimal: - # /****************************************************************************************** # // tokenInForExactBPTOut // # // a = amountIn // @@ -120,57 +147,72 @@ def calc_token_in_given_exact_bpt_out( # // w = weight // # ******************************************************************************************/ - invariant_ratio = divUp((bpt_total_supply + bpt_amount_out), bpt_total_supply) + invariant_ratio = divUp( + (bpt_total_supply + bpt_amount_out), + bpt_total_supply) sys.stdout.write(f"invariant ratio {invariant_ratio}") - balance_ratio = powUp(invariant_ratio, (divUp(Decimal(1), normalized_weight))) + balance_ratio = powUp( + invariant_ratio, (divUp( + Decimal(1), normalized_weight))) sys.stdout.write(f"normalized weight {normalized_weight}") amount_in_without_fee = mulUp(balance, (balance_ratio - Decimal(1))) taxable_percentage = complement(normalized_weight) taxable_amount = mulUp(amount_in_without_fee, taxable_percentage) non_taxable_amount = amount_in_without_fee - taxable_amount sys.stdout.write(f" swap fee {swap_fee}") - return non_taxable_amount + (divUp(taxable_amount, complement(swap_fee))) + return non_taxable_amount + \ + (divUp(taxable_amount, complement(swap_fee))) @staticmethod - def calc_bpt_in_given_exact_tokens_out( balances: List[Decimal], normalized_weights: List[Decimal], amounts_out: List[Decimal], bpt_total_supply: Decimal, - swap_fee: Decimal + swap_fee: Decimal, ) -> Decimal: - balance_ratios_without_fee = [Decimal(0)] * len(amounts_out) invariant_ratio_without_fees = Decimal(0) for i in range(len(balances)): - balance_ratios_without_fee[i] = divUp((balances[i] - amounts_out[i]), balances[i]) - sys.stdout.write(f"{balances[i]}{amounts_out[i]}{balances[i]}{balance_ratios_without_fee} balance ratio") - invariant_ratio_without_fees = invariant_ratio_without_fees + (mulUp(balance_ratios_without_fee[i], normalized_weights[i])) + balance_ratios_without_fee[i] = divUp( + (balances[i] - amounts_out[i]), balances[i] + ) + sys.stdout.write( + f"{balances[i]}{amounts_out[i]}{balances[i]}{balance_ratios_without_fee} balance ratio" + ) + invariant_ratio_without_fees = invariant_ratio_without_fees + ( + mulUp(balance_ratios_without_fee[i], normalized_weights[i]) + ) invariant_ratio = Decimal(1) for i in range(len(balances)): amount_out_with_fee = None - if(invariant_ratio_without_fees > balance_ratios_without_fee[i]): - non_taxable_amount = mulDown(balances[i], (complement(invariant_ratio_without_fees))) + if invariant_ratio_without_fees > balance_ratios_without_fee[i]: + non_taxable_amount = mulDown( + balances[i], (complement(invariant_ratio_without_fees)) + ) taxable_amount = amounts_out[i] - non_taxable_amount - amount_out_with_fee = non_taxable_amount + (divUp(taxable_amount, complement(swap_fee))) + amount_out_with_fee = non_taxable_amount + ( + divUp(taxable_amount, complement(swap_fee)) + ) else: amount_out_with_fee = amounts_out[i] - balance_ratio = divUp((balances[i] - amount_out_with_fee), balances[i]) - invariant_ratio = mulDown(invariant_ratio, (powDown(balance_ratio, normalized_weights[i]))) + balance_ratio = divUp( + (balances[i] - amount_out_with_fee), balances[i]) + invariant_ratio = mulDown( + invariant_ratio, (powDown( + balance_ratio, normalized_weights[i])) + ) return mulUp(bpt_total_supply, complement(invariant_ratio)) @staticmethod - def calc_token_out_given_exact_bpt_in( balance: Decimal, normalized_weight: Decimal, bpt_amount_in: Decimal, bpt_total_supply: Decimal, - swap_fee: Decimal + swap_fee: Decimal, ) -> Decimal: - # /***************************************************************************************** # // exactBPTInForTokenOut // # // a = amountOut // @@ -180,23 +222,24 @@ def calc_token_out_given_exact_bpt_in( # // w = weight // # *****************************************************************************************/ - invariant_ratio = divUp((bpt_total_supply - bpt_amount_in), bpt_total_supply) - balance_ratio = powUp(invariant_ratio, (divDown(Decimal(1), normalized_weight))) + invariant_ratio = divUp( + (bpt_total_supply - bpt_amount_in), + bpt_total_supply) + balance_ratio = powUp( + invariant_ratio, (divDown( + Decimal(1), normalized_weight))) amount_out_without_fee = mulDown(balance, complement(balance_ratio)) taxable_percentage = complement(normalized_weight) taxable_amount = mulUp(amount_out_without_fee, taxable_percentage) non_taxable_amount = amount_out_without_fee - taxable_amount - return non_taxable_amount + mulDown(taxable_amount, complement(swap_fee)) + return non_taxable_amount + \ + mulDown(taxable_amount, complement(swap_fee)) @staticmethod - def calc_tokens_out_given_exact_bpt_in( - balances: List[Decimal], - bpt_amount_in: Decimal, - total_bpt: Decimal + balances: List[Decimal], bpt_amount_in: Decimal, total_bpt: Decimal ) -> List: - # /********************************************************************************************** # // exactBPTInForTokensOut // # // (per token) // @@ -213,14 +256,13 @@ def calc_tokens_out_given_exact_bpt_in( return amounts_out @staticmethod - def calc_due_token_protocol_swap_fee_amount( balance: Decimal, normalized_weight: Decimal, previous_invariant: Decimal, current_invariant: Decimal, - protocol_swap_fee_percentage: Decimal) -> Decimal: - + protocol_swap_fee_percentage: Decimal, + ) -> Decimal: # /********************************************************************************* # /* protocol_swap_fee_percentage * balanceToken * ( 1 - (previous_invariant / current_invariant) ^ (1 / weightToken)) # *********************************************************************************/ diff --git a/balpy/balancerv2cad/src/balancerv2cad/WeightedPool.py b/balpy/balancerv2cad/src/balancerv2cad/WeightedPool.py index c2c2f3a..c7c5824 100644 --- a/balpy/balancerv2cad/src/balancerv2cad/WeightedPool.py +++ b/balpy/balancerv2cad/src/balancerv2cad/WeightedPool.py @@ -1,86 +1,94 @@ from decimal import Decimal + +from balancerv2cad.BalancerConstants import INIT_POOL_SUPPLY, MIN_FEE from balancerv2cad.WeightedMath import WeightedMath -from balancerv2cad.BalancerConstants import * class WeightedPool(WeightedMath): - def __init__(self, initial_pool_supply: Decimal = INIT_POOL_SUPPLY): self._swap_fee = MIN_FEE - self.total_weight = Decimal('0') + self.total_weight = Decimal("0") self._pool_token_supply = initial_pool_supply self.factory_fees = {} self._balances = {} self._weights = {} - - def swap(self, token_in: str, token_out: str, amount: Decimal, given_in: bool = True): - if(isinstance(amount,int) or isinstance(amount,float)): + def swap( + self, token_in: str, token_out: str, amount: Decimal, given_in: bool = True + ): + if isinstance(amount, int) or isinstance(amount, float): amount = Decimal(amount) - elif(not isinstance(amount, Decimal)): + elif not isinstance(amount, Decimal): raise Exception("INCORRECT_TYPE") - factory_fee = amount*self._swap_fee + factory_fee = amount * self._swap_fee swap_amount = amount - factory_fee self.factory_fees[token_in] += factory_fee balances = [self._balances[token_in], self._balances[token_out]] weights = [self._weights[token_in], self._weights[token_out]] - - if(given_in): - amount_out = WeightedMath.calc_out_given_in(balances[0], weights[0], balances[1], weights[1], swap_amount) + + if given_in: + amount_out = WeightedMath.calc_out_given_in( + balances[0], weights[0], balances[1], weights[1], swap_amount + ) self._balances[token_out] -= amount_out self._balances[token_in] += swap_amount - + else: - amount_in = WeightedMath.calc_in_given_out(balances[0], weights[0], balances[1], weights[1], swap_amount) + amount_in = WeightedMath.calc_in_given_out( + balances[0], weights[0], balances[1], weights[1], swap_amount + ) self._balances[token_out] -= swap_amount self._balances[token_in] += amount_in return amount_out if given_in else amount_in - + def join_pool(self, balances: dict, weights={}): - if(not balances.keys()==weights.keys()): raise Exception('KEYS NOT EQUAL') + if not balances.keys() == weights.keys(): + raise Exception("KEYS NOT EQUAL") for key in weights: - if(not isinstance(weights[key],Decimal)): - weights[key] = Decimal(weights[key]) - self.factory_fees.update({key:Decimal(0)}) - if(not isinstance(balances[key],Decimal)): - balances[key] = Decimal(balances[key]) - + if not isinstance(weights[key], Decimal): + weights[key] = Decimal(weights[key]) + self.factory_fees.update({key: Decimal(0)}) + if not isinstance(balances[key], Decimal): + balances[key] = Decimal(balances[key]) + for key in balances: if key in self._balances: self._balances[key] += balances[key] else: - self._balances.update({key:balances[key]}) + self._balances.update({key: balances[key]}) self._weights = weights - if(len(self._balances)>8): + if len(self._balances) > 8: raise Exception("over 8 tokens") - + def exit_pool(self, balances: dict): bals = self._balances - balances for key in bals: - if(bals[key]<0): bals[key] = 0 + if bals[key] < 0: + bals[key] = 0 self._balances = bals - + def set_swap_fee(self, amount: Decimal): - if(isinstance(amount,int) or isinstance(amount,float)): + if isinstance(amount, int) or isinstance(amount, float): amount = Decimal(amount) - elif(not isinstance(amount, Decimal)): + elif not isinstance(amount, Decimal): raise Exception("INCORRECT_TYPE") self._swap_fee = amount - + def set_weights(self, weights: dict): - if(not weights.keys() in self._weights): raise Exception('WEIGHT TICKER NOT FOUND, JOIN POOL FIRST') - for key in weights: - if(isinstance(amount,int) or isinstance(amount,float)): + if not weights.keys() in self._weights: + raise Exception("WEIGHT TICKER NOT FOUND, JOIN POOL FIRST") + for key, amount in weights.items(): + if isinstance(amount, int) or isinstance(amount, float): amount = Decimal(amount) - elif(not isinstance(amount, Decimal)): + elif not isinstance(amount, Decimal): raise Exception("INCORRECT_TYPE") self._weights[key] = weights[key] - + def _mint_pool_share(self, amount: Decimal): self._pool_token_supply += amount - + def _burn_pool_share(self, amount: Decimal): self._pool_token_supply -= amount @@ -88,5 +96,4 @@ def get_balances(self): return self._balances def get_factory_fees(self): - return self.factory_fees - + return self.factory_fees diff --git a/balpy/balancerv2cad/src/balancerv2cad/logger/pkg_logger.py b/balpy/balancerv2cad/src/balancerv2cad/logger/pkg_logger.py index 786123e..1a2f12b 100644 --- a/balpy/balancerv2cad/src/balancerv2cad/logger/pkg_logger.py +++ b/balpy/balancerv2cad/src/balancerv2cad/logger/pkg_logger.py @@ -10,12 +10,12 @@ from pathlib import PosixPath from typing import Literal +# balancerv2cader package +from balancerv2cad import BASE_DIR, DEFAULT_LOGGER_NAME, LOGGING_CONFIG + # 3rd party from colorama import Back, Fore, init -# balancerv2cader package -from balancerv2cad import LOGGING_CONFIG, DEFAULT_LOGGER_NAME, BASE_DIR - init(autoreset=True) @@ -23,6 +23,7 @@ class PackageLogger: """ Logging class """ + def __init__(self) -> None: # defaults to project root directory, change this # and __init__.py if you want the log file to go elsewhere @@ -49,19 +50,16 @@ def __load_configuration(self) -> None: dictConfig(LOGGING_CONFIG) except ValueError as error: print( - f'{Fore.RED}Loading default logging config failed, syntax error\n\n{error}' + f"{Fore.RED}Loading default logging config failed, syntax error\n\n{error}" ) sys.exit(1) except KeyError as error: - print( - f'{Fore.RED}Loading logging config failed, syntax error\n\n{error}' - ) + print(f"{Fore.RED}Loading logging config failed, syntax error\n\n{error}") sys.exit(1) @staticmethod - def get_logger( - name: Literal['production'] = DEFAULT_LOGGER_NAME - ) -> logging.Logger: + def get_logger(name: Literal["production"] + = DEFAULT_LOGGER_NAME) -> logging.Logger: """ Return a logger by name. Only logger names that are defined in the config @@ -71,8 +69,8 @@ def get_logger( """ # first test to see if the name is a valid defined logger name valid: bool = False - if LOGGING_CONFIG['loggers']: - for logger_name in LOGGING_CONFIG['loggers']: + if LOGGING_CONFIG["loggers"]: + for logger_name in LOGGING_CONFIG["loggers"]: if logger_name == name: valid = True @@ -80,8 +78,8 @@ def get_logger( # name passed is not a valid listed logger, # return dev as default logger print( - f'\n{Back.BLACK}{Fore.RED}{name}: IS NOT A VALID LOGGER\n' - f'{Back.BLACK}{Fore.YELLOW}FALLING BACK TO {DEFAULT_LOGGER_NAME}\n' + f"\n{Back.BLACK}{Fore.RED}{name}: IS NOT A VALID LOGGER\n" + f"{Back.BLACK}{Fore.YELLOW}FALLING BACK TO {DEFAULT_LOGGER_NAME}\n" ) logger = logging.getLogger(DEFAULT_LOGGER_NAME) return logger diff --git a/balpy/balancerv2cad/src/balancerv2cad/main.py b/balpy/balancerv2cad/src/balancerv2cad/main.py index 4e1eea0..6cb9e07 100644 --- a/balpy/balancerv2cad/src/balancerv2cad/main.py +++ b/balpy/balancerv2cad/src/balancerv2cad/main.py @@ -3,13 +3,13 @@ """ # standard lib -# third party -from dotenv import dotenv_values - # package import balancerv2cad as ks from balancerv2cad.logger import pkg_logger as pl +# third party +from dotenv import dotenv_values + logger = pl.PackageLogger().get_logger() @@ -20,15 +20,24 @@ def run() -> None: config: dict = dotenv_values(".env") try: - logger.info("CAPTAIN_ONE: %s :: package name: %s@%s", - config['CAPTAIN_ONE'], ks.__package__, ks.__version__) + logger.info( + "CAPTAIN_ONE: %s :: package name: %s@%s", + config["CAPTAIN_ONE"], + ks.__package__, + ks.__version__, + ) - logger.info("CAPTAIN_ONE: %s :: package name: %s@%s", - config['CAPTAIN_TWO'], ks.__package__, ks.__version__) + logger.info( + "CAPTAIN_ONE: %s :: package name: %s@%s", + config["CAPTAIN_TWO"], + ks.__package__, + ks.__version__, + ) except KeyError as error: logger.error( - 'Could not find %s in .env file. Please consult the README', error) - logger.info('Testing for %s@%s', ks.__package__, ks.__version__) - logger.debug('Testing for %s@%s', ks.__package__, ks.__version__) - logger.warning('Testing for %s@%s', ks.__package__, ks.__version__) - logger.error('Testing for %s@%s', ks.__package__, ks.__version__) + "Could not find %s in .env file. Please consult the README", + error) + logger.info("Testing for %s@%s", ks.__package__, ks.__version__) + logger.debug("Testing for %s@%s", ks.__package__, ks.__version__) + logger.warning("Testing for %s@%s", ks.__package__, ks.__version__) + logger.error("Testing for %s@%s", ks.__package__, ks.__version__) diff --git a/balpy/balancerv2cad/src/balancerv2cad/util.py b/balpy/balancerv2cad/src/balancerv2cad/util.py index 0ad5e75..a0dabd5 100644 --- a/balpy/balancerv2cad/src/balancerv2cad/util.py +++ b/balpy/balancerv2cad/src/balancerv2cad/util.py @@ -1,47 +1,45 @@ -from decimal import * +from decimal import ROUND_DOWN, ROUND_UP, Decimal, getcontext def mulUp(a: Decimal, b: Decimal) -> Decimal: getcontext().prec = 28 getcontext().rounding = ROUND_UP - return a*b + return a * b def divUp(a: Decimal, b: Decimal) -> Decimal: if a * b == 0: - return Decimal(0) else: getcontext().prec = 28 getcontext().rounding = ROUND_UP - return a/b + return a / b -def mulDown(a: Decimal, b: Decimal)-> Decimal: +def mulDown(a: Decimal, b: Decimal) -> Decimal: getcontext().prec = 28 getcontext().rounding = ROUND_DOWN return a * b -def divDown(a: Decimal, b: Decimal)-> Decimal: +def divDown(a: Decimal, b: Decimal) -> Decimal: getcontext().prec = 28 getcontext().rounding = ROUND_DOWN - result = a/b + result = a / b return result def complement(a: Decimal) -> Decimal: - return Decimal(1 - a) if a < 1 else Decimal(0) -def powUp(a: Decimal,b:Decimal) -> Decimal: +def powUp(a: Decimal, b: Decimal) -> Decimal: getcontext().prec = 28 getcontext().rounding = ROUND_UP return a**b -def powDown(a: Decimal,b: Decimal)-> Decimal: +def powDown(a: Decimal, b: Decimal) -> Decimal: getcontext().prec = 28 getcontext().rounding = ROUND_DOWN return a**b diff --git a/balpy/balancerv2cad/tests/conftest.py b/balpy/balancerv2cad/tests/conftest.py index efd5727..ab2d4c4 100644 --- a/balpy/balancerv2cad/tests/conftest.py +++ b/balpy/balancerv2cad/tests/conftest.py @@ -15,12 +15,12 @@ # standard lib import sys -# third party -import pytest - # balancerv2cad package import balancerv2cad +# third party +import pytest + # noinspection PyCallByClass @@ -30,9 +30,9 @@ def version_test() -> None: test version """ # Setup code - sys.stdout.write('\nRunning setup code for balancerv2cad module\n') + sys.stdout.write("\nRunning setup code for balancerv2cad module\n") yield balancerv2cad # tear down code - sys.stdout.write('Running Teardown code for balancerv2cad module\n') + sys.stdout.write("Running Teardown code for balancerv2cad module\n") diff --git a/balpy/balancerv2cad/tests/unit-test/test_StableMath.py b/balpy/balancerv2cad/tests/unit-test/test_StableMath.py index 05bb297..09b9d14 100644 --- a/balpy/balancerv2cad/tests/unit-test/test_StableMath.py +++ b/balpy/balancerv2cad/tests/unit-test/test_StableMath.py @@ -1,113 +1,130 @@ -from typing import List -from balancerv2cad.StableMath import StableMath -from decimal import * import unittest +from decimal import Decimal, getcontext + +from balancerv2cad.StableMath import StableMath getcontext().prec = 21 MAX_RELATIVE_ERROR = Decimal(1e-17) + def expectEqualWithError(result: Decimal, expected: Decimal): - if result <= expected + MAX_RELATIVE_ERROR and result >= expected - MAX_RELATIVE_ERROR: + if ( + result <= expected + MAX_RELATIVE_ERROR + and result >= expected - MAX_RELATIVE_ERROR + ): return True return False class TestStableMath(unittest.TestCase): - - def test_calculateInvariants(self): - ''' + """ Tests for instance of Decimal - ''' + """ amp = Decimal(100) - balances = [Decimal(10),Decimal(12)] - result = StableMath.calculateInvariant(amp, balances) + balances = [Decimal(10), Decimal(12)] + result = StableMath.calculateInvariant(amp, balances) assert isinstance(result, Decimal) - ''' + """ Tests invariant for two tokens expected = 22 - ''' + """ amp = Decimal(100) - balances = [Decimal(10),Decimal(12)] - result = StableMath.calculateInvariant(amp, balances) + balances = [Decimal(10), Decimal(12)] + result = StableMath.calculateInvariant(amp, balances) assert expectEqualWithError(result, Decimal(22)) - ''' + """ Tests invariant for three tokens expected = 22 - ''' + """ amp = Decimal(100) - balances = [Decimal(10),Decimal(12), Decimal(14)] - result = StableMath.calculateInvariant(amp, balances) + balances = [Decimal(10), Decimal(12), Decimal(14)] + result = StableMath.calculateInvariant(amp, balances) assert expectEqualWithError(result, Decimal(36)) def test_calcInGivenOut(stablemath_test): - #TODO assert StableMath.calcInGivenOut(2,[222,3112,311],1,1,4) == 0.000002756210410895 - ''' + # TODO assert StableMath.calcInGivenOut(2,[222,3112,311],1,1,4) == + # 0.000002756210410895 + """ Tests for instance of Decimal - ''' + """ amp = Decimal(100) balances = [Decimal(10), Decimal(12), Decimal(14)] tokenIndexIn = 0 tokenIndexOut = 1 tokenAmountOut = Decimal(1) - result = StableMath.calcInGivenOut(amp, balances, tokenIndexIn, tokenIndexOut, tokenAmountOut) + result = StableMath.calcInGivenOut( + amp, balances, tokenIndexIn, tokenIndexOut, tokenAmountOut + ) assert isinstance(result, Decimal) - ''' + """ Tests in given out for two tokens - ''' + """ amp = Decimal(100) balances = [Decimal(10), Decimal(12)] tokenIndexIn = 0 tokenIndexOut = 1 tokenAmountOut = Decimal(1) - result = StableMath.calcInGivenOut(amp, balances, tokenIndexIn, tokenIndexOut, tokenAmountOut) + result = StableMath.calcInGivenOut( + amp, balances, tokenIndexIn, tokenIndexOut, tokenAmountOut + ) assert expectEqualWithError(result, Decimal(1)) - ''' + """ Tests in given out for three tokens - ''' + """ amp = Decimal(100) balances = [Decimal(10), Decimal(12), Decimal(14)] tokenIndexIn = 0 tokenIndexOut = 1 tokenAmountOut = Decimal(1) - result = StableMath.calcInGivenOut(amp, balances, tokenIndexIn, tokenIndexOut, tokenAmountOut) - expected = Decimal(1002381999332076302)/Decimal(1e18) + result = StableMath.calcInGivenOut( + amp, balances, tokenIndexIn, tokenIndexOut, tokenAmountOut + ) + expected = Decimal(1002381999332076302) / Decimal(1e18) assert expectEqualWithError(result, expected) - def test_calcOutGivenIn(stablemath_test): - # def calcOutGivenIn(amplificationParameter: Decimal, balances: list[Decimal], tokenIndexIn: int, tokenIndexOut: int, tokenAmountIn: Decimal): + # def calcOutGivenIn(amplificationParameter: Decimal, balances: + # list[Decimal], tokenIndexIn: int, tokenIndexOut: int, tokenAmountIn: + # Decimal): amp = Decimal(10) balances = [Decimal(10), Decimal(11), Decimal(12)] tokenIndexIn = 0 tokenIndexOut = 1 tokenAmountIn = Decimal(1) - result = StableMath.calcOutGivenIn(amp, balances, tokenIndexIn, tokenIndexOut, tokenAmountIn) + result = StableMath.calcOutGivenIn( + amp, balances, tokenIndexIn, tokenIndexOut, tokenAmountIn + ) assert isinstance(result, Decimal) - ''' + """ Tests out given in for two tokens - ''' + """ amp = Decimal(10) balances = [Decimal(10), Decimal(11)] tokenIndexIn = 0 tokenIndexOut = 1 tokenAmountIn = Decimal(1) - result = StableMath.calcOutGivenIn(amp, balances, tokenIndexIn, tokenIndexOut, tokenAmountIn) - expected = Decimal(997840816806192585)/Decimal(1e18) + result = StableMath.calcOutGivenIn( + amp, balances, tokenIndexIn, tokenIndexOut, tokenAmountIn + ) + expected = Decimal(997840816806192585) / Decimal(1e18) assert expectEqualWithError(result, expected) - ''' + """ Tests out given in for three tokens - ''' + """ amp = Decimal(10) balances = [Decimal(10), Decimal(11), Decimal(12)] tokenIndexIn = 0 tokenIndexOut = 1 tokenAmountIn = Decimal(1) - result = StableMath.calcOutGivenIn(amp, balances, tokenIndexIn, tokenIndexOut, tokenAmountIn) - expected = Decimal(991747876655227989)/Decimal(1e18) + result = StableMath.calcOutGivenIn( + amp, balances, tokenIndexIn, tokenIndexOut, tokenAmountIn + ) + expected = Decimal(991747876655227989) / Decimal(1e18) assert expectEqualWithError(result, expected) + # def test_calcDueTokenProtoclSwapFeeAmount(stablemath_test): # ''' # Tests if output is instance of Decimal @@ -123,53 +140,53 @@ def test_calcOutGivenIn(stablemath_test): # expectedFeeAmount = StableMath.calc # assert expectEqualWithError(result, Decimal) def test_calcBptOutGivenExactTokensIn(stablemath_test): - ''' + """ Tests for instance of Decimal - ''' + """ amp = Decimal(22) - balances = [Decimal(2), Decimal(3),Decimal(4), Decimal(20)] + balances = [Decimal(2), Decimal(3), Decimal(4), Decimal(20)] amountsIn = [Decimal(2), Decimal(1), Decimal(2), Decimal(1000)] bptTotalsupply = Decimal(10) swapFee = Decimal(2) - swapFeePercentage = Decimal(.04) - result = StableMath.calcBptOutGivenExactTokensIn(amp, balances, amountsIn,bptTotalsupply, swapFee,swapFeePercentage) + swapFeePercentage = Decimal(0.04) + result = StableMath.calcBptOutGivenExactTokensIn( + amp, balances, amountsIn, bptTotalsupply, swapFee, swapFeePercentage + ) assert isinstance(result, Decimal) - ''' - ''' - + """ + """ def test_calcTokenInGivenExactBptOut(stablemath_test): amp = Decimal(100) - balances = [Decimal(10),Decimal(11)] - amountsOut = [Decimal(5),Decimal(6)] + balances = [Decimal(10), Decimal(11)] + amountsOut = [Decimal(5), Decimal(6)] bptTotalSupply = Decimal(100) protocolSwapFeePercentage = Decimal(0.1) - result = StableMath.calcBptInGivenExactTokensOut(amp, - balances, - amountsOut, - bptTotalSupply, - protocolSwapFeePercentage) + result = StableMath.calcBptInGivenExactTokensOut( + amp, balances, amountsOut, bptTotalSupply, protocolSwapFeePercentage + ) assert isinstance(result, Decimal) - def test_calcTokenOutGivenExactBptIn(stablemath_test): - balances = [Decimal(10),Decimal(11)] + balances = [Decimal(10), Decimal(11)] bptAmountIn = Decimal(10) - bptTotalSupply =Decimal(2) - result = StableMath.calcTokensOutGivenExactBptIn(balances,bptAmountIn, bptTotalSupply) + bptTotalSupply = Decimal(2) + result = StableMath.calcTokensOutGivenExactBptIn( + balances, bptAmountIn, bptTotalSupply + ) assert isinstance(result, list) def test_calcTokensOutGivenExactBptIn(stablemath_test): - balances = [Decimal(10),Decimal(11)] + balances = [Decimal(10), Decimal(11)] bptAmountIn = Decimal(10) - bptTotalSupply =Decimal(2) - result = StableMath.calcTokensOutGivenExactBptIn(balances,bptAmountIn,bptTotalSupply) + bptTotalSupply = Decimal(2) + result = StableMath.calcTokensOutGivenExactBptIn( + balances, bptAmountIn, bptTotalSupply + ) assert isinstance(result, list) - - #TODO give critical results + # TODO give critical results def test_getTokenBalanceGivenInvariantAndAllOtherBalances(stablemath_test): - # assert StableMath.getTokenBalanceGivenInvariantAndAllOtherBalances(22, [2,3,4,20], 1, 2) == 0.002573235526125192 # self.assertAlmostEqual( @@ -178,35 +195,44 @@ def test_getTokenBalanceGivenInvariantAndAllOtherBalances(stablemath_test): # [Decimal(2),Decimal(3),Decimal(4),Decimal(20)], # Decimal(1), # 2), Decimal(0.00067593918100831), 3) - #print(TestCase.assertAlmostEqual(1,1.00000000000001,3)) - - assert isinstance(StableMath.getTokenBalanceGivenInvariantAndAllOtherBalances( - Decimal(22), - [Decimal(2),Decimal(3),Decimal(4),Decimal(20)], - Decimal(1), - 2), Decimal) - + # print(TestCase.assertAlmostEqual(1,1.00000000000001,3)) + + assert isinstance( + StableMath.getTokenBalanceGivenInvariantAndAllOtherBalances( + Decimal(22), + [Decimal(2), Decimal(3), Decimal(4), Decimal(20)], + Decimal(1), + 2, + ), + Decimal, + ) amp = Decimal(10) - balances = [Decimal(11),Decimal(11),Decimal(12)] + balances = [Decimal(11), Decimal(11), Decimal(12)] invariant = Decimal(32.999999999) tokenIndex = 1 - result = StableMath.getTokenBalanceGivenInvariantAndAllOtherBalances(amp, balances, invariant, tokenIndex) + result = StableMath.getTokenBalanceGivenInvariantAndAllOtherBalances( + amp, balances, invariant, tokenIndex + ) assert expectEqualWithError(result, Decimal(10.008252123344772011)) amp = Decimal(100) - balances = [Decimal(10),Decimal(11)] + balances = [Decimal(10), Decimal(11)] invariant = Decimal(10) tokenIndex = 0 - result = StableMath.getTokenBalanceGivenInvariantAndAllOtherBalances(amp, balances, invariant, tokenIndex) + result = StableMath.getTokenBalanceGivenInvariantAndAllOtherBalances( + amp, balances, invariant, tokenIndex + ) assert expectEqualWithError(result, Decimal(0.098908137177552474646)) amp = Decimal(100) - balances = [Decimal(10),Decimal(11), Decimal(12)] + balances = [Decimal(10), Decimal(11), Decimal(12)] invariant = Decimal(10) tokenIndex = 0 - result = StableMath.getTokenBalanceGivenInvariantAndAllOtherBalances(amp, balances, invariant, tokenIndex) + result = StableMath.getTokenBalanceGivenInvariantAndAllOtherBalances( + amp, balances, invariant, tokenIndex + ) assert expectEqualWithError(result, Decimal(0.00071756564425404818025)) diff --git a/balpy/balancerv2cad/tests/unit-test/test_WeightedMath.py b/balpy/balancerv2cad/tests/unit-test/test_WeightedMath.py index 555c379..7ed80b1 100644 --- a/balpy/balancerv2cad/tests/unit-test/test_WeightedMath.py +++ b/balpy/balancerv2cad/tests/unit-test/test_WeightedMath.py @@ -1,230 +1,291 @@ -from decimal import * -from balancerv2cad.WeightedMath import WeightedMath +from decimal import Decimal, getcontext +from balancerv2cad.WeightedMath import WeightedMath getcontext().prec = 28 MAX_RELATIVE_ERROR = Decimal(1e-17) + def expectEqualWithError(result: Decimal, expected: Decimal): - if result <= expected + MAX_RELATIVE_ERROR and result >= expected - MAX_RELATIVE_ERROR: + if ( + result <= expected + MAX_RELATIVE_ERROR + and result >= expected - MAX_RELATIVE_ERROR + ): return True return False -class TestWeightedMath: - def test_calculate_invariant(weightedmath_test): - #Test instance of Decimal - normalized_weight = [Decimal(0.3), Decimal(0.2), Decimal(0.5)] - balances = [Decimal(10), Decimal(12), Decimal(14)] - result = WeightedMath.calculate_invariant(normalized_weight, balances) - assert isinstance(result, Decimal) - - def test_calculate_invariant_zero_invariant(weightedmath_test): - #Tests zero Invariant - result = WeightedMath.calculate_invariant([Decimal(1)], [Decimal(0)]) - assert result == Decimal(0) - - def test_calculate_invariant_two_tokens(weightedmath_test): - #Test two tokens - normalized_weight = [Decimal(0.3), Decimal(0.7)] - balances = [Decimal(10), Decimal(12)] - result = WeightedMath.calculate_invariant(normalized_weight, balances) - expected = Decimal(11.361269771988886911) - assert expectEqualWithError(result, expected) - - def test_calculate_invariant_three_tokens(weightedmath_test): - #Test three tokens - normalized_weight = [Decimal(0.3), Decimal(0.2), Decimal(0.5)] - balances = [Decimal(10), Decimal(12), Decimal(14)] - result = WeightedMath.calculate_invariant(normalized_weight, balances) - expected = Decimal(12.271573899486561654) - assert expectEqualWithError(result, expected) - - def test_out_given_in_single_swap(weightedmath_test): - #Test instance of Decimal - token_balance_in = Decimal(100) - token_weight_in = Decimal(50) - token_balance_out = Decimal(100) - token_weight_out = Decimal(40) - token_amount_out = Decimal(15) - result = WeightedMath.calc_out_given_in(token_balance_in, token_weight_in, token_balance_out, token_weight_out, token_amount_out) - assert isinstance(result, Decimal) - - #Test out given in - expected = Decimal(1602931431298673722)/Decimal(1e17) - assert expectEqualWithError(result, expected) - - def test_in_given_out_single_swap(weightedmath_test): - #Test instance of Decimal - balance_in = Decimal(100) - weight_in = Decimal(50) - balance_out = Decimal(100) - weight_out = Decimal(40) - amount_out = Decimal(15) - result = WeightedMath.calc_in_given_out(balance_in, weight_in, balance_out, weight_out, amount_out) - assert isinstance(result, Decimal) - - expected = Decimal(1388456294146839515)/Decimal(1e17) - assert expectEqualWithError(result, expected) - - def test_out_given_in_extreme_amounts(weightedmath_test): - # Test instance of Decimal - - token_balance_in = Decimal(100) - token_weight_in = Decimal(50) - token_balance_out = Decimal(100) - token_weight_out = Decimal(40) - token_amount_out = Decimal(0.00000000001) - result = WeightedMath.calc_out_given_in(token_balance_in, token_weight_in, token_balance_out, token_weight_out, token_amount_out) - - assert isinstance(result, Decimal) - - # Test out given in - # min amount in - - expected = Decimal(12500000)/Decimal(1e18) - assert expectEqualWithError(result, expected) - def test_in_given_out_extreme_amounts(weightedmath_test): - #Test instance of Decimal - token_balance_in = Decimal(100) - token_weight_in = Decimal(50) - token_balance_out = Decimal(100) - token_weight_out = Decimal(40) - token_amount_out = Decimal(0.00000000001) - result = WeightedMath.calc_in_given_out(token_balance_in, token_weight_in, token_balance_out, token_weight_out, token_amount_out) - - assert isinstance(result, Decimal) - - # Test In given in - # min amount out - expected = Decimal(8000000)/Decimal(1e18) - assert expectEqualWithError(result, expected) - - def test_out_given_in_extreme_weights(weightedmath_test): - # Max weights relation - # Weight relation = 130.07 - token_balance_in = Decimal(100) - token_weight_in = Decimal(130.7) - token_balance_out = Decimal(100) - token_weight_out = Decimal(1) - token_amount_out = Decimal(15) - result = WeightedMath.calc_out_given_in(token_balance_in, token_weight_in, token_balance_out, token_weight_out, token_amount_out) - - assert isinstance(result, Decimal) - - #Test out given in - expected = Decimal(9999999883374836452)/Decimal(1e17) - assert expectEqualWithError(result, expected) - - def test_in_given_out_extreme_weights(weightedmath_test): - # Min weights relation - # Weight relation = 0.00769 - token_balance_in = Decimal(100) - token_weight_in = Decimal(0.00769) - token_balance_out = Decimal(100) - token_weight_out = Decimal(1) - token_amount_out = Decimal(15) - result = WeightedMath.calc_out_given_in(token_balance_in, token_weight_in, token_balance_out, token_weight_out, token_amount_out) - - assert isinstance(result, Decimal) - - #Test out given in - expected = Decimal(0.107419197916188066) - assert expectEqualWithError(result, expected) - - - - def test_calc_due_token_protocol_swap_fee_amount_two_tokens(weightedmath_test): - # Returns protocl swap fees - normalized_weights = [Decimal(0.3), Decimal(0.7)] - balances = [Decimal(10), Decimal(11)] - last_invariant = Decimal(10) - token_index = 1 - current_invariant = Decimal(10.689930449163329926) - protocol_swap_fee_percentage = Decimal(0.1) - result = WeightedMath.calc_due_token_protocol_swap_fee_amount(balances[token_index], normalized_weights[token_index], last_invariant, current_invariant, protocol_swap_fee_percentage) - assert isinstance(result, Decimal) - expected = Decimal(0.099999999999999999933) - assert expectEqualWithError(result,expected) - - # With large accumulated fees, caps the invariant growth - normalized_weights = [Decimal(0.3), Decimal(0.7)] - balances = [Decimal(10), Decimal(11)] - token_index = 1 - current_invariant = Decimal(10.689930449163329926) - last_invariant = current_invariant/Decimal(2) - protocol_swap_fee_percentage = Decimal(0.1) - result = WeightedMath.calc_due_token_protocol_swap_fee_amount(balances[token_index], normalized_weights[token_index], last_invariant, current_invariant, protocol_swap_fee_percentage) - - assert isinstance(result, Decimal) - expected = Decimal(0.439148057504926669190) - assert expectEqualWithError(result,expected) - - def test_calc_due_token_protocol_swap_fee_amount_three_tokens(weightedmath_test): - normalized_weights = [Decimal(0.3), Decimal(0.2), Decimal(0.5)] - balances = [Decimal(10), Decimal(11), Decimal(12)] - last_invariant = Decimal(10) - - token_index = 2 - current_invariant = Decimal(11.1652682095187556376) - - protocol_swap_fee_percentage = Decimal(0.1) - result = WeightedMath.calc_due_token_protocol_swap_fee_amount(balances[token_index], normalized_weights[token_index], last_invariant, current_invariant, protocol_swap_fee_percentage) - - assert isinstance(result, Decimal) - expected = Decimal(0.23740649734383223657) - assert expectEqualWithError(result,expected) - - - - def test_calc_bpt_out_given_exact_tokens_in(weightedmath_test): - #Test instance of Decimal - balances = [Decimal(10), Decimal(12), Decimal(14)] - normalized_weights = [Decimal(10), Decimal(12), Decimal(14)] - amounts_in = [Decimal(10), Decimal(12), Decimal(14)] - bpt_total_supply = Decimal(1) - swap_fee = Decimal(1) - result = WeightedMath.calc_bpt_out_given_exact_tokens_in(balances, normalized_weights, amounts_in, bpt_total_supply, swap_fee) - assert isinstance(result, Decimal) - - def test_calc_token_in_given_exact_bpt_out(weightedmath_test): - #Test instance of Decimal - balance = Decimal(1) - normalized_weight = Decimal(10) - bpt_amount_out = Decimal(10) - bpt_total_supply = Decimal(10) - swap_fee = Decimal(10) - result = WeightedMath.calc_token_in_given_exact_bpt_out(balance, normalized_weight, bpt_amount_out, bpt_total_supply, swap_fee) - assert isinstance(result, Decimal) - - def test_calc_bpt_in_given_exact_tokens_out(weightedmath_test): - #Test instance of Decimal - balances = [Decimal(10), Decimal(12), Decimal(14)] - normalized_weights = [Decimal(10), Decimal(12), Decimal(14)] - bpt_amount_out = [Decimal(10), Decimal(12), Decimal(14)] - bpt_total_supply = Decimal(1) - swap_fee = Decimal(1) - result = WeightedMath.calc_bpt_in_given_exact_tokens_out(balances, normalized_weights, bpt_amount_out, bpt_total_supply, swap_fee) - assert isinstance(result, Decimal) - - def test_calc_token_out_given_exact_bpt_in(weightedmath_test): - #Test instance of Decimal - balance = Decimal(10) - normalized_weight = Decimal(10) - bpt_amount_in = Decimal(2) - bpt_total_supply = Decimal(10) - swap_fee = Decimal(0) - result = WeightedMath.calc_token_out_given_exact_bpt_in(balance, normalized_weight, bpt_amount_in, bpt_total_supply, swap_fee) - assert isinstance(result, Decimal) - - def test_calc_tokens_out_given_exact_bpt_in(weightedmath_test): - #Test instance of Decimal - balance = Decimal(10) - normalized_weight = Decimal(1) - bpt_amount_in = Decimal(2) - bpt_total_supply = Decimal(1) - swap_fee = Decimal(1) - result = WeightedMath.calc_token_out_given_exact_bpt_in(balance, normalized_weight, bpt_amount_in, bpt_total_supply, swap_fee ) - assert isinstance(result, Decimal) - - +class TestWeightedMath: + def test_calculate_invariant(weightedmath_test): + # Test instance of Decimal + normalized_weight = [Decimal(0.3), Decimal(0.2), Decimal(0.5)] + balances = [Decimal(10), Decimal(12), Decimal(14)] + result = WeightedMath.calculate_invariant(normalized_weight, balances) + assert isinstance(result, Decimal) + + def test_calculate_invariant_zero_invariant(weightedmath_test): + # Tests zero Invariant + result = WeightedMath.calculate_invariant([Decimal(1)], [Decimal(0)]) + assert result == Decimal(0) + + def test_calculate_invariant_two_tokens(weightedmath_test): + # Test two tokens + normalized_weight = [Decimal(0.3), Decimal(0.7)] + balances = [Decimal(10), Decimal(12)] + result = WeightedMath.calculate_invariant(normalized_weight, balances) + expected = Decimal(11.361269771988886911) + assert expectEqualWithError(result, expected) + + def test_calculate_invariant_three_tokens(weightedmath_test): + # Test three tokens + normalized_weight = [Decimal(0.3), Decimal(0.2), Decimal(0.5)] + balances = [Decimal(10), Decimal(12), Decimal(14)] + result = WeightedMath.calculate_invariant(normalized_weight, balances) + expected = Decimal(12.271573899486561654) + assert expectEqualWithError(result, expected) + + def test_out_given_in_single_swap(weightedmath_test): + # Test instance of Decimal + token_balance_in = Decimal(100) + token_weight_in = Decimal(50) + token_balance_out = Decimal(100) + token_weight_out = Decimal(40) + token_amount_out = Decimal(15) + result = WeightedMath.calc_out_given_in( + token_balance_in, + token_weight_in, + token_balance_out, + token_weight_out, + token_amount_out, + ) + assert isinstance(result, Decimal) + + # Test out given in + expected = Decimal(1602931431298673722) / Decimal(1e17) + assert expectEqualWithError(result, expected) + + def test_in_given_out_single_swap(weightedmath_test): + # Test instance of Decimal + balance_in = Decimal(100) + weight_in = Decimal(50) + balance_out = Decimal(100) + weight_out = Decimal(40) + amount_out = Decimal(15) + result = WeightedMath.calc_in_given_out( + balance_in, weight_in, balance_out, weight_out, amount_out + ) + assert isinstance(result, Decimal) + + expected = Decimal(1388456294146839515) / Decimal(1e17) + assert expectEqualWithError(result, expected) + + def test_out_given_in_extreme_amounts(weightedmath_test): + # Test instance of Decimal + + token_balance_in = Decimal(100) + token_weight_in = Decimal(50) + token_balance_out = Decimal(100) + token_weight_out = Decimal(40) + token_amount_out = Decimal(0.00000000001) + result = WeightedMath.calc_out_given_in( + token_balance_in, + token_weight_in, + token_balance_out, + token_weight_out, + token_amount_out, + ) + + assert isinstance(result, Decimal) + + # Test out given in + # min amount in + + expected = Decimal(12500000) / Decimal(1e18) + assert expectEqualWithError(result, expected) + + def test_in_given_out_extreme_amounts(weightedmath_test): + # Test instance of Decimal + token_balance_in = Decimal(100) + token_weight_in = Decimal(50) + token_balance_out = Decimal(100) + token_weight_out = Decimal(40) + token_amount_out = Decimal(0.00000000001) + result = WeightedMath.calc_in_given_out( + token_balance_in, + token_weight_in, + token_balance_out, + token_weight_out, + token_amount_out, + ) + + assert isinstance(result, Decimal) + + # Test In given in + # min amount out + expected = Decimal(8000000) / Decimal(1e18) + assert expectEqualWithError(result, expected) + + def test_out_given_in_extreme_weights(weightedmath_test): + # Max weights relation + # Weight relation = 130.07 + token_balance_in = Decimal(100) + token_weight_in = Decimal(130.7) + token_balance_out = Decimal(100) + token_weight_out = Decimal(1) + token_amount_out = Decimal(15) + result = WeightedMath.calc_out_given_in( + token_balance_in, + token_weight_in, + token_balance_out, + token_weight_out, + token_amount_out, + ) + + assert isinstance(result, Decimal) + + # Test out given in + expected = Decimal(9999999883374836452) / Decimal(1e17) + assert expectEqualWithError(result, expected) + + def test_in_given_out_extreme_weights(weightedmath_test): + # Min weights relation + # Weight relation = 0.00769 + token_balance_in = Decimal(100) + token_weight_in = Decimal(0.00769) + token_balance_out = Decimal(100) + token_weight_out = Decimal(1) + token_amount_out = Decimal(15) + result = WeightedMath.calc_out_given_in( + token_balance_in, + token_weight_in, + token_balance_out, + token_weight_out, + token_amount_out, + ) + + assert isinstance(result, Decimal) + + # Test out given in + expected = Decimal(0.107419197916188066) + assert expectEqualWithError(result, expected) + + def test_calc_due_token_protocol_swap_fee_amount_two_tokens( + weightedmath_test): + # Returns protocl swap fees + normalized_weights = [Decimal(0.3), Decimal(0.7)] + balances = [Decimal(10), Decimal(11)] + last_invariant = Decimal(10) + token_index = 1 + current_invariant = Decimal(10.689930449163329926) + protocol_swap_fee_percentage = Decimal(0.1) + result = WeightedMath.calc_due_token_protocol_swap_fee_amount( + balances[token_index], + normalized_weights[token_index], + last_invariant, + current_invariant, + protocol_swap_fee_percentage, + ) + assert isinstance(result, Decimal) + expected = Decimal(0.099999999999999999933) + assert expectEqualWithError(result, expected) + + # With large accumulated fees, caps the invariant growth + normalized_weights = [Decimal(0.3), Decimal(0.7)] + balances = [Decimal(10), Decimal(11)] + token_index = 1 + current_invariant = Decimal(10.689930449163329926) + last_invariant = current_invariant / Decimal(2) + protocol_swap_fee_percentage = Decimal(0.1) + result = WeightedMath.calc_due_token_protocol_swap_fee_amount( + balances[token_index], + normalized_weights[token_index], + last_invariant, + current_invariant, + protocol_swap_fee_percentage, + ) + + assert isinstance(result, Decimal) + expected = Decimal(0.439148057504926669190) + assert expectEqualWithError(result, expected) + + def test_calc_due_token_protocol_swap_fee_amount_three_tokens( + weightedmath_test): + normalized_weights = [Decimal(0.3), Decimal(0.2), Decimal(0.5)] + balances = [Decimal(10), Decimal(11), Decimal(12)] + last_invariant = Decimal(10) + + token_index = 2 + current_invariant = Decimal(11.1652682095187556376) + + protocol_swap_fee_percentage = Decimal(0.1) + result = WeightedMath.calc_due_token_protocol_swap_fee_amount( + balances[token_index], + normalized_weights[token_index], + last_invariant, + current_invariant, + protocol_swap_fee_percentage, + ) + + assert isinstance(result, Decimal) + expected = Decimal(0.23740649734383223657) + assert expectEqualWithError(result, expected) + + def test_calc_bpt_out_given_exact_tokens_in(weightedmath_test): + # Test instance of Decimal + balances = [Decimal(10), Decimal(12), Decimal(14)] + normalized_weights = [Decimal(10), Decimal(12), Decimal(14)] + amounts_in = [Decimal(10), Decimal(12), Decimal(14)] + bpt_total_supply = Decimal(1) + swap_fee = Decimal(1) + result = WeightedMath.calc_bpt_out_given_exact_tokens_in( + balances, normalized_weights, amounts_in, bpt_total_supply, swap_fee + ) + assert isinstance(result, Decimal) + + def test_calc_token_in_given_exact_bpt_out(weightedmath_test): + # Test instance of Decimal + balance = Decimal(1) + normalized_weight = Decimal(10) + bpt_amount_out = Decimal(10) + bpt_total_supply = Decimal(10) + swap_fee = Decimal(10) + result = WeightedMath.calc_token_in_given_exact_bpt_out( + balance, normalized_weight, bpt_amount_out, bpt_total_supply, swap_fee + ) + assert isinstance(result, Decimal) + + def test_calc_bpt_in_given_exact_tokens_out(weightedmath_test): + # Test instance of Decimal + balances = [Decimal(10), Decimal(12), Decimal(14)] + normalized_weights = [Decimal(10), Decimal(12), Decimal(14)] + bpt_amount_out = [Decimal(10), Decimal(12), Decimal(14)] + bpt_total_supply = Decimal(1) + swap_fee = Decimal(1) + result = WeightedMath.calc_bpt_in_given_exact_tokens_out( + balances, normalized_weights, bpt_amount_out, bpt_total_supply, swap_fee + ) + assert isinstance(result, Decimal) + + def test_calc_token_out_given_exact_bpt_in(weightedmath_test): + # Test instance of Decimal + balance = Decimal(10) + normalized_weight = Decimal(10) + bpt_amount_in = Decimal(2) + bpt_total_supply = Decimal(10) + swap_fee = Decimal(0) + result = WeightedMath.calc_token_out_given_exact_bpt_in( + balance, normalized_weight, bpt_amount_in, bpt_total_supply, swap_fee + ) + assert isinstance(result, Decimal) + + def test_calc_tokens_out_given_exact_bpt_in(weightedmath_test): + # Test instance of Decimal + balance = Decimal(10) + normalized_weight = Decimal(1) + bpt_amount_in = Decimal(2) + bpt_total_supply = Decimal(1) + swap_fee = Decimal(1) + result = WeightedMath.calc_token_out_given_exact_bpt_in( + balance, normalized_weight, bpt_amount_in, bpt_total_supply, swap_fee + ) + assert isinstance(result, Decimal) diff --git a/balpy/balancerv2cad/tests/unit-test/test_kickstart.py b/balpy/balancerv2cad/tests/unit-test/test_kickstart.py index 08f7326..0963eca 100644 --- a/balpy/balancerv2cad/tests/unit-test/test_kickstart.py +++ b/balpy/balancerv2cad/tests/unit-test/test_kickstart.py @@ -4,8 +4,6 @@ 1. By importing the balancerv2cad package in directly. 2. By passing in a function fixture defined in conftest.py """ -import balancerv2cad as ks - def test_pkgname_using_fixture(version_test): @@ -13,4 +11,4 @@ def test_pkgname_using_fixture(version_test): testing pkgname from passing the module in as a fixture """ - assert version_test.__package__ == 'balancerv2cad' + assert version_test.__package__ == "balancerv2cad" diff --git a/balpy/balpy.py b/balpy/balpy.py index 27337d9..04cf849 100644 --- a/balpy/balpy.py +++ b/balpy/balpy.py @@ -1,34 +1,41 @@ # balpy.py # python basics +import binascii import copy +import importlib import json import os -import requests -import time -import sys import pkgutil -import importlib -from decimal import * -from functools import cache -import traceback import random -import binascii +import sys +import time +from decimal import Decimal, getcontext +from functools import cache -# low level web3 -from web3 import Web3, middleware -from web3.gas_strategies.time_based import glacial_gas_price_strategy, slow_gas_price_strategy, medium_gas_price_strategy, fast_gas_price_strategy -from web3.middleware import geth_poa_middleware -from web3._utils.abi import get_abi_output_types import eth_abi +import requests # high level web3 from multicaller import multicaller +# low level web3 +from web3 import Web3, middleware +from web3.gas_strategies.time_based import ( + fast_gas_price_strategy, + glacial_gas_price_strategy, + medium_gas_price_strategy, + slow_gas_price_strategy, +) +from web3.middleware import geth_poa_middleware + # balpy modules from . import balancerErrors as be -from .enums.stablePoolJoinExitKind import StablePoolJoinKind, StablePhantomPoolJoinKind, StablePoolExitKind -from .enums.weightedPoolJoinExitKind import WeightedPoolJoinKind, WeightedPoolExitKind +from .enums.stablePoolJoinExitKind import StablePhantomPoolJoinKind +from .enums.types import Chain, SwapType +from .enums.weightedPoolJoinExitKind import WeightedPoolExitKind, WeightedPoolJoinKind +from .graph.graph import BALANCER_API_ENDPOINT, DEFAULT_SWAP_OPTIONS, TheGraph + class Suppressor(object): def __enter__(self): @@ -36,2288 +43,3368 @@ def __enter__(self): self.stderr = sys.stderr sys.stdout = self sys.stderr = self + def __exit__(self, type, value, traceback): sys.stdout = self.stdout sys.stderr = self.stderr if type is not None: - a=0; + pass # Do normal exception handling - def write(self, x): pass + + def write(self, x): + pass + def getLongestStringLength(array): - maxLength = 0; - for a in array: - if len(a) > maxLength: - maxLength = len(a); - return(maxLength); + maxLength = 0 + for a in array: + if len(a) > maxLength: + maxLength = len(a) + return maxLength + def padWithSpaces(myString, endLength): - stringLength = len(myString); - extraSpace = endLength - stringLength; + stringLength = len(myString) + extraSpace = endLength - stringLength + + outputString = myString + "".join([" "] * extraSpace) + return outputString - outputString = myString + "".join([" "]*extraSpace); - return(outputString); class balpy(object): - - """ - Balancer Protocol Python API - Interface with Balancer V2 Smart contracts directly from Python - """ - - DELEGATE_OWNER = '0xBA1BA1ba1BA1bA1bA1Ba1BA1ba1BA1bA1ba1ba1B'; - ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'; - - # Constants - INFINITE = 2 ** 256 - 1; #for infinite unlock - MAX_UINT_112 = 2**112 - 1; #for stablephantom max bpt - - - # Environment variable names - envVarEtherscan = "KEY_API_ETHERSCAN"; - envVarInfura = "KEY_API_INFURA"; - envVarPrivate = "KEY_PRIVATE"; - envVarCustomRPC = "BALPY_CUSTOM_RPC"; - - # Etherscan API call management - lastEtherscanCallTime = 0; - etherscanMaxRate = 5.0; #hz - etherscanSpeedDict = { - "slow":"SafeGasPrice", - "average":"ProposeGasPrice", - "fast":"FastGasPrice" - }; - speedDict = { - "glacial":glacial_gas_price_strategy, - "slow":slow_gas_price_strategy, - "average":medium_gas_price_strategy, - "fast":fast_gas_price_strategy - } - - # Network parameters - networkParams = { - "mainnet": {"id":1, "blockExplorerUrl":"etherscan.io", "balFrontend":"app.balancer.fi/#/ethereum" }, - "ropsten": {"id":3, "blockExplorerUrl":"ropsten.etherscan.io" }, - "rinkeby": {"id":4, "blockExplorerUrl":"rinkeby.etherscan.io" }, - "goerli": {"id":5, "blockExplorerUrl":"goerli.etherscan.io" }, - "optimism": {"id":10, "blockExplorerUrl":"optimistic.etherscan.io", "balFrontend":"op.beets.fi/#/" }, - "kovan": {"id":42, "blockExplorerUrl":"kovan.etherscan.io", }, - "gnosis": {"id":100, "blockExplorerUrl":"gnosisscan.io", "balFrontend":"app.balancer.fi/#/gnosis-chain" }, - "polygon": {"id":137, "blockExplorerUrl":"polygonscan.com", "balFrontend":"app.balancer.fi/#/polygon" }, - "fantom": {"id":250, "blockExplorerUrl":"ftmscan.com", "balFrontend":"beets.fi/#/" }, - "zkevm": {"id":1101, "blockExplorerUrl":"zkevm.polygonscan.com", "balFrontend":"app.balancer.fi/#/zkevm" }, - "arbitrum": {"id":42161, "blockExplorerUrl":"arbiscan.io", "balFrontend":"app.balancer.fi/#/arbitrum" }, - "sepolia": {"id":11155111, "blockExplorerUrl":"sepolia.etherscan.io", "balFrontend":"app.balancer.fi/#/sepolia" } - }; - - apiEndpoint = "https://api.balancer.fi/" - - # ABIs and Deployment Addresses - abis = {}; - deploymentAddresses = {}; - - contractDirectories = {}; - deprecatedContractDirectories = {}; - deprecated = True; - deploymentsDir = "balancer-deployments/tasks/deprecated" - - for i in range(2): - # Get all deployment directories from the balancer-deployments repo - if not deprecated: - deploymentsDir = "balancer-deployments/tasks" - - spec = importlib.util.find_spec(__name__) - headTail = os.path.split(spec.origin); - packagePath = headTail[0]; - taskDir = os.path.join(packagePath, deploymentsDir); - taskSubDirs = os.listdir(taskDir); - taskSubDirs.sort(); - - for t in taskSubDirs: - # skip deprecated and scripts folders - if len(t.split("-")) == 1: - continue; - - # skip 00000000-tokens - if t.startswith("00000000"): - continue; - - currPath = os.path.join(taskDir, t, "artifact"); - artifactNames = os.listdir(currPath); - for a in artifactNames: - contractName = a.split(".")[0]; - if deprecated: - deprecatedContractDirectories[contractName] = t; - else: - contractDirectories[contractName] = t; - deprecated = False; - - decimals = {}; - - UserBalanceOpKind = { - "DEPOSIT_INTERNAL":0, - "WITHDRAW_INTERNAL":1, - "TRANSFER_INTERNAL":2, - "TRANSFER_EXTERNAL":3 - }; - inverseUserBalanceOpKind = { - 0:"DEPOSIT_INTERNAL", - 1:"WITHDRAW_INTERNAL", - 2:"TRANSFER_INTERNAL", - 3:"TRANSFER_EXTERNAL" - }; - - omitCalldataFlag = False; - calldataFlag = "py".encode('utf-8').hex(); - - def __init__(self, network=None, verbose=True, customConfigFile=None, manualEnv={}, omitCalldataFlag=False): - super(balpy, self).__init__(); - - self.verbose = verbose; - if self.verbose: - print(); - print("=============================================================="); - print("============== Initializing Balancer Python API =============="); - print("=============================================================="); - print(); - - if network is None: - print("No network set. Defaulting to kovan"); - network = "kovan"; - else: - print("Network is set to", network); - self.network = network.lower(); - - # set high decimal precision - getcontext().prec = 28; - - # grab parameters from env vars if they exist - self.infuraApiKey = os.environ.get(self.envVarInfura); - self.customRPC = os.environ.get(self.envVarCustomRPC); - self.etherscanApiKey = os.environ.get(self.envVarEtherscan); - self.privateKey = os.environ.get(self.envVarPrivate); - - # override params with manually passed args if they exist - if "infuraApiKey" in manualEnv.keys(): - self.infuraApiKey = manualEnv["infuraApiKey"]; - if "customRPC" in manualEnv.keys(): - self.customRPC = manualEnv["customRPC"]; - if "etherscanApiKey" in manualEnv.keys(): - self.etherscanApiKey = manualEnv["etherscanApiKey"]; - if "privateKey" in manualEnv.keys(): - self.privateKey = manualEnv["privateKey"]; - - if self.infuraApiKey is None and self.customRPC is None: - self.ERROR("You need to add your KEY_API_INFURA or BALPY_CUSTOM_RPC environment variables\n"); - self.ERROR("!! If you are using L2, you must use BALPY_CUSTOM_RPC !!"); - print("\t\texport " + self.envVarInfura + "="); - print("\t\t\tOR") - print("\t\texport " + self.envVarCustomRPC + "="); - print("\n\t\tNOTE: if you set " + self.envVarCustomRPC + ", it will override your Infura API key!") - quit(); - - if self.etherscanApiKey is None or self.privateKey is None: - self.ERROR("You need to add your keys to the your environment variables"); - print("\t\texport " + self.envVarEtherscan + "="); - print("\t\texport " + self.envVarPrivate + "="); - quit(); - - endpoint = self.customRPC; - if endpoint is None: - if network in ["polygon", "optimism", "arbitrum"]: - endpoint = 'https://' + self.network + '-mainnet.infura.io/v3/' + self.infuraApiKey; - else: - endpoint = 'https://' + self.network + '.infura.io/v3/' + self.infuraApiKey; - - self.endpoint = endpoint; - self.web3 = Web3(Web3.HTTPProvider(endpoint)); - - acct = self.web3.eth.account.privateKeyToAccount(self.privateKey); - self.web3.eth.default_account = acct.address; - self.address = acct.address; - - # initialize gas block caches - self.currGasPriceSpeed = None; - self.web3.middleware_onion.add(middleware.time_based_cache_middleware) - self.web3.middleware_onion.add(middleware.latest_block_based_cache_middleware) - self.web3.middleware_onion.add(middleware.simple_cache_middleware) - - # add support for PoA chains - self.web3.middleware_onion.inject(geth_poa_middleware, layer=0) - - self.omitCalldataFlag = omitCalldataFlag; - - if self.verbose: - print("Initialized account", self.web3.eth.default_account); - print("Connected to web3 at", endpoint); - - usingCustomConfig = (not customConfigFile is None); - customConfig = None; - if usingCustomConfig: - - # load custom config file if it exists, quit if not - if not os.path.isfile(customConfigFile): - self.ERROR("Custom config file" + customConfigFile + " not found!"); - quit(); - else: - with open(customConfigFile,'r') as f: - customConfig = json.load(f); - - # ensure all required fields are in the customConfig - requiredFields = ["contracts", "networkParams"] - hasAllRequirements = True; - for req in requiredFields: - if not req in customConfig.keys(): - hasAllRequirements = False; - if not hasAllRequirements: - self.ERROR("Not all custom fields are in the custom config!"); - print("You must include:"); - for req in requiredFields: - print("\t"+req); - print(); - quit(); - - # add network params for network - currNetworkParams = { - "id": customConfig["networkParams"]["id"], - "blockExplorerUrl": customConfig["networkParams"]["blockExplorerUrl"] - } - - if "balFrontend" in customConfig["networkParams"].keys(): - currNetworkParams["balFrontend"] = customConfig["networkParams"]["balFrontend"]; - self.networkParams[self.network] = currNetworkParams; - - self.mc = multicaller.multicaller( _chainId=self.networkParams[self.network]["id"], - _web3=self.web3, - _maxRetries=5, - _verbose=False, - _allowFailure=True); - - #reset for the edge case in which we're iterating through multiple networks - self.deploymentAddresses = {}; - missingContracts = []; - for contractType in self.contractDirectories.keys(): - subdir = self.contractDirectories[contractType]; - - # get contract abi from deployments repo artifacts - abiPath = os.path.join(self.deploymentsDir, subdir , "artifact", contractType + '.json'); - try: - f = pkgutil.get_data(__name__, abiPath).decode(); - currAbi = json.loads(f)["abi"]; - self.abis[contractType] = currAbi; - except BaseException as error: - self.ERROR('Error accessing file: {}'.format(abiPath)) - self.ERROR('{}'.format(error)) - - # get deployment address for given network - try: - if usingCustomConfig: - currAddress = self.web3.toChecksumAddress(customConfig["contracts"][contractType]); - else: - deploymentPath = os.path.join(self.deploymentsDir, subdir, "output", self.network + '.json'); - f = pkgutil.get_data(__name__, deploymentPath).decode(); - currData = json.loads(f); - currAddress = self.web3.toChecksumAddress(currData[contractType]); - self.deploymentAddresses[contractType] = currAddress; - except BaseException as error: - missingContracts.append(contractType); - - print("Available contracts on", self.network); - for element in self.deploymentAddresses.keys(): - address = self.deploymentAddresses[element]; - print("\t" + address + "\t" + element); - - print(); - print("Missing contracts on", self.network + ": [" + ", ".join(missingContracts) + "]"); - - print(); - print("=============================================================="); - - # ====================== - # ====Color Printing==== - # ====================== - def WARN(self, text): - WARNING_BEGIN = '\033[93m'; - WARNING_END = '\033[0m'; - print(WARNING_BEGIN + "[WARNING] " + text + WARNING_END); - - def ERROR(self, text): - ERROR_BEGIN = '\033[91m'; - ERROR_END = '\033[0m'; - print(ERROR_BEGIN + "[ERROR] " + text + ERROR_END); - - def GOOD(self, text): - GOOD_BEGIN = '\033[92m' - GOOD_END = '\033[0m'; - print(GOOD_BEGIN + text + GOOD_END); - - # ===================== - # ===Transaction Fns=== - # ===================== - def buildTx(self, fn, gasFactor, gasSpeed="average", nonceOverride=-1, gasEstimateOverride=-1, gasPriceGweiOverride=-1): - chainIdNetwork = self.networkParams[self.network]["id"]; - - # Get nonce if not overridden - if nonceOverride > -1: - nonce = nonceOverride; - else: - nonce = self.web3.eth.get_transaction_count(self.web3.eth.default_account) - - # Calculate gas estimate if not overridden - if gasEstimateOverride > -1: - gasEstimate = gasEstimateOverride; - else: - try: - gasEstimate = int(fn.estimateGas() * gasFactor); - except BaseException as error: - descriptiveError = be.handleException(error); - self.ERROR("Transaction failed at gas estimation!"); - self.ERROR(descriptiveError); - return(None); - - # Get gas price from Etherscan if not overridden - if gasPriceGweiOverride > -1: - gasPriceGwei = gasPriceGweiOverride; - else: - gasPriceGwei = self.getGasPrice(gasSpeed); - - print("\tGas Estimate:\t", gasEstimate); - print("\tGas Price:\t", gasPriceGwei, "Gwei"); - print("\tNonce:\t\t", nonce); - - # build transaction - data = fn.buildTransaction({'chainId': chainIdNetwork, - 'gas': gasEstimate, - 'gasPrice': self.web3.toWei(gasPriceGwei, 'gwei'), - 'nonce': nonce, - }); - return(data); - - def sendTx(self, tx, isAsync=False): - if not self.omitCalldataFlag: - tx["data"] += self.calldataFlag; - signedTx = self.web3.eth.account.sign_transaction(tx, self.privateKey); - txHash = self.web3.eth.send_raw_transaction(signedTx.rawTransaction).hex(); - - print(); - print("Sending transaction, view progress at:"); - print("\thttps://"+self.networkParams[self.network]["blockExplorerUrl"]+"/tx/"+txHash); - - if not isAsync: - self.waitForTx(txHash); - return(txHash); - - def waitForTx(self, txHash, timeOutSec=120): - txSuccessful = True; - print(); - print("Waiting for tx:", txHash); - try: - receipt = self.web3.eth.wait_for_transaction_receipt(txHash, timeout=timeOutSec); - if not receipt["status"] == 1: - txSuccessful = False; - except BaseException as error: - print('Transaction timeout: {}'.format(error)) - return(False); - - # Race condition: add a small delay to avoid getting the last nonce - time.sleep(0.5); - - print("\tTransaction accepted by network!"); - if not txSuccessful: - self.ERROR("Transaction failed!") - return(False) - print("\tTransaction was successful!\n"); - - return(True); - - def getTxReceipt(self, txHash, delay, maxRetries): - for i in range(maxRetries): - try: - receipt = self.web3.eth.getTransactionReceipt(txHash); - print("Retrieved receipt!"); - return(receipt); - except Exception as e: - print(e); - print("Transaction not found yet, will check again in", delay, "seconds"); - time.sleep(delay); - self.ERROR("Transaction not found in " + str(maxRetries) + " retries."); - return(False); - - # ===================== - # ====ERC20 methods==== - # ===================== - @cache - def erc20GetContract(self, tokenAddress): - # Read files packaged in module - abiPath = os.path.join('abi/ERC20.json'); - f = pkgutil.get_data(__name__, abiPath).decode(); - abi = json.loads(f); - - token = self.web3.eth.contract(self.web3.toChecksumAddress(tokenAddress), abi=abi) - return(token); - - @cache - def erc20GetDecimals(self, tokenAddress): - - # keep the manually maintained cache since the - # multicaller function can populate it too - if tokenAddress in self.decimals.keys(): - return(self.decimals[tokenAddress]); - - if tokenAddress == self.ZERO_ADDRESS: - self.decimals[tokenAddress] = 18; - return(18); - - token = self.erc20GetContract(tokenAddress); - decimals = token.functions.decimals().call(); - return(decimals); - - def erc20ScaleDecimalsStandard(self, tokenAddress, amount): - decimals = self.erc20GetDecimals(tokenAddress); - standardBalance = Decimal(amount) * Decimal(10**(-decimals)); - return(standardBalance); - - def erc20ScaleDecimalsWei(self, tokenAddress, amount): - decimals = self.erc20GetDecimals(tokenAddress); - weiBalance = Decimal(amount) * Decimal(10**(decimals)); - return(weiBalance); - - def erc20GetBalanceStandard(self, tokenAddress, address=None): - if address is None: - address = self.address; - token = self.erc20GetContract(tokenAddress); - decimals = self.erc20GetDecimals(tokenAddress); - standardBalance = Decimal(token.functions.balanceOf(address).call()) * Decimal(10**(-decimals)); - return(standardBalance); - - def erc20GetAllowanceStandard(self, tokenAddress, allowedAddress): - token = self.erc20GetContract(tokenAddress); - decimals = self.erc20GetDecimals(tokenAddress); - standardAllowance = Decimal(token.functions.allowance(self.address,allowedAddress).call()) * Decimal(10**(-decimals)); - return(standardAllowance); - - def erc20BuildFunctionSetAllowance(self, tokenAddress, allowedAddress, allowance): - token = self.erc20GetContract(tokenAddress); - approveFunction = token.functions.approve(allowedAddress, allowance); - return(approveFunction); - - def erc20SignAndSendNewAllowance( self, - tokenAddress, - allowedAddress, - allowance, - gasFactor, - gasSpeed, - nonceOverride=-1, - gasEstimateOverride=-1, - gasPriceGweiOverride=-1, - isAsync=False): - fn = self.erc20BuildFunctionSetAllowance(tokenAddress, allowedAddress, allowance); - tx = self.buildTx(fn, gasFactor, gasSpeed, nonceOverride, gasEstimateOverride, gasPriceGweiOverride); - txHash = self.sendTx(tx, isAsync); - return(txHash); - - def erc20HasSufficientBalance(self, tokenAddress, amountToUse): - balance = self.erc20GetBalanceStandard(tokenAddress); - - print("Token:", tokenAddress); - print("\tNeed:", float(amountToUse)); - print("\tWallet has:", float(balance)); - - sufficient = (float(balance) >= float(amountToUse)); - if not sufficient: - self.ERROR("Insufficient Balance!"); - else: - print("\tWallet has sufficient balance."); - print(); - return(sufficient); - - def erc20HasSufficientBalances(self, tokens, amounts): - if not len(tokens) == len(amounts): - self.ERROR("Array length mismatch with " + str(len(tokens)) + " tokens and " + str(len(amounts)) + " amounts."); - return(False); - numElements = len(tokens); - sufficientBalance = True; - for i in range(numElements): - token = tokens[i]; - amount = amounts[i]; - currentHasSufficientBalance = self.erc20HasSufficientBalance(token, amount); - sufficientBalance &= currentHasSufficientBalance; - return(sufficientBalance); - - def erc20HasSufficientAllowance(self, tokenAddress, allowedAddress, amount): - currentAllowance = self.erc20GetAllowanceStandard(tokenAddress, allowedAddress); - balance = self.erc20GetBalanceStandard(tokenAddress); - - print("Token:", tokenAddress); - print("\tCurrent Allowance:", currentAllowance); - print("\tCurrent Balance:", balance); - print("\tAmount to Spend:", amount); - - sufficient = (currentAllowance >= Decimal(amount)); - - if not sufficient: - print("\tInsufficient allowance!"); - print("\tWill need to unlock", tokenAddress); - else: - print("\tWallet has sufficient allowance."); - print(); - return(sufficient); - - def erc20EnforceSufficientAllowance(self, - tokenAddress, - allowedAddress, - targetAllowance, - amount, - gasFactor, - gasSpeed, - nonceOverride, - gasEstimateOverride, - gasPriceGweiOverride, - isAsync): - if not self.erc20HasSufficientAllowance(tokenAddress, allowedAddress, amount): - if targetAllowance == -1 or targetAllowance == self.INFINITE: - targetAllowance = self.INFINITE; - else: - decimals = self.erc20GetDecimals(tokenAddress); - targetAllowance = Decimal(targetAllowance) * Decimal(10**decimals); - targetAllowance = int(targetAllowance); - print("Insufficient Allowance: Increasing to", targetAllowance); - txHash = self.erc20SignAndSendNewAllowance(tokenAddress, allowedAddress, targetAllowance, gasFactor, gasSpeed, nonceOverride=nonceOverride, isAsync=isAsync, gasPriceGweiOverride=gasPriceGweiOverride); - return(txHash); - return(None); - - def erc20EnforceSufficientVaultAllowance(self, tokenAddress, targetAllowance, amount, gasFactor, gasSpeed, nonceOverride=-1, gasEstimateOverride=-1, gasPriceGweiOverride=-1, isAsync=False): - return(self.erc20EnforceSufficientAllowance(tokenAddress, self.deploymentAddresses["Vault"], targetAllowance, amount, gasFactor, gasSpeed, nonceOverride, gasEstimateOverride, gasPriceGweiOverride, isAsync)); - - def erc20GetTargetAllowancesFromPoolData(self, poolDescription): - (tokens, checksumTokens) = self.balSortTokens(list(poolDescription["tokens"].keys())); - allowances = []; - for token in tokens: - targetAllowance = -1; - if "allowance" in poolDescription["tokens"][token].keys(): - targetAllowance = poolDescription["tokens"][token]["allowance"]; - if targetAllowance == -1: - targetAllowance = self.INFINITE; - allowances.append(targetAllowance); - return(tokens, allowances); - - def erc20AsyncEnforceSufficientVaultAllowances(self, tokens, targetAllowances, amounts, gasFactor, gasSpeed, nonceOverride=-1, gasEstimateOverride=-1, gasPriceGweiOverride=-1): - if not len(tokens) == len(targetAllowances): - self.ERROR("Array length mismatch with " + str(len(tokens)) + " tokens and " + str(len(targetAllowances)) + " targetAllowances."); - return(False); - - nonce = self.web3.eth.get_transaction_count(self.web3.eth.default_account); - txHashes = []; - numElements = len(tokens); - for i in range(numElements): - token = tokens[i]; - targetAllowance = targetAllowances[i]; - amount = amounts[i]; - txHash = self.erc20EnforceSufficientVaultAllowance(token, targetAllowance, amount, gasFactor, gasSpeed, nonceOverride=nonce, isAsync=True); - if not txHash is None: - txHashes.append(txHash); - nonce += 1; - - for txHash in txHashes: - self.waitForTx(txHash) - return(True) - - # ===================== - # ======Etherscan====== - # ===================== - def generateEtherscanApiUrl(self): - etherscanUrl = self.networkParams[self.network]["blockExplorerUrl"] - separator = "."; - if self.network in ["kovan", "rinkeby","goerli","optimism"]: - separator = "-"; - urlFront = "https://api" + separator + etherscanUrl; - return(urlFront); - - def callEtherscan(self, url, maxRetries=3, verbose=False): - urlFront = self.generateEtherscanApiUrl(); - url = urlFront + url + self.etherscanApiKey; - if verbose: - print("Calling:", url); - - count = 0; - while count < maxRetries: - try: - dt = (time.time() - self.lastEtherscanCallTime); - if dt < 1.0/self.etherscanMaxRate: - time.sleep((1.0/self.etherscanMaxRate - dt) * 1.1); - - # faking a user-agent resolves the 403 (forbidden) errors on api-kovan.etherscan.io - headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36', "Upgrade-Insecure-Requests": "1","DNT": "1","Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language": "en-US,en;q=0.5","Accept-Encoding": "gzip, deflate"}; - r = requests.get(url, headers=headers); - if verbose: - print("\t", r); - self.lastEtherscanCallTime = time.time(); - data = r.json(); - if verbose: - print("\t", data); - return(data); - except Exception as e: - print("Exception:", e); - count += 1; - delaySec = 2; - if verbose: - self.WARN("Etherscan failed " + str(count) + " times. Retrying in " + str(delaySec) + " seconds..."); - time.sleep(delaySec); - self.ERROR("Etherscan failed " + str(count) + " times."); - return(False); - - def getGasPriceEtherscanGwei(self, speed, verbose=False): - if not speed in self.etherscanSpeedDict.keys(): - self.ERROR("Speed entered is:" + speed); - self.ERROR("Speed must be one of the following options:"); - for s in self.etherscanSpeedDict.keys(): - print("\t" + s); - return(False); - - urlString = "/api?module=gastracker&action=gasoracle&apikey=";# + self.etherscanApiKey; - response = self.callEtherscan(urlString, verbose=verbose); - return(response["result"][self.etherscanSpeedDict[speed]]); - - def getTransactionsByAddress(self, address, internal=False, startblock=0, verbose=False): - if verbose: - print("\tQuerying data after block", startblock); - - internalString = ""; - if internal: - internalString = "internal"; - - url = []; - url.append("/api?module=account&action=txlist{}&address=".format(internalString)); - url.append(address); - url.append("&startblock={}&endblock=99999999&sort=asc&apikey=".format(startblock)); - urlString = "".join(url); - txns = self.callEtherscan(urlString, verbose=verbose); - - if int(txns["status"]) == 0: - self.ERROR("Etherscan query failed. Please try again."); - return(False); - elif int(txns["status"]) == 1: - return(txns["result"]); - - def getTransactionByHash(self, txHash, verbose=False): - urlString = "/api?module=proxy&action=eth_getTransactionByHash&txhash={}&apikey=".format(txHash); - txns = self.callEtherscan(urlString, verbose=verbose); - - if verbose: - print(txns) - - if txns == False: - return(False); - return(txns); - - def isContractVerified(self, poolId, verbose=False): - address = self.balPooldIdToAddress(poolId); - url = "/api?module=contract&action=getabi&address={}&apikey=".format(address); - results = self.callEtherscan(url, verbose=verbose); - if verbose: - print(results); - isUnverified = (results["result"] == "Contract source code not verified"); - return(not isUnverified); - - def getGasPricePolygon(self, speed): - if speed in self.etherscanSpeedDict.keys(): - etherscanGasSpeedNamesToPolygon = { - "slow":"safeLow", - "average":"standard", - "fast":"fast" - }; - speed = etherscanGasSpeedNamesToPolygon[speed]; - - allowedSpeeds = ["safeLow","standard","fast","fastest"]; - if speed not in allowedSpeeds: - self.ERROR("Speed entered is:" + speed); - self.ERROR("Speed must be one of the following options:"); - for s in allowedSpeeds: - print("\t" + s); - return(False); - - r = requests.get("https://gasstation-mainnet.matic.network/") - prices = r.json(); - return(prices[speed]); - - def getGasPrice(self, speed): - allowedSpeeds = list(self.speedDict.keys()); - if speed not in allowedSpeeds: - self.ERROR("Speed entered is:" + speed); - self.ERROR("Speed must be one of the following options:"); - for s in allowedSpeeds: - print("\t" + s); - return(False); - - if not speed == self.currGasPriceSpeed: - self.currGasPriceSpeed = speed; - self.web3.eth.set_gas_price_strategy(self.speedDict[speed]); - - gasPrice = self.web3.eth.generateGasPrice() * 1e-9; - return(gasPrice) - - def balSortTokens(self, tokensIn): - # tokens need to be sorted as lowercase, but if they're provided as checksum, then - # the checksum format strings are still the keys outside of this function, so they - # must be preserved as they're input - lowerTokens = [t.lower() for t in tokensIn]; - lowerToOriginal = {}; - for i in range(len(tokensIn)): - lowerToOriginal[lowerTokens[i]] = tokensIn[i]; - lowerTokens.sort(); - - # get checksum tokens, translated sorted lower tokens back to their original format - checksumTokens = [self.web3.toChecksumAddress(t) for t in lowerTokens]; - sortedInputTokens = [lowerToOriginal[f] for f in lowerTokens] - - return(sortedInputTokens, checksumTokens); - - def balWeightsEqualOne(self, poolData): - tokenData = poolData["tokens"]; - tokens = tokenData.keys(); - - weightSum = Decimal(0.0); - for token in tokens: - weightSum += Decimal(tokenData[token]["weight"]); - - weightEqualsOne = (weightSum == Decimal(1.0)); - if not weightEqualsOne: - self.ERROR("Token weights add up to " + str(weightSum) + ", but they must add up to 1.0"); - self.ERROR("If you are passing more than 16 digits of precision, you must pass the value as a string") - return(weightEqualsOne); - - def balConvertTokensToWei(self, tokens, amounts): - rawTokens = []; - if not len(tokens) == len(amounts): - self.ERROR("Array length mismatch with " + str(len(tokens)) + " tokens and " + str(len(amounts)) + " amounts."); - return(False); - numElements = len(tokens); - for i in range(numElements): - token = tokens[i]; - rawValue = amounts[i]; - decimals = self.erc20GetDecimals(token); - if rawValue == self.INFINITE or rawValue == self.MAX_UINT_112: - decimals = 0; - raw = int(Decimal(rawValue) * Decimal(10**decimals)); - rawTokens.append(raw); - return(rawTokens); - - def balConvertWeiToToken(self, token, wei): - decimals = self.erc20GetDecimals(token) - return float(Decimal(wei) / Decimal(10**decimals)) - - def balSetOwner(self, poolData): - owner = self.ZERO_ADDRESS; - if "owner" in poolData.keys(): - ownerAddress = poolData["owner"]; - if not len(ownerAddress) == 42: - self.ERROR("Entry for \"owner\" must be a 42 character Ethereum address beginning with \"0x\""); - return(False); - owner = self.web3.toChecksumAddress(ownerAddress); - return(owner); - - def generateSalt(self, salt_input=None): - if salt_input is None: - salt_input = random.randint(0, 2**256 - 1); - salt = eth_abi.encode_abi(['uint256'],[int(salt_input)]); - salt_hex = binascii.hexlify(salt); - salt_str = "0x" + salt_hex.decode("ascii"); - return(salt_str); - - def balCreateFnWeightedPoolFactory(self, poolData): - factory = self.balLoadContract("WeightedPoolFactory"); - (tokens, checksumTokens) = self.balSortTokens(list(poolData["tokens"].keys())); - - intWithDecimalsWeights = [int(Decimal(poolData["tokens"][t]["weight"]) * Decimal(1e18)) for t in tokens]; - swapFeePercentage = int(Decimal(poolData["swapFeePercent"]) * Decimal(1e16)); - rateProviders = [self.web3.toChecksumAddress(poolData["tokens"][token]["rateProvider"]) for token in tokens]; - - if not self.balWeightsEqualOne(poolData): - return(False); - - owner = self.balSetOwner(poolData); - - createFunction = factory.functions.create( poolData["name"], - poolData["symbol"], - checksumTokens, - intWithDecimalsWeights, - rateProviders, - swapFeePercentage, - owner, - self.generateSalt()); - return(createFunction); - - def balCreateFnLBPoolFactory(self, poolData): - return(self.balCreateFnLBPFactory(poolData, "LiquidityBootstrappingPoolFactory")); - - def balCreateFnNoProtocolFeeLiquidityBootstrappingPoolFactory(self, poolData): - return(self.balCreateFnLBPFactory(poolData, "NoProtocolFeeLiquidityBootstrappingPoolFactory")); - - def balCreateFnLBPFactory(self, poolData, factoryName): - factory = self.balLoadContract(factoryName); - (tokens, checksumTokens) = self.balSortTokens(list(poolData["tokens"].keys())); - - if not self.balWeightsEqualOne(poolData): - return(False); - - swapFeePercentage = int(Decimal(poolData["swapFeePercent"]) * Decimal(1e16)); - intWithDecimalsWeights = [int(Decimal(poolData["tokens"][t]["weight"]) * Decimal(1e18)) for t in tokens]; - owner = self.balSetOwner(poolData); - - if not owner == self.address: - self.WARN("!!! You are not the owner for your LBP !!!") - self.WARN("You:\t\t" + self.address) - self.WARN("Pool Owner:\t" + owner) - - print(); - self.WARN("Only the pool owner can add liquidity. If you do not control " + owner + " then you will not be able to add liquidity!") - self.WARN("If you DO control " + owner + ", you will need to use the \"INIT\" join type from that address") - cancelTimeSec = 30; - self.WARN("If the owner mismatch is was unintentional, you have " + str(cancelTimeSec) + " seconds to cancel with Ctrl+C.") - time.sleep(cancelTimeSec); - - createFunction = factory.functions.create( poolData["name"], - poolData["symbol"], - checksumTokens, - intWithDecimalsWeights, - swapFeePercentage, - owner, - poolData["swapEnabledOnStart"]); - return(createFunction); - - def balCreateFnManagedPoolFactory(self, poolData): - self.WARN("!!! You are using the Managed Pool Factory without a controller !!!") - self.WARN("You are currently using a factory to deploy a managed pool without a factory-provided controller contract.") - self.WARN("It is highly recommended that you use a factory that pairs a controller with a pool") - self.WARN("While this will be a valid pool, the owner will have a dangerous level of power over the pool") - self.WARN("It *is* technically possible to add a controller contract as `owner`, but using a factory-paired one provides more guarantees") - - factory = self.balLoadContract("ManagedPoolFactory"); - (tokens, checksumTokens) = self.balSortTokens(list(poolData["tokens"].keys())); - swapFeePercentage = int(Decimal(poolData["swapFeePercent"]) * Decimal(1e16)); - intWithDecimalsWeights = [int(Decimal(poolData["tokens"][t]["weight"]) * Decimal(1e18)) for t in tokens]; - assetManagers = [poolData["tokens"][t]["assetManager"] for t in tokens]; - managementAumFeePercentage = int(Decimal(poolData["managementAumFeePercentage"]) * Decimal(1e16)); - - owner = self.balSetOwner(poolData); - if not owner == self.address: - self.WARN("!!! You are not the owner for your Managed Pool !!!") - self.WARN("You:\t\t" + self.address) - self.WARN("Pool Owner:\t" + owner) - - print(); - self.WARN("Only the pool owner can call permissioned functions, such as changing weights or the management fee.") - self.WARN(owner + " should either be you, or a multi-sig or other contract that you control and can call permissioned functions from.") - cancelTimeSec = 30; - self.WARN("If the owner mismatch is was unintentional, you have " + str(cancelTimeSec) + " seconds to cancel with Ctrl+C.") - time.sleep(cancelTimeSec); - - createFunction = factory.functions.create( - ( - poolData["name"], - poolData["symbol"], - assetManagers - ), - ( - checksumTokens, - intWithDecimalsWeights, - swapFeePercentage, - poolData["swapEnabledOnStart"], - poolData["mustAllowlistLPs"], - managementAumFeePercentage, - int(poolData["aumFeeId"]) - ), - owner, - self.generateSalt() - ); - return(createFunction); - - def balCreateFnComposableStablePoolFactory(self, poolData): - factory = self.balLoadContract("ComposableStablePoolFactory"); - (tokens, checksumTokens) = self.balSortTokens(list(poolData["tokens"].keys())); - swapFeePercentage = int(Decimal(poolData["swapFeePercent"]) * Decimal(1e16)); - owner = self.balSetOwner(poolData); - - rateProviders = [self.web3.toChecksumAddress(poolData["tokens"][token]["rateProvider"]) for token in tokens] - tokenRateCacheDurations = [int(poolData["tokens"][token]["tokenRateCacheDuration"]) for token in tokens] - exemptFromYieldProtocolFeeFlag = poolData["exemptFromYieldProtocolFeeFlag"]; - - createFunction = factory.functions.create( poolData["name"], - poolData["symbol"], - checksumTokens, - int(poolData["amplificationParameter"]), - rateProviders, - tokenRateCacheDurations, - exemptFromYieldProtocolFeeFlag, - swapFeePercentage, - owner, - self.generateSalt()); - return(createFunction); - - def balCreateFnLinearPoolFactory(self, poolData, factoryName): - factory = self.balLoadContract(factoryName); - (tokens, checksumTokens) = self.balSortTokens(list(poolData["tokens"].keys())); - swapFeePercentage = int(Decimal(poolData["swapFeePercent"]) * Decimal(1e16)); - owner = self.balSetOwner(poolData); - - mainToken = None; - wrappedToken = None; - for token in poolData["tokens"].keys(): - if poolData["tokens"][token]["isWrappedToken"]: - wrappedToken = token; - else: - mainToken = token; - - if mainToken == wrappedToken: - self.ERROR("AaveLinearPool must have one wrappedToken and one mainToken. Please check your inputs. Quitting..."); - return(False); - - upperTarget = int(poolData["upperTarget"]); - createFunction = factory.functions.create( poolData["name"], - poolData["symbol"], - self.web3.toChecksumAddress(mainToken), - self.web3.toChecksumAddress(wrappedToken), - upperTarget, - swapFeePercentage, - owner, - int(poolData["protocolId"]), - self.generateSalt()); - return(createFunction); - - def balCreateFnAaveLinearPoolFactory(self, poolData): - return(self.balCreateFnLinearPoolFactory(poolData, "AaveLinearPoolFactory")); - - def balCreateFnERC4626LinearPoolFactory(self, poolData): - return(self.balCreateFnLinearPoolFactory(poolData, "ERC4626LinearPoolFactory")); - - def balCreatePoolInFactory(self, poolDescription, gasFactor, gasPriceSpeed, nonceOverride=-1, gasEstimateOverride=-1, gasPriceGweiOverride=-1): - createFunction = None; - poolFactoryName = poolDescription["poolType"] + "Factory"; - - # list of all supported pool factories - # NOTE: when you add a pool factory to this list, be sure to - # add it to the printout of supported factories below - if poolFactoryName == "WeightedPoolFactory": - createFunction = self.balCreateFnWeightedPoolFactory(poolDescription); - if poolFactoryName == "ManagedPoolFactory": - createFunction = self.balCreateFnManagedPoolFactory(poolDescription); - if poolFactoryName == "ComposableStablePoolFactory": - createFunction = self.balCreateFnComposableStablePoolFactory(poolDescription); - if poolFactoryName == "AaveLinearPoolFactory": - createFunction = self.balCreateFnAaveLinearPoolFactory(poolDescription); - if poolFactoryName == "ERC4626LinearPoolFactory": - createFunction = self.balCreateFnERC4626LinearPoolFactory(poolDescription); - if poolFactoryName == "NoProtocolFeeLiquidityBootstrappingPoolFactory": - createFunction = self.balCreateFnNoProtocolFeeLiquidityBootstrappingPoolFactory(poolDescription); - if createFunction is None: - print("No pool factory found with name:", poolFactoryName); - print("Supported pool types are:"); - print("\tWeightedPool"); - print("\tManagedPool"); - print("\tComposableStablePoolFactory"); - print("\tAaveLinearPool"); - print("\tERC4626LinearPoolFactory"); - print("\tNoProtocolFeeLiquidityBootstrappingPoolFactory"); - return(False); - - if not createFunction: - self.ERROR("Pool creation failed.") - return(False) - print("Pool function created, generating transaction..."); - tx = self.buildTx(createFunction, gasFactor, gasPriceSpeed, nonceOverride, gasEstimateOverride, gasPriceGweiOverride); - print("Transaction Generated!"); - txHash = self.sendTx(tx); - return(txHash); - - def balGetPoolIdFromHash(self, txHash): - receipt = self.getTxReceipt(txHash, delay=2, maxRetries=5); - - # PoolRegistered event lives in the Vault - vault = self.balLoadContract("Vault"); - - with Suppressor(): - logs = vault.events.PoolRegistered().processReceipt(receipt); - poolId = logs[0]['args']['poolId'].hex(); - - print("Your pool ID is:"); - print("\t0x" + str(poolId)); - return(poolId); - - def balFindPoolFactory(self, poolId): - contractNames = self.deploymentAddresses.keys(); - factoryNames = [c for c in contractNames if ("Factory" in c) and ("Pool" in c)]; #can't simply use "PoolFactory" b/c of WeightedPool2TokensFactory - - self.mc.reset(); - for factoryName in factoryNames: - factory = self.balLoadContract(factoryName); - poolAddress = self.balPooldIdToAddress(poolId); - self.mc.addCall(factory.address, factory.abi, "isPoolFromFactory", args=[poolAddress]); - data = self.mc.execute(); - - foundFactoryName = []; - numFound = 0; - for f,d in zip(factoryNames, data[0]): - if d[0]: - foundFactoryName.append(f); - numFound += 1; - - if numFound == 1: - return(foundFactoryName[0]); - else: - self.ERROR("Was expecting 1 factory, got " + str(numFound)); - self.ERROR(",".join(foundFactoryName)) - self.ERROR("Checked the following factories:\n\t\t" + "\n\t\t".join(factoryNames)); - return(None); - - def balGetJoinKindEnum(self, poolId, joinKind): - factoryName = self.balFindPoolFactory(poolId); - - usingWeighted = factoryName in ["WeightedPoolFactory", "NoProtocolFeeLiquidityBootstrappingPoolFactory", "ManagedPoolFactory"]; - usingComposableStable = factoryName in ["ComposableStablePoolFactory"]; - - if usingWeighted: - joinKindEnum = WeightedPoolJoinKind[joinKind]; - elif usingComposableStable: - joinKindEnum = StablePhantomPoolJoinKind[joinKind]; - else: - self.ERROR("PoolType " + str(factoryName) + " not supported for JoinKind: " + joinKind) - return(None); - return(joinKindEnum); - - def balGetTokensAndAmounts(self, joinDescription): - (sortedTokens, checksumTokens) = self.balSortTokens(list(joinDescription["tokens"].keys())); - amountKey = "amount"; - if not amountKey in joinDescription["tokens"][list(joinDescription["tokens"].keys())[0]].keys(): - amountKey = "initialBalance"; - amountsBySortedTokens = [joinDescription["tokens"][token][amountKey] for token in sortedTokens]; - maxAmountsIn = self.balConvertTokensToWei(sortedTokens, amountsBySortedTokens); - return(checksumTokens, maxAmountsIn); - - def balGetTokensAndAmountsComposable(self, joinDescription): - (checksumTokens, maxAmountsIn) = self.balGetTokensAndAmounts(joinDescription); - - poolAddress = self.balPooldIdToAddress(joinDescription["poolId"]); - poolAddress = self.web3.toChecksumAddress(poolAddress); - - composableAmount = None; - - userDataMaxAmountIn = copy.deepcopy(maxAmountsIn); - - for i in range(len(checksumTokens)): - if checksumTokens[i] == poolAddress: - composableAmount = maxAmountsIn[i]; - del checksumTokens[i]; - del maxAmountsIn[i]; - del userDataMaxAmountIn[i]; - break; - - checksumTokens.insert(0, poolAddress); - maxAmountsIn.insert(0, composableAmount); - - return(checksumTokens, maxAmountsIn, userDataMaxAmountIn); - - def balDoJoinPool(self, poolId, address, joinPoolRequestTuple, gasFactor=1.05, gasPriceSpeed="average", nonceOverride=-1, gasEstimateOverride=-1, gasPriceGweiOverride=-1): - vault = self.balLoadContract("Vault"); - joinPoolFunction = vault.functions.joinPool(poolId, address, address, joinPoolRequestTuple); - tx = self.buildTx(joinPoolFunction, gasFactor, gasPriceSpeed, nonceOverride, gasEstimateOverride, gasPriceGweiOverride); - print("Transaction Generated!"); - txHash = self.sendTx(tx); - return(txHash); - - def balDoQueryJoinPool(self, poolId, address, joinPoolRequestTuple): - bh = self.balLoadContract("BalancerHelpers"); - (bptOut, amountsIn) = bh.functions.queryJoin(poolId, address, address, joinPoolRequestTuple).call(); - return((bptOut, amountsIn)); - - def balFormatJoinPoolInit(self, joinDescription): - (checksumTokens, maxAmountsIn) = self.balGetTokensAndAmounts(copy.deepcopy(joinDescription)); - - poolId = joinDescription["poolId"]; - factory = self.balFindPoolFactory(poolId); - - userDataMaxAmountsIn = maxAmountsIn; - if factory in ["ManagedPoolFactory"]: - (checksumTokens, maxAmountsIn, userDataMaxAmountsIn) = self.balGetTokensAndAmountsComposable(copy.deepcopy(joinDescription)); - - joinKindEnum = self.balGetJoinKindEnum(poolId, joinDescription["joinKind"]); - userDataEncoded = eth_abi.encode_abi( ['uint256', 'uint256[]'], - [int(joinKindEnum), userDataMaxAmountsIn]); - address = self.web3.toChecksumAddress(self.web3.eth.default_account); - joinPoolRequestTuple = (checksumTokens, maxAmountsIn, userDataEncoded.hex(), joinDescription["fromInternalBalance"]); - return(poolId, address, joinPoolRequestTuple); - - def balFormatJoinPoolExactTokensInForBptOut(self, joinDescription): - (checksumTokens, maxAmountsIn) = self.balGetTokensAndAmounts(copy.deepcopy(joinDescription)); - poolId = joinDescription["poolId"]; - joinKindEnum = self.balGetJoinKindEnum(poolId, joinDescription["joinKind"]); - userDataEncoded = eth_abi.encode_abi( ['uint256', 'uint256[]'], - [int(joinKindEnum), maxAmountsIn]); - address = self.web3.toChecksumAddress(self.web3.eth.default_account); - joinPoolRequestTuple = (checksumTokens, maxAmountsIn, userDataEncoded.hex(), joinDescription["fromInternalBalance"]); - return(poolId, address, joinPoolRequestTuple); - - def balFormatJoinPoolAllTokensInForExactBptOut(self, joinDescription): - (checksumTokens, maxAmountsIn) = self.balGetTokensAndAmounts(copy.deepcopy(joinDescription)); - poolId = joinDescription["poolId"]; - poolAddress = self.balPooldIdToAddress(poolId); - bptAmountOut = self.balConvertTokensToWei([poolAddress], [joinDescription["bptAmountOut"]])[0]; - - joinKindEnum = self.balGetJoinKindEnum(poolId, joinDescription["joinKind"]); - userDataEncoded = eth_abi.encode_abi( ['uint256', 'uint256'], - [int(joinKindEnum), bptAmountOut]); - address = self.web3.toChecksumAddress(self.web3.eth.default_account); - joinPoolRequestTuple = (checksumTokens, maxAmountsIn, userDataEncoded.hex(), joinDescription["fromInternalBalance"]); - return(poolId, address, joinPoolRequestTuple); - - def balFormatJoinPoolTokenInForExactBptOut(self, joinDescription): - (checksumTokens, maxAmountsIn) = self.balGetTokensAndAmounts(copy.deepcopy(joinDescription)); - - index = -1; - counter = -1; - for amt in maxAmountsIn: - counter += 1; - if amt > 0: - if index == -1: - index = counter; - else: - self.ERROR("Multiple tokens have amounts for a single token join! Only one token can have a non-zero amount!"); - return(False); - if index == -1: - self.ERROR("No tokens have amounts. You must have one token with a non-zero amount!"); - return(False); - - poolId = joinDescription["poolId"]; - poolAddress = self.balPooldIdToAddress(poolId); - bptAmountOut = self.balConvertTokensToWei([poolAddress], [joinDescription["bptAmountOut"]])[0]; - - joinKindEnum = self.balGetJoinKindEnum(poolId, joinDescription["joinKind"]); - userDataEncoded = eth_abi.encode_abi( ['uint256', 'uint256', 'uint256'], - [int(joinKindEnum), bptAmountOut, index]); - - address = self.web3.toChecksumAddress(self.web3.eth.default_account); - joinPoolRequestTuple = (checksumTokens, maxAmountsIn, userDataEncoded.hex(), joinDescription["fromInternalBalance"]); - - return(poolId, address, joinPoolRequestTuple); - - def balJoinPool(self, joinDescription, query=False, gasFactor=1.05, gasPriceSpeed="average", nonceOverride=-1, gasEstimateOverride=-1, gasPriceGweiOverride=-1): - joinKind = joinDescription["joinKind"]; - poolId = None; - address = None; - joinPoolRequestTuple = None; - - if joinKind == "INIT": - (poolId, address, joinPoolRequestTuple) = self.balFormatJoinPoolInit(joinDescription); - elif joinKind == "EXACT_TOKENS_IN_FOR_BPT_OUT": - (poolId, address, joinPoolRequestTuple) = self.balFormatJoinPoolExactTokensInForBptOut(joinDescription); - elif joinKind == "TOKEN_IN_FOR_EXACT_BPT_OUT": - tempJoinDescription = copy.deepcopy(joinDescription); - if query: - for token in tempJoinDescription["tokens"].keys(): - if tempJoinDescription["tokens"][token]["amount"] == 0.0: - tempJoinDescription["tokens"][token]["amount"] = self.INFINITE; - (poolId, address, joinPoolRequestTuple) = self.balFormatJoinPoolTokenInForExactBptOut(tempJoinDescription); - elif joinKind == "ALL_TOKENS_IN_FOR_EXACT_BPT_OUT": - tempJoinDescription = copy.deepcopy(joinDescription); - if query: - for token in tempJoinDescription["tokens"].keys(): - tempJoinDescription["tokens"][token]["amount"] = self.INFINITE; - (poolId, address, joinPoolRequestTuple) = self.balFormatJoinPoolAllTokensInForExactBptOut(tempJoinDescription); - print((poolId, address, joinPoolRequestTuple)) - - if query: - (bptOut, amountsIn) = self.balDoQueryJoinPool(poolId, address, joinPoolRequestTuple); - bptAddress = self.balPooldIdToAddress(poolId); - outputData = {}; - outputData["bptOut"] = { - "token":bptAddress, - "decimals":self.erc20GetDecimals(bptAddress), - "amount":bptOut - } - outputData["amountsIn"] = {}; - for token, amount in zip(joinPoolRequestTuple[0], amountsIn): - outputData["amountsIn"][token] = { - "token":token, - "decimals":self.erc20GetDecimals(token), - "amount":amount - } - return(outputData); - else: - txHash = self.balDoJoinPool(poolId, address, joinPoolRequestTuple, gasFactor=gasFactor, gasPriceSpeed=gasPriceSpeed, nonceOverride=nonceOverride, gasEstimateOverride=gasEstimateOverride, gasPriceGweiOverride=gasPriceGweiOverride); - return(txHash); - - def balRegisterPoolWithVault(self, poolDescription, poolId, gasFactor=1.05, gasPriceSpeed="average", nonceOverride=-1, gasEstimateOverride=-1, gasPriceGweiOverride=-1): - self.WARN("\"balRegisterPoolWithVault\" is deprecated. Please use \"balJoinPoolInit\".") - self.balJoinPoolInit(poolDescription, poolId, gasFactor, gasPriceSpeed, nonceOverride, gasEstimateOverride, gasPriceGweiOverride) - - def balJoinPoolInit(self, poolDescription, poolId, gasFactor=1.05, gasPriceSpeed="average", nonceOverride=-1, gasEstimateOverride=-1, gasPriceGweiOverride=-1): - - if poolDescription["poolType"] in ["AaveLinearPool", "ERC4626LinearPool"]: - slippageTolerancePercent = 1; - txHash = self.balLinearPoolInitJoin(poolDescription, poolId, slippageTolerancePercent=slippageTolerancePercent, gasFactor=gasFactor, gasPriceSpeed=gasPriceSpeed, nonceOverride=nonceOverride, gasEstimateOverride=gasEstimateOverride, gasPriceGweiOverride=gasPriceGweiOverride); - return(txHash) - - # StablePhantomPools need their own BPT as one of the provided tokens with a limit of MAX_UINT_112 - if poolDescription["poolType"] in ["StablePhantomPool", "ComposableStablePool", "ManagedPool"]: - initialBalancesNoBpt = [poolDescription["tokens"][token]["initialBalance"] for token in poolDescription["tokens"].keys()]; - phantomBptAddress = self.balPooldIdToAddress(poolId); - poolDescription["tokens"][phantomBptAddress] = {"initialBalance":self.MAX_UINT_112} - - poolDescription["joinKind"] = "INIT"; - return(self.balJoinPool(poolDescription, False, gasFactor, gasPriceSpeed, nonceOverride, gasEstimateOverride, gasPriceGweiOverride)); - - def balLinearPoolInitJoin(self, poolDescription, poolId, slippageTolerancePercent=1, gasFactor=1.05, gasPriceSpeed="average", nonceOverride=-1, gasEstimateOverride=-1, gasPriceGweiOverride=-1): - - phantomBptAddress = self.balPooldIdToAddress(poolId); - - batchSwap = {}; - batchSwap["kind"] = 0; - batchSwap["assets"] = list(poolDescription["tokens"].keys()); - batchSwap["swaps"] = []; - - numTokens = len(batchSwap["assets"]); - for i in range(numTokens): - token = batchSwap["assets"][i]; - swap = {}; - swap["poolId"] = "0x" + poolId; - swap["assetInIndex"] = i; - swap["assetOutIndex"] = numTokens; - swap["amount"] = poolDescription["tokens"][token]["initialBalance"]; - if float(swap["amount"]) > 0.0: - batchSwap["swaps"].append(swap); - - # add the phantomBpt to the assets/limits list now that we've crafted the swap steps - batchSwap["assets"].append(phantomBptAddress); - batchSwap["limits"] = [0] * len(batchSwap["assets"]); #for now - - batchSwap["funds"] = {}; - batchSwap["funds"]["sender"] = self.address; - batchSwap["funds"]["recipient"] = self.address; - batchSwap["funds"]["fromInternalBalance"] = False; - batchSwap["funds"]["toInternalBalance"] = False; - batchSwap["deadline"] = "999999999999999999"; - - estimates = self.balQueryBatchSwap(batchSwap); - - checksumTokens = [self.web3.toChecksumAddress(t) for t in batchSwap["assets"]]; - for i in range(len(batchSwap["assets"])): - asset = checksumTokens[i]; - slippageToleranceFactor = slippageTolerancePercent/100.0; - if estimates[asset] < 0: - slippageToleranceFactor *= -1.0; - batchSwap["limits"][i] = estimates[asset] * (1.0 + slippageToleranceFactor); - - txHash = self.balDoBatchSwap(batchSwap, isAsync=False, gasFactor=gasFactor, gasPriceSpeed=gasPriceSpeed, nonceOverride=nonceOverride, gasEstimateOverride=gasEstimateOverride, gasPriceGweiOverride=gasPriceGweiOverride); - return(txHash) - - def balDoQueryExitPool(self, poolId, address, exitPoolRequestTuple): - bh = self.balLoadContract("BalancerHelpers") - return bh.functions.queryExit(poolId, address, address, exitPoolRequestTuple).call() - - def balFormatQueryExitPoolOutput(self, queryExitPoolOutput, tokens, poolAddress): - result = {} - bptAmountIn, tokensAmountsOut = queryExitPoolOutput - result["bptIn"] = { - "address": poolAddress, - "amount": self.balConvertWeiToToken(poolAddress, bptAmountIn) + + """ + Balancer Protocol Python API + Interface with Balancer V2 Smart contracts directly from Python + """ + + DELEGATE_OWNER = "0xBA1BA1ba1BA1bA1bA1Ba1BA1ba1BA1bA1ba1ba1B" + ZERO_ADDRESS = "0x0000000000000000000000000000000000000000" + + # Constants + INFINITE = 2**256 - 1 + # for infinite unlock + MAX_UINT_112 = 2**112 - 1 + # for stablephantom max bpt + + # Environment variable names + envVarEtherscan = "KEY_API_ETHERSCAN" + envVarInfura = "KEY_API_INFURA" + envVarPrivate = "KEY_PRIVATE" + envVarCustomRPC = "BALPY_CUSTOM_RPC" + + # Etherscan API call management + lastEtherscanCallTime = 0 + etherscanMaxRate = 5.0 + # hz + etherscanSpeedDict = { + "slow": "SafeGasPrice", + "average": "ProposeGasPrice", + "fast": "FastGasPrice", + } + speedDict = { + "glacial": glacial_gas_price_strategy, + "slow": slow_gas_price_strategy, + "average": medium_gas_price_strategy, + "fast": fast_gas_price_strategy, + } + + # Network parameters + networkParams = { + "mainnet": { + "id": 1, + "blockExplorerUrl": "etherscan.io", + "balFrontend": "app.balancer.fi/#/ethereum", + }, + "ropsten": {"id": 3, "blockExplorerUrl": "ropsten.etherscan.io"}, + "rinkeby": {"id": 4, "blockExplorerUrl": "rinkeby.etherscan.io"}, + "goerli": {"id": 5, "blockExplorerUrl": "goerli.etherscan.io"}, + "optimism": { + "id": 10, + "blockExplorerUrl": "optimistic.etherscan.io", + "balFrontend": "op.beets.fi/#/", + }, + "kovan": { + "id": 42, + "blockExplorerUrl": "kovan.etherscan.io", + }, + "gnosis": { + "id": 100, + "blockExplorerUrl": "gnosisscan.io", + "balFrontend": "app.balancer.fi/#/gnosis-chain", + }, + "polygon": { + "id": 137, + "blockExplorerUrl": "polygonscan.com", + "balFrontend": "app.balancer.fi/#/polygon", + }, + "fantom": { + "id": 250, + "blockExplorerUrl": "ftmscan.com", + "balFrontend": "beets.fi/#/", + }, + "zkevm": { + "id": 1101, + "blockExplorerUrl": "zkevm.polygonscan.com", + "balFrontend": "app.balancer.fi/#/zkevm", + }, + "arbitrum": { + "id": 42161, + "blockExplorerUrl": "arbiscan.io", + "balFrontend": "app.balancer.fi/#/arbitrum", + }, + "sepolia": { + "id": 11155111, + "blockExplorerUrl": "sepolia.etherscan.io", + "balFrontend": "app.balancer.fi/#/sepolia", + }, + "base": { + "id": 8453, + "blockExplorerUrl": "basescan.org", + "balFrontend": "app.balancer.fi/#/base", + }, + "mode": { + "id": 34443, + "blockExplorerUrl": "modescan.io", + "balFrontend": "app.balancer.fi/#/mode", + }, + + } + + apiEndpoint = BALANCER_API_ENDPOINT + + # ABIs and Deployment Addresses + abis = {} + deploymentAddresses = {} + + contractDirectories = {} + deprecatedContractDirectories = {} + deprecated = True + deploymentsDir = "balancer-deployments/tasks/deprecated" + + for i in range(2): + # Get all deployment directories from the balancer-deployments repo + if not deprecated: + deploymentsDir = "balancer-deployments/tasks" + + spec = importlib.util.find_spec(__name__) + headTail = os.path.split(spec.origin) + packagePath = headTail[0] + taskDir = os.path.join(packagePath, deploymentsDir) + taskSubDirs = sorted(os.listdir(taskDir)) + + for t in taskSubDirs: + # skip deprecated and scripts folders + if len(t.split("-")) == 1: + continue + + # skip 00000000-tokens + if t.startswith("00000000"): + continue + + currPath = os.path.join(taskDir, t, "artifact") + artifactNames = os.listdir(currPath) + for a in artifactNames: + contractName = a.split(".")[0] + if deprecated: + deprecatedContractDirectories[contractName] = t + else: + contractDirectories[contractName] = t + deprecated = False + + decimals = {} + + UserBalanceOpKind = { + "DEPOSIT_INTERNAL": 0, + "WITHDRAW_INTERNAL": 1, + "TRANSFER_INTERNAL": 2, + "TRANSFER_EXTERNAL": 3, + } + inverseUserBalanceOpKind = { + 0: "DEPOSIT_INTERNAL", + 1: "WITHDRAW_INTERNAL", + 2: "TRANSFER_INTERNAL", + 3: "TRANSFER_EXTERNAL", + } + + omitCalldataFlag = False + calldataFlag = "py".encode("utf-8").hex() + + def __init__( + self, + network=None, + verbose=True, + customConfigFile=None, + manualEnv={}, + omitCalldataFlag=False, + ): + super(balpy, self).__init__() + + self.verbose = verbose + if self.verbose: + print() + print("==============================================================") + print("============== Initializing Balancer Python API ==============") + print("==============================================================") + print() + + if network is None: + print("No network set. Defaulting to kovan") + network = "kovan" + else: + print("Network is set to", network) + self.network = network.lower() + + # set high decimal precision + getcontext().prec = 28 + + # grab parameters from env vars if they exist + self.infuraApiKey = os.environ.get(self.envVarInfura) + self.customRPC = os.environ.get(self.envVarCustomRPC) + self.etherscanApiKey = os.environ.get(self.envVarEtherscan) + self.privateKey = os.environ.get(self.envVarPrivate) + + # override params with manually passed args if they exist + if "infuraApiKey" in manualEnv.keys(): + self.infuraApiKey = manualEnv["infuraApiKey"] + if "customRPC" in manualEnv.keys(): + self.customRPC = manualEnv["customRPC"] + if "etherscanApiKey" in manualEnv.keys(): + self.etherscanApiKey = manualEnv["etherscanApiKey"] + if "privateKey" in manualEnv.keys(): + self.privateKey = manualEnv["privateKey"] + + if self.infuraApiKey is None and self.customRPC is None: + self.ERROR( + "You need to add your KEY_API_INFURA or BALPY_CUSTOM_RPC environment variables\n" + ) + self.ERROR( + "!! If you are using L2, you must use BALPY_CUSTOM_RPC !!") + print("\t\texport " + self.envVarInfura + "=") + print("\t\t\tOR") + print("\t\texport " + self.envVarCustomRPC + "=") + print( + "\n\t\tNOTE: if you set " + + self.envVarCustomRPC + + ", it will override your Infura API key!" + ) + quit() + + if self.etherscanApiKey is None or self.privateKey is None: + self.ERROR( + "You need to add your keys to the your environment variables") + print( + "\t\texport " + + self.envVarEtherscan + + "=") + print("\t\texport " + self.envVarPrivate + "=") + quit() + + endpoint = self.customRPC + if endpoint is None: + if network in ["polygon", "optimism", "arbitrum"]: + endpoint = ( + "https://" + + self.network + + "-mainnet.infura.io/v3/" + + self.infuraApiKey + ) + else: + endpoint = ( + "https://" + self.network + ".infura.io/v3/" + self.infuraApiKey + ) + + self.endpoint = endpoint + self.web3 = Web3(Web3.HTTPProvider(endpoint)) + + acct = self.web3.eth.account.from_key(self.privateKey) + self.web3.eth.default_account = acct.address + self.address = acct.address + + # initialize gas block caches + self.currGasPriceSpeed = None + self.web3.middleware_onion.add(middleware.time_based_cache_middleware) + self.web3.middleware_onion.add( + middleware.latest_block_based_cache_middleware) + self.web3.middleware_onion.add(middleware.simple_cache_middleware) + + # add support for PoA chains + self.web3.middleware_onion.inject(geth_poa_middleware, layer=0) + + self.omitCalldataFlag = omitCalldataFlag + + if self.verbose: + print("Initialized account", self.web3.eth.default_account) + print("Connected to web3 at", endpoint) + + usingCustomConfig = customConfigFile is not None + customConfig = None + if usingCustomConfig: + # load custom config file if it exists, quit if not + if not os.path.isfile(customConfigFile): + self.ERROR( + "Custom config file" + + customConfigFile + + " not found!") + quit() + else: + with open(customConfigFile, "r") as f: + customConfig = json.load(f) + + # ensure all required fields are in the customConfig + requiredFields = ["contracts", "networkParams"] + hasAllRequirements = True + for req in requiredFields: + if req not in customConfig.keys(): + hasAllRequirements = False + if not hasAllRequirements: + self.ERROR("Not all custom fields are in the custom config!") + print("You must include:") + for req in requiredFields: + print("\t" + req) + print() + quit() + + # add network params for network + currNetworkParams = { + "id": customConfig["networkParams"]["id"], + "blockExplorerUrl": customConfig["networkParams"]["blockExplorerUrl"], + } + + if "balFrontend" in customConfig["networkParams"].keys(): + currNetworkParams["balFrontend"] = customConfig["networkParams"][ + "balFrontend" + ] + self.networkParams[self.network] = currNetworkParams + + self.mc = multicaller.multicaller( + _chainId=self.networkParams[self.network]["id"], + _web3=self.web3, + _maxRetries=5, + _verbose=False, + _allowFailure=True, + ) + + # reset for the edge case in which we're iterating through multiple + # networks + self.deploymentAddresses = {} + missingContracts = [] + for contractType in self.contractDirectories.keys(): + subdir = self.contractDirectories[contractType] + + # get contract abi from deployments repo artifacts + abiPath = os.path.join( + self.deploymentsDir, subdir, "artifact", contractType + ".json" + ) + try: + f = pkgutil.get_data(__name__, abiPath).decode() + currAbi = json.loads(f)["abi"] + self.abis[contractType] = currAbi + except BaseException as error: + self.ERROR("Error accessing file: {}".format(abiPath)) + self.ERROR("{}".format(error)) + + # get deployment address for given network + try: + if usingCustomConfig: + currAddress = self.web3.to_checksum_address( + customConfig["contracts"][contractType] + ) + else: + deploymentPath = os.path.join( + self.deploymentsDir, subdir, "output", self.network + ".json" + ) + f = pkgutil.get_data(__name__, deploymentPath).decode() + currData = json.loads(f) + currAddress = self.web3.to_checksum_address( + currData[contractType]) + self.deploymentAddresses[contractType] = currAddress + except BaseException: + missingContracts.append(contractType) + + print("Available contracts on", self.network) + for element in self.deploymentAddresses.keys(): + address = self.deploymentAddresses[element] + print("\t" + address + "\t" + element) + + print() + print( + "Missing contracts on", + self.network + ": [" + ", ".join(missingContracts) + "]", + ) + + print() + print("==============================================================") + + self.graph = TheGraph( + network, customUrl=BALANCER_API_ENDPOINT, usingJsonEndpoint=True + ) + + # ====================== + # ====Color Printing==== + # ====================== + def WARN(self, text): + WARNING_BEGIN = "\033[93m" + WARNING_END = "\033[0m" + print(WARNING_BEGIN + "[WARNING] " + text + WARNING_END) + + def ERROR(self, text): + ERROR_BEGIN = "\033[91m" + ERROR_END = "\033[0m" + print(ERROR_BEGIN + "[ERROR] " + text + ERROR_END) + + def GOOD(self, text): + GOOD_BEGIN = "\033[92m" + GOOD_END = "\033[0m" + print(GOOD_BEGIN + text + GOOD_END) + + # ===================== + # ===Transaction Fns=== + # ===================== + def buildTx( + self, + fn, + gasFactor, + gasSpeed="average", + nonceOverride=-1, + gasEstimateOverride=-1, + gasPriceGweiOverride=-1, + ): + chainIdNetwork = self.networkParams[self.network]["id"] + + # Get nonce if not overridden + if nonceOverride > -1: + nonce = nonceOverride + else: + nonce = self.web3.eth.get_transaction_count( + self.web3.eth.default_account) + + # Calculate gas estimate if not overridden + if gasEstimateOverride > -1: + gasEstimate = gasEstimateOverride + else: + try: + gasEstimate = int(fn.estimate_gas() * gasFactor) + except BaseException as error: + descriptiveError = be.handleException(error) + self.ERROR("Transaction failed at gas estimation!") + self.ERROR(descriptiveError) + return None + + # Get gas price from Etherscan if not overridden + if gasPriceGweiOverride > -1: + gasPriceGwei = gasPriceGweiOverride + else: + gasPriceGwei = self.getGasPrice(gasSpeed) + + print("\tGas Estimate:\t", gasEstimate) + print("\tGas Price:\t", gasPriceGwei, "Gwei") + print("\tNonce:\t\t", nonce) + + # build transaction + data = fn.build_transaction( + { + "chainId": chainIdNetwork, + "gas": gasEstimate, + "gasPrice": self.web3.to_wei(gasPriceGwei, "gwei"), + "nonce": nonce, + } + ) + return data + + def sendTx(self, tx, isAsync=False): + if not self.omitCalldataFlag: + tx["data"] += self.calldataFlag + signedTx = self.web3.eth.account.sign_transaction(tx, self.privateKey) + txHash = self.web3.eth.send_raw_transaction( + signedTx.rawTransaction).hex() + + print() + print("Sending transaction, view progress at:") + print( + "\thttps://" + + self.networkParams[self.network]["blockExplorerUrl"] + + "/tx/" + + txHash + ) + + if not isAsync: + self.waitForTx(txHash) + return txHash + + def waitForTx(self, txHash, timeOutSec=120): + txSuccessful = True + print() + print("Waiting for tx:", txHash) + try: + receipt = self.web3.eth.wait_for_transaction_receipt( + txHash, timeout=timeOutSec + ) + if not receipt["status"] == 1: + txSuccessful = False + except BaseException as error: + print("Transaction timeout: {}".format(error)) + return False + + # Race condition: add a small delay to avoid getting the last nonce + time.sleep(0.5) + + print("\tTransaction accepted by network!") + if not txSuccessful: + self.ERROR("Transaction failed!") + return False + print("\tTransaction was successful!\n") + + return True + + def getTxReceipt(self, txHash, delay, maxRetries): + for i in range(maxRetries): + try: + receipt = self.web3.eth.getTransactionReceipt(txHash) + print("Retrieved receipt!") + return receipt + except Exception as e: + print(e) + print( + "Transaction not found yet, will check again in", delay, "seconds" + ) + time.sleep(delay) + self.ERROR("Transaction not found in " + str(maxRetries) + " retries.") + return False + + # ===================== + # ====ERC20 methods==== + # ===================== + @cache + def erc20GetContract(self, tokenAddress): + # Read files packaged in module + + abiPath = os.path.join("abi/ERC20.json") + f = pkgutil.get_data(__name__, abiPath).decode() + abi = json.loads(f) + + token = self.web3.eth.contract( + self.web3.to_checksum_address(tokenAddress), abi=abi + ) + return token + + @cache + def erc20GetDecimals(self, tokenAddress): + # keep the manually maintained cache since the + # multicaller function can populate it too + if tokenAddress in self.decimals.keys(): + return self.decimals[tokenAddress] + + if tokenAddress == self.ZERO_ADDRESS: + self.decimals[tokenAddress] = 18 + return 18 + + token = self.erc20GetContract(tokenAddress) + decimals = token.functions.decimals().call() + return decimals + + def erc20ScaleDecimalsStandard(self, tokenAddress, amount): + decimals = self.erc20GetDecimals(tokenAddress) + standardBalance = Decimal(amount) * Decimal(10 ** (-decimals)) + return standardBalance + + def erc20ScaleDecimalsWei(self, tokenAddress, amount): + decimals = self.erc20GetDecimals(tokenAddress) + weiBalance = Decimal(amount) * Decimal(10 ** (decimals)) + return weiBalance + + def erc20GetBalanceStandard(self, tokenAddress, address=None): + if address is None: + address = self.address + token = self.erc20GetContract(tokenAddress) + decimals = self.erc20GetDecimals(tokenAddress) + standardBalance = Decimal(token.functions.balanceOf(address).call()) * Decimal( + 10 ** (-decimals) + ) + return standardBalance + + def erc20GetAllowanceStandard(self, tokenAddress, allowedAddress): + token = self.erc20GetContract(tokenAddress) + decimals = self.erc20GetDecimals(tokenAddress) + standardAllowance = Decimal( + token.functions.allowance(self.address, allowedAddress).call() + ) * Decimal(10 ** (-decimals)) + return standardAllowance + + def erc20BuildFunctionSetAllowance( + self, tokenAddress, allowedAddress, allowance): + token = self.erc20GetContract(tokenAddress) + approveFunction = token.functions.approve(allowedAddress, allowance) + return approveFunction + + def erc20SignAndSendNewAllowance( + self, + tokenAddress, + allowedAddress, + allowance, + gasFactor, + gasSpeed, + nonceOverride=-1, + gasEstimateOverride=-1, + gasPriceGweiOverride=-1, + isAsync=False, + ): + fn = self.erc20BuildFunctionSetAllowance( + tokenAddress, allowedAddress, allowance + ) + tx = self.buildTx( + fn, + gasFactor, + gasSpeed, + nonceOverride, + gasEstimateOverride, + gasPriceGweiOverride, + ) + txHash = self.sendTx(tx, isAsync) + return txHash + + def erc20HasSufficientBalance(self, tokenAddress, amountToUse): + balance = self.erc20GetBalanceStandard(tokenAddress) + + print("Token:", tokenAddress) + print("\tNeed:", float(amountToUse)) + print("\tWallet has:", float(balance)) + + sufficient = float(balance) >= float(amountToUse) + if not sufficient: + self.ERROR("Insufficient Balance!") + else: + print("\tWallet has sufficient balance.") + print() + return sufficient + + def erc20HasSufficientBalances(self, tokens, amounts): + if not len(tokens) == len(amounts): + self.ERROR( + "Array length mismatch with " + + str(len(tokens)) + + " tokens and " + + str(len(amounts)) + + " amounts." + ) + return False + numElements = len(tokens) + sufficientBalance = True + for i in range(numElements): + token = tokens[i] + amount = amounts[i] + currentHasSufficientBalance = self.erc20HasSufficientBalance( + token, amount) + sufficientBalance &= currentHasSufficientBalance + return sufficientBalance + + def erc20HasSufficientAllowance( + self, tokenAddress, allowedAddress, amount): + currentAllowance = self.erc20GetAllowanceStandard( + tokenAddress, allowedAddress) + balance = self.erc20GetBalanceStandard(tokenAddress) + + print("Token:", tokenAddress) + print("\tCurrent Allowance:", currentAllowance) + print("\tCurrent Balance:", balance) + print("\tAmount to Spend:", amount) + + sufficient = currentAllowance >= Decimal(amount) + + if not sufficient: + print("\tInsufficient allowance!") + print("\tWill need to unlock", tokenAddress) + else: + print("\tWallet has sufficient allowance.") + print() + return sufficient + + def erc20EnforceSufficientAllowance( + self, + tokenAddress, + allowedAddress, + targetAllowance, + amount, + gasFactor, + gasSpeed, + nonceOverride, + gasEstimateOverride, + gasPriceGweiOverride, + isAsync, + ): + if not self.erc20HasSufficientAllowance( + tokenAddress, allowedAddress, amount): + if targetAllowance == -1 or targetAllowance == self.INFINITE: + targetAllowance = self.INFINITE + else: + decimals = self.erc20GetDecimals(tokenAddress) + targetAllowance = Decimal( + targetAllowance) * Decimal(10**decimals) + targetAllowance = int(targetAllowance) + print("Insufficient Allowance: Increasing to", targetAllowance) + txHash = self.erc20SignAndSendNewAllowance( + tokenAddress, + allowedAddress, + targetAllowance, + gasFactor, + gasSpeed, + nonceOverride=nonceOverride, + isAsync=isAsync, + gasPriceGweiOverride=gasPriceGweiOverride, + ) + return txHash + return None + + def erc20EnforceSufficientVaultAllowance( + self, + tokenAddress, + targetAllowance, + amount, + gasFactor, + gasSpeed, + nonceOverride=-1, + gasEstimateOverride=-1, + gasPriceGweiOverride=-1, + isAsync=False, + ): + return self.erc20EnforceSufficientAllowance( + tokenAddress, + self.deploymentAddresses["Vault"], + targetAllowance, + amount, + gasFactor, + gasSpeed, + nonceOverride, + gasEstimateOverride, + gasPriceGweiOverride, + isAsync, + ) + + def erc20GetTargetAllowancesFromPoolData(self, poolDescription): + (tokens, checksumTokens) = self.balSortTokens( + list(poolDescription["tokens"].keys()) + ) + allowances = [] + for token in tokens: + targetAllowance = -1 + if "allowance" in poolDescription["tokens"][token].keys(): + targetAllowance = poolDescription["tokens"][token]["allowance"] + if targetAllowance == -1: + targetAllowance = self.INFINITE + allowances.append(targetAllowance) + return (tokens, allowances) + + def erc20AsyncEnforceSufficientVaultAllowances( + self, + tokens, + targetAllowances, + amounts, + gasFactor, + gasSpeed, + nonceOverride=-1, + gasEstimateOverride=-1, + gasPriceGweiOverride=-1, + ): + if not len(tokens) == len(targetAllowances): + self.ERROR( + "Array length mismatch with " + + str(len(tokens)) + + " tokens and " + + str(len(targetAllowances)) + + " targetAllowances." + ) + return False + + nonce = self.web3.eth.get_transaction_count( + self.web3.eth.default_account) + txHashes = [] + numElements = len(tokens) + for i in range(numElements): + token = tokens[i] + targetAllowance = targetAllowances[i] + amount = amounts[i] + txHash = self.erc20EnforceSufficientVaultAllowance( + token, + targetAllowance, + amount, + gasFactor, + gasSpeed, + nonceOverride=nonce, + isAsync=True, + ) + if txHash is not None: + txHashes.append(txHash) + nonce += 1 + + for txHash in txHashes: + self.waitForTx(txHash) + return True + + # ===================== + # ======Etherscan====== + # ===================== + def generateEtherscanApiUrl(self): + etherscanUrl = self.networkParams[self.network]["blockExplorerUrl"] + separator = "." + if self.network in ["kovan", "rinkeby", "goerli", "optimism"]: + separator = "-" + urlFront = "https://api" + separator + etherscanUrl + return urlFront + + def callEtherscan(self, url, maxRetries=3, verbose=False): + urlFront = self.generateEtherscanApiUrl() + url = urlFront + url + self.etherscanApiKey + if verbose: + print("Calling:", url) + + count = 0 + while count < maxRetries: + try: + dt = time.time() - self.lastEtherscanCallTime + if dt < 1.0 / self.etherscanMaxRate: + time.sleep((1.0 / self.etherscanMaxRate - dt) * 1.1) + + # faking a user-agent resolves the 403 (forbidden) errors on + # api-kovan.etherscan.io + headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36", + "Upgrade-Insecure-Requests": "1", + "DNT": "1", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.5", + "Accept-Encoding": "gzip, deflate", + } + r = requests.get(url, headers=headers) + if verbose: + print("\t", r) + self.lastEtherscanCallTime = time.time() + data = r.json() + if verbose: + print("\t", data) + return data + except Exception as e: + print("Exception:", e) + count += 1 + delaySec = 2 + if verbose: + self.WARN( + "Etherscan failed " + + str(count) + + " times. Retrying in " + + str(delaySec) + + " seconds..." + ) + time.sleep(delaySec) + self.ERROR("Etherscan failed " + str(count) + " times.") + return False + + def getGasPriceEtherscanGwei(self, speed, verbose=False): + if speed not in self.etherscanSpeedDict.keys(): + self.ERROR("Speed entered is:" + speed) + self.ERROR("Speed must be one of the following options:") + for s in self.etherscanSpeedDict.keys(): + print("\t" + s) + return False + + urlString = "/api?module=gastracker&action=gasoracle&apikey=" + # + self.etherscanApiKey; + response = self.callEtherscan(urlString, verbose=verbose) + return response["result"][self.etherscanSpeedDict[speed]] + + def getTransactionsByAddress( + self, address, internal=False, startblock=0, verbose=False + ): + if verbose: + print("\tQuerying data after block", startblock) + + internalString = "" + if internal: + internalString = "internal" + + url = [] + url.append( + "/api?module=account&action=txlist{}&address=".format( + internalString) + ) + url.append(address) + url.append( + "&startblock={}&endblock=99999999&sort=asc&apikey=".format( + startblock) + ) + urlString = "".join(url) + txns = self.callEtherscan(urlString, verbose=verbose) + + if int(txns["status"]) == 0: + self.ERROR("Etherscan query failed. Please try again.") + return False + elif int(txns["status"]) == 1: + return txns["result"] + + def getTransactionByHash(self, txHash, verbose=False): + urlString = "/api?module=proxy&action=eth_getTransactionByHash&txhash={}&apikey=".format( + txHash + ) + txns = self.callEtherscan(urlString, verbose=verbose) + + if verbose: + print(txns) + + if txns is False: + return False + return txns + + def isContractVerified(self, poolId, verbose=False): + address = self.balPooldIdToAddress(poolId) + url = "/api?module=contract&action=getabi&address={}&apikey=".format( + address) + results = self.callEtherscan(url, verbose=verbose) + if verbose: + print(results) + isUnverified = results["result"] == "Contract source code not verified" + return not isUnverified + + def getGasPricePolygon(self, speed): + if speed in self.etherscanSpeedDict.keys(): + etherscanGasSpeedNamesToPolygon = { + "slow": "safeLow", + "average": "standard", + "fast": "fast", + } + speed = etherscanGasSpeedNamesToPolygon[speed] + + allowedSpeeds = ["safeLow", "standard", "fast", "fastest"] + if speed not in allowedSpeeds: + self.ERROR("Speed entered is:" + speed) + self.ERROR("Speed must be one of the following options:") + for s in allowedSpeeds: + print("\t" + s) + return False + + r = requests.get("https://gasstation-mainnet.matic.network/") + prices = r.json() + return prices[speed] + + def getGasPrice(self, speed): + allowedSpeeds = list(self.speedDict.keys()) + if speed not in allowedSpeeds: + self.ERROR("Speed entered is:" + speed) + self.ERROR("Speed must be one of the following options:") + for s in allowedSpeeds: + print("\t" + s) + return False + + if not speed == self.currGasPriceSpeed: + self.currGasPriceSpeed = speed + self.web3.eth.set_gas_price_strategy(self.speedDict[speed]) + + gasPrice = self.web3.eth.generate_gas_price() * 1e-9 + return gasPrice + + def balSortTokens(self, tokensIn): + # tokens need to be sorted as lowercase, but if they're provided as checksum, then + # the checksum format strings are still the keys outside of this function, so they + # must be preserved as they're input + lowerTokens = [t.lower() for t in tokensIn] + lowerToOriginal = {} + for i in range(len(tokensIn)): + lowerToOriginal[lowerTokens[i]] = tokensIn[i] + lowerTokens.sort() + + # get checksum tokens, translated sorted lower tokens back to their + # original format + checksumTokens = [ + self.web3.to_checksum_address(t) for t in lowerTokens] + sortedInputTokens = [lowerToOriginal[f] for f in lowerTokens] + + return (sortedInputTokens, checksumTokens) + + def balWeightsEqualOne(self, poolData): + tokenData = poolData["tokens"] + tokens = tokenData.keys() + + weightSum = Decimal(0.0) + for token in tokens: + weightSum += Decimal(tokenData[token]["weight"]) + + weightEqualsOne = weightSum == Decimal(1.0) + if not weightEqualsOne: + self.ERROR( + "Token weights add up to " + + str(weightSum) + + ", but they must add up to 1.0" + ) + self.ERROR( + "If you are passing more than 16 digits of precision, you must pass the value as a string" + ) + return weightEqualsOne + + def balConvertTokensToWei(self, tokens, amounts): + rawTokens = [] + if not len(tokens) == len(amounts): + self.ERROR( + "Array length mismatch with " + + str(len(tokens)) + + " tokens and " + + str(len(amounts)) + + " amounts." + ) + return False + numElements = len(tokens) + for i in range(numElements): + token = tokens[i] + rawValue = amounts[i] + decimals = self.erc20GetDecimals(token) + if rawValue == self.INFINITE or rawValue == self.MAX_UINT_112: + decimals = 0 + raw = int(Decimal(rawValue) * Decimal(10**decimals)) + rawTokens.append(raw) + return rawTokens + + def balConvertWeiToToken(self, token, wei): + decimals = self.erc20GetDecimals(token) + return float(Decimal(wei) / Decimal(10**decimals)) + + def balSetOwner(self, poolData): + owner = self.ZERO_ADDRESS + if "owner" in poolData.keys(): + ownerAddress = poolData["owner"] + if not len(ownerAddress) == 42: + self.ERROR( + 'Entry for "owner" must be a 42 character Ethereum address beginning with "0x"' + ) + return False + owner = self.web3.to_checksum_address(ownerAddress) + return owner + + def generateSalt(self, salt_input=None): + if salt_input is None: + salt_input = random.randint(0, 2**256 - 1) + salt = eth_abi.encode_abi(["uint256"], [int(salt_input)]) + salt_hex = binascii.hexlify(salt) + salt_str = "0x" + salt_hex.decode("ascii") + return salt_str + + def balCreateFnWeightedPoolFactory(self, poolData): + factory = self.balLoadContract("WeightedPoolFactory") + (tokens, checksumTokens) = self.balSortTokens( + list(poolData["tokens"].keys())) + + intWithDecimalsWeights = [ + int(Decimal(poolData["tokens"][t]["weight"]) * Decimal(1e18)) + for t in tokens + ] + swapFeePercentage = int( + Decimal( + poolData["swapFeePercent"]) * + Decimal(1e16)) + rateProviders = [ + self.web3.to_checksum_address( + poolData["tokens"][token]["rateProvider"]) + for token in tokens + ] + + if not self.balWeightsEqualOne(poolData): + return False + + owner = self.balSetOwner(poolData) + + createFunction = factory.functions.create( + poolData["name"], + poolData["symbol"], + checksumTokens, + intWithDecimalsWeights, + rateProviders, + swapFeePercentage, + owner, + self.generateSalt(), + ) + return createFunction + + def balCreateFnLBPoolFactory(self, poolData): + return self.balCreateFnLBPFactory( + poolData, "LiquidityBootstrappingPoolFactory") + + def balCreateFnNoProtocolFeeLiquidityBootstrappingPoolFactory( + self, poolData): + return self.balCreateFnLBPFactory( + poolData, "NoProtocolFeeLiquidityBootstrappingPoolFactory" + ) + + def balCreateFnLBPFactory(self, poolData, factoryName): + factory = self.balLoadContract(factoryName) + (tokens, checksumTokens) = self.balSortTokens( + list(poolData["tokens"].keys())) + + if not self.balWeightsEqualOne(poolData): + return False + + swapFeePercentage = int( + Decimal( + poolData["swapFeePercent"]) * + Decimal(1e16)) + intWithDecimalsWeights = [ + int(Decimal(poolData["tokens"][t]["weight"]) * Decimal(1e18)) + for t in tokens + ] + owner = self.balSetOwner(poolData) + + if not owner == self.address: + self.WARN("!!! You are not the owner for your LBP !!!") + self.WARN("You:\t\t" + self.address) + self.WARN("Pool Owner:\t" + owner) + + print() + self.WARN( + "Only the pool owner can add liquidity. If you do not control " + + owner + + " then you will not be able to add liquidity!" + ) + self.WARN( + "If you DO control " + + owner + + ', you will need to use the "INIT" join type from that address' + ) + cancelTimeSec = 30 + self.WARN( + "If the owner mismatch is was unintentional, you have " + + str(cancelTimeSec) + + " seconds to cancel with Ctrl+C." + ) + time.sleep(cancelTimeSec) + + createFunction = factory.functions.create( + poolData["name"], + poolData["symbol"], + checksumTokens, + intWithDecimalsWeights, + swapFeePercentage, + owner, + poolData["swapEnabledOnStart"], + ) + return createFunction + + def balCreateFnManagedPoolFactory(self, poolData): + self.WARN( + "!!! You are using the Managed Pool Factory without a controller !!!") + self.WARN( + "You are currently using a factory to deploy a managed pool without a factory-provided controller contract." + ) + self.WARN( + "It is highly recommended that you use a factory that pairs a controller with a pool" + ) + self.WARN( + "While this will be a valid pool, the owner will have a dangerous level of power over the pool" + ) + self.WARN( + "It *is* technically possible to add a controller contract as `owner`, but using a factory-paired one provides more guarantees" + ) + + factory = self.balLoadContract("ManagedPoolFactory") + (tokens, checksumTokens) = self.balSortTokens( + list(poolData["tokens"].keys())) + swapFeePercentage = int( + Decimal( + poolData["swapFeePercent"]) * + Decimal(1e16)) + intWithDecimalsWeights = [ + int(Decimal(poolData["tokens"][t]["weight"]) * Decimal(1e18)) + for t in tokens + ] + assetManagers = [poolData["tokens"][t]["assetManager"] for t in tokens] + managementAumFeePercentage = int( + Decimal(poolData["managementAumFeePercentage"]) * Decimal(1e16) + ) + + owner = self.balSetOwner(poolData) + if not owner == self.address: + self.WARN("!!! You are not the owner for your Managed Pool !!!") + self.WARN("You:\t\t" + self.address) + self.WARN("Pool Owner:\t" + owner) + + print() + self.WARN( + "Only the pool owner can call permissioned functions, such as changing weights or the management fee." + ) + self.WARN( + owner + + " should either be you, or a multi-sig or other contract that you control and can call permissioned functions from." + ) + cancelTimeSec = 30 + self.WARN( + "If the owner mismatch is was unintentional, you have " + + str(cancelTimeSec) + + " seconds to cancel with Ctrl+C." + ) + time.sleep(cancelTimeSec) + + createFunction = factory.functions.create( + (poolData["name"], poolData["symbol"], assetManagers), + ( + checksumTokens, + intWithDecimalsWeights, + swapFeePercentage, + poolData["swapEnabledOnStart"], + poolData["mustAllowlistLPs"], + managementAumFeePercentage, + int(poolData["aumFeeId"]), + ), + owner, + self.generateSalt(), + ) + return createFunction + + def balCreateFnComposableStablePoolFactory(self, poolData): + factory = self.balLoadContract("ComposableStablePoolFactory") + (tokens, checksumTokens) = self.balSortTokens( + list(poolData["tokens"].keys())) + swapFeePercentage = int( + Decimal( + poolData["swapFeePercent"]) * + Decimal(1e16)) + owner = self.balSetOwner(poolData) + + rateProviders = [ + self.web3.to_checksum_address( + poolData["tokens"][token]["rateProvider"]) + for token in tokens + ] + tokenRateCacheDurations = [ + int(poolData["tokens"][token]["tokenRateCacheDuration"]) for token in tokens + ] + exemptFromYieldProtocolFeeFlag = poolData["exemptFromYieldProtocolFeeFlag"] + + createFunction = factory.functions.create( + poolData["name"], + poolData["symbol"], + checksumTokens, + int(poolData["amplificationParameter"]), + rateProviders, + tokenRateCacheDurations, + exemptFromYieldProtocolFeeFlag, + swapFeePercentage, + owner, + self.generateSalt(), + ) + return createFunction + + def balCreateFnLinearPoolFactory(self, poolData, factoryName): + factory = self.balLoadContract(factoryName) + (tokens, checksumTokens) = self.balSortTokens( + list(poolData["tokens"].keys())) + swapFeePercentage = int( + Decimal( + poolData["swapFeePercent"]) * + Decimal(1e16)) + owner = self.balSetOwner(poolData) + + mainToken = None + wrappedToken = None + for token in poolData["tokens"].keys(): + if poolData["tokens"][token]["isWrappedToken"]: + wrappedToken = token + else: + mainToken = token + + if mainToken == wrappedToken: + self.ERROR( + "AaveLinearPool must have one wrappedToken and one mainToken. Please check your inputs. Quitting..." + ) + return False + + upperTarget = int(poolData["upperTarget"]) + createFunction = factory.functions.create( + poolData["name"], + poolData["symbol"], + self.web3.to_checksum_address(mainToken), + self.web3.to_checksum_address(wrappedToken), + upperTarget, + swapFeePercentage, + owner, + int(poolData["protocolId"]), + self.generateSalt(), + ) + return createFunction + + def balCreateFnAaveLinearPoolFactory(self, poolData): + return self.balCreateFnLinearPoolFactory( + poolData, "AaveLinearPoolFactory") + + def balCreateFnERC4626LinearPoolFactory(self, poolData): + return self.balCreateFnLinearPoolFactory( + poolData, "ERC4626LinearPoolFactory") + + def balCreatePoolInFactory( + self, + poolDescription, + gasFactor, + gasPriceSpeed, + nonceOverride=-1, + gasEstimateOverride=-1, + gasPriceGweiOverride=-1, + ): + createFunction = None + poolFactoryName = poolDescription["poolType"] + "Factory" + + # list of all supported pool factories + # NOTE: when you add a pool factory to this list, be sure to + # add it to the printout of supported factories below + if poolFactoryName == "WeightedPoolFactory": + createFunction = self.balCreateFnWeightedPoolFactory( + poolDescription) + if poolFactoryName == "ManagedPoolFactory": + createFunction = self.balCreateFnManagedPoolFactory( + poolDescription) + if poolFactoryName == "ComposableStablePoolFactory": + createFunction = self.balCreateFnComposableStablePoolFactory( + poolDescription + ) + if poolFactoryName == "AaveLinearPoolFactory": + createFunction = self.balCreateFnAaveLinearPoolFactory( + poolDescription) + if poolFactoryName == "ERC4626LinearPoolFactory": + createFunction = self.balCreateFnERC4626LinearPoolFactory( + poolDescription) + if poolFactoryName == "NoProtocolFeeLiquidityBootstrappingPoolFactory": + createFunction = ( + self.balCreateFnNoProtocolFeeLiquidityBootstrappingPoolFactory( + poolDescription + ) + ) + if createFunction is None: + print("No pool factory found with name:", poolFactoryName) + print("Supported pool types are:") + print("\tWeightedPool") + print("\tManagedPool") + print("\tComposableStablePoolFactory") + print("\tAaveLinearPool") + print("\tERC4626LinearPoolFactory") + print("\tNoProtocolFeeLiquidityBootstrappingPoolFactory") + return False + + if not createFunction: + self.ERROR("Pool creation failed.") + return False + print("Pool function created, generating transaction...") + tx = self.buildTx( + createFunction, + gasFactor, + gasPriceSpeed, + nonceOverride, + gasEstimateOverride, + gasPriceGweiOverride, + ) + print("Transaction Generated!") + txHash = self.sendTx(tx) + return txHash + + def balGetPoolIdFromHash(self, txHash): + receipt = self.getTxReceipt(txHash, delay=2, maxRetries=5) + + # PoolRegistered event lives in the Vault + vault = self.balLoadContract("Vault") + + with Suppressor(): + logs = vault.events.PoolRegistered().processReceipt(receipt) + poolId = logs[0]["args"]["poolId"].hex() + + print("Your pool ID is:") + print("\t0x" + str(poolId)) + return poolId + + def balFindPoolFactory(self, poolId): + contractNames = self.deploymentAddresses.keys() + factoryNames = [ + c for c in contractNames if ( + "Factory" in c) and ( + "Pool" in c)] + # can't simply use "PoolFactory" b/c of WeightedPool2TokensFactory + + self.mc.reset() + for factoryName in factoryNames: + factory = self.balLoadContract(factoryName) + poolAddress = self.balPooldIdToAddress(poolId) + self.mc.addCall( + factory.address, factory.abi, "isPoolFromFactory", args=[poolAddress] + ) + data = self.mc.execute() + + foundFactoryName = [] + numFound = 0 + for f, d in zip(factoryNames, data[0]): + if d[0]: + foundFactoryName.append(f) + numFound += 1 + + if numFound == 1: + return foundFactoryName[0] + else: + self.ERROR("Was expecting 1 factory, got " + str(numFound)) + self.ERROR(",".join(foundFactoryName)) + self.ERROR( + "Checked the following factories:\n\t\t" + + "\n\t\t".join(factoryNames) + ) + return None + + def balGetJoinKindEnum(self, poolId, joinKind): + factoryName = self.balFindPoolFactory(poolId) + + usingWeighted = factoryName in [ + "WeightedPoolFactory", + "NoProtocolFeeLiquidityBootstrappingPoolFactory", + "ManagedPoolFactory", + ] + usingComposableStable = factoryName in ["ComposableStablePoolFactory"] + + if usingWeighted: + joinKindEnum = WeightedPoolJoinKind[joinKind] + elif usingComposableStable: + joinKindEnum = StablePhantomPoolJoinKind[joinKind] + else: + self.ERROR( + "PoolType " + + str(factoryName) + + " not supported for JoinKind: " + + joinKind + ) + return None + return joinKindEnum + + def balGetTokensAndAmounts(self, joinDescription): + (sortedTokens, checksumTokens) = self.balSortTokens( + list(joinDescription["tokens"].keys()) + ) + amountKey = "amount" + if ( + amountKey + not in joinDescription["tokens"][ + list(joinDescription["tokens"].keys())[0] + ].keys() + ): + amountKey = "initialBalance" + amountsBySortedTokens = [ + joinDescription["tokens"][token][amountKey] for token in sortedTokens + ] + maxAmountsIn = self.balConvertTokensToWei( + sortedTokens, amountsBySortedTokens) + return (checksumTokens, maxAmountsIn) + + def balGetTokensAndAmountsComposable(self, joinDescription): + (checksumTokens, maxAmountsIn) = self.balGetTokensAndAmounts(joinDescription) + + poolAddress = self.balPooldIdToAddress(joinDescription["poolId"]) + poolAddress = self.web3.to_checksum_address(poolAddress) + + composableAmount = None + + userDataMaxAmountIn = copy.deepcopy(maxAmountsIn) + + for i in range(len(checksumTokens)): + if checksumTokens[i] == poolAddress: + composableAmount = maxAmountsIn[i] + del checksumTokens[i] + del maxAmountsIn[i] + del userDataMaxAmountIn[i] + break + + checksumTokens.insert(0, poolAddress) + maxAmountsIn.insert(0, composableAmount) + + return (checksumTokens, maxAmountsIn, userDataMaxAmountIn) + + def balDoJoinPool( + self, + poolId, + address, + joinPoolRequestTuple, + gasFactor=1.05, + gasPriceSpeed="average", + nonceOverride=-1, + gasEstimateOverride=-1, + gasPriceGweiOverride=-1, + ): + vault = self.balLoadContract("Vault") + joinPoolFunction = vault.functions.joinPool( + poolId, address, address, joinPoolRequestTuple + ) + tx = self.buildTx( + joinPoolFunction, + gasFactor, + gasPriceSpeed, + nonceOverride, + gasEstimateOverride, + gasPriceGweiOverride, + ) + print("Transaction Generated!") + txHash = self.sendTx(tx) + return txHash + + def balDoQueryJoinPool(self, poolId, address, joinPoolRequestTuple): + bh = self.balLoadContract("BalancerHelpers") + (bptOut, amountsIn) = bh.functions.queryJoin( + poolId, address, address, joinPoolRequestTuple + ).call() + return (bptOut, amountsIn) + + def balFormatJoinPoolInit(self, joinDescription): + (checksumTokens, maxAmountsIn) = self.balGetTokensAndAmounts( + copy.deepcopy(joinDescription) + ) + + poolId = joinDescription["poolId"] + factory = self.balFindPoolFactory(poolId) + + userDataMaxAmountsIn = maxAmountsIn + if factory in ["ManagedPoolFactory"]: + ( + checksumTokens, + maxAmountsIn, + userDataMaxAmountsIn, + ) = self.balGetTokensAndAmountsComposable(copy.deepcopy(joinDescription)) + + joinKindEnum = self.balGetJoinKindEnum( + poolId, joinDescription["joinKind"]) + userDataEncoded = eth_abi.encode_abi( + ["uint256", "uint256[]"], [int(joinKindEnum), userDataMaxAmountsIn] + ) + address = self.web3.to_checksum_address(self.web3.eth.default_account) + joinPoolRequestTuple = ( + checksumTokens, + maxAmountsIn, + userDataEncoded.hex(), + joinDescription["fromInternalBalance"], + ) + return (poolId, address, joinPoolRequestTuple) + + def balFormatJoinPoolExactTokensInForBptOut(self, joinDescription): + (checksumTokens, maxAmountsIn) = self.balGetTokensAndAmounts( + copy.deepcopy(joinDescription) + ) + poolId = joinDescription["poolId"] + joinKindEnum = self.balGetJoinKindEnum( + poolId, joinDescription["joinKind"]) + userDataEncoded = eth_abi.encode_abi( + ["uint256", "uint256[]"], [int(joinKindEnum), maxAmountsIn] + ) + address = self.web3.to_checksum_address(self.web3.eth.default_account) + joinPoolRequestTuple = ( + checksumTokens, + maxAmountsIn, + userDataEncoded.hex(), + joinDescription["fromInternalBalance"], + ) + return (poolId, address, joinPoolRequestTuple) + + def balFormatJoinPoolAllTokensInForExactBptOut(self, joinDescription): + (checksumTokens, maxAmountsIn) = self.balGetTokensAndAmounts( + copy.deepcopy(joinDescription) + ) + poolId = joinDescription["poolId"] + poolAddress = self.balPooldIdToAddress(poolId) + bptAmountOut = self.balConvertTokensToWei( + [poolAddress], [joinDescription["bptAmountOut"]] + )[0] + + joinKindEnum = self.balGetJoinKindEnum( + poolId, joinDescription["joinKind"]) + userDataEncoded = eth_abi.encode_abi( + ["uint256", "uint256"], [int(joinKindEnum), bptAmountOut] + ) + address = self.web3.to_checksum_address(self.web3.eth.default_account) + joinPoolRequestTuple = ( + checksumTokens, + maxAmountsIn, + userDataEncoded.hex(), + joinDescription["fromInternalBalance"], + ) + return (poolId, address, joinPoolRequestTuple) + + def balFormatJoinPoolTokenInForExactBptOut(self, joinDescription): + (checksumTokens, maxAmountsIn) = self.balGetTokensAndAmounts( + copy.deepcopy(joinDescription) + ) + + index = -1 + counter = -1 + for amt in maxAmountsIn: + counter += 1 + if amt > 0: + if index == -1: + index = counter + else: + self.ERROR( + "Multiple tokens have amounts for a single token join! Only one token can have a non-zero amount!" + ) + return False + if index == -1: + self.ERROR( + "No tokens have amounts. You must have one token with a non-zero amount!" + ) + return False + + poolId = joinDescription["poolId"] + poolAddress = self.balPooldIdToAddress(poolId) + bptAmountOut = self.balConvertTokensToWei( + [poolAddress], [joinDescription["bptAmountOut"]] + )[0] + + joinKindEnum = self.balGetJoinKindEnum( + poolId, joinDescription["joinKind"]) + userDataEncoded = eth_abi.encode_abi( + ["uint256", "uint256", "uint256"], [ + int(joinKindEnum), bptAmountOut, index] + ) + + address = self.web3.to_checksum_address(self.web3.eth.default_account) + joinPoolRequestTuple = ( + checksumTokens, + maxAmountsIn, + userDataEncoded.hex(), + joinDescription["fromInternalBalance"], + ) + + return (poolId, address, joinPoolRequestTuple) + + def balJoinPool( + self, + joinDescription, + query=False, + gasFactor=1.05, + gasPriceSpeed="average", + nonceOverride=-1, + gasEstimateOverride=-1, + gasPriceGweiOverride=-1, + ): + joinKind = joinDescription["joinKind"] + poolId = None + address = None + joinPoolRequestTuple = None + + if joinKind == "INIT": + (poolId, address, joinPoolRequestTuple) = self.balFormatJoinPoolInit( + joinDescription + ) + elif joinKind == "EXACT_TOKENS_IN_FOR_BPT_OUT": + ( + poolId, + address, + joinPoolRequestTuple, + ) = self.balFormatJoinPoolExactTokensInForBptOut(joinDescription) + elif joinKind == "TOKEN_IN_FOR_EXACT_BPT_OUT": + tempJoinDescription = copy.deepcopy(joinDescription) + if query: + for token in tempJoinDescription["tokens"].keys(): + if tempJoinDescription["tokens"][token]["amount"] == 0.0: + tempJoinDescription["tokens"][token]["amount"] = self.INFINITE + ( + poolId, + address, + joinPoolRequestTuple, + ) = self.balFormatJoinPoolTokenInForExactBptOut(tempJoinDescription) + elif joinKind == "ALL_TOKENS_IN_FOR_EXACT_BPT_OUT": + tempJoinDescription = copy.deepcopy(joinDescription) + if query: + for token in tempJoinDescription["tokens"].keys(): + tempJoinDescription["tokens"][token]["amount"] = self.INFINITE + ( + poolId, + address, + joinPoolRequestTuple, + ) = self.balFormatJoinPoolAllTokensInForExactBptOut(tempJoinDescription) + print((poolId, address, joinPoolRequestTuple)) + + if query: + (bptOut, amountsIn) = self.balDoQueryJoinPool( + poolId, address, joinPoolRequestTuple + ) + bptAddress = self.balPooldIdToAddress(poolId) + outputData = {} + outputData["bptOut"] = { + "token": bptAddress, + "decimals": self.erc20GetDecimals(bptAddress), + "amount": bptOut, + } + outputData["amountsIn"] = {} + for token, amount in zip(joinPoolRequestTuple[0], amountsIn): + outputData["amountsIn"][token] = { + "token": token, + "decimals": self.erc20GetDecimals(token), + "amount": amount, + } + return outputData + else: + txHash = self.balDoJoinPool( + poolId, + address, + joinPoolRequestTuple, + gasFactor=gasFactor, + gasPriceSpeed=gasPriceSpeed, + nonceOverride=nonceOverride, + gasEstimateOverride=gasEstimateOverride, + gasPriceGweiOverride=gasPriceGweiOverride, + ) + return txHash + + def balRegisterPoolWithVault( + self, + poolDescription, + poolId, + gasFactor=1.05, + gasPriceSpeed="average", + nonceOverride=-1, + gasEstimateOverride=-1, + gasPriceGweiOverride=-1, + ): + self.WARN( + '"balRegisterPoolWithVault" is deprecated. Please use "balJoinPoolInit".' + ) + self.balJoinPoolInit( + poolDescription, + poolId, + gasFactor, + gasPriceSpeed, + nonceOverride, + gasEstimateOverride, + gasPriceGweiOverride, + ) + + def balJoinPoolInit( + self, + poolDescription, + poolId, + gasFactor=1.05, + gasPriceSpeed="average", + nonceOverride=-1, + gasEstimateOverride=-1, + gasPriceGweiOverride=-1, + ): + if poolDescription["poolType"] in [ + "AaveLinearPool", "ERC4626LinearPool"]: + slippageTolerancePercent = 1 + txHash = self.balLinearPoolInitJoin( + poolDescription, + poolId, + slippageTolerancePercent=slippageTolerancePercent, + gasFactor=gasFactor, + gasPriceSpeed=gasPriceSpeed, + nonceOverride=nonceOverride, + gasEstimateOverride=gasEstimateOverride, + gasPriceGweiOverride=gasPriceGweiOverride, + ) + return txHash + + # StablePhantomPools need their own BPT as one of the provided tokens + # with a limit of MAX_UINT_112 + if poolDescription["poolType"] in [ + "StablePhantomPool", + "ComposableStablePool", + "ManagedPool", + ]: + initialBalancesNoBpt = [ + poolDescription["tokens"][token]["initialBalance"] + for token in poolDescription["tokens"].keys() + ] + print(f"Currently unused : {initialBalancesNoBpt}") + phantomBptAddress = self.balPooldIdToAddress(poolId) + poolDescription["tokens"][phantomBptAddress] = { + "initialBalance": self.MAX_UINT_112 + } + + poolDescription["joinKind"] = "INIT" + return self.balJoinPool( + poolDescription, + False, + gasFactor, + gasPriceSpeed, + nonceOverride, + gasEstimateOverride, + gasPriceGweiOverride, + ) + + def balLinearPoolInitJoin( + self, + poolDescription, + poolId, + slippageTolerancePercent=1, + gasFactor=1.05, + gasPriceSpeed="average", + nonceOverride=-1, + gasEstimateOverride=-1, + gasPriceGweiOverride=-1, + ): + phantomBptAddress = self.balPooldIdToAddress(poolId) + + batchSwap = {} + batchSwap["kind"] = 0 + batchSwap["assets"] = list(poolDescription["tokens"].keys()) + batchSwap["swaps"] = [] + + numTokens = len(batchSwap["assets"]) + for i in range(numTokens): + token = batchSwap["assets"][i] + swap = {} + swap["poolId"] = "0x" + poolId + swap["assetInIndex"] = i + swap["assetOutIndex"] = numTokens + swap["amount"] = poolDescription["tokens"][token]["initialBalance"] + if float(swap["amount"]) > 0.0: + batchSwap["swaps"].append(swap) + + # add the phantomBpt to the assets/limits list now that we've crafted + # the swap steps + batchSwap["assets"].append(phantomBptAddress) + batchSwap["limits"] = [0] * len(batchSwap["assets"]) + # for now + + batchSwap["funds"] = {} + batchSwap["funds"]["sender"] = self.address + batchSwap["funds"]["recipient"] = self.address + batchSwap["funds"]["fromInternalBalance"] = False + batchSwap["funds"]["toInternalBalance"] = False + batchSwap["deadline"] = "999999999999999999" + + estimates = self.balQueryBatchSwap(batchSwap) + + checksumTokens = [self.web3.to_checksum_address( + t) for t in batchSwap["assets"]] + for i in range(len(batchSwap["assets"])): + asset = checksumTokens[i] + slippageToleranceFactor = slippageTolerancePercent / 100.0 + if estimates[asset] < 0: + slippageToleranceFactor *= -1.0 + batchSwap["limits"][i] = estimates[asset] * \ + (1.0 + slippageToleranceFactor) + + txHash = self.balDoBatchSwap( + batchSwap, + isAsync=False, + gasFactor=gasFactor, + gasPriceSpeed=gasPriceSpeed, + nonceOverride=nonceOverride, + gasEstimateOverride=gasEstimateOverride, + gasPriceGweiOverride=gasPriceGweiOverride, + ) + return txHash + + def balDoQueryExitPool(self, poolId, address, exitPoolRequestTuple): + bh = self.balLoadContract("BalancerHelpers") + return bh.functions.queryExit( + poolId, address, address, exitPoolRequestTuple + ).call() + + def balFormatQueryExitPoolOutput( + self, queryExitPoolOutput, tokens, poolAddress): + result = {} + bptAmountIn, tokensAmountsOut = queryExitPoolOutput + result["bptIn"] = { + "address": poolAddress, + "amount": self.balConvertWeiToToken(poolAddress, bptAmountIn), + } + result["tokensOut"] = [] + for address, amount in zip(tokens, tokensAmountsOut): + result["tokensOut"].append( + { + "address": address, + "amount": self.balConvertWeiToToken(address, amount), } - result["tokensOut"] = [] - for address, amount in zip(tokens, tokensAmountsOut): - result["tokensOut"].append({ - "address": address, - "amount": self.balConvertWeiToToken(address, amount) - }) - return result - - def balDoExitPool(self, poolId, address, exitPoolRequestTuple, gasFactor=1.05, gasPriceSpeed="average", nonceOverride=-1, gasEstimateOverride=-1, gasPriceGweiOverride=-1): - vault = self.balLoadContract("Vault") - exitPoolFunction = vault.functions.exitPool( - poolId, address, address, exitPoolRequestTuple) - tx = self.buildTx(exitPoolFunction, gasFactor, gasPriceSpeed, - nonceOverride, gasEstimateOverride, gasPriceGweiOverride) - return self.sendTx(tx) - - def balFormatExitPoolRequestTupleExactBptInForOneTokenOut(self, exitKindValue, tokens, bptAmount, tokenOut, minAmountsOut, toInternalBalance=False): - minAmountsOut = self.balConvertTokensToWei(tokens, minAmountsOut) - userData = eth_abi.encode_abi(["uint256", "uint256", "uint256"], [ - exitKindValue, bptAmount, tokenOut]) - return tokens, minAmountsOut, userData, toInternalBalance - - def balFormatExitPoolRequestTupleExactBptInForTokensOut(self, exitKindValue, tokens, bptAmount, minAmountsOut, toInternalBalance=False): - minAmountsOut = self.balConvertTokensToWei(tokens, minAmountsOut) - userData = eth_abi.encode_abi(["uint256", "uint256"], [ - exitKindValue, bptAmount]) - return tokens, minAmountsOut, userData, toInternalBalance - - - def balFormatExitPoolRequestTupleBptInForExactTokensOut(self, exitKindValue, tokens, maxBptAmount, amountsOut, minAmountsOut, toInternalBalance=False): - amountsOut = self.balConvertTokensToWei(tokens, amountsOut) - minAmountsOut = self.balConvertTokensToWei(tokens, minAmountsOut) - userData = eth_abi.encode_abi(["uint256", "uint256[]", "uint256"], [ - exitKindValue, amountsOut, maxBptAmount]) - return tokens, minAmountsOut, userData, toInternalBalance - - - def balSortTokensExitPool(self, tokens): - tokenKeys = tokens.keys() # the token key is the address string - tokenAddresses = [] - for tokenKey in tokenKeys: - tokenAddresses.append(self.web3.toChecksumAddress(tokenKey)) - minAmountsOutSorted = [] - tokenAddressesSorted = [] - amountsOutSorted = [] - - for tokenAddresses, tokenKey in sorted(zip(tokenAddresses, tokenKeys)): - tokenAddressesSorted.append(tokenAddresses) - minAmountsOutSorted.append(float(tokens[tokenKey].get("minAmount", 0))) - amountsOutSorted.append(float(tokens[tokenKey].get("amount", 0))) - - tokenOutSorted = None - if max(amountsOutSorted)==sum(amountsOutSorted): - tokenOutSorted = amountsOutSorted.index(max(amountsOutSorted)) - return tokenAddressesSorted, amountsOutSorted, minAmountsOutSorted, tokenOutSorted - - - def balExitPool(self, exitDescription, query=False, gasFactor=1.05, gasPriceSpeed="average", nonceOverride=-1, gasEstimateOverride=-1, gasPriceGweiOverride=-1): - exitKind = exitDescription["exitKind"] - poolId = exitDescription["poolId"] - tokens = exitDescription["tokens"] - toInternalBalance = exitDescription.get("toInternalBalance", False) - - poolAddress = self.balPooldIdToAddress(poolId) - exitKindValue = WeightedPoolExitKind[exitKind].value - userAddress = self.web3.toChecksumAddress(self.web3.eth.default_account) - tokenAddresses, amountsOut, minAmountsOut, tokenOut = self.balSortTokensExitPool(tokens) - - if exitKind == "EXACT_BPT_IN_FOR_ONE_TOKEN_OUT": - bptAmount = self.balConvertTokensToWei([poolAddress], [float(exitDescription["bptAmount"])])[0] - exitPoolRequestTuple = self.balFormatExitPoolRequestTupleExactBptInForOneTokenOut( - exitKindValue, tokenAddresses, bptAmount, tokenOut, minAmountsOut, toInternalBalance) - elif exitKind == "EXACT_BPT_IN_FOR_TOKENS_OUT": - bptAmount = self.balConvertTokensToWei([poolAddress], [float(exitDescription["bptAmount"])])[0] - exitPoolRequestTuple = self.balFormatExitPoolRequestTupleExactBptInForTokensOut( - exitKindValue, tokenAddresses, bptAmount, minAmountsOut, toInternalBalance) - elif exitKind == "BPT_IN_FOR_EXACT_TOKENS_OUT": - maxBptAmount = self.balConvertTokensToWei([poolAddress], [float(exitDescription["maxBptAmount"])])[0] - if query: - maxBptAmount = self.balConvertTokensToWei([poolAddress], [self.INFINITE])[0] - exitPoolRequestTuple = self.balFormatExitPoolRequestTupleBptInForExactTokensOut( - exitKindValue, tokenAddresses, maxBptAmount, amountsOut, minAmountsOut, toInternalBalance) - - if query: - tokensSorted = exitPoolRequestTuple[0] - queryOutput = self.balDoQueryExitPool( - poolId, userAddress, exitPoolRequestTuple) - return self.balFormatQueryExitPoolOutput(queryOutput, tokensSorted, poolAddress) - return self.balDoExitPool(poolId, userAddress, exitPoolRequestTuple, gasFactor=gasFactor, gasPriceSpeed=gasPriceSpeed, nonceOverride=nonceOverride, gasEstimateOverride=gasEstimateOverride, gasPriceGweiOverride=gasPriceGweiOverride) - - def balGetRebalanceLinearPoolsData(self, linearPoolAddresses): - # Can realistically be any linear pool, this one just is the most generic. - poolAbi = self.balPoolGetAbi("ERC4626LinearPool"); - - # get poolIds and mainTokens to feed into getPoolTokenInfo (to get asset managers) - for i in linearPoolAddresses: - self.mc.addCall(i, poolAbi, 'getPoolId'); - self.mc.addCall(i, poolAbi, 'getMainToken'); - output = self.mc.execute(); - - pool_id_by_pool_address = {}; - main_tokens_by_pool_id = {}; - for i in range(0, len(output[0]), 2): - poolIdSuccess = output[1][i]; - mainTokenSuccess = output[1][i + 1]; - if poolIdSuccess and mainTokenSuccess: - poolId = "0x" + output[0][i][0].hex(); - mainToken = self.web3.toChecksumAddress(output[0][i + 1][0]); - main_tokens_by_pool_id[poolId] = mainToken; - pool_id_by_pool_address[linearPoolAddresses[int(i/2)]] = poolId; - - self.multiCallErc20BatchDecimals(list(main_tokens_by_pool_id.values())); - - # determine each linear pool's asset manager (the rebalancer) - vault = self.balLoadContract("Vault"); - assetManagers = []; - for poolId in main_tokens_by_pool_id: - mainToken = main_tokens_by_pool_id[poolId]; - self.mc.addCall(vault.address, vault.abi, 'getPoolTokenInfo', args=[poolId, mainToken]); - output = self.mc.execute(); - data = output[0] - successes = output[1] - - pools_by_rebalancer = {}; - for d, a in zip(data, linearPoolAddresses): - pools_by_rebalancer[self.web3.toChecksumAddress(d[3])] = a; - - for rebalancer in pools_by_rebalancer: - pool_address = pools_by_rebalancer[rebalancer]; - - linearPoolRebalancer = self.balLoadContractAtAddress("ERC4626LinearPoolRebalancer", rebalancer); - self.mc.addCall(linearPoolRebalancer.address, linearPoolRebalancer.abi, 'rebalance', args=[self.ZERO_ADDRESS]); - - mc_output = self.mc.execute(); - results = mc_output[0]; - successes = mc_output[1]; - output = {}; - for result, success, rebalancer in zip(results, successes, list(pools_by_rebalancer.keys())): - if success and not result is None and result[0] > 0: - amount = result[0]; - token = main_tokens_by_pool_id[pool_id_by_pool_address[pools_by_rebalancer[rebalancer]]]; - linearPoolRebalancer = self.balLoadContractAtAddress("ERC4626LinearPoolRebalancer", rebalancer); - - output[rebalancer] = { - "token_out":token, - "amount_out":float(self.erc20ScaleDecimalsStandard(token, amount)), - "gas_estimate":linearPoolRebalancer.functions.rebalance(self.address).estimateGas() - } - return(output); - - def balDoRebalanceLinearPool(self, pool_address, recipient=None, isAsync=False, gasFactor=1.05, gasPriceSpeed="average", nonceOverride=-1, gasEstimateOverride=-1, gasPriceGweiOverride=-1): - linear_pool = self.balLoadContractAtAddress("ERC4626LinearPool", self.web3.toChecksumAddress(pool_address)); - pool_id = linear_pool.functions.getPoolId().call(); - main_token = linear_pool.functions.getMainToken().call(); - - vault = self.balLoadContract("Vault"); - pool_token_info = vault.functions.getPoolTokenInfo(pool_id, main_token).call(); - rebalancer = self.web3.toChecksumAddress(pool_token_info[3]); - - linear_pool_rebalancer = self.balLoadContractAtAddress("ERC4626LinearPoolRebalancer", rebalancer); - if recipient is None: - recipient = self.address; - fn = linear_pool_rebalancer.functions.rebalance(recipient); - tx = self.buildTx(fn, gasFactor, gasPriceSpeed, nonceOverride, gasEstimateOverride, gasPriceGweiOverride); - tx_hash = self.sendTx(tx, isAsync); - return(txHash); - - def balVaultWeth(self): - vault = self.balLoadContract("Vault"); - wethAddress = vault.functions.WETH().call(); - return(wethAddress); - - def balVaultGetAuthorizer(self): - vault = self.balLoadContract("Vault") - authorizerAddress = vault.functions.getAuthorizer().call() - return authorizerAddress - - def balBalancerHelpersGetVault(self): - bh = self.balLoadContract("BalancerHelpers"); - vaultAddress = bh.functions.vault().call(); - return(vaultAddress); - - def balVaultGetPoolTokens(self, poolId): - vault = self.balLoadContract("Vault"); - output = vault.functions.getPoolTokens(poolId).call(); - tokens = output[0]; - balances = output[1]; - lastChangeBlock = output[2]; - return (tokens, balances, lastChangeBlock); - - def balVaultGetInternalBalance(self, tokens, address=None): - if address is None: - address = self.web3.eth.default_account; - - vault = self.balLoadContract("Vault"); - (sortedTokens, checksumTokens) = self.balSortTokens(tokens); - balances = vault.functions.getInternalBalance(address, checksumTokens).call(); - numElements = len(sortedTokens); - internalBalances = {}; - for i in range(numElements): - token = checksumTokens[i]; - decimals = self.erc20GetDecimals(token); - internalBalances[token] = Decimal(balances[i]) * Decimal(10**(-decimals)); - return(internalBalances); - - def balVaultGetPool(self, poolId): - vault = self.balLoadContract("Vault") - address, specialization = vault.functions.getPool(poolId).call() - return address, specialization - - def balVaultGetPoolTokenInfo(self, poolId, tokenAddress): - vault = self.balLoadContract("Vault") - tokenAddress = self.web3.toChecksumAddress(tokenAddress) - tokenInfo = vault.functions.getPoolTokenInfo(poolId, tokenAddress).call() - cash, managed, lastChangeBlock, assetManager = tokenInfo - return cash, managed, lastChangeBlock, assetManager - - def balVaultGetProtocolFeesCollector(self): - vault = self.balLoadContract("Vault") - address = vault.functions.getProtocolFeesCollector().call() - return address - - def balVaultHasApprovedRelayer(self, userAddress, relayerAddress): - vault = self.balLoadContract("Vault") - hasApprovedRelayer = vault.functions.hasApprovedRelayer( - userAddress, relayerAddress).call() - return hasApprovedRelayer - - def balVaultSetAuthorizer(self, newAuthorizerAddress, isAsync=False, gasFactor=1.05, gasPriceSpeed="average", nonceOverride=-1, gasEstimateOverride=-1, gasPriceGweiOverride=-1): - vault = self.balLoadContract("Vault") - setAuthorizerFn = vault.functions.newAuthorizer(newAuthorizerAddress) - tx = self.buildTx(setAuthorizerFn, gasFactor, gasPriceSpeed, nonceOverride, gasEstimateOverride, gasPriceGweiOverride); - return self.sendTx(tx, isAsync) - - def balVaultSetPaused(self, paused, isAsync=False, gasFactor=1.05, gasPriceSpeed="average", nonceOverride=-1, gasEstimateOverride=-1, gasPriceGweiOverride=-1): - vault = self.balLoadContract("Vault") - setPausedFn = vault.functions.setPaused(paused) - tx = self.buildTx(setPausedFn, gasFactor, gasPriceSpeed, nonceOverride, gasEstimateOverride, gasPriceGweiOverride); - return self.sendTx(tx, isAsync) - - def balVaultSetRelayerApproval(self, senderAddress, relayerAddress, approved, isAsync=False, gasFactor=1.05, gasPriceSpeed="average", nonceOverride=-1, gasEstimateOverride=-1, gasPriceGweiOverride=-1): - vault = self.balLoadContract("Vault") - setRelayerApprovalFn = vault.functions.setRelayerApproval( - senderAddress, relayerAddress, approved) - tx = self.buildTx(setRelayerApprovalFn, gasFactor, gasPriceSpeed, nonceOverride, gasEstimateOverride, gasPriceGweiOverride); - return self.sendTx(tx, isAsync) - - def balVaultDoManageUserBalance(self, kind, token, amount, sender, recipient, isAsync=False, gasFactor=1.05, gasPriceSpeed="average", nonceOverride=-1, gasEstimateOverride=-1, gasPriceGweiOverride=-1): - if self.verbose: - print("Managing User Balance"); - print("\tKind:\t\t", self.inverseUserBalanceOpKind[kind]); - print("\tToken:\t\t", str(token)); - print("\tAmount:\t\t", str(amount)); - print("\tSender:\t\t", str(sender)); - print("\tRecipient:\t", str(recipient)); - manageUserBalanceFn = self.balVaultBuildManageUserBalanceFn(kind, token, amount, sender, recipient); - - print(); - print("Building ManageUserBalance"); - tx = self.buildTx(manageUserBalanceFn, gasFactor, gasPriceSpeed, nonceOverride, gasEstimateOverride, gasPriceGweiOverride); - txHash = self.sendTx(tx, isAsync); - return(txHash); - - def balVaultBuildManageUserBalanceFn(self, kind, token, amount, sender, recipient): - kind = kind; - asset = self.web3.toChecksumAddress(token); - amount = self.balConvertTokensToWei([token],[amount])[0]; - sender = self.web3.toChecksumAddress(sender); - recipient = self.web3.toChecksumAddress(recipient); - inputTupleList = [(kind, asset, amount, sender, recipient)]; - - vault = self.balLoadContract("Vault"); - manageUserBalanceFn = vault.functions.manageUserBalance(inputTupleList); - return(manageUserBalanceFn); - - @cache - def balLoadContract(self, contractName): - contract = self.web3.eth.contract(address=self.deploymentAddresses[contractName], abi=self.abis[contractName]); - return(contract) - - @cache - def balLoadContractAtAddress(self, contractName, address): - contract = self.web3.eth.contract(address=address, abi=self.abis[contractName]); - return(contract) - - @cache - def balLoadArbitraryContract(self, address, abi): - contract = self.web3.eth.contract(address=address, abi=self.mc.stringToList(abi)); - return(contract); - - @cache - def balPoolGetAbi(self, poolType): - - if poolType == "HighAmpComposableStable": - poolType = "ComposableStable"; - - if not "Pool" in poolType: - poolType = poolType + "Pool" - - deploymentFolder = None; - deprecatedString = "" - try: - deploymentFolder = self.contractDirectories[poolType + "Factory"]; - except KeyError: - try: - deploymentFolder = self.deprecatedContractDirectories[poolType + "Factory"]; - deprecatedString = "deprecated" - except KeyError: - return None; - except Exception as e: - print(e); - quit(); - - abiPath = os.path.join(self.deploymentsDir, deprecatedString, deploymentFolder, "artifact", poolType + ".json"); - f = pkgutil.get_data(__name__, abiPath).decode(); - poolAbi = json.loads(f)["abi"]; - return(poolAbi); - - @cache - def balPooldIdToAddress(self, poolId): - if not "0x" in poolId: - poolId = "0x" + poolId; - poolAddress = self.web3.toChecksumAddress(poolId[:42]); - return(poolAddress); - - def balGetPoolCreationData(self, poolId, verbose=False, inputHash=None): - address = self.balPooldIdToAddress(poolId); - if inputHash is None: - txns = self.getTransactionsByAddress(address, internal=True, verbose=verbose); - else: - txns = self.getTransactionByHash(inputHash, verbose=verbose); - - poolTypeByContract = {}; - for poolType in self.deploymentAddresses.keys(): - deploymentAddress = self.deploymentAddresses[poolType].lower(); - poolTypeByContract[deploymentAddress] = poolType; - - poolFactoryType = None; - if inputHash is None: - for txn in txns: - if txn["from"].lower() in poolTypeByContract.keys(): - poolFactoryType = poolTypeByContract[txn["from"].lower()]; - txHash = txn["hash"]; - stamp = txn["timeStamp"]; - break; - else: - txn = txns["result"]; - if verbose: - print(); - print(txn); - poolFactoryType = poolTypeByContract[txn["to"].lower()]; - txHash = txn["hash"]; - stamp = self.web3.eth.get_block(int(txn["blockNumber"],16))["timestamp"]; - - return(address, poolFactoryType, txHash, stamp); - - def balGetPoolFactoryCreationTime(self, address): - txns = self.getTransactionsByAddress(address); - return(txns[0]["timeStamp"]); - - def getInputData(self, txHash): - transaction = self.web3.eth.get_transaction(txHash); - return(transaction.input) - - def balGeneratePoolCreationArguments(self, poolId, verbose=False, creationHash=None): - if self.network in ["arbitrum"]: - self.ERROR("Automated pool verification doesn't work on " + self.network + " yet. Please try the method outlined in the docs using Tenderly."); - return(False); - - # query etherscan for internal transactions to find pool factory, pool creation time, and creation hash - (address, poolFactoryType, txHash, stampPool) = self.balGetPoolCreationData(poolId, verbose=verbose, inputHash=creationHash); - - # get the input data used to generate the pool - inputData = self.getInputData(txHash); - - # decode those ^ inputs according to the relevant pool factory ABI - poolFactoryContract = self.balLoadContract(poolFactoryType) - decodedPoolData = poolFactoryContract.decode_function_input(inputData)[1]; - - # get pool factory creation time to calculate pauseWindowDuration - stampFactory = self.balGetPoolFactoryCreationTime(poolFactoryContract.address); - - # make sure arguments exist/are proper types to be encoded - if "weights" in decodedPoolData.keys(): - for i in range(len(decodedPoolData["weights"])): - decodedPoolData["weights"][i] = int(decodedPoolData["weights"][i]); - if "priceRateCacheDuration" in decodedPoolData.keys(): - for i in range(len(decodedPoolData["priceRateCacheDuration"])): - decodedPoolData["priceRateCacheDuration"][i] = int(decodedPoolData["priceRateCacheDuration"][i]); - if poolFactoryType == "InvestmentPoolFactory" and not "assetManagers" in decodedPoolData.keys(): - decodedPoolData["assetManagers"] = []; - for i in range(len(decodedPoolData["weights"])): - decodedPoolData["assetManagers"].append(self.ZERO_ADDRESS); - - # times for pause/buffer - daysToSec = 24*60*60; # hr * min * sec - pauseDays = 90; - bufferPeriodDays = 30; - - # calculate proper durations - pauseWindowDurationSec = max( (pauseDays*daysToSec) - (int(stampPool) - int(stampFactory)), 0); - bufferPeriodDurationSec = bufferPeriodDays * daysToSec; - if pauseWindowDurationSec == 0: - bufferPeriodDurationSec = 0; - - poolType = poolFactoryType.replace("Factory",""); - poolAbi = self.balPoolGetAbi(poolType); - - structInConstructor = False; - if poolType == "WeightedPool": - zero_ams = [self.ZERO_ADDRESS] * len(decodedPoolData["tokens"]); - args = [(decodedPoolData["name"], - decodedPoolData["symbol"], - decodedPoolData["tokens"], - decodedPoolData["normalizedWeights"], - decodedPoolData["rateProviders"], - zero_ams, - int(decodedPoolData["swapFeePercentage"])), - self.deploymentAddresses["Vault"], - self.deploymentAddresses["ProtocolFeePercentagesProvider"], - int(pauseWindowDurationSec), - int(bufferPeriodDurationSec), - decodedPoolData["owner"]]; - elif poolType == "WeightedPool2Tokens": - args = [self.deploymentAddresses["Vault"], - decodedPoolData["name"], - decodedPoolData["symbol"], - decodedPoolData["tokens"][0], - decodedPoolData["tokens"][1], - int(decodedPoolData["weights"][0]), - int(decodedPoolData["weights"][1]), - int(decodedPoolData["swapFeePercentage"]), - int(pauseWindowDurationSec), - int(bufferPeriodDurationSec), - decodedPoolData["oracleEnabled"], - decodedPoolData["owner"]]; - structInConstructor = True; - elif poolType == "StablePool": - args = [self.deploymentAddresses["Vault"], - decodedPoolData["name"], - decodedPoolData["symbol"], - decodedPoolData["tokens"], - int(decodedPoolData["amplificationParameter"]), - int(decodedPoolData["swapFeePercentage"]), - int(pauseWindowDurationSec), - int(bufferPeriodDurationSec), - decodedPoolData["owner"]]; - elif poolType == "MetaStablePool": - args = [self.deploymentAddresses["Vault"], - decodedPoolData["name"], - decodedPoolData["symbol"], - decodedPoolData["tokens"], - decodedPoolData["rateProviders"], - decodedPoolData["priceRateCacheDuration"], - int(decodedPoolData["amplificationParameter"]), - int(decodedPoolData["swapFeePercentage"]), - int(pauseWindowDurationSec), - int(bufferPeriodDurationSec), - decodedPoolData["oracleEnabled"], - decodedPoolData["owner"]]; - structInConstructor = True; - elif poolType == "LiquidityBootstrappingPool": - args = [self.deploymentAddresses["Vault"], - decodedPoolData["name"], - decodedPoolData["symbol"], - decodedPoolData["tokens"], - decodedPoolData["weights"], - int(decodedPoolData["swapFeePercentage"]), - int(pauseWindowDurationSec), - int(bufferPeriodDurationSec), - decodedPoolData["owner"], - decodedPoolData["swapEnabledOnStart"]]; - elif poolType == "InvestmentPool": - args = [self.deploymentAddresses["Vault"], - decodedPoolData["name"], - decodedPoolData["symbol"], - decodedPoolData["tokens"], - decodedPoolData["weights"], - decodedPoolData["assetManagers"], - int(decodedPoolData["swapFeePercentage"]), - int(pauseWindowDurationSec), - int(bufferPeriodDurationSec), - decodedPoolData["owner"], - decodedPoolData["swapEnabledOnStart"], - int(decodedPoolData["managementSwapFeePercentage"])]; - structInConstructor = True; - elif poolType == "StablePhantomPool": - args = [self.deploymentAddresses["Vault"], - decodedPoolData["name"], - decodedPoolData["symbol"], - decodedPoolData["tokens"], - decodedPoolData["rateProviders"], - decodedPoolData["tokenRateCacheDurations"], - int(decodedPoolData["amplificationParameter"]), - int(decodedPoolData["swapFeePercentage"]), - int(pauseWindowDurationSec), - int(bufferPeriodDurationSec), - decodedPoolData["owner"]]; - structInConstructor = True; - elif poolType == "AaveLinearPool": - args = [self.deploymentAddresses["Vault"], - decodedPoolData["name"], - decodedPoolData["symbol"], - decodedPoolData["mainToken"], - decodedPoolData["wrappedToken"], - int(decodedPoolData["upperTarget"]), - int(decodedPoolData["swapFeePercentage"]), - int(pauseWindowDurationSec), - int(bufferPeriodDurationSec), - decodedPoolData["owner"]]; - elif poolType == "ERC4626LinearPool": - args = [self.deploymentAddresses["Vault"], - decodedPoolData["name"], - decodedPoolData["symbol"], - decodedPoolData["mainToken"], - decodedPoolData["wrappedToken"], - int(decodedPoolData["upperTarget"]), - int(decodedPoolData["swapFeePercentage"]), - int(pauseWindowDurationSec), - int(bufferPeriodDurationSec), - decodedPoolData["owner"]]; - else: - self.ERROR("PoolType " + poolType + " not found!") - return(False); - - # encode constructor data - poolContract = self.balLoadArbitraryContract(address, self.mc.listToString(poolAbi)); - if structInConstructor: - args = (tuple(args),) - data = poolContract._encode_constructor_data(args=args); - encodedData = data[2:]; #cut off the 0x - - command = "yarn hardhat verify-contract --id {} --name {} --address {} --network {} --key {} --args {}" - output = command.format(self.contractDirectories[poolFactoryType], - poolType, - address, - self.network, - self.etherscanApiKey, - encodedData) - return(output); - - def balStablePoolGetAmplificationParameter(self, poolId): - poolAddress = self.web3.toChecksumAddress(poolId[:42]); - pool = self.web3.eth.contract(address=poolAddress, abi=self.balPoolGetAbi("StablePool")); - (value, isUpdating, precision) = pool.functions.getAmplificationParameter().call(); - return(value, isUpdating, precision); - - def balStablePoolStartAmplificationParameterUpdate(self, poolId, rawEndValue, endTime, isAsync=False, gasFactor=1.05, gasPriceSpeed="average", nonceOverride=-1, gasEstimateOverride=-1, gasPriceGweiOverride=-1): - poolAddress = self.web3.toChecksumAddress(poolId[:42]); - pool = self.web3.eth.contract(address=poolAddress, abi=self.balPoolGetAbi("StablePool")); - - owner = pool.functions.getOwner().call(); - if not self.address == owner: - self.ERROR("You are not the pool owner; this transaction will fail."); - return(False); - - fn = pool.functions.startAmplificationParameterUpdate(rawEndValue, endTime); - tx = self.buildTx(fn, gasFactor, gasPriceSpeed, nonceOverride, gasEstimateOverride, gasPriceGweiOverride); - txHash = self.sendTx(tx, isAsync); - return(txHash); - - # https://dev.balancer.fi/references/contracts/apis/pools/weightedpool2tokens#gettimeweightedaverage - def balOraclePoolGetTimeWeightedAverage(self, poolId, queries): - poolAddress = self.web3.toChecksumAddress(poolId[:42]); - pool = self.web3.eth.contract(address=poolAddress, abi=self.balPoolGetAbi("WeightedPool2Tokens")); - results = pool.functions.getTimeWeightedAverage(queries).call(); - return(results); - - def balSwapIsFlashSwap(self, swapDescription): - for amount in swapDescription["limits"]: - if not float(amount) == 0.0: - return(False); - return(True); - - def balReorderTokenDicts(self, tokens): - originalIdxToSortedIdx = {}; - sortedIdxToOriginalIdx = {}; - tokenAddressToIdx = {}; - for i in range(len(tokens)): - tokenAddressToIdx[tokens[i]] = i; - sortedTokens = tokens; - sortedTokens.sort(); - for i in range(len(sortedTokens)): - originalIdxToSortedIdx[tokenAddressToIdx[sortedTokens[i]]] = i; - sortedIdxToOriginalIdx[i] = tokenAddressToIdx[sortedTokens[i]]; - return(sortedTokens, originalIdxToSortedIdx, sortedIdxToOriginalIdx); - - def balSwapGetUserData(self, poolType): - userDataNull = eth_abi.encode_abi(['uint256'], [0]); - userData = userDataNull; - #for weightedPools, user data is just null, but in the future there may be userData to pass to pools for swaps - # if poolType == "someFuturePool": - # userData = "something else"; - return(userData); - - def balDoSwap(self, swapDescription, isAsync=False, gasFactor=1.05, gasPriceSpeed="average", nonceOverride=-1, gasEstimateOverride=-1, gasPriceGweiOverride=-1): - swapFn = self.balCreateFnSwap(swapDescription); - tx = self.buildTx(swapFn, gasFactor, gasPriceSpeed, nonceOverride, gasEstimateOverride, gasPriceGweiOverride); - txHash = self.sendTx(tx, isAsync); - return(txHash); - - def balDoBatchSwap(self, swapDescription, isAsync=False, gasFactor=1.05, gasPriceSpeed="average", nonceOverride=-1, gasEstimateOverride=-1, gasPriceGweiOverride=-1): - batchSwapFn = self.balCreateFnBatchSwap(swapDescription); - tx = self.buildTx(batchSwapFn, gasFactor, gasPriceSpeed, nonceOverride, gasEstimateOverride, gasPriceGweiOverride); - txHash = self.sendTx(tx, isAsync); - return(txHash); - - def balCreateFnSwap(self, swapDescription): - kind = int(swapDescription["kind"]) - limitedToken = None; - amountToken = None; - if kind == 0: #GIVEN_IN - amountToken = swapDescription["assetIn"]; - limitedToken = swapDescription["assetOut"]; - elif kind == 1: #GIVEN_OUT - amountToken = swapDescription["assetOut"]; - limitedToken = swapDescription["assetIn"]; - - amountWei = int(Decimal(swapDescription["amount"]) * 10 ** Decimal(self.erc20GetDecimals(amountToken))); - limitWei = int(Decimal(swapDescription["limit"]) * 10 ** Decimal(self.erc20GetDecimals(limitedToken))); - - swapStruct = ( - swapDescription["poolId"], - kind, - self.web3.toChecksumAddress(swapDescription["assetIn"]), - self.web3.toChecksumAddress(swapDescription["assetOut"]), - amountWei, - self.balSwapGetUserData(None) - ) - fundStruct = ( - self.web3.toChecksumAddress(swapDescription["fund"]["sender"]), - swapDescription["fund"]["fromInternalBalance"], - self.web3.toChecksumAddress(swapDescription["fund"]["recipient"]), - swapDescription["fund"]["toInternalBalance"] - ) - vault = self.balLoadContract("Vault"); - singleSwapFunction = vault.functions.swap( - swapStruct, - fundStruct, - limitWei, - int(swapDescription["deadline"]) - ) - return(singleSwapFunction); - - def balFormatBatchSwapData(self, swapDescription): - (sortedTokens, originalIdxToSortedIdx, sortedIdxToOriginalIdx) = self.balReorderTokenDicts(swapDescription["assets"]); - numTokens = len(sortedTokens); - - # reorder the limits to refer to properly sorted tokens - reorderedLimits = []; - for i in range(numTokens): - currLimitStandard = float(swapDescription["limits"][sortedIdxToOriginalIdx[i]]); - decimals = self.erc20GetDecimals(sortedTokens[i]); - currLimitRaw = int(Decimal(currLimitStandard) * Decimal(10**(decimals))) - reorderedLimits.append(currLimitRaw) - - kind = int(swapDescription["kind"]); - assets = [self.web3.toChecksumAddress(token) for token in sortedTokens]; - - swapsTuples = []; - for swap in swapDescription["swaps"]: - idxSortedIn = originalIdxToSortedIdx[int(swap["assetInIndex"])]; - idxSortedOut = originalIdxToSortedIdx[int(swap["assetOutIndex"])]; - - idxTokenAmount = idxSortedIn; - if kind == 1: - idxTokenAmount = idxSortedOut; - - decimals = self.erc20GetDecimals(sortedTokens[idxTokenAmount]); - amount = int( Decimal(swap["amount"]) * Decimal(10**(decimals))); - - swapsTuple = ( swap["poolId"], - idxSortedIn, - idxSortedOut, - amount, - self.balSwapGetUserData(None)); - swapsTuples.append(swapsTuple); - - funds = ( self.web3.toChecksumAddress(swapDescription["funds"]["sender"]), - swapDescription["funds"]["fromInternalBalance"], - self.web3.toChecksumAddress(swapDescription["funds"]["recipient"]), - swapDescription["funds"]["toInternalBalance"]); - intReorderedLimits = [int(element) for element in reorderedLimits]; - deadline = int(swapDescription["deadline"]); - return(kind, swapsTuples, assets, funds, intReorderedLimits, deadline); - - def balCreateFnBatchSwap(self, swapDescription): - (kind, swapsTuples, assets, funds, intReorderedLimits, deadline) = self.balFormatBatchSwapData(swapDescription); - vault = self.balLoadContract("Vault"); - batchSwapFunction = vault.functions.batchSwap( kind, - swapsTuples, - assets, - funds, - intReorderedLimits, - deadline); - return(batchSwapFunction); - - def balQueryBatchSwaps(self, originalSwapsDescription): - swapsDescription = copy.deepcopy(originalSwapsDescription); - vault = self.balLoadContract("Vault"); - for swapDescription in swapsDescription: - - # do deep copy to avoid modifying the swapDescription in place, breaking index remappings - deepCopySwapDescription = copy.deepcopy(swapDescription); - (kind, swapsTuples, assets, funds, intReorderedLimits, deadline) = self.balFormatBatchSwapData(deepCopySwapDescription); - args = [kind, swapsTuples, assets, funds]; - self.mc.addCall(vault.address, vault.abi, "queryBatchSwap", args=args); - data = self.mc.execute(); - - outputs = []; - for swapDescription, outputData, successfulCall in zip(swapsDescription, data[0], data[1]): - output = {}; - if successfulCall: - amounts = list(outputData[0]); - for asset, amount in zip(assets, amounts): - if successfulCall: - decimals = self.erc20GetDecimals(asset); - output[asset] = amount * 10**(-decimals); - else: - output[asset] = None; - outputs.append(output); - else: - for asset in assets: - output[asset] = None; - outputs.append(output); - - return(outputs, data[1]); - - def balQueryBatchSwap(self, originalSwapDescription): - swapDescription = copy.deepcopy(originalSwapDescription); - (kind, swapsTuples, assets, funds, intReorderedLimits, deadline) = self.balFormatBatchSwapData(swapDescription); - vault = self.balLoadContract("Vault"); - amounts = vault.functions.queryBatchSwap( kind, - swapsTuples, - assets, - funds).call(); - - output = {}; - for asset, amount in zip(assets, amounts): - decimals = self.erc20GetDecimals(asset); - output[asset] = amount * 10**(-decimals); - return(output); - - def balGetLinkToFrontend(self, poolId): - if "balFrontend" in self.networkParams[self.network].keys(): - return("https://" + self.networkParams[self.network]["balFrontend"] + "pool/0x" + poolId); - else: - return("") - - def balGetApiEndpointSor(self): - return(os.path.join(self.apiEndpoint, "sor", str(self.networkParams[self.network]["id"]))); - - def balSorQuery(self, data): - query = data["sor"]; - - # scale amount based on input/output - token_for_decimals = query["orderKind"].lower() + "Token"; - amount_scaled = self.erc20ScaleDecimalsWei(query[token_for_decimals], query["amount"]); - query["amount"] = int(amount_scaled); - - # get gas price if not provided - if not "gasPrice" in query.keys(): - gas_price_gwei = self.getGasPrice(query["gasSpeed"]); - gas_price_wei = int(gas_price_gwei * 1e9); - query["gasPrice"] = gas_price_wei; - del query["gasSpeed"]; - - # API gets grumpy when you send it numbers. Send everything as a string - for field in query: - query[field] = str(query[field]) - response = requests.post( - self.balGetApiEndpointSor(), - headers={'Content-Type': 'application/json'}, - data=json.dumps(query) - ); - - batch_swap = self.balSorResponseToBatchSwapFormat(data, response.json()) - - return(batch_swap) - - def balSorResponseToBatchSwapFormat(self, query, response): - sor = query["sor"]; - del query["sor"]; - - kind = None; - if sor["orderKind"] not in ["buy", "sell"]: - bal.ERROR("orderKind must be \"buy\" or \"sell\""); - quit(); - if sor["orderKind"] == "sell": - kind = "0"; - if sor["orderKind"] == "buy": - kind = "1"; - - query["batchSwap"]["kind"] = kind; - query["batchSwap"]["assets"] = response["tokenAddresses"]; - query["batchSwap"]["swaps"] = response["swaps"]; - query["batchSwap"]["limits"] = [0] * len(response["tokenAddresses"]); - - for step in query["batchSwap"]["swaps"]: - index = step["assetInIndex"]; - if kind == "1": - index = step["assetOutIndex"]; - asset = query["batchSwap"]["assets"][index] - step["amount"] = float(self.erc20ScaleDecimalsStandard(asset, step["amount"])); - - query_results = self.balQueryBatchSwap(query["batchSwap"]); - - idx = 0; - for a in query["batchSwap"]["assets"]: - chk_asset = self.web3.toChecksumAddress(a); - factor = 1.00; # 100% - asset_delta = query_results[chk_asset]; - - slippage_factor = float(query["slippageTolerancePercent"])/100.0; - - if asset_delta > 0: - factor += slippage_factor; - else: - factor -= slippage_factor; - - query["batchSwap"]["limits"][idx] = asset_delta * factor; - idx += 1; - - return(query) - - def multiCallErc20BatchDecimals(self, tokens): - self.mc.reset(); - payload = []; - for token in tokens: - currTokenContract = self.erc20GetContract(token); - self.mc.addCall(currTokenContract.address, currTokenContract.abi, 'decimals'); - - # make the actual call to MultiCall - outputData = self.mc.execute(); - outputData = outputData[0]; - tokensToDecimals = {}; - - for token, odBytes in zip(tokens, outputData): - decimals = odBytes[0]; - tokensToDecimals[token] = decimals; - self.decimals[token] = decimals; - return(tokensToDecimals); - - def getOnchainData(self, pools): - # reset multicaller - self.mc.reset(); - - # load the vault contract - vault = self.balLoadContract("Vault"); - target = vault.address; - - poolAbis = {}; - for poolType in pools.keys(): - poolAbis[poolType] = self.balPoolGetAbi(poolType); - - payload = []; - pidAndFns = []; - outputAbis = {}; - - poolToType = {}; - for poolType in pools.keys(): - poolIds = pools[poolType]; - poolAbi = poolAbis[poolType]; - - if poolAbi is None: - continue; - - # construct all the calls in format (VaultAddress, encodedCallData) - for poolId in poolIds: - poolToType[poolId] = poolType; - - poolAddress = self.balPooldIdToAddress(poolId); - currPool = self.balLoadArbitraryContract(poolAddress, self.mc.listToString(poolAbi)) - - # === all pools have tokens and swap fee, pausedState === - self.mc.addCall(vault.address, vault.abi, 'getPoolTokens', args=[poolId]); - self.mc.addCall(currPool.address, currPool.abi, 'getSwapFeePercentage'); - self.mc.addCall(currPool.address, currPool.abi, 'getPausedState'); - pidAndFns.append((poolId, "getPoolTokens")); - pidAndFns.append((poolId, "getSwapFeePercentage")); - pidAndFns.append((poolId, "getPausedState")); - - # === using weighted math === - if poolType in ["Weighted", "LiquidityBootstrapping", "Investment"]: - self.mc.addCall(currPool.address, currPool.abi, 'getNormalizedWeights'); - pidAndFns.append((poolId, "getNormalizedWeights")); - - # === using stable math === - if poolType in ["Stable", "MetaStable"]: - self.mc.addCall(currPool.address, currPool.abi, 'getAmplificationParameter'); - pidAndFns.append((poolId, "getAmplificationParameter")); - - # === have pausable swaps by pool owner === - if poolType in [ "LiquidityBootstrapping", "Investment"]: - self.mc.addCall(currPool.address, currPool.abi, 'getSwapEnabled'); - pidAndFns.append((poolId, "getSwapEnabled")); - - data = self.mc.execute(); - data = data[0]; - - chainDataOut = {}; - chainDataBookkeeping = {}; - - for decodedOutputData, pidAndFn in zip(data, pidAndFns): - poolId = pidAndFn[0]; - decoder = pidAndFn[1]; - - if not poolId in chainDataOut.keys(): - chainDataOut[poolId] = {"poolType":poolToType[poolId]}; - chainDataBookkeeping[poolId] = {}; - - if decoder == "getPoolTokens": - addresses = list(decodedOutputData[0]); - balances = list(decodedOutputData[1]); - lastChangeBlock = decodedOutputData[2]; - - chainDataOut[poolId]["lastChangeBlock"] = lastChangeBlock; - chainDataBookkeeping[poolId]["orderedAddresses"] = addresses; - - chainDataOut[poolId]["tokens"] = {}; - for address, balance in zip(addresses, balances): - chainDataOut[poolId]["tokens"][address] = {"rawBalance":str(balance)}; - - elif decoder == "getNormalizedWeights": - normalizedWeights = list(decodedOutputData[0]); - addresses = chainDataBookkeeping[poolId]["orderedAddresses"]; - for address, normalizedWeight in zip(addresses, normalizedWeights): - weight = Decimal(str(normalizedWeight)) * Decimal(str(1e-18)); - chainDataOut[poolId]["tokens"][address]["weight"] = str(weight); - - elif decoder == "getSwapFeePercentage": - swapFee = Decimal(decodedOutputData[0]) * Decimal(str(1e-18)); - chainDataOut[poolId]["swapFee"] = str(swapFee); - - elif decoder == "getAmplificationParameter": - rawAmp = Decimal(decodedOutputData[0]); - scaling = Decimal(decodedOutputData[2]); - chainDataOut[poolId]["amp"] = str(rawAmp/scaling); - - elif decoder == "getSwapEnabled": - chainDataOut[poolId]["swapEnabled"] = decodedOutputData[0]; - - elif decoder == "getPausedState": - chainDataOut[poolId]["pausedState"] = decodedOutputData[0]; - - #find tokens for which decimals have not been cached - tokens = set(); - for pool in chainDataOut.keys(): - for token in chainDataOut[pool]["tokens"].keys(): - tokens.add(token); - haveDecimalsFor = set(self.decimals.keys()); - - # set subtraction (A - B) gives "What is in A that isn't in B?" - needDecimalsFor = tokens - haveDecimalsFor; - - #if there are any, query them onchain using multicall - if len(needDecimalsFor) > 0: - print("New tokens found. Caching decimals for", len(needDecimalsFor), "tokens...") - self.multiCallErc20BatchDecimals(needDecimalsFor); - - # update rawBalances to have decimal adjusted values - for pool in chainDataOut.keys(): - for token in chainDataOut[pool]["tokens"].keys(): - rawBalance = chainDataOut[pool]["tokens"][token]["rawBalance"]; - decimals = self.erc20GetDecimals(token); - chainDataOut[pool]["tokens"][token]["balance"] = str(Decimal(rawBalance) * Decimal(10**(-decimals))); - - return(chainDataOut); - - def generateDeploymentsDocsTable(self): - outputString = ""; - contracts = []; - addresses = []; - - network = self.network; - blockExplorer = "https://" + self.networkParams[network]["blockExplorerUrl"]; - outputString += "{% tab title=\"" + network.title() + "\" %}\n" - - for contractType in self.deploymentAddresses: - contracts.append(contractType); - - address = self.deploymentAddresses[contractType]; - etherscanPage = blockExplorer + "/address/" + address; - addresses.append("[" + address + "](" + etherscanPage + ")"); - - longestContractStringLength = getLongestStringLength(contracts); - longestAddressStringLength = getLongestStringLength(addresses); - - contractDashLine = "".join(["-"]*longestContractStringLength); - addressDashLine = "".join(["-"]*longestAddressStringLength); - - contracts = ["Contracts", contractDashLine] + contracts; - addresses = ["Addresses", addressDashLine] + addresses; - - for (c,a) in zip(contracts, addresses): - cPadded = padWithSpaces(c, longestContractStringLength); - aPadded = padWithSpaces(a, longestAddressStringLength); - line = "| " + cPadded + " | " + aPadded + " |\n" - outputString += line - outputString += "\n{% endtab %}" - return(outputString) + ) + return result + + def balDoExitPool( + self, + poolId, + address, + exitPoolRequestTuple, + gasFactor=1.05, + gasPriceSpeed="average", + nonceOverride=-1, + gasEstimateOverride=-1, + gasPriceGweiOverride=-1, + ): + vault = self.balLoadContract("Vault") + exitPoolFunction = vault.functions.exitPool( + poolId, address, address, exitPoolRequestTuple + ) + tx = self.buildTx( + exitPoolFunction, + gasFactor, + gasPriceSpeed, + nonceOverride, + gasEstimateOverride, + gasPriceGweiOverride, + ) + return self.sendTx(tx) + + def balFormatExitPoolRequestTupleExactBptInForOneTokenOut( + self, + exitKindValue, + tokens, + bptAmount, + tokenOut, + minAmountsOut, + toInternalBalance=False, + ): + minAmountsOut = self.balConvertTokensToWei(tokens, minAmountsOut) + userData = eth_abi.encode_abi( + ["uint256", "uint256", "uint256"], [ + exitKindValue, bptAmount, tokenOut] + ) + return tokens, minAmountsOut, userData, toInternalBalance + + def balFormatExitPoolRequestTupleExactBptInForTokensOut( + self, exitKindValue, tokens, bptAmount, minAmountsOut, toInternalBalance=False + ): + minAmountsOut = self.balConvertTokensToWei(tokens, minAmountsOut) + userData = eth_abi.encode_abi( + ["uint256", "uint256"], [exitKindValue, bptAmount] + ) + return tokens, minAmountsOut, userData, toInternalBalance + + def balFormatExitPoolRequestTupleBptInForExactTokensOut( + self, + exitKindValue, + tokens, + maxBptAmount, + amountsOut, + minAmountsOut, + toInternalBalance=False, + ): + amountsOut = self.balConvertTokensToWei(tokens, amountsOut) + minAmountsOut = self.balConvertTokensToWei(tokens, minAmountsOut) + userData = eth_abi.encode_abi( + ["uint256", "uint256[]", "uint256"], + [exitKindValue, amountsOut, maxBptAmount], + ) + return tokens, minAmountsOut, userData, toInternalBalance + + def balSortTokensExitPool(self, tokens): + tokenKeys = tokens.keys() # the token key is the address string + tokenAddresses = [] + for tokenKey in tokenKeys: + tokenAddresses.append(self.web3.to_checksum_address(tokenKey)) + minAmountsOutSorted = [] + tokenAddressesSorted = [] + amountsOutSorted = [] + + for tokenAddresses, tokenKey in sorted(zip(tokenAddresses, tokenKeys)): + tokenAddressesSorted.append(tokenAddresses) + minAmountsOutSorted.append( + float(tokens[tokenKey].get("minAmount", 0))) + amountsOutSorted.append(float(tokens[tokenKey].get("amount", 0))) + + tokenOutSorted = None + if max(amountsOutSorted) == sum(amountsOutSorted): + tokenOutSorted = amountsOutSorted.index(max(amountsOutSorted)) + return ( + tokenAddressesSorted, + amountsOutSorted, + minAmountsOutSorted, + tokenOutSorted, + ) + + def balExitPool( + self, + exitDescription, + query=False, + gasFactor=1.05, + gasPriceSpeed="average", + nonceOverride=-1, + gasEstimateOverride=-1, + gasPriceGweiOverride=-1, + ): + exitKind = exitDescription["exitKind"] + poolId = exitDescription["poolId"] + tokens = exitDescription["tokens"] + toInternalBalance = exitDescription.get("toInternalBalance", False) + + poolAddress = self.balPooldIdToAddress(poolId) + exitKindValue = WeightedPoolExitKind[exitKind].value + userAddress = self.web3.to_checksum_address( + self.web3.eth.default_account) + ( + tokenAddresses, + amountsOut, + minAmountsOut, + tokenOut, + ) = self.balSortTokensExitPool(tokens) + + if exitKind == "EXACT_BPT_IN_FOR_ONE_TOKEN_OUT": + bptAmount = self.balConvertTokensToWei( + [poolAddress], [float(exitDescription["bptAmount"])] + )[0] + exitPoolRequestTuple = ( + self.balFormatExitPoolRequestTupleExactBptInForOneTokenOut( + exitKindValue, + tokenAddresses, + bptAmount, + tokenOut, + minAmountsOut, + toInternalBalance, + ) + ) + elif exitKind == "EXACT_BPT_IN_FOR_TOKENS_OUT": + bptAmount = self.balConvertTokensToWei( + [poolAddress], [float(exitDescription["bptAmount"])] + )[0] + exitPoolRequestTuple = ( + self.balFormatExitPoolRequestTupleExactBptInForTokensOut( + exitKindValue, + tokenAddresses, + bptAmount, + minAmountsOut, + toInternalBalance, + ) + ) + elif exitKind == "BPT_IN_FOR_EXACT_TOKENS_OUT": + maxBptAmount = self.balConvertTokensToWei( + [poolAddress], [float(exitDescription["maxBptAmount"])] + )[0] + if query: + maxBptAmount = self.balConvertTokensToWei( + [poolAddress], [self.INFINITE] + )[0] + exitPoolRequestTuple = ( + self.balFormatExitPoolRequestTupleBptInForExactTokensOut( + exitKindValue, + tokenAddresses, + maxBptAmount, + amountsOut, + minAmountsOut, + toInternalBalance, + ) + ) + + if query: + tokensSorted = exitPoolRequestTuple[0] + queryOutput = self.balDoQueryExitPool( + poolId, userAddress, exitPoolRequestTuple + ) + return self.balFormatQueryExitPoolOutput( + queryOutput, tokensSorted, poolAddress + ) + return self.balDoExitPool( + poolId, + userAddress, + exitPoolRequestTuple, + gasFactor=gasFactor, + gasPriceSpeed=gasPriceSpeed, + nonceOverride=nonceOverride, + gasEstimateOverride=gasEstimateOverride, + gasPriceGweiOverride=gasPriceGweiOverride, + ) + + def balGetRebalanceLinearPoolsData(self, linearPoolAddresses): + # Can realistically be any linear pool, this one just is the most + # generic. + poolAbi = self.balPoolGetAbi("ERC4626LinearPool") + + # get poolIds and mainTokens to feed into getPoolTokenInfo (to get + # asset managers) + for i in linearPoolAddresses: + self.mc.addCall(i, poolAbi, "getPoolId") + self.mc.addCall(i, poolAbi, "getMainToken") + output = self.mc.execute() + + pool_id_by_pool_address = {} + main_tokens_by_pool_id = {} + for i in range(0, len(output[0]), 2): + poolIdSuccess = output[1][i] + mainTokenSuccess = output[1][i + 1] + if poolIdSuccess and mainTokenSuccess: + poolId = "0x" + output[0][i][0].hex() + mainToken = self.web3.to_checksum_address(output[0][i + 1][0]) + main_tokens_by_pool_id[poolId] = mainToken + pool_id_by_pool_address[linearPoolAddresses[int( + i / 2)]] = poolId + + self.multiCallErc20BatchDecimals(list(main_tokens_by_pool_id.values())) + + # determine each linear pool's asset manager (the rebalancer) + vault = self.balLoadContract("Vault") + for poolId in main_tokens_by_pool_id: + mainToken = main_tokens_by_pool_id[poolId] + self.mc.addCall( + vault.address, vault.abi, "getPoolTokenInfo", args=[poolId, mainToken] + ) + output = self.mc.execute() + data = output[0] + successes = output[1] + + pools_by_rebalancer = {} + for d, a in zip(data, linearPoolAddresses): + pools_by_rebalancer[self.web3.to_checksum_address(d[3])] = a + + for rebalancer in pools_by_rebalancer: + pools_by_rebalancer[rebalancer] + + linearPoolRebalancer = self.balLoadContractAtAddress( + "ERC4626LinearPoolRebalancer", rebalancer + ) + self.mc.addCall( + linearPoolRebalancer.address, + linearPoolRebalancer.abi, + "rebalance", + args=[self.ZERO_ADDRESS], + ) + + mc_output = self.mc.execute() + results = mc_output[0] + successes = mc_output[1] + output = {} + for result, success, rebalancer in zip( + results, successes, list(pools_by_rebalancer.keys()) + ): + if success and result is not None and result[0] > 0: + amount = result[0] + token = main_tokens_by_pool_id[ + pool_id_by_pool_address[pools_by_rebalancer[rebalancer]] + ] + linearPoolRebalancer = self.balLoadContractAtAddress( + "ERC4626LinearPoolRebalancer", rebalancer + ) + + output[rebalancer] = { + "token_out": token, + "amount_out": float(self.erc20ScaleDecimalsStandard(token, amount)), + "gas_estimate": linearPoolRebalancer.functions.rebalance( + self.address + ).estimateGas(), + } + return output + + def balDoRebalanceLinearPool( + self, + pool_address, + recipient=None, + isAsync=False, + gasFactor=1.05, + gasPriceSpeed="average", + nonceOverride=-1, + gasEstimateOverride=-1, + gasPriceGweiOverride=-1, + ): + linear_pool = self.balLoadContractAtAddress( + "ERC4626LinearPool", self.web3.to_checksum_address(pool_address) + ) + pool_id = linear_pool.functions.getPoolId().call() + main_token = linear_pool.functions.getMainToken().call() + + vault = self.balLoadContract("Vault") + pool_token_info = vault.functions.getPoolTokenInfo( + pool_id, main_token).call() + rebalancer = self.web3.to_checksum_address(pool_token_info[3]) + + linear_pool_rebalancer = self.balLoadContractAtAddress( + "ERC4626LinearPoolRebalancer", rebalancer + ) + if recipient is None: + recipient = self.address + fn = linear_pool_rebalancer.functions.rebalance(recipient) + tx = self.buildTx( + fn, + gasFactor, + gasPriceSpeed, + nonceOverride, + gasEstimateOverride, + gasPriceGweiOverride, + ) + txHash = self.sendTx(tx, isAsync) + return txHash + + def balVaultWeth(self): + vault = self.balLoadContract("Vault") + wethAddress = vault.functions.WETH().call() + return wethAddress + + def balVaultGetAuthorizer(self): + vault = self.balLoadContract("Vault") + authorizerAddress = vault.functions.getAuthorizer().call() + return authorizerAddress + + def balBalancerHelpersGetVault(self): + bh = self.balLoadContract("BalancerHelpers") + vaultAddress = bh.functions.vault().call() + return vaultAddress + + def balVaultGetPoolTokens(self, poolId): + vault = self.balLoadContract("Vault") + output = vault.functions.getPoolTokens(poolId).call() + tokens = output[0] + balances = output[1] + lastChangeBlock = output[2] + return (tokens, balances, lastChangeBlock) + + def balVaultGetInternalBalance(self, tokens, address=None): + if address is None: + address = self.web3.eth.default_account + + vault = self.balLoadContract("Vault") + (sortedTokens, checksumTokens) = self.balSortTokens(tokens) + balances = vault.functions.getInternalBalance( + address, checksumTokens).call() + numElements = len(sortedTokens) + internalBalances = {} + for i in range(numElements): + token = checksumTokens[i] + decimals = self.erc20GetDecimals(token) + internalBalances[token] = Decimal( + balances[i]) * Decimal(10 ** (-decimals)) + return internalBalances + + def balVaultGetPool(self, poolId): + vault = self.balLoadContract("Vault") + address, specialization = vault.functions.getPool(poolId).call() + return address, specialization + + def balVaultGetPoolTokenInfo(self, poolId, tokenAddress): + vault = self.balLoadContract("Vault") + tokenAddress = self.web3.to_checksum_address(tokenAddress) + tokenInfo = vault.functions.getPoolTokenInfo( + poolId, tokenAddress).call() + cash, managed, lastChangeBlock, assetManager = tokenInfo + return cash, managed, lastChangeBlock, assetManager + + def balVaultGetProtocolFeesCollector(self): + vault = self.balLoadContract("Vault") + address = vault.functions.getProtocolFeesCollector().call() + return address + + def balVaultHasApprovedRelayer(self, userAddress, relayerAddress): + vault = self.balLoadContract("Vault") + hasApprovedRelayer = vault.functions.hasApprovedRelayer( + userAddress, relayerAddress + ).call() + return hasApprovedRelayer + + def balVaultSetAuthorizer( + self, + newAuthorizerAddress, + isAsync=False, + gasFactor=1.05, + gasPriceSpeed="average", + nonceOverride=-1, + gasEstimateOverride=-1, + gasPriceGweiOverride=-1, + ): + vault = self.balLoadContract("Vault") + setAuthorizerFn = vault.functions.newAuthorizer(newAuthorizerAddress) + tx = self.buildTx( + setAuthorizerFn, + gasFactor, + gasPriceSpeed, + nonceOverride, + gasEstimateOverride, + gasPriceGweiOverride, + ) + return self.sendTx(tx, isAsync) + + def balVaultSetPaused( + self, + paused, + isAsync=False, + gasFactor=1.05, + gasPriceSpeed="average", + nonceOverride=-1, + gasEstimateOverride=-1, + gasPriceGweiOverride=-1, + ): + vault = self.balLoadContract("Vault") + setPausedFn = vault.functions.setPaused(paused) + tx = self.buildTx( + setPausedFn, + gasFactor, + gasPriceSpeed, + nonceOverride, + gasEstimateOverride, + gasPriceGweiOverride, + ) + return self.sendTx(tx, isAsync) + + def balVaultSetRelayerApproval( + self, + senderAddress, + relayerAddress, + approved, + isAsync=False, + gasFactor=1.05, + gasPriceSpeed="average", + nonceOverride=-1, + gasEstimateOverride=-1, + gasPriceGweiOverride=-1, + ): + vault = self.balLoadContract("Vault") + setRelayerApprovalFn = vault.functions.setRelayerApproval( + senderAddress, relayerAddress, approved + ) + tx = self.buildTx( + setRelayerApprovalFn, + gasFactor, + gasPriceSpeed, + nonceOverride, + gasEstimateOverride, + gasPriceGweiOverride, + ) + return self.sendTx(tx, isAsync) + + def balVaultDoManageUserBalance( + self, + kind, + token, + amount, + sender, + recipient, + isAsync=False, + gasFactor=1.05, + gasPriceSpeed="average", + nonceOverride=-1, + gasEstimateOverride=-1, + gasPriceGweiOverride=-1, + ): + if self.verbose: + print("Managing User Balance") + print("\tKind:\t\t", self.inverseUserBalanceOpKind[kind]) + print("\tToken:\t\t", str(token)) + print("\tAmount:\t\t", str(amount)) + print("\tSender:\t\t", str(sender)) + print("\tRecipient:\t", str(recipient)) + manageUserBalanceFn = self.balVaultBuildManageUserBalanceFn( + kind, token, amount, sender, recipient + ) + + print() + print("Building ManageUserBalance") + tx = self.buildTx( + manageUserBalanceFn, + gasFactor, + gasPriceSpeed, + nonceOverride, + gasEstimateOverride, + gasPriceGweiOverride, + ) + txHash = self.sendTx(tx, isAsync) + return txHash + + def balVaultBuildManageUserBalanceFn( + self, kind, token, amount, sender, recipient): + kind = kind + asset = self.web3.to_checksum_address(token) + amount = self.balConvertTokensToWei([token], [amount])[0] + sender = self.web3.to_checksum_address(sender) + recipient = self.web3.to_checksum_address(recipient) + inputTupleList = [(kind, asset, amount, sender, recipient)] + + vault = self.balLoadContract("Vault") + manageUserBalanceFn = vault.functions.manageUserBalance(inputTupleList) + return manageUserBalanceFn + + @cache + def balLoadContract(self, contractName): + contract = self.web3.eth.contract( + address=self.deploymentAddresses[contractName], abi=self.abis[contractName] + ) + return contract + + @cache + def balLoadContractAtAddress(self, contractName, address): + contract = self.web3.eth.contract( + address=address, abi=self.abis[contractName]) + return contract + + @cache + def balLoadArbitraryContract(self, address, abi): + contract = self.web3.eth.contract( + address=address, abi=self.mc.stringToList(abi) + ) + return contract + + @cache + def balPoolGetAbi(self, poolType): + if poolType == "HighAmpComposableStable": + poolType = "ComposableStable" + + if "Pool" not in poolType: + poolType = poolType + "Pool" + + deploymentFolder = None + deprecatedString = "" + try: + deploymentFolder = self.contractDirectories[poolType + "Factory"] + except KeyError: + try: + deploymentFolder = self.deprecatedContractDirectories[ + poolType + "Factory" + ] + deprecatedString = "deprecated" + except KeyError: + return None + except Exception as e: + print(e) + quit() + + try: + abiPath = os.path.join( + self.deploymentsDir, + deprecatedString, + deploymentFolder, + "artifact", + poolType + ".json", + ) + f = pkgutil.get_data(__name__, abiPath).decode() + poolAbi = json.loads(f)["abi"] + except FileNotFoundError: + print("Could not find ABI for " + poolType + " pool.") + quit() + return poolAbi + + @cache + def balPooldIdToAddress(self, poolId): + if "0x" not in poolId: + poolId = "0x" + poolId + poolAddress = self.web3.to_checksum_address(poolId[:42]) + return poolAddress + + def balGetPoolCreationData(self, poolId, verbose=False, inputHash=None): + address = self.balPooldIdToAddress(poolId) + if inputHash is None: + txns = self.getTransactionsByAddress( + address, internal=True, verbose=verbose + ) + else: + txns = self.getTransactionByHash(inputHash, verbose=verbose) + + poolTypeByContract = {} + for poolType in self.deploymentAddresses.keys(): + deploymentAddress = self.deploymentAddresses[poolType].lower() + poolTypeByContract[deploymentAddress] = poolType + + poolFactoryType = None + if inputHash is None: + for txn in txns: + if txn["from"].lower() in poolTypeByContract.keys(): + poolFactoryType = poolTypeByContract[txn["from"].lower()] + txHash = txn["hash"] + stamp = txn["timeStamp"] + break + else: + txn = txns["result"] + if verbose: + print() + print(txn) + poolFactoryType = poolTypeByContract[txn["to"].lower()] + txHash = txn["hash"] + stamp = self.web3.eth.get_block( + int(txn["blockNumber"], 16))["timestamp"] + + return (address, poolFactoryType, txHash, stamp) + + def balGetPoolFactoryCreationTime(self, address): + txns = self.getTransactionsByAddress(address) + return txns[0]["timeStamp"] + + def getInputData(self, txHash): + transaction = self.web3.eth.get_transaction(txHash) + return transaction.input + + def balGeneratePoolCreationArguments( + self, poolId, verbose=False, creationHash=None + ): + if self.network in ["arbitrum"]: + self.ERROR( + "Automated pool verification doesn't work on " + + self.network + + " yet. Please try the method outlined in the docs using Tenderly." + ) + return False + + # query etherscan for internal transactions to find pool factory, pool + # creation time, and creation hash + (address, poolFactoryType, txHash, stampPool) = self.balGetPoolCreationData( + poolId, verbose=verbose, inputHash=creationHash + ) + + # get the input data used to generate the pool + inputData = self.getInputData(txHash) + + # decode those ^ inputs according to the relevant pool factory ABI + poolFactoryContract = self.balLoadContract(poolFactoryType) + decodedPoolData = poolFactoryContract.decode_function_input(inputData)[ + 1] + + # get pool factory creation time to calculate pauseWindowDuration + stampFactory = self.balGetPoolFactoryCreationTime( + poolFactoryContract.address) + + # make sure arguments exist/are proper types to be encoded + if "weights" in decodedPoolData.keys(): + for i in range(len(decodedPoolData["weights"])): + decodedPoolData["weights"][i] = int( + decodedPoolData["weights"][i]) + if "priceRateCacheDuration" in decodedPoolData.keys(): + for i in range(len(decodedPoolData["priceRateCacheDuration"])): + decodedPoolData["priceRateCacheDuration"][i] = int( + decodedPoolData["priceRateCacheDuration"][i] + ) + if ( + poolFactoryType == "InvestmentPoolFactory" + and "assetManagers" not in decodedPoolData.keys() + ): + decodedPoolData["assetManagers"] = [] + for i in range(len(decodedPoolData["weights"])): + decodedPoolData["assetManagers"].append(self.ZERO_ADDRESS) + + # times for pause/buffer + daysToSec = 24 * 60 * 60 + # hr * min * sec + pauseDays = 90 + bufferPeriodDays = 30 + + # calculate proper durations + pauseWindowDurationSec = max( + (pauseDays * daysToSec) - (int(stampPool) - int(stampFactory)), 0 + ) + bufferPeriodDurationSec = bufferPeriodDays * daysToSec + if pauseWindowDurationSec == 0: + bufferPeriodDurationSec = 0 + + poolType = poolFactoryType.replace("Factory", "") + poolAbi = self.balPoolGetAbi(poolType) + + structInConstructor = False + if poolType == "WeightedPool": + zero_ams = [self.ZERO_ADDRESS] * len(decodedPoolData["tokens"]) + args = [ + ( + decodedPoolData["name"], + decodedPoolData["symbol"], + decodedPoolData["tokens"], + decodedPoolData["normalizedWeights"], + decodedPoolData["rateProviders"], + zero_ams, + int(decodedPoolData["swapFeePercentage"]), + ), + self.deploymentAddresses["Vault"], + self.deploymentAddresses["ProtocolFeePercentagesProvider"], + int(pauseWindowDurationSec), + int(bufferPeriodDurationSec), + decodedPoolData["owner"], + ] + elif poolType == "WeightedPool2Tokens": + args = [ + self.deploymentAddresses["Vault"], + decodedPoolData["name"], + decodedPoolData["symbol"], + decodedPoolData["tokens"][0], + decodedPoolData["tokens"][1], + int(decodedPoolData["weights"][0]), + int(decodedPoolData["weights"][1]), + int(decodedPoolData["swapFeePercentage"]), + int(pauseWindowDurationSec), + int(bufferPeriodDurationSec), + decodedPoolData["oracleEnabled"], + decodedPoolData["owner"], + ] + structInConstructor = True + elif poolType == "StablePool": + args = [ + self.deploymentAddresses["Vault"], + decodedPoolData["name"], + decodedPoolData["symbol"], + decodedPoolData["tokens"], + int(decodedPoolData["amplificationParameter"]), + int(decodedPoolData["swapFeePercentage"]), + int(pauseWindowDurationSec), + int(bufferPeriodDurationSec), + decodedPoolData["owner"], + ] + elif poolType == "MetaStablePool": + args = [ + self.deploymentAddresses["Vault"], + decodedPoolData["name"], + decodedPoolData["symbol"], + decodedPoolData["tokens"], + decodedPoolData["rateProviders"], + decodedPoolData["priceRateCacheDuration"], + int(decodedPoolData["amplificationParameter"]), + int(decodedPoolData["swapFeePercentage"]), + int(pauseWindowDurationSec), + int(bufferPeriodDurationSec), + decodedPoolData["oracleEnabled"], + decodedPoolData["owner"], + ] + structInConstructor = True + elif poolType == "LiquidityBootstrappingPool": + args = [ + self.deploymentAddresses["Vault"], + decodedPoolData["name"], + decodedPoolData["symbol"], + decodedPoolData["tokens"], + decodedPoolData["weights"], + int(decodedPoolData["swapFeePercentage"]), + int(pauseWindowDurationSec), + int(bufferPeriodDurationSec), + decodedPoolData["owner"], + decodedPoolData["swapEnabledOnStart"], + ] + elif poolType == "InvestmentPool": + args = [ + self.deploymentAddresses["Vault"], + decodedPoolData["name"], + decodedPoolData["symbol"], + decodedPoolData["tokens"], + decodedPoolData["weights"], + decodedPoolData["assetManagers"], + int(decodedPoolData["swapFeePercentage"]), + int(pauseWindowDurationSec), + int(bufferPeriodDurationSec), + decodedPoolData["owner"], + decodedPoolData["swapEnabledOnStart"], + int(decodedPoolData["managementSwapFeePercentage"]), + ] + structInConstructor = True + elif poolType == "StablePhantomPool": + args = [ + self.deploymentAddresses["Vault"], + decodedPoolData["name"], + decodedPoolData["symbol"], + decodedPoolData["tokens"], + decodedPoolData["rateProviders"], + decodedPoolData["tokenRateCacheDurations"], + int(decodedPoolData["amplificationParameter"]), + int(decodedPoolData["swapFeePercentage"]), + int(pauseWindowDurationSec), + int(bufferPeriodDurationSec), + decodedPoolData["owner"], + ] + structInConstructor = True + elif poolType == "AaveLinearPool": + args = [ + self.deploymentAddresses["Vault"], + decodedPoolData["name"], + decodedPoolData["symbol"], + decodedPoolData["mainToken"], + decodedPoolData["wrappedToken"], + int(decodedPoolData["upperTarget"]), + int(decodedPoolData["swapFeePercentage"]), + int(pauseWindowDurationSec), + int(bufferPeriodDurationSec), + decodedPoolData["owner"], + ] + elif poolType == "ERC4626LinearPool": + args = [ + self.deploymentAddresses["Vault"], + decodedPoolData["name"], + decodedPoolData["symbol"], + decodedPoolData["mainToken"], + decodedPoolData["wrappedToken"], + int(decodedPoolData["upperTarget"]), + int(decodedPoolData["swapFeePercentage"]), + int(pauseWindowDurationSec), + int(bufferPeriodDurationSec), + decodedPoolData["owner"], + ] + else: + self.ERROR("PoolType " + poolType + " not found!") + return False + + # encode constructor data + poolContract = self.balLoadArbitraryContract( + address, self.mc.listToString(poolAbi) + ) + if structInConstructor: + args = (tuple(args),) + data = poolContract._encode_constructor_data(args=args) + encodedData = data[2:] + # cut off the 0x + + command = "yarn hardhat verify-contract --id {} --name {} --address {} --network {} --key {} --args {}" + output = command.format( + self.contractDirectories[poolFactoryType], + poolType, + address, + self.network, + self.etherscanApiKey, + encodedData, + ) + return output + + def balStablePoolGetAmplificationParameter(self, poolId): + poolAddress = self.web3.to_checksum_address(poolId[:42]) + pool = self.web3.eth.contract( + address=poolAddress, abi=self.balPoolGetAbi("StablePool") + ) + ( + value, + isUpdating, + precision, + ) = pool.functions.getAmplificationParameter().call() + return (value, isUpdating, precision) + + def balStablePoolStartAmplificationParameterUpdate( + self, + poolId, + rawEndValue, + endTime, + isAsync=False, + gasFactor=1.05, + gasPriceSpeed="average", + nonceOverride=-1, + gasEstimateOverride=-1, + gasPriceGweiOverride=-1, + ): + poolAddress = self.web3.to_checksum_address(poolId[:42]) + pool = self.web3.eth.contract( + address=poolAddress, abi=self.balPoolGetAbi("StablePool") + ) + + owner = pool.functions.getOwner().call() + if not self.address == owner: + self.ERROR( + "You are not the pool owner; this transaction will fail.") + return False + + fn = pool.functions.startAmplificationParameterUpdate( + rawEndValue, endTime) + tx = self.buildTx( + fn, + gasFactor, + gasPriceSpeed, + nonceOverride, + gasEstimateOverride, + gasPriceGweiOverride, + ) + txHash = self.sendTx(tx, isAsync) + return txHash + + # https://dev.balancer.fi/references/contracts/apis/pools/weightedpool2tokens#gettimeweightedaverage + def balOraclePoolGetTimeWeightedAverage(self, poolId, queries): + poolAddress = self.web3.to_checksum_address(poolId[:42]) + pool = self.web3.eth.contract( + address=poolAddress, abi=self.balPoolGetAbi( + "WeightedPool2TokensFactory") + ) + results = pool.functions.getTimeWeightedAverage(queries).call() + return results + + def balSwapIsFlashSwap(self, swapDescription): + for amount in swapDescription["limits"]: + if not float(amount) == 0.0: + return False + return True + + def balReorderTokenDicts(self, tokens): + originalIdxToSortedIdx = {} + sortedIdxToOriginalIdx = {} + tokenAddressToIdx = {} + for i in range(len(tokens)): + tokenAddressToIdx[tokens[i]] = i + sortedTokens = sorted(tokens) + for i in range(len(sortedTokens)): + originalIdxToSortedIdx[tokenAddressToIdx[sortedTokens[i]]] = i + sortedIdxToOriginalIdx[i] = tokenAddressToIdx[sortedTokens[i]] + return (sortedTokens, originalIdxToSortedIdx, sortedIdxToOriginalIdx) + + def balSwapGetUserData(self, poolType): + userDataNull = eth_abi.encode(["uint256"], [0]) + userData = userDataNull + # for weightedPools, user data is just null, but in the future there may be userData to pass to pools for swaps + # if poolType == "someFuturePool": + # userData = "something else"; + return userData + + def balDoSwap( + self, + swapDescription, + isAsync=False, + gasFactor=1.05, + gasPriceSpeed="average", + nonceOverride=-1, + gasEstimateOverride=-1, + gasPriceGweiOverride=-1, + ): + swapFn = self.balCreateFnSwap(swapDescription) + tx = self.buildTx( + swapFn, + gasFactor, + gasPriceSpeed, + nonceOverride, + gasEstimateOverride, + gasPriceGweiOverride, + ) + txHash = self.sendTx(tx, isAsync) + return txHash + + def balDoBatchSwap( + self, + swapDescription, + isAsync=False, + gasFactor=1.05, + gasPriceSpeed="average", + nonceOverride=-1, + gasEstimateOverride=-1, + gasPriceGweiOverride=-1, + ): + batchSwapFn = self.balCreateFnBatchSwap(swapDescription) + tx = self.buildTx( + batchSwapFn, + gasFactor, + gasPriceSpeed, + nonceOverride, + gasEstimateOverride, + gasPriceGweiOverride, + ) + txHash = self.sendTx(tx, isAsync) + return txHash + + def balCreateFnSwap(self, swapDescription): + kind = int(swapDescription["kind"]) + limitedToken = None + amountToken = None + if kind == 0: # GIVEN_IN + amountToken = swapDescription["assetIn"] + limitedToken = swapDescription["assetOut"] + elif kind == 1: # GIVEN_OUT + amountToken = swapDescription["assetOut"] + limitedToken = swapDescription["assetIn"] + + amountWei = int( + Decimal(swapDescription["amount"]) + * 10 ** Decimal(self.erc20GetDecimals(amountToken)) + ) + limitWei = int( + Decimal(swapDescription["limit"]) + * 10 ** Decimal(self.erc20GetDecimals(limitedToken)) + ) + + swapStruct = ( + swapDescription["poolId"], + kind, + self.web3.to_checksum_address(swapDescription["assetIn"]), + self.web3.to_checksum_address(swapDescription["assetOut"]), + amountWei, + self.balSwapGetUserData(None), + ) + fundStruct = ( + self.web3.to_checksum_address(swapDescription["fund"]["sender"]), + swapDescription["fund"]["fromInternalBalance"], + self.web3.to_checksum_address( + swapDescription["fund"]["recipient"]), + swapDescription["fund"]["toInternalBalance"], + ) + vault = self.balLoadContract("Vault") + singleSwapFunction = vault.functions.swap( + swapStruct, fundStruct, limitWei, int(swapDescription["deadline"]) + ) + return singleSwapFunction + + def balFormatBatchSwapData(self, swapDescription): + ( + sortedTokens, + originalIdxToSortedIdx, + sortedIdxToOriginalIdx, + ) = self.balReorderTokenDicts(swapDescription["assets"]) + numTokens = len(sortedTokens) + + # reorder the limits to refer to properly sorted tokens + reorderedLimits = [] + for i in range(numTokens): + currLimitStandard = float( + swapDescription["limits"][sortedIdxToOriginalIdx[i]] + ) + decimals = self.erc20GetDecimals(sortedTokens[i]) + currLimitRaw = int( + Decimal(currLimitStandard) * + Decimal( + 10 ** (decimals))) + reorderedLimits.append(currLimitRaw) + + kind = int(swapDescription["kind"]) + assets = [self.web3.to_checksum_address( + token) for token in sortedTokens] + + swapsTuples = [] + for swap in swapDescription["swaps"]: + idxSortedIn = originalIdxToSortedIdx[int(swap["assetInIndex"])] + idxSortedOut = originalIdxToSortedIdx[int(swap["assetOutIndex"])] + + idxTokenAmount = idxSortedIn + if kind == 1: + idxTokenAmount = idxSortedOut + + decimals = self.erc20GetDecimals(sortedTokens[idxTokenAmount]) + amount = int(Decimal(swap["amount"]) * Decimal(10 ** (decimals))) + + swapsTuple = ( + swap["poolId"], + idxSortedIn, + idxSortedOut, + amount, + self.balSwapGetUserData(None), + ) + swapsTuples.append(swapsTuple) + + funds = ( + self.web3.to_checksum_address(swapDescription["funds"]["sender"]), + swapDescription["funds"]["fromInternalBalance"], + self.web3.to_checksum_address( + swapDescription["funds"]["recipient"]), + swapDescription["funds"]["toInternalBalance"], + ) + intReorderedLimits = [int(element) for element in reorderedLimits] + deadline = int(swapDescription["deadline"]) + return (kind, swapsTuples, assets, funds, intReorderedLimits, deadline) + + def balCreateFnBatchSwap(self, swapDescription): + ( + kind, + swapsTuples, + assets, + funds, + intReorderedLimits, + deadline, + ) = self.balFormatBatchSwapData(swapDescription) + vault = self.balLoadContract("Vault") + batchSwapFunction = vault.functions.batchSwap( + kind, swapsTuples, assets, funds, intReorderedLimits, deadline + ) + return batchSwapFunction + + def balQueryBatchSwaps(self, originalSwapsDescription): + swapsDescription = copy.deepcopy(originalSwapsDescription) + vault = self.balLoadContract("Vault") + for swapDescription in swapsDescription: + # do deep copy to avoid modifying the swapDescription in place, + # breaking index remappings + deepCopySwapDescription = copy.deepcopy(swapDescription) + ( + kind, + swapsTuples, + assets, + funds, + intReorderedLimits, + deadline, + ) = self.balFormatBatchSwapData(deepCopySwapDescription) + args = [kind, swapsTuples, assets, funds] + self.mc.addCall( + vault.address, + vault.abi, + "queryBatchSwap", + args=args) + data = self.mc.execute() + + outputs = [] + for swapDescription, outputData, successfulCall in zip( + swapsDescription, data[0], data[1] + ): + output = {} + if successfulCall: + amounts = list(outputData[0]) + for asset, amount in zip(assets, amounts): + if successfulCall: + decimals = self.erc20GetDecimals(asset) + output[asset] = amount * 10 ** (-decimals) + else: + output[asset] = None + outputs.append(output) + else: + for asset in assets: + output[asset] = None + outputs.append(output) + + return (outputs, data[1]) + + def balQueryBatchSwap(self, originalSwapDescription): + swapDescription = copy.deepcopy(originalSwapDescription) + ( + kind, + swapsTuples, + assets, + funds, + intReorderedLimits, + deadline, + ) = self.balFormatBatchSwapData(swapDescription) + vault = self.balLoadContract("Vault") + amounts = vault.functions.queryBatchSwap( + kind, swapsTuples, assets, funds + ).call() + + output = {} + for asset, amount in zip(assets, amounts): + decimals = self.erc20GetDecimals(asset) + output[asset] = amount * 10 ** (-decimals) + return output + + def balGetLinkToFrontend(self, poolId): + if "balFrontend" in self.networkParams[self.network].keys(): + return ( + "https://" + + self.networkParams[self.network]["balFrontend"] + + "pool/0x" + + poolId + ) + else: + return "" + + + def balSorQuery(self, data): + query = data["sor"] + + # scale amount based on input/output + query["orderKind"].lower() + "Token" + + # get gas price if not provided + if "gasPrice" not in query.keys(): + gas_price_gwei = self.getGasPrice(query["gasSpeed"]) + gas_price_wei = int(gas_price_gwei * 1e9) + query["gasPrice"] = gas_price_wei + del query["gasSpeed"] + + # API gets grumpy when you send it numbers. Send everything as a string + for field in query: + query[field] = str(query[field]) + + response = self.graph.getSorGetSwapPaths( + chain=self.network, + swapAmount=query["amount"], + tokenIn=query["sellToken"], + tokenOut=query["buyToken"], + swapType=SwapType.EXACT_IN.value, + ) + + return response + + def _getSorGetSwapPaths( + self, + chain: Chain, + swapAmount: float, + tokenIn: str, + tokenOut: str, + swapType: SwapType = SwapType.EXACT_IN, + swapOptions: dict = None, + queryBatchSwap: bool = True, + ): + """ + Calls the SOR api from the Balancer to get swap paths. + Args: + chain (Chain): The chain to query. + swapAmount (float): The amount to swap. + tokenIn (str): The token to swap in. + tokenOut (str): The token to swap out. + swapType (SwapType, optional): The type of swap. Defaults to SwapType.EXACT_IN. + swapOptions (dict, optional): The options for the swap. Defaults to None. + queryBatchSwap (bool, optional): Whether to query batch swap. Defaults to True. + Returns: + dict: The response from the SOR. + + """ + if not swapOptions: + swapOptions = DEFAULT_SWAP_OPTIONS + swapOptions["timestamp"] = int(time.time()) + query_string = """ + query sorGetSwapPaths( + $chain: GqlChain!, + $swapAmount: AmountHumanReadable!, + $queryBatchSwap: Boolean!, + $swapType: GqlSorSwapType!, + $tokenIn: String!, + $tokenOut: String!, + $callDataInput: GqlSwapCallDataInput, + $useProtocolVersion: Int + ) { + sorGetSwapPaths( + chain: $chain, + swapAmount: $swapAmount, + queryBatchSwap: $queryBatchSwap, + swapType: $swapType, + tokenIn: $tokenIn, + tokenOut: $tokenOut, + callDataInput: $callDataInput, + useProtocolVersion: $useProtocolVersion + ) { + swaps { + assetOutIndex, + amount, + assetInIndex, + poolId + } + + returnAmount, + tokenInAmount, + tokenOutAmount, + effectivePrice, + tokenAddresses + } + } + """ + params = { + "chain": chain, + "swapAmount": swapAmount, + "tokenIn": tokenIn, + "tokenOut": tokenOut, + "swapType": swapType.value, + "queryBatchSwap": queryBatchSwap, + } + + + response = requests.post( + BALANCER_API_ENDPOINT, json={ + "query": query_string, "variables": params} + ) + + return response.json()["data"]["sorGetSwapPaths"] + + def balSorResponseToBatchSwapFormat(self, query, response): + + query = copy.deepcopy(query) + + sor = query["sor"] + del query["sor"] + + kind = None + if sor["orderKind"] not in ["buy", "sell"]: + self.ERROR('orderKind must be "buy" or "sell"') + quit() + if sor["orderKind"] == "sell": + kind = "0" + if sor["orderKind"] == "buy": + kind = "1" + + query["batchSwap"]["kind"] = kind + query["batchSwap"]["assets"] = response["tokenAddresses"] + query["batchSwap"]["swaps"] = response["swaps"] + query["batchSwap"]["limits"] = [0] * len(response["tokenAddresses"]) + + for step in query["batchSwap"]["swaps"]: + index = step["assetInIndex"] + if kind == "1": + index = step["assetOutIndex"] + asset = query["batchSwap"]["assets"][index] + step["amount"] = float( + self.erc20ScaleDecimalsStandard(asset, step["amount"]) + ) + + query_results = self.balQueryBatchSwap(query["batchSwap"]) + + idx = 0 + for a in query["batchSwap"]["assets"]: + chk_asset = self.web3.to_checksum_address(a) + factor = 1.00 + # 100% + asset_delta = query_results[chk_asset] + + slippage_factor = float(query["slippageTolerancePercent"]) / 100.0 + + if asset_delta > 0: + factor += slippage_factor + else: + factor -= slippage_factor + + query["batchSwap"]["limits"][idx] = asset_delta * factor + idx += 1 + + return query + + def multiCallErc20BatchDecimals(self, tokens): + self.mc.reset() + for token in tokens: + currTokenContract = self.erc20GetContract(token) + self.mc.addCall( + currTokenContract.address, currTokenContract.abi, "decimals" + ) + + # make the actual call to MultiCall + outputData = self.mc.execute() + outputData = outputData[0] + tokensToDecimals = {} + + for token, odBytes in zip(tokens, outputData): + decimals = odBytes[0] + tokensToDecimals[token] = decimals + self.decimals[token] = decimals + return tokensToDecimals + + def getOnchainData(self, pools): + # reset multicaller + self.mc.reset() + + # load the vault contract + vault = self.balLoadContract("Vault") + vault.address + + poolAbis = {} + for poolType in pools.keys(): + poolAbis[poolType] = self.balPoolGetAbi(poolType) + + pidAndFns = [] + + poolToType = {} + for poolType in pools.keys(): + poolIds = pools[poolType] + poolAbi = poolAbis[poolType] + + if poolAbi is None: + continue + + # construct all the calls in format (VaultAddress, encodedCallData) + for poolId in poolIds: + poolToType[poolId] = poolType + + poolAddress = self.balPooldIdToAddress(poolId) + currPool = self.balLoadArbitraryContract( + poolAddress, self.mc.listToString(poolAbi) + ) + + # === all pools have tokens and swap fee, pausedState === + self.mc.addCall( + vault.address, vault.abi, "getPoolTokens", args=[poolId] + ) + self.mc.addCall( + currPool.address, + currPool.abi, + "getSwapFeePercentage") + self.mc.addCall( + currPool.address, + currPool.abi, + "getPausedState") + pidAndFns.append((poolId, "getPoolTokens")) + pidAndFns.append((poolId, "getSwapFeePercentage")) + pidAndFns.append((poolId, "getPausedState")) + + # === using weighted math === + if poolType in ["Weighted", + "LiquidityBootstrapping", "Investment"]: + self.mc.addCall( + currPool.address, currPool.abi, "getNormalizedWeights" + ) + pidAndFns.append((poolId, "getNormalizedWeights")) + + # === using stable math === + if poolType in ["Stable", "MetaStable"]: + self.mc.addCall( + currPool.address, currPool.abi, "getAmplificationParameter" + ) + pidAndFns.append((poolId, "getAmplificationParameter")) + + # === have pausable swaps by pool owner === + if poolType in ["LiquidityBootstrapping", "Investment"]: + self.mc.addCall( + currPool.address, + currPool.abi, + "getSwapEnabled") + pidAndFns.append((poolId, "getSwapEnabled")) + + data = self.mc.execute() + data = data[0] + + chainDataOut = {} + chainDataBookkeeping = {} + + for decodedOutputData, pidAndFn in zip(data, pidAndFns): + poolId = pidAndFn[0] + decoder = pidAndFn[1] + + if poolId not in chainDataOut.keys(): + chainDataOut[poolId] = {"poolType": poolToType[poolId]} + chainDataBookkeeping[poolId] = {} + + if decoder == "getPoolTokens": + addresses = list(decodedOutputData[0]) + balances = list(decodedOutputData[1]) + lastChangeBlock = decodedOutputData[2] + + chainDataOut[poolId]["lastChangeBlock"] = lastChangeBlock + chainDataBookkeeping[poolId]["orderedAddresses"] = addresses + + chainDataOut[poolId]["tokens"] = {} + for address, balance in zip(addresses, balances): + chainDataOut[poolId]["tokens"][address] = { + "rawBalance": str(balance) + } + + elif decoder == "getNormalizedWeights": + normalizedWeights = list(decodedOutputData[0]) + addresses = chainDataBookkeeping[poolId]["orderedAddresses"] + for address, normalizedWeight in zip( + addresses, normalizedWeights): + weight = Decimal(str(normalizedWeight)) * \ + Decimal(str(1e-18)) + chainDataOut[poolId]["tokens"][address]["weight"] = str( + weight) + + elif decoder == "getSwapFeePercentage": + swapFee = Decimal(decodedOutputData[0]) * Decimal(str(1e-18)) + chainDataOut[poolId]["swapFee"] = str(swapFee) + + elif decoder == "getAmplificationParameter": + rawAmp = Decimal(decodedOutputData[0]) + scaling = Decimal(decodedOutputData[2]) + chainDataOut[poolId]["amp"] = str(rawAmp / scaling) + + elif decoder == "getSwapEnabled": + chainDataOut[poolId]["swapEnabled"] = decodedOutputData[0] + + elif decoder == "getPausedState": + chainDataOut[poolId]["pausedState"] = decodedOutputData[0] + + # find tokens for which decimals have not been cached + tokens = set() + for pool in chainDataOut.keys(): + for token in chainDataOut[pool]["tokens"].keys(): + tokens.add(token) + haveDecimalsFor = set(self.decimals.keys()) + + # set subtraction (A - B) gives "What is in A that isn't in B?" + needDecimalsFor = tokens - haveDecimalsFor + + # if there are any, query them onchain using multicall + if len(needDecimalsFor) > 0: + print( + "New tokens found. Caching decimals for", + len(needDecimalsFor), + "tokens...", + ) + self.multiCallErc20BatchDecimals(needDecimalsFor) + + # update rawBalances to have decimal adjusted values + for pool in chainDataOut.keys(): + for token in chainDataOut[pool]["tokens"].keys(): + rawBalance = chainDataOut[pool]["tokens"][token]["rawBalance"] + decimals = self.erc20GetDecimals(token) + chainDataOut[pool]["tokens"][token]["balance"] = str( + Decimal(rawBalance) * Decimal(10 ** (-decimals)) + ) + + return chainDataOut + + def generateDeploymentsDocsTable(self): + outputString = "" + contracts = [] + addresses = [] + + network = self.network + blockExplorer = "https://" + \ + self.networkParams[network]["blockExplorerUrl"] + outputString += '{% tab title="' + network.title() + '" %}\n' + + for contractType in self.deploymentAddresses: + contracts.append(contractType) + + address = self.deploymentAddresses[contractType] + etherscanPage = blockExplorer + "/address/" + address + addresses.append("[" + address + "](" + etherscanPage + ")") + + longestContractStringLength = getLongestStringLength(contracts) + longestAddressStringLength = getLongestStringLength(addresses) + + contractDashLine = "".join(["-"] * longestContractStringLength) + addressDashLine = "".join(["-"] * longestAddressStringLength) + + contracts = ["Contracts", contractDashLine] + contracts + addresses = ["Addresses", addressDashLine] + addresses + + for c, a in zip(contracts, addresses): + cPadded = padWithSpaces(c, longestContractStringLength) + aPadded = padWithSpaces(a, longestAddressStringLength) + line = "| " + cPadded + " | " + aPadded + " |\n" + outputString += line + outputString += "\n{% endtab %}" + return outputString diff --git a/balpy/enums/stablePoolJoinExitKind.py b/balpy/enums/stablePoolJoinExitKind.py index 4cee8b1..706f7df 100644 --- a/balpy/enums/stablePoolJoinExitKind.py +++ b/balpy/enums/stablePoolJoinExitKind.py @@ -1,15 +1,18 @@ from enum import IntEnum + class StablePoolJoinKind(IntEnum): - INIT = 0 - EXACT_TOKENS_IN_FOR_BPT_OUT = 1 - TOKEN_IN_FOR_EXACT_BPT_OUT = 2 + INIT = 0 + EXACT_TOKENS_IN_FOR_BPT_OUT = 1 + TOKEN_IN_FOR_EXACT_BPT_OUT = 2 + class StablePhantomPoolJoinKind(IntEnum): - INIT = 0 - COLLECT_PROTOCOL_FEES = 1 + INIT = 0 + COLLECT_PROTOCOL_FEES = 1 + class StablePoolExitKind(IntEnum): - EXACT_BPT_IN_FOR_ONE_TOKEN_OUT = 0 - EXACT_BPT_IN_FOR_TOKENS_OUT = 1 - BPT_IN_FOR_EXACT_TOKENS_OUT = 2 \ No newline at end of file + EXACT_BPT_IN_FOR_ONE_TOKEN_OUT = 0 + EXACT_BPT_IN_FOR_TOKENS_OUT = 1 + BPT_IN_FOR_EXACT_TOKENS_OUT = 2 diff --git a/balpy/enums/types.py b/balpy/enums/types.py new file mode 100644 index 0000000..4ac432f --- /dev/null +++ b/balpy/enums/types.py @@ -0,0 +1,18 @@ +""" +Data structures for chains. +""" + +from enum import Enum + + +class Chain(Enum): + MAINNET = "MAINNET" + GNOSIS = "GNOSIS" + BASE = "BASE" + OPTIMISM = "OPTIMISM" + ARBITRUM = "ARBITRUM" + MODE = "MODE" + + +class SwapType(Enum): + EXACT_IN = "EXACT_IN" diff --git a/balpy/enums/weightedPoolJoinExitKind.py b/balpy/enums/weightedPoolJoinExitKind.py index a65397d..6fdb1da 100644 --- a/balpy/enums/weightedPoolJoinExitKind.py +++ b/balpy/enums/weightedPoolJoinExitKind.py @@ -1,13 +1,15 @@ from enum import IntEnum + class WeightedPoolJoinKind(IntEnum): - INIT = 0 - EXACT_TOKENS_IN_FOR_BPT_OUT = 1 - TOKEN_IN_FOR_EXACT_BPT_OUT = 2 - ALL_TOKENS_IN_FOR_EXACT_BPT_OUT = 3 + INIT = 0 + EXACT_TOKENS_IN_FOR_BPT_OUT = 1 + TOKEN_IN_FOR_EXACT_BPT_OUT = 2 + ALL_TOKENS_IN_FOR_EXACT_BPT_OUT = 3 + class WeightedPoolExitKind(IntEnum): - EXACT_BPT_IN_FOR_ONE_TOKEN_OUT = 0 - EXACT_BPT_IN_FOR_TOKENS_OUT = 1 - BPT_IN_FOR_EXACT_TOKENS_OUT = 2 - MANAGEMENT_FEE_TOKENS_OUT = 3 \ No newline at end of file + EXACT_BPT_IN_FOR_ONE_TOKEN_OUT = 0 + EXACT_BPT_IN_FOR_TOKENS_OUT = 1 + BPT_IN_FOR_EXACT_TOKENS_OUT = 2 + MANAGEMENT_FEE_TOKENS_OUT = 3 diff --git a/balpy/graph/__init__.py b/balpy/graph/__init__.py index 3334ed9..e69de29 100644 --- a/balpy/graph/__init__.py +++ b/balpy/graph/__init__.py @@ -1 +0,0 @@ -from balpy.graph import graph diff --git a/balpy/graph/graph.py b/balpy/graph/graph.py index 852e83a..072befe 100644 --- a/balpy/graph/graph.py +++ b/balpy/graph/graph.py @@ -4,304 +4,446 @@ import sys import time +# for customized endpoints +import requests + # thegraph queries -from gql import gql, Client +from gql import Client, gql from gql.transport.requests import RequestsHTTPTransport -# for customized endpoints -import requests +from balpy.enums.types import Chain, SwapType + +DEFAULT_SWAP_OPTIONS = { + "maxPools": 4, + "queryBatchSwap": True, +} + +BALANCER_API_ENDPOINT = "https://api-v3.balancer.fi/" + class TheGraph(object): - client = None; - - """ - A starting point for querying pool data from the Balancer Subgraph. - At time of writing, this package does not cover all types of queries - possible to the Balancer V2 Subgraph. It does, however, allow users - to query pool data, among other things. Types of queries will ultimately - grow to include all possible queries to the Balancer Subgraph. - - For more information on the Subgraph, please go to: - https://thegraph.com/legacy-explorer/subgraph/balancer-labs/balancer-v2 - """ - - def __init__(self, network="mainnet", customUrl=None, usingJsonEndpoint=False): - super(TheGraph, self).__init__() - self.network = network; - self.initBalV2Graph(customUrl=customUrl, usingJsonEndpoint=usingJsonEndpoint); - - def printJson(self, curr_dict): - print(json.dumps(curr_dict, indent=4)) - - def callCustomEndpoint(self, query): - - query = query.replace("\n"," "); - query = query.replace("\t",""); - queryDict = {"query":query}; - serializedData = json.dumps(queryDict); - headers = {"Content-Type":"application/json"}; - r = requests.post(self.graphUrl, data=serializedData, headers=headers); - response = r.json(); - return(response["data"]) - - def assertInit(self): - if self.client is None: - print() - print("[ERROR] Subgraph not initialized."); - print("Call \"initBalV2Graph(network)\" before calling this function.") - print() - return(None); - - def initBalV2Graph(self, customUrl, usingJsonEndpoint, verbose=False): - if not customUrl is None and usingJsonEndpoint: - self.client = "CUSTOM" - self.graphUrl = customUrl; - return(True); - - network_string = ""; - if not self.network == "mainnet": - network_string = "-" + self.network; - - if verbose: - print("Balancer V2 Subgraph initializing on:", self.network, "...") - - graphUrl = "https://api.thegraph.com/subgraphs/name/balancer-labs/balancer" + network_string + "-v2"; - if not customUrl is None and not usingJsonEndpoint: - graphUrl = customUrl; - - balancer_transport=RequestsHTTPTransport( - url=graphUrl, - verify=True, - retries=3 - ) - self.client = Client(transport=balancer_transport) - - if verbose: - print("Successfully initialized on network:", self.network); - - def getPoolTokens(self, pool_id, verbose=False): - - self.assertInit(); - - if verbose: - print("Querying tokens for pool with ID:", pool_id) - - pool_token_query = ''' - query {{ - poolTokens(first: 8, where: {{ poolId: "{pool_id}" }}) {{ - id - poolId {{ - id - }} - symbol - name - decimals - address - balance - weight - }} - }} - '''; - formatted_query_string = pool_token_query.format(pool_id=pool_id) - if self.client == "CUSTOM": - response = self.callCustomEndpoint(formatted_query_string); - else: - response = self.client.execute(gql(formatted_query_string)) - if verbose: - print("Got pool tokens.") - return(response["poolTokens"]) - - def getNumPools(self, verbose=False): - - self.assertInit(); - if verbose: - print("Querying number of pools...") - - # get number of balancer pools on v2 - balancers_query = ''' - query { - balancers(first: 5) { - id - poolCount - } - } - ''' - if self.client == "CUSTOM": - response = self.callCustomEndpoint(balancers_query); - else: - response = self.client.execute(gql(balancers_query)); - - if verbose: - print("Got response from the Subgraph") - - for balancer in response["balancers"]: - if balancer["id"] == "2": - num_pools = balancer["poolCount"] - return(num_pools) - return None; - - def getPools(self, batch_size, skips, verbose=False): - - self.assertInit(); - if verbose: - print("Querying pools #", skips, "through #", skips + batch_size, "...") - - query_string = ''' - query {{ - pools(first: {first}, skip: {skip}) {{ - id - address - poolType - strategyType - swapFee - }} - }} - ''' - formatted_query_string = query_string.format(first=batch_size, skip=skips) - if self.client == "CUSTOM": - response = self.callCustomEndpoint(formatted_query_string); - else: - response = self.client.execute(gql(formatted_query_string)) - - if verbose: - print("Got pools.") - return(response) - - def getV2Pools(self, batch_size, verbose=False): - - if self.client is None: - self.initBalV2Graph(verbose=verbose); - - num_pools = self.getNumPools(verbose=verbose); - num_calls = math.ceil(num_pools/batch_size) - - if verbose: - print("Querying",num_pools, "pools..."); - - # query all pools by batch to save time - pool_tokens = {}; - for i in range(num_calls): - response = self.getPools(batch_size, batch_size*i, verbose) - - for pool in response["pools"]: - curr_id = pool["id"] - curr_pool_token_data = self.getPoolTokens(curr_id, verbose=verbose); - pool_data = {}; - pool_data["tokens"] = curr_pool_token_data; - pool_data["poolType"] = pool["poolType"]; - pool_data["swapFee"] = pool["swapFee"]; - pool_tokens[curr_id] = pool_data; - return(pool_tokens) - - def getV2PoolIDs(self, batch_size, pool_filter=None, verbose=False): - - if self.client is None: - self.initBalV2Graph(verbose=verbose); - - num_pools = self.getNumPools(verbose=verbose); - num_calls = math.ceil(num_pools/batch_size) - - if verbose: - print("Querying",num_pools, "pools..."); - - # query all pools by batch to save time - poolIdsByType = {}; - for i in range(num_calls): - response = self.getPools(batch_size, batch_size*i, verbose) - for pool in response["pools"]: - if not pool_filter is None and not pool_filter.lower() in pool["poolType"].lower(): - continue; - if pool["poolType"] not in poolIdsByType.keys(): - poolIdsByType[pool["poolType"]] = []; - poolIdsByType[pool["poolType"]].append(pool["id"]) - header = {}; - header["stamp"] = time.time(); - poolCount = 0 - for t in poolIdsByType.keys(): - poolCount += len(poolIdsByType[t]) - header["numPools"] = poolCount; - - data = {}; - data["header"] = header; - data["pools"] = poolIdsByType - return(data) - - def getPoolBptPriceEstimate(self, poolId, verbose=False): - - self.assertInit(); - if verbose: - print("Getting data for pool", poolId, "from the subgraph...") - - query_string = ''' - query {{ - pools(where:{{id: "{poolId}"}}) {{ - totalShares - totalLiquidity - }} - }} - ''' - formatted_query_string = query_string.format(poolId=poolId); - response = self.client.execute(gql(formatted_query_string)); - - pool = response["pools"][0] - pricePerBpt = float(pool["totalLiquidity"])/float(pool["totalShares"]) - - if verbose: - print("Got price data:", pricePerBpt) - return(pricePerBpt) - - def getPoolsAndTokens(self, batch_size, skips, verbose=False): - self.assertInit(); - query_string = ''' - query {{ - pools(first: {first}, skip: {skip}) {{ - id - tokens {{ - token - {{ - id - }} - }} - }} - }} - ''' - formatted_query_string = query_string.format(first=batch_size, skip=skips) - - response = self.client.execute(gql(formatted_query_string)); - if self.client == "CUSTOM": - response = self.callCustomEndpoint(formatted_query_string); - else: - response = self.client.execute(gql(formatted_query_string)) - return(response) + client = None + + """ + A starting point for querying pool data from the Balancer Subgraph. + At time of writing, this package does not cover all types of queries + possible to the Balancer V2 Subgraph. It does, however, allow users + to query pool data, among other things. Types of queries will ultimately + grow to include all possible queries to the Balancer Subgraph. + + For more information on the Subgraph, please go to: + https://thegraph.com/legacy-explorer/subgraph/balancer-labs/balancer-v2 + """ + + def __init__(self, network="mainnet", customUrl=None, + usingJsonEndpoint=False): + super(TheGraph, self).__init__() + self.network = network + self.initBalV2Graph( + customUrl=customUrl, + usingJsonEndpoint=usingJsonEndpoint) + + def printJson(self, curr_dict): + print(json.dumps(curr_dict, indent=4)) + + def callCustomEndpoint(self, query): + query = query.replace("\n", " ") + query = query.replace("\t", "") + queryDict = {"query": query} + serializedData = json.dumps(queryDict) + headers = {"Content-Type": "application/json"} + r = requests.post(self.graphUrl, data=serializedData, headers=headers) + response = r.json() + return response["data"] + + def assertInit(self): + if self.client is None: + print() + print("[ERROR] Subgraph not initialized.") + print('Call "initBalV2Graph(network)" before calling this function.') + print() + return None + + def initBalV2Graph(self, customUrl, usingJsonEndpoint, verbose=False): + if customUrl is not None and usingJsonEndpoint: + self.client = "CUSTOM" + self.graphUrl = customUrl + return True + + network_string = "" + if not self.network == "mainnet": + network_string = "-" + self.network + + if verbose: + print("Balancer V2 Subgraph initializing on:", self.network, "...") + + graphUrl = ( + "https://api.thegraph.com/subgraphs/name/balancer-labs/balancer" + + network_string + + "-v2" + ) + if customUrl is not None and not usingJsonEndpoint: + graphUrl = customUrl + + balancer_transport = RequestsHTTPTransport( + url=graphUrl, verify=True, retries=3) + self.client = Client(transport=balancer_transport) + + if verbose: + print("Successfully initialized on network:", self.network) + + def getPoolTokens(self, pool_id, verbose=False): + self.assertInit() + + if verbose: + print("Querying tokens for pool with ID:", pool_id) + + pool_token_query = """ + query {{ + poolTokens(first: 8, where: {{ poolId: "{pool_id}" }}) {{ + id + poolId {{ + id + }} + symbol + name + decimals + address + balance + weight + }} + }} + """ + formatted_query_string = pool_token_query.format(pool_id=pool_id) + if self.client == "CUSTOM": + response = self.callCustomEndpoint(formatted_query_string) + else: + response = self.client.execute(gql(formatted_query_string)) + if verbose: + print("Got pool tokens.") + return response["poolTokens"] + + def getNumPools(self, verbose=False): + self.assertInit() + if verbose: + print("Querying number of pools...") + + # get number of balancer pools on v2 + balancers_query = """ + query { + balancers(first: 5) { + id + poolCount + } + } + """ + if self.client == "CUSTOM": + response = self.callCustomEndpoint(balancers_query) + else: + response = self.client.execute(gql(balancers_query)) + + if verbose: + print("Got response from the Subgraph") + + for balancer in response["balancers"]: + if balancer["id"] == "2": + num_pools = balancer["poolCount"] + return num_pools + return None + + def getPools(self, batch_size, skips, verbose=False): + self.assertInit() + if verbose: + print( + "Querying pools #", + skips, + "through #", + skips + + batch_size, + "...") + + query_string = """ + query {{ + pools(first: {first}, skip: {skip}) {{ + id + address + poolType + strategyType + swapFee + }} + }} + """ + formatted_query_string = query_string.format( + first=batch_size, skip=skips) + if self.client == "CUSTOM": + response = self.callCustomEndpoint(formatted_query_string) + else: + response = self.client.execute(gql(formatted_query_string)) + + if verbose: + print("Got pools.") + return response + + def getV2Pools(self, batch_size, verbose=False): + if self.client is None: + self.initBalV2Graph(verbose=verbose) + + num_pools = self.getNumPools(verbose=verbose) + num_calls = math.ceil(num_pools / batch_size) + + if verbose: + print("Querying", num_pools, "pools...") + + # query all pools by batch to save time + pool_tokens = {} + for i in range(num_calls): + response = self.getPools(batch_size, batch_size * i, verbose) + + for pool in response["pools"]: + curr_id = pool["id"] + curr_pool_token_data = self.getPoolTokens( + curr_id, verbose=verbose) + pool_data = {} + pool_data["tokens"] = curr_pool_token_data + pool_data["poolType"] = pool["poolType"] + pool_data["swapFee"] = pool["swapFee"] + pool_tokens[curr_id] = pool_data + return pool_tokens + + def getV2PoolIDs(self, batch_size, pool_filter=None, verbose=False): + if self.client is None: + self.initBalV2Graph(verbose=verbose) + + num_pools = self.getNumPools(verbose=verbose) + num_calls = math.ceil(num_pools / batch_size) + + if verbose: + print("Querying", num_pools, "pools...") + + # query all pools by batch to save time + poolIdsByType = {} + for i in range(num_calls): + response = self.getPools(batch_size, batch_size * i, verbose) + for pool in response["pools"]: + if ( + pool_filter is not None + and not pool_filter.lower() in pool["poolType"].lower() + ): + continue + if pool["poolType"] not in poolIdsByType.keys(): + poolIdsByType[pool["poolType"]] = [] + poolIdsByType[pool["poolType"]].append(pool["id"]) + header = {} + header["stamp"] = time.time() + poolCount = 0 + for t in poolIdsByType.keys(): + poolCount += len(poolIdsByType[t]) + header["numPools"] = poolCount + + data = {} + data["header"] = header + data["pools"] = poolIdsByType + return data + + def getPoolBptPriceEstimate(self, poolId, verbose=False): + self.assertInit() + if verbose: + print("Getting data for pool", poolId, "from the subgraph...") + + query_string = """ + query {{ + pools(where:{{id: "{poolId}"}}) {{ + totalShares + totalLiquidity + }} + }} + """ + formatted_query_string = query_string.format(poolId=poolId) + response = self.client.execute(gql(formatted_query_string)) + + pool = response["pools"][0] + pricePerBpt = float(pool["totalLiquidity"]) / \ + float(pool["totalShares"]) + + if verbose: + print("Got price data:", pricePerBpt) + return pricePerBpt + + def getPoolsAndTokens(self, batch_size, skips, verbose=False): + self.assertInit() + query_string = """ + query {{ + pools(first: {first}, skip: {skip}) {{ + id + tokens {{ + token + {{ + id + }} + }} + }} + }} + """ + formatted_query_string = query_string.format( + first=batch_size, skip=skips) + + response = self.client.execute(gql(formatted_query_string)) + if self.client == "CUSTOM": + response = self.callCustomEndpoint(formatted_query_string) + else: + response = self.client.execute(gql(formatted_query_string)) + return response + + def getSorGetSwapPaths( + self, + chain: Chain, + swapAmount: float, + tokenIn: str, + tokenOut: str, + swapType: str = SwapType.EXACT_IN.value, + swapOptions: dict = None, + queryBatchSwap: bool = True, + retries: int = 3, + ): + """ + Calls the SOR api from the Balancer to get swap paths. + Args: + chain (Chain): The chain to query. + swapAmount (float): The amount to swap. + tokenIn (str): The token to swap in. + tokenOut (str): The token to swap out. + swapType (SwapType, optional): The type of swap. Defaults to SwapType.EXACT_IN. + swapOptions (dict, optional): The options for the swap. Defaults to None. + queryBatchSwap (bool, optional): Whether to query batch swap. Defaults to True. + Returns: + dict: The response from the SOR. + + """ + if not swapOptions: + swapOptions = DEFAULT_SWAP_OPTIONS + swapOptions["timestamp"] = int(time.time()) + query_string = """ + query sorGetSwapPaths( + $chain: GqlChain!, + $swapAmount: AmountHumanReadable!, + $queryBatchSwap: Boolean!, + $swapType: GqlSorSwapType!, + $tokenIn: String!, + $tokenOut: String!, + $callDataInput: GqlSwapCallDataInput, + $useProtocolVersion: Int + ) { + sorGetSwapPaths( + chain: $chain, + swapAmount: $swapAmount, + queryBatchSwap: $queryBatchSwap, + swapType: $swapType, + tokenIn: $tokenIn, + tokenOut: $tokenOut, + callDataInput: $callDataInput, + useProtocolVersion: $useProtocolVersion + ) { + swaps { + assetOutIndex, + amount, + assetInIndex, + poolId + } + + returnAmount, + tokenInAmount, + tokenOutAmount, + effectivePrice, + tokenAddresses + } + } + """ + params = { + "chain": chain.upper(), + "swapAmount": swapAmount, + "tokenIn": tokenIn, + "tokenOut": tokenOut, + "swapType": swapType, + "queryBatchSwap": queryBatchSwap, + } + + response = requests.post( + BALANCER_API_ENDPOINT, json={ + "query": query_string, "variables": params} + ) + if response.status_code != 200: + if "banned" in response.text and retries > 0: + # We sleep for 5 seconds to avoid being banned + time.sleep(5) + print ( + "We got banned from the Balancer API. Sleeping for 5 seconds." + ) + return self.getSorGetSwapPaths( + chain, swapAmount, tokenIn, tokenOut, swapType, swapOptions, queryBatchSwap + ) + + raise Exception( + f"Error querying the Balancer API: {response.text} {response.status_code}" + ) + + return response.json()["data"]["sorGetSwapPaths"] + + def getCurrentPrices( + self, + chain: Chain, + cooldown: int = 5, + retries: int = 0, + ): + """ + get the current prices of all pools + """ + query = """ + query GetTokenCurrentPrices($chains: [GqlChain!]) { + tokenGetCurrentPrices(chains: $chains) { + price + address + } + } + """ + response = requests.post( + BALANCER_API_ENDPOINT, json={ + "query": query, + "variables": {"chains": [chain.upper()]} + } + ) + if response.status_code in [429, 500]: + timeout = cooldown * (retries + 1) + print(f"We got banned from the Balancer API. Sleeping for {timeout} seconds.") + time.sleep(timeout) + return self.getCurrentPrices(chain, cooldown, retries + 1) + return response.json()["data"]["tokenGetCurrentPrices"] + def main(): - - batch_size = 30; - print(); - - if len(sys.argv) < 2: - print("Usage: python", sys.argv[0], ""); - print("No network given; defaulting to mainnet Ethereum") - network = "mainnet" - else: - network = sys.argv[1]; - - networks = ["mainnet", "kovan", "polygon", "arbitrum"]; - - if not network in networks: - print("Network", network, "is not supported!"); - print("Supported networks are:"); - for n in networks: - print("\t" + n); - print("Quitting") - quit(); - - verbose = True; - - graph = TheGraph(network) - # pools = graph.getNumPools(verbose=verbose) - pools = graph.getV2Pools(batch_size, verbose=verbose) - graph.printJson(pools) - -if __name__ == '__main__': - main(); + network = Chain.GNOSIS.value + + graph = TheGraph( + network, + customUrl=BALANCER_API_ENDPOINT, + usingJsonEndpoint=True) + + for i in range(0, 10): + config = { + "chain": network, + "swapAmount": str(50.00 * (1 + i**3)), + "swapType": "EXACT_IN", + # "tokenOut": "0xcE11e14225575945b8E6Dc0D4F2dD4C570f79d9f", + # "tokenIn": "0xe91d153e0b41518a2ce8dd3d7944fa863463a97d", + "tokenIn": "0xcE11e14225575945b8E6Dc0D4F2dD4C570f79d9f", + "tokenOut": "0xe91d153e0b41518a2ce8dd3d7944fa863463a97d", + } + + paths = graph.getSorGetSwapPaths(**config) + rate = paths["effectivePrice"] + print( + f"{1 / float(rate) } for 1 {config['tokenIn']} to {config['tokenOut']} size: {config['swapAmount']} output: {paths['returnAmount']}" + ) + + +if __name__ == "__main__": + main() diff --git a/generateMissingPoolArtifacts.py b/generateMissingPoolArtifacts.py index 796af43..9c55679 100644 --- a/generateMissingPoolArtifacts.py +++ b/generateMissingPoolArtifacts.py @@ -1,60 +1,66 @@ -import os import json +import os + def main(): + deprecated_string = "" + for i in range(2): + # Traverse all deprecated tasks + path = os.path.join( + "./balpy/balancer-deployments/tasks/", + deprecated_string) + dir_list = sorted(os.listdir(path)) + + # filter out deprecated and scripts folders in the upper level folder + dir_list = [d for d in dir_list if d not in ["deprecated", "scripts"]] + + # Filter for pool factories + full_paths = [os.path.join(path, d) for d in dir_list] + full_dir_paths = [ + d for d in full_paths if os.path.isdir(d) and "pool" in d.lower() + ] + + for p in full_dir_paths: + print("Traversing", p) + files = os.listdir(os.path.join(p, "artifact")) + + for f in files: + if "pool" in f.lower() and "factory" in f.lower(): + # Check to see if there is an artifact for the pool AND the + # factory + print("\tFound factory:", f) + pool_file = "".join(f.split("Factory")) + print("\tTarget pool file:", pool_file) + pool_path = os.path.join(p, "artifact", pool_file) + pool_file_exists = os.path.exists(pool_path) + print("\tPool file exists:", pool_file_exists) + + # If not pool artifact exists, extract it from the pool + # factory's build-info + if not pool_file_exists: + print("\tAttempting to generate from build-info...") + build_info_path = os.path.join(p, "build-info", f) + + with open(build_info_path) as x: + build_info = json.load(x) + contracts = build_info["output"]["contracts"] + for k in contracts.keys(): + file_name = k.split("/")[-1] + pool_name = pool_file.split(".")[0] + contract_file = pool_name + ".sol" + + if file_name == contract_file: + abi = { + "abi": contracts[k][pool_name]["abi"]} + print("\tPool ABI exists in build-info!") + + # Save to artifacts + with open(pool_path, "w") as pp: + json.dump(abi, pp) + + print() + deprecated_string = "deprecated" + - deprecated_string = "" - for i in range(2): - # Traverse all deprecated tasks - path = os.path.join("./balpy/balancer-deployments/tasks/", deprecated_string) - dir_list = os.listdir(path) - dir_list.sort() - - # filter out deprecated and scripts folders in the upper level folder - dir_list = [d for d in dir_list if not d in ["deprecated","scripts"]]; - - # Filter for pool factories - full_paths = [os.path.join(path, d) for d in dir_list] - full_dir_paths = [d for d in full_paths if os.path.isdir(d) and "pool" in d.lower()] - - for p in full_dir_paths: - print("Traversing", p) - files = os.listdir(os.path.join(p, "artifact")); - - for f in files: - if "pool" in f.lower() and "factory" in f.lower(): - - # Check to see if there is an artifact for the pool AND the factory - print("\tFound factory:", f) - pool_file = "".join(f.split("Factory")); - print("\tTarget pool file:", pool_file) - pool_path = os.path.join(p, "artifact", pool_file) - pool_file_exists = os.path.exists(pool_path) - print("\tPool file exists:", pool_file_exists) - - # If not pool artifact exists, extract it from the pool factory's build-info - if not pool_file_exists: - print("\tAttempting to generate from build-info...") - build_info_path = os.path.join(p, "build-info", f) - - with open(build_info_path) as x: - build_info = json.load(x) - contracts = build_info["output"]["contracts"] - for k in contracts.keys(): - file_name = k.split("/")[-1]; - pool_name = pool_file.split(".")[0] - contract_file = pool_name + ".sol" - - if file_name == contract_file: - abi = {"abi":contracts[k][pool_name]["abi"]}; - print("\tPool ABI exists in build-info!") - - # Save to artifacts - with open(pool_path, 'w') as pp: - json.dump(abi, pp) - - print() - deprecated_string = "deprecated" - -if __name__ == '__main__': - main() \ No newline at end of file +if __name__ == "__main__": + main() diff --git a/makefile b/makefile new file mode 100644 index 0000000..4086462 --- /dev/null +++ b/makefile @@ -0,0 +1,13 @@ +fmt: + poetry run isort samples tests + poetry run black samples tests + poetry run autopep8 samples tests --recursive --in-place -a + poetry run autoflake8 samples tests --recursive --remove-unused-variables --in-place + +lint: + poetry run flake8 samples tests --max-line-length=150 + +test: + poetry run pytest tests + +all: fmt lint test \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index 34d6f38..1d18cc0 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,83 +1,842 @@ +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. + [[package]] -name = "atomicwrites" -version = "1.4.0" -description = "Atomic file writes." -category = "dev" +name = "aiohappyeyeballs" +version = "2.4.4" +description = "Happy Eyeballs for asyncio" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" +files = [ + {file = "aiohappyeyeballs-2.4.4-py3-none-any.whl", hash = "sha256:a980909d50efcd44795c4afeca523296716d50cd756ddca6af8c65b996e27de8"}, + {file = "aiohappyeyeballs-2.4.4.tar.gz", hash = "sha256:5fdd7d87889c63183afc18ce9271f9b0a7d32c2303e394468dd45d514a757745"}, +] + +[[package]] +name = "aiohttp" +version = "3.11.11" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a60804bff28662cbcf340a4d61598891f12eea3a66af48ecfdc975ceec21e3c8"}, + {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b4fa1cb5f270fb3eab079536b764ad740bb749ce69a94d4ec30ceee1b5940d5"}, + {file = "aiohttp-3.11.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:731468f555656767cda219ab42e033355fe48c85fbe3ba83a349631541715ba2"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb23d8bb86282b342481cad4370ea0853a39e4a32a0042bb52ca6bdde132df43"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f047569d655f81cb70ea5be942ee5d4421b6219c3f05d131f64088c73bb0917f"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd7659baae9ccf94ae5fe8bfaa2c7bc2e94d24611528395ce88d009107e00c6d"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af01e42ad87ae24932138f154105e88da13ce7d202a6de93fafdafb2883a00ef"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5854be2f3e5a729800bac57a8d76af464e160f19676ab6aea74bde18ad19d438"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6526e5fb4e14f4bbf30411216780c9967c20c5a55f2f51d3abd6de68320cc2f3"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:85992ee30a31835fc482468637b3e5bd085fa8fe9392ba0bdcbdc1ef5e9e3c55"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:88a12ad8ccf325a8a5ed80e6d7c3bdc247d66175afedbe104ee2aaca72960d8e"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0a6d3fbf2232e3a08c41eca81ae4f1dff3d8f1a30bae415ebe0af2d2458b8a33"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84a585799c58b795573c7fa9b84c455adf3e1d72f19a2bf498b54a95ae0d194c"}, + {file = "aiohttp-3.11.11-cp310-cp310-win32.whl", hash = "sha256:bfde76a8f430cf5c5584553adf9926534352251d379dcb266ad2b93c54a29745"}, + {file = "aiohttp-3.11.11-cp310-cp310-win_amd64.whl", hash = "sha256:0fd82b8e9c383af11d2b26f27a478640b6b83d669440c0a71481f7c865a51da9"}, + {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ba74ec819177af1ef7f59063c6d35a214a8fde6f987f7661f4f0eecc468a8f76"}, + {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4af57160800b7a815f3fe0eba9b46bf28aafc195555f1824555fa2cfab6c1538"}, + {file = "aiohttp-3.11.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffa336210cf9cd8ed117011085817d00abe4c08f99968deef0013ea283547204"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81b8fe282183e4a3c7a1b72f5ade1094ed1c6345a8f153506d114af5bf8accd9"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af41686ccec6a0f2bdc66686dc0f403c41ac2089f80e2214a0f82d001052c03"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70d1f9dde0e5dd9e292a6d4d00058737052b01f3532f69c0c65818dac26dc287"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:249cc6912405917344192b9f9ea5cd5b139d49e0d2f5c7f70bdfaf6b4dbf3a2e"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0eb98d90b6690827dcc84c246811feeb4e1eea683c0eac6caed7549be9c84665"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec82bf1fda6cecce7f7b915f9196601a1bd1a3079796b76d16ae4cce6d0ef89b"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9fd46ce0845cfe28f108888b3ab17abff84ff695e01e73657eec3f96d72eef34"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd176afcf8f5d2aed50c3647d4925d0db0579d96f75a31e77cbaf67d8a87742d"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ec2aa89305006fba9ffb98970db6c8221541be7bee4c1d027421d6f6df7d1ce2"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:92cde43018a2e17d48bb09c79e4d4cb0e236de5063ce897a5e40ac7cb4878773"}, + {file = "aiohttp-3.11.11-cp311-cp311-win32.whl", hash = "sha256:aba807f9569455cba566882c8938f1a549f205ee43c27b126e5450dc9f83cc62"}, + {file = "aiohttp-3.11.11-cp311-cp311-win_amd64.whl", hash = "sha256:ae545f31489548c87b0cced5755cfe5a5308d00407000e72c4fa30b19c3220ac"}, + {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e595c591a48bbc295ebf47cb91aebf9bd32f3ff76749ecf282ea7f9f6bb73886"}, + {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ea1b59dc06396b0b424740a10a0a63974c725b1c64736ff788a3689d36c02d2"}, + {file = "aiohttp-3.11.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8811f3f098a78ffa16e0ea36dffd577eb031aea797cbdba81be039a4169e242c"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7227b87a355ce1f4bf83bfae4399b1f5bb42e0259cb9405824bd03d2f4336a"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d40f9da8cabbf295d3a9dae1295c69975b86d941bc20f0a087f0477fa0a66231"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffb3dc385f6bb1568aa974fe65da84723210e5d9707e360e9ecb51f59406cd2e"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f5f7515f3552d899c61202d99dcb17d6e3b0de777900405611cd747cecd1b8"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3499c7ffbfd9c6a3d8d6a2b01c26639da7e43d47c7b4f788016226b1e711caa8"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8e2bf8029dbf0810c7bfbc3e594b51c4cc9101fbffb583a3923aea184724203c"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6212a60e5c482ef90f2d788835387070a88d52cf6241d3916733c9176d39eab"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d119fafe7b634dbfa25a8c597718e69a930e4847f0b88e172744be24515140da"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:6fba278063559acc730abf49845d0e9a9e1ba74f85f0ee6efd5803f08b285853"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92fc484e34b733704ad77210c7957679c5c3877bd1e6b6d74b185e9320cc716e"}, + {file = "aiohttp-3.11.11-cp312-cp312-win32.whl", hash = "sha256:9f5b3c1ed63c8fa937a920b6c1bec78b74ee09593b3f5b979ab2ae5ef60d7600"}, + {file = "aiohttp-3.11.11-cp312-cp312-win_amd64.whl", hash = "sha256:1e69966ea6ef0c14ee53ef7a3d68b564cc408121ea56c0caa2dc918c1b2f553d"}, + {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:541d823548ab69d13d23730a06f97460f4238ad2e5ed966aaf850d7c369782d9"}, + {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:929f3ed33743a49ab127c58c3e0a827de0664bfcda566108989a14068f820194"}, + {file = "aiohttp-3.11.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0882c2820fd0132240edbb4a51eb8ceb6eef8181db9ad5291ab3332e0d71df5f"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b63de12e44935d5aca7ed7ed98a255a11e5cb47f83a9fded7a5e41c40277d104"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa54f8ef31d23c506910c21163f22b124facb573bff73930735cf9fe38bf7dff"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a344d5dc18074e3872777b62f5f7d584ae4344cd6006c17ba12103759d407af3"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7fb429ab1aafa1f48578eb315ca45bd46e9c37de11fe45c7f5f4138091e2f1"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c341c7d868750e31961d6d8e60ff040fb9d3d3a46d77fd85e1ab8e76c3e9a5c4"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed9ee95614a71e87f1a70bc81603f6c6760128b140bc4030abe6abaa988f1c3d"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:de8d38f1c2810fa2a4f1d995a2e9c70bb8737b18da04ac2afbf3971f65781d87"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a9b7371665d4f00deb8f32208c7c5e652059b0fda41cf6dbcac6114a041f1cc2"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:620598717fce1b3bd14dd09947ea53e1ad510317c85dda2c9c65b622edc96b12"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf8d9bfee991d8acc72d060d53860f356e07a50f0e0d09a8dfedea1c554dd0d5"}, + {file = "aiohttp-3.11.11-cp313-cp313-win32.whl", hash = "sha256:9d73ee3725b7a737ad86c2eac5c57a4a97793d9f442599bea5ec67ac9f4bdc3d"}, + {file = "aiohttp-3.11.11-cp313-cp313-win_amd64.whl", hash = "sha256:c7a06301c2fb096bdb0bd25fe2011531c1453b9f2c163c8031600ec73af1cc99"}, + {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3e23419d832d969f659c208557de4a123e30a10d26e1e14b73431d3c13444c2e"}, + {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21fef42317cf02e05d3b09c028712e1d73a9606f02467fd803f7c1f39cc59add"}, + {file = "aiohttp-3.11.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f21bb8d0235fc10c09ce1d11ffbd40fc50d3f08a89e4cf3a0c503dc2562247a"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1642eceeaa5ab6c9b6dfeaaa626ae314d808188ab23ae196a34c9d97efb68350"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2170816e34e10f2fd120f603e951630f8a112e1be3b60963a1f159f5699059a6"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8be8508d110d93061197fd2d6a74f7401f73b6d12f8822bbcd6d74f2b55d71b1"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eed954b161e6b9b65f6be446ed448ed3921763cc432053ceb606f89d793927e"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6c9af134da4bc9b3bd3e6a70072509f295d10ee60c697826225b60b9959acdd"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:44167fc6a763d534a6908bdb2592269b4bf30a03239bcb1654781adf5e49caf1"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:479b8c6ebd12aedfe64563b85920525d05d394b85f166b7873c8bde6da612f9c"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:10b4ff0ad793d98605958089fabfa350e8e62bd5d40aa65cdc69d6785859f94e"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b540bd67cfb54e6f0865ceccd9979687210d7ed1a1cc8c01f8e67e2f1e883d28"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1dac54e8ce2ed83b1f6b1a54005c87dfed139cf3f777fdc8afc76e7841101226"}, + {file = "aiohttp-3.11.11-cp39-cp39-win32.whl", hash = "sha256:568c1236b2fde93b7720f95a890741854c1200fba4a3471ff48b2934d2d93fd3"}, + {file = "aiohttp-3.11.11-cp39-cp39-win_amd64.whl", hash = "sha256:943a8b052e54dfd6439fd7989f67fc6a7f2138d0a2cf0a7de5f18aa4fe7eb3b1"}, + {file = "aiohttp-3.11.11.tar.gz", hash = "sha256:bb49c7f1e6ebf3821a42d81d494f538107610c3a705987f53068546b0e90303e"}, +] + +[package.dependencies] +aiohappyeyeballs = ">=2.3.0" +aiosignal = ">=1.1.2" +async-timeout = {version = ">=4.0,<6.0", markers = "python_version < \"3.11\""} +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +propcache = ">=0.2.0" +yarl = ">=1.17.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] + +[[package]] +name = "aiosignal" +version = "1.3.2" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.9" +files = [ + {file = "aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5"}, + {file = "aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "anyio" +version = "4.8.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.9" +files = [ + {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"}, + {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} + +[package.extras] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] +trio = ["trio (>=0.26.1)"] + +[[package]] +name = "async-timeout" +version = "5.0.1" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, + {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, +] [[package]] name = "attrs" -version = "21.2.0" +version = "24.3.0" description = "Classes Without Boilerplate" -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.8" +files = [ + {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, + {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, +] [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] -docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] -name = "base58" -version = "2.1.1" -description = "Base58 and Base58Check implementation." -category = "main" +name = "autoflake8" +version = "0.4.1" +description = "Tool to automatically fix some issues reported by flake8 (forked from autoflake)." optional = false -python-versions = ">=3.5" +python-versions = ">=3.7,<4.0" +files = [ + {file = "autoflake8-0.4.1-py3-none-any.whl", hash = "sha256:fdf663b627993ac38e5b55b7d742c388fb2a4f34798a052f43eecc5e8d629e9d"}, + {file = "autoflake8-0.4.1.tar.gz", hash = "sha256:c17da499bd2b71ba02fb11fe53ff1ad83d7dae6efb0f115fd1344f467797c679"}, +] -[package.extras] -tests = ["mypy", "PyHamcrest (>=2.0.2)", "pytest (>=4.6)", "pytest-benchmark", "pytest-cov", "pytest-flake8"] +[package.dependencies] +pyflakes = ">=2.3.0" + +[[package]] +name = "autopep8" +version = "2.2.0" +description = "A tool that automatically formats Python code to conform to the PEP 8 style guide" +optional = false +python-versions = ">=3.8" +files = [ + {file = "autopep8-2.2.0-py2.py3-none-any.whl", hash = "sha256:05418a981f038969d8bdcd5636bf15948db7555ae944b9f79b5a34b35f1370d4"}, + {file = "autopep8-2.2.0.tar.gz", hash = "sha256:d306a0581163ac29908280ad557773a95a9bede072c0fafed6f141f5311f43c1"}, +] + +[package.dependencies] +pycodestyle = ">=2.11.0" +tomli = {version = "*", markers = "python_version < \"3.11\""} + +[[package]] +name = "backoff" +version = "2.2.1" +description = "Function decoration for backoff and retry" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, + {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, +] [[package]] name = "bitarray" -version = "1.2.2" +version = "3.0.0" description = "efficient arrays of booleans -- C extension" -category = "main" optional = false python-versions = "*" +files = [ + {file = "bitarray-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ddbf71a97ad1d6252e6e93d2d703b624d0a5b77c153b12f9ea87d83e1250e0c"}, + {file = "bitarray-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0e7f24a0b01e6e6a0191c50b06ca8edfdec1988d9d2b264d669d2487f4f4680"}, + {file = "bitarray-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:150b7b29c36d9f1a24779aea723fdfc73d1c1c161dc0ea14990da27d4e947092"}, + {file = "bitarray-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8330912be6cb8e2fbfe8eb69f82dee139d605730cadf8d50882103af9ac83bb4"}, + {file = "bitarray-3.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e56ba8be5f17dee0ffa6d6ce85251e062ded2faa3cbd2558659c671e6c3bf96d"}, + {file = "bitarray-3.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffd94b4803811c738e504a4b499fb2f848b2f7412d71e6b517508217c1d7929d"}, + {file = "bitarray-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0255bd05ec7165e512c115423a5255a3f301417973d20a80fc5bfc3f3640bcb"}, + {file = "bitarray-3.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe606e728842389943a939258809dc5db2de831b1d2e0118515059e87f7bbc1a"}, + {file = "bitarray-3.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e89ea59a3ed86a6eb150d016ed28b1bedf892802d0ed32b5659d3199440f3ced"}, + {file = "bitarray-3.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:cf0cc2e91dd38122dec2e6541efa99aafb0a62e118179218181eff720b4b8153"}, + {file = "bitarray-3.0.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:2d9fe3ee51afeb909b68f97e14c6539ace3f4faa99b21012e610bbe7315c388d"}, + {file = "bitarray-3.0.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:37be5482b9df3105bad00fdf7dc65244e449b130867c3879c9db1db7d72e508b"}, + {file = "bitarray-3.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0027b8f3bb2bba914c79115e96a59b9924aafa1a578223a7c4f0a7242d349842"}, + {file = "bitarray-3.0.0-cp310-cp310-win32.whl", hash = "sha256:628f93e9c2c23930bd1cfe21c634d6c84ec30f45f23e69aefe1fcd262186d7bb"}, + {file = "bitarray-3.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:0b655c3110e315219e266b2732609fddb0857bc69593de29f3c2ba74b7d3f51a"}, + {file = "bitarray-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:44c3e78b60070389b824d5a654afa1c893df723153c81904088d4922c3cfb6ac"}, + {file = "bitarray-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:545d36332de81e4742a845a80df89530ff193213a50b4cbef937ed5a44c0e5e5"}, + {file = "bitarray-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a9eb510cde3fa78c2e302bece510bf5ed494ec40e6b082dec753d6e22d5d1b1"}, + {file = "bitarray-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e3727ab63dfb6bde00b281934e2212bb7529ea3006c0031a556a84d2268bea5"}, + {file = "bitarray-3.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2055206ed653bee0b56628f6a4d248d53e5660228d355bbec0014bdfa27050ae"}, + {file = "bitarray-3.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:147542299f458bdb177f798726e5f7d39ab8491de4182c3c6d9885ed275a3c2b"}, + {file = "bitarray-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f761184b93092077c7f6b7dad7bd4e671c1620404a76620da7872ceb576a94"}, + {file = "bitarray-3.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e008b7b4ce6c7f7a54b250c45c28d4243cc2a3bbfd5298fa7dac92afda229842"}, + {file = "bitarray-3.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dfea514e665af278b2e1d4deb542de1cd4f77413bee83dd15ae16175976ea8d5"}, + {file = "bitarray-3.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:66d6134b7bb737b88f1d16478ad0927c571387f6054f4afa5557825a4c1b78e2"}, + {file = "bitarray-3.0.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3cd565253889940b4ec4768d24f101d9fe111cad4606fdb203ea16f9797cf9ed"}, + {file = "bitarray-3.0.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:4800c91a14656789d2e67d9513359e23e8a534c8ee1482bb9b517a4cfc845200"}, + {file = "bitarray-3.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c2945e0390d1329c585c584c6b6d78be017d9c6a1288f9c92006fe907f69cc28"}, + {file = "bitarray-3.0.0-cp311-cp311-win32.whl", hash = "sha256:c23286abba0cb509733c6ce8f4013cd951672c332b2e184dbefbd7331cd234c8"}, + {file = "bitarray-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:ca79f02a98cbda1472449d440592a2fe2ad96fe55515a0447fa8864a38017cf8"}, + {file = "bitarray-3.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:184972c96e1c7e691be60c3792ca1a51dd22b7f25d96ebea502fe3c9b554f25d"}, + {file = "bitarray-3.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:787db8da5e9e29be712f7a6bce153c7bc8697ccc2c38633e347bb9c82475d5c9"}, + {file = "bitarray-3.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2da91ab3633c66999c2a352f0ca9ae064f553e5fc0eca231d28e7e305b83e942"}, + {file = "bitarray-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7edb83089acbf2c86c8002b96599071931dc4ea5e1513e08306f6f7df879a48b"}, + {file = "bitarray-3.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996d1b83eb904589f40974538223eaed1ab0f62be8a5105c280b9bd849e685c4"}, + {file = "bitarray-3.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4817d73d995bd2b977d9cde6050be8d407791cf1f84c8047fa0bea88c1b815bc"}, + {file = "bitarray-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d47bc4ff9b0e1624d613563c6fa7b80aebe7863c56c3df5ab238bb7134e8755"}, + {file = "bitarray-3.0.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aca0a9cd376beaccd9f504961de83e776dd209c2de5a4c78dc87a78edf61839b"}, + {file = "bitarray-3.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:572a61fba7e3a710a8324771322fba8488d134034d349dcd036a7aef74723a80"}, + {file = "bitarray-3.0.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a817ad70c1aff217530576b4f037dd9b539eb2926603354fcac605d824082ad1"}, + {file = "bitarray-3.0.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:2ac67b658fa5426503e9581a3fb44a26a3b346c1abd17105735f07db572195b3"}, + {file = "bitarray-3.0.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:12f19ede03e685c5c588ab5ed63167999295ffab5e1126c5fe97d12c0718c18f"}, + {file = "bitarray-3.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fcef31b062f756ba7eebcd7890c5d5de84b9d64ee877325257bcc9782288564a"}, + {file = "bitarray-3.0.0-cp312-cp312-win32.whl", hash = "sha256:656db7bdf1d81ec3b57b3cad7ec7276765964bcfd0eb81c5d1331f385298169c"}, + {file = "bitarray-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:f785af6b7cb07a9b1e5db0dea9ef9e3e8bb3d74874a0a61303eab9c16acc1999"}, + {file = "bitarray-3.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7cb885c043000924554fe2124d13084c8fdae03aec52c4086915cd4cb87fe8be"}, + {file = "bitarray-3.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7814c9924a0b30ecd401f02f082d8697fc5a5be3f8d407efa6e34531ff3c306a"}, + {file = "bitarray-3.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bcf524a087b143ba736aebbb054bb399d49e77cf7c04ed24c728e411adc82bfa"}, + {file = "bitarray-3.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1d5abf1d6d910599ac16afdd9a0ed3e24f3b46af57f3070cf2792f236f36e0b"}, + {file = "bitarray-3.0.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9929051feeaf8d948cc0b1c9ce57748079a941a1a15c89f6014edf18adaade84"}, + {file = "bitarray-3.0.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96cf0898f8060b2d3ae491762ae871b071212ded97ff9e1e3a5229e9fefe544c"}, + {file = "bitarray-3.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab37da66a8736ad5a75a58034180e92c41e864da0152b84e71fcc253a2f69cd4"}, + {file = "bitarray-3.0.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeb79e476d19b91fd6a3439853e4e5ba1b3b475920fa40d62bde719c8af786f"}, + {file = "bitarray-3.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f75fc0198c955d840b836059bd43e0993edbf119923029ca60c4fc017cefa54a"}, + {file = "bitarray-3.0.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f12cc7c7638074918cdcc7491aff897df921b092ffd877227892d2686e98f876"}, + {file = "bitarray-3.0.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dbe1084935b942fab206e609fa1ed3f46ad1f2612fb4833e177e9b2a5e006c96"}, + {file = "bitarray-3.0.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ac06dd72ee1e1b6e312504d06f75220b5894af1fb58f0c20643698f5122aea76"}, + {file = "bitarray-3.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00f9a88c56e373009ac3c73c55205cfbd9683fbd247e2f9a64bae3da78795252"}, + {file = "bitarray-3.0.0-cp313-cp313-win32.whl", hash = "sha256:9c6e52005e91803eb4e08c0a08a481fb55ddce97f926bae1f6fa61b3396b5b61"}, + {file = "bitarray-3.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:cb98d5b6eac4b2cf2a5a69f60a9c499844b8bea207059e9fc45c752436e6bb49"}, + {file = "bitarray-3.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:eb27c01b747649afd7e1c342961680893df6d8d81f832a6f04d8c8e03a8a54cc"}, + {file = "bitarray-3.0.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4683bff52f5a0fd523fb5d3138161ef87611e63968e1fcb6cf4b0c6a86970fe0"}, + {file = "bitarray-3.0.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cb7302dbcfcb676f0b66f15891f091d0233c4fc23e1d4b9dc9b9e958156e347f"}, + {file = "bitarray-3.0.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:153d7c416a70951dcfa73487af05d2f49c632e95602f1620cd9a651fa2033695"}, + {file = "bitarray-3.0.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251cd5bd47f542893b2b61860eded54f34920ea47fd5bff038d85e7a2f7ae99b"}, + {file = "bitarray-3.0.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fa4b4d9fa90124b33b251ef74e44e737021f253dc7a9174e1b39f097451f7ca"}, + {file = "bitarray-3.0.0-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:18abdce7ab5d2104437c39670821cba0b32fdb9b2da9e6d17a4ff295362bd9dc"}, + {file = "bitarray-3.0.0-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:2855cc01ee370f7e6e3ec97eebe44b1453c83fb35080313145e2c8c3c5243afb"}, + {file = "bitarray-3.0.0-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:0cecaf2981c9cd2054547f651537b4f4939f9fe225d3fc2b77324b597c124e40"}, + {file = "bitarray-3.0.0-cp36-cp36m-musllinux_1_2_s390x.whl", hash = "sha256:22b00f65193fafb13aa644e16012c8b49e7d5cbb6bb72825105ff89aadaa01e3"}, + {file = "bitarray-3.0.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:20f30373f0af9cb583e4122348cefde93c82865dbcbccc4997108b3d575ece84"}, + {file = "bitarray-3.0.0-cp36-cp36m-win32.whl", hash = "sha256:aef404d5400d95c6ec86664df9924bde667c8865f8e33c9b7bd79823d53b3e5d"}, + {file = "bitarray-3.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:ec5b0f2d13da53e0975ac15ecbe8badb463bdb0bebaa09457f4df3320421915c"}, + {file = "bitarray-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:041c889e69c847b8a96346650e50f728b747ae176889199c49a3f31ae1de0e23"}, + {file = "bitarray-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc83ea003dd75e9ade3291ef0585577dd5524aec0c8c99305c0aaa2a7570d6db"}, + {file = "bitarray-3.0.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c33129b49196aa7965ac0f16fcde7b6ad8614b606caf01669a0277cef1afe1d"}, + {file = "bitarray-3.0.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ef5c787c8263c082a73219a69eb60a500e157a4ac69d1b8515ad836b0e71fb4"}, + {file = "bitarray-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e15c94d79810c5ab90ddf4d943f71f14332890417be896ca253f21fa3d78d2b1"}, + {file = "bitarray-3.0.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7cd021ada988e73d649289cee00428b75564c46d55fbdcb0e3402e504b0ae5ea"}, + {file = "bitarray-3.0.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7f1c24be7519f16a47b7e2ad1a1ef73023d34d8cbe1a3a59b185fc14baabb132"}, + {file = "bitarray-3.0.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:000df24c183011b5d27c23d79970f49b6762e5bb5aacd25da9c3e9695c693222"}, + {file = "bitarray-3.0.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:42bf1b222c698b467097f58b9f59dc850dfa694dde4e08237407a6a103757aa3"}, + {file = "bitarray-3.0.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:648e7ce794928e8d11343b5da8ecc5b910af75a82ea1a4264d5d0a55c3785faa"}, + {file = "bitarray-3.0.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:f536fc4d1a683025f9caef0bebeafd60384054579ffe0825bb9bd8c59f8c55b8"}, + {file = "bitarray-3.0.0-cp37-cp37m-win32.whl", hash = "sha256:a754c1464e7b946b1cac7300c582c6fba7d66e535cd1dab76d998ad285ac5a37"}, + {file = "bitarray-3.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e91d46d12781a14ccb8b284566b14933de4e3b29f8bc5e1c17de7a2001ad3b5b"}, + {file = "bitarray-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:904c1d5e3bd24f0c0d37a582d2461312033c91436a6a4f3bdeeceb4bea4a899d"}, + {file = "bitarray-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:47ccf9887bd595d4a0536f2310f0dcf89e17ab83b8befa7dc8727b8017120fda"}, + {file = "bitarray-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:71ad0139c95c9acf4fb62e203b428f9906157b15eecf3f30dc10b55919225896"}, + {file = "bitarray-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53e002ac1073ac70e323a7a4bfa9ab95e7e1a85c79160799e265563f342b1557"}, + {file = "bitarray-3.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:acc07211a59e2f245e9a06f28fa374d094fb0e71cf5366eef52abbb826ddc81e"}, + {file = "bitarray-3.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98a4070ddafabddaee70b2aa7cc6286cf73c37984169ab03af1782da2351059a"}, + {file = "bitarray-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7d09ef06ba57bea646144c29764bf6b870fb3c5558ca098191e07b6a1d40bf7"}, + {file = "bitarray-3.0.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce249ed981f428a8b61538ca82d3875847733d579dd40084ab8246549160f8a4"}, + {file = "bitarray-3.0.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea40e98d751ed4b255db4a88fe8fb743374183f78470b9e9305aab186bf28ede"}, + {file = "bitarray-3.0.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:928b8b6dfcd015e1a81334cfdac02815da2a2407854492a80cf8a3a922b04052"}, + {file = "bitarray-3.0.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:fbb645477595ce2a0fbb678d1cfd08d3b896e5d56196d40fb9e114eeab9382b3"}, + {file = "bitarray-3.0.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:dc1937a0ff2671797d35243db4b596329842480d125a65e9fe964bcffaf16dfc"}, + {file = "bitarray-3.0.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a4f49ac31734fe654a68e2515c0da7f5bbdf2d52755ba09a42ac406f1f08c9d0"}, + {file = "bitarray-3.0.0-cp38-cp38-win32.whl", hash = "sha256:6d2a2ce73f9897268f58857ad6893a1a6680c5a6b28f79d21c7d33285a5ae646"}, + {file = "bitarray-3.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:b1047999f1797c3ea7b7c85261649249c243308dcf3632840d076d18fa72f142"}, + {file = "bitarray-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:39b38a3d45dac39d528c87b700b81dfd5e8dc8e9e1a102503336310ef837c3fd"}, + {file = "bitarray-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0e104f9399144fab6a892d379ba1bb4275e56272eb465059beef52a77b4e5ce6"}, + {file = "bitarray-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0879f839ec8f079fa60c3255966c2e1aa7196699a234d4e5b7898fbc321901b5"}, + {file = "bitarray-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9502c2230d59a4ace2fddfd770dad8e8b414cbd99517e7e56c55c20997c28b8d"}, + {file = "bitarray-3.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57d5ef854f8ec434f2ffd9ddcefc25a10848393fe2976e2be2c8c773cf5fef42"}, + {file = "bitarray-3.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a3c36b2fcfebe15ad1c10a90c1d52a42bebe960adcbce340fef867203028fbe7"}, + {file = "bitarray-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66a33a537e781eac3a352397ce6b07eedf3a8380ef4a804f8844f3f45e335544"}, + {file = "bitarray-3.0.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa54c7e1da8cf4be0aab941ea284ec64033ede5d6de3fd47d75e77cafe986e9d"}, + {file = "bitarray-3.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a667ea05ba1ea81b722682276dbef1d36990f8908cf51e570099fd505a89f931"}, + {file = "bitarray-3.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d756bfeb62ca4fe65d2af7a39249d442c05070c047d03729ad6cd4c2e9b0f0bd"}, + {file = "bitarray-3.0.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c9e9fef0754867d88e948ce8351c9fd7e507d8514e0f242fd67c907b9cdf98b3"}, + {file = "bitarray-3.0.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:67a0b56dd02f2713f6f52cacb3f251afd67c94c5f0748026d307d87a81a8e15c"}, + {file = "bitarray-3.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d8c36ddc1923bcc4c11b9994c54eaae25034812a42400b7b8a86fe6d242166a2"}, + {file = "bitarray-3.0.0-cp39-cp39-win32.whl", hash = "sha256:1414a7102a3c4986f241480544f5c99f5d32258fb9b85c9c04e84e48c490ab35"}, + {file = "bitarray-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:8c9733d2ff9b7838ac04bf1048baea153174753e6a47312be14c83c6a395424b"}, + {file = "bitarray-3.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fef4e3b3f2084b4dae3e5316b44cda72587dcc81f68b4eb2dbda1b8d15261b61"}, + {file = "bitarray-3.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e9eee03f187cef1e54a4545124109ee0afc84398628b4b32ebb4852b4a66393"}, + {file = "bitarray-3.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cb5702dd667f4bb10fed056ffdc4ddaae8193a52cd74cb2cdb54e71f4ef2dd1"}, + {file = "bitarray-3.0.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:666e44b0458bb2894b64264a29f2cc7b5b2cbcc4c5e9cedfe1fdbde37a8e329a"}, + {file = "bitarray-3.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c756a92cf1c1abf01e56a4cc40cb89f0ff9147f2a0be5b557ec436a23ff464d8"}, + {file = "bitarray-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7e51e7f8289bf6bb631e1ef2a8f5e9ca287985ff518fe666abbdfdb6a848cb26"}, + {file = "bitarray-3.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fa5d8e4b28388b337face6ce4029be73585651a44866901513df44be9a491ab"}, + {file = "bitarray-3.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3963b80a68aedcd722a9978d261ae53cb9bb6a8129cc29790f0f10ce5aca287a"}, + {file = "bitarray-3.0.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b555006a7dea53f6bebc616a4d0249cecbf8f1fadf77860120a2e5dbdc2f167"}, + {file = "bitarray-3.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:4ac2027ca650a7302864ed2528220d6cc6921501b383e9917afc7a2424a1e36d"}, + {file = "bitarray-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bf90aba4cff9e72e24ecdefe33bad608f147a23fa5c97790a5bab0e72fe62b6d"}, + {file = "bitarray-3.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1a199e6d7c3bad5ba9d0e4dc00dde70ee7d111c9dfc521247fa646ef59fa57e"}, + {file = "bitarray-3.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43b6c7c4f4a7b80e86e24a76f4c6b9b67d03229ea16d7d403520616535c32196"}, + {file = "bitarray-3.0.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fc13da3518f14825b239374734fce93c1a9299ed7b558c3ec1d659ec7e4c70"}, + {file = "bitarray-3.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:369b6d457af94af901d632c7e625ca6caf0a7484110fc91c6290ce26bc4f1478"}, + {file = "bitarray-3.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ee040ad3b7dfa05e459713099f16373c1f2a6f68b43cb0575a66718e7a5daef4"}, + {file = "bitarray-3.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dad7ba2af80f9ec1dd988c3aca7992408ec0d0b4c215b65d353d95ab0070b10"}, + {file = "bitarray-3.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4839d3b64af51e4b8bb4a602563b98b9faeb34fd6c00ed23d7834e40a9d080fc"}, + {file = "bitarray-3.0.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f71f24b58e75a889b9915e3197865302467f13e7390efdea5b6afc7424b3a2ea"}, + {file = "bitarray-3.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:bcf0150ae0bcc4aa97bdfcb231b37bad1a59083c1b5012643b266012bf420e68"}, + {file = "bitarray-3.0.0.tar.gz", hash = "sha256:a2083dc20f0d828a7cdf7a16b20dae56aab0f43dc4f347a3b3039f6577992b03"}, +] + +[[package]] +name = "black" +version = "22.1.0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.6.2" +files = [ + {file = "black-22.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6"}, + {file = "black-22.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866"}, + {file = "black-22.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71"}, + {file = "black-22.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab"}, + {file = "black-22.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5"}, + {file = "black-22.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a"}, + {file = "black-22.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0"}, + {file = "black-22.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba"}, + {file = "black-22.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1"}, + {file = "black-22.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8"}, + {file = "black-22.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28"}, + {file = "black-22.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912"}, + {file = "black-22.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3"}, + {file = "black-22.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3"}, + {file = "black-22.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61"}, + {file = "black-22.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd"}, + {file = "black-22.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f"}, + {file = "black-22.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0"}, + {file = "black-22.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c"}, + {file = "black-22.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2"}, + {file = "black-22.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321"}, + {file = "black-22.1.0-py3-none-any.whl", hash = "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d"}, + {file = "black-22.1.0.tar.gz", hash = "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = ">=1.1.0" +typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "certifi" -version = "2021.10.8" +version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." -category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, + {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.1" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7" +files = [ + {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, + {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, + {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, +] + +[[package]] +name = "ckzg" +version = "1.0.2" +description = "Python bindings for C-KZG-4844" optional = false python-versions = "*" +files = [ + {file = "ckzg-1.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bdd082bc0f2a595e3546658ecbe1ff78fe65b0ab7e619a8197a62d94f46b5b46"}, + {file = "ckzg-1.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50ca4af4e2f1a1e8b0a7e97b3aef39dedbb0d52d90866ece424f13f8df1b5972"}, + {file = "ckzg-1.0.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e9dc671b0a307ea65d0a216ca496c272dd3c1ed890ddc2a306da49b0d8ffc83"}, + {file = "ckzg-1.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d95e97a0d0f7758119bb905fb5688222b1556de465035614883c42fe4a047d1f"}, + {file = "ckzg-1.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27261672154cbd477d84d289845b0022fbdbe2ba45b7a2a2051c345fa04c8334"}, + {file = "ckzg-1.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c16d5ee1ddbbbad0367ff970b3ec9f6d1879e9f928023beda59ae9e16ad99e4c"}, + {file = "ckzg-1.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:09043738b029bdf4fdc82041b395cfc6f5b5cf63435e5d4d685d24fd14c834d3"}, + {file = "ckzg-1.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3c0afa232d2312e3101aaddb6971b486b0038a0f9171500bc23143f5749eff55"}, + {file = "ckzg-1.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:96e8281b6d58cf91b9559e1bd38132161d63467500838753364c68e825df2e2c"}, + {file = "ckzg-1.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b874167de1d6de72890a2ad5bd9aa7adbddc41c3409923b59cf4ef27f83f79da"}, + {file = "ckzg-1.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d2ccd68b0743e20e853e31a08da490a8d38c7f12b9a0c4ee63ef5afa0dc2427"}, + {file = "ckzg-1.0.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e8d534ddbe785c44cf1cd62ee32d78b4310d66dd70e42851f5468af655b81f5"}, + {file = "ckzg-1.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c732cda00c76b326f39ae97edfc6773dd231b7c77288b38282584a7aee77c3a7"}, + {file = "ckzg-1.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abc5a27284db479ead4c053ff086d6e222914f1b0aa08b80eabfa116dbed4f7a"}, + {file = "ckzg-1.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e6bd5006cb3e802744309450183087a6594d50554814eee19065f7064dff7b05"}, + {file = "ckzg-1.0.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3594470134eda7adf2813ad3f1da55ced98c8a393262f47ce3890c5afa05b23e"}, + {file = "ckzg-1.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fea56f39e48b60c1ff6f751c47489e353d1bd95cae65c429cf5f87735d794431"}, + {file = "ckzg-1.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:f769eb2e1056ca396462460079f6849c778f58884bb24b638ff7028dd2120b65"}, + {file = "ckzg-1.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e3cb2f8c767aee57e88944f90848e8689ce43993b9ff21589cfb97a562208fe7"}, + {file = "ckzg-1.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b29889f5bc5db530f766871c0ff4133e7270ecf63aaa3ca756d3b2731980802"}, + {file = "ckzg-1.0.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfcc70fb76b3d36125d646110d5001f2aa89c1c09ff5537a4550cdb7951f44d4"}, + {file = "ckzg-1.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ca8a256cdd56d06bc5ef24caac64845240dbabca402c5a1966d519b2514b4ec"}, + {file = "ckzg-1.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ea91b0236384f93ad1df01d530672f09e254bd8c3cf097ebf486aebb97f6c8c"}, + {file = "ckzg-1.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:65311e72780105f239d1d66512629a9f468b7c9f2609b8567fc68963ac638ef9"}, + {file = "ckzg-1.0.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0d7600ce7a73ac41d348712d0c1fe5e4cb6caa329377064cfa3a6fd8fbffb410"}, + {file = "ckzg-1.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:19893ee7bd7da8688382cb134cb9ee7bce5c38e3a9386e3ed99bb010487d2d17"}, + {file = "ckzg-1.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:c3e1a9a72695e777497e95bb2213316a1138f82d1bb5d67b9c029a522d24908e"}, + {file = "ckzg-1.0.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a2f59da9cb82b6a4be615f2561a255731eededa7ecd6ba4b2f2dedfc918ef137"}, + {file = "ckzg-1.0.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c915e1f2ef51657c3255d8b1e2aea6e0b93348ae316b2b79eaadfb17ad8f514e"}, + {file = "ckzg-1.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcc0d2031fcabc4be37e9e602c926ef9347238d2f58c1b07e0c147f60b9e760b"}, + {file = "ckzg-1.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cdaad2745425d7708e76e8e56a52fdaf5c5cc1cfefd5129d24ff8dbe06a012d"}, + {file = "ckzg-1.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1ec775649daade1b93041aac9c1660c2ad9828b57ccd2eeb5a3074d8f05e544a"}, + {file = "ckzg-1.0.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:02f9cc3e38b3702ec5895a1ebf927fd02b8f5c2f93c7cb9e438581b5b74472c8"}, + {file = "ckzg-1.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0e816af31951b5e94e6bc069f21fe783427c190526e0437e16c4488a34ddcacc"}, + {file = "ckzg-1.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:651ba33ee2d7fefff14ca519a72996b733402f8b043fbfef12d5fe2a442d86d8"}, + {file = "ckzg-1.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:489763ad92e2175fb6ab455411f03ec104c630470d483e11578bf2e00608f283"}, + {file = "ckzg-1.0.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69e1376284e9a5094d7c4d3e552202d6b32a67c5acc461b0b35718d8ec5c7363"}, + {file = "ckzg-1.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb9d0b09ca1bdb5955b626d6645f811424ae0fcab47699a1a938a3ce0438c25f"}, + {file = "ckzg-1.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d87a121ace8feb6c9386f247e7e36ef55e584fc8a6b1bc2c60757a59c1efe364"}, + {file = "ckzg-1.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:97c27153fab853f017fed159333b27beeb2e0da834c92c9ecdc26d0e5c3983b3"}, + {file = "ckzg-1.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b26799907257c39471cb3665f66f7630797140131606085c2c94a7094ab6ddf2"}, + {file = "ckzg-1.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:283a40c625222560fda3dcb912b666f7d50f9502587b73c4358979f519f1c961"}, + {file = "ckzg-1.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:5f029822d27c52b9c3dbe5706408b099da779f10929be0422a09a34aa026a872"}, + {file = "ckzg-1.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edaea8fb50b01c6c19768d9305ad365639a8cd804754277d5108dcae4808f00b"}, + {file = "ckzg-1.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:27be65c88d5d773a30e6f198719cefede7e25cad807384c3d65a09c11616fc9d"}, + {file = "ckzg-1.0.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9ac729c5c6f3d2c030c0bc8c9e10edc253e36f002cfe227292035009965d349"}, + {file = "ckzg-1.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1528bc2b95aac6d184a90b023602c40d7b11b577235848c1b5593c00cf51d37"}, + {file = "ckzg-1.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:071dc7fc179316ce1bfabaa056156e4e84f312c4560ab7b9529a3b9a84019df3"}, + {file = "ckzg-1.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:895044069de7010be6c7ee703f03fd7548267a0823cf60b9dd26ec50267dd9e8"}, + {file = "ckzg-1.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ed8c99cd3d9af596470e0481fd58931007288951719bad026f0dd486dd0ec11"}, + {file = "ckzg-1.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:74d87eafe561d4bfb544a4f3419d26c56ad7de00f39789ef0fdb09515544d12e"}, + {file = "ckzg-1.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:54d71e5ca416bd51c543f9f51e426e6792f8a0280b83aef92faad1b826f401ea"}, + {file = "ckzg-1.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:da2d9988781a09a4577ee7ea8f51fe4a94b4422789a523164f5ba3118566ad41"}, + {file = "ckzg-1.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d9e030af7d6acdcb356fddfb095048bc8e880fe4cd70ff2206c64f33bf384a0d"}, + {file = "ckzg-1.0.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:145ae31c3d499d1950567bd636dc5b24292b600296b9deb5523bc20d8f7b51c3"}, + {file = "ckzg-1.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d81e68e84d80084da298471ad5eaddfcc1cf73545cb24e9453550c8186870982"}, + {file = "ckzg-1.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c67064bbbeba1a6892c9c80b3d0c2a540ff48a5ca5356fdb2a8d998b264e43e6"}, + {file = "ckzg-1.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:99694917eb6decefc0d330d9887a89ea770824b2fa76eb830bab5fe57ea5c20c"}, + {file = "ckzg-1.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fca227ce0ce3427254a113fdb3aed5ecd99c1fc670cb0c60cc8a2154793678e4"}, + {file = "ckzg-1.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a66a690d3d1801085d11de6825df47a99b465ff32dbe90be4a3c9f43c577da96"}, + {file = "ckzg-1.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:272adfe471380d10e4a0e1639d877e504555079a60233dd82249c799b15be81e"}, + {file = "ckzg-1.0.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f37be0054ebb4b8ac6e6d5267290b239b09e7ddc611776051b4c3c4032d161ba"}, + {file = "ckzg-1.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:611c03a170f0f746180eeb0cc28cdc6f954561b8eb9013605a046de86520ee6b"}, + {file = "ckzg-1.0.2-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:75b2f0ab341f3c33702ce64e1c101116c7462a25686d0b1a0193ca654ad4f96e"}, + {file = "ckzg-1.0.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab29fc61fbd32096b82b02e6b18ae0d7423048d3540b7b90805b16ae10bdb769"}, + {file = "ckzg-1.0.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e43741e7453262aa3ba1754623d7864250b33751bd850dd548e3ed6bd1911093"}, + {file = "ckzg-1.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:155eacc237cb28c9eafda1c47a89e6e4550f1c2e711f2eee21e0bb2f4df75546"}, + {file = "ckzg-1.0.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31d7fbe396a51f43375e38c31bc3a96c7996882582f95f3fcfd54acfa7b3ce6"}, + {file = "ckzg-1.0.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d3d049186c9966e9140de39a9979d7adcfe22f8b02d2852c94d3c363235cc18"}, + {file = "ckzg-1.0.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88728fbd410d61bd5d655ac50b842714c38bc34ff717f73592132d28911fc88e"}, + {file = "ckzg-1.0.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:052d302058d72431acc9dd4a9c76854c8dfce10c698deef5252884e32a1ac7bf"}, + {file = "ckzg-1.0.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:633110a9431231664be2ad32baf10971547f18289d33967654581b9ae9c94a7e"}, + {file = "ckzg-1.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f439c9e5297ae29a700f6d55de1525e2e295dbbb7366f0974c8702fca9e536b9"}, + {file = "ckzg-1.0.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:94f7eb080c00c0ccbd4fafad69f0b35b624a6a229a28e11d365b60b58a072832"}, + {file = "ckzg-1.0.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f876783ec654b7b9525503c2a0a1b086e5d4f52ff65cac7e8747769b0c2e5468"}, + {file = "ckzg-1.0.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7e039800e50592580171830e788ef4a1d6bb54300d074ae9f9119e92aefc568"}, + {file = "ckzg-1.0.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13a8cccf0070a29bc01493179db2e61220ee1a6cb17f8ea41c68a2f043ace87f"}, + {file = "ckzg-1.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4f86cef801d7b0838e17b6ee2f2c9e747447d91ad1220a701baccdf7ef11a3c8"}, + {file = "ckzg-1.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2433a89af4158beddebbdd66fae95b34d40f2467bee8dc40df0333de5e616b5f"}, + {file = "ckzg-1.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c49d5dc0918ad912777720035f9820bdbb6c7e7d1898e12506d44ab3c938d525"}, + {file = "ckzg-1.0.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:331d49bc72430a3f85ea6ecb55a0d0d65f66a21d61af5783b465906a741366d5"}, + {file = "ckzg-1.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86627bc33bc63b8de869d7d5bfa9868619a4f3e4e7082103935c52f56c66b5"}, + {file = "ckzg-1.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab6a2ba2706b5eaa1ce6bc7c4e72970bf9587e2e0e482e5fb4df1996bccb7a40"}, + {file = "ckzg-1.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8bca5e7c38d913fabc24ad09545f78ba23cfc13e1ac8250644231729ca908549"}, + {file = "ckzg-1.0.2.tar.gz", hash = "sha256:4295acc380f8d42ebea4a4a0a68c424a322bb335a33bad05c72ead8cbb28d118"}, +] + +[[package]] +name = "cli-ui" +version = "0.18.0" +description = "Build Nice User Interfaces In The Terminal" +optional = false +python-versions = "<4.0.0,>=3.8.1" +files = [ + {file = "cli_ui-0.18.0-py3-none-any.whl", hash = "sha256:8d9484586d8eaba9f94aebaa12aa876fabdf1a3a50bdca113b2cb739eeaf78fa"}, + {file = "cli_ui-0.18.0.tar.gz", hash = "sha256:3e6c80ada5b4b09c6701ca93daf31df8b70486c64348d1fc7f3288ef3bd0479c"}, +] + +[package.dependencies] +colorama = ">=0.4.1,<0.5.0" +tabulate = ">=0.9.0,<0.10.0" +unidecode = ">=1.3.6,<2.0.0" [[package]] -name = "chardet" -version = "4.0.0" -description = "Universal encoding detector for Python 2 and 3" -category = "main" +name = "click" +version = "8.0.2" +description = "Composable command line interface toolkit" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6" +files = [ + {file = "click-8.0.2-py3-none-any.whl", hash = "sha256:3fab8aeb8f15f5452ae7511ad448977b3417325bceddd53df87e0bb81f3a8cf8"}, + {file = "click-8.0.2.tar.gz", hash = "sha256:7027bc7bbafaab8b2c2816861d8eb372429ee3c02e193fc2f93d6c4ab9de49c5"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "colorama" -version = "0.4.4" +version = "0.4.6" description = "Cross-platform colored terminal text." -category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "cython" -version = "0.29.24" -description = "The Cython compiler for writing C extensions for the Python language." -category = "main" +version = "3.0.11" +description = "The Cython compiler for writing C extensions in the Python language." optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +files = [ + {file = "Cython-3.0.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:44292aae17524abb4b70a25111fe7dec1a0ad718711d47e3786a211d5408fdaa"}, + {file = "Cython-3.0.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a75d45fbc20651c1b72e4111149fed3b33d270b0a4fb78328c54d965f28d55e1"}, + {file = "Cython-3.0.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d89a82937ce4037f092e9848a7bbcc65bc8e9fc9aef2bb74f5c15e7d21a73080"}, + {file = "Cython-3.0.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a8ea2e7e2d3bc0d8630dafe6c4a5a89485598ff8a61885b74f8ed882597efd5"}, + {file = "Cython-3.0.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cee29846471ce60226b18e931d8c1c66a158db94853e3e79bc2da9bd22345008"}, + {file = "Cython-3.0.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eeb6860b0f4bfa402de8929833fe5370fa34069c7ebacb2d543cb017f21fb891"}, + {file = "Cython-3.0.11-cp310-cp310-win32.whl", hash = "sha256:3699391125ab344d8d25438074d1097d9ba0fb674d0320599316cfe7cf5f002a"}, + {file = "Cython-3.0.11-cp310-cp310-win_amd64.whl", hash = "sha256:d02f4ebe15aac7cdacce1a628e556c1983f26d140fd2e0ac5e0a090e605a2d38"}, + {file = "Cython-3.0.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75ba1c70b6deeaffbac123856b8d35f253da13552207aa969078611c197377e4"}, + {file = "Cython-3.0.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af91497dc098718e634d6ec8f91b182aea6bb3690f333fc9a7777bc70abe8810"}, + {file = "Cython-3.0.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3999fb52d3328a6a5e8c63122b0a8bd110dfcdb98dda585a3def1426b991cba7"}, + {file = "Cython-3.0.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d566a4e09b8979be8ab9f843bac0dd216c81f5e5f45661a9b25cd162ed80508c"}, + {file = "Cython-3.0.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:46aec30f217bdf096175a1a639203d44ac73a36fe7fa3dd06bd012e8f39eca0f"}, + {file = "Cython-3.0.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ddd1fe25af330f4e003421636746a546474e4ccd8f239f55d2898d80983d20ed"}, + {file = "Cython-3.0.11-cp311-cp311-win32.whl", hash = "sha256:221de0b48bf387f209003508e602ce839a80463522fc6f583ad3c8d5c890d2c1"}, + {file = "Cython-3.0.11-cp311-cp311-win_amd64.whl", hash = "sha256:3ff8ac1f0ecd4f505db4ab051e58e4531f5d098b6ac03b91c3b902e8d10c67b3"}, + {file = "Cython-3.0.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:11996c40c32abf843ba652a6d53cb15944c88d91f91fc4e6f0028f5df8a8f8a1"}, + {file = "Cython-3.0.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63f2c892e9f9c1698ecfee78205541623eb31cd3a1b682668be7ac12de94aa8e"}, + {file = "Cython-3.0.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b14c24f1dc4c4c9d997cca8d1b7fb01187a218aab932328247dcf5694a10102"}, + {file = "Cython-3.0.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8eed5c015685106db15dd103fd040948ddca9197b1dd02222711815ea782a27"}, + {file = "Cython-3.0.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780f89c95b8aec1e403005b3bf2f0a2afa060b3eba168c86830f079339adad89"}, + {file = "Cython-3.0.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a690f2ff460682ea985e8d38ec541be97e0977fa0544aadc21efc116ff8d7579"}, + {file = "Cython-3.0.11-cp312-cp312-win32.whl", hash = "sha256:2252b5aa57621848e310fe7fa6f7dce5f73aa452884a183d201a8bcebfa05a00"}, + {file = "Cython-3.0.11-cp312-cp312-win_amd64.whl", hash = "sha256:da394654c6da15c1d37f0b7ec5afd325c69a15ceafee2afba14b67a5df8a82c8"}, + {file = "Cython-3.0.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4341d6a64d47112884e0bcf31e6c075268220ee4cd02223047182d4dda94d637"}, + {file = "Cython-3.0.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:351955559b37e6c98b48aecb178894c311be9d731b297782f2b78d111f0c9015"}, + {file = "Cython-3.0.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c02361af9bfa10ff1ccf967fc75159e56b1c8093caf565739ed77a559c1f29f"}, + {file = "Cython-3.0.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6823aef13669a32caf18bbb036de56065c485d9f558551a9b55061acf9c4c27f"}, + {file = "Cython-3.0.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6fb68cef33684f8cc97987bee6ae919eee7e18ee6a3ad7ed9516b8386ef95ae6"}, + {file = "Cython-3.0.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:790263b74432cb997740d73665f4d8d00b9cd1cecbdd981d93591ddf993d4f12"}, + {file = "Cython-3.0.11-cp313-cp313-win32.whl", hash = "sha256:e6dd395d1a704e34a9fac00b25f0036dce6654c6b898be6f872ac2bb4f2eda48"}, + {file = "Cython-3.0.11-cp313-cp313-win_amd64.whl", hash = "sha256:52186101d51497519e99b60d955fd5cb3bf747c67f00d742e70ab913f1e42d31"}, + {file = "Cython-3.0.11-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c69d5cad51388522b98a99b4be1b77316de85b0c0523fa865e0ea58bbb622e0a"}, + {file = "Cython-3.0.11-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8acdc87e9009110adbceb7569765eb0980129055cc954c62f99fe9f094c9505e"}, + {file = "Cython-3.0.11-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1dd47865f4c0a224da73acf83d113f93488d17624e2457dce1753acdfb1cc40c"}, + {file = "Cython-3.0.11-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:301bde949b4f312a1c70e214b0c3bc51a3f955d466010d2f68eb042df36447b0"}, + {file = "Cython-3.0.11-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:f3953d2f504176f929862e5579cfc421860c33e9707f585d70d24e1096accdf7"}, + {file = "Cython-3.0.11-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:3f2b062f6df67e8a56c75e500ca330cf62c85ac26dd7fd006f07ef0f83aebfa3"}, + {file = "Cython-3.0.11-cp36-cp36m-win32.whl", hash = "sha256:c3d68751668c66c7a140b6023dba5d5d507f72063407bb609d3a5b0f3b8dfbe4"}, + {file = "Cython-3.0.11-cp36-cp36m-win_amd64.whl", hash = "sha256:bcd29945fafd12484cf37b1d84f12f0e7a33ba3eac5836531c6bd5283a6b3a0c"}, + {file = "Cython-3.0.11-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4e9a8d92978b15a0c7ca7f98447c6c578dc8923a0941d9d172d0b077cb69c576"}, + {file = "Cython-3.0.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:421017466e9260aca86823974e26e158e6358622f27c0f4da9c682f3b6d2e624"}, + {file = "Cython-3.0.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d80a7232938d523c1a12f6b1794ab5efb1ae77ad3fde79de4bb558d8ab261619"}, + {file = "Cython-3.0.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfa550d9ae39e827a6e7198076df763571cb53397084974a6948af558355e028"}, + {file = "Cython-3.0.11-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:aedceb6090a60854b31bf9571dc55f642a3fa5b91f11b62bcef167c52cac93d8"}, + {file = "Cython-3.0.11-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:473d35681d9f93ce380e6a7c8feb2d65fc6333bd7117fbc62989e404e241dbb0"}, + {file = "Cython-3.0.11-cp37-cp37m-win32.whl", hash = "sha256:3379c6521e25aa6cd7703bb7d635eaca75c0f9c7f1b0fdd6dd15a03bfac5f68d"}, + {file = "Cython-3.0.11-cp37-cp37m-win_amd64.whl", hash = "sha256:14701edb3107a5d9305a82d9d646c4f28bfecbba74b26cc1ee2f4be08f602057"}, + {file = "Cython-3.0.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:598699165cfa7c6d69513ee1bffc9e1fdd63b00b624409174c388538aa217975"}, + {file = "Cython-3.0.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0583076c4152b417a3a8a5d81ec02f58c09b67d3f22d5857e64c8734ceada8c"}, + {file = "Cython-3.0.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52205347e916dd65d2400b977df4c697390c3aae0e96275a438cc4ae85dadc08"}, + {file = "Cython-3.0.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:989899a85f0d9a57cebb508bd1f194cb52f0e3f7e22ac259f33d148d6422375c"}, + {file = "Cython-3.0.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:53b6072a89049a991d07f42060f65398448365c59c9cb515c5925b9bdc9d71f8"}, + {file = "Cython-3.0.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f988f7f8164a6079c705c39e2d75dbe9967e3dacafe041420d9af7b9ee424162"}, + {file = "Cython-3.0.11-cp38-cp38-win32.whl", hash = "sha256:a1f4cbc70f6b7f0c939522118820e708e0d490edca42d852fa8004ec16780be2"}, + {file = "Cython-3.0.11-cp38-cp38-win_amd64.whl", hash = "sha256:187685e25e037320cae513b8cc4bf9dbc4465c037051aede509cbbf207524de2"}, + {file = "Cython-3.0.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0fc6fdd6fa493be7bdda22355689d5446ac944cd71286f6f44a14b0d67ee3ff5"}, + {file = "Cython-3.0.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b1d1f6f94cc5d42a4591f6d60d616786b9cd15576b112bc92a23131fcf38020"}, + {file = "Cython-3.0.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4ab2b92a3e6ed552adbe9350fd2ef3aa0cc7853cf91569f9dbed0c0699bbeab"}, + {file = "Cython-3.0.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:104d6f2f2c827ccc5e9e42c80ef6773a6aa94752fe6bc5b24a4eab4306fb7f07"}, + {file = "Cython-3.0.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:13062ce556a1e98d2821f7a0253b50569fdc98c36efd6653a65b21e3f8bbbf5f"}, + {file = "Cython-3.0.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:525d09b3405534763fa73bd78c8e51ac8264036ce4c16d37dfd1555a7da6d3a7"}, + {file = "Cython-3.0.11-cp39-cp39-win32.whl", hash = "sha256:b8c7e514075696ca0f60c337f9e416e61d7ccbc1aa879a56c39181ed90ec3059"}, + {file = "Cython-3.0.11-cp39-cp39-win_amd64.whl", hash = "sha256:8948802e1f5677a673ea5d22a1e7e273ca5f83e7a452786ca286eebf97cee67c"}, + {file = "Cython-3.0.11-py2.py3-none-any.whl", hash = "sha256:0e25f6425ad4a700d7f77cd468da9161e63658837d1bc34861a9861a4ef6346d"}, + {file = "cython-3.0.11.tar.gz", hash = "sha256:7146dd2af8682b4ca61331851e6aebce9fe5158e75300343f80c07ca80b1faff"}, +] [[package]] name = "cytoolz" -version = "0.11.2" +version = "1.0.1" description = "Cython implementation of Toolz: High performance functional utilities" -category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" +files = [ + {file = "cytoolz-1.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cec9af61f71fc3853eb5dca3d42eb07d1f48a4599fa502cbe92adde85f74b042"}, + {file = "cytoolz-1.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:140bbd649dbda01e91add7642149a5987a7c3ccc251f2263de894b89f50b6608"}, + {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e90124bdc42ff58b88cdea1d24a6bc5f776414a314cc4d94f25c88badb3a16d1"}, + {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e74801b751e28f7c5cc3ad264c123954a051f546f2fdfe089f5aa7a12ccfa6da"}, + {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:582dad4545ddfb5127494ef23f3fa4855f1673a35d50c66f7638e9fb49805089"}, + {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd7bd0618e16efe03bd12f19c2a26a27e6e6b75d7105adb7be1cd2a53fa755d8"}, + {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d74cca6acf1c4af58b2e4a89cc565ed61c5e201de2e434748c93e5a0f5c541a5"}, + {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:823a3763828d8d457f542b2a45d75d6b4ced5e470b5c7cf2ed66a02f508ed442"}, + {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:51633a14e6844c61db1d68c1ffd077cf949f5c99c60ed5f1e265b9e2966f1b52"}, + {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f3ec9b01c45348f1d0d712507d54c2bfd69c62fbd7c9ef555c9d8298693c2432"}, + {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1855022b712a9c7a5bce354517ab4727a38095f81e2d23d3eabaf1daeb6a3b3c"}, + {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9930f7288c4866a1dc1cc87174f0c6ff4cad1671eb1f6306808aa6c445857d78"}, + {file = "cytoolz-1.0.1-cp310-cp310-win32.whl", hash = "sha256:a9baad795d72fadc3445ccd0f122abfdbdf94269157e6d6d4835636dad318804"}, + {file = "cytoolz-1.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:ad95b386a84e18e1f6136f6d343d2509d4c3aae9f5a536f3dc96808fcc56a8cf"}, + {file = "cytoolz-1.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2d958d4f04d9d7018e5c1850790d9d8e68b31c9a2deebca74b903706fdddd2b6"}, + {file = "cytoolz-1.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0f445b8b731fc0ecb1865b8e68a070084eb95d735d04f5b6c851db2daf3048ab"}, + {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f546a96460a7e28eb2ec439f4664fa646c9b3e51c6ebad9a59d3922bbe65e30"}, + {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0317681dd065532d21836f860b0563b199ee716f55d0c1f10de3ce7100c78a3b"}, + {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c0ef52febd5a7821a3fd8d10f21d460d1a3d2992f724ba9c91fbd7a96745d41"}, + {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ebaf419acf2de73b643cf96108702b8aef8e825cf4f63209ceb078d5fbbbfd"}, + {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f7f04eeb4088947585c92d6185a618b25ad4a0f8f66ea30c8db83cf94a425e3"}, + {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f61928803bb501c17914b82d457c6f50fe838b173fb40d39c38d5961185bd6c7"}, + {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d2960cb4fa01ccb985ad1280db41f90dc97a80b397af970a15d5a5de403c8c61"}, + {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b2b407cc3e9defa8df5eb46644f6f136586f70ba49eba96f43de67b9a0984fd3"}, + {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8245f929144d4d3bd7b972c9593300195c6cea246b81b4c46053c48b3f044580"}, + {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e37385db03af65763933befe89fa70faf25301effc3b0485fec1c15d4ce4f052"}, + {file = "cytoolz-1.0.1-cp311-cp311-win32.whl", hash = "sha256:50f9c530f83e3e574fc95c264c3350adde8145f4f8fc8099f65f00cc595e5ead"}, + {file = "cytoolz-1.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:b7f6b617454b4326af7bd3c7c49b0fc80767f134eb9fd6449917a058d17a0e3c"}, + {file = "cytoolz-1.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fcb8f7d0d65db1269022e7e0428471edee8c937bc288ebdcb72f13eaa67c2fe4"}, + {file = "cytoolz-1.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:207d4e4b445e087e65556196ff472ff134370d9a275d591724142e255f384662"}, + {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21cdf6bac6fd843f3b20280a66fd8df20dea4c58eb7214a2cd8957ec176f0bb3"}, + {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a55ec098036c0dea9f3bdc021f8acd9d105a945227d0811589f0573f21c9ce1"}, + {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a13ab79ff4ce202e03ab646a2134696988b554b6dc4b71451e948403db1331d8"}, + {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e2d944799026e1ff08a83241f1027a2d9276c41f7a74224cd98b7df6e03957d"}, + {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88ba85834cd523b91fdf10325e1e6d71c798de36ea9bdc187ca7bd146420de6f"}, + {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a750b1af7e8bf6727f588940b690d69e25dc47cce5ce467925a76561317eaf7"}, + {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44a71870f7eae31d263d08b87da7c2bf1176f78892ed8bdade2c2850478cb126"}, + {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c8231b9abbd8e368e036f4cc2e16902c9482d4cf9e02a6147ed0e9a3cd4a9ab0"}, + {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:aa87599ccc755de5a096a4d6c34984de6cd9dc928a0c5eaa7607457317aeaf9b"}, + {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:67cd16537df51baabde3baa770ab7b8d16839c4d21219d5b96ac59fb012ebd2d"}, + {file = "cytoolz-1.0.1-cp312-cp312-win32.whl", hash = "sha256:fb988c333f05ee30ad4693fe4da55d95ec0bb05775d2b60191236493ea2e01f9"}, + {file = "cytoolz-1.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:8f89c48d8e5aec55ffd566a8ec858706d70ed0c6a50228eca30986bfa5b4da8b"}, + {file = "cytoolz-1.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6944bb93b287032a4c5ca6879b69bcd07df46f3079cf8393958cf0b0454f50c0"}, + {file = "cytoolz-1.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e027260fd2fc5cb041277158ac294fc13dca640714527219f702fb459a59823a"}, + {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88662c0e07250d26f5af9bc95911e6137e124a5c1ec2ce4a5d74de96718ab242"}, + {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309dffa78b0961b4c0cf55674b828fbbc793cf2d816277a5c8293c0c16155296"}, + {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:edb34246e6eb40343c5860fc51b24937698e4fa1ee415917a73ad772a9a1746b"}, + {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a54da7a8e4348a18d45d4d5bc84af6c716d7f131113a4f1cc45569d37edff1b"}, + {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:241c679c3b1913c0f7259cf1d9639bed5084c86d0051641d537a0980548aa266"}, + {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5bfc860251a8f280ac79696fc3343cfc3a7c30b94199e0240b6c9e5b6b01a2a5"}, + {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c8edd1547014050c1bdad3ff85d25c82bd1c2a3c96830c6181521eb78b9a42b3"}, + {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b349bf6162e8de215403d7f35f8a9b4b1853dc2a48e6e1a609a5b1a16868b296"}, + {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1b18b35256219b6c3dd0fa037741b85d0bea39c552eab0775816e85a52834140"}, + {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:738b2350f340ff8af883eb301054eb724997f795d20d90daec7911c389d61581"}, + {file = "cytoolz-1.0.1-cp313-cp313-win32.whl", hash = "sha256:9cbd9c103df54fcca42be55ef40e7baea624ac30ee0b8bf1149f21146d1078d9"}, + {file = "cytoolz-1.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:90e577e08d3a4308186d9e1ec06876d4756b1e8164b92971c69739ea17e15297"}, + {file = "cytoolz-1.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f3a509e4ac8e711703c368476b9bbce921fcef6ebb87fa3501525f7000e44185"}, + {file = "cytoolz-1.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a7eecab6373e933dfbf4fdc0601d8fd7614f8de76793912a103b5fccf98170cd"}, + {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e55ed62087f6e3e30917b5f55350c3b6be6470b849c6566018419cd159d2cebc"}, + {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43de33d99a4ccc07234cecd81f385456b55b0ea9c39c9eebf42f024c313728a5"}, + {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:139bed875828e1727018aa0982aa140e055cbafccb7fd89faf45cbb4f2a21514"}, + {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22c12671194b518aa8ce2f4422bd5064f25ab57f410ba0b78705d0a219f4a97a"}, + {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79888f2f7dc25709cd5d37b032a8833741e6a3692c8823be181d542b5999128e"}, + {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:51628b4eb41fa25bd428f8f7b5b74fbb05f3ae65fbd265019a0dd1ded4fdf12a"}, + {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:1db9eb7179285403d2fb56ba1ff6ec35a44921b5e2fa5ca19d69f3f9f0285ea5"}, + {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:08ab7efae08e55812340bfd1b3f09f63848fe291675e2105eab1aa5327d3a16e"}, + {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e5fdc5264f884e7c0a1711a81dff112708a64b9c8561654ee578bfdccec6be09"}, + {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:90d6a2e6ab891043ee655ec99d5e77455a9bee9e1131bdfcfb745edde81200dd"}, + {file = "cytoolz-1.0.1-cp38-cp38-win32.whl", hash = "sha256:08946e083faa5147751b34fbf78ab931f149ef758af5c1092932b459e18dcf5c"}, + {file = "cytoolz-1.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:a91b4e10a9c03796c0dc93e47ebe25bb41ecc6fafc3cf5197c603cf767a3d44d"}, + {file = "cytoolz-1.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:980c323e626ba298b77ae62871b2de7c50b9d7219e2ddf706f52dd34b8be7349"}, + {file = "cytoolz-1.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:45f6fa1b512bc2a0f2de5123db932df06c7f69d12874fe06d67772b2828e2c8b"}, + {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f93f42d9100c415155ad1f71b0de362541afd4ac95e3153467c4c79972521b6b"}, + {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a76d20dec9c090cdf4746255bbf06a762e8cc29b5c9c1d138c380bbdb3122ade"}, + {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:239039585487c69aa50c5b78f6a422016297e9dea39755761202fb9f0530fe87"}, + {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c28307640ca2ab57b9fbf0a834b9bf563958cd9e038378c3a559f45f13c3c541"}, + {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:454880477bb901cee3a60f6324ec48c95d45acc7fecbaa9d49a5af737ded0595"}, + {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:902115d1b1f360fd81e44def30ac309b8641661150fcbdde18ead446982ada6a"}, + {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e68e6b38473a3a79cee431baa22be31cac39f7df1bf23eaa737eaff42e213883"}, + {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:32fba3f63fcb76095b0a22f4bdcc22bc62a2bd2d28d58bf02fd21754c155a3ec"}, + {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:0724ba4cf41eb40b6cf75250820ab069e44bdf4183ff78857aaf4f0061551075"}, + {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c42420e0686f887040d5230420ed44f0e960ccbfa29a0d65a3acd9ca52459209"}, + {file = "cytoolz-1.0.1-cp39-cp39-win32.whl", hash = "sha256:4ba8b16358ea56b1fe8e637ec421e36580866f2e787910bac1cf0a6997424a34"}, + {file = "cytoolz-1.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:92d27f84bf44586853d9562bfa3610ecec000149d030f793b4cb614fd9da1813"}, + {file = "cytoolz-1.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:83d19d55738ad9c60763b94f3f6d3c6e4de979aeb8d76841c1401081e0e58d96"}, + {file = "cytoolz-1.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f112a71fad6ea824578e6393765ce5c054603afe1471a5c753ff6c67fd872d10"}, + {file = "cytoolz-1.0.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a515df8f8aa6e1eaaf397761a6e4aff2eef73b5f920aedf271416d5471ae5ee"}, + {file = "cytoolz-1.0.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92c398e7b7023460bea2edffe5fcd0a76029580f06c3f6938ac3d198b47156f3"}, + {file = "cytoolz-1.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3237e56211e03b13df47435b2369f5df281e02b04ad80a948ebd199b7bc10a47"}, + {file = "cytoolz-1.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba0d1da50aab1909b165f615ba1125c8b01fcc30d606c42a61c42ea0269b5e2c"}, + {file = "cytoolz-1.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25b6e8dec29aa5a390092d193abd673e027d2c0b50774ae816a31454286c45c7"}, + {file = "cytoolz-1.0.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36cd6989ebb2f18fe9af8f13e3c61064b9f741a40d83dc5afeb0322338ad25f2"}, + {file = "cytoolz-1.0.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47394f8ab7fca3201f40de61fdeea20a2baffb101485ae14901ea89c3f6c95d"}, + {file = "cytoolz-1.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d00ac423542af944302e034e618fb055a0c4e87ba704cd6a79eacfa6ac83a3c9"}, + {file = "cytoolz-1.0.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a5ca923d1fa632f7a4fb33c0766c6fba7f87141a055c305c3e47e256fb99c413"}, + {file = "cytoolz-1.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:058bf996bcae9aad3acaeeb937d42e0c77c081081e67e24e9578a6a353cb7fb2"}, + {file = "cytoolz-1.0.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69e2a1f41a3dad94a17aef4a5cc003323359b9f0a9d63d4cc867cb5690a2551d"}, + {file = "cytoolz-1.0.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67daeeeadb012ec2b59d63cb29c4f2a2023b0c4957c3342d354b8bb44b209e9a"}, + {file = "cytoolz-1.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:54d3d36bbf0d4344d1afa22c58725d1668e30ff9de3a8f56b03db1a6da0acb11"}, + {file = "cytoolz-1.0.1.tar.gz", hash = "sha256:89cc3161b89e1bb3ed7636f74ed2e55984fd35516904fc878cae216e42b2c7d6"}, +] [package.dependencies] toolz = ">=0.8.0" @@ -85,932 +844,1667 @@ toolz = ">=0.8.0" [package.extras] cython = ["cython"] +[[package]] +name = "docopt" +version = "0.6.2" +description = "Pythonic argument parser, that will make you smile" +optional = false +python-versions = "*" +files = [ + {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, +] + [[package]] name = "eth-abi" -version = "2.1.1" +version = "5.2.0" description = "eth_abi: Python utilities for working with Ethereum ABI definitions, especially encoding and decoding" -category = "main" optional = false -python-versions = ">=3.6, <4" +python-versions = "<4,>=3.8" +files = [ + {file = "eth_abi-5.2.0-py3-none-any.whl", hash = "sha256:17abe47560ad753f18054f5b3089fcb588f3e3a092136a416b6c1502cb7e8877"}, + {file = "eth_abi-5.2.0.tar.gz", hash = "sha256:178703fa98c07d8eecd5ae569e7e8d159e493ebb6eeb534a8fe973fbc4e40ef0"}, +] [package.dependencies] -eth-typing = ">=2.0.0,<3.0.0" -eth-utils = ">=1.2.0,<2.0.0" -parsimonious = ">=0.8.0,<0.9.0" +eth-typing = ">=3.0.0" +eth-utils = ">=2.0.0" +parsimonious = ">=0.10.0,<0.11.0" [package.extras] -dev = ["bumpversion (>=0.5.3,<1)", "pytest-watch (>=4.1.0,<5)", "wheel", "twine", "ipython", "pytest (==4.4.1)", "pytest-pythonpath (>=0.7.1)", "pytest-xdist (==1.22.3)", "tox (>=2.9.1,<3)", "eth-hash", "hypothesis (>=3.6.1,<4)", "flake8 (==3.4.1)", "isort (>=4.2.15,<5)", "mypy (==0.701)", "pydocstyle (>=3.0.0,<4)", "Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=19.2.0,<20)"] -doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=19.2.0,<20)"] -lint = ["flake8 (==3.4.1)", "isort (>=4.2.15,<5)", "mypy (==0.701)", "pydocstyle (>=3.0.0,<4)"] -test = ["pytest (==4.4.1)", "pytest-pythonpath (>=0.7.1)", "pytest-xdist (==1.22.3)", "tox (>=2.9.1,<3)", "eth-hash", "hypothesis (>=3.6.1,<4)"] -tools = ["hypothesis (>=3.6.1,<4)"] +dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "eth-hash[pycryptodome]", "hypothesis (>=6.22.0,<6.108.7)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-pythonpath (>=0.7.1)", "pytest-timeout (>=2.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] +test = ["eth-hash[pycryptodome]", "hypothesis (>=6.22.0,<6.108.7)", "pytest (>=7.0.0)", "pytest-pythonpath (>=0.7.1)", "pytest-timeout (>=2.0.0)", "pytest-xdist (>=2.4.0)"] +tools = ["hypothesis (>=6.22.0,<6.108.7)"] [[package]] name = "eth-account" -version = "0.5.6" +version = "0.11.3" description = "eth-account: Sign Ethereum transactions and messages with local private keys" -category = "main" optional = false -python-versions = ">=3.6, <4" +python-versions = "<4,>=3.8" +files = [ + {file = "eth_account-0.11.3-py3-none-any.whl", hash = "sha256:16cf58aabc65171fc206489899b7e5546e3215e1a4debc12dbd55345c979081e"}, + {file = "eth_account-0.11.3.tar.gz", hash = "sha256:a712a9534638a7cfaa4cc069f1b9d5cefeee70362cfc3a7b0a2534ee61ce76c9"}, +] [package.dependencies] -bitarray = ">=1.2.1,<1.3.0" -eth-abi = ">=2.0.0b7,<3" -eth-keyfile = ">=0.5.0,<0.6.0" -eth-keys = ">=0.2.1,<0.3.2 || >0.3.2,<0.4.0" -eth-rlp = ">=0.1.2,<2" -eth-utils = ">=1.3.0,<2" -hexbytes = ">=0.1.0,<1" -rlp = ">=1.0.0,<3" +bitarray = ">=2.4.0" +ckzg = ">=0.4.3,<2" +eth-abi = ">=4.0.0-b.2" +eth-keyfile = ">=0.6.0" +eth-keys = ">=0.4.0" +eth-rlp = ">=0.3.0" +eth-utils = ">=2.0.0" +hexbytes = ">=0.1.0,<0.4.0" +rlp = ">=1.0.0" [package.extras] -dev = ["bumpversion (>=0.5.3,<1)", "pytest-watch (>=4.1.0,<5)", "wheel", "twine", "ipython", "hypothesis (>=4.18.0,<5)", "pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)", "flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)", "Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)"] -doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)"] -lint = ["flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)"] -test = ["hypothesis (>=4.18.0,<5)", "pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)"] +dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "coverage", "hypothesis (>=4.18.0,<5)", "ipython", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +test = ["coverage", "hypothesis (>=4.18.0,<5)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "eth-hash" -version = "0.3.2" +version = "0.7.1" description = "eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3" -category = "main" optional = false -python-versions = ">=3.5, <4" +python-versions = "<4,>=3.8" +files = [ + {file = "eth_hash-0.7.1-py3-none-any.whl", hash = "sha256:0fb1add2adf99ef28883fd6228eb447ef519ea72933535ad1a0b28c6f65f868a"}, + {file = "eth_hash-0.7.1.tar.gz", hash = "sha256:d2411a403a0b0a62e8247b4117932d900ffb4c8c64b15f92620547ca5ce46be5"}, +] [package.dependencies] pycryptodome = {version = ">=3.6.6,<4", optional = true, markers = "extra == \"pycryptodome\""} [package.extras] -dev = ["bumpversion (>=0.5.3,<1)", "pytest-watch (>=4.1.0,<5)", "wheel", "twine", "ipython", "pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)", "flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)", "Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)"] -doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)"] -lint = ["flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)"] +dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] pycryptodome = ["pycryptodome (>=3.6.6,<4)"] -pysha3 = ["pysha3 (>=1.0.0,<2.0.0)"] -test = ["pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)"] +pysha3 = ["pysha3 (>=1.0.0,<2.0.0)", "safe-pysha3 (>=1.0.0)"] +test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "eth-keyfile" -version = "0.5.1" -description = "A library for handling the encrypted keyfiles used to store ethereum private keys." -category = "main" +version = "0.8.1" +description = "eth-keyfile: A library for handling the encrypted keyfiles used to store ethereum private keys" optional = false -python-versions = "*" +python-versions = "<4,>=3.8" +files = [ + {file = "eth_keyfile-0.8.1-py3-none-any.whl", hash = "sha256:65387378b82fe7e86d7cb9f8d98e6d639142661b2f6f490629da09fddbef6d64"}, + {file = "eth_keyfile-0.8.1.tar.gz", hash = "sha256:9708bc31f386b52cca0969238ff35b1ac72bd7a7186f2a84b86110d3c973bec1"}, +] [package.dependencies] -cytoolz = ">=0.9.0,<1.0.0" -eth-keys = ">=0.1.0-beta.4,<1.0.0" -eth-utils = ">=1.0.0-beta.1,<2.0.0" -pycryptodome = ">=3.4.7,<4.0.0" +eth-keys = ">=0.4.0" +eth-utils = ">=2" +pycryptodome = ">=3.6.6,<4" + +[package.extras] +dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "ipython", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["towncrier (>=21,<22)"] +test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "eth-keys" -version = "0.3.3" -description = "Common API for Ethereum key operations." -category = "main" +version = "0.6.1" +description = "eth-keys: Common API for Ethereum key operations" optional = false -python-versions = "*" +python-versions = "<4,>=3.8" +files = [ + {file = "eth_keys-0.6.1-py3-none-any.whl", hash = "sha256:7deae4cd56e862e099ec58b78176232b931c4ea5ecded2f50c7b1ccbc10c24cf"}, + {file = "eth_keys-0.6.1.tar.gz", hash = "sha256:a43e263cbcabfd62fa769168efc6c27b1f5603040e4de22bb84d12567e4fd962"}, +] [package.dependencies] -eth-typing = ">=2.2.1,<3.0.0" -eth-utils = ">=1.3.0,<2.0.0" +eth-typing = ">=3" +eth-utils = ">=2" [package.extras] -coincurve = ["coincurve (>=7.0.0,<13.0.0)"] -dev = ["tox (==2.7.0)", "bumpversion (==0.5.3)", "twine", "eth-utils (>=1.3.0,<2.0.0)", "eth-typing (>=2.2.1,<3.0.0)", "flake8 (==3.0.4)", "mypy (==0.701)", "asn1tools (>=0.146.2,<0.147)", "pyasn1 (>=0.4.5,<0.5)", "pytest (==3.2.2)", "hypothesis (>=4.56.1,<5.0.0)", "eth-hash", "eth-hash"] -eth-keys = ["eth-utils (>=1.3.0,<2.0.0)", "eth-typing (>=2.2.1,<3.0.0)"] -lint = ["flake8 (==3.0.4)", "mypy (==0.701)"] -test = ["asn1tools (>=0.146.2,<0.147)", "pyasn1 (>=0.4.5,<0.5)", "pytest (==3.2.2)", "hypothesis (>=4.56.1,<5.0.0)", "eth-hash", "eth-hash"] +coincurve = ["coincurve (>=12.0.0)"] +dev = ["asn1tools (>=0.146.2)", "build (>=0.9.0)", "bump_my_version (>=0.19.0)", "coincurve (>=12.0.0)", "eth-hash[pysha3]", "factory-boy (>=3.0.1)", "hypothesis (>=5.10.3)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pyasn1 (>=0.4.5)", "pytest (>=7.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["towncrier (>=24,<25)"] +test = ["asn1tools (>=0.146.2)", "eth-hash[pysha3]", "factory-boy (>=3.0.1)", "hypothesis (>=5.10.3)", "pyasn1 (>=0.4.5)", "pytest (>=7.0.0)"] [[package]] name = "eth-rlp" -version = "0.2.1" +version = "1.0.1" description = "eth-rlp: RLP definitions for common Ethereum objects in Python" -category = "main" optional = false -python-versions = ">=3.6, <4" +python-versions = ">=3.8, <4" +files = [ + {file = "eth-rlp-1.0.1.tar.gz", hash = "sha256:d61dbda892ee1220f28fb3663c08f6383c305db9f1f5624dc585c9cd05115027"}, + {file = "eth_rlp-1.0.1-py3-none-any.whl", hash = "sha256:dd76515d71654277377d48876b88e839d61553aaf56952e580bb7cebef2b1517"}, +] [package.dependencies] -eth-utils = ">=1.0.1,<2" +eth-utils = ">=2.0.0" hexbytes = ">=0.1.0,<1" -rlp = ">=0.6.0,<3" +rlp = ">=0.6.0" +typing-extensions = {version = ">=4.0.1", markers = "python_version <= \"3.11\""} [package.extras] -dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "eth-hash", "flake8 (==3.7.9)", "ipython", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=3.0.0,<4)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "pytest (==5.4.1)", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=19.2.0,<20)", "tox (==3.14.6)", "twine", "wheel"] -doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=19.2.0,<20)"] -lint = ["flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=3.0.0,<4)"] -test = ["eth-hash", "pytest-xdist", "pytest (==5.4.1)", "tox (==3.14.6)"] +dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "eth-hash[pycryptodome]", "ipython", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +test = ["eth-hash[pycryptodome]", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "eth-typing" -version = "2.2.2" +version = "4.4.0" description = "eth-typing: Common type annotations for ethereum python packages" -category = "main" optional = false -python-versions = ">=3.5, <4" +python-versions = "<4,>=3.8" +files = [ + {file = "eth_typing-4.4.0-py3-none-any.whl", hash = "sha256:a5e30a6e69edda7b1d1e96e9d71bab48b9bb988a77909d8d1666242c5562f841"}, + {file = "eth_typing-4.4.0.tar.gz", hash = "sha256:93848083ac6bb4c20cc209ea9153a08b0a528be23337c889f89e1e5ffbe9807d"}, +] + +[package.dependencies] +typing-extensions = ">=4.5.0" [package.extras] -dev = ["bumpversion (>=0.5.3,<1)", "pytest-watch (>=4.1.0,<5)", "wheel", "twine", "ipython", "pytest (>=4.4,<4.5)", "pytest-xdist", "tox (>=2.9.1,<3)", "flake8 (==3.8.3)", "isort (>=4.2.15,<5)", "mypy (==0.782)", "pydocstyle (>=3.0.0,<4)", "Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)"] -doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)"] -lint = ["flake8 (==3.8.3)", "isort (>=4.2.15,<5)", "mypy (==0.782)", "pydocstyle (>=3.0.0,<4)"] -test = ["pytest (>=4.4,<4.5)", "pytest-xdist", "tox (>=2.9.1,<3)"] +dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "ipython", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "eth-utils" -version = "1.10.0" +version = "4.1.1" description = "eth-utils: Common utility functions for python code that interacts with Ethereum" -category = "main" optional = false -python-versions = ">=3.5,!=3.5.2,<4" +python-versions = "<4,>=3.8" +files = [ + {file = "eth_utils-4.1.1-py3-none-any.whl", hash = "sha256:ccbbac68a6d65cb6e294c5bcb6c6a5cec79a241c56dc5d9c345ed788c30f8534"}, + {file = "eth_utils-4.1.1.tar.gz", hash = "sha256:71c8d10dec7494aeed20fa7a4d52ec2ce4a2e52fdce80aab4f5c3c19f3648b25"}, +] [package.dependencies] -cytoolz = {version = ">=0.10.1,<1.0.0", markers = "implementation_name == \"cpython\""} -eth-hash = ">=0.3.1,<0.4.0" -eth-typing = ">=2.2.1,<3.0.0" -toolz = {version = ">0.8.2,<1", markers = "implementation_name == \"pypy\""} +cytoolz = {version = ">=0.10.1", markers = "implementation_name == \"cpython\""} +eth-hash = ">=0.3.1" +eth-typing = ">=3.0.0" +toolz = {version = ">0.8.2", markers = "implementation_name == \"pypy\""} + +[package.extras] +dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "eth-hash[pycryptodome]", "hypothesis (>=4.43.0)", "ipython", "mypy (==1.5.1)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +test = ["hypothesis (>=4.43.0)", "mypy (==1.5.1)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] + +[[package]] +name = "exceptiongroup" +version = "1.2.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, +] [package.extras] -dev = ["bumpversion (>=0.5.3,<1)", "pytest-watch (>=4.1.0,<5)", "wheel (>=0.30.0,<1.0.0)", "twine (>=1.13,<2)", "ipython", "hypothesis (>=4.43.0,<5.0.0)", "pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)", "black (>=18.6b4,<19)", "flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.720)", "pydocstyle (>=5.0.0,<6)", "pytest (>=3.4.1,<4.0.0)", "Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<2)", "towncrier (>=19.2.0,<20)"] -doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<2)", "towncrier (>=19.2.0,<20)"] -lint = ["black (>=18.6b4,<19)", "flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.720)", "pydocstyle (>=5.0.0,<6)", "pytest (>=3.4.1,<4.0.0)"] -test = ["hypothesis (>=4.43.0,<5.0.0)", "pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)"] +test = ["pytest (>=6)"] + +[[package]] +name = "flake8" +version = "6.1.0" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.8.1" +files = [ + {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"}, + {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.11.0,<2.12.0" +pyflakes = ">=3.1.0,<3.2.0" + +[[package]] +name = "frozenlist" +version = "1.5.0" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5"}, + {file = "frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb"}, + {file = "frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf"}, + {file = "frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942"}, + {file = "frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f"}, + {file = "frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8"}, + {file = "frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03"}, + {file = "frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c"}, + {file = "frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e"}, + {file = "frozenlist-1.5.0-cp38-cp38-win32.whl", hash = "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723"}, + {file = "frozenlist-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c"}, + {file = "frozenlist-1.5.0-cp39-cp39-win32.whl", hash = "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3"}, + {file = "frozenlist-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0"}, + {file = "frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3"}, + {file = "frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817"}, +] [[package]] name = "gql" -version = "2.0.0" +version = "3.5.0" description = "GraphQL client for Python" -category = "main" optional = false python-versions = "*" +files = [ + {file = "gql-3.5.0-py2.py3-none-any.whl", hash = "sha256:70dda5694a5b194a8441f077aa5fb70cc94e4ec08016117523f013680901ecb7"}, + {file = "gql-3.5.0.tar.gz", hash = "sha256:ccb9c5db543682b28f577069950488218ed65d4ac70bb03b6929aaadaf636de9"}, +] [package.dependencies] -graphql-core = ">=2.3.2,<3" -promise = ">=2.3,<3" -requests = ">=2.12,<3" -six = ">=1.10.0" +anyio = ">=3.0,<5" +backoff = ">=1.11.1,<3.0" +graphql-core = ">=3.2,<3.3" +yarl = ">=1.6,<2.0" [package.extras] -dev = ["flake8 (==3.8.1)", "isort (==4.3.21)", "black (==19.10b0)", "mypy (==0.770)", "check-manifest (>=0.42,<1)", "pytest (==5.4.2)", "pytest-asyncio (==0.11.0)", "pytest-cov (==2.8.1)", "mock (==4.0.2)", "vcrpy (==4.0.2)", "coveralls (==2.0.0)"] -test = ["pytest (==5.4.2)", "pytest-asyncio (==0.11.0)", "pytest-cov (==2.8.1)", "mock (==4.0.2)", "vcrpy (==4.0.2)", "coveralls (==2.0.0)"] +aiohttp = ["aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)"] +all = ["aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)", "botocore (>=1.21,<2)", "httpx (>=0.23.1,<1)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "websockets (>=10,<12)"] +botocore = ["botocore (>=1.21,<2)"] +dev = ["aiofiles", "aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)", "black (==22.3.0)", "botocore (>=1.21,<2)", "check-manifest (>=0.42,<1)", "flake8 (==3.8.1)", "httpx (>=0.23.1,<1)", "isort (==4.3.21)", "mock (==4.0.2)", "mypy (==0.910)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "sphinx (>=5.3.0,<6)", "sphinx-argparse (==0.2.5)", "sphinx-rtd-theme (>=0.4,<1)", "types-aiofiles", "types-mock", "types-requests", "vcrpy (==4.4.0)", "websockets (>=10,<12)"] +httpx = ["httpx (>=0.23.1,<1)"] +requests = ["requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)"] +test = ["aiofiles", "aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)", "botocore (>=1.21,<2)", "httpx (>=0.23.1,<1)", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "vcrpy (==4.4.0)", "websockets (>=10,<12)"] +test-no-transport = ["aiofiles", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "vcrpy (==4.4.0)"] +websockets = ["websockets (>=10,<12)"] [[package]] name = "graphql-core" -version = "2.3.2" -description = "GraphQL implementation for Python" -category = "main" +version = "3.2.5" +description = "GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL." optional = false -python-versions = "*" +python-versions = "<4,>=3.6" +files = [ + {file = "graphql_core-3.2.5-py3-none-any.whl", hash = "sha256:2f150d5096448aa4f8ab26268567bbfeef823769893b39c1a2e1409590939c8a"}, + {file = "graphql_core-3.2.5.tar.gz", hash = "sha256:e671b90ed653c808715645e3998b7ab67d382d55467b7e2978549111bbabf8d5"}, +] [package.dependencies] -promise = ">=2.3,<3" -rx = ">=1.6,<2" -six = ">=1.10.0" - -[package.extras] -gevent = ["gevent (>=1.1)"] -test = ["six (==1.14.0)", "pyannotate (==1.2.0)", "pytest (==4.6.10)", "pytest-django (==3.9.0)", "pytest-cov (==2.8.1)", "coveralls (==1.11.1)", "cython (==0.29.17)", "gevent (==1.5.0)", "pytest-benchmark (==3.2.3)", "pytest-mock (==2.0.0)"] +typing-extensions = {version = ">=4,<5", markers = "python_version < \"3.10\""} [[package]] name = "hexbytes" -version = "0.2.2" +version = "0.3.1" description = "hexbytes: Python `bytes` subclass that decodes hex, with a readable console output" -category = "main" optional = false -python-versions = ">=3.6, <4" +python-versions = ">=3.7, <4" +files = [ + {file = "hexbytes-0.3.1-py3-none-any.whl", hash = "sha256:383595ad75026cf00abd570f44b368c6cdac0c6becfae5c39ff88829877f8a59"}, + {file = "hexbytes-0.3.1.tar.gz", hash = "sha256:a3fe35c6831ee8fafd048c4c086b986075fc14fd46258fa24ecb8d65745f9a9d"}, +] [package.extras] -dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "eth-utils (>=1.0.1,<2)", "flake8 (==3.7.9)", "hypothesis (>=3.44.24,<4)", "ipython", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "pytest (==5.4.1)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)", "tox (==3.14.6)", "twine", "wheel"] -doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)"] -lint = ["flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)"] -test = ["eth-utils (>=1.0.1,<2)", "hypothesis (>=3.44.24,<4)", "pytest-xdist", "pytest (==5.4.1)", "tox (==3.14.6)"] +dev = ["black (>=22)", "bumpversion (>=0.5.3)", "eth-utils (>=1.0.1,<3)", "flake8 (==6.0.0)", "flake8-bugbear (==23.3.23)", "hypothesis (>=3.44.24,<=6.31.6)", "ipython", "isort (>=5.10.1)", "mypy (==0.971)", "pydocstyle (>=5.0.0)", "pytest (>=7.0.0)", "pytest-watch (>=4.1.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=5.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +doc = ["sphinx (>=5.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +lint = ["black (>=22)", "flake8 (==6.0.0)", "flake8-bugbear (==23.3.23)", "isort (>=5.10.1)", "mypy (==0.971)", "pydocstyle (>=5.0.0)"] +test = ["eth-utils (>=1.0.1,<3)", "hypothesis (>=3.44.24,<=6.31.6)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "idna" -version = "2.10" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "importlib-metadata" -version = "4.8.2" -description = "Read metadata from Python packages" -category = "main" optional = false python-versions = ">=3.6" - -[package.dependencies] -typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} -zipp = ">=0.5" +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] [[package]] name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" -category = "dev" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" optional = false -python-versions = "*" +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] [[package]] -name = "ipfshttpclient" -version = "0.7.0a1" -description = "Python IPFS HTTP CLIENT library" -category = "main" +name = "isort" +version = "5.13.2" +description = "A Python utility / library to sort Python imports." optional = false -python-versions = ">=3.5.4,!=3.6.0,!=3.6.1,!=3.7.0,!=3.7.1" +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, +] -[package.dependencies] -multiaddr = ">=0.0.7" -requests = ">=2.11" +[package.extras] +colors = ["colorama (>=0.4.6)"] [[package]] name = "jsonschema" -version = "3.2.0" +version = "4.23.0" description = "An implementation of JSON Schema validation for Python" -category = "main" optional = false -python-versions = "*" +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, +] [package.dependencies] -attrs = ">=17.4.0" -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} -pyrsistent = ">=0.14.0" -six = ">=1.11.0" +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" [package.extras] -format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] -format_nongpl = ["idna", "jsonpointer (>1.13)", "webcolors", "rfc3986-validator (>0.1.0)", "rfc3339-validator"] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] + +[[package]] +name = "jsonschema-specifications" +version = "2024.10.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.9" +files = [ + {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, + {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, +] + +[package.dependencies] +referencing = ">=0.31.0" [[package]] name = "jstyleson" version = "0.0.2" description = "Library to parse JSON with js-style comments." -category = "main" optional = false python-versions = "*" +files = [ + {file = "jstyleson-0.0.2.tar.gz", hash = "sha256:680003f3b15a2959e4e6a351f3b858e3c07dd3e073a0d54954e34d8ea5e1308e"}, +] [[package]] name = "lru-dict" -version = "1.1.7" +version = "1.2.0" description = "An Dict like LRU container." -category = "main" optional = false python-versions = "*" +files = [ + {file = "lru-dict-1.2.0.tar.gz", hash = "sha256:13c56782f19d68ddf4d8db0170041192859616514c706b126d0df2ec72a11bd7"}, + {file = "lru_dict-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:de906e5486b5c053d15b7731583c25e3c9147c288ac8152a6d1f9bccdec72641"}, + {file = "lru_dict-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604d07c7604b20b3130405d137cae61579578b0e8377daae4125098feebcb970"}, + {file = "lru_dict-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:203b3e78d03d88f491fa134f85a42919020686b6e6f2d09759b2f5517260c651"}, + {file = "lru_dict-1.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:020b93870f8c7195774cbd94f033b96c14f51c57537969965c3af300331724fe"}, + {file = "lru_dict-1.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1184d91cfebd5d1e659d47f17a60185bbf621635ca56dcdc46c6a1745d25df5c"}, + {file = "lru_dict-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fc42882b554a86e564e0b662da47b8a4b32fa966920bd165e27bb8079a323bc1"}, + {file = "lru_dict-1.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:18ee88ada65bd2ffd483023be0fa1c0a6a051ef666d1cd89e921dcce134149f2"}, + {file = "lru_dict-1.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:756230c22257597b7557eaef7f90484c489e9ba78e5bb6ab5a5bcfb6b03cb075"}, + {file = "lru_dict-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c4da599af36618881748b5db457d937955bb2b4800db891647d46767d636c408"}, + {file = "lru_dict-1.2.0-cp310-cp310-win32.whl", hash = "sha256:35a142a7d1a4fd5d5799cc4f8ab2fff50a598d8cee1d1c611f50722b3e27874f"}, + {file = "lru_dict-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:6da5b8099766c4da3bf1ed6e7d7f5eff1681aff6b5987d1258a13bd2ed54f0c9"}, + {file = "lru_dict-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b20b7c9beb481e92e07368ebfaa363ed7ef61e65ffe6e0edbdbaceb33e134124"}, + {file = "lru_dict-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22147367b296be31cc858bf167c448af02435cac44806b228c9be8117f1bfce4"}, + {file = "lru_dict-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34a3091abeb95e707f381a8b5b7dc8e4ee016316c659c49b726857b0d6d1bd7a"}, + {file = "lru_dict-1.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:877801a20f05c467126b55338a4e9fa30e2a141eb7b0b740794571b7d619ee11"}, + {file = "lru_dict-1.2.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d3336e901acec897bcd318c42c2b93d5f1d038e67688f497045fc6bad2c0be7"}, + {file = "lru_dict-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8dafc481d2defb381f19b22cc51837e8a42631e98e34b9e0892245cc96593deb"}, + {file = "lru_dict-1.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:87bbad3f5c3de8897b8c1263a9af73bbb6469fb90e7b57225dad89b8ef62cd8d"}, + {file = "lru_dict-1.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:25f9e0bc2fe8f41c2711ccefd2871f8a5f50a39e6293b68c3dec576112937aad"}, + {file = "lru_dict-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ae301c282a499dc1968dd633cfef8771dd84228ae9d40002a3ea990e4ff0c469"}, + {file = "lru_dict-1.2.0-cp311-cp311-win32.whl", hash = "sha256:c9617583173a29048e11397f165501edc5ae223504a404b2532a212a71ecc9ed"}, + {file = "lru_dict-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6b7a031e47421d4b7aa626b8c91c180a9f037f89e5d0a71c4bb7afcf4036c774"}, + {file = "lru_dict-1.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ea2ac3f7a7a2f32f194c84d82a034e66780057fd908b421becd2f173504d040e"}, + {file = "lru_dict-1.2.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd46c94966f631a81ffe33eee928db58e9fbee15baba5923d284aeadc0e0fa76"}, + {file = "lru_dict-1.2.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:086ce993414f0b28530ded7e004c77dc57c5748fa6da488602aa6e7f79e6210e"}, + {file = "lru_dict-1.2.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df25a426446197488a6702954dcc1de511deee20c9db730499a2aa83fddf0df1"}, + {file = "lru_dict-1.2.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c53b12b89bd7a6c79f0536ff0d0a84fdf4ab5f6252d94b24b9b753bd9ada2ddf"}, + {file = "lru_dict-1.2.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f9484016e6765bd295708cccc9def49f708ce07ac003808f69efa386633affb9"}, + {file = "lru_dict-1.2.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d0f7ec902a0097ac39f1922c89be9eaccf00eb87751e28915320b4f72912d057"}, + {file = "lru_dict-1.2.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:981ef3edc82da38d39eb60eae225b88a538d47b90cce2e5808846fd2cf64384b"}, + {file = "lru_dict-1.2.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e25b2e90a032dc248213af7f3f3e975e1934b204f3b16aeeaeaff27a3b65e128"}, + {file = "lru_dict-1.2.0-cp36-cp36m-win32.whl", hash = "sha256:59f3df78e94e07959f17764e7fa7ca6b54e9296953d2626a112eab08e1beb2db"}, + {file = "lru_dict-1.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:de24b47159e07833aeab517d9cb1c3c5c2d6445cc378b1c2f1d8d15fb4841d63"}, + {file = "lru_dict-1.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d0dd4cd58220351233002f910e35cc01d30337696b55c6578f71318b137770f9"}, + {file = "lru_dict-1.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a87bdc291718bbdf9ea4be12ae7af26cbf0706fa62c2ac332748e3116c5510a7"}, + {file = "lru_dict-1.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05fb8744f91f58479cbe07ed80ada6696ec7df21ea1740891d4107a8dd99a970"}, + {file = "lru_dict-1.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00f6e8a3fc91481b40395316a14c94daa0f0a5de62e7e01a7d589f8d29224052"}, + {file = "lru_dict-1.2.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b172fce0a0ffc0fa6d282c14256d5a68b5db1e64719c2915e69084c4b6bf555"}, + {file = "lru_dict-1.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e707d93bae8f0a14e6df1ae8b0f076532b35f00e691995f33132d806a88e5c18"}, + {file = "lru_dict-1.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b9ec7a4a0d6b8297102aa56758434fb1fca276a82ed7362e37817407185c3abb"}, + {file = "lru_dict-1.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:f404dcc8172da1f28da9b1f0087009578e608a4899b96d244925c4f463201f2a"}, + {file = "lru_dict-1.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1171ad3bff32aa8086778be4a3bdff595cc2692e78685bcce9cb06b96b22dcc2"}, + {file = "lru_dict-1.2.0-cp37-cp37m-win32.whl", hash = "sha256:0c316dfa3897fabaa1fe08aae89352a3b109e5f88b25529bc01e98ac029bf878"}, + {file = "lru_dict-1.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5919dd04446bc1ee8d6ecda2187deeebfff5903538ae71083e069bc678599446"}, + {file = "lru_dict-1.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbf36c5a220a85187cacc1fcb7dd87070e04b5fc28df7a43f6842f7c8224a388"}, + {file = "lru_dict-1.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:712e71b64da181e1c0a2eaa76cd860265980cd15cb0e0498602b8aa35d5db9f8"}, + {file = "lru_dict-1.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f54908bf91280a9b8fa6a8c8f3c2f65850ce6acae2852bbe292391628ebca42f"}, + {file = "lru_dict-1.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3838e33710935da2ade1dd404a8b936d571e29268a70ff4ca5ba758abb3850df"}, + {file = "lru_dict-1.2.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5d5a5f976b39af73324f2b793862859902ccb9542621856d51a5993064f25e4"}, + {file = "lru_dict-1.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8bda3a9afd241ee0181661decaae25e5336ce513ac268ab57da737eacaa7871f"}, + {file = "lru_dict-1.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:bd2cd1b998ea4c8c1dad829fc4fa88aeed4dee555b5e03c132fc618e6123f168"}, + {file = "lru_dict-1.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b55753ee23028ba8644fd22e50de7b8f85fa60b562a0fafaad788701d6131ff8"}, + {file = "lru_dict-1.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7e51fa6a203fa91d415f3b2900e5748ec8e06ad75777c98cc3aeb3983ca416d7"}, + {file = "lru_dict-1.2.0-cp38-cp38-win32.whl", hash = "sha256:cd6806313606559e6c7adfa0dbeb30fc5ab625f00958c3d93f84831e7a32b71e"}, + {file = "lru_dict-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:5d90a70c53b0566084447c3ef9374cc5a9be886e867b36f89495f211baabd322"}, + {file = "lru_dict-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3ea7571b6bf2090a85ff037e6593bbafe1a8598d5c3b4560eb56187bcccb4dc"}, + {file = "lru_dict-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:287c2115a59c1c9ed0d5d8ae7671e594b1206c36ea9df2fca6b17b86c468ff99"}, + {file = "lru_dict-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5ccfd2291c93746a286c87c3f895165b697399969d24c54804ec3ec559d4e43"}, + {file = "lru_dict-1.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b710f0f4d7ec4f9fa89dfde7002f80bcd77de8024017e70706b0911ea086e2ef"}, + {file = "lru_dict-1.2.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5345bf50e127bd2767e9fd42393635bbc0146eac01f6baf6ef12c332d1a6a329"}, + {file = "lru_dict-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:291d13f85224551913a78fe695cde04cbca9dcb1d84c540167c443eb913603c9"}, + {file = "lru_dict-1.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d5bb41bc74b321789803d45b124fc2145c1b3353b4ad43296d9d1d242574969b"}, + {file = "lru_dict-1.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0facf49b053bf4926d92d8d5a46fe07eecd2af0441add0182c7432d53d6da667"}, + {file = "lru_dict-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:987b73a06bcf5a95d7dc296241c6b1f9bc6cda42586948c9dabf386dc2bef1cd"}, + {file = "lru_dict-1.2.0-cp39-cp39-win32.whl", hash = "sha256:231d7608f029dda42f9610e5723614a35b1fff035a8060cf7d2be19f1711ace8"}, + {file = "lru_dict-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:71da89e134747e20ed5b8ad5b4ee93fc5b31022c2b71e8176e73c5a44699061b"}, + {file = "lru_dict-1.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:21b3090928c7b6cec509e755cc3ab742154b33660a9b433923bd12c37c448e3e"}, + {file = "lru_dict-1.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaecd7085212d0aa4cd855f38b9d61803d6509731138bf798a9594745953245b"}, + {file = "lru_dict-1.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ead83ac59a29d6439ddff46e205ce32f8b7f71a6bd8062347f77e232825e3d0a"}, + {file = "lru_dict-1.2.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:312b6b2a30188586fe71358f0f33e4bac882d33f5e5019b26f084363f42f986f"}, + {file = "lru_dict-1.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b30122e098c80e36d0117810d46459a46313421ce3298709170b687dc1240b02"}, + {file = "lru_dict-1.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f010cfad3ab10676e44dc72a813c968cd586f37b466d27cde73d1f7f1ba158c2"}, + {file = "lru_dict-1.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20f5f411f7751ad9a2c02e80287cedf69ae032edd321fe696e310d32dd30a1f8"}, + {file = "lru_dict-1.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afdadd73304c9befaed02eb42f5f09fdc16288de0a08b32b8080f0f0f6350aa6"}, + {file = "lru_dict-1.2.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7ab0c10c4fa99dc9e26b04e6b62ac32d2bcaea3aad9b81ec8ce9a7aa32b7b1b"}, + {file = "lru_dict-1.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:edad398d5d402c43d2adada390dd83c74e46e020945ff4df801166047013617e"}, + {file = "lru_dict-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:91d577a11b84387013815b1ad0bb6e604558d646003b44c92b3ddf886ad0f879"}, + {file = "lru_dict-1.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb12f19cdf9c4f2d9aa259562e19b188ff34afab28dd9509ff32a3f1c2c29326"}, + {file = "lru_dict-1.2.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e4c85aa8844bdca3c8abac3b7f78da1531c74e9f8b3e4890c6e6d86a5a3f6c0"}, + {file = "lru_dict-1.2.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c6acbd097b15bead4de8e83e8a1030bb4d8257723669097eac643a301a952f0"}, + {file = "lru_dict-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b6613daa851745dd22b860651de930275be9d3e9373283a2164992abacb75b62"}, +] + +[package.extras] +test = ["pytest"] [[package]] -name = "multiaddr" -version = "0.0.9" -description = "Python implementation of jbenet's multiaddr" -category = "main" +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" - -[package.dependencies] -base58 = "*" -netaddr = "*" -six = "*" -varint = "*" +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] [[package]] -name = "multicall" -version = "0.1.3" -description = "aggregate results from multiple ethereum contract calls" -category = "main" +name = "multidict" +version = "6.1.0" +description = "multidict implementation" optional = false -python-versions = ">=3.7,<4.0" +python-versions = ">=3.8" +files = [ + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, + {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, + {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, + {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, + {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, + {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, + {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, + {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, + {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, + {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, + {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, + {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, + {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, + {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, + {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, +] [package.dependencies] -eth_abi = ">=2.1.0,<3.0.0" -eth_utils = ">=1.8.4,<2.0.0" -web3 = ">=5.4.0,<6.0.0" +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} [[package]] -name = "netaddr" -version = "0.8.0" -description = "A network address manipulation library for Python" -category = "main" +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." optional = false -python-versions = "*" +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] [[package]] -name = "packaging" -version = "21.3" -description = "Core utilities for Python packages" -category = "dev" +name = "open-multicaller" +version = "0.2.0" +description = "web3py multicaller simplified interface" optional = false -python-versions = ">=3.6" +python-versions = "<4,>=3.8.1" +files = [ + {file = "open_multicaller-0.2.0-py3-none-any.whl", hash = "sha256:16d283df9b3644a67d7597734b22416ecb9e2c1f8310487fe035e4c8a23a5e2f"}, + {file = "open_multicaller-0.2.0.tar.gz", hash = "sha256:742889c86c1b384eddfbec8d05edfb9466ff3a2bc3e641f3252c2576a01e2b8f"}, +] [package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" +web3 = ">=6,<7" + +[[package]] +name = "packaging" +version = "24.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, +] [[package]] name = "parsimonious" -version = "0.8.1" +version = "0.10.0" description = "(Soon to be) the fastest pure-Python PEG parser I could muster" -category = "main" optional = false python-versions = "*" +files = [ + {file = "parsimonious-0.10.0-py3-none-any.whl", hash = "sha256:982ab435fabe86519b57f6b35610aa4e4e977e9f02a14353edf4bbc75369fc0f"}, + {file = "parsimonious-0.10.0.tar.gz", hash = "sha256:8281600da180ec8ae35427a4ab4f7b82bfec1e3d1e52f80cb60ea82b9512501c"}, +] [package.dependencies] -six = ">=1.9.0" +regex = ">=2022.3.15" + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "platformdirs" +version = "4.3.6" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "pluggy" -version = "1.0.0" +version = "1.5.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false -python-versions = ">=3.6" - -[package.dependencies] -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] [[package]] -name = "promise" -version = "2.3" -description = "Promises/A+ implementation for Python" -category = "main" +name = "propcache" +version = "0.2.1" +description = "Accelerated property cache" optional = false -python-versions = "*" - -[package.dependencies] -six = "*" - -[package.extras] -test = ["pytest (>=2.7.3)", "pytest-cov", "coveralls", "futures", "pytest-benchmark", "mock"] +python-versions = ">=3.9" +files = [ + {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6"}, + {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2"}, + {file = "propcache-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6445804cf4ec763dc70de65a3b0d9954e868609e83850a47ca4f0cb64bd79fea"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9479aa06a793c5aeba49ce5c5692ffb51fcd9a7016e017d555d5e2b0045d212"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9631c5e8b5b3a0fda99cb0d29c18133bca1e18aea9effe55adb3da1adef80d3"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3156628250f46a0895f1f36e1d4fbe062a1af8718ec3ebeb746f1d23f0c5dc4d"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b6fb63ae352e13748289f04f37868099e69dba4c2b3e271c46061e82c745634"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:887d9b0a65404929641a9fabb6452b07fe4572b269d901d622d8a34a4e9043b2"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a96dc1fa45bd8c407a0af03b2d5218392729e1822b0c32e62c5bf7eeb5fb3958"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a7e65eb5c003a303b94aa2c3852ef130230ec79e349632d030e9571b87c4698c"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:999779addc413181912e984b942fbcc951be1f5b3663cd80b2687758f434c583"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:19a0f89a7bb9d8048d9c4370c9c543c396e894c76be5525f5e1ad287f1750ddf"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1ac2f5fe02fa75f56e1ad473f1175e11f475606ec9bd0be2e78e4734ad575034"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:574faa3b79e8ebac7cb1d7930f51184ba1ccf69adfdec53a12f319a06030a68b"}, + {file = "propcache-0.2.1-cp310-cp310-win32.whl", hash = "sha256:03ff9d3f665769b2a85e6157ac8b439644f2d7fd17615a82fa55739bc97863f4"}, + {file = "propcache-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2d3af2e79991102678f53e0dbf4c35de99b6b8b58f29a27ca0325816364caaba"}, + {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ffc3cca89bb438fb9c95c13fc874012f7b9466b89328c3c8b1aa93cdcfadd16"}, + {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f174bbd484294ed9fdf09437f889f95807e5f229d5d93588d34e92106fbf6717"}, + {file = "propcache-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70693319e0b8fd35dd863e3e29513875eb15c51945bf32519ef52927ca883bc3"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b480c6a4e1138e1aa137c0079b9b6305ec6dcc1098a8ca5196283e8a49df95a9"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d27b84d5880f6d8aa9ae3edb253c59d9f6642ffbb2c889b78b60361eed449787"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:857112b22acd417c40fa4595db2fe28ab900c8c5fe4670c7989b1c0230955465"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf6c4150f8c0e32d241436526f3c3f9cbd34429492abddbada2ffcff506c51af"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d4cfda1d8ed687daa4bc0274fcfd5267873db9a5bc0418c2da19273040eeb7"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2f992c07c0fca81655066705beae35fc95a2fa7366467366db627d9f2ee097f"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4a571d97dbe66ef38e472703067021b1467025ec85707d57e78711c085984e54"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bb6178c241278d5fe853b3de743087be7f5f4c6f7d6d22a3b524d323eecec505"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ad1af54a62ffe39cf34db1aa6ed1a1873bd548f6401db39d8e7cd060b9211f82"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e7048abd75fe40712005bcfc06bb44b9dfcd8e101dda2ecf2f5aa46115ad07ca"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:160291c60081f23ee43d44b08a7e5fb76681221a8e10b3139618c5a9a291b84e"}, + {file = "propcache-0.2.1-cp311-cp311-win32.whl", hash = "sha256:819ce3b883b7576ca28da3861c7e1a88afd08cc8c96908e08a3f4dd64a228034"}, + {file = "propcache-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:edc9fc7051e3350643ad929df55c451899bb9ae6d24998a949d2e4c87fb596d3"}, + {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a"}, + {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0"}, + {file = "propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518"}, + {file = "propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246"}, + {file = "propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1"}, + {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc"}, + {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9"}, + {file = "propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30"}, + {file = "propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6"}, + {file = "propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1"}, + {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6a9a8c34fb7bb609419a211e59da8887eeca40d300b5ea8e56af98f6fbbb1541"}, + {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae1aa1cd222c6d205853b3013c69cd04515f9d6ab6de4b0603e2e1c33221303e"}, + {file = "propcache-0.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:accb6150ce61c9c4b7738d45550806aa2b71c7668c6942f17b0ac182b6142fd4"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eee736daafa7af6d0a2dc15cc75e05c64f37fc37bafef2e00d77c14171c2097"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7a31fc1e1bd362874863fdeed71aed92d348f5336fd84f2197ba40c59f061bd"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba4cfa1052819d16699e1d55d18c92b6e094d4517c41dd231a8b9f87b6fa681"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f089118d584e859c62b3da0892b88a83d611c2033ac410e929cb6754eec0ed16"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:781e65134efaf88feb447e8c97a51772aa75e48b794352f94cb7ea717dedda0d"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31f5af773530fd3c658b32b6bdc2d0838543de70eb9a2156c03e410f7b0d3aae"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:a7a078f5d37bee6690959c813977da5291b24286e7b962e62a94cec31aa5188b"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cea7daf9fc7ae6687cf1e2c049752f19f146fdc37c2cc376e7d0032cf4f25347"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:8b3489ff1ed1e8315674d0775dc7d2195fb13ca17b3808721b54dbe9fd020faf"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9403db39be1393618dd80c746cb22ccda168efce239c73af13c3763ef56ffc04"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5d97151bc92d2b2578ff7ce779cdb9174337390a535953cbb9452fb65164c587"}, + {file = "propcache-0.2.1-cp39-cp39-win32.whl", hash = "sha256:9caac6b54914bdf41bcc91e7eb9147d331d29235a7c967c150ef5df6464fd1bb"}, + {file = "propcache-0.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:92fc4500fcb33899b05ba73276dfb684a20d31caa567b7cb5252d48f896a91b1"}, + {file = "propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54"}, + {file = "propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64"}, +] [[package]] name = "protobuf" -version = "3.19.1" -description = "Protocol Buffers" -category = "main" +version = "5.29.3" +description = "" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" +files = [ + {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"}, + {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"}, + {file = "protobuf-5.29.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8434404bbf139aa9e1300dbf989667a83d42ddda9153d8ab76e0d5dcaca484e"}, + {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:daaf63f70f25e8689c072cfad4334ca0ac1d1e05a92fc15c54eb9cf23c3efd84"}, + {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:c027e08a08be10b67c06bf2370b99c811c466398c357e615ca88c91c07f0910f"}, + {file = "protobuf-5.29.3-cp38-cp38-win32.whl", hash = "sha256:84a57163a0ccef3f96e4b6a20516cedcf5bb3a95a657131c5c3ac62200d23252"}, + {file = "protobuf-5.29.3-cp38-cp38-win_amd64.whl", hash = "sha256:b89c115d877892a512f79a8114564fb435943b59067615894c3b13cd3e1fa107"}, + {file = "protobuf-5.29.3-cp39-cp39-win32.whl", hash = "sha256:0eb32bfa5219fc8d4111803e9a690658aa2e6366384fd0851064b963b6d1f2a7"}, + {file = "protobuf-5.29.3-cp39-cp39-win_amd64.whl", hash = "sha256:6ce8cc3389a20693bfde6c6562e03474c40851b44975c9b2bf6df7d8c4f864da"}, + {file = "protobuf-5.29.3-py3-none-any.whl", hash = "sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f"}, + {file = "protobuf-5.29.3.tar.gz", hash = "sha256:5da0f41edaf117bde316404bad1a486cb4ededf8e4a54891296f648e8e076620"}, +] [[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" +name = "pycodestyle" +version = "2.11.1" +description = "Python style guide checker" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.8" +files = [ + {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, + {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, +] [[package]] name = "pycryptodome" -version = "3.12.0" +version = "3.21.0" description = "Cryptographic library for Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "pyparsing" -version = "3.0.6" -description = "Python parsing module" -category = "dev" optional = false -python-versions = ">=3.6" - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pycryptodome-3.21.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:dad9bf36eda068e89059d1f07408e397856be9511d7113ea4b586642a429a4fd"}, + {file = "pycryptodome-3.21.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:a1752eca64c60852f38bb29e2c86fca30d7672c024128ef5d70cc15868fa10f4"}, + {file = "pycryptodome-3.21.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3ba4cc304eac4d4d458f508d4955a88ba25026890e8abff9b60404f76a62c55e"}, + {file = "pycryptodome-3.21.0-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cb087b8612c8a1a14cf37dd754685be9a8d9869bed2ffaaceb04850a8aeef7e"}, + {file = "pycryptodome-3.21.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:26412b21df30b2861424a6c6d5b1d8ca8107612a4cfa4d0183e71c5d200fb34a"}, + {file = "pycryptodome-3.21.0-cp27-cp27m-win32.whl", hash = "sha256:cc2269ab4bce40b027b49663d61d816903a4bd90ad88cb99ed561aadb3888dd3"}, + {file = "pycryptodome-3.21.0-cp27-cp27m-win_amd64.whl", hash = "sha256:0fa0a05a6a697ccbf2a12cec3d6d2650b50881899b845fac6e87416f8cb7e87d"}, + {file = "pycryptodome-3.21.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6cce52e196a5f1d6797ff7946cdff2038d3b5f0aba4a43cb6bf46b575fd1b5bb"}, + {file = "pycryptodome-3.21.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:a915597ffccabe902e7090e199a7bf7a381c5506a747d5e9d27ba55197a2c568"}, + {file = "pycryptodome-3.21.0-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4e74c522d630766b03a836c15bff77cb657c5fdf098abf8b1ada2aebc7d0819"}, + {file = "pycryptodome-3.21.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:a3804675283f4764a02db05f5191eb8fec2bb6ca34d466167fc78a5f05bbe6b3"}, + {file = "pycryptodome-3.21.0-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:2480ec2c72438430da9f601ebc12c518c093c13111a5c1644c82cdfc2e50b1e4"}, + {file = "pycryptodome-3.21.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:de18954104667f565e2fbb4783b56667f30fb49c4d79b346f52a29cb198d5b6b"}, + {file = "pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de4b7263a33947ff440412339cb72b28a5a4c769b5c1ca19e33dd6cd1dcec6e"}, + {file = "pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0714206d467fc911042d01ea3a1847c847bc10884cf674c82e12915cfe1649f8"}, + {file = "pycryptodome-3.21.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d85c1b613121ed3dbaa5a97369b3b757909531a959d229406a75b912dd51dd1"}, + {file = "pycryptodome-3.21.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:8898a66425a57bcf15e25fc19c12490b87bd939800f39a03ea2de2aea5e3611a"}, + {file = "pycryptodome-3.21.0-cp36-abi3-musllinux_1_2_i686.whl", hash = "sha256:932c905b71a56474bff8a9c014030bc3c882cee696b448af920399f730a650c2"}, + {file = "pycryptodome-3.21.0-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:18caa8cfbc676eaaf28613637a89980ad2fd96e00c564135bf90bc3f0b34dd93"}, + {file = "pycryptodome-3.21.0-cp36-abi3-win32.whl", hash = "sha256:280b67d20e33bb63171d55b1067f61fbd932e0b1ad976b3a184303a3dad22764"}, + {file = "pycryptodome-3.21.0-cp36-abi3-win_amd64.whl", hash = "sha256:b7aa25fc0baa5b1d95b7633af4f5f1838467f1815442b22487426f94e0d66c53"}, + {file = "pycryptodome-3.21.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:2cb635b67011bc147c257e61ce864879ffe6d03342dc74b6045059dfbdedafca"}, + {file = "pycryptodome-3.21.0-pp27-pypy_73-win32.whl", hash = "sha256:4c26a2f0dc15f81ea3afa3b0c87b87e501f235d332b7f27e2225ecb80c0b1cdd"}, + {file = "pycryptodome-3.21.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d5ebe0763c982f069d3877832254f64974139f4f9655058452603ff559c482e8"}, + {file = "pycryptodome-3.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ee86cbde706be13f2dec5a42b52b1c1d1cbb90c8e405c68d0755134735c8dc6"}, + {file = "pycryptodome-3.21.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fd54003ec3ce4e0f16c484a10bc5d8b9bd77fa662a12b85779a2d2d85d67ee0"}, + {file = "pycryptodome-3.21.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5dfafca172933506773482b0e18f0cd766fd3920bd03ec85a283df90d8a17bc6"}, + {file = "pycryptodome-3.21.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:590ef0898a4b0a15485b05210b4a1c9de8806d3ad3d47f74ab1dc07c67a6827f"}, + {file = "pycryptodome-3.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f35e442630bc4bc2e1878482d6f59ea22e280d7121d7adeaedba58c23ab6386b"}, + {file = "pycryptodome-3.21.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff99f952db3db2fbe98a0b355175f93ec334ba3d01bbde25ad3a5a33abc02b58"}, + {file = "pycryptodome-3.21.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8acd7d34af70ee63f9a849f957558e49a98f8f1634f86a59d2be62bb8e93f71c"}, + {file = "pycryptodome-3.21.0.tar.gz", hash = "sha256:f7787e0d469bdae763b876174cf2e6c0f7be79808af26b1da96f1a64bcf47297"}, +] [[package]] -name = "pyrsistent" -version = "0.18.0" -description = "Persistent/Functional/Immutable data structures" -category = "main" +name = "pyflakes" +version = "3.1.0" +description = "passive checker of Python programs" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +files = [ + {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"}, + {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, +] [[package]] name = "pytest" -version = "6.2.5" +version = "8.3.4" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +files = [ + {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, + {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, +] [package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} -attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<2.0" -py = ">=1.8.2" -toml = "*" +pluggy = ">=1.5,<2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pyunormalize" +version = "16.0.0" +description = "Unicode normalization forms (NFC, NFKC, NFD, NFKD). A library independent of the Python core Unicode database." +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyunormalize-16.0.0-py3-none-any.whl", hash = "sha256:c647d95e5d1e2ea9a2f448d1d95d8518348df24eab5c3fd32d2b5c3300a49152"}, + {file = "pyunormalize-16.0.0.tar.gz", hash = "sha256:2e1dfbb4a118154ae26f70710426a52a364b926c9191f764601f5a8cb12761f7"}, +] [[package]] name = "pywin32" -version = "302" +version = "308" description = "Python for Window Extensions" -category = "main" optional = false python-versions = "*" +files = [ + {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, + {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, + {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"}, + {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"}, + {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"}, + {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"}, + {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"}, + {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"}, + {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"}, + {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"}, + {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"}, + {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"}, + {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"}, + {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"}, + {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"}, + {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"}, + {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"}, + {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"}, +] + +[[package]] +name = "referencing" +version = "0.36.0" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "referencing-0.36.0-py3-none-any.whl", hash = "sha256:01fc2916bab821aa3284d645bbbb41ba39609e7ff47072416a39ec2fb04d10d9"}, + {file = "referencing-0.36.0.tar.gz", hash = "sha256:246db964bb6101905167895cd66499cfb2aabc5f83277d008c52afe918ef29ba"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" +typing-extensions = {version = "*", markers = "python_version < \"3.13\""} + +[[package]] +name = "regex" +version = "2024.11.6" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.8" +files = [ + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"}, + {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"}, + {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"}, + {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"}, + {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"}, + {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"}, + {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"}, + {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"}, + {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"}, + {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"}, + {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"}, + {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"}, + {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"}, + {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"}, +] [[package]] name = "requests" -version = "2.25.1" +version = "2.32.3" description = "Python HTTP for Humans." -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] [package.dependencies] certifi = ">=2017.4.17" -chardet = ">=3.0.2,<5" -idna = ">=2.5,<3" -urllib3 = ">=1.21.1,<1.27" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" [package.extras] -security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" [[package]] name = "rlp" -version = "2.0.1" -description = "A package for Recursive Length Prefix encoding and decoding" -category = "main" +version = "4.0.1" +description = "rlp: A package for Recursive Length Prefix encoding and decoding" optional = false -python-versions = "*" +python-versions = "<4,>=3.8" +files = [ + {file = "rlp-4.0.1-py3-none-any.whl", hash = "sha256:ff6846c3c27b97ee0492373aa074a7c3046aadd973320f4fffa7ac45564b0258"}, + {file = "rlp-4.0.1.tar.gz", hash = "sha256:bcefb11013dfadf8902642337923bd0c786dc8a27cb4c21da6e154e52869ecb1"}, +] [package.dependencies] -eth-utils = ">=1.0.2,<2" +eth-utils = ">=2" [package.extras] -dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "flake8 (==3.4.1)", "hypothesis (==5.19.0)", "ipython", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "pytest (==5.4.3)", "setuptools (>=36.2.0)", "sphinx-rtd-theme (>=0.1.9)", "tox (>=2.9.1,<3)", "twine", "wheel"] -doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)"] -lint = ["flake8 (==3.4.1)"] -rust-backend = ["rusty-rlp (>=0.1.15,<0.2)"] -test = ["hypothesis (==5.19.0)", "pytest (==5.4.3)", "tox (>=2.9.1,<3)"] +dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "hypothesis (==5.19.0)", "ipython", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +rust-backend = ["rusty-rlp (>=0.2.1)"] +test = ["hypothesis (==5.19.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] -name = "rx" -version = "1.6.1" -description = "Reactive Extensions (Rx) for Python" -category = "main" +name = "rpds-py" +version = "0.22.3" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"}, + {file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf"}, + {file = "rpds_py-0.22.3-cp310-cp310-win32.whl", hash = "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652"}, + {file = "rpds_py-0.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8"}, + {file = "rpds_py-0.22.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f"}, + {file = "rpds_py-0.22.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a"}, + {file = "rpds_py-0.22.3-cp311-cp311-win32.whl", hash = "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64"}, + {file = "rpds_py-0.22.3-cp311-cp311-win_amd64.whl", hash = "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c"}, + {file = "rpds_py-0.22.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e"}, + {file = "rpds_py-0.22.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7"}, + {file = "rpds_py-0.22.3-cp312-cp312-win32.whl", hash = "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627"}, + {file = "rpds_py-0.22.3-cp312-cp312-win_amd64.whl", hash = "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4"}, + {file = "rpds_py-0.22.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84"}, + {file = "rpds_py-0.22.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f"}, + {file = "rpds_py-0.22.3-cp313-cp313-win32.whl", hash = "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de"}, + {file = "rpds_py-0.22.3-cp313-cp313-win_amd64.whl", hash = "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9"}, + {file = "rpds_py-0.22.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333"}, + {file = "rpds_py-0.22.3-cp313-cp313t-win32.whl", hash = "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730"}, + {file = "rpds_py-0.22.3-cp313-cp313t-win_amd64.whl", hash = "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf"}, + {file = "rpds_py-0.22.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea"}, + {file = "rpds_py-0.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520"}, + {file = "rpds_py-0.22.3-cp39-cp39-win32.whl", hash = "sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9"}, + {file = "rpds_py-0.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6"}, + {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"}, +] + +[[package]] +name = "schema" +version = "0.7.7" +description = "Simple data validation library" optional = false python-versions = "*" +files = [ + {file = "schema-0.7.7-py2.py3-none-any.whl", hash = "sha256:5d976a5b50f36e74e2157b47097b60002bd4d42e65425fcc9c9befadb4255dde"}, + {file = "schema-0.7.7.tar.gz", hash = "sha256:7da553abd2958a19dc2547c388cde53398b39196175a9be59ea1caf5ab0a1807"}, +] + +[[package]] +name = "setuptools" +version = "68.2.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, + {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] + +[package.extras] +widechars = ["wcwidth"] [[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" +name = "tbump" +version = "6.11.0" +description = "Bump software releases" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.7,<4.0" +files = [ + {file = "tbump-6.11.0-py3-none-any.whl", hash = "sha256:6b181fe6f3ae84ce0b9af8cc2009a8bca41ded34e73f623a7413b9684f1b4526"}, + {file = "tbump-6.11.0.tar.gz", hash = "sha256:385e710eedf0a8a6ff959cf1e9f3cfd17c873617132fc0ec5f629af0c355c870"}, +] + +[package.dependencies] +cli-ui = ">=0.10.3" +docopt = ">=0.6.2,<0.7.0" +schema = ">=0.7.1,<0.8.0" +tomlkit = ">=0.11,<0.12" [[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" +name = "tomli" +version = "2.2.1" +description = "A lil' TOML parser" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.8" +files = [ + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, +] + +[[package]] +name = "tomlkit" +version = "0.11.8" +description = "Style preserving TOML library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.11.8-py3-none-any.whl", hash = "sha256:8c726c4c202bdb148667835f68d68780b9a003a9ec34167b6c673b38eff2a171"}, + {file = "tomlkit-0.11.8.tar.gz", hash = "sha256:9330fc7faa1db67b541b28e62018c17d20be733177d290a13b24c62d1614e0c3"}, +] [[package]] name = "toolz" -version = "0.11.2" +version = "1.0.0" description = "List processing tools and functional utilities" -category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" +files = [ + {file = "toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236"}, + {file = "toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02"}, +] [[package]] name = "typing-extensions" -version = "3.10.0.2" -description = "Backported and Experimental Type Hints for Python 3.5+" -category = "main" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = false -python-versions = "*" +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "unidecode" +version = "1.3.8" +description = "ASCII transliterations of Unicode text" +optional = false +python-versions = ">=3.5" +files = [ + {file = "Unidecode-1.3.8-py3-none-any.whl", hash = "sha256:d130a61ce6696f8148a3bd8fe779c99adeb4b870584eeb9526584e9aa091fd39"}, + {file = "Unidecode-1.3.8.tar.gz", hash = "sha256:cfdb349d46ed3873ece4586b96aa75258726e2fa8ec21d6f00a591d98806c2f4"}, +] [[package]] name = "urllib3" -version = "1.26.7" +version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +python-versions = ">=3.9" +files = [ + {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, + {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, +] [package.extras] -brotli = ["brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] -name = "varint" -version = "1.0.2" -description = "Simple python varint implementation" -category = "main" +name = "web3" +version = "6.20.3" +description = "web3.py" optional = false -python-versions = "*" +python-versions = ">=3.7.2" +files = [ + {file = "web3-6.20.3-py3-none-any.whl", hash = "sha256:529fbb33f2476ce8185f7a2ed7e2e07c4c28621b0e89b845fbfdcaea9571286d"}, + {file = "web3-6.20.3.tar.gz", hash = "sha256:c69dbf1a61ace172741d06990e60afc7f55f303eac087e7235f382df3047d017"}, +] -[[package]] -name = "web3" -version = "5.19.0" -description = "Web3.py" -category = "main" -optional = false -python-versions = ">=3.6,<4" - -[package.dependencies] -eth-abi = ">=2.0.0b6,<3.0.0" -eth-account = ">=0.5.3,<0.6.0" -eth-hash = {version = ">=0.2.0,<1.0.0", extras = ["pycryptodome"]} -eth-typing = ">=2.0.0,<3.0.0" -eth-utils = ">=1.9.5,<2.0.0" -hexbytes = ">=0.1.0,<1.0.0" -ipfshttpclient = "0.7.0a1" -jsonschema = ">=3.2.0,<4.0.0" -lru-dict = ">=1.1.6,<2.0.0" -protobuf = ">=3.10.0,<4" +[package.dependencies] +aiohttp = ">=3.7.4.post0" +ckzg = "<2" +eth-abi = ">=4.0.0" +eth-account = ">=0.8.0,<0.13" +eth-hash = {version = ">=0.5.1", extras = ["pycryptodome"]} +eth-typing = ">=3.0.0,<4.2.0 || >4.2.0,<5.0.0" +eth-utils = ">=2.1.0,<5" +hexbytes = ">=0.1.0,<0.4.0" +jsonschema = ">=4.0.0" +lru-dict = ">=1.1.6,<1.3.0" +protobuf = ">=4.21.6" +pyunormalize = ">=15.0.0" pywin32 = {version = ">=223", markers = "platform_system == \"Windows\""} -requests = ">=2.16.0,<3.0.0" -typing-extensions = {version = ">=3.7.4.1,<4", markers = "python_version < \"3.8\""} -websockets = ">=8.1.0,<9.0.0" +requests = ">=2.16.0" +typing-extensions = ">=4.0.1" +websockets = ">=10.0.0" [package.extras] -dev = ["eth-tester[py-evm] (==v0.5.0-beta.4)", "py-geth (>=3.0.0,<4)", "flake8 (==3.8.3)", "isort (>=4.2.15,<4.3.5)", "mypy (==0.730)", "mock", "sphinx-better-theme (>=0.1.4)", "click (>=5.1)", "configparser (==3.5.0)", "contextlib2 (>=0.5.4)", "py-geth (>=2.4.0,<3)", "py-solc (>=0.4.0)", "pytest (>=4.4.0,<5.0.0)", "sphinx (>=2.4.4,<3)", "sphinx-rtd-theme (>=0.1.9)", "toposort (>=1.4)", "towncrier (>=19.2.0,<20)", "urllib3", "web3 (>=2.1.0)", "wheel", "bumpversion", "flaky (>=3.3.0)", "hypothesis (>=3.31.2,<6)", "pytest-asyncio (>=0.10.0,<0.11)", "pytest-mock (>=1.10,<2)", "pytest-pythonpath (>=0.3)", "pytest-watch (>=4.2,<5)", "pytest-xdist (>=1.29,<2)", "setuptools (>=38.6.0)", "tox (>=1.8.0)", "tqdm (>4.32,<5)", "twine (>=1.13,<2)", "when-changed (>=0.3.0,<0.4)"] -docs = ["mock", "sphinx-better-theme (>=0.1.4)", "click (>=5.1)", "configparser (==3.5.0)", "contextlib2 (>=0.5.4)", "py-geth (>=2.4.0,<3)", "py-solc (>=0.4.0)", "pytest (>=4.4.0,<5.0.0)", "sphinx (>=2.4.4,<3)", "sphinx-rtd-theme (>=0.1.9)", "toposort (>=1.4)", "towncrier (>=19.2.0,<20)", "urllib3", "web3 (>=2.1.0)", "wheel"] -linter = ["flake8 (==3.8.3)", "isort (>=4.2.15,<4.3.5)", "mypy (==0.730)"] -tester = ["eth-tester[py-evm] (==v0.5.0-beta.4)", "py-geth (>=3.0.0,<4)"] +dev = ["build (>=0.9.0)", "bumpversion", "eth-tester[py-evm] (>=0.11.0b1,<0.12.0b1)", "eth-tester[py-evm] (>=0.9.0b1,<0.10.0b1)", "flaky (>=3.7.0)", "hypothesis (>=3.31.2)", "importlib-metadata (<5.0)", "ipfshttpclient (==0.8.0a2)", "pre-commit (>=2.21.0)", "py-geth (>=3.14.0,<4)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.21.2,<0.23)", "pytest-mock (>=1.10)", "pytest-watch (>=4.2)", "pytest-xdist (>=1.29)", "setuptools (>=38.6.0)", "sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=3.18.0)", "tqdm (>4.32)", "twine (>=1.13)", "when-changed (>=0.3.0)"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +ipfs = ["ipfshttpclient (==0.8.0a2)"] +tester = ["eth-tester[py-evm] (>=0.11.0b1,<0.12.0b1)", "eth-tester[py-evm] (>=0.9.0b1,<0.10.0b1)", "py-geth (>=3.14.0,<4)"] [[package]] name = "websockets" -version = "8.1" +version = "14.1" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -category = "main" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.9" +files = [ + {file = "websockets-14.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a0adf84bc2e7c86e8a202537b4fd50e6f7f0e4a6b6bf64d7ccb96c4cd3330b29"}, + {file = "websockets-14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90b5d9dfbb6d07a84ed3e696012610b6da074d97453bd01e0e30744b472c8179"}, + {file = "websockets-14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2177ee3901075167f01c5e335a6685e71b162a54a89a56001f1c3e9e3d2ad250"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f14a96a0034a27f9d47fd9788913924c89612225878f8078bb9d55f859272b0"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f874ba705deea77bcf64a9da42c1f5fc2466d8f14daf410bc7d4ceae0a9fcb0"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9607b9a442392e690a57909c362811184ea429585a71061cd5d3c2b98065c199"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bea45f19b7ca000380fbd4e02552be86343080120d074b87f25593ce1700ad58"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:219c8187b3ceeadbf2afcf0f25a4918d02da7b944d703b97d12fb01510869078"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ad2ab2547761d79926effe63de21479dfaf29834c50f98c4bf5b5480b5838434"}, + {file = "websockets-14.1-cp310-cp310-win32.whl", hash = "sha256:1288369a6a84e81b90da5dbed48610cd7e5d60af62df9851ed1d1d23a9069f10"}, + {file = "websockets-14.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0744623852f1497d825a49a99bfbec9bea4f3f946df6eb9d8a2f0c37a2fec2e"}, + {file = "websockets-14.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:449d77d636f8d9c17952628cc7e3b8faf6e92a17ec581ec0c0256300717e1512"}, + {file = "websockets-14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a35f704be14768cea9790d921c2c1cc4fc52700410b1c10948511039be824aac"}, + {file = "websockets-14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b1f3628a0510bd58968c0f60447e7a692933589b791a6b572fcef374053ca280"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c3deac3748ec73ef24fc7be0b68220d14d47d6647d2f85b2771cb35ea847aa1"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7048eb4415d46368ef29d32133134c513f507fff7d953c18c91104738a68c3b3"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cf0ad281c979306a6a34242b371e90e891bce504509fb6bb5246bbbf31e7b6"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cc1fc87428c1d18b643479caa7b15db7d544652e5bf610513d4a3478dbe823d0"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f95ba34d71e2fa0c5d225bde3b3bdb152e957150100e75c86bc7f3964c450d89"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9481a6de29105d73cf4515f2bef8eb71e17ac184c19d0b9918a3701c6c9c4f23"}, + {file = "websockets-14.1-cp311-cp311-win32.whl", hash = "sha256:368a05465f49c5949e27afd6fbe0a77ce53082185bbb2ac096a3a8afaf4de52e"}, + {file = "websockets-14.1-cp311-cp311-win_amd64.whl", hash = "sha256:6d24fc337fc055c9e83414c94e1ee0dee902a486d19d2a7f0929e49d7d604b09"}, + {file = "websockets-14.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed907449fe5e021933e46a3e65d651f641975a768d0649fee59f10c2985529ed"}, + {file = "websockets-14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:87e31011b5c14a33b29f17eb48932e63e1dcd3fa31d72209848652310d3d1f0d"}, + {file = "websockets-14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bc6ccf7d54c02ae47a48ddf9414c54d48af9c01076a2e1023e3b486b6e72c707"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9777564c0a72a1d457f0848977a1cbe15cfa75fa2f67ce267441e465717dcf1a"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a655bde548ca98f55b43711b0ceefd2a88a71af6350b0c168aa77562104f3f45"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfff83ca578cada2d19e665e9c8368e1598d4e787422a460ec70e531dbdd58"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6a6c9bcf7cdc0fd41cc7b7944447982e8acfd9f0d560ea6d6845428ed0562058"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4b6caec8576e760f2c7dd878ba817653144d5f369200b6ddf9771d64385b84d4"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eb6d38971c800ff02e4a6afd791bbe3b923a9a57ca9aeab7314c21c84bf9ff05"}, + {file = "websockets-14.1-cp312-cp312-win32.whl", hash = "sha256:1d045cbe1358d76b24d5e20e7b1878efe578d9897a25c24e6006eef788c0fdf0"}, + {file = "websockets-14.1-cp312-cp312-win_amd64.whl", hash = "sha256:90f4c7a069c733d95c308380aae314f2cb45bd8a904fb03eb36d1a4983a4993f"}, + {file = "websockets-14.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3630b670d5057cd9e08b9c4dab6493670e8e762a24c2c94ef312783870736ab9"}, + {file = "websockets-14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36ebd71db3b89e1f7b1a5deaa341a654852c3518ea7a8ddfdf69cc66acc2db1b"}, + {file = "websockets-14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5b918d288958dc3fa1c5a0b9aa3256cb2b2b84c54407f4813c45d52267600cd3"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00fe5da3f037041da1ee0cf8e308374e236883f9842c7c465aa65098b1c9af59"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8149a0f5a72ca36720981418eeffeb5c2729ea55fa179091c81a0910a114a5d2"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77569d19a13015e840b81550922056acabc25e3f52782625bc6843cfa034e1da"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cf5201a04550136ef870aa60ad3d29d2a59e452a7f96b94193bee6d73b8ad9a9"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:88cf9163ef674b5be5736a584c999e98daf3aabac6e536e43286eb74c126b9c7"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:836bef7ae338a072e9d1863502026f01b14027250a4545672673057997d5c05a"}, + {file = "websockets-14.1-cp313-cp313-win32.whl", hash = "sha256:0d4290d559d68288da9f444089fd82490c8d2744309113fc26e2da6e48b65da6"}, + {file = "websockets-14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8621a07991add373c3c5c2cf89e1d277e49dc82ed72c75e3afc74bd0acc446f0"}, + {file = "websockets-14.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01bb2d4f0a6d04538d3c5dfd27c0643269656c28045a53439cbf1c004f90897a"}, + {file = "websockets-14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:414ffe86f4d6f434a8c3b7913655a1a5383b617f9bf38720e7c0799fac3ab1c6"}, + {file = "websockets-14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fda642151d5affdee8a430bd85496f2e2517be3a2b9d2484d633d5712b15c56"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd7c11968bc3860d5c78577f0dbc535257ccec41750675d58d8dc66aa47fe52c"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a032855dc7db987dff813583d04f4950d14326665d7e714d584560b140ae6b8b"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7e7ea2f782408c32d86b87a0d2c1fd8871b0399dd762364c731d86c86069a78"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:39450e6215f7d9f6f7bc2a6da21d79374729f5d052333da4d5825af8a97e6735"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ceada5be22fa5a5a4cdeec74e761c2ee7db287208f54c718f2df4b7e200b8d4a"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3fc753451d471cff90b8f467a1fc0ae64031cf2d81b7b34e1811b7e2691bc4bc"}, + {file = "websockets-14.1-cp39-cp39-win32.whl", hash = "sha256:14839f54786987ccd9d03ed7f334baec0f02272e7ec4f6e9d427ff584aeea8b4"}, + {file = "websockets-14.1-cp39-cp39-win_amd64.whl", hash = "sha256:d9fd19ecc3a4d5ae82ddbfb30962cf6d874ff943e56e0c81f5169be2fda62979"}, + {file = "websockets-14.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5dc25a9dbd1a7f61eca4b7cb04e74ae4b963d658f9e4f9aad9cd00b688692c8"}, + {file = "websockets-14.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:04a97aca96ca2acedf0d1f332c861c5a4486fdcba7bcef35873820f940c4231e"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df174ece723b228d3e8734a6f2a6febbd413ddec39b3dc592f5a4aa0aff28098"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:034feb9f4286476f273b9a245fb15f02c34d9586a5bc936aff108c3ba1b21beb"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c308dabd2b380807ab64b62985eaccf923a78ebc572bd485375b9ca2b7dc7"}, + {file = "websockets-14.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5a42d3ecbb2db5080fc578314439b1d79eef71d323dc661aa616fb492436af5d"}, + {file = "websockets-14.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ddaa4a390af911da6f680be8be4ff5aaf31c4c834c1a9147bc21cbcbca2d4370"}, + {file = "websockets-14.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a4c805c6034206143fbabd2d259ec5e757f8b29d0a2f0bf3d2fe5d1f60147a4a"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:205f672a6c2c671a86d33f6d47c9b35781a998728d2c7c2a3e1cf3333fcb62b7"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef440054124728cc49b01c33469de06755e5a7a4e83ef61934ad95fc327fbb0"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7591d6f440af7f73c4bd9404f3772bfee064e639d2b6cc8c94076e71b2471c1"}, + {file = "websockets-14.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:25225cc79cfebc95ba1d24cd3ab86aaa35bcd315d12fa4358939bd55e9bd74a5"}, + {file = "websockets-14.1-py3-none-any.whl", hash = "sha256:4d4fc827a20abe6d544a119896f6b78ee13fe81cbfef416f3f2ddf09a03f0e2e"}, + {file = "websockets-14.1.tar.gz", hash = "sha256:398b10c77d471c0aab20a845e7a60076b6390bfdaac7a6d2edb0d2c59d75e8d8"}, +] [[package]] -name = "zipp" -version = "3.6.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" +name = "yarl" +version = "1.18.3" +description = "Yet another URL library" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" +files = [ + {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"}, + {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"}, + {file = "yarl-1.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc"}, + {file = "yarl-1.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b"}, + {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690"}, + {file = "yarl-1.18.3-cp310-cp310-win32.whl", hash = "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6"}, + {file = "yarl-1.18.3-cp310-cp310-win_amd64.whl", hash = "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8"}, + {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069"}, + {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193"}, + {file = "yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae"}, + {file = "yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e"}, + {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a"}, + {file = "yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1"}, + {file = "yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5"}, + {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50"}, + {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576"}, + {file = "yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba"}, + {file = "yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393"}, + {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285"}, + {file = "yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2"}, + {file = "yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477"}, + {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb"}, + {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa"}, + {file = "yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58"}, + {file = "yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10"}, + {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8"}, + {file = "yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d"}, + {file = "yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c"}, + {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61e5e68cb65ac8f547f6b5ef933f510134a6bf31bb178be428994b0cb46c2a04"}, + {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe57328fbc1bfd0bd0514470ac692630f3901c0ee39052ae47acd1d90a436719"}, + {file = "yarl-1.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a440a2a624683108a1b454705ecd7afc1c3438a08e890a1513d468671d90a04e"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c7907c8548bcd6ab860e5f513e727c53b4a714f459b084f6580b49fa1b9cee"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4f6450109834af88cb4cc5ecddfc5380ebb9c228695afc11915a0bf82116789"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9ca04806f3be0ac6d558fffc2fdf8fcef767e0489d2684a21912cc4ed0cd1b8"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77a6e85b90a7641d2e07184df5557132a337f136250caafc9ccaa4a2a998ca2c"}, + {file = "yarl-1.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6333c5a377c8e2f5fae35e7b8f145c617b02c939d04110c76f29ee3676b5f9a5"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b3c92fa08759dbf12b3a59579a4096ba9af8dd344d9a813fc7f5070d86bbab1"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4ac515b860c36becb81bb84b667466885096b5fc85596948548b667da3bf9f24"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:045b8482ce9483ada4f3f23b3774f4e1bf4f23a2d5c912ed5170f68efb053318"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a4bb030cf46a434ec0225bddbebd4b89e6471814ca851abb8696170adb163985"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:54d6921f07555713b9300bee9c50fb46e57e2e639027089b1d795ecd9f7fa910"}, + {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1d407181cfa6e70077df3377938c08012d18893f9f20e92f7d2f314a437c30b1"}, + {file = "yarl-1.18.3-cp39-cp39-win32.whl", hash = "sha256:ac36703a585e0929b032fbaab0707b75dc12703766d0b53486eabd5139ebadd5"}, + {file = "yarl-1.18.3-cp39-cp39-win_amd64.whl", hash = "sha256:ba87babd629f8af77f557b61e49e7c7cac36f22f871156b91e10a6e9d4f829e9"}, + {file = "yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b"}, + {file = "yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1"}, +] -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" +propcache = ">=0.2.0" [metadata] -lock-version = "1.1" -python-versions = ">=3.7.2, <4.0" -content-hash = "b3da6e91385997ef75f59da8e3b9a76139cbb473bacf9ea6f308bad78e103585" - -[metadata.files] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] -attrs = [ - {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, - {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, -] -base58 = [ - {file = "base58-2.1.1-py3-none-any.whl", hash = "sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2"}, - {file = "base58-2.1.1.tar.gz", hash = "sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c"}, -] -bitarray = [ - {file = "bitarray-1.2.2.tar.gz", hash = "sha256:27a69ffcee3b868abab3ce8b17c69e02b63e722d4d64ffd91d659f81e9984954"}, -] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -chardet = [ - {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, - {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, -] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -cython = [ - {file = "Cython-0.29.24-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:6a2cf2ccccc25413864928dfd730c29db6f63eaf98206c1e600003a445ca7f58"}, - {file = "Cython-0.29.24-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b28f92e617f540d3f21f8fd479a9c6491be920ffff672a4c61b7fc4d7f749f39"}, - {file = "Cython-0.29.24-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:37bcfa5df2a3009f49624695d917c3804fccbdfcdc5eda6378754a879711a4d5"}, - {file = "Cython-0.29.24-cp27-cp27m-win32.whl", hash = "sha256:9164aeef1af6f837e4fc20402a31d256188ba4d535e262c6cb78caf57ad744f8"}, - {file = "Cython-0.29.24-cp27-cp27m-win_amd64.whl", hash = "sha256:73ac33a4379056a02031baa4def255717fadb9181b5ac2b244792d53eae1c925"}, - {file = "Cython-0.29.24-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:09ac3087ac7a3d489ebcb3fb8402e00c13d1a3a1c6bc73fd3b0d756a3e341e79"}, - {file = "Cython-0.29.24-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:774cb8fd931ee1ba52c472bc1c19077cd6895c1b24014ae07bb27df59aed5ebe"}, - {file = "Cython-0.29.24-cp34-cp34m-win32.whl", hash = "sha256:5dd56d0be50073f0e54825a8bc3393852de0eed126339ecbca0ae149dba55cfc"}, - {file = "Cython-0.29.24-cp34-cp34m-win_amd64.whl", hash = "sha256:88dc3c250dec280b0489a83950b15809762e27232f4799b1b8d0bad503f5ab84"}, - {file = "Cython-0.29.24-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:5fa12ebafc2f688ea6d26ab6d1d2e634a9872509ba7135b902bb0d8b368fb04b"}, - {file = "Cython-0.29.24-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:60c958bcab0ff315b4036a949bed1c65334e1f6a69e17e9966d742febb59043a"}, - {file = "Cython-0.29.24-cp35-cp35m-win32.whl", hash = "sha256:166f9f29cd0058ce1a14a7b3a2458b849ed34b1ec5fd4108af3fdd2c24afcbb0"}, - {file = "Cython-0.29.24-cp35-cp35m-win_amd64.whl", hash = "sha256:76cbca0188d278e93d12ebdaf5990678e6e436485fdfad49dbe9b07717d41a3c"}, - {file = "Cython-0.29.24-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f2e9381497b12e8f622af620bde0d1d094035d79b899abb2ddd3a7891f535083"}, - {file = "Cython-0.29.24-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:d8d1a087f35e39384303f5e6b75d465d6f29d746d7138eae9d3b6e8e6f769eae"}, - {file = "Cython-0.29.24-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:112efa54a58293a4fb0acf0dd8e5b3736e95b595eee24dd88615648e445abe41"}, - {file = "Cython-0.29.24-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cf4452f0e4d50e11701bca38f3857fe6fa16593e7fd6a4d5f7be66f611b7da2"}, - {file = "Cython-0.29.24-cp36-cp36m-win32.whl", hash = "sha256:854fe2193d3ad4c8b61932ff54d6dbe10c5fa8749eb8958d72cc0ab28243f833"}, - {file = "Cython-0.29.24-cp36-cp36m-win_amd64.whl", hash = "sha256:84826ec1c11cda56261a252ddecac0c7d6b02e47e81b94f40b27b4c23c29c17c"}, - {file = "Cython-0.29.24-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6ade74eece909fd3a437d9a5084829180751d7ade118e281e9824dd75eafaff2"}, - {file = "Cython-0.29.24-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0a142c6b862e6ed6b02209d543062c038c110585b5e32d1ad7c9717af4f07e41"}, - {file = "Cython-0.29.24-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:10cb3def9774fa99e4583617a5616874aed3255dc241fd1f4a3c2978c78e1c53"}, - {file = "Cython-0.29.24-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f41ef7edd76dd23315925e003f0c58c8585f3ab24be6885c4b3f60e77c82746"}, - {file = "Cython-0.29.24-cp37-cp37m-win32.whl", hash = "sha256:821c2d416ad7d006b069657ee1034c0e0cb45bdbe9ab6ab631e8c495dfcfa4ac"}, - {file = "Cython-0.29.24-cp37-cp37m-win_amd64.whl", hash = "sha256:2d9e61ed1056a3b6a4b9156b62297ad18b357a7948e57a2f49b061217696567e"}, - {file = "Cython-0.29.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:55b0ee28c2c8118bfb3ad9b25cf7a6cbd724e442ea96956e32ccd908d5e3e043"}, - {file = "Cython-0.29.24-cp38-cp38-manylinux1_i686.whl", hash = "sha256:eb2843f8cc01c645725e6fc690a84e99cdb266ce8ebe427cf3a680ff09f876aa"}, - {file = "Cython-0.29.24-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:661dbdea519d9cfb288867252b75fef73ffa8e8bb674cec27acf70646afb369b"}, - {file = "Cython-0.29.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc05de569f811be1fcfde6756c9048ae518f0c4b6d9f8f024752c5365d934cac"}, - {file = "Cython-0.29.24-cp38-cp38-win32.whl", hash = "sha256:a102cfa795c6b3b81a29bdb9dbec545367cd7f353c03e6f30a056fdfefd92854"}, - {file = "Cython-0.29.24-cp38-cp38-win_amd64.whl", hash = "sha256:416046a98255eff97ec02077d20ebeaae52682dfca1c35aadf31260442b92514"}, - {file = "Cython-0.29.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ad43e684ade673565f6f9d6638015112f6c7f11aa2a632167b79014f613f0f5f"}, - {file = "Cython-0.29.24-cp39-cp39-manylinux1_i686.whl", hash = "sha256:afb521523cb46ddaa8d269b421f88ea2731fee05e65b952b96d4db760f5a2a1c"}, - {file = "Cython-0.29.24-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:0d414458cb22f8a90d64260da6dace5d5fcebde43f31be52ca51f818c46db8cb"}, - {file = "Cython-0.29.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cb87777e82d1996aef6c146560a19270684271c9c669ba62ac6803b3cd2ff82"}, - {file = "Cython-0.29.24-cp39-cp39-win32.whl", hash = "sha256:91339ee4b465924a3ea4b2a9cec7f7227bc4cadf673ce859d24c2b9ef60b1214"}, - {file = "Cython-0.29.24-cp39-cp39-win_amd64.whl", hash = "sha256:5fb977945a2111f6b64501fdf7ed0ec162cc502b84457fd648d6a558ea8de0d6"}, - {file = "Cython-0.29.24-py2.py3-none-any.whl", hash = "sha256:f96411f0120b5cae483923aaacd2872af8709be4b46522daedc32f051d778385"}, - {file = "Cython-0.29.24.tar.gz", hash = "sha256:cdf04d07c3600860e8c2ebaad4e8f52ac3feb212453c1764a49ac08c827e8443"}, -] -cytoolz = [ - {file = "cytoolz-0.11.2.tar.gz", hash = "sha256:ea23663153806edddce7e4153d1d407d62357c05120a4e8485bddf1bd5ab22b4"}, -] -eth-abi = [ - {file = "eth_abi-2.1.1-py3-none-any.whl", hash = "sha256:78df5d2758247a8f0766a7cfcea4575bcfe568c34a33e6d05a72c328a9040444"}, - {file = "eth_abi-2.1.1.tar.gz", hash = "sha256:4bb1d87bb6605823379b07f6c02c8af45df01a27cc85bd6abb7cf1446ce7d188"}, -] -eth-account = [ - {file = "eth-account-0.5.6.tar.gz", hash = "sha256:baef80956e88af5643f8602e72aab6bcd91d8a9f71dd03c7a7f1145f5e6fd694"}, - {file = "eth_account-0.5.6-py3-none-any.whl", hash = "sha256:d324daf5a40bd5bdaf5ddaebfec71e7440b21f9ae4989921ce1253d63f8fe436"}, -] -eth-hash = [ - {file = "eth-hash-0.3.2.tar.gz", hash = "sha256:3f40cecd5ead88184aa9550afc19d057f103728108c5102f592f8415949b5a76"}, - {file = "eth_hash-0.3.2-py3-none-any.whl", hash = "sha256:de7385148a8e0237ba1240cddbc06d53f56731140f8593bdb8429306f6b42271"}, -] -eth-keyfile = [ - {file = "eth-keyfile-0.5.1.tar.gz", hash = "sha256:939540efb503380bc30d926833e6a12b22c6750de80feef3720d79e5a79de47d"}, - {file = "eth_keyfile-0.5.1-py3-none-any.whl", hash = "sha256:70d734af17efdf929a90bb95375f43522be4ed80c3b9e0a8bca575fb11cd1159"}, -] -eth-keys = [ - {file = "eth-keys-0.3.3.tar.gz", hash = "sha256:a9a1e83e443bd369265b1a1b66dc30f6841bdbb3577ecd042e037b7b405b6cb0"}, - {file = "eth_keys-0.3.3-py3-none-any.whl", hash = "sha256:412dd5c9732b8e92af40c9c77597f4661c57eba3897aaa55e527af56a8c5ab47"}, -] -eth-rlp = [ - {file = "eth-rlp-0.2.1.tar.gz", hash = "sha256:f016f980b0ed42ee7650ba6e4e4d3c4e9aa06d8b9c6825a36d3afe5aa0187a8b"}, - {file = "eth_rlp-0.2.1-py3-none-any.whl", hash = "sha256:cc389ef8d7b6f76a98f90bcdbff1b8684b3a78f53d47e871191b50d4d6aee5a1"}, -] -eth-typing = [ - {file = "eth-typing-2.2.2.tar.gz", hash = "sha256:97ba0f83da7cf1d3668f6ed54983f21168076c552762bf5e06d4a20921877f3f"}, - {file = "eth_typing-2.2.2-py3-none-any.whl", hash = "sha256:1140c7592321dbf10d6663c46f7e43eb0e6410b011b03f14b3df3eb1f76aa9bb"}, -] -eth-utils = [ - {file = "eth-utils-1.10.0.tar.gz", hash = "sha256:bf82762a46978714190b0370265a7148c954d3f0adaa31c6f085ea375e4c61af"}, - {file = "eth_utils-1.10.0-py3-none-any.whl", hash = "sha256:74240a8c6f652d085ed3c85f5f1654203d2f10ff9062f83b3bad0a12ff321c7a"}, -] -gql = [ - {file = "gql-2.0.0-py2.py3-none-any.whl", hash = "sha256:35032ddd4bfe6b8f3169f806b022168932385d751eacc5c5f7122e0b3f4d6b88"}, - {file = "gql-2.0.0.tar.gz", hash = "sha256:fe8d3a08047f77362ddfcfddba7cae377da2dd66f5e61c59820419c9283d4fb5"}, -] -graphql-core = [ - {file = "graphql-core-2.3.2.tar.gz", hash = "sha256:aac46a9ac524c9855910c14c48fc5d60474def7f99fd10245e76608eba7af746"}, - {file = "graphql_core-2.3.2-py2.py3-none-any.whl", hash = "sha256:44c9bac4514e5e30c5a595fac8e3c76c1975cae14db215e8174c7fe995825bad"}, -] -hexbytes = [ - {file = "hexbytes-0.2.2-py3-none-any.whl", hash = "sha256:ef53c37ea9f316fff86fcb1df057b4c6ba454da348083e972031bbf7bc9c3acc"}, - {file = "hexbytes-0.2.2.tar.gz", hash = "sha256:a5881304d186e87578fb263a85317c808cf130e1d4b3d37d30142ab0f7898d03"}, -] -idna = [ - {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, - {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.8.2-py3-none-any.whl", hash = "sha256:53ccfd5c134223e497627b9815d5030edf77d2ed573922f7a0b8f8bb81a1c100"}, - {file = "importlib_metadata-4.8.2.tar.gz", hash = "sha256:75bdec14c397f528724c1bfd9709d660b33a4d2e77387a3358f20b848bb5e5fb"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -ipfshttpclient = [ - {file = "ipfshttpclient-0.7.0a1-py3-none-any.whl", hash = "sha256:a45fb0ef087d71647c77b02e0cb3a033045377f134971dfcdc1c6f21cd8ad87c"}, - {file = "ipfshttpclient-0.7.0a1.tar.gz", hash = "sha256:ada7d7c40879ebf8a736c1ff7c690ddb574a120c2226dc982d44156408de426a"}, -] -jsonschema = [ - {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, - {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, -] -jstyleson = [ - {file = "jstyleson-0.0.2.tar.gz", hash = "sha256:680003f3b15a2959e4e6a351f3b858e3c07dd3e073a0d54954e34d8ea5e1308e"}, -] -lru-dict = [ - {file = "lru-dict-1.1.7.tar.gz", hash = "sha256:45b81f67d75341d4433abade799a47e9c42a9e22a118531dcb5e549864032d7c"}, -] -multiaddr = [ - {file = "multiaddr-0.0.9-py2.py3-none-any.whl", hash = "sha256:5c0f862cbcf19aada2a899f80ef896ddb2e85614e0c8f04dd287c06c69dac95b"}, - {file = "multiaddr-0.0.9.tar.gz", hash = "sha256:30b2695189edc3d5b90f1c303abb8f02d963a3a4edf2e7178b975eb417ab0ecf"}, -] -multicall = [ - {file = "multicall-0.1.3-py3-none-any.whl", hash = "sha256:775702b52ac16939f8d9b29921957c98826e76ae6007f05095cca3fd1be82cde"}, - {file = "multicall-0.1.3.tar.gz", hash = "sha256:94ee3d117667bb9bc5be53a1304e05216b78620128d1029621dcef7f91990f62"}, -] -netaddr = [ - {file = "netaddr-0.8.0-py2.py3-none-any.whl", hash = "sha256:9666d0232c32d2656e5e5f8d735f58fd6c7457ce52fc21c98d45f2af78f990ac"}, - {file = "netaddr-0.8.0.tar.gz", hash = "sha256:d6cc57c7a07b1d9d2e917aa8b36ae8ce61c35ba3fcd1b83ca31c5a0ee2b5a243"}, -] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -parsimonious = [ - {file = "parsimonious-0.8.1.tar.gz", hash = "sha256:3add338892d580e0cb3b1a39e4a1b427ff9f687858fdd61097053742391a9f6b"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -promise = [ - {file = "promise-2.3.tar.gz", hash = "sha256:dfd18337c523ba4b6a58801c164c1904a9d4d1b1747c7d5dbf45b693a49d93d0"}, -] -protobuf = [ - {file = "protobuf-3.19.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d80f80eb175bf5f1169139c2e0c5ada98b1c098e2b3c3736667f28cbbea39fc8"}, - {file = "protobuf-3.19.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a529e7df52204565bcd33738a7a5f288f3d2d37d86caa5d78c458fa5fabbd54d"}, - {file = "protobuf-3.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28ccea56d4dc38d35cd70c43c2da2f40ac0be0a355ef882242e8586c6d66666f"}, - {file = "protobuf-3.19.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b30a7de128c46b5ecb343917d9fa737612a6e8280f440874e5cc2ba0d79b8f6"}, - {file = "protobuf-3.19.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5935c8ce02e3d89c7900140a8a42b35bc037ec07a6aeb61cc108be8d3c9438a6"}, - {file = "protobuf-3.19.1-cp36-cp36m-win32.whl", hash = "sha256:74f33edeb4f3b7ed13d567881da8e5a92a72b36495d57d696c2ea1ae0cfee80c"}, - {file = "protobuf-3.19.1-cp36-cp36m-win_amd64.whl", hash = "sha256:038daf4fa38a7e818dd61f51f22588d61755160a98db087a046f80d66b855942"}, - {file = "protobuf-3.19.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e51561d72efd5bd5c91490af1f13e32bcba8dab4643761eb7de3ce18e64a853"}, - {file = "protobuf-3.19.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:6e8ea9173403219239cdfd8d946ed101f2ab6ecc025b0fda0c6c713c35c9981d"}, - {file = "protobuf-3.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db3532d9f7a6ebbe2392041350437953b6d7a792de10e629c1e4f5a6b1fe1ac6"}, - {file = "protobuf-3.19.1-cp37-cp37m-win32.whl", hash = "sha256:615b426a177780ce381ecd212edc1e0f70db8557ed72560b82096bd36b01bc04"}, - {file = "protobuf-3.19.1-cp37-cp37m-win_amd64.whl", hash = "sha256:d8919368410110633717c406ab5c97e8df5ce93020cfcf3012834f28b1fab1ea"}, - {file = "protobuf-3.19.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:71b0250b0cfb738442d60cab68abc166de43411f2a4f791d31378590bfb71bd7"}, - {file = "protobuf-3.19.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3cd0458870ea7d1c58e948ac8078f6ba8a7ecc44a57e03032ed066c5bb318089"}, - {file = "protobuf-3.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:655264ed0d0efe47a523e2255fc1106a22f6faab7cc46cfe99b5bae085c2a13e"}, - {file = "protobuf-3.19.1-cp38-cp38-win32.whl", hash = "sha256:b691d996c6d0984947c4cf8b7ae2fe372d99b32821d0584f0b90277aa36982d3"}, - {file = "protobuf-3.19.1-cp38-cp38-win_amd64.whl", hash = "sha256:e7e8d2c20921f8da0dea277dfefc6abac05903ceac8e72839b2da519db69206b"}, - {file = "protobuf-3.19.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fd390367fc211cc0ffcf3a9e149dfeca78fecc62adb911371db0cec5c8b7472d"}, - {file = "protobuf-3.19.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d83e1ef8cb74009bebee3e61cc84b1c9cd04935b72bca0cbc83217d140424995"}, - {file = "protobuf-3.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36d90676d6f426718463fe382ec6274909337ca6319d375eebd2044e6c6ac560"}, - {file = "protobuf-3.19.1-cp39-cp39-win32.whl", hash = "sha256:e7b24c11df36ee8e0c085e5b0dc560289e4b58804746fb487287dda51410f1e2"}, - {file = "protobuf-3.19.1-cp39-cp39-win_amd64.whl", hash = "sha256:77d2fadcf369b3f22859ab25bd12bb8e98fb11e05d9ff9b7cd45b711c719c002"}, - {file = "protobuf-3.19.1-py2.py3-none-any.whl", hash = "sha256:e813b1c9006b6399308e917ac5d298f345d95bb31f46f02b60cd92970a9afa17"}, - {file = "protobuf-3.19.1.tar.gz", hash = "sha256:62a8e4baa9cb9e064eb62d1002eca820857ab2138440cb4b3ea4243830f94ca7"}, -] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] -pycryptodome = [ - {file = "pycryptodome-3.12.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:90ad3381ccdc6a24cc2841e295706a168f32abefe64c679695712acac71fd5da"}, - {file = "pycryptodome-3.12.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e80f7469b0b3ea0f694230477d8501dc5a30a717e94fddd4821e6721f3053eae"}, - {file = "pycryptodome-3.12.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:b91404611767a7485837a6f1fd20cf9a5ae0ad362040a022cd65827ecb1b0d00"}, - {file = "pycryptodome-3.12.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:db66ccda65d5d20c17b00768e462a86f6f540f9aea8419a7f76cc7d9effd82cd"}, - {file = "pycryptodome-3.12.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:dc88355c4b261ed259268e65705b28b44d99570337694d593f06e3b1698eaaf3"}, - {file = "pycryptodome-3.12.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:6f8f5b7b53516da7511951910ab458e799173722c91fea54e2ba2f56d102e4aa"}, - {file = "pycryptodome-3.12.0-cp27-cp27m-win32.whl", hash = "sha256:93acad54a72d81253242eb0a15064be559ec9d989e5173286dc21cad19f01765"}, - {file = "pycryptodome-3.12.0-cp27-cp27m-win_amd64.whl", hash = "sha256:5a8c24d39d4a237dbfe181ea6593792bf9b5582c7fcfa7b8e0e12fda5eec07af"}, - {file = "pycryptodome-3.12.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:32d15da81959faea6cbed95df2bb44f7f796211c110cf90b5ad3b2aeeb97fc8e"}, - {file = "pycryptodome-3.12.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:aed7eb4b64c600fbc5e6d4238991ad1b4179a558401f203d1fcbd24883748982"}, - {file = "pycryptodome-3.12.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:341c6bbf932c406b4f3ee2372e8589b67ac0cf4e99e7dc081440f43a3cde9f0f"}, - {file = "pycryptodome-3.12.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:de0b711d673904dd6c65307ead36cb76622365a393569bf880895cba21195b7a"}, - {file = "pycryptodome-3.12.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:3558616f45d8584aee3eba27559bc6fd0ba9be6c076610ed3cc62bd5229ffdc3"}, - {file = "pycryptodome-3.12.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:a78e4324e566b5fbc2b51e9240950d82fa9e1c7eb77acdf27f58712f65622c1d"}, - {file = "pycryptodome-3.12.0-cp35-abi3-manylinux1_i686.whl", hash = "sha256:3f2f3dd596c6128d91314e60a6bcf4344610ef0e97f4ae4dd1770f86dd0748d8"}, - {file = "pycryptodome-3.12.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:e05f994f30f1cda3cbe57441f41220d16731cf99d868bb02a8f6484c454c206b"}, - {file = "pycryptodome-3.12.0-cp35-abi3-manylinux2010_i686.whl", hash = "sha256:4cded12e13785bbdf4ba1ff5fb9d261cd98162145f869e4fbc4a4b9083392f0b"}, - {file = "pycryptodome-3.12.0-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:1181c90d1a6aee68a84826825548d0db1b58d8541101f908d779d601d1690586"}, - {file = "pycryptodome-3.12.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:6bb0d340c93bcb674ea8899e2f6408ec64c6c21731a59481332b4b2a8143cc60"}, - {file = "pycryptodome-3.12.0-cp35-abi3-win32.whl", hash = "sha256:39da5807aa1ff820799c928f745f89432908bf6624b9e981d2d7f9e55d91b860"}, - {file = "pycryptodome-3.12.0-cp35-abi3-win_amd64.whl", hash = "sha256:212c7f7fe11cad9275fbcff50ca977f1c6643f13560d081e7b0f70596df447b8"}, - {file = "pycryptodome-3.12.0-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:b07a4238465eb8c65dd5df2ab8ba6df127e412293c0ed7656c003336f557a100"}, - {file = "pycryptodome-3.12.0-pp27-pypy_73-manylinux1_x86_64.whl", hash = "sha256:a6e1bcd9d5855f1a3c0f8d585f44c81b08f39a02754007f374fb8db9605ba29c"}, - {file = "pycryptodome-3.12.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:aceb1d217c3a025fb963849071446cf3aca1353282fe1c3cb7bd7339a4d47947"}, - {file = "pycryptodome-3.12.0-pp27-pypy_73-win32.whl", hash = "sha256:f699360ae285fcae9c8f53ca6acf33796025a82bb0ccd7c1c551b04c1726def3"}, - {file = "pycryptodome-3.12.0-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d845c587ceb82ac7cbac7d0bf8c62a1a0fe7190b028b322da5ca65f6e5a18b9e"}, - {file = "pycryptodome-3.12.0-pp36-pypy36_pp73-manylinux1_x86_64.whl", hash = "sha256:d8083de50f6dec56c3c6f270fb193590999583a1b27c9c75bc0b5cac22d438cc"}, - {file = "pycryptodome-3.12.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:9ea2f6674c803602a7c0437fccdc2ea036707e60456974fe26ca263bd501ec45"}, - {file = "pycryptodome-3.12.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:5d4264039a2087977f50072aaff2346d1c1c101cb359f9444cf92e3d1f42b4cd"}, - {file = "pycryptodome-3.12.0.zip", hash = "sha256:12c7343aec5a3b3df5c47265281b12b611f26ec9367b6129199d67da54b768c1"}, -] -pyparsing = [ - {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"}, - {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"}, -] -pyrsistent = [ - {file = "pyrsistent-0.18.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f4c8cabb46ff8e5d61f56a037974228e978f26bfefce4f61a4b1ac0ba7a2ab72"}, - {file = "pyrsistent-0.18.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:da6e5e818d18459fa46fac0a4a4e543507fe1110e808101277c5a2b5bab0cd2d"}, - {file = "pyrsistent-0.18.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5e4395bbf841693eaebaa5bb5c8f5cdbb1d139e07c975c682ec4e4f8126e03d2"}, - {file = "pyrsistent-0.18.0-cp36-cp36m-win32.whl", hash = "sha256:527be2bfa8dc80f6f8ddd65242ba476a6c4fb4e3aedbf281dfbac1b1ed4165b1"}, - {file = "pyrsistent-0.18.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2aaf19dc8ce517a8653746d98e962ef480ff34b6bc563fc067be6401ffb457c7"}, - {file = "pyrsistent-0.18.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58a70d93fb79dc585b21f9d72487b929a6fe58da0754fa4cb9f279bb92369396"}, - {file = "pyrsistent-0.18.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4916c10896721e472ee12c95cdc2891ce5890898d2f9907b1b4ae0f53588b710"}, - {file = "pyrsistent-0.18.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:73ff61b1411e3fb0ba144b8f08d6749749775fe89688093e1efef9839d2dcc35"}, - {file = "pyrsistent-0.18.0-cp37-cp37m-win32.whl", hash = "sha256:b29b869cf58412ca5738d23691e96d8aff535e17390128a1a52717c9a109da4f"}, - {file = "pyrsistent-0.18.0-cp37-cp37m-win_amd64.whl", hash = "sha256:097b96f129dd36a8c9e33594e7ebb151b1515eb52cceb08474c10a5479e799f2"}, - {file = "pyrsistent-0.18.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:772e94c2c6864f2cd2ffbe58bb3bdefbe2a32afa0acb1a77e472aac831f83427"}, - {file = "pyrsistent-0.18.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c1a9ff320fa699337e05edcaae79ef8c2880b52720bc031b219e5b5008ebbdef"}, - {file = "pyrsistent-0.18.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cd3caef37a415fd0dae6148a1b6957a8c5f275a62cca02e18474608cb263640c"}, - {file = "pyrsistent-0.18.0-cp38-cp38-win32.whl", hash = "sha256:e79d94ca58fcafef6395f6352383fa1a76922268fa02caa2272fff501c2fdc78"}, - {file = "pyrsistent-0.18.0-cp38-cp38-win_amd64.whl", hash = "sha256:a0c772d791c38bbc77be659af29bb14c38ced151433592e326361610250c605b"}, - {file = "pyrsistent-0.18.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d5ec194c9c573aafaceebf05fc400656722793dac57f254cd4741f3c27ae57b4"}, - {file = "pyrsistent-0.18.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:6b5eed00e597b5b5773b4ca30bd48a5774ef1e96f2a45d105db5b4ebb4bca680"}, - {file = "pyrsistent-0.18.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:48578680353f41dca1ca3dc48629fb77dfc745128b56fc01096b2530c13fd426"}, - {file = "pyrsistent-0.18.0-cp39-cp39-win32.whl", hash = "sha256:f3ef98d7b76da5eb19c37fda834d50262ff9167c65658d1d8f974d2e4d90676b"}, - {file = "pyrsistent-0.18.0-cp39-cp39-win_amd64.whl", hash = "sha256:404e1f1d254d314d55adb8d87f4f465c8693d6f902f67eb6ef5b4526dc58e6ea"}, - {file = "pyrsistent-0.18.0.tar.gz", hash = "sha256:773c781216f8c2900b42a7b638d5b517bb134ae1acbebe4d1e8f1f41ea60eb4b"}, -] -pytest = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, -] -pywin32 = [ - {file = "pywin32-302-cp310-cp310-win32.whl", hash = "sha256:251b7a9367355ccd1a4cd69cd8dd24bd57b29ad83edb2957cfa30f7ed9941efa"}, - {file = "pywin32-302-cp310-cp310-win_amd64.whl", hash = "sha256:79cf7e6ddaaf1cd47a9e50cc74b5d770801a9db6594464137b1b86aa91edafcc"}, - {file = "pywin32-302-cp36-cp36m-win32.whl", hash = "sha256:fe21c2fb332d03dac29de070f191bdbf14095167f8f2165fdc57db59b1ecc006"}, - {file = "pywin32-302-cp36-cp36m-win_amd64.whl", hash = "sha256:d3761ab4e8c5c2dbc156e2c9ccf38dd51f936dc77e58deb940ffbc4b82a30528"}, - {file = "pywin32-302-cp37-cp37m-win32.whl", hash = "sha256:48dd4e348f1ee9538dd4440bf201ea8c110ea6d9f3a5010d79452e9fa80480d9"}, - {file = "pywin32-302-cp37-cp37m-win_amd64.whl", hash = "sha256:496df89f10c054c9285cc99f9d509e243f4e14ec8dfc6d78c9f0bf147a893ab1"}, - {file = "pywin32-302-cp38-cp38-win32.whl", hash = "sha256:e372e477d938a49266136bff78279ed14445e00718b6c75543334351bf535259"}, - {file = "pywin32-302-cp38-cp38-win_amd64.whl", hash = "sha256:543552e66936378bd2d673c5a0a3d9903dba0b0a87235ef0c584f058ceef5872"}, - {file = "pywin32-302-cp39-cp39-win32.whl", hash = "sha256:2393c1a40dc4497fd6161b76801b8acd727c5610167762b7c3e9fd058ef4a6ab"}, - {file = "pywin32-302-cp39-cp39-win_amd64.whl", hash = "sha256:af5aea18167a31efcacc9f98a2ca932c6b6a6d91ebe31f007509e293dea12580"}, -] -requests = [ - {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, - {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, -] -rlp = [ - {file = "rlp-2.0.1-py2.py3-none-any.whl", hash = "sha256:52a57c9f53f03c88b189283734b397314288250cc4a3c4113e9e36e2ac6bdd16"}, - {file = "rlp-2.0.1.tar.gz", hash = "sha256:665e8312750b3fc5f7002e656d05b9dcb6e93b6063df40d95c49ad90c19d1f0e"}, -] -rx = [ - {file = "Rx-1.6.1-py2.py3-none-any.whl", hash = "sha256:7357592bc7e881a95e0c2013b73326f704953301ab551fbc8133a6fadab84105"}, - {file = "Rx-1.6.1.tar.gz", hash = "sha256:13a1d8d9e252625c173dc795471e614eadfe1cf40ffc684e08b8fff0d9748c23"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -toolz = [ - {file = "toolz-0.11.2-py3-none-any.whl", hash = "sha256:a5700ce83414c64514d82d60bcda8aabfde092d1c1a8663f9200c07fdcc6da8f"}, - {file = "toolz-0.11.2.tar.gz", hash = "sha256:6b312d5e15138552f1bda8a4e66c30e236c831b612b2bf0005f8a1df10a4bc33"}, -] -typing-extensions = [ - {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, - {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, - {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, -] -urllib3 = [ - {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, - {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, -] -varint = [ - {file = "varint-1.0.2.tar.gz", hash = "sha256:a6ecc02377ac5ee9d65a6a8ad45c9ff1dac8ccee19400a5950fb51d594214ca5"}, -] -web3 = [ - {file = "web3-5.19.0-py3-none-any.whl", hash = "sha256:3e6158edac8756c6a3d874ae23ce6eb9e53d0d250ab6a5425a869e1e568bf550"}, - {file = "web3-5.19.0.tar.gz", hash = "sha256:e120decb8e1db6d7d005a4446756f16b605e0a3d78384587fd2dab6338654751"}, -] -websockets = [ - {file = "websockets-8.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:3762791ab8b38948f0c4d281c8b2ddfa99b7e510e46bd8dfa942a5fff621068c"}, - {file = "websockets-8.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:3db87421956f1b0779a7564915875ba774295cc86e81bc671631379371af1170"}, - {file = "websockets-8.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4f9f7d28ce1d8f1295717c2c25b732c2bc0645db3215cf757551c392177d7cb8"}, - {file = "websockets-8.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:295359a2cc78736737dd88c343cd0747546b2174b5e1adc223824bcaf3e164cb"}, - {file = "websockets-8.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:1d3f1bf059d04a4e0eb4985a887d49195e15ebabc42364f4eb564b1d065793f5"}, - {file = "websockets-8.1-cp36-cp36m-win32.whl", hash = "sha256:2db62a9142e88535038a6bcfea70ef9447696ea77891aebb730a333a51ed559a"}, - {file = "websockets-8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:0e4fb4de42701340bd2353bb2eee45314651caa6ccee80dbd5f5d5978888fed5"}, - {file = "websockets-8.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:9b248ba3dd8a03b1a10b19efe7d4f7fa41d158fdaa95e2cf65af5a7b95a4f989"}, - {file = "websockets-8.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ce85b06a10fc65e6143518b96d3dca27b081a740bae261c2fb20375801a9d56d"}, - {file = "websockets-8.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:965889d9f0e2a75edd81a07592d0ced54daa5b0785f57dc429c378edbcffe779"}, - {file = "websockets-8.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:751a556205d8245ff94aeef23546a1113b1dd4f6e4d102ded66c39b99c2ce6c8"}, - {file = "websockets-8.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3ef56fcc7b1ff90de46ccd5a687bbd13a3180132268c4254fc0fa44ecf4fc422"}, - {file = "websockets-8.1-cp37-cp37m-win32.whl", hash = "sha256:7ff46d441db78241f4c6c27b3868c9ae71473fe03341340d2dfdbe8d79310acc"}, - {file = "websockets-8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:20891f0dddade307ffddf593c733a3fdb6b83e6f9eef85908113e628fa5a8308"}, - {file = "websockets-8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c1ec8db4fac31850286b7cd3b9c0e1b944204668b8eb721674916d4e28744092"}, - {file = "websockets-8.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5c01fd846263a75bc8a2b9542606927cfad57e7282965d96b93c387622487485"}, - {file = "websockets-8.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9bef37ee224e104a413f0780e29adb3e514a5b698aabe0d969a6ba426b8435d1"}, - {file = "websockets-8.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d705f8aeecdf3262379644e4b55107a3b55860eb812b673b28d0fbc347a60c55"}, - {file = "websockets-8.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:c8a116feafdb1f84607cb3b14aa1418424ae71fee131642fc568d21423b51824"}, - {file = "websockets-8.1-cp38-cp38-win32.whl", hash = "sha256:e898a0863421650f0bebac8ba40840fc02258ef4714cb7e1fd76b6a6354bda36"}, - {file = "websockets-8.1-cp38-cp38-win_amd64.whl", hash = "sha256:f8a7bff6e8664afc4e6c28b983845c5bc14965030e3fb98789734d416af77c4b"}, - {file = "websockets-8.1.tar.gz", hash = "sha256:5c65d2da8c6bce0fca2528f69f44b2f977e06954c8512a952222cea50dad430f"}, -] -zipp = [ - {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, - {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, -] +lock-version = "2.0" +python-versions = ">=3.9,<4" +content-hash = "a9309490343c3b5dcd073f2a878df9712f9cad9f48ceabd8571e071f5dd98284" diff --git a/pyproject.toml b/pyproject.toml index d4e02a0..38a48d3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,24 +1,37 @@ [tool.poetry] -name = "balpy" -version = "0.0.0a84" +name = "open-balpy" +version = "0.1.0" description = "Balancer V2 Python API" -authors = ["Greg "] +authors = ["Greg ", "8baller <8baller@station.codes>"] +readme = "README.md" license = "GNU GPL 3" +packages = [ + { include = "balpy", from = "." }, +] [tool.poetry.dependencies] -python = ">=3.9, <4.0" -Cython="0.29.24" -cytoolz="0.11.2" -requests="2.25.1" -eth-abi="2.1.1" -gql="2.0.0" -multicaller=">=0.0.0a10" -jstyleson="0.0.2" -web3="5.19.0" +python = ">=3.9,<4" +Cython=">=0.29.24" +cytoolz=">=0.11.2" +requests=">=2.25.1" +eth-abi=">=2.1.1" +gql=">=2.0.0" +jstyleson=">=0.0.2" +web3="~6" +open-multicaller = ">=0.2.0" +requests-toolbelt = "^1.0.0" -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] pytest="*" +black = "22.1" +isort = "^5.12.0" +flake8 = "^6.1.0" +autoflake8 = "^0.4.1" +autopep8 = "^2.0.4" +click = "8.0.2" +setuptools = "^68.2.2" +tbump = "^6.11.0" [build-system] requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" \ No newline at end of file +build-backend = "poetry.core.masonry.api" diff --git a/samples/__init__.py b/samples/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/samples/batchSwaps/batchSwapSample.py b/samples/batchSwaps/batchSwapSample.py index 2312134..b9cada0 100644 --- a/samples/batchSwaps/batchSwapSample.py +++ b/samples/batchSwaps/batchSwapSample.py @@ -1,66 +1,71 @@ -import balpy -import sys -import os import json +import os +import sys + +import balpy + def main(): - - if len(sys.argv) < 2: - print("Usage: python3", sys.argv[0], "/path/to/swap.json"); - quit(); - - pathToSwap = sys.argv[1]; - if not os.path.isfile(pathToSwap): - print("Path", pathToSwap, "does not exist. Please enter a valid path.") - quit(); - - with open(pathToSwap) as f: - data = json.load(f) - - gasFactor = 1.05; - gasSpeedApproval = "fast"; - gasSpeedTrade = "fast"; - - bal = balpy.balpy.balpy(data["network"]); - swap = data["batchSwap"]; - isFlashSwap = bal.balSwapIsFlashSwap(swap); - - print(); - print("==============================================================") - print("================ Step 1: Check Token Balances ================") - print("==============================================================") - print(); - - tokens = swap["assets"]; - amountsIn = swap["limits"]; - if not isFlashSwap: - if not bal.erc20HasSufficientBalances(tokens, amountsIn): - print("Please fix your insufficient balance before proceeding.") - print("Quitting...") - quit(); - else: - print("Executing Flash Swap, no token balances necessary.") - - - print(); - print("==============================================================") - print("============== Step 2: Approve Token Allowance ===============") - print("==============================================================") - print(); - - if not isFlashSwap: - bal.erc20AsyncEnforceSufficientVaultAllowances(tokens, amountsIn, amountsIn, gasFactor, gasSpeedApproval); - else: - print("Executing Flash Swap, no token approvals necessary.") - # quit(); - - print(); - print("==============================================================") - print("=============== Step 3: Execute Batch Swap Txn ===============") - print("==============================================================") - print(); - - txHash = bal.balDoBatchSwap(swap, gasFactor=gasFactor, gasPriceSpeed=gasSpeedTrade); - -if __name__ == '__main__': - main(); \ No newline at end of file + if len(sys.argv) < 2: + print("Usage: python3", sys.argv[0], "/path/to/swap.json") + quit() + + pathToSwap = sys.argv[1] + if not os.path.isfile(pathToSwap): + print("Path", pathToSwap, "does not exist. Please enter a valid path.") + quit() + + with open(pathToSwap) as f: + data = json.load(f) + + gasFactor = 1.05 + gasSpeedApproval = "fast" + gasSpeedTrade = "fast" + + bal = balpy.balpy.balpy(data["network"]) + swap = data["batchSwap"] + isFlashSwap = bal.balSwapIsFlashSwap(swap) + + print() + print("==============================================================") + print("================ Step 1: Check Token Balances ================") + print("==============================================================") + print() + + tokens = swap["assets"] + amountsIn = swap["limits"] + if not isFlashSwap: + if not bal.erc20HasSufficientBalances(tokens, amountsIn): + print("Please fix your insufficient balance before proceeding.") + print("Quitting...") + quit() + else: + print("Executing Flash Swap, no token balances necessary.") + + print() + print("==============================================================") + print("============== Step 2: Approve Token Allowance ===============") + print("==============================================================") + print() + + if not isFlashSwap: + bal.erc20AsyncEnforceSufficientVaultAllowances( + tokens, amountsIn, amountsIn, gasFactor, gasSpeedApproval + ) + else: + print("Executing Flash Swap, no token approvals necessary.") + # quit(); + + print() + print("==============================================================") + print("=============== Step 3: Execute Batch Swap Txn ===============") + print("==============================================================") + print() + + txHash = bal.balDoBatchSwap(swap, gasFactor=gasFactor, gasPriceSpeed=gasSpeedTrade) + + print("Batch Swap Txn Hash:", txHash) + + +if __name__ == "__main__": + main() diff --git a/samples/batchSwaps/queryBatchSwapSample.py b/samples/batchSwaps/queryBatchSwapSample.py index ded1b99..9084f9c 100644 --- a/samples/batchSwaps/queryBatchSwapSample.py +++ b/samples/batchSwaps/queryBatchSwapSample.py @@ -1,27 +1,29 @@ -import balpy -import sys -import os import json +import os +import sys + +import balpy + def main(): - - if len(sys.argv) < 2: - print("Usage: python3", sys.argv[0], "/path/to/swap.json"); - quit(); - - pathToSwap = sys.argv[1]; - if not os.path.isfile(pathToSwap): - print("Path", pathToSwap, "does not exist. Please enter a valid path.") - quit(); - - with open(pathToSwap) as f: - data = json.load(f) - - bal = balpy.balpy.balpy(data["network"]); - swap = data["batchSwap"]; - - data = bal.balQueryBatchSwap(swap); - print(json.dumps(data, indent=4)); - -if __name__ == '__main__': - main(); \ No newline at end of file + if len(sys.argv) < 2: + print("Usage: python3", sys.argv[0], "/path/to/swap.json") + quit() + + pathToSwap = sys.argv[1] + if not os.path.isfile(pathToSwap): + print("Path", pathToSwap, "does not exist. Please enter a valid path.") + quit() + + with open(pathToSwap) as f: + data = json.load(f) + + bal = balpy.balpy.balpy(data["network"]) + swap = data["batchSwap"] + + data = bal.balQueryBatchSwap(swap) + print(json.dumps(data, indent=4)) + + +if __name__ == "__main__": + main() diff --git a/samples/batchSwaps/queryBatchSwapsSample.py b/samples/batchSwaps/queryBatchSwapsSample.py index 29891fe..47d2766 100644 --- a/samples/batchSwaps/queryBatchSwapsSample.py +++ b/samples/batchSwaps/queryBatchSwapsSample.py @@ -1,28 +1,30 @@ -import balpy -import sys -import os import json +import os +import sys + +import balpy + def main(): - - if len(sys.argv) < 2: - print("Usage: python3", sys.argv[0], "/path/to/swap.json"); - quit(); + if len(sys.argv) < 2: + print("Usage: python3", sys.argv[0], "/path/to/swap.json") + quit() + + pathToSwap = sys.argv[1] + if not os.path.isfile(pathToSwap): + print("Path", pathToSwap, "does not exist. Please enter a valid path.") + quit() - pathToSwap = sys.argv[1]; - if not os.path.isfile(pathToSwap): - print("Path", pathToSwap, "does not exist. Please enter a valid path.") - quit(); + with open(pathToSwap) as f: + data = json.load(f) - with open(pathToSwap) as f: - data = json.load(f) + bal = balpy.balpy.balpy(data["network"]) - bal = balpy.balpy.balpy(data["network"]); + swap = data["batchSwap"] + (data, successes) = bal.balQueryBatchSwaps([swap] * 3) + print(successes) + print(json.dumps(data, indent=4)) - swap = data["batchSwap"]; - (data, successes) = bal.balQueryBatchSwaps([swap] * 3); - print(successes) - print(json.dumps(data, indent=4)); -if __name__ == '__main__': - main(); \ No newline at end of file +if __name__ == "__main__": + main() diff --git a/samples/batchSwaps/sorSwapSample.py b/samples/batchSwaps/sorSwapSample.py index 71a7eda..3760a45 100644 --- a/samples/batchSwaps/sorSwapSample.py +++ b/samples/batchSwaps/sorSwapSample.py @@ -1,76 +1,81 @@ -import balpy -import sys import os +import sys + +import balpy import jstyleson -import json + def main(): - - if len(sys.argv) < 2: - print("Usage: python3", sys.argv[0], "/path/to/swap.json"); - quit(); - - pathToSwap = sys.argv[1]; - if not os.path.isfile(pathToSwap): - print("Path", pathToSwap, "does not exist. Please enter a valid path.") - quit(); - - with open(pathToSwap) as f: - data = jstyleson.load(f) - - gasFactor = 1.05; - gasSpeedApproval = "fast"; - gasSpeedTrade = "fast"; - - - bal = balpy.balpy.balpy(data["network"]); - - print(); - print("==============================================================") - print("============== Step 1: Query Smart Order Router ==============") - print("==============================================================") - print(); - sor_result = bal.balSorQuery(data) - swap = sor_result["batchSwap"]; - - isFlashSwap = bal.balSwapIsFlashSwap(swap); - - print(); - print("==============================================================") - print("================ Step 2: Check Token Balances ================") - print("==============================================================") - print(); - - tokens = swap["assets"]; - amountsIn = swap["limits"]; - if not isFlashSwap: - if not bal.erc20HasSufficientBalances(tokens, amountsIn): - print("Please fix your insufficient balance before proceeding.") - print("Quitting...") - quit(); - else: - print("Executing Flash Swap, no token balances necessary.") - - - print(); - print("==============================================================") - print("============== Step 3: Approve Token Allowance ===============") - print("==============================================================") - print(); - - if not isFlashSwap: - bal.erc20AsyncEnforceSufficientVaultAllowances(tokens, amountsIn, amountsIn, gasFactor, gasSpeedApproval); - else: - print("Executing Flash Swap, no token approvals necessary.") - # quit(); - - print(); - print("==============================================================") - print("=============== Step 4: Execute Batch Swap Txn ===============") - print("==============================================================") - print(); - - txHash = bal.balDoBatchSwap(swap, gasFactor=gasFactor, gasPriceSpeed=gasSpeedTrade); - -if __name__ == '__main__': - main(); \ No newline at end of file + if len(sys.argv) < 2: + print("Usage: python3", sys.argv[0], "/path/to/swap.json") + quit() + + pathToSwap = sys.argv[1] + if not os.path.isfile(pathToSwap): + print("Path", pathToSwap, "does not exist. Please enter a valid path.") + quit() + + with open(pathToSwap) as f: + data = jstyleson.load(f) + + gasFactor = 1.05 + gasSpeedApproval = "fast" + gasSpeedTrade = "fast" + + bal = balpy.balpy.balpy(data["network"]) + + print() + print("==============================================================") + print("============== Step 1: Query Smart Order Router ==============") + print("==============================================================") + print() + sor_result = bal.balSorQuery(data) + swap = sor_result["batchSwap"] + + isFlashSwap = bal.balSwapIsFlashSwap(swap) + + print() + print("==============================================================") + print("================ Step 2: Check Token Balances ================") + print("==============================================================") + print() + + tokens = swap["assets"] + amountsIn = swap["limits"] + if not tokens: + raise ValueError("No tokens provided in swap") + if not isFlashSwap: + if not bal.erc20HasSufficientBalances(tokens, amountsIn): + print("Please fix your insufficient balance before proceeding.") + print("Quitting...") + quit() + else: + print("Executing Flash Swap, no token balances necessary.") + + print() + print("==============================================================") + print("============== Step 3: Approve Token Allowance ===============") + print("==============================================================") + print() + + if not isFlashSwap: + bal.erc20AsyncEnforceSufficientVaultAllowances( + tokens, amountsIn, amountsIn, gasFactor, gasSpeedApproval + ) + else: + print("Executing Flash Swap, no token approvals necessary.") + # quit(); + + print() + print("==============================================================") + print("=============== Step 4: Execute Batch Swap Txn ===============") + print("==============================================================") + print() + + txHash = bal.balDoBatchSwap(swap, gasFactor=gasFactor, gasPriceSpeed=gasSpeedTrade) + + print("Batch Swap Txn Hash: ", txHash) + + +if __name__ == "__main__": + main() diff --git a/samples/exitPool/exitPoolSample.py b/samples/exitPool/exitPoolSample.py index bcf618d..d3b8fc5 100644 --- a/samples/exitPool/exitPoolSample.py +++ b/samples/exitPool/exitPoolSample.py @@ -1,8 +1,9 @@ -import balpy -import sys +import json import os +import sys + +import balpy import jstyleson -import json def main(): @@ -27,7 +28,7 @@ def main(): print() poolAddress = bal.balPooldIdToAddress(exitData["poolId"]) - + neededBPTamount = exitData.get("bptAmount", 0) if exitData["exitKind"] == "BPT_IN_FOR_EXACT_TOKENS_OUT": neededBPTamount = exitData["maxBptAmount"] @@ -51,5 +52,5 @@ def main(): print(json.dumps(output, indent=4)) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/samples/internalBalances/sampleInternalBalances.py b/samples/internalBalances/sampleInternalBalances.py index 8d33105..3cbc18e 100644 --- a/samples/internalBalances/sampleInternalBalances.py +++ b/samples/internalBalances/sampleInternalBalances.py @@ -1,108 +1,156 @@ import balpy + def printBalances(bal, tokens, address=None): - if not address is None: - print("Balances for", address); - print("Token\t\t\t\t\t\tInternal Balance\tExternal Balance") - internalBalances = bal.balVaultGetInternalBalance(tokens, address); - for token in internalBalances.keys(): - internal = internalBalances[token]; - external = bal.erc20GetBalanceStandard(token, address); - print(token, "\t", '{:.18f}'.format(internal), "\t", '{:.18f}'.format(external)) - print(); + if address is not None: + print("Balances for", address) + print("Token\t\t\t\t\t\tInternal Balance\tExternal Balance") + internalBalances = bal.balVaultGetInternalBalance(tokens, address) + for token in internalBalances.keys(): + internal = internalBalances[token] + external = bal.erc20GetBalanceStandard(token, address) + print(token, "\t", "{:.18f}".format(internal), "\t", "{:.18f}".format(external)) + print() + def main(): - network = "kovan" - bal = balpy.balpy.balpy(network); - - deadAddress = "0x0000000000000000000000000000000000000000"; - - gasFactor = 1.05; - gasPriceSpeed = "average"; - tokens = ["0xdFCeA9088c8A88A76FF74892C1457C17dfeef9C1"]; - amounts = [10.0]; - allowances = [-1]; - - token = tokens[0]; - - # enforce allowance - bal.erc20AsyncEnforceSufficientVaultAllowances(tokens, allowances, amounts, gasFactor, gasPriceSpeed); - - # QUERY INTERNAL BALANCE(S) - internalBalances = bal.balVaultGetInternalBalance(tokens); - - # DEPOSIT_INTERNAL - print(); - print("=============================================================="); - print("================ Deposit to Internal Balances ================"); - print("=============================================================="); - print(); - - print("\n==================== Starting Balances ====================\n"); - printBalances(bal, tokens); - - amount = 10.0; - print("Depositing", amount, "of token", token, "to internal balance..."); - bal.balVaultDoManageUserBalance( bal.UserBalanceOpKind["DEPOSIT_INTERNAL"], token, amount, bal.address, bal.address); - - print("\n==================== Ending Balances ====================\n"); - printBalances(bal, tokens); - - # WITHDRAW_INTERNAL = 1; - print(); - print("============================================================="); - print("============== Withdraw from Internal Balances =============="); - print("============================================================="); - print(); - - print("\n==================== Starting Balances ====================\n"); - printBalances(bal, tokens); - - amount = 5.0; - print("Withdrawing", amount, "of token", token, "from internal balance...\n"); - bal.balVaultDoManageUserBalance( bal.UserBalanceOpKind["WITHDRAW_INTERNAL"], token, amount, bal.address, bal.address); - - print("\n==================== Ending Balances ====================\n"); - printBalances(bal, tokens); - - - # TRANSFER_INTERNAL = 2; - print(); - print("============================================================"); - print("============== Transferring Internal Balances =============="); - print("============================================================"); - print(); - - print("\n==================== Starting Balances ====================\n"); - printBalances(bal, tokens, bal.address); - printBalances(bal, tokens, deadAddress); - - amount = 2.5; - print("Transferring", amount, "of token", token, "from", bal.address, "to", deadAddress,"INTERNALLY\n"); - bal.balVaultDoManageUserBalance( bal.UserBalanceOpKind["TRANSFER_INTERNAL"], token, amount, bal.address, deadAddress); - - print("\n==================== Ending Balances ====================\n"); - printBalances(bal, tokens, bal.address); - printBalances(bal, tokens, deadAddress); - - # TRANSFER_EXTERNAL = 3; - print(); - print("============================================================"); - print("============== Transferring External Balances =============="); - print("============================================================"); - print(); - - print("\n==================== Starting Balances ====================\n"); - printBalances(bal, tokens, bal.address); - printBalances(bal, tokens, deadAddress); - - amount = 1.25; - print("Transferring", amount, "of token", token, "from", bal.address, "to", deadAddress,"EXTERNALLY\n"); - bal.balVaultDoManageUserBalance( bal.UserBalanceOpKind["TRANSFER_EXTERNAL"], token, amount, bal.address, deadAddress); - - print("\n==================== Ending Balances ====================\n"); - printBalances(bal, tokens, bal.address); - printBalances(bal, tokens, deadAddress); - -if __name__ == '__main__': - main(); \ No newline at end of file + network = "kovan" + bal = balpy.balpy.balpy(network) + + deadAddress = "0x0000000000000000000000000000000000000000" + + gasFactor = 1.05 + gasPriceSpeed = "average" + tokens = ["0xdFCeA9088c8A88A76FF74892C1457C17dfeef9C1"] + amounts = [10.0] + allowances = [-1] + + token = tokens[0] + + # enforce allowance + bal.erc20AsyncEnforceSufficientVaultAllowances( + tokens, allowances, amounts, gasFactor, gasPriceSpeed + ) + + # QUERY INTERNAL BALANCE(S) + bal.balVaultGetInternalBalance(tokens) + + # DEPOSIT_INTERNAL + print() + print("==============================================================") + print("================ Deposit to Internal Balances ================") + print("==============================================================") + print() + + print("\n==================== Starting Balances ====================\n") + printBalances(bal, tokens) + + amount = 10.0 + print("Depositing", amount, "of token", token, "to internal balance...") + bal.balVaultDoManageUserBalance( + bal.UserBalanceOpKind["DEPOSIT_INTERNAL"], + token, + amount, + bal.address, + bal.address, + ) + + print("\n==================== Ending Balances ====================\n") + printBalances(bal, tokens) + + # WITHDRAW_INTERNAL = 1; + print() + print("=============================================================") + print("============== Withdraw from Internal Balances ==============") + print("=============================================================") + print() + + print("\n==================== Starting Balances ====================\n") + printBalances(bal, tokens) + + amount = 5.0 + print("Withdrawing", amount, "of token", token, "from internal balance...\n") + bal.balVaultDoManageUserBalance( + bal.UserBalanceOpKind["WITHDRAW_INTERNAL"], + token, + amount, + bal.address, + bal.address, + ) + + print("\n==================== Ending Balances ====================\n") + printBalances(bal, tokens) + + # TRANSFER_INTERNAL = 2; + print() + print("============================================================") + print("============== Transferring Internal Balances ==============") + print("============================================================") + print() + + print("\n==================== Starting Balances ====================\n") + printBalances(bal, tokens, bal.address) + printBalances(bal, tokens, deadAddress) + + amount = 2.5 + print( + "Transferring", + amount, + "of token", + token, + "from", + bal.address, + "to", + deadAddress, + "INTERNALLY\n", + ) + bal.balVaultDoManageUserBalance( + bal.UserBalanceOpKind["TRANSFER_INTERNAL"], + token, + amount, + bal.address, + deadAddress, + ) + + print("\n==================== Ending Balances ====================\n") + printBalances(bal, tokens, bal.address) + printBalances(bal, tokens, deadAddress) + + # TRANSFER_EXTERNAL = 3; + print() + print("============================================================") + print("============== Transferring External Balances ==============") + print("============================================================") + print() + + print("\n==================== Starting Balances ====================\n") + printBalances(bal, tokens, bal.address) + printBalances(bal, tokens, deadAddress) + + amount = 1.25 + print( + "Transferring", + amount, + "of token", + token, + "from", + bal.address, + "to", + deadAddress, + "EXTERNALLY\n", + ) + bal.balVaultDoManageUserBalance( + bal.UserBalanceOpKind["TRANSFER_EXTERNAL"], + token, + amount, + bal.address, + deadAddress, + ) + + print("\n==================== Ending Balances ====================\n") + printBalances(bal, tokens, bal.address) + printBalances(bal, tokens, deadAddress) + + +if __name__ == "__main__": + main() diff --git a/samples/joinPool/joinPoolSample.py b/samples/joinPool/joinPoolSample.py index 6abca24..0b4be0c 100644 --- a/samples/joinPool/joinPoolSample.py +++ b/samples/joinPool/joinPoolSample.py @@ -1,66 +1,77 @@ -import balpy -import sys +import json import os +import sys + +import balpy import jstyleson -import json + def main(): - - if len(sys.argv) < 2: - print("Usage: python3", sys.argv[0], "/path/to/join.json"); - quit(); - - pathToJoin = sys.argv[1]; - if not os.path.isfile(pathToJoin): - print("Path", pathToJoin, "does not exist. Please enter a valid path.") - quit(); - - with open(pathToJoin) as f: - join = jstyleson.load(f) - - gasFactor = 1.05; - gasSpeed = "average"; - gasPriceGweiOverride = -1; # -1 uses etherscan price at speed for gasSpeed, all other values will override - bal = balpy.balpy.balpy(join["network"]); - - print(); - print("==============================================================") - print("================ Step 1: Check Token Balances ================") - print("==============================================================") - print(); - - tokens = list(join["tokens"].keys()); - amounts = [join["tokens"][token]["amount"] for token in tokens]; - if not bal.erc20HasSufficientBalances(tokens, amounts): - print("Please fix your insufficient balance before proceeding.") - print("Quitting...") - quit(); - - print(); - print("===============================================================") - print("=============== Step 2: Approve Token Allowance ===============") - print("===============================================================") - print(); - - #the poolData structure is similar to joinData. Will be renamed in the future. - (tokensSorted, allowancesSorted) = bal.erc20GetTargetAllowancesFromPoolData(join); - amountsSorted = [join["tokens"][token]["amount"] for token in tokensSorted]; - - # Async: Do [Approve]*N then [Wait]*N instead of [Approve, Wait]*N - bal.erc20AsyncEnforceSufficientVaultAllowances(tokensSorted, allowancesSorted, amountsSorted, gasFactor, gasSpeed, gasPriceGweiOverride=gasPriceGweiOverride); - - print(); - print("===============================================================") - print("================= Step 3: Send Tokens to Pool =================") - print("===============================================================") - print(); - - query = False; - output = bal.balJoinPool(join, query=query); - - if query: - print("queryJoin results:") - print(json.dumps(output,indent=4)); - -if __name__ == '__main__': - main(); + if len(sys.argv) < 2: + print("Usage: python3", sys.argv[0], "/path/to/join.json") + quit() + + pathToJoin = sys.argv[1] + if not os.path.isfile(pathToJoin): + print("Path", pathToJoin, "does not exist. Please enter a valid path.") + quit() + + with open(pathToJoin) as f: + join = jstyleson.load(f) + + gasFactor = 1.05 + gasSpeed = "average" + gasPriceGweiOverride = -1 + # -1 uses etherscan price at speed for gasSpeed, all other values will override + bal = balpy.balpy.balpy(join["network"]) + + print() + print("==============================================================") + print("================ Step 1: Check Token Balances ================") + print("==============================================================") + print() + + tokens = list(join["tokens"].keys()) + amounts = [join["tokens"][token]["amount"] for token in tokens] + if not bal.erc20HasSufficientBalances(tokens, amounts): + print("Please fix your insufficient balance before proceeding.") + print("Quitting...") + quit() + + print() + print("===============================================================") + print("=============== Step 2: Approve Token Allowance ===============") + print("===============================================================") + print() + + # the poolData structure is similar to joinData. Will be renamed in the + # future. + (tokensSorted, allowancesSorted) = bal.erc20GetTargetAllowancesFromPoolData(join) + amountsSorted = [join["tokens"][token]["amount"] for token in tokensSorted] + + # Async: Do [Approve]*N then [Wait]*N instead of [Approve, Wait]*N + bal.erc20AsyncEnforceSufficientVaultAllowances( + tokensSorted, + allowancesSorted, + amountsSorted, + gasFactor, + gasSpeed, + gasPriceGweiOverride=gasPriceGweiOverride, + ) + + print() + print("===============================================================") + print("================= Step 3: Send Tokens to Pool =================") + print("===============================================================") + print() + + query = False + output = bal.balJoinPool(join, query=query) + + if query: + print("queryJoin results:") + print(json.dumps(output, indent=4)) + + +if __name__ == "__main__": + main() diff --git a/samples/linearPoolRebalancer/sampleLinearPoolRebalancerQuery.py b/samples/linearPoolRebalancer/sampleLinearPoolRebalancerQuery.py index 5d92fe1..8ef47c3 100644 --- a/samples/linearPoolRebalancer/sampleLinearPoolRebalancerQuery.py +++ b/samples/linearPoolRebalancer/sampleLinearPoolRebalancerQuery.py @@ -1,6 +1,8 @@ -import balpy import json +import balpy + + def main(): network = "mainnet" @@ -59,12 +61,14 @@ def main(): "0xe6bcc79f328eec93d4ec8f7ed35534d9ab549faa", "0xfd11ccdbdb7ab91cb9427a6d6bf570c95876d195", "0x395d8a1d9ad82b5abe558f8abbfe183b27138af4", - "0x74cbfaf94a3577c539a9dcee9870a6349a33b34f" - ]; + "0x74cbfaf94a3577c539a9dcee9870a6349a33b34f", + ] + + bal = balpy.balpy.balpy(network) + output = bal.balGetRebalanceLinearPoolsData(linear_pool_addresses) + + print(json.dumps(output, indent=4)) - bal = balpy.balpy.balpy(network); - output = bal.balGetRebalanceLinearPoolsData(linear_pool_addresses); - print(json.dumps(output, indent=4)); -if __name__ == '__main__': - main(); \ No newline at end of file +if __name__ == "__main__": + main() diff --git a/samples/linearPoolRebalancer/sampleRebalance.py b/samples/linearPoolRebalancer/sampleRebalance.py index 6fcc4b2..ef8318e 100644 --- a/samples/linearPoolRebalancer/sampleRebalance.py +++ b/samples/linearPoolRebalancer/sampleRebalance.py @@ -1,13 +1,14 @@ import balpy -import json + def main(): network = "sepolia" - linear_pool_address = "0x27b26a3d2080b30036faa0a980a76d4770cddaff"; + linear_pool_address = "0x27b26a3d2080b30036faa0a980a76d4770cddaff" + + bal = balpy.balpy.balpy(network) + bal.balDoRebalanceLinearPool(linear_pool_address) - bal = balpy.balpy.balpy(network); - output = bal.balDoRebalanceLinearPool(linear_pool_address); -if __name__ == '__main__': - main(); \ No newline at end of file +if __name__ == "__main__": + main() diff --git a/samples/misc/balancerHelpersVaultRead.py b/samples/misc/balancerHelpersVaultRead.py index 72d6d56..b167a0a 100644 --- a/samples/misc/balancerHelpersVaultRead.py +++ b/samples/misc/balancerHelpersVaultRead.py @@ -1,11 +1,13 @@ import balpy + def main(): - network = "polygon" - - bal = balpy.balpy.balpy(network); - vaultAddress = bal.balBalancerHelpersGetVault(); - print("Vault address:", vaultAddress); - -if __name__ == '__main__': - main(); \ No newline at end of file + network = "polygon" + + bal = balpy.balpy.balpy(network) + vaultAddress = bal.balBalancerHelpersGetVault() + print("Vault address:", vaultAddress) + + +if __name__ == "__main__": + main() diff --git a/samples/misc/findPoolFactory.py b/samples/misc/findPoolFactory.py index d2cb948..5cd4817 100644 --- a/samples/misc/findPoolFactory.py +++ b/samples/misc/findPoolFactory.py @@ -1,21 +1,23 @@ import balpy + def main(): - network = "mainnet" + network = "mainnet" + + bal = balpy.balpy.balpy(network) + + print("Successful Case:") + poolId = "0x5c6ee304399dbdb9c8ef030ab642b10820db8f56000200000000000000000014" + factoryName = bal.balFindPoolFactory(poolId) + print(poolId, "is from", factoryName) - bal = balpy.balpy.balpy(network); + print("-----------------------------------") - print("Successful Case:"); - poolId = "0x5c6ee304399dbdb9c8ef030ab642b10820db8f56000200000000000000000014" - factoryName = bal.balFindPoolFactory(poolId); - print(poolId, "is from", factoryName); - - print("-----------------------------------") + print("Failure Case:") + poolId = "0x01234567899dbdb9c8ef030ab642b10820db8f56000200000000000000000014" + factoryName = bal.balFindPoolFactory(poolId) + print(poolId, "is from", factoryName) - print("Failure Case:"); - poolId = "0x01234567899dbdb9c8ef030ab642b10820db8f56000200000000000000000014" - factoryName = bal.balFindPoolFactory(poolId); - print(poolId, "is from", factoryName); -if __name__ == '__main__': - main(); \ No newline at end of file +if __name__ == "__main__": + main() diff --git a/samples/misc/gasPriceQueries.py b/samples/misc/gasPriceQueries.py index d52b551..fd8b688 100644 --- a/samples/misc/gasPriceQueries.py +++ b/samples/misc/gasPriceQueries.py @@ -1,33 +1,36 @@ import time + import balpy + def main(): - network = "mainnet" - bal = balpy.balpy.balpy(network); - - speeds = ["slow", "average", "fast"] - - # NOTE: Using these time-based gas strategies requires caching gas prices over - # extended time periods. In testing, this script made 140-150 calls to the RPC - # and took ~1 minute to initialize the cache. - start = time.time() - print("\n--- RPC Method -----------------------------") - print("\tSpeed\tPrice(gwei)") - print("\t-----\t-----------") - for speed in speeds: - price = bal.getGasPrice(speed) - print("\t" + speed + "\t" + str(price)) - print("\nRPC gas queries took", time.time() - start, "seconds\n") - - # Etherscan gas prices - start = time.time() - print("\n--- Etherscan Method -----------------------") - print("\tSpeed\tPrice(gwei)") - print("\t-----\t-----------") - for speed in speeds: - price = bal.getGasPriceEtherscanGwei(speed) - print("\t" + speed + "\t" + str(price)) - print("\nEtherscan gas queries took", time.time() - start, "seconds\n") - -if __name__ == '__main__': - main() \ No newline at end of file + network = "mainnet" + bal = balpy.balpy.balpy(network) + + speeds = ["slow", "average", "fast"] + + # NOTE: Using these time-based gas strategies requires caching gas prices over + # extended time periods. In testing, this script made 140-150 calls to the RPC + # and took ~1 minute to initialize the cache. + start = time.time() + print("\n--- RPC Method -----------------------------") + print("\tSpeed\tPrice(gwei)") + print("\t-----\t-----------") + for speed in speeds: + price = bal.getGasPrice(speed) + print("\t" + speed + "\t" + str(price)) + print("\nRPC gas queries took", time.time() - start, "seconds\n") + + # Etherscan gas prices + start = time.time() + print("\n--- Etherscan Method -----------------------") + print("\tSpeed\tPrice(gwei)") + print("\t-----\t-----------") + for speed in speeds: + price = bal.getGasPriceEtherscanGwei(speed) + print("\t" + speed + "\t" + str(price)) + print("\nEtherscan gas queries took", time.time() - start, "seconds\n") + + +if __name__ == "__main__": + main() diff --git a/samples/misc/generateDeploymentsDocsTable.py b/samples/misc/generateDeploymentsDocsTable.py index 6acc97d..2bbb302 100644 --- a/samples/misc/generateDeploymentsDocsTable.py +++ b/samples/misc/generateDeploymentsDocsTable.py @@ -1,11 +1,13 @@ import balpy + def main(): - network = "kovan" - - bal = balpy.balpy.balpy(network); - output = bal.generateDeploymentsDocsTable(); - print(output) - -if __name__ == '__main__': - main(); \ No newline at end of file + network = "kovan" + + bal = balpy.balpy.balpy(network) + output = bal.generateDeploymentsDocsTable() + print(output) + + +if __name__ == "__main__": + main() diff --git a/samples/misc/revokeAllowances.py b/samples/misc/revokeAllowances.py index 315337e..62987e2 100644 --- a/samples/misc/revokeAllowances.py +++ b/samples/misc/revokeAllowances.py @@ -1,47 +1,53 @@ import balpy + def main(): - gasFactor = 1.05; - gasSpeed = "fast"; - gasOverride = 5; - - network = "kovan" - bal = balpy.balpy.balpy(network); - allowedAddress = bal.deploymentAddresses["Vault"]; - tokens = [ "0xdFCeA9088c8A88A76FF74892C1457C17dfeef9C1", - "0x41286Bb1D3E870f3F750eB7E1C25d7E48c8A1Ac7", - "0xc2569dd7d0fd715B054fBf16E75B001E5c0C1115", - "0xAf9ac3235be96eD496db7969f60D354fe5e426B0", - "0x04DF6e4121c27713ED22341E7c7Df330F56f289B", - "0x8F4beBF498cc624a0797Fe64114A6Ff169EEe078", - "0x1C8E3Bcb3378a443CC591f154c5CE0EBb4dA9648", - "0xcC08220af469192C53295fDd34CFb8DF29aa17AB", - "0x15E76Fc74C6ab1c3141D61219883d1c59F716E21", - "0x22ee6c3B011fACC530dd01fe94C58919344d6Db5"]; - - nonce = bal.web3.eth.get_transaction_count(bal.web3.eth.default_account); - hashes = []; - - for token in tokens: - print("Checking:", token) - allowance = bal.erc20GetAllowanceStandard(token, allowedAddress); - if allowance > 0: - txHash = bal.erc20SignAndSendNewAllowance( token, - allowedAddress, - 0, - gasFactor, - gasSpeed, - nonceOverride=nonce, - isAsync=True, - gasPriceGweiOverride=gasOverride); - nonce += 1 - hashes.append(txHash); - print("\tRevoking allowance -- txHash:", txHash) - else: - print("\tNo allowance. Skipping...") - - for txHash in hashes: - bal.waitForTx(txHash); - -if __name__ == '__main__': - main(); \ No newline at end of file + gasFactor = 1.05 + gasSpeed = "fast" + gasOverride = 5 + + network = "kovan" + bal = balpy.balpy.balpy(network) + allowedAddress = bal.deploymentAddresses["Vault"] + tokens = [ + "0xdFCeA9088c8A88A76FF74892C1457C17dfeef9C1", + "0x41286Bb1D3E870f3F750eB7E1C25d7E48c8A1Ac7", + "0xc2569dd7d0fd715B054fBf16E75B001E5c0C1115", + "0xAf9ac3235be96eD496db7969f60D354fe5e426B0", + "0x04DF6e4121c27713ED22341E7c7Df330F56f289B", + "0x8F4beBF498cc624a0797Fe64114A6Ff169EEe078", + "0x1C8E3Bcb3378a443CC591f154c5CE0EBb4dA9648", + "0xcC08220af469192C53295fDd34CFb8DF29aa17AB", + "0x15E76Fc74C6ab1c3141D61219883d1c59F716E21", + "0x22ee6c3B011fACC530dd01fe94C58919344d6Db5", + ] + + nonce = bal.web3.eth.get_transaction_count(bal.web3.eth.default_account) + hashes = [] + + for token in tokens: + print("Checking:", token) + allowance = bal.erc20GetAllowanceStandard(token, allowedAddress) + if allowance > 0: + txHash = bal.erc20SignAndSendNewAllowance( + token, + allowedAddress, + 0, + gasFactor, + gasSpeed, + nonceOverride=nonce, + isAsync=True, + gasPriceGweiOverride=gasOverride, + ) + nonce += 1 + hashes.append(txHash) + print("\tRevoking allowance -- txHash:", txHash) + else: + print("\tNo allowance. Skipping...") + + for txHash in hashes: + bal.waitForTx(txHash) + + +if __name__ == "__main__": + main() diff --git a/samples/misc/vaultApprovedRelayer.py b/samples/misc/vaultApprovedRelayer.py index c1d56a5..4ab9eea 100644 --- a/samples/misc/vaultApprovedRelayer.py +++ b/samples/misc/vaultApprovedRelayer.py @@ -1,21 +1,34 @@ import balpy + def main(): print("In this test we'll set the user address as the relayer and then remove it.") - print("It doesn't make sense to set the user as the relayer, but this is just a test.") + print( + "It doesn't make sense to set the user as the relayer, but this is just a test." + ) print("==============================================") bal = balpy.balpy.balpy("goerli") userAddress = bal.web3.eth.default_account - print("Before set approved relayer:", bal.balVaultHasApprovedRelayer(userAddress, userAddress)) + print( + "Before set approved relayer:", + bal.balVaultHasApprovedRelayer(userAddress, userAddress), + ) print() bal.balVaultSetRelayerApproval(userAddress, userAddress, True) - print("After set approved relayer:", bal.balVaultHasApprovedRelayer(userAddress, userAddress)) + print( + "After set approved relayer:", + bal.balVaultHasApprovedRelayer(userAddress, userAddress), + ) bal.balVaultSetRelayerApproval(userAddress, userAddress, False) - print("After unset approved relayer:", bal.balVaultHasApprovedRelayer(userAddress, userAddress)) + print( + "After unset approved relayer:", + bal.balVaultHasApprovedRelayer(userAddress, userAddress), + ) print() -if __name__ == '__main__': + +if __name__ == "__main__": main() diff --git a/samples/misc/vaultGeneralRead.py b/samples/misc/vaultGeneralRead.py index 1f3ad3c..802afd5 100644 --- a/samples/misc/vaultGeneralRead.py +++ b/samples/misc/vaultGeneralRead.py @@ -1,5 +1,6 @@ import balpy + NETWORK = "mainnet" POOLID = "0x32296969ef14eb0c6d29669c550d4a0449130230000200000000000000000080" TOKENADDRESS = "0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0" @@ -21,9 +22,11 @@ def getPool(): print("Pool:", poolAddress) print("Specialization:", specialization) - + def getPoolTokenInfo(): - cash, managed, lastChangeBlock, assetManager = BAL.balVaultGetPoolTokenInfo(POOLID, TOKENADDRESS) + cash, managed, lastChangeBlock, assetManager = BAL.balVaultGetPoolTokenInfo( + POOLID, TOKENADDRESS + ) print("Cash:", cash) print("Managed:", managed) print("Last Changed Block:", lastChangeBlock) @@ -31,13 +34,13 @@ def getPoolTokenInfo(): def getPoolTokens(): - (tokens, balances, lastChangeBlock) = BAL.balVaultGetPoolTokens(POOLID); - print("Token\t\t\t\t\t\tBalance (wei)") - print("-----\t\t\t\t\t\t-------------") - for token, balance in zip(tokens, balances): - print(token + "\t" + str(balance)); - print(); - print("Last change block:", lastChangeBlock) + (tokens, balances, lastChangeBlock) = BAL.balVaultGetPoolTokens(POOLID) + print("Token\t\t\t\t\t\tBalance (wei)") + print("-----\t\t\t\t\t\t-------------") + for token, balance in zip(tokens, balances): + print(token + "\t" + str(balance)) + print() + print("Last change block:", lastChangeBlock) def getProtocolFeesCollector(): @@ -45,14 +48,21 @@ def getProtocolFeesCollector(): print("Protocol fees collector:", protocolFeesCollector) -if __name__ == '__main__': - functions = [WETH, getAuthorizer, getPool, getPoolTokenInfo, getPoolTokens, getProtocolFeesCollector] - print("General Vault Information") - print("Pool used:", POOLID) - print("Token used:", TOKENADDRESS) - print() - for function in functions: - print("==============================================") - print("Information for function:", function.__name__) - function() - print() +if __name__ == "__main__": + functions = [ + WETH, + getAuthorizer, + getPool, + getPoolTokenInfo, + getPoolTokens, + getProtocolFeesCollector, + ] + print("General Vault Information") + print("Pool used:", POOLID) + print("Token used:", TOKENADDRESS) + print() + for function in functions: + print("==============================================") + print("Information for function:", function.__name__) + function() + print() diff --git a/samples/multicall/erc20Decimals.py b/samples/multicall/erc20Decimals.py index c2c55f0..90d1ce4 100644 --- a/samples/multicall/erc20Decimals.py +++ b/samples/multicall/erc20Decimals.py @@ -1,19 +1,156 @@ -import balpy import json -import requests import time +import balpy + + def main(): - network = "mainnet" - bal = balpy.balpy.balpy(network); + network = "mainnet" + bal = balpy.balpy.balpy(network) + + tokens = [ + "0xd6fd2f39ff3f3565d456bb8aa94703fe5fd88d33", + "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984", + "0x1776e1f26f98b1a5df9cd347953a26dd3cb46671", + "0x5a98fcbea516cf06857215779fd812ca3bef1b32", + "0xdbdb4d16eda451d0503b854cf79d55697f90c8df", + "0x269616d549d7e8eaa82dfb17028d0b212d11232a", + "0x23b608675a2b2fb1890d3abbd85c5775c51691d5", + "0x2d94aa3e47d9d5024503ca8491fce9a2fb4da198", + "0x1e83916ea2ef2d7a6064775662e163b2d4c330a7", + "0xff20817765cb7f73d4bde2e66e067e58d11095c2", + "0xf1294e805b992320a3515682c6ab0fe6251067e5", + "0x43b4fdfd4ff969587185cdb6f0bd875c5fc83f8c", + "0x4730fb1463a6f1f44aeb45f6c5c422427f37f4d0", + "0x06325440d014e39736583c165c2963ba99faf14e", + "0x8798249c2e607446efb7ad49ec89dd1865ff4272", + "0xb81d70802a816b5dacba06d708b5acf19dcd436d", + "0x50de6856358cc35f3a9a57eaaa34bd4cb707d2cd", + "0xe7f4294033d0fde6eecb94bef7da22fde68a61ec", + "0xb6ca7399b4f9ca56fc27cbff44f4d2e4eef1fc81", + "0x467bccd9d29f223bce8043b84e8c8b282827790f", + "0x1b40183efb4dd766f11bda7a7c3ad8982e998421", + "0xeb4c2781e4eba804ce9a9803c67d0893436bb27d", + "0xdac17f958d2ee523a2206206994597c13d831ec7", + "0x94046274b5aa816ab236a9eab42b5563b56e1931", + "0xf6d2699b035fc8fd5e023d4a6da216112ad8a985", + "0xaf5d6d2e724f43769fa9e44284f0433a8f5be973", + "0x94ec4e3a7c5068ae4a035f702f2cd5a6da9c5cc1", + "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "0x4f4500b3885bc72199373abfe7adefd0366bafed", + "0x45804880de22913dafe09f4980848ece6ecbaf78", + "0x6b175474e89094c44da98b954eedeac495271d0f", + "0x261b45d85ccfeabb11f022eba346ee8d1cd488c0", + "0x18aaa7115705e8be94bffebde57af9bfc265b998", + "0xdb25f211ab05b1c97d595516f45794528a807ad8", + "0xd533a949740bb3306d119cc777fa900ba034cd52", + "0xea47b64e1bfccb773a0420247c0aa0a3c1d2e5c5", + "0x89045d0af6a12782ec6f701ee6698beaf17d0ea2", + "0x677ddbd918637e5f2c79e164d402454de7da8619", + "0xbabd64a87881d8df7680907fcde176ff11fa0292", + "0xd70240dd62f4ea9a6a2416e0073d72139489d2aa", + "0x9e7fd25ad9d97f1e6716fa5bb04749a4621e892d", + "0xba4cfe5741b357fa371b506e5db0774abfecf8fc", + "0x123151402076fc819b7564510989e475c9cd93ca", + "0xfe18be6b3bd88a2d2a7f928d00292e7a9963cfc6", + "0xa1cc9bbcd3731a9fd43e1f1416f9b6bf824f37d7", + "0xfa5047c9c78b8877af97bdcb85db743fd7313d4a", + "0xba100000625a3754423978a60c9317c58a424e3d", + "0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9", + "0x72e364f2abdc788b7e918bc238b21f109cd634d7", + "0xd291e7a03283640fdc51b121ac401383a46cc623", + "0xb4efd85c19999d84251304bda99e90b92300bd93", + "0x514910771af9ca656af840dff83e8264ecf986ca", + "0x27054b13b1b798b345b591a4d22e6562d47ea75a", + "0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e", + "0xd71ecff9342a5ced620049e616c5035f1db98620", + "0x90b831fa3bebf58e9744a14d638e25b4ee06f9bc", + "0xf65b5c5104c4fafd4b709d9d60a185eae063276c", + "0x641927e970222b10b2e8cdbc96b1b4f427316f16", + "0xbb0e17ef65f82ab018d8edd776e8dd940327b28b", + "0xf629cbd94d3791c9250152bd8dfbdf380e2a3b9c", + "0x16f378ebdbc54882611ad4a02929eff4b5d7d452", + "0xfca59cd816ab1ead66534d82bc21e7515ce441cf", + "0xf1290473e210b2108a85237fbcd7b6eb42cc654f", + "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599", + "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "0x2e60f6c4ca05bc55a8e577deebd61fce727c4a6e", + "0x0404fd4f0c3b474e8525558ca3d3bc33cec7545a", + "0x68037790a0229e9ce6eaa8a99ea92964106c4703", + "0xca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf", + "0x86ed939b500e121c0c5f493f399084db596dad20", + "0x11c1a6b3ed6bb362954b29d3183cfa97a0c806aa", + "0x6dea81c8171d0ba574754ef6f8b412f2ed88c54d", + "0x111111111117dc0aa78b770fa6a738034120c302", + "0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f", + "0xfb5453340c03db5ade474b27e68b6a9c6b2823eb", + "0x0cec1a9154ff802e7934fc916ed7ca50bde6844e", + "0x114f1388fab456c4ba31b1850b244eedcd024136", + "0x3845badade8e6dff049820680d1f14bd3903a5d0", + "0xc4ad29ba4b3c580e6d59105fff484999997675ff", + "0x1cf0f3aabe4d12106b27ab44df5473974279c524", + "0xe2f2a5c287993345a840db3b0845fbc70f5935a5", + "0x782be9330969aa7b9db56382752a1364580f199f", + "0xfd8d7dbecd5c083dde2b828f96be5d16d1188235", + "0xa279dab6ec190ee4efce7da72896eb58ad533262", + "0x81f8f0bb1cb2a06649e51913a151f0e7ef6fa321", + "0xbc396689893d065f41bc2c6ecbee5e0085233447", + "0xba8c8b50ecd5b580f464f7611b8549ffee4d8da2", + "0xa3d58c4e56fedcae3a7c43a725aee9a71f0ece4e", + "0x3b32f63c1e0fb810f0a06814ead1d4431b237560", + "0x04fa0d235c4abf4bcf4787af4cf447de572ef828", + "0xc00e94cb662c3520282e6f5717214004a7f26888", + "0x35a18000230da775cac24873d00ff85bccded550", + "0xcc4304a31d09258b0029ea7fe63d032f52e44efe", + "0x584bc13c7d411c00c01a62e8019472de68768430", + "0x2ba592f78db6436527729929aaf6c908497cb200", + "0xc944e90c64b2c07662a292be6244bdf05cda44a7", + "0x01abc00e86c7e258823b9a055fd62ca6cf61a163", + "0x6810e776880c02933d47db1b9fc05908e5386b96", + "0x61d5dc44849c9c87b0856a2a311536205c96c7fd", + "0xde30da39c46104798bb5aa3fe8b9e0e1f348163f", + "0x0d8775f648430679a709e98d2b0cb6250d2887ef", + "0xf1f955016ecbcd7321c7266bccfb96c68ea5e49b", + "0x95a4492f028aa1fd432ea71146b433e7b4446611", + "0x58b6a8a3302369daec383334672404ee733ab239", + "0x87d73e916d7057945c9bcd8cdd94e42a6f47f776", + "0x5d67c1c829ab93867d865cf2008deb45df67044f", + "0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0", + "0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0", + "0x88acdd2a6425c3faae4bc9650fd7e27e0bebb7ab", + "0x3ec8798b81485a254928b70cda1cf0a2bb0b74d7", + "0x6b4d5e9ec2acea23d4110f4803da99e25443c5df", + "0xe41d2489571d322189246dafa5ebde1f4699f498", + "0x03ab458634910aad20ef5f1c8ee96f1d6ac54919", + "0xc080f19d9e7ccb6ef2096dfa08570e0057490940", + "0xd075e95423c5c4ba1e122cae0f4cdfa19b82881b", + "0x1494ca1f11d487c2bbe4543e90080aeba4ba3c2b", + "0x10010078a54396f62c96df8532dc2b4847d47ed3", + "0x25f8087ead173b73d6e8b84329989a8eea16cf73", + "0xa3bed4e1c75d00fa6f4e5e6922db7261b5e9acd2", + "0x5f98805a4e8be255a32880fdec7f6728c6568ba0", + "0x476c5e26a75bd202a9683ffd34359c0cc15be0ff", + "0xed279fdd11ca84beef15af5d39bb4d4bee23f0ca", + "0xe9f84de264e91529af07fa2c746e934397810334", + "0x478bbc744811ee8310b461514bdc29d03739084d", + "0x0d438f3b5175bebc262bf23753c1e53d03432bde", + "0xb705268213d593b8fd88d3fdeff93aff5cbdcfae", + "0x965d79f1a1016b574a62986e13ca8ab04dfdd15c", + "0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2", + "0x408e41876cccdc0f92210600ef50372656052a38", + "0x0ec9f76202a7061eb9b3a7d6b59d36215a7e37da", + "0xf5d669627376ebd411e34b98f19c868c8aba5ada", + "0x36128d5436d2d70cab39c9af9cce146c38554ff0", + "0x0e29e5abbb5fd88e28b2d355774e73bd47de3bcd", + "0x6b3595068778dd592e39a122f4f5a5cf09c90fe2", + ] - tokens = ['0xd6fd2f39ff3f3565d456bb8aa94703fe5fd88d33', '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984', '0x1776e1f26f98b1a5df9cd347953a26dd3cb46671', '0x5a98fcbea516cf06857215779fd812ca3bef1b32', '0xdbdb4d16eda451d0503b854cf79d55697f90c8df', '0x269616d549d7e8eaa82dfb17028d0b212d11232a', '0x23b608675a2b2fb1890d3abbd85c5775c51691d5', '0x2d94aa3e47d9d5024503ca8491fce9a2fb4da198', '0x1e83916ea2ef2d7a6064775662e163b2d4c330a7', '0xff20817765cb7f73d4bde2e66e067e58d11095c2', '0xf1294e805b992320a3515682c6ab0fe6251067e5', '0x43b4fdfd4ff969587185cdb6f0bd875c5fc83f8c', '0x4730fb1463a6f1f44aeb45f6c5c422427f37f4d0', '0x06325440d014e39736583c165c2963ba99faf14e', '0x8798249c2e607446efb7ad49ec89dd1865ff4272', '0xb81d70802a816b5dacba06d708b5acf19dcd436d', '0x50de6856358cc35f3a9a57eaaa34bd4cb707d2cd', '0xe7f4294033d0fde6eecb94bef7da22fde68a61ec', '0xb6ca7399b4f9ca56fc27cbff44f4d2e4eef1fc81', '0x467bccd9d29f223bce8043b84e8c8b282827790f', '0x1b40183efb4dd766f11bda7a7c3ad8982e998421', '0xeb4c2781e4eba804ce9a9803c67d0893436bb27d', '0xdac17f958d2ee523a2206206994597c13d831ec7', '0x94046274b5aa816ab236a9eab42b5563b56e1931', '0xf6d2699b035fc8fd5e023d4a6da216112ad8a985', '0xaf5d6d2e724f43769fa9e44284f0433a8f5be973', '0x94ec4e3a7c5068ae4a035f702f2cd5a6da9c5cc1', '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', '0x4f4500b3885bc72199373abfe7adefd0366bafed', '0x45804880de22913dafe09f4980848ece6ecbaf78', '0x6b175474e89094c44da98b954eedeac495271d0f', '0x261b45d85ccfeabb11f022eba346ee8d1cd488c0', '0x18aaa7115705e8be94bffebde57af9bfc265b998', '0xdb25f211ab05b1c97d595516f45794528a807ad8', '0xd533a949740bb3306d119cc777fa900ba034cd52', '0xea47b64e1bfccb773a0420247c0aa0a3c1d2e5c5', '0x89045d0af6a12782ec6f701ee6698beaf17d0ea2', '0x677ddbd918637e5f2c79e164d402454de7da8619', '0xbabd64a87881d8df7680907fcde176ff11fa0292', '0xd70240dd62f4ea9a6a2416e0073d72139489d2aa', '0x9e7fd25ad9d97f1e6716fa5bb04749a4621e892d', '0xba4cfe5741b357fa371b506e5db0774abfecf8fc', '0x123151402076fc819b7564510989e475c9cd93ca', '0xfe18be6b3bd88a2d2a7f928d00292e7a9963cfc6', '0xa1cc9bbcd3731a9fd43e1f1416f9b6bf824f37d7', '0xfa5047c9c78b8877af97bdcb85db743fd7313d4a', '0xba100000625a3754423978a60c9317c58a424e3d', '0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9', '0x72e364f2abdc788b7e918bc238b21f109cd634d7', '0xd291e7a03283640fdc51b121ac401383a46cc623', '0xb4efd85c19999d84251304bda99e90b92300bd93', '0x514910771af9ca656af840dff83e8264ecf986ca', '0x27054b13b1b798b345b591a4d22e6562d47ea75a', '0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e', '0xd71ecff9342a5ced620049e616c5035f1db98620', '0x90b831fa3bebf58e9744a14d638e25b4ee06f9bc', '0xf65b5c5104c4fafd4b709d9d60a185eae063276c', '0x641927e970222b10b2e8cdbc96b1b4f427316f16', '0xbb0e17ef65f82ab018d8edd776e8dd940327b28b', '0xf629cbd94d3791c9250152bd8dfbdf380e2a3b9c', '0x16f378ebdbc54882611ad4a02929eff4b5d7d452', '0xfca59cd816ab1ead66534d82bc21e7515ce441cf', '0xf1290473e210b2108a85237fbcd7b6eb42cc654f', '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599', '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', '0x2e60f6c4ca05bc55a8e577deebd61fce727c4a6e', '0x0404fd4f0c3b474e8525558ca3d3bc33cec7545a', '0x68037790a0229e9ce6eaa8a99ea92964106c4703', '0xca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf', '0x86ed939b500e121c0c5f493f399084db596dad20', '0x11c1a6b3ed6bb362954b29d3183cfa97a0c806aa', '0x6dea81c8171d0ba574754ef6f8b412f2ed88c54d', '0x111111111117dc0aa78b770fa6a738034120c302', '0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f', '0xfb5453340c03db5ade474b27e68b6a9c6b2823eb', '0x0cec1a9154ff802e7934fc916ed7ca50bde6844e', '0x114f1388fab456c4ba31b1850b244eedcd024136', '0x3845badade8e6dff049820680d1f14bd3903a5d0', '0xc4ad29ba4b3c580e6d59105fff484999997675ff', '0x1cf0f3aabe4d12106b27ab44df5473974279c524', '0xe2f2a5c287993345a840db3b0845fbc70f5935a5', '0x782be9330969aa7b9db56382752a1364580f199f', '0xfd8d7dbecd5c083dde2b828f96be5d16d1188235', '0xa279dab6ec190ee4efce7da72896eb58ad533262', '0x81f8f0bb1cb2a06649e51913a151f0e7ef6fa321', '0xbc396689893d065f41bc2c6ecbee5e0085233447', '0xba8c8b50ecd5b580f464f7611b8549ffee4d8da2', '0xa3d58c4e56fedcae3a7c43a725aee9a71f0ece4e', '0x3b32f63c1e0fb810f0a06814ead1d4431b237560', '0x04fa0d235c4abf4bcf4787af4cf447de572ef828', '0xc00e94cb662c3520282e6f5717214004a7f26888', '0x35a18000230da775cac24873d00ff85bccded550', '0xcc4304a31d09258b0029ea7fe63d032f52e44efe', '0x584bc13c7d411c00c01a62e8019472de68768430', '0x2ba592f78db6436527729929aaf6c908497cb200', '0xc944e90c64b2c07662a292be6244bdf05cda44a7', '0x01abc00e86c7e258823b9a055fd62ca6cf61a163', '0x6810e776880c02933d47db1b9fc05908e5386b96', '0x61d5dc44849c9c87b0856a2a311536205c96c7fd', '0xde30da39c46104798bb5aa3fe8b9e0e1f348163f', '0x0d8775f648430679a709e98d2b0cb6250d2887ef', '0xf1f955016ecbcd7321c7266bccfb96c68ea5e49b', '0x95a4492f028aa1fd432ea71146b433e7b4446611', '0x58b6a8a3302369daec383334672404ee733ab239', '0x87d73e916d7057945c9bcd8cdd94e42a6f47f776', '0x5d67c1c829ab93867d865cf2008deb45df67044f', '0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0', '0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0', '0x88acdd2a6425c3faae4bc9650fd7e27e0bebb7ab', '0x3ec8798b81485a254928b70cda1cf0a2bb0b74d7', '0x6b4d5e9ec2acea23d4110f4803da99e25443c5df', '0xe41d2489571d322189246dafa5ebde1f4699f498', '0x03ab458634910aad20ef5f1c8ee96f1d6ac54919', '0xc080f19d9e7ccb6ef2096dfa08570e0057490940', '0xd075e95423c5c4ba1e122cae0f4cdfa19b82881b', '0x1494ca1f11d487c2bbe4543e90080aeba4ba3c2b', '0x10010078a54396f62c96df8532dc2b4847d47ed3', '0x25f8087ead173b73d6e8b84329989a8eea16cf73', '0xa3bed4e1c75d00fa6f4e5e6922db7261b5e9acd2', '0x5f98805a4e8be255a32880fdec7f6728c6568ba0', '0x476c5e26a75bd202a9683ffd34359c0cc15be0ff', '0xed279fdd11ca84beef15af5d39bb4d4bee23f0ca', '0xe9f84de264e91529af07fa2c746e934397810334', '0x478bbc744811ee8310b461514bdc29d03739084d', '0x0d438f3b5175bebc262bf23753c1e53d03432bde', '0xb705268213d593b8fd88d3fdeff93aff5cbdcfae', '0x965d79f1a1016b574a62986e13ca8ab04dfdd15c', '0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2', '0x408e41876cccdc0f92210600ef50372656052a38', '0x0ec9f76202a7061eb9b3a7d6b59d36215a7e37da', '0xf5d669627376ebd411e34b98f19c868c8aba5ada', '0x36128d5436d2d70cab39c9af9cce146c38554ff0', '0x0e29e5abbb5fd88e28b2d355774e73bd47de3bcd', '0x6b3595068778dd592e39a122f4f5a5cf09c90fe2']; + tStart = time.time() + results = bal.multiCallErc20BatchDecimals(tokens) + tEnd = time.time() + print(json.dumps(results, indent=4)) + print("Query took", tEnd - tStart, "seconds") - tStart = time.time(); - results = bal.multiCallErc20BatchDecimals(tokens); - tEnd = time.time() - print(json.dumps(results, indent=4)) - print("Query took", tEnd - tStart, "seconds") -if __name__ == '__main__': - main(); \ No newline at end of file +if __name__ == "__main__": + main() diff --git a/samples/multicall/getOnchainData.py b/samples/multicall/getOnchainData.py index cda93a1..9249a51 100644 --- a/samples/multicall/getOnchainData.py +++ b/samples/multicall/getOnchainData.py @@ -1,25 +1,32 @@ -import balpy import json -import requests import time +import balpy +import requests + + def main(): - network = "mainnet"; - bal = balpy.balpy.balpy(network); + network = "mainnet" + bal = balpy.balpy.balpy(network) + + poolIdsUrl = ( + "https://raw.githubusercontent.com/gerrrg/balancer-pool-ids/master/pools/" + + network + + ".json" + ) + r = requests.get(poolIdsUrl) + poolIds = r.json()["pools"] - poolIdsUrl = "https://raw.githubusercontent.com/gerrrg/balancer-pool-ids/master/pools/" + network + ".json"; - r = requests.get(poolIdsUrl); - poolIds = r.json()["pools"]; + if "Element" in poolIds.keys(): + del poolIds["Element"] - if "Element" in poolIds.keys(): - del poolIds["Element"]; + tStart = time.time() + results = bal.getOnchainData(poolIds) + tEnd = time.time() + print("Query took", tEnd - tStart, "seconds") - tStart = time.time(); - results = bal.getOnchainData(poolIds); - tEnd = time.time(); - print("Query took", tEnd - tStart, "seconds"); + print(json.dumps(results, indent=4)) - print(json.dumps(results,indent=4)); -if __name__ == '__main__': - main(); \ No newline at end of file +if __name__ == "__main__": + main() diff --git a/samples/oraclePool/__init__.py b/samples/oraclePool/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/samples/oraclePool/oraclePoolGetTwap.py b/samples/oraclePool/oraclePoolGetTwap.py index 1519a5b..163aefd 100644 --- a/samples/oraclePool/oraclePoolGetTwap.py +++ b/samples/oraclePool/oraclePoolGetTwap.py @@ -1,27 +1,31 @@ import balpy + def main(): - network = "mainnet" - - bal = balpy.balpy.balpy(network); - poolId = "0x96646936b91d6b9d7d0c47c496afbf3d6ec7b6f8000200000000000000000019"; - - - # enum Variable { PAIR_PRICE, BPT_PRICE, INVARIANT } - # struct OracleAverageQuery { - # Variable variable; - # uint256 secs; - # uint256 ago; - # } - variable = 0; # pair price - secs = 60*60*24; # one day - ago = 0; # most recent - - queries = []; - queries.append((variable, secs, ago)) - results = bal.balOraclePoolGetTimeWeightedAverage(poolId, queries); - - print(results[0]) - -if __name__ == '__main__': - main(); \ No newline at end of file + network = "mainnet" + + bal = balpy.balpy.balpy(network) + poolId = "0x96646936b91d6b9d7d0c47c496afbf3d6ec7b6f8000200000000000000000019" + + # enum Variable { PAIR_PRICE, BPT_PRICE, INVARIANT } + # struct OracleAverageQuery { + # Variable variable; + # uint256 secs; + # uint256 ago; + # } + variable = 0 + # pair price + secs = 60 * 60 * 24 + # one day + ago = 0 + # most recent + + queries = [] + queries.append((variable, secs, ago)) + results = bal.balOraclePoolGetTimeWeightedAverage(poolId, queries) + + print(results[0]) + + +if __name__ == "__main__": + main() diff --git a/samples/poolCreation/poolCreationSample.py b/samples/poolCreation/poolCreationSample.py index f9e3663..b519da3 100644 --- a/samples/poolCreation/poolCreationSample.py +++ b/samples/poolCreation/poolCreationSample.py @@ -1,114 +1,132 @@ -import balpy -import sys -import os import json -import jstyleson +import os +import sys import time - import webbrowser +import balpy +import jstyleson + + def main(): - - if len(sys.argv) < 2: - print("Usage: python3", sys.argv[0], "/path/to/pool.json"); - quit(); - - pathToPool = sys.argv[1]; - if not os.path.isfile(pathToPool): - print("Path", pathToPool, "does not exist. Please enter a valid path.") - quit(); - - with open(pathToPool) as f: - pool = jstyleson.load(f) - - bal = balpy.balpy.balpy(pool["network"]); - gasFactor = 1.05; - gasSpeed = pool["gasSpeed"]; - gasPriceGweiOverride = pool["gasPriceOverride"]; - if gasPriceGweiOverride == "": - gasPriceGweiOverride = -1; - gasPriceGweiOverride = float(gasPriceGweiOverride); - - print(); - print("==============================================================") - print("================ Step 1: Check Token Balances ================") - print("==============================================================") - print(); - - tokens = list(pool["tokens"].keys()); - initialBalances = [pool["tokens"][token]["initialBalance"] for token in tokens]; - if not bal.erc20HasSufficientBalances(tokens, initialBalances): - print("Please fix your insufficient balance before proceeding."); - print("Quitting..."); - quit(); - - print(); - print("==============================================================") - print("============== Step 2: Approve Token Allowance ==============") - print("==============================================================") - print(); - - (tokensSorted, allowancesSorted) = bal.erc20GetTargetAllowancesFromPoolData(pool); - initialBalancesSorted = [pool["tokens"][token]["initialBalance"] for token in tokensSorted]; - # Async: Do [Approve]*N then [Wait]*N instead of [Approve, Wait]*N - bal.erc20AsyncEnforceSufficientVaultAllowances(tokensSorted, allowancesSorted, initialBalancesSorted, gasFactor, gasSpeed, gasPriceGweiOverride=gasPriceGweiOverride); - - print(); - print("==============================================================") - print("=============== Step 3: Create Pool in Factory ===============") - print("==============================================================") - print(); - creationHash = None; - if not "poolId" in pool.keys(): - txHash = bal.balCreatePoolInFactory(pool, gasFactor, gasSpeed, gasPriceGweiOverride=gasPriceGweiOverride); - if not txHash: - quit(); - poolId = bal.balGetPoolIdFromHash(txHash); - creationHash = txHash; - pool["poolId"] = poolId; - with open(pathToPool, 'w') as f: - json.dump(pool, f, indent=4); - else: - print("PoolId found in pool description. Skipping the pool factory!"); - poolId = pool["poolId"]; - - poolLink = bal.balGetLinkToFrontend(poolId); - if not poolLink == "": - webbrowser.open_new_tab(poolLink); - - print(); - print("==================================================================") - print("=============== Step 4: Add Initial Tokens to Pool ===============") - print("==================================================================") - print(); - try: - time.sleep(5); # sleep ensure that the RPC knows the new pool exists - txHash = bal.balJoinPoolInit(pool, poolId, gasPriceGweiOverride=gasPriceGweiOverride); - except Exception as e: - print("Joining pool failed!"); - print("Depending on the pool type, this could be due to you not being the pool owner"); - print("Caught exception:", e); - quit(); - - - - - print(); - print("==================================================================") - print("================== Step 5: Verify Pool Contract ==================") - print("==================================================================") - print(); - - if not creationHash is None: - command = bal.balGeneratePoolCreationArguments("0x" + poolId, creationHash=creationHash); - else: - command = bal.balGeneratePoolCreationArguments("0x" + poolId); - - print(command) - print() - print("If you need more complete instructions on what to do with this command, go to:"); - print("\thttps://dev.balancer.fi/resources/pools/verification"); - print() - -if __name__ == '__main__': - main(); + if len(sys.argv) < 2: + print("Usage: python3", sys.argv[0], "/path/to/pool.json") + quit() + + pathToPool = sys.argv[1] + if not os.path.isfile(pathToPool): + print("Path", pathToPool, "does not exist. Please enter a valid path.") + quit() + + with open(pathToPool) as f: + pool = jstyleson.load(f) + + bal = balpy.balpy.balpy(pool["network"]) + gasFactor = 1.05 + gasSpeed = pool["gasSpeed"] + gasPriceGweiOverride = pool["gasPriceOverride"] + if gasPriceGweiOverride == "": + gasPriceGweiOverride = -1 + gasPriceGweiOverride = float(gasPriceGweiOverride) + + print() + print("==============================================================") + print("================ Step 1: Check Token Balances ================") + print("==============================================================") + print() + + tokens = list(pool["tokens"].keys()) + initialBalances = [pool["tokens"][token]["initialBalance"] for token in tokens] + if not bal.erc20HasSufficientBalances(tokens, initialBalances): + print("Please fix your insufficient balance before proceeding.") + print("Quitting...") + quit() + + print() + print("==============================================================") + print("============== Step 2: Approve Token Allowance ==============") + print("==============================================================") + print() + + (tokensSorted, allowancesSorted) = bal.erc20GetTargetAllowancesFromPoolData(pool) + initialBalancesSorted = [ + pool["tokens"][token]["initialBalance"] for token in tokensSorted + ] + # Async: Do [Approve]*N then [Wait]*N instead of [Approve, Wait]*N + bal.erc20AsyncEnforceSufficientVaultAllowances( + tokensSorted, + allowancesSorted, + initialBalancesSorted, + gasFactor, + gasSpeed, + gasPriceGweiOverride=gasPriceGweiOverride, + ) + + print() + print("==============================================================") + print("=============== Step 3: Create Pool in Factory ===============") + print("==============================================================") + print() + creationHash = None + if "poolId" not in pool.keys(): + txHash = bal.balCreatePoolInFactory( + pool, gasFactor, gasSpeed, gasPriceGweiOverride=gasPriceGweiOverride + ) + if not txHash: + quit() + poolId = bal.balGetPoolIdFromHash(txHash) + creationHash = txHash + pool["poolId"] = poolId + with open(pathToPool, "w") as f: + json.dump(pool, f, indent=4) + else: + print("PoolId found in pool description. Skipping the pool factory!") + poolId = pool["poolId"] + + poolLink = bal.balGetLinkToFrontend(poolId) + if not poolLink == "": + webbrowser.open_new_tab(poolLink) + + print() + print("==================================================================") + print("=============== Step 4: Add Initial Tokens to Pool ===============") + print("==================================================================") + print() + try: + time.sleep(5) + # sleep ensure that the RPC knows the new pool exists + txHash = bal.balJoinPoolInit( + pool, poolId, gasPriceGweiOverride=gasPriceGweiOverride + ) + except Exception as e: + print("Joining pool failed!") + print( + "Depending on the pool type, this could be due to you not being the pool owner" + ) + print("Caught exception:", e) + quit() + + print() + print("==================================================================") + print("================== Step 5: Verify Pool Contract ==================") + print("==================================================================") + print() + + if creationHash is not None: + command = bal.balGeneratePoolCreationArguments( + "0x" + poolId, creationHash=creationHash + ) + else: + command = bal.balGeneratePoolCreationArguments("0x" + poolId) + + print(command) + print() + print( + "If you need more complete instructions on what to do with this command, go to:" + ) + print("\thttps://dev.balancer.fi/resources/pools/verification") + print() + + +if __name__ == "__main__": + main() diff --git a/samples/poolVerification/poolVerification.py b/samples/poolVerification/poolVerification.py index 16e8b85..383dc01 100644 --- a/samples/poolVerification/poolVerification.py +++ b/samples/poolVerification/poolVerification.py @@ -1,28 +1,35 @@ import balpy + def main(): - network = "goerli" - poolId = "0xe867ad0a48e8f815dc0cda2cdb275e0f163a480b0002000000000000000001a0" - # On Ethereum and Ethereum testnets, you can pass creationHash=None - # On Polygon, you must pass the pool creation hash to generate verification params - creationHash = None; - # creationHash = "0x18c7e1c9235c6e93878e55a87ed249f9d0ceb9d12ee584794e92f80f7645686d"; - verbose = False; + network = "goerli" + poolId = "0xe867ad0a48e8f815dc0cda2cdb275e0f163a480b0002000000000000000001a0" + # On Ethereum and Ethereum testnets, you can pass creationHash=None + # On Polygon, you must pass the pool creation hash to generate + # verification params + creationHash = None + # creationHash = "0x18c7e1c9235c6e93878e55a87ed249f9d0ceb9d12ee584794e92f80f7645686d"; + verbose = False + + bal = balpy.balpy.balpy(network) + isVerified = bal.isContractVerified(poolId, verbose=verbose) + if not isVerified: + command = bal.balGeneratePoolCreationArguments( + poolId, verbose=verbose, creationHash=creationHash + ) + else: + print("Pool is already verified") + quit() + + print() + print(command) + print() + + print( + "If you need more complete instructions on what to do with this command, go to:" + ) + print("\thttps://dev.balancer.fi/resources/pools/verification\n") - bal = balpy.balpy.balpy(network); - isVerified = bal.isContractVerified(poolId, verbose=verbose); - if not isVerified: - command = bal.balGeneratePoolCreationArguments(poolId, verbose=verbose, creationHash=creationHash); - else: - print("Pool is already verified") - quit(); - - print() - print(command) - print() - print("If you need more complete instructions on what to do with this command, go to:"); - print("\thttps://dev.balancer.fi/resources/pools/verification\n"); - -if __name__ == '__main__': - main(); +if __name__ == "__main__": + main() diff --git a/samples/singleSwap/swapSample.py b/samples/singleSwap/swapSample.py index 68de1d1..78e25f3 100644 --- a/samples/singleSwap/swapSample.py +++ b/samples/singleSwap/swapSample.py @@ -1,66 +1,76 @@ -import balpy -import sys -import os import json +import os +import sys + +import balpy + def main(): - - if len(sys.argv) < 2: - print("Usage: python3", sys.argv[0], "/path/to/swap.json"); - quit(); - - pathToSwap = sys.argv[1]; - if not os.path.isfile(pathToSwap): - print("Path", pathToSwap, "does not exist. Please enter a valid path.") - quit(); - - with open(pathToSwap) as f: - data = json.load(f) - - gasFactor = 1.05; - gasSpeedApproval = "average"; - gasSpeedTrade = "average"; - - bal = balpy.balpy.balpy(data["network"]); - swap = data["swap"]; - - # determine the necessary allowance based on swap kind - maxSend = None; - kind = int(swap["kind"]) - if kind == 0: #GIVEN_IN - maxSend = swap["amount"]; - elif kind == 1: #GIVEN_OUT - maxSend = swap["limit"] - - - print(); - print("==============================================================") - print("================ Step 1: Check Token Balances ================") - print("==============================================================") - print(); - - tokens = [swap["assetIn"]]; - amountIn = [maxSend]; - if not bal.erc20HasSufficientBalances(tokens, amountIn): - print("Please fix your insufficient balance before proceeding.") - print("Quitting...") - quit(); - - print(); - print("==============================================================") - print("============== Step 2: Approve Token Allowance ===============") - print("==============================================================") - print(); - - bal.erc20AsyncEnforceSufficientVaultAllowances(tokens, amountIn, amountIn, gasFactor, gasSpeedApproval); - - print(); - print("==============================================================") - print("================== Step 3: Execute Swap Txn ==================") - print("==============================================================") - print(); - - txHash = bal.balDoSwap(swap, gasFactor=gasFactor, gasPriceSpeed=gasSpeedTrade); - -if __name__ == '__main__': - main(); \ No newline at end of file + if len(sys.argv) < 2: + print("Usage: python3", sys.argv[0], "/path/to/swap.json") + quit() + + pathToSwap = sys.argv[1] + if not os.path.isfile(pathToSwap): + print("Path", pathToSwap, "does not exist. Please enter a valid path.") + quit() + + with open(pathToSwap) as f: + data = json.load(f) + + gasFactor = 1.05 + gasSpeedApproval = "average" + gasSpeedTrade = "average" + + bal = balpy.balpy.balpy(data["network"]) + swap = data["swap"] + + # determine the necessary allowance based on swap kind + maxSend = None + kind = int(swap["kind"]) + if kind == 0: # GIVEN_IN + maxSend = swap["amount"] + elif kind == 1: # GIVEN_OUT + maxSend = swap["limit"] + + print() + print("==============================================================") + print("================ Step 1: Check Token Balances ================") + print("==============================================================") + print() + balance = bal.web3.eth.get_balance(bal.address) + print("Address: ", bal.address) + print("ETH Balance: ", balance) + + # base balance of gas token + + tokens = [swap["assetIn"]] + amountIn = [maxSend] + if not bal.erc20HasSufficientBalances(tokens, amountIn): + print("Please fix your insufficient balance before proceeding.") + print("Quitting...") + quit() + + print() + print("==============================================================") + print("============== Step 2: Approve Token Allowance ===============") + print("==============================================================") + print() + + bal.erc20AsyncEnforceSufficientVaultAllowances( + tokens, amountIn, amountIn, gasFactor, gasSpeedApproval + ) + + print() + print("==============================================================") + print("================== Step 3: Execute Swap Txn ==================") + print("==============================================================") + print() + + txHash = bal.balDoSwap(swap, gasFactor=gasFactor, gasPriceSpeed=gasSpeedTrade) + + print("Swap Txn Hash: ", txHash) + + +if __name__ == "__main__": + main() diff --git a/samples/stablePool/stablePoolGetAmp.py b/samples/stablePool/stablePoolGetAmp.py index a891780..1a8d8f6 100644 --- a/samples/stablePool/stablePoolGetAmp.py +++ b/samples/stablePool/stablePoolGetAmp.py @@ -1,14 +1,16 @@ import balpy + def main(): - network = "kovan" - - bal = balpy.balpy.balpy(network); - poolId = "0x6b15a01b5d46a5321b627bd7deef1af57bc629070000000000000000000000d4"; - (value, isUpdating, precision) = bal.balStablePoolGetAmplificationParameter(poolId); - print("value:", value) - print("isUpdating:", isUpdating) - print("precision:", precision) - -if __name__ == '__main__': - main(); \ No newline at end of file + network = "kovan" + + bal = balpy.balpy.balpy(network) + poolId = "0x6b15a01b5d46a5321b627bd7deef1af57bc629070000000000000000000000d4" + (value, isUpdating, precision) = bal.balStablePoolGetAmplificationParameter(poolId) + print("value:", value) + print("isUpdating:", isUpdating) + print("precision:", precision) + + +if __name__ == "__main__": + main() diff --git a/samples/stablePool/stablePoolUpdateAmp.py b/samples/stablePool/stablePoolUpdateAmp.py index bfcb017..11a7a54 100644 --- a/samples/stablePool/stablePoolUpdateAmp.py +++ b/samples/stablePool/stablePoolUpdateAmp.py @@ -1,16 +1,24 @@ -import balpy import time + +import balpy + + def main(): - network = "kovan" - - bal = balpy.balpy.balpy(network); - - poolId = "0x6b15a01b5d46a5321b627bd7deef1af57bc629070000000000000000000000d4"; - rawEndValue = 149; #MIN_AMP = 1, MAX_AMP = 5000 - durationInSeconds = 600000; #MIN_UPDATE_TIME = 1 day = 86400 seconds - - endTime = int(time.time()) + durationInSeconds; - bal.balStablePoolStartAmplificationParameterUpdate(poolId, rawEndValue, endTime, gasEstimateOverride=400000); - -if __name__ == '__main__': - main() \ No newline at end of file + network = "kovan" + + bal = balpy.balpy.balpy(network) + + poolId = "0x6b15a01b5d46a5321b627bd7deef1af57bc629070000000000000000000000d4" + rawEndValue = 149 + # MIN_AMP = 1, MAX_AMP = 5000 + durationInSeconds = 600000 + # MIN_UPDATE_TIME = 1 day = 86400 seconds + + endTime = int(time.time()) + durationInSeconds + bal.balStablePoolStartAmplificationParameterUpdate( + poolId, rawEndValue, endTime, gasEstimateOverride=400000 + ) + + +if __name__ == "__main__": + main() diff --git a/samples/theGraph/getPoolIds.py b/samples/theGraph/getPoolIds.py index ca1ae5d..de6dd3a 100644 --- a/samples/theGraph/getPoolIds.py +++ b/samples/theGraph/getPoolIds.py @@ -1,33 +1,35 @@ # import graph import sys + import balpy.graph.graph as balGraph -def main(): - - batch_size = 100; - print(); - - if len(sys.argv) < 2: - print("Usage: python", sys.argv[0], ""); - print("No network given; defaulting to mainnet Ethereum") - network = "mainnet" - else: - network = sys.argv[1]; - - networks = ["mainnet", "kovan", "polygon"]; - - if not network in networks: - print("Network", network, "is not supported!"); - print("Supported networks are:"); - for n in networks: - print("\t" + n); - print("Quitting") - quit(); - - verbose = False; - bg = balGraph.TheGraph(network) - pools = bg.getV2PoolIDs(batch_size, verbose=verbose) - bg.printJson(pools) - -if __name__ == '__main__': - main(); + +def main(network="mainnet"): + batch_size = 100 + networks = ["mainnet", "kovan", "polygon", "gnosis-chain"] + + if network not in networks: + print("Network", network, "is not supported!") + print("Supported networks are:") + for n in networks: + print("\t" + n) + print("Quitting") + quit() + + verbose = False + bg = balGraph.TheGraph(network) + pools = bg.getV2PoolIDs(batch_size, verbose=verbose) + bg.printJson(pools) + + +if __name__ == "__main__": + print() + + if len(sys.argv) < 2: + print("Usage: python", sys.argv[0], "") + print("No network given; defaulting to mainnet Ethereum") + network = "mainnet" + else: + network = sys.argv[1] + + main(network) diff --git a/samples/theGraph/getPools.py b/samples/theGraph/getPools.py index abf9567..0a237cd 100644 --- a/samples/theGraph/getPools.py +++ b/samples/theGraph/getPools.py @@ -1,33 +1,34 @@ # import graph import sys + import balpy.graph.graph as balGraph -def main(): - - batch_size = 100; - print(); - - if len(sys.argv) < 2: - print("Usage: python", sys.argv[0], ""); - print("No network given; defaulting to mainnet Ethereum") - network = "mainnet" - else: - network = sys.argv[1]; - - networks = ["mainnet", "kovan", "polygon"]; - - if not network in networks: - print("Network", network, "is not supported!"); - print("Supported networks are:"); - for n in networks: - print("\t" + n); - print("Quitting") - quit(); - - verbose = True; - bg = balGraph.TheGraph(network) - pools = bg.getV2Pools(batch_size, verbose=verbose) - bg.printJson(pools) - -if __name__ == '__main__': - main(); + +def main(network="mainnet"): + batch_size = 100 + + networks = ["mainnet", "kovan", "polygon", "goerli", "gnosis-chain"] + + if network not in networks: + print("Network", network, "is not supported!") + print("Supported networks are:") + for n in networks: + print("\t" + n) + print("Quitting") + quit() + + verbose = True + bg = balGraph.TheGraph(network) + pools = bg.getV2Pools(batch_size, verbose=verbose) + bg.printJson(pools) + + +if __name__ == "__main__": + print() + if len(sys.argv) < 2: + print("Usage: python", sys.argv[0], "") + print("No network given; defaulting to mainnet Ethereum") + network = "mainnet" + else: + network = sys.argv[1] + main(network) diff --git a/tbump.toml b/tbump.toml new file mode 100644 index 0000000..4c35ed6 --- /dev/null +++ b/tbump.toml @@ -0,0 +1,40 @@ +# Uncomment this if your project is hosted on GitHub: +# github_url = "https://github.com///" + +[version] +current = "0.1.0" + +# Example of a semver regexp. +# Make sure this matches current_version before +# using tbump +regex = ''' + (?P\d+) + \. + (?P\d+) + \. + (?P\d+) + ''' + +[git] +message_template = "Bump to {new_version}" +tag_template = "v{new_version}" + +# For each file to patch, add a [[file]] config +# section containing the path of the file, relative to the +# tbump.toml location. +[[file]] +src = "pyproject.toml" + +# You can specify a list of commands to +# run after the files have been patched +# and before the git commit is made + +# [[before_commit]] +# name = "check changelog" +# cmd = "grep -q {new_version} Changelog.rst" + +# Or run some commands after the git tag and the branch +# have been pushed: +# [[after_push]] +# name = "publish" +# cmd = "./publish.sh" diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_graph.py b/tests/test_graph.py new file mode 100644 index 0000000..3a0ac6c --- /dev/null +++ b/tests/test_graph.py @@ -0,0 +1,21 @@ +import pytest +from balpy.graph.graph import main as endpoint_prices +from samples.theGraph.getPoolIds import main as get_pool_ids +from samples.theGraph.getPools import main as get_pools + + +TEST_NETWORK = "gnosis-chain" + + +@pytest.mark.skip(reason="This test is deprecated") +def test_get_pool_ids(): + get_pool_ids(TEST_NETWORK) + + +@pytest.mark.skip(reason="This test is deprecated") +def test_get_pools(): + get_pools(TEST_NETWORK) + + +def test_bal_graph(): + endpoint_prices()